iosm-cli 0.2.3 → 0.2.5
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/CHANGELOG.md +56 -0
- package/README.md +43 -10
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-profiles.d.ts +2 -1
- package/dist/core/agent-profiles.d.ts.map +1 -1
- package/dist/core/agent-profiles.js +18 -5
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/agent-session.d.ts +7 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +64 -15
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agent-teams.d.ts.map +1 -1
- package/dist/core/agent-teams.js +90 -19
- package/dist/core/agent-teams.js.map +1 -1
- package/dist/core/extensions/types.d.ts +1 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +6 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +9 -0
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/orchestration-limits.d.ts +6 -0
- package/dist/core/orchestration-limits.d.ts.map +1 -0
- package/dist/core/orchestration-limits.js +6 -0
- package/dist/core/orchestration-limits.js.map +1 -0
- package/dist/core/parallel-task-agent.d.ts +23 -1
- package/dist/core/parallel-task-agent.d.ts.map +1 -1
- package/dist/core/parallel-task-agent.js +110 -20
- package/dist/core/parallel-task-agent.js.map +1 -1
- package/dist/core/sdk.d.ts +6 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +34 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/shared-memory.d.ts +2 -2
- package/dist/core/shared-memory.d.ts.map +1 -1
- package/dist/core/shared-memory.js +220 -91
- package/dist/core/shared-memory.js.map +1 -1
- package/dist/core/singular.d.ts.map +1 -1
- package/dist/core/singular.js +3 -1
- package/dist/core/singular.js.map +1 -1
- package/dist/core/subagents.d.ts +1 -1
- package/dist/core/subagents.d.ts.map +1 -1
- package/dist/core/subagents.js +32 -10
- package/dist/core/subagents.js.map +1 -1
- package/dist/core/swarm/planner.d.ts.map +1 -1
- package/dist/core/swarm/planner.js +200 -12
- package/dist/core/swarm/planner.js.map +1 -1
- package/dist/core/swarm/scheduler.d.ts +2 -0
- package/dist/core/swarm/scheduler.d.ts.map +1 -1
- package/dist/core/swarm/scheduler.js +87 -6
- package/dist/core/swarm/scheduler.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +1 -0
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/ast-grep.d.ts.map +1 -1
- package/dist/core/tools/ast-grep.js +2 -0
- package/dist/core/tools/ast-grep.js.map +1 -1
- package/dist/core/tools/edit.d.ts +8 -4
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +18 -3
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/index.d.ts +9 -7
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/shared-memory.d.ts.map +1 -1
- package/dist/core/tools/shared-memory.js +34 -6
- package/dist/core/tools/shared-memory.js.map +1 -1
- package/dist/core/tools/task.d.ts +10 -3
- package/dist/core/tools/task.d.ts.map +1 -1
- package/dist/core/tools/task.js +830 -184
- package/dist/core/tools/task.js.map +1 -1
- package/dist/core/tools/todo.d.ts +10 -10
- package/dist/core/tools/todo.d.ts.map +1 -1
- package/dist/core/tools/todo.js +135 -17
- package/dist/core/tools/todo.js.map +1 -1
- package/dist/core/tools/yq.d.ts.map +1 -1
- package/dist/core/tools/yq.js +2 -0
- package/dist/core/tools/yq.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +10 -9
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +22 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +957 -75
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/cli-reference.md +8 -0
- package/docs/configuration.md +5 -1
- package/docs/interactive-mode.md +7 -1
- package/docs/orchestration-and-subagents.md +5 -0
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import lockfile from "proper-lockfile";
|
|
4
4
|
const maxEntryCharsDefault = 4000;
|
|
@@ -6,6 +6,8 @@ const maxKeysDefault = 500;
|
|
|
6
6
|
const historySizeDefault = 1000;
|
|
7
7
|
const lockRetryAttempts = 12;
|
|
8
8
|
const lockRetryDelayMs = 20;
|
|
9
|
+
const snapshotRetryAttempts = 4;
|
|
10
|
+
const snapshotRetryDelayMs = 8;
|
|
9
11
|
const maxEntryChars = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_MAX_ENTRY_CHARS, maxEntryCharsDefault, 64, 20_000);
|
|
10
12
|
const maxKeys = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_MAX_KEYS, maxKeysDefault, 10, 20_000);
|
|
11
13
|
const historySize = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_HISTORY_SIZE, historySizeDefault, 10, 50_000);
|
|
@@ -15,8 +17,65 @@ function readBoundedInt(raw, fallback, min, max) {
|
|
|
15
17
|
return fallback;
|
|
16
18
|
return Math.max(min, Math.min(max, parsed));
|
|
17
19
|
}
|
|
18
|
-
function delay(ms) {
|
|
19
|
-
|
|
20
|
+
function delay(ms, signal) {
|
|
21
|
+
if (!signal) {
|
|
22
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
23
|
+
}
|
|
24
|
+
if (signal.aborted) {
|
|
25
|
+
return Promise.reject(new Error("Operation aborted"));
|
|
26
|
+
}
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
const timer = setTimeout(() => {
|
|
29
|
+
signal.removeEventListener("abort", onAbort);
|
|
30
|
+
resolve();
|
|
31
|
+
}, ms);
|
|
32
|
+
const onAbort = () => {
|
|
33
|
+
clearTimeout(timer);
|
|
34
|
+
signal.removeEventListener("abort", onAbort);
|
|
35
|
+
reject(new Error("Operation aborted"));
|
|
36
|
+
};
|
|
37
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
class Mutex {
|
|
41
|
+
constructor() {
|
|
42
|
+
this.locked = false;
|
|
43
|
+
this.waiters = [];
|
|
44
|
+
}
|
|
45
|
+
async acquire() {
|
|
46
|
+
if (!this.locked) {
|
|
47
|
+
this.locked = true;
|
|
48
|
+
return () => this.release();
|
|
49
|
+
}
|
|
50
|
+
await new Promise((resolve) => this.waiters.push(resolve));
|
|
51
|
+
this.locked = true;
|
|
52
|
+
return () => this.release();
|
|
53
|
+
}
|
|
54
|
+
release() {
|
|
55
|
+
this.locked = false;
|
|
56
|
+
const next = this.waiters.shift();
|
|
57
|
+
if (next) {
|
|
58
|
+
next();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
isIdle() {
|
|
62
|
+
return !this.locked && this.waiters.length === 0;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const localWriteMutexes = new Map();
|
|
66
|
+
function getOrCreateLocalWriteMutex(filePath) {
|
|
67
|
+
const existing = localWriteMutexes.get(filePath);
|
|
68
|
+
if (existing)
|
|
69
|
+
return existing;
|
|
70
|
+
const created = new Mutex();
|
|
71
|
+
localWriteMutexes.set(filePath, created);
|
|
72
|
+
return created;
|
|
73
|
+
}
|
|
74
|
+
function cleanupLocalWriteMutex(filePath) {
|
|
75
|
+
const existing = localWriteMutexes.get(filePath);
|
|
76
|
+
if (!existing || !existing.isIdle())
|
|
77
|
+
return;
|
|
78
|
+
localWriteMutexes.delete(filePath);
|
|
20
79
|
}
|
|
21
80
|
function normalizeRunId(runId) {
|
|
22
81
|
const trimmed = runId.trim();
|
|
@@ -77,36 +136,70 @@ function createInitialStore(runId) {
|
|
|
77
136
|
history: [],
|
|
78
137
|
};
|
|
79
138
|
}
|
|
139
|
+
function normalizeParsedStore(runId, parsed) {
|
|
140
|
+
if (!parsed || typeof parsed !== "object")
|
|
141
|
+
return createInitialStore(runId);
|
|
142
|
+
const cast = parsed;
|
|
143
|
+
if (cast.runId !== runId)
|
|
144
|
+
return createInitialStore(runId);
|
|
145
|
+
if (!cast.entries || typeof cast.entries !== "object")
|
|
146
|
+
cast.entries = {};
|
|
147
|
+
if (!Array.isArray(cast.history))
|
|
148
|
+
cast.history = [];
|
|
149
|
+
if (!cast.createdAt || typeof cast.createdAt !== "string")
|
|
150
|
+
cast.createdAt = new Date().toISOString();
|
|
151
|
+
if (!cast.updatedAt || typeof cast.updatedAt !== "string")
|
|
152
|
+
cast.updatedAt = cast.createdAt;
|
|
153
|
+
return cast;
|
|
154
|
+
}
|
|
80
155
|
function readStore(filePath, runId) {
|
|
81
156
|
if (!existsSync(filePath)) {
|
|
82
157
|
return createInitialStore(runId);
|
|
83
158
|
}
|
|
84
159
|
try {
|
|
85
160
|
const parsed = JSON.parse(readFileSync(filePath, "utf8"));
|
|
86
|
-
|
|
87
|
-
return createInitialStore(runId);
|
|
88
|
-
if (parsed.runId !== runId)
|
|
89
|
-
return createInitialStore(runId);
|
|
90
|
-
if (!parsed.entries || typeof parsed.entries !== "object")
|
|
91
|
-
parsed.entries = {};
|
|
92
|
-
if (!Array.isArray(parsed.history))
|
|
93
|
-
parsed.history = [];
|
|
94
|
-
if (!parsed.createdAt || typeof parsed.createdAt !== "string")
|
|
95
|
-
parsed.createdAt = new Date().toISOString();
|
|
96
|
-
if (!parsed.updatedAt || typeof parsed.updatedAt !== "string")
|
|
97
|
-
parsed.updatedAt = parsed.createdAt;
|
|
98
|
-
return parsed;
|
|
161
|
+
return normalizeParsedStore(runId, parsed);
|
|
99
162
|
}
|
|
100
163
|
catch {
|
|
101
164
|
return createInitialStore(runId);
|
|
102
165
|
}
|
|
103
166
|
}
|
|
167
|
+
async function readStoreSnapshot(filePath, runId, signal) {
|
|
168
|
+
if (!existsSync(filePath)) {
|
|
169
|
+
return createInitialStore(runId);
|
|
170
|
+
}
|
|
171
|
+
for (let attempt = 1; attempt <= snapshotRetryAttempts; attempt += 1) {
|
|
172
|
+
if (signal?.aborted)
|
|
173
|
+
throw new Error("Operation aborted");
|
|
174
|
+
try {
|
|
175
|
+
const parsed = JSON.parse(readFileSync(filePath, "utf8"));
|
|
176
|
+
return normalizeParsedStore(runId, parsed);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
if (attempt >= snapshotRetryAttempts)
|
|
180
|
+
break;
|
|
181
|
+
await delay(snapshotRetryDelayMs * attempt, signal);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return createInitialStore(runId);
|
|
185
|
+
}
|
|
104
186
|
function writeStore(filePath, store) {
|
|
105
187
|
mkdirSync(dirname(filePath), { recursive: true });
|
|
106
|
-
|
|
188
|
+
const tempPath = `${filePath}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
|
|
189
|
+
try {
|
|
190
|
+
writeFileSync(tempPath, `${JSON.stringify(store, null, 2)}\n`, "utf8");
|
|
191
|
+
renameSync(tempPath, filePath);
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
if (existsSync(tempPath)) {
|
|
195
|
+
rmSync(tempPath, { force: true });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
107
198
|
}
|
|
108
|
-
async function acquireFileLock(filePath) {
|
|
199
|
+
async function acquireFileLock(filePath, signal) {
|
|
109
200
|
for (let attempt = 1; attempt <= lockRetryAttempts; attempt += 1) {
|
|
201
|
+
if (signal?.aborted)
|
|
202
|
+
throw new Error("Operation aborted");
|
|
110
203
|
try {
|
|
111
204
|
return await lockfile.lock(filePath, { realpath: false });
|
|
112
205
|
}
|
|
@@ -115,19 +208,20 @@ async function acquireFileLock(filePath) {
|
|
|
115
208
|
if (code !== "ELOCKED" || attempt >= lockRetryAttempts) {
|
|
116
209
|
throw error;
|
|
117
210
|
}
|
|
118
|
-
await delay(lockRetryDelayMs * attempt);
|
|
211
|
+
await delay(lockRetryDelayMs * attempt, signal);
|
|
119
212
|
}
|
|
120
213
|
}
|
|
121
214
|
throw new Error("failed to acquire shared memory lock");
|
|
122
215
|
}
|
|
123
|
-
async function withLockedStore(context, fn) {
|
|
216
|
+
async function withLockedStore(context, fn, signal) {
|
|
124
217
|
const runId = normalizeRunId(context.runId);
|
|
125
218
|
const filePath = getSharedMemoryPath(context.rootCwd, runId);
|
|
219
|
+
const releaseLocalMutex = await getOrCreateLocalWriteMutex(filePath).acquire();
|
|
126
220
|
mkdirSync(dirname(filePath), { recursive: true });
|
|
127
221
|
if (!existsSync(filePath)) {
|
|
128
222
|
writeStore(filePath, createInitialStore(runId));
|
|
129
223
|
}
|
|
130
|
-
const release = await acquireFileLock(filePath);
|
|
224
|
+
const release = await acquireFileLock(filePath, signal);
|
|
131
225
|
try {
|
|
132
226
|
const store = readStore(filePath, runId);
|
|
133
227
|
const value = fn(store, filePath);
|
|
@@ -135,9 +229,34 @@ async function withLockedStore(context, fn) {
|
|
|
135
229
|
return value;
|
|
136
230
|
}
|
|
137
231
|
finally {
|
|
138
|
-
|
|
232
|
+
try {
|
|
233
|
+
await release();
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
releaseLocalMutex();
|
|
237
|
+
cleanupLocalWriteMutex(filePath);
|
|
238
|
+
}
|
|
139
239
|
}
|
|
140
240
|
}
|
|
241
|
+
async function withSnapshotStore(context, fn, signal) {
|
|
242
|
+
const runId = normalizeRunId(context.runId);
|
|
243
|
+
const filePath = getSharedMemoryPath(context.rootCwd, runId);
|
|
244
|
+
const store = await readStoreSnapshot(filePath, runId, signal);
|
|
245
|
+
return fn(store, filePath);
|
|
246
|
+
}
|
|
247
|
+
function isAbortError(error) {
|
|
248
|
+
if (error instanceof Error)
|
|
249
|
+
return /aborted/i.test(error.message);
|
|
250
|
+
if (typeof error === "string")
|
|
251
|
+
return /aborted/i.test(error);
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
function normalizeLockError(error) {
|
|
255
|
+
if (isAbortError(error)) {
|
|
256
|
+
throw new Error("Operation aborted");
|
|
257
|
+
}
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
141
260
|
function trimHistory(store) {
|
|
142
261
|
if (store.history.length <= historySize)
|
|
143
262
|
return;
|
|
@@ -150,56 +269,61 @@ function writerFromContext(context) {
|
|
|
150
269
|
profile: context.profile?.trim() || undefined,
|
|
151
270
|
};
|
|
152
271
|
}
|
|
153
|
-
export async function writeSharedMemory(context, input) {
|
|
272
|
+
export async function writeSharedMemory(context, input, signal) {
|
|
154
273
|
const normalizedValue = input.value;
|
|
155
274
|
if (normalizedValue.length > maxEntryChars) {
|
|
156
275
|
throw new Error(`shared memory value exceeds ${maxEntryChars} chars`);
|
|
157
276
|
}
|
|
158
277
|
const scopedKey = resolveScopedKey(context, input.scope, input.key);
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
278
|
+
try {
|
|
279
|
+
return await withLockedStore(context, (store) => {
|
|
280
|
+
const now = new Date().toISOString();
|
|
281
|
+
const entriesCount = Object.keys(store.entries).length;
|
|
282
|
+
const previous = store.entries[scopedKey];
|
|
283
|
+
if (!previous && entriesCount >= maxKeys) {
|
|
284
|
+
throw new Error(`shared memory key limit reached (${maxKeys})`);
|
|
285
|
+
}
|
|
286
|
+
if (input.ifVersion !== undefined && previous && previous.version !== input.ifVersion) {
|
|
287
|
+
throw new Error(`shared memory CAS mismatch for key "${input.key}" (expected ${input.ifVersion}, got ${previous.version})`);
|
|
288
|
+
}
|
|
289
|
+
if (input.ifVersion !== undefined && !previous) {
|
|
290
|
+
throw new Error(`shared memory CAS mismatch for key "${input.key}" (expected ${input.ifVersion}, got 0)`);
|
|
291
|
+
}
|
|
292
|
+
const nextValue = input.mode === "append" ? `${previous?.value ?? ""}${normalizedValue}` : normalizedValue;
|
|
293
|
+
if (nextValue.length > maxEntryChars) {
|
|
294
|
+
throw new Error(`shared memory value exceeds ${maxEntryChars} chars after ${input.mode}`);
|
|
295
|
+
}
|
|
296
|
+
const nextVersion = (previous?.version ?? 0) + 1;
|
|
297
|
+
const writer = writerFromContext(context);
|
|
298
|
+
store.entries[scopedKey] = {
|
|
299
|
+
value: nextValue,
|
|
300
|
+
version: nextVersion,
|
|
301
|
+
updatedAt: now,
|
|
302
|
+
writer,
|
|
303
|
+
};
|
|
304
|
+
store.updatedAt = now;
|
|
305
|
+
store.history.push({
|
|
306
|
+
key: normalizeKey(input.key),
|
|
307
|
+
scope: input.scope,
|
|
308
|
+
mode: input.mode,
|
|
309
|
+
version: nextVersion,
|
|
310
|
+
updatedAt: now,
|
|
311
|
+
writer,
|
|
312
|
+
});
|
|
313
|
+
trimHistory(store);
|
|
314
|
+
return {
|
|
315
|
+
key: normalizeKey(input.key),
|
|
316
|
+
scope: input.scope,
|
|
317
|
+
value: nextValue,
|
|
318
|
+
version: nextVersion,
|
|
319
|
+
updatedAt: now,
|
|
320
|
+
writer,
|
|
321
|
+
};
|
|
322
|
+
}, signal);
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
normalizeLockError(error);
|
|
326
|
+
}
|
|
203
327
|
}
|
|
204
328
|
function matchesScopeAndPrefix(context, scopedKey, scope, key, prefix) {
|
|
205
329
|
const parsed = parseScopedKey(scopedKey);
|
|
@@ -220,34 +344,39 @@ function matchesScopeAndPrefix(context, scopedKey, scope, key, prefix) {
|
|
|
220
344
|
}
|
|
221
345
|
return { matched: true, parsed };
|
|
222
346
|
}
|
|
223
|
-
export async function readSharedMemory(context, input) {
|
|
347
|
+
export async function readSharedMemory(context, input, signal) {
|
|
224
348
|
const normalizedKey = input.key ? normalizeKey(input.key) : undefined;
|
|
225
349
|
const normalizedPrefix = input.prefix ? normalizeKey(input.prefix) : undefined;
|
|
226
350
|
const limit = Math.max(1, Math.min(100, input.limit ?? 20));
|
|
227
351
|
const includeValues = input.includeValues !== false;
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
352
|
+
try {
|
|
353
|
+
return await withSnapshotStore(context, (store) => {
|
|
354
|
+
const matchedItems = [];
|
|
355
|
+
for (const [scopedKey, entry] of Object.entries(store.entries)) {
|
|
356
|
+
const matched = matchesScopeAndPrefix(context, scopedKey, input.scope, normalizedKey, normalizedPrefix);
|
|
357
|
+
if (!matched.matched)
|
|
358
|
+
continue;
|
|
359
|
+
matchedItems.push({
|
|
360
|
+
key: matched.parsed.key,
|
|
361
|
+
scope: input.scope,
|
|
362
|
+
value: includeValues ? entry.value : undefined,
|
|
363
|
+
version: entry.version,
|
|
364
|
+
updatedAt: entry.updatedAt,
|
|
365
|
+
writer: entry.writer ?? {},
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
matchedItems.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
369
|
+
const sliced = matchedItems.slice(0, limit);
|
|
370
|
+
return {
|
|
371
|
+
runId: store.runId,
|
|
236
372
|
scope: input.scope,
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
return {
|
|
246
|
-
runId: store.runId,
|
|
247
|
-
scope: input.scope,
|
|
248
|
-
items: sliced,
|
|
249
|
-
totalMatched: matchedItems.length,
|
|
250
|
-
};
|
|
251
|
-
});
|
|
373
|
+
items: sliced,
|
|
374
|
+
totalMatched: matchedItems.length,
|
|
375
|
+
};
|
|
376
|
+
}, signal);
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
normalizeLockError(error);
|
|
380
|
+
}
|
|
252
381
|
}
|
|
253
382
|
//# sourceMappingURL=shared-memory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-memory.js","sourceRoot":"","sources":["../../src/core/shared-memory.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\n\nexport type SharedMemoryScope = \"run\" | \"task\";\nexport type SharedMemoryWriteMode = \"set\" | \"append\";\n\nexport interface SharedMemoryWriter {\n\ttaskId?: string;\n\tdelegateId?: string;\n\tprofile?: string;\n}\n\nexport interface SharedMemoryContext {\n\trootCwd: string;\n\trunId: string;\n\ttaskId?: string;\n\tdelegateId?: string;\n\tprofile?: string;\n}\n\ninterface SharedMemoryEntry {\n\tvalue: string;\n\tversion: number;\n\tupdatedAt: string;\n\twriter: SharedMemoryWriter;\n}\n\ninterface SharedMemoryHistoryItem {\n\tkey: string;\n\tscope: SharedMemoryScope;\n\tmode: SharedMemoryWriteMode;\n\tversion: number;\n\tupdatedAt: string;\n\twriter: SharedMemoryWriter;\n}\n\ninterface SharedMemoryStore {\n\trunId: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tentries: Record<string, SharedMemoryEntry>;\n\thistory: SharedMemoryHistoryItem[];\n}\n\nexport interface SharedMemoryReadItem {\n\tkey: string;\n\tscope: SharedMemoryScope;\n\tvalue?: string;\n\tversion: number;\n\tupdatedAt: string;\n\twriter: SharedMemoryWriter;\n}\n\nexport interface SharedMemoryReadResult {\n\trunId: string;\n\tscope: SharedMemoryScope;\n\titems: SharedMemoryReadItem[];\n\ttotalMatched: number;\n}\n\nexport interface SharedMemoryWriteInput {\n\tkey: string;\n\tvalue: string;\n\tscope: SharedMemoryScope;\n\tmode: SharedMemoryWriteMode;\n\tifVersion?: number;\n}\n\nexport interface SharedMemoryReadInput {\n\tscope: SharedMemoryScope;\n\tkey?: string;\n\tprefix?: string;\n\tlimit?: number;\n\tincludeValues?: boolean;\n}\n\nconst maxEntryCharsDefault = 4000;\nconst maxKeysDefault = 500;\nconst historySizeDefault = 1000;\nconst lockRetryAttempts = 12;\nconst lockRetryDelayMs = 20;\n\nconst maxEntryChars = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_MAX_ENTRY_CHARS, maxEntryCharsDefault, 64, 20_000);\nconst maxKeys = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_MAX_KEYS, maxKeysDefault, 10, 20_000);\nconst historySize = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_HISTORY_SIZE, historySizeDefault, 10, 50_000);\n\nfunction readBoundedInt(raw: string | undefined, fallback: number, min: number, max: number): number {\n\tconst parsed = raw ? Number.parseInt(raw, 10) : fallback;\n\tif (!Number.isInteger(parsed)) return fallback;\n\treturn Math.max(min, Math.min(max, parsed));\n}\n\nfunction delay(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction normalizeRunId(runId: string): string {\n\tconst trimmed = runId.trim();\n\tif (!trimmed) throw new Error(\"shared memory requires non-empty run_id context\");\n\treturn trimmed;\n}\n\nfunction normalizeKey(key: string): string {\n\tconst normalized = key.trim().replace(/\\s+/g, \" \");\n\tif (!normalized) throw new Error(\"shared memory key must be non-empty\");\n\tif (normalized.length > 240) {\n\t\tthrow new Error(\"shared memory key too long (max 240 chars)\");\n\t}\n\treturn normalized;\n}\n\nfunction resolveScopedKey(context: SharedMemoryContext, scope: SharedMemoryScope, key: string): string {\n\tconst normalizedKey = normalizeKey(key);\n\tif (scope === \"task\") {\n\t\tif (!context.taskId || !context.taskId.trim()) {\n\t\t\tthrow new Error(\"task-scoped shared memory requires task_id context\");\n\t\t}\n\t\treturn `task:${context.taskId.trim()}:${normalizedKey}`;\n\t}\n\treturn `run:${normalizedKey}`;\n}\n\nfunction parseScopedKey(scopedKey: string): { scope: SharedMemoryScope; key: string; taskId?: string } {\n\tif (scopedKey.startsWith(\"task:\")) {\n\t\tconst rest = scopedKey.slice(\"task:\".length);\n\t\tconst split = rest.indexOf(\":\");\n\t\tif (split <= 0) {\n\t\t\treturn { scope: \"task\", key: rest };\n\t\t}\n\t\treturn {\n\t\t\tscope: \"task\",\n\t\t\ttaskId: rest.slice(0, split),\n\t\t\tkey: rest.slice(split + 1),\n\t\t};\n\t}\n\tif (scopedKey.startsWith(\"run:\")) {\n\t\treturn { scope: \"run\", key: scopedKey.slice(\"run:\".length) };\n\t}\n\treturn { scope: \"run\", key: scopedKey };\n}\n\nfunction getSharedMemoryDir(rootCwd: string): string {\n\treturn join(rootCwd, \".iosm\", \"subagents\", \"shared-memory\");\n}\n\nexport function getSharedMemoryPath(rootCwd: string, runId: string): string {\n\treturn join(getSharedMemoryDir(rootCwd), `${normalizeRunId(runId)}.json`);\n}\n\nfunction createInitialStore(runId: string): SharedMemoryStore {\n\tconst now = new Date().toISOString();\n\treturn {\n\t\trunId,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t\tentries: {},\n\t\thistory: [],\n\t};\n}\n\nfunction readStore(filePath: string, runId: string): SharedMemoryStore {\n\tif (!existsSync(filePath)) {\n\t\treturn createInitialStore(runId);\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(filePath, \"utf8\")) as SharedMemoryStore;\n\t\tif (!parsed || typeof parsed !== \"object\") return createInitialStore(runId);\n\t\tif (parsed.runId !== runId) return createInitialStore(runId);\n\t\tif (!parsed.entries || typeof parsed.entries !== \"object\") parsed.entries = {};\n\t\tif (!Array.isArray(parsed.history)) parsed.history = [];\n\t\tif (!parsed.createdAt || typeof parsed.createdAt !== \"string\") parsed.createdAt = new Date().toISOString();\n\t\tif (!parsed.updatedAt || typeof parsed.updatedAt !== \"string\") parsed.updatedAt = parsed.createdAt;\n\t\treturn parsed;\n\t} catch {\n\t\treturn createInitialStore(runId);\n\t}\n}\n\nfunction writeStore(filePath: string, store: SharedMemoryStore): void {\n\tmkdirSync(dirname(filePath), { recursive: true });\n\twriteFileSync(filePath, `${JSON.stringify(store, null, 2)}\\n`, \"utf8\");\n}\n\nasync function acquireFileLock(filePath: string): Promise<() => Promise<void>> {\n\tfor (let attempt = 1; attempt <= lockRetryAttempts; attempt += 1) {\n\t\ttry {\n\t\t\treturn await lockfile.lock(filePath, { realpath: false });\n\t\t} catch (error) {\n\t\t\tconst code = error && typeof error === \"object\" && \"code\" in error ? String(error.code) : \"\";\n\t\t\tif (code !== \"ELOCKED\" || attempt >= lockRetryAttempts) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tawait delay(lockRetryDelayMs * attempt);\n\t\t}\n\t}\n\tthrow new Error(\"failed to acquire shared memory lock\");\n}\n\nasync function withLockedStore<T>(\n\tcontext: SharedMemoryContext,\n\tfn: (store: SharedMemoryStore, filePath: string) => T,\n): Promise<T> {\n\tconst runId = normalizeRunId(context.runId);\n\tconst filePath = getSharedMemoryPath(context.rootCwd, runId);\n\tmkdirSync(dirname(filePath), { recursive: true });\n\tif (!existsSync(filePath)) {\n\t\twriteStore(filePath, createInitialStore(runId));\n\t}\n\tconst release = await acquireFileLock(filePath);\n\ttry {\n\t\tconst store = readStore(filePath, runId);\n\t\tconst value = fn(store, filePath);\n\t\twriteStore(filePath, store);\n\t\treturn value;\n\t} finally {\n\t\tawait release();\n\t}\n}\n\nfunction trimHistory(store: SharedMemoryStore): void {\n\tif (store.history.length <= historySize) return;\n\tstore.history = store.history.slice(store.history.length - historySize);\n}\n\nfunction writerFromContext(context: SharedMemoryContext): SharedMemoryWriter {\n\treturn {\n\t\ttaskId: context.taskId?.trim() || undefined,\n\t\tdelegateId: context.delegateId?.trim() || undefined,\n\t\tprofile: context.profile?.trim() || undefined,\n\t};\n}\n\nexport async function writeSharedMemory(\n\tcontext: SharedMemoryContext,\n\tinput: SharedMemoryWriteInput,\n): Promise<SharedMemoryReadItem> {\n\tconst normalizedValue = input.value;\n\tif (normalizedValue.length > maxEntryChars) {\n\t\tthrow new Error(`shared memory value exceeds ${maxEntryChars} chars`);\n\t}\n\tconst scopedKey = resolveScopedKey(context, input.scope, input.key);\n\n\treturn withLockedStore(context, (store) => {\n\t\tconst now = new Date().toISOString();\n\t\tconst entriesCount = Object.keys(store.entries).length;\n\t\tconst previous = store.entries[scopedKey];\n\t\tif (!previous && entriesCount >= maxKeys) {\n\t\t\tthrow new Error(`shared memory key limit reached (${maxKeys})`);\n\t\t}\n\t\tif (input.ifVersion !== undefined && previous && previous.version !== input.ifVersion) {\n\t\t\tthrow new Error(`shared memory CAS mismatch for key \"${input.key}\" (expected ${input.ifVersion}, got ${previous.version})`);\n\t\t}\n\t\tif (input.ifVersion !== undefined && !previous) {\n\t\t\tthrow new Error(`shared memory CAS mismatch for key \"${input.key}\" (expected ${input.ifVersion}, got 0)`);\n\t\t}\n\n\t\tconst nextValue = input.mode === \"append\" ? `${previous?.value ?? \"\"}${normalizedValue}` : normalizedValue;\n\t\tif (nextValue.length > maxEntryChars) {\n\t\t\tthrow new Error(`shared memory value exceeds ${maxEntryChars} chars after ${input.mode}`);\n\t\t}\n\t\tconst nextVersion = (previous?.version ?? 0) + 1;\n\t\tconst writer = writerFromContext(context);\n\t\tstore.entries[scopedKey] = {\n\t\t\tvalue: nextValue,\n\t\t\tversion: nextVersion,\n\t\t\tupdatedAt: now,\n\t\t\twriter,\n\t\t};\n\t\tstore.updatedAt = now;\n\t\tstore.history.push({\n\t\t\tkey: normalizeKey(input.key),\n\t\t\tscope: input.scope,\n\t\t\tmode: input.mode,\n\t\t\tversion: nextVersion,\n\t\t\tupdatedAt: now,\n\t\t\twriter,\n\t\t});\n\t\ttrimHistory(store);\n\n\t\treturn {\n\t\t\tkey: normalizeKey(input.key),\n\t\t\tscope: input.scope,\n\t\t\tvalue: nextValue,\n\t\t\tversion: nextVersion,\n\t\t\tupdatedAt: now,\n\t\t\twriter,\n\t\t};\n\t});\n}\n\nfunction matchesScopeAndPrefix(\n\tcontext: SharedMemoryContext,\n\tscopedKey: string,\n\tscope: SharedMemoryScope,\n\tkey: string | undefined,\n\tprefix: string | undefined,\n): { matched: boolean; parsed: ReturnType<typeof parseScopedKey> } {\n\tconst parsed = parseScopedKey(scopedKey);\n\tif (parsed.scope !== scope) return { matched: false, parsed };\n\tif (scope === \"task\") {\n\t\tconst taskId = context.taskId?.trim();\n\t\tif (!taskId) return { matched: false, parsed };\n\t\tif (parsed.taskId !== taskId) return { matched: false, parsed };\n\t}\n\tif (key) {\n\t\treturn { matched: parsed.key === key, parsed };\n\t}\n\tif (prefix) {\n\t\treturn { matched: parsed.key.startsWith(prefix), parsed };\n\t}\n\treturn { matched: true, parsed };\n}\n\nexport async function readSharedMemory(\n\tcontext: SharedMemoryContext,\n\tinput: SharedMemoryReadInput,\n): Promise<SharedMemoryReadResult> {\n\tconst normalizedKey = input.key ? normalizeKey(input.key) : undefined;\n\tconst normalizedPrefix = input.prefix ? normalizeKey(input.prefix) : undefined;\n\tconst limit = Math.max(1, Math.min(100, input.limit ?? 20));\n\tconst includeValues = input.includeValues !== false;\n\n\treturn withLockedStore(context, (store) => {\n\t\tconst matchedItems: SharedMemoryReadItem[] = [];\n\t\tfor (const [scopedKey, entry] of Object.entries(store.entries)) {\n\t\t\tconst matched = matchesScopeAndPrefix(context, scopedKey, input.scope, normalizedKey, normalizedPrefix);\n\t\t\tif (!matched.matched) continue;\n\t\t\tmatchedItems.push({\n\t\t\t\tkey: matched.parsed.key,\n\t\t\t\tscope: input.scope,\n\t\t\t\tvalue: includeValues ? entry.value : undefined,\n\t\t\t\tversion: entry.version,\n\t\t\t\tupdatedAt: entry.updatedAt,\n\t\t\t\twriter: entry.writer ?? {},\n\t\t\t});\n\t\t}\n\n\t\tmatchedItems.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n\t\tconst sliced = matchedItems.slice(0, limit);\n\t\treturn {\n\t\t\trunId: store.runId,\n\t\t\tscope: input.scope,\n\t\t\titems: sliced,\n\t\t\ttotalMatched: matchedItems.length,\n\t\t};\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"shared-memory.js","sourceRoot":"","sources":["../../src/core/shared-memory.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\n\nexport type SharedMemoryScope = \"run\" | \"task\";\nexport type SharedMemoryWriteMode = \"set\" | \"append\";\n\nexport interface SharedMemoryWriter {\n\ttaskId?: string;\n\tdelegateId?: string;\n\tprofile?: string;\n}\n\nexport interface SharedMemoryContext {\n\trootCwd: string;\n\trunId: string;\n\ttaskId?: string;\n\tdelegateId?: string;\n\tprofile?: string;\n}\n\ninterface SharedMemoryEntry {\n\tvalue: string;\n\tversion: number;\n\tupdatedAt: string;\n\twriter: SharedMemoryWriter;\n}\n\ninterface SharedMemoryHistoryItem {\n\tkey: string;\n\tscope: SharedMemoryScope;\n\tmode: SharedMemoryWriteMode;\n\tversion: number;\n\tupdatedAt: string;\n\twriter: SharedMemoryWriter;\n}\n\ninterface SharedMemoryStore {\n\trunId: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tentries: Record<string, SharedMemoryEntry>;\n\thistory: SharedMemoryHistoryItem[];\n}\n\nexport interface SharedMemoryReadItem {\n\tkey: string;\n\tscope: SharedMemoryScope;\n\tvalue?: string;\n\tversion: number;\n\tupdatedAt: string;\n\twriter: SharedMemoryWriter;\n}\n\nexport interface SharedMemoryReadResult {\n\trunId: string;\n\tscope: SharedMemoryScope;\n\titems: SharedMemoryReadItem[];\n\ttotalMatched: number;\n}\n\nexport interface SharedMemoryWriteInput {\n\tkey: string;\n\tvalue: string;\n\tscope: SharedMemoryScope;\n\tmode: SharedMemoryWriteMode;\n\tifVersion?: number;\n}\n\nexport interface SharedMemoryReadInput {\n\tscope: SharedMemoryScope;\n\tkey?: string;\n\tprefix?: string;\n\tlimit?: number;\n\tincludeValues?: boolean;\n}\n\nconst maxEntryCharsDefault = 4000;\nconst maxKeysDefault = 500;\nconst historySizeDefault = 1000;\nconst lockRetryAttempts = 12;\nconst lockRetryDelayMs = 20;\nconst snapshotRetryAttempts = 4;\nconst snapshotRetryDelayMs = 8;\n\nconst maxEntryChars = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_MAX_ENTRY_CHARS, maxEntryCharsDefault, 64, 20_000);\nconst maxKeys = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_MAX_KEYS, maxKeysDefault, 10, 20_000);\nconst historySize = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_HISTORY_SIZE, historySizeDefault, 10, 50_000);\n\nfunction readBoundedInt(raw: string | undefined, fallback: number, min: number, max: number): number {\n\tconst parsed = raw ? Number.parseInt(raw, 10) : fallback;\n\tif (!Number.isInteger(parsed)) return fallback;\n\treturn Math.max(min, Math.min(max, parsed));\n}\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n\tif (!signal) {\n\t\treturn new Promise((resolve) => setTimeout(resolve, ms));\n\t}\n\tif (signal.aborted) {\n\t\treturn Promise.reject(new Error(\"Operation aborted\"));\n\t}\n\treturn new Promise((resolve, reject) => {\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, ms);\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\treject(new Error(\"Operation aborted\"));\n\t\t};\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nclass Mutex {\n\tprivate locked = false;\n\tprivate readonly waiters: Array<() => void> = [];\n\n\tasync acquire(): Promise<() => void> {\n\t\tif (!this.locked) {\n\t\t\tthis.locked = true;\n\t\t\treturn () => this.release();\n\t\t}\n\t\tawait new Promise<void>((resolve) => this.waiters.push(resolve));\n\t\tthis.locked = true;\n\t\treturn () => this.release();\n\t}\n\n\tprivate release(): void {\n\t\tthis.locked = false;\n\t\tconst next = this.waiters.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t}\n\t}\n\n\tisIdle(): boolean {\n\t\treturn !this.locked && this.waiters.length === 0;\n\t}\n}\n\nconst localWriteMutexes = new Map<string, Mutex>();\n\nfunction getOrCreateLocalWriteMutex(filePath: string): Mutex {\n\tconst existing = localWriteMutexes.get(filePath);\n\tif (existing) return existing;\n\tconst created = new Mutex();\n\tlocalWriteMutexes.set(filePath, created);\n\treturn created;\n}\n\nfunction cleanupLocalWriteMutex(filePath: string): void {\n\tconst existing = localWriteMutexes.get(filePath);\n\tif (!existing || !existing.isIdle()) return;\n\tlocalWriteMutexes.delete(filePath);\n}\n\nfunction normalizeRunId(runId: string): string {\n\tconst trimmed = runId.trim();\n\tif (!trimmed) throw new Error(\"shared memory requires non-empty run_id context\");\n\treturn trimmed;\n}\n\nfunction normalizeKey(key: string): string {\n\tconst normalized = key.trim().replace(/\\s+/g, \" \");\n\tif (!normalized) throw new Error(\"shared memory key must be non-empty\");\n\tif (normalized.length > 240) {\n\t\tthrow new Error(\"shared memory key too long (max 240 chars)\");\n\t}\n\treturn normalized;\n}\n\nfunction resolveScopedKey(context: SharedMemoryContext, scope: SharedMemoryScope, key: string): string {\n\tconst normalizedKey = normalizeKey(key);\n\tif (scope === \"task\") {\n\t\tif (!context.taskId || !context.taskId.trim()) {\n\t\t\tthrow new Error(\"task-scoped shared memory requires task_id context\");\n\t\t}\n\t\treturn `task:${context.taskId.trim()}:${normalizedKey}`;\n\t}\n\treturn `run:${normalizedKey}`;\n}\n\nfunction parseScopedKey(scopedKey: string): { scope: SharedMemoryScope; key: string; taskId?: string } {\n\tif (scopedKey.startsWith(\"task:\")) {\n\t\tconst rest = scopedKey.slice(\"task:\".length);\n\t\tconst split = rest.indexOf(\":\");\n\t\tif (split <= 0) {\n\t\t\treturn { scope: \"task\", key: rest };\n\t\t}\n\t\treturn {\n\t\t\tscope: \"task\",\n\t\t\ttaskId: rest.slice(0, split),\n\t\t\tkey: rest.slice(split + 1),\n\t\t};\n\t}\n\tif (scopedKey.startsWith(\"run:\")) {\n\t\treturn { scope: \"run\", key: scopedKey.slice(\"run:\".length) };\n\t}\n\treturn { scope: \"run\", key: scopedKey };\n}\n\nfunction getSharedMemoryDir(rootCwd: string): string {\n\treturn join(rootCwd, \".iosm\", \"subagents\", \"shared-memory\");\n}\n\nexport function getSharedMemoryPath(rootCwd: string, runId: string): string {\n\treturn join(getSharedMemoryDir(rootCwd), `${normalizeRunId(runId)}.json`);\n}\n\nfunction createInitialStore(runId: string): SharedMemoryStore {\n\tconst now = new Date().toISOString();\n\treturn {\n\t\trunId,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t\tentries: {},\n\t\thistory: [],\n\t};\n}\n\nfunction normalizeParsedStore(runId: string, parsed: unknown): SharedMemoryStore {\n\tif (!parsed || typeof parsed !== \"object\") return createInitialStore(runId);\n\tconst cast = parsed as SharedMemoryStore;\n\tif (cast.runId !== runId) return createInitialStore(runId);\n\tif (!cast.entries || typeof cast.entries !== \"object\") cast.entries = {};\n\tif (!Array.isArray(cast.history)) cast.history = [];\n\tif (!cast.createdAt || typeof cast.createdAt !== \"string\") cast.createdAt = new Date().toISOString();\n\tif (!cast.updatedAt || typeof cast.updatedAt !== \"string\") cast.updatedAt = cast.createdAt;\n\treturn cast;\n}\n\nfunction readStore(filePath: string, runId: string): SharedMemoryStore {\n\tif (!existsSync(filePath)) {\n\t\treturn createInitialStore(runId);\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(filePath, \"utf8\"));\n\t\treturn normalizeParsedStore(runId, parsed);\n\t} catch {\n\t\treturn createInitialStore(runId);\n\t}\n}\n\nasync function readStoreSnapshot(filePath: string, runId: string, signal?: AbortSignal): Promise<SharedMemoryStore> {\n\tif (!existsSync(filePath)) {\n\t\treturn createInitialStore(runId);\n\t}\n\tfor (let attempt = 1; attempt <= snapshotRetryAttempts; attempt += 1) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(readFileSync(filePath, \"utf8\"));\n\t\t\treturn normalizeParsedStore(runId, parsed);\n\t\t} catch {\n\t\t\tif (attempt >= snapshotRetryAttempts) break;\n\t\t\tawait delay(snapshotRetryDelayMs * attempt, signal);\n\t\t}\n\t}\n\treturn createInitialStore(runId);\n}\n\nfunction writeStore(filePath: string, store: SharedMemoryStore): void {\n\tmkdirSync(dirname(filePath), { recursive: true });\n\tconst tempPath = `${filePath}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;\n\ttry {\n\t\twriteFileSync(tempPath, `${JSON.stringify(store, null, 2)}\\n`, \"utf8\");\n\t\trenameSync(tempPath, filePath);\n\t} finally {\n\t\tif (existsSync(tempPath)) {\n\t\t\trmSync(tempPath, { force: true });\n\t\t}\n\t}\n}\n\nasync function acquireFileLock(filePath: string, signal?: AbortSignal): Promise<() => Promise<void>> {\n\tfor (let attempt = 1; attempt <= lockRetryAttempts; attempt += 1) {\n\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\ttry {\n\t\t\treturn await lockfile.lock(filePath, { realpath: false });\n\t\t} catch (error) {\n\t\t\tconst code = error && typeof error === \"object\" && \"code\" in error ? String(error.code) : \"\";\n\t\t\tif (code !== \"ELOCKED\" || attempt >= lockRetryAttempts) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tawait delay(lockRetryDelayMs * attempt, signal);\n\t\t}\n\t}\n\tthrow new Error(\"failed to acquire shared memory lock\");\n}\n\nasync function withLockedStore<T>(\n\tcontext: SharedMemoryContext,\n\tfn: (store: SharedMemoryStore, filePath: string) => T,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tconst runId = normalizeRunId(context.runId);\n\tconst filePath = getSharedMemoryPath(context.rootCwd, runId);\n\tconst releaseLocalMutex = await getOrCreateLocalWriteMutex(filePath).acquire();\n\tmkdirSync(dirname(filePath), { recursive: true });\n\tif (!existsSync(filePath)) {\n\t\twriteStore(filePath, createInitialStore(runId));\n\t}\n\tconst release = await acquireFileLock(filePath, signal);\n\ttry {\n\t\tconst store = readStore(filePath, runId);\n\t\tconst value = fn(store, filePath);\n\t\twriteStore(filePath, store);\n\t\treturn value;\n\t} finally {\n\t\ttry {\n\t\t\tawait release();\n\t\t} finally {\n\t\t\treleaseLocalMutex();\n\t\t\tcleanupLocalWriteMutex(filePath);\n\t\t}\n\t}\n}\n\nasync function withSnapshotStore<T>(\n\tcontext: SharedMemoryContext,\n\tfn: (store: SharedMemoryStore, filePath: string) => T,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tconst runId = normalizeRunId(context.runId);\n\tconst filePath = getSharedMemoryPath(context.rootCwd, runId);\n\tconst store = await readStoreSnapshot(filePath, runId, signal);\n\treturn fn(store, filePath);\n}\n\nfunction isAbortError(error: unknown): boolean {\n\tif (error instanceof Error) return /aborted/i.test(error.message);\n\tif (typeof error === \"string\") return /aborted/i.test(error);\n\treturn false;\n}\n\nfunction normalizeLockError(error: unknown): never {\n\tif (isAbortError(error)) {\n\t\tthrow new Error(\"Operation aborted\");\n\t}\n\tthrow error;\n}\n\nfunction trimHistory(store: SharedMemoryStore): void {\n\tif (store.history.length <= historySize) return;\n\tstore.history = store.history.slice(store.history.length - historySize);\n}\n\nfunction writerFromContext(context: SharedMemoryContext): SharedMemoryWriter {\n\treturn {\n\t\ttaskId: context.taskId?.trim() || undefined,\n\t\tdelegateId: context.delegateId?.trim() || undefined,\n\t\tprofile: context.profile?.trim() || undefined,\n\t};\n}\n\nexport async function writeSharedMemory(\n\tcontext: SharedMemoryContext,\n\tinput: SharedMemoryWriteInput,\n\tsignal?: AbortSignal,\n): Promise<SharedMemoryReadItem> {\n\tconst normalizedValue = input.value;\n\tif (normalizedValue.length > maxEntryChars) {\n\t\tthrow new Error(`shared memory value exceeds ${maxEntryChars} chars`);\n\t}\n\tconst scopedKey = resolveScopedKey(context, input.scope, input.key);\n\ttry {\n\t\treturn await withLockedStore(context, (store) => {\n\t\tconst now = new Date().toISOString();\n\t\tconst entriesCount = Object.keys(store.entries).length;\n\t\tconst previous = store.entries[scopedKey];\n\t\tif (!previous && entriesCount >= maxKeys) {\n\t\t\tthrow new Error(`shared memory key limit reached (${maxKeys})`);\n\t\t}\n\t\tif (input.ifVersion !== undefined && previous && previous.version !== input.ifVersion) {\n\t\t\tthrow new Error(`shared memory CAS mismatch for key \"${input.key}\" (expected ${input.ifVersion}, got ${previous.version})`);\n\t\t}\n\t\tif (input.ifVersion !== undefined && !previous) {\n\t\t\tthrow new Error(`shared memory CAS mismatch for key \"${input.key}\" (expected ${input.ifVersion}, got 0)`);\n\t\t}\n\n\t\tconst nextValue = input.mode === \"append\" ? `${previous?.value ?? \"\"}${normalizedValue}` : normalizedValue;\n\t\tif (nextValue.length > maxEntryChars) {\n\t\t\tthrow new Error(`shared memory value exceeds ${maxEntryChars} chars after ${input.mode}`);\n\t\t}\n\t\tconst nextVersion = (previous?.version ?? 0) + 1;\n\t\tconst writer = writerFromContext(context);\n\t\tstore.entries[scopedKey] = {\n\t\t\tvalue: nextValue,\n\t\t\tversion: nextVersion,\n\t\t\tupdatedAt: now,\n\t\t\twriter,\n\t\t};\n\t\tstore.updatedAt = now;\n\t\tstore.history.push({\n\t\t\tkey: normalizeKey(input.key),\n\t\t\tscope: input.scope,\n\t\t\tmode: input.mode,\n\t\t\tversion: nextVersion,\n\t\t\tupdatedAt: now,\n\t\t\twriter,\n\t\t});\n\t\ttrimHistory(store);\n\n\t\treturn {\n\t\t\tkey: normalizeKey(input.key),\n\t\t\tscope: input.scope,\n\t\t\tvalue: nextValue,\n\t\t\tversion: nextVersion,\n\t\t\tupdatedAt: now,\n\t\t\twriter,\n\t\t};\n\t\t}, signal);\n\t} catch (error) {\n\t\tnormalizeLockError(error);\n\t}\n}\n\nfunction matchesScopeAndPrefix(\n\tcontext: SharedMemoryContext,\n\tscopedKey: string,\n\tscope: SharedMemoryScope,\n\tkey: string | undefined,\n\tprefix: string | undefined,\n): { matched: boolean; parsed: ReturnType<typeof parseScopedKey> } {\n\tconst parsed = parseScopedKey(scopedKey);\n\tif (parsed.scope !== scope) return { matched: false, parsed };\n\tif (scope === \"task\") {\n\t\tconst taskId = context.taskId?.trim();\n\t\tif (!taskId) return { matched: false, parsed };\n\t\tif (parsed.taskId !== taskId) return { matched: false, parsed };\n\t}\n\tif (key) {\n\t\treturn { matched: parsed.key === key, parsed };\n\t}\n\tif (prefix) {\n\t\treturn { matched: parsed.key.startsWith(prefix), parsed };\n\t}\n\treturn { matched: true, parsed };\n}\n\nexport async function readSharedMemory(\n\tcontext: SharedMemoryContext,\n\tinput: SharedMemoryReadInput,\n\tsignal?: AbortSignal,\n): Promise<SharedMemoryReadResult> {\n\tconst normalizedKey = input.key ? normalizeKey(input.key) : undefined;\n\tconst normalizedPrefix = input.prefix ? normalizeKey(input.prefix) : undefined;\n\tconst limit = Math.max(1, Math.min(100, input.limit ?? 20));\n\tconst includeValues = input.includeValues !== false;\n\n\ttry {\n\t\treturn await withSnapshotStore(context, (store) => {\n\t\tconst matchedItems: SharedMemoryReadItem[] = [];\n\t\tfor (const [scopedKey, entry] of Object.entries(store.entries)) {\n\t\t\tconst matched = matchesScopeAndPrefix(context, scopedKey, input.scope, normalizedKey, normalizedPrefix);\n\t\t\tif (!matched.matched) continue;\n\t\t\tmatchedItems.push({\n\t\t\t\tkey: matched.parsed.key,\n\t\t\t\tscope: input.scope,\n\t\t\t\tvalue: includeValues ? entry.value : undefined,\n\t\t\t\tversion: entry.version,\n\t\t\t\tupdatedAt: entry.updatedAt,\n\t\t\t\twriter: entry.writer ?? {},\n\t\t\t});\n\t\t}\n\n\t\tmatchedItems.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n\t\tconst sliced = matchedItems.slice(0, limit);\n\t\treturn {\n\t\t\trunId: store.runId,\n\t\t\tscope: input.scope,\n\t\t\titems: sliced,\n\t\t\ttotalMatched: matchedItems.length,\n\t\t};\n\t\t}, signal);\n\t} catch (error) {\n\t\tnormalizeLockError(error);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singular.d.ts","sourceRoot":"","sources":["../../src/core/singular.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC3D,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC5D,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG,yBAAyB,GAAG,OAAO,CAAC;AAC3F,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,cAAc,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,YAAY,EAAE,mBAAmB,CAAC;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,cAAc,EAAE,sBAAsB,CAAC;IACvC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACtC,GAAG,EAAE,MAAM,CAAC;CACZ;
|
|
1
|
+
{"version":3,"file":"singular.d.ts","sourceRoot":"","sources":["../../src/core/singular.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC3D,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC5D,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG,yBAAyB,GAAG,OAAO,CAAC;AAC3F,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,cAAc,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,YAAY,EAAE,mBAAmB,CAAC;IAClC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,cAAc,EAAE,sBAAsB,CAAC;IACvC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACtC,GAAG,EAAE,MAAM,CAAC;CACZ;AAsGD,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,OAAO,EAAE,sBAAsB;IAI3C,eAAe,IAAI,MAAM;IAIzB,UAAU,IAAI,eAAe,GAAG,SAAS;IA4CnC,OAAO,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoD/E,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAIlD,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,cAAc;IA+CtB,OAAO,CAAC,SAAS;IAsCjB,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,uBAAuB;IA8B/B,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,YAAY;CAmEpB"}
|
package/dist/core/singular.js
CHANGED
|
@@ -64,7 +64,9 @@ function buildRunId(date = new Date()) {
|
|
|
64
64
|
const hours = String(date.getUTCHours()).padStart(2, "0");
|
|
65
65
|
const minutes = String(date.getUTCMinutes()).padStart(2, "0");
|
|
66
66
|
const seconds = String(date.getUTCSeconds()).padStart(2, "0");
|
|
67
|
-
|
|
67
|
+
const millis = String(date.getUTCMilliseconds()).padStart(3, "0");
|
|
68
|
+
const suffix = Math.random().toString(36).slice(2, 6);
|
|
69
|
+
return `${year}-${month}-${day}-${hours}${minutes}${seconds}-${millis}-${suffix}`;
|
|
68
70
|
}
|
|
69
71
|
function normalizeRequestTokens(request) {
|
|
70
72
|
return request
|