@code-yeongyu/senpi 2026.6.15 → 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 +54 -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/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/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/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/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 +88 -74
- 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 +124 -132
- 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/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,127 @@
|
|
|
1
|
+
import { readFileSync, realpathSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, relative } from "node:path";
|
|
3
|
+
import { registerSlashCommands } from "./commands.js";
|
|
4
|
+
import { createEngine, defaultConfig } from "./rules/engine.js";
|
|
5
|
+
import { findRuleCandidates } from "./rules/finder.js";
|
|
6
|
+
import { findProjectRoot } from "./rules/project-root.js";
|
|
7
|
+
import { extractToolPaths } from "./rules/tool-paths.js";
|
|
8
|
+
const MODE_VALUES = new Set(["static", "dynamic", "both", "off"]);
|
|
9
|
+
export default function piRulesExtension(pi) {
|
|
10
|
+
pi.registerFlag("pi-rules-disabled", {
|
|
11
|
+
type: "boolean",
|
|
12
|
+
default: false,
|
|
13
|
+
description: "Disable pi-rules hooks.",
|
|
14
|
+
});
|
|
15
|
+
pi.registerFlag("pi-rules-mode", {
|
|
16
|
+
type: "string",
|
|
17
|
+
default: "both",
|
|
18
|
+
description: "Rule injection mode: static, dynamic, both, or off.",
|
|
19
|
+
});
|
|
20
|
+
const config = defaultConfig();
|
|
21
|
+
const engine = createEngine(config, {
|
|
22
|
+
findCandidates: findRuleCandidates,
|
|
23
|
+
readFile: (path) => {
|
|
24
|
+
try {
|
|
25
|
+
return readFileSync(path, "utf-8");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
findProjectRoot,
|
|
32
|
+
extractToolPaths,
|
|
33
|
+
});
|
|
34
|
+
registerSlashCommands(pi, engine);
|
|
35
|
+
function syncConfigFromFlags() {
|
|
36
|
+
const disabled = pi.getFlag("pi-rules-disabled");
|
|
37
|
+
const mode = pi.getFlag("pi-rules-mode");
|
|
38
|
+
if (typeof disabled === "boolean") {
|
|
39
|
+
engine.config.disabled = disabled;
|
|
40
|
+
}
|
|
41
|
+
if (typeof mode === "string" && isPiRulesMode(mode)) {
|
|
42
|
+
engine.config.mode = mode;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
pi.on("session_start", async (event, ctx) => {
|
|
46
|
+
syncConfigFromFlags();
|
|
47
|
+
if (engine.config.disabled) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
engine.resetSession(ctx.cwd);
|
|
51
|
+
pi.appendEntry("pi-rules.scan", { cwd: ctx.cwd, reason: event.reason });
|
|
52
|
+
return undefined;
|
|
53
|
+
});
|
|
54
|
+
pi.on("session_compact", async (_event, ctx) => {
|
|
55
|
+
engine.resetSession(ctx.cwd);
|
|
56
|
+
pi.appendEntry("pi-rules.scan", { cwd: ctx.cwd, reason: "compact" });
|
|
57
|
+
return undefined;
|
|
58
|
+
});
|
|
59
|
+
pi.on("before_agent_start", async (event, ctx) => {
|
|
60
|
+
syncConfigFromFlags();
|
|
61
|
+
if (engine.config.disabled || engine.config.mode === "off" || engine.config.mode === "dynamic") {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const loaded = engine.loadStaticRules(ctx.cwd);
|
|
65
|
+
const nativeContextPaths = new Set(event.systemPromptOptions.contextFiles?.flatMap((contextFile) => pathKeys(contextFile.path)) ?? []);
|
|
66
|
+
for (const rule of loaded.rules) {
|
|
67
|
+
if (nativeContextPaths.has(rule.path) || nativeContextPaths.has(rule.realPath)) {
|
|
68
|
+
engine.markStaticInjected(rule);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const rules = loaded.rules.filter((rule) => !nativeContextPaths.has(rule.path) &&
|
|
72
|
+
!nativeContextPaths.has(rule.realPath) &&
|
|
73
|
+
!engine.isStaticInjected(rule));
|
|
74
|
+
if (rules.length === 0) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
const block = engine.formatStatic(rules);
|
|
78
|
+
for (const rule of rules) {
|
|
79
|
+
engine.markStaticInjected(rule);
|
|
80
|
+
}
|
|
81
|
+
return { systemPrompt: event.systemPrompt + block };
|
|
82
|
+
});
|
|
83
|
+
pi.on("tool_result", async (event, ctx) => {
|
|
84
|
+
syncConfigFromFlags();
|
|
85
|
+
if (engine.config.disabled || engine.config.mode === "off" || engine.config.mode === "static" || event.isError) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
const targetPaths = extractToolPaths(event, ctx.cwd);
|
|
89
|
+
const firstTargetPath = targetPaths[0];
|
|
90
|
+
if (firstTargetPath === undefined) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const fingerprints = engine.fingerprintDynamicTargets(ctx.cwd, targetPaths);
|
|
94
|
+
const pendingFingerprints = fingerprints.filter((target) => !engine.isDynamicTargetFingerprintCurrent(target));
|
|
95
|
+
if (pendingFingerprints.length === 0) {
|
|
96
|
+
engine.commitDynamicTargetFingerprints(fingerprints);
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
const loaded = engine.loadDynamicRules(ctx.cwd, pendingFingerprints.map((target) => target.targetPath));
|
|
100
|
+
engine.commitDynamicTargetFingerprints(fingerprints);
|
|
101
|
+
const rules = loaded.rules.filter((rule) => !engine.isStaticInjected(rule) && !engine.isDynamicInjected(firstTargetPath, rule));
|
|
102
|
+
if (rules.length === 0) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
const firstPendingTarget = pendingFingerprints[0]?.targetPath ?? firstTargetPath;
|
|
106
|
+
const block = engine.formatDynamic(rules, displayPath(ctx.cwd, firstPendingTarget));
|
|
107
|
+
for (const rule of rules) {
|
|
108
|
+
engine.markDynamicInjected(firstTargetPath, rule);
|
|
109
|
+
}
|
|
110
|
+
return { content: [...event.content, { type: "text", text: block }] };
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function isPiRulesMode(value) {
|
|
114
|
+
return MODE_VALUES.has(value);
|
|
115
|
+
}
|
|
116
|
+
function pathKeys(filePath) {
|
|
117
|
+
try {
|
|
118
|
+
return [filePath, realpathSync.native(filePath)];
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return [filePath];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function displayPath(cwd, filePath) {
|
|
125
|
+
return isAbsolute(filePath) ? relative(cwd, filePath) : filePath;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/rules/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, realpathSync } from \"node:fs\";\nimport { isAbsolute, relative } from \"node:path\";\n\nimport type { ExtensionAPI } from \"../../types.ts\";\n\nimport { registerSlashCommands } from \"./commands.ts\";\nimport { createEngine, defaultConfig } from \"./rules/engine.ts\";\nimport { findRuleCandidates } from \"./rules/finder.ts\";\nimport { findProjectRoot } from \"./rules/project-root.ts\";\nimport { extractToolPaths } from \"./rules/tool-paths.ts\";\nimport type { PiRulesConfig } from \"./rules/types.ts\";\n\ntype PiRulesMode = PiRulesConfig[\"mode\"];\n\nconst MODE_VALUES = new Set<string>([\"static\", \"dynamic\", \"both\", \"off\"]);\n\nexport default function piRulesExtension(pi: ExtensionAPI): void {\n\tpi.registerFlag(\"pi-rules-disabled\", {\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t\tdescription: \"Disable pi-rules hooks.\",\n\t});\n\tpi.registerFlag(\"pi-rules-mode\", {\n\t\ttype: \"string\",\n\t\tdefault: \"both\",\n\t\tdescription: \"Rule injection mode: static, dynamic, both, or off.\",\n\t});\n\tconst config = defaultConfig();\n\tconst engine = createEngine(config, {\n\t\tfindCandidates: findRuleCandidates,\n\t\treadFile: (path) => {\n\t\t\ttry {\n\t\t\t\treturn readFileSync(path, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tfindProjectRoot,\n\t\textractToolPaths,\n\t});\n\tregisterSlashCommands(pi, engine);\n\n\tfunction syncConfigFromFlags(): void {\n\t\tconst disabled = pi.getFlag(\"pi-rules-disabled\");\n\t\tconst mode = pi.getFlag(\"pi-rules-mode\");\n\n\t\tif (typeof disabled === \"boolean\") {\n\t\t\tengine.config.disabled = disabled;\n\t\t}\n\t\tif (typeof mode === \"string\" && isPiRulesMode(mode)) {\n\t\t\tengine.config.mode = mode;\n\t\t}\n\t}\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tengine.resetSession(ctx.cwd);\n\t\tpi.appendEntry(\"pi-rules.scan\", { cwd: ctx.cwd, reason: event.reason });\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_compact\", async (_event, ctx) => {\n\t\tengine.resetSession(ctx.cwd);\n\t\tpi.appendEntry(\"pi-rules.scan\", { cwd: ctx.cwd, reason: \"compact\" });\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled || engine.config.mode === \"off\" || engine.config.mode === \"dynamic\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst loaded = engine.loadStaticRules(ctx.cwd);\n\t\tconst nativeContextPaths = new Set(\n\t\t\tevent.systemPromptOptions.contextFiles?.flatMap((contextFile) => pathKeys(contextFile.path)) ?? [],\n\t\t);\n\t\tfor (const rule of loaded.rules) {\n\t\t\tif (nativeContextPaths.has(rule.path) || nativeContextPaths.has(rule.realPath)) {\n\t\t\t\tengine.markStaticInjected(rule);\n\t\t\t}\n\t\t}\n\t\tconst rules = loaded.rules.filter(\n\t\t\t(rule) =>\n\t\t\t\t!nativeContextPaths.has(rule.path) &&\n\t\t\t\t!nativeContextPaths.has(rule.realPath) &&\n\t\t\t\t!engine.isStaticInjected(rule),\n\t\t);\n\n\t\tif (rules.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst block = engine.formatStatic(rules);\n\t\tfor (const rule of rules) {\n\t\t\tengine.markStaticInjected(rule);\n\t\t}\n\n\t\treturn { systemPrompt: event.systemPrompt + block };\n\t});\n\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tsyncConfigFromFlags();\n\t\tif (engine.config.disabled || engine.config.mode === \"off\" || engine.config.mode === \"static\" || event.isError) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst targetPaths = extractToolPaths(event, ctx.cwd);\n\t\tconst firstTargetPath = targetPaths[0];\n\t\tif (firstTargetPath === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst fingerprints = engine.fingerprintDynamicTargets(ctx.cwd, targetPaths);\n\t\tconst pendingFingerprints = fingerprints.filter((target) => !engine.isDynamicTargetFingerprintCurrent(target));\n\t\tif (pendingFingerprints.length === 0) {\n\t\t\tengine.commitDynamicTargetFingerprints(fingerprints);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst loaded = engine.loadDynamicRules(\n\t\t\tctx.cwd,\n\t\t\tpendingFingerprints.map((target) => target.targetPath),\n\t\t);\n\t\tengine.commitDynamicTargetFingerprints(fingerprints);\n\t\tconst rules = loaded.rules.filter(\n\t\t\t(rule) => !engine.isStaticInjected(rule) && !engine.isDynamicInjected(firstTargetPath, rule),\n\t\t);\n\t\tif (rules.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst firstPendingTarget = pendingFingerprints[0]?.targetPath ?? firstTargetPath;\n\t\tconst block = engine.formatDynamic(rules, displayPath(ctx.cwd, firstPendingTarget));\n\t\tfor (const rule of rules) {\n\t\t\tengine.markDynamicInjected(firstTargetPath, rule);\n\t\t}\n\n\t\treturn { content: [...event.content, { type: \"text\", text: block }] };\n\t});\n}\n\nfunction isPiRulesMode(value: string): value is PiRulesMode {\n\treturn MODE_VALUES.has(value);\n}\n\nfunction pathKeys(filePath: string): string[] {\n\ttry {\n\t\treturn [filePath, realpathSync.native(filePath)];\n\t} catch {\n\t\treturn [filePath];\n\t}\n}\n\nfunction displayPath(cwd: string, filePath: string): string {\n\treturn isAbsolute(filePath) ? relative(cwd, filePath) : filePath;\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LoadedRule, SessionState } from "./types.ts";
|
|
2
|
+
export declare function createSessionState(cwd?: string): SessionState;
|
|
3
|
+
export declare function staticDedupKey(cwd: string, rulePath: string, contentHash: string): string;
|
|
4
|
+
export declare function dynamicDedupKey(scopeKey: string, rulePath: string, contentHash: string): string;
|
|
5
|
+
export declare function markStaticInjected(state: SessionState, rule: LoadedRule): boolean;
|
|
6
|
+
export declare function markDynamicInjected(state: SessionState, scopeKey: string, rule: LoadedRule): boolean;
|
|
7
|
+
export declare function isStaticInjected(state: SessionState, rule: LoadedRule): boolean;
|
|
8
|
+
export declare function isDynamicInjected(state: SessionState, scopeKey: string, rule: LoadedRule): boolean;
|
|
9
|
+
export declare function clearSession(state: SessionState): void;
|
|
10
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAS7D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE/F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAQjF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAcpG;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAE/E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAElG;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAMtD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export function createSessionState(cwd) {
|
|
2
|
+
return {
|
|
3
|
+
cwd,
|
|
4
|
+
staticDedup: new Set(),
|
|
5
|
+
dynamicDedup: new Map(),
|
|
6
|
+
dynamicTargetFingerprints: new Map(),
|
|
7
|
+
loadedRules: [],
|
|
8
|
+
diagnostics: [],
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function staticDedupKey(cwd, rulePath, contentHash) {
|
|
12
|
+
return `${cwd}::${rulePath}::${contentHash}`;
|
|
13
|
+
}
|
|
14
|
+
export function dynamicDedupKey(scopeKey, rulePath, contentHash) {
|
|
15
|
+
return `${scopeKey}::${rulePath}::${contentHash}`;
|
|
16
|
+
}
|
|
17
|
+
export function markStaticInjected(state, rule) {
|
|
18
|
+
const key = staticDedupKey(state.cwd ?? "", rule.realPath, rule.contentHash);
|
|
19
|
+
if (state.staticDedup.has(key)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
state.staticDedup.add(key);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
export function markDynamicInjected(state, scopeKey, rule) {
|
|
26
|
+
let keys = state.dynamicDedup.get(scopeKey);
|
|
27
|
+
if (keys === undefined) {
|
|
28
|
+
keys = new Set();
|
|
29
|
+
state.dynamicDedup.set(scopeKey, keys);
|
|
30
|
+
}
|
|
31
|
+
const key = dynamicDedupKey(scopeKey, rule.realPath, rule.contentHash);
|
|
32
|
+
if (keys.has(key)) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
keys.add(key);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
export function isStaticInjected(state, rule) {
|
|
39
|
+
return state.staticDedup.has(staticDedupKey(state.cwd ?? "", rule.realPath, rule.contentHash));
|
|
40
|
+
}
|
|
41
|
+
export function isDynamicInjected(state, scopeKey, rule) {
|
|
42
|
+
return state.dynamicDedup.get(scopeKey)?.has(dynamicDedupKey(scopeKey, rule.realPath, rule.contentHash)) === true;
|
|
43
|
+
}
|
|
44
|
+
export function clearSession(state) {
|
|
45
|
+
state.staticDedup.clear();
|
|
46
|
+
state.dynamicDedup.clear();
|
|
47
|
+
state.dynamicTargetFingerprints.clear();
|
|
48
|
+
state.loadedRules.length = 0;
|
|
49
|
+
state.diagnostics.length = 0;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/cache.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC9C,OAAO;QACN,GAAG;QACH,WAAW,EAAE,IAAI,GAAG,EAAE;QACtB,YAAY,EAAE,IAAI,GAAG,EAAE;QACvB,yBAAyB,EAAE,IAAI,GAAG,EAAE;QACpC,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE;KACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAgB,EAAE,WAAmB;IAChF,OAAO,GAAG,GAAG,KAAK,QAAQ,KAAK,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAAmB;IACtF,OAAO,GAAG,QAAQ,KAAK,QAAQ,KAAK,WAAW,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAmB,EAAE,IAAgB;IACvE,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAmB,EAAE,QAAgB,EAAE,IAAgB;IAC1F,IAAI,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACvE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAmB,EAAE,IAAgB;IACrE,OAAO,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAmB,EAAE,QAAgB,EAAE,IAAgB;IACxF,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC/C,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC1B,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC3B,KAAK,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;IACxC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["import type { LoadedRule, SessionState } from \"./types.ts\";\n\nexport function createSessionState(cwd?: string): SessionState {\n\treturn {\n\t\tcwd,\n\t\tstaticDedup: new Set(),\n\t\tdynamicDedup: new Map(),\n\t\tdynamicTargetFingerprints: new Map(),\n\t\tloadedRules: [],\n\t\tdiagnostics: [],\n\t};\n}\n\nexport function staticDedupKey(cwd: string, rulePath: string, contentHash: string): string {\n\treturn `${cwd}::${rulePath}::${contentHash}`;\n}\n\nexport function dynamicDedupKey(scopeKey: string, rulePath: string, contentHash: string): string {\n\treturn `${scopeKey}::${rulePath}::${contentHash}`;\n}\n\nexport function markStaticInjected(state: SessionState, rule: LoadedRule): boolean {\n\tconst key = staticDedupKey(state.cwd ?? \"\", rule.realPath, rule.contentHash);\n\tif (state.staticDedup.has(key)) {\n\t\treturn false;\n\t}\n\n\tstate.staticDedup.add(key);\n\treturn true;\n}\n\nexport function markDynamicInjected(state: SessionState, scopeKey: string, rule: LoadedRule): boolean {\n\tlet keys = state.dynamicDedup.get(scopeKey);\n\tif (keys === undefined) {\n\t\tkeys = new Set();\n\t\tstate.dynamicDedup.set(scopeKey, keys);\n\t}\n\n\tconst key = dynamicDedupKey(scopeKey, rule.realPath, rule.contentHash);\n\tif (keys.has(key)) {\n\t\treturn false;\n\t}\n\n\tkeys.add(key);\n\treturn true;\n}\n\nexport function isStaticInjected(state: SessionState, rule: LoadedRule): boolean {\n\treturn state.staticDedup.has(staticDedupKey(state.cwd ?? \"\", rule.realPath, rule.contentHash));\n}\n\nexport function isDynamicInjected(state: SessionState, scopeKey: string, rule: LoadedRule): boolean {\n\treturn state.dynamicDedup.get(scopeKey)?.has(dynamicDedupKey(scopeKey, rule.realPath, rule.contentHash)) === true;\n}\n\nexport function clearSession(state: SessionState): void {\n\tstate.staticDedup.clear();\n\tstate.dynamicDedup.clear();\n\tstate.dynamicTargetFingerprints.clear();\n\tstate.loadedRules.length = 0;\n\tstate.diagnostics.length = 0;\n}\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { RuleSource } from "./types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Project root marker files / directories used by `findProjectRoot`.
|
|
4
|
+
* Walks UP from cwd until any of these is found in the directory.
|
|
5
|
+
*/
|
|
6
|
+
export declare const PROJECT_MARKERS: readonly string[];
|
|
7
|
+
/**
|
|
8
|
+
* Project rule subdirectories. First tuple element is the parent dir under
|
|
9
|
+
* the project root, second is the subdir scanned recursively.
|
|
10
|
+
*/
|
|
11
|
+
export declare const PROJECT_RULE_SUBDIRS: ReadonlyArray<readonly [string, string]>;
|
|
12
|
+
/**
|
|
13
|
+
* Single-file project rules (always apply, frontmatter optional).
|
|
14
|
+
*/
|
|
15
|
+
export declare const PROJECT_SINGLE_FILES: readonly string[];
|
|
16
|
+
/**
|
|
17
|
+
* User-home rule directories.
|
|
18
|
+
*/
|
|
19
|
+
export declare const USER_HOME_RULE_SUBDIRS: readonly string[];
|
|
20
|
+
/**
|
|
21
|
+
* User-home single-file rules. The first one to exist wins per "first-match" semantics.
|
|
22
|
+
*/
|
|
23
|
+
export declare const USER_HOME_SINGLE_FILES: readonly string[];
|
|
24
|
+
/**
|
|
25
|
+
* File extensions accepted as rule files in scanned directories.
|
|
26
|
+
*/
|
|
27
|
+
export declare const RULE_FILE_EXTENSIONS: readonly string[];
|
|
28
|
+
/**
|
|
29
|
+
* Per-rule source priority for deterministic ordering. Lower = earlier.
|
|
30
|
+
*/
|
|
31
|
+
export declare const SOURCE_PRIORITY: ReadonlyMap<RuleSource, number>;
|
|
32
|
+
/**
|
|
33
|
+
* Distance value assigned to global / user-home rules.
|
|
34
|
+
*/
|
|
35
|
+
export declare const GLOBAL_DISTANCE = 9999;
|
|
36
|
+
/**
|
|
37
|
+
* Per-rule body character cap (default).
|
|
38
|
+
*/
|
|
39
|
+
export declare const DEFAULT_MAX_RULE_CHARS = 12000;
|
|
40
|
+
/**
|
|
41
|
+
* Total injected chars per tool result (default).
|
|
42
|
+
*/
|
|
43
|
+
export declare const DEFAULT_MAX_RESULT_CHARS = 40000;
|
|
44
|
+
/**
|
|
45
|
+
* Truncation marker template. `{path}` is replaced with the relative path.
|
|
46
|
+
*/
|
|
47
|
+
export declare const TRUNCATION_NOTICE = "\n\n[Rule truncated. Read full rule: {path}]";
|
|
48
|
+
/**
|
|
49
|
+
* Built-in tool names whose results trigger dynamic rule injection.
|
|
50
|
+
*/
|
|
51
|
+
export declare const TRACKED_BUILTIN_TOOLS: readonly string[];
|
|
52
|
+
export declare const TRACKED_BUILTIN_TOOL_SET: ReadonlySet<string>;
|
|
53
|
+
/**
|
|
54
|
+
* Directories excluded by the recursive scanner regardless of glob settings.
|
|
55
|
+
*/
|
|
56
|
+
export declare const SCANNER_EXCLUDED_DIRS: readonly string[];
|
|
57
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAQ5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAKzE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAKjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAuD,CAAC;AAE5G;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAAwD,CAAC;AAE7G;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAoB,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,UAAU,EAAE,MAAM,CAc1D,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,iBAAiB,iDAAiD,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAA8B,CAAC;AAClF,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAkC,CAAC;AAE5F;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAQlD,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project root marker files / directories used by `findProjectRoot`.
|
|
3
|
+
* Walks UP from cwd until any of these is found in the directory.
|
|
4
|
+
*/
|
|
5
|
+
export const PROJECT_MARKERS = [
|
|
6
|
+
".git",
|
|
7
|
+
"pnpm-workspace.yaml",
|
|
8
|
+
"package.json",
|
|
9
|
+
"pyproject.toml",
|
|
10
|
+
"Cargo.toml",
|
|
11
|
+
"go.mod",
|
|
12
|
+
".venv",
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Project rule subdirectories. First tuple element is the parent dir under
|
|
16
|
+
* the project root, second is the subdir scanned recursively.
|
|
17
|
+
*/
|
|
18
|
+
export const PROJECT_RULE_SUBDIRS = [
|
|
19
|
+
[".omo", "rules"],
|
|
20
|
+
[".claude", "rules"],
|
|
21
|
+
[".cursor", "rules"],
|
|
22
|
+
[".github", "instructions"],
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Single-file project rules (always apply, frontmatter optional).
|
|
26
|
+
*/
|
|
27
|
+
export const PROJECT_SINGLE_FILES = [
|
|
28
|
+
".github/copilot-instructions.md",
|
|
29
|
+
"AGENTS.md",
|
|
30
|
+
"CLAUDE.md",
|
|
31
|
+
"CONTEXT.md",
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* User-home rule directories.
|
|
35
|
+
*/
|
|
36
|
+
export const USER_HOME_RULE_SUBDIRS = [".omo/rules", ".opencode/rules", ".claude/rules"];
|
|
37
|
+
/**
|
|
38
|
+
* User-home single-file rules. The first one to exist wins per "first-match" semantics.
|
|
39
|
+
*/
|
|
40
|
+
export const USER_HOME_SINGLE_FILES = [".config/opencode/AGENTS.md", ".claude/CLAUDE.md"];
|
|
41
|
+
/**
|
|
42
|
+
* File extensions accepted as rule files in scanned directories.
|
|
43
|
+
*/
|
|
44
|
+
export const RULE_FILE_EXTENSIONS = [".md", ".mdc"];
|
|
45
|
+
/**
|
|
46
|
+
* Per-rule source priority for deterministic ordering. Lower = earlier.
|
|
47
|
+
*/
|
|
48
|
+
export const SOURCE_PRIORITY = new Map([
|
|
49
|
+
[".omo/rules", 0],
|
|
50
|
+
[".claude/rules", 1],
|
|
51
|
+
[".cursor/rules", 2],
|
|
52
|
+
[".github/instructions", 3],
|
|
53
|
+
[".github/copilot-instructions.md", 4],
|
|
54
|
+
["AGENTS.md", 5],
|
|
55
|
+
["CLAUDE.md", 6],
|
|
56
|
+
["CONTEXT.md", 7],
|
|
57
|
+
["~/.omo/rules", 100],
|
|
58
|
+
["~/.opencode/rules", 101],
|
|
59
|
+
["~/.claude/rules", 102],
|
|
60
|
+
["~/.config/opencode/AGENTS.md", 103],
|
|
61
|
+
["~/.claude/CLAUDE.md", 104],
|
|
62
|
+
]);
|
|
63
|
+
/**
|
|
64
|
+
* Distance value assigned to global / user-home rules.
|
|
65
|
+
*/
|
|
66
|
+
export const GLOBAL_DISTANCE = 9999;
|
|
67
|
+
/**
|
|
68
|
+
* Per-rule body character cap (default).
|
|
69
|
+
*/
|
|
70
|
+
export const DEFAULT_MAX_RULE_CHARS = 12000;
|
|
71
|
+
/**
|
|
72
|
+
* Total injected chars per tool result (default).
|
|
73
|
+
*/
|
|
74
|
+
export const DEFAULT_MAX_RESULT_CHARS = 40000;
|
|
75
|
+
/**
|
|
76
|
+
* Truncation marker template. `{path}` is replaced with the relative path.
|
|
77
|
+
*/
|
|
78
|
+
export const TRUNCATION_NOTICE = "\n\n[Rule truncated. Read full rule: {path}]";
|
|
79
|
+
/**
|
|
80
|
+
* Built-in tool names whose results trigger dynamic rule injection.
|
|
81
|
+
*/
|
|
82
|
+
export const TRACKED_BUILTIN_TOOLS = ["read", "edit", "write"];
|
|
83
|
+
export const TRACKED_BUILTIN_TOOL_SET = new Set(TRACKED_BUILTIN_TOOLS);
|
|
84
|
+
/**
|
|
85
|
+
* Directories excluded by the recursive scanner regardless of glob settings.
|
|
86
|
+
*/
|
|
87
|
+
export const SCANNER_EXCLUDED_DIRS = [
|
|
88
|
+
"node_modules",
|
|
89
|
+
".git",
|
|
90
|
+
"dist",
|
|
91
|
+
"build",
|
|
92
|
+
".turbo",
|
|
93
|
+
".next",
|
|
94
|
+
"coverage",
|
|
95
|
+
];
|
|
96
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/constants.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsB;IACjD,MAAM;IACN,qBAAqB;IACrB,cAAc;IACd,gBAAgB;IAChB,YAAY;IACZ,QAAQ;IACR,OAAO;CACP,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA6C;IAC7E,CAAC,MAAM,EAAE,OAAO,CAAC;IACjB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACtD,iCAAiC;IACjC,WAAW;IACX,WAAW;IACX,YAAY;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,YAAY,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;AAE5G;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,4BAA4B,EAAE,mBAAmB,CAAC,CAAC;AAE7G;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAoC,IAAI,GAAG,CAAC;IACvE,CAAC,YAAY,EAAE,CAAC,CAAC;IACjB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpB,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC3B,CAAC,iCAAiC,EAAE,CAAC,CAAC;IACtC,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,WAAW,EAAE,CAAC,CAAC;IAChB,CAAC,YAAY,EAAE,CAAC,CAAC;IACjB,CAAC,cAAc,EAAE,GAAG,CAAC;IACrB,CAAC,mBAAmB,EAAE,GAAG,CAAC;IAC1B,CAAC,iBAAiB,EAAE,GAAG,CAAC;IACxB,CAAC,8BAA8B,EAAE,GAAG,CAAC;IACrC,CAAC,qBAAqB,EAAE,GAAG,CAAC;CAC5B,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,8CAA8C,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAE5F;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACvD,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;CACV,CAAC","sourcesContent":["import type { RuleSource } from \"./types.ts\";\n\n/**\n * Project root marker files / directories used by `findProjectRoot`.\n * Walks UP from cwd until any of these is found in the directory.\n */\nexport const PROJECT_MARKERS: readonly string[] = [\n\t\".git\",\n\t\"pnpm-workspace.yaml\",\n\t\"package.json\",\n\t\"pyproject.toml\",\n\t\"Cargo.toml\",\n\t\"go.mod\",\n\t\".venv\",\n];\n\n/**\n * Project rule subdirectories. First tuple element is the parent dir under\n * the project root, second is the subdir scanned recursively.\n */\nexport const PROJECT_RULE_SUBDIRS: ReadonlyArray<readonly [string, string]> = [\n\t[\".omo\", \"rules\"],\n\t[\".claude\", \"rules\"],\n\t[\".cursor\", \"rules\"],\n\t[\".github\", \"instructions\"],\n];\n\n/**\n * Single-file project rules (always apply, frontmatter optional).\n */\nexport const PROJECT_SINGLE_FILES: readonly string[] = [\n\t\".github/copilot-instructions.md\",\n\t\"AGENTS.md\",\n\t\"CLAUDE.md\",\n\t\"CONTEXT.md\",\n];\n\n/**\n * User-home rule directories.\n */\nexport const USER_HOME_RULE_SUBDIRS: readonly string[] = [\".omo/rules\", \".opencode/rules\", \".claude/rules\"];\n\n/**\n * User-home single-file rules. The first one to exist wins per \"first-match\" semantics.\n */\nexport const USER_HOME_SINGLE_FILES: readonly string[] = [\".config/opencode/AGENTS.md\", \".claude/CLAUDE.md\"];\n\n/**\n * File extensions accepted as rule files in scanned directories.\n */\nexport const RULE_FILE_EXTENSIONS: readonly string[] = [\".md\", \".mdc\"];\n\n/**\n * Per-rule source priority for deterministic ordering. Lower = earlier.\n */\nexport const SOURCE_PRIORITY: ReadonlyMap<RuleSource, number> = new Map([\n\t[\".omo/rules\", 0],\n\t[\".claude/rules\", 1],\n\t[\".cursor/rules\", 2],\n\t[\".github/instructions\", 3],\n\t[\".github/copilot-instructions.md\", 4],\n\t[\"AGENTS.md\", 5],\n\t[\"CLAUDE.md\", 6],\n\t[\"CONTEXT.md\", 7],\n\t[\"~/.omo/rules\", 100],\n\t[\"~/.opencode/rules\", 101],\n\t[\"~/.claude/rules\", 102],\n\t[\"~/.config/opencode/AGENTS.md\", 103],\n\t[\"~/.claude/CLAUDE.md\", 104],\n]);\n\n/**\n * Distance value assigned to global / user-home rules.\n */\nexport const GLOBAL_DISTANCE = 9999;\n\n/**\n * Per-rule body character cap (default).\n */\nexport const DEFAULT_MAX_RULE_CHARS = 12000;\n\n/**\n * Total injected chars per tool result (default).\n */\nexport const DEFAULT_MAX_RESULT_CHARS = 40000;\n\n/**\n * Truncation marker template. `{path}` is replaced with the relative path.\n */\nexport const TRUNCATION_NOTICE = \"\\n\\n[Rule truncated. Read full rule: {path}]\";\n\n/**\n * Built-in tool names whose results trigger dynamic rule injection.\n */\nexport const TRACKED_BUILTIN_TOOLS: readonly string[] = [\"read\", \"edit\", \"write\"];\nexport const TRACKED_BUILTIN_TOOL_SET: ReadonlySet<string> = new Set(TRACKED_BUILTIN_TOOLS);\n\n/**\n * Directories excluded by the recursive scanner regardless of glob settings.\n */\nexport const SCANNER_EXCLUDED_DIRS: readonly string[] = [\n\t\"node_modules\",\n\t\".git\",\n\t\"dist\",\n\t\"build\",\n\t\".turbo\",\n\t\".next\",\n\t\"coverage\",\n];\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ToolResultEvent } from "../../../types.ts";
|
|
2
|
+
import { type RuleDiscoveryCache } from "./finder.ts";
|
|
3
|
+
import { matchRule } from "./matcher.ts";
|
|
4
|
+
import type { LoadedRule, PiRulesConfig, RuleCandidate, RuleDiagnostic, SessionState } from "./types.ts";
|
|
5
|
+
export interface EngineDeps {
|
|
6
|
+
findCandidates: (options: {
|
|
7
|
+
projectRoot: string | null;
|
|
8
|
+
targetFile: string | null;
|
|
9
|
+
homeDir?: string;
|
|
10
|
+
disabledSources?: ReadonlySet<string>;
|
|
11
|
+
skipUserHome?: boolean;
|
|
12
|
+
cache?: RuleDiscoveryCache;
|
|
13
|
+
}) => RuleCandidate[];
|
|
14
|
+
readFile: (path: string) => string | null;
|
|
15
|
+
findProjectRoot: (startPath: string) => string | null;
|
|
16
|
+
extractToolPaths: (event: ToolResultEvent, cwd: string) => string[];
|
|
17
|
+
matchRule?: typeof matchRule;
|
|
18
|
+
/**
|
|
19
|
+
* Returns a stable identifier for a rule file. Default uses `statSync` mtime/ctime/size.
|
|
20
|
+
* Tests may inject a content-based fingerprint when fixtures use synthetic paths.
|
|
21
|
+
*/
|
|
22
|
+
fileFingerprint?: (filePath: string) => string;
|
|
23
|
+
}
|
|
24
|
+
export interface DynamicTargetFingerprint {
|
|
25
|
+
targetPath: string;
|
|
26
|
+
cacheKey: string;
|
|
27
|
+
fingerprint: string;
|
|
28
|
+
}
|
|
29
|
+
export interface Engine {
|
|
30
|
+
state: SessionState;
|
|
31
|
+
config: PiRulesConfig;
|
|
32
|
+
loadStaticRules(cwd: string): {
|
|
33
|
+
rules: LoadedRule[];
|
|
34
|
+
diagnostics: RuleDiagnostic[];
|
|
35
|
+
};
|
|
36
|
+
loadDynamicRules(cwd: string, targetPaths: ReadonlyArray<string>): {
|
|
37
|
+
rules: LoadedRule[];
|
|
38
|
+
diagnostics: RuleDiagnostic[];
|
|
39
|
+
};
|
|
40
|
+
formatStatic(rules: ReadonlyArray<LoadedRule>): string;
|
|
41
|
+
formatDynamic(rules: ReadonlyArray<LoadedRule>, target: string): string;
|
|
42
|
+
resetSession(cwd?: string): void;
|
|
43
|
+
isStaticInjected(rule: LoadedRule): boolean;
|
|
44
|
+
isDynamicInjected(scopeKey: string, rule: LoadedRule): boolean;
|
|
45
|
+
markStaticInjected(rule: LoadedRule): boolean;
|
|
46
|
+
markDynamicInjected(scopeKey: string, rule: LoadedRule): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Computes a fingerprint for each unique target derived from its discovered
|
|
49
|
+
* candidates plus their on-disk fingerprints. Pure - does not mutate state.
|
|
50
|
+
*/
|
|
51
|
+
fingerprintDynamicTargets(cwd: string, targetPaths: ReadonlyArray<string>): DynamicTargetFingerprint[];
|
|
52
|
+
/**
|
|
53
|
+
* Returns true when the fingerprint for a target already matches the value
|
|
54
|
+
* stored on `state.dynamicTargetFingerprints`. The hook layer skips
|
|
55
|
+
* `loadDynamicRules` entirely when every target is current.
|
|
56
|
+
*/
|
|
57
|
+
isDynamicTargetFingerprintCurrent(target: DynamicTargetFingerprint): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Commits the supplied fingerprints to `state.dynamicTargetFingerprints`.
|
|
60
|
+
* Always pass every fingerprint observed during a hook invocation so the
|
|
61
|
+
* map mirrors the latest discovery.
|
|
62
|
+
*/
|
|
63
|
+
commitDynamicTargetFingerprints(fingerprints: ReadonlyArray<DynamicTargetFingerprint>): void;
|
|
64
|
+
}
|
|
65
|
+
export declare function defaultConfig(): PiRulesConfig;
|
|
66
|
+
export declare function createEngine(config: PiRulesConfig, deps: EngineDeps): Engine;
|
|
67
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/rules/rules/engine.ts"],"names":[],"mappings":"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"}
|