@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.
Files changed (73) hide show
  1. package/dist/bin/backfill-conversations.js +72 -5
  2. package/dist/bin/backfill-responses.js +72 -5
  3. package/dist/bin/backfill-vectors.js +72 -5
  4. package/dist/bin/cc-doctor.js +376 -0
  5. package/dist/bin/cleanup-stale-review-tasks.js +72 -5
  6. package/dist/bin/cli.js +157 -55
  7. package/dist/bin/customer-readiness.js +33 -0
  8. package/dist/bin/exe-agent.js +1 -1
  9. package/dist/bin/exe-assign.js +72 -5
  10. package/dist/bin/exe-boot.js +78 -11
  11. package/dist/bin/exe-call.js +1 -1
  12. package/dist/bin/exe-dispatch.js +72 -5
  13. package/dist/bin/exe-doctor.js +72 -5
  14. package/dist/bin/exe-export-behaviors.js +72 -5
  15. package/dist/bin/exe-forget.js +72 -5
  16. package/dist/bin/exe-gateway.js +72 -5
  17. package/dist/bin/exe-heartbeat.js +72 -5
  18. package/dist/bin/exe-kill.js +72 -5
  19. package/dist/bin/exe-launch-agent.js +72 -5
  20. package/dist/bin/exe-link.js +74 -7
  21. package/dist/bin/exe-new-employee.js +48 -19
  22. package/dist/bin/exe-pending-messages.js +72 -5
  23. package/dist/bin/exe-pending-notifications.js +72 -5
  24. package/dist/bin/exe-pending-reviews.js +72 -5
  25. package/dist/bin/exe-rename.js +72 -5
  26. package/dist/bin/exe-review.js +72 -5
  27. package/dist/bin/exe-search.js +72 -5
  28. package/dist/bin/exe-session-cleanup.js +72 -5
  29. package/dist/bin/exe-start-codex.js +115 -18
  30. package/dist/bin/exe-start-opencode.js +93 -7
  31. package/dist/bin/exe-status.js +72 -5
  32. package/dist/bin/exe-team.js +72 -5
  33. package/dist/bin/git-sweep.js +72 -5
  34. package/dist/bin/graph-backfill.js +72 -5
  35. package/dist/bin/graph-export.js +72 -5
  36. package/dist/bin/install.js +56 -31
  37. package/dist/bin/intercom-check.js +72 -5
  38. package/dist/bin/pre-build-guard.js +98 -0
  39. package/dist/bin/scan-tasks.js +72 -5
  40. package/dist/bin/setup.js +75 -8
  41. package/dist/bin/shard-migrate.js +72 -5
  42. package/dist/gateway/index.js +78 -11
  43. package/dist/hooks/bug-report-worker.js +72 -5
  44. package/dist/hooks/codex-stop-task-finalizer.js +72 -5
  45. package/dist/hooks/commit-complete.js +72 -5
  46. package/dist/hooks/error-recall.js +72 -5
  47. package/dist/hooks/ingest.js +72 -5
  48. package/dist/hooks/instructions-loaded.js +72 -5
  49. package/dist/hooks/notification.js +72 -5
  50. package/dist/hooks/post-compact.js +72 -5
  51. package/dist/hooks/post-tool-combined.js +72 -5
  52. package/dist/hooks/pre-compact.js +72 -5
  53. package/dist/hooks/pre-tool-use.js +72 -5
  54. package/dist/hooks/prompt-submit.js +72 -5
  55. package/dist/hooks/session-end.js +72 -5
  56. package/dist/hooks/session-start.js +72 -5
  57. package/dist/hooks/stop.js +72 -5
  58. package/dist/hooks/subagent-stop.js +72 -5
  59. package/dist/hooks/summary-worker.js +78 -11
  60. package/dist/index.js +78 -11
  61. package/dist/lib/cloud-sync.js +74 -7
  62. package/dist/lib/database.js +68 -1
  63. package/dist/lib/db.js +68 -1
  64. package/dist/lib/device-registry.js +68 -1
  65. package/dist/lib/employee-templates.js +1 -1
  66. package/dist/lib/exe-daemon.js +103 -26
  67. package/dist/lib/hybrid-search.js +72 -5
  68. package/dist/lib/schedules.js +72 -5
  69. package/dist/lib/store.js +72 -5
  70. package/dist/mcp/server.js +103 -26
  71. package/dist/runtime/index.js +72 -5
  72. package/dist/tui/App.js +80 -13
  73. 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: "dist/hooks/post-tool-combined.js"
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: "dist/hooks/session-start.js"
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: "dist/hooks/prompt-submit.js"
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: "dist/hooks/exe-heartbeat-hook.js"
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: "dist/hooks/stop.js"
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: "dist/hooks/pre-tool-use.js"
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: "dist/hooks/subagent-stop.js"
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: "dist/hooks/pre-compact.js"
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: "dist/hooks/session-end.js"
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: "dist/hooks/notification.js"
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: "dist/hooks/post-compact.js"
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: "dist/hooks/instructions-loaded.js"
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) => !legacyPostToolMarkers.some((marker) => h.command.includes(marker)))
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 global_procedures (
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] Global procedures push: ${err instanceof Error ? err.message : String(err)}`);
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] Global procedures pull: ${err instanceof Error ? err.message : String(err)}`);
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 global_procedures LIMIT 1000");
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
- "last_global_procedures_push_version",
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 global_procedures
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 > global_procedures.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. global_procedure: manage customer-owned company procedures (Layer 0; actions: store, list, deactivate). Legacy aliases: store_global_procedure, list_global_procedures, deactivate_global_procedure."
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 global_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
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 global_procedures (id, title, content, priority, domain, active, created_at, updated_at)
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 global_procedures SET active = 0, updated_at = ? WHERE id = ?",
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 global_procedures (id, title, content, priority, domain, active, created_at, updated_at)
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 global_procedures WHERE active = 1",
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 global_procedures WHERE active = 1",
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/gateway/providers/anthropic.ts
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/gateway/providers/anthropic.ts"() {
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/gateway/providers/openai-compat.ts
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/gateway/providers/openai-compat.ts"() {
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/gateway/providers/factory.ts
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/gateway/providers/factory.ts"() {
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("post-tool-combined.js")) return false;
31438
- if (plugin.includes('fireHook("ingest.js"') || plugin.includes('runHook("error-recall.js"')) return false;
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: "dist/hooks/session-start.js"
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: "dist/hooks/post-tool-combined.js"
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: "dist/hooks/prompt-submit.js"
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: "dist/hooks/stop.js"
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: "dist/hooks/pre-tool-use.js"
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) => !legacyPostToolMarkers.some((marker) => h.command.includes(marker)))
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("dist/hooks/post-tool-combined.js"))) {
31722
+ if (!postToolCommands.some((cmd) => cmd.includes(EXE_HOOKS.postToolCombined))) {
31622
31723
  return false;
31623
31724
  }
31624
31725
  if (postToolCommands.some(
31625
- (cmd) => cmd.includes("dist/hooks/ingest.js") || cmd.includes("dist/hooks/error-recall.js") || cmd.includes("dist/hooks/ingest-worker.js")
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
  `);
@@ -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. global_procedure: manage customer-owned company procedures (Layer 0; actions: store, list, deactivate). Legacy aliases: store_global_procedure, list_global_procedures, deactivate_global_procedure."
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(