@vandeepunk/pi-coding-agent 0.0.6 → 1.0.0
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 +814 -16
- package/README.md +66 -27
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +7 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -0
- package/dist/bun/register-bedrock.js +4 -0
- package/dist/bun/register-bedrock.js.map +1 -0
- package/dist/cli/args.d.ts +9 -4
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +61 -22
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +4 -0
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +2 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +83 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -0
- package/dist/core/agent-session-runtime.js +236 -0
- package/dist/core/agent-session-runtime.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +86 -0
- package/dist/core/agent-session-services.d.ts.map +1 -0
- package/dist/core/agent-session-services.js +116 -0
- package/dist/core/agent-session-services.js.map +1 -0
- package/dist/core/agent-session.d.ts +63 -49
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +599 -370
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +38 -8
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +220 -96
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts +6 -7
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +27 -114
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +3 -2
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +3 -3
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +31 -25
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +3 -0
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +16 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +7 -3
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/index.d.ts +7 -4
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +10 -8
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.css +43 -13
- package/dist/core/export-html/template.html +1 -0
- package/dist/core/export-html/template.js +118 -14
- package/dist/core/export-html/tool-renderer.d.ts +9 -4
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +48 -10
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/index.d.ts +5 -4
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +2 -2
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +49 -13
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +13 -11
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +139 -64
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +174 -34
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +10 -0
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +4 -11
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +6 -86
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +18 -2
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +220 -40
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/index.d.ts +4 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/keybindings.d.ts +283 -50
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +221 -134
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-registry.d.ts +33 -3
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +165 -97
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +35 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +205 -32
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/output-guard.d.ts +6 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +59 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +43 -2
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +541 -102
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/prompt-templates.d.ts +5 -4
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +35 -37
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts +6 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js +75 -8
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts +6 -5
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +166 -119
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +11 -8
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +31 -29
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +11 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +39 -25
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +60 -10
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +291 -140
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +5 -3
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +54 -9
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts +2 -3
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +3 -2
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts +18 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +19 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +4 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +31 -52
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/timings.d.ts +1 -0
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +6 -0
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts +24 -6
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +225 -115
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +23 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +151 -57
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +20 -6
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +111 -61
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +37 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +11 -4
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +82 -30
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +15 -4
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +83 -29
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +63 -21
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +51 -26
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +9 -3
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +67 -13
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +10 -3
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +110 -51
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +21 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +49 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +32 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/write.d.ts +9 -3
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +168 -30
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +354 -379
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +31 -11
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +14 -3
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +22 -9
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +2 -2
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +2 -2
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +14 -14
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +3 -3
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +6 -6
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +5 -2
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +18 -9
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +5 -5
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +8 -8
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +21 -40
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +3 -36
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +5 -44
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +7 -7
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +13 -9
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +7 -7
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +4 -4
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +33 -36
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +5 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +25 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +5 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +2 -2
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +5 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +5 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +17 -29
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +139 -501
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +25 -4
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +184 -34
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +6 -6
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +1 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +12 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +25 -17
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +669 -385
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +3 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +83 -48
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +2 -2
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +90 -79
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +8 -11
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +2 -2
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +130 -87
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +3 -4
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts +4 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +234 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/utils/child-process.d.ts +11 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +78 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +94 -11
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts +1 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +27 -16
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +158 -0
- package/dist/utils/exif-orientation.js.map +1 -0
- package/dist/utils/git.d.ts +5 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +14 -3
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js +5 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-resize.d.ts +5 -5
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js +51 -95
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/paths.d.ts +7 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +19 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +67 -22
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/compaction.md +6 -2
- package/docs/custom-provider.md +57 -9
- package/docs/development.md +3 -1
- package/docs/extensions.md +437 -67
- package/docs/json.md +5 -2
- package/docs/keybindings.md +108 -107
- package/docs/models.md +50 -2
- package/docs/packages.md +17 -10
- package/docs/prompt-templates.md +6 -6
- package/docs/providers.md +10 -1
- package/docs/rpc.md +78 -18
- package/docs/sdk.md +261 -96
- package/docs/settings.md +28 -3
- package/docs/skills.md +9 -4
- package/docs/terminal-setup.md +39 -3
- package/docs/tmux.md +61 -0
- package/docs/tree.md +15 -3
- package/docs/tui.md +2 -2
- package/examples/extensions/README.md +3 -0
- package/examples/extensions/antigravity-image-gen.ts +12 -7
- package/examples/extensions/built-in-tool-renderer.ts +246 -0
- package/examples/extensions/commands.ts +3 -3
- package/examples/extensions/custom-compaction.ts +17 -4
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +2 -2
- package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
- package/examples/extensions/doom-overlay/doom/build.sh +2 -2
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/handoff.ts +5 -2
- package/examples/extensions/hello.ts +18 -17
- package/examples/extensions/hidden-thinking-label.ts +53 -0
- package/examples/extensions/minimal-mode.ts +14 -14
- package/examples/extensions/overlay-qa-tests.ts +468 -1
- package/examples/extensions/preset.ts +2 -3
- package/examples/extensions/provider-payload.ts +14 -0
- package/examples/extensions/qna.ts +5 -2
- package/examples/extensions/question.ts +2 -2
- package/examples/extensions/questionnaire.ts +2 -2
- package/examples/extensions/rpc-demo.ts +3 -9
- package/examples/extensions/sandbox/index.ts +6 -3
- package/examples/extensions/status-line.ts +0 -8
- package/examples/extensions/subagent/README.md +4 -4
- package/examples/extensions/subagent/agents.ts +2 -3
- package/examples/extensions/subagent/index.ts +30 -8
- package/examples/extensions/summarize.ts +15 -4
- package/examples/extensions/todo.ts +2 -4
- package/examples/extensions/tool-override.ts +10 -9
- package/examples/extensions/tools.ts +0 -5
- package/examples/extensions/trigger-compact.ts +11 -1
- package/examples/extensions/truncated-tool.ts +8 -5
- package/examples/extensions/widget-placement.ts +4 -12
- package/examples/extensions/with-deps/index.ts +1 -5
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/02-custom-model.ts +2 -2
- package/examples/sdk/04-skills.ts +8 -2
- package/examples/sdk/08-prompt-templates.ts +4 -3
- package/examples/sdk/09-api-keys-and-oauth.ts +5 -5
- package/examples/sdk/10-settings.ts +13 -0
- package/examples/sdk/12-full-control.ts +2 -3
- package/examples/sdk/13-session-runtime.ts +67 -0
- package/examples/sdk/README.md +10 -7
- package/package.json +98 -94
- /package/examples/extensions/subagent/{commands → prompts}/implement-and-review.md +0 -0
- /package/examples/extensions/subagent/{commands → prompts}/implement.md +0 -0
- /package/examples/extensions/subagent/{commands → prompts}/scout-and-plan.md +0 -0
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import * as fs from "node:fs";
|
|
6
|
-
import * as os from "node:os";
|
|
7
6
|
import * as path from "node:path";
|
|
8
|
-
import { parseFrontmatter } from "@mariozechner/pi-coding-agent";
|
|
7
|
+
import { getAgentDir, parseFrontmatter } from "@mariozechner/pi-coding-agent";
|
|
9
8
|
|
|
10
9
|
export type AgentScope = "user" | "project" | "both";
|
|
11
10
|
|
|
@@ -96,7 +95,7 @@ function findNearestProjectAgentsDir(cwd: string): string | null {
|
|
|
96
95
|
}
|
|
97
96
|
|
|
98
97
|
export function discoverAgents(cwd: string, scope: AgentScope): AgentDiscoveryResult {
|
|
99
|
-
const userDir = path.join(
|
|
98
|
+
const userDir = path.join(getAgentDir(), "agents");
|
|
100
99
|
const projectAgentsDir = findNearestProjectAgentsDir(cwd);
|
|
101
100
|
|
|
102
101
|
const userAgents = scope === "project" ? [] : loadAgentsFromDir(userDir, "user");
|
|
@@ -19,7 +19,7 @@ import * as path from "node:path";
|
|
|
19
19
|
import type { AgentToolResult } from "@mariozechner/pi-agent-core";
|
|
20
20
|
import type { Message } from "@mariozechner/pi-ai";
|
|
21
21
|
import { StringEnum } from "@mariozechner/pi-ai";
|
|
22
|
-
import { type ExtensionAPI, getMarkdownTheme } from "@mariozechner/pi-coding-agent";
|
|
22
|
+
import { type ExtensionAPI, getMarkdownTheme, withFileMutationQueue } from "@mariozechner/pi-coding-agent";
|
|
23
23
|
import { Container, Markdown, Spacer, Text } from "@mariozechner/pi-tui";
|
|
24
24
|
import { Type } from "@sinclair/typebox";
|
|
25
25
|
import { type AgentConfig, type AgentScope, discoverAgents } from "./agents.js";
|
|
@@ -207,14 +207,31 @@ async function mapWithConcurrencyLimit<TIn, TOut>(
|
|
|
207
207
|
return results;
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
-
function writePromptToTempFile(agentName: string, prompt: string): { dir: string; filePath: string } {
|
|
211
|
-
const tmpDir = fs.
|
|
210
|
+
async function writePromptToTempFile(agentName: string, prompt: string): Promise<{ dir: string; filePath: string }> {
|
|
211
|
+
const tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "pi-subagent-"));
|
|
212
212
|
const safeName = agentName.replace(/[^\w.-]+/g, "_");
|
|
213
213
|
const filePath = path.join(tmpDir, `prompt-${safeName}.md`);
|
|
214
|
-
|
|
214
|
+
await withFileMutationQueue(filePath, async () => {
|
|
215
|
+
await fs.promises.writeFile(filePath, prompt, { encoding: "utf-8", mode: 0o600 });
|
|
216
|
+
});
|
|
215
217
|
return { dir: tmpDir, filePath };
|
|
216
218
|
}
|
|
217
219
|
|
|
220
|
+
function getPiInvocation(args: string[]): { command: string; args: string[] } {
|
|
221
|
+
const currentScript = process.argv[1];
|
|
222
|
+
if (currentScript && fs.existsSync(currentScript)) {
|
|
223
|
+
return { command: process.execPath, args: [currentScript, ...args] };
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const execName = path.basename(process.execPath).toLowerCase();
|
|
227
|
+
const isGenericRuntime = /^(node|bun)(\.exe)?$/.test(execName);
|
|
228
|
+
if (!isGenericRuntime) {
|
|
229
|
+
return { command: process.execPath, args };
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return { command: "pi", args };
|
|
233
|
+
}
|
|
234
|
+
|
|
218
235
|
type OnUpdateCallback = (partial: AgentToolResult<SubagentDetails>) => void;
|
|
219
236
|
|
|
220
237
|
async function runSingleAgent(
|
|
@@ -274,7 +291,7 @@ async function runSingleAgent(
|
|
|
274
291
|
|
|
275
292
|
try {
|
|
276
293
|
if (agent.systemPrompt.trim()) {
|
|
277
|
-
const tmp = writePromptToTempFile(agent.name, agent.systemPrompt);
|
|
294
|
+
const tmp = await writePromptToTempFile(agent.name, agent.systemPrompt);
|
|
278
295
|
tmpPromptDir = tmp.dir;
|
|
279
296
|
tmpPromptPath = tmp.filePath;
|
|
280
297
|
args.push("--append-system-prompt", tmpPromptPath);
|
|
@@ -284,7 +301,12 @@ async function runSingleAgent(
|
|
|
284
301
|
let wasAborted = false;
|
|
285
302
|
|
|
286
303
|
const exitCode = await new Promise<number>((resolve) => {
|
|
287
|
-
const
|
|
304
|
+
const invocation = getPiInvocation(args);
|
|
305
|
+
const proc = spawn(invocation.command, invocation.args, {
|
|
306
|
+
cwd: cwd ?? defaultCwd,
|
|
307
|
+
shell: false,
|
|
308
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
309
|
+
});
|
|
288
310
|
let buffer = "";
|
|
289
311
|
|
|
290
312
|
const processLine = (line: string) => {
|
|
@@ -646,7 +668,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
646
668
|
};
|
|
647
669
|
},
|
|
648
670
|
|
|
649
|
-
renderCall(args, theme) {
|
|
671
|
+
renderCall(args, theme, _context) {
|
|
650
672
|
const scope: AgentScope = args.agentScope ?? "user";
|
|
651
673
|
if (args.chain && args.chain.length > 0) {
|
|
652
674
|
let text =
|
|
@@ -690,7 +712,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
690
712
|
return new Text(text, 0, 0);
|
|
691
713
|
},
|
|
692
714
|
|
|
693
|
-
renderResult(result, { expanded }, theme) {
|
|
715
|
+
renderResult(result, { expanded }, theme, _context) {
|
|
694
716
|
const details = result.details as SubagentDetails | undefined;
|
|
695
717
|
if (!details || details.results.length === 0) {
|
|
696
718
|
const text = result.content[0];
|
|
@@ -165,12 +165,15 @@ export default function (pi: ExtensionAPI) {
|
|
|
165
165
|
ctx.ui.notify("Model openai/gpt-5.2 not found", "warning");
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
-
const
|
|
169
|
-
if (!
|
|
168
|
+
const auth = model ? await ctx.modelRegistry.getApiKeyAndHeaders(model) : undefined;
|
|
169
|
+
if (auth && !auth.ok && ctx.hasUI) {
|
|
170
|
+
ctx.ui.notify(auth.error, "warning");
|
|
171
|
+
}
|
|
172
|
+
if (auth?.ok && !auth.apiKey && ctx.hasUI) {
|
|
170
173
|
ctx.ui.notify("No API key for openai/gpt-5.2", "warning");
|
|
171
174
|
}
|
|
172
175
|
|
|
173
|
-
if (!model || !apiKey) {
|
|
176
|
+
if (!model || !auth?.ok || !auth.apiKey) {
|
|
174
177
|
return;
|
|
175
178
|
}
|
|
176
179
|
|
|
@@ -182,7 +185,15 @@ export default function (pi: ExtensionAPI) {
|
|
|
182
185
|
},
|
|
183
186
|
];
|
|
184
187
|
|
|
185
|
-
const response = await complete(
|
|
188
|
+
const response = await complete(
|
|
189
|
+
model,
|
|
190
|
+
{ messages: summaryMessages },
|
|
191
|
+
{
|
|
192
|
+
apiKey: auth.apiKey,
|
|
193
|
+
headers: auth.headers,
|
|
194
|
+
reasoningEffort: "high",
|
|
195
|
+
},
|
|
196
|
+
);
|
|
186
197
|
|
|
187
198
|
const summary = response.content
|
|
188
199
|
.filter((c): c is { type: "text"; text: string } => c.type === "text")
|
|
@@ -130,8 +130,6 @@ export default function (pi: ExtensionAPI) {
|
|
|
130
130
|
|
|
131
131
|
// Reconstruct state on session events
|
|
132
132
|
pi.on("session_start", async (_event, ctx) => reconstructState(ctx));
|
|
133
|
-
pi.on("session_switch", async (_event, ctx) => reconstructState(ctx));
|
|
134
|
-
pi.on("session_fork", async (_event, ctx) => reconstructState(ctx));
|
|
135
133
|
pi.on("session_tree", async (_event, ctx) => reconstructState(ctx));
|
|
136
134
|
|
|
137
135
|
// Register the todo tool for the LLM
|
|
@@ -220,14 +218,14 @@ export default function (pi: ExtensionAPI) {
|
|
|
220
218
|
}
|
|
221
219
|
},
|
|
222
220
|
|
|
223
|
-
renderCall(args, theme) {
|
|
221
|
+
renderCall(args, theme, _context) {
|
|
224
222
|
let text = theme.fg("toolTitle", theme.bold("todo ")) + theme.fg("muted", args.action);
|
|
225
223
|
if (args.text) text += ` ${theme.fg("dim", `"${args.text}"`)}`;
|
|
226
224
|
if (args.id !== undefined) text += ` ${theme.fg("accent", `#${args.id}`)}`;
|
|
227
225
|
return new Text(text, 0, 0);
|
|
228
226
|
},
|
|
229
227
|
|
|
230
|
-
renderResult(result, { expanded }, theme) {
|
|
228
|
+
renderResult(result, { expanded }, theme, _context) {
|
|
231
229
|
const details = result.details as TodoDetails | undefined;
|
|
232
230
|
if (!details) {
|
|
233
231
|
const text = result.content[0];
|
|
@@ -21,14 +21,13 @@
|
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
23
|
import type { TextContent } from "@mariozechner/pi-ai";
|
|
24
|
-
import type
|
|
24
|
+
import { type ExtensionAPI, getAgentDir, withFileMutationQueue } from "@mariozechner/pi-coding-agent";
|
|
25
25
|
import { Type } from "@sinclair/typebox";
|
|
26
|
-
import {
|
|
27
|
-
import { access, readFile } from "fs/promises";
|
|
28
|
-
import { homedir } from "os";
|
|
26
|
+
import { constants, readFileSync } from "fs";
|
|
27
|
+
import { access, appendFile, readFile } from "fs/promises";
|
|
29
28
|
import { join, resolve } from "path";
|
|
30
29
|
|
|
31
|
-
const LOG_FILE = join(
|
|
30
|
+
const LOG_FILE = join(getAgentDir(), "read-access.log");
|
|
32
31
|
|
|
33
32
|
// Paths that are blocked from reading
|
|
34
33
|
const BLOCKED_PATTERNS = [
|
|
@@ -45,14 +44,16 @@ function isBlockedPath(path: string): boolean {
|
|
|
45
44
|
return BLOCKED_PATTERNS.some((pattern) => pattern.test(path));
|
|
46
45
|
}
|
|
47
46
|
|
|
48
|
-
function logAccess(path: string, allowed: boolean, reason?: string) {
|
|
47
|
+
async function logAccess(path: string, allowed: boolean, reason?: string) {
|
|
49
48
|
const timestamp = new Date().toISOString();
|
|
50
49
|
const status = allowed ? "ALLOWED" : "BLOCKED";
|
|
51
50
|
const msg = reason ? ` (${reason})` : "";
|
|
52
51
|
const line = `[${timestamp}] ${status}: ${path}${msg}\n`;
|
|
53
52
|
|
|
54
53
|
try {
|
|
55
|
-
|
|
54
|
+
await withFileMutationQueue(LOG_FILE, async () => {
|
|
55
|
+
await appendFile(LOG_FILE, line);
|
|
56
|
+
});
|
|
56
57
|
} catch {
|
|
57
58
|
// Ignore logging errors
|
|
58
59
|
}
|
|
@@ -78,7 +79,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
78
79
|
|
|
79
80
|
// Check if path is blocked
|
|
80
81
|
if (isBlockedPath(absolutePath)) {
|
|
81
|
-
logAccess(absolutePath, false, "matches blocked pattern");
|
|
82
|
+
await logAccess(absolutePath, false, "matches blocked pattern");
|
|
82
83
|
return {
|
|
83
84
|
content: [
|
|
84
85
|
{
|
|
@@ -91,7 +92,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
// Log allowed access
|
|
94
|
-
logAccess(absolutePath, true);
|
|
95
|
+
await logAccess(absolutePath, true);
|
|
95
96
|
|
|
96
97
|
// Perform the actual read (simplified implementation)
|
|
97
98
|
try {
|
|
@@ -138,9 +138,4 @@ export default function toolsExtension(pi: ExtensionAPI) {
|
|
|
138
138
|
pi.on("session_tree", async (_event, ctx) => {
|
|
139
139
|
restoreFromBranch(ctx);
|
|
140
140
|
});
|
|
141
|
-
|
|
142
|
-
// Restore state after forking
|
|
143
|
-
pi.on("session_fork", async (_event, ctx) => {
|
|
144
|
-
restoreFromBranch(ctx);
|
|
145
|
-
});
|
|
146
141
|
}
|
|
@@ -3,6 +3,8 @@ import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-age
|
|
|
3
3
|
const COMPACT_THRESHOLD_TOKENS = 100_000;
|
|
4
4
|
|
|
5
5
|
export default function (pi: ExtensionAPI) {
|
|
6
|
+
let previousTokens: number | null | undefined;
|
|
7
|
+
|
|
6
8
|
const triggerCompaction = (ctx: ExtensionContext, customInstructions?: string) => {
|
|
7
9
|
if (ctx.hasUI) {
|
|
8
10
|
ctx.ui.notify("Compaction started", "info");
|
|
@@ -24,7 +26,15 @@ export default function (pi: ExtensionAPI) {
|
|
|
24
26
|
|
|
25
27
|
pi.on("turn_end", (_event, ctx) => {
|
|
26
28
|
const usage = ctx.getContextUsage();
|
|
27
|
-
|
|
29
|
+
const currentTokens = usage?.tokens ?? null;
|
|
30
|
+
if (currentTokens === null) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const crossedThreshold =
|
|
35
|
+
previousTokens !== undefined && previousTokens !== null && previousTokens <= COMPACT_THRESHOLD_TOKENS;
|
|
36
|
+
previousTokens = currentTokens;
|
|
37
|
+
if (!crossedThreshold || currentTokens <= COMPACT_THRESHOLD_TOKENS) {
|
|
28
38
|
return;
|
|
29
39
|
}
|
|
30
40
|
triggerCompaction(ctx);
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* built-in `grep` tool in src/core/tools/grep.ts for a more complete implementation.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { mkdtemp, writeFile } from "node:fs/promises";
|
|
17
18
|
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
18
19
|
import {
|
|
19
20
|
DEFAULT_MAX_BYTES,
|
|
@@ -21,11 +22,11 @@ import {
|
|
|
21
22
|
formatSize,
|
|
22
23
|
type TruncationResult,
|
|
23
24
|
truncateHead,
|
|
25
|
+
withFileMutationQueue,
|
|
24
26
|
} from "@mariozechner/pi-coding-agent";
|
|
25
27
|
import { Text } from "@mariozechner/pi-tui";
|
|
26
28
|
import { Type } from "@sinclair/typebox";
|
|
27
29
|
import { execSync } from "child_process";
|
|
28
|
-
import { mkdtempSync, writeFileSync } from "fs";
|
|
29
30
|
import { tmpdir } from "os";
|
|
30
31
|
import { join } from "path";
|
|
31
32
|
|
|
@@ -108,9 +109,11 @@ export default function (pi: ExtensionAPI) {
|
|
|
108
109
|
|
|
109
110
|
if (truncation.truncated) {
|
|
110
111
|
// Save full output to a temp file so LLM can access it if needed
|
|
111
|
-
const tempDir =
|
|
112
|
+
const tempDir = await mkdtemp(join(tmpdir(), "pi-rg-"));
|
|
112
113
|
const tempFile = join(tempDir, "output.txt");
|
|
113
|
-
|
|
114
|
+
await withFileMutationQueue(tempFile, async () => {
|
|
115
|
+
await writeFile(tempFile, output, "utf8");
|
|
116
|
+
});
|
|
114
117
|
|
|
115
118
|
details.truncation = truncation;
|
|
116
119
|
details.fullOutputPath = tempFile;
|
|
@@ -132,7 +135,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
132
135
|
},
|
|
133
136
|
|
|
134
137
|
// Custom rendering of the tool call (shown before/during execution)
|
|
135
|
-
renderCall(args, theme) {
|
|
138
|
+
renderCall(args, theme, _context) {
|
|
136
139
|
let text = theme.fg("toolTitle", theme.bold("rg "));
|
|
137
140
|
text += theme.fg("accent", `"${args.pattern}"`);
|
|
138
141
|
if (args.path) {
|
|
@@ -145,7 +148,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
145
148
|
},
|
|
146
149
|
|
|
147
150
|
// Custom rendering of the tool result
|
|
148
|
-
renderResult(result, { expanded, isPartial }, theme) {
|
|
151
|
+
renderResult(result, { expanded, isPartial }, theme, _context) {
|
|
149
152
|
const details = result.details as RgDetails | undefined;
|
|
150
153
|
|
|
151
154
|
// Handle streaming/partial results
|
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
import type { ExtensionAPI
|
|
2
|
-
|
|
3
|
-
const applyWidgets = (ctx: ExtensionContext) => {
|
|
4
|
-
if (!ctx.hasUI) return;
|
|
5
|
-
ctx.ui.setWidget("widget-above", ["Above editor widget"]);
|
|
6
|
-
ctx.ui.setWidget("widget-below", ["Below editor widget"], { placement: "belowEditor" });
|
|
7
|
-
};
|
|
1
|
+
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
8
2
|
|
|
9
3
|
export default function widgetPlacementExtension(pi: ExtensionAPI) {
|
|
10
4
|
pi.on("session_start", (_event, ctx) => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
pi.on("session_switch", (_event, ctx) => {
|
|
15
|
-
applyWidgets(ctx);
|
|
5
|
+
if (!ctx.hasUI) return;
|
|
6
|
+
ctx.ui.setWidget("widget-above", ["Above editor widget"]);
|
|
7
|
+
ctx.ui.setWidget("widget-below", ["Below editor widget"], { placement: "belowEditor" });
|
|
16
8
|
});
|
|
17
9
|
}
|
|
@@ -21,11 +21,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
21
21
|
execute: async (_toolCallId, params) => {
|
|
22
22
|
const result = ms(params.duration as ms.StringValue);
|
|
23
23
|
if (result === undefined) {
|
|
24
|
-
|
|
25
|
-
content: [{ type: "text", text: `Invalid duration: "${params.duration}"` }],
|
|
26
|
-
isError: true,
|
|
27
|
-
details: {},
|
|
28
|
-
};
|
|
24
|
+
throw new Error(`Invalid duration: "${params.duration}"`);
|
|
29
25
|
}
|
|
30
26
|
return {
|
|
31
27
|
content: [{ type: "text", text: `${params.duration} = ${result} milliseconds` }],
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-extension-with-deps",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.29.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "pi-extension-with-deps",
|
|
9
|
-
"version": "1.
|
|
9
|
+
"version": "1.29.1",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"ms": "^2.1.3"
|
|
12
12
|
},
|
|
@@ -8,8 +8,8 @@ import { getModel } from "@mariozechner/pi-ai";
|
|
|
8
8
|
import { AuthStorage, createAgentSession, ModelRegistry } from "@mariozechner/pi-coding-agent";
|
|
9
9
|
|
|
10
10
|
// Set up auth storage and model registry
|
|
11
|
-
const authStorage =
|
|
12
|
-
const modelRegistry =
|
|
11
|
+
const authStorage = AuthStorage.create();
|
|
12
|
+
const modelRegistry = ModelRegistry.create(authStorage);
|
|
13
13
|
|
|
14
14
|
// Option 1: Find a specific built-in model by provider/id
|
|
15
15
|
const opus = getModel("anthropic", "claude-opus-4-5");
|
|
@@ -5,7 +5,13 @@
|
|
|
5
5
|
* Discover, filter, merge, or replace them.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
createAgentSession,
|
|
10
|
+
createSyntheticSourceInfo,
|
|
11
|
+
DefaultResourceLoader,
|
|
12
|
+
SessionManager,
|
|
13
|
+
type Skill,
|
|
14
|
+
} from "@mariozechner/pi-coding-agent";
|
|
9
15
|
|
|
10
16
|
// Or define custom skills inline
|
|
11
17
|
const customSkill: Skill = {
|
|
@@ -13,7 +19,7 @@ const customSkill: Skill = {
|
|
|
13
19
|
description: "Custom project instructions",
|
|
14
20
|
filePath: "/virtual/SKILL.md",
|
|
15
21
|
baseDir: "/virtual",
|
|
16
|
-
source: "
|
|
22
|
+
sourceInfo: createSyntheticSourceInfo("/virtual/SKILL.md", { source: "sdk" }),
|
|
17
23
|
disableModelInvocation: false,
|
|
18
24
|
};
|
|
19
25
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
8
|
createAgentSession,
|
|
9
|
+
createSyntheticSourceInfo,
|
|
9
10
|
DefaultResourceLoader,
|
|
10
11
|
type PromptTemplate,
|
|
11
12
|
SessionManager,
|
|
@@ -15,8 +16,8 @@ import {
|
|
|
15
16
|
const deployTemplate: PromptTemplate = {
|
|
16
17
|
name: "deploy",
|
|
17
18
|
description: "Deploy the application",
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
filePath: "/virtual/prompts/deploy.md",
|
|
20
|
+
sourceInfo: createSyntheticSourceInfo("/virtual/prompts/deploy.md", { source: "sdk" }),
|
|
20
21
|
content: `# Deploy Instructions
|
|
21
22
|
|
|
22
23
|
1. Build: npm run build
|
|
@@ -32,7 +33,7 @@ const loader = new DefaultResourceLoader({
|
|
|
32
33
|
});
|
|
33
34
|
await loader.reload();
|
|
34
35
|
|
|
35
|
-
// Discover templates from cwd/.pi/
|
|
36
|
+
// Discover templates from cwd/.pi/prompts/ and ~/.pi/agent/prompts/
|
|
36
37
|
const discovered = loader.getPrompts().prompts;
|
|
37
38
|
console.log("Discovered prompt templates:");
|
|
38
39
|
for (const template of discovered) {
|
|
@@ -8,8 +8,8 @@ import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "
|
|
|
8
8
|
|
|
9
9
|
// Default: AuthStorage uses ~/.pi/agent/auth.json
|
|
10
10
|
// ModelRegistry loads built-in + custom models from ~/.pi/agent/models.json
|
|
11
|
-
const authStorage =
|
|
12
|
-
const modelRegistry =
|
|
11
|
+
const authStorage = AuthStorage.create();
|
|
12
|
+
const modelRegistry = ModelRegistry.create(authStorage);
|
|
13
13
|
|
|
14
14
|
await createAgentSession({
|
|
15
15
|
sessionManager: SessionManager.inMemory(),
|
|
@@ -19,8 +19,8 @@ await createAgentSession({
|
|
|
19
19
|
console.log("Session with default auth storage and model registry");
|
|
20
20
|
|
|
21
21
|
// Custom auth storage location
|
|
22
|
-
const customAuthStorage =
|
|
23
|
-
const customModelRegistry =
|
|
22
|
+
const customAuthStorage = AuthStorage.create("/tmp/my-app/auth.json");
|
|
23
|
+
const customModelRegistry = ModelRegistry.create(customAuthStorage, "/tmp/my-app/models.json");
|
|
24
24
|
|
|
25
25
|
await createAgentSession({
|
|
26
26
|
sessionManager: SessionManager.inMemory(),
|
|
@@ -39,7 +39,7 @@ await createAgentSession({
|
|
|
39
39
|
console.log("Session with runtime API key override");
|
|
40
40
|
|
|
41
41
|
// No models.json - only built-in models
|
|
42
|
-
const simpleRegistry =
|
|
42
|
+
const simpleRegistry = ModelRegistry.inMemory(authStorage);
|
|
43
43
|
await createAgentSession({
|
|
44
44
|
sessionManager: SessionManager.inMemory(),
|
|
45
45
|
authStorage,
|
|
@@ -24,6 +24,19 @@ await createAgentSession({
|
|
|
24
24
|
|
|
25
25
|
console.log("Session created with custom settings");
|
|
26
26
|
|
|
27
|
+
// Setters update memory immediately and queue persistence writes.
|
|
28
|
+
// Call flush() when you need a durability boundary.
|
|
29
|
+
settingsManager.setDefaultThinkingLevel("low");
|
|
30
|
+
await settingsManager.flush();
|
|
31
|
+
|
|
32
|
+
// Surface settings I/O errors at the app layer.
|
|
33
|
+
const settingsErrors = settingsManager.drainErrors();
|
|
34
|
+
if (settingsErrors.length > 0) {
|
|
35
|
+
for (const { scope, error } of settingsErrors) {
|
|
36
|
+
console.warn(`Warning (${scope} settings): ${error.message}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
27
40
|
// For testing without file I/O:
|
|
28
41
|
const inMemorySettings = SettingsManager.inMemory({
|
|
29
42
|
compaction: { enabled: false },
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
} from "@mariozechner/pi-coding-agent";
|
|
23
23
|
|
|
24
24
|
// Custom auth storage location
|
|
25
|
-
const authStorage =
|
|
25
|
+
const authStorage = AuthStorage.create("/tmp/my-agent/auth.json");
|
|
26
26
|
|
|
27
27
|
// Runtime API key override (not persisted)
|
|
28
28
|
if (process.env.MY_ANTHROPIC_KEY) {
|
|
@@ -30,7 +30,7 @@ if (process.env.MY_ANTHROPIC_KEY) {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
// Model registry with no custom models.json
|
|
33
|
-
const modelRegistry =
|
|
33
|
+
const modelRegistry = ModelRegistry.inMemory(authStorage);
|
|
34
34
|
|
|
35
35
|
const model = getModel("anthropic", "claude-sonnet-4-20250514");
|
|
36
36
|
if (!model) throw new Error("Model not found");
|
|
@@ -53,7 +53,6 @@ const resourceLoader: ResourceLoader = {
|
|
|
53
53
|
getSystemPrompt: () => `You are a minimal assistant.
|
|
54
54
|
Available: read, bash. Be concise.`,
|
|
55
55
|
getAppendSystemPrompt: () => [],
|
|
56
|
-
getPathMetadata: () => new Map(),
|
|
57
56
|
extendResources: () => {},
|
|
58
57
|
reload: async () => {},
|
|
59
58
|
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session runtime
|
|
3
|
+
*
|
|
4
|
+
* Use AgentSessionRuntime when you need to replace the active AgentSession,
|
|
5
|
+
* for example for new-session, resume, fork, or import flows.
|
|
6
|
+
*
|
|
7
|
+
* The important pattern is: after the runtime replaces the active session,
|
|
8
|
+
* rebind any session-local subscriptions and extension bindings to `runtime.session`.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
type CreateAgentSessionRuntimeFactory,
|
|
13
|
+
createAgentSessionFromServices,
|
|
14
|
+
createAgentSessionRuntime,
|
|
15
|
+
createAgentSessionServices,
|
|
16
|
+
getAgentDir,
|
|
17
|
+
SessionManager,
|
|
18
|
+
} from "@mariozechner/pi-coding-agent";
|
|
19
|
+
|
|
20
|
+
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
|
|
21
|
+
const services = await createAgentSessionServices({ cwd });
|
|
22
|
+
return {
|
|
23
|
+
...(await createAgentSessionFromServices({
|
|
24
|
+
services,
|
|
25
|
+
sessionManager,
|
|
26
|
+
sessionStartEvent,
|
|
27
|
+
})),
|
|
28
|
+
services,
|
|
29
|
+
diagnostics: services.diagnostics,
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
const runtime = await createAgentSessionRuntime(createRuntime, {
|
|
33
|
+
cwd: process.cwd(),
|
|
34
|
+
agentDir: getAgentDir(),
|
|
35
|
+
sessionManager: SessionManager.create(process.cwd()),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
let unsubscribe: (() => void) | undefined;
|
|
39
|
+
|
|
40
|
+
async function bindSession() {
|
|
41
|
+
unsubscribe?.();
|
|
42
|
+
const session = runtime.session;
|
|
43
|
+
await session.bindExtensions({});
|
|
44
|
+
unsubscribe = session.subscribe((event) => {
|
|
45
|
+
if (event.type === "queue_update") {
|
|
46
|
+
console.log("Queued:", event.steering.length + event.followUp.length);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return session;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let session = await bindSession();
|
|
53
|
+
const originalSessionFile = session.sessionFile;
|
|
54
|
+
console.log("Initial session:", originalSessionFile);
|
|
55
|
+
|
|
56
|
+
await runtime.newSession();
|
|
57
|
+
session = await bindSession();
|
|
58
|
+
console.log("After newSession():", session.sessionFile);
|
|
59
|
+
|
|
60
|
+
if (originalSessionFile) {
|
|
61
|
+
await runtime.switchSession(originalSessionFile);
|
|
62
|
+
session = await bindSession();
|
|
63
|
+
console.log("After switchSession():", session.sessionFile);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
unsubscribe?.();
|
|
67
|
+
await runtime.dispose();
|
package/examples/sdk/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# SDK Examples
|
|
2
2
|
|
|
3
|
-
Programmatic usage of pi-coding-agent via `createAgentSession()`.
|
|
3
|
+
Programmatic usage of pi-coding-agent via `createAgentSession()` and `createAgentSessionRuntime()`.
|
|
4
|
+
|
|
5
|
+
The runtime example shows how to build a recreate function that closes over process-global fixed inputs and recreates cwd-bound services and sessions as the active session cwd changes.
|
|
4
6
|
|
|
5
7
|
## Examples
|
|
6
8
|
|
|
@@ -18,6 +20,7 @@ Programmatic usage of pi-coding-agent via `createAgentSession()`.
|
|
|
18
20
|
| `10-settings.ts` | Override compaction, retry, terminal settings |
|
|
19
21
|
| `11-sessions.ts` | In-memory, persistent, continue, list sessions |
|
|
20
22
|
| `12-full-control.ts` | Replace everything, no discovery |
|
|
23
|
+
| `13-session-runtime.ts` | Manage runtime-backed session replacement |
|
|
21
24
|
|
|
22
25
|
## Running
|
|
23
26
|
|
|
@@ -43,8 +46,8 @@ import {
|
|
|
43
46
|
} from "@mariozechner/pi-coding-agent";
|
|
44
47
|
|
|
45
48
|
// Auth and models setup
|
|
46
|
-
const authStorage =
|
|
47
|
-
const modelRegistry =
|
|
49
|
+
const authStorage = AuthStorage.create();
|
|
50
|
+
const modelRegistry = ModelRegistry.create(authStorage);
|
|
48
51
|
|
|
49
52
|
// Minimal
|
|
50
53
|
const { session } = await createAgentSession({ authStorage, modelRegistry });
|
|
@@ -71,9 +74,9 @@ const { session } = await createAgentSession({
|
|
|
71
74
|
});
|
|
72
75
|
|
|
73
76
|
// Full control
|
|
74
|
-
const customAuth =
|
|
77
|
+
const customAuth = AuthStorage.create("/my/app/auth.json");
|
|
75
78
|
customAuth.setRuntimeApiKey("anthropic", process.env.MY_KEY!);
|
|
76
|
-
const customRegistry =
|
|
79
|
+
const customRegistry = ModelRegistry.create(customAuth);
|
|
77
80
|
|
|
78
81
|
const resourceLoader = new DefaultResourceLoader({
|
|
79
82
|
systemPromptOverride: () => "You are helpful.",
|
|
@@ -108,8 +111,8 @@ await session.prompt("Hello");
|
|
|
108
111
|
|
|
109
112
|
| Option | Default | Description |
|
|
110
113
|
|--------|---------|-------------|
|
|
111
|
-
| `authStorage` | `
|
|
112
|
-
| `modelRegistry` | `
|
|
114
|
+
| `authStorage` | `AuthStorage.create()` | Credential storage |
|
|
115
|
+
| `modelRegistry` | `ModelRegistry.create(authStorage)` | Model registry |
|
|
113
116
|
| `cwd` | `process.cwd()` | Working directory |
|
|
114
117
|
| `agentDir` | `~/.pi/agent` | Config directory |
|
|
115
118
|
| `model` | From settings/first available | Model to use |
|