@askexenow/exe-os 0.9.265 → 0.9.266

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 (318) hide show
  1. package/deploy/compose/.env.example +4 -2
  2. package/deploy/compose/docker-compose.yml +6 -4
  3. package/deploy/compose/generate-env.ts +5 -2
  4. package/dist/active-agent-2XJJZFEW.js +25 -0
  5. package/dist/active-agent-JZ4PHIAK.js +26 -0
  6. package/dist/agentic-ontology-J4B525DT.js +25 -0
  7. package/dist/backfill-metadata-TWEC6BJD.js +597 -0
  8. package/dist/backfill-metadata-VGZLCJWZ.js +597 -0
  9. package/dist/behaviors-BPIVFAGY.js +25 -0
  10. package/dist/bin/agentic-ontology-backfill.js +5 -5
  11. package/dist/bin/agentic-reflection-backfill.js +6 -6
  12. package/dist/bin/agentic-semantic-label.js +5 -5
  13. package/dist/bin/backfill-conversations.js +4 -4
  14. package/dist/bin/backfill-responses.js +4 -4
  15. package/dist/bin/backfill-vectors.js +5 -5
  16. package/dist/bin/bulk-sync-postgres.js +6 -6
  17. package/dist/bin/cc-doctor.js +6 -1
  18. package/dist/bin/cleanup-stale-review-tasks.js +9 -9
  19. package/dist/bin/cli.js +15 -15
  20. package/dist/bin/exe-agent-config.js +2 -2
  21. package/dist/bin/exe-agent.js +4 -4
  22. package/dist/bin/exe-assign.js +5 -5
  23. package/dist/bin/exe-boot.js +16 -16
  24. package/dist/bin/exe-call.js +4 -4
  25. package/dist/bin/exe-cloud.js +4 -4
  26. package/dist/bin/exe-dispatch.js +9 -9
  27. package/dist/bin/exe-doctor.js +1 -1
  28. package/dist/bin/exe-export-behaviors.js +7 -7
  29. package/dist/bin/exe-forget.js +6 -6
  30. package/dist/bin/exe-gateway.js +7 -7
  31. package/dist/bin/exe-healthcheck.js +6 -1
  32. package/dist/bin/exe-heartbeat.js +9 -9
  33. package/dist/bin/exe-kill.js +12 -12
  34. package/dist/bin/exe-launch-agent.js +16 -16
  35. package/dist/bin/exe-new-employee.js +6 -6
  36. package/dist/bin/exe-pending-messages.js +10 -10
  37. package/dist/bin/exe-pending-notifications.js +9 -9
  38. package/dist/bin/exe-pending-reviews.js +9 -9
  39. package/dist/bin/exe-rename.js +4 -4
  40. package/dist/bin/exe-review.js +11 -11
  41. package/dist/bin/exe-search.js +5 -5
  42. package/dist/bin/exe-session-cleanup.js +14 -14
  43. package/dist/bin/exe-settings.js +4 -4
  44. package/dist/bin/exe-start-codex.js +11 -11
  45. package/dist/bin/exe-start-opencode.js +8 -8
  46. package/dist/bin/exe-status.js +10 -10
  47. package/dist/bin/exe-team.js +3 -3
  48. package/dist/bin/git-sweep.js +10 -10
  49. package/dist/bin/graph-backfill.js +4 -4
  50. package/dist/bin/graph-export.js +5 -5
  51. package/dist/bin/import-history.js +7 -7
  52. package/dist/bin/install.js +6 -6
  53. package/dist/bin/intercom-check.js +4 -4
  54. package/dist/bin/mcp-sessions.js +2 -2
  55. package/dist/bin/orchestration-metrics.js +4 -4
  56. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  57. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  58. package/dist/bin/scan-tasks.js +9 -9
  59. package/dist/bin/setup.js +1 -1
  60. package/dist/bin/shard-migrate.js +4 -4
  61. package/dist/capacity-monitor-3QORC56J.js +49 -0
  62. package/dist/capacity-monitor-FWRBCZCZ.js +49 -0
  63. package/dist/catchup-brief-242H63OP.js +151 -0
  64. package/dist/catchup-brief-T7W2ARRB.js +151 -0
  65. package/dist/catchup-brief-VJDLXJHJ.js +151 -0
  66. package/dist/chunk-2FDYA3GS.js +75 -0
  67. package/dist/chunk-2V33IVZF.js +1148 -0
  68. package/dist/chunk-2W5NQOQJ.js +333 -0
  69. package/dist/chunk-32QR5EHE.js +244 -0
  70. package/dist/chunk-3DBROKA6.js +382 -0
  71. package/dist/chunk-3DS2YHAT.js +204 -0
  72. package/dist/chunk-3O2ZD7YV.js +227 -0
  73. package/dist/chunk-43O2PZH7.js +214 -0
  74. package/dist/chunk-4AHL6I7X.js +284 -0
  75. package/dist/chunk-5GBPXJIH.js +50 -0
  76. package/dist/chunk-5IXN2532.js +58 -0
  77. package/dist/chunk-5SH5TR45.js +731 -0
  78. package/dist/chunk-5XGMTWKW.js +128 -0
  79. package/dist/chunk-6AQAILCS.js +13696 -0
  80. package/dist/chunk-72KQJZBH.js +382 -0
  81. package/dist/chunk-7B2AENJ3.js +1345 -0
  82. package/dist/chunk-7GKMYFVR.js +551 -0
  83. package/dist/chunk-7HUGVJHW.js +1021 -0
  84. package/dist/chunk-7HWBGXDV.js +333 -0
  85. package/dist/chunk-7ROGPDW6.js +197 -0
  86. package/dist/chunk-7ZMLNURG.js +513 -0
  87. package/dist/chunk-A3G4UXNA.js +280 -0
  88. package/dist/chunk-A4T6U3XZ.js +371 -0
  89. package/dist/chunk-ADJNRFEK.js +13696 -0
  90. package/dist/chunk-AVJTW67M.js +513 -0
  91. package/dist/chunk-B6RC7DAC.js +1090 -0
  92. package/dist/chunk-BAOJLZVC.js +244 -0
  93. package/dist/chunk-BCUMPA7J.js +159 -0
  94. package/dist/chunk-BH2ST7KK.js +183 -0
  95. package/dist/chunk-C4BIYP5C.js +129 -0
  96. package/dist/chunk-CBUZG6OC.js +89 -0
  97. package/dist/chunk-CGQRWCCP.js +81 -0
  98. package/dist/chunk-CLX4WQHT.js +214 -0
  99. package/dist/chunk-D4CQZL46.js +76 -0
  100. package/dist/chunk-DEBLYXA2.js +56 -0
  101. package/dist/chunk-EDNUE5L3.js +38 -0
  102. package/dist/chunk-ESNHLTLC.js +1073 -0
  103. package/dist/chunk-FICUAZEA.js +128 -0
  104. package/dist/chunk-FP6U5PSY.js +818 -0
  105. package/dist/chunk-G55UTKFR.js +89 -0
  106. package/dist/chunk-GIJUXLK5.js +330 -0
  107. package/dist/chunk-GVSSEGIV.js +348 -0
  108. package/dist/chunk-GYOOZ725.js +330 -0
  109. package/dist/chunk-HCULUL4D.js +447 -0
  110. package/dist/chunk-HDRQKH7R.js +1051 -0
  111. package/dist/chunk-HHBN7Y7R.js +197 -0
  112. package/dist/chunk-IQBXQ7GF.js +1073 -0
  113. package/dist/chunk-ITF6GEJI.js +2091 -0
  114. package/dist/chunk-IXHVSWLM.js +58 -0
  115. package/dist/chunk-J3ZFONT4.js +1921 -0
  116. package/dist/chunk-JEOFG274.js +394 -0
  117. package/dist/chunk-JH7ISOIJ.js +33 -0
  118. package/dist/chunk-JVRMAVPN.js +731 -0
  119. package/dist/chunk-KBYRYSXT.js +3951 -0
  120. package/dist/chunk-KECNXWD6.js +1051 -0
  121. package/dist/chunk-KIYCHS35.js +128 -0
  122. package/dist/chunk-KUP3D6G2.js +1345 -0
  123. package/dist/chunk-KXS5HHDH.js +54 -0
  124. package/dist/chunk-LVZW4WQY.js +221 -0
  125. package/dist/chunk-LWOCCDSB.js +240 -0
  126. package/dist/chunk-M4HRKRSE.js +30 -0
  127. package/dist/chunk-MPG5DR3K.js +244 -0
  128. package/dist/chunk-NOG2LVBA.js +159 -0
  129. package/dist/chunk-NP3CYOEY.js +290 -0
  130. package/dist/chunk-OVQOKLYA.js +210 -0
  131. package/dist/chunk-OW26ML36.js +1148 -0
  132. package/dist/chunk-P2DOIWQG.js +260 -0
  133. package/dist/chunk-P2QTTEYP.js +3951 -0
  134. package/dist/chunk-P5IKFL7B.js +85 -0
  135. package/dist/chunk-PD2LUPHD.js +377 -0
  136. package/dist/chunk-PF5EFIAH.js +818 -0
  137. package/dist/chunk-PK3NFO76.js +551 -0
  138. package/dist/chunk-QKMFMJTU.js +171 -0
  139. package/dist/chunk-R77M74QM.js +13696 -0
  140. package/dist/chunk-RHZ2CRJU.js +3556 -0
  141. package/dist/chunk-RLR4LVO5.js +1090 -0
  142. package/dist/chunk-RMDDSWFH.js +495 -0
  143. package/dist/chunk-RPLEZ74B.js +95 -0
  144. package/dist/chunk-RXMVPGH2.js +346 -0
  145. package/dist/chunk-S2ARWNS6.js +135 -0
  146. package/dist/chunk-SHPIATX7.js +90 -0
  147. package/dist/chunk-SQUZ3TI2.js +668 -0
  148. package/dist/chunk-SUGBKORD.js +1148 -0
  149. package/dist/chunk-T2XD7XL2.js +346 -0
  150. package/dist/chunk-TAIYLROT.js +127 -0
  151. package/dist/chunk-TCD4XCBS.js +495 -0
  152. package/dist/chunk-TSBMSHMM.js +163 -0
  153. package/dist/chunk-U776PBU6.js +488 -0
  154. package/dist/chunk-UTVNIAOF.js +284 -0
  155. package/dist/chunk-VF6VT4MR.js +70 -0
  156. package/dist/chunk-VZXLYUKS.js +171 -0
  157. package/dist/chunk-WIAHPJDS.js +58 -0
  158. package/dist/chunk-WM5ELLT4.js +54 -0
  159. package/dist/chunk-WUUSPOCC.js +1921 -0
  160. package/dist/chunk-WXHAMPK4.js +81 -0
  161. package/dist/chunk-WYNZ23XH.js +262 -0
  162. package/dist/chunk-WZOQLU2Y.js +127 -0
  163. package/dist/chunk-X24GBZKR.js +157 -0
  164. package/dist/chunk-X5FRF5MG.js +13696 -0
  165. package/dist/chunk-XBPLYFBA.js +204 -0
  166. package/dist/chunk-XDGKFXFW.js +363 -0
  167. package/dist/chunk-XIT6ONPY.js +630 -0
  168. package/dist/chunk-XNRJ5JHU.js +377 -0
  169. package/dist/chunk-XREWTPZM.js +123 -0
  170. package/dist/chunk-XURCA5VD.js +297 -0
  171. package/dist/chunk-Y55VFZJB.js +50 -0
  172. package/dist/chunk-YIH2YMWP.js +76 -0
  173. package/dist/chunk-YZMCCT73.js +97 -0
  174. package/dist/chunk-ZTP3VV23.js +447 -0
  175. package/dist/co-activation-JOYR73H2.js +72 -0
  176. package/dist/co-occurrence-G7RRJ3DB.js +74 -0
  177. package/dist/core-memory-6KK55Z65.js +110 -0
  178. package/dist/core-memory-QRS6GBXL.js +110 -0
  179. package/dist/crdt-sync-QWK65Z5A.js +33 -0
  180. package/dist/crm-webhook-BNUS3USD.js +10 -0
  181. package/dist/crm-webhook-ZTIRFVAH.js +10 -0
  182. package/dist/cto-delegation-gate-DNZJGBS7.js +206 -0
  183. package/dist/cto-delegation-gate-YI3LK7VY.js +206 -0
  184. package/dist/daemon-orchestration-7LVOHYKA.js +135 -0
  185. package/dist/daemon-orchestration-SDQNWI3K.js +135 -0
  186. package/dist/db-backup-5ENHDNZI.js +33 -0
  187. package/dist/dreaming-PGJOCGAM.js +32 -0
  188. package/dist/dreaming-UNHHGOU3.js +32 -0
  189. package/dist/exe-drift-QQJMUQXA.js +68 -0
  190. package/dist/exe-export-BEZZSQB4.js +73 -0
  191. package/dist/exe-export-TQGI2VBT.js +73 -0
  192. package/dist/exe-import-2SR2UP3D.js +76 -0
  193. package/dist/exe-import-73Q4VLFK.js +76 -0
  194. package/dist/exe-key-6JHEINOM.js +579 -0
  195. package/dist/exe-key-RIRPIFK6.js +579 -0
  196. package/dist/exe-snapshot-NDMDQJOH.js +164 -0
  197. package/dist/exe-snapshot-PVCBPMPJ.js +164 -0
  198. package/dist/fast-db-init-22OBOPTN.js +7 -0
  199. package/dist/fast-db-init-M6ZYYGAL.js +7 -0
  200. package/dist/gateway/index.js +8 -8
  201. package/dist/git-staleness-4DGYC3RY.js +110 -0
  202. package/dist/git-task-sweep-CUR7R2ZM.js +40 -0
  203. package/dist/git-task-sweep-YG3IVGK3.js +40 -0
  204. package/dist/global-procedures-TYDNKM7V.js +20 -0
  205. package/dist/graph-auto-extract-I6B5HWTP.js +162 -0
  206. package/dist/hooks/bug-report-worker.js +11 -11
  207. package/dist/hooks/codex-stop-task-finalizer.js +11 -11
  208. package/dist/hooks/commit-complete.js +11 -11
  209. package/dist/hooks/error-recall.js +6 -6
  210. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  211. package/dist/hooks/ingest.js +6 -6
  212. package/dist/hooks/instructions-loaded.js +4 -4
  213. package/dist/hooks/manifest.json +19 -19
  214. package/dist/hooks/notification.js +4 -4
  215. package/dist/hooks/post-compact.js +10 -10
  216. package/dist/hooks/post-tool-combined.js +5 -5
  217. package/dist/hooks/pre-compact.js +11 -11
  218. package/dist/hooks/pre-tool-use.js +14 -14
  219. package/dist/hooks/prompt-submit.js +20 -20
  220. package/dist/hooks/session-end.js +15 -15
  221. package/dist/hooks/session-start.js +10 -10
  222. package/dist/hooks/stop.js +14 -14
  223. package/dist/hooks/subagent-stop.js +10 -10
  224. package/dist/hooks/summary-worker.js +14 -14
  225. package/dist/index.js +17 -17
  226. package/dist/installer-4LP73C3M.js +38 -0
  227. package/dist/installer-AUVLNS4D.js +296 -0
  228. package/dist/installer-KCRLQSQH.js +38 -0
  229. package/dist/installer-KGXYUOIV.js +296 -0
  230. package/dist/installer-UI6TNJGO.js +342 -0
  231. package/dist/installer-Z7NPD4PD.js +342 -0
  232. package/dist/lib/cloud-sync.js +4 -4
  233. package/dist/lib/consolidation.js +5 -5
  234. package/dist/lib/database.js +2 -2
  235. package/dist/lib/db-daemon-client.js +6 -0
  236. package/dist/lib/db.js +2 -2
  237. package/dist/lib/employee-templates.js +4 -4
  238. package/dist/lib/employees.js +2 -2
  239. package/dist/lib/exe-daemon.js +39 -38
  240. package/dist/lib/hybrid-search.js +5 -5
  241. package/dist/lib/identity.js +2 -2
  242. package/dist/lib/messaging.js +9 -9
  243. package/dist/lib/reminders.js +3 -3
  244. package/dist/lib/schedules.js +5 -5
  245. package/dist/lib/session-registry.js +4 -4
  246. package/dist/lib/skill-learning.js +4 -4
  247. package/dist/lib/store.js +4 -4
  248. package/dist/lib/task-router.js +3 -3
  249. package/dist/lib/tasks.js +10 -10
  250. package/dist/lib/tmux-routing.js +8 -8
  251. package/dist/lib/token-spend.js +3 -3
  252. package/dist/mcp/register-tools.js +53 -52
  253. package/dist/mcp/server.js +54 -53
  254. package/dist/mcp/tools/complete-reminder.js +4 -4
  255. package/dist/mcp/tools/create-reminder.js +4 -4
  256. package/dist/mcp/tools/create-task.js +12 -12
  257. package/dist/mcp/tools/deactivate-behavior.js +5 -5
  258. package/dist/mcp/tools/list-reminders.js +4 -4
  259. package/dist/mcp/tools/list-tasks.js +12 -12
  260. package/dist/mcp/tools/send-message.js +11 -11
  261. package/dist/mcp/tools/update-task.js +11 -11
  262. package/dist/mcp-http-config-LN5ITKGS.js +27 -0
  263. package/dist/mcp-http-config-V43VHNEH.js +27 -0
  264. package/dist/memory-cards-S36DCEY4.js +174 -0
  265. package/dist/memory-graph-extractor-66YL4V4B.js +17 -0
  266. package/dist/memory-poisoning-defense-MXWE6CTY.js +225 -0
  267. package/dist/memory-reflection-W676LUX5.js +238 -0
  268. package/dist/notifications-OFLXZTDZ.js +45 -0
  269. package/dist/notifications-XAV4V7T5.js +45 -0
  270. package/dist/orchestration-events-MJLWJ2H2.js +25 -0
  271. package/dist/orchestrator-AIAKV5ST.js +33 -0
  272. package/dist/orchestrator-VK7D6I36.js +33 -0
  273. package/dist/pipeline-router-DXH5QVUH.js +13 -0
  274. package/dist/pipeline-router-EV6C5S33.js +13 -0
  275. package/dist/plan-limits-TQMLKZBG.js +26 -0
  276. package/dist/project-boot-4XTXHDG4.js +299 -0
  277. package/dist/projection-worker-NAYVNSI4.js +964 -0
  278. package/dist/reranker-KHZI7HQK.js +19 -0
  279. package/dist/reranker-UPMS3OX7.js +19 -0
  280. package/dist/reranker-ZN73HWSB.js +19 -0
  281. package/dist/review-polling-3UEZSPNT.js +124 -0
  282. package/dist/review-polling-KBDX3ILL.js +124 -0
  283. package/dist/runtime/index.js +11 -11
  284. package/dist/session-events-2CHOLA6D.js +36 -0
  285. package/dist/session-events-HM22KEHN.js +36 -0
  286. package/dist/session-kill-telemetry-LUPVYGZX.js +29 -0
  287. package/dist/session-scope-EPZZZHHJ.js +86 -0
  288. package/dist/session-scope-ZGE6GHMS.js +86 -0
  289. package/dist/setup-wizard-KNWH54HW.js +12 -0
  290. package/dist/skill-refinement-C4GNWV4F.js +157 -0
  291. package/dist/skill-refinement-CAUIE4YM.js +157 -0
  292. package/dist/steward-gate-MZ2DV36N.js +13 -0
  293. package/dist/task-enforcement-6OMXG6EA.js +333 -0
  294. package/dist/task-enforcement-JFSF6QDD.js +333 -0
  295. package/dist/task-scope-4HJSCJ7L.js +35 -0
  296. package/dist/task-scope-7HYE4AS6.js +35 -0
  297. package/dist/tasks-crud-JJL6MMJF.js +77 -0
  298. package/dist/tasks-crud-KMIPDHBZ.js +77 -0
  299. package/dist/tasks-notify-5D6LF52K.js +38 -0
  300. package/dist/tasks-notify-JNGGXFUY.js +38 -0
  301. package/dist/tasks-review-N6I5UC7G.js +47 -0
  302. package/dist/tasks-review-USHAMO5N.js +47 -0
  303. package/dist/telemetry-upload-BV2M2NND.js +739 -0
  304. package/dist/telemetry-upload-Y7QPDJW4.js +739 -0
  305. package/dist/token-budget-2LUZOFO7.js +84 -0
  306. package/dist/tool-telemetry-5JT6DPVK.js +17 -0
  307. package/dist/tui/App.js +16 -16
  308. package/dist/tui-data-DMAKZMGD.js +258 -0
  309. package/dist/tui-data-X7NI6ZQ3.js +258 -0
  310. package/dist/wiki-acl-QHGGWX63.js +111 -0
  311. package/dist/worker-gate-4XKUOFWO.js +21 -0
  312. package/dist/worker-gate-TPZBOXOA.js +21 -0
  313. package/dist/workflow-engine-F3URLOPA.js +28 -0
  314. package/dist/workflow-engine-OFOL446Z.js +28 -0
  315. package/dist/worktree-V3NVP7MV.js +26 -0
  316. package/dist/worktree-sweep-2CADL43Y.js +19 -0
  317. package/package.json +1 -1
  318. package/release-notes.json +16 -15
