@askexenow/exe-os 0.9.286 → 0.9.288

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 (458) hide show
  1. package/deploy/compose/.env.customer.example +10 -1
  2. package/deploy/compose/.env.example +8 -1
  3. package/deploy/compose/README.md +21 -0
  4. package/deploy/compose/docker-compose.yml +24 -1
  5. package/deploy/compose/generate-env.ts +16 -2
  6. package/deploy/compose/setup.sh +63 -0
  7. package/deploy/stack-manifests/v0.9.json +1 -1
  8. package/dist/active-agent-KB4346K6.js +26 -0
  9. package/dist/active-agent-LTYLGBJX.js +27 -0
  10. package/dist/active-agent-V4W557J4.js +26 -0
  11. package/dist/active-agent-XZVU5XBO.js +27 -0
  12. package/dist/agentic-ontology-4PNQX4YW.js +25 -0
  13. package/dist/agentic-ontology-WOTOTSR7.js +25 -0
  14. package/dist/backfill-metadata-O2BQIEVT.js +599 -0
  15. package/dist/backfill-metadata-PHXNTBNR.js +599 -0
  16. package/dist/background-jobs-RIECIYW5.js +25 -0
  17. package/dist/behaviors-MO5BWFPW.js +39 -0
  18. package/dist/behaviors-TMA2HRTL.js +39 -0
  19. package/dist/bin/age-ontology-load.js +2 -2
  20. package/dist/bin/agentic-ontology-backfill.js +7 -7
  21. package/dist/bin/agentic-reflection-backfill.js +8 -8
  22. package/dist/bin/agentic-semantic-label.js +7 -7
  23. package/dist/bin/backfill-conversations.js +7 -7
  24. package/dist/bin/backfill-responses.js +7 -7
  25. package/dist/bin/backfill-vectors.js +10 -10
  26. package/dist/bin/bulk-sync-postgres.js +8 -8
  27. package/dist/bin/cc-doctor.js +7 -6
  28. package/dist/bin/cleanup-stale-review-tasks.js +13 -13
  29. package/dist/bin/cli.js +20 -20
  30. package/dist/bin/exe-agent-config.js +4 -4
  31. package/dist/bin/exe-agent.js +9 -9
  32. package/dist/bin/exe-assign.js +9 -9
  33. package/dist/bin/exe-boot.js +32 -21
  34. package/dist/bin/exe-call.js +5 -5
  35. package/dist/bin/exe-cloud.js +7 -7
  36. package/dist/bin/exe-dispatch.js +13 -13
  37. package/dist/bin/exe-doctor.js +4 -1
  38. package/dist/bin/exe-export-behaviors.js +8 -8
  39. package/dist/bin/exe-forget.js +7 -7
  40. package/dist/bin/exe-gateway.js +8 -8
  41. package/dist/bin/exe-healthcheck.js +9 -6
  42. package/dist/bin/exe-heartbeat.js +13 -13
  43. package/dist/bin/exe-kill.js +16 -16
  44. package/dist/bin/exe-launch-agent.js +20 -20
  45. package/dist/bin/exe-new-employee.js +8 -8
  46. package/dist/bin/exe-pending-messages.js +14 -14
  47. package/dist/bin/exe-pending-notifications.js +13 -13
  48. package/dist/bin/exe-pending-reviews.js +13 -13
  49. package/dist/bin/exe-rename.js +5 -5
  50. package/dist/bin/exe-review.js +15 -15
  51. package/dist/bin/exe-search.js +6 -6
  52. package/dist/bin/exe-session-cleanup.js +18 -18
  53. package/dist/bin/exe-settings.js +7 -7
  54. package/dist/bin/exe-start-codex.js +12 -12
  55. package/dist/bin/exe-start-opencode.js +9 -9
  56. package/dist/bin/exe-status.js +14 -14
  57. package/dist/bin/exe-support.js +3 -3
  58. package/dist/bin/exe-team.js +4 -4
  59. package/dist/bin/git-sweep.js +14 -14
  60. package/dist/bin/graph-backfill.js +8 -8
  61. package/dist/bin/graph-export.js +6 -6
  62. package/dist/bin/import-history.js +10 -10
  63. package/dist/bin/install.js +7 -7
  64. package/dist/bin/intercom-check.js +4 -4
  65. package/dist/bin/mcp-sessions.js +2 -2
  66. package/dist/bin/orchestration-metrics.js +5 -5
  67. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  68. package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
  69. package/dist/bin/scan-tasks.js +13 -13
  70. package/dist/bin/setup.js +2 -2
  71. package/dist/bin/shard-migrate.js +6 -6
  72. package/dist/bin/stack-update.js +4 -4
  73. package/dist/bin/vps-health-gate.js +1 -1
  74. package/dist/branding-6PY5DNDC.js +97 -0
  75. package/dist/capability-cards-4NKVY6GD.js +88 -0
  76. package/dist/capability-cards-UD5TCSAZ.js +88 -0
  77. package/dist/capacity-monitor-AU7MVZED.js +50 -0
  78. package/dist/capacity-monitor-CV7PWPYR.js +50 -0
  79. package/dist/catchup-brief-AZND3EET.js +174 -0
  80. package/dist/catchup-brief-TFL6MYOZ.js +154 -0
  81. package/dist/chunk-22R3G3GD.js +297 -0
  82. package/dist/chunk-2CO47E5Q.js +210 -0
  83. package/dist/chunk-2F5UVNYP.js +167 -0
  84. package/dist/chunk-2IJCGYY2.js +30 -0
  85. package/dist/chunk-2V52EJI7.js +14365 -0
  86. package/dist/chunk-2WCXJVSN.js +456 -0
  87. package/dist/chunk-2X52UGP7.js +190 -0
  88. package/dist/chunk-3H5FNTXS.js +85 -0
  89. package/dist/chunk-3OC6MJIX.js +210 -0
  90. package/dist/chunk-3OSDE4Y2.js +1119 -0
  91. package/dist/chunk-43QFBQHT.js +1094 -0
  92. package/dist/chunk-4EBW3URQ.js +4318 -0
  93. package/dist/chunk-4KVMYS3U.js +280 -0
  94. package/dist/chunk-4UTH3H4H.js +128 -0
  95. package/dist/chunk-5BKYHLA3.js +411 -0
  96. package/dist/chunk-5RRYMKXN.js +150 -0
  97. package/dist/chunk-5TYYOPTD.js +50 -0
  98. package/dist/chunk-5XOAYMSU.js +4318 -0
  99. package/dist/chunk-6DQNLI55.js +240 -0
  100. package/dist/chunk-6GOT6FNJ.js +1352 -0
  101. package/dist/chunk-6KH24PJ7.js +221 -0
  102. package/dist/chunk-6TV66RAI.js +192 -0
  103. package/dist/chunk-6UD5CM2H.js +244 -0
  104. package/dist/chunk-6YR3J6WG.js +203 -0
  105. package/dist/chunk-77HA7ATH.js +89 -0
  106. package/dist/chunk-7G52QPUX.js +271 -0
  107. package/dist/chunk-7M5ZHD4E.js +214 -0
  108. package/dist/chunk-A3GC762G.js +333 -0
  109. package/dist/chunk-ALTFDYI6.js +97 -0
  110. package/dist/chunk-AN25OIRX.js +38 -0
  111. package/dist/chunk-AOWC2J6S.js +14225 -0
  112. package/dist/chunk-ASL5PHCT.js +1934 -0
  113. package/dist/chunk-AVTDW4L6.js +562 -0
  114. package/dist/chunk-BEQTE7GH.js +668 -0
  115. package/dist/chunk-BJTBA4XS.js +290 -0
  116. package/dist/chunk-BQBPNRUW.js +231 -0
  117. package/dist/chunk-BQD4XYWX.js +159 -0
  118. package/dist/chunk-BVFCZNJH.js +41 -0
  119. package/dist/chunk-BW7HTZMW.js +240 -0
  120. package/dist/chunk-BZP3ZSRI.js +97 -0
  121. package/dist/chunk-C2NCSKRZ.js +373 -0
  122. package/dist/chunk-C3AH5JAS.js +510 -0
  123. package/dist/chunk-CEKZ77KA.js +471 -0
  124. package/dist/chunk-CNTBRVYW.js +54 -0
  125. package/dist/chunk-CTJQX44O.js +271 -0
  126. package/dist/chunk-CVG2PBCO.js +1105 -0
  127. package/dist/chunk-CZ47BFAT.js +299 -0
  128. package/dist/chunk-CZHC3HIO.js +362 -0
  129. package/dist/chunk-DIZOFRZO.js +284 -0
  130. package/dist/chunk-DRX46W5O.js +1068 -0
  131. package/dist/chunk-DYICAAAM.js +630 -0
  132. package/dist/chunk-E4BXNYLD.js +128 -0
  133. package/dist/chunk-EKXOBH7F.js +227 -0
  134. package/dist/chunk-ELQZYKVN.js +394 -0
  135. package/dist/chunk-EVM22AGQ.js +382 -0
  136. package/dist/chunk-EY7TBDZ5.js +38 -0
  137. package/dist/chunk-FDOEMBUB.js +345 -0
  138. package/dist/chunk-FG2OXKU5.js +539 -0
  139. package/dist/chunk-FP6TDXIL.js +456 -0
  140. package/dist/chunk-FVWATWI2.js +377 -0
  141. package/dist/chunk-G2OW4LUS.js +55 -0
  142. package/dist/chunk-GAYD7KBH.js +836 -0
  143. package/dist/chunk-GETGWHCO.js +227 -0
  144. package/dist/chunk-GGLUKNFC.js +1350 -0
  145. package/dist/chunk-GLEE2MUJ.js +262 -0
  146. package/dist/chunk-GUODMEAR.js +42 -0
  147. package/dist/chunk-H6LA4UV5.js +735 -0
  148. package/dist/chunk-H6PW4LNY.js +129 -0
  149. package/dist/chunk-HEMJ5RDU.js +345 -0
  150. package/dist/chunk-HMP6KB4V.js +382 -0
  151. package/dist/chunk-I35KAK3E.js +458 -0
  152. package/dist/chunk-I4DA5D5Q.js +1922 -0
  153. package/dist/chunk-I53O26HI.js +1119 -0
  154. package/dist/chunk-IBLEQQDQ.js +181 -0
  155. package/dist/chunk-IS2BEXUC.js +2113 -0
  156. package/dist/chunk-ISCEGQHA.js +244 -0
  157. package/dist/chunk-JCERHH3L.js +85 -0
  158. package/dist/chunk-JCNCPBWU.js +97 -0
  159. package/dist/chunk-JEMLH7H2.js +1350 -0
  160. package/dist/chunk-JMR2X5FJ.js +630 -0
  161. package/dist/chunk-JR3MYBWG.js +2078 -0
  162. package/dist/chunk-JSEICUAL.js +197 -0
  163. package/dist/chunk-K3KOLZTH.js +123 -0
  164. package/dist/chunk-K4OH3B2I.js +14248 -0
  165. package/dist/chunk-KQ4Z2G24.js +260 -0
  166. package/dist/chunk-KVH5DSTA.js +369 -0
  167. package/dist/chunk-L4R5NOVT.js +81 -0
  168. package/dist/chunk-LCB6YCE6.js +70 -0
  169. package/dist/chunk-M543SLJZ.js +1352 -0
  170. package/dist/chunk-M6KDMU5P.js +2113 -0
  171. package/dist/chunk-MDAGRPZG.js +197 -0
  172. package/dist/chunk-MLNOSXRZ.js +402 -0
  173. package/dist/chunk-MNI5K34D.js +290 -0
  174. package/dist/chunk-MUDH7ZLR.js +129 -0
  175. package/dist/chunk-MUMBWV57.js +379 -0
  176. package/dist/chunk-NAQLGLOG.js +176 -0
  177. package/dist/chunk-NIBCUAEI.js +123 -0
  178. package/dist/chunk-NIZCTXYW.js +89 -0
  179. package/dist/chunk-NS5G36TN.js +712 -0
  180. package/dist/chunk-NSKQWLQL.js +76 -0
  181. package/dist/chunk-NUA3WRTO.js +1157 -0
  182. package/dist/chunk-O3IESEF6.js +85 -0
  183. package/dist/chunk-OAO2BK25.js +81 -0
  184. package/dist/chunk-OFY7RGLL.js +348 -0
  185. package/dist/chunk-OICU3UHF.js +181 -0
  186. package/dist/chunk-OK6HCC2Z.js +731 -0
  187. package/dist/chunk-ONTUBOYP.js +230 -0
  188. package/dist/chunk-OQB7TERT.js +54 -0
  189. package/dist/chunk-P362EYLO.js +106 -0
  190. package/dist/chunk-P4T4JOCE.js +192 -0
  191. package/dist/chunk-QAOWXQKA.js +333 -0
  192. package/dist/chunk-QEFT6G6J.js +2078 -0
  193. package/dist/chunk-QFVY5MHR.js +402 -0
  194. package/dist/chunk-QLMSROQC.js +604 -0
  195. package/dist/chunk-QNR4ZQDU.js +14365 -0
  196. package/dist/chunk-QQ3T45AO.js +348 -0
  197. package/dist/chunk-QV6HNEMH.js +230 -0
  198. package/dist/chunk-R5LCP56X.js +299 -0
  199. package/dist/chunk-RHTZA6X6.js +1922 -0
  200. package/dist/chunk-RL4RQIEI.js +731 -0
  201. package/dist/chunk-RW4EMKQF.js +185 -0
  202. package/dist/chunk-S35K4C6F.js +127 -0
  203. package/dist/chunk-SFQYQH5Z.js +50 -0
  204. package/dist/chunk-SLFB2RY6.js +133 -0
  205. package/dist/chunk-SSC7EKY2.js +133 -0
  206. package/dist/chunk-SWFFGWAF.js +262 -0
  207. package/dist/chunk-SXZCFZ5T.js +157 -0
  208. package/dist/chunk-T5LT62O5.js +14365 -0
  209. package/dist/chunk-TDGPZF5T.js +539 -0
  210. package/dist/chunk-TF6DEHEL.js +167 -0
  211. package/dist/chunk-TH7ZNVGB.js +33 -0
  212. package/dist/chunk-TTNYB6OH.js +33 -0
  213. package/dist/chunk-TUHR7Z7R.js +221 -0
  214. package/dist/chunk-UHKXYDBM.js +668 -0
  215. package/dist/chunk-UQBD2L52.js +128 -0
  216. package/dist/chunk-UTARH2WY.js +76 -0
  217. package/dist/chunk-UXYAQCIB.js +30 -0
  218. package/dist/chunk-UZHCPLB2.js +127 -0
  219. package/dist/chunk-VNJKA3K5.js +171 -0
  220. package/dist/chunk-VP4MDSUA.js +1156 -0
  221. package/dist/chunk-VWA7OCXI.js +58 -0
  222. package/dist/chunk-VWZZF3YB.js +70 -0
  223. package/dist/chunk-VYPKS352.js +214 -0
  224. package/dist/chunk-W6JB72KR.js +448 -0
  225. package/dist/chunk-WG4PSSI5.js +510 -0
  226. package/dist/chunk-WJPZPASS.js +373 -0
  227. package/dist/chunk-WLDBPKRL.js +3246 -0
  228. package/dist/chunk-WO2SPDUE.js +231 -0
  229. package/dist/chunk-WXEPPHDU.js +1094 -0
  230. package/dist/chunk-WXNSOT6K.js +82 -0
  231. package/dist/chunk-X2PSVVHB.js +448 -0
  232. package/dist/chunk-X5Y4JSD4.js +128 -0
  233. package/dist/chunk-X7VPB6Z5.js +621 -0
  234. package/dist/chunk-XA2GMH53.js +85 -0
  235. package/dist/chunk-XC2ZMYDN.js +204 -0
  236. package/dist/chunk-XFQJH67J.js +157 -0
  237. package/dist/chunk-XLF5F55U.js +230 -0
  238. package/dist/chunk-XQ5LT6UM.js +362 -0
  239. package/dist/chunk-XRMBKPIP.js +204 -0
  240. package/dist/chunk-XUC7YYW5.js +171 -0
  241. package/dist/chunk-XVDWHYIK.js +3276 -0
  242. package/dist/chunk-Y6CVAZ7T.js +97 -0
  243. package/dist/chunk-YA7WVZF5.js +377 -0
  244. package/dist/chunk-YACAOZVG.js +185 -0
  245. package/dist/chunk-YEHV3FN5.js +836 -0
  246. package/dist/chunk-YMZ6IGC3.js +284 -0
  247. package/dist/chunk-Z5P7AUFM.js +280 -0
  248. package/dist/chunk-Z5YFGOLZ.js +1068 -0
  249. package/dist/chunk-ZLYKY6GP.js +150 -0
  250. package/dist/chunk-ZOP7NAM2.js +58 -0
  251. package/dist/chunk-ZUNYZYKV.js +1157 -0
  252. package/dist/co-activation-54LO5GAA.js +73 -0
  253. package/dist/co-activation-ESPLEOMH.js +73 -0
  254. package/dist/co-occurrence-52ZTRX2I.js +94 -0
  255. package/dist/co-occurrence-O4G6VQUU.js +94 -0
  256. package/dist/code-context-index-OX3LN34G.js +30 -0
  257. package/dist/conversation-wiki-populator-IWSKIHQK.js +105 -0
  258. package/dist/core-memory-J6AEOYFN.js +110 -0
  259. package/dist/core-memory-XF4CLLDR.js +110 -0
  260. package/dist/cpu-steal-5YKTUPWF.js +23 -0
  261. package/dist/crdt-sync-5JOW6T2I.js +33 -0
  262. package/dist/crdt-sync-6L4OI4OA.js +33 -0
  263. package/dist/crm-webhook-BAXEYDPD.js +10 -0
  264. package/dist/crm-webhook-KVBGOUHU.js +10 -0
  265. package/dist/cto-delegation-gate-3WUTWBCT.js +279 -0
  266. package/dist/cto-delegation-gate-DZF3Z66I.js +279 -0
  267. package/dist/daemon-auth-M2G5PBME.js +13 -0
  268. package/dist/daemon-orchestration-3ANZVE7Y.js +138 -0
  269. package/dist/daemon-orchestration-APVUUNFB.js +138 -0
  270. package/dist/daemon-restart-report-F3P5AQS4.js +9 -0
  271. package/dist/db-backup-J7253HNV.js +33 -0
  272. package/dist/db-backup-M733ORYE.js +33 -0
  273. package/dist/db-restore-events-AIL6GSEK.js +76 -0
  274. package/dist/db-restore-events-LB3O46HH.js +76 -0
  275. package/dist/doc-graph-extractor-CF2WBSGL.js +132 -0
  276. package/dist/doc-graph-extractor-RSYHLOKD.js +132 -0
  277. package/dist/dreaming-L4FLJJO2.js +33 -0
  278. package/dist/dreaming-YKEKUE55.js +33 -0
  279. package/dist/entity-boost-ZKACOJKH.js +375 -0
  280. package/dist/exe-drift-AVJRXHCB.js +69 -0
  281. package/dist/exe-drift-MYT5NQ52.js +69 -0
  282. package/dist/exe-export-T2FHC5GC.js +75 -0
  283. package/dist/exe-export-TBV2JI4P.js +75 -0
  284. package/dist/exe-import-6UAKJF3Y.js +78 -0
  285. package/dist/exe-import-KJQO4PJX.js +78 -0
  286. package/dist/exe-key-KGQUC27D.js +580 -0
  287. package/dist/exe-key-Q772PMBM.js +580 -0
  288. package/dist/exe-org-KK22SSB3.js +73 -0
  289. package/dist/exe-snapshot-KF3HPOWJ.js +337 -0
  290. package/dist/exe-snapshot-SK6PMOFA.js +337 -0
  291. package/dist/fast-db-init-EXNYB2HK.js +7 -0
  292. package/dist/fast-db-init-FMECTLNS.js +7 -0
  293. package/dist/founder-context-N2VZ5MY2.js +96 -0
  294. package/dist/gateway/index.js +12 -12
  295. package/dist/git-staleness-2EOHIOMZ.js +111 -0
  296. package/dist/git-staleness-ZEYJXPFP.js +111 -0
  297. package/dist/git-task-sweep-I74JXGNT.js +41 -0
  298. package/dist/git-task-sweep-YKLOPYYV.js +41 -0
  299. package/dist/global-procedures-B23F4IQ3.js +21 -0
  300. package/dist/global-procedures-LUBLZ6WN.js +21 -0
  301. package/dist/graph-auto-extract-CSLZXRDY.js +182 -0
  302. package/dist/graph-auto-extract-DZRIETGW.js +182 -0
  303. package/dist/hook-integrity-HJBXTLQD.js +89 -0
  304. package/dist/hooks/bug-report-worker.js +15 -15
  305. package/dist/hooks/codex-stop-task-finalizer.js +15 -15
  306. package/dist/hooks/commit-complete.js +16 -16
  307. package/dist/hooks/error-recall.js +8 -8
  308. package/dist/hooks/exe-heartbeat-hook.js +5 -5
  309. package/dist/hooks/ingest-worker.js +5 -5
  310. package/dist/hooks/ingest.js +12 -12
  311. package/dist/hooks/instructions-loaded.js +6 -6
  312. package/dist/hooks/manifest.json +20 -20
  313. package/dist/hooks/notification.js +6 -6
  314. package/dist/hooks/post-compact.js +15 -15
  315. package/dist/hooks/post-tool-combined.js +7 -7
  316. package/dist/hooks/pre-compact.js +20 -20
  317. package/dist/hooks/pre-tool-use.js +19 -19
  318. package/dist/hooks/prompt-submit.js +27 -27
  319. package/dist/hooks/session-end.js +25 -25
  320. package/dist/hooks/session-start.js +37 -13
  321. package/dist/hooks/stop.js +22 -22
  322. package/dist/hooks/subagent-stop.js +15 -15
  323. package/dist/hooks/summary-worker.js +22 -22
  324. package/dist/index.js +23 -23
  325. package/dist/installer-AU5VMP4U.js +39 -0
  326. package/dist/installer-H7BIYSIK.js +39 -0
  327. package/dist/installer-L4NJWZGV.js +297 -0
  328. package/dist/installer-QE3LBMVF.js +343 -0
  329. package/dist/installer-QH75OOGL.js +297 -0
  330. package/dist/installer-XREYYGF2.js +343 -0
  331. package/dist/key-backup-status-IJCQT4NV.js +39 -0
  332. package/dist/lib/agent-config.js +2 -2
  333. package/dist/lib/cloud-sync.js +6 -6
  334. package/dist/lib/config.js +7 -3
  335. package/dist/lib/consolidation.js +8 -8
  336. package/dist/lib/database.js +3 -3
  337. package/dist/lib/db-daemon-client.js +3 -3
  338. package/dist/lib/db.js +3 -3
  339. package/dist/lib/device-registry.js +1 -1
  340. package/dist/lib/embed-worker.js +1 -1
  341. package/dist/lib/embedder.js +4 -4
  342. package/dist/lib/employee-templates.js +5 -5
  343. package/dist/lib/employees.js +3 -3
  344. package/dist/lib/exe-daemon-client.js +3 -3
  345. package/dist/lib/exe-daemon.js +51 -51
  346. package/dist/lib/hybrid-search.js +6 -6
  347. package/dist/lib/identity.js +3 -3
  348. package/dist/lib/license.js +2 -2
  349. package/dist/lib/messaging.js +13 -13
  350. package/dist/lib/reminders.js +4 -4
  351. package/dist/lib/schedules.js +6 -6
  352. package/dist/lib/session-registry.js +5 -5
  353. package/dist/lib/skill-learning.js +7 -7
  354. package/dist/lib/status-brief.js +1 -1
  355. package/dist/lib/store.js +5 -5
  356. package/dist/lib/task-router.js +4 -4
  357. package/dist/lib/tasks.js +14 -14
  358. package/dist/lib/tmux-routing.js +12 -12
  359. package/dist/lib/token-spend.js +4 -4
  360. package/dist/license-gate-X57APN2E.js +14 -0
  361. package/dist/mcp/register-tools.js +71 -69
  362. package/dist/mcp/server.js +73 -71
  363. package/dist/mcp/tools/complete-reminder.js +5 -5
  364. package/dist/mcp/tools/create-reminder.js +5 -5
  365. package/dist/mcp/tools/create-task.js +16 -16
  366. package/dist/mcp/tools/deactivate-behavior.js +8 -8
  367. package/dist/mcp/tools/list-reminders.js +5 -5
  368. package/dist/mcp/tools/list-tasks.js +16 -16
  369. package/dist/mcp/tools/send-message.js +15 -15
  370. package/dist/mcp/tools/update-task.js +15 -15
  371. package/dist/mcp-http-config-KMP55RXI.js +28 -0
  372. package/dist/mcp-http-config-XYHPQVRA.js +28 -0
  373. package/dist/memory-cards-AULW7ITU.js +179 -0
  374. package/dist/memory-cards-NLTRIBSD.js +179 -0
  375. package/dist/memory-graph-extractor-NGJQIKAA.js +21 -0
  376. package/dist/memory-graph-extractor-QWFPKSX5.js +21 -0
  377. package/dist/memory-poisoning-defense-5WWOLHUQ.js +223 -0
  378. package/dist/memory-poisoning-defense-742X4H52.js +223 -0
  379. package/dist/memory-queue-OXHHNDOC.js +19 -0
  380. package/dist/memory-queue-client-P4TZNVQB.js +16 -0
  381. package/dist/memory-reflection-6GF5OK2W.js +243 -0
  382. package/dist/memory-reflection-SGIE7OJ7.js +243 -0
  383. package/dist/message-queue-client-ELWCWKBO.js +92 -0
  384. package/dist/notifications-67M5SPLO.js +46 -0
  385. package/dist/notifications-HUH2H5WZ.js +46 -0
  386. package/dist/oauth-server-RKCMPBIP.js +437 -0
  387. package/dist/orchestration-events-MC3IZ46I.js +26 -0
  388. package/dist/orchestration-events-NZCUTMCJ.js +26 -0
  389. package/dist/orchestration-phase-FPAVQ57X.js +23 -0
  390. package/dist/orchestrator-3MJ6YJKT.js +34 -0
  391. package/dist/orchestrator-HOXFT4PP.js +34 -0
  392. package/dist/pipeline-router-NCUDK335.js +14 -0
  393. package/dist/pipeline-router-POLBFEBM.js +14 -0
  394. package/dist/plan-limits-DGAFE7V6.js +27 -0
  395. package/dist/plan-limits-J4WXJVDS.js +27 -0
  396. package/dist/project-boot-FRCQHQTF.js +299 -0
  397. package/dist/project-boot-QHXOUJGT.js +299 -0
  398. package/dist/projection-worker-QZW4DOY3.js +1034 -0
  399. package/dist/projection-worker-XDKC3GIZ.js +1034 -0
  400. package/dist/prospective-memory-JIGVZM2I.js +231 -0
  401. package/dist/push-notifications-ERC4SQSQ.js +15 -0
  402. package/dist/reranker-SF3LMYGY.js +19 -0
  403. package/dist/reranker-SOM2WMD6.js +19 -0
  404. package/dist/retrieval-health-7FRD2KLM.js +11 -0
  405. package/dist/retrieval-health-P6QHP263.js +11 -0
  406. package/dist/review-polling-66EJAMR3.js +125 -0
  407. package/dist/review-polling-SYKYNFRK.js +125 -0
  408. package/dist/runtime/index.js +19 -19
  409. package/dist/session-events-A6EDTM27.js +37 -0
  410. package/dist/session-events-DONPZ7DR.js +37 -0
  411. package/dist/session-kill-telemetry-NV2S2YZ2.js +30 -0
  412. package/dist/session-kill-telemetry-Y47QAFHP.js +30 -0
  413. package/dist/session-scope-H3FJVQ6E.js +87 -0
  414. package/dist/session-scope-I56DVQEY.js +87 -0
  415. package/dist/setup-wizard-MX3S3DVH.js +12 -0
  416. package/dist/setup-wizard-YRBCVPCU.js +12 -0
  417. package/dist/shard-manager-AX4W5B3N.js +30 -0
  418. package/dist/skill-refinement-57DCIDKT.js +158 -0
  419. package/dist/skill-refinement-XTBCHOMO.js +158 -0
  420. package/dist/stack-update-45SNTDZ6.js +76 -0
  421. package/dist/stack-update-CZ2QHS6T.js +76 -0
  422. package/dist/stack-update-XNEO4WQH.js +76 -0
  423. package/dist/steward-gate-J7VMPHEN.js +14 -0
  424. package/dist/steward-gate-PVUKWYED.js +14 -0
  425. package/dist/task-enforcement-G4MYUJ2E.js +439 -0
  426. package/dist/task-enforcement-QBF44BXN.js +439 -0
  427. package/dist/task-scope-D2VOYU3P.js +36 -0
  428. package/dist/task-scope-HGL6VACL.js +36 -0
  429. package/dist/tasks-crud-DFE4XOW7.js +78 -0
  430. package/dist/tasks-crud-J5TSLFQN.js +78 -0
  431. package/dist/tasks-notify-2VRKOK74.js +39 -0
  432. package/dist/tasks-notify-Q23MIKDA.js +39 -0
  433. package/dist/tasks-review-NRSVHN7V.js +48 -0
  434. package/dist/tasks-review-VV3RLPLT.js +48 -0
  435. package/dist/telemetry-upload-ISI6TEX4.js +740 -0
  436. package/dist/telemetry-upload-XML6WVPW.js +740 -0
  437. package/dist/token-budget-KVRHMY7V.js +85 -0
  438. package/dist/token-budget-WV2GIFYJ.js +85 -0
  439. package/dist/tool-capability-index-NOMFY27N.js +10 -0
  440. package/dist/tool-telemetry-6DGIQUV3.js +17 -0
  441. package/dist/tool-telemetry-NXPM2T5E.js +17 -0
  442. package/dist/tui/App.js +80 -38
  443. package/dist/tui-data-C4474APN.js +259 -0
  444. package/dist/tui-data-KP66NOW3.js +259 -0
  445. package/dist/webhook-pipe-ZAEPBTDB.js +114 -0
  446. package/dist/wiki-acl-4A3ZUPJK.js +111 -0
  447. package/dist/wiki-acl-DRTEVIHT.js +111 -0
  448. package/dist/wiki-client-AN52BINX.js +157 -0
  449. package/dist/worker-gate-EVSFKALM.js +21 -0
  450. package/dist/worker-gate-O2KXQN5T.js +21 -0
  451. package/dist/workflow-engine-MUO435MX.js +28 -0
  452. package/dist/workflow-engine-RV6JLGHQ.js +28 -0
  453. package/dist/worktree-36S7LYES.js +27 -0
  454. package/dist/worktree-WTNPY42O.js +27 -0
  455. package/dist/worktree-sweep-M5AXCSU7.js +20 -0
  456. package/dist/worktree-sweep-NKEGKQT3.js +20 -0
  457. package/package.json +1 -1
  458. package/release-notes.json +20 -20
