agentix-cli 0.26.0 → 0.28.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 (300) hide show
  1. package/README.md +67 -118
  2. package/apps/mac-helper/Sources/AgentXHelper/AXTree.swift +159 -0
  3. package/apps/mac-helper/Sources/AgentXHelper/Brand.swift +63 -0
  4. package/apps/mac-helper/Sources/AgentXHelper/Focus.swift +97 -0
  5. package/apps/mac-helper/Sources/AgentXHelper/HUD.swift +179 -0
  6. package/apps/mac-helper/Sources/AgentXHelper/OCR.swift +117 -0
  7. package/apps/mac-helper/Sources/AgentXHelper/Pointer.swift +309 -0
  8. package/apps/mac-helper/Sources/AgentXHelper/Screens.swift +67 -0
  9. package/apps/mac-helper/Sources/AgentXHelper/Typer.swift +185 -0
  10. package/apps/mac-helper/Sources/AgentXHelper/Vision.swift +201 -0
  11. package/apps/mac-helper/Sources/AgentXHelper/main.swift +265 -0
  12. package/apps/mac-helper/build.sh +39 -0
  13. package/apps/mac-voice/Resources/Info.plist +18 -0
  14. package/apps/mac-voice/Sources/AgentXVoice/AgentClient.swift +108 -0
  15. package/apps/mac-voice/Sources/AgentXVoice/Brand.swift +123 -0
  16. package/apps/mac-voice/Sources/AgentXVoice/Config.swift +68 -0
  17. package/apps/mac-voice/Sources/AgentXVoice/Hold.swift +74 -0
  18. package/apps/mac-voice/Sources/AgentXVoice/Hotkey.swift +76 -0
  19. package/apps/mac-voice/Sources/AgentXVoice/Markdown.swift +140 -0
  20. package/apps/mac-voice/Sources/AgentXVoice/Panel.swift +275 -0
  21. package/apps/mac-voice/Sources/AgentXVoice/Progress.swift +147 -0
  22. package/apps/mac-voice/Sources/AgentXVoice/Recorder.swift +139 -0
  23. package/apps/mac-voice/Sources/AgentXVoice/ResultCard.swift +162 -0
  24. package/apps/mac-voice/Sources/AgentXVoice/SmartPaste.swift +72 -0
  25. package/apps/mac-voice/Sources/AgentXVoice/Speech.swift +192 -0
  26. package/apps/mac-voice/Sources/AgentXVoice/StepLabel.swift +159 -0
  27. package/apps/mac-voice/Sources/AgentXVoice/main.swift +380 -0
  28. package/apps/mac-voice/build.sh +32 -0
  29. package/dist/{App-BPNHIGUX.js → App-CKPH3HHF.js} +2 -2
  30. package/dist/{ChatApp-6XSSZB4U.js → ChatApp-MX7IG4K2.js} +2 -2
  31. package/dist/agent-2U574KBZ.js +2 -0
  32. package/dist/article-fields-L4D2BOGY.js +2 -0
  33. package/dist/article-quality-44ONVGLN.js +3 -0
  34. package/dist/article-quality-44ONVGLN.js.map +1 -0
  35. package/dist/{audit-JU3HWISB.js → audit-4245CX6P.js} +2 -2
  36. package/dist/backfill-MTD2B62I.js +6 -0
  37. package/dist/backfill-MTD2B62I.js.map +1 -0
  38. package/dist/{board-dashboard-M3372FLO.js → board-dashboard-QR7CVTKA.js} +1411 -453
  39. package/dist/board-dashboard-QR7CVTKA.js.map +1 -0
  40. package/dist/{builtin-FRKAQMFS.js → builtin-B67DMJ3M.js} +2 -2
  41. package/dist/calibration-ILS5OI44.js +2 -0
  42. package/dist/{chunk-V3U4OF7L.js → chunk-3LYM22IV.js} +46 -48
  43. package/dist/chunk-3LYM22IV.js.map +1 -0
  44. package/dist/chunk-3SCPRYJB.js +5 -0
  45. package/dist/chunk-3SCPRYJB.js.map +1 -0
  46. package/dist/chunk-4BR7D2OU.js +36 -0
  47. package/dist/chunk-4BR7D2OU.js.map +1 -0
  48. package/dist/{chunk-P4VWIVKN.js → chunk-52ZPELD2.js} +403 -29
  49. package/dist/chunk-52ZPELD2.js.map +1 -0
  50. package/dist/chunk-5IA2CYHN.js +5 -0
  51. package/dist/{chunk-O6YPEOQF.js.map → chunk-5IA2CYHN.js.map} +1 -1
  52. package/dist/chunk-64CAIB3C.js +9 -0
  53. package/dist/chunk-64CAIB3C.js.map +1 -0
  54. package/dist/{chunk-5U35WAZF.js → chunk-77OV7346.js} +6 -6
  55. package/dist/chunk-77OV7346.js.map +1 -0
  56. package/dist/chunk-AJ5RMU7X.js +2 -0
  57. package/dist/chunk-AJ5RMU7X.js.map +1 -0
  58. package/dist/chunk-AJONZWLT.js +2 -0
  59. package/dist/chunk-AJONZWLT.js.map +1 -0
  60. package/dist/chunk-BH3GTCZ6.js +2 -0
  61. package/dist/chunk-BH3GTCZ6.js.map +1 -0
  62. package/dist/chunk-E3UJHQGN.js +1189 -0
  63. package/dist/chunk-E3UJHQGN.js.map +1 -0
  64. package/dist/chunk-EVWEG3VD.js +3 -0
  65. package/dist/chunk-EVWEG3VD.js.map +1 -0
  66. package/dist/chunk-F4HZTZHW.js +2 -0
  67. package/dist/chunk-F4HZTZHW.js.map +1 -0
  68. package/dist/chunk-F6CNF7V3.js +25 -0
  69. package/dist/chunk-F6CNF7V3.js.map +1 -0
  70. package/dist/chunk-FIOB3MEX.js +2 -0
  71. package/dist/{chunk-H5D7ATXS.js → chunk-FKBGJYWQ.js} +5 -5
  72. package/dist/chunk-FKBGJYWQ.js.map +1 -0
  73. package/dist/{chunk-BVGJSPW4.js → chunk-G2HMRDUQ.js} +7 -7
  74. package/dist/chunk-G2HMRDUQ.js.map +1 -0
  75. package/dist/chunk-H2QQU2XV.js +109 -0
  76. package/dist/chunk-H2QQU2XV.js.map +1 -0
  77. package/dist/{chunk-LDHPMJ7M.js → chunk-IWMW5432.js} +3 -3
  78. package/dist/chunk-IWMW5432.js.map +1 -0
  79. package/dist/chunk-K33GIBSE.js +2 -0
  80. package/dist/chunk-K33GIBSE.js.map +1 -0
  81. package/dist/chunk-L2WSPY6S.js +2 -0
  82. package/dist/chunk-L2WSPY6S.js.map +1 -0
  83. package/dist/chunk-LCIREYTD.js +54 -0
  84. package/dist/chunk-LCIREYTD.js.map +1 -0
  85. package/dist/chunk-MHIMGM4G.js +126 -0
  86. package/dist/chunk-MHIMGM4G.js.map +1 -0
  87. package/dist/chunk-P5ZBBEPL.js +13 -0
  88. package/dist/chunk-P5ZBBEPL.js.map +1 -0
  89. package/dist/{chunk-JTJIPNXY.js → chunk-PNWNVOEZ.js} +1 -1
  90. package/dist/chunk-PNWNVOEZ.js.map +1 -0
  91. package/dist/chunk-QHTQPBHU.js +45 -0
  92. package/dist/chunk-QHTQPBHU.js.map +1 -0
  93. package/dist/chunk-S2MNL5V6.js +2 -0
  94. package/dist/chunk-S2MNL5V6.js.map +1 -0
  95. package/dist/chunk-SCTIUFL4.js +5 -0
  96. package/dist/{chunk-K2CAPYES.js.map → chunk-SCTIUFL4.js.map} +1 -1
  97. package/dist/chunk-ULLAE6LE.js +157 -0
  98. package/dist/chunk-ULLAE6LE.js.map +1 -0
  99. package/dist/{chunk-DJEZ2HVU.js → chunk-VDMYBPYB.js} +1 -1
  100. package/dist/chunk-VDMYBPYB.js.map +1 -0
  101. package/dist/chunk-VIH7ARPF.js +547 -0
  102. package/dist/chunk-VIH7ARPF.js.map +1 -0
  103. package/dist/chunk-W5C2GDNC.js +32 -0
  104. package/dist/{chunk-JP5IEXR7.js.map → chunk-W5C2GDNC.js.map} +1 -1
  105. package/dist/chunk-WPMX3VGI.js +3 -0
  106. package/dist/chunk-WPMX3VGI.js.map +1 -0
  107. package/dist/chunk-YLBERT7N.js +24 -0
  108. package/dist/chunk-YLBERT7N.js.map +1 -0
  109. package/dist/chunk-YLGIZRHV.js +114 -0
  110. package/dist/chunk-YLGIZRHV.js.map +1 -0
  111. package/dist/chunk-ZMYGXHPT.js +121 -0
  112. package/dist/chunk-ZMYGXHPT.js.map +1 -0
  113. package/dist/chunk-ZTEU5JVQ.js +2 -0
  114. package/dist/chunk-ZTEU5JVQ.js.map +1 -0
  115. package/dist/{chunk-2WVX3LEC.js → chunk-ZVP6GB4G.js} +1 -1
  116. package/dist/chunk-ZVP6GB4G.js.map +1 -0
  117. package/dist/cli.js +1 -1
  118. package/dist/cli.js.map +1 -1
  119. package/dist/client-ZLSXGPTV.js +2 -0
  120. package/dist/{compaction-NWEMOSHA.js → compaction-FD4R23HZ.js} +4 -4
  121. package/dist/config-HMW3EBZL.js +2 -0
  122. package/dist/config-mutator-4SZ5YEVD.js +2 -0
  123. package/dist/{conflict-detector-D7VIYPDI.js → conflict-detector-ZPOT3M2C.js} +2 -2
  124. package/dist/conflict-detector-ZPOT3M2C.js.map +1 -0
  125. package/dist/context-planner-AQHJMVY2.js +17 -0
  126. package/dist/context-planner-AQHJMVY2.js.map +1 -0
  127. package/dist/debug-3MEUO2P2.js +2 -0
  128. package/dist/{discover-XJXQXXIO.js → discover-D4VVRNAI.js} +2 -2
  129. package/dist/discover-D4VVRNAI.js.map +1 -0
  130. package/dist/doctor-LRYV3QLK.js +2 -0
  131. package/dist/editor-chat-OB7IQOB5.js +137 -0
  132. package/dist/editor-chat-OB7IQOB5.js.map +1 -0
  133. package/dist/entry-triage-LK34TSQD.js +2 -0
  134. package/dist/entry-triage-LK34TSQD.js.map +1 -0
  135. package/dist/facts-YVEJOM7O.js +22 -0
  136. package/dist/facts-YVEJOM7O.js.map +1 -0
  137. package/dist/heal-FVLBHYP7.js +2 -0
  138. package/dist/index.d.ts +1040 -64
  139. package/dist/index.js +12 -19
  140. package/dist/index.js.map +1 -1
  141. package/dist/{ingest-whatsapp-LZE62INA.js → ingest-whatsapp-NS4OWDOU.js} +2 -2
  142. package/dist/loader-4ZGTK7LD.js +2 -0
  143. package/dist/loader-BOKE5M5S.js +2 -0
  144. package/dist/memory-extract-F5ZHWY5E.js +2 -0
  145. package/dist/{migrate-v2-QO7SLKIM.js → migrate-v2-V4WN2VVM.js} +2 -2
  146. package/dist/ntfy-X7EPB3TG.js +4 -0
  147. package/dist/ntfy-X7EPB3TG.js.map +1 -0
  148. package/dist/processes-WU23U2OJ.js +2 -0
  149. package/dist/program-GSZ5AYAM.js +2 -0
  150. package/dist/{projects-api-KRME2YKZ.js → projects-api-QE6L65SK.js} +2 -2
  151. package/dist/{projects-mutate-3NHVG437.js → projects-mutate-MY7JTLSZ.js} +2 -2
  152. package/dist/providers-KO2DODIO.js +2 -0
  153. package/dist/query-SQDHE4HV.js +2 -0
  154. package/dist/questions-4B4KSPXG.js +3 -0
  155. package/dist/questions-4B4KSPXG.js.map +1 -0
  156. package/dist/recipes-7S4MC5OJ.js +2 -0
  157. package/dist/registry-LE6FWYZC.js +2 -0
  158. package/dist/review-candidates-RQU5KNZM.js +4 -0
  159. package/dist/review-candidates-RQU5KNZM.js.map +1 -0
  160. package/dist/review-store-B4YE3EFK.js +4 -0
  161. package/dist/review-store-B4YE3EFK.js.map +1 -0
  162. package/dist/{rotation-memo-B3EXXSEH.js → rotation-memo-7T75BLEX.js} +2 -2
  163. package/dist/routing-ILERJXB6.js +2 -0
  164. package/dist/runner-YRBVNYTY.js +2 -0
  165. package/dist/scheduler-BFM3EINS.js +2 -0
  166. package/dist/seat-7WM7II2B.js +2 -0
  167. package/dist/select-X4KVMOP5.js +2 -0
  168. package/dist/select-X4KVMOP5.js.map +1 -0
  169. package/dist/store-MCOA6N4F.js +2 -0
  170. package/dist/{subagent-WV7QKQ3L.js → subagent-2SJHSSJS.js} +2 -2
  171. package/dist/{surface-usage-PRL6Z4U3.js → surface-usage-NS74AXSE.js} +2 -2
  172. package/dist/timers-PCB4ZIBD.js +2 -0
  173. package/dist/triage-backtest-JNO7RKX7.js +2 -0
  174. package/dist/triage-backtest-JNO7RKX7.js.map +1 -0
  175. package/dist/types-H5ENIUIT.js +2 -0
  176. package/dist/types-OIFU3KSQ.js +2 -0
  177. package/dist/types-OIFU3KSQ.js.map +1 -0
  178. package/dist/web/workflow-editor.global.js +1542 -0
  179. package/dist/web/workflow-editor.global.js.map +1 -0
  180. package/dist/{whatsapp-state-XMTCSRXU.js → whatsapp-state-6D6FHHD2.js} +2 -2
  181. package/dist/wiki-2AUFSIKO.js +2 -0
  182. package/dist/wiki-2AUFSIKO.js.map +1 -0
  183. package/dist/workflows/templates/branching.yaml +1 -1
  184. package/dist/{workspace-setup-TBQAHYHJ.js → workspace-setup-B3F3TUDE.js} +2 -2
  185. package/dist/workspace-setup-B3F3TUDE.js.map +1 -0
  186. package/package.json +14 -3
  187. package/scripts/postinstall.mjs +80 -0
  188. package/dist/agent-5QMITZT6.js +0 -2
  189. package/dist/architect-SEPWMWS4.js +0 -2
  190. package/dist/board-dashboard-M3372FLO.js.map +0 -1
  191. package/dist/chunk-2WVX3LEC.js.map +0 -1
  192. package/dist/chunk-3WQFCIB6.js +0 -24
  193. package/dist/chunk-3WQFCIB6.js.map +0 -1
  194. package/dist/chunk-4YCH6IZV.js +0 -2
  195. package/dist/chunk-53NRX2NA.js +0 -2
  196. package/dist/chunk-53NRX2NA.js.map +0 -1
  197. package/dist/chunk-5U35WAZF.js.map +0 -1
  198. package/dist/chunk-BFXONUUN.js +0 -108
  199. package/dist/chunk-BFXONUUN.js.map +0 -1
  200. package/dist/chunk-BFZUG66X.js +0 -45
  201. package/dist/chunk-BFZUG66X.js.map +0 -1
  202. package/dist/chunk-BTHHSY7D.js +0 -13
  203. package/dist/chunk-BTHHSY7D.js.map +0 -1
  204. package/dist/chunk-BVGJSPW4.js.map +0 -1
  205. package/dist/chunk-D46VZ7K7.js +0 -116
  206. package/dist/chunk-D46VZ7K7.js.map +0 -1
  207. package/dist/chunk-DJEZ2HVU.js.map +0 -1
  208. package/dist/chunk-E5CXCI33.js +0 -155
  209. package/dist/chunk-E5CXCI33.js.map +0 -1
  210. package/dist/chunk-FDWOECJY.js +0 -54
  211. package/dist/chunk-FDWOECJY.js.map +0 -1
  212. package/dist/chunk-H5D7ATXS.js.map +0 -1
  213. package/dist/chunk-HR4JSRZS.js +0 -3
  214. package/dist/chunk-HR4JSRZS.js.map +0 -1
  215. package/dist/chunk-ISEBLHWX.js +0 -118
  216. package/dist/chunk-ISEBLHWX.js.map +0 -1
  217. package/dist/chunk-JP5IEXR7.js +0 -32
  218. package/dist/chunk-JTJIPNXY.js.map +0 -1
  219. package/dist/chunk-K2CAPYES.js +0 -5
  220. package/dist/chunk-LDHPMJ7M.js.map +0 -1
  221. package/dist/chunk-METYYZKQ.js +0 -1115
  222. package/dist/chunk-METYYZKQ.js.map +0 -1
  223. package/dist/chunk-MTAPOCGA.js +0 -47
  224. package/dist/chunk-MTAPOCGA.js.map +0 -1
  225. package/dist/chunk-O6YPEOQF.js +0 -5
  226. package/dist/chunk-P4VWIVKN.js.map +0 -1
  227. package/dist/chunk-SR3X25TN.js +0 -3
  228. package/dist/chunk-SR3X25TN.js.map +0 -1
  229. package/dist/chunk-UHE5FCPB.js +0 -431
  230. package/dist/chunk-UHE5FCPB.js.map +0 -1
  231. package/dist/chunk-V3U4OF7L.js.map +0 -1
  232. package/dist/chunk-VJUTQAPJ.js +0 -2
  233. package/dist/chunk-VJUTQAPJ.js.map +0 -1
  234. package/dist/chunk-VT5XYFDD.js +0 -126
  235. package/dist/chunk-VT5XYFDD.js.map +0 -1
  236. package/dist/client-HGKAC6VP.js +0 -2
  237. package/dist/config-A4RWEJHV.js +0 -2
  238. package/dist/config-mutator-MNSFUN7D.js +0 -2
  239. package/dist/conflict-detector-D7VIYPDI.js.map +0 -1
  240. package/dist/context-planner-45GEWKGL.js +0 -17
  241. package/dist/context-planner-45GEWKGL.js.map +0 -1
  242. package/dist/debug-N3B5NVJU.js +0 -2
  243. package/dist/discover-XJXQXXIO.js.map +0 -1
  244. package/dist/doctor-3Q36ZFE6.js +0 -2
  245. package/dist/heal-HZ3EQD52.js +0 -2
  246. package/dist/loader-5CA3O5GM.js +0 -2
  247. package/dist/loader-6IHUCPVO.js +0 -2
  248. package/dist/memory-extract-AENFVVO5.js +0 -2
  249. package/dist/processes-UIC4XXA6.js +0 -2
  250. package/dist/program-SAUNRCCD.js +0 -2
  251. package/dist/providers-L27BJ5A6.js +0 -2
  252. package/dist/query-HZYYRCLU.js +0 -2
  253. package/dist/recipes-EPLE2SNT.js +0 -2
  254. package/dist/registry-HK3WQ7BS.js +0 -2
  255. package/dist/runner-BFYDWPUO.js +0 -2
  256. package/dist/scheduler-6T2SU5ST.js +0 -2
  257. package/dist/store-I3HEWVLQ.js +0 -2
  258. package/dist/timers-5LPZN55J.js +0 -2
  259. package/dist/types-VECTMYTO.js +0 -2
  260. package/dist/types-Y6ZCZ52Z.js +0 -2
  261. package/dist/wiki-M6YNRFC4.js +0 -2
  262. /package/dist/{App-BPNHIGUX.js.map → App-CKPH3HHF.js.map} +0 -0
  263. /package/dist/{ChatApp-6XSSZB4U.js.map → ChatApp-MX7IG4K2.js.map} +0 -0
  264. /package/dist/{agent-5QMITZT6.js.map → agent-2U574KBZ.js.map} +0 -0
  265. /package/dist/{architect-SEPWMWS4.js.map → article-fields-L4D2BOGY.js.map} +0 -0
  266. /package/dist/{audit-JU3HWISB.js.map → audit-4245CX6P.js.map} +0 -0
  267. /package/dist/{builtin-FRKAQMFS.js.map → builtin-B67DMJ3M.js.map} +0 -0
  268. /package/dist/{chunk-4YCH6IZV.js.map → calibration-ILS5OI44.js.map} +0 -0
  269. /package/dist/{client-HGKAC6VP.js.map → chunk-FIOB3MEX.js.map} +0 -0
  270. /package/dist/{config-A4RWEJHV.js.map → client-ZLSXGPTV.js.map} +0 -0
  271. /package/dist/{compaction-NWEMOSHA.js.map → compaction-FD4R23HZ.js.map} +0 -0
  272. /package/dist/{config-mutator-MNSFUN7D.js.map → config-HMW3EBZL.js.map} +0 -0
  273. /package/dist/{debug-N3B5NVJU.js.map → config-mutator-4SZ5YEVD.js.map} +0 -0
  274. /package/dist/{doctor-3Q36ZFE6.js.map → debug-3MEUO2P2.js.map} +0 -0
  275. /package/dist/{heal-HZ3EQD52.js.map → doctor-LRYV3QLK.js.map} +0 -0
  276. /package/dist/{loader-5CA3O5GM.js.map → heal-FVLBHYP7.js.map} +0 -0
  277. /package/dist/{ingest-whatsapp-LZE62INA.js.map → ingest-whatsapp-NS4OWDOU.js.map} +0 -0
  278. /package/dist/{loader-6IHUCPVO.js.map → loader-4ZGTK7LD.js.map} +0 -0
  279. /package/dist/{memory-extract-AENFVVO5.js.map → loader-BOKE5M5S.js.map} +0 -0
  280. /package/dist/{processes-UIC4XXA6.js.map → memory-extract-F5ZHWY5E.js.map} +0 -0
  281. /package/dist/{migrate-v2-QO7SLKIM.js.map → migrate-v2-V4WN2VVM.js.map} +0 -0
  282. /package/dist/{program-SAUNRCCD.js.map → processes-WU23U2OJ.js.map} +0 -0
  283. /package/dist/{providers-L27BJ5A6.js.map → program-GSZ5AYAM.js.map} +0 -0
  284. /package/dist/{projects-api-KRME2YKZ.js.map → projects-api-QE6L65SK.js.map} +0 -0
  285. /package/dist/{projects-mutate-3NHVG437.js.map → projects-mutate-MY7JTLSZ.js.map} +0 -0
  286. /package/dist/{query-HZYYRCLU.js.map → providers-KO2DODIO.js.map} +0 -0
  287. /package/dist/{recipes-EPLE2SNT.js.map → query-SQDHE4HV.js.map} +0 -0
  288. /package/dist/{registry-HK3WQ7BS.js.map → recipes-7S4MC5OJ.js.map} +0 -0
  289. /package/dist/{runner-BFYDWPUO.js.map → registry-LE6FWYZC.js.map} +0 -0
  290. /package/dist/{rotation-memo-B3EXXSEH.js.map → rotation-memo-7T75BLEX.js.map} +0 -0
  291. /package/dist/{scheduler-6T2SU5ST.js.map → routing-ILERJXB6.js.map} +0 -0
  292. /package/dist/{store-I3HEWVLQ.js.map → runner-YRBVNYTY.js.map} +0 -0
  293. /package/dist/{surface-usage-PRL6Z4U3.js.map → scheduler-BFM3EINS.js.map} +0 -0
  294. /package/dist/{timers-5LPZN55J.js.map → seat-7WM7II2B.js.map} +0 -0
  295. /package/dist/{types-VECTMYTO.js.map → store-MCOA6N4F.js.map} +0 -0
  296. /package/dist/{subagent-WV7QKQ3L.js.map → subagent-2SJHSSJS.js.map} +0 -0
  297. /package/dist/{types-Y6ZCZ52Z.js.map → surface-usage-NS74AXSE.js.map} +0 -0
  298. /package/dist/{wiki-M6YNRFC4.js.map → timers-PCB4ZIBD.js.map} +0 -0
  299. /package/dist/{workspace-setup-TBQAHYHJ.js.map → types-H5ENIUIT.js.map} +0 -0
  300. /package/dist/{whatsapp-state-XMTCSRXU.js.map → whatsapp-state-6D6FHHD2.js.map} +0 -0
