@askexenow/exe-os 0.9.280 → 0.9.281

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 (436) hide show
  1. package/deploy/compose/.env.customer.example +1 -1
  2. package/deploy/compose/.env.default +2 -1
  3. package/deploy/compose/.env.example +1 -1
  4. package/deploy/compose/docker-compose.yml +74 -13
  5. package/deploy/compose/erp-nginx/nginx.conf +52 -0
  6. package/deploy/compose/generate-env.ts +1 -1
  7. package/deploy/compose/init-db.sql +13 -2
  8. package/deploy/stack-manifests/v0.9.json +11 -31
  9. package/dist/active-agent-6ZBHGHXF.js +26 -0
  10. package/dist/active-agent-E23SCYER.js +27 -0
  11. package/dist/active-agent-KMZT44S4.js +26 -0
  12. package/dist/active-agent-LFFTVROM.js +27 -0
  13. package/dist/agentic-ontology-PCZB5HV5.js +25 -0
  14. package/dist/agentic-ontology-PGGJN2ES.js +25 -0
  15. package/dist/assets/tmux.conf +2 -0
  16. package/dist/backfill-metadata-KQ4FEVUR.js +599 -0
  17. package/dist/backfill-metadata-Y3YWCHKJ.js +599 -0
  18. package/dist/behaviors-H4DZECKL.js +39 -0
  19. package/dist/behaviors-WIUTIJF6.js +39 -0
  20. package/dist/bin/agentic-ontology-backfill.js +5 -5
  21. package/dist/bin/agentic-reflection-backfill.js +6 -6
  22. package/dist/bin/agentic-semantic-label.js +5 -5
  23. package/dist/bin/backfill-conversations.js +4 -4
  24. package/dist/bin/backfill-responses.js +4 -4
  25. package/dist/bin/backfill-vectors.js +5 -5
  26. package/dist/bin/bulk-sync-postgres.js +7 -7
  27. package/dist/bin/cc-doctor.js +4 -4
  28. package/dist/bin/cleanup-stale-review-tasks.js +10 -10
  29. package/dist/bin/cli.js +15 -15
  30. package/dist/bin/exe-agent-config.js +2 -2
  31. package/dist/bin/exe-agent.js +4 -4
  32. package/dist/bin/exe-assign.js +5 -5
  33. package/dist/bin/exe-boot.js +17 -17
  34. package/dist/bin/exe-call.js +4 -4
  35. package/dist/bin/exe-cloud.js +5 -5
  36. package/dist/bin/exe-dispatch.js +10 -10
  37. package/dist/bin/exe-doctor.js +1 -1
  38. package/dist/bin/exe-export-behaviors.js +7 -7
  39. package/dist/bin/exe-forget.js +6 -6
  40. package/dist/bin/exe-gateway.js +7 -7
  41. package/dist/bin/exe-healthcheck.js +4 -4
  42. package/dist/bin/exe-heartbeat.js +10 -10
  43. package/dist/bin/exe-kill.js +13 -13
  44. package/dist/bin/exe-launch-agent.js +17 -17
  45. package/dist/bin/exe-new-employee.js +7 -7
  46. package/dist/bin/exe-pending-messages.js +11 -11
  47. package/dist/bin/exe-pending-notifications.js +10 -10
  48. package/dist/bin/exe-pending-reviews.js +10 -10
  49. package/dist/bin/exe-rename.js +4 -4
  50. package/dist/bin/exe-review.js +12 -12
  51. package/dist/bin/exe-search.js +5 -5
  52. package/dist/bin/exe-session-cleanup.js +15 -15
  53. package/dist/bin/exe-settings.js +5 -5
  54. package/dist/bin/exe-start-codex.js +11 -11
  55. package/dist/bin/exe-start-opencode.js +8 -8
  56. package/dist/bin/exe-status.js +11 -11
  57. package/dist/bin/exe-support.js +2 -2
  58. package/dist/bin/exe-team.js +3 -3
  59. package/dist/bin/exe-watchdog.js +17 -2
  60. package/dist/bin/git-sweep.js +11 -11
  61. package/dist/bin/graph-backfill.js +4 -4
  62. package/dist/bin/graph-export.js +5 -5
  63. package/dist/bin/import-history.js +7 -7
  64. package/dist/bin/install.js +8 -7
  65. package/dist/bin/intercom-check.js +4 -4
  66. package/dist/bin/mcp-sessions.js +2 -2
  67. package/dist/bin/orchestration-metrics.js +4 -4
  68. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  69. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  70. package/dist/bin/scan-tasks.js +10 -10
  71. package/dist/bin/setup.js +1 -1
  72. package/dist/bin/shard-migrate.js +4 -4
  73. package/dist/bin/stack-update.js +3 -3
  74. package/dist/bin/vps-health-gate.js +1 -1
  75. package/dist/capability-cards-F22XWGLB.js +88 -0
  76. package/dist/capability-cards-KCKITXXZ.js +88 -0
  77. package/dist/capacity-monitor-CHXGKVEO.js +50 -0
  78. package/dist/capacity-monitor-L3M5KB6T.js +50 -0
  79. package/dist/catchup-brief-BVZANLRZ.js +154 -0
  80. package/dist/catchup-brief-LDUGMC7S.js +154 -0
  81. package/dist/catchup-brief-NZDLL7SA.js +154 -0
  82. package/dist/catchup-brief-OOIXVGBA.js +154 -0
  83. package/dist/catchup-brief-UPXHDYTB.js +154 -0
  84. package/dist/chunk-2BI3FQKL.js +1876 -0
  85. package/dist/chunk-2CJUQGHH.js +362 -0
  86. package/dist/chunk-2EVYBMBJ.js +128 -0
  87. package/dist/chunk-2NQOZOXG.js +2113 -0
  88. package/dist/chunk-2QK5E3LB.js +128 -0
  89. package/dist/chunk-2VTCG4ZU.js +1352 -0
  90. package/dist/chunk-2YGI36DV.js +1119 -0
  91. package/dist/chunk-32BQN2QN.js +185 -0
  92. package/dist/chunk-33JMO4UV.js +157 -0
  93. package/dist/chunk-3DZAYLXY.js +377 -0
  94. package/dist/chunk-3MGBE7GR.js +76 -0
  95. package/dist/chunk-3MTV4FJL.js +271 -0
  96. package/dist/chunk-3NN7VQ27.js +1352 -0
  97. package/dist/chunk-4533HNOG.js +70 -0
  98. package/dist/chunk-456UW3MT.js +731 -0
  99. package/dist/chunk-4AU56XV2.js +58 -0
  100. package/dist/chunk-4MRP6EBR.js +280 -0
  101. package/dist/chunk-4MRWW52U.js +14219 -0
  102. package/dist/chunk-4WWECNAY.js +50 -0
  103. package/dist/chunk-4ZJDDR6L.js +171 -0
  104. package/dist/chunk-522EOPM6.js +382 -0
  105. package/dist/chunk-52UDAVZE.js +3208 -0
  106. package/dist/chunk-5FAMUB4X.js +204 -0
  107. package/dist/chunk-5PGZJQUI.js +58 -0
  108. package/dist/chunk-67TZJXNZ.js +262 -0
  109. package/dist/chunk-6FEZ7GN2.js +123 -0
  110. package/dist/chunk-6MOGND7S.js +14219 -0
  111. package/dist/chunk-6TRSVY7L.js +181 -0
  112. package/dist/chunk-6WCS7ZNK.js +85 -0
  113. package/dist/chunk-6WRYDREW.js +539 -0
  114. package/dist/chunk-72UA2FB3.js +181 -0
  115. package/dist/chunk-77DMFEOL.js +30 -0
  116. package/dist/chunk-7COXVQ5W.js +214 -0
  117. package/dist/chunk-7HLWBYH7.js +60 -0
  118. package/dist/chunk-ALSTZCWT.js +204 -0
  119. package/dist/chunk-ARUTDXZX.js +280 -0
  120. package/dist/chunk-AU47B4QY.js +129 -0
  121. package/dist/chunk-AXOREWVL.js +836 -0
  122. package/dist/chunk-B5MNC54V.js +127 -0
  123. package/dist/chunk-B74VSMKX.js +1350 -0
  124. package/dist/chunk-BHWLH44J.js +362 -0
  125. package/dist/chunk-BUPZ3HD2.js +85 -0
  126. package/dist/chunk-BWVLMA53.js +2113 -0
  127. package/dist/chunk-C5WLBKMJ.js +50 -0
  128. package/dist/chunk-C62T6R2A.js +97 -0
  129. package/dist/chunk-CV5KBAIK.js +33 -0
  130. package/dist/chunk-DAYSDWXA.js +1068 -0
  131. package/dist/chunk-DI4URIUB.js +227 -0
  132. package/dist/chunk-DNTCYFJ6.js +76 -0
  133. package/dist/chunk-DPDRRS7T.js +103 -0
  134. package/dist/chunk-DT3EV6CW.js +103 -0
  135. package/dist/chunk-DX45HDWY.js +1076 -0
  136. package/dist/chunk-E72BD6MG.js +284 -0
  137. package/dist/chunk-EAPUSVKS.js +375 -0
  138. package/dist/chunk-EFUANRRT.js +85 -0
  139. package/dist/chunk-EG2SCT5R.js +1352 -0
  140. package/dist/chunk-EJD2JU77.js +58 -0
  141. package/dist/chunk-EMXYUAVP.js +81 -0
  142. package/dist/chunk-ENM2TAAM.js +14219 -0
  143. package/dist/chunk-EPDRTPVP.js +1876 -0
  144. package/dist/chunk-EW6XDHID.js +221 -0
  145. package/dist/chunk-EYEGSAWZ.js +1094 -0
  146. package/dist/chunk-F6L33PAQ.js +231 -0
  147. package/dist/chunk-FC2SCTVE.js +38 -0
  148. package/dist/chunk-FSRKIZGZ.js +630 -0
  149. package/dist/chunk-FTG7I5CB.js +81 -0
  150. package/dist/chunk-GVFRLWX7.js +30 -0
  151. package/dist/chunk-H3XMZOWW.js +1119 -0
  152. package/dist/chunk-HAKXE6LN.js +123 -0
  153. package/dist/chunk-HLP3ZDTW.js +448 -0
  154. package/dist/chunk-HOYWKQAA.js +510 -0
  155. package/dist/chunk-HWDD64IW.js +712 -0
  156. package/dist/chunk-HWMCULHY.js +127 -0
  157. package/dist/chunk-HZZHRZPK.js +210 -0
  158. package/dist/chunk-ICRWTYNW.js +103 -0
  159. package/dist/chunk-J5MWPC33.js +167 -0
  160. package/dist/chunk-JBXANNNB.js +70 -0
  161. package/dist/chunk-JPBMIYWF.js +1352 -0
  162. package/dist/chunk-JY6EXBFI.js +373 -0
  163. package/dist/chunk-JZLIBXI7.js +14219 -0
  164. package/dist/chunk-JZPTKXJ6.js +668 -0
  165. package/dist/chunk-KEYMA4ZP.js +510 -0
  166. package/dist/chunk-KHGNN6GL.js +2078 -0
  167. package/dist/chunk-KVLB2PD6.js +97 -0
  168. package/dist/chunk-L3YBRBKL.js +1076 -0
  169. package/dist/chunk-L7VZ32NA.js +89 -0
  170. package/dist/chunk-LEHLADW4.js +221 -0
  171. package/dist/chunk-LPD4HILQ.js +262 -0
  172. package/dist/chunk-LSJ3ADDI.js +51 -0
  173. package/dist/chunk-LUMS2MAS.js +58 -0
  174. package/dist/chunk-LV4SEC6C.js +394 -0
  175. package/dist/chunk-LXXBEI4A.js +284 -0
  176. package/dist/chunk-M4NPCAIH.js +456 -0
  177. package/dist/chunk-MFJ62LQ5.js +157 -0
  178. package/dist/chunk-MGEZNKOD.js +836 -0
  179. package/dist/chunk-MJ7X5IBW.js +227 -0
  180. package/dist/chunk-MLGRWCY4.js +54 -0
  181. package/dist/chunk-MQZX57IY.js +348 -0
  182. package/dist/chunk-MY7MFF6J.js +103 -0
  183. package/dist/chunk-MYA2X5OY.js +185 -0
  184. package/dist/chunk-MYEABW5Z.js +630 -0
  185. package/dist/chunk-MZ2TDCAL.js +402 -0
  186. package/dist/chunk-NF3FRB7Z.js +271 -0
  187. package/dist/chunk-NXYIFEPV.js +539 -0
  188. package/dist/chunk-O2GVE5B5.js +58 -0
  189. package/dist/chunk-O5GUCDR2.js +456 -0
  190. package/dist/chunk-OBZNRECA.js +128 -0
  191. package/dist/chunk-OMZ2RLJG.js +214 -0
  192. package/dist/chunk-ORDHJRWN.js +299 -0
  193. package/dist/chunk-OSPIJMCD.js +210 -0
  194. package/dist/chunk-OUGWEH4J.js +240 -0
  195. package/dist/chunk-OV5MJQGC.js +1876 -0
  196. package/dist/chunk-PC635OAG.js +4318 -0
  197. package/dist/chunk-PH46R4J6.js +348 -0
  198. package/dist/chunk-PJP2EP7P.js +394 -0
  199. package/dist/chunk-PODFWH3V.js +333 -0
  200. package/dist/chunk-PPWH3SHR.js +1068 -0
  201. package/dist/chunk-PWPJK7KB.js +4318 -0
  202. package/dist/chunk-PXONZVG4.js +377 -0
  203. package/dist/chunk-QAOGJRZD.js +369 -0
  204. package/dist/chunk-QC3LAEI7.js +197 -0
  205. package/dist/chunk-QDWQDUWI.js +668 -0
  206. package/dist/chunk-QKJFD6BH.js +1350 -0
  207. package/dist/chunk-QNYVJGFM.js +345 -0
  208. package/dist/chunk-QQF3XGQ5.js +14219 -0
  209. package/dist/chunk-QRPFQNI3.js +150 -0
  210. package/dist/chunk-QSSU5XWD.js +731 -0
  211. package/dist/chunk-QXZAGVAV.js +2078 -0
  212. package/dist/chunk-RA54MW64.js +244 -0
  213. package/dist/chunk-RF7PUWXI.js +197 -0
  214. package/dist/chunk-S3INDYSO.js +244 -0
  215. package/dist/chunk-SLQVTHH5.js +369 -0
  216. package/dist/chunk-SY2B74KL.js +345 -0
  217. package/dist/chunk-T6QPXXXW.js +712 -0
  218. package/dist/chunk-TO5M5YCT.js +41 -0
  219. package/dist/chunk-TQ4VXUAF.js +129 -0
  220. package/dist/chunk-UAB7RQC4.js +41 -0
  221. package/dist/chunk-UMEIBDYW.js +97 -0
  222. package/dist/chunk-UXW5TB7Y.js +240 -0
  223. package/dist/chunk-VB2N5WOX.js +150 -0
  224. package/dist/chunk-VLZEMRG3.js +167 -0
  225. package/dist/chunk-VM3V6VK7.js +230 -0
  226. package/dist/chunk-VMCGKBHB.js +1352 -0
  227. package/dist/chunk-VNIYZAR5.js +128 -0
  228. package/dist/chunk-VYV4KOD2.js +85 -0
  229. package/dist/chunk-W4SRJBAT.js +171 -0
  230. package/dist/chunk-W5W3LZ3Q.js +54 -0
  231. package/dist/chunk-WDNZEOM3.js +38 -0
  232. package/dist/chunk-WUKEXVOR.js +3208 -0
  233. package/dist/chunk-X3Z35Q6L.js +373 -0
  234. package/dist/chunk-X4VOU6BQ.js +382 -0
  235. package/dist/chunk-X6EEVSVG.js +290 -0
  236. package/dist/chunk-XFHGWGNB.js +1094 -0
  237. package/dist/chunk-XKOLRWYA.js +33 -0
  238. package/dist/chunk-XMMIL3UD.js +402 -0
  239. package/dist/chunk-XWILC6VA.js +290 -0
  240. package/dist/chunk-Y4OQCX4C.js +97 -0
  241. package/dist/chunk-Y67VYYOA.js +231 -0
  242. package/dist/chunk-YGQCQTQH.js +230 -0
  243. package/dist/chunk-YGWFBN5A.js +299 -0
  244. package/dist/chunk-YMKUXZIG.js +379 -0
  245. package/dist/chunk-YOMLMT7E.js +230 -0
  246. package/dist/chunk-YPESIZOB.js +14219 -0
  247. package/dist/chunk-Z2CGCIU2.js +89 -0
  248. package/dist/chunk-ZLAWNHQR.js +448 -0
  249. package/dist/chunk-ZME5UQSN.js +333 -0
  250. package/dist/co-activation-NUEQYXE5.js +73 -0
  251. package/dist/co-activation-ZG5HLBCZ.js +73 -0
  252. package/dist/co-occurrence-7S5KWQB2.js +94 -0
  253. package/dist/co-occurrence-X5SWDXT2.js +94 -0
  254. package/dist/core-memory-GOPBRGGZ.js +110 -0
  255. package/dist/core-memory-XLCU6L5M.js +110 -0
  256. package/dist/crdt-sync-EPKHPGRZ.js +33 -0
  257. package/dist/crdt-sync-UIQJ5U7T.js +33 -0
  258. package/dist/crm-webhook-MKN23JNU.js +10 -0
  259. package/dist/crm-webhook-SM63BPXO.js +10 -0
  260. package/dist/cto-delegation-gate-PQY5TOVZ.js +279 -0
  261. package/dist/cto-delegation-gate-V5VVUR3G.js +279 -0
  262. package/dist/daemon-orchestration-C7AAS67Q.js +138 -0
  263. package/dist/daemon-orchestration-OBCAJB2H.js +138 -0
  264. package/dist/db-backup-F7VP4QRH.js +33 -0
  265. package/dist/db-backup-KVYC57W7.js +33 -0
  266. package/dist/doc-graph-extractor-H2ETEINP.js +132 -0
  267. package/dist/doc-graph-extractor-PCUZEYCH.js +132 -0
  268. package/dist/dreaming-4OZXSLE3.js +33 -0
  269. package/dist/dreaming-Z2RYEYNT.js +33 -0
  270. package/dist/exe-drift-GEWNIK7A.js +69 -0
  271. package/dist/exe-drift-XCGH7AFO.js +69 -0
  272. package/dist/exe-export-7DKAU5IP.js +75 -0
  273. package/dist/exe-export-BCHH6OE6.js +75 -0
  274. package/dist/exe-import-PDRIZVYF.js +78 -0
  275. package/dist/exe-import-ZCKUDFKL.js +78 -0
  276. package/dist/exe-key-FUWLLI3U.js +580 -0
  277. package/dist/exe-key-RKKNVUMP.js +580 -0
  278. package/dist/exe-snapshot-G4I5FQMK.js +337 -0
  279. package/dist/exe-snapshot-GWU7QTZK.js +337 -0
  280. package/dist/fast-db-init-6QG6YQNT.js +7 -0
  281. package/dist/fast-db-init-X2QDQUA4.js +7 -0
  282. package/dist/founder-context-TOMNUBGJ.js +96 -0
  283. package/dist/founder-context-UU3V6MAS.js +96 -0
  284. package/dist/gateway/index.js +8 -8
  285. package/dist/git-staleness-FEPFMZKF.js +111 -0
  286. package/dist/git-staleness-HYVYLCW3.js +111 -0
  287. package/dist/git-task-sweep-IRV52JIM.js +41 -0
  288. package/dist/git-task-sweep-T6BSM3GS.js +41 -0
  289. package/dist/global-procedures-3AURRMKO.js +21 -0
  290. package/dist/global-procedures-JPCYBZYC.js +21 -0
  291. package/dist/graph-auto-extract-OC3AOSMW.js +182 -0
  292. package/dist/graph-auto-extract-PVDYEJBY.js +182 -0
  293. package/dist/hooks/bug-report-worker.js +12 -12
  294. package/dist/hooks/codex-stop-task-finalizer.js +12 -12
  295. package/dist/hooks/commit-complete.js +12 -12
  296. package/dist/hooks/error-recall.js +6 -6
  297. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  298. package/dist/hooks/ingest.js +6 -6
  299. package/dist/hooks/instructions-loaded.js +4 -4
  300. package/dist/hooks/manifest.json +19 -19
  301. package/dist/hooks/notification.js +4 -4
  302. package/dist/hooks/post-compact.js +11 -11
  303. package/dist/hooks/post-tool-combined.js +5 -5
  304. package/dist/hooks/pre-compact.js +12 -12
  305. package/dist/hooks/pre-tool-use.js +15 -15
  306. package/dist/hooks/prompt-submit.js +22 -22
  307. package/dist/hooks/session-end.js +16 -16
  308. package/dist/hooks/session-start.js +10 -10
  309. package/dist/hooks/stop.js +15 -15
  310. package/dist/hooks/subagent-stop.js +11 -11
  311. package/dist/hooks/summary-worker.js +15 -15
  312. package/dist/index.js +18 -18
  313. package/dist/installer-72XXLBRP.js +39 -0
  314. package/dist/installer-HDXG2BZN.js +343 -0
  315. package/dist/installer-JALMKPCS.js +297 -0
  316. package/dist/installer-Q46SNNLU.js +39 -0
  317. package/dist/installer-W7PIPRCX.js +343 -0
  318. package/dist/installer-Z7WQEOS7.js +297 -0
  319. package/dist/lib/cloud-sync.js +5 -5
  320. package/dist/lib/consolidation.js +5 -5
  321. package/dist/lib/database.js +2 -2
  322. package/dist/lib/db.js +2 -2
  323. package/dist/lib/employee-templates.js +4 -4
  324. package/dist/lib/employees.js +2 -2
  325. package/dist/lib/exe-daemon.js +45 -41
  326. package/dist/lib/hybrid-search.js +5 -5
  327. package/dist/lib/identity.js +2 -2
  328. package/dist/lib/license.js +1 -1
  329. package/dist/lib/messaging.js +10 -10
  330. package/dist/lib/reminders.js +3 -3
  331. package/dist/lib/schedules.js +5 -5
  332. package/dist/lib/session-registry.js +4 -4
  333. package/dist/lib/skill-learning.js +6 -6
  334. package/dist/lib/store.js +4 -4
  335. package/dist/lib/task-router.js +3 -3
  336. package/dist/lib/tasks.js +11 -11
  337. package/dist/lib/tmux-routing.js +9 -9
  338. package/dist/lib/token-spend.js +3 -3
  339. package/dist/license-gate-7JZCHOAG.js +14 -0
  340. package/dist/license-gate-OP4SKL4P.js +14 -0
  341. package/dist/mcp/register-tools.js +58 -58
  342. package/dist/mcp/server.js +59 -59
  343. package/dist/mcp/tools/complete-reminder.js +4 -4
  344. package/dist/mcp/tools/create-reminder.js +4 -4
  345. package/dist/mcp/tools/create-task.js +13 -13
  346. package/dist/mcp/tools/deactivate-behavior.js +7 -7
  347. package/dist/mcp/tools/list-reminders.js +4 -4
  348. package/dist/mcp/tools/list-tasks.js +13 -13
  349. package/dist/mcp/tools/send-message.js +12 -12
  350. package/dist/mcp/tools/update-task.js +12 -12
  351. package/dist/mcp-health-VULNT722.js +17 -0
  352. package/dist/mcp-health-WDOB6XUB.js +19 -0
  353. package/dist/mcp-http-config-2OZ7N74D.js +28 -0
  354. package/dist/mcp-http-config-4VXA5K73.js +28 -0
  355. package/dist/memory-cards-2K6QRZU6.js +179 -0
  356. package/dist/memory-cards-KSJF5OH2.js +179 -0
  357. package/dist/memory-graph-extractor-IJD5HWYT.js +21 -0
  358. package/dist/memory-graph-extractor-O4GAXOK5.js +21 -0
  359. package/dist/memory-poisoning-defense-2JRPWT5V.js +223 -0
  360. package/dist/memory-poisoning-defense-DH4A25NU.js +223 -0
  361. package/dist/memory-reflection-ISY2BBDB.js +243 -0
  362. package/dist/memory-reflection-Z5AQRR6H.js +243 -0
  363. package/dist/notifications-2VSWK2UJ.js +46 -0
  364. package/dist/notifications-4S253VQM.js +46 -0
  365. package/dist/oauth-server-D7D4574D.js +437 -0
  366. package/dist/oauth-server-MACN54SJ.js +437 -0
  367. package/dist/orchestration-events-BGP5RYQI.js +26 -0
  368. package/dist/orchestration-events-MDXUEVRZ.js +26 -0
  369. package/dist/orchestrator-DHK7RSSH.js +34 -0
  370. package/dist/orchestrator-R75WHQVA.js +34 -0
  371. package/dist/pipeline-router-4WUKQQEC.js +14 -0
  372. package/dist/pipeline-router-GWB2XK2Q.js +14 -0
  373. package/dist/plan-limits-NNJRAESF.js +27 -0
  374. package/dist/plan-limits-YTQW4UR4.js +27 -0
  375. package/dist/project-boot-46GZJTEX.js +299 -0
  376. package/dist/project-boot-PPHBBGIF.js +299 -0
  377. package/dist/projection-worker-UPAWXI7P.js +1034 -0
  378. package/dist/projection-worker-ZIKDYBW5.js +1034 -0
  379. package/dist/reranker-5ZBP2RRN.js +19 -0
  380. package/dist/reranker-E2MQIMJL.js +19 -0
  381. package/dist/reranker-GLSDJT3V.js +19 -0
  382. package/dist/reranker-LBBXWNOD.js +19 -0
  383. package/dist/reranker-XZ2EF4OH.js +19 -0
  384. package/dist/retrieval-health-JYRKPSII.js +7 -0
  385. package/dist/retrieval-health-OUV25J6S.js +7 -0
  386. package/dist/retrieval-health-U73JUAZL.js +7 -0
  387. package/dist/retrieval-health-WSZ7TYFF.js +7 -0
  388. package/dist/review-polling-62JV55ZT.js +125 -0
  389. package/dist/review-polling-CJXLWFWK.js +125 -0
  390. package/dist/runtime/index.js +12 -12
  391. package/dist/session-events-2ADD54VI.js +37 -0
  392. package/dist/session-events-QIJVBSKS.js +37 -0
  393. package/dist/session-kill-telemetry-HS6HD2YE.js +30 -0
  394. package/dist/session-kill-telemetry-MRT5FVSM.js +30 -0
  395. package/dist/session-scope-7ICYPC33.js +87 -0
  396. package/dist/session-scope-KMXD6EE6.js +87 -0
  397. package/dist/setup-wizard-B6GIT7YC.js +12 -0
  398. package/dist/setup-wizard-JUIJ4UZO.js +12 -0
  399. package/dist/skill-refinement-HIOX4VMC.js +158 -0
  400. package/dist/skill-refinement-T7JXRYUW.js +158 -0
  401. package/dist/stack-update-5KE6BZKQ.js +74 -0
  402. package/dist/stack-update-OP2RHP7N.js +74 -0
  403. package/dist/stack-update-VGCWDJEE.js +74 -0
  404. package/dist/steward-gate-L22WE3SY.js +14 -0
  405. package/dist/steward-gate-YKD2LUWN.js +14 -0
  406. package/dist/task-enforcement-5AOKXTY4.js +439 -0
  407. package/dist/task-enforcement-VO3YEGIO.js +439 -0
  408. package/dist/task-scope-YV2WPKRD.js +36 -0
  409. package/dist/task-scope-ZSXDZBRE.js +36 -0
  410. package/dist/tasks-crud-C6KADACT.js +78 -0
  411. package/dist/tasks-crud-NV6JEWGL.js +78 -0
  412. package/dist/tasks-notify-E22HSN6O.js +39 -0
  413. package/dist/tasks-notify-RPSEQ4WV.js +39 -0
  414. package/dist/tasks-review-V4ZLXOAZ.js +48 -0
  415. package/dist/tasks-review-ZVRI73JE.js +48 -0
  416. package/dist/telemetry-upload-LXUH7SKI.js +740 -0
  417. package/dist/telemetry-upload-TCDAZTUQ.js +740 -0
  418. package/dist/token-budget-OFBEZJTA.js +85 -0
  419. package/dist/token-budget-WAN57V6S.js +85 -0
  420. package/dist/tool-telemetry-UA3N32PK.js +17 -0
  421. package/dist/tool-telemetry-XXZJ35RR.js +17 -0
  422. package/dist/tui/App.js +17 -17
  423. package/dist/tui-data-46QLCJUE.js +259 -0
  424. package/dist/tui-data-ZDB7BLP2.js +259 -0
  425. package/dist/wiki-acl-HHSIBPF3.js +111 -0
  426. package/dist/wiki-acl-O65GZ2ZF.js +111 -0
  427. package/dist/worker-gate-27I4GAEZ.js +21 -0
  428. package/dist/worker-gate-DXU4HEPY.js +21 -0
  429. package/dist/workflow-engine-63EOEJ5Q.js +28 -0
  430. package/dist/workflow-engine-C6F2RMPN.js +28 -0
  431. package/dist/worktree-SFKKOMFD.js +27 -0
  432. package/dist/worktree-SVCE3S7X.js +27 -0
  433. package/dist/worktree-sweep-S3JHJTVP.js +20 -0
  434. package/dist/worktree-sweep-U3TIQ7WL.js +20 -0
  435. package/package.json +1 -1
  436. package/release-notes.json +88 -26
