@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
package/dist/bin/exe-gateway.js
CHANGED
|
@@ -3436,6 +3436,20 @@ async function ensureSchema() {
|
|
|
3436
3436
|
});
|
|
3437
3437
|
} catch {
|
|
3438
3438
|
}
|
|
3439
|
+
try {
|
|
3440
|
+
await client.execute({
|
|
3441
|
+
sql: `ALTER TABLE tasks ADD COLUMN spawn_runtime TEXT`,
|
|
3442
|
+
args: []
|
|
3443
|
+
});
|
|
3444
|
+
} catch {
|
|
3445
|
+
}
|
|
3446
|
+
try {
|
|
3447
|
+
await client.execute({
|
|
3448
|
+
sql: `ALTER TABLE tasks ADD COLUMN spawn_model TEXT`,
|
|
3449
|
+
args: []
|
|
3450
|
+
});
|
|
3451
|
+
} catch {
|
|
3452
|
+
}
|
|
3439
3453
|
await client.executeMultiple(`
|
|
3440
3454
|
CREATE VIRTUAL TABLE IF NOT EXISTS conversations_fts USING fts5(
|
|
3441
3455
|
content_text,
|
|
@@ -3687,6 +3701,22 @@ async function ensureSchema() {
|
|
|
3687
3701
|
);
|
|
3688
3702
|
} catch {
|
|
3689
3703
|
}
|
|
3704
|
+
for (const col of [
|
|
3705
|
+
"ALTER TABLE memories ADD COLUMN valid_from TEXT",
|
|
3706
|
+
"ALTER TABLE memories ADD COLUMN invalid_at TEXT"
|
|
3707
|
+
]) {
|
|
3708
|
+
try {
|
|
3709
|
+
await client.execute(col);
|
|
3710
|
+
} catch {
|
|
3711
|
+
}
|
|
3712
|
+
}
|
|
3713
|
+
try {
|
|
3714
|
+
await client.execute({
|
|
3715
|
+
sql: `UPDATE memories SET valid_from = timestamp WHERE valid_from IS NULL`,
|
|
3716
|
+
args: []
|
|
3717
|
+
});
|
|
3718
|
+
} catch {
|
|
3719
|
+
}
|
|
3690
3720
|
try {
|
|
3691
3721
|
await client.execute({
|
|
3692
3722
|
sql: `ALTER TABLE memories ADD COLUMN memory_type TEXT DEFAULT 'raw'`,
|
|
@@ -3729,6 +3759,13 @@ async function ensureSchema() {
|
|
|
3729
3759
|
} catch {
|
|
3730
3760
|
}
|
|
3731
3761
|
}
|
|
3762
|
+
try {
|
|
3763
|
+
await client.execute({
|
|
3764
|
+
sql: `ALTER TABLE memories ADD COLUMN procedure_for TEXT`,
|
|
3765
|
+
args: []
|
|
3766
|
+
});
|
|
3767
|
+
} catch {
|
|
3768
|
+
}
|
|
3732
3769
|
try {
|
|
3733
3770
|
await client.execute({
|
|
3734
3771
|
sql: `UPDATE tasks SET status = 'closed' WHERE status = 'done' AND result IS NOT NULL`,
|
|
@@ -4880,6 +4917,20 @@ var init_platform_procedures = __esm({
|
|
|
4880
4917
|
priority: "p1",
|
|
4881
4918
|
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."
|
|
4882
4919
|
},
|
|
4920
|
+
// --- Tool guidance ---
|
|
4921
|
+
{
|
|
4922
|
+
title: "How to use company_actions \u2014 execute business actions through gateway connectors",
|
|
4923
|
+
domain: "tools",
|
|
4924
|
+
priority: "p2",
|
|
4925
|
+
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."
|
|
4926
|
+
},
|
|
4927
|
+
// --- Release awareness ---
|
|
4928
|
+
{
|
|
4929
|
+
title: "What's New check \u2014 surface new features after update",
|
|
4930
|
+
domain: "support",
|
|
4931
|
+
priority: "p1",
|
|
4932
|
+
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."
|
|
4933
|
+
},
|
|
4883
4934
|
// --- Platform vs Customer ownership ---
|
|
4884
4935
|
{
|
|
4885
4936
|
title: "What the platform provides vs what you customize",
|
|
@@ -4968,13 +5019,13 @@ var init_platform_procedures = __esm({
|
|
|
4968
5019
|
title: "MCP tools \u2014 memory, decision, and search",
|
|
4969
5020
|
domain: "tool-use",
|
|
4970
5021
|
priority: "p1",
|
|
4971
|
-
content: `memory(action="recall") / recall_my_memory: search
|
|
5022
|
+
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.`
|
|
4972
5023
|
},
|
|
4973
5024
|
{
|
|
4974
5025
|
title: "MCP tools \u2014 task orchestration",
|
|
4975
5026
|
domain: "tool-use",
|
|
4976
5027
|
priority: "p1",
|
|
4977
|
-
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.'
|
|
5028
|
+
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.'
|
|
4978
5029
|
},
|
|
4979
5030
|
{
|
|
4980
5031
|
title: "MCP tools \u2014 knowledge graph (GraphRAG)",
|
|
@@ -5004,7 +5055,7 @@ var init_platform_procedures = __esm({
|
|
|
5004
5055
|
title: "MCP tools \u2014 admin, config, and operations",
|
|
5005
5056
|
domain: "tool-use",
|
|
5006
5057
|
priority: "p1",
|
|
5007
|
-
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.'
|
|
5058
|
+
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.'
|
|
5008
5059
|
}
|
|
5009
5060
|
];
|
|
5010
5061
|
PLATFORM_PROCEDURE_TITLES = new Set(
|
|
@@ -5688,6 +5739,8 @@ async function writeMemory(record) {
|
|
|
5688
5739
|
source_type: record.source_type ?? null,
|
|
5689
5740
|
tier: record.tier ?? classifyTier(record),
|
|
5690
5741
|
supersedes_id: record.supersedes_id ?? null,
|
|
5742
|
+
valid_from: record.valid_from ?? record.timestamp,
|
|
5743
|
+
invalid_at: record.invalid_at ?? null,
|
|
5691
5744
|
draft: record.draft ? 1 : 0,
|
|
5692
5745
|
memory_type: memoryType,
|
|
5693
5746
|
trajectory: record.trajectory ? JSON.stringify(record.trajectory) : null,
|
|
@@ -5706,7 +5759,8 @@ async function writeMemory(record) {
|
|
|
5706
5759
|
token_cost: record.token_cost ?? null,
|
|
5707
5760
|
audience: record.audience ?? null,
|
|
5708
5761
|
language_type: record.language_type ?? inferLanguageType(record),
|
|
5709
|
-
parent_memory_id: record.parent_memory_id ?? null
|
|
5762
|
+
parent_memory_id: record.parent_memory_id ?? null,
|
|
5763
|
+
procedure_for: record.procedure_for ?? null
|
|
5710
5764
|
};
|
|
5711
5765
|
_pendingRecords.push(dbRow);
|
|
5712
5766
|
orgBus.emit({
|
|
@@ -5761,6 +5815,8 @@ async function flushBatch() {
|
|
|
5761
5815
|
const sourceType = row.source_type ?? null;
|
|
5762
5816
|
const tier = row.tier ?? 3;
|
|
5763
5817
|
const supersedesId = row.supersedes_id ?? null;
|
|
5818
|
+
const validFrom = row.valid_from ?? row.timestamp;
|
|
5819
|
+
const invalidAt = row.invalid_at ?? null;
|
|
5764
5820
|
const draft = row.draft ? 1 : 0;
|
|
5765
5821
|
const memoryType = row.memory_type ?? "raw";
|
|
5766
5822
|
const trajectory = row.trajectory ?? null;
|
|
@@ -5780,15 +5836,16 @@ async function flushBatch() {
|
|
|
5780
5836
|
const audience = row.audience ?? null;
|
|
5781
5837
|
const languageType = row.language_type ?? null;
|
|
5782
5838
|
const parentMemoryId = row.parent_memory_id ?? null;
|
|
5839
|
+
const procedureFor = row.procedure_for ?? null;
|
|
5783
5840
|
const cols = `id, agent_id, agent_role, session_id, timestamp,
|
|
5784
5841
|
tool_name, project_name,
|
|
5785
5842
|
has_error, raw_text, vector, version, task_id, importance, status,
|
|
5786
5843
|
confidence, last_accessed,
|
|
5787
5844
|
workspace_id, document_id, user_id, char_offset, page_number,
|
|
5788
|
-
source_path, source_type, tier, supersedes_id, draft, memory_type, trajectory, content_hash,
|
|
5845
|
+
source_path, source_type, tier, supersedes_id, valid_from, invalid_at, draft, memory_type, trajectory, content_hash,
|
|
5789
5846
|
intent, outcome, domain, referenced_entities, retrieval_count,
|
|
5790
5847
|
chain_position, review_status, context_window_pct, file_paths, commit_hash,
|
|
5791
|
-
duration_ms, token_cost, audience, language_type, parent_memory_id`;
|
|
5848
|
+
duration_ms, token_cost, audience, language_type, parent_memory_id, procedure_for`;
|
|
5792
5849
|
const metaArgs = [
|
|
5793
5850
|
intent,
|
|
5794
5851
|
outcome,
|
|
@@ -5804,7 +5861,8 @@ async function flushBatch() {
|
|
|
5804
5861
|
tokenCost,
|
|
5805
5862
|
audience,
|
|
5806
5863
|
languageType,
|
|
5807
|
-
parentMemoryId
|
|
5864
|
+
parentMemoryId,
|
|
5865
|
+
procedureFor
|
|
5808
5866
|
];
|
|
5809
5867
|
const baseArgs = [
|
|
5810
5868
|
row.id,
|
|
@@ -5833,6 +5891,8 @@ async function flushBatch() {
|
|
|
5833
5891
|
sourceType,
|
|
5834
5892
|
tier,
|
|
5835
5893
|
supersedesId,
|
|
5894
|
+
validFrom,
|
|
5895
|
+
invalidAt,
|
|
5836
5896
|
draft,
|
|
5837
5897
|
memoryType,
|
|
5838
5898
|
trajectory,
|
|
@@ -5840,8 +5900,8 @@ async function flushBatch() {
|
|
|
5840
5900
|
];
|
|
5841
5901
|
return {
|
|
5842
5902
|
sql: hasVector ? `INSERT OR IGNORE INTO memories (${cols})
|
|
5843
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, vector32(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` : `INSERT OR IGNORE INTO memories (${cols})
|
|
5844
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
5903
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, vector32(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` : `INSERT OR IGNORE INTO memories (${cols})
|
|
5904
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
5845
5905
|
args: hasVector ? [...baseArgs, vectorToBlob(row.vector), ...sharedArgs, ...metaArgs] : [...baseArgs, ...sharedArgs, ...metaArgs]
|
|
5846
5906
|
};
|
|
5847
5907
|
};
|
|
@@ -5957,6 +6017,12 @@ async function searchMemories(queryVector, agentId, options) {
|
|
|
5957
6017
|
AND vector IS NOT NULL${statusFilter}${draftFilter}
|
|
5958
6018
|
AND COALESCE(confidence, 0.7) >= 0.3`;
|
|
5959
6019
|
const args = [agentId];
|
|
6020
|
+
if (options?.asOf) {
|
|
6021
|
+
sql += ` AND (valid_from IS NULL OR valid_from <= ?) AND (invalid_at IS NULL OR invalid_at > ?)`;
|
|
6022
|
+
args.push(options.asOf, options.asOf);
|
|
6023
|
+
} else {
|
|
6024
|
+
sql += ` AND invalid_at IS NULL`;
|
|
6025
|
+
}
|
|
5960
6026
|
const scope = buildWikiScopeFilter(options, "");
|
|
5961
6027
|
sql += scope.clause;
|
|
5962
6028
|
args.push(...scope.args);
|
|
@@ -7712,7 +7778,7 @@ var init_license = __esm({
|
|
|
7712
7778
|
LICENSE_PATH = path10.join(EXE_AI_DIR, "license.key");
|
|
7713
7779
|
CACHE_PATH = path10.join(EXE_AI_DIR, "license-cache.json");
|
|
7714
7780
|
DEVICE_ID_PATH = path10.join(EXE_AI_DIR, "device-id");
|
|
7715
|
-
API_BASE = "https://askexe.com/cloud";
|
|
7781
|
+
API_BASE = process.env.EXE_CLOUD_ENDPOINT ?? "https://askexe.com/cloud";
|
|
7716
7782
|
RETRY_DELAY_MS = 500;
|
|
7717
7783
|
LICENSE_PUBLIC_KEY_PEM = `-----BEGIN PUBLIC KEY-----
|
|
7718
7784
|
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEeHztAMOpR/ZMh+rWuOASjEZ54CGY
|
|
@@ -10463,8 +10529,8 @@ ${scopeMismatchWarning}` : scopeMismatchWarning;
|
|
|
10463
10529
|
const complexity = input.complexity ?? "standard";
|
|
10464
10530
|
const sessionScope = earlySessionScope;
|
|
10465
10531
|
await client.execute({
|
|
10466
|
-
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)
|
|
10467
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
10532
|
+
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)
|
|
10533
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
10468
10534
|
args: [
|
|
10469
10535
|
id,
|
|
10470
10536
|
input.title,
|
|
@@ -10484,6 +10550,8 @@ ${scopeMismatchWarning}` : scopeMismatchWarning;
|
|
|
10484
10550
|
0,
|
|
10485
10551
|
null,
|
|
10486
10552
|
sessionScope,
|
|
10553
|
+
input.spawnRuntime ?? null,
|
|
10554
|
+
input.spawnModel ?? null,
|
|
10487
10555
|
now,
|
|
10488
10556
|
now
|
|
10489
10557
|
]
|
|
@@ -10540,7 +10608,9 @@ ${input.context}
|
|
|
10540
10608
|
budgetTokens: input.budgetTokens ?? null,
|
|
10541
10609
|
budgetFallbackModel: input.budgetFallbackModel ?? null,
|
|
10542
10610
|
tokensUsed: 0,
|
|
10543
|
-
tokensWarnedAt: null
|
|
10611
|
+
tokensWarnedAt: null,
|
|
10612
|
+
spawnRuntime: input.spawnRuntime ?? null,
|
|
10613
|
+
spawnModel: input.spawnModel ?? null
|
|
10544
10614
|
};
|
|
10545
10615
|
}
|
|
10546
10616
|
async function listTasks(input) {
|
|
@@ -10590,7 +10660,9 @@ async function listTasks(input) {
|
|
|
10590
10660
|
budgetTokens: r.budget_tokens !== null ? Number(r.budget_tokens) : null,
|
|
10591
10661
|
budgetFallbackModel: r.budget_fallback_model !== null ? String(r.budget_fallback_model) : null,
|
|
10592
10662
|
tokensUsed: Number(r.tokens_used ?? 0),
|
|
10593
|
-
tokensWarnedAt: r.tokens_warned_at !== null ? Number(r.tokens_warned_at) : null
|
|
10663
|
+
tokensWarnedAt: r.tokens_warned_at !== null ? Number(r.tokens_warned_at) : null,
|
|
10664
|
+
spawnRuntime: r.spawn_runtime !== null && r.spawn_runtime !== void 0 ? String(r.spawn_runtime) : null,
|
|
10665
|
+
spawnModel: r.spawn_model !== null && r.spawn_model !== void 0 ? String(r.spawn_model) : null
|
|
10594
10666
|
}));
|
|
10595
10667
|
}
|
|
10596
10668
|
function isTmuxSessionAlive(identifier) {
|
|
@@ -11819,6 +11891,8 @@ async function updateTask(input) {
|
|
|
11819
11891
|
budgetFallbackModel: row.budget_fallback_model !== void 0 && row.budget_fallback_model !== null ? String(row.budget_fallback_model) : null,
|
|
11820
11892
|
tokensUsed: Number(row.tokens_used ?? 0),
|
|
11821
11893
|
tokensWarnedAt: row.tokens_warned_at !== void 0 && row.tokens_warned_at !== null ? Number(row.tokens_warned_at) : null,
|
|
11894
|
+
spawnRuntime: row.spawn_runtime !== void 0 && row.spawn_runtime !== null ? String(row.spawn_runtime) : null,
|
|
11895
|
+
spawnModel: row.spawn_model !== void 0 && row.spawn_model !== null ? String(row.spawn_model) : null,
|
|
11822
11896
|
nextTask
|
|
11823
11897
|
};
|
|
11824
11898
|
}
|
|
@@ -12311,9 +12385,13 @@ function getDispatchedBy(sessionKey) {
|
|
|
12311
12385
|
}
|
|
12312
12386
|
}
|
|
12313
12387
|
function resolveExeSession() {
|
|
12388
|
+
if (process.env.EXE_SESSION_NAME) {
|
|
12389
|
+
return extractRootExe(process.env.EXE_SESSION_NAME) ?? process.env.EXE_SESSION_NAME;
|
|
12390
|
+
}
|
|
12314
12391
|
const mySession = getMySession();
|
|
12315
12392
|
if (!mySession) return null;
|
|
12316
12393
|
const fromSessionName = extractRootExe(mySession);
|
|
12394
|
+
let candidate = null;
|
|
12317
12395
|
try {
|
|
12318
12396
|
const key = getSessionKey();
|
|
12319
12397
|
const parentExe = getParentExe(key);
|
|
@@ -12324,13 +12402,47 @@ function resolveExeSession() {
|
|
|
12324
12402
|
`[tmux-routing] WARN: cache says "${fromCache}" but session name says "${fromSessionName}". Trusting session name.
|
|
12325
12403
|
`
|
|
12326
12404
|
);
|
|
12327
|
-
|
|
12405
|
+
candidate = fromSessionName;
|
|
12406
|
+
} else {
|
|
12407
|
+
candidate = fromCache;
|
|
12328
12408
|
}
|
|
12329
|
-
return fromCache;
|
|
12330
12409
|
}
|
|
12331
12410
|
} catch {
|
|
12332
12411
|
}
|
|
12333
|
-
|
|
12412
|
+
if (!candidate) {
|
|
12413
|
+
candidate = fromSessionName ?? mySession;
|
|
12414
|
+
}
|
|
12415
|
+
if (candidate && isRootSession(candidate)) {
|
|
12416
|
+
try {
|
|
12417
|
+
const transport = getTransport();
|
|
12418
|
+
const liveSessions = transport.listSessions();
|
|
12419
|
+
if (!liveSessions.includes(candidate)) {
|
|
12420
|
+
const liveRoots = liveSessions.filter((s) => isRootSession(s));
|
|
12421
|
+
if (liveRoots.length === 1) {
|
|
12422
|
+
process.stderr.write(
|
|
12423
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead. Using live coordinator "${liveRoots[0]}".
|
|
12424
|
+
`
|
|
12425
|
+
);
|
|
12426
|
+
return liveRoots[0];
|
|
12427
|
+
} else if (liveRoots.length > 1) {
|
|
12428
|
+
const base = candidate.replace(/\d+$/, "");
|
|
12429
|
+
const match = liveRoots.find((s) => s.startsWith(base));
|
|
12430
|
+
const chosen = match ?? liveRoots[0];
|
|
12431
|
+
process.stderr.write(
|
|
12432
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead. ${liveRoots.length} live roots found, using "${chosen}".
|
|
12433
|
+
`
|
|
12434
|
+
);
|
|
12435
|
+
return chosen;
|
|
12436
|
+
}
|
|
12437
|
+
process.stderr.write(
|
|
12438
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead and no live coordinator found.
|
|
12439
|
+
`
|
|
12440
|
+
);
|
|
12441
|
+
}
|
|
12442
|
+
} catch {
|
|
12443
|
+
}
|
|
12444
|
+
}
|
|
12445
|
+
return candidate;
|
|
12334
12446
|
}
|
|
12335
12447
|
function isEmployeeAlive(sessionName) {
|
|
12336
12448
|
return getTransport().isAlive(sessionName);
|
|
@@ -12732,7 +12844,12 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
12732
12844
|
}
|
|
12733
12845
|
const spawnCwd = opts?.cwd ?? projectDir;
|
|
12734
12846
|
const useExeAgent = !!(opts?.model && opts?.provider);
|
|
12735
|
-
const
|
|
12847
|
+
const baseRtConfig = getAgentRuntime(employeeName);
|
|
12848
|
+
const agentRtConfig = {
|
|
12849
|
+
...baseRtConfig,
|
|
12850
|
+
...opts?.runtimeOverride ? { runtime: opts.runtimeOverride } : {},
|
|
12851
|
+
...opts?.modelOverride ? { model: opts.modelOverride } : {}
|
|
12852
|
+
};
|
|
12736
12853
|
const useCodex = !useExeAgent && agentRtConfig.runtime === "codex";
|
|
12737
12854
|
const useOpencode = !useExeAgent && !useCodex && agentRtConfig.runtime === "opencode";
|
|
12738
12855
|
const ccProvider = useExeAgent || useCodex || useOpencode ? DEFAULT_PROVIDER : detectActiveProvider();
|
|
@@ -2804,6 +2804,20 @@ async function ensureSchema() {
|
|
|
2804
2804
|
});
|
|
2805
2805
|
} catch {
|
|
2806
2806
|
}
|
|
2807
|
+
try {
|
|
2808
|
+
await client.execute({
|
|
2809
|
+
sql: `ALTER TABLE tasks ADD COLUMN spawn_runtime TEXT`,
|
|
2810
|
+
args: []
|
|
2811
|
+
});
|
|
2812
|
+
} catch {
|
|
2813
|
+
}
|
|
2814
|
+
try {
|
|
2815
|
+
await client.execute({
|
|
2816
|
+
sql: `ALTER TABLE tasks ADD COLUMN spawn_model TEXT`,
|
|
2817
|
+
args: []
|
|
2818
|
+
});
|
|
2819
|
+
} catch {
|
|
2820
|
+
}
|
|
2807
2821
|
await client.executeMultiple(`
|
|
2808
2822
|
CREATE VIRTUAL TABLE IF NOT EXISTS conversations_fts USING fts5(
|
|
2809
2823
|
content_text,
|
|
@@ -3055,6 +3069,22 @@ async function ensureSchema() {
|
|
|
3055
3069
|
);
|
|
3056
3070
|
} catch {
|
|
3057
3071
|
}
|
|
3072
|
+
for (const col of [
|
|
3073
|
+
"ALTER TABLE memories ADD COLUMN valid_from TEXT",
|
|
3074
|
+
"ALTER TABLE memories ADD COLUMN invalid_at TEXT"
|
|
3075
|
+
]) {
|
|
3076
|
+
try {
|
|
3077
|
+
await client.execute(col);
|
|
3078
|
+
} catch {
|
|
3079
|
+
}
|
|
3080
|
+
}
|
|
3081
|
+
try {
|
|
3082
|
+
await client.execute({
|
|
3083
|
+
sql: `UPDATE memories SET valid_from = timestamp WHERE valid_from IS NULL`,
|
|
3084
|
+
args: []
|
|
3085
|
+
});
|
|
3086
|
+
} catch {
|
|
3087
|
+
}
|
|
3058
3088
|
try {
|
|
3059
3089
|
await client.execute({
|
|
3060
3090
|
sql: `ALTER TABLE memories ADD COLUMN memory_type TEXT DEFAULT 'raw'`,
|
|
@@ -3097,6 +3127,13 @@ async function ensureSchema() {
|
|
|
3097
3127
|
} catch {
|
|
3098
3128
|
}
|
|
3099
3129
|
}
|
|
3130
|
+
try {
|
|
3131
|
+
await client.execute({
|
|
3132
|
+
sql: `ALTER TABLE memories ADD COLUMN procedure_for TEXT`,
|
|
3133
|
+
args: []
|
|
3134
|
+
});
|
|
3135
|
+
} catch {
|
|
3136
|
+
}
|
|
3100
3137
|
try {
|
|
3101
3138
|
await client.execute({
|
|
3102
3139
|
sql: `UPDATE tasks SET status = 'closed' WHERE status = 'done' AND result IS NOT NULL`,
|
|
@@ -4235,6 +4272,20 @@ var init_platform_procedures = __esm({
|
|
|
4235
4272
|
priority: "p1",
|
|
4236
4273
|
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."
|
|
4237
4274
|
},
|
|
4275
|
+
// --- Tool guidance ---
|
|
4276
|
+
{
|
|
4277
|
+
title: "How to use company_actions \u2014 execute business actions through gateway connectors",
|
|
4278
|
+
domain: "tools",
|
|
4279
|
+
priority: "p2",
|
|
4280
|
+
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."
|
|
4281
|
+
},
|
|
4282
|
+
// --- Release awareness ---
|
|
4283
|
+
{
|
|
4284
|
+
title: "What's New check \u2014 surface new features after update",
|
|
4285
|
+
domain: "support",
|
|
4286
|
+
priority: "p1",
|
|
4287
|
+
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."
|
|
4288
|
+
},
|
|
4238
4289
|
// --- Platform vs Customer ownership ---
|
|
4239
4290
|
{
|
|
4240
4291
|
title: "What the platform provides vs what you customize",
|
|
@@ -4323,13 +4374,13 @@ var init_platform_procedures = __esm({
|
|
|
4323
4374
|
title: "MCP tools \u2014 memory, decision, and search",
|
|
4324
4375
|
domain: "tool-use",
|
|
4325
4376
|
priority: "p1",
|
|
4326
|
-
content: `memory(action="recall") / recall_my_memory: search
|
|
4377
|
+
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.`
|
|
4327
4378
|
},
|
|
4328
4379
|
{
|
|
4329
4380
|
title: "MCP tools \u2014 task orchestration",
|
|
4330
4381
|
domain: "tool-use",
|
|
4331
4382
|
priority: "p1",
|
|
4332
|
-
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.'
|
|
4383
|
+
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.'
|
|
4333
4384
|
},
|
|
4334
4385
|
{
|
|
4335
4386
|
title: "MCP tools \u2014 knowledge graph (GraphRAG)",
|
|
@@ -4359,7 +4410,7 @@ var init_platform_procedures = __esm({
|
|
|
4359
4410
|
title: "MCP tools \u2014 admin, config, and operations",
|
|
4360
4411
|
domain: "tool-use",
|
|
4361
4412
|
priority: "p1",
|
|
4362
|
-
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.'
|
|
4413
|
+
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.'
|
|
4363
4414
|
}
|
|
4364
4415
|
];
|
|
4365
4416
|
PLATFORM_PROCEDURE_TITLES = new Set(
|
|
@@ -5043,6 +5094,8 @@ async function writeMemory(record) {
|
|
|
5043
5094
|
source_type: record.source_type ?? null,
|
|
5044
5095
|
tier: record.tier ?? classifyTier(record),
|
|
5045
5096
|
supersedes_id: record.supersedes_id ?? null,
|
|
5097
|
+
valid_from: record.valid_from ?? record.timestamp,
|
|
5098
|
+
invalid_at: record.invalid_at ?? null,
|
|
5046
5099
|
draft: record.draft ? 1 : 0,
|
|
5047
5100
|
memory_type: memoryType,
|
|
5048
5101
|
trajectory: record.trajectory ? JSON.stringify(record.trajectory) : null,
|
|
@@ -5061,7 +5114,8 @@ async function writeMemory(record) {
|
|
|
5061
5114
|
token_cost: record.token_cost ?? null,
|
|
5062
5115
|
audience: record.audience ?? null,
|
|
5063
5116
|
language_type: record.language_type ?? inferLanguageType(record),
|
|
5064
|
-
parent_memory_id: record.parent_memory_id ?? null
|
|
5117
|
+
parent_memory_id: record.parent_memory_id ?? null,
|
|
5118
|
+
procedure_for: record.procedure_for ?? null
|
|
5065
5119
|
};
|
|
5066
5120
|
_pendingRecords.push(dbRow);
|
|
5067
5121
|
orgBus.emit({
|
|
@@ -5116,6 +5170,8 @@ async function flushBatch() {
|
|
|
5116
5170
|
const sourceType = row.source_type ?? null;
|
|
5117
5171
|
const tier = row.tier ?? 3;
|
|
5118
5172
|
const supersedesId = row.supersedes_id ?? null;
|
|
5173
|
+
const validFrom = row.valid_from ?? row.timestamp;
|
|
5174
|
+
const invalidAt = row.invalid_at ?? null;
|
|
5119
5175
|
const draft = row.draft ? 1 : 0;
|
|
5120
5176
|
const memoryType = row.memory_type ?? "raw";
|
|
5121
5177
|
const trajectory = row.trajectory ?? null;
|
|
@@ -5135,15 +5191,16 @@ async function flushBatch() {
|
|
|
5135
5191
|
const audience = row.audience ?? null;
|
|
5136
5192
|
const languageType = row.language_type ?? null;
|
|
5137
5193
|
const parentMemoryId = row.parent_memory_id ?? null;
|
|
5194
|
+
const procedureFor = row.procedure_for ?? null;
|
|
5138
5195
|
const cols = `id, agent_id, agent_role, session_id, timestamp,
|
|
5139
5196
|
tool_name, project_name,
|
|
5140
5197
|
has_error, raw_text, vector, version, task_id, importance, status,
|
|
5141
5198
|
confidence, last_accessed,
|
|
5142
5199
|
workspace_id, document_id, user_id, char_offset, page_number,
|
|
5143
|
-
source_path, source_type, tier, supersedes_id, draft, memory_type, trajectory, content_hash,
|
|
5200
|
+
source_path, source_type, tier, supersedes_id, valid_from, invalid_at, draft, memory_type, trajectory, content_hash,
|
|
5144
5201
|
intent, outcome, domain, referenced_entities, retrieval_count,
|
|
5145
5202
|
chain_position, review_status, context_window_pct, file_paths, commit_hash,
|
|
5146
|
-
duration_ms, token_cost, audience, language_type, parent_memory_id`;
|
|
5203
|
+
duration_ms, token_cost, audience, language_type, parent_memory_id, procedure_for`;
|
|
5147
5204
|
const metaArgs = [
|
|
5148
5205
|
intent,
|
|
5149
5206
|
outcome,
|
|
@@ -5159,7 +5216,8 @@ async function flushBatch() {
|
|
|
5159
5216
|
tokenCost,
|
|
5160
5217
|
audience,
|
|
5161
5218
|
languageType,
|
|
5162
|
-
parentMemoryId
|
|
5219
|
+
parentMemoryId,
|
|
5220
|
+
procedureFor
|
|
5163
5221
|
];
|
|
5164
5222
|
const baseArgs = [
|
|
5165
5223
|
row.id,
|
|
@@ -5188,6 +5246,8 @@ async function flushBatch() {
|
|
|
5188
5246
|
sourceType,
|
|
5189
5247
|
tier,
|
|
5190
5248
|
supersedesId,
|
|
5249
|
+
validFrom,
|
|
5250
|
+
invalidAt,
|
|
5191
5251
|
draft,
|
|
5192
5252
|
memoryType,
|
|
5193
5253
|
trajectory,
|
|
@@ -5195,8 +5255,8 @@ async function flushBatch() {
|
|
|
5195
5255
|
];
|
|
5196
5256
|
return {
|
|
5197
5257
|
sql: hasVector ? `INSERT OR IGNORE INTO memories (${cols})
|
|
5198
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, vector32(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` : `INSERT OR IGNORE INTO memories (${cols})
|
|
5199
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
5258
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, vector32(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` : `INSERT OR IGNORE INTO memories (${cols})
|
|
5259
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
5200
5260
|
args: hasVector ? [...baseArgs, vectorToBlob(row.vector), ...sharedArgs, ...metaArgs] : [...baseArgs, ...sharedArgs, ...metaArgs]
|
|
5201
5261
|
};
|
|
5202
5262
|
};
|
|
@@ -5312,6 +5372,12 @@ async function searchMemories(queryVector, agentId, options) {
|
|
|
5312
5372
|
AND vector IS NOT NULL${statusFilter}${draftFilter}
|
|
5313
5373
|
AND COALESCE(confidence, 0.7) >= 0.3`;
|
|
5314
5374
|
const args = [agentId];
|
|
5375
|
+
if (options?.asOf) {
|
|
5376
|
+
sql += ` AND (valid_from IS NULL OR valid_from <= ?) AND (invalid_at IS NULL OR invalid_at > ?)`;
|
|
5377
|
+
args.push(options.asOf, options.asOf);
|
|
5378
|
+
} else {
|
|
5379
|
+
sql += ` AND invalid_at IS NULL`;
|
|
5380
|
+
}
|
|
5315
5381
|
const scope = buildWikiScopeFilter(options, "");
|
|
5316
5382
|
sql += scope.clause;
|
|
5317
5383
|
args.push(...scope.args);
|
|
@@ -5780,7 +5846,7 @@ import { pathToFileURL as pathToFileURL2 } from "url";
|
|
|
5780
5846
|
import os8 from "os";
|
|
5781
5847
|
import path11 from "path";
|
|
5782
5848
|
import { jwtVerify, importSPKI } from "jose";
|
|
5783
|
-
var LICENSE_PATH, CACHE_PATH, DEVICE_ID_PATH;
|
|
5849
|
+
var LICENSE_PATH, CACHE_PATH, DEVICE_ID_PATH, API_BASE;
|
|
5784
5850
|
var init_license = __esm({
|
|
5785
5851
|
"src/lib/license.ts"() {
|
|
5786
5852
|
"use strict";
|
|
@@ -5788,6 +5854,7 @@ var init_license = __esm({
|
|
|
5788
5854
|
LICENSE_PATH = path11.join(EXE_AI_DIR, "license.key");
|
|
5789
5855
|
CACHE_PATH = path11.join(EXE_AI_DIR, "license-cache.json");
|
|
5790
5856
|
DEVICE_ID_PATH = path11.join(EXE_AI_DIR, "device-id");
|
|
5857
|
+
API_BASE = process.env.EXE_CLOUD_ENDPOINT ?? "https://askexe.com/cloud";
|
|
5791
5858
|
}
|
|
5792
5859
|
});
|
|
5793
5860
|
|
|
@@ -5831,6 +5898,9 @@ import { fileURLToPath as fileURLToPath3 } from "url";
|
|
|
5831
5898
|
function getMySession() {
|
|
5832
5899
|
return getTransport().getMySession();
|
|
5833
5900
|
}
|
|
5901
|
+
function isRootSession(name) {
|
|
5902
|
+
return name.length > 0 && !name.includes("-");
|
|
5903
|
+
}
|
|
5834
5904
|
function extractRootExe(name) {
|
|
5835
5905
|
if (!name) return null;
|
|
5836
5906
|
if (!name.includes("-")) return name;
|
|
@@ -5846,9 +5916,13 @@ function getParentExe(sessionKey) {
|
|
|
5846
5916
|
}
|
|
5847
5917
|
}
|
|
5848
5918
|
function resolveExeSession() {
|
|
5919
|
+
if (process.env.EXE_SESSION_NAME) {
|
|
5920
|
+
return extractRootExe(process.env.EXE_SESSION_NAME) ?? process.env.EXE_SESSION_NAME;
|
|
5921
|
+
}
|
|
5849
5922
|
const mySession = getMySession();
|
|
5850
5923
|
if (!mySession) return null;
|
|
5851
5924
|
const fromSessionName = extractRootExe(mySession);
|
|
5925
|
+
let candidate = null;
|
|
5852
5926
|
try {
|
|
5853
5927
|
const key = getSessionKey();
|
|
5854
5928
|
const parentExe = getParentExe(key);
|
|
@@ -5859,13 +5933,47 @@ function resolveExeSession() {
|
|
|
5859
5933
|
`[tmux-routing] WARN: cache says "${fromCache}" but session name says "${fromSessionName}". Trusting session name.
|
|
5860
5934
|
`
|
|
5861
5935
|
);
|
|
5862
|
-
|
|
5936
|
+
candidate = fromSessionName;
|
|
5937
|
+
} else {
|
|
5938
|
+
candidate = fromCache;
|
|
5863
5939
|
}
|
|
5864
|
-
return fromCache;
|
|
5865
5940
|
}
|
|
5866
5941
|
} catch {
|
|
5867
5942
|
}
|
|
5868
|
-
|
|
5943
|
+
if (!candidate) {
|
|
5944
|
+
candidate = fromSessionName ?? mySession;
|
|
5945
|
+
}
|
|
5946
|
+
if (candidate && isRootSession(candidate)) {
|
|
5947
|
+
try {
|
|
5948
|
+
const transport = getTransport();
|
|
5949
|
+
const liveSessions = transport.listSessions();
|
|
5950
|
+
if (!liveSessions.includes(candidate)) {
|
|
5951
|
+
const liveRoots = liveSessions.filter((s) => isRootSession(s));
|
|
5952
|
+
if (liveRoots.length === 1) {
|
|
5953
|
+
process.stderr.write(
|
|
5954
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead. Using live coordinator "${liveRoots[0]}".
|
|
5955
|
+
`
|
|
5956
|
+
);
|
|
5957
|
+
return liveRoots[0];
|
|
5958
|
+
} else if (liveRoots.length > 1) {
|
|
5959
|
+
const base = candidate.replace(/\d+$/, "");
|
|
5960
|
+
const match = liveRoots.find((s) => s.startsWith(base));
|
|
5961
|
+
const chosen = match ?? liveRoots[0];
|
|
5962
|
+
process.stderr.write(
|
|
5963
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead. ${liveRoots.length} live roots found, using "${chosen}".
|
|
5964
|
+
`
|
|
5965
|
+
);
|
|
5966
|
+
return chosen;
|
|
5967
|
+
}
|
|
5968
|
+
process.stderr.write(
|
|
5969
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead and no live coordinator found.
|
|
5970
|
+
`
|
|
5971
|
+
);
|
|
5972
|
+
}
|
|
5973
|
+
} catch {
|
|
5974
|
+
}
|
|
5975
|
+
}
|
|
5976
|
+
return candidate;
|
|
5869
5977
|
}
|
|
5870
5978
|
function isExeSession(sessionName) {
|
|
5871
5979
|
const matchesBaseWithInstance = (baseName) => sessionName === baseName || sessionName.startsWith(baseName) && /^\d+$/.test(sessionName.slice(baseName.length));
|