@sema-agent/core 1.362.0 → 1.364.0

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 (41) hide show
  1. package/dist/agents/subagent.d.ts +2 -0
  2. package/dist/agents/subagent.d.ts.map +1 -1
  3. package/dist/agents/subagent.js +77 -22
  4. package/dist/agents/subagent.js.map +1 -1
  5. package/dist/core/background-agent-store.d.ts +110 -0
  6. package/dist/core/background-agent-store.d.ts.map +1 -0
  7. package/dist/core/background-agent-store.js +0 -0
  8. package/dist/core/background-agent-store.js.map +1 -0
  9. package/dist/core/runner/prepare-task.d.ts.map +1 -1
  10. package/dist/core/runner/prepare-task.js +2 -1
  11. package/dist/core/runner/prepare-task.js.map +1 -1
  12. package/dist/core/task-registry.d.ts +44 -0
  13. package/dist/core/task-registry.d.ts.map +1 -1
  14. package/dist/core/task-registry.js +355 -4
  15. package/dist/core/task-registry.js.map +1 -1
  16. package/dist/core/types.d.ts +1 -0
  17. package/dist/core/types.d.ts.map +1 -1
  18. package/dist/index.d.ts +4 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +4 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/prompts/coordinator.d.ts +3 -2
  23. package/dist/prompts/coordinator.d.ts.map +1 -1
  24. package/dist/prompts/coordinator.js +6 -0
  25. package/dist/prompts/coordinator.js.map +1 -1
  26. package/dist/scenarios/full-body.d.ts +2 -0
  27. package/dist/scenarios/full-body.d.ts.map +1 -1
  28. package/dist/scenarios/full-body.js +1 -1
  29. package/dist/scenarios/full-body.js.map +1 -1
  30. package/dist/stores/file/background-agent-store.d.ts +49 -0
  31. package/dist/stores/file/background-agent-store.d.ts.map +1 -0
  32. package/dist/stores/file/background-agent-store.js +227 -0
  33. package/dist/stores/file/background-agent-store.js.map +1 -0
  34. package/dist/stores/file/fs-atomic.d.ts.map +1 -1
  35. package/dist/stores/file/fs-atomic.js +17 -1
  36. package/dist/stores/file/fs-atomic.js.map +1 -1
  37. package/dist/tools/task-list.d.ts +11 -1
  38. package/dist/tools/task-list.d.ts.map +1 -1
  39. package/dist/tools/task-list.js +108 -32
  40. package/dist/tools/task-list.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,227 @@
