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,48 @@
|
|
|
1
|
+
/** Local-first RFC 5545 (.ics) connector — materializes a plan to disk with ZERO network egress. */
|
|
2
|
+
import { writeFile } from "node:fs/promises";
|
|
3
|
+
import { readBusyIntervalsFromFile } from "./finding-source.js";
|
|
4
|
+
// ── ISO → RFC 5545 UTC basic-format ───────────────────────────────────
|
|
5
|
+
/** "2026-06-29T08:30:00.000Z" → "20260629T083000Z" (deterministic, no locale). */
|
|
6
|
+
function toIcsUtc(iso) {
|
|
7
|
+
return new Date(iso).toISOString().replace(/[-:]/g, "").replace(/\.\d{3}Z$/, "Z");
|
|
8
|
+
}
|
|
9
|
+
// ── RFC 5545 TEXT escaping (3.3.11) ───────────────────────────────────
|
|
10
|
+
/** Escape backslash FIRST, then newline, comma, semicolon. */
|
|
11
|
+
function escapeText(s) {
|
|
12
|
+
return s
|
|
13
|
+
.replace(/\\/g, "\\\\")
|
|
14
|
+
.replace(/\n/g, "\\n")
|
|
15
|
+
.replace(/,/g, "\\,")
|
|
16
|
+
.replace(/;/g, "\\;");
|
|
17
|
+
}
|
|
18
|
+
// ── VEVENT / VCALENDAR serialization ──────────────────────────────────
|
|
19
|
+
const CRLF = "\r\n";
|
|
20
|
+
function serializePlan(items, dtstampIso) {
|
|
21
|
+
const lines = [
|
|
22
|
+
"BEGIN:VCALENDAR",
|
|
23
|
+
"VERSION:2.0",
|
|
24
|
+
"PRODID:-//agent-bober//calendar-planner//EN",
|
|
25
|
+
];
|
|
26
|
+
const dtstamp = toIcsUtc(dtstampIso);
|
|
27
|
+
for (const item of items) {
|
|
28
|
+
lines.push("BEGIN:VEVENT", `UID:${item.findingId}@agent-bober`, `DTSTAMP:${dtstamp}`, `DTSTART:${toIcsUtc(item.startIso)}`, `DTEND:${toIcsUtc(item.endIso)}`, `SUMMARY:${escapeText(item.title)}`, "END:VEVENT");
|
|
29
|
+
}
|
|
30
|
+
lines.push("END:VCALENDAR");
|
|
31
|
+
return lines.join(CRLF) + CRLF; // trailing CRLF per spec
|
|
32
|
+
}
|
|
33
|
+
export function createIcsConnector(opts) {
|
|
34
|
+
return {
|
|
35
|
+
name: "ics",
|
|
36
|
+
async readFreeBusy(_window) {
|
|
37
|
+
if (opts.freeBusyPath === undefined)
|
|
38
|
+
return [];
|
|
39
|
+
return readBusyIntervalsFromFile(opts.freeBusyPath); // node:fs/promises only
|
|
40
|
+
},
|
|
41
|
+
async writeEvents(items) {
|
|
42
|
+
const ics = serializePlan(items, opts.nowIso ?? new Date().toISOString());
|
|
43
|
+
await writeFile(opts.outPath, ics, "utf-8");
|
|
44
|
+
return { writtenCount: items.length, target: opts.outPath };
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ics-connector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ics-connector.js","sourceRoot":"","sources":["../../src/calendar/ics-connector.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAEpG,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAIhE,yEAAyE;AAEzE,kFAAkF;AAClF,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACpF,CAAC;AAED,yEAAyE;AAEzE,8DAA8D;AAC9D,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,yEAAyE;AAEzE,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,SAAS,aAAa,CAAC,KAAiB,EAAE,UAAkB;IAC1D,MAAM,KAAK,GAAa;QACtB,iBAAiB;QACjB,aAAa;QACb,6CAA6C;KAC9C,CAAC;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CACR,cAAc,EACd,OAAO,IAAI,CAAC,SAAS,cAAc,EACnC,WAAW,OAAO,EAAE,EACpB,WAAW,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EACpC,SAAS,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAChC,WAAW,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EACnC,YAAY,CACb,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,yBAAyB;AAC3D,CAAC;AAaD,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IAC1D,OAAO;QACL,IAAI,EAAE,KAAK;QACX,KAAK,CAAC,YAAY,CAAC,OAAuB;YACxC,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;gBAAE,OAAO,EAAE,CAAC;YAC/C,OAAO,yBAAyB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,wBAAwB;QAC/E,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,KAAiB;YACjC,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1E,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YAC5C,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9D,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendar approval gate — propose (write pending marker, ZERO events) →
|
|
3
|
+
* approve out-of-band → apply (writeEvents exactly once) → adjust (pure re-slot).
|
|
4
|
+
*
|
|
5
|
+
* Reuses src/state/approval-state.ts for marker storage — no new approval mechanism.
|
|
6
|
+
* checkpointId convention: `calendar-${planId}` mirrors do-bridge's `promote-${findingId}`
|
|
7
|
+
* so the existing `bober approve calendar-<id>` / `/approve calendar-<id>` flows work
|
|
8
|
+
* with zero new wiring.
|
|
9
|
+
*
|
|
10
|
+
* ALL filesystem writes (pending marker, plan sidecar) live in this module.
|
|
11
|
+
* src/cli/commands/calendar.ts MUST NOT import writeFile — the Sprint-1 source-scan
|
|
12
|
+
* test (calendar.test.ts:129-141) enforces this.
|
|
13
|
+
*/
|
|
14
|
+
import type { CalendarConnector } from "./connector.js";
|
|
15
|
+
import type { Finding, BusyInterval, SlotConstraints, ProposedPlan } from "./types.js";
|
|
16
|
+
/** Arguments for proposePlan — all I/O dependencies are injected for testability. */
|
|
17
|
+
export interface ProposeArgs {
|
|
18
|
+
/** Absolute project root (used for .bober/approvals and .bober/calendar paths). */
|
|
19
|
+
projectRoot: string;
|
|
20
|
+
/** Plan id — checkpointId = `calendar-${planId}`. */
|
|
21
|
+
planId: string;
|
|
22
|
+
/** The proposed plan from planSlots. */
|
|
23
|
+
plan: ProposedPlan;
|
|
24
|
+
/** Name of the chosen connector (informational; stored in sidecar). */
|
|
25
|
+
connectorName: string;
|
|
26
|
+
/** Clock injection — returns an ISO string. */
|
|
27
|
+
now: () => string;
|
|
28
|
+
/** Timeout in ms before the pending marker expires. Default 24 hours. */
|
|
29
|
+
timeoutMs?: number;
|
|
30
|
+
}
|
|
31
|
+
export type ApplyOutcome = {
|
|
32
|
+
status: "applied";
|
|
33
|
+
writtenCount: number;
|
|
34
|
+
} | {
|
|
35
|
+
status: "rejected";
|
|
36
|
+
feedback?: string;
|
|
37
|
+
} | {
|
|
38
|
+
status: "pending";
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* A constraint delta for adjustPlan — models a /tell-style user correction.
|
|
42
|
+
* Note: SlotConstraints has no `excludeInterval` field; model exclusions by appending
|
|
43
|
+
* a BusyInterval to the busy[] array (do NOT add new fields to SlotConstraints).
|
|
44
|
+
*/
|
|
45
|
+
export interface ConstraintDelta {
|
|
46
|
+
/** Appended to busy[] to model an excluded interval. */
|
|
47
|
+
excludeInterval?: BusyInterval;
|
|
48
|
+
/** Shift the planning window start. */
|
|
49
|
+
windowStartIso?: string;
|
|
50
|
+
/** Shift the planning window end. */
|
|
51
|
+
windowEndIso?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Write a pending approval marker + plan sidecar for the proposed schedule.
|
|
55
|
+
* Calls ZERO connector.writeEvents — approval is strictly out-of-band.
|
|
56
|
+
*
|
|
57
|
+
* All filesystem writes live here:
|
|
58
|
+
* 1. Plan sidecar (.bober/calendar/<id>.plan.json) — holds ProposedPlan + connectorName.
|
|
59
|
+
* 2. Pending marker (.bober/approvals/<id>.pending.json) — artifact.path → sidecar.
|
|
60
|
+
*/
|
|
61
|
+
export declare function proposePlan(args: ProposeArgs): Promise<{
|
|
62
|
+
checkpointId: string;
|
|
63
|
+
}>;
|
|
64
|
+
/**
|
|
65
|
+
* Gate on the approval marker; on approval reload the plan sidecar and call
|
|
66
|
+
* connector.writeEvents exactly once; on rejection skip the write entirely.
|
|
67
|
+
*
|
|
68
|
+
* There is no readApproved/readRejected export from approval-state.ts.
|
|
69
|
+
* We detect the marker by building the path inline — mirrors the approach in
|
|
70
|
+
* src/cli/commands/approve.ts:41 and src/do-bridge/promote.ts:140-146.
|
|
71
|
+
*
|
|
72
|
+
* Note: deletePending is best-effort (never throws); gate control is based on
|
|
73
|
+
* the presence of the approved/rejected marker, not on the pending marker.
|
|
74
|
+
*/
|
|
75
|
+
export declare function applyPlan(projectRoot: string, checkpointId: string, connector: CalendarConnector): Promise<ApplyOutcome>;
|
|
76
|
+
/**
|
|
77
|
+
* PURE re-slot under a constraint delta — models a /tell-style user correction.
|
|
78
|
+
* Re-runs the Sprint-1 planSlots with a modified busy[] or window; writes NOTHING.
|
|
79
|
+
*
|
|
80
|
+
* Model an "exclude interval" by appending a BusyInterval (SlotConstraints has
|
|
81
|
+
* no excludeInterval field — do NOT add one).
|
|
82
|
+
*/
|
|
83
|
+
export declare function adjustPlan(findings: Finding[], busy: BusyInterval[], constraints: SlotConstraints, delta: ConstraintDelta): ProposedPlan;
|
|
84
|
+
//# sourceMappingURL=proposal-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-gate.d.ts","sourceRoot":"","sources":["../../src/calendar/proposal-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAiBvF,qFAAqF;AACrF,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,IAAI,EAAE,YAAY,CAAC;IACnB,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,MAAM,YAAY,GACpB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAI1B;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAsCtF;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC,YAAY,CAAC,CA8CvB;AAID;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,YAAY,EAAE,EACpB,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,eAAe,GACrB,YAAY,CAWd"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendar approval gate — propose (write pending marker, ZERO events) →
|
|
3
|
+
* approve out-of-band → apply (writeEvents exactly once) → adjust (pure re-slot).
|
|
4
|
+
*
|
|
5
|
+
* Reuses src/state/approval-state.ts for marker storage — no new approval mechanism.
|
|
6
|
+
* checkpointId convention: `calendar-${planId}` mirrors do-bridge's `promote-${findingId}`
|
|
7
|
+
* so the existing `bober approve calendar-<id>` / `/approve calendar-<id>` flows work
|
|
8
|
+
* with zero new wiring.
|
|
9
|
+
*
|
|
10
|
+
* ALL filesystem writes (pending marker, plan sidecar) live in this module.
|
|
11
|
+
* src/cli/commands/calendar.ts MUST NOT import writeFile — the Sprint-1 source-scan
|
|
12
|
+
* test (calendar.test.ts:129-141) enforces this.
|
|
13
|
+
*/
|
|
14
|
+
import { readFile, writeFile, readdir } from "node:fs/promises";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { savePending, deletePending } from "../state/approval-state.js";
|
|
17
|
+
import { ensureDir } from "../state/helpers.js";
|
|
18
|
+
import { planSlots } from "./slotter.js";
|
|
19
|
+
// ── Internal path helpers ─────────────────────────────────────────────
|
|
20
|
+
function planSidecarPath(projectRoot, checkpointId) {
|
|
21
|
+
return join(projectRoot, ".bober", "calendar", `${checkpointId}.plan.json`);
|
|
22
|
+
}
|
|
23
|
+
function approvalsDirPath(projectRoot) {
|
|
24
|
+
return join(projectRoot, ".bober", "approvals");
|
|
25
|
+
}
|
|
26
|
+
// ── proposePlan ───────────────────────────────────────────────────────
|
|
27
|
+
/**
|
|
28
|
+
* Write a pending approval marker + plan sidecar for the proposed schedule.
|
|
29
|
+
* Calls ZERO connector.writeEvents — approval is strictly out-of-band.
|
|
30
|
+
*
|
|
31
|
+
* All filesystem writes live here:
|
|
32
|
+
* 1. Plan sidecar (.bober/calendar/<id>.plan.json) — holds ProposedPlan + connectorName.
|
|
33
|
+
* 2. Pending marker (.bober/approvals/<id>.pending.json) — artifact.path → sidecar.
|
|
34
|
+
*/
|
|
35
|
+
export async function proposePlan(args) {
|
|
36
|
+
const { projectRoot, planId, plan, connectorName, now, timeoutMs = 24 * 60 * 60 * 1_000, } = args;
|
|
37
|
+
const checkpointId = `calendar-${planId}`;
|
|
38
|
+
const requestedAt = now();
|
|
39
|
+
const timeoutAt = new Date(Date.parse(requestedAt) + timeoutMs).toISOString();
|
|
40
|
+
// ── 1. Write plan sidecar (proposal-gate owns ALL fs writes) ─────────
|
|
41
|
+
const calendarDir = join(projectRoot, ".bober", "calendar");
|
|
42
|
+
await ensureDir(calendarDir);
|
|
43
|
+
const sidecarPath = planSidecarPath(projectRoot, checkpointId);
|
|
44
|
+
const sidecar = { plan, connectorName };
|
|
45
|
+
await writeFile(sidecarPath, JSON.stringify(sidecar, null, 2) + "\n", "utf-8");
|
|
46
|
+
// ── 2. Write the pending marker ───────────────────────────────────────
|
|
47
|
+
const scheduledCount = plan.scheduled.length;
|
|
48
|
+
const unscheduledCount = plan.unscheduled.length;
|
|
49
|
+
await savePending(projectRoot, {
|
|
50
|
+
checkpointId,
|
|
51
|
+
artifact: {
|
|
52
|
+
type: "calendar-plan",
|
|
53
|
+
path: sidecarPath,
|
|
54
|
+
summary: `${scheduledCount} event(s) scheduled via ${connectorName}; ${unscheduledCount} unscheduled`,
|
|
55
|
+
lines: scheduledCount,
|
|
56
|
+
},
|
|
57
|
+
prompt: `Calendar plan ready: ${scheduledCount} finding(s) scheduled. Run: bober calendar apply ${checkpointId}`,
|
|
58
|
+
requestedAt,
|
|
59
|
+
timeoutAt,
|
|
60
|
+
});
|
|
61
|
+
return { checkpointId };
|
|
62
|
+
}
|
|
63
|
+
// ── applyPlan ─────────────────────────────────────────────────────────
|
|
64
|
+
/**
|
|
65
|
+
* Gate on the approval marker; on approval reload the plan sidecar and call
|
|
66
|
+
* connector.writeEvents exactly once; on rejection skip the write entirely.
|
|
67
|
+
*
|
|
68
|
+
* There is no readApproved/readRejected export from approval-state.ts.
|
|
69
|
+
* We detect the marker by building the path inline — mirrors the approach in
|
|
70
|
+
* src/cli/commands/approve.ts:41 and src/do-bridge/promote.ts:140-146.
|
|
71
|
+
*
|
|
72
|
+
* Note: deletePending is best-effort (never throws); gate control is based on
|
|
73
|
+
* the presence of the approved/rejected marker, not on the pending marker.
|
|
74
|
+
*/
|
|
75
|
+
export async function applyPlan(projectRoot, checkpointId, connector) {
|
|
76
|
+
const approvalsDir = approvalsDirPath(projectRoot);
|
|
77
|
+
const entries = new Set(await readdir(approvalsDir).catch(() => []));
|
|
78
|
+
// ── Approved branch: writeEvents exactly once ─────────────────────
|
|
79
|
+
if (entries.has(`${checkpointId}.approved.json`)) {
|
|
80
|
+
// Reload the plan sidecar to recover the scheduled PlanItems
|
|
81
|
+
let sidecar;
|
|
82
|
+
try {
|
|
83
|
+
const raw = await readFile(planSidecarPath(projectRoot, checkpointId), "utf-8");
|
|
84
|
+
sidecar = JSON.parse(raw);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
throw new Error(`Failed to reload plan sidecar for ${checkpointId}: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
88
|
+
}
|
|
89
|
+
// Write events EXACTLY once
|
|
90
|
+
const result = await connector.writeEvents(sidecar.plan.scheduled);
|
|
91
|
+
// Clean up the pending marker (mirrors promote.ts:141)
|
|
92
|
+
await deletePending(projectRoot, checkpointId);
|
|
93
|
+
return { status: "applied", writtenCount: result.writtenCount };
|
|
94
|
+
}
|
|
95
|
+
// ── Rejected branch: no write ─────────────────────────────────────
|
|
96
|
+
if (entries.has(`${checkpointId}.rejected.json`)) {
|
|
97
|
+
try {
|
|
98
|
+
const raw = await readFile(join(approvalsDir, `${checkpointId}.rejected.json`), "utf-8");
|
|
99
|
+
const marker = JSON.parse(raw);
|
|
100
|
+
return { status: "rejected", feedback: marker.feedback };
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return { status: "rejected" };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ── Neither: still pending ────────────────────────────────────────
|
|
107
|
+
return { status: "pending" };
|
|
108
|
+
}
|
|
109
|
+
// ── adjustPlan ────────────────────────────────────────────────────────
|
|
110
|
+
/**
|
|
111
|
+
* PURE re-slot under a constraint delta — models a /tell-style user correction.
|
|
112
|
+
* Re-runs the Sprint-1 planSlots with a modified busy[] or window; writes NOTHING.
|
|
113
|
+
*
|
|
114
|
+
* Model an "exclude interval" by appending a BusyInterval (SlotConstraints has
|
|
115
|
+
* no excludeInterval field — do NOT add one).
|
|
116
|
+
*/
|
|
117
|
+
export function adjustPlan(findings, busy, constraints, delta) {
|
|
118
|
+
const newBusy = delta.excludeInterval !== undefined ? [...busy, delta.excludeInterval] : busy;
|
|
119
|
+
const newConstraints = {
|
|
120
|
+
...constraints,
|
|
121
|
+
...(delta.windowStartIso !== undefined ? { windowStartIso: delta.windowStartIso } : {}),
|
|
122
|
+
...(delta.windowEndIso !== undefined ? { windowEndIso: delta.windowEndIso } : {}),
|
|
123
|
+
};
|
|
124
|
+
return planSlots(findings, newBusy, newConstraints);
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=proposal-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-gate.js","sourceRoot":"","sources":["../../src/calendar/proposal-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CalendarSlotter — deterministic LLM-free slot-fill (spec-20260628-calendar-planner Sprint 1).
|
|
3
|
+
*
|
|
4
|
+
* PURITY CONTRACT: pure synchronous only — no fs, no network, no LLM import, no subprocess, no dynamic eval.
|
|
5
|
+
* Identical input => identical output.
|
|
6
|
+
*
|
|
7
|
+
* Algorithm:
|
|
8
|
+
* 1. Derive free intervals from (window minus busy intervals), clamped to workingHours if set.
|
|
9
|
+
* 2. Iterate findings in INPUT ORDER (pre-ranked by the hub — the LLM NEVER packs slots).
|
|
10
|
+
* 3. Place each finding into the earliest free interval that fits estDurationMin before dueBy.
|
|
11
|
+
* 4. On placement, split the consumed free interval in-place.
|
|
12
|
+
* 5. If no interval fits, push to unscheduled with an exhaustive-switch reason.
|
|
13
|
+
*
|
|
14
|
+
* Time math uses Date.parse(iso) → epoch-ms arithmetic (pure — same ISO always yields same ms).
|
|
15
|
+
* new Date(ms).toISOString() converts back to ISO-8601 (also pure — deterministic).
|
|
16
|
+
*/
|
|
17
|
+
import type { Finding, BusyInterval, SlotConstraints, ProposedPlan } from "./types.js";
|
|
18
|
+
/**
|
|
19
|
+
* Place ranked findings into free calendar slots deterministically.
|
|
20
|
+
*
|
|
21
|
+
* - findings are processed in INPUT ORDER (= priority order from the hub).
|
|
22
|
+
* - Each finding is placed into the earliest free interval that can accommodate
|
|
23
|
+
* its estDurationMin (default: 30 min) entirely before its dueBy.
|
|
24
|
+
* - On placement the consumed portion is removed from the free-interval list.
|
|
25
|
+
* - Findings that cannot be placed are returned in unscheduled[] with a reason.
|
|
26
|
+
* - No LLM, no network, no fs, no clock — deterministic across identical inputs.
|
|
27
|
+
*
|
|
28
|
+
* @param findings - Pre-ranked Finding array (index 0 = highest priority).
|
|
29
|
+
* @param busy - Known busy intervals for the planning window.
|
|
30
|
+
* @param constraints - Window bounds (and optional working-hours clamp).
|
|
31
|
+
* @returns ProposedPlan with scheduled PlanItems and unscheduled entries.
|
|
32
|
+
*/
|
|
33
|
+
export declare function planSlots(findings: Finding[], busy: BusyInterval[], constraints: SlotConstraints): ProposedPlan;
|
|
34
|
+
//# sourceMappingURL=slotter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slotter.d.ts","sourceRoot":"","sources":["../../src/calendar/slotter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EAEZ,eAAe,EACf,YAAY,EAGb,MAAM,YAAY,CAAC;AAgIpB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,YAAY,EAAE,EACpB,WAAW,EAAE,eAAe,GAC3B,YAAY,CA8Ed"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CalendarSlotter — deterministic LLM-free slot-fill (spec-20260628-calendar-planner Sprint 1).
|
|
3
|
+
*
|
|
4
|
+
* PURITY CONTRACT: pure synchronous only — no fs, no network, no LLM import, no subprocess, no dynamic eval.
|
|
5
|
+
* Identical input => identical output.
|
|
6
|
+
*
|
|
7
|
+
* Algorithm:
|
|
8
|
+
* 1. Derive free intervals from (window minus busy intervals), clamped to workingHours if set.
|
|
9
|
+
* 2. Iterate findings in INPUT ORDER (pre-ranked by the hub — the LLM NEVER packs slots).
|
|
10
|
+
* 3. Place each finding into the earliest free interval that fits estDurationMin before dueBy.
|
|
11
|
+
* 4. On placement, split the consumed free interval in-place.
|
|
12
|
+
* 5. If no interval fits, push to unscheduled with an exhaustive-switch reason.
|
|
13
|
+
*
|
|
14
|
+
* Time math uses Date.parse(iso) → epoch-ms arithmetic (pure — same ISO always yields same ms).
|
|
15
|
+
* new Date(ms).toISOString() converts back to ISO-8601 (also pure — deterministic).
|
|
16
|
+
*/
|
|
17
|
+
// ── Internal helpers ──────────────────────────────────────────────────
|
|
18
|
+
/** Default duration when a finding lacks estDurationMin (minutes). */
|
|
19
|
+
const DEFAULT_DURATION_MIN = 30;
|
|
20
|
+
/** sentinel for "no deadline" (findings without dueBy). */
|
|
21
|
+
const NO_DEADLINE = Infinity;
|
|
22
|
+
/**
|
|
23
|
+
* Derive the free intervals in the window by subtracting busy intervals.
|
|
24
|
+
* Busy intervals are clipped to the window boundary before subtraction.
|
|
25
|
+
* If workingHours is provided, free intervals are further clamped per-day.
|
|
26
|
+
*/
|
|
27
|
+
function deriveFreeIntervals(constraints, busy) {
|
|
28
|
+
const windowStart = Date.parse(constraints.windowStartIso);
|
|
29
|
+
const windowEnd = Date.parse(constraints.windowEndIso);
|
|
30
|
+
// Clip and sort busy intervals to the window
|
|
31
|
+
const clippedBusy = busy
|
|
32
|
+
.map((b) => ({
|
|
33
|
+
start: Math.max(Date.parse(b.startIso), windowStart),
|
|
34
|
+
end: Math.min(Date.parse(b.endIso), windowEnd),
|
|
35
|
+
}))
|
|
36
|
+
.filter((b) => b.start < b.end) // discard intervals fully outside window
|
|
37
|
+
.sort((a, b) => a.start - b.start);
|
|
38
|
+
// Build free gaps by walking the sorted busy list
|
|
39
|
+
const free = [];
|
|
40
|
+
let cursor = windowStart;
|
|
41
|
+
for (const b of clippedBusy) {
|
|
42
|
+
if (b.start > cursor) {
|
|
43
|
+
free.push({
|
|
44
|
+
startIso: new Date(cursor).toISOString(),
|
|
45
|
+
endIso: new Date(b.start).toISOString(),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (b.end > cursor) {
|
|
49
|
+
cursor = b.end;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (cursor < windowEnd) {
|
|
53
|
+
free.push({
|
|
54
|
+
startIso: new Date(cursor).toISOString(),
|
|
55
|
+
endIso: new Date(windowEnd).toISOString(),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (constraints.workingHours === undefined) {
|
|
59
|
+
return free;
|
|
60
|
+
}
|
|
61
|
+
return clampToWorkingHours(free, constraints.workingHours.startHour, constraints.workingHours.endHour);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Clamp each free interval to the daily working hours window (UTC hours).
|
|
65
|
+
* Intervals that span multiple days are clamped per-day.
|
|
66
|
+
* A clamp that yields start >= end is discarded.
|
|
67
|
+
*
|
|
68
|
+
* Note: bober: single-day clamping; a free interval spanning midnight is split only
|
|
69
|
+
* for that calendar day. Multi-day spanning is handled by iterating days.
|
|
70
|
+
* Upgrade path: replace with a per-day iterator if multi-day windows become common.
|
|
71
|
+
*/
|
|
72
|
+
function clampToWorkingHours(intervals, startHour, endHour) {
|
|
73
|
+
const result = [];
|
|
74
|
+
for (const interval of intervals) {
|
|
75
|
+
const iStart = Date.parse(interval.startIso);
|
|
76
|
+
const iEnd = Date.parse(interval.endIso);
|
|
77
|
+
// Iterate day by day for multi-day intervals
|
|
78
|
+
let dayBase = iStart - (iStart % 86_400_000); // truncate to midnight UTC
|
|
79
|
+
while (dayBase < iEnd) {
|
|
80
|
+
const dayWorkStart = dayBase + startHour * 3_600_000;
|
|
81
|
+
const dayWorkEnd = dayBase + endHour * 3_600_000;
|
|
82
|
+
const clampedStart = Math.max(iStart, dayWorkStart);
|
|
83
|
+
const clampedEnd = Math.min(iEnd, dayWorkEnd);
|
|
84
|
+
if (clampedStart < clampedEnd) {
|
|
85
|
+
result.push({
|
|
86
|
+
startIso: new Date(clampedStart).toISOString(),
|
|
87
|
+
endIso: new Date(clampedEnd).toISOString(),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
dayBase += 86_400_000; // advance one day
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Produce a human-readable label for an UnscheduledReason.
|
|
97
|
+
*
|
|
98
|
+
* The exhaustive switch + never guard ensures that adding a new UnscheduledReason
|
|
99
|
+
* variant without a case here causes a TypeScript compile error (ADR-3 code-review gate).
|
|
100
|
+
*/
|
|
101
|
+
function labelUnscheduledReason(reason) {
|
|
102
|
+
switch (reason) {
|
|
103
|
+
case "does-not-fit":
|
|
104
|
+
return "no free slot large enough for the required duration";
|
|
105
|
+
case "no-free-slot-before-dueBy":
|
|
106
|
+
return "all free slots start at or after the due-by deadline";
|
|
107
|
+
default: {
|
|
108
|
+
// Exhaustive never guard: TypeScript will raise a compile error if a new
|
|
109
|
+
// UnscheduledReason variant is added without a matching case (ADR-3).
|
|
110
|
+
const _exhaustive = reason;
|
|
111
|
+
throw new Error(`Unhandled UnscheduledReason: ${String(_exhaustive)}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// ── Public entry (pure, synchronous) ──────────────────────────────────
|
|
116
|
+
/**
|
|
117
|
+
* Place ranked findings into free calendar slots deterministically.
|
|
118
|
+
*
|
|
119
|
+
* - findings are processed in INPUT ORDER (= priority order from the hub).
|
|
120
|
+
* - Each finding is placed into the earliest free interval that can accommodate
|
|
121
|
+
* its estDurationMin (default: 30 min) entirely before its dueBy.
|
|
122
|
+
* - On placement the consumed portion is removed from the free-interval list.
|
|
123
|
+
* - Findings that cannot be placed are returned in unscheduled[] with a reason.
|
|
124
|
+
* - No LLM, no network, no fs, no clock — deterministic across identical inputs.
|
|
125
|
+
*
|
|
126
|
+
* @param findings - Pre-ranked Finding array (index 0 = highest priority).
|
|
127
|
+
* @param busy - Known busy intervals for the planning window.
|
|
128
|
+
* @param constraints - Window bounds (and optional working-hours clamp).
|
|
129
|
+
* @returns ProposedPlan with scheduled PlanItems and unscheduled entries.
|
|
130
|
+
*/
|
|
131
|
+
export function planSlots(findings, busy, constraints) {
|
|
132
|
+
const freeIntervals = deriveFreeIntervals(constraints, busy);
|
|
133
|
+
const scheduled = [];
|
|
134
|
+
const unscheduled = [];
|
|
135
|
+
// Mutable epoch-ms copy of free intervals for in-place splitting
|
|
136
|
+
const free = freeIntervals.map((f) => ({
|
|
137
|
+
start: Date.parse(f.startIso),
|
|
138
|
+
end: Date.parse(f.endIso),
|
|
139
|
+
}));
|
|
140
|
+
for (const finding of findings) {
|
|
141
|
+
const durationMs = (finding.estDurationMin ?? DEFAULT_DURATION_MIN) * 60_000;
|
|
142
|
+
const dueByMs = finding.dueBy !== undefined ? Date.parse(finding.dueBy) : NO_DEADLINE;
|
|
143
|
+
let placed = false;
|
|
144
|
+
for (let i = 0; i < free.length; i++) {
|
|
145
|
+
const slot = free[i];
|
|
146
|
+
// Free intervals are sorted; once we pass dueBy no later slot can help
|
|
147
|
+
if (slot.start >= dueByMs) {
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
// Effective end: the slot end clamped to dueBy so the event finishes before deadline
|
|
151
|
+
const effectiveEnd = dueByMs === NO_DEADLINE ? slot.end : Math.min(slot.end, dueByMs);
|
|
152
|
+
const available = effectiveEnd - slot.start;
|
|
153
|
+
if (available >= durationMs) {
|
|
154
|
+
const itemStart = slot.start;
|
|
155
|
+
const itemEnd = itemStart + durationMs;
|
|
156
|
+
const planItem = {
|
|
157
|
+
findingId: finding.id,
|
|
158
|
+
title: finding.calendarSafeTitle ?? finding.title,
|
|
159
|
+
startIso: new Date(itemStart).toISOString(),
|
|
160
|
+
endIso: new Date(itemEnd).toISOString(),
|
|
161
|
+
// calendarSafeTitle threaded for cloud connectors (Sprint 3); undefined when absent.
|
|
162
|
+
calendarSafeTitle: finding.calendarSafeTitle,
|
|
163
|
+
};
|
|
164
|
+
scheduled.push(planItem);
|
|
165
|
+
// Split the consumed interval in-place
|
|
166
|
+
if (itemEnd < slot.end) {
|
|
167
|
+
// Shrink: shift the slot start forward
|
|
168
|
+
free[i] = { start: itemEnd, end: slot.end };
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Slot exactly consumed — remove it
|
|
172
|
+
free.splice(i, 1);
|
|
173
|
+
}
|
|
174
|
+
placed = true;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (!placed) {
|
|
179
|
+
// Determine reason: all free slots before dueBy were too small vs no slot before dueBy
|
|
180
|
+
let reason;
|
|
181
|
+
if (dueByMs !== NO_DEADLINE && !free.some((s) => s.start < dueByMs)) {
|
|
182
|
+
// There are free slots but none start before the deadline
|
|
183
|
+
reason = "no-free-slot-before-dueBy";
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// Either no deadline, or slots exist before dueBy but none are large enough
|
|
187
|
+
reason = "does-not-fit";
|
|
188
|
+
}
|
|
189
|
+
// Validate via the exhaustive switch (also surfaces the human-readable label for tests)
|
|
190
|
+
labelUnscheduledReason(reason);
|
|
191
|
+
unscheduled.push({ findingId: finding.id, reason });
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return { scheduled, unscheduled };
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=slotter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slotter.js","sourceRoot":"","sources":["../../src/calendar/slotter.ts"],"names":[],"mappings":"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"}
|