@rotifer/playground 0.32.1 → 0.33.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 (107) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +2 -2
  3. package/README.zh.md +2 -2
  4. package/dist/commands/agent-create.d.ts +11 -0
  5. package/dist/commands/agent-create.d.ts.map +1 -1
  6. package/dist/commands/agent-create.js +50 -1
  7. package/dist/commands/agent-create.js.map +1 -1
  8. package/dist/commands/agent-memory.d.ts +64 -0
  9. package/dist/commands/agent-memory.d.ts.map +1 -0
  10. package/dist/commands/agent-memory.js +235 -0
  11. package/dist/commands/agent-memory.js.map +1 -0
  12. package/dist/commands/agent-run.d.ts.map +1 -1
  13. package/dist/commands/agent-run.js +84 -26
  14. package/dist/commands/agent-run.js.map +1 -1
  15. package/dist/commands/arena-submit.d.ts.map +1 -1
  16. package/dist/commands/arena-submit.js +9 -24
  17. package/dist/commands/arena-submit.js.map +1 -1
  18. package/dist/commands/compile.d.ts.map +1 -1
  19. package/dist/commands/compile.js +32 -6
  20. package/dist/commands/compile.js.map +1 -1
  21. package/dist/commands/genome-format.d.ts +5 -1
  22. package/dist/commands/genome-format.d.ts.map +1 -1
  23. package/dist/commands/genome-format.js +5 -1
  24. package/dist/commands/genome-format.js.map +1 -1
  25. package/dist/commands/hello.d.ts.map +1 -1
  26. package/dist/commands/hello.js +15 -2
  27. package/dist/commands/hello.js.map +1 -1
  28. package/dist/commands/run.d.ts.map +1 -1
  29. package/dist/commands/run.js +59 -4
  30. package/dist/commands/run.js.map +1 -1
  31. package/dist/commands/test.d.ts.map +1 -1
  32. package/dist/commands/test.js +78 -25
  33. package/dist/commands/test.js.map +1 -1
  34. package/dist/commands/wrap.d.ts.map +1 -1
  35. package/dist/commands/wrap.js +28 -70
  36. package/dist/commands/wrap.js.map +1 -1
  37. package/dist/index.js +47 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/memory/access.d.ts +53 -0
  40. package/dist/memory/access.d.ts.map +1 -0
  41. package/dist/memory/access.js +111 -0
  42. package/dist/memory/access.js.map +1 -0
  43. package/dist/memory/audit.d.ts +26 -0
  44. package/dist/memory/audit.d.ts.map +1 -0
  45. package/dist/memory/audit.js +30 -0
  46. package/dist/memory/audit.js.map +1 -0
  47. package/dist/memory/backend.d.ts +141 -0
  48. package/dist/memory/backend.d.ts.map +1 -0
  49. package/dist/memory/backend.js +536 -0
  50. package/dist/memory/backend.js.map +1 -0
  51. package/dist/memory/codec.d.ts +34 -0
  52. package/dist/memory/codec.d.ts.map +1 -0
  53. package/dist/memory/codec.js +184 -0
  54. package/dist/memory/codec.js.map +1 -0
  55. package/dist/memory/data-policy.d.ts +39 -0
  56. package/dist/memory/data-policy.d.ts.map +1 -0
  57. package/dist/memory/data-policy.js +42 -0
  58. package/dist/memory/data-policy.js.map +1 -0
  59. package/dist/memory/host.d.ts +119 -0
  60. package/dist/memory/host.d.ts.map +1 -0
  61. package/dist/memory/host.js +226 -0
  62. package/dist/memory/host.js.map +1 -0
  63. package/dist/memory/index.d.ts +37 -0
  64. package/dist/memory/index.d.ts.map +1 -0
  65. package/dist/memory/index.js +64 -0
  66. package/dist/memory/index.js.map +1 -0
  67. package/dist/memory/telemetry.d.ts +35 -0
  68. package/dist/memory/telemetry.d.ts.map +1 -0
  69. package/dist/memory/telemetry.js +51 -0
  70. package/dist/memory/telemetry.js.map +1 -0
  71. package/dist/memory/types.d.ts +110 -0
  72. package/dist/memory/types.d.ts.map +1 -0
  73. package/dist/memory/types.js +74 -0
  74. package/dist/memory/types.js.map +1 -0
  75. package/dist/publish/auto-publish.d.ts +1 -1
  76. package/dist/publish/auto-publish.js +1 -1
  77. package/dist/testsuite/gate.d.ts +8 -0
  78. package/dist/testsuite/gate.d.ts.map +1 -1
  79. package/dist/testsuite/gate.js +8 -2
  80. package/dist/testsuite/gate.js.map +1 -1
  81. package/dist/utils/arena-success.d.ts +10 -0
  82. package/dist/utils/arena-success.d.ts.map +1 -1
  83. package/dist/utils/arena-success.js +35 -8
  84. package/dist/utils/arena-success.js.map +1 -1
  85. package/dist/utils/binding.d.ts +6 -2
  86. package/dist/utils/binding.d.ts.map +1 -1
  87. package/dist/utils/binding.js.map +1 -1
  88. package/dist/utils/clawhub-client.d.ts +73 -0
  89. package/dist/utils/clawhub-client.d.ts.map +1 -0
  90. package/dist/utils/clawhub-client.js +176 -0
  91. package/dist/utils/clawhub-client.js.map +1 -0
  92. package/dist/utils/config.d.ts +7 -0
  93. package/dist/utils/config.d.ts.map +1 -1
  94. package/dist/utils/config.js +15 -1
  95. package/dist/utils/config.js.map +1 -1
  96. package/dist/utils/gene-id-display.d.ts +14 -0
  97. package/dist/utils/gene-id-display.d.ts.map +1 -0
  98. package/dist/utils/gene-id-display.js +64 -0
  99. package/dist/utils/gene-id-display.js.map +1 -0
  100. package/dist/utils/l0-gate.d.ts.map +1 -1
  101. package/dist/utils/l0-gate.js +4 -1
  102. package/dist/utils/l0-gate.js.map +1 -1
  103. package/dist/utils/rust-phenotype.d.ts +17 -5
  104. package/dist/utils/rust-phenotype.d.ts.map +1 -1
  105. package/dist/utils/rust-phenotype.js +25 -4
  106. package/dist/utils/rust-phenotype.js.map +1 -1
  107. package/package.json +10 -5
