@askexenow/exe-os 0.9.300 → 0.9.301

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 (244) hide show
  1. package/deploy/compose/erp-nginx/nginx.conf +6 -3
  2. package/dist/active-agent-UNJO6AJ2.js +27 -0
  3. package/dist/active-agent-Y5LSIMVC.js +28 -0
  4. package/dist/agentic-ontology-QEV7GI3T.js +25 -0
  5. package/dist/backfill-metadata-RQZ4BN7G.js +600 -0
  6. package/dist/behaviors-A3L5CWMK.js +46 -0
  7. package/dist/bin/agentic-ontology-backfill.js +5 -5
  8. package/dist/bin/agentic-reflection-backfill.js +6 -6
  9. package/dist/bin/agentic-semantic-label.js +5 -5
  10. package/dist/bin/backfill-conversations.js +4 -4
  11. package/dist/bin/backfill-responses.js +4 -4
  12. package/dist/bin/backfill-vectors.js +5 -5
  13. package/dist/bin/bulk-sync-postgres.js +7 -7
  14. package/dist/bin/cc-doctor.js +4 -4
  15. package/dist/bin/cleanup-stale-review-tasks.js +9 -9
  16. package/dist/bin/cli.js +15 -15
  17. package/dist/bin/exe-agent-config.js +2 -2
  18. package/dist/bin/exe-agent.js +4 -4
  19. package/dist/bin/exe-assign.js +5 -5
  20. package/dist/bin/exe-boot.js +23 -18
  21. package/dist/bin/exe-call.js +4 -4
  22. package/dist/bin/exe-cloud.js +7 -7
  23. package/dist/bin/exe-dispatch.js +9 -9
  24. package/dist/bin/exe-doctor.js +2 -2
  25. package/dist/bin/exe-export-behaviors.js +7 -7
  26. package/dist/bin/exe-forget.js +6 -6
  27. package/dist/bin/exe-gateway.js +7 -7
  28. package/dist/bin/exe-healthcheck.js +4 -4
  29. package/dist/bin/exe-heartbeat.js +9 -9
  30. package/dist/bin/exe-kill.js +12 -12
  31. package/dist/bin/exe-launch-agent.js +16 -16
  32. package/dist/bin/exe-new-employee.js +6 -6
  33. package/dist/bin/exe-pending-messages.js +10 -10
  34. package/dist/bin/exe-pending-notifications.js +9 -9
  35. package/dist/bin/exe-pending-reviews.js +9 -9
  36. package/dist/bin/exe-rename.js +4 -4
  37. package/dist/bin/exe-review.js +11 -11
  38. package/dist/bin/exe-search.js +5 -5
  39. package/dist/bin/exe-session-cleanup.js +14 -14
  40. package/dist/bin/exe-settings.js +7 -7
  41. package/dist/bin/exe-start-codex.js +11 -11
  42. package/dist/bin/exe-start-opencode.js +8 -8
  43. package/dist/bin/exe-status.js +10 -10
  44. package/dist/bin/exe-team.js +3 -3
  45. package/dist/bin/exe-watchdog.js +3 -3
  46. package/dist/bin/git-sweep.js +10 -10
  47. package/dist/bin/graph-backfill.js +4 -4
  48. package/dist/bin/graph-export.js +5 -5
  49. package/dist/bin/import-history.js +7 -7
  50. package/dist/bin/install.js +6 -6
  51. package/dist/bin/intercom-check.js +4 -4
  52. package/dist/bin/mcp-sessions.js +2 -2
  53. package/dist/bin/orchestration-metrics.js +4 -4
  54. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  55. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  56. package/dist/bin/scan-tasks.js +9 -9
  57. package/dist/bin/setup.js +1 -1
  58. package/dist/bin/shard-migrate.js +4 -4
  59. package/dist/capability-cards-VTGDTOZ4.js +89 -0
  60. package/dist/capacity-monitor-G2MAJPRP.js +51 -0
  61. package/dist/catchup-brief-VBGEJQRS.js +175 -0
  62. package/dist/chunk-24JVDLQJ.js +345 -0
  63. package/dist/chunk-2T3OYZMR.js +1158 -0
  64. package/dist/chunk-3ABY3QDX.js +199 -0
  65. package/dist/chunk-3G3ECFB5.js +668 -0
  66. package/dist/chunk-3LHOFGHT.js +280 -0
  67. package/dist/chunk-3RA62PNQ.js +58 -0
  68. package/dist/chunk-3XRS5AVV.js +567 -0
  69. package/dist/chunk-3YK7X5FD.js +1186 -0
  70. package/dist/chunk-4L6PVYFE.js +54 -0
  71. package/dist/chunk-4O67LBMK.js +377 -0
  72. package/dist/chunk-4OIU3N6U.js +167 -0
  73. package/dist/chunk-5SYYMNPE.js +30 -0
  74. package/dist/chunk-5TO5PH7O.js +304 -0
  75. package/dist/chunk-5XD2Y463.js +402 -0
  76. package/dist/chunk-63AENHJC.js +123 -0
  77. package/dist/chunk-673IFJYB.js +731 -0
  78. package/dist/chunk-7AWH47AR.js +448 -0
  79. package/dist/chunk-7P4B6AEP.js +227 -0
  80. package/dist/chunk-7VHOALNC.js +244 -0
  81. package/dist/chunk-ASJHCAVL.js +38 -0
  82. package/dist/chunk-DICIFTCS.js +150 -0
  83. package/dist/chunk-DIFI5JDC.js +76 -0
  84. package/dist/chunk-DPOIJ5SM.js +284 -0
  85. package/dist/chunk-FAZNXNA5.js +33 -0
  86. package/dist/chunk-FCHG5RC4.js +197 -0
  87. package/dist/chunk-FFKSPZO2.js +157 -0
  88. package/dist/chunk-FNHYH5U6.js +331 -0
  89. package/dist/chunk-FWPDAQ6Q.js +1350 -0
  90. package/dist/chunk-FZB73QOI.js +210 -0
  91. package/dist/chunk-GJBR6QLD.js +630 -0
  92. package/dist/chunk-GRSYAHKI.js +535 -0
  93. package/dist/chunk-J5HFRVNW.js +362 -0
  94. package/dist/chunk-J6SD7LT2.js +171 -0
  95. package/dist/chunk-JURL2S27.js +128 -0
  96. package/dist/chunk-KPUYYOFS.js +122 -0
  97. package/dist/chunk-LAFARYU5.js +456 -0
  98. package/dist/chunk-LSDXEHKL.js +381 -0
  99. package/dist/chunk-MS2EOZJQ.js +290 -0
  100. package/dist/chunk-MUIMJGSQ.js +128 -0
  101. package/dist/chunk-NJMPNYBS.js +427 -0
  102. package/dist/chunk-OJACH2JF.js +128 -0
  103. package/dist/chunk-OO4IFABD.js +382 -0
  104. package/dist/chunk-Q65NCNL4.js +1352 -0
  105. package/dist/chunk-QIGS2LRT.js +735 -0
  106. package/dist/chunk-S73ZAJ2S.js +262 -0
  107. package/dist/chunk-SJ4UF7YK.js +1094 -0
  108. package/dist/chunk-SOZ7D77I.js +204 -0
  109. package/dist/chunk-TDX2LK2M.js +240 -0
  110. package/dist/chunk-U5RKGLV6.js +50 -0
  111. package/dist/chunk-UFGTHBHP.js +127 -0
  112. package/dist/chunk-ULCYWCPI.js +1079 -0
  113. package/dist/chunk-V6LOEOXG.js +3372 -0
  114. package/dist/chunk-VAZOVAW4.js +2162 -0
  115. package/dist/chunk-VEUQVKKT.js +185 -0
  116. package/dist/chunk-VIDDJ5RF.js +214 -0
  117. package/dist/chunk-VNB4ROYG.js +348 -0
  118. package/dist/chunk-VWUQFZFB.js +395 -0
  119. package/dist/chunk-W77GRCNA.js +85 -0
  120. package/dist/chunk-WVMG4ZRH.js +14597 -0
  121. package/dist/chunk-WYVOTRRZ.js +129 -0
  122. package/dist/chunk-XQQ7D4I4.js +85 -0
  123. package/dist/chunk-YHJPTIPR.js +836 -0
  124. package/dist/chunk-YLKS7KKC.js +2145 -0
  125. package/dist/chunk-YU3KEVCO.js +333 -0
  126. package/dist/chunk-ZDPU3JTF.js +221 -0
  127. package/dist/chunk-ZDY4LYAJ.js +81 -0
  128. package/dist/chunk-ZG33AACD.js +70 -0
  129. package/dist/chunk-ZKHPZ6KN.js +181 -0
  130. package/dist/chunk-ZO2TM5N5.js +97 -0
  131. package/dist/chunk-ZSUACDQC.js +4388 -0
  132. package/dist/co-activation-XM25BLZM.js +74 -0
  133. package/dist/co-occurrence-CKEMDPWO.js +95 -0
  134. package/dist/core-memory-ZDA76EU3.js +110 -0
  135. package/dist/crdt-sync-BJKZB6T6.js +33 -0
  136. package/dist/crm-webhook-E5PAFAUN.js +10 -0
  137. package/dist/cto-delegation-gate-EMY6ZZ2F.js +280 -0
  138. package/dist/daemon-orchestration-Y5Y6YNE3.js +143 -0
  139. package/dist/db-backup-HFJ53IBU.js +43 -0
  140. package/dist/doc-graph-extractor-ID45AQ2P.js +133 -0
  141. package/dist/dreaming-N6B7KBIE.js +34 -0
  142. package/dist/exe-drift-CPUEAPIU.js +70 -0
  143. package/dist/exe-export-4RTGDV53.js +77 -0
  144. package/dist/exe-import-AZMIF34Z.js +80 -0
  145. package/dist/exe-key-LJV23AJI.js +673 -0
  146. package/dist/exe-snapshot-ZOZBW7V6.js +338 -0
  147. package/dist/fast-db-init-ATRZGHOL.js +7 -0
  148. package/dist/gateway/index.js +8 -8
  149. package/dist/git-staleness-XNOKI4D3.js +112 -0
  150. package/dist/git-task-sweep-3MO4OVND.js +42 -0
  151. package/dist/global-procedures-EBAPPWGZ.js +22 -0
  152. package/dist/graph-auto-extract-VJOUQBPK.js +183 -0
  153. package/dist/hooks/bug-report-worker.js +11 -11
  154. package/dist/hooks/codex-stop-task-finalizer.js +11 -11
  155. package/dist/hooks/commit-complete.js +11 -11
  156. package/dist/hooks/error-recall.js +6 -6
  157. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  158. package/dist/hooks/ingest.js +6 -6
  159. package/dist/hooks/instructions-loaded.js +4 -4
  160. package/dist/hooks/manifest.json +19 -19
  161. package/dist/hooks/notification.js +4 -4
  162. package/dist/hooks/post-compact.js +11 -11
  163. package/dist/hooks/post-tool-combined.js +5 -5
  164. package/dist/hooks/pre-compact.js +12 -12
  165. package/dist/hooks/pre-tool-use.js +14 -14
  166. package/dist/hooks/prompt-submit.js +26 -24
  167. package/dist/hooks/session-end.js +15 -15
  168. package/dist/hooks/session-start.js +12 -12
  169. package/dist/hooks/stop.js +14 -14
  170. package/dist/hooks/subagent-stop.js +10 -10
  171. package/dist/hooks/summary-worker.js +14 -14
  172. package/dist/index.js +17 -17
  173. package/dist/installer-37KFNAWE.js +344 -0
  174. package/dist/installer-F55NR4E2.js +298 -0
  175. package/dist/installer-KOYBUS4J.js +40 -0
  176. package/dist/lib/cloud-sync.js +7 -7
  177. package/dist/lib/consolidation.js +5 -5
  178. package/dist/lib/database.js +2 -2
  179. package/dist/lib/db.js +2 -2
  180. package/dist/lib/employee-templates.js +4 -4
  181. package/dist/lib/employees.js +2 -2
  182. package/dist/lib/exe-daemon.js +40 -40
  183. package/dist/lib/hybrid-search.js +5 -5
  184. package/dist/lib/identity.js +2 -2
  185. package/dist/lib/messaging.js +9 -9
  186. package/dist/lib/reminders.js +3 -3
  187. package/dist/lib/schedules.js +5 -5
  188. package/dist/lib/session-registry.js +4 -4
  189. package/dist/lib/skill-learning.js +6 -6
  190. package/dist/lib/store.js +4 -4
  191. package/dist/lib/task-router.js +3 -3
  192. package/dist/lib/tasks.js +10 -10
  193. package/dist/lib/tmux-routing.js +8 -8
  194. package/dist/lib/token-spend.js +3 -3
  195. package/dist/mcp/register-tools.js +54 -54
  196. package/dist/mcp/server.js +55 -55
  197. package/dist/mcp/tools/complete-reminder.js +4 -4
  198. package/dist/mcp/tools/create-reminder.js +4 -4
  199. package/dist/mcp/tools/create-task.js +12 -12
  200. package/dist/mcp/tools/deactivate-behavior.js +7 -7
  201. package/dist/mcp/tools/list-reminders.js +4 -4
  202. package/dist/mcp/tools/list-tasks.js +12 -12
  203. package/dist/mcp/tools/send-message.js +11 -11
  204. package/dist/mcp/tools/update-task.js +11 -11
  205. package/dist/mcp-http-config-7KJZI7UD.js +31 -0
  206. package/dist/memory-cards-ZIT7ZKL5.js +180 -0
  207. package/dist/memory-graph-extractor-LY2VORZT.js +22 -0
  208. package/dist/memory-poisoning-defense-SEM25TY5.js +224 -0
  209. package/dist/memory-reflection-J2W7CJ7C.js +244 -0
  210. package/dist/notifications-RLMSI4YE.js +47 -0
  211. package/dist/orchestration-events-TGQYA72K.js +27 -0
  212. package/dist/orchestrator-JQD5G3CW.js +35 -0
  213. package/dist/pipeline-router-3Q3YBYSM.js +15 -0
  214. package/dist/plan-limits-YGXTYCW4.js +28 -0
  215. package/dist/project-boot-TDOZKKDR.js +299 -0
  216. package/dist/projection-worker-TMKUSVGD.js +1084 -0
  217. package/dist/prospective-memory-CNJDBNWF.js +232 -0
  218. package/dist/reranker-YQIRNGDM.js +19 -0
  219. package/dist/retrieval-health-M5BVB7EV.js +12 -0
  220. package/dist/review-polling-ZMB3OBPC.js +126 -0
  221. package/dist/runtime/index.js +11 -11
  222. package/dist/session-events-UTMCKDIN.js +38 -0
  223. package/dist/session-kill-telemetry-FRQA5MVD.js +31 -0
  224. package/dist/session-scope-2BD6QLNI.js +88 -0
  225. package/dist/setup-wizard-W64I6SHC.js +12 -0
  226. package/dist/skill-refinement-FXCXTUS2.js +159 -0
  227. package/dist/steward-gate-JDR3SLH3.js +15 -0
  228. package/dist/task-enforcement-WCEA4FZI.js +506 -0
  229. package/dist/task-scope-L5GDL2AV.js +37 -0
  230. package/dist/tasks-crud-S36AFYYM.js +79 -0
  231. package/dist/tasks-notify-W2W2BJRB.js +40 -0
  232. package/dist/tasks-review-34WV7BX2.js +49 -0
  233. package/dist/telemetry-upload-3CSVO3J7.js +741 -0
  234. package/dist/token-budget-ZG2MQ5GD.js +86 -0
  235. package/dist/tool-telemetry-ODL4F2CW.js +17 -0
  236. package/dist/tui/App.js +16 -16
  237. package/dist/tui-data-Z5UF7KEI.js +260 -0
  238. package/dist/wiki-acl-SZFHCEC4.js +111 -0
  239. package/dist/worker-gate-OOO6BWZ6.js +21 -0
  240. package/dist/workflow-engine-QY3IFFR2.js +28 -0
  241. package/dist/worktree-CNOQZBNT.js +28 -0
  242. package/dist/worktree-sweep-SE7ITXC4.js +21 -0
  243. package/package.json +1 -1
  244. package/release-notes.json +88 -88
