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.
- package/{_executeModel-TURRLTZ2.js → _executeModel-QAUS6B7J.js} +24 -24
- package/{action-N3KXFO5V.js → action-GUOZYYGN.js} +4 -4
- package/{addContentAction-4Z762DMR.js → addContentAction-QDGHGUBH.js} +3 -3
- package/{addDialogAgentAction-FALLEKPR.js → addDialogAgentAction-Z4YCYZIV.js} +2 -2
- package/{agentDeleteCommand-AZDVM4HQ.js → agentDeleteCommand-QDO62EZA.js} +20 -20
- package/{agentEmailCommands-M4AHOEZ3.js → agentEmailCommands-UZ5BKX3P.js} +38 -38
- package/{agentGrantCommands-B4MB23VQ.js → agentGrantCommands-JNDE4RWR.js} +2 -2
- package/{agentListCommands-OJLOXSKL.js → agentListCommands-ZC33UDWT.js} +22 -22
- package/{agentMachineCommands-NPMM4Z53.js → agentMachineCommands-RZGZEZRL.js} +20 -20
- package/{agentPullCommand-KRBRIFIY.js → agentPullCommand-6HWUT3SW.js} +2 -2
- package/{agentRecordCommands-RVUH7XLZ.js → agentRecordCommands-DGDXE2VH.js} +33 -33
- package/{agentRunCommand-F6W2WKKZ.js → agentRunCommand-SRZWFOPH.js} +35 -35
- package/{agentRunControl-IX4F5W2C.js → agentRunControl-6ADXVYMR.js} +2 -2
- package/{agentRuntimeLocal-DSUBT77I.js → agentRuntimeLocal-4YCF6IRF.js} +11 -11
- package/{agentSlice-PCEL26Z7.js → agentSlice-IVE735EV.js} +3 -3
- package/appDeleteCommands-7I26L64I.js +124 -0
- package/appDeployCommands-TZLZNTJN.js +163 -0
- package/appDeployStatusCommands-OPPTLHRW.js +144 -0
- package/appGetCommands-N2S4HYKY.js +119 -0
- package/appListCommands-OBTPPKUM.js +122 -0
- package/{authCommand-66ME4KZX.js → authCommand-YFTR3347.js} +5 -5
- package/{authCommands-GH5T6RYV.js → authCommands-YXGOXNBZ.js} +3 -3
- package/{chunk-3B2LFO6R.js → browser-image-compression-MFDTD7K6.js} +4 -518
- package/{chunk-4UUJFFMK.js → chunk-472E5RMQ.js} +1 -1
- package/chunk-4QQFLN5C.js +552 -0
- package/{chunk-33K5FKRL.js → chunk-5VMYGIIL.js} +110 -39
- package/{chunk-LNSRTNH7.js → chunk-6565R2TI.js} +20 -16
- package/{chunk-VQFY3VXW.js → chunk-6MHDWKOT.js} +3 -2
- package/{chunk-5NBHQD4D.js → chunk-A7GB5UGH.js} +1 -1
- package/{chunk-NZFWHBW5.js → chunk-AWDOJBHW.js} +487 -441
- package/{chunk-MYE5X27Y.js → chunk-BFRVXJJJ.js} +43 -16
- package/{chunk-PYAJ6ZSK.js → chunk-G2MKOQCB.js} +1 -1
- package/chunk-GFUIQ4RY.js +136 -0
- package/{chunk-KTFJUPDW.js → chunk-HRQCKQA5.js} +31 -31
- package/{chunk-TQCONXQ3.js → chunk-IOQ7IBPU.js} +1 -1
- package/{chunk-OIMX7MM4.js → chunk-ISYE6GZB.js} +1 -1
- package/{chunk-RZALKBP4.js → chunk-IZ2QRVEU.js} +2 -2
- package/{chunk-XIDYAII4.js → chunk-JBKVPAYK.js} +7 -140
- package/{chunk-V6VXDXGY.js → chunk-JS33TCQ3.js} +2 -2
- package/{chunk-5R73BS7Y.js → chunk-K53477EY.js} +5 -5
- package/{chunk-7JJCGV7N.js → chunk-K6EUAOW3.js} +1 -1
- package/{chunk-OHEKYYJF.js → chunk-KMQPSTMJ.js} +6 -6
- package/{chunk-3WGLLTK4.js → chunk-LSFAWXKC.js} +100 -3
- package/{chunk-4ON5AV72.js → chunk-MYMMNKYL.js} +1 -1
- package/{chunk-BHK5ZAW7.js → chunk-N5424GSW.js} +1 -1
- package/chunk-NTC6I2FN.js +107 -0
- package/{chunk-7LAIOHOL.js → chunk-O53CP2QR.js} +3 -3
- package/{chunk-TLNEQI2R.js → chunk-OKSYPTDZ.js} +9 -9
- package/{chunk-IMZ7AFIJ.js → chunk-OQMPU2ML.js} +4 -4
- package/{chunk-IYGQF62W.js → chunk-P4MJQWWF.js} +3 -3
- package/{chunk-UW3WOIWJ.js → chunk-RKM3K52F.js} +1 -1
- package/{chunk-A5V7UEZJ.js → chunk-SFXYKGK2.js} +3 -3
- package/{chunk-S5UACFUP.js → chunk-TTGAVETO.js} +10 -2
- package/{chunk-BOJVWKNA.js → chunk-U7LEGLEB.js} +1 -1
- package/{chunk-E6KIDMTW.js → chunk-UXKQQ2MR.js} +9 -9
- package/{chunk-R5AOLZZV.js → chunk-VE6XMVKG.js} +203 -45
- package/{chunk-NJVPXLRY.js → chunk-VPTJB4HM.js} +1 -1
- package/{chunk-PB2DHBEQ.js → chunk-WA6KZL5V.js} +25 -6
- package/{chunk-T3X232L6.js → chunk-WNLPAOIT.js} +1 -1
- package/{chunk-NFPO7274.js → chunk-WRN5EQT7.js} +1 -1
- package/{chunk-4F4FJPFM.js → chunk-XGQZFBO5.js} +90 -209
- package/{chunk-3FCSMQAC.js → chunk-XVP3C2KY.js} +1 -1
- package/{chunk-TYRTLSGX.js → chunk-YNHQIXX5.js} +833 -5746
- package/{chunk-7TN6V43T.js → chunk-Z24FGIU2.js} +2 -2
- package/{cliEnvHelpers-VYC2OPTB.js → cliEnvHelpers-ZXNMX7VV.js} +1 -1
- package/{createAgentAutomationAction-VLNDOHSP.js → createAgentAutomationAction-TS6NNZ4X.js} +9 -9
- package/{createDialogAction-6WYTS62Z.js → createDialogAction-5HVQ33EX.js} +10 -10
- package/{createPageAction-YKHOC3LW.js → createPageAction-4F3ZGQJD.js} +9 -9
- package/{dbSlice-7Q23HSWH.js → dbSlice-OP6UPXKA.js} +2 -2
- package/{dialogCommands-BQDGLVMO.js → dialogCommands-3GEPXHFB.js} +16 -16
- package/{dialogSlice-2A2JOFZW.js → dialogSlice-FAWUQDJW.js} +9 -9
- package/{docCreateCommands-K2MPMXYF.js → docCreateCommands-ZE3S6BCP.js} +22 -20
- package/{docDeleteCommands-NBAARB77.js → docDeleteCommands-TW6PGTRT.js} +21 -19
- package/{docReadCommands-S3MO5RPS.js → docReadCommands-LDXL3B6J.js} +20 -18
- package/{docStore-JJP5PUR7.js → docStore-2UHVWLTV.js} +10 -10
- package/{docUpdateCommands-EHEI7FCE.js → docUpdateCommands-GYD6XI5O.js} +21 -19
- package/{handleSendMessageAction-UAXTF73I.js → handleSendMessageAction-LJPUYNOH.js} +15 -11
- package/index.js +109 -78
- package/{machineCommands-BQ46IS5M.js → machineCommands-OKNDYS3M.js} +36 -36
- package/{machineWsRunDispatch-R33NXNNI.js → machineWsRunDispatch-ZX5AJ6FJ.js} +32 -32
- package/{memoryCommands-AFMES3LN.js → memoryCommands-EBMICQR6.js} +1 -1
- package/package.json +1 -1
- package/{read-SIWMJRHC.js → read-HXHAZBKH.js} +1 -1
- package/{readDocTool-TCYJY4PP.js → readDocTool-VPBDTO4G.js} +1 -1
- package/{readlineWorkspace-KBG4DKLX.js → readlineWorkspace-MB3ANKHM.js} +123 -103
- package/{removeDialogAgentAction-WKHZT6VJ.js → removeDialogAgentAction-HUFVN35S.js} +4 -4
- package/{runAgentClientLoop-MUV5YIRK.js → runAgentClientLoop-A75BUU6D.js} +19 -19
- package/{runtimeDoctorCommands-QNF3J3UV.js → runtimeDoctorCommands-THIHX2SY.js} +1 -1
- package/{setDialogExtraReferencesAction-GCI5QU6E.js → setDialogExtraReferencesAction-2VLGWQKG.js} +2 -2
- package/{setPrimaryDialogAgentAction-NRO57AS6.js → setPrimaryDialogAgentAction-VB4UV2CC.js} +4 -4
- package/{settingSlice-FTWZ5ZHT.js → settingSlice-7JYPQNAC.js} +3 -3
- package/{spaceCommands-4R63UST3.js → spaceCommands-O3KJNCON.js} +21 -21
- package/{spaceSlice-VTC3QXP3.js → spaceSlice-444MFUP6.js} +11 -9
- package/{streamAgentChatTurn-43N7BNV2.js → streamAgentChatTurn-DJAE7USZ.js} +42 -39
- package/{tableCommands-E4SQWDOX.js → tableCommands-3P7MJ3PF.js} +4 -4
- package/{tools-PX6PEJLE.js → tools-YB6LXSVN.js} +14 -14
- package/{tuiSummaryLlmCaller-2D65LKWM.js → tuiSummaryLlmCaller-QQL3JA5I.js} +3 -3
- package/{updateCommands-XZDOOYFH.js → updateCommands-XTW55TOT.js} +2 -2
- package/{updateDialogTitleAction-NPQZWAKG.js → updateDialogTitleAction-6HGFBM64.js} +9 -9
- 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-
|
|
7
|
+
} from "./chunk-WA6KZL5V.js";
|
|
8
8
|
import {
|
|
9
9
|
parseToolArgumentsJson
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
17
|
+
} from "./chunk-LSFAWXKC.js";
|
|
17
18
|
import {
|
|
18
19
|
requiresBareImageUrl,
|
|
19
20
|
toBareImageUrlMessages
|
|
20
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-RKM3K52F.js";
|
|
21
22
|
import {
|
|
22
23
|
buildProviderAuthHeaders,
|
|
23
24
|
buildProviderExecutionPlan,
|
|
24
25
|
toOpenAiCompatibleMessages
|
|
25
|
-
} from "./chunk-
|
|
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:
|
|
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
|
|
831
|
+
function resolveScannableShellInput(args) {
|
|
818
832
|
const combined = buildCombinedShellInput(args);
|
|
819
|
-
if (!combined.trim()) return
|
|
820
|
-
|
|
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
|
|
839
|
-
if (
|
|
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),
|
|
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
|
-
|
|
1725
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
2027
|
+
return oldText;
|
|
1972
2028
|
}
|
|
1973
2029
|
function requireWorkspaceNewText(args) {
|
|
1974
|
-
|
|
1975
|
-
|
|
2030
|
+
for (const key of NEW_TEXT_FIELD_ALIASES) {
|
|
2031
|
+
const val = args[key];
|
|
2032
|
+
if (typeof val === "string") return val;
|
|
1976
2033
|
}
|
|
1977
|
-
|
|
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 =
|
|
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 =
|
|
2537
|
+
const detachPromise = new Promise((r) => {
|
|
2481
2538
|
detachTimer = setTimeout(() => r(detachResult), effectiveDetachMs);
|
|
2482
|
-
})
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
2537
|
-
Use listProcesses
|
|
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({
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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-
|
|
4
|
+
} from "./chunk-ISYE6GZB.js";
|
|
5
5
|
import {
|
|
6
6
|
clipMultilineText,
|
|
7
7
|
fetchAndSerializeTable,
|
|
8
8
|
waitForAbortableDelay
|
|
9
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
29
|
+
} from "./chunk-YNHQIXX5.js";
|
|
30
30
|
import {
|
|
31
31
|
fetchServerSyncedCredential
|
|
32
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
79
|
+
} from "./chunk-XVP3C2KY.js";
|
|
80
80
|
import {
|
|
81
81
|
read
|
|
82
|
-
} from "./chunk-
|
|
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\
|
|
769
|
-
5. \
|
|
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\
|
|
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
|
-
- \
|
|
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-
|
|
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-
|
|
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
|
}
|