@orion-agents/orion-code 0.1.3 → 0.1.4-2
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 +26 -4
- package/README.zh-CN.md +41 -5
- package/dist/agents/coder.d.ts.map +1 -1
- package/dist/agents/coder.js.map +1 -1
- package/dist/agents/fork.d.ts +12 -4
- package/dist/agents/fork.d.ts.map +1 -1
- package/dist/agents/fork.js +28 -32
- package/dist/agents/fork.js.map +1 -1
- package/dist/agents/leader.d.ts.map +1 -1
- package/dist/agents/leader.js.map +1 -1
- package/dist/agents/worker-pool.d.ts.map +1 -1
- package/dist/agents/worker-pool.js +38 -29
- package/dist/agents/worker-pool.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +0 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/context-commands.d.ts +4 -0
- package/dist/commands/context-commands.d.ts.map +1 -0
- package/dist/commands/context-commands.js +52 -0
- package/dist/commands/context-commands.js.map +1 -0
- package/dist/commands/context-tool-command-handlers.d.ts +13 -0
- package/dist/commands/context-tool-command-handlers.d.ts.map +1 -0
- package/dist/commands/context-tool-command-handlers.js +573 -0
- package/dist/commands/context-tool-command-handlers.js.map +1 -0
- package/dist/commands/core-command-handlers.d.ts +12 -0
- package/dist/commands/core-command-handlers.d.ts.map +1 -0
- package/dist/commands/core-command-handlers.js +798 -0
- package/dist/commands/core-command-handlers.js.map +1 -0
- package/dist/commands/diagnostic-command-handlers.d.ts +14 -0
- package/dist/commands/diagnostic-command-handlers.d.ts.map +1 -0
- package/dist/commands/diagnostic-command-handlers.js +1043 -0
- package/dist/commands/diagnostic-command-handlers.js.map +1 -0
- package/dist/commands/diagnostic-commands.d.ts +4 -0
- package/dist/commands/diagnostic-commands.d.ts.map +1 -0
- package/dist/commands/diagnostic-commands.js +132 -0
- package/dist/commands/diagnostic-commands.js.map +1 -0
- package/dist/commands/index.d.ts +7 -8
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +34 -3562
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/legacy-commands.d.ts +4 -0
- package/dist/commands/legacy-commands.d.ts.map +1 -0
- package/dist/commands/legacy-commands.js +44 -0
- package/dist/commands/legacy-commands.js.map +1 -0
- package/dist/commands/model-command-handlers.d.ts +13 -0
- package/dist/commands/model-command-handlers.d.ts.map +1 -0
- package/dist/commands/model-command-handlers.js +314 -0
- package/dist/commands/model-command-handlers.js.map +1 -0
- package/dist/commands/model-commands.d.ts +4 -0
- package/dist/commands/model-commands.d.ts.map +1 -0
- package/dist/commands/model-commands.js +52 -0
- package/dist/commands/model-commands.js.map +1 -0
- package/dist/commands/session-command-handlers.d.ts +9 -0
- package/dist/commands/session-command-handlers.d.ts.map +1 -0
- package/dist/commands/session-command-handlers.js +566 -0
- package/dist/commands/session-command-handlers.js.map +1 -0
- package/dist/commands/session-commands.d.ts +4 -0
- package/dist/commands/session-commands.d.ts.map +1 -0
- package/dist/commands/session-commands.js +78 -0
- package/dist/commands/session-commands.js.map +1 -0
- package/dist/commands/system-commands.d.ts +4 -0
- package/dist/commands/system-commands.d.ts.map +1 -0
- package/dist/commands/system-commands.js +92 -0
- package/dist/commands/system-commands.js.map +1 -0
- package/dist/commands/target-command.d.ts.map +1 -1
- package/dist/commands/target-command.js +29 -2
- package/dist/commands/target-command.js.map +1 -1
- package/dist/commands/tool-commands.d.ts +4 -0
- package/dist/commands/tool-commands.d.ts.map +1 -0
- package/dist/commands/tool-commands.js +49 -0
- package/dist/commands/tool-commands.js.map +1 -0
- package/dist/commands/types.d.ts +4 -4
- package/dist/commands/workflow-command-handlers.d.ts +7 -0
- package/dist/commands/workflow-command-handlers.d.ts.map +1 -0
- package/dist/commands/workflow-command-handlers.js +35 -0
- package/dist/commands/workflow-command-handlers.js.map +1 -0
- package/dist/commands/workflow-commands.d.ts +4 -0
- package/dist/commands/workflow-commands.d.ts.map +1 -0
- package/dist/commands/workflow-commands.js +92 -0
- package/dist/commands/workflow-commands.js.map +1 -0
- package/dist/core/checkpoint.d.ts +12 -4
- package/dist/core/checkpoint.d.ts.map +1 -1
- package/dist/core/checkpoint.js +114 -28
- package/dist/core/checkpoint.js.map +1 -1
- package/dist/core/cost-tracker.d.ts +5 -1
- package/dist/core/cost-tracker.d.ts.map +1 -1
- package/dist/core/cost-tracker.js +12 -2
- package/dist/core/cost-tracker.js.map +1 -1
- package/dist/core/warn-dedup.d.ts +3 -0
- package/dist/core/warn-dedup.d.ts.map +1 -1
- package/dist/core/warn-dedup.js +6 -6
- package/dist/core/warn-dedup.js.map +1 -1
- package/dist/framework/index.d.ts +1 -1
- package/dist/framework/index.d.ts.map +1 -1
- package/dist/framework/index.js.map +1 -1
- package/dist/framework/prompt.d.ts +2 -2
- package/dist/framework/query.d.ts +2 -2
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +57 -10
- package/dist/framework/query.js.map +1 -1
- package/dist/framework/store.d.ts +4 -4
- package/dist/framework/tool-scheduler.d.ts +16 -13
- package/dist/framework/tool-scheduler.d.ts.map +1 -1
- package/dist/framework/tool-scheduler.js +135 -32
- package/dist/framework/tool-scheduler.js.map +1 -1
- package/dist/framework/tool.d.ts +30 -2
- package/dist/framework/tool.d.ts.map +1 -1
- package/dist/framework/tool.js +27 -1
- package/dist/framework/tool.js.map +1 -1
- package/dist/harness/assembler.d.ts.map +1 -1
- package/dist/harness/assembler.js +4 -2
- package/dist/harness/assembler.js.map +1 -1
- package/dist/harness/evidence.d.ts.map +1 -1
- package/dist/harness/evidence.js +3 -2
- package/dist/harness/evidence.js.map +1 -1
- package/dist/harness/safety.d.ts +11 -1
- package/dist/harness/safety.d.ts.map +1 -1
- package/dist/harness/safety.js +112 -16
- package/dist/harness/safety.js.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +4 -8
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +4 -4
- package/dist/init.js.map +1 -1
- package/dist/ink-ui/App.d.ts +2 -2
- package/dist/ink-ui/components/Markdown.d.ts.map +1 -1
- package/dist/ink-ui/components/Markdown.js.map +1 -1
- package/dist/ink-ui/components/PixelHorseBanner.d.ts +2 -2
- package/dist/ink-ui/components/StatusLine.d.ts +2 -2
- package/dist/ink-ui/launch.d.ts +2 -2
- package/dist/ink-ui/screens/ReplScreen.d.ts +2 -2
- package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
- package/dist/memory/embeddings.d.ts.map +1 -1
- package/dist/memory/embeddings.js +3 -2
- package/dist/memory/embeddings.js.map +1 -1
- package/dist/memory/relevant-finder.d.ts +2 -1
- package/dist/memory/relevant-finder.d.ts.map +1 -1
- package/dist/memory/relevant-finder.js +17 -8
- package/dist/memory/relevant-finder.js.map +1 -1
- package/dist/memory/semantic-config.d.ts +9 -0
- package/dist/memory/semantic-config.d.ts.map +1 -0
- package/dist/memory/semantic-config.js +16 -0
- package/dist/memory/semantic-config.js.map +1 -0
- package/dist/memory/semantic-search.d.ts +1 -6
- package/dist/memory/semantic-search.d.ts.map +1 -1
- package/dist/memory/semantic-search.js +5 -16
- package/dist/memory/semantic-search.js.map +1 -1
- package/dist/memory/storage.d.ts +23 -0
- package/dist/memory/storage.d.ts.map +1 -1
- package/dist/memory/storage.js +109 -8
- package/dist/memory/storage.js.map +1 -1
- package/dist/memory/vector-store.d.ts +12 -0
- package/dist/memory/vector-store.d.ts.map +1 -1
- package/dist/memory/vector-store.js +139 -18
- package/dist/memory/vector-store.js.map +1 -1
- package/dist/migration/command.d.ts.map +1 -1
- package/dist/migration/command.js +0 -1
- package/dist/migration/command.js.map +1 -1
- package/dist/migration/migrate.d.ts.map +1 -1
- package/dist/migration/migrate.js +43 -109
- package/dist/migration/migrate.js.map +1 -1
- package/dist/migration/types.d.ts +0 -1
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/print-ui/launch.d.ts +10 -3
- package/dist/print-ui/launch.d.ts.map +1 -1
- package/dist/print-ui/launch.js +18 -0
- package/dist/print-ui/launch.js.map +1 -1
- package/dist/product/environment.d.ts +3 -5
- package/dist/product/environment.d.ts.map +1 -1
- package/dist/product/environment.js +4 -32
- package/dist/product/environment.js.map +1 -1
- package/dist/product/index.d.ts +1 -1
- package/dist/product/index.d.ts.map +1 -1
- package/dist/product/index.js +1 -3
- package/dist/product/index.js.map +1 -1
- package/dist/product/paths.d.ts.map +1 -1
- package/dist/product/paths.js +12 -0
- package/dist/product/paths.js.map +1 -1
- package/dist/runtime/agent-runtime-controller.d.ts +2 -2
- package/dist/runtime/agent-runtime-protocol.d.ts +4 -1
- package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
- package/dist/runtime/agent-runtime-protocol.js +6 -0
- package/dist/runtime/agent-runtime-protocol.js.map +1 -1
- package/dist/runtime/chat-checkpoint.d.ts +17 -0
- package/dist/runtime/chat-checkpoint.d.ts.map +1 -0
- package/dist/runtime/chat-checkpoint.js +108 -0
- package/dist/runtime/chat-checkpoint.js.map +1 -0
- package/dist/runtime/chat-controller.d.ts +10 -46
- package/dist/runtime/chat-controller.d.ts.map +1 -1
- package/dist/runtime/chat-controller.js +199 -1051
- package/dist/runtime/chat-controller.js.map +1 -1
- package/dist/runtime/chat-presentation.d.ts +60 -0
- package/dist/runtime/chat-presentation.d.ts.map +1 -0
- package/dist/runtime/chat-presentation.js +537 -0
- package/dist/runtime/chat-presentation.js.map +1 -0
- package/dist/runtime/chat-trace.d.ts +52 -0
- package/dist/runtime/chat-trace.d.ts.map +1 -0
- package/dist/runtime/chat-trace.js +234 -0
- package/dist/runtime/chat-trace.js.map +1 -0
- package/dist/runtime/chat-workspace.d.ts +22 -0
- package/dist/runtime/chat-workspace.d.ts.map +1 -0
- package/dist/runtime/chat-workspace.js +154 -0
- package/dist/runtime/chat-workspace.js.map +1 -0
- package/dist/runtime/goals/accounting.js +1 -1
- package/dist/runtime/goals/accounting.js.map +1 -1
- package/dist/runtime/goals/completion-audit.d.ts.map +1 -1
- package/dist/runtime/goals/completion-audit.js +5 -4
- package/dist/runtime/goals/completion-audit.js.map +1 -1
- package/dist/runtime/goals/coordinator.d.ts +3 -0
- package/dist/runtime/goals/coordinator.d.ts.map +1 -1
- package/dist/runtime/goals/coordinator.js +30 -2
- package/dist/runtime/goals/coordinator.js.map +1 -1
- package/dist/runtime/goals/prompt.d.ts +1 -1
- package/dist/runtime/goals/prompt.d.ts.map +1 -1
- package/dist/runtime/goals/prompt.js +3 -2
- package/dist/runtime/goals/prompt.js.map +1 -1
- package/dist/runtime/goals/tools.d.ts +21 -8
- package/dist/runtime/goals/tools.d.ts.map +1 -1
- package/dist/runtime/goals/tools.js +141 -10
- package/dist/runtime/goals/tools.js.map +1 -1
- package/dist/runtime/loop-budget.d.ts +2 -2
- package/dist/runtime/model-coordinator.d.ts.map +1 -1
- package/dist/runtime/model-coordinator.js.map +1 -1
- package/dist/runtime/subagents/child-executor-guard.d.ts.map +1 -1
- package/dist/runtime/subagents/child-executor-guard.js +4 -0
- package/dist/runtime/subagents/child-executor-guard.js.map +1 -1
- package/dist/runtime/subagents/index.d.ts +10 -3
- package/dist/runtime/subagents/index.d.ts.map +1 -1
- package/dist/runtime/subagents/index.js +25 -1
- package/dist/runtime/subagents/index.js.map +1 -1
- package/dist/runtime/subagents/policy.d.ts +1 -1
- package/dist/runtime/subagents/policy.d.ts.map +1 -1
- package/dist/runtime/subagents/policy.js.map +1 -1
- package/dist/runtime/subagents/presets.d.ts +2 -2
- package/dist/runtime/subagents/provider-gate.d.ts.map +1 -1
- package/dist/runtime/subagents/provider-gate.js +0 -1
- package/dist/runtime/subagents/provider-gate.js.map +1 -1
- package/dist/runtime/subagents/research-artifact.d.ts +101 -0
- package/dist/runtime/subagents/research-artifact.d.ts.map +1 -0
- package/dist/runtime/subagents/research-artifact.js +210 -0
- package/dist/runtime/subagents/research-artifact.js.map +1 -0
- package/dist/runtime/subagents/research-citation.d.ts +66 -0
- package/dist/runtime/subagents/research-citation.d.ts.map +1 -0
- package/dist/runtime/subagents/research-citation.js +185 -0
- package/dist/runtime/subagents/research-citation.js.map +1 -0
- package/dist/runtime/subagents/research-contract.d.ts +83 -0
- package/dist/runtime/subagents/research-contract.d.ts.map +1 -0
- package/dist/runtime/subagents/research-contract.js +337 -0
- package/dist/runtime/subagents/research-contract.js.map +1 -0
- package/dist/runtime/subagents/research-quality.d.ts +47 -0
- package/dist/runtime/subagents/research-quality.d.ts.map +1 -0
- package/dist/runtime/subagents/research-quality.js +125 -0
- package/dist/runtime/subagents/research-quality.js.map +1 -0
- package/dist/runtime/subagents/research-renderer.d.ts +95 -0
- package/dist/runtime/subagents/research-renderer.d.ts.map +1 -0
- package/dist/runtime/subagents/research-renderer.js +186 -0
- package/dist/runtime/subagents/research-renderer.js.map +1 -0
- package/dist/runtime/subagents/research-types.d.ts +105 -0
- package/dist/runtime/subagents/research-types.d.ts.map +1 -0
- package/dist/runtime/subagents/research-types.js +16 -0
- package/dist/runtime/subagents/research-types.js.map +1 -0
- package/dist/runtime/subagents/result-parser.d.ts +1 -5
- package/dist/runtime/subagents/result-parser.d.ts.map +1 -1
- package/dist/runtime/subagents/result-parser.js +5 -72
- package/dist/runtime/subagents/result-parser.js.map +1 -1
- package/dist/runtime/subagents/runtime-integration.d.ts +13 -7
- package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
- package/dist/runtime/subagents/runtime-integration.js +112 -2
- package/dist/runtime/subagents/runtime-integration.js.map +1 -1
- package/dist/runtime/subagents/supervisor.d.ts +15 -1
- package/dist/runtime/subagents/supervisor.d.ts.map +1 -1
- package/dist/runtime/subagents/supervisor.js +58 -3
- package/dist/runtime/subagents/supervisor.js.map +1 -1
- package/dist/runtime/subagents/tool.d.ts +2 -2
- package/dist/runtime/subagents/tool.d.ts.map +1 -1
- package/dist/runtime/subagents/tool.js +129 -9
- package/dist/runtime/subagents/tool.js.map +1 -1
- package/dist/runtime/subagents/types.d.ts +20 -0
- package/dist/runtime/subagents/types.d.ts.map +1 -1
- package/dist/runtime/subagents/types.js.map +1 -1
- package/dist/runtime/subagents/web-research-adapter.d.ts +85 -0
- package/dist/runtime/subagents/web-research-adapter.d.ts.map +1 -0
- package/dist/runtime/subagents/web-research-adapter.js +328 -0
- package/dist/runtime/subagents/web-research-adapter.js.map +1 -0
- package/dist/runtime/ui-events.d.ts +8 -8
- package/dist/runtime/ui-events.d.ts.map +1 -1
- package/dist/runtime/ui-events.js.map +1 -1
- package/dist/runtime/ui-view-model.d.ts +40 -0
- package/dist/runtime/ui-view-model.d.ts.map +1 -1
- package/dist/runtime/ui-view-model.js +126 -0
- package/dist/runtime/ui-view-model.js.map +1 -1
- package/dist/services/agent-runner.d.ts +5 -2
- package/dist/services/agent-runner.d.ts.map +1 -1
- package/dist/services/agent-runner.js +18 -18
- package/dist/services/agent-runner.js.map +1 -1
- package/dist/services/atomic-write.d.ts +9 -1
- package/dist/services/atomic-write.d.ts.map +1 -1
- package/dist/services/atomic-write.js +55 -2
- package/dist/services/atomic-write.js.map +1 -1
- package/dist/services/auth/auth.d.ts +11 -7
- package/dist/services/auth/auth.d.ts.map +1 -1
- package/dist/services/auth/auth.js +133 -34
- package/dist/services/auth/auth.js.map +1 -1
- package/dist/services/auth/aws.d.ts +2 -0
- package/dist/services/auth/aws.d.ts.map +1 -1
- package/dist/services/auth/aws.js +126 -12
- package/dist/services/auth/aws.js.map +1 -1
- package/dist/services/auth/index.d.ts +1 -1
- package/dist/services/auth/index.d.ts.map +1 -1
- package/dist/services/auth/index.js +2 -1
- package/dist/services/auth/index.js.map +1 -1
- package/dist/services/auto-fix/autoFixConfig.d.ts +0 -3
- package/dist/services/auto-fix/autoFixConfig.d.ts.map +1 -1
- package/dist/services/auto-fix/autoFixConfig.js +25 -8
- package/dist/services/auto-fix/autoFixConfig.js.map +1 -1
- package/dist/services/auto-fix/autoFixHook.d.ts +7 -0
- package/dist/services/auto-fix/autoFixHook.d.ts.map +1 -1
- package/dist/services/auto-fix/autoFixHook.js +10 -1
- package/dist/services/auto-fix/autoFixHook.js.map +1 -1
- package/dist/services/compact/auto-compact.d.ts +2 -0
- package/dist/services/compact/auto-compact.d.ts.map +1 -1
- package/dist/services/compact/auto-compact.js +15 -1
- package/dist/services/compact/auto-compact.js.map +1 -1
- package/dist/services/compact/compact.d.ts.map +1 -1
- package/dist/services/compact/compact.js +9 -11
- package/dist/services/compact/compact.js.map +1 -1
- package/dist/services/compact/summary-generator.d.ts.map +1 -1
- package/dist/services/compact/summary-generator.js +28 -4
- package/dist/services/compact/summary-generator.js.map +1 -1
- package/dist/services/compact/tool-call-groups.d.ts +19 -0
- package/dist/services/compact/tool-call-groups.d.ts.map +1 -0
- package/dist/services/compact/tool-call-groups.js +105 -0
- package/dist/services/compact/tool-call-groups.js.map +1 -0
- package/dist/services/concurrent-sessions.d.ts +4 -0
- package/dist/services/concurrent-sessions.d.ts.map +1 -1
- package/dist/services/concurrent-sessions.js +76 -21
- package/dist/services/concurrent-sessions.js.map +1 -1
- package/dist/services/config-dir.d.ts.map +1 -1
- package/dist/services/config-dir.js +19 -5
- package/dist/services/config-dir.js.map +1 -1
- package/dist/services/config.d.ts +6 -4
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +14 -71
- package/dist/services/config.js.map +1 -1
- package/dist/services/doctor.d.ts +2 -2
- package/dist/services/doctor.js.map +1 -1
- package/dist/services/file-glob.d.ts.map +1 -1
- package/dist/services/file-glob.js +22 -2
- package/dist/services/file-glob.js.map +1 -1
- package/dist/services/file-lock.d.ts +7 -0
- package/dist/services/file-lock.d.ts.map +1 -0
- package/dist/services/file-lock.js +139 -0
- package/dist/services/file-lock.js.map +1 -0
- package/dist/services/global-config.d.ts +2 -0
- package/dist/services/global-config.d.ts.map +1 -1
- package/dist/services/global-config.js +67 -4
- package/dist/services/global-config.js.map +1 -1
- package/dist/services/goal-storage.d.ts.map +1 -1
- package/dist/services/goal-storage.js +52 -19
- package/dist/services/goal-storage.js.map +1 -1
- package/dist/services/llm.d.ts +12 -0
- package/dist/services/llm.d.ts.map +1 -1
- package/dist/services/llm.js +166 -69
- package/dist/services/llm.js.map +1 -1
- package/dist/services/mcp/transports.d.ts +0 -1
- package/dist/services/mcp/transports.d.ts.map +1 -1
- package/dist/services/mcp/transports.js +12 -13
- package/dist/services/mcp/transports.js.map +1 -1
- package/dist/services/model-context.d.ts +8 -0
- package/dist/services/model-context.d.ts.map +1 -1
- package/dist/services/model-context.js +111 -7
- package/dist/services/model-context.js.map +1 -1
- package/dist/services/provider-resilience/coordinator.d.ts +9 -4
- package/dist/services/provider-resilience/coordinator.d.ts.map +1 -1
- package/dist/services/provider-resilience/coordinator.js +88 -21
- package/dist/services/provider-resilience/coordinator.js.map +1 -1
- package/dist/services/provider-resilience/error-classifier.d.ts +1 -0
- package/dist/services/provider-resilience/error-classifier.d.ts.map +1 -1
- package/dist/services/provider-resilience/error-classifier.js +50 -29
- package/dist/services/provider-resilience/error-classifier.js.map +1 -1
- package/dist/services/provider-resilience/index.d.ts +3 -3
- package/dist/services/provider-resilience/index.d.ts.map +1 -1
- package/dist/services/provider-resilience/index.js +3 -1
- package/dist/services/provider-resilience/index.js.map +1 -1
- package/dist/services/provider-resilience/request-gate.d.ts +6 -0
- package/dist/services/provider-resilience/request-gate.d.ts.map +1 -1
- package/dist/services/provider-resilience/request-gate.js +24 -9
- package/dist/services/provider-resilience/request-gate.js.map +1 -1
- package/dist/services/provider-resilience/stream-recovery.d.ts +1 -1
- package/dist/services/provider-resilience/stream-recovery.d.ts.map +1 -1
- package/dist/services/provider-resilience/stream-recovery.js +1 -1
- package/dist/services/provider-resilience/stream-recovery.js.map +1 -1
- package/dist/services/provider-resilience/types.d.ts +9 -0
- package/dist/services/provider-resilience/types.d.ts.map +1 -1
- package/dist/services/provider-resilience/types.js.map +1 -1
- package/dist/services/redaction.d.ts.map +1 -1
- package/dist/services/redaction.js +29 -1
- package/dist/services/redaction.js.map +1 -1
- package/dist/services/session-index.d.ts.map +1 -1
- package/dist/services/session-index.js +75 -44
- package/dist/services/session-index.js.map +1 -1
- package/dist/services/session-memory/sessionMemory.d.ts.map +1 -1
- package/dist/services/session-memory/sessionMemory.js +6 -3
- package/dist/services/session-memory/sessionMemory.js.map +1 -1
- package/dist/services/session-storage.d.ts +8 -0
- package/dist/services/session-storage.d.ts.map +1 -1
- package/dist/services/session-storage.js +105 -27
- package/dist/services/session-storage.js.map +1 -1
- package/dist/services/storage-maintenance.d.ts.map +1 -1
- package/dist/services/storage-maintenance.js +62 -9
- package/dist/services/storage-maintenance.js.map +1 -1
- package/dist/services/task-manager.d.ts +9 -4
- package/dist/services/task-manager.d.ts.map +1 -1
- package/dist/services/task-manager.js +18 -4
- package/dist/services/task-manager.js.map +1 -1
- package/dist/services/usage-state.d.ts +1 -0
- package/dist/services/usage-state.d.ts.map +1 -1
- package/dist/services/usage-state.js +81 -45
- package/dist/services/usage-state.js.map +1 -1
- package/dist/services/verification-profile.d.ts.map +1 -1
- package/dist/services/verification-profile.js +23 -3
- package/dist/services/verification-profile.js.map +1 -1
- package/dist/services/web-search-adapters.d.ts.map +1 -1
- package/dist/services/web-search-adapters.js +48 -18
- package/dist/services/web-search-adapters.js.map +1 -1
- package/dist/services/web-search-mcp.d.ts.map +1 -1
- package/dist/services/web-search-mcp.js +27 -11
- package/dist/services/web-search-mcp.js.map +1 -1
- package/dist/services/workspace-diff.d.ts +14 -0
- package/dist/services/workspace-diff.d.ts.map +1 -1
- package/dist/services/workspace-diff.js +60 -11
- package/dist/services/workspace-diff.js.map +1 -1
- package/dist/services/yaml-config.d.ts.map +1 -1
- package/dist/services/yaml-config.js +2 -1
- package/dist/services/yaml-config.js.map +1 -1
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +26 -11
- package/dist/skills/loader.js.map +1 -1
- package/dist/skills/runtime.d.ts +3 -3
- package/dist/skills/runtime.d.ts.map +1 -1
- package/dist/skills/runtime.js +37 -4
- package/dist/skills/runtime.js.map +1 -1
- package/dist/skills/types.d.ts +1 -1
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/terminal-ui/launch.d.ts +16 -8
- package/dist/terminal-ui/launch.d.ts.map +1 -1
- package/dist/terminal-ui/launch.js +26 -0
- package/dist/terminal-ui/launch.js.map +1 -1
- package/dist/terminal-ui/raw-editor.js.map +1 -1
- package/dist/tools/bash_security.d.ts +58 -18
- package/dist/tools/bash_security.d.ts.map +1 -1
- package/dist/tools/bash_security.js +587 -80
- package/dist/tools/bash_security.js.map +1 -1
- package/dist/tools/git.d.ts +8 -8
- package/dist/tools/git.d.ts.map +1 -1
- package/dist/tools/git.js +248 -55
- package/dist/tools/git.js.map +1 -1
- package/dist/tools/index.d.ts +14 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +236 -42
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lsp.d.ts +74 -6
- package/dist/tools/lsp.d.ts.map +1 -1
- package/dist/tools/lsp.js +24 -5
- package/dist/tools/lsp.js.map +1 -1
- package/dist/tools/mcp.d.ts +19 -6
- package/dist/tools/mcp.d.ts.map +1 -1
- package/dist/tools/mcp.js +143 -26
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/plan.d.ts +4 -4
- package/dist/tools/sandbox.d.ts +3 -1
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +28 -13
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/todo.d.ts +3 -3
- package/dist/tools/web.d.ts +15 -4
- package/dist/tools/web.d.ts.map +1 -1
- package/dist/tools/web.js +240 -26
- package/dist/tools/web.js.map +1 -1
- package/dist/tui-core/frame.js.map +1 -1
- package/dist/tui-ui/launch.d.ts +3 -3
- package/dist/tui-ui/layout.d.ts.map +1 -1
- package/dist/tui-ui/layout.js +2 -0
- package/dist/tui-ui/layout.js.map +1 -1
- package/dist/tui-ui/runner.d.ts.map +1 -1
- package/dist/tui-ui/runner.js +1 -0
- package/dist/tui-ui/runner.js.map +1 -1
- package/dist/tui-ui/state.d.ts +9 -1
- package/dist/tui-ui/state.d.ts.map +1 -1
- package/dist/tui-ui/state.js +13 -0
- package/dist/tui-ui/state.js.map +1 -1
- package/dist/ui/markdown.js.map +1 -1
- package/dist/utils/debug-log.d.ts +52 -0
- package/dist/utils/debug-log.d.ts.map +1 -0
- package/dist/utils/debug-log.js +94 -0
- package/dist/utils/debug-log.js.map +1 -0
- package/dist/utils/errors.d.ts +25 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +47 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/json.d.ts +6 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +66 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/mask.d.ts +8 -1
- package/dist/utils/mask.d.ts.map +1 -1
- package/dist/utils/mask.js +10 -12
- package/dist/utils/mask.js.map +1 -1
- package/dist/utils/observability.d.ts +22 -0
- package/dist/utils/observability.d.ts.map +1 -0
- package/dist/utils/observability.js +80 -0
- package/dist/utils/observability.js.map +1 -0
- package/dist/utils/token-estimate.d.ts +8 -0
- package/dist/utils/token-estimate.d.ts.map +1 -1
- package/dist/utils/token-estimate.js +30 -17
- package/dist/utils/token-estimate.js.map +1 -1
- package/package.json +8 -7
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* `subtask` capability - this is enforced structurally, not by prompt alone.
|
|
8
8
|
*/
|
|
9
9
|
import type { SubagentRole } from './types';
|
|
10
|
-
import type {
|
|
10
|
+
import type { OrionCodeTool } from '../../framework/tool';
|
|
11
11
|
/** Read-only investigation tools available to children in v0.2.20. */
|
|
12
12
|
export declare const READ_ONLY_INVESTIGATION_TOOLS: readonly ["read_file", "list_files", "glob", "grep", "batch_read"];
|
|
13
13
|
/**
|
|
@@ -37,7 +37,7 @@ export declare function systemPromptForRole(role: SubagentRole): string;
|
|
|
37
37
|
* Returns the names the child may receive; the caller is responsible for
|
|
38
38
|
* resolving them to tool definitions.
|
|
39
39
|
*/
|
|
40
|
-
export declare function filterToolsForRole(availableToolNames: readonly string[], role: SubagentRole, _runtimeTools?: readonly
|
|
40
|
+
export declare function filterToolsForRole(availableToolNames: readonly string[], role: SubagentRole, _runtimeTools?: readonly OrionCodeTool[]): string[];
|
|
41
41
|
/** Assert a filtered tool list contains no forbidden tool. Used by the runner. */
|
|
42
42
|
export declare function assertNoForbiddenTools(toolNames: readonly string[]): void;
|
|
43
43
|
//# sourceMappingURL=presets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-gate.d.ts","sourceRoot":"","sources":["../../../src/runtime/subagents/provider-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-gate.d.ts","sourceRoot":"","sources":["../../../src/runtime/subagents/provider-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK;QAAE,KAAK,IAAI,IAAI,CAAA;KAAE,CAAC;IAClE,4EAA4E;IAC5E,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAED,wDAAwD;AACxD,qBAAa,mBAAoB,SAAQ,KAAK;;CAK7C;AAUD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoD;IAClF,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAkC;gBAE3C,OAAO,EAAE,mBAAmB;IAWxC,8DAA8D;IAC9D,YAAY,IAAI,OAAO;IAIvB,kDAAkD;IAClD,mBAAmB,IAAI,MAAM;IAI7B;;;;;OAKG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAYzC;;;;;;;;;OASG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAInC,mDAAmD;IACnD,WAAW,IAAI,MAAM;IAIrB;;;;;;;;;;OAUG;IACG,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgClD,oEAAoE;IACpE,OAAO,IAAI,IAAI;IAKf;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAapB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;CAgBzB"}
|
|
@@ -24,7 +24,6 @@
|
|
|
24
24
|
*/
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.SubagentProviderGate = exports.AcquireAbortedError = void 0;
|
|
27
|
-
const NULL_PROVIDER_GATE = null;
|
|
28
27
|
/** Thrown when an acquire is aborted via its signal. */
|
|
29
28
|
class AcquireAbortedError extends Error {
|
|
30
29
|
constructor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-gate.js","sourceRoot":"","sources":["../../../src/runtime/subagents/provider-gate.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;
|
|
1
|
+
{"version":3,"file":"provider-gate.js","sourceRoot":"","sources":["../../../src/runtime/subagents/provider-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research artifact persistence, resume, and Goal integration (v0.1.4, P1-R5).
|
|
3
|
+
*
|
|
4
|
+
* - Packet + source metadata are saved atomically under a CAS (compare-and-swap)
|
|
5
|
+
* token so a concurrent / active-Goal overwrite without the current token is
|
|
6
|
+
* rejected.
|
|
7
|
+
* - Scope isolation: project / session / Goal are part of the storage key, so a
|
|
8
|
+
* packet can never leak across project/session boundaries.
|
|
9
|
+
* - resume derives completed/partial/failed WITHOUT replaying any external side
|
|
10
|
+
* effect (no network, no fetch) - it only reads the stored packet.
|
|
11
|
+
* - clear/repair/cleanup preserve the original packet + prior CAS tokens for
|
|
12
|
+
* traceability; old schema versions fail closed (never silently migrated).
|
|
13
|
+
*
|
|
14
|
+
* Persistence is injected (default: in-memory map) so the logic is testable
|
|
15
|
+
* without disk.
|
|
16
|
+
*/
|
|
17
|
+
import { type ResearchPacket } from './research-types';
|
|
18
|
+
export interface ResearchScope {
|
|
19
|
+
projectPath: string;
|
|
20
|
+
sessionId: string;
|
|
21
|
+
goalId?: string;
|
|
22
|
+
/** Optional packet discriminator when several research tasks share a Goal. */
|
|
23
|
+
packetId?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ArtifactRecord {
|
|
26
|
+
version: number;
|
|
27
|
+
/** CAS token = content hash of the stored packet at write time. */
|
|
28
|
+
casToken: string;
|
|
29
|
+
packet: ResearchPacket;
|
|
30
|
+
storedAt: string;
|
|
31
|
+
/** Prior CAS tokens, oldest first, kept for traceability. */
|
|
32
|
+
previousTokens: string[];
|
|
33
|
+
}
|
|
34
|
+
export interface ResearchArtifactStore {
|
|
35
|
+
read(scopeKey: string): ArtifactRecord | null;
|
|
36
|
+
/** Legacy unconditional write. Prefer writeIfCas for all read/modify/write paths. */
|
|
37
|
+
write(scopeKey: string, record: ArtifactRecord): void;
|
|
38
|
+
/**
|
|
39
|
+
* Atomically write only when the durable record still has `expectedCurrentToken`.
|
|
40
|
+
* `null` means the scope must still be absent. Implementations that predate this
|
|
41
|
+
* method remain source-compatible, but cannot provide cross-process CAS.
|
|
42
|
+
*/
|
|
43
|
+
writeIfCas?(scopeKey: string, expectedCurrentToken: string | null, record: ArtifactRecord): boolean;
|
|
44
|
+
}
|
|
45
|
+
/** Default in-memory store (test seam; production can back this with session storage). */
|
|
46
|
+
export declare function createMemoryArtifactStore(): ResearchArtifactStore;
|
|
47
|
+
export declare function scopeKey(scope: ResearchScope): string;
|
|
48
|
+
/**
|
|
49
|
+
* Durable project-scoped store used by the runtime integration.
|
|
50
|
+
*
|
|
51
|
+
* Each packet has a deterministic filename derived from its full scope. Writes
|
|
52
|
+
* use a sibling temporary file plus rename so a killed process cannot leave a
|
|
53
|
+
* partially-written JSON record that looks resumable.
|
|
54
|
+
*/
|
|
55
|
+
export declare function createFileArtifactStore(projectPath: string): ResearchArtifactStore;
|
|
56
|
+
export type ResearchResumeState = 'completed' | 'partial' | 'failed';
|
|
57
|
+
export declare class CasMismatchError extends Error {
|
|
58
|
+
scopeKey: string;
|
|
59
|
+
expected: string;
|
|
60
|
+
actual: string;
|
|
61
|
+
constructor(scopeKey: string, expected: string, actual: string);
|
|
62
|
+
}
|
|
63
|
+
export declare class UnsupportedSchemaError extends Error {
|
|
64
|
+
version: number;
|
|
65
|
+
constructor(version: number);
|
|
66
|
+
}
|
|
67
|
+
export interface SaveOptions {
|
|
68
|
+
/**
|
|
69
|
+
* When set, the write only succeeds if the existing record's CAS token matches.
|
|
70
|
+
* Omitting it for a goal-scoped packet triggers a CasMismatchError (an active
|
|
71
|
+
* Goal's packet must be updated via explicit resume with the current token).
|
|
72
|
+
*/
|
|
73
|
+
expectedToken?: string;
|
|
74
|
+
/** Stamp used instead of the wall clock (deterministic tests). */
|
|
75
|
+
now?: () => Date;
|
|
76
|
+
}
|
|
77
|
+
export interface SaveResult {
|
|
78
|
+
version: number;
|
|
79
|
+
casToken: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Atomically save (or update) a research packet under its scope. Enforces CAS so
|
|
83
|
+
* concurrent / active-Goal overwrites are rejected unless the caller holds the
|
|
84
|
+
* current token. Returns the new version + token.
|
|
85
|
+
*/
|
|
86
|
+
export declare function saveResearchPacket(store: ResearchArtifactStore, packet: ResearchPacket, scope: ResearchScope, opts?: SaveOptions): SaveResult;
|
|
87
|
+
/**
|
|
88
|
+
* Load a packet. Fails closed on old/unsupported schema versions (never migrates
|
|
89
|
+
* silently). Returns null when nothing is stored for the scope.
|
|
90
|
+
*/
|
|
91
|
+
export declare function loadResearchPacket(store: ResearchArtifactStore, scope: ResearchScope): ResearchPacket | null;
|
|
92
|
+
/**
|
|
93
|
+
* Resume the research state from a stored packet WITHOUT replaying external side
|
|
94
|
+
* effects. Pure derivation: completed when there are usable sources and no
|
|
95
|
+
* failures/conflicts, partial when there are failures/conflicts but some progress,
|
|
96
|
+
* failed only when there is nothing usable.
|
|
97
|
+
*/
|
|
98
|
+
export declare function resumeResearchState(packet: ResearchPacket): ResearchResumeState;
|
|
99
|
+
/** Get the prior CAS tokens for a scope (traceability after clear/repair). */
|
|
100
|
+
export declare function artifactHistory(store: ResearchArtifactStore, scope: ResearchScope): string[];
|
|
101
|
+
//# sourceMappingURL=research-artifact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-artifact.d.ts","sourceRoot":"","sources":["../../../src/runtime/subagents/research-artifact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AASH,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEhF,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IAC9C,qFAAqF;IACrF,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IACtD;;;;OAIG;IACH,UAAU,CAAC,CACT,QAAQ,EAAE,MAAM,EAChB,oBAAoB,EAAE,MAAM,GAAG,IAAI,EACnC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC;CACZ;AAMD,0FAA0F;AAC1F,wBAAgB,yBAAyB,IAAI,qBAAqB,CAiBjE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAErD;AA0BD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB,CAyBlF;AAED,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAErE,qBAAa,gBAAiB,SAAQ,KAAK;IAEhC,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,MAAM;gBAFd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAKxB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC5B,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;CAInC;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,aAAa,EACpB,IAAI,GAAE,WAAgB,GACrB,UAAU,CAkCZ;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,qBAAqB,EAC5B,KAAK,EAAE,aAAa,GACnB,cAAc,GAAG,IAAI,CAOvB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,mBAAmB,CAW/E;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,CAE5F"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Research artifact persistence, resume, and Goal integration (v0.1.4, P1-R5).
|
|
4
|
+
*
|
|
5
|
+
* - Packet + source metadata are saved atomically under a CAS (compare-and-swap)
|
|
6
|
+
* token so a concurrent / active-Goal overwrite without the current token is
|
|
7
|
+
* rejected.
|
|
8
|
+
* - Scope isolation: project / session / Goal are part of the storage key, so a
|
|
9
|
+
* packet can never leak across project/session boundaries.
|
|
10
|
+
* - resume derives completed/partial/failed WITHOUT replaying any external side
|
|
11
|
+
* effect (no network, no fetch) - it only reads the stored packet.
|
|
12
|
+
* - clear/repair/cleanup preserve the original packet + prior CAS tokens for
|
|
13
|
+
* traceability; old schema versions fail closed (never silently migrated).
|
|
14
|
+
*
|
|
15
|
+
* Persistence is injected (default: in-memory map) so the logic is testable
|
|
16
|
+
* without disk.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.UnsupportedSchemaError = exports.CasMismatchError = void 0;
|
|
20
|
+
exports.createMemoryArtifactStore = createMemoryArtifactStore;
|
|
21
|
+
exports.scopeKey = scopeKey;
|
|
22
|
+
exports.createFileArtifactStore = createFileArtifactStore;
|
|
23
|
+
exports.saveResearchPacket = saveResearchPacket;
|
|
24
|
+
exports.loadResearchPacket = loadResearchPacket;
|
|
25
|
+
exports.resumeResearchState = resumeResearchState;
|
|
26
|
+
exports.artifactHistory = artifactHistory;
|
|
27
|
+
const crypto_1 = require("crypto");
|
|
28
|
+
const fs_1 = require("fs");
|
|
29
|
+
const path_1 = require("path");
|
|
30
|
+
const atomic_write_1 = require("../../services/atomic-write");
|
|
31
|
+
const config_dir_1 = require("../../services/config-dir");
|
|
32
|
+
const file_lock_1 = require("../../services/file-lock");
|
|
33
|
+
const research_contract_1 = require("./research-contract");
|
|
34
|
+
const research_types_1 = require("./research-types");
|
|
35
|
+
function cloneRecord(record) {
|
|
36
|
+
return JSON.parse(JSON.stringify(record));
|
|
37
|
+
}
|
|
38
|
+
/** Default in-memory store (test seam; production can back this with session storage). */
|
|
39
|
+
function createMemoryArtifactStore() {
|
|
40
|
+
const map = new Map();
|
|
41
|
+
return {
|
|
42
|
+
read: key => {
|
|
43
|
+
const record = map.get(key);
|
|
44
|
+
return record ? cloneRecord(record) : null;
|
|
45
|
+
},
|
|
46
|
+
write: (key, rec) => {
|
|
47
|
+
map.set(key, cloneRecord(rec));
|
|
48
|
+
},
|
|
49
|
+
writeIfCas: (key, expectedCurrentToken, rec) => {
|
|
50
|
+
const actual = map.get(key)?.casToken ?? null;
|
|
51
|
+
if (actual !== expectedCurrentToken)
|
|
52
|
+
return false;
|
|
53
|
+
map.set(key, cloneRecord(rec));
|
|
54
|
+
return true;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function scopeKey(scope) {
|
|
59
|
+
return `${scope.projectPath}::${scope.sessionId}::${scope.goalId ?? '-'}::${scope.packetId ?? '-'}`;
|
|
60
|
+
}
|
|
61
|
+
function readArtifactRecord(file) {
|
|
62
|
+
if (!(0, fs_1.existsSync)(file))
|
|
63
|
+
return null;
|
|
64
|
+
try {
|
|
65
|
+
const parsed = JSON.parse((0, fs_1.readFileSync)(file, 'utf8'));
|
|
66
|
+
if (!parsed ||
|
|
67
|
+
typeof parsed.version !== 'number' ||
|
|
68
|
+
typeof parsed.casToken !== 'string' ||
|
|
69
|
+
!parsed.packet ||
|
|
70
|
+
typeof parsed.storedAt !== 'string' ||
|
|
71
|
+
!Array.isArray(parsed.previousTokens)) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return parsed;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function writeArtifactRecord(file, record) {
|
|
81
|
+
(0, atomic_write_1.atomicWriteFileSync)(file, `${JSON.stringify(record)}\n`, { mode: 0o600 });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Durable project-scoped store used by the runtime integration.
|
|
85
|
+
*
|
|
86
|
+
* Each packet has a deterministic filename derived from its full scope. Writes
|
|
87
|
+
* use a sibling temporary file plus rename so a killed process cannot leave a
|
|
88
|
+
* partially-written JSON record that looks resumable.
|
|
89
|
+
*/
|
|
90
|
+
function createFileArtifactStore(projectPath) {
|
|
91
|
+
const artifactDir = (0, config_dir_1.getProjectArtifactsDir)(projectPath);
|
|
92
|
+
const fileFor = (key) => {
|
|
93
|
+
const digest = (0, crypto_1.createHash)('sha256').update(key).digest('hex');
|
|
94
|
+
return (0, path_1.join)(artifactDir, `research-${digest}.json`);
|
|
95
|
+
};
|
|
96
|
+
return {
|
|
97
|
+
read: key => readArtifactRecord(fileFor(key)),
|
|
98
|
+
write: (key, record) => {
|
|
99
|
+
(0, fs_1.mkdirSync)(artifactDir, { recursive: true, mode: 0o700 });
|
|
100
|
+
const file = fileFor(key);
|
|
101
|
+
(0, file_lock_1.withFileLockSync)(file, () => writeArtifactRecord(file, record));
|
|
102
|
+
},
|
|
103
|
+
writeIfCas: (key, expectedCurrentToken, record) => {
|
|
104
|
+
(0, fs_1.mkdirSync)(artifactDir, { recursive: true, mode: 0o700 });
|
|
105
|
+
const file = fileFor(key);
|
|
106
|
+
return (0, file_lock_1.withFileLockSync)(file, () => {
|
|
107
|
+
const actual = readArtifactRecord(file)?.casToken ?? null;
|
|
108
|
+
if (actual !== expectedCurrentToken)
|
|
109
|
+
return false;
|
|
110
|
+
writeArtifactRecord(file, record);
|
|
111
|
+
return true;
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
class CasMismatchError extends Error {
|
|
117
|
+
constructor(scopeKey, expected, actual) {
|
|
118
|
+
super(`CAS mismatch for ${scopeKey}: expected ${expected}, found ${actual}`);
|
|
119
|
+
this.scopeKey = scopeKey;
|
|
120
|
+
this.expected = expected;
|
|
121
|
+
this.actual = actual;
|
|
122
|
+
this.name = 'CasMismatchError';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.CasMismatchError = CasMismatchError;
|
|
126
|
+
class UnsupportedSchemaError extends Error {
|
|
127
|
+
constructor(version) {
|
|
128
|
+
super(`unsupported research schema version ${version}`);
|
|
129
|
+
this.version = version;
|
|
130
|
+
this.name = 'UnsupportedSchemaError';
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
exports.UnsupportedSchemaError = UnsupportedSchemaError;
|
|
134
|
+
/**
|
|
135
|
+
* Atomically save (or update) a research packet under its scope. Enforces CAS so
|
|
136
|
+
* concurrent / active-Goal overwrites are rejected unless the caller holds the
|
|
137
|
+
* current token. Returns the new version + token.
|
|
138
|
+
*/
|
|
139
|
+
function saveResearchPacket(store, packet, scope, opts = {}) {
|
|
140
|
+
const key = scopeKey(scope);
|
|
141
|
+
const now = opts.now ?? (() => new Date());
|
|
142
|
+
const casToken = (0, research_contract_1.hashPacket)(packet);
|
|
143
|
+
const existing = store.read(key);
|
|
144
|
+
if (opts.expectedToken !== undefined && !existing) {
|
|
145
|
+
throw new CasMismatchError(key, opts.expectedToken, '<missing>');
|
|
146
|
+
}
|
|
147
|
+
if (scope.goalId && existing && opts.expectedToken === undefined) {
|
|
148
|
+
// An active Goal's packet must be updated with an explicit token (resume),
|
|
149
|
+
// never blindly overwritten.
|
|
150
|
+
throw new CasMismatchError(key, existing.casToken, casToken);
|
|
151
|
+
}
|
|
152
|
+
if (existing && opts.expectedToken !== undefined && opts.expectedToken !== existing.casToken) {
|
|
153
|
+
throw new CasMismatchError(key, opts.expectedToken, existing.casToken);
|
|
154
|
+
}
|
|
155
|
+
const version = (existing?.version ?? 0) + 1;
|
|
156
|
+
const previousTokens = existing ? [...existing.previousTokens, existing.casToken] : [];
|
|
157
|
+
const record = { version, casToken, packet, storedAt: now().toISOString(), previousTokens };
|
|
158
|
+
const expectedCurrentToken = existing?.casToken ?? null;
|
|
159
|
+
if (store.writeIfCas) {
|
|
160
|
+
const written = store.writeIfCas(key, expectedCurrentToken, record);
|
|
161
|
+
if (!written) {
|
|
162
|
+
const actual = store.read(key)?.casToken ?? '<missing>';
|
|
163
|
+
throw new CasMismatchError(key, expectedCurrentToken ?? '<missing>', actual);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// Backward compatibility for injected legacy stores. Built-in memory/file
|
|
168
|
+
// stores always take the atomic path above.
|
|
169
|
+
store.write(key, record);
|
|
170
|
+
}
|
|
171
|
+
return { version, casToken };
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Load a packet. Fails closed on old/unsupported schema versions (never migrates
|
|
175
|
+
* silently). Returns null when nothing is stored for the scope.
|
|
176
|
+
*/
|
|
177
|
+
function loadResearchPacket(store, scope) {
|
|
178
|
+
const rec = store.read(scopeKey(scope));
|
|
179
|
+
if (!rec)
|
|
180
|
+
return null;
|
|
181
|
+
if (rec.packet.schemaVersion !== research_types_1.RESEARCH_SCHEMA_VERSION) {
|
|
182
|
+
throw new UnsupportedSchemaError(rec.packet.schemaVersion);
|
|
183
|
+
}
|
|
184
|
+
return rec.packet;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Resume the research state from a stored packet WITHOUT replaying external side
|
|
188
|
+
* effects. Pure derivation: completed when there are usable sources and no
|
|
189
|
+
* failures/conflicts, partial when there are failures/conflicts but some progress,
|
|
190
|
+
* failed only when there is nothing usable.
|
|
191
|
+
*/
|
|
192
|
+
function resumeResearchState(packet) {
|
|
193
|
+
if (packet.schemaVersion !== research_types_1.RESEARCH_SCHEMA_VERSION)
|
|
194
|
+
throw new UnsupportedSchemaError(packet.schemaVersion);
|
|
195
|
+
if (packet.sources.length === 0)
|
|
196
|
+
return 'failed';
|
|
197
|
+
// Only a fully retrieved source set can resume as completed. Partial and
|
|
198
|
+
// stale evidence must remain visible after restart instead of being silently
|
|
199
|
+
// upgraded (#108); failed/blocked retain the existing partial semantics.
|
|
200
|
+
const hasIncompleteSources = packet.sources.some(s => s.status !== 'retrieved');
|
|
201
|
+
const hasConflict = packet.risks.some(r => /conflict/i.test(r));
|
|
202
|
+
if (hasIncompleteSources || hasConflict)
|
|
203
|
+
return 'partial';
|
|
204
|
+
return 'completed';
|
|
205
|
+
}
|
|
206
|
+
/** Get the prior CAS tokens for a scope (traceability after clear/repair). */
|
|
207
|
+
function artifactHistory(store, scope) {
|
|
208
|
+
return store.read(scopeKey(scope))?.previousTokens ?? [];
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=research-artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-artifact.js","sourceRoot":"","sources":["../../../src/runtime/subagents/research-artifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Citation, conflict, and evidence-candidate resolution (v0.1.4, P0-R3).
|
|
3
|
+
*
|
|
4
|
+
* Turns a `ResearchPacket` (with its claims + sources) into:
|
|
5
|
+
* - resolved claim->source bindings (reference-integrity validated),
|
|
6
|
+
* - same-URL multi-version dedupe (older revisions marked `stale` on hash drift),
|
|
7
|
+
* - conflict records for contradictory sources (never auto-picked),
|
|
8
|
+
* - a verification classification per claim,
|
|
9
|
+
* - evidence candidates (only rule-compliant claims; research vs execution kept
|
|
10
|
+
* distinct so a web summary can never stand in for test/build/file facts),
|
|
11
|
+
* - a completion audit that stays `partial`/`unmet` for claims that have sources
|
|
12
|
+
* but no independent verification.
|
|
13
|
+
*
|
|
14
|
+
* This module is pure (no IO) so it is fully testable without network or disk.
|
|
15
|
+
*/
|
|
16
|
+
import type { ResearchPacket } from './research-types';
|
|
17
|
+
/** Normalize a URL for dedupe: drop fragment + trailing slash, lowercase host. */
|
|
18
|
+
export declare function urlKey(url: string | undefined): string;
|
|
19
|
+
export type BindingStatus = 'bound' | 'dangling' | 'stale_only' | 'conflicted';
|
|
20
|
+
export interface ClaimBinding {
|
|
21
|
+
claimId: string;
|
|
22
|
+
/** Resolved, non-stale source ids actually backing the claim. */
|
|
23
|
+
sourceIds: string[];
|
|
24
|
+
/** All source ids referenced by the claim (including stale/blocked). */
|
|
25
|
+
referencedSourceIds: string[];
|
|
26
|
+
status: BindingStatus;
|
|
27
|
+
}
|
|
28
|
+
export interface ConflictRecord {
|
|
29
|
+
claimId: string;
|
|
30
|
+
sourceIds: string[];
|
|
31
|
+
reason: string;
|
|
32
|
+
}
|
|
33
|
+
export interface EvidenceCandidate {
|
|
34
|
+
claimId: string;
|
|
35
|
+
/** 'research' = external/web source; 'execution' = file/verification fact. */
|
|
36
|
+
kind: 'research' | 'execution';
|
|
37
|
+
basis: 'file' | 'external';
|
|
38
|
+
summary: string;
|
|
39
|
+
}
|
|
40
|
+
export interface CompletionAudit {
|
|
41
|
+
status: 'met' | 'partial' | 'unmet';
|
|
42
|
+
/** Claims that have sources but no independent verification. */
|
|
43
|
+
unverifiedClaimIds: string[];
|
|
44
|
+
notes: string[];
|
|
45
|
+
}
|
|
46
|
+
export interface CitationResolution {
|
|
47
|
+
packetId: string;
|
|
48
|
+
bindings: ClaimBinding[];
|
|
49
|
+
conflicts: ConflictRecord[];
|
|
50
|
+
staleSourceIds: string[];
|
|
51
|
+
evidenceCandidates: EvidenceCandidate[];
|
|
52
|
+
audit: CompletionAudit;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve citations for a packet.
|
|
56
|
+
*
|
|
57
|
+
* Reference integrity: a claim binding to an unknown source id is flagged
|
|
58
|
+
* `dangling` (and downgraded to `unverified`). Dedupe: sources sharing a
|
|
59
|
+
* canonical URL key are collapsed; the newest by `retrievedAt` wins and older
|
|
60
|
+
* revisions with a different content hash are marked `stale`. Conflict: a claim
|
|
61
|
+
* backed by both a `retrieved` source and a `failed`/`blocked` source (or two
|
|
62
|
+
* sources explicitly flagged contradictory) yields a conflict record and is
|
|
63
|
+
* never silently resolved in the model-favorable direction.
|
|
64
|
+
*/
|
|
65
|
+
export declare function resolveCitations(packet: ResearchPacket): CitationResolution;
|
|
66
|
+
//# sourceMappingURL=research-citation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-citation.d.ts","sourceRoot":"","sources":["../../../src/runtime/subagents/research-citation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAiB,cAAc,EAAgC,MAAM,kBAAkB,CAAC;AAEpG,kFAAkF;AAClF,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYtD;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC;AAE/E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,wEAAwE;IACxE,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IAC/B,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;IACpC,gEAAgE;IAChE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,kBAAkB,CAsG3E"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Citation, conflict, and evidence-candidate resolution (v0.1.4, P0-R3).
|
|
4
|
+
*
|
|
5
|
+
* Turns a `ResearchPacket` (with its claims + sources) into:
|
|
6
|
+
* - resolved claim->source bindings (reference-integrity validated),
|
|
7
|
+
* - same-URL multi-version dedupe (older revisions marked `stale` on hash drift),
|
|
8
|
+
* - conflict records for contradictory sources (never auto-picked),
|
|
9
|
+
* - a verification classification per claim,
|
|
10
|
+
* - evidence candidates (only rule-compliant claims; research vs execution kept
|
|
11
|
+
* distinct so a web summary can never stand in for test/build/file facts),
|
|
12
|
+
* - a completion audit that stays `partial`/`unmet` for claims that have sources
|
|
13
|
+
* but no independent verification.
|
|
14
|
+
*
|
|
15
|
+
* This module is pure (no IO) so it is fully testable without network or disk.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.urlKey = urlKey;
|
|
19
|
+
exports.resolveCitations = resolveCitations;
|
|
20
|
+
/** Normalize a URL for dedupe: drop fragment + trailing slash, lowercase host. */
|
|
21
|
+
function urlKey(url) {
|
|
22
|
+
if (!url)
|
|
23
|
+
return '';
|
|
24
|
+
try {
|
|
25
|
+
const u = new URL(url);
|
|
26
|
+
const host = u.host.toLowerCase();
|
|
27
|
+
let path = u.pathname;
|
|
28
|
+
if (path.length > 1 && path.endsWith('/'))
|
|
29
|
+
path = path.slice(0, -1);
|
|
30
|
+
const query = u.search;
|
|
31
|
+
return `${u.protocol}//${host}${path}${query}`;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return url;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve citations for a packet.
|
|
39
|
+
*
|
|
40
|
+
* Reference integrity: a claim binding to an unknown source id is flagged
|
|
41
|
+
* `dangling` (and downgraded to `unverified`). Dedupe: sources sharing a
|
|
42
|
+
* canonical URL key are collapsed; the newest by `retrievedAt` wins and older
|
|
43
|
+
* revisions with a different content hash are marked `stale`. Conflict: a claim
|
|
44
|
+
* backed by both a `retrieved` source and a `failed`/`blocked` source (or two
|
|
45
|
+
* sources explicitly flagged contradictory) yields a conflict record and is
|
|
46
|
+
* never silently resolved in the model-favorable direction.
|
|
47
|
+
*/
|
|
48
|
+
function resolveCitations(packet) {
|
|
49
|
+
const sourceIds = new Set(packet.sources.map(s => s.id));
|
|
50
|
+
const byId = new Map(packet.sources.map(s => [s.id, s]));
|
|
51
|
+
// --- dedupe same-URL multi-version -> stale ---
|
|
52
|
+
const staleSourceIds = [];
|
|
53
|
+
const groups = new Map();
|
|
54
|
+
for (const s of packet.sources) {
|
|
55
|
+
const key = urlKey(s.canonicalUrl);
|
|
56
|
+
if (!key)
|
|
57
|
+
continue;
|
|
58
|
+
const arr = groups.get(key) ?? [];
|
|
59
|
+
arr.push(s);
|
|
60
|
+
groups.set(key, arr);
|
|
61
|
+
}
|
|
62
|
+
for (const [, group] of groups) {
|
|
63
|
+
if (group.length < 2)
|
|
64
|
+
continue;
|
|
65
|
+
// newest by retrievedAt wins; older ones with a different hash become stale.
|
|
66
|
+
const sorted = [...group].sort((a, b) => b.retrievedAt.localeCompare(a.retrievedAt));
|
|
67
|
+
const winner = sorted[0];
|
|
68
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
69
|
+
const s = sorted[i];
|
|
70
|
+
if (s.contentHash && winner.contentHash && s.contentHash !== winner.contentHash) {
|
|
71
|
+
staleSourceIds.push(s.id);
|
|
72
|
+
s.status = 'stale';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const staleSet = new Set(staleSourceIds);
|
|
77
|
+
const bindings = [];
|
|
78
|
+
const conflicts = [];
|
|
79
|
+
const evidenceCandidates = [];
|
|
80
|
+
for (const claim of packet.claims) {
|
|
81
|
+
const referenced = claim.sourceIds.filter(id => sourceIds.has(id));
|
|
82
|
+
const danglingRefs = claim.sourceIds.filter(id => !sourceIds.has(id));
|
|
83
|
+
const active = referenced.filter(id => !staleSet.has(id));
|
|
84
|
+
const activeSources = active.map(id => byId.get(id)).filter(Boolean);
|
|
85
|
+
const hasRetrieved = activeSources.some(s => s.status === 'retrieved');
|
|
86
|
+
const hasFailed = activeSources.some(s => s.status === 'failed' || s.status === 'blocked');
|
|
87
|
+
let status;
|
|
88
|
+
if (danglingRefs.length > 0 && referenced.length === 0) {
|
|
89
|
+
status = 'dangling';
|
|
90
|
+
}
|
|
91
|
+
else if (hasRetrieved && hasFailed) {
|
|
92
|
+
status = 'conflicted';
|
|
93
|
+
}
|
|
94
|
+
else if (active.length === 0 && referenced.length > 0) {
|
|
95
|
+
status = 'stale_only';
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
status = 'bound';
|
|
99
|
+
}
|
|
100
|
+
if (status === 'conflicted') {
|
|
101
|
+
conflicts.push({
|
|
102
|
+
claimId: claim.id,
|
|
103
|
+
sourceIds: active,
|
|
104
|
+
reason: 'claim backed by both a retrieved source and a failed/blocked source',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
bindings.push({
|
|
108
|
+
claimId: claim.id,
|
|
109
|
+
sourceIds: active,
|
|
110
|
+
referencedSourceIds: referenced,
|
|
111
|
+
status,
|
|
112
|
+
});
|
|
113
|
+
// Verification classification: conflicted -> contradicted.
|
|
114
|
+
const verification = status === 'conflicted'
|
|
115
|
+
? 'contradicted'
|
|
116
|
+
: classifyVerification(claim, hasRetrieved, activeSources);
|
|
117
|
+
claim.verification = verification;
|
|
118
|
+
// Evidence candidate: only rule-compliant claims.
|
|
119
|
+
if ((verification === 'observed' || verification === 'partially_observed') &&
|
|
120
|
+
claim.evidenceKind !== 'inference' &&
|
|
121
|
+
status !== 'conflicted') {
|
|
122
|
+
const primary = activeSources.find(s => s.status === 'retrieved');
|
|
123
|
+
const isFile = primary?.kind === 'file';
|
|
124
|
+
evidenceCandidates.push({
|
|
125
|
+
claimId: claim.id,
|
|
126
|
+
kind: isFile ? 'execution' : 'research',
|
|
127
|
+
basis: isFile ? 'file' : 'external',
|
|
128
|
+
summary: claim.text,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const audit = auditCompletion(packet, bindings);
|
|
133
|
+
return {
|
|
134
|
+
packetId: packet.packetId,
|
|
135
|
+
bindings,
|
|
136
|
+
conflicts,
|
|
137
|
+
staleSourceIds,
|
|
138
|
+
evidenceCandidates,
|
|
139
|
+
audit,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function classifyVerification(claim, hasRetrieved, activeSources) {
|
|
143
|
+
if (claim.evidenceKind === 'inference')
|
|
144
|
+
return 'unverified';
|
|
145
|
+
if (!hasRetrieved)
|
|
146
|
+
return 'unverified';
|
|
147
|
+
const onlyExcerpt = activeSources.every(s => !!s.excerpt && s.excerpt.length < 4000 && !s.contentHash);
|
|
148
|
+
return onlyExcerpt ? 'partially_observed' : 'observed';
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Completion audit. The key invariant (plan exit condition): a claim that HAS
|
|
152
|
+
* sources but no independent verification must keep the audit `partial`/`unmet`
|
|
153
|
+
* - never `met`. We therefore treat any claim with referenced sources whose
|
|
154
|
+
* verification is not `observed` as unverified for audit purposes.
|
|
155
|
+
*/
|
|
156
|
+
function auditCompletion(packet, bindings) {
|
|
157
|
+
const notes = [];
|
|
158
|
+
const unverifiedClaimIds = [];
|
|
159
|
+
for (const claim of packet.claims) {
|
|
160
|
+
const binding = bindings.find(b => b.claimId === claim.id);
|
|
161
|
+
const hasSources = (binding?.referencedSourceIds.length ?? 0) > 0;
|
|
162
|
+
const independentlyVerified = claim.verification === 'observed';
|
|
163
|
+
if (!independentlyVerified) {
|
|
164
|
+
if (hasSources) {
|
|
165
|
+
unverifiedClaimIds.push(claim.id);
|
|
166
|
+
notes.push(`claim ${claim.id} has sources but no independent verification (stays partial)`);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
unverifiedClaimIds.push(claim.id);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
let status;
|
|
174
|
+
if (unverifiedClaimIds.length === 0) {
|
|
175
|
+
status = 'met';
|
|
176
|
+
}
|
|
177
|
+
else if (packet.claims.some(c => (bindings.find(b => b.claimId === c.id)?.referencedSourceIds.length ?? 0) > 0)) {
|
|
178
|
+
status = 'partial';
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
status = 'unmet';
|
|
182
|
+
}
|
|
183
|
+
return { status, unverifiedClaimIds, notes };
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=research-citation.js.map
|