@askexenow/exe-os 0.9.271 → 0.9.272

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 (305) hide show
  1. package/dist/active-agent-BDYXURXQ.js +26 -0
  2. package/dist/active-agent-YWBGAKGU.js +25 -0
  3. package/dist/agentic-ontology-56VHSVS3.js +25 -0
  4. package/dist/backfill-metadata-G46ABBVR.js +597 -0
  5. package/dist/backfill-metadata-VAV27KJK.js +597 -0
  6. package/dist/behaviors-USUTDXVA.js +25 -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 +6 -6
  14. package/dist/bin/cc-doctor.js +4 -4
  15. package/dist/bin/cleanup-stale-review-tasks.js +10 -10
  16. package/dist/bin/cli.js +16 -16
  17. package/dist/bin/exe-agent-config.js +3 -3
  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 +17 -17
  21. package/dist/bin/exe-call.js +4 -4
  22. package/dist/bin/exe-cloud.js +4 -4
  23. package/dist/bin/exe-dispatch.js +10 -10
  24. package/dist/bin/exe-doctor.js +1 -1
  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 +10 -10
  30. package/dist/bin/exe-kill.js +13 -13
  31. package/dist/bin/exe-launch-agent.js +37 -19
  32. package/dist/bin/exe-new-employee.js +6 -6
  33. package/dist/bin/exe-pending-messages.js +11 -11
  34. package/dist/bin/exe-pending-notifications.js +10 -10
  35. package/dist/bin/exe-pending-reviews.js +10 -10
  36. package/dist/bin/exe-rename.js +4 -4
  37. package/dist/bin/exe-review.js +12 -12
  38. package/dist/bin/exe-search.js +5 -5
  39. package/dist/bin/exe-session-cleanup.js +15 -15
  40. package/dist/bin/exe-settings.js +5 -5
  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 +11 -11
  44. package/dist/bin/exe-team.js +3 -3
  45. package/dist/bin/git-sweep.js +11 -11
  46. package/dist/bin/graph-backfill.js +4 -4
  47. package/dist/bin/graph-export.js +5 -5
  48. package/dist/bin/import-history.js +7 -7
  49. package/dist/bin/install.js +6 -6
  50. package/dist/bin/intercom-check.js +4 -4
  51. package/dist/bin/mcp-sessions.js +2 -2
  52. package/dist/bin/orchestration-metrics.js +4 -4
  53. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  54. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  55. package/dist/bin/scan-tasks.js +10 -10
  56. package/dist/bin/setup.js +1 -1
  57. package/dist/bin/shard-migrate.js +4 -4
  58. package/dist/capacity-monitor-IFVRCIM7.js +49 -0
  59. package/dist/capacity-monitor-Q47GBDSY.js +49 -0
  60. package/dist/catchup-brief-RP4QHXNT.js +151 -0
  61. package/dist/catchup-brief-TKA6TEK4.js +151 -0
  62. package/dist/chunk-23KJ2LXY.js +58 -0
  63. package/dist/chunk-2NQQP3FF.js +630 -0
  64. package/dist/chunk-3FU5I3KV.js +526 -0
  65. package/dist/chunk-46IEEKPU.js +13696 -0
  66. package/dist/chunk-57UAFTO2.js +3958 -0
  67. package/dist/chunk-5AS622MM.js +3958 -0
  68. package/dist/chunk-62DEE65H.js +371 -0
  69. package/dist/chunk-64T6DFSS.js +447 -0
  70. package/dist/chunk-6BWDP63Z.js +197 -0
  71. package/dist/chunk-6GPYL7TX.js +214 -0
  72. package/dist/chunk-6KWLUVFL.js +54 -0
  73. package/dist/chunk-6N5ISWBF.js +1148 -0
  74. package/dist/chunk-6OD7PVMC.js +333 -0
  75. package/dist/chunk-7ET5CYTD.js +382 -0
  76. package/dist/chunk-7IWLKR6N.js +76 -0
  77. package/dist/chunk-7OEUOJL5.js +1021 -0
  78. package/dist/chunk-AIRJTKDK.js +204 -0
  79. package/dist/chunk-ATJ3NXDP.js +244 -0
  80. package/dist/chunk-B5IS7LE4.js +128 -0
  81. package/dist/chunk-BKINEQVI.js +244 -0
  82. package/dist/chunk-BOJV6NI3.js +128 -0
  83. package/dist/chunk-BPHWI6N2.js +284 -0
  84. package/dist/chunk-BXCQWWJP.js +185 -0
  85. package/dist/chunk-BZ6K7AY3.js +50 -0
  86. package/dist/chunk-C54KIFLS.js +214 -0
  87. package/dist/chunk-C6OYEJJI.js +260 -0
  88. package/dist/chunk-CHBHR5W6.js +3556 -0
  89. package/dist/chunk-D2T3272U.js +171 -0
  90. package/dist/chunk-DCHEIVGT.js +221 -0
  91. package/dist/chunk-DHIBLMSP.js +30 -0
  92. package/dist/chunk-E2AF2WYY.js +346 -0
  93. package/dist/chunk-E2KZEZZW.js +1090 -0
  94. package/dist/chunk-E4KWB4WM.js +348 -0
  95. package/dist/chunk-ENU7URWK.js +1073 -0
  96. package/dist/chunk-EZ7KAZMC.js +132 -0
  97. package/dist/chunk-F4FSSHR4.js +1073 -0
  98. package/dist/chunk-FPXU56FG.js +346 -0
  99. package/dist/chunk-FY7HHR5I.js +128 -0
  100. package/dist/chunk-G2S2UMU4.js +159 -0
  101. package/dist/chunk-G33BHQCO.js +70 -0
  102. package/dist/chunk-GJQTL7RX.js +127 -0
  103. package/dist/chunk-GLCKDEM2.js +97 -0
  104. package/dist/chunk-GMA34SXV.js +240 -0
  105. package/dist/chunk-GVAVEBYR.js +2091 -0
  106. package/dist/chunk-HOSJTLBQ.js +513 -0
  107. package/dist/chunk-IC6HVAS3.js +56 -0
  108. package/dist/chunk-IDFJNO44.js +1051 -0
  109. package/dist/chunk-ILFJMEY5.js +97 -0
  110. package/dist/chunk-ISQAOSL3.js +1921 -0
  111. package/dist/chunk-J6V2DCZK.js +382 -0
  112. package/dist/chunk-JP4CLFLR.js +1148 -0
  113. package/dist/chunk-JTIOZHWG.js +58 -0
  114. package/dist/chunk-KDICWAYV.js +1345 -0
  115. package/dist/chunk-KOBIB6WG.js +159 -0
  116. package/dist/chunk-KQFDDQB6.js +13696 -0
  117. package/dist/chunk-KZNSOHCB.js +280 -0
  118. package/dist/chunk-LVMBYP3C.js +171 -0
  119. package/dist/chunk-M2WQW5NC.js +227 -0
  120. package/dist/chunk-MY6SP5NZ.js +551 -0
  121. package/dist/chunk-N2ACW2ZG.js +363 -0
  122. package/dist/chunk-NSMJDATI.js +495 -0
  123. package/dist/chunk-NSQ5JE23.js +1090 -0
  124. package/dist/chunk-NZL567WG.js +81 -0
  125. package/dist/chunk-O5OMH6LI.js +244 -0
  126. package/dist/chunk-OBUV3W7L.js +163 -0
  127. package/dist/chunk-OLDS7LJN.js +495 -0
  128. package/dist/chunk-OO2I22RX.js +38 -0
  129. package/dist/chunk-OPUUT33V.js +447 -0
  130. package/dist/chunk-OT3VMTKB.js +50 -0
  131. package/dist/chunk-P6RVIOVA.js +157 -0
  132. package/dist/chunk-PUA5564C.js +210 -0
  133. package/dist/chunk-PUQLKLQX.js +731 -0
  134. package/dist/chunk-QROKS65G.js +76 -0
  135. package/dist/chunk-R54I2N2T.js +818 -0
  136. package/dist/chunk-RCFYQHUP.js +818 -0
  137. package/dist/chunk-RJTND4YS.js +284 -0
  138. package/dist/chunk-SBLHQMMZ.js +81 -0
  139. package/dist/chunk-SG2ANG5C.js +123 -0
  140. package/dist/chunk-SVFNKSZV.js +333 -0
  141. package/dist/chunk-TAQT2DC7.js +330 -0
  142. package/dist/chunk-TB7HFW7M.js +127 -0
  143. package/dist/chunk-UUKDAIH2.js +731 -0
  144. package/dist/chunk-V6VEFEEH.js +1345 -0
  145. package/dist/chunk-VIO2ALGH.js +290 -0
  146. package/dist/chunk-VKCUSNJW.js +377 -0
  147. package/dist/chunk-VRPPJFIQ.js +1921 -0
  148. package/dist/chunk-WP3PVBBP.js +204 -0
  149. package/dist/chunk-WQEUY7DC.js +129 -0
  150. package/dist/chunk-WXMXUKCA.js +262 -0
  151. package/dist/chunk-X2WBH2IO.js +297 -0
  152. package/dist/chunk-X33TSJNO.js +394 -0
  153. package/dist/chunk-X7MMI2UI.js +89 -0
  154. package/dist/chunk-XG3BQZIK.js +85 -0
  155. package/dist/chunk-XIKBIAOS.js +75 -0
  156. package/dist/chunk-XPEB545Q.js +54 -0
  157. package/dist/chunk-XWH2MLWS.js +330 -0
  158. package/dist/chunk-YH7V73XW.js +89 -0
  159. package/dist/chunk-YMLM5D65.js +135 -0
  160. package/dist/chunk-YNJPRQ6J.js +377 -0
  161. package/dist/chunk-YSNEHBI6.js +551 -0
  162. package/dist/chunk-ZD6BMW2K.js +33 -0
  163. package/dist/chunk-ZKG5IYCG.js +668 -0
  164. package/dist/chunk-ZU4K7ZNX.js +197 -0
  165. package/dist/co-activation-HZMJC34P.js +72 -0
  166. package/dist/co-occurrence-AVYXRV4L.js +74 -0
  167. package/dist/core-memory-NPJCVUMF.js +110 -0
  168. package/dist/core-memory-OKGXL33Z.js +110 -0
  169. package/dist/crdt-sync-ZCH55JNR.js +33 -0
  170. package/dist/crm-webhook-6OMVUUGR.js +10 -0
  171. package/dist/crm-webhook-UCWF3XDB.js +10 -0
  172. package/dist/cto-delegation-gate-JFZFZGC2.js +206 -0
  173. package/dist/cto-delegation-gate-K32M4GVM.js +206 -0
  174. package/dist/daemon-orchestration-2Q7BYOHC.js +135 -0
  175. package/dist/daemon-orchestration-4RJ2CZJL.js +135 -0
  176. package/dist/db-backup-5GA2YFDX.js +33 -0
  177. package/dist/dreaming-I6KXO6E2.js +32 -0
  178. package/dist/dreaming-NJBK5ILR.js +32 -0
  179. package/dist/exe-drift-VSMIMHL4.js +68 -0
  180. package/dist/exe-export-DVHHIA6Y.js +73 -0
  181. package/dist/exe-export-GIVQDENS.js +73 -0
  182. package/dist/exe-import-7N46LSMQ.js +76 -0
  183. package/dist/exe-import-FINYUV5T.js +76 -0
  184. package/dist/exe-key-H45JY44F.js +579 -0
  185. package/dist/exe-key-MAEQGTB7.js +579 -0
  186. package/dist/exe-snapshot-3TEM3BFD.js +164 -0
  187. package/dist/exe-snapshot-HECGUHL3.js +164 -0
  188. package/dist/fast-db-init-3CNTADVO.js +7 -0
  189. package/dist/fast-db-init-HXCS2AP5.js +7 -0
  190. package/dist/gateway/index.js +8 -8
  191. package/dist/git-staleness-YCEBBIVK.js +110 -0
  192. package/dist/git-task-sweep-H34STRNT.js +40 -0
  193. package/dist/git-task-sweep-YL7NLDCK.js +40 -0
  194. package/dist/global-procedures-IHZM6C2K.js +20 -0
  195. package/dist/graph-auto-extract-RZQ3MHP2.js +162 -0
  196. package/dist/hooks/bug-report-worker.js +12 -12
  197. package/dist/hooks/codex-stop-task-finalizer.js +12 -12
  198. package/dist/hooks/commit-complete.js +12 -12
  199. package/dist/hooks/error-recall.js +6 -6
  200. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  201. package/dist/hooks/ingest.js +6 -6
  202. package/dist/hooks/instructions-loaded.js +4 -4
  203. package/dist/hooks/manifest.json +19 -19
  204. package/dist/hooks/notification.js +4 -4
  205. package/dist/hooks/post-compact.js +11 -11
  206. package/dist/hooks/post-tool-combined.js +5 -5
  207. package/dist/hooks/pre-compact.js +12 -12
  208. package/dist/hooks/pre-tool-use.js +15 -15
  209. package/dist/hooks/prompt-submit.js +21 -21
  210. package/dist/hooks/session-end.js +16 -16
  211. package/dist/hooks/session-start.js +10 -10
  212. package/dist/hooks/stop.js +15 -15
  213. package/dist/hooks/subagent-stop.js +11 -11
  214. package/dist/hooks/summary-worker.js +15 -15
  215. package/dist/index.js +18 -18
  216. package/dist/installer-4EW5ZDGD.js +296 -0
  217. package/dist/installer-B2JTQO55.js +38 -0
  218. package/dist/installer-MIL352T7.js +342 -0
  219. package/dist/lib/agent-config.js +9 -3
  220. package/dist/lib/cloud-sync.js +4 -4
  221. package/dist/lib/consolidation.js +5 -5
  222. package/dist/lib/database.js +2 -2
  223. package/dist/lib/db.js +2 -2
  224. package/dist/lib/employee-templates.js +4 -4
  225. package/dist/lib/employees.js +2 -2
  226. package/dist/lib/exe-daemon.js +34 -34
  227. package/dist/lib/hybrid-search.js +5 -5
  228. package/dist/lib/identity.js +2 -2
  229. package/dist/lib/messaging.js +10 -10
  230. package/dist/lib/reminders.js +3 -3
  231. package/dist/lib/schedules.js +5 -5
  232. package/dist/lib/session-registry.js +4 -4
  233. package/dist/lib/skill-learning.js +4 -4
  234. package/dist/lib/store.js +4 -4
  235. package/dist/lib/task-router.js +3 -3
  236. package/dist/lib/tasks.js +11 -11
  237. package/dist/lib/tmux-routing.js +9 -9
  238. package/dist/lib/token-spend.js +3 -3
  239. package/dist/mcp/register-tools.js +54 -54
  240. package/dist/mcp/server.js +55 -55
  241. package/dist/mcp/tools/complete-reminder.js +4 -4
  242. package/dist/mcp/tools/create-reminder.js +4 -4
  243. package/dist/mcp/tools/create-task.js +13 -13
  244. package/dist/mcp/tools/deactivate-behavior.js +5 -5
  245. package/dist/mcp/tools/list-reminders.js +4 -4
  246. package/dist/mcp/tools/list-tasks.js +13 -13
  247. package/dist/mcp/tools/send-message.js +12 -12
  248. package/dist/mcp/tools/update-task.js +12 -12
  249. package/dist/mcp-http-config-OJQR246S.js +27 -0
  250. package/dist/memory-cards-IPULSQFA.js +174 -0
  251. package/dist/memory-graph-extractor-3TZZOKHY.js +17 -0
  252. package/dist/memory-poisoning-defense-SGUGR5YJ.js +225 -0
  253. package/dist/memory-reflection-H3WGCEM6.js +238 -0
  254. package/dist/notifications-VWPO6NJF.js +45 -0
  255. package/dist/notifications-WCSRQN2V.js +45 -0
  256. package/dist/orchestration-events-O5PSDEIO.js +25 -0
  257. package/dist/orchestrator-RAPEJUOI.js +33 -0
  258. package/dist/orchestrator-XPG6LJAI.js +33 -0
  259. package/dist/pipeline-router-5NT6FUC3.js +13 -0
  260. package/dist/pipeline-router-KSUXONDT.js +13 -0
  261. package/dist/plan-limits-53NXLNDQ.js +26 -0
  262. package/dist/project-boot-ITN3FZMM.js +299 -0
  263. package/dist/projection-worker-27XX5M2W.js +964 -0
  264. package/dist/reranker-GU7L2PJX.js +19 -0
  265. package/dist/reranker-TZEXIJAN.js +19 -0
  266. package/dist/review-polling-FA2J2Q5O.js +124 -0
  267. package/dist/review-polling-MLS4BQ3N.js +124 -0
  268. package/dist/runtime/index.js +12 -12
  269. package/dist/session-events-WWGF3B2N.js +36 -0
  270. package/dist/session-events-ZHXXAH6B.js +36 -0
  271. package/dist/session-kill-telemetry-O4TJHHOZ.js +29 -0
  272. package/dist/session-scope-CQXB7VMH.js +86 -0
  273. package/dist/session-scope-HHUMJYF6.js +86 -0
  274. package/dist/setup-wizard-UM2RHSBJ.js +12 -0
  275. package/dist/skill-refinement-MJPOHYD5.js +157 -0
  276. package/dist/skill-refinement-NVUBRK22.js +157 -0
  277. package/dist/stack-release-BAPCXMXW.js +713 -0
  278. package/dist/stack-release-W4TWTEZP.js +731 -0
  279. package/dist/steward-gate-VLE7OCKO.js +13 -0
  280. package/dist/task-enforcement-FUHDL6UR.js +391 -0
  281. package/dist/task-enforcement-QL3K4N3F.js +391 -0
  282. package/dist/task-scope-TZYMB634.js +35 -0
  283. package/dist/task-scope-ZVLUBS4C.js +35 -0
  284. package/dist/tasks-crud-4MSLJWXE.js +77 -0
  285. package/dist/tasks-crud-HIPXKRKX.js +77 -0
  286. package/dist/tasks-notify-7JBUNE7R.js +38 -0
  287. package/dist/tasks-notify-UPIJ3L4O.js +38 -0
  288. package/dist/tasks-review-5SJSFTUB.js +47 -0
  289. package/dist/tasks-review-JHSYBR5I.js +47 -0
  290. package/dist/telemetry-upload-BSGOXGUP.js +739 -0
  291. package/dist/telemetry-upload-LTX3C5HZ.js +739 -0
  292. package/dist/token-budget-2CDWQU3Q.js +84 -0
  293. package/dist/tool-telemetry-7YS7EN7B.js +17 -0
  294. package/dist/tui/App.js +17 -17
  295. package/dist/tui-data-GDGBOS6G.js +258 -0
  296. package/dist/tui-data-VXF2RBVM.js +258 -0
  297. package/dist/wiki-acl-MJIMXRQV.js +111 -0
  298. package/dist/worker-gate-WQGTZOSM.js +21 -0
  299. package/dist/worker-gate-X2YDTKTL.js +21 -0
  300. package/dist/workflow-engine-CYXRZXBM.js +28 -0
  301. package/dist/workflow-engine-KMLAXVA4.js +28 -0
  302. package/dist/worktree-NLSKVRNC.js +26 -0
  303. package/dist/worktree-sweep-44TMEPLE.js +19 -0
  304. package/package.json +1 -1
  305. package/release-notes.json +24 -19