1
+ import { join } from "node:path";
2
+ import { BackgroundAgentStoreError, } from "../../core/background-agent-store.js";
3
+ import { AppendLog, atomicWriteFile, ensureDir, readJsonlRecords } from "./fs-atomic.js";
4
+ export class FileBackgroundAgentStore {
5
+ dir;
6
+ tmpDir;
7
+ ledgerPath;
8
+ snapshotPath;
9
+ fsyncEnabled;
10
+ compactEvery;
11
+ rows = new Map();
12
+ locks = new Map();
13
+ ledgerEvents = 0;
14
+ log;
15
+ constructor(root, opts = {}) {
16
+ this.dir = join(root, "background-agents");
17
+ this.tmpDir = join(root, "tmp");
18
+ this.ledgerPath = join(this.dir, "agents.jsonl");
19
+ this.snapshotPath = join(this.dir, "agents.snapshot.jsonl");
20
+ this.fsyncEnabled = opts.fsync !== false;
21
+ this.compactEvery = opts.compactEvery ?? 1000;
22
+ ensureDir(this.dir);
23
+ ensureDir(this.tmpDir);
24
+ this.replay();
25
+ this.log = new AppendLog(this.ledgerPath);
26
+ }
27
+ key(handle, scope) {
28
+ return `${scope} ${handle}`;
29
+ }
30
+ replay() {
31
+ for (const snap of readJsonlRecords(this.snapshotPath)) {
32
+ this.rows.set(this.key(snap.handle, snap.scope), snap);
33
+ }
34
+ const events = readJsonlRecords(this.ledgerPath);
35
+ this.ledgerEvents = events.length;
36
+ for (const ev of events)
37
+ this.applyEvent(ev);
38
+ }
39
+ applyEvent(ev) {
40
+ if (ev.t === "delete") {
41
+ this.rows.delete(ev.k);
42
+ return;
43
+ }
44
+ this.rows.set(ev.k, ev.r);
45
+ }
46
+ withLock(key, fn) {
47
+ const prev = this.locks.get(key) ?? Promise.resolve();
48
+ const run = prev.then(() => fn(), () => fn());
49
+ const tail = run.then(() => { }, () => { });
50
+ this.locks.set(key, tail);
51
+ void tail.then(() => {
52
+ if (this.locks.get(key) === tail)
53
+ this.locks.delete(key);
54
+ });
55
+ return run;
56
+ }
57
+ commit(ev) {
58
+ this.log.append(ev, this.fsyncEnabled);
59
+ this.applyEvent(ev);
60
+ this.ledgerEvents++;
61
+ if (this.ledgerEvents >= this.compactEvery)
62
+ this.compact();
63
+ }
64
+ async put(record) {
65
+ if (record.scope === undefined || record.scope === "") {
66
+ throw new Error("BackgroundAgentStore.put: refusing a row without a scope (world-readable through the fallback)");
67
+ }
68
+ const k = this.key(record.handle, record.scope);
69
+ return this.withLock(k, () => {
70
+ if (this.rows.has(k)) {
71
+ throw new BackgroundAgentStoreError("agent_record.already_exists", "agent record already exists");
72
+ }
73
+ const stored = structuredClone(record);
74
+ stored.rev = record.rev ?? 0;
75
+ this.commit({ t: "put", k, r: stored });
76
+ });
77
+ }
78
+ async get(handle, scope) {
79
+ const row = this.rows.get(this.key(handle, scope));
80
+ return row ? structuredClone(row) : null;
81
+ }
82
+ async update(handle, scope, record, expect) {
83
+ const k = this.key(handle, scope);
84
+ return this.withLock(k, () => {
85
+ const live = this.rows.get(k);
86
+ if (!live || live.scope !== scope || live.rev !== expect.rev)
87
+ return false;
88
+ const stored = structuredClone(record);
89
+ stored.handle = handle;
90
+ stored.scope = scope;
91
+ stored.rev = live.rev + 1;
92
+ this.commit({ t: "update", k, r: stored });
93
+ return true;
94
+ });
95
+ }
96
+ async listBySession(scope, sessionId, opts) {
97
+ const out = [];
98
+ for (const r of this.rows.values()) {
99
+ if (r.scope !== scope)
100
+ continue;
101
+ const anchor = r.sessionScoped ? r.owner : r.parentSessionId;
102
+ if (anchor !== sessionId)
103
+ continue;
104
+ if (opts?.status !== undefined && r.status !== opts.status)
105
+ continue;
106
+ out.push(toSummary(r));
107
+ }
108
+ out.sort((a, b) => b.spawnedAt - a.spawnedAt);
109
+ return opts?.limit !== undefined ? out.slice(0, Math.max(0, opts.limit)) : out;
110
+ }
111
+ async listByScope(scope, opts) {
112
+ const out = [];
113
+ for (const r of this.rows.values()) {
114
+ if (r.scope !== scope)
115
+ continue;
116
+ if (opts?.status !== undefined && r.status !== opts.status)
117
+ continue;
118
+ out.push(toSummary(r));
119
+ }
120
+ out.sort((a, b) => b.spawnedAt - a.spawnedAt);
121
+ return opts?.limit !== undefined ? out.slice(0, Math.max(0, opts.limit)) : out;
122
+ }
123
+ async delete(handle, scope, expect) {
124
+ const k = this.key(handle, scope);
125
+ return this.withLock(k, () => {
126
+ const live = this.rows.get(k);
127
+ if (!live)
128
+ return false;
129
+ if (expect !== undefined && live.rev !== expect.rev)
130
+ return false;
131
+ this.commit({ t: "delete", k });
132
+ return true;
133
+ });
134
+ }
135
+ async reap(scope, now, opts) {
136
+ if (!opts || (opts.maxAgeMs === undefined && opts.keep === undefined && opts.staleRunningMaxAgeMs === undefined))
137
+ return 0;
138
+ let touched = 0;
139
+ if (opts.staleRunningMaxAgeMs !== undefined) {
140
+ const staleCandidates = [...this.rows.entries()]
141
+ .filter(([, r]) => r.scope === scope && r.status === "running" && now - r.updatedAt > opts.staleRunningMaxAgeMs)
142
+ .map(([k]) => k);
143
+ for (const k of staleCandidates) {
144
+ const flipped = await this.withLock(k, () => {
145
+ const live = this.rows.get(k);
146
+ if (!live || live.status !== "running" || now - live.updatedAt <= opts.staleRunningMaxAgeMs)
147
+ return false;
148
+ const next = structuredClone(live);
149
+ next.status = "failed";
150
+ next.stoppedBy = "system";
151
+ next.summary = next.summary ?? "host process interrupted (stale running row reaped)";
152
+ next.settledAt = now;
153
+ next.updatedAt = now;
154
+ next.rev = live.rev + 1;
155
+ this.commit({ t: "update", k, r: next });
156
+ return true;
157
+ });
158
+ if (flipped)
159
+ touched++;
160
+ }
161
+ }
162
+ const terminal = [...this.rows.entries()]
163
+ .filter(([, r]) => r.scope === scope && r.status !== "running")
164
+ .sort(([, a], [, b]) => b.spawnedAt - a.spawnedAt);
165
+ const doomed = new Map();
166
+ if (opts.maxAgeMs !== undefined) {
167
+ for (const [k, r] of terminal) {
168
+ if ((r.settledAt ?? r.spawnedAt) < now - opts.maxAgeMs)
169
+ doomed.set(k, { byAge: true });
170
+ }
171
+ }
172
+ if (opts.keep !== undefined) {
173
+ for (const [k] of terminal.slice(Math.max(0, opts.keep))) {
174
+ if (!doomed.has(k))
175
+ doomed.set(k, { byAge: false });
176
+ }
177
+ }
178
+ for (const [k, why] of doomed) {
179
+ const deleted = await this.withLock(k, () => {
180
+ const live = this.rows.get(k);
181
+ if (!live || live.scope !== scope || live.status === "running")
182
+ return false;
183
+ if (why.byAge && opts.maxAgeMs !== undefined && (live.settledAt ?? live.spawnedAt) >= now - opts.maxAgeMs)
184
+ return false;
185
+ this.commit({ t: "delete", k });
186
+ return true;
187
+ });
188
+ if (deleted)
189
+ touched++;
190
+ }
191
+ return touched;
192
+ }
193
+ compact() {
194
+ const lines = [...this.rows.values()].map((r) => JSON.stringify(r)).join("\n");
195
+ atomicWriteFile(this.tmpDir, this.snapshotPath, lines.length ? `${lines}\n` : "");
196
+ this.log.close();
197
+ atomicWriteFile(this.tmpDir, this.ledgerPath, "");
198
+ this.log = new AppendLog(this.ledgerPath);
199
+ this.ledgerEvents = 0;
200
+ }
201
+ compactNow() {
202
+ this.compact();
203
+ }
204
+ get size() {
205
+ return this.rows.size;
206
+ }
207
+ close() {
208
+ this.log.close();
209
+ }
210
+ }
211
+ function toSummary(r) {
212
+ return {
213
+ handle: r.handle,
214
+ owner: r.owner,
215
+ sessionScoped: r.sessionScoped,
216
+ ...(r.sessionId !== undefined ? { sessionId: r.sessionId } : {}),
217
+ ...(r.parentSessionId !== undefined ? { parentSessionId: r.parentSessionId } : {}),
218
+ ...(r.name !== undefined ? { name: r.name } : {}),
219
+ ...(r.agentType !== undefined ? { agentType: r.agentType } : {}),
220
+ status: r.status,
221
+ spawnedAt: r.spawnedAt,
222
+ updatedAt: r.updatedAt,
223
+ ...(r.settledAt !== undefined ? { settledAt: r.settledAt } : {}),
224
+ ...(r.usage !== undefined ? { usage: structuredClone(r.usage) } : {}),
225
+ };
226
+ }
227
+ //# sourceMappingURL=background-agent-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-agent-store.js","sourceRoot":"","sources":["../../../src/stores/file/background-agent-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fs-atomic.d.ts","sourceRoot":"","sources":["../../../src/stores/file/fs-atomic.ts"],"names":[],"mappings":"AA8CA,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKzD;AAQD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASnD;AAMD,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAKzD;AASD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA4BhF;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAWD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA2BnF;AAwCD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,CA2BrD;AAQD,qBAAa,SAAS;IACpB,OAAO,CAAC,EAAE,CAAS;gBACP,IAAI,EAAE,MAAM;IAMxB,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAM7C,KAAK,IAAI,IAAI;CAOd;AAYD,qBAAa,QAAQ;IAEP,OAAO,CAAC,QAAQ,CAAC,QAAQ;IADrC,OAAO,CAAC,IAAI,CAAS;gBACQ,QAAQ,EAAE,MAAM;IAG7C,OAAO,IAAI,IAAI;IAyCf,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAcnB,OAAO,IAAI,IAAI;CAUhB;AAgBD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CA2CxG"}
1
+ {"version":3,"file":"fs-atomic.d.ts","sourceRoot":"","sources":["../../../src/stores/file/fs-atomic.ts"],"names":[],"mappings":"AA+CA,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKzD;AAQD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASnD;AAMD,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAKzD;AASD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA4BhF;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAWD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA2BnF;AAwCD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,CA2BrD;AAQD,qBAAa,SAAS;IACpB,OAAO,CAAC,EAAE,CAAS;gBACP,IAAI,EAAE,MAAM;IAYxB,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAM7C,KAAK,IAAI,IAAI;CAOd;AA2BD,qBAAa,QAAQ;IAEP,OAAO,CAAC,QAAQ,CAAC,QAAQ;IADrC,OAAO,CAAC,IAAI,CAAS;gBACQ,QAAQ,EAAE,MAAM;IAG7C,OAAO,IAAI,IAAI;IAyCf,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAcnB,OAAO,IAAI,IAAI;CAUhB;AAgBD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CA2CxG"}
@@ -1,4 +1,4 @@
1
- import { closeSync, constants as FS, existsSync, linkSync, mkdirSync, openSync, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync, writeSync, fsyncSync, } from "node:fs";
1
+ import { closeSync, constants as FS, existsSync, linkSync, mkdirSync, openSync, readFileSync, realpathSync, renameSync, truncateSync, unlinkSync, writeFileSync, writeSync, fsyncSync, } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { basename, dirname, join } from "node:path";
4
4
  import { createHash, randomBytes } from "node:crypto";
