agent-bober 0.17.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1109) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +26 -0
  3. package/README.md +402 -10
  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/answerer.d.ts +17 -0
  48. package/dist/chat/answerer.d.ts.map +1 -0
  49. package/dist/chat/answerer.js +52 -0
  50. package/dist/chat/answerer.js.map +1 -0
  51. package/dist/chat/approval-cursor.d.ts +25 -0
  52. package/dist/chat/approval-cursor.d.ts.map +1 -0
  53. package/dist/chat/approval-cursor.js +61 -0
  54. package/dist/chat/approval-cursor.js.map +1 -0
  55. package/dist/chat/approval-reader.d.ts +11 -0
  56. package/dist/chat/approval-reader.d.ts.map +1 -0
  57. package/dist/chat/approval-reader.js +20 -0
  58. package/dist/chat/approval-reader.js.map +1 -0
  59. package/dist/chat/careful-sidecar.d.ts +15 -0
  60. package/dist/chat/careful-sidecar.d.ts.map +1 -0
  61. package/dist/chat/careful-sidecar.js +39 -0
  62. package/dist/chat/careful-sidecar.js.map +1 -0
  63. package/dist/chat/chat-session.d.ts +156 -0
  64. package/dist/chat/chat-session.d.ts.map +1 -0
  65. package/dist/chat/chat-session.js +570 -0
  66. package/dist/chat/chat-session.js.map +1 -0
  67. package/dist/chat/completion-tailer.d.ts +27 -0
  68. package/dist/chat/completion-tailer.d.ts.map +1 -0
  69. package/dist/chat/completion-tailer.js +187 -0
  70. package/dist/chat/completion-tailer.js.map +1 -0
  71. package/dist/chat/conversation-store.d.ts +22 -0
  72. package/dist/chat/conversation-store.d.ts.map +1 -0
  73. package/dist/chat/conversation-store.js +66 -0
  74. package/dist/chat/conversation-store.js.map +1 -0
  75. package/dist/chat/cursor-store.d.ts +23 -0
  76. package/dist/chat/cursor-store.d.ts.map +1 -0
  77. package/dist/chat/cursor-store.js +42 -0
  78. package/dist/chat/cursor-store.js.map +1 -0
  79. package/dist/chat/pid-sidecar.d.ts +22 -0
  80. package/dist/chat/pid-sidecar.d.ts.map +1 -0
  81. package/dist/chat/pid-sidecar.js +42 -0
  82. package/dist/chat/pid-sidecar.js.map +1 -0
  83. package/dist/chat/roster-reader.d.ts +16 -0
  84. package/dist/chat/roster-reader.d.ts.map +1 -0
  85. package/dist/chat/roster-reader.js +39 -0
  86. package/dist/chat/roster-reader.js.map +1 -0
  87. package/dist/chat/run-spawner.d.ts +71 -0
  88. package/dist/chat/run-spawner.d.ts.map +1 -0
  89. package/dist/chat/run-spawner.js +121 -0
  90. package/dist/chat/run-spawner.js.map +1 -0
  91. package/dist/chat/slash-commands.d.ts +40 -0
  92. package/dist/chat/slash-commands.d.ts.map +1 -0
  93. package/dist/chat/slash-commands.js +153 -0
  94. package/dist/chat/slash-commands.js.map +1 -0
  95. package/dist/chat/steer-cleanup.d.ts +12 -0
  96. package/dist/chat/steer-cleanup.d.ts.map +1 -0
  97. package/dist/chat/steer-cleanup.js +60 -0
  98. package/dist/chat/steer-cleanup.js.map +1 -0
  99. package/dist/chat/turn-classifier.d.ts +46 -0
  100. package/dist/chat/turn-classifier.d.ts.map +1 -0
  101. package/dist/chat/turn-classifier.js +157 -0
  102. package/dist/chat/turn-classifier.js.map +1 -0
  103. package/dist/cli/commands/blackboard.d.ts +33 -0
  104. package/dist/cli/commands/blackboard.d.ts.map +1 -0
  105. package/dist/cli/commands/blackboard.js +114 -0
  106. package/dist/cli/commands/blackboard.js.map +1 -0
  107. package/dist/cli/commands/calendar.d.ts +75 -0
  108. package/dist/cli/commands/calendar.d.ts.map +1 -0
  109. package/dist/cli/commands/calendar.js +203 -0
  110. package/dist/cli/commands/calendar.js.map +1 -0
  111. package/dist/cli/commands/chat.d.ts +13 -0
  112. package/dist/cli/commands/chat.d.ts.map +1 -0
  113. package/dist/cli/commands/chat.js +43 -0
  114. package/dist/cli/commands/chat.js.map +1 -0
  115. package/dist/cli/commands/do.d.ts +52 -0
  116. package/dist/cli/commands/do.d.ts.map +1 -0
  117. package/dist/cli/commands/do.js +216 -0
  118. package/dist/cli/commands/do.js.map +1 -0
  119. package/dist/cli/commands/evolve.d.ts +18 -0
  120. package/dist/cli/commands/evolve.d.ts.map +1 -0
  121. package/dist/cli/commands/evolve.js +72 -0
  122. package/dist/cli/commands/evolve.js.map +1 -0
  123. package/dist/cli/commands/facts.d.ts +15 -0
  124. package/dist/cli/commands/facts.d.ts.map +1 -0
  125. package/dist/cli/commands/facts.js +213 -0
  126. package/dist/cli/commands/facts.js.map +1 -0
  127. package/dist/cli/commands/hub.d.ts +29 -0
  128. package/dist/cli/commands/hub.d.ts.map +1 -0
  129. package/dist/cli/commands/hub.js +233 -0
  130. package/dist/cli/commands/hub.js.map +1 -0
  131. package/dist/cli/commands/medical.d.ts +49 -0
  132. package/dist/cli/commands/medical.d.ts.map +1 -0
  133. package/dist/cli/commands/medical.js +365 -0
  134. package/dist/cli/commands/medical.js.map +1 -0
  135. package/dist/cli/commands/memory.d.ts +2 -1
  136. package/dist/cli/commands/memory.d.ts.map +1 -1
  137. package/dist/cli/commands/memory.js +94 -7
  138. package/dist/cli/commands/memory.js.map +1 -1
  139. package/dist/cli/commands/plan.d.ts.map +1 -1
  140. package/dist/cli/commands/plan.js +29 -3
  141. package/dist/cli/commands/plan.js.map +1 -1
  142. package/dist/cli/commands/replay.d.ts +17 -0
  143. package/dist/cli/commands/replay.d.ts.map +1 -0
  144. package/dist/cli/commands/replay.js +261 -0
  145. package/dist/cli/commands/replay.js.map +1 -0
  146. package/dist/cli/commands/research.d.ts +41 -0
  147. package/dist/cli/commands/research.d.ts.map +1 -0
  148. package/dist/cli/commands/research.js +313 -0
  149. package/dist/cli/commands/research.js.map +1 -0
  150. package/dist/cli/commands/run.d.ts +9 -0
  151. package/dist/cli/commands/run.d.ts.map +1 -1
  152. package/dist/cli/commands/run.js +27 -1
  153. package/dist/cli/commands/run.js.map +1 -1
  154. package/dist/cli/commands/security-audit.d.ts +89 -0
  155. package/dist/cli/commands/security-audit.d.ts.map +1 -0
  156. package/dist/cli/commands/security-audit.js +238 -0
  157. package/dist/cli/commands/security-audit.js.map +1 -0
  158. package/dist/cli/commands/sprint.d.ts.map +1 -1
  159. package/dist/cli/commands/sprint.js +17 -3
  160. package/dist/cli/commands/sprint.js.map +1 -1
  161. package/dist/cli/commands/task.d.ts +64 -0
  162. package/dist/cli/commands/task.d.ts.map +1 -0
  163. package/dist/cli/commands/task.js +422 -0
  164. package/dist/cli/commands/task.js.map +1 -0
  165. package/dist/cli/commands/telegram.d.ts +10 -0
  166. package/dist/cli/commands/telegram.d.ts.map +1 -0
  167. package/dist/cli/commands/telegram.js +44 -0
  168. package/dist/cli/commands/telegram.js.map +1 -0
  169. package/dist/cli/commands/vault.d.ts +40 -0
  170. package/dist/cli/commands/vault.d.ts.map +1 -0
  171. package/dist/cli/commands/vault.js +122 -0
  172. package/dist/cli/commands/vault.js.map +1 -0
  173. package/dist/cli/index.js +45 -0
  174. package/dist/cli/index.js.map +1 -1
  175. package/dist/config/defaults.d.ts.map +1 -1
  176. package/dist/config/defaults.js +8 -0
  177. package/dist/config/defaults.js.map +1 -1
  178. package/dist/config/role-providers.d.ts +16 -1
  179. package/dist/config/role-providers.d.ts.map +1 -1
  180. package/dist/config/role-providers.js +14 -2
  181. package/dist/config/role-providers.js.map +1 -1
  182. package/dist/config/schema.d.ts +4050 -454
  183. package/dist/config/schema.d.ts.map +1 -1
  184. package/dist/config/schema.js +429 -1
  185. package/dist/config/schema.js.map +1 -1
  186. package/dist/contracts/eval-result.d.ts +84 -84
  187. package/dist/contracts/spec.d.ts +28 -28
  188. package/dist/contracts/sprint-contract.d.ts +4 -4
  189. package/dist/do-bridge/coding-promoter.d.ts +19 -0
  190. package/dist/do-bridge/coding-promoter.d.ts.map +1 -0
  191. package/dist/do-bridge/coding-promoter.js +43 -0
  192. package/dist/do-bridge/coding-promoter.js.map +1 -0
  193. package/dist/do-bridge/finding-port.d.ts +88 -0
  194. package/dist/do-bridge/finding-port.d.ts.map +1 -0
  195. package/dist/do-bridge/finding-port.js +95 -0
  196. package/dist/do-bridge/finding-port.js.map +1 -0
  197. package/dist/do-bridge/launcher.d.ts +55 -0
  198. package/dist/do-bridge/launcher.d.ts.map +1 -0
  199. package/dist/do-bridge/launcher.js +37 -0
  200. package/dist/do-bridge/launcher.js.map +1 -0
  201. package/dist/do-bridge/promote.d.ts +50 -0
  202. package/dist/do-bridge/promote.d.ts.map +1 -0
  203. package/dist/do-bridge/promote.js +116 -0
  204. package/dist/do-bridge/promote.js.map +1 -0
  205. package/dist/do-bridge/reconcile.d.ts +50 -0
  206. package/dist/do-bridge/reconcile.d.ts.map +1 -0
  207. package/dist/do-bridge/reconcile.js +70 -0
  208. package/dist/do-bridge/reconcile.js.map +1 -0
  209. package/dist/do-bridge/registry.d.ts +23 -0
  210. package/dist/do-bridge/registry.d.ts.map +1 -0
  211. package/dist/do-bridge/registry.js +42 -0
  212. package/dist/do-bridge/registry.js.map +1 -0
  213. package/dist/do-bridge/types.d.ts +50 -0
  214. package/dist/do-bridge/types.d.ts.map +1 -0
  215. package/dist/do-bridge/types.js +17 -0
  216. package/dist/do-bridge/types.js.map +1 -0
  217. package/dist/fleet/child-config.d.ts.map +1 -1
  218. package/dist/fleet/child-config.js +7 -0
  219. package/dist/fleet/child-config.js.map +1 -1
  220. package/dist/fleet/coordinator.d.ts +27 -1
  221. package/dist/fleet/coordinator.d.ts.map +1 -1
  222. package/dist/fleet/coordinator.js +70 -0
  223. package/dist/fleet/coordinator.js.map +1 -1
  224. package/dist/fleet/critic-deep.d.ts +61 -0
  225. package/dist/fleet/critic-deep.d.ts.map +1 -0
  226. package/dist/fleet/critic-deep.js +202 -0
  227. package/dist/fleet/critic-deep.js.map +1 -0
  228. package/dist/fleet/decomposer-deep-constants.d.ts +4 -0
  229. package/dist/fleet/decomposer-deep-constants.d.ts.map +1 -0
  230. package/dist/fleet/decomposer-deep-constants.js +14 -0
  231. package/dist/fleet/decomposer-deep-constants.js.map +1 -0
  232. package/dist/fleet/decomposer-deep-types.d.ts +8 -0
  233. package/dist/fleet/decomposer-deep-types.d.ts.map +1 -0
  234. package/dist/fleet/decomposer-deep-types.js +9 -0
  235. package/dist/fleet/decomposer-deep-types.js.map +1 -0
  236. package/dist/fleet/decomposer-deep.d.ts +44 -0
  237. package/dist/fleet/decomposer-deep.d.ts.map +1 -0
  238. package/dist/fleet/decomposer-deep.js +261 -0
  239. package/dist/fleet/decomposer-deep.js.map +1 -0
  240. package/dist/fleet/decomposer.d.ts +22 -0
  241. package/dist/fleet/decomposer.d.ts.map +1 -0
  242. package/dist/fleet/decomposer.js +144 -0
  243. package/dist/fleet/decomposer.js.map +1 -0
  244. package/dist/fleet/index.d.ts +102 -0
  245. package/dist/fleet/index.d.ts.map +1 -1
  246. package/dist/fleet/index.js +316 -9
  247. package/dist/fleet/index.js.map +1 -1
  248. package/dist/fleet/manifest-write.d.ts +30 -0
  249. package/dist/fleet/manifest-write.d.ts.map +1 -0
  250. package/dist/fleet/manifest-write.js +90 -0
  251. package/dist/fleet/manifest-write.js.map +1 -0
  252. package/dist/fleet/manifest.d.ts +32 -6
  253. package/dist/fleet/manifest.d.ts.map +1 -1
  254. package/dist/fleet/manifest.js +8 -0
  255. package/dist/fleet/manifest.js.map +1 -1
  256. package/dist/fleet/reporter.d.ts +4 -1
  257. package/dist/fleet/reporter.d.ts.map +1 -1
  258. package/dist/fleet/reporter.js +2 -1
  259. package/dist/fleet/reporter.js.map +1 -1
  260. package/dist/fleet/scaffolder.d.ts +5 -1
  261. package/dist/fleet/scaffolder.d.ts.map +1 -1
  262. package/dist/fleet/scaffolder.js +11 -2
  263. package/dist/fleet/scaffolder.js.map +1 -1
  264. package/dist/fleet/shared-blackboard.d.ts +51 -0
  265. package/dist/fleet/shared-blackboard.d.ts.map +1 -0
  266. package/dist/fleet/shared-blackboard.js +79 -0
  267. package/dist/fleet/shared-blackboard.js.map +1 -0
  268. package/dist/fleet/synthesis.d.ts +16 -0
  269. package/dist/fleet/synthesis.d.ts.map +1 -0
  270. package/dist/fleet/synthesis.js +22 -0
  271. package/dist/fleet/synthesis.js.map +1 -0
  272. package/dist/fleet/tier-policy.d.ts +18 -0
  273. package/dist/fleet/tier-policy.d.ts.map +1 -0
  274. package/dist/fleet/tier-policy.js +53 -0
  275. package/dist/fleet/tier-policy.js.map +1 -0
  276. package/dist/fleet/tool-role-guard.d.ts +24 -0
  277. package/dist/fleet/tool-role-guard.d.ts.map +1 -0
  278. package/dist/fleet/tool-role-guard.js +55 -0
  279. package/dist/fleet/tool-role-guard.js.map +1 -0
  280. package/dist/graph/client.d.ts.map +1 -1
  281. package/dist/graph/client.js +115 -23
  282. package/dist/graph/client.js.map +1 -1
  283. package/dist/graph/mcp-client.d.ts +1 -0
  284. package/dist/graph/mcp-client.d.ts.map +1 -1
  285. package/dist/graph/mcp-client.js +58 -7
  286. package/dist/graph/mcp-client.js.map +1 -1
  287. package/dist/hub/collector.d.ts +12 -0
  288. package/dist/hub/collector.d.ts.map +1 -0
  289. package/dist/hub/collector.js +36 -0
  290. package/dist/hub/collector.js.map +1 -0
  291. package/dist/hub/finding-source.d.ts +22 -0
  292. package/dist/hub/finding-source.d.ts.map +1 -0
  293. package/dist/hub/finding-source.js +41 -0
  294. package/dist/hub/finding-source.js.map +1 -0
  295. package/dist/hub/finding-store.d.ts +68 -0
  296. package/dist/hub/finding-store.d.ts.map +1 -0
  297. package/dist/hub/finding-store.js +122 -0
  298. package/dist/hub/finding-store.js.map +1 -0
  299. package/dist/hub/finding.d.ts +54 -0
  300. package/dist/hub/finding.d.ts.map +1 -0
  301. package/dist/hub/finding.js +24 -0
  302. package/dist/hub/finding.js.map +1 -0
  303. package/dist/hub/gmail-to-task.d.ts +69 -0
  304. package/dist/hub/gmail-to-task.d.ts.map +1 -0
  305. package/dist/hub/gmail-to-task.js +102 -0
  306. package/dist/hub/gmail-to-task.js.map +1 -0
  307. package/dist/hub/hub-config.d.ts +18 -0
  308. package/dist/hub/hub-config.d.ts.map +1 -0
  309. package/dist/hub/hub-config.js +40 -0
  310. package/dist/hub/hub-config.js.map +1 -0
  311. package/dist/hub/judge.d.ts +30 -0
  312. package/dist/hub/judge.d.ts.map +1 -0
  313. package/dist/hub/judge.js +177 -0
  314. package/dist/hub/judge.js.map +1 -0
  315. package/dist/hub/lenses.d.ts +60 -0
  316. package/dist/hub/lenses.d.ts.map +1 -0
  317. package/dist/hub/lenses.js +123 -0
  318. package/dist/hub/lenses.js.map +1 -0
  319. package/dist/hub/priority-md.d.ts +21 -0
  320. package/dist/hub/priority-md.d.ts.map +1 -0
  321. package/dist/hub/priority-md.js +64 -0
  322. package/dist/hub/priority-md.js.map +1 -0
  323. package/dist/hub/repo-resolver.d.ts +11 -0
  324. package/dist/hub/repo-resolver.d.ts.map +1 -0
  325. package/dist/hub/repo-resolver.js +39 -0
  326. package/dist/hub/repo-resolver.js.map +1 -0
  327. package/dist/hub/scope.d.ts +39 -0
  328. package/dist/hub/scope.d.ts.map +1 -0
  329. package/dist/hub/scope.js +62 -0
  330. package/dist/hub/scope.js.map +1 -0
  331. package/dist/hub/task-inbox.d.ts +16 -0
  332. package/dist/hub/task-inbox.d.ts.map +1 -0
  333. package/dist/hub/task-inbox.js +39 -0
  334. package/dist/hub/task-inbox.js.map +1 -0
  335. package/dist/incident/resolution-verify.d.ts +2 -2
  336. package/dist/incident/types.d.ts +8 -8
  337. package/dist/index.d.ts +2 -1
  338. package/dist/index.d.ts.map +1 -1
  339. package/dist/index.js +2 -1
  340. package/dist/index.js.map +1 -1
  341. package/dist/mcp/run-manager.d.ts +9 -1
  342. package/dist/mcp/run-manager.d.ts.map +1 -1
  343. package/dist/mcp/run-manager.js.map +1 -1
  344. package/dist/medical/adapters/apple-health.d.ts +32 -0
  345. package/dist/medical/adapters/apple-health.d.ts.map +1 -0
  346. package/dist/medical/adapters/apple-health.js +100 -0
  347. package/dist/medical/adapters/apple-health.js.map +1 -0
  348. package/dist/medical/analysis/cadence.d.ts +32 -0
  349. package/dist/medical/analysis/cadence.d.ts.map +1 -0
  350. package/dist/medical/analysis/cadence.js +72 -0
  351. package/dist/medical/analysis/cadence.js.map +1 -0
  352. package/dist/medical/analysis/cross-marker.d.ts +33 -0
  353. package/dist/medical/analysis/cross-marker.d.ts.map +1 -0
  354. package/dist/medical/analysis/cross-marker.js +79 -0
  355. package/dist/medical/analysis/cross-marker.js.map +1 -0
  356. package/dist/medical/analysis/finding-writer.d.ts +26 -0
  357. package/dist/medical/analysis/finding-writer.d.ts.map +1 -0
  358. package/dist/medical/analysis/finding-writer.js +60 -0
  359. package/dist/medical/analysis/finding-writer.js.map +1 -0
  360. package/dist/medical/analysis/finding.d.ts +63 -0
  361. package/dist/medical/analysis/finding.d.ts.map +1 -0
  362. package/dist/medical/analysis/finding.js +70 -0
  363. package/dist/medical/analysis/finding.js.map +1 -0
  364. package/dist/medical/analysis/review-pass.d.ts +76 -0
  365. package/dist/medical/analysis/review-pass.d.ts.map +1 -0
  366. package/dist/medical/analysis/review-pass.js +119 -0
  367. package/dist/medical/analysis/review-pass.js.map +1 -0
  368. package/dist/medical/analysis/trends.d.ts +36 -0
  369. package/dist/medical/analysis/trends.d.ts.map +1 -0
  370. package/dist/medical/analysis/trends.js +157 -0
  371. package/dist/medical/analysis/trends.js.map +1 -0
  372. package/dist/medical/audit.d.ts +31 -0
  373. package/dist/medical/audit.d.ts.map +1 -0
  374. package/dist/medical/audit.js +56 -0
  375. package/dist/medical/audit.js.map +1 -0
  376. package/dist/medical/consent.d.ts +37 -0
  377. package/dist/medical/consent.d.ts.map +1 -0
  378. package/dist/medical/consent.js +73 -0
  379. package/dist/medical/consent.js.map +1 -0
  380. package/dist/medical/disclaimer.d.ts +11 -0
  381. package/dist/medical/disclaimer.d.ts.map +1 -0
  382. package/dist/medical/disclaimer.js +21 -0
  383. package/dist/medical/disclaimer.js.map +1 -0
  384. package/dist/medical/egress.d.ts +30 -0
  385. package/dist/medical/egress.d.ts.map +1 -0
  386. package/dist/medical/egress.js +50 -0
  387. package/dist/medical/egress.js.map +1 -0
  388. package/dist/medical/engine.d.ts +73 -0
  389. package/dist/medical/engine.d.ts.map +1 -0
  390. package/dist/medical/engine.js +333 -0
  391. package/dist/medical/engine.js.map +1 -0
  392. package/dist/medical/guardrails.d.ts +47 -0
  393. package/dist/medical/guardrails.d.ts.map +1 -0
  394. package/dist/medical/guardrails.js +92 -0
  395. package/dist/medical/guardrails.js.map +1 -0
  396. package/dist/medical/health-store.d.ts +85 -0
  397. package/dist/medical/health-store.d.ts.map +1 -0
  398. package/dist/medical/health-store.js +214 -0
  399. package/dist/medical/health-store.js.map +1 -0
  400. package/dist/medical/inference.d.ts +22 -0
  401. package/dist/medical/inference.d.ts.map +1 -0
  402. package/dist/medical/inference.js +39 -0
  403. package/dist/medical/inference.js.map +1 -0
  404. package/dist/medical/ingestion.d.ts +33 -0
  405. package/dist/medical/ingestion.d.ts.map +1 -0
  406. package/dist/medical/ingestion.js +52 -0
  407. package/dist/medical/ingestion.js.map +1 -0
  408. package/dist/medical/lab-note.d.ts +72 -0
  409. package/dist/medical/lab-note.d.ts.map +1 -0
  410. package/dist/medical/lab-note.js +161 -0
  411. package/dist/medical/lab-note.js.map +1 -0
  412. package/dist/medical/lab-pdf-parser.d.ts +19 -0
  413. package/dist/medical/lab-pdf-parser.d.ts.map +1 -0
  414. package/dist/medical/lab-pdf-parser.js +57 -0
  415. package/dist/medical/lab-pdf-parser.js.map +1 -0
  416. package/dist/medical/lab-reindex.d.ts +24 -0
  417. package/dist/medical/lab-reindex.d.ts.map +1 -0
  418. package/dist/medical/lab-reindex.js +45 -0
  419. package/dist/medical/lab-reindex.js.map +1 -0
  420. package/dist/medical/lab-types.d.ts +75 -0
  421. package/dist/medical/lab-types.d.ts.map +1 -0
  422. package/dist/medical/lab-types.js +17 -0
  423. package/dist/medical/lab-types.js.map +1 -0
  424. package/dist/medical/numerics.d.ts +66 -0
  425. package/dist/medical/numerics.d.ts.map +1 -0
  426. package/dist/medical/numerics.js +216 -0
  427. package/dist/medical/numerics.js.map +1 -0
  428. package/dist/medical/profile.d.ts +96 -0
  429. package/dist/medical/profile.d.ts.map +1 -0
  430. package/dist/medical/profile.js +273 -0
  431. package/dist/medical/profile.js.map +1 -0
  432. package/dist/medical/recommend/context.d.ts +48 -0
  433. package/dist/medical/recommend/context.d.ts.map +1 -0
  434. package/dist/medical/recommend/context.js +109 -0
  435. package/dist/medical/recommend/context.js.map +1 -0
  436. package/dist/medical/recommend/judge-panel.d.ts +49 -0
  437. package/dist/medical/recommend/judge-panel.d.ts.map +1 -0
  438. package/dist/medical/recommend/judge-panel.js +164 -0
  439. package/dist/medical/recommend/judge-panel.js.map +1 -0
  440. package/dist/medical/recommend/lenses.d.ts +72 -0
  441. package/dist/medical/recommend/lenses.d.ts.map +1 -0
  442. package/dist/medical/recommend/lenses.js +220 -0
  443. package/dist/medical/recommend/lenses.js.map +1 -0
  444. package/dist/medical/recommend/recommend.d.ts +86 -0
  445. package/dist/medical/recommend/recommend.d.ts.map +1 -0
  446. package/dist/medical/recommend/recommend.js +211 -0
  447. package/dist/medical/recommend/recommend.js.map +1 -0
  448. package/dist/medical/recommend/types.d.ts +98 -0
  449. package/dist/medical/recommend/types.d.ts.map +1 -0
  450. package/dist/medical/recommend/types.js +20 -0
  451. package/dist/medical/recommend/types.js.map +1 -0
  452. package/dist/medical/recommend/urgency.d.ts +26 -0
  453. package/dist/medical/recommend/urgency.d.ts.map +1 -0
  454. package/dist/medical/recommend/urgency.js +124 -0
  455. package/dist/medical/recommend/urgency.js.map +1 -0
  456. package/dist/medical/red-flag.d.ts +42 -0
  457. package/dist/medical/red-flag.d.ts.map +1 -0
  458. package/dist/medical/red-flag.js +161 -0
  459. package/dist/medical/red-flag.js.map +1 -0
  460. package/dist/medical/refusal.d.ts +46 -0
  461. package/dist/medical/refusal.d.ts.map +1 -0
  462. package/dist/medical/refusal.js +131 -0
  463. package/dist/medical/refusal.js.map +1 -0
  464. package/dist/medical/research/online-research.d.ts +65 -0
  465. package/dist/medical/research/online-research.d.ts.map +1 -0
  466. package/dist/medical/research/online-research.js +101 -0
  467. package/dist/medical/research/online-research.js.map +1 -0
  468. package/dist/medical/research/research-note.d.ts +32 -0
  469. package/dist/medical/research/research-note.d.ts.map +1 -0
  470. package/dist/medical/research/research-note.js +55 -0
  471. package/dist/medical/research/research-note.js.map +1 -0
  472. package/dist/medical/retrieval/grounding-critic.d.ts +34 -0
  473. package/dist/medical/retrieval/grounding-critic.d.ts.map +1 -0
  474. package/dist/medical/retrieval/grounding-critic.js +153 -0
  475. package/dist/medical/retrieval/grounding-critic.js.map +1 -0
  476. package/dist/medical/retrieval/literature.d.ts +78 -0
  477. package/dist/medical/retrieval/literature.d.ts.map +1 -0
  478. package/dist/medical/retrieval/literature.js +292 -0
  479. package/dist/medical/retrieval/literature.js.map +1 -0
  480. package/dist/medical/retrieval/medline-source.d.ts +72 -0
  481. package/dist/medical/retrieval/medline-source.d.ts.map +1 -0
  482. package/dist/medical/retrieval/medline-source.js +120 -0
  483. package/dist/medical/retrieval/medline-source.js.map +1 -0
  484. package/dist/medical/supplements.d.ts +82 -0
  485. package/dist/medical/supplements.d.ts.map +1 -0
  486. package/dist/medical/supplements.js +173 -0
  487. package/dist/medical/supplements.js.map +1 -0
  488. package/dist/medical/team.d.ts +15 -0
  489. package/dist/medical/team.d.ts.map +1 -0
  490. package/dist/medical/team.js +44 -0
  491. package/dist/medical/team.js.map +1 -0
  492. package/dist/medical/types.d.ts +175 -0
  493. package/dist/medical/types.d.ts.map +1 -0
  494. package/dist/medical/types.js +8 -0
  495. package/dist/medical/types.js.map +1 -0
  496. package/dist/medical/whoop/whoop-client.d.ts +114 -0
  497. package/dist/medical/whoop/whoop-client.d.ts.map +1 -0
  498. package/dist/medical/whoop/whoop-client.js +226 -0
  499. package/dist/medical/whoop/whoop-client.js.map +1 -0
  500. package/dist/medical/whoop/whoop-sync.d.ts +25 -0
  501. package/dist/medical/whoop/whoop-sync.d.ts.map +1 -0
  502. package/dist/medical/whoop/whoop-sync.js +97 -0
  503. package/dist/medical/whoop/whoop-sync.js.map +1 -0
  504. package/dist/medical/whoop/whoop-token.d.ts +44 -0
  505. package/dist/medical/whoop/whoop-token.d.ts.map +1 -0
  506. package/dist/medical/whoop/whoop-token.js +66 -0
  507. package/dist/medical/whoop/whoop-token.js.map +1 -0
  508. package/dist/orchestrator/agentic-loop.d.ts +160 -1
  509. package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
  510. package/dist/orchestrator/agentic-loop.js +350 -41
  511. package/dist/orchestrator/agentic-loop.js.map +1 -1
  512. package/dist/orchestrator/compaction.d.ts +47 -0
  513. package/dist/orchestrator/compaction.d.ts.map +1 -0
  514. package/dist/orchestrator/compaction.js +75 -0
  515. package/dist/orchestrator/compaction.js.map +1 -0
  516. package/dist/orchestrator/context-handoff.d.ts +60 -60
  517. package/dist/orchestrator/contract-materialization.d.ts +33 -0
  518. package/dist/orchestrator/contract-materialization.d.ts.map +1 -0
  519. package/dist/orchestrator/contract-materialization.js +113 -0
  520. package/dist/orchestrator/contract-materialization.js.map +1 -0
  521. package/dist/orchestrator/generator-agent.d.ts +19 -0
  522. package/dist/orchestrator/generator-agent.d.ts.map +1 -1
  523. package/dist/orchestrator/generator-agent.js +27 -1
  524. package/dist/orchestrator/generator-agent.js.map +1 -1
  525. package/dist/orchestrator/loop-events.d.ts +98 -0
  526. package/dist/orchestrator/loop-events.d.ts.map +1 -0
  527. package/dist/orchestrator/loop-events.js +2 -0
  528. package/dist/orchestrator/loop-events.js.map +1 -0
  529. package/dist/orchestrator/memory/distill.d.ts +4 -1
  530. package/dist/orchestrator/memory/distill.d.ts.map +1 -1
  531. package/dist/orchestrator/memory/distill.js +41 -1
  532. package/dist/orchestrator/memory/distill.js.map +1 -1
  533. package/dist/orchestrator/memory/fact-detector.d.ts +61 -0
  534. package/dist/orchestrator/memory/fact-detector.d.ts.map +1 -0
  535. package/dist/orchestrator/memory/fact-detector.js +153 -0
  536. package/dist/orchestrator/memory/fact-detector.js.map +1 -0
  537. package/dist/orchestrator/memory/fact-judge.d.ts +19 -0
  538. package/dist/orchestrator/memory/fact-judge.d.ts.map +1 -0
  539. package/dist/orchestrator/memory/fact-judge.js +121 -0
  540. package/dist/orchestrator/memory/fact-judge.js.map +1 -0
  541. package/dist/orchestrator/memory/fact-retrieve.d.ts +52 -0
  542. package/dist/orchestrator/memory/fact-retrieve.d.ts.map +1 -0
  543. package/dist/orchestrator/memory/fact-retrieve.js +117 -0
  544. package/dist/orchestrator/memory/fact-retrieve.js.map +1 -0
  545. package/dist/orchestrator/memory/hygiene.d.ts +66 -0
  546. package/dist/orchestrator/memory/hygiene.d.ts.map +1 -0
  547. package/dist/orchestrator/memory/hygiene.js +153 -0
  548. package/dist/orchestrator/memory/hygiene.js.map +1 -0
  549. package/dist/orchestrator/memory/reconcile.d.ts +47 -0
  550. package/dist/orchestrator/memory/reconcile.d.ts.map +1 -0
  551. package/dist/orchestrator/memory/reconcile.js +116 -0
  552. package/dist/orchestrator/memory/reconcile.js.map +1 -0
  553. package/dist/orchestrator/memory/retrieve.d.ts +5 -3
  554. package/dist/orchestrator/memory/retrieve.d.ts.map +1 -1
  555. package/dist/orchestrator/memory/retrieve.js +9 -6
  556. package/dist/orchestrator/memory/retrieve.js.map +1 -1
  557. package/dist/orchestrator/model-resolver.d.ts.map +1 -1
  558. package/dist/orchestrator/model-resolver.js +10 -6
  559. package/dist/orchestrator/model-resolver.js.map +1 -1
  560. package/dist/orchestrator/pipeline.d.ts +29 -4
  561. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  562. package/dist/orchestrator/pipeline.js +165 -56
  563. package/dist/orchestrator/pipeline.js.map +1 -1
  564. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  565. package/dist/orchestrator/planner-agent.js +16 -1
  566. package/dist/orchestrator/planner-agent.js.map +1 -1
  567. package/dist/orchestrator/security-audit-types.d.ts +53 -0
  568. package/dist/orchestrator/security-audit-types.d.ts.map +1 -0
  569. package/dist/orchestrator/security-audit-types.js +10 -0
  570. package/dist/orchestrator/security-audit-types.js.map +1 -0
  571. package/dist/orchestrator/security-auditor-agent.d.ts +68 -0
  572. package/dist/orchestrator/security-auditor-agent.d.ts.map +1 -0
  573. package/dist/orchestrator/security-auditor-agent.js +482 -0
  574. package/dist/orchestrator/security-auditor-agent.js.map +1 -0
  575. package/dist/orchestrator/security-gate.d.ts +73 -0
  576. package/dist/orchestrator/security-gate.d.ts.map +1 -0
  577. package/dist/orchestrator/security-gate.js +174 -0
  578. package/dist/orchestrator/security-gate.js.map +1 -0
  579. package/dist/orchestrator/security-hub.d.ts +45 -0
  580. package/dist/orchestrator/security-hub.d.ts.map +1 -0
  581. package/dist/orchestrator/security-hub.js +147 -0
  582. package/dist/orchestrator/security-hub.js.map +1 -0
  583. package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts +43 -0
  584. package/dist/orchestrator/security-knowledge/benchmark/harness.d.ts.map +1 -0
  585. package/dist/orchestrator/security-knowledge/benchmark/harness.js +13 -0
  586. package/dist/orchestrator/security-knowledge/benchmark/harness.js.map +1 -0
  587. package/dist/orchestrator/security-knowledge/diff-provider.d.ts +79 -0
  588. package/dist/orchestrator/security-knowledge/diff-provider.d.ts.map +1 -0
  589. package/dist/orchestrator/security-knowledge/diff-provider.js +320 -0
  590. package/dist/orchestrator/security-knowledge/diff-provider.js.map +1 -0
  591. package/dist/orchestrator/security-knowledge/index.d.ts +22 -0
  592. package/dist/orchestrator/security-knowledge/index.d.ts.map +1 -0
  593. package/dist/orchestrator/security-knowledge/index.js +66 -0
  594. package/dist/orchestrator/security-knowledge/index.js.map +1 -0
  595. package/dist/orchestrator/security-knowledge/parser.d.ts +9 -0
  596. package/dist/orchestrator/security-knowledge/parser.d.ts.map +1 -0
  597. package/dist/orchestrator/security-knowledge/parser.js +137 -0
  598. package/dist/orchestrator/security-knowledge/parser.js.map +1 -0
  599. package/dist/orchestrator/security-knowledge/registry.d.ts +25 -0
  600. package/dist/orchestrator/security-knowledge/registry.d.ts.map +1 -0
  601. package/dist/orchestrator/security-knowledge/registry.js +114 -0
  602. package/dist/orchestrator/security-knowledge/registry.js.map +1 -0
  603. package/dist/orchestrator/security-knowledge/resolver.d.ts +48 -0
  604. package/dist/orchestrator/security-knowledge/resolver.d.ts.map +1 -0
  605. package/dist/orchestrator/security-knowledge/resolver.js +63 -0
  606. package/dist/orchestrator/security-knowledge/resolver.js.map +1 -0
  607. package/dist/orchestrator/security-knowledge/selector.d.ts +18 -0
  608. package/dist/orchestrator/security-knowledge/selector.d.ts.map +1 -0
  609. package/dist/orchestrator/security-knowledge/selector.js +46 -0
  610. package/dist/orchestrator/security-knowledge/selector.js.map +1 -0
  611. package/dist/orchestrator/security-knowledge/signature.d.ts +37 -0
  612. package/dist/orchestrator/security-knowledge/signature.d.ts.map +1 -0
  613. package/dist/orchestrator/security-knowledge/signature.js +2 -0
  614. package/dist/orchestrator/security-knowledge/signature.js.map +1 -0
  615. package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts +29 -0
  616. package/dist/orchestrator/security-knowledge/supply-chain-inspector.d.ts.map +1 -0
  617. package/dist/orchestrator/security-knowledge/supply-chain-inspector.js +211 -0
  618. package/dist/orchestrator/security-knowledge/supply-chain-inspector.js.map +1 -0
  619. package/dist/orchestrator/security-scanners.d.ts +126 -0
  620. package/dist/orchestrator/security-scanners.d.ts.map +1 -0
  621. package/dist/orchestrator/security-scanners.js +501 -0
  622. package/dist/orchestrator/security-scanners.js.map +1 -0
  623. package/dist/orchestrator/security-verifier-agent.d.ts +62 -0
  624. package/dist/orchestrator/security-verifier-agent.d.ts.map +1 -0
  625. package/dist/orchestrator/security-verifier-agent.js +230 -0
  626. package/dist/orchestrator/security-verifier-agent.js.map +1 -0
  627. package/dist/orchestrator/selfimprove/eval-guards.d.ts +51 -0
  628. package/dist/orchestrator/selfimprove/eval-guards.d.ts.map +1 -0
  629. package/dist/orchestrator/selfimprove/eval-guards.js +120 -0
  630. package/dist/orchestrator/selfimprove/eval-guards.js.map +1 -0
  631. package/dist/orchestrator/selfimprove/gepa.d.ts +74 -0
  632. package/dist/orchestrator/selfimprove/gepa.d.ts.map +1 -0
  633. package/dist/orchestrator/selfimprove/gepa.js +227 -0
  634. package/dist/orchestrator/selfimprove/gepa.js.map +1 -0
  635. package/dist/orchestrator/selfimprove/replay-harness.d.ts +65 -0
  636. package/dist/orchestrator/selfimprove/replay-harness.d.ts.map +1 -0
  637. package/dist/orchestrator/selfimprove/replay-harness.js +134 -0
  638. package/dist/orchestrator/selfimprove/replay-harness.js.map +1 -0
  639. package/dist/orchestrator/selfimprove/replay-store.d.ts +45 -0
  640. package/dist/orchestrator/selfimprove/replay-store.d.ts.map +1 -0
  641. package/dist/orchestrator/selfimprove/replay-store.js +119 -0
  642. package/dist/orchestrator/selfimprove/replay-store.js.map +1 -0
  643. package/dist/orchestrator/selfimprove/replay-types.d.ts +32 -0
  644. package/dist/orchestrator/selfimprove/replay-types.d.ts.map +1 -0
  645. package/dist/orchestrator/selfimprove/replay-types.js +15 -0
  646. package/dist/orchestrator/selfimprove/replay-types.js.map +1 -0
  647. package/dist/orchestrator/session-store.d.ts +95 -0
  648. package/dist/orchestrator/session-store.d.ts.map +1 -0
  649. package/dist/orchestrator/session-store.js +186 -0
  650. package/dist/orchestrator/session-store.js.map +1 -0
  651. package/dist/orchestrator/stack-knowledge.d.ts +17 -0
  652. package/dist/orchestrator/stack-knowledge.d.ts.map +1 -0
  653. package/dist/orchestrator/stack-knowledge.js +35 -0
  654. package/dist/orchestrator/stack-knowledge.js.map +1 -0
  655. package/dist/orchestrator/subagents.d.ts +62 -0
  656. package/dist/orchestrator/subagents.d.ts.map +1 -0
  657. package/dist/orchestrator/subagents.js +143 -0
  658. package/dist/orchestrator/subagents.js.map +1 -0
  659. package/dist/orchestrator/tools/executor.d.ts +68 -0
  660. package/dist/orchestrator/tools/executor.d.ts.map +1 -0
  661. package/dist/orchestrator/tools/executor.js +104 -0
  662. package/dist/orchestrator/tools/executor.js.map +1 -0
  663. package/dist/orchestrator/tools/mcp-bridge.d.ts +76 -0
  664. package/dist/orchestrator/tools/mcp-bridge.d.ts.map +1 -0
  665. package/dist/orchestrator/tools/mcp-bridge.js +154 -0
  666. package/dist/orchestrator/tools/mcp-bridge.js.map +1 -0
  667. package/dist/orchestrator/tools/schemas.d.ts.map +1 -1
  668. package/dist/orchestrator/tools/schemas.js +3 -0
  669. package/dist/orchestrator/tools/schemas.js.map +1 -1
  670. package/dist/orchestrator/workflow/budget.d.ts +24 -2
  671. package/dist/orchestrator/workflow/budget.d.ts.map +1 -1
  672. package/dist/orchestrator/workflow/budget.js +39 -1
  673. package/dist/orchestrator/workflow/budget.js.map +1 -1
  674. package/dist/orchestrator/workflow/engine.d.ts +4 -2
  675. package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
  676. package/dist/orchestrator/workflow/selector.d.ts +18 -0
  677. package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
  678. package/dist/orchestrator/workflow/selector.js +51 -0
  679. package/dist/orchestrator/workflow/selector.js.map +1 -1
  680. package/dist/orchestrator/workflow/ts-engine.d.ts +3 -1
  681. package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -1
  682. package/dist/orchestrator/workflow/ts-engine.js +2 -2
  683. package/dist/orchestrator/workflow/ts-engine.js.map +1 -1
  684. package/dist/orchestrator/workflow/workflow-engine.d.ts +3 -1
  685. package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -1
  686. package/dist/orchestrator/workflow/workflow-engine.js +3 -3
  687. package/dist/orchestrator/workflow/workflow-engine.js.map +1 -1
  688. package/dist/providers/anthropic.d.ts.map +1 -1
  689. package/dist/providers/anthropic.js +116 -26
  690. package/dist/providers/anthropic.js.map +1 -1
  691. package/dist/providers/claude-code.d.ts.map +1 -1
  692. package/dist/providers/claude-code.js +17 -0
  693. package/dist/providers/claude-code.js.map +1 -1
  694. package/dist/providers/cost-meter.d.ts +52 -0
  695. package/dist/providers/cost-meter.d.ts.map +1 -0
  696. package/dist/providers/cost-meter.js +81 -0
  697. package/dist/providers/cost-meter.js.map +1 -0
  698. package/dist/providers/factory.d.ts +6 -1
  699. package/dist/providers/factory.d.ts.map +1 -1
  700. package/dist/providers/factory.js +24 -5
  701. package/dist/providers/factory.js.map +1 -1
  702. package/dist/providers/google.d.ts.map +1 -1
  703. package/dist/providers/google.js +29 -0
  704. package/dist/providers/google.js.map +1 -1
  705. package/dist/providers/grounded-search.d.ts +128 -0
  706. package/dist/providers/grounded-search.d.ts.map +1 -0
  707. package/dist/providers/grounded-search.js +160 -0
  708. package/dist/providers/grounded-search.js.map +1 -0
  709. package/dist/providers/openai-compat.d.ts +15 -1
  710. package/dist/providers/openai-compat.d.ts.map +1 -1
  711. package/dist/providers/openai-compat.js +24 -0
  712. package/dist/providers/openai-compat.js.map +1 -1
  713. package/dist/providers/openai.d.ts +7 -0
  714. package/dist/providers/openai.d.ts.map +1 -1
  715. package/dist/providers/openai.js +95 -4
  716. package/dist/providers/openai.js.map +1 -1
  717. package/dist/providers/types.d.ts +88 -0
  718. package/dist/providers/types.d.ts.map +1 -1
  719. package/dist/research/cadence.d.ts +33 -0
  720. package/dist/research/cadence.d.ts.map +1 -0
  721. package/dist/research/cadence.js +55 -0
  722. package/dist/research/cadence.js.map +1 -0
  723. package/dist/research/digest.d.ts +80 -0
  724. package/dist/research/digest.d.ts.map +1 -0
  725. package/dist/research/digest.js +119 -0
  726. package/dist/research/digest.js.map +1 -0
  727. package/dist/research/egress.d.ts +28 -0
  728. package/dist/research/egress.d.ts.map +1 -0
  729. package/dist/research/egress.js +41 -0
  730. package/dist/research/egress.js.map +1 -0
  731. package/dist/research/job-store.d.ts +30 -0
  732. package/dist/research/job-store.d.ts.map +1 -0
  733. package/dist/research/job-store.js +100 -0
  734. package/dist/research/job-store.js.map +1 -0
  735. package/dist/research/model-diversity.d.ts +27 -0
  736. package/dist/research/model-diversity.d.ts.map +1 -0
  737. package/dist/research/model-diversity.js +52 -0
  738. package/dist/research/model-diversity.js.map +1 -0
  739. package/dist/research/note-writer.d.ts +36 -0
  740. package/dist/research/note-writer.d.ts.map +1 -0
  741. package/dist/research/note-writer.js +53 -0
  742. package/dist/research/note-writer.js.map +1 -0
  743. package/dist/research/online-retrieval.d.ts +27 -0
  744. package/dist/research/online-retrieval.d.ts.map +1 -0
  745. package/dist/research/online-retrieval.js +22 -0
  746. package/dist/research/online-retrieval.js.map +1 -0
  747. package/dist/research/runner.d.ts +80 -0
  748. package/dist/research/runner.d.ts.map +1 -0
  749. package/dist/research/runner.js +115 -0
  750. package/dist/research/runner.js.map +1 -0
  751. package/dist/research/scheduler.d.ts +61 -0
  752. package/dist/research/scheduler.d.ts.map +1 -0
  753. package/dist/research/scheduler.js +58 -0
  754. package/dist/research/scheduler.js.map +1 -0
  755. package/dist/research/types.d.ts +81 -0
  756. package/dist/research/types.d.ts.map +1 -0
  757. package/dist/research/types.js +57 -0
  758. package/dist/research/types.js.map +1 -0
  759. package/dist/seo/adapters/http.d.ts +43 -0
  760. package/dist/seo/adapters/http.d.ts.map +1 -0
  761. package/dist/seo/adapters/http.js +35 -0
  762. package/dist/seo/adapters/http.js.map +1 -0
  763. package/dist/seo/ai-visibility-provider.d.ts +171 -0
  764. package/dist/seo/ai-visibility-provider.d.ts.map +1 -0
  765. package/dist/seo/ai-visibility-provider.js +165 -0
  766. package/dist/seo/ai-visibility-provider.js.map +1 -0
  767. package/dist/seo/ai-visibility-scorer.d.ts +43 -0
  768. package/dist/seo/ai-visibility-scorer.d.ts.map +1 -0
  769. package/dist/seo/ai-visibility-scorer.js +102 -0
  770. package/dist/seo/ai-visibility-scorer.js.map +1 -0
  771. package/dist/seo/analyzer.d.ts +58 -0
  772. package/dist/seo/analyzer.d.ts.map +1 -0
  773. package/dist/seo/analyzer.js +265 -0
  774. package/dist/seo/analyzer.js.map +1 -0
  775. package/dist/seo/benchmark/harness.d.ts +56 -0
  776. package/dist/seo/benchmark/harness.d.ts.map +1 -0
  777. package/dist/seo/benchmark/harness.js +172 -0
  778. package/dist/seo/benchmark/harness.js.map +1 -0
  779. package/dist/seo/builder/approved-finding.d.ts +115 -0
  780. package/dist/seo/builder/approved-finding.d.ts.map +1 -0
  781. package/dist/seo/builder/approved-finding.js +145 -0
  782. package/dist/seo/builder/approved-finding.js.map +1 -0
  783. package/dist/seo/builder/build-runner.d.ts +41 -0
  784. package/dist/seo/builder/build-runner.d.ts.map +1 -0
  785. package/dist/seo/builder/build-runner.js +156 -0
  786. package/dist/seo/builder/build-runner.js.map +1 -0
  787. package/dist/seo/builder/draft-generators.d.ts +32 -0
  788. package/dist/seo/builder/draft-generators.d.ts.map +1 -0
  789. package/dist/seo/builder/draft-generators.js +31 -0
  790. package/dist/seo/builder/draft-generators.js.map +1 -0
  791. package/dist/seo/builder/draft-store.d.ts +30 -0
  792. package/dist/seo/builder/draft-store.d.ts.map +1 -0
  793. package/dist/seo/builder/draft-store.js +76 -0
  794. package/dist/seo/builder/draft-store.js.map +1 -0
  795. package/dist/seo/builder/draft-types.d.ts +36 -0
  796. package/dist/seo/builder/draft-types.d.ts.map +1 -0
  797. package/dist/seo/builder/draft-types.js +14 -0
  798. package/dist/seo/builder/draft-types.js.map +1 -0
  799. package/dist/seo/builder/hub-approved-source.d.ts +11 -0
  800. package/dist/seo/builder/hub-approved-source.d.ts.map +1 -0
  801. package/dist/seo/builder/hub-approved-source.js +48 -0
  802. package/dist/seo/builder/hub-approved-source.js.map +1 -0
  803. package/dist/seo/builder/seo-builder.d.ts +72 -0
  804. package/dist/seo/builder/seo-builder.d.ts.map +1 -0
  805. package/dist/seo/builder/seo-builder.js +72 -0
  806. package/dist/seo/builder/seo-builder.js.map +1 -0
  807. package/dist/seo/citation-gate.d.ts +36 -0
  808. package/dist/seo/citation-gate.d.ts.map +1 -0
  809. package/dist/seo/citation-gate.js +59 -0
  810. package/dist/seo/citation-gate.js.map +1 -0
  811. package/dist/seo/command.d.ts +11 -0
  812. package/dist/seo/command.d.ts.map +1 -0
  813. package/dist/seo/command.js +90 -0
  814. package/dist/seo/command.js.map +1 -0
  815. package/dist/seo/content-sanitizer.d.ts +56 -0
  816. package/dist/seo/content-sanitizer.d.ts.map +1 -0
  817. package/dist/seo/content-sanitizer.js +55 -0
  818. package/dist/seo/content-sanitizer.js.map +1 -0
  819. package/dist/seo/crawl-engine.d.ts +35 -0
  820. package/dist/seo/crawl-engine.d.ts.map +1 -0
  821. package/dist/seo/crawl-engine.js +2 -0
  822. package/dist/seo/crawl-engine.js.map +1 -0
  823. package/dist/seo/data-source.d.ts +156 -0
  824. package/dist/seo/data-source.d.ts.map +1 -0
  825. package/dist/seo/data-source.js +2 -0
  826. package/dist/seo/data-source.js.map +1 -0
  827. package/dist/seo/egress.d.ts +39 -0
  828. package/dist/seo/egress.d.ts.map +1 -0
  829. package/dist/seo/egress.js +64 -0
  830. package/dist/seo/egress.js.map +1 -0
  831. package/dist/seo/hub-emitter.d.ts +28 -0
  832. package/dist/seo/hub-emitter.d.ts.map +1 -0
  833. package/dist/seo/hub-emitter.js +95 -0
  834. package/dist/seo/hub-emitter.js.map +1 -0
  835. package/dist/seo/index.d.ts +42 -0
  836. package/dist/seo/index.d.ts.map +1 -0
  837. package/dist/seo/index.js +19 -0
  838. package/dist/seo/index.js.map +1 -0
  839. package/dist/seo/never-encode-filter.d.ts +45 -0
  840. package/dist/seo/never-encode-filter.d.ts.map +1 -0
  841. package/dist/seo/never-encode-filter.js +51 -0
  842. package/dist/seo/never-encode-filter.js.map +1 -0
  843. package/dist/seo/parser.d.ts +46 -0
  844. package/dist/seo/parser.d.ts.map +1 -0
  845. package/dist/seo/parser.js +113 -0
  846. package/dist/seo/parser.js.map +1 -0
  847. package/dist/seo/playbook-index.d.ts +19 -0
  848. package/dist/seo/playbook-index.d.ts.map +1 -0
  849. package/dist/seo/playbook-index.js +74 -0
  850. package/dist/seo/playbook-index.js.map +1 -0
  851. package/dist/seo/quota-governor.d.ts +100 -0
  852. package/dist/seo/quota-governor.d.ts.map +1 -0
  853. package/dist/seo/quota-governor.js +199 -0
  854. package/dist/seo/quota-governor.js.map +1 -0
  855. package/dist/seo/quota-ledger.d.ts +50 -0
  856. package/dist/seo/quota-ledger.d.ts.map +1 -0
  857. package/dist/seo/quota-ledger.js +95 -0
  858. package/dist/seo/quota-ledger.js.map +1 -0
  859. package/dist/seo/report-store.d.ts +30 -0
  860. package/dist/seo/report-store.d.ts.map +1 -0
  861. package/dist/seo/report-store.js +94 -0
  862. package/dist/seo/report-store.js.map +1 -0
  863. package/dist/seo/retriever.d.ts +34 -0
  864. package/dist/seo/retriever.d.ts.map +1 -0
  865. package/dist/seo/retriever.js +95 -0
  866. package/dist/seo/retriever.js.map +1 -0
  867. package/dist/seo/runner.d.ts +108 -0
  868. package/dist/seo/runner.d.ts.map +1 -0
  869. package/dist/seo/runner.js +512 -0
  870. package/dist/seo/runner.js.map +1 -0
  871. package/dist/seo/scrape-throttle.d.ts +84 -0
  872. package/dist/seo/scrape-throttle.d.ts.map +1 -0
  873. package/dist/seo/scrape-throttle.js +149 -0
  874. package/dist/seo/scrape-throttle.js.map +1 -0
  875. package/dist/seo/serp-provider.d.ts +52 -0
  876. package/dist/seo/serp-provider.d.ts.map +1 -0
  877. package/dist/seo/serp-provider.js +17 -0
  878. package/dist/seo/serp-provider.js.map +1 -0
  879. package/dist/seo/sources/ai-visibility-adapter.d.ts +87 -0
  880. package/dist/seo/sources/ai-visibility-adapter.d.ts.map +1 -0
  881. package/dist/seo/sources/ai-visibility-adapter.js +85 -0
  882. package/dist/seo/sources/ai-visibility-adapter.js.map +1 -0
  883. package/dist/seo/sources/api-spine-provider.d.ts +66 -0
  884. package/dist/seo/sources/api-spine-provider.d.ts.map +1 -0
  885. package/dist/seo/sources/api-spine-provider.js +68 -0
  886. package/dist/seo/sources/api-spine-provider.js.map +1 -0
  887. package/dist/seo/sources/citation-verifier.d.ts +95 -0
  888. package/dist/seo/sources/citation-verifier.d.ts.map +1 -0
  889. package/dist/seo/sources/citation-verifier.js +106 -0
  890. package/dist/seo/sources/citation-verifier.js.map +1 -0
  891. package/dist/seo/sources/crawl-source.d.ts +62 -0
  892. package/dist/seo/sources/crawl-source.d.ts.map +1 -0
  893. package/dist/seo/sources/crawl-source.js +87 -0
  894. package/dist/seo/sources/crawl-source.js.map +1 -0
  895. package/dist/seo/sources/damcrawler-crawl-engine.d.ts +151 -0
  896. package/dist/seo/sources/damcrawler-crawl-engine.d.ts.map +1 -0
  897. package/dist/seo/sources/damcrawler-crawl-engine.js +154 -0
  898. package/dist/seo/sources/damcrawler-crawl-engine.js.map +1 -0
  899. package/dist/seo/sources/damcrawler-serp-provider.d.ts +75 -0
  900. package/dist/seo/sources/damcrawler-serp-provider.d.ts.map +1 -0
  901. package/dist/seo/sources/damcrawler-serp-provider.js +60 -0
  902. package/dist/seo/sources/damcrawler-serp-provider.js.map +1 -0
  903. package/dist/seo/sources/dataforseo-adapter.d.ts +46 -0
  904. package/dist/seo/sources/dataforseo-adapter.d.ts.map +1 -0
  905. package/dist/seo/sources/dataforseo-adapter.js +335 -0
  906. package/dist/seo/sources/dataforseo-adapter.js.map +1 -0
  907. package/dist/seo/sources/dataforseo-serp-provider.d.ts +30 -0
  908. package/dist/seo/sources/dataforseo-serp-provider.d.ts.map +1 -0
  909. package/dist/seo/sources/dataforseo-serp-provider.js +20 -0
  910. package/dist/seo/sources/dataforseo-serp-provider.js.map +1 -0
  911. package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts +62 -0
  912. package/dist/seo/sources/engine-scrape-parser-chatgpt.d.ts.map +1 -0
  913. package/dist/seo/sources/engine-scrape-parser-chatgpt.js +72 -0
  914. package/dist/seo/sources/engine-scrape-parser-chatgpt.js.map +1 -0
  915. package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts +10 -0
  916. package/dist/seo/sources/engine-scrape-parser-perplexity.d.ts.map +1 -0
  917. package/dist/seo/sources/engine-scrape-parser-perplexity.js +72 -0
  918. package/dist/seo/sources/engine-scrape-parser-perplexity.js.map +1 -0
  919. package/dist/seo/sources/gsc-adapter.d.ts +64 -0
  920. package/dist/seo/sources/gsc-adapter.d.ts.map +1 -0
  921. package/dist/seo/sources/gsc-adapter.js +221 -0
  922. package/dist/seo/sources/gsc-adapter.js.map +1 -0
  923. package/dist/seo/sources/local-export.d.ts +53 -0
  924. package/dist/seo/sources/local-export.d.ts.map +1 -0
  925. package/dist/seo/sources/local-export.js +307 -0
  926. package/dist/seo/sources/local-export.js.map +1 -0
  927. package/dist/seo/sources/mention-citation-extractor.d.ts +136 -0
  928. package/dist/seo/sources/mention-citation-extractor.d.ts.map +1 -0
  929. package/dist/seo/sources/mention-citation-extractor.js +272 -0
  930. package/dist/seo/sources/mention-citation-extractor.js.map +1 -0
  931. package/dist/seo/sources/scrape-arm-provider.d.ts +109 -0
  932. package/dist/seo/sources/scrape-arm-provider.d.ts.map +1 -0
  933. package/dist/seo/sources/scrape-arm-provider.js +129 -0
  934. package/dist/seo/sources/scrape-arm-provider.js.map +1 -0
  935. package/dist/seo/tracked-prompt-store.d.ts +33 -0
  936. package/dist/seo/tracked-prompt-store.d.ts.map +1 -0
  937. package/dist/seo/tracked-prompt-store.js +68 -0
  938. package/dist/seo/tracked-prompt-store.js.map +1 -0
  939. package/dist/seo/types.d.ts +128 -0
  940. package/dist/seo/types.d.ts.map +1 -0
  941. package/dist/seo/types.js +14 -0
  942. package/dist/seo/types.js.map +1 -0
  943. package/dist/seo/verifier.d.ts +34 -0
  944. package/dist/seo/verifier.d.ts.map +1 -0
  945. package/dist/seo/verifier.js +204 -0
  946. package/dist/seo/verifier.js.map +1 -0
  947. package/dist/seo/workflow-capabilities.d.ts +26 -0
  948. package/dist/seo/workflow-capabilities.d.ts.map +1 -0
  949. package/dist/seo/workflow-capabilities.js +12 -0
  950. package/dist/seo/workflow-capabilities.js.map +1 -0
  951. package/dist/state/facts.d.ts +114 -0
  952. package/dist/state/facts.d.ts.map +1 -0
  953. package/dist/state/facts.js +218 -0
  954. package/dist/state/facts.js.map +1 -0
  955. package/dist/state/guidance.d.ts +37 -0
  956. package/dist/state/guidance.d.ts.map +1 -0
  957. package/dist/state/guidance.js +144 -0
  958. package/dist/state/guidance.js.map +1 -0
  959. package/dist/state/history.d.ts +2 -2
  960. package/dist/state/index.d.ts +2 -2
  961. package/dist/state/index.d.ts.map +1 -1
  962. package/dist/state/index.js +2 -2
  963. package/dist/state/index.js.map +1 -1
  964. package/dist/state/memory.d.ts +43 -11
  965. package/dist/state/memory.d.ts.map +1 -1
  966. package/dist/state/memory.js +93 -15
  967. package/dist/state/memory.js.map +1 -1
  968. package/dist/state/outline-state.d.ts +0 -12
  969. package/dist/state/outline-state.d.ts.map +1 -1
  970. package/dist/state/outline-state.js +1 -18
  971. package/dist/state/outline-state.js.map +1 -1
  972. package/dist/state/pause.d.ts +47 -0
  973. package/dist/state/pause.d.ts.map +1 -0
  974. package/dist/state/pause.js +146 -0
  975. package/dist/state/pause.js.map +1 -0
  976. package/dist/state/security-audit-state.d.ts +20 -0
  977. package/dist/state/security-audit-state.d.ts.map +1 -0
  978. package/dist/state/security-audit-state.js +59 -0
  979. package/dist/state/security-audit-state.js.map +1 -0
  980. package/dist/state/sprint-state.d.ts +8 -0
  981. package/dist/state/sprint-state.d.ts.map +1 -1
  982. package/dist/state/sprint-state.js +32 -1
  983. package/dist/state/sprint-state.js.map +1 -1
  984. package/dist/teams/registry.d.ts +16 -0
  985. package/dist/teams/registry.d.ts.map +1 -0
  986. package/dist/teams/registry.js +70 -0
  987. package/dist/teams/registry.js.map +1 -0
  988. package/dist/teams/types.d.ts +25 -0
  989. package/dist/teams/types.d.ts.map +1 -0
  990. package/dist/teams/types.js +2 -0
  991. package/dist/teams/types.js.map +1 -0
  992. package/dist/telegram/bot.d.ts +137 -0
  993. package/dist/telegram/bot.d.ts.map +1 -0
  994. package/dist/telegram/bot.js +323 -0
  995. package/dist/telegram/bot.js.map +1 -0
  996. package/dist/telegram/digest.d.ts +19 -0
  997. package/dist/telegram/digest.d.ts.map +1 -0
  998. package/dist/telegram/digest.js +23 -0
  999. package/dist/telegram/digest.js.map +1 -0
  1000. package/dist/telegram/fleet-view.d.ts +38 -0
  1001. package/dist/telegram/fleet-view.d.ts.map +1 -0
  1002. package/dist/telegram/fleet-view.js +98 -0
  1003. package/dist/telegram/fleet-view.js.map +1 -0
  1004. package/dist/telegram/handlers/approvals.d.ts +61 -0
  1005. package/dist/telegram/handlers/approvals.d.ts.map +1 -0
  1006. package/dist/telegram/handlers/approvals.js +122 -0
  1007. package/dist/telegram/handlers/approvals.js.map +1 -0
  1008. package/dist/telegram/handlers/capture.d.ts +43 -0
  1009. package/dist/telegram/handlers/capture.d.ts.map +1 -0
  1010. package/dist/telegram/handlers/capture.js +51 -0
  1011. package/dist/telegram/handlers/capture.js.map +1 -0
  1012. package/dist/telegram/handlers/prioritize.d.ts +50 -0
  1013. package/dist/telegram/handlers/prioritize.d.ts.map +1 -0
  1014. package/dist/telegram/handlers/prioritize.js +99 -0
  1015. package/dist/telegram/handlers/prioritize.js.map +1 -0
  1016. package/dist/telegram/handlers/upload.d.ts +105 -0
  1017. package/dist/telegram/handlers/upload.d.ts.map +1 -0
  1018. package/dist/telegram/handlers/upload.js +149 -0
  1019. package/dist/telegram/handlers/upload.js.map +1 -0
  1020. package/dist/telegram/keyboard.d.ts +48 -0
  1021. package/dist/telegram/keyboard.d.ts.map +1 -0
  1022. package/dist/telegram/keyboard.js +81 -0
  1023. package/dist/telegram/keyboard.js.map +1 -0
  1024. package/dist/telegram/outbound.d.ts +77 -0
  1025. package/dist/telegram/outbound.d.ts.map +1 -0
  1026. package/dist/telegram/outbound.js +45 -0
  1027. package/dist/telegram/outbound.js.map +1 -0
  1028. package/dist/telegram/router.d.ts +46 -0
  1029. package/dist/telegram/router.d.ts.map +1 -0
  1030. package/dist/telegram/router.js +63 -0
  1031. package/dist/telegram/router.js.map +1 -0
  1032. package/dist/telegram/streaming.d.ts +36 -0
  1033. package/dist/telegram/streaming.d.ts.map +1 -0
  1034. package/dist/telegram/streaming.js +55 -0
  1035. package/dist/telegram/streaming.js.map +1 -0
  1036. package/dist/telegram/whitelist.d.ts +20 -0
  1037. package/dist/telegram/whitelist.d.ts.map +1 -0
  1038. package/dist/telegram/whitelist.js +34 -0
  1039. package/dist/telegram/whitelist.js.map +1 -0
  1040. package/dist/utils/git.d.ts +0 -6
  1041. package/dist/utils/git.d.ts.map +1 -1
  1042. package/dist/utils/git.js +0 -19
  1043. package/dist/utils/git.js.map +1 -1
  1044. package/dist/utils/index.d.ts +1 -1
  1045. package/dist/utils/index.d.ts.map +1 -1
  1046. package/dist/utils/index.js +1 -1
  1047. package/dist/utils/index.js.map +1 -1
  1048. package/dist/vault/conventions.d.ts +23 -0
  1049. package/dist/vault/conventions.d.ts.map +1 -0
  1050. package/dist/vault/conventions.js +22 -0
  1051. package/dist/vault/conventions.js.map +1 -0
  1052. package/dist/vault/frontmatter.d.ts +47 -0
  1053. package/dist/vault/frontmatter.d.ts.map +1 -0
  1054. package/dist/vault/frontmatter.js +149 -0
  1055. package/dist/vault/frontmatter.js.map +1 -0
  1056. package/dist/vault/index-map.d.ts +35 -0
  1057. package/dist/vault/index-map.d.ts.map +1 -0
  1058. package/dist/vault/index-map.js +67 -0
  1059. package/dist/vault/index-map.js.map +1 -0
  1060. package/dist/vault/mcp-adapter.d.ts +96 -0
  1061. package/dist/vault/mcp-adapter.d.ts.map +1 -0
  1062. package/dist/vault/mcp-adapter.js +176 -0
  1063. package/dist/vault/mcp-adapter.js.map +1 -0
  1064. package/dist/vault/note-io.d.ts +29 -0
  1065. package/dist/vault/note-io.d.ts.map +1 -0
  1066. package/dist/vault/note-io.js +44 -0
  1067. package/dist/vault/note-io.js.map +1 -0
  1068. package/dist/vault/profile.d.ts +35 -0
  1069. package/dist/vault/profile.d.ts.map +1 -0
  1070. package/dist/vault/profile.js +50 -0
  1071. package/dist/vault/profile.js.map +1 -0
  1072. package/dist/vault/reindex.d.ts +55 -0
  1073. package/dist/vault/reindex.d.ts.map +1 -0
  1074. package/dist/vault/reindex.js +69 -0
  1075. package/dist/vault/reindex.js.map +1 -0
  1076. package/dist/vault/types.d.ts +25 -0
  1077. package/dist/vault/types.d.ts.map +1 -0
  1078. package/dist/vault/types.js +9 -0
  1079. package/dist/vault/types.js.map +1 -0
  1080. package/package.json +22 -4
  1081. package/scripts/sync-targets.json +2 -1
  1082. package/skills/bober.design/SKILL.md +190 -0
  1083. package/skills/bober.design/references/1-anti-slop.md +102 -0
  1084. package/skills/bober.design/references/2-design-brief.md +84 -0
  1085. package/skills/bober.design/references/3-critique-rubric.md +62 -0
  1086. package/skills/bober.design/references/4-copy-guide.md +43 -0
  1087. package/skills/bober.plan/SKILL.md +15 -1
  1088. package/skills/bober.run/SKILL.md +7 -4
  1089. package/skills/bober.security-anchor/SKILL.md +172 -0
  1090. package/skills/bober.security-audit/SKILL.md +288 -0
  1091. package/skills/bober.security-dex-backend/SKILL.md +306 -0
  1092. package/skills/bober.security-generic/SKILL.md +295 -0
  1093. package/skills/bober.security-igaming/SKILL.md +290 -0
  1094. package/skills/bober.security-node/SKILL.md +267 -0
  1095. package/skills/bober.security-payments/SKILL.md +249 -0
  1096. package/skills/bober.security-react/SKILL.md +194 -0
  1097. package/skills/bober.security-solidity/SKILL.md +306 -0
  1098. package/skills/bober.seo/SKILL.md +132 -0
  1099. package/skills/bober.seo-ai-visibility/SKILL.md +110 -0
  1100. package/skills/bober.seo-content-decay/SKILL.md +99 -0
  1101. package/skills/bober.seo-generic/SKILL.md +173 -0
  1102. package/skills/bober.seo-internal-linking/SKILL.md +87 -0
  1103. package/skills/bober.seo-parasite-watch/SKILL.md +121 -0
  1104. package/skills/bober.seo-rank-track/SKILL.md +98 -0
  1105. package/skills/bober.seo-schema-audit/SKILL.md +97 -0
  1106. package/skills/bober.seo-technical-audit/SKILL.md +113 -0
  1107. package/skills/bober.seo-topical-map/SKILL.md +100 -0
  1108. package/skills/bober.seo-verticals/SKILL.md +133 -0
  1109. package/skills/bober.using-bober/SKILL.md +1 -0
