@askexenow/exe-os 0.9.294 → 0.9.296

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 (279) hide show
  1. package/deploy/compose/cloudflared/config.yml.example +14 -9
  2. package/deploy/compose/docker-compose.yml +86 -8
  3. package/deploy/compose/sso-edge/default.conf.template +87 -0
  4. package/deploy/compose/sso-edge/entrypoint.sh +23 -0
  5. package/deploy/compose/sso-edge/sso-redirect.conf +63 -0
  6. package/deploy/stack-manifests/v0.9.json +2 -2
  7. package/dist/active-agent-AFX2FODG.js +28 -0
  8. package/dist/active-agent-E2IJA7YX.js +27 -0
  9. package/dist/agentic-ontology-A2YUZK5O.js +25 -0
  10. package/dist/assets/com.askexe.exed.plist +4 -1
  11. package/dist/backfill-metadata-OC7EOD5U.js +600 -0
  12. package/dist/behaviors-H5ZOVHDH.js +46 -0
  13. package/dist/bin/agentic-ontology-backfill.js +5 -5
  14. package/dist/bin/agentic-reflection-backfill.js +6 -6
  15. package/dist/bin/agentic-semantic-label.js +5 -5
  16. package/dist/bin/backfill-conversations.js +6 -6
  17. package/dist/bin/backfill-responses.js +6 -6
  18. package/dist/bin/backfill-vectors.js +8 -8
  19. package/dist/bin/bulk-sync-postgres.js +7 -7
  20. package/dist/bin/cc-doctor.js +4 -4
  21. package/dist/bin/cleanup-stale-review-tasks.js +11 -11
  22. package/dist/bin/cli.js +16 -16
  23. package/dist/bin/deferred-daemon-restart.js +1 -1
  24. package/dist/bin/exe-agent-config.js +2 -2
  25. package/dist/bin/exe-agent.js +4 -4
  26. package/dist/bin/exe-assign.js +8 -8
  27. package/dist/bin/exe-boot.js +21 -18
  28. package/dist/bin/exe-call.js +4 -4
  29. package/dist/bin/exe-cloud.js +7 -7
  30. package/dist/bin/exe-dispatch.js +11 -11
  31. package/dist/bin/exe-doctor.js +3 -2
  32. package/dist/bin/exe-export-behaviors.js +7 -7
  33. package/dist/bin/exe-forget.js +6 -6
  34. package/dist/bin/exe-gateway.js +7 -7
  35. package/dist/bin/exe-healthcheck.js +6 -4
  36. package/dist/bin/exe-heartbeat.js +11 -11
  37. package/dist/bin/exe-kill.js +14 -14
  38. package/dist/bin/exe-launch-agent.js +18 -18
  39. package/dist/bin/exe-new-employee.js +6 -6
  40. package/dist/bin/exe-pending-messages.js +12 -12
  41. package/dist/bin/exe-pending-notifications.js +11 -11
  42. package/dist/bin/exe-pending-reviews.js +11 -11
  43. package/dist/bin/exe-rename.js +4 -4
  44. package/dist/bin/exe-review.js +13 -13
  45. package/dist/bin/exe-search.js +5 -5
  46. package/dist/bin/exe-session-cleanup.js +16 -16
  47. package/dist/bin/exe-settings.js +39 -9
  48. package/dist/bin/exe-start-codex.js +11 -11
  49. package/dist/bin/exe-start-opencode.js +8 -8
  50. package/dist/bin/exe-status.js +12 -12
  51. package/dist/bin/exe-team.js +3 -3
  52. package/dist/bin/git-sweep.js +12 -12
  53. package/dist/bin/graph-backfill.js +4 -4
  54. package/dist/bin/graph-export.js +5 -5
  55. package/dist/bin/import-history.js +7 -7
  56. package/dist/bin/install-launchd.js +13 -6
  57. package/dist/bin/install.js +26 -14
  58. package/dist/bin/intercom-check.js +4 -4
  59. package/dist/bin/mcp-sessions.js +2 -2
  60. package/dist/bin/orchestration-metrics.js +4 -4
  61. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  62. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  63. package/dist/bin/scan-tasks.js +11 -11
  64. package/dist/bin/setup.js +1 -1
  65. package/dist/bin/shard-migrate.js +4 -4
  66. package/dist/bin/stack-update.js +2 -2
  67. package/dist/bin/vps-health-gate.js +1 -1
  68. package/dist/capability-cards-4USI7CUW.js +89 -0
  69. package/dist/capacity-monitor-WLCBTEYR.js +51 -0
  70. package/dist/catchup-brief-ZR3NX6LZ.js +175 -0
  71. package/dist/chunk-22TVSRQQ.js +226 -0
  72. package/dist/chunk-2E43UXRH.js +395 -0
  73. package/dist/chunk-2PIGT6UJ.js +460 -0
  74. package/dist/chunk-3XTMW2MZ.js +535 -0
  75. package/dist/chunk-465PQFTH.js +262 -0
  76. package/dist/chunk-5CCXU2AW.js +129 -0
  77. package/dist/chunk-5D6MPWR7.js +1094 -0
  78. package/dist/chunk-5Q4MR6SL.js +123 -0
  79. package/dist/chunk-6327RBWR.js +345 -0
  80. package/dist/chunk-6MZZREZY.js +199 -0
  81. package/dist/chunk-7DI2Q4O5.js +1186 -0
  82. package/dist/chunk-7PW5VNIY.js +122 -0
  83. package/dist/chunk-7T7Y56HW.js +43 -0
  84. package/dist/chunk-7UHCWCLT.js +128 -0
  85. package/dist/chunk-A2ZUMF6L.js +1350 -0
  86. package/dist/chunk-AKV44JEH.js +185 -0
  87. package/dist/chunk-ANHWGX5N.js +735 -0
  88. package/dist/chunk-BQ3P4TKD.js +97 -0
  89. package/dist/chunk-BUZMT3KZ.js +604 -0
  90. package/dist/chunk-C2SBESBO.js +210 -0
  91. package/dist/chunk-CLSXZUZW.js +51 -0
  92. package/dist/chunk-CONHLVAR.js +1079 -0
  93. package/dist/chunk-D3WTZPFX.js +456 -0
  94. package/dist/chunk-DE6SOIYL.js +197 -0
  95. package/dist/chunk-EIVNMA3Q.js +284 -0
  96. package/dist/chunk-EJIF4FNT.js +12 -0
  97. package/dist/chunk-FDFOW564.js +171 -0
  98. package/dist/chunk-GZUBJ5EC.js +127 -0
  99. package/dist/chunk-HGZITN22.js +105 -0
  100. package/dist/chunk-HSRKDU6X.js +362 -0
  101. package/dist/chunk-IIEN2PHV.js +85 -0
  102. package/dist/chunk-JQ56VLMM.js +567 -0
  103. package/dist/chunk-JVHHXRFY.js +280 -0
  104. package/dist/chunk-JXCXGZ3S.js +55 -0
  105. package/dist/chunk-K5ZO532Q.js +4388 -0
  106. package/dist/chunk-K6CAAMXF.js +97 -0
  107. package/dist/chunk-KA26YTNU.js +81 -0
  108. package/dist/chunk-KMUW5C3R.js +381 -0
  109. package/dist/chunk-KOO3J5PV.js +20 -0
  110. package/dist/chunk-LSV7OFIH.js +290 -0
  111. package/dist/chunk-LSVFDVNY.js +1158 -0
  112. package/dist/chunk-LXDQTW32.js +230 -0
  113. package/dist/chunk-MEP7OUVZ.js +181 -0
  114. package/dist/chunk-MN2B2LKS.js +240 -0
  115. package/dist/chunk-N2EAYPYQ.js +1352 -0
  116. package/dist/chunk-N7I2A667.js +70 -0
  117. package/dist/chunk-NLZHVIOP.js +630 -0
  118. package/dist/chunk-NUH5TRZL.js +227 -0
  119. package/dist/chunk-OAHEIH3G.js +167 -0
  120. package/dist/chunk-OBHRQGCK.js +58 -0
  121. package/dist/chunk-ODFA7B2V.js +54 -0
  122. package/dist/chunk-OSNUP45F.js +731 -0
  123. package/dist/chunk-OTPRHBTO.js +33 -0
  124. package/dist/chunk-P6MUA4QU.js +157 -0
  125. package/dist/chunk-PGIOFKSK.js +2093 -0
  126. package/dist/chunk-PSE7VHWK.js +50 -0
  127. package/dist/chunk-QIFUVZFW.js +331 -0
  128. package/dist/chunk-RDPXKTVK.js +221 -0
  129. package/dist/chunk-RKYTYJGB.js +76 -0
  130. package/dist/chunk-RXLR6EFM.js +348 -0
  131. package/dist/chunk-SDB67PQJ.js +159 -0
  132. package/dist/chunk-SF2T7MP3.js +402 -0
  133. package/dist/chunk-SLU3FRFQ.js +2133 -0
  134. package/dist/chunk-SNDZJ5IV.js +214 -0
  135. package/dist/chunk-STEEAABW.js +448 -0
  136. package/dist/chunk-TUTWNHIQ.js +244 -0
  137. package/dist/chunk-UDP35QBR.js +30 -0
  138. package/dist/chunk-UKFHNJBI.js +85 -0
  139. package/dist/chunk-VC2DTK2X.js +382 -0
  140. package/dist/chunk-VRRAE5JX.js +836 -0
  141. package/dist/chunk-VVJTBQPR.js +38 -0
  142. package/dist/chunk-W3EQ362K.js +581 -0
  143. package/dist/chunk-WHIXIFHC.js +2242 -0
  144. package/dist/chunk-WRNGJJNR.js +377 -0
  145. package/dist/chunk-WUKHLCBE.js +3313 -0
  146. package/dist/chunk-WVPLHGDG.js +150 -0
  147. package/dist/chunk-XJZBSTL5.js +204 -0
  148. package/dist/chunk-Y3PMNUM5.js +304 -0
  149. package/dist/chunk-YHVS4QOV.js +14597 -0
  150. package/dist/chunk-YJ2OYAOC.js +668 -0
  151. package/dist/chunk-YYAD2GXX.js +128 -0
  152. package/dist/chunk-ZQML7EWE.js +333 -0
  153. package/dist/co-activation-XJLH46OX.js +74 -0
  154. package/dist/co-occurrence-GNN2X526.js +95 -0
  155. package/dist/code-context-index-OCPRLFG5.js +30 -0
  156. package/dist/core-memory-J4W2IYOF.js +110 -0
  157. package/dist/crdt-sync-QCBTSHIH.js +33 -0
  158. package/dist/crm-webhook-EM442VUW.js +10 -0
  159. package/dist/cto-delegation-gate-MLJMVHBK.js +280 -0
  160. package/dist/daemon-orchestration-2VNLZVTW.js +139 -0
  161. package/dist/db-backup-VUGFTPJ4.js +43 -0
  162. package/dist/doc-graph-extractor-PNRSFPSS.js +133 -0
  163. package/dist/dreaming-SK5VEQRF.js +34 -0
  164. package/dist/entity-boost-TQWWJUC2.js +375 -0
  165. package/dist/exe-drift-N34UPO7S.js +70 -0
  166. package/dist/exe-export-KACBKGVV.js +77 -0
  167. package/dist/exe-import-GXGDWACG.js +80 -0
  168. package/dist/exe-key-XPDOZBWW.js +673 -0
  169. package/dist/exe-snapshot-32GQKGQ5.js +338 -0
  170. package/dist/fast-db-init-F3TDD5VV.js +7 -0
  171. package/dist/gateway/index.js +8 -8
  172. package/dist/git-staleness-J45WNYRF.js +112 -0
  173. package/dist/git-task-sweep-BTGVQPFB.js +42 -0
  174. package/dist/global-procedures-6JCQWU4D.js +22 -0
  175. package/dist/graph-auto-extract-3ZQNXTPC.js +183 -0
  176. package/dist/hooks/bug-report-worker.js +13 -13
  177. package/dist/hooks/codex-stop-task-finalizer.js +13 -13
  178. package/dist/hooks/commit-complete.js +13 -13
  179. package/dist/hooks/error-recall.js +6 -6
  180. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  181. package/dist/hooks/ingest-worker.js +3 -3
  182. package/dist/hooks/ingest.js +6 -6
  183. package/dist/hooks/instructions-loaded.js +4 -4
  184. package/dist/hooks/manifest.json +20 -20
  185. package/dist/hooks/notification.js +4 -4
  186. package/dist/hooks/post-compact.js +12 -12
  187. package/dist/hooks/post-tool-combined.js +6 -6
  188. package/dist/hooks/pre-compact.js +16 -16
  189. package/dist/hooks/pre-tool-use.js +16 -16
  190. package/dist/hooks/prompt-submit.js +24 -24
  191. package/dist/hooks/session-end.js +21 -21
  192. package/dist/hooks/session-start.js +12 -12
  193. package/dist/hooks/stop.js +19 -19
  194. package/dist/hooks/subagent-stop.js +12 -12
  195. package/dist/hooks/summary-worker.js +19 -19
  196. package/dist/index.js +19 -19
  197. package/dist/installer-5VPFY7SB.js +298 -0
  198. package/dist/installer-OENFPMA2.js +344 -0
  199. package/dist/installer-OIX4QOG5.js +40 -0
  200. package/dist/lib/cloud-sync.js +7 -7
  201. package/dist/lib/consolidation.js +6 -5
  202. package/dist/lib/database.js +2 -2
  203. package/dist/lib/db-daemon-client.js +2 -2
  204. package/dist/lib/db.js +2 -2
  205. package/dist/lib/embed-worker.js +1 -0
  206. package/dist/lib/embedder.js +7 -3
  207. package/dist/lib/employee-templates.js +4 -4
  208. package/dist/lib/employees.js +2 -2
  209. package/dist/lib/exe-daemon-client.js +2 -2
  210. package/dist/lib/exe-daemon.js +160 -79
  211. package/dist/lib/hybrid-search.js +5 -5
  212. package/dist/lib/identity.js +2 -2
  213. package/dist/lib/messaging.js +11 -11
  214. package/dist/lib/reminders.js +3 -3
  215. package/dist/lib/schedules.js +5 -5
  216. package/dist/lib/session-registry.js +4 -4
  217. package/dist/lib/skill-learning.js +6 -6
  218. package/dist/lib/store.js +4 -4
  219. package/dist/lib/task-router.js +3 -3
  220. package/dist/lib/tasks.js +12 -12
  221. package/dist/lib/tmux-routing.js +12 -10
  222. package/dist/lib/tmux-transport.js +1 -1
  223. package/dist/lib/token-spend.js +3 -3
  224. package/dist/lib/transport.js +2 -2
  225. package/dist/mcp/register-tools.js +62 -61
  226. package/dist/mcp/server.js +63 -62
  227. package/dist/mcp/tools/complete-reminder.js +4 -4
  228. package/dist/mcp/tools/create-reminder.js +4 -4
  229. package/dist/mcp/tools/create-task.js +14 -14
  230. package/dist/mcp/tools/deactivate-behavior.js +7 -7
  231. package/dist/mcp/tools/list-reminders.js +4 -4
  232. package/dist/mcp/tools/list-tasks.js +14 -14
  233. package/dist/mcp/tools/send-message.js +13 -13
  234. package/dist/mcp/tools/update-task.js +13 -13
  235. package/dist/mcp-http-config-PQTOLCTP.js +29 -0
  236. package/dist/memory-cards-4RVDZIY2.js +180 -0
  237. package/dist/memory-graph-extractor-L6YC7G4M.js +22 -0
  238. package/dist/memory-poisoning-defense-4YVJYH4G.js +224 -0
  239. package/dist/memory-queue-client-MVAUOZNJ.js +16 -0
  240. package/dist/memory-reflection-SHHDQNOH.js +244 -0
  241. package/dist/message-queue-client-DCKZT6X2.js +92 -0
  242. package/dist/notifications-JFR3G42W.js +47 -0
  243. package/dist/orchestration-events-MGCGPTDN.js +27 -0
  244. package/dist/orchestrator-DAFL2YZB.js +35 -0
  245. package/dist/pipeline-router-WWSZVPCH.js +15 -0
  246. package/dist/plan-limits-C7XCSDZC.js +28 -0
  247. package/dist/project-boot-N3NTBVLE.js +299 -0
  248. package/dist/projection-worker-MTPAPCWX.js +1084 -0
  249. package/dist/prospective-memory-BTIVUJSB.js +232 -0
  250. package/dist/reranker-UA6WVESJ.js +19 -0
  251. package/dist/retrieval-health-7XNZJEBF.js +12 -0
  252. package/dist/review-polling-4ALGMXC3.js +126 -0
  253. package/dist/runtime/index.js +13 -13
  254. package/dist/self-query-router-MROFQLQB.js +192 -0
  255. package/dist/session-events-CK44XOU4.js +38 -0
  256. package/dist/session-kill-telemetry-MT6ITDOG.js +31 -0
  257. package/dist/session-scope-3XDBWV65.js +88 -0
  258. package/dist/setup-wizard-X6DOD7MC.js +12 -0
  259. package/dist/skill-refinement-G2CCY3GM.js +159 -0
  260. package/dist/stack-update-JF7F56AS.js +84 -0
  261. package/dist/steward-gate-YF2CYXE7.js +15 -0
  262. package/dist/task-enforcement-YN6HK7NE.js +506 -0
  263. package/dist/task-scope-CVK6ISCZ.js +37 -0
  264. package/dist/tasks-crud-NTNET4JE.js +79 -0
  265. package/dist/tasks-notify-4LJVFPCV.js +40 -0
  266. package/dist/tasks-review-3V4WOIRG.js +49 -0
  267. package/dist/telemetry-upload-5PNUKGTM.js +741 -0
  268. package/dist/token-budget-E46G7ZAQ.js +86 -0
  269. package/dist/tool-capability-index-JDSMKJER.js +10 -0
  270. package/dist/tool-telemetry-J3NLS3LJ.js +17 -0
  271. package/dist/tui/App.js +18 -18
  272. package/dist/tui-data-6DOMUUCM.js +260 -0
  273. package/dist/wiki-acl-5UK37LKF.js +111 -0
  274. package/dist/worker-gate-FM7AEC7G.js +21 -0
  275. package/dist/workflow-engine-2EDUHUIY.js +28 -0
  276. package/dist/worktree-7YKKJIYR.js +28 -0
  277. package/dist/worktree-sweep-C3ELFGDN.js +21 -0
  278. package/package.json +1 -1
  279. package/release-notes.json +88 -88
