@nac3/forge-cli 0.2.0-alpha.4 → 0.2.0-alpha.59z.118
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 +16 -1
- package/dist/a11y/helpers.d.ts +88 -0
- package/dist/a11y/helpers.d.ts.map +1 -0
- package/dist/a11y/helpers.js +109 -0
- package/dist/a11y/helpers.js.map +1 -0
- package/dist/agents/config_resolver.d.ts +16 -0
- package/dist/agents/config_resolver.d.ts.map +1 -0
- package/dist/agents/config_resolver.js +133 -0
- package/dist/agents/config_resolver.js.map +1 -0
- package/dist/agents/config_schema.d.ts +42 -0
- package/dist/agents/config_schema.d.ts.map +1 -0
- package/dist/agents/config_schema.js +204 -0
- package/dist/agents/config_schema.js.map +1 -0
- package/dist/agents/defaults.d.ts +21 -0
- package/dist/agents/defaults.d.ts.map +1 -0
- package/dist/agents/defaults.js +56 -0
- package/dist/agents/defaults.js.map +1 -0
- package/dist/agents/runner.d.ts +94 -0
- package/dist/agents/runner.d.ts.map +1 -0
- package/dist/agents/runner.js +165 -0
- package/dist/agents/runner.js.map +1 -0
- package/dist/agents/store.d.ts +33 -0
- package/dist/agents/store.d.ts.map +1 -0
- package/dist/agents/store.js +210 -0
- package/dist/agents/store.js.map +1 -0
- package/dist/agents/types.d.ts +112 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +39 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/bin/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +86 -2
- package/dist/bin/yf.js.map +1 -1
- package/dist/chat/claude.d.ts +53 -15
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js +152 -27
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/graph_auto_ingest.d.ts +46 -0
- package/dist/chat/graph_auto_ingest.d.ts.map +1 -0
- package/dist/chat/graph_auto_ingest.js +162 -0
- package/dist/chat/graph_auto_ingest.js.map +1 -0
- package/dist/chat/graph_component_watcher.d.ts +30 -0
- package/dist/chat/graph_component_watcher.d.ts.map +1 -0
- package/dist/chat/graph_component_watcher.js +220 -0
- package/dist/chat/graph_component_watcher.js.map +1 -0
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +5815 -1455
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/project_slug.d.ts +6 -0
- package/dist/chat/project_slug.d.ts.map +1 -0
- package/dist/chat/project_slug.js +78 -0
- package/dist/chat/project_slug.js.map +1 -0
- package/dist/chat/semantic_graph_ingest.d.ts +31 -0
- package/dist/chat/semantic_graph_ingest.d.ts.map +1 -0
- package/dist/chat/semantic_graph_ingest.js +84 -0
- package/dist/chat/semantic_graph_ingest.js.map +1 -0
- package/dist/chat/semantic_graph_inject.d.ts +25 -0
- package/dist/chat/semantic_graph_inject.d.ts.map +1 -0
- package/dist/chat/semantic_graph_inject.js +64 -0
- package/dist/chat/semantic_graph_inject.js.map +1 -0
- package/dist/chat/server.d.ts +50 -0
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +1914 -63
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/spec_extract.d.ts +1 -2
- package/dist/chat/spec_extract.d.ts.map +1 -1
- package/dist/chat/spec_extract.js +18 -59
- package/dist/chat/spec_extract.js.map +1 -1
- package/dist/chat/spec_plan.d.ts +1 -2
- package/dist/chat/spec_plan.d.ts.map +1 -1
- package/dist/chat/spec_plan.js +15 -60
- package/dist/chat/spec_plan.js.map +1 -1
- package/dist/chat/tools/app_backend_dispatch.d.ts +39 -0
- package/dist/chat/tools/app_backend_dispatch.d.ts.map +1 -0
- package/dist/chat/tools/app_backend_dispatch.js +239 -0
- package/dist/chat/tools/app_backend_dispatch.js.map +1 -0
- package/dist/chat/tools/audit_consumers.d.ts +66 -0
- package/dist/chat/tools/audit_consumers.d.ts.map +1 -0
- package/dist/chat/tools/audit_consumers.js +231 -0
- package/dist/chat/tools/audit_consumers.js.map +1 -0
- package/dist/chat/tools/fs_editor.d.ts +11 -0
- package/dist/chat/tools/fs_editor.d.ts.map +1 -0
- package/dist/chat/tools/fs_editor.js +162 -0
- package/dist/chat/tools/fs_editor.js.map +1 -0
- package/dist/chat/tools/git.d.ts +24 -0
- package/dist/chat/tools/git.d.ts.map +1 -1
- package/dist/chat/tools/git.js +82 -4
- package/dist/chat/tools/git.js.map +1 -1
- package/dist/chat/tools/github.js +3 -3
- package/dist/chat/tools/keys.d.ts +9 -0
- package/dist/chat/tools/keys.d.ts.map +1 -0
- package/dist/chat/tools/keys.js +152 -0
- package/dist/chat/tools/keys.js.map +1 -0
- package/dist/chat/tools/lifecycle.js +3 -3
- package/dist/chat/tools/manual.js +1 -1
- package/dist/chat/tools/misc_verbs.d.ts +36 -0
- package/dist/chat/tools/misc_verbs.d.ts.map +1 -0
- package/dist/chat/tools/misc_verbs.js +405 -0
- package/dist/chat/tools/misc_verbs.js.map +1 -0
- package/dist/chat/tools/nac3_invoke.d.ts +53 -0
- package/dist/chat/tools/nac3_invoke.d.ts.map +1 -0
- package/dist/chat/tools/nac3_invoke.js +886 -0
- package/dist/chat/tools/nac3_invoke.js.map +1 -0
- package/dist/chat/tools/pizarron.d.ts +40 -0
- package/dist/chat/tools/pizarron.d.ts.map +1 -0
- package/dist/chat/tools/pizarron.js +123 -0
- package/dist/chat/tools/pizarron.js.map +1 -0
- package/dist/chat/tools/project_lifecycle.d.ts +24 -0
- package/dist/chat/tools/project_lifecycle.d.ts.map +1 -0
- package/dist/chat/tools/project_lifecycle.js +184 -0
- package/dist/chat/tools/project_lifecycle.js.map +1 -0
- package/dist/chat/tools/reader.d.ts.map +1 -1
- package/dist/chat/tools/reader.js +152 -9
- package/dist/chat/tools/reader.js.map +1 -1
- package/dist/chat/tools/shell.d.ts +58 -0
- package/dist/chat/tools/shell.d.ts.map +1 -0
- package/dist/chat/tools/shell.js +253 -0
- package/dist/chat/tools/shell.js.map +1 -0
- package/dist/chat/tools/workflow.d.ts +45 -0
- package/dist/chat/tools/workflow.d.ts.map +1 -0
- package/dist/chat/tools/workflow.js +404 -0
- package/dist/chat/tools/workflow.js.map +1 -0
- package/dist/chat/tools.d.ts +27 -0
- package/dist/chat/tools.d.ts.map +1 -1
- package/dist/chat/tools.js +366 -17
- package/dist/chat/tools.js.map +1 -1
- package/dist/chat/workflow_inject.d.ts +52 -0
- package/dist/chat/workflow_inject.d.ts.map +1 -0
- package/dist/chat/workflow_inject.js +346 -0
- package/dist/chat/workflow_inject.js.map +1 -0
- package/dist/commands/agent.d.ts +22 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +190 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/approve.d.ts +32 -0
- package/dist/commands/approve.d.ts.map +1 -0
- package/dist/commands/approve.js +198 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/block.d.ts +28 -0
- package/dist/commands/block.d.ts.map +1 -0
- package/dist/commands/block.js +189 -0
- package/dist/commands/block.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +35 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +205 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/brain.d.ts +17 -0
- package/dist/commands/brain.d.ts.map +1 -0
- package/dist/commands/brain.js +129 -0
- package/dist/commands/brain.js.map +1 -0
- package/dist/commands/chat.d.ts +3 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +112 -1
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/clarify.d.ts +30 -0
- package/dist/commands/clarify.d.ts.map +1 -0
- package/dist/commands/clarify.js +671 -0
- package/dist/commands/clarify.js.map +1 -0
- package/dist/commands/discover.d.ts +30 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +178 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/doctor.js +26 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctrine.d.ts +24 -0
- package/dist/commands/doctrine.d.ts.map +1 -0
- package/dist/commands/doctrine.js +106 -0
- package/dist/commands/doctrine.js.map +1 -0
- package/dist/commands/doctrines.d.ts +21 -0
- package/dist/commands/doctrines.d.ts.map +1 -0
- package/dist/commands/doctrines.js +158 -0
- package/dist/commands/doctrines.js.map +1 -0
- package/dist/commands/graph.d.ts +21 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +363 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/keys_setup.d.ts.map +1 -1
- package/dist/commands/keys_setup.js +80 -0
- package/dist/commands/keys_setup.js.map +1 -1
- package/dist/commands/legacy-audit.d.ts +34 -0
- package/dist/commands/legacy-audit.d.ts.map +1 -0
- package/dist/commands/legacy-audit.js +270 -0
- package/dist/commands/legacy-audit.js.map +1 -0
- package/dist/commands/lessons.d.ts +28 -0
- package/dist/commands/lessons.d.ts.map +1 -0
- package/dist/commands/lessons.js +309 -0
- package/dist/commands/lessons.js.map +1 -0
- package/dist/commands/license.d.ts.map +1 -1
- package/dist/commands/license.js +56 -1
- package/dist/commands/license.js.map +1 -1
- package/dist/commands/limits.d.ts +15 -0
- package/dist/commands/limits.d.ts.map +1 -0
- package/dist/commands/limits.js +51 -0
- package/dist/commands/limits.js.map +1 -0
- package/dist/commands/manifest-cli.d.ts +12 -0
- package/dist/commands/manifest-cli.d.ts.map +1 -0
- package/dist/commands/manifest-cli.js +42 -0
- package/dist/commands/manifest-cli.js.map +1 -0
- package/dist/commands/mcp.d.ts +24 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +163 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/nac3.d.ts +22 -0
- package/dist/commands/nac3.d.ts.map +1 -0
- package/dist/commands/nac3.js +125 -0
- package/dist/commands/nac3.js.map +1 -0
- package/dist/commands/operate.d.ts +22 -0
- package/dist/commands/operate.d.ts.map +1 -0
- package/dist/commands/operate.js +523 -0
- package/dist/commands/operate.js.map +1 -0
- package/dist/commands/qa.d.ts +24 -0
- package/dist/commands/qa.d.ts.map +1 -0
- package/dist/commands/qa.js +349 -0
- package/dist/commands/qa.js.map +1 -0
- package/dist/commands/spec.d.ts +38 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +256 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/support.d.ts +22 -0
- package/dist/commands/support.d.ts.map +1 -0
- package/dist/commands/support.js +165 -0
- package/dist/commands/support.js.map +1 -0
- package/dist/commands/triage.d.ts +34 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +228 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/vault-inventory.d.ts +30 -0
- package/dist/commands/vault-inventory.d.ts.map +1 -0
- package/dist/commands/vault-inventory.js +222 -0
- package/dist/commands/vault-inventory.js.map +1 -0
- package/dist/commands/vault.d.ts.map +1 -1
- package/dist/commands/vault.js +5 -0
- package/dist/commands/vault.js.map +1 -1
- package/dist/commands/voice.d.ts.map +1 -1
- package/dist/commands/voice.js +47 -4
- package/dist/commands/voice.js.map +1 -1
- package/dist/commands/workflow-coverage.d.ts +30 -0
- package/dist/commands/workflow-coverage.d.ts.map +1 -0
- package/dist/commands/workflow-coverage.js +138 -0
- package/dist/commands/workflow-coverage.js.map +1 -0
- package/dist/core/ansi_strip.d.ts +39 -0
- package/dist/core/ansi_strip.d.ts.map +1 -0
- package/dist/core/ansi_strip.js +71 -0
- package/dist/core/ansi_strip.js.map +1 -0
- package/dist/core/audit_log.d.ts +43 -0
- package/dist/core/audit_log.d.ts.map +1 -0
- package/dist/core/audit_log.js +80 -0
- package/dist/core/audit_log.js.map +1 -0
- package/dist/core/brain_config.d.ts +33 -0
- package/dist/core/brain_config.d.ts.map +1 -0
- package/dist/core/brain_config.js +132 -0
- package/dist/core/brain_config.js.map +1 -0
- package/dist/core/budget.d.ts +96 -0
- package/dist/core/budget.d.ts.map +1 -0
- package/dist/core/budget.js +300 -0
- package/dist/core/budget.js.map +1 -0
- package/dist/core/cost_meter.d.ts +35 -0
- package/dist/core/cost_meter.d.ts.map +1 -0
- package/dist/core/cost_meter.js +111 -0
- package/dist/core/cost_meter.js.map +1 -0
- package/dist/core/cost_router.d.ts +106 -0
- package/dist/core/cost_router.d.ts.map +1 -0
- package/dist/core/cost_router.js +465 -0
- package/dist/core/cost_router.js.map +1 -0
- package/dist/core/doctrine_resolver.d.ts +23 -0
- package/dist/core/doctrine_resolver.d.ts.map +1 -0
- package/dist/core/doctrine_resolver.js +108 -0
- package/dist/core/doctrine_resolver.js.map +1 -0
- package/dist/core/error_catalog.d.ts +80 -0
- package/dist/core/error_catalog.d.ts.map +1 -0
- package/dist/core/error_catalog.js +168 -0
- package/dist/core/error_catalog.js.map +1 -0
- package/dist/core/error_formatter.d.ts +30 -0
- package/dist/core/error_formatter.d.ts.map +1 -0
- package/dist/core/error_formatter.js +155 -0
- package/dist/core/error_formatter.js.map +1 -0
- package/dist/core/incomplete_detector.d.ts +51 -0
- package/dist/core/incomplete_detector.d.ts.map +1 -0
- package/dist/core/incomplete_detector.js +140 -0
- package/dist/core/incomplete_detector.js.map +1 -0
- package/dist/core/learnings_client.d.ts +104 -0
- package/dist/core/learnings_client.d.ts.map +1 -0
- package/dist/core/learnings_client.js +262 -0
- package/dist/core/learnings_client.js.map +1 -0
- package/dist/core/limits_config.d.ts +76 -0
- package/dist/core/limits_config.d.ts.map +1 -0
- package/dist/core/limits_config.js +297 -0
- package/dist/core/limits_config.js.map +1 -0
- package/dist/core/provider_keys.d.ts +35 -0
- package/dist/core/provider_keys.d.ts.map +1 -0
- package/dist/core/provider_keys.js +260 -0
- package/dist/core/provider_keys.js.map +1 -0
- package/dist/core/reasoning_gate.d.ts +72 -0
- package/dist/core/reasoning_gate.d.ts.map +1 -0
- package/dist/core/reasoning_gate.js +192 -0
- package/dist/core/reasoning_gate.js.map +1 -0
- package/dist/core/shell_classifier.d.ts +49 -0
- package/dist/core/shell_classifier.d.ts.map +1 -0
- package/dist/core/shell_classifier.js +159 -0
- package/dist/core/shell_classifier.js.map +1 -0
- package/dist/core/sq_resolver.d.ts +14 -0
- package/dist/core/sq_resolver.d.ts.map +1 -0
- package/dist/core/sq_resolver.js +230 -0
- package/dist/core/sq_resolver.js.map +1 -0
- package/dist/core/truncation_detector.d.ts +68 -0
- package/dist/core/truncation_detector.d.ts.map +1 -0
- package/dist/core/truncation_detector.js +115 -0
- package/dist/core/truncation_detector.js.map +1 -0
- package/dist/core/turn_classifier.d.ts +62 -0
- package/dist/core/turn_classifier.d.ts.map +1 -0
- package/dist/core/turn_classifier.js +213 -0
- package/dist/core/turn_classifier.js.map +1 -0
- package/dist/core/whats_new.d.ts +42 -0
- package/dist/core/whats_new.d.ts.map +1 -0
- package/dist/core/whats_new.js +214 -0
- package/dist/core/whats_new.js.map +1 -0
- package/dist/deploy/adapter.d.ts +93 -0
- package/dist/deploy/adapter.d.ts.map +1 -0
- package/dist/deploy/adapter.js +42 -0
- package/dist/deploy/adapter.js.map +1 -0
- package/dist/deploy/aws_adapter.d.ts +28 -0
- package/dist/deploy/aws_adapter.d.ts.map +1 -0
- package/dist/deploy/aws_adapter.js +98 -0
- package/dist/deploy/aws_adapter.js.map +1 -0
- package/dist/deploy/cloudflare.d.ts +24 -0
- package/dist/deploy/cloudflare.d.ts.map +1 -0
- package/dist/deploy/cloudflare.js +169 -0
- package/dist/deploy/cloudflare.js.map +1 -0
- package/dist/docs/LIMITED_RESPONSIBILITY.md +216 -0
- package/dist/docs/PRIVACY_POLICY.md +169 -0
- package/dist/docs/SQ.md +1397 -0
- package/dist/docs/SQ_BY_STEP.yaml +147 -0
- package/dist/docs/doctrine/accessibility.md +78 -0
- package/dist/docs/doctrine/agent-orchestrator.md +76 -0
- package/dist/docs/doctrine/byok-vs-managed.md +81 -0
- package/dist/docs/doctrine/cost-router-escalation.md +73 -0
- package/dist/docs/doctrine/explain-results.md +90 -0
- package/dist/docs/doctrine/g-doc.md +46 -0
- package/dist/docs/doctrine/gates.md +21 -0
- package/dist/docs/doctrine/lessons-workflow.md +68 -0
- package/dist/docs/doctrine/mcp-bridge-lifecycle.md +75 -0
- package/dist/docs/doctrine/nac3-attrs.md +23 -0
- package/dist/docs/doctrine/office-tools.md +102 -0
- package/dist/docs/doctrine/pizarron.md +52 -0
- package/dist/docs/doctrine/r8-modal.md +60 -0
- package/dist/docs/doctrine/safety-refusals.md +73 -0
- package/dist/docs/doctrine/verb-composition.md +68 -0
- package/dist/docs/doctrine/workflow-phases.md +108 -0
- package/dist/docs/doctrine/workflow.md +58 -0
- package/dist/docs/doctrine/yf-commands.md +49 -0
- package/dist/json/query.d.ts +38 -0
- package/dist/json/query.d.ts.map +1 -0
- package/dist/json/query.js +177 -0
- package/dist/json/query.js.map +1 -0
- package/dist/license/hito4_client.d.ts +19 -0
- package/dist/license/hito4_client.d.ts.map +1 -1
- package/dist/license/hito4_client.js +110 -0
- package/dist/license/hito4_client.js.map +1 -1
- package/dist/license/index.d.ts.map +1 -1
- package/dist/license/index.js +7 -0
- package/dist/license/index.js.map +1 -1
- package/dist/license/sync.d.ts +54 -0
- package/dist/license/sync.d.ts.map +1 -0
- package/dist/license/sync.js +138 -0
- package/dist/license/sync.js.map +1 -0
- package/dist/llm/cohere_client.d.ts +81 -0
- package/dist/llm/cohere_client.d.ts.map +1 -0
- package/dist/llm/cohere_client.js +195 -0
- package/dist/llm/cohere_client.js.map +1 -0
- package/dist/llm/deepseek_client.d.ts +63 -0
- package/dist/llm/deepseek_client.d.ts.map +1 -0
- package/dist/llm/deepseek_client.js +188 -0
- package/dist/llm/deepseek_client.js.map +1 -0
- package/dist/llm/gemini_client.d.ts +78 -0
- package/dist/llm/gemini_client.d.ts.map +1 -0
- package/dist/llm/gemini_client.js +189 -0
- package/dist/llm/gemini_client.js.map +1 -0
- package/dist/llm/managed_client.d.ts +70 -0
- package/dist/llm/managed_client.d.ts.map +1 -0
- package/dist/llm/managed_client.js +251 -0
- package/dist/llm/managed_client.js.map +1 -0
- package/dist/llm/mistral_client.d.ts +54 -0
- package/dist/llm/mistral_client.d.ts.map +1 -0
- package/dist/llm/mistral_client.js +174 -0
- package/dist/llm/mistral_client.js.map +1 -0
- package/dist/llm/multi_provider_client.d.ts +57 -0
- package/dist/llm/multi_provider_client.d.ts.map +1 -0
- package/dist/llm/multi_provider_client.js +109 -0
- package/dist/llm/multi_provider_client.js.map +1 -0
- package/dist/llm/openai_client.d.ts +77 -0
- package/dist/llm/openai_client.d.ts.map +1 -0
- package/dist/llm/openai_client.js +200 -0
- package/dist/llm/openai_client.js.map +1 -0
- package/dist/llm/xai_client.d.ts +51 -0
- package/dist/llm/xai_client.d.ts.map +1 -0
- package/dist/llm/xai_client.js +174 -0
- package/dist/llm/xai_client.js.map +1 -0
- package/dist/mcp/bridge_registry.d.ts +77 -0
- package/dist/mcp/bridge_registry.d.ts.map +1 -0
- package/dist/mcp/bridge_registry.js +220 -0
- package/dist/mcp/bridge_registry.js.map +1 -0
- package/dist/mcp/config.d.ts +25 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +116 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/protocol_client.d.ts +63 -0
- package/dist/mcp/protocol_client.d.ts.map +1 -0
- package/dist/mcp/protocol_client.js +340 -0
- package/dist/mcp/protocol_client.js.map +1 -0
- package/dist/mcp/state.d.ts +38 -0
- package/dist/mcp/state.d.ts.map +1 -0
- package/dist/mcp/state.js +144 -0
- package/dist/mcp/state.js.map +1 -0
- package/dist/migrate/ai-decorator.d.ts.map +1 -1
- package/dist/migrate/ai-decorator.js +33 -145
- package/dist/migrate/ai-decorator.js.map +1 -1
- package/dist/nac3/approval_queue.d.ts +36 -0
- package/dist/nac3/approval_queue.d.ts.map +1 -0
- package/dist/nac3/approval_queue.js +105 -0
- package/dist/nac3/approval_queue.js.map +1 -0
- package/dist/nac3/backend_tools.d.ts +89 -0
- package/dist/nac3/backend_tools.d.ts.map +1 -0
- package/dist/nac3/backend_tools.js +271 -0
- package/dist/nac3/backend_tools.js.map +1 -0
- package/dist/nac3/dispatch_log.d.ts +35 -0
- package/dist/nac3/dispatch_log.d.ts.map +1 -0
- package/dist/nac3/dispatch_log.js +126 -0
- package/dist/nac3/dispatch_log.js.map +1 -0
- package/dist/nac3/internal_manifest.d.ts +62 -0
- package/dist/nac3/internal_manifest.d.ts.map +1 -0
- package/dist/nac3/internal_manifest.js +1846 -0
- package/dist/nac3/internal_manifest.js.map +1 -0
- package/dist/nac3/manifest_lazy.d.ts +71 -0
- package/dist/nac3/manifest_lazy.d.ts.map +1 -0
- package/dist/nac3/manifest_lazy.js +141 -0
- package/dist/nac3/manifest_lazy.js.map +1 -0
- package/dist/nac3/verb_tier_map.d.ts +80 -0
- package/dist/nac3/verb_tier_map.d.ts.map +1 -0
- package/dist/nac3/verb_tier_map.js +159 -0
- package/dist/nac3/verb_tier_map.js.map +1 -0
- package/dist/office/excel.d.ts +110 -0
- package/dist/office/excel.d.ts.map +1 -0
- package/dist/office/excel.js +276 -0
- package/dist/office/excel.js.map +1 -0
- package/dist/office/pdf.d.ts +35 -0
- package/dist/office/pdf.d.ts.map +1 -0
- package/dist/office/pdf.js +70 -0
- package/dist/office/pdf.js.map +1 -0
- package/dist/office/word.d.ts +64 -0
- package/dist/office/word.d.ts.map +1 -0
- package/dist/office/word.js +243 -0
- package/dist/office/word.js.map +1 -0
- package/dist/qa/brain_matrix/ab_runner.d.ts +44 -0
- package/dist/qa/brain_matrix/ab_runner.d.ts.map +1 -0
- package/dist/qa/brain_matrix/ab_runner.js +144 -0
- package/dist/qa/brain_matrix/ab_runner.js.map +1 -0
- package/dist/qa/brain_matrix/brains.json +80 -0
- package/dist/qa/brain_matrix/compare.d.ts +27 -0
- package/dist/qa/brain_matrix/compare.d.ts.map +1 -0
- package/dist/qa/brain_matrix/compare.js +122 -0
- package/dist/qa/brain_matrix/compare.js.map +1 -0
- package/dist/qa/brain_matrix/fake_brain.d.ts +36 -0
- package/dist/qa/brain_matrix/fake_brain.d.ts.map +1 -0
- package/dist/qa/brain_matrix/fake_brain.js +27 -0
- package/dist/qa/brain_matrix/fake_brain.js.map +1 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_announce_intent.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_announce_no_speak_default.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_consecutive_announces.json +37 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_focus_after_action.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_label_with_shortcut.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_announce_min_tool_calls.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_app_invoke_happy_path.json +65 -0
- package/dist/qa/brain_matrix/fixtures/scenario_app_no_invent_without_backend.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_app_schema_fail_recover.json +48 -0
- package/dist/qa/brain_matrix/fixtures/scenario_approval_modal_no_redundancy.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_args_redacted_in_audit.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_audit_consumers_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_audit_consumers_intent_en.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_audit_log_on_destructive.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_brain_explains_after_invoke.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_byok_on_managed_brain_overflow.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_byok_required_policy.json +35 -0
- package/dist/qa/brain_matrix/fixtures/scenario_concise_no_loop.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_consult_nac_spec_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_contradiction_rfp_cost.json +38 -0
- package/dist/qa/brain_matrix/fixtures/scenario_cost_router_attachment_frontier.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_cost_router_escalation_explicit.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_cost_router_idle_reset.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_csv_via_excel_read.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_destructive_no_text_confirm.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_diff_explains_changes.json +32 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_after_unknown_intent.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_a11y.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_agent_orchestrator.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_byok_vs_managed.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_cost_router.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_g_doc.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_gates.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_intent_en.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_lessons_workflow.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_mcp_lifecycle.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_nac3_attrs.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_office.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_pizarron.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_r8_modal.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_workflow.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_workflow_phases.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_yf_commands.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_explain_results.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_safety_refusals.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_verb_composition.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_eco_defers_complex.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_eco_short_query.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_env_list_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_env_list_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_env_no_secret_leak.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_env_secret_suppression.json +35 -0
- package/dist/qa/brain_matrix/fixtures/scenario_env_secret_suppression_en.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_append_handles_csv_refusal.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_append_sheet_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_append_sheet_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_append_then_list.json +34 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_list_sheets_first.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_sheet_named.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_explain_voice_yes.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_explains_forge_error.json +39 -0
- package/dist/qa/brain_matrix/fixtures/scenario_focus_after_modal_open.json +29 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_find_intent.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_find_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_find_with_glob.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_mkdir_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_move_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_read_handles_missing.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_stat_before_read.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_generated_app_nac3_default.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_branch_list_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_diff_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_log_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_log_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_pull_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_push_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_show_metadata_only.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_status_branch_combo.json +44 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_status_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_status_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_github_clone_repo_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_github_create_repo_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_id_format_in_reply.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_iterations_idempotent_adenda.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_iterations_query_history.json +29 -0
- package/dist/qa/brain_matrix/fixtures/scenario_iterations_tracker_acknowledge.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_parse_handles_malformed.json +34 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_parse_intent.json +30 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_parse_intent_en.json +30 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_query_extract.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_stringify_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_stringify_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_keys_set_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_keys_status_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_keys_status_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lazy_complex_verb.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lazy_doctrine_only_when_needed.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lazy_simple_verb.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lesson_recall_overrides.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_restart_app_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_run_app_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_run_app_intent_en.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_stop_app_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_stop_app_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_long_doctrine_no_truncate.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_manifest_read_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_manual_open_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_bridge_unreachable_graceful.json +39 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_disabled_bridge_no_verbs.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_discover_tools_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invariant_1_no_verbs.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_two_hop.json +68 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_with_auth_loaded.json +76 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_revoked_token_graceful.json +33 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_set_creds_intent.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_set_creds_no_token_arg.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_show_tools_before_invoke.json +44 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_toggle_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_multi_turn_clarify_then_act.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_nac3_attrs_doctrine.json +53 -0
- package/dist/qa/brain_matrix/fixtures/scenario_nac3_discover_schemas_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_nac3_required_attr_missing.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_bare_ok_after_destructive.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_global_learnings_no_recall.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_id_leak_in_reply.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_invent_verb.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_loop_after_repeated_fail.json +42 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_password_echo.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_all_current.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_then_explain.json +35 -0
- package/dist/qa/brain_matrix/fixtures/scenario_office_excel_read_intent.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_office_excel_write_required_args.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_office_overwrite_explicit.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_office_word_write_intent.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_panel_open_settings_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_panel_send_message_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pdf_read_intent.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pizarron_clear_tab_explicit_close.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pizarron_for_chart.json +30 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pizarron_for_long_table.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pizarron_read_tab_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pizarron_render_not_inline.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_prefer_native_read_file.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_prefer_native_verb_over_shell.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_prefer_native_workflow_state.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_project_init_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_project_set_root_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_promote_lesson_after_correction.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_r8_destructive_shell_exec.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_read_then_parse_order.json +36 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_bookmark_jump_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_bookmark_set_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_for_long_doc.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_list_docs_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_next_block_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_read_section_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_recap_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_search_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_search_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_blanket_chmod_777.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_bypass_approval_modal.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_delete_critical_en.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_disable_vault_encryption.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_drop_database.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_force_push_main.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_force_push_main_en.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_leak_vault_en.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_modify_node_modules.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_skip_hooks.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_skip_hooks_en.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_to_delete_critical.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_to_leak_vault.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_respects_global_learnings.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_respects_workflow_gate_g2.json +39 -0
- package/dist/qa/brain_matrix/fixtures/scenario_revoke_lesson_request.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_sq_rules_active.json +30 -0
- package/dist/qa/brain_matrix/fixtures/scenario_text_diff_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_text_diff_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_truncated_response_retry.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_unknown_command_clarify.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_parse_compose.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_parse_handles_invalid.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_parse_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_parse_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_parse_then_inspect_query.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_then_stringify_order.json +34 -0
- package/dist/qa/brain_matrix/fixtures/scenario_user_just_greets.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_user_overrides_proceeds.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_user_revokes_in_middle.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_voice_open_pizarron.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_word_outline_extraction.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_word_overwrite_explicit.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_word_section_count.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_doctrine.json +53 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_done_specs.json +32 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_intent_capture.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_phase_jump_block.json +26 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_phase_v_step_15.json +41 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_run_step_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_set_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_state_injection.json +32 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_state_recovers_after_clarify.json +25 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_step_1_intake.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_yf_command_doctrine.json +56 -0
- package/dist/qa/brain_matrix/fixtures/scenario_yf_doctrine_list_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_yf_qa_compare_intent.json +17 -0
- package/dist/qa/brain_matrix/invariants.d.ts +18 -0
- package/dist/qa/brain_matrix/invariants.d.ts.map +1 -0
- package/dist/qa/brain_matrix/invariants.js +333 -0
- package/dist/qa/brain_matrix/invariants.js.map +1 -0
- package/dist/qa/brain_matrix/report.d.ts +12 -0
- package/dist/qa/brain_matrix/report.d.ts.map +1 -0
- package/dist/qa/brain_matrix/report.js +131 -0
- package/dist/qa/brain_matrix/report.js.map +1 -0
- package/dist/qa/brain_matrix/runner.d.ts +31 -0
- package/dist/qa/brain_matrix/runner.d.ts.map +1 -0
- package/dist/qa/brain_matrix/runner.js +561 -0
- package/dist/qa/brain_matrix/runner.js.map +1 -0
- package/dist/qa/brain_matrix/types.d.ts +180 -0
- package/dist/qa/brain_matrix/types.d.ts.map +1 -0
- package/dist/qa/brain_matrix/types.js +2 -0
- package/dist/qa/brain_matrix/types.js.map +1 -0
- package/dist/qa/brain_matrix/validate_scenario.d.ts +23 -0
- package/dist/qa/brain_matrix/validate_scenario.d.ts.map +1 -0
- package/dist/qa/brain_matrix/validate_scenario.js +128 -0
- package/dist/qa/brain_matrix/validate_scenario.js.map +1 -0
- package/dist/support/github_dispatcher.d.ts +36 -0
- package/dist/support/github_dispatcher.d.ts.map +1 -0
- package/dist/support/github_dispatcher.js +292 -0
- package/dist/support/github_dispatcher.js.map +1 -0
- package/dist/support/reports.d.ts +31 -0
- package/dist/support/reports.d.ts.map +1 -0
- package/dist/support/reports.js +162 -0
- package/dist/support/reports.js.map +1 -0
- package/dist/telemetry/usage.d.ts +67 -0
- package/dist/telemetry/usage.d.ts.map +1 -0
- package/dist/telemetry/usage.js +208 -0
- package/dist/telemetry/usage.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/voice/config.d.ts +12 -0
- package/dist/voice/config.d.ts.map +1 -1
- package/dist/voice/config.js +25 -2
- package/dist/voice/config.js.map +1 -1
- package/dist/voice/intents.d.ts +1 -1
- package/dist/voice/intents.js +0 -0
- package/dist/voice/providers/google.d.ts +9 -0
- package/dist/voice/providers/google.d.ts.map +1 -1
- package/dist/voice/providers/google.js +197 -28
- package/dist/voice/providers/google.js.map +1 -1
- package/dist/voice/router.d.ts +10 -0
- package/dist/voice/router.d.ts.map +1 -1
- package/dist/voice/router.js +39 -20
- package/dist/voice/router.js.map +1 -1
- package/dist/voice/types.d.ts +5 -2
- package/dist/voice/types.d.ts.map +1 -1
- package/dist/voice/types.js.map +1 -1
- package/dist/workflow/phase_inference.d.ts +56 -0
- package/dist/workflow/phase_inference.d.ts.map +1 -0
- package/dist/workflow/phase_inference.js +107 -0
- package/dist/workflow/phase_inference.js.map +1 -0
- package/dist/workflow/state.d.ts +238 -0
- package/dist/workflow/state.d.ts.map +1 -0
- package/dist/workflow/state.js +213 -0
- package/dist/workflow/state.js.map +1 -0
- package/docs/SQ.md +1397 -0
- package/docs/SQ_BY_STEP.yaml +147 -0
- package/docs/doctrine/accessibility.md +78 -0
- package/docs/doctrine/agent-orchestrator.md +76 -0
- package/docs/doctrine/byok-vs-managed.md +81 -0
- package/docs/doctrine/cost-router-escalation.md +73 -0
- package/docs/doctrine/explain-results.md +90 -0
- package/docs/doctrine/g-doc.md +46 -0
- package/docs/doctrine/gates.md +21 -0
- package/docs/doctrine/lessons-workflow.md +68 -0
- package/docs/doctrine/mcp-bridge-lifecycle.md +75 -0
- package/docs/doctrine/nac3-attrs.md +23 -0
- package/docs/doctrine/office-tools.md +102 -0
- package/docs/doctrine/pizarron.md +52 -0
- package/docs/doctrine/r8-modal.md +60 -0
- package/docs/doctrine/safety-refusals.md +73 -0
- package/docs/doctrine/verb-composition.md +68 -0
- package/docs/doctrine/workflow-phases.md +108 -0
- package/docs/doctrine/workflow.md +58 -0
- package/docs/doctrine/yf-commands.md +49 -0
- package/package.json +21 -15
- package/src/i18n/catalogs/ar.json +55 -10
- package/src/i18n/catalogs/de.json +55 -10
- package/src/i18n/catalogs/en.json +66 -1
- package/src/i18n/catalogs/es.json +66 -1
- package/src/i18n/catalogs/fr.json +55 -10
- package/src/i18n/catalogs/hi.json +55 -10
- package/src/i18n/catalogs/it.json +55 -10
- package/src/i18n/catalogs/ja.json +55 -10
- package/src/i18n/catalogs/pt.json +55 -10
- package/src/i18n/catalogs/zh.json +55 -10
- package/templates/nextjs-app/README.md +48 -0
- package/templates/nextjs-app/next.config.js +8 -0
- package/templates/nextjs-app/package.json +33 -0
- package/templates/nextjs-app/src/app/globals.css +43 -0
- package/templates/nextjs-app/src/app/layout.tsx +29 -0
- package/templates/nextjs-app/src/app/page.tsx +63 -0
- package/templates/nextjs-app/src/nac/manifest.ts +36 -0
- package/templates/nextjs-app/tsconfig.json +21 -0
- package/templates/nextjs-app/yujin.forge.json +11 -0
|
@@ -0,0 +1,886 @@
|
|
|
1
|
+
import { findVerb, findVerbByAlias, validateArgs, suggestVerbs, manifest, } from '../../nac3/internal_manifest.js';
|
|
2
|
+
import { resolveManifestMode } from '../../nac3/manifest_lazy.js';
|
|
3
|
+
import { getDoctrines, listDoctrineSlugs } from '../../core/doctrine_resolver.js';
|
|
4
|
+
import { logDispatch, newTraceId, redactArgs, } from '../../nac3/dispatch_log.js';
|
|
5
|
+
import { enqueueApproval } from '../../nac3/approval_queue.js';
|
|
6
|
+
import { VERSION as FORGE_VERSION } from '../../version.js';
|
|
7
|
+
/* alpha.42 -- policies that REQUIRE panel-side approval before
|
|
8
|
+
* the legacy handler runs. The dispatcher pushes a pending row
|
|
9
|
+
* and returns an envelope; the panel modal handles the rest. */
|
|
10
|
+
const POLICIES_NEED_APPROVAL = new Set(['destructive', 'approval-required']);
|
|
11
|
+
export const NAC3_INVOKE_SPEC = {
|
|
12
|
+
name: 'nac3_invoke',
|
|
13
|
+
description: 'Invoke a NAC3 verb from the internal manifest. The manifest '
|
|
14
|
+
+ 'lives in the system prompt. ALWAYS pick verb_id from there.\n\n'
|
|
15
|
+
+ 'Rules:\n'
|
|
16
|
+
+ ' - If no verb matches what the user asked, REPLY in chat '
|
|
17
|
+
+ '"No tengo verbo NAC3 para X" -- do NOT improvise.\n'
|
|
18
|
+
+ ' - Args must satisfy the verb schema. Read the schema in '
|
|
19
|
+
+ 'the manifest before composing args.\n'
|
|
20
|
+
+ ' - Check the verb policy before dispatching. Destructive / '
|
|
21
|
+
+ 'approval-required verbs need a clear user signal first.\n'
|
|
22
|
+
+ ' - On is_error=true: tell the user what failed; do not '
|
|
23
|
+
+ 'paper over it. Past-tense ("listo", "guardado") is allowed '
|
|
24
|
+
+ 'only after is_error=false.\n'
|
|
25
|
+
+ ' - When the result carries nac3_panel_dispatch=true, the '
|
|
26
|
+
+ 'panel will execute the verb; treat that as success.',
|
|
27
|
+
input_schema: {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {
|
|
30
|
+
verb_id: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
description: 'Stable verb id from the manifest, e.g. yujin.pizarron.create-tab.',
|
|
33
|
+
},
|
|
34
|
+
args: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
description: 'Arguments for the verb. Must satisfy the verb schema.',
|
|
37
|
+
},
|
|
38
|
+
idempotency_key: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
description: 'Optional. Same key on retry -> server may dedupe.',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
required: ['verb_id'],
|
|
44
|
+
},
|
|
45
|
+
requires_approval: false,
|
|
46
|
+
};
|
|
47
|
+
export async function runNac3Invoke(rawArgs, ctx, opts) {
|
|
48
|
+
const trace_id = newTraceId();
|
|
49
|
+
const startedAt = Date.now();
|
|
50
|
+
const m = manifest();
|
|
51
|
+
const baseEntry = {
|
|
52
|
+
trace_id,
|
|
53
|
+
panel_session_id: opts.panelSessionId,
|
|
54
|
+
forge_version: FORGE_VERSION,
|
|
55
|
+
llm_turn_id: opts.llmTurnId,
|
|
56
|
+
user_text_hash: opts.userTextHash,
|
|
57
|
+
manifest_version: m.version,
|
|
58
|
+
};
|
|
59
|
+
const verb_id = typeof rawArgs.verb_id === 'string' ? rawArgs.verb_id.trim() : '';
|
|
60
|
+
const args = (rawArgs.args && typeof rawArgs.args === 'object' && !Array.isArray(rawArgs.args))
|
|
61
|
+
? rawArgs.args
|
|
62
|
+
: {};
|
|
63
|
+
if (!verb_id) {
|
|
64
|
+
await logDispatch({
|
|
65
|
+
ts: new Date().toISOString(),
|
|
66
|
+
kind: 'schema-fail',
|
|
67
|
+
...baseEntry,
|
|
68
|
+
result_ok: false,
|
|
69
|
+
result_error: 'verb_id missing',
|
|
70
|
+
duration_ms: Date.now() - startedAt,
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
74
|
+
is_error: true,
|
|
75
|
+
result: { error: 'verb_id is required (string).' },
|
|
76
|
+
display: 'nac3_invoke <- missing verb_id',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/* alpha.59z.38 NAC-3 v3.x backend tools (task #23 slice 2) --
|
|
80
|
+
* app.* namespace dispatcher. These verbs are NOT in the
|
|
81
|
+
* internal manifest; they come from the adopter app's
|
|
82
|
+
* yujin.forge.json nac3_backend.tools[] section + surface via
|
|
83
|
+
* buildBackendToolsSection at prompt build time. Resolving here
|
|
84
|
+
* before findVerb so the rest of the pipeline (gate, R8,
|
|
85
|
+
* legacy aliasing) skips entirely. */
|
|
86
|
+
if (verb_id.startsWith('app.')) {
|
|
87
|
+
const toolId = verb_id.slice(4);
|
|
88
|
+
const { runAppBackendTool } = await import('./app_backend_dispatch.js');
|
|
89
|
+
return await runAppBackendTool({
|
|
90
|
+
toolId,
|
|
91
|
+
args,
|
|
92
|
+
baseEntry,
|
|
93
|
+
startedAt,
|
|
94
|
+
projectRoot: process.cwd(),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
let verb = findVerb(verb_id);
|
|
98
|
+
let alias_used;
|
|
99
|
+
if (!verb) {
|
|
100
|
+
/* Tolerate the LLM passing a legacy tool name as verb_id. */
|
|
101
|
+
verb = findVerbByAlias(verb_id);
|
|
102
|
+
if (verb) {
|
|
103
|
+
alias_used = verb_id;
|
|
104
|
+
await logDispatch({
|
|
105
|
+
ts: new Date().toISOString(),
|
|
106
|
+
kind: 'deprecated-alias',
|
|
107
|
+
...baseEntry,
|
|
108
|
+
verb_id: verb.id,
|
|
109
|
+
alias_used: verb_id,
|
|
110
|
+
args_sample: redactArgs(args),
|
|
111
|
+
result_ok: undefined,
|
|
112
|
+
duration_ms: Date.now() - startedAt,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (!verb) {
|
|
117
|
+
const closest = suggestVerbs(verb_id, 3);
|
|
118
|
+
await logDispatch({
|
|
119
|
+
ts: new Date().toISOString(),
|
|
120
|
+
kind: 'verb-not-found',
|
|
121
|
+
...baseEntry,
|
|
122
|
+
verb_id,
|
|
123
|
+
closest_verbs: closest,
|
|
124
|
+
args_sample: redactArgs(args),
|
|
125
|
+
result_ok: false,
|
|
126
|
+
result_error: 'verb not found',
|
|
127
|
+
duration_ms: Date.now() - startedAt,
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
131
|
+
is_error: true,
|
|
132
|
+
result: {
|
|
133
|
+
error: 'No NAC3 verb with id "' + verb_id + '". Pick from the manifest.',
|
|
134
|
+
closest_verbs: closest,
|
|
135
|
+
hint: 'The full manifest is in your system prompt. If you genuinely need a new verb, say so to the user instead of guessing.',
|
|
136
|
+
},
|
|
137
|
+
display: 'nac3_invoke <- unknown verb ' + verb_id,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/* Schema validation. */
|
|
141
|
+
const schemaErr = validateArgs(verb, args);
|
|
142
|
+
if (schemaErr) {
|
|
143
|
+
await logDispatch({
|
|
144
|
+
ts: new Date().toISOString(),
|
|
145
|
+
kind: 'schema-fail',
|
|
146
|
+
...baseEntry,
|
|
147
|
+
verb_id: verb.id,
|
|
148
|
+
args_sample: redactArgs(args),
|
|
149
|
+
result_ok: false,
|
|
150
|
+
result_error: schemaErr,
|
|
151
|
+
duration_ms: Date.now() - startedAt,
|
|
152
|
+
});
|
|
153
|
+
/* alpha.59x mitigation #1 -- auto-recovery on schema fail in
|
|
154
|
+
* lazy manifest mode. The LLM saw only the stub (no schema),
|
|
155
|
+
* so missing/wrong args are likely "I forgot to call
|
|
156
|
+
* discover-schemas first". Return the schema inline so the
|
|
157
|
+
* next round can compose args correctly without an extra
|
|
158
|
+
* discovery call. In eager mode the schema is already in the
|
|
159
|
+
* system prompt -- still safe to repeat, costs ~200 tokens
|
|
160
|
+
* and saves a regression turn. */
|
|
161
|
+
const lazyHint = resolveManifestMode() === 'lazy'
|
|
162
|
+
? ('Lazy manifest mode: call yujin.nac3.discover-schemas '
|
|
163
|
+
+ 'before invoking complex verbs to avoid this round-trip. '
|
|
164
|
+
+ 'Schema for "' + verb.id + '" included below; retry with '
|
|
165
|
+
+ 'compliant args.')
|
|
166
|
+
: 'Schema for "' + verb.id + '" repeated below; retry with compliant args.';
|
|
167
|
+
return {
|
|
168
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
169
|
+
is_error: true,
|
|
170
|
+
result: {
|
|
171
|
+
error: 'Args do not match the verb schema: ' + schemaErr,
|
|
172
|
+
verb_id: verb.id,
|
|
173
|
+
schema: verb.schema,
|
|
174
|
+
description: verb.description,
|
|
175
|
+
policy: verb.policy,
|
|
176
|
+
side_effects: verb.side_effects,
|
|
177
|
+
hint: lazyHint,
|
|
178
|
+
},
|
|
179
|
+
display: 'nac3_invoke <- schema fail (' + verb.id + ')',
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/* alpha.59z.0 meta-verb -- discover-doctrine. Handled inline
|
|
183
|
+
* because it is pure markdown read (no side effects, no
|
|
184
|
+
* legacy alias). */
|
|
185
|
+
if (verb.id === 'yujin.doctrine.discover') {
|
|
186
|
+
const raw = args.slugs;
|
|
187
|
+
const slugs = Array.isArray(raw)
|
|
188
|
+
? raw.filter((x) => typeof x === 'string')
|
|
189
|
+
: [];
|
|
190
|
+
let payload;
|
|
191
|
+
if (slugs.length === 0) {
|
|
192
|
+
const available = await listDoctrineSlugs();
|
|
193
|
+
payload = { ok: true, available };
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
const got = await getDoctrines(slugs);
|
|
197
|
+
payload = { doctrines: got };
|
|
198
|
+
}
|
|
199
|
+
await logDispatch({
|
|
200
|
+
ts: new Date().toISOString(),
|
|
201
|
+
kind: 'invoke',
|
|
202
|
+
...baseEntry,
|
|
203
|
+
verb_id: verb.id,
|
|
204
|
+
args_sample: redactArgs(args),
|
|
205
|
+
policy: verb.policy,
|
|
206
|
+
side_effects_declared: verb.side_effects,
|
|
207
|
+
side_effects_actual: ['none'],
|
|
208
|
+
result_ok: true,
|
|
209
|
+
duration_ms: Date.now() - startedAt,
|
|
210
|
+
});
|
|
211
|
+
return {
|
|
212
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
213
|
+
is_error: false,
|
|
214
|
+
result: payload,
|
|
215
|
+
display: 'nac3_invoke -> doctrine:' + slugs.length,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/* alpha.59x meta-verb -- discover-schemas. Handled inline
|
|
219
|
+
* because it is pure manifest introspection (no side effects,
|
|
220
|
+
* no legacy alias) and we want the schema lookup to be as
|
|
221
|
+
* cheap as a manifest read. */
|
|
222
|
+
if (verb.id === 'yujin.nac3.discover-schemas') {
|
|
223
|
+
const verbIdsRaw = args.verb_ids;
|
|
224
|
+
const verbIds = Array.isArray(verbIdsRaw)
|
|
225
|
+
? verbIdsRaw.filter((x) => typeof x === 'string')
|
|
226
|
+
: [];
|
|
227
|
+
const out = {};
|
|
228
|
+
for (const id of verbIds) {
|
|
229
|
+
const v = findVerb(id) ?? findVerbByAlias(id);
|
|
230
|
+
if (v) {
|
|
231
|
+
out[id] = {
|
|
232
|
+
id: v.id,
|
|
233
|
+
role: v.role,
|
|
234
|
+
action: v.action,
|
|
235
|
+
label: v.label,
|
|
236
|
+
description: v.description ?? '',
|
|
237
|
+
schema: v.schema,
|
|
238
|
+
policy: v.policy,
|
|
239
|
+
side_effects: v.side_effects,
|
|
240
|
+
handler_side: v.handler_side,
|
|
241
|
+
/* Same fields as the stub plus the schema -- the LLM can
|
|
242
|
+
* copy/paste into args confidently. */
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
const closest = suggestVerbs(id, 3);
|
|
247
|
+
out[id] = { error: 'unknown verb_id', closest_verbs: closest };
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
await logDispatch({
|
|
251
|
+
ts: new Date().toISOString(),
|
|
252
|
+
kind: 'invoke',
|
|
253
|
+
...baseEntry,
|
|
254
|
+
verb_id: verb.id,
|
|
255
|
+
args_sample: redactArgs(args),
|
|
256
|
+
policy: verb.policy,
|
|
257
|
+
side_effects_declared: verb.side_effects,
|
|
258
|
+
side_effects_actual: ['none'],
|
|
259
|
+
result_ok: true,
|
|
260
|
+
duration_ms: Date.now() - startedAt,
|
|
261
|
+
});
|
|
262
|
+
return {
|
|
263
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
264
|
+
is_error: false,
|
|
265
|
+
result: {
|
|
266
|
+
verbs: out,
|
|
267
|
+
manifest_mode: resolveManifestMode(),
|
|
268
|
+
manifest_version: m.version,
|
|
269
|
+
},
|
|
270
|
+
display: 'nac3_invoke -> schemas:' + verbIds.length,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/* alpha.59z.26 F101 slice 2 -- MCP bridge meta verbs.
|
|
274
|
+
*
|
|
275
|
+
* list-bridges : real, queries the registry from slice 1.
|
|
276
|
+
* show-tools : slice 2 stub returns the bridge endpoint +
|
|
277
|
+
* "tool catalogue load deferred to slice 4".
|
|
278
|
+
* discover-tools : slice 2 stub returns a placeholder; slice 4
|
|
279
|
+
* wires the on-demand schema fetch.
|
|
280
|
+
* toggle : slice 2 stub (requires persistent enabled-
|
|
281
|
+
* state file; ships in slice 4 alongside the
|
|
282
|
+
* proxy dispatcher).
|
|
283
|
+
* set-creds : slice 2 stub (requires CredentialVault per-
|
|
284
|
+
* bridge slot; ships in slice 4).
|
|
285
|
+
*
|
|
286
|
+
* Per the MCP-opcional invariants documented in F101_MCP_BRIDGE,
|
|
287
|
+
* these verbs only appear in the LLM-visible stub when the
|
|
288
|
+
* registry discovered >=1 bridge. findVerb/validateArgs still
|
|
289
|
+
* resolve them; the gate is on the prompt-side. */
|
|
290
|
+
if (verb.id === 'yujin.mcp.list-bridges') {
|
|
291
|
+
const { getActiveBridges } = await import('../../mcp/bridge_registry.js');
|
|
292
|
+
const bridges = await getActiveBridges({ projectRoot: process.cwd() });
|
|
293
|
+
const payload = {
|
|
294
|
+
ok: true,
|
|
295
|
+
bridges: bridges.map((b) => ({
|
|
296
|
+
id: b.id,
|
|
297
|
+
endpoint: b.endpoint,
|
|
298
|
+
source: b.source,
|
|
299
|
+
enabled: b.enabled,
|
|
300
|
+
display_name: b.display_name ?? b.id,
|
|
301
|
+
})),
|
|
302
|
+
count: bridges.length,
|
|
303
|
+
};
|
|
304
|
+
await logDispatch({
|
|
305
|
+
ts: new Date().toISOString(),
|
|
306
|
+
kind: 'invoke',
|
|
307
|
+
...baseEntry,
|
|
308
|
+
verb_id: verb.id,
|
|
309
|
+
args_sample: {},
|
|
310
|
+
policy: verb.policy,
|
|
311
|
+
side_effects_declared: verb.side_effects,
|
|
312
|
+
side_effects_actual: ['none'],
|
|
313
|
+
result_ok: true,
|
|
314
|
+
duration_ms: Date.now() - startedAt,
|
|
315
|
+
});
|
|
316
|
+
return {
|
|
317
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
318
|
+
is_error: false,
|
|
319
|
+
result: payload,
|
|
320
|
+
display: 'nac3_invoke -> bridges:' + bridges.length,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
if (verb.id === 'yujin.mcp.show-tools') {
|
|
324
|
+
/* F101 slice 4 FULL: delegate to the MCPClient appropriate
|
|
325
|
+
* for the bridge protocol (http_rest / stdio / sse). The
|
|
326
|
+
* http_rest path preserves slice 4 minimal behaviour. */
|
|
327
|
+
const bridgeId = String(args.bridge_id ?? '');
|
|
328
|
+
const { getActiveBridges } = await import('../../mcp/bridge_registry.js');
|
|
329
|
+
const bridges = await getActiveBridges({ projectRoot: process.cwd() });
|
|
330
|
+
const bridge = bridges.find((b) => b.id === bridgeId);
|
|
331
|
+
if (!bridge) {
|
|
332
|
+
await logDispatch({
|
|
333
|
+
ts: new Date().toISOString(), kind: 'invoke', ...baseEntry,
|
|
334
|
+
verb_id: verb.id, args_sample: redactArgs(args),
|
|
335
|
+
policy: verb.policy, side_effects_declared: verb.side_effects,
|
|
336
|
+
side_effects_actual: ['none'], result_ok: false,
|
|
337
|
+
result_error: 'unknown_bridge_id:' + bridgeId,
|
|
338
|
+
duration_ms: Date.now() - startedAt,
|
|
339
|
+
});
|
|
340
|
+
return {
|
|
341
|
+
tool: NAC3_INVOKE_SPEC.name, is_error: true,
|
|
342
|
+
result: { ok: false, error: 'unknown_bridge_id', bridge_id: bridgeId, available: bridges.map((b) => b.id) },
|
|
343
|
+
display: 'nac3_invoke <- bridge not found',
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
const { getMCPClient } = await import('../../mcp/protocol_client.js');
|
|
347
|
+
const client = getMCPClient(bridge);
|
|
348
|
+
const listResult = await client.listTools();
|
|
349
|
+
const sideActual = client.transport === 'stdio' ? ['process'] : ['network'];
|
|
350
|
+
await logDispatch({
|
|
351
|
+
ts: new Date().toISOString(), kind: 'invoke', ...baseEntry,
|
|
352
|
+
verb_id: verb.id, args_sample: redactArgs(args),
|
|
353
|
+
policy: verb.policy, side_effects_declared: verb.side_effects,
|
|
354
|
+
side_effects_actual: sideActual,
|
|
355
|
+
result_ok: listResult.ok,
|
|
356
|
+
result_error: listResult.ok ? undefined : (listResult.detail || listResult.error),
|
|
357
|
+
duration_ms: Date.now() - startedAt,
|
|
358
|
+
});
|
|
359
|
+
return {
|
|
360
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
361
|
+
is_error: false,
|
|
362
|
+
result: listResult.ok
|
|
363
|
+
? { ok: true, bridge_id: bridgeId, endpoint: bridge.endpoint, transport: client.transport, tools: listResult.tools, count: listResult.count }
|
|
364
|
+
: { ok: false, bridge_id: bridgeId, transport: client.transport, error: listResult.error, detail: listResult.detail },
|
|
365
|
+
display: listResult.ok
|
|
366
|
+
? 'nac3_invoke -> tools:' + listResult.count + ' via ' + client.transport
|
|
367
|
+
: 'nac3_invoke <- ' + listResult.error + ' (' + client.transport + ')',
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
if (verb.id === 'yujin.mcp.invoke-tool') {
|
|
371
|
+
/* Slice 4 real: POST <endpoint>/tools/<tool_slug>/invoke with
|
|
372
|
+
* the args body. Bridge response is forwarded verbatim. Audit
|
|
373
|
+
* trail records bridge_id + bridge_endpoint + tool_slug so
|
|
374
|
+
* MCP-proxied invocations are queryable separately from native
|
|
375
|
+
* dispatch. R8 modal already triggered upstream by the gate
|
|
376
|
+
* since the verb policy is approval-required. */
|
|
377
|
+
const bridgeId = String(args.bridge_id ?? '');
|
|
378
|
+
const toolSlug = String(args.tool_slug ?? '');
|
|
379
|
+
const toolArgs = args.args ?? {};
|
|
380
|
+
const { getActiveBridges } = await import('../../mcp/bridge_registry.js');
|
|
381
|
+
const bridges = await getActiveBridges({ projectRoot: process.cwd() });
|
|
382
|
+
const bridge = bridges.find((b) => b.id === bridgeId);
|
|
383
|
+
if (!bridge) {
|
|
384
|
+
await logDispatch({
|
|
385
|
+
ts: new Date().toISOString(), kind: 'invoke', ...baseEntry,
|
|
386
|
+
verb_id: verb.id, args_sample: redactArgs(args),
|
|
387
|
+
policy: verb.policy, side_effects_declared: verb.side_effects,
|
|
388
|
+
side_effects_actual: ['none'], result_ok: false,
|
|
389
|
+
result_error: 'unknown_bridge_id:' + bridgeId,
|
|
390
|
+
duration_ms: Date.now() - startedAt,
|
|
391
|
+
});
|
|
392
|
+
return {
|
|
393
|
+
tool: NAC3_INVOKE_SPEC.name, is_error: true,
|
|
394
|
+
result: { ok: false, error: 'unknown_bridge_id', bridge_id: bridgeId, available: bridges.map((b) => b.id) },
|
|
395
|
+
display: 'nac3_invoke <- bridge not found',
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
/* F101 slice 5 sub-slice 2 -- attach Authorization: Bearer
|
|
399
|
+
* <token> when the per-bridge Vault slot has a value. Slot
|
|
400
|
+
* name follows the canonical mcp_<bridge_id>_token pattern.
|
|
401
|
+
* The header is only relevant to the http_rest + sse transports;
|
|
402
|
+
* the stdio client ignores it (auth on stdio happens via env
|
|
403
|
+
* vars set at spawn time). */
|
|
404
|
+
const credsSlot = 'mcp_' + bridgeId.toLowerCase().replace(/[^a-z0-9_-]/g, '_') + '_token';
|
|
405
|
+
const authHeaders = {};
|
|
406
|
+
try {
|
|
407
|
+
const { getKey } = await import('../../core/provider_keys.js');
|
|
408
|
+
const token = await getKey(credsSlot);
|
|
409
|
+
if (token)
|
|
410
|
+
authHeaders['authorization'] = 'Bearer ' + token;
|
|
411
|
+
}
|
|
412
|
+
catch { /* swallow -- proceed without auth */ }
|
|
413
|
+
/* F101 slice 4 FULL: dispatch via MCPClient picked by bridge
|
|
414
|
+
* protocol. http_rest preserves slice 4 minimal; stdio + sse
|
|
415
|
+
* add real MCP transport support. */
|
|
416
|
+
const { getMCPClient } = await import('../../mcp/protocol_client.js');
|
|
417
|
+
const client = getMCPClient(bridge);
|
|
418
|
+
const invokeResult = await client.invokeTool(toolSlug, toolArgs, authHeaders);
|
|
419
|
+
let toolResult = null;
|
|
420
|
+
let invokeError;
|
|
421
|
+
if (invokeResult.ok) {
|
|
422
|
+
toolResult = invokeResult.response;
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
invokeError = invokeResult.detail || invokeResult.error;
|
|
426
|
+
toolResult = invokeResult.partial_response ?? null;
|
|
427
|
+
}
|
|
428
|
+
await logDispatch({
|
|
429
|
+
ts: new Date().toISOString(), kind: 'invoke', ...baseEntry,
|
|
430
|
+
verb_id: verb.id,
|
|
431
|
+
args_sample: redactArgs({
|
|
432
|
+
bridge_id: bridgeId,
|
|
433
|
+
bridge_endpoint: bridge.endpoint,
|
|
434
|
+
tool_slug: toolSlug,
|
|
435
|
+
/* Args from the tool are NOT redacted into the audit log
|
|
436
|
+
* field because they could carry per-tool semantics (file
|
|
437
|
+
* paths, query strings) that operators need to see. The
|
|
438
|
+
* redactor handles standard secret patterns. */
|
|
439
|
+
...(typeof toolArgs === 'object' && toolArgs !== null ? toolArgs : {}),
|
|
440
|
+
}),
|
|
441
|
+
policy: verb.policy, side_effects_declared: verb.side_effects,
|
|
442
|
+
side_effects_actual: invokeError ? ['network'] : ['network', 'external-api'],
|
|
443
|
+
result_ok: !invokeError,
|
|
444
|
+
result_error: invokeError,
|
|
445
|
+
duration_ms: Date.now() - startedAt,
|
|
446
|
+
});
|
|
447
|
+
return {
|
|
448
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
449
|
+
is_error: false,
|
|
450
|
+
result: {
|
|
451
|
+
ok: !invokeError,
|
|
452
|
+
bridge_id: bridgeId,
|
|
453
|
+
tool_slug: toolSlug,
|
|
454
|
+
...(invokeError ? { error: 'bridge_invoke_failed', detail: invokeError, partial_response: toolResult } : { response: toolResult }),
|
|
455
|
+
},
|
|
456
|
+
display: invokeError
|
|
457
|
+
? 'nac3_invoke <- mcp:' + bridgeId + '/' + toolSlug + ' failed'
|
|
458
|
+
: 'nac3_invoke -> mcp:' + bridgeId + '/' + toolSlug,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
if (verb.id === 'yujin.mcp.toggle') {
|
|
462
|
+
/* F101 slice 5 sub-slice 1: persistent enabled-state writer.
|
|
463
|
+
* Writes to ~/.yujin-forge/mcp-state.json atomically + busts
|
|
464
|
+
* the discovery cache so the next chat turn sees the new
|
|
465
|
+
* state. R8 modal already fired upstream (approval-required
|
|
466
|
+
* policy). */
|
|
467
|
+
const bridgeId = String(args.bridge_id ?? '');
|
|
468
|
+
const enabled = Boolean(args.enabled);
|
|
469
|
+
const { getActiveBridges, resetBridgeCache } = await import('../../mcp/bridge_registry.js');
|
|
470
|
+
const bridges = await getActiveBridges({ projectRoot: process.cwd() });
|
|
471
|
+
const bridge = bridges.find((b) => b.id === bridgeId);
|
|
472
|
+
if (!bridge) {
|
|
473
|
+
await logDispatch({
|
|
474
|
+
ts: new Date().toISOString(), kind: 'invoke', ...baseEntry,
|
|
475
|
+
verb_id: verb.id, args_sample: redactArgs(args),
|
|
476
|
+
policy: verb.policy, side_effects_declared: verb.side_effects,
|
|
477
|
+
side_effects_actual: ['none'], result_ok: false,
|
|
478
|
+
result_error: 'unknown_bridge_id:' + bridgeId,
|
|
479
|
+
duration_ms: Date.now() - startedAt,
|
|
480
|
+
});
|
|
481
|
+
return {
|
|
482
|
+
tool: NAC3_INVOKE_SPEC.name, is_error: true,
|
|
483
|
+
result: { ok: false, error: 'unknown_bridge_id', bridge_id: bridgeId, available: bridges.map((b) => b.id) },
|
|
484
|
+
display: 'nac3_invoke <- bridge not found',
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
const { setBridgeEnabled } = await import('../../mcp/state.js');
|
|
488
|
+
await setBridgeEnabled(bridgeId, enabled);
|
|
489
|
+
resetBridgeCache();
|
|
490
|
+
await logDispatch({
|
|
491
|
+
ts: new Date().toISOString(), kind: 'invoke', ...baseEntry,
|
|
492
|
+
verb_id: verb.id, args_sample: redactArgs(args),
|
|
493
|
+
policy: verb.policy, side_effects_declared: verb.side_effects,
|
|
494
|
+
side_effects_actual: ['filesystem'], result_ok: true,
|
|
495
|
+
duration_ms: Date.now() - startedAt,
|
|
496
|
+
});
|
|
497
|
+
return {
|
|
498
|
+
tool: NAC3_INVOKE_SPEC.name, is_error: false,
|
|
499
|
+
result: {
|
|
500
|
+
ok: true, bridge_id: bridgeId, enabled,
|
|
501
|
+
message: 'Bridge ' + bridgeId + ' set to ' + (enabled ? 'enabled' : 'disabled') + '. The next chat turn will reflect this change.',
|
|
502
|
+
},
|
|
503
|
+
display: 'nac3_invoke -> mcp toggle ' + bridgeId + '=' + (enabled ? 'on' : 'off'),
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
if (verb.id === 'yujin.mcp.set-creds') {
|
|
507
|
+
/* F101 slice 5 sub-slice 2: write a per-bridge bearer token
|
|
508
|
+
* to CredentialVault under the dynamic slot
|
|
509
|
+
* mcp_<bridge_id>_token. R8 modal already fired upstream
|
|
510
|
+
* (destructive policy).
|
|
511
|
+
*
|
|
512
|
+
* The verb args include creds_slot for back-compat with the
|
|
513
|
+
* slice 2 schema, but the canonical slot name is the dynamic
|
|
514
|
+
* mcp_<bridge_id>_token pattern. If creds_slot does not match
|
|
515
|
+
* this pattern we reject -- the bridge_id MUST be in the slot
|
|
516
|
+
* name for the invoke-tool handler to find it without an extra
|
|
517
|
+
* args field. The set-creds verb does NOT carry the secret
|
|
518
|
+
* token itself in its args (LLM should not see it); the
|
|
519
|
+
* actual token must come via a separate `yf keys set <slot>`
|
|
520
|
+
* step. The verb just records the binding + verifies the
|
|
521
|
+
* slot exists. */
|
|
522
|
+
const bridgeId = String(args.bridge_id ?? '');
|
|
523
|
+
const credsSlot = String(args.creds_slot ?? '');
|
|
524
|
+
const expected = 'mcp_' + bridgeId.toLowerCase().replace(/[^a-z0-9_-]/g, '_') + '_token';
|
|
525
|
+
if (credsSlot !== expected) {
|
|
526
|
+
await logDispatch({
|
|
527
|
+
ts: new Date().toISOString(), kind: 'invoke', ...baseEntry,
|
|
528
|
+
verb_id: verb.id, args_sample: redactArgs(args),
|
|
529
|
+
policy: verb.policy, side_effects_declared: verb.side_effects,
|
|
530
|
+
side_effects_actual: ['none'], result_ok: false,
|
|
531
|
+
result_error: 'creds_slot mismatch; expected ' + expected,
|
|
532
|
+
duration_ms: Date.now() - startedAt,
|
|
533
|
+
});
|
|
534
|
+
return {
|
|
535
|
+
tool: NAC3_INVOKE_SPEC.name, is_error: true,
|
|
536
|
+
result: {
|
|
537
|
+
ok: false,
|
|
538
|
+
error: 'creds_slot_mismatch',
|
|
539
|
+
expected_slot: expected,
|
|
540
|
+
received_slot: credsSlot,
|
|
541
|
+
hint: 'Slot name MUST be mcp_<bridge_id>_token. The token itself must be loaded separately via `yf keys set ' + expected + '` so the LLM never sees it.',
|
|
542
|
+
},
|
|
543
|
+
display: 'nac3_invoke <- mcp creds slot mismatch',
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
const { hasKey } = await import('../../core/provider_keys.js');
|
|
547
|
+
const present = await hasKey(expected);
|
|
548
|
+
await logDispatch({
|
|
549
|
+
ts: new Date().toISOString(), kind: 'invoke', ...baseEntry,
|
|
550
|
+
verb_id: verb.id, args_sample: redactArgs(args),
|
|
551
|
+
policy: verb.policy, side_effects_declared: verb.side_effects,
|
|
552
|
+
side_effects_actual: ['filesystem'], result_ok: true,
|
|
553
|
+
duration_ms: Date.now() - startedAt,
|
|
554
|
+
});
|
|
555
|
+
return {
|
|
556
|
+
tool: NAC3_INVOKE_SPEC.name, is_error: false,
|
|
557
|
+
result: {
|
|
558
|
+
ok: true,
|
|
559
|
+
bridge_id: bridgeId,
|
|
560
|
+
slot: expected,
|
|
561
|
+
token_present: present,
|
|
562
|
+
message: present
|
|
563
|
+
? 'Binding confirmed. invoke-tool calls to ' + bridgeId + ' will send Authorization: Bearer <slot value>.'
|
|
564
|
+
: 'Slot ' + expected + ' is empty. Run `yf keys set ' + expected + '` to load the token; invoke-tool will then attach the header automatically.',
|
|
565
|
+
},
|
|
566
|
+
display: 'nac3_invoke -> mcp creds ' + bridgeId + ' (token ' + (present ? 'loaded' : 'pending') + ')',
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
if (verb.id === 'yujin.mcp.discover-tools') {
|
|
570
|
+
/* Slice 4 full ships the on-demand schema fetch for
|
|
571
|
+
* MCP-proxied tools via the stdio/SSE protocol client. Until
|
|
572
|
+
* then the brain calls show-tools which returns the full
|
|
573
|
+
* catalogue (slice 4 minimal). */
|
|
574
|
+
const payload = {
|
|
575
|
+
ok: false,
|
|
576
|
+
deferred_to: 'F101 slice 4 full (MCP stdio/SSE client)',
|
|
577
|
+
message: 'discover-tools is the lazy variant of show-tools. Until the protocol client ships, use show-tools which returns the full catalogue eagerly.',
|
|
578
|
+
args_received: args,
|
|
579
|
+
};
|
|
580
|
+
await logDispatch({
|
|
581
|
+
ts: new Date().toISOString(), kind: 'invoke', ...baseEntry,
|
|
582
|
+
verb_id: verb.id, args_sample: redactArgs(args),
|
|
583
|
+
policy: verb.policy, side_effects_declared: verb.side_effects,
|
|
584
|
+
side_effects_actual: ['none'], result_ok: false,
|
|
585
|
+
duration_ms: Date.now() - startedAt,
|
|
586
|
+
});
|
|
587
|
+
return {
|
|
588
|
+
tool: NAC3_INVOKE_SPEC.name, is_error: false, result: payload,
|
|
589
|
+
display: 'nac3_invoke -> mcp-stub (' + verb.id + ')',
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
/* Policy gate (server-enforced side; the panel double-gates
|
|
593
|
+
* visible-policy verbs). */
|
|
594
|
+
if (verb.policy === 'byok-required') {
|
|
595
|
+
/* Stub: read the BYOK key catalogue and check at least one
|
|
596
|
+
* brain key exists. The detailed enforcement is up to the
|
|
597
|
+
* verb handler. */
|
|
598
|
+
/* Intentionally not implemented yet; alpha.40 ships the
|
|
599
|
+
* dispatch surface and uses byok-required as documentation. */
|
|
600
|
+
}
|
|
601
|
+
if (verb.policy === 'project-root-gated') {
|
|
602
|
+
/* For args carrying a 'path' or 'subdir', defence-in-depth.
|
|
603
|
+
* The legacy handlers already enforce this; we just log. */
|
|
604
|
+
}
|
|
605
|
+
/* alpha.42 -- destructive / approval-required GATE.
|
|
606
|
+
*
|
|
607
|
+
* The dispatcher does NOT run the legacy handler here. Instead
|
|
608
|
+
* it enqueues a pending approval row keyed by trace_id and
|
|
609
|
+
* returns an envelope. The panel intercept opens a modal; the
|
|
610
|
+
* user clicks Approve / Reject; the panel POSTs the decision
|
|
611
|
+
* to /api/forge/nac3-approve or /nac3-reject. The endpoint
|
|
612
|
+
* resolves the row and runs the actual handler (or logs the
|
|
613
|
+
* rejection).
|
|
614
|
+
*
|
|
615
|
+
* Approval is bypassed when:
|
|
616
|
+
* - opts.approval_bypass === true (already-approved re-entry
|
|
617
|
+
* from the approve endpoint; would otherwise loop).
|
|
618
|
+
* Nothing else is exempt -- destructive ALWAYS hits the modal.
|
|
619
|
+
*/
|
|
620
|
+
if (POLICIES_NEED_APPROVAL.has(verb.policy)
|
|
621
|
+
&& verb.handler_side === 'server'
|
|
622
|
+
&& !opts.approval_bypass) {
|
|
623
|
+
/* alpha.59d -- Danger Zone master toggle. When ON, the
|
|
624
|
+
* modal is skipped + the call proceeds with approval_mode=
|
|
625
|
+
* 'danger_zone_bypass' so the audit log still records the
|
|
626
|
+
* invocation cleanly. */
|
|
627
|
+
let dangerZoneBypass = false;
|
|
628
|
+
try {
|
|
629
|
+
const { readLimitsConfig } = await import('../../core/limits_config.js');
|
|
630
|
+
const lim = await readLimitsConfig();
|
|
631
|
+
if (lim.danger_zone && lim.danger_zone.auto_approve_all === true) {
|
|
632
|
+
dangerZoneBypass = true;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
catch { /* swallow */ }
|
|
636
|
+
/* Resolve the alias OR fall back to verb_id (alpha.59d
|
|
637
|
+
* native handlers like yujin.shell.exec). */
|
|
638
|
+
const alias = (verb.deprecated_aliases && verb.deprecated_aliases[0]) || verb.id;
|
|
639
|
+
if (!alias) {
|
|
640
|
+
return {
|
|
641
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
642
|
+
is_error: true,
|
|
643
|
+
result: { error: 'destructive verb "' + verb.id + '" has no legacy implementation' },
|
|
644
|
+
display: 'nac3_invoke <- no impl ' + verb.id,
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
if (dangerZoneBypass) {
|
|
648
|
+
/* Skip the modal, dispatch directly with the audit
|
|
649
|
+
* approval_mode set. */
|
|
650
|
+
const argsWithMode = {
|
|
651
|
+
...args,
|
|
652
|
+
_approval_mode: 'danger_zone_bypass',
|
|
653
|
+
};
|
|
654
|
+
try {
|
|
655
|
+
const r = await opts.legacyRun(alias, argsWithMode, ctx);
|
|
656
|
+
await logDispatch({
|
|
657
|
+
ts: new Date().toISOString(),
|
|
658
|
+
kind: 'invoke',
|
|
659
|
+
...baseEntry,
|
|
660
|
+
verb_id: verb.id,
|
|
661
|
+
alias_used: alias,
|
|
662
|
+
args_sample: redactArgs(args),
|
|
663
|
+
policy: verb.policy,
|
|
664
|
+
side_effects_declared: verb.side_effects,
|
|
665
|
+
result_ok: !r.is_error,
|
|
666
|
+
result_error: r.is_error ? String(r.result?.error ?? 'error') : undefined,
|
|
667
|
+
duration_ms: Date.now() - startedAt,
|
|
668
|
+
});
|
|
669
|
+
return r;
|
|
670
|
+
}
|
|
671
|
+
catch (err) {
|
|
672
|
+
return {
|
|
673
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
674
|
+
is_error: true,
|
|
675
|
+
result: { error: 'danger zone handler threw: ' + (err instanceof Error ? err.message : String(err)) },
|
|
676
|
+
display: 'nac3_invoke <- danger zone error',
|
|
677
|
+
};
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
enqueueApproval({
|
|
681
|
+
trace_id,
|
|
682
|
+
verb,
|
|
683
|
+
args,
|
|
684
|
+
ctx,
|
|
685
|
+
legacy_alias: alias,
|
|
686
|
+
legacy_run: opts.legacyRun,
|
|
687
|
+
created_at: Date.now(),
|
|
688
|
+
});
|
|
689
|
+
await logDispatch({
|
|
690
|
+
ts: new Date().toISOString(),
|
|
691
|
+
kind: 'invoke',
|
|
692
|
+
...baseEntry,
|
|
693
|
+
verb_id: verb.id,
|
|
694
|
+
alias_used: alias,
|
|
695
|
+
args_sample: redactArgs(args),
|
|
696
|
+
policy: verb.policy,
|
|
697
|
+
side_effects_declared: verb.side_effects,
|
|
698
|
+
result_ok: true,
|
|
699
|
+
duration_ms: Date.now() - startedAt,
|
|
700
|
+
/* mark as awaiting -- the row will be paired later with the
|
|
701
|
+
approve/reject decision in nac3_approvals.jsonl. */
|
|
702
|
+
result_error: 'awaiting_user_approval',
|
|
703
|
+
});
|
|
704
|
+
/* alpha.59d.2 -- attach a classification block so the panel
|
|
705
|
+
* modal can render a coloured risk badge + reasons. For
|
|
706
|
+
* shell.exec the bucket comes from shell_classifier (rich
|
|
707
|
+
* signal); for other verbs we synthesise a bucket from the
|
|
708
|
+
* policy + side_effects so the modal still gets a chip. */
|
|
709
|
+
let classification;
|
|
710
|
+
if (verb.id === 'yujin.shell.exec') {
|
|
711
|
+
try {
|
|
712
|
+
const { classifyShellCommand } = await import('../../core/shell_classifier.js');
|
|
713
|
+
const cmd = typeof args.command === 'string'
|
|
714
|
+
? args.command
|
|
715
|
+
: '';
|
|
716
|
+
const sc = classifyShellCommand(cmd);
|
|
717
|
+
classification = { bucket: sc.bucket, reasons: sc.reasons };
|
|
718
|
+
}
|
|
719
|
+
catch {
|
|
720
|
+
classification = { bucket: 'approval', reasons: ['classifier unavailable'] };
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
else if (verb.policy === 'destructive') {
|
|
724
|
+
classification = {
|
|
725
|
+
bucket: 'destructive',
|
|
726
|
+
reasons: ['policy=destructive', 'side_effects=' + (verb.side_effects || []).join(',')],
|
|
727
|
+
};
|
|
728
|
+
}
|
|
729
|
+
else {
|
|
730
|
+
classification = {
|
|
731
|
+
bucket: 'approval',
|
|
732
|
+
reasons: ['policy=' + verb.policy, 'side_effects=' + (verb.side_effects || []).join(',')],
|
|
733
|
+
};
|
|
734
|
+
}
|
|
735
|
+
return {
|
|
736
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
737
|
+
is_error: false,
|
|
738
|
+
result: {
|
|
739
|
+
nac3_panel_approval_required: true,
|
|
740
|
+
trace_id,
|
|
741
|
+
verb: {
|
|
742
|
+
id: verb.id,
|
|
743
|
+
action: verb.action,
|
|
744
|
+
role: verb.role,
|
|
745
|
+
label: verb.label,
|
|
746
|
+
policy: verb.policy,
|
|
747
|
+
side_effects: verb.side_effects,
|
|
748
|
+
},
|
|
749
|
+
args,
|
|
750
|
+
classification,
|
|
751
|
+
},
|
|
752
|
+
display: 'nac3_invoke -> awaiting approval (' + verb.id + ' [' + classification.bucket + '])',
|
|
753
|
+
};
|
|
754
|
+
}
|
|
755
|
+
/* Dispatch. */
|
|
756
|
+
if (verb.handler_side === 'panel') {
|
|
757
|
+
/* Return an envelope the panel will pick up from tool_rounds. */
|
|
758
|
+
await logDispatch({
|
|
759
|
+
ts: new Date().toISOString(),
|
|
760
|
+
kind: 'invoke',
|
|
761
|
+
...baseEntry,
|
|
762
|
+
verb_id: verb.id,
|
|
763
|
+
alias_used,
|
|
764
|
+
args_sample: redactArgs(args),
|
|
765
|
+
policy: verb.policy,
|
|
766
|
+
side_effects_declared: verb.side_effects,
|
|
767
|
+
side_effects_actual: ['dom'],
|
|
768
|
+
result_ok: true,
|
|
769
|
+
duration_ms: Date.now() - startedAt,
|
|
770
|
+
});
|
|
771
|
+
return {
|
|
772
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
773
|
+
is_error: false,
|
|
774
|
+
result: {
|
|
775
|
+
nac3_panel_dispatch: true,
|
|
776
|
+
trace_id,
|
|
777
|
+
verb: {
|
|
778
|
+
id: verb.id,
|
|
779
|
+
action: verb.action,
|
|
780
|
+
role: verb.role,
|
|
781
|
+
policy: verb.policy,
|
|
782
|
+
side_effects: verb.side_effects,
|
|
783
|
+
},
|
|
784
|
+
args,
|
|
785
|
+
},
|
|
786
|
+
display: 'nac3_invoke -> panel:' + verb.action + ' (' + verb.id + ')',
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
/* handler_side === 'server': route to a handler. alpha.59d --
|
|
790
|
+
* prefer the verb_id directly (the dispatcher's switch knows
|
|
791
|
+
* yujin.* verbs natively); fall back to the legacy alias for
|
|
792
|
+
* pre-alpha.41 surfaces. */
|
|
793
|
+
let alias = verb.deprecated_aliases && verb.deprecated_aliases[0];
|
|
794
|
+
if (!alias) {
|
|
795
|
+
/* No legacy alias declared -- try the verb_id itself as a
|
|
796
|
+
* native handler name. tools.ts adds cases for yujin.* verbs
|
|
797
|
+
* introduced in alpha.59d (mkdir / move / project.init /
|
|
798
|
+
* project.set-root / shell.exec). */
|
|
799
|
+
alias = verb.id;
|
|
800
|
+
}
|
|
801
|
+
/* Forward the dispatcher-resolved approval mode to the handler
|
|
802
|
+
* via args._approval_mode so audit rows capture how the
|
|
803
|
+
* invocation was approved (auto / user / danger_zone). */
|
|
804
|
+
const argsWithMode = { ...args };
|
|
805
|
+
if (typeof args._approval_mode !== 'string') {
|
|
806
|
+
argsWithMode._approval_mode = verb.policy === 'unrestricted' ? 'auto_approved' : 'user_approved';
|
|
807
|
+
}
|
|
808
|
+
let r;
|
|
809
|
+
try {
|
|
810
|
+
r = await opts.legacyRun(alias, argsWithMode, ctx);
|
|
811
|
+
}
|
|
812
|
+
catch (err) {
|
|
813
|
+
await logDispatch({
|
|
814
|
+
ts: new Date().toISOString(),
|
|
815
|
+
kind: 'invoke',
|
|
816
|
+
...baseEntry,
|
|
817
|
+
verb_id: verb.id,
|
|
818
|
+
alias_used: alias,
|
|
819
|
+
args_sample: redactArgs(args),
|
|
820
|
+
policy: verb.policy,
|
|
821
|
+
side_effects_declared: verb.side_effects,
|
|
822
|
+
result_ok: false,
|
|
823
|
+
result_error: err instanceof Error ? err.message : String(err),
|
|
824
|
+
duration_ms: Date.now() - startedAt,
|
|
825
|
+
});
|
|
826
|
+
return {
|
|
827
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
828
|
+
is_error: true,
|
|
829
|
+
result: {
|
|
830
|
+
error: 'verb handler threw: ' + (err instanceof Error ? err.message : String(err)),
|
|
831
|
+
verb_id: verb.id,
|
|
832
|
+
},
|
|
833
|
+
display: 'nac3_invoke <- handler threw',
|
|
834
|
+
};
|
|
835
|
+
}
|
|
836
|
+
await logDispatch({
|
|
837
|
+
ts: new Date().toISOString(),
|
|
838
|
+
kind: 'invoke',
|
|
839
|
+
...baseEntry,
|
|
840
|
+
verb_id: verb.id,
|
|
841
|
+
alias_used: alias,
|
|
842
|
+
args_sample: redactArgs(args),
|
|
843
|
+
policy: verb.policy,
|
|
844
|
+
side_effects_declared: verb.side_effects,
|
|
845
|
+
side_effects_actual: verb.side_effects,
|
|
846
|
+
result_ok: !r.is_error,
|
|
847
|
+
result_error: r.is_error
|
|
848
|
+
? (typeof r.result === 'object' && r.result && 'error' in r.result
|
|
849
|
+
? String(r.result.error)
|
|
850
|
+
: 'unknown')
|
|
851
|
+
: undefined,
|
|
852
|
+
duration_ms: Date.now() - startedAt,
|
|
853
|
+
});
|
|
854
|
+
/* panel_consume = the server-side handler ran (e.g. read a file
|
|
855
|
+
* from disk) and the result is meant to materialise a UI update
|
|
856
|
+
* in the panel. Wrap as a panel-dispatch envelope so the panel
|
|
857
|
+
* intercept sees the canonical shape (same as handler_side=
|
|
858
|
+
* panel verbs above). */
|
|
859
|
+
if (!r.is_error && verb.panel_consume) {
|
|
860
|
+
return {
|
|
861
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
862
|
+
is_error: false,
|
|
863
|
+
result: {
|
|
864
|
+
nac3_panel_dispatch: true,
|
|
865
|
+
trace_id,
|
|
866
|
+
verb: {
|
|
867
|
+
id: verb.id,
|
|
868
|
+
action: verb.action,
|
|
869
|
+
role: verb.role,
|
|
870
|
+
policy: verb.policy,
|
|
871
|
+
side_effects: verb.side_effects,
|
|
872
|
+
},
|
|
873
|
+
args,
|
|
874
|
+
server_payload: r.result,
|
|
875
|
+
},
|
|
876
|
+
display: 'nac3_invoke -> panel(consume):' + verb.action + ' (' + verb.id + ')',
|
|
877
|
+
};
|
|
878
|
+
}
|
|
879
|
+
return {
|
|
880
|
+
tool: NAC3_INVOKE_SPEC.name,
|
|
881
|
+
is_error: r.is_error ?? false,
|
|
882
|
+
result: r.result,
|
|
883
|
+
display: 'nac3_invoke -> ' + verb.id + (r.is_error ? ' (error)' : ' (ok)'),
|
|
884
|
+
};
|
|
885
|
+
}
|
|
886
|
+
//# sourceMappingURL=nac3_invoke.js.map
|