@nac3/forge-cli 0.2.0-alpha.5 → 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 +1905 -54
- 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 +78 -0
- package/dist/chat/tools/git.js.map +1 -1
- 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/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 +144 -1
- 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 +362 -13
- 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/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 +20 -14
- 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,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* turn_classifier.ts -- Gemini mini-prompt that decides tier for
|
|
3
|
+
* a turn the reasoning_gate flagged as ambiguous (alpha.55).
|
|
4
|
+
*
|
|
5
|
+
* Why eco-model for the classifier itself: the question
|
|
6
|
+
* "simple verb invocation or complex reasoning?" is a routing
|
|
7
|
+
* decision, not a content decision. Gemini Flash Lite handles it
|
|
8
|
+
* in ~400 ms for fractions of a cent. The verdict gates whether
|
|
9
|
+
* the EXPENSIVE turn (full LLM call) goes to eco or frontier.
|
|
10
|
+
*
|
|
11
|
+
* Fallback path when Gemini is not reachable or the key is
|
|
12
|
+
* missing: the gate's own (low-confidence) tier suggestion is
|
|
13
|
+
* returned with a "classifier_unreachable" signal so the cost log
|
|
14
|
+
* shows what happened. The chat NEVER blocks on classifier
|
|
15
|
+
* availability.
|
|
16
|
+
*
|
|
17
|
+
* Cache: LRU keyed by sha256 of the user text + previous tier.
|
|
18
|
+
* 50 entries / 5 min TTL. Saves the classifier call on repeated
|
|
19
|
+
* short prompts ("hola", "ok", "si").
|
|
20
|
+
*
|
|
21
|
+
* ASCII-only.
|
|
22
|
+
*/
|
|
23
|
+
import { createHash } from 'node:crypto';
|
|
24
|
+
const SYSTEM_PROMPT = ('You are a routing classifier inside a developer tool. Given a ' +
|
|
25
|
+
'user message, decide which class it belongs to:\n' +
|
|
26
|
+
' - "simple": a short request invoking one tool or asking a ' +
|
|
27
|
+
'trivial question. Examples: "abrime una tab", "show me the ' +
|
|
28
|
+
'budget", "list pipelines", "hola", "leeme la tabla".\n' +
|
|
29
|
+
' - "complex": requires reasoning, design, code generation, or ' +
|
|
30
|
+
'a multi-step plan. Examples: "design the architecture for X", ' +
|
|
31
|
+
'"implement a new feature", "refactor this module", "write a ' +
|
|
32
|
+
'function that does Y".\n' +
|
|
33
|
+
' - "destructive": modifies persistent state (delete files, drop ' +
|
|
34
|
+
'tables, commit + push, send emails, deploy). Examples: "borra ' +
|
|
35
|
+
'esos archivos", "git push --force", "send the email now".\n\n' +
|
|
36
|
+
'Reply with exactly one word: simple, complex, or destructive. ' +
|
|
37
|
+
'No punctuation, no extra text.');
|
|
38
|
+
const CACHE_MAX = 50;
|
|
39
|
+
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
40
|
+
const _cache = new Map();
|
|
41
|
+
function cacheKey(text, prev) {
|
|
42
|
+
const h = createHash('sha256');
|
|
43
|
+
h.update(prev || '');
|
|
44
|
+
h.update('|');
|
|
45
|
+
h.update(text);
|
|
46
|
+
return h.digest('hex');
|
|
47
|
+
}
|
|
48
|
+
function cacheGet(key) {
|
|
49
|
+
const e = _cache.get(key);
|
|
50
|
+
if (!e)
|
|
51
|
+
return null;
|
|
52
|
+
if (Date.now() - e.ts > CACHE_TTL_MS) {
|
|
53
|
+
_cache.delete(key);
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
/* Move to end -> LRU touch. */
|
|
57
|
+
_cache.delete(key);
|
|
58
|
+
_cache.set(key, e);
|
|
59
|
+
return { ...e.result, cached: true };
|
|
60
|
+
}
|
|
61
|
+
function cacheSet(key, result) {
|
|
62
|
+
if (_cache.size >= CACHE_MAX) {
|
|
63
|
+
/* Drop oldest (first inserted) -- Map iteration order is
|
|
64
|
+
* insertion order. */
|
|
65
|
+
const first = _cache.keys().next().value;
|
|
66
|
+
if (first !== undefined)
|
|
67
|
+
_cache.delete(first);
|
|
68
|
+
}
|
|
69
|
+
_cache.set(key, { ts: Date.now(), result: { ...result, cached: false } });
|
|
70
|
+
}
|
|
71
|
+
/** Test hook -- clear cache between specs. */
|
|
72
|
+
export function _resetClassifierCache() {
|
|
73
|
+
_cache.clear();
|
|
74
|
+
}
|
|
75
|
+
/* ----- classifier core ------------------------------------- */
|
|
76
|
+
function parseVerdict(text) {
|
|
77
|
+
const t = (text || '').trim().toLowerCase();
|
|
78
|
+
/* Gemini sometimes wraps the word in markdown or punctuation. */
|
|
79
|
+
const stripped = t.replace(/[^a-z]/g, '');
|
|
80
|
+
if (stripped === 'simple')
|
|
81
|
+
return 'simple';
|
|
82
|
+
if (stripped === 'complex')
|
|
83
|
+
return 'complex';
|
|
84
|
+
if (stripped === 'destructive')
|
|
85
|
+
return 'destructive';
|
|
86
|
+
/* Substring fallback for noisy output. */
|
|
87
|
+
if (stripped.includes('simple'))
|
|
88
|
+
return 'simple';
|
|
89
|
+
if (stripped.includes('complex'))
|
|
90
|
+
return 'complex';
|
|
91
|
+
if (stripped.includes('destructive'))
|
|
92
|
+
return 'destructive';
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
function verdictToTier(v, gate_tier) {
|
|
96
|
+
if (v === 'simple')
|
|
97
|
+
return 'eco';
|
|
98
|
+
if (v === 'complex')
|
|
99
|
+
return 'frontier';
|
|
100
|
+
/* destructive routes to frontier so the user gets the best
|
|
101
|
+
* judgment before persistent changes. */
|
|
102
|
+
if (v === 'destructive')
|
|
103
|
+
return 'frontier';
|
|
104
|
+
/* null -> gate fallback. */
|
|
105
|
+
return gate_tier;
|
|
106
|
+
}
|
|
107
|
+
async function callGemini(text, apiKey, model, fetchImpl, timeoutMs) {
|
|
108
|
+
const url = 'https://generativelanguage.googleapis.com/v1beta/models/' +
|
|
109
|
+
encodeURIComponent(model) +
|
|
110
|
+
':generateContent?key=' + encodeURIComponent(apiKey);
|
|
111
|
+
const body = {
|
|
112
|
+
systemInstruction: { parts: [{ text: SYSTEM_PROMPT }] },
|
|
113
|
+
contents: [{
|
|
114
|
+
role: 'user',
|
|
115
|
+
parts: [{ text: text.slice(0, 2000) }],
|
|
116
|
+
}],
|
|
117
|
+
generationConfig: {
|
|
118
|
+
maxOutputTokens: 8,
|
|
119
|
+
temperature: 0.0,
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
const controller = new AbortController();
|
|
123
|
+
const t = setTimeout(() => controller.abort(), timeoutMs);
|
|
124
|
+
try {
|
|
125
|
+
const r = await fetchImpl(url, {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
headers: { 'content-type': 'application/json' },
|
|
128
|
+
body: JSON.stringify(body),
|
|
129
|
+
signal: controller.signal,
|
|
130
|
+
});
|
|
131
|
+
if (!r.ok) {
|
|
132
|
+
throw new Error('gemini http ' + r.status);
|
|
133
|
+
}
|
|
134
|
+
const j = await r.json();
|
|
135
|
+
const candidate = j.candidates && j.candidates[0];
|
|
136
|
+
const part = candidate?.content?.parts && candidate.content.parts[0];
|
|
137
|
+
return (part && typeof part.text === 'string') ? part.text : '';
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
clearTimeout(t);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Run the classifier. Never throws -- on any failure, returns
|
|
145
|
+
* the gate's fallback tier with a "classifier_unreachable"
|
|
146
|
+
* signal and confidence 0.50.
|
|
147
|
+
*/
|
|
148
|
+
export async function classifyTurn(input) {
|
|
149
|
+
const text = typeof input.text === 'string' ? input.text : '';
|
|
150
|
+
const key = cacheKey(text, input.previous_tier);
|
|
151
|
+
const cached = cacheGet(key);
|
|
152
|
+
if (cached)
|
|
153
|
+
return cached;
|
|
154
|
+
const signals = [];
|
|
155
|
+
const apiKey = input.api_key ?? null;
|
|
156
|
+
if (!apiKey) {
|
|
157
|
+
signals.push('classifier_no_api_key');
|
|
158
|
+
const r = {
|
|
159
|
+
tier: input.gate_tier,
|
|
160
|
+
confidence: 0.50,
|
|
161
|
+
verdict: null,
|
|
162
|
+
signals,
|
|
163
|
+
cached: false,
|
|
164
|
+
};
|
|
165
|
+
cacheSet(key, r);
|
|
166
|
+
return r;
|
|
167
|
+
}
|
|
168
|
+
const fetchImpl = input.fetchImpl ?? fetch;
|
|
169
|
+
const model = input.model ?? 'gemini-2.5-flash-lite';
|
|
170
|
+
const timeoutMs = input.timeoutMs ?? 2500;
|
|
171
|
+
let raw = '';
|
|
172
|
+
try {
|
|
173
|
+
raw = await callGemini(text, apiKey, model, fetchImpl, timeoutMs);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
177
|
+
signals.push('classifier_unreachable[' + msg.slice(0, 60) + ']');
|
|
178
|
+
const r = {
|
|
179
|
+
tier: input.gate_tier,
|
|
180
|
+
confidence: 0.50,
|
|
181
|
+
verdict: null,
|
|
182
|
+
signals,
|
|
183
|
+
cached: false,
|
|
184
|
+
};
|
|
185
|
+
cacheSet(key, r);
|
|
186
|
+
return r;
|
|
187
|
+
}
|
|
188
|
+
const verdict = parseVerdict(raw);
|
|
189
|
+
if (!verdict) {
|
|
190
|
+
signals.push('classifier_unparseable[' + raw.slice(0, 30) + ']');
|
|
191
|
+
const r = {
|
|
192
|
+
tier: input.gate_tier,
|
|
193
|
+
confidence: 0.50,
|
|
194
|
+
verdict: null,
|
|
195
|
+
signals,
|
|
196
|
+
cached: false,
|
|
197
|
+
};
|
|
198
|
+
cacheSet(key, r);
|
|
199
|
+
return r;
|
|
200
|
+
}
|
|
201
|
+
signals.push('classifier_verdict[' + verdict + ']');
|
|
202
|
+
const tier = verdictToTier(verdict, input.gate_tier);
|
|
203
|
+
const r = {
|
|
204
|
+
tier,
|
|
205
|
+
confidence: verdict === 'destructive' ? 0.95 : 0.88,
|
|
206
|
+
verdict,
|
|
207
|
+
signals,
|
|
208
|
+
cached: false,
|
|
209
|
+
};
|
|
210
|
+
cacheSet(key, r);
|
|
211
|
+
return r;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=turn_classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn_classifier.js","sourceRoot":"","sources":["../../src/core/turn_classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface WhatsNewEntry {
|
|
2
|
+
version: string;
|
|
3
|
+
date: string;
|
|
4
|
+
summary: string;
|
|
5
|
+
bullets: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare const CATALOG: WhatsNewEntry[];
|
|
8
|
+
export interface WhatsNewResult {
|
|
9
|
+
current_version: string;
|
|
10
|
+
last_seen_version: string | null;
|
|
11
|
+
entries: WhatsNewEntry[];
|
|
12
|
+
}
|
|
13
|
+
declare function lastSeenPath(): string;
|
|
14
|
+
export declare function readLastSeen(): Promise<string | null>;
|
|
15
|
+
export declare function writeLastSeen(version: string): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Parse a semver-ish version into a comparable tuple.
|
|
18
|
+
* "0.2.0-alpha.59k" -> [0, 2, 0, "alpha", 59, "k"]
|
|
19
|
+
* Releases without prerelease ("1.0.0") sort AFTER any prerelease
|
|
20
|
+
* of the same base.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseVersion(v: string): {
|
|
23
|
+
base: [number, number, number];
|
|
24
|
+
preLabel: string | null;
|
|
25
|
+
preNum: number;
|
|
26
|
+
preTail: string;
|
|
27
|
+
};
|
|
28
|
+
/** Returns negative when a < b, positive when a > b, 0 when equal. */
|
|
29
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
30
|
+
/**
|
|
31
|
+
* Returns the cumulative list of WhatsNewEntry that the user has
|
|
32
|
+
* not seen yet. Entries strictly greater than last_seen and
|
|
33
|
+
* <= current_version. When last_seen is null, returns the latest
|
|
34
|
+
* entry only (avoid wall-of-text on a fresh install).
|
|
35
|
+
*/
|
|
36
|
+
export declare function computeWhatsNew(currentVersion: string): Promise<WhatsNewResult>;
|
|
37
|
+
/** Test seam. */
|
|
38
|
+
export declare const _internal: {
|
|
39
|
+
lastSeenPath: typeof lastSeenPath;
|
|
40
|
+
};
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=whats_new.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../../src/core/whats_new.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAK,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAID,eAAO,MAAM,OAAO,EAAE,aAAa,EAqFlC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,iBAAS,YAAY,IAAI,MAAM,CAI9B;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ3D;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG;IACvC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAI,MAAM,CAAC;IACjB,OAAO,EAAG,MAAM,CAAC;CAClB,CAaA;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAoB5D;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,cAAc,CAAC,CAqBzB;AAED,iBAAiB;AACjB,eAAO,MAAM,SAAS;;CAAmB,CAAC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "What's new" notification (alpha.59l).
|
|
3
|
+
*
|
|
4
|
+
* Tracks the version Pablo (or any user) last opened the panel with.
|
|
5
|
+
* On boot, the server compares with the currently installed version
|
|
6
|
+
* and returns the cumulative bullet list of changes between the two,
|
|
7
|
+
* so the panel can show a one-shot dismissable banner.
|
|
8
|
+
*
|
|
9
|
+
* Storage:
|
|
10
|
+
* ~/.yujin-forge/last_seen_version -- plain text file with the
|
|
11
|
+
* version string. Atomic
|
|
12
|
+
* tmp+rename write. Missing
|
|
13
|
+
* file = "never seen" -> show
|
|
14
|
+
* everything from CATALOG.
|
|
15
|
+
*
|
|
16
|
+
* Catalog lives inline (`CATALOG` below). Adding a new entry is a
|
|
17
|
+
* one-line edit per alpha. Versions are compared by tuple of
|
|
18
|
+
* [major, minor, patch, pre_label, pre_num] so 0.2.0-alpha.59k <
|
|
19
|
+
* 0.2.0-alpha.59l < 0.2.0-alpha.60 < 0.2.0.
|
|
20
|
+
*
|
|
21
|
+
* ASCII-only.
|
|
22
|
+
*/
|
|
23
|
+
import { promises as fs } from 'node:fs';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
import os from 'node:os';
|
|
26
|
+
/* The catalog is ordered newest-first. Sumi adds an entry at the
|
|
27
|
+
* top with every shipped alpha that has a user-visible change. */
|
|
28
|
+
export const CATALOG = [
|
|
29
|
+
{
|
|
30
|
+
version: '0.2.0-alpha.59l',
|
|
31
|
+
date: '2026-06-01',
|
|
32
|
+
summary: 'First-run "what changed" banner',
|
|
33
|
+
bullets: [
|
|
34
|
+
'New: this banner. Shown once per version upgrade.',
|
|
35
|
+
'Dismiss to mark seen. Re-shown only on the next yf upgrade.',
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
version: '0.2.0-alpha.59k',
|
|
40
|
+
date: '2026-06-01',
|
|
41
|
+
summary: 'Server-side cost meter (billing-grade caps)',
|
|
42
|
+
bullets: [
|
|
43
|
+
'Authoritative monthly token counter lives in Cloudflare KV.',
|
|
44
|
+
'Worker enforces plan cap (free-public 200k eco, paid 2M, etc) before upstream call.',
|
|
45
|
+
'429 monthly_cap_reached when usage projection >= cap.',
|
|
46
|
+
'New endpoint GET /v1/cost-meter/<handle> exposes the row + caps for the budget UI.',
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
version: '0.2.0-alpha.59j',
|
|
51
|
+
date: '2026-06-01',
|
|
52
|
+
summary: 'ANSI rendering + reader bookmarks + audit detail',
|
|
53
|
+
bullets: [
|
|
54
|
+
'Shell pizarron tabs strip ANSI escapes + collapse \\r progress bars.',
|
|
55
|
+
'Settings -> Reader bookmarks lists every persisted bookmark; click jumps the reader.',
|
|
56
|
+
'Audit log row click opens a detail modal with full JSON + copy button.',
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
version: '0.2.0-alpha.59i',
|
|
61
|
+
date: '2026-06-01',
|
|
62
|
+
summary: 'Approval mid-stream + shell kill button',
|
|
63
|
+
bullets: [
|
|
64
|
+
'Approval modal now appears mid-turn via SSE, not after the call.',
|
|
65
|
+
'Shell pizarron tabs gain a stop button to kill the running process (SIGTERM -> SIGKILL).',
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
version: '0.2.0-alpha.59h',
|
|
70
|
+
date: '2026-06-01',
|
|
71
|
+
summary: 'xAI + Mistral + Cohere runtime clients',
|
|
72
|
+
bullets: [
|
|
73
|
+
'Brain provider catalog now covers 8/8 runtimes wired.',
|
|
74
|
+
'BYOK keys for xAI / Mistral / Cohere can be set via yf keys set.',
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
version: '0.2.0-alpha.59g',
|
|
79
|
+
date: '2026-05-31',
|
|
80
|
+
summary: 'Audit log viewer + DeepSeek client',
|
|
81
|
+
bullets: [
|
|
82
|
+
'Settings -> Audit log shows the last 200 entries with kind + approval-mode filters.',
|
|
83
|
+
'DeepSeek wired as a runtime brain provider.',
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
version: '0.2.0-alpha.59f',
|
|
88
|
+
date: '2026-05-31',
|
|
89
|
+
summary: 'Shell live stream via SSE',
|
|
90
|
+
bullets: [
|
|
91
|
+
'Shell.exec output streams progressively into the pizarron tab as it runs.',
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
version: '0.2.0-alpha.59e',
|
|
96
|
+
date: '2026-05-31',
|
|
97
|
+
summary: 'SSE streaming + autonomous multi-step',
|
|
98
|
+
bullets: [
|
|
99
|
+
'Chat turns now stream tool rounds via Server-Sent Events.',
|
|
100
|
+
'Autonomous mode lifts the tool-rounds cap to 50 with loop detection.',
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
version: '0.2.0-alpha.59d',
|
|
105
|
+
date: '2026-05-31',
|
|
106
|
+
summary: 'shell.exec verb + Danger Zone',
|
|
107
|
+
bullets: [
|
|
108
|
+
'yujin.shell.exec runs commands with safe / destructive / elevation / network classification.',
|
|
109
|
+
'Danger Zone toggle auto-approves everything for velocity (audit-logged as bypass).',
|
|
110
|
+
'Audit log persists every gated action to ~/.yujin-forge/cache/audit_log.jsonl.',
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
];
|
|
114
|
+
function lastSeenPath() {
|
|
115
|
+
const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
116
|
+
const base = process.env.YF_CONFIG_DIR || path.join(home, '.yujin-forge');
|
|
117
|
+
return path.join(base, 'last_seen_version');
|
|
118
|
+
}
|
|
119
|
+
export async function readLastSeen() {
|
|
120
|
+
try {
|
|
121
|
+
const raw = await fs.readFile(lastSeenPath(), 'utf-8');
|
|
122
|
+
const trimmed = raw.trim();
|
|
123
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export async function writeLastSeen(version) {
|
|
130
|
+
const p = lastSeenPath();
|
|
131
|
+
await fs.mkdir(path.dirname(p), { recursive: true });
|
|
132
|
+
const tmp = p + '.tmp';
|
|
133
|
+
await fs.writeFile(tmp, version, 'utf-8');
|
|
134
|
+
await fs.rename(tmp, p);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Parse a semver-ish version into a comparable tuple.
|
|
138
|
+
* "0.2.0-alpha.59k" -> [0, 2, 0, "alpha", 59, "k"]
|
|
139
|
+
* Releases without prerelease ("1.0.0") sort AFTER any prerelease
|
|
140
|
+
* of the same base.
|
|
141
|
+
*/
|
|
142
|
+
export function parseVersion(v) {
|
|
143
|
+
const m = /^(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z]+)\.(\d+)([a-zA-Z]*))?$/.exec(v);
|
|
144
|
+
if (!m) {
|
|
145
|
+
return { base: [0, 0, 0], preLabel: null, preNum: 0, preTail: '' };
|
|
146
|
+
}
|
|
147
|
+
const base = [Number(m[1]), Number(m[2]), Number(m[3])];
|
|
148
|
+
if (!m[4])
|
|
149
|
+
return { base, preLabel: null, preNum: 0, preTail: '' };
|
|
150
|
+
return {
|
|
151
|
+
base,
|
|
152
|
+
preLabel: m[4],
|
|
153
|
+
preNum: Number(m[5]),
|
|
154
|
+
preTail: m[6] || '',
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/** Returns negative when a < b, positive when a > b, 0 when equal. */
|
|
158
|
+
export function compareVersions(a, b) {
|
|
159
|
+
const pa = parseVersion(a);
|
|
160
|
+
const pb = parseVersion(b);
|
|
161
|
+
for (let i = 0; i < 3; i++) {
|
|
162
|
+
const ai = pa.base[i] ?? 0;
|
|
163
|
+
const bi = pb.base[i] ?? 0;
|
|
164
|
+
if (ai !== bi)
|
|
165
|
+
return ai - bi;
|
|
166
|
+
}
|
|
167
|
+
/* Release (no preLabel) > any prerelease of same base. */
|
|
168
|
+
if (pa.preLabel === null && pb.preLabel !== null)
|
|
169
|
+
return 1;
|
|
170
|
+
if (pa.preLabel !== null && pb.preLabel === null)
|
|
171
|
+
return -1;
|
|
172
|
+
if (pa.preLabel === null && pb.preLabel === null)
|
|
173
|
+
return 0;
|
|
174
|
+
/* Both have preLabel. Compare label alphabetically. */
|
|
175
|
+
const la = pa.preLabel ?? '';
|
|
176
|
+
const lb = pb.preLabel ?? '';
|
|
177
|
+
if (la !== lb)
|
|
178
|
+
return la < lb ? -1 : 1;
|
|
179
|
+
if (pa.preNum !== pb.preNum)
|
|
180
|
+
return pa.preNum - pb.preNum;
|
|
181
|
+
/* Both have same preLabel + preNum. Compare tail alphabetically. */
|
|
182
|
+
if (pa.preTail !== pb.preTail)
|
|
183
|
+
return pa.preTail < pb.preTail ? -1 : 1;
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Returns the cumulative list of WhatsNewEntry that the user has
|
|
188
|
+
* not seen yet. Entries strictly greater than last_seen and
|
|
189
|
+
* <= current_version. When last_seen is null, returns the latest
|
|
190
|
+
* entry only (avoid wall-of-text on a fresh install).
|
|
191
|
+
*/
|
|
192
|
+
export async function computeWhatsNew(currentVersion) {
|
|
193
|
+
const lastSeen = await readLastSeen();
|
|
194
|
+
if (!lastSeen) {
|
|
195
|
+
/* Fresh install -- show only the latest entry (avoid scaring
|
|
196
|
+
* a first-time user with the full 9-entry backlog). */
|
|
197
|
+
const newest = CATALOG[0];
|
|
198
|
+
return {
|
|
199
|
+
current_version: currentVersion,
|
|
200
|
+
last_seen_version: null,
|
|
201
|
+
entries: newest ? [newest] : [],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
if (compareVersions(lastSeen, currentVersion) >= 0) {
|
|
205
|
+
/* Already at or past current. Nothing to show. */
|
|
206
|
+
return { current_version: currentVersion, last_seen_version: lastSeen, entries: [] };
|
|
207
|
+
}
|
|
208
|
+
const entries = CATALOG.filter((e) => compareVersions(e.version, lastSeen) > 0 &&
|
|
209
|
+
compareVersions(e.version, currentVersion) <= 0);
|
|
210
|
+
return { current_version: currentVersion, last_seen_version: lastSeen, entries };
|
|
211
|
+
}
|
|
212
|
+
/** Test seam. */
|
|
213
|
+
export const _internal = { lastSeenPath };
|
|
214
|
+
//# sourceMappingURL=whats_new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whats_new.js","sourceRoot":"","sources":["../../src/core/whats_new.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deploy adapter abstraction.
|
|
3
|
+
*
|
|
4
|
+
* Forge supports multiple cloud targets. Each one is encapsulated
|
|
5
|
+
* as a DeployAdapter implementation. The tier-aware selector
|
|
6
|
+
* picks the right adapter for a project based on:
|
|
7
|
+
*
|
|
8
|
+
* - workflow.tier (Simple / Medium / Full)
|
|
9
|
+
* - workflow.clarification.nfr_quantitative.volume
|
|
10
|
+
* - workflow.clarification.nfr_quantitative.parallelism
|
|
11
|
+
* - workflow.clarification.nfr_structural.persistence
|
|
12
|
+
* - workflow.clarification.nfr_structural.workers
|
|
13
|
+
*
|
|
14
|
+
* Rules of thumb (codified in pickDeployAdapter):
|
|
15
|
+
* - Simple tier + no queue + no workers -> Cloudflare Pages/Workers
|
|
16
|
+
* - Medium tier OR has queue OR has workers -> Cloudflare Pages + R2 + Queues
|
|
17
|
+
* - Full tier OR persistent stateful workers OR custom infra -> AWS ECS Fargate
|
|
18
|
+
*
|
|
19
|
+
* The user can override via `yf operate deploy-guided --adapter <id>`.
|
|
20
|
+
*
|
|
21
|
+
* Adapter contract:
|
|
22
|
+
* - id: short slug ("cloudflare" | "aws" | "vercel" | ...).
|
|
23
|
+
* - description: one-liner for the picker UX.
|
|
24
|
+
* - tierFit(): which tiers this adapter is appropriate for.
|
|
25
|
+
* - readyToRun(): credentials check (e.g. wrangler logged in).
|
|
26
|
+
* - plan(input): dry-run -> { resources, estimated_cost_usd }.
|
|
27
|
+
* - apply(input): real deploy -> { url, logs, deployed_at }.
|
|
28
|
+
*
|
|
29
|
+
* For alpha.19 only `cloudflare` is wired end-to-end. `aws` keeps
|
|
30
|
+
* the existing imperative path; the adapter is a thin shell over
|
|
31
|
+
* it. `vercel` is a stub for future.
|
|
32
|
+
*
|
|
33
|
+
* ASCII-only.
|
|
34
|
+
*/
|
|
35
|
+
import type { WorkflowState } from '../workflow/state.js';
|
|
36
|
+
export type DeployAdapterId = 'cloudflare' | 'aws' | 'vercel';
|
|
37
|
+
export type Tier = 'simple' | 'medium' | 'full';
|
|
38
|
+
export interface DeployPlan {
|
|
39
|
+
resources: string[];
|
|
40
|
+
estimated_cost_usd: number;
|
|
41
|
+
estimated_minutes: number;
|
|
42
|
+
notes: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface DeployResult {
|
|
45
|
+
url: string;
|
|
46
|
+
deployed_at: string;
|
|
47
|
+
build_seconds: number;
|
|
48
|
+
logs_tail: string[];
|
|
49
|
+
}
|
|
50
|
+
export interface DeployInput {
|
|
51
|
+
/** Absolute path to the build output (dist/ or .next/ or similar). */
|
|
52
|
+
buildDir: string;
|
|
53
|
+
/** Project slug (Cloudflare project name / AWS service name). */
|
|
54
|
+
projectSlug: string;
|
|
55
|
+
/** Optional env vars to expose. */
|
|
56
|
+
env?: Record<string, string>;
|
|
57
|
+
/** Tenant / user handle for multi-tenant adapters. */
|
|
58
|
+
userHandle?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface DeployAdapter {
|
|
61
|
+
id: DeployAdapterId;
|
|
62
|
+
description: string;
|
|
63
|
+
tierFit(): Tier[];
|
|
64
|
+
/** Cheap check -- does the local env have what this adapter
|
|
65
|
+
* needs (credentials, CLI tools)? Returns ok + reason. */
|
|
66
|
+
readyToRun(): Promise<{
|
|
67
|
+
ok: boolean;
|
|
68
|
+
reason?: string;
|
|
69
|
+
}>;
|
|
70
|
+
/** Dry-run plan: lists resources + cost estimate. No network
|
|
71
|
+
* writes beyond auth pings. */
|
|
72
|
+
plan(input: DeployInput): Promise<DeployPlan>;
|
|
73
|
+
/** Real deploy. Should be idempotent: re-running with the same
|
|
74
|
+
* input updates an existing deployment rather than creating
|
|
75
|
+
* a duplicate. */
|
|
76
|
+
apply(input: DeployInput): Promise<DeployResult>;
|
|
77
|
+
}
|
|
78
|
+
export interface AdapterSelection {
|
|
79
|
+
adapter: DeployAdapterId;
|
|
80
|
+
reason: string;
|
|
81
|
+
alternatives: DeployAdapterId[];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Pick the right adapter for a workflow snapshot.
|
|
85
|
+
*
|
|
86
|
+
* Conservative heuristic: bias toward Cloudflare for simple +
|
|
87
|
+
* medium projects (cheap + fast + edge), AWS for heavy or
|
|
88
|
+
* stateful workloads. Adapters that fail readyToRun() are not
|
|
89
|
+
* filtered out here -- the caller is expected to surface the
|
|
90
|
+
* "not ready" message after the pick + offer a fallback.
|
|
91
|
+
*/
|
|
92
|
+
export declare function pickDeployAdapter(wf: Partial<WorkflowState>, override?: DeployAdapterId): AdapterSelection;
|
|
93
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/deploy/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE9D,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAY,MAAM,EAAE,CAAC;IAC9B,kBAAkB,EAAG,MAAM,CAAC;IAC5B,iBAAiB,EAAI,MAAM,CAAC;IAC5B,KAAK,EAAgB,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAY,MAAM,CAAC;IACtB,WAAW,EAAI,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAM,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,QAAQ,EAAK,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,GAAG,CAAC,EAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAW,eAAe,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,IAAM,IAAI,EAAE,CAAC;IACpB;+DAC2D;IAC3D,UAAU,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD;oCACgC;IAChC,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C;;uBAEmB;IACnB,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAClD;AAMD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAK,eAAe,CAAC;IAC5B,MAAM,EAAM,MAAM,CAAC;IACnB,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC;AAcD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,OAAO,CAAC,aAAa,CAAC,EAC1B,QAAQ,CAAC,EAAE,eAAe,GACzB,gBAAgB,CAmClB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pick the right adapter for a workflow snapshot.
|
|
3
|
+
*
|
|
4
|
+
* Conservative heuristic: bias toward Cloudflare for simple +
|
|
5
|
+
* medium projects (cheap + fast + edge), AWS for heavy or
|
|
6
|
+
* stateful workloads. Adapters that fail readyToRun() are not
|
|
7
|
+
* filtered out here -- the caller is expected to surface the
|
|
8
|
+
* "not ready" message after the pick + offer a fallback.
|
|
9
|
+
*/
|
|
10
|
+
export function pickDeployAdapter(wf, override) {
|
|
11
|
+
if (override) {
|
|
12
|
+
return {
|
|
13
|
+
adapter: override,
|
|
14
|
+
reason: 'explicit override',
|
|
15
|
+
alternatives: ['cloudflare', 'aws', 'vercel']
|
|
16
|
+
.filter((a) => a !== override),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const tier = (wf.tier ?? 'simple');
|
|
20
|
+
const nfrS = (wf.clarification?.nfr_structural ?? {});
|
|
21
|
+
const nfrQ = (wf.clarification?.nfr_quantitative ?? {});
|
|
22
|
+
/* Hard signals that push to AWS. */
|
|
23
|
+
const persistentWorkers = nfrS.workers === true
|
|
24
|
+
|| (typeof nfrS.persistence === 'string' && /postgres|mysql|mssql/.test(nfrS.persistence));
|
|
25
|
+
const heavyParallelism = typeof nfrQ.parallelism === 'string'
|
|
26
|
+
&& /high|heavy|many/i.test(nfrQ.parallelism);
|
|
27
|
+
if (tier === 'full' || persistentWorkers || heavyParallelism) {
|
|
28
|
+
return {
|
|
29
|
+
adapter: 'aws',
|
|
30
|
+
reason: 'tier=' + tier + (persistentWorkers ? '; persistent workers' : '')
|
|
31
|
+
+ (heavyParallelism ? '; heavy parallelism' : ''),
|
|
32
|
+
alternatives: ['cloudflare', 'vercel'],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/* Simple + medium default to Cloudflare. */
|
|
36
|
+
return {
|
|
37
|
+
adapter: 'cloudflare',
|
|
38
|
+
reason: 'tier=' + tier + ' (cheap edge + fast deploys)',
|
|
39
|
+
alternatives: ['vercel', 'aws'],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/deploy/adapter.ts"],"names":[],"mappings":"AAuGA;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAA0B,EAC1B,QAA0B;IAE1B,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,mBAAmB;YAC3B,YAAY,EAAG,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAuB;iBACjE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC;SACjC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,QAAQ,CAAS,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,IAAI,EAAE,CAAsB,CAAC;IAC3E,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,gBAAgB,IAAI,EAAE,CAAwB,CAAC;IAE/E,oCAAoC;IACpC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI;WAC1C,CAAC,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7F,MAAM,gBAAgB,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;WACxD,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE/C,IAAI,IAAI,KAAK,MAAM,IAAI,iBAAiB,IAAI,gBAAgB,EAAE,CAAC;QAC7D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;kBACtE,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,YAAY,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,8BAA8B;QACvD,YAAY,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;KAChC,CAAC;AACJ,CAAC"}
|