@@ -0,0 +1,122 @@
1
+ import {
2
+ getActiveAgent
3
+ } from "./chunk-AKV44JEH.js";
4
+ import {
5
+ listTasks
6
+ } from "./chunk-K5ZO532Q.js";
7
+ import {
8
+ getAgentContext
9
+ } from "./chunk-GJV3WDWM.js";
10
+ import {
11
+ isCoordinatorName
12
+ } from "./chunk-WUKHLCBE.js";
13
+
14
+ // src/mcp/tools/list-tasks.ts
15
+ import { z } from "zod";
16
+ function registerListTasks(server) {
17
+ server.registerTool(
18
+ "list_tasks",
19
+ {
20
+ title: "List Tasks",
21
+ description: "Query tasks by assignee, status, project, or priority. Defaults to current project. Pass project_name='all' for all projects. When querying your own tasks, project filter is skipped automatically.",
22
+ inputSchema: {
23
+ assigned_to: z.string().optional().describe("Filter by employee name"),
24
+ status: z.enum(["open", "in_progress", "done", "needs_review", "blocked", "cancelled", "closed"]).optional().describe("Filter by status. Default: active tasks only (excludes closed/cancelled)"),
25
+ project_name: z.string().optional().describe("Project name. Defaults to current project. Pass 'all' for all projects."),
26
+ priority: z.enum(["p0", "p1", "p2"]).optional().describe("Filter by priority"),
27
+ cross_session: z.boolean().optional().describe("When true, return tasks from ALL coordinator sessions (read-only). Default: false.")
28
+ }
29
+ },
30
+ async ({ assigned_to, status, project_name, priority, cross_session }) => {
31
+ try {
32
+ const { agentId } = getActiveAgent();
33
+ const isReviewQueue = status === "needs_review";
34
+ const shouldDefaultToOwnQueue = !assigned_to && !isReviewQueue && !isCoordinatorName(agentId);
35
+ const effectiveAssignedTo = assigned_to ?? (shouldDefaultToOwnQueue ? agentId : void 0);
36
+ const effectiveReviewer = !assigned_to && isReviewQueue ? agentId : void 0;
37
+ const isOwnQuery = effectiveAssignedTo === agentId;
38
+ const callerSession = getAgentContext()?.sessionHint || process.env.EXE_SESSION_NAME || process.env.EXE_SESSION || null;
39
+ const resolvedProject = project_name && project_name !== "all" ? project_name : null;
40
+ const effectiveCrossSession = cross_session === true;
41
+ const identityAmbiguous = !callerSession && (agentId === "default" || !agentId);
42
+ let tasks = await listTasks({
43
+ assignedTo: effectiveAssignedTo,
44
+ reviewer: effectiveReviewer,
45
+ status,
46
+ projectName: resolvedProject,
47
+ priority,
48
+ crossSession: effectiveCrossSession,
49
+ isOwnQuery: !!isOwnQuery,
50
+ callerSession
51
+ });
52
+ let recoveredCrossSession = false;
53
+ if (tasks.length === 0 && identityAmbiguous && !effectiveCrossSession) {
54
+ const crossTasks = await listTasks({
55
+ // Drop the own-queue assignee default — identity is unreliable here.
56
+ assignedTo: assigned_to,
57
+ reviewer: effectiveReviewer,
58
+ status,
59
+ projectName: resolvedProject,
60
+ priority,
61
+ crossSession: true,
62
+ isOwnQuery: false,
63
+ callerSession: null
64
+ });
65
+ if (crossTasks.length > 0) {
66
+ tasks = crossTasks;
67
+ recoveredCrossSession = true;
68
+ }
69
+ }
70
+ if (tasks.length === 0) {
71
+ if (identityAmbiguous) {
72
+ return {
73
+ content: [
74
+ {
75
+ type: "text",
76
+ text: "Could not resolve your session identity (multiple coordinator sessions are live and no per-session MCP header was provided). Task scoping is unreliable, and a cross-session read also returned no rows. If you expect tasks to exist, retry with cross_session=true and an explicit project_name='all', or configure a per-session MCP header (X-Exe-Session). Treat this as 'unknown', NOT 'empty'."
77
+ }
78
+ ],
79
+ isError: true
80
+ };
81
+ }
82
+ return {
83
+ content: [{ type: "text", text: "No tasks found." }]
84
+ };
85
+ }
86
+ const lines = tasks.map((t) => {
87
+ const cpIndicator = t.checkpointCount && t.checkpointCount > 0 ? ` [cp:${t.checkpointCount}]` : "";
88
+ let budgetNote = "";
89
+ if (t.budgetTokens !== null) {
90
+ const pct = Math.round(t.tokensUsed / t.budgetTokens * 100);
91
+ budgetNote = ` [${t.tokensUsed}/${t.budgetTokens} tokens, ${pct}%]`;
92
+ }
93
+ const shortId = t.id.slice(0, 8);
94
+ const showSession = cross_session || recoveredCrossSession;
95
+ const sessionNote = showSession && t.sessionScope ? ` [session:${t.sessionScope}]` : "";
96
+ return `- [${t.priority.toUpperCase()}] ${t.title} (${t.projectName}) \u2014 ${t.status}${cpIndicator}${budgetNote}${sessionNote} \u2192 ${t.assignedTo} [id:${shortId}]`;
97
+ });
98
+ const header = recoveredCrossSession ? `WARNING: session identity was ambiguous (multiple coordinator sessions, no per-session MCP header) \u2014 showing tasks ACROSS ALL sessions. Configure a per-session X-Exe-Session header for scoped results.
99
+ ${tasks.length} task(s) (cross-session):` : `${tasks.length} task(s):`;
100
+ return {
101
+ content: [
102
+ {
103
+ type: "text",
104
+ text: `${header}
105
+ ${lines.join("\n")}`
106
+ }
107
+ ]
108
+ };
109
+ } catch (err) {
110
+ const msg = err instanceof Error ? err.message : String(err);
111
+ return {
112
+ content: [{ type: "text", text: `Failed to list tasks: ${msg}` }],
113
+ isError: true
114
+ };
115
+ }
116
+ }
117
+ );
118
+ }
119
+
120
+ export {
121
+ registerListTasks
122
+ };
@@ -0,0 +1,43 @@
1
+ // src/lib/daemon-heap.ts
2
+ function computeDaemonHeapCapMb(_totalGb) {
3
+ return 2048;
4
+ }
5
+ var HEAP_FLAG_RE = /^--(max[-_]old[-_]space[-_]size|max[-_]semi[-_]space[-_]size|max[-_]heap[-_]size)(=|$)/i;
6
+ var EMBED_WORKER_DEFAULT_HEAP_MB = 6144;
7
+ var EMBED_WORKER_MIN_HEAP_MB = 3072;
8
+ var EMBED_WORKER_RSS_HEADROOM_MB = 2048;
9
+ var EMBED_WORKER_RSS_KILL_FLOOR_MB = 8192;
10
+ function resolveEmbedWorkerRssKillMb(envValue, heapMb) {
11
+ const heap = Number.isFinite(heapMb) && heapMb > 0 ? heapMb : EMBED_WORKER_DEFAULT_HEAP_MB;
12
+ const safeDefault = Math.max(heap + EMBED_WORKER_RSS_HEADROOM_MB, EMBED_WORKER_RSS_KILL_FLOOR_MB);
13
+ const raw = parseInt(envValue ?? "", 10);
14
+ if (Number.isFinite(raw) && raw > heap + EMBED_WORKER_RSS_HEADROOM_MB) return raw;
15
+ return safeDefault;
16
+ }
17
+ var EMBED_MAX_RESPAWNS = 3;
18
+ var EMBED_BACKOFF_BASE_MS = 1e4;
19
+ var EMBED_BACKOFF_MAX_MS = 6e4;
20
+ function resolveEmbedWorkerHeapMb(envValue) {
21
+ const raw = parseInt(envValue ?? "", 10);
22
+ return Number.isFinite(raw) && raw >= EMBED_WORKER_MIN_HEAP_MB ? raw : EMBED_WORKER_DEFAULT_HEAP_MB;
23
+ }
24
+ function buildEmbedWorkerExecArgv(parentExecArgv, heapMb) {
25
+ return [
26
+ ...parentExecArgv.filter((a) => !HEAP_FLAG_RE.test(a)),
27
+ `--max-old-space-size=${heapMb}`
28
+ ];
29
+ }
30
+ function computeEmbedRespawnDelayMs(respawnCount) {
31
+ if (respawnCount > EMBED_MAX_RESPAWNS) return null;
32
+ return Math.min(EMBED_BACKOFF_BASE_MS * 2 ** (respawnCount - 1), EMBED_BACKOFF_MAX_MS);
33
+ }
34
+
35
+ export {
36
+ computeDaemonHeapCapMb,
37
+ HEAP_FLAG_RE,
38
+ resolveEmbedWorkerRssKillMb,
39
+ EMBED_MAX_RESPAWNS,
40
+ resolveEmbedWorkerHeapMb,
41
+ buildEmbedWorkerExecArgv,
42
+ computeEmbedRespawnDelayMs
43
+ };
@@ -0,0 +1,128 @@
1
+ // src/lib/tool-telemetry.ts
2
+ var _toolCalls = /* @__PURE__ */ new Map();
3
+ var _sessionStartedAt = Date.now();
4
+ var _flushTimer = null;
5
+ function recordCall(toolName, action, isError) {
6
+ let record = _toolCalls.get(toolName);
7
+ if (!record) {
8
+ record = { count: 0, actions: /* @__PURE__ */ new Map(), lastCalledAt: 0, errors: 0 };
9
+ _toolCalls.set(toolName, record);
10
+ }
11
+ record.count++;
12
+ record.lastCalledAt = Date.now();
13
+ if (isError) record.errors++;
14
+ if (action) {
15
+ record.actions.set(action, (record.actions.get(action) ?? 0) + 1);
16
+ }
17
+ }
18
+ function wrapServerWithTelemetry(server) {
19
+ const originalRegisterTool = server.registerTool.bind(server);
20
+ server.registerTool = (name, config, handler) => {
21
+ const wrappedHandler = async (input, extra) => {
22
+ const action = input.action;
23
+ try {
24
+ const result = await handler(input, extra);
25
+ const isError = result?.isError === true;
26
+ recordCall(name, action, isError);
27
+ return result;
28
+ } catch (err) {
29
+ recordCall(name, action, true);
30
+ throw err;
31
+ }
32
+ };
33
+ return originalRegisterTool(name, config, wrappedHandler);
34
+ };
35
+ return server;
36
+ }
37
+ function getToolUsageStats() {
38
+ let totalCalls = 0;
39
+ let totalErrors = 0;
40
+ const tools = {};
41
+ for (const [name, record] of _toolCalls) {
42
+ totalCalls += record.count;
43
+ totalErrors += record.errors;
44
+ const entry = {
45
+ calls: record.count,
46
+ errors: record.errors,
47
+ lastCalledAt: new Date(record.lastCalledAt).toISOString()
48
+ };
49
+ if (record.actions.size > 0) {
50
+ entry.actions = Object.fromEntries(record.actions);
51
+ }
52
+ tools[name] = entry;
53
+ }
54
+ return {
55
+ sessionStartedAt: new Date(_sessionStartedAt).toISOString(),
56
+ uptimeMs: Date.now() - _sessionStartedAt,
57
+ totalCalls,
58
+ totalErrors,
59
+ tools
60
+ };
61
+ }
62
+ function resetToolUsageStats() {
63
+ _toolCalls.clear();
64
+ _sessionStartedAt = Date.now();
65
+ }
66
+ var FLUSH_INTERVAL_MS = 5 * 60 * 1e3;
67
+ var _lastFlushedAt = 0;
68
+ async function flushToMemory() {
69
+ const stats = getToolUsageStats();
70
+ if (stats.totalCalls === 0) return;
71
+ if (stats.totalCalls === _lastFlushedAt) return;
72
+ try {
73
+ const { getClient, isInitialized } = await import("./lib/database.js");
74
+ if (!isInitialized()) return;
75
+ const client = getClient();
76
+ const toolSummary = Object.entries(stats.tools).sort((a, b) => b[1].calls - a[1].calls).map(([name, t]) => {
77
+ const actionStr = t.actions ? ` (${Object.entries(t.actions).sort((a, b) => b[1] - a[1]).map(([a, c]) => `${a}:${c}`).join(", ")})` : "";
78
+ return `${name}: ${t.calls} calls${t.errors > 0 ? ` (${t.errors} errors)` : ""}${actionStr}`;
79
+ }).join("\n");
80
+ const raw_text = `Tool usage since ${stats.sessionStartedAt} (${Math.round(stats.uptimeMs / 6e4)}min):
81
+ Total: ${stats.totalCalls} calls, ${stats.totalErrors} errors
82
+
83
+ ${toolSummary}`;
84
+ await client.execute({
85
+ sql: `INSERT INTO memories (id, agent_id, raw_text, memory_type, project_name, importance, created_at, updated_at, session_scope)
86
+ VALUES (?, 'system', ?, 'telemetry', 'exe-os', 2, datetime('now'), datetime('now'), NULL)`,
87
+ args: [
88
+ `telemetry-tools-${Date.now()}`,
89
+ raw_text
90
+ ]
91
+ });
92
+ _lastFlushedAt = stats.totalCalls;
93
+ } catch {
94
+ }
95
+ }
96
+ function startToolTelemetryFlush() {
97
+ if (_flushTimer) return;
98
+ _sessionStartedAt = Date.now();
99
+ _flushTimer = setInterval(() => void flushToMemory(), FLUSH_INTERVAL_MS);
100
+ _flushTimer.unref();
101
+ }
102
+ async function stopToolTelemetryFlush() {
103
+ if (_flushTimer) {
104
+ clearInterval(_flushTimer);
105
+ _flushTimer = null;
106
+ }
107
+ await flushToMemory();
108
+ }
109
+ function getToolUsageSummary() {
110
+ const summary = {};
111
+ for (const [tool, record] of _toolCalls) {
112
+ summary[tool] = {
113
+ count: record.count,
114
+ errors: record.errors,
115
+ actions: Object.fromEntries(record.actions)
116
+ };
117
+ }
118
+ return summary;
119
+ }
120
+
121
+ export {
122
+ wrapServerWithTelemetry,
123
+ getToolUsageStats,
124
+ resetToolUsageStats,
125
+ startToolTelemetryFlush,
126
+ stopToolTelemetryFlush,
127
+ getToolUsageSummary
128
+ };