v0.8.0: Information Radiator, Command Palette, TrueColor Themes, Setup Wizard
- Sidebar: permanent 42-col panel with 7 data panels (Gate Trace, Focus, Rules, Context gauge, Files, Cost, Protection); 4-window Croatoan layout at >=120 cols, toggle via Ctrl+X+B - Command palette: Ctrl+P overlay with fuzzy-filtered categorized items, keyboard navigation, Enter to execute; view-palette rendering - TrueColor themes: 4 new presets (nord, tokyonight, catppuccin, monokai) with 27 hex keys via theme-hex-to-rgb - Setup wizard: Ctrl+\ /setup 4-step overlay (provider, key, memory, save) writing .env with in-TUI rendering - Daemon enrichment: dispatcher block counts, cost session summary, modified files tracking, context usage percentage - Daemon fixes: fboundp guards for count-tokens/provider-token-cost, tool registry save/restore in safety tests, SELF_BUILD_MODE cleanup - 139 tests pass across all suites (0 failures)
This commit is contained in:
@@ -3,7 +3,9 @@
|
||||
(defvar *prompt-prefix-cache* (cons nil "")
|
||||
"Prompt prefix cache: (sxhash . cached-string). Rebuilt when IDENTITY or TOOLS change.")
|
||||
|
||||
(defvar *context-cache* (list :foveal-id nil :scope nil :memory-timestamp 0 :rendered "")
|
||||
(defvar *context-cache* (list :foveal-id nil :scope nil :memory-timestamp 0 :rendered ""
|
||||
:identity-tokens 0 :tool-tokens 0 :context-tokens 0
|
||||
:log-tokens 0 :config-tokens 0 :time-tokens 0)
|
||||
"Context assembly cache: metadata + last rendered context string.")
|
||||
|
||||
(defun prompt-prefix-cached (assistant-name identity-content feedback mandates-text tool-belt)
|
||||
@@ -64,7 +66,9 @@ with trimmed sections."
|
||||
(ignore-errors
|
||||
(parse-integer (uiop:getenv "CONTEXT_MAX_TOKENS")))
|
||||
16384)))
|
||||
(labels ((ct (s) (funcall (symbol-function 'count-tokens) s))
|
||||
(labels ((ct (s) (if (fboundp 'count-tokens)
|
||||
(funcall (symbol-function 'count-tokens) s)
|
||||
(ceiling (length s) 4)))
|
||||
(total-tokens (p c l u m)
|
||||
(+ (ct p)
|
||||
(if c (ct c) 0)
|
||||
@@ -102,6 +106,22 @@ with trimmed sections."
|
||||
(getf *context-cache* :memory-timestamp) 0
|
||||
(getf *context-cache* :rendered) ""))
|
||||
|
||||
(defun context-usage-percentage ()
|
||||
"Returns integer 0-100: current token budget consumption.
|
||||
Returns nil when no context cache data is available."
|
||||
(let* ((limit (or (ignore-errors
|
||||
(parse-integer (uiop:getenv "CONTEXT_MAX_TOKENS")))
|
||||
16384))
|
||||
(tokens (+ (or (getf *context-cache* :identity-tokens) 0)
|
||||
(or (getf *context-cache* :tool-tokens) 0)
|
||||
(or (getf *context-cache* :context-tokens) 0)
|
||||
(or (getf *context-cache* :log-tokens) 0)
|
||||
(or (getf *context-cache* :config-tokens) 0)
|
||||
(or (getf *context-cache* :time-tokens) 0))))
|
||||
(if (> tokens 0)
|
||||
(min 100 (floor (* 100 tokens) limit))
|
||||
nil)))
|
||||
|
||||
(eval-when (:compile-toplevel :load-toplevel :execute)
|
||||
(ql:quickload :fiveam :silent t))
|
||||
|
||||
@@ -200,3 +220,35 @@ with trimmed sections."
|
||||
(is (null (car passepartout::*prompt-prefix-cache*)))
|
||||
(is (string= "" (cdr passepartout::*prompt-prefix-cache*)))
|
||||
(is (string= "" (getf passepartout::*context-cache* :rendered))))
|
||||
|
||||
(in-package :passepartout-token-economics-tests)
|
||||
|
||||
(test test-context-usage-percentage
|
||||
"Contract 5: context-usage-percentage returns integer 0-100."
|
||||
;; Set up a cache with known token counts
|
||||
(let* ((ctx passepartout::*context-cache*)
|
||||
(limit (or (ignore-errors (parse-integer (uiop:getenv "CONTEXT_MAX_TOKENS")))
|
||||
16384)))
|
||||
(setf (getf ctx :identity-tokens) 1000
|
||||
(getf ctx :tool-tokens) 500
|
||||
(getf ctx :context-tokens) 2000
|
||||
(getf ctx :log-tokens) 800
|
||||
(getf ctx :config-tokens) 200
|
||||
(getf ctx :time-tokens) 100)
|
||||
(let ((pct (passepartout::context-usage-percentage)))
|
||||
(is (integerp pct))
|
||||
(is (<= 0 pct 100)))))
|
||||
|
||||
(test test-context-usage-percentage-empty-cache
|
||||
"Contract 5: context-usage-percentage returns nil with no cache data."
|
||||
(let ((saved-ctx (copy-list passepartout::*context-cache*)))
|
||||
(unwind-protect
|
||||
(progn
|
||||
(setf (getf passepartout::*context-cache* :identity-tokens) nil
|
||||
(getf passepartout::*context-cache* :tool-tokens) nil
|
||||
(getf passepartout::*context-cache* :context-tokens) nil
|
||||
(getf passepartout::*context-cache* :log-tokens) nil
|
||||
(getf passepartout::*context-cache* :config-tokens) nil
|
||||
(getf passepartout::*context-cache* :time-tokens) nil)
|
||||
(is (null (passepartout::context-usage-percentage))))
|
||||
(setf passepartout::*context-cache* saved-ctx))))
|
||||
|
||||
Reference in New Issue
Block a user