@askexenow/exe-os 0.9.300 → 0.9.301

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 (244) hide show
  1. package/deploy/compose/erp-nginx/nginx.conf +6 -3
  2. package/dist/active-agent-UNJO6AJ2.js +27 -0
  3. package/dist/active-agent-Y5LSIMVC.js +28 -0
  4. package/dist/agentic-ontology-QEV7GI3T.js +25 -0
  5. package/dist/backfill-metadata-RQZ4BN7G.js +600 -0
  6. package/dist/behaviors-A3L5CWMK.js +46 -0
  7. package/dist/bin/agentic-ontology-backfill.js +5 -5
  8. package/dist/bin/agentic-reflection-backfill.js +6 -6
  9. package/dist/bin/agentic-semantic-label.js +5 -5
  10. package/dist/bin/backfill-conversations.js +4 -4
  11. package/dist/bin/backfill-responses.js +4 -4
  12. package/dist/bin/backfill-vectors.js +5 -5
  13. package/dist/bin/bulk-sync-postgres.js +7 -7
  14. package/dist/bin/cc-doctor.js +4 -4
  15. package/dist/bin/cleanup-stale-review-tasks.js +9 -9
  16. package/dist/bin/cli.js +15 -15
  17. package/dist/bin/exe-agent-config.js +2 -2
  18. package/dist/bin/exe-agent.js +4 -4
  19. package/dist/bin/exe-assign.js +5 -5
  20. package/dist/bin/exe-boot.js +23 -18
  21. package/dist/bin/exe-call.js +4 -4
  22. package/dist/bin/exe-cloud.js +7 -7
  23. package/dist/bin/exe-dispatch.js +9 -9
  24. package/dist/bin/exe-doctor.js +2 -2
  25. package/dist/bin/exe-export-behaviors.js +7 -7
  26. package/dist/bin/exe-forget.js +6 -6
  27. package/dist/bin/exe-gateway.js +7 -7
  28. package/dist/bin/exe-healthcheck.js +4 -4
  29. package/dist/bin/exe-heartbeat.js +9 -9
  30. package/dist/bin/exe-kill.js +12 -12
  31. package/dist/bin/exe-launch-agent.js +16 -16
  32. package/dist/bin/exe-new-employee.js +6 -6
  33. package/dist/bin/exe-pending-messages.js +10 -10
  34. package/dist/bin/exe-pending-notifications.js +9 -9
  35. package/dist/bin/exe-pending-reviews.js +9 -9
  36. package/dist/bin/exe-rename.js +4 -4
  37. package/dist/bin/exe-review.js +11 -11
  38. package/dist/bin/exe-search.js +5 -5
  39. package/dist/bin/exe-session-cleanup.js +14 -14
  40. package/dist/bin/exe-settings.js +7 -7
  41. package/dist/bin/exe-start-codex.js +11 -11
  42. package/dist/bin/exe-start-opencode.js +8 -8
  43. package/dist/bin/exe-status.js +10 -10
  44. package/dist/bin/exe-team.js +3 -3
  45. package/dist/bin/exe-watchdog.js +3 -3
  46. package/dist/bin/git-sweep.js +10 -10
  47. package/dist/bin/graph-backfill.js +4 -4
  48. package/dist/bin/graph-export.js +5 -5
  49. package/dist/bin/import-history.js +7 -7
  50. package/dist/bin/install.js +6 -6
  51. package/dist/bin/intercom-check.js +4 -4
  52. package/dist/bin/mcp-sessions.js +2 -2
  53. package/dist/bin/orchestration-metrics.js +4 -4
  54. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  55. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  56. package/dist/bin/scan-tasks.js +9 -9
  57. package/dist/bin/setup.js +1 -1
  58. package/dist/bin/shard-migrate.js +4 -4
  59. package/dist/capability-cards-VTGDTOZ4.js +89 -0
  60. package/dist/capacity-monitor-G2MAJPRP.js +51 -0
  61. package/dist/catchup-brief-VBGEJQRS.js +175 -0
  62. package/dist/chunk-24JVDLQJ.js +345 -0
  63. package/dist/chunk-2T3OYZMR.js +1158 -0
  64. package/dist/chunk-3ABY3QDX.js +199 -0
  65. package/dist/chunk-3G3ECFB5.js +668 -0
  66. package/dist/chunk-3LHOFGHT.js +280 -0
  67. package/dist/chunk-3RA62PNQ.js +58 -0
  68. package/dist/chunk-3XRS5AVV.js +567 -0
  69. package/dist/chunk-3YK7X5FD.js +1186 -0
  70. package/dist/chunk-4L6PVYFE.js +54 -0
  71. package/dist/chunk-4O67LBMK.js +377 -0
  72. package/dist/chunk-4OIU3N6U.js +167 -0
  73. package/dist/chunk-5SYYMNPE.js +30 -0
  74. package/dist/chunk-5TO5PH7O.js +304 -0
  75. package/dist/chunk-5XD2Y463.js +402 -0
  76. package/dist/chunk-63AENHJC.js +123 -0
  77. package/dist/chunk-673IFJYB.js +731 -0
  78. package/dist/chunk-7AWH47AR.js +448 -0
  79. package/dist/chunk-7P4B6AEP.js +227 -0
  80. package/dist/chunk-7VHOALNC.js +244 -0
  81. package/dist/chunk-ASJHCAVL.js +38 -0
  82. package/dist/chunk-DICIFTCS.js +150 -0
  83. package/dist/chunk-DIFI5JDC.js +76 -0
  84. package/dist/chunk-DPOIJ5SM.js +284 -0
  85. package/dist/chunk-FAZNXNA5.js +33 -0
  86. package/dist/chunk-FCHG5RC4.js +197 -0
  87. package/dist/chunk-FFKSPZO2.js +157 -0
  88. package/dist/chunk-FNHYH5U6.js +331 -0
  89. package/dist/chunk-FWPDAQ6Q.js +1350 -0
  90. package/dist/chunk-FZB73QOI.js +210 -0
  91. package/dist/chunk-GJBR6QLD.js +630 -0
  92. package/dist/chunk-GRSYAHKI.js +535 -0
  93. package/dist/chunk-J5HFRVNW.js +362 -0
  94. package/dist/chunk-J6SD7LT2.js +171 -0
  95. package/dist/chunk-JURL2S27.js +128 -0
  96. package/dist/chunk-KPUYYOFS.js +122 -0
  97. package/dist/chunk-LAFARYU5.js +456 -0
  98. package/dist/chunk-LSDXEHKL.js +381 -0
  99. package/dist/chunk-MS2EOZJQ.js +290 -0
  100. package/dist/chunk-MUIMJGSQ.js +128 -0
  101. package/dist/chunk-NJMPNYBS.js +427 -0
  102. package/dist/chunk-OJACH2JF.js +128 -0
  103. package/dist/chunk-OO4IFABD.js +382 -0
  104. package/dist/chunk-Q65NCNL4.js +1352 -0
  105. package/dist/chunk-QIGS2LRT.js +735 -0
  106. package/dist/chunk-S73ZAJ2S.js +262 -0
  107. package/dist/chunk-SJ4UF7YK.js +1094 -0
  108. package/dist/chunk-SOZ7D77I.js +204 -0
  109. package/dist/chunk-TDX2LK2M.js +240 -0
  110. package/dist/chunk-U5RKGLV6.js +50 -0
  111. package/dist/chunk-UFGTHBHP.js +127 -0
  112. package/dist/chunk-ULCYWCPI.js +1079 -0
  113. package/dist/chunk-V6LOEOXG.js +3372 -0
  114. package/dist/chunk-VAZOVAW4.js +2162 -0
  115. package/dist/chunk-VEUQVKKT.js +185 -0
  116. package/dist/chunk-VIDDJ5RF.js +214 -0
  117. package/dist/chunk-VNB4ROYG.js +348 -0
  118. package/dist/chunk-VWUQFZFB.js +395 -0
  119. package/dist/chunk-W77GRCNA.js +85 -0
  120. package/dist/chunk-WVMG4ZRH.js +14597 -0
  121. package/dist/chunk-WYVOTRRZ.js +129 -0
  122. package/dist/chunk-XQQ7D4I4.js +85 -0
  123. package/dist/chunk-YHJPTIPR.js +836 -0
  124. package/dist/chunk-YLKS7KKC.js +2145 -0
  125. package/dist/chunk-YU3KEVCO.js +333 -0
  126. package/dist/chunk-ZDPU3JTF.js +221 -0
  127. package/dist/chunk-ZDY4LYAJ.js +81 -0
  128. package/dist/chunk-ZG33AACD.js +70 -0
  129. package/dist/chunk-ZKHPZ6KN.js +181 -0
  130. package/dist/chunk-ZO2TM5N5.js +97 -0
  131. package/dist/chunk-ZSUACDQC.js +4388 -0
  132. package/dist/co-activation-XM25BLZM.js +74 -0
  133. package/dist/co-occurrence-CKEMDPWO.js +95 -0
  134. package/dist/core-memory-ZDA76EU3.js +110 -0
  135. package/dist/crdt-sync-BJKZB6T6.js +33 -0
  136. package/dist/crm-webhook-E5PAFAUN.js +10 -0
  137. package/dist/cto-delegation-gate-EMY6ZZ2F.js +280 -0
  138. package/dist/daemon-orchestration-Y5Y6YNE3.js +143 -0
  139. package/dist/db-backup-HFJ53IBU.js +43 -0
  140. package/dist/doc-graph-extractor-ID45AQ2P.js +133 -0
  141. package/dist/dreaming-N6B7KBIE.js +34 -0
  142. package/dist/exe-drift-CPUEAPIU.js +70 -0
  143. package/dist/exe-export-4RTGDV53.js +77 -0
  144. package/dist/exe-import-AZMIF34Z.js +80 -0
  145. package/dist/exe-key-LJV23AJI.js +673 -0
  146. package/dist/exe-snapshot-ZOZBW7V6.js +338 -0
  147. package/dist/fast-db-init-ATRZGHOL.js +7 -0
  148. package/dist/gateway/index.js +8 -8
  149. package/dist/git-staleness-XNOKI4D3.js +112 -0
  150. package/dist/git-task-sweep-3MO4OVND.js +42 -0
  151. package/dist/global-procedures-EBAPPWGZ.js +22 -0
  152. package/dist/graph-auto-extract-VJOUQBPK.js +183 -0
  153. package/dist/hooks/bug-report-worker.js +11 -11
  154. package/dist/hooks/codex-stop-task-finalizer.js +11 -11
  155. package/dist/hooks/commit-complete.js +11 -11
  156. package/dist/hooks/error-recall.js +6 -6
  157. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  158. package/dist/hooks/ingest.js +6 -6
  159. package/dist/hooks/instructions-loaded.js +4 -4
  160. package/dist/hooks/manifest.json +19 -19
  161. package/dist/hooks/notification.js +4 -4
  162. package/dist/hooks/post-compact.js +11 -11
  163. package/dist/hooks/post-tool-combined.js +5 -5
  164. package/dist/hooks/pre-compact.js +12 -12
  165. package/dist/hooks/pre-tool-use.js +14 -14
  166. package/dist/hooks/prompt-submit.js +26 -24
  167. package/dist/hooks/session-end.js +15 -15
  168. package/dist/hooks/session-start.js +12 -12
  169. package/dist/hooks/stop.js +14 -14
  170. package/dist/hooks/subagent-stop.js +10 -10
  171. package/dist/hooks/summary-worker.js +14 -14
  172. package/dist/index.js +17 -17
  173. package/dist/installer-37KFNAWE.js +344 -0
  174. package/dist/installer-F55NR4E2.js +298 -0
  175. package/dist/installer-KOYBUS4J.js +40 -0
  176. package/dist/lib/cloud-sync.js +7 -7
  177. package/dist/lib/consolidation.js +5 -5
  178. package/dist/lib/database.js +2 -2
  179. package/dist/lib/db.js +2 -2
  180. package/dist/lib/employee-templates.js +4 -4
  181. package/dist/lib/employees.js +2 -2
  182. package/dist/lib/exe-daemon.js +40 -40
  183. package/dist/lib/hybrid-search.js +5 -5
  184. package/dist/lib/identity.js +2 -2
  185. package/dist/lib/messaging.js +9 -9
  186. package/dist/lib/reminders.js +3 -3
  187. package/dist/lib/schedules.js +5 -5
  188. package/dist/lib/session-registry.js +4 -4
  189. package/dist/lib/skill-learning.js +6 -6
  190. package/dist/lib/store.js +4 -4
  191. package/dist/lib/task-router.js +3 -3
  192. package/dist/lib/tasks.js +10 -10
  193. package/dist/lib/tmux-routing.js +8 -8
  194. package/dist/lib/token-spend.js +3 -3
  195. package/dist/mcp/register-tools.js +54 -54
  196. package/dist/mcp/server.js +55 -55
  197. package/dist/mcp/tools/complete-reminder.js +4 -4
  198. package/dist/mcp/tools/create-reminder.js +4 -4
  199. package/dist/mcp/tools/create-task.js +12 -12
  200. package/dist/mcp/tools/deactivate-behavior.js +7 -7
  201. package/dist/mcp/tools/list-reminders.js +4 -4
  202. package/dist/mcp/tools/list-tasks.js +12 -12
  203. package/dist/mcp/tools/send-message.js +11 -11
  204. package/dist/mcp/tools/update-task.js +11 -11
  205. package/dist/mcp-http-config-7KJZI7UD.js +31 -0
  206. package/dist/memory-cards-ZIT7ZKL5.js +180 -0
  207. package/dist/memory-graph-extractor-LY2VORZT.js +22 -0
  208. package/dist/memory-poisoning-defense-SEM25TY5.js +224 -0
  209. package/dist/memory-reflection-J2W7CJ7C.js +244 -0
  210. package/dist/notifications-RLMSI4YE.js +47 -0
  211. package/dist/orchestration-events-TGQYA72K.js +27 -0
  212. package/dist/orchestrator-JQD5G3CW.js +35 -0
  213. package/dist/pipeline-router-3Q3YBYSM.js +15 -0
  214. package/dist/plan-limits-YGXTYCW4.js +28 -0
  215. package/dist/project-boot-TDOZKKDR.js +299 -0
  216. package/dist/projection-worker-TMKUSVGD.js +1084 -0
  217. package/dist/prospective-memory-CNJDBNWF.js +232 -0
  218. package/dist/reranker-YQIRNGDM.js +19 -0
  219. package/dist/retrieval-health-M5BVB7EV.js +12 -0
  220. package/dist/review-polling-ZMB3OBPC.js +126 -0
  221. package/dist/runtime/index.js +11 -11
  222. package/dist/session-events-UTMCKDIN.js +38 -0
  223. package/dist/session-kill-telemetry-FRQA5MVD.js +31 -0
  224. package/dist/session-scope-2BD6QLNI.js +88 -0
  225. package/dist/setup-wizard-W64I6SHC.js +12 -0
  226. package/dist/skill-refinement-FXCXTUS2.js +159 -0
  227. package/dist/steward-gate-JDR3SLH3.js +15 -0
  228. package/dist/task-enforcement-WCEA4FZI.js +506 -0
  229. package/dist/task-scope-L5GDL2AV.js +37 -0
  230. package/dist/tasks-crud-S36AFYYM.js +79 -0
  231. package/dist/tasks-notify-W2W2BJRB.js +40 -0
  232. package/dist/tasks-review-34WV7BX2.js +49 -0
  233. package/dist/telemetry-upload-3CSVO3J7.js +741 -0
  234. package/dist/token-budget-ZG2MQ5GD.js +86 -0
  235. package/dist/tool-telemetry-ODL4F2CW.js +17 -0
  236. package/dist/tui/App.js +16 -16
  237. package/dist/tui-data-Z5UF7KEI.js +260 -0
  238. package/dist/wiki-acl-SZFHCEC4.js +111 -0
  239. package/dist/worker-gate-OOO6BWZ6.js +21 -0
  240. package/dist/workflow-engine-QY3IFFR2.js +28 -0
  241. package/dist/worktree-CNOQZBNT.js +28 -0
  242. package/dist/worktree-sweep-SE7ITXC4.js +21 -0
  243. package/package.json +1 -1
  244. package/release-notes.json +88 -88
