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,109 @@
1
+ /**
2
+ * Recommendation context assembler — reads meds/supplements from FactStore
3
+ * and conditions/allergies/goals from the medical profile reader.
4
+ *
5
+ * NO network / NO LLM. All fs uses node:fs/promises (principles).
6
+ *
7
+ * FactStore lifecycle: injected store (tests) — caller owns; else open and close in finally.
8
+ * Profile: wrapped in try/catch — degraded but functional when SOPS is unavailable or file absent.
9
+ *
10
+ * Most similar: src/medical/analysis/review-pass.ts (open-store / try / finally-close / inject-store).
11
+ * supplement predicate is "dose" (not "takes-supplement") — see supplements.ts:106-121.
12
+ */
13
+ import { join } from "node:path";
14
+ import { FactStore, factsDbPath } from "../../state/facts.js";
15
+ import { readProfile } from "../profile.js";
16
+ // -- Public API ----------------------------------------------------------
17
+ /**
18
+ * Assemble the recommendation context from FactStore and the medical profile.
19
+ *
20
+ * Meds: scope="medical", subject="patient", predicate="takes-medication".
21
+ * Supplements: scope="medical", predicate="dose" (subject = supplement name).
22
+ * Profile: conditions/allergies/goals from profile.yaml; defaults to [] on any error.
23
+ */
24
+ export async function assembleRecommendationContext(projectRoot, _config, opts, deps = {}) {
25
+ // -- Meds + supplements from FactStore --------------------------------
26
+ let meds = [];
27
+ let supplements = [];
28
+ if (deps.facts !== undefined) {
29
+ // Injected store (tests) — caller owns lifecycle; do NOT close
30
+ meds = deps.facts.getActiveFacts("medical", "patient", "takes-medication");
31
+ // PITFALL: supplements use predicate="dose" with subject=supplement name (supplements.ts:106-121)
32
+ const supplementFacts = deps.facts.getActiveFacts("medical", undefined, "dose");
33
+ supplements = supplementFacts.map((r) => ({ name: r.subject, dose: r.value }));
34
+ }
35
+ else {
36
+ // Production: open our own store; close in finally
37
+ const dbPath = factsDbPath(projectRoot, "medical");
38
+ let facts;
39
+ try {
40
+ facts = new FactStore(dbPath);
41
+ meds = facts.getActiveFacts("medical", "patient", "takes-medication");
42
+ const supplementFacts = facts.getActiveFacts("medical", undefined, "dose");
43
+ supplements = supplementFacts.map((r) => ({ name: r.subject, dose: r.value }));
44
+ }
45
+ catch {
46
+ // Dir not created yet → graceful empty (mirrors engine.ts:365-381)
47
+ // meds and supplements are already [] from initialization — nothing to reassign
48
+ }
49
+ finally {
50
+ facts?.close();
51
+ }
52
+ }
53
+ // -- Profile: conditions / allergies / goals --------------------------
54
+ let conditions = [];
55
+ let allergies = [];
56
+ let profileGoals = [];
57
+ // profile.yaml lives at <projectRoot>/.bober/medical (not in vaultDir)
58
+ const profileDir = join(projectRoot, ".bober", "medical");
59
+ try {
60
+ const profile = await readProfile(profileDir, { cipher: deps.profileCipher });
61
+ conditions = profile.conditions;
62
+ allergies = profile.allergies;
63
+ profileGoals = profile.goals;
64
+ }
65
+ catch {
66
+ // SOPS unavailable or profile file absent — degraded but functional (contract assumption 1)
67
+ // conditions, allergies, profileGoals are already [] from initialization — nothing to reassign
68
+ }
69
+ // Explicit goal wins; fall back to first profile goal
70
+ const goal = opts.goal ?? (profileGoals.length > 0 ? profileGoals[0] : undefined);
71
+ return { meds, supplements, conditions, allergies, goal };
72
+ }
73
+ // -- Context serializer --------------------------------------------------
74
+ /**
75
+ * Serialize a RecommendationContext to a plain string for runJudgeLoop.
76
+ * runJudgeLoop.context must be a STRING — this bridges the object to that contract.
77
+ */
78
+ export function contextToString(ctx) {
79
+ const parts = [];
80
+ if (ctx.meds.length > 0) {
81
+ parts.push(`Medications: ${ctx.meds.map((m) => m.value).join(", ")}`);
82
+ }
83
+ else {
84
+ parts.push("Medications: none");
85
+ }
86
+ if (ctx.supplements.length > 0) {
87
+ parts.push(`Supplements: ${ctx.supplements.map((s) => `${s.name} (${s.dose})`).join(", ")}`);
88
+ }
89
+ else {
90
+ parts.push("Supplements: none");
91
+ }
92
+ if (ctx.conditions.length > 0) {
93
+ parts.push(`Conditions: ${ctx.conditions.join(", ")}`);
94
+ }
95
+ else {
96
+ parts.push("Conditions: none");
97
+ }
98
+ if (ctx.allergies.length > 0) {
99
+ parts.push(`Allergies: ${ctx.allergies.join(", ")}`);
100
+ }
101
+ else {
102
+ parts.push("Allergies: none");
103
+ }
104
+ if (ctx.goal !== undefined) {
105
+ parts.push(`Goal: ${ctx.goal}`);
106
+ }
107
+ return parts.join("\n");
108
+ }
109
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/medical/recommend/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Judge panel loop for medical recommendation candidates.
3
+ *
4
+ * PURE orchestration over injected fns — NO fs / NO network / NO real provider / NO FactStore.
5
+ *
6
+ * Regenerate-on-reject loop structure adapted from runCritiqueLoop (src/fleet/critic-deep.ts:211-278),
7
+ * with the accept-best / fail-open tail REPLACED by fail-closed (mirror grounding-critic.ts:203-206).
8
+ *
9
+ * FAIL-CLOSED INVERSION: see getLensVerdict (lenses.ts) and the constant comment below.
10
+ * Red-flag guard fires FIRST — generateCandidate is NEVER called when the guard short-circuits.
11
+ */
12
+ import type { GuardrailSet } from "../types.js";
13
+ import { type LensClients, type LensName, type LensVerdict, type PanelDecision, type PanelOutcome } from "./types.js";
14
+ /**
15
+ * Reconciles four lens verdicts into a panel decision.
16
+ *
17
+ * CRITICAL ORDERING:
18
+ * 1. Veto check FIRST — any veto:true from contraindication-checker forces accepted:false
19
+ * with reason:'contraindication-veto' REGARDLESS of the approve count. A veto can NEVER
20
+ * be overridden by a vote majority under any code path (NonGoal #4).
21
+ * 2. Strict majority — approveCount > rejectCount. A tie (2 approve / 2 reject) resolves
22
+ * to accepted:false (fail-closed per lens-panel.md:80-84).
23
+ */
24
+ export declare function reconcilePanel(verdicts: Record<LensName, LensVerdict>): PanelDecision;
25
+ /**
26
+ * Runs the full multi-lens judge loop for a medical recommendation candidate.
27
+ *
28
+ * Execution order:
29
+ * (1) Red-flag guard first — returns short-circuit/refuse BEFORE calling generateCandidate.
30
+ * (2) For each round up to maxRounds: generate a candidate, run all four lenses, reconcile.
31
+ * (3) On accept: return accepted outcome immediately.
32
+ * (4) On reject: regenerate with collected dissent feedback for the next round.
33
+ * (5) After maxRounds without consensus: return rejected outcome (fail-closed).
34
+ *
35
+ * NEVER throws — a thrown lens client is caught and counted as a reject verdict (fail-closed).
36
+ * NEVER exceeds MEDICAL_PANEL_MAX_TOTAL_CALLS.
37
+ *
38
+ * FAIL-CLOSED INVERSION: mirrors grounding-critic.ts:203-206, NOT critic-deep.ts:199-201.
39
+ */
40
+ export declare function runJudgeLoop(input: {
41
+ question: string;
42
+ generateCandidate: (prevFeedback?: string) => Promise<string>;
43
+ lensClients: LensClients;
44
+ context: string;
45
+ redFlag: GuardrailSet;
46
+ maxRounds?: number;
47
+ now?: string;
48
+ }): Promise<PanelOutcome>;
49
+ //# sourceMappingURL=judge-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge-panel.d.ts","sourceRoot":"","sources":["../../../src/medical/recommend/judge-panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,QAAQ,EAEb,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AAWpB;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,aAAa,CAgBrF;AAeD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,YAAY,CAAC,CAwIxB"}
@@ -0,0 +1,164 @@
1
+ import { MEDICAL_PANEL_MAX_ROUNDS, } from "./types.js";
2
+ import { getLensVerdict, buildEvidenceGraderSystemPrompt, buildContraindicationCheckerSystemPrompt, buildConservativeCliniciansSystemPrompt, buildOptimizationLensSystemPrompt, } from "./lenses.js";
3
+ // ── reconcilePanel ────────────────────────────────────────────────────
4
+ /**
5
+ * Reconciles four lens verdicts into a panel decision.
6
+ *
7
+ * CRITICAL ORDERING:
8
+ * 1. Veto check FIRST — any veto:true from contraindication-checker forces accepted:false
9
+ * with reason:'contraindication-veto' REGARDLESS of the approve count. A veto can NEVER
10
+ * be overridden by a vote majority under any code path (NonGoal #4).
11
+ * 2. Strict majority — approveCount > rejectCount. A tie (2 approve / 2 reject) resolves
12
+ * to accepted:false (fail-closed per lens-panel.md:80-84).
13
+ */
14
+ export function reconcilePanel(verdicts) {
15
+ // Step 1: absolute contraindication veto (checked BEFORE the vote count)
16
+ if (verdicts["contraindication-checker"].veto === true) {
17
+ return { accepted: false, reason: "contraindication-veto" };
18
+ }
19
+ // Step 2: strict majority (fail-closed on tie)
20
+ const all = Object.values(verdicts);
21
+ const approveCount = all.filter((v) => v.verdict === "approve").length;
22
+ const rejectCount = all.filter((v) => v.verdict === "reject").length;
23
+ if (approveCount > rejectCount) {
24
+ return { accepted: true };
25
+ }
26
+ return { accepted: false, reason: "no-consensus" };
27
+ }
28
+ // ── Internal: run one lens with throw-catching ────────────────────────
29
+ async function runLens(spec, systemPrompt, userContent) {
30
+ const llm = spec.client;
31
+ return getLensVerdict({ llm, model: spec.model, systemPrompt, userContent });
32
+ }
33
+ // ── runJudgeLoop ──────────────────────────────────────────────────────
34
+ /**
35
+ * Runs the full multi-lens judge loop for a medical recommendation candidate.
36
+ *
37
+ * Execution order:
38
+ * (1) Red-flag guard first — returns short-circuit/refuse BEFORE calling generateCandidate.
39
+ * (2) For each round up to maxRounds: generate a candidate, run all four lenses, reconcile.
40
+ * (3) On accept: return accepted outcome immediately.
41
+ * (4) On reject: regenerate with collected dissent feedback for the next round.
42
+ * (5) After maxRounds without consensus: return rejected outcome (fail-closed).
43
+ *
44
+ * NEVER throws — a thrown lens client is caught and counted as a reject verdict (fail-closed).
45
+ * NEVER exceeds MEDICAL_PANEL_MAX_TOTAL_CALLS.
46
+ *
47
+ * FAIL-CLOSED INVERSION: mirrors grounding-critic.ts:203-206, NOT critic-deep.ts:199-201.
48
+ */
49
+ export async function runJudgeLoop(input) {
50
+ const { question, generateCandidate, lensClients, context, redFlag, maxRounds = MEDICAL_PANEL_MAX_ROUNDS, } = input;
51
+ // Step 1: Red-flag guard FIRST — generateCandidate is never called for short-circuit / refuse.
52
+ // Matches behaviour of MedicalGuardrails.evaluate (guardrails.ts:84-111).
53
+ const guardCtx = {};
54
+ const guardVerdict = redFlag.evaluate(question, guardCtx);
55
+ if (guardVerdict.kind === "short-circuit") {
56
+ return {
57
+ outcome: "short-circuit",
58
+ rule: guardVerdict.rule,
59
+ cannedResponse: guardVerdict.cannedResponse,
60
+ };
61
+ }
62
+ if (guardVerdict.kind === "refuse") {
63
+ return {
64
+ outcome: "refuse",
65
+ rule: guardVerdict.rule,
66
+ reason: guardVerdict.reason,
67
+ };
68
+ }
69
+ // Step 2: Regenerate-on-reject loop (structure from critic-deep.ts:211-278, fail-open REPLACED)
70
+ let prevFeedback;
71
+ let lastVerdicts;
72
+ let lastDecision;
73
+ for (let round = 1; round <= maxRounds; round++) {
74
+ // Generate a candidate (counted in MEDICAL_PANEL_MAX_TOTAL_CALLS budget)
75
+ const candidate = await generateCandidate(prevFeedback);
76
+ // Build user content for lens calls
77
+ const userContent = `Patient question: ${question}\n\n` +
78
+ `Proposed recommendation:\n${candidate}\n\n` +
79
+ `Profile context: ${context}`;
80
+ // Run all four lenses — each wrapped in try/catch; a throw counts as reject (fail-closed)
81
+ const lensEntries = [
82
+ {
83
+ name: "evidence-grader",
84
+ spec: lensClients.evidenceGrader,
85
+ systemPrompt: buildEvidenceGraderSystemPrompt(question, context),
86
+ },
87
+ {
88
+ name: "contraindication-checker",
89
+ spec: lensClients.contraindicationChecker,
90
+ systemPrompt: buildContraindicationCheckerSystemPrompt(question, context),
91
+ },
92
+ {
93
+ name: "conservative-clinician",
94
+ spec: lensClients.conservativeClinician,
95
+ systemPrompt: buildConservativeCliniciansSystemPrompt(question, context),
96
+ },
97
+ {
98
+ name: "optimization-lens",
99
+ spec: lensClients.optimizationLens,
100
+ systemPrompt: buildOptimizationLensSystemPrompt(question, context),
101
+ },
102
+ ];
103
+ const verdicts = {};
104
+ for (const lens of lensEntries) {
105
+ try {
106
+ const verdict = await runLens(lens.spec, lens.systemPrompt, userContent);
107
+ verdicts[lens.name] = verdict;
108
+ }
109
+ catch {
110
+ // Transport failure — count as reject (fail-closed), never propagate (sc-2-7)
111
+ // FAIL-CLOSED inversion of critic-deep.ts:237-244 (which breaks to accept-best on throw).
112
+ // bober: map lens throw to reject; intentional for medical safety.
113
+ verdicts[lens.name] = {
114
+ verdict: "reject",
115
+ feedback: "<lens client threw; counted as reject for medical safety>",
116
+ veto: false,
117
+ };
118
+ }
119
+ }
120
+ const typedVerdicts = verdicts;
121
+ // Reconcile the panel
122
+ const decision = reconcilePanel(typedVerdicts);
123
+ lastVerdicts = typedVerdicts;
124
+ lastDecision = decision;
125
+ if (decision.accepted) {
126
+ // Step 3: Accept — return immediately (sc-2-2)
127
+ return {
128
+ outcome: "accepted",
129
+ accepted: true,
130
+ recommendation: candidate,
131
+ verdicts: typedVerdicts,
132
+ rounds: round,
133
+ };
134
+ }
135
+ // Step 4: Reject — fold dissent feedback for next round
136
+ const dissentParts = [];
137
+ for (const [name, verdict] of Object.entries(typedVerdicts)) {
138
+ if (verdict.feedback) {
139
+ dissentParts.push(`[${name}] ${verdict.feedback}`);
140
+ }
141
+ }
142
+ prevFeedback = dissentParts.join("; ");
143
+ }
144
+ // Step 5: Post-loop — fail-closed after maxRounds (sc-2-6)
145
+ // FAIL-CLOSED inversion of critic-deep.ts:274-277 (which accept-best on exhaustion).
146
+ // Mirrors grounding-critic.ts:203-206: reject on exhaustion; intentional for medical safety.
147
+ // bober: fail-closed after maxRounds; no candidate surfaced; dissent captured.
148
+ const finalVerdicts = lastVerdicts ?? {};
149
+ const dissent = {
150
+ "evidence-grader": finalVerdicts["evidence-grader"]?.feedback ?? "",
151
+ "contraindication-checker": finalVerdicts["contraindication-checker"]?.feedback ?? "",
152
+ "conservative-clinician": finalVerdicts["conservative-clinician"]?.feedback ?? "",
153
+ "optimization-lens": finalVerdicts["optimization-lens"]?.feedback ?? "",
154
+ };
155
+ return {
156
+ outcome: "rejected",
157
+ accepted: false,
158
+ reason: lastDecision?.reason ?? "no-consensus",
159
+ dissent,
160
+ verdicts: finalVerdicts,
161
+ rounds: maxRounds,
162
+ };
163
+ }
164
+ //# sourceMappingURL=judge-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge-panel.js","sourceRoot":"","sources":["../../../src/medical/recommend/judge-panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Four lens adapters for the recommendation judge panel.
3
+ *
4
+ * PURE orchestration over injected fns — NO fs / NO network / NO real provider / NO FactStore.
5
+ *
6
+ * Each lens calls its injected LLMClient and validates the response with a NEVER-THROWING
7
+ * parser that mirrors validateGroundingVerdict (src/medical/retrieval/grounding-critic.ts:40-88).
8
+ *
9
+ * On parse exhaustion a lens verdict is REJECT (fail-closed), inverting the fleet fail-open
10
+ * tail at src/fleet/critic-deep.ts:206 — see getGroundingVerdict at grounding-critic.ts:203-206.
11
+ */
12
+ import { z } from "zod";
13
+ import type { LLMClient } from "../../providers/types.js";
14
+ import type { LensVerdict } from "./types.js";
15
+ /**
16
+ * Schema for the raw lens verdict.
17
+ * Mirrors GroundingVerdictSchema (grounding-critic.ts:27-30) with optional veto field.
18
+ * Only the contraindication-checker schema actually validates veto:boolean.
19
+ */
20
+ export declare const LensVerdictSchema: z.ZodObject<{
21
+ verdict: z.ZodEnum<["approve", "reject"]>;
22
+ feedback: z.ZodString;
23
+ veto: z.ZodOptional<z.ZodBoolean>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ feedback: string;
26
+ verdict: "approve" | "reject";
27
+ veto?: boolean | undefined;
28
+ }, {
29
+ feedback: string;
30
+ verdict: "approve" | "reject";
31
+ veto?: boolean | undefined;
32
+ }>;
33
+ export type ValidateLensResult = {
34
+ ok: true;
35
+ verdict: LensVerdict;
36
+ } | {
37
+ ok: false;
38
+ error: string;
39
+ };
40
+ /**
41
+ * Four-tier JSON extraction strategy — direct parse → fenced JSON → first { } block → fail.
42
+ * Mirrors validateGroundingVerdict (src/medical/retrieval/grounding-critic.ts:40-88) exactly.
43
+ * NEVER throws.
44
+ */
45
+ export declare function validateLensVerdict(rawText: string): ValidateLensResult;
46
+ /** Evidence-grader system prompt — assesses whether the recommendation is evidence-based. */
47
+ export declare function buildEvidenceGraderSystemPrompt(question: string, context: string): string;
48
+ /** Conservative-clinician system prompt — applies a cautious clinical lens. */
49
+ export declare function buildConservativeCliniciansSystemPrompt(question: string, context: string): string;
50
+ /** Optimization-lens system prompt — evaluates practical utility and actionability. */
51
+ export declare function buildOptimizationLensSystemPrompt(question: string, context: string): string;
52
+ /**
53
+ * Contraindication-checker system prompt — evaluates absolute contraindications.
54
+ * CRITICAL: the model MUST emit veto:boolean to indicate absolute contraindications.
55
+ * A veto forces accepted:false regardless of other lens votes — never overridable by majority.
56
+ */
57
+ export declare function buildContraindicationCheckerSystemPrompt(question: string, context: string): string;
58
+ /**
59
+ * Calls the injected lens client up to LENS_MAX_LLM_CALLS times.
60
+ * On parse exhaustion returns {verdict:'reject', veto:false} — FAIL-CLOSED.
61
+ *
62
+ * FAIL-CLOSED inversion of critic-deep.ts:199-201 (which returns approve on exhaustion).
63
+ * Mirrors the fail-closed tail at grounding-critic.ts:203-206 (which rejects on exhaustion).
64
+ * bober: reject on parse exhaustion; intentional for medical safety.
65
+ */
66
+ export declare function getLensVerdict(input: {
67
+ llm: LLMClient;
68
+ model: string;
69
+ systemPrompt: string;
70
+ userContent: string;
71
+ }): Promise<LensVerdict>;
72
+ //# sourceMappingURL=lenses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lenses.d.ts","sourceRoot":"","sources":["../../../src/medical/recommend/lenses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAW,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA4B9C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAClC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAIjC;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAgDvE;AAID,6FAA6F;AAC7F,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAWzF;AAED,+EAA+E;AAC/E,wBAAgB,uCAAuC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAWjG;AAED,uFAAuF;AACvF,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAW3F;AAED;;;;GAIG;AACH,wBAAgB,wCAAwC,CACtD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CAiBR;AA4CD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,WAAW,CAAC,CA8BvB"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Four lens adapters for the recommendation judge panel.
3
+ *
4
+ * PURE orchestration over injected fns — NO fs / NO network / NO real provider / NO FactStore.
5
+ *
6
+ * Each lens calls its injected LLMClient and validates the response with a NEVER-THROWING
7
+ * parser that mirrors validateGroundingVerdict (src/medical/retrieval/grounding-critic.ts:40-88).
8
+ *
9
+ * On parse exhaustion a lens verdict is REJECT (fail-closed), inverting the fleet fail-open
10
+ * tail at src/fleet/critic-deep.ts:206 — see getGroundingVerdict at grounding-critic.ts:203-206.
11
+ */
12
+ import { z } from "zod";
13
+ import { LENS_MAX_LLM_CALLS } from "./types.js";
14
+ // ── Constants ─────────────────────────────────────────────────────────
15
+ /**
16
+ * Coercion instruction sent when the model's first response is not valid JSON.
17
+ * Mirrors GROUNDING_COERCION_INSTRUCTION (grounding-critic.ts:13-23).
18
+ */
19
+ const LENS_COERCION_INSTRUCTION = `Your previous response was not a valid lens verdict.
20
+ Output ONLY a single JSON object (no prose, no markdown fences, no tool calls) with EXACTLY this shape:
21
+ {
22
+ "verdict": "approve" | "reject",
23
+ "feedback": "<concise feedback; empty string if approving>"
24
+ }
25
+
26
+ For contraindication-checker, also include:
27
+ {
28
+ "veto": true | false
29
+ }
30
+
31
+ Rules:
32
+ - "verdict" must be exactly "approve" or "reject".
33
+ - "feedback" must be a string.
34
+ - "veto" (contraindication-checker only) must be a boolean.
35
+ - Output the JSON object and nothing else.`;
36
+ // ── Zod schema ────────────────────────────────────────────────────────
37
+ /**
38
+ * Schema for the raw lens verdict.
39
+ * Mirrors GroundingVerdictSchema (grounding-critic.ts:27-30) with optional veto field.
40
+ * Only the contraindication-checker schema actually validates veto:boolean.
41
+ */
42
+ export const LensVerdictSchema = z.object({
43
+ verdict: z.enum(["approve", "reject"]),
44
+ feedback: z.string(),
45
+ veto: z.boolean().optional(),
46
+ });
47
+ // ── validateLensVerdict (NEVER throws) ───────────────────────────────
48
+ /**
49
+ * Four-tier JSON extraction strategy — direct parse → fenced JSON → first { } block → fail.
50
+ * Mirrors validateGroundingVerdict (src/medical/retrieval/grounding-critic.ts:40-88) exactly.
51
+ * NEVER throws.
52
+ */
53
+ export function validateLensVerdict(rawText) {
54
+ let parsed;
55
+ // Try direct parse first
56
+ try {
57
+ parsed = JSON.parse(rawText.trim());
58
+ }
59
+ catch {
60
+ // Try extracting JSON from markdown code fences
61
+ const fenceMatch = /```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/.exec(rawText);
62
+ if (fenceMatch) {
63
+ try {
64
+ parsed = JSON.parse(fenceMatch[1].trim());
65
+ }
66
+ catch {
67
+ // Fall through
68
+ }
69
+ }
70
+ // Try finding the first { ... } block
71
+ if (!parsed) {
72
+ const braceStart = rawText.indexOf("{");
73
+ const braceEnd = rawText.lastIndexOf("}");
74
+ if (braceStart !== -1 && braceEnd > braceStart) {
75
+ try {
76
+ parsed = JSON.parse(rawText.slice(braceStart, braceEnd + 1));
77
+ }
78
+ catch {
79
+ return {
80
+ ok: false,
81
+ error: `No valid JSON object found in response. Raw: ${rawText.slice(0, 200)}`,
82
+ };
83
+ }
84
+ }
85
+ else {
86
+ return {
87
+ ok: false,
88
+ error: `No JSON object found in response. Raw: ${rawText.slice(0, 200)}`,
89
+ };
90
+ }
91
+ }
92
+ }
93
+ const result = LensVerdictSchema.safeParse(parsed);
94
+ if (!result.success) {
95
+ const issues = result.error.issues
96
+ .map((i) => ` - ${i.path.join(".")}: ${i.message}`)
97
+ .join("\n");
98
+ return { ok: false, error: issues };
99
+ }
100
+ return { ok: true, verdict: result.data };
101
+ }
102
+ // ── System prompts (one per lens) ────────────────────────────────────
103
+ /** Evidence-grader system prompt — assesses whether the recommendation is evidence-based. */
104
+ export function buildEvidenceGraderSystemPrompt(question, context) {
105
+ return (`You are an independent evidence-grader reviewer. Given a patient question and a proposed ` +
106
+ `recommendation, assess whether the recommendation is backed by strong clinical evidence.\n\n` +
107
+ `Approve if: the recommendation is consistent with published clinical guidelines, ` +
108
+ `evidence-based practice, or peer-reviewed research for the presented condition.\n` +
109
+ `Reject if: the recommendation is speculative, unsupported by evidence, or makes ` +
110
+ `unsubstantiated claims.\n\n` +
111
+ `Output ONLY {"verdict":"approve"|"reject","feedback":"..."}\n\n` +
112
+ `Patient question: ${question}\n\nProfile context: ${context}`);
113
+ }
114
+ /** Conservative-clinician system prompt — applies a cautious clinical lens. */
115
+ export function buildConservativeCliniciansSystemPrompt(question, context) {
116
+ return (`You are a conservative clinical reviewer. Given a patient question and a proposed ` +
117
+ `recommendation, assess whether it prioritises patient safety.\n\n` +
118
+ `Approve if: the recommendation is cautious, conservative, and errs on the side of ` +
119
+ `safety; escalates to a healthcare provider when appropriate.\n` +
120
+ `Reject if: the recommendation is aggressive, potentially harmful, or does not ` +
121
+ `recommend professional consultation when the situation warrants it.\n\n` +
122
+ `Output ONLY {"verdict":"approve"|"reject","feedback":"..."}\n\n` +
123
+ `Patient question: ${question}\n\nProfile context: ${context}`);
124
+ }
125
+ /** Optimization-lens system prompt — evaluates practical utility and actionability. */
126
+ export function buildOptimizationLensSystemPrompt(question, context) {
127
+ return (`You are a medical optimization reviewer. Given a patient question and a proposed ` +
128
+ `recommendation, assess whether it is actionable and practically useful.\n\n` +
129
+ `Approve if: the recommendation is clear, specific, actionable, and proportionate ` +
130
+ `to the patient's actual needs as described.\n` +
131
+ `Reject if: the recommendation is vague, generic, impractical, or does not address ` +
132
+ `the patient's specific situation.\n\n` +
133
+ `Output ONLY {"verdict":"approve"|"reject","feedback":"..."}\n\n` +
134
+ `Patient question: ${question}\n\nProfile context: ${context}`);
135
+ }
136
+ /**
137
+ * Contraindication-checker system prompt — evaluates absolute contraindications.
138
+ * CRITICAL: the model MUST emit veto:boolean to indicate absolute contraindications.
139
+ * A veto forces accepted:false regardless of other lens votes — never overridable by majority.
140
+ */
141
+ export function buildContraindicationCheckerSystemPrompt(question, context) {
142
+ return (`You are an independent contraindication-checker reviewer. Given a patient question and ` +
143
+ `a proposed recommendation, identify whether it is absolutely contraindicated based on ` +
144
+ `the patient profile.\n\n` +
145
+ `IMPORTANT: The "veto" field is REQUIRED and ABSOLUTE. Set veto:true if the recommendation ` +
146
+ `would be contraindicated for this patient (e.g. it interacts with a stated medication, ` +
147
+ `conflicts with a known allergy, or is dangerous given a stated medical condition). ` +
148
+ `A veto CANNOT be overridden by other reviewers.\n\n` +
149
+ `Output ONLY {"verdict":"approve"|"reject","veto":true|false,"feedback":"..."}\n\n` +
150
+ `Rules:\n` +
151
+ `- "verdict" must be "approve" or "reject".\n` +
152
+ `- "veto" MUST be a boolean.\n` +
153
+ `- "feedback" must describe the specific contraindication or confirm none found.\n` +
154
+ `- Set veto:true only when you identify an absolute contraindication.\n\n` +
155
+ `Patient question: ${question}\n\nProfile context: ${context}`);
156
+ }
157
+ // ── Internal: one lens call ───────────────────────────────────────────
158
+ async function callLens(input) {
159
+ const { llm, model, systemPrompt, userContent, priorText, formattedError } = input;
160
+ let messages;
161
+ if (priorText !== undefined && formattedError !== undefined) {
162
+ // Coercion retry: 3-message shape [user, assistant, user]
163
+ // Mirrors callGroundingCritic (grounding-critic.ts:123-166)
164
+ messages = [
165
+ { role: "user", content: userContent },
166
+ { role: "assistant", content: priorText },
167
+ {
168
+ role: "user",
169
+ content: `${LENS_COERCION_INSTRUCTION}\n\nPrevious validation error:\n${formattedError}`,
170
+ },
171
+ ];
172
+ }
173
+ else {
174
+ // First turn: single user message
175
+ messages = [{ role: "user", content: userContent }];
176
+ }
177
+ const response = await llm.chat({
178
+ model,
179
+ system: systemPrompt,
180
+ messages,
181
+ jsonObjectMode: true, // mirrors grounding-critic.ts:162 and critic-deep.ts:163
182
+ });
183
+ return response.text;
184
+ }
185
+ // ── getLensVerdict (FAIL-CLOSED on parse exhaustion) ──────────────────
186
+ /**
187
+ * Calls the injected lens client up to LENS_MAX_LLM_CALLS times.
188
+ * On parse exhaustion returns {verdict:'reject', veto:false} — FAIL-CLOSED.
189
+ *
190
+ * FAIL-CLOSED inversion of critic-deep.ts:199-201 (which returns approve on exhaustion).
191
+ * Mirrors the fail-closed tail at grounding-critic.ts:203-206 (which rejects on exhaustion).
192
+ * bober: reject on parse exhaustion; intentional for medical safety.
193
+ */
194
+ export async function getLensVerdict(input) {
195
+ const { llm, model, systemPrompt, userContent } = input;
196
+ const maxAttempts = LENS_MAX_LLM_CALLS;
197
+ let lastError = "Unknown error";
198
+ let priorText;
199
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
200
+ const rawText = await callLens({
201
+ llm,
202
+ model,
203
+ systemPrompt,
204
+ userContent,
205
+ priorText: attempt > 0 ? priorText : undefined,
206
+ formattedError: attempt > 0 ? lastError : undefined,
207
+ });
208
+ const validated = validateLensVerdict(rawText);
209
+ if (validated.ok) {
210
+ return validated.verdict;
211
+ }
212
+ lastError = validated.error;
213
+ priorText = rawText;
214
+ }
215
+ // FAIL-CLOSED inversion of critic-deep.ts:199-201 (which returns approve on exhaustion).
216
+ // Mirrors grounding-critic.ts:203-206: reject on parse exhaustion; intentional for medical safety.
217
+ // bober: reject on parse exhaustion; intentional for medical safety.
218
+ return { verdict: "reject", feedback: "<unparseable lens output>", veto: false };
219
+ }
220
+ //# sourceMappingURL=lenses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lenses.js","sourceRoot":"","sources":["../../../src/medical/recommend/lenses.ts"],"names":[],"mappings":"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"}