@@ -1,11 +1,11 @@
1
- var m="claude-haiku-4-20250514",f=`You are a memory extraction system for an AI agent. Given a conversation exchange, extract facts worth remembering for future conversations across different chat sessions.
1
+ var d="claude-haiku-4-20250514",f=`You are a memory extraction system for an AI agent. Given a conversation exchange, extract facts worth remembering for future conversations across different chat sessions.
2
2
 
3
3
  Extract ONLY facts that would help the agent in FUTURE, DIFFERENT conversations:
4
4
  - Credentials, tokens, API keys shared by the user
5
5
  - User preferences and instructions ("never do X", "always use Y")
6
6
  - Commitments the agent made ("I will deploy by Friday")
7
- - Relationships ("Anis is the admin", "Nadia handles content")
8
- - Task state ("GitLab tokens need deploying to clawd-server")
7
+ - Relationships ("Alex is the admin", "Marketing handles content")
8
+ - Task state ("GitLab tokens need deploying to peer-server")
9
9
  - Important facts about infrastructure, config, or processes
10
10
 
11
11
  SKIP:
@@ -17,7 +17,7 @@ SKIP:
17
17
  For each fact, output a JSON array:
18
18
  [{"category":"fact|secret|preference|commitment|task-state","content":"concise fact, 1-2 sentences","keywords":["keyword1","keyword2"]}]
