agent-nuvira 3.3.13 → 3.3.14
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 +67 -1
- package/dist/agents/agents/planner.d.ts.map +1 -1
- package/dist/agents/agents/planner.js +9 -0
- package/dist/agents/agents/planner.js.map +1 -1
- package/dist/agents/orchestrator.d.ts +31 -0
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +74 -126
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/cli/chat.d.ts +89 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +765 -33
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/cli-program.d.ts.map +1 -1
- package/dist/cli/cli-program.js +12 -0
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/cli/config.d.ts +12 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +86 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/decisions.d.ts +28 -0
- package/dist/cli/decisions.d.ts.map +1 -0
- package/dist/cli/decisions.js +140 -0
- package/dist/cli/decisions.js.map +1 -0
- package/dist/cli/doctor.d.ts +6 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +46 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/failover-runner.d.ts.map +1 -1
- package/dist/cli/failover-runner.js +19 -1
- package/dist/cli/failover-runner.js.map +1 -1
- package/dist/cli/feedback.d.ts.map +1 -1
- package/dist/cli/feedback.js +5 -1
- package/dist/cli/feedback.js.map +1 -1
- package/dist/cli/hooks.d.ts +30 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +224 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/knowledge.d.ts +9 -1
- package/dist/cli/knowledge.d.ts.map +1 -1
- package/dist/cli/knowledge.js +93 -2
- package/dist/cli/knowledge.js.map +1 -1
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +47 -12
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/cli/model.d.ts +20 -0
- package/dist/cli/model.d.ts.map +1 -1
- package/dist/cli/model.js +294 -14
- package/dist/cli/model.js.map +1 -1
- package/dist/cli/rate.d.ts +78 -0
- package/dist/cli/rate.d.ts.map +1 -0
- package/dist/cli/rate.js +294 -0
- package/dist/cli/rate.js.map +1 -0
- package/dist/config/process-env.d.ts.map +1 -1
- package/dist/config/process-env.js +10 -0
- package/dist/config/process-env.js.map +1 -1
- package/dist/enterprise/vault.d.ts.map +1 -1
- package/dist/enterprise/vault.js +5 -21
- package/dist/enterprise/vault.js.map +1 -1
- package/dist/gateway/hook-contract.d.ts +33 -0
- package/dist/gateway/hook-contract.d.ts.map +1 -1
- package/dist/gateway/hook-contract.js +97 -0
- package/dist/gateway/hook-contract.js.map +1 -1
- package/dist/inference/gemini-adapter.d.ts.map +1 -1
- package/dist/inference/gemini-adapter.js +4 -0
- package/dist/inference/gemini-adapter.js.map +1 -1
- package/dist/inference/interface.d.ts +37 -0
- package/dist/inference/interface.d.ts.map +1 -1
- package/dist/inference/native-tools.d.ts +16 -1
- package/dist/inference/native-tools.d.ts.map +1 -1
- package/dist/inference/native-tools.js +34 -10
- package/dist/inference/native-tools.js.map +1 -1
- package/dist/inference/route-resolver.d.ts +30 -0
- package/dist/inference/route-resolver.d.ts.map +1 -1
- package/dist/inference/route-resolver.js +158 -1
- package/dist/inference/route-resolver.js.map +1 -1
- package/dist/inference/tools.d.ts +16 -1
- package/dist/inference/tools.d.ts.map +1 -1
- package/dist/inference/tools.js +51 -18
- package/dist/inference/tools.js.map +1 -1
- package/dist/learning/acceptance-model.d.ts +247 -0
- package/dist/learning/acceptance-model.d.ts.map +1 -0
- package/dist/learning/acceptance-model.js +708 -0
- package/dist/learning/acceptance-model.js.map +1 -0
- package/dist/learning/auto-router.d.ts +68 -24
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +301 -96
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/autonomy-policy.d.ts +12 -16
- package/dist/learning/autonomy-policy.d.ts.map +1 -1
- package/dist/learning/autonomy-policy.js +50 -48
- package/dist/learning/autonomy-policy.js.map +1 -1
- package/dist/learning/behavioural-labels.d.ts +86 -0
- package/dist/learning/behavioural-labels.d.ts.map +1 -0
- package/dist/learning/behavioural-labels.js +166 -0
- package/dist/learning/behavioural-labels.js.map +1 -0
- package/dist/learning/capability-evidence.d.ts +167 -0
- package/dist/learning/capability-evidence.d.ts.map +1 -0
- package/dist/learning/capability-evidence.js +210 -0
- package/dist/learning/capability-evidence.js.map +1 -0
- package/dist/learning/capability-readiness.d.ts +64 -0
- package/dist/learning/capability-readiness.d.ts.map +1 -0
- package/dist/learning/capability-readiness.js +74 -0
- package/dist/learning/capability-readiness.js.map +1 -0
- package/dist/learning/capability-types.d.ts +169 -0
- package/dist/learning/capability-types.d.ts.map +1 -0
- package/dist/learning/capability-types.js +20 -0
- package/dist/learning/capability-types.js.map +1 -0
- package/dist/learning/catalog-feed.d.ts +89 -0
- package/dist/learning/catalog-feed.d.ts.map +1 -0
- package/dist/learning/catalog-feed.js +211 -0
- package/dist/learning/catalog-feed.js.map +1 -0
- package/dist/learning/cli-intent-effects.d.ts +60 -0
- package/dist/learning/cli-intent-effects.d.ts.map +1 -0
- package/dist/learning/cli-intent-effects.js +153 -0
- package/dist/learning/cli-intent-effects.js.map +1 -0
- package/dist/learning/command-adaptation.d.ts +41 -0
- package/dist/learning/command-adaptation.d.ts.map +1 -0
- package/dist/learning/command-adaptation.js +122 -0
- package/dist/learning/command-adaptation.js.map +1 -0
- package/dist/learning/consent-picture.d.ts +42 -0
- package/dist/learning/consent-picture.d.ts.map +1 -0
- package/dist/learning/consent-picture.js +53 -0
- package/dist/learning/consent-picture.js.map +1 -0
- package/dist/learning/context-budget.d.ts +37 -6
- package/dist/learning/context-budget.d.ts.map +1 -1
- package/dist/learning/context-budget.js +38 -9
- package/dist/learning/context-budget.js.map +1 -1
- package/dist/learning/decision-log.d.ts +114 -0
- package/dist/learning/decision-log.d.ts.map +1 -0
- package/dist/learning/decision-log.js +296 -0
- package/dist/learning/decision-log.js.map +1 -0
- package/dist/learning/deliverable-class.d.ts.map +1 -1
- package/dist/learning/deliverable-class.js +19 -0
- package/dist/learning/deliverable-class.js.map +1 -1
- package/dist/learning/deliverable-corpus.d.ts +117 -0
- package/dist/learning/deliverable-corpus.d.ts.map +1 -0
- package/dist/learning/deliverable-corpus.js +176 -0
- package/dist/learning/deliverable-corpus.js.map +1 -0
- package/dist/learning/error-repair.d.ts +22 -1
- package/dist/learning/error-repair.d.ts.map +1 -1
- package/dist/learning/error-repair.js +37 -0
- package/dist/learning/error-repair.js.map +1 -1
- package/dist/learning/exhaustion-report.d.ts +136 -0
- package/dist/learning/exhaustion-report.d.ts.map +1 -0
- package/dist/learning/exhaustion-report.js +239 -0
- package/dist/learning/exhaustion-report.js.map +1 -0
- package/dist/learning/failure-bookkeeping.d.ts +16 -0
- package/dist/learning/failure-bookkeeping.d.ts.map +1 -1
- package/dist/learning/failure-bookkeeping.js +51 -5
- package/dist/learning/failure-bookkeeping.js.map +1 -1
- package/dist/learning/gate-friction.d.ts +39 -0
- package/dist/learning/gate-friction.d.ts.map +1 -0
- package/dist/learning/gate-friction.js +91 -0
- package/dist/learning/gate-friction.js.map +1 -0
- package/dist/learning/harness-narration.d.ts +34 -0
- package/dist/learning/harness-narration.d.ts.map +1 -0
- package/dist/learning/harness-narration.js +58 -0
- package/dist/learning/harness-narration.js.map +1 -0
- package/dist/learning/hub-skill-catalog.d.ts.map +1 -1
- package/dist/learning/hub-skill-catalog.js +1 -2
- package/dist/learning/hub-skill-catalog.js.map +1 -1
- package/dist/learning/hybrid-router.d.ts +65 -0
- package/dist/learning/hybrid-router.d.ts.map +1 -1
- package/dist/learning/hybrid-router.js +186 -0
- package/dist/learning/hybrid-router.js.map +1 -1
- package/dist/learning/knowledge-base.d.ts +229 -3
- package/dist/learning/knowledge-base.d.ts.map +1 -1
- package/dist/learning/knowledge-base.js +593 -24
- package/dist/learning/knowledge-base.js.map +1 -1
- package/dist/learning/knowledge-eval.d.ts +171 -0
- package/dist/learning/knowledge-eval.d.ts.map +1 -0
- package/dist/learning/knowledge-eval.js +196 -0
- package/dist/learning/knowledge-eval.js.map +1 -0
- package/dist/learning/knowledge-turn.d.ts +92 -0
- package/dist/learning/knowledge-turn.d.ts.map +1 -0
- package/dist/learning/knowledge-turn.js +190 -0
- package/dist/learning/knowledge-turn.js.map +1 -0
- package/dist/learning/learned-commands.d.ts +64 -0
- package/dist/learning/learned-commands.d.ts.map +1 -0
- package/dist/learning/learned-commands.js +108 -0
- package/dist/learning/learned-commands.js.map +1 -0
- package/dist/learning/lexical-search.d.ts +50 -0
- package/dist/learning/lexical-search.d.ts.map +1 -0
- package/dist/learning/lexical-search.js +111 -0
- package/dist/learning/lexical-search.js.map +1 -0
- package/dist/learning/machine-facts.d.ts +71 -0
- package/dist/learning/machine-facts.d.ts.map +1 -0
- package/dist/learning/machine-facts.js +164 -0
- package/dist/learning/machine-facts.js.map +1 -0
- package/dist/learning/markdown-outline.d.ts +73 -0
- package/dist/learning/markdown-outline.d.ts.map +1 -0
- package/dist/learning/markdown-outline.js +136 -0
- package/dist/learning/markdown-outline.js.map +1 -0
- package/dist/learning/model-first-router.d.ts +33 -1
- package/dist/learning/model-first-router.d.ts.map +1 -1
- package/dist/learning/model-first-router.js +123 -9
- package/dist/learning/model-first-router.js.map +1 -1
- package/dist/learning/model-identity.d.ts +80 -0
- package/dist/learning/model-identity.d.ts.map +1 -0
- package/dist/learning/model-identity.js +115 -0
- package/dist/learning/model-identity.js.map +1 -0
- package/dist/learning/model-registry.d.ts +141 -2
- package/dist/learning/model-registry.d.ts.map +1 -1
- package/dist/learning/model-registry.js +324 -38
- package/dist/learning/model-registry.js.map +1 -1
- package/dist/learning/model-scoring.d.ts.map +1 -1
- package/dist/learning/model-scoring.js +8 -1
- package/dist/learning/model-scoring.js.map +1 -1
- package/dist/learning/model-selection.d.ts.map +1 -1
- package/dist/learning/model-selection.js +41 -0
- package/dist/learning/model-selection.js.map +1 -1
- package/dist/learning/outcome-observation.d.ts +49 -0
- package/dist/learning/outcome-observation.d.ts.map +1 -0
- package/dist/learning/outcome-observation.js +95 -0
- package/dist/learning/outcome-observation.js.map +1 -0
- package/dist/learning/pair-entitlement.d.ts +184 -0
- package/dist/learning/pair-entitlement.d.ts.map +1 -0
- package/dist/learning/pair-entitlement.js +214 -0
- package/dist/learning/pair-entitlement.js.map +1 -0
- package/dist/learning/provider-fallback.d.ts +23 -1
- package/dist/learning/provider-fallback.d.ts.map +1 -1
- package/dist/learning/provider-fallback.js +24 -0
- package/dist/learning/provider-fallback.js.map +1 -1
- package/dist/learning/reasoning-trace.d.ts +65 -1
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js +123 -1
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/requirement-probe.d.ts +55 -0
- package/dist/learning/requirement-probe.d.ts.map +1 -0
- package/dist/learning/requirement-probe.js +77 -0
- package/dist/learning/requirement-probe.js.map +1 -0
- package/dist/learning/resilient-call.d.ts +20 -1
- package/dist/learning/resilient-call.d.ts.map +1 -1
- package/dist/learning/resilient-call.js +42 -4
- package/dist/learning/resilient-call.js.map +1 -1
- package/dist/learning/response-usability.d.ts +85 -0
- package/dist/learning/response-usability.d.ts.map +1 -0
- package/dist/learning/response-usability.js +135 -0
- package/dist/learning/response-usability.js.map +1 -0
- package/dist/learning/router-bandit.d.ts +132 -0
- package/dist/learning/router-bandit.d.ts.map +1 -1
- package/dist/learning/router-bandit.js +253 -0
- package/dist/learning/router-bandit.js.map +1 -1
- package/dist/learning/routing-history.d.ts +41 -2
- package/dist/learning/routing-history.d.ts.map +1 -1
- package/dist/learning/routing-history.js.map +1 -1
- package/dist/learning/run-trace.d.ts +21 -0
- package/dist/learning/run-trace.d.ts.map +1 -1
- package/dist/learning/run-trace.js +38 -0
- package/dist/learning/run-trace.js.map +1 -1
- package/dist/learning/session-grant.d.ts +75 -0
- package/dist/learning/session-grant.d.ts.map +1 -0
- package/dist/learning/session-grant.js +112 -0
- package/dist/learning/session-grant.js.map +1 -0
- package/dist/learning/task-model-continuity.d.ts +73 -0
- package/dist/learning/task-model-continuity.d.ts.map +1 -0
- package/dist/learning/task-model-continuity.js +87 -0
- package/dist/learning/task-model-continuity.js.map +1 -0
- package/dist/learning/turn-feedback.d.ts +93 -0
- package/dist/learning/turn-feedback.d.ts.map +1 -0
- package/dist/learning/turn-feedback.js +127 -0
- package/dist/learning/turn-feedback.js.map +1 -0
- package/dist/learning/turn-report.d.ts +104 -2
- package/dist/learning/turn-report.d.ts.map +1 -1
- package/dist/learning/turn-report.js +161 -6
- package/dist/learning/turn-report.js.map +1 -1
- package/dist/learning/verdict-routing.d.ts +51 -0
- package/dist/learning/verdict-routing.d.ts.map +1 -0
- package/dist/learning/verdict-routing.js +122 -0
- package/dist/learning/verdict-routing.js.map +1 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +5 -0
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/manager.d.ts +10 -0
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +20 -0
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/mcp-discovery.d.ts +34 -0
- package/dist/mcp/mcp-discovery.d.ts.map +1 -0
- package/dist/mcp/mcp-discovery.js +71 -0
- package/dist/mcp/mcp-discovery.js.map +1 -0
- package/dist/mcp/mcp-schema-cache.d.ts +17 -0
- package/dist/mcp/mcp-schema-cache.d.ts.map +1 -1
- package/dist/mcp/mcp-schema-cache.js +47 -3
- package/dist/mcp/mcp-schema-cache.js.map +1 -1
- package/dist/mcp/types.d.ts +28 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +4 -0
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/capability-registry.d.ts +150 -0
- package/dist/tools/capability-registry.d.ts.map +1 -0
- package/dist/tools/capability-registry.js +400 -0
- package/dist/tools/capability-registry.js.map +1 -0
- package/dist/tools/child-agent-runtime.d.ts.map +1 -1
- package/dist/tools/child-agent-runtime.js +19 -5
- package/dist/tools/child-agent-runtime.js.map +1 -1
- package/dist/tools/coding-tools.d.ts +17 -5
- package/dist/tools/coding-tools.d.ts.map +1 -1
- package/dist/tools/coding-tools.js +80 -11
- package/dist/tools/coding-tools.js.map +1 -1
- package/dist/tools/command-memo.d.ts +116 -0
- package/dist/tools/command-memo.d.ts.map +1 -0
- package/dist/tools/command-memo.js +202 -0
- package/dist/tools/command-memo.js.map +1 -0
- package/dist/tools/git-tool.d.ts.map +1 -1
- package/dist/tools/git-tool.js +13 -3
- package/dist/tools/git-tool.js.map +1 -1
- package/dist/tools/harness-directive.d.ts +42 -0
- package/dist/tools/harness-directive.d.ts.map +1 -0
- package/dist/tools/harness-directive.js +45 -0
- package/dist/tools/harness-directive.js.map +1 -0
- package/dist/tools/loop-skill-hint.d.ts +74 -174
- package/dist/tools/loop-skill-hint.d.ts.map +1 -1
- package/dist/tools/loop-skill-hint.js +110 -536
- package/dist/tools/loop-skill-hint.js.map +1 -1
- package/dist/tools/mcp-client-tool.d.ts +2 -0
- package/dist/tools/mcp-client-tool.d.ts.map +1 -1
- package/dist/tools/mcp-client-tool.js +3 -0
- package/dist/tools/mcp-client-tool.js.map +1 -1
- package/dist/tools/modality/shared.d.ts +1 -4
- package/dist/tools/modality/shared.d.ts.map +1 -1
- package/dist/tools/modality/shared.js +7 -22
- package/dist/tools/modality/shared.js.map +1 -1
- package/dist/tools/plan-store.d.ts +20 -2
- package/dist/tools/plan-store.d.ts.map +1 -1
- package/dist/tools/plan-store.js +51 -7
- package/dist/tools/plan-store.js.map +1 -1
- package/dist/tools/registry.d.ts +76 -3
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +486 -26
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/remediation-ladder.d.ts.map +1 -1
- package/dist/tools/remediation-ladder.js +8 -0
- package/dist/tools/remediation-ladder.js.map +1 -1
- package/dist/tools/run-cli.d.ts.map +1 -1
- package/dist/tools/run-cli.js +29 -4
- package/dist/tools/run-cli.js.map +1 -1
- package/dist/tools/run-terminal.d.ts +11 -0
- package/dist/tools/run-terminal.d.ts.map +1 -1
- package/dist/tools/run-terminal.js +265 -10
- package/dist/tools/run-terminal.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +321 -13
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +867 -66
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/utils/atomic-store.d.ts +53 -0
- package/dist/utils/atomic-store.d.ts.map +1 -0
- package/dist/utils/atomic-store.js +178 -0
- package/dist/utils/atomic-store.js.map +1 -0
- package/dist/utils/binary-probe.d.ts +25 -0
- package/dist/utils/binary-probe.d.ts.map +1 -0
- package/dist/utils/binary-probe.js +48 -0
- package/dist/utils/binary-probe.js.map +1 -0
- package/dist/utils/workspace-path.d.ts +50 -0
- package/dist/utils/workspace-path.d.ts.map +1 -0
- package/dist/utils/workspace-path.js +86 -0
- package/dist/utils/workspace-path.js.map +1 -0
- package/dist/web-dashboard/chat-console.d.ts +24 -0
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +38 -0
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/project-context.d.ts +27 -2
- package/dist/web-dashboard/project-context.d.ts.map +1 -1
- package/dist/web-dashboard/project-context.js +32 -2
- package/dist/web-dashboard/project-context.js.map +1 -1
- package/dist/web-dashboard/server.d.ts +11 -0
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +362 -11
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +170 -1
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.d.ts +11 -2
- package/dist/web-dashboard/workspace-guard.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.js +24 -12
- package/dist/web-dashboard/workspace-guard.js.map +1 -1
- package/dist/web-dashboard/workspace-resolution.d.ts +87 -0
- package/dist/web-dashboard/workspace-resolution.d.ts.map +1 -0
- package/dist/web-dashboard/workspace-resolution.js +105 -0
- package/dist/web-dashboard/workspace-resolution.js.map +1 -0
- package/package.json +1 -1
- package/src/web-dashboard/public/assets/index-zjbdJnO-.js +210 -0
- package/src/web-dashboard/public/assets/index-zjbdJnO-.js.map +1 -0
- package/src/web-dashboard/public/index.html +1 -1
- package/src/web-dashboard/public/assets/index-DhiuR4S2.js +0 -210
- package/src/web-dashboard/public/assets/index-DhiuR4S2.js.map +0 -1
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HooksCommand — `nuvira hooks` — the declarative lifecycle hooks, from the CLI.
|
|
3
|
+
*
|
|
4
|
+
* A hook here is a RULE, not code: it binds to one of nuvira's four lifecycle
|
|
5
|
+
* seams (`before_tool_call`, `after_tool_call`, `failed_tool_call`,
|
|
6
|
+
* `on_session_end`) and its only possible actions are `deny`, `notify` and
|
|
7
|
+
* `scan-args` — a fixed, native allow-list. Installing one can therefore never
|
|
8
|
+
* execute third-party code. See `docs/HOOKS.md` and
|
|
9
|
+
* `src/gateway/hook-contract.ts`.
|
|
10
|
+
*
|
|
11
|
+
* This is the CLI face of the same `<config-dir>/hooks.json` the dashboard's
|
|
12
|
+
* Hooks page edits, and the same contract the runtime reads live. Both surfaces
|
|
13
|
+
* share `hook-contract.ts`, so the vocabulary cannot drift.
|
|
14
|
+
*
|
|
15
|
+
* Subcommands:
|
|
16
|
+
* nuvira hooks list — built-in + user hooks, with state
|
|
17
|
+
* nuvira hooks add --id … --label … … — declare a hook
|
|
18
|
+
* nuvira hooks remove <id> — remove a user hook
|
|
19
|
+
* nuvira hooks enable <id> — turn a hook on (also a built-in)
|
|
20
|
+
* nuvira hooks disable <id> — turn a hook off
|
|
21
|
+
*
|
|
22
|
+
* The built-in starter set (block `rm -rf`, catch secrets in writes/commands)
|
|
23
|
+
* ships DISABLED; `enable` on a built-in materializes it into the file.
|
|
24
|
+
*/
|
|
25
|
+
import { Command } from 'commander';
|
|
26
|
+
import { BaseCommand } from './commands.js';
|
|
27
|
+
import { logger } from '../utils/logger.js';
|
|
28
|
+
import { HOOK_ACTION_KINDS, HOOK_EVENTS, builtinHookById, hookDeclarationsFile, listHookDeclarations, readHookDeclarations, setHookDeclarations, } from '../gateway/hook-contract.js';
|
|
29
|
+
/** Repeatable `--arg key=glob` collector. */
|
|
30
|
+
function collectArg(value, previous) {
|
|
31
|
+
previous.push(value);
|
|
32
|
+
return previous;
|
|
33
|
+
}
|
|
34
|
+
/** `key=glob` lines → the `argsMatch` record. Blank / malformed entries drop. */
|
|
35
|
+
function parseArgsMatch(values) {
|
|
36
|
+
const out = {};
|
|
37
|
+
for (const raw of values) {
|
|
38
|
+
const eq = raw.indexOf('=');
|
|
39
|
+
if (eq <= 0)
|
|
40
|
+
continue;
|
|
41
|
+
const key = raw.slice(0, eq).trim();
|
|
42
|
+
const glob = raw.slice(eq + 1).trim();
|
|
43
|
+
if (key && glob)
|
|
44
|
+
out[key] = glob;
|
|
45
|
+
}
|
|
46
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
47
|
+
}
|
|
48
|
+
/** A one-line, human summary of what a declaration matches and does. */
|
|
49
|
+
function describeHook(hook) {
|
|
50
|
+
const when = hook.when ?? {};
|
|
51
|
+
const parts = [];
|
|
52
|
+
if (when.tool)
|
|
53
|
+
parts.push(`tool ${when.tool}`);
|
|
54
|
+
if (when.surface)
|
|
55
|
+
parts.push(`surface ${when.surface}`);
|
|
56
|
+
if (when.cwdPrefix)
|
|
57
|
+
parts.push(`cwd ${when.cwdPrefix}*`);
|
|
58
|
+
if (when.argsMatch)
|
|
59
|
+
for (const [k, v] of Object.entries(when.argsMatch))
|
|
60
|
+
parts.push(`${k}=${v}`);
|
|
61
|
+
const target = parts.length > 0 ? parts.join(' · ') : 'every call';
|
|
62
|
+
switch (hook.action.kind) {
|
|
63
|
+
case 'deny':
|
|
64
|
+
return `${target} → deny${hook.action.reason ? `: ${hook.action.reason}` : ''}`;
|
|
65
|
+
case 'notify':
|
|
66
|
+
return `${target} → notify: ${hook.action.message}`;
|
|
67
|
+
case 'scan-args':
|
|
68
|
+
return `${target} → scan args for secrets${hook.action.denyOnHit ? ' (deny on hit)' : ''}`;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export class HooksCommand extends BaseCommand {
|
|
72
|
+
create() {
|
|
73
|
+
const cmd = new Command('hooks')
|
|
74
|
+
.description('Declarative lifecycle hooks — list/add/remove the rules that deny, notify or secret-scan tool calls (the same hooks.json the dashboard Hooks page edits; a hook is data, never code)')
|
|
75
|
+
.option('-v, --verbose', 'verbose output');
|
|
76
|
+
cmd
|
|
77
|
+
.command('list')
|
|
78
|
+
.description('List built-in and user hooks with their seam, action and state')
|
|
79
|
+
.action(() => {
|
|
80
|
+
const all = listHookDeclarations();
|
|
81
|
+
logger.highlight('\n🪝 Hooks');
|
|
82
|
+
if (all.length === 0) {
|
|
83
|
+
logger.info(' No hooks declared.');
|
|
84
|
+
console.log('');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
for (const hook of all) {
|
|
88
|
+
const state = hook.enabled ? '✅ enabled ' : '⭕ disabled';
|
|
89
|
+
const source = hook.source === 'builtin' ? 'builtin' : 'user';
|
|
90
|
+
console.log(` ${state} ${hook.id} [${source}] (${hook.event})`);
|
|
91
|
+
console.log(` ${hook.label}`);
|
|
92
|
+
console.log(` ${describeHook(hook)}`);
|
|
93
|
+
}
|
|
94
|
+
console.log('');
|
|
95
|
+
logger.info(` File: ${hookDeclarationsFile()}`);
|
|
96
|
+
console.log('');
|
|
97
|
+
});
|
|
98
|
+
cmd
|
|
99
|
+
.command('add')
|
|
100
|
+
.description('Declare a new hook (it is enabled unless --disabled is given)')
|
|
101
|
+
.requiredOption('--id <id>', 'unique id: lowercase letters, digits and hyphens')
|
|
102
|
+
.requiredOption('--label <label>', 'human label')
|
|
103
|
+
.requiredOption('--event <event>', `seam: ${HOOK_EVENTS.join(' | ')}`)
|
|
104
|
+
.requiredOption('--action <kind>', `action: ${HOOK_ACTION_KINDS.join(' | ')}`)
|
|
105
|
+
.option('--tool <glob>', 'tool-name glob to match (e.g. run_terminal, run_*)')
|
|
106
|
+
.option('--surface <glob>', 'surface glob to match (e.g. cli-chat)')
|
|
107
|
+
.option('--cwd <prefix>', 'only match calls whose cwd starts with this prefix')
|
|
108
|
+
.option('--arg <key=glob>', 'shallow arg matcher, repeatable (e.g. --arg "command=*rm -rf*")', collectArg, [])
|
|
109
|
+
.option('--reason <text>', 'reason shown when a deny (or deny-on-hit) blocks the call')
|
|
110
|
+
.option('--message <text>', 'notify message ({tool} / {surface} / {event} interpolated)')
|
|
111
|
+
.option('--deny-on-hit', 'scan-args: block the call when a secret shape is found')
|
|
112
|
+
.option('--disabled', 'add it switched off (the dashboard adds them on by default)')
|
|
113
|
+
.action((opts) => {
|
|
114
|
+
const id = String(opts.id ?? '');
|
|
115
|
+
const label = String(opts.label ?? '');
|
|
116
|
+
const event = String(opts.event ?? '');
|
|
117
|
+
const kind = String(opts.action ?? '');
|
|
118
|
+
if (!HOOK_EVENTS.includes(event)) {
|
|
119
|
+
logger.error(`Unknown --event '${event}'. Choose one of: ${HOOK_EVENTS.join(', ')}`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (!HOOK_ACTION_KINDS.includes(kind)) {
|
|
123
|
+
logger.error(`Unknown --action '${kind}'. Choose one of: ${HOOK_ACTION_KINDS.join(', ')}`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const when = {
|
|
127
|
+
...(typeof opts.tool === 'string' && opts.tool ? { tool: opts.tool } : {}),
|
|
128
|
+
...(typeof opts.surface === 'string' && opts.surface ? { surface: opts.surface } : {}),
|
|
129
|
+
...(typeof opts.cwd === 'string' && opts.cwd ? { cwdPrefix: opts.cwd } : {}),
|
|
130
|
+
...(parseArgsMatch(opts.arg ?? []) ? { argsMatch: parseArgsMatch(opts.arg ?? []) } : {}),
|
|
131
|
+
};
|
|
132
|
+
const reason = typeof opts.reason === 'string' && opts.reason ? opts.reason : undefined;
|
|
133
|
+
const message = typeof opts.message === 'string' && opts.message ? opts.message : undefined;
|
|
134
|
+
const action = kind === 'deny'
|
|
135
|
+
? { kind: 'deny', ...(reason ? { reason } : {}) }
|
|
136
|
+
: kind === 'notify'
|
|
137
|
+
? { kind: 'notify', message: message ?? 'hook fired: {tool}' }
|
|
138
|
+
: { kind: 'scan-args', denyOnHit: Boolean(opts.denyOnHit), ...(reason ? { reason } : {}) };
|
|
139
|
+
const declaration = {
|
|
140
|
+
id,
|
|
141
|
+
label,
|
|
142
|
+
event,
|
|
143
|
+
enabled: !opts.disabled,
|
|
144
|
+
...(Object.keys(when).length > 0 ? { when } : {}),
|
|
145
|
+
action,
|
|
146
|
+
source: 'user',
|
|
147
|
+
updatedAt: Date.now(),
|
|
148
|
+
};
|
|
149
|
+
const user = readHookDeclarations();
|
|
150
|
+
if (user.some((h) => h.id === id)) {
|
|
151
|
+
logger.error(`A hook with id '${id}' already exists. Remove it, or use 'enable'/'disable'.`);
|
|
152
|
+
console.log('');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const saved = setHookDeclarations([...user, declaration]);
|
|
156
|
+
if (!saved.ok) {
|
|
157
|
+
logger.error(`Rejected: ${saved.error}`);
|
|
158
|
+
console.log('');
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
logger.success(`➕ Added hook '${id}' (${declaration.enabled ? 'enabled' : 'disabled'}).`);
|
|
162
|
+
logger.info(` In force on the next tool call. Inspect it: nuvira hooks list`);
|
|
163
|
+
console.log('');
|
|
164
|
+
});
|
|
165
|
+
cmd
|
|
166
|
+
.command('remove <id>')
|
|
167
|
+
.description('Remove a user hook (a built-in cannot be deleted — disable it instead)')
|
|
168
|
+
.action((id) => {
|
|
169
|
+
const user = readHookDeclarations();
|
|
170
|
+
if (!user.some((h) => h.id === id)) {
|
|
171
|
+
if (builtinHookById(id)) {
|
|
172
|
+
logger.warn(`'${id}' is a built-in default and cannot be removed. Turn it off with: nuvira hooks disable ${id}`);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
logger.warn(`No user hook '${id}'.`);
|
|
176
|
+
}
|
|
177
|
+
console.log('');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const isBuiltin = Boolean(builtinHookById(id));
|
|
181
|
+
const saved = setHookDeclarations(user.filter((h) => h.id !== id));
|
|
182
|
+
if (!saved.ok) {
|
|
183
|
+
logger.error(saved.error);
|
|
184
|
+
console.log('');
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
logger.success(isBuiltin
|
|
188
|
+
? `↺ Reset built-in '${id}' to its default (disabled).`
|
|
189
|
+
: `🗑️ Removed hook '${id}'.`);
|
|
190
|
+
console.log('');
|
|
191
|
+
});
|
|
192
|
+
const setEnabled = (enabled) => (id) => {
|
|
193
|
+
const user = readHookDeclarations();
|
|
194
|
+
const existing = user.find((h) => h.id === id);
|
|
195
|
+
let next;
|
|
196
|
+
if (existing) {
|
|
197
|
+
next = user.map((h) => (h.id === id ? { ...h, enabled, updatedAt: Date.now() } : h));
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
const builtin = builtinHookById(id);
|
|
201
|
+
if (!builtin) {
|
|
202
|
+
logger.warn(`No hook '${id}'. Declare it first: nuvira hooks add --id ${id} …`);
|
|
203
|
+
console.log('');
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// Enabling a built-in materializes it into the file so the runtime —
|
|
207
|
+
// which follows the user set — actually sees it.
|
|
208
|
+
next = [...user, { ...builtin, enabled, updatedAt: Date.now() }];
|
|
209
|
+
}
|
|
210
|
+
const saved = setHookDeclarations(next);
|
|
211
|
+
if (!saved.ok) {
|
|
212
|
+
logger.error(saved.error);
|
|
213
|
+
console.log('');
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
logger.success(`${enabled ? '✅ Enabled' : '⭕ Disabled'} '${id}'.`);
|
|
217
|
+
console.log('');
|
|
218
|
+
};
|
|
219
|
+
cmd.command('enable <id>').description('Turn a hook on (works on a built-in too)').action(setEnabled(true));
|
|
220
|
+
cmd.command('disable <id>').description('Turn a hook off').action(setEnabled(false));
|
|
221
|
+
return cmd;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/cli/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/knowledge.d.ts
CHANGED
|
@@ -10,10 +10,18 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Subcommands:
|
|
12
12
|
* nuvira knowledge add <tag> <path...> — ingest files/folders under a tag
|
|
13
|
+
* nuvira knowledge sync <tag> <path...> — re-sync folders (hash-gated; prunes vanished files)
|
|
13
14
|
* nuvira knowledge query <tag> "<question>" — retrieve the tag's relevant passages
|
|
15
|
+
* nuvira knowledge toc <tag> [doc] — documents and their headings
|
|
16
|
+
* nuvira knowledge read <tag> <doc> — one document or section, VERBATIM
|
|
17
|
+
* nuvira knowledge remove <tag> <doc> — remove one document from a tag
|
|
14
18
|
* nuvira knowledge list — list tags, documents and chunk counts
|
|
15
19
|
* nuvira knowledge stats <tag> — details for one tag
|
|
16
|
-
* nuvira knowledge forget <tag> — remove a tag's vectors
|
|
20
|
+
* nuvira knowledge forget <tag> — remove a tag's vectors and stored text
|
|
21
|
+
*
|
|
22
|
+
* `query` answers "where is it mentioned"; `read` answers "what does it say".
|
|
23
|
+
* They are different jobs — a spec-driven build needs a section verbatim, not
|
|
24
|
+
* the six most similar paragraphs of it.
|
|
17
25
|
*/
|
|
18
26
|
import { Command } from 'commander';
|
|
19
27
|
import { BaseCommand } from './commands.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/cli/knowledge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/cli/knowledge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAiB5C,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,MAAM,IAAI,OAAO;CAiMlB"}
|
package/dist/cli/knowledge.js
CHANGED
|
@@ -10,10 +10,18 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Subcommands:
|
|
12
12
|
* nuvira knowledge add <tag> <path...> — ingest files/folders under a tag
|
|
13
|
+
* nuvira knowledge sync <tag> <path...> — re-sync folders (hash-gated; prunes vanished files)
|
|
13
14
|
* nuvira knowledge query <tag> "<question>" — retrieve the tag's relevant passages
|
|
15
|
+
* nuvira knowledge toc <tag> [doc] — documents and their headings
|
|
16
|
+
* nuvira knowledge read <tag> <doc> — one document or section, VERBATIM
|
|
17
|
+
* nuvira knowledge remove <tag> <doc> — remove one document from a tag
|
|
14
18
|
* nuvira knowledge list — list tags, documents and chunk counts
|
|
15
19
|
* nuvira knowledge stats <tag> — details for one tag
|
|
16
|
-
* nuvira knowledge forget <tag> — remove a tag's vectors
|
|
20
|
+
* nuvira knowledge forget <tag> — remove a tag's vectors and stored text
|
|
21
|
+
*
|
|
22
|
+
* `query` answers "where is it mentioned"; `read` answers "what does it say".
|
|
23
|
+
* They are different jobs — a spec-driven build needs a section verbatim, not
|
|
24
|
+
* the six most similar paragraphs of it.
|
|
17
25
|
*/
|
|
18
26
|
import { Command } from 'commander';
|
|
19
27
|
import { basename } from 'node:path';
|
|
@@ -21,7 +29,7 @@ import { existsSync } from 'node:fs';
|
|
|
21
29
|
import { BaseCommand } from './commands.js';
|
|
22
30
|
import { logger } from '../utils/logger.js';
|
|
23
31
|
import { formatCount } from '../utils/format.js';
|
|
24
|
-
import { ingestKnowledge, queryKnowledge, listKnowledgeTags, getKnowledgeTag, forgetKnowledgeTag, normalizeKnowledgeTag, } from '../learning/knowledge-base.js';
|
|
32
|
+
import { ingestKnowledge, queryKnowledge, listKnowledgeTags, getKnowledgeTag, forgetKnowledgeTag, normalizeKnowledgeTag, listKnowledgeSections, readKnowledgeDocument, removeKnowledgeDocument, syncKnowledgeTag, MAX_READ_CHARS, } from '../learning/knowledge-base.js';
|
|
25
33
|
export class KnowledgeCommand extends BaseCommand {
|
|
26
34
|
create() {
|
|
27
35
|
const cmd = new Command('knowledge')
|
|
@@ -42,6 +50,9 @@ export class KnowledgeCommand extends BaseCommand {
|
|
|
42
50
|
try {
|
|
43
51
|
const result = await ingestKnowledge(tag, paths);
|
|
44
52
|
logger.success(` Ingested ${result.files} document(s) / ${result.chunks} chunk(s) under '${result.tag}'.`);
|
|
53
|
+
if (result.unchanged > 0) {
|
|
54
|
+
logger.info(` ${result.unchanged} document(s) unchanged — not re-embedded (use 'sync' to prune removed files).`);
|
|
55
|
+
}
|
|
45
56
|
for (const s of result.skipped) {
|
|
46
57
|
logger.warn(` Skipped ${basename(s.path)}: ${s.reason}`);
|
|
47
58
|
}
|
|
@@ -75,6 +86,86 @@ export class KnowledgeCommand extends BaseCommand {
|
|
|
75
86
|
logger.info('The data part of an answer comes from these passages; the general part from the model / web-research.');
|
|
76
87
|
console.log('');
|
|
77
88
|
});
|
|
89
|
+
cmd
|
|
90
|
+
.command('toc <tag> [doc]')
|
|
91
|
+
.description("List a tag's documents and the headings in each")
|
|
92
|
+
.action(async (tag, doc) => {
|
|
93
|
+
const docs = listKnowledgeSections(tag, doc);
|
|
94
|
+
if (docs.length === 0) {
|
|
95
|
+
logger.warn(`No documents under '${normalizeKnowledgeTag(tag)}'. Add some: nuvira knowledge add <tag> <files...>`);
|
|
96
|
+
console.log('');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
logger.highlight(`\n📚 ${normalizeKnowledgeTag(tag)}`);
|
|
100
|
+
for (const d of docs) {
|
|
101
|
+
console.log(` 📄 ${d.title} (${d.chunks} chunk${d.chunks === 1 ? '' : 's'}) — ${d.path}`);
|
|
102
|
+
if (d.sections.length === 0) {
|
|
103
|
+
console.log(' (no headings — read the whole document)');
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
for (const s of d.sections) {
|
|
107
|
+
console.log(` ${' '.repeat(Math.max(0, s.level - 1))}§ ${s.headingPath ? `${s.headingPath} > ` : ''}${s.title}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
console.log('');
|
|
111
|
+
logger.info("Read one verbatim: nuvira knowledge read <tag> <doc> --section \"<heading>\"");
|
|
112
|
+
console.log('');
|
|
113
|
+
});
|
|
114
|
+
cmd
|
|
115
|
+
.command('read <tag> <doc>')
|
|
116
|
+
.description('Print a document, or one named section, VERBATIM (not a summary)')
|
|
117
|
+
.option('-s, --section <heading>', 'section heading to read (default: the whole document)')
|
|
118
|
+
.action(async (tag, doc, opts) => {
|
|
119
|
+
const read = readKnowledgeDocument(tag, doc, opts.section);
|
|
120
|
+
if (!read.ok) {
|
|
121
|
+
logger.warn(read.reason);
|
|
122
|
+
console.log('');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
logger.highlight(`\n📖 ${read.path}${read.headingPath ? ` — §${read.headingPath}` : ''}`);
|
|
126
|
+
console.log('');
|
|
127
|
+
console.log(read.text);
|
|
128
|
+
if (read.truncated) {
|
|
129
|
+
console.log('');
|
|
130
|
+
logger.warn(` [truncated at ${MAX_READ_CHARS} characters — read a section instead]`);
|
|
131
|
+
}
|
|
132
|
+
console.log('');
|
|
133
|
+
});
|
|
134
|
+
cmd
|
|
135
|
+
.command('remove <tag> <doc>')
|
|
136
|
+
.description('Remove ONE document from a tag (its chunks, stored text and manifest row)')
|
|
137
|
+
.action(async (tag, doc) => {
|
|
138
|
+
const removed = await removeKnowledgeDocument(tag, doc);
|
|
139
|
+
if (removed)
|
|
140
|
+
logger.success(`🗑️ Removed '${doc}' from '${normalizeKnowledgeTag(tag)}'.`);
|
|
141
|
+
else
|
|
142
|
+
logger.warn(`No document '${doc}' under '${normalizeKnowledgeTag(tag)}'.`);
|
|
143
|
+
console.log('');
|
|
144
|
+
});
|
|
145
|
+
cmd
|
|
146
|
+
.command('sync <tag> <paths...>')
|
|
147
|
+
.description("Bring a tag up to date with its folders — hash-gated, prunes files that vanished")
|
|
148
|
+
.action(async (tag, paths) => {
|
|
149
|
+
const missing = paths.filter((p) => !existsSync(p));
|
|
150
|
+
if (missing.length > 0) {
|
|
151
|
+
logger.error(`Path not found: ${missing.join(', ')}`);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const normalized = normalizeKnowledgeTag(tag);
|
|
155
|
+
logger.info(`🔄 Syncing '${normalized}' from ${paths.length} path(s) ...`);
|
|
156
|
+
try {
|
|
157
|
+
const result = await syncKnowledgeTag(tag, paths);
|
|
158
|
+
logger.success(` ${result.added} added, ${result.changed} changed, ${result.unchanged} unchanged, ${result.chunks} chunk(s) written.`);
|
|
159
|
+
for (const p of result.removed)
|
|
160
|
+
logger.warn(` Removed ${basename(p)}: no longer present under a synced path.`);
|
|
161
|
+
for (const s of result.skipped)
|
|
162
|
+
logger.warn(` Skipped ${basename(s.path)}: ${s.reason}`);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
logger.error(`Failed to sync: ${err instanceof Error ? err.message : String(err)}`);
|
|
166
|
+
}
|
|
167
|
+
console.log('');
|
|
168
|
+
});
|
|
78
169
|
cmd
|
|
79
170
|
.command('list')
|
|
80
171
|
.description('List knowledge tags with document and chunk counts')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/cli/knowledge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/cli/knowledge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-executor.d.ts","sourceRoot":"","sources":["../../src/cli/loop-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAWrD,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"loop-executor.d.ts","sourceRoot":"","sources":["../../src/cli/loop-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,6 +45,13 @@ import { noteServedRoute } from '../tools/loop-route-feed.js';
|
|
|
45
45
|
import { getAutoRouter, isAutoProvider, governanceVerdict, adminBudgetVerdict } from '../learning/auto-router.js';
|
|
46
46
|
import { buildDeepFailoverPool, createFailoverExclusionFilter } from '../learning/resilient-call.js';
|
|
47
47
|
import { recordActionFailure } from '../learning/failure-bookkeeping.js';
|
|
48
|
+
// P1/P2 (fix_model_routing) — the shared definition of "this response carries
|
|
49
|
+
// nothing usable". An empty completion is a FAILURE, not an answer, and must
|
|
50
|
+
// advance the candidate walk instead of being returned to the caller.
|
|
51
|
+
import { assertUsableModelResponse, isUnusableModelResponseError } from '../learning/response-usability.js';
|
|
52
|
+
// P6 (fix_model_routing) — the bandit is told about step-level failures too, so
|
|
53
|
+
// an arm that answers with nothing stops being sampled back up.
|
|
54
|
+
import { getRouterBandit } from '../learning/router-bandit.js';
|
|
48
55
|
import { recordRegistrySuccess, getProviderFallback, classifyFallbackError, isRetryableError, } from '../learning/provider-fallback.js';
|
|
49
56
|
import { resolveThreadBudgetChars } from '../learning/context-budget.js';
|
|
50
57
|
import { buildLoopProjectContext } from '../tools/loop-project-context.js';
|
|
@@ -533,29 +540,35 @@ export async function runLoopExecutor(goal, configManager, opts = {}) {
|
|
|
533
540
|
}
|
|
534
541
|
}
|
|
535
542
|
// ── Skill hint (chat/execute parity) ────────────────────────────────────
|
|
536
|
-
// MODE-DEPENDENT (see resolveSkillHintMode): `
|
|
537
|
-
//
|
|
538
|
-
//
|
|
539
|
-
//
|
|
540
|
-
// unchanged.
|
|
543
|
+
// MODE-DEPENDENT (see resolveSkillHintMode): `pointer` (default) injects a
|
|
544
|
+
// bounded discovery pointer (the MODEL picks a skill via the skill tool /
|
|
545
|
+
// capability search — the harness no longer keyword-matches); `catalog`
|
|
546
|
+
// (opt-in — ~24K chars) hands the model the full list; `off` injects nothing.
|
|
547
|
+
// Best-effort: a failure returns '' and the prompt is unchanged.
|
|
541
548
|
let skillHint = '';
|
|
542
549
|
if (!opts.skipSkillHint) {
|
|
543
550
|
try {
|
|
544
|
-
const { buildConfiguredSkillHint
|
|
545
|
-
|
|
546
|
-
value: null,
|
|
547
|
-
};
|
|
548
|
-
skillHint = await buildConfiguredSkillHint(goal, configManager, injected);
|
|
549
|
-
await markLoopSkillUsed(injected.value);
|
|
551
|
+
const { buildConfiguredSkillHint } = await import('../tools/loop-skill-hint.js');
|
|
552
|
+
skillHint = await buildConfiguredSkillHint(configManager);
|
|
550
553
|
}
|
|
551
554
|
catch {
|
|
552
555
|
skillHint = ''; // best-effort — never breaks the turn
|
|
553
556
|
}
|
|
554
557
|
}
|
|
558
|
+
// Machine facts — the host stated once (OS / arch / shell / installed package
|
|
559
|
+
// managers). One detection per process; best-effort (a failure injects nothing).
|
|
560
|
+
let machineBlock = '';
|
|
561
|
+
try {
|
|
562
|
+
const { buildMachineFactsBlock } = await import('../learning/machine-facts.js');
|
|
563
|
+
machineBlock = buildMachineFactsBlock();
|
|
564
|
+
}
|
|
565
|
+
catch {
|
|
566
|
+
machineBlock = '';
|
|
567
|
+
}
|
|
555
568
|
const { runToolLoop } = await import('../tools/tool-loop.js');
|
|
556
569
|
const { getTool, TOOL_CONTRACT_JSON } = await import('../tools/registry.js');
|
|
557
570
|
const head = [
|
|
558
|
-
{ role: 'system', content: buildExecuteLoopSystemPrompt(TOOL_CONTRACT_JSON) + skillHint },
|
|
571
|
+
{ role: 'system', content: buildExecuteLoopSystemPrompt(TOOL_CONTRACT_JSON) + machineBlock + skillHint },
|
|
559
572
|
...(projectContext ? [{ role: 'user', content: `[Project context]\n${projectContext}` }] : []),
|
|
560
573
|
];
|
|
561
574
|
let thread = [...head, { role: 'user', content: goal }];
|
|
@@ -723,6 +736,16 @@ export async function runLoopExecutor(goal, configManager, opts = {}) {
|
|
|
723
736
|
// it several steps earlier.
|
|
724
737
|
servedRoute = noteServedRoute(servedRoute, servedRouteFrom(route));
|
|
725
738
|
const resp = await tryOnce(prov, mdl, nextMessages, schemas, abort);
|
|
739
|
+
// ── P1/P2 — AN UNUSABLE RESPONSE IS A FAILURE, NOT AN ANSWER ─────
|
|
740
|
+
// A provider that resolves HTTP 200 with neither answer text nor a tool
|
|
741
|
+
// call used to be returned from here as the step's response: the walk
|
|
742
|
+
// only reacts to THROWN errors, so the SAME model was re-asked and the
|
|
743
|
+
// turn eventually ended as "bounded" with zero work done while healthy
|
|
744
|
+
// models sat configured and unused. Validating here turns that into what
|
|
745
|
+
// it is — a candidate-level failure — so the catch below books it
|
|
746
|
+
// (`empty-response`: the pair rests, its siblings stay routable) and the
|
|
747
|
+
// walk continues to a DIFFERENT model IN THIS SAME STEP.
|
|
748
|
+
assertUsableModelResponse(resp);
|
|
726
749
|
// ── ANSWER-QUALITY GATE ──────────────────────────────────────────
|
|
727
750
|
// A reply that is the model's own REASONING, or its narration of the
|
|
728
751
|
// tool contract, is not a deliverable — and it never THROWS, so this
|
|
@@ -791,6 +814,18 @@ export async function runLoopExecutor(goal, configManager, opts = {}) {
|
|
|
791
814
|
catch {
|
|
792
815
|
// Best-effort — bookkeeping must never mask the generation error.
|
|
793
816
|
}
|
|
817
|
+
// P6 — an empty completion is NEGATIVE evidence for the arm itself, at
|
|
818
|
+
// a granularity the task-level reward can never reach: the turn does
|
|
819
|
+
// not fail, it just moves on, so without this the prior kept sampling
|
|
820
|
+
// the same dead model back to the top of the ranking.
|
|
821
|
+
if (isUnusableModelResponseError(err)) {
|
|
822
|
+
try {
|
|
823
|
+
getRouterBandit().penalizeModel(cand.model !== 'default' ? cand.model : model);
|
|
824
|
+
}
|
|
825
|
+
catch {
|
|
826
|
+
// Best-effort — learning must never mask the generation error.
|
|
827
|
+
}
|
|
828
|
+
}
|
|
794
829
|
// ── PINNED-RUN GATE ──────────────────────────────────────────────
|
|
795
830
|
// Leaving a provider the user EXPLICITLY asked for is only justified
|
|
796
831
|
// by a failure another provider can plausibly answer — the same
|