@askexenow/exe-os 0.9.109 → 0.9.110

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 (89) hide show
  1. package/dist/bin/agentic-ontology-backfill.js +10 -4
  2. package/dist/bin/agentic-reflection-backfill.js +10 -4
  3. package/dist/bin/agentic-semantic-label.js +10 -4
  4. package/dist/bin/backfill-conversations.js +10 -4
  5. package/dist/bin/backfill-responses.js +10 -4
  6. package/dist/bin/backfill-vectors.js +10 -4
  7. package/dist/bin/bulk-sync-postgres.js +10 -4
  8. package/dist/bin/cleanup-stale-review-tasks.js +10 -4
  9. package/dist/bin/cli.js +10 -4
  10. package/dist/bin/exe-agent.js +1 -1
  11. package/dist/bin/exe-assign.js +10 -4
  12. package/dist/bin/exe-boot.js +10 -4
  13. package/dist/bin/exe-call.js +1 -1
  14. package/dist/bin/exe-cloud.js +10 -4
  15. package/dist/bin/exe-dispatch.js +10 -4
  16. package/dist/bin/exe-doctor.js +10 -4
  17. package/dist/bin/exe-export-behaviors.js +10 -4
  18. package/dist/bin/exe-forget.js +10 -4
  19. package/dist/bin/exe-gateway.js +10 -4
  20. package/dist/bin/exe-heartbeat.js +10 -4
  21. package/dist/bin/exe-kill.js +10 -4
  22. package/dist/bin/exe-launch-agent.js +10 -4
  23. package/dist/bin/exe-new-employee.js +10 -4
  24. package/dist/bin/exe-pending-messages.js +10 -4
  25. package/dist/bin/exe-pending-notifications.js +10 -4
  26. package/dist/bin/exe-pending-reviews.js +10 -4
  27. package/dist/bin/exe-rename.js +10 -4
  28. package/dist/bin/exe-review.js +10 -4
  29. package/dist/bin/exe-search.js +10 -4
  30. package/dist/bin/exe-session-cleanup.js +10 -4
  31. package/dist/bin/exe-start-codex.js +10 -4
  32. package/dist/bin/exe-start-opencode.js +10 -4
  33. package/dist/bin/exe-status.js +10 -4
  34. package/dist/bin/exe-team.js +10 -4
  35. package/dist/bin/git-sweep.js +10 -4
  36. package/dist/bin/graph-backfill.js +10 -4
  37. package/dist/bin/graph-export.js +10 -4
  38. package/dist/bin/intercom-check.js +10 -4
  39. package/dist/bin/pre-publish.js +1 -1
  40. package/dist/bin/scan-tasks.js +10 -4
  41. package/dist/bin/setup.js +10 -4
  42. package/dist/bin/shard-migrate.js +10 -4
  43. package/dist/gateway/index.js +10 -4
  44. package/dist/hooks/bug-report-worker.js +10 -4
  45. package/dist/hooks/codex-stop-task-finalizer.js +10 -4
  46. package/dist/hooks/commit-complete.js +10 -4
  47. package/dist/hooks/error-recall.js +10 -4
  48. package/dist/hooks/ingest.js +10 -4
  49. package/dist/hooks/instructions-loaded.js +10 -4
  50. package/dist/hooks/notification.js +10 -4
  51. package/dist/hooks/post-compact.js +10 -4
  52. package/dist/hooks/post-tool-combined.js +10 -4
  53. package/dist/hooks/pre-compact.js +10 -4
  54. package/dist/hooks/pre-tool-use.js +10 -4
  55. package/dist/hooks/prompt-submit.js +10 -4
  56. package/dist/hooks/session-end.js +10 -4
  57. package/dist/hooks/session-start.js +10 -4
  58. package/dist/hooks/stop.js +10 -4
  59. package/dist/hooks/subagent-stop.js +10 -4
  60. package/dist/hooks/summary-worker.js +10 -4
  61. package/dist/index.js +10 -4
  62. package/dist/lib/cloud-sync.js +9 -3
  63. package/dist/lib/database.js +9 -3
  64. package/dist/lib/db.js +9 -3
  65. package/dist/lib/device-registry.js +9 -3
  66. package/dist/lib/employee-templates.js +1 -1
  67. package/dist/lib/exe-daemon.js +10 -4
  68. package/dist/lib/hybrid-search.js +10 -4
  69. package/dist/lib/identity.js +9 -3
  70. package/dist/lib/messaging.js +9 -3
  71. package/dist/lib/reminders.js +9 -3
  72. package/dist/lib/schedules.js +10 -4
  73. package/dist/lib/skill-learning.js +9 -3
  74. package/dist/lib/store.js +10 -4
  75. package/dist/lib/tasks.js +9 -3
  76. package/dist/lib/tmux-routing.js +9 -3
  77. package/dist/lib/token-spend.js +9 -3
  78. package/dist/mcp/server.js +11 -4
  79. package/dist/mcp/tools/complete-reminder.js +9 -3
  80. package/dist/mcp/tools/create-reminder.js +9 -3
  81. package/dist/mcp/tools/create-task.js +9 -3
  82. package/dist/mcp/tools/deactivate-behavior.js +9 -3
  83. package/dist/mcp/tools/list-reminders.js +9 -3
  84. package/dist/mcp/tools/list-tasks.js +9 -3
  85. package/dist/mcp/tools/send-message.js +9 -3
  86. package/dist/mcp/tools/update-task.js +9 -3
  87. package/dist/runtime/index.js +10 -4
  88. package/dist/tui/App.js +10 -4
  89. package/package.json +1 -1