@@ -0,0 +1,41 @@
1
+ import {
2
+ checkLicense,
3
+ loadLicense
4
+ } from "./chunk-EAPUSVKS.js";
5
+
6
+ // src/lib/license-gate.ts
7
+ var _cachedLicense = null;
8
+ var _hasLicenseKey = false;
9
+ async function initLicenseGate() {
10
+ const key = loadLicense();
11
+ _hasLicenseKey = key !== null && key.length > 0;
12
+ if (_hasLicenseKey) {
13
+ try {
14
+ _cachedLicense = await checkLicense();
15
+ } catch {
16
+ _cachedLicense = null;
17
+ }
18
+ return { license: _cachedLicense, hasKey: true };
19
+ }
20
+ return { license: null, hasKey: false };
21
+ }
22
+ function getCachedLicenseGate() {
23
+ if (!_hasLicenseKey) {
24
+ const key = loadLicense();
25
+ if (key && key.length > 0) {
26
+ _hasLicenseKey = true;
27
+ process.stderr.write("[license-gate] License key found on re-check (was missing at boot)\n");
28
+ }
29
+ }
30
+ return {
31
+ license: _cachedLicense,
32
+ hasKey: _hasLicenseKey
33
+ };
34
+ }
35
+ var NO_LICENSE_MESSAGE = "License key required. Get your key from the Exe OS team, then:\n\n echo 'exe_sk_YOUR_KEY' > ~/.exe-os/license.key\n\nThen run /mcp to reconnect, or restart your session.";
36
+
37
+ export {
38
+ initLicenseGate,
39
+ getCachedLicenseGate,
40
+ NO_LICENSE_MESSAGE
41
+ };
@@ -0,0 +1,129 @@
1
+ import {
2
+ EMPLOYEES_PATH,
3
+ getClient,
4
+ isInitialized,
5
+ loadEmployees
6
+ } from "./chunk-52UDAVZE.js";
7
+ import {
8
+ PLAN_LIMITS,
9
+ checkLicense,
10
+ isFeatureAllowed
11
+ } from "./chunk-EAPUSVKS.js";
12
+ import {
13
+ EXE_AI_DIR
14
+ } from "./chunk-T3B5RK4H.js";
15
+
16
+ // src/lib/plan-limits.ts
17
+ import { readFileSync, existsSync } from "fs";
18
+ import path from "path";
19
+ var PlanLimitError = class extends Error {
20
+ constructor(message) {
21
+ super(message);
22
+ this.name = "PlanLimitError";
23
+ }
24
+ };
25
+ var CACHE_PATH = path.join(EXE_AI_DIR, "license-cache.json");
26
+ function getLicenseSync() {
27
+ try {
28
+ if (!existsSync(CACHE_PATH)) return freeLicense();
29
+ const raw = JSON.parse(readFileSync(CACHE_PATH, "utf8"));
30
+ if (!raw.token || typeof raw.token !== "string") return freeLicense();
31
+ const parts = raw.token.split(".");
32
+ if (parts.length !== 3) return freeLicense();
33
+ const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString());
34
+ const plan = payload.plan ?? "free";
35
+ const limits = PLAN_LIMITS[plan] ?? PLAN_LIMITS.free;
36
+ return {
37
+ valid: true,
38
+ plan,
39
+ email: payload.sub ?? "",
40
+ expiresAt: payload.exp ? new Date(payload.exp * 1e3).toISOString() : null,
41
+ deviceLimit: limits.devices,
42
+ employeeLimit: limits.employees,
43
+ memoryLimit: limits.memories
44
+ };
45
+ } catch {
46
+ return freeLicense();
47
+ }
48
+ }
49
+ function freeLicense() {
50
+ const limits = PLAN_LIMITS.free;
51
+ return {
52
+ valid: true,
53
+ plan: "free",
54
+ email: "",
55
+ expiresAt: null,
56
+ deviceLimit: limits.devices,
57
+ employeeLimit: limits.employees,
58
+ memoryLimit: limits.memories
59
+ };
60
+ }
61
+ async function countActiveMemories() {
62
+ if (!isInitialized()) return 0;
63
+ const client = getClient();
64
+ const result = await client.execute(
65
+ "SELECT COUNT(*) as cnt FROM memories WHERE status = 'active' OR status IS NULL"
66
+ );
67
+ const row = result.rows[0];
68
+ return Number(row?.cnt ?? 0);
69
+ }
70
+ async function assertMemoryLimit() {
71
+ const license = await checkLicense();
72
+ if (license.memoryLimit < 0) return;
73
+ const count = await countActiveMemories();
74
+ if (count >= license.memoryLimit) {
75
+ throw new PlanLimitError(
76
+ `Memory limit reached: ${count}/${license.memoryLimit} active memories on the ${license.plan} plan. Upgrade at https://askexe.com to store more.`
77
+ );
78
+ }
79
+ }
80
+ async function assertEmployeeLimit(license, rosterPath) {
81
+ const lic = license ?? await checkLicense();
82
+ if (lic.employeeLimit < 0) return;
83
+ const employees = await loadEmployees(rosterPath ?? EMPLOYEES_PATH);
84
+ if (employees.length >= lic.employeeLimit) {
85
+ throw new PlanLimitError(
86
+ `Employee limit reached: ${employees.length}/${lic.employeeLimit} employees on the ${lic.plan} plan. Upgrade at https://askexe.com to add more.`
87
+ );
88
+ }
89
+ }
90
+ function assertEmployeeLimitSync(rosterPath) {
91
+ const license = getLicenseSync();
92
+ if (license.employeeLimit < 0) return;
93
+ const filePath = rosterPath ?? EMPLOYEES_PATH;
94
+ let count = 0;
95
+ try {
96
+ if (existsSync(filePath)) {
97
+ const raw = readFileSync(filePath, "utf8");
98
+ const employees = JSON.parse(raw);
99
+ count = Array.isArray(employees) ? employees.length : 0;
100
+ }
101
+ } catch {
102
+ throw new PlanLimitError(
103
+ `Cannot verify employee count: roster unreadable at ${filePath}. Refusing to proceed. Check file permissions or upgrade plan.`
104
+ );
105
+ }
106
+ if (count >= license.employeeLimit) {
107
+ throw new PlanLimitError(
108
+ `Employee limit reached: ${count}/${license.employeeLimit} employees on the ${license.plan} plan. Upgrade at https://askexe.com to add more.`
109
+ );
110
+ }
111
+ }
112
+ async function assertFeature(feature) {
113
+ const license = await checkLicense();
114
+ if (!isFeatureAllowed(license, feature)) {
115
+ throw new PlanLimitError(
116
+ `Feature "${feature}" requires a paid plan. Current plan: ${license.plan}. Upgrade at https://askexe.com.`
117
+ );
118
+ }
119
+ }
120
+
121
+ export {
122
+ PlanLimitError,
123
+ getLicenseSync,
124
+ countActiveMemories,
125
+ assertMemoryLimit,
126
+ assertEmployeeLimit,
127
+ assertEmployeeLimitSync,
128
+ assertFeature
129
+ };
@@ -0,0 +1,41 @@
1
+ import {
2
+ checkLicense,
3
+ loadLicense
4
+ } from "./chunk-YMKUXZIG.js";
5
+
6
+ // src/lib/license-gate.ts
7
+ var _cachedLicense = null;
8
+ var _hasLicenseKey = false;
9
+ async function initLicenseGate() {
10
+ const key = loadLicense();
11
+ _hasLicenseKey = key !== null && key.length > 0;
12
+ if (_hasLicenseKey) {
13
+ try {
14
+ _cachedLicense = await checkLicense();
15
+ } catch {
16
+ _cachedLicense = null;
17
+ }
18
+ return { license: _cachedLicense, hasKey: true };
19
+ }
20
+ return { license: null, hasKey: false };
21
+ }
22
+ function getCachedLicenseGate() {
23
+ if (!_hasLicenseKey) {
24
+ const key = loadLicense();
25
+ if (key && key.length > 0) {
26
+ _hasLicenseKey = true;
27
+ process.stderr.write("[license-gate] License key found on re-check (was missing at boot)\n");
28
+ }
29
+ }
30
+ return {
31
+ license: _cachedLicense,
32
+ hasKey: _hasLicenseKey
33
+ };
34
+ }
35
+ var NO_LICENSE_MESSAGE = "License key required. Get your key from the Exe OS team, then:\n\n echo 'exe_sk_YOUR_KEY' > ~/.exe-os/license.key\n\nThen run /mcp to reconnect, or restart your session.";
36
+
37
+ export {
38
+ initLicenseGate,
39
+ getCachedLicenseGate,
40
+ NO_LICENSE_MESSAGE
41
+ };
@@ -0,0 +1,97 @@
1
+ import {
2
+ loadEmployeesSync
3
+ } from "./chunk-52UDAVZE.js";
4
+
5
+ // src/adapters/mcp-http-config.ts
6
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
7
+ import { randomBytes } from "crypto";
8
+ import { execFileSync } from "child_process";
9
+ import path from "path";
10
+ import os from "os";
11
+ var DEFAULT_MCP_HTTP_PORT = "48739";
12
+ function resolveDefaultAgentId() {
13
+ if (process.env.AGENT_ID && process.env.AGENT_ID !== "default") return process.env.AGENT_ID;
14
+ try {
15
+ const coo = loadEmployeesSync().find((e) => e.role === "COO");
16
+ if (coo) return coo.name;
17
+ } catch {
18
+ }
19
+ return "exe";
20
+ }
21
+ var DEFAULT_MCP_HTTP_AGENT_ID = resolveDefaultAgentId();
22
+ var DEFAULT_MCP_HTTP_AGENT_ROLE = "COO";
23
+ function mcpHttpPort() {
24
+ const raw = process.env.EXE_MCP_PORT?.trim();
25
+ if (!raw) return DEFAULT_MCP_HTTP_PORT;
26
+ if (!/^\d+$/.test(raw)) return DEFAULT_MCP_HTTP_PORT;
27
+ const port = Number(raw);
28
+ if (!Number.isInteger(port) || port <= 0 || port > 65535) return DEFAULT_MCP_HTTP_PORT;
29
+ return raw;
30
+ }
31
+ function mcpHttpUrl() {
32
+ return `http://127.0.0.1:${mcpHttpPort()}/mcp`;
33
+ }
34
+ function readOrCreateDaemonToken(homeDir = os.homedir()) {
35
+ const exeDir = path.join(homeDir, ".exe-os");
36
+ const tokenPath = path.join(exeDir, "exed.token");
37
+ if (existsSync(tokenPath)) {
38
+ try {
39
+ const token2 = readFileSync(tokenPath, "utf-8").trim();
40
+ if (/^[a-f0-9]{64}$/i.test(token2)) return token2;
41
+ } catch {
42
+ }
43
+ }
44
+ const token = randomBytes(32).toString("hex");
45
+ mkdirSync(exeDir, { recursive: true });
46
+ writeFileSync(tokenPath, `${token}
47
+ `, "utf-8");
48
+ try {
49
+ chmodSync(tokenPath, 384);
50
+ } catch {
51
+ }
52
+ return token;
53
+ }
54
+ function buildMcpHttpHeaders(homeDir = os.homedir(), opts = {}) {
55
+ const agentId = opts.useShellPlaceholders ? "${AGENT_ID:-exe}" : opts.agentId ?? DEFAULT_MCP_HTTP_AGENT_ID;
56
+ const agentRole = opts.useShellPlaceholders ? "${AGENT_ROLE:-COO}" : opts.agentRole ?? DEFAULT_MCP_HTTP_AGENT_ROLE;
57
+ let sessionName = process.env.EXE_SESSION_NAME ?? "";
58
+ if (!sessionName && !opts.useShellPlaceholders) {
59
+ try {
60
+ const sock = process.env.EXE_TMUX_SOCKET;
61
+ const tmuxArgs = sock ? ["-L", sock, "display-message", "-p", "#{session_name}"] : ["display-message", "-p", "#{session_name}"];
62
+ const tmuxSession = execFileSync("tmux", tmuxArgs, {
63
+ encoding: "utf8",
64
+ timeout: 2e3
65
+ }).trim();
66
+ if (tmuxSession) sessionName = tmuxSession;
67
+ } catch {
68
+ }
69
+ }
70
+ const headers = {
71
+ Authorization: `Bearer ${readOrCreateDaemonToken(homeDir)}`,
72
+ "X-Agent-Id": agentId,
73
+ "X-Agent-Role": agentRole
74
+ };
75
+ if (sessionName && !opts.useShellPlaceholders) headers["X-Exe-Session"] = sessionName;
76
+ return headers;
77
+ }
78
+ function buildClaudeHttpMcpEntry(homeDir = os.homedir()) {
79
+ const entry = {
80
+ type: "http",
81
+ url: mcpHttpUrl(),
82
+ headers: buildMcpHttpHeaders(homeDir, { useShellPlaceholders: true })
83
+ };
84
+ delete entry.headers["X-Exe-Session"];
85
+ return entry;
86
+ }
87
+
88
+ export {
89
+ DEFAULT_MCP_HTTP_PORT,
90
+ DEFAULT_MCP_HTTP_AGENT_ID,
91
+ DEFAULT_MCP_HTTP_AGENT_ROLE,
92
+ mcpHttpPort,
93
+ mcpHttpUrl,
94
+ readOrCreateDaemonToken,
95
+ buildMcpHttpHeaders,
96
+ buildClaudeHttpMcpEntry
97
+ };
@@ -0,0 +1,240 @@
1
+ import {
2
+ getClient,
3
+ isCoordinatorName,
4
+ loadEmployeesSync
5
+ } from "./chunk-WUKEXVOR.js";
6
+
7
+ // src/lib/steward-gate.ts
8
+ import crypto from "crypto";
9
+ var ROLE_PERMISSIONS = {
10
+ coordinator: /* @__PURE__ */ new Set([
11
+ "close_task",
12
+ "cancel_task",
13
+ "merge_entities",
14
+ "purge_document",
15
+ "deactivate_behavior",
16
+ "override"
17
+ ]),
18
+ manager: /* @__PURE__ */ new Set([
19
+ "close_task",
20
+ // their team only — enforced contextually
21
+ "deactivate_behavior"
22
+ // their team's behaviors
23
+ ]),
24
+ specialist: /* @__PURE__ */ new Set([
25
+ "deactivate_behavior_own",
26
+ // own behaviors only
27
+ "delete_own_memory"
28
+ ])
29
+ };
30
+ var UNIVERSAL_OPS = /* @__PURE__ */ new Set([
31
+ "update_own_task",
32
+ "store_memory",
33
+ "store_behavior"
34
+ ]);
35
+ var MANAGER_ROLES = /* @__PURE__ */ new Set(["CTO", "CMO"]);
36
+ var StewardGate = class {
37
+ /**
38
+ * Check whether an agent has authority for a destructive operation.
39
+ */
40
+ async checkAuthority(agent, operation, target) {
41
+ const role = await this.resolveRole(agent);
42
+ if (UNIVERSAL_OPS.has(operation)) {
43
+ const decision2 = {
44
+ allowed: true,
45
+ reason: `Operation "${operation}" is universally permitted.`,
46
+ confidence: 1,
47
+ requires_override: false
48
+ };
49
+ await this.logDecision(agent, operation, target, decision2);
50
+ return decision2;
51
+ }
52
+ const permissions = ROLE_PERMISSIONS[role];
53
+ let allowed = permissions.has(operation);
54
+ let reason;
55
+ if (!allowed && role === "specialist" && operation === "deactivate_behavior") {
56
+ const isOwn = await this.isOwnBehavior(agent, target);
57
+ if (isOwn) {
58
+ allowed = true;
59
+ reason = `Specialist "${agent}" can deactivate their own behavior.`;
60
+ } else {
61
+ reason = `Specialist "${agent}" cannot deactivate behaviors belonging to other agents.`;
62
+ }
63
+ } else if (allowed) {
64
+ reason = `Role "${role}" has authority for "${operation}".`;
65
+ } else {
66
+ reason = `Role "${role}" does not have authority for "${operation}". Requires coordinator override.`;
67
+ }
68
+ let requiresOverride = !allowed;
69
+ let confidence = allowed ? 0.95 : 0.9;
70
+ try {
71
+ const dreamingPath = "./dreaming.js";
72
+ const dreaming = await import(
73
+ /* @vite-ignore */
74
+ dreamingPath
75
+ );
76
+ if (typeof dreaming.calculateDrift === "function") {
77
+ const driftScore = await dreaming.calculateDrift(agent);
78
+ if (typeof driftScore === "number" && driftScore > 0.8) {
79
+ requiresOverride = true;
80
+ confidence = Math.max(0.5, confidence - 0.3);
81
+ reason += ` (\u26A0\uFE0F High drift score: ${driftScore.toFixed(2)} \u2014 requires override.)`;
82
+ }
83
+ }
84
+ } catch {
85
+ }
86
+ const decision = {
87
+ allowed: allowed && !requiresOverride,
88
+ reason,
89
+ confidence,
90
+ requires_override: requiresOverride
91
+ };
92
+ await this.logDecision(agent, operation, target, decision);
93
+ return decision;
94
+ }
95
+ /**
96
+ * Record an explicit coordinator override that bypasses the gate.
97
+ */
98
+ async override(agent, operation, target, reason) {
99
+ const role = await this.resolveRole(agent);
100
+ if (role !== "coordinator") {
101
+ const decision2 = {
102
+ allowed: false,
103
+ reason: `Only coordinators can issue overrides. "${agent}" is a ${role}.`,
104
+ confidence: 1,
105
+ requires_override: false
106
+ };
107
+ await this.logDecision(agent, `override:${operation}`, target, decision2);
108
+ return decision2;
109
+ }
110
+ const decision = {
111
+ allowed: true,
112
+ reason: `Coordinator override: ${reason}`,
113
+ confidence: 1,
114
+ requires_override: false
115
+ };
116
+ await this.logDecision(agent, `override:${operation}`, target, decision);
117
+ return decision;
118
+ }
119
+ /**
120
+ * Query the audit trail.
121
+ */
122
+ async getAuditLog(opts) {
123
+ await this.ensureAuditTable();
124
+ const client = getClient();
125
+ const conditions = [];
126
+ const args = [];
127
+ if (opts?.agent) {
128
+ conditions.push("agent = ?");
129
+ args.push(opts.agent);
130
+ }
131
+ if (opts?.operation) {
132
+ conditions.push("operation = ?");
133
+ args.push(opts.operation);
134
+ }
135
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
136
+ const limit = opts?.limit ?? 50;
137
+ const result = await client.execute({
138
+ sql: `SELECT * FROM steward_audit ${where} ORDER BY created_at DESC LIMIT ?`,
139
+ args: [...args, limit]
140
+ });
141
+ return result.rows.map((row) => ({
142
+ id: String(row.id),
143
+ agent: String(row.agent),
144
+ operation: String(row.operation),
145
+ target: String(row.target),
146
+ decision: {
147
+ allowed: Number(row.allowed) === 1,
148
+ reason: String(row.reason),
149
+ confidence: Number(row.confidence),
150
+ requires_override: Number(row.requires_override) === 1
151
+ },
152
+ timestamp: String(row.created_at)
153
+ }));
154
+ }
155
+ // -------------------------------------------------------------------------
156
+ // Internal methods
157
+ // -------------------------------------------------------------------------
158
+ /**
159
+ * Resolve an agent name to a role category.
160
+ */
161
+ async resolveRole(agent) {
162
+ if (isCoordinatorName(agent)) return "coordinator";
163
+ try {
164
+ const employees = loadEmployeesSync();
165
+ const employee = employees.find((e) => e.name === agent);
166
+ if (employee && MANAGER_ROLES.has(employee.role)) return "manager";
167
+ } catch {
168
+ }
169
+ return "specialist";
170
+ }
171
+ /**
172
+ * Check if a behavior belongs to the given agent.
173
+ */
174
+ async isOwnBehavior(agent, behaviorId) {
175
+ try {
176
+ const client = getClient();
177
+ const result = await client.execute({
178
+ sql: "SELECT agent_id FROM behaviors WHERE id = ? LIMIT 1",
179
+ args: [behaviorId]
180
+ });
181
+ if (result.rows.length === 0) return false;
182
+ return String(result.rows[0].agent_id) === agent;
183
+ } catch {
184
+ return false;
185
+ }
186
+ }
187
+ /**
188
+ * Ensure the steward_audit table exists.
189
+ */
190
+ async ensureAuditTable() {
191
+ const client = getClient();
192
+ await client.execute({
193
+ sql: `CREATE TABLE IF NOT EXISTS steward_audit (
194
+ id TEXT PRIMARY KEY,
195
+ agent TEXT NOT NULL,
196
+ operation TEXT NOT NULL,
197
+ target TEXT NOT NULL,
198
+ allowed INTEGER NOT NULL,
199
+ reason TEXT NOT NULL,
200
+ confidence REAL NOT NULL,
201
+ requires_override INTEGER NOT NULL DEFAULT 0,
202
+ created_at TEXT NOT NULL
203
+ )`,
204
+ args: []
205
+ });
206
+ }
207
+ /**
208
+ * Log a gate decision to the audit trail.
209
+ */
210
+ async logDecision(agent, operation, target, decision) {
211
+ try {
212
+ await this.ensureAuditTable();
213
+ const client = getClient();
214
+ await client.execute({
215
+ sql: `INSERT INTO steward_audit (id, agent, operation, target, allowed, reason, confidence, requires_override, created_at)
216
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
217
+ args: [
218
+ crypto.randomUUID(),
219
+ agent,
220
+ operation,
221
+ target,
222
+ decision.allowed ? 1 : 0,
223
+ decision.reason,
224
+ decision.confidence,
225
+ decision.requires_override ? 1 : 0,
226
+ (/* @__PURE__ */ new Date()).toISOString()
227
+ ]
228
+ });
229
+ } catch {
230
+ process.stderr.write(
231
+ `[steward-gate] Audit log write failed for ${agent}:${operation}
232
+ `
233
+ );
234
+ }
235
+ }
236
+ };
237
+
238
+ export {
239
+ StewardGate
240
+ };
@@ -0,0 +1,150 @@
1
+ import {
2
+ isCoordinatorRole
3
+ } from "./chunk-WUKEXVOR.js";
4
+
5
+ // src/lib/task-router.ts
6
+ import { randomUUID } from "crypto";
7
+ var DEFAULT_BLOOM_CONFIG = {
8
+ complexityToTier: {
9
+ routine: "junior",
10
+ standard: "standard",
11
+ complex: "senior",
12
+ critical: "specialist"
13
+ },
14
+ tierRules: {
15
+ junior: {
16
+ eligible: [],
17
+ // resolved dynamically from roster (Principal Engineer role)
18
+ reviewRequired: false,
19
+ manualOnly: false
20
+ },
21
+ standard: {
22
+ eligible: [],
23
+ // resolved dynamically from roster (Principal Engineer role)
24
+ reviewRequired: false,
25
+ manualOnly: false
26
+ },
27
+ senior: {
28
+ eligible: [],
29
+ // any specialist, but review required
30
+ reviewRequired: true,
31
+ manualOnly: false
32
+ },
33
+ specialist: {
34
+ eligible: [],
35
+ reviewRequired: true,
36
+ manualOnly: true
37
+ }
38
+ }
39
+ };
40
+ function resolveBloomRouting(complexity, config = DEFAULT_BLOOM_CONFIG) {
41
+ const tier = config.complexityToTier[complexity];
42
+ const rule = config.tierRules[tier];
43
+ return {
44
+ tier,
45
+ reviewRequired: rule.reviewRequired,
46
+ manualOnly: rule.manualOnly,
47
+ eligible: rule.eligible
48
+ };
49
+ }
50
+ async function scoreEmployee(taskVector, agentId, searchFn) {
51
+ const results = await searchFn(taskVector, agentId, { limit: 5 });
52
+ if (results.length === 0) {
53
+ return { agentId, score: 0 };
54
+ }
55
+ const distances = results.map((r) => r["_distance"]).filter((d) => typeof d === "number");
56
+ if (distances.length > 0) {
57
+ const avgDistance = distances.reduce((sum, d) => sum + d, 0) / distances.length;
58
+ return { agentId, score: 1 / (1 + avgDistance) };
59
+ }
60
+ return { agentId, score: results.length / 5 };
61
+ }
62
+ function keywordScoreTask(taskDescription, employee) {
63
+ const task = taskDescription.toLowerCase();
64
+ const terms = `${employee.name} ${employee.role}`.toLowerCase().split(/[^a-z0-9]+/).filter((term) => term.length >= 3);
65
+ if (terms.length === 0) return 0;
66
+ const matches = terms.filter((term) => task.includes(term)).length;
67
+ return matches / terms.length;
68
+ }
69
+ async function routeTask(taskDescription, employees, embedFn, searchFn, options) {
70
+ let specialists = employees.filter((e) => !isCoordinatorRole(e.role));
71
+ if (specialists.length === 0) {
72
+ throw new Error(
73
+ "No specialist employees available. Create one with /exe-new-employee."
74
+ );
75
+ }
76
+ let bloomRouting;
77
+ if (options?.complexity) {
78
+ bloomRouting = resolveBloomRouting(options.complexity, options.bloomConfig);
79
+ if (bloomRouting.manualOnly) {
80
+ throw new Error(
81
+ `Task complexity "${options.complexity}" requires manual assignment (tier: ${bloomRouting.tier}).`
82
+ );
83
+ }
84
+ if (bloomRouting.eligible.length > 0) {
85
+ const eligible = new Set(bloomRouting.eligible);
86
+ const filtered = specialists.filter((e) => eligible.has(e.name));
87
+ if (filtered.length > 0) {
88
+ specialists = filtered;
89
+ }
90
+ }
91
+ }
92
+ let taskVector = null;
93
+ try {
94
+ taskVector = await embedFn(taskDescription);
95
+ } catch {
96
+ taskVector = null;
97
+ }
98
+ const scored = taskVector ? await Promise.all(
99
+ specialists.map(async (emp) => {
100
+ const { score } = await scoreEmployee(taskVector, emp.name, searchFn);
101
+ return { employee: emp, score };
102
+ })
103
+ ) : specialists.map((emp) => ({
104
+ employee: emp,
105
+ score: keywordScoreTask(taskDescription, emp)
106
+ }));
107
+ scored.sort((a, b) => b.score - a.score);
108
+ return { ...scored[0], bloomRouting };
109
+ }
110
+ function createAssignmentMemory(taskDescription, assignedTo, assignedBy) {
111
+ return {
112
+ id: randomUUID(),
113
+ agent_id: assignedTo.name,
114
+ agent_role: assignedTo.role,
115
+ session_id: `assign-${Date.now()}`,
116
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
117
+ tool_name: "assignment",
118
+ project_name: "",
119
+ has_error: false,
120
+ raw_text: `Task assigned by ${assignedBy}: ${taskDescription}`,
121
+ vector: null
122
+ // Will be backfilled
123
+ };
124
+ }
125
+ function formatAssignmentOutput(employee, task, score, mode, bloomRouting) {
126
+ const modeLabel = mode === "auto" ? "auto-routed" : "direct";
127
+ const percent = Math.round(score * 100);
128
+ const lines = [
129
+ `Assigned to ${employee.name} (${employee.role})`,
130
+ `Mode: ${modeLabel}`,
131
+ `Relevance: ${percent}%`,
132
+ `Task: ${task}`
133
+ ];
134
+ if (bloomRouting) {
135
+ lines.push(`Complexity tier: ${bloomRouting.tier}`);
136
+ if (bloomRouting.reviewRequired) {
137
+ lines.push(`Review: required`);
138
+ }
139
+ }
140
+ return lines.join("\n");
141
+ }
142
+
143
+ export {
144
+ DEFAULT_BLOOM_CONFIG,
145
+ resolveBloomRouting,
146
+ scoreEmployee,
147
+ routeTask,
148
+ createAssignmentMemory,
149
+ formatAssignmentOutput
150
+ };