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,62 @@
|
|
|
1
|
+
import type { BoberConfig } from "../config/schema.js";
|
|
2
|
+
import type { SecurityFinding } from "./security-audit-types.js";
|
|
3
|
+
import type { AuditDiff } from "./security-knowledge/diff-provider.js";
|
|
4
|
+
/**
|
|
5
|
+
* Adversarial, fresh-context, contract-free finder->verifier stage
|
|
6
|
+
* (spec-20260714 sprint 8, ADR-2/ADR-6 default-off).
|
|
7
|
+
*
|
|
8
|
+
* Runs sequentially AFTER the security auditor ("finder") inside
|
|
9
|
+
* `runSecurityAudit`, fed ONLY the finder's `critical`+`important` findings
|
|
10
|
+
* (never `minor`/`approvedAreas`, never the sprint contract — that strips
|
|
11
|
+
* the sycophancy framing a favorably-worded contract creates). It is told
|
|
12
|
+
* to DISPROVE each finding and may only downgrade (`critical`->`important`)
|
|
13
|
+
* or drop a finding — never promote or manufacture a clean pass.
|
|
14
|
+
*
|
|
15
|
+
* Fail-closed, mirroring the finder's own `parsed:false => blocked`
|
|
16
|
+
* inversion: any parse failure, provider error, refusal, or abort resolves
|
|
17
|
+
* `ran:false`, and the caller (`runSecurityAudit`'s fold) KEEPS the finder's
|
|
18
|
+
* findings unchanged.
|
|
19
|
+
*/
|
|
20
|
+
/** Downgrade-only, fail-closed verifier result. `ran:false` => finder criticals kept. */
|
|
21
|
+
export interface VerifierResult {
|
|
22
|
+
/** Confirmed by the verifier — stays at the finder's original severity. */
|
|
23
|
+
verified: SecurityFinding[];
|
|
24
|
+
/** Real but not critical-severity — moves critical->important in the fold. */
|
|
25
|
+
downgraded: SecurityFinding[];
|
|
26
|
+
/** Disproved against the evidence — removed entirely in the fold. */
|
|
27
|
+
dropped: SecurityFinding[];
|
|
28
|
+
/** False on parse-failure / provider error / refusal / abort (fail-closed). */
|
|
29
|
+
ran: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface VerifyParams {
|
|
32
|
+
/** The finder's critical + important findings ONLY — never minor/approvedAreas. */
|
|
33
|
+
findings: SecurityFinding[];
|
|
34
|
+
/** The SAME AuditDiff the finder saw; hunks are the re-check evidence. Undefined in estimated-files mode. */
|
|
35
|
+
diff: AuditDiff | undefined;
|
|
36
|
+
projectRoot: string;
|
|
37
|
+
config: BoberConfig;
|
|
38
|
+
/** Time-box for this stage, owned by the caller (keyed to config.security.timeoutMs). */
|
|
39
|
+
signal: AbortSignal;
|
|
40
|
+
}
|
|
41
|
+
/** Injectable seam so `runSecurityAudit` tests can stub the stage (mirrors `SecurityDiffProvider`). */
|
|
42
|
+
export interface SecurityVerifier {
|
|
43
|
+
verify(params: VerifyParams): Promise<VerifierResult>;
|
|
44
|
+
}
|
|
45
|
+
export declare const runSecurityVerifier: SecurityVerifier;
|
|
46
|
+
/**
|
|
47
|
+
* Parse the verifier's response into a `VerifierResult`.
|
|
48
|
+
*
|
|
49
|
+
* Reuses the same resilient extraction ladder as
|
|
50
|
+
* `security-auditor-agent.ts:parseSecurityAuditResult` (direct parse ->
|
|
51
|
+
* markdown-fence -> first-bracket-to-last-bracket slice), but INVERTS which
|
|
52
|
+
* JSON shape it accepts: the auditor rejects arrays (it wants a
|
|
53
|
+
* `ReviewResult` object); the verifier REQUIRES an array of per-finding
|
|
54
|
+
* verdicts — any non-array, truncated, or garbage response is fail-closed
|
|
55
|
+
* (`ran:false`).
|
|
56
|
+
*
|
|
57
|
+
* A finding present in `inputFindings` but never addressed by a matched,
|
|
58
|
+
* recognized verdict entry defaults to `verified` — fail-closed means an
|
|
59
|
+
* unaddressed finding is never silently dropped.
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseVerifierResult(text: string, inputFindings: SecurityFinding[]): VerifierResult;
|
|
62
|
+
//# sourceMappingURL=security-verifier-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-verifier-agent.d.ts","sourceRoot":"","sources":["../../src/orchestrator/security-verifier-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AASvE;;;;;;;;;;;;;;;GAeG;AAEH,yFAAyF;AACzF,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,8EAA8E;IAC9E,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,qEAAqE;IACrE,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,mFAAmF;IACnF,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,6GAA6G;IAC7G,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,yFAAyF;IACzF,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,uGAAuG;AACvG,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACvD;AAID,eAAO,MAAM,mBAAmB,EAAE,gBAgFjC,CAAC;AA8EF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,cAAc,CAuElG"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { createClient } from "../providers/factory.js";
|
|
2
|
+
import { resolveModel } from "./model-resolver.js";
|
|
3
|
+
import { assembleSystemPrompt } from "./agent-loader.js";
|
|
4
|
+
import { resolveRoleTools, getGraphState, getGraphDeps } from "./tools/index.js";
|
|
5
|
+
import { runAgenticLoop } from "./agentic-loop.js";
|
|
6
|
+
import { budgetFromMaxUsd } from "./workflow/budget.js";
|
|
7
|
+
import { logger } from "../utils/logger.js";
|
|
8
|
+
const FAIL_CLOSED_RESULT = { verified: [], downgraded: [], dropped: [], ran: false };
|
|
9
|
+
export const runSecurityVerifier = {
|
|
10
|
+
async verify(params) {
|
|
11
|
+
const { findings, diff, projectRoot, config, signal } = params;
|
|
12
|
+
// Nothing to verify — a clean no-op. No LLM call needed, and there is
|
|
13
|
+
// nothing to fail-closed on: ran:true with all buckets empty is correct
|
|
14
|
+
// (the fold leaves the finder review completely unchanged either way).
|
|
15
|
+
if (findings.length === 0) {
|
|
16
|
+
return { verified: [], downgraded: [], dropped: [], ran: true };
|
|
17
|
+
}
|
|
18
|
+
const verifierModel = config.security?.verifier?.model ?? "opus";
|
|
19
|
+
const model = resolveModel(verifierModel);
|
|
20
|
+
const maxTurns = config.security?.verifier?.maxTurns ?? 10;
|
|
21
|
+
// The verifier reuses the SAME "curator" read-only role as the finder —
|
|
22
|
+
// no bash/write/edit (nonGoals[0]). No new AgentRole is introduced.
|
|
23
|
+
const graphState = getGraphState(config);
|
|
24
|
+
const graphDeps = graphState.engineHealth === "ready" ? getGraphDeps() : undefined;
|
|
25
|
+
const toolSet = resolveRoleTools("curator", projectRoot, graphState, graphDeps ?? undefined);
|
|
26
|
+
const systemPrompt = await assembleSystemPrompt("curator", "bober-security-verifier", projectRoot, graphState);
|
|
27
|
+
const client = createClient(config.security?.provider ?? null, config.security?.endpoint ?? null, config.security?.providerConfig, verifierModel, "SecurityVerifier");
|
|
28
|
+
const budget = budgetFromMaxUsd(config.security?.budget?.maxUsd);
|
|
29
|
+
const userMessage = buildVerifierUserMessage(findings, diff);
|
|
30
|
+
let result;
|
|
31
|
+
try {
|
|
32
|
+
result = await runAgenticLoop({
|
|
33
|
+
client,
|
|
34
|
+
model,
|
|
35
|
+
systemPrompt,
|
|
36
|
+
userMessage,
|
|
37
|
+
tools: toolSet.schemas,
|
|
38
|
+
toolHandlers: toolSet.handlers,
|
|
39
|
+
maxTurns,
|
|
40
|
+
maxTokens: 16384,
|
|
41
|
+
...(budget !== undefined ? { budget } : {}),
|
|
42
|
+
abortSignal: signal,
|
|
43
|
+
onToolUse: (name, input) => {
|
|
44
|
+
const inp = input;
|
|
45
|
+
const inputStr = JSON.stringify(inp).slice(0, 120);
|
|
46
|
+
logger.debug(` [security-verifier] ${name}(${inputStr})`);
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
// Provider/network error — fail-closed, never propagate a crash out of
|
|
52
|
+
// an opt-in verification stage into the audit path.
|
|
53
|
+
logger.debug(`[security-verifier] runAgenticLoop threw: ${err instanceof Error ? err.message : String(err)} — fail-closed (ran:false)`);
|
|
54
|
+
return { ...FAIL_CLOSED_RESULT };
|
|
55
|
+
}
|
|
56
|
+
logger.debug(`Security verifier completed in ${result.turnsUsed} turns (${result.toolsCalled.length} tool calls)`);
|
|
57
|
+
// Abort/error/refusal stop reasons are all fail-closed — never treated
|
|
58
|
+
// as "confirmed everything" or "found nothing to disprove".
|
|
59
|
+
if (result.stopReason === "aborted" || result.stopReason === "error" || result.refused === true) {
|
|
60
|
+
return { ...FAIL_CLOSED_RESULT };
|
|
61
|
+
}
|
|
62
|
+
return parseVerifierResult(result.finalText, findings);
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
// ── Prompt assembly ────────────────────────────────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* Renders the "# Changed files (real diff)" section — deliberately the same
|
|
68
|
+
* shape as `security-auditor-agent.ts`'s file-local `renderChangedFilesSection`
|
|
69
|
+
* so the evidence the verifier re-checks against matches what the finder saw.
|
|
70
|
+
* Empty string when there's no diff (estimated-files mode / no changes).
|
|
71
|
+
*/
|
|
72
|
+
function renderChangedFilesSection(diff) {
|
|
73
|
+
if (!diff || diff.changedFiles.length === 0)
|
|
74
|
+
return "";
|
|
75
|
+
const filesText = diff.changedFiles
|
|
76
|
+
.map((f) => {
|
|
77
|
+
const hunksText = f.hunks.length > 0 ? f.hunks.map((h) => h.content).join("\n\n") : "(no hunks captured)";
|
|
78
|
+
return `## ${f.path} (${f.status})\n\n${hunksText}`;
|
|
79
|
+
})
|
|
80
|
+
.join("\n\n");
|
|
81
|
+
const neighborhoodText = diff.neighborhoodFiles.length > 0
|
|
82
|
+
? `\n\nCall-graph neighborhood (files affected by the changes above):\n${diff.neighborhoodFiles.join("\n")}`
|
|
83
|
+
: "";
|
|
84
|
+
const truncatedText = diff.truncated
|
|
85
|
+
? "\n\n(diff truncated — showing a bounded subset of changed files/hunks)"
|
|
86
|
+
: "";
|
|
87
|
+
return `# Changed files (real diff)\n\n${filesText}${neighborhoodText}${truncatedText}\n\n`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Builds the verifier's user message from ONLY the findings + diff hunks.
|
|
91
|
+
* Deliberately excludes everything `security-auditor-agent.ts:buildUserMessage`
|
|
92
|
+
* folds in for the finder: no `# Sprint Contract` JSON, no
|
|
93
|
+
* `# Evaluation Result (Already Passed)` section, no priors section — this is
|
|
94
|
+
* the sycophancy-framing strip that makes the verifier a genuinely fresh,
|
|
95
|
+
* unbiased second opinion (sc-8-2).
|
|
96
|
+
*/
|
|
97
|
+
function buildVerifierUserMessage(findings, diff) {
|
|
98
|
+
const findingsJson = JSON.stringify(findings.map((finding, index) => ({ index, ...finding })), null, 2);
|
|
99
|
+
const changedFilesSection = renderChangedFilesSection(diff);
|
|
100
|
+
return `# Findings To Verify
|
|
101
|
+
|
|
102
|
+
${findingsJson}
|
|
103
|
+
|
|
104
|
+
${changedFilesSection}# Your Task
|
|
105
|
+
|
|
106
|
+
You have Read/Grep/Glob only (no Bash, no git). For each finding above:
|
|
107
|
+
1. Read the cited path/line and confirm the snippet is genuine and current
|
|
108
|
+
2. Check the "# Changed files (real diff)" section (when present) for the actual hunk touching that file
|
|
109
|
+
3. Look for a sanitizer, parameterized query, access check, or input-validation guard the finder may have missed
|
|
110
|
+
4. Decide whether there is a realistic, externally-triggerable exploit path
|
|
111
|
+
|
|
112
|
+
Render one verdict per finding: "confirmed" (it holds — stays at its original severity),
|
|
113
|
+
"downgraded" (real but not critical-severity — moves critical to important), or "disproved"
|
|
114
|
+
(the evidence does not support it — dropped).
|
|
115
|
+
|
|
116
|
+
Output ONLY a JSON array (no markdown fences, no surrounding prose), one entry per finding,
|
|
117
|
+
in this exact shape:
|
|
118
|
+
[
|
|
119
|
+
{
|
|
120
|
+
"index": 0,
|
|
121
|
+
"verdict": "confirmed",
|
|
122
|
+
"confidence": "high",
|
|
123
|
+
"reason": "<one-line reason citing what you actually checked>"
|
|
124
|
+
}
|
|
125
|
+
]`;
|
|
126
|
+
}
|
|
127
|
+
// ── Fail-closed JSON parser (mirror image of the auditor's — expects an array) ──
|
|
128
|
+
/**
|
|
129
|
+
* Parse the verifier's response into a `VerifierResult`.
|
|
130
|
+
*
|
|
131
|
+
* Reuses the same resilient extraction ladder as
|
|
132
|
+
* `security-auditor-agent.ts:parseSecurityAuditResult` (direct parse ->
|
|
133
|
+
* markdown-fence -> first-bracket-to-last-bracket slice), but INVERTS which
|
|
134
|
+
* JSON shape it accepts: the auditor rejects arrays (it wants a
|
|
135
|
+
* `ReviewResult` object); the verifier REQUIRES an array of per-finding
|
|
136
|
+
* verdicts — any non-array, truncated, or garbage response is fail-closed
|
|
137
|
+
* (`ran:false`).
|
|
138
|
+
*
|
|
139
|
+
* A finding present in `inputFindings` but never addressed by a matched,
|
|
140
|
+
* recognized verdict entry defaults to `verified` — fail-closed means an
|
|
141
|
+
* unaddressed finding is never silently dropped.
|
|
142
|
+
*/
|
|
143
|
+
export function parseVerifierResult(text, inputFindings) {
|
|
144
|
+
let parsedJson;
|
|
145
|
+
try {
|
|
146
|
+
parsedJson = JSON.parse(text.trim());
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
const fenceMatch = /```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/.exec(text);
|
|
150
|
+
if (fenceMatch) {
|
|
151
|
+
try {
|
|
152
|
+
parsedJson = JSON.parse(fenceMatch[1].trim());
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Fall through
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (parsedJson === undefined) {
|
|
159
|
+
const bracketStart = text.indexOf("[");
|
|
160
|
+
const bracketEnd = text.lastIndexOf("]");
|
|
161
|
+
if (bracketStart !== -1 && bracketEnd > bracketStart) {
|
|
162
|
+
try {
|
|
163
|
+
parsedJson = JSON.parse(text.slice(bracketStart, bracketEnd + 1));
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Fall through to fail-closed default below
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// The verifier is the mirror image of the auditor's parser: it EXPECTS a
|
|
172
|
+
// JSON array. A stray object, truncated JSON, or garbage text is
|
|
173
|
+
// fail-closed — never manufactured into "everything confirmed".
|
|
174
|
+
if (!Array.isArray(parsedJson)) {
|
|
175
|
+
return { ...FAIL_CLOSED_RESULT };
|
|
176
|
+
}
|
|
177
|
+
const verdictEntries = parsedJson.filter((item) => typeof item === "object" && item !== null);
|
|
178
|
+
const bucketed = new Set();
|
|
179
|
+
const verified = [];
|
|
180
|
+
const downgraded = [];
|
|
181
|
+
const dropped = [];
|
|
182
|
+
for (const entry of verdictEntries) {
|
|
183
|
+
const finding = resolveFindingRef(entry, inputFindings);
|
|
184
|
+
if (!finding || bucketed.has(finding))
|
|
185
|
+
continue;
|
|
186
|
+
const verdict = typeof entry.verdict === "string" ? entry.verdict : undefined;
|
|
187
|
+
if (verdict === "confirmed") {
|
|
188
|
+
verified.push(finding);
|
|
189
|
+
bucketed.add(finding);
|
|
190
|
+
}
|
|
191
|
+
else if (verdict === "downgraded") {
|
|
192
|
+
downgraded.push(finding);
|
|
193
|
+
bucketed.add(finding);
|
|
194
|
+
}
|
|
195
|
+
else if (verdict === "disproved") {
|
|
196
|
+
dropped.push(finding);
|
|
197
|
+
bucketed.add(finding);
|
|
198
|
+
}
|
|
199
|
+
// Any unrecognized/missing verdict value leaves the finding unaddressed —
|
|
200
|
+
// it falls through to the fail-closed default loop below (verified).
|
|
201
|
+
}
|
|
202
|
+
// Fail-closed: a finding never addressed by a matched, recognized verdict
|
|
203
|
+
// (missing entry, unmatched index/signature, unrecognized verdict string)
|
|
204
|
+
// defaults to `verified` — never silently dropped.
|
|
205
|
+
for (const finding of inputFindings) {
|
|
206
|
+
if (!bucketed.has(finding))
|
|
207
|
+
verified.push(finding);
|
|
208
|
+
}
|
|
209
|
+
return { verified, downgraded, dropped, ran: true };
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Resolves a verdict entry back to the SAME `SecurityFinding` object
|
|
213
|
+
* reference from `inputFindings` (by 0-based `index`, then `signatureId`,
|
|
214
|
+
* then `path`+`line` in its evidence). Identity-preserving on purpose: the
|
|
215
|
+
* fold in `security-auditor-agent.ts` matches by object identity against the
|
|
216
|
+
* finder's own `critical`/`important` arrays.
|
|
217
|
+
*/
|
|
218
|
+
function resolveFindingRef(entry, inputFindings) {
|
|
219
|
+
if (typeof entry.index === "number" && Number.isInteger(entry.index)) {
|
|
220
|
+
return inputFindings[entry.index];
|
|
221
|
+
}
|
|
222
|
+
if (typeof entry.signatureId === "string" && entry.signatureId.length > 0) {
|
|
223
|
+
return inputFindings.find((f) => f.signatureId === entry.signatureId);
|
|
224
|
+
}
|
|
225
|
+
if (typeof entry.path === "string" && typeof entry.line === "number") {
|
|
226
|
+
return inputFindings.find((f) => f.evidence.some((e) => e.path === entry.path && e.line === entry.line));
|
|
227
|
+
}
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=security-verifier-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-verifier-agent.js","sourceRoot":"","sources":["../../src/orchestrator/security-verifier-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Message } from "../providers/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Mirrors the `Message` union (providers/types.ts:135-139). Variant order
|
|
5
|
+
* matters — see the ordering note above. Keep this schema in sync if the
|
|
6
|
+
* `Message` union ever changes shape.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MessageSchema: z.ZodType<Message>;
|
|
9
|
+
export declare const SessionRecordSchema: z.ZodObject<{
|
|
10
|
+
sessionId: z.ZodString;
|
|
11
|
+
model: z.ZodString;
|
|
12
|
+
createdAt: z.ZodString;
|
|
13
|
+
updatedAt: z.ZodString;
|
|
14
|
+
turnsUsed: z.ZodNumber;
|
|
15
|
+
messages: z.ZodArray<z.ZodType<Message, z.ZodTypeDef, Message>, "many">;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
createdAt: string;
|
|
18
|
+
model: string;
|
|
19
|
+
updatedAt: string;
|
|
20
|
+
messages: Message[];
|
|
21
|
+
turnsUsed: number;
|
|
22
|
+
sessionId: string;
|
|
23
|
+
}, {
|
|
24
|
+
createdAt: string;
|
|
25
|
+
model: string;
|
|
26
|
+
updatedAt: string;
|
|
27
|
+
messages: Message[];
|
|
28
|
+
turnsUsed: number;
|
|
29
|
+
sessionId: string;
|
|
30
|
+
}>;
|
|
31
|
+
export type SessionRecord = z.infer<typeof SessionRecordSchema>;
|
|
32
|
+
/**
|
|
33
|
+
* Input to `SessionStore.save` — `createdAt`/`updatedAt` are stamped
|
|
34
|
+
* internally from the store's injected clock, so callers never read the
|
|
35
|
+
* clock themselves (no argless `new Date()` in core).
|
|
36
|
+
*/
|
|
37
|
+
export type SessionSaveInput = Omit<SessionRecord, "createdAt" | "updatedAt">;
|
|
38
|
+
/**
|
|
39
|
+
* Derive a deterministic fork id from a source `sessionId` + an injected
|
|
40
|
+
* timestamp. Mirrors `job-store.ts`'s `jobId()` content-hash pattern — no
|
|
41
|
+
* argless `randomUUID()`/`Date.now()`. Used by `forkSession()`
|
|
42
|
+
* (agentic-loop.ts) when the caller omits an explicit `newId`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function sessionForkId(sessionId: string, now: string): string;
|
|
45
|
+
export interface SessionStoreOptions {
|
|
46
|
+
/** Absolute project root; sessions are written under `<projectRoot>/.bober/sessions/`. */
|
|
47
|
+
projectRoot: string;
|
|
48
|
+
/** Clock injection. Defaults to `() => new Date().toISOString()`. No argless `new Date()` in core. */
|
|
49
|
+
now?: () => string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Persists agentic-loop transcripts to `.bober/sessions/<sessionId>.json`.
|
|
53
|
+
* Mirrors `src/research/job-store.ts`: validates with Zod before every
|
|
54
|
+
* write; reads return `null` on both missing AND malformed JSON (never
|
|
55
|
+
* throws) — this is what lets `resumeSession` fail soft (sc-6-5).
|
|
56
|
+
*/
|
|
57
|
+
export declare class SessionStore {
|
|
58
|
+
private readonly projectRoot;
|
|
59
|
+
private readonly clock;
|
|
60
|
+
constructor(opts: SessionStoreOptions);
|
|
61
|
+
/** Current time from the injected clock — exposed for deterministic fork-id derivation. */
|
|
62
|
+
now(): string;
|
|
63
|
+
/** Absolute path to the session file for `sessionId`. */
|
|
64
|
+
path(sessionId: string): string;
|
|
65
|
+
/**
|
|
66
|
+
* Persist a session record. Validates with `SessionRecordSchema` before
|
|
67
|
+
* writing so an invalid record never reaches disk (mirrors job-store.ts).
|
|
68
|
+
* `createdAt` is preserved from the existing file on disk when one exists
|
|
69
|
+
* (first save for a given `sessionId` stamps it fresh); `updatedAt` is
|
|
70
|
+
* always stamped fresh from the injected clock.
|
|
71
|
+
*
|
|
72
|
+
* bober: re-reads the existing file on every save to preserve `createdAt`
|
|
73
|
+
* — an O(1) extra read per turn, fine at this scale. If this ever needs to
|
|
74
|
+
* avoid the extra read, cache `createdAt` in-memory in the caller (the
|
|
75
|
+
* loop already holds a `session` handle across turns) and pass it through
|
|
76
|
+
* explicitly instead.
|
|
77
|
+
*/
|
|
78
|
+
save(record: SessionSaveInput): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Load a session record by id. Returns `null` if not found or malformed —
|
|
81
|
+
* NEVER throws. This null-on-corrupt result is what `resumeSession` maps
|
|
82
|
+
* to its typed `{ error }` result (sc-6-5); a corrupt file is never
|
|
83
|
+
* silently overwritten with an empty session.
|
|
84
|
+
*/
|
|
85
|
+
load(sessionId: string): Promise<SessionRecord | null>;
|
|
86
|
+
/**
|
|
87
|
+
* Copy the transcript at `sessionId` into a new session file under
|
|
88
|
+
* `newId`. Writes ONLY the new file — the source is only ever read, never
|
|
89
|
+
* rewritten, so continuing the fork leaves the original byte-identical
|
|
90
|
+
* (sc-6-3). Throws if the source session does not exist or is corrupt
|
|
91
|
+
* (nothing to fork).
|
|
92
|
+
*/
|
|
93
|
+
fork(sessionId: string, newId: string): Promise<string>;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=session-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/orchestrator/session-store.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AA+CrD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAK3C,CAAC;AAIH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;EAO9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,WAAW,CAAC,CAAC;AAgB9E;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpE;AAID,MAAM,WAAW,mBAAmB;IAClC,0FAA0F;IAC1F,WAAW,EAAE,MAAM,CAAC;IACpB,sGAAsG;IACtG,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,IAAI,EAAE,mBAAmB;IAKrC,2FAA2F;IAC3F,GAAG,IAAI,MAAM;IAIb,yDAAyD;IACzD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI/B;;;;;;;;;;;;OAYG;IACG,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnD;;;;;OAKG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAY5D;;;;;;OAMG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAiB9D"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// ── session-store.ts ────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Persists the own agentic loop's provider-agnostic transcript (`Message[]`)
|
|
4
|
+
// to `.bober/sessions/<sessionId>.json`, opt-in via `AgenticLoopParams.session`
|
|
5
|
+
// (agent-loop-capability-port sprint 6). Mirrors `src/research/job-store.ts`:
|
|
6
|
+
// `ensureDir`, Zod `safeParse`-before-write, `JSON.parse`+`safeParse`-on-read
|
|
7
|
+
// returning `null` on missing OR malformed (never throws), async fs only.
|
|
8
|
+
//
|
|
9
|
+
// NOT the same layer as `src/chat/conversation-store.ts` (`.bober/chat/`,
|
|
10
|
+
// chat `/resume`) or do-bridge's `sessionId` (a spawned-run id,
|
|
11
|
+
// `do-<findingId>`) — this store is model-context transcript resume/fork for
|
|
12
|
+
// the own loop. Keep the names distinct (see this sprint's contract nonGoals).
|
|
13
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
14
|
+
import { createHash } from "node:crypto";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { z } from "zod";
|
|
17
|
+
import { ensureDir } from "../state/helpers.js";
|
|
18
|
+
// ── Zod mirror of the Message union (providers/types.ts:135-139) ──────
|
|
19
|
+
//
|
|
20
|
+
// There is no existing Zod schema for `Message` in the codebase — authored
|
|
21
|
+
// here. IMPORTANT: `z.union` tries variants in order and returns the FIRST
|
|
22
|
+
// match. `AssistantMessage {role:"assistant",content,toolCalls}` and
|
|
23
|
+
// `TextMessage {role:"assistant",content}` overlap on `{role,content}` (zod
|
|
24
|
+
// objects are non-strict by default, so an extra key like `toolCalls` is
|
|
25
|
+
// simply allowed/stripped by the less-specific schema). `AssistantMessageSchema`
|
|
26
|
+
// MUST come before `TextMessageSchema` in the union below, or an assistant
|
|
27
|
+
// message WITH `toolCalls` silently loses them on round-trip.
|
|
28
|
+
const ToolCallSchema = z.object({
|
|
29
|
+
id: z.string(),
|
|
30
|
+
name: z.string(),
|
|
31
|
+
input: z.record(z.string(), z.unknown()),
|
|
32
|
+
});
|
|
33
|
+
const ToolResultSchema = z.object({
|
|
34
|
+
toolUseId: z.string(),
|
|
35
|
+
content: z.string(),
|
|
36
|
+
isError: z.boolean().optional(),
|
|
37
|
+
});
|
|
38
|
+
const AssistantMessageSchema = z.object({
|
|
39
|
+
role: z.literal("assistant"),
|
|
40
|
+
content: z.string(),
|
|
41
|
+
toolCalls: z.array(ToolCallSchema),
|
|
42
|
+
});
|
|
43
|
+
const ToolResultMessageSchema = z.object({
|
|
44
|
+
role: z.literal("user"),
|
|
45
|
+
toolResults: z.array(ToolResultSchema),
|
|
46
|
+
});
|
|
47
|
+
const SystemUpdateMessageSchema = z.object({
|
|
48
|
+
role: z.literal("user"),
|
|
49
|
+
systemUpdate: z.string(),
|
|
50
|
+
cacheTtl: z.enum(["5m", "1h"]).optional(),
|
|
51
|
+
});
|
|
52
|
+
const TextMessageSchema = z.object({
|
|
53
|
+
role: z.enum(["user", "assistant"]),
|
|
54
|
+
content: z.string(),
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Mirrors the `Message` union (providers/types.ts:135-139). Variant order
|
|
58
|
+
* matters — see the ordering note above. Keep this schema in sync if the
|
|
59
|
+
* `Message` union ever changes shape.
|
|
60
|
+
*/
|
|
61
|
+
export const MessageSchema = z.union([
|
|
62
|
+
AssistantMessageSchema,
|
|
63
|
+
ToolResultMessageSchema,
|
|
64
|
+
SystemUpdateMessageSchema,
|
|
65
|
+
TextMessageSchema,
|
|
66
|
+
]);
|
|
67
|
+
// ── SessionRecord ───────────────────────────────────────────────────────
|
|
68
|
+
export const SessionRecordSchema = z.object({
|
|
69
|
+
sessionId: z.string().min(1),
|
|
70
|
+
model: z.string(),
|
|
71
|
+
createdAt: z.string().datetime(),
|
|
72
|
+
updatedAt: z.string().datetime(),
|
|
73
|
+
turnsUsed: z.number().int().nonnegative(),
|
|
74
|
+
messages: z.array(MessageSchema),
|
|
75
|
+
});
|
|
76
|
+
// ── Path helpers ──────────────────────────────────────────────────────
|
|
77
|
+
const SESSIONS_DIR = ".bober/sessions";
|
|
78
|
+
function sessionsDir(projectRoot) {
|
|
79
|
+
return join(projectRoot, SESSIONS_DIR);
|
|
80
|
+
}
|
|
81
|
+
function sanitizeId(id) {
|
|
82
|
+
return id.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
83
|
+
}
|
|
84
|
+
// ── Deterministic fork id ───────────────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Derive a deterministic fork id from a source `sessionId` + an injected
|
|
87
|
+
* timestamp. Mirrors `job-store.ts`'s `jobId()` content-hash pattern — no
|
|
88
|
+
* argless `randomUUID()`/`Date.now()`. Used by `forkSession()`
|
|
89
|
+
* (agentic-loop.ts) when the caller omits an explicit `newId`.
|
|
90
|
+
*/
|
|
91
|
+
export function sessionForkId(sessionId, now) {
|
|
92
|
+
return createHash("sha256")
|
|
93
|
+
.update(`${sessionId}|fork|${now}`)
|
|
94
|
+
.digest("hex")
|
|
95
|
+
.slice(0, 16);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Persists agentic-loop transcripts to `.bober/sessions/<sessionId>.json`.
|
|
99
|
+
* Mirrors `src/research/job-store.ts`: validates with Zod before every
|
|
100
|
+
* write; reads return `null` on both missing AND malformed JSON (never
|
|
101
|
+
* throws) — this is what lets `resumeSession` fail soft (sc-6-5).
|
|
102
|
+
*/
|
|
103
|
+
export class SessionStore {
|
|
104
|
+
projectRoot;
|
|
105
|
+
clock;
|
|
106
|
+
constructor(opts) {
|
|
107
|
+
this.projectRoot = opts.projectRoot;
|
|
108
|
+
this.clock = opts.now ?? (() => new Date().toISOString());
|
|
109
|
+
}
|
|
110
|
+
/** Current time from the injected clock — exposed for deterministic fork-id derivation. */
|
|
111
|
+
now() {
|
|
112
|
+
return this.clock();
|
|
113
|
+
}
|
|
114
|
+
/** Absolute path to the session file for `sessionId`. */
|
|
115
|
+
path(sessionId) {
|
|
116
|
+
return join(sessionsDir(this.projectRoot), `${sanitizeId(sessionId)}.json`);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Persist a session record. Validates with `SessionRecordSchema` before
|
|
120
|
+
* writing so an invalid record never reaches disk (mirrors job-store.ts).
|
|
121
|
+
* `createdAt` is preserved from the existing file on disk when one exists
|
|
122
|
+
* (first save for a given `sessionId` stamps it fresh); `updatedAt` is
|
|
123
|
+
* always stamped fresh from the injected clock.
|
|
124
|
+
*
|
|
125
|
+
* bober: re-reads the existing file on every save to preserve `createdAt`
|
|
126
|
+
* — an O(1) extra read per turn, fine at this scale. If this ever needs to
|
|
127
|
+
* avoid the extra read, cache `createdAt` in-memory in the caller (the
|
|
128
|
+
* loop already holds a `session` handle across turns) and pass it through
|
|
129
|
+
* explicitly instead.
|
|
130
|
+
*/
|
|
131
|
+
async save(record) {
|
|
132
|
+
await ensureDir(sessionsDir(this.projectRoot));
|
|
133
|
+
const existing = await this.load(record.sessionId);
|
|
134
|
+
const now = this.clock();
|
|
135
|
+
const full = {
|
|
136
|
+
...record,
|
|
137
|
+
createdAt: existing?.createdAt ?? now,
|
|
138
|
+
updatedAt: now,
|
|
139
|
+
};
|
|
140
|
+
const validation = SessionRecordSchema.safeParse(full);
|
|
141
|
+
if (!validation.success) {
|
|
142
|
+
const issues = validation.error.issues
|
|
143
|
+
.map((i) => ` - ${i.path.join(".")}: ${i.message}`)
|
|
144
|
+
.join("\n");
|
|
145
|
+
throw new Error(`Invalid session record:\n${issues}`);
|
|
146
|
+
}
|
|
147
|
+
await writeFile(this.path(record.sessionId), JSON.stringify(validation.data, null, 2) + "\n", "utf-8");
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Load a session record by id. Returns `null` if not found or malformed —
|
|
151
|
+
* NEVER throws. This null-on-corrupt result is what `resumeSession` maps
|
|
152
|
+
* to its typed `{ error }` result (sc-6-5); a corrupt file is never
|
|
153
|
+
* silently overwritten with an empty session.
|
|
154
|
+
*/
|
|
155
|
+
async load(sessionId) {
|
|
156
|
+
try {
|
|
157
|
+
const raw = JSON.parse(await readFile(this.path(sessionId), "utf-8"));
|
|
158
|
+
const result = SessionRecordSchema.safeParse(raw);
|
|
159
|
+
return result.success ? result.data : null;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Copy the transcript at `sessionId` into a new session file under
|
|
167
|
+
* `newId`. Writes ONLY the new file — the source is only ever read, never
|
|
168
|
+
* rewritten, so continuing the fork leaves the original byte-identical
|
|
169
|
+
* (sc-6-3). Throws if the source session does not exist or is corrupt
|
|
170
|
+
* (nothing to fork).
|
|
171
|
+
*/
|
|
172
|
+
async fork(sessionId, newId) {
|
|
173
|
+
const source = await this.load(sessionId);
|
|
174
|
+
if (!source) {
|
|
175
|
+
throw new Error(`Cannot fork session '${sessionId}': not found or corrupt.`);
|
|
176
|
+
}
|
|
177
|
+
await this.save({
|
|
178
|
+
sessionId: newId,
|
|
179
|
+
model: source.model,
|
|
180
|
+
turnsUsed: source.turnsUsed,
|
|
181
|
+
messages: source.messages,
|
|
182
|
+
});
|
|
183
|
+
return newId;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=session-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/orchestrator/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { VulnClass } from "./security-audit-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Every VulnClass value (security-audit-types.ts:9-25, widened sprint-1 of
|
|
4
|
+
* spec-20260714-security-auditor-per-stack-skills). The taxonomy does not
|
|
5
|
+
* vary by stack — it is the fixed classification backbone every audit is
|
|
6
|
+
* organised against. Must stay in lockstep with the VulnClass union — see
|
|
7
|
+
* security-audit-types.test.ts's lockstep assertion.
|
|
8
|
+
*
|
|
9
|
+
* The stack -> skill resolver that used to live in this file (detectStack,
|
|
10
|
+
* extractSecurityExcerpt, readSkillSecurityExcerpt, resolveStackSecurityContext,
|
|
11
|
+
* STACK_SKILL_MAP) has moved to src/orchestrator/security-knowledge/ (registry.ts,
|
|
12
|
+
* index.ts, selector.ts, resolver.ts) — a retrieval pipeline over the 8 authored
|
|
13
|
+
* skill files, replacing the old head-excerpt approach (G3). This constant is
|
|
14
|
+
* kept here because several unrelated modules import it from this path.
|
|
15
|
+
*/
|
|
16
|
+
export declare const ALL_VULN_CLASSES: VulnClass[];
|
|
17
|
+
//# sourceMappingURL=stack-knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-knowledge.d.ts","sourceRoot":"","sources":["../../src/orchestrator/stack-knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAI3D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,EAkBvC,CAAC"}
|