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,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataForSeoAdapter — the SECOND live network `SeoDataSource`
|
|
3
|
+
* (spec-20260715-ultimate-seo-suite, Sprint 9). Serves `serp` + `keywords` +
|
|
4
|
+
* `backlinks` from the real DataForSEO v3 API, behind the `"serp-provider"`
|
|
5
|
+
* egress axis. Near-verbatim clone of `GscAdapter` (Sprint 8) — SAME ADR-5
|
|
6
|
+
* shape, six diffs: axis, which methods serve data, endpoints/auth, and
|
|
7
|
+
* (the load-bearing new behavior) real USD cost booking.
|
|
8
|
+
*
|
|
9
|
+
* ADR-5 (the load-bearing invariant of this file, reused verbatim from
|
|
10
|
+
* `GscAdapter`): EVERY capability method that would open a socket begins
|
|
11
|
+
* with these two gates, IN ORDER, before any network work:
|
|
12
|
+
* 1. `this.egress.assertAllowed("serp-provider")` — throws when the axis
|
|
13
|
+
* is off; caught immediately and converted to `abstain` WITHOUT opening
|
|
14
|
+
* a socket (never hoisted into a caller/runner — see `src/seo/egress.ts`).
|
|
15
|
+
* 2. `this.governor.admit(req)` — synchronous, never throws, no side
|
|
16
|
+
* effect; refused admission also aborts before any socket opens.
|
|
17
|
+
* Only after BOTH gates pass does the injected `HttpClient` make a request.
|
|
18
|
+
* Any HTTP/network/parse error (including 402/429/5xx) degrades to
|
|
19
|
+
* `{ kind: "abstain", reason }` — this method NEVER throws to the caller.
|
|
20
|
+
*
|
|
21
|
+
* DataForSEO differs from GSC in that it is PAY-AS-YOU-GO: unlike GSC's
|
|
22
|
+
* `estCostUsd: 0` (free), every serving method here computes a real USD
|
|
23
|
+
* cost (research §4 price ladder), passes it as `estCostUsd` to `admit()`
|
|
24
|
+
* (worst-case pre-emption), books the ACTUAL USD via `governor.record()`
|
|
25
|
+
* only after a successful round-trip, and stamps `provenance.costUsd`.
|
|
26
|
+
* A 402/429/5xx means DataForSEO did NOT charge — abstain BEFORE any
|
|
27
|
+
* `record()` call, so nothing is ever booked for a failed request.
|
|
28
|
+
*
|
|
29
|
+
* The real global `fetch` is referenced NOWHERE in this file — the injected
|
|
30
|
+
* `HttpClient` (`../adapters/http.js`) is the sole transport, defaulting to
|
|
31
|
+
* `defaultHttpClient` (production) or a fixture/spy client (tests), so CI
|
|
32
|
+
* never opens a real socket.
|
|
33
|
+
*/
|
|
34
|
+
import { Buffer } from "node:buffer";
|
|
35
|
+
import { defaultHttpClient } from "../adapters/http.js";
|
|
36
|
+
// -- DataForSEO endpoint + price constants (research S4) --------------------
|
|
37
|
+
const DFS_BASE = "https://api.dataforseo.com/v3";
|
|
38
|
+
const DFS_SERP_URL = `${DFS_BASE}/serp/google/organic/live/advanced`;
|
|
39
|
+
const DFS_KEYWORDS_URL = `${DFS_BASE}/dataforseo_labs/google/keyword_ideas/live`;
|
|
40
|
+
const DFS_BACKLINKS_URL = `${DFS_BASE}/backlinks/backlinks/live`;
|
|
41
|
+
/** SERP price ladder, per task — research §4 (research-...-research.md:98). DO NOT approximate. */
|
|
42
|
+
const SERP_PRICE_USD = {
|
|
43
|
+
standard: 0.0006,
|
|
44
|
+
priority: 0.0012,
|
|
45
|
+
live: 0.002,
|
|
46
|
+
};
|
|
47
|
+
/** Backlinks pricing — research §4: `$0.02/req + $0.00003/row`. */
|
|
48
|
+
const BACKLINKS_BASE_USD = 0.02;
|
|
49
|
+
const BACKLINKS_PER_ROW_USD = 0.00003;
|
|
50
|
+
/**
|
|
51
|
+
* bober: research §4 prices only SERP + backlinks, not the keyword_ideas
|
|
52
|
+
* endpoint. Using the same per-task price as standard SERP ($0.0006)
|
|
53
|
+
* as a documented placeholder — this is an ASSUMPTION, not a pinned
|
|
54
|
+
* research number. Revisit if/when a keywords price is confirmed.
|
|
55
|
+
*/
|
|
56
|
+
const KEYWORDS_TASK_USD = 0.0006;
|
|
57
|
+
// -- Response parsers (pure, total — [] on any shape mismatch) --------------
|
|
58
|
+
/** Walk a DataForSEO v3 envelope's `tasks[0].result[0].items[]`; `[]` on any shape mismatch. */
|
|
59
|
+
function firstResultItems(raw) {
|
|
60
|
+
if (!raw || typeof raw !== "object")
|
|
61
|
+
return [];
|
|
62
|
+
const tasks = raw["tasks"];
|
|
63
|
+
if (!Array.isArray(tasks) || tasks.length === 0)
|
|
64
|
+
return [];
|
|
65
|
+
const task0 = tasks[0];
|
|
66
|
+
if (!task0 || typeof task0 !== "object")
|
|
67
|
+
return [];
|
|
68
|
+
const result = task0["result"];
|
|
69
|
+
if (!Array.isArray(result) || result.length === 0)
|
|
70
|
+
return [];
|
|
71
|
+
const result0 = result[0];
|
|
72
|
+
if (!result0 || typeof result0 !== "object")
|
|
73
|
+
return [];
|
|
74
|
+
const items = result0["items"];
|
|
75
|
+
return Array.isArray(items) ? items : [];
|
|
76
|
+
}
|
|
77
|
+
/** Parse a DataForSEO `serp/google/organic/live/advanced` response into typed rows. */
|
|
78
|
+
function parseSerp(raw, keyword, location) {
|
|
79
|
+
const rows = [];
|
|
80
|
+
for (const item of firstResultItems(raw)) {
|
|
81
|
+
if (!item || typeof item !== "object")
|
|
82
|
+
continue;
|
|
83
|
+
const r = item;
|
|
84
|
+
if (typeof r["rank_absolute"] !== "number" || typeof r["url"] !== "string")
|
|
85
|
+
continue;
|
|
86
|
+
const row = { keyword, position: r["rank_absolute"], url: r["url"], location };
|
|
87
|
+
if (typeof r["title"] === "string")
|
|
88
|
+
row.title = r["title"];
|
|
89
|
+
rows.push(row);
|
|
90
|
+
}
|
|
91
|
+
return rows;
|
|
92
|
+
}
|
|
93
|
+
/** Parse a DataForSEO `dataforseo_labs/google/keyword_ideas/live` response into typed rows. */
|
|
94
|
+
function parseKeywords(raw, location) {
|
|
95
|
+
const rows = [];
|
|
96
|
+
for (const item of firstResultItems(raw)) {
|
|
97
|
+
if (!item || typeof item !== "object")
|
|
98
|
+
continue;
|
|
99
|
+
const r = item;
|
|
100
|
+
if (typeof r["keyword"] !== "string")
|
|
101
|
+
continue;
|
|
102
|
+
const row = { keyword: r["keyword"], location };
|
|
103
|
+
const info = r["keyword_info"];
|
|
104
|
+
if (info && typeof info === "object") {
|
|
105
|
+
const i = info;
|
|
106
|
+
if (typeof i["search_volume"] === "number")
|
|
107
|
+
row.searchVolume = i["search_volume"];
|
|
108
|
+
if (typeof i["cpc"] === "number")
|
|
109
|
+
row.cpc = i["cpc"];
|
|
110
|
+
if (typeof i["competition"] === "number")
|
|
111
|
+
row.competition = i["competition"];
|
|
112
|
+
}
|
|
113
|
+
rows.push(row);
|
|
114
|
+
}
|
|
115
|
+
return rows;
|
|
116
|
+
}
|
|
117
|
+
/** Parse a DataForSEO `backlinks/backlinks/live` response into typed rows. */
|
|
118
|
+
function parseBacklinks(raw) {
|
|
119
|
+
const rows = [];
|
|
120
|
+
for (const item of firstResultItems(raw)) {
|
|
121
|
+
if (!item || typeof item !== "object")
|
|
122
|
+
continue;
|
|
123
|
+
const r = item;
|
|
124
|
+
if (typeof r["url_from"] !== "string" || typeof r["url_to"] !== "string")
|
|
125
|
+
continue;
|
|
126
|
+
const row = { sourceUrl: r["url_from"], targetUrl: r["url_to"] };
|
|
127
|
+
if (typeof r["anchor"] === "string")
|
|
128
|
+
row.anchor = r["anchor"];
|
|
129
|
+
if (typeof r["dofollow"] === "boolean")
|
|
130
|
+
row.dofollow = r["dofollow"];
|
|
131
|
+
rows.push(row);
|
|
132
|
+
}
|
|
133
|
+
return rows;
|
|
134
|
+
}
|
|
135
|
+
// -- DataForSeoAdapter --------------------------------------------------------
|
|
136
|
+
/**
|
|
137
|
+
* Live DataForSEO `SeoDataSource`. Serves `serp` + `keywords` + `backlinks`;
|
|
138
|
+
* `search-analytics`/`url-inspection` are NOT DataForSEO capabilities
|
|
139
|
+
* (`{ kind: "disabled" }` unconditionally — GscAdapter serves those).
|
|
140
|
+
*
|
|
141
|
+
* bober: no OAuth/refresh flow here — the HTTP Basic credential is injected
|
|
142
|
+
* fully-formed via `getBasicAuth`; add credential rotation only if a
|
|
143
|
+
* credential store is wired in a later sprint.
|
|
144
|
+
*/
|
|
145
|
+
export class DataForSeoAdapter {
|
|
146
|
+
egress;
|
|
147
|
+
governor;
|
|
148
|
+
http;
|
|
149
|
+
getBasicAuth;
|
|
150
|
+
constructor(egress, governor,
|
|
151
|
+
// Injectable transport — default = the ONE global-fetch wrapper
|
|
152
|
+
// (`../adapters/http.js`). Tests inject a fake `HttpClient`.
|
|
153
|
+
http = defaultHttpClient,
|
|
154
|
+
// HTTP Basic credential provider — injected, NEVER hardcoded. Tests stub
|
|
155
|
+
// it (`async () => "dGVzdDp0ZXN0"`); production defaults to base64
|
|
156
|
+
// `login:password` read from env.
|
|
157
|
+
getBasicAuth = () => Promise.resolve(Buffer.from(`${process.env["DATAFORSEO_LOGIN"] ?? ""}:${process.env["DATAFORSEO_PASSWORD"] ?? ""}`).toString("base64"))) {
|
|
158
|
+
this.egress = egress;
|
|
159
|
+
this.governor = governor;
|
|
160
|
+
this.http = http;
|
|
161
|
+
this.getBasicAuth = getBasicAuth;
|
|
162
|
+
}
|
|
163
|
+
capabilities() {
|
|
164
|
+
return ["serp", "keywords", "backlinks"];
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* SERP query. ADR-5 preamble (egress gate, then quota gate) runs before
|
|
168
|
+
* any network work; USD cost is the fixed per-task price for `q.priority`
|
|
169
|
+
* (default `"standard"`) — booked in `admit()` (estimate) and `record()`
|
|
170
|
+
* (actual, identical since SERP is a fixed-price task, sc-9-3).
|
|
171
|
+
*/
|
|
172
|
+
async serp(q) {
|
|
173
|
+
// -- STATEMENT 1: egress gate (ADR-5) --
|
|
174
|
+
try {
|
|
175
|
+
this.egress.assertAllowed("serp-provider");
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return { kind: "abstain", reason: "egress-serp-provider-disabled" };
|
|
179
|
+
}
|
|
180
|
+
// -- STATEMENT 2: quota gate (ADR-5); synchronous, never throws --
|
|
181
|
+
const price = SERP_PRICE_USD[q.priority ?? "standard"];
|
|
182
|
+
const admitReq = {
|
|
183
|
+
source: "dataforseo",
|
|
184
|
+
capability: "serp",
|
|
185
|
+
scope: {},
|
|
186
|
+
estRows: 1, // one task per call; inert for dataforseo (quota-governor.ts:158,179)
|
|
187
|
+
estCostUsd: price,
|
|
188
|
+
};
|
|
189
|
+
const decision = this.governor.admit(admitReq);
|
|
190
|
+
if (!decision.admit) {
|
|
191
|
+
return { kind: "abstain", reason: decision.reason };
|
|
192
|
+
}
|
|
193
|
+
// -- Only now may a socket open. --
|
|
194
|
+
try {
|
|
195
|
+
const cred = await this.getBasicAuth();
|
|
196
|
+
const res = await this.http.request(DFS_SERP_URL, {
|
|
197
|
+
method: "POST",
|
|
198
|
+
headers: { Authorization: `Basic ${cred}`, "Content-Type": "application/json" },
|
|
199
|
+
body: JSON.stringify([{ keyword: q.keyword, location_name: q.location, priority: q.priority }]),
|
|
200
|
+
});
|
|
201
|
+
if (!res.ok) {
|
|
202
|
+
return { kind: "abstain", reason: `dataforseo-http-${res.status}` }; // 402/429/5xx -> abstain, NEVER throw
|
|
203
|
+
}
|
|
204
|
+
const rows = parseSerp(await res.json(), q.keyword, q.location);
|
|
205
|
+
// SERP is a fixed-price task — the actual charge equals the estimate.
|
|
206
|
+
const actualCostUsd = price;
|
|
207
|
+
await this.governor.record(admitReq, actualCostUsd);
|
|
208
|
+
const provenance = {
|
|
209
|
+
source: "dataforseo",
|
|
210
|
+
retrievedAt: new Date().toISOString(),
|
|
211
|
+
costUsd: actualCostUsd,
|
|
212
|
+
};
|
|
213
|
+
return { kind: "data", rows, provenance };
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return { kind: "abstain", reason: "source-error" }; // network/parse error -> abstain, NEVER throw
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Keyword ideas query. Same ADR-5 preamble as `serp`; USD cost uses the
|
|
221
|
+
* documented `KEYWORDS_TASK_USD` placeholder (research §4 does not pin a
|
|
222
|
+
* keywords price — see the constant's `bober:` comment).
|
|
223
|
+
*/
|
|
224
|
+
async keywords(q) {
|
|
225
|
+
// -- STATEMENT 1: egress gate (ADR-5) --
|
|
226
|
+
try {
|
|
227
|
+
this.egress.assertAllowed("serp-provider");
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return { kind: "abstain", reason: "egress-serp-provider-disabled" };
|
|
231
|
+
}
|
|
232
|
+
// -- STATEMENT 2: quota gate (ADR-5); synchronous, never throws --
|
|
233
|
+
const admitReq = {
|
|
234
|
+
source: "dataforseo",
|
|
235
|
+
capability: "keywords",
|
|
236
|
+
scope: {},
|
|
237
|
+
estRows: q.keywords.length,
|
|
238
|
+
estCostUsd: KEYWORDS_TASK_USD,
|
|
239
|
+
};
|
|
240
|
+
const decision = this.governor.admit(admitReq);
|
|
241
|
+
if (!decision.admit) {
|
|
242
|
+
return { kind: "abstain", reason: decision.reason };
|
|
243
|
+
}
|
|
244
|
+
// -- Only now may a socket open. --
|
|
245
|
+
try {
|
|
246
|
+
const cred = await this.getBasicAuth();
|
|
247
|
+
const res = await this.http.request(DFS_KEYWORDS_URL, {
|
|
248
|
+
method: "POST",
|
|
249
|
+
headers: { Authorization: `Basic ${cred}`, "Content-Type": "application/json" },
|
|
250
|
+
body: JSON.stringify([{ keywords: q.keywords, location_name: q.location }]),
|
|
251
|
+
});
|
|
252
|
+
if (!res.ok) {
|
|
253
|
+
return { kind: "abstain", reason: `dataforseo-http-${res.status}` }; // 402/429/5xx -> abstain, NEVER throw
|
|
254
|
+
}
|
|
255
|
+
const rows = parseKeywords(await res.json(), q.location);
|
|
256
|
+
const actualCostUsd = KEYWORDS_TASK_USD;
|
|
257
|
+
await this.governor.record({ ...admitReq, estRows: rows.length }, actualCostUsd);
|
|
258
|
+
const provenance = {
|
|
259
|
+
source: "dataforseo",
|
|
260
|
+
retrievedAt: new Date().toISOString(),
|
|
261
|
+
costUsd: actualCostUsd,
|
|
262
|
+
};
|
|
263
|
+
return { kind: "data", rows, provenance };
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return { kind: "abstain", reason: "source-error" }; // network/parse error -> abstain, NEVER throw
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Backlinks query. Same ADR-5 preamble; USD cost is `$0.02/req` plus
|
|
271
|
+
* `$0.00003/row` — `admit()` uses the worst-case `q.limit` estimate,
|
|
272
|
+
* `record()`/`provenance.costUsd` use the ACTUAL returned row count.
|
|
273
|
+
*/
|
|
274
|
+
async backlinks(q) {
|
|
275
|
+
// -- STATEMENT 1: egress gate (ADR-5) --
|
|
276
|
+
try {
|
|
277
|
+
this.egress.assertAllowed("serp-provider");
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return { kind: "abstain", reason: "egress-serp-provider-disabled" };
|
|
281
|
+
}
|
|
282
|
+
// -- STATEMENT 2: quota gate (ADR-5); synchronous, never throws --
|
|
283
|
+
const admitReq = {
|
|
284
|
+
source: "dataforseo",
|
|
285
|
+
capability: "backlinks",
|
|
286
|
+
scope: {},
|
|
287
|
+
estRows: q.limit ?? 0,
|
|
288
|
+
estCostUsd: BACKLINKS_BASE_USD + (q.limit ?? 0) * BACKLINKS_PER_ROW_USD, // worst-case pre-emption
|
|
289
|
+
};
|
|
290
|
+
const decision = this.governor.admit(admitReq);
|
|
291
|
+
if (!decision.admit) {
|
|
292
|
+
return { kind: "abstain", reason: decision.reason };
|
|
293
|
+
}
|
|
294
|
+
// -- Only now may a socket open. --
|
|
295
|
+
try {
|
|
296
|
+
const cred = await this.getBasicAuth();
|
|
297
|
+
const res = await this.http.request(DFS_BACKLINKS_URL, {
|
|
298
|
+
method: "POST",
|
|
299
|
+
headers: { Authorization: `Basic ${cred}`, "Content-Type": "application/json" },
|
|
300
|
+
body: JSON.stringify([{ target: q.target, limit: q.limit }]),
|
|
301
|
+
});
|
|
302
|
+
if (!res.ok) {
|
|
303
|
+
return { kind: "abstain", reason: `dataforseo-http-${res.status}` }; // 402/429/5xx -> abstain, NEVER throw
|
|
304
|
+
}
|
|
305
|
+
const rows = parseBacklinks(await res.json());
|
|
306
|
+
// Actual charge is recomputed from the rows actually returned, not the worst-case estimate.
|
|
307
|
+
const actualCostUsd = BACKLINKS_BASE_USD + rows.length * BACKLINKS_PER_ROW_USD;
|
|
308
|
+
await this.governor.record({ ...admitReq, estRows: rows.length }, actualCostUsd);
|
|
309
|
+
const provenance = {
|
|
310
|
+
source: "dataforseo",
|
|
311
|
+
retrievedAt: new Date().toISOString(),
|
|
312
|
+
costUsd: actualCostUsd,
|
|
313
|
+
};
|
|
314
|
+
return { kind: "data", rows, provenance };
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
return { kind: "abstain", reason: "source-error" }; // network/parse error -> abstain, NEVER throw
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// -- Capabilities DataForSEO does not serve; GscAdapter covers these --
|
|
321
|
+
async searchAnalytics(_q) {
|
|
322
|
+
return { kind: "disabled" };
|
|
323
|
+
}
|
|
324
|
+
async urlInspection(_q) {
|
|
325
|
+
return { kind: "disabled" };
|
|
326
|
+
}
|
|
327
|
+
// -- DataForSEO does not serve ai-visibility/link-graph either (spec-20260717-seo-improver-builder, Sprint 1) --
|
|
328
|
+
async aiVisibility(_q) {
|
|
329
|
+
return { kind: "disabled" };
|
|
330
|
+
}
|
|
331
|
+
async linkGraph(_q) {
|
|
332
|
+
return { kind: "disabled" };
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=dataforseo-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataforseo-adapter.js","sourceRoot":"","sources":["../../../src/seo/sources/dataforseo-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAqBxD,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AACjD,MAAM,YAAY,GAAG,GAAG,QAAQ,oCAAoC,CAAC;AACrE,MAAM,gBAAgB,GAAG,GAAG,QAAQ,4CAA4C,CAAC;AACjF,MAAM,iBAAiB,GAAG,GAAG,QAAQ,2BAA2B,CAAC;AAEjE,mGAAmG;AACnG,MAAM,cAAc,GAAuD;IACzE,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,KAAK;CACZ,CAAC;AAEF,mEAAmE;AACnE,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,8EAA8E;AAE9E,gGAAgG;AAChG,SAAS,gBAAgB,CAAC,GAAY;IACpC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAI,GAA+B,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACnD,MAAM,MAAM,GAAI,KAAiC,CAAC,QAAQ,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,KAAK,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,uFAAuF;AACvF,SAAS,SAAS,CAAC,GAAY,EAAE,OAAe,EAAE,QAAgB;IAChE,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,IAAI,OAAO,CAAC,CAAC,eAAe,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,SAAS;QACrF,MAAM,GAAG,GAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;QACxF,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+FAA+F;AAC/F,SAAS,aAAa,CAAC,GAAY,EAAE,QAAgB;IACnD,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ;YAAE,SAAS;QAC/C,MAAM,GAAG,GAAe,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;QAC/B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,IAA+B,CAAC;YAC1C,IAAI,OAAO,CAAC,CAAC,eAAe,CAAC,KAAK,QAAQ;gBAAE,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;YAClF,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ;gBAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,QAAQ;gBAAE,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,SAAS,cAAc,CAAC,GAAY;IAClC,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,CAAC,GAAG,IAA+B,CAAC;QAC1C,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;YAAE,SAAS;QACnF,MAAM,GAAG,GAAgB,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9E,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAiB;IAET;IACA;IAGA;IAIA;IATnB,YACmB,MAAsB,EACtB,QAA0B;IAC3C,gEAAgE;IAChE,6DAA6D;IAC5C,OAAmB,iBAAiB;IACrD,yEAAyE;IACzE,mEAAmE;IACnE,kCAAkC;IACjB,eAAsC,GAAG,EAAE,CAC1D,OAAO,CAAC,OAAO,CACb,MAAM,CAAC,IAAI,CACT,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,EAAE,CACvF,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACrB;QAbc,WAAM,GAAN,MAAM,CAAgB;QACtB,aAAQ,GAAR,QAAQ,CAAkB;QAG1B,SAAI,GAAJ,IAAI,CAAgC;QAIpC,iBAAY,GAAZ,YAAY,CAK1B;IACF,CAAC;IAEJ,YAAY;QACV,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,CAAY;QACrB,yCAAyC;QACzC,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;QACtE,CAAC;QAED,mEAAmE;QACnE,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAiB;YAC7B,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,CAAC,EAAE,sEAAsE;YAClF,UAAU,EAAE,KAAK;SAClB,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACtD,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;gBAChD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;aAChG,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,sCAAsC;YAC7G,CAAC;YACD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;YAEhE,sEAAsE;YACtE,MAAM,aAAa,GAAG,KAAK,CAAC;YAC5B,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAEpD,MAAM,UAAU,GAAmB;gBACjC,MAAM,EAAE,YAAY;gBACpB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,OAAO,EAAE,aAAa;aACvB,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,8CAA8C;QACpG,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,CAAe;QAC5B,yCAAyC;QACzC,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;QACtE,CAAC;QAED,mEAAmE;QACnE,MAAM,QAAQ,GAAiB;YAC7B,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,UAAU;YACtB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;YAC1B,UAAU,EAAE,iBAAiB;SAC9B,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACtD,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBACpD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;aAC5E,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,sCAAsC;YAC7G,CAAC;YACD,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;YAEzD,MAAM,aAAa,GAAG,iBAAiB,CAAC;YACxC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC;YAEjF,MAAM,UAAU,GAAmB;gBACjC,MAAM,EAAE,YAAY;gBACpB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,OAAO,EAAE,aAAa;aACvB,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,8CAA8C;QACpG,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,CAAgB;QAC9B,yCAAyC;QACzC,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;QACtE,CAAC;QAED,mEAAmE;QACnE,MAAM,QAAQ,GAAiB;YAC7B,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,WAAW;YACvB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;YACrB,UAAU,EAAE,kBAAkB,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,qBAAqB,EAAE,yBAAyB;SACnG,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACtD,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE;gBACrD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;aAC7D,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,sCAAsC;YAC7G,CAAC;YACD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAE9C,4FAA4F;YAC5F,MAAM,aAAa,GAAG,kBAAkB,GAAG,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC;YAC/E,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC;YAEjF,MAAM,UAAU,GAAmB;gBACjC,MAAM,EAAE,YAAY;gBACpB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,OAAO,EAAE,aAAa;aACvB,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,8CAA8C;QACpG,CAAC;IACH,CAAC;IAED,wEAAwE;IAExE,KAAK,CAAC,eAAe,CAAC,EAAwB;QAC5C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAsB;QACxC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,iHAAiH;IAEjH,KAAK,CAAC,YAAY,CAAC,EAAqB;QACtC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAkB;QAChC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataForSeoSerpProvider — the `SerpProvider` (`../serp-provider.js`)
|
|
3
|
+
* implementation backed by the DataForSEO SERP API
|
|
4
|
+
* (spec-20260717-seo-improver-builder, Sprint 8; ADR-10).
|
|
5
|
+
*
|
|
6
|
+
* A THIN delegate over the existing, already egress+governor-gated
|
|
7
|
+
* `DataForSeoAdapter.serp` path (`./dataforseo-adapter.ts:190-238`) — this
|
|
8
|
+
* class does no HTTP, no parsing, no egress check, and no USD booking of
|
|
9
|
+
* its own. `adapter.serp` already:
|
|
10
|
+
* 1. asserts the `"serp-provider"` egress axis (`dataforseo-adapter.ts:193`),
|
|
11
|
+
* 2. gates `governor.admit()` before opening a socket,
|
|
12
|
+
* 3. books the actual USD via `governor.record(admitReq, 0.0006)`
|
|
13
|
+
* (`dataforseo-adapter.ts:227`) ONLY after a successful round-trip.
|
|
14
|
+
* Calling it a SECOND time here would double-charge and break the
|
|
15
|
+
* byte-identical-when-off / byte-identical-to-today invariant — so this
|
|
16
|
+
* wrapper's `serp()` body is a single delegating call, nothing else.
|
|
17
|
+
*/
|
|
18
|
+
import type { DataOutcome } from "../types.js";
|
|
19
|
+
import type { SerpRow } from "../data-source.js";
|
|
20
|
+
import type { SerpProvider } from "../serp-provider.js";
|
|
21
|
+
import type { DataForSeoAdapter } from "./dataforseo-adapter.js";
|
|
22
|
+
export declare class DataForSeoSerpProvider implements SerpProvider {
|
|
23
|
+
private readonly adapter;
|
|
24
|
+
readonly name: "dataforseo";
|
|
25
|
+
readonly estCostUsdPerResult = 0.0006;
|
|
26
|
+
constructor(adapter: DataForSeoAdapter);
|
|
27
|
+
/** Delegates to the existing, already egress+governor-gated `adapter.serp` path — output byte-identical to today. */
|
|
28
|
+
serp(keyword: string, location: string): Promise<DataOutcome<SerpRow[]>>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=dataforseo-serp-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataforseo-serp-provider.d.ts","sourceRoot":"","sources":["../../../src/seo/sources/dataforseo-serp-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAUjE,qBAAa,sBAAuB,YAAW,YAAY;IAI7C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IACtC,QAAQ,CAAC,mBAAmB,UAA4B;gBAE3B,OAAO,EAAE,iBAAiB;IAEvD,qHAAqH;IACrH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;CAGzE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documented standard-SERP price (mirrors the `SERP_PRICE_USD.standard`
|
|
3
|
+
* constant, `dataforseo-adapter.ts:67-71` — NOT exported from that module,
|
|
4
|
+
* restated here as metadata only; the real charge is computed and booked
|
|
5
|
+
* inside the wrapped adapter, not by this constant).
|
|
6
|
+
*/
|
|
7
|
+
const DATAFORSEO_SERP_COST_USD = 0.0006;
|
|
8
|
+
export class DataForSeoSerpProvider {
|
|
9
|
+
adapter;
|
|
10
|
+
name = "dataforseo";
|
|
11
|
+
estCostUsdPerResult = DATAFORSEO_SERP_COST_USD;
|
|
12
|
+
constructor(adapter) {
|
|
13
|
+
this.adapter = adapter;
|
|
14
|
+
}
|
|
15
|
+
/** Delegates to the existing, already egress+governor-gated `adapter.serp` path — output byte-identical to today. */
|
|
16
|
+
serp(keyword, location) {
|
|
17
|
+
return this.adapter.serp({ keyword, location });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=dataforseo-serp-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataforseo-serp-provider.js","sourceRoot":"","sources":["../../../src/seo/sources/dataforseo-serp-provider.ts"],"names":[],"mappings":"AAsBA;;;;;GAKG;AACH,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAExC,MAAM,OAAO,sBAAsB;IAIJ;IAHpB,IAAI,GAAG,YAAqB,CAAC;IAC7B,mBAAmB,GAAG,wBAAwB,CAAC;IAExD,YAA6B,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAE3D,qHAAqH;IACrH,IAAI,CAAC,OAAe,EAAE,QAAgB;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClD,CAAC;CACF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatgptUiScrapeParser — PURE, network-free transform from raw scraped
|
|
3
|
+
* ChatGPT-UI answer-page markdown into a normalized `ParsedAnswer` (in-house-
|
|
4
|
+
* ai-visibility, Sprint 10; arch-20260717-in-house-oss-ai-visibility-
|
|
5
|
+
* architecture.md:139-141,250-251,281).
|
|
6
|
+
*
|
|
7
|
+
* This module has ZERO dependencies on damcrawler, egress, or any network
|
|
8
|
+
* primitive — it is a synchronous, deterministic markdown -> data mapping,
|
|
9
|
+
* mirroring `DeterministicMentionCitationExtractor`'s "PURE, synchronous,
|
|
10
|
+
* network-free transform" contract (`./mention-citation-extractor.ts:8`).
|
|
11
|
+
* `ScrapeArmEngineProvider` is the ONLY caller, and it invokes `.parse()`
|
|
12
|
+
* strictly AFTER the raw scraped markdown has already passed through the
|
|
13
|
+
* fail-closed `ContentSanitizer` at the network->in-process boundary
|
|
14
|
+
* (sc-10-2, Sprint-9 F1 lesson) — this parser never sees unsanitized text
|
|
15
|
+
* in production, but it does not (and must not) assume that; it never
|
|
16
|
+
* throws regardless of input.
|
|
17
|
+
*
|
|
18
|
+
* ChatGPT's exported/rendered answer-page markdown is NOT a stable, fully
|
|
19
|
+
* documented format — this parser degrades gracefully on drift: "parser
|
|
20
|
+
* drift => empty answerText => downstream observation counts as not-
|
|
21
|
+
* mentioned" (arch:281) is the explicit contract, not a bug to fix later.
|
|
22
|
+
* Empty/whitespace/malformed input always yields `{ answerText: "",
|
|
23
|
+
* citations: [] }` — this class NEVER fabricates a positive observation.
|
|
24
|
+
*
|
|
25
|
+
* Extraction strategy (deterministic, markdown-shape heuristics only):
|
|
26
|
+
* 1. `answerText` — the raw markdown with any trailing "Sources"/
|
|
27
|
+
* "Citations" section (and any markdown link syntax) stripped, then
|
|
28
|
+
* trimmed. A ChatGPT-UI answer page renders the assistant's prose
|
|
29
|
+
* followed by an optional sources block; this parser treats everything
|
|
30
|
+
* before that block (or the whole trimmed text, when no block is
|
|
31
|
+
* found) as the answer.
|
|
32
|
+
* 2. `citations` — markdown links (`[title](url)`) found ANYWHERE in the
|
|
33
|
+
* raw markdown, deduplicated by URL, mapped to `GroundedCitation`
|
|
34
|
+
* `{ url, title }`. A bare autolink (`<https://...>`) or a bare URL is
|
|
35
|
+
* also captured with its url as its own title (no better title is
|
|
36
|
+
* derivable). Malformed/empty href or link text never crashes the
|
|
37
|
+
* parser — such candidates are simply skipped.
|
|
38
|
+
*/
|
|
39
|
+
import type { GroundedCitation } from "../../providers/grounded-search.js";
|
|
40
|
+
/** Raw scraped page handed to the parser — already sanitized by the caller (sc-10-2). */
|
|
41
|
+
export type RawScrape = {
|
|
42
|
+
url: string;
|
|
43
|
+
markdown: string;
|
|
44
|
+
links?: string[];
|
|
45
|
+
};
|
|
46
|
+
/** Normalized parse result. `citations` reuses the locked `GroundedCitation` shape. */
|
|
47
|
+
export type ParsedAnswer = {
|
|
48
|
+
answerText: string;
|
|
49
|
+
citations: GroundedCitation[];
|
|
50
|
+
};
|
|
51
|
+
export interface EngineScrapeParser {
|
|
52
|
+
parse(raw: RawScrape): ParsedAnswer;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* `EngineScrapeParser` for the `"chatgpt-ui"` scrape engine. PURE,
|
|
56
|
+
* synchronous, dependency-free; never throws; empty/malformed input yields
|
|
57
|
+
* `{ answerText: "", citations: [] }`.
|
|
58
|
+
*/
|
|
59
|
+
export declare class ChatgptUiScrapeParser implements EngineScrapeParser {
|
|
60
|
+
parse(raw: RawScrape): ParsedAnswer;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=engine-scrape-parser-chatgpt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-scrape-parser-chatgpt.d.ts","sourceRoot":"","sources":["../../../src/seo/sources/engine-scrape-parser-chatgpt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAE3E,yFAAyF;AACzF,MAAM,MAAM,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE5E,uFAAuF;AACvF,MAAM,MAAM,YAAY,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,YAAY,CAAC;CACrC;AAiED;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,kBAAkB;IAC9D,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,YAAY;CASpC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** Heading text (case-insensitive) that marks the start of a trailing sources/citations block. */
|
|
2
|
+
const SOURCES_HEADING = /^#{0,6}\s*(sources|citations|references)\s*:?\s*$/im;
|
|
3
|
+
/** Markdown inline link: `[title](url)`. Title may be empty; url must be non-whitespace. */
|
|
4
|
+
const MARKDOWN_LINK = /\[([^\]]*)\]\(\s*(\S+?)\s*(?:"[^"]*")?\s*\)/g;
|
|
5
|
+
/** Bare autolink: `<https://example.com>`. */
|
|
6
|
+
const AUTOLINK = /<((?:https?:\/\/)[^\s<>]+)>/g;
|
|
7
|
+
/** Bare URL not already captured by the two patterns above (best-effort fallback). */
|
|
8
|
+
const BARE_URL = /(?<![("<])\bhttps?:\/\/[^\s)\]"'<>]+/g;
|
|
9
|
+
/** `try { new URL(...) } catch { false }` — never throws; rejects a candidate url as unusable. */
|
|
10
|
+
function isUsableUrl(candidate) {
|
|
11
|
+
try {
|
|
12
|
+
new URL(candidate);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Strips a trailing "Sources"/"Citations"/"References" heading and
|
|
21
|
+
* everything after it, returning only the prose above it. When no such
|
|
22
|
+
* heading is found, returns the input unchanged (the whole text is prose).
|
|
23
|
+
*/
|
|
24
|
+
function stripTrailingSourcesBlock(markdown) {
|
|
25
|
+
const match = SOURCES_HEADING.exec(markdown);
|
|
26
|
+
if (!match)
|
|
27
|
+
return markdown;
|
|
28
|
+
return markdown.slice(0, match.index);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extracts every distinct citation link from the raw markdown — markdown
|
|
32
|
+
* links first, then autolinks, then bare URLs — deduplicated by URL
|
|
33
|
+
* (first-seen title wins). Never throws on malformed link syntax.
|
|
34
|
+
*/
|
|
35
|
+
function extractCitations(markdown) {
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
const citations = [];
|
|
38
|
+
const addCandidate = (url, title) => {
|
|
39
|
+
const trimmedUrl = url.trim();
|
|
40
|
+
if (!trimmedUrl || !isUsableUrl(trimmedUrl) || seen.has(trimmedUrl))
|
|
41
|
+
return;
|
|
42
|
+
seen.add(trimmedUrl);
|
|
43
|
+
const trimmedTitle = title.trim();
|
|
44
|
+
citations.push({ url: trimmedUrl, title: trimmedTitle.length > 0 ? trimmedTitle : trimmedUrl });
|
|
45
|
+
};
|
|
46
|
+
for (const m of markdown.matchAll(MARKDOWN_LINK)) {
|
|
47
|
+
addCandidate(m[2] ?? "", m[1] ?? "");
|
|
48
|
+
}
|
|
49
|
+
for (const m of markdown.matchAll(AUTOLINK)) {
|
|
50
|
+
addCandidate(m[1] ?? "", m[1] ?? "");
|
|
51
|
+
}
|
|
52
|
+
for (const m of markdown.matchAll(BARE_URL)) {
|
|
53
|
+
addCandidate(m[0] ?? "", m[0] ?? "");
|
|
54
|
+
}
|
|
55
|
+
return citations;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* `EngineScrapeParser` for the `"chatgpt-ui"` scrape engine. PURE,
|
|
59
|
+
* synchronous, dependency-free; never throws; empty/malformed input yields
|
|
60
|
+
* `{ answerText: "", citations: [] }`.
|
|
61
|
+
*/
|
|
62
|
+
export class ChatgptUiScrapeParser {
|
|
63
|
+
parse(raw) {
|
|
64
|
+
const markdown = typeof raw?.markdown === "string" ? raw.markdown : "";
|
|
65
|
+
if (markdown.trim().length === 0)
|
|
66
|
+
return { answerText: "", citations: [] };
|
|
67
|
+
const answerText = stripTrailingSourcesBlock(markdown).trim();
|
|
68
|
+
const citations = extractCitations(markdown);
|
|
69
|
+
return { answerText, citations };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=engine-scrape-parser-chatgpt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-scrape-parser-chatgpt.js","sourceRoot":"","sources":["../../../src/seo/sources/engine-scrape-parser-chatgpt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EngineScrapeParser, RawScrape, ParsedAnswer } from "./engine-scrape-parser-chatgpt.js";
|
|
2
|
+
/**
|
|
3
|
+
* `EngineScrapeParser` for the `"perplexity-ui"` scrape engine. PURE,
|
|
4
|
+
* synchronous, dependency-free; never throws; empty/malformed input yields
|
|
5
|
+
* `{ answerText: "", citations: [] }`.
|
|
6
|
+
*/
|
|
7
|
+
export declare class PerplexityUiScrapeParser implements EngineScrapeParser {
|
|
8
|
+
parse(raw: RawScrape): ParsedAnswer;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=engine-scrape-parser-perplexity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-scrape-parser-perplexity.d.ts","sourceRoot":"","sources":["../../../src/seo/sources/engine-scrape-parser-perplexity.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAiErG;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,YAAY;CASpC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** Heading text (case-insensitive) that marks the start of a trailing sources/citations block. */
|
|
2
|
+
const SOURCES_HEADING = /^#{0,6}\s*(sources|citations|references)\s*:?\s*$/im;
|
|
3
|
+
/** Markdown inline link: `[title](url)`. Title may be empty; url must be non-whitespace. */
|
|
4
|
+
const MARKDOWN_LINK = /\[([^\]]*)\]\(\s*(\S+?)\s*(?:"[^"]*")?\s*\)/g;
|
|
5
|
+
/** Bare autolink: `<https://example.com>`. */
|
|
6
|
+
const AUTOLINK = /<((?:https?:\/\/)[^\s<>]+)>/g;
|
|
7
|
+
/** Bare URL not already captured by the two patterns above (best-effort fallback). */
|
|
8
|
+
const BARE_URL = /(?<![("<])\bhttps?:\/\/[^\s)\]"'<>]+/g;
|
|
9
|
+
/** `try { new URL(...) } catch { false }` — never throws; rejects a candidate url as unusable. */
|
|
10
|
+
function isUsableUrl(candidate) {
|
|
11
|
+
try {
|
|
12
|
+
new URL(candidate);
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Strips a trailing "Sources"/"Citations"/"References" heading and
|
|
21
|
+
* everything after it, returning only the prose above it. When no such
|
|
22
|
+
* heading is found, returns the input unchanged (the whole text is prose).
|
|
23
|
+
*/
|
|
24
|
+
function stripTrailingSourcesBlock(markdown) {
|
|
25
|
+
const match = SOURCES_HEADING.exec(markdown);
|
|
26
|
+
if (!match)
|
|
27
|
+
return markdown;
|
|
28
|
+
return markdown.slice(0, match.index);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extracts every distinct citation link from the raw markdown — markdown
|
|
32
|
+
* links first, then autolinks, then bare URLs — deduplicated by URL
|
|
33
|
+
* (first-seen title wins). Never throws on malformed link syntax.
|
|
34
|
+
*/
|
|
35
|
+
function extractCitations(markdown) {
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
const citations = [];
|
|
38
|
+
const addCandidate = (url, title) => {
|
|
39
|
+
const trimmedUrl = url.trim();
|
|
40
|
+
if (!trimmedUrl || !isUsableUrl(trimmedUrl) || seen.has(trimmedUrl))
|
|
41
|
+
return;
|
|
42
|
+
seen.add(trimmedUrl);
|
|
43
|
+
const trimmedTitle = title.trim();
|
|
44
|
+
citations.push({ url: trimmedUrl, title: trimmedTitle.length > 0 ? trimmedTitle : trimmedUrl });
|
|
45
|
+
};
|
|
46
|
+
for (const m of markdown.matchAll(MARKDOWN_LINK)) {
|
|
47
|
+
addCandidate(m[2] ?? "", m[1] ?? "");
|
|
48
|
+
}
|
|
49
|
+
for (const m of markdown.matchAll(AUTOLINK)) {
|
|
50
|
+
addCandidate(m[1] ?? "", m[1] ?? "");
|
|
51
|
+
}
|
|
52
|
+
for (const m of markdown.matchAll(BARE_URL)) {
|
|
53
|
+
addCandidate(m[0] ?? "", m[0] ?? "");
|
|
54
|
+
}
|
|
55
|
+
return citations;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* `EngineScrapeParser` for the `"perplexity-ui"` scrape engine. PURE,
|
|
59
|
+
* synchronous, dependency-free; never throws; empty/malformed input yields
|
|
60
|
+
* `{ answerText: "", citations: [] }`.
|
|
61
|
+
*/
|
|
62
|
+
export class PerplexityUiScrapeParser {
|
|
63
|
+
parse(raw) {
|
|
64
|
+
const markdown = typeof raw?.markdown === "string" ? raw.markdown : "";
|
|
65
|
+
if (markdown.trim().length === 0)
|
|
66
|
+
return { answerText: "", citations: [] };
|
|
67
|
+
const answerText = stripTrailingSourcesBlock(markdown).trim();
|
|
68
|
+
const citations = extractCitations(markdown);
|
|
69
|
+
return { answerText, citations };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=engine-scrape-parser-perplexity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-scrape-parser-perplexity.js","sourceRoot":"","sources":["../../../src/seo/sources/engine-scrape-parser-perplexity.ts"],"names":[],"mappings":"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"}
|