@askexenow/exe-os 0.9.117 → 0.9.118

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 (39) hide show
  1. package/deploy/compose/.env.example +1 -1
  2. package/deploy/compose/docker-compose.yml +6 -6
  3. package/deploy/compose/generate-env.ts +1 -1
  4. package/dist/bin/cli.js +9 -8
  5. package/dist/bin/exe-boot.js +8 -6
  6. package/dist/bin/exe-dispatch.js +8 -6
  7. package/dist/bin/exe-gateway.js +12 -12
  8. package/dist/bin/exe-search.js +4 -2
  9. package/dist/bin/exe-session-cleanup.js +8 -6
  10. package/dist/bin/git-sweep.js +8 -6
  11. package/dist/bin/graph-backfill.js +3 -5
  12. package/dist/bin/intercom-check.js +8 -6
  13. package/dist/bin/scan-tasks.js +8 -6
  14. package/dist/gateway/index.js +12 -12
  15. package/dist/hooks/bug-report-worker.js +8 -6
  16. package/dist/hooks/codex-stop-task-finalizer.js +8 -6
  17. package/dist/hooks/commit-complete.js +8 -6
  18. package/dist/hooks/error-recall.js +4 -2
  19. package/dist/hooks/ingest.js +8 -6
  20. package/dist/hooks/post-tool-combined.js +4 -2
  21. package/dist/hooks/pre-compact.js +8 -6
  22. package/dist/hooks/prompt-submit.js +12 -8
  23. package/dist/hooks/session-end.js +8 -6
  24. package/dist/hooks/session-start.js +4 -2
  25. package/dist/index.js +12 -12
  26. package/dist/lib/exe-daemon.js +12 -12
  27. package/dist/lib/hybrid-search.js +4 -2
  28. package/dist/lib/messaging.js +1 -1
  29. package/dist/lib/skill-learning.js +7 -5
  30. package/dist/lib/tasks.js +8 -6
  31. package/dist/lib/tmux-routing.js +8 -6
  32. package/dist/mcp/register-tools.js +32277 -0
  33. package/dist/mcp/server.js +16 -10
  34. package/dist/mcp/tools/create-task.js +8 -6
  35. package/dist/mcp/tools/send-message.js +1 -1
  36. package/dist/mcp/tools/update-task.js +8 -6
  37. package/dist/runtime/index.js +8 -6
  38. package/dist/tui/App.js +8 -6
  39. package/package.json +1 -1
@@ -43,7 +43,7 @@ EXE_GATEWAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_AUTH_TOKEN
43
43
  EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_WS_RELAY_AUTH_TOKEN
44
44
  EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=CHANGEME_EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN
45
45
  # SET_MANUALLY
46
- WHATSAPP_ACCESS_TOKEN=
46
+ WHATSAPP_ACCESS_TOKEN=CHANGEME_WHATSAPP_ACCESS_TOKEN
47
47
  API_ROUTER_URL=https://gateway.askexe.com
48
48
  API_ROUTER_KEY=CHANGEME_API_ROUTER_KEY
49
49
  # BYOK: to use your own API keys instead of the Exe API Router,
@@ -108,7 +108,7 @@ services:
108
108
  # ------------------------------------------------------------------
109
109
 
110
110
  exe-crm:
111
- image: ${CRM_IMAGE_TAG:-registry.askexe.com/askexe/exe-crm:v0.9.3}
111
+ image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.2}
112
112
  container_name: exe-crm
113
113
  restart: unless-stopped
114
114
  depends_on:
@@ -154,7 +154,7 @@ services:
154
154
  options: { max-size: "10m", max-file: "3" }
155
155
 
156
156
  exe-crm-worker:
157
- image: ${CRM_IMAGE_TAG:-registry.askexe.com/askexe/exe-crm:v0.9.3}
157
+ image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.2}
158
158
  container_name: exe-crm-worker
159
159
  restart: unless-stopped
160
160
  command: ["yarn", "worker:prod"]
