nolo-cli 0.14.0 → 0.15.0

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 (100) hide show
  1. package/{_executeModel-TURRLTZ2.js → _executeModel-QAUS6B7J.js} +24 -24
  2. package/{action-N3KXFO5V.js → action-GUOZYYGN.js} +4 -4
  3. package/{addContentAction-4Z762DMR.js → addContentAction-QDGHGUBH.js} +3 -3
  4. package/{addDialogAgentAction-FALLEKPR.js → addDialogAgentAction-Z4YCYZIV.js} +2 -2
  5. package/{agentDeleteCommand-AZDVM4HQ.js → agentDeleteCommand-QDO62EZA.js} +20 -20
  6. package/{agentEmailCommands-M4AHOEZ3.js → agentEmailCommands-UZ5BKX3P.js} +38 -38
  7. package/{agentGrantCommands-B4MB23VQ.js → agentGrantCommands-JNDE4RWR.js} +2 -2
  8. package/{agentListCommands-OJLOXSKL.js → agentListCommands-ZC33UDWT.js} +22 -22
  9. package/{agentMachineCommands-NPMM4Z53.js → agentMachineCommands-RZGZEZRL.js} +20 -20
  10. package/{agentPullCommand-KRBRIFIY.js → agentPullCommand-6HWUT3SW.js} +2 -2
  11. package/{agentRecordCommands-RVUH7XLZ.js → agentRecordCommands-DGDXE2VH.js} +33 -33
  12. package/{agentRunCommand-F6W2WKKZ.js → agentRunCommand-SRZWFOPH.js} +35 -35
  13. package/{agentRunControl-IX4F5W2C.js → agentRunControl-6ADXVYMR.js} +2 -2
  14. package/{agentRuntimeLocal-DSUBT77I.js → agentRuntimeLocal-4YCF6IRF.js} +11 -11
  15. package/{agentSlice-PCEL26Z7.js → agentSlice-IVE735EV.js} +3 -3
  16. package/appDeleteCommands-7I26L64I.js +124 -0
  17. package/appDeployCommands-TZLZNTJN.js +163 -0
  18. package/appDeployStatusCommands-OPPTLHRW.js +144 -0
  19. package/appGetCommands-N2S4HYKY.js +119 -0
  20. package/appListCommands-OBTPPKUM.js +122 -0
  21. package/{authCommand-66ME4KZX.js → authCommand-YFTR3347.js} +5 -5
  22. package/{authCommands-GH5T6RYV.js → authCommands-YXGOXNBZ.js} +3 -3
  23. package/{chunk-3B2LFO6R.js → browser-image-compression-MFDTD7K6.js} +4 -518
  24. package/{chunk-4UUJFFMK.js → chunk-472E5RMQ.js} +1 -1
  25. package/chunk-4QQFLN5C.js +552 -0
  26. package/{chunk-33K5FKRL.js → chunk-5VMYGIIL.js} +110 -39
  27. package/{chunk-LNSRTNH7.js → chunk-6565R2TI.js} +20 -16
  28. package/{chunk-VQFY3VXW.js → chunk-6MHDWKOT.js} +3 -2
  29. package/{chunk-5NBHQD4D.js → chunk-A7GB5UGH.js} +1 -1
  30. package/{chunk-NZFWHBW5.js → chunk-AWDOJBHW.js} +487 -441
  31. package/{chunk-MYE5X27Y.js → chunk-BFRVXJJJ.js} +43 -16
  32. package/{chunk-PYAJ6ZSK.js → chunk-G2MKOQCB.js} +1 -1
  33. package/chunk-GFUIQ4RY.js +136 -0
  34. package/{chunk-KTFJUPDW.js → chunk-HRQCKQA5.js} +31 -31
  35. package/{chunk-TQCONXQ3.js → chunk-IOQ7IBPU.js} +1 -1
  36. package/{chunk-OIMX7MM4.js → chunk-ISYE6GZB.js} +1 -1
  37. package/{chunk-RZALKBP4.js → chunk-IZ2QRVEU.js} +2 -2
  38. package/{chunk-XIDYAII4.js → chunk-JBKVPAYK.js} +7 -140
  39. package/{chunk-V6VXDXGY.js → chunk-JS33TCQ3.js} +2 -2
  40. package/{chunk-5R73BS7Y.js → chunk-K53477EY.js} +5 -5
  41. package/{chunk-7JJCGV7N.js → chunk-K6EUAOW3.js} +1 -1
  42. package/{chunk-OHEKYYJF.js → chunk-KMQPSTMJ.js} +6 -6
  43. package/{chunk-3WGLLTK4.js → chunk-LSFAWXKC.js} +100 -3
  44. package/{chunk-4ON5AV72.js → chunk-MYMMNKYL.js} +1 -1
  45. package/{chunk-BHK5ZAW7.js → chunk-N5424GSW.js} +1 -1
  46. package/chunk-NTC6I2FN.js +107 -0
  47. package/{chunk-7LAIOHOL.js → chunk-O53CP2QR.js} +3 -3
  48. package/{chunk-TLNEQI2R.js → chunk-OKSYPTDZ.js} +9 -9
  49. package/{chunk-IMZ7AFIJ.js → chunk-OQMPU2ML.js} +4 -4
  50. package/{chunk-IYGQF62W.js → chunk-P4MJQWWF.js} +3 -3
  51. package/{chunk-UW3WOIWJ.js → chunk-RKM3K52F.js} +1 -1
  52. package/{chunk-A5V7UEZJ.js → chunk-SFXYKGK2.js} +3 -3
  53. package/{chunk-S5UACFUP.js → chunk-TTGAVETO.js} +10 -2
  54. package/{chunk-BOJVWKNA.js → chunk-U7LEGLEB.js} +1 -1
  55. package/{chunk-E6KIDMTW.js → chunk-UXKQQ2MR.js} +9 -9
  56. package/{chunk-R5AOLZZV.js → chunk-VE6XMVKG.js} +203 -45
  57. package/{chunk-NJVPXLRY.js → chunk-VPTJB4HM.js} +1 -1
  58. package/{chunk-PB2DHBEQ.js → chunk-WA6KZL5V.js} +25 -6
  59. package/{chunk-T3X232L6.js → chunk-WNLPAOIT.js} +1 -1
  60. package/{chunk-NFPO7274.js → chunk-WRN5EQT7.js} +1 -1
  61. package/{chunk-4F4FJPFM.js → chunk-XGQZFBO5.js} +90 -209
  62. package/{chunk-3FCSMQAC.js → chunk-XVP3C2KY.js} +1 -1
  63. package/{chunk-TYRTLSGX.js → chunk-YNHQIXX5.js} +833 -5746
  64. package/{chunk-7TN6V43T.js → chunk-Z24FGIU2.js} +2 -2
  65. package/{cliEnvHelpers-VYC2OPTB.js → cliEnvHelpers-ZXNMX7VV.js} +1 -1
  66. package/{createAgentAutomationAction-VLNDOHSP.js → createAgentAutomationAction-TS6NNZ4X.js} +9 -9
  67. package/{createDialogAction-6WYTS62Z.js → createDialogAction-5HVQ33EX.js} +10 -10
  68. package/{createPageAction-YKHOC3LW.js → createPageAction-4F3ZGQJD.js} +9 -9
  69. package/{dbSlice-7Q23HSWH.js → dbSlice-OP6UPXKA.js} +2 -2
  70. package/{dialogCommands-BQDGLVMO.js → dialogCommands-3GEPXHFB.js} +16 -16
  71. package/{dialogSlice-2A2JOFZW.js → dialogSlice-FAWUQDJW.js} +9 -9
  72. package/{docCreateCommands-K2MPMXYF.js → docCreateCommands-ZE3S6BCP.js} +22 -20
  73. package/{docDeleteCommands-NBAARB77.js → docDeleteCommands-TW6PGTRT.js} +21 -19
  74. package/{docReadCommands-S3MO5RPS.js → docReadCommands-LDXL3B6J.js} +20 -18
  75. package/{docStore-JJP5PUR7.js → docStore-2UHVWLTV.js} +10 -10
  76. package/{docUpdateCommands-EHEI7FCE.js → docUpdateCommands-GYD6XI5O.js} +21 -19
  77. package/{handleSendMessageAction-UAXTF73I.js → handleSendMessageAction-LJPUYNOH.js} +15 -11
  78. package/index.js +109 -78
  79. package/{machineCommands-BQ46IS5M.js → machineCommands-OKNDYS3M.js} +36 -36
  80. package/{machineWsRunDispatch-R33NXNNI.js → machineWsRunDispatch-ZX5AJ6FJ.js} +32 -32
  81. package/{memoryCommands-AFMES3LN.js → memoryCommands-EBMICQR6.js} +1 -1
  82. package/package.json +1 -1
  83. package/{read-SIWMJRHC.js → read-HXHAZBKH.js} +1 -1
  84. package/{readDocTool-TCYJY4PP.js → readDocTool-VPBDTO4G.js} +1 -1
  85. package/{readlineWorkspace-KBG4DKLX.js → readlineWorkspace-MB3ANKHM.js} +123 -103
  86. package/{removeDialogAgentAction-WKHZT6VJ.js → removeDialogAgentAction-HUFVN35S.js} +4 -4
  87. package/{runAgentClientLoop-MUV5YIRK.js → runAgentClientLoop-A75BUU6D.js} +19 -19
  88. package/{runtimeDoctorCommands-QNF3J3UV.js → runtimeDoctorCommands-THIHX2SY.js} +1 -1
  89. package/{setDialogExtraReferencesAction-GCI5QU6E.js → setDialogExtraReferencesAction-2VLGWQKG.js} +2 -2
  90. package/{setPrimaryDialogAgentAction-NRO57AS6.js → setPrimaryDialogAgentAction-VB4UV2CC.js} +4 -4
  91. package/{settingSlice-FTWZ5ZHT.js → settingSlice-7JYPQNAC.js} +3 -3
  92. package/{spaceCommands-4R63UST3.js → spaceCommands-O3KJNCON.js} +21 -21
  93. package/{spaceSlice-VTC3QXP3.js → spaceSlice-444MFUP6.js} +11 -9
  94. package/{streamAgentChatTurn-43N7BNV2.js → streamAgentChatTurn-DJAE7USZ.js} +42 -39
  95. package/{tableCommands-E4SQWDOX.js → tableCommands-3P7MJ3PF.js} +4 -4
  96. package/{tools-PX6PEJLE.js → tools-YB6LXSVN.js} +14 -14
  97. package/{tuiSummaryLlmCaller-2D65LKWM.js → tuiSummaryLlmCaller-QQL3JA5I.js} +3 -3
  98. package/{updateCommands-XZDOOYFH.js → updateCommands-XTW55TOT.js} +2 -2
  99. package/{updateDialogTitleAction-NPQZWAKG.js → updateDialogTitleAction-6HGFBM64.js} +9 -9
  100. package/{chunk-3QAF2LTL.js → chunk-DZ3XJVET.js} +3 -3
