@askexenow/exe-os 0.9.93 → 0.9.95
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/docker-compose.yml +1 -0
- package/dist/bin/agentic-ontology-backfill.js +65 -8
- package/dist/bin/agentic-reflection-backfill.js +54 -3
- package/dist/bin/agentic-semantic-label.js +54 -3
- package/dist/bin/backfill-conversations.js +69 -9
- package/dist/bin/backfill-responses.js +69 -9
- package/dist/bin/backfill-vectors.js +54 -3
- package/dist/bin/bulk-sync-postgres.js +66 -8
- package/dist/bin/cleanup-stale-review-tasks.js +121 -13
- package/dist/bin/cli.js +1561 -466
- package/dist/bin/customer-readiness.js +61 -0
- package/dist/bin/exe-agent.js +17 -3
- package/dist/bin/exe-assign.js +75 -9
- package/dist/bin/exe-boot.js +114 -12
- package/dist/bin/exe-call.js +17 -3
- package/dist/bin/exe-cloud.js +76 -10
- package/dist/bin/exe-dispatch.js +136 -18
- package/dist/bin/exe-doctor.js +75 -9
- package/dist/bin/exe-export-behaviors.js +75 -9
- package/dist/bin/exe-forget.js +94 -9
- package/dist/bin/exe-gateway.js +135 -18
- package/dist/bin/exe-heartbeat.js +121 -13
- package/dist/bin/exe-kill.js +75 -9
- package/dist/bin/exe-launch-agent.js +75 -9
- package/dist/bin/exe-new-employee.js +18 -4
- package/dist/bin/exe-pending-messages.js +121 -13
- package/dist/bin/exe-pending-notifications.js +121 -13
- package/dist/bin/exe-pending-reviews.js +121 -13
- package/dist/bin/exe-rename.js +75 -9
- package/dist/bin/exe-review.js +75 -9
- package/dist/bin/exe-search.js +100 -9
- package/dist/bin/exe-session-cleanup.js +136 -18
- package/dist/bin/exe-settings.js +1 -0
- package/dist/bin/exe-start-codex.js +65 -8
- package/dist/bin/exe-start-opencode.js +65 -8
- package/dist/bin/exe-status.js +121 -13
- package/dist/bin/exe-support.js +1 -0
- package/dist/bin/exe-team.js +75 -9
- package/dist/bin/git-sweep.js +136 -18
- package/dist/bin/graph-backfill.js +65 -8
- package/dist/bin/graph-export.js +75 -9
- package/dist/bin/intercom-check.js +136 -18
- package/dist/bin/scan-tasks.js +136 -18
- package/dist/bin/setup.js +55 -4
- package/dist/bin/shard-migrate.js +65 -8
- package/dist/bin/stack-update.js +5 -6
- package/dist/bin/update.js +1 -1
- package/dist/gateway/index.js +136 -18
- package/dist/hooks/bug-report-worker.js +136 -18
- package/dist/hooks/codex-stop-task-finalizer.js +126 -14
- package/dist/hooks/commit-complete.js +136 -18
- package/dist/hooks/error-recall.js +100 -9
- package/dist/hooks/ingest.js +75 -9
- package/dist/hooks/instructions-loaded.js +75 -9
- package/dist/hooks/notification.js +75 -9
- package/dist/hooks/post-compact.js +313 -50
- package/dist/hooks/post-tool-combined.js +436 -13
- package/dist/hooks/pre-compact.js +136 -18
- package/dist/hooks/pre-tool-use.js +121 -13
- package/dist/hooks/prompt-submit.js +194 -19
- package/dist/hooks/session-end.js +136 -18
- package/dist/hooks/session-start.js +146 -13
- package/dist/hooks/stop.js +121 -13
- package/dist/hooks/subagent-stop.js +121 -13
- package/dist/hooks/summary-worker.js +99 -7
- package/dist/index.js +136 -18
- package/dist/lib/cloud-sync.js +38 -0
- package/dist/lib/consolidation.js +3 -1
- package/dist/lib/database.js +37 -0
- package/dist/lib/db.js +37 -0
- package/dist/lib/device-registry.js +37 -0
- package/dist/lib/employee-templates.js +17 -3
- package/dist/lib/exe-daemon.js +916 -42
- package/dist/lib/hybrid-search.js +100 -9
- package/dist/lib/license.js +1 -1
- package/dist/lib/messaging.js +43 -4
- package/dist/lib/schedules.js +54 -3
- package/dist/lib/store.js +75 -9
- package/dist/lib/tasks.js +61 -9
- package/dist/lib/tmux-routing.js +61 -9
- package/dist/mcp/server.js +878 -42
- package/dist/mcp/tools/create-task.js +70 -12
- package/dist/mcp/tools/list-tasks.js +49 -5
- package/dist/mcp/tools/send-message.js +43 -4
- package/dist/mcp/tools/update-task.js +61 -9
- package/dist/runtime/index.js +136 -18
- package/dist/tui/App.js +135 -18
- package/package.json +1 -1
|
@@ -3175,6 +3175,20 @@ async function ensureSchema() {
|
|
|
3175
3175
|
});
|
|
3176
3176
|
} catch {
|
|
3177
3177
|
}
|
|
3178
|
+
try {
|
|
3179
|
+
await client.execute({
|
|
3180
|
+
sql: `ALTER TABLE tasks ADD COLUMN spawn_runtime TEXT`,
|
|
3181
|
+
args: []
|
|
3182
|
+
});
|
|
3183
|
+
} catch {
|
|
3184
|
+
}
|
|
3185
|
+
try {
|
|
3186
|
+
await client.execute({
|
|
3187
|
+
sql: `ALTER TABLE tasks ADD COLUMN spawn_model TEXT`,
|
|
3188
|
+
args: []
|
|
3189
|
+
});
|
|
3190
|
+
} catch {
|
|
3191
|
+
}
|
|
3178
3192
|
await client.executeMultiple(`
|
|
3179
3193
|
CREATE VIRTUAL TABLE IF NOT EXISTS conversations_fts USING fts5(
|
|
3180
3194
|
content_text,
|
|
@@ -3426,6 +3440,22 @@ async function ensureSchema() {
|
|
|
3426
3440
|
);
|
|
3427
3441
|
} catch {
|
|
3428
3442
|
}
|
|
3443
|
+
for (const col of [
|
|
3444
|
+
"ALTER TABLE memories ADD COLUMN valid_from TEXT",
|
|
3445
|
+
"ALTER TABLE memories ADD COLUMN invalid_at TEXT"
|
|
3446
|
+
]) {
|
|
3447
|
+
try {
|
|
3448
|
+
await client.execute(col);
|
|
3449
|
+
} catch {
|
|
3450
|
+
}
|
|
3451
|
+
}
|
|
3452
|
+
try {
|
|
3453
|
+
await client.execute({
|
|
3454
|
+
sql: `UPDATE memories SET valid_from = timestamp WHERE valid_from IS NULL`,
|
|
3455
|
+
args: []
|
|
3456
|
+
});
|
|
3457
|
+
} catch {
|
|
3458
|
+
}
|
|
3429
3459
|
try {
|
|
3430
3460
|
await client.execute({
|
|
3431
3461
|
sql: `ALTER TABLE memories ADD COLUMN memory_type TEXT DEFAULT 'raw'`,
|
|
@@ -3468,6 +3498,13 @@ async function ensureSchema() {
|
|
|
3468
3498
|
} catch {
|
|
3469
3499
|
}
|
|
3470
3500
|
}
|
|
3501
|
+
try {
|
|
3502
|
+
await client.execute({
|
|
3503
|
+
sql: `ALTER TABLE memories ADD COLUMN procedure_for TEXT`,
|
|
3504
|
+
args: []
|
|
3505
|
+
});
|
|
3506
|
+
} catch {
|
|
3507
|
+
}
|
|
3471
3508
|
try {
|
|
3472
3509
|
await client.execute({
|
|
3473
3510
|
sql: `UPDATE tasks SET status = 'closed' WHERE status = 'done' AND result IS NOT NULL`,
|
|
@@ -4606,6 +4643,20 @@ var init_platform_procedures = __esm({
|
|
|
4606
4643
|
priority: "p1",
|
|
4607
4644
|
content: "Once per session (COO boot only, never repeat), call list_my_feature_requests to check if any previously filed feature requests have been shipped by AskExe. If any request has status 'shipped' with a shipped_version, surface it to the founder immediately: '\u{1F680} N feature(s) shipped \u2014 run exe-os update to get version X.Y.Z'. This is a one-time check at boot, not a recurring poll. If no requests exist or none are shipped, skip silently. If the MCP tool is unavailable or the network call fails, skip silently \u2014 this is informational, not blocking."
|
|
4608
4645
|
},
|
|
4646
|
+
// --- Tool guidance ---
|
|
4647
|
+
{
|
|
4648
|
+
title: "How to use company_actions \u2014 execute business actions through gateway connectors",
|
|
4649
|
+
domain: "tools",
|
|
4650
|
+
priority: "p2",
|
|
4651
|
+
content: "The company_actions tool executes business actions through gateway connectors (e.g. send WhatsApp, trigger workflows, update CRM). It routes through the exe-gateway on the VPS. Actions are defined by the customer's gateway configuration \u2014 each connector (WhatsApp, Shopify, email, etc.) exposes specific actions. Use query_company_brain to find available data first, then company_actions to act on it. Requires gateway auth token. Read-only founders should NOT use this \u2014 it mutates external state."
|
|
4652
|
+
},
|
|
4653
|
+
// --- Release awareness ---
|
|
4654
|
+
{
|
|
4655
|
+
title: "What's New check \u2014 surface new features after update",
|
|
4656
|
+
domain: "support",
|
|
4657
|
+
priority: "p1",
|
|
4658
|
+
content: "Once per session (COO boot only, never repeat), check if the installed exe-os version is newer than the last session. If it is, read the bundled release-notes.json (at the package root) and surface a brief summary to the founder: 'Updated to exe-os vX.Y.Z \u2014 N new features, M fixes.' List the top 3 features by name. This helps the founder know what they got from the update. If release-notes.json doesn't exist or the version hasn't changed, skip silently. Never repeat this check in the same session."
|
|
4659
|
+
},
|
|
4609
4660
|
// --- Platform vs Customer ownership ---
|
|
4610
4661
|
{
|
|
4611
4662
|
title: "What the platform provides vs what you customize",
|
|
@@ -4694,13 +4745,13 @@ var init_platform_procedures = __esm({
|
|
|
4694
4745
|
title: "MCP tools \u2014 memory, decision, and search",
|
|
4695
4746
|
domain: "tool-use",
|
|
4696
4747
|
priority: "p1",
|
|
4697
|
-
content: `memory(action="recall") / recall_my_memory: search
|
|
4748
|
+
content: `memory(action="recall") / recall_my_memory: search memories (semantic + FTS). Params: as_of (bi-temporal \u2014 what did I know at time X?), kind (decision|procedure|observation|raw|conversation|behavior), retrieval_mode (all|decisions_only|procedures_only|operational|recent_high_value). memory(action="ask_team") / ask_team_memory: search a colleague's memories. memory(action="store") / store_memory: persist a memory. Params: kind, procedure_for (domain tag for procedures). memory(action="commit") / commit_memory: high-importance, survives consolidation. Requires summary. memory(action="search") / search_everything: unified search across memories, tasks, entities, conversations. memory(action="session_context") / get_session_context: temporal window. Requires session_id + target_timestamp. memory(action="get_by_id"): fetch one memory by UUID with full untruncated text. memory(action="consolidate") / consolidate_memories: merge duplicate/related memories. memory(action="cardinality") / get_memory_cardinality: count memories per agent. memory(action="supersede"): replace an old memory with a new version (old_id + new text). decision(action="store") / store_decision: record an architectural decision (domain, decision, rationale). decision(action="get") / get_decision: retrieve a past decision by domain or query.`
|
|
4698
4749
|
},
|
|
4699
4750
|
{
|
|
4700
4751
|
title: "MCP tools \u2014 task orchestration",
|
|
4701
4752
|
domain: "tool-use",
|
|
4702
4753
|
priority: "p1",
|
|
4703
|
-
content: 'task(action="create") / create_task: dispatch work (title, assigned_to, context). The ONLY dispatch path. Auto-spawns session. task(action="list") / list_tasks: query tasks by status, assignee, project. task(action="get") / get_task: fetch full task details by task_id. task(action="update") / update_task: change status (in_progress, done, blocked, cancelled) + result summary. task(action="close") / close_task: finalize a reviewed task (COO only). task(action="checkpoint") / checkpoint_task: save progress state for crash recovery. task(action="resume") / resume_employee: re-spawn an employee session for an existing task.'
|
|
4754
|
+
content: 'task(action="create") / create_task: dispatch work (title, assigned_to, context). The ONLY dispatch path. Auto-spawns session. Params: blocked_by (task ID for dependency), parent_task_id (subtask hierarchy), reviewer, complexity (routine|standard|complex|critical), budget_tokens (max token cap), budget_fallback_model, spawn_runtime (override runtime: claude|codex|opencode), spawn_model (override model). task(action="list") / list_tasks: query tasks by status, assignee, project. task(action="get") / get_task: fetch full task details by task_id. task(action="update") / update_task: change status (in_progress, done, blocked, cancelled) + result summary. task(action="close") / close_task: finalize a reviewed task (COO only). task(action="checkpoint") / checkpoint_task: save progress state for crash recovery. task(action="resume") / resume_employee: re-spawn an employee session for an existing task.'
|
|
4704
4755
|
},
|
|
4705
4756
|
{
|
|
4706
4757
|
title: "MCP tools \u2014 knowledge graph (GraphRAG)",
|
|
@@ -4730,7 +4781,7 @@ var init_platform_procedures = __esm({
|
|
|
4730
4781
|
title: "MCP tools \u2014 admin, config, and operations",
|
|
4731
4782
|
domain: "tool-use",
|
|
4732
4783
|
priority: "p1",
|
|
4733
|
-
content: 'config(action="list_employees"): view roster. config(action="agent_spend"): token usage per agent. config(action="daemon_health"): check exed status. config(action="license_status"): check license. config(action="cloud_sync"): force sync. config(action="memory_audit"): health check (dupes, null vectors). config(action="run_consolidation"): trigger memory consolidation. config(action="company_procedure", subaction="store|list|deactivate"): manage company procedures. config(action="global_procedure"): list all procedures (platform + company). config(action="create_trigger|list_triggers"): scheduled agent jobs. config(action="export_orchestration|import_orchestration"): portable org state. diagnostics(action="healthcheck|doctor|status_brief|check_update|cloud_status"): system diagnostics. mcp_ping(): daemon health + license status + tool usage stats.'
|
|
4784
|
+
content: 'config(action="list_employees"): view roster. config(action="set_agent_config"): view or change per-agent runtime + model. Call with no args to show all agents. config(action="agent_spend"): token usage per agent. config(action="daemon_health"): check exed status. config(action="license_status"): check license. config(action="cloud_sync"): force sync. Supports cloud_action param: status|sync|reupload. config(action="memory_audit"): health check (dupes, null vectors). config(action="run_consolidation"): trigger memory consolidation. config(action="worker_gate"): check spawn slot availability \u2014 alive/stale/reserved counts vs max. Use before dispatching. config(action="auto_wake_status"): orphaned tasks, blocked tasks, auto-wake retry status. config(action="orchestration_phase"): view/change org phase (phase_1_coo|phase_2_executives|phase_3_parallel_org). config(action="company_procedure", subaction="store|list|deactivate"): manage company procedures. config(action="global_procedure"): list all procedures (platform + company). config(action="create_trigger|list_triggers"): scheduled agent jobs. config(action="export_orchestration|import_orchestration"): portable org state. diagnostics(action="healthcheck|doctor|status_brief|check_update|cloud_status"): system diagnostics. diagnostics(action="pending_work_summary"): pending reviews + messages + notifications in one call. diagnostics(action="rename_employee"): rename an agent across all systems (roster, identity, DB, symlinks). diagnostics(action="tool_search"): semantic tool discovery \u2014 find relevant MCP tools by natural language query. diagnostics(action="drift"): identity drift detection \u2014 score how far an agent has drifted from its role. mcp_ping(): daemon health + license status + tool usage stats.'
|
|
4734
4785
|
}
|
|
4735
4786
|
];
|
|
4736
4787
|
PLATFORM_PROCEDURE_TITLES = new Set(
|
|
@@ -5414,6 +5465,8 @@ async function writeMemory(record) {
|
|
|
5414
5465
|
source_type: record.source_type ?? null,
|
|
5415
5466
|
tier: record.tier ?? classifyTier(record),
|
|
5416
5467
|
supersedes_id: record.supersedes_id ?? null,
|
|
5468
|
+
valid_from: record.valid_from ?? record.timestamp,
|
|
5469
|
+
invalid_at: record.invalid_at ?? null,
|
|
5417
5470
|
draft: record.draft ? 1 : 0,
|
|
5418
5471
|
memory_type: memoryType,
|
|
5419
5472
|
trajectory: record.trajectory ? JSON.stringify(record.trajectory) : null,
|
|
@@ -5432,7 +5485,8 @@ async function writeMemory(record) {
|
|
|
5432
5485
|
token_cost: record.token_cost ?? null,
|
|
5433
5486
|
audience: record.audience ?? null,
|
|
5434
5487
|
language_type: record.language_type ?? inferLanguageType(record),
|
|
5435
|
-
parent_memory_id: record.parent_memory_id ?? null
|
|
5488
|
+
parent_memory_id: record.parent_memory_id ?? null,
|
|
5489
|
+
procedure_for: record.procedure_for ?? null
|
|
5436
5490
|
};
|
|
5437
5491
|
_pendingRecords.push(dbRow);
|
|
5438
5492
|
orgBus.emit({
|
|
@@ -5487,6 +5541,8 @@ async function flushBatch() {
|
|
|
5487
5541
|
const sourceType = row.source_type ?? null;
|
|
5488
5542
|
const tier = row.tier ?? 3;
|
|
5489
5543
|
const supersedesId = row.supersedes_id ?? null;
|
|
5544
|
+
const validFrom = row.valid_from ?? row.timestamp;
|
|
5545
|
+
const invalidAt = row.invalid_at ?? null;
|
|
5490
5546
|
const draft = row.draft ? 1 : 0;
|
|
5491
5547
|
const memoryType = row.memory_type ?? "raw";
|
|
5492
5548
|
const trajectory = row.trajectory ?? null;
|
|
@@ -5506,15 +5562,16 @@ async function flushBatch() {
|
|
|
5506
5562
|
const audience = row.audience ?? null;
|
|
5507
5563
|
const languageType = row.language_type ?? null;
|
|
5508
5564
|
const parentMemoryId = row.parent_memory_id ?? null;
|
|
5565
|
+
const procedureFor = row.procedure_for ?? null;
|
|
5509
5566
|
const cols = `id, agent_id, agent_role, session_id, timestamp,
|
|
5510
5567
|
tool_name, project_name,
|
|
5511
5568
|
has_error, raw_text, vector, version, task_id, importance, status,
|
|
5512
5569
|
confidence, last_accessed,
|
|
5513
5570
|
workspace_id, document_id, user_id, char_offset, page_number,
|
|
5514
|
-
source_path, source_type, tier, supersedes_id, draft, memory_type, trajectory, content_hash,
|
|
5571
|
+
source_path, source_type, tier, supersedes_id, valid_from, invalid_at, draft, memory_type, trajectory, content_hash,
|
|
5515
5572
|
intent, outcome, domain, referenced_entities, retrieval_count,
|
|
5516
5573
|
chain_position, review_status, context_window_pct, file_paths, commit_hash,
|
|
5517
|
-
duration_ms, token_cost, audience, language_type, parent_memory_id`;
|
|
5574
|
+
duration_ms, token_cost, audience, language_type, parent_memory_id, procedure_for`;
|
|
5518
5575
|
const metaArgs = [
|
|
5519
5576
|
intent,
|
|
5520
5577
|
outcome,
|
|
@@ -5530,7 +5587,8 @@ async function flushBatch() {
|
|
|
5530
5587
|
tokenCost,
|
|
5531
5588
|
audience,
|
|
5532
5589
|
languageType,
|
|
5533
|
-
parentMemoryId
|
|
5590
|
+
parentMemoryId,
|
|
5591
|
+
procedureFor
|
|
5534
5592
|
];
|
|
5535
5593
|
const baseArgs = [
|
|
5536
5594
|
row.id,
|
|
@@ -5559,6 +5617,8 @@ async function flushBatch() {
|
|
|
5559
5617
|
sourceType,
|
|
5560
5618
|
tier,
|
|
5561
5619
|
supersedesId,
|
|
5620
|
+
validFrom,
|
|
5621
|
+
invalidAt,
|
|
5562
5622
|
draft,
|
|
5563
5623
|
memoryType,
|
|
5564
5624
|
trajectory,
|
|
@@ -5566,8 +5626,8 @@ async function flushBatch() {
|
|
|
5566
5626
|
];
|
|
5567
5627
|
return {
|
|
5568
5628
|
sql: hasVector ? `INSERT OR IGNORE INTO memories (${cols})
|
|
5569
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, vector32(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` : `INSERT OR IGNORE INTO memories (${cols})
|
|
5570
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
5629
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, vector32(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` : `INSERT OR IGNORE INTO memories (${cols})
|
|
5630
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
5571
5631
|
args: hasVector ? [...baseArgs, vectorToBlob(row.vector), ...sharedArgs, ...metaArgs] : [...baseArgs, ...sharedArgs, ...metaArgs]
|
|
5572
5632
|
};
|
|
5573
5633
|
};
|
|
@@ -5683,6 +5743,12 @@ async function searchMemories(queryVector, agentId, options) {
|
|
|
5683
5743
|
AND vector IS NOT NULL${statusFilter}${draftFilter}
|
|
5684
5744
|
AND COALESCE(confidence, 0.7) >= 0.3`;
|
|
5685
5745
|
const args = [agentId];
|
|
5746
|
+
if (options?.asOf) {
|
|
5747
|
+
sql += ` AND (valid_from IS NULL OR valid_from <= ?) AND (invalid_at IS NULL OR invalid_at > ?)`;
|
|
5748
|
+
args.push(options.asOf, options.asOf);
|
|
5749
|
+
} else {
|
|
5750
|
+
sql += ` AND invalid_at IS NULL`;
|
|
5751
|
+
}
|
|
5686
5752
|
const scope = buildWikiScopeFilter(options, "");
|
|
5687
5753
|
sql += scope.clause;
|
|
5688
5754
|
args.push(...scope.args);
|
|
@@ -7468,7 +7534,7 @@ import { pathToFileURL as pathToFileURL2 } from "url";
|
|
|
7468
7534
|
import os9 from "os";
|
|
7469
7535
|
import path16 from "path";
|
|
7470
7536
|
import { jwtVerify, importSPKI } from "jose";
|
|
7471
|
-
var LICENSE_PATH, CACHE_PATH, DEVICE_ID_PATH, PLAN_LIMITS;
|
|
7537
|
+
var LICENSE_PATH, CACHE_PATH, DEVICE_ID_PATH, API_BASE, PLAN_LIMITS;
|
|
7472
7538
|
var init_license = __esm({
|
|
7473
7539
|
"src/lib/license.ts"() {
|
|
7474
7540
|
"use strict";
|
|
@@ -7476,6 +7542,7 @@ var init_license = __esm({
|
|
|
7476
7542
|
LICENSE_PATH = path16.join(EXE_AI_DIR, "license.key");
|
|
7477
7543
|
CACHE_PATH = path16.join(EXE_AI_DIR, "license-cache.json");
|
|
7478
7544
|
DEVICE_ID_PATH = path16.join(EXE_AI_DIR, "device-id");
|
|
7545
|
+
API_BASE = process.env.EXE_CLOUD_ENDPOINT ?? "https://askexe.com/cloud";
|
|
7479
7546
|
PLAN_LIMITS = {
|
|
7480
7547
|
free: { devices: 1, employees: 1, memories: 5e3 },
|
|
7481
7548
|
pro: { devices: 3, employees: 5, memories: 1e5 },
|
|
@@ -8029,8 +8096,8 @@ ${scopeMismatchWarning}` : scopeMismatchWarning;
|
|
|
8029
8096
|
const complexity = input2.complexity ?? "standard";
|
|
8030
8097
|
const sessionScope = earlySessionScope;
|
|
8031
8098
|
await client.execute({
|
|
8032
|
-
sql: `INSERT INTO tasks (id, title, assigned_to, assigned_by, project_name, priority, status, task_file, blocked_by, parent_task_id, reviewer, context, complexity, budget_tokens, budget_fallback_model, tokens_used, tokens_warned_at, session_scope, created_at, updated_at)
|
|
8033
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
8099
|
+
sql: `INSERT INTO tasks (id, title, assigned_to, assigned_by, project_name, priority, status, task_file, blocked_by, parent_task_id, reviewer, context, complexity, budget_tokens, budget_fallback_model, tokens_used, tokens_warned_at, session_scope, spawn_runtime, spawn_model, created_at, updated_at)
|
|
8100
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
8034
8101
|
args: [
|
|
8035
8102
|
id,
|
|
8036
8103
|
input2.title,
|
|
@@ -8050,6 +8117,8 @@ ${scopeMismatchWarning}` : scopeMismatchWarning;
|
|
|
8050
8117
|
0,
|
|
8051
8118
|
null,
|
|
8052
8119
|
sessionScope,
|
|
8120
|
+
input2.spawnRuntime ?? null,
|
|
8121
|
+
input2.spawnModel ?? null,
|
|
8053
8122
|
now,
|
|
8054
8123
|
now
|
|
8055
8124
|
]
|
|
@@ -8106,7 +8175,9 @@ ${input2.context}
|
|
|
8106
8175
|
budgetTokens: input2.budgetTokens ?? null,
|
|
8107
8176
|
budgetFallbackModel: input2.budgetFallbackModel ?? null,
|
|
8108
8177
|
tokensUsed: 0,
|
|
8109
|
-
tokensWarnedAt: null
|
|
8178
|
+
tokensWarnedAt: null,
|
|
8179
|
+
spawnRuntime: input2.spawnRuntime ?? null,
|
|
8180
|
+
spawnModel: input2.spawnModel ?? null
|
|
8110
8181
|
};
|
|
8111
8182
|
}
|
|
8112
8183
|
async function listTasks(input2) {
|
|
@@ -8156,7 +8227,9 @@ async function listTasks(input2) {
|
|
|
8156
8227
|
budgetTokens: r.budget_tokens !== null ? Number(r.budget_tokens) : null,
|
|
8157
8228
|
budgetFallbackModel: r.budget_fallback_model !== null ? String(r.budget_fallback_model) : null,
|
|
8158
8229
|
tokensUsed: Number(r.tokens_used ?? 0),
|
|
8159
|
-
tokensWarnedAt: r.tokens_warned_at !== null ? Number(r.tokens_warned_at) : null
|
|
8230
|
+
tokensWarnedAt: r.tokens_warned_at !== null ? Number(r.tokens_warned_at) : null,
|
|
8231
|
+
spawnRuntime: r.spawn_runtime !== null && r.spawn_runtime !== void 0 ? String(r.spawn_runtime) : null,
|
|
8232
|
+
spawnModel: r.spawn_model !== null && r.spawn_model !== void 0 ? String(r.spawn_model) : null
|
|
8160
8233
|
}));
|
|
8161
8234
|
}
|
|
8162
8235
|
function isTmuxSessionAlive(identifier) {
|
|
@@ -9456,6 +9529,8 @@ async function updateTask(input2) {
|
|
|
9456
9529
|
budgetFallbackModel: row.budget_fallback_model !== void 0 && row.budget_fallback_model !== null ? String(row.budget_fallback_model) : null,
|
|
9457
9530
|
tokensUsed: Number(row.tokens_used ?? 0),
|
|
9458
9531
|
tokensWarnedAt: row.tokens_warned_at !== void 0 && row.tokens_warned_at !== null ? Number(row.tokens_warned_at) : null,
|
|
9532
|
+
spawnRuntime: row.spawn_runtime !== void 0 && row.spawn_runtime !== null ? String(row.spawn_runtime) : null,
|
|
9533
|
+
spawnModel: row.spawn_model !== void 0 && row.spawn_model !== null ? String(row.spawn_model) : null,
|
|
9459
9534
|
nextTask
|
|
9460
9535
|
};
|
|
9461
9536
|
}
|
|
@@ -9948,9 +10023,13 @@ function getDispatchedBy(sessionKey) {
|
|
|
9948
10023
|
}
|
|
9949
10024
|
}
|
|
9950
10025
|
function resolveExeSession() {
|
|
10026
|
+
if (process.env.EXE_SESSION_NAME) {
|
|
10027
|
+
return extractRootExe(process.env.EXE_SESSION_NAME) ?? process.env.EXE_SESSION_NAME;
|
|
10028
|
+
}
|
|
9951
10029
|
const mySession = getMySession();
|
|
9952
10030
|
if (!mySession) return null;
|
|
9953
10031
|
const fromSessionName = extractRootExe(mySession);
|
|
10032
|
+
let candidate = null;
|
|
9954
10033
|
try {
|
|
9955
10034
|
const key = getSessionKey();
|
|
9956
10035
|
const parentExe = getParentExe(key);
|
|
@@ -9961,13 +10040,47 @@ function resolveExeSession() {
|
|
|
9961
10040
|
`[tmux-routing] WARN: cache says "${fromCache}" but session name says "${fromSessionName}". Trusting session name.
|
|
9962
10041
|
`
|
|
9963
10042
|
);
|
|
9964
|
-
|
|
10043
|
+
candidate = fromSessionName;
|
|
10044
|
+
} else {
|
|
10045
|
+
candidate = fromCache;
|
|
9965
10046
|
}
|
|
9966
|
-
return fromCache;
|
|
9967
10047
|
}
|
|
9968
10048
|
} catch {
|
|
9969
10049
|
}
|
|
9970
|
-
|
|
10050
|
+
if (!candidate) {
|
|
10051
|
+
candidate = fromSessionName ?? mySession;
|
|
10052
|
+
}
|
|
10053
|
+
if (candidate && isRootSession(candidate)) {
|
|
10054
|
+
try {
|
|
10055
|
+
const transport = getTransport();
|
|
10056
|
+
const liveSessions = transport.listSessions();
|
|
10057
|
+
if (!liveSessions.includes(candidate)) {
|
|
10058
|
+
const liveRoots = liveSessions.filter((s) => isRootSession(s));
|
|
10059
|
+
if (liveRoots.length === 1) {
|
|
10060
|
+
process.stderr.write(
|
|
10061
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead. Using live coordinator "${liveRoots[0]}".
|
|
10062
|
+
`
|
|
10063
|
+
);
|
|
10064
|
+
return liveRoots[0];
|
|
10065
|
+
} else if (liveRoots.length > 1) {
|
|
10066
|
+
const base = candidate.replace(/\d+$/, "");
|
|
10067
|
+
const match = liveRoots.find((s) => s.startsWith(base));
|
|
10068
|
+
const chosen = match ?? liveRoots[0];
|
|
10069
|
+
process.stderr.write(
|
|
10070
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead. ${liveRoots.length} live roots found, using "${chosen}".
|
|
10071
|
+
`
|
|
10072
|
+
);
|
|
10073
|
+
return chosen;
|
|
10074
|
+
}
|
|
10075
|
+
process.stderr.write(
|
|
10076
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead and no live coordinator found.
|
|
10077
|
+
`
|
|
10078
|
+
);
|
|
10079
|
+
}
|
|
10080
|
+
} catch {
|
|
10081
|
+
}
|
|
10082
|
+
}
|
|
10083
|
+
return candidate;
|
|
9971
10084
|
}
|
|
9972
10085
|
function isEmployeeAlive(sessionName) {
|
|
9973
10086
|
return getTransport().isAlive(sessionName);
|
|
@@ -10369,7 +10482,12 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
10369
10482
|
}
|
|
10370
10483
|
const spawnCwd = opts?.cwd ?? projectDir;
|
|
10371
10484
|
const useExeAgent = !!(opts?.model && opts?.provider);
|
|
10372
|
-
const
|
|
10485
|
+
const baseRtConfig = getAgentRuntime(employeeName);
|
|
10486
|
+
const agentRtConfig = {
|
|
10487
|
+
...baseRtConfig,
|
|
10488
|
+
...opts?.runtimeOverride ? { runtime: opts.runtimeOverride } : {},
|
|
10489
|
+
...opts?.modelOverride ? { model: opts.modelOverride } : {}
|
|
10490
|
+
};
|
|
10373
10491
|
const useCodex = !useExeAgent && agentRtConfig.runtime === "codex";
|
|
10374
10492
|
const useOpencode = !useExeAgent && !useCodex && agentRtConfig.runtime === "opencode";
|
|
10375
10493
|
const ccProvider = useExeAgent || useCodex || useOpencode ? DEFAULT_PROVIDER : detectActiveProvider();
|
|
@@ -11154,6 +11272,19 @@ import path26 from "path";
|
|
|
11154
11272
|
init_store();
|
|
11155
11273
|
init_database();
|
|
11156
11274
|
var RRF_K = 60;
|
|
11275
|
+
function buildTemporalFilter(options, columnPrefix) {
|
|
11276
|
+
const asOf = options?.asOf;
|
|
11277
|
+
if (asOf) {
|
|
11278
|
+
return {
|
|
11279
|
+
clause: ` AND (${columnPrefix}valid_from IS NULL OR ${columnPrefix}valid_from <= ?) AND (${columnPrefix}invalid_at IS NULL OR ${columnPrefix}invalid_at > ?)`,
|
|
11280
|
+
args: [asOf, asOf]
|
|
11281
|
+
};
|
|
11282
|
+
}
|
|
11283
|
+
return {
|
|
11284
|
+
clause: ` AND ${columnPrefix}invalid_at IS NULL`,
|
|
11285
|
+
args: []
|
|
11286
|
+
};
|
|
11287
|
+
}
|
|
11157
11288
|
function appendMemoryTypeFilter(sql, args, column, options) {
|
|
11158
11289
|
if (options?.memoryTypes && options.memoryTypes.length > 0) {
|
|
11159
11290
|
const uniqueTypes = [...new Set(options.memoryTypes)];
|
|
@@ -11386,6 +11517,9 @@ async function estimateCardinality(agentId, options) {
|
|
|
11386
11517
|
AND COALESCE(status, 'active') = 'active'
|
|
11387
11518
|
AND COALESCE(confidence, 0.7) >= 0.3`;
|
|
11388
11519
|
const args = [agentId];
|
|
11520
|
+
const temporal = buildTemporalFilter(options, "");
|
|
11521
|
+
sql += temporal.clause;
|
|
11522
|
+
args.push(...temporal.args);
|
|
11389
11523
|
const rawVisibility = buildRawVisibilityFilter(options, "");
|
|
11390
11524
|
sql += rawVisibility.clause;
|
|
11391
11525
|
args.push(...rawVisibility.args);
|
|
@@ -11511,6 +11645,9 @@ async function ftsQuery(client, matchExpr, agentId, options, limit) {
|
|
|
11511
11645
|
AND m.agent_id = ?${statusFilter}${draftFilter}
|
|
11512
11646
|
AND COALESCE(m.confidence, 0.7) >= 0.3`;
|
|
11513
11647
|
const args = [matchExpr, agentId];
|
|
11648
|
+
const temporal = buildTemporalFilter(options, "m.");
|
|
11649
|
+
sql += temporal.clause;
|
|
11650
|
+
args.push(...temporal.args);
|
|
11514
11651
|
const scope = buildWikiScopeFilter(options, "m.");
|
|
11515
11652
|
sql += scope.clause;
|
|
11516
11653
|
args.push(...scope.args);
|
|
@@ -11623,6 +11760,9 @@ async function recentRecords(agentId, options, limit, textFilter) {
|
|
|
11623
11760
|
WHERE agent_id = ?${statusFilter}${draftFilter}
|
|
11624
11761
|
AND COALESCE(confidence, 0.7) >= 0.3`;
|
|
11625
11762
|
const args = [agentId];
|
|
11763
|
+
const temporal = buildTemporalFilter(options, "");
|
|
11764
|
+
sql += temporal.clause;
|
|
11765
|
+
args.push(...temporal.args);
|
|
11626
11766
|
const scope = buildWikiScopeFilter(options, "");
|
|
11627
11767
|
sql += scope.clause;
|
|
11628
11768
|
args.push(...scope.args);
|
|
@@ -11735,6 +11875,9 @@ async function trajectoryBypass(queryText, agentId, options, limit) {
|
|
|
11735
11875
|
AND json_extract(trajectory, '$.tool') = ?
|
|
11736
11876
|
AND agent_id = ?${statusFilter}${draftFilter}`;
|
|
11737
11877
|
const args = [toolName, agentId];
|
|
11878
|
+
const temporal = buildTemporalFilter(options, "");
|
|
11879
|
+
sql += temporal.clause;
|
|
11880
|
+
args.push(...temporal.args);
|
|
11738
11881
|
const rawVisibility = buildRawVisibilityFilter(options, "");
|
|
11739
11882
|
sql += rawVisibility.clause;
|
|
11740
11883
|
args.push(...rawVisibility.args);
|
|
@@ -12121,6 +12264,38 @@ ${lines.join("\n")}`;
|
|
|
12121
12264
|
} catch {
|
|
12122
12265
|
}
|
|
12123
12266
|
}
|
|
12267
|
+
let identityContext = "";
|
|
12268
|
+
if (!IS_CODEX_RUNTIME && agent.agentId !== "default") {
|
|
12269
|
+
try {
|
|
12270
|
+
const counterPath = path26.join(CACHE_DIR3, `prompt-count-${getSessionKey()}`);
|
|
12271
|
+
let turnCount = 1;
|
|
12272
|
+
try {
|
|
12273
|
+
turnCount = parseInt(readFileSync17(counterPath, "utf8").trim(), 10);
|
|
12274
|
+
} catch {
|
|
12275
|
+
}
|
|
12276
|
+
const IDENTITY_REINJECT_INTERVAL = 10;
|
|
12277
|
+
if (turnCount % IDENTITY_REINJECT_INTERVAL === 0) {
|
|
12278
|
+
const { existsSync: idExists, readFileSync: idRead } = await import("fs");
|
|
12279
|
+
const idPath = await import("path");
|
|
12280
|
+
const identityFile = idPath.join(
|
|
12281
|
+
process.env.EXE_OS_DIR ?? idPath.join(process.env.HOME ?? "", ".exe-os"),
|
|
12282
|
+
"identity",
|
|
12283
|
+
`${agent.agentId}.md`
|
|
12284
|
+
);
|
|
12285
|
+
if (idExists(identityFile)) {
|
|
12286
|
+
const raw = idRead(identityFile, "utf8");
|
|
12287
|
+
const body = raw.replace(/^---[\s\S]*?---\n/, "").trim().slice(0, 500);
|
|
12288
|
+
if (body.length > 0) {
|
|
12289
|
+
identityContext = `
|
|
12290
|
+
## Role Reminder
|
|
12291
|
+
You are **${agent.agentId}** (${agent.agentRole}). Stay in character.
|
|
12292
|
+
${body}`;
|
|
12293
|
+
}
|
|
12294
|
+
}
|
|
12295
|
+
}
|
|
12296
|
+
} catch {
|
|
12297
|
+
}
|
|
12298
|
+
}
|
|
12124
12299
|
let reviewContext = "";
|
|
12125
12300
|
if (canCoordinate(agent.agentId, agent.agentRole)) {
|
|
12126
12301
|
try {
|
|
@@ -12176,7 +12351,7 @@ IMPORTANT: After completing your current task, you MUST address the pending revi
|
|
|
12176
12351
|
} catch {
|
|
12177
12352
|
}
|
|
12178
12353
|
}
|
|
12179
|
-
const combined = [cacheContext, memoryContext, behaviorContext, reviewContext].filter(Boolean).join("\n\n");
|
|
12354
|
+
const combined = [cacheContext, memoryContext, behaviorContext, identityContext, reviewContext].filter(Boolean).join("\n\n");
|
|
12180
12355
|
if (combined.length > 0) {
|
|
12181
12356
|
const output = JSON.stringify({
|
|
12182
12357
|
hookSpecificOutput: {
|