@@ -0,0 +1,34 @@
1
+ /** GroundingCritic — fail-closed faithfulness+completeness judge for medical synthesis output. */
2
+ import { z } from "zod";
3
+ import type { LLMClient } from "../../providers/types.js";
4
+ import type { Passage } from "./medline-source.js";
5
+ export declare const GROUNDING_PARSE_MAX_RETRIES = 1;
6
+ export declare const GROUNDING_MAX_LLM_CALLS: number;
7
+ export declare const GroundingVerdictSchema: z.ZodObject<{
8
+ verdict: z.ZodEnum<["approve", "reject"]>;
9
+ feedback: z.ZodString;
10
+ }, "strip", z.ZodTypeAny, {
11
+ feedback: string;
12
+ verdict: "approve" | "reject";
13
+ }, {
14
+ feedback: string;
15
+ verdict: "approve" | "reject";
16
+ }>;
17
+ export type GroundingVerdict = z.infer<typeof GroundingVerdictSchema>;
18
+ export type ValidateGroundingResult = {
19
+ ok: true;
20
+ verdict: GroundingVerdict;
21
+ } | {
22
+ ok: false;
23
+ error: string;
24
+ };
25
+ export declare function validateGroundingVerdict(rawText: string): ValidateGroundingResult;
26
+ export declare function buildGroundingSystemPrompt(question: string, answerBody: string, passages: Passage[]): string;
27
+ export declare function getGroundingVerdict(input: {
28
+ llm: LLMClient;
29
+ model: string;
30
+ question: string;
31
+ answerBody: string;
32
+ passages: Passage[];
33
+ }): Promise<GroundingVerdict>;
34
+ //# sourceMappingURL=grounding-critic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grounding-critic.d.ts","sourceRoot":"","sources":["../../../src/medical/retrieval/grounding-critic.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAW,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,uBAAuB,QAAkC,CAAC;AAkBvE,eAAO,MAAM,sBAAsB;;;;;;;;;EAGjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,MAAM,MAAM,uBAAuB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAIjC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAgDjF;AAYD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,EAAE,GAClB,MAAM,CAeR;AAmDD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+B5B"}
@@ -0,0 +1,153 @@
1
+ /** GroundingCritic — fail-closed faithfulness+completeness judge for medical synthesis output. */
2
+ import { z } from "zod";
3
+ // ── Constants ────────────────────────────────────────────────────────
4
+ export const GROUNDING_PARSE_MAX_RETRIES = 1;
5
+ export const GROUNDING_MAX_LLM_CALLS = 1 + GROUNDING_PARSE_MAX_RETRIES;
6
+ // ── Prompts ──────────────────────────────────────────────────────────
7
+ const GROUNDING_COERCION_INSTRUCTION = `Your previous response was not a valid grounding verdict.
8
+ Output ONLY a single JSON object (no prose, no markdown fences, no tool calls) with EXACTLY this shape:
9
+ {
10
+ "verdict": "approve" | "reject",
11
+ "feedback": "<concise feedback; empty string if approving>"
12
+ }
13
+
14
+ Rules:
15
+ - "verdict" must be exactly "approve" or "reject".
16
+ - "feedback" must be a string.
17
+ - Output the JSON object and nothing else.`;
18
+ // ── Schema + types ───────────────────────────────────────────────────
19
+ export const GroundingVerdictSchema = z.object({
20
+ verdict: z.enum(["approve", "reject"]),
21
+ feedback: z.string(),
22
+ });
23
+ // ── validateGroundingVerdict (NEVER throws) ──────────────────────────
24
+ export function validateGroundingVerdict(rawText) {
25
+ let parsed;
26
+ // Try direct parse first
27
+ try {
28
+ parsed = JSON.parse(rawText.trim());
29
+ }
30
+ catch {
31
+ // Try extracting JSON from markdown code fences
32
+ const fenceMatch = /```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/.exec(rawText);
33
+ if (fenceMatch) {
34
+ try {
35
+ parsed = JSON.parse(fenceMatch[1].trim());
36
+ }
37
+ catch {
38
+ // Fall through
39
+ }
40
+ }
41
+ // Try finding the first { ... } block
42
+ if (!parsed) {
43
+ const braceStart = rawText.indexOf("{");
44
+ const braceEnd = rawText.lastIndexOf("}");
45
+ if (braceStart !== -1 && braceEnd > braceStart) {
46
+ try {
47
+ parsed = JSON.parse(rawText.slice(braceStart, braceEnd + 1));
48
+ }
49
+ catch {
50
+ return {
51
+ ok: false,
52
+ error: `No valid JSON object found in response. Raw: ${rawText.slice(0, 200)}`,
53
+ };
54
+ }
55
+ }
56
+ else {
57
+ return {
58
+ ok: false,
59
+ error: `No JSON object found in response. Raw: ${rawText.slice(0, 200)}`,
60
+ };
61
+ }
62
+ }
63
+ }
64
+ const result = GroundingVerdictSchema.safeParse(parsed);
65
+ if (!result.success) {
66
+ const issues = result.error.issues
67
+ .map((i) => ` - ${i.path.join(".")}: ${i.message}`)
68
+ .join("\n");
69
+ return { ok: false, error: issues };
70
+ }
71
+ return { ok: true, verdict: result.data };
72
+ }
73
+ // ── Helpers ──────────────────────────────────────────────────────────
74
+ function formatPassageBlock(passages) {
75
+ return passages
76
+ .map((p, i) => `[${i + 1}] ${p.title}\n${p.text}\nSource: ${p.url}`)
77
+ .join("\n\n");
78
+ }
79
+ // ── buildGroundingSystemPrompt ────────────────────────────────────────
80
+ export function buildGroundingSystemPrompt(question, answerBody, passages) {
81
+ const passageBlock = formatPassageBlock(passages);
82
+ return (`You are an independent reviewer. The answer below was produced by another assistant ` +
83
+ `from ONLY the retrieved passages listed here. ` +
84
+ `Approve ONLY if EVERY claim in the answer is directly supported by a cited passage ` +
85
+ `AND the answer addresses the core of the question. ` +
86
+ `Reject if any claim is unsupported (faithfulness) OR the answer omits the central part ` +
87
+ `of the question (completeness). ` +
88
+ `Output ONLY {"verdict":"approve"|"reject","feedback":"..."}\n\n` +
89
+ `Question: ${question}\n\n` +
90
+ `Answer to review:\n${answerBody}\n\n` +
91
+ `Retrieved passages:\n${passageBlock}`);
92
+ }
93
+ // ── Internal: one grounding-critic call ─────────────────────────────
94
+ async function callGroundingCritic(input) {
95
+ const { llm, model, question, answerBody, passages, priorText, formattedError } = input;
96
+ // Fresh message array — NEVER extends the prior synthesis conversation (LOCK1)
97
+ const firstUserContent = `Review this answer as an independent reviewer.\n\n` +
98
+ `Question: ${question}\n\n` +
99
+ `Answer to review:\n${answerBody}\n\n` +
100
+ `Cited passages:\n${formatPassageBlock(passages)}`;
101
+ let messages;
102
+ if (priorText !== undefined && formattedError !== undefined) {
103
+ // Coercion retry: 3-message shape [user, assistant, user]
104
+ messages = [
105
+ { role: "user", content: firstUserContent },
106
+ { role: "assistant", content: priorText },
107
+ {
108
+ role: "user",
109
+ content: `${GROUNDING_COERCION_INSTRUCTION}\n\nPrevious validation error:\n${formattedError}`,
110
+ },
111
+ ];
112
+ }
113
+ else {
114
+ // First turn: single user message
115
+ messages = [{ role: "user", content: firstUserContent }];
116
+ }
117
+ const response = await llm.chat({
118
+ model,
119
+ system: buildGroundingSystemPrompt(question, answerBody, passages),
120
+ messages,
121
+ jsonObjectMode: true,
122
+ });
123
+ return response.text;
124
+ }
125
+ // ── getGroundingVerdict (FAIL-CLOSED on parse exhaustion) ────────────
126
+ export async function getGroundingVerdict(input) {
127
+ const { llm, model, question, answerBody, passages } = input;
128
+ const maxAttempts = GROUNDING_MAX_LLM_CALLS;
129
+ let lastError = "Unknown error";
130
+ let priorText;
131
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
132
+ const rawText = await callGroundingCritic({
133
+ llm,
134
+ model,
135
+ question,
136
+ answerBody,
137
+ passages,
138
+ priorText: attempt > 0 ? priorText : undefined,
139
+ formattedError: attempt > 0 ? lastError : undefined,
140
+ });
141
+ const validated = validateGroundingVerdict(rawText);
142
+ if (validated.ok) {
143
+ return validated.verdict;
144
+ }
145
+ lastError = validated.error;
146
+ priorText = rawText;
147
+ }
148
+ // FAIL-CLOSED inversion of critic-deep.ts:199-201 (which returns approve on exhaustion).
149
+ // bober: reject on parse exhaustion; this is intentional for medical safety — Sprint 2
150
+ // maps a reject to re-synthesis / abstain rather than letting an unverified answer through.
151
+ return { verdict: "reject", feedback: "<unparseable critic output>" };
152
+ }
153
+ //# sourceMappingURL=grounding-critic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grounding-critic.js","sourceRoot":"","sources":["../../../src/medical/retrieval/grounding-critic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /** LiteratureRetriever — checks the literature-retrieval axis; returns {disabled} sync when off (ADR-6). */
2
+ import type { EgressGuard } from "../egress.js";
3
+ import { MedlineSource, type RetrievalOutcome } from "./medline-source.js";
4
+ import type { LLMClient } from "../../providers/types.js";
5
+ import type { MedicalAnswer, CriticVerdict } from "../types.js";
6
+ /**
7
+ * Orchestrates literature retrieval behind the literature-retrieval egress gate.
8
+ *
9
+ * SYNCHRONOUS short-circuit: if the axis is off, return {disabled} — NO network
10
+ * attempt and NO MedlineSource method is called. This is the zero-egress proof.
11
+ */
12
+ export declare class LiteratureRetriever {
13
+ private readonly egress;
14
+ private readonly source;
15
+ constructor(egress: EgressGuard, source?: MedlineSource);
16
+ /**
17
+ * Retrieve literature passages for the given query.
18
+ *
19
+ * When literature-retrieval is OFF: returns { kind: "disabled" } IMMEDIATELY,
20
+ * before MedlineSource is consulted — guarantees zero outbound bytes.
21
+ *
22
+ * When literature-retrieval is ON: delegates to MedlineSource.fetchPassages.
23
+ * Any throw from the source is caught and maps to abstain{source-error} (belt-and-braces;
24
+ * MedlineSource.fetchPassages itself is already fail-closed).
25
+ */
26
+ retrieve(query: string): Promise<RetrievalOutcome>;
27
+ }
28
+ /** Return type for synthesizeGrounded — widens MedicalAnswer with the critic gate verdict (Sprint 3). */
29
+ export interface GroundedResult {
30
+ answer: MedicalAnswer;
31
+ verdict: CriticVerdict;
32
+ }
33
+ /**
34
+ * synthesize — single LLM call that grounds the answer in retrieved passages.
35
+ *
36
+ * Rules (non-negotiable, enforced here):
37
+ * - disabled/abstain outcome => abstained MedicalAnswer, citations: [], no clinical assertion.
38
+ * - grounded outcome => one llm.chat call; if the model abstains or returns empty => abstained.
39
+ * - Every non-abstained answer carries >= 1 citation derived from the passages.
40
+ * - LLM error (e.g. Ollama unreachable) => abstained + "model unavailable" footer, NO cloud fallback.
41
+ * - Never emits an uncited clinical claim.
42
+ *
43
+ * @param query - The original user question.
44
+ * @param outcome - The RetrievalOutcome from LiteratureRetriever.retrieve.
45
+ * @param llm - Injectable LLMClient (tests pass {chat: vi.fn()}).
46
+ * @param footer - DisclaimerComposer footer string included in every answer.
47
+ * @param model - Model identifier to use for synthesis (default: SYNTHESIS_MODEL).
48
+ */
49
+ export declare function synthesize(query: string, outcome: RetrievalOutcome, llm: LLMClient, footer: string, model?: string): Promise<MedicalAnswer>;
50
+ /**
51
+ * Worst-case LLM call budget for the grounded gate:
52
+ * 1 synth + GROUNDING_MAX_LLM_CALLS critic + 1 re-synth + GROUNDING_MAX_LLM_CALLS re-critic
53
+ * Computed from the imported constant so it tracks future changes to the critic budget.
54
+ */
55
+ export declare const GROUNDED_GATE_MAX_LLM_CALLS: number;
56
+ /**
57
+ * synthesizeGrounded — fail-closed gate: synthesize → critic → one re-synth → abstain.
58
+ *
59
+ * For non-grounded outcomes, delegates to synthesize (disabled/abstain handled there).
60
+ * For grounded outcomes:
61
+ * 1. synthesize → if abstained, return it
62
+ * 2. getGroundingVerdict → if approve, return answer
63
+ * 3. synthesizeWithFeedback (one re-synth with critic feedback)
64
+ * 4. getGroundingVerdict again → if approve, return re-synth answer
65
+ * 5. else → return abstainAnswer (fail-closed)
66
+ *
67
+ * Any thrown error from synthesize or the critic maps to abstainAnswer (fail-closed).
68
+ * Bounded by GROUNDED_GATE_MAX_LLM_CALLS (= 6 worst case today).
69
+ *
70
+ * Returns { answer, verdict } where verdict is one of:
71
+ * 'approve' — gate returned an approved answer
72
+ * 'reject-abstained' — gate abstained after a critic reject (second reject)
73
+ * 'error-abstained' — gate abstained due to a thrown error or model unavailable
74
+ *
75
+ * @param model - Model identifier to use (default: SYNTHESIS_MODEL for back-compat).
76
+ */
77
+ export declare function synthesizeGrounded(query: string, outcome: RetrievalOutcome, llm: LLMClient, footer: string, model?: string): Promise<GroundedResult>;
78
+ //# sourceMappingURL=literature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literature.d.ts","sourceRoot":"","sources":["../../../src/medical/retrieval/literature.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAgB,MAAM,qBAAqB,CAAC;AACzF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAY,aAAa,EAAE,MAAM,aAAa,CAAC;AAK1E;;;;;GAKG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,MAAM,EAAE,WAAW,EACnB,MAAM,gBAA4B;IAGrD;;;;;;;;;OASG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAWzD;AAQD,yGAAyG;AACzG,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;CACxB;AAqCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAwB,GAC9B,OAAO,CAAC,aAAa,CAAC,CA0ExB;AAID;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,QACmB,CAAC;AA0D5D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAwB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAyDzB"}
@@ -0,0 +1,292 @@
1
+ import { MedlineSource } from "./medline-source.js";
2
+ import { getGroundingVerdict, GROUNDING_MAX_LLM_CALLS } from "./grounding-critic.js";
3
+ // ── LiteratureRetriever ──────────────────────────────────────────────
4
+ /**
5
+ * Orchestrates literature retrieval behind the literature-retrieval egress gate.
6
+ *
7
+ * SYNCHRONOUS short-circuit: if the axis is off, return {disabled} — NO network
8
+ * attempt and NO MedlineSource method is called. This is the zero-egress proof.
9
+ */
10
+ export class LiteratureRetriever {
11
+ egress;
12
+ source;
13
+ constructor(egress, source = new MedlineSource(egress)) {
14
+ this.egress = egress;
15
+ this.source = source;
16
+ }
17
+ /**
18
+ * Retrieve literature passages for the given query.
19
+ *
20
+ * When literature-retrieval is OFF: returns { kind: "disabled" } IMMEDIATELY,
21
+ * before MedlineSource is consulted — guarantees zero outbound bytes.
22
+ *
23
+ * When literature-retrieval is ON: delegates to MedlineSource.fetchPassages.
24
+ * Any throw from the source is caught and maps to abstain{source-error} (belt-and-braces;
25
+ * MedlineSource.fetchPassages itself is already fail-closed).
26
+ */
27
+ async retrieve(query) {
28
+ // isAllowed check MUST precede source call — proves zero-egress when axis is off.
29
+ if (!this.egress.isAllowed("literature-retrieval")) {
30
+ return { kind: "disabled" };
31
+ }
32
+ try {
33
+ return await this.source.fetchPassages(query);
34
+ }
35
+ catch {
36
+ return { kind: "abstain", reason: "source-error" };
37
+ }
38
+ }
39
+ }
40
+ // ── synthesize ───────────────────────────────────────────────────────
41
+ const SYNTHESIS_MODEL = "ollama/llama3";
42
+ const SYNTHESIS_MAX_TOKENS = 512;
43
+ /**
44
+ * Build the system prompt that pins the model to the retrieved passages.
45
+ * The model is instructed to reply with exactly "ABSTAIN" if the passages
46
+ * do not support the query — synthesize treats that as an abstain signal.
47
+ */
48
+ function buildSynthesisSystem(passages) {
49
+ const passageBlock = passages
50
+ .map((p, i) => `[${i + 1}] ${p.title}\n${p.text}\nSource: ${p.url}`)
51
+ .join("\n\n");
52
+ return ("You are a medical information assistant. Answer the user's question using ONLY " +
53
+ "the following retrieved passages from MedlinePlus. " +
54
+ "If the passages do not contain information that supports a specific answer, " +
55
+ "reply with exactly the single word: ABSTAIN\n\n" +
56
+ "Retrieved passages:\n" +
57
+ passageBlock);
58
+ }
59
+ /**
60
+ * Derive citations from grounded passages that were actually used in synthesis.
61
+ * For simplicity (all passages are pinned in the system prompt), all passages
62
+ * become citations when the model produces a non-abstained answer.
63
+ * This ensures citations.length >= 1 for every non-abstained answer.
64
+ */
65
+ function passagesToCitations(passages) {
66
+ return passages.map((p) => ({
67
+ title: p.title,
68
+ url: p.url,
69
+ source: "medlineplus",
70
+ }));
71
+ }
72
+ /**
73
+ * synthesize — single LLM call that grounds the answer in retrieved passages.
74
+ *
75
+ * Rules (non-negotiable, enforced here):
76
+ * - disabled/abstain outcome => abstained MedicalAnswer, citations: [], no clinical assertion.
77
+ * - grounded outcome => one llm.chat call; if the model abstains or returns empty => abstained.
78
+ * - Every non-abstained answer carries >= 1 citation derived from the passages.
79
+ * - LLM error (e.g. Ollama unreachable) => abstained + "model unavailable" footer, NO cloud fallback.
80
+ * - Never emits an uncited clinical claim.
81
+ *
82
+ * @param query - The original user question.
83
+ * @param outcome - The RetrievalOutcome from LiteratureRetriever.retrieve.
84
+ * @param llm - Injectable LLMClient (tests pass {chat: vi.fn()}).
85
+ * @param footer - DisclaimerComposer footer string included in every answer.
86
+ * @param model - Model identifier to use for synthesis (default: SYNTHESIS_MODEL).
87
+ */
88
+ export async function synthesize(query, outcome, llm, footer, model = SYNTHESIS_MODEL) {
89
+ // ── Abstain immediately on disabled / no-passages ────────────────
90
+ if (outcome.kind === "disabled" || outcome.kind === "abstain") {
91
+ return {
92
+ body: "I cannot ground an answer in retrieved literature. " +
93
+ "For evidence-based guidance, please consult a licensed healthcare professional.",
94
+ abstained: true,
95
+ citations: [],
96
+ disclaimerFooter: footer,
97
+ shortCircuit: false,
98
+ };
99
+ }
100
+ // outcome.kind === "grounded"
101
+ const passages = outcome.passages;
102
+ if (passages.length === 0) {
103
+ return {
104
+ body: "No supporting passages were retrieved. " +
105
+ "For evidence-based guidance, please consult a licensed healthcare professional.",
106
+ abstained: true,
107
+ citations: [],
108
+ disclaimerFooter: footer,
109
+ shortCircuit: false,
110
+ };
111
+ }
112
+ // ── Single LLM call ──────────────────────────────────────────────
113
+ let responseText;
114
+ try {
115
+ const response = await llm.chat({
116
+ model,
117
+ system: buildSynthesisSystem(passages),
118
+ messages: [{ role: "user", content: query }],
119
+ maxTokens: SYNTHESIS_MAX_TOKENS,
120
+ });
121
+ responseText = response.text.trim();
122
+ }
123
+ catch {
124
+ // Local model unavailable — abstain, NO cloud fallback.
125
+ return {
126
+ body: "I cannot ground an answer at this time (model unavailable). " +
127
+ "For evidence-based guidance, please consult a licensed healthcare professional.",
128
+ abstained: true,
129
+ citations: [],
130
+ disclaimerFooter: footer,
131
+ shortCircuit: false,
132
+ };
133
+ }
134
+ // ── Abstain if the model said so or returned empty ───────────────
135
+ if (!responseText || responseText.toUpperCase() === "ABSTAIN") {
136
+ return {
137
+ body: "The retrieved passages do not sufficiently support a specific answer to your question. " +
138
+ "For evidence-based guidance, please consult a licensed healthcare professional.",
139
+ abstained: true,
140
+ citations: [],
141
+ disclaimerFooter: footer,
142
+ shortCircuit: false,
143
+ };
144
+ }
145
+ // ── Non-abstained: attach citations (>= 1 guaranteed by passages.length > 0) ─
146
+ const citations = passagesToCitations(passages);
147
+ return {
148
+ body: responseText,
149
+ abstained: false,
150
+ citations,
151
+ disclaimerFooter: footer,
152
+ shortCircuit: false,
153
+ };
154
+ }
155
+ // ── synthesizeGrounded ────────────────────────────────────────────────
156
+ /**
157
+ * Worst-case LLM call budget for the grounded gate:
158
+ * 1 synth + GROUNDING_MAX_LLM_CALLS critic + 1 re-synth + GROUNDING_MAX_LLM_CALLS re-critic
159
+ * Computed from the imported constant so it tracks future changes to the critic budget.
160
+ */
161
+ export const GROUNDED_GATE_MAX_LLM_CALLS = 1 + GROUNDING_MAX_LLM_CALLS + 1 + GROUNDING_MAX_LLM_CALLS; // = 6 today (1+2+1+2)
162
+ /**
163
+ * Canned abstain answer used throughout the gate when the answer cannot be
164
+ * sufficiently grounded in the retrieved literature.
165
+ */
166
+ function abstainAnswer(footer) {
167
+ return {
168
+ body: "I cannot provide a sufficiently-supported answer grounded in the retrieved literature. " +
169
+ "For evidence-based guidance, please consult a licensed healthcare professional.",
170
+ abstained: true,
171
+ citations: [],
172
+ disclaimerFooter: footer,
173
+ shortCircuit: false,
174
+ };
175
+ }
176
+ /**
177
+ * Re-synthesize with critic feedback appended to the system prompt.
178
+ * A near-copy of the grounded branch inside synthesize, with one extra instruction line.
179
+ * Module-private — only synthesizeGrounded calls this.
180
+ */
181
+ async function synthesizeWithFeedback(query, outcome, llm, footer, feedback, model = SYNTHESIS_MODEL) {
182
+ const passages = outcome.passages;
183
+ if (passages.length === 0)
184
+ return abstainAnswer(footer); // mirrors synthesize:120-130
185
+ const system = buildSynthesisSystem(passages) +
186
+ `\n\nAddress this reviewer feedback while staying grounded ONLY in the passages: ${feedback}`;
187
+ let responseText;
188
+ try {
189
+ const response = await llm.chat({
190
+ model,
191
+ system,
192
+ messages: [{ role: "user", content: query }],
193
+ maxTokens: SYNTHESIS_MAX_TOKENS,
194
+ });
195
+ responseText = response.text.trim();
196
+ }
197
+ catch {
198
+ return abstainAnswer(footer);
199
+ }
200
+ if (!responseText || responseText.toUpperCase() === "ABSTAIN")
201
+ return abstainAnswer(footer);
202
+ return {
203
+ body: responseText,
204
+ abstained: false,
205
+ citations: passagesToCitations(passages),
206
+ disclaimerFooter: footer,
207
+ shortCircuit: false,
208
+ };
209
+ }
210
+ /**
211
+ * synthesizeGrounded — fail-closed gate: synthesize → critic → one re-synth → abstain.
212
+ *
213
+ * For non-grounded outcomes, delegates to synthesize (disabled/abstain handled there).
214
+ * For grounded outcomes:
215
+ * 1. synthesize → if abstained, return it
216
+ * 2. getGroundingVerdict → if approve, return answer
217
+ * 3. synthesizeWithFeedback (one re-synth with critic feedback)
218
+ * 4. getGroundingVerdict again → if approve, return re-synth answer
219
+ * 5. else → return abstainAnswer (fail-closed)
220
+ *
221
+ * Any thrown error from synthesize or the critic maps to abstainAnswer (fail-closed).
222
+ * Bounded by GROUNDED_GATE_MAX_LLM_CALLS (= 6 worst case today).
223
+ *
224
+ * Returns { answer, verdict } where verdict is one of:
225
+ * 'approve' — gate returned an approved answer
226
+ * 'reject-abstained' — gate abstained after a critic reject (second reject)
227
+ * 'error-abstained' — gate abstained due to a thrown error or model unavailable
228
+ *
229
+ * @param model - Model identifier to use (default: SYNTHESIS_MODEL for back-compat).
230
+ */
231
+ export async function synthesizeGrounded(query, outcome, llm, footer, model = SYNTHESIS_MODEL) {
232
+ // Non-grounded outcomes are already handled by synthesize (disabled/abstain → abstained).
233
+ if (outcome.kind !== "grounded") {
234
+ const answer = await synthesize(query, outcome, llm, footer, model);
235
+ return { answer, verdict: "error-abstained" };
236
+ }
237
+ // 1) First synthesis.
238
+ let answer;
239
+ try {
240
+ answer = await synthesize(query, outcome, llm, footer, model);
241
+ }
242
+ catch {
243
+ return { answer: abstainAnswer(footer), verdict: "error-abstained" };
244
+ }
245
+ if (answer.abstained)
246
+ return { answer, verdict: "error-abstained" }; // synthesize abstained (empty/ABSTAIN/no-passages/model-unavailable)
247
+ // 2) First critique. getGroundingVerdict PROPAGATES transport errors → wrap.
248
+ let verdict;
249
+ try {
250
+ verdict = await getGroundingVerdict({
251
+ llm,
252
+ model,
253
+ question: query,
254
+ answerBody: answer.body,
255
+ passages: outcome.passages,
256
+ });
257
+ }
258
+ catch {
259
+ return { answer: abstainAnswer(footer), verdict: "error-abstained" };
260
+ }
261
+ if (verdict.verdict === "approve")
262
+ return { answer, verdict: "approve" };
263
+ // 3) ONE re-synthesis with critic feedback appended to the system prompt.
264
+ let answer2;
265
+ try {
266
+ answer2 = await synthesizeWithFeedback(query, outcome, llm, footer, verdict.feedback, model);
267
+ }
268
+ catch {
269
+ return { answer: abstainAnswer(footer), verdict: "error-abstained" };
270
+ }
271
+ if (answer2.abstained)
272
+ return { answer: answer2, verdict: "error-abstained" };
273
+ // 4) Re-critique.
274
+ let verdict2;
275
+ try {
276
+ verdict2 = await getGroundingVerdict({
277
+ llm,
278
+ model,
279
+ question: query,
280
+ answerBody: answer2.body,
281
+ passages: outcome.passages,
282
+ });
283
+ }
284
+ catch {
285
+ return { answer: abstainAnswer(footer), verdict: "error-abstained" };
286
+ }
287
+ // Approved on re-critique => 'approve'. Not approved => 'reject-abstained' (critic ran and rejected).
288
+ return verdict2.verdict === "approve"
289
+ ? { answer: answer2, verdict: "approve" }
290
+ : { answer: abstainAnswer(footer), verdict: "reject-abstained" };
291
+ }
292
+ //# sourceMappingURL=literature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literature.js","sourceRoot":"","sources":["../../../src/medical/retrieval/literature.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /** MedlineSource — the ONLY medical file allowed network imports (ADR-6 exception). S7 adds the real call. */
2
+ import type { EgressGuard } from "../egress.js";
3
+ /**
4
+ * A single retrieved passage from MedlinePlus.
5
+ * title + url form the citation; text is the passage body for synthesis grounding.
6
+ */
7
+ export interface Passage {
8
+ title: string;
9
+ url: string;
10
+ text: string;
11
+ source: "medlineplus";
12
+ }
13
+ /**
14
+ * Discriminated union for retrieval outcomes.
15
+ * disabled — the egress axis is off; no attempt was made.
16
+ * abstain — the axis is on but the source could not produce passages (error or empty).
17
+ * grounded — passages retrieved from MedlinePlus (Sprint 7).
18
+ */
19
+ export type RetrievalOutcome = {
20
+ kind: "disabled";
21
+ } | {
22
+ kind: "abstain";
23
+ reason: string;
24
+ } | {
25
+ kind: "grounded";
26
+ passages: Passage[];
27
+ };
28
+ /**
29
+ * Injectable transport type — a minimal fetch-like function.
30
+ * Tests pass a fake returning recorded fixture data; production defaults to the global fetch.
31
+ * Using a plain duck-typed return rather than the global Response to stay testable
32
+ * without the global fetch in test files (global fetch is banned in other medical files).
33
+ * No AbortSignal in the signature — tests inject synchronous fakes that don't need it.
34
+ */
35
+ export type FetchLike = (url: string) => Promise<{
36
+ ok: boolean;
37
+ status: number;
38
+ json(): Promise<unknown>;
39
+ }>;
40
+ /**
41
+ * MedlinePlus retrieval source.
42
+ *
43
+ * This is the ONE file the ESLint no-restricted-imports exception permits to hold
44
+ * network imports (src/medical/retrieval/medline-source.ts — ADR-6).
45
+ *
46
+ * assertAllowed("literature-retrieval") is called BEFORE any fetch attempt — this
47
+ * is the runtime defense-in-depth that backs the static ESLint boundary.
48
+ *
49
+ * The injectable fetchImpl transport means tests NEVER reach the live MedlinePlus
50
+ * endpoint — they pass a fake FetchLike returning committed fixture data.
51
+ *
52
+ * bober: single source (MedlinePlus/NIH, no-auth); add PubMed in a future sprint
53
+ * if multi-source support is needed — keep each source in its own file.
54
+ */
55
+ export declare class MedlineSource {
56
+ private readonly egress;
57
+ private readonly fetchImpl;
58
+ constructor(egress: EgressGuard, fetchImpl?: FetchLike);
59
+ /**
60
+ * Fetch passages from MedlinePlus for the given query.
61
+ *
62
+ * Order:
63
+ * 1. assertAllowed — throws (and is caught below) if the axis is off.
64
+ * 2. fetchImpl(url) — injectable transport; default = global fetch.
65
+ * 3. Parse response into Passage[].
66
+ * 4. Return grounded | abstain{no-passages} | abstain{source-error}.
67
+ *
68
+ * NEVER throws out of this method — all errors map to abstain{source-error}.
69
+ */
70
+ fetchPassages(query: string): Promise<RetrievalOutcome>;
71
+ }
72
+ //# sourceMappingURL=medline-source.d.ts.map