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,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* computeNextDue — deterministic cadence math (Sprint 4).
|
|
3
|
+
*
|
|
4
|
+
* PURE, clock-free: never calls new Date() with no argument or Date.now().
|
|
5
|
+
* The fromIso base instant is always injected from the CLI boundary
|
|
6
|
+
* (mirrors the clock discipline in src/state/facts.ts:18-21 and
|
|
7
|
+
* src/calendar/slotter.ts:14-16).
|
|
8
|
+
*
|
|
9
|
+
* new Date(Date.parse(iso)) parses the INJECTED string — that is pure, not
|
|
10
|
+
* a wall-clock read. The wall clock is read only at the CLI .action() boundary.
|
|
11
|
+
*/
|
|
12
|
+
// ── computeNextDue ────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Return the next-due ISO-8601 timestamp for a job with the given cadence,
|
|
15
|
+
* computed from the injected `fromIso` instant.
|
|
16
|
+
*
|
|
17
|
+
* Cadence mapping:
|
|
18
|
+
* - "daily" → +1 UTC day (setUTCDate + 1)
|
|
19
|
+
* - "weekly" → +7 UTC days (setUTCDate + 7)
|
|
20
|
+
* - "monthly" → +1 UTC month (setUTCMonth + 1)
|
|
21
|
+
*
|
|
22
|
+
* Month-length rollover note: JavaScript's setUTCMonth overflows into the
|
|
23
|
+
* next month when the source day exceeds the destination month's length.
|
|
24
|
+
* E.g. 2026-01-31 + 1 month → 2026-03-03 (Feb has 28 days in 2026).
|
|
25
|
+
* This deterministic behaviour is intentional — callers MUST NOT rely on
|
|
26
|
+
* the result landing on the last day of the month.
|
|
27
|
+
*
|
|
28
|
+
* @param cadence - One of "daily", "weekly", "monthly".
|
|
29
|
+
* @param fromIso - Injected ISO-8601 base instant (e.g. the current `now`).
|
|
30
|
+
* @returns ISO-8601 string satisfying z.string().datetime().
|
|
31
|
+
*/
|
|
32
|
+
export function computeNextDue(cadence, fromIso) {
|
|
33
|
+
// Parsing an injected string is pure — no wall-clock dependency.
|
|
34
|
+
const base = new Date(Date.parse(fromIso));
|
|
35
|
+
switch (cadence) {
|
|
36
|
+
case "daily":
|
|
37
|
+
base.setUTCDate(base.getUTCDate() + 1);
|
|
38
|
+
return base.toISOString();
|
|
39
|
+
case "weekly":
|
|
40
|
+
base.setUTCDate(base.getUTCDate() + 7);
|
|
41
|
+
return base.toISOString();
|
|
42
|
+
case "monthly":
|
|
43
|
+
// setUTCMonth overflows into the next month on day > last-day-of-month.
|
|
44
|
+
// This is deterministic and acceptable for a monthly cadence (contract
|
|
45
|
+
// outOfScope: no clamp-to-end-of-month behaviour).
|
|
46
|
+
base.setUTCMonth(base.getUTCMonth() + 1);
|
|
47
|
+
return base.toISOString();
|
|
48
|
+
default: {
|
|
49
|
+
// TypeScript exhaustive-switch guard — new cadences cause a compile error.
|
|
50
|
+
const _exhaustive = cadence;
|
|
51
|
+
throw new Error(`Unhandled cadence: ${String(_exhaustive)}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=cadence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cadence.js","sourceRoot":"","sources":["../../src/research/cadence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,yEAAyE;AAEzE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,OAAe;IAC9D,iEAAiE;IACjE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAE5B,KAAK,QAAQ;YACX,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAE5B,KAAK,SAAS;YACZ,wEAAwE;YACxE,uEAAuE;YACvE,mDAAmD;YACnD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAE5B,OAAO,CAAC,CAAC,CAAC;YACR,2EAA2E;YAC3E,MAAM,WAAW,GAAU,OAAO,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research digest builder — aggregates in-window research runs into a
|
|
3
|
+
* dual markdown+JSON artifact for the Telegram bot (sibling spec) to push.
|
|
4
|
+
*
|
|
5
|
+
* Clock discipline: `now`/`since` are injected ISO strings — never new Date() here.
|
|
6
|
+
* Non-sensitive summary content only (titles/summaries; no raw body values).
|
|
7
|
+
*
|
|
8
|
+
* bober: collectRunsFromVault reads vault research notes (1:1 dated artifacts)
|
|
9
|
+
* rather than hub Findings (content-deduped, historyless, path-less).
|
|
10
|
+
* Swap if a dedicated digest store is ever introduced.
|
|
11
|
+
*/
|
|
12
|
+
/** One research run entry in a digest. */
|
|
13
|
+
export interface DigestRun {
|
|
14
|
+
/** Job title — note frontmatter.title ("Research — <question>"). */
|
|
15
|
+
title: string;
|
|
16
|
+
/** Non-sensitive one-line summary derived from frontmatter.question/title only. */
|
|
17
|
+
topFinding: string;
|
|
18
|
+
/** ISO — note frontmatter.generatedAt. */
|
|
19
|
+
generatedAt: string;
|
|
20
|
+
/** Absolute note path — the source artifact link. */
|
|
21
|
+
source: string;
|
|
22
|
+
}
|
|
23
|
+
/** The full digest structure written to both .md and .json. */
|
|
24
|
+
export interface Digest {
|
|
25
|
+
since: string;
|
|
26
|
+
now: string;
|
|
27
|
+
generatedAt: string;
|
|
28
|
+
runs: DigestRun[];
|
|
29
|
+
}
|
|
30
|
+
/** Injectable dependencies for buildDigest — keeps it testable without real vault. */
|
|
31
|
+
export interface DigestDeps {
|
|
32
|
+
/** Injected collector — returns in-window runs. Fake in unit tests; real in CLI. */
|
|
33
|
+
collectRuns: (since: string, now: string) => Promise<DigestRun[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Absolute path to the digests directory.
|
|
36
|
+
* e.g. <root>/.bober/research/digests — injected; temp dir in tests.
|
|
37
|
+
*/
|
|
38
|
+
digestsDir: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Render a Digest into a markdown string.
|
|
42
|
+
*
|
|
43
|
+
* PURE: no IO, no Date.now(), no side effects.
|
|
44
|
+
* Mirrors src/hub/priority-md.ts: builds lines[] then joins with "\n".
|
|
45
|
+
*
|
|
46
|
+
* Empty-window rule (sc-5-3): when runs.length === 0, the body explicitly
|
|
47
|
+
* states no new research was produced in the window.
|
|
48
|
+
*/
|
|
49
|
+
export declare function renderDigestMarkdown(digest: Digest): string;
|
|
50
|
+
/**
|
|
51
|
+
* Collect in-window research runs via deps.collectRuns, render both markdown
|
|
52
|
+
* and JSON artifacts, write them to deps.digestsDir, and return the result.
|
|
53
|
+
*
|
|
54
|
+
* File naming: `now.slice(0, 10)` → YYYY-MM-DD (matches note-writer.ts:24).
|
|
55
|
+
* JSON format: JSON.stringify(digest, null, 2) + "\n" (mirrors fleet/index.ts:69).
|
|
56
|
+
*
|
|
57
|
+
* Empty window: still writes both files with an explicit no-new-research body.
|
|
58
|
+
* Never throws on empty collectRuns — caller receives both paths.
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildDigest(since: string, now: string, deps: DigestDeps): Promise<{
|
|
61
|
+
digest: Digest;
|
|
62
|
+
mdPath: string;
|
|
63
|
+
jsonPath: string;
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* Real collectRuns implementation: reads research vault notes under
|
|
67
|
+
* <vaultRoot>/research/, filters by frontmatter.generatedAt ∈ [since, now],
|
|
68
|
+
* and maps each matching note to a DigestRun.
|
|
69
|
+
*
|
|
70
|
+
* Source selection: vault notes are 1:1 dated run artifacts (runner.ts:186-190
|
|
71
|
+
* writes a new file per run). Hub Findings are content-deduped by
|
|
72
|
+
* sha256(domain|title|kind) and silently undercount a window — not suitable.
|
|
73
|
+
*
|
|
74
|
+
* Non-sensitive: topFinding is frontmatter.question/title only — never raw body.
|
|
75
|
+
*
|
|
76
|
+
* Window compare: ISO lexicographic (safe because all timestamps are
|
|
77
|
+
* toISOString() fixed-width — finding-store.ts:101-104).
|
|
78
|
+
*/
|
|
79
|
+
export declare function collectRunsFromVault(vaultRoot: string, since: string, now: string): Promise<DigestRun[]>;
|
|
80
|
+
//# sourceMappingURL=digest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/research/digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,0CAA0C;AAC1C,MAAM,WAAW,SAAS;IACxB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+DAA+D;AAC/D,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,EAAE,CAAC;CACnB;AAED,sFAAsF;AACtF,MAAM,WAAW,UAAU;IACzB,oFAAoF;IACpF,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAClE;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAuB3D;AAID;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,GACf,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB/D;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,SAAS,EAAE,CAAC,CAyCtB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Research digest builder — aggregates in-window research runs into a
|
|
3
|
+
* dual markdown+JSON artifact for the Telegram bot (sibling spec) to push.
|
|
4
|
+
*
|
|
5
|
+
* Clock discipline: `now`/`since` are injected ISO strings — never new Date() here.
|
|
6
|
+
* Non-sensitive summary content only (titles/summaries; no raw body values).
|
|
7
|
+
*
|
|
8
|
+
* bober: collectRunsFromVault reads vault research notes (1:1 dated artifacts)
|
|
9
|
+
* rather than hub Findings (content-deduped, historyless, path-less).
|
|
10
|
+
* Swap if a dedicated digest store is ever introduced.
|
|
11
|
+
*/
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { writeFile } from "node:fs/promises";
|
|
14
|
+
import { ensureDir } from "../state/helpers.js";
|
|
15
|
+
import { listNotes, readNote } from "../vault/note-io.js";
|
|
16
|
+
// ── Pure markdown render ──────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Render a Digest into a markdown string.
|
|
19
|
+
*
|
|
20
|
+
* PURE: no IO, no Date.now(), no side effects.
|
|
21
|
+
* Mirrors src/hub/priority-md.ts: builds lines[] then joins with "\n".
|
|
22
|
+
*
|
|
23
|
+
* Empty-window rule (sc-5-3): when runs.length === 0, the body explicitly
|
|
24
|
+
* states no new research was produced in the window.
|
|
25
|
+
*/
|
|
26
|
+
export function renderDigestMarkdown(digest) {
|
|
27
|
+
const lines = [];
|
|
28
|
+
lines.push("# Research Digest");
|
|
29
|
+
lines.push("");
|
|
30
|
+
lines.push(`**Window:** ${digest.since} → ${digest.now}`);
|
|
31
|
+
lines.push(`**Generated:** ${digest.generatedAt}`);
|
|
32
|
+
lines.push("");
|
|
33
|
+
if (digest.runs.length === 0) {
|
|
34
|
+
lines.push("_No new research was produced in this window._");
|
|
35
|
+
lines.push("");
|
|
36
|
+
return lines.join("\n");
|
|
37
|
+
}
|
|
38
|
+
lines.push(`**Runs:** ${digest.runs.length}`);
|
|
39
|
+
lines.push("");
|
|
40
|
+
for (const run of digest.runs) {
|
|
41
|
+
lines.push(`- **${run.title}** — ${run.topFinding} ([source](${run.source}))`);
|
|
42
|
+
}
|
|
43
|
+
lines.push("");
|
|
44
|
+
return lines.join("\n");
|
|
45
|
+
}
|
|
46
|
+
// ── buildDigest: collect → render both → write both ──────────────────
|
|
47
|
+
/**
|
|
48
|
+
* Collect in-window research runs via deps.collectRuns, render both markdown
|
|
49
|
+
* and JSON artifacts, write them to deps.digestsDir, and return the result.
|
|
50
|
+
*
|
|
51
|
+
* File naming: `now.slice(0, 10)` → YYYY-MM-DD (matches note-writer.ts:24).
|
|
52
|
+
* JSON format: JSON.stringify(digest, null, 2) + "\n" (mirrors fleet/index.ts:69).
|
|
53
|
+
*
|
|
54
|
+
* Empty window: still writes both files with an explicit no-new-research body.
|
|
55
|
+
* Never throws on empty collectRuns — caller receives both paths.
|
|
56
|
+
*/
|
|
57
|
+
export async function buildDigest(since, now, deps) {
|
|
58
|
+
const runs = await deps.collectRuns(since, now);
|
|
59
|
+
const digest = { since, now, generatedAt: now, runs };
|
|
60
|
+
// Date derived from injected `now` — never wall-clock (mirrors note-writer.ts:24)
|
|
61
|
+
const date = now.slice(0, 10); // YYYY-MM-DD
|
|
62
|
+
await ensureDir(deps.digestsDir);
|
|
63
|
+
const mdPath = join(deps.digestsDir, `${date}.md`);
|
|
64
|
+
const jsonPath = join(deps.digestsDir, `${date}.json`);
|
|
65
|
+
await writeFile(mdPath, renderDigestMarkdown(digest), "utf-8");
|
|
66
|
+
// Mirror fleet/index.ts:69: JSON.stringify(obj, null, 2) + "\n"
|
|
67
|
+
await writeFile(jsonPath, JSON.stringify(digest, null, 2) + "\n", "utf-8");
|
|
68
|
+
return { digest, mdPath, jsonPath };
|
|
69
|
+
}
|
|
70
|
+
// ── Real vault-note collector (bound only by the CLI) ─────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Real collectRuns implementation: reads research vault notes under
|
|
73
|
+
* <vaultRoot>/research/, filters by frontmatter.generatedAt ∈ [since, now],
|
|
74
|
+
* and maps each matching note to a DigestRun.
|
|
75
|
+
*
|
|
76
|
+
* Source selection: vault notes are 1:1 dated run artifacts (runner.ts:186-190
|
|
77
|
+
* writes a new file per run). Hub Findings are content-deduped by
|
|
78
|
+
* sha256(domain|title|kind) and silently undercount a window — not suitable.
|
|
79
|
+
*
|
|
80
|
+
* Non-sensitive: topFinding is frontmatter.question/title only — never raw body.
|
|
81
|
+
*
|
|
82
|
+
* Window compare: ISO lexicographic (safe because all timestamps are
|
|
83
|
+
* toISOString() fixed-width — finding-store.ts:101-104).
|
|
84
|
+
*/
|
|
85
|
+
export async function collectRunsFromVault(vaultRoot, since, now) {
|
|
86
|
+
const researchDir = join(vaultRoot, "research");
|
|
87
|
+
let paths;
|
|
88
|
+
try {
|
|
89
|
+
paths = await listNotes(researchDir);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Directory may not exist yet (first run, empty vault) — return empty, no error
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
const runs = [];
|
|
96
|
+
for (const p of paths) {
|
|
97
|
+
const note = await readNote(p);
|
|
98
|
+
const generatedAt = note.frontmatter["generatedAt"];
|
|
99
|
+
// Skip notes whose generatedAt is absent or not a string
|
|
100
|
+
if (typeof generatedAt !== "string")
|
|
101
|
+
continue;
|
|
102
|
+
// ISO lexicographic window filter
|
|
103
|
+
if (generatedAt < since || generatedAt > now)
|
|
104
|
+
continue;
|
|
105
|
+
// title: prefer frontmatter.title, fall back to "Research — <question>", then path
|
|
106
|
+
const rawTitle = note.frontmatter["title"];
|
|
107
|
+
const rawQuestion = note.frontmatter["question"];
|
|
108
|
+
const title = typeof rawTitle === "string"
|
|
109
|
+
? rawTitle
|
|
110
|
+
: typeof rawQuestion === "string"
|
|
111
|
+
? `Research — ${rawQuestion}`
|
|
112
|
+
: p;
|
|
113
|
+
// topFinding: frontmatter.question (non-sensitive; never raw body values)
|
|
114
|
+
const topFinding = typeof rawQuestion === "string" ? rawQuestion : title;
|
|
115
|
+
runs.push({ title, topFinding, generatedAt, source: p });
|
|
116
|
+
}
|
|
117
|
+
return runs;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/research/digest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** ResearchEgressGuard — online-research egress axis, default false (Sprint 3, ADR-6 lineage). */
|
|
2
|
+
import type { BoberConfig } from "../config/schema.js";
|
|
3
|
+
/** The single research egress axis. Defaults FALSE (code-enforced zero-egress). */
|
|
4
|
+
export type EgressAxis = "online-research";
|
|
5
|
+
/**
|
|
6
|
+
* Guards outbound online-research egress.
|
|
7
|
+
*
|
|
8
|
+
* A single axis — onlineResearch — defaults to false.
|
|
9
|
+
* isAllowed returns false by default; assertAllowed throws when off.
|
|
10
|
+
* All default false when absent from config (fail-closed, ADR-6 lineage).
|
|
11
|
+
*
|
|
12
|
+
* bober: plain decision object; no network import here; swap for ABAC policy if
|
|
13
|
+
* per-user granularity is needed.
|
|
14
|
+
*/
|
|
15
|
+
export declare class ResearchEgressGuard {
|
|
16
|
+
private readonly onlineResearch;
|
|
17
|
+
constructor(onlineResearch: boolean);
|
|
18
|
+
/** Build from BoberConfig research section; axis defaults false when absent. */
|
|
19
|
+
static fromConfig(config: BoberConfig): ResearchEgressGuard;
|
|
20
|
+
/** Returns true only when the axis has been explicitly opted in via config. */
|
|
21
|
+
isAllowed(axis: EgressAxis): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Throws an Error when the axis is not enabled.
|
|
24
|
+
* Returns void (not throws) when the axis is allowed.
|
|
25
|
+
*/
|
|
26
|
+
assertAllowed(axis: EgressAxis): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=egress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"egress.d.ts","sourceRoot":"","sources":["../../src/research/egress.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,mFAAmF;AACnF,MAAM,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAE3C;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,OAAO;IAEpD,gFAAgF;IAChF,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB;IAI3D,+EAA+E;IAC/E,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;IAWpC;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;CAKtC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guards outbound online-research egress.
|
|
3
|
+
*
|
|
4
|
+
* A single axis — onlineResearch — defaults to false.
|
|
5
|
+
* isAllowed returns false by default; assertAllowed throws when off.
|
|
6
|
+
* All default false when absent from config (fail-closed, ADR-6 lineage).
|
|
7
|
+
*
|
|
8
|
+
* bober: plain decision object; no network import here; swap for ABAC policy if
|
|
9
|
+
* per-user granularity is needed.
|
|
10
|
+
*/
|
|
11
|
+
export class ResearchEgressGuard {
|
|
12
|
+
onlineResearch;
|
|
13
|
+
constructor(onlineResearch) {
|
|
14
|
+
this.onlineResearch = onlineResearch;
|
|
15
|
+
}
|
|
16
|
+
/** Build from BoberConfig research section; axis defaults false when absent. */
|
|
17
|
+
static fromConfig(config) {
|
|
18
|
+
return new ResearchEgressGuard(config.research?.egress?.onlineResearch ?? false);
|
|
19
|
+
}
|
|
20
|
+
/** Returns true only when the axis has been explicitly opted in via config. */
|
|
21
|
+
isAllowed(axis) {
|
|
22
|
+
switch (axis) {
|
|
23
|
+
case "online-research":
|
|
24
|
+
return this.onlineResearch;
|
|
25
|
+
default: {
|
|
26
|
+
const _exhaustive = axis; // compile error if an EgressAxis value is unhandled
|
|
27
|
+
return _exhaustive;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Throws an Error when the axis is not enabled.
|
|
33
|
+
* Returns void (not throws) when the axis is allowed.
|
|
34
|
+
*/
|
|
35
|
+
assertAllowed(axis) {
|
|
36
|
+
if (!this.isAllowed(axis)) {
|
|
37
|
+
throw new Error(`Egress axis '${axis}' not enabled`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=egress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"egress.js","sourceRoot":"","sources":["../../src/research/egress.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,cAAuB;QAAvB,mBAAc,GAAd,cAAc,CAAS;IAAG,CAAC;IAExD,gFAAgF;IAChF,MAAM,CAAC,UAAU,CAAC,MAAmB;QACnC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,IAAI,KAAK,CAAC,CAAC;IACnF,CAAC;IAED,+EAA+E;IAC/E,SAAS,CAAC,IAAgB;QACxB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,iBAAiB;gBACpB,OAAO,IAAI,CAAC,cAAc,CAAC;YAC7B,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,WAAW,GAAU,IAAI,CAAC,CAAC,oDAAoD;gBACrF,OAAO,WAAW,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,IAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,eAAe,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ResearchJob } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Derive a deterministic 16-char hex job id from a question slug + createdAt.
|
|
4
|
+
* Mirrors factId in src/state/facts.ts:58-69 — no wall-clock dependency.
|
|
5
|
+
* The CLI stamps createdAt at the handler boundary and passes it here.
|
|
6
|
+
*/
|
|
7
|
+
export declare function jobId(question: string, createdAt: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Persist a research job as a JSON file.
|
|
10
|
+
* Validates with ResearchJobSchema before writing so an invalid job never
|
|
11
|
+
* reaches disk (mirrors plan-state.ts:22-38).
|
|
12
|
+
*/
|
|
13
|
+
export declare function addJob(projectRoot: string, job: ResearchJob): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* List all persisted research jobs, sorted by filename.
|
|
16
|
+
* Returns [] if the jobs directory does not exist yet.
|
|
17
|
+
* Malformed JSON files are silently skipped (mirrors plan-state.ts:106-140).
|
|
18
|
+
*/
|
|
19
|
+
export declare function listJobs(projectRoot: string): Promise<ResearchJob[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Read a single research job by id.
|
|
22
|
+
* Returns null if not found or malformed.
|
|
23
|
+
*/
|
|
24
|
+
export declare function readJob(projectRoot: string, id: string): Promise<ResearchJob | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Delete a research job by id. Returns true if deleted, false if not found.
|
|
27
|
+
* Mirrors approval-state.ts:138-140.
|
|
28
|
+
*/
|
|
29
|
+
export declare function removeJob(projectRoot: string, id: string): Promise<boolean>;
|
|
30
|
+
//# sourceMappingURL=job-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-store.d.ts","sourceRoot":"","sources":["../../src/research/job-store.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAiBjE;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKjE;AAID;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,EAAE,CAAC,CAwBxB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAU7B;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,OAAO,CAAC,CAOlB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { readFile, writeFile, readdir, unlink } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { ensureDir } from "../state/helpers.js";
|
|
5
|
+
import { ResearchJobSchema } from "./types.js";
|
|
6
|
+
// ── Path helpers ──────────────────────────────────────────────────────
|
|
7
|
+
const JOBS_DIR = ".bober/research/jobs";
|
|
8
|
+
function jobsDir(projectRoot) {
|
|
9
|
+
return join(projectRoot, JOBS_DIR);
|
|
10
|
+
}
|
|
11
|
+
function jobPath(projectRoot, id) {
|
|
12
|
+
const safeId = id.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
13
|
+
return join(jobsDir(projectRoot), `${safeId}.json`);
|
|
14
|
+
}
|
|
15
|
+
// ── Deterministic id ──────────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* Derive a deterministic 16-char hex job id from a question slug + createdAt.
|
|
18
|
+
* Mirrors factId in src/state/facts.ts:58-69 — no wall-clock dependency.
|
|
19
|
+
* The CLI stamps createdAt at the handler boundary and passes it here.
|
|
20
|
+
*/
|
|
21
|
+
export function jobId(question, createdAt) {
|
|
22
|
+
return createHash("sha256")
|
|
23
|
+
.update(`${question}|${createdAt}`)
|
|
24
|
+
.digest("hex")
|
|
25
|
+
.slice(0, 16);
|
|
26
|
+
}
|
|
27
|
+
// ── Store operations ──────────────────────────────────────────────────
|
|
28
|
+
/**
|
|
29
|
+
* Persist a research job as a JSON file.
|
|
30
|
+
* Validates with ResearchJobSchema before writing so an invalid job never
|
|
31
|
+
* reaches disk (mirrors plan-state.ts:22-38).
|
|
32
|
+
*/
|
|
33
|
+
export async function addJob(projectRoot, job) {
|
|
34
|
+
await ensureDir(jobsDir(projectRoot));
|
|
35
|
+
const validation = ResearchJobSchema.safeParse(job);
|
|
36
|
+
if (!validation.success) {
|
|
37
|
+
const issues = validation.error.issues
|
|
38
|
+
.map((i) => ` - ${i.path.join(".")}: ${i.message}`)
|
|
39
|
+
.join("\n");
|
|
40
|
+
throw new Error(`Invalid research job:\n${issues}`);
|
|
41
|
+
}
|
|
42
|
+
await writeFile(jobPath(projectRoot, job.id), JSON.stringify(validation.data, null, 2) + "\n", "utf-8");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* List all persisted research jobs, sorted by filename.
|
|
46
|
+
* Returns [] if the jobs directory does not exist yet.
|
|
47
|
+
* Malformed JSON files are silently skipped (mirrors plan-state.ts:106-140).
|
|
48
|
+
*/
|
|
49
|
+
export async function listJobs(projectRoot) {
|
|
50
|
+
let entries;
|
|
51
|
+
try {
|
|
52
|
+
entries = await readdir(jobsDir(projectRoot));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Directory absent — no jobs yet.
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
const jobs = [];
|
|
59
|
+
for (const file of entries.filter((f) => f.endsWith(".json")).sort()) {
|
|
60
|
+
try {
|
|
61
|
+
const raw = JSON.parse(await readFile(join(jobsDir(projectRoot), file), "utf-8"));
|
|
62
|
+
const result = ResearchJobSchema.safeParse(raw);
|
|
63
|
+
if (result.success) {
|
|
64
|
+
jobs.push(result.data);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Skip malformed files
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return jobs;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Read a single research job by id.
|
|
75
|
+
* Returns null if not found or malformed.
|
|
76
|
+
*/
|
|
77
|
+
export async function readJob(projectRoot, id) {
|
|
78
|
+
try {
|
|
79
|
+
const raw = JSON.parse(await readFile(jobPath(projectRoot, id), "utf-8"));
|
|
80
|
+
const result = ResearchJobSchema.safeParse(raw);
|
|
81
|
+
return result.success ? result.data : null;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Delete a research job by id. Returns true if deleted, false if not found.
|
|
89
|
+
* Mirrors approval-state.ts:138-140.
|
|
90
|
+
*/
|
|
91
|
+
export async function removeJob(projectRoot, id) {
|
|
92
|
+
try {
|
|
93
|
+
await unlink(jobPath(projectRoot, id));
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=job-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-store.js","sourceRoot":"","sources":["../../src/research/job-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model diversity resolver — returns >=2 distinct provider/model blocks by
|
|
3
|
+
* enumerating DIFFERENT tiers from fleet tier-policy.
|
|
4
|
+
*
|
|
5
|
+
* PURE: no fs, no network, no clock. Reads only the static tier table.
|
|
6
|
+
*
|
|
7
|
+
* Distinctness comes from DIFFERENT tiers (within one tier planner==generator
|
|
8
|
+
* ==evaluator all point at the same block, so deduplication must cross tiers).
|
|
9
|
+
*/
|
|
10
|
+
import type { RoleProviderBlock } from "../fleet/tier-policy.js";
|
|
11
|
+
/**
|
|
12
|
+
* Canonical label for a block — used in notes and Finding evidence fields.
|
|
13
|
+
* Stable: derived purely from the block's provider and model fields.
|
|
14
|
+
*/
|
|
15
|
+
export declare function modelLabel(b: RoleProviderBlock): string;
|
|
16
|
+
/**
|
|
17
|
+
* Return >=2 DISTINCT provider/model blocks for a multi-model research run.
|
|
18
|
+
*
|
|
19
|
+
* Strategy: enumerate the non-default tiers in a fixed priority order and
|
|
20
|
+
* dedup by `provider/model` label. The optional `tier` parameter seeds the
|
|
21
|
+
* first block by placing that tier at the front of the scan order.
|
|
22
|
+
*
|
|
23
|
+
* Returns all 4 distinct blocks (cheap/standard/hard/frontier) in the
|
|
24
|
+
* current tier-policy table; the runner takes the first >=2.
|
|
25
|
+
*/
|
|
26
|
+
export declare function diverseBlocks(tier?: string): RoleProviderBlock[];
|
|
27
|
+
//# sourceMappingURL=model-diversity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-diversity.d.ts","sourceRoot":"","sources":["../../src/research/model-diversity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,yBAAyB,CAAC;AAIjF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAEvD;AAID;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAyBhE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model diversity resolver — returns >=2 distinct provider/model blocks by
|
|
3
|
+
* enumerating DIFFERENT tiers from fleet tier-policy.
|
|
4
|
+
*
|
|
5
|
+
* PURE: no fs, no network, no clock. Reads only the static tier table.
|
|
6
|
+
*
|
|
7
|
+
* Distinctness comes from DIFFERENT tiers (within one tier planner==generator
|
|
8
|
+
* ==evaluator all point at the same block, so deduplication must cross tiers).
|
|
9
|
+
*/
|
|
10
|
+
import { tierPolicy } from "../fleet/tier-policy.js";
|
|
11
|
+
// ── Label ─────────────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Canonical label for a block — used in notes and Finding evidence fields.
|
|
14
|
+
* Stable: derived purely from the block's provider and model fields.
|
|
15
|
+
*/
|
|
16
|
+
export function modelLabel(b) {
|
|
17
|
+
return `${b.provider}/${b.model}`;
|
|
18
|
+
}
|
|
19
|
+
// ── Diversity resolver ────────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Return >=2 DISTINCT provider/model blocks for a multi-model research run.
|
|
22
|
+
*
|
|
23
|
+
* Strategy: enumerate the non-default tiers in a fixed priority order and
|
|
24
|
+
* dedup by `provider/model` label. The optional `tier` parameter seeds the
|
|
25
|
+
* first block by placing that tier at the front of the scan order.
|
|
26
|
+
*
|
|
27
|
+
* Returns all 4 distinct blocks (cheap/standard/hard/frontier) in the
|
|
28
|
+
* current tier-policy table; the runner takes the first >=2.
|
|
29
|
+
*/
|
|
30
|
+
export function diverseBlocks(tier) {
|
|
31
|
+
const order = ["cheap", "standard", "hard", "frontier"];
|
|
32
|
+
const tiers = tier !== undefined && order.includes(tier)
|
|
33
|
+
? [tier, ...order.filter((t) => t !== tier)]
|
|
34
|
+
: order;
|
|
35
|
+
const seen = new Set();
|
|
36
|
+
const out = [];
|
|
37
|
+
for (const t of tiers) {
|
|
38
|
+
const block = tierPolicy.resolveTier(t)?.generator;
|
|
39
|
+
if (block !== undefined) {
|
|
40
|
+
const label = modelLabel(block);
|
|
41
|
+
if (!seen.has(label)) {
|
|
42
|
+
seen.add(label);
|
|
43
|
+
out.push(block);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// bober: returns up to 4 distinct blocks; runner takes >=2. If tier-policy
|
|
48
|
+
// ever collapses tiers to a single block this falls back to whatever is
|
|
49
|
+
// available. A future upgrade path is to expose a configurable model list.
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=model-diversity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-diversity.js","sourceRoot":"","sources":["../../src/research/model-diversity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,yEAAyE;AAEzE;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,CAAoB;IAC7C,OAAO,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AACpC,CAAC;AAED,yEAAyE;AAEzE;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,MAAM,KAAK,GAAqB,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1E,MAAM,KAAK,GACT,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAsB,CAAC;QAC1D,CAAC,CAAC,CAAC,IAAsB,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9D,CAAC,CAAC,KAAK,CAAC;IAEZ,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAwB,EAAE,CAAC;IAEpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAChB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,wEAAwE;IACxE,2EAA2E;IAC3E,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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 type { ResearchJob } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Derive the canonical path for a research note under the vault.
|
|
13
|
+
* Output: <vaultRoot>/research/<YYYY-MM-DD>-<marker>.md
|
|
14
|
+
* Date is sliced from the injected ISO string — never wall-clock.
|
|
15
|
+
*/
|
|
16
|
+
export declare function researchNotePath(vaultRoot: string, marker: string, now: string): string;
|
|
17
|
+
/** One labelled model answer collected by the runner. */
|
|
18
|
+
export interface ModelContribution {
|
|
19
|
+
/** Canonical model label, e.g. "openai-compat/deepseek". */
|
|
20
|
+
label: string;
|
|
21
|
+
/** The model's answer text. */
|
|
22
|
+
text: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Serialize a multi-model research run into a vault note string.
|
|
26
|
+
*
|
|
27
|
+
* Frontmatter fields (all required by sc-2-2):
|
|
28
|
+
* title, jobId, question, models (string[]), generatedAt, domain, type, status
|
|
29
|
+
*
|
|
30
|
+
* Body: per-model contribution sections — records WHICH model label produced each answer.
|
|
31
|
+
*
|
|
32
|
+
* PITFALL: models must be string[] (labels), never RoleProviderBlock[].
|
|
33
|
+
* serializeFrontmatter renders nested objects as "[object Object]".
|
|
34
|
+
*/
|
|
35
|
+
export declare function serializeResearchNote(job: ResearchJob, labels: string[], contributions: ModelContribution[], now: string, sources?: string[]): string;
|
|
36
|
+
//# sourceMappingURL=note-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note-writer.d.ts","sourceRoot":"","sources":["../../src/research/note-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvF;AAID,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,EAAE,iBAAiB,EAAE,EAClC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,EAAO,GACrB,MAAM,CAqBR"}
|