agent-nuvira 3.3.1 → 3.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -13
- package/dist/agent-sdk/src/agent.d.ts +2 -0
- package/dist/agent-sdk/src/agent.d.ts.map +1 -1
- package/dist/agent-sdk/src/define.d.ts +64 -0
- package/dist/agent-sdk/src/define.d.ts.map +1 -0
- package/dist/agent-sdk/src/define.js +76 -0
- package/dist/agent-sdk/src/define.js.map +1 -0
- package/dist/agent-sdk/src/index.d.ts +9 -0
- package/dist/agent-sdk/src/index.d.ts.map +1 -1
- package/dist/agent-sdk/src/index.js +9 -0
- package/dist/agent-sdk/src/index.js.map +1 -1
- package/dist/agent-sdk/src/scaffold.d.ts +11 -0
- package/dist/agent-sdk/src/scaffold.d.ts.map +1 -1
- package/dist/agent-sdk/src/scaffold.js +16 -6
- package/dist/agent-sdk/src/scaffold.js.map +1 -1
- package/dist/agents/agents/runner.d.ts +9 -0
- package/dist/agents/agents/runner.d.ts.map +1 -1
- package/dist/agents/agents/runner.js +34 -12
- package/dist/agents/agents/runner.js.map +1 -1
- package/dist/agents/agents/writer-tool-calling.d.ts.map +1 -1
- package/dist/agents/agents/writer-tool-calling.js +7 -2
- package/dist/agents/agents/writer-tool-calling.js.map +1 -1
- package/dist/agents/agents/writer.d.ts.map +1 -1
- package/dist/agents/agents/writer.js +7 -1
- package/dist/agents/agents/writer.js.map +1 -1
- package/dist/agents/artifact-verification.d.ts +102 -0
- package/dist/agents/artifact-verification.d.ts.map +1 -0
- package/dist/agents/artifact-verification.js +216 -0
- package/dist/agents/artifact-verification.js.map +1 -0
- package/dist/agents/checkpoint-store.d.ts +73 -0
- package/dist/agents/checkpoint-store.d.ts.map +1 -1
- package/dist/agents/checkpoint-store.js +161 -0
- package/dist/agents/checkpoint-store.js.map +1 -1
- package/dist/agents/credential-store.d.ts +120 -0
- package/dist/agents/credential-store.d.ts.map +1 -1
- package/dist/agents/credential-store.js +358 -19
- package/dist/agents/credential-store.js.map +1 -1
- package/dist/agents/long-form-plan.d.ts.map +1 -1
- package/dist/agents/long-form-plan.js +2 -1
- package/dist/agents/long-form-plan.js.map +1 -1
- package/dist/agents/orchestrator.d.ts +10 -1
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +239 -79
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/agents/phase-engine.d.ts +61 -0
- package/dist/agents/phase-engine.d.ts.map +1 -1
- package/dist/agents/phase-engine.js +68 -2
- package/dist/agents/phase-engine.js.map +1 -1
- package/dist/agents/prompt-assembly.d.ts +11 -0
- package/dist/agents/prompt-assembly.d.ts.map +1 -1
- package/dist/agents/prompt-assembly.js +17 -0
- package/dist/agents/prompt-assembly.js.map +1 -1
- package/dist/agents/release-preflight.d.ts +121 -0
- package/dist/agents/release-preflight.d.ts.map +1 -0
- package/dist/agents/release-preflight.js +259 -0
- package/dist/agents/release-preflight.js.map +1 -0
- package/dist/agents/release-runner.d.ts +157 -0
- package/dist/agents/release-runner.d.ts.map +1 -0
- package/dist/agents/release-runner.js +719 -0
- package/dist/agents/release-runner.js.map +1 -0
- package/dist/agents/step-handoff.d.ts +190 -0
- package/dist/agents/step-handoff.d.ts.map +1 -0
- package/dist/agents/step-handoff.js +443 -0
- package/dist/agents/step-handoff.js.map +1 -0
- package/dist/cli/agent.d.ts +2 -2
- package/dist/cli/agent.js +10 -10
- package/dist/cli/benchmark.d.ts.map +1 -1
- package/dist/cli/benchmark.js +11 -4
- package/dist/cli/benchmark.js.map +1 -1
- package/dist/cli/chat.d.ts +94 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +379 -24
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/cli-program.d.ts.map +1 -1
- package/dist/cli/cli-program.js +8 -0
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +9 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/credentials.d.ts +28 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +213 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +3 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/edit.js +2 -2
- package/dist/cli/eval.d.ts +17 -0
- package/dist/cli/eval.d.ts.map +1 -1
- package/dist/cli/eval.js +105 -2
- package/dist/cli/eval.js.map +1 -1
- package/dist/cli/execute.d.ts +16 -1
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +192 -22
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/failover-runner.d.ts.map +1 -1
- package/dist/cli/failover-runner.js +9 -3
- package/dist/cli/failover-runner.js.map +1 -1
- package/dist/cli/loop-executor.d.ts +55 -0
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +285 -19
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/cli/model.d.ts.map +1 -1
- package/dist/cli/model.js +9 -8
- package/dist/cli/model.js.map +1 -1
- package/dist/cli/models.d.ts +1 -1
- package/dist/cli/models.js +4 -4
- package/dist/cli/nlu.d.ts.map +1 -1
- package/dist/cli/nlu.js +8 -2
- package/dist/cli/nlu.js.map +1 -1
- package/dist/cli/parity.d.ts +85 -0
- package/dist/cli/parity.d.ts.map +1 -0
- package/dist/cli/parity.js +506 -0
- package/dist/cli/parity.js.map +1 -0
- package/dist/cli/plan.d.ts.map +1 -1
- package/dist/cli/plan.js +2 -1
- package/dist/cli/plan.js.map +1 -1
- package/dist/cli/publish.d.ts +22 -0
- package/dist/cli/publish.d.ts.map +1 -1
- package/dist/cli/publish.js +109 -13
- package/dist/cli/publish.js.map +1 -1
- package/dist/cli/retrieval.d.ts.map +1 -1
- package/dist/cli/retrieval.js +5 -4
- package/dist/cli/retrieval.js.map +1 -1
- package/dist/cli/sdk.js +4 -4
- package/dist/cli/sdk.js.map +1 -1
- package/dist/cli/trace.d.ts.map +1 -1
- package/dist/cli/trace.js +2 -1
- package/dist/cli/trace.js.map +1 -1
- package/dist/cli/workflow.js +2 -2
- package/dist/cli/workflow.js.map +1 -1
- package/dist/config/live-credentials.d.ts +57 -0
- package/dist/config/live-credentials.d.ts.map +1 -0
- package/dist/config/live-credentials.js +126 -0
- package/dist/config/live-credentials.js.map +1 -0
- package/dist/config/paths.d.ts +18 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +25 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/types.d.ts +44 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/federation/a2a-types.js +1 -1
- package/dist/federation/a2a-types.js.map +1 -1
- package/dist/findings/verdicts.d.ts +241 -0
- package/dist/findings/verdicts.d.ts.map +1 -0
- package/dist/findings/verdicts.js +284 -0
- package/dist/findings/verdicts.js.map +1 -0
- package/dist/gateway/adapters.d.ts +65 -0
- package/dist/gateway/adapters.d.ts.map +1 -1
- package/dist/gateway/adapters.js +216 -10
- package/dist/gateway/adapters.js.map +1 -1
- package/dist/gateway/channel-directory.d.ts +31 -0
- package/dist/gateway/channel-directory.d.ts.map +1 -1
- package/dist/gateway/channel-directory.js +40 -0
- package/dist/gateway/channel-directory.js.map +1 -1
- package/dist/gateway/gateway-log.d.ts +1 -1
- package/dist/gateway/gateway-log.d.ts.map +1 -1
- package/dist/gateway/gateway-log.js.map +1 -1
- package/dist/gateway/hooks.d.ts +87 -19
- package/dist/gateway/hooks.d.ts.map +1 -1
- package/dist/gateway/hooks.js +62 -23
- package/dist/gateway/hooks.js.map +1 -1
- package/dist/gateway/inbound-media.d.ts +147 -0
- package/dist/gateway/inbound-media.d.ts.map +1 -0
- package/dist/gateway/inbound-media.js +317 -0
- package/dist/gateway/inbound-media.js.map +1 -0
- package/dist/gateway/inbox.d.ts +8 -1
- package/dist/gateway/inbox.d.ts.map +1 -1
- package/dist/gateway/inbox.js.map +1 -1
- package/dist/gateway/platform-config.d.ts +14 -0
- package/dist/gateway/platform-config.d.ts.map +1 -1
- package/dist/gateway/platform-config.js +26 -8
- package/dist/gateway/platform-config.js.map +1 -1
- package/dist/gateway/realtime.d.ts +114 -0
- package/dist/gateway/realtime.d.ts.map +1 -0
- package/dist/gateway/realtime.js +402 -0
- package/dist/gateway/realtime.js.map +1 -0
- package/dist/gateway/registry.d.ts +31 -0
- package/dist/gateway/registry.d.ts.map +1 -1
- package/dist/gateway/registry.js +224 -4
- package/dist/gateway/registry.js.map +1 -1
- package/dist/gateway/whatsapp/baileys-bridge.d.ts +11 -1
- package/dist/gateway/whatsapp/baileys-bridge.d.ts.map +1 -1
- package/dist/gateway/whatsapp/baileys-bridge.js +123 -4
- package/dist/gateway/whatsapp/baileys-bridge.js.map +1 -1
- package/dist/gateway/whatsapp/bridge.d.ts +6 -2
- package/dist/gateway/whatsapp/bridge.d.ts.map +1 -1
- package/dist/gateway/whatsapp/bridge.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/inference/factory.d.ts +14 -0
- package/dist/inference/factory.d.ts.map +1 -1
- package/dist/inference/factory.js +17 -0
- package/dist/inference/factory.js.map +1 -1
- package/dist/inference/groq-adapter.d.ts +2 -0
- package/dist/inference/groq-adapter.d.ts.map +1 -1
- package/dist/inference/groq-adapter.js +16 -6
- package/dist/inference/groq-adapter.js.map +1 -1
- package/dist/inference/model-validator.d.ts +6 -1
- package/dist/inference/model-validator.d.ts.map +1 -1
- package/dist/inference/model-validator.js +7 -2
- package/dist/inference/model-validator.js.map +1 -1
- package/dist/inference/route-resolver.d.ts +116 -0
- package/dist/inference/route-resolver.d.ts.map +1 -0
- package/dist/inference/route-resolver.js +159 -0
- package/dist/inference/route-resolver.js.map +1 -0
- package/dist/inference/tools.d.ts.map +1 -1
- package/dist/inference/tools.js +29 -0
- package/dist/inference/tools.js.map +1 -1
- package/dist/learning/autonomy-policy.d.ts +18 -0
- package/dist/learning/autonomy-policy.d.ts.map +1 -1
- package/dist/learning/autonomy-policy.js +35 -0
- package/dist/learning/autonomy-policy.js.map +1 -1
- package/dist/learning/benchmark.d.ts.map +1 -1
- package/dist/learning/benchmark.js +3 -2
- package/dist/learning/benchmark.js.map +1 -1
- package/dist/learning/continuation.d.ts.map +1 -1
- package/dist/learning/continuation.js +2 -1
- package/dist/learning/continuation.js.map +1 -1
- package/dist/learning/cost-tracker.d.ts.map +1 -1
- package/dist/learning/cost-tracker.js +2 -1
- package/dist/learning/cost-tracker.js.map +1 -1
- package/dist/learning/deferred-task.d.ts.map +1 -1
- package/dist/learning/deferred-task.js +13 -4
- package/dist/learning/deferred-task.js.map +1 -1
- package/dist/learning/eval-framework.d.ts.map +1 -1
- package/dist/learning/eval-framework.js +2 -1
- package/dist/learning/eval-framework.js.map +1 -1
- package/dist/learning/long-form.d.ts.map +1 -1
- package/dist/learning/long-form.js +2 -1
- package/dist/learning/long-form.js.map +1 -1
- package/dist/learning/model-registry.d.ts.map +1 -1
- package/dist/learning/model-registry.js +2 -1
- package/dist/learning/model-registry.js.map +1 -1
- package/dist/learning/reasoning-cache.d.ts.map +1 -1
- package/dist/learning/reasoning-cache.js +2 -1
- package/dist/learning/reasoning-cache.js.map +1 -1
- package/dist/learning/reasoning-trace.d.ts +38 -2
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js +91 -1
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/resilient-call.d.ts.map +1 -1
- package/dist/learning/resilient-call.js +31 -18
- package/dist/learning/resilient-call.js.map +1 -1
- package/dist/learning/retrieval.d.ts.map +1 -1
- package/dist/learning/retrieval.js +2 -1
- package/dist/learning/retrieval.js.map +1 -1
- package/dist/learning/seeded-benchmark.d.ts +160 -0
- package/dist/learning/seeded-benchmark.d.ts.map +1 -0
- package/dist/learning/seeded-benchmark.js +321 -0
- package/dist/learning/seeded-benchmark.js.map +1 -0
- package/dist/learning/seeded-bugs.d.ts +142 -0
- package/dist/learning/seeded-bugs.d.ts.map +1 -0
- package/dist/learning/seeded-bugs.js +535 -0
- package/dist/learning/seeded-bugs.js.map +1 -0
- package/dist/learning/skill-store.d.ts.map +1 -1
- package/dist/learning/skill-store.js +30 -9
- package/dist/learning/skill-store.js.map +1 -1
- package/dist/learning/step-checkpoint.d.ts +127 -0
- package/dist/learning/step-checkpoint.d.ts.map +1 -0
- package/dist/learning/step-checkpoint.js +244 -0
- package/dist/learning/step-checkpoint.js.map +1 -0
- package/dist/mcp/catalog.js +2 -3
- package/dist/mcp/catalog.js.map +1 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +5 -3
- package/dist/mcp/manager.js.map +1 -1
- package/dist/nlu/intent-confirm.d.ts +23 -1
- package/dist/nlu/intent-confirm.d.ts.map +1 -1
- package/dist/nlu/intent-confirm.js +85 -2
- package/dist/nlu/intent-confirm.js.map +1 -1
- package/dist/nlu/learnings.d.ts +7 -0
- package/dist/nlu/learnings.d.ts.map +1 -1
- package/dist/nlu/learnings.js +7 -0
- package/dist/nlu/learnings.js.map +1 -1
- package/dist/observability/debug-log.d.ts +250 -0
- package/dist/observability/debug-log.d.ts.map +1 -0
- package/dist/observability/debug-log.js +500 -0
- package/dist/observability/debug-log.js.map +1 -0
- package/dist/observability/event-bus.d.ts.map +1 -1
- package/dist/observability/event-bus.js +4 -1
- package/dist/observability/event-bus.js.map +1 -1
- package/dist/observability/otel.d.ts +278 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +590 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/parity/drivers.d.ts +99 -0
- package/dist/parity/drivers.d.ts.map +1 -0
- package/dist/parity/drivers.js +1362 -0
- package/dist/parity/drivers.js.map +1 -0
- package/dist/parity/graph.d.ts +73 -0
- package/dist/parity/graph.d.ts.map +1 -0
- package/dist/parity/graph.js +162 -0
- package/dist/parity/graph.js.map +1 -0
- package/dist/parity/matrix.d.ts +105 -0
- package/dist/parity/matrix.d.ts.map +1 -0
- package/dist/parity/matrix.js +352 -0
- package/dist/parity/matrix.js.map +1 -0
- package/dist/parity/observation.d.ts +444 -0
- package/dist/parity/observation.d.ts.map +1 -0
- package/dist/parity/observation.js +333 -0
- package/dist/parity/observation.js.map +1 -0
- package/dist/parity/scenarios.d.ts +229 -0
- package/dist/parity/scenarios.d.ts.map +1 -0
- package/dist/parity/scenarios.js +175 -0
- package/dist/parity/scenarios.js.map +1 -0
- package/dist/parity/surfaces.d.ts +122 -0
- package/dist/parity/surfaces.d.ts.map +1 -0
- package/dist/parity/surfaces.js +190 -0
- package/dist/parity/surfaces.js.map +1 -0
- package/dist/runtime/fault-injection.d.ts +173 -0
- package/dist/runtime/fault-injection.d.ts.map +1 -0
- package/dist/runtime/fault-injection.js +281 -0
- package/dist/runtime/fault-injection.js.map +1 -0
- package/dist/skills/secret-capture.d.ts.map +1 -1
- package/dist/skills/secret-capture.js +9 -4
- package/dist/skills/secret-capture.js.map +1 -1
- package/dist/tools/child-agent-entry.d.ts +23 -0
- package/dist/tools/child-agent-entry.d.ts.map +1 -0
- package/dist/tools/child-agent-entry.js +129 -0
- package/dist/tools/child-agent-entry.js.map +1 -0
- package/dist/tools/child-agent-runtime.d.ts +124 -0
- package/dist/tools/child-agent-runtime.d.ts.map +1 -0
- package/dist/tools/child-agent-runtime.js +704 -0
- package/dist/tools/child-agent-runtime.js.map +1 -0
- package/dist/tools/coding-tools.d.ts.map +1 -1
- package/dist/tools/coding-tools.js +82 -10
- package/dist/tools/coding-tools.js.map +1 -1
- package/dist/tools/credentials-tool.d.ts +24 -0
- package/dist/tools/credentials-tool.d.ts.map +1 -0
- package/dist/tools/credentials-tool.js +125 -0
- package/dist/tools/credentials-tool.js.map +1 -0
- package/dist/tools/delegation-system.d.ts +31 -0
- package/dist/tools/delegation-system.d.ts.map +1 -1
- package/dist/tools/delegation-system.js +70 -9
- package/dist/tools/delegation-system.js.map +1 -1
- package/dist/tools/extract/docx.d.ts +27 -0
- package/dist/tools/extract/docx.d.ts.map +1 -0
- package/dist/tools/extract/docx.js +48 -0
- package/dist/tools/extract/docx.js.map +1 -0
- package/dist/tools/extract/html-text.d.ts +27 -0
- package/dist/tools/extract/html-text.d.ts.map +1 -0
- package/dist/tools/extract/html-text.js +86 -0
- package/dist/tools/extract/html-text.js.map +1 -0
- package/dist/tools/extract/pdf-ocr.d.ts +58 -0
- package/dist/tools/extract/pdf-ocr.d.ts.map +1 -0
- package/dist/tools/extract/pdf-ocr.js +116 -0
- package/dist/tools/extract/pdf-ocr.js.map +1 -0
- package/dist/tools/extract/pdf.d.ts +65 -0
- package/dist/tools/extract/pdf.d.ts.map +1 -0
- package/dist/tools/extract/pdf.js +197 -0
- package/dist/tools/extract/pdf.js.map +1 -0
- package/dist/tools/extract/pptx.d.ts +32 -0
- package/dist/tools/extract/pptx.d.ts.map +1 -0
- package/dist/tools/extract/pptx.js +77 -0
- package/dist/tools/extract/pptx.js.map +1 -0
- package/dist/tools/extract/xlsx.d.ts +47 -0
- package/dist/tools/extract/xlsx.d.ts.map +1 -0
- package/dist/tools/extract/xlsx.js +111 -0
- package/dist/tools/extract/xlsx.js.map +1 -0
- package/dist/tools/finding-tool.d.ts +76 -0
- package/dist/tools/finding-tool.d.ts.map +1 -0
- package/dist/tools/finding-tool.js +125 -0
- package/dist/tools/finding-tool.js.map +1 -0
- package/dist/tools/git-tool.d.ts +25 -7
- package/dist/tools/git-tool.d.ts.map +1 -1
- package/dist/tools/git-tool.js +155 -15
- package/dist/tools/git-tool.js.map +1 -1
- package/dist/tools/loop-project-context.d.ts.map +1 -1
- package/dist/tools/loop-project-context.js +16 -0
- package/dist/tools/loop-project-context.js.map +1 -1
- package/dist/tools/loop-route-feed.d.ts +57 -0
- package/dist/tools/loop-route-feed.d.ts.map +1 -0
- package/dist/tools/loop-route-feed.js +101 -0
- package/dist/tools/loop-route-feed.js.map +1 -0
- package/dist/tools/messaging-tools.d.ts +41 -11
- package/dist/tools/messaging-tools.d.ts.map +1 -1
- package/dist/tools/messaging-tools.js +104 -55
- package/dist/tools/messaging-tools.js.map +1 -1
- package/dist/tools/neutts-synth.d.ts +27 -3
- package/dist/tools/neutts-synth.d.ts.map +1 -1
- package/dist/tools/neutts-synth.js +57 -13
- package/dist/tools/neutts-synth.js.map +1 -1
- package/dist/tools/pipeline-tool.d.ts +43 -1
- package/dist/tools/pipeline-tool.d.ts.map +1 -1
- package/dist/tools/pipeline-tool.js +21 -4
- package/dist/tools/pipeline-tool.js.map +1 -1
- package/dist/tools/publish-tool.d.ts.map +1 -1
- package/dist/tools/publish-tool.js +76 -10
- package/dist/tools/publish-tool.js.map +1 -1
- package/dist/tools/read-extract.d.ts +116 -45
- package/dist/tools/read-extract.d.ts.map +1 -1
- package/dist/tools/read-extract.js +494 -158
- package/dist/tools/read-extract.js.map +1 -1
- package/dist/tools/registry.d.ts +23 -3
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +196 -29
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/run-terminal.d.ts +9 -0
- package/dist/tools/run-terminal.d.ts.map +1 -1
- package/dist/tools/run-terminal.js +80 -2
- package/dist/tools/run-terminal.js.map +1 -1
- package/dist/tools/subagent-refusal.d.ts +15 -0
- package/dist/tools/subagent-refusal.d.ts.map +1 -0
- package/dist/tools/subagent-refusal.js +18 -0
- package/dist/tools/subagent-refusal.js.map +1 -0
- package/dist/tools/subagent-spawner.d.ts +122 -0
- package/dist/tools/subagent-spawner.d.ts.map +1 -1
- package/dist/tools/subagent-spawner.js +249 -28
- package/dist/tools/subagent-spawner.js.map +1 -1
- package/dist/tools/tool-hooks.d.ts +177 -0
- package/dist/tools/tool-hooks.d.ts.map +1 -0
- package/dist/tools/tool-hooks.js +427 -0
- package/dist/tools/tool-hooks.js.map +1 -0
- package/dist/tools/tool-loop.d.ts +94 -5
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +315 -9
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/tools/tool-refusal.d.ts +68 -0
- package/dist/tools/tool-refusal.d.ts.map +1 -0
- package/dist/tools/tool-refusal.js +78 -0
- package/dist/tools/tool-refusal.js.map +1 -0
- package/dist/tools/toolsets.d.ts +8 -0
- package/dist/tools/toolsets.d.ts.map +1 -1
- package/dist/tools/toolsets.js +14 -4
- package/dist/tools/toolsets.js.map +1 -1
- package/dist/tools/vision-tools.d.ts +88 -83
- package/dist/tools/vision-tools.d.ts.map +1 -1
- package/dist/tools/vision-tools.js +134 -103
- package/dist/tools/vision-tools.js.map +1 -1
- package/dist/tools/worktree.d.ts +210 -0
- package/dist/tools/worktree.d.ts.map +1 -0
- package/dist/tools/worktree.js +374 -0
- package/dist/tools/worktree.js.map +1 -0
- package/dist/utils/format.d.ts +3 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +32 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/web-dashboard/attachment-extract.d.ts +64 -0
- package/dist/web-dashboard/attachment-extract.d.ts.map +1 -0
- package/dist/web-dashboard/attachment-extract.js +154 -0
- package/dist/web-dashboard/attachment-extract.js.map +1 -0
- package/dist/web-dashboard/chat-console.d.ts +108 -1
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +36 -0
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/hub-data.d.ts +37 -0
- package/dist/web-dashboard/hub-data.d.ts.map +1 -1
- package/dist/web-dashboard/hub-data.js +61 -1
- package/dist/web-dashboard/hub-data.js.map +1 -1
- package/dist/web-dashboard/server.d.ts +14 -0
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +247 -13
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +196 -48
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/dist/workflow/registry.js +1 -1
- package/dist/workflow/registry.js.map +1 -1
- package/package.json +22 -6
- package/src/web-dashboard/public/assets/{index-Cyd6tIew.css → index-XJjj2cBX.css} +1 -1
- package/src/web-dashboard/public/assets/index-YWF9FpwQ.js +207 -0
- package/src/web-dashboard/public/assets/index-YWF9FpwQ.js.map +1 -0
- package/src/web-dashboard/public/index.html +2 -2
- package/dist/tools/child-agent-worker.js +0 -212
- package/src/web-dashboard/public/assets/index-CjvoBhlz.js +0 -207
- package/src/web-dashboard/public/assets/index-CjvoBhlz.js.map +0 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WS1 (#23) — `finding`: the model states a CLAIM, the gate decides the VERDICT.
|
|
3
|
+
*
|
|
4
|
+
* WHY A TOOL, AND WHY IT DOES NOT ACCEPT A VERDICT. `src/findings/verdicts.ts`
|
|
5
|
+
* is the vocabulary and the gate; it deliberately does not decide who may
|
|
6
|
+
* produce a finding (`intent-confirm` produces one for a routing decision). This
|
|
7
|
+
* is the producer for an ORDINARY turn on every surface, and the one design rule
|
|
8
|
+
* that matters is here: the model may supply the claim, the outcome and the
|
|
9
|
+
* evidence, and must NOT be able to supply the verdict. A tool argument called
|
|
10
|
+
* `verdict` would be the exact bypass the gate exists to refuse — the model
|
|
11
|
+
* typing "CONFIRMED" is the false-success defect with a nicer name — so the
|
|
12
|
+
* parameter does not exist. `confirmFinding` promotes to CONFIRMED only when at
|
|
13
|
+
* least one non-blank evidence reference was supplied, and refuses otherwise
|
|
14
|
+
* with the reason attached.
|
|
15
|
+
*
|
|
16
|
+
* WHAT THE MODEL SEES BACK is the rendered finding (`describeFinding`), including
|
|
17
|
+
* the honest line for a PLAUSIBLE one ("no evidence — reported as PLAUSIBLE, not
|
|
18
|
+
* verified"). That is the point of returning the render rather than a summary: a
|
|
19
|
+
* model that states a claim with no evidence is told, in the tool result it must
|
|
20
|
+
* act on, that the claim was recorded as unverified rather than as fact.
|
|
21
|
+
*
|
|
22
|
+
* THE STRUCTURED COPY travels to the surface on the context bus as
|
|
23
|
+
* `finding:recorded` (the same mechanism `plan_todo` uses for `plan:changed`),
|
|
24
|
+
* so every surface reports the SAME wire form — which is what
|
|
25
|
+
* `findings-verdicts@<surface>` is proved against.
|
|
26
|
+
*
|
|
27
|
+
* A CALL THAT RECORDED NOTHING IS A FAILURE. A blank claim or a blank outcome
|
|
28
|
+
* returns `Error:` (the loop's own accounting is `ok: !startsWith('Error:')`),
|
|
29
|
+
* because a finding with no claim is not a finding — and reporting one as a
|
|
30
|
+
* successful call would be this repository's recurring defect in miniature.
|
|
31
|
+
*/
|
|
32
|
+
import { z } from 'zod';
|
|
33
|
+
import { confirmFinding, describeFinding, plausibleFinding, toWire, } from '../findings/verdicts.js';
|
|
34
|
+
/** The registry name — one place, so the toolset/core lists and the tests agree. */
|
|
35
|
+
export const FINDING_TOOL_NAME = 'finding';
|
|
36
|
+
/**
|
|
37
|
+
* The bus event carrying the structured wire finding.
|
|
38
|
+
*
|
|
39
|
+
* Named `finding:recorded` (past tense) on purpose: the event is emitted AFTER
|
|
40
|
+
* the gate has decided, so a listener never sees a claim whose verdict is still
|
|
41
|
+
* being computed — the same convention `plan:changed` follows.
|
|
42
|
+
*/
|
|
43
|
+
export const FINDING_EVENT = 'finding:recorded';
|
|
44
|
+
/** The evidence kinds the model may cite (the closed set the gate normalises to). */
|
|
45
|
+
const EVIDENCE_KINDS = ['quote', 'command', 'file', 'observation'];
|
|
46
|
+
/** `finding` args. There is deliberately no `verdict` field — see the header. */
|
|
47
|
+
export const findingSchema = z.object({
|
|
48
|
+
claim: z
|
|
49
|
+
.string()
|
|
50
|
+
.describe('What is being asserted, in the words the reader will see — e.g. "the login endpoint rejects an expired token".'),
|
|
51
|
+
outcome: z
|
|
52
|
+
.string()
|
|
53
|
+
.describe('What BECAME of the claim: verified, corrected, dropped, still open. A finding with no outcome is a status report, not a finding.'),
|
|
54
|
+
evidence: z
|
|
55
|
+
.array(z.object({
|
|
56
|
+
kind: z.enum(EVIDENCE_KINDS).describe('The sort of check that was performed.'),
|
|
57
|
+
ref: z
|
|
58
|
+
.string()
|
|
59
|
+
.describe('The evidence ITSELF — a verbatim quote from the input, the exact command line, the path that was read, or a value a probe returned. A restatement of the claim is not evidence, and a blank reference is not a check.'),
|
|
60
|
+
detail: z.string().optional().describe('Optional context: the command output, the surrounding line, why it matters.'),
|
|
61
|
+
}))
|
|
62
|
+
.optional()
|
|
63
|
+
.describe('The checks actually performed. Supply this and the finding is recorded CONFIRMED; omit it (or leave a reference blank) and it is recorded PLAUSIBLE, unverified — which is an honest, useful result, not an error.'),
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* Record one finding: build it PLAUSIBLE, let the gate decide, report it.
|
|
67
|
+
*
|
|
68
|
+
* Split out from the `Tool` wrapper so the behaviour is testable without the
|
|
69
|
+
* registry, and so a caller that already has a context (the child process) can
|
|
70
|
+
* reuse it.
|
|
71
|
+
*/
|
|
72
|
+
export function recordFinding(args, ctx) {
|
|
73
|
+
const claim = String(args?.claim ?? '').trim();
|
|
74
|
+
const outcome = String(args?.outcome ?? '').trim();
|
|
75
|
+
if (!claim) {
|
|
76
|
+
return {
|
|
77
|
+
error: "Error: finding needs a 'claim' — what is being asserted, in the words the user will read. " +
|
|
78
|
+
'A finding with no claim records nothing.',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (!outcome) {
|
|
82
|
+
return {
|
|
83
|
+
error: "Error: finding needs an 'outcome' — what became of the claim (verified, corrected, dropped, still open). " +
|
|
84
|
+
'A finding with no outcome is a status report, not a finding.',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const evidence = (args.evidence ?? []);
|
|
88
|
+
// The gate, not the caller, decides. `confirmFinding` returns the finding
|
|
89
|
+
// STILL PLAUSIBLE (with the reason) when no usable evidence was supplied; that
|
|
90
|
+
// refusal is a normal outcome, so it is recorded in the outcome line rather
|
|
91
|
+
// than thrown.
|
|
92
|
+
const promotion = confirmFinding(plausibleFinding({ claim, outcome, source: 'agent', evidence }), [], { outcome });
|
|
93
|
+
const finding = promotion.promoted
|
|
94
|
+
? promotion.finding
|
|
95
|
+
: promotion.reason
|
|
96
|
+
? { ...promotion.finding, outcome: `${outcome} — ${promotion.reason}` }
|
|
97
|
+
: promotion.finding;
|
|
98
|
+
// Best-effort: a listener that is not there (a direct tool call, a test) must
|
|
99
|
+
// never break the tool, exactly like `plan_todo`'s snapshot emit.
|
|
100
|
+
try {
|
|
101
|
+
ctx?.emit?.(FINDING_EVENT, toWire(finding));
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
/* best-effort */
|
|
105
|
+
}
|
|
106
|
+
return { finding, text: describeFinding(finding) };
|
|
107
|
+
}
|
|
108
|
+
/** The `finding` tool as the registry takes it. */
|
|
109
|
+
export function createFindingTool() {
|
|
110
|
+
return {
|
|
111
|
+
name: FINDING_TOOL_NAME,
|
|
112
|
+
description: 'Record one finding — a claim about the world, with a verdict you do NOT set. Supply `claim` + `outcome`, and `evidence` for anything you actually CHECKED (a command and its real output, a path you read, a quote from the request, a value a probe returned): usable evidence records the finding CONFIRMED, and no usable evidence records it PLAUSIBLE (an honest, useful result — never a failure). Use it whenever your answer asserts something a second party could check, so the user can tell what was verified from what is a reasoned guess.',
|
|
113
|
+
category: 'experience',
|
|
114
|
+
inputSchema: findingSchema,
|
|
115
|
+
endsAgentStep: false,
|
|
116
|
+
run: async (args, ctx) => {
|
|
117
|
+
const parsed = findingSchema.parse(args);
|
|
118
|
+
const result = recordFinding(parsed, ctx);
|
|
119
|
+
if ('error' in result)
|
|
120
|
+
return result.error;
|
|
121
|
+
return result.text;
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=finding-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding-tool.js","sourceRoot":"","sources":["../../src/tools/finding-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/git-tool.d.ts
CHANGED
|
@@ -19,14 +19,26 @@
|
|
|
19
19
|
* those are staged+committed ("accept/reject applies only accepted
|
|
20
20
|
* hunks" — the model shows the diff card, the user picks files, the
|
|
21
21
|
* commit touches nothing else).
|
|
22
|
+
* - `push` — GATED, and the strictest gate here: a push is the one git action
|
|
23
|
+
* whose effect is visible OUTSIDE this machine (a remote other people and CI
|
|
24
|
+
* read). It proceeds when the user's OWN REQUEST named it ("commit and push
|
|
25
|
+
* this to GitHub" — the evidence is in `requestRequestsPush`, so the ask is
|
|
26
|
+
* not a round trip), and it ASKS otherwise. A request that only asked to
|
|
27
|
+
* record work locally ("commit these changes") does not unlock it: the agent
|
|
28
|
+
* must not decide on its own to publish someone's work.
|
|
22
29
|
*
|
|
23
30
|
* Security (deny-first, shared with run_terminal):
|
|
24
|
-
* - `git push
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
31
|
+
* - `git push` is reachable HERE (gated, argv-array, auditable) and DELIBERATELY
|
|
32
|
+
* still denied as a raw `run_terminal` shell string. The structured tool is
|
|
33
|
+
* the sanctioned path: it validates the remote/branch as literals, passes
|
|
34
|
+
* them as argv (injection impossible), reports what it pushed, and asks
|
|
35
|
+
* first. The unstructured shell string gets none of that, so it stays denied.
|
|
36
|
+
* - `git reset --hard`, `git clean`, `git checkout -- .` are STRUCTURALLY
|
|
37
|
+
* unexpressible (the action enum has no such action) AND deny-guarded —
|
|
38
|
+
* there is no gated variant of them because no user request makes an
|
|
39
|
+
* irreversible working-tree wipe the right thing to do in a tool call.
|
|
40
|
+
* - argv-array exec (execFileSync, NO shell) — the message/files/remote/branch
|
|
41
|
+
* are passed as arguments, injection is structurally impossible.
|
|
30
42
|
* - The commit message may be empty (git opens the editor — blocked):
|
|
31
43
|
* an empty message is refused with guidance instead.
|
|
32
44
|
*
|
|
@@ -36,7 +48,7 @@ import type { ToolContext } from './registry.js';
|
|
|
36
48
|
/** The tool's args (zod-validated in the registry). */
|
|
37
49
|
export interface GitToolArgs {
|
|
38
50
|
/** What to do. */
|
|
39
|
-
action: 'status' | 'log' | 'diff' | 'commit';
|
|
51
|
+
action: 'status' | 'log' | 'diff' | 'commit' | 'push';
|
|
40
52
|
/** Commit message (action=commit, required). */
|
|
41
53
|
message?: string;
|
|
42
54
|
/**
|
|
@@ -48,6 +60,12 @@ export interface GitToolArgs {
|
|
|
48
60
|
confirm?: boolean;
|
|
49
61
|
/** Limit for `log` (default 20). */
|
|
50
62
|
limit?: number;
|
|
63
|
+
/** Push destination (action=push, default: the repo's first remote). */
|
|
64
|
+
remote?: string;
|
|
65
|
+
/** Push source branch (action=push, default: the current branch). */
|
|
66
|
+
branch?: string;
|
|
67
|
+
/** action=push — also push tags (`git push --tags`). */
|
|
68
|
+
tags?: boolean;
|
|
51
69
|
}
|
|
52
70
|
/** The structured diff payload the GUI renders as a card. */
|
|
53
71
|
export interface GitDiffPayload {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-tool.d.ts","sourceRoot":"","sources":["../../src/tools/git-tool.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"git-tool.d.ts","sourceRoot":"","sources":["../../src/tools/git-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAOjD,uDAAuD;AACvD,MAAM,WAAW,WAAW;IAC1B,kBAAkB;IAClB,MAAM,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtD,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AA4ED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBzF;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7D;AAsGD,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA+GrF"}
|
package/dist/tools/git-tool.js
CHANGED
|
@@ -19,24 +19,42 @@
|
|
|
19
19
|
* those are staged+committed ("accept/reject applies only accepted
|
|
20
20
|
* hunks" — the model shows the diff card, the user picks files, the
|
|
21
21
|
* commit touches nothing else).
|
|
22
|
+
* - `push` — GATED, and the strictest gate here: a push is the one git action
|
|
23
|
+
* whose effect is visible OUTSIDE this machine (a remote other people and CI
|
|
24
|
+
* read). It proceeds when the user's OWN REQUEST named it ("commit and push
|
|
25
|
+
* this to GitHub" — the evidence is in `requestRequestsPush`, so the ask is
|
|
26
|
+
* not a round trip), and it ASKS otherwise. A request that only asked to
|
|
27
|
+
* record work locally ("commit these changes") does not unlock it: the agent
|
|
28
|
+
* must not decide on its own to publish someone's work.
|
|
22
29
|
*
|
|
23
30
|
* Security (deny-first, shared with run_terminal):
|
|
24
|
-
* - `git push
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
31
|
+
* - `git push` is reachable HERE (gated, argv-array, auditable) and DELIBERATELY
|
|
32
|
+
* still denied as a raw `run_terminal` shell string. The structured tool is
|
|
33
|
+
* the sanctioned path: it validates the remote/branch as literals, passes
|
|
34
|
+
* them as argv (injection impossible), reports what it pushed, and asks
|
|
35
|
+
* first. The unstructured shell string gets none of that, so it stays denied.
|
|
36
|
+
* - `git reset --hard`, `git clean`, `git checkout -- .` are STRUCTURALLY
|
|
37
|
+
* unexpressible (the action enum has no such action) AND deny-guarded —
|
|
38
|
+
* there is no gated variant of them because no user request makes an
|
|
39
|
+
* irreversible working-tree wipe the right thing to do in a tool call.
|
|
40
|
+
* - argv-array exec (execFileSync, NO shell) — the message/files/remote/branch
|
|
41
|
+
* are passed as arguments, injection is structurally impossible.
|
|
30
42
|
* - The commit message may be empty (git opens the editor — blocked):
|
|
31
43
|
* an empty message is refused with guidance instead.
|
|
32
44
|
*
|
|
33
45
|
* Never throws: every failure returns a helpful string.
|
|
34
46
|
*/
|
|
35
|
-
import { execFileSync } from 'node:child_process';
|
|
36
|
-
import { decideStateChange, requestRequestsCommit } from '../learning/autonomy-policy.js';
|
|
37
|
-
/**
|
|
47
|
+
import { execFileSync, spawnSync } from 'node:child_process';
|
|
48
|
+
import { decideStateChange, requestRequestsCommit, requestRequestsPush, } from '../learning/autonomy-policy.js';
|
|
49
|
+
/**
|
|
50
|
+
* Action names that map to denied git commands — parity with run_terminal.
|
|
51
|
+
*
|
|
52
|
+
* `push` is deliberately ABSENT: it is a real, gated action on this tool (see
|
|
53
|
+
* the module docstring), while the raw `git push` shell string stays denied in
|
|
54
|
+
* run_terminal. Everything here destroys working-tree state that no request
|
|
55
|
+
* makes safe to do from a tool call.
|
|
56
|
+
*/
|
|
38
57
|
const DENIED_ACTIONS = {
|
|
39
|
-
push: 'git push is denied — pushing is a human decision, never an autonomous loop.',
|
|
40
58
|
'reset --hard': 'git reset --hard is denied — it destroys the working tree irreversibly.',
|
|
41
59
|
clean: 'git clean is denied — it removes untracked files irreversibly.',
|
|
42
60
|
'checkout -- .': 'git checkout -- . is denied — it discards working-tree changes irreversibly.',
|
|
@@ -47,14 +65,23 @@ const DENIED_ACTIONS = {
|
|
|
47
65
|
// NOTE: \s is deliberately NOT here — commit messages and file names contain
|
|
48
66
|
// spaces legitimately and argv exec passes them safely.
|
|
49
67
|
const SHELL_METACHARS = /[;&|`$()<>"'\\]/;
|
|
68
|
+
/**
|
|
69
|
+
* A remote name or ref that is safe as an argv literal.
|
|
70
|
+
*
|
|
71
|
+
* The push path is the one place a caller-supplied string reaches a network
|
|
72
|
+
* command, so it is allow-listed rather than deny-listed: letters/digits first
|
|
73
|
+
* (never a leading `-`, which is how an argv entry turns into an option), then
|
|
74
|
+
* the punctuation real branch names use (`feature/x`, `v3.3.2`, `release_1`).
|
|
75
|
+
*/
|
|
76
|
+
const SAFE_REF_RE = /^[A-Za-z0-9][A-Za-z0-9._/-]*$/;
|
|
50
77
|
/** Run git with an argv array (no shell). Returns stdout or a masked error. */
|
|
51
|
-
function git(argv, ctx) {
|
|
78
|
+
function git(argv, ctx, timeoutMs = 60_000) {
|
|
52
79
|
try {
|
|
53
80
|
const out = execFileSync('git', argv, {
|
|
54
81
|
cwd: ctx.cwd || process.cwd(),
|
|
55
82
|
encoding: 'utf-8',
|
|
56
83
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
57
|
-
timeout:
|
|
84
|
+
timeout: timeoutMs,
|
|
58
85
|
});
|
|
59
86
|
return { ok: true, out: out.trim() };
|
|
60
87
|
}
|
|
@@ -64,6 +91,27 @@ function git(argv, ctx) {
|
|
|
64
91
|
return { ok: false, out: detail || 'git failed', code: e.status };
|
|
65
92
|
}
|
|
66
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Run a git subcommand that reports its progress on STDERR and capture BOTH
|
|
96
|
+
* streams.
|
|
97
|
+
*
|
|
98
|
+
* `execFileSync` returns stdout only, and a successful `git push` writes
|
|
99
|
+
* everything it has to say ("To <url> … main -> main", "Everything up-to-date")
|
|
100
|
+
* to stderr — so a push reported through the stdout-only helper would look like
|
|
101
|
+
* it said nothing at all. Returns a never-empty string so a result line can
|
|
102
|
+
* always show what git actually printed.
|
|
103
|
+
*/
|
|
104
|
+
function gitCombined(argv, ctx, timeoutMs) {
|
|
105
|
+
const r = spawnSync('git', argv, {
|
|
106
|
+
cwd: ctx.cwd || process.cwd(),
|
|
107
|
+
encoding: 'utf-8',
|
|
108
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
109
|
+
timeout: timeoutMs,
|
|
110
|
+
});
|
|
111
|
+
const text = `${r.stdout ?? ''}${r.stderr ?? ''}`.trim();
|
|
112
|
+
const failed = r.error ? String(r.error.message) : '';
|
|
113
|
+
return { ok: r.status === 0, out: text || failed || 'git reported no output' };
|
|
114
|
+
}
|
|
67
115
|
/** Split a unified diff into per-file sections (diff --git … hunk blocks). */
|
|
68
116
|
export function parseDiffIntoSections(diff) {
|
|
69
117
|
if (!diff.trim())
|
|
@@ -90,17 +138,105 @@ export function parseDiffIntoSections(diff) {
|
|
|
90
138
|
export function deniedGitAction(action) {
|
|
91
139
|
return DENIED_ACTIONS[action] ?? null;
|
|
92
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* The push action — the only git operation here whose effect LEAVES this machine.
|
|
143
|
+
*
|
|
144
|
+
* Gate: the user's OWN REQUEST must have named the push, or the model must have
|
|
145
|
+
* confirmed with the user first. A local-only commit request does NOT authorize
|
|
146
|
+
* it. That asymmetry with {@link runGitTool}'s commit path is the point: a commit
|
|
147
|
+
* is undone by a reset, while a push is read by everyone with access to the
|
|
148
|
+
* remote and acted on by CI, so the agent must not infer it from work the user
|
|
149
|
+
* only asked to record.
|
|
150
|
+
*
|
|
151
|
+
* Every caller-supplied ref is allow-listed ({@link SAFE_REF_RE}) and passed as
|
|
152
|
+
* an argv literal, so neither an option-injection (`--force`) nor a shell
|
|
153
|
+
* metacharacter can travel through it.
|
|
154
|
+
*/
|
|
155
|
+
async function pushAction(args, ctx) {
|
|
156
|
+
const remoteArg = String(args.remote ?? '').trim();
|
|
157
|
+
const branchArg = String(args.branch ?? '').trim();
|
|
158
|
+
for (const [label, value] of [['remote', remoteArg], ['branch', branchArg]]) {
|
|
159
|
+
if (!value)
|
|
160
|
+
continue;
|
|
161
|
+
if (!SAFE_REF_RE.test(value) || value.includes('..')) {
|
|
162
|
+
return `Error: git push ${label} '${value}' is not a plain remote/branch name — denied.`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Resolve the defaults from the repository, so BOTH the confirmation and the
|
|
166
|
+
// result can name exactly what moves.
|
|
167
|
+
let remote = remoteArg;
|
|
168
|
+
if (!remote) {
|
|
169
|
+
const remotes = git(['remote'], ctx);
|
|
170
|
+
remote = remotes.ok ? (remotes.out.split('\n')[0] ?? '').trim() : '';
|
|
171
|
+
}
|
|
172
|
+
if (!remote) {
|
|
173
|
+
return ('Error: git push has no remote to push to. Add one first ' +
|
|
174
|
+
'(git remote add origin <url>), or pass remote explicitly.');
|
|
175
|
+
}
|
|
176
|
+
let branch = branchArg;
|
|
177
|
+
if (!branch) {
|
|
178
|
+
const head = git(['rev-parse', '--abbrev-ref', 'HEAD'], ctx);
|
|
179
|
+
branch = head.ok ? head.out.trim() : '';
|
|
180
|
+
}
|
|
181
|
+
if (!branch || branch === 'HEAD') {
|
|
182
|
+
return 'Error: git push needs a branch to push, and HEAD is detached. Check out a branch, or pass branch explicitly.';
|
|
183
|
+
}
|
|
184
|
+
// ── The gate ────────────────────────────────────────────────────────────
|
|
185
|
+
const namedByRequest = requestRequestsPush(ctx.authorizationRequest ?? '');
|
|
186
|
+
if (!args.confirm && !namedByRequest) {
|
|
187
|
+
// `external` is what makes the ask unconditional here — even a request that
|
|
188
|
+
// authorized writes cannot authorize this, because it was not the user who
|
|
189
|
+
// decided the work should leave this machine.
|
|
190
|
+
const verdict = decideStateChange({
|
|
191
|
+
tool: 'git push',
|
|
192
|
+
action: `pushing ${branch} to '${remote}'`,
|
|
193
|
+
changeClass: 'external',
|
|
194
|
+
namedByRequest: false,
|
|
195
|
+
authorizedByRequest: ctx.writesAuthorized?.authorized === true,
|
|
196
|
+
});
|
|
197
|
+
return (`git push: pushing ${branch} to '${remote}' sends this work to a remote that other ` +
|
|
198
|
+
`people and CI can see, so it is the user's call (${verdict.reason}). ` +
|
|
199
|
+
'Call ask_user (show the branch, the remote, and the commits that would move), then ' +
|
|
200
|
+
're-call git push with confirm:true only if the user agreed.');
|
|
201
|
+
}
|
|
202
|
+
// Longer than the read-only timeout: a push carries the whole working history
|
|
203
|
+
// over the network, and timing out mid-push is worse than waiting.
|
|
204
|
+
const pushed = gitCombined(['push', '-u', remote, branch], ctx, 180_000);
|
|
205
|
+
if (!pushed.ok)
|
|
206
|
+
return `git push failed: ${pushed.out}`;
|
|
207
|
+
let tagsNote = '';
|
|
208
|
+
if (args.tags) {
|
|
209
|
+
const tags = gitCombined(['push', remote, '--tags'], ctx, 120_000);
|
|
210
|
+
tagsNote = tags.ok ? '; pushed tags' : `; but pushing tags failed: ${tags.out}`;
|
|
211
|
+
}
|
|
212
|
+
const reported = !args.confirm;
|
|
213
|
+
if (reported) {
|
|
214
|
+
// Reported, never silent — same contract as the commit path's autonomous
|
|
215
|
+
// write: the user must be able to see where their work just went.
|
|
216
|
+
ctx.emit?.('autonomy:write-applied', {
|
|
217
|
+
tool: 'git push',
|
|
218
|
+
remote,
|
|
219
|
+
branch,
|
|
220
|
+
reason: 'the request itself names the push',
|
|
221
|
+
}, 'tool-loop');
|
|
222
|
+
}
|
|
223
|
+
const result = `✅ Pushed ${branch} → ${remote}${tagsNote}:\n${pushed.out.slice(0, 800)}`;
|
|
224
|
+
if (!reported)
|
|
225
|
+
return result;
|
|
226
|
+
return (`${result}\n💡 Pushed without asking: the request itself named the push. ` +
|
|
227
|
+
'State the push in your answer so the user can see where the work went.');
|
|
228
|
+
}
|
|
93
229
|
export async function runGitTool(args, ctx) {
|
|
94
230
|
const action = String(args?.action ?? '').trim();
|
|
95
231
|
if (!action)
|
|
96
|
-
return 'Error: git tool needs an action (status | log | diff | commit).';
|
|
232
|
+
return 'Error: git tool needs an action (status | log | diff | commit | push).';
|
|
97
233
|
// Deny guard — an action that maps to a run_terminal-denied command is
|
|
98
234
|
// refused before anything runs (parity with the shared deny list).
|
|
99
235
|
const denied = deniedGitAction(action);
|
|
100
236
|
if (denied)
|
|
101
237
|
return `Error: ${denied}`;
|
|
102
|
-
if (!['status', 'log', 'diff', 'commit'].includes(action)) {
|
|
103
|
-
return `Error: unknown git action '${action}' — use status | log | diff | commit.`;
|
|
238
|
+
if (!['status', 'log', 'diff', 'commit', 'push'].includes(action)) {
|
|
239
|
+
return `Error: unknown git action '${action}' — use status | log | diff | commit | push.`;
|
|
104
240
|
}
|
|
105
241
|
if (action === 'status') {
|
|
106
242
|
const r = git(['status', '--short'], ctx);
|
|
@@ -132,6 +268,10 @@ export async function runGitTool(args, ctx) {
|
|
|
132
268
|
const files = sections.map((s) => s.path).join(', ');
|
|
133
269
|
return `git diff — ${payload.summary}: ${files}\n${r.out.slice(0, 6000)}`;
|
|
134
270
|
}
|
|
271
|
+
// ── action === 'push' — the OUTBOUND path (external effect, own gate) ───
|
|
272
|
+
if (action === 'push') {
|
|
273
|
+
return pushAction(args, ctx);
|
|
274
|
+
}
|
|
135
275
|
// ── action === 'commit' — the GATED path ────────────────────────────────
|
|
136
276
|
const message = String(args.message ?? '').trim();
|
|
137
277
|
if (!message) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-tool.js","sourceRoot":"","sources":["../../src/tools/git-tool.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"git-tool.js","sourceRoot":"","sources":["../../src/tools/git-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-project-context.d.ts","sourceRoot":"","sources":["../../src/tools/loop-project-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;
|
|
1
|
+
{"version":3,"file":"loop-project-context.d.ts","sourceRoot":"","sources":["../../src/tools/loop-project-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAwBH,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBrD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAwCrD;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+D1E"}
|
|
@@ -29,6 +29,7 @@ import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
|
29
29
|
import { join } from 'node:path';
|
|
30
30
|
import { buildGitStateDigest } from './git-digest.js';
|
|
31
31
|
import { assessProject } from '../agents/prompt-assembly.js';
|
|
32
|
+
import { handoffBlockFor } from '../agents/step-handoff.js';
|
|
32
33
|
/** Hard budget: the tree block is truncated to this many lines (~1.5K tokens). */
|
|
33
34
|
const MAX_TREE_LINES = 60;
|
|
34
35
|
/** Max tree depth (BFS) — deep node_modules-style nesting is noise at this budget. */
|
|
@@ -143,6 +144,21 @@ export async function buildLoopProjectContext(dir) {
|
|
|
143
144
|
catch {
|
|
144
145
|
lines.push('## Project', `- path: ${dir}`);
|
|
145
146
|
}
|
|
147
|
+
// ── Unfinished work from earlier attempts in this project ──
|
|
148
|
+
// The loop engine re-reads the tree and re-plans on every turn, so without
|
|
149
|
+
// this a repeated or reworded ask restarts from zero even when a previous
|
|
150
|
+
// attempt already put half the deliverable on disk (see step-handoff.ts).
|
|
151
|
+
// Read and reconciled on EVERY context build, not only on an explicit
|
|
152
|
+
// resume. Self-labelled and self-bounded, so it is pushed as-is; a clean
|
|
153
|
+
// project adds nothing.
|
|
154
|
+
try {
|
|
155
|
+
const handoff = handoffBlockFor(dir);
|
|
156
|
+
if (handoff)
|
|
157
|
+
lines.push('## Unfinished work (hand-off)', handoff);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Hand-off read is best-effort — omit on failure.
|
|
161
|
+
}
|
|
146
162
|
// ── Bounded file tree ──
|
|
147
163
|
try {
|
|
148
164
|
const treeLines = walkBoundedTree(dir);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-project-context.js","sourceRoot":"","sources":["../../src/tools/loop-project-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"loop-project-context.js","sourceRoot":"","sources":["../../src/tools/loop-project-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The route feed — what the model is TOLD about the model that is serving it.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. The loop's system prompt describes the tool surface, the
|
|
5
|
+
* project, and the contract, and it says nothing about the route. So when a user
|
|
6
|
+
* asks "which model are you?" — or when the model narrates its own run — the only
|
|
7
|
+
* available answers are a guess, the user's config (`nuviraconfig.json`, which is
|
|
8
|
+
* what the ROUTER reads, not what answered), or a model name from its own
|
|
9
|
+
* training data. All three are fabrications. On this machine the config pins
|
|
10
|
+
* `providers.groq.model = openai/gpt-oss-120b` while a run can be served by a
|
|
11
|
+
* Gemini model, a repaired replacement, or a local model after a failover; a
|
|
12
|
+
* model that answers from config is simply wrong, and confidently so.
|
|
13
|
+
*
|
|
14
|
+
* The fix is the one this repo already applies to every other claim: state the
|
|
15
|
+
* fact that was measured, at the moment it was measured. The loop re-reads this
|
|
16
|
+
* feed BEFORE EVERY MODEL CALL, so a mid-turn failover cannot leave the model
|
|
17
|
+
* believing it is still something it stopped being three steps ago.
|
|
18
|
+
*
|
|
19
|
+
* The rules that make it honest rather than decorative:
|
|
20
|
+
* - It is generated from the resolver's own result, never from config.
|
|
21
|
+
* - Unknown stays unknown: an unresolved route says so and forbids inventing one.
|
|
22
|
+
* - A substitution is NAMED, in both directions, because "the router quietly ran
|
|
23
|
+
* you on something else" is the defect (see the route resolver).
|
|
24
|
+
* - It tells the model what to do with the fact (answer from this line; if a user
|
|
25
|
+
* asks, quote it), because a fact with no instruction is a fact the model
|
|
26
|
+
* paraphrases into something else.
|
|
27
|
+
*/
|
|
28
|
+
import type { ServedRoute } from '../inference/route-resolver.js';
|
|
29
|
+
/** Marker that identifies the feed inside the thread (used to replace it). */
|
|
30
|
+
export declare const ROUTE_FEED_MARKER = "ROUTE \u2014 what is actually serving this turn";
|
|
31
|
+
export declare function isUnresolvedModel(model: string | undefined): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* The thread frame.
|
|
34
|
+
*
|
|
35
|
+
* `requested`/`substituted` and `previous` are all optional because they are all
|
|
36
|
+
* facts that may not exist yet; the frame degrades to fewer true lines rather
|
|
37
|
+
* than filling gaps.
|
|
38
|
+
*/
|
|
39
|
+
export declare function routeFeedText(route: ServedRoute): string;
|
|
40
|
+
/**
|
|
41
|
+
* Record a NEW serving route, carrying the ones it replaced (bounded).
|
|
42
|
+
*
|
|
43
|
+
* The history is what turns "you are on local/gemma4:e4b" into the honest
|
|
44
|
+
* "steps 1-3 were answered by groq/openai/gpt-oss-120b, then it failed over" — a
|
|
45
|
+
* model told only the current pair will happily describe the whole turn as
|
|
46
|
+
* having been run by it.
|
|
47
|
+
*/
|
|
48
|
+
export declare function noteServedRoute(previous: ServedRoute | null, next: ServedRoute): ServedRoute;
|
|
49
|
+
/** Cap on remembered serving pairs — enough for a turn's failovers, not a log. */
|
|
50
|
+
export declare const MAX_ROUTE_HISTORY = 4;
|
|
51
|
+
/**
|
|
52
|
+
* Identity of a feed, for change detection. Two feeds with the same fingerprint
|
|
53
|
+
* render the same text, so the loop can skip a rewrite instead of churning the
|
|
54
|
+
* thread on every step.
|
|
55
|
+
*/
|
|
56
|
+
export declare function routeFeedFingerprint(route: ServedRoute | null | undefined): string;
|
|
57
|
+
//# sourceMappingURL=loop-route-feed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-route-feed.d.ts","sourceRoot":"","sources":["../../src/tools/loop-route-feed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAElE,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,oDAA+C,CAAC;AAK9E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CA0BxD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,CAS5F;AAED,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAUlF"}
|