@askexenow/exe-os 0.9.271 → 0.9.272
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.
- package/dist/active-agent-BDYXURXQ.js +26 -0
- package/dist/active-agent-YWBGAKGU.js +25 -0
- package/dist/agentic-ontology-56VHSVS3.js +25 -0
- package/dist/backfill-metadata-G46ABBVR.js +597 -0
- package/dist/backfill-metadata-VAV27KJK.js +597 -0
- package/dist/behaviors-USUTDXVA.js +25 -0
- package/dist/bin/agentic-ontology-backfill.js +5 -5
- package/dist/bin/agentic-reflection-backfill.js +6 -6
- package/dist/bin/agentic-semantic-label.js +5 -5
- package/dist/bin/backfill-conversations.js +4 -4
- package/dist/bin/backfill-responses.js +4 -4
- package/dist/bin/backfill-vectors.js +5 -5
- package/dist/bin/bulk-sync-postgres.js +6 -6
- package/dist/bin/cc-doctor.js +4 -4
- package/dist/bin/cleanup-stale-review-tasks.js +10 -10
- package/dist/bin/cli.js +16 -16
- package/dist/bin/exe-agent-config.js +3 -3
- package/dist/bin/exe-agent.js +4 -4
- package/dist/bin/exe-assign.js +5 -5
- package/dist/bin/exe-boot.js +17 -17
- package/dist/bin/exe-call.js +4 -4
- package/dist/bin/exe-cloud.js +4 -4
- package/dist/bin/exe-dispatch.js +10 -10
- package/dist/bin/exe-doctor.js +1 -1
- package/dist/bin/exe-export-behaviors.js +7 -7
- package/dist/bin/exe-forget.js +6 -6
- package/dist/bin/exe-gateway.js +7 -7
- package/dist/bin/exe-healthcheck.js +4 -4
- package/dist/bin/exe-heartbeat.js +10 -10
- package/dist/bin/exe-kill.js +13 -13
- package/dist/bin/exe-launch-agent.js +37 -19
- package/dist/bin/exe-new-employee.js +6 -6
- package/dist/bin/exe-pending-messages.js +11 -11
- package/dist/bin/exe-pending-notifications.js +10 -10
- package/dist/bin/exe-pending-reviews.js +10 -10
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +12 -12
- package/dist/bin/exe-search.js +5 -5
- package/dist/bin/exe-session-cleanup.js +15 -15
- package/dist/bin/exe-settings.js +5 -5
- package/dist/bin/exe-start-codex.js +11 -11
- package/dist/bin/exe-start-opencode.js +8 -8
- package/dist/bin/exe-status.js +11 -11
- package/dist/bin/exe-team.js +3 -3
- package/dist/bin/git-sweep.js +11 -11
- package/dist/bin/graph-backfill.js +4 -4
- package/dist/bin/graph-export.js +5 -5
- package/dist/bin/import-history.js +7 -7
- package/dist/bin/install.js +6 -6
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +4 -4
- package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/scan-tasks.js +10 -10
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +4 -4
- package/dist/capacity-monitor-IFVRCIM7.js +49 -0
- package/dist/capacity-monitor-Q47GBDSY.js +49 -0
- package/dist/catchup-brief-RP4QHXNT.js +151 -0
- package/dist/catchup-brief-TKA6TEK4.js +151 -0
- package/dist/chunk-23KJ2LXY.js +58 -0
- package/dist/chunk-2NQQP3FF.js +630 -0
- package/dist/chunk-3FU5I3KV.js +526 -0
- package/dist/chunk-46IEEKPU.js +13696 -0
- package/dist/chunk-57UAFTO2.js +3958 -0
- package/dist/chunk-5AS622MM.js +3958 -0
- package/dist/chunk-62DEE65H.js +371 -0
- package/dist/chunk-64T6DFSS.js +447 -0
- package/dist/chunk-6BWDP63Z.js +197 -0
- package/dist/chunk-6GPYL7TX.js +214 -0
- package/dist/chunk-6KWLUVFL.js +54 -0
- package/dist/chunk-6N5ISWBF.js +1148 -0
- package/dist/chunk-6OD7PVMC.js +333 -0
- package/dist/chunk-7ET5CYTD.js +382 -0
- package/dist/chunk-7IWLKR6N.js +76 -0
- package/dist/chunk-7OEUOJL5.js +1021 -0
- package/dist/chunk-AIRJTKDK.js +204 -0
- package/dist/chunk-ATJ3NXDP.js +244 -0
- package/dist/chunk-B5IS7LE4.js +128 -0
- package/dist/chunk-BKINEQVI.js +244 -0
- package/dist/chunk-BOJV6NI3.js +128 -0
- package/dist/chunk-BPHWI6N2.js +284 -0
- package/dist/chunk-BXCQWWJP.js +185 -0
- package/dist/chunk-BZ6K7AY3.js +50 -0
- package/dist/chunk-C54KIFLS.js +214 -0
- package/dist/chunk-C6OYEJJI.js +260 -0
- package/dist/chunk-CHBHR5W6.js +3556 -0
- package/dist/chunk-D2T3272U.js +171 -0
- package/dist/chunk-DCHEIVGT.js +221 -0
- package/dist/chunk-DHIBLMSP.js +30 -0
- package/dist/chunk-E2AF2WYY.js +346 -0
- package/dist/chunk-E2KZEZZW.js +1090 -0
- package/dist/chunk-E4KWB4WM.js +348 -0
- package/dist/chunk-ENU7URWK.js +1073 -0
- package/dist/chunk-EZ7KAZMC.js +132 -0
- package/dist/chunk-F4FSSHR4.js +1073 -0
- package/dist/chunk-FPXU56FG.js +346 -0
- package/dist/chunk-FY7HHR5I.js +128 -0
- package/dist/chunk-G2S2UMU4.js +159 -0
- package/dist/chunk-G33BHQCO.js +70 -0
- package/dist/chunk-GJQTL7RX.js +127 -0
- package/dist/chunk-GLCKDEM2.js +97 -0
- package/dist/chunk-GMA34SXV.js +240 -0
- package/dist/chunk-GVAVEBYR.js +2091 -0
- package/dist/chunk-HOSJTLBQ.js +513 -0
- package/dist/chunk-IC6HVAS3.js +56 -0
- package/dist/chunk-IDFJNO44.js +1051 -0
- package/dist/chunk-ILFJMEY5.js +97 -0
- package/dist/chunk-ISQAOSL3.js +1921 -0
- package/dist/chunk-J6V2DCZK.js +382 -0
- package/dist/chunk-JP4CLFLR.js +1148 -0
- package/dist/chunk-JTIOZHWG.js +58 -0
- package/dist/chunk-KDICWAYV.js +1345 -0
- package/dist/chunk-KOBIB6WG.js +159 -0
- package/dist/chunk-KQFDDQB6.js +13696 -0
- package/dist/chunk-KZNSOHCB.js +280 -0
- package/dist/chunk-LVMBYP3C.js +171 -0
- package/dist/chunk-M2WQW5NC.js +227 -0
- package/dist/chunk-MY6SP5NZ.js +551 -0
- package/dist/chunk-N2ACW2ZG.js +363 -0
- package/dist/chunk-NSMJDATI.js +495 -0
- package/dist/chunk-NSQ5JE23.js +1090 -0
- package/dist/chunk-NZL567WG.js +81 -0
- package/dist/chunk-O5OMH6LI.js +244 -0
- package/dist/chunk-OBUV3W7L.js +163 -0
- package/dist/chunk-OLDS7LJN.js +495 -0
- package/dist/chunk-OO2I22RX.js +38 -0
- package/dist/chunk-OPUUT33V.js +447 -0
- package/dist/chunk-OT3VMTKB.js +50 -0
- package/dist/chunk-P6RVIOVA.js +157 -0
- package/dist/chunk-PUA5564C.js +210 -0
- package/dist/chunk-PUQLKLQX.js +731 -0
- package/dist/chunk-QROKS65G.js +76 -0
- package/dist/chunk-R54I2N2T.js +818 -0
- package/dist/chunk-RCFYQHUP.js +818 -0
- package/dist/chunk-RJTND4YS.js +284 -0
- package/dist/chunk-SBLHQMMZ.js +81 -0
- package/dist/chunk-SG2ANG5C.js +123 -0
- package/dist/chunk-SVFNKSZV.js +333 -0
- package/dist/chunk-TAQT2DC7.js +330 -0
- package/dist/chunk-TB7HFW7M.js +127 -0
- package/dist/chunk-UUKDAIH2.js +731 -0
- package/dist/chunk-V6VEFEEH.js +1345 -0
- package/dist/chunk-VIO2ALGH.js +290 -0
- package/dist/chunk-VKCUSNJW.js +377 -0
- package/dist/chunk-VRPPJFIQ.js +1921 -0
- package/dist/chunk-WP3PVBBP.js +204 -0
- package/dist/chunk-WQEUY7DC.js +129 -0
- package/dist/chunk-WXMXUKCA.js +262 -0
- package/dist/chunk-X2WBH2IO.js +297 -0
- package/dist/chunk-X33TSJNO.js +394 -0
- package/dist/chunk-X7MMI2UI.js +89 -0
- package/dist/chunk-XG3BQZIK.js +85 -0
- package/dist/chunk-XIKBIAOS.js +75 -0
- package/dist/chunk-XPEB545Q.js +54 -0
- package/dist/chunk-XWH2MLWS.js +330 -0
- package/dist/chunk-YH7V73XW.js +89 -0
- package/dist/chunk-YMLM5D65.js +135 -0
- package/dist/chunk-YNJPRQ6J.js +377 -0
- package/dist/chunk-YSNEHBI6.js +551 -0
- package/dist/chunk-ZD6BMW2K.js +33 -0
- package/dist/chunk-ZKG5IYCG.js +668 -0
- package/dist/chunk-ZU4K7ZNX.js +197 -0
- package/dist/co-activation-HZMJC34P.js +72 -0
- package/dist/co-occurrence-AVYXRV4L.js +74 -0
- package/dist/core-memory-NPJCVUMF.js +110 -0
- package/dist/core-memory-OKGXL33Z.js +110 -0
- package/dist/crdt-sync-ZCH55JNR.js +33 -0
- package/dist/crm-webhook-6OMVUUGR.js +10 -0
- package/dist/crm-webhook-UCWF3XDB.js +10 -0
- package/dist/cto-delegation-gate-JFZFZGC2.js +206 -0
- package/dist/cto-delegation-gate-K32M4GVM.js +206 -0
- package/dist/daemon-orchestration-2Q7BYOHC.js +135 -0
- package/dist/daemon-orchestration-4RJ2CZJL.js +135 -0
- package/dist/db-backup-5GA2YFDX.js +33 -0
- package/dist/dreaming-I6KXO6E2.js +32 -0
- package/dist/dreaming-NJBK5ILR.js +32 -0
- package/dist/exe-drift-VSMIMHL4.js +68 -0
- package/dist/exe-export-DVHHIA6Y.js +73 -0
- package/dist/exe-export-GIVQDENS.js +73 -0
- package/dist/exe-import-7N46LSMQ.js +76 -0
- package/dist/exe-import-FINYUV5T.js +76 -0
- package/dist/exe-key-H45JY44F.js +579 -0
- package/dist/exe-key-MAEQGTB7.js +579 -0
- package/dist/exe-snapshot-3TEM3BFD.js +164 -0
- package/dist/exe-snapshot-HECGUHL3.js +164 -0
- package/dist/fast-db-init-3CNTADVO.js +7 -0
- package/dist/fast-db-init-HXCS2AP5.js +7 -0
- package/dist/gateway/index.js +8 -8
- package/dist/git-staleness-YCEBBIVK.js +110 -0
- package/dist/git-task-sweep-H34STRNT.js +40 -0
- package/dist/git-task-sweep-YL7NLDCK.js +40 -0
- package/dist/global-procedures-IHZM6C2K.js +20 -0
- package/dist/graph-auto-extract-RZQ3MHP2.js +162 -0
- package/dist/hooks/bug-report-worker.js +12 -12
- package/dist/hooks/codex-stop-task-finalizer.js +12 -12
- package/dist/hooks/commit-complete.js +12 -12
- package/dist/hooks/error-recall.js +6 -6
- package/dist/hooks/exe-heartbeat-hook.js +3 -3
- package/dist/hooks/ingest.js +6 -6
- package/dist/hooks/instructions-loaded.js +4 -4
- package/dist/hooks/manifest.json +19 -19
- package/dist/hooks/notification.js +4 -4
- package/dist/hooks/post-compact.js +11 -11
- package/dist/hooks/post-tool-combined.js +5 -5
- package/dist/hooks/pre-compact.js +12 -12
- package/dist/hooks/pre-tool-use.js +15 -15
- package/dist/hooks/prompt-submit.js +21 -21
- package/dist/hooks/session-end.js +16 -16
- package/dist/hooks/session-start.js +10 -10
- package/dist/hooks/stop.js +15 -15
- package/dist/hooks/subagent-stop.js +11 -11
- package/dist/hooks/summary-worker.js +15 -15
- package/dist/index.js +18 -18
- package/dist/installer-4EW5ZDGD.js +296 -0
- package/dist/installer-B2JTQO55.js +38 -0
- package/dist/installer-MIL352T7.js +342 -0
- package/dist/lib/agent-config.js +9 -3
- package/dist/lib/cloud-sync.js +4 -4
- package/dist/lib/consolidation.js +5 -5
- package/dist/lib/database.js +2 -2
- package/dist/lib/db.js +2 -2
- package/dist/lib/employee-templates.js +4 -4
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon.js +34 -34
- package/dist/lib/hybrid-search.js +5 -5
- package/dist/lib/identity.js +2 -2
- package/dist/lib/messaging.js +10 -10
- package/dist/lib/reminders.js +3 -3
- package/dist/lib/schedules.js +5 -5
- package/dist/lib/session-registry.js +4 -4
- package/dist/lib/skill-learning.js +4 -4
- package/dist/lib/store.js +4 -4
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +11 -11
- package/dist/lib/tmux-routing.js +9 -9
- package/dist/lib/token-spend.js +3 -3
- package/dist/mcp/register-tools.js +54 -54
- package/dist/mcp/server.js +55 -55
- package/dist/mcp/tools/complete-reminder.js +4 -4
- package/dist/mcp/tools/create-reminder.js +4 -4
- package/dist/mcp/tools/create-task.js +13 -13
- package/dist/mcp/tools/deactivate-behavior.js +5 -5
- package/dist/mcp/tools/list-reminders.js +4 -4
- package/dist/mcp/tools/list-tasks.js +13 -13
- package/dist/mcp/tools/send-message.js +12 -12
- package/dist/mcp/tools/update-task.js +12 -12
- package/dist/mcp-http-config-OJQR246S.js +27 -0
- package/dist/memory-cards-IPULSQFA.js +174 -0
- package/dist/memory-graph-extractor-3TZZOKHY.js +17 -0
- package/dist/memory-poisoning-defense-SGUGR5YJ.js +225 -0
- package/dist/memory-reflection-H3WGCEM6.js +238 -0
- package/dist/notifications-VWPO6NJF.js +45 -0
- package/dist/notifications-WCSRQN2V.js +45 -0
- package/dist/orchestration-events-O5PSDEIO.js +25 -0
- package/dist/orchestrator-RAPEJUOI.js +33 -0
- package/dist/orchestrator-XPG6LJAI.js +33 -0
- package/dist/pipeline-router-5NT6FUC3.js +13 -0
- package/dist/pipeline-router-KSUXONDT.js +13 -0
- package/dist/plan-limits-53NXLNDQ.js +26 -0
- package/dist/project-boot-ITN3FZMM.js +299 -0
- package/dist/projection-worker-27XX5M2W.js +964 -0
- package/dist/reranker-GU7L2PJX.js +19 -0
- package/dist/reranker-TZEXIJAN.js +19 -0
- package/dist/review-polling-FA2J2Q5O.js +124 -0
- package/dist/review-polling-MLS4BQ3N.js +124 -0
- package/dist/runtime/index.js +12 -12
- package/dist/session-events-WWGF3B2N.js +36 -0
- package/dist/session-events-ZHXXAH6B.js +36 -0
- package/dist/session-kill-telemetry-O4TJHHOZ.js +29 -0
- package/dist/session-scope-CQXB7VMH.js +86 -0
- package/dist/session-scope-HHUMJYF6.js +86 -0
- package/dist/setup-wizard-UM2RHSBJ.js +12 -0
- package/dist/skill-refinement-MJPOHYD5.js +157 -0
- package/dist/skill-refinement-NVUBRK22.js +157 -0
- package/dist/stack-release-BAPCXMXW.js +713 -0
- package/dist/stack-release-W4TWTEZP.js +731 -0
- package/dist/steward-gate-VLE7OCKO.js +13 -0
- package/dist/task-enforcement-FUHDL6UR.js +391 -0
- package/dist/task-enforcement-QL3K4N3F.js +391 -0
- package/dist/task-scope-TZYMB634.js +35 -0
- package/dist/task-scope-ZVLUBS4C.js +35 -0
- package/dist/tasks-crud-4MSLJWXE.js +77 -0
- package/dist/tasks-crud-HIPXKRKX.js +77 -0
- package/dist/tasks-notify-7JBUNE7R.js +38 -0
- package/dist/tasks-notify-UPIJ3L4O.js +38 -0
- package/dist/tasks-review-5SJSFTUB.js +47 -0
- package/dist/tasks-review-JHSYBR5I.js +47 -0
- package/dist/telemetry-upload-BSGOXGUP.js +739 -0
- package/dist/telemetry-upload-LTX3C5HZ.js +739 -0
- package/dist/token-budget-2CDWQU3Q.js +84 -0
- package/dist/tool-telemetry-7YS7EN7B.js +17 -0
- package/dist/tui/App.js +17 -17
- package/dist/tui-data-GDGBOS6G.js +258 -0
- package/dist/tui-data-VXF2RBVM.js +258 -0
- package/dist/wiki-acl-MJIMXRQV.js +111 -0
- package/dist/worker-gate-WQGTZOSM.js +21 -0
- package/dist/worker-gate-X2YDTKTL.js +21 -0
- package/dist/workflow-engine-CYXRZXBM.js +28 -0
- package/dist/workflow-engine-KMLAXVA4.js +28 -0
- package/dist/worktree-NLSKVRNC.js +26 -0
- package/dist/worktree-sweep-44TMEPLE.js +19 -0
- package/package.json +1 -1
- package/release-notes.json +24 -19
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// src/bin/fast-db-init.ts
|
|
2
|
+
async function fastDbInit() {
|
|
3
|
+
const { isInitialized, getClient, setExternalClient } = await import("./lib/database.js");
|
|
4
|
+
if (isInitialized()) {
|
|
5
|
+
return getClient();
|
|
6
|
+
}
|
|
7
|
+
const forceDirect = process.env.EXE_DB_DIRECT === "1" || process.env.EXE_DB_READONLY === "1" || process.env.EXE_SKIP_DAEMON === "1";
|
|
8
|
+
if (!forceDirect) {
|
|
9
|
+
try {
|
|
10
|
+
const { connectEmbedDaemon, sendDaemonRequest, isClientConnected, disconnectClient } = await import("./lib/exe-daemon-client.js");
|
|
11
|
+
const { deserializeResultSet } = await import("./daemon-protocol-XW2OLNBS.js");
|
|
12
|
+
await Promise.race([
|
|
13
|
+
connectEmbedDaemon(),
|
|
14
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("Daemon socket timeout (2s)")), 2e3))
|
|
15
|
+
]);
|
|
16
|
+
if (isClientConnected()) {
|
|
17
|
+
const daemonClient = {
|
|
18
|
+
async execute(stmt) {
|
|
19
|
+
const sql = typeof stmt === "string" ? stmt : stmt.sql;
|
|
20
|
+
const args = typeof stmt === "string" ? [] : Array.isArray(stmt.args) ? stmt.args : [];
|
|
21
|
+
const resp = await sendDaemonRequest({ type: "db-execute", sql, args });
|
|
22
|
+
if (resp.error) throw new Error(String(resp.error));
|
|
23
|
+
if (resp.db) return deserializeResultSet(resp.db);
|
|
24
|
+
throw new Error("Unexpected daemon response");
|
|
25
|
+
},
|
|
26
|
+
async batch(stmts, mode) {
|
|
27
|
+
const statements = stmts.map((s) => {
|
|
28
|
+
const sql = typeof s === "string" ? s : s.sql;
|
|
29
|
+
const args = typeof s === "string" ? [] : Array.isArray(s.args) ? s.args : [];
|
|
30
|
+
return { sql, args };
|
|
31
|
+
});
|
|
32
|
+
const resp = await sendDaemonRequest({ type: "db-batch", statements, mode: mode ?? "deferred" });
|
|
33
|
+
if (resp.error) throw new Error(String(resp.error));
|
|
34
|
+
const batchResults = resp["db-batch"];
|
|
35
|
+
if (batchResults) return batchResults.map(deserializeResultSet);
|
|
36
|
+
throw new Error("Unexpected daemon batch response");
|
|
37
|
+
},
|
|
38
|
+
async transaction(_mode) {
|
|
39
|
+
throw new Error("Transactions not supported via daemon socket");
|
|
40
|
+
},
|
|
41
|
+
async executeMultiple(_sql) {
|
|
42
|
+
throw new Error("executeMultiple not supported via daemon socket");
|
|
43
|
+
},
|
|
44
|
+
async migrate(_stmts) {
|
|
45
|
+
throw new Error("migrate not supported via daemon socket");
|
|
46
|
+
},
|
|
47
|
+
sync() {
|
|
48
|
+
return Promise.resolve(void 0);
|
|
49
|
+
},
|
|
50
|
+
close() {
|
|
51
|
+
},
|
|
52
|
+
get closed() {
|
|
53
|
+
return false;
|
|
54
|
+
},
|
|
55
|
+
get protocol() {
|
|
56
|
+
return "file";
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
await daemonClient.execute("SELECT 1");
|
|
61
|
+
} catch {
|
|
62
|
+
try {
|
|
63
|
+
disconnectClient();
|
|
64
|
+
} catch {
|
|
65
|
+
}
|
|
66
|
+
throw new Error("Daemon socket validation failed");
|
|
67
|
+
}
|
|
68
|
+
setExternalClient(daemonClient);
|
|
69
|
+
return daemonClient;
|
|
70
|
+
}
|
|
71
|
+
} catch {
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const { initStore } = await import("./lib/store.js");
|
|
75
|
+
await initStore({ lightweight: true });
|
|
76
|
+
return getClient();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export {
|
|
80
|
+
fastDbInit
|
|
81
|
+
};
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getClient
|
|
3
|
+
} from "./chunk-CHBHR5W6.js";
|
|
4
|
+
|
|
5
|
+
// src/lib/behaviors.ts
|
|
6
|
+
import crypto from "crypto";
|
|
7
|
+
async function storeBehavior(opts) {
|
|
8
|
+
try {
|
|
9
|
+
const { loadEmployeesSync, baseAgentName } = await import("./lib/employees.js");
|
|
10
|
+
const roster = loadEmployeesSync();
|
|
11
|
+
if (roster.length > 0) {
|
|
12
|
+
const base = baseAgentName(opts.agentId, roster);
|
|
13
|
+
if (!roster.some((e) => e.name === opts.agentId || e.name === base)) {
|
|
14
|
+
process.stderr.write(
|
|
15
|
+
`[behaviors] WARNING: Agent "${opts.agentId}" not found in roster. Storing behavior anyway \u2014 may be orphaned.
|
|
16
|
+
`
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
} catch {
|
|
21
|
+
}
|
|
22
|
+
const client = getClient();
|
|
23
|
+
const id = crypto.randomUUID();
|
|
24
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
25
|
+
const duplicate = await client.execute({
|
|
26
|
+
sql: `SELECT id FROM behaviors
|
|
27
|
+
WHERE agent_id = ?
|
|
28
|
+
AND COALESCE(domain, '') = COALESCE(?, '')
|
|
29
|
+
AND COALESCE(project_name, '') = COALESCE(?, '')
|
|
30
|
+
AND active = 1
|
|
31
|
+
AND lower(trim(content)) = lower(trim(?))
|
|
32
|
+
ORDER BY updated_at DESC
|
|
33
|
+
LIMIT 1`,
|
|
34
|
+
args: [opts.agentId, opts.domain ?? null, opts.projectName ?? null, opts.content]
|
|
35
|
+
});
|
|
36
|
+
const existingId = duplicate.rows[0]?.id;
|
|
37
|
+
if (existingId) return String(existingId);
|
|
38
|
+
let vector = null;
|
|
39
|
+
if (!process.env.VITEST) {
|
|
40
|
+
try {
|
|
41
|
+
const { embed } = await import("./lib/embedder.js");
|
|
42
|
+
const vec = await embed(opts.content);
|
|
43
|
+
vector = new Float32Array(vec);
|
|
44
|
+
} catch {
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
let createdByDevice = null;
|
|
48
|
+
try {
|
|
49
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
50
|
+
createdByDevice = loadDeviceId() ?? null;
|
|
51
|
+
} catch {
|
|
52
|
+
}
|
|
53
|
+
const createdByAgent = process.env.AGENT_ID ?? null;
|
|
54
|
+
const sourceSessionId = process.env.CLAUDE_SESSION_ID ?? process.env.SESSION_ID ?? null;
|
|
55
|
+
let deviceId = null;
|
|
56
|
+
if (opts.deviceScoped) {
|
|
57
|
+
try {
|
|
58
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
59
|
+
deviceId = loadDeviceId() ?? null;
|
|
60
|
+
} catch {
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
await client.execute({
|
|
64
|
+
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)
|
|
65
|
+
VALUES (?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?)`,
|
|
66
|
+
args: [id, opts.agentId, opts.projectName ?? null, opts.domain ?? null, opts.priority ?? "p1", opts.content, now, now, vector ? vector.buffer : null, createdByAgent, createdByDevice, sourceSessionId, deviceId]
|
|
67
|
+
});
|
|
68
|
+
return id;
|
|
69
|
+
}
|
|
70
|
+
async function listBehaviors(agentId, projectName, limit = 30) {
|
|
71
|
+
const client = getClient();
|
|
72
|
+
let currentDeviceId = null;
|
|
73
|
+
try {
|
|
74
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
75
|
+
currentDeviceId = loadDeviceId() ?? null;
|
|
76
|
+
} catch {
|
|
77
|
+
}
|
|
78
|
+
const result = await client.execute({
|
|
79
|
+
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
|
|
80
|
+
FROM behaviors
|
|
81
|
+
WHERE agent_id = ? AND active = 1
|
|
82
|
+
AND (project_name IS NULL OR project_name = ?)
|
|
83
|
+
AND (device_id IS NULL OR device_id = ?)
|
|
84
|
+
ORDER BY
|
|
85
|
+
CASE WHEN priority = 'p0' THEN 0
|
|
86
|
+
WHEN priority = 'p1' THEN 1
|
|
87
|
+
ELSE 2 END,
|
|
88
|
+
CASE
|
|
89
|
+
WHEN lower(coalesce(domain, '')) IN ('identity', 'title', 'role') THEN 0
|
|
90
|
+
WHEN lower(content) LIKE '%identity%' THEN 0
|
|
91
|
+
WHEN lower(content) LIKE '%title%' THEN 0
|
|
92
|
+
WHEN lower(content) LIKE '%who are you%' THEN 0
|
|
93
|
+
ELSE 1
|
|
94
|
+
END,
|
|
95
|
+
updated_at DESC
|
|
96
|
+
LIMIT ?`,
|
|
97
|
+
args: [agentId, projectName ?? "", currentDeviceId ?? "", limit]
|
|
98
|
+
});
|
|
99
|
+
return result.rows.map((r) => ({
|
|
100
|
+
id: String(r.id),
|
|
101
|
+
agent_id: String(r.agent_id),
|
|
102
|
+
project_name: r.project_name ? String(r.project_name) : null,
|
|
103
|
+
domain: r.domain ? String(r.domain) : null,
|
|
104
|
+
priority: String(r.priority || "p1"),
|
|
105
|
+
content: String(r.content),
|
|
106
|
+
active: Number(r.active),
|
|
107
|
+
created_at: String(r.created_at),
|
|
108
|
+
updated_at: String(r.updated_at),
|
|
109
|
+
vector: r.vector ? Array.from(new Float32Array(r.vector)) : null,
|
|
110
|
+
created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
|
|
111
|
+
created_by_device: r.created_by_device ? String(r.created_by_device) : null,
|
|
112
|
+
source_session_id: r.source_session_id ? String(r.source_session_id) : null,
|
|
113
|
+
device_id: r.device_id ? String(r.device_id) : null
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
async function listBehaviorsByDomain(agentId, domain) {
|
|
117
|
+
const client = getClient();
|
|
118
|
+
const result = await client.execute({
|
|
119
|
+
sql: `SELECT id, agent_id, project_name, domain, priority, content, active, created_at, updated_at, vector
|
|
120
|
+
FROM behaviors
|
|
121
|
+
WHERE agent_id = ? AND domain = ? AND active = 1`,
|
|
122
|
+
args: [agentId, domain]
|
|
123
|
+
});
|
|
124
|
+
return result.rows.map((r) => ({
|
|
125
|
+
id: String(r.id),
|
|
126
|
+
agent_id: String(r.agent_id),
|
|
127
|
+
project_name: r.project_name ? String(r.project_name) : null,
|
|
128
|
+
domain: r.domain ? String(r.domain) : null,
|
|
129
|
+
priority: String(r.priority || "p1"),
|
|
130
|
+
content: String(r.content),
|
|
131
|
+
active: Number(r.active),
|
|
132
|
+
created_at: String(r.created_at),
|
|
133
|
+
updated_at: String(r.updated_at),
|
|
134
|
+
vector: r.vector ? Array.from(new Float32Array(r.vector)) : null,
|
|
135
|
+
created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
|
|
136
|
+
created_by_device: r.created_by_device ? String(r.created_by_device) : null,
|
|
137
|
+
source_session_id: r.source_session_id ? String(r.source_session_id) : null,
|
|
138
|
+
device_id: r.device_id ? String(r.device_id) : null
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
async function listBehaviorsSince(agentId, sinceIso, projectName, limit = 15) {
|
|
142
|
+
const client = getClient();
|
|
143
|
+
let currentDeviceId = null;
|
|
144
|
+
try {
|
|
145
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
146
|
+
currentDeviceId = loadDeviceId() ?? null;
|
|
147
|
+
} catch {
|
|
148
|
+
}
|
|
149
|
+
const result = await client.execute({
|
|
150
|
+
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
|
|
151
|
+
FROM behaviors
|
|
152
|
+
WHERE agent_id = ? AND active = 1
|
|
153
|
+
AND (project_name IS NULL OR project_name = ?)
|
|
154
|
+
AND (device_id IS NULL OR device_id = ?)
|
|
155
|
+
AND (created_at > ? OR updated_at > ?)
|
|
156
|
+
ORDER BY
|
|
157
|
+
CASE WHEN priority = 'p0' THEN 0
|
|
158
|
+
WHEN priority = 'p1' THEN 1
|
|
159
|
+
ELSE 2 END,
|
|
160
|
+
updated_at DESC
|
|
161
|
+
LIMIT ?`,
|
|
162
|
+
args: [agentId, projectName ?? "", currentDeviceId ?? "", sinceIso, sinceIso, limit]
|
|
163
|
+
});
|
|
164
|
+
return result.rows.map((r) => ({
|
|
165
|
+
id: String(r.id),
|
|
166
|
+
agent_id: String(r.agent_id),
|
|
167
|
+
project_name: r.project_name ? String(r.project_name) : null,
|
|
168
|
+
domain: r.domain ? String(r.domain) : null,
|
|
169
|
+
priority: String(r.priority || "p1"),
|
|
170
|
+
content: String(r.content),
|
|
171
|
+
active: Number(r.active),
|
|
172
|
+
created_at: String(r.created_at),
|
|
173
|
+
updated_at: String(r.updated_at),
|
|
174
|
+
vector: r.vector ? Array.from(new Float32Array(r.vector)) : null,
|
|
175
|
+
created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
|
|
176
|
+
created_by_device: r.created_by_device ? String(r.created_by_device) : null,
|
|
177
|
+
source_session_id: r.source_session_id ? String(r.source_session_id) : null,
|
|
178
|
+
device_id: r.device_id ? String(r.device_id) : null
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
async function listSharedSkills(currentAgentId, projectName, limit = 30) {
|
|
182
|
+
const client = getClient();
|
|
183
|
+
let currentDeviceId = null;
|
|
184
|
+
try {
|
|
185
|
+
const { loadDeviceId } = await import("./lib/license.js");
|
|
186
|
+
currentDeviceId = loadDeviceId() ?? null;
|
|
187
|
+
} catch {
|
|
188
|
+
}
|
|
189
|
+
const result = await client.execute({
|
|
190
|
+
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
|
|
191
|
+
FROM behaviors
|
|
192
|
+
WHERE domain = 'skill' AND active = 1
|
|
193
|
+
AND (project_name IS NULL OR project_name = ?)
|
|
194
|
+
AND (device_id IS NULL OR device_id = ?)
|
|
195
|
+
ORDER BY
|
|
196
|
+
CASE WHEN agent_id = ? THEN 0 ELSE 1 END,
|
|
197
|
+
updated_at DESC
|
|
198
|
+
LIMIT ?`,
|
|
199
|
+
args: [projectName ?? "", currentDeviceId ?? "", currentAgentId, limit]
|
|
200
|
+
});
|
|
201
|
+
return result.rows.map((r) => ({
|
|
202
|
+
id: String(r.id),
|
|
203
|
+
agent_id: String(r.agent_id),
|
|
204
|
+
project_name: r.project_name ? String(r.project_name) : null,
|
|
205
|
+
domain: r.domain ? String(r.domain) : null,
|
|
206
|
+
priority: String(r.priority || "p1"),
|
|
207
|
+
content: String(r.content),
|
|
208
|
+
active: Number(r.active),
|
|
209
|
+
created_at: String(r.created_at),
|
|
210
|
+
updated_at: String(r.updated_at),
|
|
211
|
+
vector: r.vector ? Array.from(new Float32Array(r.vector)) : null,
|
|
212
|
+
created_by_agent: r.created_by_agent ? String(r.created_by_agent) : null,
|
|
213
|
+
created_by_device: r.created_by_device ? String(r.created_by_device) : null,
|
|
214
|
+
source_session_id: r.source_session_id ? String(r.source_session_id) : null,
|
|
215
|
+
device_id: r.device_id ? String(r.device_id) : null,
|
|
216
|
+
shared: String(r.agent_id) !== currentAgentId
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
async function deactivateBehavior(id) {
|
|
220
|
+
const client = getClient();
|
|
221
|
+
const result = await client.execute({
|
|
222
|
+
sql: `UPDATE behaviors SET active = 0, updated_at = ? WHERE id = ? AND active = 1`,
|
|
223
|
+
args: [(/* @__PURE__ */ new Date()).toISOString(), id]
|
|
224
|
+
});
|
|
225
|
+
return (result.rowsAffected ?? 0) > 0;
|
|
226
|
+
}
|
|
227
|
+
async function reactivateBehavior(id) {
|
|
228
|
+
const client = getClient();
|
|
229
|
+
const result = await client.execute({
|
|
230
|
+
sql: `UPDATE behaviors SET active = 1, updated_at = ? WHERE id = ? AND active = 0`,
|
|
231
|
+
args: [(/* @__PURE__ */ new Date()).toISOString(), id]
|
|
232
|
+
});
|
|
233
|
+
return (result.rowsAffected ?? 0) > 0;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export {
|
|
237
|
+
storeBehavior,
|
|
238
|
+
listBehaviors,
|
|
239
|
+
listBehaviorsByDomain,
|
|
240
|
+
listBehaviorsSince,
|
|
241
|
+
listSharedSkills,
|
|
242
|
+
deactivateBehavior,
|
|
243
|
+
reactivateBehavior
|
|
244
|
+
};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import {
|
|
2
|
+
recordOrchestrationEventBestEffort
|
|
3
|
+
} from "./chunk-2NQQP3FF.js";
|
|
4
|
+
|
|
5
|
+
// src/lib/session-registry.ts
|
|
6
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
|
|
7
|
+
import { execSync } from "child_process";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import os from "os";
|
|
10
|
+
var REGISTRY_PATH = path.join(os.homedir(), ".exe-os", "session-registry.json");
|
|
11
|
+
function registerSession(entry) {
|
|
12
|
+
const dir = path.dirname(REGISTRY_PATH);
|
|
13
|
+
if (!existsSync(dir)) {
|
|
14
|
+
mkdirSync(dir, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
const sessions = listSessions();
|
|
17
|
+
const idx = sessions.findIndex((s) => s.windowName === entry.windowName);
|
|
18
|
+
if (idx >= 0) {
|
|
19
|
+
sessions[idx] = entry;
|
|
20
|
+
} else {
|
|
21
|
+
sessions.push(entry);
|
|
22
|
+
}
|
|
23
|
+
writeFileSync(REGISTRY_PATH, JSON.stringify(sessions, null, 2));
|
|
24
|
+
recordOrchestrationEventBestEffort({
|
|
25
|
+
eventType: "registry.registered",
|
|
26
|
+
source: "session-registry.registerSession",
|
|
27
|
+
agentId: entry.agentId,
|
|
28
|
+
sessionScope: entry.parentExe,
|
|
29
|
+
tmuxSession: entry.windowName,
|
|
30
|
+
payload: { hasProjectDir: Boolean(entry.projectDir) }
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function refreshSessionProject(windowName, projectDir) {
|
|
34
|
+
const sessions = listSessions();
|
|
35
|
+
const entry = sessions.find((s) => s.windowName === windowName);
|
|
36
|
+
if (!entry || entry.projectDir === projectDir) return;
|
|
37
|
+
entry.projectDir = projectDir;
|
|
38
|
+
try {
|
|
39
|
+
writeFileSync(REGISTRY_PATH, JSON.stringify(sessions, null, 2));
|
|
40
|
+
} catch {
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function listSessions() {
|
|
44
|
+
try {
|
|
45
|
+
const raw = readFileSync(REGISTRY_PATH, "utf8");
|
|
46
|
+
return JSON.parse(raw);
|
|
47
|
+
} catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function pruneStaleSessions() {
|
|
52
|
+
const sessions = listSessions();
|
|
53
|
+
if (sessions.length === 0) return 0;
|
|
54
|
+
let liveSessions = [];
|
|
55
|
+
try {
|
|
56
|
+
liveSessions = execSync("tmux list-sessions -F '#{session_name}' 2>/dev/null", {
|
|
57
|
+
encoding: "utf8"
|
|
58
|
+
}).trim().split("\n").filter(Boolean);
|
|
59
|
+
} catch {
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
const liveSet = new Set(liveSessions);
|
|
63
|
+
const alive = sessions.filter((s) => liveSet.has(s.windowName));
|
|
64
|
+
const staleSessions = sessions.filter((s) => !liveSet.has(s.windowName));
|
|
65
|
+
if (staleSessions.length > 0) {
|
|
66
|
+
recordOrchestrationEventBestEffort({
|
|
67
|
+
eventType: "registry.missing_tmux",
|
|
68
|
+
source: "session-registry.pruneStaleSessions",
|
|
69
|
+
severity: "warn",
|
|
70
|
+
attempt: staleSessions.length,
|
|
71
|
+
payload: {
|
|
72
|
+
count: staleSessions.length,
|
|
73
|
+
examples: staleSessions.slice(0, 5).map((s) => s.windowName)
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const pruned = sessions.length - alive.length;
|
|
78
|
+
if (pruned > 0) {
|
|
79
|
+
writeFileSync(REGISTRY_PATH, JSON.stringify(alive, null, 2));
|
|
80
|
+
}
|
|
81
|
+
return pruned;
|
|
82
|
+
}
|
|
83
|
+
function checkSessionRegistryConsistency(liveSessionsOverride) {
|
|
84
|
+
const sessions = listSessions();
|
|
85
|
+
const result = { missingTmux: 0, missingRegistry: 0 };
|
|
86
|
+
let liveSessions = liveSessionsOverride;
|
|
87
|
+
if (!liveSessions) {
|
|
88
|
+
try {
|
|
89
|
+
liveSessions = execSync("tmux list-sessions -F '#{session_name}' 2>/dev/null", {
|
|
90
|
+
encoding: "utf8"
|
|
91
|
+
}).trim().split("\n").filter(Boolean);
|
|
92
|
+
} catch {
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const liveSet = new Set(liveSessions);
|
|
97
|
+
const registeredSet = new Set(sessions.map((s) => s.windowName));
|
|
98
|
+
const missingTmuxExamples = [];
|
|
99
|
+
const missingRegistryExamples = [];
|
|
100
|
+
for (const entry of sessions) {
|
|
101
|
+
if (liveSet.has(entry.windowName)) continue;
|
|
102
|
+
result.missingTmux++;
|
|
103
|
+
if (missingTmuxExamples.length < 5) missingTmuxExamples.push(entry.windowName);
|
|
104
|
+
}
|
|
105
|
+
for (const live of liveSessions) {
|
|
106
|
+
if (registeredSet.has(live)) continue;
|
|
107
|
+
if (!looksLikeExeOsSession(live)) continue;
|
|
108
|
+
result.missingRegistry++;
|
|
109
|
+
if (missingRegistryExamples.length < 5) missingRegistryExamples.push(live);
|
|
110
|
+
}
|
|
111
|
+
if (result.missingTmux > 0) {
|
|
112
|
+
recordOrchestrationEventBestEffort({
|
|
113
|
+
eventType: "registry.missing_tmux",
|
|
114
|
+
source: "session-registry.checkSessionRegistryConsistency",
|
|
115
|
+
severity: "warn",
|
|
116
|
+
attempt: result.missingTmux,
|
|
117
|
+
payload: {
|
|
118
|
+
count: result.missingTmux,
|
|
119
|
+
examples: missingTmuxExamples
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (result.missingRegistry > 0) {
|
|
124
|
+
recordOrchestrationEventBestEffort({
|
|
125
|
+
eventType: "registry.missing_entry",
|
|
126
|
+
source: "session-registry.checkSessionRegistryConsistency",
|
|
127
|
+
severity: "warn",
|
|
128
|
+
attempt: result.missingRegistry,
|
|
129
|
+
payload: {
|
|
130
|
+
count: result.missingRegistry,
|
|
131
|
+
examples: missingRegistryExamples
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
function looksLikeExeOsSession(sessionName) {
|
|
138
|
+
const coordName = getCoordinatorNameCached();
|
|
139
|
+
const escaped = coordName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
140
|
+
const coordPattern = new RegExp(`^${escaped}\\d*$`);
|
|
141
|
+
const employeePattern = new RegExp(`-${escaped}\\d*$`);
|
|
142
|
+
return coordPattern.test(sessionName) || employeePattern.test(sessionName);
|
|
143
|
+
}
|
|
144
|
+
function getCoordinatorNameCached() {
|
|
145
|
+
try {
|
|
146
|
+
const rosterPath = path.join(os.homedir(), ".exe-os", "exe-employees.json");
|
|
147
|
+
if (existsSync(rosterPath)) {
|
|
148
|
+
const roster = JSON.parse(readFileSync(rosterPath, "utf8"));
|
|
149
|
+
const coo = roster.find((e) => (e.role ?? "").toUpperCase() === "COO");
|
|
150
|
+
if (coo?.name) return coo.name;
|
|
151
|
+
}
|
|
152
|
+
} catch {
|
|
153
|
+
}
|
|
154
|
+
return "exe";
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export {
|
|
158
|
+
registerSession,
|
|
159
|
+
refreshSessionProject,
|
|
160
|
+
listSessions,
|
|
161
|
+
pruneStaleSessions,
|
|
162
|
+
checkSessionRegistryConsistency
|
|
163
|
+
};
|