@@ -4,25 +4,26 @@ import {
4
4
  providerHttpFailure,
5
5
  readSseFrames,
6
6
  throwIfChatCompletionStreamFailed
7
- } from "./chunk-PB2DHBEQ.js";
7
+ } from "./chunk-WA6KZL5V.js";
8
8
  import {
9
9
  parseToolArgumentsJson
10
- } from "./chunk-VQFY3VXW.js";
10
+ } from "./chunk-6MHDWKOT.js";
11
11
  import {
12
12
  createThinkParserState,
13
13
  createToolCallAccumulator,
14
+ createToolCallTextParserState,
14
15
  extractThinkContent,
15
16
  finalizeAccumulatedToolCalls
16
- } from "./chunk-3WGLLTK4.js";
17
+ } from "./chunk-LSFAWXKC.js";
17
18
  import {
18
19
  requiresBareImageUrl,
19
20
  toBareImageUrlMessages
20
- } from "./chunk-UW3WOIWJ.js";
21
+ } from "./chunk-RKM3K52F.js";
21
22
  import {
22
23
  buildProviderAuthHeaders,
23
24
  buildProviderExecutionPlan,
24
25
  toOpenAiCompatibleMessages
25
- } from "./chunk-KTFJUPDW.js";
26
+ } from "./chunk-HRQCKQA5.js";
26
27
  import {
27
28
  canonicalizeToolName,
28
29
  createGlob,
@@ -153,6 +154,7 @@ async function readOpenAiCompatibleSseCompletion(args) {
153
154
  usage: void 0,
154
155
  accumulatedToolCalls: createToolCallAccumulator(),
155
156
  thinkState: createThinkParserState(),
157
+ toolCallTextState: createToolCallTextParserState(),
156
158
  onTextDelta: args.onTextDelta,
157
159
  onReasoningDelta: args.onReasoningDelta
158
160
  };
@@ -432,6 +434,16 @@ function resolveDialogTitle(args) {
432
434
  const lastUserText = extractLastUserText(args.messages).trim();
433
435
  return lastUserText ? lastUserText.slice(0, 80) : "Local agent run";
434
436
  }
437
+ function pickDialogTitle(args) {
438
+ const existing = args.existingDialog?.title;
439
+ if (typeof existing === "string" && existing.trim()) return existing.trim();
440
+ const override = args.titleOverride?.trim();
441
+ if (override) return override;
442
+ return resolveDialogTitle({
443
+ existingDialog: args.existingDialog,
444
+ messages: args.messages
445
+ });
446
+ }
435
447
  function normalizeSubjectRef(ref) {
436
448
  if (!ref || typeof ref !== "object") return null;
437
449
  const raw = ref;
@@ -520,8 +532,9 @@ function buildAgentRuntimeDialogWritePlan(args) {
520
532
  userId: args.userId,
521
533
  cybots: [args.input.agentKey],
522
534
  primaryAgentKey: args.input.agentKey,
523
- title: typeof args.existingDialog?.title === "string" && args.existingDialog.title.trim() ? args.existingDialog.title.trim() : args.titleOverride?.trim() ? args.titleOverride.trim() : resolveDialogTitle({
535
+ title: pickDialogTitle({
524
536
  existingDialog: args.existingDialog,
537
+ titleOverride: args.titleOverride,
525
538
  messages: args.input.messages
526
539
  }),
527
540
  status: args.input.result.error === true ? "failed" : "done",
@@ -552,6 +565,7 @@ function buildAgentRuntimeDialogWritePlan(args) {
552
565
  };
553
566
  return {
554
567
  dialogId,
568
+ title: dialogRecord.title,
555
569
  ops: [
556
570
  {
557
571
  type: "put",
@@ -814,12 +828,16 @@ var buildCombinedShellInput = (args) => {
814
828
  typeof args.input === "string" ? args.input : ""
815
829
  ].filter(Boolean).join("\n");
816
830
  };
817
- function isDestructiveShellCommand(args) {
831
+ function resolveScannableShellInput(args) {
818
832
  const combined = buildCombinedShellInput(args);
819
- if (!combined.trim()) return false;
820
- const scannable = SHELL_STRING_EXECUTION_PATTERNS.some(
833
+ if (!combined.trim()) return void 0;
834
+ return SHELL_STRING_EXECUTION_PATTERNS.some(
821
835
  (pattern) => pattern.test(combined)
822
836
  ) ? combined : stripQuotedSegments(combined);
837
+ }
838
+ function isDestructiveShellCommand(args) {
839
+ const scannable = resolveScannableShellInput(args);
840
+ if (scannable === void 0) return false;
823
841
  return SHELL_DESTRUCTIVE_PATTERNS.some((pattern) => pattern.test(scannable));
824
842
  }
825
843
  var LONG_RUNNING_COMMAND_PATTERNS = [
@@ -835,13 +853,42 @@ var LONG_RUNNING_COMMAND_PATTERNS = [
835
853
  /\bpm2\b.*\bstart\b/i
836
854
  ];
837
855
  function isLongRunningShellCommand(args) {
838
- const combined = buildCombinedShellInput(args);
839
- if (!combined.trim()) return false;
840
- const scannable = SHELL_STRING_EXECUTION_PATTERNS.some(
841
- (pattern) => pattern.test(combined)
842
- ) ? combined : stripQuotedSegments(combined);
856
+ const scannable = resolveScannableShellInput(args);
857
+ if (scannable === void 0) return false;
843
858
  return LONG_RUNNING_COMMAND_PATTERNS.some((pattern) => pattern.test(scannable));
844
859
  }
860
+ var IMMEDIATE_DETACH_COMMAND_PATTERNS = [
861
+ /\btail\s+(?:-\S*[fF]\S*|--follow)\b/,
862
+ /\bwatch\s+\S/,
863
+ /\bwhile\s+(?:true|:|\[\s*true\s*\])\s*;\s*do\b/
864
+ ];
865
+ var IMMEDIATE_DETACH_SLEEP_THRESHOLD_SECONDS = 5;
866
+ var SLEEP_PREFIX_PATTERN = /^(?:[A-Za-z_][A-Za-z0-9_]*=\S*\s+)*(?:nohup\s+|time\s+)*sleep\s+(\S+)/;
867
+ function parseSleepDurationSeconds(token) {
868
+ const match = /^(\d+(?:\.\d+)?)(s|m|h|d)?$/i.exec(token);
869
+ if (!match) return void 0;
870
+ const value = Number(match[1]);
871
+ if (!Number.isFinite(value)) return void 0;
872
+ const unit = (match[2] ?? "s").toLowerCase();
873
+ const factor = unit === "m" ? 60 : unit === "h" ? 3600 : unit === "d" ? 86400 : 1;
874
+ return value * factor;
875
+ }
876
+ function isLongSleepCommand(scannable) {
877
+ const match = SLEEP_PREFIX_PATTERN.exec(scannable.trim());
878
+ if (!match) return false;
879
+ const durationToken = match[1] ?? "";
880
+ if (/^inf(inity)?$/i.test(durationToken)) return true;
881
+ const seconds = parseSleepDurationSeconds(durationToken);
882
+ if (seconds === void 0) return true;
883
+ return seconds > IMMEDIATE_DETACH_SLEEP_THRESHOLD_SECONDS;
884
+ }
885
+ function isImmediateDetachShellCommand(args) {
886
+ const scannable = resolveScannableShellInput(args);
887
+ if (scannable === void 0) return false;
888
+ return isLongSleepCommand(scannable) || LONG_RUNNING_COMMAND_PATTERNS.some((pattern) => pattern.test(scannable)) || IMMEDIATE_DETACH_COMMAND_PATTERNS.some(
889
+ (pattern) => pattern.test(scannable)
890
+ );
891
+ }
845
892
  function evaluateShellCommandPolicy(args) {
846
893
  if (isDestructiveShellCommand(args) && !hasExplicitDestructivePermission(args.userInput)) {
847
894
  return {
@@ -1524,7 +1571,7 @@ function buildExecShellTool(toolName) {
1524
1571
  type: "function",
1525
1572
  function: {
1526
1573
  name: toolName,
1527
- description: "Run a shell command in the local workspace. Commands already execute from the workspace root; do not cd into guessed paths such as /workspace, /repo, /home/user, or /home/user/workspace. Prefer one command that performs a complete verification or related git operation instead of many tiny commands. For branch setup, prefer idempotent commands such as git switch -C <branch> when replacing or recreating a benchmark branch is acceptable. Use portable POSIX commands for macOS/BSD shells; avoid GNU-only flags such as cat -A. Do not use cat -A. Do not use brittle byte-offset commands such as xxd -s -32. For separator lines, use echo or printf '%s\\n'. For text-file content or trailing-newline checks, prefer readFile over shell byte inspection when that tool is available. Do not run repeated git status, git log, git rev-parse, or branch checks after a successful command already returned the needed clean status and commit information; use one final verification command. If a command fails, use the error output to adjust the next command rather than repeating the same shape. For long-running commands that should keep running in the background (dev servers, watchers, REPLs, `--watch`/`serve`/`dev` scripts), use launchProcess instead \u2014 execShell blocks until the command exits and will freeze the conversation.",
1574
+ description: "Run a shell command in the local workspace. Commands already execute from the workspace root; do not cd into guessed paths such as /workspace, /repo, /home/user, or /home/user/workspace. Prefer one command that performs a complete verification or related git operation instead of many tiny commands. For branch setup, prefer idempotent commands such as git switch -C <branch> when replacing or recreating a benchmark branch is acceptable. Use portable POSIX commands for macOS/BSD shells; avoid GNU-only flags such as cat -A. Do not use cat -A. Do not use brittle byte-offset commands such as xxd -s -32. For separator lines, use echo or printf '%s\\n'. For text-file content or trailing-newline checks, prefer readFile over shell byte inspection when that tool is available. Do not run repeated git status, git log, git rev-parse, or branch checks after a successful command already returned the needed clean status and commit information; use one final verification command. If a command fails, use the error output to adjust the next command rather than repeating the same shape. For long-running commands that should keep running in the background (dev servers, watchers, REPLs, `--watch`/`serve`/`dev` scripts), prefer launchProcess. Obviously long-running commands run via execShell (sleep over 5s, tail -f, watch, infinite loops, dev/serve/watch scripts) are moved to the background automatically and return {detached: true, pid, label} \u2014 use listProcesses to inspect or stop them, and tell the user the command is running in the background. Any other command blocks until it exits, so keep those short.",
1528
1575
  parameters: {
1529
1576
  type: "object",
1530
1577
  properties: {
@@ -1721,8 +1768,9 @@ function resolveExecShellTimeoutMs(override) {
1721
1768
  return asOptionalPositiveFiniteNumber(Number(raw));
1722
1769
  }
1723
1770
  function resolveDetachMs(override) {
1724
- const fromOverride = asOptionalPositiveFiniteNumber(override);
1725
- if (fromOverride !== void 0) return fromOverride;
1771
+ if (typeof override === "number" && Number.isFinite(override) && override >= 0) {
1772
+ return override;
1773
+ }
1726
1774
  const raw = process.env[EXEC_SHELL_DETACH_ENV];
1727
1775
  if (raw === void 0) return DEFAULT_EXEC_SHELL_DETACH_MS;
1728
1776
  const parsed = asOptionalPositiveFiniteNumber(Number(raw));
@@ -1949,15 +1997,22 @@ function isPathInsideWorkspace(args) {
1949
1997
  const relativePath = relative(args.workspaceRoot, args.targetPath);
1950
1998
  return relativePath === "" || !relativePath.startsWith("..") && !relativePath.includes(`..${sep}`);
1951
1999
  }
2000
+ var PATH_FIELD_ALIASES = ["path", "file_path", "filePath", "filename", "file", "target_file", "targetFile", "file_to_read", "fileToRead"];
2001
+ var OLD_TEXT_FIELD_ALIASES = ["oldText", "old_string", "oldString", "search", "search_string", "find", "match"];
2002
+ var NEW_TEXT_FIELD_ALIASES = ["newText", "new_string", "newString", "replacement", "replace"];
2003
+ var SEARCH_QUERY_FIELD_ALIASES = ["query", "search_query", "searchQuery", "q", "pattern", "search"];
2004
+ function pickFirstAlias(args, aliases, preserveWhitespace = false) {
2005
+ for (const key of aliases) {
2006
+ const val = args[key];
2007
+ if (typeof val === "string" && val.length > 0) return preserveWhitespace ? val : val.trim();
2008
+ }
2009
+ return void 0;
2010
+ }
1952
2011
  function requireWorkspaceToolPath(args) {
1953
- const requestedPath = readWorkspacePathAlias(args) ?? "";
2012
+ const requestedPath = pickFirstAlias(args, PATH_FIELD_ALIASES) ?? "";
1954
2013
  if (!requestedPath) throw new Error("Workspace tool requires a non-empty path.");
1955
2014
  return requestedPath;
1956
2015
  }
1957
- function readWorkspacePathAlias(args) {
1958
- const path = args.path ?? args.file_path ?? args.filePath ?? args.filename ?? args.file;
1959
- return asOptionalTrimmedString(path);
1960
- }
1961
2016
  function requireWorkspaceFileContent(args) {
1962
2017
  if (typeof args.content !== "string") {
1963
2018
  throw new Error("writeFile requires string content.");
@@ -1965,16 +2020,18 @@ function requireWorkspaceFileContent(args) {
1965
2020
  return args.content;
1966
2021
  }
1967
2022
  function requireWorkspaceOldText(args) {
1968
- if (typeof args.oldText !== "string" || !args.oldText) {
2023
+ const oldText = pickFirstAlias(args, OLD_TEXT_FIELD_ALIASES, true);
2024
+ if (!oldText || !oldText.trim()) {
1969
2025
  throw new Error("editFile requires non-empty oldText.");
1970
2026
  }
1971
- return args.oldText;
2027
+ return oldText;
1972
2028
  }
1973
2029
  function requireWorkspaceNewText(args) {
1974
- if (typeof args.newText !== "string") {
1975
- throw new Error("editFile requires string newText.");
2030
+ for (const key of NEW_TEXT_FIELD_ALIASES) {
2031
+ const val = args[key];
2032
+ if (typeof val === "string") return val;
1976
2033
  }
1977
- return args.newText;
2034
+ throw new Error("editFile requires string newText.");
1978
2035
  }
1979
2036
  function readExpectedReplacementCount(args) {
1980
2037
  if (args.expectedReplacements === void 0) return 1;
@@ -2178,7 +2235,7 @@ function clipEditSnippet(text) {
2178
2235
  return lines.slice(0, EDIT_SNIPPET_MAX_LINES).map((line) => line.length > EDIT_SNIPPET_WIDTH ? `${line.slice(0, EDIT_SNIPPET_WIDTH)}\u2026` : line).join("\n");
2179
2236
  }
2180
2237
  function requireWorkspaceSearchQuery(args) {
2181
- const query = asTrimmedString(args.query);
2238
+ const query = pickFirstAlias(args, SEARCH_QUERY_FIELD_ALIASES);
2182
2239
  if (!query) throw new Error("searchFiles requires a non-empty query.");
2183
2240
  return query;
2184
2241
  }
@@ -2477,9 +2534,9 @@ async function runWorkspaceCommand(args) {
2477
2534
  args.abortSignal.addEventListener("abort", abortListener, { once: true });
2478
2535
  }) : null;
2479
2536
  const effectiveDetachMs = resolveDetachMs(args.detachMs);
2480
- const detachPromise = effectiveDetachMs ? new Promise((r) => {
2537
+ const detachPromise = new Promise((r) => {
2481
2538
  detachTimer = setTimeout(() => r(detachResult), effectiveDetachMs);
2482
- }) : null;
2539
+ });
2483
2540
  const racers = [exitPromise];
2484
2541
  if (timeoutMs) {
2485
2542
  racers.push(
@@ -2489,7 +2546,7 @@ async function runWorkspaceCommand(args) {
2489
2546
  );
2490
2547
  }
2491
2548
  if (abortPromise) racers.push(abortPromise);
2492
- if (detachPromise) racers.push(detachPromise);
2549
+ racers.push(detachPromise);
2493
2550
  let raceWinner;
2494
2551
  try {
2495
2552
  raceWinner = await Promise.race(racers);
@@ -2522,25 +2579,35 @@ async function runWorkspaceCommand(args) {
2522
2579
  killChild("SIGKILL");
2523
2580
  }
2524
2581
  if (didDetach) {
2525
- detachSignalCleanup();
2582
+ exitPromise.catch(() => {
2583
+ });
2526
2584
  const pid = typeof proc.pid === "number" ? proc.pid : 0;
2527
2585
  const label = deriveLabel(args.command.join(" "));
2528
2586
  const pgid = pid;
2529
2587
  const registry2 = getProcessRegistry();
2530
2588
  registry2.add({ pid, pgid, command: args.command.join(" "), label });
2531
2589
  proc.on("close", (code) => {
2590
+ detachSignalCleanup();
2532
2591
  registry2.markExited(pid, code ?? 1);
2533
2592
  });
2593
+ const immediate = effectiveDetachMs === 0;
2594
+ const reason = immediate ? `command looks long-running; moved to background immediately (pid=${pid}, label=${label})` : `command detached to background after ${effectiveDetachMs}ms (pid=${pid}, label=${label})`;
2534
2595
  return {
2535
2596
  stdout: "",
2536
- stderr: `command detached to background after ${effectiveDetachMs}ms (pid=${pid}, label=${label})
2537
- Use listProcesses / processRegistry to inspect.`,
2597
+ stderr: `${reason}
2598
+ Use listProcesses to inspect or stop it.`,
2538
2599
  exitCode: 0,
2539
2600
  timedOut: false,
2540
2601
  detached: true,
2541
2602
  pid,
2542
2603
  label,
2543
- content: JSON.stringify({ detached: true, pid, label, status: "running" })
2604
+ content: JSON.stringify({
2605
+ detached: true,
2606
+ pid,
2607
+ label,
2608
+ status: "running",
2609
+ ...immediate ? { reason: "long-running-command" } : {}
2610
+ })
2544
2611
  };
2545
2612
  }
2546
2613
  const [stdout, rawStderr] = await Promise.all([
@@ -2856,7 +2923,7 @@ async function listWorkspaceEntries(args) {
2856
2923
  async function listFilesTool(args) {
2857
2924
  const parsed = parseWorkspaceToolArguments(args.call.arguments);
2858
2925
  const warnings = [];
2859
- const requestedPath = readWorkspacePathAlias(parsed) ?? ".";
2926
+ const requestedPath = pickFirstAlias(parsed, PATH_FIELD_ALIASES) ?? ".";
2860
2927
  const maxDepth = readWorkspaceMaxDepth(parsed, warnings);
2861
2928
  const maxResults = readWorkspaceMaxResults(parsed, warnings);
2862
2929
  const entryType = readWorkspaceEntryType(parsed, warnings);
@@ -2897,7 +2964,7 @@ async function searchFilesTool(args) {
2897
2964
  const contextLines = readWorkspaceContextLines(parsed, warnings);
2898
2965
  const literal = parsed.literal === true;
2899
2966
  const caseSensitive = parsed.caseSensitive === false ? false : true;
2900
- const requestedPath = readWorkspacePathAlias(parsed) ?? ".";
2967
+ const requestedPath = pickFirstAlias(parsed, PATH_FIELD_ALIASES) ?? ".";
2901
2968
  const includeIgnored = parsed.includeIgnored === true;
2902
2969
  const searchPath = await resolveLocalWorkspaceToolPath({
2903
2970
  workspaceRoot: args.workspaceRoot,
@@ -3173,7 +3240,7 @@ async function globFilesTool(args) {
3173
3240
  const pattern = requireWorkspaceGlobPattern(parsed);
3174
3241
  const exclude = readWorkspaceExcludeGlobs(parsed);
3175
3242
  const maxResults = readWorkspaceMaxResults(parsed, warnings);
3176
- const requestedPath = readWorkspacePathAlias(parsed) ?? ".";
3243
+ const requestedPath = pickFirstAlias(parsed, PATH_FIELD_ALIASES) ?? ".";
3177
3244
  const includeIgnored = parsed.includeIgnored === true;
3178
3245
  const searchPath = await resolveLocalWorkspaceToolPath({
3179
3246
  workspaceRoot: args.workspaceRoot,
@@ -3372,7 +3439,11 @@ async function execShellTool(args) {
3372
3439
  outputLimit: args.commandOutputLimit,
3373
3440
  commandPrefix: args.commandPrefix,
3374
3441
  abortSignal: args.abortSignal,
3375
- detachMs: args.detachMs
3442
+ // Commands that clearly never exit (long sleeps, tail -f, watch, dev
3443
+ // servers, infinite loops) are promoted to background immediately so the
3444
+ // turn — and the user's conversation — keeps going. Everything else keeps
3445
+ // the caller/env detach grace window.
3446
+ detachMs: isImmediateDetachShellCommand({ command }) ? 0 : args.detachMs
3376
3447
  });
3377
3448
  const activity = extractActivity(parsed);
3378
3449
  return {
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  ANTIGRAVITY_CLOUD_CODE_BASE_URL,
3
3
  isAntigravityOAuthAgent
4
- } from "./chunk-OIMX7MM4.js";
4
+ } from "./chunk-ISYE6GZB.js";
5
5
  import {
6
6
  clipMultilineText,
7
7
  fetchAndSerializeTable,
8
8
  waitForAbortableDelay
9
- } from "./chunk-R5AOLZZV.js";
9
+ } from "./chunk-VE6XMVKG.js";
10
10
  import {
11
11
  createDrainExhaustedResponse,
12
12
  isCoreDrainingBody,
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-RQSOAMPJ.js";
17
17
  import {
18
18
  slateToSimplifiedMarkdown
19
- } from "./chunk-BOJVWKNA.js";
19
+ } from "./chunk-U7LEGLEB.js";
20
20
  import {
21
21
  extractCategorizedMentions
22
22
  } from "./chunk-VP4WJWKW.js";
@@ -26,17 +26,17 @@ import {
26
26
  import {
27
27
  fetchAndCacheMessages,
28
28
  shouldUseServerProxy
29
- } from "./chunk-TYRTLSGX.js";
29
+ } from "./chunk-YNHQIXX5.js";
30
30
  import {
31
31
  fetchServerSyncedCredential
32
- } from "./chunk-IMZ7AFIJ.js";
32
+ } from "./chunk-OQMPU2ML.js";
33
33
  import {
34
34
  buildCurrentTimeBlock,
35
35
  buildIdentityBlock,
36
36
  buildRuntimeGuidanceBlocks,
37
37
  requiresBareImageUrl,
38
38
  toBareImageUrlMessages
39
- } from "./chunk-UW3WOIWJ.js";
39
+ } from "./chunk-RKM3K52F.js";
40
40
  import {
41
41
  buildProviderAuthHeaders,
42
42
  convertMessagesToResponsesInput,
@@ -44,13 +44,13 @@ import {
44
44
  preserveAgentStateFields,
45
45
  resolvePlatformChatCompletionsEndpoint,
46
46
  resolvePlatformResponsesEndpoint
47
- } from "./chunk-KTFJUPDW.js";
47
+ } from "./chunk-HRQCKQA5.js";
48
48
  import {
49
49
  canonicalizeToolNames
50
50
  } from "./chunk-B4KT7RN2.js";
51
51
  import {
52
52
  estimateTokenCount
53
- } from "./chunk-3B2LFO6R.js";
53
+ } from "./chunk-4QQFLN5C.js";
54
54
  import {
55
55
  clampReasoningEffort,
56
56
  getModelConfig,
@@ -76,10 +76,10 @@ import {
76
76
  } from "./chunk-524BDL33.js";
77
77
  import {
78
78
  createSpaceKey
79
- } from "./chunk-3FCSMQAC.js";
79
+ } from "./chunk-XVP3C2KY.js";
80
80
  import {
81
81
  read
82
- } from "./chunk-A5V7UEZJ.js";
82
+ } from "./chunk-SFXYKGK2.js";
83
83
  import {
84
84
  asNonEmptyStringArray
85
85
  } from "./chunk-I42VC5KR.js";
@@ -760,20 +760,22 @@ var CONTEXT_USAGE_INSTRUCTIONS = `\u53C2\u8003\u8D44\u6599\u4F7F\u7528\u8BF4\u66
760
760
  var AGENT_ORCHESTRATION_RUN_INSTRUCTIONS = `--- \u591A Agent \u7F16\u6392\uFF08\u540E\u53F0 Run\uFF09 ---
761
761
  \u4F60\u53EF\u7528 startAgentRun \u540E\u53F0\u542F\u52A8\u5B50 Agent\uFF08fork+exec\uFF0C\u8FD4\u56DE runId\uFF09\uFF0C\u7528 controlAgentRun \u89C2\u5BDF/\u505C\u6B62\uFF08wait+signal+proc\uFF09\u3002\u6838\u5FC3\u7EAA\u5F8B\uFF08\u53CD\u9762\u6559\u6750\uFF1A\u5B50\u4EE3\u7406\u5D29\u6E83/\u6302\u8D77\u800C\u7F16\u6392\u5668\u6BEB\u65E0\u5BDF\u89C9\uFF09\uFF1A
762
762
  1. \u5148\u53D1\u73B0\u518D\u6D3E\u53D1\u3002\u8C03\u7528 listAgents \u8BFB\u53D6\u5B89\u5168\u6458\u8981\u3002\u9009\u4EBA\u6309\u4F18\u5148\u7EA7\uFF1A\u7279\u5B9A\u5DE5\u5177\u9700\u6C42 \u2192 \u4EFB\u52A1\u6863\u4E0E\u6210\u672C/\u80FD\u529B\u5339\u914D \u2192 \u80DC\u4EFB\u8005\u4E2D\u7684 isFavorite \u2192 modelAbility / inputPrice/outputPrice\u3002
763
+ - \u6D3E\u53D1\u524D\u5148\u5224\u65AD"\u8BE5\u4E0D\u8BE5\u6D3E\u53D1"\uFF1A\u7236 agent \u8F6E\u8BE2 + \u4E0A\u4E0B\u6587\u4F20\u9012\u672C\u8EAB\u6709\u6210\u672C\uFF0C\u5B50\u4EE3\u7406\u5355\u4EF7\u4F4E\u4E0D\u7B49\u4E8E\u603B\u6210\u672C\u66F4\u4F4E\u3002\u5C0F\u4EFB\u52A1\u76F4\u63A5\u505A\uFF1B\u53EA\u6709\u4EFB\u52A1\u5927\u5230\u5355 agent \u88C5\u4E0D\u4E0B\u3001\u6216\u53EF\u5E76\u884C\u7701\u65F6\u95F4\uFF0C\u7F16\u6392\u624D\u5212\u7B97\u3002
763
764
  - \u5148\u4F30\u4EFB\u52A1\u6863\uFF1A\u5FAE/\u7B80\u5355\uFF08\u22642 \u6B65\u3001\u6587\u6848\u3001\u5355\u70B9 polish\uFF09\uFF5C\u4E2D\uFF08\u591A\u6587\u4EF6\u8BFB\u6539\u9A8C\uFF09\uFF5C\u9AD8\uFF08\u67B6\u6784\u3001\u6DF1 review\u3001\u9AD8\u98CE\u9669\u63A8\u7406\uFF09\u3002
764
765
  - \u9AD8\u4EF7/\u9876\u6863\u6A21\u578B\uFF08Opus\u3001GPT-5.6 Sol\u3001\u540C\u7EA7 Pro/K \u9876\u6863\u7B49\uFF09\u9ED8\u8BA4\u4E0D\u63A5\u7B80\u5355\u6D3B\uFF1B\u7B80\u5355\u6D3B\u4F18\u5148 Flash/Luna/\u4F4E\u4EF7\u6216\u6536\u85CF\u91CC\u7684\u8F7B\u91CF\u5019\u9009\u3002
765
766
  - \u7981\u6B62\u51ED\u540D\u5B57\u7F16\u9020\u7EC6\u80FD\u529B\uFF0C\u4F46\u5141\u8BB8\u7528\u4EF7\u683C\u3001modelAbility \u53CA\u660E\u663E\u9876\u6863\u65CF\u7CFB\u505A\u7C97\u6863\u4F4D\u5339\u914D\uFF0C\u907F\u514D\u5927\u6A21\u578B\u5E72\u6742\u6D3B\u3002\u4E0D\u8981\u67E5\u6307\u6D3E\u8868\uFF0C\u4E0D\u8981\u6C42 recommendedFor\u3002
766
767
  2. coding \u662F\u9ED8\u8BA4\u80FD\u529B\u3002tools \u53EA\u7528\u4E8E\u6D4F\u89C8\u5668\u3001\u56FE\u7247\u3001\u8868\u683C\u3001\u90AE\u4EF6\u3001\u6570\u636E\u5E93\u7B49\u7279\u5B9A\u5DE5\u5177\u4EFB\u52A1\uFF1B\u4E0D\u8981\u56E0\u4E3A coding agent \u7684 tools \u6458\u8981\u4E3A\u7A7A\u5C31\u6DD8\u6C70\u5B83\u3002
767
768
  3. listAgents \u8FD4\u56DE\u7684 id\u3001publicKey\u3001handle \u53EA\u662F\u5019\u9009\u6807\u8BC6\u3002\u9009\u4E2D\u540E\u4F18\u5148\u8C03\u7528 readAgent \u89E3\u6790\u53EF\u8FD0\u884C\u7684 agentKey\uFF0C\u518D\u628A\u8BE5 agentKey \u4F20\u7ED9 startAgentRun\uFF1B\u4E0D\u8981\u51ED\u5C55\u793A\u540D\u79F0\u6216 id \u731C key\uFF0C\u4E5F\u4E0D\u8981\u7D22\u53D6 prompt\u3001\u5BC6\u94A5\u6216\u6570\u636E\u5E93 key \u6765\u9009\u4EBA\u3002\u6CA1\u6709 readAgent \u65F6\u53EA\u80FD\u4F7F\u7528\u5DF2\u6709\u4E0A\u4E0B\u6587\u4E2D\u660E\u786E\u7684 agentKey\u3002
768
- 4. \u6D3E\u53D1\u540E\u5FC5\u987B\u8F6E\u8BE2\u3002startAgentRun \u62FF\u5230 runId \u540E\uFF0C\u7528 controlAgentRun(action:"status", runId, tailLines:30) \u8F6E\u8BE2\uFF08\u5EFA\u8BAE 5\u201310s \u4E00\u6B21\uFF09\uFF0C\u4E0D\u8981\u53EA\u9760\u804A\u5929\u590D\u8FF0\u7ED3\u679C\u3002\u4E0D\u8F6E\u8BE2 = \u6CA1\u7F16\u6392\u3002
769
- 5. \u8BFB\u65E5\u5FD7\u786E\u8BA4\u8FDB\u5C55\u3002tailLines>0 \u8BFB\u5B9E\u9645\u8F93\u51FA/\u5DE5\u5177\u8C03\u7528\uFF0C\u4E0D\u53EA\u770B status=running\u2014\u2014\u540E\u53F0\u76D1\u89C6\u5668\u53EF\u80FD\u7A7A\u8F6C\u3002
770
- 6. stop \u524D\u5148\u770B\u65E5\u5FD7\u3002\u7528 status \u5224\u65AD\u662F\u771F\u5361\u6B7B\u8FD8\u662F\u6B63\u5E38\u8DD1\uFF0C\u786E\u8BA4\u9700\u8981\u53EB\u505C\u518D controlAgentRun(action:"stop", runId)\uFF1B\u7528 list/status \u786E\u8BA4 run \u771F\u5B9E\u5B58\u5728\u4E14\u975E\u7EC8\u6001\uFF0C\u522B\u5047\u8BBE"\u6D3E\u53D1\u4E86\u5C31\u5728\u8DD1"\u3002
769
+ 4. \u6D3E\u53D1\u540E\u8F7B\u8F6E\u8BE2\u3002startAgentRun \u62FF\u5230 runId \u540E\uFF0C\u7528 controlAgentRun(action:"status", runId, tailLines:0) \u8F6E\u8BE2\u2014\u2014tailLines:0 \u53EA\u8FD4\u56DE\u72B6\u6001\u6458\u8981\uFF08\u4E0D\u62C9\u65E5\u5FD7\uFF09\uFF0C\u7701 token\u3002\u6BCF\u6B21\u8F6E\u8BE2 = \u7236 agent \u591A\u4E00\u4E2A turn = \u5168\u524D\u7F00\u91CD\u65B0\u8BA1\u4EF7\uFF0C\u6240\u4EE5\u95F4\u9694\u4E0D\u8981\u592A\u5BC6\uFF08\u5EFA\u8BAE 10\u201315s\uFF09\uFF0C\u4E0D\u8981 5s \u4E00\u6B21\u3002\u591A\u4E2A\u72EC\u7ACB\u5B50\u4EFB\u52A1\u4F18\u5148\u5E76\u884C\u6D3E\u53D1\uFF08\u4E00\u6B21 startAgentRun \u591A\u4E2A\uFF09\uFF0C\u7236 agent 1 \u4E2A turn \u6D3E\u53D1 + 1 \u4E2A turn \u6536\u96C6\u7ED3\u679C\uFF0C\u800C\u975E\u4E32\u884C\u7B49\u5F85 N \u4E2A turn\u3002
770
+ 5. \u5F02\u5E38\u624D\u62C9\u65E5\u5FD7\u3002tailLines:0 \u663E\u793A running \u4E14\u8FDB\u5EA6\u6B63\u5E38 \u2192 \u7EE7\u7EED\u8F7B\u8F6E\u8BE2\uFF1B\u53EA\u6709 status=failed/\u8D85\u65F6/\u7591\u4F3C\u5361\u6B7B\u624D controlAgentRun(action:"status", runId, tailLines:30) \u62C9\u65E5\u5FD7\u8BCA\u65AD\u3002\u6B63\u5E38\u5B8C\u6210\u7684\u5B50 agent \u770B\u72B6\u6001\u6458\u8981\u5373\u53EF\uFF0C\u4E0D\u5FC5\u62C9\u5B8C\u6574\u65E5\u5FD7\u3002
771
+ 6. stop \u524D\u5148\u770B\u65E5\u5FD7\u3002\u7528 status(tailLines:30) \u5224\u65AD\u662F\u771F\u5361\u6B7B\u8FD8\u662F\u6B63\u5E38\u8DD1\uFF0C\u786E\u8BA4\u9700\u8981\u53EB\u505C\u518D controlAgentRun(action:"stop", runId)\uFF1B\u7528 list/status \u786E\u8BA4 run \u771F\u5B9E\u5B58\u5728\u4E14\u975E\u7EC8\u6001\uFF0C\u522B\u5047\u8BBE"\u6D3E\u53D1\u4E86\u5C31\u5728\u8DD1"\u3002
771
772
  \u5DE5\u5177\u9009\u62E9\uFF1A\u5B50\u4EFB\u52A1 <100s \u4E14\u8981\u7ACB\u5373\u62FF\u7ED3\u679C \u2192 callAgent\uFF08\u540C\u6B65\uFF09\uFF1B\u957F\u4EFB\u52A1 / \u5E76\u884C / \u9700\u8981\u89C2\u5BDF\u6216\u53EB\u505C \u2192 startAgentRun\uFF08\u672C\u6BB5\uFF09\u3002`;
772
773
  var AGENT_COLLABORATION_INSTRUCTIONS = `--- \u591A Agent \u534F\u4F5C\uFF08\u8BA1\u5212 \u2192 \u6D3E\u53D1 \u2192 \u5BA1\u67E5\uFF09 ---
773
774
  \u7528\u5B50\u4EE3\u7406\u5B8C\u6210\u4E2D\u5927\u578B\u4EFB\u52A1\u65F6\uFF0C\u6309\u4E09\u6BB5\u7EAA\u5F8B\u6267\u884C\uFF1A
774
775
  1. \u8BA1\u5212\u5148\u884C\uFF1A\u52A8\u624B\u524D\u5148\u60F3\u6E05\u695A\u76EE\u6807\u3001\u8FB9\u754C\u3001\u9A8C\u8BC1\u65B9\u5F0F\u548C\u505C\u6B62\u6761\u4EF6\uFF1B\u9884\u8BA1 3 \u6B65\u4EE5\u4E0A\uFF08\u8BFB\u6539\u9A8C\u3001\u591A\u6587\u4EF6\u3001\u4EFB\u4F55\u6D3E\u53D1\uFF09\u5148\u5B9A\u8BA1\u5212\uFF0C\u518D\u51B3\u5B9A\u81EA\u5DF1\u505A\u5B8C\u8FD8\u662F\u6D3E\u53D1\u3002
776
+ - \u6D3E\u53D1\u524D\u505A\u6210\u672C\u6743\u8861\uFF1A\u7236 agent \u8F6E\u8BE2\u3001\u4E0A\u4E0B\u6587\u4F20\u9012\u3001\u534F\u8C03\u5F00\u9500\u672C\u8EAB\u8981\u6D88\u8017 token\uFF1B\u5B50\u4EE3\u7406\u66F4\u4FBF\u5B9C\u4E0D\u7B49\u4E8E\u7F16\u6392\u4E00\u5B9A\u66F4\u7701\u3002\u7B80\u5355/\u4E2D\u7B49\u4EFB\u52A1\u7528\u5F3A\u6A21\u578B\u76F4\u63A5\u505A\uFF0C\u5F80\u5F80\u6BD4"\u5F3A\u6A21\u578B\u6307\u6325 + \u5F31\u6A21\u578B\u5B9E\u73B0"\u66F4\u7701\uFF08\u5B9E\u6D4B\uFF1A\u6307\u6325+\u5B9E\u73B0\u7684\u53CC\u5C42 credits \u5E38\u8D85\u8FC7\u5355\u5C42\u5F3A\u6A21\u578B\u76F4\u505A\uFF09\u3002\u53EA\u6709\u4EFB\u52A1\u8DB3\u591F\u5927\uFF08\u591A\u6587\u4EF6\u6DF1\u6539\u3001\u53EF\u5E76\u884C\u3001\u5355 agent \u4E0A\u4E0B\u6587\u88C5\u4E0D\u4E0B\uFF09\u65F6\uFF0C\u7F16\u6392\u7684\u62C6\u5206\u6536\u76CA\u624D\u660E\u663E\u8D85\u8FC7\u534F\u8C03\u6210\u672C\u3002
775
777
  2. \u6D3E\u53D1\u539F\u5219\uFF1A\u5B50\u4EFB\u52A1\u81EA\u5305\u542B\u3001\u8FB9\u754C\u6E05\u6670\u3001\u80FD\u5E76\u884C\u5219\u5E76\u884C\uFF1B\u7ED9\u6267\u884C\u8005\u5199\u6E05\u4EFB\u52A1\u3001\u9A8C\u6536\u548C\u7981\u533A\uFF0C\u4E0D\u4F20\u65E0\u5173\u5386\u53F2\u3002\u6D3E\u53D1\u540E\u8F6E\u8BE2\u7ED3\u679C\uFF0C\u4E0D\u5047\u8BBE\u6210\u529F\u3002
776
- 3. \u72EC\u7ACB\u5BA1\u67E5\uFF1A\u91CD\u8981\u4EA7\u51FA\uFF08\u4EE3\u7801\u3001\u8FC1\u79FB\u3001\u6570\u636E\u53D8\u66F4\uFF09\u4EA4\u7ED9\u975E\u4F5C\u8005\uFF08\u6700\u597D\u662F\u4E0D\u540C\u6A21\u578B\u7684\uFF09\u72EC\u7ACB review\uFF1Breview \u53EA\u770B diff/\u8BC1\u636E\uFF0C\u4EA7\u51FA finding \u6216 Clean review\uFF0C\u518D\u51B3\u5B9A\u8FD4\u5DE5\u6216\u6536\u5C3E\u3002
778
+ 3. \u72EC\u7ACB\u5BA1\u67E5\uFF08commit \u524D\u786C\u95E8\uFF09\uFF1A\u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E**\u5176\u4ED6 agent**\uFF08\u4E0D\u540C\u6A21\u578B\u5BB6\u65CF\u4F18\u5148\uFF09review\u3002reviewer \u4E0D\u53EF\u662F\u81EA\u5DF1\u3002\u65E0 review \u4E0D commit\u2014\u2014\u8FD9\u662F\u786C\u95E8\uFF0C\u4E0D\u662F\u5EFA\u8BAE\u3002\u8BE6\u7EC6\u6D41\u7A0B\uFF08\u591A\u8F6E\u65E0\u4E0A\u4E0B\u6587 review\u3001\u901A\u8FC7\u6761\u4EF6\u3001ephemeral \u6D3E\u53D1\u3001\u9003\u9038\u673A\u5236\uFF09\u89C1 nolo-commit skill \u7684\u63D0\u4EA4\u524D\u81EA\u68C0\u7B2C 0 \u9879\u3002
777
779
  \u6700\u5C0F\u5B9E\u73B0\uFF1A\u80FD\u5220\u89E3\u51B3\u5C31\u4E0D\u52A0\uFF0C\u80FD\u590D\u7528\u5C31\u4E0D\u65B0\u5EFA\uFF1B\u65B0\u62BD\u8C61\u524D\u5148\u641C\u5DF2\u6709\u5B9E\u73B0\u3002\u4E0D\u8981\u4E3A\u4E86\u663E\u5F97\u5FD9\u788C\u800C\u6D3E\u53D1\u6216\u8FC7\u5EA6\u8BBE\u8BA1\u3002`;
778
780
  var MENU_USAGE_INSTRUCTIONS = `--- \u4EA4\u4E92\u8BF4\u660E ---
779
781
  \u6240\u6709\u7528\u6237\u8F93\u5165\u5747\u4E3A\u7EAF\u6587\u672C\u6D88\u606F\uFF0C\u76F4\u63A5\u7406\u89E3\u5373\u53EF\uFF0C\u4E0D\u8981\u5728\u56DE\u590D\u4E2D\u63D0\u53CA\u6309\u94AE\u3001\u83DC\u5355\u3001\u754C\u9762\u7B49 UI \u5143\u7D20\u3002
@@ -785,10 +787,12 @@ var MENU_USAGE_INSTRUCTIONS = `--- \u4EA4\u4E92\u8BF4\u660E ---
785
787
  3\uFF09\u65B0\u4F1A\u8BDD\u5F00\u5934\uFF0C\u6839\u636E\u7528\u6237\u753B\u50CF\u7ED9\u51FA\u82E5\u5E72"\u63A5\u4E0B\u6765\u53EF\u4EE5\u5C1D\u8BD5\u7684\u4E8B\u60C5"\u4F5C\u4E3A\u529F\u80FD\u5BFC\u822A\u6216\u4F7F\u7528\u5F15\u5BFC\u3002
786
788
 
787
789
  ## \u8C03\u7528 ui_ask_choice \u7684\u89C4\u8303
790
+ - \u8C03\u7528\u524D\u5FC5\u987B\u5148\u5728\u666E\u901A\u56DE\u590D\u6587\u672C\u91CC\u5199\u6E05\u80CC\u666F\u3001\u7406\u7531\u6216\u6743\u8861\uFF08\u5148\u89E3\u91CA\uFF0C\u518D\u8C03\u7528\u5DE5\u5177\uFF09\uFF1B
788
791
  - \u63D0\u4F9B 2\uFF5E5 \u4E2A\u4E92\u65A5\u9009\u9879\uFF1B\u5982\u679C\u4F60\u6709\u63A8\u8350\u65B9\u5411\uFF0C\u628A\u5B83\u653E\u5728 choices \u7684\u7B2C\u4E00\u4F4D\uFF1B
789
- - \u6BCF\u4E2A\u9009\u9879\u7684 label \u5199\u7B80\u77ED\u6309\u94AE\u6587\u6848\uFF0CuserMessage \u5199\u6210\u5B8C\u6574\u7684\u4E0B\u4E00\u53E5\u8BDD\uFF0C\u65B9\u4FBF\u7528\u6237\u70B9\u51FB\u540E\u4E0A\u4E0B\u6587\u8FDE\u8D2F\uFF1B
792
+ - \u9009\u9879\u53EA\u627F\u8F7D\u9002\u5EA6\u4FE1\u606F\uFF1Alabel \u4E3A\u7B80\u77ED\u6309\u94AE\u6587\u6848\uFF1Bdetail \u4E3A\u53EF\u9009\u3001\u81F3\u591A\u4E00\u53E5\u8BDD\u7684\u7B80\u77ED\u8865\u5145\uFF1B\u7981\u6B62\u628A\u957F\u6BB5\u89E3\u91CA\u6216\u6743\u8861\u585E\u8FDB choices/detail\uFF1B
793
+ - \u6BCF\u4E2A\u9009\u9879\u7684 userMessage \u5199\u6210\u5B8C\u6574\u7684\u4E0B\u4E00\u53E5\u8BDD\uFF0C\u65B9\u4FBF\u7528\u6237\u70B9\u51FB\u540E\u4E0A\u4E0B\u6587\u8FDE\u8D2F\uFF1B
790
794
  - \u4E0D\u8981\u5728\u9009\u9879\u5217\u8868\u91CC\u653E"\u5176\u4ED6/Other"\u2014\u2014\u5BA2\u6237\u7AEF\u4F1A\u81EA\u52A8\u4E3A\u7528\u6237\u8FFD\u52A0\u81EA\u7531\u8F93\u5165\u7684\u9000\u8DEF\uFF1B
791
- - \u628A\u8981\u95EE\u7528\u6237\u7684\u95EE\u9898\u5199\u5728 question \u5B57\u6BB5\u91CC\uFF0C\u4E0D\u8981\u5728\u540C\u4E00\u8F6E assistant \u666E\u901A\u6587\u672C\u91CC\u91CD\u590D\u8FD9\u53E5\u8BDD\uFF1B
795
+ - \u628A\u8981\u95EE\u7528\u6237\u7684\u95EE\u9898\u5199\u5728 question \u5B57\u6BB5\u91CC\uFF0C\u4E0D\u8981\u5728\u540C\u4E00\u8F6E assistant \u666E\u901A\u6587\u672C\u91CC\u91CD\u590D\u8FD9\u53E5\u8BDD\uFF08\u89E3\u91CA\u80CC\u666F\u4E0E\u6743\u8861\u2260\u91CD\u590D\u95EE\u9898\u53E5\uFF09\uFF1B
792
796
  - \u5982\u679C\u7528\u6237\u7684\u76EE\u6807\u5DF2\u7ECF\u975E\u5E38\u5177\u4F53\u6E05\u6670\uFF0C\u5373\u4FBF\u4E0A\u8FF0\u6761\u4EF6\u770B\u4F3C\u6EE1\u8DB3\uFF0C\u4E5F\u4F18\u5148\u76F4\u63A5\u56DE\u7B54\uFF0C\u4E0D\u8981\u5F3A\u884C\u5F39\u9009\u62E9\u83DC\u5355\u3002`;
793
797
  var WEBPAGE_ACCESS_INSTRUCTIONS = `--- \u7F51\u9875\u8BBF\u95EE\u80FD\u529B (Web Access) ---
794
798
  \u83B7\u53D6\u5916\u90E8\u4FE1\u606F\u65F6\u7531\u7B80\u5165\u7E41\uFF1A
@@ -2,7 +2,7 @@ import {
2
2
  buildCurrentTimeBlock,
3
3
  buildIdentityBlock,
4
4
  buildRuntimeGuidanceBlocks
5
- } from "./chunk-UW3WOIWJ.js";
5
+ } from "./chunk-RKM3K52F.js";
6
6
  import {
7
7
  canonicalizeToolNames
8
8
  } from "./chunk-B4KT7RN2.js";
@@ -12,7 +12,7 @@ import {
12
12
  planCompression,
13
13
  planContextUsage,
14
14
  serializeMessageContent
15
- } from "./chunk-3B2LFO6R.js";
15
+ } from "./chunk-4QQFLN5C.js";
16
16
  import {
17
17
  clipCompactText
18
18
  } from "./chunk-5MMAK75Q.js";
@@ -1496,6 +1496,7 @@ async function runLocalAgentTurn(input) {
1496
1496
  // 透出最后一轮 provider 调用的 finish_reason;多轮工具循环里只有最后一轮收尾状态有意义。
1497
1497
  ...result.finish_reason ? { finish_reason: result.finish_reason } : {},
1498
1498
  dialogId: saved.dialogId,
1499
+ title: saved.title,
1499
1500
  turnMessages
1500
1501
  };
1501
1502
  }
@@ -86,7 +86,7 @@ function resolveDeleteServerCandidates(input, envOrPreferred, preferred) {
86
86
  );
87
87
  }
88
88
  function resolveAuthTokenFromEnv(env, extraEnvKeys = []) {
89
- for (const key of ["AUTH_TOKEN", "AUTH", ...extraEnvKeys]) {
89
+ for (const key of ["AUTH_TOKEN", "AUTH", "NOLO_MACHINE_API_KEY", ...extraEnvKeys]) {
90
90
  const value = env[key];
91
91
  if (typeof value === "string" && value.trim()) return value;
92
92
  }