@caupulican/pi-adaptative 0.85.4 → 0.86.1
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 +65 -0
- package/dist/bun/cli.d.ts +1 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +1 -0
- package/dist/bun/cli.js.map +1 -1
- package/dist/core/agent-paths.d.ts +3 -3
- package/dist/core/agent-paths.d.ts.map +1 -1
- package/dist/core/agent-paths.js +3 -3
- package/dist/core/agent-paths.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +1 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +11 -5
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +14 -3
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +2 -2
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +2 -2
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
- package/dist/core/autonomy/bounded-completion.js +19 -8
- package/dist/core/autonomy/bounded-completion.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts +11 -5
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +34 -8
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/autonomy/subagent-prompt.d.ts +3 -3
- package/dist/core/autonomy/subagent-prompt.js +9 -9
- package/dist/core/autonomy/subagent-prompt.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +10 -8
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +23 -13
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/bash-execution-controller.d.ts +4 -0
- package/dist/core/bash-execution-controller.d.ts.map +1 -1
- package/dist/core/bash-execution-controller.js +11 -4
- package/dist/core/bash-execution-controller.js.map +1 -1
- package/dist/core/bash-executor.d.ts +2 -0
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +4 -3
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/billing-failover-controller.d.ts +2 -2
- package/dist/core/billing-failover-controller.d.ts.map +1 -1
- package/dist/core/billing-failover-controller.js +1 -1
- package/dist/core/billing-failover-controller.js.map +1 -1
- package/dist/core/capability-contract.d.ts +1 -1
- package/dist/core/capability-contract.d.ts.map +1 -1
- package/dist/core/capability-contract.js +0 -1
- package/dist/core/capability-contract.js.map +1 -1
- package/dist/core/compaction-controller.d.ts +8 -2
- package/dist/core/compaction-controller.d.ts.map +1 -1
- package/dist/core/compaction-controller.js +73 -3
- package/dist/core/compaction-controller.js.map +1 -1
- package/dist/core/compaction-support.d.ts +2 -2
- package/dist/core/compaction-support.d.ts.map +1 -1
- package/dist/core/compaction-support.js +9 -1
- package/dist/core/compaction-support.js.map +1 -1
- package/dist/core/context/artifact-retrieval.d.ts +1 -1
- package/dist/core/context/artifact-retrieval.d.ts.map +1 -1
- package/dist/core/context/artifact-retrieval.js +1 -1
- package/dist/core/context/artifact-retrieval.js.map +1 -1
- package/dist/core/context/context-artifacts.d.ts +6 -6
- package/dist/core/context/context-artifacts.d.ts.map +1 -1
- package/dist/core/context/context-artifacts.js +151 -63
- package/dist/core/context/context-artifacts.js.map +1 -1
- package/dist/core/context/context-composition.js +1 -1
- package/dist/core/context/context-composition.js.map +1 -1
- package/dist/core/context/context-store-retention.d.ts.map +1 -1
- package/dist/core/context/context-store-retention.js +5 -2
- package/dist/core/context/context-store-retention.js.map +1 -1
- package/dist/core/context/file-store-memory-provider.js +1 -1
- package/dist/core/context/file-store-memory-provider.js.map +1 -1
- package/dist/core/context/tool-output-packer.d.ts +1 -1
- package/dist/core/context/tool-output-packer.d.ts.map +1 -1
- package/dist/core/context/tool-output-packer.js +1 -1
- package/dist/core/context/tool-output-packer.js.map +1 -1
- package/dist/core/context-gc.d.ts.map +1 -1
- package/dist/core/context-gc.js +7 -5
- package/dist/core/context-gc.js.map +1 -1
- package/dist/core/context-pipeline.d.ts +2 -2
- package/dist/core/context-pipeline.d.ts.map +1 -1
- package/dist/core/context-pipeline.js +8 -4
- package/dist/core/context-pipeline.js.map +1 -1
- package/dist/core/cost/cost-summary.d.ts +1 -1
- package/dist/core/cost/cost-summary.d.ts.map +1 -1
- package/dist/core/cost/cost-summary.js +1 -1
- package/dist/core/cost/cost-summary.js.map +1 -1
- package/dist/core/cost/daily-usage.d.ts +1 -1
- package/dist/core/cost/daily-usage.d.ts.map +1 -1
- package/dist/core/cost/daily-usage.js +2 -2
- package/dist/core/cost/daily-usage.js.map +1 -1
- package/dist/core/cost/session-usage.d.ts +1 -1
- package/dist/core/cost/session-usage.d.ts.map +1 -1
- package/dist/core/cost/session-usage.js +1 -1
- package/dist/core/cost/session-usage.js.map +1 -1
- package/dist/core/default-tool-surface.d.ts +1 -0
- package/dist/core/default-tool-surface.d.ts.map +1 -1
- package/dist/core/default-tool-surface.js +3 -2
- package/dist/core/default-tool-surface.js.map +1 -1
- package/dist/core/delegation/worker-actions.js +1 -1
- package/dist/core/delegation/worker-actions.js.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts +27 -8
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.js +191 -33
- package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-agent-control.d.ts +45 -6
- package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control.js +110 -13
- package/dist/core/delegation/worker-agent-control.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +180 -160
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.d.ts +23 -0
- package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -0
- package/dist/core/delegation/worker-authority-resolver.js +128 -0
- package/dist/core/delegation/worker-authority-resolver.js.map +1 -0
- package/dist/core/delegation/worker-conversation-store.d.ts +2 -1
- package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
- package/dist/core/delegation/worker-conversation-store.js +4 -3
- package/dist/core/delegation/worker-conversation-store.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +7 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +260 -87
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-delegation-request.d.ts +25 -4
- package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-request.js +90 -1
- package/dist/core/delegation/worker-delegation-request.js.map +1 -1
- package/dist/core/delegation/worker-execution-policy.d.ts +2 -0
- package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
- package/dist/core/delegation/worker-execution-policy.js +22 -12
- package/dist/core/delegation/worker-execution-policy.js.map +1 -1
- 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 +4 -2
- package/dist/core/delegation/worker-lifecycle.js.map +1 -1
- package/dist/core/delegation/worker-profile-resolver.d.ts +0 -2
- package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -1
- package/dist/core/delegation/worker-profile-resolver.js +8 -35
- package/dist/core/delegation/worker-profile-resolver.js.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.js +1 -0
- package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-runner.d.ts +6 -1
- package/dist/core/delegation/worker-runner.d.ts.map +1 -1
- package/dist/core/delegation/worker-runner.js +20 -6
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts +47 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.js +210 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -0
- package/dist/core/extensions/builtin.d.ts +2 -2
- package/dist/core/extensions/builtin.d.ts.map +1 -1
- package/dist/core/extensions/builtin.js +2 -2
- package/dist/core/extensions/builtin.js.map +1 -1
- package/dist/core/extensions/bundled-virtual-modules.d.ts +2 -0
- package/dist/core/extensions/bundled-virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/bundled-virtual-modules.js +129 -0
- package/dist/core/extensions/bundled-virtual-modules.js.map +1 -0
- package/dist/core/extensions/factory-runtime.d.ts +22 -0
- package/dist/core/extensions/factory-runtime.d.ts.map +1 -0
- package/dist/core/extensions/factory-runtime.js +334 -0
- package/dist/core/extensions/factory-runtime.js.map +1 -0
- 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 +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/lifecycle.d.ts +13 -0
- package/dist/core/extensions/lifecycle.d.ts.map +1 -0
- package/dist/core/extensions/lifecycle.js +52 -0
- package/dist/core/extensions/lifecycle.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +3 -24
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +21 -531
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/virtual-modules.d.ts +51 -0
- package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
- package/dist/core/extensions/virtual-modules.js +59 -0
- package/dist/core/extensions/virtual-modules.js.map +1 -0
- package/dist/core/foreground-recovery-controller.d.ts +2 -1
- package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
- package/dist/core/foreground-recovery-controller.js +3 -3
- package/dist/core/foreground-recovery-controller.js.map +1 -1
- package/dist/core/goal-loop-controller.js +1 -1
- package/dist/core/goal-loop-controller.js.map +1 -1
- package/dist/core/goals/compact-goal-context.d.ts +1 -1
- package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
- package/dist/core/goals/compact-goal-context.js +1 -1
- package/dist/core/goals/compact-goal-context.js.map +1 -1
- package/dist/core/goals/goal-auto-continue-controller.js +1 -1
- package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +1 -1
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +1 -1
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/index.d.ts +3 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +1 -1
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory/providers/user-memory-archive.js +1 -1
- package/dist/core/memory/providers/user-memory-archive.js.map +1 -1
- package/dist/core/model-registry.d.ts +2 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +4 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-router-controller.js +1 -1
- package/dist/core/model-router-controller.js.map +1 -1
- package/dist/core/model-selection-controller.js +1 -1
- package/dist/core/model-selection-controller.js.map +1 -1
- package/dist/core/model-tool-protocol.d.ts +1 -1
- package/dist/core/model-tool-protocol.d.ts.map +1 -1
- package/dist/core/model-tool-protocol.js +1 -1
- package/dist/core/model-tool-protocol.js.map +1 -1
- package/dist/core/models/llamacpp-runtime.d.ts +7 -0
- package/dist/core/models/llamacpp-runtime.d.ts.map +1 -1
- package/dist/core/models/llamacpp-runtime.js +8 -3
- package/dist/core/models/llamacpp-runtime.js.map +1 -1
- package/dist/core/models/local-runtime.js +1 -1
- package/dist/core/models/local-runtime.js.map +1 -1
- package/dist/core/models/runtime-process.d.ts.map +1 -1
- package/dist/core/models/runtime-process.js +5 -18
- package/dist/core/models/runtime-process.js.map +1 -1
- package/dist/core/orchestration/bounded-string-array.d.ts +11 -0
- package/dist/core/orchestration/bounded-string-array.d.ts.map +1 -0
- package/dist/core/orchestration/bounded-string-array.js +17 -0
- package/dist/core/orchestration/bounded-string-array.js.map +1 -0
- package/dist/core/orchestration/capability-gateway.d.ts +16 -0
- package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
- package/dist/core/orchestration/capability-gateway.js +38 -0
- package/dist/core/orchestration/capability-gateway.js.map +1 -1
- package/dist/core/orchestration/contracts.d.ts +11 -3
- package/dist/core/orchestration/contracts.d.ts.map +1 -1
- package/dist/core/orchestration/contracts.js +0 -1
- package/dist/core/orchestration/contracts.js.map +1 -1
- package/dist/core/orchestration/delegation-ledger.d.ts +1 -0
- package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -1
- package/dist/core/orchestration/delegation-ledger.js +3 -0
- package/dist/core/orchestration/delegation-ledger.js.map +1 -1
- package/dist/core/orchestration/event-store.d.ts +12 -10
- package/dist/core/orchestration/event-store.d.ts.map +1 -1
- package/dist/core/orchestration/event-store.js +94 -104
- package/dist/core/orchestration/event-store.js.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
- package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.js +4 -1
- package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
- package/dist/core/orchestration/model-binding.d.ts +1 -1
- package/dist/core/orchestration/model-binding.d.ts.map +1 -1
- package/dist/core/orchestration/model-binding.js +1 -1
- package/dist/core/orchestration/model-binding.js.map +1 -1
- package/dist/core/orchestration/policy-compiler.d.ts.map +1 -1
- package/dist/core/orchestration/policy-compiler.js +8 -9
- package/dist/core/orchestration/policy-compiler.js.map +1 -1
- package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
- package/dist/core/orchestration/profile-registry.js +4 -10
- package/dist/core/orchestration/profile-registry.js.map +1 -1
- package/dist/core/orchestration/task-profile-writer.js +1 -1
- package/dist/core/orchestration/task-profile-writer.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 +58 -3
- package/dist/core/orchestration/task-runtime.js.map +1 -1
- package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
- package/dist/core/orchestration/worker-execution-contract.js +10 -17
- package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
- package/dist/core/process-matrix/runtime.d.ts +15 -1
- package/dist/core/process-matrix/runtime.d.ts.map +1 -1
- package/dist/core/process-matrix/runtime.js +55 -34
- package/dist/core/process-matrix/runtime.js.map +1 -1
- package/dist/core/reflection-controller.d.ts +4 -3
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +2 -2
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/research/model-fitness-controller.js +1 -1
- package/dist/core/research/model-fitness-controller.js.map +1 -1
- package/dist/core/research/research-lane-controller.d.ts +2 -2
- package/dist/core/research/research-lane-controller.d.ts.map +1 -1
- package/dist/core/research/research-lane-controller.js +1 -1
- package/dist/core/research/research-lane-controller.js.map +1 -1
- package/dist/core/resource-loader.d.ts +10 -19
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +8 -70
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/risk-classifier.js +3 -3
- package/dist/core/risk-classifier.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +4 -1
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +47 -18
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/scout-controller.d.ts +1 -1
- package/dist/core/scout-controller.d.ts.map +1 -1
- package/dist/core/scout-controller.js +1 -1
- package/dist/core/scout-controller.js.map +1 -1
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/secrets/bitwarden-credential-storage.d.ts +51 -0
- package/dist/core/secrets/bitwarden-credential-storage.d.ts.map +1 -0
- package/dist/core/secrets/bitwarden-credential-storage.js +345 -0
- package/dist/core/secrets/bitwarden-credential-storage.js.map +1 -0
- package/dist/core/secrets/credential-exposure-guard.d.ts +8 -4
- package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.js +31 -29
- package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
- package/dist/core/secrets/credential-manager.d.ts +109 -0
- package/dist/core/secrets/credential-manager.d.ts.map +1 -0
- package/dist/core/secrets/credential-manager.js +384 -0
- package/dist/core/secrets/credential-manager.js.map +1 -0
- package/dist/core/secrets/credential-project.d.ts +4 -0
- package/dist/core/secrets/credential-project.d.ts.map +1 -0
- package/dist/core/secrets/credential-project.js +145 -0
- package/dist/core/secrets/credential-project.js.map +1 -0
- package/dist/core/secrets/secret-dotenv.d.ts +1 -1
- package/dist/core/secrets/secret-dotenv.js +1 -1
- package/dist/core/secrets/secret-dotenv.js.map +1 -1
- package/dist/core/security/context-threat-scanner.d.ts +14 -0
- package/dist/core/security/context-threat-scanner.d.ts.map +1 -0
- package/dist/core/security/context-threat-scanner.js +71 -0
- package/dist/core/security/context-threat-scanner.js.map +1 -0
- package/dist/core/session-supervision-runtime.d.ts +4 -1
- package/dist/core/session-supervision-runtime.d.ts.map +1 -1
- package/dist/core/session-supervision-runtime.js +49 -11
- package/dist/core/session-supervision-runtime.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +10 -6
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tool-capability-policy.js +2 -2
- package/dist/core/tool-capability-policy.js.map +1 -1
- package/dist/core/tool-recovery-logger.js +1 -1
- package/dist/core/tool-recovery-logger.js.map +1 -1
- package/dist/core/tools/artifact-retrieve.js +1 -1
- package/dist/core/tools/artifact-retrieve.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +16 -4
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +29 -1
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +179 -28
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/extensionify-runtime.d.ts +44 -0
- package/dist/core/tools/extensionify-runtime.d.ts.map +1 -0
- package/dist/core/tools/extensionify-runtime.js +115 -0
- package/dist/core/tools/extensionify-runtime.js.map +1 -0
- package/dist/core/tools/extensionify.d.ts +9 -30
- package/dist/core/tools/extensionify.d.ts.map +1 -1
- package/dist/core/tools/extensionify.js +10 -140
- package/dist/core/tools/extensionify.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/git-filter.d.ts +1 -0
- package/dist/core/tools/git-filter.d.ts.map +1 -1
- package/dist/core/tools/git-filter.js +1 -1
- package/dist/core/tools/git-filter.js.map +1 -1
- package/dist/core/tools/index.d.ts +2 -4
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +7 -43
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +1 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/profile-writer.js +3 -3
- package/dist/core/tools/profile-writer.js.map +1 -1
- package/dist/core/tools/python.d.ts +2 -0
- package/dist/core/tools/python.d.ts.map +1 -1
- package/dist/core/tools/python.js +17 -12
- package/dist/core/tools/python.js.map +1 -1
- package/dist/core/tools/render-utils.js +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/run-process.d.ts +2 -0
- package/dist/core/tools/run-process.d.ts.map +1 -1
- package/dist/core/tools/run-process.js +7 -3
- package/dist/core/tools/run-process.js.map +1 -1
- package/dist/core/tools/search-command-guard.d.ts +8 -0
- package/dist/core/tools/search-command-guard.d.ts.map +1 -1
- package/dist/core/tools/search-command-guard.js +54 -0
- package/dist/core/tools/search-command-guard.js.map +1 -1
- package/dist/core/tools/secret-store.d.ts +8 -18
- package/dist/core/tools/secret-store.d.ts.map +1 -1
- package/dist/core/tools/secret-store.js +83 -348
- package/dist/core/tools/secret-store.js.map +1 -1
- package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
- package/dist/core/tools/shell-contract-router.js +9 -4
- package/dist/core/tools/shell-contract-router.js.map +1 -1
- package/dist/core/tools/shell-session.d.ts.map +1 -1
- package/dist/core/tools/shell-session.js +6 -4
- package/dist/core/tools/shell-session.js.map +1 -1
- package/dist/core/tools/tool-definition-factory.d.ts +32 -0
- package/dist/core/tools/tool-definition-factory.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-factory.js +55 -0
- package/dist/core/tools/tool-definition-factory.js.map +1 -0
- package/dist/core/util/atomic-file.d.ts.map +1 -1
- package/dist/core/util/atomic-file.js +79 -32
- package/dist/core/util/atomic-file.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +24 -18
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.js +1 -1
- package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +35 -14
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-event-controller.js +1 -1
- package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +27 -4
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/secret-menu-controller.d.ts +21 -0
- package/dist/modes/interactive/secret-menu-controller.d.ts.map +1 -0
- package/dist/modes/interactive/secret-menu-controller.js +276 -0
- package/dist/modes/interactive/secret-menu-controller.js.map +1 -0
- package/dist/utils/child-process.js +1 -1
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +2 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +43 -48
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/zip-extractor.d.ts +8 -0
- package/dist/utils/zip-extractor.d.ts.map +1 -0
- package/dist/utils/zip-extractor.js +275 -0
- package/dist/utils/zip-extractor.js.map +1 -0
- package/docs/harness-architecture.md +34 -22
- package/docs/index.md +1 -1
- package/docs/resources.md +1 -1
- package/docs/settings.md +39 -103
- package/docs/usage.md +7 -5
- package/docs/worker-profiles.md +9 -7
- 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 +7 -5
- package/dist/core/secrets/secret-vault-format.d.ts +0 -112
- package/dist/core/secrets/secret-vault-format.d.ts.map +0 -1
- package/dist/core/secrets/secret-vault-format.js +0 -396
- package/dist/core/secrets/secret-vault-format.js.map +0 -1
- package/dist/core/secrets/secret-vault.d.ts +0 -72
- package/dist/core/secrets/secret-vault.d.ts.map +0 -1
- package/dist/core/secrets/secret-vault.js +0 -663
- package/dist/core/secrets/secret-vault.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/core/tools/python.ts"],"names":[],"mappings":"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","sourcesContent":["import { stat } from \"node:fs/promises\";\nimport { posix, win32 } from \"node:path\";\nimport type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport type { TruncationResult } from \"@caupulican/pi-agent-core/node\";\nimport { Text } from \"@caupulican/pi-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { spawnProcess, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { ensurePythonRuntime, type PythonRuntimeOutcome } from \"../python-runtime.ts\";\nimport { withExclusiveMutationBarrier } from \"./file-mutation-queue.ts\";\nimport { OutputAccumulator } from \"./output-accumulator.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nexport const DEFAULT_PYTHON_TIMEOUT_SECONDS = 30;\nexport const MAX_PYTHON_TIMEOUT_SECONDS = 300;\nexport const MAX_PYTHON_OUTPUT_BYTES = 200_000;\nconst MIN_PYTHON_OUTPUT_BYTES = 1_000;\nconst PYTHON_KILL_GRACE_MS = 2_000;\n\nconst pythonSchema = Type.Object(\n\t{\n\t\tcode: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tdescription: \"Python code to execute on stdin. Provide exactly one of code or scriptPath.\",\n\t\t\t\tmaxLength: 200_000,\n\t\t\t}),\n\t\t),\n\t\tscriptPath: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tdescription: \"Python script path. Relative paths resolve from cwd; one leading @ is ignored.\",\n\t\t\t\tmaxLength: 32_768,\n\t\t\t}),\n\t\t),\n\t\targs: Type.Optional(\n\t\t\tType.Array(Type.String({ maxLength: 16_384 }), {\n\t\t\t\tdescription: \"Arguments passed directly to Python after '-' or scriptPath; no shell interpolation.\",\n\t\t\t\tmaxItems: 256,\n\t\t\t}),\n\t\t),\n\t\tcwd: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tdescription: \"Working directory. Defaults to Pi's cwd; relative paths resolve from Pi's cwd.\",\n\t\t\t\tmaxLength: 32_768,\n\t\t\t}),\n\t\t),\n\t\ttimeoutSeconds: Type.Optional(\n\t\t\tType.Number({\n\t\t\t\tdescription: `Wall-clock timeout. Defaults to ${DEFAULT_PYTHON_TIMEOUT_SECONDS} seconds and is capped at ${MAX_PYTHON_TIMEOUT_SECONDS}.`,\n\t\t\t}),\n\t\t),\n\t\tmaxOutputBytes: Type.Optional(\n\t\t\tType.Number({\n\t\t\t\tdescription: `Maximum returned bytes per stream before full output spills to a work artifact. Maximum ${MAX_PYTHON_OUTPUT_BYTES}.`,\n\t\t\t}),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type PythonToolInput = Static<typeof pythonSchema>;\n\nexport interface PythonToolDetails {\n\tmode: \"code\" | \"script\";\n\tcwd: string;\n\tuvPath: string;\n\tpythonPath: string;\n\tscriptPath?: string;\n\targs: string[];\n\texitCode: number | null;\n\tsignal: string | null;\n\ttimedOut: boolean;\n\tstdoutTruncation?: TruncationResult;\n\tstderrTruncation?: TruncationResult;\n\tstdoutOutputPath?: string;\n\tstderrOutputPath?: string;\n\tstdoutOutputError?: string;\n\tstderrOutputError?: string;\n}\n\nexport interface PythonExecutionRequest {\n\tpython: string;\n\targs: string[];\n\tcwd: string;\n\tstdin?: string;\n\ttimeoutMs: number;\n\tsignal?: AbortSignal;\n\tenv: NodeJS.ProcessEnv;\n\tonStdout: (chunk: Buffer) => void;\n\tonStderr: (chunk: Buffer) => void;\n}\n\nexport interface PythonExecutionResult {\n\texitCode: number | null;\n\treason: \"exited\" | \"aborted\" | \"timeout\";\n\tsignal: string | null;\n}\n\nexport interface PythonOperations {\n\texec(request: PythonExecutionRequest): Promise<PythonExecutionResult>;\n}\n\nexport interface PythonToolOptions {\n\tresolveRuntime?: () => Promise<PythonRuntimeOutcome>;\n\toperations?: PythonOperations;\n\t/** Additional process environment resolved from the final execution cwd. */\n\tenvironment?: (cwd: string) => NodeJS.ProcessEnv;\n\t/** Override only for tests or embedded runtimes; production uses the process work directory. */\n\toutputDirectory?: string;\n}\n\nfunction stripAtPrefix(value: string): string {\n\treturn value.startsWith(\"@\") ? value.slice(1) : value;\n}\n\nexport function resolvePythonToolPath(\n\tbase: string,\n\trequested: string,\n\tplatform: NodeJS.Platform = process.platform,\n): string {\n\treturn (platform === \"win32\" ? win32 : posix).resolve(base, stripAtPrefix(requested));\n}\n\nasync function resolveWorkingDirectory(baseCwd: string, requested?: string): Promise<string> {\n\tconst cwd = requested ? resolvePythonToolPath(baseCwd, requested) : baseCwd;\n\tconst entry = await stat(cwd).catch(() => {\n\t\tthrow new Error(`cwd does not exist: ${cwd}`);\n\t});\n\tif (!entry.isDirectory()) throw new Error(`cwd is not a directory: ${cwd}`);\n\treturn cwd;\n}\n\nasync function resolveScriptPath(cwd: string, requested: string): Promise<string> {\n\tconst scriptPath = resolvePythonToolPath(cwd, requested);\n\tconst entry = await stat(scriptPath).catch(() => {\n\t\tthrow new Error(`scriptPath does not exist: ${scriptPath}`);\n\t});\n\tif (!entry.isFile()) throw new Error(`scriptPath is not a file: ${scriptPath}`);\n\treturn scriptPath;\n}\n\nfunction clampInteger(value: number | undefined, fallback: number, minimum: number, maximum: number): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return fallback;\n\treturn Math.max(minimum, Math.min(maximum, Math.trunc(value)));\n}\n\nfunction createLocalPythonOperations(): PythonOperations {\n\treturn {\n\t\tasync exec(request) {\n\t\t\tif (request.signal?.aborted) throw new Error(\"Python execution aborted before start\");\n\t\t\tconst child = spawnProcess(request.python, request.args, {\n\t\t\t\tcwd: request.cwd,\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\tenv: request.env,\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => request.onStdout(chunk));\n\t\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => request.onStderr(chunk));\n\t\t\tchild.stdin?.end(request.stdin ?? \"\");\n\t\t\tconst terminal = await waitForChildProcessWithTermination(child, {\n\t\t\t\tkillGraceMs: PYTHON_KILL_GRACE_MS,\n\t\t\t\tsignal: request.signal,\n\t\t\t\ttimeoutMs: request.timeoutMs,\n\t\t\t});\n\t\t\treturn { exitCode: terminal.code, reason: terminal.reason, signal: child.signalCode };\n\t\t},\n\t};\n}\n\nfunction renderStreamNotice(label: string, path: string | undefined, error: string | undefined): string | undefined {\n\tif (path) return `[${label} truncated; full output: ${path}]`;\n\tif (error) return `[${label} truncated; full-output artifact failed: ${error}]`;\n\treturn undefined;\n}\n\nexport function createPythonToolDefinition(\n\tbaseCwd: string,\n\toptions: PythonToolOptions = {},\n): ToolDefinition<typeof pythonSchema, PythonToolDetails> {\n\tconst resolveRuntime = options.resolveRuntime ?? (() => ensurePythonRuntime({ silent: true }));\n\tconst operations = options.operations ?? createLocalPythonOperations();\n\treturn {\n\t\tname: \"python\",\n\t\tlabel: \"python\",\n\t\tdescription: `Run a bounded Python snippet or script without a shell. Pi resolves Python through uv, defaults to a ${DEFAULT_PYTHON_TIMEOUT_SECONDS}-second wall-clock timeout (maximum ${MAX_PYTHON_TIMEOUT_SECONDS}), streams bounded stdout/stderr, and spills truncated full output to the process work directory rather than the repository.`,\n\t\tpromptSnippet: \"Run bounded Python snippets or scripts through Pi's uv-managed runtime.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Prefer python for bounded scripts, data shaping, structured transformations, and cross-platform logic when it is clearer than a shell pipeline.\",\n\t\t\t\"Prefer read/edit/write for small exact source edits. For Python file transformations, preserve encoding and newline style, write atomically, and verify the resulting diff.\",\n\t\t\t\"Keep work scoped: avoid recursive home/filesystem scans, pass explicit roots and filters, and request a larger timeout only when the bounded workload justifies it.\",\n\t\t\t\"Do not inspect or print credentials. When secret_store activates a bound profile, use its injected environment only through the credential-consuming program.\",\n\t\t\t\"Do not use python for destructive deletion, publish/push/release, or long-running services without explicit user approval.\",\n\t\t],\n\t\tparameters: pythonSchema,\n\t\tasync execute(_toolCallId, input, signal) {\n\t\t\tconst hasCode = typeof input.code === \"string\";\n\t\t\tconst hasScript = typeof input.scriptPath === \"string\" && input.scriptPath.trim().length > 0;\n\t\t\tif (hasCode === hasScript) throw new Error(\"Provide exactly one of code or scriptPath.\");\n\t\t\tconst cwd = await resolveWorkingDirectory(baseCwd, input.cwd);\n\t\t\tconst scriptPath = hasScript ? await resolveScriptPath(cwd, input.scriptPath as string) : undefined;\n\t\t\tconst runtime = await resolveRuntime();\n\t\t\tif (runtime.status !== \"ready\") throw new Error(runtime.reason);\n\t\t\tconst args = input.args ? [...input.args] : [];\n\t\t\tconst timeoutSeconds = clampInteger(\n\t\t\t\tinput.timeoutSeconds,\n\t\t\t\tDEFAULT_PYTHON_TIMEOUT_SECONDS,\n\t\t\t\t1,\n\t\t\t\tMAX_PYTHON_TIMEOUT_SECONDS,\n\t\t\t);\n\t\t\tconst maxOutputBytes = clampInteger(\n\t\t\t\tinput.maxOutputBytes,\n\t\t\t\t50 * 1024,\n\t\t\t\tMIN_PYTHON_OUTPUT_BYTES,\n\t\t\t\tMAX_PYTHON_OUTPUT_BYTES,\n\t\t\t);\n\t\t\tconst accumulatorOptions = {\n\t\t\t\tmaxBytes: maxOutputBytes,\n\t\t\t\t...(options.outputDirectory ? { tempDirectory: options.outputDirectory } : {}),\n\t\t\t};\n\t\t\tconst stdout = new OutputAccumulator({ ...accumulatorOptions, tempFilePrefix: \"pi-python-stdout\" });\n\t\t\tconst stderr = new OutputAccumulator({ ...accumulatorOptions, tempFilePrefix: \"pi-python-stderr\" });\n\t\t\tconst finishStreams = () => {\n\t\t\t\tstdout.finish();\n\t\t\t\tstderr.finish();\n\t\t\t\treturn {\n\t\t\t\t\tstdout: stdout.snapshot({ persistIfTruncated: true }),\n\t\t\t\t\tstderr: stderr.snapshot({ persistIfTruncated: true }),\n\t\t\t\t};\n\t\t\t};\n\t\t\tlet execution: PythonExecutionResult;\n\t\t\ttry {\n\t\t\t\texecution = await withExclusiveMutationBarrier(() =>\n\t\t\t\t\toperations.exec({\n\t\t\t\t\t\tpython: runtime.pythonPath,\n\t\t\t\t\t\targs: scriptPath ? [\"-B\", scriptPath, ...args] : [\"-B\", \"-\", ...args],\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tstdin: hasCode ? input.code : undefined,\n\t\t\t\t\t\ttimeoutMs: timeoutSeconds * 1000,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tenv: {\n\t\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t\t...options.environment?.(cwd),\n\t\t\t\t\t\t\tPI_PYTHON_TOOL: \"1\",\n\t\t\t\t\t\t\tPYTHONDONTWRITEBYTECODE: \"1\",\n\t\t\t\t\t\t\tPYTHONIOENCODING: \"utf-8\",\n\t\t\t\t\t\t\tPYTHONUNBUFFERED: \"1\",\n\t\t\t\t\t\t\tPYTHONUTF8: \"1\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonStdout: (chunk) => stdout.append(chunk),\n\t\t\t\t\t\tonStderr: (chunk) => stderr.append(chunk),\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst snapshots = finishStreams();\n\t\t\t\tconst sections: string[] = [];\n\t\t\t\tif (snapshots.stdout.content) sections.push(snapshots.stdout.content.trimEnd());\n\t\t\t\tif (snapshots.stderr.content) sections.push(`[stderr]\\n${snapshots.stderr.content.trimEnd()}`);\n\t\t\t\tconst stdoutNotice = renderStreamNotice(\n\t\t\t\t\t\"stdout\",\n\t\t\t\t\tsnapshots.stdout.fullOutputPath,\n\t\t\t\t\tsnapshots.stdout.fullOutputError,\n\t\t\t\t);\n\t\t\t\tconst stderrNotice = renderStreamNotice(\n\t\t\t\t\t\"stderr\",\n\t\t\t\t\tsnapshots.stderr.fullOutputPath,\n\t\t\t\t\tsnapshots.stderr.fullOutputError,\n\t\t\t\t);\n\t\t\t\tif (stdoutNotice) sections.push(stdoutNotice);\n\t\t\t\tif (stderrNotice) sections.push(stderrNotice);\n\t\t\t\tconst status = `[python exitCode=${execution.exitCode ?? \"null\"}${execution.signal ? `; signal=${execution.signal}` : \"\"}]`;\n\t\t\t\tsections.push(status);\n\t\t\t\tconst text = sections.join(\"\\n\\n\");\n\t\t\t\tif (execution.reason === \"timeout\")\n\t\t\t\t\tthrow new Error(`${text}\\n\\nPython timed out after ${timeoutSeconds} seconds`);\n\t\t\t\tif (execution.reason === \"aborted\") throw new Error(`${text}\\n\\nPython execution aborted`);\n\t\t\t\tif (execution.exitCode !== 0) {\n\t\t\t\t\tconst termination = execution.signal\n\t\t\t\t\t\t? `signal ${execution.signal}`\n\t\t\t\t\t\t: `code ${execution.exitCode ?? \"unknown\"}`;\n\t\t\t\t\tthrow new Error(`${text}\\n\\nPython exited with ${termination}`);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tmode: scriptPath ? \"script\" : \"code\",\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tuvPath: runtime.uvPath,\n\t\t\t\t\t\tpythonPath: runtime.pythonPath,\n\t\t\t\t\t\tscriptPath,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\texitCode: execution.exitCode,\n\t\t\t\t\t\tsignal: execution.signal,\n\t\t\t\t\t\ttimedOut: false,\n\t\t\t\t\t\t...(snapshots.stdout.truncation.truncated ? { stdoutTruncation: snapshots.stdout.truncation } : {}),\n\t\t\t\t\t\t...(snapshots.stderr.truncation.truncated ? { stderrTruncation: snapshots.stderr.truncation } : {}),\n\t\t\t\t\t\tstdoutOutputPath: snapshots.stdout.fullOutputPath,\n\t\t\t\t\t\tstderrOutputPath: snapshots.stderr.fullOutputPath,\n\t\t\t\t\t\tstdoutOutputError: snapshots.stdout.fullOutputError,\n\t\t\t\t\t\tstderrOutputError: snapshots.stderr.fullOutputError,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tawait Promise.all([stdout.closeTempFile(), stderr.closeTempFile()]);\n\t\t\t}\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\tconst mode = args.scriptPath ? args.scriptPath : \"code\";\n\t\t\treturn new Text(`${theme.fg(\"toolTitle\", theme.bold(\"python\"))} ${theme.fg(\"muted\", mode)}`, 0, 0);\n\t\t},\n\t\trenderResult(result, { expanded, isPartial }, theme) {\n\t\t\tif (isPartial) return new Text(theme.fg(\"warning\", \"python running\"), 0, 0);\n\t\t\tconst details = result.details as PythonToolDetails | undefined;\n\t\t\tif (!details) return new Text(theme.fg(\"dim\", \"python done\"), 0, 0);\n\t\t\tconst status =\n\t\t\t\tdetails.exitCode === 0 && !details.timedOut ? \"python ok\" : `python exit ${details.exitCode ?? \"unknown\"}`;\n\t\t\tlet text = theme.fg(details.exitCode === 0 ? \"success\" : \"warning\", status);\n\t\t\tif (expanded) {\n\t\t\t\tconst content = result.content[0];\n\t\t\t\tif (content?.type === \"text\") {\n\t\t\t\t\tconst lines = content.text.split(\"\\n\").slice(-20);\n\t\t\t\t\tfor (const line of lines) text += `\\n${theme.fg(\"dim\", line)}`;\n\t\t\t\t}\n\t\t\t\tfor (const outputPath of [details.stdoutOutputPath, details.stderrOutputPath]) {\n\t\t\t\t\tif (outputPath) text += `\\n${theme.fg(\"muted\", `full output: ${outputPath}`)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn new Text(text, 0, 0);\n\t\t},\n\t};\n}\n\nexport function createPythonTool(baseCwd: string, options?: PythonToolOptions): AgentTool<typeof pythonSchema> {\n\treturn wrapToolDefinition(createPythonToolDefinition(baseCwd, options));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/core/tools/python.ts"],"names":[],"mappings":"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","sourcesContent":["import { stat } from \"node:fs/promises\";\nimport { posix, win32 } from \"node:path\";\nimport type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport type { TruncationResult } from \"@caupulican/pi-agent-core/node\";\nimport { Text } from \"@caupulican/pi-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { spawnProcess, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { ensurePythonRuntime, type PythonRuntimeOutcome } from \"../python-runtime.ts\";\nimport { withExclusiveMutationBarrier } from \"./file-mutation-queue.ts\";\nimport { OutputAccumulator } from \"./output-accumulator.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nexport const DEFAULT_PYTHON_TIMEOUT_SECONDS = 30;\nexport const MAX_PYTHON_TIMEOUT_SECONDS = 300;\nexport const MAX_PYTHON_OUTPUT_BYTES = 200_000;\nconst MIN_PYTHON_OUTPUT_BYTES = 1_000;\nconst PYTHON_KILL_GRACE_MS = 2_000;\n\nconst pythonSchema = Type.Object(\n\t{\n\t\tcode: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tdescription: \"Python code to execute on stdin. Provide exactly one of code or scriptPath.\",\n\t\t\t\tmaxLength: 200_000,\n\t\t\t}),\n\t\t),\n\t\tscriptPath: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tdescription: \"Python script path. Relative paths resolve from cwd; one leading @ is ignored.\",\n\t\t\t\tmaxLength: 32_768,\n\t\t\t}),\n\t\t),\n\t\targs: Type.Optional(\n\t\t\tType.Array(Type.String({ maxLength: 16_384 }), {\n\t\t\t\tdescription: \"Arguments passed directly to Python after '-' or scriptPath; no shell interpolation.\",\n\t\t\t\tmaxItems: 256,\n\t\t\t}),\n\t\t),\n\t\tcwd: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tdescription: \"Working directory. Defaults to Pi's cwd; relative paths resolve from Pi's cwd.\",\n\t\t\t\tmaxLength: 32_768,\n\t\t\t}),\n\t\t),\n\t\ttimeoutSeconds: Type.Optional(\n\t\t\tType.Number({\n\t\t\t\tdescription: `Wall-clock timeout. Defaults to ${DEFAULT_PYTHON_TIMEOUT_SECONDS} seconds and is capped at ${MAX_PYTHON_TIMEOUT_SECONDS}.`,\n\t\t\t}),\n\t\t),\n\t\tmaxOutputBytes: Type.Optional(\n\t\t\tType.Number({\n\t\t\t\tdescription: `Maximum returned bytes per stream before full output spills to a work artifact. Maximum ${MAX_PYTHON_OUTPUT_BYTES}.`,\n\t\t\t}),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type PythonToolInput = Static<typeof pythonSchema>;\n\nexport interface PythonToolDetails {\n\tmode: \"code\" | \"script\";\n\tcwd: string;\n\tuvPath: string;\n\tpythonPath: string;\n\tscriptPath?: string;\n\targs: string[];\n\texitCode: number | null;\n\tsignal: string | null;\n\ttimedOut: boolean;\n\tstdoutTruncation?: TruncationResult;\n\tstderrTruncation?: TruncationResult;\n\tstdoutOutputPath?: string;\n\tstderrOutputPath?: string;\n\tstdoutOutputError?: string;\n\tstderrOutputError?: string;\n}\n\nexport interface PythonExecutionRequest {\n\tpython: string;\n\targs: string[];\n\tcwd: string;\n\tstdin?: string;\n\ttimeoutMs: number;\n\tsignal?: AbortSignal;\n\tenv: NodeJS.ProcessEnv;\n\tonStdout: (chunk: Buffer) => void;\n\tonStderr: (chunk: Buffer) => void;\n}\n\nexport interface PythonExecutionResult {\n\texitCode: number | null;\n\treason: \"exited\" | \"aborted\" | \"timeout\";\n\tsignal: string | null;\n}\n\nexport interface PythonOperations {\n\texec(request: PythonExecutionRequest): Promise<PythonExecutionResult>;\n}\n\nexport interface PythonToolOptions {\n\tresolveRuntime?: () => Promise<PythonRuntimeOutcome>;\n\toperations?: PythonOperations;\n\t/** Additional process environment resolved from the final execution cwd. */\n\tenvironment?: (cwd: string) => NodeJS.ProcessEnv;\n\t/** Owner-only variables that must never reach model-controlled Python. */\n\tomitEnvironmentVariables?: readonly string[];\n\t/** Override only for tests or embedded runtimes; production uses the process work directory. */\n\toutputDirectory?: string;\n}\n\nfunction stripAtPrefix(value: string): string {\n\treturn value.startsWith(\"@\") ? value.slice(1) : value;\n}\n\nexport function resolvePythonToolPath(\n\tbase: string,\n\trequested: string,\n\tplatform: NodeJS.Platform = process.platform,\n): string {\n\treturn (platform === \"win32\" ? win32 : posix).resolve(base, stripAtPrefix(requested));\n}\n\nasync function resolveWorkingDirectory(baseCwd: string, requested?: string): Promise<string> {\n\tconst cwd = requested ? resolvePythonToolPath(baseCwd, requested) : baseCwd;\n\tconst entry = await stat(cwd).catch(() => {\n\t\tthrow new Error(`cwd does not exist: ${cwd}`);\n\t});\n\tif (!entry.isDirectory()) throw new Error(`cwd is not a directory: ${cwd}`);\n\treturn cwd;\n}\n\nasync function resolveScriptPath(cwd: string, requested: string): Promise<string> {\n\tconst scriptPath = resolvePythonToolPath(cwd, requested);\n\tconst entry = await stat(scriptPath).catch(() => {\n\t\tthrow new Error(`scriptPath does not exist: ${scriptPath}`);\n\t});\n\tif (!entry.isFile()) throw new Error(`scriptPath is not a file: ${scriptPath}`);\n\treturn scriptPath;\n}\n\nfunction clampInteger(value: number | undefined, fallback: number, minimum: number, maximum: number): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return fallback;\n\treturn Math.max(minimum, Math.min(maximum, Math.trunc(value)));\n}\n\nfunction createLocalPythonOperations(): PythonOperations {\n\treturn {\n\t\tasync exec(request) {\n\t\t\tif (request.signal?.aborted) throw new Error(\"Python execution aborted before start\");\n\t\t\tconst child = spawnProcess(request.python, request.args, {\n\t\t\t\tcwd: request.cwd,\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\tenv: request.env,\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => request.onStdout(chunk));\n\t\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => request.onStderr(chunk));\n\t\t\tchild.stdin?.end(request.stdin ?? \"\");\n\t\t\tconst terminal = await waitForChildProcessWithTermination(child, {\n\t\t\t\tkillGraceMs: PYTHON_KILL_GRACE_MS,\n\t\t\t\tsignal: request.signal,\n\t\t\t\ttimeoutMs: request.timeoutMs,\n\t\t\t});\n\t\t\treturn { exitCode: terminal.code, reason: terminal.reason, signal: child.signalCode };\n\t\t},\n\t};\n}\n\nfunction renderStreamNotice(label: string, path: string | undefined, error: string | undefined): string | undefined {\n\tif (path) return `[${label} truncated; full output: ${path}]`;\n\tif (error) return `[${label} truncated; full-output artifact failed: ${error}]`;\n\treturn undefined;\n}\n\nexport function createPythonToolDefinition(\n\tbaseCwd: string,\n\toptions: PythonToolOptions = {},\n): ToolDefinition<typeof pythonSchema, PythonToolDetails> {\n\tconst resolveRuntime = options.resolveRuntime ?? (() => ensurePythonRuntime({ silent: true }));\n\tconst operations = options.operations ?? createLocalPythonOperations();\n\treturn {\n\t\tname: \"python\",\n\t\tlabel: \"python\",\n\t\tdescription: `Run a bounded Python snippet or script without a shell. Pi resolves Python through uv, defaults to a ${DEFAULT_PYTHON_TIMEOUT_SECONDS}-second wall-clock timeout (maximum ${MAX_PYTHON_TIMEOUT_SECONDS}), streams bounded stdout/stderr, and spills truncated full output to the process work directory rather than the repository.`,\n\t\tpromptSnippet: \"Run bounded Python snippets or scripts through Pi's uv-managed runtime.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Prefer python for bounded scripts, data shaping, structured transformations, and cross-platform logic when it is clearer than a shell pipeline.\",\n\t\t\t\"Prefer read/edit/write for small exact source edits. For Python file transformations, preserve encoding and newline style, write atomically, and verify the resulting diff.\",\n\t\t\t\"Keep work scoped: avoid recursive home/filesystem scans, pass explicit roots and filters, and request a larger timeout only when the bounded workload justifies it.\",\n\t\t\t\"Do not inspect or print credentials. When secret_store activates a bound profile, use its injected environment only through the credential-consuming program.\",\n\t\t\t\"Do not use python for destructive deletion, publish/push/release, or long-running services without explicit user approval.\",\n\t\t],\n\t\tparameters: pythonSchema,\n\t\tasync execute(_toolCallId, input, signal) {\n\t\t\tconst hasCode = typeof input.code === \"string\";\n\t\t\tconst hasScript = typeof input.scriptPath === \"string\" && input.scriptPath.trim().length > 0;\n\t\t\tif (hasCode === hasScript) throw new Error(\"Provide exactly one of code or scriptPath.\");\n\t\t\tconst cwd = await resolveWorkingDirectory(baseCwd, input.cwd);\n\t\t\tconst scriptPath = hasScript ? await resolveScriptPath(cwd, input.scriptPath as string) : undefined;\n\t\t\tconst runtime = await resolveRuntime();\n\t\t\tif (runtime.status !== \"ready\") throw new Error(runtime.reason);\n\t\t\tconst args = input.args ? [...input.args] : [];\n\t\t\tconst timeoutSeconds = clampInteger(\n\t\t\t\tinput.timeoutSeconds,\n\t\t\t\tDEFAULT_PYTHON_TIMEOUT_SECONDS,\n\t\t\t\t1,\n\t\t\t\tMAX_PYTHON_TIMEOUT_SECONDS,\n\t\t\t);\n\t\t\tconst maxOutputBytes = clampInteger(\n\t\t\t\tinput.maxOutputBytes,\n\t\t\t\t50 * 1024,\n\t\t\t\tMIN_PYTHON_OUTPUT_BYTES,\n\t\t\t\tMAX_PYTHON_OUTPUT_BYTES,\n\t\t\t);\n\t\t\tconst accumulatorOptions = {\n\t\t\t\tmaxBytes: maxOutputBytes,\n\t\t\t\t...(options.outputDirectory ? { tempDirectory: options.outputDirectory } : {}),\n\t\t\t};\n\t\t\tconst stdout = new OutputAccumulator({ ...accumulatorOptions, tempFilePrefix: \"pi-python-stdout\" });\n\t\t\tconst stderr = new OutputAccumulator({ ...accumulatorOptions, tempFilePrefix: \"pi-python-stderr\" });\n\t\t\tconst finishStreams = () => {\n\t\t\t\tstdout.finish();\n\t\t\t\tstderr.finish();\n\t\t\t\treturn {\n\t\t\t\t\tstdout: stdout.snapshot({ persistIfTruncated: true }),\n\t\t\t\t\tstderr: stderr.snapshot({ persistIfTruncated: true }),\n\t\t\t\t};\n\t\t\t};\n\t\t\tlet execution: PythonExecutionResult;\n\t\t\ttry {\n\t\t\t\texecution = await withExclusiveMutationBarrier(() => {\n\t\t\t\t\tconst environment: NodeJS.ProcessEnv = {\n\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t...options.environment?.(cwd),\n\t\t\t\t\t\tPI_PYTHON_TOOL: \"1\",\n\t\t\t\t\t\tPYTHONDONTWRITEBYTECODE: \"1\",\n\t\t\t\t\t\tPYTHONIOENCODING: \"utf-8\",\n\t\t\t\t\t\tPYTHONUNBUFFERED: \"1\",\n\t\t\t\t\t\tPYTHONUTF8: \"1\",\n\t\t\t\t\t};\n\t\t\t\t\tfor (const name of options.omitEnvironmentVariables ?? []) delete environment[name];\n\t\t\t\t\treturn operations.exec({\n\t\t\t\t\t\tpython: runtime.pythonPath,\n\t\t\t\t\t\targs: scriptPath ? [\"-B\", scriptPath, ...args] : [\"-B\", \"-\", ...args],\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tstdin: hasCode ? input.code : undefined,\n\t\t\t\t\t\ttimeoutMs: timeoutSeconds * 1000,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tenv: environment,\n\t\t\t\t\t\tonStdout: (chunk) => stdout.append(chunk),\n\t\t\t\t\t\tonStderr: (chunk) => stderr.append(chunk),\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tconst snapshots = finishStreams();\n\t\t\t\tconst sections: string[] = [];\n\t\t\t\tif (snapshots.stdout.content) sections.push(snapshots.stdout.content.trimEnd());\n\t\t\t\tif (snapshots.stderr.content) sections.push(`[stderr]\\n${snapshots.stderr.content.trimEnd()}`);\n\t\t\t\tconst stdoutNotice = renderStreamNotice(\n\t\t\t\t\t\"stdout\",\n\t\t\t\t\tsnapshots.stdout.fullOutputPath,\n\t\t\t\t\tsnapshots.stdout.fullOutputError,\n\t\t\t\t);\n\t\t\t\tconst stderrNotice = renderStreamNotice(\n\t\t\t\t\t\"stderr\",\n\t\t\t\t\tsnapshots.stderr.fullOutputPath,\n\t\t\t\t\tsnapshots.stderr.fullOutputError,\n\t\t\t\t);\n\t\t\t\tif (stdoutNotice) sections.push(stdoutNotice);\n\t\t\t\tif (stderrNotice) sections.push(stderrNotice);\n\t\t\t\tconst status = `[python exitCode=${execution.exitCode ?? \"null\"}${execution.signal ? `; signal=${execution.signal}` : \"\"}]`;\n\t\t\t\tsections.push(status);\n\t\t\t\tconst text = sections.join(\"\\n\\n\");\n\t\t\t\tif (execution.reason === \"timeout\")\n\t\t\t\t\tthrow new Error(`${text}\\n\\nPython timed out after ${timeoutSeconds} seconds`);\n\t\t\t\tif (execution.reason === \"aborted\") throw new Error(`${text}\\n\\nPython execution aborted`);\n\t\t\t\tif (execution.exitCode !== 0) {\n\t\t\t\t\tconst termination = execution.signal\n\t\t\t\t\t\t? `signal ${execution.signal}`\n\t\t\t\t\t\t: `code ${execution.exitCode ?? \"unknown\"}`;\n\t\t\t\t\tthrow new Error(`${text}\\n\\nPython exited with ${termination}`);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tmode: scriptPath ? \"script\" : \"code\",\n\t\t\t\t\t\tcwd,\n\t\t\t\t\t\tuvPath: runtime.uvPath,\n\t\t\t\t\t\tpythonPath: runtime.pythonPath,\n\t\t\t\t\t\tscriptPath,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\texitCode: execution.exitCode,\n\t\t\t\t\t\tsignal: execution.signal,\n\t\t\t\t\t\ttimedOut: false,\n\t\t\t\t\t\t...(snapshots.stdout.truncation.truncated ? { stdoutTruncation: snapshots.stdout.truncation } : {}),\n\t\t\t\t\t\t...(snapshots.stderr.truncation.truncated ? { stderrTruncation: snapshots.stderr.truncation } : {}),\n\t\t\t\t\t\tstdoutOutputPath: snapshots.stdout.fullOutputPath,\n\t\t\t\t\t\tstderrOutputPath: snapshots.stderr.fullOutputPath,\n\t\t\t\t\t\tstdoutOutputError: snapshots.stdout.fullOutputError,\n\t\t\t\t\t\tstderrOutputError: snapshots.stderr.fullOutputError,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tawait Promise.all([stdout.closeTempFile(), stderr.closeTempFile()]);\n\t\t\t}\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\tconst mode = args.scriptPath ? args.scriptPath : \"code\";\n\t\t\treturn new Text(`${theme.fg(\"toolTitle\", theme.bold(\"python\"))} ${theme.fg(\"muted\", mode)}`, 0, 0);\n\t\t},\n\t\trenderResult(result, { expanded, isPartial }, theme) {\n\t\t\tif (isPartial) return new Text(theme.fg(\"warning\", \"python running\"), 0, 0);\n\t\t\tconst details = result.details as PythonToolDetails | undefined;\n\t\t\tif (!details) return new Text(theme.fg(\"dim\", \"python done\"), 0, 0);\n\t\t\tconst status =\n\t\t\t\tdetails.exitCode === 0 && !details.timedOut ? \"python ok\" : `python exit ${details.exitCode ?? \"unknown\"}`;\n\t\t\tlet text = theme.fg(details.exitCode === 0 ? \"success\" : \"warning\", status);\n\t\t\tif (expanded) {\n\t\t\t\tconst content = result.content[0];\n\t\t\t\tif (content?.type === \"text\") {\n\t\t\t\t\tconst lines = content.text.split(\"\\n\").slice(-20);\n\t\t\t\t\tfor (const line of lines) text += `\\n${theme.fg(\"dim\", line)}`;\n\t\t\t\t}\n\t\t\t\tfor (const outputPath of [details.stdoutOutputPath, details.stderrOutputPath]) {\n\t\t\t\t\tif (outputPath) text += `\\n${theme.fg(\"muted\", `full output: ${outputPath}`)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn new Text(text, 0, 0);\n\t\t},\n\t};\n}\n\nexport function createPythonTool(baseCwd: string, options?: PythonToolOptions): AgentTool<typeof pythonSchema> {\n\treturn wrapToolDefinition(createPythonToolDefinition(baseCwd, options));\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as os from "node:os";
|
|
2
2
|
import { relative, sep } from "node:path";
|
|
3
3
|
import { pathToFileURL } from "node:url";
|
|
4
|
-
import { sanitizeBinaryOutput } from "@caupulican/pi-agent-core";
|
|
4
|
+
import { sanitizeBinaryOutput } from "@caupulican/pi-agent-core/shell-output";
|
|
5
5
|
import { getCapabilities, getImageDimensions, hyperlink, imageFallback, Text } from "@caupulican/pi-tui";
|
|
6
6
|
import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
|
|
7
7
|
import { stripAnsi } from "../../utils/ansi.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from \"node:os\";\nimport { relative, sep } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { sanitizeBinaryOutput } from \"@caupulican/pi-agent-core\";\nimport type { ImageContent, TextContent } from \"@caupulican/pi-ai\";\nimport { getCapabilities, getImageDimensions, hyperlink, imageFallback, Text } from \"@caupulican/pi-tui\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport type { ToolRenderResultOptions } from \"../extensions/types.ts\";\n\nfunction toDisplaySeparators(path: string): string {\n\treturn path.split(sep).join(\"/\");\n}\n\nfunction looksLikeWindowsAbsolutePath(path: string): boolean {\n\treturn /^[a-zA-Z]:[\\\\/]/.test(path);\n}\n\nfunction addCandidate(candidates: string[], value: string | undefined): void {\n\tif (!value || candidates.includes(value)) return;\n\tcandidates.push(value);\n}\n\nexport function shortenPath(path: unknown, cwd?: string): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst candidates: string[] = [];\n\taddCandidate(candidates, toDisplaySeparators(path));\n\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\taddCandidate(candidates, `~${toDisplaySeparators(path.slice(home.length))}`);\n\t}\n\n\tif (cwd && (process.platform === \"win32\" || !looksLikeWindowsAbsolutePath(path))) {\n\t\ttry {\n\t\t\tconst absolutePath = resolvePath(path, cwd);\n\t\t\tconst resolvedCwd = resolvePath(cwd);\n\t\t\tconst relativePath = relative(resolvedCwd, absolutePath) || \".\";\n\t\t\taddCandidate(candidates, toDisplaySeparators(relativePath));\n\t\t} catch {\n\t\t\t// Keep the raw/home-shortened candidates when a path cannot be resolved for display.\n\t\t}\n\t}\n\n\treturn candidates.reduce((shortest, candidate) => (candidate.length < shortest.length ? candidate : shortest));\n}\n\nexport function linkPath(styledText: string, rawPath: string, cwd: string): string {\n\tif (!getCapabilities().hyperlinks) return styledText;\n\tconst absolutePath = resolvePath(rawPath, cwd);\n\treturn hyperlink(styledText, pathToFileURL(absolutePath).href);\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport function getTextOutput(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> } | undefined,\n\tshowImages: boolean,\n): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function formatCollapsibleToolResult<TDetails>(args: {\n\tresult: {\n\t\tcontent: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;\n\t\tdetails?: TDetails;\n\t};\n\toptions: ToolRenderResultOptions;\n\ttheme: Theme;\n\tshowImages: boolean;\n\tcollapsedLineLimit: number;\n\twarnings: (details: TDetails | undefined) => string[];\n}): string {\n\tconst output = getTextOutput(args.result, args.showImages).trim();\n\tlet text = \"\";\n\tif (output) {\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst maxLines = args.options.expanded ? lines.length : args.collapsedLineLimit;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n${displayLines.map((line) => args.theme.fg(\"toolOutput\", line)).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `${args.theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t}\n\t}\n\n\tconst warnings = args.warnings(args.result.details);\n\tif (warnings.length > 0) text += `\\n${args.theme.fg(\"warning\", `[Truncated: ${warnings.join(\", \")}]`)}`;\n\treturn text;\n}\n\nexport function toolTextResult<TDetails extends object>(formatted: {\n\ttext: string;\n\tdetails: TDetails;\n}): {\n\tcontent: [{ type: \"text\"; text: string }];\n\tdetails: TDetails | undefined;\n} {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: formatted.text }],\n\t\tdetails: Object.keys(formatted.details).length > 0 ? formatted.details : undefined,\n\t};\n}\n\nexport function renderTextComponent(lastComponent: unknown, content: string): Text {\n\tconst text = lastComponent instanceof Text ? lastComponent : new Text(\"\", 0, 0);\n\ttext.setText(content);\n\treturn text;\n}\n\nexport function invalidArgText(theme: Theme): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n\nexport function renderToolPath(\n\trawPath: string | null,\n\ttheme: Theme,\n\tcwd: string,\n\toptions?: { emptyFallback?: string },\n): string {\n\tif (rawPath === null) return invalidArgText(theme);\n\tconst value = rawPath || options?.emptyFallback;\n\tif (!value) return theme.fg(\"toolOutput\", \"...\");\n\treturn linkPath(theme.fg(\"accent\", shortenPath(value, cwd)), value, cwd);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from \"node:os\";\nimport { relative, sep } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { sanitizeBinaryOutput } from \"@caupulican/pi-agent-core/shell-output\";\nimport type { ImageContent, TextContent } from \"@caupulican/pi-ai\";\nimport { getCapabilities, getImageDimensions, hyperlink, imageFallback, Text } from \"@caupulican/pi-tui\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport type { ToolRenderResultOptions } from \"../extensions/types.ts\";\n\nfunction toDisplaySeparators(path: string): string {\n\treturn path.split(sep).join(\"/\");\n}\n\nfunction looksLikeWindowsAbsolutePath(path: string): boolean {\n\treturn /^[a-zA-Z]:[\\\\/]/.test(path);\n}\n\nfunction addCandidate(candidates: string[], value: string | undefined): void {\n\tif (!value || candidates.includes(value)) return;\n\tcandidates.push(value);\n}\n\nexport function shortenPath(path: unknown, cwd?: string): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst candidates: string[] = [];\n\taddCandidate(candidates, toDisplaySeparators(path));\n\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\taddCandidate(candidates, `~${toDisplaySeparators(path.slice(home.length))}`);\n\t}\n\n\tif (cwd && (process.platform === \"win32\" || !looksLikeWindowsAbsolutePath(path))) {\n\t\ttry {\n\t\t\tconst absolutePath = resolvePath(path, cwd);\n\t\t\tconst resolvedCwd = resolvePath(cwd);\n\t\t\tconst relativePath = relative(resolvedCwd, absolutePath) || \".\";\n\t\t\taddCandidate(candidates, toDisplaySeparators(relativePath));\n\t\t} catch {\n\t\t\t// Keep the raw/home-shortened candidates when a path cannot be resolved for display.\n\t\t}\n\t}\n\n\treturn candidates.reduce((shortest, candidate) => (candidate.length < shortest.length ? candidate : shortest));\n}\n\nexport function linkPath(styledText: string, rawPath: string, cwd: string): string {\n\tif (!getCapabilities().hyperlinks) return styledText;\n\tconst absolutePath = resolvePath(rawPath, cwd);\n\treturn hyperlink(styledText, pathToFileURL(absolutePath).href);\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport function getTextOutput(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> } | undefined,\n\tshowImages: boolean,\n): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function formatCollapsibleToolResult<TDetails>(args: {\n\tresult: {\n\t\tcontent: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;\n\t\tdetails?: TDetails;\n\t};\n\toptions: ToolRenderResultOptions;\n\ttheme: Theme;\n\tshowImages: boolean;\n\tcollapsedLineLimit: number;\n\twarnings: (details: TDetails | undefined) => string[];\n}): string {\n\tconst output = getTextOutput(args.result, args.showImages).trim();\n\tlet text = \"\";\n\tif (output) {\n\t\tconst lines = output.split(\"\\n\");\n\t\tconst maxLines = args.options.expanded ? lines.length : args.collapsedLineLimit;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n${displayLines.map((line) => args.theme.fg(\"toolOutput\", line)).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `${args.theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t}\n\t}\n\n\tconst warnings = args.warnings(args.result.details);\n\tif (warnings.length > 0) text += `\\n${args.theme.fg(\"warning\", `[Truncated: ${warnings.join(\", \")}]`)}`;\n\treturn text;\n}\n\nexport function toolTextResult<TDetails extends object>(formatted: {\n\ttext: string;\n\tdetails: TDetails;\n}): {\n\tcontent: [{ type: \"text\"; text: string }];\n\tdetails: TDetails | undefined;\n} {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: formatted.text }],\n\t\tdetails: Object.keys(formatted.details).length > 0 ? formatted.details : undefined,\n\t};\n}\n\nexport function renderTextComponent(lastComponent: unknown, content: string): Text {\n\tconst text = lastComponent instanceof Text ? lastComponent : new Text(\"\", 0, 0);\n\ttext.setText(content);\n\treturn text;\n}\n\nexport function invalidArgText(theme: Theme): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n\nexport function renderToolPath(\n\trawPath: string | null,\n\ttheme: Theme,\n\tcwd: string,\n\toptions?: { emptyFallback?: string },\n): string {\n\tif (rawPath === null) return invalidArgText(theme);\n\tconst value = rawPath || options?.emptyFallback;\n\tif (!value) return theme.fg(\"toolOutput\", \"...\");\n\treturn linkPath(theme.fg(\"accent\", shortenPath(value, cwd)), value, cwd);\n}\n"]}
|
|
@@ -19,6 +19,8 @@ export interface RunProcessToolOptions {
|
|
|
19
19
|
policy: OrchestrationExecutionPolicy;
|
|
20
20
|
maxWallClockMs: number;
|
|
21
21
|
spawn?: typeof spawnProcess;
|
|
22
|
+
/** Additional environment resolved for the execution cwd; the policy allowlist still applies. */
|
|
23
|
+
environment?: (cwd: string) => NodeJS.ProcessEnv;
|
|
22
24
|
}
|
|
23
25
|
export declare function createRunProcessToolDefinition(cwd: string, options: RunProcessToolOptions): ToolDefinition;
|
|
24
26
|
export declare function createRunProcessTool(cwd: string, options: RunProcessToolOptions): AgentTool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-process.d.ts","sourceRoot":"","sources":["../../../src/core/tools/run-process.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAsC,MAAM,8BAA8B,CAAC;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAEN,KAAK,4BAA4B,EACjC,MAAM,+BAA+B,CAAC;AAWvC,QAAA,MAAM,gBAAgB;;;EAcrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,4BAA4B,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"run-process.d.ts","sourceRoot":"","sources":["../../../src/core/tools/run-process.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAsC,MAAM,8BAA8B,CAAC;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAEN,KAAK,4BAA4B,EACjC,MAAM,+BAA+B,CAAC;AAWvC,QAAA,MAAM,gBAAgB;;;EAcrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,4BAA4B,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,YAAY,CAAC;IAC5B,iGAAiG;IACjG,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC;CACjD;AAqHD,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,cAAc,CA8E1G;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAE3F"}
|
|
@@ -29,11 +29,14 @@ const SAFE_ENVIRONMENT_VARIABLES = [
|
|
|
29
29
|
"TMP",
|
|
30
30
|
"TEMP",
|
|
31
31
|
];
|
|
32
|
-
|
|
32
|
+
const OWNER_CONTROL_PLANE_ENVIRONMENT_VARIABLES = new Set(["BW_SESSION"]);
|
|
33
|
+
function scopedEnvironment(allowedNames, additional) {
|
|
33
34
|
const names = new Set([...SAFE_ENVIRONMENT_VARIABLES, ...allowedNames]);
|
|
34
35
|
const environment = {};
|
|
35
36
|
for (const name of names) {
|
|
36
|
-
|
|
37
|
+
if (OWNER_CONTROL_PLANE_ENVIRONMENT_VARIABLES.has(name))
|
|
38
|
+
continue;
|
|
39
|
+
const value = additional[name] ?? process.env[name];
|
|
37
40
|
if (value !== undefined)
|
|
38
41
|
environment[name] = value;
|
|
39
42
|
}
|
|
@@ -122,6 +125,7 @@ export function createRunProcessToolDefinition(cwd, options) {
|
|
|
122
125
|
promptSnippet: "Run an owner-allowed executable through a constrained direct-argv launcher (not OS isolation).",
|
|
123
126
|
promptGuidelines: [
|
|
124
127
|
"Use only an executable listed by the profile. Arguments are passed literally; shell operators and interpolation are unavailable.",
|
|
128
|
+
"Owner-authorized project credentials are injected only when their variable names are also allowed by the execution profile.",
|
|
125
129
|
"Treat a non-zero exit code, timeout, abort, or output-limit termination as failure.",
|
|
126
130
|
],
|
|
127
131
|
parameters: runProcessSchema,
|
|
@@ -135,7 +139,7 @@ export function createRunProcessToolDefinition(cwd, options) {
|
|
|
135
139
|
let outputLimitReached = false;
|
|
136
140
|
const child = (options.spawn ?? spawnProcess)(input.executable, [...args], {
|
|
137
141
|
cwd,
|
|
138
|
-
env: scopedEnvironment(options.policy.allowedEnvironmentVariables),
|
|
142
|
+
env: scopedEnvironment(options.policy.allowedEnvironmentVariables, options.environment?.(cwd) ?? {}),
|
|
139
143
|
stdio: ["ignore", "pipe", "pipe"],
|
|
140
144
|
windowsHide: true,
|
|
141
145
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-process.js","sourceRoot":"","sources":["../../../src/core/tools/run-process.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ChildProcess } from \"node:child_process\";\nimport type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport { spawnProcess, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport {\n\tMAX_ORCHESTRATION_PROCESS_OUTPUT_BYTES,\n\ttype OrchestrationExecutionPolicy,\n} from \"../orchestration/contracts.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst MAX_RUN_PROCESS_EXECUTABLE_CHARS = 4_096;\nconst MAX_RUN_PROCESS_ARGUMENT_CHARS = 4_096;\nconst MAX_RUN_PROCESS_ARGUMENTS = 64;\nconst MAX_RUN_PROCESS_ARGV_BYTES = 32 * 1024;\nconst MAX_RUN_PROCESS_WALL_CLOCK_MS = 3_600_000;\nconst MAX_VISIBLE_EXECUTABLES = 16;\nconst MAX_VISIBLE_EXECUTABLE_CHARS = 64;\n\nconst runProcessSchema = Type.Object(\n\t{\n\t\texecutable: Type.String({\n\t\t\tmaxLength: MAX_RUN_PROCESS_EXECUTABLE_CHARS,\n\t\t\tdescription: \"Exact owner-allowed executable name or path.\",\n\t\t}),\n\t\targs: Type.Optional(\n\t\t\tType.Array(Type.String({ maxLength: MAX_RUN_PROCESS_ARGUMENT_CHARS }), {\n\t\t\t\tmaxItems: MAX_RUN_PROCESS_ARGUMENTS,\n\t\t\t\tdescription: \"Direct argv entries. No shell parsing occurs.\",\n\t\t\t}),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type RunProcessInput = Static<typeof runProcessSchema>;\n\nexport interface RunProcessDetails {\n\toutcome: \"exited\" | \"failed\" | \"aborted\" | \"timeout\" | \"output_limit\";\n\texecutable: string;\n\texitCode: number | null;\n\tdurationMs: number;\n\ttruncated: boolean;\n}\n\nexport interface RunProcessToolOptions {\n\tpolicy: OrchestrationExecutionPolicy;\n\tmaxWallClockMs: number;\n\tspawn?: typeof spawnProcess;\n}\n\nconst SAFE_ENVIRONMENT_VARIABLES = [\n\t\"PATH\",\n\t\"PATHEXT\",\n\t\"SystemRoot\",\n\t\"WINDIR\",\n\t\"COMSPEC\",\n\t\"TMPDIR\",\n\t\"TMP\",\n\t\"TEMP\",\n] as const;\n\nfunction scopedEnvironment(allowedNames: readonly string[]): NodeJS.ProcessEnv {\n\tconst names = new Set<string>([...SAFE_ENVIRONMENT_VARIABLES, ...allowedNames]);\n\tconst environment: NodeJS.ProcessEnv = {};\n\tfor (const name of names) {\n\t\tconst value = process.env[name];\n\t\tif (value !== undefined) environment[name] = value;\n\t}\n\treturn environment;\n}\n\nfunction executableCatalogDescription(allowedExecutables: readonly string[]): string {\n\tconst visible = allowedExecutables\n\t\t.slice(0, MAX_VISIBLE_EXECUTABLES)\n\t\t.map((executable) => executable.slice(0, MAX_VISIBLE_EXECUTABLE_CHARS));\n\tconst omitted = allowedExecutables.length - visible.length;\n\treturn `${allowedExecutables.length} configured: ${visible.join(\", \")}${omitted > 0 ? `; ${omitted} omitted` : \"\"}`;\n}\n\nfunction resolveProcessPolicy(options: RunProcessToolOptions): { maxOutputBytes: number; timeoutMs: number } {\n\tif (\n\t\t!Number.isSafeInteger(options.policy.maxOutputBytes) ||\n\t\toptions.policy.maxOutputBytes <= 0 ||\n\t\t!Number.isSafeInteger(options.maxWallClockMs) ||\n\t\toptions.maxWallClockMs < 0\n\t) {\n\t\tthrow new TypeError(\"process_policy_invalid: output and wall-clock limits must be bounded integers.\");\n\t}\n\treturn {\n\t\tmaxOutputBytes: Math.min(options.policy.maxOutputBytes, MAX_ORCHESTRATION_PROCESS_OUTPUT_BYTES),\n\t\t// A zero lane-level budget disables that budget, not the execution-plane safety ceiling.\n\t\ttimeoutMs:\n\t\t\toptions.maxWallClockMs === 0\n\t\t\t\t? MAX_RUN_PROCESS_WALL_CLOCK_MS\n\t\t\t\t: Math.min(options.maxWallClockMs, MAX_RUN_PROCESS_WALL_CLOCK_MS),\n\t};\n}\n\nfunction validateProcessInput(input: RunProcessInput): string[] {\n\tif (\n\t\ttypeof input.executable !== \"string\" ||\n\t\tinput.executable.length === 0 ||\n\t\tinput.executable.length > MAX_RUN_PROCESS_EXECUTABLE_CHARS ||\n\t\tinput.executable.includes(\"\\0\")\n\t) {\n\t\tthrow new Error(\"process_argument_invalid: executable is empty, oversized, or contains a NUL byte.\");\n\t}\n\tif (\n\t\tinput.args !== undefined &&\n\t\t(!Array.isArray(input.args) ||\n\t\t\tinput.args.length > MAX_RUN_PROCESS_ARGUMENTS ||\n\t\t\tinput.args.some(\n\t\t\t\t(argument) =>\n\t\t\t\t\ttypeof argument !== \"string\" ||\n\t\t\t\t\targument.length > MAX_RUN_PROCESS_ARGUMENT_CHARS ||\n\t\t\t\t\targument.includes(\"\\0\"),\n\t\t\t))\n\t) {\n\t\tthrow new Error(\"process_argument_invalid: argv exceeds its count/size bound or contains a NUL byte.\");\n\t}\n\tconst args = input.args ?? [];\n\tlet argvBytes = Buffer.byteLength(input.executable, \"utf-8\");\n\tfor (const argument of args) {\n\t\targvBytes += 1 + Buffer.byteLength(argument, \"utf-8\");\n\t\tif (argvBytes > MAX_RUN_PROCESS_ARGV_BYTES) {\n\t\t\tthrow new Error(`process_argument_invalid: executable and argv exceed ${MAX_RUN_PROCESS_ARGV_BYTES} bytes.`);\n\t\t}\n\t}\n\treturn args;\n}\n\nfunction collectBoundedOutput(\n\tchild: ChildProcess,\n\tmaxBytes: number,\n\tabort: () => void,\n): {\n\tread(): { stdout: string; stderr: string; truncated: boolean };\n} {\n\tlet remaining = maxBytes;\n\tlet truncated = false;\n\tconst stdout: Buffer[] = [];\n\tconst stderr: Buffer[] = [];\n\tconst collect = (target: Buffer[]) => (chunk: Buffer) => {\n\t\tif (remaining <= 0) return;\n\t\tconst retained = chunk.subarray(0, remaining);\n\t\ttarget.push(retained);\n\t\tremaining -= retained.length;\n\t\tif (retained.length < chunk.length || remaining === 0) {\n\t\t\ttruncated = true;\n\t\t\tabort();\n\t\t}\n\t};\n\tchild.stdout?.on(\"data\", collect(stdout));\n\tchild.stderr?.on(\"data\", collect(stderr));\n\treturn {\n\t\tread: () => ({\n\t\t\tstdout: Buffer.concat(stdout).toString(\"utf-8\"),\n\t\t\tstderr: Buffer.concat(stderr).toString(\"utf-8\"),\n\t\t\ttruncated,\n\t\t}),\n\t};\n}\n\nexport function createRunProcessToolDefinition(cwd: string, options: RunProcessToolOptions): ToolDefinition {\n\tconst processPolicy = resolveProcessPolicy(options);\n\tconst allowedExecutables = new Set(options.policy.allowedExecutables);\n\treturn {\n\t\tname: \"run_process\",\n\t\tlabel: \"Run Process\",\n\t\tdescription: `Run one owner-allowed executable using direct argv without a shell. Allowed executables: ${executableCatalogDescription(options.policy.allowedExecutables)}.`,\n\t\tpromptSnippet: \"Run an owner-allowed executable through a constrained direct-argv launcher (not OS isolation).\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use only an executable listed by the profile. Arguments are passed literally; shell operators and interpolation are unavailable.\",\n\t\t\t\"Treat a non-zero exit code, timeout, abort, or output-limit termination as failure.\",\n\t\t],\n\t\tparameters: runProcessSchema,\n\t\tasync execute(_toolCallId, input: RunProcessInput, signal) {\n\t\t\tconst args = validateProcessInput(input);\n\t\t\tif (!allowedExecutables.has(input.executable)) {\n\t\t\t\tthrow new Error(`process_executable_denied: '${input.executable}' is not owner-allowed.`);\n\t\t\t}\n\t\t\tconst startedAt = Date.now();\n\t\t\tconst outputLimitAbort = new AbortController();\n\t\t\tlet outputLimitReached = false;\n\t\t\tconst child = (options.spawn ?? spawnProcess)(input.executable, [...args], {\n\t\t\t\tcwd,\n\t\t\t\tenv: scopedEnvironment(options.policy.allowedEnvironmentVariables),\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tconst output = collectBoundedOutput(child, processPolicy.maxOutputBytes, () => {\n\t\t\t\toutputLimitReached = true;\n\t\t\t\toutputLimitAbort.abort();\n\t\t\t});\n\t\t\tconst combinedAbort = new AbortController();\n\t\t\tconst abort = () => combinedAbort.abort();\n\t\t\tif (signal?.aborted || outputLimitAbort.signal.aborted) abort();\n\t\t\telse {\n\t\t\t\tsignal?.addEventListener(\"abort\", abort, { once: true });\n\t\t\t\toutputLimitAbort.signal.addEventListener(\"abort\", abort, { once: true });\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst terminal = await waitForChildProcessWithTermination(child, {\n\t\t\t\t\tsignal: combinedAbort.signal,\n\t\t\t\t\ttimeoutMs: processPolicy.timeoutMs,\n\t\t\t\t\tkillGraceMs: 2_000,\n\t\t\t\t});\n\t\t\t\tconst captured = output.read();\n\t\t\t\tconst outcome: RunProcessDetails[\"outcome\"] = outputLimitReached\n\t\t\t\t\t? \"output_limit\"\n\t\t\t\t\t: terminal.reason === \"timeout\"\n\t\t\t\t\t\t? \"timeout\"\n\t\t\t\t\t\t: terminal.reason === \"aborted\"\n\t\t\t\t\t\t\t? \"aborted\"\n\t\t\t\t\t\t\t: terminal.code === 0\n\t\t\t\t\t\t\t\t? \"exited\"\n\t\t\t\t\t\t\t\t: \"failed\";\n\t\t\t\tconst body = [\n\t\t\t\t\t`outcome: ${outcome}`,\n\t\t\t\t\t`exitCode: ${terminal.code ?? \"null\"}`,\n\t\t\t\t\tcaptured.stdout ? `stdout:\\n${captured.stdout}` : \"stdout: (empty)\",\n\t\t\t\t\tcaptured.stderr ? `stderr:\\n${captured.stderr}` : \"stderr: (empty)\",\n\t\t\t\t].join(\"\\n\");\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: body }],\n\t\t\t\t\t...(outcome === \"exited\" ? {} : { isError: true }),\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\toutcome,\n\t\t\t\t\t\texecutable: input.executable,\n\t\t\t\t\t\texitCode: terminal.code,\n\t\t\t\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\t\t\t\ttruncated: captured.truncated,\n\t\t\t\t\t} satisfies RunProcessDetails,\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\t\toutputLimitAbort.signal.removeEventListener(\"abort\", abort);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function createRunProcessTool(cwd: string, options: RunProcessToolOptions): AgentTool {\n\treturn wrapToolDefinition(createRunProcessToolDefinition(cwd, options));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"run-process.js","sourceRoot":"","sources":["../../../src/core/tools/run-process.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ChildProcess } from \"node:child_process\";\nimport type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport { spawnProcess, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport {\n\tMAX_ORCHESTRATION_PROCESS_OUTPUT_BYTES,\n\ttype OrchestrationExecutionPolicy,\n} from \"../orchestration/contracts.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst MAX_RUN_PROCESS_EXECUTABLE_CHARS = 4_096;\nconst MAX_RUN_PROCESS_ARGUMENT_CHARS = 4_096;\nconst MAX_RUN_PROCESS_ARGUMENTS = 64;\nconst MAX_RUN_PROCESS_ARGV_BYTES = 32 * 1024;\nconst MAX_RUN_PROCESS_WALL_CLOCK_MS = 3_600_000;\nconst MAX_VISIBLE_EXECUTABLES = 16;\nconst MAX_VISIBLE_EXECUTABLE_CHARS = 64;\n\nconst runProcessSchema = Type.Object(\n\t{\n\t\texecutable: Type.String({\n\t\t\tmaxLength: MAX_RUN_PROCESS_EXECUTABLE_CHARS,\n\t\t\tdescription: \"Exact owner-allowed executable name or path.\",\n\t\t}),\n\t\targs: Type.Optional(\n\t\t\tType.Array(Type.String({ maxLength: MAX_RUN_PROCESS_ARGUMENT_CHARS }), {\n\t\t\t\tmaxItems: MAX_RUN_PROCESS_ARGUMENTS,\n\t\t\t\tdescription: \"Direct argv entries. No shell parsing occurs.\",\n\t\t\t}),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type RunProcessInput = Static<typeof runProcessSchema>;\n\nexport interface RunProcessDetails {\n\toutcome: \"exited\" | \"failed\" | \"aborted\" | \"timeout\" | \"output_limit\";\n\texecutable: string;\n\texitCode: number | null;\n\tdurationMs: number;\n\ttruncated: boolean;\n}\n\nexport interface RunProcessToolOptions {\n\tpolicy: OrchestrationExecutionPolicy;\n\tmaxWallClockMs: number;\n\tspawn?: typeof spawnProcess;\n\t/** Additional environment resolved for the execution cwd; the policy allowlist still applies. */\n\tenvironment?: (cwd: string) => NodeJS.ProcessEnv;\n}\n\nconst SAFE_ENVIRONMENT_VARIABLES = [\n\t\"PATH\",\n\t\"PATHEXT\",\n\t\"SystemRoot\",\n\t\"WINDIR\",\n\t\"COMSPEC\",\n\t\"TMPDIR\",\n\t\"TMP\",\n\t\"TEMP\",\n] as const;\nconst OWNER_CONTROL_PLANE_ENVIRONMENT_VARIABLES = new Set([\"BW_SESSION\"]);\n\nfunction scopedEnvironment(allowedNames: readonly string[], additional: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n\tconst names = new Set<string>([...SAFE_ENVIRONMENT_VARIABLES, ...allowedNames]);\n\tconst environment: NodeJS.ProcessEnv = {};\n\tfor (const name of names) {\n\t\tif (OWNER_CONTROL_PLANE_ENVIRONMENT_VARIABLES.has(name)) continue;\n\t\tconst value = additional[name] ?? process.env[name];\n\t\tif (value !== undefined) environment[name] = value;\n\t}\n\treturn environment;\n}\n\nfunction executableCatalogDescription(allowedExecutables: readonly string[]): string {\n\tconst visible = allowedExecutables\n\t\t.slice(0, MAX_VISIBLE_EXECUTABLES)\n\t\t.map((executable) => executable.slice(0, MAX_VISIBLE_EXECUTABLE_CHARS));\n\tconst omitted = allowedExecutables.length - visible.length;\n\treturn `${allowedExecutables.length} configured: ${visible.join(\", \")}${omitted > 0 ? `; ${omitted} omitted` : \"\"}`;\n}\n\nfunction resolveProcessPolicy(options: RunProcessToolOptions): { maxOutputBytes: number; timeoutMs: number } {\n\tif (\n\t\t!Number.isSafeInteger(options.policy.maxOutputBytes) ||\n\t\toptions.policy.maxOutputBytes <= 0 ||\n\t\t!Number.isSafeInteger(options.maxWallClockMs) ||\n\t\toptions.maxWallClockMs < 0\n\t) {\n\t\tthrow new TypeError(\"process_policy_invalid: output and wall-clock limits must be bounded integers.\");\n\t}\n\treturn {\n\t\tmaxOutputBytes: Math.min(options.policy.maxOutputBytes, MAX_ORCHESTRATION_PROCESS_OUTPUT_BYTES),\n\t\t// A zero lane-level budget disables that budget, not the execution-plane safety ceiling.\n\t\ttimeoutMs:\n\t\t\toptions.maxWallClockMs === 0\n\t\t\t\t? MAX_RUN_PROCESS_WALL_CLOCK_MS\n\t\t\t\t: Math.min(options.maxWallClockMs, MAX_RUN_PROCESS_WALL_CLOCK_MS),\n\t};\n}\n\nfunction validateProcessInput(input: RunProcessInput): string[] {\n\tif (\n\t\ttypeof input.executable !== \"string\" ||\n\t\tinput.executable.length === 0 ||\n\t\tinput.executable.length > MAX_RUN_PROCESS_EXECUTABLE_CHARS ||\n\t\tinput.executable.includes(\"\\0\")\n\t) {\n\t\tthrow new Error(\"process_argument_invalid: executable is empty, oversized, or contains a NUL byte.\");\n\t}\n\tif (\n\t\tinput.args !== undefined &&\n\t\t(!Array.isArray(input.args) ||\n\t\t\tinput.args.length > MAX_RUN_PROCESS_ARGUMENTS ||\n\t\t\tinput.args.some(\n\t\t\t\t(argument) =>\n\t\t\t\t\ttypeof argument !== \"string\" ||\n\t\t\t\t\targument.length > MAX_RUN_PROCESS_ARGUMENT_CHARS ||\n\t\t\t\t\targument.includes(\"\\0\"),\n\t\t\t))\n\t) {\n\t\tthrow new Error(\"process_argument_invalid: argv exceeds its count/size bound or contains a NUL byte.\");\n\t}\n\tconst args = input.args ?? [];\n\tlet argvBytes = Buffer.byteLength(input.executable, \"utf-8\");\n\tfor (const argument of args) {\n\t\targvBytes += 1 + Buffer.byteLength(argument, \"utf-8\");\n\t\tif (argvBytes > MAX_RUN_PROCESS_ARGV_BYTES) {\n\t\t\tthrow new Error(`process_argument_invalid: executable and argv exceed ${MAX_RUN_PROCESS_ARGV_BYTES} bytes.`);\n\t\t}\n\t}\n\treturn args;\n}\n\nfunction collectBoundedOutput(\n\tchild: ChildProcess,\n\tmaxBytes: number,\n\tabort: () => void,\n): {\n\tread(): { stdout: string; stderr: string; truncated: boolean };\n} {\n\tlet remaining = maxBytes;\n\tlet truncated = false;\n\tconst stdout: Buffer[] = [];\n\tconst stderr: Buffer[] = [];\n\tconst collect = (target: Buffer[]) => (chunk: Buffer) => {\n\t\tif (remaining <= 0) return;\n\t\tconst retained = chunk.subarray(0, remaining);\n\t\ttarget.push(retained);\n\t\tremaining -= retained.length;\n\t\tif (retained.length < chunk.length || remaining === 0) {\n\t\t\ttruncated = true;\n\t\t\tabort();\n\t\t}\n\t};\n\tchild.stdout?.on(\"data\", collect(stdout));\n\tchild.stderr?.on(\"data\", collect(stderr));\n\treturn {\n\t\tread: () => ({\n\t\t\tstdout: Buffer.concat(stdout).toString(\"utf-8\"),\n\t\t\tstderr: Buffer.concat(stderr).toString(\"utf-8\"),\n\t\t\ttruncated,\n\t\t}),\n\t};\n}\n\nexport function createRunProcessToolDefinition(cwd: string, options: RunProcessToolOptions): ToolDefinition {\n\tconst processPolicy = resolveProcessPolicy(options);\n\tconst allowedExecutables = new Set(options.policy.allowedExecutables);\n\treturn {\n\t\tname: \"run_process\",\n\t\tlabel: \"Run Process\",\n\t\tdescription: `Run one owner-allowed executable using direct argv without a shell. Allowed executables: ${executableCatalogDescription(options.policy.allowedExecutables)}.`,\n\t\tpromptSnippet: \"Run an owner-allowed executable through a constrained direct-argv launcher (not OS isolation).\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use only an executable listed by the profile. Arguments are passed literally; shell operators and interpolation are unavailable.\",\n\t\t\t\"Owner-authorized project credentials are injected only when their variable names are also allowed by the execution profile.\",\n\t\t\t\"Treat a non-zero exit code, timeout, abort, or output-limit termination as failure.\",\n\t\t],\n\t\tparameters: runProcessSchema,\n\t\tasync execute(_toolCallId, input: RunProcessInput, signal) {\n\t\t\tconst args = validateProcessInput(input);\n\t\t\tif (!allowedExecutables.has(input.executable)) {\n\t\t\t\tthrow new Error(`process_executable_denied: '${input.executable}' is not owner-allowed.`);\n\t\t\t}\n\t\t\tconst startedAt = Date.now();\n\t\t\tconst outputLimitAbort = new AbortController();\n\t\t\tlet outputLimitReached = false;\n\t\t\tconst child = (options.spawn ?? spawnProcess)(input.executable, [...args], {\n\t\t\t\tcwd,\n\t\t\t\tenv: scopedEnvironment(options.policy.allowedEnvironmentVariables, options.environment?.(cwd) ?? {}),\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tconst output = collectBoundedOutput(child, processPolicy.maxOutputBytes, () => {\n\t\t\t\toutputLimitReached = true;\n\t\t\t\toutputLimitAbort.abort();\n\t\t\t});\n\t\t\tconst combinedAbort = new AbortController();\n\t\t\tconst abort = () => combinedAbort.abort();\n\t\t\tif (signal?.aborted || outputLimitAbort.signal.aborted) abort();\n\t\t\telse {\n\t\t\t\tsignal?.addEventListener(\"abort\", abort, { once: true });\n\t\t\t\toutputLimitAbort.signal.addEventListener(\"abort\", abort, { once: true });\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst terminal = await waitForChildProcessWithTermination(child, {\n\t\t\t\t\tsignal: combinedAbort.signal,\n\t\t\t\t\ttimeoutMs: processPolicy.timeoutMs,\n\t\t\t\t\tkillGraceMs: 2_000,\n\t\t\t\t});\n\t\t\t\tconst captured = output.read();\n\t\t\t\tconst outcome: RunProcessDetails[\"outcome\"] = outputLimitReached\n\t\t\t\t\t? \"output_limit\"\n\t\t\t\t\t: terminal.reason === \"timeout\"\n\t\t\t\t\t\t? \"timeout\"\n\t\t\t\t\t\t: terminal.reason === \"aborted\"\n\t\t\t\t\t\t\t? \"aborted\"\n\t\t\t\t\t\t\t: terminal.code === 0\n\t\t\t\t\t\t\t\t? \"exited\"\n\t\t\t\t\t\t\t\t: \"failed\";\n\t\t\t\tconst body = [\n\t\t\t\t\t`outcome: ${outcome}`,\n\t\t\t\t\t`exitCode: ${terminal.code ?? \"null\"}`,\n\t\t\t\t\tcaptured.stdout ? `stdout:\\n${captured.stdout}` : \"stdout: (empty)\",\n\t\t\t\t\tcaptured.stderr ? `stderr:\\n${captured.stderr}` : \"stderr: (empty)\",\n\t\t\t\t].join(\"\\n\");\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: body }],\n\t\t\t\t\t...(outcome === \"exited\" ? {} : { isError: true }),\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\toutcome,\n\t\t\t\t\t\texecutable: input.executable,\n\t\t\t\t\t\texitCode: terminal.code,\n\t\t\t\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\t\t\t\ttruncated: captured.truncated,\n\t\t\t\t\t} satisfies RunProcessDetails,\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\t\toutputLimitAbort.signal.removeEventListener(\"abort\", abort);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function createRunProcessTool(cwd: string, options: RunProcessToolOptions): AgentTool {\n\treturn wrapToolDefinition(createRunProcessToolDefinition(cwd, options));\n}\n"]}
|
|
@@ -21,4 +21,12 @@ export declare function parseShellSearchInvocationScope(searchTool: ShellContent
|
|
|
21
21
|
* tools already own result caps and artifacts; this closes the raw-shell bypass before execution.
|
|
22
22
|
*/
|
|
23
23
|
export declare function assessShellSearchScope(command: string, cwd: string): SearchScopeAssessment;
|
|
24
|
+
/**
|
|
25
|
+
* Ripgrep and grep reserve exit code 1 for a successful search with zero matches. Shell lists
|
|
26
|
+
* return the final command's status, so compound diagnostics ending in either search must preserve
|
|
27
|
+
* that semantic instead of turning an empty result into a tool failure. This scans the
|
|
28
|
+
* already-bounded command once and only accepts an unambiguous final invocation; syntax, IO, and
|
|
29
|
+
* regex errors remain exit code 2.
|
|
30
|
+
*/
|
|
31
|
+
export declare function expectedContentSearchNoMatch(command: string, exitCode: number | null): ShellContentSearchTool | undefined;
|
|
24
32
|
//# sourceMappingURL=search-command-guard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-command-guard.d.ts","sourceRoot":"","sources":["../../../src/core/tools/search-command-guard.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yBAAyB,EAAG,eAAwB,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAuChF,MAAM,MAAM,sBAAsB,GAAG,IAAI,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAgND,kGAAkG;AAClG,wBAAgB,+BAA+B,CAC9C,UAAU,EAAE,sBAAsB,EAClC,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,OAAO,GAChB,0BAA0B,CAqB5B;AAkID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,qBAAqB,CA4B1F"}
|
|
1
|
+
{"version":3,"file":"search-command-guard.d.ts","sourceRoot":"","sources":["../../../src/core/tools/search-command-guard.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yBAAyB,EAAG,eAAwB,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAuChF,MAAM,MAAM,sBAAsB,GAAG,IAAI,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAgND,kGAAkG;AAClG,wBAAgB,+BAA+B,CAC9C,UAAU,EAAE,sBAAsB,EAClC,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,OAAO,GAChB,0BAA0B,CAqB5B;AAkID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,qBAAqB,CA4B1F;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC3C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,IAAI,GACrB,sBAAsB,GAAG,SAAS,CA2CpC"}
|
|
@@ -417,4 +417,58 @@ export function assessShellSearchScope(command, cwd) {
|
|
|
417
417
|
}
|
|
418
418
|
return assessCurrent();
|
|
419
419
|
}
|
|
420
|
+
/**
|
|
421
|
+
* Ripgrep and grep reserve exit code 1 for a successful search with zero matches. Shell lists
|
|
422
|
+
* return the final command's status, so compound diagnostics ending in either search must preserve
|
|
423
|
+
* that semantic instead of turning an empty result into a tool failure. This scans the
|
|
424
|
+
* already-bounded command once and only accepts an unambiguous final invocation; syntax, IO, and
|
|
425
|
+
* regex errors remain exit code 2.
|
|
426
|
+
*/
|
|
427
|
+
export function expectedContentSearchNoMatch(command, exitCode) {
|
|
428
|
+
if (exitCode !== 1)
|
|
429
|
+
return undefined;
|
|
430
|
+
const tokens = tokenizeShellCommand(command);
|
|
431
|
+
if (!tokens)
|
|
432
|
+
return undefined;
|
|
433
|
+
let invocation = [];
|
|
434
|
+
let ignoreRedirectTarget = false;
|
|
435
|
+
let connector;
|
|
436
|
+
let invocationConnector;
|
|
437
|
+
let finalInvocation;
|
|
438
|
+
let finalInvocationConnector;
|
|
439
|
+
const finishInvocation = () => {
|
|
440
|
+
if (invocation.length > 0) {
|
|
441
|
+
finalInvocation = invocation;
|
|
442
|
+
finalInvocationConnector = invocationConnector;
|
|
443
|
+
}
|
|
444
|
+
invocation = [];
|
|
445
|
+
invocationConnector = undefined;
|
|
446
|
+
};
|
|
447
|
+
for (const token of tokens) {
|
|
448
|
+
if (token.kind === "arg") {
|
|
449
|
+
if (!ignoreRedirectTarget) {
|
|
450
|
+
if (invocation.length === 0)
|
|
451
|
+
invocationConnector = connector;
|
|
452
|
+
invocation.push(token.value);
|
|
453
|
+
}
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
if (token.kind === "redirect") {
|
|
457
|
+
ignoreRedirectTarget = true;
|
|
458
|
+
continue;
|
|
459
|
+
}
|
|
460
|
+
finishInvocation();
|
|
461
|
+
ignoreRedirectTarget = false;
|
|
462
|
+
connector = token.value;
|
|
463
|
+
}
|
|
464
|
+
finishInvocation();
|
|
465
|
+
// `prior && search` can return the prior command's exit 1 without executing the search.
|
|
466
|
+
if (!finalInvocation || finalInvocationConnector === "&&")
|
|
467
|
+
return undefined;
|
|
468
|
+
const normalizedInvocation = stripInvocationPrefixes(finalInvocation);
|
|
469
|
+
const name = commandName(normalizedInvocation[0] ?? "");
|
|
470
|
+
if (name === "rg" || name === "ripgrep")
|
|
471
|
+
return "rg";
|
|
472
|
+
return name === "grep" ? "grep" : undefined;
|
|
473
|
+
}
|
|
420
474
|
//# sourceMappingURL=search-command-guard.js.map
|
|
@@ -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"]}
|
|
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"]}
|