@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,262 @@
1
+ // src/lib/agentic-ontology.ts
2
+ import { createHash } from "crypto";
3
+ function stableId(...parts) {
4
+ return createHash("sha256").update(parts.map((p) => String(p ?? "")).join("::")).digest("hex").slice(0, 32);
5
+ }
6
+ function clean(text, max = 240) {
7
+ return text.replace(/\u0000/g, "").replace(/```[\s\S]*?```/g, " ").replace(/\s+/g, " ").trim().slice(0, max);
8
+ }
9
+ function inferOntologyEventType(row) {
10
+ const lower = row.raw_text.toLowerCase();
11
+ if (row.has_error) return "error";
12
+ if (/\b(done|complete|completed|fixed|resolved|shipped|deployed|pushed|published)\b/.test(lower)) return "milestone";
13
+ if (/\b(blocked|failed|error|bug|regression|broken)\b/.test(lower)) return "problem";
14
+ if (/\b(decided|decision|adr|we chose|approved|rejected)\b/.test(lower)) return "decision";
15
+ if (/\b(goal|need to|we need|want to|trying to|objective)\b/.test(lower)) return "goal_signal";
16
+ if (["Bash", "Read", "Edit", "Write", "Grep", "Glob"].includes(row.tool_name)) return "tool_action";
17
+ if (row.tool_name.startsWith("memory_card")) return "memory_card";
18
+ return "memory_observation";
19
+ }
20
+ function inferIntention(row) {
21
+ if (row.intent) return clean(row.intent, 220);
22
+ const text = clean(row.raw_text, 1e3);
23
+ const patterns = [
24
+ /(?:we need to|need to|let'?s|i want to|we should|goal is to|objective is to|trying to)\s+([^.!?\n]{8,220})/i,
25
+ /(?:so that|in order to)\s+([^.!?\n]{8,220})/i,
26
+ /(?:task|plan):\s*([^.!?\n]{8,220})/i
27
+ ];
28
+ for (const p of patterns) {
29
+ const m = text.match(p);
30
+ if (m?.[1]) return clean(m[1], 220);
31
+ }
32
+ if (["Bash", "Read", "Edit", "Write", "Grep", "Glob"].includes(row.tool_name)) {
33
+ return `${row.tool_name} during ${row.project_name}`;
34
+ }
35
+ return null;
36
+ }
37
+ function inferOutcome(row) {
38
+ if (row.outcome) return clean(row.outcome, 220);
39
+ if (row.has_error) return "error";
40
+ const lower = row.raw_text.toLowerCase();
41
+ if (/\b(done|complete|completed|fixed|resolved|shipped|deployed|pushed|published|passed)\b/.test(lower)) return "success_signal";
42
+ if (/\b(blocked|failed|error|regression|broken|not working|could not)\b/.test(lower)) return "failure_signal";
43
+ if (/\b(warning|risk|concern|caveat)\b/.test(lower)) return "risk_signal";
44
+ return null;
45
+ }
46
+ function extractGoalCandidates(row) {
47
+ const text = clean(row.raw_text, 1600);
48
+ const patterns = [
49
+ /(?:we need to|need to|i want to|we should|goal is to|objective is to|trying to|let'?s)\s+([^.!?\n]{12,220})/gi,
50
+ /(?:success means|success criteria|so that)\s+([^.!?\n]{12,220})/gi
51
+ ];
52
+ const out = [];
53
+ for (const pattern of patterns) {
54
+ for (const m of text.matchAll(pattern)) {
55
+ const candidate = clean(m[1] ?? "", 220);
56
+ if (candidate.length >= 12 && !out.some((x) => x.toLowerCase() === candidate.toLowerCase())) out.push(candidate);
57
+ if (out.length >= 3) return out;
58
+ }
59
+ }
60
+ return out;
61
+ }
62
+ function uniq(values, max = 6) {
63
+ const out = [];
64
+ for (const value of values.map((v) => clean(v, 220)).filter(Boolean)) {
65
+ if (!out.some((x) => x.toLowerCase() === value.toLowerCase())) out.push(value);
66
+ if (out.length >= max) break;
67
+ }
68
+ return out;
69
+ }
70
+ function extractMatches(text, patterns, max = 5) {
71
+ const out = [];
72
+ for (const pattern of patterns) {
73
+ for (const match of text.matchAll(pattern)) {
74
+ const value = match[1] ?? match[0];
75
+ if (value) out.push(value);
76
+ if (out.length >= max) return uniq(out, max);
77
+ }
78
+ }
79
+ return uniq(out, max);
80
+ }
81
+ function inferSemanticLabel(row) {
82
+ const text = clean(row.raw_text, 2400);
83
+ const eventType = inferOntologyEventType(row);
84
+ const intention = inferIntention(row);
85
+ const outcome = inferOutcome(row);
86
+ const goals = extractGoalCandidates(row);
87
+ const milestones = extractMatches(text, [
88
+ /\b(?:completed|finished|fixed|resolved|shipped|deployed|published|pushed|passed)\b([^.!?\n]{0,180})/gi,
89
+ /(?:milestone|done):\s*([^.!?\n]{8,220})/gi
90
+ ]);
91
+ const problems = extractMatches(text, [
92
+ /\b(?:blocked by|failed because|bug|regression|broken|not working|error)\b([^.!?\n]{0,180})/gi,
93
+ /(?:problem|issue|risk):\s*([^.!?\n]{8,220})/gi
94
+ ]);
95
+ const decisions = extractMatches(text, [
96
+ /(?:decided|decision|adr|we chose|approved|rejected)\s+([^.!?\n]{8,220})/gi
97
+ ]);
98
+ const temporalAnchors = extractMatches(text, [
99
+ /\b(\d{4}-\d{2}-\d{2}(?:[T ][0-9:.+-Z]+)?)\b/g,
100
+ /\b(today|yesterday|tomorrow|this week|next week|last week|morning|afternoon|tonight)\b/gi
101
+ ], 8);
102
+ const nextActions = extractMatches(text, [
103
+ /(?:next|todo|follow[- ]?up|remaining|need to)\s*:?\s*([^.!?\n]{8,220})/gi
104
+ ]);
105
+ const actors = uniq([
106
+ row.agent_id,
107
+ ...extractMatches(text, [/\b(?:agent|employee|owner|assignee)[:= ]+([a-zA-Z][a-zA-Z0-9_-]{1,40})/gi], 5)
108
+ ], 6);
109
+ const successSignals = milestones.length ? milestones : outcome === "success_signal" ? [clean(text, 180)] : [];
110
+ const failureSignals = problems.length ? problems : outcome === "failure_signal" || row.has_error ? [clean(text, 180)] : [];
111
+ const impact = successSignals.length && failureSignals.length ? "mixed" : failureSignals.length ? "negative" : successSignals.length ? "positive" : "neutral";
112
+ const signalCount = goals.length + milestones.length + problems.length + decisions.length + nextActions.length;
113
+ return {
114
+ labeler: "deterministic",
115
+ schemaVersion: 1,
116
+ eventType,
117
+ intention,
118
+ outcome,
119
+ impact,
120
+ confidence: Math.min(0.95, 0.45 + signalCount * 0.08 + (intention ? 0.1 : 0) + (outcome ? 0.1 : 0)),
121
+ goals,
122
+ milestones,
123
+ problems,
124
+ decisions,
125
+ actors,
126
+ temporalAnchors,
127
+ successSignals,
128
+ failureSignals,
129
+ nextActions,
130
+ summary: clean(text, 280)
131
+ };
132
+ }
133
+ function ontologyPayload(row) {
134
+ const semantic = inferSemanticLabel(row);
135
+ return {
136
+ tool_name: row.tool_name,
137
+ memory_version: row.version ?? null,
138
+ domain: row.domain ?? null,
139
+ trajectory: row.trajectory ? safeJson(row.trajectory) : null,
140
+ semantic
141
+ };
142
+ }
143
+ function safeJson(value) {
144
+ try {
145
+ return JSON.parse(value);
146
+ } catch {
147
+ return value.slice(0, 1e3);
148
+ }
149
+ }
150
+ async function resolveClient(client) {
151
+ if (client) return client;
152
+ const { getClient } = await import("./lib/database.js");
153
+ return getClient();
154
+ }
155
+ async function insertOntologyForMemory(row, client) {
156
+ const db = await resolveClient(client);
157
+ const occurredAt = row.timestamp;
158
+ const sequence = Number(row.version ?? 0) || Math.floor(new Date(occurredAt).getTime() / 1e3);
159
+ const eventType = inferOntologyEventType(row);
160
+ const intention = inferIntention(row);
161
+ const outcome = inferOutcome(row);
162
+ const eventId = stableId("event", row.id);
163
+ const now = (/* @__PURE__ */ new Date()).toISOString();
164
+ await db.execute({
165
+ sql: `INSERT INTO agent_sessions (id, agent_id, project_name, started_at, last_event_at, event_count, properties)
166
+ VALUES (?, ?, ?, ?, ?, 1, ?)
167
+ ON CONFLICT(id) DO UPDATE SET last_event_at = MAX(last_event_at, excluded.last_event_at),
168
+ event_count = event_count + 1`,
169
+ args: [row.session_id, row.agent_id, row.project_name, occurredAt, occurredAt, JSON.stringify({ agent_role: row.agent_role })]
170
+ });
171
+ await db.execute({
172
+ sql: `INSERT OR IGNORE INTO agent_events
173
+ (id, event_type, occurred_at, sequence_index, actor_agent_id, agent_role, project_name,
174
+ session_id, task_id, goal_id, parent_event_id, intention, outcome, evidence_memory_id,
175
+ impact, payload, created_at)
176
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, ?, ?, ?, ?, ?, ?)`,
177
+ args: [
178
+ eventId,
179
+ eventType,
180
+ occurredAt,
181
+ sequence,
182
+ row.agent_id,
183
+ row.agent_role,
184
+ row.project_name,
185
+ row.session_id,
186
+ row.task_id ?? null,
187
+ intention,
188
+ outcome,
189
+ row.id,
190
+ row.has_error ? "negative" : outcome === "success_signal" ? "positive" : "neutral",
191
+ JSON.stringify(ontologyPayload(row)),
192
+ now
193
+ ]
194
+ });
195
+ const semantic = inferSemanticLabel(row);
196
+ await db.execute({
197
+ sql: `INSERT INTO agent_semantic_labels
198
+ (id, source_memory_id, event_id, labeler, schema_version, confidence, labels, created_at, updated_at)
199
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
200
+ ON CONFLICT(id) DO UPDATE SET confidence = excluded.confidence,
201
+ labels = excluded.labels, updated_at = excluded.updated_at`,
202
+ args: [
203
+ stableId("semantic", row.id, semantic.labeler, semantic.schemaVersion),
204
+ row.id,
205
+ eventId,
206
+ semantic.labeler,
207
+ semantic.schemaVersion,
208
+ semantic.confidence,
209
+ JSON.stringify(semantic),
210
+ now,
211
+ now
212
+ ]
213
+ });
214
+ for (const statement of extractGoalCandidates(row)) {
215
+ const goalId = stableId("goal", row.project_name, statement.toLowerCase());
216
+ await db.execute({
217
+ sql: `INSERT INTO agent_goals
218
+ (id, statement, owner_agent_id, project_name, status, priority, success_criteria,
219
+ parent_goal_id, due_at, achieved_at, supersedes_id, created_at, updated_at, source_memory_id)
220
+ VALUES (?, ?, ?, ?, 'open', 5, NULL, NULL, NULL, NULL, NULL, ?, ?, ?)
221
+ ON CONFLICT(id) DO UPDATE SET updated_at = excluded.updated_at`,
222
+ args: [goalId, statement, row.agent_id, row.project_name, now, now, row.id]
223
+ });
224
+ await db.execute({
225
+ sql: `INSERT OR IGNORE INTO agent_goal_links
226
+ (id, goal_id, link_type, target_id, target_type, created_at)
227
+ VALUES (?, ?, 'evidence', ?, 'memory', ?)`,
228
+ args: [stableId("goal_link", goalId, row.id, "memory"), goalId, row.id, now]
229
+ });
230
+ await db.execute({
231
+ sql: `INSERT OR IGNORE INTO agent_goal_links
232
+ (id, goal_id, link_type, target_id, target_type, created_at)
233
+ VALUES (?, ?, 'event', ?, 'event', ?)`,
234
+ args: [stableId("goal_link", goalId, eventId, "event"), goalId, eventId, now]
235
+ });
236
+ }
237
+ }
238
+ async function insertOntologyForBatch(rows, client) {
239
+ const db = await resolveClient(client);
240
+ let count = 0;
241
+ for (const row of rows) {
242
+ try {
243
+ await insertOntologyForMemory(row, db);
244
+ count++;
245
+ } catch {
246
+ }
247
+ }
248
+ return count;
249
+ }
250
+
251
+ export {
252
+ stableId,
253
+ clean,
254
+ inferOntologyEventType,
255
+ inferIntention,
256
+ inferOutcome,
257
+ extractGoalCandidates,
258
+ inferSemanticLabel,
259
+ ontologyPayload,
260
+ insertOntologyForMemory,
261
+ insertOntologyForBatch
262
+ };
@@ -0,0 +1,129 @@
1
+ import {
2
+ EMPLOYEES_PATH,
3
+ getClient,
4
+ isInitialized,
5
+ loadEmployees
6
+ } from "./chunk-WUKHLCBE.js";
7
+ import {
8
+ PLAN_LIMITS,
9
+ checkLicense,
10
+ isFeatureAllowed
11
+ } from "./chunk-YTKVJJSU.js";
12
+ import {
13
+ EXE_AI_DIR
14
+ } from "./chunk-R36FAN53.js";
15
+
16
+ // src/lib/plan-limits.ts
17
+ import { readFileSync, existsSync } from "fs";
18
+ import path from "path";
19
+ var PlanLimitError = class extends Error {
20
+ constructor(message) {
21
+ super(message);
22
+ this.name = "PlanLimitError";
23
+ }
24
+ };
25
+ var CACHE_PATH = path.join(EXE_AI_DIR, "license-cache.json");
26
+ function getLicenseSync() {
27
+ try {
28
+ if (!existsSync(CACHE_PATH)) return freeLicense();
29
+ const raw = JSON.parse(readFileSync(CACHE_PATH, "utf8"));
30
+ if (!raw.token || typeof raw.token !== "string") return freeLicense();
31
+ const parts = raw.token.split(".");
32
+ if (parts.length !== 3) return freeLicense();
33
+ const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString());
34
+ const plan = payload.plan ?? "free";
35
+ const limits = PLAN_LIMITS[plan] ?? PLAN_LIMITS.free;
36
+ return {
37
+ valid: true,
38
+ plan,
39
+ email: payload.sub ?? "",
40
+ expiresAt: payload.exp ? new Date(payload.exp * 1e3).toISOString() : null,
41
+ deviceLimit: limits.devices,
42
+ employeeLimit: limits.employees,
43
+ memoryLimit: limits.memories
44
+ };
45
+ } catch {
46
+ return freeLicense();
47
+ }
48
+ }
49
+ function freeLicense() {
50
+ const limits = PLAN_LIMITS.free;
51
+ return {
52
+ valid: true,
53
+ plan: "free",
54
+ email: "",
55
+ expiresAt: null,
56
+ deviceLimit: limits.devices,
57
+ employeeLimit: limits.employees,
58
+ memoryLimit: limits.memories
59
+ };
60
+ }
61
+ async function countActiveMemories() {
62
+ if (!isInitialized()) return 0;
63
+ const client = getClient();
64
+ const result = await client.execute(
65
+ "SELECT COUNT(*) as cnt FROM memories WHERE status = 'active' OR status IS NULL"
66
+ );
67
+ const row = result.rows[0];
68
+ return Number(row?.cnt ?? 0);
69
+ }
70
+ async function assertMemoryLimit() {
71
+ const license = await checkLicense();
72
+ if (license.memoryLimit < 0) return;
73
+ const count = await countActiveMemories();
74
+ if (count >= license.memoryLimit) {
75
+ throw new PlanLimitError(
76
+ `Memory limit reached: ${count}/${license.memoryLimit} active memories on the ${license.plan} plan. Upgrade at https://askexe.com to store more.`
77
+ );
78
+ }
79
+ }
80
+ async function assertEmployeeLimit(license, rosterPath) {
81
+ const lic = license ?? await checkLicense();
82
+ if (lic.employeeLimit < 0) return;
83
+ const employees = await loadEmployees(rosterPath ?? EMPLOYEES_PATH);
84
+ if (employees.length >= lic.employeeLimit) {
85
+ throw new PlanLimitError(
86
+ `Employee limit reached: ${employees.length}/${lic.employeeLimit} employees on the ${lic.plan} plan. Upgrade at https://askexe.com to add more.`
87
+ );
88
+ }
89
+ }
90
+ function assertEmployeeLimitSync(rosterPath) {
91
+ const license = getLicenseSync();
92
+ if (license.employeeLimit < 0) return;
93
+ const filePath = rosterPath ?? EMPLOYEES_PATH;
94
+ let count = 0;
95
+ try {
96
+ if (existsSync(filePath)) {
97
+ const raw = readFileSync(filePath, "utf8");
98
+ const employees = JSON.parse(raw);
99
+ count = Array.isArray(employees) ? employees.length : 0;
100
+ }
101
+ } catch {
102
+ throw new PlanLimitError(
103
+ `Cannot verify employee count: roster unreadable at ${filePath}. Refusing to proceed. Check file permissions or upgrade plan.`
104
+ );
105
+ }
106
+ if (count >= license.employeeLimit) {
107
+ throw new PlanLimitError(
108
+ `Employee limit reached: ${count}/${license.employeeLimit} employees on the ${license.plan} plan. Upgrade at https://askexe.com to add more.`
109
+ );
110
+ }
111
+ }
112
+ async function assertFeature(feature) {
113
+ const license = await checkLicense();
114
+ if (!isFeatureAllowed(license, feature)) {
115
+ throw new PlanLimitError(
116
+ `Feature "${feature}" requires a paid plan. Current plan: ${license.plan}. Upgrade at https://askexe.com.`
117
+ );
118
+ }
119
+ }
120
+
121
+ export {
122
+ PlanLimitError,
123
+ getLicenseSync,
124
+ countActiveMemories,
125
+ assertMemoryLimit,
126
+ assertEmployeeLimit,
127
+ assertEmployeeLimitSync,
128
+ assertFeature
129
+ };