@askexenow/exe-os 0.9.288 → 0.9.289

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/deploy/compose/README.md +6 -0
  2. package/deploy/compose/docker-compose.yml +48 -53
  3. package/dist/active-agent-DVMG6WVY.js +27 -0
  4. package/dist/active-agent-JJVXXRZV.js +26 -0
  5. package/dist/agentic-ontology-2LJST3BE.js +25 -0
  6. package/dist/backfill-metadata-W7PJ6YGP.js +599 -0
  7. package/dist/background-jobs-YTYZRTCM.js +25 -0
  8. package/dist/behaviors-EM5KZSHT.js +39 -0
  9. package/dist/bin/age-ontology-load.js +2 -2
  10. package/dist/bin/agentic-ontology-backfill.js +8 -8
  11. package/dist/bin/agentic-reflection-backfill.js +9 -9
  12. package/dist/bin/agentic-semantic-label.js +8 -8
  13. package/dist/bin/backfill-conversations.js +8 -8
  14. package/dist/bin/backfill-responses.js +8 -8
  15. package/dist/bin/backfill-vectors.js +11 -11
  16. package/dist/bin/bulk-sync-postgres.js +9 -9
  17. package/dist/bin/cc-doctor.js +7 -7
  18. package/dist/bin/cleanup-stale-review-tasks.js +13 -13
  19. package/dist/bin/cli.js +20 -20
  20. package/dist/bin/deferred-daemon-restart.js +1 -1
  21. package/dist/bin/exe-agent-config.js +5 -5
  22. package/dist/bin/exe-agent.js +6 -6
  23. package/dist/bin/exe-assign.js +10 -10
  24. package/dist/bin/exe-boot.js +20 -20
  25. package/dist/bin/exe-call.js +6 -6
  26. package/dist/bin/exe-cloud.js +8 -8
  27. package/dist/bin/exe-dispatch.js +13 -13
  28. package/dist/bin/exe-doctor.js +1 -1
  29. package/dist/bin/exe-export-behaviors.js +9 -9
  30. package/dist/bin/exe-forget.js +8 -8
  31. package/dist/bin/exe-gateway.js +9 -9
  32. package/dist/bin/exe-healthcheck.js +7 -7
  33. package/dist/bin/exe-heartbeat.js +13 -13
  34. package/dist/bin/exe-kill.js +16 -16
  35. package/dist/bin/exe-launch-agent.js +20 -20
  36. package/dist/bin/exe-new-employee.js +9 -9
  37. package/dist/bin/exe-pending-messages.js +14 -14
  38. package/dist/bin/exe-pending-notifications.js +13 -13
  39. package/dist/bin/exe-pending-reviews.js +13 -13
  40. package/dist/bin/exe-rename.js +6 -6
  41. package/dist/bin/exe-review.js +15 -15
  42. package/dist/bin/exe-search.js +7 -7
  43. package/dist/bin/exe-session-cleanup.js +18 -18
  44. package/dist/bin/exe-settings.js +8 -8
  45. package/dist/bin/exe-start-codex.js +13 -13
  46. package/dist/bin/exe-start-opencode.js +10 -10
  47. package/dist/bin/exe-start.sh +29 -7
  48. package/dist/bin/exe-status.js +14 -14
  49. package/dist/bin/exe-support.js +3 -3
  50. package/dist/bin/exe-team.js +5 -5
  51. package/dist/bin/git-sweep.js +14 -14
  52. package/dist/bin/graph-backfill.js +7 -7
  53. package/dist/bin/graph-export.js +7 -7
  54. package/dist/bin/import-history.js +9 -9
  55. package/dist/bin/install-launchd.js +24 -1
  56. package/dist/bin/install.js +36 -12
  57. package/dist/bin/intercom-check.js +4 -4
  58. package/dist/bin/mcp-sessions.js +2 -2
  59. package/dist/bin/orchestration-metrics.js +6 -6
  60. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  61. package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
  62. package/dist/bin/scan-tasks.js +13 -13
  63. package/dist/bin/setup.js +2 -2
  64. package/dist/bin/shard-migrate.js +7 -7
  65. package/dist/bin/stack-update.js +7 -6
  66. package/dist/bin/vps-health-gate.js +1 -1
  67. package/dist/branding-PCLBJ3EP.js +97 -0
  68. package/dist/capability-cards-OEL47N2B.js +88 -0
  69. package/dist/capacity-monitor-UGMHVSUD.js +50 -0
  70. package/dist/catchup-brief-HNEUKB7X.js +174 -0
  71. package/dist/chunk-2F5SG3CE.js +230 -0
  72. package/dist/chunk-2QMWIGJK.js +197 -0
  73. package/dist/chunk-2ZAOSGBX.js +668 -0
  74. package/dist/chunk-32K5NWMR.js +42 -0
  75. package/dist/chunk-32VOJ4GK.js +181 -0
  76. package/dist/chunk-3AUM4JVV.js +127 -0
  77. package/dist/chunk-3Q4UEXDE.js +297 -0
  78. package/dist/chunk-3RZNDPPW.js +2113 -0
  79. package/dist/chunk-3X2ZT5FN.js +3276 -0
  80. package/dist/chunk-44CP7NR2.js +333 -0
  81. package/dist/chunk-4FMNDJMY.js +50 -0
  82. package/dist/chunk-5J2L25OK.js +203 -0
  83. package/dist/chunk-5NQOIKAB.js +214 -0
  84. package/dist/chunk-5P3HOBZX.js +487 -0
  85. package/dist/chunk-5VAARLQR.js +58 -0
  86. package/dist/chunk-64GBV67L.js +1068 -0
  87. package/dist/chunk-6MFM4N37.js +574 -0
  88. package/dist/chunk-6WEETM7D.js +81 -0
  89. package/dist/chunk-6ZD3MW7T.js +97 -0
  90. package/dist/chunk-73ORCJNJ.js +231 -0
  91. package/dist/chunk-75GH76GO.js +129 -0
  92. package/dist/chunk-7CHKD5IP.js +38 -0
  93. package/dist/chunk-7GTKCVVG.js +735 -0
  94. package/dist/chunk-7K4YVOAK.js +76 -0
  95. package/dist/chunk-7LOYIUOF.js +456 -0
  96. package/dist/chunk-7XUJF3LZ.js +284 -0
  97. package/dist/chunk-BJYLTU2G.js +621 -0
  98. package/dist/chunk-BR2OA4AZ.js +123 -0
  99. package/dist/chunk-BTP3LPMP.js +210 -0
  100. package/dist/chunk-BYOEIN37.js +176 -0
  101. package/dist/chunk-CMDKYYFK.js +630 -0
  102. package/dist/chunk-D6LUKYKM.js +731 -0
  103. package/dist/chunk-DFSI6HFJ.js +2078 -0
  104. package/dist/chunk-DJLDKRXK.js +30 -0
  105. package/dist/chunk-EESAZNRC.js +348 -0
  106. package/dist/chunk-EQY6GDVD.js +369 -0
  107. package/dist/chunk-EYLU6MJT.js +192 -0
  108. package/dist/chunk-F23GFLKY.js +4318 -0
  109. package/dist/chunk-F5SADWWW.js +240 -0
  110. package/dist/chunk-FE6HKM2N.js +157 -0
  111. package/dist/chunk-FTG36JG5.js +280 -0
  112. package/dist/chunk-FZDW76SH.js +89 -0
  113. package/dist/chunk-G6GC2YSP.js +262 -0
  114. package/dist/chunk-HH2JVSKL.js +1157 -0
  115. package/dist/chunk-HJQQ7746.js +185 -0
  116. package/dist/chunk-HLFNLJSB.js +271 -0
  117. package/dist/chunk-HX735WX7.js +33 -0
  118. package/dist/chunk-IUQBMSBI.js +1350 -0
  119. package/dist/chunk-J6PDP2GY.js +221 -0
  120. package/dist/chunk-JGOGSH55.js +14378 -0
  121. package/dist/chunk-JRZ47IFL.js +82 -0
  122. package/dist/chunk-JZEROVAU.js +546 -0
  123. package/dist/chunk-KFHAVF6J.js +97 -0
  124. package/dist/chunk-KJALZ6F6.js +128 -0
  125. package/dist/chunk-KMAIBYV3.js +402 -0
  126. package/dist/chunk-KMTNAXIB.js +54 -0
  127. package/dist/chunk-LHW7TZGJ.js +244 -0
  128. package/dist/chunk-LIH36DXG.js +159 -0
  129. package/dist/chunk-M3VHV2RV.js +106 -0
  130. package/dist/chunk-MFTGN7KN.js +411 -0
  131. package/dist/chunk-MUHKJCF7.js +128 -0
  132. package/dist/chunk-NV5SSKZE.js +171 -0
  133. package/dist/chunk-NXJ2CP2C.js +290 -0
  134. package/dist/chunk-OXUHCIGV.js +1352 -0
  135. package/dist/chunk-PNQDP3OA.js +800 -0
  136. package/dist/chunk-PYTSVZWG.js +377 -0
  137. package/dist/chunk-Q2R3WUW4.js +448 -0
  138. package/dist/chunk-QFGJERAP.js +1119 -0
  139. package/dist/chunk-QO7M774X.js +1094 -0
  140. package/dist/chunk-QODXLGH2.js +70 -0
  141. package/dist/chunk-RHC57KVT.js +85 -0
  142. package/dist/chunk-RHE7SHZJ.js +345 -0
  143. package/dist/chunk-RJY45A5J.js +133 -0
  144. package/dist/chunk-RVOPNDGY.js +150 -0
  145. package/dist/chunk-S3QEHFGE.js +373 -0
  146. package/dist/chunk-SCQEAMO3.js +299 -0
  147. package/dist/chunk-SYOGNG2R.js +379 -0
  148. package/dist/chunk-TEOJ63HX.js +362 -0
  149. package/dist/chunk-TMV5LCTC.js +167 -0
  150. package/dist/chunk-TO5ZXGDF.js +190 -0
  151. package/dist/chunk-U5RKF7MQ.js +836 -0
  152. package/dist/chunk-UDMFABWN.js +510 -0
  153. package/dist/chunk-UKS5CXQU.js +382 -0
  154. package/dist/chunk-V2OOLS63.js +41 -0
  155. package/dist/chunk-VBAY3OA7.js +604 -0
  156. package/dist/chunk-VK4KORCQ.js +204 -0
  157. package/dist/chunk-Y4ZA4GCQ.js +85 -0
  158. package/dist/chunk-YMMYZXVZ.js +55 -0
  159. package/dist/chunk-Z5RXZRUC.js +227 -0
  160. package/dist/chunk-ZPILUBWK.js +2142 -0
  161. package/dist/co-activation-WCLF766F.js +73 -0
  162. package/dist/co-occurrence-LPHW6UTZ.js +94 -0
  163. package/dist/code-context-index-QR5PAXM4.js +30 -0
  164. package/dist/conversation-wiki-populator-IMHNWKEU.js +105 -0
  165. package/dist/core-memory-3LSCC75D.js +110 -0
  166. package/dist/crdt-sync-UQ3PXFRB.js +33 -0
  167. package/dist/crm-webhook-VONTDB3M.js +10 -0
  168. package/dist/cto-delegation-gate-B7AKO7FX.js +279 -0
  169. package/dist/daemon-auth-55T2DI6G.js +13 -0
  170. package/dist/daemon-orchestration-ZBDBRKVR.js +138 -0
  171. package/dist/db-backup-LPCCZYIL.js +33 -0
  172. package/dist/db-restore-events-QF3KCGVZ.js +76 -0
  173. package/dist/doc-graph-extractor-IOSZSDDW.js +132 -0
  174. package/dist/dreaming-KA3SN53N.js +33 -0
  175. package/dist/entity-boost-YFIFLE6N.js +375 -0
  176. package/dist/exe-drift-CLJ74KCO.js +69 -0
  177. package/dist/exe-export-QF5V54XC.js +75 -0
  178. package/dist/exe-import-M4VYXCJZ.js +78 -0
  179. package/dist/exe-key-7PDQ72W2.js +580 -0
  180. package/dist/exe-org-VAUMR7TL.js +73 -0
  181. package/dist/exe-snapshot-W5IVP6VF.js +337 -0
  182. package/dist/fast-db-init-MZOQZ2BW.js +7 -0
  183. package/dist/founder-context-QGKRISJH.js +96 -0
  184. package/dist/gateway/index.js +10 -10
  185. package/dist/git-staleness-U7ADZARV.js +111 -0
  186. package/dist/git-task-sweep-T27IFHBH.js +41 -0
  187. package/dist/global-procedures-VJUQAYZ5.js +21 -0
  188. package/dist/graph-auto-extract-ZTZ44VKT.js +182 -0
  189. package/dist/hook-integrity-YPMNLP7B.js +89 -0
  190. package/dist/hooks/bug-report-worker.js +15 -15
  191. package/dist/hooks/codex-stop-task-finalizer.js +15 -15
  192. package/dist/hooks/commit-complete.js +16 -16
  193. package/dist/hooks/error-recall.js +9 -9
  194. package/dist/hooks/exe-heartbeat-hook.js +6 -6
  195. package/dist/hooks/ingest-worker.js +5 -5
  196. package/dist/hooks/ingest.js +13 -13
  197. package/dist/hooks/instructions-loaded.js +7 -7
  198. package/dist/hooks/manifest.json +20 -20
  199. package/dist/hooks/notification.js +7 -7
  200. package/dist/hooks/post-compact.js +15 -15
  201. package/dist/hooks/post-tool-combined.js +7 -7
  202. package/dist/hooks/pre-compact.js +20 -20
  203. package/dist/hooks/pre-tool-use.js +19 -19
  204. package/dist/hooks/prompt-submit.js +27 -27
  205. package/dist/hooks/session-end.js +25 -25
  206. package/dist/hooks/session-start.js +24 -18
  207. package/dist/hooks/stop.js +22 -22
  208. package/dist/hooks/subagent-stop.js +15 -15
  209. package/dist/hooks/summary-worker.js +22 -22
  210. package/dist/index.js +21 -21
  211. package/dist/installer-2MDIUMZS.js +343 -0
  212. package/dist/installer-DS7H47GB.js +297 -0
  213. package/dist/installer-JSUC44TR.js +39 -0
  214. package/dist/key-backup-status-X5CBECJ3.js +39 -0
  215. package/dist/lib/agent-config.js +2 -2
  216. package/dist/lib/cloud-sync.js +7 -7
  217. package/dist/lib/config.js +7 -1
  218. package/dist/lib/consolidation.js +7 -7
  219. package/dist/lib/database.js +4 -4
  220. package/dist/lib/db-daemon-client.js +3 -3
  221. package/dist/lib/db.js +4 -4
  222. package/dist/lib/device-registry.js +1 -1
  223. package/dist/lib/embed-worker.js +18 -7
  224. package/dist/lib/embedder.js +4 -4
  225. package/dist/lib/employee-templates.js +6 -6
  226. package/dist/lib/employees.js +4 -4
  227. package/dist/lib/exe-daemon-client.js +3 -3
  228. package/dist/lib/exe-daemon.js +138 -61
  229. package/dist/lib/hybrid-search.js +7 -7
  230. package/dist/lib/identity-templates.js +1 -1
  231. package/dist/lib/identity.js +4 -4
  232. package/dist/lib/license.js +2 -2
  233. package/dist/lib/messaging.js +13 -13
  234. package/dist/lib/reminders.js +5 -5
  235. package/dist/lib/schedules.js +7 -7
  236. package/dist/lib/session-registry.js +6 -6
  237. package/dist/lib/skill-learning.js +8 -8
  238. package/dist/lib/store.js +6 -6
  239. package/dist/lib/task-router.js +5 -5
  240. package/dist/lib/tasks.js +14 -14
  241. package/dist/lib/tmux-routing.js +12 -12
  242. package/dist/lib/token-spend.js +5 -5
  243. package/dist/lib/ws-client.js +5 -0
  244. package/dist/license-gate-R5EZ7HD3.js +14 -0
  245. package/dist/mcp/register-tools.js +67 -67
  246. package/dist/mcp/server.js +68 -68
  247. package/dist/mcp/tools/complete-reminder.js +6 -6
  248. package/dist/mcp/tools/create-reminder.js +6 -6
  249. package/dist/mcp/tools/create-task.js +16 -16
  250. package/dist/mcp/tools/deactivate-behavior.js +9 -9
  251. package/dist/mcp/tools/list-reminders.js +6 -6
  252. package/dist/mcp/tools/list-tasks.js +16 -16
  253. package/dist/mcp/tools/send-message.js +15 -15
  254. package/dist/mcp/tools/update-task.js +15 -15
  255. package/dist/mcp-http-config-DV6S22TF.js +28 -0
  256. package/dist/memory-cards-AUWC6FN6.js +179 -0
  257. package/dist/memory-graph-extractor-7OWSK2ON.js +21 -0
  258. package/dist/memory-poisoning-defense-TLVXFY43.js +223 -0
  259. package/dist/memory-queue-4QU434ZH.js +19 -0
  260. package/dist/memory-queue-client-6KTL3U3I.js +16 -0
  261. package/dist/memory-reflection-C52FI4W2.js +243 -0
  262. package/dist/message-queue-client-DFXF7LJD.js +92 -0
  263. package/dist/notifications-U3NJYMXX.js +46 -0
  264. package/dist/oauth-server-NR3XEPA4.js +437 -0
  265. package/dist/orchestration-events-TKODYRYP.js +26 -0
  266. package/dist/orchestration-phase-UCTFU32J.js +23 -0
  267. package/dist/orchestrator-GNI5PCA6.js +34 -0
  268. package/dist/pipeline-router-P2QAQHUY.js +14 -0
  269. package/dist/plan-limits-UDKZ2O7W.js +27 -0
  270. package/dist/project-boot-5R3GLCVN.js +299 -0
  271. package/dist/projection-worker-7EWWMJHG.js +1034 -0
  272. package/dist/prospective-memory-7B65EHWB.js +231 -0
  273. package/dist/push-notifications-X7E7GSC7.js +15 -0
  274. package/dist/reranker-EUG4XM44.js +19 -0
  275. package/dist/retrieval-health-WLNAPJCX.js +11 -0
  276. package/dist/review-polling-WHPJUENR.js +125 -0
  277. package/dist/runtime/index.js +15 -15
  278. package/dist/session-events-WMK6FCKZ.js +37 -0
  279. package/dist/session-kill-telemetry-2BU72YXD.js +30 -0
  280. package/dist/session-scope-RYBNHQ43.js +87 -0
  281. package/dist/setup-wizard-NID5EPDN.js +12 -0
  282. package/dist/shard-manager-F3YYEG5S.js +30 -0
  283. package/dist/skill-refinement-KRMGOT5M.js +158 -0
  284. package/dist/stack-update-3LZQWW3G.js +80 -0
  285. package/dist/steward-gate-KC4NOULU.js +14 -0
  286. package/dist/task-enforcement-AI433TPY.js +439 -0
  287. package/dist/task-scope-XRH4KDJB.js +36 -0
  288. package/dist/tasks-crud-2KYGDJG2.js +78 -0
  289. package/dist/tasks-notify-AJSRQHLZ.js +39 -0
  290. package/dist/tasks-review-ISSCHGTG.js +48 -0
  291. package/dist/telemetry-upload-VZ3A6EPD.js +740 -0
  292. package/dist/token-budget-SIXJ7ED5.js +85 -0
  293. package/dist/tool-capability-index-TK5K76RB.js +10 -0
  294. package/dist/tool-telemetry-NTFTPF3L.js +17 -0
  295. package/dist/tui/App.js +25 -25
  296. package/dist/tui-data-2LNENF36.js +259 -0
  297. package/dist/webhook-pipe-VQMOLXMW.js +114 -0
  298. package/dist/wiki-acl-33D5QTU4.js +111 -0
  299. package/dist/wiki-client-XZ6VZTH6.js +157 -0
  300. package/dist/worker-gate-NCEAKLJE.js +21 -0
  301. package/dist/workflow-engine-WFN3HPAZ.js +28 -0
  302. package/dist/worktree-O66YDTSF.js +27 -0
  303. package/dist/worktree-sweep-M2ENRTY6.js +20 -0
  304. package/package.json +1 -1
  305. package/release-notes.json +79 -79
