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.
Files changed (824) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +11 -0
  3. package/README.md +245 -6
  4. package/agents/bober-art-director.md +100 -0
  5. package/agents/bober-design-critic.md +114 -0
  6. package/agents/bober-frontend-builder.md +101 -0
  7. package/agents/bober-security-auditor.md +193 -0
  8. package/agents/bober-security-verifier.md +104 -0
  9. package/agents/bober-seo-strategist.md +144 -0
  10. package/agents/bober-seo-verifier.md +103 -0
  11. package/dist/calendar/calendar-egress.d.ts +26 -0
  12. package/dist/calendar/calendar-egress.d.ts.map +1 -0
  13. package/dist/calendar/calendar-egress.js +35 -0
  14. package/dist/calendar/calendar-egress.js.map +1 -0
  15. package/dist/calendar/calendar-token.d.ts +34 -0
  16. package/dist/calendar/calendar-token.d.ts.map +1 -0
  17. package/dist/calendar/calendar-token.js +56 -0
  18. package/dist/calendar/calendar-token.js.map +1 -0
  19. package/dist/calendar/connector.d.ts +22 -0
  20. package/dist/calendar/connector.d.ts.map +1 -0
  21. package/dist/calendar/connector.js +3 -0
  22. package/dist/calendar/connector.js.map +1 -0
  23. package/dist/calendar/finding-source.d.ts +20 -0
  24. package/dist/calendar/finding-source.d.ts.map +1 -0
  25. package/dist/calendar/finding-source.js +35 -0
  26. package/dist/calendar/finding-source.js.map +1 -0
  27. package/dist/calendar/google-connector.d.ts +65 -0
  28. package/dist/calendar/google-connector.d.ts.map +1 -0
  29. package/dist/calendar/google-connector.js +129 -0
  30. package/dist/calendar/google-connector.js.map +1 -0
  31. package/dist/calendar/ics-connector.d.ts +12 -0
  32. package/dist/calendar/ics-connector.d.ts.map +1 -0
  33. package/dist/calendar/ics-connector.js +48 -0
  34. package/dist/calendar/ics-connector.js.map +1 -0
  35. package/dist/calendar/proposal-gate.d.ts +84 -0
  36. package/dist/calendar/proposal-gate.d.ts.map +1 -0
  37. package/dist/calendar/proposal-gate.js +126 -0
  38. package/dist/calendar/proposal-gate.js.map +1 -0
  39. package/dist/calendar/slotter.d.ts +34 -0
  40. package/dist/calendar/slotter.d.ts.map +1 -0
  41. package/dist/calendar/slotter.js +196 -0
  42. package/dist/calendar/slotter.js.map +1 -0
  43. package/dist/calendar/types.d.ts +162 -0
  44. package/dist/calendar/types.d.ts.map +1 -0
  45. package/dist/calendar/types.js +28 -0
  46. package/dist/calendar/types.js.map +1 -0
  47. package/dist/chat/chat-session.d.ts +27 -0
  48. package/dist/chat/chat-session.d.ts.map +1 -1
  49. package/dist/chat/chat-session.js +101 -1
  50. package/dist/chat/chat-session.js.map +1 -1
  51. package/dist/chat/slash-commands.d.ts +6 -2
  52. package/dist/chat/slash-commands.d.ts.map +1 -1
  53. package/dist/chat/slash-commands.js +22 -2
  54. package/dist/chat/slash-commands.js.map +1 -1
  55. package/dist/chat/turn-classifier.d.ts +3 -0
  56. package/dist/chat/turn-classifier.d.ts.map +1 -1
  57. package/dist/chat/turn-classifier.js +7 -0
  58. package/dist/chat/turn-classifier.js.map +1 -1
  59. package/dist/cli/commands/calendar.d.ts +75 -0
  60. package/dist/cli/commands/calendar.d.ts.map +1 -0
  61. package/dist/cli/commands/calendar.js +203 -0
  62. package/dist/cli/commands/calendar.js.map +1 -0
  63. package/dist/cli/commands/do.d.ts +52 -0
  64. package/dist/cli/commands/do.d.ts.map +1 -0
  65. package/dist/cli/commands/do.js +216 -0
  66. package/dist/cli/commands/do.js.map +1 -0
  67. package/dist/cli/commands/hub.d.ts +29 -0
  68. package/dist/cli/commands/hub.d.ts.map +1 -0
  69. package/dist/cli/commands/hub.js +233 -0
  70. package/dist/cli/commands/hub.js.map +1 -0
  71. package/dist/cli/commands/medical.d.ts +25 -0
  72. package/dist/cli/commands/medical.d.ts.map +1 -1
  73. package/dist/cli/commands/medical.js +233 -0
  74. package/dist/cli/commands/medical.js.map +1 -1
  75. package/dist/cli/commands/research.d.ts +41 -0
  76. package/dist/cli/commands/research.d.ts.map +1 -0
  77. package/dist/cli/commands/research.js +313 -0
  78. package/dist/cli/commands/research.js.map +1 -0
  79. package/dist/cli/commands/security-audit.d.ts +89 -0
  80. package/dist/cli/commands/security-audit.d.ts.map +1 -0
  81. package/dist/cli/commands/security-audit.js +238 -0
  82. package/dist/cli/commands/security-audit.js.map +1 -0
  83. package/dist/cli/commands/task.d.ts +64 -0
  84. package/dist/cli/commands/task.d.ts.map +1 -0
  85. package/dist/cli/commands/task.js +422 -0
  86. package/dist/cli/commands/task.js.map +1 -0
  87. package/dist/cli/commands/telegram.d.ts +10 -0
  88. package/dist/cli/commands/telegram.d.ts.map +1 -0
  89. package/dist/cli/commands/telegram.js +44 -0
  90. package/dist/cli/commands/telegram.js.map +1 -0
  91. package/dist/cli/commands/vault.d.ts +40 -0
  92. package/dist/cli/commands/vault.d.ts.map +1 -0
  93. package/dist/cli/commands/vault.js +122 -0
  94. package/dist/cli/commands/vault.js.map +1 -0
  95. package/dist/cli/index.js +33 -0
  96. package/dist/cli/index.js.map +1 -1
  97. package/dist/config/role-providers.d.ts +15 -0
  98. package/dist/config/role-providers.d.ts.map +1 -1
  99. package/dist/config/role-providers.js +8 -1
  100. package/dist/config/role-providers.js.map +1 -1
  101. package/dist/config/schema.d.ts +3522 -171
  102. package/dist/config/schema.d.ts.map +1 -1
  103. package/dist/config/schema.js +405 -2
  104. package/dist/config/schema.js.map +1 -1
  105. package/dist/do-bridge/coding-promoter.d.ts +19 -0
  106. package/dist/do-bridge/coding-promoter.d.ts.map +1 -0
  107. package/dist/do-bridge/coding-promoter.js +43 -0
  108. package/dist/do-bridge/coding-promoter.js.map +1 -0
  109. package/dist/do-bridge/finding-port.d.ts +88 -0
  110. package/dist/do-bridge/finding-port.d.ts.map +1 -0
  111. package/dist/do-bridge/finding-port.js +95 -0
  112. package/dist/do-bridge/finding-port.js.map +1 -0
  113. package/dist/do-bridge/launcher.d.ts +55 -0
  114. package/dist/do-bridge/launcher.d.ts.map +1 -0
  115. package/dist/do-bridge/launcher.js +37 -0
  116. package/dist/do-bridge/launcher.js.map +1 -0
  117. package/dist/do-bridge/promote.d.ts +50 -0
  118. package/dist/do-bridge/promote.d.ts.map +1 -0
  119. package/dist/do-bridge/promote.js +116 -0
  120. package/dist/do-bridge/promote.js.map +1 -0
  121. package/dist/do-bridge/reconcile.d.ts +50 -0
  122. package/dist/do-bridge/reconcile.d.ts.map +1 -0
  123. package/dist/do-bridge/reconcile.js +70 -0
  124. package/dist/do-bridge/reconcile.js.map +1 -0
  125. package/dist/do-bridge/registry.d.ts +23 -0
  126. package/dist/do-bridge/registry.d.ts.map +1 -0
  127. package/dist/do-bridge/registry.js +42 -0
  128. package/dist/do-bridge/registry.js.map +1 -0
  129. package/dist/do-bridge/types.d.ts +50 -0
  130. package/dist/do-bridge/types.d.ts.map +1 -0
  131. package/dist/do-bridge/types.js +17 -0
  132. package/dist/do-bridge/types.js.map +1 -0
  133. package/dist/fleet/child-config.d.ts.map +1 -1
  134. package/dist/fleet/child-config.js +7 -0
  135. package/dist/fleet/child-config.js.map +1 -1
  136. package/dist/fleet/coordinator.d.ts +27 -1
  137. package/dist/fleet/coordinator.d.ts.map +1 -1
  138. package/dist/fleet/coordinator.js +70 -0
  139. package/dist/fleet/coordinator.js.map +1 -1
  140. package/dist/fleet/critic-deep.d.ts +9 -1
  141. package/dist/fleet/critic-deep.d.ts.map +1 -1
  142. package/dist/fleet/critic-deep.js +5 -2
  143. package/dist/fleet/critic-deep.js.map +1 -1
  144. package/dist/fleet/decomposer-deep.d.ts +4 -11
  145. package/dist/fleet/decomposer-deep.d.ts.map +1 -1
  146. package/dist/fleet/decomposer-deep.js +5 -5
  147. package/dist/fleet/decomposer-deep.js.map +1 -1
  148. package/dist/fleet/index.d.ts +9 -0
  149. package/dist/fleet/index.d.ts.map +1 -1
  150. package/dist/fleet/index.js +87 -8
  151. package/dist/fleet/index.js.map +1 -1
  152. package/dist/fleet/manifest.d.ts +26 -0
  153. package/dist/fleet/manifest.d.ts.map +1 -1
  154. package/dist/fleet/manifest.js +8 -0
  155. package/dist/fleet/manifest.js.map +1 -1
  156. package/dist/fleet/reporter.d.ts +4 -1
  157. package/dist/fleet/reporter.d.ts.map +1 -1
  158. package/dist/fleet/reporter.js +2 -1
  159. package/dist/fleet/reporter.js.map +1 -1
  160. package/dist/fleet/scaffolder.d.ts +5 -1
  161. package/dist/fleet/scaffolder.d.ts.map +1 -1
  162. package/dist/fleet/scaffolder.js +11 -2
  163. package/dist/fleet/scaffolder.js.map +1 -1
  164. package/dist/graph/client.d.ts.map +1 -1
  165. package/dist/graph/client.js +115 -23
  166. package/dist/graph/client.js.map +1 -1
  167. package/dist/graph/mcp-client.d.ts +1 -0
  168. package/dist/graph/mcp-client.d.ts.map +1 -1
  169. package/dist/graph/mcp-client.js +58 -7
  170. package/dist/graph/mcp-client.js.map +1 -1
  171. package/dist/hub/collector.d.ts +12 -0
  172. package/dist/hub/collector.d.ts.map +1 -0
  173. package/dist/hub/collector.js +36 -0
  174. package/dist/hub/collector.js.map +1 -0
  175. package/dist/hub/finding-source.d.ts +22 -0
  176. package/dist/hub/finding-source.d.ts.map +1 -0
  177. package/dist/hub/finding-source.js +41 -0
  178. package/dist/hub/finding-source.js.map +1 -0
  179. package/dist/hub/finding-store.d.ts +68 -0
  180. package/dist/hub/finding-store.d.ts.map +1 -0
  181. package/dist/hub/finding-store.js +122 -0
  182. package/dist/hub/finding-store.js.map +1 -0
  183. package/dist/hub/finding.d.ts +54 -0
  184. package/dist/hub/finding.d.ts.map +1 -0
  185. package/dist/hub/finding.js +24 -0
  186. package/dist/hub/finding.js.map +1 -0
  187. package/dist/hub/gmail-to-task.d.ts +69 -0
  188. package/dist/hub/gmail-to-task.d.ts.map +1 -0
  189. package/dist/hub/gmail-to-task.js +102 -0
  190. package/dist/hub/gmail-to-task.js.map +1 -0
  191. package/dist/hub/hub-config.d.ts +18 -0
  192. package/dist/hub/hub-config.d.ts.map +1 -0
  193. package/dist/hub/hub-config.js +40 -0
  194. package/dist/hub/hub-config.js.map +1 -0
  195. package/dist/hub/judge.d.ts +30 -0
  196. package/dist/hub/judge.d.ts.map +1 -0
  197. package/dist/hub/judge.js +177 -0
  198. package/dist/hub/judge.js.map +1 -0
  199. package/dist/hub/lenses.d.ts +60 -0
  200. package/dist/hub/lenses.d.ts.map +1 -0
  201. package/dist/hub/lenses.js +123 -0
  202. package/dist/hub/lenses.js.map +1 -0
  203. package/dist/hub/priority-md.d.ts +21 -0
  204. package/dist/hub/priority-md.d.ts.map +1 -0
  205. package/dist/hub/priority-md.js +64 -0
  206. package/dist/hub/priority-md.js.map +1 -0
  207. package/dist/hub/repo-resolver.d.ts +11 -0
  208. package/dist/hub/repo-resolver.d.ts.map +1 -0
  209. package/dist/hub/repo-resolver.js +39 -0
  210. package/dist/hub/repo-resolver.js.map +1 -0
  211. package/dist/hub/scope.d.ts +39 -0
  212. package/dist/hub/scope.d.ts.map +1 -0
  213. package/dist/hub/scope.js +62 -0
  214. package/dist/hub/scope.js.map +1 -0
  215. package/dist/hub/task-inbox.d.ts +16 -0
  216. package/dist/hub/task-inbox.d.ts.map +1 -0
  217. package/dist/hub/task-inbox.js +39 -0
  218. package/dist/hub/task-inbox.js.map +1 -0
  219. package/dist/incident/resolution-verify.d.ts +2 -2
  220. package/dist/index.d.ts +2 -1
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +2 -1
  223. package/dist/index.js.map +1 -1
  224. package/dist/medical/adapters/apple-health.js +1 -1
  225. package/dist/medical/adapters/apple-health.js.map +1 -1
  226. package/dist/medical/analysis/cadence.d.ts +32 -0
  227. package/dist/medical/analysis/cadence.d.ts.map +1 -0
  228. package/dist/medical/analysis/cadence.js +72 -0
  229. package/dist/medical/analysis/cadence.js.map +1 -0
  230. package/dist/medical/analysis/cross-marker.d.ts +33 -0
  231. package/dist/medical/analysis/cross-marker.d.ts.map +1 -0
  232. package/dist/medical/analysis/cross-marker.js +79 -0
  233. package/dist/medical/analysis/cross-marker.js.map +1 -0
  234. package/dist/medical/analysis/finding-writer.d.ts +26 -0
  235. package/dist/medical/analysis/finding-writer.d.ts.map +1 -0
  236. package/dist/medical/analysis/finding-writer.js +60 -0
  237. package/dist/medical/analysis/finding-writer.js.map +1 -0
  238. package/dist/medical/analysis/finding.d.ts +63 -0
  239. package/dist/medical/analysis/finding.d.ts.map +1 -0
  240. package/dist/medical/analysis/finding.js +70 -0
  241. package/dist/medical/analysis/finding.js.map +1 -0
  242. package/dist/medical/analysis/review-pass.d.ts +76 -0
  243. package/dist/medical/analysis/review-pass.d.ts.map +1 -0
  244. package/dist/medical/analysis/review-pass.js +119 -0
  245. package/dist/medical/analysis/review-pass.js.map +1 -0
  246. package/dist/medical/analysis/trends.d.ts +36 -0
  247. package/dist/medical/analysis/trends.d.ts.map +1 -0
  248. package/dist/medical/analysis/trends.js +157 -0
  249. package/dist/medical/analysis/trends.js.map +1 -0
  250. package/dist/medical/health-store.d.ts +5 -0
  251. package/dist/medical/health-store.d.ts.map +1 -1
  252. package/dist/medical/health-store.js +10 -0
  253. package/dist/medical/health-store.js.map +1 -1
  254. package/dist/medical/lab-note.d.ts +72 -0
  255. package/dist/medical/lab-note.d.ts.map +1 -0
  256. package/dist/medical/lab-note.js +161 -0
  257. package/dist/medical/lab-note.js.map +1 -0
  258. package/dist/medical/lab-pdf-parser.d.ts +19 -0
  259. package/dist/medical/lab-pdf-parser.d.ts.map +1 -0
  260. package/dist/medical/lab-pdf-parser.js +57 -0
  261. package/dist/medical/lab-pdf-parser.js.map +1 -0
  262. package/dist/medical/lab-reindex.d.ts +24 -0
  263. package/dist/medical/lab-reindex.d.ts.map +1 -0
  264. package/dist/medical/lab-reindex.js +45 -0
  265. package/dist/medical/lab-reindex.js.map +1 -0
  266. package/dist/medical/lab-types.d.ts +75 -0
  267. package/dist/medical/lab-types.d.ts.map +1 -0
  268. package/dist/medical/lab-types.js +17 -0
  269. package/dist/medical/lab-types.js.map +1 -0
  270. package/dist/medical/profile.d.ts +96 -0
  271. package/dist/medical/profile.d.ts.map +1 -0
  272. package/dist/medical/profile.js +273 -0
  273. package/dist/medical/profile.js.map +1 -0
  274. package/dist/medical/recommend/context.d.ts +48 -0
  275. package/dist/medical/recommend/context.d.ts.map +1 -0
  276. package/dist/medical/recommend/context.js +109 -0
  277. package/dist/medical/recommend/context.js.map +1 -0
  278. package/dist/medical/recommend/judge-panel.d.ts +49 -0
  279. package/dist/medical/recommend/judge-panel.d.ts.map +1 -0
  280. package/dist/medical/recommend/judge-panel.js +164 -0
  281. package/dist/medical/recommend/judge-panel.js.map +1 -0
  282. package/dist/medical/recommend/lenses.d.ts +72 -0
  283. package/dist/medical/recommend/lenses.d.ts.map +1 -0
  284. package/dist/medical/recommend/lenses.js +220 -0
  285. package/dist/medical/recommend/lenses.js.map +1 -0
  286. package/dist/medical/recommend/recommend.d.ts +86 -0
  287. package/dist/medical/recommend/recommend.d.ts.map +1 -0
  288. package/dist/medical/recommend/recommend.js +211 -0
  289. package/dist/medical/recommend/recommend.js.map +1 -0
  290. package/dist/medical/recommend/types.d.ts +98 -0
  291. package/dist/medical/recommend/types.d.ts.map +1 -0
  292. package/dist/medical/recommend/types.js +20 -0
  293. package/dist/medical/recommend/types.js.map +1 -0
  294. package/dist/medical/recommend/urgency.d.ts +26 -0
  295. package/dist/medical/recommend/urgency.d.ts.map +1 -0
  296. package/dist/medical/recommend/urgency.js +124 -0
  297. package/dist/medical/recommend/urgency.js.map +1 -0
  298. package/dist/medical/research/online-research.d.ts +65 -0
  299. package/dist/medical/research/online-research.d.ts.map +1 -0
  300. package/dist/medical/research/online-research.js +101 -0
  301. package/dist/medical/research/online-research.js.map +1 -0
  302. package/dist/medical/research/research-note.d.ts +32 -0
  303. package/dist/medical/research/research-note.d.ts.map +1 -0
  304. package/dist/medical/research/research-note.js +55 -0
  305. package/dist/medical/research/research-note.js.map +1 -0
  306. package/dist/medical/supplements.d.ts +82 -0
  307. package/dist/medical/supplements.d.ts.map +1 -0
  308. package/dist/medical/supplements.js +173 -0
  309. package/dist/medical/supplements.js.map +1 -0
  310. package/dist/orchestrator/agentic-loop.d.ts +160 -1
  311. package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
  312. package/dist/orchestrator/agentic-loop.js +350 -41
  313. package/dist/orchestrator/agentic-loop.js.map +1 -1
  314. package/dist/orchestrator/compaction.d.ts +47 -0
  315. package/dist/orchestrator/compaction.d.ts.map +1 -0
  316. package/dist/orchestrator/compaction.js +75 -0
  317. package/dist/orchestrator/compaction.js.map +1 -0
  318. package/dist/orchestrator/generator-agent.d.ts +19 -0
  319. package/dist/orchestrator/generator-agent.d.ts.map +1 -1
  320. package/dist/orchestrator/generator-agent.js +27 -1
  321. package/dist/orchestrator/generator-agent.js.map +1 -1
  322. package/dist/orchestrator/loop-events.d.ts +98 -0
  323. package/dist/orchestrator/loop-events.d.ts.map +1 -0
  324. package/dist/orchestrator/loop-events.js +2 -0
  325. package/dist/orchestrator/loop-events.js.map +1 -0
  326. package/dist/orchestrator/model-resolver.d.ts.map +1 -1
  327. package/dist/orchestrator/model-resolver.js +10 -6
  328. package/dist/orchestrator/model-resolver.js.map +1 -1
  329. package/dist/orchestrator/pipeline.d.ts +10 -1
  330. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  331. package/dist/orchestrator/pipeline.js +102 -4
  332. package/dist/orchestrator/pipeline.js.map +1 -1
  333. package/dist/orchestrator/security-audit-types.d.ts +53 -0
  334. package/dist/orchestrator/security-audit-types.d.ts.map +1 -0
  335. package/dist/orchestrator/security-audit-types.js +10 -0
  336. package/dist/orchestrator/security-audit-types.js.map +1 -0
  337. package/dist/orchestrator/security-auditor-agent.d.ts +68 -0
  338. package/dist/orchestrator/security-auditor-agent.d.ts.map +1 -0
  339. package/dist/orchestrator/security-auditor-agent.js +482 -0
  340. package/dist/orchestrator/security-auditor-agent.js.map +1 -0
  341. package/dist/orchestrator/security-gate.d.ts +73 -0
  342. package/dist/orchestrator/security-gate.d.ts.map +1 -0
  343. package/dist/orchestrator/security-gate.js +174 -0
  344. package/dist/orchestrator/security-gate.js.map +1 -0
  345. package/dist/orchestrator/security-hub.d.ts +45 -0
  346. package/dist/orchestrator/security-hub.d.ts.map +1 -0
  347. package/dist/orchestrator/security-hub.js +147 -0
  348. package/dist/orchestrator/security-hub.js.map +1 -0
  349. package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts +43 -0
  350. package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts.map +1 -0
  351. package/dist/orchestrator/security-knowledge/benchmark/harness.js +13 -0
  352. package/dist/orchestrator/security-knowledge/benchmark/harness.js.map +1 -0
  353. package/dist/orchestrator/security-knowledge/diff-provider.d.ts +79 -0
  354. package/dist/orchestrator/security-knowledge/diff-provider.d.ts.map +1 -0
  355. package/dist/orchestrator/security-knowledge/diff-provider.js +320 -0
  356. package/dist/orchestrator/security-knowledge/diff-provider.js.map +1 -0
  357. package/dist/orchestrator/security-knowledge/index.d.ts +22 -0
  358. package/dist/orchestrator/security-knowledge/index.d.ts.map +1 -0
  359. package/dist/orchestrator/security-knowledge/index.js +66 -0
  360. package/dist/orchestrator/security-knowledge/index.js.map +1 -0
  361. package/dist/orchestrator/security-knowledge/parser.d.ts +9 -0
  362. package/dist/orchestrator/security-knowledge/parser.d.ts.map +1 -0
  363. package/dist/orchestrator/security-knowledge/parser.js +137 -0
  364. package/dist/orchestrator/security-knowledge/parser.js.map +1 -0
  365. package/dist/orchestrator/security-knowledge/registry.d.ts +25 -0
  366. package/dist/orchestrator/security-knowledge/registry.d.ts.map +1 -0
  367. package/dist/orchestrator/security-knowledge/registry.js +114 -0
  368. package/dist/orchestrator/security-knowledge/registry.js.map +1 -0
  369. package/dist/orchestrator/security-knowledge/resolver.d.ts +48 -0
  370. package/dist/orchestrator/security-knowledge/resolver.d.ts.map +1 -0
  371. package/dist/orchestrator/security-knowledge/resolver.js +63 -0
  372. package/dist/orchestrator/security-knowledge/resolver.js.map +1 -0
  373. package/dist/orchestrator/security-knowledge/selector.d.ts +18 -0
  374. package/dist/orchestrator/security-knowledge/selector.d.ts.map +1 -0
  375. package/dist/orchestrator/security-knowledge/selector.js +46 -0
  376. package/dist/orchestrator/security-knowledge/selector.js.map +1 -0
  377. package/dist/orchestrator/security-knowledge/signature.d.ts +37 -0
  378. package/dist/orchestrator/security-knowledge/signature.d.ts.map +1 -0
  379. package/dist/orchestrator/security-knowledge/signature.js +2 -0
  380. package/dist/orchestrator/security-knowledge/signature.js.map +1 -0
  381. package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts +29 -0
  382. package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts.map +1 -0
  383. package/dist/orchestrator/security-knowledge/supply-chain-inspector.js +211 -0
  384. package/dist/orchestrator/security-knowledge/supply-chain-inspector.js.map +1 -0
  385. package/dist/orchestrator/security-scanners.d.ts +126 -0
  386. package/dist/orchestrator/security-scanners.d.ts.map +1 -0
  387. package/dist/orchestrator/security-scanners.js +501 -0
  388. package/dist/orchestrator/security-scanners.js.map +1 -0
  389. package/dist/orchestrator/security-verifier-agent.d.ts +62 -0
  390. package/dist/orchestrator/security-verifier-agent.d.ts.map +1 -0
  391. package/dist/orchestrator/security-verifier-agent.js +230 -0
  392. package/dist/orchestrator/security-verifier-agent.js.map +1 -0
  393. package/dist/orchestrator/session-store.d.ts +95 -0
  394. package/dist/orchestrator/session-store.d.ts.map +1 -0
  395. package/dist/orchestrator/session-store.js +186 -0
  396. package/dist/orchestrator/session-store.js.map +1 -0
  397. package/dist/orchestrator/stack-knowledge.d.ts +17 -0
  398. package/dist/orchestrator/stack-knowledge.d.ts.map +1 -0
  399. package/dist/orchestrator/stack-knowledge.js +35 -0
  400. package/dist/orchestrator/stack-knowledge.js.map +1 -0
  401. package/dist/orchestrator/subagents.d.ts +62 -0
  402. package/dist/orchestrator/subagents.d.ts.map +1 -0
  403. package/dist/orchestrator/subagents.js +143 -0
  404. package/dist/orchestrator/subagents.js.map +1 -0
  405. package/dist/orchestrator/tools/executor.d.ts +68 -0
  406. package/dist/orchestrator/tools/executor.d.ts.map +1 -0
  407. package/dist/orchestrator/tools/executor.js +104 -0
  408. package/dist/orchestrator/tools/executor.js.map +1 -0
  409. package/dist/orchestrator/tools/mcp-bridge.d.ts +76 -0
  410. package/dist/orchestrator/tools/mcp-bridge.d.ts.map +1 -0
  411. package/dist/orchestrator/tools/mcp-bridge.js +154 -0
  412. package/dist/orchestrator/tools/mcp-bridge.js.map +1 -0
  413. package/dist/orchestrator/tools/schemas.d.ts.map +1 -1
  414. package/dist/orchestrator/tools/schemas.js +3 -0
  415. package/dist/orchestrator/tools/schemas.js.map +1 -1
  416. package/dist/orchestrator/workflow/budget.d.ts +24 -2
  417. package/dist/orchestrator/workflow/budget.d.ts.map +1 -1
  418. package/dist/orchestrator/workflow/budget.js +39 -1
  419. package/dist/orchestrator/workflow/budget.js.map +1 -1
  420. package/dist/orchestrator/workflow/engine.d.ts +1 -1
  421. package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
  422. package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
  423. package/dist/orchestrator/workflow/selector.js +10 -0
  424. package/dist/orchestrator/workflow/selector.js.map +1 -1
  425. package/dist/providers/anthropic.d.ts.map +1 -1
  426. package/dist/providers/anthropic.js +116 -26
  427. package/dist/providers/anthropic.js.map +1 -1
  428. package/dist/providers/claude-code.d.ts.map +1 -1
  429. package/dist/providers/claude-code.js +17 -0
  430. package/dist/providers/claude-code.js.map +1 -1
  431. package/dist/providers/cost-meter.d.ts +52 -0
  432. package/dist/providers/cost-meter.d.ts.map +1 -0
  433. package/dist/providers/cost-meter.js +81 -0
  434. package/dist/providers/cost-meter.js.map +1 -0
  435. package/dist/providers/factory.d.ts +6 -1
  436. package/dist/providers/factory.d.ts.map +1 -1
  437. package/dist/providers/factory.js +24 -5
  438. package/dist/providers/factory.js.map +1 -1
  439. package/dist/providers/google.d.ts.map +1 -1
  440. package/dist/providers/google.js +29 -0
  441. package/dist/providers/google.js.map +1 -1
  442. package/dist/providers/grounded-search.d.ts +128 -0
  443. package/dist/providers/grounded-search.d.ts.map +1 -0
  444. package/dist/providers/grounded-search.js +160 -0
  445. package/dist/providers/grounded-search.js.map +1 -0
  446. package/dist/providers/openai-compat.d.ts +15 -1
  447. package/dist/providers/openai-compat.d.ts.map +1 -1
  448. package/dist/providers/openai-compat.js +24 -0
  449. package/dist/providers/openai-compat.js.map +1 -1
  450. package/dist/providers/openai.d.ts +7 -0
  451. package/dist/providers/openai.d.ts.map +1 -1
  452. package/dist/providers/openai.js +95 -4
  453. package/dist/providers/openai.js.map +1 -1
  454. package/dist/providers/types.d.ts +88 -0
  455. package/dist/providers/types.d.ts.map +1 -1
  456. package/dist/research/cadence.d.ts +33 -0
  457. package/dist/research/cadence.d.ts.map +1 -0
  458. package/dist/research/cadence.js +55 -0
  459. package/dist/research/cadence.js.map +1 -0
  460. package/dist/research/digest.d.ts +80 -0
  461. package/dist/research/digest.d.ts.map +1 -0
  462. package/dist/research/digest.js +119 -0
  463. package/dist/research/digest.js.map +1 -0
  464. package/dist/research/egress.d.ts +28 -0
  465. package/dist/research/egress.d.ts.map +1 -0
  466. package/dist/research/egress.js +41 -0
  467. package/dist/research/egress.js.map +1 -0
  468. package/dist/research/job-store.d.ts +30 -0
  469. package/dist/research/job-store.d.ts.map +1 -0
  470. package/dist/research/job-store.js +100 -0
  471. package/dist/research/job-store.js.map +1 -0
  472. package/dist/research/model-diversity.d.ts +27 -0
  473. package/dist/research/model-diversity.d.ts.map +1 -0
  474. package/dist/research/model-diversity.js +52 -0
  475. package/dist/research/model-diversity.js.map +1 -0
  476. package/dist/research/note-writer.d.ts +36 -0
  477. package/dist/research/note-writer.d.ts.map +1 -0
  478. package/dist/research/note-writer.js +53 -0
  479. package/dist/research/note-writer.js.map +1 -0
  480. package/dist/research/online-retrieval.d.ts +27 -0
  481. package/dist/research/online-retrieval.d.ts.map +1 -0
  482. package/dist/research/online-retrieval.js +22 -0
  483. package/dist/research/online-retrieval.js.map +1 -0
  484. package/dist/research/runner.d.ts +80 -0
  485. package/dist/research/runner.d.ts.map +1 -0
  486. package/dist/research/runner.js +115 -0
  487. package/dist/research/runner.js.map +1 -0
  488. package/dist/research/scheduler.d.ts +61 -0
  489. package/dist/research/scheduler.d.ts.map +1 -0
  490. package/dist/research/scheduler.js +58 -0
  491. package/dist/research/scheduler.js.map +1 -0
  492. package/dist/research/types.d.ts +81 -0
  493. package/dist/research/types.d.ts.map +1 -0
  494. package/dist/research/types.js +57 -0
  495. package/dist/research/types.js.map +1 -0
  496. package/dist/seo/adapters/http.d.ts +43 -0
  497. package/dist/seo/adapters/http.d.ts.map +1 -0
  498. package/dist/seo/adapters/http.js +35 -0
  499. package/dist/seo/adapters/http.js.map +1 -0
  500. package/dist/seo/ai-visibility-provider.d.ts +171 -0
  501. package/dist/seo/ai-visibility-provider.d.ts.map +1 -0
  502. package/dist/seo/ai-visibility-provider.js +165 -0
  503. package/dist/seo/ai-visibility-provider.js.map +1 -0
  504. package/dist/seo/ai-visibility-scorer.d.ts +43 -0
  505. package/dist/seo/ai-visibility-scorer.d.ts.map +1 -0
  506. package/dist/seo/ai-visibility-scorer.js +102 -0
  507. package/dist/seo/ai-visibility-scorer.js.map +1 -0
  508. package/dist/seo/analyzer.d.ts +58 -0
  509. package/dist/seo/analyzer.d.ts.map +1 -0
  510. package/dist/seo/analyzer.js +265 -0
  511. package/dist/seo/analyzer.js.map +1 -0
  512. package/dist/seo/benchmark/harness.d.ts +56 -0
  513. package/dist/seo/benchmark/harness.d.ts.map +1 -0
  514. package/dist/seo/benchmark/harness.js +172 -0
  515. package/dist/seo/benchmark/harness.js.map +1 -0
  516. package/dist/seo/builder/approved-finding.d.ts +115 -0
  517. package/dist/seo/builder/approved-finding.d.ts.map +1 -0
  518. package/dist/seo/builder/approved-finding.js +145 -0
  519. package/dist/seo/builder/approved-finding.js.map +1 -0
  520. package/dist/seo/builder/build-runner.d.ts +41 -0
  521. package/dist/seo/builder/build-runner.d.ts.map +1 -0
  522. package/dist/seo/builder/build-runner.js +156 -0
  523. package/dist/seo/builder/build-runner.js.map +1 -0
  524. package/dist/seo/builder/draft-generators.d.ts +32 -0
  525. package/dist/seo/builder/draft-generators.d.ts.map +1 -0
  526. package/dist/seo/builder/draft-generators.js +31 -0
  527. package/dist/seo/builder/draft-generators.js.map +1 -0
  528. package/dist/seo/builder/draft-store.d.ts +30 -0
  529. package/dist/seo/builder/draft-store.d.ts.map +1 -0
  530. package/dist/seo/builder/draft-store.js +76 -0
  531. package/dist/seo/builder/draft-store.js.map +1 -0
  532. package/dist/seo/builder/draft-types.d.ts +36 -0
  533. package/dist/seo/builder/draft-types.d.ts.map +1 -0
  534. package/dist/seo/builder/draft-types.js +14 -0
  535. package/dist/seo/builder/draft-types.js.map +1 -0
  536. package/dist/seo/builder/hub-approved-source.d.ts +11 -0
  537. package/dist/seo/builder/hub-approved-source.d.ts.map +1 -0
  538. package/dist/seo/builder/hub-approved-source.js +48 -0
  539. package/dist/seo/builder/hub-approved-source.js.map +1 -0
  540. package/dist/seo/builder/seo-builder.d.ts +72 -0
  541. package/dist/seo/builder/seo-builder.d.ts.map +1 -0
  542. package/dist/seo/builder/seo-builder.js +72 -0
  543. package/dist/seo/builder/seo-builder.js.map +1 -0
  544. package/dist/seo/citation-gate.d.ts +36 -0
  545. package/dist/seo/citation-gate.d.ts.map +1 -0
  546. package/dist/seo/citation-gate.js +59 -0
  547. package/dist/seo/citation-gate.js.map +1 -0
  548. package/dist/seo/command.d.ts +11 -0
  549. package/dist/seo/command.d.ts.map +1 -0
  550. package/dist/seo/command.js +90 -0
  551. package/dist/seo/command.js.map +1 -0
  552. package/dist/seo/content-sanitizer.d.ts +56 -0
  553. package/dist/seo/content-sanitizer.d.ts.map +1 -0
  554. package/dist/seo/content-sanitizer.js +55 -0
  555. package/dist/seo/content-sanitizer.js.map +1 -0
  556. package/dist/seo/crawl-engine.d.ts +35 -0
  557. package/dist/seo/crawl-engine.d.ts.map +1 -0
  558. package/dist/seo/crawl-engine.js +2 -0
  559. package/dist/seo/crawl-engine.js.map +1 -0
  560. package/dist/seo/data-source.d.ts +156 -0
  561. package/dist/seo/data-source.d.ts.map +1 -0
  562. package/dist/seo/data-source.js +2 -0
  563. package/dist/seo/data-source.js.map +1 -0
  564. package/dist/seo/egress.d.ts +39 -0
  565. package/dist/seo/egress.d.ts.map +1 -0
  566. package/dist/seo/egress.js +64 -0
  567. package/dist/seo/egress.js.map +1 -0
  568. package/dist/seo/hub-emitter.d.ts +28 -0
  569. package/dist/seo/hub-emitter.d.ts.map +1 -0
  570. package/dist/seo/hub-emitter.js +95 -0
  571. package/dist/seo/hub-emitter.js.map +1 -0
  572. package/dist/seo/index.d.ts +42 -0
  573. package/dist/seo/index.d.ts.map +1 -0
  574. package/dist/seo/index.js +19 -0
  575. package/dist/seo/index.js.map +1 -0
  576. package/dist/seo/never-encode-filter.d.ts +45 -0
  577. package/dist/seo/never-encode-filter.d.ts.map +1 -0
  578. package/dist/seo/never-encode-filter.js +51 -0
  579. package/dist/seo/never-encode-filter.js.map +1 -0
  580. package/dist/seo/parser.d.ts +46 -0
  581. package/dist/seo/parser.d.ts.map +1 -0
  582. package/dist/seo/parser.js +113 -0
  583. package/dist/seo/parser.js.map +1 -0
  584. package/dist/seo/playbook-index.d.ts +19 -0
  585. package/dist/seo/playbook-index.d.ts.map +1 -0
  586. package/dist/seo/playbook-index.js +74 -0
  587. package/dist/seo/playbook-index.js.map +1 -0
  588. package/dist/seo/quota-governor.d.ts +100 -0
  589. package/dist/seo/quota-governor.d.ts.map +1 -0
  590. package/dist/seo/quota-governor.js +199 -0
  591. package/dist/seo/quota-governor.js.map +1 -0
  592. package/dist/seo/quota-ledger.d.ts +50 -0
  593. package/dist/seo/quota-ledger.d.ts.map +1 -0
  594. package/dist/seo/quota-ledger.js +95 -0
  595. package/dist/seo/quota-ledger.js.map +1 -0
  596. package/dist/seo/report-store.d.ts +30 -0
  597. package/dist/seo/report-store.d.ts.map +1 -0
  598. package/dist/seo/report-store.js +94 -0
  599. package/dist/seo/report-store.js.map +1 -0
  600. package/dist/seo/retriever.d.ts +34 -0
  601. package/dist/seo/retriever.d.ts.map +1 -0
  602. package/dist/seo/retriever.js +95 -0
  603. package/dist/seo/retriever.js.map +1 -0
  604. package/dist/seo/runner.d.ts +108 -0
  605. package/dist/seo/runner.d.ts.map +1 -0
  606. package/dist/seo/runner.js +512 -0
  607. package/dist/seo/runner.js.map +1 -0
  608. package/dist/seo/scrape-throttle.d.ts +84 -0
  609. package/dist/seo/scrape-throttle.d.ts.map +1 -0
  610. package/dist/seo/scrape-throttle.js +149 -0
  611. package/dist/seo/scrape-throttle.js.map +1 -0
  612. package/dist/seo/serp-provider.d.ts +52 -0
  613. package/dist/seo/serp-provider.d.ts.map +1 -0
  614. package/dist/seo/serp-provider.js +17 -0
  615. package/dist/seo/serp-provider.js.map +1 -0
  616. package/dist/seo/sources/ai-visibility-adapter.d.ts +87 -0
  617. package/dist/seo/sources/ai-visibility-adapter.d.ts.map +1 -0
  618. package/dist/seo/sources/ai-visibility-adapter.js +85 -0
  619. package/dist/seo/sources/ai-visibility-adapter.js.map +1 -0
  620. package/dist/seo/sources/api-spine-provider.d.ts +66 -0
  621. package/dist/seo/sources/api-spine-provider.d.ts.map +1 -0
  622. package/dist/seo/sources/api-spine-provider.js +68 -0
  623. package/dist/seo/sources/api-spine-provider.js.map +1 -0
  624. package/dist/seo/sources/citation-verifier.d.ts +95 -0
  625. package/dist/seo/sources/citation-verifier.d.ts.map +1 -0
  626. package/dist/seo/sources/citation-verifier.js +106 -0
  627. package/dist/seo/sources/citation-verifier.js.map +1 -0
  628. package/dist/seo/sources/crawl-source.d.ts +62 -0
  629. package/dist/seo/sources/crawl-source.d.ts.map +1 -0
  630. package/dist/seo/sources/crawl-source.js +87 -0
  631. package/dist/seo/sources/crawl-source.js.map +1 -0
  632. package/dist/seo/sources/damcrawler-crawl-engine.d.ts +151 -0
  633. package/dist/seo/sources/damcrawler-crawl-engine.d.ts.map +1 -0
  634. package/dist/seo/sources/damcrawler-crawl-engine.js +154 -0
  635. package/dist/seo/sources/damcrawler-crawl-engine.js.map +1 -0
  636. package/dist/seo/sources/damcrawler-serp-provider.d.ts +75 -0
  637. package/dist/seo/sources/damcrawler-serp-provider.d.ts.map +1 -0
  638. package/dist/seo/sources/damcrawler-serp-provider.js +60 -0
  639. package/dist/seo/sources/damcrawler-serp-provider.js.map +1 -0
  640. package/dist/seo/sources/dataforseo-adapter.d.ts +46 -0
  641. package/dist/seo/sources/dataforseo-adapter.d.ts.map +1 -0
  642. package/dist/seo/sources/dataforseo-adapter.js +335 -0
  643. package/dist/seo/sources/dataforseo-adapter.js.map +1 -0
  644. package/dist/seo/sources/dataforseo-serp-provider.d.ts +30 -0
  645. package/dist/seo/sources/dataforseo-serp-provider.d.ts.map +1 -0
  646. package/dist/seo/sources/dataforseo-serp-provider.js +20 -0
  647. package/dist/seo/sources/dataforseo-serp-provider.js.map +1 -0
  648. package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts +62 -0
  649. package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts.map +1 -0
  650. package/dist/seo/sources/engine-scrape-parser-chatgpt.js +72 -0
  651. package/dist/seo/sources/engine-scrape-parser-chatgpt.js.map +1 -0
  652. package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts +10 -0
  653. package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts.map +1 -0
  654. package/dist/seo/sources/engine-scrape-parser-perplexity.js +72 -0
  655. package/dist/seo/sources/engine-scrape-parser-perplexity.js.map +1 -0
  656. package/dist/seo/sources/gsc-adapter.d.ts +64 -0
  657. package/dist/seo/sources/gsc-adapter.d.ts.map +1 -0
  658. package/dist/seo/sources/gsc-adapter.js +221 -0
  659. package/dist/seo/sources/gsc-adapter.js.map +1 -0
  660. package/dist/seo/sources/local-export.d.ts +53 -0
  661. package/dist/seo/sources/local-export.d.ts.map +1 -0
  662. package/dist/seo/sources/local-export.js +307 -0
  663. package/dist/seo/sources/local-export.js.map +1 -0
  664. package/dist/seo/sources/mention-citation-extractor.d.ts +136 -0
  665. package/dist/seo/sources/mention-citation-extractor.d.ts.map +1 -0
  666. package/dist/seo/sources/mention-citation-extractor.js +272 -0
  667. package/dist/seo/sources/mention-citation-extractor.js.map +1 -0
  668. package/dist/seo/sources/scrape-arm-provider.d.ts +109 -0
  669. package/dist/seo/sources/scrape-arm-provider.d.ts.map +1 -0
  670. package/dist/seo/sources/scrape-arm-provider.js +129 -0
  671. package/dist/seo/sources/scrape-arm-provider.js.map +1 -0
  672. package/dist/seo/tracked-prompt-store.d.ts +33 -0
  673. package/dist/seo/tracked-prompt-store.d.ts.map +1 -0
  674. package/dist/seo/tracked-prompt-store.js +68 -0
  675. package/dist/seo/tracked-prompt-store.js.map +1 -0
  676. package/dist/seo/types.d.ts +128 -0
  677. package/dist/seo/types.d.ts.map +1 -0
  678. package/dist/seo/types.js +14 -0
  679. package/dist/seo/types.js.map +1 -0
  680. package/dist/seo/verifier.d.ts +34 -0
  681. package/dist/seo/verifier.d.ts.map +1 -0
  682. package/dist/seo/verifier.js +204 -0
  683. package/dist/seo/verifier.js.map +1 -0
  684. package/dist/seo/workflow-capabilities.d.ts +26 -0
  685. package/dist/seo/workflow-capabilities.d.ts.map +1 -0
  686. package/dist/seo/workflow-capabilities.js +12 -0
  687. package/dist/seo/workflow-capabilities.js.map +1 -0
  688. package/dist/state/facts.d.ts +5 -1
  689. package/dist/state/facts.d.ts.map +1 -1
  690. package/dist/state/facts.js +29 -19
  691. package/dist/state/facts.js.map +1 -1
  692. package/dist/state/index.d.ts +1 -1
  693. package/dist/state/index.d.ts.map +1 -1
  694. package/dist/state/index.js +1 -1
  695. package/dist/state/index.js.map +1 -1
  696. package/dist/state/outline-state.d.ts +0 -12
  697. package/dist/state/outline-state.d.ts.map +1 -1
  698. package/dist/state/outline-state.js +1 -18
  699. package/dist/state/outline-state.js.map +1 -1
  700. package/dist/state/security-audit-state.d.ts +20 -0
  701. package/dist/state/security-audit-state.d.ts.map +1 -0
  702. package/dist/state/security-audit-state.js +59 -0
  703. package/dist/state/security-audit-state.js.map +1 -0
  704. package/dist/teams/registry.d.ts.map +1 -1
  705. package/dist/teams/registry.js +17 -0
  706. package/dist/teams/registry.js.map +1 -1
  707. package/dist/telegram/bot.d.ts +137 -0
  708. package/dist/telegram/bot.d.ts.map +1 -0
  709. package/dist/telegram/bot.js +323 -0
  710. package/dist/telegram/bot.js.map +1 -0
  711. package/dist/telegram/digest.d.ts +19 -0
  712. package/dist/telegram/digest.d.ts.map +1 -0
  713. package/dist/telegram/digest.js +23 -0
  714. package/dist/telegram/digest.js.map +1 -0
  715. package/dist/telegram/fleet-view.d.ts +38 -0
  716. package/dist/telegram/fleet-view.d.ts.map +1 -0
  717. package/dist/telegram/fleet-view.js +98 -0
  718. package/dist/telegram/fleet-view.js.map +1 -0
  719. package/dist/telegram/handlers/approvals.d.ts +61 -0
  720. package/dist/telegram/handlers/approvals.d.ts.map +1 -0
  721. package/dist/telegram/handlers/approvals.js +122 -0
  722. package/dist/telegram/handlers/approvals.js.map +1 -0
  723. package/dist/telegram/handlers/capture.d.ts +43 -0
  724. package/dist/telegram/handlers/capture.d.ts.map +1 -0
  725. package/dist/telegram/handlers/capture.js +51 -0
  726. package/dist/telegram/handlers/capture.js.map +1 -0
  727. package/dist/telegram/handlers/prioritize.d.ts +50 -0
  728. package/dist/telegram/handlers/prioritize.d.ts.map +1 -0
  729. package/dist/telegram/handlers/prioritize.js +99 -0
  730. package/dist/telegram/handlers/prioritize.js.map +1 -0
  731. package/dist/telegram/handlers/upload.d.ts +105 -0
  732. package/dist/telegram/handlers/upload.d.ts.map +1 -0
  733. package/dist/telegram/handlers/upload.js +149 -0
  734. package/dist/telegram/handlers/upload.js.map +1 -0
  735. package/dist/telegram/keyboard.d.ts +48 -0
  736. package/dist/telegram/keyboard.d.ts.map +1 -0
  737. package/dist/telegram/keyboard.js +81 -0
  738. package/dist/telegram/keyboard.js.map +1 -0
  739. package/dist/telegram/outbound.d.ts +77 -0
  740. package/dist/telegram/outbound.d.ts.map +1 -0
  741. package/dist/telegram/outbound.js +45 -0
  742. package/dist/telegram/outbound.js.map +1 -0
  743. package/dist/telegram/router.d.ts +46 -0
  744. package/dist/telegram/router.d.ts.map +1 -0
  745. package/dist/telegram/router.js +63 -0
  746. package/dist/telegram/router.js.map +1 -0
  747. package/dist/telegram/streaming.d.ts +36 -0
  748. package/dist/telegram/streaming.d.ts.map +1 -0
  749. package/dist/telegram/streaming.js +55 -0
  750. package/dist/telegram/streaming.js.map +1 -0
  751. package/dist/telegram/whitelist.d.ts +20 -0
  752. package/dist/telegram/whitelist.d.ts.map +1 -0
  753. package/dist/telegram/whitelist.js +34 -0
  754. package/dist/telegram/whitelist.js.map +1 -0
  755. package/dist/utils/git.d.ts +0 -6
  756. package/dist/utils/git.d.ts.map +1 -1
  757. package/dist/utils/git.js +0 -19
  758. package/dist/utils/git.js.map +1 -1
  759. package/dist/utils/index.d.ts +1 -1
  760. package/dist/utils/index.d.ts.map +1 -1
  761. package/dist/utils/index.js +1 -1
  762. package/dist/utils/index.js.map +1 -1
  763. package/dist/vault/conventions.d.ts +23 -0
  764. package/dist/vault/conventions.d.ts.map +1 -0
  765. package/dist/vault/conventions.js +22 -0
  766. package/dist/vault/conventions.js.map +1 -0
  767. package/dist/vault/frontmatter.d.ts +47 -0
  768. package/dist/vault/frontmatter.d.ts.map +1 -0
  769. package/dist/vault/frontmatter.js +149 -0
  770. package/dist/vault/frontmatter.js.map +1 -0
  771. package/dist/vault/index-map.d.ts +35 -0
  772. package/dist/vault/index-map.d.ts.map +1 -0
  773. package/dist/vault/index-map.js +67 -0
  774. package/dist/vault/index-map.js.map +1 -0
  775. package/dist/vault/mcp-adapter.d.ts +96 -0
  776. package/dist/vault/mcp-adapter.d.ts.map +1 -0
  777. package/dist/vault/mcp-adapter.js +176 -0
  778. package/dist/vault/mcp-adapter.js.map +1 -0
  779. package/dist/vault/note-io.d.ts +29 -0
  780. package/dist/vault/note-io.d.ts.map +1 -0
  781. package/dist/vault/note-io.js +44 -0
  782. package/dist/vault/note-io.js.map +1 -0
  783. package/dist/vault/profile.d.ts +35 -0
  784. package/dist/vault/profile.d.ts.map +1 -0
  785. package/dist/vault/profile.js +50 -0
  786. package/dist/vault/profile.js.map +1 -0
  787. package/dist/vault/reindex.d.ts +55 -0
  788. package/dist/vault/reindex.d.ts.map +1 -0
  789. package/dist/vault/reindex.js +69 -0
  790. package/dist/vault/reindex.js.map +1 -0
  791. package/dist/vault/types.d.ts +25 -0
  792. package/dist/vault/types.d.ts.map +1 -0
  793. package/dist/vault/types.js +9 -0
  794. package/dist/vault/types.js.map +1 -0
  795. package/package.json +20 -4
  796. package/scripts/sync-targets.json +2 -1
  797. package/skills/bober.design/SKILL.md +190 -0
  798. package/skills/bober.design/references/1-anti-slop.md +102 -0
  799. package/skills/bober.design/references/2-design-brief.md +84 -0
  800. package/skills/bober.design/references/3-critique-rubric.md +62 -0
  801. package/skills/bober.design/references/4-copy-guide.md +43 -0
  802. package/skills/bober.plan/SKILL.md +15 -1
  803. package/skills/bober.run/SKILL.md +7 -4
  804. package/skills/bober.security-anchor/SKILL.md +172 -0
  805. package/skills/bober.security-audit/SKILL.md +288 -0
  806. package/skills/bober.security-dex-backend/SKILL.md +306 -0
  807. package/skills/bober.security-generic/SKILL.md +295 -0
  808. package/skills/bober.security-igaming/SKILL.md +290 -0
  809. package/skills/bober.security-node/SKILL.md +267 -0
  810. package/skills/bober.security-payments/SKILL.md +249 -0
  811. package/skills/bober.security-react/SKILL.md +194 -0
  812. package/skills/bober.security-solidity/SKILL.md +306 -0
  813. package/skills/bober.seo/SKILL.md +132 -0
  814. package/skills/bober.seo-ai-visibility/SKILL.md +110 -0
  815. package/skills/bober.seo-content-decay/SKILL.md +99 -0
  816. package/skills/bober.seo-generic/SKILL.md +173 -0
  817. package/skills/bober.seo-internal-linking/SKILL.md +87 -0
  818. package/skills/bober.seo-parasite-watch/SKILL.md +121 -0
  819. package/skills/bober.seo-rank-track/SKILL.md +98 -0
  820. package/skills/bober.seo-schema-audit/SKILL.md +97 -0
  821. package/skills/bober.seo-technical-audit/SKILL.md +113 -0
  822. package/skills/bober.seo-topical-map/SKILL.md +100 -0
  823. package/skills/bober.seo-verticals/SKILL.md +133 -0
  824. 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":"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"}
@@ -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":"AAkDA,kGAAkG;AAClG,MAAM,eAAe,GAAG,qDAAqD,CAAC;AAE9E,4FAA4F;AAC5F,MAAM,aAAa,GAAG,8CAA8C,CAAC;AAErE,8CAA8C;AAC9C,MAAM,QAAQ,GAAG,8BAA8B,CAAC;AAEhD,sFAAsF;AACtF,MAAM,QAAQ,GAAG,uCAAuC,CAAC;AAEzD,kGAAkG;AAClG,SAAS,WAAW,CAAC,SAAiB;IACpC,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,yBAAyB,CAAC,QAAgB;IACjD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,SAAS,GAAuB,EAAE,CAAC;IAEzC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,KAAa,EAAQ,EAAE;QACxD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,OAAO;QAC5E,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAClG,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACjD,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;IAChC,KAAK,CAAC,GAAc;QAClB,MAAM,QAAQ,GAAG,OAAO,GAAG,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAE3E,MAAM,UAAU,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE7C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IACnC,CAAC;CACF"}
@@ -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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"}