nolo-cli 0.83.0 → 0.84.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-LUNEV235.js → _executeModel-BPUR2QYH.js} +29 -28
- package/{action-YVYQEAAV.js → action-P4TNFGAD.js} +3 -3
- package/{addContentAction-O7R66HEX.js → addContentAction-MB2HHMDZ.js} +2 -2
- package/{addDialogAgentAction-74OA7KYP.js → addDialogAgentAction-S2NRBCWW.js} +2 -2
- package/{agentDeleteCommand-2YAHAZFJ.js → agentDeleteCommand-MNAA6MIG.js} +15 -14
- package/{agentEmailCommands-G6A7IRPQ.js → agentEmailCommands-SK34WJKU.js} +37 -36
- package/{agentListCommands-KMS675GZ.js → agentListCommands-I26MKI4T.js} +31 -19
- package/{agentMachineCommands-W2SMNSQ3.js → agentMachineCommands-M6QDR6P3.js} +15 -14
- package/{agentProviderCommands-GNPTL5XR.js → agentProviderCommands-X3UNW77C.js} +1 -1
- package/{agentRecordCommands-D7BRMFNI.js → agentRecordCommands-HTHLO2MM.js} +36 -35
- package/{agentRunCommand-VL6MMEUB.js → agentRunCommand-IAIRCMTH.js} +38 -36
- package/{agentRuntimeLocal-VXZSDIGT.js → agentRuntimeLocal-3WTYYIT2.js} +16 -11
- package/{agentSlice-5YJHUO47.js → agentSlice-TVP3HINW.js} +2 -2
- package/{appDeleteCommands-32MHLR4L.js → appDeleteCommands-SB5TNLKY.js} +16 -15
- package/{appDeployCommands-WCQOUSOB.js → appDeployCommands-2IPKZINV.js} +16 -15
- package/{appDeployStatusCommands-6QKB7DYN.js → appDeployStatusCommands-K63TFUID.js} +16 -15
- package/{appGetCommands-SFAPP5PB.js → appGetCommands-VU2SLNEH.js} +16 -15
- package/{appListCommands-EKUBDRUO.js → appListCommands-S3T4DJ36.js} +16 -15
- package/{authCommand-F4EFRRX6.js → authCommand-HGP2XTKC.js} +100 -8
- package/{builtinSkillRegistry-FUAVTRVZ.js → builtinSkillRegistry-Q2VVY3SC.js} +2 -2
- package/{chatQueueReduxAdapter-PQMRR2PK.js → chatQueueReduxAdapter-TWIYKVIZ.js} +9 -9
- package/{chunk-Z77CRGTW.js → chunk-3AMA42ZI.js} +1 -1
- package/{chunk-5FBTLSFG.js → chunk-3BGIKIPF.js} +317 -153
- package/{chunk-ORYWEJO4.js → chunk-3IUWIAHP.js} +3 -3
- package/{chunk-Q2XN3EOZ.js → chunk-3VUWPRFW.js} +17 -7
- package/{chunk-GEPUP7OO.js → chunk-3YIAR5UI.js} +1 -1
- package/{chunk-5H7KJX7J.js → chunk-4MK3I7Y4.js} +1 -1
- package/{chunk-6VFARHZW.js → chunk-52Q2IW2X.js} +783 -999
- package/{chunk-6Q33GUCC.js → chunk-5MEYHVIB.js} +1 -1
- package/{chunk-6YTOJY35.js → chunk-6D2JFXLY.js} +35 -0
- package/{chunk-FZGV4FGK.js → chunk-6GFOD3TK.js} +260 -140
- package/{chunk-HJUYAD4A.js → chunk-6Z7MY3V7.js} +1 -1
- package/{chunk-V4MJDUSR.js → chunk-AHAHBQMU.js} +1 -1
- package/{chunk-TOP2VXOR.js → chunk-BFDFRLLQ.js} +2 -2
- package/chunk-BMQ2MJUK.js +153 -0
- package/{chunk-RG6JBBX5.js → chunk-CWQINZEA.js} +119 -3
- package/{chunk-BTI7PJDX.js → chunk-DD6XE56O.js} +12 -65
- package/{chunk-ETI2NYVF.js → chunk-FKNWP6SG.js} +1 -1
- package/{chunk-SSDAAEC2.js → chunk-FP76KI2Y.js} +280 -40
- package/chunk-FV3JEYR3.js +870 -0
- package/{chunk-DHDMC6FO.js → chunk-GIVFXPWK.js} +2 -0
- package/chunk-GMZLP5DV.js +82 -0
- package/{chunk-UZGQNTVW.js → chunk-GNCCNNZD.js} +3 -1
- package/{chunk-AFUORTY4.js → chunk-GP5LKBUZ.js} +1 -1
- package/{chunk-ZCYXJSTU.js → chunk-H4AHY5BU.js} +4 -81
- package/{chunk-OEVAY4J6.js → chunk-HAFJ3NDE.js} +2 -2
- package/{chunk-IIVGDG4I.js → chunk-HCT7U36O.js} +3 -0
- package/{chunk-4OEFYTWL.js → chunk-HKNXJGEC.js} +1 -1
- package/{chunk-VLTIYV3X.js → chunk-HYJFRTLW.js} +1 -1
- package/{chunk-NA35QHCF.js → chunk-K36IXSCQ.js} +1 -1
- package/{chunk-DRGSDQBL.js → chunk-KAUSRTO6.js} +2 -2
- package/{chunk-GPCZ7UXG.js → chunk-LJ5VW2UJ.js} +1 -1
- package/{chunk-YFE4A4O7.js → chunk-LMREEBWT.js} +120 -37
- package/{chunk-JRQFUXY7.js → chunk-LVIFM7VW.js} +1 -1
- package/{chunk-RFCKMYDK.js → chunk-MZYBSTMH.js} +4 -4
- package/chunk-OCZKATRC.js +129 -0
- package/{chunk-DNCEALKX.js → chunk-P5EVSOPA.js} +2 -2
- package/{chunk-BP4XNZRM.js → chunk-PBA4UJBK.js} +1 -1
- package/{chunk-G2O6V3HJ.js → chunk-PMAIQX7A.js} +3 -3
- package/{chunk-AEOE4Z6Q.js → chunk-QSHEEA5N.js} +2 -2
- package/{chunk-KQ4ONNQD.js → chunk-QU7KDSZX.js} +1 -1
- package/{chunk-45C5ER5U.js → chunk-RPJUFEGR.js} +4 -4
- package/{chunk-X6DN5HBD.js → chunk-U4OKDZFH.js} +3 -3
- package/{chunk-4S5QUMJP.js → chunk-UDVH2P4A.js} +4 -4
- package/{chunk-UKZDAFYT.js → chunk-UEVXFHQB.js} +2 -2
- package/{chunk-H62HCIUP.js → chunk-VRTTFDBM.js} +2 -1
- package/{chunk-6IG4XSS6.js → chunk-WP5UXDA5.js} +71 -4
- package/{chunk-3DII57IT.js → chunk-XD2MJFUG.js} +1 -1
- package/{chunk-QVKRR2SS.js → chunk-XP3VVAPG.js} +878 -175
- package/{chunk-L5UXH3B2.js → chunk-Z2PV6O2T.js} +18 -2
- package/{chunk-53HEEOTT.js → chunk-Z5625XML.js} +1 -1
- package/{contentThunks-GJV22WVZ.js → contentThunks-JYWI7G7I.js} +10 -10
- package/{createAgentAutomationAction-6V25TZEO.js → createAgentAutomationAction-Z4SUJ54Y.js} +10 -10
- package/{createDialogAction-SX36BGSX.js → createDialogAction-RCHFLVJ2.js} +12 -12
- package/{createPageAction-IR4BGJSI.js → createPageAction-YK2253XQ.js} +11 -11
- package/{dbSlice-XVWBAGYN.js → dbSlice-A6C6H32X.js} +1 -1
- package/{dialogCommands-5J56DFWN.js → dialogCommands-X4UOZQWX.js} +16 -15
- package/{dialogSlice-UNX2FAPZ.js → dialogSlice-IVTWLCE2.js} +15 -9
- package/{docCreateCommands-KYI2DC2U.js → docCreateCommands-VD6TGHG4.js} +15 -14
- package/{docDeleteCommands-67REUSRY.js → docDeleteCommands-OT3R2G4W.js} +16 -15
- package/{docReadCommands-HOSVSBDJ.js → docReadCommands-2G7BIXSH.js} +15 -14
- package/{docStore-JWVG5NDO.js → docStore-UENKCCDX.js} +2 -2
- package/{docUpdateCommands-EMGCSMXY.js → docUpdateCommands-45MVJKZA.js} +15 -14
- package/{handleSendMessageAction-B75UOJKF.js → handleSendMessageAction-LM2J4HC3.js} +50 -58
- package/index.js +51 -51
- package/{machineCommands-GFPTOY6L.js → machineCommands-6N6MQIE6.js} +38 -37
- package/{machineWsRunDispatch-46PSZ3DJ.js → machineWsRunDispatch-7MFKVQCR.js} +35 -34
- package/{memberThunks-QGFLFVCI.js → memberThunks-P2ECUJ56.js} +2 -2
- package/package.json +1 -1
- package/pdf-U6KSUEZZ.js +26435 -0
- package/{providerPresetApply-FG6NZ57W.js → providerPresetApply-XI3WUPTI.js} +2 -2
- package/{providerRegistry-757OWH3O.js → providerRegistry-KEPWWGXD.js} +2 -2
- package/{readlineWorkspace-UFSWHFKD.js → readlineWorkspace-JWBON5CX.js} +184 -63
- package/{removeDialogAgentAction-IX3MN2ZO.js → removeDialogAgentAction-W66BJ7CF.js} +4 -4
- package/{runAgentClientLoop-25LJ4XGV.js → runAgentClientLoop-TA4SSPHE.js} +26 -26
- package/{setDialogExtraReferencesAction-X4HCPNZL.js → setDialogExtraReferencesAction-2ALKG3WA.js} +3 -3
- package/{setPrimaryDialogAgentAction-4GMIQLOD.js → setPrimaryDialogAgentAction-TQZB55F6.js} +4 -4
- package/{settingSlice-ZQZVUPKK.js → settingSlice-P4ZW7K5X.js} +2 -2
- package/{spaceCommands-NKJVJCQQ.js → spaceCommands-6NSAXB7D.js} +15 -14
- package/{streamAgentChatTurn-A46QFV4O.js → streamAgentChatTurn-X5ENGUIS.js} +94 -34
- package/{switchDialogAgentAction-N52LRPA3.js → switchDialogAgentAction-3KI72HHS.js} +2 -2
- package/{toolApiClient-QVJ6HDNN.js → toolApiClient-G3M73RTB.js} +2 -2
- package/{tools-TTDGRNY6.js → tools-XRQR7ZZR.js} +23 -23
- package/{tuiSummaryLlmCaller-WFRWERGK.js → tuiSummaryLlmCaller-UFGFOIIW.js} +5 -4
- package/{updateDialogTitleAction-QJPZGF52.js → updateDialogTitleAction-ESUUD3GT.js} +10 -10
- package/chunk-Q5FJJ6XI.js +0 -103
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// packages/agent-runtime/sseFrames.ts
|
|
2
|
+
async function* readSseFrames(response) {
|
|
3
|
+
const reader = response.body?.getReader();
|
|
4
|
+
if (!reader) {
|
|
5
|
+
throw new Error("SSE response did not include a readable body.");
|
|
6
|
+
}
|
|
7
|
+
const decoder = new TextDecoder();
|
|
8
|
+
let buffer = "";
|
|
9
|
+
while (true) {
|
|
10
|
+
const { done, value } = await reader.read();
|
|
11
|
+
if (done) break;
|
|
12
|
+
buffer += decoder.decode(value, { stream: true });
|
|
13
|
+
let boundary = findSseFrameBoundary(buffer);
|
|
14
|
+
while (boundary) {
|
|
15
|
+
yield buffer.slice(0, boundary.index);
|
|
16
|
+
buffer = buffer.slice(boundary.index + boundary.separatorLength);
|
|
17
|
+
boundary = findSseFrameBoundary(buffer);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const remaining = decoder.decode();
|
|
21
|
+
if (remaining) {
|
|
22
|
+
buffer += remaining;
|
|
23
|
+
let boundary = findSseFrameBoundary(buffer);
|
|
24
|
+
while (boundary) {
|
|
25
|
+
yield buffer.slice(0, boundary.index);
|
|
26
|
+
buffer = buffer.slice(boundary.index + boundary.separatorLength);
|
|
27
|
+
boundary = findSseFrameBoundary(buffer);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (buffer.trim()) yield buffer;
|
|
31
|
+
}
|
|
32
|
+
function findSseFrameBoundary(buffer) {
|
|
33
|
+
const lfLf = buffer.indexOf("\n\n");
|
|
34
|
+
const crLfCrLf = buffer.indexOf("\r\n\r\n");
|
|
35
|
+
if (lfLf === -1 && crLfCrLf === -1) return null;
|
|
36
|
+
const useLf = lfLf !== -1 && (crLfCrLf === -1 || lfLf < crLfCrLf);
|
|
37
|
+
return useLf ? { index: lfLf, separatorLength: 2 } : { index: crLfCrLf, separatorLength: 4 };
|
|
38
|
+
}
|
|
39
|
+
async function* streamSseDataValues(response, parse) {
|
|
40
|
+
const reader = response.body?.getReader();
|
|
41
|
+
if (!reader) return;
|
|
42
|
+
const decoder = new TextDecoder();
|
|
43
|
+
let buffer = "";
|
|
44
|
+
while (true) {
|
|
45
|
+
const { done, value } = await reader.read();
|
|
46
|
+
if (done) break;
|
|
47
|
+
buffer += decoder.decode(value, { stream: true });
|
|
48
|
+
const lines = buffer.split("\n");
|
|
49
|
+
buffer = lines.pop() ?? "";
|
|
50
|
+
for (const line of lines) {
|
|
51
|
+
const parsed = parse(line);
|
|
52
|
+
if (parsed) yield parsed;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const remaining = decoder.decode();
|
|
56
|
+
if (remaining) {
|
|
57
|
+
buffer += remaining;
|
|
58
|
+
const lines = buffer.split("\n");
|
|
59
|
+
buffer = lines.pop() ?? "";
|
|
60
|
+
for (const line of lines) {
|
|
61
|
+
const parsed = parse(line);
|
|
62
|
+
if (parsed) yield parsed;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (buffer.trim()) {
|
|
66
|
+
const parsed = parse(buffer);
|
|
67
|
+
if (parsed) yield parsed;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function readSseDataValues(response, parse) {
|
|
71
|
+
const values = [];
|
|
72
|
+
for await (const value of streamSseDataValues(response, parse)) {
|
|
73
|
+
values.push(value);
|
|
74
|
+
}
|
|
75
|
+
return values;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export {
|
|
79
|
+
readSseFrames,
|
|
80
|
+
streamSseDataValues,
|
|
81
|
+
readSseDataValues
|
|
82
|
+
};
|
|
@@ -129,7 +129,9 @@ async function refreshAntigravityToken(credential, deps = {}) {
|
|
|
129
129
|
payload = {};
|
|
130
130
|
}
|
|
131
131
|
if (!response.ok) {
|
|
132
|
-
const
|
|
132
|
+
const errorCode = typeof payload.error === "string" && payload.error.trim() ? payload.error.trim() : void 0;
|
|
133
|
+
const errorDescription = typeof payload.error_description === "string" && payload.error_description.trim() ? payload.error_description.trim() : void 0;
|
|
134
|
+
const detail = (errorCode && errorDescription && errorDescription !== errorCode ? `${errorCode}: ${errorDescription}` : errorCode ?? errorDescription ?? rawBodyText.trim()) || `HTTP ${response.status}`;
|
|
133
135
|
throw new Error(`Antigravity token refresh failed: ${detail}`);
|
|
134
136
|
}
|
|
135
137
|
if (typeof payload.access_token !== "string" || !payload.access_token.trim()) {
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readSseFrames
|
|
3
|
+
} from "./chunk-GMZLP5DV.js";
|
|
1
4
|
import {
|
|
2
5
|
sanitizeForOutbound
|
|
3
6
|
} from "./chunk-CQ3WA2NE.js";
|
|
@@ -40,7 +43,7 @@ import {
|
|
|
40
43
|
clipCompactText,
|
|
41
44
|
isMeaningfulChatCompletionOutput,
|
|
42
45
|
isMeaningfulResponsesOutput
|
|
43
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-P5EVSOPA.js";
|
|
44
47
|
import {
|
|
45
48
|
NOLO_CLIENT_VERSION_HEADER,
|
|
46
49
|
isPlatformMimoProviderModel
|
|
@@ -347,83 +350,6 @@ function flushChatCompletionStream(state) {
|
|
|
347
350
|
}
|
|
348
351
|
}
|
|
349
352
|
|
|
350
|
-
// packages/agent-runtime/sseFrames.ts
|
|
351
|
-
async function* readSseFrames(response) {
|
|
352
|
-
const reader = response.body?.getReader();
|
|
353
|
-
if (!reader) {
|
|
354
|
-
throw new Error("SSE response did not include a readable body.");
|
|
355
|
-
}
|
|
356
|
-
const decoder = new TextDecoder();
|
|
357
|
-
let buffer = "";
|
|
358
|
-
while (true) {
|
|
359
|
-
const { done, value } = await reader.read();
|
|
360
|
-
if (done) break;
|
|
361
|
-
buffer += decoder.decode(value, { stream: true });
|
|
362
|
-
let boundary = findSseFrameBoundary(buffer);
|
|
363
|
-
while (boundary) {
|
|
364
|
-
yield buffer.slice(0, boundary.index);
|
|
365
|
-
buffer = buffer.slice(boundary.index + boundary.separatorLength);
|
|
366
|
-
boundary = findSseFrameBoundary(buffer);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
const remaining = decoder.decode();
|
|
370
|
-
if (remaining) {
|
|
371
|
-
buffer += remaining;
|
|
372
|
-
let boundary = findSseFrameBoundary(buffer);
|
|
373
|
-
while (boundary) {
|
|
374
|
-
yield buffer.slice(0, boundary.index);
|
|
375
|
-
buffer = buffer.slice(boundary.index + boundary.separatorLength);
|
|
376
|
-
boundary = findSseFrameBoundary(buffer);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
if (buffer.trim()) yield buffer;
|
|
380
|
-
}
|
|
381
|
-
function findSseFrameBoundary(buffer) {
|
|
382
|
-
const lfLf = buffer.indexOf("\n\n");
|
|
383
|
-
const crLfCrLf = buffer.indexOf("\r\n\r\n");
|
|
384
|
-
if (lfLf === -1 && crLfCrLf === -1) return null;
|
|
385
|
-
const useLf = lfLf !== -1 && (crLfCrLf === -1 || lfLf < crLfCrLf);
|
|
386
|
-
return useLf ? { index: lfLf, separatorLength: 2 } : { index: crLfCrLf, separatorLength: 4 };
|
|
387
|
-
}
|
|
388
|
-
async function* streamSseDataValues(response, parse) {
|
|
389
|
-
const reader = response.body?.getReader();
|
|
390
|
-
if (!reader) return;
|
|
391
|
-
const decoder = new TextDecoder();
|
|
392
|
-
let buffer = "";
|
|
393
|
-
while (true) {
|
|
394
|
-
const { done, value } = await reader.read();
|
|
395
|
-
if (done) break;
|
|
396
|
-
buffer += decoder.decode(value, { stream: true });
|
|
397
|
-
const lines = buffer.split("\n");
|
|
398
|
-
buffer = lines.pop() ?? "";
|
|
399
|
-
for (const line of lines) {
|
|
400
|
-
const parsed = parse(line);
|
|
401
|
-
if (parsed) yield parsed;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
const remaining = decoder.decode();
|
|
405
|
-
if (remaining) {
|
|
406
|
-
buffer += remaining;
|
|
407
|
-
const lines = buffer.split("\n");
|
|
408
|
-
buffer = lines.pop() ?? "";
|
|
409
|
-
for (const line of lines) {
|
|
410
|
-
const parsed = parse(line);
|
|
411
|
-
if (parsed) yield parsed;
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
if (buffer.trim()) {
|
|
415
|
-
const parsed = parse(buffer);
|
|
416
|
-
if (parsed) yield parsed;
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
async function readSseDataValues(response, parse) {
|
|
420
|
-
const values = [];
|
|
421
|
-
for await (const value of streamSseDataValues(response, parse)) {
|
|
422
|
-
values.push(value);
|
|
423
|
-
}
|
|
424
|
-
return values;
|
|
425
|
-
}
|
|
426
|
-
|
|
427
353
|
// packages/agent-runtime/platformChatProvider.ts
|
|
428
354
|
var PlatformStreamInterruptedError = class extends Error {
|
|
429
355
|
code = "PLATFORM_STREAM_INTERRUPTED";
|
|
@@ -926,9 +852,6 @@ export {
|
|
|
926
852
|
applyChatCompletionDelta,
|
|
927
853
|
flushChatCompletionStream,
|
|
928
854
|
providerHttpFailure,
|
|
929
|
-
readSseFrames,
|
|
930
|
-
streamSseDataValues,
|
|
931
|
-
readSseDataValues,
|
|
932
855
|
createResponsesToolAccumulator,
|
|
933
856
|
applyResponsesToolEvent,
|
|
934
857
|
finalizeResponsesToolCalls,
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
listUserRecordsFromServers,
|
|
8
8
|
readDbRecordFromServers,
|
|
9
9
|
readLiveDbRecordAfterTombstoneMerge
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-3YIAR5UI.js";
|
|
11
11
|
import {
|
|
12
12
|
fetchWithTransientRetry
|
|
13
13
|
} from "./chunk-5UTFL4QJ.js";
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
boundSummaryText,
|
|
31
31
|
buildDialogReadEnvelope,
|
|
32
32
|
projectDialogReadForAgent
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-HCT7U36O.js";
|
|
34
34
|
import {
|
|
35
35
|
toErrorMessage
|
|
36
36
|
} from "./chunk-HNMXYYJR.js";
|
|
@@ -854,6 +854,7 @@ function buildNoloWorkspaceOpenAiTools(args) {
|
|
|
854
854
|
}
|
|
855
855
|
}, ["query"]);
|
|
856
856
|
add("listAgents", "List agents for delegation. Default scope='preferred' returns the user's favorites, owned, OAuth, custom API, and local agents only; scope='public' discovers shared/marketplace agents; scope='all' returns their deduplicated union. Public agents may consume platform credits. Copy the agentKey verbatim; use the runnable agentKey exactly and do not infer it from the display name. publicOnly is deprecated compatibility for scope='public'. Rate-limited agents are hidden unless showUnavailable is true.", {
|
|
857
|
+
query: stringToolParam("Optional case-insensitive search substring matching agent name, model, provider, handle, or agentKey."),
|
|
857
858
|
scope: { type: "string", enum: ["preferred", "public", "all"], description: "Discovery scope; preferred is the default and does not load the public marketplace." },
|
|
858
859
|
publicOnly: { type: "boolean", description: "Deprecated compatibility alias for scope='public'." },
|
|
859
860
|
showUnavailable: { type: "boolean", description: "Include agents currently rate-limited (429). Default false." },
|
|
@@ -1183,6 +1184,8 @@ function buildNoloWorkspaceCommandArgs(call) {
|
|
|
1183
1184
|
}
|
|
1184
1185
|
case "listAgents": {
|
|
1185
1186
|
const cliArgs = ["agent", "list"];
|
|
1187
|
+
const query = noloStringArg(args.query);
|
|
1188
|
+
if (query) cliArgs.push("--query", query);
|
|
1186
1189
|
const space = noloStringArg(args.space);
|
|
1187
1190
|
if (space) cliArgs.push("--space", space);
|
|
1188
1191
|
const scope = noloStringArg(args.scope);
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
refreshAntigravityOAuthToken,
|
|
5
5
|
refreshOpenAiCodexToken,
|
|
6
6
|
xaiRefresh
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-Z5625XML.js";
|
|
8
8
|
import {
|
|
9
9
|
defaultLoopbackRequest
|
|
10
10
|
} from "./chunk-EADNWBAZ.js";
|
|
@@ -41,7 +41,7 @@ import {
|
|
|
41
41
|
} from "./chunk-42V6BK2E.js";
|
|
42
42
|
import {
|
|
43
43
|
buildLocalAgentLookupKeys
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-3AMA42ZI.js";
|
|
45
45
|
import {
|
|
46
46
|
LOCAL_CODEX_AGENT_ID,
|
|
47
47
|
LOCAL_CODEX_AGENT_KEY,
|
|
@@ -54,14 +54,14 @@ import {
|
|
|
54
54
|
} from "./chunk-MP64VFGD.js";
|
|
55
55
|
import {
|
|
56
56
|
inferCaptureIntent
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-XD2MJFUG.js";
|
|
58
58
|
import {
|
|
59
59
|
buildCliPrompt
|
|
60
60
|
} from "./chunk-ATNTHIZI.js";
|
|
61
61
|
import {
|
|
62
62
|
inlineImageUrlsForCustomProvider,
|
|
63
63
|
prepareTools
|
|
64
|
-
} from "./chunk-
|
|
64
|
+
} from "./chunk-KAUSRTO6.js";
|
|
65
65
|
import {
|
|
66
66
|
getServerProviderSecret
|
|
67
67
|
} from "./chunk-HS7MLR74.js";
|
|
@@ -80,7 +80,7 @@ import {
|
|
|
80
80
|
rememberMemoryFunctionSchema,
|
|
81
81
|
resolveAgentRequiredPackIds,
|
|
82
82
|
setTodoListFunc
|
|
83
|
-
} from "./chunk-
|
|
83
|
+
} from "./chunk-3BGIKIPF.js";
|
|
84
84
|
import {
|
|
85
85
|
fetchWithTransientRetry,
|
|
86
86
|
isTransientFetchError
|
|
@@ -99,7 +99,7 @@ import {
|
|
|
99
99
|
} from "./chunk-3VNWWVKB.js";
|
|
100
100
|
import {
|
|
101
101
|
deriveCredentialGroup
|
|
102
|
-
} from "./chunk-
|
|
102
|
+
} from "./chunk-CWQINZEA.js";
|
|
103
103
|
import {
|
|
104
104
|
getModelPricing
|
|
105
105
|
} from "./chunk-EYAQT56M.js";
|
|
@@ -109,14 +109,14 @@ import {
|
|
|
109
109
|
prepareTokenUsageData,
|
|
110
110
|
resolveBuiltinPlatformAgentConfig,
|
|
111
111
|
runKeyed
|
|
112
|
-
} from "./chunk-
|
|
112
|
+
} from "./chunk-XP3VVAPG.js";
|
|
113
113
|
import {
|
|
114
114
|
BUILTIN_DIALOG_LLM_CHAT_FALLBACK_MODEL,
|
|
115
115
|
BUILTIN_TITLE_LLM_CONFIG
|
|
116
116
|
} from "./chunk-MC4XLIJ7.js";
|
|
117
117
|
import {
|
|
118
118
|
fetchServerSyncedCredential
|
|
119
|
-
} from "./chunk-
|
|
119
|
+
} from "./chunk-UDVH2P4A.js";
|
|
120
120
|
import {
|
|
121
121
|
require_date_fns
|
|
122
122
|
} from "./chunk-M76ECQRD.js";
|
|
@@ -132,16 +132,14 @@ import {
|
|
|
132
132
|
applySystemBuiltinSkillFilter,
|
|
133
133
|
expandEnabledPacks,
|
|
134
134
|
resolveEffectiveEnabledPacks
|
|
135
|
-
} from "./chunk-
|
|
135
|
+
} from "./chunk-GIVFXPWK.js";
|
|
136
136
|
import {
|
|
137
137
|
DEFAULT_HYBRID_READ_TIMEOUT_MS,
|
|
138
138
|
Duration_exports,
|
|
139
139
|
Effect_exports,
|
|
140
140
|
Exit_exports,
|
|
141
141
|
Option_exports,
|
|
142
|
-
accumulateGeminiChunks,
|
|
143
142
|
aggregateResponsesStream,
|
|
144
|
-
buildGeminiGenerateContentRequest,
|
|
145
143
|
buildLoadSkillExecutor,
|
|
146
144
|
buildLocalDialogWritePlan,
|
|
147
145
|
buildLocalWorkspaceOpenAiTools,
|
|
@@ -154,23 +152,17 @@ import {
|
|
|
154
152
|
evaluateFileWritePolicy,
|
|
155
153
|
executeLocalToolWithPolicy,
|
|
156
154
|
executeOpenAiCompatibleChatCompletion,
|
|
157
|
-
fetchAntigravityCloudCodeCompletion,
|
|
158
155
|
filterRetainedLedgerRecords,
|
|
156
|
+
getAgentRuntimeToolParametersIndex,
|
|
159
157
|
internalListWorkspaceEntries,
|
|
160
158
|
internalSearchWorkspace,
|
|
161
|
-
isGemini3Model,
|
|
162
159
|
isLineRangeCovered,
|
|
163
160
|
localDialogMessageRecordToRuntimeMessage,
|
|
164
|
-
parseSseDataLineJson,
|
|
165
|
-
parseSseDataLineObject,
|
|
166
161
|
parseSyncServersEnv,
|
|
167
|
-
parseUpstreamErrorBody,
|
|
168
162
|
readDevinUpstreamFailure,
|
|
169
|
-
resolveAntigravityFinishReason,
|
|
170
163
|
resolveOpenAiCompatibleProviderConfig,
|
|
171
|
-
shouldUseGeminiNativeToolRoute,
|
|
172
164
|
summarizeToolArguments
|
|
173
|
-
} from "./chunk-
|
|
165
|
+
} from "./chunk-52Q2IW2X.js";
|
|
174
166
|
import {
|
|
175
167
|
PlatformStreamInterruptedError,
|
|
176
168
|
buildPlatformChatCompletionRequest,
|
|
@@ -179,14 +171,27 @@ import {
|
|
|
179
171
|
parsePlatformChatCompletionData,
|
|
180
172
|
parsePlatformChatCompletionResponse,
|
|
181
173
|
readPlatformChatSseCompletion,
|
|
182
|
-
readSseDataValues,
|
|
183
174
|
resolvePlatformChatProviderConfig,
|
|
184
175
|
shouldUsePlatformChatProvider
|
|
185
|
-
} from "./chunk-
|
|
176
|
+
} from "./chunk-H4AHY5BU.js";
|
|
177
|
+
import {
|
|
178
|
+
accumulateGeminiChunks,
|
|
179
|
+
buildGeminiGenerateContentRequest,
|
|
180
|
+
fetchAntigravityCloudCodeCompletion,
|
|
181
|
+
isGemini3Model,
|
|
182
|
+
parseSseDataLineJson,
|
|
183
|
+
parseSseDataLineObject,
|
|
184
|
+
parseUpstreamErrorBody,
|
|
185
|
+
resolveAntigravityFinishReason,
|
|
186
|
+
shouldUseGeminiNativeToolRoute
|
|
187
|
+
} from "./chunk-FV3JEYR3.js";
|
|
188
|
+
import {
|
|
189
|
+
readSseDataValues
|
|
190
|
+
} from "./chunk-GMZLP5DV.js";
|
|
186
191
|
import {
|
|
187
192
|
resolveAgentRuntimeConfigFromRecord,
|
|
188
193
|
resolveHistoricalToolContentCap
|
|
189
|
-
} from "./chunk-
|
|
194
|
+
} from "./chunk-4MK3I7Y4.js";
|
|
190
195
|
import {
|
|
191
196
|
isDevinOAuthAgent
|
|
192
197
|
} from "./chunk-5ZUL4CUO.js";
|
|
@@ -200,7 +205,7 @@ import {
|
|
|
200
205
|
buildNoloWorkspaceOpenAiTools,
|
|
201
206
|
parseNoloWorkspaceToolArguments,
|
|
202
207
|
resolveRuntimeToolSurfaceForAgent
|
|
203
|
-
} from "./chunk-
|
|
208
|
+
} from "./chunk-HCT7U36O.js";
|
|
204
209
|
import {
|
|
205
210
|
mergeAvailabilityDeadline,
|
|
206
211
|
resolveAvailabilityAction,
|
|
@@ -208,7 +213,7 @@ import {
|
|
|
208
213
|
} from "./chunk-FDTR4QJ6.js";
|
|
209
214
|
import {
|
|
210
215
|
isAntigravityOAuthAgent
|
|
211
|
-
} from "./chunk-
|
|
216
|
+
} from "./chunk-GNCCNNZD.js";
|
|
212
217
|
import {
|
|
213
218
|
resolvePlatformAuthToken
|
|
214
219
|
} from "./chunk-6OZ36FXI.js";
|
|
@@ -218,14 +223,14 @@ import {
|
|
|
218
223
|
} from "./chunk-2MBTWINN.js";
|
|
219
224
|
import {
|
|
220
225
|
normalizeUsage
|
|
221
|
-
} from "./chunk-
|
|
226
|
+
} from "./chunk-HKNXJGEC.js";
|
|
222
227
|
import {
|
|
223
228
|
clipCompactText,
|
|
224
229
|
createProviderCallTimingTracker,
|
|
225
230
|
finalizeProviderCallTiming,
|
|
226
231
|
observeMeaningfulProviderResponseAt,
|
|
227
232
|
withProviderCallTimingFields
|
|
228
|
-
} from "./chunk-
|
|
233
|
+
} from "./chunk-P5EVSOPA.js";
|
|
229
234
|
import {
|
|
230
235
|
estimateTokenCount
|
|
231
236
|
} from "./chunk-PSCNXBYA.js";
|
|
@@ -707,6 +712,35 @@ var STRINGS = {
|
|
|
707
712
|
en: "Thinking: {0}",
|
|
708
713
|
zh: "\u601D\u8003\u4E2D\uFF1A{0}"
|
|
709
714
|
},
|
|
715
|
+
// --- Pre-delta turn phase labels (ctx-overflow-feedback batch 3) ----------
|
|
716
|
+
// Rendered on the spinner / activity line while the local runtime checks the
|
|
717
|
+
// context window, compacts history, or waits for the first model delta —
|
|
718
|
+
// the previously silent pre-delta window (batch 1/2a 修好 runtime 与 SSE,
|
|
719
|
+
// 这里补齐 CLI/TUI 的状态行投影)。compacting 行附带可取消提示:Esc /
|
|
720
|
+
// Ctrl+C 即 abort,语义与 localLoop 的 abortSignal 一致。
|
|
721
|
+
contextChecking: {
|
|
722
|
+
en: "Checking this model's context window\u2026",
|
|
723
|
+
zh: "\u6B63\u5728\u68C0\u67E5\u5F53\u524D\u6A21\u578B\u7684\u4E0A\u4E0B\u6587\u7A97\u53E3\u2026"
|
|
724
|
+
},
|
|
725
|
+
contextCompacting: {
|
|
726
|
+
en: "Compacting history\u2026 (Esc/Ctrl+C to cancel)",
|
|
727
|
+
zh: "\u6B63\u5728\u538B\u7F29\u5386\u53F2\u8BB0\u5F55\u2026\uFF08Esc/Ctrl+C \u53D6\u6D88\uFF09"
|
|
728
|
+
},
|
|
729
|
+
waitingForModel: {
|
|
730
|
+
en: "Waiting for the model\u2026",
|
|
731
|
+
zh: "\u6B63\u5728\u7B49\u5F85\u6A21\u578B\u54CD\u5E94\u2026"
|
|
732
|
+
},
|
|
733
|
+
// --- Local turn deadline failure (single actionable line) -----------------
|
|
734
|
+
// localLoop 主请求 idle deadline(DEFAULT_LLM_REQUEST_TIMEOUT_MS 兜底或调用方
|
|
735
|
+
// timeoutMs)到达后抛 code=LLM_REQUEST_TIMEOUT;generic 分支的「修本地
|
|
736
|
+
// 凭据」文案在这里是错误指引(请求已发出,问题在上游无响应)。
|
|
737
|
+
// 语义是 idle(静默窗):{0} 内没有任何新输出才放弃,不是说模型「完全没
|
|
738
|
+
// 响应」——文案必须与这个语义一致,否则会把正在生成的用户推向重复发送
|
|
739
|
+
// (2026-10 ctx-overflow-feedback review 修复 1)。
|
|
740
|
+
llmRequestTimedOut: {
|
|
741
|
+
en: "No new model output for {0}, so this turn was stopped. Your message was kept. Retry in this conversation, switch to another model, or run /compact first.",
|
|
742
|
+
zh: "\u6A21\u578B\u5DF2 {0} \u6CA1\u6709\u65B0\u8F93\u51FA\uFF0C\u672C\u8F6E\u5DF2\u505C\u6B62\u7B49\u5F85\uFF08\u53EF\u80FD\u4ECD\u5728\u751F\u6210\uFF09\u3002\u4F60\u7684\u6D88\u606F\u5DF2\u4FDD\u7559\u3002\u53EF\u5728\u672C\u5BF9\u8BDD\u91CD\u8BD5\u3001\u5207\u6362\u5230\u5176\u4ED6\u6A21\u578B\uFF0C\u6216\u5148 /compact \u538B\u7F29\u5BF9\u8BDD\u3002"
|
|
743
|
+
},
|
|
710
744
|
thinkingTraceLine: {
|
|
711
745
|
en: "\u273B Thought for {0}",
|
|
712
746
|
zh: "\u273B \u601D\u8003 {0}"
|
|
@@ -1065,6 +1099,18 @@ var STRINGS = {
|
|
|
1065
1099
|
en: "Unknown command: {0}\n\n",
|
|
1066
1100
|
zh: "\u672A\u77E5\u547D\u4EE4\uFF1A{0}\n\n"
|
|
1067
1101
|
},
|
|
1102
|
+
noConversationLinks: {
|
|
1103
|
+
en: "No links in this conversation yet.",
|
|
1104
|
+
zh: "\u672C\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u51FA\u73B0\u94FE\u63A5\u3002"
|
|
1105
|
+
},
|
|
1106
|
+
conversationLinksCopyHint: {
|
|
1107
|
+
en: "Open one by copying its URL (Cmd/Ctrl + click, or select and copy).",
|
|
1108
|
+
zh: "\u590D\u5236\u5BF9\u5E94 URL \u5373\u53EF\u6253\u5F00\uFF08Cmd/Ctrl + \u70B9\u51FB\uFF0C\u6216\u9009\u4E2D\u590D\u5236\uFF09\u3002"
|
|
1109
|
+
},
|
|
1110
|
+
conversationLinksShowing: {
|
|
1111
|
+
en: "Links in this conversation (showing first {0} of {1}):",
|
|
1112
|
+
zh: "\u672C\u4F1A\u8BDD\u51FA\u73B0\u7684\u94FE\u63A5\uFF08\u663E\u793A\u524D {0} \u4E2A\uFF0C\u5171 {1} \u4E2A\uFF09\uFF1A"
|
|
1113
|
+
},
|
|
1068
1114
|
runtimeUsage: { en: "Usage: /runtime <auto|local|server>", zh: "\u7528\u6CD5\uFF1A/runtime <auto|local|server>" },
|
|
1069
1115
|
runtimeSet: { en: "Runtime: {0}", zh: "\u8FD0\u884C\u6A21\u5F0F\uFF1A{0}" },
|
|
1070
1116
|
displayFixedHint: {
|
|
@@ -1371,6 +1417,11 @@ var TOOL_LABELS = {
|
|
|
1371
1417
|
function toolLabel(name) {
|
|
1372
1418
|
return TOOL_LABELS[name]?.[currentLocale] ?? name;
|
|
1373
1419
|
}
|
|
1420
|
+
function toolLabelVariants(name) {
|
|
1421
|
+
const entry = TOOL_LABELS[name];
|
|
1422
|
+
if (!entry) return [name];
|
|
1423
|
+
return [...new Set(Object.values(entry))];
|
|
1424
|
+
}
|
|
1374
1425
|
function agentRunCardLabels() {
|
|
1375
1426
|
return {
|
|
1376
1427
|
runStatus: t("runStatusLabel"),
|
|
@@ -2456,14 +2507,19 @@ var resolveAntigravityTransport = async (ctx) => {
|
|
|
2456
2507
|
requestedToolNames,
|
|
2457
2508
|
openAiToolNames: summarizeOpenAiToolNames(tools)
|
|
2458
2509
|
});
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2510
|
+
let lastUsedCredential = initialCredential;
|
|
2511
|
+
const resolveLocalCredential = async ({ forceRefresh }) => {
|
|
2512
|
+
const resolved = await resolveLocalAntigravityCredential({
|
|
2513
|
+
credentialOwnerUserId,
|
|
2514
|
+
apiKeyRefResolver,
|
|
2515
|
+
apiKeyRef: agentConfig.apiKeyRef,
|
|
2516
|
+
readCredential: () => readOAuthCredential("antigravity", void 0, legacyCredentialMigration),
|
|
2517
|
+
migration: legacyCredentialMigration,
|
|
2518
|
+
forceRefresh
|
|
2519
|
+
});
|
|
2520
|
+
lastUsedCredential = resolved;
|
|
2521
|
+
return resolved;
|
|
2522
|
+
};
|
|
2467
2523
|
let result;
|
|
2468
2524
|
try {
|
|
2469
2525
|
result = await invokeAntigravity({
|
|
@@ -2517,10 +2573,27 @@ var resolveAntigravityTransport = async (ctx) => {
|
|
|
2517
2573
|
};
|
|
2518
2574
|
}
|
|
2519
2575
|
if (result.status < 200 || result.status >= 300) {
|
|
2520
|
-
const
|
|
2521
|
-
|
|
2576
|
+
const upstreamError = result.body && typeof result.body === "object" && result.body.error && typeof result.body.error === "object" ? result.body.error : void 0;
|
|
2577
|
+
const errMsg = (
|
|
2578
|
+
// Google Cloud Code Assist gates calls behind a one-time account
|
|
2579
|
+
// verification and answers HTTP 403 with the validation link in
|
|
2580
|
+
// `error.details[].metadata.validation_url` — NOT in
|
|
2581
|
+
// `error.message`. Extracting only `error.message` here drops the
|
|
2582
|
+
// link before agentRun's extractGoogleValidationLink can recover
|
|
2583
|
+
// it, so when details are present we append them after the clean
|
|
2584
|
+
// message; the extractor scans raw text for validation_url so a
|
|
2585
|
+
// `details=[...]` suffix is enough, and the Detail line keeps its
|
|
2586
|
+
// readable `HTTP 403 <message>` headline. Plain-message errors
|
|
2587
|
+
// keep the old shape so existing output stays unchanged.
|
|
2588
|
+
upstreamError && Array.isArray(upstreamError.details) ? `${typeof upstreamError.message === "string" ? upstreamError.message : ""} details=${JSON.stringify(upstreamError.details)}`.trim() : typeof upstreamError?.message === "string" ? upstreamError.message : JSON.stringify(result.body)
|
|
2589
|
+
);
|
|
2590
|
+
const failure = new Error(
|
|
2522
2591
|
`local antigravity provider failed: HTTP ${result.status} ${errMsg}`
|
|
2523
2592
|
);
|
|
2593
|
+
if (lastUsedCredential?.accountId) {
|
|
2594
|
+
failure.credentialAccountId = lastUsedCredential.accountId;
|
|
2595
|
+
}
|
|
2596
|
+
throw failure;
|
|
2524
2597
|
}
|
|
2525
2598
|
const choice = Array.isArray(result.body?.choices) ? result.body.choices[0] : void 0;
|
|
2526
2599
|
const message = choice?.message ?? {};
|
|
@@ -9236,6 +9309,7 @@ function createCursorProvider(config) {
|
|
|
9236
9309
|
...config.executeTool ? { executeTool: config.executeTool } : {},
|
|
9237
9310
|
...config.searchWorkspace ? { searchWorkspace: config.searchWorkspace } : {},
|
|
9238
9311
|
...config.listWorkspaceEntries ? { listWorkspaceEntries: config.listWorkspaceEntries } : {},
|
|
9312
|
+
...options?.signal ? { signal: options.signal } : {},
|
|
9239
9313
|
...options?.onTextDelta ? { onTextDelta: options.onTextDelta } : {},
|
|
9240
9314
|
...options?.onReasoningDelta ? { onReasoningDelta: options.onReasoningDelta } : {},
|
|
9241
9315
|
...options?.onToolEvent ? { onToolEvent: options.onToolEvent } : {},
|
|
@@ -9313,6 +9387,8 @@ var resolveCursorTransport = async (ctx) => {
|
|
|
9313
9387
|
agentToolNames: activeAgentToolNames,
|
|
9314
9388
|
call,
|
|
9315
9389
|
executors: localToolExecutors,
|
|
9390
|
+
// 分发前参数闸门:与 host adapter 的 executeTool 同口径。
|
|
9391
|
+
toolParametersIndex: getAgentRuntimeToolParametersIndex(),
|
|
9316
9392
|
detachMs: resolveExecShellDetachMs(deps.env),
|
|
9317
9393
|
...deps.confirmDestructiveAction ? { confirmDestructiveAction: deps.confirmDestructiveAction } : {}
|
|
9318
9394
|
});
|
|
@@ -11548,7 +11624,8 @@ async function assertCredentialFanoutAllowed(deps, args) {
|
|
|
11548
11624
|
const verdict = checkCredentialFanout({
|
|
11549
11625
|
active,
|
|
11550
11626
|
candidate: { agentKey: args.agentKey, credentialGroup: candidateGroup },
|
|
11551
|
-
allowUnknownCredential: args.allowUnknownCredential === true
|
|
11627
|
+
allowUnknownCredential: args.allowUnknownCredential === true,
|
|
11628
|
+
allowCredentialConcurrency: args.allowCredentialConcurrency === true
|
|
11552
11629
|
});
|
|
11553
11630
|
if (!verdict.allowed) throw new Error(verdict.message);
|
|
11554
11631
|
return candidateGroup;
|
|
@@ -13448,6 +13525,11 @@ function createCliLocalRuntimeAdapter(deps) {
|
|
|
13448
13525
|
runToolNames: activeAgentToolNames,
|
|
13449
13526
|
call: injectedCall,
|
|
13450
13527
|
executors: localToolExecutors,
|
|
13528
|
+
// 分发前参数闸门:只覆盖 agent-runtime 工具族(workspace + nolo
|
|
13529
|
+
// workspace)。ai/tools registry 的工具不接——它们有各自的前置 policy
|
|
13530
|
+
// guard 与结构化结果契约(例:createTable 的 capture 确认守卫),
|
|
13531
|
+
// 闸门抢先拦截会覆盖这些语义(见 toolArgumentGate.ts 的范围说明)。
|
|
13532
|
+
toolParametersIndex: getAgentRuntimeToolParametersIndex(),
|
|
13451
13533
|
abortSignal: opts?.abortSignal,
|
|
13452
13534
|
detachMs: resolveExecShellDetachMs(deps.env),
|
|
13453
13535
|
...deps.confirmDestructiveAction ? { confirmDestructiveAction: deps.confirmDestructiveAction } : {}
|
|
@@ -13519,6 +13601,7 @@ export {
|
|
|
13519
13601
|
dailyWelcomeTip,
|
|
13520
13602
|
t,
|
|
13521
13603
|
toolLabel,
|
|
13604
|
+
toolLabelVariants,
|
|
13522
13605
|
agentRunCardLabels,
|
|
13523
13606
|
createCliLocalRuntimeAdapter
|
|
13524
13607
|
};
|