@@ -0,0 +1,54 @@
1
+ import {
2
+ processCRMEvent
3
+ } from "./chunk-3DBROKA6.js";
4
+
5
+ // src/gateway/adapters/crm-webhook.ts
6
+ function parseTwentyWebhook(payload) {
7
+ if (!payload || typeof payload !== "object") return null;
8
+ const p = payload;
9
+ const eventName = p.eventName;
10
+ if (!eventName || typeof eventName !== "string") return null;
11
+ const dotIndex = eventName.indexOf(".");
12
+ if (dotIndex === -1) return null;
13
+ const objectType = eventName.slice(0, dotIndex);
14
+ const eventType = eventName.slice(dotIndex + 1);
15
+ if (!objectType || !eventType) return null;
16
+ const normalizedObjectType = objectType.charAt(0).toUpperCase() + objectType.slice(1);
17
+ const record = p.record ?? {};
18
+ if (typeof record !== "object") return null;
19
+ return {
20
+ eventType,
21
+ objectType: normalizedObjectType,
22
+ record
23
+ };
24
+ }
25
+ function createCRMWebhookHandler(options) {
26
+ return async (body) => {
27
+ const event = parseTwentyWebhook(body);
28
+ if (!event) {
29
+ console.warn(
30
+ "[crm-webhook] Malformed CRM webhook payload \u2014 skipping"
31
+ );
32
+ return;
33
+ }
34
+ console.log(
35
+ `[crm-webhook] ${event.objectType}.${event.eventType} received`
36
+ );
37
+ try {
38
+ const logs = await processCRMEvent(event, options?.executor, options?.triggers);
39
+ if (logs.length > 0 && options?.onFired) {
40
+ options.onFired(logs);
41
+ }
42
+ } catch (err) {
43
+ console.error(
44
+ "[crm-webhook] Error processing CRM event:",
45
+ err instanceof Error ? err.message : err
46
+ );
47
+ }
48
+ };
49
+ }
50
+
51
+ export {
52
+ parseTwentyWebhook,
53
+ createCRMWebhookHandler
54
+ };
@@ -0,0 +1,221 @@
1
+ // src/lib/crdt-sync.ts
2
+ import * as Y from "yjs";
3
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from "fs";
4
+ import path from "path";
5
+ import { homedir } from "os";
6
+ var DEFAULT_STATE_PATH = path.join(homedir(), ".exe-os", "crdt-state.bin");
7
+ var _statePathOverride = null;
8
+ function getStatePath() {
9
+ return _statePathOverride ?? DEFAULT_STATE_PATH;
10
+ }
11
+ function _setStatePath(p) {
12
+ _statePathOverride = p;
13
+ }
14
+ var doc = null;
15
+ function initCrdtDoc() {
16
+ if (doc) return doc;
17
+ doc = new Y.Doc();
18
+ const sp = getStatePath();
19
+ if (existsSync(sp)) {
20
+ try {
21
+ const state = readFileSync(sp);
22
+ Y.applyUpdate(doc, new Uint8Array(state));
23
+ } catch {
24
+ console.warn("[crdt-sync] WARN: corrupted state file, rebuilding from DB");
25
+ try {
26
+ unlinkSync(sp);
27
+ } catch {
28
+ }
29
+ rebuildFromDb().catch((err) => {
30
+ console.warn("[crdt-sync] rebuild from DB failed:", err);
31
+ });
32
+ }
33
+ }
34
+ doc.on("update", () => {
35
+ persistState();
36
+ });
37
+ return doc;
38
+ }
39
+ function getMemoriesMap() {
40
+ const d = initCrdtDoc();
41
+ return d.getMap("memories");
42
+ }
43
+ function getBehaviorsMap() {
44
+ const d = initCrdtDoc();
45
+ return d.getMap("behaviors");
46
+ }
47
+ function applyRemoteUpdate(update) {
48
+ const d = initCrdtDoc();
49
+ Y.applyUpdate(d, update);
50
+ }
51
+ function getFullState() {
52
+ const d = initCrdtDoc();
53
+ return Y.encodeStateAsUpdate(d);
54
+ }
55
+ function getDiffUpdate(remoteStateVector) {
56
+ const d = initCrdtDoc();
57
+ return Y.encodeStateAsUpdate(d, remoteStateVector);
58
+ }
59
+ function getStateVector() {
60
+ const d = initCrdtDoc();
61
+ return Y.encodeStateVector(d);
62
+ }
63
+ function importExistingMemories(memories) {
64
+ const map = getMemoriesMap();
65
+ const d = initCrdtDoc();
66
+ let imported = 0;
67
+ d.transact(() => {
68
+ for (const mem of memories) {
69
+ if (!mem.id) continue;
70
+ if (map.has(mem.id)) continue;
71
+ const entry = new Y.Map();
72
+ entry.set("id", mem.id);
73
+ entry.set("agent_id", mem.agent_id ?? null);
74
+ entry.set("agent_role", mem.agent_role ?? null);
75
+ entry.set("session_id", mem.session_id ?? null);
76
+ entry.set("timestamp", mem.timestamp ?? null);
77
+ entry.set("tool_name", mem.tool_name ?? null);
78
+ entry.set("project_name", mem.project_name ?? null);
79
+ entry.set("has_error", mem.has_error ?? 0);
80
+ entry.set("raw_text", mem.raw_text ?? "");
81
+ entry.set("version", mem.version ?? 0);
82
+ entry.set("author_device_id", mem.author_device_id ?? null);
83
+ entry.set("scope", mem.scope ?? "business");
84
+ map.set(mem.id, entry);
85
+ imported++;
86
+ }
87
+ });
88
+ return imported;
89
+ }
90
+ function importExistingBehaviors(behaviors) {
91
+ const map = getBehaviorsMap();
92
+ const d = initCrdtDoc();
93
+ let imported = 0;
94
+ d.transact(() => {
95
+ for (const beh of behaviors) {
96
+ if (!beh.id) continue;
97
+ if (map.has(beh.id)) continue;
98
+ const entry = new Y.Map();
99
+ entry.set("id", beh.id);
100
+ entry.set("agent_id", beh.agent_id ?? null);
101
+ entry.set("project_name", beh.project_name ?? null);
102
+ entry.set("domain", beh.domain ?? null);
103
+ entry.set("content", beh.content ?? null);
104
+ entry.set("active", beh.active ?? 1);
105
+ entry.set("priority", beh.priority ?? "p1");
106
+ entry.set("created_at", beh.created_at ?? null);
107
+ entry.set("updated_at", beh.updated_at ?? null);
108
+ map.set(beh.id, entry);
109
+ imported++;
110
+ }
111
+ });
112
+ return imported;
113
+ }
114
+ function readAllMemories() {
115
+ const map = getMemoriesMap();
116
+ const records = [];
117
+ map.forEach((entry, id) => {
118
+ records.push({
119
+ id,
120
+ agent_id: entry.get("agent_id"),
121
+ agent_role: entry.get("agent_role"),
122
+ session_id: entry.get("session_id"),
123
+ timestamp: entry.get("timestamp"),
124
+ tool_name: entry.get("tool_name"),
125
+ project_name: entry.get("project_name"),
126
+ has_error: entry.get("has_error"),
127
+ raw_text: entry.get("raw_text"),
128
+ version: entry.get("version"),
129
+ author_device_id: entry.get("author_device_id"),
130
+ scope: entry.get("scope"),
131
+ session_scope: entry.get("session_scope")
132
+ });
133
+ });
134
+ return records;
135
+ }
136
+ function readAllBehaviors() {
137
+ const map = getBehaviorsMap();
138
+ const records = [];
139
+ map.forEach((entry, id) => {
140
+ records.push({
141
+ id,
142
+ agent_id: entry.get("agent_id"),
143
+ project_name: entry.get("project_name"),
144
+ domain: entry.get("domain"),
145
+ content: entry.get("content"),
146
+ active: entry.get("active"),
147
+ priority: entry.get("priority"),
148
+ created_at: entry.get("created_at"),
149
+ updated_at: entry.get("updated_at")
150
+ });
151
+ });
152
+ return records;
153
+ }
154
+ function onUpdate(callback) {
155
+ const d = initCrdtDoc();
156
+ const handler = (update) => callback(update);
157
+ d.on("update", handler);
158
+ return () => d.off("update", handler);
159
+ }
160
+ function persistState() {
161
+ if (!doc) return;
162
+ try {
163
+ const sp = getStatePath();
164
+ const dir = path.dirname(sp);
165
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
166
+ const state = Y.encodeStateAsUpdate(doc);
167
+ writeFileSync(sp, Buffer.from(state));
168
+ } catch {
169
+ }
170
+ }
171
+ function isCrdtSyncEnabled() {
172
+ return process.env.EXE_CRDT_SYNC === "1";
173
+ }
174
+ async function rebuildFromDb() {
175
+ const { getClient } = await import("./lib/database.js");
176
+ const client = getClient();
177
+ const result = await client.execute(
178
+ "SELECT id, agent_id, agent_role, session_id, timestamp, tool_name, project_name, has_error, raw_text, version, author_device_id, scope, session_scope FROM memories"
179
+ );
180
+ const memories = result.rows.map((row) => ({
181
+ id: String(row.id),
182
+ agent_id: row.agent_id,
183
+ agent_role: row.agent_role,
184
+ session_id: row.session_id,
185
+ timestamp: row.timestamp,
186
+ tool_name: row.tool_name,
187
+ project_name: row.project_name,
188
+ has_error: row.has_error,
189
+ raw_text: row.raw_text,
190
+ version: row.version,
191
+ author_device_id: row.author_device_id,
192
+ scope: row.scope,
193
+ session_scope: row.session_scope
194
+ }));
195
+ const count = importExistingMemories(memories);
196
+ persistState();
197
+ return count;
198
+ }
199
+ function destroyCrdtDoc() {
200
+ if (doc) {
201
+ doc.destroy();
202
+ doc = null;
203
+ }
204
+ }
205
+
206
+ export {
207
+ _setStatePath,
208
+ initCrdtDoc,
209
+ applyRemoteUpdate,
210
+ getFullState,
211
+ getDiffUpdate,
212
+ getStateVector,
213
+ importExistingMemories,
214
+ importExistingBehaviors,
215
+ readAllMemories,
216
+ readAllBehaviors,
217
+ onUpdate,
218
+ isCrdtSyncEnabled,
219
+ rebuildFromDb,
220
+ destroyCrdtDoc
221
+ };
@@ -0,0 +1,240 @@
1
+ import {
2
+ getClient,
3
+ isCoordinatorName,
4
+ loadEmployeesSync
5
+ } from "./chunk-RHZ2CRJU.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,30 @@
1
+ import {
2
+ createReminder
3
+ } from "./chunk-DEBLYXA2.js";
4
+
5
+ // src/mcp/tools/create-reminder.ts
6
+ import { z } from "zod";
7
+ function registerCreateReminder(server) {
8
+ server.registerTool(
9
+ "create_reminder",
10
+ {
11
+ title: "Create Reminder",
12
+ description: "Set a reminder for the founder. Shown in the boot brief every session.",
13
+ inputSchema: {
14
+ text: z.string().describe("What to remind about"),
15
+ due_date: z.string().optional().describe("Optional due date \u2014 ISO date (2026-04-01) or null for persistent")
16
+ }
17
+ },
18
+ async ({ text, due_date }) => {
19
+ const reminder = await createReminder(text, due_date);
20
+ const dueStr = reminder.dueDate ? ` (due: ${reminder.dueDate})` : "";
21
+ return {
22
+ content: [{ type: "text", text: `Reminder set: "${reminder.text}"${dueStr}` }]
23
+ };
24
+ }
25
+ );
26
+ }
27
+
28
+ export {
29
+ registerCreateReminder
30
+ };