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 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/seo/adapters/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;qEACqE;AACrE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACpE;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAS/B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HttpClient — the SOLE provider-agnostic HTTP transport seam under
|
|
3
|
+
* `src/seo/` (spec-20260715-ultimate-seo-suite, Sprint 8; ADR-5).
|
|
4
|
+
*
|
|
5
|
+
* `src/seo/adapters/http.ts` is the ONLY file under `src/seo/` allowed to
|
|
6
|
+
* reference the global `fetch`. Every live adapter (`GscAdapter` this
|
|
7
|
+
* sprint, `DataForSeoAdapter` in Sprint 9) takes an injectable `HttpClient`
|
|
8
|
+
* constructor param defaulting to `defaultHttpClient`; tests inject a fake
|
|
9
|
+
* so no socket ever opens in CI. Mirrors the injectable-transport pattern
|
|
10
|
+
* in `src/medical/retrieval/medline-source.ts:37-39` and
|
|
11
|
+
* `src/medical/whoop/whoop-client.ts:40-52`, generalised to a
|
|
12
|
+
* `{method, headers, body}` request shape shared by both GSC and
|
|
13
|
+
* DataForSEO (both are plain JSON-over-HTTPS POST APIs).
|
|
14
|
+
*
|
|
15
|
+
* bober: no retry/backoff here — a thin request/response shim only. Each
|
|
16
|
+
* adapter owns its own error handling (429/5xx -> abstain) per
|
|
17
|
+
* ADR-5. Add shared retry logic only if a second adapter needs the
|
|
18
|
+
* exact same policy.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Default transport = global fetch. The sole global-fetch reference under
|
|
22
|
+
* `src/seo/`. Adapters take this as their default `http` constructor param;
|
|
23
|
+
* tests always inject a fake `HttpClient` instead.
|
|
24
|
+
*/
|
|
25
|
+
export const defaultHttpClient = {
|
|
26
|
+
async request(url, init) {
|
|
27
|
+
const res = await fetch(url, {
|
|
28
|
+
method: init.method,
|
|
29
|
+
headers: init.headers,
|
|
30
|
+
body: init.body,
|
|
31
|
+
});
|
|
32
|
+
return { ok: res.ok, status: res.status, json: () => res.json() };
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/seo/adapters/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAsBH;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAe;IAC3C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI;QACrB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;IACpE,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ai-visibility-provider.ts — the API-spine seam wiring (in-house-ai-
|
|
3
|
+
* visibility, Sprint 3, widened Sprint 4; arch-20260717-in-house-oss-ai-
|
|
4
|
+
* visibility-architecture.md:42,50-63,67-77,297-314; ADR-3, ADR-5).
|
|
5
|
+
*
|
|
6
|
+
* Mirrors `serp-provider.ts` in shape (a port implementer + a factory
|
|
7
|
+
* function living alongside the seam, `serp-provider.ts:55-64`): composes
|
|
8
|
+
* ONLY viable per-engine `ApiSpineEngineProvider` arms (Sprint 2) into an
|
|
9
|
+
* `AiVisibilityMultiplexer` and hands the result to `selectSource`, which
|
|
10
|
+
* routes it into the LOCKED `AiVisibilityAdapter` (`sources/ai-visibility-
|
|
11
|
+
* adapter.ts`) — the port, the `AiVisibilityRow` shape, and the adapter body
|
|
12
|
+
* are all untouched here (nonGoals).
|
|
13
|
+
*
|
|
14
|
+
* Sprint 4 adds the `CitationVerifier` + `ContentSanitizer` each arm needs
|
|
15
|
+
* (sc-4-3, sc-4-4 D1-Recommended): this is the SOLE production site that
|
|
16
|
+
* constructs `ApiSpineEngineProvider`, and `egress` is already in scope here
|
|
17
|
+
* (a parameter of this function), so a single `DamcrawlerCitationVerifier
|
|
18
|
+
* (egress)` is constructed once and shared across every arm — the verifier
|
|
19
|
+
* self-gates the `site-crawl` axis on every `verify()` call, so sharing one
|
|
20
|
+
* instance across engines is safe (it holds no per-arm state).
|
|
21
|
+
*
|
|
22
|
+
* The `ContentSanitizer` here wraps `defaultGroundedTextSanitizeFn` (below),
|
|
23
|
+
* NOT a damcrawler-backed `sanitize` export. Two reasons: (1) the text this
|
|
24
|
+
* boundary sanitizes — an LLM's grounded `answerText` + its citation urls —
|
|
25
|
+
* is NOT damcrawler-scraped, it comes straight from `GroundedSearchClient
|
|
26
|
+
* .search()`; damcrawler's `sanitize` remains the load-bearing sanitizer for
|
|
27
|
+
* the actual scraped citation BODY, inside `DamcrawlerCitationVerifier`
|
|
28
|
+
* itself, gated by `site-crawl` (`./sources/citation-verifier.ts`). (2)
|
|
29
|
+
* `ContentSanitizer` requires a SYNCHRONOUS `SanitizeFn`
|
|
30
|
+
* (`content-sanitizer.ts:29`), while any damcrawler export can only be
|
|
31
|
+
* reached via an ASYNC lazy `import()` — and this factory is itself
|
|
32
|
+
* synchronous (no `Promise` in its return type), so a damcrawler-backed
|
|
33
|
+
* sanitizer could not be constructed here even behind a gate. This second,
|
|
34
|
+
* always-on boundary is a genuine (not a no-op) layer: it strips recognized
|
|
35
|
+
* prompt-injection role/instruction markers the grounding LLM could echo
|
|
36
|
+
* back from a page it read during its own web search.
|
|
37
|
+
*
|
|
38
|
+
* No scrape arm, scorer, or LLM judge land in this module — those are later
|
|
39
|
+
* sprints (Sprint 8, 10 nonGoals). The Perplexity engine (Sprint 7,
|
|
40
|
+
* `PerplexitySonarClient`, `../providers/grounded-search.js`) composes
|
|
41
|
+
* automatically through the loop below once `deps.makeClient("perplexity")`
|
|
42
|
+
* returns a client — no logic change here was needed.
|
|
43
|
+
*/
|
|
44
|
+
import type { BoberConfig } from "../config/schema.js";
|
|
45
|
+
import type { SeoEgressGuard } from "./egress.js";
|
|
46
|
+
import type { AiVisibilityProvider } from "./sources/ai-visibility-adapter.js";
|
|
47
|
+
import type { AiVisibilityRow } from "./data-source.js";
|
|
48
|
+
import type { GroundedEngine, GroundedSearchClient } from "../providers/grounded-search.js";
|
|
49
|
+
import type { MentionCitationExtractor } from "./sources/mention-citation-extractor.js";
|
|
50
|
+
import type { LLMClient } from "../providers/types.js";
|
|
51
|
+
import type { ScrapeThrottle } from "./scrape-throttle.js";
|
|
52
|
+
import type { DamcrawlerScrapeLoader } from "./sources/scrape-arm-provider.js";
|
|
53
|
+
/**
|
|
54
|
+
* Default `SanitizeFn` for `ApiSpineEngineProvider`'s `answerText`/citation-
|
|
55
|
+
* url boundary (sc-4-3). `String.prototype.replace` resets a global
|
|
56
|
+
* pattern's `lastIndex` on every call, so reusing the shared, module-level
|
|
57
|
+
* `RegExp` instances across calls is safe.
|
|
58
|
+
*/
|
|
59
|
+
export declare function defaultGroundedTextSanitizeFn(raw: string): {
|
|
60
|
+
content: string;
|
|
61
|
+
hadThreats: boolean;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Injected seam (mirrors the `deps` shape in the architecture doc's
|
|
65
|
+
* `resolveAiVisibilityProvider` section). `makeClient` returns `undefined`
|
|
66
|
+
* when an engine has no usable key/credential — that arm is skipped
|
|
67
|
+
* entirely, never composed (the no-key viability check, ADR-3/ADR-5).
|
|
68
|
+
* Production wiring builds a real `LiveGroundedSearchClient` per keyed
|
|
69
|
+
* engine (`runner.ts`'s `defaultAiVisibilityDeps`); tests inject fakes so
|
|
70
|
+
* this factory — and every caller of it — stays network-free (sc-3-4).
|
|
71
|
+
*
|
|
72
|
+
* `scrapeThrottle` (Sprint 10) is OPTIONAL — `resolveAiVisibilityProvider`
|
|
73
|
+
* composes the damcrawler UI-scrape arm(s) ONLY when this dep is present AND
|
|
74
|
+
* the `ai-visibility-scrape` axis is on AND a matching engine is configured.
|
|
75
|
+
* As of Sprint 11, `defaultAiVisibilityDeps` (`../runner.ts`) constructs a
|
|
76
|
+
* REAL `ScrapeThrottle` from `config`/`projectRoot` in production — this dep
|
|
77
|
+
* is no longer test-only (sc-11-2).
|
|
78
|
+
*
|
|
79
|
+
* `makeJudgeLlm` (Sprint 11, sc-11-3) is OPTIONAL — when present AND
|
|
80
|
+
* `config.seo.aiVisibility.judge.enabled` is true, `resolveAiVisibilityProvider`
|
|
81
|
+
* wraps each API arm's extractor in a `LlmJudgeMentionCitationExtractor`
|
|
82
|
+
* built from the returned `{ client, model }`. Returning `undefined` (e.g.
|
|
83
|
+
* no API key) keeps the plain `deps.extractor` in use — no-key-safe, mirrors
|
|
84
|
+
* `makeClient`'s viability-check idiom.
|
|
85
|
+
*
|
|
86
|
+
* `scrapeLoad` (Sprint 11) is OPTIONAL test injection for the scrape arm's
|
|
87
|
+
* `DamcrawlerScrapeLoader` seam — `undefined` in production lets each
|
|
88
|
+
* `ScrapeArmEngineProvider` fall back to its own real lazy `damcrawler`
|
|
89
|
+
* import (`./sources/scrape-arm-provider.ts`'s `defaultLoader`); tests
|
|
90
|
+
* inject a fake module so a scrape-composition test never needs the real
|
|
91
|
+
* dependency installed.
|
|
92
|
+
*/
|
|
93
|
+
export interface AiVisibilityDeps {
|
|
94
|
+
makeClient: (engine: GroundedEngine) => GroundedSearchClient | undefined;
|
|
95
|
+
extractor: MentionCitationExtractor;
|
|
96
|
+
scrapeThrottle?: ScrapeThrottle;
|
|
97
|
+
makeJudgeLlm?: () => {
|
|
98
|
+
client: LLMClient;
|
|
99
|
+
model: string;
|
|
100
|
+
} | undefined;
|
|
101
|
+
scrapeLoad?: DamcrawlerScrapeLoader;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Fans one `probe()` call out to every configured arm and CONCATENATES
|
|
105
|
+
* their rows — arms are NEVER merged, cross-arm signal is never combined
|
|
106
|
+
* (architecture:44; each row already carries its own `provider` label, so a
|
|
107
|
+
* consumer can always tell which engine produced which observation).
|
|
108
|
+
*
|
|
109
|
+
* `estCostUsdPerPrompt` is the plain sum of each arm's ALREADY N-baked price
|
|
110
|
+
* (`ApiSpineEngineProvider.estCostUsdPerPrompt = perCallUsd * samplesPerPrompt`,
|
|
111
|
+
* Sprint 2, ADR-3) — this class must NOT re-multiply by N.
|
|
112
|
+
*/
|
|
113
|
+
export declare class AiVisibilityMultiplexer implements AiVisibilityProvider {
|
|
114
|
+
private readonly arms;
|
|
115
|
+
readonly name = "ai-visibility-multiplexer";
|
|
116
|
+
readonly estCostUsdPerPrompt: number;
|
|
117
|
+
constructor(arms: AiVisibilityProvider[]);
|
|
118
|
+
/**
|
|
119
|
+
* One arm rejecting => its rows are simply omitted, the other arms still
|
|
120
|
+
* emit (architecture:277). If EVERY arm rejects (and there is at least one
|
|
121
|
+
* arm), rethrow instead of resolving `[]` — the LOCKED `AiVisibilityAdapter`
|
|
122
|
+
* converts any probe throw into `abstain` + books nothing
|
|
123
|
+
* (`ai-visibility-adapter.ts:141-143`), which is exactly the "all fail =>
|
|
124
|
+
* abstain, nothing booked" invariant `ApiSpineEngineProvider.probe` already
|
|
125
|
+
* upholds one level down (sc-2-4). Resolving `[]` here instead would let
|
|
126
|
+
* the adapter book USD for zero rows on a total outage — the rethrow keeps
|
|
127
|
+
* that impossible.
|
|
128
|
+
*/
|
|
129
|
+
probe(target: string, prompts: string[], locale?: string): Promise<AiVisibilityRow[]>;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Select which per-engine arms are viable and compose them into an
|
|
133
|
+
* `AiVisibilityMultiplexer` — mirrors `resolveSerpProvider`
|
|
134
|
+
* (`serp-provider.ts:55-64`) in DI style: this factory does NO gating of its
|
|
135
|
+
* own beyond the viability checks below; each returned provider is already
|
|
136
|
+
* fully constructed from already-built dependencies. The API spine and the
|
|
137
|
+
* scrape arm(s) (Sprint 10/11) land in the SAME `arms` array and share the
|
|
138
|
+
* ONE multiplexer — they stay unmixable because each row carries its own
|
|
139
|
+
* `provider` label (sc-10-4; `AiVisibilityMultiplexer` never merges rows).
|
|
140
|
+
*
|
|
141
|
+
* An arm is added when EITHER:
|
|
142
|
+
* (a) the `ai-visibility` axis is on AND a configured engine is keyed
|
|
143
|
+
* (`deps.makeClient` returns a client) — the existing API-spine loop, or
|
|
144
|
+
* (b) the `ai-visibility-scrape` axis is on AND `deps.scrapeThrottle` is
|
|
145
|
+
* provided (the scrape arm needs an already-built throttle, see
|
|
146
|
+
* `AiVisibilityDeps` docstring) — one arm is composed per engine in
|
|
147
|
+
* `cfg.scrape.engines` (`"chatgpt-ui"` and/or `"perplexity-ui"`,
|
|
148
|
+
* sc-11-1), each with its matching `EngineScrapeParser`.
|
|
149
|
+
* Both API and scrape arms reuse the SAME shared `DamcrawlerCitationVerifier`
|
|
150
|
+
* (self-gates `site-crawl` per call, holds no per-arm state — safe to share).
|
|
151
|
+
*
|
|
152
|
+
* `apiAxisOn` (Sprint 11, sc-11-3): each API arm's extractor is
|
|
153
|
+
* `deps.extractor` (the plain deterministic pass) UNLESS BOTH
|
|
154
|
+
* `cfg.judge?.enabled` is true AND `deps.makeJudgeLlm()` returns a usable
|
|
155
|
+
* `{ client, model }` — in which case every API arm gets a SHARED
|
|
156
|
+
* `LlmJudgeMentionCitationExtractor` wrapping a fresh
|
|
157
|
+
* `DeterministicMentionCitationExtractor` (the judge always composes the
|
|
158
|
+
* deterministic pass, never replaces it). The scrape arm(s) always stay on
|
|
159
|
+
* `deps.extractor` — the judge is API-arms only (contract: "for each API
|
|
160
|
+
* arm"). judge-disabled (or no llm resolvable) is BYTE-IDENTICAL to before:
|
|
161
|
+
* `apiExtractor` stays exactly `deps.extractor`, no judge/extractor is
|
|
162
|
+
* constructed at all (sc-11-3, Pitfall 5).
|
|
163
|
+
*
|
|
164
|
+
* Returns `undefined` (never an empty-arms multiplexer) when NEITHER axis is
|
|
165
|
+
* on, `config.seo.aiVisibility` is absent, or no arm ends up viable (no key /
|
|
166
|
+
* no scrape engine configured / no throttle dep). `selectSource` falls back
|
|
167
|
+
* to the offline `LocalExportSource` in that case (no-key-safe,
|
|
168
|
+
* byte-identical-when-off).
|
|
169
|
+
*/
|
|
170
|
+
export declare function resolveAiVisibilityProvider(config: BoberConfig, egress: SeoEgressGuard, deps: AiVisibilityDeps): AiVisibilityProvider | undefined;
|
|
171
|
+
//# sourceMappingURL=ai-visibility-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-visibility-provider.d.ts","sourceRoot":"","sources":["../../src/seo/ai-visibility-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACxF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAgB,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAwB7F;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CASnG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,oBAAoB,GAAG,SAAS,CAAC;IACzE,SAAS,EAAE,wBAAwB,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACtE,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACrC;AAED;;;;;;;;;GASG;AACH,qBAAa,uBAAwB,YAAW,oBAAoB;IAItD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,QAAQ,CAAC,IAAI,+BAA+B;IAC5C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;gBAER,IAAI,EAAE,oBAAoB,EAAE;IAIzD;;;;;;;;;;OAUG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAgB5F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,gBAAgB,GACrB,oBAAoB,GAAG,SAAS,CA+ElC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { ApiSpineEngineProvider } from "./sources/api-spine-provider.js";
|
|
2
|
+
import { DamcrawlerCitationVerifier } from "./sources/citation-verifier.js";
|
|
3
|
+
import { ContentSanitizer } from "./content-sanitizer.js";
|
|
4
|
+
import { ScrapeArmEngineProvider } from "./sources/scrape-arm-provider.js";
|
|
5
|
+
import { ChatgptUiScrapeParser } from "./sources/engine-scrape-parser-chatgpt.js";
|
|
6
|
+
import { PerplexityUiScrapeParser } from "./sources/engine-scrape-parser-perplexity.js";
|
|
7
|
+
import { DeterministicMentionCitationExtractor, LlmJudgeMentionCitationExtractor } from "./sources/mention-citation-extractor.js";
|
|
8
|
+
/**
|
|
9
|
+
* Recognized prompt-injection role/instruction markers — fenced
|
|
10
|
+
* `<system>`/`<|im_start|>`-style tags and "ignore previous instructions"
|
|
11
|
+
* phrasing — the class of payload a grounding LLM could echo back verbatim
|
|
12
|
+
* from a page it read during its own web search. Not damcrawler-grade
|
|
13
|
+
* threat classification (that stays `DamcrawlerCitationVerifier`'s job for
|
|
14
|
+
* scraped citation bodies); this is a narrower, dependency-free, always-on
|
|
15
|
+
* second layer for the LLM's own free-text summary + citation urls.
|
|
16
|
+
*/
|
|
17
|
+
const GROUNDED_TEXT_INJECTION_PATTERNS = [
|
|
18
|
+
/<\s*\/?\s*(system|assistant|\|im_start\|?|\|im_end\|?)[^>]*>/gi,
|
|
19
|
+
/\bignore\s+(all\s+|any\s+)?(previous|prior|above)\s+instructions\b/gi,
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* Default `SanitizeFn` for `ApiSpineEngineProvider`'s `answerText`/citation-
|
|
23
|
+
* url boundary (sc-4-3). `String.prototype.replace` resets a global
|
|
24
|
+
* pattern's `lastIndex` on every call, so reusing the shared, module-level
|
|
25
|
+
* `RegExp` instances across calls is safe.
|
|
26
|
+
*/
|
|
27
|
+
export function defaultGroundedTextSanitizeFn(raw) {
|
|
28
|
+
let content = raw;
|
|
29
|
+
let hadThreats = false;
|
|
30
|
+
for (const pattern of GROUNDED_TEXT_INJECTION_PATTERNS) {
|
|
31
|
+
const stripped = content.replace(pattern, "");
|
|
32
|
+
if (stripped !== content)
|
|
33
|
+
hadThreats = true;
|
|
34
|
+
content = stripped;
|
|
35
|
+
}
|
|
36
|
+
return { content: content.trim(), hadThreats };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Fans one `probe()` call out to every configured arm and CONCATENATES
|
|
40
|
+
* their rows — arms are NEVER merged, cross-arm signal is never combined
|
|
41
|
+
* (architecture:44; each row already carries its own `provider` label, so a
|
|
42
|
+
* consumer can always tell which engine produced which observation).
|
|
43
|
+
*
|
|
44
|
+
* `estCostUsdPerPrompt` is the plain sum of each arm's ALREADY N-baked price
|
|
45
|
+
* (`ApiSpineEngineProvider.estCostUsdPerPrompt = perCallUsd * samplesPerPrompt`,
|
|
46
|
+
* Sprint 2, ADR-3) — this class must NOT re-multiply by N.
|
|
47
|
+
*/
|
|
48
|
+
export class AiVisibilityMultiplexer {
|
|
49
|
+
arms;
|
|
50
|
+
name = "ai-visibility-multiplexer";
|
|
51
|
+
estCostUsdPerPrompt;
|
|
52
|
+
constructor(arms) {
|
|
53
|
+
this.arms = arms;
|
|
54
|
+
this.estCostUsdPerPrompt = arms.reduce((sum, arm) => sum + arm.estCostUsdPerPrompt, 0);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* One arm rejecting => its rows are simply omitted, the other arms still
|
|
58
|
+
* emit (architecture:277). If EVERY arm rejects (and there is at least one
|
|
59
|
+
* arm), rethrow instead of resolving `[]` — the LOCKED `AiVisibilityAdapter`
|
|
60
|
+
* converts any probe throw into `abstain` + books nothing
|
|
61
|
+
* (`ai-visibility-adapter.ts:141-143`), which is exactly the "all fail =>
|
|
62
|
+
* abstain, nothing booked" invariant `ApiSpineEngineProvider.probe` already
|
|
63
|
+
* upholds one level down (sc-2-4). Resolving `[]` here instead would let
|
|
64
|
+
* the adapter book USD for zero rows on a total outage — the rethrow keeps
|
|
65
|
+
* that impossible.
|
|
66
|
+
*/
|
|
67
|
+
async probe(target, prompts, locale) {
|
|
68
|
+
// The `async` wrapper (not a bare `.map((arm) => arm.probe(...))`) matters:
|
|
69
|
+
// it captures a SYNCHRONOUS throw from a misbehaving arm as a rejected
|
|
70
|
+
// promise too, so `Promise.allSettled` never has an exception escape past
|
|
71
|
+
// it before every arm has had a chance to run.
|
|
72
|
+
const settled = await Promise.allSettled(this.arms.map(async (arm) => arm.probe(target, prompts, locale)));
|
|
73
|
+
const fulfilled = settled.filter((s) => s.status === "fulfilled");
|
|
74
|
+
if (this.arms.length > 0 && fulfilled.length === 0) {
|
|
75
|
+
throw new Error("AiVisibilityMultiplexer: every arm failed");
|
|
76
|
+
}
|
|
77
|
+
return fulfilled.flatMap((s) => s.value);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Select which per-engine arms are viable and compose them into an
|
|
82
|
+
* `AiVisibilityMultiplexer` — mirrors `resolveSerpProvider`
|
|
83
|
+
* (`serp-provider.ts:55-64`) in DI style: this factory does NO gating of its
|
|
84
|
+
* own beyond the viability checks below; each returned provider is already
|
|
85
|
+
* fully constructed from already-built dependencies. The API spine and the
|
|
86
|
+
* scrape arm(s) (Sprint 10/11) land in the SAME `arms` array and share the
|
|
87
|
+
* ONE multiplexer — they stay unmixable because each row carries its own
|
|
88
|
+
* `provider` label (sc-10-4; `AiVisibilityMultiplexer` never merges rows).
|
|
89
|
+
*
|
|
90
|
+
* An arm is added when EITHER:
|
|
91
|
+
* (a) the `ai-visibility` axis is on AND a configured engine is keyed
|
|
92
|
+
* (`deps.makeClient` returns a client) — the existing API-spine loop, or
|
|
93
|
+
* (b) the `ai-visibility-scrape` axis is on AND `deps.scrapeThrottle` is
|
|
94
|
+
* provided (the scrape arm needs an already-built throttle, see
|
|
95
|
+
* `AiVisibilityDeps` docstring) — one arm is composed per engine in
|
|
96
|
+
* `cfg.scrape.engines` (`"chatgpt-ui"` and/or `"perplexity-ui"`,
|
|
97
|
+
* sc-11-1), each with its matching `EngineScrapeParser`.
|
|
98
|
+
* Both API and scrape arms reuse the SAME shared `DamcrawlerCitationVerifier`
|
|
99
|
+
* (self-gates `site-crawl` per call, holds no per-arm state — safe to share).
|
|
100
|
+
*
|
|
101
|
+
* `apiAxisOn` (Sprint 11, sc-11-3): each API arm's extractor is
|
|
102
|
+
* `deps.extractor` (the plain deterministic pass) UNLESS BOTH
|
|
103
|
+
* `cfg.judge?.enabled` is true AND `deps.makeJudgeLlm()` returns a usable
|
|
104
|
+
* `{ client, model }` — in which case every API arm gets a SHARED
|
|
105
|
+
* `LlmJudgeMentionCitationExtractor` wrapping a fresh
|
|
106
|
+
* `DeterministicMentionCitationExtractor` (the judge always composes the
|
|
107
|
+
* deterministic pass, never replaces it). The scrape arm(s) always stay on
|
|
108
|
+
* `deps.extractor` — the judge is API-arms only (contract: "for each API
|
|
109
|
+
* arm"). judge-disabled (or no llm resolvable) is BYTE-IDENTICAL to before:
|
|
110
|
+
* `apiExtractor` stays exactly `deps.extractor`, no judge/extractor is
|
|
111
|
+
* constructed at all (sc-11-3, Pitfall 5).
|
|
112
|
+
*
|
|
113
|
+
* Returns `undefined` (never an empty-arms multiplexer) when NEITHER axis is
|
|
114
|
+
* on, `config.seo.aiVisibility` is absent, or no arm ends up viable (no key /
|
|
115
|
+
* no scrape engine configured / no throttle dep). `selectSource` falls back
|
|
116
|
+
* to the offline `LocalExportSource` in that case (no-key-safe,
|
|
117
|
+
* byte-identical-when-off).
|
|
118
|
+
*/
|
|
119
|
+
export function resolveAiVisibilityProvider(config, egress, deps) {
|
|
120
|
+
const cfg = config.seo?.aiVisibility;
|
|
121
|
+
if (!cfg)
|
|
122
|
+
return undefined; // nothing configured at all
|
|
123
|
+
const apiAxisOn = egress.isAllowed("ai-visibility");
|
|
124
|
+
const scrapeAxisOn = egress.isAllowed("ai-visibility-scrape");
|
|
125
|
+
if (!apiAxisOn && !scrapeAxisOn)
|
|
126
|
+
return undefined; // both axes off => offline fallback
|
|
127
|
+
// Shared across every arm (Sprint 4, extended Sprint 10): the verifier
|
|
128
|
+
// self-gates `site-crawl` on every `verify()` call and holds no per-arm
|
|
129
|
+
// state; the sanitizer's `SanitizeFn` is a pure function — both are safe
|
|
130
|
+
// to share across API arms (the scrape arm builds its OWN sanitizer from
|
|
131
|
+
// the loaded damcrawler module, not this one — see `ScrapeArmEngineProvider`).
|
|
132
|
+
const verifier = new DamcrawlerCitationVerifier(egress);
|
|
133
|
+
const sanitizer = new ContentSanitizer(defaultGroundedTextSanitizeFn);
|
|
134
|
+
const arms = [];
|
|
135
|
+
if (apiAxisOn) {
|
|
136
|
+
// sc-11-3: judge wraps the API-arm extractor ONLY when enabled AND an
|
|
137
|
+
// llm resolves — otherwise `apiExtractor` stays exactly `deps.extractor`
|
|
138
|
+
// (byte-identical-when-disabled, Pitfall 5). One shared judge instance
|
|
139
|
+
// (mirrors sharing `verifier`/`sanitizer` above) — the judge itself is
|
|
140
|
+
// stateless per call.
|
|
141
|
+
let apiExtractor = deps.extractor;
|
|
142
|
+
if (cfg.judge?.enabled) {
|
|
143
|
+
const judge = deps.makeJudgeLlm?.();
|
|
144
|
+
if (judge) {
|
|
145
|
+
apiExtractor = new LlmJudgeMentionCitationExtractor(new DeterministicMentionCitationExtractor(), judge.client, judge.model, sanitizer);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
for (const engineCfg of cfg.engines) {
|
|
149
|
+
const client = deps.makeClient(engineCfg.engine);
|
|
150
|
+
if (!client)
|
|
151
|
+
continue; // no key/credential for this engine => skip (viability check)
|
|
152
|
+
arms.push(new ApiSpineEngineProvider(client, apiExtractor, cfg.samplesPerPrompt, engineCfg.perCallUsd, verifier, sanitizer));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (scrapeAxisOn && deps.scrapeThrottle && cfg.scrape) {
|
|
156
|
+
const scrapeCfg = cfg.scrape;
|
|
157
|
+
const throttle = deps.scrapeThrottle;
|
|
158
|
+
const parserFor = (engine) => engine === "perplexity-ui" ? new PerplexityUiScrapeParser() : new ChatgptUiScrapeParser();
|
|
159
|
+
for (const engine of scrapeCfg.engines) {
|
|
160
|
+
arms.push(new ScrapeArmEngineProvider(egress, engine, parserFor(engine), deps.extractor, verifier, throttle, cfg.samplesPerPrompt, scrapeCfg.authSession, scrapeCfg.proxyUsdPerScrape, scrapeCfg.proxy, deps.scrapeLoad));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return arms.length > 0 ? new AiVisibilityMultiplexer(arms) : undefined; // no-key-safe / no-throttle-safe
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=ai-visibility-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-visibility-provider.js","sourceRoot":"","sources":["../../src/seo/ai-visibility-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AiVisibilityScorer — PURE aggregation of raw AiVisibilityRow observations
|
|
3
|
+
* into per-(prompt,provider) rates + a deterministic Wilson 95% CI
|
|
4
|
+
* (in-house-ai-visibility, Sprint 5; ADR-5).
|
|
5
|
+
*
|
|
6
|
+
* PURE, synchronous, network-free transform: groups the raw per-sample
|
|
7
|
+
* `AiVisibilityRow[]` STRICTLY by (prompt, provider) — arms are NEVER
|
|
8
|
+
* merged, even when they share a prompt — and folds each group into one
|
|
9
|
+
* `AiVisibilityMetric` carrying mention/citation rates, an optional mean
|
|
10
|
+
* rank, a deduped `sourceUrls` union (first-seen order), and a
|
|
11
|
+
* deterministic Wilson 95% score interval over the mention indicator
|
|
12
|
+
* (z=1.96, no RNG, no `Date`). Never throws.
|
|
13
|
+
*
|
|
14
|
+
* This module is consumed ANALYZER-SIDE (`analyzer.ts`'s
|
|
15
|
+
* `describeAiVisibility`, gated on `provenance.source === "ai-visibility"`)
|
|
16
|
+
* to fold N raw rows into rates+CI for the LLM prompt — the metric is a
|
|
17
|
+
* derived, in-prompt-only projection and is never persisted to the locked
|
|
18
|
+
* `SeoDataBundle.aiVisibility` (`DataOutcome<AiVisibilityRow[]>`).
|
|
19
|
+
*/
|
|
20
|
+
import type { AiVisibilityRow } from "./data-source.js";
|
|
21
|
+
/** Derived, in-analyzer projection — NOT persisted to the locked SeoDataBundle. */
|
|
22
|
+
export type AiVisibilityMetric = {
|
|
23
|
+
prompt: string;
|
|
24
|
+
provider: string;
|
|
25
|
+
samples: number;
|
|
26
|
+
mentionRate: number;
|
|
27
|
+
citationRate: number;
|
|
28
|
+
/** OMITTED (never `undefined`) when no row in the group carries a `rank`. */
|
|
29
|
+
meanRank?: number;
|
|
30
|
+
/** Wilson 95% score interval over the mention indicator (z=1.96). */
|
|
31
|
+
mentionRateCi95: [number, number];
|
|
32
|
+
/** Deduped union of every row's `sourceUrls`, first-seen order preserved. */
|
|
33
|
+
sourceUrls: string[];
|
|
34
|
+
};
|
|
35
|
+
export declare class AiVisibilityScorer {
|
|
36
|
+
/**
|
|
37
|
+
* Groups `rows` strictly by `(prompt, provider)` — arms are NEVER merged,
|
|
38
|
+
* even when they share a prompt. Empty input yields `[]`. Preserves
|
|
39
|
+
* first-seen group order. Never throws.
|
|
40
|
+
*/
|
|
41
|
+
aggregate(rows: AiVisibilityRow[]): AiVisibilityMetric[];
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=ai-visibility-scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-visibility-scorer.d.ts","sourceRoot":"","sources":["../../src/seo/ai-visibility-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,mFAAmF;AACnF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,6EAA6E;IAC7E,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAqFF,qBAAa,kBAAkB;IAC7B;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,kBAAkB,EAAE;CAoBzD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
const Z = 1.96; // 95% two-sided; hard-coded, no config, no RNG
|
|
2
|
+
const Z_SQUARED = Z * Z;
|
|
3
|
+
/**
|
|
4
|
+
* Wilson 95% score interval for `successes` out of `n` Bernoulli trials.
|
|
5
|
+
*
|
|
6
|
+
* `n <= 1` is a SPECIAL CASE returning the degenerate `[rate, rate]` — the
|
|
7
|
+
* raw Wilson formula does NOT naturally collapse to a point interval for a
|
|
8
|
+
* single sample (e.g. 1/1 yields roughly `[0.207, 1.0]`), so a single
|
|
9
|
+
* observation is reported with zero spread instead of a misleadingly wide
|
|
10
|
+
* one-sample interval.
|
|
11
|
+
*/
|
|
12
|
+
function wilsonCi95(successes, n) {
|
|
13
|
+
if (n <= 1) {
|
|
14
|
+
const rate = n === 1 ? successes / n : 0;
|
|
15
|
+
return [rate, rate];
|
|
16
|
+
}
|
|
17
|
+
const p = successes / n;
|
|
18
|
+
const denom = 1 + Z_SQUARED / n;
|
|
19
|
+
const center = (p + Z_SQUARED / (2 * n)) / denom;
|
|
20
|
+
const margin = (Z * Math.sqrt(p * (1 - p) / n + Z_SQUARED / (4 * n * n))) / denom;
|
|
21
|
+
// The Wilson interval is naturally bounded in [0, 1]; clamp defensively.
|
|
22
|
+
const lower = Math.max(0, center - margin);
|
|
23
|
+
const upper = Math.min(1, center + margin);
|
|
24
|
+
return [lower, upper];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Collision-safe composite grouping key — `JSON.stringify` of the tuple
|
|
28
|
+
* rather than naive string concatenation (a delimiter like `"::"` could
|
|
29
|
+
* appear inside a prompt or provider string and silently merge two arms).
|
|
30
|
+
*/
|
|
31
|
+
function groupKey(prompt, provider) {
|
|
32
|
+
return JSON.stringify([prompt, provider]);
|
|
33
|
+
}
|
|
34
|
+
/** Mean of every row's `rank`, or `undefined` when no row carries one. */
|
|
35
|
+
function computeMeanRank(rows) {
|
|
36
|
+
const ranks = rows.map((r) => r.rank).filter((r) => typeof r === "number");
|
|
37
|
+
if (ranks.length === 0)
|
|
38
|
+
return undefined;
|
|
39
|
+
return ranks.reduce((sum, r) => sum + r, 0) / ranks.length;
|
|
40
|
+
}
|
|
41
|
+
/** Deduped union of every row's `sourceUrls`, preserving first-seen order. */
|
|
42
|
+
function dedupeSourceUrls(rows) {
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
const result = [];
|
|
45
|
+
for (const row of rows) {
|
|
46
|
+
const urls = Array.isArray(row.sourceUrls) ? row.sourceUrls : [];
|
|
47
|
+
for (const url of urls) {
|
|
48
|
+
if (!seen.has(url)) {
|
|
49
|
+
seen.add(url);
|
|
50
|
+
result.push(url);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
/** Folds one (prompt,provider) group's rows into a single `AiVisibilityMetric`. */
|
|
57
|
+
function scoreGroup(rows) {
|
|
58
|
+
const { prompt, provider } = rows[0];
|
|
59
|
+
const n = rows.length;
|
|
60
|
+
const mentionedCount = rows.filter((r) => r.mentioned === true).length;
|
|
61
|
+
const citedCount = rows.filter((r) => r.citationPresent === true).length;
|
|
62
|
+
const meanRank = computeMeanRank(rows);
|
|
63
|
+
const metric = {
|
|
64
|
+
prompt,
|
|
65
|
+
provider,
|
|
66
|
+
samples: n,
|
|
67
|
+
mentionRate: mentionedCount / n,
|
|
68
|
+
citationRate: citedCount / n,
|
|
69
|
+
mentionRateCi95: wilsonCi95(mentionedCount, n),
|
|
70
|
+
sourceUrls: dedupeSourceUrls(rows),
|
|
71
|
+
};
|
|
72
|
+
// Pattern B: OMIT the key entirely rather than setting `meanRank: undefined`.
|
|
73
|
+
return meanRank === undefined ? metric : { ...metric, meanRank };
|
|
74
|
+
}
|
|
75
|
+
export class AiVisibilityScorer {
|
|
76
|
+
/**
|
|
77
|
+
* Groups `rows` strictly by `(prompt, provider)` — arms are NEVER merged,
|
|
78
|
+
* even when they share a prompt. Empty input yields `[]`. Preserves
|
|
79
|
+
* first-seen group order. Never throws.
|
|
80
|
+
*/
|
|
81
|
+
aggregate(rows) {
|
|
82
|
+
if (!Array.isArray(rows) || rows.length === 0)
|
|
83
|
+
return [];
|
|
84
|
+
const groups = new Map();
|
|
85
|
+
for (const row of rows) {
|
|
86
|
+
const key = groupKey(row.prompt, row.provider);
|
|
87
|
+
const existing = groups.get(key);
|
|
88
|
+
if (existing) {
|
|
89
|
+
existing.push(row);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
groups.set(key, [row]);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const metrics = [];
|
|
96
|
+
for (const groupRows of groups.values()) {
|
|
97
|
+
metrics.push(scoreGroup(groupRows));
|
|
98
|
+
}
|
|
99
|
+
return metrics;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=ai-visibility-scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-visibility-scorer.js","sourceRoot":"","sources":["../../src/seo/ai-visibility-scorer.ts"],"names":[],"mappings":"AAoCA,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,+CAA+C;AAC/D,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;AAExB;;;;;;;;GAQG;AACH,SAAS,UAAU,CAAC,SAAiB,EAAE,CAAS;IAC9C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAElF,yEAAyE;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CAAC,MAAc,EAAE,QAAgB;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,0EAA0E;AAC1E,SAAS,eAAe,CAAC,IAAuB;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IACxF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;AAC7D,CAAC;AAED,8EAA8E;AAC9E,SAAS,gBAAgB,CAAC,IAAuB;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mFAAmF;AACnF,SAAS,UAAU,CAAC,IAAuB;IACzC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IACvE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAuB;QACjC,MAAM;QACN,QAAQ;QACR,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,cAAc,GAAG,CAAC;QAC/B,YAAY,EAAE,UAAU,GAAG,CAAC;QAC5B,eAAe,EAAE,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;QAC9C,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC;KACnC,CAAC;IAEF,8EAA8E;IAC9E,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,OAAO,kBAAkB;IAC7B;;;;OAIG;IACH,SAAS,CAAC,IAAuB;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEzD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;QACpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAyB,EAAE,CAAC;QACzC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { LLMClient } from "../providers/types.js";
|
|
2
|
+
import type { SeoWorkflow, SeoFinding, DataOutcome, DataProvenance } from "./types.js";
|
|
3
|
+
import type { SearchAnalyticsRow, UrlInspectionRow, SerpRow, KeywordRow, BacklinkRow, AiVisibilityRow, LinkGraphRow } from "./data-source.js";
|
|
4
|
+
import type { SeoRetrieveResult } from "./retriever.js";
|
|
5
|
+
import type { BoberConfig } from "../config/schema.js";
|
|
6
|
+
/**
|
|
7
|
+
* Per-capability optional `DataOutcome<Row[]>` — a source may abstain/
|
|
8
|
+
* disable per capability. `aiVisibility`/`linkGraph` were added additively
|
|
9
|
+
* (spec-20260717-seo-improver-builder, Sprint 9; ADR-7) — an arm left
|
|
10
|
+
* `undefined` (a capability `WORKFLOW_CAPABILITIES` omits for the running
|
|
11
|
+
* workflow) renders as "not requested" (`describeDataOutcome` below), never
|
|
12
|
+
* as an error.
|
|
13
|
+
*/
|
|
14
|
+
export type SeoDataBundle = {
|
|
15
|
+
searchAnalytics?: DataOutcome<SearchAnalyticsRow[]>;
|
|
16
|
+
urlInspection?: DataOutcome<UrlInspectionRow[]>;
|
|
17
|
+
serp?: DataOutcome<SerpRow[]>;
|
|
18
|
+
keywords?: DataOutcome<KeywordRow[]>;
|
|
19
|
+
backlinks?: DataOutcome<BacklinkRow[]>;
|
|
20
|
+
aiVisibility?: DataOutcome<AiVisibilityRow[]>;
|
|
21
|
+
linkGraph?: DataOutcome<LinkGraphRow[]>;
|
|
22
|
+
};
|
|
23
|
+
export type SeoAnalyzeInput = {
|
|
24
|
+
workflow: SeoWorkflow;
|
|
25
|
+
target: string;
|
|
26
|
+
/** The existing retriever output (retriever.ts:22-25) — the arch calls this `SeoPlaybookContext`. */
|
|
27
|
+
context: SeoRetrieveResult;
|
|
28
|
+
data: SeoDataBundle;
|
|
29
|
+
/**
|
|
30
|
+
* Accepted for interface parity with the architecture's `SeoAnalyzeInput`
|
|
31
|
+
* (arch:250-256) and the Sprint 11 runner contract. Not consumed by this
|
|
32
|
+
* sprint's `analyze` body — `llm`/`model` are constructor-injected, and no
|
|
33
|
+
* analyzer behaviour this sprint reads `config`.
|
|
34
|
+
*/
|
|
35
|
+
config: BoberConfig;
|
|
36
|
+
/** Injected wall-clock snapshot (ISO-8601) — the analyzer never reads the clock itself. */
|
|
37
|
+
now: string;
|
|
38
|
+
};
|
|
39
|
+
export type SeoAnalysis = {
|
|
40
|
+
workflow: SeoWorkflow;
|
|
41
|
+
target: string;
|
|
42
|
+
findings: SeoFinding[];
|
|
43
|
+
/** false when the LLM output could not be parsed (fail-closed, sc-10-2). */
|
|
44
|
+
parsed: boolean;
|
|
45
|
+
dataProvenance: DataProvenance[];
|
|
46
|
+
};
|
|
47
|
+
export declare class SeoAnalyzer {
|
|
48
|
+
private readonly llm;
|
|
49
|
+
private readonly model;
|
|
50
|
+
constructor(llm: LLMClient, model: string);
|
|
51
|
+
/**
|
|
52
|
+
* Never throws on a PARSE failure (returns `parsed: false` with empty
|
|
53
|
+
* findings). Does NOT catch a transport error from `llm.chat` — that
|
|
54
|
+
* rejects the returned promise, distinct from a parse failure.
|
|
55
|
+
*/
|
|
56
|
+
analyze(input: SeoAnalyzeInput): Promise<SeoAnalysis>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/seo/analyzer.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAC;AACrG,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,WAAW,EACX,eAAe,EACf,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,eAAe,CAAC,EAAE,WAAW,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,EAAE,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9C,SAAS,CAAC,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,aAAa,CAAC;IACpB;;;;;OAKG;IACH,MAAM,EAAE,WAAW,CAAC;IACpB,2FAA2F;IAC3F,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,4EAA4E;IAC5E,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,cAAc,EAAE,CAAC;CAClC,CAAC;AA6OF,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM;IAGhC;;;;OAIG;IACG,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;CAsB5D"}
|