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,17 +0,0 @@
1
- import"./chunk-4YCH6IZV.js";var S="claude-haiku-4-5-20251001",x=`You are a context planner for an AI agent. Given the user's current message and recent conversation tail, decide what historical context the agent needs.
2
-
3
- Output ONE JSON object on one line, no prose, no fences:
4
- { "recentTurns": number, "memory": { "include": boolean, "query": string }, "crossChat": boolean, "reasoning": string }
5
-
6
- Rules:
7
- - "recentTurns" in [0,6]. Short acknowledgments ("ok", "yes", "do it", "continue") need 2-3 turns to know what they refer to. New topics need 0. Technical follow-ups need 3-5.
8
- - "memory.include" = true only when the message likely references a person, past event, decision, or project the agent should recall. "memory.query" = 3-8 words distilling what to search for (leave "" when include=false).
9
- - "crossChat" = true only when the message references another chat ("DM", "the group", "earlier conversation", a peer agent's name). Most messages = false.
10
- - "reasoning" = one short phrase explaining the plan.
11
-
12
- Be conservative \u2014 unneeded context costs tokens. When in doubt, exclude.`;async function N(e){let s=Date.now(),o=e.timeoutMs??8e3,r=I(e.sessions,e.agentId,e.channel,e.chatId,4),t=[`Agent: ${e.agentId}`,`Channel: ${e.channel}`,r?`Recent conversation:
13
- ${r}`:"Recent conversation: (none \u2014 first message)","",`Current message: ${e.message.slice(0,1500)}`].join(`
14
- `),n;try{let{createProvider:l}=await import("./providers-L27BJ5A6.js"),y=l("claude"),f=new AbortController,p=setTimeout(()=>f.abort(),o);try{let b=await y.generate([{role:"system",content:x},{role:"user",content:t}],{model:S,maxTokens:256});n=w(b.content)}finally{clearTimeout(p)}}catch(l){return process.env.AGENTX_PLANNER_DEBUG&&console.error(`[planner] error: ${l?.message??l}`),null}if(!n||typeof n!="object")return null;let m=M(n.recentTurns,0,6,3),a=!!n.memory?.include,c=typeof n.memory?.query=="string"?n.memory.query:"",i=!!n.crossChat,u=typeof n.reasoning=="string"?n.reasoning:void 0,d=C(e.sessions,e.agentId,e.channel,e.chatId,m),g="";if(a&&c)try{let l=e.memoryStore.findRelevant(c,e.agentId,5);g=e.memoryStore.buildContext(l)}catch{}let h="";return i&&(h=e.sessions.getCrossSessionSummary(e.agentId,e.channel,e.chatId,"")),{sessionHistory:d,memoryContext:g,crossChatContext:h,debug:{recentTurns:m,memoryIncluded:a,memoryQuery:c||void 0,crossChatIncluded:i,reasoning:u,planLatencyMs:Date.now()-s}}}function C(e,s,o,r,t){if(t<=0)return"";let n=e.getSession(s,o,r);if(n.messages.length===0)return"";let m=Math.min(n.messages.length,t*2),a=n.messages.slice(-m),c=[`[Recent exchange \u2014 last ${a.length} messages]`];for(let i of a){let u=i.name||(i.role==="user"?"User":"Agent");c.push(`${u}: ${i.content}`)}return c.push("[End recent exchange \u2014 respond to the latest message above]"),c.push(""),c.join(`
15
- `)}function I(e,s,o,r,t){let n=e.getSession(s,o,r);return n.messages.length===0?"":n.messages.slice(-t).map(a=>{let c=a.name||(a.role==="user"?"User":"Agent"),i=a.content.length>200?a.content.slice(0,200)+"\u2026":a.content;return` ${c}: ${i}`}).join(`
16
- `)}function w(e){if(!e)return null;let s=e.trim();try{return JSON.parse(s)}catch{}let o=s.indexOf("{");if(o<0)return null;let r=0;for(let t=o;t<s.length;t++)if(s[t]==="{")r++;else if(s[t]==="}"&&(r--,r===0))try{return JSON.parse(s.slice(o,t+1))}catch{return null}return null}function M(e,s,o,r){let t=typeof e=="number"?Math.floor(e):Number.parseInt(String(e??""),10);return Number.isFinite(t)?Math.min(o,Math.max(s,t)):r}export{N as planContext};
17
- //# sourceMappingURL=context-planner-45GEWKGL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/agents/context-planner.ts"],"sourcesContent":["// --- Context Planner ---\n//\n// A Haiku pre-call that decides what context to retrieve for the current\n// message, replacing the blind \"stack every layer\" approach of the layered\n// strategy. Drops --resume bloat by avoiding the full session history blob\n// on every turn; instead pulls only the specific facts / memory / cross-chat\n// the current message actually needs.\n//\n// Always-on core (handled by registry, not the planner): channel, scope,\n// landscape, identity, intent, and a small `recentTurns`-sized tail of the\n// session verbatim. The planner decides: how many tail turns to keep, and\n// whether to pull memory or cross-chat on top.\n//\n// Fail-open: any planner error returns null and the registry falls back to\n// the layered strategy. This keeps the feature safe to enable even when\n// the planner model is misbehaving.\n//\n// Cost model: one small Haiku call per message (~300 input / ~80 output\n// tokens, ~$0.0005). Win threshold is when it avoids shipping ≥5K tokens\n// of layered history/memory the agent didn't need — typical for short\n// \"ok / yes / do it\" messages where the layered path still dumps the\n// whole 12K-char session blob.\n\nimport type { SessionStore, SessionMessage } from \"./sessions\"\nimport type { MemoryStore } from \"./memory-store\"\n\n/** Planner output. When `null`, the caller falls back to the layered\n * strategy. Otherwise each field overrides the corresponding context\n * layer — an empty string means \"skip this layer entirely\". */\nexport interface ContextPlan {\n /** Rendered session history (same shape buildHistoryContext returns),\n * truncated to the last N turns the planner picked. */\n sessionHistory: string\n /** Rendered memory context, or \"\" when the planner decided memory\n * isn't relevant to this message. */\n memoryContext: string\n /** Rendered cross-chat summary, or \"\" when not needed. */\n crossChatContext: string\n /** Debug metadata — surfaced in logs + bench output so operators can\n * see what the planner chose. Not sent to the main agent. */\n debug: {\n recentTurns: number\n memoryIncluded: boolean\n memoryQuery?: string\n crossChatIncluded: boolean\n reasoning?: string\n planLatencyMs: number\n }\n}\n\nexport interface PlanContextInput {\n agentId: string\n channel: string\n chatId: string\n message: string\n sessions: SessionStore\n memoryStore: MemoryStore\n /** Caller-controlled timeout for the Haiku planner call. Defaults to\n * 8s — the planner is in the critical path before the main agent\n * runs, so we can't afford a long timeout. Fail-open if exceeded. */\n timeoutMs?: number\n}\n\nconst PLANNER_MODEL = \"claude-haiku-4-5-20251001\"\nconst PLANNER_PROMPT = `You are a context planner for an AI agent. Given the user's current message and recent conversation tail, decide what historical context the agent needs.\n\nOutput ONE JSON object on one line, no prose, no fences:\n { \"recentTurns\": number, \"memory\": { \"include\": boolean, \"query\": string }, \"crossChat\": boolean, \"reasoning\": string }\n\nRules:\n- \"recentTurns\" in [0,6]. Short acknowledgments (\"ok\", \"yes\", \"do it\", \"continue\") need 2-3 turns to know what they refer to. New topics need 0. Technical follow-ups need 3-5.\n- \"memory.include\" = true only when the message likely references a person, past event, decision, or project the agent should recall. \"memory.query\" = 3-8 words distilling what to search for (leave \"\" when include=false).\n- \"crossChat\" = true only when the message references another chat (\"DM\", \"the group\", \"earlier conversation\", a peer agent's name). Most messages = false.\n- \"reasoning\" = one short phrase explaining the plan.\n\nBe conservative — unneeded context costs tokens. When in doubt, exclude.`\n\nexport async function planContext(input: PlanContextInput): Promise<ContextPlan | null> {\n const start = Date.now()\n const timeoutMs = input.timeoutMs ?? 8_000\n\n // Snapshot the session tail for the planner prompt. Don't send the\n // whole session — the planner only needs enough to judge whether the\n // message is a follow-up, and we pay tokens for every line we ship.\n const recentTail = sessionTail(input.sessions, input.agentId, input.channel, input.chatId, 4)\n\n const userPrompt = [\n `Agent: ${input.agentId}`,\n `Channel: ${input.channel}`,\n recentTail ? `Recent conversation:\\n${recentTail}` : \"Recent conversation: (none — first message)\",\n ``,\n `Current message: ${input.message.slice(0, 1500)}`,\n ].join(\"\\n\")\n\n // Use the Anthropic SDK path — warm HTTP client, no subprocess cold-start.\n // resolveToken now recognizes CLAUDE_CODE_OAUTH_TOKEN so this works out\n // of the box for any operator who already has Claude CLI auth set up.\n // Planner timeout is tight (8s default) because plan latency is in the\n // critical path before the main agent runs.\n let planJson: any\n try {\n const { createProvider } = await import(\"@/agent/providers\")\n const provider = createProvider(\"claude\")\n const ac = new AbortController()\n const timer = setTimeout(() => ac.abort(), timeoutMs)\n try {\n const result = await provider.generate(\n [\n { role: \"system\", content: PLANNER_PROMPT },\n { role: \"user\", content: userPrompt },\n ],\n { model: PLANNER_MODEL, maxTokens: 256 },\n )\n planJson = extractJson(result.content)\n } finally {\n clearTimeout(timer)\n }\n } catch (err: any) {\n // Temporary: surface planner errors for debugging. Will silence once\n // we're confident the SDK path is stable.\n if (process.env.AGENTX_PLANNER_DEBUG) {\n // eslint-disable-next-line no-console\n console.error(`[planner] error: ${err?.message ?? err}`)\n }\n return null\n }\n\n if (!planJson || typeof planJson !== \"object\") return null\n\n const recentTurns = clampInt(planJson.recentTurns, 0, 6, 3)\n const memoryInclude = Boolean(planJson.memory?.include)\n const memoryQuery: string = typeof planJson.memory?.query === \"string\" ? planJson.memory.query : \"\"\n const crossChatInclude = Boolean(planJson.crossChat)\n const reasoning = typeof planJson.reasoning === \"string\" ? planJson.reasoning : undefined\n\n // Resolve the plan into actual retrieval strings.\n const sessionHistory = renderSessionTail(\n input.sessions,\n input.agentId,\n input.channel,\n input.chatId,\n recentTurns,\n )\n\n let memoryContext = \"\"\n if (memoryInclude && memoryQuery) {\n try {\n const relevant = input.memoryStore.findRelevant(memoryQuery, input.agentId, 5)\n memoryContext = input.memoryStore.buildContext(relevant)\n } catch {\n // Memory retrieval is best-effort; planner proceeds with empty memory.\n }\n }\n\n let crossChatContext = \"\"\n if (crossChatInclude) {\n // Force-include via empty message arg — the planner already decided.\n crossChatContext = input.sessions.getCrossSessionSummary(\n input.agentId, input.channel, input.chatId, \"\",\n )\n }\n\n return {\n sessionHistory,\n memoryContext,\n crossChatContext,\n debug: {\n recentTurns,\n memoryIncluded: memoryInclude,\n memoryQuery: memoryQuery || undefined,\n crossChatIncluded: crossChatInclude,\n reasoning,\n planLatencyMs: Date.now() - start,\n },\n }\n}\n\n/** Render the last N message pairs as a compact prompt tail. Returns \"\" when\n * there's no session on disk yet (first message). Format mirrors\n * SessionStore.buildHistoryContext but with an N-turn cap — the planner's\n * whole point is to cap this instead of dumping the full 12K-char log. */\nfunction renderSessionTail(\n sessions: SessionStore,\n agentId: string,\n channel: string,\n chatId: string,\n turns: number,\n): string {\n if (turns <= 0) return \"\"\n const session = sessions.getSession(agentId, channel, chatId)\n if (session.messages.length === 0) return \"\"\n // N \"turns\" = N*2 messages (user+agent pairs). Round to nearest message\n // count so a partial trailing user message still gets included.\n const msgCount = Math.min(session.messages.length, turns * 2)\n const tail = session.messages.slice(-msgCount)\n const lines: string[] = [`[Recent exchange — last ${tail.length} messages]`]\n for (const msg of tail) {\n const name = msg.name || (msg.role === \"user\" ? \"User\" : \"Agent\")\n lines.push(`${name}: ${msg.content}`)\n }\n lines.push(\"[End recent exchange — respond to the latest message above]\")\n lines.push(\"\")\n return lines.join(\"\\n\")\n}\n\n/** Very small tail for the planner's own prompt — enough for the planner to\n * decide whether this message is a follow-up, not enough to bloat the\n * planner call itself. Distinct from renderSessionTail (used for the main\n * agent) because we cap more aggressively here. */\nfunction sessionTail(\n sessions: SessionStore,\n agentId: string,\n channel: string,\n chatId: string,\n maxMessages: number,\n): string {\n const session = sessions.getSession(agentId, channel, chatId)\n if (session.messages.length === 0) return \"\"\n const tail = session.messages.slice(-maxMessages)\n return tail\n .map((m: SessionMessage) => {\n const name = m.name || (m.role === \"user\" ? \"User\" : \"Agent\")\n const content = m.content.length > 200 ? m.content.slice(0, 200) + \"…\" : m.content\n return ` ${name}: ${content}`\n })\n .join(\"\\n\")\n}\n\n/** Extract the first JSON object from a text response. Haiku sometimes\n * wraps output in backticks or prose despite the instructions, so we\n * scan for the first `{...}` span. */\nfunction extractJson(text: string): unknown {\n if (!text) return null\n const trimmed = text.trim()\n // Fast path — clean JSON.\n try { return JSON.parse(trimmed) } catch { /* fall through */ }\n // Fallback — first balanced object.\n const start = trimmed.indexOf(\"{\")\n if (start < 0) return null\n let depth = 0\n for (let i = start; i < trimmed.length; i++) {\n if (trimmed[i] === \"{\") depth++\n else if (trimmed[i] === \"}\") {\n depth--\n if (depth === 0) {\n try { return JSON.parse(trimmed.slice(start, i + 1)) } catch { return null }\n }\n }\n }\n return null\n}\n\nfunction clampInt(v: unknown, min: number, max: number, fallback: number): number {\n const n = typeof v === \"number\" ? Math.floor(v) : Number.parseInt(String(v ?? \"\"), 10)\n if (!Number.isFinite(n)) return fallback\n return Math.min(max, Math.max(min, n))\n}\n"],"mappings":"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","names":["PLANNER_MODEL","PLANNER_PROMPT","planContext","input","start","timeoutMs","recentTail","sessionTail","userPrompt","planJson","createProvider","provider","ac","timer","result","extractJson","err","recentTurns","clampInt","memoryInclude","memoryQuery","crossChatInclude","reasoning","sessionHistory","renderSessionTail","memoryContext","relevant","crossChatContext","sessions","agentId","channel","chatId","turns","session","msgCount","tail","lines","msg","name","maxMessages","m","content","text","trimmed","depth","i","v","min","max","fallback","n"]}
@@ -1,2 +0,0 @@
1
- import{a,b,c,d,e}from"./chunk-DSYKYZMT.js";import"./chunk-4YCH6IZV.js";export{e as debug,d as getDebugLogs,c as getDebugState,b as isDebug,a as setDebug};
2
- //# sourceMappingURL=debug-N3B5NVJU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/agents/references/discover.ts"],"sourcesContent":["import type { Skill } from \"@/agent/skills/types\"\nimport type { ReferenceCard, ReferenceKind } from \"./types\"\n\n// --- References discovery ---\n//\n// Pure extractor: given a namespace and a bag of source skills, walk their\n// markdown bodies and pull out structured facts (SSH hosts, GitLab project\n// IDs, filesystem paths, contacts) as ReferenceCard[]. Deterministic regex —\n// no LLM in the loop. Operator reviews the output and edits before flipping\n// `contextReferences: true` on the agents.\n\nconst SSH_LINE_RE = /\\bssh\\s+(?:-i\\s+(\\S+)\\s+)?([a-z_][a-z0-9_-]*)@([a-z0-9][a-z0-9.-]+|\\d{1,3}(?:\\.\\d{1,3}){3})/gi\nconst IP_RE = /\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b/g\nconst EMAIL_RE = /\\b([a-z0-9][a-z0-9._-]*)@([a-z0-9][a-z0-9.-]+\\.[a-z]{2,})\\b/gi\nconst GITLAB_PROJECT_LINE_RE = /([a-z0-9][a-z0-9._-]+)\\/([a-z0-9][a-z0-9._-]+)[^\\n|]*\\(?\\s*ID:?\\s*(\\d+)\\s*\\)?/gi\nconst GITLAB_GROUP_RE = /groups\\/([a-z0-9][a-z0-9._-]+)[^\\n|]*\\(?\\s*ID:?\\s*(\\d+)\\s*\\)?/gi\nconst PATH_RE = /(\\/Users\\/[^\\s)`'\"\\]]+|\\/home\\/[^\\s)`'\"\\]]+|\\/var\\/www\\/[^\\s)`'\"\\]]+|\\/etc\\/[^\\s)`'\"\\]]+)/g\nconst PHONE_RE = /(\\+\\d{1,3}[\\s.-]?(?:\\(\\d+\\)[\\s.-]?)?\\d[\\s.\\d-]{6,}\\d)/g\nconst PRIVATE_IP_RE = /^(?:127\\.|10\\.|192\\.168\\.|172\\.(?:1[6-9]|2\\d|3[01])\\.)/\n\nexport interface DiscoveryResult {\n /** Cards keyed by kind (ssh, gitlab, path, contact). */\n byKind: Record<string, ReferenceCard[]>\n /** Skills that were scanned. */\n scannedSkills: string[]\n /** Per-source diagnostics — what was found in which skill. */\n diagnostics: Array<{ skill: string; kind: string; id: string }>\n}\n\nexport interface DiscoveryOptions {\n /** Namespace prefix applied to every generated card id. */\n namespace: string\n /** Include only skills whose name OR tags contain any of these substrings.\n * Empty = scan every skill. */\n filter?: string[]\n /** Optional GitLab host to validate project URLs against (e.g.\n * https://gitlab.noqta.tn). When set, project URLs from other hosts are\n * ignored — keeps stray GitHub mentions out of a self-hosted registry. */\n gitlabHost?: string\n}\n\nexport function discoverFromSkills(skills: Skill[], opts: DiscoveryOptions): DiscoveryResult {\n const result: DiscoveryResult = {\n byKind: { ssh: [], gitlab: [], path: [], contact: [] },\n scannedSkills: [],\n diagnostics: [],\n }\n const seen = new Set<string>() // id de-dup across skills\n\n for (const skill of skills) {\n const fm = skill.frontmatter\n const body = skill.instructions ?? \"\"\n if (opts.filter?.length) {\n const hay = [\n fm.name,\n fm.description,\n ...(fm.tags ?? []),\n (fm as any).category ?? \"\",\n skill.path ?? \"\",\n body.slice(0, 500), // first ~125 tokens of body, enough for a \"MTGL Odoo Server\" header\n ].join(\" \").toLowerCase()\n const hit = opts.filter.some(f => hay.includes(f.toLowerCase()))\n if (!hit) continue\n }\n result.scannedSkills.push(fm.name)\n\n const ownerHint = fm.name\n\n for (const card of extractSshCards(body, opts.namespace, ownerHint)) {\n if (push(result, card, \"ssh\", seen)) result.diagnostics.push({ skill: fm.name, kind: \"ssh\", id: card.id })\n }\n for (const card of extractGitlabCards(body, opts.namespace, opts.gitlabHost)) {\n if (push(result, card, \"gitlab\", seen)) result.diagnostics.push({ skill: fm.name, kind: \"gitlab\", id: card.id })\n }\n for (const card of extractPathCards(body, opts.namespace)) {\n if (push(result, card, \"path\", seen)) result.diagnostics.push({ skill: fm.name, kind: \"path\", id: card.id })\n }\n for (const card of extractContactCards(body, opts.namespace)) {\n if (push(result, card, \"contact\", seen)) result.diagnostics.push({ skill: fm.name, kind: \"contact\", id: card.id })\n }\n }\n\n return result\n}\n\nfunction push(\n result: DiscoveryResult,\n card: ReferenceCard,\n kind: ReferenceKind,\n seen: Set<string>,\n): boolean {\n if (seen.has(card.id)) return false\n seen.add(card.id)\n result.byKind[kind].push(card)\n return true\n}\n\n// ---- Extractors ----\n\nfunction extractSshCards(body: string, ns: string, owner: string): ReferenceCard[] {\n const cards: ReferenceCard[] = []\n for (const m of body.matchAll(SSH_LINE_RE)) {\n const [, key, user, host] = m\n if (!user || !host) continue\n const slug = slugify(`${user}-${host.replace(/[^a-z0-9-]/gi, \"-\")}`)\n cards.push({\n id: `${ns}.ssh.${slug}`,\n kind: \"ssh\",\n summary: `SSH ${user}@${host}`,\n fields: cleanFields({ user, host, key }),\n tags: [\"discovered\"],\n ownerAgent: owner,\n })\n }\n // Catch IPs not already paired with a user\n const claimed = new Set(cards.flatMap(c => Object.values(c.fields)))\n for (const m of body.matchAll(IP_RE)) {\n const ip = m[0]\n if (claimed.has(ip)) continue\n if (PRIVATE_IP_RE.test(ip)) continue\n const slug = slugify(`host-${ip.replace(/\\./g, \"-\")}`)\n cards.push({\n id: `${ns}.ssh.${slug}`,\n kind: \"ssh\",\n summary: `Host ${ip} (user not detected — fill in)`,\n fields: { host: ip },\n tags: [\"discovered\", \"needs-review\"],\n ownerAgent: owner,\n })\n claimed.add(ip)\n }\n return cards\n}\n\nconst PROJECT_LINE_RE = /\\b([a-z0-9][a-z0-9._-]{1,40})\\/([a-z0-9][a-z0-9._-]{1,40})\\b/i\nconst ID_NUM_RE = /\\b(\\d{1,8})\\b/g\n\nfunction extractGitlabCards(body: string, ns: string, gitlabHost?: string): ReferenceCard[] {\n const cards: ReferenceCard[] = []\n if (gitlabHost && !body.includes(gitlabHost.replace(/^https?:\\/\\//, \"\"))) return cards\n // Group lines anywhere\n for (const m of body.matchAll(GITLAB_GROUP_RE)) {\n const [, slug, id] = m\n if (!slug || !id) continue\n cards.push({\n id: `${ns}.gitlab.group.${slugify(slug)}`,\n kind: \"gitlab\",\n summary: `GitLab group ${slug}`,\n fields: { groupId: Number(id), path: slug },\n tags: [\"discovered\"],\n })\n }\n // Project lines: walk line-by-line so table rows (\"| g/p | 269 |\") are\n // handled the same way as prose (\"g/p (ID: 269)\"). For each line that\n // mentions <group>/<project>, take the rightmost plausible numeric ID.\n const projectGlobalRe = new RegExp(PROJECT_LINE_RE.source, \"gi\")\n for (const line of body.split(/\\r?\\n/)) {\n // Skip lines that look like prose mentioning a path, not a GitLab project.\n // Real GitLab callouts almost always include \"ID:\" or a gitlab.* hostname\n // in the same line, or appear inside a markdown table row. Without one of\n // those, the noise rate is too high.\n const isTableRow = /^\\s*\\|.+\\|/.test(line)\n if (!isTableRow && !/\\bID[:\\s]/i.test(line) && !/gitlab/i.test(line)) continue\n // Two-pass: prefer a GitLab URL (https://gitlab.<host>/<group>/<repo>)\n // when present on the line, otherwise fall back to the rightmost\n // <group>/<repo> token that doesn't have a hostname-shaped group.\n let group: string | undefined\n let repo: string | undefined\n const urlMatch = line.match(/https?:\\/\\/[^\\s)]*gitlab[^\\s)]*?\\/([a-z0-9][a-z0-9._-]+)\\/([a-z0-9][a-z0-9._-]+)/i)\n if (urlMatch && urlMatch[1] && urlMatch[2]) {\n group = urlMatch[1]\n repo = urlMatch[2].replace(/[).,;:]+$/, \"\")\n } else {\n // Walk every <a>/<b> on the line and keep the last one that looks like\n // a real group/repo (no dots in group, not a wp-content path, not a file).\n for (const m of line.matchAll(projectGlobalRe)) {\n const g = m[1]\n const r = m[2]\n if (!g || !r) continue\n if (g === \"wp-content\" || r === \"wp-content\") continue\n if (g.includes(\".\")) continue\n if (looksLikeFile(r)) continue\n group = g\n repo = r\n }\n }\n if (!group || !repo) continue\n const ids = [...line.matchAll(ID_NUM_RE)].map(m => Number(m[1]))\n const id = ids.find(n => n >= 10 && n <= 9_999_999)\n if (!id) continue\n cards.push({\n id: `${ns}.gitlab.project.${slugify(repo)}`,\n kind: \"gitlab\",\n summary: `GitLab project ${group}/${repo}`,\n fields: { projectId: id, path: `${group}/${repo}` },\n tags: [\"discovered\"],\n })\n }\n return cards\n}\n\nfunction looksLikeFile(s: string): boolean {\n return /\\.(md|ya?ml|json|ts|tsx|js|jsx|py|sh|conf|env)$/i.test(s)\n}\n\nfunction extractPathCards(body: string, ns: string): ReferenceCard[] {\n const cards: ReferenceCard[] = []\n for (const m of body.matchAll(PATH_RE)) {\n let p = m[1].replace(/[.,;:)]+$/, \"\") // strip trailing punctuation\n if (p.length < 4) continue\n const slug = slugify(p.replace(/^\\//, \"\").replace(/[/.]/g, \"-\"))\n cards.push({\n id: `${ns}.paths.${slug}`,\n kind: \"path\",\n summary: p,\n fields: { path: p },\n tags: [\"discovered\"],\n })\n }\n return cards\n}\n\nfunction extractContactCards(body: string, ns: string): ReferenceCard[] {\n const cards: ReferenceCard[] = []\n for (const m of body.matchAll(EMAIL_RE)) {\n const [, local, domain] = m\n if (domain.endsWith(\".png\") || domain.endsWith(\".jpg\")) continue // junk filter\n const slug = slugify(local)\n cards.push({\n id: `${ns}.contacts.${slug}`,\n kind: \"contact\",\n summary: `${local}@${domain}`,\n fields: { email: `${local}@${domain}` },\n tags: [\"discovered\"],\n })\n }\n // Best-effort: if a phone appears on the same line as a known contact email\n // we already picked, attach it. Otherwise drop a standalone phone card.\n const phones = [...body.matchAll(PHONE_RE)].map(m => m[1].trim())\n for (const phone of phones) {\n const slug = slugify(`phone-${phone.replace(/\\D+/g, \"\")}`)\n cards.push({\n id: `${ns}.contacts.${slug}`,\n kind: \"contact\",\n summary: `Phone ${phone}`,\n fields: { mobile: phone },\n tags: [\"discovered\", \"needs-review\"],\n })\n }\n return cards\n}\n\n// ---- Helpers ----\n\nfunction cleanFields(fields: Record<string, string | number | boolean | undefined>): Record<string, string | number | boolean> {\n const out: Record<string, string | number | boolean> = {}\n for (const [k, v] of Object.entries(fields)) {\n if (v === undefined || v === \"\") continue\n out[k] = v\n }\n return out\n}\n\nfunction slugify(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60) || \"x\"\n}\n\n/**\n * Render a discovery result as YAML-ready file contents, one per kind.\n * Output is a complete `ReferenceFile`-shaped payload, ready to write to\n * `.agentx/references/<ns>/{ssh,gitlab,paths,contacts}.yaml`.\n */\nexport function renderDiscovery(result: DiscoveryResult, namespace: string): Record<string, string> {\n const out: Record<string, string> = {}\n const fileMap: Record<string, string> = {\n ssh: \"ssh.yaml\",\n gitlab: \"gitlab.yaml\",\n path: \"paths.yaml\",\n contact: \"contacts.yaml\",\n }\n for (const [kind, cards] of Object.entries(result.byKind)) {\n if (cards.length === 0) continue\n const ns = `${namespace}.${kind === \"path\" ? \"paths\" : kind === \"contact\" ? \"contacts\" : kind}`\n const lines = [\n `# Discovered automatically by 'agentx references discover'.`,\n `# Review every card — flagged ones (tags include \"needs-review\") are`,\n `# best-effort guesses. Set lastVerified once you've confirmed.`,\n `namespace: ${ns}`,\n `cards:`,\n ]\n for (const card of cards) {\n // Strip the namespace from the id so the file's `namespace:` doesn't\n // double-apply it on load.\n const localId = card.id.startsWith(`${ns}.`) ? card.id.slice(ns.length + 1) : card.id\n lines.push(` - id: ${localId}`)\n lines.push(` kind: ${card.kind}`)\n lines.push(` summary: ${quote(card.summary)}`)\n lines.push(` fields:`)\n for (const [k, v] of Object.entries(card.fields)) {\n lines.push(` ${k}: ${typeof v === \"number\" || typeof v === \"boolean\" ? v : quote(String(v))}`)\n }\n lines.push(` tags: [${card.tags.join(\", \")}]`)\n if (card.ownerAgent) lines.push(` ownerAgent: ${card.ownerAgent}`)\n }\n out[fileMap[kind]] = lines.join(\"\\n\") + \"\\n\"\n }\n return out\n}\n\nfunction quote(s: string): string {\n if (/^[A-Za-z0-9_./@+:-]+$/.test(s) && !/^\\d/.test(s)) return s\n return `\"${s.replace(/\"/g, '\\\\\"')}\"`\n}\n"],"mappings":"4BAWA,IAAMA,EAAc,gGACdC,EAAQ,+BACRC,EAAW,gEAEjB,IAAMC,EAAkB,kEAClBC,EAAU,6FACVC,EAAW,yDACXC,EAAgB,yDAuBf,SAASC,EAAmBC,EAAiBC,EAAyC,CAC3F,IAAMC,EAA0B,CAC9B,OAAQ,CAAE,IAAK,CAAC,EAAG,OAAQ,CAAC,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,CAAE,EACrD,cAAe,CAAC,EAChB,YAAa,CAAC,CAChB,EACMC,EAAO,IAAI,IAEjB,QAAWC,KAASJ,EAAQ,CAC1B,IAAMK,EAAKD,EAAM,YACXE,EAAOF,EAAM,cAAgB,GACnC,GAAIH,EAAK,QAAQ,OAAQ,CACvB,IAAMM,EAAM,CACVF,EAAG,KACHA,EAAG,YACH,GAAIA,EAAG,MAAQ,CAAC,EACfA,EAAW,UAAY,GACxBD,EAAM,MAAQ,GACdE,EAAK,MAAM,EAAG,GAAG,CACnB,EAAE,KAAK,GAAG,EAAE,YAAY,EAExB,GAAI,CADQL,EAAK,OAAO,KAAKO,GAAKD,EAAI,SAASC,EAAE,YAAY,CAAC,CAAC,EACrD,SAEZN,EAAO,cAAc,KAAKG,EAAG,IAAI,EAEjC,IAAMI,EAAYJ,EAAG,KAErB,QAAWK,KAAQC,EAAgBL,EAAML,EAAK,UAAWQ,CAAS,EAC5DG,EAAKV,EAAQQ,EAAM,MAAOP,CAAI,GAAGD,EAAO,YAAY,KAAK,CAAE,MAAOG,EAAG,KAAM,KAAM,MAAO,GAAIK,EAAK,EAAG,CAAC,EAE3G,QAAWA,KAAQG,EAAmBP,EAAML,EAAK,UAAWA,EAAK,UAAU,EACrEW,EAAKV,EAAQQ,EAAM,SAAUP,CAAI,GAAGD,EAAO,YAAY,KAAK,CAAE,MAAOG,EAAG,KAAM,KAAM,SAAU,GAAIK,EAAK,EAAG,CAAC,EAEjH,QAAWA,KAAQI,EAAiBR,EAAML,EAAK,SAAS,EAClDW,EAAKV,EAAQQ,EAAM,OAAQP,CAAI,GAAGD,EAAO,YAAY,KAAK,CAAE,MAAOG,EAAG,KAAM,KAAM,OAAQ,GAAIK,EAAK,EAAG,CAAC,EAE7G,QAAWA,KAAQK,EAAoBT,EAAML,EAAK,SAAS,EACrDW,EAAKV,EAAQQ,EAAM,UAAWP,CAAI,GAAGD,EAAO,YAAY,KAAK,CAAE,MAAOG,EAAG,KAAM,KAAM,UAAW,GAAIK,EAAK,EAAG,CAAC,EAIrH,OAAOR,CACT,CAEA,SAASU,EACPV,EACAQ,EACAM,EACAb,EACS,CACT,OAAIA,EAAK,IAAIO,EAAK,EAAE,EAAU,IAC9BP,EAAK,IAAIO,EAAK,EAAE,EAChBR,EAAO,OAAOc,CAAI,EAAE,KAAKN,CAAI,EACtB,GACT,CAIA,SAASC,EAAgBL,EAAcW,EAAYC,EAAgC,CACjF,IAAMC,EAAyB,CAAC,EAChC,QAAWC,KAAKd,EAAK,SAASe,CAAW,EAAG,CAC1C,GAAM,CAAC,CAAEC,EAAKC,EAAMC,CAAI,EAAIJ,EAC5B,GAAI,CAACG,GAAQ,CAACC,EAAM,SACpB,IAAMC,EAAOC,EAAQ,GAAGH,KAAQC,EAAK,QAAQ,eAAgB,GAAG,GAAG,EACnEL,EAAM,KAAK,CACT,GAAI,GAAGF,SAAUQ,IACjB,KAAM,MACN,QAAS,OAAOF,KAAQC,IACxB,OAAQG,EAAY,CAAE,KAAAJ,EAAM,KAAAC,EAAM,IAAAF,CAAI,CAAC,EACvC,KAAM,CAAC,YAAY,EACnB,WAAYJ,CACd,CAAC,EAGH,IAAMU,EAAU,IAAI,IAAIT,EAAM,QAAQU,GAAK,OAAO,OAAOA,EAAE,MAAM,CAAC,CAAC,EACnE,QAAWT,KAAKd,EAAK,SAASwB,CAAK,EAAG,CACpC,IAAMC,EAAKX,EAAE,CAAC,EAEd,GADIQ,EAAQ,IAAIG,CAAE,GACdjC,EAAc,KAAKiC,CAAE,EAAG,SAC5B,IAAMN,EAAOC,EAAQ,QAAQK,EAAG,QAAQ,MAAO,GAAG,GAAG,EACrDZ,EAAM,KAAK,CACT,GAAI,GAAGF,SAAUQ,IACjB,KAAM,MACN,QAAS,QAAQM,uCACjB,OAAQ,CAAE,KAAMA,CAAG,EACnB,KAAM,CAAC,aAAc,cAAc,EACnC,WAAYb,CACd,CAAC,EACDU,EAAQ,IAAIG,CAAE,EAEhB,OAAOZ,CACT,CAEA,IAAMa,EAAkB,gEAClBC,EAAY,iBAElB,SAASpB,EAAmBP,EAAcW,EAAYiB,EAAsC,CAC1F,IAAMf,EAAyB,CAAC,EAChC,GAAIe,GAAc,CAAC5B,EAAK,SAAS4B,EAAW,QAAQ,eAAgB,EAAE,CAAC,EAAG,OAAOf,EAEjF,QAAWC,KAAKd,EAAK,SAASX,CAAe,EAAG,CAC9C,GAAM,CAAC,CAAE8B,EAAMU,CAAE,EAAIf,EACjB,CAACK,GAAQ,CAACU,GACdhB,EAAM,KAAK,CACT,GAAI,GAAGF,kBAAmBS,EAAQD,CAAI,IACtC,KAAM,SACN,QAAS,gBAAgBA,IACzB,OAAQ,CAAE,QAAS,OAAOU,CAAE,EAAG,KAAMV,CAAK,EAC1C,KAAM,CAAC,YAAY,CACrB,CAAC,EAKH,IAAMW,EAAkB,IAAI,OAAOJ,EAAgB,OAAQ,IAAI,EAC/D,QAAWK,KAAQ/B,EAAK,MAAM,OAAO,EAAG,CAMtC,GAAI,CADe,aAAa,KAAK+B,CAAI,GACtB,CAAC,aAAa,KAAKA,CAAI,GAAK,CAAC,UAAU,KAAKA,CAAI,EAAG,SAItE,IAAIC,EACAC,EACEC,EAAWH,EAAK,MAAM,mFAAmF,EAC/G,GAAIG,GAAYA,EAAS,CAAC,GAAKA,EAAS,CAAC,EACvCF,EAAQE,EAAS,CAAC,EAClBD,EAAOC,EAAS,CAAC,EAAE,QAAQ,YAAa,EAAE,MAI1C,SAAWpB,KAAKiB,EAAK,SAASD,CAAe,EAAG,CAC9C,IAAMK,EAAIrB,EAAE,CAAC,EACPsB,EAAItB,EAAE,CAAC,EACT,CAACqB,GAAK,CAACC,GACPD,IAAM,cAAgBC,IAAM,cAC5BD,EAAE,SAAS,GAAG,GACdE,EAAcD,CAAC,IACnBJ,EAAQG,EACRF,EAAOG,GAGX,GAAI,CAACJ,GAAS,CAACC,EAAM,SAErB,IAAMJ,EADM,CAAC,GAAGE,EAAK,SAASJ,CAAS,CAAC,EAAE,IAAIb,GAAK,OAAOA,EAAE,CAAC,CAAC,CAAC,EAChD,KAAKwB,GAAKA,GAAK,IAAMA,GAAK,OAAS,EAC7CT,GACLhB,EAAM,KAAK,CACT,GAAI,GAAGF,oBAAqBS,EAAQa,CAAI,IACxC,KAAM,SACN,QAAS,kBAAkBD,KAASC,IACpC,OAAQ,CAAE,UAAWJ,EAAI,KAAM,GAAGG,KAASC,GAAO,EAClD,KAAM,CAAC,YAAY,CACrB,CAAC,EAEH,OAAOpB,CACT,CAEA,SAASwB,EAAcE,EAAoB,CACzC,MAAO,mDAAmD,KAAKA,CAAC,CAClE,CAEA,SAAS/B,EAAiBR,EAAcW,EAA6B,CACnE,IAAME,EAAyB,CAAC,EAChC,QAAWC,KAAKd,EAAK,SAASV,CAAO,EAAG,CACtC,IAAIkD,EAAI1B,EAAE,CAAC,EAAE,QAAQ,YAAa,EAAE,EACpC,GAAI0B,EAAE,OAAS,EAAG,SAClB,IAAMrB,EAAOC,EAAQoB,EAAE,QAAQ,MAAO,EAAE,EAAE,QAAQ,QAAS,GAAG,CAAC,EAC/D3B,EAAM,KAAK,CACT,GAAI,GAAGF,WAAYQ,IACnB,KAAM,OACN,QAASqB,EACT,OAAQ,CAAE,KAAMA,CAAE,EAClB,KAAM,CAAC,YAAY,CACrB,CAAC,EAEH,OAAO3B,CACT,CAEA,SAASJ,EAAoBT,EAAcW,EAA6B,CACtE,IAAME,EAAyB,CAAC,EAChC,QAAWC,KAAKd,EAAK,SAASyC,CAAQ,EAAG,CACvC,GAAM,CAAC,CAAEC,EAAOC,CAAM,EAAI7B,EAC1B,GAAI6B,EAAO,SAAS,MAAM,GAAKA,EAAO,SAAS,MAAM,EAAG,SACxD,IAAMxB,EAAOC,EAAQsB,CAAK,EAC1B7B,EAAM,KAAK,CACT,GAAI,GAAGF,cAAeQ,IACtB,KAAM,UACN,QAAS,GAAGuB,KAASC,IACrB,OAAQ,CAAE,MAAO,GAAGD,KAASC,GAAS,EACtC,KAAM,CAAC,YAAY,CACrB,CAAC,EAIH,IAAMC,EAAS,CAAC,GAAG5C,EAAK,SAAST,CAAQ,CAAC,EAAE,IAAIuB,GAAKA,EAAE,CAAC,EAAE,KAAK,CAAC,EAChE,QAAW+B,KAASD,EAAQ,CAC1B,IAAMzB,EAAOC,EAAQ,SAASyB,EAAM,QAAQ,OAAQ,EAAE,GAAG,EACzDhC,EAAM,KAAK,CACT,GAAI,GAAGF,cAAeQ,IACtB,KAAM,UACN,QAAS,SAAS0B,IAClB,OAAQ,CAAE,OAAQA,CAAM,EACxB,KAAM,CAAC,aAAc,cAAc,CACrC,CAAC,EAEH,OAAOhC,CACT,CAIA,SAASQ,EAAYyB,EAA0G,CAC7H,IAAMC,EAAiD,CAAC,EACxD,OAAW,CAACC,EAAGC,CAAC,IAAK,OAAO,QAAQH,CAAM,EACpCG,IAAM,QAAaA,IAAM,KAC7BF,EAAIC,CAAC,EAAIC,GAEX,OAAOF,CACT,CAEA,SAAS3B,EAAQ8B,EAAuB,CACtC,OAAOA,EACJ,YAAY,EACZ,QAAQ,cAAe,GAAG,EAC1B,QAAQ,WAAY,EAAE,EACtB,MAAM,EAAG,EAAE,GAAK,GACrB,CAOO,SAASC,EAAgBvD,EAAyBwD,EAA2C,CAClG,IAAML,EAA8B,CAAC,EAC/BM,EAAkC,CACtC,IAAK,WACL,OAAQ,cACR,KAAM,aACN,QAAS,eACX,EACA,OAAW,CAAC3C,EAAMG,CAAK,IAAK,OAAO,QAAQjB,EAAO,MAAM,EAAG,CACzD,GAAIiB,EAAM,SAAW,EAAG,SACxB,IAAMF,EAAK,GAAGyC,KAAa1C,IAAS,OAAS,QAAUA,IAAS,UAAY,WAAaA,IACnF4C,EAAQ,CACZ,8DACA,4EACA,iEACA,cAAc3C,IACd,QACF,EACA,QAAWP,KAAQS,EAAO,CAGxB,IAAM0C,EAAUnD,EAAK,GAAG,WAAW,GAAGO,IAAK,EAAIP,EAAK,GAAG,MAAMO,EAAG,OAAS,CAAC,EAAIP,EAAK,GACnFkD,EAAM,KAAK,WAAWC,GAAS,EAC/BD,EAAM,KAAK,aAAalD,EAAK,MAAM,EACnCkD,EAAM,KAAK,gBAAgBE,EAAMpD,EAAK,OAAO,GAAG,EAChDkD,EAAM,KAAK,aAAa,EACxB,OAAW,CAACN,EAAGC,CAAC,IAAK,OAAO,QAAQ7C,EAAK,MAAM,EAC7CkD,EAAM,KAAK,SAASN,MAAM,OAAOC,GAAM,UAAY,OAAOA,GAAM,UAAYA,EAAIO,EAAM,OAAOP,CAAC,CAAC,GAAG,EAEpGK,EAAM,KAAK,cAAclD,EAAK,KAAK,KAAK,IAAI,IAAI,EAC5CA,EAAK,YAAYkD,EAAM,KAAK,mBAAmBlD,EAAK,YAAY,EAEtE2C,EAAIM,EAAQ3C,CAAI,CAAC,EAAI4C,EAAM,KAAK;AAAA,CAAI,EAAI;AAAA,EAE1C,OAAOP,CACT,CAEA,SAASS,EAAMjB,EAAmB,CAChC,MAAI,wBAAwB,KAAKA,CAAC,GAAK,CAAC,MAAM,KAAKA,CAAC,EAAUA,EACvD,IAAIA,EAAE,QAAQ,KAAM,KAAK,IAClC","names":["SSH_LINE_RE","IP_RE","EMAIL_RE","GITLAB_GROUP_RE","PATH_RE","PHONE_RE","PRIVATE_IP_RE","discoverFromSkills","skills","opts","result","seen","skill","fm","body","hay","f","ownerHint","card","extractSshCards","push","extractGitlabCards","extractPathCards","extractContactCards","kind","ns","owner","cards","m","SSH_LINE_RE","key","user","host","slug","slugify","cleanFields","claimed","c","IP_RE","ip","PROJECT_LINE_RE","ID_NUM_RE","gitlabHost","id","projectGlobalRe","line","group","repo","urlMatch","g","r","looksLikeFile","n","s","p","EMAIL_RE","local","domain","phones","phone","fields","out","k","v","input","renderDiscovery","namespace","fileMap","lines","localId","quote"]}
@@ -1,2 +0,0 @@
1
- import{a,b}from"./chunk-BVGJSPW4.js";import"./chunk-BTHHSY7D.js";import"./chunk-4YCH6IZV.js";export{b as doctor,a as runDoctorChecks};
2
- //# sourceMappingURL=doctor-3Q36ZFE6.js.map
@@ -1,2 +0,0 @@
1
- import{a}from"./chunk-JP5IEXR7.js";import"./chunk-SFQUP3BP.js";import"./chunk-FDWOECJY.js";import"./chunk-VJUTQAPJ.js";import"./chunk-4YCH6IZV.js";export{a as HealEngine};
2
- //# sourceMappingURL=heal-HZ3EQD52.js.map
@@ -1,2 +0,0 @@
1
- import{a,b,c,d,e}from"./chunk-DJEZ2HVU.js";import"./chunk-4YCH6IZV.js";export{e as getAutoInjectSkills,a as loadLocalSkills,d as matchSkillsToTask,c as parseSkillContent,b as parseSkillFile};
2
- //# sourceMappingURL=loader-5CA3O5GM.js.map
@@ -1,2 +0,0 @@
1
- import{a,b}from"./chunk-SR3X25TN.js";import"./chunk-VJUTQAPJ.js";import"./chunk-4YCH6IZV.js";export{a as loadReferences,b as renderReferences};
2
- //# sourceMappingURL=loader-6IHUCPVO.js.map
@@ -1,2 +0,0 @@
1
- import{a}from"./chunk-5U35WAZF.js";import"./chunk-4YCH6IZV.js";export{a as extractMemories};
2
- //# sourceMappingURL=memory-extract-AENFVVO5.js.map
@@ -1,2 +0,0 @@
1
- import{a}from"./chunk-H5D7ATXS.js";import"./chunk-P4VWIVKN.js";import"./chunk-LDHPMJ7M.js";import"./chunk-4YCH6IZV.js";export{a as renderProcessesPage};
2
- //# sourceMappingURL=processes-UIC4XXA6.js.map
@@ -1,2 +0,0 @@
1
- import{a}from"./chunk-UHE5FCPB.js";import"./chunk-O6YPEOQF.js";import"./chunk-BVGJSPW4.js";import"./chunk-V3U4OF7L.js";import"./chunk-UCQ2N3KO.js";import"./chunk-P4VWIVKN.js";import"./chunk-GV7S5BAX.js";import"./chunk-GSX4NK2N.js";import"./chunk-SZDACK6O.js";import"./chunk-METYYZKQ.js";import"./chunk-3WQFCIB6.js";import"./chunk-E5CXCI33.js";import"./chunk-MTAPOCGA.js";import"./chunk-M4AMWP3H.js";import"./chunk-VT5XYFDD.js";import"./chunk-SFQUP3BP.js";import"./chunk-I3SIXTJO.js";import"./chunk-67Q4DCPS.js";import"./chunk-LDHPMJ7M.js";import"./chunk-2WVX3LEC.js";import"./chunk-76Z4VHDX.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-D46VZ7K7.js";import"./chunk-K2CAPYES.js";import"./chunk-BTHHSY7D.js";import"./chunk-ISEBLHWX.js";import"./chunk-HR4JSRZS.js";import"./chunk-VWTBHLMX.js";import"./chunk-BFXONUUN.js";import"./chunk-JTJIPNXY.js";import"./chunk-64P4QHSZ.js";import"./chunk-BFZUG66X.js";import"./chunk-SR3X25TN.js";import"./chunk-53NRX2NA.js";import"./chunk-FDWOECJY.js";import"./chunk-VJUTQAPJ.js";import"./chunk-DJEZ2HVU.js";import"./chunk-DSYKYZMT.js";import"./chunk-5U35WAZF.js";import"./chunk-QOYAX2FT.js";import"./chunk-4YCH6IZV.js";export{a as buildProgram};
2
- //# sourceMappingURL=program-SAUNRCCD.js.map
@@ -1,2 +0,0 @@
1
- import{j as a,k as b,l as c,m as d}from"./chunk-FDWOECJY.js";import"./chunk-VJUTQAPJ.js";import"./chunk-4YCH6IZV.js";export{b as ClaudeCodeProvider,a as ClaudeProvider,c as OpenAIProvider,d as createProvider};
2
- //# sourceMappingURL=providers-L27BJ5A6.js.map
@@ -1,2 +0,0 @@
1
- import{a}from"./chunk-BFZUG66X.js";import"./chunk-4YCH6IZV.js";export{a as agenticQuery};
2
- //# sourceMappingURL=query-HZYYRCLU.js.map
@@ -1,2 +0,0 @@
1
- import{a,b}from"./chunk-53NRX2NA.js";import"./chunk-VJUTQAPJ.js";import"./chunk-4YCH6IZV.js";export{a as loadRecipes,b as resolveRecipes};
2
- //# sourceMappingURL=recipes-EPLE2SNT.js.map
@@ -1,2 +0,0 @@
1
- import{A as e,B as f,C as g,D as h,w as a,x as b,y as c,z as d}from"./chunk-E5CXCI33.js";import"./chunk-MTAPOCGA.js";import"./chunk-M4AMWP3H.js";import"./chunk-67Q4DCPS.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-D46VZ7K7.js";import"./chunk-K2CAPYES.js";import"./chunk-BTHHSY7D.js";import"./chunk-ISEBLHWX.js";import"./chunk-HR4JSRZS.js";import"./chunk-VWTBHLMX.js";import"./chunk-BFXONUUN.js";import"./chunk-JTJIPNXY.js";import"./chunk-64P4QHSZ.js";import"./chunk-BFZUG66X.js";import"./chunk-SR3X25TN.js";import"./chunk-53NRX2NA.js";import"./chunk-FDWOECJY.js";import"./chunk-VJUTQAPJ.js";import"./chunk-DSYKYZMT.js";import"./chunk-5U35WAZF.js";import"./chunk-QOYAX2FT.js";import"./chunk-4YCH6IZV.js";export{h as AgentRegistry,c as TRACE_STEP_SUMMARY_BYTES,d as clipForTrace,g as emitTraceStepsFromStreamEvent,f as firstMissingRequiredTool,b as getGlobalRegistry,a as setGlobalRegistry,e as tallyToolUses};
2
- //# sourceMappingURL=registry-HK3WQ7BS.js.map
@@ -1,2 +0,0 @@
1
- import{a,b,c}from"./chunk-SZDACK6O.js";import"./chunk-4YCH6IZV.js";export{b as resolveInputs,c as runAction,a as template};
2
- //# sourceMappingURL=runner-BFYDWPUO.js.map
@@ -1,2 +0,0 @@
1
- import{h as a,i as b}from"./chunk-D46VZ7K7.js";import"./chunk-K2CAPYES.js";import"./chunk-BTHHSY7D.js";import"./chunk-VJUTQAPJ.js";import"./chunk-4YCH6IZV.js";export{b as CronScheduler,a as getNextCronDate};
2
- //# sourceMappingURL=scheduler-6T2SU5ST.js.map
@@ -1,2 +0,0 @@
1
- import{a}from"./chunk-GV7S5BAX.js";import"./chunk-GSX4NK2N.js";import"./chunk-4YCH6IZV.js";export{a as ActionStore};
2
- //# sourceMappingURL=store-I3HEWVLQ.js.map
@@ -1,2 +0,0 @@
1
- import{a,b}from"./chunk-AFRHKA7B.js";import"./chunk-4YCH6IZV.js";export{b as TimerService,a as timerRecordSchema};
2
- //# sourceMappingURL=timers-5LPZN55J.js.map
@@ -1,2 +0,0 @@
1
- import{a,b}from"./chunk-64P4QHSZ.js";import"./chunk-4YCH6IZV.js";export{a as WIKI_ARTICLE_TYPES,b as isWikiArticleType};
2
- //# sourceMappingURL=types-VECTMYTO.js.map
@@ -1,2 +0,0 @@
1
- import{a,b,c,d,e}from"./chunk-GSX4NK2N.js";import"./chunk-4YCH6IZV.js";export{b as actionInputSchema,a as actionInputTypeSchema,e as actionSchema,d as httpActionSchema,c as shellActionSchema};
2
- //# sourceMappingURL=types-Y6ZCZ52Z.js.map
@@ -1,2 +0,0 @@
1
- import"./chunk-VWTBHLMX.js";import{e as a,f as b}from"./chunk-BFXONUUN.js";import"./chunk-JTJIPNXY.js";import"./chunk-64P4QHSZ.js";import{a as c}from"./chunk-BFZUG66X.js";import"./chunk-FDWOECJY.js";import"./chunk-VJUTQAPJ.js";import"./chunk-QOYAX2FT.js";import"./chunk-4YCH6IZV.js";export{b as WikiHub,a as WikiStore,c as agenticQuery};
2
- //# sourceMappingURL=wiki-M6YNRFC4.js.map