@@ -0,0 +1,290 @@
1
+ import {
2
+ storeBehavior
3
+ } from "./chunk-CTJQX44O.js";
4
+ import {
5
+ getClient
6
+ } from "./chunk-XVDWHYIK.js";
7
+ import {
8
+ loadConfig
9
+ } from "./chunk-CEKZ77KA.js";
10
+
11
+ // src/lib/skill-learning.ts
12
+ import crypto from "crypto";
13
+ var DEFAULT_SKILL_THRESHOLD = 3;
14
+ async function extractTrajectory(taskId, agentId) {
15
+ const client = getClient();
16
+ const result = await client.execute({
17
+ sql: `SELECT tool_name, raw_text
18
+ FROM memories
19
+ WHERE task_id = ? AND agent_id = ?
20
+ ORDER BY timestamp ASC`,
21
+ args: [taskId, agentId]
22
+ });
23
+ if (result.rows.length === 0) return [];
24
+ const rawTools = result.rows.map((r) => {
25
+ const toolName = String(r.tool_name);
26
+ if (toolName === "Bash") {
27
+ const text = String(r.raw_text);
28
+ const cmdMatch = text.match(/(?:command|Command).*?[:\s]+"?(\w+)/);
29
+ return cmdMatch ? `Bash:${cmdMatch[1]}` : "Bash";
30
+ }
31
+ return toolName;
32
+ });
33
+ const signature = [];
34
+ for (const tool of rawTools) {
35
+ if (signature.length === 0 || signature[signature.length - 1] !== tool) {
36
+ signature.push(tool);
37
+ }
38
+ }
39
+ return signature;
40
+ }
41
+ function hashSignature(signature) {
42
+ return crypto.createHash("sha256").update(signature.join("|")).digest("hex").slice(0, 16);
43
+ }
44
+ async function storeTrajectory(opts) {
45
+ const client = getClient();
46
+ const id = crypto.randomUUID();
47
+ const now = (/* @__PURE__ */ new Date()).toISOString();
48
+ const signatureHash = hashSignature(opts.signature);
49
+ await client.execute({
50
+ sql: `INSERT INTO trajectories (id, task_id, agent_id, project_name, task_title, signature, signature_hash, tool_count, created_at)
51
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
52
+ args: [
53
+ id,
54
+ opts.taskId,
55
+ opts.agentId,
56
+ opts.projectName,
57
+ opts.taskTitle,
58
+ JSON.stringify(opts.signature),
59
+ signatureHash,
60
+ opts.signature.length,
61
+ now
62
+ ]
63
+ });
64
+ return id;
65
+ }
66
+ async function findSimilarTrajectories(signature, threshold = DEFAULT_SKILL_THRESHOLD) {
67
+ const client = getClient();
68
+ const hash = hashSignature(signature);
69
+ const result = await client.execute({
70
+ sql: `SELECT id, task_id, agent_id, project_name, task_title, signature, signature_hash, tool_count, skill_id, created_at
71
+ FROM trajectories
72
+ WHERE signature_hash = ?
73
+ ORDER BY created_at DESC
74
+ LIMIT 20`,
75
+ args: [hash]
76
+ });
77
+ const mapRow = (r) => ({
78
+ id: String(r.id),
79
+ taskId: String(r.task_id),
80
+ agentId: String(r.agent_id),
81
+ projectName: String(r.project_name),
82
+ taskTitle: String(r.task_title),
83
+ signature: JSON.parse(String(r.signature)),
84
+ signatureHash: String(r.signature_hash),
85
+ toolCount: Number(r.tool_count),
86
+ skillId: r.skill_id ? String(r.skill_id) : null,
87
+ createdAt: String(r.created_at)
88
+ });
89
+ const matches = result.rows.map(mapRow);
90
+ if (matches.length >= threshold) return matches;
91
+ const nearResult = await client.execute({
92
+ sql: `SELECT id, task_id, agent_id, project_name, task_title, signature, signature_hash, tool_count, skill_id, created_at
93
+ FROM trajectories
94
+ WHERE tool_count BETWEEN ? AND ?
95
+ AND signature_hash != ?
96
+ ORDER BY created_at DESC
97
+ LIMIT 50`,
98
+ args: [
99
+ Math.max(1, signature.length - 3),
100
+ signature.length + 3,
101
+ hash
102
+ ]
103
+ });
104
+ for (const r of nearResult.rows) {
105
+ const candidateSig = JSON.parse(String(r.signature));
106
+ if (editDistance(signature, candidateSig) <= 2) {
107
+ matches.push(mapRow(r));
108
+ }
109
+ }
110
+ return matches;
111
+ }
112
+ async function captureTrajectory(opts) {
113
+ const signature = await extractTrajectory(opts.taskId, opts.agentId);
114
+ if (signature.length < 3) {
115
+ return { trajectoryId: "", similarCount: 0, similar: [] };
116
+ }
117
+ const trajectoryId = await storeTrajectory({
118
+ taskId: opts.taskId,
119
+ agentId: opts.agentId,
120
+ projectName: opts.projectName,
121
+ taskTitle: opts.taskTitle,
122
+ signature
123
+ });
124
+ const similar = await findSimilarTrajectories(
125
+ signature,
126
+ opts.skillThreshold ?? DEFAULT_SKILL_THRESHOLD
127
+ );
128
+ return { trajectoryId, similarCount: similar.length, similar };
129
+ }
130
+ function buildExtractionPrompt(trajectories) {
131
+ const items = trajectories.map((t, i) => {
132
+ const sig = t.signature.join(" \u2192 ");
133
+ return `Task ${i + 1}: "${t.taskTitle}" (${t.agentId}, ${t.projectName}) \u2014 ${t.toolCount} tool calls
134
+ Signature: ${sig}`;
135
+ }).join("\n\n");
136
+ return `You are analyzing ${trajectories.length} completed tasks that followed similar procedures:
137
+
138
+ ${items}
139
+
140
+ Extract the reusable procedure. Format your response EXACTLY like this:
141
+
142
+ SKILL: {name \u2014 short, descriptive}
143
+ TRIGGER: {when to use this \u2014 one sentence}
144
+ STEPS:
145
+ 1. ...
146
+ 2. ...
147
+ PITFALLS: {common mistakes to avoid}
148
+
149
+ Be specific and actionable. Include tool names, file patterns, and concrete commands where applicable.`;
150
+ }
151
+ async function extractSkill(trajectories, model) {
152
+ if (trajectories.length === 0) return null;
153
+ const config = await loadConfig();
154
+ const skillModel = model ?? config.skillModel;
155
+ const Anthropic = (await import("@anthropic-ai/sdk")).default;
156
+ const client = new Anthropic();
157
+ const prompt = buildExtractionPrompt(trajectories);
158
+ const response = await client.messages.create({
159
+ model: skillModel,
160
+ max_tokens: 500,
161
+ messages: [{ role: "user", content: prompt }]
162
+ });
163
+ const textBlock = response.content.find((b) => b.type === "text");
164
+ const skillText = textBlock?.text;
165
+ if (!skillText) return null;
166
+ const agentId = trajectories[0].agentId;
167
+ const projectName = trajectories[0].projectName;
168
+ const skillId = await storeBehavior({
169
+ agentId,
170
+ content: skillText,
171
+ domain: "skill",
172
+ projectName
173
+ });
174
+ const dbClient = getClient();
175
+ for (const t of trajectories) {
176
+ await dbClient.execute({
177
+ sql: "UPDATE trajectories SET skill_id = ? WHERE id = ?",
178
+ args: [skillId, t.id]
179
+ });
180
+ }
181
+ process.stderr.write(
182
+ `[skill-learning] Skill extracted from ${trajectories.length} trajectories \u2192 behavior ${skillId}
183
+ `
184
+ );
185
+ return skillId;
186
+ }
187
+ async function captureAndLearn(opts) {
188
+ try {
189
+ const config = await loadConfig();
190
+ if (!config.skillLearning) return;
191
+ const { trajectoryId, similarCount, similar } = await captureTrajectory({
192
+ ...opts,
193
+ skillThreshold: config.skillThreshold
194
+ });
195
+ if (!trajectoryId) return;
196
+ if (similarCount >= config.skillThreshold) {
197
+ const unprocessed = similar.filter((t) => !t.skillId);
198
+ if (unprocessed.length >= config.skillThreshold) {
199
+ extractSkill(unprocessed, config.skillModel).catch((err) => {
200
+ process.stderr.write(
201
+ `[skill-learning] Extraction failed: ${err instanceof Error ? err.message : String(err)}
202
+ `
203
+ );
204
+ });
205
+ }
206
+ }
207
+ } catch (err) {
208
+ process.stderr.write(
209
+ `[skill-learning] captureAndLearn failed: ${err instanceof Error ? err.message : String(err)}
210
+ `
211
+ );
212
+ }
213
+ }
214
+ async function sweepTrajectories(threshold, model) {
215
+ const config = await loadConfig();
216
+ if (!config.skillLearning) return { clustersProcessed: 0, skillsExtracted: 0 };
217
+ const t = threshold ?? config.skillThreshold;
218
+ const client = getClient();
219
+ const result = await client.execute({
220
+ sql: `SELECT signature_hash, COUNT(*) as cnt
221
+ FROM trajectories
222
+ WHERE skill_id IS NULL
223
+ GROUP BY signature_hash
224
+ HAVING cnt >= ?
225
+ ORDER BY cnt DESC
226
+ LIMIT 10`,
227
+ args: [t]
228
+ });
229
+ let clustersProcessed = 0;
230
+ let skillsExtracted = 0;
231
+ for (const row of result.rows) {
232
+ const hash = String(row.signature_hash);
233
+ const trajResult = await client.execute({
234
+ sql: `SELECT id, task_id, agent_id, project_name, task_title, signature, signature_hash, tool_count, created_at
235
+ FROM trajectories
236
+ WHERE signature_hash = ? AND skill_id IS NULL
237
+ ORDER BY created_at DESC
238
+ LIMIT 10`,
239
+ args: [hash]
240
+ });
241
+ const trajectories = trajResult.rows.map((r) => ({
242
+ id: String(r.id),
243
+ taskId: String(r.task_id),
244
+ agentId: String(r.agent_id),
245
+ projectName: String(r.project_name),
246
+ taskTitle: String(r.task_title),
247
+ signature: JSON.parse(String(r.signature)),
248
+ signatureHash: String(r.signature_hash),
249
+ toolCount: Number(r.tool_count),
250
+ skillId: null,
251
+ createdAt: String(r.created_at)
252
+ }));
253
+ if (trajectories.length >= t) {
254
+ clustersProcessed++;
255
+ const skillId = await extractSkill(trajectories, model ?? config.skillModel);
256
+ if (skillId) skillsExtracted++;
257
+ }
258
+ }
259
+ return { clustersProcessed, skillsExtracted };
260
+ }
261
+ function editDistance(a, b) {
262
+ const m = a.length;
263
+ const n = b.length;
264
+ const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
265
+ for (let i = 0; i <= m; i++) dp[i][0] = i;
266
+ for (let j = 0; j <= n; j++) dp[0][j] = j;
267
+ for (let i = 1; i <= m; i++) {
268
+ for (let j = 1; j <= n; j++) {
269
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
270
+ dp[i][j] = Math.min(
271
+ dp[i - 1][j] + 1,
272
+ dp[i][j - 1] + 1,
273
+ dp[i - 1][j - 1] + cost
274
+ );
275
+ }
276
+ }
277
+ return dp[m][n];
278
+ }
279
+
280
+ export {
281
+ extractTrajectory,
282
+ hashSignature,
283
+ storeTrajectory,
284
+ findSimilarTrajectories,
285
+ captureTrajectory,
286
+ extractSkill,
287
+ captureAndLearn,
288
+ sweepTrajectories,
289
+ editDistance
290
+ };
@@ -0,0 +1,231 @@
1
+ import {
2
+ recordOrchestrationEventBestEffort
3
+ } from "./chunk-DYICAAAM.js";
4
+ import {
5
+ atomicWriteJsonSync
6
+ } from "./chunk-LYH5HE24.js";
7
+
8
+ // src/lib/session-registry.ts
9
+ import { readFileSync, mkdirSync, existsSync, openSync, closeSync, writeSync, unlinkSync, constants } from "fs";
10
+ import { execFileSync } from "child_process";
11
+ import path from "path";
12
+ import os from "os";
13
+ var REGISTRY_PATH = path.join(os.homedir(), ".exe-os", "session-registry.json");
14
+ var REGISTRY_LOCK_PATH = `${REGISTRY_PATH}.lock`;
15
+ var REGISTRY_CACHE_TTL_MS = 100;
16
+ var registryCache = null;
17
+ function acquireRegistryLock() {
18
+ const dir = path.dirname(REGISTRY_PATH);
19
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
20
+ const data = JSON.stringify({ pid: process.pid, timestamp: Date.now() });
21
+ const deadline = Date.now() + 250;
22
+ while (Date.now() < deadline) {
23
+ try {
24
+ const fd = openSync(REGISTRY_LOCK_PATH, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, 384);
25
+ writeSync(fd, data);
26
+ closeSync(fd);
27
+ return true;
28
+ } catch (err) {
29
+ if (err.code !== "EEXIST") return false;
30
+ try {
31
+ const lock = JSON.parse(readFileSync(REGISTRY_LOCK_PATH, "utf8"));
32
+ if (Date.now() - Number(lock.timestamp ?? 0) > 3e4) unlinkSync(REGISTRY_LOCK_PATH);
33
+ } catch {
34
+ try {
35
+ unlinkSync(REGISTRY_LOCK_PATH);
36
+ } catch {
37
+ }
38
+ }
39
+ }
40
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 25);
41
+ }
42
+ return false;
43
+ }
44
+ function releaseRegistryLock() {
45
+ try {
46
+ unlinkSync(REGISTRY_LOCK_PATH);
47
+ } catch {
48
+ }
49
+ }
50
+ function readSessionsUncached() {
51
+ try {
52
+ const raw = readFileSync(REGISTRY_PATH, "utf8");
53
+ return JSON.parse(raw);
54
+ } catch {
55
+ return [];
56
+ }
57
+ }
58
+ function writeSessions(sessions) {
59
+ atomicWriteJsonSync(REGISTRY_PATH, sessions);
60
+ registryCache = { at: Date.now(), sessions };
61
+ }
62
+ function registerSession(entry) {
63
+ const dir = path.dirname(REGISTRY_PATH);
64
+ if (!existsSync(dir)) {
65
+ mkdirSync(dir, { recursive: true });
66
+ }
67
+ const _locked = acquireRegistryLock();
68
+ try {
69
+ const sessions = readSessionsUncached();
70
+ const idx = sessions.findIndex((s) => s.windowName === entry.windowName);
71
+ if (idx >= 0) {
72
+ sessions[idx] = entry;
73
+ } else {
74
+ sessions.push(entry);
75
+ }
76
+ writeSessions(sessions);
77
+ } finally {
78
+ if (_locked) releaseRegistryLock();
79
+ }
80
+ recordOrchestrationEventBestEffort({
81
+ eventType: "registry.registered",
82
+ source: "session-registry.registerSession",
83
+ agentId: entry.agentId,
84
+ sessionScope: entry.parentExe,
85
+ tmuxSession: entry.windowName,
86
+ payload: { hasProjectDir: Boolean(entry.projectDir) }
87
+ });
88
+ }
89
+ function refreshSessionProject(windowName, projectDir) {
90
+ if (!acquireRegistryLock()) return;
91
+ try {
92
+ const sessions = readSessionsUncached();
93
+ const entry = sessions.find((s) => s.windowName === windowName);
94
+ if (!entry || entry.projectDir === projectDir) return;
95
+ entry.projectDir = projectDir;
96
+ writeSessions(sessions);
97
+ } catch {
98
+ } finally {
99
+ releaseRegistryLock();
100
+ }
101
+ }
102
+ function listSessions() {
103
+ const now = Date.now();
104
+ if (registryCache && now - registryCache.at < REGISTRY_CACHE_TTL_MS) {
105
+ return registryCache.sessions;
106
+ }
107
+ const sessions = readSessionsUncached();
108
+ registryCache = { at: now, sessions };
109
+ return sessions;
110
+ }
111
+ function pruneStaleSessions() {
112
+ if (!acquireRegistryLock()) return 0;
113
+ const sessions = readSessionsUncached();
114
+ if (sessions.length === 0) {
115
+ releaseRegistryLock();
116
+ return 0;
117
+ }
118
+ let liveSessions = [];
119
+ try {
120
+ liveSessions = execFileSync("tmux", ["list-sessions", "-F", "#{session_name}"], {
121
+ encoding: "utf8",
122
+ stdio: ["pipe", "pipe", "pipe"]
123
+ }).trim().split("\n").filter(Boolean);
124
+ } catch {
125
+ releaseRegistryLock();
126
+ return 0;
127
+ }
128
+ const liveSet = new Set(liveSessions);
129
+ const alive = sessions.filter((s) => liveSet.has(s.windowName));
130
+ const staleSessions = sessions.filter((s) => !liveSet.has(s.windowName));
131
+ if (staleSessions.length > 0) {
132
+ recordOrchestrationEventBestEffort({
133
+ eventType: "registry.missing_tmux",
134
+ source: "session-registry.pruneStaleSessions",
135
+ severity: "warn",
136
+ attempt: staleSessions.length,
137
+ payload: {
138
+ count: staleSessions.length,
139
+ examples: staleSessions.slice(0, 5).map((s) => s.windowName)
140
+ }
141
+ });
142
+ }
143
+ const pruned = sessions.length - alive.length;
144
+ if (pruned > 0) {
145
+ writeSessions(alive);
146
+ }
147
+ releaseRegistryLock();
148
+ return pruned;
149
+ }
150
+ function checkSessionRegistryConsistency(liveSessionsOverride) {
151
+ const sessions = listSessions();
152
+ const result = { missingTmux: 0, missingRegistry: 0 };
153
+ let liveSessions = liveSessionsOverride;
154
+ if (!liveSessions) {
155
+ try {
156
+ liveSessions = execFileSync("tmux", ["list-sessions", "-F", "#{session_name}"], {
157
+ encoding: "utf8",
158
+ stdio: ["pipe", "pipe", "pipe"]
159
+ }).trim().split("\n").filter(Boolean);
160
+ } catch {
161
+ return result;
162
+ }
163
+ }
164
+ const liveSet = new Set(liveSessions);
165
+ const registeredSet = new Set(sessions.map((s) => s.windowName));
166
+ const missingTmuxExamples = [];
167
+ const missingRegistryExamples = [];
168
+ for (const entry of sessions) {
169
+ if (liveSet.has(entry.windowName)) continue;
170
+ result.missingTmux++;
171
+ if (missingTmuxExamples.length < 5) missingTmuxExamples.push(entry.windowName);
172
+ }
173
+ for (const live of liveSessions) {
174
+ if (registeredSet.has(live)) continue;
175
+ if (!looksLikeExeOsSession(live)) continue;
176
+ result.missingRegistry++;
177
+ if (missingRegistryExamples.length < 5) missingRegistryExamples.push(live);
178
+ }
179
+ if (result.missingTmux > 0) {
180
+ recordOrchestrationEventBestEffort({
181
+ eventType: "registry.missing_tmux",
182
+ source: "session-registry.checkSessionRegistryConsistency",
183
+ severity: "warn",
184
+ attempt: result.missingTmux,
185
+ payload: {
186
+ count: result.missingTmux,
187
+ examples: missingTmuxExamples
188
+ }
189
+ });
190
+ }
191
+ if (result.missingRegistry > 0) {
192
+ recordOrchestrationEventBestEffort({
193
+ eventType: "registry.missing_entry",
194
+ source: "session-registry.checkSessionRegistryConsistency",
195
+ severity: "warn",
196
+ attempt: result.missingRegistry,
197
+ payload: {
198
+ count: result.missingRegistry,
199
+ examples: missingRegistryExamples
200
+ }
201
+ });
202
+ }
203
+ return result;
204
+ }
205
+ function looksLikeExeOsSession(sessionName) {
206
+ const coordName = getCoordinatorNameCached();
207
+ const escaped = coordName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
208
+ const coordPattern = new RegExp(`^${escaped}\\d*$`);
209
+ const employeePattern = new RegExp(`-${escaped}\\d*$`);
210
+ return coordPattern.test(sessionName) || employeePattern.test(sessionName);
211
+ }
212
+ function getCoordinatorNameCached() {
213
+ try {
214
+ const rosterPath = path.join(os.homedir(), ".exe-os", "exe-employees.json");
215
+ if (existsSync(rosterPath)) {
216
+ const roster = JSON.parse(readFileSync(rosterPath, "utf8"));
217
+ const coo = roster.find((e) => (e.role ?? "").toUpperCase() === "COO");
218
+ if (coo?.name) return coo.name;
219
+ }
220
+ } catch {
221
+ }
222
+ return "exe";
223
+ }
224
+
225
+ export {
226
+ registerSession,
227
+ refreshSessionProject,
228
+ listSessions,
229
+ pruneStaleSessions,
230
+ checkSessionRegistryConsistency
231
+ };
@@ -0,0 +1,159 @@
1
+ import {
2
+ EMBEDDING_DIM
3
+ } from "./chunk-FXU7JOXK.js";
4
+
5
+ // src/lib/tool-capability-index.ts
6
+ var ALWAYS_ON = /* @__PURE__ */ new Set([
7
+ "mcp_ping",
8
+ "memory",
9
+ "task",
10
+ "message",
11
+ "identity",
12
+ "diagnostics",
13
+ "session"
14
+ ]);
15
+ function categoryForToolName(toolName, categoryMap) {
16
+ const normalized = toolName.replace(/[_-]/g, "").toLowerCase();
17
+ for (const [registerFn, cat] of Object.entries(categoryMap)) {
18
+ const fnNormalized = registerFn.replace(/^register/, "").toLowerCase();
19
+ if (fnNormalized === normalized) return cat;
20
+ }
21
+ return "unknown";
22
+ }
23
+ function extractParamNames(inputSchema) {
24
+ if (!inputSchema || typeof inputSchema !== "object") return "";
25
+ return Object.keys(inputSchema).join(", ");
26
+ }
27
+ function cosineSimilarity(a, b) {
28
+ if (a.length !== b.length || a.length === 0) return 0;
29
+ let dot = 0, normA = 0, normB = 0;
30
+ for (let i = 0; i < a.length; i++) {
31
+ dot += a[i] * b[i];
32
+ normA += a[i] * a[i];
33
+ normB += b[i] * b[i];
34
+ }
35
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
36
+ return denom === 0 ? 0 : dot / denom;
37
+ }
38
+ function keywordScore(query, tool) {
39
+ const words = query.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
40
+ if (words.length === 0) return 0;
41
+ const searchText = `${tool.name} ${tool.description} ${tool.category} ${tool.paramSummary}`.toLowerCase();
42
+ let matches = 0;
43
+ for (const word of words) {
44
+ if (searchText.includes(word)) matches++;
45
+ }
46
+ return matches / words.length;
47
+ }
48
+ var ToolCapabilityIndex = class {
49
+ capabilities = [];
50
+ initialized = false;
51
+ /**
52
+ * Build the index by intercepting registerAllTools via a fake McpServer.
53
+ *
54
+ * @param registerFn - function that registers tools on a server (e.g. registerAllTools)
55
+ * @param categoryMap - optional map of registerFnName → category (from tool-gates TOOL_CATEGORIES)
56
+ */
57
+ async buildIndex(registerFn, categoryMap, directEmbedFn) {
58
+ const captured = [];
59
+ const fakeServer = {
60
+ registerTool(name, config, _handler) {
61
+ captured.push({
62
+ name,
63
+ description: config.description ?? "",
64
+ inputSchema: config.inputSchema ?? {}
65
+ });
66
+ }
67
+ };
68
+ registerFn(fakeServer);
69
+ const capabilityDocs = [];
70
+ for (const tool of captured) {
71
+ const paramSummary = extractParamNames(tool.inputSchema);
72
+ const category = categoryMap ? categoryForToolName(tool.name, categoryMap) : "unknown";
73
+ const doc = `${tool.name}: ${tool.description}. Parameters: ${paramSummary}`;
74
+ capabilityDocs.push({ name: tool.name, description: tool.description, category, paramSummary, doc });
75
+ }
76
+ let vectors = capabilityDocs.map(() => null);
77
+ try {
78
+ if (directEmbedFn) {
79
+ const allVectors = await directEmbedFn(capabilityDocs.map((c) => c.doc));
80
+ vectors = allVectors.map((v) => v.length === EMBEDDING_DIM ? v : null);
81
+ } else {
82
+ const { embed } = await import("./lib/embedder.js");
83
+ const test = await embed("test");
84
+ if (test.length === EMBEDDING_DIM) {
85
+ for (let i = 0; i < capabilityDocs.length; i++) {
86
+ try {
87
+ vectors[i] = await embed(capabilityDocs[i].doc);
88
+ } catch {
89
+ }
90
+ }
91
+ }
92
+ }
93
+ } catch {
94
+ }
95
+ const capabilities = capabilityDocs.map((c, i) => ({
96
+ name: c.name,
97
+ description: c.description,
98
+ category: c.category,
99
+ vector: vectors[i] ?? null,
100
+ paramSummary: c.paramSummary
101
+ }));
102
+ this.capabilities = capabilities;
103
+ this.initialized = true;
104
+ process.stderr.write(
105
+ `[tool-capability-index] Indexed ${capabilities.length} tools (${capabilities.filter((c) => c.vector).length} with vectors)
106
+ `
107
+ );
108
+ }
109
+ /**
110
+ * Semantic search for tools matching a natural-language query.
111
+ * Returns tools sorted by relevance, with always-on tools boosted.
112
+ */
113
+ async search(query, limit = 20) {
114
+ if (!this.initialized || this.capabilities.length === 0) return [];
115
+ let queryVector = null;
116
+ try {
117
+ const { embed } = await import("./lib/embedder.js");
118
+ queryVector = await embed(query);
119
+ } catch {
120
+ }
121
+ const scored = [];
122
+ for (const tool of this.capabilities) {
123
+ let relevance;
124
+ if (queryVector && tool.vector) {
125
+ const vecScore = cosineSimilarity(queryVector, tool.vector);
126
+ const kwScore = keywordScore(query, tool);
127
+ relevance = vecScore * 0.8 + kwScore * 0.2;
128
+ } else {
129
+ relevance = keywordScore(query, tool);
130
+ }
131
+ if (ALWAYS_ON.has(tool.name)) {
132
+ relevance = Math.max(relevance, 0.5);
133
+ }
134
+ scored.push({ ...tool, relevance });
135
+ }
136
+ scored.sort((a, b) => b.relevance - a.relevance);
137
+ return scored.slice(0, limit);
138
+ }
139
+ /** Whether the index has been built. */
140
+ isReady() {
141
+ return this.initialized;
142
+ }
143
+ /** Total number of indexed tools. */
144
+ get toolCount() {
145
+ return this.capabilities.length;
146
+ }
147
+ };
148
+ var _instance = null;
149
+ function getToolCapabilityIndex() {
150
+ if (!_instance) {
151
+ _instance = new ToolCapabilityIndex();
152
+ }
153
+ return _instance;
154
+ }
155
+
156
+ export {
157
+ ToolCapabilityIndex,
158
+ getToolCapabilityIndex
159
+ };