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
@@ -0,0 +1,261 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ const activePolicy = new AsyncLocalStorage();
3
+ const projections = new WeakMap();
4
+ function scopedValue(values, target, key) {
5
+ const targetValues = values?.get(target);
6
+ return targetValues?.has(key)
7
+ ? { found: true, value: targetValues.get(key) }
8
+ : { found: false, value: undefined };
9
+ }
10
+ function setScopedValue(values, target, key, value) {
11
+ let targetValues = values.get(target);
12
+ if (!targetValues) {
13
+ targetValues = new Map();
14
+ values.set(target, targetValues);
15
+ }
16
+ targetValues.set(key, value);
17
+ }
18
+ function inheritedDescriptor(target, key) {
19
+ for (let current = Object.getPrototypeOf(target); current; current = Object.getPrototypeOf(current)) {
20
+ const descriptor = Object.getOwnPropertyDescriptor(current, key);
21
+ if (descriptor)
22
+ return descriptor;
23
+ }
24
+ return undefined;
25
+ }
26
+ function projectionShapeSupported(target, key, own) {
27
+ if (own)
28
+ return own.configurable === true && "value" in own && own.writable === true;
29
+ if (!Object.isExtensible(target))
30
+ return false;
31
+ const inherited = inheritedDescriptor(target, key);
32
+ if (!inherited)
33
+ return true;
34
+ return "value" in inherited
35
+ ? inherited.writable === true
36
+ : typeof inherited.set === "function";
37
+ }
38
+ function projectionStillInstalled(record) {
39
+ const current = Object.getOwnPropertyDescriptor(record.target, record.key);
40
+ return current?.get === record.getter && current.set === record.setter;
41
+ }
42
+ function installProjection(owner, target, key) {
43
+ let targetRecords = projections.get(target);
44
+ const existing = targetRecords?.get(key);
45
+ if (existing) {
46
+ if (!projectionStillInstalled(existing))
47
+ return undefined;
48
+ existing.owners.add(owner);
49
+ return existing;
50
+ }
51
+ const originalDescriptor = Object.getOwnPropertyDescriptor(target, key);
52
+ if (!projectionShapeSupported(target, key, originalDescriptor))
53
+ return undefined;
54
+ let originalValue;
55
+ try {
56
+ originalValue = Reflect.get(target, key, target);
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ const record = {};
62
+ record.target = target;
63
+ record.key = key;
64
+ record.originalDescriptor = originalDescriptor;
65
+ record.originalValue = originalValue;
66
+ record.baseValue = originalValue;
67
+ record.owners = new Set([owner]);
68
+ record.getter = () => {
69
+ const scoped = scopedValue(activePolicy.getStore(), target, key);
70
+ return scoped.found ? scoped.value : record.baseValue;
71
+ };
72
+ record.setter = (value) => {
73
+ const values = activePolicy.getStore();
74
+ if (values)
75
+ setScopedValue(values, target, key, value);
76
+ else
77
+ record.baseValue = value;
78
+ };
79
+ try {
80
+ Object.defineProperty(target, key, {
81
+ configurable: true,
82
+ enumerable: originalDescriptor?.enumerable ?? false,
83
+ get: record.getter,
84
+ set: record.setter,
85
+ });
86
+ }
87
+ catch {
88
+ return undefined;
89
+ }
90
+ if (!targetRecords) {
91
+ targetRecords = new Map();
92
+ projections.set(target, targetRecords);
93
+ }
94
+ targetRecords.set(key, record);
95
+ return record;
96
+ }
97
+ function restoreProjection(record) {
98
+ if (!projectionStillInstalled(record))
99
+ return;
100
+ try {
101
+ if (record.originalDescriptor) {
102
+ Object.defineProperty(record.target, record.key, {
103
+ ...record.originalDescriptor,
104
+ value: record.baseValue,
105
+ });
106
+ }
107
+ else if (record.baseValue === record.originalValue) {
108
+ delete record.target[record.key];
109
+ }
110
+ else {
111
+ Object.defineProperty(record.target, record.key, {
112
+ configurable: true,
113
+ enumerable: true,
114
+ writable: true,
115
+ value: record.baseValue,
116
+ });
117
+ }
118
+ }
119
+ catch { }
120
+ }
121
+ function operationError(signal) {
122
+ if (signal?.reason instanceof Error)
123
+ return signal.reason;
124
+ return new DOMException("The operation was aborted", "AbortError");
125
+ }
126
+ export class InvocationPolicyScope {
127
+ records = new Set();
128
+ queue = [];
129
+ idleWaiters = [];
130
+ sharedActive = 0;
131
+ exclusiveActive = false;
132
+ closed = false;
133
+ closeReason;
134
+ ensure(target, key) {
135
+ if (this.closed || !target)
136
+ return false;
137
+ const existing = projections.get(target)?.get(key);
138
+ if (existing && this.records.has(existing))
139
+ return projectionStillInstalled(existing);
140
+ const record = installProjection(this, target, key);
141
+ if (!record)
142
+ return false;
143
+ this.records.add(record);
144
+ return true;
145
+ }
146
+ acquire(mode, signal) {
147
+ if (this.closed)
148
+ return Promise.reject(this.closeReason ?? new Error("invocation policy scope closed"));
149
+ if (signal?.aborted)
150
+ return Promise.reject(operationError(signal));
151
+ if (this.queue.length === 0 &&
152
+ !this.exclusiveActive &&
153
+ (mode === "shared" || this.sharedActive === 0)) {
154
+ if (mode === "shared")
155
+ this.sharedActive += 1;
156
+ else
157
+ this.exclusiveActive = true;
158
+ return Promise.resolve(() => this.release(mode));
159
+ }
160
+ return new Promise((resolve, reject) => {
161
+ const waiter = { mode, resolve, reject, signal };
162
+ if (signal) {
163
+ const onAbort = () => {
164
+ const index = this.queue.indexOf(waiter);
165
+ if (index >= 0)
166
+ this.queue.splice(index, 1);
167
+ signal.removeEventListener("abort", onAbort);
168
+ reject(operationError(signal));
169
+ this.flushQueue();
170
+ };
171
+ waiter.onAbort = onAbort;
172
+ signal.addEventListener("abort", onAbort, { once: true });
173
+ }
174
+ this.queue.push(waiter);
175
+ });
176
+ }
177
+ release(mode) {
178
+ if (mode === "shared")
179
+ this.sharedActive -= 1;
180
+ else
181
+ this.exclusiveActive = false;
182
+ this.flushQueue();
183
+ this.resolveIdle();
184
+ }
185
+ flushQueue() {
186
+ if (this.exclusiveActive)
187
+ return;
188
+ while (this.queue.length > 0) {
189
+ const waiter = this.queue[0];
190
+ if (!waiter)
191
+ return;
192
+ if (waiter.signal?.aborted) {
193
+ this.queue.shift();
194
+ if (waiter.onAbort)
195
+ waiter.signal.removeEventListener("abort", waiter.onAbort);
196
+ waiter.reject(operationError(waiter.signal));
197
+ continue;
198
+ }
199
+ if (waiter.mode === "exclusive") {
200
+ if (this.sharedActive > 0)
201
+ return;
202
+ this.queue.shift();
203
+ if (waiter.signal && waiter.onAbort)
204
+ waiter.signal.removeEventListener("abort", waiter.onAbort);
205
+ this.exclusiveActive = true;
206
+ waiter.resolve(() => this.release("exclusive"));
207
+ return;
208
+ }
209
+ this.queue.shift();
210
+ if (waiter.signal && waiter.onAbort)
211
+ waiter.signal.removeEventListener("abort", waiter.onAbort);
212
+ this.sharedActive += 1;
213
+ waiter.resolve(() => this.release("shared"));
214
+ }
215
+ }
216
+ resolveIdle() {
217
+ if (this.sharedActive > 0 || this.exclusiveActive)
218
+ return;
219
+ const idle = this.idleWaiters.splice(0);
220
+ for (const resolve of idle)
221
+ resolve();
222
+ }
223
+ async run(signal, mode, task) {
224
+ const release = await this.acquire(mode, signal);
225
+ try {
226
+ // Every invocation is a new root. Nested agent calls must see host policy,
227
+ // not inherit another agent's projected config or pruner.
228
+ return await activePolicy.run(new Map(), task);
229
+ }
230
+ finally {
231
+ release();
232
+ }
233
+ }
234
+ close(reason = new Error("invocation policy scope closing")) {
235
+ if (!this.closed) {
236
+ this.closed = true;
237
+ this.closeReason = reason;
238
+ const queued = this.queue.splice(0);
239
+ for (const waiter of queued) {
240
+ if (waiter.signal && waiter.onAbort)
241
+ waiter.signal.removeEventListener("abort", waiter.onAbort);
242
+ waiter.reject(reason);
243
+ }
244
+ }
245
+ if (this.sharedActive === 0 && !this.exclusiveActive)
246
+ return Promise.resolve();
247
+ return new Promise((resolve) => this.idleWaiters.push(resolve));
248
+ }
249
+ restore() {
250
+ for (const record of this.records) {
251
+ record.owners.delete(this);
252
+ if (record.owners.size > 0)
253
+ continue;
254
+ restoreProjection(record);
255
+ const targetRecords = projections.get(record.target);
256
+ if (targetRecords?.get(record.key) === record)
257
+ targetRecords.delete(record.key);
258
+ }
259
+ this.records.clear();
260
+ }
261
+ }
package/lib/json-store.js CHANGED
@@ -1,34 +1,60 @@
1
- import { mkdirSync, readFileSync, renameSync, writeFileSync, chmodSync } from 'node:fs'
2
- import { dirname } from 'node:path'
3
-
1
+ import { chmodSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ function errorCode(error) {
4
+ return error instanceof Error && "code" in error
5
+ ? error.code
6
+ : undefined;
7
+ }
4
8
  export class JsonStore {
5
- constructor(file, empty, validate, corruptCode = 'LCX_STORE_CORRUPT') {
6
- this.file = file
7
- this.empty = empty
8
- this.validate = validate
9
- this.corruptCode = corruptCode
10
- this.data = empty()
11
- this.refresh()
12
- }
13
- refresh() {
14
- try {
15
- const parsed = JSON.parse(readFileSync(this.file, 'utf8'))
16
- if (!this.validate(parsed)) throw new Error('invalid store')
17
- this.data = parsed
18
- } catch (error) {
19
- if (error?.code === 'ENOENT') { this.data = this.empty(); return }
20
- const wrapped = new Error(`Invalid LCX store ${this.file}`, { cause: error }); wrapped.code = this.corruptCode; throw wrapped
9
+ file;
10
+ empty;
11
+ validate;
12
+ corruptCode;
13
+ migrate;
14
+ data;
15
+ constructor(file, empty, validate, corruptCode = "LCX_STORE_CORRUPT", migrate) {
16
+ this.file = file;
17
+ this.empty = empty;
18
+ this.validate = validate;
19
+ this.corruptCode = corruptCode;
20
+ this.migrate = migrate;
21
+ this.data = empty();
22
+ this.refresh();
23
+ }
24
+ refresh() {
25
+ try {
26
+ const parsed = JSON.parse(readFileSync(this.file, "utf8"));
27
+ if (this.validate(parsed))
28
+ this.data = parsed;
29
+ else {
30
+ const migrated = this.migrate?.(parsed);
31
+ if (migrated === undefined || !this.validate(migrated))
32
+ throw new Error("invalid store");
33
+ this.data = migrated;
34
+ }
35
+ }
36
+ catch (error) {
37
+ if (errorCode(error) === "ENOENT") {
38
+ this.data = this.empty();
39
+ return;
40
+ }
41
+ const wrapped = Object.assign(new Error(`Invalid LCX store ${this.file}`, { cause: error }), { code: this.corruptCode });
42
+ throw wrapped;
43
+ }
44
+ }
45
+ update(mutator) {
46
+ this.refresh();
47
+ const next = mutator(structuredClone(this.data));
48
+ if (!this.validate(next))
49
+ throw new Error(`Refusing to write invalid LCX store ${this.file}`);
50
+ mkdirSync(dirname(this.file), { recursive: true });
51
+ const tmp = `${this.file}.${process.pid}.tmp`;
52
+ writeFileSync(tmp, `${JSON.stringify(next, null, 2)}\n`, { mode: 0o600 });
53
+ try {
54
+ chmodSync(tmp, 0o600);
55
+ }
56
+ catch { }
57
+ renameSync(tmp, this.file);
58
+ this.data = next;
21
59
  }
22
- }
23
- update(mutator) {
24
- this.refresh()
25
- const next = mutator(structuredClone(this.data))
26
- if (!this.validate(next)) throw new Error(`Refusing to write invalid LCX store ${this.file}`)
27
- mkdirSync(dirname(this.file), { recursive: true })
28
- const tmp = `${this.file}.${process.pid}.tmp`
29
- writeFileSync(tmp, `${JSON.stringify(next, null, 2)}\n`, { mode: 0o600 })
30
- try { chmodSync(tmp, 0o600) } catch {}
31
- renameSync(tmp, this.file)
32
- this.data = next
33
- }
34
60
  }