@@ -1897,14 +1897,20 @@ function getClient() {
1897
1897
  if (!_resilientClient) {
1898
1898
  return _adapterClient;
1899
1899
  }
1900
- if (process.env.EXE_DB_READONLY === "1") {
1900
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1901
+ return _resilientClient;
1902
+ }
1903
+ if (!process.env.EXE_MCP_MODE) {
1904
+ process.stderr.write(
1905
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1906
+ );
1901
1907
  return _resilientClient;
1902
1908
  }
1903
1909
  process.stderr.write(
1904
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1910
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1905
1911
  );
1906
1912
  throw new Error(
1907
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1913
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1908
1914
  );
1909
1915
  }
1910
1916
  async function initDaemonClient() {
@@ -4648,7 +4654,7 @@ var init_platform_procedures = __esm({
4648
4654
  title: "MCP tools \u2014 identity, behavior, and support",
4649
4655
  domain: "tool-use",
4650
4656
  priority: "p1",
4651
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4657
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4652
4658
  },
4653
4659
  {
4654
4660
  title: "MCP tools \u2014 communication and messaging",
@@ -1821,14 +1821,20 @@ function getClient() {
1821
1821
  if (!_resilientClient) {
1822
1822
  return _adapterClient;
1823
1823
  }
1824
- if (process.env.EXE_DB_READONLY === "1") {
1824
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1825
+ return _resilientClient;
1826
+ }
1827
+ if (!process.env.EXE_MCP_MODE) {
1828
+ process.stderr.write(
1829
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1830
+ );
1825
1831
  return _resilientClient;
1826
1832
  }
1827
1833
  process.stderr.write(
1828
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1834
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1829
1835
  );
1830
1836
  throw new Error(
1831
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1837
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1832
1838
  );
1833
1839
  }
1834
1840
  async function initDaemonClient() {
@@ -4572,7 +4578,7 @@ var init_platform_procedures = __esm({
4572
4578
  title: "MCP tools \u2014 identity, behavior, and support",
4573
4579
  domain: "tool-use",
4574
4580
  priority: "p1",
4575
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4581
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4576
4582
  },
4577
4583
  {
4578
4584
  title: "MCP tools \u2014 communication and messaging",
@@ -2492,14 +2492,20 @@ function getClient() {
2492
2492
  if (!_resilientClient) {
2493
2493
  return _adapterClient;
2494
2494
  }
2495
- if (process.env.EXE_DB_READONLY === "1") {
2495
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
2496
+ return _resilientClient;
2497
+ }
2498
+ if (!process.env.EXE_MCP_MODE) {
2499
+ process.stderr.write(
2500
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
2501
+ );
2496
2502
  return _resilientClient;
2497
2503
  }
2498
2504
  process.stderr.write(
2499
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
2505
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
2500
2506
  );
2501
2507
  throw new Error(
2502
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
2508
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
2503
2509
  );
2504
2510
  }
2505
2511
  async function initDaemonClient() {
@@ -5256,7 +5262,7 @@ var init_platform_procedures = __esm({
5256
5262
  title: "MCP tools \u2014 identity, behavior, and support",
5257
5263
  domain: "tool-use",
5258
5264
  priority: "p1",
5259
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
5265
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
5260
5266
  },
5261
5267
  {
5262
5268
  title: "MCP tools \u2014 communication and messaging",
@@ -1860,14 +1860,20 @@ function getClient() {
1860
1860
  if (!_resilientClient) {
1861
1861
  return _adapterClient;
1862
1862
  }
1863
- if (process.env.EXE_DB_READONLY === "1") {
1863
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1864
+ return _resilientClient;
1865
+ }
1866
+ if (!process.env.EXE_MCP_MODE) {
1867
+ process.stderr.write(
1868
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1869
+ );
1864
1870
  return _resilientClient;
1865
1871
  }
1866
1872
  process.stderr.write(
1867
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1873
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1868
1874
  );
1869
1875
  throw new Error(
1870
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1876
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1871
1877
  );
1872
1878
  }
1873
1879
  async function initDaemonClient() {
@@ -4611,7 +4617,7 @@ var init_platform_procedures = __esm({
4611
4617
  title: "MCP tools \u2014 identity, behavior, and support",
4612
4618
  domain: "tool-use",
4613
4619
  priority: "p1",
4614
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4620
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4615
4621
  },
4616
4622
  {
4617
4623
  title: "MCP tools \u2014 communication and messaging",
@@ -1821,14 +1821,20 @@ function getClient() {
1821
1821
  if (!_resilientClient) {
1822
1822
  return _adapterClient;
1823
1823
  }
1824
- if (process.env.EXE_DB_READONLY === "1") {
1824
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1825
+ return _resilientClient;
1826
+ }
1827
+ if (!process.env.EXE_MCP_MODE) {
1828
+ process.stderr.write(
1829
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1830
+ );
1825
1831
  return _resilientClient;
1826
1832
  }
1827
1833
  process.stderr.write(
1828
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1834
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1829
1835
  );
1830
1836
  throw new Error(
1831
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1837
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1832
1838
  );
1833
1839
  }
1834
1840
  async function initDaemonClient() {
@@ -4572,7 +4578,7 @@ var init_platform_procedures = __esm({
4572
4578
  title: "MCP tools \u2014 identity, behavior, and support",
4573
4579
  domain: "tool-use",
4574
4580
  priority: "p1",
4575
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4581
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4576
4582
  },
4577
4583
  {
4578
4584
  title: "MCP tools \u2014 communication and messaging",
@@ -1919,14 +1919,20 @@ function getClient() {
1919
1919
  if (!_resilientClient) {
1920
1920
  return _adapterClient;
1921
1921
  }
1922
- if (process.env.EXE_DB_READONLY === "1") {
1922
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1923
+ return _resilientClient;
1924
+ }
1925
+ if (!process.env.EXE_MCP_MODE) {
1926
+ process.stderr.write(
1927
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1928
+ );
1923
1929
  return _resilientClient;
1924
1930
  }
1925
1931
  process.stderr.write(
1926
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1932
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1927
1933
  );
1928
1934
  throw new Error(
1929
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1935
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1930
1936
  );
1931
1937
  }
1932
1938
  async function initDaemonClient() {
@@ -4670,7 +4676,7 @@ var init_platform_procedures = __esm({
4670
4676
  title: "MCP tools \u2014 identity, behavior, and support",
4671
4677
  domain: "tool-use",
4672
4678
  priority: "p1",
4673
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4679
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4674
4680
  },
4675
4681
  {
4676
4682
  title: "MCP tools \u2014 communication and messaging",
@@ -470,14 +470,20 @@ function getClient() {
470
470
  if (!_resilientClient) {
471
471
  return _adapterClient;
472
472
  }
473
- if (process.env.EXE_DB_READONLY === "1") {
473
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
474
+ return _resilientClient;
475
+ }
476
+ if (!process.env.EXE_MCP_MODE) {
477
+ process.stderr.write(
478
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
479
+ );
474
480
  return _resilientClient;
475
481
  }
476
482
  process.stderr.write(
477
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
483
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
478
484
  );
479
485
  throw new Error(
480
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
486
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
481
487
  );
482
488
  }
483
489
  var _debugDb, _resilientClient, _daemonClient, _adapterClient, DB_LOCK_PATH;
@@ -2887,7 +2893,7 @@ var PLATFORM_PROCEDURES = [
2887
2893
  title: "MCP tools \u2014 identity, behavior, and support",
2888
2894
  domain: "tool-use",
2889
2895
  priority: "p1",
2890
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
2896
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
2891
2897
  },
2892
2898
  {
2893
2899
  title: "MCP tools \u2014 communication and messaging",
@@ -1831,14 +1831,20 @@ function getClient() {
1831
1831
  if (!_resilientClient) {
1832
1832
  return _adapterClient;
1833
1833
  }
1834
- if (process.env.EXE_DB_READONLY === "1") {
1834
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1835
+ return _resilientClient;
1836
+ }
1837
+ if (!process.env.EXE_MCP_MODE) {
1838
+ process.stderr.write(
1839
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1840
+ );
1835
1841
  return _resilientClient;
1836
1842
  }
1837
1843
  process.stderr.write(
1838
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1844
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1839
1845
  );
1840
1846
  throw new Error(
1841
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1847
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1842
1848
  );
1843
1849
  }
1844
1850
  async function initDaemonClient() {
@@ -5053,7 +5059,7 @@ var init_platform_procedures = __esm({
5053
5059
  title: "MCP tools \u2014 identity, behavior, and support",
5054
5060
  domain: "tool-use",
5055
5061
  priority: "p1",
5056
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
5062
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
5057
5063
  },
5058
5064
  {
5059
5065
  title: "MCP tools \u2014 communication and messaging",
@@ -1832,14 +1832,20 @@ function getClient() {
1832
1832
  if (!_resilientClient) {
1833
1833
  return _adapterClient;
1834
1834
  }
1835
- if (process.env.EXE_DB_READONLY === "1") {
1835
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1836
+ return _resilientClient;
1837
+ }
1838
+ if (!process.env.EXE_MCP_MODE) {
1839
+ process.stderr.write(
1840
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1841
+ );
1836
1842
  return _resilientClient;
1837
1843
  }
1838
1844
  process.stderr.write(
1839
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1845
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1840
1846
  );
1841
1847
  throw new Error(
1842
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1848
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1843
1849
  );
1844
1850
  }
1845
1851
  async function initDaemonClient() {
@@ -5119,7 +5125,7 @@ var init_platform_procedures = __esm({
5119
5125
  title: "MCP tools \u2014 identity, behavior, and support",
5120
5126
  domain: "tool-use",
5121
5127
  priority: "p1",
5122
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
5128
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
5123
5129
  },
5124
5130
  {
5125
5131
  title: "MCP tools \u2014 communication and messaging",
@@ -1832,14 +1832,20 @@ function getClient() {
1832
1832
  if (!_resilientClient) {
1833
1833
  return _adapterClient;
1834
1834
  }
1835
- if (process.env.EXE_DB_READONLY === "1") {
1835
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1836
+ return _resilientClient;
1837
+ }
1838
+ if (!process.env.EXE_MCP_MODE) {
1839
+ process.stderr.write(
1840
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1841
+ );
1836
1842
  return _resilientClient;
1837
1843
  }
1838
1844
  process.stderr.write(
1839
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1845
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1840
1846
  );
1841
1847
  throw new Error(
1842
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1848
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1843
1849
  );
1844
1850
  }
1845
1851
  async function initDaemonClient() {
@@ -5158,7 +5164,7 @@ var init_platform_procedures = __esm({
5158
5164
  title: "MCP tools \u2014 identity, behavior, and support",
5159
5165
  domain: "tool-use",
5160
5166
  priority: "p1",
5161
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
5167
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
5162
5168
  },
5163
5169
  {
5164
5170
  title: "MCP tools \u2014 communication and messaging",
@@ -1676,14 +1676,20 @@ function getClient() {
1676
1676
  if (!_resilientClient) {
1677
1677
  return _adapterClient;
1678
1678
  }
1679
- if (process.env.EXE_DB_READONLY === "1") {
1679
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1680
+ return _resilientClient;
1681
+ }
1682
+ if (!process.env.EXE_MCP_MODE) {
1683
+ process.stderr.write(
1684
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1685
+ );
1680
1686
  return _resilientClient;
1681
1687
  }
1682
1688
  process.stderr.write(
1683
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1689
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1684
1690
  );
1685
1691
  throw new Error(
1686
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1692
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1687
1693
  );
1688
1694
  }
1689
1695
  async function initDaemonClient() {
@@ -3406,7 +3412,7 @@ var init_platform_procedures = __esm({
3406
3412
  title: "MCP tools \u2014 identity, behavior, and support",
3407
3413
  domain: "tool-use",
3408
3414
  priority: "p1",
3409
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
3415
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
3410
3416
  },
3411
3417
  {
3412
3418
  title: "MCP tools \u2014 communication and messaging",
@@ -1835,14 +1835,20 @@ function getClient() {
1835
1835
  if (!_resilientClient) {
1836
1836
  return _adapterClient;
1837
1837
  }
1838
- if (process.env.EXE_DB_READONLY === "1") {
1838
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1839
+ return _resilientClient;
1840
+ }
1841
+ if (!process.env.EXE_MCP_MODE) {
1842
+ process.stderr.write(
1843
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1844
+ );
1839
1845
  return _resilientClient;
1840
1846
  }
1841
1847
  process.stderr.write(
1842
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1848
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1843
1849
  );
1844
1850
  throw new Error(
1845
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1851
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1846
1852
  );
1847
1853
  }
1848
1854
  async function initDaemonClient() {
@@ -4586,7 +4592,7 @@ var init_platform_procedures = __esm({
4586
4592
  title: "MCP tools \u2014 identity, behavior, and support",
4587
4593
  domain: "tool-use",
4588
4594
  priority: "p1",
4589
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4595
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4590
4596
  },
4591
4597
  {
4592
4598
  title: "MCP tools \u2014 communication and messaging",
@@ -1820,14 +1820,20 @@ function getClient() {
1820
1820
  if (!_resilientClient) {
1821
1821
  return _adapterClient;
1822
1822
  }
1823
- if (process.env.EXE_DB_READONLY === "1") {
1823
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1824
+ return _resilientClient;
1825
+ }
1826
+ if (!process.env.EXE_MCP_MODE) {
1827
+ process.stderr.write(
1828
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1829
+ );
1824
1830
  return _resilientClient;
1825
1831
  }
1826
1832
  process.stderr.write(
1827
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1833
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1828
1834
  );
1829
1835
  throw new Error(
1830
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1836
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1831
1837
  );
1832
1838
  }
1833
1839
  async function initDaemonClient() {
@@ -4571,7 +4577,7 @@ var init_platform_procedures = __esm({
4571
4577
  title: "MCP tools \u2014 identity, behavior, and support",
4572
4578
  domain: "tool-use",
4573
4579
  priority: "p1",
4574
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4580
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4575
4581
  },
4576
4582
  {
4577
4583
  title: "MCP tools \u2014 communication and messaging",
@@ -1864,14 +1864,20 @@ function getClient() {
1864
1864
  if (!_resilientClient) {
1865
1865
  return _adapterClient;
1866
1866
  }
1867
- if (process.env.EXE_DB_READONLY === "1") {
1867
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1868
+ return _resilientClient;
1869
+ }
1870
+ if (!process.env.EXE_MCP_MODE) {
1871
+ process.stderr.write(
1872
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1873
+ );
1868
1874
  return _resilientClient;
1869
1875
  }
1870
1876
  process.stderr.write(
1871
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1877
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1872
1878
  );
1873
1879
  throw new Error(
1874
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1880
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1875
1881
  );
1876
1882
  }
1877
1883
  async function initDaemonClient() {
@@ -4615,7 +4621,7 @@ var init_platform_procedures = __esm({
4615
4621
  title: "MCP tools \u2014 identity, behavior, and support",
4616
4622
  domain: "tool-use",
4617
4623
  priority: "p1",
4618
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4624
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
4619
4625
  },
4620
4626
  {
4621
4627
  title: "MCP tools \u2014 communication and messaging",
@@ -1693,14 +1693,20 @@ function getClient() {
1693
1693
  if (!_resilientClient) {
1694
1694
  return _adapterClient;
1695
1695
  }
1696
- if (process.env.EXE_DB_READONLY === "1") {
1696
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1697
+ return _resilientClient;
1698
+ }
1699
+ if (!process.env.EXE_MCP_MODE) {
1700
+ process.stderr.write(
1701
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1702
+ );
1697
1703
  return _resilientClient;
1698
1704
  }
1699
1705
  process.stderr.write(
1700
- "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes bypass the single-writer gate and corrupt FTS5 indexes.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n[database] Or set EXE_DB_READONLY=1 if you only need read access.\n"
1706
+ "[database] ERROR: Daemon is not running \u2014 refusing direct SQLite write access.\n[database] Direct writes from MCP processes bypass the single-writer gate and corrupt FTS5.\n[database] Restart the daemon: kill $(cat ~/.exe-os/exed.pid) && exe-os update\n"
1701
1707
  );
1702
1708
  throw new Error(
1703
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1709
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1704
1710
  );
1705
1711
  }
1706
1712
  async function initDaemonClient() {
@@ -3887,7 +3893,7 @@ var init_platform_procedures = __esm({
3887
3893
  title: "MCP tools \u2014 identity, behavior, and support",
3888
3894
  domain: "tool-use",
3889
3895
  priority: "p1",
3890
- content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report (title, description, severity p0-p3). Auto-delivers to AskExe. support(action="create_feature"): file a feature request (title, description, use_case). support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are planned, shipped, or closed. support(action="health"): verify support server is reachable. When a bug you filed shows status='fixed' with a fixed_version, update exe-os to that version to get the fix. support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
3896
+ content: `identity(action="get") / get_identity: read an agent's exe.md (Layer 1 identity). identity(action="update") / update_identity: write an agent's exe.md. Identity > behavior. behavior(action="store") / store_behavior: record a correction or pattern (Layer 2 expertise). behavior(action="list") / list_behaviors: view active behaviors. behavior(action="deactivate") / deactivate_behavior: soft-delete a stale behavior. support(action="create_bug"): file a bug report. Required: title, description, severity (p0-p3). Optional: steps_to_reproduce, expected_behavior, actual_behavior. Auto-delivers to AskExe support. support(action="create_feature"): file a feature request. Required: title, description. Optional: use_case (why you need it), proposed_solution (how it could work). Include business impact if possible \u2014 it helps prioritization. support(action="list_my_bugs"): check status of YOUR filed bug reports \u2014 see which are open, triaged, or fixed with version number. support(action="list_my_features"): check status of YOUR filed feature requests \u2014 see which are open, planned, shipped, or closed with response notes from AskExe. support(action="health"): verify support server is reachable. When a bug shows status='closed' with a fixed_version, tell the founder: 'Bug X fixed in vY \u2014 run exe-os update to get it.' When a feature shows status='shipped' with a shipped_version, tell the founder: 'Feature X shipped in vY \u2014 run exe-os update.' support(action="triage_bug"): AskExe-internal only. CRITICAL: triage uses triage_notes NOT notes.`
3891
3897
  },
3892
3898
  {
3893
3899
  title: "MCP tools \u2014 communication and messaging",