@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,443 @@
|
|
|
1
|
+
import { realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
3
|
+
import { clearSession, createSessionState, isDynamicInjected as isDynamicInjectedInState, isStaticInjected as isStaticInjectedInState, markDynamicInjected as markDynamicInjectedInState, markStaticInjected as markStaticInjectedInState, } from "./cache.js";
|
|
4
|
+
import { DEFAULT_MAX_RESULT_CHARS, DEFAULT_MAX_RULE_CHARS, PROJECT_SINGLE_FILES, SOURCE_PRIORITY, } from "./constants.js";
|
|
5
|
+
import { createRuleDiscoveryCache } from "./finder.js";
|
|
6
|
+
import { formatDynamicBlock, formatStaticBlock } from "./formatter.js";
|
|
7
|
+
import { hashContent, matchRule } from "./matcher.js";
|
|
8
|
+
import { sortCandidates } from "./ordering.js";
|
|
9
|
+
import { parseRule } from "./parser.js";
|
|
10
|
+
const MAX_DYNAMIC_MATCH_CACHE_ENTRIES = 4096;
|
|
11
|
+
const ROOT_SINGLE_FILE_SOURCES = new Set(PROJECT_SINGLE_FILES.filter((source) => !source.includes("/")));
|
|
12
|
+
export function defaultConfig() {
|
|
13
|
+
return {
|
|
14
|
+
disabled: false,
|
|
15
|
+
mode: "both",
|
|
16
|
+
maxRuleChars: DEFAULT_MAX_RULE_CHARS,
|
|
17
|
+
maxResultChars: DEFAULT_MAX_RESULT_CHARS,
|
|
18
|
+
enabledSources: "auto",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function createEngine(config, deps) {
|
|
22
|
+
const state = createSessionState();
|
|
23
|
+
const dynamicMatchCache = new Map();
|
|
24
|
+
function loadStaticRules(cwd) {
|
|
25
|
+
state.cwd = cwd;
|
|
26
|
+
if (config.disabled || config.mode === "off" || config.mode === "dynamic") {
|
|
27
|
+
return emptyLoadResult(state);
|
|
28
|
+
}
|
|
29
|
+
const projectRoot = deps.findProjectRoot(cwd);
|
|
30
|
+
const disabledSources = disabledSourcesFor(config);
|
|
31
|
+
const candidates = deps.findCandidates({
|
|
32
|
+
projectRoot,
|
|
33
|
+
targetFile: null,
|
|
34
|
+
...(disabledSources === undefined ? {} : { disabledSources }),
|
|
35
|
+
});
|
|
36
|
+
const realPathCache = new Map();
|
|
37
|
+
const result = loadStaticCandidates(candidates, deps, projectRoot, realPathCache);
|
|
38
|
+
storeLastLoad(state, result.rules, result.diagnostics);
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
function loadDynamicRules(cwd, targetPaths) {
|
|
42
|
+
state.cwd = cwd;
|
|
43
|
+
if (config.disabled || config.mode === "off" || config.mode === "static" || targetPaths.length === 0) {
|
|
44
|
+
return emptyLoadResult(state);
|
|
45
|
+
}
|
|
46
|
+
const targetFiles = uniqueStrings(targetPaths);
|
|
47
|
+
const shouldCacheLookups = targetFiles.length > 1;
|
|
48
|
+
const rules = [];
|
|
49
|
+
const diagnostics = [];
|
|
50
|
+
const seenRules = new Set();
|
|
51
|
+
const loadedRuleContent = new Map();
|
|
52
|
+
const projectMembership = new Map();
|
|
53
|
+
const disabledSources = disabledSourcesFor(config);
|
|
54
|
+
const discoveryCache = shouldCacheLookups ? createRuleDiscoveryCache() : undefined;
|
|
55
|
+
const candidateDiscoveryCache = new Map();
|
|
56
|
+
const projectRootCache = new Map();
|
|
57
|
+
const realPathCache = new Map();
|
|
58
|
+
for (const targetFile of targetFiles) {
|
|
59
|
+
const projectRoot = shouldCacheLookups
|
|
60
|
+
? findProjectRootCached(projectRootCache, targetFile, deps.findProjectRoot)
|
|
61
|
+
: deps.findProjectRoot(targetFile);
|
|
62
|
+
const findOptions = {
|
|
63
|
+
projectRoot,
|
|
64
|
+
targetFile,
|
|
65
|
+
...(discoveryCache === undefined ? {} : { cache: discoveryCache }),
|
|
66
|
+
...(disabledSources === undefined ? {} : { disabledSources }),
|
|
67
|
+
};
|
|
68
|
+
const candidates = shouldCacheLookups
|
|
69
|
+
? findSortedCandidatesCached(candidateDiscoveryCache, deps.findCandidates, findOptions)
|
|
70
|
+
: sortCandidates(deps.findCandidates(findOptions));
|
|
71
|
+
for (const candidate of candidates) {
|
|
72
|
+
const loadedRule = loadCandidate(candidate, deps, diagnostics, projectRoot, {
|
|
73
|
+
loadedRuleContent,
|
|
74
|
+
projectMembership,
|
|
75
|
+
realPathCache,
|
|
76
|
+
});
|
|
77
|
+
if (loadedRule === null) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const matchReason = matchDynamicRuleCached(dynamicMatchCache, projectRoot, targetFile, candidate, loadedRule, deps.matchRule ?? matchRule);
|
|
81
|
+
if (matchReason === null) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
const dedupKey = ruleDedupKey(loadedRule);
|
|
85
|
+
if (seenRules.has(dedupKey)) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
seenRules.add(dedupKey);
|
|
89
|
+
rules.push({ ...loadedRule, matchReason });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const sortedRules = sortCandidates(rules);
|
|
93
|
+
storeLastLoad(state, sortedRules, diagnostics);
|
|
94
|
+
return { rules: sortedRules, diagnostics };
|
|
95
|
+
}
|
|
96
|
+
function fingerprintDynamicTargets(cwd, targetPaths) {
|
|
97
|
+
state.cwd = cwd;
|
|
98
|
+
if (config.disabled || config.mode === "off" || config.mode === "static" || targetPaths.length === 0) {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
const fingerprintFn = deps.fileFingerprint ?? fileStatFingerprint;
|
|
102
|
+
const disabledSources = disabledSourcesFor(config);
|
|
103
|
+
const discoveryCache = createRuleDiscoveryCache();
|
|
104
|
+
const cwdProjectRoot = deps.findProjectRoot(cwd);
|
|
105
|
+
const fingerprints = [];
|
|
106
|
+
for (const targetFile of uniqueStrings(targetPaths)) {
|
|
107
|
+
const projectRoot = cwdProjectRoot !== null && isSameOrChildPath(targetFile, cwdProjectRoot)
|
|
108
|
+
? cwdProjectRoot
|
|
109
|
+
: deps.findProjectRoot(targetFile);
|
|
110
|
+
const findOptions = {
|
|
111
|
+
projectRoot,
|
|
112
|
+
targetFile,
|
|
113
|
+
cache: discoveryCache,
|
|
114
|
+
...(disabledSources === undefined ? {} : { disabledSources }),
|
|
115
|
+
};
|
|
116
|
+
const candidates = sortCandidates(deps.findCandidates(findOptions));
|
|
117
|
+
const cacheKey = dynamicTargetCacheKey(targetFile);
|
|
118
|
+
fingerprints.push({
|
|
119
|
+
targetPath: targetFile,
|
|
120
|
+
cacheKey,
|
|
121
|
+
fingerprint: computeDynamicTargetFingerprint(targetFile, projectRoot, candidates, config, fingerprintFn),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return fingerprints;
|
|
125
|
+
}
|
|
126
|
+
function commitDynamicTargetFingerprints(fingerprints) {
|
|
127
|
+
for (const target of fingerprints) {
|
|
128
|
+
state.dynamicTargetFingerprints.set(target.cacheKey, target.fingerprint);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function isDynamicTargetFingerprintCurrent(target) {
|
|
132
|
+
return state.dynamicTargetFingerprints.get(target.cacheKey) === target.fingerprint;
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
state,
|
|
136
|
+
config,
|
|
137
|
+
loadStaticRules,
|
|
138
|
+
loadDynamicRules,
|
|
139
|
+
formatStatic: (rules) => formatStaticBlock(rules, { maxRuleChars: config.maxRuleChars, maxResultChars: config.maxResultChars }),
|
|
140
|
+
formatDynamic: (rules, target) => formatDynamicBlock(rules, target, {
|
|
141
|
+
maxRuleChars: config.maxRuleChars,
|
|
142
|
+
maxResultChars: config.maxResultChars,
|
|
143
|
+
}),
|
|
144
|
+
resetSession: (cwd) => {
|
|
145
|
+
clearSession(state);
|
|
146
|
+
dynamicMatchCache.clear();
|
|
147
|
+
if (cwd !== undefined) {
|
|
148
|
+
state.cwd = cwd;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
isStaticInjected: (rule) => isStaticInjectedInState(state, rule),
|
|
152
|
+
isDynamicInjected: (scopeKey, rule) => isDynamicInjectedInState(state, scopeKey, rule),
|
|
153
|
+
markStaticInjected: (rule) => markStaticInjectedInState(state, rule),
|
|
154
|
+
markDynamicInjected: (scopeKey, rule) => markDynamicInjectedInState(state, scopeKey, rule),
|
|
155
|
+
fingerprintDynamicTargets,
|
|
156
|
+
isDynamicTargetFingerprintCurrent,
|
|
157
|
+
commitDynamicTargetFingerprints,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function isSameOrChildPath(childPath, parentPath) {
|
|
161
|
+
const childRelativePath = relative(parentPath, resolve(childPath));
|
|
162
|
+
return childRelativePath === "" || (!childRelativePath.startsWith("..") && !isAbsolute(childRelativePath));
|
|
163
|
+
}
|
|
164
|
+
function matchDynamicRuleCached(cache, projectRoot, targetFile, candidate, loadedRule, matchRuleImpl) {
|
|
165
|
+
const cacheKey = dynamicMatchCacheKey(projectRoot, targetFile, candidate, loadedRule.contentHash);
|
|
166
|
+
if (cache.has(cacheKey)) {
|
|
167
|
+
const cachedReason = cache.get(cacheKey) ?? null;
|
|
168
|
+
cache.delete(cacheKey);
|
|
169
|
+
cache.set(cacheKey, cachedReason);
|
|
170
|
+
return cachedReason;
|
|
171
|
+
}
|
|
172
|
+
const matchResult = matchRuleImpl({
|
|
173
|
+
frontmatter: loadedRule.frontmatter,
|
|
174
|
+
isSingleFile: candidate.isSingleFile,
|
|
175
|
+
pathBases: pathBasesForTarget(projectRoot, targetFile, candidate),
|
|
176
|
+
});
|
|
177
|
+
const reason = matchResult.matched ? matchResult.reason : null;
|
|
178
|
+
setDynamicMatchCacheEntry(cache, cacheKey, reason);
|
|
179
|
+
return reason;
|
|
180
|
+
}
|
|
181
|
+
function setDynamicMatchCacheEntry(cache, cacheKey, reason) {
|
|
182
|
+
if (cache.size >= MAX_DYNAMIC_MATCH_CACHE_ENTRIES) {
|
|
183
|
+
const oldestCacheKey = cache.keys().next().value;
|
|
184
|
+
if (oldestCacheKey !== undefined) {
|
|
185
|
+
cache.delete(oldestCacheKey);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
cache.set(cacheKey, reason);
|
|
189
|
+
}
|
|
190
|
+
function dynamicMatchCacheKey(projectRoot, targetFile, candidate, contentHash) {
|
|
191
|
+
return [
|
|
192
|
+
projectRoot ?? "",
|
|
193
|
+
toPosixPath(resolve(targetFile)),
|
|
194
|
+
candidate.realPath,
|
|
195
|
+
candidate.relativePath,
|
|
196
|
+
candidate.source,
|
|
197
|
+
candidate.isGlobal ? "global" : "project",
|
|
198
|
+
candidate.isSingleFile ? "single" : "multi",
|
|
199
|
+
String(candidate.distance),
|
|
200
|
+
contentHash,
|
|
201
|
+
].join("\0");
|
|
202
|
+
}
|
|
203
|
+
function loadStaticCandidates(candidates, deps, projectRoot, realPathCache) {
|
|
204
|
+
const rules = [];
|
|
205
|
+
const diagnostics = [];
|
|
206
|
+
let rootSingleFileSelected = false;
|
|
207
|
+
for (const candidate of sortCandidates(candidates)) {
|
|
208
|
+
if (isDedupedRootSingleFile(candidate, rootSingleFileSelected)) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
const loadedRule = loadCandidate(candidate, deps, diagnostics, projectRoot, { realPathCache });
|
|
212
|
+
if (loadedRule === null) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const matchReason = staticMatchReason(loadedRule);
|
|
216
|
+
if (matchReason === null) {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (isRootSingleFile(candidate)) {
|
|
220
|
+
rootSingleFileSelected = true;
|
|
221
|
+
}
|
|
222
|
+
rules.push({ ...loadedRule, matchReason });
|
|
223
|
+
}
|
|
224
|
+
return { rules: sortCandidates(rules), diagnostics };
|
|
225
|
+
}
|
|
226
|
+
function loadCandidate(candidate, deps, diagnostics, projectRoot, caches) {
|
|
227
|
+
if (!isCandidateWithinProjectCached(candidate, projectRoot, caches.projectMembership, caches.realPathCache)) {
|
|
228
|
+
diagnostics.push({
|
|
229
|
+
severity: "warning",
|
|
230
|
+
source: candidate.path,
|
|
231
|
+
message: "Rule file resolves outside project root",
|
|
232
|
+
});
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
const cachedContent = caches.loadedRuleContent?.get(candidate.realPath);
|
|
236
|
+
if (cachedContent !== undefined) {
|
|
237
|
+
return loadedRuleFromContent(candidate, cachedContent, diagnostics);
|
|
238
|
+
}
|
|
239
|
+
const content = deps.readFile(candidate.path);
|
|
240
|
+
if (content === null) {
|
|
241
|
+
caches.loadedRuleContent?.set(candidate.realPath, null);
|
|
242
|
+
diagnostics.push({ severity: "warning", source: candidate.path, message: "Unable to read rule file" });
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
const parsed = parseRule(content);
|
|
246
|
+
const loadedContent = {
|
|
247
|
+
frontmatter: parsed.frontmatter,
|
|
248
|
+
body: parsed.body,
|
|
249
|
+
contentHash: hashContent(content),
|
|
250
|
+
};
|
|
251
|
+
if (parsed.diagnostic !== undefined)
|
|
252
|
+
loadedContent.diagnostic = parsed.diagnostic;
|
|
253
|
+
caches.loadedRuleContent?.set(candidate.realPath, loadedContent);
|
|
254
|
+
return loadedRuleFromContent(candidate, loadedContent, diagnostics);
|
|
255
|
+
}
|
|
256
|
+
function loadedRuleFromContent(candidate, content, diagnostics) {
|
|
257
|
+
if (content === null) {
|
|
258
|
+
diagnostics.push({ severity: "warning", source: candidate.path, message: "Unable to read rule file" });
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
if (content.diagnostic !== undefined) {
|
|
262
|
+
diagnostics.push({ severity: "warning", source: candidate.path, message: content.diagnostic });
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
...candidate,
|
|
266
|
+
frontmatter: content.frontmatter,
|
|
267
|
+
body: content.body,
|
|
268
|
+
contentHash: content.contentHash,
|
|
269
|
+
matchReason: { kind: "no-match" },
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function ruleDedupKey(rule) {
|
|
273
|
+
return `${rule.realPath}::${rule.contentHash}`;
|
|
274
|
+
}
|
|
275
|
+
function isCandidateWithinProject(candidate, projectRoot, realPathCache) {
|
|
276
|
+
if (candidate.isGlobal) {
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
if (projectRoot === null) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
const relativeRealPath = relative(realPathOrResolved(projectRoot, realPathCache), resolve(candidate.realPath));
|
|
283
|
+
return relativeRealPath === "" || (!relativeRealPath.startsWith("..") && !isAbsolute(relativeRealPath));
|
|
284
|
+
}
|
|
285
|
+
function realPathOrResolved(path, cache) {
|
|
286
|
+
const cached = cache?.get(path);
|
|
287
|
+
if (cached !== undefined) {
|
|
288
|
+
return cached;
|
|
289
|
+
}
|
|
290
|
+
try {
|
|
291
|
+
const realPath = realpathSync.native(path);
|
|
292
|
+
cache?.set(path, realPath);
|
|
293
|
+
return realPath;
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
const resolvedPath = resolve(path);
|
|
297
|
+
cache?.set(path, resolvedPath);
|
|
298
|
+
return resolvedPath;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
function isCandidateWithinProjectCached(candidate, projectRoot, projectMembership, realPathCache) {
|
|
302
|
+
if (projectMembership === undefined) {
|
|
303
|
+
return isCandidateWithinProject(candidate, projectRoot, realPathCache);
|
|
304
|
+
}
|
|
305
|
+
const cacheKey = `${projectRoot ?? ""}\0${candidate.realPath}`;
|
|
306
|
+
const cached = projectMembership.get(cacheKey);
|
|
307
|
+
if (cached !== undefined) {
|
|
308
|
+
return cached;
|
|
309
|
+
}
|
|
310
|
+
const isWithinProject = isCandidateWithinProject(candidate, projectRoot, realPathCache);
|
|
311
|
+
projectMembership.set(cacheKey, isWithinProject);
|
|
312
|
+
return isWithinProject;
|
|
313
|
+
}
|
|
314
|
+
function findSortedCandidatesCached(cache, findCandidates, options) {
|
|
315
|
+
const cacheKey = candidateDiscoveryCacheKey(options);
|
|
316
|
+
const cached = cache.get(cacheKey);
|
|
317
|
+
if (cached !== undefined) {
|
|
318
|
+
return cached;
|
|
319
|
+
}
|
|
320
|
+
const candidates = sortCandidates(findCandidates(options));
|
|
321
|
+
cache.set(cacheKey, candidates);
|
|
322
|
+
return candidates;
|
|
323
|
+
}
|
|
324
|
+
function candidateDiscoveryCacheKey(options) {
|
|
325
|
+
return [
|
|
326
|
+
options.projectRoot ?? "",
|
|
327
|
+
options.targetFile === null ? "" : dirname(resolve(options.targetFile)),
|
|
328
|
+
...[...(options.disabledSources ?? [])].sort(),
|
|
329
|
+
].join("\0");
|
|
330
|
+
}
|
|
331
|
+
function findProjectRootCached(cache, targetFile, findProjectRoot) {
|
|
332
|
+
const cacheKey = dirname(resolve(targetFile));
|
|
333
|
+
if (cache.has(cacheKey)) {
|
|
334
|
+
return cache.get(cacheKey) ?? null;
|
|
335
|
+
}
|
|
336
|
+
const projectRoot = findProjectRoot(targetFile);
|
|
337
|
+
cache.set(cacheKey, projectRoot);
|
|
338
|
+
return projectRoot;
|
|
339
|
+
}
|
|
340
|
+
function staticMatchReason(rule) {
|
|
341
|
+
if (rule.frontmatter.alwaysApply === true) {
|
|
342
|
+
return "alwaysApply";
|
|
343
|
+
}
|
|
344
|
+
if (rule.isSingleFile) {
|
|
345
|
+
return "single-file";
|
|
346
|
+
}
|
|
347
|
+
return null;
|
|
348
|
+
}
|
|
349
|
+
function disabledSourcesFor(config) {
|
|
350
|
+
if (config.enabledSources === "auto") {
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
const enabledSources = new Set(config.enabledSources);
|
|
354
|
+
return new Set([...SOURCE_PRIORITY.keys()].filter((source) => !enabledSources.has(source)));
|
|
355
|
+
}
|
|
356
|
+
function isDedupedRootSingleFile(candidate, rootSingleFileSelected) {
|
|
357
|
+
return rootSingleFileSelected && isRootSingleFile(candidate);
|
|
358
|
+
}
|
|
359
|
+
function isRootSingleFile(candidate) {
|
|
360
|
+
return candidate.distance === 0 && candidate.isSingleFile && ROOT_SINGLE_FILE_SOURCES.has(candidate.source);
|
|
361
|
+
}
|
|
362
|
+
function pathBasesForTarget(projectRoot, targetFile, candidate) {
|
|
363
|
+
const targetBasename = basename(targetFile);
|
|
364
|
+
if (projectRoot === null) {
|
|
365
|
+
return { projectRelative: targetBasename, basename: targetBasename };
|
|
366
|
+
}
|
|
367
|
+
const projectRelative = toPosixPath(relative(projectRoot, targetFile));
|
|
368
|
+
const scopeDirectory = scopeDirectoryForCandidate(projectRoot, candidate);
|
|
369
|
+
if (scopeDirectory === null) {
|
|
370
|
+
return { projectRelative, basename: targetBasename };
|
|
371
|
+
}
|
|
372
|
+
return {
|
|
373
|
+
projectRelative,
|
|
374
|
+
scopeRelative: toPosixPath(relative(scopeDirectory, targetFile)),
|
|
375
|
+
basename: targetBasename,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
function scopeDirectoryForCandidate(projectRoot, candidate) {
|
|
379
|
+
if (candidate.isGlobal) {
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
if (candidate.isSingleFile) {
|
|
383
|
+
return dirname(candidate.path);
|
|
384
|
+
}
|
|
385
|
+
const sourceIndex = candidate.relativePath.indexOf(candidate.source);
|
|
386
|
+
if (sourceIndex === -1) {
|
|
387
|
+
return projectRoot;
|
|
388
|
+
}
|
|
389
|
+
const scopeRelativeDirectory = candidate.relativePath.slice(0, sourceIndex).replace(/\/$/, "");
|
|
390
|
+
return scopeRelativeDirectory.length === 0 ? projectRoot : join(projectRoot, scopeRelativeDirectory);
|
|
391
|
+
}
|
|
392
|
+
function toPosixPath(path) {
|
|
393
|
+
return path.replaceAll("\\", "/");
|
|
394
|
+
}
|
|
395
|
+
function dynamicTargetCacheKey(targetFile) {
|
|
396
|
+
return toPosixPath(resolve(targetFile));
|
|
397
|
+
}
|
|
398
|
+
function computeDynamicTargetFingerprint(targetFile, projectRoot, candidates, config, fileFingerprintFn) {
|
|
399
|
+
const candidateFingerprint = candidates
|
|
400
|
+
.map((candidate) => fingerprintCandidate(candidate, fileFingerprintFn))
|
|
401
|
+
.join("\u0001");
|
|
402
|
+
return hashContent([
|
|
403
|
+
"v1",
|
|
404
|
+
config.enabledSources === "auto" ? "auto" : config.enabledSources.join(","),
|
|
405
|
+
projectRoot ?? "",
|
|
406
|
+
dynamicTargetCacheKey(targetFile),
|
|
407
|
+
candidateFingerprint,
|
|
408
|
+
].join("\u0000"));
|
|
409
|
+
}
|
|
410
|
+
function fingerprintCandidate(candidate, fileFingerprintFn) {
|
|
411
|
+
return [
|
|
412
|
+
candidate.realPath,
|
|
413
|
+
candidate.relativePath,
|
|
414
|
+
candidate.source,
|
|
415
|
+
candidate.isGlobal ? "global" : "project",
|
|
416
|
+
candidate.isSingleFile ? "single" : "multi",
|
|
417
|
+
String(candidate.distance),
|
|
418
|
+
fileFingerprintFn(candidate.path),
|
|
419
|
+
].join("\u0000");
|
|
420
|
+
}
|
|
421
|
+
function fileStatFingerprint(filePath) {
|
|
422
|
+
try {
|
|
423
|
+
const stats = statSync(filePath, { bigint: true });
|
|
424
|
+
return `${stats.mtimeNs}:${stats.ctimeNs}:${stats.size}`;
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
return "missing";
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
function uniqueStrings(values) {
|
|
431
|
+
return [...new Set(values)];
|
|
432
|
+
}
|
|
433
|
+
function storeLastLoad(state, rules, diagnostics) {
|
|
434
|
+
state.loadedRules.length = 0;
|
|
435
|
+
state.loadedRules.push(...rules);
|
|
436
|
+
state.diagnostics.length = 0;
|
|
437
|
+
state.diagnostics.push(...diagnostics);
|
|
438
|
+
}
|
|
439
|
+
function emptyLoadResult(state) {
|
|
440
|
+
storeLastLoad(state, [], []);
|
|
441
|
+
return { rules: [], diagnostics: [] };
|
|
442
|
+
}
|
|
443
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/engine.ts"],"names":[],"mappings":"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","sourcesContent":["import { realpathSync, statSync } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, relative, resolve } from \"node:path\";\n\nimport type { ToolResultEvent } from \"../../../types.ts\";\n\nimport {\n\tclearSession,\n\tcreateSessionState,\n\tisDynamicInjected as isDynamicInjectedInState,\n\tisStaticInjected as isStaticInjectedInState,\n\tmarkDynamicInjected as markDynamicInjectedInState,\n\tmarkStaticInjected as markStaticInjectedInState,\n} from \"./cache.ts\";\nimport {\n\tDEFAULT_MAX_RESULT_CHARS,\n\tDEFAULT_MAX_RULE_CHARS,\n\tPROJECT_SINGLE_FILES,\n\tSOURCE_PRIORITY,\n} from \"./constants.ts\";\nimport { createRuleDiscoveryCache, type RuleDiscoveryCache } from \"./finder.ts\";\nimport { formatDynamicBlock, formatStaticBlock } from \"./formatter.ts\";\nimport { hashContent, matchRule } from \"./matcher.ts\";\nimport { sortCandidates } from \"./ordering.ts\";\nimport { parseRule } from \"./parser.ts\";\nimport type { LoadedRule, MatchReason, PiRulesConfig, RuleCandidate, RuleDiagnostic, SessionState } from \"./types.ts\";\n\ninterface LoadedRuleContent {\n\tfrontmatter: LoadedRule[\"frontmatter\"];\n\tbody: string;\n\tcontentHash: string;\n\tdiagnostic?: string;\n}\n\ninterface LoadCandidateCaches {\n\treadonly loadedRuleContent?: Map<string, LoadedRuleContent | null>;\n\treadonly projectMembership?: CandidateProjectMembership;\n\treadonly realPathCache?: RealPathCache;\n}\n\ntype CandidateProjectMembership = Map<string, boolean>;\ntype CandidateDiscoveryCache = Map<string, RuleCandidate[]>;\ntype DynamicMatchCache = Map<string, MatchReason | null>;\ntype RealPathCache = Map<string, string>;\n\nconst MAX_DYNAMIC_MATCH_CACHE_ENTRIES = 4096;\n\nexport interface EngineDeps {\n\tfindCandidates: (options: {\n\t\tprojectRoot: string | null;\n\t\ttargetFile: string | null;\n\t\thomeDir?: string;\n\t\tdisabledSources?: ReadonlySet<string>;\n\t\tskipUserHome?: boolean;\n\t\tcache?: RuleDiscoveryCache;\n\t}) => RuleCandidate[];\n\treadFile: (path: string) => string | null;\n\tfindProjectRoot: (startPath: string) => string | null;\n\textractToolPaths: (event: ToolResultEvent, cwd: string) => string[];\n\tmatchRule?: typeof matchRule;\n\t/**\n\t * Returns a stable identifier for a rule file. Default uses `statSync` mtime/ctime/size.\n\t * Tests may inject a content-based fingerprint when fixtures use synthetic paths.\n\t */\n\tfileFingerprint?: (filePath: string) => string;\n}\n\nexport interface DynamicTargetFingerprint {\n\ttargetPath: string;\n\tcacheKey: string;\n\tfingerprint: string;\n}\n\nexport interface Engine {\n\tstate: SessionState;\n\tconfig: PiRulesConfig;\n\tloadStaticRules(cwd: string): { rules: LoadedRule[]; diagnostics: RuleDiagnostic[] };\n\tloadDynamicRules(\n\t\tcwd: string,\n\t\ttargetPaths: ReadonlyArray<string>,\n\t): { rules: LoadedRule[]; diagnostics: RuleDiagnostic[] };\n\tformatStatic(rules: ReadonlyArray<LoadedRule>): string;\n\tformatDynamic(rules: ReadonlyArray<LoadedRule>, target: string): string;\n\tresetSession(cwd?: string): void;\n\tisStaticInjected(rule: LoadedRule): boolean;\n\tisDynamicInjected(scopeKey: string, rule: LoadedRule): boolean;\n\tmarkStaticInjected(rule: LoadedRule): boolean;\n\tmarkDynamicInjected(scopeKey: string, rule: LoadedRule): boolean;\n\t/**\n\t * Computes a fingerprint for each unique target derived from its discovered\n\t * candidates plus their on-disk fingerprints. Pure - does not mutate state.\n\t */\n\tfingerprintDynamicTargets(cwd: string, targetPaths: ReadonlyArray<string>): DynamicTargetFingerprint[];\n\t/**\n\t * Returns true when the fingerprint for a target already matches the value\n\t * stored on `state.dynamicTargetFingerprints`. The hook layer skips\n\t * `loadDynamicRules` entirely when every target is current.\n\t */\n\tisDynamicTargetFingerprintCurrent(target: DynamicTargetFingerprint): boolean;\n\t/**\n\t * Commits the supplied fingerprints to `state.dynamicTargetFingerprints`.\n\t * Always pass every fingerprint observed during a hook invocation so the\n\t * map mirrors the latest discovery.\n\t */\n\tcommitDynamicTargetFingerprints(fingerprints: ReadonlyArray<DynamicTargetFingerprint>): void;\n}\n\nconst ROOT_SINGLE_FILE_SOURCES = new Set(PROJECT_SINGLE_FILES.filter((source) => !source.includes(\"/\")));\n\nexport function defaultConfig(): PiRulesConfig {\n\treturn {\n\t\tdisabled: false,\n\t\tmode: \"both\",\n\t\tmaxRuleChars: DEFAULT_MAX_RULE_CHARS,\n\t\tmaxResultChars: DEFAULT_MAX_RESULT_CHARS,\n\t\tenabledSources: \"auto\",\n\t};\n}\n\nexport function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine {\n\tconst state = createSessionState();\n\tconst dynamicMatchCache: DynamicMatchCache = new Map();\n\n\tfunction loadStaticRules(cwd: string): { rules: LoadedRule[]; diagnostics: RuleDiagnostic[] } {\n\t\tstate.cwd = cwd;\n\t\tif (config.disabled || config.mode === \"off\" || config.mode === \"dynamic\") {\n\t\t\treturn emptyLoadResult(state);\n\t\t}\n\n\t\tconst projectRoot = deps.findProjectRoot(cwd);\n\t\tconst disabledSources = disabledSourcesFor(config);\n\t\tconst candidates = deps.findCandidates({\n\t\t\tprojectRoot,\n\t\t\ttargetFile: null,\n\t\t\t...(disabledSources === undefined ? {} : { disabledSources }),\n\t\t});\n\t\tconst realPathCache: RealPathCache = new Map();\n\t\tconst result = loadStaticCandidates(candidates, deps, projectRoot, realPathCache);\n\t\tstoreLastLoad(state, result.rules, result.diagnostics);\n\t\treturn result;\n\t}\n\n\tfunction loadDynamicRules(\n\t\tcwd: string,\n\t\ttargetPaths: ReadonlyArray<string>,\n\t): { rules: LoadedRule[]; diagnostics: RuleDiagnostic[] } {\n\t\tstate.cwd = cwd;\n\t\tif (config.disabled || config.mode === \"off\" || config.mode === \"static\" || targetPaths.length === 0) {\n\t\t\treturn emptyLoadResult(state);\n\t\t}\n\n\t\tconst targetFiles = uniqueStrings(targetPaths);\n\t\tconst shouldCacheLookups = targetFiles.length > 1;\n\t\tconst rules: LoadedRule[] = [];\n\t\tconst diagnostics: RuleDiagnostic[] = [];\n\t\tconst seenRules = new Set<string>();\n\t\tconst loadedRuleContent = new Map<string, LoadedRuleContent | null>();\n\t\tconst projectMembership = new Map<string, boolean>();\n\t\tconst disabledSources = disabledSourcesFor(config);\n\t\tconst discoveryCache = shouldCacheLookups ? createRuleDiscoveryCache() : undefined;\n\t\tconst candidateDiscoveryCache: CandidateDiscoveryCache = new Map();\n\t\tconst projectRootCache = new Map<string, string | null>();\n\t\tconst realPathCache: RealPathCache = new Map();\n\t\tfor (const targetFile of targetFiles) {\n\t\t\tconst projectRoot = shouldCacheLookups\n\t\t\t\t? findProjectRootCached(projectRootCache, targetFile, deps.findProjectRoot)\n\t\t\t\t: deps.findProjectRoot(targetFile);\n\t\t\tconst findOptions: Parameters<EngineDeps[\"findCandidates\"]>[0] = {\n\t\t\t\tprojectRoot,\n\t\t\t\ttargetFile,\n\t\t\t\t...(discoveryCache === undefined ? {} : { cache: discoveryCache }),\n\t\t\t\t...(disabledSources === undefined ? {} : { disabledSources }),\n\t\t\t};\n\t\t\tconst candidates = shouldCacheLookups\n\t\t\t\t? findSortedCandidatesCached(candidateDiscoveryCache, deps.findCandidates, findOptions)\n\t\t\t\t: sortCandidates(deps.findCandidates(findOptions));\n\n\t\t\tfor (const candidate of candidates) {\n\t\t\t\tconst loadedRule = loadCandidate(candidate, deps, diagnostics, projectRoot, {\n\t\t\t\t\tloadedRuleContent,\n\t\t\t\t\tprojectMembership,\n\t\t\t\t\trealPathCache,\n\t\t\t\t});\n\t\t\t\tif (loadedRule === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst matchReason = matchDynamicRuleCached(\n\t\t\t\t\tdynamicMatchCache,\n\t\t\t\t\tprojectRoot,\n\t\t\t\t\ttargetFile,\n\t\t\t\t\tcandidate,\n\t\t\t\t\tloadedRule,\n\t\t\t\t\tdeps.matchRule ?? matchRule,\n\t\t\t\t);\n\n\t\t\t\tif (matchReason === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst dedupKey = ruleDedupKey(loadedRule);\n\t\t\t\tif (seenRules.has(dedupKey)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tseenRules.add(dedupKey);\n\t\t\t\trules.push({ ...loadedRule, matchReason });\n\t\t\t}\n\t\t}\n\n\t\tconst sortedRules = sortCandidates(rules);\n\t\tstoreLastLoad(state, sortedRules, diagnostics);\n\t\treturn { rules: sortedRules, diagnostics };\n\t}\n\n\tfunction fingerprintDynamicTargets(cwd: string, targetPaths: ReadonlyArray<string>): DynamicTargetFingerprint[] {\n\t\tstate.cwd = cwd;\n\t\tif (config.disabled || config.mode === \"off\" || config.mode === \"static\" || targetPaths.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst fingerprintFn = deps.fileFingerprint ?? fileStatFingerprint;\n\t\tconst disabledSources = disabledSourcesFor(config);\n\t\tconst discoveryCache = createRuleDiscoveryCache();\n\t\tconst cwdProjectRoot = deps.findProjectRoot(cwd);\n\t\tconst fingerprints: DynamicTargetFingerprint[] = [];\n\n\t\tfor (const targetFile of uniqueStrings(targetPaths)) {\n\t\t\tconst projectRoot =\n\t\t\t\tcwdProjectRoot !== null && isSameOrChildPath(targetFile, cwdProjectRoot)\n\t\t\t\t\t? cwdProjectRoot\n\t\t\t\t\t: deps.findProjectRoot(targetFile);\n\t\t\tconst findOptions: Parameters<EngineDeps[\"findCandidates\"]>[0] = {\n\t\t\t\tprojectRoot,\n\t\t\t\ttargetFile,\n\t\t\t\tcache: discoveryCache,\n\t\t\t\t...(disabledSources === undefined ? {} : { disabledSources }),\n\t\t\t};\n\t\t\tconst candidates = sortCandidates(deps.findCandidates(findOptions));\n\t\t\tconst cacheKey = dynamicTargetCacheKey(targetFile);\n\t\t\tfingerprints.push({\n\t\t\t\ttargetPath: targetFile,\n\t\t\t\tcacheKey,\n\t\t\t\tfingerprint: computeDynamicTargetFingerprint(targetFile, projectRoot, candidates, config, fingerprintFn),\n\t\t\t});\n\t\t}\n\n\t\treturn fingerprints;\n\t}\n\n\tfunction commitDynamicTargetFingerprints(fingerprints: ReadonlyArray<DynamicTargetFingerprint>): void {\n\t\tfor (const target of fingerprints) {\n\t\t\tstate.dynamicTargetFingerprints.set(target.cacheKey, target.fingerprint);\n\t\t}\n\t}\n\n\tfunction isDynamicTargetFingerprintCurrent(target: DynamicTargetFingerprint): boolean {\n\t\treturn state.dynamicTargetFingerprints.get(target.cacheKey) === target.fingerprint;\n\t}\n\n\treturn {\n\t\tstate,\n\t\tconfig,\n\t\tloadStaticRules,\n\t\tloadDynamicRules,\n\t\tformatStatic: (rules) =>\n\t\t\tformatStaticBlock(rules, { maxRuleChars: config.maxRuleChars, maxResultChars: config.maxResultChars }),\n\t\tformatDynamic: (rules, target) =>\n\t\t\tformatDynamicBlock(rules, target, {\n\t\t\t\tmaxRuleChars: config.maxRuleChars,\n\t\t\t\tmaxResultChars: config.maxResultChars,\n\t\t\t}),\n\t\tresetSession: (cwd) => {\n\t\t\tclearSession(state);\n\t\t\tdynamicMatchCache.clear();\n\t\t\tif (cwd !== undefined) {\n\t\t\t\tstate.cwd = cwd;\n\t\t\t}\n\t\t},\n\t\tisStaticInjected: (rule) => isStaticInjectedInState(state, rule),\n\t\tisDynamicInjected: (scopeKey, rule) => isDynamicInjectedInState(state, scopeKey, rule),\n\t\tmarkStaticInjected: (rule) => markStaticInjectedInState(state, rule),\n\t\tmarkDynamicInjected: (scopeKey, rule) => markDynamicInjectedInState(state, scopeKey, rule),\n\t\tfingerprintDynamicTargets,\n\t\tisDynamicTargetFingerprintCurrent,\n\t\tcommitDynamicTargetFingerprints,\n\t};\n}\n\nfunction isSameOrChildPath(childPath: string, parentPath: string): boolean {\n\tconst childRelativePath = relative(parentPath, resolve(childPath));\n\treturn childRelativePath === \"\" || (!childRelativePath.startsWith(\"..\") && !isAbsolute(childRelativePath));\n}\n\nfunction matchDynamicRuleCached(\n\tcache: DynamicMatchCache,\n\tprojectRoot: string | null,\n\ttargetFile: string,\n\tcandidate: RuleCandidate,\n\tloadedRule: LoadedRule,\n\tmatchRuleImpl: typeof matchRule,\n): MatchReason | null {\n\tconst cacheKey = dynamicMatchCacheKey(projectRoot, targetFile, candidate, loadedRule.contentHash);\n\tif (cache.has(cacheKey)) {\n\t\tconst cachedReason = cache.get(cacheKey) ?? null;\n\t\tcache.delete(cacheKey);\n\t\tcache.set(cacheKey, cachedReason);\n\t\treturn cachedReason;\n\t}\n\n\tconst matchResult = matchRuleImpl({\n\t\tfrontmatter: loadedRule.frontmatter,\n\t\tisSingleFile: candidate.isSingleFile,\n\t\tpathBases: pathBasesForTarget(projectRoot, targetFile, candidate),\n\t});\n\tconst reason = matchResult.matched ? matchResult.reason : null;\n\tsetDynamicMatchCacheEntry(cache, cacheKey, reason);\n\treturn reason;\n}\n\nfunction setDynamicMatchCacheEntry(cache: DynamicMatchCache, cacheKey: string, reason: MatchReason | null): void {\n\tif (cache.size >= MAX_DYNAMIC_MATCH_CACHE_ENTRIES) {\n\t\tconst oldestCacheKey = cache.keys().next().value;\n\t\tif (oldestCacheKey !== undefined) {\n\t\t\tcache.delete(oldestCacheKey);\n\t\t}\n\t}\n\tcache.set(cacheKey, reason);\n}\n\nfunction dynamicMatchCacheKey(\n\tprojectRoot: string | null,\n\ttargetFile: string,\n\tcandidate: RuleCandidate,\n\tcontentHash: string,\n): string {\n\treturn [\n\t\tprojectRoot ?? \"\",\n\t\ttoPosixPath(resolve(targetFile)),\n\t\tcandidate.realPath,\n\t\tcandidate.relativePath,\n\t\tcandidate.source,\n\t\tcandidate.isGlobal ? \"global\" : \"project\",\n\t\tcandidate.isSingleFile ? \"single\" : \"multi\",\n\t\tString(candidate.distance),\n\t\tcontentHash,\n\t].join(\"\\0\");\n}\n\nfunction loadStaticCandidates(\n\tcandidates: ReadonlyArray<RuleCandidate>,\n\tdeps: EngineDeps,\n\tprojectRoot: string | null,\n\trealPathCache: RealPathCache,\n) {\n\tconst rules: LoadedRule[] = [];\n\tconst diagnostics: RuleDiagnostic[] = [];\n\tlet rootSingleFileSelected = false;\n\n\tfor (const candidate of sortCandidates(candidates)) {\n\t\tif (isDedupedRootSingleFile(candidate, rootSingleFileSelected)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst loadedRule = loadCandidate(candidate, deps, diagnostics, projectRoot, { realPathCache });\n\t\tif (loadedRule === null) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst matchReason = staticMatchReason(loadedRule);\n\t\tif (matchReason === null) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isRootSingleFile(candidate)) {\n\t\t\trootSingleFileSelected = true;\n\t\t}\n\n\t\trules.push({ ...loadedRule, matchReason });\n\t}\n\n\treturn { rules: sortCandidates(rules), diagnostics };\n}\n\nfunction loadCandidate(\n\tcandidate: RuleCandidate,\n\tdeps: EngineDeps,\n\tdiagnostics: RuleDiagnostic[],\n\tprojectRoot: string | null,\n\tcaches: LoadCandidateCaches,\n): (LoadedRule & { matchReason: MatchReason }) | null {\n\tif (!isCandidateWithinProjectCached(candidate, projectRoot, caches.projectMembership, caches.realPathCache)) {\n\t\tdiagnostics.push({\n\t\t\tseverity: \"warning\",\n\t\t\tsource: candidate.path,\n\t\t\tmessage: \"Rule file resolves outside project root\",\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst cachedContent = caches.loadedRuleContent?.get(candidate.realPath);\n\tif (cachedContent !== undefined) {\n\t\treturn loadedRuleFromContent(candidate, cachedContent, diagnostics);\n\t}\n\n\tconst content = deps.readFile(candidate.path);\n\tif (content === null) {\n\t\tcaches.loadedRuleContent?.set(candidate.realPath, null);\n\t\tdiagnostics.push({ severity: \"warning\", source: candidate.path, message: \"Unable to read rule file\" });\n\t\treturn null;\n\t}\n\n\tconst parsed = parseRule(content);\n\tconst loadedContent: LoadedRuleContent = {\n\t\tfrontmatter: parsed.frontmatter,\n\t\tbody: parsed.body,\n\t\tcontentHash: hashContent(content),\n\t};\n\tif (parsed.diagnostic !== undefined) loadedContent.diagnostic = parsed.diagnostic;\n\tcaches.loadedRuleContent?.set(candidate.realPath, loadedContent);\n\treturn loadedRuleFromContent(candidate, loadedContent, diagnostics);\n}\n\nfunction loadedRuleFromContent(\n\tcandidate: RuleCandidate,\n\tcontent: LoadedRuleContent | null,\n\tdiagnostics: RuleDiagnostic[],\n): (LoadedRule & { matchReason: MatchReason }) | null {\n\tif (content === null) {\n\t\tdiagnostics.push({ severity: \"warning\", source: candidate.path, message: \"Unable to read rule file\" });\n\t\treturn null;\n\t}\n\n\tif (content.diagnostic !== undefined) {\n\t\tdiagnostics.push({ severity: \"warning\", source: candidate.path, message: content.diagnostic });\n\t}\n\n\treturn {\n\t\t...candidate,\n\t\tfrontmatter: content.frontmatter,\n\t\tbody: content.body,\n\t\tcontentHash: content.contentHash,\n\t\tmatchReason: { kind: \"no-match\" },\n\t};\n}\n\nfunction ruleDedupKey(rule: LoadedRule): string {\n\treturn `${rule.realPath}::${rule.contentHash}`;\n}\n\nfunction isCandidateWithinProject(\n\tcandidate: RuleCandidate,\n\tprojectRoot: string | null,\n\trealPathCache: RealPathCache | undefined,\n): boolean {\n\tif (candidate.isGlobal) {\n\t\treturn true;\n\t}\n\n\tif (projectRoot === null) {\n\t\treturn false;\n\t}\n\n\tconst relativeRealPath = relative(realPathOrResolved(projectRoot, realPathCache), resolve(candidate.realPath));\n\treturn relativeRealPath === \"\" || (!relativeRealPath.startsWith(\"..\") && !isAbsolute(relativeRealPath));\n}\n\nfunction realPathOrResolved(path: string, cache: RealPathCache | undefined): string {\n\tconst cached = cache?.get(path);\n\tif (cached !== undefined) {\n\t\treturn cached;\n\t}\n\n\ttry {\n\t\tconst realPath = realpathSync.native(path);\n\t\tcache?.set(path, realPath);\n\t\treturn realPath;\n\t} catch {\n\t\tconst resolvedPath = resolve(path);\n\t\tcache?.set(path, resolvedPath);\n\t\treturn resolvedPath;\n\t}\n}\n\nfunction isCandidateWithinProjectCached(\n\tcandidate: RuleCandidate,\n\tprojectRoot: string | null,\n\tprojectMembership: CandidateProjectMembership | undefined,\n\trealPathCache: RealPathCache | undefined,\n): boolean {\n\tif (projectMembership === undefined) {\n\t\treturn isCandidateWithinProject(candidate, projectRoot, realPathCache);\n\t}\n\n\tconst cacheKey = `${projectRoot ?? \"\"}\\0${candidate.realPath}`;\n\tconst cached = projectMembership.get(cacheKey);\n\tif (cached !== undefined) {\n\t\treturn cached;\n\t}\n\n\tconst isWithinProject = isCandidateWithinProject(candidate, projectRoot, realPathCache);\n\tprojectMembership.set(cacheKey, isWithinProject);\n\treturn isWithinProject;\n}\n\nfunction findSortedCandidatesCached(\n\tcache: CandidateDiscoveryCache,\n\tfindCandidates: EngineDeps[\"findCandidates\"],\n\toptions: Parameters<EngineDeps[\"findCandidates\"]>[0],\n): RuleCandidate[] {\n\tconst cacheKey = candidateDiscoveryCacheKey(options);\n\tconst cached = cache.get(cacheKey);\n\tif (cached !== undefined) {\n\t\treturn cached;\n\t}\n\n\tconst candidates = sortCandidates(findCandidates(options));\n\tcache.set(cacheKey, candidates);\n\treturn candidates;\n}\n\nfunction candidateDiscoveryCacheKey(options: Parameters<EngineDeps[\"findCandidates\"]>[0]): string {\n\treturn [\n\t\toptions.projectRoot ?? \"\",\n\t\toptions.targetFile === null ? \"\" : dirname(resolve(options.targetFile)),\n\t\t...[...(options.disabledSources ?? [])].sort(),\n\t].join(\"\\0\");\n}\n\nfunction findProjectRootCached(\n\tcache: Map<string, string | null>,\n\ttargetFile: string,\n\tfindProjectRoot: EngineDeps[\"findProjectRoot\"],\n): string | null {\n\tconst cacheKey = dirname(resolve(targetFile));\n\tif (cache.has(cacheKey)) {\n\t\treturn cache.get(cacheKey) ?? null;\n\t}\n\n\tconst projectRoot = findProjectRoot(targetFile);\n\tcache.set(cacheKey, projectRoot);\n\treturn projectRoot;\n}\n\nfunction staticMatchReason(rule: LoadedRule): MatchReason | null {\n\tif (rule.frontmatter.alwaysApply === true) {\n\t\treturn \"alwaysApply\";\n\t}\n\n\tif (rule.isSingleFile) {\n\t\treturn \"single-file\";\n\t}\n\n\treturn null;\n}\n\nfunction disabledSourcesFor(config: PiRulesConfig): ReadonlySet<string> | undefined {\n\tif (config.enabledSources === \"auto\") {\n\t\treturn undefined;\n\t}\n\n\tconst enabledSources = new Set(config.enabledSources);\n\treturn new Set([...SOURCE_PRIORITY.keys()].filter((source) => !enabledSources.has(source)));\n}\n\nfunction isDedupedRootSingleFile(candidate: RuleCandidate, rootSingleFileSelected: boolean): boolean {\n\treturn rootSingleFileSelected && isRootSingleFile(candidate);\n}\n\nfunction isRootSingleFile(candidate: RuleCandidate): boolean {\n\treturn candidate.distance === 0 && candidate.isSingleFile && ROOT_SINGLE_FILE_SOURCES.has(candidate.source);\n}\n\nfunction pathBasesForTarget(\n\tprojectRoot: string | null,\n\ttargetFile: string,\n\tcandidate: RuleCandidate,\n): { projectRelative: string; scopeRelative?: string; basename: string } {\n\tconst targetBasename = basename(targetFile);\n\tif (projectRoot === null) {\n\t\treturn { projectRelative: targetBasename, basename: targetBasename };\n\t}\n\n\tconst projectRelative = toPosixPath(relative(projectRoot, targetFile));\n\tconst scopeDirectory = scopeDirectoryForCandidate(projectRoot, candidate);\n\tif (scopeDirectory === null) {\n\t\treturn { projectRelative, basename: targetBasename };\n\t}\n\n\treturn {\n\t\tprojectRelative,\n\t\tscopeRelative: toPosixPath(relative(scopeDirectory, targetFile)),\n\t\tbasename: targetBasename,\n\t};\n}\n\nfunction scopeDirectoryForCandidate(projectRoot: string, candidate: RuleCandidate): string | null {\n\tif (candidate.isGlobal) {\n\t\treturn null;\n\t}\n\n\tif (candidate.isSingleFile) {\n\t\treturn dirname(candidate.path);\n\t}\n\n\tconst sourceIndex = candidate.relativePath.indexOf(candidate.source);\n\tif (sourceIndex === -1) {\n\t\treturn projectRoot;\n\t}\n\n\tconst scopeRelativeDirectory = candidate.relativePath.slice(0, sourceIndex).replace(/\\/$/, \"\");\n\treturn scopeRelativeDirectory.length === 0 ? projectRoot : join(projectRoot, scopeRelativeDirectory);\n}\n\nfunction toPosixPath(path: string): string {\n\treturn path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction dynamicTargetCacheKey(targetFile: string): string {\n\treturn toPosixPath(resolve(targetFile));\n}\n\nfunction computeDynamicTargetFingerprint(\n\ttargetFile: string,\n\tprojectRoot: string | null,\n\tcandidates: ReadonlyArray<RuleCandidate>,\n\tconfig: PiRulesConfig,\n\tfileFingerprintFn: (filePath: string) => string,\n): string {\n\tconst candidateFingerprint = candidates\n\t\t.map((candidate) => fingerprintCandidate(candidate, fileFingerprintFn))\n\t\t.join(\"\\u0001\");\n\treturn hashContent(\n\t\t[\n\t\t\t\"v1\",\n\t\t\tconfig.enabledSources === \"auto\" ? \"auto\" : config.enabledSources.join(\",\"),\n\t\t\tprojectRoot ?? \"\",\n\t\t\tdynamicTargetCacheKey(targetFile),\n\t\t\tcandidateFingerprint,\n\t\t].join(\"\\u0000\"),\n\t);\n}\n\nfunction fingerprintCandidate(candidate: RuleCandidate, fileFingerprintFn: (filePath: string) => string): string {\n\treturn [\n\t\tcandidate.realPath,\n\t\tcandidate.relativePath,\n\t\tcandidate.source,\n\t\tcandidate.isGlobal ? \"global\" : \"project\",\n\t\tcandidate.isSingleFile ? \"single\" : \"multi\",\n\t\tString(candidate.distance),\n\t\tfileFingerprintFn(candidate.path),\n\t].join(\"\\u0000\");\n}\n\nfunction fileStatFingerprint(filePath: string): string {\n\ttry {\n\t\tconst stats = statSync(filePath, { bigint: true });\n\t\treturn `${stats.mtimeNs}:${stats.ctimeNs}:${stats.size}`;\n\t} catch {\n\t\treturn \"missing\";\n\t}\n}\n\nfunction uniqueStrings(values: ReadonlyArray<string>): string[] {\n\treturn [...new Set(values)];\n}\n\nfunction storeLastLoad(\n\tstate: SessionState,\n\trules: ReadonlyArray<LoadedRule>,\n\tdiagnostics: ReadonlyArray<RuleDiagnostic>,\n): void {\n\tstate.loadedRules.length = 0;\n\tstate.loadedRules.push(...rules);\n\tstate.diagnostics.length = 0;\n\tstate.diagnostics.push(...diagnostics);\n}\n\nfunction emptyLoadResult(state: SessionState): { rules: LoadedRule[]; diagnostics: RuleDiagnostic[] } {\n\tstoreLastLoad(state, [], []);\n\treturn { rules: [], diagnostics: [] };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,0BAA2B,SAAQ,KAAK;IACpD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IACnD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class UnsupportedRuleSourceError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = "UnsupportedRuleSourceError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class RuleFrontmatterParseError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "RuleFrontmatterParseError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACpD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC1C,CAAC;CACD;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACnD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IACzC,CAAC;CACD","sourcesContent":["export class UnsupportedRuleSourceError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"UnsupportedRuleSourceError\";\n\t}\n}\n\nexport class RuleFrontmatterParseError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"RuleFrontmatterParseError\";\n\t}\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { scanRuleFiles } from "./scanner.ts";
|
|
2
|
+
import type { RuleCandidate } from "./types.ts";
|
|
3
|
+
interface SingleFileInfo {
|
|
4
|
+
path: string;
|
|
5
|
+
realPath: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RuleDiscoveryCache {
|
|
8
|
+
scannedRuleFiles: Map<string, ReturnType<typeof scanRuleFiles>>;
|
|
9
|
+
singleFileInfo: Map<string, SingleFileInfo | null>;
|
|
10
|
+
}
|
|
11
|
+
export interface FinderOptions {
|
|
12
|
+
/** Project root absolute path (use findProjectRoot to get this). */
|
|
13
|
+
projectRoot: string | null;
|
|
14
|
+
/** Target file path (used for distance calculation in dynamic injection mode). null for static mode. */
|
|
15
|
+
targetFile: string | null;
|
|
16
|
+
/** User home directory (default: os.homedir()). Injectable for tests. */
|
|
17
|
+
homeDir?: string;
|
|
18
|
+
/** Set of disabled sources to omit from discovery. Empty by default. */
|
|
19
|
+
disabledSources?: ReadonlySet<string>;
|
|
20
|
+
/** Whether to skip user-home rules. Default: false. */
|
|
21
|
+
skipUserHome?: boolean;
|
|
22
|
+
cache?: RuleDiscoveryCache;
|
|
23
|
+
}
|
|
24
|
+
export declare function createRuleDiscoveryCache(): RuleDiscoveryCache;
|
|
25
|
+
export declare function findRuleCandidates(options: FinderOptions): RuleCandidate[];
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finder.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/finder.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAE5D,UAAU,cAAc;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;IAChE,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,aAAa;IAC7B,oEAAoE;IACpE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wGAAwG;IACxG,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC3B;AAOD,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,EAAE,CAqB1E"}
|