nolo-cli 0.8.0-alpha.6 → 0.8.0-alpha.7
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-XIGO7HW5.js +198 -0
- package/action-PAXRPJJF.js +27 -0
- package/addContentAction-CZVWF3QZ.js +25 -0
- package/addDialogAgentAction-CCIDTPHC.js +67 -0
- package/agentDeleteCommand-47B24JYG.js +323 -0
- package/agentEmailCommands-D4FC6OZJ.js +621 -0
- package/agentListCommands-UFET7CC4.js +219 -0
- package/agentMachineCommands-LH7QDQPP.js +421 -0
- package/agentPullCommand-O2MTUAFR.js +122 -0
- package/agentRecordCommands-CWS2B5IA.js +89 -0
- package/agentRunCommand-3FRPISLG.js +102 -0
- package/agentRunControl-K4VKNEHF.js +57 -0
- package/agentRuntimeLocal-JNQQC2WG.js +99 -0
- package/agentSlice-XDFSELFJ.js +41 -0
- package/authCommand-WXMD3IPR.js +574 -0
- package/authCommands-X74AFDTC.js +26 -0
- package/chunk-2EISRLRC.js +238 -0
- package/chunk-2FTTDCD4.js +675 -0
- package/chunk-2JHWPW5B.js +2127 -0
- package/chunk-2LMT6K6N.js +171 -0
- package/chunk-2MALU52L.js +51 -0
- package/chunk-364VYAX2.js +19 -0
- package/chunk-3ASDTTEI.js +1774 -0
- package/chunk-3EUW3WEO.js +8 -0
- package/chunk-3LY4F7SV.js +9293 -0
- package/chunk-4CQLVGRV.js +50 -0
- package/chunk-4IJYA27C.js +342 -0
- package/chunk-4SN6J65J.js +38 -0
- package/chunk-4VNS5WPM.js +42 -0
- package/chunk-543C7RDK.js +562 -0
- package/chunk-572EKYLF.js +792 -0
- package/chunk-5MIDPSSK.js +206 -0
- package/chunk-5MMAK75Q.js +15 -0
- package/chunk-5XH3NZ4T.js +3631 -0
- package/chunk-63W5N6P3.js +150 -0
- package/chunk-6HYVJV7B.js +102 -0
- package/chunk-6PWWWMI7.js +628 -0
- package/chunk-6WD3OOJS.js +20 -0
- package/chunk-A3X4Y7MO.js +4294 -0
- package/chunk-AR7ZSGDI.js +929 -0
- package/chunk-ATNTHIZI.js +13 -0
- package/chunk-AUGHVUFE.js +69 -0
- package/chunk-AVMKZHBC.js +85 -0
- package/chunk-AZPCASRE.js +36 -0
- package/chunk-B76D3JJK.js +1447 -0
- package/chunk-BR2WP3DF.js +548 -0
- package/chunk-BSTNFPHD.js +231 -0
- package/chunk-CF2WZF4N.js +134 -0
- package/chunk-CF7PE763.js +10 -0
- package/chunk-CKOJQDKR.js +198 -0
- package/chunk-CM54RSSA.js +206 -0
- package/chunk-CWMSB67P.js +34 -0
- package/chunk-DA2OEKS6.js +27 -0
- package/chunk-DFFIZ25G.js +30 -0
- package/chunk-DWLEOOGR.js +8 -0
- package/chunk-DZ3XJVET.js +231 -0
- package/chunk-E5HMHIKL.js +222 -0
- package/chunk-EHLHSX7R.js +1433 -0
- package/chunk-ELRRLDWI.js +478 -0
- package/chunk-EYEEHCU4.js +3066 -0
- package/chunk-G3SUCT4W.js +8 -0
- package/chunk-G5H7RNFL.js +807 -0
- package/chunk-GAKEBQD6.js +30 -0
- package/chunk-GBRG75BQ.js +86 -0
- package/chunk-GEKCOPTN.js +190 -0
- package/chunk-H2RMRZJE.js +113 -0
- package/chunk-H33743XH.js +25 -0
- package/chunk-HEIIIZBX.js +104 -0
- package/chunk-HNMXYYJR.js +12 -0
- package/chunk-IAXBCTTE.js +175 -0
- package/chunk-IDZTNRP2.js +85 -0
- package/chunk-IECI4YHR.js +421 -0
- package/chunk-ISNCLGUZ.js +146 -0
- package/chunk-IYQV26RA.js +138 -0
- package/chunk-JBTJAPUF.js +35 -0
- package/chunk-JZPBVBIY.js +94 -0
- package/chunk-KK6SWS5B.js +1078 -0
- package/chunk-KQHGZWSV.js +63 -0
- package/chunk-KTI2WDDG.js +24674 -0
- package/chunk-KUG52IAP.js +8 -0
- package/chunk-KX6YBIHG.js +8 -0
- package/chunk-LCBAMY2M.js +60 -0
- package/chunk-LM25IZBJ.js +902 -0
- package/chunk-LM6IYQ3F.js +16 -0
- package/chunk-M76ECQRD.js +13658 -0
- package/chunk-MRC4Q34M.js +188 -0
- package/chunk-NE3E3XJ2.js +936 -0
- package/chunk-NXZGF7F7.js +2878 -0
- package/chunk-OF5H3QWS.js +300 -0
- package/chunk-OLZBQWZU.js +6 -0
- package/chunk-OVGXXUVI.js +91 -0
- package/chunk-OWOHNGCN.js +50 -0
- package/chunk-PN7AFLOK.js +3401 -0
- package/chunk-QSJ3HFEF.js +8 -0
- package/chunk-QYXLLLGL.js +4519 -0
- package/chunk-ROWQEJRP.js +139 -0
- package/chunk-S7Z2HMCN.js +25 -0
- package/chunk-SL3EPWB4.js +1949 -0
- package/chunk-TDIQFT2F.js +301 -0
- package/chunk-TILFE6LV.js +381 -0
- package/chunk-U4TRT5V4.js +246 -0
- package/chunk-U6VC4MU4.js +8 -0
- package/chunk-UAD2WT54.js +64 -0
- package/chunk-USZDUWOV.js +191 -0
- package/chunk-USZMK5UT.js +105 -0
- package/chunk-UVPF33PW.js +46995 -0
- package/chunk-V2F4OGYM.js +9013 -0
- package/chunk-VEJLAVTC.js +2052 -0
- package/chunk-VF4K2QE6.js +21 -0
- package/chunk-VHBWHNVT.js +59 -0
- package/chunk-VIDPVFP3.js +20 -0
- package/chunk-VP4WJWKW.js +8882 -0
- package/chunk-VQ2AJRGD.js +148 -0
- package/chunk-W4NVOSFF.js +37 -0
- package/chunk-WWC7I6TA.js +8 -0
- package/chunk-X7W4TNB4.js +1550 -0
- package/chunk-XDVAYP26.js +537 -0
- package/chunk-XKIMRZO2.js +221 -0
- package/chunk-Y5GCAMGP.js +9 -0
- package/chunk-YD43KPCK.js +360 -0
- package/chunk-YIJFUVKA.js +34 -0
- package/chunk-Z4NR32XR.js +50 -0
- package/chunk-ZNFJWEN4.js +56 -0
- package/cliExecutor-DNE7TCC4.js +36 -0
- package/clipboardy-BVE3LVEH.js +12001 -0
- package/createAgentAutomationAction-3QTGNYJC.js +864 -0
- package/createDialogAction-5YX3ARBK.js +52 -0
- package/createPageAction-EQNQQRCW.js +169 -0
- package/db-HCJ5PRB5.js +271 -0
- package/dbSlice-C4UJLRZP.js +59 -0
- package/deleteFile-4SKGPHOZ.js +41 -0
- package/dialogCommands-AOQS23FV.js +59 -0
- package/dialogSlice-GZE3NCMC.js +146 -0
- package/docCreateCommands-GVOQVJON.js +215 -0
- package/docDeleteCommands-GEB7YAUZ.js +176 -0
- package/docReadCommands-XYKI2DF2.js +129 -0
- package/docStore-MLM5AME5.js +96 -0
- package/docUpdateCommands-4L3RAMHZ.js +313 -0
- package/fetchMessages-JOCYIFKL.js +16 -0
- package/getPricing-PWPJ6MNV.js +30 -0
- package/handleSendMessageAction-WG2GKTGZ.js +183 -0
- package/index.js +188 -113035
- package/localDialogRead-D3BELSTF.js +26 -0
- package/localFirstLog-DHNOY2NA.js +19 -0
- package/localRuntimeAuthority-TEGCOWX4.js +471 -0
- package/localRuntimeDb-LGDF6FQP.js +12 -0
- package/machineCommands-ZNXKLH6Q.js +774 -0
- package/machineInfo-M6KB6HZN.js +10 -0
- package/machineWsRunDispatch-7WRG6HNV.js +105 -0
- package/memoryCommands-O4MIPIWQ.js +476 -0
- package/models-XLEOET3E.js +9 -0
- package/offlineMarxistsAgentCommand-BCPJITJL.js +242 -0
- package/package.json +3 -25
- package/read-RIJCIVKX.js +17 -0
- package/readDocTool-GZD2N3LO.js +16 -0
- package/readlineWorkspace-AQURUDN4.js +5357 -0
- package/removeDialogAgentAction-CXLST3N6.js +72 -0
- package/runAgentClientLoop-VQUEKGA5.js +288 -0
- package/runtimeDoctorCommands-LRHLPDRC.js +289 -0
- package/setDialogExtraReferencesAction-LP6VYGU7.js +59 -0
- package/setPrimaryDialogAgentAction-D3GGH23T.js +79 -0
- package/settingSlice-J4I3Z5H7.js +198 -0
- package/skillSummaryMarker-42HKSXYY.js +9 -0
- package/slateToRenderMarkdown-Y5IYN73U.js +7 -0
- package/slateUtils-2M7MUTWX.js +19 -0
- package/spaceCommands-R2RXD5UY.js +450 -0
- package/spaceSlice-5UT4JNIN.js +145 -0
- package/streamAgentChatTurn-NRWSQKFN.js +4503 -0
- package/tableCommands-66XEWHAK.js +1286 -0
- package/toolApiClient-QI3YBNWB.js +26 -0
- package/tools-TNMUDDRK.js +83 -0
- package/understanding-HCSFPE7R.js +318 -0
- package/updateCommands-VOSPKXFF.js +31 -0
- package/updateDialogTitleAction-IXOKAVX3.js +185 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getCredentialsDir
|
|
3
|
+
} from "./chunk-JZPBVBIY.js";
|
|
4
|
+
import {
|
|
5
|
+
asNonEmptyStringArray
|
|
6
|
+
} from "./chunk-PN7AFLOK.js";
|
|
7
|
+
import {
|
|
8
|
+
asTrimmedString
|
|
9
|
+
} from "./chunk-3EUW3WEO.js";
|
|
10
|
+
import {
|
|
11
|
+
asOptionalPositiveFiniteNumber
|
|
12
|
+
} from "./chunk-U6VC4MU4.js";
|
|
13
|
+
import {
|
|
14
|
+
isRecord
|
|
15
|
+
} from "./chunk-KUG52IAP.js";
|
|
16
|
+
|
|
17
|
+
// packages/agent-runtime/fileCredentialBroker.ts
|
|
18
|
+
import {
|
|
19
|
+
chmodSync,
|
|
20
|
+
existsSync,
|
|
21
|
+
mkdirSync,
|
|
22
|
+
readFileSync,
|
|
23
|
+
unlinkSync,
|
|
24
|
+
writeFileSync
|
|
25
|
+
} from "node:fs";
|
|
26
|
+
import { homedir } from "node:os";
|
|
27
|
+
import { join } from "node:path";
|
|
28
|
+
|
|
29
|
+
// packages/agent-runtime/credentialBroker.ts
|
|
30
|
+
function assertCredentialRef(ref) {
|
|
31
|
+
const trimmed = asTrimmedString(ref);
|
|
32
|
+
if (!trimmed) {
|
|
33
|
+
throw new Error("invalid_ref");
|
|
34
|
+
}
|
|
35
|
+
if (trimmed.includes("..") || trimmed.includes("/") || trimmed.includes("\\")) {
|
|
36
|
+
throw new Error("invalid_ref");
|
|
37
|
+
}
|
|
38
|
+
return trimmed;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// packages/agent-runtime/fileCredentialBroker.ts
|
|
42
|
+
function getApiKeyCredentialsDir(homeDir = homedir()) {
|
|
43
|
+
return join(getCredentialsDir(homeDir), "keys");
|
|
44
|
+
}
|
|
45
|
+
function credentialRefToFileName(ref) {
|
|
46
|
+
const safe = assertCredentialRef(ref).replace(/[^a-zA-Z0-9._-]+/g, "_");
|
|
47
|
+
if (!safe || safe === "." || safe === "..") {
|
|
48
|
+
throw new Error(`Credential ref is not filesystem-safe: ${ref}`);
|
|
49
|
+
}
|
|
50
|
+
return `${safe}.json`;
|
|
51
|
+
}
|
|
52
|
+
function getApiKeyCredentialPath(ref, homeDir = homedir()) {
|
|
53
|
+
return join(getApiKeyCredentialsDir(homeDir), credentialRefToFileName(ref));
|
|
54
|
+
}
|
|
55
|
+
function ensurePrivateDir(dir) {
|
|
56
|
+
mkdirSync(dir, { recursive: true, mode: 448 });
|
|
57
|
+
try {
|
|
58
|
+
chmodSync(dir, 448);
|
|
59
|
+
} catch {
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function writePrivateFile(path, body) {
|
|
63
|
+
writeFileSync(path, body, { encoding: "utf8", mode: 384 });
|
|
64
|
+
try {
|
|
65
|
+
chmodSync(path, 384);
|
|
66
|
+
} catch {
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function readApiKeyCredential(ref, homeDir = homedir()) {
|
|
70
|
+
const path = getApiKeyCredentialPath(ref, homeDir);
|
|
71
|
+
if (!existsSync(path)) return null;
|
|
72
|
+
try {
|
|
73
|
+
const raw = readFileSync(path, "utf8");
|
|
74
|
+
const parsed = JSON.parse(raw);
|
|
75
|
+
if (typeof parsed?.secret !== "string" || !parsed.secret) return null;
|
|
76
|
+
return parsed.secret;
|
|
77
|
+
} catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function writeApiKeyCredential(ref, secret, homeDir = homedir(), now = Date.now()) {
|
|
82
|
+
const trimmedSecret = secret.trim();
|
|
83
|
+
if (!trimmedSecret) {
|
|
84
|
+
throw new Error("Cannot store an empty credential secret.");
|
|
85
|
+
}
|
|
86
|
+
assertCredentialRef(ref);
|
|
87
|
+
const dir = getApiKeyCredentialsDir(homeDir);
|
|
88
|
+
ensurePrivateDir(dir);
|
|
89
|
+
const path = getApiKeyCredentialPath(ref, homeDir);
|
|
90
|
+
const payload = {
|
|
91
|
+
secret: trimmedSecret,
|
|
92
|
+
updatedAt: now
|
|
93
|
+
};
|
|
94
|
+
writePrivateFile(path, `${JSON.stringify(payload, null, 2)}
|
|
95
|
+
`);
|
|
96
|
+
}
|
|
97
|
+
function removeApiKeyCredential(ref, homeDir = homedir()) {
|
|
98
|
+
assertCredentialRef(ref);
|
|
99
|
+
const path = getApiKeyCredentialPath(ref, homeDir);
|
|
100
|
+
if (!existsSync(path)) return;
|
|
101
|
+
unlinkSync(path);
|
|
102
|
+
}
|
|
103
|
+
function hasApiKeyCredential(ref, homeDir = homedir()) {
|
|
104
|
+
return readApiKeyCredential(ref, homeDir) !== null;
|
|
105
|
+
}
|
|
106
|
+
function createFileCredentialBroker(options = {}) {
|
|
107
|
+
const homeDir = options.homeDir ?? homedir();
|
|
108
|
+
const now = options.now ?? Date.now;
|
|
109
|
+
return {
|
|
110
|
+
get(ref) {
|
|
111
|
+
return readApiKeyCredential(ref, homeDir);
|
|
112
|
+
},
|
|
113
|
+
put(ref, secret) {
|
|
114
|
+
writeApiKeyCredential(ref, secret, homeDir, now());
|
|
115
|
+
},
|
|
116
|
+
delete(ref) {
|
|
117
|
+
removeApiKeyCredential(ref, homeDir);
|
|
118
|
+
},
|
|
119
|
+
has(ref) {
|
|
120
|
+
return hasApiKeyCredential(ref, homeDir);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// packages/agent-runtime/migrateAgentSecrets.ts
|
|
126
|
+
function buildAgentApiKeyCredentialRef(agentKey) {
|
|
127
|
+
const key = asTrimmedString(agentKey);
|
|
128
|
+
if (!key) throw new Error("agentKey is required to build a credential ref.");
|
|
129
|
+
return `api-key:${key}`;
|
|
130
|
+
}
|
|
131
|
+
function readRawApiKey(agent) {
|
|
132
|
+
return asTrimmedString(agent.apiKey);
|
|
133
|
+
}
|
|
134
|
+
function resolveTargetRef(agent) {
|
|
135
|
+
const fromCredential = asTrimmedString(agent.credentialRef);
|
|
136
|
+
if (fromCredential) return fromCredential;
|
|
137
|
+
const fromApiKeyRef = asTrimmedString(agent.apiKeyRef);
|
|
138
|
+
if (fromApiKeyRef.startsWith("api-key:")) return fromApiKeyRef;
|
|
139
|
+
return buildAgentApiKeyCredentialRef(agent.key);
|
|
140
|
+
}
|
|
141
|
+
async function brokerHas(broker, ref) {
|
|
142
|
+
return Boolean(await broker.has(ref));
|
|
143
|
+
}
|
|
144
|
+
async function brokerPut(broker, ref, secret) {
|
|
145
|
+
await broker.put(ref, secret);
|
|
146
|
+
}
|
|
147
|
+
async function migrateAgentSecrets(args) {
|
|
148
|
+
const { agent, broker } = args;
|
|
149
|
+
const raw = readRawApiKey(agent);
|
|
150
|
+
const migration = asTrimmedString(agent.credentialMigration);
|
|
151
|
+
if (migration === "done" && !raw) {
|
|
152
|
+
const ref = typeof agent.credentialRef === "string" && agent.credentialRef.trim() || (typeof agent.apiKeyRef === "string" && agent.apiKeyRef.startsWith("api-key:") ? agent.apiKeyRef.trim() : "") || void 0;
|
|
153
|
+
return {
|
|
154
|
+
updates: {},
|
|
155
|
+
status: "already-done",
|
|
156
|
+
...ref ? { credentialRef: ref } : {},
|
|
157
|
+
phase: "complete"
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
if (!raw && migration !== "pending") {
|
|
161
|
+
return { updates: {}, status: "noop", phase: "none" };
|
|
162
|
+
}
|
|
163
|
+
const targetRef = resolveTargetRef(agent);
|
|
164
|
+
if (raw) {
|
|
165
|
+
await brokerPut(broker, targetRef, raw);
|
|
166
|
+
const stored2 = await brokerHas(broker, targetRef);
|
|
167
|
+
if (!stored2) {
|
|
168
|
+
return {
|
|
169
|
+
updates: {
|
|
170
|
+
credentialRef: targetRef,
|
|
171
|
+
credentialMigration: "pending"
|
|
172
|
+
},
|
|
173
|
+
status: "resumed-pending",
|
|
174
|
+
credentialRef: targetRef,
|
|
175
|
+
phase: "put"
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
updates: {
|
|
180
|
+
apiKey: null,
|
|
181
|
+
credentialRef: targetRef,
|
|
182
|
+
// Keep apiKeyRef for resolution if not already an OAuth provider name.
|
|
183
|
+
// Prefer explicit credentialRef; set apiKeyRef only when empty so OAuth agents stay intact.
|
|
184
|
+
...!(typeof agent.apiKeyRef === "string" && agent.apiKeyRef.trim()) ? { apiKeyRef: targetRef } : {},
|
|
185
|
+
credentialMigration: "done"
|
|
186
|
+
},
|
|
187
|
+
status: migration === "pending" ? "resumed-pending" : "migrated",
|
|
188
|
+
credentialRef: targetRef,
|
|
189
|
+
phase: "strip"
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const stored = await brokerHas(broker, targetRef);
|
|
193
|
+
if (stored) {
|
|
194
|
+
return {
|
|
195
|
+
updates: {
|
|
196
|
+
credentialRef: targetRef,
|
|
197
|
+
credentialMigration: "done",
|
|
198
|
+
...!(typeof agent.apiKeyRef === "string" && agent.apiKeyRef.trim()) ? { apiKeyRef: targetRef } : {}
|
|
199
|
+
},
|
|
200
|
+
status: "resumed-pending",
|
|
201
|
+
credentialRef: targetRef,
|
|
202
|
+
phase: "complete"
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
updates: {
|
|
207
|
+
credentialRef: targetRef,
|
|
208
|
+
credentialMigration: "pending"
|
|
209
|
+
},
|
|
210
|
+
status: "awaiting-secret",
|
|
211
|
+
credentialRef: targetRef,
|
|
212
|
+
phase: "put"
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function applyAgentSecretMigrationUpdates(record, updates) {
|
|
216
|
+
const next = { ...record };
|
|
217
|
+
if ("apiKey" in updates) {
|
|
218
|
+
if (updates.apiKey === null || updates.apiKey === "") {
|
|
219
|
+
delete next.apiKey;
|
|
220
|
+
} else if (typeof updates.apiKey === "string") {
|
|
221
|
+
next.apiKey = updates.apiKey;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (updates.apiKeyRef !== void 0) next.apiKeyRef = updates.apiKeyRef;
|
|
225
|
+
if (updates.credentialRef !== void 0) next.credentialRef = updates.credentialRef;
|
|
226
|
+
if (updates.credentialMigration !== void 0) {
|
|
227
|
+
next.credentialMigration = updates.credentialMigration;
|
|
228
|
+
}
|
|
229
|
+
return next;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// packages/agent-runtime/runtimeToolPolicy.ts
|
|
233
|
+
function unique(values) {
|
|
234
|
+
return [...new Set(values)];
|
|
235
|
+
}
|
|
236
|
+
function normalizeAgentRuntimeToolPolicy(value) {
|
|
237
|
+
if (!isRecord(value)) return void 0;
|
|
238
|
+
return {
|
|
239
|
+
version: 1,
|
|
240
|
+
...asNonEmptyStringArray(value.agentTools).length ? { agentTools: unique(asNonEmptyStringArray(value.agentTools)) } : {},
|
|
241
|
+
...asNonEmptyStringArray(value.runtimeTools).length ? { runtimeTools: unique(asNonEmptyStringArray(value.runtimeTools)) } : {},
|
|
242
|
+
...isRecord(value.workspace) ? { workspace: { ...value.workspace } } : {},
|
|
243
|
+
...isRecord(value.shell) ? { shell: { ...value.shell } } : {},
|
|
244
|
+
...isRecord(value.isolation) ? { isolation: { ...value.isolation } } : {},
|
|
245
|
+
...isRecord(value.git) ? { git: { ...value.git } } : {},
|
|
246
|
+
...isRecord(value.budget) ? { budget: { ...value.budget } } : {},
|
|
247
|
+
...isRecord(value.audit) ? { audit: { ...value.audit } } : {}
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
function runtimeBindingRecord(runtimeBinding) {
|
|
251
|
+
return isRecord(runtimeBinding) ? runtimeBinding : void 0;
|
|
252
|
+
}
|
|
253
|
+
function runtimeToolNamesFromPolicy(policy) {
|
|
254
|
+
return asNonEmptyStringArray(policy?.runtimeTools);
|
|
255
|
+
}
|
|
256
|
+
function readPositiveNumber(value) {
|
|
257
|
+
return asOptionalPositiveFiniteNumber(Number(value));
|
|
258
|
+
}
|
|
259
|
+
function resolveRequestedRuntimeToolNames(args) {
|
|
260
|
+
const runtimeBinding = runtimeBindingRecord(args.agentConfig.runtimeBinding);
|
|
261
|
+
const bindingPolicy = normalizeAgentRuntimeToolPolicy(
|
|
262
|
+
runtimeBinding?.runtimeToolPolicy
|
|
263
|
+
);
|
|
264
|
+
const bindingSnapshotPolicy = normalizeAgentRuntimeToolPolicy(
|
|
265
|
+
runtimeBinding?.runtimeToolPolicySnapshot
|
|
266
|
+
);
|
|
267
|
+
return unique([
|
|
268
|
+
...asNonEmptyStringArray(args.agentConfig.toolNames),
|
|
269
|
+
...runtimeToolNamesFromPolicy(
|
|
270
|
+
normalizeAgentRuntimeToolPolicy(args.agentConfig.runtimeToolPolicy)
|
|
271
|
+
),
|
|
272
|
+
...runtimeToolNamesFromPolicy(bindingPolicy),
|
|
273
|
+
...runtimeToolNamesFromPolicy(bindingSnapshotPolicy)
|
|
274
|
+
]);
|
|
275
|
+
}
|
|
276
|
+
function resolveCurrentRunRuntimeToolPolicy(agentConfig) {
|
|
277
|
+
const runtimeBinding = runtimeBindingRecord(agentConfig?.runtimeBinding);
|
|
278
|
+
return normalizeAgentRuntimeToolPolicy(
|
|
279
|
+
runtimeBinding?.runtimeToolPolicySnapshot ?? agentConfig?.runtimeToolPolicy ?? runtimeBinding?.runtimeToolPolicy
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
function resolveLocalRuntimeEnvFromPolicy(runtimeEnv, policy) {
|
|
283
|
+
return { ...runtimeEnv };
|
|
284
|
+
}
|
|
285
|
+
function resolveLocalWorkspaceExecutorOptionsFromPolicy(policy) {
|
|
286
|
+
const maxOutputBytes = readPositiveNumber(policy?.shell?.maxOutputBytes);
|
|
287
|
+
return {
|
|
288
|
+
...maxOutputBytes ? { commandOutputLimit: Math.floor(maxOutputBytes) } : {}
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export {
|
|
293
|
+
createFileCredentialBroker,
|
|
294
|
+
migrateAgentSecrets,
|
|
295
|
+
applyAgentSecretMigrationUpdates,
|
|
296
|
+
normalizeAgentRuntimeToolPolicy,
|
|
297
|
+
resolveRequestedRuntimeToolNames,
|
|
298
|
+
resolveCurrentRunRuntimeToolPolicy,
|
|
299
|
+
resolveLocalRuntimeEnvFromPolicy,
|
|
300
|
+
resolveLocalWorkspaceExecutorOptionsFromPolicy
|
|
301
|
+
};
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import {
|
|
2
|
+
asOptionalFiniteNumber
|
|
3
|
+
} from "./chunk-WWC7I6TA.js";
|
|
4
|
+
import {
|
|
5
|
+
asTrimmedString
|
|
6
|
+
} from "./chunk-3EUW3WEO.js";
|
|
7
|
+
import {
|
|
8
|
+
asOptionalTrimmedString
|
|
9
|
+
} from "./chunk-G3SUCT4W.js";
|
|
10
|
+
import {
|
|
11
|
+
isRecord
|
|
12
|
+
} from "./chunk-KUG52IAP.js";
|
|
13
|
+
|
|
14
|
+
// packages/agent-runtime/agentRecordConfig.ts
|
|
15
|
+
function stringField(record, key) {
|
|
16
|
+
const value = record[key];
|
|
17
|
+
return typeof value === "string" ? value : void 0;
|
|
18
|
+
}
|
|
19
|
+
function numberField(record, key) {
|
|
20
|
+
return asOptionalFiniteNumber(record[key]);
|
|
21
|
+
}
|
|
22
|
+
function objectField(record, key) {
|
|
23
|
+
const value = record[key];
|
|
24
|
+
return isRecord(value) ? value : void 0;
|
|
25
|
+
}
|
|
26
|
+
function appendUniqueStrings(values, next) {
|
|
27
|
+
if (!Array.isArray(next)) return values;
|
|
28
|
+
const seen = new Set(values);
|
|
29
|
+
for (const value of next) {
|
|
30
|
+
const toolName = typeof value === "string" ? value : isRecord(value) && typeof value.name === "string" ? value.name : isRecord(value) && isRecord(value.function) && typeof value.function.name === "string" ? value.function.name : "";
|
|
31
|
+
if (toolName && !seen.has(toolName)) {
|
|
32
|
+
seen.add(toolName);
|
|
33
|
+
values.push(toolName);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return values;
|
|
37
|
+
}
|
|
38
|
+
function resolveAgentRuntimeToolNames(record) {
|
|
39
|
+
const tools = appendUniqueStrings(
|
|
40
|
+
appendUniqueStrings([], record.toolNames),
|
|
41
|
+
record.tools
|
|
42
|
+
);
|
|
43
|
+
return tools.length > 0 ? tools : void 0;
|
|
44
|
+
}
|
|
45
|
+
function resolveAgentRuntimeConfigFromRecord(key, record) {
|
|
46
|
+
const name = stringField(record, "name");
|
|
47
|
+
const prompt = stringField(record, "prompt");
|
|
48
|
+
const model = stringField(record, "model");
|
|
49
|
+
const apiSource = stringField(record, "apiSource");
|
|
50
|
+
const cliProvider = stringField(record, "cliProvider");
|
|
51
|
+
const customProviderUrl = stringField(record, "customProviderUrl");
|
|
52
|
+
const apiKey = stringField(record, "apiKey");
|
|
53
|
+
const apiKeyHeader = stringField(record, "apiKeyHeader");
|
|
54
|
+
const apiKeyFromAgentKey = stringField(record, "apiKeyFromAgentKey");
|
|
55
|
+
const apiKeyRef = stringField(record, "apiKeyRef");
|
|
56
|
+
const credentialRef = stringField(record, "credentialRef");
|
|
57
|
+
const credentialSynced = record.credentialSynced === true;
|
|
58
|
+
const useServerProxy = record.useServerProxy === true;
|
|
59
|
+
const provider = stringField(record, "provider") ?? stringField(record, "apiSource");
|
|
60
|
+
const toolNames = resolveAgentRuntimeToolNames(record);
|
|
61
|
+
const temperature = numberField(record, "temperature");
|
|
62
|
+
const topP = numberField(record, "top_p");
|
|
63
|
+
const frequencyPenalty = numberField(record, "frequency_penalty");
|
|
64
|
+
const presencePenalty = numberField(record, "presence_penalty");
|
|
65
|
+
const maxTokens = numberField(record, "max_tokens");
|
|
66
|
+
const reasoningEffort = stringField(record, "reasoning_effort") || stringField(record, "reasoningEffort");
|
|
67
|
+
const runtimeBinding = objectField(record, "runtimeBinding");
|
|
68
|
+
const runtimeToolPolicy = objectField(record, "runtimeToolPolicy") ?? objectField(runtimeBinding ?? {}, "runtimeToolPolicy");
|
|
69
|
+
const delegation = objectField(record, "delegation");
|
|
70
|
+
return {
|
|
71
|
+
key,
|
|
72
|
+
...name ? { name } : {},
|
|
73
|
+
...prompt ? { prompt } : {},
|
|
74
|
+
...model ? { model } : {},
|
|
75
|
+
...provider ? { provider } : {},
|
|
76
|
+
...apiSource ? { apiSource } : {},
|
|
77
|
+
...cliProvider ? { cliProvider } : {},
|
|
78
|
+
...customProviderUrl ? { customProviderUrl } : {},
|
|
79
|
+
...apiKey ? { apiKey } : {},
|
|
80
|
+
...apiKeyHeader ? { apiKeyHeader } : {},
|
|
81
|
+
...apiKeyFromAgentKey ? { apiKeyFromAgentKey } : {},
|
|
82
|
+
...apiKeyRef ? { apiKeyRef } : {},
|
|
83
|
+
...credentialRef ? { credentialRef } : {},
|
|
84
|
+
...credentialSynced ? { credentialSynced } : {},
|
|
85
|
+
...useServerProxy ? { useServerProxy } : {},
|
|
86
|
+
...toolNames ? { toolNames } : {},
|
|
87
|
+
...temperature !== void 0 ? { temperature } : {},
|
|
88
|
+
...topP !== void 0 ? { top_p: topP } : {},
|
|
89
|
+
...frequencyPenalty !== void 0 ? { frequency_penalty: frequencyPenalty } : {},
|
|
90
|
+
...presencePenalty !== void 0 ? { presence_penalty: presencePenalty } : {},
|
|
91
|
+
...maxTokens !== void 0 ? { max_tokens: maxTokens } : {},
|
|
92
|
+
...reasoningEffort ? { reasoning_effort: reasoningEffort } : {},
|
|
93
|
+
...runtimeBinding ? { runtimeBinding } : {},
|
|
94
|
+
...runtimeToolPolicy ? { runtimeToolPolicy } : {},
|
|
95
|
+
...delegation ? { delegation } : {},
|
|
96
|
+
rawRecord: record
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// packages/agent-runtime/desktopRequestSnapshot.ts
|
|
101
|
+
var DESKTOP_AGENT_CONFIG_SNAPSHOT_STRING_FIELDS = [
|
|
102
|
+
"name",
|
|
103
|
+
"prompt",
|
|
104
|
+
"provider",
|
|
105
|
+
"model",
|
|
106
|
+
"apiSource",
|
|
107
|
+
"cliProvider",
|
|
108
|
+
"customProviderUrl",
|
|
109
|
+
"credentialRef",
|
|
110
|
+
"apiKeyRef",
|
|
111
|
+
"apiKeyHeader",
|
|
112
|
+
"reasoning_effort",
|
|
113
|
+
"reasoningEffort"
|
|
114
|
+
];
|
|
115
|
+
var DESKTOP_AGENT_CONFIG_SNAPSHOT_NUMBER_FIELDS = [
|
|
116
|
+
"temperature",
|
|
117
|
+
"top_p",
|
|
118
|
+
"frequency_penalty",
|
|
119
|
+
"presence_penalty",
|
|
120
|
+
"max_tokens"
|
|
121
|
+
];
|
|
122
|
+
var DESKTOP_AGENT_CONFIG_SNAPSHOT_OBJECT_FIELDS = [
|
|
123
|
+
"runtimeBinding",
|
|
124
|
+
"runtimeToolPolicy",
|
|
125
|
+
"delegation"
|
|
126
|
+
];
|
|
127
|
+
var DESKTOP_AGENT_CONFIG_SNAPSHOT_FORBIDDEN_KEYS = [
|
|
128
|
+
"apiKey",
|
|
129
|
+
"apiKeyFromAgentKey",
|
|
130
|
+
"token",
|
|
131
|
+
"secret",
|
|
132
|
+
"password",
|
|
133
|
+
"accessToken",
|
|
134
|
+
"refreshToken",
|
|
135
|
+
"authorization",
|
|
136
|
+
"authToken",
|
|
137
|
+
"AUTH_TOKEN",
|
|
138
|
+
"AUTH",
|
|
139
|
+
"clientSecret",
|
|
140
|
+
"privateKey",
|
|
141
|
+
"bearer"
|
|
142
|
+
];
|
|
143
|
+
var DESKTOP_TOOL_CALL_ARGUMENTS_MAX_CHARS = 8192;
|
|
144
|
+
var REDACTED_SECRET_PLACEHOLDER = "[redacted]";
|
|
145
|
+
var FORBIDDEN_KEY_SET = new Set(
|
|
146
|
+
DESKTOP_AGENT_CONFIG_SNAPSHOT_FORBIDDEN_KEYS.map((k) => k.toLowerCase())
|
|
147
|
+
);
|
|
148
|
+
function isForbiddenKey(key) {
|
|
149
|
+
return FORBIDDEN_KEY_SET.has(key.toLowerCase());
|
|
150
|
+
}
|
|
151
|
+
function isDesktopSnapshotSensitivePropertyName(key) {
|
|
152
|
+
return isForbiddenKey(key);
|
|
153
|
+
}
|
|
154
|
+
function redactSensitiveJsonTree(value, depth = 0) {
|
|
155
|
+
if (depth > 6) return null;
|
|
156
|
+
if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
157
|
+
return value;
|
|
158
|
+
}
|
|
159
|
+
if (Array.isArray(value)) {
|
|
160
|
+
return value.map((item) => redactSensitiveJsonTree(item, depth + 1));
|
|
161
|
+
}
|
|
162
|
+
if (typeof value !== "object") return null;
|
|
163
|
+
const out = {};
|
|
164
|
+
for (const [key, child] of Object.entries(value)) {
|
|
165
|
+
if (isDesktopSnapshotSensitivePropertyName(key)) {
|
|
166
|
+
out[key] = REDACTED_SECRET_PLACEHOLDER;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
out[key] = redactSensitiveJsonTree(child, depth + 1);
|
|
170
|
+
}
|
|
171
|
+
return out;
|
|
172
|
+
}
|
|
173
|
+
function sanitizeToolCallArguments(raw, maxChars = DESKTOP_TOOL_CALL_ARGUMENTS_MAX_CHARS) {
|
|
174
|
+
const source = typeof raw === "string" ? raw : raw == null ? "{}" : String(raw);
|
|
175
|
+
let candidate = source;
|
|
176
|
+
try {
|
|
177
|
+
const parsed = JSON.parse(source);
|
|
178
|
+
if (parsed && typeof parsed === "object") {
|
|
179
|
+
candidate = JSON.stringify(redactSensitiveJsonTree(parsed));
|
|
180
|
+
}
|
|
181
|
+
} catch {
|
|
182
|
+
}
|
|
183
|
+
if (candidate.length <= maxChars) return candidate;
|
|
184
|
+
return candidate.slice(0, maxChars);
|
|
185
|
+
}
|
|
186
|
+
function stringField2(record, key) {
|
|
187
|
+
return asOptionalTrimmedString(record[key]);
|
|
188
|
+
}
|
|
189
|
+
function numberField2(record, key) {
|
|
190
|
+
return asOptionalFiniteNumber(record[key]);
|
|
191
|
+
}
|
|
192
|
+
function uniqueToolNames(values) {
|
|
193
|
+
if (!Array.isArray(values)) return void 0;
|
|
194
|
+
const names = [];
|
|
195
|
+
const seen = /* @__PURE__ */ new Set();
|
|
196
|
+
for (const value of values) {
|
|
197
|
+
const name = asTrimmedString(value) || asTrimmedString(value?.name) || asTrimmedString(
|
|
198
|
+
value?.function?.name
|
|
199
|
+
);
|
|
200
|
+
if (!name || seen.has(name)) continue;
|
|
201
|
+
seen.add(name);
|
|
202
|
+
names.push(name);
|
|
203
|
+
}
|
|
204
|
+
return names.length > 0 ? names : void 0;
|
|
205
|
+
}
|
|
206
|
+
function sanitizePlainObject(value, depth = 0) {
|
|
207
|
+
if (!isRecord(value)) return void 0;
|
|
208
|
+
if (depth > 4) return void 0;
|
|
209
|
+
const out = {};
|
|
210
|
+
for (const [key, child] of Object.entries(value)) {
|
|
211
|
+
if (isForbiddenKey(key)) continue;
|
|
212
|
+
if (child === null) {
|
|
213
|
+
out[key] = null;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (typeof child === "string" || typeof child === "number" || typeof child === "boolean") {
|
|
217
|
+
out[key] = child;
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (Array.isArray(child)) {
|
|
221
|
+
const items = child.map((item) => {
|
|
222
|
+
if (item === null || typeof item === "string" || typeof item === "number" || typeof item === "boolean") {
|
|
223
|
+
return item;
|
|
224
|
+
}
|
|
225
|
+
if (isRecord(item)) {
|
|
226
|
+
return sanitizePlainObject(item, depth + 1);
|
|
227
|
+
}
|
|
228
|
+
return void 0;
|
|
229
|
+
}).filter((item) => item !== void 0);
|
|
230
|
+
out[key] = items;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
if (typeof child === "object") {
|
|
234
|
+
const nested = sanitizePlainObject(child, depth + 1);
|
|
235
|
+
if (nested) out[key] = nested;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return out;
|
|
239
|
+
}
|
|
240
|
+
function pickAllowlistedAgentConfigFields(source, dbKey) {
|
|
241
|
+
const snapshot = { dbKey };
|
|
242
|
+
for (const key of DESKTOP_AGENT_CONFIG_SNAPSHOT_STRING_FIELDS) {
|
|
243
|
+
if (key === "reasoningEffort") continue;
|
|
244
|
+
const value = stringField2(source, key);
|
|
245
|
+
if (value !== void 0) {
|
|
246
|
+
snapshot[key] = value;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const reasoningEffort = stringField2(source, "reasoning_effort") || stringField2(source, "reasoningEffort");
|
|
250
|
+
if (reasoningEffort) snapshot.reasoning_effort = reasoningEffort;
|
|
251
|
+
for (const key of DESKTOP_AGENT_CONFIG_SNAPSHOT_NUMBER_FIELDS) {
|
|
252
|
+
const value = numberField2(source, key);
|
|
253
|
+
if (value !== void 0) {
|
|
254
|
+
snapshot[key] = value;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (source.useServerProxy === true) {
|
|
258
|
+
snapshot.useServerProxy = true;
|
|
259
|
+
} else if (source.useServerProxy === false) {
|
|
260
|
+
snapshot.useServerProxy = false;
|
|
261
|
+
}
|
|
262
|
+
const tools = uniqueToolNames(source.tools) ?? uniqueToolNames(source.toolNames);
|
|
263
|
+
if (tools) snapshot.tools = tools;
|
|
264
|
+
for (const key of DESKTOP_AGENT_CONFIG_SNAPSHOT_OBJECT_FIELDS) {
|
|
265
|
+
const value = sanitizePlainObject(source[key]);
|
|
266
|
+
if (value) {
|
|
267
|
+
snapshot[key] = value;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return snapshot;
|
|
271
|
+
}
|
|
272
|
+
function buildDesktopAgentRuntimeAgentConfigSnapshot(source, agentRef) {
|
|
273
|
+
if (!isRecord(source)) return null;
|
|
274
|
+
const ref = asTrimmedString(agentRef);
|
|
275
|
+
if (!ref) return null;
|
|
276
|
+
const claimed = stringField2(source, "dbKey") || stringField2(source, "key");
|
|
277
|
+
if (claimed && claimed !== ref) return null;
|
|
278
|
+
const dbKey = claimed || ref;
|
|
279
|
+
return pickAllowlistedAgentConfigFields(source, dbKey);
|
|
280
|
+
}
|
|
281
|
+
function sanitizeMessageContent(content) {
|
|
282
|
+
if (content === null || content === void 0) return null;
|
|
283
|
+
if (typeof content === "string") return content;
|
|
284
|
+
if (!Array.isArray(content)) return null;
|
|
285
|
+
const parts = [];
|
|
286
|
+
for (const part of content) {
|
|
287
|
+
if (!part || typeof part !== "object") continue;
|
|
288
|
+
const record = part;
|
|
289
|
+
if (record.type === "text" && typeof record.text === "string") {
|
|
290
|
+
parts.push({ type: "text", text: record.text });
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return parts.length > 0 ? parts : null;
|
|
294
|
+
}
|
|
295
|
+
function sanitizeToolCalls(value) {
|
|
296
|
+
if (!Array.isArray(value)) return void 0;
|
|
297
|
+
const calls = [];
|
|
298
|
+
for (const item of value) {
|
|
299
|
+
if (!item || typeof item !== "object") continue;
|
|
300
|
+
const record = item;
|
|
301
|
+
const id = asTrimmedString(record.id);
|
|
302
|
+
const fn = record.function && typeof record.function === "object" ? record.function : null;
|
|
303
|
+
const name = asTrimmedString(fn?.name);
|
|
304
|
+
const rawArgs = typeof fn?.arguments === "string" ? fn.arguments : "{}";
|
|
305
|
+
if (!id || !name) continue;
|
|
306
|
+
calls.push({
|
|
307
|
+
id,
|
|
308
|
+
type: "function",
|
|
309
|
+
function: { name, arguments: sanitizeToolCallArguments(rawArgs) }
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
return calls.length > 0 ? calls : void 0;
|
|
313
|
+
}
|
|
314
|
+
function sanitizeChatMessage(value) {
|
|
315
|
+
if (!isRecord(value)) return null;
|
|
316
|
+
const role = value.role;
|
|
317
|
+
if (role !== "system" && role !== "user" && role !== "assistant" && role !== "tool") {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
const content = sanitizeMessageContent(value.content);
|
|
321
|
+
const message = {
|
|
322
|
+
role,
|
|
323
|
+
content
|
|
324
|
+
};
|
|
325
|
+
const toolCallId = asOptionalTrimmedString(value.tool_call_id) ?? asOptionalTrimmedString(value.toolCallId);
|
|
326
|
+
if (toolCallId) message.tool_call_id = toolCallId;
|
|
327
|
+
const toolCalls = sanitizeToolCalls(value.tool_calls);
|
|
328
|
+
if (toolCalls) message.tool_calls = toolCalls;
|
|
329
|
+
if (typeof value.reasoning_content === "string" && value.reasoning_content) {
|
|
330
|
+
message.reasoning_content = value.reasoning_content;
|
|
331
|
+
}
|
|
332
|
+
return message;
|
|
333
|
+
}
|
|
334
|
+
function buildDesktopAgentRuntimeDialogHistorySnapshot(args) {
|
|
335
|
+
const dialogId = asTrimmedString(args.dialogId);
|
|
336
|
+
if (!dialogId) return null;
|
|
337
|
+
if (!Array.isArray(args.messages)) return null;
|
|
338
|
+
let messages = args.messages.map((item) => sanitizeChatMessage(item)).filter((item) => item !== null);
|
|
339
|
+
messages = messages.filter((msg) => {
|
|
340
|
+
const raw = msg;
|
|
341
|
+
return raw.isStreaming !== true;
|
|
342
|
+
});
|
|
343
|
+
const inputText = normalizeContentToText(args.currentInput);
|
|
344
|
+
if (inputText && messages.length > 0) {
|
|
345
|
+
const last = messages[messages.length - 1];
|
|
346
|
+
if (last.role === "user" && normalizeContentToText(last.content) === inputText) {
|
|
347
|
+
messages = messages.slice(0, -1);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return { dialogId, messages };
|
|
351
|
+
}
|
|
352
|
+
function normalizeContentToText(content) {
|
|
353
|
+
if (typeof content === "string") return content.trim();
|
|
354
|
+
if (!Array.isArray(content)) return "";
|
|
355
|
+
return content.flatMap((part) => part?.type === "text" && part.text ? [part.text] : []).join("\n").trim();
|
|
356
|
+
}
|
|
357
|
+
function assertDesktopAgentRuntimeTurnBodyHasNoRawSecrets(body) {
|
|
358
|
+
if (!body || typeof body !== "object") return;
|
|
359
|
+
const json = JSON.stringify(body);
|
|
360
|
+
const walk = (value, path) => {
|
|
361
|
+
if (!value || typeof value !== "object") return;
|
|
362
|
+
if (Array.isArray(value)) {
|
|
363
|
+
value.forEach((item, index) => walk(item, `${path}[${index}]`));
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
for (const [key, child] of Object.entries(value)) {
|
|
367
|
+
if (isForbiddenKey(key)) {
|
|
368
|
+
throw new Error(`Forbidden secret field in request body at ${path}.${key}`);
|
|
369
|
+
}
|
|
370
|
+
walk(child, path ? `${path}.${key}` : key);
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
walk(body, "");
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
export {
|
|
377
|
+
resolveAgentRuntimeConfigFromRecord,
|
|
378
|
+
buildDesktopAgentRuntimeAgentConfigSnapshot,
|
|
379
|
+
buildDesktopAgentRuntimeDialogHistorySnapshot,
|
|
380
|
+
assertDesktopAgentRuntimeTurnBodyHasNoRawSecrets
|
|
381
|
+
};
|