@@ -194,7 +194,7 @@ services:
194
194
  options: { max-size: "10m", max-file: "3" }
195
195
 
196
196
  exe-wiki:
197
- image: ${WIKI_IMAGE_TAG:-registry.askexe.com/askexe/exe-wiki:v0.9.3}
197
+ image: ${WIKI_IMAGE_TAG:-ghcr.io/askexe/exe-wiki:v0.9.2}
198
198
  container_name: exe-wiki
199
199
  restart: unless-stopped
200
200
  depends_on:
@@ -236,7 +236,7 @@ services:
236
236
  options: { max-size: "10m", max-file: "3" }
237
237
 
238
238
  exed:
239
- image: ${EXED_IMAGE_TAG:-registry.askexe.com/askexe/exed:v0.9.7}
239
+ image: ${EXED_IMAGE_TAG:-ghcr.io/askexe/exed:v0.9.2}
240
240
  container_name: exed
241
241
  restart: unless-stopped
242
242
  env_file:
@@ -272,7 +272,7 @@ services:
272
272
  options: { max-size: "10m", max-file: "3" }
273
273
 
274
274
  exe-gateway:
275
- image: ${GATEWAY_IMAGE_TAG:-registry.askexe.com/askexe/exe-gateway:v0.9.3}
275
+ image: ${GATEWAY_IMAGE_TAG:-ghcr.io/askexe/exe-gateway:v0.9.2}
276
276
  container_name: exe-gateway
277
277
  restart: unless-stopped
278
278
  depends_on:
@@ -322,7 +322,7 @@ services:
322
322
  options: { max-size: "10m", max-file: "3" }
323
323
 
324
324
  exe-monitor-agent:
325
- image: ${MONITOR_AGENT_IMAGE_TAG:-registry.askexe.com/askexe/exe-monitor-agent:v0.9.3}
325
+ image: ${MONITOR_AGENT_IMAGE_TAG:-ghcr.io/askexe/exe-monitor-agent:v0.9.2}
326
326
  container_name: exe-monitor-agent
327
327
  restart: unless-stopped
328
328
  environment:
@@ -155,7 +155,7 @@ export function generateExampleEnv(): string {
155
155
  "EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_WS_RELAY_AUTH_TOKEN",
156
156
  "EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=CHANGEME_EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN",
157
157
  MANUAL_VALUE_COMMENT,
158
- "WHATSAPP_ACCESS_TOKEN=",
158
+ "WHATSAPP_ACCESS_TOKEN=CHANGEME_WHATSAPP_ACCESS_TOKEN",
159
159
  `API_ROUTER_URL=${DEFAULT_API_ROUTER_URL}`,
160
160
  "API_ROUTER_KEY=CHANGEME_API_ROUTER_KEY",
161
161
  "# BYOK: to use your own API keys instead of the Exe API Router,",
package/dist/bin/cli.js CHANGED
@@ -15877,11 +15877,13 @@ async function storeBehavior(opts) {
15877
15877
  const id = crypto10.randomUUID();
15878
15878
  const now2 = (/* @__PURE__ */ new Date()).toISOString();
15879
15879
  let vector = null;
15880
- try {
15881
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
15882
- const vec = await embed2(opts.content);
15883
- vector = new Float32Array(vec);
15884
- } catch {
15880
+ if (!process.env.VITEST) {
15881
+ try {
15882
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
15883
+ const vec = await embed2(opts.content);
15884
+ vector = new Float32Array(vec);
15885
+ } catch {
15886
+ }
15885
15887
  }
15886
15888
  let createdByDevice = null;
15887
15889
  try {
@@ -17127,7 +17129,7 @@ function sendIntercom(targetSession) {
17127
17129
  const callerScope = resolveExeSession();
17128
17130
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
17129
17131
  const targetScope = extractRootExe(targetSession);
17130
- if (targetScope && targetScope !== callerScope) {
17132
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
17131
17133
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
17132
17134
  process.stderr.write(
17133
17135
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -37371,8 +37373,7 @@ function summarizeChunk(chunk, filePath) {
37371
37373
  }
37372
37374
  }
37373
37375
  function isChunkable(filePath) {
37374
- const lang = languageForFile(filePath);
37375
- return lang === "typescript" || lang === "javascript";
37376
+ return languageForFile(filePath) !== void 0;
37376
37377
  }
37377
37378
  var LANGUAGE_BY_EXTENSION, TEXT_LIKE_LANGUAGES;
37378
37379
  var init_code_chunker = __esm({
@@ -8003,11 +8003,13 @@ async function storeBehavior(opts) {
8003
8003
  const id = crypto5.randomUUID();
8004
8004
  const now = (/* @__PURE__ */ new Date()).toISOString();
8005
8005
  let vector = null;
8006
- try {
8007
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
8008
- const vec = await embed2(opts.content);
8009
- vector = new Float32Array(vec);
8010
- } catch {
8006
+ if (!process.env.VITEST) {
8007
+ try {
8008
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
8009
+ const vec = await embed2(opts.content);
8010
+ vector = new Float32Array(vec);
8011
+ } catch {
8012
+ }
8011
8013
  }
8012
8014
  let createdByDevice = null;
8013
8015
  try {
@@ -9253,7 +9255,7 @@ function sendIntercom(targetSession) {
9253
9255
  const callerScope = resolveExeSession();
9254
9256
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
9255
9257
  const targetScope = extractRootExe(targetSession);
9256
- if (targetScope && targetScope !== callerScope) {
9258
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
9257
9259
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
9258
9260
  process.stderr.write(
9259
9261
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -6515,11 +6515,13 @@ async function storeBehavior(opts) {
6515
6515
  const id = crypto5.randomUUID();
6516
6516
  const now = (/* @__PURE__ */ new Date()).toISOString();
6517
6517
  let vector = null;
6518
- try {
6519
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
6520
- const vec = await embed2(opts.content);
6521
- vector = new Float32Array(vec);
6522
- } catch {
6518
+ if (!process.env.VITEST) {
6519
+ try {
6520
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
6521
+ const vec = await embed2(opts.content);
6522
+ vector = new Float32Array(vec);
6523
+ } catch {
6524
+ }
6523
6525
  }
6524
6526
  let createdByDevice = null;
6525
6527
  try {
@@ -7765,7 +7767,7 @@ function sendIntercom(targetSession) {
7765
7767
  const callerScope = resolveExeSession();
7766
7768
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
7767
7769
  const targetScope = extractRootExe(targetSession);
7768
- if (targetScope && targetScope !== callerScope) {
7770
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
7769
7771
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
7770
7772
  process.stderr.write(
7771
7773
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -6853,10 +6853,6 @@ function chunkByWindows(source, windowLines) {
6853
6853
  }
6854
6854
  return chunks;
6855
6855
  }
6856
- function isChunkable(filePath) {
6857
- const lang = languageForFile(filePath);
6858
- return lang === "typescript" || lang === "javascript";
6859
- }
6860
6856
  var LANGUAGE_BY_EXTENSION, TEXT_LIKE_LANGUAGES;
6861
6857
  var init_code_chunker = __esm({
6862
6858
  "src/lib/code-chunker.ts"() {
@@ -7133,7 +7129,8 @@ async function extractFromMemory(content, agentId, model = "claude-haiku-4-5-202
7133
7129
  if (content.length < 50) {
7134
7130
  return { entities: [], relationships: [], hyperedges: [] };
7135
7131
  }
7136
- if (filePath && isChunkable(filePath)) {
7132
+ const lang = filePath ? languageForFile(filePath) : void 0;
7133
+ if (filePath && lang && AST_EXTRACTABLE_LANGUAGES.has(lang)) {
7137
7134
  const astResult = extractFromCode(content, filePath);
7138
7135
  if (astResult.entities.length > 0) {
7139
7136
  return astResult;
@@ -7381,11 +7378,12 @@ async function extractBatch(client, batchSize = 50, model = "claude-haiku-4-5-20
7381
7378
  }
7382
7379
  return { processed: result.rows.length, entities: totalEntities, relationships: totalRelationships };
7383
7380
  }
7384
- var EXTRACT_TOOL, READ_MEMORY_PATH_PATTERN;
7381
+ var AST_EXTRACTABLE_LANGUAGES, EXTRACT_TOOL, READ_MEMORY_PATH_PATTERN;
7385
7382
  var init_graph_rag = __esm({
7386
7383
  "src/lib/graph-rag.ts"() {
7387
7384
  "use strict";
7388
7385
  init_code_chunker();
7386
+ AST_EXTRACTABLE_LANGUAGES = /* @__PURE__ */ new Set(["typescript", "javascript"]);
7389
7387
  EXTRACT_TOOL = {
7390
7388
  name: "extract_entities_and_relationships",
7391
7389
  description: "Extract entities, relationships, and group connections from a memory record. Include confidence scoring.",
@@ -12047,11 +12045,13 @@ async function storeBehavior(opts) {
12047
12045
  const id = crypto8.randomUUID();
12048
12046
  const now = (/* @__PURE__ */ new Date()).toISOString();
12049
12047
  let vector = null;
12050
- try {
12051
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
12052
- const vec = await embed2(opts.content);
12053
- vector = new Float32Array(vec);
12054
- } catch {
12048
+ if (!process.env.VITEST) {
12049
+ try {
12050
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
12051
+ const vec = await embed2(opts.content);
12052
+ vector = new Float32Array(vec);
12053
+ } catch {
12054
+ }
12055
12055
  }
12056
12056
  let createdByDevice = null;
12057
12057
  try {
@@ -13297,7 +13297,7 @@ function sendIntercom(targetSession) {
13297
13297
  const callerScope = resolveExeSession();
13298
13298
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
13299
13299
  const targetScope = extractRootExe(targetSession);
13300
- if (targetScope && targetScope !== callerScope) {
13300
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
13301
13301
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
13302
13302
  process.stderr.write(
13303
13303
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -7074,10 +7074,12 @@ async function hybridSearch(queryText, agentId, options) {
7074
7074
  const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
7075
7075
  queryVector = await embed2(effectiveQuery);
7076
7076
  } catch {
7077
- process.stderr.write("[hybrid-search] Embed daemon unavailable \u2014 FTS-only mode\n");
7077
+ if (!process.env.VITEST) {
7078
+ process.stderr.write("[hybrid-search] Embed daemon unavailable \u2014 FTS-only mode\n");
7079
+ }
7078
7080
  }
7079
7081
  let grepPromise = Promise.resolve([]);
7080
- if (config.fileGrepEnabled === true) {
7082
+ if (config.fileGrepEnabled === true && !process.env.VITEST) {
7081
7083
  try {
7082
7084
  const { getProjectName: getProjectName2 } = await Promise.resolve().then(() => (init_project_name(), project_name_exports));
7083
7085
  const projectRoot = process.cwd();
@@ -8898,11 +8898,13 @@ async function storeBehavior(opts) {
8898
8898
  const id = crypto5.randomUUID();
8899
8899
  const now = (/* @__PURE__ */ new Date()).toISOString();
8900
8900
  let vector = null;
8901
- try {
8902
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
8903
- const vec = await embed2(opts.content);
8904
- vector = new Float32Array(vec);
8905
- } catch {
8901
+ if (!process.env.VITEST) {
8902
+ try {
8903
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
8904
+ const vec = await embed2(opts.content);
8905
+ vector = new Float32Array(vec);
8906
+ } catch {
8907
+ }
8906
8908
  }
8907
8909
  let createdByDevice = null;
8908
8910
  try {
@@ -10148,7 +10150,7 @@ function sendIntercom(targetSession) {
10148
10150
  const callerScope = resolveExeSession();
10149
10151
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
10150
10152
  const targetScope = extractRootExe(targetSession);
10151
- if (targetScope && targetScope !== callerScope) {
10153
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
10152
10154
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
10153
10155
  process.stderr.write(
10154
10156
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -6432,11 +6432,13 @@ async function storeBehavior(opts) {
6432
6432
  const id = crypto5.randomUUID();
6433
6433
  const now = (/* @__PURE__ */ new Date()).toISOString();
6434
6434
  let vector = null;
6435
- try {
6436
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
6437
- const vec = await embed2(opts.content);
6438
- vector = new Float32Array(vec);
6439
- } catch {
6435
+ if (!process.env.VITEST) {
6436
+ try {
6437
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
6438
+ const vec = await embed2(opts.content);
6439
+ vector = new Float32Array(vec);
6440
+ } catch {
6441
+ }
6440
6442
  }
6441
6443
  let createdByDevice = null;
6442
6444
  try {
@@ -7682,7 +7684,7 @@ function sendIntercom(targetSession) {
7682
7684
  const callerScope = resolveExeSession();
7683
7685
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
7684
7686
  const targetScope = extractRootExe(targetSession);
7685
- if (targetScope && targetScope !== callerScope) {
7687
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
7686
7688
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
7687
7689
  process.stderr.write(
7688
7690
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -5353,12 +5353,9 @@ function chunkByWindows(source, windowLines) {
5353
5353
  }
5354
5354
  return chunks;
5355
5355
  }
5356
- function isChunkable(filePath) {
5357
- const lang = languageForFile(filePath);
5358
- return lang === "typescript" || lang === "javascript";
5359
- }
5360
5356
 
5361
5357
  // src/lib/graph-rag.ts
5358
+ var AST_EXTRACTABLE_LANGUAGES = /* @__PURE__ */ new Set(["typescript", "javascript"]);
5362
5359
  function normalizeEntityName(name) {
5363
5360
  return name.replace(/\s*\([^)]*\)\s*/g, "").trim().toLowerCase();
5364
5361
  }
@@ -5582,7 +5579,8 @@ async function extractFromMemory(content, agentId, model = "claude-haiku-4-5-202
5582
5579
  if (content.length < 50) {
5583
5580
  return { entities: [], relationships: [], hyperedges: [] };
5584
5581
  }
5585
- if (filePath && isChunkable(filePath)) {
5582
+ const lang = filePath ? languageForFile(filePath) : void 0;
5583
+ if (filePath && lang && AST_EXTRACTABLE_LANGUAGES.has(lang)) {
5586
5584
  const astResult = extractFromCode(content, filePath);
5587
5585
  if (astResult.entities.length > 0) {
5588
5586
  return astResult;
@@ -8480,11 +8480,13 @@ async function storeBehavior(opts) {
8480
8480
  const id = crypto4.randomUUID();
8481
8481
  const now = (/* @__PURE__ */ new Date()).toISOString();
8482
8482
  let vector = null;
8483
- try {
8484
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
8485
- const vec = await embed2(opts.content);
8486
- vector = new Float32Array(vec);
8487
- } catch {
8483
+ if (!process.env.VITEST) {
8484
+ try {
8485
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
8486
+ const vec = await embed2(opts.content);
8487
+ vector = new Float32Array(vec);
8488
+ } catch {
8489
+ }
8488
8490
  }
8489
8491
  let createdByDevice = null;
8490
8492
  try {
@@ -9800,7 +9802,7 @@ function sendIntercom(targetSession) {
9800
9802
  const callerScope = resolveExeSession();
9801
9803
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
9802
9804
  const targetScope = extractRootExe(targetSession);
9803
- if (targetScope && targetScope !== callerScope) {
9805
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
9804
9806
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
9805
9807
  process.stderr.write(
9806
9808
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -6503,11 +6503,13 @@ async function storeBehavior(opts) {
6503
6503
  const id = crypto5.randomUUID();
6504
6504
  const now = (/* @__PURE__ */ new Date()).toISOString();
6505
6505
  let vector = null;
6506
- try {
6507
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
6508
- const vec = await embed2(opts.content);
6509
- vector = new Float32Array(vec);
6510
- } catch {
6506
+ if (!process.env.VITEST) {
6507
+ try {
6508
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
6509
+ const vec = await embed2(opts.content);
6510
+ vector = new Float32Array(vec);
6511
+ } catch {
6512
+ }
6511
6513
  }
6512
6514
  let createdByDevice = null;
6513
6515
  try {
@@ -7753,7 +7755,7 @@ function sendIntercom(targetSession) {
7753
7755
  const callerScope = resolveExeSession();
7754
7756
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
7755
7757
  const targetScope = extractRootExe(targetSession);
7756
- if (targetScope && targetScope !== callerScope) {
7758
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
7757
7759
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
7758
7760
  process.stderr.write(
7759
7761
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -6837,10 +6837,6 @@ function chunkByWindows(source, windowLines) {
6837
6837
  }
6838
6838
  return chunks;
6839
6839
  }
6840
- function isChunkable(filePath) {
6841
- const lang = languageForFile(filePath);
6842
- return lang === "typescript" || lang === "javascript";
6843
- }
6844
6840
  var LANGUAGE_BY_EXTENSION, TEXT_LIKE_LANGUAGES;
6845
6841
  var init_code_chunker = __esm({
6846
6842
  "src/lib/code-chunker.ts"() {
@@ -7117,7 +7113,8 @@ async function extractFromMemory(content, agentId, model = "claude-haiku-4-5-202
7117
7113
  if (content.length < 50) {
7118
7114
  return { entities: [], relationships: [], hyperedges: [] };
7119
7115
  }
7120
- if (filePath && isChunkable(filePath)) {
7116
+ const lang = filePath ? languageForFile(filePath) : void 0;
7117
+ if (filePath && lang && AST_EXTRACTABLE_LANGUAGES.has(lang)) {
7121
7118
  const astResult = extractFromCode(content, filePath);
7122
7119
  if (astResult.entities.length > 0) {
7123
7120
  return astResult;
@@ -7365,11 +7362,12 @@ async function extractBatch(client, batchSize = 50, model = "claude-haiku-4-5-20
7365
7362
  }
7366
7363
  return { processed: result.rows.length, entities: totalEntities, relationships: totalRelationships };
7367
7364
  }
7368
- var EXTRACT_TOOL, READ_MEMORY_PATH_PATTERN;
7365
+ var AST_EXTRACTABLE_LANGUAGES, EXTRACT_TOOL, READ_MEMORY_PATH_PATTERN;
7369
7366
  var init_graph_rag = __esm({
7370
7367
  "src/lib/graph-rag.ts"() {
7371
7368
  "use strict";
7372
7369
  init_code_chunker();
7370
+ AST_EXTRACTABLE_LANGUAGES = /* @__PURE__ */ new Set(["typescript", "javascript"]);
7373
7371
  EXTRACT_TOOL = {
7374
7372
  name: "extract_entities_and_relationships",
7375
7373
  description: "Extract entities, relationships, and group connections from a memory record. Include confidence scoring.",
@@ -10367,11 +10365,13 @@ async function storeBehavior(opts) {
10367
10365
  const id = crypto7.randomUUID();
10368
10366
  const now = (/* @__PURE__ */ new Date()).toISOString();
10369
10367
  let vector = null;
10370
- try {
10371
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
10372
- const vec = await embed2(opts.content);
10373
- vector = new Float32Array(vec);
10374
- } catch {
10368
+ if (!process.env.VITEST) {
10369
+ try {
10370
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
10371
+ const vec = await embed2(opts.content);
10372
+ vector = new Float32Array(vec);
10373
+ } catch {
10374
+ }
10375
10375
  }
10376
10376
  let createdByDevice = null;
10377
10377
  try {
@@ -11617,7 +11617,7 @@ function sendIntercom(targetSession) {
11617
11617
  const callerScope = resolveExeSession();
11618
11618
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
11619
11619
  const targetScope = extractRootExe(targetSession);
11620
- if (targetScope && targetScope !== callerScope) {
11620
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
11621
11621
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
11622
11622
  process.stderr.write(
11623
11623
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -8406,7 +8406,7 @@ function sendIntercom(targetSession) {
8406
8406
  const callerScope = resolveExeSession();
8407
8407
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
8408
8408
  const targetScope = extractRootExe(targetSession);
8409
- if (targetScope && targetScope !== callerScope) {
8409
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
8410
8410
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
8411
8411
  process.stderr.write(
8412
8412
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -10204,11 +10204,13 @@ async function storeBehavior(opts) {
10204
10204
  const id = crypto5.randomUUID();
10205
10205
  const now = (/* @__PURE__ */ new Date()).toISOString();
10206
10206
  let vector = null;
10207
- try {
10208
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
10209
- const vec = await embed2(opts.content);
10210
- vector = new Float32Array(vec);
10211
- } catch {
10207
+ if (!process.env.VITEST) {
10208
+ try {
10209
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
10210
+ const vec = await embed2(opts.content);
10211
+ vector = new Float32Array(vec);
10212
+ } catch {
10213
+ }
10212
10214
  }
10213
10215
  let createdByDevice = null;
10214
10216
  try {
@@ -7411,7 +7411,7 @@ function sendIntercom(targetSession) {
7411
7411
  const callerScope = resolveExeSession();
7412
7412
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
7413
7413
  const targetScope = extractRootExe(targetSession);
7414
- if (targetScope && targetScope !== callerScope) {
7414
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
7415
7415
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
7416
7416
  process.stderr.write(
7417
7417
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -8488,11 +8488,13 @@ async function storeBehavior(opts) {
8488
8488
  const id = crypto4.randomUUID();
8489
8489
  const now = (/* @__PURE__ */ new Date()).toISOString();
8490
8490
  let vector = null;
8491
- try {
8492
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
8493
- const vec = await embed2(opts.content);
8494
- vector = new Float32Array(vec);
8495
- } catch {
8491
+ if (!process.env.VITEST) {
8492
+ try {
8493
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
8494
+ const vec = await embed2(opts.content);
8495
+ vector = new Float32Array(vec);
8496
+ } catch {
8497
+ }
8496
8498
  }
8497
8499
  let createdByDevice = null;
8498
8500
  try {
@@ -6497,11 +6497,13 @@ async function storeBehavior(opts) {
6497
6497
  const id = crypto5.randomUUID();
6498
6498
  const now = (/* @__PURE__ */ new Date()).toISOString();
6499
6499
  let vector = null;
6500
- try {
6501
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
6502
- const vec = await embed2(opts.content);
6503
- vector = new Float32Array(vec);
6504
- } catch {
6500
+ if (!process.env.VITEST) {
6501
+ try {
6502
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
6503
+ const vec = await embed2(opts.content);
6504
+ vector = new Float32Array(vec);
6505
+ } catch {
6506
+ }
6505
6507
  }
6506
6508
  let createdByDevice = null;
6507
6509
  try {
@@ -7747,7 +7749,7 @@ function sendIntercom(targetSession) {
7747
7749
  const callerScope = resolveExeSession();
7748
7750
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
7749
7751
  const targetScope = extractRootExe(targetSession);
7750
- if (targetScope && targetScope !== callerScope) {
7752
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
7751
7753
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
7752
7754
  process.stderr.write(
7753
7755
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -7183,10 +7183,12 @@ async function hybridSearch(queryText, agentId, options) {
7183
7183
  const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
7184
7184
  queryVector = await embed2(effectiveQuery);
7185
7185
  } catch {
7186
- process.stderr.write("[hybrid-search] Embed daemon unavailable \u2014 FTS-only mode\n");
7186
+ if (!process.env.VITEST) {
7187
+ process.stderr.write("[hybrid-search] Embed daemon unavailable \u2014 FTS-only mode\n");
7188
+ }
7187
7189
  }
7188
7190
  let grepPromise = Promise.resolve([]);
7189
- if (config.fileGrepEnabled === true) {
7191
+ if (config.fileGrepEnabled === true && !process.env.VITEST) {
7190
7192
  try {
7191
7193
  const { getProjectName: getProjectName2 } = await Promise.resolve().then(() => (init_project_name(), project_name_exports));
7192
7194
  const projectRoot = process.cwd();
@@ -8383,11 +8383,13 @@ async function storeBehavior(opts) {
8383
8383
  const id = crypto5.randomUUID();
8384
8384
  const now = (/* @__PURE__ */ new Date()).toISOString();
8385
8385
  let vector = null;
8386
- try {
8387
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
8388
- const vec = await embed2(opts.content);
8389
- vector = new Float32Array(vec);
8390
- } catch {
8386
+ if (!process.env.VITEST) {
8387
+ try {
8388
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
8389
+ const vec = await embed2(opts.content);
8390
+ vector = new Float32Array(vec);
8391
+ } catch {
8392
+ }
8391
8393
  }
8392
8394
  let createdByDevice = null;
8393
8395
  try {
@@ -9633,7 +9635,7 @@ function sendIntercom(targetSession) {
9633
9635
  const callerScope = resolveExeSession();
9634
9636
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
9635
9637
  const targetScope = extractRootExe(targetSession);
9636
- if (targetScope && targetScope !== callerScope) {
9638
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
9637
9639
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
9638
9640
  process.stderr.write(
9639
9641
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.
@@ -7686,10 +7686,12 @@ async function hybridSearch(queryText, agentId, options) {
7686
7686
  const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
7687
7687
  queryVector = await embed2(effectiveQuery);
7688
7688
  } catch {
7689
- process.stderr.write("[hybrid-search] Embed daemon unavailable \u2014 FTS-only mode\n");
7689
+ if (!process.env.VITEST) {
7690
+ process.stderr.write("[hybrid-search] Embed daemon unavailable \u2014 FTS-only mode\n");
7691
+ }
7690
7692
  }
7691
7693
  let grepPromise = Promise.resolve([]);
7692
- if (config.fileGrepEnabled === true) {
7694
+ if (config.fileGrepEnabled === true && !process.env.VITEST) {
7693
7695
  try {
7694
7696
  const { getProjectName: getProjectName2 } = await Promise.resolve().then(() => (init_project_name(), project_name_exports));
7695
7697
  const projectRoot = process.cwd();
@@ -6481,11 +6481,13 @@ async function storeBehavior(opts) {
6481
6481
  const id = crypto5.randomUUID();
6482
6482
  const now = (/* @__PURE__ */ new Date()).toISOString();
6483
6483
  let vector = null;
6484
- try {
6485
- const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
6486
- const vec = await embed2(opts.content);
6487
- vector = new Float32Array(vec);
6488
- } catch {
6484
+ if (!process.env.VITEST) {
6485
+ try {
6486
+ const { embed: embed2 } = await Promise.resolve().then(() => (init_embedder(), embedder_exports));
6487
+ const vec = await embed2(opts.content);
6488
+ vector = new Float32Array(vec);
6489
+ } catch {
6490
+ }
6489
6491
  }
6490
6492
  let createdByDevice = null;
6491
6493
  try {
@@ -7731,7 +7733,7 @@ function sendIntercom(targetSession) {
7731
7733
  const callerScope = resolveExeSession();
7732
7734
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
7733
7735
  const targetScope = extractRootExe(targetSession);
7734
- if (targetScope && targetScope !== callerScope) {
7736
+ if (targetScope && targetScope !== callerScope && isExeSession(targetScope)) {
7735
7737
  logIntercom(`BLOCKED \u2192 ${targetSession} (scope violation: caller=${callerScope}, target=${targetScope})`);
7736
7738
  process.stderr.write(
7737
7739
  `[intercom] BLOCKED: cross-session intercom from ${callerScope} to ${targetSession}. Session isolation enforced.