@rotifer/playground 0.32.1 → 0.33.1

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 (129) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +2 -2
  3. package/README.zh.md +2 -2
  4. package/dist/cloud/client.d.ts +28 -0
  5. package/dist/cloud/client.d.ts.map +1 -1
  6. package/dist/cloud/client.js +114 -25
  7. package/dist/cloud/client.js.map +1 -1
  8. package/dist/commands/agent-create.d.ts +11 -0
  9. package/dist/commands/agent-create.d.ts.map +1 -1
  10. package/dist/commands/agent-create.js +50 -1
  11. package/dist/commands/agent-create.js.map +1 -1
  12. package/dist/commands/agent-memory.d.ts +64 -0
  13. package/dist/commands/agent-memory.d.ts.map +1 -0
  14. package/dist/commands/agent-memory.js +235 -0
  15. package/dist/commands/agent-memory.js.map +1 -0
  16. package/dist/commands/agent-run.d.ts.map +1 -1
  17. package/dist/commands/agent-run.js +84 -26
  18. package/dist/commands/agent-run.js.map +1 -1
  19. package/dist/commands/arena-submit.d.ts.map +1 -1
  20. package/dist/commands/arena-submit.js +9 -24
  21. package/dist/commands/arena-submit.js.map +1 -1
  22. package/dist/commands/compare.d.ts.map +1 -1
  23. package/dist/commands/compare.js +3 -1
  24. package/dist/commands/compare.js.map +1 -1
  25. package/dist/commands/compile.d.ts.map +1 -1
  26. package/dist/commands/compile.js +32 -6
  27. package/dist/commands/compile.js.map +1 -1
  28. package/dist/commands/genome-format.d.ts +5 -1
  29. package/dist/commands/genome-format.d.ts.map +1 -1
  30. package/dist/commands/genome-format.js +5 -1
  31. package/dist/commands/genome-format.js.map +1 -1
  32. package/dist/commands/hello.d.ts.map +1 -1
  33. package/dist/commands/hello.js +15 -2
  34. package/dist/commands/hello.js.map +1 -1
  35. package/dist/commands/info.d.ts.map +1 -1
  36. package/dist/commands/info.js +3 -1
  37. package/dist/commands/info.js.map +1 -1
  38. package/dist/commands/install.d.ts.map +1 -1
  39. package/dist/commands/install.js +3 -1
  40. package/dist/commands/install.js.map +1 -1
  41. package/dist/commands/reputation.d.ts.map +1 -1
  42. package/dist/commands/reputation.js +3 -1
  43. package/dist/commands/reputation.js.map +1 -1
  44. package/dist/commands/run.d.ts.map +1 -1
  45. package/dist/commands/run.js +59 -4
  46. package/dist/commands/run.js.map +1 -1
  47. package/dist/commands/stats.d.ts.map +1 -1
  48. package/dist/commands/stats.js +3 -1
  49. package/dist/commands/stats.js.map +1 -1
  50. package/dist/commands/test.d.ts.map +1 -1
  51. package/dist/commands/test.js +78 -25
  52. package/dist/commands/test.js.map +1 -1
  53. package/dist/commands/versions.d.ts.map +1 -1
  54. package/dist/commands/versions.js +4 -1
  55. package/dist/commands/versions.js.map +1 -1
  56. package/dist/commands/wrap.d.ts.map +1 -1
  57. package/dist/commands/wrap.js +28 -70
  58. package/dist/commands/wrap.js.map +1 -1
  59. package/dist/index.js +47 -1
  60. package/dist/index.js.map +1 -1
  61. package/dist/memory/access.d.ts +53 -0
  62. package/dist/memory/access.d.ts.map +1 -0
  63. package/dist/memory/access.js +111 -0
  64. package/dist/memory/access.js.map +1 -0
  65. package/dist/memory/audit.d.ts +26 -0
  66. package/dist/memory/audit.d.ts.map +1 -0
  67. package/dist/memory/audit.js +30 -0
  68. package/dist/memory/audit.js.map +1 -0
  69. package/dist/memory/backend.d.ts +141 -0
  70. package/dist/memory/backend.d.ts.map +1 -0
  71. package/dist/memory/backend.js +536 -0
  72. package/dist/memory/backend.js.map +1 -0
  73. package/dist/memory/codec.d.ts +34 -0
  74. package/dist/memory/codec.d.ts.map +1 -0
  75. package/dist/memory/codec.js +184 -0
  76. package/dist/memory/codec.js.map +1 -0
  77. package/dist/memory/data-policy.d.ts +39 -0
  78. package/dist/memory/data-policy.d.ts.map +1 -0
  79. package/dist/memory/data-policy.js +42 -0
  80. package/dist/memory/data-policy.js.map +1 -0
  81. package/dist/memory/host.d.ts +119 -0
  82. package/dist/memory/host.d.ts.map +1 -0
  83. package/dist/memory/host.js +226 -0
  84. package/dist/memory/host.js.map +1 -0
  85. package/dist/memory/index.d.ts +37 -0
  86. package/dist/memory/index.d.ts.map +1 -0
  87. package/dist/memory/index.js +64 -0
  88. package/dist/memory/index.js.map +1 -0
  89. package/dist/memory/telemetry.d.ts +35 -0
  90. package/dist/memory/telemetry.d.ts.map +1 -0
  91. package/dist/memory/telemetry.js +51 -0
  92. package/dist/memory/telemetry.js.map +1 -0
  93. package/dist/memory/types.d.ts +110 -0
  94. package/dist/memory/types.d.ts.map +1 -0
  95. package/dist/memory/types.js +74 -0
  96. package/dist/memory/types.js.map +1 -0
  97. package/dist/publish/auto-publish.d.ts +1 -1
  98. package/dist/publish/auto-publish.js +1 -1
  99. package/dist/testsuite/gate.d.ts +8 -0
  100. package/dist/testsuite/gate.d.ts.map +1 -1
  101. package/dist/testsuite/gate.js +8 -2
  102. package/dist/testsuite/gate.js.map +1 -1
  103. package/dist/utils/arena-success.d.ts +10 -0
  104. package/dist/utils/arena-success.d.ts.map +1 -1
  105. package/dist/utils/arena-success.js +35 -8
  106. package/dist/utils/arena-success.js.map +1 -1
  107. package/dist/utils/binding.d.ts +6 -2
  108. package/dist/utils/binding.d.ts.map +1 -1
  109. package/dist/utils/binding.js.map +1 -1
  110. package/dist/utils/clawhub-client.d.ts +73 -0
  111. package/dist/utils/clawhub-client.d.ts.map +1 -0
  112. package/dist/utils/clawhub-client.js +176 -0
  113. package/dist/utils/clawhub-client.js.map +1 -0
  114. package/dist/utils/config.d.ts +7 -0
  115. package/dist/utils/config.d.ts.map +1 -1
  116. package/dist/utils/config.js +15 -1
  117. package/dist/utils/config.js.map +1 -1
  118. package/dist/utils/gene-id-display.d.ts +14 -0
  119. package/dist/utils/gene-id-display.d.ts.map +1 -0
  120. package/dist/utils/gene-id-display.js +64 -0
  121. package/dist/utils/gene-id-display.js.map +1 -0
  122. package/dist/utils/l0-gate.d.ts.map +1 -1
  123. package/dist/utils/l0-gate.js +4 -1
  124. package/dist/utils/l0-gate.js.map +1 -1
  125. package/dist/utils/rust-phenotype.d.ts +17 -5
  126. package/dist/utils/rust-phenotype.d.ts.map +1 -1
  127. package/dist/utils/rust-phenotype.js +25 -4
  128. package/dist/utils/rust-phenotype.js.map +1 -1
  129. package/package.json +10 -6