19
19
 
20
- If nothing worth remembering, output: []`;async function h(t,s,a,n,r){if(s.length<20&&a.length<50)return;let{createProvider:i}=await import("./providers-L27BJ5A6.js"),c=(await i("claude").generate([{role:"system",content:f},{role:"user",content:`${n.sender} (via ${n.channel}): ${s}
20
+ If nothing worth remembering, output: []`;async function h(t,s,a,n,r){if(s.length<20&&a.length<50)return;let{createProvider:i}=await import("./providers-KO2DODIO.js"),c=(await i("claude").generate([{role:"system",content:f},{role:"user",content:`${n.sender} (via ${n.channel}): ${s}
21
21
 
22
- Agent: ${a}`}],{model:m,maxTokens:512})).content.trim().match(/\[[\s\S]*\]/);if(!c)return;let o=JSON.parse(c[0]);if(!Array.isArray(o)||o.length===0)return;let d=new Date().toISOString().slice(0,10);for(let e of o)r.hasSimilar(t,e.content)||r.addMemory(t,{agentId:t,category:e.category,content:e.content,keywords:e.keywords||[],source:{...n,date:d},expiresAt:e.category==="task-state"?new Date(Date.now()+7*24*60*60*1e3).toISOString():void 0});Math.random()<.02&&r.prune(t)}export{h as a};
23
- //# sourceMappingURL=chunk-5U35WAZF.js.map
22
+ Agent: ${a}`}],{model:d,maxTokens:512})).content.trim().match(/\[[\s\S]*\]/);if(!c)return;let o=JSON.parse(c[0]);if(!Array.isArray(o)||o.length===0)return;let m=new Date().toISOString().slice(0,10);for(let e of o)r.hasSimilar(t,e.content)||r.addMemory(t,{agentId:t,category:e.category,content:e.content,keywords:e.keywords||[],source:{...n,date:m},expiresAt:e.category==="task-state"?new Date(Date.now()+7*24*60*60*1e3).toISOString():void 0});Math.random()<.02&&r.prune(t)}export{h as a};
23
+ //# sourceMappingURL=chunk-77OV7346.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agents/memory-extract.ts"],"sourcesContent":["import type { MemoryStore } from \"./memory-store\"\n\n// --- Haiku-powered memory extraction ---\n// Fire-and-forget after each agent response.\n// Extracts memorable facts and writes them to the persistent store.\n\nconst EXTRACTION_MODEL = \"claude-haiku-4-20250514\"\n\nconst EXTRACTION_PROMPT = `You are a memory extraction system for an AI agent. Given a conversation exchange, extract facts worth remembering for future conversations across different chat sessions.\n\nExtract ONLY facts that would help the agent in FUTURE, DIFFERENT conversations:\n- Credentials, tokens, API keys shared by the user\n- User preferences and instructions (\"never do X\", \"always use Y\")\n- Commitments the agent made (\"I will deploy by Friday\")\n- Relationships (\"Alex is the admin\", \"Marketing handles content\")\n- Task state (\"GitLab tokens need deploying to peer-server\")\n- Important facts about infrastructure, config, or processes\n\nSKIP:\n- Routine greetings, acknowledgments, status updates\n- Information derivable from code or config files\n- Transient conversation flow (\"let me check\", \"here's what I found\")\n- Facts already obvious from the agent's system prompt\n\nFor each fact, output a JSON array:\n[{\"category\":\"fact|secret|preference|commitment|task-state\",\"content\":\"concise fact, 1-2 sentences\",\"keywords\":[\"keyword1\",\"keyword2\"]}]\n\nIf nothing worth remembering, output: []`\n\nexport async function extractMemories(\n agentId: string,\n userMessage: string,\n agentResponse: string,\n source: { channel: string; chatId: string; sender: string },\n store: MemoryStore,\n): Promise<void> {\n // Skip very short exchanges (unlikely to contain memorable facts)\n if (userMessage.length < 20 && agentResponse.length < 50) return\n\n const { createProvider } = await import(\"@/agent/providers\")\n const provider = createProvider(\"claude\")\n\n const result = await provider.generate(\n [\n { role: \"system\", content: EXTRACTION_PROMPT },\n {\n role: \"user\",\n content: `${source.sender} (via ${source.channel}): ${userMessage}\\n\\nAgent: ${agentResponse}`,\n },\n ],\n { model: EXTRACTION_MODEL, maxTokens: 512 },\n )\n\n // Parse JSON array from response\n const content = result.content.trim()\n const jsonMatch = content.match(/\\[[\\s\\S]*\\]/)\n if (!jsonMatch) return\n\n const facts = JSON.parse(jsonMatch[0]) as Array<{\n category: string\n content: string\n keywords: string[]\n }>\n\n if (!Array.isArray(facts) || facts.length === 0) return\n\n const date = new Date().toISOString().slice(0, 10)\n\n for (const fact of facts) {\n // Skip duplicates\n if (store.hasSimilar(agentId, fact.content)) continue\n\n store.addMemory(agentId, {\n agentId,\n category: fact.category as any,\n content: fact.content,\n keywords: fact.keywords || [],\n source: { ...source, date },\n expiresAt: fact.category === \"task-state\"\n ? new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()\n : undefined,\n })\n }\n\n // Prune occasionally (every ~50 calls, probabilistic)\n if (Math.random() < 0.02) {\n store.prune(agentId)\n }\n}\n"],"mappings":"AAMA,IAAMA,EAAmB,0BAEnBC,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAqB1B,eAAsBC,EACpBC,EACAC,EACAC,EACAC,EACAC,EACe,CAEf,GAAIH,EAAY,OAAS,IAAMC,EAAc,OAAS,GAAI,OAE1D,GAAM,CAAE,eAAAG,CAAe,EAAI,KAAM,QAAO,yBAAmB,EAgBrDC,GAbS,MAFED,EAAe,QAAQ,EAEV,SAC5B,CACE,CAAE,KAAM,SAAU,QAASP,CAAkB,EAC7C,CACE,KAAM,OACN,QAAS,GAAGK,EAAO,eAAeA,EAAO,aAAaF;AAAA;AAAA,SAAyBC,GACjF,CACF,EACA,CAAE,MAAOL,EAAkB,UAAW,GAAI,CAC5C,GAGuB,QAAQ,KAAK,EACV,MAAM,aAAa,EAC7C,GAAI,CAACS,EAAW,OAEhB,IAAMC,EAAQ,KAAK,MAAMD,EAAU,CAAC,CAAC,EAMrC,GAAI,CAAC,MAAM,QAAQC,CAAK,GAAKA,EAAM,SAAW,EAAG,OAEjD,IAAMC,EAAO,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,EAAG,EAAE,EAEjD,QAAWC,KAAQF,EAEbH,EAAM,WAAWJ,EAASS,EAAK,OAAO,GAE1CL,EAAM,UAAUJ,EAAS,CACvB,QAAAA,EACA,SAAUS,EAAK,SACf,QAASA,EAAK,QACd,SAAUA,EAAK,UAAY,CAAC,EAC5B,OAAQ,CAAE,GAAGN,EAAQ,KAAAK,CAAK,EAC1B,UAAWC,EAAK,WAAa,aACzB,IAAI,KAAK,KAAK,IAAI,EAAI,EAAI,GAAK,GAAK,GAAK,GAAI,EAAE,YAAY,EAC3D,MACN,CAAC,EAIC,KAAK,OAAO,EAAI,KAClBL,EAAM,MAAMJ,CAAO,CAEvB","names":["EXTRACTION_MODEL","EXTRACTION_PROMPT","extractMemories","agentId","userMessage","agentResponse","source","store","createProvider","jsonMatch","facts","date","fact"]}
@@ -0,0 +1,2 @@
1
+ import{a as c,b as d,f as u}from"./chunk-F4HZTZHW.js";u();var f="wiki-rerank",k=30,p=900;function b(t){let r=t.excerptChars??p;return{query:t.query,candidates:t.candidates.map(e=>({id:e.id,title:e.title,tags:e.tags?.length?e.tags.join(", "):null,excerpt:l(e.excerpt,r)}))}}function w(t){let r={};for(let e of t)r[e.id]=e.title;return{best:d(r,"Which candidate answers the query?"),answerable:c("Do any of the candidates answer the query?")}}function x(t,r){let e=t.best,s={};for(let n of r)s[n.id]=e.probabilities[n.id]??0;let o=new Map(r.map((n,a)=>[n.id,a]));return{ranked:[...r.map(n=>n.id)].sort((n,a)=>{let i=s[a]-s[n];return i!==0?i:(o.get(n)??0)-(o.get(a)??0)}),scores:s,answerable:t.answerable.noul,confidence:e.confidence}}function l(t,r){let e=String(t??"").replace(/\s+/g," ").trim();return e.length>r?e.slice(0,r):e}export{f as a,k as b,b as c,w as d,x as e};
2
+ //# sourceMappingURL=chunk-AJ5RMU7X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/decisions/seats/wiki-rerank.ts"],"sourcesContent":["import { choice, noul } from \"../questions\"\nimport type { AnswersFor, ChoiceAnswer, NoulAnswer, StateValue } from \"../types\"\n\n// Re-ranking a BM25 shortlist.\n//\n// Measured on the operator's own wiki (11,656 articles, 12 queries):\n// BM25 alone gets R@1 33.3%, R@3 41.7%. Two thirds of queries do not put\n// the right article first. BM25 is a bag-of-words match, so it does well\n// on \"gitlab token expired\" and badly on \"the bot keeps repeating itself\n// what is wrong\" — the synonym cases score 33% / 33%.\n//\n// Shape follows TypeSafe's semantic_find cookbook rather than their\n// rerank one. Rerank scores each query-candidate pair separately, which\n// is N calls; semantic_find scores 218 line ids against one query with a\n// single Choice, and the per-option probabilities ARE the ranking. One\n// call for the whole shortlist, and the candidates are compared against\n// each other rather than each judged alone — which is what ranking means.\n//\n// The companion Noul is the part that keeps this honest. A Choice must\n// return something: asked which of 30 articles answers a question the\n// wiki has no answer to, it will still name one, with a confident-looking\n// probability. `answerable` is the question that can say no, and code\n// reads it first.\n\nexport const WIKI_RERANK_SEAT = \"wiki-rerank\"\n\n// Measured on the 12-query eval, sweeping candidate count against\n// excerpt length under a fixed state budget:\n//\n// k=120 x 150 chars R@1 25.0% (worse than BM25's 33.3%)\n// k=60 x 300 chars R@1 41.7%\n// k=30 x 600 chars R@1 41.7%\n// k=30 x 900 chars R@1 50.0% <- default\n// k=20 x 1100 chars R@1 50.0%\n//\n// Candidates and excerpt trade against one another, and excerpt wins.\n// More candidates raises the ceiling — what the shortlist could contain —\n// while starving the re-ranker of the text it needs to rank with. At 150\n// characters a candidate is barely more than its title, and the result is\n// worse than no re-ranking at all. Raise k only alongside the state\n// budget, never instead of the excerpt.\nexport const DEFAULT_SHORTLIST = 30\nexport const DEFAULT_EXCERPT_CHARS = 900\n\nexport interface RerankCandidate {\n id: string\n title: string\n tags?: string[]\n excerpt: string\n}\n\nexport interface RerankInput {\n query: string\n candidates: RerankCandidate[]\n /** Per-candidate excerpt budget. See DEFAULT_EXCERPT_CHARS — this is\n * the lever that actually moves accuracy. */\n excerptChars?: number\n}\n\nexport function rerankState(input: RerankInput): StateValue {\n const budget = input.excerptChars ?? DEFAULT_EXCERPT_CHARS\n return {\n query: input.query,\n candidates: input.candidates.map((c) => ({\n id: c.id,\n title: c.title,\n tags: c.tags?.length ? c.tags.join(\", \") : null,\n excerpt: clip(c.excerpt, budget),\n })),\n }\n}\n\n/** Built per call, because the option set IS the candidate set. */\nexport function rerankQuestions(candidates: RerankCandidate[]) {\n const criteria: Record<string, string> = {}\n for (const c of candidates) criteria[c.id] = c.title\n return {\n best: choice(criteria, \"Which candidate answers the query?\"),\n answerable: noul(\"Do any of the candidates answer the query?\"),\n }\n}\n\nexport type RerankAnswers = AnswersFor<ReturnType<typeof rerankQuestions>>\n\nexport interface RerankResult {\n /** Candidate ids, best first, by the Choice's per-option probability. */\n ranked: string[]\n scores: Record<string, number>\n /** P(the shortlist contains an answer at all). */\n answerable: number\n /** The Choice's own confidence — flat means it could not separate them. */\n confidence: number\n}\n\n/**\n * Turn one answer into a ranking.\n *\n * Ties keep the incoming order, so a Choice that genuinely cannot\n * separate the candidates degrades to BM25's ranking rather than to an\n * arbitrary one.\n */\nexport function toRanking(\n answers: RerankAnswers,\n candidates: RerankCandidate[],\n): RerankResult {\n const best = answers.best as ChoiceAnswer\n const scores: Record<string, number> = {}\n for (const c of candidates) scores[c.id] = best.probabilities[c.id] ?? 0\n\n const order = new Map(candidates.map((c, i) => [c.id, i]))\n const ranked = [...candidates.map((c) => c.id)].sort((a, b) => {\n const diff = scores[b] - scores[a]\n return diff !== 0 ? diff : (order.get(a) ?? 0) - (order.get(b) ?? 0)\n })\n\n return {\n ranked,\n scores,\n answerable: (answers.answerable as NoulAnswer).noul,\n confidence: best.confidence,\n }\n}\n\nfunction clip(text: string, max: number): string {\n const flat = String(text ?? \"\").replace(/\\s+/g, \" \").trim()\n return flat.length > max ? flat.slice(0, max) : flat\n}\n"],"mappings":"sDAAAA,IAwBO,IAAMC,EAAmB,cAiBnBC,EAAoB,GACpBC,EAAwB,IAiB9B,SAASC,EAAYC,EAAgC,CAC1D,IAAMC,EAASD,EAAM,cAAgBF,EACrC,MAAO,CACL,MAAOE,EAAM,MACb,WAAYA,EAAM,WAAW,IAAKE,IAAO,CACvC,GAAIA,EAAE,GACN,MAAOA,EAAE,MACT,KAAMA,EAAE,MAAM,OAASA,EAAE,KAAK,KAAK,IAAI,EAAI,KAC3C,QAASC,EAAKD,EAAE,QAASD,CAAM,CACjC,EAAE,CACJ,CACF,CAGO,SAASG,EAAgBC,EAA+B,CAC7D,IAAMC,EAAmC,CAAC,EAC1C,QAAWJ,KAAKG,EAAYC,EAASJ,EAAE,EAAE,EAAIA,EAAE,MAC/C,MAAO,CACL,KAAMK,EAAOD,EAAU,oCAAoC,EAC3D,WAAYE,EAAK,4CAA4C,CAC/D,CACF,CAqBO,SAASC,EACdC,EACAL,EACc,CACd,IAAMM,EAAOD,EAAQ,KACfE,EAAiC,CAAC,EACxC,QAAWV,KAAKG,EAAYO,EAAOV,EAAE,EAAE,EAAIS,EAAK,cAAcT,EAAE,EAAE,GAAK,EAEvE,IAAMW,EAAQ,IAAI,IAAIR,EAAW,IAAI,CAACH,EAAGY,IAAM,CAACZ,EAAE,GAAIY,CAAC,CAAC,CAAC,EAMzD,MAAO,CACL,OANa,CAAC,GAAGT,EAAW,IAAKH,GAAMA,EAAE,EAAE,CAAC,EAAE,KAAK,CAACa,EAAGC,IAAM,CAC7D,IAAMC,EAAOL,EAAOI,CAAC,EAAIJ,EAAOG,CAAC,EACjC,OAAOE,IAAS,EAAIA,GAAQJ,EAAM,IAAIE,CAAC,GAAK,IAAMF,EAAM,IAAIG,CAAC,GAAK,EACpE,CAAC,EAIC,OAAAJ,EACA,WAAaF,EAAQ,WAA0B,KAC/C,WAAYC,EAAK,UACnB,CACF,CAEA,SAASR,EAAKe,EAAcC,EAAqB,CAC/C,IAAMC,EAAO,OAAOF,GAAQ,EAAE,EAAE,QAAQ,OAAQ,GAAG,EAAE,KAAK,EAC1D,OAAOE,EAAK,OAASD,EAAMC,EAAK,MAAM,EAAGD,CAAG,EAAIC,CAClD","names":["init_questions","WIKI_RERANK_SEAT","DEFAULT_SHORTLIST","DEFAULT_EXCERPT_CHARS","rerankState","input","budget","c","clip","rerankQuestions","candidates","criteria","choice","noul","toRanking","answers","best","scores","order","i","a","b","diff","text","max","flat"]}
@@ -0,0 +1,2 @@
1
+ import{b as o}from"./chunk-FIOB3MEX.js";function g(e){if(!e)return null;let s=l(e);if(s!==void 0)return s;let c=e.match(/```(?:json)?\s*([\s\S]*?)```/);if(c){let n=l(c[1]);if(n!==void 0)return n}let f=[["{","}"],["[","]"]].map(([n,i])=>({open:n,close:i,at:e.indexOf(n)})).filter(n=>n.at>=0).sort((n,i)=>n.at-i.at);for(let{open:n,close:i}of f){let t=a(e,n,i);if(t!==null){let r=l(t);if(r!==void 0)return r}}return null}function l(e){try{return JSON.parse(e.trim())}catch{return}}function a(e,s,c){let f=e.indexOf(s);if(f<0)return null;let n=0,i=!1,t=!1;for(let r=f;r<e.length;r++){let u=e[r];if(t){t=!1;continue}if(u==="\\"){i&&(t=!0);continue}if(u==='"'){i=!i;continue}if(!i){if(u===s)n++;else if(u===c&&(n--,n===0))return e.slice(f,r+1)}}return null}var d=o(()=>{"use strict"});export{g as a,d as b};
2
+ //# sourceMappingURL=chunk-AJONZWLT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/extract-json.ts"],"sourcesContent":["// Pull a JSON value out of text a model wrote.\n//\n// Consolidated from four byte-identical copies (src/graph/classifier.ts,\n// src/agents/context-planner.ts, src/commands/graph.ts, and\n// src/daemon/board-dashboard.ts). Callers that return prose keep their own\n// bespoke variants — this is for call sites whose whole reply is supposed\n// to be a structured value.\n//\n// One behavioural difference from the copies it replaces: the balanced-brace\n// scan is string-aware. The old version counted every `{` and `}` including\n// ones inside string literals, so a perfectly valid `{\"glob\": \"src/**/{a,b}\"}`\n// truncated at the wrong byte and returned null.\n\n/** Parse `text` as JSON, tolerating code fences and surrounding prose.\n * Returns `null` when nothing parseable is found — never throws. */\nexport function extractJson<T = any>(text: string): T | null {\n if (!text) return null\n\n const direct = tryParse<T>(text)\n if (direct !== undefined) return direct\n\n const fenced = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/)\n if (fenced) {\n const parsed = tryParse<T>(fenced[1])\n if (parsed !== undefined) return parsed\n }\n\n // Last-ditch: the first balanced object or array in the text. Whichever\n // bracket appears first wins, so `here: [{\"a\":1}]` yields the array and\n // not the object nested inside it.\n const pairs = ([[\"{\", \"}\"], [\"[\", \"]\"]] as const)\n .map(([open, close]) => ({ open, close, at: text.indexOf(open) }))\n .filter((p) => p.at >= 0)\n .sort((a, b) => a.at - b.at)\n\n for (const { open, close } of pairs) {\n const slice = balancedSlice(text, open, close)\n if (slice !== null) {\n const parsed = tryParse<T>(slice)\n if (parsed !== undefined) return parsed\n }\n }\n\n return null\n}\n\nfunction tryParse<T>(text: string): T | undefined {\n try {\n return JSON.parse(text.trim()) as T\n } catch {\n return undefined\n }\n}\n\nfunction balancedSlice(text: string, open: string, close: string): string | null {\n const start = text.indexOf(open)\n if (start < 0) return null\n\n let depth = 0\n let inString = false\n let escaped = false\n\n for (let i = start; i < text.length; i++) {\n const ch = text[i]\n\n if (escaped) {\n escaped = false\n continue\n }\n if (ch === \"\\\\\") {\n if (inString) escaped = true\n continue\n }\n if (ch === '\"') {\n inString = !inString\n continue\n }\n if (inString) continue\n\n if (ch === open) depth++\n else if (ch === close) {\n depth--\n if (depth === 0) return text.slice(start, i + 1)\n }\n }\n\n return null\n}\n"],"mappings":"wCAeO,SAASA,EAAqBC,EAAwB,CAC3D,GAAI,CAACA,EAAM,OAAO,KAElB,IAAMC,EAASC,EAAYF,CAAI,EAC/B,GAAIC,IAAW,OAAW,OAAOA,EAEjC,IAAME,EAASH,EAAK,MAAM,8BAA8B,EACxD,GAAIG,EAAQ,CACV,IAAMC,EAASF,EAAYC,EAAO,CAAC,CAAC,EACpC,GAAIC,IAAW,OAAW,OAAOA,EAMnC,IAAMC,EAAS,CAAC,CAAC,IAAK,GAAG,EAAG,CAAC,IAAK,GAAG,CAAC,EACnC,IAAI,CAAC,CAACC,EAAMC,CAAK,KAAO,CAAE,KAAAD,EAAM,MAAAC,EAAO,GAAIP,EAAK,QAAQM,CAAI,CAAE,EAAE,EAChE,OAAQE,GAAMA,EAAE,IAAM,CAAC,EACvB,KAAK,CAACC,EAAGC,IAAMD,EAAE,GAAKC,EAAE,EAAE,EAE7B,OAAW,CAAE,KAAAJ,EAAM,MAAAC,CAAM,IAAKF,EAAO,CACnC,IAAMM,EAAQC,EAAcZ,EAAMM,EAAMC,CAAK,EAC7C,GAAII,IAAU,KAAM,CAClB,IAAMP,EAASF,EAAYS,CAAK,EAChC,GAAIP,IAAW,OAAW,OAAOA,GAIrC,OAAO,IACT,CAEA,SAASF,EAAYF,EAA6B,CAChD,GAAI,CACF,OAAO,KAAK,MAAMA,EAAK,KAAK,CAAC,CAC/B,MAAE,CACA,MACF,CACF,CAEA,SAASY,EAAcZ,EAAcM,EAAcC,EAA8B,CAC/E,IAAMM,EAAQb,EAAK,QAAQM,CAAI,EAC/B,GAAIO,EAAQ,EAAG,OAAO,KAEtB,IAAIC,EAAQ,EACRC,EAAW,GACXC,EAAU,GAEd,QAASC,EAAIJ,EAAOI,EAAIjB,EAAK,OAAQiB,IAAK,CACxC,IAAMC,EAAKlB,EAAKiB,CAAC,EAEjB,GAAID,EAAS,CACXA,EAAU,GACV,SAEF,GAAIE,IAAO,KAAM,CACXH,IAAUC,EAAU,IACxB,SAEF,GAAIE,IAAO,IAAK,CACdH,EAAW,CAACA,EACZ,SAEF,GAAI,CAAAA,GAEJ,GAAIG,IAAOZ,EAAMQ,YACRI,IAAOX,IACdO,IACIA,IAAU,GAAG,OAAOd,EAAK,MAAMa,EAAOI,EAAI,CAAC,GAInD,OAAO,IACT,CAvFA,IAAAE,EAAAC,EAAA","names":["extractJson","text","direct","tryParse","fenced","parsed","pairs","open","close","p","a","b","slice","balancedSlice","start","depth","inString","escaped","i","ch","init_extract_json","__esmMin"]}
@@ -0,0 +1,2 @@
1
+ import{b as h}from"./chunk-FIOB3MEX.js";function p(i){let o=i.filter(l=>l.incumbent!==void 0),a=o.length;if(a===0)return{n:0,agree:0,rate:0,kappa:0};let t=0,n=new Map,r=new Map;for(let l of o)l.predicted===l.incumbent&&t++,n.set(l.predicted,(n.get(l.predicted)??0)+1),r.set(l.incumbent,(r.get(l.incumbent)??0)+1);let e=t/a,u=0;for(let[l,f]of n)u+=f/a*((r.get(l)??0)/a);let c=u<1?(e-u)/(1-u):1;return{n:a,agree:t,rate:e,kappa:c}}function s(i,o=10,a="width"){let t=i.filter(e=>e.truth!==void 0);if(t.length===0)return[];let n=[...t].sort((e,u)=>e.confidence-u.confidence);return(a==="mass"?v(n,o):y(n,o)).filter(e=>e.length>0).map(e=>{let u=e.map(c=>c.confidence);return{lo:Math.min(...u),hi:Math.max(...u),n:e.length,meanConfidence:m(u),accuracy:m(e.map(c=>c.predicted===c.truth?1:0))}})}function d(i,o=10,a="width"){let t=s(i,o,a),n=t.reduce((r,e)=>r+e.n,0);return n===0?0:t.reduce((r,e)=>r+e.n/n*Math.abs(e.accuracy-e.meanConfidence),0)}function g(i,o=10,a="width"){let t=s(i,o,a);return t.length===0?0:Math.max(...t.map(n=>Math.abs(n.accuracy-n.meanConfidence)))}function R(i){let o=i.filter(a=>a.truth!==void 0);return o.length===0?0:m(o.map(a=>{let t=0;for(let[n,r]of Object.entries(a.probabilities)){let e=n===a.truth?1:0;t+=(r-e)**2}return t}))}function b(i,o=1e-12){let a=i.filter(t=>t.truth!==void 0);return a.length===0?0:m(a.map(t=>{let n=t.probabilities[t.truth]??0;return-Math.log(Math.max(n,o))}))}function M(i,o=20){let a=i.filter(r=>r.truth!==void 0),t=a.length;if(t===0)return[];let n=[];for(let r=0;r<=o;r++){let e=r/o,u=a.filter(c=>c.confidence>=e);n.push({threshold:e,coverage:u.length/t,accuracy:u.length>0?m(u.map(c=>c.predicted===c.truth?1:0)):0,n:u.length})}return n}function x(i,o){let a=Math.max(o,1e-6),t={},n=0;for(let[r,e]of Object.entries(i)){let u=Math.pow(Math.max(e,0),1/a);t[r]=u,n+=u}if(n<=0){let r=Object.keys(i);for(let e of r)t[e]=1/r.length;return t}for(let r of Object.keys(t))t[r]=t[r]/n;return t}function w(i){let o=i.filter(e=>e.truth!==void 0),a=b(o);if(o.length===0)return{temperature:1,nll:0,nllBefore:0};let t=e=>m(o.map(u=>{let c=x(u.probabilities,e);return-Math.log(Math.max(c[u.truth]??0,1e-12))})),n=1,r=t(1);for(let e=.1;e<=10.0001;e+=.1){let u=t(e);u<r&&(r=u,n=e)}for(let e=Math.max(.01,n-.1);e<=n+.1;e+=.01){let u=t(e);u<r&&(r=u,n=e)}return{temperature:Number(n.toFixed(3)),nll:r,nllBefore:a}}function G(i,o,a=1e3,t=.05,n=Math.random){if(i.length===0)return{lo:0,hi:0};let r=[];for(let e=0;e<a;e++){let u=[];for(let c=0;c<i.length;c++)u.push(i[Math.floor(n()*i.length)]);r.push(o(u))}return r.sort((e,u)=>e-u),{lo:r[Math.floor(t/2*r.length)],hi:r[Math.min(r.length-1,Math.floor((1-t/2)*r.length))]}}function C(i,o={}){let a=o.minN??100,t=o.bins??10,n=i.filter(e=>e.truth!==void 0),r={insufficient:n.length<a,n:i.length,nLabeled:n.length,minN:a,agreement:p(i)};return r.insufficient?r:{...r,accuracy:m(n.map(e=>e.predicted===e.truth?1:0)),ece:d(n,t,"width"),eceEqualMass:d(n,t,"mass"),eceInterval:G(n,e=>d(e,t,"width"),o.bootstrap??1e3,.05,o.rng),mce:g(n,t,"width"),brier:R(n),logLoss:b(n),bins:s(n,t,"width"),binsEqualMass:s(n,t,"mass"),coverage:M(n),temperature:w(n)}}function y(i,o){let a=Array.from({length:o},()=>[]);for(let t of i){let n=Math.min(o-1,Math.max(0,Math.floor(t.confidence*o)));a[n].push(t)}return a}function v(i,o){let a=Array.from({length:o},()=>[]);return i.forEach((t,n)=>{a[Math.min(o-1,Math.floor(n*o/i.length))].push(t)}),a}function m(i){return i.length===0?0:i.reduce((o,a)=>o+a,0)/i.length}var B=h(()=>{});export{p as a,s as b,d as c,g as d,R as e,b as f,M as g,x as h,w as i,G as j,C as k,B as l};
2
+ //# sourceMappingURL=chunk-BH3GTCZ6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/decisions/calibration.ts"],"sourcesContent":["import type { GradedRow } from \"./store\"\n\n// Does the confidence mean anything?\n//\n// Every metric here is a pure function of GradedRow[]. Three choices are\n// deliberate and worth defending:\n//\n// 1. `minN` (default 100). Below it the report refuses to print an ECE.\n// An expected calibration error computed on thirty rows is noise, and\n// a noisy number on a dashboard gets acted on exactly as if it were a\n// real one.\n//\n// 2. `coverageCurve` is the headline, not ECE. The question a call site\n// actually asks is \"what threshold do I set for autoRunThreshold\" —\n// and that is answered by accuracy-at-threshold against the fraction\n// of traffic retained, not by a single aggregate score.\n//\n// 3. Equal-mass bins are reported alongside equal-width. Equal-width ECE\n// is dominated by whichever bin holds most of the mass, which for an\n// overconfident model is the top bin — precisely the regime we are\n// trying to detect.\n\nexport interface AgreementResult {\n n: number\n agree: number\n rate: number\n /** Cohen's kappa: agreement corrected for what chance alone would give.\n * Two systems that both answer \"no\" 95% of the time agree 90% of the\n * time while sharing no information, and kappa says so. */\n kappa: number\n}\n\nexport function agreement(rows: GradedRow[]): AgreementResult {\n const usable = rows.filter((r) => r.incumbent !== undefined)\n const n = usable.length\n if (n === 0) return { n: 0, agree: 0, rate: 0, kappa: 0 }\n\n let agree = 0\n const predicted = new Map<string, number>()\n const incumbent = new Map<string, number>()\n for (const row of usable) {\n if (row.predicted === row.incumbent) agree++\n predicted.set(row.predicted, (predicted.get(row.predicted) ?? 0) + 1)\n incumbent.set(row.incumbent!, (incumbent.get(row.incumbent!) ?? 0) + 1)\n }\n\n const observed = agree / n\n let expected = 0\n for (const [label, count] of predicted) {\n expected += (count / n) * ((incumbent.get(label) ?? 0) / n)\n }\n const kappa = expected < 1 ? (observed - expected) / (1 - expected) : 1\n\n return { n, agree, rate: observed, kappa }\n}\n\nexport interface ReliabilityBin {\n lo: number\n hi: number\n n: number\n meanConfidence: number\n accuracy: number\n}\n\nexport type BinScheme = \"width\" | \"mass\"\n\nexport function reliabilityBins(\n rows: GradedRow[],\n bins = 10,\n scheme: BinScheme = \"width\",\n): ReliabilityBin[] {\n const labeled = rows.filter((r) => r.truth !== undefined)\n if (labeled.length === 0) return []\n\n const sorted = [...labeled].sort((a, b) => a.confidence - b.confidence)\n const groups: GradedRow[][] =\n scheme === \"mass\" ? equalMassGroups(sorted, bins) : equalWidthGroups(sorted, bins)\n\n return groups\n .filter((g) => g.length > 0)\n .map((group) => {\n const confidences = group.map((r) => r.confidence)\n return {\n lo: Math.min(...confidences),\n hi: Math.max(...confidences),\n n: group.length,\n meanConfidence: mean(confidences),\n accuracy: mean(group.map((r) => (r.predicted === r.truth ? 1 : 0))),\n }\n })\n}\n\n/** Expected calibration error: the mass-weighted gap between how confident\n * the model was and how often it was right. Zero is perfect. */\nexport function ece(rows: GradedRow[], bins = 10, scheme: BinScheme = \"width\"): number {\n const grouped = reliabilityBins(rows, bins, scheme)\n const total = grouped.reduce((sum, b) => sum + b.n, 0)\n if (total === 0) return 0\n return grouped.reduce(\n (sum, b) => sum + (b.n / total) * Math.abs(b.accuracy - b.meanConfidence),\n 0,\n )\n}\n\n/** The worst single bin. ECE can look fine while one region is badly wrong. */\nexport function mce(rows: GradedRow[], bins = 10, scheme: BinScheme = \"width\"): number {\n const grouped = reliabilityBins(rows, bins, scheme)\n if (grouped.length === 0) return 0\n return Math.max(...grouped.map((b) => Math.abs(b.accuracy - b.meanConfidence)))\n}\n\n/** Multiclass Brier score. A proper scoring rule, so unlike ECE it cannot\n * be gamed by a model that reports a constant confidence. Lower is better. */\nexport function brier(rows: GradedRow[]): number {\n const labeled = rows.filter((r) => r.truth !== undefined)\n if (labeled.length === 0) return 0\n return mean(\n labeled.map((row) => {\n let sum = 0\n for (const [label, p] of Object.entries(row.probabilities)) {\n const actual = label === row.truth ? 1 : 0\n sum += (p - actual) ** 2\n }\n return sum\n }),\n )\n}\n\nexport function logLoss(rows: GradedRow[], epsilon = 1e-12): number {\n const labeled = rows.filter((r) => r.truth !== undefined)\n if (labeled.length === 0) return 0\n return mean(\n labeled.map((row) => {\n const p = row.probabilities[row.truth!] ?? 0\n return -Math.log(Math.max(p, epsilon))\n }),\n )\n}\n\nexport interface CoveragePoint {\n threshold: number\n /** Fraction of rows at or above the threshold. */\n coverage: number\n /** Accuracy among those rows. */\n accuracy: number\n n: number\n}\n\n/** The curve a call site actually reads: \"if I only act above confidence X,\n * how often am I right, and how much traffic do I still handle?\" */\nexport function coverageCurve(rows: GradedRow[], steps = 20): CoveragePoint[] {\n const labeled = rows.filter((r) => r.truth !== undefined)\n const total = labeled.length\n if (total === 0) return []\n\n const points: CoveragePoint[] = []\n for (let i = 0; i <= steps; i++) {\n const threshold = i / steps\n const kept = labeled.filter((r) => r.confidence >= threshold)\n points.push({\n threshold,\n coverage: kept.length / total,\n accuracy: kept.length > 0 ? mean(kept.map((r) => (r.predicted === r.truth ? 1 : 0))) : 0,\n n: kept.length,\n })\n }\n return points\n}\n\n/** Sharpen or soften a distribution: p^(1/T), renormalized. T > 1 softens\n * (the fix for overconfidence), T < 1 sharpens. */\nexport function applyTemperature(\n probs: Record<string, number>,\n temperature: number,\n): Record<string, number> {\n const t = Math.max(temperature, 1e-6)\n const scaled: Record<string, number> = {}\n let sum = 0\n for (const [label, p] of Object.entries(probs)) {\n const v = Math.pow(Math.max(p, 0), 1 / t)\n scaled[label] = v\n sum += v\n }\n if (sum <= 0) {\n const labels = Object.keys(probs)\n for (const label of labels) scaled[label] = 1 / labels.length\n return scaled\n }\n for (const label of Object.keys(scaled)) scaled[label] = scaled[label] / sum\n return scaled\n}\n\nexport interface TemperatureFit {\n temperature: number\n nll: number\n nllBefore: number\n}\n\n/** Fit the single parameter that turns a well-formed distribution into a\n * calibrated one ON THIS TRAFFIC. This, not the backend, is where\n * calibration comes from — which is why an uncalibrated backend plus a few\n * hundred labeled rows is a defensible position and an uncalibrated\n * backend alone is not.\n *\n * Coarse grid then local refinement: one parameter, a smooth convex-ish\n * objective, and a few hundred rows. Anything fancier is false precision. */\nexport function fitTemperature(rows: GradedRow[]): TemperatureFit {\n const labeled = rows.filter((r) => r.truth !== undefined)\n const nllBefore = logLoss(labeled)\n if (labeled.length === 0) return { temperature: 1, nll: 0, nllBefore: 0 }\n\n const nllAt = (t: number) =>\n mean(\n labeled.map((row) => {\n const scaled = applyTemperature(row.probabilities, t)\n return -Math.log(Math.max(scaled[row.truth!] ?? 0, 1e-12))\n }),\n )\n\n let best = 1\n let bestNll = nllAt(1)\n for (let t = 0.1; t <= 10.0001; t += 0.1) {\n const value = nllAt(t)\n if (value < bestNll) {\n bestNll = value\n best = t\n }\n }\n for (let t = Math.max(0.01, best - 0.1); t <= best + 0.1; t += 0.01) {\n const value = nllAt(t)\n if (value < bestNll) {\n bestNll = value\n best = t\n }\n }\n\n return { temperature: Number(best.toFixed(3)), nll: bestNll, nllBefore }\n}\n\nexport interface Interval {\n lo: number\n hi: number\n}\n\n/** Percentile bootstrap. Without an interval, a difference between two\n * backends' ECEs is not a result. */\nexport function bootstrapInterval(\n rows: GradedRow[],\n statistic: (sample: GradedRow[]) => number,\n resamples = 1000,\n alpha = 0.05,\n rng: () => number = Math.random,\n): Interval {\n if (rows.length === 0) return { lo: 0, hi: 0 }\n const values: number[] = []\n for (let i = 0; i < resamples; i++) {\n const sample: GradedRow[] = []\n for (let j = 0; j < rows.length; j++) {\n sample.push(rows[Math.floor(rng() * rows.length)])\n }\n values.push(statistic(sample))\n }\n values.sort((a, b) => a - b)\n return {\n lo: values[Math.floor((alpha / 2) * values.length)],\n hi: values[Math.min(values.length - 1, Math.floor((1 - alpha / 2) * values.length))],\n }\n}\n\nexport interface CalibrationReport {\n insufficient: boolean\n n: number\n nLabeled: number\n minN: number\n agreement: AgreementResult\n accuracy?: number\n ece?: number\n eceEqualMass?: number\n eceInterval?: Interval\n mce?: number\n brier?: number\n logLoss?: number\n bins?: ReliabilityBin[]\n binsEqualMass?: ReliabilityBin[]\n coverage?: CoveragePoint[]\n temperature?: TemperatureFit\n}\n\nexport function calibrationReport(\n rows: GradedRow[],\n opts: { minN?: number; bins?: number; bootstrap?: number; rng?: () => number } = {},\n): CalibrationReport {\n const minN = opts.minN ?? 100\n const bins = opts.bins ?? 10\n const labeled = rows.filter((r) => r.truth !== undefined)\n const base: CalibrationReport = {\n insufficient: labeled.length < minN,\n n: rows.length,\n nLabeled: labeled.length,\n minN,\n agreement: agreement(rows),\n }\n\n // Agreement needs no ground truth, so it is always reported. Everything\n // that does need ground truth is withheld until there is enough of it.\n if (base.insufficient) return base\n\n return {\n ...base,\n accuracy: mean(labeled.map((r) => (r.predicted === r.truth ? 1 : 0))),\n ece: ece(labeled, bins, \"width\"),\n eceEqualMass: ece(labeled, bins, \"mass\"),\n eceInterval: bootstrapInterval(\n labeled,\n (sample) => ece(sample, bins, \"width\"),\n opts.bootstrap ?? 1000,\n 0.05,\n opts.rng,\n ),\n mce: mce(labeled, bins, \"width\"),\n brier: brier(labeled),\n logLoss: logLoss(labeled),\n bins: reliabilityBins(labeled, bins, \"width\"),\n binsEqualMass: reliabilityBins(labeled, bins, \"mass\"),\n coverage: coverageCurve(labeled),\n temperature: fitTemperature(labeled),\n }\n}\n\nfunction equalWidthGroups(sorted: GradedRow[], bins: number): GradedRow[][] {\n const groups: GradedRow[][] = Array.from({ length: bins }, () => [])\n for (const row of sorted) {\n const index = Math.min(bins - 1, Math.max(0, Math.floor(row.confidence * bins)))\n groups[index].push(row)\n }\n return groups\n}\n\nfunction equalMassGroups(sorted: GradedRow[], bins: number): GradedRow[][] {\n const groups: GradedRow[][] = Array.from({ length: bins }, () => [])\n sorted.forEach((row, i) => {\n groups[Math.min(bins - 1, Math.floor((i * bins) / sorted.length))].push(row)\n })\n return groups\n}\n\nfunction mean(values: number[]): number {\n if (values.length === 0) return 0\n return values.reduce((a, b) => a + b, 0) / values.length\n}\n"],"mappings":"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","names":["agreement","rows","usable","r","n","agree","predicted","incumbent","row","observed","expected","label","count","kappa","reliabilityBins","bins","scheme","labeled","sorted","a","b","equalMassGroups","equalWidthGroups","g","group","confidences","mean","ece","grouped","total","sum","mce","brier","p","actual","logLoss","epsilon","coverageCurve","steps","points","i","threshold","kept","applyTemperature","probs","temperature","t","scaled","v","labels","fitTemperature","nllBefore","nllAt","best","bestNll","value","bootstrapInterval","statistic","resamples","alpha","rng","values","sample","j","calibrationReport","opts","minN","base","groups","index","init_calibration","__esmMin"]}