@askexenow/exe-os 0.9.15 → 0.9.16

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 (61) hide show
  1. package/dist/bin/cleanup-stale-review-tasks.js +10 -0
  2. package/dist/bin/cli.js +35 -6
  3. package/dist/bin/exe-agent-config.js +4 -2
  4. package/dist/bin/exe-assign.js +12 -0
  5. package/dist/bin/exe-boot.js +18 -4
  6. package/dist/bin/exe-call.js +4 -2
  7. package/dist/bin/exe-dispatch.js +18 -4
  8. package/dist/bin/exe-forget.js +16 -0
  9. package/dist/bin/exe-gateway.js +35 -6
  10. package/dist/bin/exe-heartbeat.js +10 -0
  11. package/dist/bin/exe-launch-agent.js +4 -2
  12. package/dist/bin/exe-new-employee.js +4 -2
  13. package/dist/bin/exe-pending-messages.js +10 -0
  14. package/dist/bin/exe-pending-notifications.js +10 -0
  15. package/dist/bin/exe-pending-reviews.js +10 -0
  16. package/dist/bin/exe-search.js +74 -1
  17. package/dist/bin/exe-session-cleanup.js +31 -4
  18. package/dist/bin/exe-settings.js +4 -2
  19. package/dist/bin/exe-start-codex.js +4 -0
  20. package/dist/bin/exe-status.js +10 -0
  21. package/dist/bin/git-sweep.js +31 -4
  22. package/dist/bin/install.js +4 -2
  23. package/dist/bin/scan-tasks.js +31 -4
  24. package/dist/bin/setup.js +4 -2
  25. package/dist/gateway/index.js +35 -6
  26. package/dist/hooks/bug-report-worker.js +22 -6
  27. package/dist/hooks/codex-stop-task-finalizer.js +21 -11
  28. package/dist/hooks/commit-complete.js +31 -4
  29. package/dist/hooks/error-recall.js +74 -1
  30. package/dist/hooks/ingest-worker.js +18 -4
  31. package/dist/hooks/ingest.js +17 -2
  32. package/dist/hooks/instructions-loaded.js +13 -0
  33. package/dist/hooks/notification.js +13 -0
  34. package/dist/hooks/post-compact.js +23 -0
  35. package/dist/hooks/pre-compact.js +31 -4
  36. package/dist/hooks/pre-tool-use.js +27 -2
  37. package/dist/hooks/prompt-submit.js +96 -7
  38. package/dist/hooks/session-end.js +31 -4
  39. package/dist/hooks/session-start.js +88 -3
  40. package/dist/hooks/stop.js +23 -0
  41. package/dist/hooks/subagent-stop.js +23 -0
  42. package/dist/hooks/summary-worker.js +10 -0
  43. package/dist/index.js +35 -6
  44. package/dist/lib/agent-config.js +4 -2
  45. package/dist/lib/employees.js +4 -2
  46. package/dist/lib/exe-daemon.js +99 -6
  47. package/dist/lib/hybrid-search.js +74 -1
  48. package/dist/lib/messaging.js +15 -5
  49. package/dist/lib/store.js +13 -0
  50. package/dist/lib/tasks.js +18 -4
  51. package/dist/lib/tmux-routing.js +18 -4
  52. package/dist/lib/tmux-transport.js +10 -0
  53. package/dist/lib/transport.js +10 -0
  54. package/dist/mcp/server.js +107 -18
  55. package/dist/mcp/tools/create-task.js +22 -6
  56. package/dist/mcp/tools/list-tasks.js +10 -0
  57. package/dist/mcp/tools/send-message.js +17 -7
  58. package/dist/mcp/tools/update-task.js +18 -4
  59. package/dist/runtime/index.js +31 -4
  60. package/dist/tui/App.js +35 -6
  61. package/package.json +1 -1