@@ -0,0 +1,244 @@
1
+ import {
2
+ employeeSessionName,
3
+ ensureEmployee,
4
+ markAsReadByTaskFile,
5
+ notifyParentExe,
6
+ resolveExeSession,
7
+ sendIntercom
8
+ } from "./chunk-F23GFLKY.js";
9
+ import {
10
+ getTransport
11
+ } from "./chunk-MVW62NIZ.js";
12
+ import {
13
+ recordOrchestrationEventBestEffort
14
+ } from "./chunk-CMDKYYFK.js";
15
+ import {
16
+ getAgentRuntime
17
+ } from "./chunk-RJY45A5J.js";
18
+ import {
19
+ getSessionKey
20
+ } from "./chunk-CVYC6DUW.js";
21
+ import {
22
+ isCoordinatorName,
23
+ isMultiInstance,
24
+ shouldAutoInstance
25
+ } from "./chunk-3X2ZT5FN.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-RYBNHQ43.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,159 @@
1
+ import {
2
+ EMBEDDING_DIM
3
+ } from "./chunk-FXU7JOXK.js";
4
+
5
+ // src/lib/tool-capability-index.ts
6
+ var ALWAYS_ON = /* @__PURE__ */ new Set([
7
+ "mcp_ping",
8
+ "memory",
9
+ "task",
10
+ "message",
11
+ "identity",
12
+ "diagnostics",
13
+ "session"
14
+ ]);
15
+ function categoryForToolName(toolName, categoryMap) {
16
+ const normalized = toolName.replace(/[_-]/g, "").toLowerCase();
17
+ for (const [registerFn, cat] of Object.entries(categoryMap)) {
18
+ const fnNormalized = registerFn.replace(/^register/, "").toLowerCase();
19
+ if (fnNormalized === normalized) return cat;
20
+ }
21
+ return "unknown";
22
+ }
23
+ function extractParamNames(inputSchema) {
24
+ if (!inputSchema || typeof inputSchema !== "object") return "";
25
+ return Object.keys(inputSchema).join(", ");
26
+ }
27
+ function cosineSimilarity(a, b) {
28
+ if (a.length !== b.length || a.length === 0) return 0;
29
+ let dot = 0, normA = 0, normB = 0;
30
+ for (let i = 0; i < a.length; i++) {
31
+ dot += a[i] * b[i];
32
+ normA += a[i] * a[i];
33
+ normB += b[i] * b[i];
34
+ }
35
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
36
+ return denom === 0 ? 0 : dot / denom;
37
+ }
38
+ function keywordScore(query, tool) {
39
+ const words = query.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
40
+ if (words.length === 0) return 0;
41
+ const searchText = `${tool.name} ${tool.description} ${tool.category} ${tool.paramSummary}`.toLowerCase();
42
+ let matches = 0;
43
+ for (const word of words) {
44
+ if (searchText.includes(word)) matches++;
45
+ }
46
+ return matches / words.length;
47
+ }
48
+ var ToolCapabilityIndex = class {
49
+ capabilities = [];
50
+ initialized = false;
51
+ /**
52
+ * Build the index by intercepting registerAllTools via a fake McpServer.
53
+ *
54
+ * @param registerFn - function that registers tools on a server (e.g. registerAllTools)
55
+ * @param categoryMap - optional map of registerFnName → category (from tool-gates TOOL_CATEGORIES)
56
+ */
57
+ async buildIndex(registerFn, categoryMap, directEmbedFn) {
58
+ const captured = [];
59
+ const fakeServer = {
60
+ registerTool(name, config, _handler) {
61
+ captured.push({
62
+ name,
63
+ description: config.description ?? "",
64
+ inputSchema: config.inputSchema ?? {}
65
+ });
66
+ }
67
+ };
68
+ registerFn(fakeServer);
69
+ const capabilityDocs = [];
70
+ for (const tool of captured) {
71
+ const paramSummary = extractParamNames(tool.inputSchema);
72
+ const category = categoryMap ? categoryForToolName(tool.name, categoryMap) : "unknown";
73
+ const doc = `${tool.name}: ${tool.description}. Parameters: ${paramSummary}`;
74
+ capabilityDocs.push({ name: tool.name, description: tool.description, category, paramSummary, doc });
75
+ }
76
+ let vectors = capabilityDocs.map(() => null);
77
+ try {
78
+ if (directEmbedFn) {
79
+ const allVectors = await directEmbedFn(capabilityDocs.map((c) => c.doc));
80
+ vectors = allVectors.map((v) => v.length === EMBEDDING_DIM ? v : null);
81
+ } else {
82
+ const { embed } = await import("./lib/embedder.js");
83
+ const test = await embed("test");
84
+ if (test.length === EMBEDDING_DIM) {
85
+ for (let i = 0; i < capabilityDocs.length; i++) {
86
+ try {
87
+ vectors[i] = await embed(capabilityDocs[i].doc);
88
+ } catch {
89
+ }
90
+ }
91
+ }
92
+ }
93
+ } catch {
94
+ }
95
+ const capabilities = capabilityDocs.map((c, i) => ({
96
+ name: c.name,
97
+ description: c.description,
98
+ category: c.category,
99
+ vector: vectors[i] ?? null,
100
+ paramSummary: c.paramSummary
101
+ }));
102
+ this.capabilities = capabilities;
103
+ this.initialized = true;
104
+ process.stderr.write(
105
+ `[tool-capability-index] Indexed ${capabilities.length} tools (${capabilities.filter((c) => c.vector).length} with vectors)
106
+ `
107
+ );
108
+ }
109
+ /**
110
+ * Semantic search for tools matching a natural-language query.
111
+ * Returns tools sorted by relevance, with always-on tools boosted.
112
+ */
113
+ async search(query, limit = 20) {
114
+ if (!this.initialized || this.capabilities.length === 0) return [];
115
+ let queryVector = null;
116
+ try {
117
+ const { embed } = await import("./lib/embedder.js");
118
+ queryVector = await embed(query);
119
+ } catch {
120
+ }
121
+ const scored = [];
122
+ for (const tool of this.capabilities) {
123
+ let relevance;
124
+ if (queryVector && tool.vector) {
125
+ const vecScore = cosineSimilarity(queryVector, tool.vector);
126
+ const kwScore = keywordScore(query, tool);
127
+ relevance = vecScore * 0.8 + kwScore * 0.2;
128
+ } else {
129
+ relevance = keywordScore(query, tool);
130
+ }
131
+ if (ALWAYS_ON.has(tool.name)) {
132
+ relevance = Math.max(relevance, 0.5);
133
+ }
134
+ scored.push({ ...tool, relevance });
135
+ }
136
+ scored.sort((a, b) => b.relevance - a.relevance);
137
+ return scored.slice(0, limit);
138
+ }
139
+ /** Whether the index has been built. */
140
+ isReady() {
141
+ return this.initialized;
142
+ }
143
+ /** Total number of indexed tools. */
144
+ get toolCount() {
145
+ return this.capabilities.length;
146
+ }
147
+ };
148
+ var _instance = null;
149
+ function getToolCapabilityIndex() {
150
+ if (!_instance) {
151
+ _instance = new ToolCapabilityIndex();
152
+ }
153
+ return _instance;
154
+ }
155
+
156
+ export {
157
+ ToolCapabilityIndex,
158
+ getToolCapabilityIndex
159
+ };
@@ -0,0 +1,106 @@
1
+ import {
2
+ loadConfig,
3
+ saveConfig
4
+ } from "./chunk-5P3HOBZX.js";
5
+
6
+ // src/lib/orchestration-phase.ts
7
+ var ORCHESTRATION_PHASES = [
8
+ "phase_1_coo",
9
+ "phase_2_executives",
10
+ "phase_3_parallel_org"
11
+ ];
12
+ var PHASE_INFO = {
13
+ phase_1_coo: {
14
+ phase: "phase_1_coo",
15
+ shortLabel: "Phase 1 \u2014 Coordinator mode",
16
+ label: "Phase 1 \u2014 Coordinator / Chief of Staff mode",
17
+ focus: "building company context before delegation",
18
+ nextSuggestion: "Unlock executives when technical, marketing, ops, legal, or finance work repeats."
19
+ },
20
+ phase_2_executives: {
21
+ phase: "phase_2_executives",
22
+ shortLabel: "Phase 2 \u2014 Executive bench",
23
+ label: "Phase 2 \u2014 Executive bench",
24
+ focus: "Coordinator works with domain executives like CTO/CMO before specialist fan-out",
25
+ nextSuggestion: "Unlock parallel execution when review gates, permissions, and workflows are ready."
26
+ },
27
+ phase_3_parallel_org: {
28
+ phase: "phase_3_parallel_org",
29
+ shortLabel: "Phase 3 \u2014 Parallel org",
30
+ label: "Phase 3 \u2014 Parallel execution org",
31
+ focus: "executives can delegate to specialists in parallel with review gates",
32
+ nextSuggestion: "Keep review/CI/permission gates healthy; downgrade anytime if you want simpler coordinator-only mode."
33
+ }
34
+ };
35
+ function normalizeOrchestrationPhase(input) {
36
+ if (typeof input !== "string") return "phase_1_coo";
37
+ const normalized = input.trim().toLowerCase().replace(/\s+/g, "_");
38
+ if (["1", "phase1", "phase_1", "coo", "coo_mode", "chief_of_staff", "phase_1_coo"].includes(normalized)) {
39
+ return "phase_1_coo";
40
+ }
41
+ if (["2", "phase2", "phase_2", "executives", "executive", "executive_bench", "phase_2_executives"].includes(normalized)) {
42
+ return "phase_2_executives";
43
+ }
44
+ if (["3", "phase3", "phase_3", "parallel", "parallel_org", "parallel_execution", "phase_3_parallel_org"].includes(normalized)) {
45
+ return "phase_3_parallel_org";
46
+ }
47
+ if (ORCHESTRATION_PHASES.includes(normalized)) return normalized;
48
+ return "phase_1_coo";
49
+ }
50
+ function getOrchestrationPhaseInfo(phase) {
51
+ return PHASE_INFO[normalizeOrchestrationPhase(phase)];
52
+ }
53
+ function getConfigOrchestrationPhase(config) {
54
+ const orchestration = config.orchestration;
55
+ return normalizeOrchestrationPhase(orchestration?.phase);
56
+ }
57
+ function applyDefaultOrchestrationPhase(config) {
58
+ if (!config.orchestration) {
59
+ config.orchestration = {
60
+ phase: "phase_1_coo",
61
+ phaseSetAt: (/* @__PURE__ */ new Date()).toISOString(),
62
+ phaseSetBy: "setup-default"
63
+ };
64
+ return config;
65
+ }
66
+ if (!config.orchestration.phase) {
67
+ config.orchestration = {
68
+ ...config.orchestration,
69
+ phase: "phase_1_coo",
70
+ phaseSetAt: config.orchestration.phaseSetAt ?? (/* @__PURE__ */ new Date()).toISOString(),
71
+ phaseSetBy: config.orchestration.phaseSetBy ?? "setup-default"
72
+ };
73
+ }
74
+ return config;
75
+ }
76
+ async function loadOrchestrationPhase() {
77
+ const config = await loadConfig();
78
+ return getOrchestrationPhaseInfo(config.orchestration?.phase);
79
+ }
80
+ async function setOrchestrationPhase(phaseInput, setBy = "user") {
81
+ const config = await loadConfig();
82
+ const phase = normalizeOrchestrationPhase(phaseInput);
83
+ config.orchestration = {
84
+ ...config.orchestration ?? {},
85
+ phase,
86
+ phaseSetAt: (/* @__PURE__ */ new Date()).toISOString(),
87
+ phaseSetBy: setBy
88
+ };
89
+ await saveConfig(config);
90
+ return getOrchestrationPhaseInfo(phase);
91
+ }
92
+ function phaseReminderLine(phase) {
93
+ const info = getOrchestrationPhaseInfo(phase);
94
+ return `${info.shortLabel}: ${info.focus}. ${info.nextSuggestion}`;
95
+ }
96
+
97
+ export {
98
+ ORCHESTRATION_PHASES,
99
+ normalizeOrchestrationPhase,
100
+ getOrchestrationPhaseInfo,
101
+ getConfigOrchestrationPhase,
102
+ applyDefaultOrchestrationPhase,
103
+ loadOrchestrationPhase,
104
+ setOrchestrationPhase,
105
+ phaseReminderLine
106
+ };