         (buffer-disable-undo)
         (current-buffer))))
 
-(defun fstar--log (format &rest args)
-  "Log a message, conditional on `fstar-debug'.
-
-FORMAT and ARGS are as in `message'."
+(defun fstar--log (kind format &rest args)
+  "Log a message of kind KIND, conditional on `fstar-debug'.
+
+FORMAT and ARGS are as in `message'.
+LEVEL is one of `info', `input', `output'."
   (with-current-buffer (fstar--log-buffer)
     (goto-char (point-max))
-    (insert (apply #'format format args) "\n")))
-
-(defmacro fstar-log (format &rest args)
-  "Log a message, conditional on `fstar-debug'.
+    (let* ((raw (apply #'format format args))
+           (head (cdr (assq kind '((info . ";;; ") (in . ">>> ") (out . ""))))))
+      (insert (replace-regexp-in-string "^" head raw) "\n"))))
+
+(defmacro fstar-log (kind format &rest args)
+  "Log a message of kind KIND, conditional on `fstar-debug'.
 
 FORMAT and ARGS are as in `message'."
   (declare (debug t))
   `(when fstar-debug
-     (fstar--log ,format ,@args)))
+     (fstar--log ,kind ,format ,@args)))
 
 ;;; Compatibility across F* versions
 

    ;; Check for results
    (cond
     ((car results-cell) ;; Got results in time!
      (fstar-log "Fetching results for %S took %.2fms"
            query (* 1000 (float-time (time-since start))))
      results-cell)
     (t ;; Results are late.  Set callback to company-supplied one.
      (fstar-log "Results for %S are late" query)
      callback-cell))))

(defun fstar-subp-find-response (proc)

      (warn "No issues found in response despite prover failure: [%s]" response))
    (when other-issues
      (message "F* reported issues in other files: [%S]" other-issues))
    (fstar-log 'info "Highlighting issues: %s" issues)
    (when local-issues
      (fstar-subp-jump-to-issue (car local-issues))
      (fstar-subp-highlight-issues local-issues)
