nolo-cli 0.14.0 → 0.16.0-alpha.1

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-365DMKHW.js} +20 -20
  6. package/{agentEmailCommands-M4AHOEZ3.js → agentEmailCommands-TQMXL36I.js} +38 -38
  7. package/{agentGrantCommands-B4MB23VQ.js → agentGrantCommands-JNDE4RWR.js} +2 -2
  8. package/{agentListCommands-OJLOXSKL.js → agentListCommands-6B5X4RC6.js} +22 -22
  9. package/{agentMachineCommands-NPMM4Z53.js → agentMachineCommands-LOEARB6V.js} +20 -20
  10. package/{agentPullCommand-KRBRIFIY.js → agentPullCommand-6HWUT3SW.js} +2 -2
  11. package/{agentRecordCommands-RVUH7XLZ.js → agentRecordCommands-DCH2WBL2.js} +33 -33
  12. package/{agentRunCommand-F6W2WKKZ.js → agentRunCommand-SGMH67WT.js} +35 -35
  13. package/{agentRunControl-IX4F5W2C.js → agentRunControl-6ADXVYMR.js} +2 -2
  14. package/{agentRuntimeLocal-DSUBT77I.js → agentRuntimeLocal-YSYZ33ER.js} +11 -11
  15. package/{agentSlice-PCEL26Z7.js → agentSlice-IVE735EV.js} +3 -3
  16. package/appDeleteCommands-6QYOO3JB.js +124 -0
  17. package/appDeployCommands-WTCT6XO6.js +163 -0
  18. package/appDeployStatusCommands-CGWGZJKB.js +144 -0
  19. package/appGetCommands-O4OCAMRW.js +119 -0
  20. package/appListCommands-UENFP4XY.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-5R73BS7Y.js → chunk-4NLUNENX.js} +5 -5
  25. package/chunk-4QQFLN5C.js +552 -0
  26. package/{chunk-LNSRTNH7.js → chunk-6565R2TI.js} +20 -16
  27. package/{chunk-VQFY3VXW.js → chunk-6MHDWKOT.js} +3 -2
  28. package/{chunk-5NBHQD4D.js → chunk-A7GB5UGH.js} +1 -1
  29. package/{chunk-MYE5X27Y.js → chunk-BFRVXJJJ.js} +43 -16
  30. package/{chunk-XIDYAII4.js → chunk-E237VE6U.js} +7 -140
  31. package/{chunk-IYGQF62W.js → chunk-EMXI3N3Z.js} +3 -3
  32. package/{chunk-PYAJ6ZSK.js → chunk-G2MKOQCB.js} +1 -1
  33. package/chunk-GFUIQ4RY.js +136 -0
  34. package/{chunk-RZALKBP4.js → chunk-GRTFNYLR.js} +2 -2
  35. package/{chunk-KTFJUPDW.js → chunk-HRQCKQA5.js} +31 -31
  36. package/chunk-I66RU7P7.js +107 -0
  37. package/{chunk-OIMX7MM4.js → chunk-ISYE6GZB.js} +1 -1
  38. package/{chunk-4UUJFFMK.js → chunk-J55UHASN.js} +1 -1
  39. package/{chunk-V6VXDXGY.js → chunk-JS33TCQ3.js} +2 -2
  40. package/{chunk-7JJCGV7N.js → chunk-K6EUAOW3.js} +1 -1
  41. package/{chunk-OHEKYYJF.js → chunk-KMQPSTMJ.js} +6 -6
  42. package/{chunk-3WGLLTK4.js → chunk-LSFAWXKC.js} +100 -3
  43. package/{chunk-4ON5AV72.js → chunk-MYMMNKYL.js} +1 -1
  44. package/{chunk-BHK5ZAW7.js → chunk-N5424GSW.js} +1 -1
  45. package/{chunk-7LAIOHOL.js → chunk-O53CP2QR.js} +3 -3
  46. package/{chunk-IMZ7AFIJ.js → chunk-OQMPU2ML.js} +4 -4
  47. package/{chunk-NZFWHBW5.js → chunk-QLFCNUVQ.js} +496 -442
  48. package/{chunk-TQCONXQ3.js → chunk-QZVGMD5F.js} +1 -1
  49. package/{chunk-UW3WOIWJ.js → chunk-RKM3K52F.js} +1 -1
  50. package/{chunk-TLNEQI2R.js → chunk-RSYUDGGZ.js} +9 -9
  51. package/{chunk-A5V7UEZJ.js → chunk-SFXYKGK2.js} +3 -3
  52. package/{chunk-S5UACFUP.js → chunk-TTGAVETO.js} +10 -2
  53. package/{chunk-BOJVWKNA.js → chunk-U7LEGLEB.js} +1 -1
  54. package/{chunk-R5AOLZZV.js → chunk-VE6XMVKG.js} +203 -45
  55. package/{chunk-NJVPXLRY.js → chunk-VPTJB4HM.js} +1 -1
  56. package/{chunk-PB2DHBEQ.js → chunk-WA6KZL5V.js} +25 -6
  57. package/{chunk-T3X232L6.js → chunk-WNLPAOIT.js} +1 -1
  58. package/{chunk-E6KIDMTW.js → chunk-WPN6RMDF.js} +9 -9
  59. package/{chunk-NFPO7274.js → chunk-WRN5EQT7.js} +1 -1
  60. package/{chunk-3FCSMQAC.js → chunk-XVP3C2KY.js} +1 -1
  61. package/{chunk-33K5FKRL.js → chunk-YC3DJILJ.js} +111 -40
  62. package/{chunk-TYRTLSGX.js → chunk-YNHQIXX5.js} +833 -5746
  63. package/{chunk-4F4FJPFM.js → chunk-YYIRR6QC.js} +98 -209
  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-ZL6L24BS.js} +16 -16
  71. package/{dialogSlice-2A2JOFZW.js → dialogSlice-FAWUQDJW.js} +9 -9
  72. package/{docCreateCommands-K2MPMXYF.js → docCreateCommands-LYROQTFH.js} +22 -20
  73. package/{docDeleteCommands-NBAARB77.js → docDeleteCommands-6TWGTZNR.js} +21 -19
  74. package/{docReadCommands-S3MO5RPS.js → docReadCommands-PRULNF26.js} +20 -18
  75. package/{docStore-JJP5PUR7.js → docStore-2UHVWLTV.js} +10 -10
  76. package/{docUpdateCommands-EHEI7FCE.js → docUpdateCommands-NNYYWJBI.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-JQPEQFSE.js} +36 -36
  80. package/{machineWsRunDispatch-R33NXNNI.js → machineWsRunDispatch-FFFNWVEW.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-QSXHSBHA.js} +211 -105
  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-4LE45GB7.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
