@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
@@ -1606,14 +1606,20 @@ function getClient() {
1606
1606
  if (!_resilientClient) {
1607
1607
  return _adapterClient;
1608
1608
  }
1609
- if (process.env.EXE_DB_READONLY === "1") {
1609
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1610
+ return _resilientClient;
1611
+ }
1612
+ if (!process.env.EXE_MCP_MODE) {
1613
+ process.stderr.write(
1614
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1615
+ );
1610
1616
  return _resilientClient;
1611
1617
  }
1612
1618
  process.stderr.write(
1613
- "[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"
1619
+ "[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"
1614
1620
  );
1615
1621
  throw new Error(
1616
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1622
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1617
1623
  );
1618
1624
  }
1619
1625
  async function initDaemonClient() {
@@ -3800,7 +3806,7 @@ var init_platform_procedures = __esm({
3800
3806
  title: "MCP tools \u2014 identity, behavior, and support",
3801
3807
  domain: "tool-use",
3802
3808
  priority: "p1",
3803
- 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.`
3809
+ 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.`
3804
3810
  },
3805
3811
  {
3806
3812
  title: "MCP tools \u2014 communication and messaging",
@@ -1606,14 +1606,20 @@ function getClient() {
1606
1606
  if (!_resilientClient) {
1607
1607
  return _adapterClient;
1608
1608
  }
1609
- if (process.env.EXE_DB_READONLY === "1") {
1609
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1610
+ return _resilientClient;
1611
+ }
1612
+ if (!process.env.EXE_MCP_MODE) {
1613
+ process.stderr.write(
1614
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1615
+ );
1610
1616
  return _resilientClient;
1611
1617
  }
1612
1618
  process.stderr.write(
1613
- "[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"
1619
+ "[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"
1614
1620
  );
1615
1621
  throw new Error(
1616
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1622
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1617
1623
  );
1618
1624
  }
1619
1625
  async function initDaemonClient() {
@@ -3800,7 +3806,7 @@ var init_platform_procedures = __esm({
3800
3806
  title: "MCP tools \u2014 identity, behavior, and support",
3801
3807
  domain: "tool-use",
3802
3808
  priority: "p1",
3803
- 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.`
3809
+ 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.`
3804
3810
  },
3805
3811
  {
3806
3812
  title: "MCP tools \u2014 communication and messaging",
@@ -1606,14 +1606,20 @@ function getClient() {
1606
1606
  if (!_resilientClient) {
1607
1607
  return _adapterClient;
1608
1608
  }
1609
- if (process.env.EXE_DB_READONLY === "1") {
1609
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1610
+ return _resilientClient;
1611
+ }
1612
+ if (!process.env.EXE_MCP_MODE) {
1613
+ process.stderr.write(
1614
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1615
+ );
1610
1616
  return _resilientClient;
1611
1617
  }
1612
1618
  process.stderr.write(
1613
- "[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"
1619
+ "[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"
1614
1620
  );
1615
1621
  throw new Error(
1616
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1622
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1617
1623
  );
1618
1624
  }
1619
1625
  async function initDaemonClient() {
@@ -3800,7 +3806,7 @@ var init_platform_procedures = __esm({
3800
3806
  title: "MCP tools \u2014 identity, behavior, and support",
3801
3807
  domain: "tool-use",
3802
3808
  priority: "p1",
3803
- 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.`
3809
+ 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.`
3804
3810
  },
3805
3811
  {
3806
3812
  title: "MCP tools \u2014 communication and messaging",
@@ -1746,14 +1746,20 @@ function getClient() {
1746
1746
  if (!_resilientClient) {
1747
1747
  return _adapterClient;
1748
1748
  }
1749
- if (process.env.EXE_DB_READONLY === "1") {
1749
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1750
+ return _resilientClient;
1751
+ }
1752
+ if (!process.env.EXE_MCP_MODE) {
1753
+ process.stderr.write(
1754
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1755
+ );
1750
1756
  return _resilientClient;
1751
1757
  }
1752
1758
  process.stderr.write(
1753
- "[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"
1759
+ "[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"
1754
1760
  );
1755
1761
  throw new Error(
1756
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1762
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1757
1763
  );
1758
1764
  }
1759
1765
  async function initDaemonClient() {
@@ -3940,7 +3946,7 @@ var init_platform_procedures = __esm({
3940
3946
  title: "MCP tools \u2014 identity, behavior, and support",
3941
3947
  domain: "tool-use",
3942
3948
  priority: "p1",
3943
- 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.`
3949
+ 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.`
3944
3950
  },
3945
3951
  {
3946
3952
  title: "MCP tools \u2014 communication and messaging",
@@ -1746,14 +1746,20 @@ function getClient() {
1746
1746
  if (!_resilientClient) {
1747
1747
  return _adapterClient;
1748
1748
  }
1749
- if (process.env.EXE_DB_READONLY === "1") {
1749
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1750
+ return _resilientClient;
1751
+ }
1752
+ if (!process.env.EXE_MCP_MODE) {
1753
+ process.stderr.write(
1754
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1755
+ );
1750
1756
  return _resilientClient;
1751
1757
  }
1752
1758
  process.stderr.write(
1753
- "[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"
1759
+ "[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"
1754
1760
  );
1755
1761
  throw new Error(
1756
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1762
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1757
1763
  );
1758
1764
  }
1759
1765
  async function initDaemonClient() {
@@ -3940,7 +3946,7 @@ var init_platform_procedures = __esm({
3940
3946
  title: "MCP tools \u2014 identity, behavior, and support",
3941
3947
  domain: "tool-use",
3942
3948
  priority: "p1",
3943
- 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.`
3949
+ 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.`
3944
3950
  },
3945
3951
  {
3946
3952
  title: "MCP tools \u2014 communication and messaging",
@@ -1742,14 +1742,20 @@ function getClient() {
1742
1742
  if (!_resilientClient) {
1743
1743
  return _adapterClient;
1744
1744
  }
1745
- if (process.env.EXE_DB_READONLY === "1") {
1745
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1746
+ return _resilientClient;
1747
+ }
1748
+ if (!process.env.EXE_MCP_MODE) {
1749
+ process.stderr.write(
1750
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1751
+ );
1746
1752
  return _resilientClient;
1747
1753
  }
1748
1754
  process.stderr.write(
1749
- "[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"
1755
+ "[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"
1750
1756
  );
1751
1757
  throw new Error(
1752
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1758
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1753
1759
  );
1754
1760
  }
1755
1761
  async function initDaemonClient() {
@@ -3936,7 +3942,7 @@ var init_platform_procedures = __esm({
3936
3942
  title: "MCP tools \u2014 identity, behavior, and support",
3937
3943
  domain: "tool-use",
3938
3944
  priority: "p1",
3939
- 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.`
3945
+ 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.`
3940
3946
  },
3941
3947
  {
3942
3948
  title: "MCP tools \u2014 communication and messaging",
@@ -1606,14 +1606,20 @@ function getClient() {
1606
1606
  if (!_resilientClient) {
1607
1607
  return _adapterClient;
1608
1608
  }
1609
- if (process.env.EXE_DB_READONLY === "1") {
1609
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1610
+ return _resilientClient;
1611
+ }
1612
+ if (!process.env.EXE_MCP_MODE) {
1613
+ process.stderr.write(
1614
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1615
+ );
1610
1616
  return _resilientClient;
1611
1617
  }
1612
1618
  process.stderr.write(
1613
- "[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"
1619
+ "[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"
1614
1620
  );
1615
1621
  throw new Error(
1616
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1622
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1617
1623
  );
1618
1624
  }
1619
1625
  async function initDaemonClient() {
@@ -4108,7 +4114,7 @@ var init_platform_procedures = __esm({
4108
4114
  title: "MCP tools \u2014 identity, behavior, and support",
4109
4115
  domain: "tool-use",
4110
4116
  priority: "p1",
4111
- 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.`
4117
+ 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.`
4112
4118
  },
4113
4119
  {
4114
4120
  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() {
@@ -4583,7 +4589,7 @@ var init_platform_procedures = __esm({
4583
4589
  title: "MCP tools \u2014 identity, behavior, and support",
4584
4590
  domain: "tool-use",
4585
4591
  priority: "p1",
4586
- 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.`
4592
+ 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.`
4587
4593
  },
4588
4594
  {
4589
4595
  title: "MCP tools \u2014 communication and messaging",
package/dist/bin/cli.js CHANGED
@@ -4487,14 +4487,20 @@ function getClient() {
4487
4487
  if (!_resilientClient) {
4488
4488
  return _adapterClient;
4489
4489
  }
4490
- if (process.env.EXE_DB_READONLY === "1") {
4490
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
4491
+ return _resilientClient;
4492
+ }
4493
+ if (!process.env.EXE_MCP_MODE) {
4494
+ process.stderr.write(
4495
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
4496
+ );
4491
4497
  return _resilientClient;
4492
4498
  }
4493
4499
  process.stderr.write(
4494
- "[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"
4500
+ "[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"
4495
4501
  );
4496
4502
  throw new Error(
4497
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
4503
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
4498
4504
  );
4499
4505
  }
4500
4506
  async function initDaemonClient() {
@@ -9289,7 +9295,7 @@ var init_platform_procedures = __esm({
9289
9295
  title: "MCP tools \u2014 identity, behavior, and support",
9290
9296
  domain: "tool-use",
9291
9297
  priority: "p1",
9292
- 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.`
9298
+ 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.`
9293
9299
  },
9294
9300
  {
9295
9301
  title: "MCP tools \u2014 communication and messaging",
@@ -1566,7 +1566,7 @@ var PLATFORM_PROCEDURES = [
1566
1566
  title: "MCP tools \u2014 identity, behavior, and support",
1567
1567
  domain: "tool-use",
1568
1568
  priority: "p1",
1569
- 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.`
1569
+ 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.`
1570
1570
  },
1571
1571
  {
1572
1572
  title: "MCP tools \u2014 communication and messaging",
@@ -1756,14 +1756,20 @@ function getClient() {
1756
1756
  if (!_resilientClient) {
1757
1757
  return _adapterClient;
1758
1758
  }
1759
- if (process.env.EXE_DB_READONLY === "1") {
1759
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1760
+ return _resilientClient;
1761
+ }
1762
+ if (!process.env.EXE_MCP_MODE) {
1763
+ process.stderr.write(
1764
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1765
+ );
1760
1766
  return _resilientClient;
1761
1767
  }
1762
1768
  process.stderr.write(
1763
- "[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"
1769
+ "[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"
1764
1770
  );
1765
1771
  throw new Error(
1766
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1772
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1767
1773
  );
1768
1774
  }
1769
1775
  async function initDaemonClient() {
@@ -3950,7 +3956,7 @@ var init_platform_procedures = __esm({
3950
3956
  title: "MCP tools \u2014 identity, behavior, and support",
3951
3957
  domain: "tool-use",
3952
3958
  priority: "p1",
3953
- 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.`
3959
+ 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.`
3954
3960
  },
3955
3961
  {
3956
3962
  title: "MCP tools \u2014 communication and messaging",
@@ -1908,14 +1908,20 @@ function getClient() {
1908
1908
  if (!_resilientClient) {
1909
1909
  return _adapterClient;
1910
1910
  }
1911
- if (process.env.EXE_DB_READONLY === "1") {
1911
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
1912
+ return _resilientClient;
1913
+ }
1914
+ if (!process.env.EXE_MCP_MODE) {
1915
+ process.stderr.write(
1916
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
1917
+ );
1912
1918
  return _resilientClient;
1913
1919
  }
1914
1920
  process.stderr.write(
1915
- "[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"
1921
+ "[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"
1916
1922
  );
1917
1923
  throw new Error(
1918
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
1924
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
1919
1925
  );
1920
1926
  }
1921
1927
  async function initDaemonClient() {
@@ -3638,7 +3644,7 @@ var init_platform_procedures = __esm({
3638
3644
  title: "MCP tools \u2014 identity, behavior, and support",
3639
3645
  domain: "tool-use",
3640
3646
  priority: "p1",
3641
- 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.`
3647
+ 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.`
3642
3648
  },
3643
3649
  {
3644
3650
  title: "MCP tools \u2014 communication and messaging",
@@ -503,7 +503,7 @@ var init_platform_procedures = __esm({
503
503
  title: "MCP tools \u2014 identity, behavior, and support",
504
504
  domain: "tool-use",
505
505
  priority: "p1",
506
- 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.`
506
+ 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.`
507
507
  },
508
508
  {
509
509
  title: "MCP tools \u2014 communication and messaging",
@@ -2344,14 +2344,20 @@ function getClient() {
2344
2344
  if (!_resilientClient) {
2345
2345
  return _adapterClient;
2346
2346
  }
2347
- if (process.env.EXE_DB_READONLY === "1") {
2347
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
2348
+ return _resilientClient;
2349
+ }
2350
+ if (!process.env.EXE_MCP_MODE) {
2351
+ process.stderr.write(
2352
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
2353
+ );
2348
2354
  return _resilientClient;
2349
2355
  }
2350
2356
  process.stderr.write(
2351
- "[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"
2357
+ "[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"
2352
2358
  );
2353
2359
  throw new Error(
2354
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
2360
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
2355
2361
  );
2356
2362
  }
2357
2363
  async function initDaemonClient() {
@@ -7098,7 +7104,7 @@ var init_platform_procedures = __esm({
7098
7104
  title: "MCP tools \u2014 identity, behavior, and support",
7099
7105
  domain: "tool-use",
7100
7106
  priority: "p1",
7101
- 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.`
7107
+ 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.`
7102
7108
  },
7103
7109
  {
7104
7110
  title: "MCP tools \u2014 communication and messaging",
@@ -2410,14 +2410,20 @@ function getClient() {
2410
2410
  if (!_resilientClient) {
2411
2411
  return _adapterClient;
2412
2412
  }
2413
- if (process.env.EXE_DB_READONLY === "1") {
2413
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
2414
+ return _resilientClient;
2415
+ }
2416
+ if (!process.env.EXE_MCP_MODE) {
2417
+ process.stderr.write(
2418
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
2419
+ );
2414
2420
  return _resilientClient;
2415
2421
  }
2416
2422
  process.stderr.write(
2417
- "[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"
2423
+ "[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"
2418
2424
  );
2419
2425
  throw new Error(
2420
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
2426
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
2421
2427
  );
2422
2428
  }
2423
2429
  async function initDaemonClient() {
@@ -8392,7 +8398,7 @@ var init_platform_procedures = __esm({
8392
8398
  title: "MCP tools \u2014 identity, behavior, and support",
8393
8399
  domain: "tool-use",
8394
8400
  priority: "p1",
8395
- 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.`
8401
+ 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.`
8396
8402
  },
8397
8403
  {
8398
8404
  title: "MCP tools \u2014 communication and messaging",
@@ -2932,14 +2932,20 @@ function getClient() {
2932
2932
  if (!_resilientClient) {
2933
2933
  return _adapterClient;
2934
2934
  }
2935
- if (process.env.EXE_DB_READONLY === "1") {
2935
+ if (process.env.EXE_DB_READONLY === "1" || process.env.EXE_DB_DIRECT === "1") {
2936
+ return _resilientClient;
2937
+ }
2938
+ if (!process.env.EXE_MCP_MODE) {
2939
+ process.stderr.write(
2940
+ "[database] WARN: Daemon unavailable \u2014 using direct SQLite (single-writer CLI mode).\n"
2941
+ );
2936
2942
  return _resilientClient;
2937
2943
  }
2938
2944
  process.stderr.write(
2939
- "[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"
2945
+ "[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"
2940
2946
  );
2941
2947
  throw new Error(
2942
- "Daemon not running. Direct SQLite writes are blocked to prevent FTS5 corruption. Restart daemon or set EXE_DB_READONLY=1 for read-only access."
2948
+ "Daemon not running. Direct SQLite writes from MCP processes are blocked to prevent FTS5 corruption. Restart daemon to restore service."
2943
2949
  );
2944
2950
  }
2945
2951
  async function initDaemonClient() {
@@ -4911,7 +4917,7 @@ var init_platform_procedures = __esm({
4911
4917
  title: "MCP tools \u2014 identity, behavior, and support",
4912
4918
  domain: "tool-use",
4913
4919
  priority: "p1",
4914
- 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.`
4920
+ 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.`
4915
4921
  },
4916
4922
  {
4917
4923
  title: "MCP tools \u2014 communication and messaging",