@@ -0,0 +1,536 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JsonFileMemoryBackend = exports.NapiMemoryBackend = void 0;
4
+ exports.hasNativeMemory = hasNativeMemory;
5
+ exports.asMemoryError = asMemoryError;
6
+ /**
7
+ * Where AgentMemory is kept, behind one interface.
8
+ *
9
+ * The store is rotifer-napi (SQLite in rotifer-core, in the project's
10
+ * `.rotifer/playground.db`). NapiMemoryBackend adapts
11
+ * its memoryRead / memoryWrite / memoryQuery / memoryDelete. There is no
12
+ * other production store: without the native binding, memory calls fail with
13
+ * MEMORY_STORAGE_ERROR.
14
+ *
15
+ * JsonFileMemoryBackend is a test double. It implements the same rules —
16
+ * validation, permission scopes, eviction order, size limits, audit and
17
+ * telemetry lines in rotifer-core's shapes — so the SDK can be tested where
18
+ * the native store is not built, and parity tests can hold the two side by
19
+ * side. It is not exported from the package, and nothing in the CLI uses it.
20
+ *
21
+ * Everything that crosses this interface is the wire JSON shape
22
+ * (MemoryEntryJson), because that is what napi and the WASM host calls pass.
23
+ * A backend records its own denials (audit + §17); the SDK layer above
24
+ * records the denials it raises itself (DataPolicy).
25
+ */
26
+ const node_fs_1 = require("node:fs");
27
+ const node_path_1 = require("node:path");
28
+ const node_crypto_1 = require("node:crypto");
29
+ const codec_js_1 = require("./codec.js");
30
+ const telemetry_js_1 = require("./telemetry.js");
31
+ const types_js_1 = require("./types.js");
32
+ function hasNativeMemory(binding) {
33
+ const b = binding;
34
+ return (!!b &&
35
+ typeof b.memoryRead === "function" &&
36
+ typeof b.memoryWrite === "function" &&
37
+ typeof b.memoryQuery === "function" &&
38
+ typeof b.memoryDelete === "function" &&
39
+ typeof b.memoryGet === "function" &&
40
+ typeof b.memoryCreate === "function" &&
41
+ typeof b.memorySetDataPolicyRetention === "function");
42
+ }
43
+ /** The napi store, behind MemoryBackend. Its errors become MemoryError. */
44
+ class NapiMemoryBackend {
45
+ native;
46
+ constructor(native) {
47
+ this.native = native;
48
+ }
49
+ read(caller, key, category) {
50
+ const request = category === null ? { key } : { key, category };
51
+ return this.call("memoryRead", caller, request);
52
+ }
53
+ write(caller, request) {
54
+ return this.call("memoryWrite", caller, request);
55
+ }
56
+ query(caller, filter) {
57
+ return this.call("memoryQuery", caller, filter);
58
+ }
59
+ delete(caller, key) {
60
+ this.call("memoryDelete", caller, { key });
61
+ }
62
+ usage(agentId) {
63
+ try {
64
+ const memory = this.native.memoryGet(agentId);
65
+ return { totalSize: memory.totalSize, quota: memory.quota };
66
+ }
67
+ catch (err) {
68
+ throw asMemoryError(err);
69
+ }
70
+ }
71
+ call(method, caller, request) {
72
+ try {
73
+ return this.native[method](caller.agentId, caller.geneId, caller.domain, JSON.stringify(request));
74
+ }
75
+ catch (err) {
76
+ throw asMemoryError(err);
77
+ }
78
+ }
79
+ }
80
+ exports.NapiMemoryBackend = NapiMemoryBackend;
81
+ /**
82
+ * napi throws "MEMORY_X: message" → MemoryError(code, message). Anything else
83
+ * the binding throws is a storage failure, not a pass-through.
84
+ */
85
+ function asMemoryError(err) {
86
+ if (err instanceof types_js_1.MemoryError)
87
+ return err;
88
+ const message = err instanceof Error ? err.message : String(err);
89
+ const match = /^(MEMORY_[A-Z_]+): ([\s\S]*)$/.exec(message);
90
+ if (match && types_js_1.MEMORY_ERROR_CODES.includes(match[1])) {
91
+ return new types_js_1.MemoryError(match[1], match[2]);
92
+ }
93
+ return new types_js_1.MemoryError("MEMORY_STORAGE_ERROR", message);
94
+ }
95
+ const DEPLOYER_CONFIGURED_DENIAL = "DEPLOYER_CONFIGURED resolves from the agent's DataPolicy (§30.2); DataPolicy defines no memory scope yet, so it is treated as not configured and denied";
96
+ /** The order quota pressure evicts in (spec §38.1 MUST); PREFERENCE never. */
97
+ const EVICTION_ORDER = ["CACHE", "PATTERN", "CONTEXT"];
98
+ /** "oldest" is updatedAt ascending, then entryId ascending. */
99
+ function oldestFirst(a, b) {
100
+ return Date.parse(a.updatedAt) - Date.parse(b.updatedAt) || (a.entryId < b.entryId ? -1 : a.entryId > b.entryId ? 1 : 0);
101
+ }
102
+ /** Query results are updatedAt descending, ties by entryId. */
103
+ function newestFirst(a, b) {
104
+ return Date.parse(b.updatedAt) - Date.parse(a.updatedAt) || (a.entryId < b.entryId ? -1 : a.entryId > b.entryId ? 1 : 0);
105
+ }
106
+ /**
107
+ * Complete test double: one JSON file per agent under
108
+ * `<root>/.rotifer/memory/<agentId>.json`. Audit lines go to the given sink
109
+ * before the file is replaced, and a failed audit or file write fails the
110
+ * call with MEMORY_STORAGE_ERROR. Not safe for concurrent
111
+ * writers across processes — it is not a production store.
112
+ */
113
+ class JsonFileMemoryBackend {
114
+ root;
115
+ configFor;
116
+ telemetry;
117
+ audit;
118
+ now;
119
+ constructor(root, configFor, telemetry, audit, options = {}) {
120
+ this.root = root;
121
+ this.configFor = configFor;
122
+ this.telemetry = telemetry;
123
+ this.audit = audit;
124
+ this.now = options.now ?? Date.now;
125
+ }
126
+ read(caller, key, category) {
127
+ this.requireIdentity(caller, "read", key);
128
+ (0, codec_js_1.checkKey)(key);
129
+ if (category !== null && !(0, types_js_1.isMemoryCategory)(category)) {
130
+ throw new types_js_1.MemoryError("MEMORY_INVALID_INPUT", `unknown category '${String(category)}'`);
131
+ }
132
+ const memory = this.loadLive(caller.agentId);
133
+ const entry = memory.entries.find((e) => e.key === key);
134
+ if (!entry || (category !== null && entry.category !== category))
135
+ return null;
136
+ this.requireScope(caller, memory, entry, "read", "read");
137
+ // A read is not a state change: lastAccessedBy moves, nothing is audited.
138
+ entry.lastAccessedBy = caller.geneId;
139
+ this.save(memory, []);
140
+ return publicEntry(entry);
141
+ }
142
+ write(caller, request) {
143
+ this.requireIdentity(caller, "write", request.key);
144
+ // The double checks its own input: it is used directly by tests, and a
145
+ // store that trusted its caller would let a bad base64 or enum through.
146
+ (0, codec_js_1.checkKey)(request.key);
147
+ if (!(0, types_js_1.isMemoryCategory)(request.category)) {
148
+ throw new types_js_1.MemoryError("MEMORY_INVALID_INPUT", `unknown category '${String(request.category)}'`);
149
+ }
150
+ const value = (0, codec_js_1.decodeValue)(request.value);
151
+ if (value.byteLength > types_js_1.MEMORY_MAX_VALUE_BYTES) {
152
+ throw new types_js_1.MemoryError("MEMORY_INVALID_INPUT", `value is ${value.byteLength} bytes; a memory value is at most ${types_js_1.MEMORY_MAX_VALUE_BYTES} bytes (1 MiB)`);
153
+ }
154
+ const accessPolicy = request.accessPolicy === undefined ? undefined : (0, codec_js_1.checkAccessPolicy)(request.accessPolicy);
155
+ const retentionPolicy = request.retentionPolicy === undefined ? undefined : (0, codec_js_1.checkRetentionPolicy)(request.retentionPolicy);
156
+ const memory = this.loadLive(caller.agentId);
157
+ const { quota } = this.configFor(caller.agentId);
158
+ const entryId = (0, codec_js_1.entryIdFor)(caller.agentId, request.key);
159
+ const existing = memory.entries.find((e) => e.key === request.key);
160
+ if (existing) {
161
+ this.requireScope(caller, memory, existing, "write", "write");
162
+ // Only the creator may change an
163
+ // entry's accessPolicy or retentionPolicy, null included. Another gene
164
+ // with write access may overwrite the value; if it passes a policy, it
165
+ // must be the stored one — a different one is refused, never ignored.
166
+ if (caller.geneId !== existing.createdBy) {
167
+ if (accessPolicy !== undefined && !samePolicy(existing.accessPolicy, accessPolicy)) {
168
+ this.deny(caller, memory, existing, "write", "only the creating gene may change an entry's accessPolicy");
169
+ }
170
+ if (retentionPolicy !== undefined && !sameRetention(existing.retentionPolicy, retentionPolicy)) {
171
+ this.deny(caller, memory, existing, "write", "only the creating gene may change an entry's retentionPolicy");
172
+ }
173
+ }
174
+ }
175
+ const nextAccess = accessPolicy ?? existing?.accessPolicy ?? { ...types_js_1.DEFAULT_ACCESS_POLICY };
176
+ // A scope that resolves from DataPolicy is refused when
177
+ // written — §30.2 defines none yet, so nothing could ever pass it.
178
+ if (accessPolicy !== undefined && (accessPolicy.readScope === "DEPLOYER_CONFIGURED" || accessPolicy.writeScope === "DEPLOYER_CONFIGURED")) {
179
+ this.deny(caller, memory, { entryId, category: request.category }, "write", DEPLOYER_CONFIGURED_DENIAL);
180
+ }
181
+ const nextRetention = retentionPolicy === undefined ? (existing?.retentionPolicy ?? null) : retentionPolicy;
182
+ const size = (0, codec_js_1.entrySize)(request.key, value);
183
+ const others = memory.entries.filter((e) => e !== existing);
184
+ const used = others.reduce((sum, e) => sum + storedSize(e), 0);
185
+ // Plan the eviction before touching anything: a write that cannot fit
186
+ // even after evicting everything evictable changes nothing.
187
+ const evictions = [];
188
+ let free = quota - used;
189
+ for (const category of EVICTION_ORDER) {
190
+ if (size <= free)
191
+ break;
192
+ for (const candidate of others.filter((e) => e.category === category).sort(oldestFirst)) {
193
+ if (size <= free)
194
+ break;
195
+ evictions.push(candidate);
196
+ free += storedSize(candidate);
197
+ }
198
+ }
199
+ if (size > free) {
200
+ this.writeAudit([this.line(caller, memory, "quota_rejected", entryId, request.category, 0, "MEMORY_QUOTA_EXCEEDED", used)]);
201
+ throw new types_js_1.MemoryError("MEMORY_QUOTA_EXCEEDED", `writing '${request.key}' (${size} bytes) does not fit the agent's ${quota}-byte quota even after evicting CACHE, PATTERN and CONTEXT entries`);
202
+ }
203
+ // Each evict line's totalSize is what the memory holds right after that
204
+ // eviction (never above the quota); the write's line has the final total
205
+ // — as rotifer-core records them.
206
+ const lines = [];
207
+ let held = used + (existing ? storedSize(existing) : 0);
208
+ for (const evicted of evictions) {
209
+ held -= storedSize(evicted);
210
+ lines.push(this.line(caller, memory, "evict", evicted.entryId, evicted.category, -storedSize(evicted), null, held));
211
+ }
212
+ const totalAfter = used + size - evictions.reduce((sum, e) => sum + storedSize(e), 0);
213
+ lines.push(this.line(caller, memory, existing ? "update" : "write", entryId, request.category, size - (existing ? storedSize(existing) : 0), null, totalAfter));
214
+ const at = (0, codec_js_1.toTimestamp)(this.now());
215
+ const next = existing
216
+ ? {
217
+ // The update keeps createdBy, and the stored policies unless the
218
+ // creator passed new ones.
219
+ ...existing,
220
+ category: request.category,
221
+ value: request.value,
222
+ // A write records its writer.
223
+ lastAccessedBy: caller.geneId,
224
+ updatedAt: at,
225
+ accessPolicy: nextAccess,
226
+ retentionPolicy: nextRetention,
227
+ }
228
+ : {
229
+ entryId,
230
+ category: request.category,
231
+ key: request.key,
232
+ value: request.value,
233
+ createdBy: caller.geneId,
234
+ // A new entry's lastAccessedBy is its writer.
235
+ lastAccessedBy: caller.geneId,
236
+ createdAt: at,
237
+ updatedAt: at,
238
+ accessPolicy: nextAccess,
239
+ retentionPolicy: nextRetention,
240
+ creatorDomain: caller.domain,
241
+ };
242
+ const updated = {
243
+ ...memory,
244
+ entries: [...others.filter((e) => !evictions.includes(e)), next],
245
+ };
246
+ // Audit first, then commit: if the audit cannot be
247
+ // written, nothing changes.
248
+ this.save(updated, lines);
249
+ return publicEntry(next);
250
+ }
251
+ query(caller, filter) {
252
+ this.requireIdentity(caller, "query", null);
253
+ const memory = this.loadLive(caller.agentId);
254
+ const since = filter.since === undefined ? -Infinity : Date.parse(filter.since);
255
+ const until = filter.until === undefined ? Infinity : Date.parse(filter.until);
256
+ const limit = Math.min(filter.limit ?? types_js_1.MEMORY_QUERY_DEFAULT_LIMIT, types_js_1.MEMORY_QUERY_MAX_LIMIT);
257
+ const hits = memory.entries
258
+ .filter((e) => {
259
+ if (filter.category && e.category !== filter.category)
260
+ return false;
261
+ if (filter.keyPrefix !== undefined && !e.key.startsWith(filter.keyPrefix))
262
+ return false;
263
+ const t = Date.parse(e.updatedAt);
264
+ if (t < since || t >= until)
265
+ return false;
266
+ // A query returns what the caller may read; it does not report the rest.
267
+ return this.mayAccess(caller, e, "read");
268
+ })
269
+ .sort(newestFirst)
270
+ .slice(0, limit);
271
+ // Refuse rather than truncate.
272
+ if (Buffer.byteLength(JSON.stringify(hits.map(publicEntry)), "utf8") > types_js_1.MEMORY_MAX_QUERY_RESPONSE_BYTES) {
273
+ throw new types_js_1.MemoryError("MEMORY_INVALID_INPUT", "result too large; lower limit or narrow the filter");
274
+ }
275
+ // A query is a scan and records no reader — it changes nothing.
276
+ return hits.map(publicEntry);
277
+ }
278
+ delete(caller, key) {
279
+ this.requireIdentity(caller, "delete", key);
280
+ (0, codec_js_1.checkKey)(key);
281
+ const memory = this.loadLive(caller.agentId);
282
+ const entry = memory.entries.find((e) => e.key === key);
283
+ if (!entry)
284
+ throw new types_js_1.MemoryError("MEMORY_NOT_FOUND", `no memory entry '${key}'`);
285
+ this.requireScope(caller, memory, entry, "write", "delete");
286
+ const remaining = memory.entries.filter((e) => e !== entry);
287
+ const total = remaining.reduce((sum, e) => sum + storedSize(e), 0);
288
+ this.save({ ...memory, entries: remaining }, [
289
+ this.line(caller, memory, "delete", entry.entryId, entry.category, -storedSize(entry), null, total),
290
+ ]);
291
+ }
292
+ /** Like napi's memoryGet, which it stands for: expired entries are purged first. */
293
+ usage(agentId) {
294
+ const memory = this.loadLive(agentId);
295
+ return { totalSize: memory.entries.reduce((sum, e) => sum + storedSize(e), 0), quota: this.configFor(agentId).quota };
296
+ }
297
+ /**
298
+ * napi's memorySetDataPolicyRetention: the agent's own retention, which an
299
+ * entry with no retentionPolicy inherits; null is unlimited. An integer
300
+ * 1..2147483647 or null, else MEMORY_INVALID_INPUT; an agent without memory
301
+ * is MEMORY_NOT_FOUND. Audited as retention_changed.
302
+ */
303
+ setDataPolicyRetention(agentId, days) {
304
+ if (days !== null && !(Number.isInteger(days) && days >= 1 && days <= codec_js_1.MAX_RETENTION_DAYS)) {
305
+ throw new types_js_1.MemoryError("MEMORY_INVALID_INPUT", `maxRetentionDays ${days} is not an integer from 1 to ${codec_js_1.MAX_RETENTION_DAYS}`);
306
+ }
307
+ if (!(0, node_fs_1.existsSync)(this.pathFor(agentId)))
308
+ throw new types_js_1.MemoryError("MEMORY_NOT_FOUND", `agent ${agentId} has no memory`);
309
+ const memory = this.load(agentId);
310
+ this.save({ ...memory, retentionDays: days }, [
311
+ {
312
+ ts: (0, codec_js_1.toTimestamp)(this.now()),
313
+ kind: "agent_memory",
314
+ action: "retention_changed",
315
+ agentId,
316
+ entryId: null,
317
+ category: null,
318
+ geneId: null,
319
+ sizeDelta: 0,
320
+ totalSize: memory.entries.reduce((sum, e) => sum + storedSize(e), 0),
321
+ quota: this.configFor(agentId).quota,
322
+ error: null,
323
+ },
324
+ ]);
325
+ }
326
+ /** Bytes of key + value + retention currently stored for the agent. */
327
+ totalSize(agentId) {
328
+ return this.usage(agentId).totalSize;
329
+ }
330
+ // ── permission ───────────────────────────
331
+ mayAccess(caller, entry, mode) {
332
+ const scope = mode === "read" ? entry.accessPolicy.readScope : entry.accessPolicy.writeScope;
333
+ switch (scope) {
334
+ case "CREATOR_GENE_ONLY":
335
+ return caller.geneId === entry.createdBy;
336
+ case "SAME_DOMAIN":
337
+ return caller.domain === entry.creatorDomain;
338
+ case "ALL_GENES":
339
+ return true;
340
+ // §30.2 DataPolicy defines no memory scope, so this is
341
+ // always "not configured", which denies.
342
+ case "DEPLOYER_CONFIGURED":
343
+ default:
344
+ return false;
345
+ }
346
+ }
347
+ requireScope(caller, memory, entry, mode, operation) {
348
+ if (this.mayAccess(caller, entry, mode))
349
+ return;
350
+ const scope = mode === "read" ? entry.accessPolicy.readScope : entry.accessPolicy.writeScope;
351
+ this.deny(caller, memory, entry, operation,
352
+ // DEPLOYER_CONFIGURED says why; any other refusal
353
+ // does not describe the stored entry's policy to the caller.
354
+ scope === "DEPLOYER_CONFIGURED" ? DEPLOYER_CONFIGURED_DENIAL : `this gene may not ${mode} it`);
355
+ }
356
+ /**
357
+ * Every call comes from a gene with a v2 id, which is
358
+ * what createdBy / lastAccessedBy record. Any other caller is refused —
359
+ * audited with geneId null (and the entry, when the call named a key) and
360
+ * reported — before anything is read or written.
361
+ */
362
+ requireIdentity(caller, operation, key) {
363
+ if ((0, codec_js_1.isV2GeneId)(caller.geneId))
364
+ return;
365
+ const entryId = typeof key === "string" && key.length > 0 ? (0, codec_js_1.entryIdFor)(caller.agentId, key) : null;
366
+ const message = `the calling gene has no content-derived (v2) id, so it may not use agent memory`;
367
+ const { totalSize, quota } = this.usage(caller.agentId);
368
+ this.writeAudit([
369
+ {
370
+ ts: (0, codec_js_1.toTimestamp)(this.now()),
371
+ kind: "agent_memory",
372
+ action: "access_denied",
373
+ agentId: caller.agentId,
374
+ entryId,
375
+ category: null,
376
+ geneId: null,
377
+ sizeDelta: 0,
378
+ totalSize,
379
+ quota,
380
+ error: "MEMORY_ACCESS_DENIED",
381
+ },
382
+ ]);
383
+ this.telemetry((0, telemetry_js_1.accessDeniedEvent)({ agentId: caller.agentId, geneId: null, entryId, operation, message, timestamp: (0, codec_js_1.toTimestamp)(this.now()) }));
384
+ throw new types_js_1.MemoryError("MEMORY_ACCESS_DENIED", message);
385
+ }
386
+ deny(caller, memory, entry, operation, why) {
387
+ const error = new types_js_1.MemoryError("MEMORY_ACCESS_DENIED", `gene ${caller.geneId} may not access entry ${entry.entryId}: ${why}`);
388
+ this.writeAudit([this.line(caller, memory, "access_denied", entry.entryId, entry.category, 0, "MEMORY_ACCESS_DENIED")]);
389
+ this.telemetry((0, telemetry_js_1.accessDeniedEvent)({
390
+ agentId: caller.agentId,
391
+ geneId: caller.geneId,
392
+ entryId: entry.entryId,
393
+ operation,
394
+ message: error.message,
395
+ timestamp: (0, codec_js_1.toTimestamp)(this.now()),
396
+ }));
397
+ throw error;
398
+ }
399
+ // ── storage ────────────────────────────────────────────────
400
+ pathFor(agentId) {
401
+ if (!/^[A-Za-z0-9._-]+$/.test(agentId)) {
402
+ throw new types_js_1.MemoryError("MEMORY_INVALID_INPUT", `agentId '${agentId}' is not a safe file name`);
403
+ }
404
+ return (0, node_path_1.join)(this.root, ".rotifer", "memory", `${agentId}.json`);
405
+ }
406
+ // ── retention ────────────────────────────────
407
+ /**
408
+ * An entry expires once now >= updatedAt + maxRetentionDays. Only an entry
409
+ * with no retentionPolicy inherits the agent's; its own maxRetentionDays:
410
+ * null is unlimited.
411
+ */
412
+ isExpired(entry, memory) {
413
+ const days = entry.retentionPolicy === null ? (memory.retentionDays ?? null) : entry.retentionPolicy.maxRetentionDays;
414
+ // Compare elapsed seconds with days × 86400; never add days
415
+ // to a timestamp (that overflows other bindings at the i32 upper bound).
416
+ return days !== null && (this.now() - Date.parse(entry.updatedAt)) / 1000 >= days * 86_400;
417
+ }
418
+ /**
419
+ * The agent's memory with its expired entries purged first — removed,
420
+ * audited one "expired" line each (no key, geneId null), in entryId order —
421
+ * before the call that asked for it, which may still be refused: as
422
+ * rotifer-core does it at the start of each call's transaction.
423
+ */
424
+ loadLive(agentId) {
425
+ const memory = this.load(agentId);
426
+ const expired = memory.entries
427
+ .filter((e) => this.isExpired(e, memory))
428
+ .sort((a, b) => (a.entryId < b.entryId ? -1 : a.entryId > b.entryId ? 1 : 0));
429
+ if (expired.length === 0)
430
+ return memory;
431
+ const remaining = memory.entries.filter((e) => !expired.includes(e));
432
+ let held = memory.entries.reduce((sum, e) => sum + storedSize(e), 0);
433
+ const lines = expired.map((e) => {
434
+ held -= storedSize(e);
435
+ return {
436
+ ts: (0, codec_js_1.toTimestamp)(this.now()),
437
+ kind: "agent_memory",
438
+ action: "expired",
439
+ agentId,
440
+ entryId: e.entryId,
441
+ category: e.category,
442
+ geneId: null,
443
+ sizeDelta: -storedSize(e),
444
+ totalSize: held,
445
+ quota: this.configFor(agentId).quota,
446
+ error: null,
447
+ };
448
+ });
449
+ const purged = { ...memory, entries: remaining };
450
+ this.save(purged, lines);
451
+ return purged;
452
+ }
453
+ load(agentId) {
454
+ const path = this.pathFor(agentId);
455
+ if (!(0, node_fs_1.existsSync)(path))
456
+ return { agentId, createdAt: (0, codec_js_1.toTimestamp)(this.now()), entries: [] };
457
+ try {
458
+ return JSON.parse((0, node_fs_1.readFileSync)(path, "utf-8"));
459
+ }
460
+ catch (err) {
461
+ throw new types_js_1.MemoryError("MEMORY_STORAGE_ERROR", `could not read agent memory: ${err.code ?? "unreadable"}`);
462
+ }
463
+ }
464
+ /** Audit lines first, then the file; a failure in either is MEMORY_STORAGE_ERROR. */
465
+ save(memory, lines) {
466
+ const path = this.pathFor(memory.agentId);
467
+ if (!(0, node_fs_1.existsSync)(path)) {
468
+ lines = [
469
+ {
470
+ ts: (0, codec_js_1.toTimestamp)(this.now()),
471
+ kind: "agent_memory",
472
+ action: "memory_created",
473
+ agentId: memory.agentId,
474
+ entryId: null,
475
+ category: null,
476
+ geneId: null,
477
+ sizeDelta: 0,
478
+ totalSize: 0,
479
+ quota: this.configFor(memory.agentId).quota,
480
+ error: null,
481
+ },
482
+ ...lines,
483
+ ];
484
+ }
485
+ this.writeAudit(lines);
486
+ try {
487
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true, mode: 0o700 });
488
+ // Write-then-rename, so a crash mid-write leaves the old file whole; a
489
+ // temp name per write, so two writers never share one.
490
+ const tmp = `${path}.${process.pid}.${(0, node_crypto_1.randomBytes)(6).toString("hex")}.tmp`;
491
+ (0, node_fs_1.writeFileSync)(tmp, JSON.stringify(memory, null, 2) + "\n", { mode: 0o600 });
492
+ (0, node_fs_1.renameSync)(tmp, path);
493
+ }
494
+ catch (err) {
495
+ throw new types_js_1.MemoryError("MEMORY_STORAGE_ERROR", `could not save agent memory: ${err.code ?? "error"}`);
496
+ }
497
+ }
498
+ writeAudit(lines) {
499
+ for (const line of lines)
500
+ this.audit(line);
501
+ }
502
+ line(caller, memory, action, entryId, category, sizeDelta, error, totalSize) {
503
+ return {
504
+ ts: (0, codec_js_1.toTimestamp)(this.now()),
505
+ kind: "agent_memory",
506
+ action,
507
+ agentId: memory.agentId,
508
+ entryId,
509
+ category,
510
+ geneId: caller.geneId,
511
+ sizeDelta,
512
+ totalSize: totalSize ?? memory.entries.reduce((sum, e) => sum + storedSize(e), 0),
513
+ quota: this.configFor(memory.agentId).quota,
514
+ error,
515
+ };
516
+ }
517
+ }
518
+ exports.JsonFileMemoryBackend = JsonFileMemoryBackend;
519
+ function storedSize(entry) {
520
+ return (0, codec_js_1.entrySize)(entry.key, Buffer.from(entry.value, "base64"));
521
+ }
522
+ function samePolicy(a, b) {
523
+ return a.readScope === b.readScope && a.writeScope === b.writeScope && a.sharePolicy === b.sharePolicy;
524
+ }
525
+ function sameRetention(a, b) {
526
+ if (a === null || b === null)
527
+ return a === b;
528
+ return (a.maxRetentionDays === b.maxRetentionDays &&
529
+ a.autoDeleteOnTermination === b.autoDeleteOnTermination &&
530
+ a.anonymizationSupported === b.anonymizationSupported);
531
+ }
532
+ function publicEntry(entry) {
533
+ const { creatorDomain: _internal, ...json } = entry;
534
+ return { ...json };
535
+ }
536
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/memory/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type MemoryAccessPolicy, type MemoryEntry, type MemoryEntryJson, type RetentionPolicy } from "./types.js";
2
+ /** Lowercase hex SHA-256 of `agentId + "\0" + key`. Updates keep the id. */
3
+ export declare function entryIdFor(agentId: string, key: string): string;
4
+ export declare function encodeValue(value: Uint8Array): string;
5
+ export declare function decodeValue(base64: unknown): Uint8Array;
6
+ /** Keys are UTF-8 text without NUL (the entry id uses "\0" as its separator). */
7
+ export declare const MAX_KEY_BYTES = 1024;
8
+ export declare function checkKey(key: unknown): string;
9
+ export declare function checkAccessPolicy(policy: unknown): MemoryAccessPolicy;
10
+ /** A retentionPolicy is at most 4 KiB of JSON. */
11
+ /** Spec §30.2 `Int`: maxRetentionDays is 1..2147483647. */
12
+ export declare const MAX_RETENTION_DAYS = 2147483647;
13
+ export declare function checkRetentionPolicy(policy: unknown): RetentionPolicy | null;
14
+ /** RFC 3339 UTC, as timestamps go on the wire. */
15
+ export declare function toTimestamp(ms: number): string;
16
+ export declare function parseTimestamp(value: unknown, field: string): number;
17
+ export declare function toEntryJson(entry: MemoryEntry): MemoryEntryJson;
18
+ /** Parse an entry received over JSON; refuses anything outside the wire format. */
19
+ export declare function fromEntryJson(json: unknown): MemoryEntry;
20
+ /**
21
+ * `--memory-quota`: a positive number with a KB / MB /
22
+ * GB suffix (binary units, case-insensitive), e.g. `512KB`, `10MB`, `1.5GB`.
23
+ * Zero, negative and unit-less values are refused rather than guessed.
24
+ */
25
+ export declare function parseMemoryQuota(input: string): number;
26
+ /**
27
+ * What the quota counts: the UTF-8 bytes of the key and the
28
+ * value's bytes — never JS string length. The retentionPolicy is bounded by
29
+ * its §30.2 schema and not counted.
30
+ */
31
+ export declare function entrySize(key: string, value: Uint8Array): number;
32
+ /** A gene id as a caller's must be: "v2:" and 64 lowercase hex digits. */
33
+ export declare function isV2GeneId(id: unknown): boolean;
34
+ //# sourceMappingURL=codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/memory/codec.ts"],"names":[],"mappings":"AAMA,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAEpB,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/D;AAOD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAErD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,CAKvD;AAED,iFAAiF;AACjF,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAW7C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,kBAAkB,CAerE;AAED,kDAAkD;AAClD,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAG7C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAwB5E;AAED,kDAAkD;AAClD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9C;AAOD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUpE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,eAAe,CAE/D;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,CA0BxD;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBtD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAEhE;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAE/C"}