dsh-lcx-codex 0.4.2 → 0.4.3-pre.12

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 (49) hide show
  1. package/README.md +89 -205
  2. package/cordis.patch.yml +3 -20
  3. package/lib/client.js +309 -146
  4. package/lib/compact-v2.js +218 -199
  5. package/lib/dsh-compat.js +232 -100
  6. package/lib/dsh-responses.js +452 -277
  7. package/lib/grok-native-search.js +254 -0
  8. package/lib/index.js +1013 -757
  9. package/lib/json-store.js +50 -31
  10. package/lib/native-checkpoint.js +520 -194
  11. package/lib/responses-request.js +109 -121
  12. package/lib/responses-stream.js +1249 -447
  13. package/lib/route.js +411 -369
  14. package/lib/service-mutex.js +73 -64
  15. package/lib/token-budget.js +176 -108
  16. package/lib/transport.js +280 -68
  17. package/lib/types/client/index.d.ts +6 -0
  18. package/lib/types/compact-v2.d.ts +104 -0
  19. package/lib/types/dsh-compat.d.ts +78 -0
  20. package/lib/types/dsh-responses.d.ts +82 -0
  21. package/lib/types/grok-native-search.d.ts +34 -0
  22. package/lib/types/index.d.ts +83 -0
  23. package/lib/types/json-store.d.ts +10 -0
  24. package/lib/types/native-checkpoint.d.ts +213 -0
  25. package/lib/types/responses-request.d.ts +59 -0
  26. package/lib/types/responses-stream.d.ts +64 -0
  27. package/lib/types/route.d.ts +153 -0
  28. package/lib/types/service-mutex.d.ts +14 -0
  29. package/lib/types/token-budget.d.ts +50 -0
  30. package/lib/types/transport.d.ts +21 -0
  31. package/lib/types/web-run-output.d.ts +29 -0
  32. package/lib/types/web-search-alpha.d.ts +286 -0
  33. package/lib/types/web-search-capability.d.ts +26 -0
  34. package/lib/types/web-search-hosted.d.ts +246 -0
  35. package/lib/types/web-search-ref-store.d.ts +22 -0
  36. package/lib/web-run-output.js +167 -18
  37. package/lib/web-search-alpha.js +865 -163
  38. package/lib/web-search-capability.js +55 -65
  39. package/lib/web-search-hosted.js +210 -32
  40. package/lib/web-search-ref-store.js +63 -59
  41. package/package.json +89 -29
  42. package/ARCHITECTURE.md +0 -117
  43. package/CHANGELOG.md +0 -224
  44. package/README_EN.md +0 -277
  45. package/assets/dsh-lcx-codex-banner.jpg +0 -0
  46. package/lib/legacy-v3.js +0 -20
  47. package/lib/responses-replay.js +0 -68
  48. package/scripts/probe-alpha.mjs +0 -43
  49. package/scripts/validate-dsh-schema.mjs +0 -31