@@ -0,0 +1,204 @@
1
+ import {
2
+ getClient
3
+ } from "./chunk-UNCGZXPU.js";
4
+
5
+ // src/lib/pipeline-router.ts
6
+ import crypto from "crypto";
7
+ async function sinkConversationStore(msg, agentResponse, agentName) {
8
+ try {
9
+ const client = getClient();
10
+ const id = crypto.randomUUID();
11
+ const mediaJson = msg.media ? JSON.stringify(msg.media) : null;
12
+ await client.execute({
13
+ sql: `INSERT INTO conversations
14
+ (id, platform, external_id, sender_id, sender_name, sender_phone, sender_email,
15
+ recipient_id, channel_id, thread_id, reply_to_id,
16
+ content_text, content_media, agent_response, agent_name,
17
+ timestamp, ingested_at)
18
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
19
+ args: [
20
+ id,
21
+ msg.platform,
22
+ msg.messageId,
23
+ msg.senderId,
24
+ msg.senderName ?? null,
25
+ msg.senderPhone ?? null,
26
+ msg.senderEmail ?? null,
27
+ msg.accountId ?? null,
28
+ msg.channelId,
29
+ msg.threadId ?? `${msg.platform}:${msg.channelId}`,
30
+ msg.replyTo?.messageId ?? null,
31
+ msg.text ?? null,
32
+ mediaJson,
33
+ agentResponse ?? null,
34
+ agentName ?? null,
35
+ msg.timestamp,
36
+ (/* @__PURE__ */ new Date()).toISOString()
37
+ ]
38
+ });
39
+ return true;
40
+ } catch (err) {
41
+ process.stderr.write(
42
+ `[pipeline] conversation-store error: ${err instanceof Error ? err.message : String(err)}
43
+ `
44
+ );
45
+ return false;
46
+ }
47
+ }
48
+ async function sinkMemory(msg, agentResponse, agentName) {
49
+ try {
50
+ const { embed } = await import("./lib/embedder.js");
51
+ const { writeMemory, flushBatch } = await import("./lib/store.js");
52
+ const direction = agentResponse ? "conversation" : "inbound";
53
+ const rawText = [
54
+ `[${msg.platform}] ${direction} from ${msg.senderName ?? msg.senderId}`,
55
+ msg.text ? `Message: ${msg.text}` : null,
56
+ agentResponse ? `Agent (${agentName ?? "unknown"}): ${agentResponse}` : null
57
+ ].filter(Boolean).join("\n");
58
+ const vector = await embed(rawText);
59
+ await writeMemory({
60
+ id: crypto.randomUUID(),
61
+ agent_id: agentName ?? "gateway",
62
+ agent_role: "gateway",
63
+ session_id: `gateway-${msg.platform}`,
64
+ timestamp: msg.timestamp,
65
+ tool_name: `gateway-${msg.platform}`,
66
+ project_name: "exe-os",
67
+ has_error: false,
68
+ raw_text: rawText,
69
+ vector,
70
+ importance: 4,
71
+ confidence: 0.8
72
+ });
73
+ await flushBatch();
74
+ return true;
75
+ } catch (err) {
76
+ process.stderr.write(
77
+ `[pipeline] memory-sink error: ${err instanceof Error ? err.message : String(err)}
78
+ `
79
+ );
80
+ return false;
81
+ }
82
+ }
83
+ async function sinkCRM(msg, agentResponse, agentName) {
84
+ try {
85
+ const { isCRMBridgeEnabled, pushConversationToCRM, pushInboundMessageToCRM } = await import("./crm-bridge-BVTB6LZK.js");
86
+ if (!isCRMBridgeEnabled()) return false;
87
+ if (agentResponse) {
88
+ await pushConversationToCRM({
89
+ platform: msg.platform,
90
+ senderId: msg.senderId,
91
+ senderName: msg.senderName,
92
+ messageText: msg.text,
93
+ agentResponse,
94
+ agentName: agentName ?? "unknown",
95
+ timestamp: msg.timestamp,
96
+ accountId: msg.accountId
97
+ });
98
+ } else {
99
+ await pushInboundMessageToCRM({
100
+ platform: msg.platform,
101
+ senderId: msg.senderId,
102
+ senderName: msg.senderName,
103
+ messageText: msg.text,
104
+ timestamp: msg.timestamp,
105
+ accountId: msg.accountId
106
+ });
107
+ }
108
+ return true;
109
+ } catch (err) {
110
+ process.stderr.write(
111
+ `[pipeline] crm-sink error: ${err instanceof Error ? err.message : String(err)}
112
+ `
113
+ );
114
+ return false;
115
+ }
116
+ }
117
+ async function sinkWiki(msg, agentResponse) {
118
+ try {
119
+ const { createWikiClient } = await import("./wiki-client-GBPR45BQ.js");
120
+ const client = await createWikiClient();
121
+ if (!client) return false;
122
+ const content = msg.text ?? "";
123
+ if (content.length < 50) return false;
124
+ const { chatInWorkspace } = await import("./wiki-client-GBPR45BQ.js");
125
+ const ingestText = [
126
+ `[${msg.platform}] Message from ${msg.senderName ?? msg.senderId} (${msg.timestamp}):`,
127
+ content,
128
+ agentResponse ? `
129
+ Agent response: ${agentResponse}` : ""
130
+ ].join("\n");
131
+ await chatInWorkspace(client, "conversations", ingestText, "chat");
132
+ return true;
133
+ } catch (err) {
134
+ process.stderr.write(
135
+ `[pipeline] wiki-sink error: ${err instanceof Error ? err.message : String(err)}
136
+ `
137
+ );
138
+ return false;
139
+ }
140
+ }
141
+ async function sinkEntityExtraction(msg, agentResponse, agentName) {
142
+ try {
143
+ const { extractFromConversation } = await import("./conversation-entity-extractor-EYSI4DKM.js");
144
+ const { storeExtraction } = await import("./graph-rag-G3EG5Q6L.js");
145
+ if ((msg.text?.length ?? 0) < 20) return false;
146
+ if (msg.isHistorical) return false;
147
+ const extraction = await extractFromConversation(msg, agentResponse, agentName);
148
+ if (extraction.entities.length === 0) return false;
149
+ const client = getClient();
150
+ const memoryId = `conv:${msg.messageId}`;
151
+ await storeExtraction(client, extraction, memoryId, msg.timestamp);
152
+ import("./conversation-wiki-populator-L7O6F3BB.js").then(
153
+ ({ populateWikiFromExtraction }) => populateWikiFromExtraction(extraction, msg, agentResponse, agentName)
154
+ ).catch((err) => {
155
+ process.stderr.write(
156
+ `[pipeline] wiki-population error: ${err instanceof Error ? err.message : String(err)}
157
+ `
158
+ );
159
+ });
160
+ return true;
161
+ } catch (err) {
162
+ process.stderr.write(
163
+ `[pipeline] entity-extraction-sink error: ${err instanceof Error ? err.message : String(err)}
164
+ `
165
+ );
166
+ return false;
167
+ }
168
+ }
169
+ async function ingest(msg, agentResponse, agentName) {
170
+ const errors = [];
171
+ const [conversationStored, memorySunk, crmSunk, wikiSunk, entityExtracted] = await Promise.all([
172
+ sinkConversationStore(msg, agentResponse, agentName).catch((e) => {
173
+ errors.push(`conversation: ${e}`);
174
+ return false;
175
+ }),
176
+ sinkMemory(msg, agentResponse, agentName).catch((e) => {
177
+ errors.push(`memory: ${e}`);
178
+ return false;
179
+ }),
180
+ sinkCRM(msg, agentResponse, agentName).catch((e) => {
181
+ errors.push(`crm: ${e}`);
182
+ return false;
183
+ }),
184
+ sinkWiki(msg, agentResponse).catch((e) => {
185
+ errors.push(`wiki: ${e}`);
186
+ return false;
187
+ }),
188
+ sinkEntityExtraction(msg, agentResponse, agentName).catch((e) => {
189
+ errors.push(`entity-extraction: ${e}`);
190
+ return false;
191
+ })
192
+ ]);
193
+ if (errors.length > 0) {
194
+ process.stderr.write(
195
+ `[pipeline] ${errors.length} sink error(s): ${errors.join("; ")}
196
+ `
197
+ );
198
+ }
199
+ return { conversationStored, memorySunk, crmSunk, wikiSunk, entityExtracted, errors };
200
+ }
201
+
202
+ export {
203
+ ingest
204
+ };
@@ -0,0 +1,244 @@
1
+ import {
2
+ employeeSessionName,
3
+ ensureEmployee,
4
+ markAsReadByTaskFile,
5
+ notifyParentExe,
6
+ resolveExeSession,
7
+ sendIntercom
8
+ } from "./chunk-57UAFTO2.js";
9
+ import {
10
+ getTransport
11
+ } from "./chunk-MVW62NIZ.js";
12
+ import {
13
+ recordOrchestrationEventBestEffort
14
+ } from "./chunk-JP45GCVR.js";
15
+ import {
16
+ getAgentRuntime
17
+ } from "./chunk-XJUUWHVN.js";
18
+ import {
19
+ getSessionKey
20
+ } from "./chunk-CVYC6DUW.js";
21
+ import {
22
+ isCoordinatorName,
23
+ isMultiInstance,
24
+ shouldAutoInstance
25
+ } from "./chunk-UNCGZXPU.js";
26
+
27
+ // src/lib/tasks-notify.ts
28
+ var VERIFY_DELAY_MS = 1e4;
29
+ var ACK_PATTERNS = [
30
+ /New task assigned/,
31
+ /START WORKING NOW/,
32
+ /marked in_progress/,
33
+ /Reading.*\.md/
34
+ ];
35
+ function resolveDispatchRuntime(agentId, override) {
36
+ if (override) return override;
37
+ try {
38
+ return getAgentRuntime(agentId).runtime ?? null;
39
+ } catch {
40
+ return null;
41
+ }
42
+ }
43
+ async function verifyDispatch(sessionName, delayMs = VERIFY_DELAY_MS) {
44
+ const transport = getTransport();
45
+ await new Promise((r) => setTimeout(r, delayMs));
46
+ if (!transport.isAlive(sessionName)) {
47
+ return "session_dead";
48
+ }
49
+ try {
50
+ const output = transport.capturePane(sessionName, 20);
51
+ const acked = ACK_PATTERNS.some((p) => p.test(output));
52
+ return acked ? "verified" : "sent_unverified";
53
+ } catch {
54
+ return "sent_unverified";
55
+ }
56
+ }
57
+ async function dispatchTaskToEmployee(input) {
58
+ if (isCoordinatorName(input.assignedTo)) return { dispatched: "skipped" };
59
+ const dispatchRuntime = resolveDispatchRuntime(input.assignedTo, input.spawnRuntime);
60
+ recordOrchestrationEventBestEffort({
61
+ eventType: "dispatch.attempted",
62
+ source: "tasks-notify.dispatchTaskToEmployee",
63
+ taskId: input.taskId ?? null,
64
+ agentId: input.assignedTo,
65
+ runtime: dispatchRuntime,
66
+ payload: { priority: input.priority, projectName: input.projectName }
67
+ });
68
+ let crossProject = false;
69
+ if (input.projectName) {
70
+ try {
71
+ const { assertSessionScope } = await import("./session-scope-CQXB7VMH.js");
72
+ const check = assertSessionScope("dispatch_task", input.projectName);
73
+ if (check.reason === "cross_session_denied") {
74
+ crossProject = true;
75
+ recordOrchestrationEventBestEffort({
76
+ eventType: "dispatch.failed",
77
+ source: "tasks-notify.dispatchTaskToEmployee",
78
+ taskId: input.taskId ?? null,
79
+ agentId: input.assignedTo,
80
+ runtime: dispatchRuntime,
81
+ errorCode: "cross_session_denied",
82
+ payload: { projectName: input.projectName }
83
+ });
84
+ return { dispatched: "skipped", crossProject: true };
85
+ }
86
+ } catch {
87
+ }
88
+ }
89
+ try {
90
+ const transport = getTransport();
91
+ const exeSession = resolveExeSession();
92
+ if (!exeSession) {
93
+ recordOrchestrationEventBestEffort({
94
+ eventType: "dispatch.failed",
95
+ source: "tasks-notify.dispatchTaskToEmployee",
96
+ taskId: input.taskId ?? null,
97
+ agentId: input.assignedTo,
98
+ runtime: dispatchRuntime,
99
+ errorCode: "no_exe_session"
100
+ });
101
+ return { dispatched: "session_missing" };
102
+ }
103
+ const multiInstance = isMultiInstance(input.assignedTo);
104
+ if (multiInstance) {
105
+ const projectDir = input.projectDir ?? process.cwd();
106
+ const autoOpts = shouldAutoInstance(input.assignedTo);
107
+ const result = ensureEmployee(input.assignedTo, exeSession, projectDir, {
108
+ ...autoOpts,
109
+ runtimeOverride: input.spawnRuntime,
110
+ modelOverride: input.spawnModel
111
+ });
112
+ if (result.status === "failed") {
113
+ process.stderr.write(
114
+ `[dispatch-audit] SPAWN FAILED \u2192 ${input.assignedTo} | task="${input.title}" [${input.priority}] | error=${result.error}
115
+ `
116
+ );
117
+ recordOrchestrationEventBestEffort({
118
+ eventType: "dispatch.failed",
119
+ source: "tasks-notify.dispatchTaskToEmployee",
120
+ taskId: input.taskId ?? null,
121
+ agentId: input.assignedTo,
122
+ sessionScope: exeSession,
123
+ runtime: dispatchRuntime,
124
+ errorCode: "spawn_failed",
125
+ payload: { path: "multi_instance", error: result.error }
126
+ });
127
+ return { dispatched: "session_missing" };
128
+ }
129
+ const dispatched = result.status === "intercom_sent" || result.status === "intercom_unprocessed" ? "sent_unverified" : "spawned";
130
+ process.stderr.write(
131
+ `[dispatch-audit] ${dispatched === "spawned" ? "SPAWNED" : "INTERCOM"} \u2192 ${result.sessionName} | task="${input.title}" [${input.priority}]
132
+ `
133
+ );
134
+ recordOrchestrationEventBestEffort({
135
+ eventType: "dispatch.completed",
136
+ source: "tasks-notify.dispatchTaskToEmployee",
137
+ taskId: input.taskId ?? null,
138
+ agentId: input.assignedTo,
139
+ sessionScope: exeSession,
140
+ tmuxSession: result.sessionName,
141
+ runtime: dispatchRuntime,
142
+ result: dispatched,
143
+ payload: { path: "multi_instance", priority: input.priority }
144
+ });
145
+ return { dispatched, session: result.sessionName, crossProject };
146
+ }
147
+ const sessionName = employeeSessionName(input.assignedTo, exeSession);
148
+ if (transport.isAlive(sessionName)) {
149
+ const result = sendIntercom(sessionName, { force: true });
150
+ const dispatched = result === "acknowledged" || result === "debounced" || result === "queued" ? "verified" : result === "delivered" ? "sent_unverified" : "session_dead";
151
+ process.stderr.write(
152
+ `[dispatch-audit] intercom \u2192 ${sessionName} | task="${input.title}" [${input.priority}] | result=${dispatched} (sendIntercom=${result})
153
+ `
154
+ );
155
+ recordOrchestrationEventBestEffort({
156
+ eventType: "dispatch.completed",
157
+ source: "tasks-notify.dispatchTaskToEmployee",
158
+ taskId: input.taskId ?? null,
159
+ agentId: input.assignedTo,
160
+ sessionScope: exeSession,
161
+ tmuxSession: sessionName,
162
+ runtime: dispatchRuntime,
163
+ result: dispatched,
164
+ payload: { path: "single_instance_intercom", priority: input.priority }
165
+ });
166
+ return { dispatched, session: sessionName, crossProject };
167
+ } else {
168
+ const projectDir = input.projectDir ?? process.cwd();
169
+ const result = ensureEmployee(input.assignedTo, exeSession, projectDir, {
170
+ runtimeOverride: input.spawnRuntime,
171
+ modelOverride: input.spawnModel
172
+ });
173
+ if (result.status === "failed") {
174
+ process.stderr.write(
175
+ `[dispatch-audit] SPAWN FAILED \u2192 ${input.assignedTo} | task="${input.title}" [${input.priority}] | error=${result.error}
176
+ `
177
+ );
178
+ recordOrchestrationEventBestEffort({
179
+ eventType: "dispatch.failed",
180
+ source: "tasks-notify.dispatchTaskToEmployee",
181
+ taskId: input.taskId ?? null,
182
+ agentId: input.assignedTo,
183
+ sessionScope: exeSession,
184
+ runtime: dispatchRuntime,
185
+ errorCode: "spawn_failed",
186
+ payload: { path: "single_instance_spawn", error: result.error }
187
+ });
188
+ return { dispatched: "session_missing" };
189
+ }
190
+ process.stderr.write(
191
+ `[dispatch-audit] SPAWNED \u2192 ${result.sessionName} | task="${input.title}" [${input.priority}]
192
+ `
193
+ );
194
+ recordOrchestrationEventBestEffort({
195
+ eventType: "dispatch.completed",
196
+ source: "tasks-notify.dispatchTaskToEmployee",
197
+ taskId: input.taskId ?? null,
198
+ agentId: input.assignedTo,
199
+ sessionScope: exeSession,
200
+ tmuxSession: result.sessionName,
201
+ runtime: dispatchRuntime,
202
+ result: "spawned",
203
+ payload: { path: "single_instance_spawn", priority: input.priority }
204
+ });
205
+ return { dispatched: "spawned", session: result.sessionName, crossProject };
206
+ }
207
+ } catch {
208
+ recordOrchestrationEventBestEffort({
209
+ eventType: "dispatch.failed",
210
+ source: "tasks-notify.dispatchTaskToEmployee",
211
+ taskId: input.taskId ?? null,
212
+ agentId: input.assignedTo,
213
+ runtime: dispatchRuntime,
214
+ errorCode: "exception"
215
+ });
216
+ return { dispatched: "session_missing" };
217
+ }
218
+ }
219
+ function notifyTaskDone() {
220
+ try {
221
+ const key = getSessionKey();
222
+ if (key && !process.env.VITEST) {
223
+ notifyParentExe(key);
224
+ process.stderr.write(
225
+ `[dispatch-audit] notifyTaskDone \u2192 parent coordinator (session=${key})
226
+ `
227
+ );
228
+ }
229
+ } catch {
230
+ }
231
+ }
232
+ async function markTaskNotificationsRead(taskFile) {
233
+ try {
234
+ await markAsReadByTaskFile(taskFile);
235
+ } catch {
236
+ }
237
+ }
238
+
239
+ export {
240
+ verifyDispatch,
241
+ dispatchTaskToEmployee,
242
+ notifyTaskDone,
243
+ markTaskNotificationsRead
244
+ };
@@ -0,0 +1,128 @@
1
+ import {
2
+ getCurrentSessionScope,
3
+ strictSessionScopeFilter
4
+ } from "./chunk-57UAFTO2.js";
5
+ import {
6
+ getProjectName
7
+ } from "./chunk-OPU3NYOO.js";
8
+
9
+ // src/lib/session-events.ts
10
+ import { randomUUID } from "crypto";
11
+ async function ensureSessionEventsTable(client) {
12
+ await client.execute(`
13
+ CREATE TABLE IF NOT EXISTS session_events (
14
+ id TEXT PRIMARY KEY,
15
+ agent_id TEXT NOT NULL,
16
+ agent_role TEXT NOT NULL,
17
+ session_id TEXT NOT NULL,
18
+ session_scope TEXT,
19
+ project_name TEXT NOT NULL,
20
+ event_index INTEGER NOT NULL,
21
+ event_type TEXT NOT NULL,
22
+ tool_name TEXT,
23
+ tool_use_id TEXT,
24
+ content TEXT NOT NULL,
25
+ payload_json TEXT,
26
+ has_error INTEGER NOT NULL DEFAULT 0,
27
+ created_at TEXT NOT NULL
28
+ )
29
+ `);
30
+ await client.execute(`
31
+ CREATE INDEX IF NOT EXISTS idx_session_events_agent_time
32
+ ON session_events(agent_id, created_at DESC)
33
+ `);
34
+ await client.execute(`
35
+ CREATE INDEX IF NOT EXISTS idx_session_events_session_index
36
+ ON session_events(session_id, event_index)
37
+ `);
38
+ await client.execute(`
39
+ CREATE INDEX IF NOT EXISTS idx_session_events_scope_agent_time
40
+ ON session_events(session_scope, agent_id, created_at DESC)
41
+ `);
42
+ }
43
+ async function recordSessionEvent(client, input) {
44
+ if (!input.content || input.content.trim().length === 0) return;
45
+ await ensureSessionEventsTable(client);
46
+ const maxResult = await client.execute({
47
+ sql: "SELECT COALESCE(MAX(event_index), 0) AS max_index FROM session_events WHERE session_id = ?",
48
+ args: [input.sessionId]
49
+ });
50
+ const currentMax = Number(maxResult.rows[0]?.max_index ?? 0);
51
+ const eventIndex = Number.isFinite(currentMax) ? currentMax + 1 : 1;
52
+ await client.execute({
53
+ sql: `INSERT INTO session_events (
54
+ id, agent_id, agent_role, session_id, session_scope, project_name,
55
+ event_index, event_type, tool_name, tool_use_id, content,
56
+ payload_json, has_error, created_at
57
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
58
+ args: [
59
+ randomUUID(),
60
+ input.agentId,
61
+ input.agentRole,
62
+ input.sessionId,
63
+ input.sessionScope ?? getCurrentSessionScope(),
64
+ input.projectName ?? getProjectName(input.cwd),
65
+ eventIndex,
66
+ input.eventType,
67
+ input.toolName ?? null,
68
+ input.toolUseId ?? null,
69
+ input.content,
70
+ input.payloadJson ?? null,
71
+ input.hasError ? 1 : 0,
72
+ input.timestamp ?? (/* @__PURE__ */ new Date()).toISOString()
73
+ ]
74
+ });
75
+ }
76
+ async function listRecentSessionEvents(client, options) {
77
+ await ensureSessionEventsTable(client);
78
+ const conditions = ["agent_id = ?"];
79
+ const args = [options.agentId];
80
+ if (options.sessionId) {
81
+ conditions.push("session_id = ?");
82
+ args.push(options.sessionId);
83
+ }
84
+ if (options.eventType) {
85
+ conditions.push("event_type = ?");
86
+ args.push(options.eventType);
87
+ }
88
+ if (options.projectName && options.projectName !== "all") {
89
+ conditions.push("project_name = ?");
90
+ args.push(options.projectName);
91
+ }
92
+ const scope = strictSessionScopeFilter(options.sessionScope);
93
+ const where = `WHERE ${conditions.join(" AND ")}${scope.sql}`;
94
+ args.push(...scope.args);
95
+ args.push(Math.min(Math.max(options.limit ?? 20, 1), 100));
96
+ const result = await client.execute({
97
+ sql: `SELECT id, agent_id, agent_role, session_id, session_scope,
98
+ project_name, event_index, event_type, tool_name, tool_use_id,
99
+ content, payload_json, has_error, created_at
100
+ FROM session_events
101
+ ${where}
102
+ ORDER BY created_at DESC, event_index DESC
103
+ LIMIT ?`,
104
+ args
105
+ });
106
+ return result.rows.map((row) => ({
107
+ id: String(row.id),
108
+ agentId: String(row.agent_id),
109
+ agentRole: String(row.agent_role),
110
+ sessionId: String(row.session_id),
111
+ sessionScope: row.session_scope == null ? null : String(row.session_scope),
112
+ projectName: String(row.project_name),
113
+ eventIndex: Number(row.event_index),
114
+ eventType: String(row.event_type),
115
+ toolName: row.tool_name == null ? null : String(row.tool_name),
116
+ toolUseId: row.tool_use_id == null ? null : String(row.tool_use_id),
117
+ content: String(row.content),
118
+ payloadJson: row.payload_json == null ? null : String(row.payload_json),
119
+ hasError: Number(row.has_error) === 1,
120
+ createdAt: String(row.created_at)
121
+ }));
122
+ }
123
+
124
+ export {
125
+ ensureSessionEventsTable,
126
+ recordSessionEvent,
127
+ listRecentSessionEvents
128
+ };