@code-yeongyu/senpi 2026.9.25 → 2026.9.27-2
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 +58 -0
- package/dist/bun-runtime.d.ts +18 -2
- package/dist/bun-runtime.d.ts.map +1 -1
- package/dist/bun-runtime.js +60 -8
- package/dist/bun-runtime.js.map +1 -1
- package/dist/bundle/chunks/{app-server-command-RB6QUPRI.js → app-server-command-ATWHNOOO.js} +1 -1
- package/dist/bundle/chunks/bun-extension-importer-R4HXF3GD.js +14 -0
- package/dist/bundle/chunks/chunk-2L26KPZ6.js +8 -0
- package/dist/bundle/chunks/{chunk-3WBSBDBX.js → chunk-3CC5ZOBV.js} +1 -1
- package/dist/bundle/chunks/{chunk-OZCB6BP3.js → chunk-67BC7VZV.js} +4 -4
- package/dist/bundle/chunks/{chunk-JJ3NJZBD.js → chunk-6SLQ5HFO.js} +48 -45
- package/dist/bundle/chunks/{chunk-MKAM7IRH.js → chunk-6W2DB2GC.js} +1 -1
- package/dist/bundle/chunks/{chunk-BSOJHK4W.js → chunk-7FXXRPB3.js} +2 -1
- package/dist/bundle/chunks/{chunk-Y54V65MS.js → chunk-HPY47AVX.js} +1 -1
- package/dist/bundle/chunks/{chunk-CLZVNQW3.js → chunk-LPFZGWG2.js} +1 -1
- package/dist/bundle/chunks/chunk-W3D3ZYDS.js +2 -0
- package/dist/bundle/chunks/{chunk-UBPMXBOJ.js → chunk-XKLR7C5B.js} +1 -1
- package/dist/bundle/chunks/{cli-main-KO53KYDN.js → cli-main-HOM6UH3H.js} +1 -1
- package/dist/bundle/chunks/{help-fast-path-ZGKPSDFO.js → help-fast-path-YGYHMV2W.js} +1 -1
- package/dist/bundle/chunks/{host-command-BMHJ4YUD.js → host-command-XXSAFWBW.js} +1 -1
- package/dist/bundle/chunks/{host-lifecycle-2GZAGSGW.js → host-lifecycle-GOMGJ25O.js} +1 -1
- package/dist/bundle/chunks/{interactive-host-runtime-YI75GFD5.js → interactive-host-runtime-IYCZWJGX.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-ABDNLJSI.js → interactive-mode-ZMO7YVYU.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-JV3MNWXZ.js → multi-session-host-CE3W6COI.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-ZYYAVCXU.js → package-manager-cli-2PHRL2SX.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-Q2OUJURB.js → rpc-mode-WCETTMFV.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +135 -131
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +4 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/cross-project-session.d.ts +22 -0
- package/dist/cli/cross-project-session.d.ts.map +1 -0
- package/dist/cli/cross-project-session.js +38 -0
- package/dist/cli/cross-project-session.js.map +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +19 -5
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/dynamic-prompt/handoff.js +1 -1
- package/dist/core/dynamic-prompt/handoff.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +2 -0
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/index.js +5 -2
- package/dist/core/extensions/builtin/permission-system/index.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts +5 -0
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js +13 -0
- package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
- package/dist/core/extensions/builtin/repository-identity.d.ts +6 -0
- package/dist/core/extensions/builtin/repository-identity.d.ts.map +1 -0
- package/dist/core/extensions/builtin/repository-identity.js +33 -0
- package/dist/core/extensions/builtin/repository-identity.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/state.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.js +1 -1
- package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.js +3 -1
- package/dist/core/extensions/builtin/ttsr/detectors/repetitive-turns.js.map +1 -1
- package/dist/core/extensions/bun-extension-importer.d.ts.map +1 -1
- package/dist/core/extensions/bun-extension-importer.js +10 -4
- package/dist/core/extensions/bun-extension-importer.js.map +1 -1
- package/dist/core/extensions/bun-extension-registry.js +6 -5
- package/dist/core/extensions/bun-extension-registry.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/kernel-prelude.d.ts +13 -0
- package/dist/core/extensions/kernel-prelude.d.ts.map +1 -0
- package/dist/core/extensions/kernel-prelude.js +38 -0
- package/dist/core/extensions/kernel-prelude.js.map +1 -0
- package/dist/core/extensions/types.d.ts +44 -2
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +4 -2
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/provider-rejected-images.d.ts +18 -0
- package/dist/core/provider-rejected-images.d.ts.map +1 -0
- package/dist/core/provider-rejected-images.js +107 -0
- package/dist/core/provider-rejected-images.js.map +1 -0
- package/dist/core/repository-identity.d.ts +18 -0
- package/dist/core/repository-identity.d.ts.map +1 -0
- package/dist/core/repository-identity.js +75 -0
- package/dist/core/repository-identity.js.map +1 -0
- package/dist/core/session-rebind.d.ts +17 -0
- package/dist/core/session-rebind.d.ts.map +1 -0
- package/dist/core/session-rebind.js +111 -0
- package/dist/core/session-rebind.js.map +1 -0
- package/dist/core/session-title-generator.d.ts.map +1 -1
- package/dist/core/session-title-generator.js +21 -3
- package/dist/core/session-title-generator.js.map +1 -1
- package/dist/core/session-title-reasoning.d.ts +14 -0
- package/dist/core/session-title-reasoning.d.ts.map +1 -0
- package/dist/core/session-title-reasoning.js +31 -0
- package/dist/core/session-title-reasoning.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js +13 -0
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +6 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +100 -19
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +2 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/runtime-notice-presenter.d.ts +8 -0
- package/dist/modes/interactive/runtime-notice-presenter.d.ts.map +1 -0
- package/dist/modes/interactive/runtime-notice-presenter.js +69 -0
- package/dist/modes/interactive/runtime-notice-presenter.js.map +1 -0
- package/dist/modes/interactive/runtime-notice.d.ts +50 -0
- package/dist/modes/interactive/runtime-notice.d.ts.map +1 -0
- package/dist/modes/interactive/runtime-notice.js +104 -0
- package/dist/modes/interactive/runtime-notice.js.map +1 -0
- package/docs/environment-variables.md +2 -0
- package/docs/extensions.md +27 -1
- package/docs/quickstart.md +7 -1
- package/docs/sessions.md +9 -0
- package/docs/usage.md +1 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +38 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +7 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +9 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/schema-bridge.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/kernel-preludes.ts +30 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +15 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/local-module-loader.ts +16 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +6 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +15 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +7 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/kernel-prelude-plan.ts +19 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +2 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +4 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +11 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +1 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +1 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +3 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/native/prebuilds/darwin-arm64/senpi_pty.darwin-arm64.node +0 -0
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -22
- package/dist/bundle/chunks/bun-extension-importer-H4IJCWWQ.js +0 -14
- package/dist/bundle/chunks/chunk-34HMVB33.js +0 -2
- package/dist/bundle/chunks/chunk-SGYEOIOJ.js +0 -8
- package/node_modules/@code-yeongyu/senpi-desktop-engine/README.md +0 -31
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.d.ts +0 -38
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.js +0 -117
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/handshake.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.d.ts +0 -3
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.js +0 -3
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/index.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.d.ts +0 -42
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.js +0 -79
- package/node_modules/@code-yeongyu/senpi-desktop-engine/dist/locator.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-engine/native/check-prebuild-fresh.mjs +0 -160
- package/node_modules/@code-yeongyu/senpi-desktop-engine/native/index.d.ts +0 -20
- package/node_modules/@code-yeongyu/senpi-desktop-engine/native/index.js +0 -23
- package/node_modules/@code-yeongyu/senpi-desktop-engine/native/prebuilds/darwin-arm64/senpi-desktop-engine +0 -0
- package/node_modules/@code-yeongyu/senpi-desktop-engine/package.json +0 -53
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/README.md +0 -20
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.d.ts +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/dist/index.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-prelude/package.json +0 -44
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/README.md +0 -20
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.d.ts +0 -38
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/audit.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.d.ts +0 -28
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.js +0 -102
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/call.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.d.ts +0 -14
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.js +0 -71
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/engine-schema.generated.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.d.ts +0 -7
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.js +0 -4
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/index.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.d.ts +0 -66
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.js +0 -8
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/json-rpc.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.d.ts +0 -44
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/session.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.d.ts +0 -59
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/dist/wire.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-protocol/package.json +0 -45
- package/node_modules/@code-yeongyu/senpi-desktop-service/README.md +0 -27
- package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.d.ts +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-service/dist/index.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-service/package.json +0 -44
- package/node_modules/@code-yeongyu/senpi-desktop-tool/README.md +0 -20
- package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.d.ts +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.d.ts.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.js +0 -2
- package/node_modules/@code-yeongyu/senpi-desktop-tool/dist/index.js.map +0 -1
- package/node_modules/@code-yeongyu/senpi-desktop-tool/package.json +0 -44
|
@@ -3,7 +3,7 @@ export function buildHandoffSection(options = {}) {
|
|
|
3
3
|
? "The Next you name is executed in this same response with tool calls."
|
|
4
4
|
: "The Next you name is executed in this same response with tool calls; a Next with nothing after it is a defect.";
|
|
5
5
|
const betweenRule = options.briefUpdatesBetweenHandoffs
|
|
6
|
-
? "Between handoffs, one
|
|
6
|
+
? "Between handoffs, a one-line update on what you just found, ending with `Now: [task]. Next: [task].`, helps the user follow along."
|
|
7
7
|
: "Between handoffs, work without narration.";
|
|
8
8
|
return `## Handoff
|
|
9
9
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/handoff.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,mBAAmB,CAAC,OAAO,GAA0B,EAAE;IACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,0BAA0B;QAClD,CAAC,CAAC,sEAAsE;QACxE,CAAC,CAAC,gHAAgH,CAAC;IACpH,MAAM,WAAW,GAAG,OAAO,CAAC,2BAA2B;QACtD,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../src/core/dynamic-prompt/handoff.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,mBAAmB,CAAC,OAAO,GAA0B,EAAE;IACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,0BAA0B;QAClD,CAAC,CAAC,sEAAsE;QACxE,CAAC,CAAC,gHAAgH,CAAC;IACpH,MAAM,WAAW,GAAG,OAAO,CAAC,2BAA2B;QACtD,CAAC,CAAC,oIAAoI;QACtI,CAAC,CAAC,2CAA2C,CAAC;IAC/C,OAAO;;;;;;6CAMqC,QAAQ,IAAI,WAAW,EAAE,CAAC;AACvE,CAAC","sourcesContent":["export interface HandoffSectionOptions {\n\t/**\n\t * The caller's core already states a text-only turn-end rule (\"check your last paragraph\"),\n\t * so the block drops its own \"a Next with nothing after it is a defect\" clause instead of\n\t * stating that rule twice.\n\t */\n\tturnEndRuleStatedElsewhere?: boolean;\n\t/**\n\t * The model under-reports during long tool chains by default (Claude Fable 5.1 guide, \"Ask for\n\t * user-facing progress updates\": remove narration-suppressing lines, then say when updates are\n\t * wanted), so the quiet-between-handoffs sentence becomes a brief-update sentence.\n\t */\n\tbriefUpdatesBetweenHandoffs?: boolean;\n}\n\nexport function buildHandoffSection(options: HandoffSectionOptions = {}): string {\n\tconst nextRule = options.turnEndRuleStatedElsewhere\n\t\t? \"The Next you name is executed in this same response with tool calls.\"\n\t\t: \"The Next you name is executed in this same response with tool calls; a Next with nothing after it is a defect.\";\n\tconst betweenRule = options.briefUpdatesBetweenHandoffs\n\t\t? \"Between handoffs, a one-line update on what you just found, ending with `Now: [task]. Next: [task].`, helps the user follow along.\"\n\t\t: \"Between handoffs, work without narration.\";\n\treturn `## Handoff\n\nA handoff is the todo list's creation (in the message that creates it, after the routing line, or the next one), each todo phase change, a blocker or plan change, and the final message; the routing line is not one. Before writing one, weigh what the user originally asked for and what they would want to know right now; then state it in one short block:\n\n> Ask: [the user's original request] - wanted: [the outcome they asked for]. For you: [what they need to know now - ledger N/M done, findings, blockers]. Now: [the todo task in progress]. Next: [the next open task].\n\nNow and Next are the todo labels verbatim. ${nextRule} ${betweenRule}`;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAYpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAoBxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAYpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAoBxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAW9D,OAAO,YAAY,MAAM,UAAU,CAAC;AAMpC,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,YAAI,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAU,CAAC;AAEhG,eAAO,MAAM,+BAA+B;;;;;CAKoC,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAyDtD,CAAC"}
|
|
@@ -34,6 +34,7 @@ import promptUrlWidgetExtension from "./prompt-url-widget.js";
|
|
|
34
34
|
import reasoningExtension from "./reasoning/index.js";
|
|
35
35
|
import recommendedModelsExtension from "./recommended-models/index.js";
|
|
36
36
|
import redrawsExtension from "./redraws.js";
|
|
37
|
+
import repositoryIdentityExtension from "./repository-identity.js";
|
|
37
38
|
import piRulesExtension from "./rules/index.js";
|
|
38
39
|
import serviceTierExtension from "./service-tier.js";
|
|
39
40
|
import terminalExtension from "./terminal/index.js";
|
|
@@ -84,6 +85,7 @@ export const builtinExtensions = [
|
|
|
84
85
|
{ id: "history-search", factory: historySearchExtension },
|
|
85
86
|
{ id: "help", factory: helpExtension },
|
|
86
87
|
{ id: "import-repro", factory: importReproExtension },
|
|
88
|
+
{ id: "repository-identity", factory: repositoryIdentityExtension },
|
|
87
89
|
{ id: "websearch", factory: websearchExtension },
|
|
88
90
|
{ id: "webfetch", factory: webfetchExtension },
|
|
89
91
|
{ id: "video-in", factory: videoInExtension },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionFactory } from \"../types.ts\";\nimport accountExtension from \"./account/index.ts\";\nimport anthropicBashExtension from \"./anthropic-bash/index.ts\";\nimport anthropicSubscriptionExtension from \"./anthropic-subscription/index.ts\";\nimport anthropicWebSearchExtension from \"./anthropic-web-search/index.ts\";\nimport askUserExtension from \"./ask-user/index.ts\";\nimport bashTimeoutExtension from \"./bash-timeout/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport cacheKeepAliveExtension from \"./cache-keepalive/index.ts\";\nimport compactionExtension from \"./compaction/index.ts\";\nimport configReloadExtension from \"./config-reload/index.ts\";\nimport cursorCliOauthExtension from \"./cursor-cli-oauth/index.ts\";\nimport diffExtension from \"./diff.ts\";\nimport filesExtension from \"./files.ts\";\nimport goalExtension from \"./goal/index.ts\";\nimport gptAccountExtension from \"./gpt-account.ts\";\nimport gptApplyPatchExtension from \"./gpt-apply-patch/index.ts\";\nimport helpExtension from \"./help/index.ts\";\nimport herdrExtension from \"./herdr/index.ts\";\nimport historySearchExtension from \"./history-search/index.ts\";\nimport hooksExtension from \"./hooks/index.ts\";\nimport imageGenExtension from \"./imagegen/index.ts\";\nimport importReproExtension from \"./import-repro.ts\";\nimport lookAtExtension from \"./look-at/index.ts\";\nimport loopExtension from \"./loop/index.ts\";\nimport loopGuardExtension from \"./loop-guard/index.ts\";\nimport mcpExtension from \"./mcp/index.ts\";\nimport modelFallbackExtension from \"./model-fallback/index.ts\";\nimport nestedAgentsMdExtension from \"./nested-agents-md/index.ts\";\nimport openaiImageGenExtension from \"./openai-image-gen/index.ts\";\nimport openaiWebSearchExtension from \"./openai-web-search/index.ts\";\nimport permissionSystemExtension from \"./permission-system/index.ts\";\nimport promptPresetExtension from \"./prompt-preset/index.ts\";\nimport promptUrlWidgetExtension from \"./prompt-url-widget.ts\";\nimport reasoningExtension from \"./reasoning/index.ts\";\nimport recommendedModelsExtension from \"./recommended-models/index.ts\";\nimport redrawsExtension from \"./redraws.ts\";\nimport piRulesExtension from \"./rules/index.ts\";\nimport serviceTierExtension from \"./service-tier.ts\";\nimport terminalExtension from \"./terminal/index.ts\";\nimport todowriteExtension from \"./todotools/index.ts\";\nimport toolPairGuardExtension from \"./tool-pair-guard/index.ts\";\nimport toolSearchExtension from \"./tool-search/index.ts\";\nimport tpsExtension from \"./tps.ts\";\nimport ttsrExtension from \"./ttsr/index.ts\";\nimport videoInExtension from \"./video-in/index.ts\";\nimport webfetchExtension from \"./webfetch/index.ts\";\nimport websearchExtension from \"./websearch/index.ts\";\n\nexport interface BuiltinExtensionFactory {\n\tid: string;\n\tfactory: ExtensionFactory;\n}\n\nexport const globalDefaultExtensionIds = [\"diff\", \"files\", \"prompt-url-widget\", \"tps\"] as const;\n\nexport const globalDefaultExtensionFactories = {\n\tdiff: diffExtension,\n\tfiles: filesExtension,\n\t\"prompt-url-widget\": promptUrlWidgetExtension,\n\ttps: tpsExtension,\n} satisfies Record<(typeof globalDefaultExtensionIds)[number], ExtensionFactory>;\n\nexport const builtinExtensions: BuiltinExtensionFactory[] = [\n\t// Loop guard owns the first veto opportunity so repeated calls never re-run hooks or permission prompts.\n\t{ id: \"loop-guard\", factory: loopGuardExtension },\n\t{ id: \"hooks\", factory: hooksExtension },\n\t{ id: \"permission-system\", factory: permissionSystemExtension },\n\t{ id: \"gpt-apply-patch\", factory: gptApplyPatchExtension },\n\t{ id: \"ask-user\", factory: askUserExtension },\n\t{ id: \"herdr\", factory: herdrExtension },\n\t{ id: \"imagegen\", factory: imageGenExtension },\n\t// Follows imagegen so the native injector's bypass wiring observes the registered client tool.\n\t{ id: \"openai-image-gen\", factory: openaiImageGenExtension },\n\t{ id: \"prompt-preset\", factory: promptPresetExtension },\n\t{ id: \"todowrite\", factory: todowriteExtension },\n\t{ id: \"redraws\", factory: redrawsExtension },\n\t{ id: \"anthropic-web-search\", factory: anthropicWebSearchExtension },\n\t{ id: \"anthropic-bash\", factory: anthropicBashExtension },\n\t{ id: \"openai-web-search\", factory: openaiWebSearchExtension },\n\t{ id: \"service-tier\", factory: serviceTierExtension },\n\t// Sits beside service-tier: both are capability-aware model-control commands that only read\n\t// the active model and notify; neither mutates payloads, so relative order is not load-bearing.\n\t{ id: \"reasoning\", factory: reasoningExtension },\n\t{ id: \"model-fallback\", factory: modelFallbackExtension },\n\t{ id: \"recommended-models\", factory: recommendedModelsExtension },\n\t{ id: \"bash-timeout\", factory: bashTimeoutExtension },\n\t// Terminal follows bash-timeout so its injected default reaches the PTY bash, and follows\n\t// anthropic-bash so mutual-exclusion (companion step-aside) is evaluated after it registers.\n\t{ id: \"terminal\", factory: terminalExtension },\n\t{ id: \"tool-pair-guard\", factory: toolPairGuardExtension },\n\t{ id: \"compaction\", factory: compactionExtension },\n\t{ id: \"history-search\", factory: historySearchExtension },\n\t{ id: \"help\", factory: helpExtension },\n\t{ id: \"import-repro\", factory: importReproExtension },\n\t{ id: \"websearch\", factory: websearchExtension },\n\t{ id: \"webfetch\", factory: webfetchExtension },\n\t{ id: \"video-in\", factory: videoInExtension },\n\t{ id: \"look-at\", factory: lookAtExtension },\n\t{ id: \"nested-agents-md\", factory: nestedAgentsMdExtension },\n\t{ id: \"rules\", factory: piRulesExtension },\n\t{ id: \"goal\", factory: goalExtension },\n\t{ id: \"loop\", factory: loopExtension },\n\t{ id: \"cache-keepalive\", factory: cacheKeepAliveExtension },\n\t{ id: \"ttsr\", factory: ttsrExtension },\n\t{ id: \"btw\", factory: btwExtension },\n\t// Provider-neutral account listing; sits before the provider lanes so their\n\t// dedicated commands (claude-account, cursor accounts) keep their own names.\n\t{ id: \"account\", factory: accountExtension },\n\t{ id: \"gpt-account\", factory: gptAccountExtension },\n\t{ id: \"claude-sdk-oauth\", factory: anthropicSubscriptionExtension },\n\t// Registers unconditionally and reports executable/auth state through its oauth check, so it stays beside the other provider lane.\n\t{ id: \"cursor-cli-oauth\", factory: cursorCliOauthExtension },\n\t// Config reload follows settings-dependent builtins so reloads rebuild their resolved settings before catalog feeders observe them.\n\t{ id: \"config-reload\", factory: configReloadExtension },\n\t// Shared catalog wiring loads before MCP, which feeds its tools into the shared catalog as the final builtin.\n\t{ id: \"tool-search\", factory: toolSearchExtension },\n\t// Keep MCP last so its eventual provider-payload tap observes all co-resident builtin mutations.\n\t{ id: \"mcp\", factory: mcpExtension },\n];\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionFactory } from \"../types.ts\";\nimport accountExtension from \"./account/index.ts\";\nimport anthropicBashExtension from \"./anthropic-bash/index.ts\";\nimport anthropicSubscriptionExtension from \"./anthropic-subscription/index.ts\";\nimport anthropicWebSearchExtension from \"./anthropic-web-search/index.ts\";\nimport askUserExtension from \"./ask-user/index.ts\";\nimport bashTimeoutExtension from \"./bash-timeout/index.ts\";\nimport btwExtension from \"./btw/index.ts\";\nimport cacheKeepAliveExtension from \"./cache-keepalive/index.ts\";\nimport compactionExtension from \"./compaction/index.ts\";\nimport configReloadExtension from \"./config-reload/index.ts\";\nimport cursorCliOauthExtension from \"./cursor-cli-oauth/index.ts\";\nimport diffExtension from \"./diff.ts\";\nimport filesExtension from \"./files.ts\";\nimport goalExtension from \"./goal/index.ts\";\nimport gptAccountExtension from \"./gpt-account.ts\";\nimport gptApplyPatchExtension from \"./gpt-apply-patch/index.ts\";\nimport helpExtension from \"./help/index.ts\";\nimport herdrExtension from \"./herdr/index.ts\";\nimport historySearchExtension from \"./history-search/index.ts\";\nimport hooksExtension from \"./hooks/index.ts\";\nimport imageGenExtension from \"./imagegen/index.ts\";\nimport importReproExtension from \"./import-repro.ts\";\nimport lookAtExtension from \"./look-at/index.ts\";\nimport loopExtension from \"./loop/index.ts\";\nimport loopGuardExtension from \"./loop-guard/index.ts\";\nimport mcpExtension from \"./mcp/index.ts\";\nimport modelFallbackExtension from \"./model-fallback/index.ts\";\nimport nestedAgentsMdExtension from \"./nested-agents-md/index.ts\";\nimport openaiImageGenExtension from \"./openai-image-gen/index.ts\";\nimport openaiWebSearchExtension from \"./openai-web-search/index.ts\";\nimport permissionSystemExtension from \"./permission-system/index.ts\";\nimport promptPresetExtension from \"./prompt-preset/index.ts\";\nimport promptUrlWidgetExtension from \"./prompt-url-widget.ts\";\nimport reasoningExtension from \"./reasoning/index.ts\";\nimport recommendedModelsExtension from \"./recommended-models/index.ts\";\nimport redrawsExtension from \"./redraws.ts\";\nimport repositoryIdentityExtension from \"./repository-identity.ts\";\nimport piRulesExtension from \"./rules/index.ts\";\nimport serviceTierExtension from \"./service-tier.ts\";\nimport terminalExtension from \"./terminal/index.ts\";\nimport todowriteExtension from \"./todotools/index.ts\";\nimport toolPairGuardExtension from \"./tool-pair-guard/index.ts\";\nimport toolSearchExtension from \"./tool-search/index.ts\";\nimport tpsExtension from \"./tps.ts\";\nimport ttsrExtension from \"./ttsr/index.ts\";\nimport videoInExtension from \"./video-in/index.ts\";\nimport webfetchExtension from \"./webfetch/index.ts\";\nimport websearchExtension from \"./websearch/index.ts\";\n\nexport interface BuiltinExtensionFactory {\n\tid: string;\n\tfactory: ExtensionFactory;\n}\n\nexport const globalDefaultExtensionIds = [\"diff\", \"files\", \"prompt-url-widget\", \"tps\"] as const;\n\nexport const globalDefaultExtensionFactories = {\n\tdiff: diffExtension,\n\tfiles: filesExtension,\n\t\"prompt-url-widget\": promptUrlWidgetExtension,\n\ttps: tpsExtension,\n} satisfies Record<(typeof globalDefaultExtensionIds)[number], ExtensionFactory>;\n\nexport const builtinExtensions: BuiltinExtensionFactory[] = [\n\t// Loop guard owns the first veto opportunity so repeated calls never re-run hooks or permission prompts.\n\t{ id: \"loop-guard\", factory: loopGuardExtension },\n\t{ id: \"hooks\", factory: hooksExtension },\n\t{ id: \"permission-system\", factory: permissionSystemExtension },\n\t{ id: \"gpt-apply-patch\", factory: gptApplyPatchExtension },\n\t{ id: \"ask-user\", factory: askUserExtension },\n\t{ id: \"herdr\", factory: herdrExtension },\n\t{ id: \"imagegen\", factory: imageGenExtension },\n\t// Follows imagegen so the native injector's bypass wiring observes the registered client tool.\n\t{ id: \"openai-image-gen\", factory: openaiImageGenExtension },\n\t{ id: \"prompt-preset\", factory: promptPresetExtension },\n\t{ id: \"todowrite\", factory: todowriteExtension },\n\t{ id: \"redraws\", factory: redrawsExtension },\n\t{ id: \"anthropic-web-search\", factory: anthropicWebSearchExtension },\n\t{ id: \"anthropic-bash\", factory: anthropicBashExtension },\n\t{ id: \"openai-web-search\", factory: openaiWebSearchExtension },\n\t{ id: \"service-tier\", factory: serviceTierExtension },\n\t// Sits beside service-tier: both are capability-aware model-control commands that only read\n\t// the active model and notify; neither mutates payloads, so relative order is not load-bearing.\n\t{ id: \"reasoning\", factory: reasoningExtension },\n\t{ id: \"model-fallback\", factory: modelFallbackExtension },\n\t{ id: \"recommended-models\", factory: recommendedModelsExtension },\n\t{ id: \"bash-timeout\", factory: bashTimeoutExtension },\n\t// Terminal follows bash-timeout so its injected default reaches the PTY bash, and follows\n\t// anthropic-bash so mutual-exclusion (companion step-aside) is evaluated after it registers.\n\t{ id: \"terminal\", factory: terminalExtension },\n\t{ id: \"tool-pair-guard\", factory: toolPairGuardExtension },\n\t{ id: \"compaction\", factory: compactionExtension },\n\t{ id: \"history-search\", factory: historySearchExtension },\n\t{ id: \"help\", factory: helpExtension },\n\t{ id: \"import-repro\", factory: importReproExtension },\n\t{ id: \"repository-identity\", factory: repositoryIdentityExtension },\n\t{ id: \"websearch\", factory: websearchExtension },\n\t{ id: \"webfetch\", factory: webfetchExtension },\n\t{ id: \"video-in\", factory: videoInExtension },\n\t{ id: \"look-at\", factory: lookAtExtension },\n\t{ id: \"nested-agents-md\", factory: nestedAgentsMdExtension },\n\t{ id: \"rules\", factory: piRulesExtension },\n\t{ id: \"goal\", factory: goalExtension },\n\t{ id: \"loop\", factory: loopExtension },\n\t{ id: \"cache-keepalive\", factory: cacheKeepAliveExtension },\n\t{ id: \"ttsr\", factory: ttsrExtension },\n\t{ id: \"btw\", factory: btwExtension },\n\t// Provider-neutral account listing; sits before the provider lanes so their\n\t// dedicated commands (claude-account, cursor accounts) keep their own names.\n\t{ id: \"account\", factory: accountExtension },\n\t{ id: \"gpt-account\", factory: gptAccountExtension },\n\t{ id: \"claude-sdk-oauth\", factory: anthropicSubscriptionExtension },\n\t// Registers unconditionally and reports executable/auth state through its oauth check, so it stays beside the other provider lane.\n\t{ id: \"cursor-cli-oauth\", factory: cursorCliOauthExtension },\n\t// Config reload follows settings-dependent builtins so reloads rebuild their resolved settings before catalog feeders observe them.\n\t{ id: \"config-reload\", factory: configReloadExtension },\n\t// Shared catalog wiring loads before MCP, which feeds its tools into the shared catalog as the final builtin.\n\t{ id: \"tool-search\", factory: toolSearchExtension },\n\t// Keep MCP last so its eventual provider-payload tap observes all co-resident builtin mutations.\n\t{ id: \"mcp\", factory: mcpExtension },\n];\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAuDnD,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAuDnD,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAuHxE"}
|
|
@@ -4,7 +4,7 @@ import { parsePermissionFlag, parsePermissionPresetFlag } from "./cli.js";
|
|
|
4
4
|
import { disabled } from "./config.js";
|
|
5
5
|
import { createEventEmitter } from "./events.js";
|
|
6
6
|
import { handleNoUI } from "./non-interactive.js";
|
|
7
|
-
import { createBuiltinParserRegistry } from "./parsers.js";
|
|
7
|
+
import { createBuiltinParserRegistry, toolOwnedPermissionRequests } from "./parsers.js";
|
|
8
8
|
import { showPermissionPrompt } from "./prompt.js";
|
|
9
9
|
import { PermissionService } from "./service.js";
|
|
10
10
|
import { loadPermissionSettings } from "./settings.js";
|
|
@@ -81,7 +81,10 @@ export default function permissionSystemExtension(pi) {
|
|
|
81
81
|
if (!service || !parserRegistry) {
|
|
82
82
|
return undefined;
|
|
83
83
|
}
|
|
84
|
-
const permissionRequests = parserRegistry.
|
|
84
|
+
const permissionRequests = parserRegistry.has(event.toolName)
|
|
85
|
+
? parserRegistry.parse(event.toolName, event.input, ctx.cwd)
|
|
86
|
+
: (toolOwnedPermissionRequests(pi.getAllTools(), event.toolName, event.input, ctx.cwd) ??
|
|
87
|
+
parserRegistry.parse(event.toolName, event.input, ctx.cwd));
|
|
85
88
|
const sessionID = ctx.sessionManager.getSessionId();
|
|
86
89
|
for (const permissionRequest of permissionRequests) {
|
|
87
90
|
const request = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI } from \"../../types.ts\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { parsePermissionFlag, parsePermissionPresetFlag } from \"./cli.ts\";\nimport { disabled } from \"./config.ts\";\nimport { createEventEmitter } from \"./events.ts\";\nimport { handleNoUI } from \"./non-interactive.ts\";\nimport { createBuiltinParserRegistry, type ParserRegistry } from \"./parsers.ts\";\nimport { showPermissionPrompt } from \"./prompt.ts\";\nimport { PermissionService } from \"./service.ts\";\nimport { loadPermissionSettings } from \"./settings.ts\";\nimport { appendApproved } from \"./storage.ts\";\nimport { CorrectedError, DeniedError, RejectedError, type Request, type Ruleset } from \"./types.ts\";\n\nfunction createRequestIDFactory(): () => string {\n\tlet counter = 0;\n\treturn () => {\n\t\tcounter += 1;\n\t\treturn `permission-${counter}`;\n\t};\n}\n\nfunction getReason(error: unknown): string {\n\tif (error instanceof DeniedError || error instanceof CorrectedError || error instanceof RejectedError) {\n\t\treturn error.message;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\n\treturn \"Permission request was rejected.\";\n}\n\nfunction createRequestMetadata(toolName: string, input: Record<string, unknown>): Record<string, unknown> {\n\tconst metadata: Record<string, unknown> = {\n\t\ttoolName,\n\t\t...input,\n\t};\n\n\tconst pathValue = typeof input.path === \"string\" ? input.path : undefined;\n\tconst filePathValue = typeof input.file_path === \"string\" ? input.file_path : undefined;\n\tconst patchTextValue =\n\t\ttypeof input.input === \"string\" ? input.input : typeof input.patchText === \"string\" ? input.patchText : undefined;\n\n\tif (toolName === \"edit\" || toolName === \"write\" || toolName === \"apply_patch\" || toolName === \"multiedit\") {\n\t\tmetadata.filepath = pathValue ?? filePathValue ?? extractPatchedPaths(patchTextValue ?? \"\")[0];\n\t}\n\n\tif (toolName === \"read\") {\n\t\tmetadata.filePath = pathValue ?? filePathValue;\n\t}\n\n\treturn metadata;\n}\n\nexport default function permissionSystemExtension(pi: ExtensionAPI): void {\n\tlet service: PermissionService | null = null;\n\tlet parserRegistry: ParserRegistry | null = null;\n\tlet cliRuleset: Ruleset = [];\n\tlet staticRuleset: Ruleset = [];\n\tlet initialApprovedCount = 0;\n\n\tconst nextRequestID = createRequestIDFactory();\n\n\tpi.registerFlag(\"permission\", {\n\t\tdescription: \"Set permission rules (format: tool=action or tool:pattern=action)\",\n\t\ttype: \"string\",\n\t});\n\tpi.registerFlag(\"permission-preset\", {\n\t\tdescription: \"Set permission preset (full-access, workspace, read-only, or ask)\",\n\t\ttype: \"string\",\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tconst permissionFlag = pi.getFlag(\"permission\");\n\t\tconst permissionPresetFlag = pi.getFlag(\"permission-preset\");\n\t\tcliRuleset = typeof permissionFlag === \"string\" ? parsePermissionFlag(permissionFlag) : [];\n\t\tconst cliPreset =\n\t\t\ttypeof permissionPresetFlag === \"string\" ? parsePermissionPresetFlag(permissionPresetFlag) : undefined;\n\n\t\tif (typeof permissionPresetFlag === \"string\" && !cliPreset) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid --permission-preset \"${permissionPresetFlag}\". Expected one of: full-access, workspace, read-only, ask.`,\n\t\t\t);\n\t\t}\n\n\t\tconst loadedSettings = loadPermissionSettings(settingsManager, cliRuleset, ctx.cwd, cliPreset);\n\t\tstaticRuleset = loadedSettings.staticRuleset;\n\t\tconst approved = loadedSettings.approved;\n\t\tparserRegistry = createBuiltinParserRegistry();\n\t\tservice = new PermissionService(staticRuleset, approved, createEventEmitter(pi));\n\t\tinitialApprovedCount = approved.length;\n\n\t\tconst allTools = pi.getAllTools().map((tool) => tool.name);\n\t\tconst disabledTools = disabled(allTools, staticRuleset);\n\t\tconst activeTools = pi.getActiveTools().filter((toolName) => !disabledTools.has(toolName));\n\t\tpi.setActiveTools(activeTools);\n\t});\n\n\tpi.on(\"tool_call\", async (event, ctx) => {\n\t\tif (!service || !parserRegistry) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst permissionRequests = parserRegistry.parse(event.toolName, event.input, ctx.cwd);\n\t\tconst sessionID = ctx.sessionManager.getSessionId();\n\n\t\tfor (const permissionRequest of permissionRequests) {\n\t\t\tconst request: Request = {\n\t\t\t\tid: nextRequestID(),\n\t\t\t\tsessionID,\n\t\t\t\tpermission: permissionRequest.permission,\n\t\t\t\tpatterns: permissionRequest.patterns,\n\t\t\t\talways: permissionRequest.always,\n\t\t\t\tmetadata: createRequestMetadata(event.toolName, event.input),\n\t\t\t};\n\n\t\t\tconst askResultPromise = service.ask(request).then(\n\t\t\t\t() => ({ ok: true as const }),\n\t\t\t\t(error: unknown) => ({ ok: false as const, error }),\n\t\t\t);\n\t\t\tconst isPending = service.list().some((pendingRequest) => pendingRequest.id === request.id);\n\n\t\t\tif (!isPending) {\n\t\t\t\tconst askResult = await askResultPromise;\n\t\t\t\tif (!askResult.ok) {\n\t\t\t\t\treturn { block: true, reason: getReason(askResult.error) };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tconst reply = await showPermissionPrompt(ctx, request);\n\t\t\t\tservice.reply(reply);\n\t\t\t} else {\n\t\t\t\tconst reply = handleNoUI(request, staticRuleset, cliRuleset, (eventName, data) => {\n\t\t\t\t\tif (eventName !== \"permission_asked\") {\n\t\t\t\t\t\tpi.events.emit(eventName, data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (reply) {\n\t\t\t\t\tservice.reply(reply);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst askResult = await askResultPromise;\n\t\t\tif (!askResult.ok) {\n\t\t\t\treturn { block: true, reason: getReason(askResult.error) };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tvoid event;\n\n\t\tif (!service) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst approved = service.getApproved().slice(initialApprovedCount);\n\t\tif (approved.length > 0) {\n\t\t\tappendApproved(ctx.cwd, approved);\n\t\t}\n\n\t\tfor (const pendingRequest of service.list()) {\n\t\t\tservice.reply({ requestID: pendingRequest.id, reply: \"reject\" });\n\t\t}\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI } from \"../../types.ts\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { parsePermissionFlag, parsePermissionPresetFlag } from \"./cli.ts\";\nimport { disabled } from \"./config.ts\";\nimport { createEventEmitter } from \"./events.ts\";\nimport { handleNoUI } from \"./non-interactive.ts\";\nimport { createBuiltinParserRegistry, type ParserRegistry, toolOwnedPermissionRequests } from \"./parsers.ts\";\nimport { showPermissionPrompt } from \"./prompt.ts\";\nimport { PermissionService } from \"./service.ts\";\nimport { loadPermissionSettings } from \"./settings.ts\";\nimport { appendApproved } from \"./storage.ts\";\nimport { CorrectedError, DeniedError, RejectedError, type Request, type Ruleset } from \"./types.ts\";\n\nfunction createRequestIDFactory(): () => string {\n\tlet counter = 0;\n\treturn () => {\n\t\tcounter += 1;\n\t\treturn `permission-${counter}`;\n\t};\n}\n\nfunction getReason(error: unknown): string {\n\tif (error instanceof DeniedError || error instanceof CorrectedError || error instanceof RejectedError) {\n\t\treturn error.message;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\n\treturn \"Permission request was rejected.\";\n}\n\nfunction createRequestMetadata(toolName: string, input: Record<string, unknown>): Record<string, unknown> {\n\tconst metadata: Record<string, unknown> = {\n\t\ttoolName,\n\t\t...input,\n\t};\n\n\tconst pathValue = typeof input.path === \"string\" ? input.path : undefined;\n\tconst filePathValue = typeof input.file_path === \"string\" ? input.file_path : undefined;\n\tconst patchTextValue =\n\t\ttypeof input.input === \"string\" ? input.input : typeof input.patchText === \"string\" ? input.patchText : undefined;\n\n\tif (toolName === \"edit\" || toolName === \"write\" || toolName === \"apply_patch\" || toolName === \"multiedit\") {\n\t\tmetadata.filepath = pathValue ?? filePathValue ?? extractPatchedPaths(patchTextValue ?? \"\")[0];\n\t}\n\n\tif (toolName === \"read\") {\n\t\tmetadata.filePath = pathValue ?? filePathValue;\n\t}\n\n\treturn metadata;\n}\n\nexport default function permissionSystemExtension(pi: ExtensionAPI): void {\n\tlet service: PermissionService | null = null;\n\tlet parserRegistry: ParserRegistry | null = null;\n\tlet cliRuleset: Ruleset = [];\n\tlet staticRuleset: Ruleset = [];\n\tlet initialApprovedCount = 0;\n\n\tconst nextRequestID = createRequestIDFactory();\n\n\tpi.registerFlag(\"permission\", {\n\t\tdescription: \"Set permission rules (format: tool=action or tool:pattern=action)\",\n\t\ttype: \"string\",\n\t});\n\tpi.registerFlag(\"permission-preset\", {\n\t\tdescription: \"Set permission preset (full-access, workspace, read-only, or ask)\",\n\t\ttype: \"string\",\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tconst permissionFlag = pi.getFlag(\"permission\");\n\t\tconst permissionPresetFlag = pi.getFlag(\"permission-preset\");\n\t\tcliRuleset = typeof permissionFlag === \"string\" ? parsePermissionFlag(permissionFlag) : [];\n\t\tconst cliPreset =\n\t\t\ttypeof permissionPresetFlag === \"string\" ? parsePermissionPresetFlag(permissionPresetFlag) : undefined;\n\n\t\tif (typeof permissionPresetFlag === \"string\" && !cliPreset) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid --permission-preset \"${permissionPresetFlag}\". Expected one of: full-access, workspace, read-only, ask.`,\n\t\t\t);\n\t\t}\n\n\t\tconst loadedSettings = loadPermissionSettings(settingsManager, cliRuleset, ctx.cwd, cliPreset);\n\t\tstaticRuleset = loadedSettings.staticRuleset;\n\t\tconst approved = loadedSettings.approved;\n\t\tparserRegistry = createBuiltinParserRegistry();\n\t\tservice = new PermissionService(staticRuleset, approved, createEventEmitter(pi));\n\t\tinitialApprovedCount = approved.length;\n\n\t\tconst allTools = pi.getAllTools().map((tool) => tool.name);\n\t\tconst disabledTools = disabled(allTools, staticRuleset);\n\t\tconst activeTools = pi.getActiveTools().filter((toolName) => !disabledTools.has(toolName));\n\t\tpi.setActiveTools(activeTools);\n\t});\n\n\tpi.on(\"tool_call\", async (event, ctx) => {\n\t\tif (!service || !parserRegistry) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst permissionRequests = parserRegistry.has(event.toolName)\n\t\t\t? parserRegistry.parse(event.toolName, event.input, ctx.cwd)\n\t\t\t: (toolOwnedPermissionRequests(pi.getAllTools(), event.toolName, event.input, ctx.cwd) ??\n\t\t\t\tparserRegistry.parse(event.toolName, event.input, ctx.cwd));\n\t\tconst sessionID = ctx.sessionManager.getSessionId();\n\n\t\tfor (const permissionRequest of permissionRequests) {\n\t\t\tconst request: Request = {\n\t\t\t\tid: nextRequestID(),\n\t\t\t\tsessionID,\n\t\t\t\tpermission: permissionRequest.permission,\n\t\t\t\tpatterns: permissionRequest.patterns,\n\t\t\t\talways: permissionRequest.always,\n\t\t\t\tmetadata: createRequestMetadata(event.toolName, event.input),\n\t\t\t};\n\n\t\t\tconst askResultPromise = service.ask(request).then(\n\t\t\t\t() => ({ ok: true as const }),\n\t\t\t\t(error: unknown) => ({ ok: false as const, error }),\n\t\t\t);\n\t\t\tconst isPending = service.list().some((pendingRequest) => pendingRequest.id === request.id);\n\n\t\t\tif (!isPending) {\n\t\t\t\tconst askResult = await askResultPromise;\n\t\t\t\tif (!askResult.ok) {\n\t\t\t\t\treturn { block: true, reason: getReason(askResult.error) };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tconst reply = await showPermissionPrompt(ctx, request);\n\t\t\t\tservice.reply(reply);\n\t\t\t} else {\n\t\t\t\tconst reply = handleNoUI(request, staticRuleset, cliRuleset, (eventName, data) => {\n\t\t\t\t\tif (eventName !== \"permission_asked\") {\n\t\t\t\t\t\tpi.events.emit(eventName, data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (reply) {\n\t\t\t\t\tservice.reply(reply);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst askResult = await askResultPromise;\n\t\t\tif (!askResult.ok) {\n\t\t\t\treturn { block: true, reason: getReason(askResult.error) };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tvoid event;\n\n\t\tif (!service) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst approved = service.getApproved().slice(initialApprovedCount);\n\t\tif (approved.length > 0) {\n\t\t\tappendApproved(ctx.cwd, approved);\n\t\t}\n\n\t\tfor (const pendingRequest of service.list()) {\n\t\t\tservice.reply({ requestID: pendingRequest.id, reply: \"reject\" });\n\t\t}\n\t});\n}\n"]}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
import type { ToolInfo } from "../../types.ts";
|
|
1
2
|
import type { Request } from "../permission-system/types.ts";
|
|
2
3
|
/** Simplified permission request without ID/session metadata */
|
|
3
4
|
export type PermissionRequest = Pick<Request, "permission" | "patterns" | "always">;
|
|
4
5
|
/** Parser function that extracts permission requests from tool input */
|
|
5
6
|
export type ToolPermissionParser = (toolName: string, input: Record<string, unknown>, cwd: string) => PermissionRequest[];
|
|
7
|
+
/** The requests a tool's own `permissionParser` derives from this call, or undefined when the tool declares none. */
|
|
8
|
+
export declare function toolOwnedPermissionRequests(tools: readonly ToolInfo[], toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] | undefined;
|
|
6
9
|
/** Registry for tool-specific permission parsers */
|
|
7
10
|
export declare class ParserRegistry {
|
|
8
11
|
private readonly parsers;
|
|
9
12
|
/** Register a parser for a specific tool */
|
|
10
13
|
register(toolName: string, parser: ToolPermissionParser): void;
|
|
14
|
+
/** Whether a built-in parser owns this tool */
|
|
15
|
+
has(toolName: string): boolean;
|
|
11
16
|
/** Parse tool input into permission requests */
|
|
12
17
|
parse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[];
|
|
13
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAG7D,gEAAgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC;AAEpF,wEAAwE;AACxE,MAAM,MAAM,oBAAoB,GAAG,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,KACP,iBAAiB,EAAE,CAAC;AAmEzB,qHAAqH;AACrH,wBAAgB,2BAA2B,CAC1C,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,GACT,iBAAiB,EAAE,GAAG,SAAS,CAOjC;AAED,oDAAoD;AACpD,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAE7D;IAED,+CAA+C;IAC/C,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE7B;IAED,gDAAgD;IAChD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAMxF;CACD;AAED,+DAA+D;AAC/D,wBAAgB,2BAA2B,IAAI,cAAc,CAgK5D"}
|
|
@@ -53,6 +53,15 @@ function withExternalDirectoryRequests(requests, paths, cwd, scope) {
|
|
|
53
53
|
},
|
|
54
54
|
];
|
|
55
55
|
}
|
|
56
|
+
/** The requests a tool's own `permissionParser` derives from this call, or undefined when the tool declares none. */
|
|
57
|
+
export function toolOwnedPermissionRequests(tools, toolName, input, cwd) {
|
|
58
|
+
const parser = tools.find((tool) => tool.name === toolName)?.permissionParser;
|
|
59
|
+
return parser?.(input, cwd).map((request) => ({
|
|
60
|
+
permission: request.permission,
|
|
61
|
+
patterns: [...request.patterns],
|
|
62
|
+
always: [...request.always],
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
56
65
|
/** Registry for tool-specific permission parsers */
|
|
57
66
|
export class ParserRegistry {
|
|
58
67
|
constructor() {
|
|
@@ -62,6 +71,10 @@ export class ParserRegistry {
|
|
|
62
71
|
register(toolName, parser) {
|
|
63
72
|
this.parsers.set(toolName, parser);
|
|
64
73
|
}
|
|
74
|
+
/** Whether a built-in parser owns this tool */
|
|
75
|
+
has(toolName) {
|
|
76
|
+
return this.parsers.has(toolName);
|
|
77
|
+
}
|
|
65
78
|
/** Parse tool input into permission requests */
|
|
66
79
|
parse(toolName, input, cwd) {
|
|
67
80
|
const parser = this.parsers.get(toolName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname, resolve } from \"node:path\";\nimport { realpathWithoutOpen } from \"../../../../utils/paths.ts\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { BashArity } from \"../permission-system/arity.ts\";\nimport { extractExternalPaths, isExternalPath } from \"../permission-system/external-dir.ts\";\nimport type { Request } from \"../permission-system/types.ts\";\nimport { setApprovedMonitorParent } from \"../terminal/monitor-permission.ts\";\n\n/** Simplified permission request without ID/session metadata */\nexport type PermissionRequest = Pick<Request, \"permission\" | \"patterns\" | \"always\">;\n\n/** Parser function that extracts permission requests from tool input */\nexport type ToolPermissionParser = (\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n) => PermissionRequest[];\n\nfunction fallbackPermissionRequest(permission: string): PermissionRequest {\n\treturn {\n\t\tpermission,\n\t\tpatterns: [\"*\"],\n\t\talways: [\"*\"],\n\t};\n}\n\nfunction getString(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = input[key];\n\t\tif (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\ntype AlwaysScope = \"file\" | \"directory\";\n\nfunction toParentDirectoryPattern(inputPath: string, scope: AlwaysScope): string {\n\tif (inputPath === \"~\" || inputPath === \"$HOME\") {\n\t\treturn `${inputPath}/*`;\n\t}\n\n\tif (scope === \"directory\") {\n\t\treturn inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\") ? `${inputPath}*` : `${inputPath}/*`;\n\t}\n\n\tif (inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\")) {\n\t\treturn `${inputPath}*`;\n\t}\n\n\tconst parentPattern = inputPath.replace(/[\\\\/][^\\\\/]+$/, \"/*\");\n\tif (parentPattern === \"/*\") {\n\t\treturn inputPath;\n\t}\n\treturn parentPattern;\n}\n\nfunction parseFilePath(input: Record<string, unknown>): string | undefined {\n\treturn getString(input, \"path\", \"file_path\");\n}\n\nfunction withExternalDirectoryRequests(\n\trequests: PermissionRequest[],\n\tpaths: string[],\n\tcwd: string,\n\tscope: AlwaysScope,\n): PermissionRequest[] {\n\tconst externalPaths = paths.filter((inputPath) => isExternalPath(inputPath, cwd));\n\tif (externalPaths.length === 0) {\n\t\treturn requests;\n\t}\n\n\treturn [\n\t\t...requests,\n\t\t{\n\t\t\tpermission: \"external_directory\",\n\t\t\tpatterns: externalPaths,\n\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, scope)),\n\t\t},\n\t];\n}\n\n/** Registry for tool-specific permission parsers */\nexport class ParserRegistry {\n\tprivate readonly parsers = new Map<string, ToolPermissionParser>();\n\n\t/** Register a parser for a specific tool */\n\tregister(toolName: string, parser: ToolPermissionParser): void {\n\t\tthis.parsers.set(toolName, parser);\n\t}\n\n\t/** Parse tool input into permission requests */\n\tparse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] {\n\t\tconst parser = this.parsers.get(toolName);\n\t\tif (!parser) {\n\t\t\treturn [fallbackPermissionRequest(toolName)];\n\t\t}\n\t\treturn parser(toolName, input, cwd);\n\t}\n}\n\n/** Create registry with built-in parsers for standard tools */\nexport function createBuiltinParserRegistry(): ParserRegistry {\n\tconst registry = new ParserRegistry();\n\n\t// bash_input writes arbitrary stdin to a live shell session = arbitrary command execution,\n\t// so it MUST be gated in the SAME `bash` permission class (via the `input` field), else\n\t// read-only/ask presets would be bypassable through a persistent session. The steering/read\n\t// tools (bash_output/kill_bash/bash_resize) fall back to their own tool-named permissions.\n\tconst parseBashLikePermission =\n\t\t(commandKey: string): ToolPermissionParser =>\n\t\t(_toolName, input, cwd) => {\n\t\t\tconst command = getString(input, commandKey);\n\t\t\tif (!command) {\n\t\t\t\treturn [fallbackPermissionRequest(\"bash\")];\n\t\t\t}\n\n\t\t\tconst tokens = command.split(/\\s+/).filter(Boolean);\n\t\t\tconst prefix = BashArity.prefix(tokens).join(\" \");\n\t\t\tconst always = prefix ? [prefix, `${prefix} *`] : [\"*\"];\n\t\t\tconst requests: PermissionRequest[] = [\n\t\t\t\t{\n\t\t\t\t\tpermission: \"bash\",\n\t\t\t\t\tpatterns: [prefix || command],\n\t\t\t\t\talways,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst externalPaths = extractExternalPaths(command, cwd);\n\t\t\tif (externalPaths.length > 0) {\n\t\t\t\trequests.push({\n\t\t\t\t\tpermission: \"external_directory\",\n\t\t\t\t\tpatterns: externalPaths,\n\t\t\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, \"file\")),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn requests;\n\t\t};\n\n\tregistry.register(\"bash\", parseBashLikePermission(\"command\"));\n\tregistry.register(\"bash_input\", parseBashLikePermission(\"input\"));\n\tregistry.register(\"monitor\", (toolName, input, cwd) => {\n\t\tconst path = getString(input, \"path\");\n\t\tif (path) {\n\t\t\t// This runs on the host main thread: the parent identity must be derived without open(2)\n\t\t\t// (realpath opens directories and blocks forever on a wedged autofs trigger). Registration\n\t\t\t// performs the authoritative access check and re-derives the parent the same way.\n\t\t\tsetApprovedMonitorParent(input, realpathWithoutOpen(dirname(resolve(cwd, path))));\n\t\t\treturn withExternalDirectoryRequests(\n\t\t\t\t[{ permission: \"read\", patterns: [path], always: [path] }],\n\t\t\t\t[path],\n\t\t\t\tcwd,\n\t\t\t\t\"file\",\n\t\t\t);\n\t\t}\n\t\treturn parseBashLikePermission(\"command\")(toolName, input, cwd);\n\t});\n\n\tconst editParser: ToolPermissionParser = () => {\n\t\treturn [fallbackPermissionRequest(\"edit\")];\n\t};\n\n\tconst parseEditPermission: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (filePath) {\n\t\t\treturn withExternalDirectoryRequests(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tpermission: \"edit\",\n\t\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\t\talways: [filePath],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[filePath],\n\t\t\t\tcwd,\n\t\t\t\t\"file\",\n\t\t\t);\n\t\t}\n\n\t\tconst patchText = getString(input, \"input\", \"patchText\");\n\t\tif (!patchText) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst patchedPaths = extractPatchedPaths(patchText);\n\t\tif (patchedPaths.length === 0) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst editRequests = patchedPaths.map((patchedPath) => ({\n\t\t\tpermission: \"edit\",\n\t\t\tpatterns: [patchedPath],\n\t\t\talways: [patchedPath],\n\t\t}));\n\n\t\treturn withExternalDirectoryRequests(editRequests, patchedPaths, cwd, \"file\");\n\t};\n\n\tregistry.register(\"edit\", parseEditPermission);\n\tregistry.register(\"write\", parseEditPermission);\n\tregistry.register(\"apply_patch\", parseEditPermission);\n\tregistry.register(\"multiedit\", parseEditPermission);\n\n\tregistry.register(\"read\", (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (!filePath) {\n\t\t\treturn [fallbackPermissionRequest(\"read\")];\n\t\t}\n\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"read\",\n\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\talways: [filePath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[filePath],\n\t\t\tcwd,\n\t\t\t\"file\",\n\t\t);\n\t});\n\n\tregistry.register(\"grep\", (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\");\n\t\tconst pattern = getString(input, \"pattern\");\n\t\tconst permissionPattern = searchPath ?? pattern;\n\t\tif (!permissionPattern) {\n\t\t\treturn [fallbackPermissionRequest(\"grep\")];\n\t\t}\n\n\t\tconst grepRequests: PermissionRequest[] = [\n\t\t\t{\n\t\t\t\tpermission: \"grep\",\n\t\t\t\tpatterns: [permissionPattern],\n\t\t\t\talways: [\"*\"],\n\t\t\t},\n\t\t];\n\t\treturn searchPath ? withExternalDirectoryRequests(grepRequests, [searchPath], cwd, \"directory\") : grepRequests;\n\t});\n\n\tconst listParser: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\") ?? \".\";\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"list\",\n\t\t\t\t\tpatterns: [searchPath],\n\t\t\t\t\talways: [searchPath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[searchPath],\n\t\t\tcwd,\n\t\t\t\"directory\",\n\t\t);\n\t};\n\n\tregistry.register(\"find\", listParser);\n\tregistry.register(\"ls\", listParser);\n\n\treturn registry;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAE5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAY7E,SAAS,yBAAyB,CAAC,UAAkB;IACpD,OAAO;QACN,UAAU;QACV,QAAQ,EAAE,CAAC,GAAG,CAAC;QACf,MAAM,EAAE,CAAC,GAAG,CAAC;KACb,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAA8B,EAAE,GAAG,IAAc;IACnE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAID,SAAS,wBAAwB,CAAC,SAAiB,EAAE,KAAkB;IACtE,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAChD,OAAO,GAAG,SAAS,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC;IACjG,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,OAAO,GAAG,SAAS,GAAG,CAAC;IACxB,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAC/D,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,aAAa,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,KAA8B;IACpD,OAAO,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,6BAA6B,CACrC,QAA6B,EAC7B,KAAe,EACf,GAAW,EACX,KAAkB;IAElB,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IAClF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,OAAO;QACN,GAAG,QAAQ;QACX;YACC,UAAU,EAAE,oBAAoB;YAChC,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,wBAAwB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;SAC1F;KACD,CAAC;AACH,CAAC;AAED,qHAAqH;AACrH,MAAM,UAAU,2BAA2B,CAC1C,KAA0B,EAC1B,QAAgB,EAChB,KAA8B,EAC9B,GAAW;IAEX,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC9E,OAAO,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC/B,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;KAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oDAAoD;AACpD,MAAM,OAAO,cAAc;IAA3B;QACkB,YAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;IAoBpE,CAAC;IAlBA,4CAA4C;IAC5C,QAAQ,CAAC,QAAgB,EAAE,MAA4B;QACtD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,+CAA+C;IAC/C,GAAG,CAAC,QAAgB;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,QAAgB,EAAE,KAA8B,EAAE,GAAW;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;CACD;AAED,+DAA+D;AAC/D,MAAM,UAAU,2BAA2B;IAC1C,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IAEtC,2FAA2F;IAC3F,wFAAwF;IACxF,4FAA4F;IAC5F,2FAA2F;IAC3F,MAAM,uBAAuB,GAC5B,CAAC,UAAkB,EAAwB,EAAE,CAC7C,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAwB;YACrC;gBACC,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,CAAC,MAAM,IAAI,OAAO,CAAC;gBAC7B,MAAM;aACN;SACD,CAAC;QAEF,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC;gBACb,UAAU,EAAE,oBAAoB;gBAChC,QAAQ,EAAE,aAAa;gBACvB,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,wBAAwB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;aAC3F,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IACjB,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,IAAI,EAAE,CAAC;YACV,yFAAyF;YACzF,2FAA2F;YAC3F,kFAAkF;YAClF,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,OAAO,6BAA6B,CACnC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAC1D,CAAC,IAAI,CAAC,EACN,GAAG,EACH,MAAM,CACN,CAAC;QACH,CAAC;QACD,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAyB,GAAG,EAAE;QAC7C,OAAO,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAyB,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3E,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,QAAQ,EAAE,CAAC;YACd,OAAO,6BAA6B,CACnC;gBACC;oBACC,UAAU,EAAE,MAAM;oBAClB,QAAQ,EAAE,CAAC,QAAQ,CAAC;oBACpB,MAAM,EAAE,CAAC,QAAQ,CAAC;iBAClB;aACD,EACD,CAAC,QAAQ,CAAC,EACV,GAAG,EACH,MAAM,CACN,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,OAAO,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACvD,UAAU,EAAE,MAAM;YAClB,QAAQ,EAAE,CAAC,WAAW,CAAC;YACvB,MAAM,EAAE,CAAC,WAAW,CAAC;SACrB,CAAC,CAAC,CAAC;QAEJ,OAAO,6BAA6B,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC,CAAC;IAEF,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAEpD,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,OAAO,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,6BAA6B,CACnC;YACC;gBACC,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,CAAC,QAAQ,CAAC;gBACpB,MAAM,EAAE,CAAC,QAAQ,CAAC;aAClB;SACD,EACD,CAAC,QAAQ,CAAC,EACV,GAAG,EACH,MAAM,CACN,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,iBAAiB,GAAG,UAAU,IAAI,OAAO,CAAC;QAChD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxB,OAAO,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,YAAY,GAAwB;YACzC;gBACC,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,CAAC,iBAAiB,CAAC;gBAC7B,MAAM,EAAE,CAAC,GAAG,CAAC;aACb;SACD,CAAC;QACF,OAAO,UAAU,CAAC,CAAC,CAAC,6BAA6B,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAChH,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAyB,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAClE,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC;QACnD,OAAO,6BAA6B,CACnC;YACC;gBACC,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,CAAC,UAAU,CAAC;gBACtB,MAAM,EAAE,CAAC,UAAU,CAAC;aACpB;SACD,EACD,CAAC,UAAU,CAAC,EACZ,GAAG,EACH,WAAW,CACX,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEpC,OAAO,QAAQ,CAAC;AACjB,CAAC","sourcesContent":["import { dirname, resolve } from \"node:path\";\nimport { realpathWithoutOpen } from \"../../../../utils/paths.ts\";\nimport type { ToolInfo } from \"../../types.ts\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { BashArity } from \"../permission-system/arity.ts\";\nimport { extractExternalPaths, isExternalPath } from \"../permission-system/external-dir.ts\";\nimport type { Request } from \"../permission-system/types.ts\";\nimport { setApprovedMonitorParent } from \"../terminal/monitor-permission.ts\";\n\n/** Simplified permission request without ID/session metadata */\nexport type PermissionRequest = Pick<Request, \"permission\" | \"patterns\" | \"always\">;\n\n/** Parser function that extracts permission requests from tool input */\nexport type ToolPermissionParser = (\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n) => PermissionRequest[];\n\nfunction fallbackPermissionRequest(permission: string): PermissionRequest {\n\treturn {\n\t\tpermission,\n\t\tpatterns: [\"*\"],\n\t\talways: [\"*\"],\n\t};\n}\n\nfunction getString(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = input[key];\n\t\tif (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\ntype AlwaysScope = \"file\" | \"directory\";\n\nfunction toParentDirectoryPattern(inputPath: string, scope: AlwaysScope): string {\n\tif (inputPath === \"~\" || inputPath === \"$HOME\") {\n\t\treturn `${inputPath}/*`;\n\t}\n\n\tif (scope === \"directory\") {\n\t\treturn inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\") ? `${inputPath}*` : `${inputPath}/*`;\n\t}\n\n\tif (inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\")) {\n\t\treturn `${inputPath}*`;\n\t}\n\n\tconst parentPattern = inputPath.replace(/[\\\\/][^\\\\/]+$/, \"/*\");\n\tif (parentPattern === \"/*\") {\n\t\treturn inputPath;\n\t}\n\treturn parentPattern;\n}\n\nfunction parseFilePath(input: Record<string, unknown>): string | undefined {\n\treturn getString(input, \"path\", \"file_path\");\n}\n\nfunction withExternalDirectoryRequests(\n\trequests: PermissionRequest[],\n\tpaths: string[],\n\tcwd: string,\n\tscope: AlwaysScope,\n): PermissionRequest[] {\n\tconst externalPaths = paths.filter((inputPath) => isExternalPath(inputPath, cwd));\n\tif (externalPaths.length === 0) {\n\t\treturn requests;\n\t}\n\n\treturn [\n\t\t...requests,\n\t\t{\n\t\t\tpermission: \"external_directory\",\n\t\t\tpatterns: externalPaths,\n\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, scope)),\n\t\t},\n\t];\n}\n\n/** The requests a tool's own `permissionParser` derives from this call, or undefined when the tool declares none. */\nexport function toolOwnedPermissionRequests(\n\ttools: readonly ToolInfo[],\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n): PermissionRequest[] | undefined {\n\tconst parser = tools.find((tool) => tool.name === toolName)?.permissionParser;\n\treturn parser?.(input, cwd).map((request) => ({\n\t\tpermission: request.permission,\n\t\tpatterns: [...request.patterns],\n\t\talways: [...request.always],\n\t}));\n}\n\n/** Registry for tool-specific permission parsers */\nexport class ParserRegistry {\n\tprivate readonly parsers = new Map<string, ToolPermissionParser>();\n\n\t/** Register a parser for a specific tool */\n\tregister(toolName: string, parser: ToolPermissionParser): void {\n\t\tthis.parsers.set(toolName, parser);\n\t}\n\n\t/** Whether a built-in parser owns this tool */\n\thas(toolName: string): boolean {\n\t\treturn this.parsers.has(toolName);\n\t}\n\n\t/** Parse tool input into permission requests */\n\tparse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] {\n\t\tconst parser = this.parsers.get(toolName);\n\t\tif (!parser) {\n\t\t\treturn [fallbackPermissionRequest(toolName)];\n\t\t}\n\t\treturn parser(toolName, input, cwd);\n\t}\n}\n\n/** Create registry with built-in parsers for standard tools */\nexport function createBuiltinParserRegistry(): ParserRegistry {\n\tconst registry = new ParserRegistry();\n\n\t// bash_input writes arbitrary stdin to a live shell session = arbitrary command execution,\n\t// so it MUST be gated in the SAME `bash` permission class (via the `input` field), else\n\t// read-only/ask presets would be bypassable through a persistent session. The steering/read\n\t// tools (bash_output/kill_bash/bash_resize) fall back to their own tool-named permissions.\n\tconst parseBashLikePermission =\n\t\t(commandKey: string): ToolPermissionParser =>\n\t\t(_toolName, input, cwd) => {\n\t\t\tconst command = getString(input, commandKey);\n\t\t\tif (!command) {\n\t\t\t\treturn [fallbackPermissionRequest(\"bash\")];\n\t\t\t}\n\n\t\t\tconst tokens = command.split(/\\s+/).filter(Boolean);\n\t\t\tconst prefix = BashArity.prefix(tokens).join(\" \");\n\t\t\tconst always = prefix ? [prefix, `${prefix} *`] : [\"*\"];\n\t\t\tconst requests: PermissionRequest[] = [\n\t\t\t\t{\n\t\t\t\t\tpermission: \"bash\",\n\t\t\t\t\tpatterns: [prefix || command],\n\t\t\t\t\talways,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst externalPaths = extractExternalPaths(command, cwd);\n\t\t\tif (externalPaths.length > 0) {\n\t\t\t\trequests.push({\n\t\t\t\t\tpermission: \"external_directory\",\n\t\t\t\t\tpatterns: externalPaths,\n\t\t\t\t\talways: externalPaths.map((externalPath) => toParentDirectoryPattern(externalPath, \"file\")),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn requests;\n\t\t};\n\n\tregistry.register(\"bash\", parseBashLikePermission(\"command\"));\n\tregistry.register(\"bash_input\", parseBashLikePermission(\"input\"));\n\tregistry.register(\"monitor\", (toolName, input, cwd) => {\n\t\tconst path = getString(input, \"path\");\n\t\tif (path) {\n\t\t\t// This runs on the host main thread: the parent identity must be derived without open(2)\n\t\t\t// (realpath opens directories and blocks forever on a wedged autofs trigger). Registration\n\t\t\t// performs the authoritative access check and re-derives the parent the same way.\n\t\t\tsetApprovedMonitorParent(input, realpathWithoutOpen(dirname(resolve(cwd, path))));\n\t\t\treturn withExternalDirectoryRequests(\n\t\t\t\t[{ permission: \"read\", patterns: [path], always: [path] }],\n\t\t\t\t[path],\n\t\t\t\tcwd,\n\t\t\t\t\"file\",\n\t\t\t);\n\t\t}\n\t\treturn parseBashLikePermission(\"command\")(toolName, input, cwd);\n\t});\n\n\tconst editParser: ToolPermissionParser = () => {\n\t\treturn [fallbackPermissionRequest(\"edit\")];\n\t};\n\n\tconst parseEditPermission: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (filePath) {\n\t\t\treturn withExternalDirectoryRequests(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tpermission: \"edit\",\n\t\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\t\talways: [filePath],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[filePath],\n\t\t\t\tcwd,\n\t\t\t\t\"file\",\n\t\t\t);\n\t\t}\n\n\t\tconst patchText = getString(input, \"input\", \"patchText\");\n\t\tif (!patchText) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst patchedPaths = extractPatchedPaths(patchText);\n\t\tif (patchedPaths.length === 0) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst editRequests = patchedPaths.map((patchedPath) => ({\n\t\t\tpermission: \"edit\",\n\t\t\tpatterns: [patchedPath],\n\t\t\talways: [patchedPath],\n\t\t}));\n\n\t\treturn withExternalDirectoryRequests(editRequests, patchedPaths, cwd, \"file\");\n\t};\n\n\tregistry.register(\"edit\", parseEditPermission);\n\tregistry.register(\"write\", parseEditPermission);\n\tregistry.register(\"apply_patch\", parseEditPermission);\n\tregistry.register(\"multiedit\", parseEditPermission);\n\n\tregistry.register(\"read\", (_toolName, input, cwd) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (!filePath) {\n\t\t\treturn [fallbackPermissionRequest(\"read\")];\n\t\t}\n\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"read\",\n\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\talways: [filePath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[filePath],\n\t\t\tcwd,\n\t\t\t\"file\",\n\t\t);\n\t});\n\n\tregistry.register(\"grep\", (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\");\n\t\tconst pattern = getString(input, \"pattern\");\n\t\tconst permissionPattern = searchPath ?? pattern;\n\t\tif (!permissionPattern) {\n\t\t\treturn [fallbackPermissionRequest(\"grep\")];\n\t\t}\n\n\t\tconst grepRequests: PermissionRequest[] = [\n\t\t\t{\n\t\t\t\tpermission: \"grep\",\n\t\t\t\tpatterns: [permissionPattern],\n\t\t\t\talways: [\"*\"],\n\t\t\t},\n\t\t];\n\t\treturn searchPath ? withExternalDirectoryRequests(grepRequests, [searchPath], cwd, \"directory\") : grepRequests;\n\t});\n\n\tconst listParser: ToolPermissionParser = (_toolName, input, cwd) => {\n\t\tconst searchPath = getString(input, \"path\") ?? \".\";\n\t\treturn withExternalDirectoryRequests(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tpermission: \"list\",\n\t\t\t\t\tpatterns: [searchPath],\n\t\t\t\t\talways: [searchPath],\n\t\t\t\t},\n\t\t\t],\n\t\t\t[searchPath],\n\t\t\tcwd,\n\t\t\t\"directory\",\n\t\t);\n\t};\n\n\tregistry.register(\"find\", listParser);\n\tregistry.register(\"ls\", listParser);\n\n\treturn registry;\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type GitRunner } from "../../repository-identity.ts";
|
|
2
|
+
import type { ExtensionAPI } from "../types.ts";
|
|
3
|
+
export declare function createRepositoryIdentityExtension(run?: GitRunner): (pi: ExtensionAPI) => void;
|
|
4
|
+
declare const _default: (pi: ExtensionAPI) => void;
|
|
5
|
+
export default _default;
|
|
6
|
+
//# sourceMappingURL=repository-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-identity.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/repository-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EAMd,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAgB,iCAAiC,CAAC,GAAG,CAAC,EAAE,SAAS,QACpD,YAAY,KAAG,IAAI,CAgB/B;6BAhBY,YAAY,KAAG,IAAI"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { parseRepositoryIdentity, REPOSITORY_IDENTITY_ENTRY_TYPE, readRepositoryIdentity, sameRepositoryIdentity, } from "../../repository-identity.js";
|
|
2
|
+
// Records which git repository a session's cwd belongs to, so a session whose repository was later
|
|
3
|
+
// moved can still be recognised as the same project from the new path (senpi#2181).
|
|
4
|
+
export function createRepositoryIdentityExtension(run) {
|
|
5
|
+
return (pi) => {
|
|
6
|
+
let generation = 0;
|
|
7
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
8
|
+
const current = ++generation;
|
|
9
|
+
if (ctx.sessionManager.getSessionFile() === undefined)
|
|
10
|
+
return;
|
|
11
|
+
const identity = await readRepositoryIdentity(ctx.cwd, run);
|
|
12
|
+
if (current !== generation || identity === undefined)
|
|
13
|
+
return;
|
|
14
|
+
if (sameRepositoryIdentity(latestRecordedIdentity(ctx.sessionManager), identity))
|
|
15
|
+
return;
|
|
16
|
+
pi.appendEntry(REPOSITORY_IDENTITY_ENTRY_TYPE, identity);
|
|
17
|
+
});
|
|
18
|
+
pi.on("session_shutdown", () => {
|
|
19
|
+
generation++;
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function latestRecordedIdentity(sessionManager) {
|
|
24
|
+
let recorded;
|
|
25
|
+
for (const entry of sessionManager.getEntries()) {
|
|
26
|
+
if (entry.type === "custom" && entry.customType === REPOSITORY_IDENTITY_ENTRY_TYPE) {
|
|
27
|
+
recorded = parseRepositoryIdentity(entry.data) ?? recorded;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return recorded;
|
|
31
|
+
}
|
|
32
|
+
export default createRepositoryIdentityExtension();
|
|
33
|
+
//# sourceMappingURL=repository-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-identity.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/repository-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,uBAAuB,EACvB,8BAA8B,EAE9B,sBAAsB,EACtB,sBAAsB,GACtB,MAAM,8BAA8B,CAAC;AAItC,mGAAmG;AACnG,oFAAoF;AACpF,MAAM,UAAU,iCAAiC,CAAC,GAAe;IAChE,OAAO,CAAC,EAAgB,EAAQ,EAAE;QACjC,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;YAC5C,MAAM,OAAO,GAAG,EAAE,UAAU,CAAC;YAC7B,IAAI,GAAG,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,SAAS;gBAAE,OAAO;YAC9D,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC5D,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO;YAC7D,IAAI,sBAAsB,CAAC,sBAAsB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC;gBAAE,OAAO;YACzF,EAAE,CAAC,WAAW,CAAC,8BAA8B,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAC9B,UAAU,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,cAAsC;IACrE,IAAI,QAAwC,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,8BAA8B,EAAE,CAAC;YACpF,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;QAC5D,CAAC;IACF,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,eAAe,iCAAiC,EAAE,CAAC","sourcesContent":["import {\n\ttype GitRunner,\n\tparseRepositoryIdentity,\n\tREPOSITORY_IDENTITY_ENTRY_TYPE,\n\ttype RepositoryIdentity,\n\treadRepositoryIdentity,\n\tsameRepositoryIdentity,\n} from \"../../repository-identity.ts\";\nimport type { ReadonlySessionManager } from \"../../session-manager.ts\";\nimport type { ExtensionAPI } from \"../types.ts\";\n\n// Records which git repository a session's cwd belongs to, so a session whose repository was later\n// moved can still be recognised as the same project from the new path (senpi#2181).\nexport function createRepositoryIdentityExtension(run?: GitRunner) {\n\treturn (pi: ExtensionAPI): void => {\n\t\tlet generation = 0;\n\n\t\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\t\tconst current = ++generation;\n\t\t\tif (ctx.sessionManager.getSessionFile() === undefined) return;\n\t\t\tconst identity = await readRepositoryIdentity(ctx.cwd, run);\n\t\t\tif (current !== generation || identity === undefined) return;\n\t\t\tif (sameRepositoryIdentity(latestRecordedIdentity(ctx.sessionManager), identity)) return;\n\t\t\tpi.appendEntry(REPOSITORY_IDENTITY_ENTRY_TYPE, identity);\n\t\t});\n\n\t\tpi.on(\"session_shutdown\", () => {\n\t\t\tgeneration++;\n\t\t});\n\t};\n}\n\nfunction latestRecordedIdentity(sessionManager: ReadonlySessionManager): RepositoryIdentity | undefined {\n\tlet recorded: RepositoryIdentity | undefined;\n\tfor (const entry of sessionManager.getEntries()) {\n\t\tif (entry.type === \"custom\" && entry.customType === REPOSITORY_IDENTITY_ENTRY_TYPE) {\n\t\t\trecorded = parseRepositoryIdentity(entry.data) ?? recorded;\n\t\t}\n\t}\n\treturn recorded;\n}\n\nexport default createRepositoryIdentityExtension();\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { captureListAsk } from "./todo-ask.ts";
|
|
2
2
|
export { type AskNowNext, describeAskNowNext, formatAskNowNextHeader, formatHandoffCue, formatSummary, getTodoMarker, getTodoResultLines, HANDOFF_CUES, type HandoffMoment, handoffMomentOf, isIncompleteTodo, isTerminalTodoStatus, sanitizeTodoText, } from "./todo-format.ts";
|
|
3
3
|
export { appendItems, applyEntry, applyOpsToPhases, applyParams, initPhases, removeTasks, } from "./todo-operations.ts";
|
|
4
4
|
export { findPhaseByName, findTaskByContent, getCompletionTransitions, nextActionableTask, normalizeInProgressTask, } from "./todo-query.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACN,KAAK,UAAU,EACf,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,KAAK,aAAa,EAClB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,WAAW,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EACN,WAAW,EACX,SAAS,EACT,gCAAgC,EAChC,mCAAmC,EACnC,+BAA+B,EAC/B,SAAS,EACT,UAAU,EACV,eAAe,EACf,WAAW,EACX,gBAAgB,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,OAAO,EACZ,KAAK,wBAAwB,EAC7B,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,eAAe,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,aAAa,GAClB,MAAM,kBAAkB,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright (c) 2025 Mario Zechner
|
|
3
3
|
// Copyright (c) 2025-2026 Can Bölük
|
|
4
4
|
// https://github.com/can1357/oh-my-pi
|
|
5
|
-
export {
|
|
5
|
+
export { captureListAsk } from "./todo-ask.js";
|
|
6
6
|
export { describeAskNowNext, formatAskNowNextHeader, formatHandoffCue, formatSummary, getTodoMarker, getTodoResultLines, HANDOFF_CUES, handoffMomentOf, isIncompleteTodo, isTerminalTodoStatus, sanitizeTodoText, } from "./todo-format.js";
|
|
7
7
|
export { appendItems, applyEntry, applyOpsToPhases, applyParams, initPhases, removeTasks, } from "./todo-operations.js";
|
|
8
8
|
export { findPhaseByName, findTaskByContent, getCompletionTransitions, nextActionableTask, normalizeInProgressTask, } from "./todo-query.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,mCAAmC;AACnC,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/todotools/state.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,mCAAmC;AACnC,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAEN,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,YAAY,EAEZ,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,WAAW,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EACN,WAAW,EACX,SAAS,EACT,gCAAgC,EAChC,mCAAmC,EACnC,+BAA+B,EAC/B,SAAS,EACT,UAAU,EACV,eAAe,EACf,WAAW,EACX,gBAAgB,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,GAWrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,kBAAkB,EAClB,kBAAkB,GAGlB,MAAM,kBAAkB,CAAC","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nexport { captureListAsk } from \"./todo-ask.ts\";\nexport {\n\ttype AskNowNext,\n\tdescribeAskNowNext,\n\tformatAskNowNextHeader,\n\tformatHandoffCue,\n\tformatSummary,\n\tgetTodoMarker,\n\tgetTodoResultLines,\n\tHANDOFF_CUES,\n\ttype HandoffMoment,\n\thandoffMomentOf,\n\tisIncompleteTodo,\n\tisTerminalTodoStatus,\n\tsanitizeTodoText,\n} from \"./todo-format.ts\";\nexport {\n\tappendItems,\n\tapplyEntry,\n\tapplyOpsToPhases,\n\tapplyParams,\n\tinitPhases,\n\tremoveTasks,\n} from \"./todo-operations.ts\";\nexport {\n\tfindPhaseByName,\n\tfindTaskByContent,\n\tgetCompletionTransitions,\n\tnextActionableTask,\n\tnormalizeInProgressTask,\n} from \"./todo-query.ts\";\nexport { getTaskTargets, resolvePhaseOrError, resolveTaskOrError } from \"./todo-resolution.ts\";\nexport {\n\tclonePhases,\n\tcloneTask,\n\tgetLatestPhasesFromBranchEntries,\n\tgetLatestTodoStateFromBranchEntries,\n\tgetLatestTodosFromBranchEntries,\n\tisTodoAsk,\n\tisTodoItem,\n\tisTodoItemArray,\n\tisTodoPhase,\n\tisTodoPhaseArray,\n} from \"./todo-storage.ts\";\nexport {\n\tDEFAULT_INIT_PHASE,\n\tTODO_RESTORE_REQUEST_TYPE,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoAsk,\n\ttype TodoCompletionTransition,\n\ttype TodoItem,\n\ttype TodoOpEntry,\n\ttype TodoOperation,\n\ttype TodoPhase,\n\ttype TodoState,\n\ttype TodoStateEntry,\n\ttype TodoStatus,\n\ttype TodoToolDetails,\n} from \"./todo-types.ts\";\nexport {\n\tgetTodoWidgetLines,\n\tgetTodoWidgetModel,\n\ttype TodoWidgetModel,\n\ttype TodoWidgetRow,\n} from \"./todo-widget.ts\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repetitive-turns.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/repetitive-turns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAE7D,eAAO,MAAM,qCAAqC,OAAO,CAAC;AAC1D,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,qCAAqC,KAAK,CAAC;AACxD,eAAO,MAAM,iCAAiC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"repetitive-turns.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/repetitive-turns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAE7D,eAAO,MAAM,qCAAqC,OAAO,CAAC;AAC1D,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,qCAAqC,KAAK,CAAC;AACxD,eAAO,MAAM,iCAAiC,IAAI,CAAC;AAYnD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUtD;AAWD,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAS3D;AAED,wBAAgB,6BAA6B,CAAC,mBAAmB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAE9G;AAED,UAAU,SAAS;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,0BAA0B,IAAI,oBAAoB,CAEjE;AAWD,wBAAgB,cAAc,CAAC,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAkC9F"}
|
|
@@ -9,7 +9,9 @@ const HEX_LIKE_PATTERN = /\b[0-9a-f]{7,}\b/gi;
|
|
|
9
9
|
const SAMPLE_LENGTH = 80;
|
|
10
10
|
// The handoff contract restates the user's request verbatim after `Ask:` in every block, so that clause is
|
|
11
11
|
// identical by design across turns; it ends where the block's own status starts (`For you:` / `You need:` / `Now:`).
|
|
12
|
-
|
|
12
|
+
// Only a clause that such a label closes is a handoff Ask; any other `Ask:` stays in the text, so a looping turn
|
|
13
|
+
// that merely contains the word keeps its full repetition signal (senpi#2143).
|
|
14
|
+
const HANDOFF_ASK_CLAUSE = /\bAsk:[\s\S]*?(?=\b(?:For you|You need|Now):)/g;
|
|
13
15
|
export function normalizeTurnText(text) {
|
|
14
16
|
return text
|
|
15
17
|
.replace(HANDOFF_ASK_CLAUSE, " ")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repetitive-turns.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/repetitive-turns.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AAE7D,MAAM,CAAC,MAAM,qCAAqC,GAAG,IAAI,CAAC;AAC1D,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AACxD,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,CAAC;AAEnD,MAAM,YAAY,GAAG,kBAAkB,CAAC;AACxC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAC1C,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAC9C,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,2GAA2G;AAC3G,qHAAqH;AACrH,MAAM,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"repetitive-turns.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/ttsr/detectors/repetitive-turns.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DetectorMatch } from \"../types.ts\";\n\nexport const REPETITIVE_TURNS_RULE_NAME = \"repetitive-turns\";\n\nexport const REPETITIVE_TURNS_SIMILARITY_THRESHOLD = 0.55;\nexport const REPETITIVE_TURNS_STREAK_LENGTH = 3;\nexport const REPETITIVE_TURNS_MIN_NORMALIZED_CHARS = 40;\nexport const REPETITIVE_TURNS_HISTORY_CAPACITY = 6;\n\nconst WORD_PATTERN = /[\\p{L}\\p{N}#]+/gu;\nconst DIGIT_RUN_PATTERN = /\\d[\\d.,:/-]*/g;\nconst HEX_LIKE_PATTERN = /\\b[0-9a-f]{7,}\\b/gi;\nconst SAMPLE_LENGTH = 80;\n// The handoff contract restates the user's request verbatim after `Ask:` in every block, so that clause is\n// identical by design across turns; it ends where the block's own status starts (`For you:` / `You need:` / `Now:`).\n// Only a clause that such a label closes is a handoff Ask; any other `Ask:` stays in the text, so a looping turn\n// that merely contains the word keeps its full repetition signal (senpi#2143).\nconst HANDOFF_ASK_CLAUSE = /\\bAsk:[\\s\\S]*?(?=\\b(?:For you|You need|Now):)/g;\n\nexport function normalizeTurnText(text: string): string {\n\treturn text\n\t\t.replace(HANDOFF_ASK_CLAUSE, \" \")\n\t\t.toLowerCase()\n\t\t.replace(HEX_LIKE_PATTERN, \"#\")\n\t\t.replace(DIGIT_RUN_PATTERN, \"#\")\n\t\t.split(/\\s+/)\n\t\t.filter((token) => token.length > 0)\n\t\t.join(\" \")\n\t\t.trim();\n}\n\nfunction wordTrigrams(normalized: string): Set<string> {\n\tconst words = normalized.match(WORD_PATTERN) ?? [];\n\tconst grams = new Set<string>();\n\tfor (let i = 0; i + 3 <= words.length; i++) {\n\t\tgrams.add(`${words[i]} ${words[i + 1]} ${words[i + 2]}`);\n\t}\n\treturn grams;\n}\n\nexport function trigramJaccard(a: string, b: string): number {\n\tconst gramsA = wordTrigrams(a);\n\tconst gramsB = wordTrigrams(b);\n\tif (gramsA.size === 0 || gramsB.size === 0) return 0;\n\tlet intersection = 0;\n\tfor (const gram of gramsA) {\n\t\tif (gramsB.has(gram)) intersection += 1;\n\t}\n\treturn intersection / (gramsA.size + gramsB.size - intersection);\n}\n\nexport function isNearDuplicateOfPreviousTurn(normalizedCandidate: string, normalizedPrevious: string): boolean {\n\treturn trigramJaccard(normalizedCandidate, normalizedPrevious) >= REPETITIVE_TURNS_SIMILARITY_THRESHOLD;\n}\n\ninterface TurnEntry {\n\treadonly normalized: string;\n\treadonly grams: Set<string>;\n}\n\nexport interface RepetitiveTurnsState {\n\treadonly history: TurnEntry[];\n\tstreak: number;\n\tlatched: boolean;\n}\n\nexport function createRepetitiveTurnsState(): RepetitiveTurnsState {\n\treturn { history: [], streak: 0, latched: false };\n}\n\nfunction jaccardSets(a: Set<string>, b: Set<string>): number {\n\tif (a.size === 0 || b.size === 0) return 0;\n\tlet intersection = 0;\n\tfor (const gram of a) {\n\t\tif (b.has(gram)) intersection += 1;\n\t}\n\treturn intersection / (a.size + b.size - intersection);\n}\n\nexport function recordTurnText(state: RepetitiveTurnsState, text: string): DetectorMatch | null {\n\tconst normalized = normalizeTurnText(text);\n\tif (normalized.length < REPETITIVE_TURNS_MIN_NORMALIZED_CHARS) {\n\t\treturn null;\n\t}\n\tconst grams = wordTrigrams(normalized);\n\tconst previous = state.history[state.history.length - 1];\n\tconst similarity = previous === undefined ? 0 : jaccardSets(grams, previous.grams);\n\tstate.history.push({ normalized, grams });\n\tif (state.history.length > REPETITIVE_TURNS_HISTORY_CAPACITY) {\n\t\tstate.history.shift();\n\t}\n\tif (similarity >= REPETITIVE_TURNS_SIMILARITY_THRESHOLD) {\n\t\tstate.streak += 1;\n\t} else {\n\t\tstate.streak = 0;\n\t\tif (state.latched) state.latched = false;\n\t}\n\tif (state.latched || state.streak < REPETITIVE_TURNS_STREAK_LENGTH - 1) {\n\t\treturn null;\n\t}\n\tstate.latched = true;\n\treturn {\n\t\trule: REPETITIVE_TURNS_RULE_NAME,\n\t\treason: `assistant repeated a near-identical message across ${state.streak + 1} consecutive turns (jaccard ${similarity.toFixed(2)})`,\n\t\tanomalyStartOffset: 0,\n\t\tgarbageStartOffset: 0,\n\t\tdetail: {\n\t\t\tmechanism: \"cross-turn\",\n\t\t\tstreak: state.streak + 1,\n\t\t\tsimilarity: Number(similarity.toFixed(3)),\n\t\t\tsample: normalized.slice(0, SAMPLE_LENGTH),\n\t\t},\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bun-extension-importer.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/bun-extension-importer.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAYxE,iFAAiF;AACjF,wBAAgB,0BAA0B,CACzC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"bun-extension-importer.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/bun-extension-importer.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAYxE,iFAAiF;AACjF,wBAAgB,0BAA0B,CACzC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAiIpE,MAAM,OAAO,MAAM,YAAY;QAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBlF,aAAa,IAAI,SAAS,MAAM,EAAE;IAGlC,OAAO;EAQR"}
|
|
@@ -6,7 +6,7 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
|
|
|
6
6
|
}
|
|
7
7
|
return path;
|
|
8
8
|
};
|
|
9
|
-
import { readFileSync, realpathSync } from "node:fs";
|
|
9
|
+
import { readFileSync, realpathSync, statSync } from "node:fs";
|
|
10
10
|
import { createRequire, isBuiltin } from "node:module";
|
|
11
11
|
import { dirname, extname, resolve } from "node:path";
|
|
12
12
|
import { fileURLToPath } from "node:url";
|
|
@@ -30,6 +30,10 @@ export function createBunExtensionImporter(virtualModules) {
|
|
|
30
30
|
throw new ExtensionGenerationDisposedError(registration.generation);
|
|
31
31
|
};
|
|
32
32
|
const moduleId = (filename) => `${extensionNamespace}:${registration.generation}/${encodeURIComponent(filename)}`;
|
|
33
|
+
// Only source the graph transpiles gets a graph id. Anything else (JSON, TOML, text, native
|
|
34
|
+
// addons) keeps its real path so Bun's own loader handles it: Bun 1.3.x cannot follow a
|
|
35
|
+
// plugin's hand-back to the `file` namespace from a runtime import() or require() (#2164).
|
|
36
|
+
const fileTarget = (resolved) => /\.[cm]?[jt]sx?$/.test(resolved) ? { id: moduleId(resolved), path: resolved } : { id: resolved };
|
|
33
37
|
const resolveTarget = (specifier, filename) => {
|
|
34
38
|
assertActive();
|
|
35
39
|
if (Object.hasOwn(virtualModules, specifier) || isBuiltin(specifier) || specifier.startsWith("bun:"))
|
|
@@ -37,8 +41,7 @@ export function createBunExtensionImporter(virtualModules) {
|
|
|
37
41
|
if (specifier.startsWith(`${extensionNamespace}:`))
|
|
38
42
|
return { id: specifier };
|
|
39
43
|
const path = specifier.startsWith("file:") ? fileURLToPath(specifier) : specifier;
|
|
40
|
-
|
|
41
|
-
return { id: moduleId(resolved), path: resolved };
|
|
44
|
+
return fileTarget(realpathSync(Bun.resolveSync(path, dirname(filename))));
|
|
42
45
|
};
|
|
43
46
|
const graph = {
|
|
44
47
|
assertActive,
|
|
@@ -150,7 +153,10 @@ export function createBunExtensionImporter(virtualModules) {
|
|
|
150
153
|
return {
|
|
151
154
|
async import(path, _options) {
|
|
152
155
|
assertActive();
|
|
153
|
-
const
|
|
156
|
+
const absolute = realpathSync(resolve(path));
|
|
157
|
+
// A package directory loads through its main or index file, as a native import does.
|
|
158
|
+
const entry = statSync(absolute).isDirectory() ? realpathSync(Bun.resolveSync(absolute, absolute)) : absolute;
|
|
159
|
+
const { id } = fileTarget(entry);
|
|
154
160
|
const module = await import(__rewriteRelativeImportExtension(id));
|
|
155
161
|
const factory = module.default;
|
|
156
162
|
if (typeof factory !== "function")
|