agent-bober 0.18.0 → 0.19.0
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/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +11 -0
- package/README.md +245 -6
- package/agents/bober-art-director.md +100 -0
- package/agents/bober-design-critic.md +114 -0
- package/agents/bober-frontend-builder.md +101 -0
- package/agents/bober-security-auditor.md +193 -0
- package/agents/bober-security-verifier.md +104 -0
- package/agents/bober-seo-strategist.md +144 -0
- package/agents/bober-seo-verifier.md +103 -0
- package/dist/calendar/calendar-egress.d.ts +26 -0
- package/dist/calendar/calendar-egress.d.ts.map +1 -0
- package/dist/calendar/calendar-egress.js +35 -0
- package/dist/calendar/calendar-egress.js.map +1 -0
- package/dist/calendar/calendar-token.d.ts +34 -0
- package/dist/calendar/calendar-token.d.ts.map +1 -0
- package/dist/calendar/calendar-token.js +56 -0
- package/dist/calendar/calendar-token.js.map +1 -0
- package/dist/calendar/connector.d.ts +22 -0
- package/dist/calendar/connector.d.ts.map +1 -0
- package/dist/calendar/connector.js +3 -0
- package/dist/calendar/connector.js.map +1 -0
- package/dist/calendar/finding-source.d.ts +20 -0
- package/dist/calendar/finding-source.d.ts.map +1 -0
- package/dist/calendar/finding-source.js +35 -0
- package/dist/calendar/finding-source.js.map +1 -0
- package/dist/calendar/google-connector.d.ts +65 -0
- package/dist/calendar/google-connector.d.ts.map +1 -0
- package/dist/calendar/google-connector.js +129 -0
- package/dist/calendar/google-connector.js.map +1 -0
- package/dist/calendar/ics-connector.d.ts +12 -0
- package/dist/calendar/ics-connector.d.ts.map +1 -0
- package/dist/calendar/ics-connector.js +48 -0
- package/dist/calendar/ics-connector.js.map +1 -0
- package/dist/calendar/proposal-gate.d.ts +84 -0
- package/dist/calendar/proposal-gate.d.ts.map +1 -0
- package/dist/calendar/proposal-gate.js +126 -0
- package/dist/calendar/proposal-gate.js.map +1 -0
- package/dist/calendar/slotter.d.ts +34 -0
- package/dist/calendar/slotter.d.ts.map +1 -0
- package/dist/calendar/slotter.js +196 -0
- package/dist/calendar/slotter.js.map +1 -0
- package/dist/calendar/types.d.ts +162 -0
- package/dist/calendar/types.d.ts.map +1 -0
- package/dist/calendar/types.js +28 -0
- package/dist/calendar/types.js.map +1 -0
- package/dist/chat/chat-session.d.ts +27 -0
- package/dist/chat/chat-session.d.ts.map +1 -1
- package/dist/chat/chat-session.js +101 -1
- package/dist/chat/chat-session.js.map +1 -1
- package/dist/chat/slash-commands.d.ts +6 -2
- package/dist/chat/slash-commands.d.ts.map +1 -1
- package/dist/chat/slash-commands.js +22 -2
- package/dist/chat/slash-commands.js.map +1 -1
- package/dist/chat/turn-classifier.d.ts +3 -0
- package/dist/chat/turn-classifier.d.ts.map +1 -1
- package/dist/chat/turn-classifier.js +7 -0
- package/dist/chat/turn-classifier.js.map +1 -1
- package/dist/cli/commands/calendar.d.ts +75 -0
- package/dist/cli/commands/calendar.d.ts.map +1 -0
- package/dist/cli/commands/calendar.js +203 -0
- package/dist/cli/commands/calendar.js.map +1 -0
- package/dist/cli/commands/do.d.ts +52 -0
- package/dist/cli/commands/do.d.ts.map +1 -0
- package/dist/cli/commands/do.js +216 -0
- package/dist/cli/commands/do.js.map +1 -0
- package/dist/cli/commands/hub.d.ts +29 -0
- package/dist/cli/commands/hub.d.ts.map +1 -0
- package/dist/cli/commands/hub.js +233 -0
- package/dist/cli/commands/hub.js.map +1 -0
- package/dist/cli/commands/medical.d.ts +25 -0
- package/dist/cli/commands/medical.d.ts.map +1 -1
- package/dist/cli/commands/medical.js +233 -0
- package/dist/cli/commands/medical.js.map +1 -1
- package/dist/cli/commands/research.d.ts +41 -0
- package/dist/cli/commands/research.d.ts.map +1 -0
- package/dist/cli/commands/research.js +313 -0
- package/dist/cli/commands/research.js.map +1 -0
- package/dist/cli/commands/security-audit.d.ts +89 -0
- package/dist/cli/commands/security-audit.d.ts.map +1 -0
- package/dist/cli/commands/security-audit.js +238 -0
- package/dist/cli/commands/security-audit.js.map +1 -0
- package/dist/cli/commands/task.d.ts +64 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +422 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/telegram.d.ts +10 -0
- package/dist/cli/commands/telegram.d.ts.map +1 -0
- package/dist/cli/commands/telegram.js +44 -0
- package/dist/cli/commands/telegram.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +40 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +122 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/role-providers.d.ts +15 -0
- package/dist/config/role-providers.d.ts.map +1 -1
- package/dist/config/role-providers.js +8 -1
- package/dist/config/role-providers.js.map +1 -1
- package/dist/config/schema.d.ts +3522 -171
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +405 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/do-bridge/coding-promoter.d.ts +19 -0
- package/dist/do-bridge/coding-promoter.d.ts.map +1 -0
- package/dist/do-bridge/coding-promoter.js +43 -0
- package/dist/do-bridge/coding-promoter.js.map +1 -0
- package/dist/do-bridge/finding-port.d.ts +88 -0
- package/dist/do-bridge/finding-port.d.ts.map +1 -0
- package/dist/do-bridge/finding-port.js +95 -0
- package/dist/do-bridge/finding-port.js.map +1 -0
- package/dist/do-bridge/launcher.d.ts +55 -0
- package/dist/do-bridge/launcher.d.ts.map +1 -0
- package/dist/do-bridge/launcher.js +37 -0
- package/dist/do-bridge/launcher.js.map +1 -0
- package/dist/do-bridge/promote.d.ts +50 -0
- package/dist/do-bridge/promote.d.ts.map +1 -0
- package/dist/do-bridge/promote.js +116 -0
- package/dist/do-bridge/promote.js.map +1 -0
- package/dist/do-bridge/reconcile.d.ts +50 -0
- package/dist/do-bridge/reconcile.d.ts.map +1 -0
- package/dist/do-bridge/reconcile.js +70 -0
- package/dist/do-bridge/reconcile.js.map +1 -0
- package/dist/do-bridge/registry.d.ts +23 -0
- package/dist/do-bridge/registry.d.ts.map +1 -0
- package/dist/do-bridge/registry.js +42 -0
- package/dist/do-bridge/registry.js.map +1 -0
- package/dist/do-bridge/types.d.ts +50 -0
- package/dist/do-bridge/types.d.ts.map +1 -0
- package/dist/do-bridge/types.js +17 -0
- package/dist/do-bridge/types.js.map +1 -0
- package/dist/fleet/child-config.d.ts.map +1 -1
- package/dist/fleet/child-config.js +7 -0
- package/dist/fleet/child-config.js.map +1 -1
- package/dist/fleet/coordinator.d.ts +27 -1
- package/dist/fleet/coordinator.d.ts.map +1 -1
- package/dist/fleet/coordinator.js +70 -0
- package/dist/fleet/coordinator.js.map +1 -1
- package/dist/fleet/critic-deep.d.ts +9 -1
- package/dist/fleet/critic-deep.d.ts.map +1 -1
- package/dist/fleet/critic-deep.js +5 -2
- package/dist/fleet/critic-deep.js.map +1 -1
- package/dist/fleet/decomposer-deep.d.ts +4 -11
- package/dist/fleet/decomposer-deep.d.ts.map +1 -1
- package/dist/fleet/decomposer-deep.js +5 -5
- package/dist/fleet/decomposer-deep.js.map +1 -1
- package/dist/fleet/index.d.ts +9 -0
- package/dist/fleet/index.d.ts.map +1 -1
- package/dist/fleet/index.js +87 -8
- package/dist/fleet/index.js.map +1 -1
- package/dist/fleet/manifest.d.ts +26 -0
- package/dist/fleet/manifest.d.ts.map +1 -1
- package/dist/fleet/manifest.js +8 -0
- package/dist/fleet/manifest.js.map +1 -1
- package/dist/fleet/reporter.d.ts +4 -1
- package/dist/fleet/reporter.d.ts.map +1 -1
- package/dist/fleet/reporter.js +2 -1
- package/dist/fleet/reporter.js.map +1 -1
- package/dist/fleet/scaffolder.d.ts +5 -1
- package/dist/fleet/scaffolder.d.ts.map +1 -1
- package/dist/fleet/scaffolder.js +11 -2
- package/dist/fleet/scaffolder.js.map +1 -1
- package/dist/graph/client.d.ts.map +1 -1
- package/dist/graph/client.js +115 -23
- package/dist/graph/client.js.map +1 -1
- package/dist/graph/mcp-client.d.ts +1 -0
- package/dist/graph/mcp-client.d.ts.map +1 -1
- package/dist/graph/mcp-client.js +58 -7
- package/dist/graph/mcp-client.js.map +1 -1
- package/dist/hub/collector.d.ts +12 -0
- package/dist/hub/collector.d.ts.map +1 -0
- package/dist/hub/collector.js +36 -0
- package/dist/hub/collector.js.map +1 -0
- package/dist/hub/finding-source.d.ts +22 -0
- package/dist/hub/finding-source.d.ts.map +1 -0
- package/dist/hub/finding-source.js +41 -0
- package/dist/hub/finding-source.js.map +1 -0
- package/dist/hub/finding-store.d.ts +68 -0
- package/dist/hub/finding-store.d.ts.map +1 -0
- package/dist/hub/finding-store.js +122 -0
- package/dist/hub/finding-store.js.map +1 -0
- package/dist/hub/finding.d.ts +54 -0
- package/dist/hub/finding.d.ts.map +1 -0
- package/dist/hub/finding.js +24 -0
- package/dist/hub/finding.js.map +1 -0
- package/dist/hub/gmail-to-task.d.ts +69 -0
- package/dist/hub/gmail-to-task.d.ts.map +1 -0
- package/dist/hub/gmail-to-task.js +102 -0
- package/dist/hub/gmail-to-task.js.map +1 -0
- package/dist/hub/hub-config.d.ts +18 -0
- package/dist/hub/hub-config.d.ts.map +1 -0
- package/dist/hub/hub-config.js +40 -0
- package/dist/hub/hub-config.js.map +1 -0
- package/dist/hub/judge.d.ts +30 -0
- package/dist/hub/judge.d.ts.map +1 -0
- package/dist/hub/judge.js +177 -0
- package/dist/hub/judge.js.map +1 -0
- package/dist/hub/lenses.d.ts +60 -0
- package/dist/hub/lenses.d.ts.map +1 -0
- package/dist/hub/lenses.js +123 -0
- package/dist/hub/lenses.js.map +1 -0
- package/dist/hub/priority-md.d.ts +21 -0
- package/dist/hub/priority-md.d.ts.map +1 -0
- package/dist/hub/priority-md.js +64 -0
- package/dist/hub/priority-md.js.map +1 -0
- package/dist/hub/repo-resolver.d.ts +11 -0
- package/dist/hub/repo-resolver.d.ts.map +1 -0
- package/dist/hub/repo-resolver.js +39 -0
- package/dist/hub/repo-resolver.js.map +1 -0
- package/dist/hub/scope.d.ts +39 -0
- package/dist/hub/scope.d.ts.map +1 -0
- package/dist/hub/scope.js +62 -0
- package/dist/hub/scope.js.map +1 -0
- package/dist/hub/task-inbox.d.ts +16 -0
- package/dist/hub/task-inbox.d.ts.map +1 -0
- package/dist/hub/task-inbox.js +39 -0
- package/dist/hub/task-inbox.js.map +1 -0
- package/dist/incident/resolution-verify.d.ts +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/medical/adapters/apple-health.js +1 -1
- package/dist/medical/adapters/apple-health.js.map +1 -1
- package/dist/medical/analysis/cadence.d.ts +32 -0
- package/dist/medical/analysis/cadence.d.ts.map +1 -0
- package/dist/medical/analysis/cadence.js +72 -0
- package/dist/medical/analysis/cadence.js.map +1 -0
- package/dist/medical/analysis/cross-marker.d.ts +33 -0
- package/dist/medical/analysis/cross-marker.d.ts.map +1 -0
- package/dist/medical/analysis/cross-marker.js +79 -0
- package/dist/medical/analysis/cross-marker.js.map +1 -0
- package/dist/medical/analysis/finding-writer.d.ts +26 -0
- package/dist/medical/analysis/finding-writer.d.ts.map +1 -0
- package/dist/medical/analysis/finding-writer.js +60 -0
- package/dist/medical/analysis/finding-writer.js.map +1 -0
- package/dist/medical/analysis/finding.d.ts +63 -0
- package/dist/medical/analysis/finding.d.ts.map +1 -0
- package/dist/medical/analysis/finding.js +70 -0
- package/dist/medical/analysis/finding.js.map +1 -0
- package/dist/medical/analysis/review-pass.d.ts +76 -0
- package/dist/medical/analysis/review-pass.d.ts.map +1 -0
- package/dist/medical/analysis/review-pass.js +119 -0
- package/dist/medical/analysis/review-pass.js.map +1 -0
- package/dist/medical/analysis/trends.d.ts +36 -0
- package/dist/medical/analysis/trends.d.ts.map +1 -0
- package/dist/medical/analysis/trends.js +157 -0
- package/dist/medical/analysis/trends.js.map +1 -0
- package/dist/medical/health-store.d.ts +5 -0
- package/dist/medical/health-store.d.ts.map +1 -1
- package/dist/medical/health-store.js +10 -0
- package/dist/medical/health-store.js.map +1 -1
- package/dist/medical/lab-note.d.ts +72 -0
- package/dist/medical/lab-note.d.ts.map +1 -0
- package/dist/medical/lab-note.js +161 -0
- package/dist/medical/lab-note.js.map +1 -0
- package/dist/medical/lab-pdf-parser.d.ts +19 -0
- package/dist/medical/lab-pdf-parser.d.ts.map +1 -0
- package/dist/medical/lab-pdf-parser.js +57 -0
- package/dist/medical/lab-pdf-parser.js.map +1 -0
- package/dist/medical/lab-reindex.d.ts +24 -0
- package/dist/medical/lab-reindex.d.ts.map +1 -0
- package/dist/medical/lab-reindex.js +45 -0
- package/dist/medical/lab-reindex.js.map +1 -0
- package/dist/medical/lab-types.d.ts +75 -0
- package/dist/medical/lab-types.d.ts.map +1 -0
- package/dist/medical/lab-types.js +17 -0
- package/dist/medical/lab-types.js.map +1 -0
- package/dist/medical/profile.d.ts +96 -0
- package/dist/medical/profile.d.ts.map +1 -0
- package/dist/medical/profile.js +273 -0
- package/dist/medical/profile.js.map +1 -0
- package/dist/medical/recommend/context.d.ts +48 -0
- package/dist/medical/recommend/context.d.ts.map +1 -0
- package/dist/medical/recommend/context.js +109 -0
- package/dist/medical/recommend/context.js.map +1 -0
- package/dist/medical/recommend/judge-panel.d.ts +49 -0
- package/dist/medical/recommend/judge-panel.d.ts.map +1 -0
- package/dist/medical/recommend/judge-panel.js +164 -0
- package/dist/medical/recommend/judge-panel.js.map +1 -0
- package/dist/medical/recommend/lenses.d.ts +72 -0
- package/dist/medical/recommend/lenses.d.ts.map +1 -0
- package/dist/medical/recommend/lenses.js +220 -0
- package/dist/medical/recommend/lenses.js.map +1 -0
- package/dist/medical/recommend/recommend.d.ts +86 -0
- package/dist/medical/recommend/recommend.d.ts.map +1 -0
- package/dist/medical/recommend/recommend.js +211 -0
- package/dist/medical/recommend/recommend.js.map +1 -0
- package/dist/medical/recommend/types.d.ts +98 -0
- package/dist/medical/recommend/types.d.ts.map +1 -0
- package/dist/medical/recommend/types.js +20 -0
- package/dist/medical/recommend/types.js.map +1 -0
- package/dist/medical/recommend/urgency.d.ts +26 -0
- package/dist/medical/recommend/urgency.d.ts.map +1 -0
- package/dist/medical/recommend/urgency.js +124 -0
- package/dist/medical/recommend/urgency.js.map +1 -0
- package/dist/medical/research/online-research.d.ts +65 -0
- package/dist/medical/research/online-research.d.ts.map +1 -0
- package/dist/medical/research/online-research.js +101 -0
- package/dist/medical/research/online-research.js.map +1 -0
- package/dist/medical/research/research-note.d.ts +32 -0
- package/dist/medical/research/research-note.d.ts.map +1 -0
- package/dist/medical/research/research-note.js +55 -0
- package/dist/medical/research/research-note.js.map +1 -0
- package/dist/medical/supplements.d.ts +82 -0
- package/dist/medical/supplements.d.ts.map +1 -0
- package/dist/medical/supplements.js +173 -0
- package/dist/medical/supplements.js.map +1 -0
- package/dist/orchestrator/agentic-loop.d.ts +160 -1
- package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
- package/dist/orchestrator/agentic-loop.js +350 -41
- package/dist/orchestrator/agentic-loop.js.map +1 -1
- package/dist/orchestrator/compaction.d.ts +47 -0
- package/dist/orchestrator/compaction.d.ts.map +1 -0
- package/dist/orchestrator/compaction.js +75 -0
- package/dist/orchestrator/compaction.js.map +1 -0
- package/dist/orchestrator/generator-agent.d.ts +19 -0
- package/dist/orchestrator/generator-agent.d.ts.map +1 -1
- package/dist/orchestrator/generator-agent.js +27 -1
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/loop-events.d.ts +98 -0
- package/dist/orchestrator/loop-events.d.ts.map +1 -0
- package/dist/orchestrator/loop-events.js +2 -0
- package/dist/orchestrator/loop-events.js.map +1 -0
- package/dist/orchestrator/model-resolver.d.ts.map +1 -1
- package/dist/orchestrator/model-resolver.js +10 -6
- package/dist/orchestrator/model-resolver.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +10 -1
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +102 -4
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/security-audit-types.d.ts +53 -0
- package/dist/orchestrator/security-audit-types.d.ts.map +1 -0
- package/dist/orchestrator/security-audit-types.js +10 -0
- package/dist/orchestrator/security-audit-types.js.map +1 -0
- package/dist/orchestrator/security-auditor-agent.d.ts +68 -0
- package/dist/orchestrator/security-auditor-agent.d.ts.map +1 -0
- package/dist/orchestrator/security-auditor-agent.js +482 -0
- package/dist/orchestrator/security-auditor-agent.js.map +1 -0
- package/dist/orchestrator/security-gate.d.ts +73 -0
- package/dist/orchestrator/security-gate.d.ts.map +1 -0
- package/dist/orchestrator/security-gate.js +174 -0
- package/dist/orchestrator/security-gate.js.map +1 -0
- package/dist/orchestrator/security-hub.d.ts +45 -0
- package/dist/orchestrator/security-hub.d.ts.map +1 -0
- package/dist/orchestrator/security-hub.js +147 -0
- package/dist/orchestrator/security-hub.js.map +1 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts +43 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.js +13 -0
- package/dist/orchestrator/security-knowledge/benchmark/harness.js.map +1 -0
- package/dist/orchestrator/security-knowledge/diff-provider.d.ts +79 -0
- package/dist/orchestrator/security-knowledge/diff-provider.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/diff-provider.js +320 -0
- package/dist/orchestrator/security-knowledge/diff-provider.js.map +1 -0
- package/dist/orchestrator/security-knowledge/index.d.ts +22 -0
- package/dist/orchestrator/security-knowledge/index.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/index.js +66 -0
- package/dist/orchestrator/security-knowledge/index.js.map +1 -0
- package/dist/orchestrator/security-knowledge/parser.d.ts +9 -0
- package/dist/orchestrator/security-knowledge/parser.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/parser.js +137 -0
- package/dist/orchestrator/security-knowledge/parser.js.map +1 -0
- package/dist/orchestrator/security-knowledge/registry.d.ts +25 -0
- package/dist/orchestrator/security-knowledge/registry.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/registry.js +114 -0
- package/dist/orchestrator/security-knowledge/registry.js.map +1 -0
- package/dist/orchestrator/security-knowledge/resolver.d.ts +48 -0
- package/dist/orchestrator/security-knowledge/resolver.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/resolver.js +63 -0
- package/dist/orchestrator/security-knowledge/resolver.js.map +1 -0
- package/dist/orchestrator/security-knowledge/selector.d.ts +18 -0
- package/dist/orchestrator/security-knowledge/selector.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/selector.js +46 -0
- package/dist/orchestrator/security-knowledge/selector.js.map +1 -0
- package/dist/orchestrator/security-knowledge/signature.d.ts +37 -0
- package/dist/orchestrator/security-knowledge/signature.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/signature.js +2 -0
- package/dist/orchestrator/security-knowledge/signature.js.map +1 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts +29 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts.map +1 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.js +211 -0
- package/dist/orchestrator/security-knowledge/supply-chain-inspector.js.map +1 -0
- package/dist/orchestrator/security-scanners.d.ts +126 -0
- package/dist/orchestrator/security-scanners.d.ts.map +1 -0
- package/dist/orchestrator/security-scanners.js +501 -0
- package/dist/orchestrator/security-scanners.js.map +1 -0
- package/dist/orchestrator/security-verifier-agent.d.ts +62 -0
- package/dist/orchestrator/security-verifier-agent.d.ts.map +1 -0
- package/dist/orchestrator/security-verifier-agent.js +230 -0
- package/dist/orchestrator/security-verifier-agent.js.map +1 -0
- package/dist/orchestrator/session-store.d.ts +95 -0
- package/dist/orchestrator/session-store.d.ts.map +1 -0
- package/dist/orchestrator/session-store.js +186 -0
- package/dist/orchestrator/session-store.js.map +1 -0
- package/dist/orchestrator/stack-knowledge.d.ts +17 -0
- package/dist/orchestrator/stack-knowledge.d.ts.map +1 -0
- package/dist/orchestrator/stack-knowledge.js +35 -0
- package/dist/orchestrator/stack-knowledge.js.map +1 -0
- package/dist/orchestrator/subagents.d.ts +62 -0
- package/dist/orchestrator/subagents.d.ts.map +1 -0
- package/dist/orchestrator/subagents.js +143 -0
- package/dist/orchestrator/subagents.js.map +1 -0
- package/dist/orchestrator/tools/executor.d.ts +68 -0
- package/dist/orchestrator/tools/executor.d.ts.map +1 -0
- package/dist/orchestrator/tools/executor.js +104 -0
- package/dist/orchestrator/tools/executor.js.map +1 -0
- package/dist/orchestrator/tools/mcp-bridge.d.ts +76 -0
- package/dist/orchestrator/tools/mcp-bridge.d.ts.map +1 -0
- package/dist/orchestrator/tools/mcp-bridge.js +154 -0
- package/dist/orchestrator/tools/mcp-bridge.js.map +1 -0
- package/dist/orchestrator/tools/schemas.d.ts.map +1 -1
- package/dist/orchestrator/tools/schemas.js +3 -0
- package/dist/orchestrator/tools/schemas.js.map +1 -1
- package/dist/orchestrator/workflow/budget.d.ts +24 -2
- package/dist/orchestrator/workflow/budget.d.ts.map +1 -1
- package/dist/orchestrator/workflow/budget.js +39 -1
- package/dist/orchestrator/workflow/budget.js.map +1 -1
- package/dist/orchestrator/workflow/engine.d.ts +1 -1
- package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.js +10 -0
- package/dist/orchestrator/workflow/selector.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +116 -26
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/claude-code.d.ts.map +1 -1
- package/dist/providers/claude-code.js +17 -0
- package/dist/providers/claude-code.js.map +1 -1
- package/dist/providers/cost-meter.d.ts +52 -0
- package/dist/providers/cost-meter.d.ts.map +1 -0
- package/dist/providers/cost-meter.js +81 -0
- package/dist/providers/cost-meter.js.map +1 -0
- package/dist/providers/factory.d.ts +6 -1
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +24 -5
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.d.ts.map +1 -1
- package/dist/providers/google.js +29 -0
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/grounded-search.d.ts +128 -0
- package/dist/providers/grounded-search.d.ts.map +1 -0
- package/dist/providers/grounded-search.js +160 -0
- package/dist/providers/grounded-search.js.map +1 -0
- package/dist/providers/openai-compat.d.ts +15 -1
- package/dist/providers/openai-compat.d.ts.map +1 -1
- package/dist/providers/openai-compat.js +24 -0
- package/dist/providers/openai-compat.js.map +1 -1
- package/dist/providers/openai.d.ts +7 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +95 -4
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/types.d.ts +88 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/research/cadence.d.ts +33 -0
- package/dist/research/cadence.d.ts.map +1 -0
- package/dist/research/cadence.js +55 -0
- package/dist/research/cadence.js.map +1 -0
- package/dist/research/digest.d.ts +80 -0
- package/dist/research/digest.d.ts.map +1 -0
- package/dist/research/digest.js +119 -0
- package/dist/research/digest.js.map +1 -0
- package/dist/research/egress.d.ts +28 -0
- package/dist/research/egress.d.ts.map +1 -0
- package/dist/research/egress.js +41 -0
- package/dist/research/egress.js.map +1 -0
- package/dist/research/job-store.d.ts +30 -0
- package/dist/research/job-store.d.ts.map +1 -0
- package/dist/research/job-store.js +100 -0
- package/dist/research/job-store.js.map +1 -0
- package/dist/research/model-diversity.d.ts +27 -0
- package/dist/research/model-diversity.d.ts.map +1 -0
- package/dist/research/model-diversity.js +52 -0
- package/dist/research/model-diversity.js.map +1 -0
- package/dist/research/note-writer.d.ts +36 -0
- package/dist/research/note-writer.d.ts.map +1 -0
- package/dist/research/note-writer.js +53 -0
- package/dist/research/note-writer.js.map +1 -0
- package/dist/research/online-retrieval.d.ts +27 -0
- package/dist/research/online-retrieval.d.ts.map +1 -0
- package/dist/research/online-retrieval.js +22 -0
- package/dist/research/online-retrieval.js.map +1 -0
- package/dist/research/runner.d.ts +80 -0
- package/dist/research/runner.d.ts.map +1 -0
- package/dist/research/runner.js +115 -0
- package/dist/research/runner.js.map +1 -0
- package/dist/research/scheduler.d.ts +61 -0
- package/dist/research/scheduler.d.ts.map +1 -0
- package/dist/research/scheduler.js +58 -0
- package/dist/research/scheduler.js.map +1 -0
- package/dist/research/types.d.ts +81 -0
- package/dist/research/types.d.ts.map +1 -0
- package/dist/research/types.js +57 -0
- package/dist/research/types.js.map +1 -0
- package/dist/seo/adapters/http.d.ts +43 -0
- package/dist/seo/adapters/http.d.ts.map +1 -0
- package/dist/seo/adapters/http.js +35 -0
- package/dist/seo/adapters/http.js.map +1 -0
- package/dist/seo/ai-visibility-provider.d.ts +171 -0
- package/dist/seo/ai-visibility-provider.d.ts.map +1 -0
- package/dist/seo/ai-visibility-provider.js +165 -0
- package/dist/seo/ai-visibility-provider.js.map +1 -0
- package/dist/seo/ai-visibility-scorer.d.ts +43 -0
- package/dist/seo/ai-visibility-scorer.d.ts.map +1 -0
- package/dist/seo/ai-visibility-scorer.js +102 -0
- package/dist/seo/ai-visibility-scorer.js.map +1 -0
- package/dist/seo/analyzer.d.ts +58 -0
- package/dist/seo/analyzer.d.ts.map +1 -0
- package/dist/seo/analyzer.js +265 -0
- package/dist/seo/analyzer.js.map +1 -0
- package/dist/seo/benchmark/harness.d.ts +56 -0
- package/dist/seo/benchmark/harness.d.ts.map +1 -0
- package/dist/seo/benchmark/harness.js +172 -0
- package/dist/seo/benchmark/harness.js.map +1 -0
- package/dist/seo/builder/approved-finding.d.ts +115 -0
- package/dist/seo/builder/approved-finding.d.ts.map +1 -0
- package/dist/seo/builder/approved-finding.js +145 -0
- package/dist/seo/builder/approved-finding.js.map +1 -0
- package/dist/seo/builder/build-runner.d.ts +41 -0
- package/dist/seo/builder/build-runner.d.ts.map +1 -0
- package/dist/seo/builder/build-runner.js +156 -0
- package/dist/seo/builder/build-runner.js.map +1 -0
- package/dist/seo/builder/draft-generators.d.ts +32 -0
- package/dist/seo/builder/draft-generators.d.ts.map +1 -0
- package/dist/seo/builder/draft-generators.js +31 -0
- package/dist/seo/builder/draft-generators.js.map +1 -0
- package/dist/seo/builder/draft-store.d.ts +30 -0
- package/dist/seo/builder/draft-store.d.ts.map +1 -0
- package/dist/seo/builder/draft-store.js +76 -0
- package/dist/seo/builder/draft-store.js.map +1 -0
- package/dist/seo/builder/draft-types.d.ts +36 -0
- package/dist/seo/builder/draft-types.d.ts.map +1 -0
- package/dist/seo/builder/draft-types.js +14 -0
- package/dist/seo/builder/draft-types.js.map +1 -0
- package/dist/seo/builder/hub-approved-source.d.ts +11 -0
- package/dist/seo/builder/hub-approved-source.d.ts.map +1 -0
- package/dist/seo/builder/hub-approved-source.js +48 -0
- package/dist/seo/builder/hub-approved-source.js.map +1 -0
- package/dist/seo/builder/seo-builder.d.ts +72 -0
- package/dist/seo/builder/seo-builder.d.ts.map +1 -0
- package/dist/seo/builder/seo-builder.js +72 -0
- package/dist/seo/builder/seo-builder.js.map +1 -0
- package/dist/seo/citation-gate.d.ts +36 -0
- package/dist/seo/citation-gate.d.ts.map +1 -0
- package/dist/seo/citation-gate.js +59 -0
- package/dist/seo/citation-gate.js.map +1 -0
- package/dist/seo/command.d.ts +11 -0
- package/dist/seo/command.d.ts.map +1 -0
- package/dist/seo/command.js +90 -0
- package/dist/seo/command.js.map +1 -0
- package/dist/seo/content-sanitizer.d.ts +56 -0
- package/dist/seo/content-sanitizer.d.ts.map +1 -0
- package/dist/seo/content-sanitizer.js +55 -0
- package/dist/seo/content-sanitizer.js.map +1 -0
- package/dist/seo/crawl-engine.d.ts +35 -0
- package/dist/seo/crawl-engine.d.ts.map +1 -0
- package/dist/seo/crawl-engine.js +2 -0
- package/dist/seo/crawl-engine.js.map +1 -0
- package/dist/seo/data-source.d.ts +156 -0
- package/dist/seo/data-source.d.ts.map +1 -0
- package/dist/seo/data-source.js +2 -0
- package/dist/seo/data-source.js.map +1 -0
- package/dist/seo/egress.d.ts +39 -0
- package/dist/seo/egress.d.ts.map +1 -0
- package/dist/seo/egress.js +64 -0
- package/dist/seo/egress.js.map +1 -0
- package/dist/seo/hub-emitter.d.ts +28 -0
- package/dist/seo/hub-emitter.d.ts.map +1 -0
- package/dist/seo/hub-emitter.js +95 -0
- package/dist/seo/hub-emitter.js.map +1 -0
- package/dist/seo/index.d.ts +42 -0
- package/dist/seo/index.d.ts.map +1 -0
- package/dist/seo/index.js +19 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/never-encode-filter.d.ts +45 -0
- package/dist/seo/never-encode-filter.d.ts.map +1 -0
- package/dist/seo/never-encode-filter.js +51 -0
- package/dist/seo/never-encode-filter.js.map +1 -0
- package/dist/seo/parser.d.ts +46 -0
- package/dist/seo/parser.d.ts.map +1 -0
- package/dist/seo/parser.js +113 -0
- package/dist/seo/parser.js.map +1 -0
- package/dist/seo/playbook-index.d.ts +19 -0
- package/dist/seo/playbook-index.d.ts.map +1 -0
- package/dist/seo/playbook-index.js +74 -0
- package/dist/seo/playbook-index.js.map +1 -0
- package/dist/seo/quota-governor.d.ts +100 -0
- package/dist/seo/quota-governor.d.ts.map +1 -0
- package/dist/seo/quota-governor.js +199 -0
- package/dist/seo/quota-governor.js.map +1 -0
- package/dist/seo/quota-ledger.d.ts +50 -0
- package/dist/seo/quota-ledger.d.ts.map +1 -0
- package/dist/seo/quota-ledger.js +95 -0
- package/dist/seo/quota-ledger.js.map +1 -0
- package/dist/seo/report-store.d.ts +30 -0
- package/dist/seo/report-store.d.ts.map +1 -0
- package/dist/seo/report-store.js +94 -0
- package/dist/seo/report-store.js.map +1 -0
- package/dist/seo/retriever.d.ts +34 -0
- package/dist/seo/retriever.d.ts.map +1 -0
- package/dist/seo/retriever.js +95 -0
- package/dist/seo/retriever.js.map +1 -0
- package/dist/seo/runner.d.ts +108 -0
- package/dist/seo/runner.d.ts.map +1 -0
- package/dist/seo/runner.js +512 -0
- package/dist/seo/runner.js.map +1 -0
- package/dist/seo/scrape-throttle.d.ts +84 -0
- package/dist/seo/scrape-throttle.d.ts.map +1 -0
- package/dist/seo/scrape-throttle.js +149 -0
- package/dist/seo/scrape-throttle.js.map +1 -0
- package/dist/seo/serp-provider.d.ts +52 -0
- package/dist/seo/serp-provider.d.ts.map +1 -0
- package/dist/seo/serp-provider.js +17 -0
- package/dist/seo/serp-provider.js.map +1 -0
- package/dist/seo/sources/ai-visibility-adapter.d.ts +87 -0
- package/dist/seo/sources/ai-visibility-adapter.d.ts.map +1 -0
- package/dist/seo/sources/ai-visibility-adapter.js +85 -0
- package/dist/seo/sources/ai-visibility-adapter.js.map +1 -0
- package/dist/seo/sources/api-spine-provider.d.ts +66 -0
- package/dist/seo/sources/api-spine-provider.d.ts.map +1 -0
- package/dist/seo/sources/api-spine-provider.js +68 -0
- package/dist/seo/sources/api-spine-provider.js.map +1 -0
- package/dist/seo/sources/citation-verifier.d.ts +95 -0
- package/dist/seo/sources/citation-verifier.d.ts.map +1 -0
- package/dist/seo/sources/citation-verifier.js +106 -0
- package/dist/seo/sources/citation-verifier.js.map +1 -0
- package/dist/seo/sources/crawl-source.d.ts +62 -0
- package/dist/seo/sources/crawl-source.d.ts.map +1 -0
- package/dist/seo/sources/crawl-source.js +87 -0
- package/dist/seo/sources/crawl-source.js.map +1 -0
- package/dist/seo/sources/damcrawler-crawl-engine.d.ts +151 -0
- package/dist/seo/sources/damcrawler-crawl-engine.d.ts.map +1 -0
- package/dist/seo/sources/damcrawler-crawl-engine.js +154 -0
- package/dist/seo/sources/damcrawler-crawl-engine.js.map +1 -0
- package/dist/seo/sources/damcrawler-serp-provider.d.ts +75 -0
- package/dist/seo/sources/damcrawler-serp-provider.d.ts.map +1 -0
- package/dist/seo/sources/damcrawler-serp-provider.js +60 -0
- package/dist/seo/sources/damcrawler-serp-provider.js.map +1 -0
- package/dist/seo/sources/dataforseo-adapter.d.ts +46 -0
- package/dist/seo/sources/dataforseo-adapter.d.ts.map +1 -0
- package/dist/seo/sources/dataforseo-adapter.js +335 -0
- package/dist/seo/sources/dataforseo-adapter.js.map +1 -0
- package/dist/seo/sources/dataforseo-serp-provider.d.ts +30 -0
- package/dist/seo/sources/dataforseo-serp-provider.d.ts.map +1 -0
- package/dist/seo/sources/dataforseo-serp-provider.js +20 -0
- package/dist/seo/sources/dataforseo-serp-provider.js.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts +62 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.js +72 -0
- package/dist/seo/sources/engine-scrape-parser-chatgpt.js.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts +10 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts.map +1 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.js +72 -0
- package/dist/seo/sources/engine-scrape-parser-perplexity.js.map +1 -0
- package/dist/seo/sources/gsc-adapter.d.ts +64 -0
- package/dist/seo/sources/gsc-adapter.d.ts.map +1 -0
- package/dist/seo/sources/gsc-adapter.js +221 -0
- package/dist/seo/sources/gsc-adapter.js.map +1 -0
- package/dist/seo/sources/local-export.d.ts +53 -0
- package/dist/seo/sources/local-export.d.ts.map +1 -0
- package/dist/seo/sources/local-export.js +307 -0
- package/dist/seo/sources/local-export.js.map +1 -0
- package/dist/seo/sources/mention-citation-extractor.d.ts +136 -0
- package/dist/seo/sources/mention-citation-extractor.d.ts.map +1 -0
- package/dist/seo/sources/mention-citation-extractor.js +272 -0
- package/dist/seo/sources/mention-citation-extractor.js.map +1 -0
- package/dist/seo/sources/scrape-arm-provider.d.ts +109 -0
- package/dist/seo/sources/scrape-arm-provider.d.ts.map +1 -0
- package/dist/seo/sources/scrape-arm-provider.js +129 -0
- package/dist/seo/sources/scrape-arm-provider.js.map +1 -0
- package/dist/seo/tracked-prompt-store.d.ts +33 -0
- package/dist/seo/tracked-prompt-store.d.ts.map +1 -0
- package/dist/seo/tracked-prompt-store.js +68 -0
- package/dist/seo/tracked-prompt-store.js.map +1 -0
- package/dist/seo/types.d.ts +128 -0
- package/dist/seo/types.d.ts.map +1 -0
- package/dist/seo/types.js +14 -0
- package/dist/seo/types.js.map +1 -0
- package/dist/seo/verifier.d.ts +34 -0
- package/dist/seo/verifier.d.ts.map +1 -0
- package/dist/seo/verifier.js +204 -0
- package/dist/seo/verifier.js.map +1 -0
- package/dist/seo/workflow-capabilities.d.ts +26 -0
- package/dist/seo/workflow-capabilities.d.ts.map +1 -0
- package/dist/seo/workflow-capabilities.js +12 -0
- package/dist/seo/workflow-capabilities.js.map +1 -0
- package/dist/state/facts.d.ts +5 -1
- package/dist/state/facts.d.ts.map +1 -1
- package/dist/state/facts.js +29 -19
- package/dist/state/facts.js.map +1 -1
- package/dist/state/index.d.ts +1 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +1 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/outline-state.d.ts +0 -12
- package/dist/state/outline-state.d.ts.map +1 -1
- package/dist/state/outline-state.js +1 -18
- package/dist/state/outline-state.js.map +1 -1
- package/dist/state/security-audit-state.d.ts +20 -0
- package/dist/state/security-audit-state.d.ts.map +1 -0
- package/dist/state/security-audit-state.js +59 -0
- package/dist/state/security-audit-state.js.map +1 -0
- package/dist/teams/registry.d.ts.map +1 -1
- package/dist/teams/registry.js +17 -0
- package/dist/teams/registry.js.map +1 -1
- package/dist/telegram/bot.d.ts +137 -0
- package/dist/telegram/bot.d.ts.map +1 -0
- package/dist/telegram/bot.js +323 -0
- package/dist/telegram/bot.js.map +1 -0
- package/dist/telegram/digest.d.ts +19 -0
- package/dist/telegram/digest.d.ts.map +1 -0
- package/dist/telegram/digest.js +23 -0
- package/dist/telegram/digest.js.map +1 -0
- package/dist/telegram/fleet-view.d.ts +38 -0
- package/dist/telegram/fleet-view.d.ts.map +1 -0
- package/dist/telegram/fleet-view.js +98 -0
- package/dist/telegram/fleet-view.js.map +1 -0
- package/dist/telegram/handlers/approvals.d.ts +61 -0
- package/dist/telegram/handlers/approvals.d.ts.map +1 -0
- package/dist/telegram/handlers/approvals.js +122 -0
- package/dist/telegram/handlers/approvals.js.map +1 -0
- package/dist/telegram/handlers/capture.d.ts +43 -0
- package/dist/telegram/handlers/capture.d.ts.map +1 -0
- package/dist/telegram/handlers/capture.js +51 -0
- package/dist/telegram/handlers/capture.js.map +1 -0
- package/dist/telegram/handlers/prioritize.d.ts +50 -0
- package/dist/telegram/handlers/prioritize.d.ts.map +1 -0
- package/dist/telegram/handlers/prioritize.js +99 -0
- package/dist/telegram/handlers/prioritize.js.map +1 -0
- package/dist/telegram/handlers/upload.d.ts +105 -0
- package/dist/telegram/handlers/upload.d.ts.map +1 -0
- package/dist/telegram/handlers/upload.js +149 -0
- package/dist/telegram/handlers/upload.js.map +1 -0
- package/dist/telegram/keyboard.d.ts +48 -0
- package/dist/telegram/keyboard.d.ts.map +1 -0
- package/dist/telegram/keyboard.js +81 -0
- package/dist/telegram/keyboard.js.map +1 -0
- package/dist/telegram/outbound.d.ts +77 -0
- package/dist/telegram/outbound.d.ts.map +1 -0
- package/dist/telegram/outbound.js +45 -0
- package/dist/telegram/outbound.js.map +1 -0
- package/dist/telegram/router.d.ts +46 -0
- package/dist/telegram/router.d.ts.map +1 -0
- package/dist/telegram/router.js +63 -0
- package/dist/telegram/router.js.map +1 -0
- package/dist/telegram/streaming.d.ts +36 -0
- package/dist/telegram/streaming.d.ts.map +1 -0
- package/dist/telegram/streaming.js +55 -0
- package/dist/telegram/streaming.js.map +1 -0
- package/dist/telegram/whitelist.d.ts +20 -0
- package/dist/telegram/whitelist.d.ts.map +1 -0
- package/dist/telegram/whitelist.js +34 -0
- package/dist/telegram/whitelist.js.map +1 -0
- package/dist/utils/git.d.ts +0 -6
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +0 -19
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/vault/conventions.d.ts +23 -0
- package/dist/vault/conventions.d.ts.map +1 -0
- package/dist/vault/conventions.js +22 -0
- package/dist/vault/conventions.js.map +1 -0
- package/dist/vault/frontmatter.d.ts +47 -0
- package/dist/vault/frontmatter.d.ts.map +1 -0
- package/dist/vault/frontmatter.js +149 -0
- package/dist/vault/frontmatter.js.map +1 -0
- package/dist/vault/index-map.d.ts +35 -0
- package/dist/vault/index-map.d.ts.map +1 -0
- package/dist/vault/index-map.js +67 -0
- package/dist/vault/index-map.js.map +1 -0
- package/dist/vault/mcp-adapter.d.ts +96 -0
- package/dist/vault/mcp-adapter.d.ts.map +1 -0
- package/dist/vault/mcp-adapter.js +176 -0
- package/dist/vault/mcp-adapter.js.map +1 -0
- package/dist/vault/note-io.d.ts +29 -0
- package/dist/vault/note-io.d.ts.map +1 -0
- package/dist/vault/note-io.js +44 -0
- package/dist/vault/note-io.js.map +1 -0
- package/dist/vault/profile.d.ts +35 -0
- package/dist/vault/profile.d.ts.map +1 -0
- package/dist/vault/profile.js +50 -0
- package/dist/vault/profile.js.map +1 -0
- package/dist/vault/reindex.d.ts +55 -0
- package/dist/vault/reindex.d.ts.map +1 -0
- package/dist/vault/reindex.js +69 -0
- package/dist/vault/reindex.js.map +1 -0
- package/dist/vault/types.d.ts +25 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +9 -0
- package/dist/vault/types.js.map +1 -0
- package/package.json +20 -4
- package/scripts/sync-targets.json +2 -1
- package/skills/bober.design/SKILL.md +190 -0
- package/skills/bober.design/references/1-anti-slop.md +102 -0
- package/skills/bober.design/references/2-design-brief.md +84 -0
- package/skills/bober.design/references/3-critique-rubric.md +62 -0
- package/skills/bober.design/references/4-copy-guide.md +43 -0
- package/skills/bober.plan/SKILL.md +15 -1
- package/skills/bober.run/SKILL.md +7 -4
- package/skills/bober.security-anchor/SKILL.md +172 -0
- package/skills/bober.security-audit/SKILL.md +288 -0
- package/skills/bober.security-dex-backend/SKILL.md +306 -0
- package/skills/bober.security-generic/SKILL.md +295 -0
- package/skills/bober.security-igaming/SKILL.md +290 -0
- package/skills/bober.security-node/SKILL.md +267 -0
- package/skills/bober.security-payments/SKILL.md +249 -0
- package/skills/bober.security-react/SKILL.md +194 -0
- package/skills/bober.security-solidity/SKILL.md +306 -0
- package/skills/bober.seo/SKILL.md +132 -0
- package/skills/bober.seo-ai-visibility/SKILL.md +110 -0
- package/skills/bober.seo-content-decay/SKILL.md +99 -0
- package/skills/bober.seo-generic/SKILL.md +173 -0
- package/skills/bober.seo-internal-linking/SKILL.md +87 -0
- package/skills/bober.seo-parasite-watch/SKILL.md +121 -0
- package/skills/bober.seo-rank-track/SKILL.md +98 -0
- package/skills/bober.seo-schema-audit/SKILL.md +97 -0
- package/skills/bober.seo-technical-audit/SKILL.md +113 -0
- package/skills/bober.seo-topical-map/SKILL.md +100 -0
- package/skills/bober.seo-verticals/SKILL.md +133 -0
- package/skills/bober.using-bober/SKILL.md +1 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generateRecommendation — recommendation generation end-to-end.
|
|
3
|
+
*
|
|
4
|
+
* Wires the sprint-2 judge loop into a real recommendation path:
|
|
5
|
+
* 1. Assemble profile context from FactStore + medical profile
|
|
6
|
+
* 2. Build four per-lens LLM clients (tier-diverse when cloud ON, all local when cloud OFF)
|
|
7
|
+
* 3. Generate a candidate + gate through runJudgeLoop
|
|
8
|
+
* 4. Emit a Finding:
|
|
9
|
+
* - accepted → kind="action" (LLM-assigned urgency/severity/confidence, NO refer-out hedging)
|
|
10
|
+
* - rejected → kind="question" flagged for review (per-lens dissent)
|
|
11
|
+
* - short-circuit/refuse → canned escalation, NO finding
|
|
12
|
+
* 5. Append AuditLog entry (IDs/enums only — NonGoal #3)
|
|
13
|
+
*
|
|
14
|
+
* engine.ts is NO-TOUCH: patterns are COPIED (not imported) from engine.ts:250-410.
|
|
15
|
+
* runJudgeLoop is IMPORTED — do NOT re-implement (NonGoal #5).
|
|
16
|
+
*
|
|
17
|
+
* sc-3-5 (fail-closed model selection): when egress.isAllowed("cloud-inference") is FALSE,
|
|
18
|
+
* EVERY client (all four lenses + the generator) resolves via buildMedicalInferenceClient.
|
|
19
|
+
* deps.clientFactory is threaded through both paths so tests can spy without network.
|
|
20
|
+
*/
|
|
21
|
+
import type { BoberConfig } from "../../config/schema.js";
|
|
22
|
+
import type { LLMClient } from "../../providers/types.js";
|
|
23
|
+
import { EgressGuard } from "../egress.js";
|
|
24
|
+
import type { GuardrailSet } from "../types.js";
|
|
25
|
+
import type { ClientFactory } from "../inference.js";
|
|
26
|
+
import { AuditLog } from "../audit.js";
|
|
27
|
+
import type { FactStore } from "../../state/facts.js";
|
|
28
|
+
import type { ProfileCipher } from "../profile.js";
|
|
29
|
+
import { writeFinding } from "../analysis/finding-writer.js";
|
|
30
|
+
import type { LensClients } from "./types.js";
|
|
31
|
+
import type { UrgencyResult } from "./urgency.js";
|
|
32
|
+
/** Discriminated outcome of generateRecommendation. */
|
|
33
|
+
export type RecommendOutcomeKind = "accepted" | "question" | "escalated" | "refused";
|
|
34
|
+
export interface RecommendOutcome {
|
|
35
|
+
kind: RecommendOutcomeKind;
|
|
36
|
+
/** Absolute path to the written Finding note (accepted + question paths). */
|
|
37
|
+
findingPath?: string;
|
|
38
|
+
/** Canned escalation response (escalated path). */
|
|
39
|
+
cannedResponse?: string;
|
|
40
|
+
/** Refusal reason (refused path). */
|
|
41
|
+
reason?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Injectable dependencies for generateRecommendation.
|
|
45
|
+
* Production callers pass no deps. Tests inject everything to avoid real network/fs.
|
|
46
|
+
*/
|
|
47
|
+
export interface RecommendDeps {
|
|
48
|
+
/** Pre-built lens clients (tests inject fake ScriptedClients). */
|
|
49
|
+
lensClients?: LensClients;
|
|
50
|
+
/** Override the candidate generator (tests inject a deterministic fn). */
|
|
51
|
+
generateCandidate?: (prevFeedback?: string) => Promise<string>;
|
|
52
|
+
/** Override the guardrail set (tests inject shortCircuitGuard / allowGuard). */
|
|
53
|
+
redFlag?: GuardrailSet;
|
|
54
|
+
/** Override the urgency assigner (tests inject a fn returning fixed values). */
|
|
55
|
+
assignUrgency?: (llm: LLMClient, model: string, candidate: string, context: string) => Promise<UrgencyResult>;
|
|
56
|
+
/** Override writeFinding (tests inject a fn that writes to a temp vault). */
|
|
57
|
+
writeFindingFn?: typeof writeFinding;
|
|
58
|
+
/** Injected FactStore (tests pass :memory:; caller owns lifecycle). */
|
|
59
|
+
facts?: FactStore;
|
|
60
|
+
/** Override the EgressGuard (tests inject a fixed allow/deny guard). */
|
|
61
|
+
egress?: EgressGuard;
|
|
62
|
+
/**
|
|
63
|
+
* Injectable ClientFactory for cloud-OFF spy test (sc-3-5).
|
|
64
|
+
* Threaded into BOTH buildMedicalInferenceClient AND the tier createClient calls
|
|
65
|
+
* so tests can assert no cloud provider was constructed.
|
|
66
|
+
*/
|
|
67
|
+
clientFactory?: ClientFactory;
|
|
68
|
+
/** Override the AuditLog (tests inject a no-op or in-memory log). */
|
|
69
|
+
auditLog?: AuditLog;
|
|
70
|
+
/** Override ProfileCipher (tests inject a reversible fake). */
|
|
71
|
+
profileCipher?: ProfileCipher;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Run the recommendation pipeline end-to-end.
|
|
75
|
+
*
|
|
76
|
+
* @param projectRoot Absolute project root path
|
|
77
|
+
* @param config Loaded BoberConfig
|
|
78
|
+
* @param opts { question, goal?, now } — clock is read ONLY at the CLI boundary
|
|
79
|
+
* @param deps Optional injectable dependencies for tests
|
|
80
|
+
*/
|
|
81
|
+
export declare function generateRecommendation(projectRoot: string, config: BoberConfig, opts: {
|
|
82
|
+
question: string;
|
|
83
|
+
goal?: string;
|
|
84
|
+
now: string;
|
|
85
|
+
}, deps?: RecommendDeps): Promise<RecommendOutcome>;
|
|
86
|
+
//# sourceMappingURL=recommend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../../src/medical/recommend/recommend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,uDAAuD;AACvD,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;AAErF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,gFAAgF;IAChF,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,gFAAgF;IAChF,aAAa,CAAC,EAAE,CACd,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5B,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,YAAY,CAAC;IACrC,uEAAuE;IACvE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,wEAAwE;IACxE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAID;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACtD,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAoO3B"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generateRecommendation — recommendation generation end-to-end.
|
|
3
|
+
*
|
|
4
|
+
* Wires the sprint-2 judge loop into a real recommendation path:
|
|
5
|
+
* 1. Assemble profile context from FactStore + medical profile
|
|
6
|
+
* 2. Build four per-lens LLM clients (tier-diverse when cloud ON, all local when cloud OFF)
|
|
7
|
+
* 3. Generate a candidate + gate through runJudgeLoop
|
|
8
|
+
* 4. Emit a Finding:
|
|
9
|
+
* - accepted → kind="action" (LLM-assigned urgency/severity/confidence, NO refer-out hedging)
|
|
10
|
+
* - rejected → kind="question" flagged for review (per-lens dissent)
|
|
11
|
+
* - short-circuit/refuse → canned escalation, NO finding
|
|
12
|
+
* 5. Append AuditLog entry (IDs/enums only — NonGoal #3)
|
|
13
|
+
*
|
|
14
|
+
* engine.ts is NO-TOUCH: patterns are COPIED (not imported) from engine.ts:250-410.
|
|
15
|
+
* runJudgeLoop is IMPORTED — do NOT re-implement (NonGoal #5).
|
|
16
|
+
*
|
|
17
|
+
* sc-3-5 (fail-closed model selection): when egress.isAllowed("cloud-inference") is FALSE,
|
|
18
|
+
* EVERY client (all four lenses + the generator) resolves via buildMedicalInferenceClient.
|
|
19
|
+
* deps.clientFactory is threaded through both paths so tests can spy without network.
|
|
20
|
+
*/
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
import { EgressGuard } from "../egress.js";
|
|
23
|
+
import { MedicalGuardrails } from "../guardrails.js";
|
|
24
|
+
import { buildMedicalInferenceClient } from "../inference.js";
|
|
25
|
+
import { createClient } from "../../providers/factory.js";
|
|
26
|
+
import { tierPolicy } from "../../fleet/tier-policy.js";
|
|
27
|
+
import { AuditLog } from "../audit.js";
|
|
28
|
+
import { findingId } from "../analysis/finding.js";
|
|
29
|
+
import { writeFinding } from "../analysis/finding-writer.js";
|
|
30
|
+
import { runJudgeLoop } from "./judge-panel.js";
|
|
31
|
+
import { assembleRecommendationContext, contextToString } from "./context.js";
|
|
32
|
+
import { assignUrgencySeverity } from "./urgency.js";
|
|
33
|
+
// -- generateRecommendation ----------------------------------------------
|
|
34
|
+
/**
|
|
35
|
+
* Run the recommendation pipeline end-to-end.
|
|
36
|
+
*
|
|
37
|
+
* @param projectRoot Absolute project root path
|
|
38
|
+
* @param config Loaded BoberConfig
|
|
39
|
+
* @param opts { question, goal?, now } — clock is read ONLY at the CLI boundary
|
|
40
|
+
* @param deps Optional injectable dependencies for tests
|
|
41
|
+
*/
|
|
42
|
+
export async function generateRecommendation(projectRoot, config, opts, deps = {}) {
|
|
43
|
+
const { question, goal, now } = opts;
|
|
44
|
+
// 1. Egress guard + factory
|
|
45
|
+
const egress = deps.egress ?? EgressGuard.fromConfig(config);
|
|
46
|
+
const factory = deps.clientFactory ?? createClient;
|
|
47
|
+
// 2. Vault dir for findings (mirrors review-pass.ts:51-52)
|
|
48
|
+
const vaultDir = config.medical?.vaultDir ?? join(projectRoot, ".bober", "medical", "vault");
|
|
49
|
+
// 3. Audit log
|
|
50
|
+
const auditLog = deps.auditLog ?? new AuditLog(projectRoot);
|
|
51
|
+
// 4. Red-flag guard
|
|
52
|
+
const redFlag = deps.redFlag ?? new MedicalGuardrails();
|
|
53
|
+
// 5. Build four lens clients + generator client
|
|
54
|
+
// CRITICAL (sc-3-5): gate the ENTIRE tier branch behind isAllowed("cloud-inference").
|
|
55
|
+
// When cloud is OFF, ALL four lenses + the generator resolve via buildMedicalInferenceClient
|
|
56
|
+
// using the injected factory so tests can spy.
|
|
57
|
+
let lensClients;
|
|
58
|
+
let generatorSpec;
|
|
59
|
+
if (deps.lensClients !== undefined) {
|
|
60
|
+
// Test-injected lens clients; build a local generator unless generateCandidate is also injected
|
|
61
|
+
lensClients = deps.lensClients;
|
|
62
|
+
generatorSpec = buildMedicalInferenceClient(config, egress, factory);
|
|
63
|
+
}
|
|
64
|
+
else if (egress.isAllowed("cloud-inference")) {
|
|
65
|
+
// Cloud ON: use tier diversity (briefing §E)
|
|
66
|
+
// evidenceGrader → cheap (deepseek)
|
|
67
|
+
// contraindicationChecker → standard (grok)
|
|
68
|
+
// conservativeClinician → hard (sonnet)
|
|
69
|
+
// optimizationLens → frontier (opus)
|
|
70
|
+
// generator → hard (sonnet)
|
|
71
|
+
const cheapBlock = tierPolicy.resolveTier("cheap").generator; // openai-compat deepseek
|
|
72
|
+
const standardBlock = tierPolicy.resolveTier("standard").generator; // openai-compat grok
|
|
73
|
+
const hardBlock = tierPolicy.resolveTier("hard").generator; // anthropic sonnet
|
|
74
|
+
const frontierBlock = tierPolicy.resolveTier("frontier").generator; // anthropic opus
|
|
75
|
+
lensClients = {
|
|
76
|
+
evidenceGrader: {
|
|
77
|
+
client: factory(cheapBlock.provider, cheapBlock.endpoint ?? undefined, undefined, cheapBlock.model),
|
|
78
|
+
model: cheapBlock.model,
|
|
79
|
+
},
|
|
80
|
+
contraindicationChecker: {
|
|
81
|
+
client: factory(standardBlock.provider, standardBlock.endpoint ?? undefined, undefined, standardBlock.model),
|
|
82
|
+
model: standardBlock.model,
|
|
83
|
+
},
|
|
84
|
+
conservativeClinician: {
|
|
85
|
+
client: factory(hardBlock.provider, hardBlock.endpoint ?? undefined, undefined, hardBlock.model),
|
|
86
|
+
model: hardBlock.model,
|
|
87
|
+
},
|
|
88
|
+
optimizationLens: {
|
|
89
|
+
client: factory(frontierBlock.provider, frontierBlock.endpoint ?? undefined, undefined, frontierBlock.model),
|
|
90
|
+
model: frontierBlock.model,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
generatorSpec = {
|
|
94
|
+
client: factory(hardBlock.provider, hardBlock.endpoint ?? undefined, undefined, hardBlock.model),
|
|
95
|
+
model: hardBlock.model,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// Cloud OFF: ALL four lenses + generator resolve via buildMedicalInferenceClient (fail-closed)
|
|
100
|
+
// bober: all local when cloud-inference off; swap for per-lens routing if cloud is opt-in.
|
|
101
|
+
const localSpec = buildMedicalInferenceClient(config, egress, factory);
|
|
102
|
+
lensClients = {
|
|
103
|
+
evidenceGrader: localSpec,
|
|
104
|
+
contraindicationChecker: localSpec,
|
|
105
|
+
conservativeClinician: localSpec,
|
|
106
|
+
optimizationLens: localSpec,
|
|
107
|
+
};
|
|
108
|
+
generatorSpec = localSpec;
|
|
109
|
+
}
|
|
110
|
+
// 6. Assemble profile context
|
|
111
|
+
const ctx = await assembleRecommendationContext(projectRoot, config, { goal }, { facts: deps.facts, profileCipher: deps.profileCipher });
|
|
112
|
+
// runJudgeLoop.context is a STRING — must be serialized (judge-panel.ts:92)
|
|
113
|
+
const contextString = contextToString(ctx);
|
|
114
|
+
// 7. Build generateCandidate (or use injected one)
|
|
115
|
+
const generateCandidate = deps.generateCandidate ??
|
|
116
|
+
(async (prevFeedback) => {
|
|
117
|
+
const systemPrompt = `You are a medical advisor. Given a patient question and their profile context, ` +
|
|
118
|
+
`provide a clear and specific recommendation. Be direct and actionable.` +
|
|
119
|
+
(prevFeedback !== undefined ? `\n\nPanel feedback to incorporate:\n${prevFeedback}` : "");
|
|
120
|
+
const response = await generatorSpec.client.chat({
|
|
121
|
+
model: generatorSpec.model,
|
|
122
|
+
system: systemPrompt,
|
|
123
|
+
messages: [{ role: "user", content: `Question: ${question}\n\nContext:\n${contextString}` }],
|
|
124
|
+
});
|
|
125
|
+
return response.text;
|
|
126
|
+
});
|
|
127
|
+
// 8. Run judge loop (IMPORT — do NOT re-implement)
|
|
128
|
+
const panelOutcome = await runJudgeLoop({
|
|
129
|
+
question,
|
|
130
|
+
generateCandidate,
|
|
131
|
+
lensClients,
|
|
132
|
+
context: contextString,
|
|
133
|
+
redFlag,
|
|
134
|
+
now,
|
|
135
|
+
});
|
|
136
|
+
// 9. Handle outcome — switch on outcome.outcome (types.ts:84-133)
|
|
137
|
+
if (panelOutcome.outcome === "short-circuit") {
|
|
138
|
+
// Red-flag matched: canned escalation, NO finding, short-circuit audit entry
|
|
139
|
+
// Pattern from engine.ts:250-289 (copied, not imported)
|
|
140
|
+
await auditLog.append({
|
|
141
|
+
tIso: now,
|
|
142
|
+
event: "short-circuit",
|
|
143
|
+
ruleId: panelOutcome.rule,
|
|
144
|
+
rulesetVersion: redFlag.rulesetVersion,
|
|
145
|
+
});
|
|
146
|
+
return { kind: "escalated", cannedResponse: panelOutcome.cannedResponse };
|
|
147
|
+
}
|
|
148
|
+
if (panelOutcome.outcome === "refuse") {
|
|
149
|
+
// Content-policy refusal: NO finding
|
|
150
|
+
await auditLog.append({
|
|
151
|
+
tIso: now,
|
|
152
|
+
event: "refuse",
|
|
153
|
+
ruleId: panelOutcome.rule,
|
|
154
|
+
rulesetVersion: redFlag.rulesetVersion,
|
|
155
|
+
});
|
|
156
|
+
return { kind: "refused", reason: panelOutcome.reason };
|
|
157
|
+
}
|
|
158
|
+
if (panelOutcome.outcome === "accepted") {
|
|
159
|
+
// Accepted: assign urgency/severity, write kind="action" Finding
|
|
160
|
+
const urgencyFn = deps.assignUrgency ?? assignUrgencySeverity;
|
|
161
|
+
const { urgency, severity, confidence } = await urgencyFn(generatorSpec.client, generatorSpec.model, panelOutcome.recommendation, contextString);
|
|
162
|
+
// id is deterministic — re-runs with the same question overwrite the same file (sc-1-4 pattern)
|
|
163
|
+
const id = findingId("medical", question, "recommend-action");
|
|
164
|
+
const finding = {
|
|
165
|
+
id,
|
|
166
|
+
domain: "medical",
|
|
167
|
+
// sc-3-2: title states the recommendation DIRECTLY — NO refer-out hedging
|
|
168
|
+
title: panelOutcome.recommendation.slice(0, 120).trimEnd(),
|
|
169
|
+
kind: "action",
|
|
170
|
+
urgency,
|
|
171
|
+
severity,
|
|
172
|
+
// evidence contains the full recommendation text (direct; no hedging added)
|
|
173
|
+
evidence: [panelOutcome.recommendation],
|
|
174
|
+
surfacedAt: now,
|
|
175
|
+
// sc-3-6: confidence recorded in tags (confidence:X.XX)
|
|
176
|
+
tags: [`confidence:${confidence.toFixed(2)}`],
|
|
177
|
+
status: "open",
|
|
178
|
+
};
|
|
179
|
+
const writeFindingFn = deps.writeFindingFn ?? writeFinding;
|
|
180
|
+
const findingPath = await writeFindingFn(vaultDir, finding);
|
|
181
|
+
// IDs/enums only (NonGoal #3) — no recommendation text, no health values
|
|
182
|
+
await auditLog.append({ tIso: now, event: "answer" });
|
|
183
|
+
return { kind: "accepted", findingPath };
|
|
184
|
+
}
|
|
185
|
+
// outcome === "rejected" (no-consensus or contraindication-veto)
|
|
186
|
+
// Write kind="question" Finding with per-lens dissent; NO kind="action" finding (sc-3-3)
|
|
187
|
+
const dissentLines = Object.entries(panelOutcome.dissent)
|
|
188
|
+
.filter(([, text]) => text.length > 0)
|
|
189
|
+
.map(([lens, text]) => `[${lens}] ${text}`);
|
|
190
|
+
const id = findingId("medical", question, "recommend-question");
|
|
191
|
+
const finding = {
|
|
192
|
+
id,
|
|
193
|
+
domain: "medical",
|
|
194
|
+
// sc-3-3: title must contain "flagged for your review" (lowercase per contract criterion)
|
|
195
|
+
title: `flagged for your review — panel disagreed on: ${question.slice(0, 80).trimEnd()}`,
|
|
196
|
+
kind: "question",
|
|
197
|
+
urgency: 2,
|
|
198
|
+
severity: 2,
|
|
199
|
+
// evidence = per-lens dissent strings (sc-3-3)
|
|
200
|
+
evidence: dissentLines.length > 0 ? dissentLines : ["Panel could not reach consensus"],
|
|
201
|
+
surfacedAt: now,
|
|
202
|
+
tags: ["no-consensus"],
|
|
203
|
+
status: "open",
|
|
204
|
+
};
|
|
205
|
+
const writeFindingFn = deps.writeFindingFn ?? writeFinding;
|
|
206
|
+
const findingPath = await writeFindingFn(vaultDir, finding);
|
|
207
|
+
// IDs/enums only — no recommendation text, no health values
|
|
208
|
+
await auditLog.append({ tIso: now, event: "abstain" });
|
|
209
|
+
return { kind: "question", findingPath };
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=recommend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../../src/medical/recommend/recommend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommendation judge-panel shared types.
|
|
3
|
+
*
|
|
4
|
+
* PURE orchestration over injected fns — NO fs / NO network / NO real provider / NO FactStore.
|
|
5
|
+
* All execution logic lives in lenses.ts and judge-panel.ts.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMClient } from "../../providers/types.js";
|
|
8
|
+
/** Number of parse-retry attempts per lens call (mirrors GROUNDING_PARSE_MAX_RETRIES). */
|
|
9
|
+
export declare const LENS_PARSE_MAX_RETRIES = 1;
|
|
10
|
+
/** Total LLM calls per lens per round: 1 initial + parse retries (mirrors GROUNDING_MAX_LLM_CALLS). */
|
|
11
|
+
export declare const LENS_MAX_LLM_CALLS: number;
|
|
12
|
+
/** Default maximum judge rounds before fail-closed (research §4a:192). */
|
|
13
|
+
export declare const MEDICAL_PANEL_MAX_ROUNDS = 3;
|
|
14
|
+
/**
|
|
15
|
+
* Worst-case LLM call budget for the full judge loop.
|
|
16
|
+
* Per round = 1 generateCandidate + 4 lenses × LENS_MAX_LLM_CALLS.
|
|
17
|
+
* Total = MEDICAL_PANEL_MAX_ROUNDS × (1 + 4 × LENS_MAX_LLM_CALLS) = 3 × 9 = 27.
|
|
18
|
+
*/
|
|
19
|
+
export declare const MEDICAL_PANEL_MAX_TOTAL_CALLS: number;
|
|
20
|
+
/**
|
|
21
|
+
* Four lens names (research §4a:186-191).
|
|
22
|
+
* Only contraindication-checker may carry a veto.
|
|
23
|
+
*/
|
|
24
|
+
export type LensName = "evidence-grader" | "contraindication-checker" | "conservative-clinician" | "optimization-lens";
|
|
25
|
+
/**
|
|
26
|
+
* Verdict returned by each lens.
|
|
27
|
+
* Only the contraindication-checker populates veto; other lenses always have veto===false.
|
|
28
|
+
*/
|
|
29
|
+
export interface LensVerdict {
|
|
30
|
+
verdict: "approve" | "reject";
|
|
31
|
+
feedback: string;
|
|
32
|
+
/** True only when contraindication-checker finds an absolute contraindication. */
|
|
33
|
+
veto?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** An injected LLM client + model identifier for a single lens. */
|
|
36
|
+
export interface LensSpec {
|
|
37
|
+
client: LLMClient;
|
|
38
|
+
model: string;
|
|
39
|
+
}
|
|
40
|
+
/** One LensSpec per lens — each may use a different model (sprint 3 wires tier-policy). */
|
|
41
|
+
export interface LensClients {
|
|
42
|
+
evidenceGrader: LensSpec;
|
|
43
|
+
contraindicationChecker: LensSpec;
|
|
44
|
+
conservativeClinician: LensSpec;
|
|
45
|
+
optimizationLens: LensSpec;
|
|
46
|
+
}
|
|
47
|
+
/** Internal reconciliation outcome; not exported as part of the public API. */
|
|
48
|
+
export interface PanelDecision {
|
|
49
|
+
accepted: boolean;
|
|
50
|
+
/** Present only when accepted is false. */
|
|
51
|
+
reason?: "contraindication-veto" | "no-consensus";
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Accepted recommendation: all four lenses approved (strict majority) and no veto was present.
|
|
55
|
+
*/
|
|
56
|
+
export interface AcceptedOutcome {
|
|
57
|
+
outcome: "accepted";
|
|
58
|
+
accepted: true;
|
|
59
|
+
/** The raw candidate returned by generateCandidate — NOT a Finding (sprint 3 emits Findings). */
|
|
60
|
+
recommendation: string;
|
|
61
|
+
/** Per-lens verdict map for the winning round. */
|
|
62
|
+
verdicts: Record<LensName, LensVerdict>;
|
|
63
|
+
/** Round number in which consensus was reached (1-indexed). */
|
|
64
|
+
rounds: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Rejected after maxRounds — no consensus was reached.
|
|
68
|
+
*/
|
|
69
|
+
export interface RejectedOutcome {
|
|
70
|
+
outcome: "rejected";
|
|
71
|
+
accepted: false;
|
|
72
|
+
reason: "contraindication-veto" | "no-consensus";
|
|
73
|
+
/** Per-lens feedback strings collected on the final round. */
|
|
74
|
+
dissent: Record<LensName, string>;
|
|
75
|
+
/** Per-lens verdict map from the final round. */
|
|
76
|
+
verdicts: Record<LensName, LensVerdict>;
|
|
77
|
+
/** Number of rounds executed before giving up. */
|
|
78
|
+
rounds: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Guard short-circuited the loop — red-flag matched, emergency escalation required.
|
|
82
|
+
*/
|
|
83
|
+
export interface ShortCircuitOutcome {
|
|
84
|
+
outcome: "short-circuit";
|
|
85
|
+
rule: string;
|
|
86
|
+
cannedResponse: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Guard refused the request — policy-based refusal (not an emergency).
|
|
90
|
+
*/
|
|
91
|
+
export interface RefuseOutcome {
|
|
92
|
+
outcome: "refuse";
|
|
93
|
+
rule: string;
|
|
94
|
+
reason: string;
|
|
95
|
+
}
|
|
96
|
+
/** Discriminated union of all possible outcomes from runJudgeLoop. */
|
|
97
|
+
export type PanelOutcome = AcceptedOutcome | RejectedOutcome | ShortCircuitOutcome | RefuseOutcome;
|
|
98
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/medical/recommend/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAI1D,0FAA0F;AAC1F,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,uGAAuG;AACvG,eAAO,MAAM,kBAAkB,QAA6B,CAAC;AAE7D,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,QACe,CAAC;AAI1D;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAChB,iBAAiB,GACjB,0BAA0B,GAC1B,wBAAwB,GACxB,mBAAmB,CAAC;AAIxB;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAID,mEAAmE;AACnE,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2FAA2F;AAC3F,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,QAAQ,CAAC;IACzB,uBAAuB,EAAE,QAAQ,CAAC;IAClC,qBAAqB,EAAE,QAAQ,CAAC;IAChC,gBAAgB,EAAE,QAAQ,CAAC;CAC5B;AAID,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,uBAAuB,GAAG,cAAc,CAAC;CACnD;AAID;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,IAAI,CAAC;IACf,iGAAiG;IACjG,cAAc,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACxC,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,uBAAuB,GAAG,cAAc,CAAC;IACjD,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACxC,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,eAAe,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sEAAsE;AACtE,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,eAAe,GACf,mBAAmB,GACnB,aAAa,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommendation judge-panel shared types.
|
|
3
|
+
*
|
|
4
|
+
* PURE orchestration over injected fns — NO fs / NO network / NO real provider / NO FactStore.
|
|
5
|
+
* All execution logic lives in lenses.ts and judge-panel.ts.
|
|
6
|
+
*/
|
|
7
|
+
// ── Budget constants ──────────────────────────────────────────────────
|
|
8
|
+
/** Number of parse-retry attempts per lens call (mirrors GROUNDING_PARSE_MAX_RETRIES). */
|
|
9
|
+
export const LENS_PARSE_MAX_RETRIES = 1;
|
|
10
|
+
/** Total LLM calls per lens per round: 1 initial + parse retries (mirrors GROUNDING_MAX_LLM_CALLS). */
|
|
11
|
+
export const LENS_MAX_LLM_CALLS = 1 + LENS_PARSE_MAX_RETRIES; // = 2
|
|
12
|
+
/** Default maximum judge rounds before fail-closed (research §4a:192). */
|
|
13
|
+
export const MEDICAL_PANEL_MAX_ROUNDS = 3;
|
|
14
|
+
/**
|
|
15
|
+
* Worst-case LLM call budget for the full judge loop.
|
|
16
|
+
* Per round = 1 generateCandidate + 4 lenses × LENS_MAX_LLM_CALLS.
|
|
17
|
+
* Total = MEDICAL_PANEL_MAX_ROUNDS × (1 + 4 × LENS_MAX_LLM_CALLS) = 3 × 9 = 27.
|
|
18
|
+
*/
|
|
19
|
+
export const MEDICAL_PANEL_MAX_TOTAL_CALLS = MEDICAL_PANEL_MAX_ROUNDS * (1 + 4 * LENS_MAX_LLM_CALLS); // = 27
|
|
20
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/medical/recommend/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,yEAAyE;AAEzE,0FAA0F;AAC1F,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC,uGAAuG;AACvG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,sBAAsB,CAAC,CAAC,MAAM;AAEpE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,6BAA6B,GACxC,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,OAAO"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Urgency/severity/confidence assigner — one bounded LLM call with a NEVER-throwing validator.
|
|
3
|
+
*
|
|
4
|
+
* PURE: NO fs / NO FactStore / NO network beyond the injected LLMClient.
|
|
5
|
+
* All timestamps are injected; wall clock is read ONLY at the CLI boundary.
|
|
6
|
+
*
|
|
7
|
+
* By design OUTSIDE the ADR-3 deterministic-numerics boundary:
|
|
8
|
+
* urgency/severity/confidence are INTERPRETATION, not arithmetic (contract assumption 3).
|
|
9
|
+
*
|
|
10
|
+
* Most similar: src/medical/recommend/lenses.ts:65-113 (validateLensVerdict pattern).
|
|
11
|
+
*/
|
|
12
|
+
import type { LLMClient } from "../../providers/types.js";
|
|
13
|
+
export interface UrgencyResult {
|
|
14
|
+
/** Urgency level 1..5 (5 = most urgent). */
|
|
15
|
+
urgency: number;
|
|
16
|
+
/** Severity level 1..5 (5 = most severe). */
|
|
17
|
+
severity: number;
|
|
18
|
+
/** Confidence in the assessment (0..1). */
|
|
19
|
+
confidence: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Assign urgency, severity, and confidence via ONE bounded LLM call.
|
|
23
|
+
* NEVER throws — returns DEFAULT_URGENCY on any error or parse failure.
|
|
24
|
+
*/
|
|
25
|
+
export declare function assignUrgencySeverity(llm: LLMClient, model: string, candidate: string, context: string): Promise<UrgencyResult>;
|
|
26
|
+
//# sourceMappingURL=urgency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urgency.d.ts","sourceRoot":"","sources":["../../../src/medical/recommend/urgency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAgB1D,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;CACpB;AAwFD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CAqBxB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Urgency/severity/confidence assigner — one bounded LLM call with a NEVER-throwing validator.
|
|
3
|
+
*
|
|
4
|
+
* PURE: NO fs / NO FactStore / NO network beyond the injected LLMClient.
|
|
5
|
+
* All timestamps are injected; wall clock is read ONLY at the CLI boundary.
|
|
6
|
+
*
|
|
7
|
+
* By design OUTSIDE the ADR-3 deterministic-numerics boundary:
|
|
8
|
+
* urgency/severity/confidence are INTERPRETATION, not arithmetic (contract assumption 3).
|
|
9
|
+
*
|
|
10
|
+
* Most similar: src/medical/recommend/lenses.ts:65-113 (validateLensVerdict pattern).
|
|
11
|
+
*/
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
// -- Schema --------------------------------------------------------------
|
|
14
|
+
/**
|
|
15
|
+
* Raw schema for the urgency response.
|
|
16
|
+
* Values are parsed as raw numbers; clamping is applied after validation.
|
|
17
|
+
*/
|
|
18
|
+
const UrgencyResponseSchema = z.object({
|
|
19
|
+
urgency: z.number(),
|
|
20
|
+
severity: z.number(),
|
|
21
|
+
confidence: z.number(),
|
|
22
|
+
});
|
|
23
|
+
// -- Conservative defaults -----------------------------------------------
|
|
24
|
+
/**
|
|
25
|
+
* Conservative default returned on parse failure — never throws.
|
|
26
|
+
* Represents moderate urgency/severity; confidence reflects uncertainty.
|
|
27
|
+
*/
|
|
28
|
+
const DEFAULT_URGENCY = { urgency: 3, severity: 3, confidence: 0.5 };
|
|
29
|
+
// -- Clamp helper --------------------------------------------------------
|
|
30
|
+
/** Clamp a number to the integer range [1, 5]. */
|
|
31
|
+
function clampInt(n) {
|
|
32
|
+
return Math.min(5, Math.max(1, Math.round(n)));
|
|
33
|
+
}
|
|
34
|
+
// -- validateUrgencyResponse (NEVER throws) ------------------------------
|
|
35
|
+
/**
|
|
36
|
+
* Four-tier JSON extraction strategy — mirrors validateLensVerdict (lenses.ts:65-113).
|
|
37
|
+
* Returns null on any failure so the caller can fall back to DEFAULT_URGENCY.
|
|
38
|
+
*/
|
|
39
|
+
function validateUrgencyResponse(rawText) {
|
|
40
|
+
let parsed;
|
|
41
|
+
// Tier 1: direct parse
|
|
42
|
+
try {
|
|
43
|
+
parsed = JSON.parse(rawText.trim());
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Tier 2: fenced JSON block
|
|
47
|
+
const fenceMatch = /```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/.exec(rawText);
|
|
48
|
+
if (fenceMatch) {
|
|
49
|
+
try {
|
|
50
|
+
parsed = JSON.parse(fenceMatch[1].trim());
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Fall through to tier 3
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Tier 3: first { ... } block
|
|
57
|
+
if (!parsed) {
|
|
58
|
+
const braceStart = rawText.indexOf("{");
|
|
59
|
+
const braceEnd = rawText.lastIndexOf("}");
|
|
60
|
+
if (braceStart !== -1 && braceEnd > braceStart) {
|
|
61
|
+
try {
|
|
62
|
+
parsed = JSON.parse(rawText.slice(braceStart, braceEnd + 1));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Tier 4: fail
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const result = UrgencyResponseSchema.safeParse(parsed);
|
|
75
|
+
if (!result.success) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
urgency: clampInt(result.data.urgency),
|
|
80
|
+
severity: clampInt(result.data.severity),
|
|
81
|
+
confidence: result.data.confidence,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// -- System prompt -------------------------------------------------------
|
|
85
|
+
const URGENCY_SYSTEM_PROMPT = `You are a medical urgency assessor. Given a candidate recommendation and patient context, assess the urgency, severity, and your confidence in the assessment.
|
|
86
|
+
|
|
87
|
+
Output ONLY a JSON object with EXACTLY this shape:
|
|
88
|
+
{
|
|
89
|
+
"urgency": <integer 1..5>,
|
|
90
|
+
"severity": <integer 1..5>,
|
|
91
|
+
"confidence": <float 0..1>
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
Rules:
|
|
95
|
+
- urgency: how soon action is needed (1=routine/months, 5=immediate/today)
|
|
96
|
+
- severity: impact on health if not addressed (1=minimal, 5=critical)
|
|
97
|
+
- confidence: your confidence in this assessment (0=uncertain, 1=certain)
|
|
98
|
+
- Output the JSON object and nothing else.`;
|
|
99
|
+
// -- assignUrgencySeverity -----------------------------------------------
|
|
100
|
+
/**
|
|
101
|
+
* Assign urgency, severity, and confidence via ONE bounded LLM call.
|
|
102
|
+
* NEVER throws — returns DEFAULT_URGENCY on any error or parse failure.
|
|
103
|
+
*/
|
|
104
|
+
export async function assignUrgencySeverity(llm, model, candidate, context) {
|
|
105
|
+
const userContent = `Candidate recommendation:\n${candidate}\n\nPatient context:\n${context}`;
|
|
106
|
+
let rawText;
|
|
107
|
+
try {
|
|
108
|
+
const response = await llm.chat({
|
|
109
|
+
model,
|
|
110
|
+
system: URGENCY_SYSTEM_PROMPT,
|
|
111
|
+
messages: [{ role: "user", content: userContent }],
|
|
112
|
+
jsonObjectMode: true,
|
|
113
|
+
});
|
|
114
|
+
rawText = response.text;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Transport failure — conservative default
|
|
118
|
+
return DEFAULT_URGENCY;
|
|
119
|
+
}
|
|
120
|
+
const result = validateUrgencyResponse(rawText);
|
|
121
|
+
// bober: fall back to DEFAULT_URGENCY on parse failure; intentional conservative default.
|
|
122
|
+
return result ?? DEFAULT_URGENCY;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=urgency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urgency.js","sourceRoot":"","sources":["../../../src/medical/recommend/urgency.ts"],"names":[],"mappings":"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"}
|