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

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