@@ -134,6 +134,7 @@ export class AppendLog {
134
134
  fd;
135
135
  constructor(path) {
136
136
  ensureDir(dirnameOf(path));
137
+ truncateTornTail(path);
137
138
  this.fd = openSync(path, "a", 0o600);
138
139
  }
139
140
  append(record, fsync) {
@@ -150,6 +151,21 @@ export class AppendLog {
150
151
  }
151
152
  }
152
153
  }
154
+ function truncateTornTail(path) {
155
+ let raw;
156
+ try {
157
+ raw = readFileSync(path, "utf8");
158
+ }
159
+ catch (err) {
160
+ if (err.code === "ENOENT")
161
+ return;
162
+ throw err;
163
+ }
164
+ if (raw === "" || raw.endsWith("\n"))
165
+ return;
166
+ const lastNl = raw.lastIndexOf("\n");
167
+ truncateSync(path, lastNl === -1 ? 0 : Buffer.byteLength(raw.slice(0, lastNl + 1), "utf8"));
168
+ }
153
169
  export class BootLock {
154
170
  lockPath;
155
171
  held = false;
@@ -1 +1 @@
1
- {"version":3,"file":"fs-atomic.js","sourceRoot":"","sources":["../../../src/stores/file/fs-atomic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs-atomic.js","sourceRoot":"","sources":["../../../src/stores/file/fs-atomic.ts"],"names":[],"mappings":"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"}
@@ -10,5 +10,15 @@ export interface TaskListItem {
10
10
  blockedBy: string[];
11
11
  metadata?: Record<string, unknown>;
12
12
  }
13
- export declare function createTaskListTools(): ToolSpec[];
13
+ export interface TaskListStore {
14
+ get(id: string): TaskListItem | undefined | Promise<TaskListItem | undefined>;
15
+ set(id: string, item: TaskListItem): void | Promise<void>;
16
+ delete(id: string): boolean | Promise<boolean>;
17
+ list(): TaskListItem[] | Promise<TaskListItem[]>;
18
+ allocateId(): string | Promise<string>;
19
+ mutate?<T>(fn: (tx: TaskListStore) => Promise<T>): Promise<T>;
20
+ }
21
+ export declare function assertJsonMetadata(value: unknown, path?: string): void;
22
+ export declare function createMemoryTaskListStore(): TaskListStore;
23
+ export declare function createTaskListTools(store?: TaskListStore): ToolSpec[];
14
24
  //# sourceMappingURL=task-list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-list.d.ts","sourceRoot":"","sources":["../../src/tools/task-list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAgBjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;IAChD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAiCD,wBAAgB,mBAAmB,IAAI,QAAQ,EAAE,CA0VhD"}
1
+ {"version":3,"file":"task-list.d.ts","sourceRoot":"","sources":["../../src/tools/task-list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAwBjD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;IAChD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAkDD,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;IAC9E,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,IAAI,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACjD,UAAU,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAOvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/D;AAKD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAa,GAAG,IAAI,CAgB1E;AAGD,wBAAgB,yBAAyB,IAAI,aAAa,CAgBzD;AAuBD,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,QAAQ,EAAE,CA0YrE"}
@@ -21,11 +21,56 @@ function renderTask(t) {
21
21
  .join("\n");
22
22
  }
23
23
  function snapTask(t) {
24
- return { ...t, blocks: [...t.blocks], blockedBy: [...t.blockedBy], ...(t.metadata ? { metadata: { ...t.metadata } } : {}) };
24
+ return { ...t, blocks: [...t.blocks], blockedBy: [...t.blockedBy], ...(t.metadata ? { metadata: structuredClone(t.metadata) } : {}) };
25
25
  }
26
- export function createTaskListTools() {
26
+ export function assertJsonMetadata(value, path = "metadata") {
27
+ if (value === null)
28
+ return;
29
+ const t = typeof value;
30
+ if (t === "string" || t === "number" || t === "boolean")
31
+ return;
32
+ if (Array.isArray(value)) {
33
+ value.forEach((v, i) => assertJsonMetadata(v, `${path}[${i}]`));
34
+ return;
35
+ }
36
+ if (t === "object" && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)) {
37
+ for (const [k, v] of Object.entries(value)) {
38
+ if (v === undefined)
39
+ continue;
40
+ assertJsonMetadata(v, `${path}.${k}`);
41
+ }
42
+ return;
43
+ }
44
+ throw new Error(`Task ${path} must be JSON-serializable (found ${t === "object" ? "non-plain object" : t}).`);
45
+ }
46
+ export function createMemoryTaskListStore() {
27
47
  const tasks = new Map();
28
48
  let nextId = 1;
49
+ return {
50
+ get: (id) => {
51
+ const t = tasks.get(id);
52
+ return t ? snapTask(t) : undefined;
53
+ },
54
+ set: (id, item) => {
55
+ if (item.metadata)
56
+ assertJsonMetadata(item.metadata);
57
+ tasks.set(id, snapTask(item));
58
+ },
59
+ delete: (id) => tasks.delete(id),
60
+ list: () => [...tasks.values()].map(snapTask),
61
+ allocateId: () => String(nextId++),
62
+ };
63
+ }
64
+ const storeChains = new WeakMap();
65
+ function serialized(store, fn) {
66
+ const run = () => (store.mutate ? store.mutate(fn) : fn(store));
67
+ const prev = storeChains.get(store) ?? Promise.resolve();
68
+ const next = prev.then(run, run);
69
+ storeChains.set(store, next.then(() => undefined, () => undefined));
70
+ return next;
71
+ }
72
+ export function createTaskListTools(store) {
73
+ const tasks = store ?? createMemoryTaskListStore();
29
74
  const taskCreate = {
30
75
  name: "TaskCreate",
31
76
  contract: { contractId: "core.task_create@1", implementationRevision: "1" },
@@ -77,10 +122,12 @@ export function createTaskListTools() {
77
122
  metadata: Type.Optional(Type.Record(Type.String(), Type.Unknown(), { description: "Arbitrary metadata to attach to the task" })),
78
123
  }),
79
124
  effect: "idempotent",
80
- execute: (args) => {
125
+ execute: (args) => serialized(tasks, async (tx) => {
81
126
  const a = args;
82
- const id = String(nextId++);
83
- tasks.set(id, {
127
+ if (a.metadata)
128
+ assertJsonMetadata(a.metadata);
129
+ const id = String(await tx.allocateId());
130
+ const item = {
84
131
  id,
85
132
  subject: a.subject,
86
133
  description: a.description,
@@ -89,12 +136,13 @@ export function createTaskListTools() {
89
136
  blocks: [],
90
137
  blockedBy: [],
91
138
  metadata: a.metadata,
92
- });
139
+ };
140
+ await tx.set(id, item);
93
141
  return {
94
142
  content: `Task #${id} created successfully: ${a.subject}`,
95
- details: { type: "task", task: snapTask(tasks.get(id)) },
143
+ details: { type: "task", task: snapTask(item) },
96
144
  };
97
- },
145
+ }),
98
146
  };
99
147
  const taskGet = {
100
148
  name: "TaskGet",
@@ -119,14 +167,14 @@ export function createTaskListTools() {
119
167
  taskId: Type.String({ description: "The ID of the task to retrieve" }),
120
168
  }),
121
169
  effect: "read",
122
- execute: (args) => {
170
+ execute: (args) => serialized(tasks, async (tx) => {
123
171
  const id = String(args.taskId);
124
- const t = tasks.get(id);
172
+ const t = await tx.get(id);
125
173
  if (!t) {
126
174
  throw new Error(`Task #${id} not found.`);
127
175
  }
128
176
  return { content: renderTask(t), details: { type: "task", task: snapTask(t) } };
129
- },
177
+ }),
130
178
  };
131
179
  const taskUpdate = {
132
180
  name: "TaskUpdate",
@@ -164,7 +212,8 @@ export function createTaskListTools() {
164
212
  '- **subject**: Change the task title (imperative form, e.g., "Run tests")\n' +
165
213
  "- **description**: Change the task description\n" +
166
214
  '- **activeForm**: Present continuous form shown in spinner when in_progress (e.g., "Running tests")\n' +
167
- "- **owner**: Change the task owner (agent name)\n" +
215
+ "- **owner**: Change the task owner (agent name; null releases the task to unowned)\n" +
216
+ "- **ifOwnerIs**: Guard — only apply the update if the task's current owner matches (null = only if unowned). Combine with owner to claim a task safely.\n" +
168
217
  "- **metadata**: Merge metadata keys into the task (set a key to null to delete it)\n" +
169
218
  "- **addBlocks**: Mark tasks that cannot start until this one completes\n" +
170
219
  "- **addBlockedBy**: Mark tasks that must complete before this one can start\n" +
@@ -190,8 +239,8 @@ export function createTaskListTools() {
190
239
  "Delete a task:\n" +
191
240
  '```json\n{"taskId": "1", "status": "deleted"}\n```\n' +
192
241
  "\n" +
193
- "Claim a task by setting owner:\n" +
194
- '```json\n{"taskId": "1", "owner": "my-name"}\n```\n' +
242
+ "Claim a task by setting owner (the guard makes the claim atomic):\n" +
243
+ '```json\n{"taskId": "1", "owner": "my-name", "ifOwnerIs": null}\n```\n' +
195
244
  "\n" +
196
245
  "Set up task dependencies:\n" +
197
246
  '```json\n{"taskId": "2", "addBlockedBy": ["1"]}\n```',
@@ -201,7 +250,12 @@ export function createTaskListTools() {
201
250
  subject: Type.Optional(Type.String({ description: "New subject for the task" })),
202
251
  description: Type.Optional(Type.String({ description: "New description for the task" })),
203
252
  activeForm: Type.Optional(Type.String({ description: 'Present continuous form shown in spinner when in_progress (e.g., "Running tests")' })),
204
- owner: Type.Optional(Type.String({ description: "New owner for the task" })),
253
+ owner: Type.Optional(Type.Union([Type.String(), Type.Null()], {
254
+ description: "New owner for the task (agent name; null releases the task to unowned)",
255
+ })),
256
+ ifOwnerIs: Type.Optional(Type.Union([Type.String(), Type.Null()], {
257
+ description: "Guard: only apply this update if the task's current owner matches (null = only if unowned). Use with owner to claim a task without racing another agent.",
258
+ })),
205
259
  metadata: Type.Optional(Type.Record(Type.String(), Type.Unknown(), {
206
260
  description: "Metadata keys to merge into the task. Set a key to null to delete it.",
207
261
  })),
@@ -209,19 +263,30 @@ export function createTaskListTools() {
209
263
  addBlockedBy: Type.Optional(Type.Array(Type.String(), { description: "Task IDs that block this task" })),
210
264
  }),
211
265
  effect: "idempotent",
212
- execute: (args) => {
266
+ execute: (args) => serialized(tasks, async (tx) => {
213
267
  const a = args;
214
268
  const id = String(a.taskId);
215
- const t = tasks.get(id);
269
+ const t = await tx.get(id);
216
270
  if (!t) {
217
271
  throw new Error(`Task #${id} not found.`);
218
272
  }
273
+ if (a.ifOwnerIs !== undefined) {
274
+ const match = a.ifOwnerIs === null ? t.owner === undefined : t.owner === a.ifOwnerIs;
275
+ if (!match) {
276
+ throw new Error(`Task #${id} owner guard failed: task is ${t.owner === undefined ? "unowned" : `owned by "${t.owner}"`}.`);
277
+ }
278
+ }
219
279
  if (a.status === "deleted") {
220
- tasks.delete(id);
221
- for (const other of tasks.values()) {
222
- other.blocks = other.blocks.filter((x) => x !== id);
223
- other.blockedBy = other.blockedBy.filter((x) => x !== id);
280
+ for (const other of await tx.list()) {
281
+ if (other.id === id)
282
+ continue;
283
+ const blocks = other.blocks.filter((x) => x !== id);
284
+ const blockedBy = other.blockedBy.filter((x) => x !== id);
285
+ if (blocks.length !== other.blocks.length || blockedBy.length !== other.blockedBy.length) {
286
+ await tx.set(other.id, { ...other, blocks, blockedBy });
287
+ }
224
288
  }
289
+ await tx.delete(id);
225
290
  return { content: `Task #${id} deleted.`, details: { type: "task", deleted: id } };
226
291
  }
227
292
  if (a.status)
@@ -232,9 +297,13 @@ export function createTaskListTools() {
232
297
  t.description = a.description;
233
298
  if (a.activeForm !== undefined)
234
299
  t.activeForm = a.activeForm;
235
- if (a.owner !== undefined)
236
- t.owner = a.owner;
300
+ if (a.owner !== undefined) {
301
+ if (a.owner === "")
302
+ throw new Error("owner must be a non-empty agent name (use null to release the task).");
303
+ t.owner = a.owner === null ? undefined : a.owner;
304
+ }
237
305
  if (a.metadata) {
306
+ assertJsonMetadata(a.metadata);
238
307
  t.metadata = { ...t.metadata };
239
308
  for (const [k, v] of Object.entries(a.metadata)) {
240
309
  if (k === "__proto__" || k === "constructor" || k === "prototype")
@@ -248,17 +317,24 @@ export function createTaskListTools() {
248
317
  for (const b of a.addBlocks ?? []) {
249
318
  if (!t.blocks.includes(b))
250
319
  t.blocks.push(b);
251
- const other = tasks.get(b);
252
- if (other && !other.blockedBy.includes(id))
320
+ const other = b === id ? t : await tx.get(b);
321
+ if (other && !other.blockedBy.includes(id)) {
253
322
  other.blockedBy.push(id);
323
+ if (other !== t)
324
+ await tx.set(b, other);
325
+ }
254
326
  }
255
327
  for (const b of a.addBlockedBy ?? []) {
256
328
  if (!t.blockedBy.includes(b))
257
329
  t.blockedBy.push(b);
258
- const other = tasks.get(b);
259
- if (other && !other.blocks.includes(id))
330
+ const other = b === id ? t : await tx.get(b);
331
+ if (other && !other.blocks.includes(id)) {
260
332
  other.blocks.push(id);
333
+ if (other !== t)
334
+ await tx.set(b, other);
335
+ }
261
336
  }
337
+ await tx.set(id, t);
262
338
  const changed = [
263
339
  a.status ? "status" : "",
264
340
  a.subject !== undefined ? "subject" : "",
@@ -270,7 +346,7 @@ export function createTaskListTools() {
270
346
  a.addBlockedBy?.length ? "blockedBy" : "",
271
347
  ].filter(Boolean);
272
348
  return { content: `Updated task #${id}${changed.length ? ` ${changed.join(", ")}` : ""}`, details: { type: "task", task: snapTask(t) } };
273
- },
349
+ }),
274
350
  };
275
351
  const taskList = {
276
352
  name: "TaskList",
@@ -300,11 +376,11 @@ export function createTaskListTools() {
300
376
  "Use TaskGet with a specific task ID to view full details including description and metadata.",
301
377
  parameters: Type.Object({}),
302
378
  effect: "read",
303
- execute: () => {
304
- if (tasks.size === 0) {
379
+ execute: () => serialized(tasks, async (tx) => {
380
+ const all = await tx.list();
381
+ if (all.length === 0) {
305
382
  return { content: "The task list is empty.", details: { type: "task-list", tasks: [] } };
306
383
  }
307
- const all = [...tasks.values()];
308
384
  const completed = new Set(all.filter((t) => t.status === "completed").map((t) => t.id));
309
385
  const lines = all.map((t) => {
310
386
  const liveBlockers = t.blockedBy.filter((b) => !completed.has(b));
@@ -315,7 +391,7 @@ export function createTaskListTools() {
315
391
  content: `${lines.join("\n")}\n(${all.length} total, ${open} open)`,
316
392
  details: { type: "task-list", tasks: all.map(snapTask) },
317
393
  };
318
- },
394
+ }),
319
395
  };
320
396
  return [taskCreate, taskGet, taskUpdate, taskList];
321
397
  }