agent-bober 0.17.1 → 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 +26 -0
- package/README.md +402 -10
- 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/answerer.d.ts +17 -0
- package/dist/chat/answerer.d.ts.map +1 -0
- package/dist/chat/answerer.js +52 -0
- package/dist/chat/answerer.js.map +1 -0
- package/dist/chat/approval-cursor.d.ts +25 -0
- package/dist/chat/approval-cursor.d.ts.map +1 -0
- package/dist/chat/approval-cursor.js +61 -0
- package/dist/chat/approval-cursor.js.map +1 -0
- package/dist/chat/approval-reader.d.ts +11 -0
- package/dist/chat/approval-reader.d.ts.map +1 -0
- package/dist/chat/approval-reader.js +20 -0
- package/dist/chat/approval-reader.js.map +1 -0
- package/dist/chat/careful-sidecar.d.ts +15 -0
- package/dist/chat/careful-sidecar.d.ts.map +1 -0
- package/dist/chat/careful-sidecar.js +39 -0
- package/dist/chat/careful-sidecar.js.map +1 -0
- package/dist/chat/chat-session.d.ts +156 -0
- package/dist/chat/chat-session.d.ts.map +1 -0
- package/dist/chat/chat-session.js +570 -0
- package/dist/chat/chat-session.js.map +1 -0
- package/dist/chat/completion-tailer.d.ts +27 -0
- package/dist/chat/completion-tailer.d.ts.map +1 -0
- package/dist/chat/completion-tailer.js +187 -0
- package/dist/chat/completion-tailer.js.map +1 -0
- package/dist/chat/conversation-store.d.ts +22 -0
- package/dist/chat/conversation-store.d.ts.map +1 -0
- package/dist/chat/conversation-store.js +66 -0
- package/dist/chat/conversation-store.js.map +1 -0
- package/dist/chat/cursor-store.d.ts +23 -0
- package/dist/chat/cursor-store.d.ts.map +1 -0
- package/dist/chat/cursor-store.js +42 -0
- package/dist/chat/cursor-store.js.map +1 -0
- package/dist/chat/pid-sidecar.d.ts +22 -0
- package/dist/chat/pid-sidecar.d.ts.map +1 -0
- package/dist/chat/pid-sidecar.js +42 -0
- package/dist/chat/pid-sidecar.js.map +1 -0
- package/dist/chat/roster-reader.d.ts +16 -0
- package/dist/chat/roster-reader.d.ts.map +1 -0
- package/dist/chat/roster-reader.js +39 -0
- package/dist/chat/roster-reader.js.map +1 -0
- package/dist/chat/run-spawner.d.ts +71 -0
- package/dist/chat/run-spawner.d.ts.map +1 -0
- package/dist/chat/run-spawner.js +121 -0
- package/dist/chat/run-spawner.js.map +1 -0
- package/dist/chat/slash-commands.d.ts +40 -0
- package/dist/chat/slash-commands.d.ts.map +1 -0
- package/dist/chat/slash-commands.js +153 -0
- package/dist/chat/slash-commands.js.map +1 -0
- package/dist/chat/steer-cleanup.d.ts +12 -0
- package/dist/chat/steer-cleanup.d.ts.map +1 -0
- package/dist/chat/steer-cleanup.js +60 -0
- package/dist/chat/steer-cleanup.js.map +1 -0
- package/dist/chat/turn-classifier.d.ts +46 -0
- package/dist/chat/turn-classifier.d.ts.map +1 -0
- package/dist/chat/turn-classifier.js +157 -0
- package/dist/chat/turn-classifier.js.map +1 -0
- package/dist/cli/commands/blackboard.d.ts +33 -0
- package/dist/cli/commands/blackboard.d.ts.map +1 -0
- package/dist/cli/commands/blackboard.js +114 -0
- package/dist/cli/commands/blackboard.js.map +1 -0
- 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/chat.d.ts +13 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +43 -0
- package/dist/cli/commands/chat.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/evolve.d.ts +18 -0
- package/dist/cli/commands/evolve.d.ts.map +1 -0
- package/dist/cli/commands/evolve.js +72 -0
- package/dist/cli/commands/evolve.js.map +1 -0
- package/dist/cli/commands/facts.d.ts +15 -0
- package/dist/cli/commands/facts.d.ts.map +1 -0
- package/dist/cli/commands/facts.js +213 -0
- package/dist/cli/commands/facts.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 +49 -0
- package/dist/cli/commands/medical.d.ts.map +1 -0
- package/dist/cli/commands/medical.js +365 -0
- package/dist/cli/commands/medical.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +2 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +94 -7
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +29 -3
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/replay.d.ts +17 -0
- package/dist/cli/commands/replay.d.ts.map +1 -0
- package/dist/cli/commands/replay.js +261 -0
- package/dist/cli/commands/replay.js.map +1 -0
- 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/run.d.ts +9 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +27 -1
- package/dist/cli/commands/run.js.map +1 -1
- 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/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +17 -3
- package/dist/cli/commands/sprint.js.map +1 -1
- 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 +45 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +8 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/role-providers.d.ts +16 -1
- package/dist/config/role-providers.d.ts.map +1 -1
- package/dist/config/role-providers.js +14 -2
- package/dist/config/role-providers.js.map +1 -1
- package/dist/config/schema.d.ts +4050 -454
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +429 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/contracts/eval-result.d.ts +84 -84
- package/dist/contracts/spec.d.ts +28 -28
- package/dist/contracts/sprint-contract.d.ts +4 -4
- 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 +61 -0
- package/dist/fleet/critic-deep.d.ts.map +1 -0
- package/dist/fleet/critic-deep.js +202 -0
- package/dist/fleet/critic-deep.js.map +1 -0
- package/dist/fleet/decomposer-deep-constants.d.ts +4 -0
- package/dist/fleet/decomposer-deep-constants.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep-constants.js +14 -0
- package/dist/fleet/decomposer-deep-constants.js.map +1 -0
- package/dist/fleet/decomposer-deep-types.d.ts +8 -0
- package/dist/fleet/decomposer-deep-types.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep-types.js +9 -0
- package/dist/fleet/decomposer-deep-types.js.map +1 -0
- package/dist/fleet/decomposer-deep.d.ts +44 -0
- package/dist/fleet/decomposer-deep.d.ts.map +1 -0
- package/dist/fleet/decomposer-deep.js +261 -0
- package/dist/fleet/decomposer-deep.js.map +1 -0
- package/dist/fleet/decomposer.d.ts +22 -0
- package/dist/fleet/decomposer.d.ts.map +1 -0
- package/dist/fleet/decomposer.js +144 -0
- package/dist/fleet/decomposer.js.map +1 -0
- package/dist/fleet/index.d.ts +102 -0
- package/dist/fleet/index.d.ts.map +1 -1
- package/dist/fleet/index.js +316 -9
- package/dist/fleet/index.js.map +1 -1
- package/dist/fleet/manifest-write.d.ts +30 -0
- package/dist/fleet/manifest-write.d.ts.map +1 -0
- package/dist/fleet/manifest-write.js +90 -0
- package/dist/fleet/manifest-write.js.map +1 -0
- package/dist/fleet/manifest.d.ts +32 -6
- 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/fleet/shared-blackboard.d.ts +51 -0
- package/dist/fleet/shared-blackboard.d.ts.map +1 -0
- package/dist/fleet/shared-blackboard.js +79 -0
- package/dist/fleet/shared-blackboard.js.map +1 -0
- package/dist/fleet/synthesis.d.ts +16 -0
- package/dist/fleet/synthesis.d.ts.map +1 -0
- package/dist/fleet/synthesis.js +22 -0
- package/dist/fleet/synthesis.js.map +1 -0
- package/dist/fleet/tier-policy.d.ts +18 -0
- package/dist/fleet/tier-policy.d.ts.map +1 -0
- package/dist/fleet/tier-policy.js +53 -0
- package/dist/fleet/tier-policy.js.map +1 -0
- package/dist/fleet/tool-role-guard.d.ts +24 -0
- package/dist/fleet/tool-role-guard.d.ts.map +1 -0
- package/dist/fleet/tool-role-guard.js +55 -0
- package/dist/fleet/tool-role-guard.js.map +1 -0
- 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/incident/types.d.ts +8 -8
- 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/mcp/run-manager.d.ts +9 -1
- package/dist/mcp/run-manager.d.ts.map +1 -1
- package/dist/mcp/run-manager.js.map +1 -1
- package/dist/medical/adapters/apple-health.d.ts +32 -0
- package/dist/medical/adapters/apple-health.d.ts.map +1 -0
- package/dist/medical/adapters/apple-health.js +100 -0
- package/dist/medical/adapters/apple-health.js.map +1 -0
- 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/audit.d.ts +31 -0
- package/dist/medical/audit.d.ts.map +1 -0
- package/dist/medical/audit.js +56 -0
- package/dist/medical/audit.js.map +1 -0
- package/dist/medical/consent.d.ts +37 -0
- package/dist/medical/consent.d.ts.map +1 -0
- package/dist/medical/consent.js +73 -0
- package/dist/medical/consent.js.map +1 -0
- package/dist/medical/disclaimer.d.ts +11 -0
- package/dist/medical/disclaimer.d.ts.map +1 -0
- package/dist/medical/disclaimer.js +21 -0
- package/dist/medical/disclaimer.js.map +1 -0
- package/dist/medical/egress.d.ts +30 -0
- package/dist/medical/egress.d.ts.map +1 -0
- package/dist/medical/egress.js +50 -0
- package/dist/medical/egress.js.map +1 -0
- package/dist/medical/engine.d.ts +73 -0
- package/dist/medical/engine.d.ts.map +1 -0
- package/dist/medical/engine.js +333 -0
- package/dist/medical/engine.js.map +1 -0
- package/dist/medical/guardrails.d.ts +47 -0
- package/dist/medical/guardrails.d.ts.map +1 -0
- package/dist/medical/guardrails.js +92 -0
- package/dist/medical/guardrails.js.map +1 -0
- package/dist/medical/health-store.d.ts +85 -0
- package/dist/medical/health-store.d.ts.map +1 -0
- package/dist/medical/health-store.js +214 -0
- package/dist/medical/health-store.js.map +1 -0
- package/dist/medical/inference.d.ts +22 -0
- package/dist/medical/inference.d.ts.map +1 -0
- package/dist/medical/inference.js +39 -0
- package/dist/medical/inference.js.map +1 -0
- package/dist/medical/ingestion.d.ts +33 -0
- package/dist/medical/ingestion.d.ts.map +1 -0
- package/dist/medical/ingestion.js +52 -0
- package/dist/medical/ingestion.js.map +1 -0
- 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/numerics.d.ts +66 -0
- package/dist/medical/numerics.d.ts.map +1 -0
- package/dist/medical/numerics.js +216 -0
- package/dist/medical/numerics.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/red-flag.d.ts +42 -0
- package/dist/medical/red-flag.d.ts.map +1 -0
- package/dist/medical/red-flag.js +161 -0
- package/dist/medical/red-flag.js.map +1 -0
- package/dist/medical/refusal.d.ts +46 -0
- package/dist/medical/refusal.d.ts.map +1 -0
- package/dist/medical/refusal.js +131 -0
- package/dist/medical/refusal.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/retrieval/grounding-critic.d.ts +34 -0
- package/dist/medical/retrieval/grounding-critic.d.ts.map +1 -0
- package/dist/medical/retrieval/grounding-critic.js +153 -0
- package/dist/medical/retrieval/grounding-critic.js.map +1 -0
- package/dist/medical/retrieval/literature.d.ts +78 -0
- package/dist/medical/retrieval/literature.d.ts.map +1 -0
- package/dist/medical/retrieval/literature.js +292 -0
- package/dist/medical/retrieval/literature.js.map +1 -0
- package/dist/medical/retrieval/medline-source.d.ts +72 -0
- package/dist/medical/retrieval/medline-source.d.ts.map +1 -0
- package/dist/medical/retrieval/medline-source.js +120 -0
- package/dist/medical/retrieval/medline-source.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/medical/team.d.ts +15 -0
- package/dist/medical/team.d.ts.map +1 -0
- package/dist/medical/team.js +44 -0
- package/dist/medical/team.js.map +1 -0
- package/dist/medical/types.d.ts +175 -0
- package/dist/medical/types.d.ts.map +1 -0
- package/dist/medical/types.js +8 -0
- package/dist/medical/types.js.map +1 -0
- package/dist/medical/whoop/whoop-client.d.ts +114 -0
- package/dist/medical/whoop/whoop-client.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-client.js +226 -0
- package/dist/medical/whoop/whoop-client.js.map +1 -0
- package/dist/medical/whoop/whoop-sync.d.ts +25 -0
- package/dist/medical/whoop/whoop-sync.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-sync.js +97 -0
- package/dist/medical/whoop/whoop-sync.js.map +1 -0
- package/dist/medical/whoop/whoop-token.d.ts +44 -0
- package/dist/medical/whoop/whoop-token.d.ts.map +1 -0
- package/dist/medical/whoop/whoop-token.js +66 -0
- package/dist/medical/whoop/whoop-token.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/context-handoff.d.ts +60 -60
- package/dist/orchestrator/contract-materialization.d.ts +33 -0
- package/dist/orchestrator/contract-materialization.d.ts.map +1 -0
- package/dist/orchestrator/contract-materialization.js +113 -0
- package/dist/orchestrator/contract-materialization.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/memory/distill.d.ts +4 -1
- package/dist/orchestrator/memory/distill.d.ts.map +1 -1
- package/dist/orchestrator/memory/distill.js +41 -1
- package/dist/orchestrator/memory/distill.js.map +1 -1
- package/dist/orchestrator/memory/fact-detector.d.ts +61 -0
- package/dist/orchestrator/memory/fact-detector.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-detector.js +153 -0
- package/dist/orchestrator/memory/fact-detector.js.map +1 -0
- package/dist/orchestrator/memory/fact-judge.d.ts +19 -0
- package/dist/orchestrator/memory/fact-judge.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-judge.js +121 -0
- package/dist/orchestrator/memory/fact-judge.js.map +1 -0
- package/dist/orchestrator/memory/fact-retrieve.d.ts +52 -0
- package/dist/orchestrator/memory/fact-retrieve.d.ts.map +1 -0
- package/dist/orchestrator/memory/fact-retrieve.js +117 -0
- package/dist/orchestrator/memory/fact-retrieve.js.map +1 -0
- package/dist/orchestrator/memory/hygiene.d.ts +66 -0
- package/dist/orchestrator/memory/hygiene.d.ts.map +1 -0
- package/dist/orchestrator/memory/hygiene.js +153 -0
- package/dist/orchestrator/memory/hygiene.js.map +1 -0
- package/dist/orchestrator/memory/reconcile.d.ts +47 -0
- package/dist/orchestrator/memory/reconcile.d.ts.map +1 -0
- package/dist/orchestrator/memory/reconcile.js +116 -0
- package/dist/orchestrator/memory/reconcile.js.map +1 -0
- package/dist/orchestrator/memory/retrieve.d.ts +5 -3
- package/dist/orchestrator/memory/retrieve.d.ts.map +1 -1
- package/dist/orchestrator/memory/retrieve.js +9 -6
- package/dist/orchestrator/memory/retrieve.js.map +1 -1
- 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 +29 -4
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +165 -56
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/planner-agent.d.ts.map +1 -1
- package/dist/orchestrator/planner-agent.js +16 -1
- package/dist/orchestrator/planner-agent.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/selfimprove/eval-guards.d.ts +51 -0
- package/dist/orchestrator/selfimprove/eval-guards.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/eval-guards.js +120 -0
- package/dist/orchestrator/selfimprove/eval-guards.js.map +1 -0
- package/dist/orchestrator/selfimprove/gepa.d.ts +74 -0
- package/dist/orchestrator/selfimprove/gepa.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/gepa.js +227 -0
- package/dist/orchestrator/selfimprove/gepa.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-harness.d.ts +65 -0
- package/dist/orchestrator/selfimprove/replay-harness.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-harness.js +134 -0
- package/dist/orchestrator/selfimprove/replay-harness.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-store.d.ts +45 -0
- package/dist/orchestrator/selfimprove/replay-store.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-store.js +119 -0
- package/dist/orchestrator/selfimprove/replay-store.js.map +1 -0
- package/dist/orchestrator/selfimprove/replay-types.d.ts +32 -0
- package/dist/orchestrator/selfimprove/replay-types.d.ts.map +1 -0
- package/dist/orchestrator/selfimprove/replay-types.js +15 -0
- package/dist/orchestrator/selfimprove/replay-types.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 +4 -2
- package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.d.ts +18 -0
- package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
- package/dist/orchestrator/workflow/selector.js +51 -0
- package/dist/orchestrator/workflow/selector.js.map +1 -1
- package/dist/orchestrator/workflow/ts-engine.d.ts +3 -1
- package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/ts-engine.js +2 -2
- package/dist/orchestrator/workflow/ts-engine.js.map +1 -1
- package/dist/orchestrator/workflow/workflow-engine.d.ts +3 -1
- package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -1
- package/dist/orchestrator/workflow/workflow-engine.js +3 -3
- package/dist/orchestrator/workflow/workflow-engine.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 +114 -0
- package/dist/state/facts.d.ts.map +1 -0
- package/dist/state/facts.js +218 -0
- package/dist/state/facts.js.map +1 -0
- package/dist/state/guidance.d.ts +37 -0
- package/dist/state/guidance.d.ts.map +1 -0
- package/dist/state/guidance.js +144 -0
- package/dist/state/guidance.js.map +1 -0
- package/dist/state/history.d.ts +2 -2
- package/dist/state/index.d.ts +2 -2
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +2 -2
- package/dist/state/index.js.map +1 -1
- package/dist/state/memory.d.ts +43 -11
- package/dist/state/memory.d.ts.map +1 -1
- package/dist/state/memory.js +93 -15
- package/dist/state/memory.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/pause.d.ts +47 -0
- package/dist/state/pause.d.ts.map +1 -0
- package/dist/state/pause.js +146 -0
- package/dist/state/pause.js.map +1 -0
- 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/state/sprint-state.d.ts +8 -0
- package/dist/state/sprint-state.d.ts.map +1 -1
- package/dist/state/sprint-state.js +32 -1
- package/dist/state/sprint-state.js.map +1 -1
- package/dist/teams/registry.d.ts +16 -0
- package/dist/teams/registry.d.ts.map +1 -0
- package/dist/teams/registry.js +70 -0
- package/dist/teams/registry.js.map +1 -0
- package/dist/teams/types.d.ts +25 -0
- package/dist/teams/types.d.ts.map +1 -0
- package/dist/teams/types.js +2 -0
- package/dist/teams/types.js.map +1 -0
- 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 +22 -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,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ScrapeThrottle — per-engine scrape rate window + proxy-USD ledger,
|
|
3
|
+
* SEPARATE from the governor USD ledger, SAME mutex + atomic-write +
|
|
4
|
+
* fail-closed discipline as `SeoQuotaGovernor` (spec-20260718-in-house-
|
|
5
|
+
* ai-visibility, Sprint 9; arch ScrapeThrottle §208-220 / ADR-3).
|
|
6
|
+
*
|
|
7
|
+
* The scrape arm's `estCostUsdPerPrompt` is booked as $0 to the
|
|
8
|
+
* `SeoQuotaGovernor` — its real proxy cost is tracked HERE, in an
|
|
9
|
+
* independent, independently-capped filesystem ledger keyed by engine
|
|
10
|
+
* string at `.bober/seo/scrape-throttle-ledger.json` (a DISTINCT path
|
|
11
|
+
* from `.bober/seo/quota-ledger.json`). The two ledgers are never
|
|
12
|
+
* cross-reconciled (arch §320).
|
|
13
|
+
*
|
|
14
|
+
* `acquire(engine)` both DECIDES and CONSUMES a rate slot in one
|
|
15
|
+
* read-modify-write under the shared per-path mutex (`withLedgerLock`,
|
|
16
|
+
* reused from `quota-ledger.ts` — path-generic, so this ledger gets its
|
|
17
|
+
* own serialization chain and cannot interfere with the governor's).
|
|
18
|
+
* It writes ONLY on the granting branch — a refusal has no side effect,
|
|
19
|
+
* mirroring `SeoQuotaGovernor.admit()`.
|
|
20
|
+
*
|
|
21
|
+
* `recordProxyCost(engine, usd)` is the governor's `record()` twin:
|
|
22
|
+
* heals a corrupt ledger back to `{}`, accrues a NaN/negative-guarded
|
|
23
|
+
* USD amount, and writes atomically (temp-file + rename) so a crash
|
|
24
|
+
* mid-write never leaves a torn file.
|
|
25
|
+
*
|
|
26
|
+
* Fail-closed: a corrupt/unreadable ledger makes `acquire` treat proxy
|
|
27
|
+
* spend as `+Infinity` (mirrors the governor's Infinity-on-corrupt
|
|
28
|
+
* refuse) and deny with `reason: "proxy-budget"`. A MISSING ledger
|
|
29
|
+
* (first run) is a fresh `{}` — allow.
|
|
30
|
+
*
|
|
31
|
+
* The clock is INJECTED (`() => ISO string`, mirrors
|
|
32
|
+
* `DamcrawlerCrawlEngine.now`), never `Date.now()` — deterministic
|
|
33
|
+
* rate-window tests drive it across the window boundary explicitly.
|
|
34
|
+
*
|
|
35
|
+
* ISOLATED sprint: no scrape-provider wiring (Sprint 10), no config-
|
|
36
|
+
* schema field (caps come from the constructor), no egress coupling.
|
|
37
|
+
*/
|
|
38
|
+
import { readFile, writeFile, rename } from "node:fs/promises";
|
|
39
|
+
import { randomBytes } from "node:crypto";
|
|
40
|
+
import { dirname } from "node:path";
|
|
41
|
+
import { ensureDir } from "../utils/fs.js";
|
|
42
|
+
import { withLedgerLock } from "./quota-ledger.js";
|
|
43
|
+
// -- Persistence helpers (mirror quota-ledger.ts, own shape) ----------------
|
|
44
|
+
/**
|
|
45
|
+
* Read the scrape-throttle ledger from disk.
|
|
46
|
+
*
|
|
47
|
+
* - Missing file (ENOENT) => fresh empty ledger `{}` (offline/first-run, NOT corrupt).
|
|
48
|
+
* - Existing-but-unreadable or unparseable JSON => `"corrupt"` sentinel so the
|
|
49
|
+
* caller can fail closed (treat proxy spend as at-ceiling).
|
|
50
|
+
*/
|
|
51
|
+
async function readScrapeLedger(path) {
|
|
52
|
+
let raw;
|
|
53
|
+
try {
|
|
54
|
+
raw = await readFile(path, "utf-8");
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
if (err.code === "ENOENT")
|
|
58
|
+
return {};
|
|
59
|
+
return "corrupt";
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(raw);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return "corrupt";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Atomically overwrite the scrape-throttle ledger: write a unique temp file,
|
|
70
|
+
* then rename (POSIX-atomic) so a crash mid-write can never leave a torn file.
|
|
71
|
+
*/
|
|
72
|
+
async function writeScrapeLedgerAtomic(path, ledger) {
|
|
73
|
+
await ensureDir(dirname(path));
|
|
74
|
+
const tmp = `${path}.${process.pid}.${Date.now()}.${randomBytes(4).toString("hex")}.tmp`;
|
|
75
|
+
await writeFile(tmp, JSON.stringify(ledger, null, 2) + "\n", {
|
|
76
|
+
encoding: "utf-8",
|
|
77
|
+
mode: 0o600,
|
|
78
|
+
});
|
|
79
|
+
await rename(tmp, path);
|
|
80
|
+
}
|
|
81
|
+
// -- Throttle -----------------------------------------------------------------
|
|
82
|
+
export class ScrapeThrottle {
|
|
83
|
+
ledgerPath;
|
|
84
|
+
limits;
|
|
85
|
+
now;
|
|
86
|
+
constructor(ledgerPath, limits,
|
|
87
|
+
// Injected clock (ISO string, mirrors DamcrawlerCrawlEngine.now) — NEVER Date.now().
|
|
88
|
+
now = () => new Date().toISOString()) {
|
|
89
|
+
this.ledgerPath = ledgerPath;
|
|
90
|
+
this.limits = limits;
|
|
91
|
+
this.now = now;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Decide whether `engine` may scrape now, consuming a rate slot on grant.
|
|
95
|
+
* Read-modify-write under the per-path mutex; writes ONLY on the granting
|
|
96
|
+
* branch (a refusal has no side effect on the ledger, mirroring
|
|
97
|
+
* `SeoQuotaGovernor.admit()`/`record()` no-write-on-refuse).
|
|
98
|
+
*/
|
|
99
|
+
async acquire(engine) {
|
|
100
|
+
return withLedgerLock(this.ledgerPath, async () => {
|
|
101
|
+
const fresh = await readScrapeLedger(this.ledgerPath); // read fresh from disk INSIDE the lock
|
|
102
|
+
if (fresh === "corrupt") {
|
|
103
|
+
// Fail-closed: mirror the governor's Infinity-on-corrupt spend, which
|
|
104
|
+
// trips the budget check rather than the rate-window check.
|
|
105
|
+
return { proceed: false, reason: "proxy-budget" };
|
|
106
|
+
}
|
|
107
|
+
const nowMs = new Date(this.now()).getTime();
|
|
108
|
+
const existing = fresh[engine];
|
|
109
|
+
const row = existing ? { ...existing } : { windowStart: nowMs, count: 0, proxyUsdSpent: 0 };
|
|
110
|
+
// Fixed-window reset: once the window has elapsed, start a fresh one.
|
|
111
|
+
if (nowMs - row.windowStart >= this.limits.windowMs) {
|
|
112
|
+
row.windowStart = nowMs;
|
|
113
|
+
row.count = 0;
|
|
114
|
+
}
|
|
115
|
+
if (row.proxyUsdSpent >= this.limits.maxProxyUsd) {
|
|
116
|
+
return { proceed: false, reason: "proxy-budget" };
|
|
117
|
+
}
|
|
118
|
+
if (row.count + 1 > this.limits.maxPerWindow) {
|
|
119
|
+
return { proceed: false, reason: "rate-window" };
|
|
120
|
+
}
|
|
121
|
+
row.count += 1;
|
|
122
|
+
const ledger = { ...fresh, [engine]: row };
|
|
123
|
+
await writeScrapeLedgerAtomic(this.ledgerPath, ledger);
|
|
124
|
+
return { proceed: true };
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Persist completed proxy spend for `engine`. Heals a corrupt ledger back
|
|
129
|
+
* to `{}` (corruption blocks `acquire`, not `recordProxyCost` — mirrors
|
|
130
|
+
* `SeoQuotaGovernor.record()`). Guards NaN/negative/zero cost so a bad
|
|
131
|
+
* value can never corrupt or reduce the running total. Concurrent calls
|
|
132
|
+
* sharing `ledgerPath` never lose an update (per-path mutex + read-fresh-
|
|
133
|
+
* inside-lock + atomic write).
|
|
134
|
+
*/
|
|
135
|
+
async recordProxyCost(engine, usd) {
|
|
136
|
+
await withLedgerLock(this.ledgerPath, async () => {
|
|
137
|
+
const fresh = await readScrapeLedger(this.ledgerPath); // read fresh from disk INSIDE the lock
|
|
138
|
+
const ledger = fresh === "corrupt" ? {} : fresh; // record() heals; corruption blocks acquire, not recordProxyCost
|
|
139
|
+
const nowMs = new Date(this.now()).getTime();
|
|
140
|
+
const row = (ledger[engine] ??= { windowStart: nowMs, count: 0, proxyUsdSpent: 0 });
|
|
141
|
+
// Guard NaN/negative/zero cost (mirrors quota-governor.ts:180-182) — never corrupt proxyUsdSpent.
|
|
142
|
+
if (Number.isFinite(usd) && usd > 0) {
|
|
143
|
+
row.proxyUsdSpent += usd;
|
|
144
|
+
}
|
|
145
|
+
await writeScrapeLedgerAtomic(this.ledgerPath, ledger);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=scrape-throttle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrape-throttle.js","sourceRoot":"","sources":["../../src/seo/scrape-throttle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SerpProvider port (spec-20260717-seo-improver-builder, Sprint 8; ADR-10).
|
|
3
|
+
* Mirrors the ADR-5 `AiVisibilityProvider` port shape
|
|
4
|
+
* (`sources/ai-visibility-adapter.ts:73-79`) — `name`, an `estCostUsd*`
|
|
5
|
+
* metadata field, one async method returning a typed `DataOutcome`.
|
|
6
|
+
*
|
|
7
|
+
* Two implementers this sprint:
|
|
8
|
+
* - `DataForSeoSerpProvider` (`sources/dataforseo-serp-provider.ts`) — a
|
|
9
|
+
* thin delegate over the existing, already egress+governor-gated
|
|
10
|
+
* `DataForSeoAdapter.serp` path. Axis `"serp-provider"`; metered USD
|
|
11
|
+
* booked INSIDE the wrapped adapter (never re-booked here).
|
|
12
|
+
* - `DamcrawlerSerpProvider` (`sources/damcrawler-serp-provider.ts`) — a
|
|
13
|
+
* zero-USD scrape via damcrawler's `search()`. Axis `"site-crawl"`
|
|
14
|
+
* (ADR-10: SAME risk surface as the crawler, NOT `"serp-provider"`,
|
|
15
|
+
* which means "licensed metered API").
|
|
16
|
+
*
|
|
17
|
+
* `resolveSerpProvider` below is the `config.seo.serp.provider` selection
|
|
18
|
+
* factory (default `"dataforseo"`, preserving today's serp output
|
|
19
|
+
* byte-identically) — mirrors `selectSource` (`runner.ts:177-195`) in
|
|
20
|
+
* shape, but is NOT wired into `selectSource`/the router this sprint
|
|
21
|
+
* (Sprint 9, nonGoal); callers construct+inject it directly.
|
|
22
|
+
*/
|
|
23
|
+
import type { BoberConfig } from "../config/schema.js";
|
|
24
|
+
import type { DataOutcome } from "./types.js";
|
|
25
|
+
import type { SerpRow } from "./data-source.js";
|
|
26
|
+
import type { SeoEgressGuard } from "./egress.js";
|
|
27
|
+
import type { DataForSeoAdapter } from "./sources/dataforseo-adapter.js";
|
|
28
|
+
/**
|
|
29
|
+
* Provider-agnostic SERP port. `serp(keyword, location)` returns already
|
|
30
|
+
* degrade-safe `DataOutcome<SerpRow[]>` — `disabled`/`abstain`/`data`, NEVER
|
|
31
|
+
* throws (both implementers uphold this, per their own docstrings).
|
|
32
|
+
*/
|
|
33
|
+
export interface SerpProvider {
|
|
34
|
+
readonly name: "dataforseo" | "damcrawler";
|
|
35
|
+
/**
|
|
36
|
+
* Documented per-result USD price (0.0006 for dataforseo, 0 for
|
|
37
|
+
* damcrawler). Metadata only — actual USD is booked (or not booked) by
|
|
38
|
+
* the concrete implementation, never by a caller reading this field.
|
|
39
|
+
*/
|
|
40
|
+
readonly estCostUsdPerResult: number;
|
|
41
|
+
serp(keyword: string, location: string): Promise<DataOutcome<SerpRow[]>>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Select which self-gating `SerpProvider` `config.seo.serp.provider` names
|
|
45
|
+
* (default `"dataforseo"`). This factory does NO gating itself — each
|
|
46
|
+
* returned provider asserts its own egress axis on `.serp()` — it only
|
|
47
|
+
* decides which already-constructed dependency to wrap. Callers supply the
|
|
48
|
+
* `DataForSeoAdapter` and `SeoEgressGuard` they already built (mirrors the
|
|
49
|
+
* dependency-injection style used throughout `src/seo/sources/`).
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveSerpProvider(config: BoberConfig, dataForSeoAdapter: DataForSeoAdapter, egress: SeoEgressGuard): SerpProvider;
|
|
52
|
+
//# sourceMappingURL=serp-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serp-provider.d.ts","sourceRoot":"","sources":["../../src/seo/serp-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAIzE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAAC;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;CAC1E;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,cAAc,GACrB,YAAY,CAKd"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DataForSeoSerpProvider } from "./sources/dataforseo-serp-provider.js";
|
|
2
|
+
import { DamcrawlerSerpProvider } from "./sources/damcrawler-serp-provider.js";
|
|
3
|
+
/**
|
|
4
|
+
* Select which self-gating `SerpProvider` `config.seo.serp.provider` names
|
|
5
|
+
* (default `"dataforseo"`). This factory does NO gating itself — each
|
|
6
|
+
* returned provider asserts its own egress axis on `.serp()` — it only
|
|
7
|
+
* decides which already-constructed dependency to wrap. Callers supply the
|
|
8
|
+
* `DataForSeoAdapter` and `SeoEgressGuard` they already built (mirrors the
|
|
9
|
+
* dependency-injection style used throughout `src/seo/sources/`).
|
|
10
|
+
*/
|
|
11
|
+
export function resolveSerpProvider(config, dataForSeoAdapter, egress) {
|
|
12
|
+
const providerName = config.seo?.serp?.provider ?? "dataforseo";
|
|
13
|
+
return providerName === "damcrawler"
|
|
14
|
+
? new DamcrawlerSerpProvider(egress)
|
|
15
|
+
: new DataForSeoSerpProvider(dataForSeoAdapter);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=serp-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serp-provider.js","sourceRoot":"","sources":["../../src/seo/serp-provider.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAkB/E;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAmB,EACnB,iBAAoC,EACpC,MAAsB;IAEtB,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,IAAI,YAAY,CAAC;IAChE,OAAO,YAAY,KAAK,YAAY;QAClC,CAAC,CAAC,IAAI,sBAAsB,CAAC,MAAM,CAAC;QACpC,CAAC,CAAC,IAAI,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AiVisibilityAdapter — the AI-visibility/GEO `SeoDataSource`
|
|
3
|
+
* (spec-20260717-seo-improver-builder, Sprint 5). Near-verbatim clone of
|
|
4
|
+
* `DataForSeoAdapter.serp` (`./dataforseo-adapter.ts:190-238`) — SAME ADR-5
|
|
5
|
+
* guard→admit→call→record→degrade shape — except the injected transport is
|
|
6
|
+
* an `AiVisibilityProvider` port (not an `HttpClient`), the axis is
|
|
7
|
+
* `"ai-visibility"` (not `"serp-provider"`), and `QuotaRequest.source` is
|
|
8
|
+
* `"ai-visibility"`.
|
|
9
|
+
*
|
|
10
|
+
* ADR-5 (`.bober/architecture/arch-20260716-seo-improver-builder-extension-adr-5.md`)
|
|
11
|
+
* is the load-bearing decision here: the concrete AI-visibility provider is
|
|
12
|
+
* DELIBERATELY unpinned (Stage-1 found no evidence pinning Perplexity,
|
|
13
|
+
* Profound, or any other vendor). This adapter therefore depends on an
|
|
14
|
+
* injected `AiVisibilityProvider` port, never a vendor SDK — swapping
|
|
15
|
+
* providers means writing a new `AiVisibilityProvider` implementation
|
|
16
|
+
* OUTSIDE `src/seo/`, with zero changes to this adapter, the seam, or the
|
|
17
|
+
* egress model. A single `ai-visibility` egress axis gates every provider
|
|
18
|
+
* (no per-vendor axis — that would explode `selectSource`'s all-off
|
|
19
|
+
* predicate and threaten the byte-identical-when-off invariant).
|
|
20
|
+
*
|
|
21
|
+
* `aiVisibility()` begins with the same two gates, IN ORDER, before any
|
|
22
|
+
* network work:
|
|
23
|
+
* 1. `this.egress.assertAllowed("ai-visibility")` — throws when the axis
|
|
24
|
+
* is off; caught immediately and converted to `abstain` WITHOUT ever
|
|
25
|
+
* calling `this.provider.probe()`.
|
|
26
|
+
* 2. `this.governor.admit(req)` — synchronous, never throws, no side
|
|
27
|
+
* effect; refused admission also aborts before `probe()` runs.
|
|
28
|
+
* Only after BOTH gates pass does the injected provider run its probe. Any
|
|
29
|
+
* probe error degrades to `{ kind: "abstain", reason: "source-error" }` —
|
|
30
|
+
* this method NEVER throws to the caller, and `governor.record()` is called
|
|
31
|
+
* ONLY after a successful `probe()` (nothing is ever booked for a failed
|
|
32
|
+
* probe).
|
|
33
|
+
*
|
|
34
|
+
* The real global `fetch` is referenced NOWHERE in this file — the injected
|
|
35
|
+
* `AiVisibilityProvider` is the sole transport, and no vendor SDK is
|
|
36
|
+
* imported anywhere under `src/seo/` (sc-5-4). Tests inject a hand-rolled
|
|
37
|
+
* fake provider; production wiring for a real provider is a later sprint
|
|
38
|
+
* (Sprint 9, nonGoal here).
|
|
39
|
+
*/
|
|
40
|
+
import type { SeoEgressGuard } from "../egress.js";
|
|
41
|
+
import type { SeoQuotaGovernor } from "../quota-governor.js";
|
|
42
|
+
import type { SeoDataSource, SeoCapability, SearchAnalyticsQuery, SearchAnalyticsRow, UrlInspectionQuery, UrlInspectionRow, SerpQuery, SerpRow, KeywordQuery, KeywordRow, BacklinkQuery, BacklinkRow, AiVisibilityQuery, AiVisibilityRow, LinkGraphQuery, LinkGraphRow } from "../data-source.js";
|
|
43
|
+
import type { DataOutcome } from "../types.js";
|
|
44
|
+
/**
|
|
45
|
+
* Provider-agnostic AI-visibility port (ADR-5). The concrete vendor
|
|
46
|
+
* (Perplexity, a self-hosted probe harness, a future provider) lives
|
|
47
|
+
* OUTSIDE `src/seo/` and is injected via the `AiVisibilityAdapter`
|
|
48
|
+
* constructor — this interface is the ONLY provider surface this module
|
|
49
|
+
* knows about.
|
|
50
|
+
*
|
|
51
|
+
* `probe()` returns already-typed `AiVisibilityRow[]` — each concrete
|
|
52
|
+
* provider is responsible for mapping its own vendor response shape into
|
|
53
|
+
* this row type; the adapter does no vendor-specific parsing.
|
|
54
|
+
*/
|
|
55
|
+
export interface AiVisibilityProvider {
|
|
56
|
+
/** Provider identifier (surfaced in `AiVisibilityRow.provider` by the concrete implementation, not by this adapter). */
|
|
57
|
+
readonly name: string;
|
|
58
|
+
/** Fixed per-prompt USD price — the adapter computes `estCostUsd = estCostUsdPerPrompt * prompts.length`. */
|
|
59
|
+
readonly estCostUsdPerPrompt: number;
|
|
60
|
+
probe(target: string, prompts: string[], locale?: string): Promise<AiVisibilityRow[]>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* AI-visibility `SeoDataSource`. Serves ONLY `ai-visibility` — every other
|
|
64
|
+
* capability is `{ kind: "disabled" }` unconditionally (this adapter is not
|
|
65
|
+
* a GSC/DataForSEO/crawl source).
|
|
66
|
+
*/
|
|
67
|
+
export declare class AiVisibilityAdapter implements SeoDataSource {
|
|
68
|
+
private readonly egress;
|
|
69
|
+
private readonly governor;
|
|
70
|
+
private readonly provider;
|
|
71
|
+
constructor(egress: SeoEgressGuard, governor: SeoQuotaGovernor, provider: AiVisibilityProvider);
|
|
72
|
+
capabilities(): SeoCapability[];
|
|
73
|
+
/**
|
|
74
|
+
* AI-visibility probe. ADR-5 preamble (egress gate, then quota gate) runs
|
|
75
|
+
* before any network work; USD cost is `estCostUsdPerPrompt * prompts.length`
|
|
76
|
+
* — booked in `admit()` (estimate) and `record()` (actual, identical since
|
|
77
|
+
* the price is a fixed per-prompt rate).
|
|
78
|
+
*/
|
|
79
|
+
aiVisibility(q: AiVisibilityQuery): Promise<DataOutcome<AiVisibilityRow[]>>;
|
|
80
|
+
searchAnalytics(_q: SearchAnalyticsQuery): Promise<DataOutcome<SearchAnalyticsRow[]>>;
|
|
81
|
+
urlInspection(_q: UrlInspectionQuery): Promise<DataOutcome<UrlInspectionRow[]>>;
|
|
82
|
+
serp(_q: SerpQuery): Promise<DataOutcome<SerpRow[]>>;
|
|
83
|
+
keywords(_q: KeywordQuery): Promise<DataOutcome<KeywordRow[]>>;
|
|
84
|
+
backlinks(_q: BacklinkQuery): Promise<DataOutcome<BacklinkRow[]>>;
|
|
85
|
+
linkGraph(_q: LinkGraphQuery): Promise<DataOutcome<LinkGraphRow[]>>;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=ai-visibility-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-visibility-adapter.d.ts","sourceRoot":"","sources":["../../../src/seo/sources/ai-visibility-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACT,OAAO,EACP,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,YAAY,EACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAE/D;;;;;;;;;;GAUG;AACH,MAAM,WAAW,oBAAoB;IACnC,wHAAwH;IACxH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6GAA6G;IAC7G,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CACvF;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAErD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAGzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAJR,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,gBAAgB,EAG1B,QAAQ,EAAE,oBAAoB;IAGjD,YAAY,IAAI,aAAa,EAAE;IAI/B;;;;;OAKG;IACG,YAAY,CAAC,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC;IA2C3E,eAAe,CAAC,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAIrF,aAAa,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAI/E,IAAI,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAIpD,QAAQ,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC;IAI9D,SAAS,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAIjE,SAAS,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;CAG1E"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI-visibility `SeoDataSource`. Serves ONLY `ai-visibility` — every other
|
|
3
|
+
* capability is `{ kind: "disabled" }` unconditionally (this adapter is not
|
|
4
|
+
* a GSC/DataForSEO/crawl source).
|
|
5
|
+
*/
|
|
6
|
+
export class AiVisibilityAdapter {
|
|
7
|
+
egress;
|
|
8
|
+
governor;
|
|
9
|
+
provider;
|
|
10
|
+
constructor(egress, governor,
|
|
11
|
+
// Injectable, provider-agnostic port — REQUIRED, no default (ADR-5: no
|
|
12
|
+
// vendor is pinned, so there is no sane default to fall back to).
|
|
13
|
+
provider) {
|
|
14
|
+
this.egress = egress;
|
|
15
|
+
this.governor = governor;
|
|
16
|
+
this.provider = provider;
|
|
17
|
+
}
|
|
18
|
+
capabilities() {
|
|
19
|
+
return ["ai-visibility"];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* AI-visibility probe. ADR-5 preamble (egress gate, then quota gate) runs
|
|
23
|
+
* before any network work; USD cost is `estCostUsdPerPrompt * prompts.length`
|
|
24
|
+
* — booked in `admit()` (estimate) and `record()` (actual, identical since
|
|
25
|
+
* the price is a fixed per-prompt rate).
|
|
26
|
+
*/
|
|
27
|
+
async aiVisibility(q) {
|
|
28
|
+
// -- STATEMENT 1: egress gate (ADR-5) --
|
|
29
|
+
try {
|
|
30
|
+
this.egress.assertAllowed("ai-visibility");
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return { kind: "abstain", reason: "egress-ai-visibility-disabled" };
|
|
34
|
+
}
|
|
35
|
+
// -- STATEMENT 2: quota gate (ADR-5); synchronous, never throws --
|
|
36
|
+
const estCostUsd = this.provider.estCostUsdPerPrompt * q.prompts.length;
|
|
37
|
+
const admitReq = {
|
|
38
|
+
source: "ai-visibility",
|
|
39
|
+
capability: "ai-visibility",
|
|
40
|
+
scope: {},
|
|
41
|
+
estRows: q.prompts.length, // inert for non-gsc sources (quota-governor.ts admit()/record())
|
|
42
|
+
estCostUsd,
|
|
43
|
+
};
|
|
44
|
+
const decision = this.governor.admit(admitReq);
|
|
45
|
+
if (!decision.admit) {
|
|
46
|
+
return { kind: "abstain", reason: decision.reason };
|
|
47
|
+
}
|
|
48
|
+
// -- Only now may the provider open a socket. --
|
|
49
|
+
try {
|
|
50
|
+
const rows = await this.provider.probe(q.target, q.prompts, q.locale);
|
|
51
|
+
// Fixed per-prompt price — the actual charge equals the estimate.
|
|
52
|
+
const actualCostUsd = estCostUsd;
|
|
53
|
+
await this.governor.record(admitReq, actualCostUsd); // ONLY after success
|
|
54
|
+
const provenance = {
|
|
55
|
+
source: "ai-visibility",
|
|
56
|
+
retrievedAt: new Date().toISOString(),
|
|
57
|
+
costUsd: actualCostUsd,
|
|
58
|
+
};
|
|
59
|
+
return { kind: "data", rows, provenance };
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return { kind: "abstain", reason: "source-error" }; // provider error -> abstain, NEVER throw, NOTHING booked
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// -- Capabilities this adapter does not serve (all { kind: "disabled" }) --
|
|
66
|
+
async searchAnalytics(_q) {
|
|
67
|
+
return { kind: "disabled" };
|
|
68
|
+
}
|
|
69
|
+
async urlInspection(_q) {
|
|
70
|
+
return { kind: "disabled" };
|
|
71
|
+
}
|
|
72
|
+
async serp(_q) {
|
|
73
|
+
return { kind: "disabled" };
|
|
74
|
+
}
|
|
75
|
+
async keywords(_q) {
|
|
76
|
+
return { kind: "disabled" };
|
|
77
|
+
}
|
|
78
|
+
async backlinks(_q) {
|
|
79
|
+
return { kind: "disabled" };
|
|
80
|
+
}
|
|
81
|
+
async linkGraph(_q) {
|
|
82
|
+
return { kind: "disabled" };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=ai-visibility-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-visibility-adapter.js","sourceRoot":"","sources":["../../../src/seo/sources/ai-visibility-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ApiSpineEngineProvider — one grounded-search engine's `AiVisibilityProvider`
|
|
3
|
+
* (in-house-ai-visibility, Sprint 2, wired in Sprint 4;
|
|
4
|
+
* arch-20260717-in-house-oss-ai-visibility-architecture.md:44,84-97,278).
|
|
5
|
+
*
|
|
6
|
+
* Mirrors `DamcrawlerSerpProvider`'s injected-deps + `readonly name`/
|
|
7
|
+
* `readonly estCost...` shape (`./damcrawler-serp-provider.ts:69-101`), but
|
|
8
|
+
* the injected transport is a Sprint-1 `GroundedSearchClient` (not
|
|
9
|
+
* damcrawler). There is still no egress gate here — the transport's own
|
|
10
|
+
* network call is ungated (that remains the ADAPTER's/factory's job) — but
|
|
11
|
+
* as of Sprint 4 this class DOES own two boundary responsibilities per
|
|
12
|
+
* ADR-11: (1) sanitize every piece of grounded free-text (`answerText` +
|
|
13
|
+
* each candidate citation url) via the injected `ContentSanitizer` BEFORE
|
|
14
|
+
* the row is built, and (2) verify each sanitized candidate url via the
|
|
15
|
+
* injected `CitationVerifier` (gated by the `site-crawl` axis inside the
|
|
16
|
+
* verifier itself) and retain ONLY `live === true` urls in `row.sourceUrls`
|
|
17
|
+
* — an unverifiable citation NEVER reaches a row (sc-4-2).
|
|
18
|
+
*
|
|
19
|
+
* `probe()` runs `samplesPerPrompt` (N) independent grounded-search samples
|
|
20
|
+
* per prompt and emits ONE raw `AiVisibilityRow` per real observation —
|
|
21
|
+
* never a pre-aggregate ("Every arm emits raw per-(prompt,provider,sample)
|
|
22
|
+
* AiVisibilityRows ... so API and scrape signal are structurally
|
|
23
|
+
* unmixable", architecture:44). Each row is stamped with `this.name`
|
|
24
|
+
* (`= client.engine`), so a future multiplexer can tell which engine
|
|
25
|
+
* produced which observation without any additional bookkeeping.
|
|
26
|
+
*
|
|
27
|
+
* Cost accounting (ADR-3, `arch-20260717-in-house-oss-ai-visibility-adr-3.md`):
|
|
28
|
+
* the LOCKED `AiVisibilityAdapter` books `estCostUsdPerPrompt * prompts.length`
|
|
29
|
+
* (`ai-visibility-adapter.ts:114`) — it has no notion of N. So N MUST be
|
|
30
|
+
* baked into `estCostUsdPerPrompt` here: `estCostUsdPerPrompt = perCallUsd *
|
|
31
|
+
* samplesPerPrompt`. Getting this wrong under-books the USD ceiling.
|
|
32
|
+
*
|
|
33
|
+
* Sample-failure contract (sc-2-4, architecture:278 "Sample throws =>
|
|
34
|
+
* dropped (wider CI); all fail => abstain, nothing booked"): a single
|
|
35
|
+
* rejecting sample is caught and `continue`d — it never throws out of the
|
|
36
|
+
* loop, is never mislabeled, and never fabricates a citation. If EVERY
|
|
37
|
+
* attempted sample across every prompt rejects, `probe()` throws instead of
|
|
38
|
+
* returning `[]` — the (not-yet-wired) adapter converts any probe throw
|
|
39
|
+
* into `abstain` + books nothing (`ai-visibility-adapter.ts:141-143`), which
|
|
40
|
+
* is exactly the "all fail => abstain, nothing booked" outcome. Calling
|
|
41
|
+
* `probe()` with zero prompts or `samplesPerPrompt <= 0` attempts nothing
|
|
42
|
+
* and returns `[]` without throwing (there is no failure to report). This
|
|
43
|
+
* contract is unaffected by the Sprint-4 sanitize/verify additions: verifier
|
|
44
|
+
* errors stay INSIDE `probe` (fail-closed, `live:false`) and never throw
|
|
45
|
+
* out of the sample loop — so cost accounting in the adapter (which books
|
|
46
|
+
* only after a successful `probe()`) is unaffected by a verification
|
|
47
|
+
* failure.
|
|
48
|
+
*/
|
|
49
|
+
import type { AiVisibilityProvider } from "./ai-visibility-adapter.js";
|
|
50
|
+
import type { AiVisibilityRow } from "../data-source.js";
|
|
51
|
+
import type { GroundedEngine, GroundedSearchClient } from "../../providers/grounded-search.js";
|
|
52
|
+
import type { MentionCitationExtractor } from "./mention-citation-extractor.js";
|
|
53
|
+
import type { CitationVerifier } from "./citation-verifier.js";
|
|
54
|
+
import type { ContentSanitizer } from "../content-sanitizer.js";
|
|
55
|
+
export declare class ApiSpineEngineProvider implements AiVisibilityProvider {
|
|
56
|
+
private readonly client;
|
|
57
|
+
private readonly extractor;
|
|
58
|
+
private readonly samplesPerPrompt;
|
|
59
|
+
private readonly verifier;
|
|
60
|
+
private readonly sanitizer;
|
|
61
|
+
readonly name: GroundedEngine;
|
|
62
|
+
readonly estCostUsdPerPrompt: number;
|
|
63
|
+
constructor(client: GroundedSearchClient, extractor: MentionCitationExtractor, samplesPerPrompt: number, perCallUsd: number, verifier: CitationVerifier, sanitizer: ContentSanitizer);
|
|
64
|
+
probe(target: string, prompts: string[], locale?: string): Promise<AiVisibilityRow[]>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=api-spine-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-spine-provider.d.ts","sourceRoot":"","sources":["../../../src/seo/sources/api-spine-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAkB,cAAc,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC/G,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,qBAAa,sBAAuB,YAAW,oBAAoB;IAK/D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAEjC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAT5B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;gBAGlB,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,wBAAwB,EACnC,gBAAgB,EAAE,MAAM,EACzC,UAAU,EAAE,MAAM,EACD,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,gBAAgB;IAMxC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAsD5F"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export class ApiSpineEngineProvider {
|
|
2
|
+
client;
|
|
3
|
+
extractor;
|
|
4
|
+
samplesPerPrompt;
|
|
5
|
+
verifier;
|
|
6
|
+
sanitizer;
|
|
7
|
+
name;
|
|
8
|
+
estCostUsdPerPrompt;
|
|
9
|
+
constructor(client, extractor, samplesPerPrompt, perCallUsd, verifier, sanitizer) {
|
|
10
|
+
this.client = client;
|
|
11
|
+
this.extractor = extractor;
|
|
12
|
+
this.samplesPerPrompt = samplesPerPrompt;
|
|
13
|
+
this.verifier = verifier;
|
|
14
|
+
this.sanitizer = sanitizer;
|
|
15
|
+
this.name = client.engine; // every row is stamped with the injected client's engine
|
|
16
|
+
this.estCostUsdPerPrompt = perCallUsd * samplesPerPrompt; // ADR-3: N baked in, once, from the SAME N used below
|
|
17
|
+
}
|
|
18
|
+
async probe(target, prompts, locale) {
|
|
19
|
+
const rows = [];
|
|
20
|
+
let attempted = 0;
|
|
21
|
+
for (const prompt of prompts) {
|
|
22
|
+
for (let i = 0; i < this.samplesPerPrompt; i++) {
|
|
23
|
+
attempted += 1;
|
|
24
|
+
let answer;
|
|
25
|
+
try {
|
|
26
|
+
answer = await this.client.search(prompt, locale);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
continue; // sc-2-4: drop the failed sample — never throw, never mislabel, never merge
|
|
30
|
+
}
|
|
31
|
+
// sc-4-3: sanitize every piece of grounded free-text at the
|
|
32
|
+
// network->in-process boundary BEFORE the row is built — the
|
|
33
|
+
// sanitized answerText feeds the extractor, and every candidate
|
|
34
|
+
// citation url is sanitized before it is handed to the verifier.
|
|
35
|
+
const sanitizedAnswerText = this.sanitizer.clean(answer.answerText, target).content;
|
|
36
|
+
const sanitizedCitations = answer.citations.map((c) => ({
|
|
37
|
+
...c,
|
|
38
|
+
url: this.sanitizer.clean(c.url, c.url).content,
|
|
39
|
+
}));
|
|
40
|
+
const obs = await this.extractor.extract({ target, answerText: sanitizedAnswerText, citations: sanitizedCitations });
|
|
41
|
+
// sc-4-2: verify every candidate url; retain ONLY live===true urls.
|
|
42
|
+
// The verifier itself is fail-closed (site-crawl off / dep absent /
|
|
43
|
+
// scrape error all degrade to live:false) — never fabricate a live
|
|
44
|
+
// citation here.
|
|
45
|
+
const verified = await this.verifier.verify(target, obs.sourceUrls);
|
|
46
|
+
const sourceUrls = verified.filter((v) => v.live).map((v) => v.url);
|
|
47
|
+
const row = {
|
|
48
|
+
prompt,
|
|
49
|
+
provider: this.name,
|
|
50
|
+
mentioned: obs.mentioned,
|
|
51
|
+
citationPresent: obs.citationPresent,
|
|
52
|
+
sourceUrls,
|
|
53
|
+
};
|
|
54
|
+
if (obs.rank !== undefined)
|
|
55
|
+
row.rank = obs.rank; // optional-key omission — never `rank: undefined`
|
|
56
|
+
rows.push(row);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Every attempted sample rejected (and at least one was attempted): throw
|
|
60
|
+
// so the caller (a future adapter) can degrade to abstain + book nothing,
|
|
61
|
+
// rather than silently returning an empty-but-successful `[]`.
|
|
62
|
+
if (attempted > 0 && rows.length === 0) {
|
|
63
|
+
throw new Error("ApiSpineEngineProvider: every sample rejected");
|
|
64
|
+
}
|
|
65
|
+
return rows;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=api-spine-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-spine-provider.js","sourceRoot":"","sources":["../../../src/seo/sources/api-spine-provider.ts"],"names":[],"mappings":"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"}
|