@caupulican/pi-adaptative 0.90.2 → 0.90.4
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 +35 -0
- package/dist/core/agent-session-contracts.d.ts +2 -0
- package/dist/core/agent-session-contracts.d.ts.map +1 -1
- package/dist/core/agent-session-contracts.js.map +1 -1
- package/dist/core/autonomy/bounded-completion.d.ts +10 -1
- package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
- package/dist/core/autonomy/bounded-completion.js +24 -2
- package/dist/core/autonomy/bounded-completion.js.map +1 -1
- package/dist/core/autonomy/lane-tracker.d.ts +1 -1
- package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tracker.js +9 -1
- package/dist/core/autonomy/lane-tracker.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +1 -3
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/compaction-controller.d.ts.map +1 -1
- package/dist/core/compaction-controller.js +0 -1
- package/dist/core/compaction-controller.js.map +1 -1
- package/dist/core/delegation/managed-lane-controller.d.ts.map +1 -1
- package/dist/core/delegation/managed-lane-controller.js +5 -1
- package/dist/core/delegation/managed-lane-controller.js.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts +8 -1
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.js +94 -36
- package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-agent-control.d.ts +1 -0
- package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +7 -2
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.js +26 -3
- package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +7 -4
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +110 -27
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.d.ts +9 -2
- package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
- package/dist/core/delegation/worker-fleet-limits.js +39 -3
- package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
- package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -1
- package/dist/core/delegation/worker-lane-projection.js +4 -0
- package/dist/core/delegation/worker-lane-projection.js.map +1 -1
- package/dist/core/delegation/worker-lease-heartbeat.d.ts +16 -0
- package/dist/core/delegation/worker-lease-heartbeat.d.ts.map +1 -0
- package/dist/core/delegation/worker-lease-heartbeat.js +37 -0
- package/dist/core/delegation/worker-lease-heartbeat.js.map +1 -0
- package/dist/core/delegation/worker-lifecycle.d.ts +1 -0
- package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
- package/dist/core/delegation/worker-lifecycle.js +6 -0
- package/dist/core/delegation/worker-lifecycle.js.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.js +2 -1
- package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-runner.js +2 -2
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-terminal-handoff-coordinator.d.ts +1 -0
- package/dist/core/delegation/worker-terminal-handoff-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-terminal-handoff-coordinator.js +1 -0
- package/dist/core/delegation/worker-terminal-handoff-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts +4 -2
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.js +10 -2
- package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +14 -0
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.js +121 -33
- package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +5 -0
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.js +28 -12
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
- package/dist/core/orchestration/capability-gateway.d.ts +2 -1
- package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
- package/dist/core/orchestration/capability-gateway.js +9 -2
- package/dist/core/orchestration/capability-gateway.js.map +1 -1
- package/dist/core/orchestration/contracts.d.ts +16 -1
- package/dist/core/orchestration/contracts.d.ts.map +1 -1
- package/dist/core/orchestration/contracts.js +5 -0
- package/dist/core/orchestration/contracts.js.map +1 -1
- package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
- package/dist/core/orchestration/profile-registry.js +38 -1
- package/dist/core/orchestration/profile-registry.js.map +1 -1
- package/dist/core/orchestration/risk-budget.d.ts +10 -0
- package/dist/core/orchestration/risk-budget.d.ts.map +1 -1
- package/dist/core/orchestration/risk-budget.js +14 -0
- package/dist/core/orchestration/risk-budget.js.map +1 -1
- package/dist/core/orchestration/task-runtime-reducer.d.ts +1 -0
- package/dist/core/orchestration/task-runtime-reducer.d.ts.map +1 -1
- package/dist/core/orchestration/task-runtime-reducer.js +34 -0
- package/dist/core/orchestration/task-runtime-reducer.js.map +1 -1
- package/dist/core/orchestration/task-runtime.d.ts +1 -0
- package/dist/core/orchestration/task-runtime.d.ts.map +1 -1
- package/dist/core/orchestration/task-runtime.js +24 -1
- package/dist/core/orchestration/task-runtime.js.map +1 -1
- package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
- package/dist/core/provider-prompt-contracts.js +2 -1
- package/dist/core/provider-prompt-contracts.js.map +1 -1
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +8 -1
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +2 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/tools/bash.d.ts +3 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +13 -2
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/delegate-status.d.ts +1 -0
- package/dist/core/tools/delegate-status.d.ts.map +1 -1
- package/dist/core/tools/delegate-status.js +19 -1
- package/dist/core/tools/delegate-status.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +9 -1
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +198 -64
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +14 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-failure-recovery.d.ts +3 -0
- package/dist/core/tools/file-failure-recovery.d.ts.map +1 -1
- package/dist/core/tools/file-failure-recovery.js +11 -0
- package/dist/core/tools/file-failure-recovery.js.map +1 -1
- package/dist/core/tools/orchestration-panel.d.ts +1 -1
- package/dist/core/tools/orchestration-panel.d.ts.map +1 -1
- package/dist/core/tools/orchestration-panel.js +1 -0
- package/dist/core/tools/orchestration-panel.js.map +1 -1
- package/dist/core/tools/profile-writer.d.ts.map +1 -1
- package/dist/core/tools/profile-writer.js +2 -8
- package/dist/core/tools/profile-writer.js.map +1 -1
- package/dist/core/tools/search-command-guard.d.ts.map +1 -1
- package/dist/core/tools/search-command-guard.js +10 -3
- package/dist/core/tools/search-command-guard.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +10 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/modes/interactive/components/activity-lane.d.ts +1 -1
- package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
- package/dist/modes/interactive/components/activity-lane.js +11 -2
- package/dist/modes/interactive/components/activity-lane.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/utils/shell.d.ts +2 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +3 -1
- package/dist/utils/shell.js.map +1 -1
- package/docs/harness-architecture.md +6 -3
- package/docs/settings.md +8 -6
- package/docs/tool-repair.md +1 -1
- package/docs/worker-profiles.md +2 -2
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-command-guard.js","sourceRoot":"","sources":["../../../src/core/tools/search-command-guard.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { basename, resolve } from \"node:path\";\nimport { tokenizeShellCommand } from \"./shell-command-parser.ts\";\n\nexport const BROAD_SEARCH_OUTPUT_ROUTE = \"route-to-file\" as const;\n\nexport type SearchScopeAssessment =\n\t| { kind: \"scoped\" }\n\t| { kind: \"broad\"; searchTool: \"rg\" | \"grep\" | \"find\" | \"fd\"; reason: string };\n\nconst RG_LONG_VALUE_FLAGS = new Set([\n\t\"--after-context\",\n\t\"--before-context\",\n\t\"--color\",\n\t\"--colors\",\n\t\"--context\",\n\t\"--context-separator\",\n\t\"--encoding\",\n\t\"--engine\",\n\t\"--field-context-separator\",\n\t\"--field-match-separator\",\n\t\"--glob\",\n\t\"--iglob\",\n\t\"--ignore-file\",\n\t\"--max-columns\",\n\t\"--max-count\",\n\t\"--max-depth\",\n\t\"--max-filesize\",\n\t\"--path-separator\",\n\t\"--pre\",\n\t\"--pre-glob\",\n\t\"--replace\",\n\t\"--sort\",\n\t\"--sortr\",\n\t\"--threads\",\n\t\"--type\",\n\t\"--type-add\",\n\t\"--type-clear\",\n\t\"--type-not\",\n]);\nconst RG_SHORT_VALUE_FLAGS = new Set(\"ABCEMTdfgjmrt\".split(\"\"));\nconst RG_SCOPE_LONG_FLAGS = new Set([\"--glob\", \"--iglob\", \"--max-depth\", \"--type\", \"--type-not\"]);\nconst RG_SCOPE_SHORT_FLAGS = new Set([\"g\", \"t\", \"T\"]);\nconst RG_META_FLAGS = new Set([\"--generate\", \"--help\", \"--pcre2-version\", \"--type-list\", \"--version\", \"-h\"]);\n\ntype TargetScope = \"current\" | \"global\" | \"narrow\";\n\nexport type ShellContentSearchTool = \"rg\" | \"grep\";\n\nexport interface ShellSearchInvocationScope {\n\ttargets: string[];\n\tpositiveGlobs: string[];\n\thasScopeFilter: boolean;\n\treadsStdin: boolean;\n\tmetaOnly: boolean;\n}\n\nfunction targetScope(target: string, cwd: string): TargetScope {\n\tconst normalized = target.trim().replace(/[\\\\/]+$/u, \"\") || target.trim();\n\tif (\n\t\tnormalized === \"/\" ||\n\t\tnormalized === \"\\\\\" ||\n\t\t/^[A-Za-z]:$/u.test(normalized) ||\n\t\tnormalized === \"~\" ||\n\t\tnormalized === \"$HOME\" ||\n\t\tnormalized === \"%USERPROFILE%\" ||\n\t\tresolve(normalized) === resolve(homedir())\n\t) {\n\t\treturn \"global\";\n\t}\n\tif (\n\t\tnormalized === \".\" ||\n\t\tnormalized === \"*\" ||\n\t\tnormalized === \"**\" ||\n\t\tnormalized === \"./*\" ||\n\t\tnormalized === \"./**\" ||\n\t\tnormalized === \"$PWD\" ||\n\t\tnormalized === \"$(pwd)\" ||\n\t\tnormalized === \"%CD%\" ||\n\t\tresolve(cwd, normalized) === resolve(cwd)\n\t)\n\t\treturn \"current\";\n\treturn \"narrow\";\n}\n\nfunction hasSafeTarget(targets: string[], cwd: string, hasScopeFilter: boolean): boolean {\n\tif (targets.includes(\"-\")) return true;\n\tconst scopes = (targets.length > 0 ? targets : [\".\"]).map((target) => targetScope(target, cwd));\n\tif (scopes.includes(\"global\")) return false;\n\treturn scopes.includes(\"narrow\") || hasScopeFilter;\n}\n\ninterface RgArguments {\n\tfilesMode: boolean;\n\thasPatternOption: boolean;\n\thasScopeFilter: boolean;\n\tmetaOnly: boolean;\n\tpositionals: string[];\n\tpositiveGlobs: string[];\n}\n\nfunction parseRgArguments(args: string[]): RgArguments {\n\tconst parsed: RgArguments = {\n\t\tfilesMode: false,\n\t\thasPatternOption: false,\n\t\thasScopeFilter: false,\n\t\tmetaOnly: false,\n\t\tpositionals: [],\n\t\tpositiveGlobs: [],\n\t};\n\tlet pastDoubleDash = false;\n\n\tfor (let index = 0; index < args.length; index++) {\n\t\tconst arg = args[index];\n\t\tif (pastDoubleDash) {\n\t\t\tparsed.positionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--\") {\n\t\t\tpastDoubleDash = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (RG_META_FLAGS.has(arg)) {\n\t\t\tparsed.metaOnly = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--files\") {\n\t\t\tparsed.filesMode = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--regexp\" || arg === \"--file\") {\n\t\t\tparsed.hasPatternOption = true;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--regexp=\") || arg.startsWith(\"--file=\")) {\n\t\t\tparsed.hasPatternOption = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--glob\" || arg === \"--iglob\") {\n\t\t\tparsed.hasScopeFilter = true;\n\t\t\tconst glob = args[++index];\n\t\t\tif (glob && !glob.startsWith(\"!\")) parsed.positiveGlobs.push(glob);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--glob=\") || arg.startsWith(\"--iglob=\")) {\n\t\t\tparsed.hasScopeFilter = true;\n\t\t\tconst glob = arg.slice(arg.indexOf(\"=\") + 1);\n\t\t\tif (glob && !glob.startsWith(\"!\")) parsed.positiveGlobs.push(glob);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--\")) {\n\t\t\tconst flag = arg.split(\"=\", 1)[0];\n\t\t\tif (RG_SCOPE_LONG_FLAGS.has(flag)) parsed.hasScopeFilter = true;\n\t\t\tif (RG_LONG_VALUE_FLAGS.has(flag) && !arg.includes(\"=\")) index++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"-\") && arg.length > 1) {\n\t\t\tconst cluster = arg.slice(1);\n\t\t\tfor (let flagIndex = 0; flagIndex < cluster.length; flagIndex++) {\n\t\t\t\tconst flag = cluster[flagIndex];\n\t\t\t\tif (flag === \"e\" || flag === \"f\") parsed.hasPatternOption = true;\n\t\t\t\tif (RG_SCOPE_SHORT_FLAGS.has(flag)) parsed.hasScopeFilter = true;\n\t\t\t\tif (flag === \"g\") {\n\t\t\t\t\tconst attachedGlob = cluster.slice(flagIndex + 1);\n\t\t\t\t\tconst glob = attachedGlob || args[++index];\n\t\t\t\t\tif (glob && !glob.startsWith(\"!\")) parsed.positiveGlobs.push(glob);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (flag === \"e\" || RG_SHORT_VALUE_FLAGS.has(flag)) {\n\t\t\t\t\tif (flagIndex === cluster.length - 1) index++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tparsed.positionals.push(arg);\n\t}\n\n\treturn parsed;\n}\n\nfunction rgTargets(parsed: RgArguments): string[] {\n\treturn parsed.filesMode\n\t\t? parsed.positionals\n\t\t: parsed.hasPatternOption\n\t\t\t? parsed.positionals\n\t\t\t: parsed.positionals.slice(1);\n}\n\ninterface GrepArguments {\n\trecursive: boolean;\n\thasScopeFilter: boolean;\n\ttargets: string[];\n\tpositiveGlobs: string[];\n}\n\nfunction parseGrepArguments(args: string[]): GrepArguments {\n\tconst recursive = args.some(\n\t\t(arg) => arg === \"-r\" || arg === \"-R\" || arg === \"--recursive\" || /^-[^-]*[rR]/u.test(arg),\n\t);\n\tlet hasPatternOption = false;\n\tlet hasScopeFilter = false;\n\tconst positiveGlobs: string[] = [];\n\tconst positionals: string[] = [];\n\tconst valueFlags = new Set([\"-A\", \"-B\", \"-C\", \"-D\", \"-d\", \"-e\", \"-f\", \"-m\", \"--regexp\", \"--file\"]);\n\tlet pastDoubleDash = false;\n\n\tfor (let index = 0; index < args.length; index++) {\n\t\tconst arg = args[index];\n\t\tif (pastDoubleDash) {\n\t\t\tpositionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--\") {\n\t\t\tpastDoubleDash = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--include\") {\n\t\t\thasScopeFilter = true;\n\t\t\tconst glob = args[++index];\n\t\t\tif (glob) positiveGlobs.push(glob);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--include=\")) {\n\t\t\thasScopeFilter = true;\n\t\t\tconst glob = arg.slice(\"--include=\".length);\n\t\t\tif (glob) positiveGlobs.push(glob);\n\t\t\tcontinue;\n\t\t}\n\t\tif ([\"--exclude\", \"--exclude-dir\"].includes(arg)) {\n\t\t\thasScopeFilter = true;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--exclude=\") || arg.startsWith(\"--exclude-dir=\")) {\n\t\t\thasScopeFilter = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"-e\" || arg === \"-f\" || arg === \"--regexp\" || arg === \"--file\") {\n\t\t\thasPatternOption = true;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--regexp=\") || arg.startsWith(\"--file=\")) {\n\t\t\thasPatternOption = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (valueFlags.has(arg)) {\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!arg.startsWith(\"-\")) positionals.push(arg);\n\t}\n\n\treturn {\n\t\trecursive,\n\t\thasScopeFilter,\n\t\ttargets: hasPatternOption ? positionals : positionals.slice(1),\n\t\tpositiveGlobs,\n\t};\n}\n\n/** One owner for filesystem targets, include globs, and stdin across both shell search guards. */\nexport function parseShellSearchInvocationScope(\n\tsearchTool: ShellContentSearchTool,\n\targs: string[],\n\treadsPipe: boolean,\n): ShellSearchInvocationScope {\n\tif (searchTool === \"rg\") {\n\t\tconst parsed = parseRgArguments(args);\n\t\tconst targets = rgTargets(parsed);\n\t\treturn {\n\t\t\ttargets,\n\t\t\tpositiveGlobs: parsed.positiveGlobs,\n\t\t\thasScopeFilter: parsed.hasScopeFilter,\n\t\t\treadsStdin: readsPipe && targets.length === 0 && !parsed.filesMode,\n\t\t\tmetaOnly: parsed.metaOnly,\n\t\t};\n\t}\n\n\tconst parsed = parseGrepArguments(args);\n\treturn {\n\t\ttargets: parsed.targets,\n\t\tpositiveGlobs: parsed.positiveGlobs,\n\t\thasScopeFilter: parsed.hasScopeFilter,\n\t\treadsStdin: readsPipe && parsed.targets.length === 0,\n\t\tmetaOnly: false,\n\t};\n}\n\nfunction assessRg(args: string[], cwd: string, readsPipe: boolean): SearchScopeAssessment {\n\tconst scope = parseShellSearchInvocationScope(\"rg\", args, readsPipe);\n\tif (scope.metaOnly || scope.readsStdin) return { kind: \"scoped\" };\n\tif (hasSafeTarget(scope.targets, cwd, scope.hasScopeFilter)) return { kind: \"scoped\" };\n\treturn {\n\t\tkind: \"broad\",\n\t\tsearchTool: \"rg\",\n\t\treason: \"rg would search the whole working tree without a narrow path, glob, or type filter\",\n\t};\n}\n\nfunction assessRecursiveGrep(args: string[], cwd: string, readsPipe: boolean): SearchScopeAssessment {\n\tconst parsed = parseGrepArguments(args);\n\tif (!parsed.recursive) return { kind: \"scoped\" };\n\tconst scope = parseShellSearchInvocationScope(\"grep\", args, readsPipe);\n\tif (scope.readsStdin || hasSafeTarget(scope.targets, cwd, scope.hasScopeFilter)) return { kind: \"scoped\" };\n\treturn {\n\t\tkind: \"broad\",\n\t\tsearchTool: \"grep\",\n\t\treason: \"recursive grep would scan the whole working tree without a narrow path or include filter\",\n\t};\n}\n\nfunction assessFind(args: string[], cwd: string): SearchScopeAssessment {\n\tlet index = 0;\n\twhile (index < args.length) {\n\t\tconst arg = args[index];\n\t\tif (arg === \"-H\" || arg === \"-L\" || arg === \"-P\" || /^-O\\d*$/u.test(arg)) index++;\n\t\telse if (arg === \"-D\") index += 2;\n\t\telse break;\n\t}\n\tconst targets: string[] = [];\n\twhile (index < args.length && !args[index].startsWith(\"-\") && args[index] !== \"!\" && args[index] !== \"(\") {\n\t\ttargets.push(args[index++]);\n\t}\n\tconst hasScopeFilter = args.some((arg) => [\"-iname\", \"-ipath\", \"-iregex\", \"-name\", \"-path\", \"-regex\"].includes(arg));\n\tif (hasSafeTarget(targets, cwd, hasScopeFilter)) return { kind: \"scoped\" };\n\treturn {\n\t\tkind: \"broad\",\n\t\tsearchTool: \"find\",\n\t\treason: \"find would enumerate the whole working tree without a narrow path or name/path predicate\",\n\t};\n}\n\nfunction assessFd(args: string[], cwd: string): SearchScopeAssessment {\n\tconst positionals: string[] = [];\n\tlet hasScopeFilter = false;\n\tlet pastDoubleDash = false;\n\tconst valueFlags = new Set([\n\t\t\"-d\",\n\t\t\"--max-depth\",\n\t\t\"--min-depth\",\n\t\t\"-e\",\n\t\t\"--extension\",\n\t\t\"-E\",\n\t\t\"--exclude\",\n\t\t\"-t\",\n\t\t\"--type\",\n\t\t\"--base-directory\",\n\t\t\"--changed-before\",\n\t\t\"--changed-within\",\n\t\t\"--color\",\n\t\t\"--owner\",\n\t\t\"--path-separator\",\n\t\t\"--search-path\",\n\t]);\n\tfor (let index = 0; index < args.length; index++) {\n\t\tconst arg = args[index];\n\t\tif (pastDoubleDash) positionals.push(arg);\n\t\telse if (arg === \"--\") pastDoubleDash = true;\n\t\telse if (arg === \"-e\" || arg === \"--extension\") {\n\t\t\thasScopeFilter = true;\n\t\t\tindex++;\n\t\t} else if (arg.startsWith(\"--extension=\")) hasScopeFilter = true;\n\t\telse if (valueFlags.has(arg)) index++;\n\t\telse if (!arg.startsWith(\"-\")) positionals.push(arg);\n\t}\n\tconst pattern = positionals[0];\n\tconst targets = positionals.slice(1);\n\tconst meaningfulPattern = Boolean(pattern && pattern !== \".\" && pattern !== \".*\" && pattern !== \"*\");\n\tif (meaningfulPattern || hasSafeTarget(targets, cwd, hasScopeFilter)) return { kind: \"scoped\" };\n\treturn {\n\t\tkind: \"broad\",\n\t\tsearchTool: \"fd\",\n\t\treason: \"fd would enumerate the whole working tree without a narrow pattern, path, glob, extension, or type\",\n\t};\n}\n\nfunction commandName(value: string): string {\n\treturn basename(value)\n\t\t.toLowerCase()\n\t\t.replace(/\\.exe$/u, \"\");\n}\n\nfunction stripInvocationPrefixes(args: string[]): string[] {\n\tlet index = 0;\n\twhile (index < args.length && /^[A-Za-z_][A-Za-z0-9_]*=/u.test(args[index])) index++;\n\tif (args[index] === \"command\") {\n\t\tindex++;\n\t\twhile (args[index]?.startsWith(\"-\")) index++;\n\t}\n\tif (args[index] === \"env\") {\n\t\tindex++;\n\t\twhile (args[index]?.startsWith(\"-\") || /^[A-Za-z_][A-Za-z0-9_]*=/u.test(args[index] ?? \"\")) index++;\n\t}\n\treturn args.slice(index);\n}\n\nfunction assessInvocation(args: string[], cwd: string, readsPipe: boolean): SearchScopeAssessment {\n\tconst invocation = stripInvocationPrefixes(args);\n\tconst name = commandName(invocation[0] ?? \"\");\n\tconst commandArgs = invocation.slice(1);\n\tswitch (name) {\n\t\tcase \"rg\":\n\t\tcase \"ripgrep\":\n\t\t\treturn assessRg(commandArgs, cwd, readsPipe);\n\t\tcase \"grep\":\n\t\t\treturn assessRecursiveGrep(commandArgs, cwd, readsPipe);\n\t\tcase \"find\":\n\t\t\treturn assessFind(commandArgs, cwd);\n\t\tcase \"fd\":\n\t\tcase \"fdfind\":\n\t\t\treturn assessFd(commandArgs, cwd);\n\t\tdefault:\n\t\t\treturn { kind: \"scoped\" };\n\t}\n}\n\n/**\n * Reject shell searches whose filesystem scope cannot be proven narrow. Dedicated grep/find\n * tools already own result caps and artifacts; this closes the raw-shell bypass before execution.\n */\nexport function assessShellSearchScope(command: string, cwd: string): SearchScopeAssessment {\n\tconst tokens = tokenizeShellCommand(command);\n\tif (!tokens) {\n\t\treturn { kind: \"scoped\" };\n\t}\n\n\tlet invocation: string[] = [];\n\tlet ignoreRedirectTarget = false;\n\tlet readsPipe = false;\n\tconst assessCurrent = (): SearchScopeAssessment => assessInvocation(invocation, cwd, readsPipe);\n\n\tfor (const token of tokens) {\n\t\tif (token.kind === \"arg\") {\n\t\t\tif (!ignoreRedirectTarget) invocation.push(token.value);\n\t\t\tcontinue;\n\t\t}\n\t\tif (token.kind === \"redirect\") {\n\t\t\tignoreRedirectTarget = true;\n\t\t\tcontinue;\n\t\t}\n\t\tconst assessment = assessCurrent();\n\t\tif (assessment.kind === \"broad\") return assessment;\n\t\tinvocation = [];\n\t\tignoreRedirectTarget = false;\n\t\treadsPipe = token.kind === \"pipe\";\n\t}\n\n\treturn assessCurrent();\n}\n\n/**\n * Ripgrep and grep reserve exit code 1 for a successful search with zero matches. Shell lists\n * return the final command's status, so compound diagnostics ending in either search must preserve\n * that semantic instead of turning an empty result into a tool failure. This scans the\n * already-bounded command once and only accepts an unambiguous final invocation; syntax, IO, and\n * regex errors remain exit code 2.\n */\nexport function expectedContentSearchNoMatch(\n\tcommand: string,\n\texitCode: number | null,\n): ShellContentSearchTool | undefined {\n\tif (exitCode !== 1) return undefined;\n\tconst tokens = tokenizeShellCommand(command);\n\tif (!tokens) return undefined;\n\n\tlet invocation: string[] = [];\n\tlet ignoreRedirectTarget = false;\n\tlet connector: string | undefined;\n\tlet invocationConnector: string | undefined;\n\tlet finalInvocation: string[] | undefined;\n\tlet finalInvocationConnector: string | undefined;\n\tconst finishInvocation = () => {\n\t\tif (invocation.length > 0) {\n\t\t\tfinalInvocation = invocation;\n\t\t\tfinalInvocationConnector = invocationConnector;\n\t\t}\n\t\tinvocation = [];\n\t\tinvocationConnector = undefined;\n\t};\n\tfor (const token of tokens) {\n\t\tif (token.kind === \"arg\") {\n\t\t\tif (!ignoreRedirectTarget) {\n\t\t\t\tif (invocation.length === 0) invocationConnector = connector;\n\t\t\t\tinvocation.push(token.value);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (token.kind === \"redirect\") {\n\t\t\tignoreRedirectTarget = true;\n\t\t\tcontinue;\n\t\t}\n\t\tfinishInvocation();\n\t\tignoreRedirectTarget = false;\n\t\tconnector = token.value;\n\t}\n\tfinishInvocation();\n\n\t// `prior && search` can return the prior command's exit 1 without executing the search.\n\tif (!finalInvocation || finalInvocationConnector === \"&&\") return undefined;\n\tconst normalizedInvocation = stripInvocationPrefixes(finalInvocation);\n\tconst name = commandName(normalizedInvocation[0] ?? \"\");\n\tif (name === \"rg\" || name === \"ripgrep\") return \"rg\";\n\treturn name === \"grep\" ? \"grep\" : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"search-command-guard.js","sourceRoot":"","sources":["../../../src/core/tools/search-command-guard.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { basename, isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { tokenizeShellCommand } from \"./shell-command-parser.ts\";\n\nexport const BROAD_SEARCH_OUTPUT_ROUTE = \"route-to-file\" as const;\n\nexport type SearchScopeAssessment =\n\t| { kind: \"scoped\" }\n\t| { kind: \"broad\"; searchTool: \"rg\" | \"grep\" | \"find\" | \"fd\"; reason: string };\n\nconst RG_LONG_VALUE_FLAGS = new Set([\n\t\"--after-context\",\n\t\"--before-context\",\n\t\"--color\",\n\t\"--colors\",\n\t\"--context\",\n\t\"--context-separator\",\n\t\"--encoding\",\n\t\"--engine\",\n\t\"--field-context-separator\",\n\t\"--field-match-separator\",\n\t\"--glob\",\n\t\"--iglob\",\n\t\"--ignore-file\",\n\t\"--max-columns\",\n\t\"--max-count\",\n\t\"--max-depth\",\n\t\"--max-filesize\",\n\t\"--path-separator\",\n\t\"--pre\",\n\t\"--pre-glob\",\n\t\"--replace\",\n\t\"--sort\",\n\t\"--sortr\",\n\t\"--threads\",\n\t\"--type\",\n\t\"--type-add\",\n\t\"--type-clear\",\n\t\"--type-not\",\n]);\nconst RG_SHORT_VALUE_FLAGS = new Set(\"ABCEMTdfgjmrt\".split(\"\"));\nconst RG_SCOPE_LONG_FLAGS = new Set([\"--glob\", \"--iglob\", \"--max-depth\", \"--type\", \"--type-not\"]);\nconst RG_SCOPE_SHORT_FLAGS = new Set([\"g\", \"t\", \"T\"]);\nconst RG_META_FLAGS = new Set([\"--generate\", \"--help\", \"--pcre2-version\", \"--type-list\", \"--version\", \"-h\"]);\n\ntype TargetScope = \"current\" | \"global\" | \"narrow\";\n\nexport type ShellContentSearchTool = \"rg\" | \"grep\";\n\nexport interface ShellSearchInvocationScope {\n\ttargets: string[];\n\tpositiveGlobs: string[];\n\thasScopeFilter: boolean;\n\treadsStdin: boolean;\n\tmetaOnly: boolean;\n}\n\nfunction targetScope(target: string, cwd: string): TargetScope {\n\tconst normalized = target.trim().replace(/[\\\\/]+$/u, \"\") || target.trim();\n\tconst resolvedCwd = resolve(cwd);\n\tconst resolvedTarget = resolve(cwd, normalized);\n\tconst cwdFromTarget = relative(resolvedTarget, resolvedCwd);\n\tif (\n\t\tnormalized === \"/\" ||\n\t\tnormalized === \"\\\\\" ||\n\t\t/^[A-Za-z]:$/u.test(normalized) ||\n\t\tnormalized === \"~\" ||\n\t\tnormalized === \"$HOME\" ||\n\t\tnormalized === \"%USERPROFILE%\" ||\n\t\tresolve(normalized) === resolve(homedir()) ||\n\t\t(cwdFromTarget !== \"\" &&\n\t\t\tcwdFromTarget !== \"..\" &&\n\t\t\t!cwdFromTarget.startsWith(`..${sep}`) &&\n\t\t\t!isAbsolute(cwdFromTarget))\n\t) {\n\t\treturn \"global\";\n\t}\n\tif (\n\t\tnormalized === \".\" ||\n\t\tnormalized === \"*\" ||\n\t\tnormalized === \"**\" ||\n\t\tnormalized === \"./*\" ||\n\t\tnormalized === \"./**\" ||\n\t\tnormalized === \"$PWD\" ||\n\t\tnormalized === \"$(pwd)\" ||\n\t\tnormalized === \"%CD%\" ||\n\t\tresolvedTarget === resolvedCwd\n\t)\n\t\treturn \"current\";\n\treturn \"narrow\";\n}\n\nfunction hasSafeTarget(targets: string[], cwd: string, hasScopeFilter: boolean): boolean {\n\tif (targets.includes(\"-\")) return true;\n\tconst scopes = (targets.length > 0 ? targets : [\".\"]).map((target) => targetScope(target, cwd));\n\tif (scopes.includes(\"global\")) return false;\n\treturn scopes.includes(\"narrow\") || hasScopeFilter;\n}\n\ninterface RgArguments {\n\tfilesMode: boolean;\n\thasPatternOption: boolean;\n\thasScopeFilter: boolean;\n\tmetaOnly: boolean;\n\tpositionals: string[];\n\tpositiveGlobs: string[];\n}\n\nfunction parseRgArguments(args: string[]): RgArguments {\n\tconst parsed: RgArguments = {\n\t\tfilesMode: false,\n\t\thasPatternOption: false,\n\t\thasScopeFilter: false,\n\t\tmetaOnly: false,\n\t\tpositionals: [],\n\t\tpositiveGlobs: [],\n\t};\n\tlet pastDoubleDash = false;\n\n\tfor (let index = 0; index < args.length; index++) {\n\t\tconst arg = args[index];\n\t\tif (pastDoubleDash) {\n\t\t\tparsed.positionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--\") {\n\t\t\tpastDoubleDash = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (RG_META_FLAGS.has(arg)) {\n\t\t\tparsed.metaOnly = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--files\") {\n\t\t\tparsed.filesMode = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--regexp\" || arg === \"--file\") {\n\t\t\tparsed.hasPatternOption = true;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--regexp=\") || arg.startsWith(\"--file=\")) {\n\t\t\tparsed.hasPatternOption = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--glob\" || arg === \"--iglob\") {\n\t\t\tparsed.hasScopeFilter = true;\n\t\t\tconst glob = args[++index];\n\t\t\tif (glob && !glob.startsWith(\"!\")) parsed.positiveGlobs.push(glob);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--glob=\") || arg.startsWith(\"--iglob=\")) {\n\t\t\tparsed.hasScopeFilter = true;\n\t\t\tconst glob = arg.slice(arg.indexOf(\"=\") + 1);\n\t\t\tif (glob && !glob.startsWith(\"!\")) parsed.positiveGlobs.push(glob);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--\")) {\n\t\t\tconst flag = arg.split(\"=\", 1)[0];\n\t\t\tif (RG_SCOPE_LONG_FLAGS.has(flag)) parsed.hasScopeFilter = true;\n\t\t\tif (RG_LONG_VALUE_FLAGS.has(flag) && !arg.includes(\"=\")) index++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"-\") && arg.length > 1) {\n\t\t\tconst cluster = arg.slice(1);\n\t\t\tfor (let flagIndex = 0; flagIndex < cluster.length; flagIndex++) {\n\t\t\t\tconst flag = cluster[flagIndex];\n\t\t\t\tif (flag === \"e\" || flag === \"f\") parsed.hasPatternOption = true;\n\t\t\t\tif (RG_SCOPE_SHORT_FLAGS.has(flag)) parsed.hasScopeFilter = true;\n\t\t\t\tif (flag === \"g\") {\n\t\t\t\t\tconst attachedGlob = cluster.slice(flagIndex + 1);\n\t\t\t\t\tconst glob = attachedGlob || args[++index];\n\t\t\t\t\tif (glob && !glob.startsWith(\"!\")) parsed.positiveGlobs.push(glob);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (flag === \"e\" || RG_SHORT_VALUE_FLAGS.has(flag)) {\n\t\t\t\t\tif (flagIndex === cluster.length - 1) index++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tparsed.positionals.push(arg);\n\t}\n\n\treturn parsed;\n}\n\nfunction rgTargets(parsed: RgArguments): string[] {\n\treturn parsed.filesMode\n\t\t? parsed.positionals\n\t\t: parsed.hasPatternOption\n\t\t\t? parsed.positionals\n\t\t\t: parsed.positionals.slice(1);\n}\n\ninterface GrepArguments {\n\trecursive: boolean;\n\thasScopeFilter: boolean;\n\ttargets: string[];\n\tpositiveGlobs: string[];\n}\n\nfunction parseGrepArguments(args: string[]): GrepArguments {\n\tconst recursive = args.some(\n\t\t(arg) => arg === \"-r\" || arg === \"-R\" || arg === \"--recursive\" || /^-[^-]*[rR]/u.test(arg),\n\t);\n\tlet hasPatternOption = false;\n\tlet hasScopeFilter = false;\n\tconst positiveGlobs: string[] = [];\n\tconst positionals: string[] = [];\n\tconst valueFlags = new Set([\"-A\", \"-B\", \"-C\", \"-D\", \"-d\", \"-e\", \"-f\", \"-m\", \"--regexp\", \"--file\"]);\n\tlet pastDoubleDash = false;\n\n\tfor (let index = 0; index < args.length; index++) {\n\t\tconst arg = args[index];\n\t\tif (pastDoubleDash) {\n\t\t\tpositionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--\") {\n\t\t\tpastDoubleDash = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"--include\") {\n\t\t\thasScopeFilter = true;\n\t\t\tconst glob = args[++index];\n\t\t\tif (glob) positiveGlobs.push(glob);\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--include=\")) {\n\t\t\thasScopeFilter = true;\n\t\t\tconst glob = arg.slice(\"--include=\".length);\n\t\t\tif (glob) positiveGlobs.push(glob);\n\t\t\tcontinue;\n\t\t}\n\t\tif ([\"--exclude\", \"--exclude-dir\"].includes(arg)) {\n\t\t\thasScopeFilter = true;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--exclude=\") || arg.startsWith(\"--exclude-dir=\")) {\n\t\t\thasScopeFilter = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg === \"-e\" || arg === \"-f\" || arg === \"--regexp\" || arg === \"--file\") {\n\t\t\thasPatternOption = true;\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (arg.startsWith(\"--regexp=\") || arg.startsWith(\"--file=\")) {\n\t\t\thasPatternOption = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (valueFlags.has(arg)) {\n\t\t\tindex++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!arg.startsWith(\"-\")) positionals.push(arg);\n\t}\n\n\treturn {\n\t\trecursive,\n\t\thasScopeFilter,\n\t\ttargets: hasPatternOption ? positionals : positionals.slice(1),\n\t\tpositiveGlobs,\n\t};\n}\n\n/** One owner for filesystem targets, include globs, and stdin across both shell search guards. */\nexport function parseShellSearchInvocationScope(\n\tsearchTool: ShellContentSearchTool,\n\targs: string[],\n\treadsPipe: boolean,\n): ShellSearchInvocationScope {\n\tif (searchTool === \"rg\") {\n\t\tconst parsed = parseRgArguments(args);\n\t\tconst targets = rgTargets(parsed);\n\t\treturn {\n\t\t\ttargets,\n\t\t\tpositiveGlobs: parsed.positiveGlobs,\n\t\t\thasScopeFilter: parsed.hasScopeFilter,\n\t\t\treadsStdin: readsPipe && targets.length === 0 && !parsed.filesMode,\n\t\t\tmetaOnly: parsed.metaOnly,\n\t\t};\n\t}\n\n\tconst parsed = parseGrepArguments(args);\n\treturn {\n\t\ttargets: parsed.targets,\n\t\tpositiveGlobs: parsed.positiveGlobs,\n\t\thasScopeFilter: parsed.hasScopeFilter,\n\t\treadsStdin: readsPipe && parsed.targets.length === 0,\n\t\tmetaOnly: false,\n\t};\n}\n\nfunction assessRg(args: string[], cwd: string, readsPipe: boolean): SearchScopeAssessment {\n\tconst scope = parseShellSearchInvocationScope(\"rg\", args, readsPipe);\n\tif (scope.metaOnly || scope.readsStdin) return { kind: \"scoped\" };\n\tif (hasSafeTarget(scope.targets, cwd, scope.hasScopeFilter)) return { kind: \"scoped\" };\n\treturn {\n\t\tkind: \"broad\",\n\t\tsearchTool: \"rg\",\n\t\treason: \"rg would search the whole working tree without a narrow path, glob, or type filter\",\n\t};\n}\n\nfunction assessRecursiveGrep(args: string[], cwd: string, readsPipe: boolean): SearchScopeAssessment {\n\tconst parsed = parseGrepArguments(args);\n\tif (!parsed.recursive) return { kind: \"scoped\" };\n\tconst scope = parseShellSearchInvocationScope(\"grep\", args, readsPipe);\n\tif (scope.readsStdin || hasSafeTarget(scope.targets, cwd, scope.hasScopeFilter)) return { kind: \"scoped\" };\n\treturn {\n\t\tkind: \"broad\",\n\t\tsearchTool: \"grep\",\n\t\treason: \"recursive grep would scan the whole working tree without a narrow path or include filter\",\n\t};\n}\n\nfunction assessFind(args: string[], cwd: string): SearchScopeAssessment {\n\tlet index = 0;\n\twhile (index < args.length) {\n\t\tconst arg = args[index];\n\t\tif (arg === \"-H\" || arg === \"-L\" || arg === \"-P\" || /^-O\\d*$/u.test(arg)) index++;\n\t\telse if (arg === \"-D\") index += 2;\n\t\telse break;\n\t}\n\tconst targets: string[] = [];\n\twhile (index < args.length && !args[index].startsWith(\"-\") && args[index] !== \"!\" && args[index] !== \"(\") {\n\t\ttargets.push(args[index++]);\n\t}\n\tconst hasScopeFilter = args.some((arg) => [\"-iname\", \"-ipath\", \"-iregex\", \"-name\", \"-path\", \"-regex\"].includes(arg));\n\tif (hasSafeTarget(targets, cwd, hasScopeFilter)) return { kind: \"scoped\" };\n\treturn {\n\t\tkind: \"broad\",\n\t\tsearchTool: \"find\",\n\t\treason: \"find would enumerate the whole working tree without a narrow path or name/path predicate\",\n\t};\n}\n\nfunction assessFd(args: string[], cwd: string): SearchScopeAssessment {\n\tconst positionals: string[] = [];\n\tlet hasScopeFilter = false;\n\tlet pastDoubleDash = false;\n\tconst valueFlags = new Set([\n\t\t\"-d\",\n\t\t\"--max-depth\",\n\t\t\"--min-depth\",\n\t\t\"-e\",\n\t\t\"--extension\",\n\t\t\"-E\",\n\t\t\"--exclude\",\n\t\t\"-t\",\n\t\t\"--type\",\n\t\t\"--base-directory\",\n\t\t\"--changed-before\",\n\t\t\"--changed-within\",\n\t\t\"--color\",\n\t\t\"--owner\",\n\t\t\"--path-separator\",\n\t\t\"--search-path\",\n\t]);\n\tfor (let index = 0; index < args.length; index++) {\n\t\tconst arg = args[index];\n\t\tif (pastDoubleDash) positionals.push(arg);\n\t\telse if (arg === \"--\") pastDoubleDash = true;\n\t\telse if (arg === \"-e\" || arg === \"--extension\") {\n\t\t\thasScopeFilter = true;\n\t\t\tindex++;\n\t\t} else if (arg.startsWith(\"--extension=\")) hasScopeFilter = true;\n\t\telse if (valueFlags.has(arg)) index++;\n\t\telse if (!arg.startsWith(\"-\")) positionals.push(arg);\n\t}\n\tconst pattern = positionals[0];\n\tconst targets = positionals.slice(1);\n\tconst meaningfulPattern = Boolean(pattern && pattern !== \".\" && pattern !== \".*\" && pattern !== \"*\");\n\tif (meaningfulPattern || hasSafeTarget(targets, cwd, hasScopeFilter)) return { kind: \"scoped\" };\n\treturn {\n\t\tkind: \"broad\",\n\t\tsearchTool: \"fd\",\n\t\treason: \"fd would enumerate the whole working tree without a narrow pattern, path, glob, extension, or type\",\n\t};\n}\n\nfunction commandName(value: string): string {\n\treturn basename(value)\n\t\t.toLowerCase()\n\t\t.replace(/\\.exe$/u, \"\");\n}\n\nfunction stripInvocationPrefixes(args: string[]): string[] {\n\tlet index = 0;\n\twhile (index < args.length && /^[A-Za-z_][A-Za-z0-9_]*=/u.test(args[index])) index++;\n\tif (args[index] === \"command\") {\n\t\tindex++;\n\t\twhile (args[index]?.startsWith(\"-\")) index++;\n\t}\n\tif (args[index] === \"env\") {\n\t\tindex++;\n\t\twhile (args[index]?.startsWith(\"-\") || /^[A-Za-z_][A-Za-z0-9_]*=/u.test(args[index] ?? \"\")) index++;\n\t}\n\treturn args.slice(index);\n}\n\nfunction assessInvocation(args: string[], cwd: string, readsPipe: boolean): SearchScopeAssessment {\n\tconst invocation = stripInvocationPrefixes(args);\n\tconst name = commandName(invocation[0] ?? \"\");\n\tconst commandArgs = invocation.slice(1);\n\tswitch (name) {\n\t\tcase \"rg\":\n\t\tcase \"ripgrep\":\n\t\t\treturn assessRg(commandArgs, cwd, readsPipe);\n\t\tcase \"grep\":\n\t\t\treturn assessRecursiveGrep(commandArgs, cwd, readsPipe);\n\t\tcase \"find\":\n\t\t\treturn assessFind(commandArgs, cwd);\n\t\tcase \"fd\":\n\t\tcase \"fdfind\":\n\t\t\treturn assessFd(commandArgs, cwd);\n\t\tdefault:\n\t\t\treturn { kind: \"scoped\" };\n\t}\n}\n\n/**\n * Reject shell searches whose filesystem scope cannot be proven narrow. Dedicated grep/find\n * tools already own result caps and artifacts; this closes the raw-shell bypass before execution.\n */\nexport function assessShellSearchScope(command: string, cwd: string): SearchScopeAssessment {\n\tconst tokens = tokenizeShellCommand(command);\n\tif (!tokens) {\n\t\treturn { kind: \"scoped\" };\n\t}\n\n\tlet invocation: string[] = [];\n\tlet ignoreRedirectTarget = false;\n\tlet readsPipe = false;\n\tconst assessCurrent = (): SearchScopeAssessment => assessInvocation(invocation, cwd, readsPipe);\n\n\tfor (const token of tokens) {\n\t\tif (token.kind === \"arg\") {\n\t\t\tif (!ignoreRedirectTarget) invocation.push(token.value);\n\t\t\tcontinue;\n\t\t}\n\t\tif (token.kind === \"redirect\") {\n\t\t\tignoreRedirectTarget = true;\n\t\t\tcontinue;\n\t\t}\n\t\tconst assessment = assessCurrent();\n\t\tif (assessment.kind === \"broad\") return assessment;\n\t\tinvocation = [];\n\t\tignoreRedirectTarget = false;\n\t\treadsPipe = token.kind === \"pipe\";\n\t}\n\n\treturn assessCurrent();\n}\n\n/**\n * Ripgrep and grep reserve exit code 1 for a successful search with zero matches. Shell lists\n * return the final command's status, so compound diagnostics ending in either search must preserve\n * that semantic instead of turning an empty result into a tool failure. This scans the\n * already-bounded command once and only accepts an unambiguous final invocation; syntax, IO, and\n * regex errors remain exit code 2.\n */\nexport function expectedContentSearchNoMatch(\n\tcommand: string,\n\texitCode: number | null,\n): ShellContentSearchTool | undefined {\n\tif (exitCode !== 1) return undefined;\n\tconst tokens = tokenizeShellCommand(command);\n\tif (!tokens) return undefined;\n\n\tlet invocation: string[] = [];\n\tlet ignoreRedirectTarget = false;\n\tlet connector: string | undefined;\n\tlet invocationConnector: string | undefined;\n\tlet finalInvocation: string[] | undefined;\n\tlet finalInvocationConnector: string | undefined;\n\tconst finishInvocation = () => {\n\t\tif (invocation.length > 0) {\n\t\t\tfinalInvocation = invocation;\n\t\t\tfinalInvocationConnector = invocationConnector;\n\t\t}\n\t\tinvocation = [];\n\t\tinvocationConnector = undefined;\n\t};\n\tfor (const token of tokens) {\n\t\tif (token.kind === \"arg\") {\n\t\t\tif (!ignoreRedirectTarget) {\n\t\t\t\tif (invocation.length === 0) invocationConnector = connector;\n\t\t\t\tinvocation.push(token.value);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (token.kind === \"redirect\") {\n\t\t\tignoreRedirectTarget = true;\n\t\t\tcontinue;\n\t\t}\n\t\tfinishInvocation();\n\t\tignoreRedirectTarget = false;\n\t\tconnector = token.value;\n\t}\n\tfinishInvocation();\n\n\t// `prior && search` can return the prior command's exit 1 without executing the search.\n\tif (!finalInvocation || finalInvocationConnector === \"&&\") return undefined;\n\tconst normalizedInvocation = stripInvocationPrefixes(finalInvocation);\n\tconst name = commandName(normalizedInvocation[0] ?? \"\");\n\tif (name === \"rg\" || name === \"ripgrep\") return \"rg\";\n\treturn name === \"grep\" ? \"grep\" : undefined;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAA2C,MAAM,2BAA2B,CAAC;AAEpG,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAEN,KAAK,4BAA4B,
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAA2C,MAAM,2BAA2B,CAAC;AAEpG,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAEN,KAAK,4BAA4B,EAMjC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEN,4BAA4B,EAE5B,MAAM,2BAA2B,CAAC;AAOnC,QAAA,MAAM,WAAW;;;;;;;;;IAsBf,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,oFAAoF;IACpF,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,mCAAmC;IACnC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAOD,MAAM,WAAW,gBAAgB;IAChC,oEAAoE;IACpE,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,oFAAoF;IACpF,wBAAwB,CAAC,EAAE,4BAA4B,CAAC;IACxD,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,4BAA4B,CAAC;CAChD;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA6ND,wBAAgB,yBAAyB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,gBAAgB,GACxB,cAAc,CAAC,OAAO,WAAW,EAAE,gBAAgB,CAAC,CAwLtD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,OAAO,WAAW,CAAC,CAEtG"}
|
package/dist/core/tools/write.js
CHANGED
|
@@ -5,7 +5,7 @@ import { Container, Text } from "@caupulican/pi-tui";
|
|
|
5
5
|
import { Type } from "typebox";
|
|
6
6
|
import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
|
|
7
7
|
import { getLanguageFromPath, highlightCode } from "../../modes/interactive/theme/theme.js";
|
|
8
|
-
import { FILE_EXISTS_RECOVERY_TARGET_KIND, fileRecoveryScope, selectFileFailureRecoveryAuthority, WRITE_RETARGET_RECOVERY_TARGET_KIND, } from "./file-failure-recovery.js";
|
|
8
|
+
import { FILE_EXISTS_RECOVERY_TARGET_KIND, fileRecoveryScope, selectFileFailureRecoveryAuthority, WORKSPACE_MUTATED_RECOVERY_TARGET_KIND, WRITE_RETARGET_RECOVERY_TARGET_KIND, workspaceRecoveryScope, } from "./file-failure-recovery.js";
|
|
9
9
|
import { FileMutationIntentController, FileMutationPreflightError, } from "./file-mutation-intent.js";
|
|
10
10
|
import { withFileMutationQueue } from "./file-mutation-queue.js";
|
|
11
11
|
import { resolveToCwd } from "./path-utils.js";
|
|
@@ -240,6 +240,15 @@ export function createWriteToolDefinition(cwd, options) {
|
|
|
240
240
|
? [fileRecoveryScope(failureRecoveryAuthority, params.path, cwd)]
|
|
241
241
|
: [],
|
|
242
242
|
},
|
|
243
|
+
{
|
|
244
|
+
kind: "repair",
|
|
245
|
+
authority: failureRecoveryAuthority.contractAuthority,
|
|
246
|
+
targetKind: WORKSPACE_MUTATED_RECOVERY_TARGET_KIND,
|
|
247
|
+
instruction: "When a command failed because workspace contents need repair, create the required file and rerun that exact command once.",
|
|
248
|
+
getEvidence: (_params, result) => result.details.phase === "written"
|
|
249
|
+
? [workspaceRecoveryScope(failureRecoveryAuthority, cwd)]
|
|
250
|
+
: [],
|
|
251
|
+
},
|
|
243
252
|
]
|
|
244
253
|
: []),
|
|
245
254
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir as fsMkdir, writeFile as fsWriteFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { type AgentTool, createAgentToolFailureRecoveryAuthority } from \"@caupulican/pi-agent-core\";\nimport { Container, Text } from \"@caupulican/pi-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport {\n\tFILE_EXISTS_RECOVERY_TARGET_KIND,\n\ttype FileFailureRecoveryAuthority,\n\tfileRecoveryScope,\n\tselectFileFailureRecoveryAuthority,\n\tWRITE_RETARGET_RECOVERY_TARGET_KIND,\n} from \"./file-failure-recovery.ts\";\nimport {\n\ttype FileContentReference,\n\tFileMutationIntentController,\n\tFileMutationPreflightError,\n} from \"./file-mutation-intent.ts\";\nimport { withFileMutationQueue } from \"./file-mutation-queue.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { normalizeDisplayText, renderToolPath, replaceTabs, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst writePathSchema = Type.String({ minLength: 1 });\nconst writeSchema = Type.Union([\n\tType.Object(\n\t\t{\n\t\t\tpath: writePathSchema,\n\t\t\tcontent: Type.String(),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tType.Object(\n\t\t{\n\t\t\tpath: writePathSchema,\n\t\t\tcontentRef: Type.String({ minLength: 1 }),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tType.Object(\n\t\t{\n\t\t\tpath: writePathSchema,\n\t\t\tpayloadRef: Type.String({ minLength: 1 }),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n]);\n\nexport type WriteToolInput = Static<typeof writeSchema>;\n\n/**\n * Pluggable operations for the write tool.\n * Override these to delegate file writing to remote systems (for example SSH).\n */\nexport interface WriteOperations {\n\t/** Atomically create a new file and fail if any entry already occupies the path. */\n\tcreateFile: (absolutePath: string, content: string) => Promise<void>;\n\t/** Create directory recursively */\n\tmkdir: (dir: string) => Promise<void>;\n}\n\nconst defaultWriteOperations: WriteOperations = {\n\tcreateFile: (path, content) => fsWriteFile(path, content, { encoding: \"utf-8\", flag: \"wx\" }),\n\tmkdir: (dir) => fsMkdir(dir, { recursive: true }).then(() => {}),\n};\n\nexport interface WriteToolOptions {\n\t/** Custom operations for file writing. Default: local filesystem */\n\toperations?: WriteOperations;\n\t/** Shared backend identity for exact cross-tool recovery with custom operations. */\n\tfailureRecoveryAuthority?: FileFailureRecoveryAuthority;\n\t/** Session-owned harness preflight and exact-content-reference authority. */\n\tintentController?: FileMutationIntentController;\n}\n\nexport interface WriteToolDetails {\n\tphase: \"written\";\n\tcontentRef?: string;\n\tbyteCount?: number;\n}\n\ntype WriteHighlightCache = {\n\targsRef: unknown;\n\trawPath: string | null;\n\tcountCompleteLines: boolean;\n\texpanded: boolean;\n\trenderedLines: string[];\n\ttotalLines?: number;\n\tcappedByCharacters: boolean;\n\tcappedByLines: boolean;\n};\n\nclass WriteCallRenderComponent extends Text {\n\tcache?: WriteHighlightCache;\n\n\tconstructor() {\n\t\tsuper(\"\", 0, 0);\n\t}\n}\n\nconst WRITE_COLLAPSED_PREVIEW_LINES = 10;\nconst WRITE_COLLAPSED_PREVIEW_CHARS = 8_192;\n\nfunction countWriteDisplayLines(fileContent: string): number {\n\tlet lastContentIndex = fileContent.length - 1;\n\twhile (lastContentIndex >= 0) {\n\t\tconst code = fileContent.charCodeAt(lastContentIndex);\n\t\tif (code !== 10 && code !== 13) break;\n\t\tlastContentIndex--;\n\t}\n\tif (lastContentIndex < 0) return 0;\n\n\tlet lines = 1;\n\tfor (let i = 0; i <= lastContentIndex; i++) {\n\t\tif (fileContent.charCodeAt(i) === 10) lines++;\n\t}\n\treturn lines;\n}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction buildCollapsedWriteSource(fileContent: string): {\n\tsource: string;\n\tcappedByCharacters: boolean;\n\tcappedByLines: boolean;\n} {\n\tconst rawPrefix = fileContent.slice(0, WRITE_COLLAPSED_PREVIEW_CHARS);\n\tconst normalizedPrefix = replaceTabs(normalizeDisplayText(rawPrefix));\n\tlet end = normalizedPrefix.length;\n\tlet newlineCount = 0;\n\tfor (let i = 0; i < normalizedPrefix.length; i++) {\n\t\tif (normalizedPrefix.charCodeAt(i) !== 10) continue;\n\t\tnewlineCount++;\n\t\tif (newlineCount === WRITE_COLLAPSED_PREVIEW_LINES) {\n\t\t\tend = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst cappedByLines = end < normalizedPrefix.length;\n\treturn {\n\t\tsource: normalizedPrefix.slice(0, end),\n\t\tcappedByCharacters: !cappedByLines && rawPrefix.length < fileContent.length,\n\t\tcappedByLines,\n\t};\n}\n\nfunction buildWriteHighlightCache(\n\targsRef: unknown,\n\trawPath: string | null,\n\tfileContent: string,\n\tcountCompleteLines: boolean,\n\texpanded: boolean,\n): WriteHighlightCache {\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tif (expanded) {\n\t\tconst source = replaceTabs(normalizeDisplayText(fileContent));\n\t\tconst renderedLines = trimTrailingEmptyLines(lang ? highlightCode(source, lang) : source.split(\"\\n\"));\n\t\treturn {\n\t\t\targsRef,\n\t\t\trawPath,\n\t\t\tcountCompleteLines,\n\t\t\texpanded,\n\t\t\trenderedLines,\n\t\t\ttotalLines: renderedLines.length,\n\t\t\tcappedByCharacters: false,\n\t\t\tcappedByLines: false,\n\t\t};\n\t}\n\n\tconst preview = buildCollapsedWriteSource(fileContent);\n\tconst renderedLines = trimTrailingEmptyLines(\n\t\tlang ? highlightCode(preview.source, lang) : preview.source.split(\"\\n\"),\n\t);\n\treturn {\n\t\targsRef,\n\t\trawPath,\n\t\tcountCompleteLines,\n\t\texpanded,\n\t\trenderedLines,\n\t\ttotalLines: countCompleteLines ? countWriteDisplayLines(fileContent) : undefined,\n\t\tcappedByCharacters: preview.cappedByCharacters,\n\t\tcappedByLines: preview.cappedByLines,\n\t};\n}\n\nfunction getWriteHighlightCache(\n\tcache: WriteHighlightCache | undefined,\n\targsRef: unknown,\n\trawPath: string | null,\n\tfileContent: string,\n\tcountCompleteLines: boolean,\n\texpanded: boolean,\n): WriteHighlightCache {\n\tif (\n\t\tcache &&\n\t\tcache.argsRef === argsRef &&\n\t\tcache.rawPath === rawPath &&\n\t\tcache.countCompleteLines === countCompleteLines &&\n\t\tcache.expanded === expanded\n\t) {\n\t\treturn cache;\n\t}\n\treturn buildWriteHighlightCache(argsRef, rawPath, fileContent, countCompleteLines, expanded);\n}\n\nfunction formatWriteCall(\n\targs: { path?: string; file_path?: string; content?: string; contentRef?: string; payloadRef?: string } | undefined,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tcache: WriteHighlightCache | undefined,\n\tcwd: string,\n): string {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst fileContent = str(args?.content);\n\tconst hasContent = typeof args?.content === \"string\";\n\tconst pathDisplay = renderToolPath(rawPath, theme, cwd);\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"write\"))} ${pathDisplay}`;\n\n\tif (!hasContent && typeof args?.contentRef !== \"string\" && typeof args?.payloadRef !== \"string\") {\n\t\ttext += `\\n\\n${theme.fg(\"error\", \"[invalid content arg - expected string]\")}`;\n\t} else if (hasContent && fileContent) {\n\t\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\t\tconst displayLines = cache?.renderedLines ?? [];\n\t\ttext += `\\n\\n${displayLines.map((line) => (lang ? line : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\t\tif (!options.expanded && cache && (cache.cappedByCharacters || cache.cappedByLines)) {\n\t\t\tconst total = cache.totalLines;\n\t\t\tif (cache.cappedByCharacters) {\n\t\t\t\tconst totalSuffix = total === undefined ? \"\" : `; ${total} total line${total === 1 ? \"\" : \"s\"}`;\n\t\t\t\ttext += `${theme.fg(\"muted\", `\\n... (preview capped at ${WRITE_COLLAPSED_PREVIEW_CHARS} characters${totalSuffix},`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t\t} else if (total === undefined) {\n\t\t\t\ttext += `${theme.fg(\"muted\", \"\\n... (preview capped,\")} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t\t} else {\n\t\t\t\tconst remaining = Math.max(0, total - displayLines.length);\n\t\t\t\tif (remaining > 0) {\n\t\t\t\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines, ${total} total,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (args?.contentRef) {\n\t\ttext += `\\n\\n${theme.fg(\"muted\", `reuse ${args.contentRef}`)}`;\n\t} else if (args?.payloadRef) {\n\t\ttext += `\\n\\n${theme.fg(\"muted\", `retarget ${args.payloadRef}`)}`;\n\t}\n\n\treturn text;\n}\n\nasync function writeCollisionWithRetainedPayload(\n\terror: FileMutationPreflightError,\n\tinput: WriteToolInput,\n\tintentController: FileMutationIntentController,\n\tsignal?: AbortSignal,\n): Promise<Error> {\n\tconst retargetError = (reference: string): Error =>\n\t\tnew Error(\n\t\t\t`PI_FILE_MUTATION_RETARGET write_collision: ${reference}. Choose only a corrected path; the exact valid write payload is retained.`,\n\t\t);\n\tif (\"contentRef\" in input) {\n\t\tawait intentController.assertContentReference(input.contentRef, signal);\n\t\treturn retargetError(`contentRef ${input.contentRef}`);\n\t}\n\tif (\"payloadRef\" in input) {\n\t\tawait intentController.assertMutationPayload(input.payloadRef, \"write\", signal);\n\t\treturn retargetError(`payloadRef ${input.payloadRef}`);\n\t}\n\n\ttry {\n\t\tconst retained = await intentController.retainMutationPayload(\"write\", input.content);\n\t\tif (retained) {\n\t\t\treturn retargetError(`payloadRef ${retained.payloadRef}`);\n\t\t}\n\t} catch {\n\t\t// The collision remains authoritative when the bounded retry cache is unavailable.\n\t}\n\treturn new Error(`${error.message} The payload could not be retained within the secure retry-cache bound.`);\n}\n\nfunction formatWriteResult(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }>; isError?: boolean },\n\ttheme: Theme,\n): string | undefined {\n\tif (!result.isError) {\n\t\treturn undefined;\n\t}\n\tconst output = result.content\n\t\t.filter((c) => c.type === \"text\")\n\t\t.map((c) => c.text || \"\")\n\t\t.join(\"\\n\");\n\tif (!output) {\n\t\treturn undefined;\n\t}\n\treturn `\\n${theme.fg(\"error\", output)}`;\n}\n\nexport function createWriteToolDefinition(\n\tcwd: string,\n\toptions?: WriteToolOptions,\n): ToolDefinition<typeof writeSchema, WriteToolDetails> {\n\tconst ops = options?.operations ?? defaultWriteOperations;\n\tconst failureRecoveryAuthority = selectFileFailureRecoveryAuthority(\n\t\toptions?.operations !== undefined,\n\t\toptions?.failureRecoveryAuthority,\n\t);\n\tif (options?.operations && !options.intentController) {\n\t\tthrow new Error(\"Custom write operations require a matching file mutation intent controller.\");\n\t}\n\tconst intentController = options?.intentController ?? new FileMutationIntentController();\n\tconst retargetRecoveryAuthority = createAgentToolFailureRecoveryAuthority();\n\treturn {\n\t\tname: \"write\",\n\t\tlabel: \"write\",\n\t\tdescription:\n\t\t\t\"Create a new file without overwriting. Send path and exactly one of content or contentRef. After a path-only collision, use the returned payloadRef with only a corrected path. The harness owns preflight, bounded payload retention, and atomic rechecks.\",\n\t\tpromptSnippet: \"Preflight new paths; never overwrite\",\n\t\tpromptGuidelines: [\n\t\t\t\"Call once: path plus exactly one of content/contentRef; harness owns preparation/collision checks.\",\n\t\t\t\"Collision with payloadRef: choose new path, reuse reference; never regenerate content.\",\n\t\t\t\"write is create-only; edit existing files. Reuse contentRef for exact copies.\",\n\t\t],\n\t\tparameters: writeSchema,\n\t\tfailureRecovery: {\n\t\t\tgetFailureTargets: (params, failure) =>\n\t\t\t\tfailure.failureCode === \"mutation_retarget_required\"\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tauthority: retargetRecoveryAuthority,\n\t\t\t\t\t\t\t\tkind: WRITE_RETARGET_RECOVERY_TARGET_KIND,\n\t\t\t\t\t\t\t\tscope: resolveToCwd(params.path, cwd),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: [],\n\t\t\tactions: [\n\t\t\t\t{\n\t\t\t\t\tkind: \"correct\",\n\t\t\t\t\tauthority: retargetRecoveryAuthority,\n\t\t\t\t\ttargetKind: WRITE_RETARGET_RECOVERY_TARGET_KIND,\n\t\t\t\t\tinstruction:\n\t\t\t\t\t\t\"Use write with the retained payloadRef and a corrected new path; write cannot overwrite an existing entry.\",\n\t\t\t\t},\n\t\t\t\t...(failureRecoveryAuthority\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkind: \"repair\" as const,\n\t\t\t\t\t\t\t\tauthority: failureRecoveryAuthority.contractAuthority,\n\t\t\t\t\t\t\t\ttargetKind: FILE_EXISTS_RECOVERY_TARGET_KIND,\n\t\t\t\t\t\t\t\tinstruction:\n\t\t\t\t\t\t\t\t\t\"If the goal requires this exact missing file and its content is known, create it with write.\",\n\t\t\t\t\t\t\t\tgetEvidence: (params: WriteToolInput, result: { details: WriteToolDetails }) =>\n\t\t\t\t\t\t\t\t\tresult.details.phase === \"written\"\n\t\t\t\t\t\t\t\t\t\t? [fileRecoveryScope(failureRecoveryAuthority, params.path, cwd)]\n\t\t\t\t\t\t\t\t\t\t: [],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: []),\n\t\t\t],\n\t\t},\n\t\tasync execute(_toolCallId, input: WriteToolInput, signal?: AbortSignal, _onUpdate?, _ctx?) {\n\t\t\tconst { path } = input;\n\t\t\tconst absolutePath = resolveToCwd(path, cwd);\n\t\t\tconst content = \"content\" in input && typeof input.content === \"string\" ? input.content : undefined;\n\t\t\tconst contentRef =\n\t\t\t\t\"contentRef\" in input && typeof input.contentRef === \"string\" ? input.contentRef : undefined;\n\t\t\tconst payloadRef =\n\t\t\t\t\"payloadRef\" in input && typeof input.payloadRef === \"string\" ? input.payloadRef : undefined;\n\t\t\tif ([content, contentRef, payloadRef].filter((value) => value !== undefined).length !== 1) {\n\t\t\t\tthrow new Error(\"Write requires exactly one of content, contentRef, or payloadRef.\");\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst lease = await intentController.prepare(\"write\", absolutePath, signal, path);\n\t\t\t\treturn await withFileMutationQueue(absolutePath, async () => {\n\t\t\t\t\t// Do not reject from an abort event listener here: that would release the\n\t\t\t\t\t// mutation queue while an in-flight filesystem operation may still finish.\n\t\t\t\t\t// Checking signal.aborted after each await observes the same aborts while\n\t\t\t\t\t// keeping the queue locked until the current operation has settled.\n\t\t\t\t\tconst throwIfAborted = (): void => {\n\t\t\t\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\t\t\t};\n\n\t\t\t\t\tthrowIfAborted();\n\t\t\t\t\tawait intentController.assertCurrent(lease, signal);\n\t\t\t\t\tawait ops.mkdir(dirname(absolutePath));\n\t\t\t\t\tthrowIfAborted();\n\n\t\t\t\t\tlet contentReference: FileContentReference;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (content !== undefined) {\n\t\t\t\t\t\t\tawait ops.createFile(absolutePath, content);\n\t\t\t\t\t\t\tcontentReference = intentController.rememberContent(absolutePath, content);\n\t\t\t\t\t\t} else if (contentRef !== undefined) {\n\t\t\t\t\t\t\tcontentReference = await intentController.copyReferencedContent(contentRef, absolutePath, signal);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (payloadRef === undefined) throw new Error(\"Write requires a payload reference.\");\n\t\t\t\t\t\t\tcontentReference = await intentController.copyMutationPayload(payloadRef, absolutePath, signal);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"EEXIST\") {\n\t\t\t\t\t\t\tthrow new FileMutationPreflightError(\n\t\t\t\t\t\t\t\t\"write_collision\",\n\t\t\t\t\t\t\t\t`Write collision: ${path} already exists; no content was overwritten.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\tthrowIfAborted();\n\n\t\t\t\t\tconst byteCount = contentReference.byteLength;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: `Successfully wrote ${byteCount} bytes to ${path}; this write is complete, so do not call write again for this path. To copy these exact bytes to a different new path, call write once for that path with contentRef ${contentReference.contentRef}.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\tphase: \"written\" as const,\n\t\t\t\t\t\t\tcontentRef: contentReference.contentRef,\n\t\t\t\t\t\t\tbyteCount,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof FileMutationPreflightError && error.reason === \"write_collision\") {\n\t\t\t\t\tthrow await writeCollisionWithRetainedPayload(error, input, intentController, signal);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst renderArgs = args as\n\t\t\t\t| { path?: string; file_path?: string; content?: string; contentRef?: string; payloadRef?: string }\n\t\t\t\t| undefined;\n\t\t\tconst rawPath = str(renderArgs?.file_path ?? renderArgs?.path);\n\t\t\tconst fileContent = str(renderArgs?.content);\n\t\t\tconst component =\n\t\t\t\t(context.lastComponent as WriteCallRenderComponent | undefined) ?? new WriteCallRenderComponent();\n\t\t\tif (fileContent !== null) {\n\t\t\t\tcomponent.cache = getWriteHighlightCache(\n\t\t\t\t\tcomponent.cache,\n\t\t\t\t\targs,\n\t\t\t\t\trawPath,\n\t\t\t\t\tfileContent,\n\t\t\t\t\tcontext.argsComplete && !context.toolGroupSummary,\n\t\t\t\t\tcontext.expanded,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcomponent.cache = undefined;\n\t\t\t}\n\t\t\tcomponent.setText(\n\t\t\t\tformatWriteCall(\n\t\t\t\t\trenderArgs,\n\t\t\t\t\t{ expanded: context.expanded, isPartial: context.isPartial },\n\t\t\t\t\ttheme,\n\t\t\t\t\tcomponent.cache,\n\t\t\t\t\tcontext.cwd,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn component;\n\t\t},\n\t\trenderResult(result, _options, theme, context) {\n\t\t\tconst output = formatWriteResult({ ...result, isError: context.isError }, theme);\n\t\t\tif (!output) {\n\t\t\t\tconst component = (context.lastComponent as Container | undefined) ?? new Container();\n\t\t\t\tcomponent.clear();\n\t\t\t\treturn component;\n\t\t\t}\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(output);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema> {\n\treturn wrapToolDefinition(createWriteToolDefinition(cwd, options));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir as fsMkdir, writeFile as fsWriteFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { type AgentTool, createAgentToolFailureRecoveryAuthority } from \"@caupulican/pi-agent-core\";\nimport { Container, Text } from \"@caupulican/pi-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport {\n\tFILE_EXISTS_RECOVERY_TARGET_KIND,\n\ttype FileFailureRecoveryAuthority,\n\tfileRecoveryScope,\n\tselectFileFailureRecoveryAuthority,\n\tWORKSPACE_MUTATED_RECOVERY_TARGET_KIND,\n\tWRITE_RETARGET_RECOVERY_TARGET_KIND,\n\tworkspaceRecoveryScope,\n} from \"./file-failure-recovery.ts\";\nimport {\n\ttype FileContentReference,\n\tFileMutationIntentController,\n\tFileMutationPreflightError,\n} from \"./file-mutation-intent.ts\";\nimport { withFileMutationQueue } from \"./file-mutation-queue.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { normalizeDisplayText, renderToolPath, replaceTabs, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst writePathSchema = Type.String({ minLength: 1 });\nconst writeSchema = Type.Union([\n\tType.Object(\n\t\t{\n\t\t\tpath: writePathSchema,\n\t\t\tcontent: Type.String(),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tType.Object(\n\t\t{\n\t\t\tpath: writePathSchema,\n\t\t\tcontentRef: Type.String({ minLength: 1 }),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n\tType.Object(\n\t\t{\n\t\t\tpath: writePathSchema,\n\t\t\tpayloadRef: Type.String({ minLength: 1 }),\n\t\t},\n\t\t{ additionalProperties: false },\n\t),\n]);\n\nexport type WriteToolInput = Static<typeof writeSchema>;\n\n/**\n * Pluggable operations for the write tool.\n * Override these to delegate file writing to remote systems (for example SSH).\n */\nexport interface WriteOperations {\n\t/** Atomically create a new file and fail if any entry already occupies the path. */\n\tcreateFile: (absolutePath: string, content: string) => Promise<void>;\n\t/** Create directory recursively */\n\tmkdir: (dir: string) => Promise<void>;\n}\n\nconst defaultWriteOperations: WriteOperations = {\n\tcreateFile: (path, content) => fsWriteFile(path, content, { encoding: \"utf-8\", flag: \"wx\" }),\n\tmkdir: (dir) => fsMkdir(dir, { recursive: true }).then(() => {}),\n};\n\nexport interface WriteToolOptions {\n\t/** Custom operations for file writing. Default: local filesystem */\n\toperations?: WriteOperations;\n\t/** Shared backend identity for exact cross-tool recovery with custom operations. */\n\tfailureRecoveryAuthority?: FileFailureRecoveryAuthority;\n\t/** Session-owned harness preflight and exact-content-reference authority. */\n\tintentController?: FileMutationIntentController;\n}\n\nexport interface WriteToolDetails {\n\tphase: \"written\";\n\tcontentRef?: string;\n\tbyteCount?: number;\n}\n\ntype WriteHighlightCache = {\n\targsRef: unknown;\n\trawPath: string | null;\n\tcountCompleteLines: boolean;\n\texpanded: boolean;\n\trenderedLines: string[];\n\ttotalLines?: number;\n\tcappedByCharacters: boolean;\n\tcappedByLines: boolean;\n};\n\nclass WriteCallRenderComponent extends Text {\n\tcache?: WriteHighlightCache;\n\n\tconstructor() {\n\t\tsuper(\"\", 0, 0);\n\t}\n}\n\nconst WRITE_COLLAPSED_PREVIEW_LINES = 10;\nconst WRITE_COLLAPSED_PREVIEW_CHARS = 8_192;\n\nfunction countWriteDisplayLines(fileContent: string): number {\n\tlet lastContentIndex = fileContent.length - 1;\n\twhile (lastContentIndex >= 0) {\n\t\tconst code = fileContent.charCodeAt(lastContentIndex);\n\t\tif (code !== 10 && code !== 13) break;\n\t\tlastContentIndex--;\n\t}\n\tif (lastContentIndex < 0) return 0;\n\n\tlet lines = 1;\n\tfor (let i = 0; i <= lastContentIndex; i++) {\n\t\tif (fileContent.charCodeAt(i) === 10) lines++;\n\t}\n\treturn lines;\n}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction buildCollapsedWriteSource(fileContent: string): {\n\tsource: string;\n\tcappedByCharacters: boolean;\n\tcappedByLines: boolean;\n} {\n\tconst rawPrefix = fileContent.slice(0, WRITE_COLLAPSED_PREVIEW_CHARS);\n\tconst normalizedPrefix = replaceTabs(normalizeDisplayText(rawPrefix));\n\tlet end = normalizedPrefix.length;\n\tlet newlineCount = 0;\n\tfor (let i = 0; i < normalizedPrefix.length; i++) {\n\t\tif (normalizedPrefix.charCodeAt(i) !== 10) continue;\n\t\tnewlineCount++;\n\t\tif (newlineCount === WRITE_COLLAPSED_PREVIEW_LINES) {\n\t\t\tend = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst cappedByLines = end < normalizedPrefix.length;\n\treturn {\n\t\tsource: normalizedPrefix.slice(0, end),\n\t\tcappedByCharacters: !cappedByLines && rawPrefix.length < fileContent.length,\n\t\tcappedByLines,\n\t};\n}\n\nfunction buildWriteHighlightCache(\n\targsRef: unknown,\n\trawPath: string | null,\n\tfileContent: string,\n\tcountCompleteLines: boolean,\n\texpanded: boolean,\n): WriteHighlightCache {\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tif (expanded) {\n\t\tconst source = replaceTabs(normalizeDisplayText(fileContent));\n\t\tconst renderedLines = trimTrailingEmptyLines(lang ? highlightCode(source, lang) : source.split(\"\\n\"));\n\t\treturn {\n\t\t\targsRef,\n\t\t\trawPath,\n\t\t\tcountCompleteLines,\n\t\t\texpanded,\n\t\t\trenderedLines,\n\t\t\ttotalLines: renderedLines.length,\n\t\t\tcappedByCharacters: false,\n\t\t\tcappedByLines: false,\n\t\t};\n\t}\n\n\tconst preview = buildCollapsedWriteSource(fileContent);\n\tconst renderedLines = trimTrailingEmptyLines(\n\t\tlang ? highlightCode(preview.source, lang) : preview.source.split(\"\\n\"),\n\t);\n\treturn {\n\t\targsRef,\n\t\trawPath,\n\t\tcountCompleteLines,\n\t\texpanded,\n\t\trenderedLines,\n\t\ttotalLines: countCompleteLines ? countWriteDisplayLines(fileContent) : undefined,\n\t\tcappedByCharacters: preview.cappedByCharacters,\n\t\tcappedByLines: preview.cappedByLines,\n\t};\n}\n\nfunction getWriteHighlightCache(\n\tcache: WriteHighlightCache | undefined,\n\targsRef: unknown,\n\trawPath: string | null,\n\tfileContent: string,\n\tcountCompleteLines: boolean,\n\texpanded: boolean,\n): WriteHighlightCache {\n\tif (\n\t\tcache &&\n\t\tcache.argsRef === argsRef &&\n\t\tcache.rawPath === rawPath &&\n\t\tcache.countCompleteLines === countCompleteLines &&\n\t\tcache.expanded === expanded\n\t) {\n\t\treturn cache;\n\t}\n\treturn buildWriteHighlightCache(argsRef, rawPath, fileContent, countCompleteLines, expanded);\n}\n\nfunction formatWriteCall(\n\targs: { path?: string; file_path?: string; content?: string; contentRef?: string; payloadRef?: string } | undefined,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tcache: WriteHighlightCache | undefined,\n\tcwd: string,\n): string {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst fileContent = str(args?.content);\n\tconst hasContent = typeof args?.content === \"string\";\n\tconst pathDisplay = renderToolPath(rawPath, theme, cwd);\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"write\"))} ${pathDisplay}`;\n\n\tif (!hasContent && typeof args?.contentRef !== \"string\" && typeof args?.payloadRef !== \"string\") {\n\t\ttext += `\\n\\n${theme.fg(\"error\", \"[invalid content arg - expected string]\")}`;\n\t} else if (hasContent && fileContent) {\n\t\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\t\tconst displayLines = cache?.renderedLines ?? [];\n\t\ttext += `\\n\\n${displayLines.map((line) => (lang ? line : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\t\tif (!options.expanded && cache && (cache.cappedByCharacters || cache.cappedByLines)) {\n\t\t\tconst total = cache.totalLines;\n\t\t\tif (cache.cappedByCharacters) {\n\t\t\t\tconst totalSuffix = total === undefined ? \"\" : `; ${total} total line${total === 1 ? \"\" : \"s\"}`;\n\t\t\t\ttext += `${theme.fg(\"muted\", `\\n... (preview capped at ${WRITE_COLLAPSED_PREVIEW_CHARS} characters${totalSuffix},`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t\t} else if (total === undefined) {\n\t\t\t\ttext += `${theme.fg(\"muted\", \"\\n... (preview capped,\")} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t\t} else {\n\t\t\t\tconst remaining = Math.max(0, total - displayLines.length);\n\t\t\t\tif (remaining > 0) {\n\t\t\t\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines, ${total} total,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (args?.contentRef) {\n\t\ttext += `\\n\\n${theme.fg(\"muted\", `reuse ${args.contentRef}`)}`;\n\t} else if (args?.payloadRef) {\n\t\ttext += `\\n\\n${theme.fg(\"muted\", `retarget ${args.payloadRef}`)}`;\n\t}\n\n\treturn text;\n}\n\nasync function writeCollisionWithRetainedPayload(\n\terror: FileMutationPreflightError,\n\tinput: WriteToolInput,\n\tintentController: FileMutationIntentController,\n\tsignal?: AbortSignal,\n): Promise<Error> {\n\tconst retargetError = (reference: string): Error =>\n\t\tnew Error(\n\t\t\t`PI_FILE_MUTATION_RETARGET write_collision: ${reference}. Choose only a corrected path; the exact valid write payload is retained.`,\n\t\t);\n\tif (\"contentRef\" in input) {\n\t\tawait intentController.assertContentReference(input.contentRef, signal);\n\t\treturn retargetError(`contentRef ${input.contentRef}`);\n\t}\n\tif (\"payloadRef\" in input) {\n\t\tawait intentController.assertMutationPayload(input.payloadRef, \"write\", signal);\n\t\treturn retargetError(`payloadRef ${input.payloadRef}`);\n\t}\n\n\ttry {\n\t\tconst retained = await intentController.retainMutationPayload(\"write\", input.content);\n\t\tif (retained) {\n\t\t\treturn retargetError(`payloadRef ${retained.payloadRef}`);\n\t\t}\n\t} catch {\n\t\t// The collision remains authoritative when the bounded retry cache is unavailable.\n\t}\n\treturn new Error(`${error.message} The payload could not be retained within the secure retry-cache bound.`);\n}\n\nfunction formatWriteResult(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }>; isError?: boolean },\n\ttheme: Theme,\n): string | undefined {\n\tif (!result.isError) {\n\t\treturn undefined;\n\t}\n\tconst output = result.content\n\t\t.filter((c) => c.type === \"text\")\n\t\t.map((c) => c.text || \"\")\n\t\t.join(\"\\n\");\n\tif (!output) {\n\t\treturn undefined;\n\t}\n\treturn `\\n${theme.fg(\"error\", output)}`;\n}\n\nexport function createWriteToolDefinition(\n\tcwd: string,\n\toptions?: WriteToolOptions,\n): ToolDefinition<typeof writeSchema, WriteToolDetails> {\n\tconst ops = options?.operations ?? defaultWriteOperations;\n\tconst failureRecoveryAuthority = selectFileFailureRecoveryAuthority(\n\t\toptions?.operations !== undefined,\n\t\toptions?.failureRecoveryAuthority,\n\t);\n\tif (options?.operations && !options.intentController) {\n\t\tthrow new Error(\"Custom write operations require a matching file mutation intent controller.\");\n\t}\n\tconst intentController = options?.intentController ?? new FileMutationIntentController();\n\tconst retargetRecoveryAuthority = createAgentToolFailureRecoveryAuthority();\n\treturn {\n\t\tname: \"write\",\n\t\tlabel: \"write\",\n\t\tdescription:\n\t\t\t\"Create a new file without overwriting. Send path and exactly one of content or contentRef. After a path-only collision, use the returned payloadRef with only a corrected path. The harness owns preflight, bounded payload retention, and atomic rechecks.\",\n\t\tpromptSnippet: \"Preflight new paths; never overwrite\",\n\t\tpromptGuidelines: [\n\t\t\t\"Call once: path plus exactly one of content/contentRef; harness owns preparation/collision checks.\",\n\t\t\t\"Collision with payloadRef: choose new path, reuse reference; never regenerate content.\",\n\t\t\t\"write is create-only; edit existing files. Reuse contentRef for exact copies.\",\n\t\t],\n\t\tparameters: writeSchema,\n\t\tfailureRecovery: {\n\t\t\tgetFailureTargets: (params, failure) =>\n\t\t\t\tfailure.failureCode === \"mutation_retarget_required\"\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tauthority: retargetRecoveryAuthority,\n\t\t\t\t\t\t\t\tkind: WRITE_RETARGET_RECOVERY_TARGET_KIND,\n\t\t\t\t\t\t\t\tscope: resolveToCwd(params.path, cwd),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: [],\n\t\t\tactions: [\n\t\t\t\t{\n\t\t\t\t\tkind: \"correct\",\n\t\t\t\t\tauthority: retargetRecoveryAuthority,\n\t\t\t\t\ttargetKind: WRITE_RETARGET_RECOVERY_TARGET_KIND,\n\t\t\t\t\tinstruction:\n\t\t\t\t\t\t\"Use write with the retained payloadRef and a corrected new path; write cannot overwrite an existing entry.\",\n\t\t\t\t},\n\t\t\t\t...(failureRecoveryAuthority\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkind: \"repair\" as const,\n\t\t\t\t\t\t\t\tauthority: failureRecoveryAuthority.contractAuthority,\n\t\t\t\t\t\t\t\ttargetKind: FILE_EXISTS_RECOVERY_TARGET_KIND,\n\t\t\t\t\t\t\t\tinstruction:\n\t\t\t\t\t\t\t\t\t\"If the goal requires this exact missing file and its content is known, create it with write.\",\n\t\t\t\t\t\t\t\tgetEvidence: (params: WriteToolInput, result: { details: WriteToolDetails }) =>\n\t\t\t\t\t\t\t\t\tresult.details.phase === \"written\"\n\t\t\t\t\t\t\t\t\t\t? [fileRecoveryScope(failureRecoveryAuthority, params.path, cwd)]\n\t\t\t\t\t\t\t\t\t\t: [],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkind: \"repair\" as const,\n\t\t\t\t\t\t\t\tauthority: failureRecoveryAuthority.contractAuthority,\n\t\t\t\t\t\t\t\ttargetKind: WORKSPACE_MUTATED_RECOVERY_TARGET_KIND,\n\t\t\t\t\t\t\t\tinstruction:\n\t\t\t\t\t\t\t\t\t\"When a command failed because workspace contents need repair, create the required file and rerun that exact command once.\",\n\t\t\t\t\t\t\t\tgetEvidence: (_params: WriteToolInput, result: { details: WriteToolDetails }) =>\n\t\t\t\t\t\t\t\t\tresult.details.phase === \"written\"\n\t\t\t\t\t\t\t\t\t\t? [workspaceRecoveryScope(failureRecoveryAuthority, cwd)]\n\t\t\t\t\t\t\t\t\t\t: [],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: []),\n\t\t\t],\n\t\t},\n\t\tasync execute(_toolCallId, input: WriteToolInput, signal?: AbortSignal, _onUpdate?, _ctx?) {\n\t\t\tconst { path } = input;\n\t\t\tconst absolutePath = resolveToCwd(path, cwd);\n\t\t\tconst content = \"content\" in input && typeof input.content === \"string\" ? input.content : undefined;\n\t\t\tconst contentRef =\n\t\t\t\t\"contentRef\" in input && typeof input.contentRef === \"string\" ? input.contentRef : undefined;\n\t\t\tconst payloadRef =\n\t\t\t\t\"payloadRef\" in input && typeof input.payloadRef === \"string\" ? input.payloadRef : undefined;\n\t\t\tif ([content, contentRef, payloadRef].filter((value) => value !== undefined).length !== 1) {\n\t\t\t\tthrow new Error(\"Write requires exactly one of content, contentRef, or payloadRef.\");\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst lease = await intentController.prepare(\"write\", absolutePath, signal, path);\n\t\t\t\treturn await withFileMutationQueue(absolutePath, async () => {\n\t\t\t\t\t// Do not reject from an abort event listener here: that would release the\n\t\t\t\t\t// mutation queue while an in-flight filesystem operation may still finish.\n\t\t\t\t\t// Checking signal.aborted after each await observes the same aborts while\n\t\t\t\t\t// keeping the queue locked until the current operation has settled.\n\t\t\t\t\tconst throwIfAborted = (): void => {\n\t\t\t\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\t\t\t};\n\n\t\t\t\t\tthrowIfAborted();\n\t\t\t\t\tawait intentController.assertCurrent(lease, signal);\n\t\t\t\t\tawait ops.mkdir(dirname(absolutePath));\n\t\t\t\t\tthrowIfAborted();\n\n\t\t\t\t\tlet contentReference: FileContentReference;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (content !== undefined) {\n\t\t\t\t\t\t\tawait ops.createFile(absolutePath, content);\n\t\t\t\t\t\t\tcontentReference = intentController.rememberContent(absolutePath, content);\n\t\t\t\t\t\t} else if (contentRef !== undefined) {\n\t\t\t\t\t\t\tcontentReference = await intentController.copyReferencedContent(contentRef, absolutePath, signal);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (payloadRef === undefined) throw new Error(\"Write requires a payload reference.\");\n\t\t\t\t\t\t\tcontentReference = await intentController.copyMutationPayload(payloadRef, absolutePath, signal);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"EEXIST\") {\n\t\t\t\t\t\t\tthrow new FileMutationPreflightError(\n\t\t\t\t\t\t\t\t\"write_collision\",\n\t\t\t\t\t\t\t\t`Write collision: ${path} already exists; no content was overwritten.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\tthrowIfAborted();\n\n\t\t\t\t\tconst byteCount = contentReference.byteLength;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: `Successfully wrote ${byteCount} bytes to ${path}; this write is complete, so do not call write again for this path. To copy these exact bytes to a different new path, call write once for that path with contentRef ${contentReference.contentRef}.`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\tphase: \"written\" as const,\n\t\t\t\t\t\t\tcontentRef: contentReference.contentRef,\n\t\t\t\t\t\t\tbyteCount,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof FileMutationPreflightError && error.reason === \"write_collision\") {\n\t\t\t\t\tthrow await writeCollisionWithRetainedPayload(error, input, intentController, signal);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst renderArgs = args as\n\t\t\t\t| { path?: string; file_path?: string; content?: string; contentRef?: string; payloadRef?: string }\n\t\t\t\t| undefined;\n\t\t\tconst rawPath = str(renderArgs?.file_path ?? renderArgs?.path);\n\t\t\tconst fileContent = str(renderArgs?.content);\n\t\t\tconst component =\n\t\t\t\t(context.lastComponent as WriteCallRenderComponent | undefined) ?? new WriteCallRenderComponent();\n\t\t\tif (fileContent !== null) {\n\t\t\t\tcomponent.cache = getWriteHighlightCache(\n\t\t\t\t\tcomponent.cache,\n\t\t\t\t\targs,\n\t\t\t\t\trawPath,\n\t\t\t\t\tfileContent,\n\t\t\t\t\tcontext.argsComplete && !context.toolGroupSummary,\n\t\t\t\t\tcontext.expanded,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcomponent.cache = undefined;\n\t\t\t}\n\t\t\tcomponent.setText(\n\t\t\t\tformatWriteCall(\n\t\t\t\t\trenderArgs,\n\t\t\t\t\t{ expanded: context.expanded, isPartial: context.isPartial },\n\t\t\t\t\ttheme,\n\t\t\t\t\tcomponent.cache,\n\t\t\t\t\tcontext.cwd,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn component;\n\t\t},\n\t\trenderResult(result, _options, theme, context) {\n\t\t\tconst output = formatWriteResult({ ...result, isError: context.isError }, theme);\n\t\t\tif (!output) {\n\t\t\t\tconst component = (context.lastComponent as Container | undefined) ?? new Container();\n\t\t\t\tcomponent.clear();\n\t\t\t\treturn component;\n\t\t\t}\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(output);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema> {\n\treturn wrapToolDefinition(createWriteToolDefinition(cwd, options));\n}\n"]}
|
|
@@ -4,7 +4,7 @@ import { type GoalState } from "../../../core/goals/goal-state.ts";
|
|
|
4
4
|
import type { TaskStepsState } from "../../../core/tasks/task-state.ts";
|
|
5
5
|
import type { Theme } from "../theme/theme.ts";
|
|
6
6
|
export type ActivityLaneKind = "runtime" | "tool" | "task" | "worker" | "goal" | "queue" | "notice";
|
|
7
|
-
export type ActivityLaneStatus = "active" | "waiting" | "success" | "failure" | "neutral";
|
|
7
|
+
export type ActivityLaneStatus = "active" | "waiting" | "success" | "warning" | "failure" | "neutral";
|
|
8
8
|
export interface ActivityLaneItem {
|
|
9
9
|
id: string;
|
|
10
10
|
kind: ActivityLaneKind;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-lane.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/activity-lane.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,KAAK,SAAS,EAA0B,MAAM,mCAAmC,CAAC;AAC3F,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,mBAAmB,CAAC;AAE3D,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AACpG,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"activity-lane.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/activity-lane.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ const STATUS_COLORS = {
|
|
|
14
14
|
active: "muted",
|
|
15
15
|
waiting: "warning",
|
|
16
16
|
success: "success",
|
|
17
|
+
warning: "warning",
|
|
17
18
|
failure: "error",
|
|
18
19
|
neutral: "muted",
|
|
19
20
|
};
|
|
@@ -108,6 +109,8 @@ function projectLaneRecords(records) {
|
|
|
108
109
|
}));
|
|
109
110
|
const terminal = workers
|
|
110
111
|
.filter((record) => record.status === "succeeded" ||
|
|
112
|
+
record.status === "partial" ||
|
|
113
|
+
record.status === "blocked" ||
|
|
111
114
|
record.status === "failed" ||
|
|
112
115
|
record.status === "timeout" ||
|
|
113
116
|
record.status === "budget_exhausted" ||
|
|
@@ -116,7 +119,13 @@ function projectLaneRecords(records) {
|
|
|
116
119
|
id: `terminal:worker:${record.laneId}:${record.status}:${record.completedAt ?? "unknown"}`,
|
|
117
120
|
kind: "worker",
|
|
118
121
|
label: boundedLabel(`${record.status === "succeeded" ? "Finished" : record.status} · ${record.label ?? record.laneId}`),
|
|
119
|
-
status: record.status === "succeeded"
|
|
122
|
+
status: record.status === "succeeded"
|
|
123
|
+
? "success"
|
|
124
|
+
: record.status === "partial" || record.status === "blocked"
|
|
125
|
+
? "warning"
|
|
126
|
+
: record.status === "canceled"
|
|
127
|
+
? "neutral"
|
|
128
|
+
: "failure",
|
|
120
129
|
}));
|
|
121
130
|
return { active, terminal };
|
|
122
131
|
}
|
|
@@ -146,7 +155,7 @@ const AGGREGATE_GROUP_MAX = 3;
|
|
|
146
155
|
const PLAN_TEXT_MIN = 24;
|
|
147
156
|
const SLOT_GAP_WIDTH = 2;
|
|
148
157
|
function isTerminalStatus(status) {
|
|
149
|
-
return status === "success" || status === "failure" || status === "neutral";
|
|
158
|
+
return status === "success" || status === "warning" || status === "failure" || status === "neutral";
|
|
150
159
|
}
|
|
151
160
|
function normalizeActivityTag(tag, fallback) {
|
|
152
161
|
const normalized = (tag ?? fallback)
|