@askexenow/exe-os 0.9.60 → 0.9.61
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/dist/bin/backfill-conversations.js +72 -5
- package/dist/bin/backfill-responses.js +72 -5
- package/dist/bin/backfill-vectors.js +72 -5
- package/dist/bin/cc-doctor.js +376 -0
- package/dist/bin/cleanup-stale-review-tasks.js +72 -5
- package/dist/bin/cli.js +157 -55
- package/dist/bin/customer-readiness.js +33 -0
- package/dist/bin/exe-agent.js +1 -1
- package/dist/bin/exe-assign.js +72 -5
- package/dist/bin/exe-boot.js +78 -11
- package/dist/bin/exe-call.js +1 -1
- package/dist/bin/exe-dispatch.js +72 -5
- package/dist/bin/exe-doctor.js +72 -5
- package/dist/bin/exe-export-behaviors.js +72 -5
- package/dist/bin/exe-forget.js +72 -5
- package/dist/bin/exe-gateway.js +72 -5
- package/dist/bin/exe-heartbeat.js +72 -5
- package/dist/bin/exe-kill.js +72 -5
- package/dist/bin/exe-launch-agent.js +72 -5
- package/dist/bin/exe-link.js +74 -7
- package/dist/bin/exe-new-employee.js +48 -19
- package/dist/bin/exe-pending-messages.js +72 -5
- package/dist/bin/exe-pending-notifications.js +72 -5
- package/dist/bin/exe-pending-reviews.js +72 -5
- package/dist/bin/exe-rename.js +72 -5
- package/dist/bin/exe-review.js +72 -5
- package/dist/bin/exe-search.js +72 -5
- package/dist/bin/exe-session-cleanup.js +72 -5
- package/dist/bin/exe-start-codex.js +115 -18
- package/dist/bin/exe-start-opencode.js +93 -7
- package/dist/bin/exe-status.js +72 -5
- package/dist/bin/exe-team.js +72 -5
- package/dist/bin/git-sweep.js +72 -5
- package/dist/bin/graph-backfill.js +72 -5
- package/dist/bin/graph-export.js +72 -5
- package/dist/bin/install.js +56 -31
- package/dist/bin/intercom-check.js +72 -5
- package/dist/bin/pre-build-guard.js +98 -0
- package/dist/bin/scan-tasks.js +72 -5
- package/dist/bin/setup.js +75 -8
- package/dist/bin/shard-migrate.js +72 -5
- package/dist/gateway/index.js +78 -11
- package/dist/hooks/bug-report-worker.js +72 -5
- package/dist/hooks/codex-stop-task-finalizer.js +72 -5
- package/dist/hooks/commit-complete.js +72 -5
- package/dist/hooks/error-recall.js +72 -5
- package/dist/hooks/ingest.js +72 -5
- package/dist/hooks/instructions-loaded.js +72 -5
- package/dist/hooks/notification.js +72 -5
- package/dist/hooks/post-compact.js +72 -5
- package/dist/hooks/post-tool-combined.js +72 -5
- package/dist/hooks/pre-compact.js +72 -5
- package/dist/hooks/pre-tool-use.js +72 -5
- package/dist/hooks/prompt-submit.js +72 -5
- package/dist/hooks/session-end.js +72 -5
- package/dist/hooks/session-start.js +72 -5
- package/dist/hooks/stop.js +72 -5
- package/dist/hooks/subagent-stop.js +72 -5
- package/dist/hooks/summary-worker.js +78 -11
- package/dist/index.js +78 -11
- package/dist/lib/cloud-sync.js +74 -7
- package/dist/lib/database.js +68 -1
- package/dist/lib/db.js +68 -1
- package/dist/lib/device-registry.js +68 -1
- package/dist/lib/employee-templates.js +1 -1
- package/dist/lib/exe-daemon.js +103 -26
- package/dist/lib/hybrid-search.js +72 -5
- package/dist/lib/schedules.js +72 -5
- package/dist/lib/store.js +72 -5
- package/dist/mcp/server.js +103 -26
- package/dist/runtime/index.js +72 -5
- package/dist/tui/App.js +80 -13
- package/package.json +1 -1
package/dist/bin/cli.js
CHANGED
|
@@ -810,6 +810,48 @@ var init_preferences = __esm({
|
|
|
810
810
|
}
|
|
811
811
|
});
|
|
812
812
|
|
|
813
|
+
// src/adapters/runtime-hook-manifest.ts
|
|
814
|
+
function commandHasAnyMarker(command, markers) {
|
|
815
|
+
return markers.some((marker) => command.includes(marker));
|
|
816
|
+
}
|
|
817
|
+
function isLegacySplitPostToolCommand(command) {
|
|
818
|
+
return commandHasAnyMarker(command, LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS);
|
|
819
|
+
}
|
|
820
|
+
function textHasLegacySplitPostToolHook(text) {
|
|
821
|
+
return [EXE_HOOK_FILES.ingest, EXE_HOOK_FILES.errorRecall, EXE_HOOK_FILES.ingestWorker].some((file) => text.includes(file));
|
|
822
|
+
}
|
|
823
|
+
var EXE_HOOK_FILES, EXE_HOOKS, LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS;
|
|
824
|
+
var init_runtime_hook_manifest = __esm({
|
|
825
|
+
"src/adapters/runtime-hook-manifest.ts"() {
|
|
826
|
+
"use strict";
|
|
827
|
+
EXE_HOOK_FILES = {
|
|
828
|
+
postToolCombined: "post-tool-combined.js",
|
|
829
|
+
ingest: "ingest.js",
|
|
830
|
+
errorRecall: "error-recall.js",
|
|
831
|
+
ingestWorker: "ingest-worker.js"
|
|
832
|
+
};
|
|
833
|
+
EXE_HOOKS = {
|
|
834
|
+
postToolCombined: "dist/hooks/post-tool-combined.js",
|
|
835
|
+
sessionStart: "dist/hooks/session-start.js",
|
|
836
|
+
promptSubmit: "dist/hooks/prompt-submit.js",
|
|
837
|
+
heartbeat: "dist/hooks/exe-heartbeat-hook.js",
|
|
838
|
+
stop: "dist/hooks/stop.js",
|
|
839
|
+
preToolUse: "dist/hooks/pre-tool-use.js",
|
|
840
|
+
subagentStop: "dist/hooks/subagent-stop.js",
|
|
841
|
+
preCompact: "dist/hooks/pre-compact.js",
|
|
842
|
+
postCompact: "dist/hooks/post-compact.js",
|
|
843
|
+
sessionEnd: "dist/hooks/session-end.js",
|
|
844
|
+
notification: "dist/hooks/notification.js",
|
|
845
|
+
instructionsLoaded: "dist/hooks/instructions-loaded.js"
|
|
846
|
+
};
|
|
847
|
+
LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS = [
|
|
848
|
+
"dist/hooks/ingest.js",
|
|
849
|
+
"dist/hooks/error-recall.js",
|
|
850
|
+
"dist/hooks/ingest-worker.js"
|
|
851
|
+
];
|
|
852
|
+
}
|
|
853
|
+
});
|
|
854
|
+
|
|
813
855
|
// src/adapters/claude/installer.ts
|
|
814
856
|
var installer_exports = {};
|
|
815
857
|
__export(installer_exports, {
|
|
@@ -1132,7 +1174,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1132
1174
|
}
|
|
1133
1175
|
]
|
|
1134
1176
|
},
|
|
1135
|
-
marker:
|
|
1177
|
+
marker: EXE_HOOKS.postToolCombined
|
|
1136
1178
|
},
|
|
1137
1179
|
{
|
|
1138
1180
|
event: "SessionStart",
|
|
@@ -1145,7 +1187,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1145
1187
|
}
|
|
1146
1188
|
]
|
|
1147
1189
|
},
|
|
1148
|
-
marker:
|
|
1190
|
+
marker: EXE_HOOKS.sessionStart
|
|
1149
1191
|
},
|
|
1150
1192
|
{
|
|
1151
1193
|
event: "UserPromptSubmit",
|
|
@@ -1157,7 +1199,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1157
1199
|
}
|
|
1158
1200
|
]
|
|
1159
1201
|
},
|
|
1160
|
-
marker:
|
|
1202
|
+
marker: EXE_HOOKS.promptSubmit
|
|
1161
1203
|
},
|
|
1162
1204
|
{
|
|
1163
1205
|
event: "UserPromptSubmit",
|
|
@@ -1170,7 +1212,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1170
1212
|
}
|
|
1171
1213
|
]
|
|
1172
1214
|
},
|
|
1173
|
-
marker:
|
|
1215
|
+
marker: EXE_HOOKS.heartbeat
|
|
1174
1216
|
},
|
|
1175
1217
|
{
|
|
1176
1218
|
event: "Stop",
|
|
@@ -1182,7 +1224,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1182
1224
|
}
|
|
1183
1225
|
]
|
|
1184
1226
|
},
|
|
1185
|
-
marker:
|
|
1227
|
+
marker: EXE_HOOKS.stop
|
|
1186
1228
|
},
|
|
1187
1229
|
{
|
|
1188
1230
|
event: "PreToolUse",
|
|
@@ -1195,7 +1237,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1195
1237
|
}
|
|
1196
1238
|
]
|
|
1197
1239
|
},
|
|
1198
|
-
marker:
|
|
1240
|
+
marker: EXE_HOOKS.preToolUse
|
|
1199
1241
|
},
|
|
1200
1242
|
{
|
|
1201
1243
|
event: "SubagentStop",
|
|
@@ -1207,7 +1249,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1207
1249
|
}
|
|
1208
1250
|
]
|
|
1209
1251
|
},
|
|
1210
|
-
marker:
|
|
1252
|
+
marker: EXE_HOOKS.subagentStop
|
|
1211
1253
|
},
|
|
1212
1254
|
{
|
|
1213
1255
|
event: "PreCompact",
|
|
@@ -1220,7 +1262,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1220
1262
|
}
|
|
1221
1263
|
]
|
|
1222
1264
|
},
|
|
1223
|
-
marker:
|
|
1265
|
+
marker: EXE_HOOKS.preCompact
|
|
1224
1266
|
},
|
|
1225
1267
|
{
|
|
1226
1268
|
event: "SessionEnd",
|
|
@@ -1232,7 +1274,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1232
1274
|
}
|
|
1233
1275
|
]
|
|
1234
1276
|
},
|
|
1235
|
-
marker:
|
|
1277
|
+
marker: EXE_HOOKS.sessionEnd
|
|
1236
1278
|
},
|
|
1237
1279
|
{
|
|
1238
1280
|
event: "Notification",
|
|
@@ -1244,7 +1286,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1244
1286
|
}
|
|
1245
1287
|
]
|
|
1246
1288
|
},
|
|
1247
|
-
marker:
|
|
1289
|
+
marker: EXE_HOOKS.notification
|
|
1248
1290
|
},
|
|
1249
1291
|
{
|
|
1250
1292
|
event: "PostCompact",
|
|
@@ -1257,7 +1299,7 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1257
1299
|
}
|
|
1258
1300
|
]
|
|
1259
1301
|
},
|
|
1260
|
-
marker:
|
|
1302
|
+
marker: EXE_HOOKS.postCompact
|
|
1261
1303
|
},
|
|
1262
1304
|
{
|
|
1263
1305
|
event: "InstructionsLoaded",
|
|
@@ -1269,21 +1311,16 @@ async function mergeHooks(packageRoot, homeDir = os5.homedir()) {
|
|
|
1269
1311
|
}
|
|
1270
1312
|
]
|
|
1271
1313
|
},
|
|
1272
|
-
marker:
|
|
1314
|
+
marker: EXE_HOOKS.instructionsLoaded
|
|
1273
1315
|
}
|
|
1274
1316
|
];
|
|
1275
1317
|
let added = 0;
|
|
1276
1318
|
let skipped = 0;
|
|
1277
|
-
const legacyPostToolMarkers = [
|
|
1278
|
-
"dist/hooks/ingest.js",
|
|
1279
|
-
"dist/hooks/error-recall.js",
|
|
1280
|
-
"dist/hooks/ingest-worker.js"
|
|
1281
|
-
];
|
|
1282
1319
|
const postToolGroups = settings.hooks["PostToolUse"];
|
|
1283
1320
|
if (Array.isArray(postToolGroups)) {
|
|
1284
1321
|
settings.hooks["PostToolUse"] = postToolGroups.map((g) => ({
|
|
1285
1322
|
...g,
|
|
1286
|
-
hooks: g.hooks.filter((h) => !
|
|
1323
|
+
hooks: g.hooks.filter((h) => !isLegacySplitPostToolCommand(h.command))
|
|
1287
1324
|
})).filter((g) => g.hooks.length > 0);
|
|
1288
1325
|
}
|
|
1289
1326
|
for (const { event, group, marker } of hooksToRegister) {
|
|
@@ -1760,6 +1797,7 @@ var init_installer = __esm({
|
|
|
1760
1797
|
init_agent_symlinks();
|
|
1761
1798
|
init_mcp_prefix();
|
|
1762
1799
|
init_preferences();
|
|
1800
|
+
init_runtime_hook_manifest();
|
|
1763
1801
|
EXE_SECTION_START = "<!-- exe-os:orchestration-start -->";
|
|
1764
1802
|
EXE_SECTION_END = "<!-- exe-os:orchestration-end -->";
|
|
1765
1803
|
ORCHESTRATION_RULES = `${EXE_SECTION_START}
|
|
@@ -4306,7 +4344,7 @@ async function ensureSchema() {
|
|
|
4306
4344
|
ON session_kills(agent_id);
|
|
4307
4345
|
`);
|
|
4308
4346
|
await client.execute(`
|
|
4309
|
-
CREATE TABLE IF NOT EXISTS
|
|
4347
|
+
CREATE TABLE IF NOT EXISTS company_procedures (
|
|
4310
4348
|
id TEXT PRIMARY KEY,
|
|
4311
4349
|
title TEXT NOT NULL,
|
|
4312
4350
|
content TEXT NOT NULL,
|
|
@@ -4317,6 +4355,73 @@ async function ensureSchema() {
|
|
|
4317
4355
|
updated_at TEXT NOT NULL
|
|
4318
4356
|
)
|
|
4319
4357
|
`);
|
|
4358
|
+
const legacyProcedureObject = await client.execute({
|
|
4359
|
+
sql: "SELECT type FROM sqlite_master WHERE name = 'global_procedures'",
|
|
4360
|
+
args: []
|
|
4361
|
+
});
|
|
4362
|
+
const legacyProcedureType = legacyProcedureObject.rows[0]?.type == null ? null : String(legacyProcedureObject.rows[0].type);
|
|
4363
|
+
if (legacyProcedureType === "table") {
|
|
4364
|
+
await client.execute(`
|
|
4365
|
+
INSERT OR IGNORE INTO company_procedures
|
|
4366
|
+
(id, title, content, priority, domain, active, created_at, updated_at)
|
|
4367
|
+
SELECT id, title, content, priority, domain, active, created_at, updated_at
|
|
4368
|
+
FROM global_procedures
|
|
4369
|
+
`);
|
|
4370
|
+
await client.executeMultiple(`
|
|
4371
|
+
CREATE TRIGGER IF NOT EXISTS global_procedures_mirror_insert
|
|
4372
|
+
AFTER INSERT ON global_procedures
|
|
4373
|
+
BEGIN
|
|
4374
|
+
INSERT OR IGNORE INTO company_procedures
|
|
4375
|
+
(id, title, content, priority, domain, active, created_at, updated_at)
|
|
4376
|
+
VALUES
|
|
4377
|
+
(NEW.id, NEW.title, NEW.content, NEW.priority, NEW.domain, NEW.active, NEW.created_at, NEW.updated_at);
|
|
4378
|
+
END;
|
|
4379
|
+
|
|
4380
|
+
CREATE TRIGGER IF NOT EXISTS global_procedures_mirror_update
|
|
4381
|
+
AFTER UPDATE ON global_procedures
|
|
4382
|
+
BEGIN
|
|
4383
|
+
UPDATE company_procedures
|
|
4384
|
+
SET title = NEW.title,
|
|
4385
|
+
content = NEW.content,
|
|
4386
|
+
priority = NEW.priority,
|
|
4387
|
+
domain = NEW.domain,
|
|
4388
|
+
active = NEW.active,
|
|
4389
|
+
created_at = NEW.created_at,
|
|
4390
|
+
updated_at = NEW.updated_at
|
|
4391
|
+
WHERE id = OLD.id;
|
|
4392
|
+
END;
|
|
4393
|
+
`);
|
|
4394
|
+
} else {
|
|
4395
|
+
await client.execute(`
|
|
4396
|
+
CREATE VIEW IF NOT EXISTS global_procedures AS
|
|
4397
|
+
SELECT id, title, content, priority, domain, active, created_at, updated_at
|
|
4398
|
+
FROM company_procedures
|
|
4399
|
+
`);
|
|
4400
|
+
await client.executeMultiple(`
|
|
4401
|
+
CREATE TRIGGER IF NOT EXISTS global_procedures_insert
|
|
4402
|
+
INSTEAD OF INSERT ON global_procedures
|
|
4403
|
+
BEGIN
|
|
4404
|
+
INSERT INTO company_procedures
|
|
4405
|
+
(id, title, content, priority, domain, active, created_at, updated_at)
|
|
4406
|
+
VALUES
|
|
4407
|
+
(NEW.id, NEW.title, NEW.content, NEW.priority, NEW.domain, NEW.active, NEW.created_at, NEW.updated_at);
|
|
4408
|
+
END;
|
|
4409
|
+
|
|
4410
|
+
CREATE TRIGGER IF NOT EXISTS global_procedures_update
|
|
4411
|
+
INSTEAD OF UPDATE ON global_procedures
|
|
4412
|
+
BEGIN
|
|
4413
|
+
UPDATE company_procedures
|
|
4414
|
+
SET title = NEW.title,
|
|
4415
|
+
content = NEW.content,
|
|
4416
|
+
priority = NEW.priority,
|
|
4417
|
+
domain = NEW.domain,
|
|
4418
|
+
active = NEW.active,
|
|
4419
|
+
created_at = NEW.created_at,
|
|
4420
|
+
updated_at = NEW.updated_at
|
|
4421
|
+
WHERE id = OLD.id;
|
|
4422
|
+
END;
|
|
4423
|
+
`);
|
|
4424
|
+
}
|
|
4320
4425
|
await client.executeMultiple(`
|
|
4321
4426
|
CREATE TABLE IF NOT EXISTS conversations (
|
|
4322
4427
|
id TEXT PRIMARY KEY,
|
|
@@ -5904,12 +6009,12 @@ async function cloudSync(config) {
|
|
|
5904
6009
|
try {
|
|
5905
6010
|
await cloudPushGlobalProcedures(config);
|
|
5906
6011
|
} catch (err) {
|
|
5907
|
-
logError(`[cloud-sync]
|
|
6012
|
+
logError(`[cloud-sync] Company procedures push: ${err instanceof Error ? err.message : String(err)}`);
|
|
5908
6013
|
}
|
|
5909
6014
|
try {
|
|
5910
6015
|
await cloudPullGlobalProcedures(config);
|
|
5911
6016
|
} catch (err) {
|
|
5912
|
-
logError(`[cloud-sync]
|
|
6017
|
+
logError(`[cloud-sync] Company procedures pull: ${err instanceof Error ? err.message : String(err)}`);
|
|
5913
6018
|
}
|
|
5914
6019
|
const countRows = async (sql) => {
|
|
5915
6020
|
try {
|
|
@@ -6318,12 +6423,12 @@ async function cloudPullBlob(route, config) {
|
|
|
6318
6423
|
}
|
|
6319
6424
|
async function cloudPushGlobalProcedures(config) {
|
|
6320
6425
|
const client = getClient();
|
|
6321
|
-
const result = await client.execute("SELECT * FROM
|
|
6426
|
+
const result = await client.execute("SELECT * FROM company_procedures LIMIT 1000");
|
|
6322
6427
|
const rows = result.rows;
|
|
6323
6428
|
const { ok } = await cloudPushBlob(
|
|
6324
6429
|
"/sync/push-global-procedures",
|
|
6325
6430
|
rows,
|
|
6326
|
-
"
|
|
6431
|
+
"last_company_procedures_push_version",
|
|
6327
6432
|
config
|
|
6328
6433
|
);
|
|
6329
6434
|
return ok;
|
|
@@ -6336,7 +6441,7 @@ async function cloudPullGlobalProcedures(config) {
|
|
|
6336
6441
|
if (!remoteProcs || remoteProcs.length === 0) return { pulled: 0 };
|
|
6337
6442
|
const client = getClient();
|
|
6338
6443
|
const stmts = remoteProcs.map((p) => ({
|
|
6339
|
-
sql: `INSERT INTO
|
|
6444
|
+
sql: `INSERT INTO company_procedures
|
|
6340
6445
|
(id, title, content, priority, domain, active, created_at, updated_at)
|
|
6341
6446
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
6342
6447
|
ON CONFLICT(id) DO UPDATE SET
|
|
@@ -6346,7 +6451,7 @@ async function cloudPullGlobalProcedures(config) {
|
|
|
6346
6451
|
domain = excluded.domain,
|
|
6347
6452
|
active = excluded.active,
|
|
6348
6453
|
updated_at = excluded.updated_at
|
|
6349
|
-
WHERE excluded.updated_at >
|
|
6454
|
+
WHERE excluded.updated_at > company_procedures.updated_at`,
|
|
6350
6455
|
args: [
|
|
6351
6456
|
sqlSafe(p.id),
|
|
6352
6457
|
sqlSafe(p.title),
|
|
@@ -7756,7 +7861,7 @@ var init_platform_procedures = __esm({
|
|
|
7756
7861
|
title: "MCP tools \u2014 advanced (triggers, skills, orchestration)",
|
|
7757
7862
|
domain: "tool-use",
|
|
7758
7863
|
priority: "p1",
|
|
7759
|
-
content: "create_trigger: set up a scheduled recurring agent job (cron). list_triggers: view active triggers. load_skill: load a slash-command skill dynamically. apply_starter_pack: import a pre-built behavior + identity pack for a role. export_orchestration: export full org state (tasks, behaviors, identities) as portable JSON. import_orchestration: import org state into a new instance. deploy_client: deploy a customer client instance. query_company_brain: unified RAG query across all company knowledge. create_reminder: set a text reminder (shown in boot brief). list_reminders: view pending reminders. complete_reminder: mark a reminder done.
|
|
7864
|
+
content: "create_trigger: set up a scheduled recurring agent job (cron). list_triggers: view active triggers. load_skill: load a slash-command skill dynamically. apply_starter_pack: import a pre-built behavior + identity pack for a role. export_orchestration: export full org state (tasks, behaviors, identities) as portable JSON. import_orchestration: import org state into a new instance. deploy_client: deploy a customer client instance. query_company_brain: unified RAG query across all company knowledge. create_reminder: set a text reminder (shown in boot brief). list_reminders: view pending reminders. complete_reminder: mark a reminder done. company_procedure: manage customer-owned company procedures (Layer 0; actions: store, list, deactivate). Legacy aliases: global_procedure, store_global_procedure, list_global_procedures, deactivate_global_procedure."
|
|
7760
7865
|
}
|
|
7761
7866
|
];
|
|
7762
7867
|
PLATFORM_PROCEDURE_TITLES = new Set(
|
|
@@ -7777,7 +7882,7 @@ import { randomUUID as randomUUID3 } from "crypto";
|
|
|
7777
7882
|
async function loadGlobalProcedures() {
|
|
7778
7883
|
const client = getClient();
|
|
7779
7884
|
const result = await client.execute({
|
|
7780
|
-
sql: "SELECT * FROM
|
|
7885
|
+
sql: "SELECT * FROM company_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
|
|
7781
7886
|
args: []
|
|
7782
7887
|
});
|
|
7783
7888
|
const allRows = result.rows;
|
|
@@ -7806,7 +7911,7 @@ async function storeGlobalProcedure(input) {
|
|
|
7806
7911
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
7807
7912
|
const client = getClient();
|
|
7808
7913
|
await client.execute({
|
|
7809
|
-
sql: `INSERT INTO
|
|
7914
|
+
sql: `INSERT INTO company_procedures (id, title, content, priority, domain, active, created_at, updated_at)
|
|
7810
7915
|
VALUES (?, ?, ?, ?, ?, 1, ?, ?)`,
|
|
7811
7916
|
args: [id, input.title, input.content, input.priority ?? "p0", input.domain ?? null, now, now]
|
|
7812
7917
|
});
|
|
@@ -7817,7 +7922,7 @@ async function deactivateGlobalProcedure(id) {
|
|
|
7817
7922
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
7818
7923
|
const client = getClient();
|
|
7819
7924
|
const result = await client.execute({
|
|
7820
|
-
sql: "UPDATE
|
|
7925
|
+
sql: "UPDATE company_procedures SET active = 0, updated_at = ? WHERE id = ?",
|
|
7821
7926
|
args: [now, id]
|
|
7822
7927
|
});
|
|
7823
7928
|
await loadGlobalProcedures();
|
|
@@ -9695,7 +9800,7 @@ async function insertProcedures(procedures, timestamp, options) {
|
|
|
9695
9800
|
continue;
|
|
9696
9801
|
}
|
|
9697
9802
|
await client.execute({
|
|
9698
|
-
sql: `INSERT INTO
|
|
9803
|
+
sql: `INSERT INTO company_procedures (id, title, content, priority, domain, active, created_at, updated_at)
|
|
9699
9804
|
VALUES (?, ?, ?, ?, ?, 1, ?, ?)`,
|
|
9700
9805
|
args: [
|
|
9701
9806
|
randomUUID4(),
|
|
@@ -9777,7 +9882,7 @@ async function importIdentities(identities, updatedBy) {
|
|
|
9777
9882
|
async function getActiveProcedureTitles() {
|
|
9778
9883
|
const client = getClient();
|
|
9779
9884
|
const result = await client.execute({
|
|
9780
|
-
sql: "SELECT title FROM
|
|
9885
|
+
sql: "SELECT title FROM company_procedures WHERE active = 1",
|
|
9781
9886
|
args: []
|
|
9782
9887
|
});
|
|
9783
9888
|
return new Set(result.rows.map((row) => String(row.title)));
|
|
@@ -9800,7 +9905,7 @@ async function exportOrchestration(createdBy) {
|
|
|
9800
9905
|
args: []
|
|
9801
9906
|
});
|
|
9802
9907
|
const procedureResult = await client.execute({
|
|
9803
|
-
sql: "SELECT title, content, priority, domain FROM
|
|
9908
|
+
sql: "SELECT title, content, priority, domain FROM company_procedures WHERE active = 1",
|
|
9804
9909
|
args: []
|
|
9805
9910
|
});
|
|
9806
9911
|
const behaviors = behaviorResult.rows.map((row) => ({
|
|
@@ -25494,16 +25599,16 @@ var init_useAgentLoop = __esm({
|
|
|
25494
25599
|
}
|
|
25495
25600
|
});
|
|
25496
25601
|
|
|
25497
|
-
// src/
|
|
25602
|
+
// src/lib/providers/anthropic.ts
|
|
25498
25603
|
import Anthropic from "@anthropic-ai/sdk";
|
|
25499
25604
|
var AnthropicProvider;
|
|
25500
25605
|
var init_anthropic = __esm({
|
|
25501
|
-
"src/
|
|
25606
|
+
"src/lib/providers/anthropic.ts"() {
|
|
25502
25607
|
"use strict";
|
|
25503
25608
|
AnthropicProvider = class {
|
|
25504
25609
|
name;
|
|
25505
|
-
client;
|
|
25506
25610
|
defaultModel;
|
|
25611
|
+
client;
|
|
25507
25612
|
constructor(name, config) {
|
|
25508
25613
|
this.name = name;
|
|
25509
25614
|
this.defaultModel = config.defaultModel ?? "claude-sonnet-4-20250514";
|
|
@@ -25596,17 +25701,17 @@ var init_anthropic = __esm({
|
|
|
25596
25701
|
}
|
|
25597
25702
|
});
|
|
25598
25703
|
|
|
25599
|
-
// src/
|
|
25704
|
+
// src/lib/providers/openai-compat.ts
|
|
25600
25705
|
import OpenAI from "openai";
|
|
25601
25706
|
import { randomUUID as randomUUID5 } from "crypto";
|
|
25602
25707
|
var OpenAICompatProvider;
|
|
25603
25708
|
var init_openai_compat = __esm({
|
|
25604
|
-
"src/
|
|
25709
|
+
"src/lib/providers/openai-compat.ts"() {
|
|
25605
25710
|
"use strict";
|
|
25606
25711
|
OpenAICompatProvider = class {
|
|
25607
25712
|
name;
|
|
25608
|
-
client;
|
|
25609
25713
|
defaultModel;
|
|
25714
|
+
client;
|
|
25610
25715
|
constructor(name, config) {
|
|
25611
25716
|
this.name = name;
|
|
25612
25717
|
this.defaultModel = config.defaultModel ?? "gpt-4o";
|
|
@@ -25738,7 +25843,7 @@ var init_openai_compat = __esm({
|
|
|
25738
25843
|
}
|
|
25739
25844
|
});
|
|
25740
25845
|
|
|
25741
|
-
// src/
|
|
25846
|
+
// src/lib/providers/factory.ts
|
|
25742
25847
|
var factory_exports = {};
|
|
25743
25848
|
__export(factory_exports, {
|
|
25744
25849
|
OPENCODE_ANTHROPIC_MODELS: () => OPENCODE_ANTHROPIC_MODELS,
|
|
@@ -25789,7 +25894,7 @@ function createProvider(opts) {
|
|
|
25789
25894
|
}
|
|
25790
25895
|
var OPENCODE_BASE_URL, OPENCODE_ANTHROPIC_MODELS, OPENCODE_OPENAI_MODELS, OPENAI_BASE_URL;
|
|
25791
25896
|
var init_factory = __esm({
|
|
25792
|
-
"src/
|
|
25897
|
+
"src/lib/providers/factory.ts"() {
|
|
25793
25898
|
"use strict";
|
|
25794
25899
|
init_anthropic();
|
|
25795
25900
|
init_openai_compat();
|
|
@@ -31434,8 +31539,8 @@ function verifyOpenCodeHooks(homeDir = os19.homedir()) {
|
|
|
31434
31539
|
if (!existsSync32(pluginPath)) return false;
|
|
31435
31540
|
try {
|
|
31436
31541
|
const plugin = readFileSync28(pluginPath, "utf-8");
|
|
31437
|
-
if (!plugin.includes(
|
|
31438
|
-
if (
|
|
31542
|
+
if (!plugin.includes(EXE_HOOK_FILES.postToolCombined)) return false;
|
|
31543
|
+
if (textHasLegacySplitPostToolHook(plugin)) return false;
|
|
31439
31544
|
} catch {
|
|
31440
31545
|
return false;
|
|
31441
31546
|
}
|
|
@@ -31459,6 +31564,7 @@ var init_installer2 = __esm({
|
|
|
31459
31564
|
"use strict";
|
|
31460
31565
|
init_installer();
|
|
31461
31566
|
init_plugin_template();
|
|
31567
|
+
init_runtime_hook_manifest();
|
|
31462
31568
|
}
|
|
31463
31569
|
});
|
|
31464
31570
|
|
|
@@ -31507,7 +31613,7 @@ async function mergeCodexHooks(packageRoot, homeDir = os20.homedir()) {
|
|
|
31507
31613
|
}
|
|
31508
31614
|
]
|
|
31509
31615
|
},
|
|
31510
|
-
marker:
|
|
31616
|
+
marker: EXE_HOOKS.sessionStart
|
|
31511
31617
|
},
|
|
31512
31618
|
{
|
|
31513
31619
|
event: "PostToolUse",
|
|
@@ -31522,7 +31628,7 @@ async function mergeCodexHooks(packageRoot, homeDir = os20.homedir()) {
|
|
|
31522
31628
|
}
|
|
31523
31629
|
]
|
|
31524
31630
|
},
|
|
31525
|
-
marker:
|
|
31631
|
+
marker: EXE_HOOKS.postToolCombined
|
|
31526
31632
|
},
|
|
31527
31633
|
{
|
|
31528
31634
|
event: "UserPromptSubmit",
|
|
@@ -31536,7 +31642,7 @@ async function mergeCodexHooks(packageRoot, homeDir = os20.homedir()) {
|
|
|
31536
31642
|
}
|
|
31537
31643
|
]
|
|
31538
31644
|
},
|
|
31539
|
-
marker:
|
|
31645
|
+
marker: EXE_HOOKS.promptSubmit
|
|
31540
31646
|
},
|
|
31541
31647
|
{
|
|
31542
31648
|
event: "Stop",
|
|
@@ -31548,7 +31654,7 @@ async function mergeCodexHooks(packageRoot, homeDir = os20.homedir()) {
|
|
|
31548
31654
|
}
|
|
31549
31655
|
]
|
|
31550
31656
|
},
|
|
31551
|
-
marker:
|
|
31657
|
+
marker: EXE_HOOKS.stop
|
|
31552
31658
|
},
|
|
31553
31659
|
{
|
|
31554
31660
|
event: "PreToolUse",
|
|
@@ -31561,21 +31667,16 @@ async function mergeCodexHooks(packageRoot, homeDir = os20.homedir()) {
|
|
|
31561
31667
|
}
|
|
31562
31668
|
]
|
|
31563
31669
|
},
|
|
31564
|
-
marker:
|
|
31670
|
+
marker: EXE_HOOKS.preToolUse
|
|
31565
31671
|
}
|
|
31566
31672
|
];
|
|
31567
31673
|
let added = 0;
|
|
31568
31674
|
let skipped = 0;
|
|
31569
|
-
const legacyPostToolMarkers = [
|
|
31570
|
-
"dist/hooks/ingest.js",
|
|
31571
|
-
"dist/hooks/error-recall.js",
|
|
31572
|
-
"dist/hooks/ingest-worker.js"
|
|
31573
|
-
];
|
|
31574
31675
|
const postToolGroups = hooksJson.hooks["PostToolUse"];
|
|
31575
31676
|
if (Array.isArray(postToolGroups)) {
|
|
31576
31677
|
hooksJson.hooks["PostToolUse"] = postToolGroups.map((g) => ({
|
|
31577
31678
|
...g,
|
|
31578
|
-
hooks: g.hooks.filter((h) => !
|
|
31679
|
+
hooks: g.hooks.filter((h) => !isLegacySplitPostToolCommand(h.command))
|
|
31579
31680
|
})).filter((g) => g.hooks.length > 0);
|
|
31580
31681
|
}
|
|
31581
31682
|
for (const { event, group, marker } of hooksToRegister) {
|
|
@@ -31618,11 +31719,11 @@ function verifyCodexHooks(homeDir = os20.homedir()) {
|
|
|
31618
31719
|
}
|
|
31619
31720
|
}
|
|
31620
31721
|
const postToolCommands = (hooksJson.hooks.PostToolUse ?? []).flatMap((g) => g.hooks.map((h) => h.command));
|
|
31621
|
-
if (!postToolCommands.some((cmd) => cmd.includes(
|
|
31722
|
+
if (!postToolCommands.some((cmd) => cmd.includes(EXE_HOOKS.postToolCombined))) {
|
|
31622
31723
|
return false;
|
|
31623
31724
|
}
|
|
31624
31725
|
if (postToolCommands.some(
|
|
31625
|
-
(cmd) =>
|
|
31726
|
+
(cmd) => isLegacySplitPostToolCommand(cmd)
|
|
31626
31727
|
)) {
|
|
31627
31728
|
return false;
|
|
31628
31729
|
}
|
|
@@ -31783,6 +31884,7 @@ var init_installer3 = __esm({
|
|
|
31783
31884
|
"use strict";
|
|
31784
31885
|
init_installer();
|
|
31785
31886
|
init_preferences();
|
|
31887
|
+
init_runtime_hook_manifest();
|
|
31786
31888
|
DEFAULT_CODEX_STATUS_LINE = [
|
|
31787
31889
|
"model-with-reasoning",
|
|
31788
31890
|
"current-dir",
|
|
@@ -116,6 +116,39 @@ test("No hardcoded 'yoshi'/'mari' in runtime task routing", () => {
|
|
|
116
116
|
if (router.includes('"mari"') || router.includes("'mari'")) return "Hardcoded 'mari' in task-router.ts";
|
|
117
117
|
return true;
|
|
118
118
|
});
|
|
119
|
+
test("Build output \u2014 referenced standalone dist/bin scripts are explicit tsup entries", () => {
|
|
120
|
+
const pkg = JSON.parse(readSrc("package.json"));
|
|
121
|
+
const tsup = readSrc("tsup.config.ts");
|
|
122
|
+
const commandDocs = execSync(
|
|
123
|
+
`grep -Rho "dist/bin/[A-Za-z0-9._-]*.js" src/commands package.json 2>/dev/null || true`,
|
|
124
|
+
{ encoding: "utf8", cwd: ROOT }
|
|
125
|
+
).trim().split("\n").filter(Boolean);
|
|
126
|
+
const refs = /* @__PURE__ */ new Set();
|
|
127
|
+
for (const value of Object.values(pkg.bin ?? {})) {
|
|
128
|
+
const match = value.match(/dist\/bin\/([^\/]+)\.js$/);
|
|
129
|
+
if (match?.[1]) refs.add(match[1]);
|
|
130
|
+
}
|
|
131
|
+
for (const script of Object.values(pkg.scripts ?? {})) {
|
|
132
|
+
for (const match of script.matchAll(/dist\/bin\/([A-Za-z0-9._-]+)\.js/g)) {
|
|
133
|
+
if (match[1]) refs.add(match[1]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
for (const ref of commandDocs) {
|
|
137
|
+
const match = ref.match(/dist\/bin\/([A-Za-z0-9._-]+)\.js$/);
|
|
138
|
+
if (match?.[1]) refs.add(match[1]);
|
|
139
|
+
}
|
|
140
|
+
const missing = [...refs].filter((name) => !tsup.includes(`"bin/${name}"`));
|
|
141
|
+
if (missing.length > 0) return `Missing tsup bin entries: ${missing.join(", ")}`;
|
|
142
|
+
return true;
|
|
143
|
+
});
|
|
144
|
+
test("Providers \u2014 active code imports lib/providers, not gateway/providers", () => {
|
|
145
|
+
const hits = execSync(
|
|
146
|
+
`grep -R "gateway/providers" -n src --include="*.ts" --include="*.tsx" || true`,
|
|
147
|
+
{ encoding: "utf8", cwd: ROOT }
|
|
148
|
+
).trim().split("\n").filter(Boolean).filter((line) => !line.includes("src/gateway/providers/") && !line.includes("src/bin/customer-readiness.ts"));
|
|
149
|
+
if (hits.length > 0) return `Deprecated provider imports: ${hits.slice(0, 3).join("; ")}`;
|
|
150
|
+
return true;
|
|
151
|
+
});
|
|
119
152
|
console.log(`
|
|
120
153
|
\x1B[1m${pass + fail} tests: ${pass} passed, ${fail} failed\x1B[0m
|
|
121
154
|
`);
|
package/dist/bin/exe-agent.js
CHANGED
|
@@ -1462,7 +1462,7 @@ var PLATFORM_PROCEDURES = [
|
|
|
1462
1462
|
title: "MCP tools \u2014 advanced (triggers, skills, orchestration)",
|
|
1463
1463
|
domain: "tool-use",
|
|
1464
1464
|
priority: "p1",
|
|
1465
|
-
content: "create_trigger: set up a scheduled recurring agent job (cron). list_triggers: view active triggers. load_skill: load a slash-command skill dynamically. apply_starter_pack: import a pre-built behavior + identity pack for a role. export_orchestration: export full org state (tasks, behaviors, identities) as portable JSON. import_orchestration: import org state into a new instance. deploy_client: deploy a customer client instance. query_company_brain: unified RAG query across all company knowledge. create_reminder: set a text reminder (shown in boot brief). list_reminders: view pending reminders. complete_reminder: mark a reminder done.
|
|
1465
|
+
content: "create_trigger: set up a scheduled recurring agent job (cron). list_triggers: view active triggers. load_skill: load a slash-command skill dynamically. apply_starter_pack: import a pre-built behavior + identity pack for a role. export_orchestration: export full org state (tasks, behaviors, identities) as portable JSON. import_orchestration: import org state into a new instance. deploy_client: deploy a customer client instance. query_company_brain: unified RAG query across all company knowledge. create_reminder: set a text reminder (shown in boot brief). list_reminders: view pending reminders. complete_reminder: mark a reminder done. company_procedure: manage customer-owned company procedures (Layer 0; actions: store, list, deactivate). Legacy aliases: global_procedure, store_global_procedure, list_global_procedures, deactivate_global_procedure."
|
|
1466
1466
|
}
|
|
1467
1467
|
];
|
|
1468
1468
|
var PLATFORM_PROCEDURE_TITLES = new Set(
|