@@ -0,0 +1,331 @@
1
+ import {
2
+ vectorToSqlLiteral
3
+ } from "./chunk-YHJPTIPR.js";
4
+ import {
5
+ blobToVector
6
+ } from "./chunk-OTVEIJUQ.js";
7
+ import {
8
+ getClient
9
+ } from "./chunk-V6LOEOXG.js";
10
+
11
+ // src/lib/behaviors.ts
12
+ import crypto from "crypto";
13
+ var GHOST_BEHAVIOR_SQL = "(id IS NULL OR trim(coalesce(content, '')) = '' OR (content = '(empty)' AND coalesce(agent_id, '') = 'unknown'))";
14
+ function isGhostBehaviorRow(row) {
15
+ const id = row.id;
16
+ if (id === null || id === void 0 || String(id).trim() === "") return true;
17
+ const content = typeof row.content === "string" ? row.content : row.content == null ? "" : String(row.content);
18
+ if (content.trim() === "") return true;
19
+ const agent = typeof row.agent_id === "string" ? row.agent_id : row.agent_id == null ? "" : String(row.agent_id);
20
+ if (content === "(empty)" && agent === "unknown") return true;
21
+ return false;
22
+ }
23
+ function formatReflexContent(trigger, action) {
24
+ return `\u26A1 REFLEX: When ${trigger} \u2192 ${action}. Decide whether to act.`;
25
+ }
26
+ function isReflexBehavior(behavior) {
27
+ return behavior.domain === "reflex";
28
+ }
29
+ async function storeReflexBehavior(opts) {
30
+ const content = formatReflexContent(opts.trigger, opts.action);
31
+ return storeBehavior({
32
+ agentId: opts.agentId,
33
+ content,
34
+ domain: "reflex",
35
+ projectName: opts.projectName,
36
+ priority: "p0",
37
+ // Always injected — impossible to miss
38
+ deviceScoped: opts.deviceScoped ?? false
39
+ });
40
+ }
41
+ async function storeBehavior(opts) {
42
+ const trimmedContent = (opts.content ?? "").trim();
43
+ if (trimmedContent.length === 0) {
44
+ throw new Error(
45
+ "[behaviors] Refusing to store a behavior with empty content (ghost-row guard)."
46
+ );
47
+ }
48
+ const trimmedAgent = (opts.agentId ?? "").trim();
49
+ if (trimmedAgent.length === 0) {
50
+ throw new Error(
51
+ "[behaviors] Refusing to store a behavior with empty agent_id (ghost-row guard)."
52
+ );
53
+ }
54
+ try {
55
+ const { loadEmployeesSync, baseAgentName } = await import("./lib/employees.js");
56
+ const roster = loadEmployeesSync();
57
+ if (roster.length > 0) {
58
+ const base = baseAgentName(opts.agentId, roster);
59
+ if (!roster.some((e) => e.name === opts.agentId || e.name === base)) {
60
+ process.stderr.write(
61
+ `[behaviors] WARNING: Agent "${opts.agentId}" not found in roster. Storing behavior anyway \u2014 may be orphaned.
62
+ `
63
+ );
64
+ }
65
+ }
66
+ } catch {
67
+ }
68
+ const client = getClient();
69
+ const id = crypto.randomUUID();
70
+ const now = (/* @__PURE__ */ new Date()).toISOString();
71
+ const duplicate = await client.execute({
72
+ sql: `SELECT id FROM behaviors
73
+ WHERE agent_id = ?
74
+ AND COALESCE(domain, '') = COALESCE(?, '')
75
+ AND COALESCE(project_name, '') = COALESCE(?, '')
76
+ AND active = 1
77
+ AND lower(trim(content)) = lower(trim(?))
78
+ ORDER BY updated_at DESC
79
+ LIMIT 1`,
80
+ args: [trimmedAgent, opts.domain ?? null, opts.projectName ?? null, trimmedContent]
81
+ });
82
+ const existingId = duplicate.rows[0]?.id;
83
+ if (existingId) return String(existingId);
84
+ let vector = null;
85
+ if (!process.env.VITEST) {
86
+ try {
87
+ const { embed } = await import("./lib/embedder.js");
88
+ const vec = await embed(trimmedContent);
89
+ vector = new Float32Array(vec);
90
+ } catch {
91
+ }
92
+ }
93
+ let createdByDevice = null;
94
+ try {
95
+ const { loadDeviceId } = await import("./lib/license.js");
96
+ createdByDevice = loadDeviceId() ?? null;
97
+ } catch {
98
+ }
99
+ const createdByAgent = process.env.AGENT_ID ?? null;
100
+ const sourceSessionId = process.env.CLAUDE_SESSION_ID ?? process.env.SESSION_ID ?? null;
101
+ let deviceId = null;
102
+ if (opts.deviceScoped) {
103
+ try {
104
+ const { loadDeviceId } = await import("./lib/license.js");
105
+ deviceId = loadDeviceId() ?? null;
106
+ } catch {
107
+ }
108
+ }
109
+ await client.execute({
110
+ sql: `INSERT INTO behaviors (id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector, created_by_agent, created_by_device, source_session_id, device_id)
111
+ VALUES (?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?)`,
112
+ args: [id, trimmedAgent, opts.projectName ?? null, opts.domain ?? null, opts.priority ?? "p1", trimmedContent, now, now, vector ? vectorToSqlLiteral(vector) : null, createdByAgent, createdByDevice, sourceSessionId, deviceId]
113
+ });
114
+ return id;
115
+ }
116
+ async function listBehaviors(agentId, projectName, limit = 30) {
117
+ const client = getClient();
118
+ let currentDeviceId = null;
119
+ try {
120
+ const { loadDeviceId } = await import("./lib/license.js");
121
+ currentDeviceId = loadDeviceId() ?? null;
122
+ } catch {
123
+ }
124
+ const result = await client.execute({
125
+ sql: `SELECT id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector, created_by_agent, created_by_device, source_session_id, device_id
126
+ FROM behaviors
127
+ WHERE agent_id = ? AND active = 1
128
+ AND id IS NOT NULL AND trim(coalesce(content, '')) != ''
129
+ AND (project_name IS NULL OR project_name = ?)
130
+ AND (device_id IS NULL OR device_id = ?)
131
+ ORDER BY
132
+ CASE WHEN priority = 'p0' THEN 0
133
+ WHEN priority = 'p1' THEN 1
134
+ ELSE 2 END,
135
+ CASE
136
+ WHEN lower(coalesce(domain, '')) IN ('identity', 'title', 'role') THEN 0
137
+ WHEN lower(content) LIKE '%identity%' THEN 0
138
+ WHEN lower(content) LIKE '%title%' THEN 0
139
+ WHEN lower(content) LIKE '%who are you%' THEN 0
140
+ ELSE 1
141
+ END,
142
+ updated_at DESC
143
+ LIMIT ?`,
144
+ args: [agentId, projectName ?? "", currentDeviceId ?? "", limit]
145
+ });
146
+ return result.rows.map((r) => ({
147
+ id: String(r.id),
148
+ agent_id: String(r.agent_id),
149
+ project_name: r.project_name ? String(r.project_name) : null,
150
+ domain: r.domain ? String(r.domain) : null,
151
+ priority: String(r.priority || "p1"),
152
+ content: String(r.content),
153
+ active: Number(r.active),
154
+ created_at: String(r.created_at),
155
+ updated_at: String(r.updated_at),
156
+ vector: r.vector ? blobToVector(r.vector) : null,
157
+ created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
158
+ created_by_device: r.created_by_device ? String(r.created_by_device) : null,
159
+ source_session_id: r.source_session_id ? String(r.source_session_id) : null,
160
+ device_id: r.device_id ? String(r.device_id) : null
161
+ }));
162
+ }
163
+ async function listBehaviorsByDomain(agentId, domain) {
164
+ const client = getClient();
165
+ const result = await client.execute({
166
+ sql: `SELECT id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector
167
+ FROM behaviors
168
+ WHERE agent_id = ? AND domain = ? AND active = 1`,
169
+ args: [agentId, domain]
170
+ });
171
+ return result.rows.map((r) => ({
172
+ id: String(r.id),
173
+ agent_id: String(r.agent_id),
174
+ project_name: r.project_name ? String(r.project_name) : null,
175
+ domain: r.domain ? String(r.domain) : null,
176
+ priority: String(r.priority || "p1"),
177
+ content: String(r.content),
178
+ active: Number(r.active),
179
+ created_at: String(r.created_at),
180
+ updated_at: String(r.updated_at),
181
+ vector: r.vector ? blobToVector(r.vector) : null,
182
+ created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
183
+ created_by_device: r.created_by_device ? String(r.created_by_device) : null,
184
+ source_session_id: r.source_session_id ? String(r.source_session_id) : null,
185
+ device_id: r.device_id ? String(r.device_id) : null
186
+ }));
187
+ }
188
+ async function listBehaviorsSince(agentId, sinceIso, projectName, limit = 15) {
189
+ const client = getClient();
190
+ let currentDeviceId = null;
191
+ try {
192
+ const { loadDeviceId } = await import("./lib/license.js");
193
+ currentDeviceId = loadDeviceId() ?? null;
194
+ } catch {
195
+ }
196
+ const result = await client.execute({
197
+ sql: `SELECT id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector, created_by_agent, created_by_device, source_session_id, device_id
198
+ FROM behaviors
199
+ WHERE agent_id = ? AND active = 1
200
+ AND id IS NOT NULL AND trim(coalesce(content, '')) != ''
201
+ AND (project_name IS NULL OR project_name = ?)
202
+ AND (device_id IS NULL OR device_id = ?)
203
+ AND (created_at > ? OR updated_at > ?)
204
+ ORDER BY
205
+ CASE WHEN priority = 'p0' THEN 0
206
+ WHEN priority = 'p1' THEN 1
207
+ ELSE 2 END,
208
+ updated_at DESC
209
+ LIMIT ?`,
210
+ args: [agentId, projectName ?? "", currentDeviceId ?? "", sinceIso, sinceIso, limit]
211
+ });
212
+ return result.rows.map((r) => ({
213
+ id: String(r.id),
214
+ agent_id: String(r.agent_id),
215
+ project_name: r.project_name ? String(r.project_name) : null,
216
+ domain: r.domain ? String(r.domain) : null,
217
+ priority: String(r.priority || "p1"),
218
+ content: String(r.content),
219
+ active: Number(r.active),
220
+ created_at: String(r.created_at),
221
+ updated_at: String(r.updated_at),
222
+ vector: r.vector ? blobToVector(r.vector) : null,
223
+ created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
224
+ created_by_device: r.created_by_device ? String(r.created_by_device) : null,
225
+ source_session_id: r.source_session_id ? String(r.source_session_id) : null,
226
+ device_id: r.device_id ? String(r.device_id) : null
227
+ }));
228
+ }
229
+ async function listSharedSkills(currentAgentId, projectName, limit = 30) {
230
+ const client = getClient();
231
+ let currentDeviceId = null;
232
+ try {
233
+ const { loadDeviceId } = await import("./lib/license.js");
234
+ currentDeviceId = loadDeviceId() ?? null;
235
+ } catch {
236
+ }
237
+ const result = await client.execute({
238
+ sql: `SELECT id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector, created_by_agent, created_by_device, source_session_id, device_id
239
+ FROM behaviors
240
+ WHERE domain = 'skill' AND active = 1
241
+ AND id IS NOT NULL AND trim(coalesce(content, '')) != ''
242
+ AND (project_name IS NULL OR project_name = ?)
243
+ AND (device_id IS NULL OR device_id = ?)
244
+ ORDER BY
245
+ CASE WHEN agent_id = ? THEN 0 ELSE 1 END,
246
+ updated_at DESC
247
+ LIMIT ?`,
248
+ args: [projectName ?? "", currentDeviceId ?? "", currentAgentId, limit]
249
+ });
250
+ return result.rows.map((r) => ({
251
+ id: String(r.id),
252
+ agent_id: String(r.agent_id),
253
+ project_name: r.project_name ? String(r.project_name) : null,
254
+ domain: r.domain ? String(r.domain) : null,
255
+ priority: String(r.priority || "p1"),
256
+ content: String(r.content),
257
+ active: Number(r.active),
258
+ created_at: String(r.created_at),
259
+ updated_at: String(r.updated_at),
260
+ vector: r.vector ? blobToVector(r.vector) : null,
261
+ created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
262
+ created_by_device: r.created_by_device ? String(r.created_by_device) : null,
263
+ source_session_id: r.source_session_id ? String(r.source_session_id) : null,
264
+ device_id: r.device_id ? String(r.device_id) : null,
265
+ shared: String(r.agent_id) !== currentAgentId
266
+ }));
267
+ }
268
+ async function bulkPurgeGhostBehaviors(opts) {
269
+ const client = getClient();
270
+ const batchSize = Math.min(Math.max(opts?.batchSize ?? 5e3, 1), 5e4);
271
+ const maxBatches = Math.max(opts?.maxBatches ?? 1e6, 1);
272
+ let deleted = 0;
273
+ let batches = 0;
274
+ while (batches < maxBatches) {
275
+ const res = await client.execute({
276
+ sql: `DELETE FROM behaviors
277
+ WHERE rowid IN (
278
+ SELECT rowid FROM behaviors
279
+ WHERE ${GHOST_BEHAVIOR_SQL}
280
+ LIMIT ?
281
+ )`,
282
+ args: [batchSize]
283
+ });
284
+ const n = res.rowsAffected ?? 0;
285
+ batches += 1;
286
+ deleted += n;
287
+ opts?.onProgress?.(deleted, batches);
288
+ if (n < batchSize) break;
289
+ }
290
+ let vacuumed = false;
291
+ if (opts?.vacuum && deleted > 0) {
292
+ try {
293
+ await client.execute("VACUUM");
294
+ vacuumed = true;
295
+ } catch {
296
+ }
297
+ }
298
+ return { deleted, batches, vacuumed };
299
+ }
300
+ async function deactivateBehavior(id) {
301
+ const client = getClient();
302
+ const result = await client.execute({
303
+ sql: `UPDATE behaviors SET active = 0, updated_at = ? WHERE id = ? AND active = 1`,
304
+ args: [(/* @__PURE__ */ new Date()).toISOString(), id]
305
+ });
306
+ return (result.rowsAffected ?? 0) > 0;
307
+ }
308
+ async function reactivateBehavior(id) {
309
+ const client = getClient();
310
+ const result = await client.execute({
311
+ sql: `UPDATE behaviors SET active = 1, updated_at = ? WHERE id = ? AND active = 0`,
312
+ args: [(/* @__PURE__ */ new Date()).toISOString(), id]
313
+ });
314
+ return (result.rowsAffected ?? 0) > 0;
315
+ }
316
+
317
+ export {
318
+ GHOST_BEHAVIOR_SQL,
319
+ isGhostBehaviorRow,
320
+ formatReflexContent,
321
+ isReflexBehavior,
322
+ storeReflexBehavior,
323
+ storeBehavior,
324
+ listBehaviors,
325
+ listBehaviorsByDomain,
326
+ listBehaviorsSince,
327
+ listSharedSkills,
328
+ bulkPurgeGhostBehaviors,
329
+ deactivateBehavior,
330
+ reactivateBehavior
331
+ };