package/lib/dsh-compat.js CHANGED
@@ -1,124 +1,256 @@
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
+ return {
136
+ compaction: compaction,
137
+ original: compaction.compactIfNeeded,
138
+ };
139
+ }
140
+ export function installCompactionPatch(records, candidate, mutex, lifecycle, behavior) {
141
+ const { compaction, original } = candidate;
142
+ const callOriginal = async (agent, trigger, signal) => {
143
+ const result = Reflect.apply(original, compaction, [agent, trigger, signal]);
144
+ return Promise.resolve(result);
145
+ };
146
+ const record = {
147
+ compaction,
148
+ original,
149
+ mutex,
150
+ lifecycle,
151
+ wrapper: async function (agent, trigger, signal) {
152
+ return behavior(agent, trigger, signal, (activeSignal) => callOriginal(agent, trigger, activeSignal));
153
+ },
154
+ };
155
+ try {
156
+ compaction.compactIfNeeded = record.wrapper;
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ records.set(compaction, record);
162
+ return true;
163
+ }
164
+ export function restoreCompactionPatches(records, entries = records.values()) {
165
+ for (const record of entries)
166
+ if (record.compaction.compactIfNeeded === record.wrapper) {
167
+ try {
168
+ record.compaction.compactIfNeeded = record.original;
169
+ }
170
+ catch { }
171
+ }
172
+ records.clear();
173
+ }
68
174
  export function toolResultPrunerState(value) {
69
- const pruner = concreteService(value)
70
- const original = pruner?.pruneSession
71
- return { pruner, original }
175
+ const pruner = concreteService(value);
176
+ return mutableService(pruner)
177
+ ? { pruner: pruner, original: pruner.pruneSession }
178
+ : { pruner: undefined, original: undefined };
72
179
  }
73
-
74
180
  export function patchToolResultPruner(state, replacement) {
75
- if (!state?.pruner || typeof state.original !== 'function') return undefined
76
- state.pruner.pruneSession = replacement
77
- return { ...state, replacement }
181
+ if (!state.pruner || typeof state.original !== "function")
182
+ return undefined;
183
+ state.pruner.pruneSession = replacement;
184
+ return { pruner: state.pruner, original: state.original, replacement };
78
185
  }
79
-
80
186
  export function restoreToolResultPruner(record) {
81
- if (record?.pruner?.pruneSession === record.replacement) {
82
- try { record.pruner.pruneSession = record.original } catch {}
83
- }
187
+ if (record && record.pruner.pruneSession === record.replacement) {
188
+ try {
189
+ record.pruner.pruneSession = record.original;
190
+ }
191
+ catch { }
192
+ }
193
+ }
194
+ export function compactionConfigState(service) {
195
+ return mutableService(service)
196
+ ? { service: service, original: service.config }
197
+ : { service: undefined, original: undefined };
84
198
  }
85
-
86
- export function compactionConfigState(service) { return { service, original: service?.config } }
87
-
88
199
  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
-
200
+ if (!state.original ||
201
+ !state.service ||
202
+ !Object.prototype.hasOwnProperty.call(state.service, "config"))
203
+ return undefined;
204
+ try {
205
+ const installed = createConfig(state.original);
206
+ state.service.config = installed;
207
+ return { service: state.service, original: state.original, installed };
208
+ }
209
+ catch {
210
+ return undefined;
211
+ }
212
+ }
97
213
  export function restoreCompactionConfig(record) {
98
- if (record?.service?.config === record.installed) {
99
- try { record.service.config = record.original } catch {}
100
- }
214
+ if (record && record.service.config === record.installed) {
215
+ try {
216
+ record.service.config = record.original;
217
+ }
218
+ catch { }
219
+ }
101
220
  }
102
-
103
221
  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
-
222
+ const tools = resolveScopedService(agent, "tools");
223
+ if (!mutableService(tools) || typeof tools.get !== "function")
224
+ return;
225
+ const definition = Reflect.apply(tools.get, tools, ["web_search", agent]);
226
+ if (!mutableService(definition))
227
+ return;
228
+ if (!patchedDefinitions.has(definition))
229
+ patchedDefinitions.set(definition, definition.timeoutMs);
230
+ const timeoutMs = getTimeoutMs();
231
+ const target = timeoutMs === undefined ? patchedDefinitions.get(definition) : timeoutMs;
232
+ try {
233
+ definition.timeoutMs = target;
234
+ }
235
+ catch { }
236
+ }
113
237
  export function refreshVisibleWebSearchTimeouts(patchedDefinitions, timeoutMs) {
114
- for (const [definition, original] of patchedDefinitions.entries()) {
115
- try { definition.timeoutMs = timeoutMs === undefined ? original : timeoutMs } catch {}
116
- }
238
+ for (const [definition, original] of patchedDefinitions) {
239
+ try {
240
+ definition.timeoutMs = timeoutMs === undefined ? original : timeoutMs;
241
+ }
242
+ catch { }
243
+ }
117
244
  }
118
-
119
245
  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()
246
+ for (const [definition, original] of patchedDefinitions) {
247
+ try {
248
+ if (original === undefined)
249
+ delete definition.timeoutMs;
250
+ else
251
+ definition.timeoutMs = original;
252
+ }
253
+ catch { }
254
+ }
255
+ patchedDefinitions.clear();
124
256
  }