@imdigitalashish/zpi 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2801 -0
- package/README.md +95 -0
- package/dist/cli/args.d.ts +47 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +293 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config-selector.d.ts +14 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +31 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +79 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +92 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/session-picker.d.ts +9 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +34 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +68 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +203 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +571 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +2353 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-storage.d.ts +129 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +394 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +47 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +212 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +86 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +242 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +121 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +607 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +35 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +138 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +71 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +34 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +222 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +971 -0
- package/dist/core/export-html/template.html +54 -0
- package/dist/core/export-html/template.js +1586 -0
- package/dist/core/export-html/tool-renderer.d.ts +35 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +57 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.d.ts +11 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +25 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +402 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +146 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +626 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +984 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +35 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +27 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +102 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +32 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +134 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +55 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +153 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/memory.d.ts +64 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +247 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +149 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +102 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +515 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +104 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +403 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/package-manager.d.ts +151 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +1426 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +50 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +251 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +17 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +59 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +184 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +673 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/sdk.d.ts +90 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +238 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-manager.d.ts +323 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +1091 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +230 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +656 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +58 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +364 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +15 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +23 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/system-prompt.d.ts +26 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +150 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/timings.d.ts +7 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +25 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +55 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +242 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +63 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +243 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +39 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +146 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/find.d.ts +39 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +206 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +45 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +239 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +102 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +71 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +40 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +118 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/memory.d.ts +45 -0
- package/dist/core/tools/memory.d.ts.map +1 -0
- package/dist/core/tools/memory.js +346 -0
- package/dist/core/tools/memory.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +8 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +81 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +39 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +166 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +205 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +29 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +78 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +8 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +651 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +261 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +9 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +333 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +16 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +96 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +35 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +162 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +51 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +44 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +71 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +479 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +70 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +79 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +140 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +17 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +102 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +61 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +24 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +78 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +26 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +213 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +32 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +33 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +41 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +61 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +42 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +145 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +47 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +271 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +19 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +97 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +49 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +275 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +155 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +95 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +851 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +58 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +299 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +35 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +46 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +47 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +70 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +636 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +68 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +934 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +113 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +8 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +16 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +316 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +3848 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +84 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +78 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +944 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +101 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +217 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +405 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +511 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +409 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/utils/changelog.d.ts +21 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +87 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +162 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +7 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +14 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +67 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/git.d.ts +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +163 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/image-convert.d.ts +9 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +35 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize.d.ts +36 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +181 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/mime.d.ts +2 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +26 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/photon.d.ts +21 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +121 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/shell.d.ts +26 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +186 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +207 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/docs/compaction.md +390 -0
- package/docs/custom-provider.md +548 -0
- package/docs/development.md +69 -0
- package/docs/extensions.md +1935 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/json.md +79 -0
- package/docs/keybindings.md +174 -0
- package/docs/models.md +293 -0
- package/docs/packages.md +209 -0
- package/docs/prompt-templates.md +67 -0
- package/docs/providers.md +186 -0
- package/docs/rpc.md +1317 -0
- package/docs/sdk.md +968 -0
- package/docs/session.md +412 -0
- package/docs/settings.md +223 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +231 -0
- package/docs/terminal-setup.md +70 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +295 -0
- package/docs/tree.md +219 -0
- package/docs/tui.md +887 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +203 -0
- package/examples/extensions/antigravity-image-gen.ts +413 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +114 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
- package/examples/extensions/custom-provider-qwen-cli/package.json +16 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/handoff.ts +150 -0
- package/examples/extensions/hello.ts +25 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +881 -0
- package/examples/extensions/overlay-test.ts +150 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +340 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +398 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/qna.ts +119 -0
- package/examples/extensions/question.ts +264 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +124 -0
- package/examples/extensions/sandbox/index.ts +318 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +40 -0
- package/examples/extensions/subagent/README.md +172 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +127 -0
- package/examples/extensions/subagent/index.ts +964 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +195 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +299 -0
- package/examples/extensions/tool-override.ts +143 -0
- package/examples/extensions/tools.ts +146 -0
- package/examples/extensions/trigger-compact.ts +40 -0
- package/examples/extensions/truncated-tool.ts +192 -0
- package/examples/extensions/widget-placement.ts +17 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/rpc-extension-ui.ts +632 -0
- package/examples/sdk/01-minimal.ts +22 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +55 -0
- package/examples/sdk/04-skills.ts +46 -0
- package/examples/sdk/05-tools.ts +56 -0
- package/examples/sdk/06-extensions.ts +88 -0
- package/examples/sdk/07-context-files.ts +40 -0
- package/examples/sdk/08-prompt-templates.ts +47 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/examples/sdk/10-settings.ts +51 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +82 -0
- package/examples/sdk/README.md +144 -0
- package/package.json +96 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent memory system — procedural, episodic, and semantic memories
|
|
3
|
+
* stored per-project in .pi/memory/ as JSON files.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Storage
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
export function getMemoryDir(cwd) {
|
|
11
|
+
return join(cwd, ".pi", "memory");
|
|
12
|
+
}
|
|
13
|
+
function ensureMemoryDir(cwd) {
|
|
14
|
+
const dir = getMemoryDir(cwd);
|
|
15
|
+
if (!existsSync(dir)) {
|
|
16
|
+
mkdirSync(dir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
return dir;
|
|
19
|
+
}
|
|
20
|
+
export function loadStore(cwd, filename) {
|
|
21
|
+
const filepath = join(getMemoryDir(cwd), filename);
|
|
22
|
+
if (!existsSync(filepath)) {
|
|
23
|
+
return { memories: [] };
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const raw = readFileSync(filepath, "utf-8");
|
|
27
|
+
return JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return { memories: [] };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function saveStore(cwd, filename, store) {
|
|
34
|
+
const dir = ensureMemoryDir(cwd);
|
|
35
|
+
const filepath = join(dir, filename);
|
|
36
|
+
writeFileSync(filepath, JSON.stringify(store, null, 2), "utf-8");
|
|
37
|
+
}
|
|
38
|
+
export function generateId(prefix, store) {
|
|
39
|
+
let max = 0;
|
|
40
|
+
for (const m of store.memories) {
|
|
41
|
+
const num = parseInt(m.id.replace(`${prefix}_`, ""), 10);
|
|
42
|
+
if (!Number.isNaN(num) && num > max)
|
|
43
|
+
max = num;
|
|
44
|
+
}
|
|
45
|
+
return `${prefix}_${String(max + 1).padStart(3, "0")}`;
|
|
46
|
+
}
|
|
47
|
+
export function nowISO() {
|
|
48
|
+
return new Date().toISOString();
|
|
49
|
+
}
|
|
50
|
+
export function getSessionId() {
|
|
51
|
+
return `session_${Date.now()}`;
|
|
52
|
+
}
|
|
53
|
+
const STORE_FILES = {
|
|
54
|
+
procedural: "procedural.json",
|
|
55
|
+
episodic: "episodic.json",
|
|
56
|
+
semantic: "semantic.json",
|
|
57
|
+
};
|
|
58
|
+
export function getStoreFile(type) {
|
|
59
|
+
return STORE_FILES[type];
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Search
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
export function searchMemories(memories, query, getText) {
|
|
65
|
+
const lower = query.toLowerCase();
|
|
66
|
+
const queryWords = lower.split(/\s+/).filter(Boolean);
|
|
67
|
+
return memories.filter((m) => {
|
|
68
|
+
const text = getText(m).toLowerCase();
|
|
69
|
+
const tagText = m.tags.join(" ").toLowerCase();
|
|
70
|
+
const combined = `${text} ${tagText}`;
|
|
71
|
+
return queryWords.every((w) => combined.includes(w));
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// Compaction
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
export function compactEpisodicMemories(memories) {
|
|
78
|
+
if (memories.length <= 1)
|
|
79
|
+
return memories;
|
|
80
|
+
const tagGroups = new Map();
|
|
81
|
+
for (const m of memories) {
|
|
82
|
+
let placed = false;
|
|
83
|
+
for (const [key, group] of tagGroups) {
|
|
84
|
+
const groupTags = new Set(key.split(","));
|
|
85
|
+
if (m.tags.some((t) => groupTags.has(t))) {
|
|
86
|
+
group.push(m);
|
|
87
|
+
const mergedTags = new Set([...groupTags, ...m.tags]);
|
|
88
|
+
tagGroups.delete(key);
|
|
89
|
+
tagGroups.set([...mergedTags].join(","), group);
|
|
90
|
+
placed = true;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (!placed) {
|
|
95
|
+
tagGroups.set(m.tags.join(",") || m.id, [m]);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const compacted = [];
|
|
99
|
+
for (const [, group] of tagGroups) {
|
|
100
|
+
if (group.length <= 1) {
|
|
101
|
+
compacted.push(...group);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const allDetails = group.flatMap((m) => m.details);
|
|
105
|
+
const allTags = [...new Set(group.flatMap((m) => m.tags))];
|
|
106
|
+
const allMistakes = group.flatMap((m) => m.reflection?.mistakes ?? []);
|
|
107
|
+
const allLessons = group.flatMap((m) => m.reflection?.lessons ?? []);
|
|
108
|
+
const summaries = group.map((m) => m.summary);
|
|
109
|
+
compacted.push({
|
|
110
|
+
id: group[0].id,
|
|
111
|
+
summary: `Consolidated: ${summaries.join("; ")}`,
|
|
112
|
+
details: [...new Set(allDetails)],
|
|
113
|
+
reflection: allMistakes.length > 0 || allLessons.length > 0
|
|
114
|
+
? { mistakes: [...new Set(allMistakes)], lessons: [...new Set(allLessons)] }
|
|
115
|
+
: undefined,
|
|
116
|
+
tags: allTags,
|
|
117
|
+
date: group[group.length - 1].date,
|
|
118
|
+
sourceSession: group[group.length - 1].sourceSession,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return compacted;
|
|
122
|
+
}
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Display formatters
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
export function formatProceduralForDisplay(m) {
|
|
127
|
+
const steps = m.steps.map((s, i) => ` ${i + 1}. ${s}`).join("\n");
|
|
128
|
+
return `[${m.id}] ${m.name}\n Trigger: ${m.trigger}\n Tags: ${m.tags.join(", ")}\n Steps:\n${steps}\n Updated: ${m.updated}`;
|
|
129
|
+
}
|
|
130
|
+
export function formatEpisodicForDisplay(m) {
|
|
131
|
+
let text = `[${m.id}] ${m.summary}\n Date: ${m.date}\n Tags: ${m.tags.join(", ")}`;
|
|
132
|
+
if (m.details.length > 0) {
|
|
133
|
+
text += `\n Details:\n${m.details.map((d) => ` - ${d}`).join("\n")}`;
|
|
134
|
+
}
|
|
135
|
+
if (m.reflection) {
|
|
136
|
+
if (m.reflection.mistakes.length > 0) {
|
|
137
|
+
text += `\n Mistakes:\n${m.reflection.mistakes.map((x) => ` - ${x}`).join("\n")}`;
|
|
138
|
+
}
|
|
139
|
+
if (m.reflection.lessons.length > 0) {
|
|
140
|
+
text += `\n Lessons:\n${m.reflection.lessons.map((x) => ` - ${x}`).join("\n")}`;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return text;
|
|
144
|
+
}
|
|
145
|
+
export function formatSemanticForDisplay(m) {
|
|
146
|
+
return `[${m.id}] (${m.category}) ${m.text}\n Tags: ${m.tags.join(", ")}\n Created: ${m.created}`;
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// System prompt section
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
export function buildMemoryPromptSection(cwd) {
|
|
152
|
+
const semantic = loadStore(cwd, "semantic.json");
|
|
153
|
+
const procedural = loadStore(cwd, "procedural.json");
|
|
154
|
+
const episodic = loadStore(cwd, "episodic.json");
|
|
155
|
+
if (semantic.memories.length === 0 && procedural.memories.length === 0 && episodic.memories.length === 0) {
|
|
156
|
+
return `\n\n<memory_system>
|
|
157
|
+
You have a persistent memory system that stores knowledge across sessions.
|
|
158
|
+
Currently no memories are stored. Use the memory_write tool to save:
|
|
159
|
+
1. Procedural memories when the user guides you through a multi-step workflow.
|
|
160
|
+
2. Semantic memories when the user states a preference, rule, correction, or fact.
|
|
161
|
+
3. Episodic memories when a significant task completes.
|
|
162
|
+
</memory_system>`;
|
|
163
|
+
}
|
|
164
|
+
const parts = [];
|
|
165
|
+
parts.push(`\n\n<memory_system>
|
|
166
|
+
You have a persistent memory system that stores knowledge across sessions.
|
|
167
|
+
You MUST use these memories to improve your responses. Do not ask the user
|
|
168
|
+
to repeat things they have already taught you.
|
|
169
|
+
|
|
170
|
+
AUTOMATIC MEMORY CAPTURE RULES:
|
|
171
|
+
1. When the user guides you through a multi-step workflow (correcting steps,
|
|
172
|
+
adding steps, reordering), save it as a PROCEDURAL memory using the
|
|
173
|
+
memory_write tool. Extract the general workflow, not the specific instance.
|
|
174
|
+
2. When the user states a preference or rule ("always do X", "never do Y",
|
|
175
|
+
"I prefer X"), save it as a SEMANTIC memory immediately.
|
|
176
|
+
3. When the user corrects you or you make a mistake, save the lesson as a
|
|
177
|
+
SEMANTIC memory with category "convention".
|
|
178
|
+
4. When a significant task completes, save a summary as an EPISODIC memory.
|
|
179
|
+
5. If you detect a conflict with an existing memory, ask the user: "You
|
|
180
|
+
previously told me [old]. You are now saying [new]. Should I update this?"
|
|
181
|
+
Only update after confirmation.
|
|
182
|
+
|
|
183
|
+
TIMESTAMP AWARENESS:
|
|
184
|
+
Each user message includes a timestamp. Use these to detect time gaps.
|
|
185
|
+
If the user returns after a significant gap (>10 minutes), acknowledge it
|
|
186
|
+
naturally if relevant. Do not force it if the gap is not relevant.`);
|
|
187
|
+
if (semantic.memories.length > 0) {
|
|
188
|
+
parts.push("\n<semantic_memories>");
|
|
189
|
+
for (const m of semantic.memories) {
|
|
190
|
+
parts.push(` <memory id="${m.id}" category="${m.category}">${escapeXml(m.text)}</memory>`);
|
|
191
|
+
}
|
|
192
|
+
parts.push("</semantic_memories>");
|
|
193
|
+
}
|
|
194
|
+
if (procedural.memories.length > 0) {
|
|
195
|
+
parts.push("\n<procedural_memories>");
|
|
196
|
+
for (const m of procedural.memories) {
|
|
197
|
+
const steps = m.steps.map((s, i) => `${i + 1}. ${s}`).join("; ");
|
|
198
|
+
parts.push(` <procedure id="${m.id}" name="${escapeXml(m.name)}" trigger="${escapeXml(m.trigger)}">${escapeXml(steps)}</procedure>`);
|
|
199
|
+
}
|
|
200
|
+
parts.push("</procedural_memories>");
|
|
201
|
+
}
|
|
202
|
+
if (episodic.memories.length > 0) {
|
|
203
|
+
const recent = episodic.memories.slice(-10);
|
|
204
|
+
parts.push("\n<recent_episodic_memories>");
|
|
205
|
+
for (const m of recent) {
|
|
206
|
+
const details = m.details.join("; ");
|
|
207
|
+
let text = details;
|
|
208
|
+
if (m.reflection?.lessons.length) {
|
|
209
|
+
text += ` | Lessons: ${m.reflection.lessons.join("; ")}`;
|
|
210
|
+
}
|
|
211
|
+
parts.push(` <episode id="${m.id}" date="${m.date}" summary="${escapeXml(m.summary)}">${escapeXml(text)}</episode>`);
|
|
212
|
+
}
|
|
213
|
+
parts.push("</recent_episodic_memories>");
|
|
214
|
+
}
|
|
215
|
+
parts.push("\n</memory_system>");
|
|
216
|
+
return parts.join("\n");
|
|
217
|
+
}
|
|
218
|
+
function escapeXml(str) {
|
|
219
|
+
return str
|
|
220
|
+
.replace(/&/g, "&")
|
|
221
|
+
.replace(/</g, "<")
|
|
222
|
+
.replace(/>/g, ">")
|
|
223
|
+
.replace(/"/g, """)
|
|
224
|
+
.replace(/'/g, "'");
|
|
225
|
+
}
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
// Timestamp formatting
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
export function formatTimestamp(ts) {
|
|
230
|
+
const d = new Date(ts);
|
|
231
|
+
return d.toLocaleString("en-US", {
|
|
232
|
+
year: "numeric",
|
|
233
|
+
month: "short",
|
|
234
|
+
day: "numeric",
|
|
235
|
+
hour: "2-digit",
|
|
236
|
+
minute: "2-digit",
|
|
237
|
+
second: "2-digit",
|
|
238
|
+
hour12: false,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
export function getMemoryCounts(cwd) {
|
|
242
|
+
const semantic = loadStore(cwd, "semantic.json").memories.length;
|
|
243
|
+
const procedural = loadStore(cwd, "procedural.json").memories.length;
|
|
244
|
+
const episodic = loadStore(cwd, "episodic.json").memories.length;
|
|
245
|
+
return { semantic, procedural, episodic, total: semantic + procedural + episodic };
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Persistent memory system — procedural, episodic, and semantic memories\r\n * stored per-project in .pi/memory/ as JSON files.\r\n */\r\n\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface ProceduralMemory {\r\n\tid: string;\r\n\tname: string;\r\n\ttrigger: string;\r\n\tsteps: string[];\r\n\ttags: string[];\r\n\tcreated: string;\r\n\tupdated: string;\r\n\tsourceSession: string;\r\n}\r\n\r\nexport interface EpisodicMemory {\r\n\tid: string;\r\n\tsummary: string;\r\n\tdetails: string[];\r\n\treflection?: {\r\n\t\tmistakes: string[];\r\n\t\tlessons: string[];\r\n\t};\r\n\ttags: string[];\r\n\tdate: string;\r\n\tsourceSession: string;\r\n}\r\n\r\nexport interface SemanticMemory {\r\n\tid: string;\r\n\tcategory: \"preference\" | \"architecture\" | \"convention\" | \"fact\";\r\n\ttext: string;\r\n\ttags: string[];\r\n\tcreated: string;\r\n\tsourceSession: string;\r\n}\r\n\r\nexport interface MemoryStore<T> {\r\n\tmemories: T[];\r\n}\r\n\r\nexport type MemoryType = \"procedural\" | \"episodic\" | \"semantic\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Storage\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function getMemoryDir(cwd: string): string {\r\n\treturn join(cwd, \".pi\", \"memory\");\r\n}\r\n\r\nfunction ensureMemoryDir(cwd: string): string {\r\n\tconst dir = getMemoryDir(cwd);\r\n\tif (!existsSync(dir)) {\r\n\t\tmkdirSync(dir, { recursive: true });\r\n\t}\r\n\treturn dir;\r\n}\r\n\r\nexport function loadStore<T>(cwd: string, filename: string): MemoryStore<T> {\r\n\tconst filepath = join(getMemoryDir(cwd), filename);\r\n\tif (!existsSync(filepath)) {\r\n\t\treturn { memories: [] };\r\n\t}\r\n\ttry {\r\n\t\tconst raw = readFileSync(filepath, \"utf-8\");\r\n\t\treturn JSON.parse(raw) as MemoryStore<T>;\r\n\t} catch {\r\n\t\treturn { memories: [] };\r\n\t}\r\n}\r\n\r\nexport function saveStore<T>(cwd: string, filename: string, store: MemoryStore<T>): void {\r\n\tconst dir = ensureMemoryDir(cwd);\r\n\tconst filepath = join(dir, filename);\r\n\twriteFileSync(filepath, JSON.stringify(store, null, 2), \"utf-8\");\r\n}\r\n\r\nexport function generateId(prefix: string, store: MemoryStore<{ id: string }>): string {\r\n\tlet max = 0;\r\n\tfor (const m of store.memories) {\r\n\t\tconst num = parseInt(m.id.replace(`${prefix}_`, \"\"), 10);\r\n\t\tif (!Number.isNaN(num) && num > max) max = num;\r\n\t}\r\n\treturn `${prefix}_${String(max + 1).padStart(3, \"0\")}`;\r\n}\r\n\r\nexport function nowISO(): string {\r\n\treturn new Date().toISOString();\r\n}\r\n\r\nexport function getSessionId(): string {\r\n\treturn `session_${Date.now()}`;\r\n}\r\n\r\nconst STORE_FILES: Record<MemoryType, string> = {\r\n\tprocedural: \"procedural.json\",\r\n\tepisodic: \"episodic.json\",\r\n\tsemantic: \"semantic.json\",\r\n};\r\n\r\nexport function getStoreFile(type: MemoryType): string {\r\n\treturn STORE_FILES[type];\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Search\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function searchMemories<T extends { tags: string[] }>(\r\n\tmemories: T[],\r\n\tquery: string,\r\n\tgetText: (m: T) => string,\r\n): T[] {\r\n\tconst lower = query.toLowerCase();\r\n\tconst queryWords = lower.split(/\\s+/).filter(Boolean);\r\n\treturn memories.filter((m) => {\r\n\t\tconst text = getText(m).toLowerCase();\r\n\t\tconst tagText = m.tags.join(\" \").toLowerCase();\r\n\t\tconst combined = `${text} ${tagText}`;\r\n\t\treturn queryWords.every((w) => combined.includes(w));\r\n\t});\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Compaction\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function compactEpisodicMemories(memories: EpisodicMemory[]): EpisodicMemory[] {\r\n\tif (memories.length <= 1) return memories;\r\n\r\n\tconst tagGroups = new Map<string, EpisodicMemory[]>();\r\n\tfor (const m of memories) {\r\n\t\tlet placed = false;\r\n\t\tfor (const [key, group] of tagGroups) {\r\n\t\t\tconst groupTags = new Set(key.split(\",\"));\r\n\t\t\tif (m.tags.some((t) => groupTags.has(t))) {\r\n\t\t\t\tgroup.push(m);\r\n\t\t\t\tconst mergedTags = new Set([...groupTags, ...m.tags]);\r\n\t\t\t\ttagGroups.delete(key);\r\n\t\t\t\ttagGroups.set([...mergedTags].join(\",\"), group);\r\n\t\t\t\tplaced = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!placed) {\r\n\t\t\ttagGroups.set(m.tags.join(\",\") || m.id, [m]);\r\n\t\t}\r\n\t}\r\n\r\n\tconst compacted: EpisodicMemory[] = [];\r\n\tfor (const [, group] of tagGroups) {\r\n\t\tif (group.length <= 1) {\r\n\t\t\tcompacted.push(...group);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tconst allDetails = group.flatMap((m) => m.details);\r\n\t\tconst allTags = [...new Set(group.flatMap((m) => m.tags))];\r\n\t\tconst allMistakes = group.flatMap((m) => m.reflection?.mistakes ?? []);\r\n\t\tconst allLessons = group.flatMap((m) => m.reflection?.lessons ?? []);\r\n\t\tconst summaries = group.map((m) => m.summary);\r\n\r\n\t\tcompacted.push({\r\n\t\t\tid: group[0].id,\r\n\t\t\tsummary: `Consolidated: ${summaries.join(\"; \")}`,\r\n\t\t\tdetails: [...new Set(allDetails)],\r\n\t\t\treflection:\r\n\t\t\t\tallMistakes.length > 0 || allLessons.length > 0\r\n\t\t\t\t\t? { mistakes: [...new Set(allMistakes)], lessons: [...new Set(allLessons)] }\r\n\t\t\t\t\t: undefined,\r\n\t\t\ttags: allTags,\r\n\t\t\tdate: group[group.length - 1].date,\r\n\t\t\tsourceSession: group[group.length - 1].sourceSession,\r\n\t\t});\r\n\t}\r\n\treturn compacted;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Display formatters\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function formatProceduralForDisplay(m: ProceduralMemory): string {\r\n\tconst steps = m.steps.map((s, i) => ` ${i + 1}. ${s}`).join(\"\\n\");\r\n\treturn `[${m.id}] ${m.name}\\n Trigger: ${m.trigger}\\n Tags: ${m.tags.join(\", \")}\\n Steps:\\n${steps}\\n Updated: ${m.updated}`;\r\n}\r\n\r\nexport function formatEpisodicForDisplay(m: EpisodicMemory): string {\r\n\tlet text = `[${m.id}] ${m.summary}\\n Date: ${m.date}\\n Tags: ${m.tags.join(\", \")}`;\r\n\tif (m.details.length > 0) {\r\n\t\ttext += `\\n Details:\\n${m.details.map((d) => ` - ${d}`).join(\"\\n\")}`;\r\n\t}\r\n\tif (m.reflection) {\r\n\t\tif (m.reflection.mistakes.length > 0) {\r\n\t\t\ttext += `\\n Mistakes:\\n${m.reflection.mistakes.map((x) => ` - ${x}`).join(\"\\n\")}`;\r\n\t\t}\r\n\t\tif (m.reflection.lessons.length > 0) {\r\n\t\t\ttext += `\\n Lessons:\\n${m.reflection.lessons.map((x) => ` - ${x}`).join(\"\\n\")}`;\r\n\t\t}\r\n\t}\r\n\treturn text;\r\n}\r\n\r\nexport function formatSemanticForDisplay(m: SemanticMemory): string {\r\n\treturn `[${m.id}] (${m.category}) ${m.text}\\n Tags: ${m.tags.join(\", \")}\\n Created: ${m.created}`;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// System prompt section\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function buildMemoryPromptSection(cwd: string): string {\r\n\tconst semantic = loadStore<SemanticMemory>(cwd, \"semantic.json\");\r\n\tconst procedural = loadStore<ProceduralMemory>(cwd, \"procedural.json\");\r\n\tconst episodic = loadStore<EpisodicMemory>(cwd, \"episodic.json\");\r\n\r\n\tif (semantic.memories.length === 0 && procedural.memories.length === 0 && episodic.memories.length === 0) {\r\n\t\treturn `\\n\\n<memory_system>\r\nYou have a persistent memory system that stores knowledge across sessions.\r\nCurrently no memories are stored. Use the memory_write tool to save:\r\n1. Procedural memories when the user guides you through a multi-step workflow.\r\n2. Semantic memories when the user states a preference, rule, correction, or fact.\r\n3. Episodic memories when a significant task completes.\r\n</memory_system>`;\r\n\t}\r\n\r\n\tconst parts: string[] = [];\r\n\r\n\tparts.push(`\\n\\n<memory_system>\r\nYou have a persistent memory system that stores knowledge across sessions.\r\nYou MUST use these memories to improve your responses. Do not ask the user\r\nto repeat things they have already taught you.\r\n\r\nAUTOMATIC MEMORY CAPTURE RULES:\r\n1. When the user guides you through a multi-step workflow (correcting steps,\r\n adding steps, reordering), save it as a PROCEDURAL memory using the\r\n memory_write tool. Extract the general workflow, not the specific instance.\r\n2. When the user states a preference or rule (\"always do X\", \"never do Y\",\r\n \"I prefer X\"), save it as a SEMANTIC memory immediately.\r\n3. When the user corrects you or you make a mistake, save the lesson as a\r\n SEMANTIC memory with category \"convention\".\r\n4. When a significant task completes, save a summary as an EPISODIC memory.\r\n5. If you detect a conflict with an existing memory, ask the user: \"You\r\n previously told me [old]. You are now saying [new]. Should I update this?\"\r\n Only update after confirmation.\r\n\r\nTIMESTAMP AWARENESS:\r\nEach user message includes a timestamp. Use these to detect time gaps.\r\nIf the user returns after a significant gap (>10 minutes), acknowledge it\r\nnaturally if relevant. Do not force it if the gap is not relevant.`);\r\n\r\n\tif (semantic.memories.length > 0) {\r\n\t\tparts.push(\"\\n<semantic_memories>\");\r\n\t\tfor (const m of semantic.memories) {\r\n\t\t\tparts.push(` <memory id=\"${m.id}\" category=\"${m.category}\">${escapeXml(m.text)}</memory>`);\r\n\t\t}\r\n\t\tparts.push(\"</semantic_memories>\");\r\n\t}\r\n\r\n\tif (procedural.memories.length > 0) {\r\n\t\tparts.push(\"\\n<procedural_memories>\");\r\n\t\tfor (const m of procedural.memories) {\r\n\t\t\tconst steps = m.steps.map((s, i) => `${i + 1}. ${s}`).join(\"; \");\r\n\t\t\tparts.push(\r\n\t\t\t\t` <procedure id=\"${m.id}\" name=\"${escapeXml(m.name)}\" trigger=\"${escapeXml(m.trigger)}\">${escapeXml(steps)}</procedure>`,\r\n\t\t\t);\r\n\t\t}\r\n\t\tparts.push(\"</procedural_memories>\");\r\n\t}\r\n\r\n\tif (episodic.memories.length > 0) {\r\n\t\tconst recent = episodic.memories.slice(-10);\r\n\t\tparts.push(\"\\n<recent_episodic_memories>\");\r\n\t\tfor (const m of recent) {\r\n\t\t\tconst details = m.details.join(\"; \");\r\n\t\t\tlet text = details;\r\n\t\t\tif (m.reflection?.lessons.length) {\r\n\t\t\t\ttext += ` | Lessons: ${m.reflection.lessons.join(\"; \")}`;\r\n\t\t\t}\r\n\t\t\tparts.push(\r\n\t\t\t\t` <episode id=\"${m.id}\" date=\"${m.date}\" summary=\"${escapeXml(m.summary)}\">${escapeXml(text)}</episode>`,\r\n\t\t\t);\r\n\t\t}\r\n\t\tparts.push(\"</recent_episodic_memories>\");\r\n\t}\r\n\r\n\tparts.push(\"\\n</memory_system>\");\r\n\r\n\treturn parts.join(\"\\n\");\r\n}\r\n\r\nfunction escapeXml(str: string): string {\r\n\treturn str\r\n\t\t.replace(/&/g, \"&\")\r\n\t\t.replace(/</g, \"<\")\r\n\t\t.replace(/>/g, \">\")\r\n\t\t.replace(/\"/g, \""\")\r\n\t\t.replace(/'/g, \"'\");\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Timestamp formatting\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function formatTimestamp(ts: number): string {\r\n\tconst d = new Date(ts);\r\n\treturn d.toLocaleString(\"en-US\", {\r\n\t\tyear: \"numeric\",\r\n\t\tmonth: \"short\",\r\n\t\tday: \"numeric\",\r\n\t\thour: \"2-digit\",\r\n\t\tminute: \"2-digit\",\r\n\t\tsecond: \"2-digit\",\r\n\t\thour12: false,\r\n\t});\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Memory counts (for status display)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface MemoryCounts {\r\n\tsemantic: number;\r\n\tprocedural: number;\r\n\tepisodic: number;\r\n\ttotal: number;\r\n}\r\n\r\nexport function getMemoryCounts(cwd: string): MemoryCounts {\r\n\tconst semantic = loadStore<SemanticMemory>(cwd, \"semantic.json\").memories.length;\r\n\tconst procedural = loadStore<ProceduralMemory>(cwd, \"procedural.json\").memories.length;\r\n\tconst episodic = loadStore<EpisodicMemory>(cwd, \"episodic.json\").memories.length;\r\n\treturn { semantic, procedural, episodic, total: semantic + procedural + episodic };\r\n}\r\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom message types and transformers for the coding agent.
|
|
3
|
+
*
|
|
4
|
+
* Extends the base AgentMessage type with coding-agent specific message types,
|
|
5
|
+
* and provides a transformer to convert them to LLM-compatible messages.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentMessage } from "@mariozechner/pi-agent-core";
|
|
8
|
+
import type { ImageContent, Message, TextContent } from "@mariozechner/pi-ai";
|
|
9
|
+
export declare const COMPACTION_SUMMARY_PREFIX = "The conversation history before this point was compacted into the following summary:\n\n<summary>\n";
|
|
10
|
+
export declare const COMPACTION_SUMMARY_SUFFIX = "\n</summary>";
|
|
11
|
+
export declare const BRANCH_SUMMARY_PREFIX = "The following is a summary of a branch that this conversation came back from:\n\n<summary>\n";
|
|
12
|
+
export declare const BRANCH_SUMMARY_SUFFIX = "</summary>";
|
|
13
|
+
/**
|
|
14
|
+
* Message type for bash executions via the ! command.
|
|
15
|
+
*/
|
|
16
|
+
export interface BashExecutionMessage {
|
|
17
|
+
role: "bashExecution";
|
|
18
|
+
command: string;
|
|
19
|
+
output: string;
|
|
20
|
+
exitCode: number | undefined;
|
|
21
|
+
cancelled: boolean;
|
|
22
|
+
truncated: boolean;
|
|
23
|
+
fullOutputPath?: string;
|
|
24
|
+
timestamp: number;
|
|
25
|
+
/** If true, this message is excluded from LLM context (!! prefix) */
|
|
26
|
+
excludeFromContext?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Message type for extension-injected messages via sendMessage().
|
|
30
|
+
* These are custom messages that extensions can inject into the conversation.
|
|
31
|
+
*/
|
|
32
|
+
export interface CustomMessage<T = unknown> {
|
|
33
|
+
role: "custom";
|
|
34
|
+
customType: string;
|
|
35
|
+
content: string | (TextContent | ImageContent)[];
|
|
36
|
+
display: boolean;
|
|
37
|
+
details?: T;
|
|
38
|
+
timestamp: number;
|
|
39
|
+
}
|
|
40
|
+
export interface BranchSummaryMessage {
|
|
41
|
+
role: "branchSummary";
|
|
42
|
+
summary: string;
|
|
43
|
+
fromId: string;
|
|
44
|
+
timestamp: number;
|
|
45
|
+
}
|
|
46
|
+
export interface CompactionSummaryMessage {
|
|
47
|
+
role: "compactionSummary";
|
|
48
|
+
summary: string;
|
|
49
|
+
tokensBefore: number;
|
|
50
|
+
timestamp: number;
|
|
51
|
+
}
|
|
52
|
+
declare module "@mariozechner/pi-agent-core" {
|
|
53
|
+
interface CustomAgentMessages {
|
|
54
|
+
bashExecution: BashExecutionMessage;
|
|
55
|
+
custom: CustomMessage;
|
|
56
|
+
branchSummary: BranchSummaryMessage;
|
|
57
|
+
compactionSummary: CompactionSummaryMessage;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Convert a BashExecutionMessage to user message text for LLM context.
|
|
62
|
+
*/
|
|
63
|
+
export declare function bashExecutionToText(msg: BashExecutionMessage): string;
|
|
64
|
+
export declare function createBranchSummaryMessage(summary: string, fromId: string, timestamp: string): BranchSummaryMessage;
|
|
65
|
+
export declare function createCompactionSummaryMessage(summary: string, tokensBefore: number, timestamp: string): CompactionSummaryMessage;
|
|
66
|
+
/** Convert CustomMessageEntry to AgentMessage format */
|
|
67
|
+
export declare function createCustomMessage(customType: string, content: string | (TextContent | ImageContent)[], display: boolean, details: unknown | undefined, timestamp: string): CustomMessage;
|
|
68
|
+
/**
|
|
69
|
+
* Transform AgentMessages (including custom types) to LLM-compatible Messages.
|
|
70
|
+
*
|
|
71
|
+
* This is used by:
|
|
72
|
+
* - Agent's transormToLlm option (for prompt calls and queued messages)
|
|
73
|
+
* - Compaction's generateSummary (for summarization)
|
|
74
|
+
* - Custom extensions and tools
|
|
75
|
+
*/
|
|
76
|
+
export declare function convertToLlm(messages: AgentMessage[]): Message[];
|
|
77
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG9E,eAAO,MAAM,yBAAyB,wGAGrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBAC3B,CAAC;AAEZ,eAAO,MAAM,qBAAqB,iGAGjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB;AAGD,OAAO,QAAQ,6BAA6B,CAAC,CAAC;IAC7C,UAAU,mBAAmB;QAC5B,aAAa,EAAE,oBAAoB,CAAC;QACpC,MAAM,EAAE,aAAa,CAAC;QACtB,aAAa,EAAE,oBAAoB,CAAC;QACpC,iBAAiB,EAAE,wBAAwB,CAAC;KAC5C;CACD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,CAgBrE;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAOnH;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GACf,wBAAwB,CAO1B;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GACf,aAAa,CASf;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAgDhE","sourcesContent":["/**\r\n * Custom message types and transformers for the coding agent.\r\n *\r\n * Extends the base AgentMessage type with coding-agent specific message types,\r\n * and provides a transformer to convert them to LLM-compatible messages.\r\n */\r\n\r\nimport type { AgentMessage } from \"@mariozechner/pi-agent-core\";\r\nimport type { ImageContent, Message, TextContent } from \"@mariozechner/pi-ai\";\r\nimport { formatTimestamp } from \"./memory.js\";\r\n\r\nexport const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:\r\n\r\n<summary>\r\n`;\r\n\r\nexport const COMPACTION_SUMMARY_SUFFIX = `\r\n</summary>`;\r\n\r\nexport const BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:\r\n\r\n<summary>\r\n`;\r\n\r\nexport const BRANCH_SUMMARY_SUFFIX = `</summary>`;\r\n\r\n/**\r\n * Message type for bash executions via the ! command.\r\n */\r\nexport interface BashExecutionMessage {\r\n\trole: \"bashExecution\";\r\n\tcommand: string;\r\n\toutput: string;\r\n\texitCode: number | undefined;\r\n\tcancelled: boolean;\r\n\ttruncated: boolean;\r\n\tfullOutputPath?: string;\r\n\ttimestamp: number;\r\n\t/** If true, this message is excluded from LLM context (!! prefix) */\r\n\texcludeFromContext?: boolean;\r\n}\r\n\r\n/**\r\n * Message type for extension-injected messages via sendMessage().\r\n * These are custom messages that extensions can inject into the conversation.\r\n */\r\nexport interface CustomMessage<T = unknown> {\r\n\trole: \"custom\";\r\n\tcustomType: string;\r\n\tcontent: string | (TextContent | ImageContent)[];\r\n\tdisplay: boolean;\r\n\tdetails?: T;\r\n\ttimestamp: number;\r\n}\r\n\r\nexport interface BranchSummaryMessage {\r\n\trole: \"branchSummary\";\r\n\tsummary: string;\r\n\tfromId: string;\r\n\ttimestamp: number;\r\n}\r\n\r\nexport interface CompactionSummaryMessage {\r\n\trole: \"compactionSummary\";\r\n\tsummary: string;\r\n\ttokensBefore: number;\r\n\ttimestamp: number;\r\n}\r\n\r\n// Extend CustomAgentMessages via declaration merging\r\ndeclare module \"@mariozechner/pi-agent-core\" {\r\n\tinterface CustomAgentMessages {\r\n\t\tbashExecution: BashExecutionMessage;\r\n\t\tcustom: CustomMessage;\r\n\t\tbranchSummary: BranchSummaryMessage;\r\n\t\tcompactionSummary: CompactionSummaryMessage;\r\n\t}\r\n}\r\n\r\n/**\r\n * Convert a BashExecutionMessage to user message text for LLM context.\r\n */\r\nexport function bashExecutionToText(msg: BashExecutionMessage): string {\r\n\tlet text = `Ran \\`${msg.command}\\`\\n`;\r\n\tif (msg.output) {\r\n\t\ttext += `\\`\\`\\`\\n${msg.output}\\n\\`\\`\\``;\r\n\t} else {\r\n\t\ttext += \"(no output)\";\r\n\t}\r\n\tif (msg.cancelled) {\r\n\t\ttext += \"\\n\\n(command cancelled)\";\r\n\t} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {\r\n\t\ttext += `\\n\\nCommand exited with code ${msg.exitCode}`;\r\n\t}\r\n\tif (msg.truncated && msg.fullOutputPath) {\r\n\t\ttext += `\\n\\n[Output truncated. Full output: ${msg.fullOutputPath}]`;\r\n\t}\r\n\treturn text;\r\n}\r\n\r\nexport function createBranchSummaryMessage(summary: string, fromId: string, timestamp: string): BranchSummaryMessage {\r\n\treturn {\r\n\t\trole: \"branchSummary\",\r\n\t\tsummary,\r\n\t\tfromId,\r\n\t\ttimestamp: new Date(timestamp).getTime(),\r\n\t};\r\n}\r\n\r\nexport function createCompactionSummaryMessage(\r\n\tsummary: string,\r\n\ttokensBefore: number,\r\n\ttimestamp: string,\r\n): CompactionSummaryMessage {\r\n\treturn {\r\n\t\trole: \"compactionSummary\",\r\n\t\tsummary: summary,\r\n\t\ttokensBefore,\r\n\t\ttimestamp: new Date(timestamp).getTime(),\r\n\t};\r\n}\r\n\r\n/** Convert CustomMessageEntry to AgentMessage format */\r\nexport function createCustomMessage(\r\n\tcustomType: string,\r\n\tcontent: string | (TextContent | ImageContent)[],\r\n\tdisplay: boolean,\r\n\tdetails: unknown | undefined,\r\n\ttimestamp: string,\r\n): CustomMessage {\r\n\treturn {\r\n\t\trole: \"custom\",\r\n\t\tcustomType,\r\n\t\tcontent,\r\n\t\tdisplay,\r\n\t\tdetails,\r\n\t\ttimestamp: new Date(timestamp).getTime(),\r\n\t};\r\n}\r\n\r\n/**\r\n * Transform AgentMessages (including custom types) to LLM-compatible Messages.\r\n *\r\n * This is used by:\r\n * - Agent's transormToLlm option (for prompt calls and queued messages)\r\n * - Compaction's generateSummary (for summarization)\r\n * - Custom extensions and tools\r\n */\r\nexport function convertToLlm(messages: AgentMessage[]): Message[] {\r\n\treturn messages\r\n\t\t.map((m): Message | undefined => {\r\n\t\t\tswitch (m.role) {\r\n\t\t\t\tcase \"bashExecution\":\r\n\t\t\t\t\t// Skip messages excluded from context (!! prefix)\r\n\t\t\t\t\tif (m.excludeFromContext) {\r\n\t\t\t\t\t\treturn undefined;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\trole: \"user\",\r\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: bashExecutionToText(m) }],\r\n\t\t\t\t\t\ttimestamp: m.timestamp,\r\n\t\t\t\t\t};\r\n\t\t\t\tcase \"custom\": {\r\n\t\t\t\t\tconst content = typeof m.content === \"string\" ? [{ type: \"text\" as const, text: m.content }] : m.content;\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\trole: \"user\",\r\n\t\t\t\t\t\tcontent,\r\n\t\t\t\t\t\ttimestamp: m.timestamp,\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tcase \"branchSummary\":\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\trole: \"user\",\r\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],\r\n\t\t\t\t\t\ttimestamp: m.timestamp,\r\n\t\t\t\t\t};\r\n\t\t\t\tcase \"compactionSummary\":\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\trole: \"user\",\r\n\t\t\t\t\t\tcontent: [\r\n\t\t\t\t\t\t\t{ type: \"text\" as const, text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\ttimestamp: m.timestamp,\r\n\t\t\t\t\t};\r\n\t\t\t\tcase \"user\":\r\n\t\t\t\t\treturn injectTimestamp(m);\r\n\t\t\t\tcase \"assistant\":\r\n\t\t\t\tcase \"toolResult\":\r\n\t\t\t\t\treturn m;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t// biome-ignore lint/correctness/noSwitchDeclarations: fine\r\n\t\t\t\t\tconst _exhaustiveCheck: never = m;\r\n\t\t\t\t\treturn undefined;\r\n\t\t\t}\r\n\t\t})\r\n\t\t.filter((m) => m !== undefined);\r\n}\r\n\r\n/**\r\n * Inject a human-readable timestamp prefix into a user message so the LLM\r\n * can see when each message was sent and detect time gaps between messages.\r\n */\r\nfunction injectTimestamp(m: Message & { role: \"user\" }): Message {\r\n\tif (!m.timestamp) return m;\r\n\tconst ts = formatTimestamp(m.timestamp);\r\n\tconst prefix = `[${ts}] `;\r\n\r\n\tif (typeof m.content === \"string\") {\r\n\t\tif (m.content.startsWith(\"[\")) return m; // Already has a timestamp prefix\r\n\t\treturn { ...m, content: prefix + m.content };\r\n\t}\r\n\r\n\tif (Array.isArray(m.content) && m.content.length > 0) {\r\n\t\tconst first = m.content[0];\r\n\t\tif (first.type === \"text\" && !first.text.startsWith(\"[\")) {\r\n\t\t\tconst newContent = [...m.content];\r\n\t\t\tnewContent[0] = { ...first, text: prefix + first.text };\r\n\t\t\treturn { ...m, content: newContent };\r\n\t\t}\r\n\t}\r\n\r\n\treturn m;\r\n}\r\n"]}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom message types and transformers for the coding agent.
|
|
3
|
+
*
|
|
4
|
+
* Extends the base AgentMessage type with coding-agent specific message types,
|
|
5
|
+
* and provides a transformer to convert them to LLM-compatible messages.
|
|
6
|
+
*/
|
|
7
|
+
import { formatTimestamp } from "./memory.js";
|
|
8
|
+
export const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:
|
|
9
|
+
|
|
10
|
+
<summary>
|
|
11
|
+
`;
|
|
12
|
+
export const COMPACTION_SUMMARY_SUFFIX = `
|
|
13
|
+
</summary>`;
|
|
14
|
+
export const BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:
|
|
15
|
+
|
|
16
|
+
<summary>
|
|
17
|
+
`;
|
|
18
|
+
export const BRANCH_SUMMARY_SUFFIX = `</summary>`;
|
|
19
|
+
/**
|
|
20
|
+
* Convert a BashExecutionMessage to user message text for LLM context.
|
|
21
|
+
*/
|
|
22
|
+
export function bashExecutionToText(msg) {
|
|
23
|
+
let text = `Ran \`${msg.command}\`\n`;
|
|
24
|
+
if (msg.output) {
|
|
25
|
+
text += `\`\`\`\n${msg.output}\n\`\`\``;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
text += "(no output)";
|
|
29
|
+
}
|
|
30
|
+
if (msg.cancelled) {
|
|
31
|
+
text += "\n\n(command cancelled)";
|
|
32
|
+
}
|
|
33
|
+
else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {
|
|
34
|
+
text += `\n\nCommand exited with code ${msg.exitCode}`;
|
|
35
|
+
}
|
|
36
|
+
if (msg.truncated && msg.fullOutputPath) {
|
|
37
|
+
text += `\n\n[Output truncated. Full output: ${msg.fullOutputPath}]`;
|
|
38
|
+
}
|
|
39
|
+
return text;
|
|
40
|
+
}
|
|
41
|
+
export function createBranchSummaryMessage(summary, fromId, timestamp) {
|
|
42
|
+
return {
|
|
43
|
+
role: "branchSummary",
|
|
44
|
+
summary,
|
|
45
|
+
fromId,
|
|
46
|
+
timestamp: new Date(timestamp).getTime(),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function createCompactionSummaryMessage(summary, tokensBefore, timestamp) {
|
|
50
|
+
return {
|
|
51
|
+
role: "compactionSummary",
|
|
52
|
+
summary: summary,
|
|
53
|
+
tokensBefore,
|
|
54
|
+
timestamp: new Date(timestamp).getTime(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Convert CustomMessageEntry to AgentMessage format */
|
|
58
|
+
export function createCustomMessage(customType, content, display, details, timestamp) {
|
|
59
|
+
return {
|
|
60
|
+
role: "custom",
|
|
61
|
+
customType,
|
|
62
|
+
content,
|
|
63
|
+
display,
|
|
64
|
+
details,
|
|
65
|
+
timestamp: new Date(timestamp).getTime(),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Transform AgentMessages (including custom types) to LLM-compatible Messages.
|
|
70
|
+
*
|
|
71
|
+
* This is used by:
|
|
72
|
+
* - Agent's transormToLlm option (for prompt calls and queued messages)
|
|
73
|
+
* - Compaction's generateSummary (for summarization)
|
|
74
|
+
* - Custom extensions and tools
|
|
75
|
+
*/
|
|
76
|
+
export function convertToLlm(messages) {
|
|
77
|
+
return messages
|
|
78
|
+
.map((m) => {
|
|
79
|
+
switch (m.role) {
|
|
80
|
+
case "bashExecution":
|
|
81
|
+
// Skip messages excluded from context (!! prefix)
|
|
82
|
+
if (m.excludeFromContext) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
role: "user",
|
|
87
|
+
content: [{ type: "text", text: bashExecutionToText(m) }],
|
|
88
|
+
timestamp: m.timestamp,
|
|
89
|
+
};
|
|
90
|
+
case "custom": {
|
|
91
|
+
const content = typeof m.content === "string" ? [{ type: "text", text: m.content }] : m.content;
|
|
92
|
+
return {
|
|
93
|
+
role: "user",
|
|
94
|
+
content,
|
|
95
|
+
timestamp: m.timestamp,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
case "branchSummary":
|
|
99
|
+
return {
|
|
100
|
+
role: "user",
|
|
101
|
+
content: [{ type: "text", text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],
|
|
102
|
+
timestamp: m.timestamp,
|
|
103
|
+
};
|
|
104
|
+
case "compactionSummary":
|
|
105
|
+
return {
|
|
106
|
+
role: "user",
|
|
107
|
+
content: [
|
|
108
|
+
{ type: "text", text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },
|
|
109
|
+
],
|
|
110
|
+
timestamp: m.timestamp,
|
|
111
|
+
};
|
|
112
|
+
case "user":
|
|
113
|
+
return injectTimestamp(m);
|
|
114
|
+
case "assistant":
|
|
115
|
+
case "toolResult":
|
|
116
|
+
return m;
|
|
117
|
+
default:
|
|
118
|
+
// biome-ignore lint/correctness/noSwitchDeclarations: fine
|
|
119
|
+
const _exhaustiveCheck = m;
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
})
|
|
123
|
+
.filter((m) => m !== undefined);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Inject a human-readable timestamp prefix into a user message so the LLM
|
|
127
|
+
* can see when each message was sent and detect time gaps between messages.
|
|
128
|
+
*/
|
|
129
|
+
function injectTimestamp(m) {
|
|
130
|
+
if (!m.timestamp)
|
|
131
|
+
return m;
|
|
132
|
+
const ts = formatTimestamp(m.timestamp);
|
|
133
|
+
const prefix = `[${ts}] `;
|
|
134
|
+
if (typeof m.content === "string") {
|
|
135
|
+
if (m.content.startsWith("["))
|
|
136
|
+
return m; // Already has a timestamp prefix
|
|
137
|
+
return { ...m, content: prefix + m.content };
|
|
138
|
+
}
|
|
139
|
+
if (Array.isArray(m.content) && m.content.length > 0) {
|
|
140
|
+
const first = m.content[0];
|
|
141
|
+
if (first.type === "text" && !first.text.startsWith("[")) {
|
|
142
|
+
const newContent = [...m.content];
|
|
143
|
+
newContent[0] = { ...first, text: prefix + first.text };
|
|
144
|
+
return { ...m, content: newContent };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return m;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Custom message types and transformers for the coding agent.\r\n *\r\n * Extends the base AgentMessage type with coding-agent specific message types,\r\n * and provides a transformer to convert them to LLM-compatible messages.\r\n */\r\n\r\nimport type { AgentMessage } from \"@mariozechner/pi-agent-core\";\r\nimport type { ImageContent, Message, TextContent } from \"@mariozechner/pi-ai\";\r\nimport { formatTimestamp } from \"./memory.js\";\r\n\r\nexport const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:\r\n\r\n<summary>\r\n`;\r\n\r\nexport const COMPACTION_SUMMARY_SUFFIX = `\r\n</summary>`;\r\n\r\nexport const BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:\r\n\r\n<summary>\r\n`;\r\n\r\nexport const BRANCH_SUMMARY_SUFFIX = `</summary>`;\r\n\r\n/**\r\n * Message type for bash executions via the ! command.\r\n */\r\nexport interface BashExecutionMessage {\r\n\trole: \"bashExecution\";\r\n\tcommand: string;\r\n\toutput: string;\r\n\texitCode: number | undefined;\r\n\tcancelled: boolean;\r\n\ttruncated: boolean;\r\n\tfullOutputPath?: string;\r\n\ttimestamp: number;\r\n\t/** If true, this message is excluded from LLM context (!! prefix) */\r\n\texcludeFromContext?: boolean;\r\n}\r\n\r\n/**\r\n * Message type for extension-injected messages via sendMessage().\r\n * These are custom messages that extensions can inject into the conversation.\r\n */\r\nexport interface CustomMessage<T = unknown> {\r\n\trole: \"custom\";\r\n\tcustomType: string;\r\n\tcontent: string | (TextContent | ImageContent)[];\r\n\tdisplay: boolean;\r\n\tdetails?: T;\r\n\ttimestamp: number;\r\n}\r\n\r\nexport interface BranchSummaryMessage {\r\n\trole: \"branchSummary\";\r\n\tsummary: string;\r\n\tfromId: string;\r\n\ttimestamp: number;\r\n}\r\n\r\nexport interface CompactionSummaryMessage {\r\n\trole: \"compactionSummary\";\r\n\tsummary: string;\r\n\ttokensBefore: number;\r\n\ttimestamp: number;\r\n}\r\n\r\n// Extend CustomAgentMessages via declaration merging\r\ndeclare module \"@mariozechner/pi-agent-core\" {\r\n\tinterface CustomAgentMessages {\r\n\t\tbashExecution: BashExecutionMessage;\r\n\t\tcustom: CustomMessage;\r\n\t\tbranchSummary: BranchSummaryMessage;\r\n\t\tcompactionSummary: CompactionSummaryMessage;\r\n\t}\r\n}\r\n\r\n/**\r\n * Convert a BashExecutionMessage to user message text for LLM context.\r\n */\r\nexport function bashExecutionToText(msg: BashExecutionMessage): string {\r\n\tlet text = `Ran \\`${msg.command}\\`\\n`;\r\n\tif (msg.output) {\r\n\t\ttext += `\\`\\`\\`\\n${msg.output}\\n\\`\\`\\``;\r\n\t} else {\r\n\t\ttext += \"(no output)\";\r\n\t}\r\n\tif (msg.cancelled) {\r\n\t\ttext += \"\\n\\n(command cancelled)\";\r\n\t} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {\r\n\t\ttext += `\\n\\nCommand exited with code ${msg.exitCode}`;\r\n\t}\r\n\tif (msg.truncated && msg.fullOutputPath) {\r\n\t\ttext += `\\n\\n[Output truncated. Full output: ${msg.fullOutputPath}]`;\r\n\t}\r\n\treturn text;\r\n}\r\n\r\nexport function createBranchSummaryMessage(summary: string, fromId: string, timestamp: string): BranchSummaryMessage {\r\n\treturn {\r\n\t\trole: \"branchSummary\",\r\n\t\tsummary,\r\n\t\tfromId,\r\n\t\ttimestamp: new Date(timestamp).getTime(),\r\n\t};\r\n}\r\n\r\nexport function createCompactionSummaryMessage(\r\n\tsummary: string,\r\n\ttokensBefore: number,\r\n\ttimestamp: string,\r\n): CompactionSummaryMessage {\r\n\treturn {\r\n\t\trole: \"compactionSummary\",\r\n\t\tsummary: summary,\r\n\t\ttokensBefore,\r\n\t\ttimestamp: new Date(timestamp).getTime(),\r\n\t};\r\n}\r\n\r\n/** Convert CustomMessageEntry to AgentMessage format */\r\nexport function createCustomMessage(\r\n\tcustomType: string,\r\n\tcontent: string | (TextContent | ImageContent)[],\r\n\tdisplay: boolean,\r\n\tdetails: unknown | undefined,\r\n\ttimestamp: string,\r\n): CustomMessage {\r\n\treturn {\r\n\t\trole: \"custom\",\r\n\t\tcustomType,\r\n\t\tcontent,\r\n\t\tdisplay,\r\n\t\tdetails,\r\n\t\ttimestamp: new Date(timestamp).getTime(),\r\n\t};\r\n}\r\n\r\n/**\r\n * Transform AgentMessages (including custom types) to LLM-compatible Messages.\r\n *\r\n * This is used by:\r\n * - Agent's transormToLlm option (for prompt calls and queued messages)\r\n * - Compaction's generateSummary (for summarization)\r\n * - Custom extensions and tools\r\n */\r\nexport function convertToLlm(messages: AgentMessage[]): Message[] {\r\n\treturn messages\r\n\t\t.map((m): Message | undefined => {\r\n\t\t\tswitch (m.role) {\r\n\t\t\t\tcase \"bashExecution\":\r\n\t\t\t\t\t// Skip messages excluded from context (!! prefix)\r\n\t\t\t\t\tif (m.excludeFromContext) {\r\n\t\t\t\t\t\treturn undefined;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\trole: \"user\",\r\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: bashExecutionToText(m) }],\r\n\t\t\t\t\t\ttimestamp: m.timestamp,\r\n\t\t\t\t\t};\r\n\t\t\t\tcase \"custom\": {\r\n\t\t\t\t\tconst content = typeof m.content === \"string\" ? [{ type: \"text\" as const, text: m.content }] : m.content;\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\trole: \"user\",\r\n\t\t\t\t\t\tcontent,\r\n\t\t\t\t\t\ttimestamp: m.timestamp,\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t\tcase \"branchSummary\":\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\trole: \"user\",\r\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],\r\n\t\t\t\t\t\ttimestamp: m.timestamp,\r\n\t\t\t\t\t};\r\n\t\t\t\tcase \"compactionSummary\":\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\trole: \"user\",\r\n\t\t\t\t\t\tcontent: [\r\n\t\t\t\t\t\t\t{ type: \"text\" as const, text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\ttimestamp: m.timestamp,\r\n\t\t\t\t\t};\r\n\t\t\t\tcase \"user\":\r\n\t\t\t\t\treturn injectTimestamp(m);\r\n\t\t\t\tcase \"assistant\":\r\n\t\t\t\tcase \"toolResult\":\r\n\t\t\t\t\treturn m;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t// biome-ignore lint/correctness/noSwitchDeclarations: fine\r\n\t\t\t\t\tconst _exhaustiveCheck: never = m;\r\n\t\t\t\t\treturn undefined;\r\n\t\t\t}\r\n\t\t})\r\n\t\t.filter((m) => m !== undefined);\r\n}\r\n\r\n/**\r\n * Inject a human-readable timestamp prefix into a user message so the LLM\r\n * can see when each message was sent and detect time gaps between messages.\r\n */\r\nfunction injectTimestamp(m: Message & { role: \"user\" }): Message {\r\n\tif (!m.timestamp) return m;\r\n\tconst ts = formatTimestamp(m.timestamp);\r\n\tconst prefix = `[${ts}] `;\r\n\r\n\tif (typeof m.content === \"string\") {\r\n\t\tif (m.content.startsWith(\"[\")) return m; // Already has a timestamp prefix\r\n\t\treturn { ...m, content: prefix + m.content };\r\n\t}\r\n\r\n\tif (Array.isArray(m.content) && m.content.length > 0) {\r\n\t\tconst first = m.content[0];\r\n\t\tif (first.type === \"text\" && !first.text.startsWith(\"[\")) {\r\n\t\t\tconst newContent = [...m.content];\r\n\t\t\tnewContent[0] = { ...first, text: prefix + first.text };\r\n\t\t\treturn { ...m, content: newContent };\r\n\t\t}\r\n\t}\r\n\r\n\treturn m;\r\n}\r\n"]}
|