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,145 @@
1
+ /**
2
+ * ApprovedFinding — the structural safety boundary between the hub and the
3
+ * Sprint-12 `SeoBuilder` (spec-20260717-seo-improver-builder, Sprint 11;
4
+ * ADR-4, `.bober/architecture/arch-20260716-seo-improver-builder-extension-adr-4.md`).
5
+ *
6
+ * Constructible ONLY via `ApprovedFinding.from(...)` — the sole factory,
7
+ * itself never throwing — which asserts the hub Finding is human-approved
8
+ * AND carries a well-formed `cite:` evidence URL before minting an instance.
9
+ * A raw/dropped/downgraded/uncited `SeoFinding` has NO public path into this
10
+ * type: a dropped finding never reached the hub as an approved action, so no
11
+ * `ApprovedFinding` can exist for it (resurrection structurally impossible,
12
+ * sc-11-1/sc-11-2).
13
+ *
14
+ * Schema-vs-contract reconciliation (see the Sprint-11 briefing §0): the
15
+ * canonical hub `FindingSchema.status` (`../hub/finding.js:23`) is
16
+ * `z.enum(["open","in-progress","snoozed","done","dropped"])` — there is NO
17
+ * `"approved"` status, so `finding.status === "approved"` against a raw
18
+ * `Finding` is a TS2367 compile error. Mirroring the do-bridge port-local
19
+ * pattern (`../do-bridge/finding-port.ts:10-19`, "the hub schema is NOT
20
+ * modified"), `ApprovedHubFindingSchema` below WIDENS the status union
21
+ * locally — `../hub/finding.ts` stays byte-identical. Likewise `Finding` has
22
+ * no top-level `citationUrl`; the SEO citation round-trips inside
23
+ * `evidence[]` as a `cite:<url>` string (encoded at
24
+ * `../hub-emitter.ts:76`, decode precedent at `../benchmark/harness.ts:112-121`)
25
+ * — `extractCitationUrl` below decodes exactly what the emitter encoded.
26
+ */
27
+ import { z } from "zod";
28
+ import { FindingSchema } from "../../hub/finding.js";
29
+ // -- Widened hub Finding view (port-local; ../../hub/finding.ts untouched) --
30
+ /**
31
+ * Builder-local widened view of the hub `Finding` shape — adds `"approved"`
32
+ * to the status union WITHOUT mutating the canonical `FindingSchema`
33
+ * (mirrors `../../do-bridge/finding-port.ts:10-19`). Every other field is
34
+ * reused verbatim via `.extend()`.
35
+ */
36
+ export const ApprovedHubFindingSchema = FindingSchema.extend({
37
+ status: z.enum(["open", "in-progress", "snoozed", "done", "dropped", "approved"]),
38
+ });
39
+ // -- Local single-purpose URL check (no shared util exists in src) --------
40
+ /**
41
+ * A citationUrl is well-formed when it is a non-empty, non-whitespace string
42
+ * that parses as an absolute http(s) URL. Mirrors `../citation-gate.ts:34-42`
43
+ * (`isWellFormedCitationUrl`) — no shared URL-validation util exists in
44
+ * `src`; this is a local copy per that file's own precedent comment.
45
+ */
46
+ function isWellFormedCitationUrl(url) {
47
+ if (typeof url !== "string" || url.trim().length === 0)
48
+ return false;
49
+ try {
50
+ const parsed = new URL(url);
51
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ // -- cite:/tag extraction (decodes exactly what hub-emitter.ts encoded) ----
58
+ /**
59
+ * Extract `sourceCitationUrl` from the `evidence[]` entry that starts with
60
+ * `cite:` (mirrors `../benchmark/harness.ts:112-121`, `lacksWellFormedCitation`).
61
+ * Returns `null` — never throws — when the entry is absent or the URL is
62
+ * malformed. NEVER invents a URL.
63
+ */
64
+ function extractCitationUrl(finding) {
65
+ const citeEntry = finding.evidence.find((e) => e.startsWith("cite:"));
66
+ if (citeEntry === undefined)
67
+ return null;
68
+ const url = citeEntry.slice("cite:".length);
69
+ return isWellFormedCitationUrl(url) ? url : null;
70
+ }
71
+ /**
72
+ * Extract the first `tags[]` entry starting with `prefix`, minus the prefix.
73
+ * Mirrors `../benchmark/harness.ts:106-108` (`extractPlaybookRef`). SEO
74
+ * findings carry `tags: ["seo","workflow:<w>","playbook:<ref>","confidence:<c>"]`
75
+ * (`../hub-emitter.ts:79-84`).
76
+ */
77
+ function extractTag(finding, prefix) {
78
+ const tag = finding.tags.find((t) => t.startsWith(prefix));
79
+ return tag !== undefined ? tag.slice(prefix.length) : undefined;
80
+ }
81
+ // -- ApprovedFinding --------------------------------------------------------
82
+ /**
83
+ * A hub Finding a human has approved, carrying a decoded, well-formed
84
+ * citation. The private constructor + private brand field together make
85
+ * this type NOMINAL: a structurally-similar plain object (e.g. a raw
86
+ * `SeoFinding` literal) is never assignable, and `new ApprovedFinding(...)`
87
+ * is unreachable outside this module. `ApprovedFinding.from` is the ONLY
88
+ * public construction path.
89
+ */
90
+ export class ApprovedFinding {
91
+ sourceFindingId;
92
+ title;
93
+ sourceCitationUrl;
94
+ severity;
95
+ playbookRef;
96
+ workflow;
97
+ // Private INSTANCE field => TS compares this class nominally. A plain
98
+ // object literal (e.g. a raw SeoFinding) can NEVER satisfy this private
99
+ // member, so it can never be assigned to ApprovedFinding (sc-11-1/sc-11-2,
100
+ // compile-proof — see approved-finding.test.ts).
101
+ __brand = "ApprovedFinding";
102
+ constructor(
103
+ /** The hub Finding id this instance was derived from (provenance). */
104
+ sourceFindingId, title,
105
+ /** Extracted from the `cite:` evidence entry — never invented. */
106
+ sourceCitationUrl, severity,
107
+ /** From the `playbook:` tag; empty string if the tag is absent. */
108
+ playbookRef,
109
+ /** From the `workflow:` tag; empty string if the tag is absent. */
110
+ workflow) {
111
+ this.sourceFindingId = sourceFindingId;
112
+ this.title = title;
113
+ this.sourceCitationUrl = sourceCitationUrl;
114
+ this.severity = severity;
115
+ this.playbookRef = playbookRef;
116
+ this.workflow = workflow;
117
+ }
118
+ /** Debug representation; also reads `__brand` so it is not flagged unused under `noUnusedLocals`. */
119
+ toString() {
120
+ return `${this.__brand}(${this.sourceFindingId})`;
121
+ }
122
+ /**
123
+ * The ONLY way to build an `ApprovedFinding`. Returns `null` — NEVER
124
+ * throws — when `finding.status !== "approved"` or the `cite:` evidence
125
+ * entry is missing/malformed. This is the single gate ADR-4's Risk
126
+ * section calls out: "if the adapter itself trusts an un-approved
127
+ * Finding, the guarantee leaks" — so both checks happen here, in the one
128
+ * place an `ApprovedFinding` can be minted.
129
+ */
130
+ static from(finding) {
131
+ if (finding.status !== "approved")
132
+ return null;
133
+ const citationUrl = extractCitationUrl(finding);
134
+ if (citationUrl === null)
135
+ return null;
136
+ // bober: playbookRef/workflow default to "" when the tag is absent
137
+ // rather than gating construction on them — ADR-4's Risk section only
138
+ // requires status===approved + a well-formed citation; these tags are
139
+ // enrichment provenance for Sprint-12, not part of the safety gate.
140
+ const playbookRef = extractTag(finding, "playbook:") ?? "";
141
+ const workflow = extractTag(finding, "workflow:") ?? "";
142
+ return new ApprovedFinding(finding.id, finding.title, citationUrl, finding.severity, playbookRef, workflow);
143
+ }
144
+ }
145
+ //# sourceMappingURL=approved-finding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approved-finding.js","sourceRoot":"","sources":["../../../src/seo/builder/approved-finding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { BoberConfig } from "../../config/schema.js";
2
+ import { SeoReportStore } from "../report-store.js";
3
+ import type { SeoFindingSink } from "../hub-emitter.js";
4
+ import { SeoBuilder } from "./seo-builder.js";
5
+ import type { ApprovedFinding } from "./approved-finding.js";
6
+ import type { SeoDraft } from "./draft-types.js";
7
+ import { SeoDraftStore } from "./draft-store.js";
8
+ export type SeoBuildRunInput = {
9
+ projectRoot: string;
10
+ config: BoberConfig;
11
+ reportId: string;
12
+ /** ISO timestamp, stamped ONCE by the `seo build` CLI action. */
13
+ now: string;
14
+ /** Default = `new SeoReportStore()`. */
15
+ reportStore?: SeoReportStore;
16
+ /** Default = `new SeoDraftStore()`. */
17
+ draftStore?: SeoDraftStore;
18
+ /** Default = `new SeoBuilder(new NeverEncodeFilter())`. */
19
+ builder?: SeoBuilder;
20
+ /** Default = open a real `FactStore` + `readApprovedSeoFindings`. */
21
+ readApproved?: (projectRoot: string) => Promise<ApprovedFinding[]>;
22
+ /** Default binds `ingestFinding` to a real `FactStore`. */
23
+ findingSink?: SeoFindingSink;
24
+ };
25
+ export type SeoBuildRunOutcome = {
26
+ drafts?: SeoDraft[];
27
+ skipped?: number;
28
+ exitCode: 0 | 2;
29
+ };
30
+ export declare class SeoBuildRunner {
31
+ /**
32
+ * Run one `seo build <reportId>` invocation end-to-end. NEVER throws:
33
+ * every fallible step (report read, approved-findings read, build,
34
+ * persist) is wrapped in one top-level try/catch -> `exitCode: 2`. An
35
+ * unknown reportId or a report with no approved findings is a CLEAN
36
+ * `exitCode: 0` with an informational stdout message and ZERO hub emits
37
+ * (sc-13-4) — `2` is reserved for a caught unexpected error.
38
+ */
39
+ run(input: SeoBuildRunInput): Promise<SeoBuildRunOutcome>;
40
+ }
41
+ //# sourceMappingURL=build-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-runner.d.ts","sourceRoot":"","sources":["../../../src/seo/builder/build-runner.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAK1D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IAEZ,wCAAwC;IACxC,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,uCAAuC;IACvC,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,qEAAqE;IACrE,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACnE,2DAA2D;IAC3D,WAAW,CAAC,EAAE,cAAc,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB,CAAC;AA+FF,qBAAa,cAAc;IACzB;;;;;;;OAOG;IACG,GAAG,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA8ChE"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * SeoBuildRunner — drives reportId -> approved hub findings -> SeoBuilder.build
3
+ * -> SeoDraftStore persist -> best-effort hub 'action' emission
4
+ * (spec-20260717-seo-improver-builder, Sprint 13). NEVER throws; exit 0/2.
5
+ * `now` is caller-injected (never re-stamped here) — mirrors
6
+ * `SeoWorkflowRunner.run` (`../runner.ts`) fail-closed/never-throw discipline
7
+ * and `emitFindingsToHub`'s best-effort hub-emit pattern.
8
+ *
9
+ * reportId -> approved-findings linkage (no stored reportId link exists on
10
+ * hub findings, sprint briefing §5): the report is read FIRST (supplies
11
+ * `report.target`, required by `SeoBuilder.build`, and detects an unknown
12
+ * reportId), then approved SEO findings are narrowed to
13
+ * `af.workflow === report.workflow` — the only available linkage.
14
+ */
15
+ import { createHash } from "node:crypto";
16
+ import { FactStore, factsDbPath, ensureFactsDir } from "../../state/facts.js";
17
+ import { ingestFinding } from "../../hub/finding-store.js";
18
+ import { logger } from "../../utils/logger.js";
19
+ import { SeoReportStore } from "../report-store.js";
20
+ import { NeverEncodeFilter } from "../never-encode-filter.js";
21
+ import { SeoBuilder } from "./seo-builder.js";
22
+ import { readApprovedSeoFindings } from "./hub-approved-source.js";
23
+ import { SeoDraftStore } from "./draft-store.js";
24
+ // ── Defaults ─────────────────────────────────────────────────────────
25
+ /** Opens a real `FactStore` (closed in `finally`) to read approved SEO findings. */
26
+ async function defaultReadApproved(projectRoot) {
27
+ await ensureFactsDir(projectRoot);
28
+ const store = new FactStore(factsDbPath(projectRoot));
29
+ try {
30
+ return readApprovedSeoFindings(store);
31
+ }
32
+ finally {
33
+ store.close();
34
+ }
35
+ }
36
+ /**
37
+ * Map a `SeoDraft` -> hub `Finding` (kind ALWAYS `"action"` — every
38
+ * `SeoDraft` carries `humanApprovalRequired: true`, the type literal,
39
+ * `draft-types.ts:29`). Mirrors `SeoHubEmitter`'s title/id/evidence
40
+ * conventions (`../hub-emitter.ts:54-90`) but maps `SeoDraft`, not
41
+ * `SeoFinding` — there is no existing draft->Finding mapper to reuse.
42
+ *
43
+ * bober: `SeoDraft` carries no severity/urgency of its own (it is
44
+ * decoupled from the source finding by `SeoBuilder.build`) — default both
45
+ * to `3` (mid-scale) rather than inventing a provenance link back to the
46
+ * approved finding's severity. Revisit if a future sprint threads
47
+ * `ApprovedFinding.severity` through `SeoBuildResult`.
48
+ */
49
+ function draftToFinding(draft, now) {
50
+ const title = `[seo] draft ${draft.kind}: ${draft.artifact.slice(0, 80)}`;
51
+ const kind = "action";
52
+ return {
53
+ id: deriveDraftFindingId(title, kind),
54
+ domain: "seo",
55
+ title,
56
+ kind,
57
+ urgency: 3,
58
+ severity: 3,
59
+ evidence: [draft.artifact, `cite:${draft.sourceCitationUrl}`],
60
+ surfacedAt: now,
61
+ tags: ["seo", `playbook:${draft.playbookRef}`, `draft-kind:${draft.kind}`, "seo-draft"],
62
+ status: "open",
63
+ };
64
+ }
65
+ /** Content-stable id: hash of domain|title|kind (mirrors `../hub-emitter.ts:32-34`). */
66
+ function deriveDraftFindingId(title, kind) {
67
+ return createHash("sha256").update(`seo|${title}|${kind}`).digest("hex").slice(0, 16);
68
+ }
69
+ /**
70
+ * Best-effort emit each draft as a hub 'action' Finding. NEVER throws and
71
+ * NEVER changes the caller's exit code — mirrors `emitFindingsToHub`
72
+ * (`../runner.ts:391-421`). Checks emptiness BEFORE opening a store so a
73
+ * fully-skipped build never touches the hub (sprint briefing Pitfall 8).
74
+ */
75
+ async function emitDraftsToHub(drafts, projectRoot, now, findingSink) {
76
+ if (drafts.length === 0)
77
+ return;
78
+ const findings = drafts.map((d) => draftToFinding(d, now));
79
+ if (findingSink !== undefined) {
80
+ try {
81
+ for (const finding of findings) {
82
+ await findingSink(finding);
83
+ }
84
+ }
85
+ catch (err) {
86
+ logger.warn(`SEO draft hub emission failed: ${err instanceof Error ? err.message : String(err)}`);
87
+ }
88
+ return;
89
+ }
90
+ let store;
91
+ try {
92
+ await ensureFactsDir(projectRoot);
93
+ const opened = new FactStore(factsDbPath(projectRoot));
94
+ store = opened;
95
+ for (const finding of findings) {
96
+ await ingestFinding(opened, finding, { now });
97
+ }
98
+ }
99
+ catch (err) {
100
+ logger.warn(`SEO draft hub emission failed: ${err instanceof Error ? err.message : String(err)}`);
101
+ }
102
+ finally {
103
+ store?.close();
104
+ }
105
+ }
106
+ // ── SeoBuildRunner ───────────────────────────────────────────────────
107
+ export class SeoBuildRunner {
108
+ /**
109
+ * Run one `seo build <reportId>` invocation end-to-end. NEVER throws:
110
+ * every fallible step (report read, approved-findings read, build,
111
+ * persist) is wrapped in one top-level try/catch -> `exitCode: 2`. An
112
+ * unknown reportId or a report with no approved findings is a CLEAN
113
+ * `exitCode: 0` with an informational stdout message and ZERO hub emits
114
+ * (sc-13-4) — `2` is reserved for a caught unexpected error.
115
+ */
116
+ async run(input) {
117
+ try {
118
+ const report = await (input.reportStore ?? new SeoReportStore()).read(input.projectRoot, input.reportId);
119
+ if (report === null) {
120
+ process.stdout.write(`seo build: no report found for id "${input.reportId}"\n`);
121
+ return { exitCode: 0 };
122
+ }
123
+ const approvedAll = await (input.readApproved ?? defaultReadApproved)(input.projectRoot);
124
+ // Narrow to the report's workflow — the only available reportId->
125
+ // approved-findings linkage (sprint briefing §5).
126
+ const approved = approvedAll.filter((a) => a.workflow === report.workflow);
127
+ if (approved.length === 0) {
128
+ process.stdout.write(`seo build: report "${input.reportId}" has no approved findings\n`);
129
+ return { exitCode: 0 };
130
+ }
131
+ const builder = input.builder ?? new SeoBuilder(new NeverEncodeFilter());
132
+ const { drafts, skipped } = builder.build({
133
+ approvedFindings: approved,
134
+ target: report.target,
135
+ config: input.config,
136
+ now: input.now,
137
+ });
138
+ const bundle = {
139
+ reportId: report.reportId,
140
+ target: report.target,
141
+ generatedAt: input.now,
142
+ drafts,
143
+ skipped,
144
+ };
145
+ await (input.draftStore ?? new SeoDraftStore()).save(input.projectRoot, bundle);
146
+ // Best-effort AFTER persist — a hub failure never changes the exit code.
147
+ await emitDraftsToHub(drafts, input.projectRoot, input.now, input.findingSink);
148
+ return { drafts, skipped, exitCode: 0 };
149
+ }
150
+ catch {
151
+ // Unexpected throw (report/approved-findings read, build, or persist) -> fail-closed.
152
+ return { exitCode: 2 };
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=build-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-runner.js","sourceRoot":"","sources":["../../../src/seo/builder/build-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA8BjD,wEAAwE;AAExE,oFAAoF;AACpF,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IACpD,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,cAAc,CAAC,KAAe,EAAE,GAAW;IAClD,MAAM,KAAK,GAAG,eAAe,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IAC1E,MAAM,IAAI,GAAoB,QAAQ,CAAC;IAEvC,OAAO;QACL,EAAE,EAAE,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC;QACrC,MAAM,EAAE,KAAK;QACb,KAAK;QACL,IAAI;QACJ,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC7D,UAAU,EAAE,GAAG;QACf,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,CAAC,WAAW,EAAE,EAAE,cAAc,KAAK,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC;QACvF,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,SAAS,oBAAoB,CAAC,KAAa,EAAE,IAAY;IACvD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxF,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAC5B,MAAkB,EAClB,WAAmB,EACnB,GAAW,EACX,WAAuC;IAEvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEhC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAE3D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,KAA4B,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;QACvD,KAAK,GAAG,MAAM,CAAC;QACf,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,wEAAwE;AAExE,MAAM,OAAO,cAAc;IACzB;;;;;;;OAOG;IACH,KAAK,CAAC,GAAG,CAAC,KAAuB;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,cAAc,EAAE,CAAC,CAAC,IAAI,CACnE,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,QAAQ,CACf,CAAC;YACF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC;gBAChF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACzB,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,mBAAmB,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACzF,kEAAkE;YAClE,kDAAkD;YAClD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,QAAQ,8BAA8B,CAAC,CAAC;gBACzF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACzB,CAAC;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,UAAU,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;YACzE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;gBACxC,gBAAgB,EAAE,QAAQ;gBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf,CAAC,CAAC;YAEH,MAAM,MAAM,GAAmB;gBAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,WAAW,EAAE,KAAK,CAAC,GAAG;gBACtB,MAAM;gBACN,OAAO;aACR,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAEhF,yEAAyE;YACzE,MAAM,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAE/E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,sFAAsF;YACtF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Deterministic draft-artifact templates (spec-20260717-seo-improver-builder,
3
+ * Sprint 12; ADR-4). Network-free by construction — no LLM, no `fetch`.
4
+ * Every template is pure: no clock, no `Math.random`, no I/O. Each template
5
+ * echoes the `ApprovedFinding.title` verbatim into the produced artifact text
6
+ * so a banned-implying finding yields a banned-implying draft the Sprint-12
7
+ * `SeoBuilder`'s re-filter can catch and drop (sc-12-4).
8
+ *
9
+ * The generators map is injected into `SeoBuilder`'s constructor (optional,
10
+ * defaulting to `DEFAULT_DRAFT_GENERATORS`) so a test can substitute a
11
+ * generator that forces a banned artifact without touching real templates —
12
+ * mirrors how `runner.ts` injects `analyzer`/`dataSource`/`findingSink`.
13
+ */
14
+ import type { ApprovedFinding } from "./approved-finding.js";
15
+ import type { SeoDraftKind } from "./draft-types.js";
16
+ /** Turns one `ApprovedFinding` + `target` into the proposed artifact TEXT. */
17
+ export type DraftGenerator = (finding: ApprovedFinding, target: string) => string;
18
+ /**
19
+ * One deterministic template per `SeoDraftKind`. Each MUST echo
20
+ * `finding.title` into the artifact text — this is what lets the
21
+ * `SeoBuilder`'s re-filter (`../never-encode-filter.js`) catch a banned
22
+ * tactic implied by the approved finding's own title (sc-12-4).
23
+ */
24
+ export declare const DEFAULT_DRAFT_GENERATORS: Record<SeoDraftKind, DraftGenerator>;
25
+ /**
26
+ * Deterministically selects the `SeoDraftKind` for an `ApprovedFinding` from
27
+ * its `playbookRef` prefix (`../hub-emitter.ts` encodes `playbook:<ref>` per
28
+ * finding). Falls back to `"title-meta"` — the most generic, broadly
29
+ * applicable draft kind — when no prefix matches. Pure; never throws.
30
+ */
31
+ export declare function kindForApprovedFinding(finding: ApprovedFinding): SeoDraftKind;
32
+ //# sourceMappingURL=draft-generators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-generators.d.ts","sourceRoot":"","sources":["../../../src/seo/builder/draft-generators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;AAIlF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,YAAY,EAAE,cAAc,CAMzE,CAAC;AAWF;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,YAAY,CAG7E"}
@@ -0,0 +1,31 @@
1
+ // -- Default templates (one per SeoDraftKind, pure) -------------------------
2
+ /**
3
+ * One deterministic template per `SeoDraftKind`. Each MUST echo
4
+ * `finding.title` into the artifact text — this is what lets the
5
+ * `SeoBuilder`'s re-filter (`../never-encode-filter.js`) catch a banned
6
+ * tactic implied by the approved finding's own title (sc-12-4).
7
+ */
8
+ export const DEFAULT_DRAFT_GENERATORS = {
9
+ "schema-jsonld": (finding, target) => JSON.stringify({ "@context": "https://schema.org", "@type": "WebPage", name: finding.title, url: target }),
10
+ "internal-link": (finding, target) => `Add an internal link on ${target} implementing: ${finding.title}`,
11
+ "title-meta": (finding, _target) => `<title>${finding.title}</title>`,
12
+ "content-refresh": (finding, target) => `Refresh ${target}: ${finding.title}`,
13
+ };
14
+ // -- Kind selection ----------------------------------------------------------
15
+ /** Deterministic mapping from `playbookRef` prefix to the `SeoDraftKind` produced. */
16
+ const PLAYBOOK_KIND_RULES = [
17
+ { prefix: "seo.schema", kind: "schema-jsonld" },
18
+ { prefix: "seo.internal-linking", kind: "internal-link" },
19
+ { prefix: "seo.content-decay", kind: "content-refresh" },
20
+ ];
21
+ /**
22
+ * Deterministically selects the `SeoDraftKind` for an `ApprovedFinding` from
23
+ * its `playbookRef` prefix (`../hub-emitter.ts` encodes `playbook:<ref>` per
24
+ * finding). Falls back to `"title-meta"` — the most generic, broadly
25
+ * applicable draft kind — when no prefix matches. Pure; never throws.
26
+ */
27
+ export function kindForApprovedFinding(finding) {
28
+ const match = PLAYBOOK_KIND_RULES.find((rule) => finding.playbookRef.startsWith(rule.prefix));
29
+ return match?.kind ?? "title-meta";
30
+ }
31
+ //# sourceMappingURL=draft-generators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-generators.js","sourceRoot":"","sources":["../../../src/seo/builder/draft-generators.ts"],"names":[],"mappings":"AAqBA,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAyC;IAC5E,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACnC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAC5G,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,2BAA2B,MAAM,kBAAkB,OAAO,CAAC,KAAK,EAAE;IACxG,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,OAAO,CAAC,KAAK,UAAU;IACrE,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,WAAW,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE;CAC9E,CAAC;AAEF,+EAA+E;AAE/E,sFAAsF;AACtF,MAAM,mBAAmB,GAA0D;IACjF,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE;IAC/C,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,EAAE;IACzD,EAAE,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,iBAAiB,EAAE;CACzD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAwB;IAC7D,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9F,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,CAAC;AACrC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { SeoDraft } from "./draft-types.js";
2
+ /** One `SeoBuildRunner.run` invocation's persisted output, keyed by `reportId`. */
3
+ export type SeoDraftBundle = {
4
+ reportId: string;
5
+ target: string;
6
+ /** = the injected `now`, never `Date.now()`. */
7
+ generatedAt: string;
8
+ drafts: SeoDraft[];
9
+ skipped: number;
10
+ };
11
+ export declare class SeoDraftStore {
12
+ /**
13
+ * Write `bundle` atomically (temp file + POSIX-atomic rename) under
14
+ * `.bober/seo/drafts/`. Overwrites any existing bundle with the same
15
+ * `reportId`. Throws on an unrecoverable fs failure — callers (the build
16
+ * runner) are expected to catch and fail closed.
17
+ */
18
+ save(projectRoot: string, bundle: SeoDraftBundle): Promise<void>;
19
+ /**
20
+ * Read a persisted `SeoDraftBundle` by `reportId`. Returns `null` on a
21
+ * missing file — NEVER throws (mirrors `SeoReportStore.read`).
22
+ */
23
+ read(projectRoot: string, reportId: string): Promise<SeoDraftBundle | null>;
24
+ /**
25
+ * List all persisted draft-bundle reportIds, sorted by filename. Returns
26
+ * `[]` if the drafts directory does not exist — never throws.
27
+ */
28
+ list(projectRoot: string): Promise<string[]>;
29
+ }
30
+ //# sourceMappingURL=draft-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-store.d.ts","sourceRoot":"","sources":["../../../src/seo/builder/draft-store.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAmBjD,mFAAmF;AACnF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,qBAAa,aAAa;IACxB;;;;;OAKG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAStE;;;OAGG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAUjF;;;OAGG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAanD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * SeoDraftStore — persists a `SeoDraftBundle` JSON under `.bober/seo/drafts/`
3
+ * (spec-20260717-seo-improver-builder, Sprint 13). MIRRORS `SeoReportStore`
4
+ * (`../report-store.ts`): atomic temp-file + POSIX rename, sanitized
5
+ * filename, `null`-on-missing read, `[]`-on-missing list. Write-once id =
6
+ * the source `reportId` (one draft bundle per built report).
7
+ *
8
+ * `generatedAt` on the bundle is ALWAYS the caller-injected `now` — this
9
+ * file never reads the clock for that purpose. The `.tmp` suffix below uses
10
+ * `Date.now()` purely as a uniqueness token for the temp filename (same
11
+ * carve-out `report-store.ts:67-68` documents), never as a bundle timestamp.
12
+ */
13
+ import { readFile, writeFile, readdir, rename } from "node:fs/promises";
14
+ import { randomBytes } from "node:crypto";
15
+ import { join } from "node:path";
16
+ import { ensureDir } from "../../utils/fs.js";
17
+ // ── Paths ────────────────────────────────────────────────────────────
18
+ const SEO_DRAFTS_DIR = ".bober/seo/drafts";
19
+ const DRAFT_SUFFIX = "-seo-drafts.json";
20
+ function draftsDir(projectRoot) {
21
+ return join(projectRoot, SEO_DRAFTS_DIR);
22
+ }
23
+ /** fs-safe filename — mirrors `report-store.ts`'s sanitization. */
24
+ function draftPath(projectRoot, reportId) {
25
+ const safeId = reportId.replace(/[^a-zA-Z0-9_-]/g, "_");
26
+ return join(draftsDir(projectRoot), `${safeId}${DRAFT_SUFFIX}`);
27
+ }
28
+ // ── Store ────────────────────────────────────────────────────────────
29
+ export class SeoDraftStore {
30
+ /**
31
+ * Write `bundle` atomically (temp file + POSIX-atomic rename) under
32
+ * `.bober/seo/drafts/`. Overwrites any existing bundle with the same
33
+ * `reportId`. Throws on an unrecoverable fs failure — callers (the build
34
+ * runner) are expected to catch and fail closed.
35
+ */
36
+ async save(projectRoot, bundle) {
37
+ await ensureDir(draftsDir(projectRoot));
38
+ const path = draftPath(projectRoot, bundle.reportId);
39
+ // Uniqueness token for the temp filename only — NOT a bundle timestamp.
40
+ const tmp = `${path}.${process.pid}.${Date.now()}.${randomBytes(4).toString("hex")}.tmp`;
41
+ await writeFile(tmp, JSON.stringify(bundle, null, 2) + "\n", { encoding: "utf-8" });
42
+ await rename(tmp, path);
43
+ }
44
+ /**
45
+ * Read a persisted `SeoDraftBundle` by `reportId`. Returns `null` on a
46
+ * missing file — NEVER throws (mirrors `SeoReportStore.read`).
47
+ */
48
+ async read(projectRoot, reportId) {
49
+ const path = draftPath(projectRoot, reportId);
50
+ try {
51
+ const raw = await readFile(path, "utf-8");
52
+ return JSON.parse(raw);
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ /**
59
+ * List all persisted draft-bundle reportIds, sorted by filename. Returns
60
+ * `[]` if the drafts directory does not exist — never throws.
61
+ */
62
+ async list(projectRoot) {
63
+ let entries;
64
+ try {
65
+ entries = await readdir(draftsDir(projectRoot));
66
+ }
67
+ catch {
68
+ return [];
69
+ }
70
+ return entries
71
+ .filter((f) => f.endsWith(DRAFT_SUFFIX))
72
+ .sort()
73
+ .map((f) => f.slice(0, -DRAFT_SUFFIX.length));
74
+ }
75
+ }
76
+ //# sourceMappingURL=draft-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-store.js","sourceRoot":"","sources":["../../../src/seo/builder/draft-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,wEAAwE;AAExE,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAC3C,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAExC,SAAS,SAAS,CAAC,WAAmB;IACpC,OAAO,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAC3C,CAAC;AAED,mEAAmE;AACnE,SAAS,SAAS,CAAC,WAAmB,EAAE,QAAgB;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,GAAG,YAAY,EAAE,CAAC,CAAC;AAClE,CAAC;AAcD,wEAAwE;AAExE,MAAM,OAAO,aAAa;IACxB;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB,EAAE,MAAsB;QACpD,MAAM,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrD,wEAAwE;QACxE,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QACzF,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACpF,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB,EAAE,QAAgB;QAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;aACvC,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * SeoDraft artifact types (spec-20260717-seo-improver-builder, Sprint 11;
3
+ * ADR-4). Pure `type` declarations only — no runtime code, no imports —
4
+ * mirrors `../types.ts`'s "no runtime" discipline (`types.ts:1-12`).
5
+ *
6
+ * A `SeoDraft` is a PROPOSAL the Sprint-12 `SeoBuilder.build` produces from
7
+ * an `ApprovedFinding` (`./approved-finding.js`); it is never auto-applied.
8
+ * `humanApprovalRequired` is pinned to the LITERAL `true` (not `boolean`) —
9
+ * ADR-4 explicitly rejected a boolean flag as forgeable/mutable, so the type
10
+ * itself must reject `false`. `sourceCitationUrl` must be COPIED verbatim
11
+ * from the `ApprovedFinding` that produced the draft — never invented.
12
+ */
13
+ /** The four artifact kinds the Sprint-12 `SeoBuilder.build` can draft. */
14
+ export type SeoDraftKind = "schema-jsonld" | "internal-link" | "title-meta" | "content-refresh";
15
+ /**
16
+ * One drafted artifact. Every field is provenance-preserving: `artifact` is
17
+ * a proposed text/content string, never auto-applied; `sourceCitationUrl`
18
+ * and `sourceFindingId` trace back to the exact `ApprovedFinding` this draft
19
+ * was derived from.
20
+ */
21
+ export type SeoDraft = {
22
+ kind: SeoDraftKind;
23
+ /** LITERAL `true` — a forgeable plain `boolean` was explicitly rejected (ADR-4). */
24
+ humanApprovalRequired: true;
25
+ /** Copied verbatim from `ApprovedFinding.sourceCitationUrl` — never invented. */
26
+ sourceCitationUrl: string;
27
+ /** The hub Finding id this draft was derived from. */
28
+ sourceFindingId: string;
29
+ /** The URL/page/entity this draft targets. */
30
+ target: string;
31
+ /** The proposed artifact text/content — a proposal, never auto-applied. */
32
+ artifact: string;
33
+ /** The playbook whose tactic produced this draft. */
34
+ playbookRef: string;
35
+ };
36
+ //# sourceMappingURL=draft-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-types.d.ts","sourceRoot":"","sources":["../../../src/seo/builder/draft-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,0EAA0E;AAC1E,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,eAAe,GAAG,YAAY,GAAG,iBAAiB,CAAC;AAIhG;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,oFAAoF;IACpF,qBAAqB,EAAE,IAAI,CAAC;IAC5B,iFAAiF;IACjF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * SeoDraft artifact types (spec-20260717-seo-improver-builder, Sprint 11;
3
+ * ADR-4). Pure `type` declarations only — no runtime code, no imports —
4
+ * mirrors `../types.ts`'s "no runtime" discipline (`types.ts:1-12`).
5
+ *
6
+ * A `SeoDraft` is a PROPOSAL the Sprint-12 `SeoBuilder.build` produces from
7
+ * an `ApprovedFinding` (`./approved-finding.js`); it is never auto-applied.
8
+ * `humanApprovalRequired` is pinned to the LITERAL `true` (not `boolean`) —
9
+ * ADR-4 explicitly rejected a boolean flag as forgeable/mutable, so the type
10
+ * itself must reject `false`. `sourceCitationUrl` must be COPIED verbatim
11
+ * from the `ApprovedFinding` that produced the draft — never invented.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=draft-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-types.js","sourceRoot":"","sources":["../../../src/seo/builder/draft-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,11 @@
1
+ import type { FactStore } from "../../state/facts.js";
2
+ import { ApprovedFinding } from "./approved-finding.js";
3
+ /**
4
+ * Reads approved, cited, SEO-domain hub Findings from `store` and maps each
5
+ * to an `ApprovedFinding` via `ApprovedFinding.from`. Never throws: malformed
6
+ * JSON, schema-invalid rows, non-`"seo"`-domain rows, non-`"approved"`
7
+ * status, and uncited/malformed-citation rows are all silently skipped
8
+ * (sc-11-4).
9
+ */
10
+ export declare function readApprovedSeoFindings(store: FactStore): ApprovedFinding[];
11
+ //# sourceMappingURL=hub-approved-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-approved-source.d.ts","sourceRoot":"","sources":["../../../src/seo/builder/hub-approved-source.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAA4B,MAAM,uBAAuB,CAAC;AAElF;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,eAAe,EAAE,CAqB3E"}