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,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research note serializer — PURE markdown note builder for multi-model research runs.
|
|
3
|
+
*
|
|
4
|
+
* PURE / NO fs / NO network / NO Date.now()
|
|
5
|
+
* All timestamps are injected parameters; the wall clock is read ONLY at the CLI boundary.
|
|
6
|
+
*
|
|
7
|
+
* Mirrors src/medical/research/research-note.ts in structure.
|
|
8
|
+
* Uses serializeFrontmatter (scalars + string-arrays ONLY — never pass objects).
|
|
9
|
+
*/
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { serializeFrontmatter } from "../vault/frontmatter.js";
|
|
12
|
+
// ── Path helper ───────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Derive the canonical path for a research note under the vault.
|
|
15
|
+
* Output: <vaultRoot>/research/<YYYY-MM-DD>-<marker>.md
|
|
16
|
+
* Date is sliced from the injected ISO string — never wall-clock.
|
|
17
|
+
*/
|
|
18
|
+
export function researchNotePath(vaultRoot, marker, now) {
|
|
19
|
+
const date = now.slice(0, 10); // YYYY-MM-DD
|
|
20
|
+
return join(vaultRoot, "research", `${date}-${marker}.md`);
|
|
21
|
+
}
|
|
22
|
+
// ── Serializer ────────────────────────────────────────────────────────
|
|
23
|
+
/**
|
|
24
|
+
* Serialize a multi-model research run into a vault note string.
|
|
25
|
+
*
|
|
26
|
+
* Frontmatter fields (all required by sc-2-2):
|
|
27
|
+
* title, jobId, question, models (string[]), generatedAt, domain, type, status
|
|
28
|
+
*
|
|
29
|
+
* Body: per-model contribution sections — records WHICH model label produced each answer.
|
|
30
|
+
*
|
|
31
|
+
* PITFALL: models must be string[] (labels), never RoleProviderBlock[].
|
|
32
|
+
* serializeFrontmatter renders nested objects as "[object Object]".
|
|
33
|
+
*/
|
|
34
|
+
export function serializeResearchNote(job, labels, contributions, now, sources = []) {
|
|
35
|
+
const frontmatter = {
|
|
36
|
+
title: `Research — ${job.question}`,
|
|
37
|
+
jobId: job.id, // sc-2-2 required
|
|
38
|
+
question: job.question, // sc-2-2 required
|
|
39
|
+
models: labels, // sc-2-2 required — array of strings (safe for serializeFrontmatter)
|
|
40
|
+
generatedAt: now, // sc-2-2 required — injected ISO, never wall-clock
|
|
41
|
+
domain: job.domain ?? "research",
|
|
42
|
+
type: "research",
|
|
43
|
+
status: "open",
|
|
44
|
+
// Sprint 3: spread sources only when non-empty (string[] URLs; never objects — see pitfall above)
|
|
45
|
+
...(sources.length > 0 ? { sources } : {}),
|
|
46
|
+
};
|
|
47
|
+
const contributionsSections = contributions
|
|
48
|
+
.map((c) => `### ${c.label}\n\n${c.text}`)
|
|
49
|
+
.join("\n\n");
|
|
50
|
+
const body = `\n## ${job.question}\n\n${contributionsSections}\n`;
|
|
51
|
+
return serializeFrontmatter(frontmatter, body);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=note-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note-writer.js","sourceRoot":"","sources":["../../src/research/note-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,yEAAyE;AAEzE;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,MAAc,EAAE,GAAW;IAC7E,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;IAC5C,OAAO,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,IAAI,MAAM,KAAK,CAAC,CAAC;AAC7D,CAAC;AAYD,yEAAyE;AAEzE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAgB,EAChB,MAAgB,EAChB,aAAkC,EAClC,GAAW,EACX,UAAoB,EAAE;IAEtB,MAAM,WAAW,GAA4B;QAC3C,KAAK,EAAE,cAAc,GAAG,CAAC,QAAQ,EAAE;QACnC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAY,kBAAkB;QAC3C,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAG,kBAAkB;QAC3C,MAAM,EAAE,MAAM,EAAW,qEAAqE;QAC9F,WAAW,EAAE,GAAG,EAAS,mDAAmD;QAC5E,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,UAAU;QAChC,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,MAAM;QACd,kGAAkG;QAClG,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3C,CAAC;IAEF,MAAM,qBAAqB,GAAG,aAAa;SACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;SACzC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,QAAQ,OAAO,qBAAqB,IAAI,CAAC;IAElE,OAAO,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Online research retrieval — injectable client so tests never hit the network. */
|
|
2
|
+
/** One retrieved web source. title + url form the citation. */
|
|
3
|
+
export interface RetrievalSource {
|
|
4
|
+
title: string;
|
|
5
|
+
url: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Injectable retrieval client — duck-typed, offline-testable.
|
|
9
|
+
* Tests pass a spy returning fixture data; production binds to a real search client.
|
|
10
|
+
* (Mirrors FetchLike in src/medical/retrieval/medline-source.ts.)
|
|
11
|
+
*/
|
|
12
|
+
export interface RetrievalClient {
|
|
13
|
+
search(query: string): Promise<RetrievalSource[]>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Retrieve sources for a query via the injected client.
|
|
17
|
+
*
|
|
18
|
+
* NOTE: this fn does NOT itself check egress — the runner gates the call (see runner.ts).
|
|
19
|
+
* The runner checks isAllowed BEFORE calling retrieve; when off, retrieve is never invoked.
|
|
20
|
+
*
|
|
21
|
+
* Returns [] on any client error (fail-closed; never throws out).
|
|
22
|
+
*
|
|
23
|
+
* bober: injectable client interface; swap client impl for any web search provider
|
|
24
|
+
* without touching this function.
|
|
25
|
+
*/
|
|
26
|
+
export declare function retrieve(query: string, client: RetrievalClient): Promise<RetrievalSource[]>;
|
|
27
|
+
//# sourceMappingURL=online-retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"online-retrieval.d.ts","sourceRoot":"","sources":["../../src/research/online-retrieval.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAIpF,+DAA+D;AAC/D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CACnD;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAMjG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Online research retrieval — injectable client so tests never hit the network. */
|
|
2
|
+
// ── retrieve ──────────────────────────────────────────────────────────
|
|
3
|
+
/**
|
|
4
|
+
* Retrieve sources for a query via the injected client.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: this fn does NOT itself check egress — the runner gates the call (see runner.ts).
|
|
7
|
+
* The runner checks isAllowed BEFORE calling retrieve; when off, retrieve is never invoked.
|
|
8
|
+
*
|
|
9
|
+
* Returns [] on any client error (fail-closed; never throws out).
|
|
10
|
+
*
|
|
11
|
+
* bober: injectable client interface; swap client impl for any web search provider
|
|
12
|
+
* without touching this function.
|
|
13
|
+
*/
|
|
14
|
+
export async function retrieve(query, client) {
|
|
15
|
+
try {
|
|
16
|
+
return await client.search(query);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=online-retrieval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"online-retrieval.js","sourceRoot":"","sources":["../../src/research/online-retrieval.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAmBpF,yEAAyE;AAEzE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa,EAAE,MAAuB;IACnE,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runResearchJob — deterministic multi-model research runner.
|
|
3
|
+
*
|
|
4
|
+
* Flow:
|
|
5
|
+
* 1. Resolve >=2 distinct provider/model blocks via model-diversity.
|
|
6
|
+
* 2. Query each block via the injected queryModel dep (no SDK imports here).
|
|
7
|
+
* 3. Collect labelled contributions.
|
|
8
|
+
* 4. Serialize into a markdown vault note and write it to disk.
|
|
9
|
+
* 5. Build one Finding and emit it via the injected findingSink EXACTLY once.
|
|
10
|
+
* 6. Return { notePath, models, finding }.
|
|
11
|
+
*
|
|
12
|
+
* PURE deps-injection contract:
|
|
13
|
+
* - queryModel — provider-agnostic; CLI binds to createClient().chat()
|
|
14
|
+
* - findingSink — hub writer; CLI binds to ingestFinding(store, f, {now})
|
|
15
|
+
* - now — injected ISO timestamp; never call new Date() in this module
|
|
16
|
+
* - vaultRoot — target vault dir; must be writable by the caller
|
|
17
|
+
*
|
|
18
|
+
* Clock discipline: `now` is always stamped at the CLI .action() boundary.
|
|
19
|
+
* This module never calls new Date() or Date.now().
|
|
20
|
+
*/
|
|
21
|
+
import type { Finding } from "../hub/finding.js";
|
|
22
|
+
import type { RoleProviderBlock } from "../fleet/tier-policy.js";
|
|
23
|
+
import type { ResearchJob } from "./types.js";
|
|
24
|
+
import { type ModelContribution } from "./note-writer.js";
|
|
25
|
+
import { type RetrievalClient } from "./online-retrieval.js";
|
|
26
|
+
import type { ResearchEgressGuard } from "./egress.js";
|
|
27
|
+
/** Provider-agnostic query function — wraps a single LLM chat call. */
|
|
28
|
+
export type QueryModel = (block: RoleProviderBlock, prompt: string) => Promise<string>;
|
|
29
|
+
/** Hub Finding emitter — called exactly once after the note is written. */
|
|
30
|
+
export type FindingSink = (finding: Finding) => Promise<void>;
|
|
31
|
+
/** Injected dependencies for runResearchJob. */
|
|
32
|
+
export interface RunDeps {
|
|
33
|
+
/** Provider-agnostic query fn — NO SDK import; CLI binds to createClient(). */
|
|
34
|
+
queryModel: QueryModel;
|
|
35
|
+
/** Finding sink — CLI binds to ingestFinding(store, f, { now }). */
|
|
36
|
+
findingSink: FindingSink;
|
|
37
|
+
/** Injected ISO timestamp — stamped at the CLI boundary; never read the clock here. */
|
|
38
|
+
now: string;
|
|
39
|
+
/** Writable vault root directory. */
|
|
40
|
+
vaultRoot: string;
|
|
41
|
+
/** Research egress guard — when absent, retrieval is skipped entirely (zero outbound). */
|
|
42
|
+
egress?: ResearchEgressGuard;
|
|
43
|
+
/** Injected retrieval client — when absent, retrieval is skipped entirely. */
|
|
44
|
+
retrievalClient?: RetrievalClient;
|
|
45
|
+
}
|
|
46
|
+
/** Result returned by runResearchJob. */
|
|
47
|
+
export interface RunResult {
|
|
48
|
+
/** Absolute path of the written vault note. */
|
|
49
|
+
notePath: string;
|
|
50
|
+
/** Canonical model labels queried (e.g. ["openai-compat/deepseek", "openai-compat/grok"]). */
|
|
51
|
+
models: string[];
|
|
52
|
+
/** The Finding emitted to the hub. */
|
|
53
|
+
finding: Finding;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A domain-specific analyzer can post-process contributions to produce a
|
|
57
|
+
* custom Finding. If no analyzer is registered for a domain, the generic
|
|
58
|
+
* default is used (multi-model synthesis with neutral defaults).
|
|
59
|
+
*
|
|
60
|
+
* bober: registry is a simple Map; swap for a plugin loader if the number of
|
|
61
|
+
* domains grows beyond ~5 (the current set is research/medical/coding).
|
|
62
|
+
* Do NOT register src/medical/ analyzers here — that is a future sprint.
|
|
63
|
+
*/
|
|
64
|
+
export type DomainAnalyzer = (job: ResearchJob, contributions: ModelContribution[], now: string) => Finding;
|
|
65
|
+
/**
|
|
66
|
+
* Register a domain-specific analyzer. The key is the domain string
|
|
67
|
+
* (e.g. "medical"). Overwrites any existing registration for that domain.
|
|
68
|
+
* Called by domain modules (never by src/medical/ in this sprint).
|
|
69
|
+
*/
|
|
70
|
+
export declare function registerAnalyzer(domain: string, analyzer: DomainAnalyzer): void;
|
|
71
|
+
/**
|
|
72
|
+
* Execute one research job: query >=2 distinct model blocks, write a vault
|
|
73
|
+
* note, and emit exactly ONE Finding to the injected sink.
|
|
74
|
+
*
|
|
75
|
+
* @param job - The stored ResearchJob definition.
|
|
76
|
+
* @param deps - Injected dependencies (queryModel, findingSink, now, vaultRoot).
|
|
77
|
+
* @returns RunResult with the note path, model labels, and the emitted Finding.
|
|
78
|
+
*/
|
|
79
|
+
export declare function runResearchJob(job: ResearchJob, deps: RunDeps): Promise<RunResult>;
|
|
80
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/research/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIvD,uEAAuE;AACvE,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEvF,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,gDAAgD;AAChD,MAAM,WAAW,OAAO;IACtB,+EAA+E;IAC/E,UAAU,EAAE,UAAU,CAAC;IACvB,oEAAoE;IACpE,WAAW,EAAE,WAAW,CAAC;IACzB,uFAAuF;IACvF,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAElB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,8EAA8E;IAC9E,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACxB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;CAClB;AAID;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,GAAG,EAAE,WAAW,EAChB,aAAa,EAAE,iBAAiB,EAAE,EAClC,GAAG,EAAE,MAAM,KACR,OAAO,CAAC;AAIb;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAE/E;AA0CD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,SAAS,CAAC,CAmDpB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runResearchJob — deterministic multi-model research runner.
|
|
3
|
+
*
|
|
4
|
+
* Flow:
|
|
5
|
+
* 1. Resolve >=2 distinct provider/model blocks via model-diversity.
|
|
6
|
+
* 2. Query each block via the injected queryModel dep (no SDK imports here).
|
|
7
|
+
* 3. Collect labelled contributions.
|
|
8
|
+
* 4. Serialize into a markdown vault note and write it to disk.
|
|
9
|
+
* 5. Build one Finding and emit it via the injected findingSink EXACTLY once.
|
|
10
|
+
* 6. Return { notePath, models, finding }.
|
|
11
|
+
*
|
|
12
|
+
* PURE deps-injection contract:
|
|
13
|
+
* - queryModel — provider-agnostic; CLI binds to createClient().chat()
|
|
14
|
+
* - findingSink — hub writer; CLI binds to ingestFinding(store, f, {now})
|
|
15
|
+
* - now — injected ISO timestamp; never call new Date() in this module
|
|
16
|
+
* - vaultRoot — target vault dir; must be writable by the caller
|
|
17
|
+
*
|
|
18
|
+
* Clock discipline: `now` is always stamped at the CLI .action() boundary.
|
|
19
|
+
* This module never calls new Date() or Date.now().
|
|
20
|
+
*/
|
|
21
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
22
|
+
import { dirname } from "node:path";
|
|
23
|
+
import { createHash } from "node:crypto";
|
|
24
|
+
import { diverseBlocks, modelLabel } from "./model-diversity.js";
|
|
25
|
+
import { researchNotePath, serializeResearchNote, } from "./note-writer.js";
|
|
26
|
+
import { retrieve } from "./online-retrieval.js";
|
|
27
|
+
const analyzerRegistry = new Map();
|
|
28
|
+
/**
|
|
29
|
+
* Register a domain-specific analyzer. The key is the domain string
|
|
30
|
+
* (e.g. "medical"). Overwrites any existing registration for that domain.
|
|
31
|
+
* Called by domain modules (never by src/medical/ in this sprint).
|
|
32
|
+
*/
|
|
33
|
+
export function registerAnalyzer(domain, analyzer) {
|
|
34
|
+
analyzerRegistry.set(domain, analyzer);
|
|
35
|
+
}
|
|
36
|
+
// ── Helpers ───────────────────────────────────────────────────────────
|
|
37
|
+
/** Derive a content-stable Finding id from domain|title|kind. */
|
|
38
|
+
function deriveFindingId(domain, title, kind) {
|
|
39
|
+
return createHash("sha256")
|
|
40
|
+
.update(`${domain}|${title}|${kind}`)
|
|
41
|
+
.digest("hex")
|
|
42
|
+
.slice(0, 16);
|
|
43
|
+
}
|
|
44
|
+
/** Build the generic Finding for a completed research run. */
|
|
45
|
+
function buildFinding(job, contributions, now) {
|
|
46
|
+
const domain = job.domain ?? "research";
|
|
47
|
+
const title = `Research: ${job.question}`;
|
|
48
|
+
const kind = "watch";
|
|
49
|
+
const id = deriveFindingId(domain, title, kind);
|
|
50
|
+
// evidence = per-model contribution labels (cited sources)
|
|
51
|
+
const evidence = contributions.map((c) => `${c.label}: ${c.text.slice(0, 120)}`);
|
|
52
|
+
return {
|
|
53
|
+
id,
|
|
54
|
+
domain,
|
|
55
|
+
title,
|
|
56
|
+
kind,
|
|
57
|
+
urgency: 2,
|
|
58
|
+
severity: 2,
|
|
59
|
+
evidence,
|
|
60
|
+
surfacedAt: now,
|
|
61
|
+
tags: ["research", ...(job.domain !== undefined ? [`domain:${job.domain}`] : [])],
|
|
62
|
+
status: "open",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// ── Runner ────────────────────────────────────────────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* Execute one research job: query >=2 distinct model blocks, write a vault
|
|
68
|
+
* note, and emit exactly ONE Finding to the injected sink.
|
|
69
|
+
*
|
|
70
|
+
* @param job - The stored ResearchJob definition.
|
|
71
|
+
* @param deps - Injected dependencies (queryModel, findingSink, now, vaultRoot).
|
|
72
|
+
* @returns RunResult with the note path, model labels, and the emitted Finding.
|
|
73
|
+
*/
|
|
74
|
+
export async function runResearchJob(job, deps) {
|
|
75
|
+
const { queryModel, findingSink, now, vaultRoot } = deps;
|
|
76
|
+
// 1. Resolve >=2 distinct provider/model blocks (sc-2-1)
|
|
77
|
+
const blocks = diverseBlocks(job.tier);
|
|
78
|
+
// Guard: need at least 2 distinct blocks to satisfy sc-2-1
|
|
79
|
+
if (blocks.length < 2) {
|
|
80
|
+
throw new Error(`model-diversity returned ${blocks.length} block(s); need >=2 for a multi-model run`);
|
|
81
|
+
}
|
|
82
|
+
// 2. Query each block with a research prompt
|
|
83
|
+
const prompt = `Answer the following research question concisely and accurately:\n\n${job.question}`;
|
|
84
|
+
const contributions = [];
|
|
85
|
+
for (const block of blocks) {
|
|
86
|
+
const text = await queryModel(block, prompt);
|
|
87
|
+
contributions.push({ label: modelLabel(block), text });
|
|
88
|
+
}
|
|
89
|
+
// ── Sprint 3: gated online-research retrieval (axis OFF default => skipped entirely) ──
|
|
90
|
+
// When egress is absent or axis is off: sourceUrls stays [] and the retrieval client
|
|
91
|
+
// is NEVER constructed or invoked — zero outbound requests (sc-3-3 off-path proof).
|
|
92
|
+
let sourceUrls = [];
|
|
93
|
+
if (deps.egress?.isAllowed("online-research") === true && deps.retrievalClient !== undefined) {
|
|
94
|
+
const sources = await retrieve(job.question, deps.retrievalClient);
|
|
95
|
+
sourceUrls = sources.map((s) => s.url);
|
|
96
|
+
}
|
|
97
|
+
// 3. Build the note content (PURE — no fs)
|
|
98
|
+
const labels = contributions.map((c) => c.label);
|
|
99
|
+
const noteContent = serializeResearchNote(job, labels, contributions, now, sourceUrls);
|
|
100
|
+
// 4. Write the note to disk (sc-2-2)
|
|
101
|
+
// Marker = first 12 chars of job id (stable slug for the filename)
|
|
102
|
+
const marker = job.id.slice(0, 12);
|
|
103
|
+
const notePath = researchNotePath(vaultRoot, marker, now);
|
|
104
|
+
await mkdir(dirname(notePath), { recursive: true });
|
|
105
|
+
await writeFile(notePath, noteContent, "utf-8");
|
|
106
|
+
// 5. Build and emit exactly ONE Finding (sc-2-3)
|
|
107
|
+
const domain = job.domain ?? "research";
|
|
108
|
+
const analyzer = analyzerRegistry.get(domain);
|
|
109
|
+
const finding = analyzer !== undefined
|
|
110
|
+
? analyzer(job, contributions, now)
|
|
111
|
+
: buildFinding(job, contributions, now);
|
|
112
|
+
await findingSink(finding);
|
|
113
|
+
return { notePath, models: labels, finding };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/research/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAwB,MAAM,uBAAuB,CAAC;AAuDvE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA0B,CAAC;AAE3D;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,QAAwB;IACvE,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,yEAAyE;AAEzE,iEAAiE;AACjE,SAAS,eAAe,CAAC,MAAc,EAAE,KAAa,EAAE,IAAY;IAClE,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,GAAG,MAAM,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;SACpC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,8DAA8D;AAC9D,SAAS,YAAY,CACnB,GAAgB,EAChB,aAAkC,EAClC,GAAW;IAEX,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,UAAU,CAAC;IACxC,MAAM,KAAK,GAAG,aAAa,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAgB,CAAC;IAC9B,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAEhD,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAEjF,OAAO;QACL,EAAE;QACF,MAAM;QACN,KAAK;QACL,IAAI;QACJ,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;QACX,QAAQ;QACR,UAAU,EAAE,GAAG;QACf,IAAI,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC;AAED,yEAAyE;AAEzE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAgB,EAChB,IAAa;IAEb,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAEzD,yDAAyD;IACzD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,2DAA2D;IAC3D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,4BAA4B,MAAM,CAAC,MAAM,2CAA2C,CACrF,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,MAAM,MAAM,GAAG,uEAAuE,GAAG,CAAC,QAAQ,EAAE,CAAC;IACrG,MAAM,aAAa,GAAwB,EAAE,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7C,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,yFAAyF;IACzF,qFAAqF;IACrF,oFAAoF;IACpF,IAAI,UAAU,GAAa,EAAE,CAAC;IAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,iBAAiB,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC7F,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACnE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,2CAA2C;IAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAEvF,qCAAqC;IACrC,mEAAmE;IACnE,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAEhD,iDAAiD;IACjD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,UAAU,CAAC;IACxC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,OAAO,GACX,QAAQ,KAAK,SAAS;QACpB,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC;QACnC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IAE5C,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tick — idempotent recurring research scheduler (Sprint 4).
|
|
3
|
+
*
|
|
4
|
+
* Clock discipline: `now` is always injected — never call new Date() or Date.now()
|
|
5
|
+
* inside this module. The wall clock is read ONLY at the CLI .action() boundary
|
|
6
|
+
* (mirrors src/research/runner.ts:18-19 and src/state/facts.ts:18-21).
|
|
7
|
+
*
|
|
8
|
+
* Idempotency: after a job runs, its nextDueAt is advanced to
|
|
9
|
+
* computeNextDue(cadence, now) which is strictly > now, so a second tick at
|
|
10
|
+
* the same now evaluates due === false for that job (sc-4-3).
|
|
11
|
+
*
|
|
12
|
+
* Concurrency: single-process, no lock needed (two-person personal use case;
|
|
13
|
+
* contract assumption L50).
|
|
14
|
+
*/
|
|
15
|
+
import type { ResearchJob } from "./types.js";
|
|
16
|
+
/**
|
|
17
|
+
* Injected dependencies for tick.
|
|
18
|
+
* All I/O and the clock are injected so unit tests can bypass real providers
|
|
19
|
+
* and SQLite (mirrors RunDeps in src/research/runner.ts:46-61).
|
|
20
|
+
*/
|
|
21
|
+
export interface TickDeps {
|
|
22
|
+
/** Injected ISO-8601 instant — stamped at the CLI boundary; never read the clock here. */
|
|
23
|
+
now: string;
|
|
24
|
+
/** Load all stored jobs. CLI binds to () => listJobs(projectRoot). */
|
|
25
|
+
listJobs: () => Promise<ResearchJob[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Persist an advanced job.
|
|
28
|
+
* CLI binds to (j) => addJob(projectRoot, j) which is an in-place upsert by id
|
|
29
|
+
* (briefing Finding B — jobId hashes only question|createdAt, so id is stable
|
|
30
|
+
* even after nextDueAt/lastRunAt are set).
|
|
31
|
+
*/
|
|
32
|
+
saveJob: (job: ResearchJob) => Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Execute one due job.
|
|
35
|
+
* CLI binds runResearchJob with queryModel/findingSink/now/vaultRoot already
|
|
36
|
+
* bound (Sprint 2 runner, invoked UNCHANGED).
|
|
37
|
+
*/
|
|
38
|
+
runJob: (job: ResearchJob) => Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/** Summary of a tick invocation — which jobs ran and which were skipped. */
|
|
41
|
+
export interface TickResult {
|
|
42
|
+
/** ids of jobs that were due and ran. */
|
|
43
|
+
ran: string[];
|
|
44
|
+
/** ids of jobs skipped because nextDueAt > now. */
|
|
45
|
+
skipped: string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Run every due job once, advance its nextDueAt, record lastRunAt, and persist.
|
|
49
|
+
*
|
|
50
|
+
* Selection rule: a job is due when
|
|
51
|
+
* - nextDueAt is undefined (never scheduled → due on first tick), OR
|
|
52
|
+
* - Date.parse(nextDueAt) <= Date.parse(now)
|
|
53
|
+
*
|
|
54
|
+
* Order: run FIRST, then advance + persist. If runJob throws, the job is NOT
|
|
55
|
+
* persisted so it remains due on the next tick.
|
|
56
|
+
*
|
|
57
|
+
* Idempotency: on a second tick at the same now, all previously-run jobs have
|
|
58
|
+
* nextDueAt > now (computeNextDue always advances by >= 1 day), so they are skipped.
|
|
59
|
+
*/
|
|
60
|
+
export declare function tick(deps: TickDeps): Promise<TickResult>;
|
|
61
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/research/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,0FAA0F;IAC1F,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,QAAQ,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvC;;;;;OAKG;IACH,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;;OAIG;IACH,MAAM,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,mDAAmD;IACnD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAqC9D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tick — idempotent recurring research scheduler (Sprint 4).
|
|
3
|
+
*
|
|
4
|
+
* Clock discipline: `now` is always injected — never call new Date() or Date.now()
|
|
5
|
+
* inside this module. The wall clock is read ONLY at the CLI .action() boundary
|
|
6
|
+
* (mirrors src/research/runner.ts:18-19 and src/state/facts.ts:18-21).
|
|
7
|
+
*
|
|
8
|
+
* Idempotency: after a job runs, its nextDueAt is advanced to
|
|
9
|
+
* computeNextDue(cadence, now) which is strictly > now, so a second tick at
|
|
10
|
+
* the same now evaluates due === false for that job (sc-4-3).
|
|
11
|
+
*
|
|
12
|
+
* Concurrency: single-process, no lock needed (two-person personal use case;
|
|
13
|
+
* contract assumption L50).
|
|
14
|
+
*/
|
|
15
|
+
import { computeNextDue } from "./cadence.js";
|
|
16
|
+
// ── tick ──────────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Run every due job once, advance its nextDueAt, record lastRunAt, and persist.
|
|
19
|
+
*
|
|
20
|
+
* Selection rule: a job is due when
|
|
21
|
+
* - nextDueAt is undefined (never scheduled → due on first tick), OR
|
|
22
|
+
* - Date.parse(nextDueAt) <= Date.parse(now)
|
|
23
|
+
*
|
|
24
|
+
* Order: run FIRST, then advance + persist. If runJob throws, the job is NOT
|
|
25
|
+
* persisted so it remains due on the next tick.
|
|
26
|
+
*
|
|
27
|
+
* Idempotency: on a second tick at the same now, all previously-run jobs have
|
|
28
|
+
* nextDueAt > now (computeNextDue always advances by >= 1 day), so they are skipped.
|
|
29
|
+
*/
|
|
30
|
+
export async function tick(deps) {
|
|
31
|
+
const { now, listJobs, saveJob, runJob } = deps;
|
|
32
|
+
const jobs = await listJobs();
|
|
33
|
+
const ran = [];
|
|
34
|
+
const skipped = [];
|
|
35
|
+
const nowMs = Date.parse(now);
|
|
36
|
+
for (const job of jobs) {
|
|
37
|
+
// A job with no nextDueAt is due immediately on first tick.
|
|
38
|
+
const isDue = job.nextDueAt === undefined ||
|
|
39
|
+
Date.parse(job.nextDueAt) <= nowMs;
|
|
40
|
+
if (!isDue) {
|
|
41
|
+
skipped.push(job.id);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Run first — if runJob throws, we do not advance or persist.
|
|
45
|
+
await runJob(job);
|
|
46
|
+
// Advance scheduling fields using the injected now (no wall clock).
|
|
47
|
+
const advanced = {
|
|
48
|
+
...job,
|
|
49
|
+
lastRunAt: now,
|
|
50
|
+
nextDueAt: computeNextDue(job.cadence, now),
|
|
51
|
+
};
|
|
52
|
+
// Persist via the injected saveJob (= addJob upsert; same id → same file).
|
|
53
|
+
await saveJob(advanced);
|
|
54
|
+
ran.push(job.id);
|
|
55
|
+
}
|
|
56
|
+
return { ran, skipped };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/research/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAsC9C,yEAAyE;AAEzE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEhD,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,4DAA4D;QAC5D,MAAM,KAAK,GACT,GAAG,CAAC,SAAS,KAAK,SAAS;YAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;QAErC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QAED,8DAA8D;QAC9D,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAElB,oEAAoE;QACpE,MAAM,QAAQ,GAAgB;YAC5B,GAAG,GAAG;YACN,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;SAC5C,CAAC;QAEF,2EAA2E;QAC3E,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QAExB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Recurrence cadence for a research job.
|
|
4
|
+
*
|
|
5
|
+
* Representation choice: a closed string-literal enum (`"daily" | "weekly" | "monthly"`).
|
|
6
|
+
* This is simpler and safer than a free-form cron string for the current use-cases;
|
|
7
|
+
* next-due computation (Sprint 4) will map these to concrete intervals without
|
|
8
|
+
* requiring a cron parser. Do NOT compute next-due dates in this module — that is
|
|
9
|
+
* Sprint 4 (contract outOfScope L55).
|
|
10
|
+
*/
|
|
11
|
+
export declare const CadenceSchema: z.ZodEnum<["daily", "weekly", "monthly"]>;
|
|
12
|
+
export type Cadence = z.infer<typeof CadenceSchema>;
|
|
13
|
+
/**
|
|
14
|
+
* A recurring research job definition stored as a JSON file under
|
|
15
|
+
* `.bober/research/jobs/<jobId>.json`.
|
|
16
|
+
*
|
|
17
|
+
* All timestamps are ISO-8601 strings; this module never reads the clock
|
|
18
|
+
* (mirrors src/state/facts.ts:18-21 — clock is stamped at the CLI boundary).
|
|
19
|
+
*
|
|
20
|
+
* tier vs modelSet: both are optional; the executor (Sprint 2) resolves
|
|
21
|
+
* which to use at runtime. Storing both allows flexible scheduling without
|
|
22
|
+
* commitment to either axis in Sprint 1.
|
|
23
|
+
*
|
|
24
|
+
* onlineResearch defaults to false — the online-research egress axis is not
|
|
25
|
+
* enabled until Sprint 3. The field is stored verbatim for forward-compatibility.
|
|
26
|
+
*/
|
|
27
|
+
export declare const ResearchJobSchema: z.ZodObject<{
|
|
28
|
+
id: z.ZodString;
|
|
29
|
+
/** The research question to answer. Must be non-empty (sc-1-1). */
|
|
30
|
+
question: z.ZodString;
|
|
31
|
+
/** How often the job runs. See CadenceSchema for allowed values. */
|
|
32
|
+
cadence: z.ZodEnum<["daily", "weekly", "monthly"]>;
|
|
33
|
+
/** Difficulty tier hint (e.g. "hard") — optional, resolved at execution time. */
|
|
34
|
+
tier: z.ZodOptional<z.ZodString>;
|
|
35
|
+
/** Explicit model set override — optional, resolved at execution time. */
|
|
36
|
+
modelSet: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
37
|
+
/** Repository slug to scope the research against, if any. */
|
|
38
|
+
targetRepo: z.ZodOptional<z.ZodString>;
|
|
39
|
+
/** Domain tag (e.g. "medical", "coding") for priority-hub routing. */
|
|
40
|
+
domain: z.ZodOptional<z.ZodString>;
|
|
41
|
+
/**
|
|
42
|
+
* Whether online retrieval is enabled for this job.
|
|
43
|
+
* Defaults to false — online-research egress is not active until Sprint 3.
|
|
44
|
+
*/
|
|
45
|
+
onlineResearch: z.ZodDefault<z.ZodBoolean>;
|
|
46
|
+
/** ISO-8601 creation timestamp — set once at CLI boundary, never mutated. */
|
|
47
|
+
createdAt: z.ZodString;
|
|
48
|
+
/**
|
|
49
|
+
* ISO-8601 next-due instant (Sprint 4). Unset => due immediately on first tick.
|
|
50
|
+
* Advanced by computeNextDue(cadence, now) after each run. Never read from the wall clock.
|
|
51
|
+
*/
|
|
52
|
+
nextDueAt: z.ZodOptional<z.ZodString>;
|
|
53
|
+
/** ISO-8601 timestamp of the most recent successful run (Sprint 4). Unset until first run. */
|
|
54
|
+
lastRunAt: z.ZodOptional<z.ZodString>;
|
|
55
|
+
}, "strip", z.ZodTypeAny, {
|
|
56
|
+
id: string;
|
|
57
|
+
question: string;
|
|
58
|
+
cadence: "daily" | "weekly" | "monthly";
|
|
59
|
+
onlineResearch: boolean;
|
|
60
|
+
createdAt: string;
|
|
61
|
+
tier?: string | undefined;
|
|
62
|
+
modelSet?: string[] | undefined;
|
|
63
|
+
targetRepo?: string | undefined;
|
|
64
|
+
domain?: string | undefined;
|
|
65
|
+
nextDueAt?: string | undefined;
|
|
66
|
+
lastRunAt?: string | undefined;
|
|
67
|
+
}, {
|
|
68
|
+
id: string;
|
|
69
|
+
question: string;
|
|
70
|
+
cadence: "daily" | "weekly" | "monthly";
|
|
71
|
+
createdAt: string;
|
|
72
|
+
tier?: string | undefined;
|
|
73
|
+
modelSet?: string[] | undefined;
|
|
74
|
+
targetRepo?: string | undefined;
|
|
75
|
+
domain?: string | undefined;
|
|
76
|
+
onlineResearch?: boolean | undefined;
|
|
77
|
+
nextDueAt?: string | undefined;
|
|
78
|
+
lastRunAt?: string | undefined;
|
|
79
|
+
}>;
|
|
80
|
+
export type ResearchJob = z.infer<typeof ResearchJobSchema>;
|
|
81
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/research/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,2CAAyC,CAAC;AACpE,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAIpD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB;;IAE5B,mEAAmE;;IAEnE,oEAAoE;;IAEpE,iFAAiF;;IAEjF,0EAA0E;;IAE1E,6DAA6D;;IAE7D,sEAAsE;;IAEtE;;;OAGG;;IAEH,6EAA6E;;IAE7E;;;OAGG;;IAEH,8FAA8F;;;;;;;;;;;;;;;;;;;;;;;;;;EAE9F,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// ── Cadence ───────────────────────────────────────────────────────────
|
|
3
|
+
/**
|
|
4
|
+
* Recurrence cadence for a research job.
|
|
5
|
+
*
|
|
6
|
+
* Representation choice: a closed string-literal enum (`"daily" | "weekly" | "monthly"`).
|
|
7
|
+
* This is simpler and safer than a free-form cron string for the current use-cases;
|
|
8
|
+
* next-due computation (Sprint 4) will map these to concrete intervals without
|
|
9
|
+
* requiring a cron parser. Do NOT compute next-due dates in this module — that is
|
|
10
|
+
* Sprint 4 (contract outOfScope L55).
|
|
11
|
+
*/
|
|
12
|
+
export const CadenceSchema = z.enum(["daily", "weekly", "monthly"]);
|
|
13
|
+
// ── ResearchJob ───────────────────────────────────────────────────────
|
|
14
|
+
/**
|
|
15
|
+
* A recurring research job definition stored as a JSON file under
|
|
16
|
+
* `.bober/research/jobs/<jobId>.json`.
|
|
17
|
+
*
|
|
18
|
+
* All timestamps are ISO-8601 strings; this module never reads the clock
|
|
19
|
+
* (mirrors src/state/facts.ts:18-21 — clock is stamped at the CLI boundary).
|
|
20
|
+
*
|
|
21
|
+
* tier vs modelSet: both are optional; the executor (Sprint 2) resolves
|
|
22
|
+
* which to use at runtime. Storing both allows flexible scheduling without
|
|
23
|
+
* commitment to either axis in Sprint 1.
|
|
24
|
+
*
|
|
25
|
+
* onlineResearch defaults to false — the online-research egress axis is not
|
|
26
|
+
* enabled until Sprint 3. The field is stored verbatim for forward-compatibility.
|
|
27
|
+
*/
|
|
28
|
+
export const ResearchJobSchema = z.object({
|
|
29
|
+
id: z.string().min(1),
|
|
30
|
+
/** The research question to answer. Must be non-empty (sc-1-1). */
|
|
31
|
+
question: z.string().min(1),
|
|
32
|
+
/** How often the job runs. See CadenceSchema for allowed values. */
|
|
33
|
+
cadence: CadenceSchema,
|
|
34
|
+
/** Difficulty tier hint (e.g. "hard") — optional, resolved at execution time. */
|
|
35
|
+
tier: z.string().optional(),
|
|
36
|
+
/** Explicit model set override — optional, resolved at execution time. */
|
|
37
|
+
modelSet: z.array(z.string()).optional(),
|
|
38
|
+
/** Repository slug to scope the research against, if any. */
|
|
39
|
+
targetRepo: z.string().optional(),
|
|
40
|
+
/** Domain tag (e.g. "medical", "coding") for priority-hub routing. */
|
|
41
|
+
domain: z.string().optional(),
|
|
42
|
+
/**
|
|
43
|
+
* Whether online retrieval is enabled for this job.
|
|
44
|
+
* Defaults to false — online-research egress is not active until Sprint 3.
|
|
45
|
+
*/
|
|
46
|
+
onlineResearch: z.boolean().default(false),
|
|
47
|
+
/** ISO-8601 creation timestamp — set once at CLI boundary, never mutated. */
|
|
48
|
+
createdAt: z.string().datetime(),
|
|
49
|
+
/**
|
|
50
|
+
* ISO-8601 next-due instant (Sprint 4). Unset => due immediately on first tick.
|
|
51
|
+
* Advanced by computeNextDue(cadence, now) after each run. Never read from the wall clock.
|
|
52
|
+
*/
|
|
53
|
+
nextDueAt: z.string().datetime().optional(),
|
|
54
|
+
/** ISO-8601 timestamp of the most recent successful run (Sprint 4). Unset until first run. */
|
|
55
|
+
lastRunAt: z.string().datetime().optional(),
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/research/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,yEAAyE;AAEzE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAGpE,yEAAyE;AAEzE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,mEAAmE;IACnE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,oEAAoE;IACpE,OAAO,EAAE,aAAa;IACtB,iFAAiF;IACjF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,0EAA0E;IAC1E,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,6DAA6D;IAC7D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,sEAAsE;IACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B;;;OAGG;IACH,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC1C,6EAA6E;IAC7E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC;;;OAGG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,8FAA8F;IAC9F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HttpClient — the SOLE provider-agnostic HTTP transport seam under
|
|
3
|
+
* `src/seo/` (spec-20260715-ultimate-seo-suite, Sprint 8; ADR-5).
|
|
4
|
+
*
|
|
5
|
+
* `src/seo/adapters/http.ts` is the ONLY file under `src/seo/` allowed to
|
|
6
|
+
* reference the global `fetch`. Every live adapter (`GscAdapter` this
|
|
7
|
+
* sprint, `DataForSeoAdapter` in Sprint 9) takes an injectable `HttpClient`
|
|
8
|
+
* constructor param defaulting to `defaultHttpClient`; tests inject a fake
|
|
9
|
+
* so no socket ever opens in CI. Mirrors the injectable-transport pattern
|
|
10
|
+
* in `src/medical/retrieval/medline-source.ts:37-39` and
|
|
11
|
+
* `src/medical/whoop/whoop-client.ts:40-52`, generalised to a
|
|
12
|
+
* `{method, headers, body}` request shape shared by both GSC and
|
|
13
|
+
* DataForSEO (both are plain JSON-over-HTTPS POST APIs).
|
|
14
|
+
*
|
|
15
|
+
* bober: no retry/backoff here — a thin request/response shim only. Each
|
|
16
|
+
* adapter owns its own error handling (429/5xx -> abstain) per
|
|
17
|
+
* ADR-5. Add shared retry logic only if a second adapter needs the
|
|
18
|
+
* exact same policy.
|
|
19
|
+
*/
|
|
20
|
+
/** Duck-typed response — deliberately NOT the global `Response` type, so
|
|
21
|
+
* tests can construct fakes without touching the real fetch API. */
|
|
22
|
+
export interface HttpResponse {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
status: number;
|
|
25
|
+
json(): Promise<unknown>;
|
|
26
|
+
}
|
|
27
|
+
/** One outbound request's method/headers/body. */
|
|
28
|
+
export interface HttpRequestInit {
|
|
29
|
+
method: string;
|
|
30
|
+
headers?: Record<string, string>;
|
|
31
|
+
body?: string;
|
|
32
|
+
}
|
|
33
|
+
/** Provider-agnostic injectable HTTP transport. */
|
|
34
|
+
export interface HttpClient {
|
|
35
|
+
request(url: string, init: HttpRequestInit): Promise<HttpResponse>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Default transport = global fetch. The sole global-fetch reference under
|
|
39
|
+
* `src/seo/`. Adapters take this as their default `http` constructor param;
|
|
40
|
+
* tests always inject a fake `HttpClient` instead.
|
|
41
|
+
*/
|
|
42
|
+
export declare const defaultHttpClient: HttpClient;
|
|
43
|
+
//# sourceMappingURL=http.d.ts.map
|