@@ -0,0 +1,37 @@
1
+ /**
2
+ * AgentMemory SDK (spec §38, v0.9.4) — what a gene author uses: the types,
3
+ * the GeneMemoryAccess interface a gene gets as ctx.memory, MemoryError and
4
+ * its codes, and the SDK layer over a store. Published as
5
+ * `@rotifer/playground/memory`; nothing here needs Node's types.
6
+ *
7
+ * The CLI's side — opening the agent's store in the project, the WASM
8
+ * path's binding, the throwaway memory of `rotifer test` — is in ./host.ts,
9
+ * which is not part of that surface.
10
+ */
11
+ import type { GeneMemoryAccess } from "./access.js";
12
+ import { type MemoryTelemetrySink } from "./telemetry.js";
13
+ export * from "./types.js";
14
+ export * from "./codec.js";
15
+ export * from "./access.js";
16
+ export * from "./data-policy.js";
17
+ export * from "./telemetry.js";
18
+ export * from "./audit.js";
19
+ export { NapiMemoryBackend, asMemoryError, hasNativeMemory, type AgentMemoryConfig, type MemoryBackend, type MemoryCaller, type MemoryWriteRequest, type NativeMemoryApi, } from "./backend.js";
20
+ /**
21
+ * The memory a gene gets when it runs with no agent around it (`rotifer run`
22
+ * of a single gene): every call is MEMORY_ACCESS_DENIED with a message that
23
+ * starts "no agent context". `ctx.memory` is never undefined,
24
+ * so a gene meets a clear error, not a TypeError on `undefined`.
25
+ *
26
+ * With a `telemetry` sink each refusal is also a §17 MEMORY_ACCESS_DENIED
27
+ * event — agentId null, no entry, `geneId` when the gene has a v2 id — and
28
+ * nothing else: there is no agent's memory to audit it in (as
29
+ * rotifer-core records a WASM gene's).
30
+ */
31
+ export declare function noAgentMemory(options?: {
32
+ telemetry?: MemoryTelemetrySink;
33
+ geneId?: string | null;
34
+ }): GeneMemoryAccess;
35
+ /** Every call is MEMORY_STORAGE_ERROR "native binding unavailable". */
36
+ export declare function memoryUnavailable(): GeneMemoryAccess;
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAA2C,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGnG,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AAYtB;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAAG,gBAAgB,CAQzH;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,IAAI,gBAAgB,CAEpD"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.hasNativeMemory = exports.asMemoryError = exports.NapiMemoryBackend = void 0;
18
+ exports.noAgentMemory = noAgentMemory;
19
+ exports.memoryUnavailable = memoryUnavailable;
20
+ const telemetry_js_1 = require("./telemetry.js");
21
+ const types_js_1 = require("./types.js");
22
+ __exportStar(require("./types.js"), exports);
23
+ __exportStar(require("./codec.js"), exports);
24
+ __exportStar(require("./access.js"), exports);
25
+ __exportStar(require("./data-policy.js"), exports);
26
+ __exportStar(require("./telemetry.js"), exports);
27
+ __exportStar(require("./audit.js"), exports);
28
+ // The store interface and the napi adapter; the JSON test double stays in
29
+ // ./backend.ts for tests and is not part of this module's surface.
30
+ var backend_js_1 = require("./backend.js");
31
+ Object.defineProperty(exports, "NapiMemoryBackend", { enumerable: true, get: function () { return backend_js_1.NapiMemoryBackend; } });
32
+ Object.defineProperty(exports, "asMemoryError", { enumerable: true, get: function () { return backend_js_1.asMemoryError; } });
33
+ Object.defineProperty(exports, "hasNativeMemory", { enumerable: true, get: function () { return backend_js_1.hasNativeMemory; } });
34
+ /** A GeneMemoryAccess whose every call throws `code` with `message`. */
35
+ function refusingMemory(code, message) {
36
+ const refuse = () => {
37
+ throw new types_js_1.MemoryError(code, message);
38
+ };
39
+ return { readMemory: refuse, writeMemory: refuse, queryMemory: refuse, deleteMemory: refuse };
40
+ }
41
+ const NO_AGENT_CONTEXT = "no agent context: this gene is not running inside an agent, so it has no agent memory";
42
+ /**
43
+ * The memory a gene gets when it runs with no agent around it (`rotifer run`
44
+ * of a single gene): every call is MEMORY_ACCESS_DENIED with a message that
45
+ * starts "no agent context". `ctx.memory` is never undefined,
46
+ * so a gene meets a clear error, not a TypeError on `undefined`.
47
+ *
48
+ * With a `telemetry` sink each refusal is also a §17 MEMORY_ACCESS_DENIED
49
+ * event — agentId null, no entry, `geneId` when the gene has a v2 id — and
50
+ * nothing else: there is no agent's memory to audit it in (as
51
+ * rotifer-core records a WASM gene's).
52
+ */
53
+ function noAgentMemory(options = {}) {
54
+ const refuse = (operation) => () => {
55
+ options.telemetry?.((0, telemetry_js_1.accessDeniedEvent)({ agentId: null, geneId: options.geneId ?? null, entryId: null, operation, message: NO_AGENT_CONTEXT }));
56
+ throw new types_js_1.MemoryError("MEMORY_ACCESS_DENIED", NO_AGENT_CONTEXT);
57
+ };
58
+ return { readMemory: refuse("read"), writeMemory: refuse("write"), queryMemory: refuse("query"), deleteMemory: refuse("delete") };
59
+ }
60
+ /** Every call is MEMORY_STORAGE_ERROR "native binding unavailable". */
61
+ function memoryUnavailable() {
62
+ return refusingMemory("MEMORY_STORAGE_ERROR", "native binding unavailable: agent memory needs the rotifer native addon on this platform");
63
+ }
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAsDA,sCAQC;AAGD,8CAEC;AAxDD,iDAAmG;AACnG,yCAAyC;AAEzC,6CAA2B;AAC3B,6CAA2B;AAC3B,8CAA4B;AAC5B,mDAAiC;AACjC,iDAA+B;AAC/B,6CAA2B;AAC3B,0EAA0E;AAC1E,mEAAmE;AACnE,2CASsB;AARpB,+GAAA,iBAAiB,OAAA;AACjB,2GAAA,aAAa,OAAA;AACb,6GAAA,eAAe,OAAA;AAQjB,wEAAwE;AACxE,SAAS,cAAc,CAAC,IAAqD,EAAE,OAAe;IAC5F,MAAM,MAAM,GAAG,GAAU,EAAE;QACzB,MAAM,IAAI,sBAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AAChG,CAAC;AAED,MAAM,gBAAgB,GAAG,uFAAuF,CAAC;AAEjH;;;;;;;;;;GAUG;AACH,SAAgB,aAAa,CAAC,UAAuE,EAAE;IACrG,MAAM,MAAM,GACV,CAAC,SAA0B,EAAE,EAAE,CAC/B,GAAU,EAAE;QACV,OAAO,CAAC,SAAS,EAAE,CAAC,IAAA,gCAAiB,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC/I,MAAM,IAAI,sBAAW,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;IAClE,CAAC,CAAC;IACJ,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpI,CAAC;AAED,uEAAuE;AACvE,SAAgB,iBAAiB;IAC/B,OAAO,cAAc,CAAC,sBAAsB,EAAE,0FAA0F,CAAC,CAAC;AAC5I,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** The operation names rotifer-core writes in metadata.operation. */
2
+ export type MemoryOperation = "read" | "write" | "query" | "delete";
3
+ export interface MemoryTelemetryEvent {
4
+ eventType: "MEMORY_ACCESS_DENIED";
5
+ bindingExtension: true;
6
+ traceContext: null;
7
+ /** null when the calling gene has no usable v2 id. */
8
+ geneId: string | null;
9
+ timestamp: string;
10
+ duration: null;
11
+ resourceUsage: null;
12
+ result: {
13
+ FAILURE: {
14
+ errorCode: "MEMORY_ACCESS_DENIED";
15
+ message: string;
16
+ };
17
+ };
18
+ /** agentId null outside any agent; entryId null when the call named no key. */
19
+ metadata: {
20
+ agentId: string | null;
21
+ entryId: string | null;
22
+ operation: MemoryOperation;
23
+ };
24
+ }
25
+ export type MemoryTelemetrySink = (event: MemoryTelemetryEvent) => void;
26
+ export declare function fileTelemetrySink(root: string, env?: Record<string, string | undefined>): MemoryTelemetrySink;
27
+ export declare function accessDeniedEvent(args: {
28
+ agentId: string | null;
29
+ geneId: string | null;
30
+ entryId: string | null;
31
+ operation: MemoryOperation;
32
+ message: string;
33
+ timestamp?: string;
34
+ }): MemoryTelemetryEvent;
35
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/memory/telemetry.ts"],"names":[],"mappings":"AAkBA,qEAAqE;AACrE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,sBAAsB,CAAC;IAClC,gBAAgB,EAAE,IAAI,CAAC;IACvB,YAAY,EAAE,IAAI,CAAC;IACnB,sDAAsD;IACtD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,IAAI,CAAC;IACf,aAAa,EAAE,IAAI,CAAC;IACpB,MAAM,EAAE;QAAE,OAAO,EAAE;YAAE,SAAS,EAAE,sBAAsB,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAC5E,+EAA+E;IAC/E,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,eAAe,CAAA;KAAE,CAAC;CAC1F;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;AAExE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,mBAAmB,CAa1H;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,oBAAoB,CAYvB"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fileTelemetrySink = fileTelemetrySink;
4
+ exports.accessDeniedEvent = accessDeniedEvent;
5
+ /**
6
+ * §17 telemetry for AgentMemory access denials (spec §38.2: "权限违规记录到
7
+ * §17 遥测系统").
8
+ *
9
+ * One §17.3 TelemetryEvent per line in `<root>/.rotifer/telemetry.jsonl`, in
10
+ * the shape rotifer-core writes (memory/events.rs MemoryTelemetryEvent), so a
11
+ * reader sees one format whichever binding denied the call. §17.3 has no
12
+ * memory event type, so `MEMORY_ACCESS_DENIED` carries `bindingExtension`.
13
+ * Local only, and it honours the same opt-out as the rest of the CLI's
14
+ * telemetry: ROTIFER_TELEMETRY=0 (or DO_NOT_TRACK) writes nothing here
15
+ *. The audit line for the same denial is written
16
+ * regardless (audit.ts). No key and no value: the entryId identifies the
17
+ * entry.
18
+ */
19
+ const node_fs_1 = require("node:fs");
20
+ const node_path_1 = require("node:path");
21
+ const consent_js_1 = require("../telemetry/consent.js");
22
+ function fileTelemetrySink(root, env = process.env) {
23
+ const path = (0, node_path_1.join)(root, ".rotifer", "telemetry.jsonl");
24
+ return (event) => {
25
+ if ((0, consent_js_1.telemetryOptedOutByEnv)(env))
26
+ return;
27
+ // Telemetry is best-effort: the denial it reports stands, and the audit
28
+ // line (which is not best-effort) already recorded it.
29
+ try {
30
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true, mode: 0o700 });
31
+ (0, node_fs_1.appendFileSync)(path, JSON.stringify(event) + "\n", { mode: 0o600 });
32
+ }
33
+ catch {
34
+ /* not a reason to fail the call */
35
+ }
36
+ };
37
+ }
38
+ function accessDeniedEvent(args) {
39
+ return {
40
+ eventType: "MEMORY_ACCESS_DENIED",
41
+ bindingExtension: true,
42
+ traceContext: null,
43
+ geneId: args.geneId,
44
+ timestamp: args.timestamp ?? new Date().toISOString(),
45
+ duration: null,
46
+ resourceUsage: null,
47
+ result: { FAILURE: { errorCode: "MEMORY_ACCESS_DENIED", message: args.message } },
48
+ metadata: { agentId: args.agentId, entryId: args.entryId, operation: args.operation },
49
+ };
50
+ }
51
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/memory/telemetry.ts"],"names":[],"mappings":";;AAqCA,8CAaC;AAED,8CAmBC;AAvED;;;;;;;;;;;;;GAaG;AACH,qCAAoD;AACpD,yCAA0C;AAC1C,wDAAiE;AAqBjE,SAAgB,iBAAiB,CAAC,IAAY,EAAE,MAA0C,OAAO,CAAC,GAAG;IACnG,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACvD,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,IAAA,mCAAsB,EAAC,GAAG,CAAC;YAAE,OAAO;QACxC,wEAAwE;QACxE,uDAAuD;QACvD,IAAI,CAAC;YACH,IAAA,mBAAS,EAAC,IAAA,mBAAO,EAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3D,IAAA,wBAAc,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,IAOjC;IACC,OAAO;QACL,SAAS,EAAE,sBAAsB;QACjC,gBAAgB,EAAE,IAAI;QACtB,YAAY,EAAE,IAAI;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrD,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;QACjF,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;KACtF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * AgentMemory types — spec §38.1, shared by every binding.
3
+ *
4
+ * Field names are the spec's camelCase and enum values the spec's UPPERCASE
5
+ * strings, with no case folding anywhere: Rust, WASM host calls and the cloud
6
+ * table carry the same strings, and one lowercased copy is how the bindings
7
+ * drift apart.
8
+ *
9
+ * Two shapes of an entry:
10
+ * - MemoryEntry what a gene sees: `value` is bytes (Uint8Array);
11
+ * - MemoryEntryJson what crosses JSON (napi, host calls, cloud): `value`
12
+ * is standard base64, padded.
13
+ * toEntryJson / fromEntryJson are the only conversion between them.
14
+ */
15
+ export declare const MEMORY_CATEGORIES: readonly ["PREFERENCE", "PATTERN", "CONTEXT", "CACHE"];
16
+ export type MemoryCategory = (typeof MEMORY_CATEGORIES)[number];
17
+ export declare const ACCESS_SCOPES: readonly ["CREATOR_GENE_ONLY", "SAME_DOMAIN", "ALL_GENES", "DEPLOYER_CONFIGURED"];
18
+ export type AccessScope = (typeof ACCESS_SCOPES)[number];
19
+ export declare const SHARE_POLICIES: readonly ["PRIVATE", "ANONYMIZED_SHARE", "KNOWLEDGE_GENE"];
20
+ export type SharePolicy = (typeof SHARE_POLICIES)[number];
21
+ export interface MemoryAccessPolicy {
22
+ readScope: AccessScope;
23
+ writeScope: AccessScope;
24
+ sharePolicy: SharePolicy;
25
+ }
26
+ /** What `writeMemory` uses when the caller gives no policy. */
27
+ export declare const DEFAULT_ACCESS_POLICY: Readonly<MemoryAccessPolicy>;
28
+ /** Spec §30.2 RetentionPolicy. */
29
+ export interface RetentionPolicy {
30
+ /** null = no limit. */
31
+ maxRetentionDays: number | null;
32
+ autoDeleteOnTermination: boolean;
33
+ anonymizationSupported: boolean;
34
+ }
35
+ export interface MemoryEntry {
36
+ /** Lowercase hex SHA-256 of `agentId + "\0" + key` (entryIdFor). */
37
+ entryId: string;
38
+ category: MemoryCategory;
39
+ key: string;
40
+ value: Uint8Array;
41
+ /** Content-derived gene id of the gene that created the entry. */
42
+ createdBy: string;
43
+ lastAccessedBy: string | null;
44
+ /** RFC 3339 UTC. */
45
+ createdAt: string;
46
+ /** RFC 3339 UTC. */
47
+ updatedAt: string;
48
+ accessPolicy: MemoryAccessPolicy;
49
+ /** null = inherit the agent's DataPolicy retention. */
50
+ retentionPolicy: RetentionPolicy | null;
51
+ }
52
+ export type MemoryEntryJson = Omit<MemoryEntry, "value"> & {
53
+ value: string;
54
+ };
55
+ export interface AgentMemory {
56
+ agentId: string;
57
+ entries: MemoryEntry[];
58
+ /** Bytes of key + value over all entries (the quota's unit). */
59
+ totalSize: number;
60
+ /** Bytes. */
61
+ quota: number;
62
+ createdAt: string;
63
+ }
64
+ /**
65
+ * queryMemory's filter (final). Every field is optional
66
+ * and they combine with AND:
67
+ * - category one MemoryCategory;
68
+ * - keyPrefix a plain prefix of the key, not a pattern;
69
+ * - since RFC 3339, inclusive, compared with `updatedAt`;
70
+ * - until RFC 3339, exclusive, compared with `updatedAt`;
71
+ * - limit default 100, capped at 1000.
72
+ * Results come newest first (`updatedAt` descending, ties by `entryId`).
73
+ * Unknown fields are MEMORY_INVALID_INPUT; no alias names are accepted.
74
+ */
75
+ export interface MemoryFilter {
76
+ category?: MemoryCategory;
77
+ keyPrefix?: string;
78
+ since?: string;
79
+ until?: string;
80
+ limit?: number;
81
+ }
82
+ export declare const MEMORY_FILTER_FIELDS: readonly ["category", "keyPrefix", "since", "until", "limit"];
83
+ export declare const MEMORY_QUERY_DEFAULT_LIMIT = 100;
84
+ export declare const MEMORY_QUERY_MAX_LIMIT = 1000;
85
+ /**
86
+ * Shared across bindings. MEMORY_STORAGE_ERROR is a
87
+ * storage / IO failure, a missing native binding, or a database error; it is
88
+ * never folded into MEMORY_INVALID_INPUT.
89
+ */
90
+ export declare const MEMORY_ERROR_CODES: readonly ["MEMORY_NOT_FOUND", "MEMORY_ACCESS_DENIED", "MEMORY_QUOTA_EXCEEDED", "MEMORY_INVALID_INPUT", "MEMORY_STORAGE_ERROR"];
91
+ export type MemoryErrorCode = (typeof MEMORY_ERROR_CODES)[number];
92
+ /**
93
+ * A memory error. `code` is one of the five; `message` is the explanation
94
+ * alone, without the code in front (a no-agent-context message
95
+ * starts with "no agent context").
96
+ */
97
+ export declare class MemoryError extends Error {
98
+ readonly code: MemoryErrorCode;
99
+ constructor(code: MemoryErrorCode, message: string);
100
+ }
101
+ /** A single value, after base64 decoding. */
102
+ export declare const MEMORY_MAX_VALUE_BYTES: number;
103
+ /** One queryMemory response, serialized. */
104
+ export declare const MEMORY_MAX_QUERY_RESPONSE_BYTES: number;
105
+ /** 10 MB of key + value. */
106
+ export declare const DEFAULT_MEMORY_QUOTA_BYTES: number;
107
+ export declare function isMemoryCategory(value: unknown): value is MemoryCategory;
108
+ export declare function isAccessScope(value: unknown): value is AccessScope;
109
+ export declare function isSharePolicy(value: unknown): value is SharePolicy;
110
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * AgentMemory types — spec §38.1, shared by every binding.
4
+ *
5
+ * Field names are the spec's camelCase and enum values the spec's UPPERCASE
6
+ * strings, with no case folding anywhere: Rust, WASM host calls and the cloud
7
+ * table carry the same strings, and one lowercased copy is how the bindings
8
+ * drift apart.
9
+ *
10
+ * Two shapes of an entry:
11
+ * - MemoryEntry what a gene sees: `value` is bytes (Uint8Array);
12
+ * - MemoryEntryJson what crosses JSON (napi, host calls, cloud): `value`
13
+ * is standard base64, padded.
14
+ * toEntryJson / fromEntryJson are the only conversion between them.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.DEFAULT_MEMORY_QUOTA_BYTES = exports.MEMORY_MAX_QUERY_RESPONSE_BYTES = exports.MEMORY_MAX_VALUE_BYTES = exports.MemoryError = exports.MEMORY_ERROR_CODES = exports.MEMORY_QUERY_MAX_LIMIT = exports.MEMORY_QUERY_DEFAULT_LIMIT = exports.MEMORY_FILTER_FIELDS = exports.DEFAULT_ACCESS_POLICY = exports.SHARE_POLICIES = exports.ACCESS_SCOPES = exports.MEMORY_CATEGORIES = void 0;
18
+ exports.isMemoryCategory = isMemoryCategory;
19
+ exports.isAccessScope = isAccessScope;
20
+ exports.isSharePolicy = isSharePolicy;
21
+ exports.MEMORY_CATEGORIES = ["PREFERENCE", "PATTERN", "CONTEXT", "CACHE"];
22
+ exports.ACCESS_SCOPES = ["CREATOR_GENE_ONLY", "SAME_DOMAIN", "ALL_GENES", "DEPLOYER_CONFIGURED"];
23
+ exports.SHARE_POLICIES = ["PRIVATE", "ANONYMIZED_SHARE", "KNOWLEDGE_GENE"];
24
+ /** What `writeMemory` uses when the caller gives no policy. */
25
+ exports.DEFAULT_ACCESS_POLICY = Object.freeze({
26
+ readScope: "SAME_DOMAIN",
27
+ writeScope: "SAME_DOMAIN",
28
+ sharePolicy: "PRIVATE",
29
+ });
30
+ exports.MEMORY_FILTER_FIELDS = ["category", "keyPrefix", "since", "until", "limit"];
31
+ exports.MEMORY_QUERY_DEFAULT_LIMIT = 100;
32
+ exports.MEMORY_QUERY_MAX_LIMIT = 1000;
33
+ /**
34
+ * Shared across bindings. MEMORY_STORAGE_ERROR is a
35
+ * storage / IO failure, a missing native binding, or a database error; it is
36
+ * never folded into MEMORY_INVALID_INPUT.
37
+ */
38
+ exports.MEMORY_ERROR_CODES = [
39
+ "MEMORY_NOT_FOUND",
40
+ "MEMORY_ACCESS_DENIED",
41
+ "MEMORY_QUOTA_EXCEEDED",
42
+ "MEMORY_INVALID_INPUT",
43
+ "MEMORY_STORAGE_ERROR",
44
+ ];
45
+ /**
46
+ * A memory error. `code` is one of the five; `message` is the explanation
47
+ * alone, without the code in front (a no-agent-context message
48
+ * starts with "no agent context").
49
+ */
50
+ class MemoryError extends Error {
51
+ code;
52
+ constructor(code, message) {
53
+ super(message);
54
+ this.name = "MemoryError";
55
+ this.code = code;
56
+ }
57
+ }
58
+ exports.MemoryError = MemoryError;
59
+ /** A single value, after base64 decoding. */
60
+ exports.MEMORY_MAX_VALUE_BYTES = 1024 * 1024;
61
+ /** One queryMemory response, serialized. */
62
+ exports.MEMORY_MAX_QUERY_RESPONSE_BYTES = 4 * 1024 * 1024;
63
+ /** 10 MB of key + value. */
64
+ exports.DEFAULT_MEMORY_QUOTA_BYTES = 10 * 1024 * 1024;
65
+ function isMemoryCategory(value) {
66
+ return typeof value === "string" && exports.MEMORY_CATEGORIES.includes(value);
67
+ }
68
+ function isAccessScope(value) {
69
+ return typeof value === "string" && exports.ACCESS_SCOPES.includes(value);
70
+ }
71
+ function isSharePolicy(value) {
72
+ return typeof value === "string" && exports.SHARE_POLICIES.includes(value);
73
+ }
74
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAyHH,4CAEC;AAED,sCAEC;AAED,sCAEC;AAjIY,QAAA,iBAAiB,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AAG3E,QAAA,aAAa,GAAG,CAAC,mBAAmB,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,CAAU,CAAC;AAGlG,QAAA,cAAc,GAAG,CAAC,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,CAAU,CAAC;AASzF,+DAA+D;AAClD,QAAA,qBAAqB,GAAiC,MAAM,CAAC,MAAM,CAAC;IAC/E,SAAS,EAAE,aAAa;IACxB,UAAU,EAAE,aAAa;IACzB,WAAW,EAAE,SAAS;CACvB,CAAC,CAAC;AA2DU,QAAA,oBAAoB,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AACrF,QAAA,0BAA0B,GAAG,GAAG,CAAC;AACjC,QAAA,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;;;GAIG;AACU,QAAA,kBAAkB,GAAG;IAChC,kBAAkB;IAClB,sBAAsB;IACtB,uBAAuB;IACvB,sBAAsB;IACtB,sBAAsB;CACd,CAAC;AAGX;;;;GAIG;AACH,MAAa,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IAC/B,YAAY,IAAqB,EAAE,OAAe;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAPD,kCAOC;AAED,6CAA6C;AAChC,QAAA,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAAC;AAClD,4CAA4C;AAC/B,QAAA,+BAA+B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/D,4BAA4B;AACf,QAAA,0BAA0B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3D,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,yBAAuC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/F,CAAC;AAED,SAAgB,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,qBAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3F,CAAC;AAED,SAAgB,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,sBAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5F,CAAC"}
@@ -90,7 +90,7 @@ export declare function needsNetworkConfigBeforePublish(geneDir: string, fidelit
90
90
  * independent cursor-agent pyramid test run, 2026-08-31, which is also why
91
91
  * this is a pure function rather than a PTY-driven E2E test: reproducing it
92
92
  * needs a real TTY, and this repo's CI matrix runs both ubuntu-latest and
93
- * macos-14, whose `script` binaries take incompatible arguments — a
93
+ * macOS, whose `script` binaries take incompatible arguments — a
94
94
  * behavioural test for a one-line data-selection bug was the wrong layer.
95
95
  *
96
96
  * The on-disk phenotype wins whenever one was actually loaded; the CLI flag
@@ -111,7 +111,7 @@ function needsNetworkConfigBeforePublish(geneDir, fidelity) {
111
111
  * independent cursor-agent pyramid test run, 2026-08-31, which is also why
112
112
  * this is a pure function rather than a PTY-driven E2E test: reproducing it
113
113
  * needs a real TTY, and this repo's CI matrix runs both ubuntu-latest and
114
- * macos-14, whose `script` binaries take incompatible arguments — a
114
+ * macOS, whose `script` binaries take incompatible arguments — a
115
115
  * behavioural test for a one-line data-selection bug was the wrong layer.
116
116
  *
117
117
  * The on-disk phenotype wins whenever one was actually loaded; the CLI flag
@@ -1,4 +1,5 @@
1
1
  import type { GeneRunner, RunOutcome } from "./run.js";
2
+ import { type GeneMemoryAccess } from "../memory/index.js";
2
3
  /**
3
4
  * spec §47.5 publishing gate, as decided in ADR-333.
4
5
  *
@@ -74,9 +75,16 @@ export declare function outcomeFromSandbox(r: {
74
75
  * same answers so they cannot drift apart silently.
75
76
  */
76
77
  export declare function readErrorEnvelope(output: unknown): string | null;
78
+ /**
79
+ * `ctx` is what express() gets as its second argument. ctx.memory is never
80
+ * undefined: without an agent memory to hand over,
81
+ * every memory call is MEMORY_ACCESS_DENIED "no agent context".
82
+ */
77
83
  export declare function loadNodeRunner(absSourcePath: string, l0: {
78
84
  kind: string;
79
85
  detail?: string;
86
+ }, ctx?: {
87
+ memory: GeneMemoryAccess;
80
88
  }): Promise<{
81
89
  runner: GeneRunner;
82
90
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/testsuite/gate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEvD;;;;;;;;;GASG;AAEH,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACzD;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAoBjD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7D;oDACgD;IAChD,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAyEjE;AAMD;;;;;kBAKkB;AAClB,wBAAgB,kBAAkB,CAAC,CAAC,EAAE;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,UAAU,CAMb;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAUhE;AAED,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA2CvD"}
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/testsuite/gate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE1E;;;;;;;;;GASG;AAEH,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACzD;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAoBjD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7D;oDACgD;IAChD,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAyEjE;AAMD;;;;;kBAKkB;AAClB,wBAAgB,kBAAkB,CAAC,CAAC,EAAE;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,UAAU,CAMb;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAUhE;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EACrC,GAAG,GAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAgC,GAC9D,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA2CvD"}
@@ -7,6 +7,7 @@ exports.loadNodeRunner = loadNodeRunner;
7
7
  const node_url_1 = require("node:url");
8
8
  const load_js_1 = require("./load.js");
9
9
  const run_js_1 = require("./run.js");
10
+ const index_js_1 = require("../memory/index.js");
10
11
  /**
11
12
  * The guidance lines are load-bearing, not decoration.
12
13
  *
@@ -148,7 +149,12 @@ function readErrorEnvelope(output) {
148
149
  : "gene refused the input";
149
150
  return `INVALID_INPUT: ${message}`;
150
151
  }
151
- async function loadNodeRunner(absSourcePath, l0) {
152
+ /**
153
+ * `ctx` is what express() gets as its second argument. ctx.memory is never
154
+ * undefined: without an agent memory to hand over,
155
+ * every memory call is MEMORY_ACCESS_DENIED "no agent context".
156
+ */
157
+ async function loadNodeRunner(absSourcePath, l0, ctx = { memory: (0, index_js_1.noAgentMemory)() }) {
152
158
  if (l0.kind === "violation") {
153
159
  return { refusal: `L0 gate blocked this gene: ${l0.detail ?? "no detail"}` };
154
160
  }
@@ -166,7 +172,7 @@ async function loadNodeRunner(absSourcePath, l0) {
166
172
  const runner = (input) => {
167
173
  const started = Date.now();
168
174
  try {
169
- const output = expressFn(input);
175
+ const output = expressFn(input, ctx);
170
176
  // ADR-334: the WASM sandbox turns a lone `__rotifer_error` key into
171
177
  // GeneResult::Error, and this path has to agree with it. It does not go
172
178
  // through the Rust core at all, so without this the same Gene would be
@@ -1 +1 @@
1
- {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/testsuite/gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/testsuite/gate.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,16 @@
17
17
  * sandbox success still counts; the contract is the Gene's to declare.
18
18
  */
19
19
  export type OutputValidator = (output: unknown) => boolean;
20
+ /** null when the value conforms; otherwise the first violation, naming the field. */
21
+ export type SchemaCheck = (value: unknown) => string | null;
22
+ /**
23
+ * Compile one of a phenotype's schemas into a check. Returns null when the
24
+ * schema is absent, empty, or not compilable — the schema constrains nothing,
25
+ * and the caller says so if it matters. The Arena's verdict
26
+ * (compileOutputValidator) and `rotifer run`'s (#451) both come from here, so
27
+ * they cannot disagree about what violates a Gene's contract.
28
+ */
29
+ export declare function compileSchemaCheck(schema: unknown): SchemaCheck | null;
20
30
  /**
21
31
  * Compile a phenotype's outputSchema into a validator. Returns null when the
22
32
  * schema is absent, empty, or not compilable — in which case the caller falls
@@ -1 +1 @@
1
- {"version":3,"file":"arena-success.d.ts","sourceRoot":"","sources":["../../src/utils/arena-success.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,eAAe,GAAG,IAAI,CAUpG;AAED,MAAM,WAAW,UAAU;IACzB,wDAAwD;IACxD,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAIhG"}
1
+ {"version":3,"file":"arena-success.d.ts","sourceRoot":"","sources":["../../src/utils/arena-success.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;AAE3D,qFAAqF;AACrF,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;AAE5D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAuBtE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,eAAe,GAAG,IAAI,CAGpG;AAED,MAAM,WAAW,UAAU;IACzB,wDAAwD;IACxD,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAIhG"}
@@ -3,26 +3,53 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.compileSchemaCheck = compileSchemaCheck;
6
7
  exports.compileOutputValidator = compileOutputValidator;
7
8
  exports.isRunSuccessful = isRunSuccessful;
8
9
  const ajv_1 = __importDefault(require("ajv"));
9
10
  /**
10
- * Compile a phenotype's outputSchema into a validator. Returns null when the
11
- * schema is absent, empty, or not compilable — in which case the caller falls
12
- * back to sandbox success alone, and should say so.
11
+ * Compile one of a phenotype's schemas into a check. Returns null when the
12
+ * schema is absent, empty, or not compilable — the schema constrains nothing,
13
+ * and the caller says so if it matters. The Arena's verdict
14
+ * (compileOutputValidator) and `rotifer run`'s (#451) both come from here, so
15
+ * they cannot disagree about what violates a Gene's contract.
13
16
  */
14
- function compileOutputValidator(phenotype) {
15
- const schema = phenotype.outputSchema;
17
+ function compileSchemaCheck(schema) {
16
18
  if (!schema || typeof schema !== "object" || Object.keys(schema).length === 0)
17
19
  return null;
20
+ let validate;
18
21
  try {
19
- const ajv = new ajv_1.default({ allErrors: false, strict: false });
20
- const validate = ajv.compile(schema);
21
- return (output) => validate(output) === true;
22
+ validate = new ajv_1.default({ allErrors: false, strict: false }).compile(schema);
22
23
  }
23
24
  catch {
24
25
  return null;
25
26
  }
27
+ return (value) => {
28
+ if (validate(value) === true)
29
+ return null;
30
+ const err = validate.errors?.[0];
31
+ if (!err)
32
+ return "does not match the schema";
33
+ const path = err.instancePath.replace(/^\//, "").replace(/\//g, ".");
34
+ if (err.keyword === "required") {
35
+ const missing = err.params.missingProperty;
36
+ return `${path ? path + "." : ""}${missing} is required`;
37
+ }
38
+ if (err.keyword === "additionalProperties") {
39
+ const extra = err.params.additionalProperty;
40
+ return `${path ? path + "." : ""}${extra} is not allowed`;
41
+ }
42
+ return `${path || "(the value)"} ${err.message ?? "does not match the schema"}`;
43
+ };
44
+ }
45
+ /**
46
+ * Compile a phenotype's outputSchema into a validator. Returns null when the
47
+ * schema is absent, empty, or not compilable — in which case the caller falls
48
+ * back to sandbox success alone, and should say so.
49
+ */
50
+ function compileOutputValidator(phenotype) {
51
+ const check = compileSchemaCheck(phenotype.outputSchema);
52
+ return check ? (output) => check(output) === null : null;
26
53
  }
27
54
  /** Sandbox success alone is not success; the output has to be what was promised. */
28
55
  function isRunSuccessful(run, validateOutput) {
@@ -1 +1 @@
1
- {"version":3,"file":"arena-success.js","sourceRoot":"","sources":["../../src/utils/arena-success.ts"],"names":[],"mappings":";;;;;AA4BA,wDAUC;AASD,0CAIC;AAnDD,8CAAiD;AAuBjD;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,SAAqC;IAC1E,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC;IACtC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,aAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAqB,GAAG,CAAC,OAAO,CAAC,MAAgB,CAAC,CAAC;QACjE,OAAO,CAAC,MAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAQD,oFAAoF;AACpF,SAAgB,eAAe,CAAC,GAAe,EAAE,cAAsC;IACrF,IAAI,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"arena-success.js","sourceRoot":"","sources":["../../src/utils/arena-success.ts"],"names":[],"mappings":";;;;;AAiCA,gDAuBC;AAOD,wDAGC;AASD,0CAIC;AA/ED,8CAAiD;AA0BjD;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,MAAe;IAChD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrG,IAAI,QAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,aAAG,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAgB,CAAC,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,KAAc,EAAE,EAAE;QACxB,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO,2BAA2B,CAAC;QAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACrE,IAAI,GAAG,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAI,GAAG,CAAC,MAAuC,CAAC,eAAe,CAAC;YAC7E,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,cAAc,CAAC;QAC3D,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,KAAK,sBAAsB,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAI,GAAG,CAAC,MAA0C,CAAC,kBAAkB,CAAC;YACjF,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,iBAAiB,CAAC;QAC5D,CAAC;QACD,OAAO,GAAG,IAAI,IAAI,aAAa,IAAI,GAAG,CAAC,OAAO,IAAI,2BAA2B,EAAE,CAAC;IAClF,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,SAAqC;IAC1E,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAe,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAQD,oFAAoF;AACpF,SAAgB,eAAe,CAAC,GAAe,EAAE,cAAsC;IACrF,IAAI,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -33,9 +33,13 @@ export interface NativeBinding {
33
33
  buildSearchGeneWasm(): Buffer;
34
34
  buildSummarizeGeneWasm(): Buffer;
35
35
  buildTranslateGeneWasm(): Buffer;
36
- executeGene(wasmBytes: Buffer, inputJson: string, phenotypeJson: string, constraintsJson?: string): ExecutionResultView;
36
+ executeGene(wasmBytes: Buffer, inputJson: string, phenotypeJson: string, constraintsJson?: string,
37
+ /** v0.9.4 AgentMemory: {"agentId","geneId"}; omitted → the gene has no agent memory. */
38
+ memoryContextJson?: string): ExecutionResultView;
37
39
  l0Check(phenotypeJson: string, permissionsJson?: string, constraintsJson?: string): L0CheckResultView;
38
- executeAlgebra(algebraJson: string, geneEntriesJson: string, inputJson: string, constraintsJson?: string): AlgebraResultView;
40
+ executeAlgebra(algebraJson: string, geneEntriesJson: string, inputJson: string, constraintsJson?: string,
41
+ /** v0.9.4 AgentMemory: {"agentId"}; each gene runs as its entry's v2Id. */
42
+ memoryContextJson?: string): AlgebraResultView;
39
43
  }
40
44
  export declare function tryLoadBinding(): NativeBinding | null;
41
45
  /** A gene announcement received from a peer (mirrors the Rust napi struct). */