@@ -0,0 +1,89 @@
1
+ import {
2
+ getIdentity,
3
+ loadEmployeesSync
4
+ } from "./chunk-V6LOEOXG.js";
5
+ import "./chunk-2I23RPSI.js";
6
+ import "./chunk-VWUQFZFB.js";
7
+ import {
8
+ getRoleCapabilities
9
+ } from "./chunk-PNQDP3OA.js";
10
+ import "./chunk-7HLWBYH7.js";
11
+ import "./chunk-FXU7JOXK.js";
12
+ import "./chunk-R36FAN53.js";
13
+ import "./chunk-LYH5HE24.js";
14
+ import "./chunk-MLKGABMK.js";
15
+
16
+ // src/lib/capability-cards.ts
17
+ function extractActions(identityBody) {
18
+ const actions = /* @__PURE__ */ new Set();
19
+ const boldMatches = identityBody.matchAll(/\*\*(\w[\w_]*)\*\*/g);
20
+ for (const m of boldMatches) {
21
+ const name = m[1];
22
+ if (name.length > 2 && !["The", "Non", "What", "How", "Why", "You", "Every", "Your"].includes(name)) {
23
+ actions.add(name);
24
+ }
25
+ }
26
+ return [...actions].sort();
27
+ }
28
+ function getCapabilityCard(agentId) {
29
+ const identity = getIdentity(agentId);
30
+ const role = identity?.frontmatter.role ?? "unknown";
31
+ const title = identity?.frontmatter.title ?? "Unknown";
32
+ const capabilities = getRoleCapabilities(role);
33
+ if (!identity && !capabilities) return null;
34
+ const availableActions = identity ? extractActions(identity.body) : [];
35
+ return {
36
+ agentId,
37
+ role,
38
+ title,
39
+ domains: capabilities?.domains ?? [],
40
+ tools: capabilities?.tools ?? [],
41
+ canDelegate: capabilities?.canDelegate ?? false,
42
+ canReview: capabilities?.canReview ?? false,
43
+ maxComplexity: capabilities?.maxComplexity ?? "low",
44
+ availableActions
45
+ };
46
+ }
47
+ function getAllCapabilityCards() {
48
+ const employees = loadEmployeesSync();
49
+ const cards = [];
50
+ for (const emp of employees) {
51
+ const card = getCapabilityCard(emp.name);
52
+ if (card) cards.push(card);
53
+ }
54
+ return cards;
55
+ }
56
+ function findAgentForTask(taskDescription, cards) {
57
+ const allCards = cards ?? getAllCapabilityCards();
58
+ if (allCards.length === 0) return [];
59
+ const words = new Set(
60
+ taskDescription.toLowerCase().replace(/[^a-z0-9\s-]/g, "").split(/\s+/).filter((w) => w.length > 2)
61
+ );
62
+ const scored = [];
63
+ for (const card of allCards) {
64
+ let score = 0;
65
+ for (const domain of card.domains) {
66
+ const domainWords = domain.toLowerCase().split("-");
67
+ for (const dw of domainWords) {
68
+ if (words.has(dw)) score += 3;
69
+ }
70
+ }
71
+ for (const tool of card.tools) {
72
+ const toolWords = tool.toLowerCase().split(/[_-]/);
73
+ for (const tw of toolWords) {
74
+ if (words.has(tw)) score += 2;
75
+ }
76
+ }
77
+ const roleWords = card.role.toLowerCase().split("-");
78
+ for (const rw of roleWords) {
79
+ if (words.has(rw)) score += 1;
80
+ }
81
+ if (score > 0) scored.push({ card, score });
82
+ }
83
+ return scored.sort((a, b) => b.score - a.score).map((s) => s.card);
84
+ }
85
+ export {
86
+ findAgentForTask,
87
+ getAllCapabilityCards,
88
+ getCapabilityCard
89
+ };
@@ -0,0 +1,51 @@
1
+ import {
2
+ CTX_FLOOR_PERCENT,
3
+ _resetLastRelaunchCache,
4
+ _resetPendingCapacityKills,
5
+ confirmCapacityKill,
6
+ createOrRefreshResumeTask,
7
+ extractContextPercent,
8
+ isAtCapacity,
9
+ isWithinRelaunchCooldown,
10
+ pollCapacityDead
11
+ } from "./chunk-J5HFRVNW.js";
12
+ import "./chunk-63AENHJC.js";
13
+ import "./chunk-ZSUACDQC.js";
14
+ import "./chunk-3LHOFGHT.js";
15
+ import "./chunk-4FVVJ7ME.js";
16
+ import "./chunk-4JERP7NT.js";
17
+ import "./chunk-5TO5PH7O.js";
18
+ import "./chunk-KOO3J5PV.js";
19
+ import "./chunk-22TVSRQQ.js";
20
+ import "./chunk-SSTLTIF3.js";
21
+ import "./chunk-GJBR6QLD.js";
22
+ import "./chunk-QRTJNSKU.js";
23
+ import "./chunk-NGP6LSV2.js";
24
+ import "./chunk-WYVOTRRZ.js";
25
+ import "./chunk-CVYC6DUW.js";
26
+ import "./chunk-OPU3NYOO.js";
27
+ import "./chunk-GJV3WDWM.js";
28
+ import "./chunk-MP2AFCGL.js";
29
+ import "./chunk-ZG33AACD.js";
30
+ import "./chunk-HYZV25LY.js";
31
+ import "./chunk-V6LOEOXG.js";
32
+ import "./chunk-2I23RPSI.js";
33
+ import "./chunk-VWUQFZFB.js";
34
+ import "./chunk-PNQDP3OA.js";
35
+ import "./chunk-7HLWBYH7.js";
36
+ import "./chunk-FXU7JOXK.js";
37
+ import "./chunk-YTKVJJSU.js";
38
+ import "./chunk-R36FAN53.js";
39
+ import "./chunk-LYH5HE24.js";
40
+ import "./chunk-MLKGABMK.js";
41
+ export {
42
+ CTX_FLOOR_PERCENT,
43
+ _resetLastRelaunchCache,
44
+ _resetPendingCapacityKills,
45
+ confirmCapacityKill,
46
+ createOrRefreshResumeTask,
47
+ extractContextPercent,
48
+ isAtCapacity,
49
+ isWithinRelaunchCooldown,
50
+ pollCapacityDead
51
+ };
@@ -0,0 +1,175 @@
1
+ import {
2
+ lightweightSearch
3
+ } from "./chunk-Q65NCNL4.js";
4
+ import "./chunk-AB4PAQYK.js";
5
+ import "./chunk-YHJPTIPR.js";
6
+ import "./chunk-CHCA3ZM2.js";
7
+ import "./chunk-OTVEIJUQ.js";
8
+ import "./chunk-FZB73QOI.js";
9
+ import "./chunk-Y25OJWOQ.js";
10
+ import {
11
+ sessionScopeFilter,
12
+ strictSessionScopeFilter
13
+ } from "./chunk-ZSUACDQC.js";
14
+ import "./chunk-3LHOFGHT.js";
15
+ import "./chunk-4FVVJ7ME.js";
16
+ import "./chunk-4JERP7NT.js";
17
+ import "./chunk-5TO5PH7O.js";
18
+ import "./chunk-KOO3J5PV.js";
19
+ import "./chunk-22TVSRQQ.js";
20
+ import "./chunk-SSTLTIF3.js";
21
+ import "./chunk-GJBR6QLD.js";
22
+ import "./chunk-QRTJNSKU.js";
23
+ import "./chunk-NGP6LSV2.js";
24
+ import "./chunk-WYVOTRRZ.js";
25
+ import "./chunk-CVYC6DUW.js";
26
+ import "./chunk-OPU3NYOO.js";
27
+ import "./chunk-GJV3WDWM.js";
28
+ import "./chunk-MP2AFCGL.js";
29
+ import "./chunk-ZG33AACD.js";
30
+ import "./chunk-HYZV25LY.js";
31
+ import {
32
+ getClient
33
+ } from "./chunk-V6LOEOXG.js";
34
+ import "./chunk-2I23RPSI.js";
35
+ import "./chunk-VWUQFZFB.js";
36
+ import "./chunk-PNQDP3OA.js";
37
+ import "./chunk-7HLWBYH7.js";
38
+ import "./chunk-FXU7JOXK.js";
39
+ import "./chunk-Z42MXYWW.js";
40
+ import "./chunk-YTKVJJSU.js";
41
+ import "./chunk-R36FAN53.js";
42
+ import "./chunk-LYH5HE24.js";
43
+ import "./chunk-MLKGABMK.js";
44
+
45
+ // src/lib/catchup-brief.ts
46
+ import { execSync } from "child_process";
47
+ var HEADER = "## Catchup Brief\nHere's what happened while you were offline:";
48
+ var DEFAULT_LOOKBACK_MS = 60 * 60 * 1e3;
49
+ var MAX_BRIEF_CHARS = 2e3;
50
+ var MAX_CHECKPOINT_CHARS = 500;
51
+ var MAX_MESSAGE_CHARS = 100;
52
+ function clipText(text, maxChars) {
53
+ if (text.length <= maxChars) return text;
54
+ if (maxChars <= 1) return "\u2026";
55
+ return `${text.slice(0, maxChars - 1).trimEnd()}\u2026`;
56
+ }
57
+ function clampSections(header, sections, maxChars) {
58
+ const bounded = [];
59
+ let remaining = Math.max(0, maxChars - header.length);
60
+ for (const section of sections) {
61
+ const separatorChars = 2;
62
+ if (remaining <= separatorChars) break;
63
+ remaining -= separatorChars;
64
+ if (section.length <= remaining) {
65
+ bounded.push(section);
66
+ remaining -= section.length;
67
+ continue;
68
+ }
69
+ const clipped = clipText(section, remaining);
70
+ if (clipped.trim().length > 0) bounded.push(clipped);
71
+ break;
72
+ }
73
+ return bounded;
74
+ }
75
+ async function buildCatchupBrief(agentId, projectName, cwd, sessionScope) {
76
+ const sections = [];
77
+ let lastTimestamp = new Date(Date.now() - DEFAULT_LOOKBACK_MS).toISOString();
78
+ try {
79
+ const checkpointMemories = await lightweightSearch(
80
+ "CONTEXT CHECKPOINT",
81
+ agentId,
82
+ { projectName, limit: 1 }
83
+ );
84
+ const checkpoint = checkpointMemories[0];
85
+ if (checkpoint?.timestamp) {
86
+ lastTimestamp = checkpoint.timestamp;
87
+ }
88
+ if (checkpoint?.raw_text) {
89
+ sections.push(
90
+ `### Last Checkpoint
91
+ ${clipText(checkpoint.raw_text, MAX_CHECKPOINT_CHARS)}`
92
+ );
93
+ }
94
+ } catch {
95
+ }
96
+ try {
97
+ const gitLog = execSync(
98
+ `git log --oneline --since=${JSON.stringify(lastTimestamp)} --format="%h %an: %s" | head -10`,
99
+ { cwd, timeout: 3e3, encoding: "utf-8" }
100
+ ).trim();
101
+ if (gitLog) {
102
+ sections.push(`### Git Activity Since You Left
103
+ \`\`\`
104
+ ${gitLog}
105
+ \`\`\``);
106
+ }
107
+ } catch {
108
+ }
109
+ try {
110
+ const client = getClient();
111
+ const taskScope = sessionScopeFilter(sessionScope);
112
+ const taskChanges = await client.execute({
113
+ sql: `SELECT title, status, priority FROM tasks
114
+ WHERE assigned_to = ? AND project_name = ?
115
+ AND updated_at > ? AND status IN ('open', 'in_progress')${taskScope.sql}
116
+ ORDER BY priority ASC, updated_at DESC LIMIT 5`,
117
+ args: [agentId, projectName, lastTimestamp, ...taskScope.args]
118
+ });
119
+ if (taskChanges.rows.length > 0) {
120
+ const taskLines = taskChanges.rows.map((row) => {
121
+ const record = row;
122
+ return `- [${String(record.priority).toUpperCase()}] ${String(record.title)} (${String(record.status)})`;
123
+ }).join("\n");
124
+ sections.push(`### Your Task Queue
125
+ ${taskLines}`);
126
+ }
127
+ } catch {
128
+ }
129
+ try {
130
+ const client = getClient();
131
+ const messageScope = strictSessionScopeFilter(sessionScope);
132
+ const messages = await client.execute({
133
+ sql: `SELECT from_agent, content, created_at FROM messages
134
+ WHERE target_agent = ? AND status = 'pending'${messageScope.sql}
135
+ ORDER BY created_at DESC LIMIT 3`,
136
+ args: [agentId, ...messageScope.args]
137
+ });
138
+ if (messages.rows.length > 0) {
139
+ const msgLines = messages.rows.map((row) => {
140
+ const record = row;
141
+ return `- From ${String(record.from_agent)}: ${clipText(String(record.content ?? ""), MAX_MESSAGE_CHARS)}`;
142
+ }).join("\n");
143
+ sections.push(`### Unread Messages
144
+ ${msgLines}`);
145
+ }
146
+ } catch {
147
+ }
148
+ try {
149
+ const { getPendingProspective, markSurfaced } = await import("./prospective-memory-CNJDBNWF.js");
150
+ const due = await getPendingProspective(agentId, { projectName, limit: 5 });
151
+ if (due.length > 0) {
152
+ const now = Date.now();
153
+ const lines = due.map((item) => {
154
+ const overdue = item.dueDate != null && new Date(item.dueDate).getTime() < now;
155
+ const when = item.dueDate ? `due ${item.dueDate}${overdue ? " \u2014 OVERDUE" : ""}` : "someday";
156
+ const recur = item.recurrence !== "once" ? `, ${item.recurrence}` : "";
157
+ return `- [P${item.priority}] ${clipText(item.content, MAX_CHECKPOINT_CHARS)} (${when}${recur})`;
158
+ });
159
+ sections.push(`### Reminders Due (Prospective Memory)
160
+ ${lines.join("\n")}`);
161
+ try {
162
+ await markSurfaced(due.map((d) => d.id));
163
+ } catch {
164
+ }
165
+ }
166
+ } catch {
167
+ }
168
+ return {
169
+ header: HEADER,
170
+ sections: clampSections(HEADER, sections, MAX_BRIEF_CHARS)
171
+ };
172
+ }
173
+ export {
174
+ buildCatchupBrief
175
+ };
@@ -0,0 +1,345 @@
1
+ import {
2
+ employeeSessionName,
3
+ isEmployeeAlive,
4
+ resolveExeSession,
5
+ sendIntercom,
6
+ strictSessionScopeFilter
7
+ } from "./chunk-ZSUACDQC.js";
8
+ import {
9
+ parseMessage,
10
+ serializeMessage
11
+ } from "./chunk-4JERP7NT.js";
12
+ import {
13
+ recordOrchestrationEventBestEffort
14
+ } from "./chunk-GJBR6QLD.js";
15
+ import {
16
+ getClient
17
+ } from "./chunk-V6LOEOXG.js";
18
+
19
+ // src/lib/messaging.ts
20
+ import crypto from "crypto";
21
+ function generateUlid() {
22
+ const timestamp = Date.now().toString(36).padStart(10, "0");
23
+ const random = crypto.randomBytes(10).toString("hex").slice(0, 16);
24
+ return (timestamp + random).toUpperCase();
25
+ }
26
+ function rowToMessage(row) {
27
+ return {
28
+ id: row.id,
29
+ fromAgent: row.from_agent,
30
+ fromDevice: row.from_device,
31
+ targetAgent: row.target_agent,
32
+ targetProject: row.target_project ?? null,
33
+ targetDevice: row.target_device,
34
+ sessionScope: row.session_scope ?? null,
35
+ content: row.content,
36
+ priority: row.priority ?? "normal",
37
+ status: row.status ?? "pending",
38
+ serverSeq: row.server_seq != null ? Number(row.server_seq) : null,
39
+ retryCount: Number(row.retry_count ?? 0),
40
+ createdAt: row.created_at,
41
+ deliveredAt: row.delivered_at ?? null,
42
+ processedAt: row.processed_at ?? null,
43
+ failedAt: row.failed_at ?? null,
44
+ failureReason: row.failure_reason ?? null
45
+ };
46
+ }
47
+ var MAX_RETRIES = 10;
48
+ async function countUnreadMessages(targetAgent, sessionScope) {
49
+ const client = getClient();
50
+ const scope = strictSessionScopeFilter(sessionScope);
51
+ const result = await client.execute({
52
+ sql: `SELECT COUNT(*) AS count FROM messages
53
+ WHERE target_agent = ? AND status IN ('pending', 'delivered')${scope.sql}`,
54
+ args: [targetAgent, ...scope.args]
55
+ });
56
+ return Number(result.rows[0]?.count ?? 0);
57
+ }
58
+ async function sendMessage(input) {
59
+ const client = getClient();
60
+ const id = generateUlid();
61
+ const now = (/* @__PURE__ */ new Date()).toISOString();
62
+ const targetDevice = input.targetDevice ?? "local";
63
+ const sessionScope = input.sessionScope === void 0 ? resolveExeSession() : input.sessionScope;
64
+ await client.execute({
65
+ sql: `INSERT INTO messages (id, from_agent, from_device, target_agent, target_project, target_device, session_scope, content, priority, status, founder_id, created_at)
66
+ VALUES (?, ?, 'local', ?, ?, ?, ?, ?, ?, 'pending', ?, ?)`,
67
+ args: [
68
+ id,
69
+ input.fromAgent,
70
+ input.targetAgent,
71
+ input.targetProject ?? null,
72
+ targetDevice,
73
+ sessionScope,
74
+ input.content,
75
+ input.priority ?? "normal",
76
+ input.founderId ?? null,
77
+ now
78
+ ]
79
+ });
80
+ recordOrchestrationEventBestEffort({
81
+ eventType: "message.sent",
82
+ source: "messaging.sendMessage",
83
+ agentId: input.fromAgent,
84
+ payload: { targetAgent: input.targetAgent, priority: input.priority ?? "normal", targetDevice },
85
+ sessionScope: sessionScope ?? null
86
+ });
87
+ try {
88
+ if (targetDevice !== "local") {
89
+ await deliverCrossMachineMessage(id, targetDevice);
90
+ } else {
91
+ await deliverLocalMessage(id);
92
+ }
93
+ } catch {
94
+ }
95
+ const sentScope = strictSessionScopeFilter(sessionScope);
96
+ const result = await client.execute({
97
+ sql: `SELECT * FROM messages WHERE id = ?${sentScope.sql}`,
98
+ args: [id, ...sentScope.args]
99
+ });
100
+ return rowToMessage(result.rows[0]);
101
+ }
102
+ var _wsClientSend = null;
103
+ function setWsClientSend(fn) {
104
+ _wsClientSend = fn;
105
+ }
106
+ async function deliverCrossMachineMessage(messageId, targetDevice) {
107
+ const client = getClient();
108
+ const result = await client.execute({
109
+ sql: "SELECT * FROM messages WHERE id = ?",
110
+ args: [messageId]
111
+ });
112
+ if (result.rows.length === 0) return false;
113
+ const msg = rowToMessage(result.rows[0]);
114
+ if (msg.status !== "pending") return false;
115
+ if (!_wsClientSend) {
116
+ return false;
117
+ }
118
+ const payload = JSON.stringify({
119
+ id: msg.id,
120
+ fromAgent: msg.fromAgent,
121
+ targetAgent: msg.targetAgent,
122
+ targetProject: msg.targetProject,
123
+ sessionScope: msg.sessionScope,
124
+ content: msg.content,
125
+ priority: msg.priority,
126
+ createdAt: msg.createdAt
127
+ });
128
+ const sent = _wsClientSend(targetDevice, payload);
129
+ if (sent) {
130
+ await client.execute({
131
+ sql: "UPDATE messages SET status = 'synced' WHERE id = ?",
132
+ args: [messageId]
133
+ });
134
+ return true;
135
+ }
136
+ return false;
137
+ }
138
+ async function deliverLocalMessage(messageId) {
139
+ const client = getClient();
140
+ const result = await client.execute({
141
+ sql: "SELECT * FROM messages WHERE id = ?",
142
+ args: [messageId]
143
+ });
144
+ if (result.rows.length === 0) return false;
145
+ const msg = rowToMessage(result.rows[0]);
146
+ if (msg.status !== "pending") return false;
147
+ const targetAgent = msg.targetAgent;
148
+ const now = (/* @__PURE__ */ new Date()).toISOString();
149
+ try {
150
+ const exeSession = resolveExeSession();
151
+ if (!exeSession) {
152
+ throw new Error("No coordinator session found");
153
+ }
154
+ process.stderr.write(`[messaging] ENTER deliverLocal: target=${targetAgent} exeSession=${exeSession}
155
+ `);
156
+ const { isCoordinatorName: isCoord } = await import("./lib/employees.js");
157
+ const isCOO = isCoord(targetAgent);
158
+ process.stderr.write(`[messaging] COO check: targetAgent="${targetAgent}" isCOO=${isCOO}
159
+ `);
160
+ const sessionName = isCOO ? exeSession : employeeSessionName(targetAgent, exeSession);
161
+ process.stderr.write(`[messaging] delivery attempt: target=${targetAgent} session=${sessionName} isCOO=${isCOO}
162
+ `);
163
+ if (!isCOO && !isEmployeeAlive(sessionName)) {
164
+ throw new Error("Session not running \u2014 message stays queued");
165
+ }
166
+ const unreadCount = await countUnreadMessages(targetAgent, msg.sessionScope);
167
+ if (unreadCount <= 0) {
168
+ return false;
169
+ }
170
+ const intercomResult = sendIntercom(sessionName, { force: true, reason: "message" });
171
+ process.stderr.write(`[messaging] intercom result for ${sessionName}: ${intercomResult}
172
+ `);
173
+ await client.execute({
174
+ sql: "UPDATE messages SET status = 'delivered', delivered_at = ? WHERE id = ?",
175
+ args: [now, messageId]
176
+ });
177
+ recordOrchestrationEventBestEffort({
178
+ eventType: "message.delivered",
179
+ source: "messaging.deliverLocalMessage",
180
+ agentId: msg.targetAgent,
181
+ payload: { fromAgent: msg.fromAgent, priority: msg.priority }
182
+ });
183
+ return true;
184
+ } catch (err) {
185
+ process.stderr.write(
186
+ `[messaging] delivery failed for message ${messageId}: ${err instanceof Error ? err.message : String(err)}
187
+ `
188
+ );
189
+ const newRetryCount = msg.retryCount + 1;
190
+ if (newRetryCount >= MAX_RETRIES) {
191
+ await markFailed(messageId, "session unavailable after 10 retries", msg.sessionScope);
192
+ } else {
193
+ await client.execute({
194
+ sql: "UPDATE messages SET retry_count = ? WHERE id = ?",
195
+ args: [newRetryCount, messageId]
196
+ });
197
+ }
198
+ return false;
199
+ }
200
+ }
201
+ async function getPendingMessages(targetAgent, sessionScope) {
202
+ const client = getClient();
203
+ const scope = strictSessionScopeFilter(sessionScope);
204
+ const result = await client.execute({
205
+ sql: `SELECT * FROM messages
206
+ WHERE target_agent = ? AND status IN ('pending', 'delivered')${scope.sql}
207
+ ORDER BY id`,
208
+ args: [targetAgent, ...scope.args]
209
+ });
210
+ return result.rows.map((row) => rowToMessage(row));
211
+ }
212
+ async function markRead(messageId, sessionScope) {
213
+ const client = getClient();
214
+ const scope = strictSessionScopeFilter(sessionScope);
215
+ await client.execute({
216
+ sql: `UPDATE messages SET status = 'read'
217
+ WHERE id = ? AND status IN ('pending', 'delivered')${scope.sql}`,
218
+ args: [messageId, ...scope.args]
219
+ });
220
+ recordOrchestrationEventBestEffort({
221
+ eventType: "message.read",
222
+ source: "messaging.markRead",
223
+ payload: { messageId }
224
+ });
225
+ }
226
+ async function markAcknowledged(messageId, sessionScope) {
227
+ const client = getClient();
228
+ const scope = strictSessionScopeFilter(sessionScope);
229
+ await client.execute({
230
+ sql: `UPDATE messages SET status = 'acknowledged', processed_at = ?
231
+ WHERE id = ? AND status = 'read'${scope.sql}`,
232
+ args: [(/* @__PURE__ */ new Date()).toISOString(), messageId, ...scope.args]
233
+ });
234
+ }
235
+ async function markProcessed(messageId, sessionScope) {
236
+ const client = getClient();
237
+ const scope = strictSessionScopeFilter(sessionScope);
238
+ await client.execute({
239
+ sql: `UPDATE messages SET status = 'processed', processed_at = ?
240
+ WHERE id = ?${scope.sql}`,
241
+ args: [(/* @__PURE__ */ new Date()).toISOString(), messageId, ...scope.args]
242
+ });
243
+ }
244
+ async function getMessageStatus(messageId, sessionScope) {
245
+ const client = getClient();
246
+ const scope = strictSessionScopeFilter(sessionScope);
247
+ const result = await client.execute({
248
+ sql: `SELECT status FROM messages WHERE id = ?${scope.sql}`,
249
+ args: [messageId, ...scope.args]
250
+ });
251
+ return result.rows[0]?.status ?? null;
252
+ }
253
+ async function getUnacknowledgedMessages(targetAgent, sessionScope) {
254
+ const client = getClient();
255
+ const scope = strictSessionScopeFilter(sessionScope);
256
+ const result = await client.execute({
257
+ sql: `SELECT * FROM messages
258
+ WHERE target_agent = ? AND status IN ('pending', 'delivered', 'read')${scope.sql}
259
+ ORDER BY id`,
260
+ args: [targetAgent, ...scope.args]
261
+ });
262
+ return result.rows.map((row) => rowToMessage(row));
263
+ }
264
+ async function getReadMessages(targetAgent, sessionScope) {
265
+ const client = getClient();
266
+ const scope = strictSessionScopeFilter(sessionScope);
267
+ const result = await client.execute({
268
+ sql: `SELECT * FROM messages
269
+ WHERE target_agent = ? AND status = 'read'${scope.sql}
270
+ ORDER BY id`,
271
+ args: [targetAgent, ...scope.args]
272
+ });
273
+ return result.rows.map((row) => rowToMessage(row));
274
+ }
275
+ async function markFailed(messageId, reason, sessionScope) {
276
+ const client = getClient();
277
+ const scope = strictSessionScopeFilter(sessionScope);
278
+ await client.execute({
279
+ sql: `UPDATE messages SET status = 'failed', failed_at = ?, failure_reason = ?
280
+ WHERE id = ?${scope.sql}`,
281
+ args: [(/* @__PURE__ */ new Date()).toISOString(), reason, messageId, ...scope.args]
282
+ });
283
+ }
284
+ async function getFailedMessages(sessionScope) {
285
+ const client = getClient();
286
+ const scope = strictSessionScopeFilter(sessionScope);
287
+ const result = await client.execute({
288
+ sql: `SELECT * FROM messages WHERE status = 'failed'${scope.sql} ORDER BY created_at DESC`,
289
+ args: [...scope.args]
290
+ });
291
+ return result.rows.map((row) => rowToMessage(row));
292
+ }
293
+ async function retryPendingMessages(sessionScope) {
294
+ const client = getClient();
295
+ const scope = strictSessionScopeFilter(sessionScope);
296
+ const result = await client.execute({
297
+ sql: `SELECT * FROM messages
298
+ WHERE status = 'pending' AND retry_count < ?${scope.sql}
299
+ ORDER BY id`,
300
+ args: [MAX_RETRIES, ...scope.args]
301
+ });
302
+ let delivered = 0;
303
+ for (const row of result.rows) {
304
+ const msg = rowToMessage(row);
305
+ try {
306
+ const success = await deliverLocalMessage(msg.id);
307
+ if (success) delivered++;
308
+ } catch {
309
+ }
310
+ }
311
+ return delivered;
312
+ }
313
+ async function sendTypedMessage(envelope, targetAgent, opts) {
314
+ return sendMessage({
315
+ fromAgent: envelope.from,
316
+ targetAgent,
317
+ targetProject: opts?.targetProject,
318
+ targetDevice: opts?.targetDevice,
319
+ content: serializeMessage(envelope),
320
+ priority: opts?.priority,
321
+ sessionScope: opts?.sessionScope
322
+ });
323
+ }
324
+ function parseIncomingMessage(content) {
325
+ return parseMessage(content);
326
+ }
327
+
328
+ export {
329
+ countUnreadMessages,
330
+ sendMessage,
331
+ setWsClientSend,
332
+ deliverLocalMessage,
333
+ getPendingMessages,
334
+ markRead,
335
+ markAcknowledged,
336
+ markProcessed,
337
+ getMessageStatus,
338
+ getUnacknowledgedMessages,
339
+ getReadMessages,
340
+ markFailed,
341
+ getFailedMessages,
342
+ retryPendingMessages,
343
+ sendTypedMessage,
344
+ parseIncomingMessage
345
+ };