@@ -2652,6 +2652,16 @@ var init_tmux_transport = __esm({
2652
2652
  sendKeys(target, keys) {
2653
2653
  execFileSync("tmux", ["send-keys", "-t", target, keys, "Enter"], QUIET);
2654
2654
  }
2655
+ /**
2656
+ * Send text as literal characters, then submit with Enter as a separate call.
2657
+ * Fixes Codex intercom bug: long text + Enter in one send-keys blast causes
2658
+ * Codex to drop the Enter. Splitting them ensures the text renders before
2659
+ * the submit keystroke arrives.
2660
+ */
2661
+ sendKeysLiteral(target, text) {
2662
+ execFileSync("tmux", ["send-keys", "-t", target, "-l", text], QUIET);
2663
+ execFileSync("tmux", ["send-keys", "-t", target, "Enter"], QUIET);
2664
+ }
2655
2665
  capturePane(target, lines) {
2656
2666
  const args = ["capture-pane", "-t", target, "-p"];
2657
2667
  if (lines) args.push("-S", `-${lines}`);
package/dist/bin/cli.js CHANGED
@@ -368,7 +368,7 @@ function getAgentRuntime(agentId) {
368
368
  if (orgDefault) return orgDefault;
369
369
  return { runtime: DEFAULT_RUNTIME, model: DEFAULT_MODELS[DEFAULT_RUNTIME] };
370
370
  }
371
- function setAgentRuntime(agentId, runtime, model) {
371
+ function setAgentRuntime(agentId, runtime, model, reasoning_effort) {
372
372
  const knownModels = KNOWN_RUNTIMES[runtime];
373
373
  if (!knownModels) {
374
374
  return {
@@ -383,7 +383,9 @@ function setAgentRuntime(agentId, runtime, model) {
383
383
  };
384
384
  }
385
385
  const config = loadAgentConfig();
386
- config[agentId] = { runtime, model };
386
+ const entry = { runtime, model };
387
+ if (reasoning_effort) entry.reasoning_effort = reasoning_effort;
388
+ config[agentId] = entry;
387
389
  saveAgentConfig(config);
388
390
  return { ok: true };
389
391
  }
@@ -6938,6 +6940,7 @@ ${p.content}`).join("\n\n");
6938
6940
  var store_exports = {};
6939
6941
  __export(store_exports, {
6940
6942
  attachDocumentMetadata: () => attachDocumentMetadata,
6943
+ buildRawVisibilityFilter: () => buildRawVisibilityFilter,
6941
6944
  buildWikiScopeFilter: () => buildWikiScopeFilter,
6942
6945
  classifyTier: () => classifyTier,
6943
6946
  disposeStore: () => disposeStore,
@@ -7307,6 +7310,15 @@ function buildWikiScopeFilter(options, columnPrefix) {
7307
7310
  }
7308
7311
  return { clause, args: args2 };
7309
7312
  }
7313
+ function buildRawVisibilityFilter(options, columnPrefix) {
7314
+ if (options?.includeRaw === false) {
7315
+ return {
7316
+ clause: ` AND COALESCE(${columnPrefix}memory_type, 'raw') != 'raw'`,
7317
+ args: []
7318
+ };
7319
+ }
7320
+ return { clause: "", args: [] };
7321
+ }
7310
7322
  async function searchMemories(queryVector, agentId, options) {
7311
7323
  let client;
7312
7324
  try {
@@ -7339,6 +7351,9 @@ async function searchMemories(queryVector, agentId, options) {
7339
7351
  const scope = buildWikiScopeFilter(options, "");
7340
7352
  sql += scope.clause;
7341
7353
  args2.push(...scope.args);
7354
+ const rawVisibility = buildRawVisibilityFilter(options, "");
7355
+ sql += rawVisibility.clause;
7356
+ args2.push(...rawVisibility.args);
7342
7357
  if (options?.projectName) {
7343
7358
  sql += ` AND project_name = ?`;
7344
7359
  args2.push(options.projectName);
@@ -9259,6 +9274,16 @@ var init_tmux_transport = __esm({
9259
9274
  sendKeys(target, keys) {
9260
9275
  execFileSync("tmux", ["send-keys", "-t", target, keys, "Enter"], QUIET);
9261
9276
  }
9277
+ /**
9278
+ * Send text as literal characters, then submit with Enter as a separate call.
9279
+ * Fixes Codex intercom bug: long text + Enter in one send-keys blast causes
9280
+ * Codex to drop the Enter. Splitting them ensures the text renders before
9281
+ * the submit keystroke arrives.
9282
+ */
9283
+ sendKeysLiteral(target, text) {
9284
+ execFileSync("tmux", ["send-keys", "-t", target, "-l", text], QUIET);
9285
+ execFileSync("tmux", ["send-keys", "-t", target, "Enter"], QUIET);
9286
+ }
9262
9287
  capturePane(target, lines) {
9263
9288
  const args2 = ["capture-pane", "-t", target, "-p"];
9264
9289
  if (lines) args2.push("-S", `-${lines}`);
@@ -12080,10 +12105,11 @@ function sendIntercom(targetSession) {
12080
12105
  const agentName = baseAgentName(rawAgentName);
12081
12106
  const rtConfig = getAgentRuntime(agentName);
12082
12107
  if (rtConfig.runtime === "codex" || rtConfig.runtime === "opencode") {
12083
- transport.sendKeys(targetSession, "NEW TASK ASSIGNED. Call list_tasks now, then get_task on the highest priority open task. Start working immediately \u2014 do not ask for confirmation.");
12084
- try {
12085
- execSync8(`tmux send-keys -t ${targetSession} Tab`, { timeout: 2e3 });
12086
- } catch {
12108
+ const msg = "You have a new P0 task. Run list_tasks to find it.";
12109
+ if (transport.sendKeysLiteral) {
12110
+ transport.sendKeysLiteral(targetSession, msg);
12111
+ } else {
12112
+ transport.sendKeys(targetSession, msg);
12087
12113
  }
12088
12114
  } else {
12089
12115
  transport.sendKeys(targetSession, "/exe-intercom");
@@ -12368,6 +12394,9 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
12368
12394
  }
12369
12395
  }
12370
12396
  envPrefix = `${envPrefix} EXE_AGENT_MODEL=${agentRtConfig.model}`;
12397
+ if (agentRtConfig.reasoning_effort) {
12398
+ envPrefix = `${envPrefix} EXE_AGENT_REASONING_EFFORT=${agentRtConfig.reasoning_effort}`;
12399
+ }
12371
12400
  }
12372
12401
  if (useOpencode) {
12373
12402
  const ocCfg = PROVIDER_TABLE.opencode;
@@ -173,7 +173,7 @@ function getAgentRuntime(agentId) {
173
173
  if (orgDefault) return orgDefault;
174
174
  return { runtime: DEFAULT_RUNTIME, model: DEFAULT_MODELS[DEFAULT_RUNTIME] };
175
175
  }
176
- function setAgentRuntime(agentId, runtime, model) {
176
+ function setAgentRuntime(agentId, runtime, model, reasoning_effort) {
177
177
  const knownModels = KNOWN_RUNTIMES[runtime];
178
178
  if (!knownModels) {
179
179
  return {
@@ -188,7 +188,9 @@ function setAgentRuntime(agentId, runtime, model) {
188
188
  };
189
189
  }
190
190
  const config = loadAgentConfig();
191
- config[agentId] = { runtime, model };
191
+ const entry = { runtime, model };
192
+ if (reasoning_effort) entry.reasoning_effort = reasoning_effort;
193
+ config[agentId] = entry;
192
194
  saveAgentConfig(config);
193
195
  return { ok: true };
194
196
  }
@@ -3566,6 +3566,15 @@ function buildWikiScopeFilter(options, columnPrefix) {
3566
3566
  }
3567
3567
  return { clause, args };
3568
3568
  }
3569
+ function buildRawVisibilityFilter(options, columnPrefix) {
3570
+ if (options?.includeRaw === false) {
3571
+ return {
3572
+ clause: ` AND COALESCE(${columnPrefix}memory_type, 'raw') != 'raw'`,
3573
+ args: []
3574
+ };
3575
+ }
3576
+ return { clause: "", args: [] };
3577
+ }
3569
3578
  async function searchMemories(queryVector, agentId, options) {
3570
3579
  let client;
3571
3580
  try {
@@ -3598,6 +3607,9 @@ async function searchMemories(queryVector, agentId, options) {
3598
3607
  const scope = buildWikiScopeFilter(options, "");
3599
3608
  sql += scope.clause;
3600
3609
  args.push(...scope.args);
3610
+ const rawVisibility = buildRawVisibilityFilter(options, "");
3611
+ sql += rawVisibility.clause;
3612
+ args.push(...rawVisibility.args);
3601
3613
  if (options?.projectName) {
3602
3614
  sql += ` AND project_name = ?`;
3603
3615
  args.push(options.projectName);
@@ -3642,6 +3642,16 @@ var init_tmux_transport = __esm({
3642
3642
  sendKeys(target, keys) {
3643
3643
  execFileSync("tmux", ["send-keys", "-t", target, keys, "Enter"], QUIET);
3644
3644
  }
3645
+ /**
3646
+ * Send text as literal characters, then submit with Enter as a separate call.
3647
+ * Fixes Codex intercom bug: long text + Enter in one send-keys blast causes
3648
+ * Codex to drop the Enter. Splitting them ensures the text renders before
3649
+ * the submit keystroke arrives.
3650
+ */
3651
+ sendKeysLiteral(target, text) {
3652
+ execFileSync("tmux", ["send-keys", "-t", target, "-l", text], QUIET);
3653
+ execFileSync("tmux", ["send-keys", "-t", target, "Enter"], QUIET);
3654
+ }
3645
3655
  capturePane(target, lines) {
3646
3656
  const args = ["capture-pane", "-t", target, "-p"];
3647
3657
  if (lines) args.push("-S", `-${lines}`);
@@ -7158,10 +7168,11 @@ function sendIntercom(targetSession) {
7158
7168
  const agentName = baseAgentName(rawAgentName);
7159
7169
  const rtConfig = getAgentRuntime(agentName);
7160
7170
  if (rtConfig.runtime === "codex" || rtConfig.runtime === "opencode") {
7161
- transport.sendKeys(targetSession, "NEW TASK ASSIGNED. Call list_tasks now, then get_task on the highest priority open task. Start working immediately \u2014 do not ask for confirmation.");
7162
- try {
7163
- execSync7(`tmux send-keys -t ${targetSession} Tab`, { timeout: 2e3 });
7164
- } catch {
7171
+ const msg = "You have a new P0 task. Run list_tasks to find it.";
7172
+ if (transport.sendKeysLiteral) {
7173
+ transport.sendKeysLiteral(targetSession, msg);
7174
+ } else {
7175
+ transport.sendKeys(targetSession, msg);
7165
7176
  }
7166
7177
  } else {
7167
7178
  transport.sendKeys(targetSession, "/exe-intercom");
@@ -7446,6 +7457,9 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
7446
7457
  }
7447
7458
  }
7448
7459
  envPrefix = `${envPrefix} EXE_AGENT_MODEL=${agentRtConfig.model}`;
7460
+ if (agentRtConfig.reasoning_effort) {
7461
+ envPrefix = `${envPrefix} EXE_AGENT_REASONING_EFFORT=${agentRtConfig.reasoning_effort}`;
7462
+ }
7449
7463
  }
7450
7464
  if (useOpencode) {
7451
7465
  const ocCfg = PROVIDER_TABLE.opencode;
@@ -190,7 +190,7 @@ function getAgentRuntime(agentId) {
190
190
  if (orgDefault) return orgDefault;
191
191
  return { runtime: DEFAULT_RUNTIME, model: DEFAULT_MODELS[DEFAULT_RUNTIME] };
192
192
  }
193
- function setAgentRuntime(agentId, runtime, model) {
193
+ function setAgentRuntime(agentId, runtime, model, reasoning_effort) {
194
194
  const knownModels = KNOWN_RUNTIMES[runtime];
195
195
  if (!knownModels) {
196
196
  return {
@@ -205,7 +205,9 @@ function setAgentRuntime(agentId, runtime, model) {
205
205
  };
206
206
  }
207
207
  const config = loadAgentConfig();
208
- config[agentId] = { runtime, model };
208
+ const entry = { runtime, model };
209
+ if (reasoning_effort) entry.reasoning_effort = reasoning_effort;
210
+ config[agentId] = entry;
209
211
  saveAgentConfig(config);
210
212
  return { ok: true };
211
213
  }
@@ -174,6 +174,16 @@ var init_tmux_transport = __esm({
174
174
  sendKeys(target, keys) {
175
175
  execFileSync("tmux", ["send-keys", "-t", target, keys, "Enter"], QUIET);
176
176
  }
177
+ /**
178
+ * Send text as literal characters, then submit with Enter as a separate call.
179
+ * Fixes Codex intercom bug: long text + Enter in one send-keys blast causes
180
+ * Codex to drop the Enter. Splitting them ensures the text renders before
181
+ * the submit keystroke arrives.
182
+ */
183
+ sendKeysLiteral(target, text) {
184
+ execFileSync("tmux", ["send-keys", "-t", target, "-l", text], QUIET);
185
+ execFileSync("tmux", ["send-keys", "-t", target, "Enter"], QUIET);
186
+ }
177
187
  capturePane(target, lines) {
178
188
  const args = ["capture-pane", "-t", target, "-p"];
179
189
  if (lines) args.push("-S", `-${lines}`);
@@ -5107,10 +5117,11 @@ function sendIntercom(targetSession) {
5107
5117
  const agentName = baseAgentName(rawAgentName);
5108
5118
  const rtConfig = getAgentRuntime(agentName);
5109
5119
  if (rtConfig.runtime === "codex" || rtConfig.runtime === "opencode") {
5110
- transport.sendKeys(targetSession, "NEW TASK ASSIGNED. Call list_tasks now, then get_task on the highest priority open task. Start working immediately \u2014 do not ask for confirmation.");
5111
- try {
5112
- execSync6(`tmux send-keys -t ${targetSession} Tab`, { timeout: 2e3 });
5113
- } catch {
5120
+ const msg = "You have a new P0 task. Run list_tasks to find it.";
5121
+ if (transport.sendKeysLiteral) {
5122
+ transport.sendKeysLiteral(targetSession, msg);
5123
+ } else {
5124
+ transport.sendKeys(targetSession, msg);
5114
5125
  }
5115
5126
  } else {
5116
5127
  transport.sendKeys(targetSession, "/exe-intercom");
@@ -5395,6 +5406,9 @@ function spawnEmployee(employeeName2, exeSession2, projectDir2, opts) {
5395
5406
  }
5396
5407
  }
5397
5408
  envPrefix = `${envPrefix} EXE_AGENT_MODEL=${agentRtConfig.model}`;
5409
+ if (agentRtConfig.reasoning_effort) {
5410
+ envPrefix = `${envPrefix} EXE_AGENT_REASONING_EFFORT=${agentRtConfig.reasoning_effort}`;
5411
+ }
5398
5412
  }
5399
5413
  if (useOpencode) {
5400
5414
  const ocCfg = PROVIDER_TABLE.opencode;
@@ -2669,6 +2669,15 @@ function buildWikiScopeFilter(options, columnPrefix) {
2669
2669
  }
2670
2670
  return { clause, args };
2671
2671
  }
2672
+ function buildRawVisibilityFilter(options, columnPrefix) {
2673
+ if (options?.includeRaw === false) {
2674
+ return {
2675
+ clause: ` AND COALESCE(${columnPrefix}memory_type, 'raw') != 'raw'`,
2676
+ args: []
2677
+ };
2678
+ }
2679
+ return { clause: "", args: [] };
2680
+ }
2672
2681
  async function attachDocumentMetadata(records) {
2673
2682
  const docIds = [
2674
2683
  ...new Set(
@@ -2780,6 +2789,9 @@ async function ftsQuery(client, matchExpr, agentId, options, limit) {
2780
2789
  const scope = buildWikiScopeFilter(options, "m.");
2781
2790
  sql += scope.clause;
2782
2791
  args.push(...scope.args);
2792
+ const rawVisibility = buildRawVisibilityFilter(options, "m.");
2793
+ sql += rawVisibility.clause;
2794
+ args.push(...rawVisibility.args);
2783
2795
  if (options?.projectName) {
2784
2796
  sql += ` AND m.project_name = ?`;
2785
2797
  args.push(options.projectName);
@@ -2855,6 +2867,7 @@ async function recentRecords(agentId, options, limit, textFilter) {
2855
2867
  WHERE agent_id = ?
2856
2868
  AND timestamp >= ? AND timestamp <= ?
2857
2869
  AND COALESCE(status, 'active') = 'active'
2870
+ AND ${options?.includeRaw === false ? "COALESCE(memory_type, 'raw') != 'raw'" : "1 = 1"}
2858
2871
  AND COALESCE(confidence, 0.7) >= 0.3
2859
2872
  ORDER BY timestamp DESC LIMIT ?`,
2860
2873
  args: [agentId, windowStart, killedAt, boundarySlots]
@@ -2884,6 +2897,9 @@ async function recentRecords(agentId, options, limit, textFilter) {
2884
2897
  const scope = buildWikiScopeFilter(options, "");
2885
2898
  sql += scope.clause;
2886
2899
  args.push(...scope.args);
2900
+ const rawVisibility = buildRawVisibilityFilter(options, "");
2901
+ sql += rawVisibility.clause;
2902
+ args.push(...rawVisibility.args);
2887
2903
  if (options?.projectName) {
2888
2904
  sql += ` AND project_name = ?`;
2889
2905
  args.push(options.projectName);
@@ -734,7 +734,7 @@ function getAgentRuntime(agentId) {
734
734
  if (orgDefault) return orgDefault;
735
735
  return { runtime: DEFAULT_RUNTIME, model: DEFAULT_MODELS[DEFAULT_RUNTIME] };
736
736
  }
737
- function setAgentRuntime(agentId, runtime, model) {
737
+ function setAgentRuntime(agentId, runtime, model, reasoning_effort) {
738
738
  const knownModels = KNOWN_RUNTIMES[runtime];
739
739
  if (!knownModels) {
740
740
  return {
@@ -749,7 +749,9 @@ function setAgentRuntime(agentId, runtime, model) {
749
749
  };
750
750
  }
751
751
  const config2 = loadAgentConfig();
752
- config2[agentId] = { runtime, model };
752
+ const entry = { runtime, model };
753
+ if (reasoning_effort) entry.reasoning_effort = reasoning_effort;
754
+ config2[agentId] = entry;
753
755
  saveAgentConfig(config2);
754
756
  return { ok: true };
755
757
  }
@@ -3813,6 +3815,7 @@ ${p.content}`).join("\n\n");
3813
3815
  var store_exports = {};
3814
3816
  __export(store_exports, {
3815
3817
  attachDocumentMetadata: () => attachDocumentMetadata,
3818
+ buildRawVisibilityFilter: () => buildRawVisibilityFilter,
3816
3819
  buildWikiScopeFilter: () => buildWikiScopeFilter,
3817
3820
  classifyTier: () => classifyTier,
3818
3821
  disposeStore: () => disposeStore,
@@ -4182,6 +4185,15 @@ function buildWikiScopeFilter(options, columnPrefix) {
4182
4185
  }
4183
4186
  return { clause, args };
4184
4187
  }
4188
+ function buildRawVisibilityFilter(options, columnPrefix) {
4189
+ if (options?.includeRaw === false) {
4190
+ return {
4191
+ clause: ` AND COALESCE(${columnPrefix}memory_type, 'raw') != 'raw'`,
4192
+ args: []
4193
+ };
4194
+ }
4195
+ return { clause: "", args: [] };
4196
+ }
4185
4197
  async function searchMemories(queryVector, agentId, options) {
4186
4198
  let client;
4187
4199
  try {
@@ -4214,6 +4226,9 @@ async function searchMemories(queryVector, agentId, options) {
4214
4226
  const scope = buildWikiScopeFilter(options, "");
4215
4227
  sql += scope.clause;
4216
4228
  args.push(...scope.args);
4229
+ const rawVisibility = buildRawVisibilityFilter(options, "");
4230
+ sql += rawVisibility.clause;
4231
+ args.push(...rawVisibility.args);
4217
4232
  if (options?.projectName) {
4218
4233
  sql += ` AND project_name = ?`;
4219
4234
  args.push(options.projectName);
@@ -7745,6 +7760,16 @@ var init_tmux_transport = __esm({
7745
7760
  sendKeys(target, keys) {
7746
7761
  execFileSync("tmux", ["send-keys", "-t", target, keys, "Enter"], QUIET);
7747
7762
  }
7763
+ /**
7764
+ * Send text as literal characters, then submit with Enter as a separate call.
7765
+ * Fixes Codex intercom bug: long text + Enter in one send-keys blast causes
7766
+ * Codex to drop the Enter. Splitting them ensures the text renders before
7767
+ * the submit keystroke arrives.
7768
+ */
7769
+ sendKeysLiteral(target, text) {
7770
+ execFileSync("tmux", ["send-keys", "-t", target, "-l", text], QUIET);
7771
+ execFileSync("tmux", ["send-keys", "-t", target, "Enter"], QUIET);
7772
+ }
7748
7773
  capturePane(target, lines) {
7749
7774
  const args = ["capture-pane", "-t", target, "-p"];
7750
7775
  if (lines) args.push("-S", `-${lines}`);
@@ -10559,10 +10584,11 @@ function sendIntercom(targetSession) {
10559
10584
  const agentName = baseAgentName(rawAgentName);
10560
10585
  const rtConfig = getAgentRuntime(agentName);
10561
10586
  if (rtConfig.runtime === "codex" || rtConfig.runtime === "opencode") {
10562
- transport.sendKeys(targetSession, "NEW TASK ASSIGNED. Call list_tasks now, then get_task on the highest priority open task. Start working immediately \u2014 do not ask for confirmation.");
10563
- try {
10564
- execSync6(`tmux send-keys -t ${targetSession} Tab`, { timeout: 2e3 });
10565
- } catch {
10587
+ const msg = "You have a new P0 task. Run list_tasks to find it.";
10588
+ if (transport.sendKeysLiteral) {
10589
+ transport.sendKeysLiteral(targetSession, msg);
10590
+ } else {
10591
+ transport.sendKeys(targetSession, msg);
10566
10592
  }
10567
10593
  } else {
10568
10594
  transport.sendKeys(targetSession, "/exe-intercom");
@@ -10847,6 +10873,9 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
10847
10873
  }
10848
10874
  }
10849
10875
  envPrefix = `${envPrefix} EXE_AGENT_MODEL=${agentRtConfig.model}`;
10876
+ if (agentRtConfig.reasoning_effort) {
10877
+ envPrefix = `${envPrefix} EXE_AGENT_REASONING_EFFORT=${agentRtConfig.reasoning_effort}`;
10878
+ }
10850
10879
  }
10851
10880
  if (useOpencode) {
10852
10881
  const ocCfg = PROVIDER_TABLE.opencode;
@@ -2671,6 +2671,16 @@ var init_tmux_transport = __esm({
2671
2671
  sendKeys(target, keys) {
2672
2672
  execFileSync("tmux", ["send-keys", "-t", target, keys, "Enter"], QUIET);
2673
2673
  }
2674
+ /**
2675
+ * Send text as literal characters, then submit with Enter as a separate call.
2676
+ * Fixes Codex intercom bug: long text + Enter in one send-keys blast causes
2677
+ * Codex to drop the Enter. Splitting them ensures the text renders before
2678
+ * the submit keystroke arrives.
2679
+ */
2680
+ sendKeysLiteral(target, text) {
2681
+ execFileSync("tmux", ["send-keys", "-t", target, "-l", text], QUIET);
2682
+ execFileSync("tmux", ["send-keys", "-t", target, "Enter"], QUIET);
2683
+ }
2674
2684
  capturePane(target, lines) {
2675
2685
  const args = ["capture-pane", "-t", target, "-p"];
2676
2686
  if (lines) args.push("-S", `-${lines}`);
@@ -357,7 +357,7 @@ function getAgentRuntime(agentId) {
357
357
  if (orgDefault) return orgDefault;
358
358
  return { runtime: DEFAULT_RUNTIME, model: DEFAULT_MODELS[DEFAULT_RUNTIME] };
359
359
  }
360
- function setAgentRuntime(agentId, runtime, model) {
360
+ function setAgentRuntime(agentId, runtime, model, reasoning_effort) {
361
361
  const knownModels = KNOWN_RUNTIMES[runtime];
362
362
  if (!knownModels) {
363
363
  return {
@@ -372,7 +372,9 @@ function setAgentRuntime(agentId, runtime, model) {
372
372
  };
373
373
  }
374
374
  const config = loadAgentConfig();
375
- config[agentId] = { runtime, model };
375
+ const entry = { runtime, model };
376
+ if (reasoning_effort) entry.reasoning_effort = reasoning_effort;
377
+ config[agentId] = entry;
376
378
  saveAgentConfig(config);
377
379
  return { ok: true };
378
380
  }
@@ -196,7 +196,7 @@ function getAgentRuntime(agentId) {
196
196
  if (orgDefault) return orgDefault;
197
197
  return { runtime: DEFAULT_RUNTIME, model: DEFAULT_MODELS[DEFAULT_RUNTIME] };
198
198
  }
199
- function setAgentRuntime(agentId, runtime, model) {
199
+ function setAgentRuntime(agentId, runtime, model, reasoning_effort) {
200
200
  const knownModels = KNOWN_RUNTIMES[runtime];
201
201
  if (!knownModels) {
202
202
  return {
@@ -211,7 +211,9 @@ function setAgentRuntime(agentId, runtime, model) {
211
211
  };
212
212
  }
213
213
  const config = loadAgentConfig();
214
- config[agentId] = { runtime, model };
214
+ const entry = { runtime, model };
215
+ if (reasoning_effort) entry.reasoning_effort = reasoning_effort;
216
+ config[agentId] = entry;
215
217
  saveAgentConfig(config);
216
218
  return { ok: true };
217
219
  }
@@ -2651,6 +2651,16 @@ var init_tmux_transport = __esm({
2651
2651
  sendKeys(target, keys) {
2652
2652
  execFileSync("tmux", ["send-keys", "-t", target, keys, "Enter"], QUIET);
2653
2653
  }
2654
+ /**
2655
+ * Send text as literal characters, then submit with Enter as a separate call.
2656
+ * Fixes Codex intercom bug: long text + Enter in one send-keys blast causes
2657
+ * Codex to drop the Enter. Splitting them ensures the text renders before
2658
+ * the submit keystroke arrives.
2659
+ */
2660
+ sendKeysLiteral(target, text) {
2661
+ execFileSync("tmux", ["send-keys", "-t", target, "-l", text], QUIET);
2662
+ execFileSync("tmux", ["send-keys", "-t", target, "Enter"], QUIET);
2663
+ }
2654
2664
  capturePane(target, lines) {
2655
2665
  const args = ["capture-pane", "-t", target, "-p"];
2656
2666
  if (lines) args.push("-S", `-${lines}`);
@@ -2652,6 +2652,16 @@ var init_tmux_transport = __esm({
2652
2652
  sendKeys(target, keys) {
2653
2653
  execFileSync("tmux", ["send-keys", "-t", target, keys, "Enter"], QUIET);
2654
2654
  }
2655
+ /**
2656
+ * Send text as literal characters, then submit with Enter as a separate call.
2657
+ * Fixes Codex intercom bug: long text + Enter in one send-keys blast causes
2658
+ * Codex to drop the Enter. Splitting them ensures the text renders before
2659
+ * the submit keystroke arrives.
2660
+ */
2661
+ sendKeysLiteral(target, text) {
2662
+ execFileSync("tmux", ["send-keys", "-t", target, "-l", text], QUIET);
2663
+ execFileSync("tmux", ["send-keys", "-t", target, "Enter"], QUIET);
2664
+ }
2655
2665
  capturePane(target, lines) {
2656
2666
  const args = ["capture-pane", "-t", target, "-p"];
2657
2667
  if (lines) args.push("-S", `-${lines}`);
@@ -2652,6 +2652,16 @@ var init_tmux_transport = __esm({
2652
2652
  sendKeys(target, keys) {
2653
2653
  execFileSync("tmux", ["send-keys", "-t", target, keys, "Enter"], QUIET);
2654
2654
  }
2655
+ /**
2656
+ * Send text as literal characters, then submit with Enter as a separate call.
2657
+ * Fixes Codex intercom bug: long text + Enter in one send-keys blast causes
2658
+ * Codex to drop the Enter. Splitting them ensures the text renders before
2659
+ * the submit keystroke arrives.
2660
+ */
2661
+ sendKeysLiteral(target, text) {
2662
+ execFileSync("tmux", ["send-keys", "-t", target, "-l", text], QUIET);
2663
+ execFileSync("tmux", ["send-keys", "-t", target, "Enter"], QUIET);
2664
+ }
2655
2665
  capturePane(target, lines) {
2656
2666
  const args = ["capture-pane", "-t", target, "-p"];
2657
2667
  if (lines) args.push("-S", `-${lines}`);