dsh-lcx-codex 0.4.2 → 0.4.3-pre.13
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/README.md +75 -224
- package/THIRD_PARTY_NOTICES.md +64 -0
- package/cordis.patch.yml +3 -20
- package/lib/auxiliary-usage.js +63 -0
- package/lib/client.js +1398 -167
- package/lib/compact-v2.js +218 -199
- package/lib/dsh-compat.js +294 -100
- package/lib/dsh-responses.js +512 -277
- package/lib/grok-native-search.js +391 -0
- package/lib/index.js +1066 -758
- package/lib/invocation-policy-scope.js +261 -0
- package/lib/json-store.js +57 -31
- package/lib/native-checkpoint.js +520 -194
- package/lib/pi-responses-runtime.js +1571 -0
- package/lib/responses-request.js +109 -121
- package/lib/responses-stream.js +1280 -447
- package/lib/route.js +425 -369
- package/lib/search-accounting.js +86 -0
- package/lib/search-usage.js +86 -0
- package/lib/service-mutex.js +73 -64
- package/lib/token-budget.js +176 -108
- package/lib/transport.js +308 -68
- package/lib/types/client/index.d.ts +18 -0
- package/lib/types/client/search-media.d.ts +16 -0
- package/lib/types/index.d.ts +83 -0
- package/lib/web-run-output.js +189 -18
- package/lib/web-search-alpha.js +1067 -163
- package/lib/web-search-capability.js +80 -65
- package/lib/web-search-hosted.js +321 -33
- package/lib/web-search-ref-store.js +145 -60
- package/package.json +112 -32
- package/ARCHITECTURE.md +0 -117
- package/CHANGELOG.md +0 -224
- package/README_EN.md +0 -277
- package/assets/dsh-lcx-codex-banner.jpg +0 -0
- package/lib/legacy-v3.js +0 -20
- package/lib/responses-replay.js +0 -68
- package/scripts/probe-alpha.mjs +0 -43
- package/scripts/validate-dsh-schema.mjs +0 -31
package/lib/dsh-compat.js
CHANGED
|
@@ -1,124 +1,318 @@
|
|
|
1
|
-
import { symbols as cordisSymbols } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { symbols as cordisSymbols } from "@deepseek-ai/cordis";
|
|
2
|
+
import { Session, SessionId, } from "@deepseek-ai/dsh-session";
|
|
3
|
+
function mutableService(value) {
|
|
4
|
+
return (value !== null && (typeof value === "object" || typeof value === "function"));
|
|
5
|
+
}
|
|
6
|
+
function agentLike(value) {
|
|
7
|
+
return mutableService(value) ? value : undefined;
|
|
8
|
+
}
|
|
9
|
+
function agentSession(value) {
|
|
10
|
+
return mutableService(value) ? value : undefined;
|
|
11
|
+
}
|
|
12
|
+
export function agentSessionId(agent) {
|
|
13
|
+
return String(agentSession(agentLike(agent)?.session)?.id ?? "");
|
|
14
|
+
}
|
|
15
|
+
export function agentUsesSession(agent, session) {
|
|
16
|
+
return agentLike(agent)?.session === session;
|
|
17
|
+
}
|
|
18
|
+
export function sessionFromAgent(agent) {
|
|
19
|
+
const session = agentLike(agent)?.session;
|
|
20
|
+
return session instanceof Session ? session : undefined;
|
|
21
|
+
}
|
|
5
22
|
export function readAgentRouteState(agent) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function
|
|
14
|
-
|
|
15
|
-
|
|
23
|
+
const value = agentLike(agent);
|
|
24
|
+
return {
|
|
25
|
+
requestConfig: agentSession(value?.session)?.requestHeader?.()?.config,
|
|
26
|
+
options: value?.options,
|
|
27
|
+
sessionId: agentSessionId(value),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function scopedToolRuntime(agent) {
|
|
31
|
+
const tools = resolveScopedService(agent, "tools");
|
|
32
|
+
if (!mutableService(tools) || typeof tools.register !== "function")
|
|
33
|
+
return undefined;
|
|
34
|
+
return {
|
|
35
|
+
register: tools.register.bind(tools),
|
|
36
|
+
...(typeof tools.get === "function"
|
|
37
|
+
? { get: tools.get.bind(tools) }
|
|
38
|
+
: {}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function tokenMeterTotal(value, session) {
|
|
42
|
+
if (!mutableService(value) || typeof value.measure !== "function")
|
|
43
|
+
return undefined;
|
|
44
|
+
const measurement = Reflect.apply(value.measure, value, [session]);
|
|
45
|
+
if (!mutableService(measurement) || typeof measurement.totalTokens !== "number")
|
|
46
|
+
return undefined;
|
|
47
|
+
return Number.isFinite(measurement.totalTokens) ? measurement.totalTokens : undefined;
|
|
48
|
+
}
|
|
49
|
+
export function sessionsService(ctx) {
|
|
50
|
+
const service = resolveContextService(ctx, "sessions");
|
|
51
|
+
if (!mutableService(service) || typeof service.get !== "function")
|
|
52
|
+
return undefined;
|
|
53
|
+
return {
|
|
54
|
+
get(id) {
|
|
55
|
+
const value = Reflect.apply(service.get, service, [id]);
|
|
56
|
+
return value instanceof Session ? value : undefined;
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function sessionFor(ctx, sessionId) {
|
|
61
|
+
return sessionId
|
|
62
|
+
? sessionsService(ctx)?.get(SessionId(sessionId))
|
|
63
|
+
: undefined;
|
|
64
|
+
}
|
|
16
65
|
export function readWebSearchProvider(ctx) {
|
|
17
|
-
|
|
66
|
+
const web = resolveContextService(ctx, "web");
|
|
67
|
+
if (!mutableService(web))
|
|
68
|
+
return undefined;
|
|
69
|
+
try {
|
|
70
|
+
return Reflect.get(web, "searchProviderId");
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
18
75
|
}
|
|
19
|
-
|
|
20
76
|
export function writeWebSearchProvider(ctx, providerId) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
77
|
+
const web = resolveContextService(ctx, "web");
|
|
78
|
+
if (!mutableService(web))
|
|
79
|
+
return false;
|
|
80
|
+
try {
|
|
81
|
+
if (!Reflect.set(web, "searchProviderId", providerId))
|
|
82
|
+
return false;
|
|
83
|
+
return Reflect.get(web, "searchProviderId") === providerId;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export function contextService(ctx, name) {
|
|
90
|
+
if (!mutableService(ctx))
|
|
91
|
+
return undefined;
|
|
92
|
+
const get = ctx.get;
|
|
93
|
+
return ((typeof get === "function" ? Reflect.apply(get, ctx, [name]) : undefined) ??
|
|
94
|
+
ctx[name]);
|
|
95
|
+
}
|
|
30
96
|
export function resolveContextService(ctx, name) {
|
|
31
|
-
|
|
97
|
+
try {
|
|
98
|
+
return contextService(ctx, name);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export function resolveScopedService(agent, name) {
|
|
105
|
+
return resolveContextService(agentLike(agent)?.ctx, name);
|
|
32
106
|
}
|
|
33
|
-
|
|
34
|
-
export function resolveScopedService(agent, name) { return resolveContextService(agent?.ctx, name) }
|
|
35
|
-
|
|
36
107
|
export function resolveAgentService(ctx, agent, name) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
108
|
+
const agentPresets = resolveContextService(ctx, "agentPresets");
|
|
109
|
+
if (!mutableService(agentPresets) ||
|
|
110
|
+
typeof agentPresets.serviceFor !== "function")
|
|
111
|
+
return undefined;
|
|
112
|
+
try {
|
|
113
|
+
return Reflect.apply(agentPresets.serviceFor, agentPresets, [agent, name]);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
45
119
|
export function concreteService(value) {
|
|
46
|
-
|
|
120
|
+
if (!mutableService(value))
|
|
121
|
+
return value;
|
|
122
|
+
try {
|
|
123
|
+
return value[cordisSymbols.original] ?? value;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return value;
|
|
127
|
+
}
|
|
47
128
|
}
|
|
48
|
-
|
|
49
129
|
export function compactionPatchCandidate(value, records) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
130
|
+
const compaction = concreteService(value);
|
|
131
|
+
if (!mutableService(compaction) ||
|
|
132
|
+
typeof compaction.compactIfNeeded !== "function" ||
|
|
133
|
+
records.has(compaction))
|
|
134
|
+
return undefined;
|
|
135
|
+
let originalOwnDescriptor;
|
|
136
|
+
try {
|
|
137
|
+
originalOwnDescriptor = Object.getOwnPropertyDescriptor(compaction, "compactIfNeeded");
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
compaction: compaction,
|
|
144
|
+
original: compaction.compactIfNeeded,
|
|
145
|
+
originalOwnDescriptor,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function inheritedPropertyDescriptor(target, key) {
|
|
149
|
+
try {
|
|
150
|
+
for (let current = Object.getPrototypeOf(target); current; current = Object.getPrototypeOf(current)) {
|
|
151
|
+
const descriptor = Object.getOwnPropertyDescriptor(current, key);
|
|
152
|
+
if (descriptor)
|
|
153
|
+
return descriptor;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch { }
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
function sameDataDescriptor(left, right) {
|
|
160
|
+
return (left !== undefined &&
|
|
161
|
+
"value" in left &&
|
|
162
|
+
"value" in right &&
|
|
163
|
+
left.value === right.value &&
|
|
164
|
+
left.writable === right.writable &&
|
|
165
|
+
left.enumerable === right.enumerable &&
|
|
166
|
+
left.configurable === right.configurable);
|
|
167
|
+
}
|
|
168
|
+
export function installCompactionPatch(records, candidate, mutex, policyScope, lifecycle, behavior) {
|
|
169
|
+
const { compaction, original, originalOwnDescriptor } = candidate;
|
|
170
|
+
if (originalOwnDescriptor &&
|
|
171
|
+
(!("value" in originalOwnDescriptor) || originalOwnDescriptor.writable !== true))
|
|
172
|
+
return false;
|
|
173
|
+
if (!originalOwnDescriptor) {
|
|
174
|
+
const inherited = inheritedPropertyDescriptor(compaction, "compactIfNeeded");
|
|
175
|
+
if (!inherited || !("value" in inherited) || inherited.writable !== true)
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
const callOriginal = async (agent, trigger, signal) => {
|
|
179
|
+
const result = Reflect.apply(original, compaction, [agent, trigger, signal]);
|
|
180
|
+
return Promise.resolve(result);
|
|
181
|
+
};
|
|
182
|
+
const wrapper = async function (agent, trigger, signal) {
|
|
183
|
+
return behavior(agent, trigger, signal, (activeSignal) => callOriginal(agent, trigger, activeSignal));
|
|
184
|
+
};
|
|
185
|
+
const installedOwnDescriptor = originalOwnDescriptor
|
|
186
|
+
? { ...originalOwnDescriptor, value: wrapper }
|
|
187
|
+
: {
|
|
188
|
+
configurable: true,
|
|
189
|
+
enumerable: true,
|
|
190
|
+
writable: true,
|
|
191
|
+
value: wrapper,
|
|
192
|
+
};
|
|
193
|
+
try {
|
|
194
|
+
Object.defineProperty(compaction, "compactIfNeeded", installedOwnDescriptor);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
if (!sameDataDescriptor(Object.getOwnPropertyDescriptor(compaction, "compactIfNeeded"), installedOwnDescriptor)) {
|
|
200
|
+
try {
|
|
201
|
+
if (originalOwnDescriptor)
|
|
202
|
+
Object.defineProperty(compaction, "compactIfNeeded", originalOwnDescriptor);
|
|
203
|
+
else
|
|
204
|
+
Reflect.deleteProperty(compaction, "compactIfNeeded");
|
|
205
|
+
}
|
|
206
|
+
catch { }
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
records.set(compaction, {
|
|
210
|
+
compaction,
|
|
211
|
+
original,
|
|
212
|
+
originalOwnDescriptor,
|
|
213
|
+
installedOwnDescriptor,
|
|
214
|
+
wrapper,
|
|
215
|
+
mutex,
|
|
216
|
+
policyScope,
|
|
217
|
+
lifecycle,
|
|
218
|
+
});
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
export function restoreCompactionPatches(records, entries = records.values()) {
|
|
222
|
+
for (const record of entries) {
|
|
223
|
+
const current = Object.getOwnPropertyDescriptor(record.compaction, "compactIfNeeded");
|
|
224
|
+
if (!sameDataDescriptor(current, record.installedOwnDescriptor))
|
|
225
|
+
continue;
|
|
226
|
+
try {
|
|
227
|
+
if (record.originalOwnDescriptor)
|
|
228
|
+
Object.defineProperty(record.compaction, "compactIfNeeded", record.originalOwnDescriptor);
|
|
229
|
+
else
|
|
230
|
+
Reflect.deleteProperty(record.compaction, "compactIfNeeded");
|
|
231
|
+
}
|
|
232
|
+
catch { }
|
|
233
|
+
}
|
|
234
|
+
records.clear();
|
|
235
|
+
}
|
|
68
236
|
export function toolResultPrunerState(value) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
237
|
+
const pruner = concreteService(value);
|
|
238
|
+
return mutableService(pruner)
|
|
239
|
+
? { pruner: pruner, original: pruner.pruneSession }
|
|
240
|
+
: { pruner: undefined, original: undefined };
|
|
72
241
|
}
|
|
73
|
-
|
|
74
242
|
export function patchToolResultPruner(state, replacement) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
243
|
+
if (!state.pruner || typeof state.original !== "function")
|
|
244
|
+
return undefined;
|
|
245
|
+
state.pruner.pruneSession = replacement;
|
|
246
|
+
return { pruner: state.pruner, original: state.original, replacement };
|
|
78
247
|
}
|
|
79
|
-
|
|
80
248
|
export function restoreToolResultPruner(record) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
249
|
+
if (record && record.pruner.pruneSession === record.replacement) {
|
|
250
|
+
try {
|
|
251
|
+
record.pruner.pruneSession = record.original;
|
|
252
|
+
}
|
|
253
|
+
catch { }
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
export function compactionConfigState(service) {
|
|
257
|
+
return mutableService(service)
|
|
258
|
+
? { service: service, original: service.config }
|
|
259
|
+
: { service: undefined, original: undefined };
|
|
84
260
|
}
|
|
85
|
-
|
|
86
|
-
export function compactionConfigState(service) { return { service, original: service?.config } }
|
|
87
|
-
|
|
88
261
|
export function patchCompactionConfig(state, createConfig) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
262
|
+
if (!state.original ||
|
|
263
|
+
!state.service ||
|
|
264
|
+
!Object.prototype.hasOwnProperty.call(state.service, "config"))
|
|
265
|
+
return undefined;
|
|
266
|
+
try {
|
|
267
|
+
const installed = createConfig(state.original);
|
|
268
|
+
state.service.config = installed;
|
|
269
|
+
return { service: state.service, original: state.original, installed };
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
97
275
|
export function restoreCompactionConfig(record) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
276
|
+
if (record && record.service.config === record.installed) {
|
|
277
|
+
try {
|
|
278
|
+
record.service.config = record.original;
|
|
279
|
+
}
|
|
280
|
+
catch { }
|
|
281
|
+
}
|
|
101
282
|
}
|
|
102
|
-
|
|
103
283
|
export function patchVisibleWebSearchTimeout(agent, getTimeoutMs, patchedDefinitions) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
284
|
+
const tools = resolveScopedService(agent, "tools");
|
|
285
|
+
if (!mutableService(tools) || typeof tools.get !== "function")
|
|
286
|
+
return;
|
|
287
|
+
const definition = Reflect.apply(tools.get, tools, ["web_search", agent]);
|
|
288
|
+
if (!mutableService(definition))
|
|
289
|
+
return;
|
|
290
|
+
if (!patchedDefinitions.has(definition))
|
|
291
|
+
patchedDefinitions.set(definition, definition.timeoutMs);
|
|
292
|
+
const timeoutMs = getTimeoutMs();
|
|
293
|
+
const target = timeoutMs === undefined ? patchedDefinitions.get(definition) : timeoutMs;
|
|
294
|
+
try {
|
|
295
|
+
definition.timeoutMs = target;
|
|
296
|
+
}
|
|
297
|
+
catch { }
|
|
298
|
+
}
|
|
113
299
|
export function refreshVisibleWebSearchTimeouts(patchedDefinitions, timeoutMs) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
300
|
+
for (const [definition, original] of patchedDefinitions) {
|
|
301
|
+
try {
|
|
302
|
+
definition.timeoutMs = timeoutMs === undefined ? original : timeoutMs;
|
|
303
|
+
}
|
|
304
|
+
catch { }
|
|
305
|
+
}
|
|
117
306
|
}
|
|
118
|
-
|
|
119
307
|
export function restoreVisibleWebSearchTimeouts(patchedDefinitions) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
308
|
+
for (const [definition, original] of patchedDefinitions) {
|
|
309
|
+
try {
|
|
310
|
+
if (original === undefined)
|
|
311
|
+
delete definition.timeoutMs;
|
|
312
|
+
else
|
|
313
|
+
definition.timeoutMs = original;
|
|
314
|
+
}
|
|
315
|
+
catch { }
|
|
316
|
+
}
|
|
317
|
+
patchedDefinitions.clear();
|
|
124
318
|
}
|