@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
|
@@ -3356,6 +3356,20 @@ async function ensureSchema() {
|
|
|
3356
3356
|
});
|
|
3357
3357
|
} catch {
|
|
3358
3358
|
}
|
|
3359
|
+
try {
|
|
3360
|
+
await client.execute({
|
|
3361
|
+
sql: `ALTER TABLE tasks ADD COLUMN spawn_runtime TEXT`,
|
|
3362
|
+
args: []
|
|
3363
|
+
});
|
|
3364
|
+
} catch {
|
|
3365
|
+
}
|
|
3366
|
+
try {
|
|
3367
|
+
await client.execute({
|
|
3368
|
+
sql: `ALTER TABLE tasks ADD COLUMN spawn_model TEXT`,
|
|
3369
|
+
args: []
|
|
3370
|
+
});
|
|
3371
|
+
} catch {
|
|
3372
|
+
}
|
|
3359
3373
|
await client.executeMultiple(`
|
|
3360
3374
|
CREATE VIRTUAL TABLE IF NOT EXISTS conversations_fts USING fts5(
|
|
3361
3375
|
content_text,
|
|
@@ -3607,6 +3621,22 @@ async function ensureSchema() {
|
|
|
3607
3621
|
);
|
|
3608
3622
|
} catch {
|
|
3609
3623
|
}
|
|
3624
|
+
for (const col of [
|
|
3625
|
+
"ALTER TABLE memories ADD COLUMN valid_from TEXT",
|
|
3626
|
+
"ALTER TABLE memories ADD COLUMN invalid_at TEXT"
|
|
3627
|
+
]) {
|
|
3628
|
+
try {
|
|
3629
|
+
await client.execute(col);
|
|
3630
|
+
} catch {
|
|
3631
|
+
}
|
|
3632
|
+
}
|
|
3633
|
+
try {
|
|
3634
|
+
await client.execute({
|
|
3635
|
+
sql: `UPDATE memories SET valid_from = timestamp WHERE valid_from IS NULL`,
|
|
3636
|
+
args: []
|
|
3637
|
+
});
|
|
3638
|
+
} catch {
|
|
3639
|
+
}
|
|
3610
3640
|
try {
|
|
3611
3641
|
await client.execute({
|
|
3612
3642
|
sql: `ALTER TABLE memories ADD COLUMN memory_type TEXT DEFAULT 'raw'`,
|
|
@@ -3649,6 +3679,13 @@ async function ensureSchema() {
|
|
|
3649
3679
|
} catch {
|
|
3650
3680
|
}
|
|
3651
3681
|
}
|
|
3682
|
+
try {
|
|
3683
|
+
await client.execute({
|
|
3684
|
+
sql: `ALTER TABLE memories ADD COLUMN procedure_for TEXT`,
|
|
3685
|
+
args: []
|
|
3686
|
+
});
|
|
3687
|
+
} catch {
|
|
3688
|
+
}
|
|
3652
3689
|
try {
|
|
3653
3690
|
await client.execute({
|
|
3654
3691
|
sql: `UPDATE tasks SET status = 'closed' WHERE status = 'done' AND result IS NOT NULL`,
|
|
@@ -3709,7 +3746,7 @@ import { pathToFileURL as pathToFileURL2 } from "url";
|
|
|
3709
3746
|
import os8 from "os";
|
|
3710
3747
|
import path11 from "path";
|
|
3711
3748
|
import { jwtVerify, importSPKI } from "jose";
|
|
3712
|
-
var LICENSE_PATH, CACHE_PATH, DEVICE_ID_PATH, PLAN_LIMITS;
|
|
3749
|
+
var LICENSE_PATH, CACHE_PATH, DEVICE_ID_PATH, API_BASE, PLAN_LIMITS;
|
|
3713
3750
|
var init_license = __esm({
|
|
3714
3751
|
"src/lib/license.ts"() {
|
|
3715
3752
|
"use strict";
|
|
@@ -3717,6 +3754,7 @@ var init_license = __esm({
|
|
|
3717
3754
|
LICENSE_PATH = path11.join(EXE_AI_DIR, "license.key");
|
|
3718
3755
|
CACHE_PATH = path11.join(EXE_AI_DIR, "license-cache.json");
|
|
3719
3756
|
DEVICE_ID_PATH = path11.join(EXE_AI_DIR, "device-id");
|
|
3757
|
+
API_BASE = process.env.EXE_CLOUD_ENDPOINT ?? "https://askexe.com/cloud";
|
|
3720
3758
|
PLAN_LIMITS = {
|
|
3721
3759
|
free: { devices: 1, employees: 1, memories: 5e3 },
|
|
3722
3760
|
pro: { devices: 3, employees: 5, memories: 1e5 },
|
|
@@ -4540,8 +4578,8 @@ ${scopeMismatchWarning}` : scopeMismatchWarning;
|
|
|
4540
4578
|
const complexity = input2.complexity ?? "standard";
|
|
4541
4579
|
const sessionScope = earlySessionScope;
|
|
4542
4580
|
await client.execute({
|
|
4543
|
-
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)
|
|
4544
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
4581
|
+
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)
|
|
4582
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
4545
4583
|
args: [
|
|
4546
4584
|
id,
|
|
4547
4585
|
input2.title,
|
|
@@ -4561,6 +4599,8 @@ ${scopeMismatchWarning}` : scopeMismatchWarning;
|
|
|
4561
4599
|
0,
|
|
4562
4600
|
null,
|
|
4563
4601
|
sessionScope,
|
|
4602
|
+
input2.spawnRuntime ?? null,
|
|
4603
|
+
input2.spawnModel ?? null,
|
|
4564
4604
|
now,
|
|
4565
4605
|
now
|
|
4566
4606
|
]
|
|
@@ -4617,7 +4657,9 @@ ${input2.context}
|
|
|
4617
4657
|
budgetTokens: input2.budgetTokens ?? null,
|
|
4618
4658
|
budgetFallbackModel: input2.budgetFallbackModel ?? null,
|
|
4619
4659
|
tokensUsed: 0,
|
|
4620
|
-
tokensWarnedAt: null
|
|
4660
|
+
tokensWarnedAt: null,
|
|
4661
|
+
spawnRuntime: input2.spawnRuntime ?? null,
|
|
4662
|
+
spawnModel: input2.spawnModel ?? null
|
|
4621
4663
|
};
|
|
4622
4664
|
}
|
|
4623
4665
|
async function listTasks(input2) {
|
|
@@ -4667,7 +4709,9 @@ async function listTasks(input2) {
|
|
|
4667
4709
|
budgetTokens: r.budget_tokens !== null ? Number(r.budget_tokens) : null,
|
|
4668
4710
|
budgetFallbackModel: r.budget_fallback_model !== null ? String(r.budget_fallback_model) : null,
|
|
4669
4711
|
tokensUsed: Number(r.tokens_used ?? 0),
|
|
4670
|
-
tokensWarnedAt: r.tokens_warned_at !== null ? Number(r.tokens_warned_at) : null
|
|
4712
|
+
tokensWarnedAt: r.tokens_warned_at !== null ? Number(r.tokens_warned_at) : null,
|
|
4713
|
+
spawnRuntime: r.spawn_runtime !== null && r.spawn_runtime !== void 0 ? String(r.spawn_runtime) : null,
|
|
4714
|
+
spawnModel: r.spawn_model !== null && r.spawn_model !== void 0 ? String(r.spawn_model) : null
|
|
4671
4715
|
}));
|
|
4672
4716
|
}
|
|
4673
4717
|
function isTmuxSessionAlive(identifier) {
|
|
@@ -5964,6 +6008,8 @@ async function updateTask(input2) {
|
|
|
5964
6008
|
budgetFallbackModel: row.budget_fallback_model !== void 0 && row.budget_fallback_model !== null ? String(row.budget_fallback_model) : null,
|
|
5965
6009
|
tokensUsed: Number(row.tokens_used ?? 0),
|
|
5966
6010
|
tokensWarnedAt: row.tokens_warned_at !== void 0 && row.tokens_warned_at !== null ? Number(row.tokens_warned_at) : null,
|
|
6011
|
+
spawnRuntime: row.spawn_runtime !== void 0 && row.spawn_runtime !== null ? String(row.spawn_runtime) : null,
|
|
6012
|
+
spawnModel: row.spawn_model !== void 0 && row.spawn_model !== null ? String(row.spawn_model) : null,
|
|
5967
6013
|
nextTask
|
|
5968
6014
|
};
|
|
5969
6015
|
}
|
|
@@ -6456,9 +6502,13 @@ function getDispatchedBy(sessionKey) {
|
|
|
6456
6502
|
}
|
|
6457
6503
|
}
|
|
6458
6504
|
function resolveExeSession() {
|
|
6505
|
+
if (process.env.EXE_SESSION_NAME) {
|
|
6506
|
+
return extractRootExe(process.env.EXE_SESSION_NAME) ?? process.env.EXE_SESSION_NAME;
|
|
6507
|
+
}
|
|
6459
6508
|
const mySession = getMySession();
|
|
6460
6509
|
if (!mySession) return null;
|
|
6461
6510
|
const fromSessionName = extractRootExe(mySession);
|
|
6511
|
+
let candidate = null;
|
|
6462
6512
|
try {
|
|
6463
6513
|
const key = getSessionKey();
|
|
6464
6514
|
const parentExe = getParentExe(key);
|
|
@@ -6469,13 +6519,47 @@ function resolveExeSession() {
|
|
|
6469
6519
|
`[tmux-routing] WARN: cache says "${fromCache}" but session name says "${fromSessionName}". Trusting session name.
|
|
6470
6520
|
`
|
|
6471
6521
|
);
|
|
6472
|
-
|
|
6522
|
+
candidate = fromSessionName;
|
|
6523
|
+
} else {
|
|
6524
|
+
candidate = fromCache;
|
|
6473
6525
|
}
|
|
6474
|
-
return fromCache;
|
|
6475
6526
|
}
|
|
6476
6527
|
} catch {
|
|
6477
6528
|
}
|
|
6478
|
-
|
|
6529
|
+
if (!candidate) {
|
|
6530
|
+
candidate = fromSessionName ?? mySession;
|
|
6531
|
+
}
|
|
6532
|
+
if (candidate && isRootSession(candidate)) {
|
|
6533
|
+
try {
|
|
6534
|
+
const transport = getTransport();
|
|
6535
|
+
const liveSessions = transport.listSessions();
|
|
6536
|
+
if (!liveSessions.includes(candidate)) {
|
|
6537
|
+
const liveRoots = liveSessions.filter((s) => isRootSession(s));
|
|
6538
|
+
if (liveRoots.length === 1) {
|
|
6539
|
+
process.stderr.write(
|
|
6540
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead. Using live coordinator "${liveRoots[0]}".
|
|
6541
|
+
`
|
|
6542
|
+
);
|
|
6543
|
+
return liveRoots[0];
|
|
6544
|
+
} else if (liveRoots.length > 1) {
|
|
6545
|
+
const base = candidate.replace(/\d+$/, "");
|
|
6546
|
+
const match = liveRoots.find((s) => s.startsWith(base));
|
|
6547
|
+
const chosen = match ?? liveRoots[0];
|
|
6548
|
+
process.stderr.write(
|
|
6549
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead. ${liveRoots.length} live roots found, using "${chosen}".
|
|
6550
|
+
`
|
|
6551
|
+
);
|
|
6552
|
+
return chosen;
|
|
6553
|
+
}
|
|
6554
|
+
process.stderr.write(
|
|
6555
|
+
`[tmux-routing] WARN: resolved session "${candidate}" is dead and no live coordinator found.
|
|
6556
|
+
`
|
|
6557
|
+
);
|
|
6558
|
+
}
|
|
6559
|
+
} catch {
|
|
6560
|
+
}
|
|
6561
|
+
}
|
|
6562
|
+
return candidate;
|
|
6479
6563
|
}
|
|
6480
6564
|
function isEmployeeAlive(sessionName) {
|
|
6481
6565
|
return getTransport().isAlive(sessionName);
|
|
@@ -6877,7 +6961,12 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
6877
6961
|
}
|
|
6878
6962
|
const spawnCwd = opts?.cwd ?? projectDir;
|
|
6879
6963
|
const useExeAgent = !!(opts?.model && opts?.provider);
|
|
6880
|
-
const
|
|
6964
|
+
const baseRtConfig = getAgentRuntime(employeeName);
|
|
6965
|
+
const agentRtConfig = {
|
|
6966
|
+
...baseRtConfig,
|
|
6967
|
+
...opts?.runtimeOverride ? { runtime: opts.runtimeOverride } : {},
|
|
6968
|
+
...opts?.modelOverride ? { model: opts.modelOverride } : {}
|
|
6969
|
+
};
|
|
6881
6970
|
const useCodex = !useExeAgent && agentRtConfig.runtime === "codex";
|
|
6882
6971
|
const useOpencode = !useExeAgent && !useCodex && agentRtConfig.runtime === "opencode";
|
|
6883
6972
|
const ccProvider = useExeAgent || useCodex || useOpencode ? DEFAULT_PROVIDER : detectActiveProvider();
|
|
@@ -8170,6 +8259,20 @@ var init_platform_procedures = __esm({
|
|
|
8170
8259
|
priority: "p1",
|
|
8171
8260
|
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."
|
|
8172
8261
|
},
|
|
8262
|
+
// --- Tool guidance ---
|
|
8263
|
+
{
|
|
8264
|
+
title: "How to use company_actions \u2014 execute business actions through gateway connectors",
|
|
8265
|
+
domain: "tools",
|
|
8266
|
+
priority: "p2",
|
|
8267
|
+
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."
|
|
8268
|
+
},
|
|
8269
|
+
// --- Release awareness ---
|
|
8270
|
+
{
|
|
8271
|
+
title: "What's New check \u2014 surface new features after update",
|
|
8272
|
+
domain: "support",
|
|
8273
|
+
priority: "p1",
|
|
8274
|
+
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."
|
|
8275
|
+
},
|
|
8173
8276
|
// --- Platform vs Customer ownership ---
|
|
8174
8277
|
{
|
|
8175
8278
|
title: "What the platform provides vs what you customize",
|
|
@@ -8258,13 +8361,13 @@ var init_platform_procedures = __esm({
|
|
|
8258
8361
|
title: "MCP tools \u2014 memory, decision, and search",
|
|
8259
8362
|
domain: "tool-use",
|
|
8260
8363
|
priority: "p1",
|
|
8261
|
-
content: `memory(action="recall") / recall_my_memory: search
|
|
8364
|
+
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.`
|
|
8262
8365
|
},
|
|
8263
8366
|
{
|
|
8264
8367
|
title: "MCP tools \u2014 task orchestration",
|
|
8265
8368
|
domain: "tool-use",
|
|
8266
8369
|
priority: "p1",
|
|
8267
|
-
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.'
|
|
8370
|
+
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.'
|
|
8268
8371
|
},
|
|
8269
8372
|
{
|
|
8270
8373
|
title: "MCP tools \u2014 knowledge graph (GraphRAG)",
|
|
@@ -8294,7 +8397,7 @@ var init_platform_procedures = __esm({
|
|
|
8294
8397
|
title: "MCP tools \u2014 admin, config, and operations",
|
|
8295
8398
|
domain: "tool-use",
|
|
8296
8399
|
priority: "p1",
|
|
8297
|
-
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.'
|
|
8400
|
+
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.'
|
|
8298
8401
|
}
|
|
8299
8402
|
];
|
|
8300
8403
|
PLATFORM_PROCEDURE_TITLES = new Set(
|
|
@@ -8978,6 +9081,8 @@ async function writeMemory(record) {
|
|
|
8978
9081
|
source_type: record.source_type ?? null,
|
|
8979
9082
|
tier: record.tier ?? classifyTier(record),
|
|
8980
9083
|
supersedes_id: record.supersedes_id ?? null,
|
|
9084
|
+
valid_from: record.valid_from ?? record.timestamp,
|
|
9085
|
+
invalid_at: record.invalid_at ?? null,
|
|
8981
9086
|
draft: record.draft ? 1 : 0,
|
|
8982
9087
|
memory_type: memoryType,
|
|
8983
9088
|
trajectory: record.trajectory ? JSON.stringify(record.trajectory) : null,
|
|
@@ -8996,7 +9101,8 @@ async function writeMemory(record) {
|
|
|
8996
9101
|
token_cost: record.token_cost ?? null,
|
|
8997
9102
|
audience: record.audience ?? null,
|
|
8998
9103
|
language_type: record.language_type ?? inferLanguageType(record),
|
|
8999
|
-
parent_memory_id: record.parent_memory_id ?? null
|
|
9104
|
+
parent_memory_id: record.parent_memory_id ?? null,
|
|
9105
|
+
procedure_for: record.procedure_for ?? null
|
|
9000
9106
|
};
|
|
9001
9107
|
_pendingRecords.push(dbRow);
|
|
9002
9108
|
orgBus.emit({
|
|
@@ -9051,6 +9157,8 @@ async function flushBatch() {
|
|
|
9051
9157
|
const sourceType = row.source_type ?? null;
|
|
9052
9158
|
const tier = row.tier ?? 3;
|
|
9053
9159
|
const supersedesId = row.supersedes_id ?? null;
|
|
9160
|
+
const validFrom = row.valid_from ?? row.timestamp;
|
|
9161
|
+
const invalidAt = row.invalid_at ?? null;
|
|
9054
9162
|
const draft = row.draft ? 1 : 0;
|
|
9055
9163
|
const memoryType = row.memory_type ?? "raw";
|
|
9056
9164
|
const trajectory = row.trajectory ?? null;
|
|
@@ -9070,15 +9178,16 @@ async function flushBatch() {
|
|
|
9070
9178
|
const audience = row.audience ?? null;
|
|
9071
9179
|
const languageType = row.language_type ?? null;
|
|
9072
9180
|
const parentMemoryId = row.parent_memory_id ?? null;
|
|
9181
|
+
const procedureFor = row.procedure_for ?? null;
|
|
9073
9182
|
const cols = `id, agent_id, agent_role, session_id, timestamp,
|
|
9074
9183
|
tool_name, project_name,
|
|
9075
9184
|
has_error, raw_text, vector, version, task_id, importance, status,
|
|
9076
9185
|
confidence, last_accessed,
|
|
9077
9186
|
workspace_id, document_id, user_id, char_offset, page_number,
|
|
9078
|
-
source_path, source_type, tier, supersedes_id, draft, memory_type, trajectory, content_hash,
|
|
9187
|
+
source_path, source_type, tier, supersedes_id, valid_from, invalid_at, draft, memory_type, trajectory, content_hash,
|
|
9079
9188
|
intent, outcome, domain, referenced_entities, retrieval_count,
|
|
9080
9189
|
chain_position, review_status, context_window_pct, file_paths, commit_hash,
|
|
9081
|
-
duration_ms, token_cost, audience, language_type, parent_memory_id`;
|
|
9190
|
+
duration_ms, token_cost, audience, language_type, parent_memory_id, procedure_for`;
|
|
9082
9191
|
const metaArgs = [
|
|
9083
9192
|
intent,
|
|
9084
9193
|
outcome,
|
|
@@ -9094,7 +9203,8 @@ async function flushBatch() {
|
|
|
9094
9203
|
tokenCost,
|
|
9095
9204
|
audience,
|
|
9096
9205
|
languageType,
|
|
9097
|
-
parentMemoryId
|
|
9206
|
+
parentMemoryId,
|
|
9207
|
+
procedureFor
|
|
9098
9208
|
];
|
|
9099
9209
|
const baseArgs = [
|
|
9100
9210
|
row.id,
|
|
@@ -9123,6 +9233,8 @@ async function flushBatch() {
|
|
|
9123
9233
|
sourceType,
|
|
9124
9234
|
tier,
|
|
9125
9235
|
supersedesId,
|
|
9236
|
+
validFrom,
|
|
9237
|
+
invalidAt,
|
|
9126
9238
|
draft,
|
|
9127
9239
|
memoryType,
|
|
9128
9240
|
trajectory,
|
|
@@ -9130,8 +9242,8 @@ async function flushBatch() {
|
|
|
9130
9242
|
];
|
|
9131
9243
|
return {
|
|
9132
9244
|
sql: hasVector ? `INSERT OR IGNORE INTO memories (${cols})
|
|
9133
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, vector32(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` : `INSERT OR IGNORE INTO memories (${cols})
|
|
9134
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
9245
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, vector32(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` : `INSERT OR IGNORE INTO memories (${cols})
|
|
9246
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
9135
9247
|
args: hasVector ? [...baseArgs, vectorToBlob(row.vector), ...sharedArgs, ...metaArgs] : [...baseArgs, ...sharedArgs, ...metaArgs]
|
|
9136
9248
|
};
|
|
9137
9249
|
};
|
|
@@ -9247,6 +9359,12 @@ async function searchMemories(queryVector, agentId, options) {
|
|
|
9247
9359
|
AND vector IS NOT NULL${statusFilter}${draftFilter}
|
|
9248
9360
|
AND COALESCE(confidence, 0.7) >= 0.3`;
|
|
9249
9361
|
const args = [agentId];
|
|
9362
|
+
if (options?.asOf) {
|
|
9363
|
+
sql += ` AND (valid_from IS NULL OR valid_from <= ?) AND (invalid_at IS NULL OR invalid_at > ?)`;
|
|
9364
|
+
args.push(options.asOf, options.asOf);
|
|
9365
|
+
} else {
|
|
9366
|
+
sql += ` AND invalid_at IS NULL`;
|
|
9367
|
+
}
|
|
9250
9368
|
const scope = buildWikiScopeFilter(options, "");
|
|
9251
9369
|
sql += scope.clause;
|
|
9252
9370
|
args.push(...scope.args);
|