agentix-cli 0.26.0 → 0.27.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 (268) hide show
  1. package/dist/{App-BPNHIGUX.js → App-U52IPUK2.js} +2 -2
  2. package/dist/{ChatApp-6XSSZB4U.js → ChatApp-XP4OMHPL.js} +2 -2
  3. package/dist/agent-V2CA4TXD.js +2 -0
  4. package/dist/article-fields-L4D2BOGY.js +2 -0
  5. package/dist/article-quality-44ONVGLN.js +3 -0
  6. package/dist/article-quality-44ONVGLN.js.map +1 -0
  7. package/dist/{audit-JU3HWISB.js → audit-4245CX6P.js} +2 -2
  8. package/dist/backfill-MTD2B62I.js +6 -0
  9. package/dist/backfill-MTD2B62I.js.map +1 -0
  10. package/dist/{board-dashboard-M3372FLO.js → board-dashboard-TTMAYRLG.js} +1407 -447
  11. package/dist/board-dashboard-TTMAYRLG.js.map +1 -0
  12. package/dist/{builtin-FRKAQMFS.js → builtin-B67DMJ3M.js} +2 -2
  13. package/dist/calibration-ILS5OI44.js +2 -0
  14. package/dist/chunk-2T5W3ETS.js +5 -0
  15. package/dist/{chunk-K2CAPYES.js.map → chunk-2T5W3ETS.js.map} +1 -1
  16. package/dist/chunk-3SCPRYJB.js +5 -0
  17. package/dist/chunk-3SCPRYJB.js.map +1 -0
  18. package/dist/chunk-4BR7D2OU.js +36 -0
  19. package/dist/chunk-4BR7D2OU.js.map +1 -0
  20. package/dist/{chunk-P4VWIVKN.js → chunk-52ZPELD2.js} +403 -29
  21. package/dist/chunk-52ZPELD2.js.map +1 -0
  22. package/dist/{chunk-5U35WAZF.js → chunk-77OV7346.js} +6 -6
  23. package/dist/chunk-77OV7346.js.map +1 -0
  24. package/dist/chunk-AJ5RMU7X.js +2 -0
  25. package/dist/chunk-AJ5RMU7X.js.map +1 -0
  26. package/dist/chunk-AJONZWLT.js +2 -0
  27. package/dist/chunk-AJONZWLT.js.map +1 -0
  28. package/dist/chunk-AX2PWSRT.js +114 -0
  29. package/dist/chunk-AX2PWSRT.js.map +1 -0
  30. package/dist/chunk-BH3GTCZ6.js +2 -0
  31. package/dist/chunk-BH3GTCZ6.js.map +1 -0
  32. package/dist/chunk-BPIRO4YD.js +126 -0
  33. package/dist/chunk-BPIRO4YD.js.map +1 -0
  34. package/dist/chunk-CJQQIRPD.js +13 -0
  35. package/dist/chunk-CJQQIRPD.js.map +1 -0
  36. package/dist/chunk-DCDQZR7I.js +24 -0
  37. package/dist/chunk-DCDQZR7I.js.map +1 -0
  38. package/dist/chunk-EVWEG3VD.js +3 -0
  39. package/dist/chunk-EVWEG3VD.js.map +1 -0
  40. package/dist/chunk-F4HZTZHW.js +2 -0
  41. package/dist/chunk-F4HZTZHW.js.map +1 -0
  42. package/dist/chunk-F6CNF7V3.js +25 -0
  43. package/dist/chunk-F6CNF7V3.js.map +1 -0
  44. package/dist/chunk-FIEJDZVC.js +121 -0
  45. package/dist/chunk-FIEJDZVC.js.map +1 -0
  46. package/dist/chunk-FIOB3MEX.js +2 -0
  47. package/dist/{chunk-H5D7ATXS.js → chunk-FKBGJYWQ.js} +5 -5
  48. package/dist/chunk-FKBGJYWQ.js.map +1 -0
  49. package/dist/chunk-GDWJUGB5.js +9 -0
  50. package/dist/chunk-GDWJUGB5.js.map +1 -0
  51. package/dist/{chunk-BVGJSPW4.js → chunk-IB3F7VBE.js} +7 -7
  52. package/dist/{chunk-BVGJSPW4.js.map → chunk-IB3F7VBE.js.map} +1 -1
  53. package/dist/chunk-IBUSGCLQ.js +109 -0
  54. package/dist/chunk-IBUSGCLQ.js.map +1 -0
  55. package/dist/{chunk-LDHPMJ7M.js → chunk-IWMW5432.js} +3 -3
  56. package/dist/chunk-IWMW5432.js.map +1 -0
  57. package/dist/chunk-K33GIBSE.js +2 -0
  58. package/dist/chunk-K33GIBSE.js.map +1 -0
  59. package/dist/chunk-L2IZPR6P.js +45 -0
  60. package/dist/chunk-L2IZPR6P.js.map +1 -0
  61. package/dist/chunk-L2WSPY6S.js +2 -0
  62. package/dist/chunk-L2WSPY6S.js.map +1 -0
  63. package/dist/chunk-LCIREYTD.js +54 -0
  64. package/dist/chunk-LCIREYTD.js.map +1 -0
  65. package/dist/chunk-LNRB5MCU.js +530 -0
  66. package/dist/chunk-LNRB5MCU.js.map +1 -0
  67. package/dist/chunk-OPHIXXGI.js +157 -0
  68. package/dist/chunk-OPHIXXGI.js.map +1 -0
  69. package/dist/{chunk-JTJIPNXY.js → chunk-PNWNVOEZ.js} +1 -1
  70. package/dist/chunk-PNWNVOEZ.js.map +1 -0
  71. package/dist/{chunk-V3U4OF7L.js → chunk-UFAGYX73.js} +45 -47
  72. package/dist/chunk-UFAGYX73.js.map +1 -0
  73. package/dist/{chunk-DJEZ2HVU.js → chunk-VDMYBPYB.js} +1 -1
  74. package/dist/chunk-VDMYBPYB.js.map +1 -0
  75. package/dist/chunk-VTE7L6LO.js +5 -0
  76. package/dist/{chunk-O6YPEOQF.js.map → chunk-VTE7L6LO.js.map} +1 -1
  77. package/dist/chunk-W5C2GDNC.js +32 -0
  78. package/dist/{chunk-JP5IEXR7.js.map → chunk-W5C2GDNC.js.map} +1 -1
  79. package/dist/chunk-WPMX3VGI.js +3 -0
  80. package/dist/chunk-WPMX3VGI.js.map +1 -0
  81. package/dist/chunk-WZ72HX5C.js +1182 -0
  82. package/dist/chunk-WZ72HX5C.js.map +1 -0
  83. package/dist/chunk-ZTEU5JVQ.js +2 -0
  84. package/dist/chunk-ZTEU5JVQ.js.map +1 -0
  85. package/dist/{chunk-2WVX3LEC.js → chunk-ZVP6GB4G.js} +1 -1
  86. package/dist/chunk-ZVP6GB4G.js.map +1 -0
  87. package/dist/cli.js +1 -1
  88. package/dist/cli.js.map +1 -1
  89. package/dist/client-PX25MD47.js +2 -0
  90. package/dist/{compaction-NWEMOSHA.js → compaction-FD4R23HZ.js} +4 -4
  91. package/dist/config-HL5F36V4.js +2 -0
  92. package/dist/config-mutator-HBX53OMJ.js +2 -0
  93. package/dist/{conflict-detector-D7VIYPDI.js → conflict-detector-ZPOT3M2C.js} +2 -2
  94. package/dist/conflict-detector-ZPOT3M2C.js.map +1 -0
  95. package/dist/context-planner-AQHJMVY2.js +17 -0
  96. package/dist/context-planner-AQHJMVY2.js.map +1 -0
  97. package/dist/debug-3MEUO2P2.js +2 -0
  98. package/dist/{discover-XJXQXXIO.js → discover-D4VVRNAI.js} +2 -2
  99. package/dist/discover-D4VVRNAI.js.map +1 -0
  100. package/dist/doctor-PBAH6XL3.js +2 -0
  101. package/dist/editor-chat-OB7IQOB5.js +137 -0
  102. package/dist/editor-chat-OB7IQOB5.js.map +1 -0
  103. package/dist/entry-triage-LK34TSQD.js +2 -0
  104. package/dist/entry-triage-LK34TSQD.js.map +1 -0
  105. package/dist/facts-YVEJOM7O.js +22 -0
  106. package/dist/facts-YVEJOM7O.js.map +1 -0
  107. package/dist/heal-FVLBHYP7.js +2 -0
  108. package/dist/index.d.ts +1016 -65
  109. package/dist/index.js +13 -13
  110. package/dist/index.js.map +1 -1
  111. package/dist/{ingest-whatsapp-LZE62INA.js → ingest-whatsapp-NS4OWDOU.js} +2 -2
  112. package/dist/loader-4ZGTK7LD.js +2 -0
  113. package/dist/loader-BOKE5M5S.js +2 -0
  114. package/dist/memory-extract-F5ZHWY5E.js +2 -0
  115. package/dist/{migrate-v2-QO7SLKIM.js → migrate-v2-V4WN2VVM.js} +2 -2
  116. package/dist/ntfy-X7EPB3TG.js +4 -0
  117. package/dist/ntfy-X7EPB3TG.js.map +1 -0
  118. package/dist/processes-WU23U2OJ.js +2 -0
  119. package/dist/program-YGXVCV2Y.js +2 -0
  120. package/dist/{projects-api-KRME2YKZ.js → projects-api-QE6L65SK.js} +2 -2
  121. package/dist/{projects-mutate-3NHVG437.js → projects-mutate-MY7JTLSZ.js} +2 -2
  122. package/dist/providers-KO2DODIO.js +2 -0
  123. package/dist/query-ZKTFJMNE.js +2 -0
  124. package/dist/questions-4B4KSPXG.js +3 -0
  125. package/dist/questions-4B4KSPXG.js.map +1 -0
  126. package/dist/recipes-7S4MC5OJ.js +2 -0
  127. package/dist/registry-PSZDPFZK.js +2 -0
  128. package/dist/review-candidates-AEUXRQQC.js +4 -0
  129. package/dist/review-candidates-AEUXRQQC.js.map +1 -0
  130. package/dist/review-store-B4YE3EFK.js +4 -0
  131. package/dist/review-store-B4YE3EFK.js.map +1 -0
  132. package/dist/{rotation-memo-B3EXXSEH.js → rotation-memo-7T75BLEX.js} +2 -2
  133. package/dist/routing-4PV66BK6.js +2 -0
  134. package/dist/routing-4PV66BK6.js.map +1 -0
  135. package/dist/runner-YRBVNYTY.js +2 -0
  136. package/dist/scheduler-GZZAN6ZG.js +2 -0
  137. package/dist/seat-VZ7AVO27.js +2 -0
  138. package/dist/select-F5I5PO2O.js +2 -0
  139. package/dist/select-F5I5PO2O.js.map +1 -0
  140. package/dist/store-MCOA6N4F.js +2 -0
  141. package/dist/{subagent-WV7QKQ3L.js → subagent-2SJHSSJS.js} +2 -2
  142. package/dist/{surface-usage-PRL6Z4U3.js → surface-usage-NS74AXSE.js} +2 -2
  143. package/dist/timers-PCB4ZIBD.js +2 -0
  144. package/dist/triage-backtest-JNO7RKX7.js +2 -0
  145. package/dist/triage-backtest-JNO7RKX7.js.map +1 -0
  146. package/dist/types-H5ENIUIT.js +2 -0
  147. package/dist/types-OIFU3KSQ.js +2 -0
  148. package/dist/web/workflow-editor.global.js +1542 -0
  149. package/dist/web/workflow-editor.global.js.map +1 -0
  150. package/dist/{whatsapp-state-XMTCSRXU.js → whatsapp-state-6D6FHHD2.js} +2 -2
  151. package/dist/wiki-N5SMP3DT.js +2 -0
  152. package/dist/wiki-N5SMP3DT.js.map +1 -0
  153. package/dist/workflows/templates/branching.yaml +1 -1
  154. package/dist/{workspace-setup-TBQAHYHJ.js → workspace-setup-B3F3TUDE.js} +2 -2
  155. package/dist/workspace-setup-B3F3TUDE.js.map +1 -0
  156. package/package.json +1 -1
  157. package/dist/agent-5QMITZT6.js +0 -2
  158. package/dist/architect-SEPWMWS4.js +0 -2
  159. package/dist/board-dashboard-M3372FLO.js.map +0 -1
  160. package/dist/chunk-2WVX3LEC.js.map +0 -1
  161. package/dist/chunk-3WQFCIB6.js +0 -24
  162. package/dist/chunk-3WQFCIB6.js.map +0 -1
  163. package/dist/chunk-4YCH6IZV.js +0 -2
  164. package/dist/chunk-53NRX2NA.js +0 -2
  165. package/dist/chunk-53NRX2NA.js.map +0 -1
  166. package/dist/chunk-5U35WAZF.js.map +0 -1
  167. package/dist/chunk-BFXONUUN.js +0 -108
  168. package/dist/chunk-BFXONUUN.js.map +0 -1
  169. package/dist/chunk-BFZUG66X.js +0 -45
  170. package/dist/chunk-BFZUG66X.js.map +0 -1
  171. package/dist/chunk-BTHHSY7D.js +0 -13
  172. package/dist/chunk-BTHHSY7D.js.map +0 -1
  173. package/dist/chunk-D46VZ7K7.js +0 -116
  174. package/dist/chunk-D46VZ7K7.js.map +0 -1
  175. package/dist/chunk-DJEZ2HVU.js.map +0 -1
  176. package/dist/chunk-E5CXCI33.js +0 -155
  177. package/dist/chunk-E5CXCI33.js.map +0 -1
  178. package/dist/chunk-FDWOECJY.js +0 -54
  179. package/dist/chunk-FDWOECJY.js.map +0 -1
  180. package/dist/chunk-H5D7ATXS.js.map +0 -1
  181. package/dist/chunk-HR4JSRZS.js +0 -3
  182. package/dist/chunk-HR4JSRZS.js.map +0 -1
  183. package/dist/chunk-ISEBLHWX.js +0 -118
  184. package/dist/chunk-ISEBLHWX.js.map +0 -1
  185. package/dist/chunk-JP5IEXR7.js +0 -32
  186. package/dist/chunk-JTJIPNXY.js.map +0 -1
  187. package/dist/chunk-K2CAPYES.js +0 -5
  188. package/dist/chunk-LDHPMJ7M.js.map +0 -1
  189. package/dist/chunk-METYYZKQ.js +0 -1115
  190. package/dist/chunk-METYYZKQ.js.map +0 -1
  191. package/dist/chunk-MTAPOCGA.js +0 -47
  192. package/dist/chunk-MTAPOCGA.js.map +0 -1
  193. package/dist/chunk-O6YPEOQF.js +0 -5
  194. package/dist/chunk-P4VWIVKN.js.map +0 -1
  195. package/dist/chunk-SR3X25TN.js +0 -3
  196. package/dist/chunk-SR3X25TN.js.map +0 -1
  197. package/dist/chunk-UHE5FCPB.js +0 -431
  198. package/dist/chunk-UHE5FCPB.js.map +0 -1
  199. package/dist/chunk-V3U4OF7L.js.map +0 -1
  200. package/dist/chunk-VJUTQAPJ.js +0 -2
  201. package/dist/chunk-VJUTQAPJ.js.map +0 -1
  202. package/dist/chunk-VT5XYFDD.js +0 -126
  203. package/dist/chunk-VT5XYFDD.js.map +0 -1
  204. package/dist/client-HGKAC6VP.js +0 -2
  205. package/dist/config-A4RWEJHV.js +0 -2
  206. package/dist/config-mutator-MNSFUN7D.js +0 -2
  207. package/dist/conflict-detector-D7VIYPDI.js.map +0 -1
  208. package/dist/context-planner-45GEWKGL.js +0 -17
  209. package/dist/context-planner-45GEWKGL.js.map +0 -1
  210. package/dist/debug-N3B5NVJU.js +0 -2
  211. package/dist/discover-XJXQXXIO.js.map +0 -1
  212. package/dist/doctor-3Q36ZFE6.js +0 -2
  213. package/dist/heal-HZ3EQD52.js +0 -2
  214. package/dist/loader-5CA3O5GM.js +0 -2
  215. package/dist/loader-6IHUCPVO.js +0 -2
  216. package/dist/memory-extract-AENFVVO5.js +0 -2
  217. package/dist/processes-UIC4XXA6.js +0 -2
  218. package/dist/program-SAUNRCCD.js +0 -2
  219. package/dist/providers-L27BJ5A6.js +0 -2
  220. package/dist/query-HZYYRCLU.js +0 -2
  221. package/dist/recipes-EPLE2SNT.js +0 -2
  222. package/dist/registry-HK3WQ7BS.js +0 -2
  223. package/dist/runner-BFYDWPUO.js +0 -2
  224. package/dist/scheduler-6T2SU5ST.js +0 -2
  225. package/dist/store-I3HEWVLQ.js +0 -2
  226. package/dist/timers-5LPZN55J.js +0 -2
  227. package/dist/types-VECTMYTO.js +0 -2
  228. package/dist/types-Y6ZCZ52Z.js +0 -2
  229. package/dist/wiki-M6YNRFC4.js +0 -2
  230. /package/dist/{App-BPNHIGUX.js.map → App-U52IPUK2.js.map} +0 -0
  231. /package/dist/{ChatApp-6XSSZB4U.js.map → ChatApp-XP4OMHPL.js.map} +0 -0
  232. /package/dist/{agent-5QMITZT6.js.map → agent-V2CA4TXD.js.map} +0 -0
  233. /package/dist/{architect-SEPWMWS4.js.map → article-fields-L4D2BOGY.js.map} +0 -0
  234. /package/dist/{audit-JU3HWISB.js.map → audit-4245CX6P.js.map} +0 -0
  235. /package/dist/{builtin-FRKAQMFS.js.map → builtin-B67DMJ3M.js.map} +0 -0
  236. /package/dist/{chunk-4YCH6IZV.js.map → calibration-ILS5OI44.js.map} +0 -0
  237. /package/dist/{client-HGKAC6VP.js.map → chunk-FIOB3MEX.js.map} +0 -0
  238. /package/dist/{config-A4RWEJHV.js.map → client-PX25MD47.js.map} +0 -0
  239. /package/dist/{compaction-NWEMOSHA.js.map → compaction-FD4R23HZ.js.map} +0 -0
  240. /package/dist/{config-mutator-MNSFUN7D.js.map → config-HL5F36V4.js.map} +0 -0
  241. /package/dist/{debug-N3B5NVJU.js.map → config-mutator-HBX53OMJ.js.map} +0 -0
  242. /package/dist/{doctor-3Q36ZFE6.js.map → debug-3MEUO2P2.js.map} +0 -0
  243. /package/dist/{heal-HZ3EQD52.js.map → doctor-PBAH6XL3.js.map} +0 -0
  244. /package/dist/{loader-5CA3O5GM.js.map → heal-FVLBHYP7.js.map} +0 -0
  245. /package/dist/{ingest-whatsapp-LZE62INA.js.map → ingest-whatsapp-NS4OWDOU.js.map} +0 -0
  246. /package/dist/{loader-6IHUCPVO.js.map → loader-4ZGTK7LD.js.map} +0 -0
  247. /package/dist/{memory-extract-AENFVVO5.js.map → loader-BOKE5M5S.js.map} +0 -0
  248. /package/dist/{processes-UIC4XXA6.js.map → memory-extract-F5ZHWY5E.js.map} +0 -0
  249. /package/dist/{migrate-v2-QO7SLKIM.js.map → migrate-v2-V4WN2VVM.js.map} +0 -0
  250. /package/dist/{program-SAUNRCCD.js.map → processes-WU23U2OJ.js.map} +0 -0
  251. /package/dist/{providers-L27BJ5A6.js.map → program-YGXVCV2Y.js.map} +0 -0
  252. /package/dist/{projects-api-KRME2YKZ.js.map → projects-api-QE6L65SK.js.map} +0 -0
  253. /package/dist/{projects-mutate-3NHVG437.js.map → projects-mutate-MY7JTLSZ.js.map} +0 -0
  254. /package/dist/{query-HZYYRCLU.js.map → providers-KO2DODIO.js.map} +0 -0
  255. /package/dist/{recipes-EPLE2SNT.js.map → query-ZKTFJMNE.js.map} +0 -0
  256. /package/dist/{registry-HK3WQ7BS.js.map → recipes-7S4MC5OJ.js.map} +0 -0
  257. /package/dist/{runner-BFYDWPUO.js.map → registry-PSZDPFZK.js.map} +0 -0
  258. /package/dist/{rotation-memo-B3EXXSEH.js.map → rotation-memo-7T75BLEX.js.map} +0 -0
  259. /package/dist/{scheduler-6T2SU5ST.js.map → runner-YRBVNYTY.js.map} +0 -0
  260. /package/dist/{store-I3HEWVLQ.js.map → scheduler-GZZAN6ZG.js.map} +0 -0
  261. /package/dist/{surface-usage-PRL6Z4U3.js.map → seat-VZ7AVO27.js.map} +0 -0
  262. /package/dist/{timers-5LPZN55J.js.map → store-MCOA6N4F.js.map} +0 -0
  263. /package/dist/{subagent-WV7QKQ3L.js.map → subagent-2SJHSSJS.js.map} +0 -0
  264. /package/dist/{types-VECTMYTO.js.map → surface-usage-NS74AXSE.js.map} +0 -0
  265. /package/dist/{types-Y6ZCZ52Z.js.map → timers-PCB4ZIBD.js.map} +0 -0
  266. /package/dist/{wiki-M6YNRFC4.js.map → types-H5ENIUIT.js.map} +0 -0
  267. /package/dist/{workspace-setup-TBQAHYHJ.js.map → types-OIFU3KSQ.js.map} +0 -0
  268. /package/dist/{whatsapp-state-XMTCSRXU.js.map → whatsapp-state-6D6FHHD2.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import{c as s,d as l,e as c,f as p}from"./chunk-LDHPMJ7M.js";var n=`:root {
1
+ import{c as b,d as h,e as u,f as m}from"./chunk-IWMW5432.js";var p=`:root {
2
2
  /* --- Brand (agentina) --------------------------------------------- */
3
3
  --ax-blue: #2979FF;
4
4
  --ax-blue-d: #1B5FD9;
@@ -14,6 +14,12 @@ import{c as s,d as l,e as c,f as p}from"./chunk-LDHPMJ7M.js";var n=`:root {
14
14
  --ax-red-t: #FEECEC;
15
15
  --ax-red-e: #F9C1C1;
16
16
 
17
+ /* Ink steps. Amber and red are legible as FILLS, not as small text:
18
+ #FFB300 on white is ~1.8:1 and #F23A3A ~3.6:1, both under 4.5:1. Use
19
+ these wherever the colour carries words rather than area. */
20
+ --ax-amber-ink: #8a5a00;
21
+ --ax-red-ink: #a52020;
22
+
17
23
  /* --- Surfaces + text ---------------------------------------------- */
18
24
  --ax-bg: #f8f9fa;
19
25
  --ax-bg-elev: #f1f3f4;
@@ -51,6 +57,9 @@ import{c as s,d as l,e as c,f as p}from"./chunk-LDHPMJ7M.js";var n=`:root {
51
57
  --ax-shadow-ok: 0 4px 0 var(--ax-green-d);
52
58
 
53
59
  /* --- Spacing ------------------------------------------------------- */
60
+ /* Width of the ask-an-agent drawer. Lives here because pages reflow
61
+ around it; the drawer overwrites it on :root when resized. */
62
+ --ax-as-w: 420px;
54
63
  --ax-pad: 16px;
55
64
  --ax-pad-sm: 10px;
56
65
  --ax-gap: 12px;
@@ -95,6 +104,8 @@ import{c as s,d as l,e as c,f as p}from"./chunk-LDHPMJ7M.js";var n=`:root {
95
104
  --ax-red: #FF6B6B;
96
105
  --ax-red-t: #3a1c1c;
97
106
  --ax-red-e: #6b2f2f;
107
+ --ax-amber-ink: #FFC948;
108
+ --ax-red-ink: #FF8A8A;
98
109
 
99
110
  --ax-bg: #14161a;
100
111
  --ax-bg-elev: #191c21;
@@ -129,7 +140,367 @@ pre, code, .ax-mono {
129
140
  a { color: var(--ax-accent); text-decoration: none; font-weight: 600; }
130
141
  a:hover { color: var(--ax-accent-2); text-decoration: underline; }
131
142
  .ax-muted { color: var(--ax-muted); }
132
- .ax-accent { color: var(--ax-accent); }`;var x=`
143
+ .ax-accent { color: var(--ax-accent); }`;var v=`
144
+ .ax-as-dock{position:fixed;bottom:0;left:50%;transform:translateX(-50%);z-index:59;
145
+ display:flex;flex-direction:column;align-items:center;
146
+ width:min(620px,calc(100vw - 36px));transition:transform 160ms ease}
147
+ /* Centred in the space that is left, not in the space the drawer covers. */
148
+ body.ax-as-open .ax-as-dock{left:calc((100vw - var(--ax-as-w)) / 2)}
149
+ /* Tucked: slide out of the way but leave the grip, or there is nothing to
150
+ click to bring it back. */
151
+ .ax-as-dock.is-tucked{transform:translateX(-50%) translateY(calc(100% - 26px))}
152
+ body.ax-as-open .ax-as-dock.is-tucked{transform:translateX(-50%) translateY(calc(100% - 26px))}
153
+ @media (prefers-reduced-motion:reduce){.ax-as-dock{transition:none}}
154
+ .ax-as-dock__grip{width:56px;height:20px;margin-bottom:-2px;cursor:pointer;
155
+ background:var(--ax-surface);border:var(--ax-border-w) solid var(--ax-border);
156
+ border-bottom:none;border-radius:var(--ax-radius) var(--ax-radius) 0 0;padding:0;
157
+ display:flex;align-items:center;justify-content:center}
158
+ .ax-as-dock__grip::before{content:"";width:22px;height:3px;border-radius:2px;
159
+ background:var(--ax-border-2)}
160
+ .ax-as-dock__grip:hover::before{background:var(--ax-accent)}
161
+ .ax-as-bar{display:flex;gap:8px;align-items:center;width:100%;padding:8px;
162
+ background:var(--ax-surface);border:var(--ax-border-w) solid var(--ax-border);
163
+ border-radius:var(--ax-radius-lg) var(--ax-radius-lg) 0 0;border-bottom:none;
164
+ box-shadow:var(--ax-shadow-lg)}
165
+ .ax-as-bar input{flex:1;min-width:0;font:inherit;font-size:13px;padding:7px 10px;
166
+ border-radius:var(--ax-radius-sm);border:var(--ax-border-w) solid var(--ax-border-2);
167
+ background:var(--ax-bg);color:var(--ax-text)}
168
+ .ax-as-bar button{flex:none}
169
+ /* Keep the last row of a page clear of the dock. */
170
+ body{padding-bottom:86px}
171
+ @media (max-width:640px){.ax-as-dock{width:calc(100vw - 24px)}
172
+ body.ax-as-open .ax-as-dock{left:50%}}
173
+ .ax-as-handle{position:fixed;right:0;top:50%;transform:translateY(-50%);z-index:60;
174
+ display:flex;align-items:center;gap:6px;writing-mode:vertical-rl;
175
+ background:var(--ax-surface);color:var(--ax-text);cursor:pointer;
176
+ border:var(--ax-border-w) solid var(--ax-border);border-right:none;
177
+ border-radius:var(--ax-radius) 0 0 var(--ax-radius);padding:14px 7px;
178
+ font:inherit;font-size:12px;font-weight:600;box-shadow:var(--ax-shadow)}
179
+ .ax-as-handle:hover{background:var(--ax-surface-2)}
180
+ /* Open pushes the page over rather than covering it: a drawer that hides the
181
+ rows you are asking about is worse than no drawer. Below 900px there is no
182
+ room to give, so it overlays. */
183
+ body.ax-as-open{padding-right:var(--ax-as-w)}
184
+ @media (max-width:900px){body.ax-as-open{padding-right:0}}
185
+ .ax-as{position:fixed;top:0;right:0;height:100vh;width:var(--ax-as-w);max-width:92vw;z-index:61;
186
+ display:flex;flex-direction:column;background:var(--ax-surface);
187
+ border-left:var(--ax-border-w) solid var(--ax-border);
188
+ transform:translateX(100%);transition:transform 160ms ease}
189
+ .ax-as.is-open{transform:translateX(0)}
190
+ @media (prefers-reduced-motion:reduce){.ax-as{transition:none}}
191
+ .ax-as__grip{position:absolute;left:0;top:0;bottom:0;width:6px;cursor:col-resize;
192
+ background:transparent}
193
+ .ax-as__grip:hover,.ax-as__grip:focus-visible{background:var(--ax-accent)}
194
+ .ax-as__head{display:flex;align-items:center;gap:8px;padding:12px 14px;
195
+ border-bottom:var(--ax-border-w) solid var(--ax-border)}
196
+ .ax-as__title{font-size:13px;font-weight:600;flex:1}
197
+ .ax-as__x{background:none;border:none;color:var(--ax-text-2);cursor:pointer;font:inherit;
198
+ font-size:18px;line-height:1;padding:0 4px}
199
+ .ax-as__icon{background:var(--ax-surface-2);border:1px solid var(--ax-border-2);color:var(--ax-text-2);
200
+ cursor:pointer;font:inherit;font-size:11.5px;font-weight:600;padding:3px 9px;
201
+ border-radius:var(--ax-radius-pill)}
202
+ .ax-as__icon:hover{color:var(--ax-text);background:var(--ax-surface-3)}
203
+ .ax-as__icon.is-on{background:var(--ax-blue-t);border-color:var(--ax-blue-e);color:var(--ax-blue-d)}
204
+ .ax-as__hist{border-bottom:var(--ax-border-w) solid var(--ax-border);max-height:44vh;overflow:auto}
205
+ .ax-as__hist-empty{padding:12px 14px;font-size:12px;color:var(--ax-text-2)}
206
+ .ax-as__hist-list{list-style:none;margin:0;padding:0}
207
+ .ax-as__hist-list li{display:flex;align-items:center;gap:8px;padding:9px 14px;
208
+ border-bottom:1px solid var(--ax-border);cursor:pointer}
209
+ .ax-as__hist-list li:hover{background:var(--ax-surface-2)}
210
+ .ax-as__hist-list li.is-on{background:var(--ax-blue-t)}
211
+ .ax-as__hist-t{flex:1;min-width:0;font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
212
+ .ax-as__hist-m{font-family:var(--ax-mono);font-size:10.5px;color:var(--ax-text-2);flex:none}
213
+ .ax-as__hist-x{background:none;border:none;color:var(--ax-text-2);cursor:pointer;font-size:15px;
214
+ line-height:1;padding:0 2px;flex:none}
215
+ .ax-as__pending{opacity:0.75}
216
+ /* Rendered markdown inside a bubble: tight enough not to look like a page. */
217
+ .ax-as__md{white-space:normal}
218
+ .ax-as__md p{margin:0 0 8px}
219
+ .ax-as__md p:last-child{margin-bottom:0}
220
+ .ax-as__md ul,.ax-as__md ol{margin:0 0 8px;padding-left:20px}
221
+ .ax-as__md li{margin:2px 0}
222
+ .ax-as__md code{font-family:var(--ax-mono);font-size:11.5px;background:var(--ax-surface-3);
223
+ border:1px solid var(--ax-border);border-radius:4px;padding:0 4px}
224
+ .ax-as__md pre{margin:0 0 8px;padding:9px 11px;overflow-x:auto;background:var(--ax-surface-3);
225
+ border:1px solid var(--ax-border);border-radius:var(--ax-radius-sm)}
226
+ .ax-as__md pre code{background:none;border:none;padding:0;font-size:11.5px}
227
+ .ax-as__md h1,.ax-as__md h2,.ax-as__md h3,.ax-as__md h4{font-size:13px;margin:10px 0 6px}
228
+ .ax-as__md blockquote{margin:0 0 8px;padding-left:10px;border-left:3px solid var(--ax-border-2);
229
+ color:var(--ax-text-2)}
230
+ .ax-as__md hr{border:none;border-top:1px solid var(--ax-border);margin:10px 0}
231
+ /* Tables get their own scroller so a wide one cannot stretch the drawer. */
232
+ .ax-as__md table{display:block;overflow-x:auto;border-collapse:collapse;margin:0 0 8px;font-size:12px}
233
+ .ax-as__md th,.ax-as__md td{border:1px solid var(--ax-border);padding:4px 8px;text-align:left;
234
+ white-space:nowrap}
235
+ .ax-as__md th{background:var(--ax-surface-3);font-weight:600}
236
+ .ax-as__pick{display:flex;gap:8px;padding:10px 14px;border-bottom:1px solid var(--ax-border)}
237
+ .ax-as__pick select{flex:1;min-width:0;font:inherit;font-size:12px;padding:5px 8px;
238
+ border-radius:var(--ax-radius-sm);border:var(--ax-border-w) solid var(--ax-border-2);
239
+ background:var(--ax-bg);color:var(--ax-text)}
240
+ .ax-as__ctx{padding:8px 14px;font-size:11.5px;color:var(--ax-text-2);
241
+ border-bottom:1px solid var(--ax-border);display:flex;align-items:center;gap:7px;flex-wrap:wrap}
242
+ .ax-as__ctx code{font-family:var(--ax-mono);font-size:11px}
243
+ .ax-as__log{flex:1;overflow:auto;padding:12px 14px;display:flex;flex-direction:column;gap:10px}
244
+ .ax-as__msg{font-size:13px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere;
245
+ padding:9px 12px;border-radius:var(--ax-radius);border:var(--ax-border-w) solid var(--ax-border)}
246
+ .ax-as__msg--me{background:var(--ax-blue-t);border-color:var(--ax-blue-e);align-self:flex-end;max-width:88%}
247
+ .ax-as__msg--them{background:var(--ax-surface-2)}
248
+ .ax-as__msg--err{background:var(--ax-red-t);border-color:var(--ax-red-e);color:var(--ax-red-ink)}
249
+ .ax-as__empty{color:var(--ax-text-2);font-size:12.5px;line-height:1.5}
250
+ .ax-as__foot{padding:10px 14px;border-top:var(--ax-border-w) solid var(--ax-border);
251
+ display:flex;gap:8px;align-items:flex-end}
252
+ .ax-as__foot textarea{flex:1;resize:none;font:inherit;font-size:13px;padding:8px 10px;
253
+ min-height:38px;max-height:140px;border-radius:var(--ax-radius-sm);
254
+ border:var(--ax-border-w) solid var(--ax-border-2);background:var(--ax-bg);color:var(--ax-text)}
255
+ `,f=`
256
+ <div class="ax-as-dock" id="ax-as-dock">
257
+ <button class="ax-as-dock__grip" id="ax-as-bar-toggle" type="button"
258
+ aria-expanded="true" aria-controls="ax-as-bar" title="Hide the composer"></button>
259
+ <form class="ax-as-bar" id="ax-as-bar">
260
+ <input id="ax-as-bar-input" autocomplete="off" placeholder="Ask an agent about this page&hellip;" aria-label="Ask an agent about this page">
261
+ <button class="ax-btn ax-btn--primary ax-btn--sm" type="submit" id="ax-as-bar-send">Ask</button>
262
+ </form>
263
+ </div>
264
+ <button class="ax-as-handle" id="ax-as-handle" aria-expanded="false" aria-controls="ax-as">Ask an agent</button>
265
+ <aside class="ax-as" id="ax-as" aria-label="Ask an agent" aria-hidden="true">
266
+ <div class="ax-as__grip" id="ax-as-grip" role="separator" aria-orientation="vertical"
267
+ tabindex="0" aria-label="Resize panel \u2014 arrow keys adjust"></div>
268
+ <div class="ax-as__head">
269
+ <span class="ax-as__title" id="ax-as-title">Ask an agent</span>
270
+ <button class="ax-as__icon" id="ax-as-hist" title="Past conversations">History</button>
271
+ <button class="ax-as__icon" id="ax-as-new" title="Start a new conversation">New</button>
272
+ <button class="ax-as__x" id="ax-as-close" title="Close">&times;</button>
273
+ </div>
274
+ <div class="ax-as__hist" id="ax-as-hist-panel" hidden>
275
+ <div class="ax-as__hist-empty" id="ax-as-hist-empty">No past conversations yet.</div>
276
+ <ul class="ax-as__hist-list" id="ax-as-hist-list"></ul>
277
+ </div>
278
+ <div class="ax-as__pick">
279
+ <select id="ax-as-agent" aria-label="Agent"><option value="">Loading agents&hellip;</option></select>
280
+ <select id="ax-as-node" aria-label="Node"><option value="">This node</option></select>
281
+ </div>
282
+ <div class="ax-as__ctx" id="ax-as-ctx"></div>
283
+ <div class="ax-as__log" id="ax-as-log">
284
+ <p class="ax-as__empty">Ask about what is on this page. What you are looking at &mdash; the page, its filters and the rows in view &mdash; goes with the question.</p>
285
+ </div>
286
+ </aside>`,w=String.raw`
287
+ (function(){
288
+ const $=id=>document.getElementById(id);
289
+ const panel=$('ax-as'), handle=$('ax-as-handle');
290
+ if(!panel||!handle)return;
291
+ const esc=s=>String(s==null?'':s).replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));
292
+ let busy=false;
293
+
294
+ const WMIN=320,WMAX=760;
295
+ function setWidth(px){
296
+ const w=Math.max(WMIN,Math.min(WMAX,Math.round(px)));
297
+ document.documentElement.style.setProperty('--ax-as-w',w+'px');
298
+ try{localStorage.setItem('ax-assistant-w',String(w))}catch{}
299
+ }
300
+ try{const w=Number(localStorage.getItem('ax-assistant-w'));if(w)setWidth(w)}catch{}
301
+
302
+ /* '0' means the operator closed it on purpose; null means they simply have
303
+ not opened it yet, and auto-open is still welcome. */
304
+ function userHid(){try{return localStorage.getItem('ax-assistant-open')==='0'}catch{return false}}
305
+ function open(v){
306
+ document.body.classList.toggle('ax-as-open',v);
307
+ panel.classList.toggle('is-open',v);
308
+ panel.setAttribute('aria-hidden',String(!v));
309
+ handle.setAttribute('aria-expanded',String(v));
310
+ try{localStorage.setItem('ax-assistant-open',v?'1':'0')}catch{}
311
+ if(v)paintCtx();
312
+ }
313
+ handle.onclick=()=>open(!panel.classList.contains('is-open'));
314
+ $('ax-as-close').onclick=()=>open(false);
315
+ document.addEventListener('keydown',e=>{if(e.key==='Escape'&&panel.classList.contains('is-open'))open(false);});
316
+ try{if(localStorage.getItem('ax-assistant-open')==='1')open(true)}catch{}
317
+
318
+ /* What the agent is told about where you are. Pages publish their own slice;
319
+ everything else still gets the path, so the question is never contextless. */
320
+ function pageContext(){
321
+ const base={path:location.pathname,tab:document.querySelector('.ax-topbar__tab.is-active')?.textContent?.trim()||null};
322
+ try{ if(typeof window.axPageContext==='function') return {...base,...(window.axPageContext()||{})}; }catch(e){}
323
+ return base;
324
+ }
325
+ function paintCtx(){
326
+ const c=pageContext();
327
+ // A page that names itself makes the raw path noise, and tab just
328
+ // repeats the nav — so drop both when the page supplies its own name.
329
+ const shownCtx={...c};
330
+ if(shownCtx.page){delete shownCtx.path;delete shownCtx.tab;}
331
+ const bits=Object.entries(shownCtx).filter(([k,v])=>v!=null&&v!=='').slice(0,4)
332
+ .map(([k,v])=>'<code>'+esc(k)+'='+esc(typeof v==='object'?(Array.isArray(v)?v.length+' items':JSON.stringify(v).slice(0,28)):v)+'</code>');
333
+ $('ax-as-ctx').innerHTML='Sending with your question: '+(bits.join(' ')||'<code>this page</code>');
334
+ }
335
+
336
+ /* A one-off line in the log, for errors raised before a thread exists. */
337
+ function add(kind,text){
338
+ const log=$('ax-as-log');
339
+ const empty=log.querySelector('.ax-as__empty'); if(empty)empty.remove();
340
+ const el=document.createElement('div');
341
+ el.className='ax-as__msg ax-as__msg--'+kind;
342
+ el.textContent=text;
343
+ log.appendChild(el); log.scrollTop=log.scrollHeight;
344
+ return el;
345
+ }
346
+
347
+ /* Who can answer, and where. Both pickers degrade to a plain statement
348
+ rather than an empty dropdown that looks like it is still loading. */
349
+ fetch('/api/agents').then(r=>r.json()).then(d=>{
350
+ const list=(Array.isArray(d)?d:(d.agents||[])).map(a=>a.id||a.name).filter(Boolean);
351
+ $('ax-as-agent').innerHTML=list.length
352
+ ?list.map(a=>'<option value="'+esc(a)+'">'+esc(a)+'</option>').join('')
353
+ :'<option value="">no agents on this node</option>';
354
+ }).catch(()=>{$('ax-as-agent').innerHTML='<option value="">agents unavailable</option>';});
355
+
356
+ fetch('/api/monitor').then(r=>r.json()).then(d=>{
357
+ const ns=(d.nodes||[]).filter(n=>n.ok);
358
+ if(ns.length>1)$('ax-as-node').innerHTML=ns.map(n=>'<option value="'+esc(n.url)+'">'+esc(n.name)+'</option>').join('');
359
+ }).catch(()=>{});
360
+
361
+ /* --- Conversation state ---------------------------------------------------
362
+ The thread lives on the daemon; the page only remembers which one it was
363
+ looking at. That is what survives a navigation: a turn started here keeps
364
+ running even after this page is gone, and the answer is waiting in the
365
+ thread when you come back. */
366
+ let threadId=null, poll=null;
367
+ try{threadId=localStorage.getItem('ax-assistant-thread')||null}catch{}
368
+ function setThread(id){
369
+ threadId=id;
370
+ try{id?localStorage.setItem('ax-assistant-thread',id):localStorage.removeItem('ax-assistant-thread')}catch{}
371
+ }
372
+
373
+ function bubble(m){
374
+ const el=document.createElement('div');
375
+ const kind=m.role==='user'?'me':(m.status==='error'?'err':'them');
376
+ el.className='ax-as__msg ax-as__msg--'+kind+(m.status==='pending'?' ax-as__pending':'');
377
+ if(m.status==='pending'){el.textContent='Thinking…';return el;}
378
+ const body=m.content||'(no reply)';
379
+ // The reply is markdown. markdownToHtml escapes before it marks up, which
380
+ // matters here: this text came from a model, not from us.
381
+ if(m.role==='assistant'&&m.status==='done'&&typeof markdownToHtml==='function'){
382
+ el.classList.add('ax-as__md');
383
+ try{el.innerHTML=markdownToHtml(body);}catch(e){el.textContent=body;}
384
+ }else el.textContent=body;
385
+ return el;
386
+ }
387
+ function renderMessages(msgs){
388
+ const log=$('ax-as-log');
389
+ log.innerHTML='';
390
+ if(!msgs.length){
391
+ log.innerHTML='<p class="ax-as__empty">Ask about what is on this page. What you are looking at &mdash; the page, its filters and the rows in view &mdash; goes with the question.</p>';
392
+ return;
393
+ }
394
+ for(const m of msgs)log.appendChild(bubble(m));
395
+ log.scrollTop=log.scrollHeight;
396
+ }
397
+
398
+ async function loadThread(id,{quiet}={}){
399
+ if(!id){renderMessages([]);$('ax-as-title').textContent='Ask an agent';return;}
400
+ try{
401
+ const r=await fetch('/api/assistant/thread?id='+encodeURIComponent(id));
402
+ if(!r.ok){setThread(null);renderMessages([]);return;}
403
+ const d=await r.json();
404
+ $('ax-as-title').textContent=d.thread.title||'Ask an agent';
405
+ if(d.thread.agentId)$('ax-as-agent').value=d.thread.agentId;
406
+ renderMessages(d.messages||[]);
407
+ const pending=(d.messages||[]).some(m=>m.status==='pending');
408
+ clearTimeout(poll);
409
+ if(pending)poll=setTimeout(()=>loadThread(id,{quiet:true}),1500);
410
+ else if(!quiet)loadHistory();
411
+ }catch(e){}
412
+ }
413
+
414
+ async function loadHistory(){
415
+ try{
416
+ const r=await fetch('/api/assistant/threads');
417
+ const d=await r.json();
418
+ const list=d.threads||[];
419
+ $('ax-as-hist-empty').hidden=list.length>0;
420
+ $('ax-as-hist-list').innerHTML=list.map(t=>
421
+ '<li data-thread="'+esc(t.id)+'"'+(t.id===threadId?' class="is-on"':'')+'>'
422
+ +'<span class="ax-as__hist-t">'+esc(t.title)+'</span>'
423
+ +'<span class="ax-as__hist-m">'+esc(t.agentId)+'</span>'
424
+ +'<button class="ax-as__hist-x" data-del="'+esc(t.id)+'" title="Delete">&times;</button></li>').join('');
425
+ }catch(e){}
426
+ }
427
+
428
+ $('ax-as-hist').onclick=()=>{
429
+ const panel2=$('ax-as-hist-panel');
430
+ const show=panel2.hidden;
431
+ panel2.hidden=!show;
432
+ $('ax-as-hist').classList.toggle('is-on',show);
433
+ if(show)loadHistory();
434
+ };
435
+ $('ax-as-new').onclick=()=>{
436
+ setThread(null);renderMessages([]);$('ax-as-title').textContent='Ask an agent';
437
+ $('ax-as-hist-panel').hidden=true;$('ax-as-hist').classList.remove('is-on');
438
+ $('ax-as-bar-input').focus();
439
+ };
440
+ $('ax-as-hist-list').addEventListener('click',async e=>{
441
+ const del=e.target.closest('[data-del]');
442
+ if(del){e.stopPropagation();
443
+ await fetch('/api/assistant/delete',{method:'POST',headers:{'Content-Type':'application/json'},
444
+ body:JSON.stringify({threadId:del.dataset.del})});
445
+ if(del.dataset.del===threadId){setThread(null);renderMessages([]);}
446
+ loadHistory();return;}
447
+ const li=e.target.closest('[data-thread]');
448
+ if(!li)return;
449
+ setThread(li.dataset.thread);
450
+ $('ax-as-hist-panel').hidden=true;$('ax-as-hist').classList.remove('is-on');
451
+ loadThread(threadId);loadHistory();
452
+ });
453
+
454
+ async function send(){
455
+ const input=$('ax-as-bar-input'); const text=input.value.trim();
456
+ if(!text||busy)return;
457
+ const agent=$('ax-as-agent').value;
458
+ if(!agent&&!threadId){add('err','Pick an agent first.');return;}
459
+ busy=true; $('ax-as-bar-send').disabled=true;
460
+ input.value='';
461
+ try{
462
+ const r=await fetch('/api/assistant',{method:'POST',headers:{'Content-Type':'application/json'},
463
+ body:JSON.stringify({threadId:threadId||undefined,agentId:agent,node:$('ax-as-node').value||undefined,
464
+ message:text,context:pageContext()})});
465
+ const d=await r.json();
466
+ if(!r.ok||d.error)throw new Error(d.error||('HTTP '+r.status));
467
+ setThread(d.threadId);
468
+ await loadThread(d.threadId);
469
+ }catch(e){add('err',e.message);}
470
+ finally{busy=false;$('ax-as-bar-send').disabled=false;input.focus();}
471
+ }
472
+
473
+ /* The floating bar is the fast path: type from anywhere on the page, and the
474
+ drawer opens to show the answer arriving. It shares one send(), so a
475
+ question asked here continues the same conversation as one asked there. */
476
+ $('ax-as-bar').addEventListener('submit',e=>{e.preventDefault();open(true);send();});
477
+
478
+ /* Focusing the composer is a statement of intent: show the conversation it
479
+ belongs to — unless the operator has deliberately closed the drawer, in
480
+ which case reopening it under them is the opposite of helpful. */
481
+ $('ax-as-bar-input').addEventListener('focus',()=>{if(!userHid())open(true);});
482
+
483
+ /* Tuck the whole dock away, and remember it. */
484
+ const dock=$('ax-as-dock');
485
+ function tuck(v){
486
+ dock.classList.toggle('is-tucked',v);
487
+ $('ax-as-bar-toggle').setAttribute('aria-expanded',String(!v));
488
+ $('ax-as-bar-toggle').title=v?'Show the composer':'Hide the composer';
489
+ try{localStorage.setItem('ax-assistant-bar',v?'0':'1')}catch{}
490
+ }
491
+ $('ax-as-bar-toggle').onclick=()=>tuck(!dock.classList.contains('is-tucked'));
492
+ try{if(localStorage.getItem('ax-assistant-bar')==='0')tuck(true)}catch{}
493
+
494
+ /* Restore whatever was in flight when the last page unloaded, and surface it:
495
+ an answer landing while you are on another page is the whole point. */
496
+ loadThread(threadId).then(()=>{
497
+ if(threadId&&!userHid()&&$('ax-as-log').querySelector('.ax-as__pending'))open(true);
498
+ });
499
+ loadHistory();
500
+ })();
501
+ `;function k(a){return"globalThis.__axBind=globalThis.__axBind||((n,f)=>{globalThis[f.name]=f;globalThis[n]=f;return f});"+Object.entries(a).map(([r,o])=>`const ${r}=globalThis.__axBind(${JSON.stringify(r)},${o.toString()});`).join("")}function _(a,e={}){let r=String(a??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;");return r=r.replace(/```(\w*)\n([\s\S]*?)```/g,(o,n,i)=>`<pre><code class="lang-${n}">${i.trim()}</code></pre>`),r=r.replace(/`([^`]+)`/g,"<code>$1</code>"),r=r.replace(/^(\|.+\|)\n(\|[-| :]+\|)\n((?:\|.+\|\n?)*)/gm,(o,n,i,d)=>{let l=n.split("|").filter(s=>s.trim()).map(s=>`<th>${s.trim()}</th>`).join(""),x=d.trim().split(`
502
+ `).map(s=>`<tr>${s.split("|").filter(c=>c.trim()).map(c=>`<td>${c.trim()}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${l}</tr></thead><tbody>${x}</tbody></table>`}),r=r.replace(/^#### (.+)$/gm,"<h4>$1</h4>"),r=r.replace(/^### (.+)$/gm,"<h3>$1</h3>"),r=r.replace(/^## (.+)$/gm,"<h2>$1</h2>"),r=r.replace(/^# (.+)$/gm,"<h1>$1</h1>"),r=r.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),r=r.replace(/\*(.+?)\*/g,"<em>$1</em>"),r=r.replace(/\[\[([^\]]+)\]\]/g,(o,n)=>{let[i,d]=n.split("|",2),l=i.trim().replace(/^\//,""),x=(d||i).trim();return e.wikilink?e.wikilink(l,x):x}),r=r.replace(/\[([^\]]+)\]\(([^)]+)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),r=r.replace(/^(>\s?.*(?:\n>\s?.*)*)/gm,o=>`<blockquote>${o.split(`
503
+ `).map(i=>i.replace(/^>\s?/,"")).join("<br>")}</blockquote>`),r=r.replace(/^[-*] \[( |x|X)\] (.+)$/gm,(o,n,i)=>`<li class="task">${n.toLowerCase()==="x"?"\u2611":"\u2610"} ${i}</li>`),r=r.replace(/^[-*] (.+)$/gm,"<li>$1</li>"),r=r.replace(/^\d+\. (.+)$/gm,'<li data-ordered="1">$1</li>'),r=r.replace(/(<li data-ordered="1">.*?<\/li>(?:\n?<li data-ordered="1">.*?<\/li>)*)/g,"<ol>$1</ol>"),r=r.replace(/((?:<li(?! data-ordered)[^>]*>.*?<\/li>\n?)+)/g,"<ul>$1</ul>"),r=r.replace(/ data-ordered="1"/g,""),r=r.replace(/^---$/gm,"<hr>"),r=r.replace(/\n\n+/g,"</p><p>"),r=`<p>${r}</p>`,r=r.replace(/<p>\s*(<(?:h[1-6]|ul|ol|blockquote|table|pre|hr)\b[^>]*>[\s\S]*?<\/(?:h[1-6]|ul|ol|blockquote|table|pre)>)\s*<\/p>/g,"$1"),r=r.replace(/<p>\s*<hr>\s*<\/p>/g,"<hr>"),r=r.replace(/<p>\s*<\/p>/g,""),r=r.replace(/<p>(<(?:h[1-4]|pre|table|ul|hr|div))/g,"$1"),r=r.replace(/(<\/(?:h[1-4]|pre|table|ul|hr|div)>)<\/p>/g,"$1"),r=r.replace(/<p>\s*<\/p>/g,""),r}var g=`
133
504
  /* --- Dots --- */
134
505
  .ax-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: var(--ax-muted); }
135
506
  .ax-dot--ok, .ax-dot--live { background: var(--ax-accent); }
@@ -1577,53 +1948,56 @@ textarea.ax-builder__inp { min-height: 80px; line-height: 1.5; resize: vertical;
1577
1948
  .ax-log-head, .ax-log-row { grid-template-columns: 8px 80px 1fr auto; }
1578
1949
  .ax-log-head span:nth-child(3), .ax-log-row .ax-who { display: none; }
1579
1950
  .ax-grid-2, .ax-grid-3 { grid-template-columns: 1fr; }
1580
- }`;function v(a){let e=`${n}
1581
- ${x}
1582
- ${l}${a.css?`
1583
- `+a.css:""}`,o=a.customHeader??(a.activeTab==="custom"?"":p({activeTab:a.activeTab,subtitle:a.subtitle,subheader:a.subheader,peers:a.peers,currentPeerId:a.currentPeerId})),t=a.noMain?a.body:`<main>${a.body}</main>`;return`<!DOCTYPE html>
1951
+ }`;function $(a){let e=`${p}
1952
+ ${g}
1953
+ ${h}
1954
+ ${v}${a.css?`
1955
+ `+a.css:""}`,r=a.customHeader??(a.activeTab==="custom"?"":m({activeTab:a.activeTab,subtitle:a.subtitle,subheader:a.subheader,peers:a.peers,currentPeerId:a.currentPeerId})),o=a.noMain?a.body:`<main>${a.body}</main>`;return`<!DOCTYPE html>
1584
1956
  <html lang="en">
1585
1957
  <head>
1586
1958
  <meta charset="utf-8">
1587
1959
  <meta name="viewport" content="width=device-width, initial-scale=1">
1588
- <title>${b(a.title)}</title>
1589
- ${s}
1960
+ <title>${z(a.title)}</title>
1961
+ ${b}
1590
1962
  ${a.headExtras||""}
1591
1963
  <style>${e}</style>
1592
1964
  </head>
1593
1965
  <body>
1966
+ ${r}
1594
1967
  ${o}
1595
- ${t}
1596
- ${c}
1968
+ ${a.noAssistant?"":f}
1969
+ ${u}
1597
1970
  ${a.scripts||""}
1971
+ ${a.noAssistant?"":`<script>${k({markdownToHtml:_})}${w}</script>`}
1598
1972
  </body>
1599
- </html>`}function b(a){return String(a||"").replace(/[<>&]/g,e=>({"<":"&lt;",">":"&gt;","&":"&amp;"})[e])}function r(a){return String(a??"").replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e])}function m(a,e={}){let o=["ax-btn",e.primary?"ax-btn--primary":"",e.ghost?"ax-btn--ghost":"",e.danger?"ax-btn--danger":"",e.extraClass||""].filter(Boolean).join(" ");return`<button ${[`type="${e.type||"button"}"`,`class="${o}"`,e.id?`id="${r(e.id)}"`:"",e.disabled?"disabled":"",e.onclick?`onclick="${r(e.onclick)}"`:""].filter(Boolean).join(" ")}>${r(a)}</button>`}function u(a){let e=`<label>${r(a.label)}${a.hint?` <span class="ax-hint">${a.hint}</span>`:""}</label>`,o="",t=[`name="${r(a.name)}"`,a.required?"required":"",a.readonly?"readonly":"",a.placeholder?`placeholder="${r(a.placeholder)}"`:"",a.extraAttrs||""].filter(Boolean).join(" ");if(a.type==="textarea")o=`<textarea ${t} rows="${a.rows||3}">${r(a.value||"")}</textarea>`;else if(a.type==="select"&&a.options){let d=a.options.map(i=>`<option value="${r(i.value)}"${i.selected?" selected":""}>${r(i.label)}</option>`).join("");o=`<select ${t}>${d}</select>`}else o=`<input type="${a.type||"text"}" ${t}`+(a.value!==void 0?` value="${r(a.value)}"`:"")+(a.pattern?` pattern="${r(a.pattern)}"`:"")+" />";return`<div class="ax-field">${e}${o}</div>`}function f(a){return`<div class="ax-row">${a.join("")}</div>`}function h(a,e,o){return`<section class="ax-step">
1600
- <div class="ax-step__head"><span class="ax-step__num">${r(String(a))}</span>${r(e)}</div>
1601
- ${o}
1602
- </section>`}function w(a){return`<div class="ax-page-head">
1603
- ${a.kicker?`<div class="ax-kicker">${r(a.kicker)}</div>`:""}
1604
- <h1>${r(a.title)}</h1>
1973
+ </html>`}function z(a){return String(a||"").replace(/[<>&]/g,e=>({"<":"&lt;",">":"&gt;","&":"&amp;"})[e])}function t(a){return String(a??"").replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e])}function S(a,e={}){let r=["ax-btn",e.primary?"ax-btn--primary":"",e.ghost?"ax-btn--ghost":"",e.danger?"ax-btn--danger":"",e.extraClass||""].filter(Boolean).join(" ");return`<button ${[`type="${e.type||"button"}"`,`class="${r}"`,e.id?`id="${t(e.id)}"`:"",e.disabled?"disabled":"",e.onclick?`onclick="${t(e.onclick)}"`:""].filter(Boolean).join(" ")}>${t(a)}</button>`}function T(a){let e=`<label>${t(a.label)}${a.hint?` <span class="ax-hint">${a.hint}</span>`:""}</label>`,r="",o=[`name="${t(a.name)}"`,a.required?"required":"",a.readonly?"readonly":"",a.placeholder?`placeholder="${t(a.placeholder)}"`:"",a.extraAttrs||""].filter(Boolean).join(" ");if(a.type==="textarea")r=`<textarea ${o} rows="${a.rows||3}">${t(a.value||"")}</textarea>`;else if(a.type==="select"&&a.options){let n=a.options.map(i=>`<option value="${t(i.value)}"${i.selected?" selected":""}>${t(i.label)}</option>`).join("");r=`<select ${o}>${n}</select>`}else r=`<input type="${a.type||"text"}" ${o}`+(a.value!==void 0?` value="${t(a.value)}"`:"")+(a.pattern?` pattern="${t(a.pattern)}"`:"")+" />";return`<div class="ax-field">${e}${r}</div>`}function C(a){return`<div class="ax-row">${a.join("")}</div>`}function A(a,e,r){return`<section class="ax-step">
1974
+ <div class="ax-step__head"><span class="ax-step__num">${t(String(a))}</span>${t(e)}</div>
1975
+ ${r}
1976
+ </section>`}function H(a){return`<div class="ax-page-head">
1977
+ ${a.kicker?`<div class="ax-kicker">${t(a.kicker)}</div>`:""}
1978
+ <h1>${t(a.title)}</h1>
1605
1979
  ${a.lead?`<p class="ax-lead">${a.lead}</p>`:""}
1606
- </div>`}function g(a){return`<div class="ax-health-card">
1980
+ </div>`}function y(a){return`<div class="ax-health-card">
1607
1981
  <div class="ax-hc-dot ax-hc-dot--${a.kind||"off"}"></div>
1608
1982
  <div class="ax-hc-txt">
1609
- <div class="ax-hc-num">${r(a.num)}</div>
1610
- <div class="ax-hc-lbl">${r(a.label)}</div>
1983
+ <div class="ax-hc-num">${t(a.num)}</div>
1984
+ <div class="ax-hc-lbl">${t(a.label)}</div>
1611
1985
  </div>
1612
- </div>`}function k(a){return`<div class="ax-health-strip">${a.map(g).join("")}</div>`}function y(a){return`<div class="ax-wit"${a.persistKey?` data-wit="${r(a.persistKey)}"`:""}>
1613
- <span class="ax-wit__icon">${r(a.icon||"?")}</span>
1986
+ </div>`}function O(a){return`<div class="ax-health-strip">${a.map(y).join("")}</div>`}function j(a){return`<div class="ax-wit"${a.persistKey?` data-wit="${t(a.persistKey)}"`:""}>
1987
+ <span class="ax-wit__icon">${t(a.icon||"?")}</span>
1614
1988
  <div>${a.bodyHtml}</div>
1615
1989
  <button class="ax-wit__dismiss" onclick="this.parentElement.style.display='none'">\xD7</button>
1616
- </div>`}function _(a){return`<div class="ax-section-head">
1990
+ </div>`}function I(a){return`<div class="ax-section-head">
1617
1991
  <div class="ax-section-head__icon">${a.icon}</div>
1618
1992
  <div class="ax-section-head__text">
1619
- <h2>${r(a.title)}</h2>
1620
- ${a.lead?`<p class="ax-lead">${r(a.lead)}</p>`:""}
1993
+ <h2>${t(a.title)}</h2>
1994
+ ${a.lead?`<p class="ax-lead">${t(a.lead)}</p>`:""}
1621
1995
  </div>
1622
1996
  ${a.actionHtml||""}
1623
- </div>`}function z(a){return`<div class="ax-sec-label"><h3>${r(a.label)}</h3>${a.rightHtml||""}</div>`}var $=`<div class="ax-toast" id="ax-toast">
1997
+ </div>`}function L(a){return`<div class="ax-sec-label"><h3>${t(a.label)}</h3>${a.rightHtml||""}</div>`}var B=`<div class="ax-toast" id="ax-toast">
1624
1998
  <svg class="ax-toast__icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6L9 17l-5-5"/></svg>
1625
1999
  <span id="ax-toast-msg">Copied</span>
1626
- </div>`,S=`
2000
+ </div>`,F=`
1627
2001
  let __axToastTimer;
1628
2002
  window.showToast = function(msg) {
1629
2003
  const el = document.getElementById('ax-toast');
@@ -1637,9 +2011,9 @@ ${a.scripts||""}
1637
2011
  window.copyText = function(_btn, text) {
1638
2012
  try { navigator.clipboard.writeText(text); } catch (e) {}
1639
2013
  window.showToast('Copied to clipboard');
1640
- };`,C=`
2014
+ };`,P=`
1641
2015
  window.toggleCard = function(btn) {
1642
2016
  const card = btn.closest('.ax-row-card');
1643
2017
  if (card) card.classList.toggle('is-open');
1644
- };`;export{v as a,r as b,m as c,u as d,f as e,h as f,w as g,k as h,y as i,_ as j,z as k,$ as l,S as m,C as n};
1645
- //# sourceMappingURL=chunk-P4VWIVKN.js.map
2018
+ };`;export{k as a,_ as b,$ as c,t as d,S as e,T as f,C as g,A as h,H as i,O as j,j as k,I as l,L as m,B as n,F as o,P as p};
2019
+ //# sourceMappingURL=chunk-52ZPELD2.js.map