@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,210 @@
1
+ import {
2
+ redactSecrets
3
+ } from "./chunk-Y25OJWOQ.js";
4
+
5
+ // src/lib/memory-write-governor.ts
6
+ import { createHash } from "crypto";
7
+ var HIGH_VALUE_SUPERSESSION_TYPES = /* @__PURE__ */ new Set([
8
+ "decision",
9
+ "adr",
10
+ "behavior",
11
+ "procedure"
12
+ ]);
13
+ var NOISE_DROP_PATTERNS = [
14
+ /^\s*\[📋\s+\d+\s+reviews?\s+pending\b/im,
15
+ /^\s*<system-reminder>[\s\S]*?<\/system-reminder>\s*$/im,
16
+ /^\s*The UserPromptSubmit hook checks the DB for new tasks/im,
17
+ /^\s*Intercom is a speedup, not delivery/im,
18
+ /^\s*Context bar reads as USAGE not remaining/im,
19
+ // Intercom noise — these repeat on every prompt and cause 18K+ duplicates
20
+ /^\/exe-intercom\b/i,
21
+ /^You have pending notifications\.\s*Run list_tasks/i,
22
+ /^You have open tasks\.\s*Run list_tasks/i,
23
+ /^You have a new P\d+ task/i,
24
+ /^You have more open tasks to dispatch/i,
25
+ /^No new tasks\.\s*(Standing by|Idle|Dashboard)/i
26
+ ];
27
+ var SKIP_EMBED_PATTERNS = [
28
+ /tmux capture-pane\b/i,
29
+ /docker ps\b/i,
30
+ /docker images\b/i,
31
+ /git status\b/i,
32
+ /grep .*node_modules/i,
33
+ /npm (install|ci)\b[\s\S]*(added \d+ packages|audited \d+ packages)/i
34
+ ];
35
+ function normalizeMemoryText(text) {
36
+ return text.replace(/\r\n/g, "\n").replace(/[ \t]+$/gm, "").replace(/\n{4,}/g, "\n\n\n").trim();
37
+ }
38
+ function classifyMemoryType(input) {
39
+ if (input.memory_type && input.memory_type.trim()) return input.memory_type.trim();
40
+ const tool = input.tool_name.toLowerCase();
41
+ const text = input.raw_text.toLowerCase();
42
+ if (tool.includes("store_decision") || tool.includes("decision")) return "decision";
43
+ if (tool.includes("commit") || text.includes("adr-") || text.includes("architectural decision")) return "adr";
44
+ if (tool.includes("store_behavior") || tool.includes("behavior")) return "behavior";
45
+ if (tool.includes("global_procedure") || text.includes("organization-wide procedures")) return "procedure";
46
+ if (tool.includes("checkpoint") || text.startsWith("context checkpoint")) return "checkpoint";
47
+ if (tool.includes("sessionsummary") || tool.includes("session-summary")) return "summary";
48
+ if (tool.includes("sessionend") || text.startsWith("session ended")) return "summary";
49
+ if (tool.includes("send_whatsapp") || tool.includes("conversation")) return "conversation";
50
+ if (tool === "store_memory" || tool === "manual") return "observation";
51
+ if (tool === "userprompt" || tool === "slashcommand") return "conversation";
52
+ return "raw";
53
+ }
54
+ function shouldDropMemory(text) {
55
+ const normalized = normalizeMemoryText(text);
56
+ if (normalized.length < 10) return { drop: true, reason: "too_short" };
57
+ if (NOISE_DROP_PATTERNS.some((pattern) => pattern.test(normalized))) {
58
+ return { drop: true, reason: "known_boilerplate_noise" };
59
+ }
60
+ return { drop: false };
61
+ }
62
+ function shouldSkipEmbedding(input) {
63
+ const type = classifyMemoryType(input);
64
+ if (HIGH_VALUE_SUPERSESSION_TYPES.has(type)) return false;
65
+ if (type === "raw" && input.raw_text.length > 2e4) return true;
66
+ if (SKIP_EMBED_PATTERNS.some((pattern) => pattern.test(input.raw_text))) return true;
67
+ return false;
68
+ }
69
+ function hashMemoryContent(text) {
70
+ return createHash("sha256").update(normalizeMemoryText(text)).digest("hex");
71
+ }
72
+ function scopedDedupArgs(input) {
73
+ return [input.contentHash, input.agentId, input.projectName, input.memoryType];
74
+ }
75
+ function governMemoryRecord(record) {
76
+ const redacted = redactSecrets(record.raw_text);
77
+ const normalized = normalizeMemoryText(redacted.text);
78
+ const memoryType = classifyMemoryType({
79
+ raw_text: normalized,
80
+ agent_id: record.agent_id,
81
+ project_name: record.project_name,
82
+ tool_name: record.tool_name,
83
+ memory_type: record.memory_type
84
+ });
85
+ const drop = shouldDropMemory(normalized);
86
+ const skipEmbedding = shouldSkipEmbedding({
87
+ raw_text: normalized,
88
+ agent_id: record.agent_id,
89
+ project_name: record.project_name,
90
+ tool_name: record.tool_name,
91
+ memory_type: memoryType
92
+ });
93
+ const trajectoryValue = record.trajectory;
94
+ const redactedTrajectory = typeof trajectoryValue === "string" ? redactSecrets(trajectoryValue).text : record.trajectory;
95
+ return {
96
+ record: {
97
+ ...record,
98
+ raw_text: normalized,
99
+ memory_type: memoryType,
100
+ vector: skipEmbedding ? null : record.vector,
101
+ keywords: record.keywords ? redactSecrets(record.keywords).text : record.keywords,
102
+ trajectory: redactedTrajectory
103
+ },
104
+ contentHash: hashMemoryContent(normalized),
105
+ shouldDrop: drop.drop,
106
+ dropReason: drop.reason,
107
+ skipEmbedding,
108
+ hygiene: {
109
+ dedup: true,
110
+ supersession: HIGH_VALUE_SUPERSESSION_TYPES.has(memoryType)
111
+ }
112
+ };
113
+ }
114
+ async function findScopedDuplicate(input) {
115
+ const { getClient } = await import("./lib/database.js");
116
+ const client = getClient();
117
+ const args = scopedDedupArgs(input);
118
+ let sql = `SELECT id FROM memories
119
+ WHERE content_hash = ?
120
+ AND agent_id = ?
121
+ AND project_name = ?
122
+ AND COALESCE(memory_type, 'raw') = ?
123
+ AND COALESCE(status, 'active') != 'deleted'`;
124
+ if (input.excludeId) {
125
+ sql += " AND id != ?";
126
+ args.push(input.excludeId);
127
+ }
128
+ sql += " ORDER BY timestamp DESC LIMIT 1";
129
+ const result = await client.execute({ sql, args });
130
+ return result.rows[0]?.id ? String(result.rows[0].id) : null;
131
+ }
132
+ async function runPostWriteMemoryHygiene(memoryId) {
133
+ try {
134
+ const { getClient } = await import("./lib/database.js");
135
+ const client = getClient();
136
+ const current = await client.execute({
137
+ sql: `SELECT id, agent_id, project_name, memory_type, content_hash, supersedes_id,
138
+ importance, timestamp
139
+ FROM memories
140
+ WHERE id = ?
141
+ LIMIT 1`,
142
+ args: [memoryId]
143
+ });
144
+ const row = current.rows[0];
145
+ if (!row) return;
146
+ const memoryType = String(row.memory_type ?? "raw");
147
+ const contentHash = row.content_hash ? String(row.content_hash) : null;
148
+ const agentId = String(row.agent_id);
149
+ const projectName = String(row.project_name);
150
+ if (contentHash) {
151
+ await client.execute({
152
+ sql: `UPDATE memories
153
+ SET status = 'deleted',
154
+ outcome = COALESCE(outcome, 'superseded')
155
+ WHERE id != ?
156
+ AND content_hash = ?
157
+ AND agent_id = ?
158
+ AND project_name = ?
159
+ AND COALESCE(memory_type, 'raw') = ?
160
+ AND COALESCE(status, 'active') = 'active'`,
161
+ args: [memoryId, contentHash, agentId, projectName, memoryType]
162
+ });
163
+ }
164
+ const supersedesId = row.supersedes_id ? String(row.supersedes_id) : null;
165
+ if (supersedesId && HIGH_VALUE_SUPERSESSION_TYPES.has(memoryType)) {
166
+ const old = await client.execute({
167
+ sql: `SELECT importance FROM memories WHERE id = ? LIMIT 1`,
168
+ args: [supersedesId]
169
+ });
170
+ const oldImportance = Number(old.rows[0]?.importance ?? 0);
171
+ const newImportance = Number(row.importance ?? 0);
172
+ await client.batch([
173
+ {
174
+ sql: `UPDATE memories
175
+ SET status = 'archived',
176
+ outcome = COALESCE(outcome, 'superseded')
177
+ WHERE id = ?`,
178
+ args: [supersedesId]
179
+ },
180
+ {
181
+ sql: `UPDATE memories
182
+ SET importance = MAX(COALESCE(importance, 5), ?),
183
+ parent_memory_id = COALESCE(parent_memory_id, ?)
184
+ WHERE id = ?`,
185
+ args: [Math.max(oldImportance, newImportance), supersedesId, memoryId]
186
+ }
187
+ ], "write");
188
+ }
189
+ } catch (err) {
190
+ process.stderr.write(
191
+ `[memory-governor] post-write hygiene failed for ${memoryId}: ${err instanceof Error ? err.message : String(err)}
192
+ `
193
+ );
194
+ }
195
+ }
196
+ function schedulePostWriteMemoryHygiene(memoryIds) {
197
+ if (process.env.EXE_SKIP_MEMORY_HYGIENE === "1") return;
198
+ if (memoryIds.length === 0) return;
199
+ const run = () => {
200
+ void Promise.all(memoryIds.map((id) => runPostWriteMemoryHygiene(id)));
201
+ };
202
+ if (typeof setImmediate === "function") setImmediate(run);
203
+ else setTimeout(run, 0);
204
+ }
205
+
206
+ export {
207
+ governMemoryRecord,
208
+ findScopedDuplicate,
209
+ schedulePostWriteMemoryHygiene
210
+ };
@@ -0,0 +1,51 @@
1
+ // src/lib/embeddings-config.ts
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
3
+ import os from "os";
4
+ import path from "path";
5
+ var EXE_AI_DIR = path.join(os.homedir(), ".exe-os");
6
+ var EMBEDDINGS_SENTINEL_PATH = path.join(EXE_AI_DIR, "embeddings-enabled");
7
+ function parseEmbeddingsEnv(raw) {
8
+ if (raw === void 0) return null;
9
+ const v = raw.trim().toLowerCase();
10
+ if (v === "") return null;
11
+ if (v === "1" || v === "true") return true;
12
+ if (v === "0" || v === "false") return false;
13
+ return null;
14
+ }
15
+ function readSentinel(sentinelPath = EMBEDDINGS_SENTINEL_PATH) {
16
+ try {
17
+ if (!existsSync(sentinelPath)) return null;
18
+ const raw = readFileSync(sentinelPath, "utf8").trim().toLowerCase();
19
+ if (raw === "0" || raw === "false") return false;
20
+ return raw === "" || raw === "1" || raw === "true";
21
+ } catch {
22
+ return null;
23
+ }
24
+ }
25
+ function deriveFromLegacyConfig(config) {
26
+ if (!config) return false;
27
+ return config.searchMode === "hybrid" || config.hookSearchMode === "hybrid";
28
+ }
29
+ function resolveEmbeddingsEnabled(env, config, sentinelPath = EMBEDDINGS_SENTINEL_PATH) {
30
+ const envDecision = parseEmbeddingsEnv(env);
31
+ if (envDecision !== null) return envDecision;
32
+ const sentinel = readSentinel(sentinelPath);
33
+ if (sentinel !== null) return sentinel;
34
+ if (config !== void 0 && config !== null) return deriveFromLegacyConfig(config);
35
+ return false;
36
+ }
37
+ function setEmbeddingsEnabled(enabled, config, sentinelPath = EMBEDDINGS_SENTINEL_PATH) {
38
+ try {
39
+ mkdirSync(path.dirname(sentinelPath), { recursive: true });
40
+ writeFileSync(sentinelPath, enabled ? "1\n" : "0\n", "utf8");
41
+ } catch {
42
+ }
43
+ config.searchMode = enabled ? "hybrid" : "fts";
44
+ config.hookSearchMode = enabled ? "hybrid" : "fts";
45
+ return config;
46
+ }
47
+
48
+ export {
49
+ resolveEmbeddingsEnabled,
50
+ setEmbeddingsEnabled
51
+ };