@@ -0,0 +1,552 @@
1
+ import {
2
+ MODEL_LOOKUP_MAP
3
+ } from "./chunk-OGGHETUE.js";
4
+ import {
5
+ ALL_MODELS
6
+ } from "./chunk-IKXL2HZ3.js";
7
+ import {
8
+ addContentAction
9
+ } from "./chunk-XVP3C2KY.js";
10
+ import {
11
+ upload
12
+ } from "./chunk-SFXYKGK2.js";
13
+ import {
14
+ getRuntimeServerContext
15
+ } from "./chunk-DVRHHFEA.js";
16
+ import {
17
+ API_ENDPOINTS
18
+ } from "./chunk-LCBAMY2M.js";
19
+ import {
20
+ normalizeServerOrigin
21
+ } from "./chunk-CF7PE763.js";
22
+
23
+ // packages/ai/context/tokenUtils.ts
24
+ var estimateTokenCount = (text) => {
25
+ if (!text) return 0;
26
+ const chineseChars = (text.match(/[\u4e00-\u9fa5\u3400-\u4dbf]/g) || []).length;
27
+ const otherChars = text.length - chineseChars;
28
+ return Math.ceil(chineseChars * 1.5 + otherChars * 0.25);
29
+ };
30
+
31
+ // packages/ai/llm/getModelContextWindow.ts
32
+ var DEFAULT_CONTEXT_WINDOW = 256e3;
33
+ var QWEN_3_6_CONTEXT_WINDOW = 262144;
34
+ var GLM_5_2_CONTEXT_WINDOW = 1e6;
35
+ var ANTIGRAVITY_EFFORT_SUFFIXES = [
36
+ "-extra-low",
37
+ "-low",
38
+ "-medium",
39
+ "-high"
40
+ ];
41
+ function stripEffortSuffix(model) {
42
+ for (const suffix of ANTIGRAVITY_EFFORT_SUFFIXES) {
43
+ if (model.endsWith(suffix) && model.length > suffix.length) {
44
+ return model.slice(0, -suffix.length);
45
+ }
46
+ }
47
+ return model;
48
+ }
49
+ function stripPreviewSuffix(model) {
50
+ const suffix = "-preview";
51
+ if (model.endsWith(suffix) && model.length > suffix.length) {
52
+ return model.slice(0, -suffix.length);
53
+ }
54
+ return model;
55
+ }
56
+ var fullModelMap = null;
57
+ var getFullModelMap = () => {
58
+ if (!fullModelMap) {
59
+ fullModelMap = /* @__PURE__ */ new Map();
60
+ for (const [provider, models] of Object.entries(MODEL_LOOKUP_MAP)) {
61
+ for (const model of models) {
62
+ const entry = { ...model, provider };
63
+ fullModelMap.set(model.name, entry);
64
+ if (model.displayName) {
65
+ fullModelMap.set(model.displayName.toLowerCase(), entry);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ return fullModelMap;
71
+ };
72
+ var legacyModelMap = null;
73
+ var getLegacyModelMap = () => {
74
+ if (!legacyModelMap) {
75
+ legacyModelMap = /* @__PURE__ */ new Map();
76
+ for (const model of ALL_MODELS) {
77
+ legacyModelMap.set(model.name, model);
78
+ if (model.displayName) {
79
+ legacyModelMap.set(model.displayName.toLowerCase(), model);
80
+ }
81
+ }
82
+ }
83
+ return legacyModelMap;
84
+ };
85
+ function fuzzyContextWindow(normalizedName) {
86
+ if (normalizedName.includes("qwen-long") || normalizedName.includes("qwen3-long")) return 10485760;
87
+ if (normalizedName.includes("qwen-coder") || normalizedName.includes("qwen3-coder")) return 1048576;
88
+ if (normalizedName.includes("qwen3.8") || normalizedName.includes("qwen3p8")) return 1e6;
89
+ if (normalizedName.includes("minimax-m3") || normalizedName.includes("minimax_m3")) return 1e6;
90
+ if (normalizedName.includes("glm-5.2") || normalizedName.includes("glm5.2")) return GLM_5_2_CONTEXT_WINDOW;
91
+ if (normalizedName.includes("deepseek")) return 1e6;
92
+ if (normalizedName.includes("gpt-5") || normalizedName.includes("gpt-4.1")) return 1047576;
93
+ if (normalizedName.startsWith("cursor-grok-4.5")) return 1e6;
94
+ if (normalizedName.includes("claude-4.6")) return 1e6;
95
+ if (normalizedName.includes("gemini-3.1")) return 1e6;
96
+ if (normalizedName.includes("gemini")) return 1048576;
97
+ if (normalizedName.includes("qwen3.6") || normalizedName.includes("qwen3p6")) return QWEN_3_6_CONTEXT_WINDOW;
98
+ if (normalizedName.includes("qwen3.7") || normalizedName.includes("qwen3p7")) return 262144;
99
+ if (normalizedName.includes("minimax-m2") || normalizedName.includes("minimax_m2")) return 262144;
100
+ if (normalizedName.includes("claude")) return 2e5;
101
+ return void 0;
102
+ }
103
+ var getModelContextWindow = (modelName) => {
104
+ if (!modelName) return DEFAULT_CONTEXT_WINDOW;
105
+ const normalizedName = modelName.toLowerCase();
106
+ const map = getFullModelMap();
107
+ const candidates = [modelName, normalizedName];
108
+ const strippedEffort = stripEffortSuffix(modelName);
109
+ if (strippedEffort !== modelName) {
110
+ candidates.push(strippedEffort, strippedEffort.toLowerCase());
111
+ }
112
+ const strippedPreview = stripPreviewSuffix(modelName);
113
+ if (strippedPreview !== modelName) {
114
+ candidates.push(strippedPreview, strippedPreview.toLowerCase());
115
+ }
116
+ if (strippedEffort !== modelName) {
117
+ const strippedBoth = stripPreviewSuffix(strippedEffort);
118
+ if (strippedBoth !== strippedEffort) {
119
+ candidates.push(strippedBoth, strippedBoth.toLowerCase());
120
+ }
121
+ }
122
+ for (const candidate of candidates) {
123
+ const model = map.get(candidate);
124
+ if (model?.contextWindow) {
125
+ return typeof model.contextWindow === "number" ? model.contextWindow : DEFAULT_CONTEXT_WINDOW;
126
+ }
127
+ }
128
+ return fuzzyContextWindow(normalizedName) ?? DEFAULT_CONTEXT_WINDOW;
129
+ };
130
+ var getModelInfo = (modelName) => {
131
+ if (!modelName) return null;
132
+ const map = getLegacyModelMap();
133
+ return map.get(modelName) || map.get(modelName.toLowerCase()) || null;
134
+ };
135
+
136
+ // packages/core/chat/messageContentSerialize.ts
137
+ var serializeMessageContent = (content, imagePlaceholder = "[\u56FE\u7247]") => {
138
+ if (typeof content === "string") {
139
+ return content.trim() || null;
140
+ }
141
+ if (Array.isArray(content)) {
142
+ const fragments = [];
143
+ for (const part of content) {
144
+ if (!part || typeof part !== "object") continue;
145
+ if (part.type === "text" && typeof part.text === "string") {
146
+ const text = part.text.trim();
147
+ if (text) fragments.push(text);
148
+ } else if (part.type === "image_url") {
149
+ fragments.push(imagePlaceholder);
150
+ }
151
+ }
152
+ const joined = fragments.join("\n").trim();
153
+ return joined || null;
154
+ }
155
+ return null;
156
+ };
157
+
158
+ // packages/app/utils/imageUtils.ts
159
+ var BYTES_PER_MB = 1024 * 1024;
160
+ var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
161
+ var parseDataUrl = (dataUrl) => {
162
+ const trimmed = dataUrl.trim();
163
+ const parts = trimmed.split(",");
164
+ if (parts.length < 2 || !parts[0] || !parts[1]) {
165
+ console.warn("[imageUtils] parseDataUrl: invalid data URL", {
166
+ hasHeader: !!parts[0],
167
+ hasBody: !!parts[1]
168
+ });
169
+ return null;
170
+ }
171
+ const header = parts[0];
172
+ const base64 = parts[1];
173
+ const mimeMatch = header.match(/:(.*?);/);
174
+ const mime = mimeMatch?.[1];
175
+ if (!mime) {
176
+ console.warn("[imageUtils] parseDataUrl: cannot extract mime from", header);
177
+ return null;
178
+ }
179
+ return { mime, base64 };
180
+ };
181
+ function dataURLtoFile(dataUrl, filename) {
182
+ try {
183
+ const parsed = parseDataUrl(dataUrl);
184
+ if (!parsed) return null;
185
+ const { mime, base64 } = parsed;
186
+ const binaryString = atob(base64);
187
+ const length = binaryString.length;
188
+ const u8arr = new Uint8Array(length);
189
+ for (let i = 0; i < length; i++) {
190
+ u8arr[i] = binaryString.charCodeAt(i);
191
+ }
192
+ return new File([u8arr], filename, { type: mime });
193
+ } catch (error) {
194
+ console.error("[imageUtils] Error converting data URL to File:", error);
195
+ return null;
196
+ }
197
+ }
198
+ var appendNoCacheQuery = (url) => {
199
+ const stamp = `_t=${Date.now()}`;
200
+ return url.includes("?") ? `${url}&${stamp}` : `${url}?${stamp}`;
201
+ };
202
+ var tryLoadImage = (url) => new Promise((resolve) => {
203
+ const img = new Image();
204
+ const cleanup = () => {
205
+ img.onload = null;
206
+ img.onerror = null;
207
+ };
208
+ img.onload = () => {
209
+ cleanup();
210
+ resolve(true);
211
+ };
212
+ img.onerror = () => {
213
+ cleanup();
214
+ resolve(false);
215
+ };
216
+ img.src = url;
217
+ });
218
+ var waitForFileReady = async (url, {
219
+ maxWaitMs = 4e3,
220
+ intervalMs = 250
221
+ } = {}) => {
222
+ const start = Date.now();
223
+ while (Date.now() - start < maxWaitMs) {
224
+ const tryUrl = appendNoCacheQuery(url);
225
+ const ok = await tryLoadImage(tryUrl);
226
+ if (ok) {
227
+ console.debug("[imageUtils] waitForFileReady: image loaded for", url);
228
+ return true;
229
+ }
230
+ await sleep(intervalMs);
231
+ }
232
+ console.warn("[imageUtils] waitForFileReady: timeout for", url);
233
+ return false;
234
+ };
235
+
236
+ // packages/database/fileUrl.ts
237
+ var normalizeFileId = (fileId) => {
238
+ if (typeof fileId !== "string") return "";
239
+ return fileId.trim();
240
+ };
241
+ var buildDatabaseFileContentUrl = (serverOrigin, fileId) => {
242
+ const normalizedServer = normalizeServerOrigin(serverOrigin);
243
+ const normalizedFileId = normalizeFileId(fileId);
244
+ if (!normalizedServer || !normalizedFileId) {
245
+ return null;
246
+ }
247
+ return `${normalizedServer}${API_ENDPOINTS.DATABASE}/file/content/${normalizedFileId}`;
248
+ };
249
+
250
+ // packages/chat/messages/fileUrl.ts
251
+ var buildMessageFileContentUrl = (serverOrigin, fileId) => buildDatabaseFileContentUrl(serverOrigin, fileId);
252
+
253
+ // packages/chat/messages/imagePayloadPersistence.ts
254
+ var stripDurableImageInlinePayload = (part) => {
255
+ if (!part || typeof part !== "object") return part;
256
+ const { original_data_url: _originalDataUrl, ...withoutOriginalDataUrl } = part;
257
+ if (withoutOriginalDataUrl.type !== "image_url" || !withoutOriginalDataUrl.google_native || typeof withoutOriginalDataUrl.google_native !== "object") {
258
+ return withoutOriginalDataUrl;
259
+ }
260
+ const { google_native: _googleNative, ...durablePart } = withoutOriginalDataUrl;
261
+ return durablePart;
262
+ };
263
+
264
+ // packages/chat/messages/messageContent.ts
265
+ var isDataUrlImage = (url) => typeof url === "string" && url.startsWith("data:image");
266
+ var uploadGeneratedImageDataUrl = async (url, dialogId, messageId, index, dispatch, getState, options) => {
267
+ const fileName = `generated-image-${dialogId}-${messageId}-${index}.png`;
268
+ const file = dataURLtoFile(url, fileName);
269
+ if (!file) {
270
+ console.warn(
271
+ "[messageContent] dataURLtoFile failed, drop generated image inline payload"
272
+ );
273
+ return null;
274
+ }
275
+ const customKey = `generated-image-${dialogId}-${messageId}-${index}`;
276
+ let metadata;
277
+ try {
278
+ metadata = await dispatch(upload({ file, customKey })).unwrap();
279
+ } catch (err) {
280
+ console.warn(
281
+ "[messageContent] upload generated image failed, drop inline payload:",
282
+ err
283
+ );
284
+ return null;
285
+ }
286
+ const state = getState();
287
+ const { currentServer } = getRuntimeServerContext(state);
288
+ const fileId = metadata?.dbKey || metadata?.id;
289
+ if (!currentServer || !fileId) {
290
+ console.warn(
291
+ "[messageContent] missing currentServer or fileId, drop inline payload",
292
+ { currentServer, fileId }
293
+ );
294
+ return null;
295
+ }
296
+ if (options?.spaceId) {
297
+ try {
298
+ const agentPrefix = options.agentName ? `[${options.agentName}] ` : "";
299
+ const title = `${agentPrefix}Generated Image ${index + 1}`;
300
+ await addContentAction({
301
+ spaceId: options.spaceId,
302
+ contentKey: fileId,
303
+ title,
304
+ type: "image" /* IMAGE */
305
+ }, { dispatch, getState });
306
+ console.log(`[messageContent] Saved generated image to space: ${options.spaceId}`);
307
+ } catch (err) {
308
+ console.error("[messageContent] Failed to save generated image to space:", err);
309
+ }
310
+ }
311
+ const imageUrl = buildMessageFileContentUrl(currentServer, fileId);
312
+ if (!imageUrl) {
313
+ return null;
314
+ }
315
+ const ready = await waitForFileReady(imageUrl);
316
+ if (!ready) {
317
+ console.warn(
318
+ "[messageContent] uploaded generated image not ready, drop inline payload:",
319
+ imageUrl
320
+ );
321
+ return null;
322
+ }
323
+ return imageUrl;
324
+ };
325
+ var normalizeAssistantContentBuffer = async (contentBuffer, dialogId, messageId, dispatch, getState, options) => {
326
+ if (!Array.isArray(contentBuffer) || contentBuffer.length === 0) {
327
+ return contentBuffer;
328
+ }
329
+ const updated = await Promise.all(
330
+ contentBuffer.map(async (part, index) => {
331
+ if (!part || part.type !== "image_url" || !part.image_url || !isDataUrlImage(part.image_url.url)) {
332
+ return part;
333
+ }
334
+ const newUrl = await uploadGeneratedImageDataUrl(
335
+ part.image_url.url,
336
+ dialogId,
337
+ messageId,
338
+ index,
339
+ dispatch,
340
+ getState,
341
+ options
342
+ );
343
+ if (!newUrl) {
344
+ return {
345
+ type: "text",
346
+ text: "[\u56FE\u7247\u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u751F\u6210\u56FE\u7247]"
347
+ };
348
+ }
349
+ return stripDurableImageInlinePayload({
350
+ ...part,
351
+ image_url: {
352
+ ...part.image_url,
353
+ url: newUrl
354
+ }
355
+ });
356
+ })
357
+ );
358
+ return updated;
359
+ };
360
+
361
+ // packages/ai/context/retention.ts
362
+ var SAFE_BUFFER_RATIO = 0.95;
363
+ var CACHE_FIRST_RETENTION_STRENGTH = 0.95;
364
+ var clamp = (v, min, max) => Math.min(max, Math.max(min, v));
365
+ var planContextUsage = (params) => {
366
+ const { contextWindow, summaryTokens, recentLoad } = params;
367
+ const safeWindowLimit = Math.floor(contextWindow * SAFE_BUFFER_RATIO);
368
+ const iq = CACHE_FIRST_RETENTION_STRENGTH;
369
+ const isLargeWindow = contextWindow >= 512e3;
370
+ const isSmallWindow = contextWindow <= 64e3;
371
+ let baseHistoryRatio;
372
+ if (isLargeWindow) {
373
+ baseHistoryRatio = 0.8 + 0.2 * iq;
374
+ } else if (isSmallWindow) {
375
+ baseHistoryRatio = 0.35 + 0.3 * iq;
376
+ } else {
377
+ baseHistoryRatio = 0.55 + 0.3 * iq;
378
+ }
379
+ let historyRatio = baseHistoryRatio;
380
+ switch (recentLoad) {
381
+ case "light": {
382
+ const maxRatio = isLargeWindow ? 1 : isSmallWindow ? 0.75 : 0.85;
383
+ historyRatio = clamp(historyRatio * 1.05, 0.3, maxRatio);
384
+ break;
385
+ }
386
+ case "heavy": {
387
+ const maxRatio = isLargeWindow ? 0.98 : isSmallWindow ? 0.7 : 0.8;
388
+ const multiplier = isLargeWindow ? 0.98 : isSmallWindow ? 0.9 : 0.9;
389
+ historyRatio = clamp(historyRatio * multiplier, 0.3, maxRatio);
390
+ break;
391
+ }
392
+ case "medium":
393
+ default: {
394
+ const maxRatio = isLargeWindow ? 1 : isSmallWindow ? 0.75 : 0.85;
395
+ historyRatio = clamp(historyRatio, 0.3, maxRatio);
396
+ break;
397
+ }
398
+ }
399
+ const historyBudget = Math.max(
400
+ 0,
401
+ Math.floor(safeWindowLimit * historyRatio)
402
+ );
403
+ const minRawRatio = isSmallWindow ? 0.5 : isLargeWindow ? 0.2 : 0.3;
404
+ const rawMessageBudget = Math.max(
405
+ Math.floor(historyBudget * minRawRatio),
406
+ historyBudget - summaryTokens,
407
+ 0
408
+ );
409
+ let minTailTokens;
410
+ if (recentLoad === "light") {
411
+ minTailTokens = Math.min(
412
+ Math.floor(safeWindowLimit * 0.3),
413
+ 8e3
414
+ );
415
+ } else if (recentLoad === "heavy") {
416
+ minTailTokens = Math.max(
417
+ Math.floor(safeWindowLimit * 0.25),
418
+ 16e3
419
+ );
420
+ } else {
421
+ minTailTokens = Math.floor(safeWindowLimit * 0.2);
422
+ }
423
+ return { historyBudget, rawMessageBudget, minTailTokens };
424
+ };
425
+
426
+ // packages/ai/context/planCompression.ts
427
+ var MIN_COMPRESS_COUNT = 5;
428
+ var ACTIVE_SUMMARY_TAIL_KEEP_COUNT = 2;
429
+ var getMessageTokenCount = (msg) => {
430
+ if (msg.usage?.completion_tokens) {
431
+ return msg.usage.completion_tokens;
432
+ }
433
+ const content = serializeMessageContent(msg.content) || "";
434
+ return estimateTokenCount(content);
435
+ };
436
+ var hasOpenEndedToolCall = (msg) => !!msg && Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0;
437
+ var isActiveSummaryWorthDoing = (pendingTokens, contextWindow) => {
438
+ const minTokens = Math.min(
439
+ 4e4,
440
+ Math.max(1e4, Math.floor(contextWindow * 0.05))
441
+ );
442
+ return pendingTokens >= minTokens;
443
+ };
444
+ var classifyConversationLoad = (msgs) => {
445
+ const N = 20;
446
+ if (!Array.isArray(msgs) || msgs.length === 0) return "light";
447
+ const tail = msgs.slice(-N);
448
+ const tokenSamples = tail.map(getMessageTokenCount);
449
+ if (tokenSamples.length === 0) return "light";
450
+ const sum = tokenSamples.reduce((acc, v) => acc + v, 0);
451
+ const avg = sum / tokenSamples.length;
452
+ const sorted = [...tokenSamples].sort((a, b) => a - b);
453
+ const p95 = sorted[Math.floor((sorted.length - 1) * 0.95)];
454
+ if (p95 < 200 && avg < 120) {
455
+ return "light";
456
+ }
457
+ if (p95 > 2e3 || avg > 1200) {
458
+ return "heavy";
459
+ }
460
+ return "medium";
461
+ };
462
+ var emptyPlan = (startIndex) => ({
463
+ shouldCompress: false,
464
+ compressCount: 0,
465
+ msgsToCompress: [],
466
+ msgsToKeep: [],
467
+ newSummarizedBeforeId: void 0,
468
+ startIndex
469
+ });
470
+ function planCompression(input) {
471
+ const {
472
+ allMsgs,
473
+ summarizedBeforeId,
474
+ summary,
475
+ contextWindow,
476
+ force = false,
477
+ reason
478
+ } = input;
479
+ let startIndex = 0;
480
+ if (summarizedBeforeId) {
481
+ const found = allMsgs.findIndex((m) => m.id === summarizedBeforeId);
482
+ if (found !== -1) {
483
+ startIndex = found + 1;
484
+ }
485
+ }
486
+ const pendingMsgs = allMsgs.slice(startIndex);
487
+ if (pendingMsgs.length === 0) {
488
+ return emptyPlan(startIndex);
489
+ }
490
+ const summaryTokens = estimateTokenCount(summary || "");
491
+ const pendingTokens = pendingMsgs.reduce(
492
+ (sum, msg) => sum + getMessageTokenCount(msg),
493
+ 0
494
+ );
495
+ const totalUsed = summaryTokens + pendingTokens;
496
+ const adjustedSummaryTokens = Math.max(summaryTokens, 1e3);
497
+ const recentLoad = classifyConversationLoad(pendingMsgs);
498
+ const { historyBudget, rawMessageBudget } = planContextUsage({
499
+ contextWindow,
500
+ summaryTokens: adjustedSummaryTokens,
501
+ recentLoad
502
+ });
503
+ const shouldRunActiveSummary = force && reason === "manual" && !hasOpenEndedToolCall(pendingMsgs[pendingMsgs.length - 1]) && isActiveSummaryWorthDoing(pendingTokens, contextWindow);
504
+ if (totalUsed < historyBudget && !shouldRunActiveSummary) {
505
+ return emptyPlan(startIndex);
506
+ }
507
+ let tokensToKeep = 0;
508
+ let keepCount = 0;
509
+ for (let i = pendingMsgs.length - 1; i >= 0; i--) {
510
+ const t = getMessageTokenCount(pendingMsgs[i]);
511
+ if (tokensToKeep + t > rawMessageBudget) break;
512
+ tokensToKeep += t;
513
+ keepCount++;
514
+ }
515
+ let compressCount = shouldRunActiveSummary && totalUsed < historyBudget ? Math.max(0, pendingMsgs.length - ACTIVE_SUMMARY_TAIL_KEEP_COUNT) : pendingMsgs.length - keepCount;
516
+ while (compressCount > 0 && compressCount < pendingMsgs.length && pendingMsgs[compressCount].role === "tool") {
517
+ compressCount--;
518
+ }
519
+ if (compressCount > 0) {
520
+ const lastCompressed = pendingMsgs[compressCount - 1];
521
+ const hasToolCalls = Array.isArray(lastCompressed.tool_calls) && lastCompressed.tool_calls.length > 0;
522
+ if (hasToolCalls) {
523
+ compressCount--;
524
+ }
525
+ }
526
+ if (compressCount < MIN_COMPRESS_COUNT) {
527
+ return emptyPlan(startIndex);
528
+ }
529
+ const msgsToCompress = pendingMsgs.slice(0, compressCount);
530
+ const msgsToKeep = pendingMsgs.slice(compressCount);
531
+ const newSummarizedBeforeId = msgsToCompress[msgsToCompress.length - 1].id;
532
+ return {
533
+ shouldCompress: true,
534
+ compressCount,
535
+ msgsToCompress,
536
+ msgsToKeep,
537
+ newSummarizedBeforeId,
538
+ startIndex
539
+ };
540
+ }
541
+
542
+ export {
543
+ planContextUsage,
544
+ estimateTokenCount,
545
+ DEFAULT_CONTEXT_WINDOW,
546
+ getModelContextWindow,
547
+ getModelInfo,
548
+ buildDatabaseFileContentUrl,
549
+ serializeMessageContent,
550
+ normalizeAssistantContentBuffer,
551
+ planCompression
552
+ };
@@ -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