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.
Files changed (39) hide show
  1. package/README.md +75 -224
  2. package/THIRD_PARTY_NOTICES.md +64 -0
  3. package/cordis.patch.yml +3 -20
  4. package/lib/auxiliary-usage.js +63 -0
  5. package/lib/client.js +1398 -167
  6. package/lib/compact-v2.js +218 -199
  7. package/lib/dsh-compat.js +294 -100
  8. package/lib/dsh-responses.js +512 -277
  9. package/lib/grok-native-search.js +391 -0
  10. package/lib/index.js +1066 -758
  11. package/lib/invocation-policy-scope.js +261 -0
  12. package/lib/json-store.js +57 -31
  13. package/lib/native-checkpoint.js +520 -194
  14. package/lib/pi-responses-runtime.js +1571 -0
  15. package/lib/responses-request.js +109 -121
  16. package/lib/responses-stream.js +1280 -447
  17. package/lib/route.js +425 -369
  18. package/lib/search-accounting.js +86 -0
  19. package/lib/search-usage.js +86 -0
  20. package/lib/service-mutex.js +73 -64
  21. package/lib/token-budget.js +176 -108
  22. package/lib/transport.js +308 -68
  23. package/lib/types/client/index.d.ts +18 -0
  24. package/lib/types/client/search-media.d.ts +16 -0
  25. package/lib/types/index.d.ts +83 -0
  26. package/lib/web-run-output.js +189 -18
  27. package/lib/web-search-alpha.js +1067 -163
  28. package/lib/web-search-capability.js +80 -65
  29. package/lib/web-search-hosted.js +321 -33
  30. package/lib/web-search-ref-store.js +145 -60
  31. package/package.json +112 -32
  32. package/ARCHITECTURE.md +0 -117
  33. package/CHANGELOG.md +0 -224
  34. package/README_EN.md +0 -277
  35. package/assets/dsh-lcx-codex-banner.jpg +0 -0
  36. package/lib/legacy-v3.js +0 -20
  37. package/lib/responses-replay.js +0 -68
  38. package/scripts/probe-alpha.mjs +0 -43
  39. package/scripts/validate-dsh-schema.mjs +0 -31
package/lib/dsh-compat.js CHANGED
@@ -1,124 +1,318 @@
1
- import { symbols as cordisSymbols } from '@deepseek-ai/cordis'
2
-
3
- export function agentSessionId(agent) { return String(agent?.session?.id ?? '') }
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
- return {
7
- requestConfig: agent?.session?.requestHeader?.()?.config,
8
- options: agent?.options,
9
- sessionId: agentSessionId(agent),
10
- }
11
- }
12
-
13
- export function sessionsService(ctx) { return ctx?.get?.('sessions') ?? ctx?.sessions }
14
- export function sessionFor(ctx, sessionId) { return sessionId ? sessionsService(ctx)?.get?.(sessionId) : undefined }
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
- try { return Reflect.get(ctx?.web, 'searchProviderId') } catch { return undefined }
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
- if (!ctx?.web) return false
22
- try {
23
- if (!Reflect.set(ctx.web, 'searchProviderId', providerId)) return false
24
- return Reflect.get(ctx.web, 'searchProviderId') === providerId
25
- } catch { return false }
26
- }
27
-
28
- export function contextService(ctx, name) { return ctx?.get?.(name) ?? ctx?.[name] }
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
- try { return contextService(ctx, name) } catch { return undefined }
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
- const agentPresets = resolveContextService(ctx, 'agentPresets')
38
- try {
39
- const service = agentPresets?.serviceFor?.(agent, name)
40
- if (service !== undefined) return service
41
- } catch {}
42
- return resolveScopedService(agent, name)
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
- try { return value?.[cordisSymbols.original] ?? value } catch { return value }
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
- const compaction = concreteService(value)
51
- if (!compaction || typeof compaction.compactIfNeeded !== 'function' || records.has(compaction)) return undefined
52
- return { compaction, original: compaction.compactIfNeeded }
53
- }
54
-
55
- export function installCompactionPatch(records, record) {
56
- try { record.compaction.compactIfNeeded = record.wrapper } catch { return false }
57
- records.set(record.compaction, record)
58
- return true
59
- }
60
-
61
- export function restoreCompactionPatches(records, entries = [...records.values()]) {
62
- for (const record of entries) if (record.compaction?.compactIfNeeded === record.wrapper) {
63
- try { record.compaction.compactIfNeeded = record.original } catch {}
64
- }
65
- records.clear()
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
- const pruner = concreteService(value)
70
- const original = pruner?.pruneSession
71
- return { pruner, original }
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
- if (!state?.pruner || typeof state.original !== 'function') return undefined
76
- state.pruner.pruneSession = replacement
77
- return { ...state, replacement }
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
- if (record?.pruner?.pruneSession === record.replacement) {
82
- try { record.pruner.pruneSession = record.original } catch {}
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
- if (!state?.original || !state.service || !Object.prototype.hasOwnProperty.call(state.service, 'config')) return undefined
90
- try {
91
- const installed = createConfig(state.original)
92
- state.service.config = installed
93
- return { ...state, installed }
94
- } catch { return undefined }
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
- if (record?.service?.config === record.installed) {
99
- try { record.service.config = record.original } catch {}
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
- const tools = resolveScopedService(agent, 'tools')
105
- const definition = tools?.get?.('web_search', agent)
106
- if (!definition || typeof definition !== 'object') return
107
- if (!patchedDefinitions.has(definition)) patchedDefinitions.set(definition, definition.timeoutMs)
108
- const timeoutMs = getTimeoutMs()
109
- const target = timeoutMs === undefined ? patchedDefinitions.get(definition) : timeoutMs
110
- try { definition.timeoutMs = target } catch {}
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
- for (const [definition, original] of patchedDefinitions.entries()) {
115
- try { definition.timeoutMs = timeoutMs === undefined ? original : timeoutMs } catch {}
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
- for (const [definition, original] of patchedDefinitions.entries()) {
121
- try { if (original === undefined) delete definition.timeoutMs; else definition.timeoutMs = original } catch {}
122
- }
123
- patchedDefinitions.clear()
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
  }