@code-yeongyu/senpi 2026.6.14 → 2026.6.16
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 +92 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +5 -0
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.js +3 -1
- package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.js +2 -2
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +24 -12
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/goal/command.d.ts +14 -0
- package/dist/core/extensions/builtin/goal/command.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/command.js +16 -0
- package/dist/core/extensions/builtin/goal/command.js.map +1 -0
- package/dist/core/extensions/builtin/goal/continuation.d.ts +4 -0
- package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/continuation.js +7 -0
- package/dist/core/extensions/builtin/goal/continuation.js.map +1 -0
- package/dist/core/extensions/builtin/goal/errors.d.ts +13 -0
- package/dist/core/extensions/builtin/goal/errors.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/errors.js +25 -0
- package/dist/core/extensions/builtin/goal/errors.js.map +1 -0
- package/dist/core/extensions/builtin/goal/format.d.ts +8 -0
- package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/format.js +71 -0
- package/dist/core/extensions/builtin/goal/format.js.map +1 -0
- package/dist/core/extensions/builtin/goal/index.d.ts +3 -0
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/index.js +322 -0
- package/dist/core/extensions/builtin/goal/index.js.map +1 -0
- package/dist/core/extensions/builtin/goal/prompt.d.ts +3 -0
- package/dist/core/extensions/builtin/goal/prompt.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/prompt.js +34 -0
- package/dist/core/extensions/builtin/goal/prompt.js.map +1 -0
- package/dist/core/extensions/builtin/goal/store.d.ts +9 -0
- package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/store.js +173 -0
- package/dist/core/extensions/builtin/goal/store.js.map +1 -0
- package/dist/core/extensions/builtin/goal/types.d.ts +50 -0
- package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/types.js +6 -0
- package/dist/core/extensions/builtin/goal/types.js.map +1 -0
- package/dist/core/extensions/builtin/goal/ui.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/ui.js +20 -0
- package/dist/core/extensions/builtin/goal/ui.js.map +1 -0
- package/dist/core/extensions/builtin/goal/validation.d.ts +3 -0
- package/dist/core/extensions/builtin/goal/validation.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/validation.js +13 -0
- package/dist/core/extensions/builtin/goal/validation.js.map +1 -0
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +10 -2
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/core/containment.d.ts +10 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/containment.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/containment.js +23 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/containment.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/errors.d.ts +5 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/errors.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/errors.js +9 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/errors.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/find-agents-md-up.d.ts +7 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/find-agents-md-up.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/find-agents-md-up.js +44 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/find-agents-md-up.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/format.d.ts +7 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/format.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/format.js +7 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/format.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/inject-directory-context.d.ts +11 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/inject-directory-context.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/inject-directory-context.js +77 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/inject-directory-context.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.d.ts +11 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.js +33 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/injection-cache.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/session-key.d.ts +8 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/session-key.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/session-key.js +8 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/session-key.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/truncate.d.ts +8 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/truncate.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/truncate.js +26 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/truncate.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/types.d.ts +25 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/types.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/types.js +4 -0
- package/dist/core/extensions/builtin/nested-agents-md/core/types.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/index.d.ts +3 -0
- package/dist/core/extensions/builtin/nested-agents-md/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/index.js +102 -0
- package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/ui/reporter.d.ts +32 -0
- package/dist/core/extensions/builtin/nested-agents-md/ui/reporter.d.ts.map +1 -0
- package/dist/core/extensions/builtin/nested-agents-md/ui/reporter.js +66 -0
- package/dist/core/extensions/builtin/nested-agents-md/ui/reporter.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js +2 -2
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/rules/commands.d.ts +4 -0
- package/dist/core/extensions/builtin/rules/commands.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/commands.js +87 -0
- package/dist/core/extensions/builtin/rules/commands.js.map +1 -0
- package/dist/core/extensions/builtin/rules/index.d.ts +3 -0
- package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/index.js +127 -0
- package/dist/core/extensions/builtin/rules/index.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/cache.d.ts +10 -0
- package/dist/core/extensions/builtin/rules/rules/cache.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/cache.js +51 -0
- package/dist/core/extensions/builtin/rules/rules/cache.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/constants.d.ts +57 -0
- package/dist/core/extensions/builtin/rules/rules/constants.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/constants.js +96 -0
- package/dist/core/extensions/builtin/rules/rules/constants.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/engine.d.ts +67 -0
- package/dist/core/extensions/builtin/rules/rules/engine.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/engine.js +443 -0
- package/dist/core/extensions/builtin/rules/rules/engine.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/errors.d.ts +7 -0
- package/dist/core/extensions/builtin/rules/rules/errors.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/errors.js +13 -0
- package/dist/core/extensions/builtin/rules/rules/errors.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/finder.d.ts +27 -0
- package/dist/core/extensions/builtin/rules/rules/finder.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/finder.js +241 -0
- package/dist/core/extensions/builtin/rules/rules/finder.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/formatter.d.ts +8 -0
- package/dist/core/extensions/builtin/rules/rules/formatter.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/formatter.js +44 -0
- package/dist/core/extensions/builtin/rules/rules/formatter.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/matcher.d.ts +25 -0
- package/dist/core/extensions/builtin/rules/rules/matcher.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/matcher.js +107 -0
- package/dist/core/extensions/builtin/rules/rules/matcher.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/ordering.d.ts +4 -0
- package/dist/core/extensions/builtin/rules/rules/ordering.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/ordering.js +28 -0
- package/dist/core/extensions/builtin/rules/rules/ordering.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/parser.d.ts +4 -0
- package/dist/core/extensions/builtin/rules/rules/parser.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/parser.js +290 -0
- package/dist/core/extensions/builtin/rules/rules/parser.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/project-root.d.ts +2 -0
- package/dist/core/extensions/builtin/rules/rules/project-root.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/project-root.js +24 -0
- package/dist/core/extensions/builtin/rules/rules/project-root.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/scanner.d.ts +14 -0
- package/dist/core/extensions/builtin/rules/rules/scanner.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/scanner.js +96 -0
- package/dist/core/extensions/builtin/rules/rules/scanner.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/tool-paths.d.ts +4 -0
- package/dist/core/extensions/builtin/rules/rules/tool-paths.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/tool-paths.js +37 -0
- package/dist/core/extensions/builtin/rules/rules/tool-paths.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/truncator.d.ts +18 -0
- package/dist/core/extensions/builtin/rules/rules/truncator.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/truncator.js +46 -0
- package/dist/core/extensions/builtin/rules/rules/truncator.js.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/types.d.ts +124 -0
- package/dist/core/extensions/builtin/rules/rules/types.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/rules/types.js +9 -0
- package/dist/core/extensions/builtin/rules/rules/types.js.map +1 -0
- package/dist/core/extensions/builtin/rules/ui/dynamic-border.d.ts +8 -0
- package/dist/core/extensions/builtin/rules/ui/dynamic-border.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/ui/dynamic-border.js +10 -0
- package/dist/core/extensions/builtin/rules/ui/dynamic-border.js.map +1 -0
- package/dist/core/extensions/builtin/rules/ui/rules-banner.d.ts +22 -0
- package/dist/core/extensions/builtin/rules/ui/rules-banner.d.ts.map +1 -0
- package/dist/core/extensions/builtin/rules/ui/rules-banner.js +51 -0
- package/dist/core/extensions/builtin/rules/ui/rules-banner.js.map +1 -0
- package/dist/core/extensions/builtin/webfetch/index.d.ts +10 -0
- package/dist/core/extensions/builtin/webfetch/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/webfetch/index.js +53 -0
- package/dist/core/extensions/builtin/webfetch/index.js.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/content.d.ts +4 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/content.d.ts.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/content.js +60 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/content.js.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/errors.d.ts +13 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/errors.d.ts.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/errors.js +25 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/errors.js.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts +24 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js +148 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.d.ts +15 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.d.ts.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js +110 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +28 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +79 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -0
- package/dist/core/extensions/builtin/websearch/index.d.ts +3 -0
- package/dist/core/extensions/builtin/websearch/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/websearch/index.js +76 -0
- package/dist/core/extensions/builtin/websearch/index.js.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/config.d.ts +12 -0
- package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/config.js +245 -0
- package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/native.d.ts +19 -0
- package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/native.js +65 -0
- package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.d.ts +5 -0
- package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.d.ts.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js +58 -0
- package/dist/core/extensions/builtin/websearch/websearch/provider-endpoints.js.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers.d.ts +4 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers.d.ts.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers.js +464 -0
- package/dist/core/extensions/builtin/websearch/websearch/providers.js.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts +26 -0
- package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js +66 -0
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +9 -0
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/search.js +261 -0
- package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts +18 -0
- package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/tool.js +88 -0
- package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +115 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.js +2 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +8 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +4 -0
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/main.d.ts +5 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -4
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts +14 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js +65 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +0 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +0 -4
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +87 -12
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +6 -17
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/utils/child-process.d.ts +7 -4
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js +23 -5
- package/dist/utils/child-process.js.map +1 -1
- package/docs/containerization.md +36 -36
- package/docs/extensions.md +4 -4
- package/docs/index.md +1 -1
- package/docs/security.md +13 -13
- 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/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/question.ts +39 -18
- package/examples/extensions/questionnaire.ts +49 -28
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +5 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +140 -47
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +169 -122
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +4 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +18 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/google.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +20 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.js +41 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-choice-fallback.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js +14 -1
- package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.js +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/npm-shrinkwrap.json +45 -12
- package/package.json +8 -4
- package/dist/core/extensions/builtin/kimi-web-search/index.d.ts +0 -3
- package/dist/core/extensions/builtin/kimi-web-search/index.d.ts.map +0 -1
- package/dist/core/extensions/builtin/kimi-web-search/index.js +0 -208
- package/dist/core/extensions/builtin/kimi-web-search/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/truncate.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAwBjF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const REPLACEMENT_CHAR = "\uFFFD";
|
|
2
|
+
const TEXT_ENCODER = new TextEncoder();
|
|
3
|
+
export function truncateBytes(content, maxBytes) {
|
|
4
|
+
const bytes = TEXT_ENCODER.encode(content);
|
|
5
|
+
if (bytes.byteLength <= maxBytes) {
|
|
6
|
+
return {
|
|
7
|
+
result: content,
|
|
8
|
+
truncated: false,
|
|
9
|
+
originalBytes: bytes.byteLength,
|
|
10
|
+
resultBytes: bytes.byteLength,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const decoder = new TextDecoder("utf-8", { fatal: false });
|
|
14
|
+
let decoded = decoder.decode(bytes.subarray(0, maxBytes));
|
|
15
|
+
while (decoded.endsWith(REPLACEMENT_CHAR)) {
|
|
16
|
+
decoded = decoded.slice(0, -1);
|
|
17
|
+
}
|
|
18
|
+
const finalBytes = TEXT_ENCODER.encode(decoded).byteLength;
|
|
19
|
+
return {
|
|
20
|
+
result: decoded,
|
|
21
|
+
truncated: true,
|
|
22
|
+
originalBytes: bytes.byteLength,
|
|
23
|
+
resultBytes: finalBytes,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=truncate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/truncate.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAClC,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC;AASvC,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,QAAgB;IAC9D,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;QAClC,OAAO;YACN,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,KAAK,CAAC,UAAU;YAC/B,WAAW,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC3C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IAC3D,OAAO;QACN,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,KAAK,CAAC,UAAU;QAC/B,WAAW,EAAE,UAAU;KACvB,CAAC;AACH,CAAC","sourcesContent":["const REPLACEMENT_CHAR = \"\\uFFFD\";\nconst TEXT_ENCODER = new TextEncoder();\n\nexport interface TruncationResult {\n\tresult: string;\n\ttruncated: boolean;\n\toriginalBytes: number;\n\tresultBytes: number;\n}\n\nexport function truncateBytes(content: string, maxBytes: number): TruncationResult {\n\tconst bytes = TEXT_ENCODER.encode(content);\n\tif (bytes.byteLength <= maxBytes) {\n\t\treturn {\n\t\t\tresult: content,\n\t\t\ttruncated: false,\n\t\t\toriginalBytes: bytes.byteLength,\n\t\t\tresultBytes: bytes.byteLength,\n\t\t};\n\t}\n\n\tconst decoder = new TextDecoder(\"utf-8\", { fatal: false });\n\tlet decoded = decoder.decode(bytes.subarray(0, maxBytes));\n\twhile (decoded.endsWith(REPLACEMENT_CHAR)) {\n\t\tdecoded = decoded.slice(0, -1);\n\t}\n\n\tconst finalBytes = TEXT_ENCODER.encode(decoded).byteLength;\n\treturn {\n\t\tresult: decoded,\n\t\ttruncated: true,\n\t\toriginalBytes: bytes.byteLength,\n\t\tresultBytes: finalBytes,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const DEFAULT_FILE_NAMES: readonly ["AGENTS.md"];
|
|
2
|
+
export declare const DEFAULT_MAX_BYTES_PER_FILE: number;
|
|
3
|
+
export declare const DEFAULT_MAX_BYTES_PER_READ: number;
|
|
4
|
+
export interface InjectedFileInfo {
|
|
5
|
+
absolutePath: string;
|
|
6
|
+
directory: string;
|
|
7
|
+
truncated: boolean;
|
|
8
|
+
originalBytes: number;
|
|
9
|
+
injectedBytes: number;
|
|
10
|
+
}
|
|
11
|
+
export interface InjectionFileError {
|
|
12
|
+
path: string;
|
|
13
|
+
error: Error;
|
|
14
|
+
}
|
|
15
|
+
export interface InjectionResult {
|
|
16
|
+
injectedText: string;
|
|
17
|
+
injectedFiles: InjectedFileInfo[];
|
|
18
|
+
errors: InjectionFileError[];
|
|
19
|
+
}
|
|
20
|
+
export interface InjectionConfig {
|
|
21
|
+
fileNames: readonly string[];
|
|
22
|
+
maxBytesPerFile: number;
|
|
23
|
+
maxBytesPerRead: number;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,YAAI,WAAW,CAAU,CAAC;AACzD,eAAO,MAAM,0BAA0B,QAAY,CAAC;AACpD,eAAO,MAAM,0BAA0B,QAAa,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAAW,CAAU,CAAC;AACzD,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,CAAC;AACpD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,GAAG,IAAI,CAAC","sourcesContent":["export const DEFAULT_FILE_NAMES = [\"AGENTS.md\"] as const;\nexport const DEFAULT_MAX_BYTES_PER_FILE = 32 * 1024;\nexport const DEFAULT_MAX_BYTES_PER_READ = 128 * 1024;\n\nexport interface InjectedFileInfo {\n\tabsolutePath: string;\n\tdirectory: string;\n\ttruncated: boolean;\n\toriginalBytes: number;\n\tinjectedBytes: number;\n}\n\nexport interface InjectionFileError {\n\tpath: string;\n\terror: Error;\n}\n\nexport interface InjectionResult {\n\tinjectedText: string;\n\tinjectedFiles: InjectedFileInfo[];\n\terrors: InjectionFileError[];\n}\n\nexport interface InjectionConfig {\n\tfileNames: readonly string[];\n\tmaxBytesPerFile: number;\n\tmaxBytesPerRead: number;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/nested-agents-md/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAkBnD,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAoG7D"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { isReadToolResult } from "../../types.js";
|
|
2
|
+
import { injectDirectoryContext } from "./core/inject-directory-context.js";
|
|
3
|
+
import { InjectionCache } from "./core/injection-cache.js";
|
|
4
|
+
import { getSessionKey } from "./core/session-key.js";
|
|
5
|
+
import { buildDebugRecord, clearStatus, clearWidget, updateStatus, updateWidget, } from "./ui/reporter.js";
|
|
6
|
+
const FLAG_DISABLE = "no-nested-agents";
|
|
7
|
+
const COMMAND_TOGGLE = "nested-agents";
|
|
8
|
+
const ENTRY_TYPE_DEBUG = "nested-agents-md:debug";
|
|
9
|
+
export default function nestedAgentsMd(pi) {
|
|
10
|
+
pi.registerFlag(FLAG_DISABLE, {
|
|
11
|
+
description: "Disable nested AGENTS.md context injection.",
|
|
12
|
+
type: "boolean",
|
|
13
|
+
default: false,
|
|
14
|
+
});
|
|
15
|
+
const cache = new InjectionCache();
|
|
16
|
+
const filesPerSession = new Map();
|
|
17
|
+
const errorsPerSession = new Map();
|
|
18
|
+
// Widget visibility is extension-scoped because command registration currently has no session-local state hook.
|
|
19
|
+
let widgetVisible = false;
|
|
20
|
+
let disabled = false;
|
|
21
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
22
|
+
disabled = pi.getFlag(FLAG_DISABLE) === true;
|
|
23
|
+
if (disabled) {
|
|
24
|
+
clearStatus(ctx);
|
|
25
|
+
clearWidget(ctx);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
pi.on("tool_result", async (event, ctx) => {
|
|
29
|
+
if (disabled)
|
|
30
|
+
return undefined;
|
|
31
|
+
if (!isReadToolResult(event) || event.isError)
|
|
32
|
+
return undefined;
|
|
33
|
+
const filePath = event.input["path"];
|
|
34
|
+
if (typeof filePath !== "string" || filePath.length === 0)
|
|
35
|
+
return undefined;
|
|
36
|
+
const hasText = event.content.some((block) => block.type === "text");
|
|
37
|
+
if (!hasText)
|
|
38
|
+
return undefined;
|
|
39
|
+
const sessionKey = getSessionKey(ctx);
|
|
40
|
+
const result = await injectDirectoryContext({
|
|
41
|
+
filePath,
|
|
42
|
+
rootDir: ctx.cwd,
|
|
43
|
+
cache,
|
|
44
|
+
sessionKey,
|
|
45
|
+
});
|
|
46
|
+
const errorsRecorded = errorsPerSession.get(sessionKey) === true;
|
|
47
|
+
const hasErrors = errorsRecorded || result.errors.length > 0;
|
|
48
|
+
if (result.errors.length > 0)
|
|
49
|
+
errorsPerSession.set(sessionKey, true);
|
|
50
|
+
if (!result.injectedText) {
|
|
51
|
+
updateStatus(ctx, cache, sessionKey, hasErrors);
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
let metaMap = filesPerSession.get(sessionKey);
|
|
55
|
+
if (!metaMap) {
|
|
56
|
+
metaMap = new Map();
|
|
57
|
+
filesPerSession.set(sessionKey, metaMap);
|
|
58
|
+
}
|
|
59
|
+
for (const file of result.injectedFiles) {
|
|
60
|
+
metaMap.set(file.absolutePath, {
|
|
61
|
+
absolutePath: file.absolutePath,
|
|
62
|
+
truncated: file.truncated,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
updateStatus(ctx, cache, sessionKey, hasErrors);
|
|
66
|
+
if (widgetVisible)
|
|
67
|
+
updateWidget(ctx, true, [...metaMap.values()]);
|
|
68
|
+
const textBlock = { type: "text", text: result.injectedText };
|
|
69
|
+
return { content: [...event.content, textBlock] };
|
|
70
|
+
});
|
|
71
|
+
pi.on("session_compact", async (_event, ctx) => {
|
|
72
|
+
const sessionKey = getSessionKey(ctx);
|
|
73
|
+
cache.clearSession(sessionKey);
|
|
74
|
+
filesPerSession.delete(sessionKey);
|
|
75
|
+
errorsPerSession.delete(sessionKey);
|
|
76
|
+
updateStatus(ctx, cache, sessionKey, false);
|
|
77
|
+
if (widgetVisible)
|
|
78
|
+
updateWidget(ctx, true, []);
|
|
79
|
+
});
|
|
80
|
+
pi.on("session_shutdown", async (_event, ctx) => {
|
|
81
|
+
const sessionKey = getSessionKey(ctx);
|
|
82
|
+
cache.clearSession(sessionKey);
|
|
83
|
+
filesPerSession.delete(sessionKey);
|
|
84
|
+
errorsPerSession.delete(sessionKey);
|
|
85
|
+
});
|
|
86
|
+
pi.registerCommand(COMMAND_TOGGLE, {
|
|
87
|
+
description: "Toggle the nested AGENTS.md context widget and dump cache state.",
|
|
88
|
+
handler: async (_args, ctx) => {
|
|
89
|
+
if (disabled) {
|
|
90
|
+
ctx.ui.notify("nested-agents-md is disabled via --no-nested-agents", "info");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
widgetVisible = !widgetVisible;
|
|
94
|
+
const sessionKey = getSessionKey(ctx);
|
|
95
|
+
const files = [...(filesPerSession.get(sessionKey)?.values() ?? [])];
|
|
96
|
+
updateWidget(ctx, widgetVisible, files);
|
|
97
|
+
pi.appendEntry(ENTRY_TYPE_DEBUG, buildDebugRecord({ cache, sessionKey, files }));
|
|
98
|
+
ctx.ui.notify(widgetVisible ? "Nested AGENTS.md context widget shown" : "Nested AGENTS.md context widget hidden", "info");
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/nested-agents-md/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TextContent } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.ts\";\nimport { isReadToolResult } from \"../../types.ts\";\nimport { injectDirectoryContext } from \"./core/inject-directory-context.ts\";\nimport { InjectionCache } from \"./core/injection-cache.ts\";\nimport { getSessionKey } from \"./core/session-key.ts\";\nimport {\n\tbuildDebugRecord,\n\tclearStatus,\n\tclearWidget,\n\ttype InjectedFileMeta,\n\tupdateStatus,\n\tupdateWidget,\n} from \"./ui/reporter.ts\";\n\nconst FLAG_DISABLE = \"no-nested-agents\";\nconst COMMAND_TOGGLE = \"nested-agents\";\nconst ENTRY_TYPE_DEBUG = \"nested-agents-md:debug\";\n\nexport default function nestedAgentsMd(pi: ExtensionAPI): void {\n\tpi.registerFlag(FLAG_DISABLE, {\n\t\tdescription: \"Disable nested AGENTS.md context injection.\",\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t});\n\n\tconst cache = new InjectionCache();\n\tconst filesPerSession = new Map<string, Map<string, InjectedFileMeta>>();\n\tconst errorsPerSession = new Map<string, boolean>();\n\t// Widget visibility is extension-scoped because command registration currently has no session-local state hook.\n\tlet widgetVisible = false;\n\tlet disabled = false;\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tdisabled = pi.getFlag(FLAG_DISABLE) === true;\n\t\tif (disabled) {\n\t\t\tclearStatus(ctx);\n\t\t\tclearWidget(ctx);\n\t\t}\n\t});\n\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tif (disabled) return undefined;\n\t\tif (!isReadToolResult(event) || event.isError) return undefined;\n\t\tconst filePath = event.input[\"path\"];\n\t\tif (typeof filePath !== \"string\" || filePath.length === 0) return undefined;\n\t\tconst hasText = event.content.some((block) => block.type === \"text\");\n\t\tif (!hasText) return undefined;\n\n\t\tconst sessionKey = getSessionKey(ctx);\n\t\tconst result = await injectDirectoryContext({\n\t\t\tfilePath,\n\t\t\trootDir: ctx.cwd,\n\t\t\tcache,\n\t\t\tsessionKey,\n\t\t});\n\n\t\tconst errorsRecorded = errorsPerSession.get(sessionKey) === true;\n\t\tconst hasErrors = errorsRecorded || result.errors.length > 0;\n\t\tif (result.errors.length > 0) errorsPerSession.set(sessionKey, true);\n\n\t\tif (!result.injectedText) {\n\t\t\tupdateStatus(ctx, cache, sessionKey, hasErrors);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet metaMap = filesPerSession.get(sessionKey);\n\t\tif (!metaMap) {\n\t\t\tmetaMap = new Map();\n\t\t\tfilesPerSession.set(sessionKey, metaMap);\n\t\t}\n\t\tfor (const file of result.injectedFiles) {\n\t\t\tmetaMap.set(file.absolutePath, {\n\t\t\t\tabsolutePath: file.absolutePath,\n\t\t\t\ttruncated: file.truncated,\n\t\t\t});\n\t\t}\n\n\t\tupdateStatus(ctx, cache, sessionKey, hasErrors);\n\t\tif (widgetVisible) updateWidget(ctx, true, [...metaMap.values()]);\n\n\t\tconst textBlock: TextContent = { type: \"text\", text: result.injectedText };\n\t\treturn { content: [...event.content, textBlock] };\n\t});\n\n\tpi.on(\"session_compact\", async (_event, ctx) => {\n\t\tconst sessionKey = getSessionKey(ctx);\n\t\tcache.clearSession(sessionKey);\n\t\tfilesPerSession.delete(sessionKey);\n\t\terrorsPerSession.delete(sessionKey);\n\t\tupdateStatus(ctx, cache, sessionKey, false);\n\t\tif (widgetVisible) updateWidget(ctx, true, []);\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tconst sessionKey = getSessionKey(ctx);\n\t\tcache.clearSession(sessionKey);\n\t\tfilesPerSession.delete(sessionKey);\n\t\terrorsPerSession.delete(sessionKey);\n\t});\n\n\tpi.registerCommand(COMMAND_TOGGLE, {\n\t\tdescription: \"Toggle the nested AGENTS.md context widget and dump cache state.\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (disabled) {\n\t\t\t\tctx.ui.notify(\"nested-agents-md is disabled via --no-nested-agents\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twidgetVisible = !widgetVisible;\n\t\t\tconst sessionKey = getSessionKey(ctx);\n\t\t\tconst files = [...(filesPerSession.get(sessionKey)?.values() ?? [])];\n\t\t\tupdateWidget(ctx, widgetVisible, files);\n\t\t\tpi.appendEntry(ENTRY_TYPE_DEBUG, buildDebugRecord({ cache, sessionKey, files }));\n\t\t\tctx.ui.notify(\n\t\t\t\twidgetVisible ? \"Nested AGENTS.md context widget shown\" : \"Nested AGENTS.md context widget hidden\",\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t},\n\t});\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { InjectionCache } from "../core/injection-cache.ts";
|
|
2
|
+
export declare const STATUS_KEY = "ext:nested-agents:status";
|
|
3
|
+
export declare const WIDGET_KEY = "ext:nested-agents:widget";
|
|
4
|
+
export interface ThemeFn {
|
|
5
|
+
fg(color: string, text: string): string;
|
|
6
|
+
}
|
|
7
|
+
export interface UiSurface {
|
|
8
|
+
hasUI: boolean;
|
|
9
|
+
cwd: string;
|
|
10
|
+
ui?: {
|
|
11
|
+
theme?: ThemeFn;
|
|
12
|
+
setStatus?(key: string, text: string | undefined): void;
|
|
13
|
+
setWidget?(key: string, lines: string[] | undefined, options?: {
|
|
14
|
+
placement?: "aboveEditor" | "belowEditor";
|
|
15
|
+
}): void;
|
|
16
|
+
notify?(message: string, level?: "info" | "warn" | "warning" | "error"): void;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface InjectedFileMeta {
|
|
20
|
+
absolutePath: string;
|
|
21
|
+
truncated: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function updateStatus(ctx: UiSurface, cache: InjectionCache, sessionKey: string, hasErrors: boolean): void;
|
|
24
|
+
export declare function clearStatus(ctx: UiSurface): void;
|
|
25
|
+
export declare function updateWidget(ctx: UiSurface, visible: boolean, files: InjectedFileMeta[]): void;
|
|
26
|
+
export declare function clearWidget(ctx: UiSurface): void;
|
|
27
|
+
export declare function buildDebugRecord(input: {
|
|
28
|
+
cache: InjectionCache;
|
|
29
|
+
sessionKey: string;
|
|
30
|
+
files: InjectedFileMeta[];
|
|
31
|
+
}): Record<string, unknown>;
|
|
32
|
+
//# sourceMappingURL=reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/ui/reporter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,eAAO,MAAM,UAAU,6BAA6B,CAAC;AACrD,eAAO,MAAM,UAAU,6BAA6B,CAAC;AAErD,MAAM,WAAW,OAAO;IACvB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE;QACJ,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,SAAS,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;QACxD,SAAS,CAAC,CACT,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAC3B,OAAO,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,CAAA;SAAE,GACrD,IAAI,CAAC;QACR,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;KAC9E,CAAC;CACF;AAED,MAAM,WAAW,gBAAgB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAWhH;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAGhD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAc9F;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAGhD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACvC,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC1B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAU1B"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { isAbsolute, relative } from "node:path";
|
|
2
|
+
export const STATUS_KEY = "ext:nested-agents:status";
|
|
3
|
+
export const WIDGET_KEY = "ext:nested-agents:widget";
|
|
4
|
+
export function updateStatus(ctx, cache, sessionKey, hasErrors) {
|
|
5
|
+
if (!ctx.hasUI || !ctx.ui?.setStatus)
|
|
6
|
+
return;
|
|
7
|
+
const count = cache.getCacheSize(sessionKey);
|
|
8
|
+
if (count === 0) {
|
|
9
|
+
ctx.ui.setStatus(STATUS_KEY, undefined);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const theme = ctx.ui.theme ?? identityTheme;
|
|
13
|
+
let text = theme.fg("dim", `🤖 ${count}`);
|
|
14
|
+
if (hasErrors)
|
|
15
|
+
text += theme.fg("warning", " ⚠️");
|
|
16
|
+
ctx.ui.setStatus(STATUS_KEY, text);
|
|
17
|
+
}
|
|
18
|
+
export function clearStatus(ctx) {
|
|
19
|
+
if (!ctx.hasUI || !ctx.ui?.setStatus)
|
|
20
|
+
return;
|
|
21
|
+
ctx.ui.setStatus(STATUS_KEY, undefined);
|
|
22
|
+
}
|
|
23
|
+
export function updateWidget(ctx, visible, files) {
|
|
24
|
+
if (!ctx.hasUI || !ctx.ui?.setWidget)
|
|
25
|
+
return;
|
|
26
|
+
if (!visible || files.length === 0) {
|
|
27
|
+
ctx.ui.setWidget(WIDGET_KEY, undefined);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const theme = ctx.ui.theme ?? identityTheme;
|
|
31
|
+
const lines = [theme.fg("accent", "Nested Context:")];
|
|
32
|
+
for (const file of files) {
|
|
33
|
+
const display = displayPath(ctx.cwd, file.absolutePath);
|
|
34
|
+
const text = file.truncated ? ` ${display} (truncated)` : ` ${display}`;
|
|
35
|
+
lines.push(theme.fg(file.truncated ? "warning" : "dim", text));
|
|
36
|
+
}
|
|
37
|
+
ctx.ui.setWidget(WIDGET_KEY, lines, { placement: "aboveEditor" });
|
|
38
|
+
}
|
|
39
|
+
export function clearWidget(ctx) {
|
|
40
|
+
if (!ctx.hasUI || !ctx.ui?.setWidget)
|
|
41
|
+
return;
|
|
42
|
+
ctx.ui.setWidget(WIDGET_KEY, undefined);
|
|
43
|
+
}
|
|
44
|
+
export function buildDebugRecord(input) {
|
|
45
|
+
return {
|
|
46
|
+
sessionKey: input.sessionKey,
|
|
47
|
+
cacheSize: input.cache.getCacheSize(input.sessionKey),
|
|
48
|
+
injectedDirectories: input.cache.listInjected(input.sessionKey),
|
|
49
|
+
injectedFiles: input.files.map((f) => ({
|
|
50
|
+
path: f.absolutePath,
|
|
51
|
+
truncated: f.truncated,
|
|
52
|
+
})),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function displayPath(cwd, absolutePath) {
|
|
56
|
+
if (!isAbsolute(absolutePath))
|
|
57
|
+
return absolutePath;
|
|
58
|
+
const rel = relative(cwd, absolutePath);
|
|
59
|
+
if (rel === "" || rel === ".." || rel.startsWith("../") || isAbsolute(rel))
|
|
60
|
+
return absolutePath;
|
|
61
|
+
return rel;
|
|
62
|
+
}
|
|
63
|
+
const identityTheme = {
|
|
64
|
+
fg: (_color, text) => text,
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/nested-agents-md/ui/reporter.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute, relative } from \"node:path\";\nimport type { InjectionCache } from \"../core/injection-cache.ts\";\n\nexport const STATUS_KEY = \"ext:nested-agents:status\";\nexport const WIDGET_KEY = \"ext:nested-agents:widget\";\n\nexport interface ThemeFn {\n\tfg(color: string, text: string): string;\n}\n\nexport interface UiSurface {\n\thasUI: boolean;\n\tcwd: string;\n\tui?: {\n\t\ttheme?: ThemeFn;\n\t\tsetStatus?(key: string, text: string | undefined): void;\n\t\tsetWidget?(\n\t\t\tkey: string,\n\t\t\tlines: string[] | undefined,\n\t\t\toptions?: { placement?: \"aboveEditor\" | \"belowEditor\" },\n\t\t): void;\n\t\tnotify?(message: string, level?: \"info\" | \"warn\" | \"warning\" | \"error\"): void;\n\t};\n}\n\nexport interface InjectedFileMeta {\n\tabsolutePath: string;\n\ttruncated: boolean;\n}\n\nexport function updateStatus(ctx: UiSurface, cache: InjectionCache, sessionKey: string, hasErrors: boolean): void {\n\tif (!ctx.hasUI || !ctx.ui?.setStatus) return;\n\tconst count = cache.getCacheSize(sessionKey);\n\tif (count === 0) {\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\treturn;\n\t}\n\tconst theme = ctx.ui.theme ?? identityTheme;\n\tlet text = theme.fg(\"dim\", `🤖 ${count}`);\n\tif (hasErrors) text += theme.fg(\"warning\", \" ⚠️\");\n\tctx.ui.setStatus(STATUS_KEY, text);\n}\n\nexport function clearStatus(ctx: UiSurface): void {\n\tif (!ctx.hasUI || !ctx.ui?.setStatus) return;\n\tctx.ui.setStatus(STATUS_KEY, undefined);\n}\n\nexport function updateWidget(ctx: UiSurface, visible: boolean, files: InjectedFileMeta[]): void {\n\tif (!ctx.hasUI || !ctx.ui?.setWidget) return;\n\tif (!visible || files.length === 0) {\n\t\tctx.ui.setWidget(WIDGET_KEY, undefined);\n\t\treturn;\n\t}\n\tconst theme = ctx.ui.theme ?? identityTheme;\n\tconst lines = [theme.fg(\"accent\", \"Nested Context:\")];\n\tfor (const file of files) {\n\t\tconst display = displayPath(ctx.cwd, file.absolutePath);\n\t\tconst text = file.truncated ? ` ${display} (truncated)` : ` ${display}`;\n\t\tlines.push(theme.fg(file.truncated ? \"warning\" : \"dim\", text));\n\t}\n\tctx.ui.setWidget(WIDGET_KEY, lines, { placement: \"aboveEditor\" });\n}\n\nexport function clearWidget(ctx: UiSurface): void {\n\tif (!ctx.hasUI || !ctx.ui?.setWidget) return;\n\tctx.ui.setWidget(WIDGET_KEY, undefined);\n}\n\nexport function buildDebugRecord(input: {\n\tcache: InjectionCache;\n\tsessionKey: string;\n\tfiles: InjectedFileMeta[];\n}): Record<string, unknown> {\n\treturn {\n\t\tsessionKey: input.sessionKey,\n\t\tcacheSize: input.cache.getCacheSize(input.sessionKey),\n\t\tinjectedDirectories: input.cache.listInjected(input.sessionKey),\n\t\tinjectedFiles: input.files.map((f) => ({\n\t\t\tpath: f.absolutePath,\n\t\t\ttruncated: f.truncated,\n\t\t})),\n\t};\n}\n\nfunction displayPath(cwd: string, absolutePath: string): string {\n\tif (!isAbsolute(absolutePath)) return absolutePath;\n\tconst rel = relative(cwd, absolutePath);\n\tif (rel === \"\" || rel === \"..\" || rel.startsWith(\"../\") || isAbsolute(rel)) return absolutePath;\n\treturn rel;\n}\n\nconst identityTheme: ThemeFn = {\n\tfg: (_color: string, text: string) => text,\n};\n"]}
|
|
@@ -29,13 +29,13 @@ function extractGpt5Version(modelId) {
|
|
|
29
29
|
return undefined;
|
|
30
30
|
}
|
|
31
31
|
function hasKimiK26Signal(value) {
|
|
32
|
-
return /(?:^|[/@._-])kimi-k2(?:[._-]|p)6(?:$|[/@._
|
|
32
|
+
return /(?:^|[/@._-])kimi-k2(?:[._-]|p)6(?:$|[/@._:-])/.test(normalizeModelId(value));
|
|
33
33
|
}
|
|
34
34
|
function isKimiK26Model(model) {
|
|
35
35
|
return hasKimiK26Signal(model.id) || (model.name !== undefined && hasKimiK26Signal(model.name));
|
|
36
36
|
}
|
|
37
37
|
function hasKimiK27Signal(value) {
|
|
38
|
-
return /(?:^|[/@._-])kimi-k2(?:[._-]|p)7(?:$|[/@._
|
|
38
|
+
return /(?:^|[/@._-])kimi-k2(?:[._-]|p)7(?:$|[/@._:-])/.test(normalizeModelId(value));
|
|
39
39
|
}
|
|
40
40
|
function isKimiK27Model(model) {
|
|
41
41
|
return hasKimiK27Signal(model.id) || (model.name !== undefined && hasKimiK27Signal(model.name));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/prompt-preset/presets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAoD,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAepG,SAAS,gBAAgB,CAAC,OAAe;IACxC,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAID,SAAS,kBAAkB,CAAC,OAAe;IAC1C,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,eAAe,CAAC;IACxB,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACtC,OAAO
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/prompt-preset/presets.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { BuildDynamicSystemPromptOptions } from \"../../../dynamic-prompt/build.ts\";\nimport { buildClaudeOpus45Prompt } from \"./claude-opus-4-5.ts\";\nimport { buildClaudeOpus46Prompt } from \"./claude-opus-4-6.ts\";\nimport { buildClaudeOpus47Prompt } from \"./claude-opus-4-7.ts\";\nimport { buildGpt52Prompt } from \"./gpt-5.2.ts\";\nimport { buildGpt53CodexPrompt } from \"./gpt-5.3-codex.ts\";\nimport { buildGpt54Prompt } from \"./gpt-5.4.ts\";\nimport { buildGpt55Prompt } from \"./gpt-5.5.ts\";\nimport { buildGpt5Prompt } from \"./gpt-5.ts\";\nimport { buildKimiK26Prompt } from \"./kimi-k2-6.ts\";\nimport { buildKimiK27Prompt } from \"./kimi-k2-7.ts\";\nimport { type PromptPresetName, type PromptPresetSettings, parsePromptPreset } from \"./settings.ts\";\n\nexport type { PromptPresetSettings } from \"./settings.ts\";\n\ntype ResolvedPresetName = Exclude<PromptPresetName, \"auto\">;\ntype ModelWithPromptPresetMetadata = Pick<Model<Api>, \"id\" | \"provider\"> & {\n\tname?: string;\n\tpromptPreset?: string;\n};\n\nexport interface ResolvedPromptPreset {\n\tname: ResolvedPresetName;\n\tprompt: string;\n}\n\nfunction normalizeModelId(modelId: string): string {\n\treturn modelId.toLowerCase().replace(/\\s+/g, \"-\");\n}\n\ntype Gpt5Version = \"gpt-5.2\" | \"gpt-5.3-codex\" | \"gpt-5.4\" | \"gpt-5.5\";\n\nfunction extractGpt5Version(modelId: string): Gpt5Version | undefined {\n\tconst normalized = normalizeModelId(modelId);\n\tif (normalized.includes(\"gpt-5.5\")) {\n\t\treturn \"gpt-5.5\";\n\t}\n\tif (normalized.includes(\"gpt-5.4\")) {\n\t\treturn \"gpt-5.4\";\n\t}\n\tif (normalized.includes(\"gpt-5.3\")) {\n\t\treturn \"gpt-5.3-codex\";\n\t}\n\tif (normalized.includes(\"gpt-5.2\")) {\n\t\treturn \"gpt-5.2\";\n\t}\n\treturn undefined;\n}\n\nfunction hasKimiK26Signal(value: string): boolean {\n\treturn /(?:^|[/@._-])kimi-k2(?:[._-]|p)6(?:$|[/@._:-])/.test(normalizeModelId(value));\n}\n\nfunction isKimiK26Model(model: ModelWithPromptPresetMetadata): boolean {\n\treturn hasKimiK26Signal(model.id) || (model.name !== undefined && hasKimiK26Signal(model.name));\n}\n\nfunction hasKimiK27Signal(value: string): boolean {\n\treturn /(?:^|[/@._-])kimi-k2(?:[._-]|p)7(?:$|[/@._:-])/.test(normalizeModelId(value));\n}\n\nfunction isKimiK27Model(model: ModelWithPromptPresetMetadata): boolean {\n\treturn hasKimiK27Signal(model.id) || (model.name !== undefined && hasKimiK27Signal(model.name));\n}\n\ntype ClaudeOpusVersion = \"claude-opus-4-7\" | \"claude-opus-4-6\" | \"claude-opus-4-5\";\n\nfunction extractClaudeOpusVersion(modelId: string): ClaudeOpusVersion | undefined {\n\tconst normalized = normalizeModelId(modelId);\n\tif (normalized.includes(\"opus-4-7\")) {\n\t\treturn \"claude-opus-4-7\";\n\t}\n\tif (normalized.includes(\"opus-4-6\")) {\n\t\treturn \"claude-opus-4-6\";\n\t}\n\tif (normalized.includes(\"opus-4-5\") || normalized.includes(\"opus-4.5\")) {\n\t\treturn \"claude-opus-4-5\";\n\t}\n\treturn undefined;\n}\n\nexport function resolvePresetName(\n\tmodel: ModelWithPromptPresetMetadata,\n\tsettings: PromptPresetSettings,\n): ResolvedPresetName | undefined {\n\tif (settings.promptPreset !== \"auto\") {\n\t\treturn settings.promptPreset;\n\t}\n\n\tconst modelPromptPreset = parsePromptPreset(model.promptPreset);\n\tif (modelPromptPreset && modelPromptPreset !== \"auto\") {\n\t\treturn modelPromptPreset;\n\t}\n\n\tconst gpt5Version = extractGpt5Version(model.id);\n\tif (gpt5Version) {\n\t\treturn gpt5Version;\n\t}\n\tif (isKimiK27Model(model)) {\n\t\treturn \"kimi-k2-7\";\n\t}\n\tif (isKimiK26Model(model)) {\n\t\treturn \"kimi-k2-6\";\n\t}\n\tconst claudeVersion = extractClaudeOpusVersion(model.id);\n\tif (claudeVersion) {\n\t\treturn claudeVersion;\n\t}\n\treturn undefined;\n}\n\nfunction buildPreset(name: ResolvedPresetName, options: BuildDynamicSystemPromptOptions): ResolvedPromptPreset {\n\tswitch (name) {\n\t\tcase \"gpt-5.5\":\n\t\t\treturn { name, prompt: buildGpt55Prompt(options) };\n\t\tcase \"gpt-5.4\":\n\t\t\treturn { name, prompt: buildGpt54Prompt(options) };\n\t\tcase \"gpt-5.3-codex\":\n\t\t\treturn { name, prompt: buildGpt53CodexPrompt(options) };\n\t\tcase \"gpt-5.2\":\n\t\t\treturn { name, prompt: buildGpt52Prompt(options) };\n\t\tcase \"gpt-5\":\n\t\t\treturn { name, prompt: buildGpt5Prompt(options) };\n\t\tcase \"kimi-k2-7\":\n\t\t\treturn { name, prompt: buildKimiK27Prompt(options) };\n\t\tcase \"kimi-k2-6\":\n\t\t\treturn { name, prompt: buildKimiK26Prompt(options) };\n\t\tcase \"claude-opus-4-7\":\n\t\t\treturn { name, prompt: buildClaudeOpus47Prompt(options) };\n\t\tcase \"claude-opus-4-6\":\n\t\t\treturn { name, prompt: buildClaudeOpus46Prompt(options) };\n\t\tcase \"claude-opus-4-5\":\n\t\t\treturn { name, prompt: buildClaudeOpus45Prompt(options) };\n\t}\n}\n\nfunction withDefaults(options: Partial<BuildDynamicSystemPromptOptions> = {}): BuildDynamicSystemPromptOptions {\n\treturn {\n\t\tcwd: options.cwd ?? \"\",\n\t\tselectedTools: options.selectedTools ?? [],\n\t\ttoolSnippets: options.toolSnippets ?? {},\n\t\tpromptGuidelines: options.promptGuidelines ?? [],\n\t\tcontextFiles: options.contextFiles ?? [],\n\t\tskills: options.skills ?? [],\n\t};\n}\n\nexport function resolvePreset(\n\tmodel: ModelWithPromptPresetMetadata,\n\tsettings: PromptPresetSettings,\n\toptions?: Partial<BuildDynamicSystemPromptOptions>,\n): ResolvedPromptPreset | undefined {\n\tconst name = resolvePresetName(model, settings);\n\tif (!name) {\n\t\treturn undefined;\n\t}\n\treturn buildPreset(name, withDefaults(options));\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,gBAAgB,CAAC;AAE5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAwD5E"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const RULE_SUBCOMMANDS = ["list", "show", "paths", "status"];
|
|
2
|
+
export function registerSlashCommands(pi, engine) {
|
|
3
|
+
pi.registerCommand("rules", {
|
|
4
|
+
description: "Inspect loaded pi-rules.",
|
|
5
|
+
getArgumentCompletions: (prefix) => {
|
|
6
|
+
const completions = RULE_SUBCOMMANDS.filter((subcommand) => subcommand.startsWith(prefix)).map((subcommand) => ({
|
|
7
|
+
value: subcommand,
|
|
8
|
+
label: subcommand,
|
|
9
|
+
}));
|
|
10
|
+
return completions.length > 0 ? completions : null;
|
|
11
|
+
},
|
|
12
|
+
handler: async (args, ctx) => {
|
|
13
|
+
const tokens = args.trim().length === 0 ? [] : args.trim().split(/\s+/);
|
|
14
|
+
const subcommand = tokens[0] ?? "";
|
|
15
|
+
const loaded = engine.loadStaticRules(ctx.cwd);
|
|
16
|
+
if (subcommand === "" || subcommand === "status") {
|
|
17
|
+
notify(ctx, buildSummaryText(loaded.rules, loaded.diagnostics));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (subcommand === "list") {
|
|
21
|
+
notify(ctx, formatRuleList(loaded.rules));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (subcommand === "show") {
|
|
25
|
+
const id = tokens[1] ?? "";
|
|
26
|
+
const rule = findRuleById(loaded.rules, id);
|
|
27
|
+
if (rule === null) {
|
|
28
|
+
notify(ctx, `Rule not found: ${id}`, "error");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
notify(ctx, rule.body);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (subcommand === "paths") {
|
|
35
|
+
notify(ctx, loaded.rules.map((rule) => rule.path).join("\n"));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
notify(ctx, `Unknown /rules subcommand: ${subcommand}`, "error");
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
pi.registerCommand("reload-rules", {
|
|
42
|
+
description: "Reload pi-rules for the current session.",
|
|
43
|
+
handler: async (_args, ctx) => {
|
|
44
|
+
engine.resetSession(ctx.cwd);
|
|
45
|
+
const loaded = engine.loadStaticRules(ctx.cwd);
|
|
46
|
+
notify(ctx, buildReloadText(loaded.rules, loaded.diagnostics));
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function notify(ctx, message, severity = "info") {
|
|
51
|
+
ctx.ui.notify(message, severity);
|
|
52
|
+
}
|
|
53
|
+
function buildSummaryText(rules, diagnostics) {
|
|
54
|
+
return appendDiagnostics(`pi-rules: ${rules.length} rules from ${countSources(rules)} sources`, diagnostics);
|
|
55
|
+
}
|
|
56
|
+
function buildReloadText(rules, diagnostics) {
|
|
57
|
+
return appendDiagnostics(`Reloaded ${rules.length} rules from ${countSources(rules)} sources`, diagnostics);
|
|
58
|
+
}
|
|
59
|
+
function appendDiagnostics(text, diagnostics) {
|
|
60
|
+
return diagnostics.length === 0 ? text : `${text}, ${diagnostics.length} diagnostics`;
|
|
61
|
+
}
|
|
62
|
+
function countSources(rules) {
|
|
63
|
+
return new Set(rules.map((rule) => rule.source)).size;
|
|
64
|
+
}
|
|
65
|
+
function formatRuleList(rules) {
|
|
66
|
+
return rules
|
|
67
|
+
.map((rule) => `${rule.relativePath} [${rule.source}, ${formatMatchReason(rule.matchReason)}]`)
|
|
68
|
+
.join("\n");
|
|
69
|
+
}
|
|
70
|
+
function formatMatchReason(matchReason) {
|
|
71
|
+
if (typeof matchReason === "string") {
|
|
72
|
+
return matchReason;
|
|
73
|
+
}
|
|
74
|
+
if (matchReason.kind === "no-match") {
|
|
75
|
+
return matchReason.kind;
|
|
76
|
+
}
|
|
77
|
+
return `${matchReason.kind}:${matchReason.pattern}`;
|
|
78
|
+
}
|
|
79
|
+
function findRuleById(rules, id) {
|
|
80
|
+
const exactMatch = rules.find((rule) => rule.relativePath === id);
|
|
81
|
+
if (exactMatch !== undefined) {
|
|
82
|
+
return exactMatch;
|
|
83
|
+
}
|
|
84
|
+
const suffixMatches = rules.filter((rule) => rule.relativePath.endsWith(id));
|
|
85
|
+
return suffixMatches.length === 1 ? (suffixMatches[0] ?? null) : null;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, ExtensionCommandContext } from \"../../types.ts\";\n\nimport type { Engine } from \"./rules/engine.ts\";\nimport type { LoadedRule, MatchReason, RuleDiagnostic } from \"./rules/types.ts\";\n\nconst RULE_SUBCOMMANDS = [\"list\", \"show\", \"paths\", \"status\"] as const;\n\nexport function registerSlashCommands(pi: ExtensionAPI, engine: Engine): void {\n\tpi.registerCommand(\"rules\", {\n\t\tdescription: \"Inspect loaded pi-rules.\",\n\t\tgetArgumentCompletions: (prefix) => {\n\t\t\tconst completions = RULE_SUBCOMMANDS.filter((subcommand) => subcommand.startsWith(prefix)).map(\n\t\t\t\t(subcommand) => ({\n\t\t\t\t\tvalue: subcommand,\n\t\t\t\t\tlabel: subcommand,\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn completions.length > 0 ? completions : null;\n\t\t},\n\t\thandler: async (args, ctx) => {\n\t\t\tconst tokens = args.trim().length === 0 ? [] : args.trim().split(/\\s+/);\n\t\t\tconst subcommand = tokens[0] ?? \"\";\n\t\t\tconst loaded = engine.loadStaticRules(ctx.cwd);\n\n\t\t\tif (subcommand === \"\" || subcommand === \"status\") {\n\t\t\t\tnotify(ctx, buildSummaryText(loaded.rules, loaded.diagnostics));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (subcommand === \"list\") {\n\t\t\t\tnotify(ctx, formatRuleList(loaded.rules));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (subcommand === \"show\") {\n\t\t\t\tconst id = tokens[1] ?? \"\";\n\t\t\t\tconst rule = findRuleById(loaded.rules, id);\n\t\t\t\tif (rule === null) {\n\t\t\t\t\tnotify(ctx, `Rule not found: ${id}`, \"error\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnotify(ctx, rule.body);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (subcommand === \"paths\") {\n\t\t\t\tnotify(ctx, loaded.rules.map((rule) => rule.path).join(\"\\n\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnotify(ctx, `Unknown /rules subcommand: ${subcommand}`, \"error\");\n\t\t},\n\t});\n\n\tpi.registerCommand(\"reload-rules\", {\n\t\tdescription: \"Reload pi-rules for the current session.\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tengine.resetSession(ctx.cwd);\n\t\t\tconst loaded = engine.loadStaticRules(ctx.cwd);\n\t\t\tnotify(ctx, buildReloadText(loaded.rules, loaded.diagnostics));\n\t\t},\n\t});\n}\n\nfunction notify(ctx: ExtensionCommandContext, message: string, severity: \"info\" | \"warning\" | \"error\" = \"info\"): void {\n\tctx.ui.notify(message, severity);\n}\n\nfunction buildSummaryText(rules: ReadonlyArray<LoadedRule>, diagnostics: ReadonlyArray<RuleDiagnostic>): string {\n\treturn appendDiagnostics(`pi-rules: ${rules.length} rules from ${countSources(rules)} sources`, diagnostics);\n}\n\nfunction buildReloadText(rules: ReadonlyArray<LoadedRule>, diagnostics: ReadonlyArray<RuleDiagnostic>): string {\n\treturn appendDiagnostics(`Reloaded ${rules.length} rules from ${countSources(rules)} sources`, diagnostics);\n}\n\nfunction appendDiagnostics(text: string, diagnostics: ReadonlyArray<RuleDiagnostic>): string {\n\treturn diagnostics.length === 0 ? text : `${text}, ${diagnostics.length} diagnostics`;\n}\n\nfunction countSources(rules: ReadonlyArray<LoadedRule>): number {\n\treturn new Set(rules.map((rule) => rule.source)).size;\n}\n\nfunction formatRuleList(rules: ReadonlyArray<LoadedRule>): string {\n\treturn rules\n\t\t.map((rule) => `${rule.relativePath} [${rule.source}, ${formatMatchReason(rule.matchReason)}]`)\n\t\t.join(\"\\n\");\n}\n\nfunction formatMatchReason(matchReason: MatchReason): string {\n\tif (typeof matchReason === \"string\") {\n\t\treturn matchReason;\n\t}\n\tif (matchReason.kind === \"no-match\") {\n\t\treturn matchReason.kind;\n\t}\n\n\treturn `${matchReason.kind}:${matchReason.pattern}`;\n}\n\nfunction findRuleById(rules: ReadonlyArray<LoadedRule>, id: string): LoadedRule | null {\n\tconst exactMatch = rules.find((rule) => rule.relativePath === id);\n\tif (exactMatch !== undefined) {\n\t\treturn exactMatch;\n\t}\n\n\tconst suffixMatches = rules.filter((rule) => rule.relativePath.endsWith(id));\n\treturn suffixMatches.length === 1 ? (suffixMatches[0] ?? null) : null;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAanD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAgI/D"}
|