@askexenow/exe-os 0.9.117 → 0.9.119
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/deploy/compose/.env.example +1 -1
- package/deploy/compose/docker-compose.yml +6 -6
- package/deploy/compose/generate-env.ts +1 -1
- package/dist/bin/cli.js +9 -8
- package/dist/bin/exe-boot.js +8 -6
- package/dist/bin/exe-dispatch.js +8 -6
- package/dist/bin/exe-gateway.js +12 -12
- package/dist/bin/exe-search.js +4 -2
- package/dist/bin/exe-session-cleanup.js +8 -6
- package/dist/bin/git-sweep.js +8 -6
- package/dist/bin/graph-backfill.js +3 -5
- package/dist/bin/intercom-check.js +8 -6
- package/dist/bin/scan-tasks.js +8 -6
- package/dist/gateway/index.js +12 -12
- package/dist/hooks/bug-report-worker.js +8 -6
- package/dist/hooks/codex-stop-task-finalizer.js +8 -6
- package/dist/hooks/commit-complete.js +8 -6
- package/dist/hooks/error-recall.js +4 -2
- package/dist/hooks/ingest.js +8 -6
- package/dist/hooks/post-tool-combined.js +4 -2
- package/dist/hooks/pre-compact.js +8 -6
- package/dist/hooks/prompt-submit.js +12 -8
- package/dist/hooks/session-end.js +8 -6
- package/dist/hooks/session-start.js +4 -2
- package/dist/index.js +12 -12
- package/dist/lib/exe-daemon.js +12 -12
- package/dist/lib/hybrid-search.js +4 -2
- package/dist/lib/messaging.js +1 -1
- package/dist/lib/skill-learning.js +7 -5
- package/dist/lib/tasks.js +8 -6
- package/dist/lib/tmux-routing.js +8 -6
- package/dist/mcp/register-tools.js +32277 -0
- package/dist/mcp/server.js +16 -10
- package/dist/mcp/tools/create-task.js +8 -6
- package/dist/mcp/tools/send-message.js +1 -1
- package/dist/mcp/tools/update-task.js +8 -6
- package/dist/runtime/index.js +8 -6
- package/dist/tui/App.js +8 -6
- 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:-
|
|
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:-
|
|
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:-
|
|
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:-
|
|
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:-
|
|
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:-
|
|
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
|
-
|
|
15881
|
-
|
|
15882
|
-
|
|
15883
|
-
|
|
15884
|
-
|
|
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
|
-
|
|
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({
|
package/dist/bin/exe-boot.js
CHANGED
|
@@ -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
|
-
|
|
8007
|
-
|
|
8008
|
-
|
|
8009
|
-
|
|
8010
|
-
|
|
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.
|
package/dist/bin/exe-dispatch.js
CHANGED
|
@@ -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
|
-
|
|
6519
|
-
|
|
6520
|
-
|
|
6521
|
-
|
|
6522
|
-
|
|
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.
|
package/dist/bin/exe-gateway.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
12051
|
-
|
|
12052
|
-
|
|
12053
|
-
|
|
12054
|
-
|
|
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.
|
package/dist/bin/exe-search.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
8902
|
-
|
|
8903
|
-
|
|
8904
|
-
|
|
8905
|
-
|
|
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.
|
package/dist/bin/git-sweep.js
CHANGED
|
@@ -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
|
-
|
|
6436
|
-
|
|
6437
|
-
|
|
6438
|
-
|
|
6439
|
-
|
|
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
|
-
|
|
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
|
-
|
|
8484
|
-
|
|
8485
|
-
|
|
8486
|
-
|
|
8487
|
-
|
|
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.
|
package/dist/bin/scan-tasks.js
CHANGED
|
@@ -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
|
-
|
|
6507
|
-
|
|
6508
|
-
|
|
6509
|
-
|
|
6510
|
-
|
|
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.
|
package/dist/gateway/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
10371
|
-
|
|
10372
|
-
|
|
10373
|
-
|
|
10374
|
-
|
|
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
|
-
|
|
10208
|
-
|
|
10209
|
-
|
|
10210
|
-
|
|
10211
|
-
|
|
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
|
-
|
|
8492
|
-
|
|
8493
|
-
|
|
8494
|
-
|
|
8495
|
-
|
|
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
|
-
|
|
6501
|
-
|
|
6502
|
-
|
|
6503
|
-
|
|
6504
|
-
|
|
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.
|
|
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();
|
package/dist/hooks/ingest.js
CHANGED
|
@@ -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
|
-
|
|
8387
|
-
|
|
8388
|
-
|
|
8389
|
-
|
|
8390
|
-
|
|
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.
|
|
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
|
-
|
|
6485
|
-
|
|
6486
|
-
|
|
6487
|
-
|
|
6488
|
-
|
|
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.
|