@rotifer/playground 0.31.0 → 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 (125) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +2 -2
  3. package/README.zh.md +2 -2
  4. package/dist/cloud/client.d.ts.map +1 -1
  5. package/dist/cloud/client.js +9 -0
  6. package/dist/cloud/client.js.map +1 -1
  7. package/dist/cloud/types.d.ts +7 -0
  8. package/dist/cloud/types.d.ts.map +1 -1
  9. package/dist/cloud/types.js.map +1 -1
  10. package/dist/commands/agent-create.d.ts +11 -0
  11. package/dist/commands/agent-create.d.ts.map +1 -1
  12. package/dist/commands/agent-create.js +50 -1
  13. package/dist/commands/agent-create.js.map +1 -1
  14. package/dist/commands/agent-memory.d.ts +64 -0
  15. package/dist/commands/agent-memory.d.ts.map +1 -0
  16. package/dist/commands/agent-memory.js +235 -0
  17. package/dist/commands/agent-memory.js.map +1 -0
  18. package/dist/commands/agent-run.d.ts.map +1 -1
  19. package/dist/commands/agent-run.js +84 -26
  20. package/dist/commands/agent-run.js.map +1 -1
  21. package/dist/commands/arena-submit.d.ts.map +1 -1
  22. package/dist/commands/arena-submit.js +34 -36
  23. package/dist/commands/arena-submit.js.map +1 -1
  24. package/dist/commands/compile.d.ts.map +1 -1
  25. package/dist/commands/compile.js +32 -6
  26. package/dist/commands/compile.js.map +1 -1
  27. package/dist/commands/genome-format.d.ts +5 -1
  28. package/dist/commands/genome-format.d.ts.map +1 -1
  29. package/dist/commands/genome-format.js +5 -1
  30. package/dist/commands/genome-format.js.map +1 -1
  31. package/dist/commands/hello.d.ts.map +1 -1
  32. package/dist/commands/hello.js +15 -2
  33. package/dist/commands/hello.js.map +1 -1
  34. package/dist/commands/run.d.ts.map +1 -1
  35. package/dist/commands/run.js +59 -4
  36. package/dist/commands/run.js.map +1 -1
  37. package/dist/commands/test.d.ts.map +1 -1
  38. package/dist/commands/test.js +78 -23
  39. package/dist/commands/test.js.map +1 -1
  40. package/dist/commands/wrap.d.ts.map +1 -1
  41. package/dist/commands/wrap.js +28 -70
  42. package/dist/commands/wrap.js.map +1 -1
  43. package/dist/index.js +47 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/memory/access.d.ts +53 -0
  46. package/dist/memory/access.d.ts.map +1 -0
  47. package/dist/memory/access.js +111 -0
  48. package/dist/memory/access.js.map +1 -0
  49. package/dist/memory/audit.d.ts +26 -0
  50. package/dist/memory/audit.d.ts.map +1 -0
  51. package/dist/memory/audit.js +30 -0
  52. package/dist/memory/audit.js.map +1 -0
  53. package/dist/memory/backend.d.ts +141 -0
  54. package/dist/memory/backend.d.ts.map +1 -0
  55. package/dist/memory/backend.js +536 -0
  56. package/dist/memory/backend.js.map +1 -0
  57. package/dist/memory/codec.d.ts +34 -0
  58. package/dist/memory/codec.d.ts.map +1 -0
  59. package/dist/memory/codec.js +184 -0
  60. package/dist/memory/codec.js.map +1 -0
  61. package/dist/memory/data-policy.d.ts +39 -0
  62. package/dist/memory/data-policy.d.ts.map +1 -0
  63. package/dist/memory/data-policy.js +42 -0
  64. package/dist/memory/data-policy.js.map +1 -0
  65. package/dist/memory/host.d.ts +119 -0
  66. package/dist/memory/host.d.ts.map +1 -0
  67. package/dist/memory/host.js +226 -0
  68. package/dist/memory/host.js.map +1 -0
  69. package/dist/memory/index.d.ts +37 -0
  70. package/dist/memory/index.d.ts.map +1 -0
  71. package/dist/memory/index.js +64 -0
  72. package/dist/memory/index.js.map +1 -0
  73. package/dist/memory/telemetry.d.ts +35 -0
  74. package/dist/memory/telemetry.d.ts.map +1 -0
  75. package/dist/memory/telemetry.js +51 -0
  76. package/dist/memory/telemetry.js.map +1 -0
  77. package/dist/memory/types.d.ts +110 -0
  78. package/dist/memory/types.d.ts.map +1 -0
  79. package/dist/memory/types.js +74 -0
  80. package/dist/memory/types.js.map +1 -0
  81. package/dist/publish/auto-publish.d.ts +1 -1
  82. package/dist/publish/auto-publish.js +1 -1
  83. package/dist/runtime/network-gateway.d.ts +24 -4
  84. package/dist/runtime/network-gateway.d.ts.map +1 -1
  85. package/dist/runtime/network-gateway.js +86 -12
  86. package/dist/runtime/network-gateway.js.map +1 -1
  87. package/dist/testsuite/gate.d.ts +8 -0
  88. package/dist/testsuite/gate.d.ts.map +1 -1
  89. package/dist/testsuite/gate.js +13 -3
  90. package/dist/testsuite/gate.js.map +1 -1
  91. package/dist/testsuite/run.d.ts +6 -11
  92. package/dist/testsuite/run.d.ts.map +1 -1
  93. package/dist/testsuite/run.js +29 -4
  94. package/dist/testsuite/run.js.map +1 -1
  95. package/dist/utils/arena-success.d.ts +10 -0
  96. package/dist/utils/arena-success.d.ts.map +1 -1
  97. package/dist/utils/arena-success.js +35 -8
  98. package/dist/utils/arena-success.js.map +1 -1
  99. package/dist/utils/binding.d.ts +6 -2
  100. package/dist/utils/binding.d.ts.map +1 -1
  101. package/dist/utils/binding.js.map +1 -1
  102. package/dist/utils/clawhub-client.d.ts +73 -0
  103. package/dist/utils/clawhub-client.d.ts.map +1 -0
  104. package/dist/utils/clawhub-client.js +176 -0
  105. package/dist/utils/clawhub-client.js.map +1 -0
  106. package/dist/utils/config.d.ts +7 -0
  107. package/dist/utils/config.d.ts.map +1 -1
  108. package/dist/utils/config.js +15 -1
  109. package/dist/utils/config.js.map +1 -1
  110. package/dist/utils/fitness-formula.d.ts +20 -4
  111. package/dist/utils/fitness-formula.d.ts.map +1 -1
  112. package/dist/utils/fitness-formula.js +24 -6
  113. package/dist/utils/fitness-formula.js.map +1 -1
  114. package/dist/utils/gene-id-display.d.ts +14 -0
  115. package/dist/utils/gene-id-display.d.ts.map +1 -0
  116. package/dist/utils/gene-id-display.js +64 -0
  117. package/dist/utils/gene-id-display.js.map +1 -0
  118. package/dist/utils/l0-gate.d.ts.map +1 -1
  119. package/dist/utils/l0-gate.js +4 -1
  120. package/dist/utils/l0-gate.js.map +1 -1
  121. package/dist/utils/rust-phenotype.d.ts +17 -5
  122. package/dist/utils/rust-phenotype.d.ts.map +1 -1
  123. package/dist/utils/rust-phenotype.js +25 -4
  124. package/dist/utils/rust-phenotype.js.map +1 -1
  125. package/package.json +10 -5
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ /**
3
+ * The two ClawHub endpoints `wrap --from-clawhub` uses: skill metadata and
4
+ * the skill package.
5
+ *
6
+ * Both sit in front of ClawHub's Convex backend, which is slow (4–11 s per
7
+ * answer) and fails about one request in six with HTTP 500
8
+ * `[Request ID: …] Server Error` — from any network, measured 2026-10-31.
9
+ * So every request here has a timeout, transient failures (5xx, 408, 429, a
10
+ * timeout, a network error) are retried with backoff, and a failure that
11
+ * survives the retries says exactly what it was: a 404 is "not found", a 500
12
+ * carries ClawHub's own message, a non-JSON answer names its content type.
13
+ * Before this, all of them read "not found or API error", which is how a
14
+ * flaky upstream passed for a missing skill.
15
+ *
16
+ * `fetch` follows 301/302/307/308. The download endpoint answers 307, which
17
+ * an earlier hand-written client did not follow (2026-08-31).
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.ClawHubError = exports.CLAWHUB_DOWNLOAD = exports.CLAWHUB_API = void 0;
21
+ exports.clawHubEndpoints = clawHubEndpoints;
22
+ exports.fetchClawHubInfo = fetchClawHubInfo;
23
+ exports.fetchClawHubPackage = fetchClawHubPackage;
24
+ exports.CLAWHUB_API = "https://clawhub.ai/api/skill";
25
+ exports.CLAWHUB_DOWNLOAD = "https://wry-manatee-359.convex.site/api/v1/download";
26
+ class ClawHubError extends Error {
27
+ kind;
28
+ url;
29
+ attempts;
30
+ status;
31
+ detail;
32
+ constructor(kind, url, attempts, status, detail) {
33
+ super(describeFailure(kind, attempts, status, detail));
34
+ this.kind = kind;
35
+ this.url = url;
36
+ this.attempts = attempts;
37
+ this.status = status;
38
+ this.detail = detail;
39
+ this.name = "ClawHubError";
40
+ }
41
+ }
42
+ exports.ClawHubError = ClawHubError;
43
+ function describeFailure(kind, attempts, status, detail) {
44
+ const tries = `${attempts} attempt${attempts === 1 ? "" : "s"}`;
45
+ switch (kind) {
46
+ case "not_found":
47
+ return `not found (HTTP ${status ?? 404})`;
48
+ case "http":
49
+ return `HTTP ${status}${detail ? ` — ${detail}` : ""} (${tries})`;
50
+ case "not_json":
51
+ return `the response was not JSON (${detail}) (${tries})`;
52
+ case "timeout":
53
+ return `no answer within ${detail} (${tries})`;
54
+ case "network":
55
+ return `network error: ${detail} (${tries})`;
56
+ }
57
+ }
58
+ const DEFAULTS = {
59
+ attempts: 3,
60
+ // A successful answer takes up to ~11 s; leave room above that.
61
+ timeoutMs: 30_000,
62
+ retryDelaysMs: [1_000, 3_000],
63
+ };
64
+ const LOOPBACK = new Set(["127.0.0.1", "localhost", "[::1]", "::1"]);
65
+ /**
66
+ * The endpoints, or the overrides in ROTIFER_CLAWHUB_API_URL /
67
+ * ROTIFER_CLAWHUB_DOWNLOAD_URL (a mirror, or a local fixture in tests). An
68
+ * override must be https, or plain http to a loopback address; anything else
69
+ * is refused rather than silently sending requests somewhere unencrypted.
70
+ */
71
+ function clawHubEndpoints(env = process.env) {
72
+ return {
73
+ api: checkedOverride("ROTIFER_CLAWHUB_API_URL", env.ROTIFER_CLAWHUB_API_URL) ?? exports.CLAWHUB_API,
74
+ download: checkedOverride("ROTIFER_CLAWHUB_DOWNLOAD_URL", env.ROTIFER_CLAWHUB_DOWNLOAD_URL) ?? exports.CLAWHUB_DOWNLOAD,
75
+ };
76
+ }
77
+ function checkedOverride(name, value) {
78
+ if (!value)
79
+ return undefined;
80
+ let url;
81
+ try {
82
+ url = new URL(value);
83
+ }
84
+ catch {
85
+ throw new Error(`${name} is not a URL: ${value}`);
86
+ }
87
+ if (url.protocol === "https:" || (url.protocol === "http:" && LOOPBACK.has(url.hostname))) {
88
+ return value;
89
+ }
90
+ throw new Error(`${name} must be https, or http to a loopback address: ${value}`);
91
+ }
92
+ function isTransientStatus(status) {
93
+ return status >= 500 || status === 408 || status === 429;
94
+ }
95
+ /** ClawHub's error text: the `code` / `message` / `error` field, or the body. */
96
+ function errorDetail(body) {
97
+ let text = body.trim();
98
+ try {
99
+ const parsed = JSON.parse(text);
100
+ const field = ["code", "message", "error"].map((k) => parsed[k]).find((v) => typeof v === "string");
101
+ if (typeof field === "string")
102
+ text = field;
103
+ }
104
+ catch {
105
+ // not JSON: keep the text
106
+ }
107
+ return text.length > 200 ? `${text.slice(0, 200)}…` : text;
108
+ }
109
+ function sleep(ms) {
110
+ return new Promise((resolve) => setTimeout(resolve, ms));
111
+ }
112
+ async function request(url, options) {
113
+ const attempts = Math.max(1, options.attempts ?? DEFAULTS.attempts);
114
+ const timeoutMs = options.timeoutMs ?? DEFAULTS.timeoutMs;
115
+ const delays = options.retryDelaysMs ?? DEFAULTS.retryDelaysMs;
116
+ const doFetch = options.fetchImpl ?? fetch;
117
+ let last;
118
+ for (let attempt = 1; attempt <= attempts; attempt++) {
119
+ let failure;
120
+ try {
121
+ const res = await doFetch(url, { redirect: "follow", signal: AbortSignal.timeout(timeoutMs) });
122
+ const body = Buffer.from(await res.arrayBuffer());
123
+ if (res.status === 200) {
124
+ return { status: 200, contentType: res.headers.get("content-type") ?? "", body };
125
+ }
126
+ const detail = errorDetail(body.toString("utf-8"));
127
+ if (res.status === 404)
128
+ throw new ClawHubError("not_found", url, attempt, 404, detail);
129
+ failure = new ClawHubError("http", url, attempt, res.status, detail);
130
+ if (!isTransientStatus(res.status))
131
+ throw failure;
132
+ }
133
+ catch (e) {
134
+ if (e instanceof ClawHubError)
135
+ throw e;
136
+ const err = e;
137
+ failure =
138
+ err.name === "TimeoutError" || err.name === "AbortError"
139
+ ? new ClawHubError("timeout", url, attempt, undefined, timeoutMs >= 1000 ? `${Math.round(timeoutMs / 1000)} s` : `${timeoutMs} ms`)
140
+ : new ClawHubError("network", url, attempt, undefined, err.cause?.code ?? err.cause?.message ?? err.message);
141
+ }
142
+ last = failure;
143
+ if (attempt < attempts) {
144
+ options.onRetry?.(attempt, attempts, failure);
145
+ await sleep(delays[Math.min(attempt - 1, delays.length - 1)] ?? 0);
146
+ }
147
+ }
148
+ throw last;
149
+ }
150
+ async function fetchClawHubInfo(slug, options = {}) {
151
+ const url = `${options.api ?? clawHubEndpoints().api}?slug=${encodeURIComponent(slug)}`;
152
+ const answer = await request(url, options);
153
+ let data;
154
+ try {
155
+ data = JSON.parse(answer.body.toString("utf-8"));
156
+ }
157
+ catch {
158
+ throw new ClawHubError("not_json", url, 1, 200, `content-type ${answer.contentType || "unknown"}`);
159
+ }
160
+ if (!data.skill)
161
+ throw new ClawHubError("not_found", url, 1, 200, "the answer names no skill");
162
+ return {
163
+ slug: data.skill.slug,
164
+ displayName: data.skill.displayName,
165
+ summary: data.skill.summary,
166
+ stats: data.skill.stats,
167
+ owner: { handle: data.owner?.handle || "unknown", displayName: data.owner?.displayName || "" },
168
+ version: data.latestVersion?.version || "0.0.0",
169
+ };
170
+ }
171
+ /** The skill package (a zip). */
172
+ async function fetchClawHubPackage(slug, options = {}) {
173
+ const url = `${options.download ?? clawHubEndpoints().download}?slug=${encodeURIComponent(slug)}`;
174
+ return (await request(url, options)).body;
175
+ }
176
+ //# sourceMappingURL=clawhub-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawhub-client.js","sourceRoot":"","sources":["../../src/utils/clawhub-client.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,13 @@ export interface RotiferConfig {
6
6
  default_domain?: string;
7
7
  }
8
8
  export declare function findProjectRoot(startDir?: string): string | null;
9
+ /**
10
+ * rotifer.json exists but cannot be read as a config. The CLI entry point
11
+ * reports it as a message, not a stack (#456); the file is never rewritten.
12
+ */
13
+ export declare class ConfigError extends Error {
14
+ name: string;
15
+ }
9
16
  export declare function loadConfig(projectDir?: string): RotiferConfig;
10
17
  export declare function saveConfig(config: RotiferConfig, projectDir: string): void;
11
18
  export declare function getProjectRoot(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAS/E;AAED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAW7D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAG1E;AAED,wBAAgB,cAAc,IAAI,MAAM,CAQvC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAS/E;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAC3B,IAAI,SAAiB;CAC/B;AAED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAe7D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAG1E;AAED,wBAAgB,cAAc,IAAI,MAAM,CAQvC"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigError = void 0;
3
4
  exports.findProjectRoot = findProjectRoot;
4
5
  exports.loadConfig = loadConfig;
5
6
  exports.saveConfig = saveConfig;
@@ -17,6 +18,14 @@ function findProjectRoot(startDir = process.cwd()) {
17
18
  }
18
19
  return null;
19
20
  }
21
+ /**
22
+ * rotifer.json exists but cannot be read as a config. The CLI entry point
23
+ * reports it as a message, not a stack (#456); the file is never rewritten.
24
+ */
25
+ class ConfigError extends Error {
26
+ name = "ConfigError";
27
+ }
28
+ exports.ConfigError = ConfigError;
20
29
  function loadConfig(projectDir) {
21
30
  const root = projectDir || findProjectRoot();
22
31
  if (!root) {
@@ -24,7 +33,12 @@ function loadConfig(projectDir) {
24
33
  }
25
34
  const configPath = (0, node_path_1.join)(root, CONFIG_FILE);
26
35
  const content = (0, node_fs_1.readFileSync)(configPath, "utf-8");
27
- return JSON.parse(content);
36
+ try {
37
+ return JSON.parse(content);
38
+ }
39
+ catch (err) {
40
+ throw new ConfigError(`${configPath} is not valid JSON: ${err.message}`);
41
+ }
28
42
  }
29
43
  function saveConfig(config, projectDir) {
30
44
  const configPath = (0, node_path_1.join)(projectDir, CONFIG_FILE);
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;AAaA,0CASC;AAED,gCAWC;AAED,gCAGC;AAED,wCAQC;AAlDD,qCAAkE;AAClE,yCAAiC;AAUjC,MAAM,WAAW,GAAG,cAAc,CAAC;AAEnC,SAAgB,eAAe,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC9D,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,OAAO,GAAG,KAAK,GAAG,EAAE,CAAC;QACnB,IAAI,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;YACvC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,GAAG,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,UAAU,CAAC,UAAmB;IAC5C,MAAM,IAAI,GAAG,UAAU,IAAI,eAAe,EAAE,CAAC;IAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,MAAM,WAAW,mCAAmC,CACrD,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;AAC9C,CAAC;AAED,SAAgB,UAAU,CAAC,MAAqB,EAAE,UAAkB;IAClE,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACjD,IAAA,uBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,cAAc;IAC5B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,MAAM,WAAW,6DAA6D,CAC/E,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;AAaA,0CASC;AAUD,gCAeC;AAED,gCAGC;AAED,wCAQC;AA9DD,qCAAkE;AAClE,yCAAiC;AAUjC,MAAM,WAAW,GAAG,cAAc,CAAC;AAEnC,SAAgB,eAAe,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC9D,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,OAAO,GAAG,KAAK,GAAG,EAAE,CAAC;QACnB,IAAI,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;YACvC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,GAAG,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAa,WAAY,SAAQ,KAAK;IAC3B,IAAI,GAAG,aAAa,CAAC;CAC/B;AAFD,kCAEC;AAED,SAAgB,UAAU,CAAC,UAAmB;IAC5C,MAAM,IAAI,GAAG,UAAU,IAAI,eAAe,EAAE,CAAC;IAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,MAAM,WAAW,mCAAmC,CACrD,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,WAAW,CAAC,GAAG,UAAU,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAAqB,EAAE,UAAkB;IAClE,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACjD,IAAA,uBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,cAAc;IAC5B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,MAAM,WAAW,6DAA6D,CAC/E,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,5 +1,13 @@
1
1
  /**
2
- * The §5.1 fitness formula, in one place.
2
+ * The §5.1 fitness formula, in one place, normalized to [0, 1] (ADR-346):
3
+ *
4
+ * F(g) = S_r · log₂(1 + C_util) · (1 + R_rob)/2 · L_score · Cost_score
5
+ *
6
+ * Five factors, each in [0, 1], so F(g) is in [0, 1] with no cap; the maximum,
7
+ * exactly 1, is S_r = C_util = R_rob = 1 at zero latency and cost. This equals
8
+ * the ADR-318 D2 form divided by 2·ln 2, but is written as the product so the
9
+ * maximum comes out as exactly 1 rather than as a quotient that could round
10
+ * past it. The spec's original statement was
3
11
  *
4
12
  * F(g) = [S_r · ln(1 + C_util) · (1 + R_rob)] / [L · Resource_Cost]
5
13
  *
@@ -25,6 +33,14 @@
25
33
  * and every gene slower than a second pinned at the 1.0 cap. The regression
26
34
  * tests in `tests/unit/fitness-formula.test.ts` hold the direction.
27
35
  */
36
+ /**
37
+ * Which formula `computeBaseFitness` implements, numbered as rotifer-core's
38
+ * `fitness::FORMULA_VERSION`: 1 additive, 2 multiplicative in (0, 2·ln 2]
39
+ * (ADR-318 D2), 3 multiplicative normalized to [0, 1] (ADR-346). Sent with
40
+ * every Arena upload as `formula_version`, so the registry can tell the scales
41
+ * apart.
42
+ */
43
+ export declare const FITNESS_FORMULA_VERSION = 3;
28
44
  /**
29
45
  * Fallback L_ref: latency at which L_score halves when no season median is
30
46
  * available. `[N]` — provisional, uncalibrated.
@@ -46,8 +62,8 @@ export declare const LATENCY_SCALE_MS = 1000;
46
62
  * sandbox runs each over the bundled Native corpus burn 1.2M–83M fuel
47
63
  * (url-extractor 1.22M, debugger 1.44M, citation-manager 1.80M,
48
64
  * particle-spatial 83.3M), so at a 10k scale every real gene lands at a
49
- * Cost_score of 0.008 or below and F(g) collapses to ~0.003 — far under
50
- * τ = 0.3. While it divided, the same mismatch was invisible: it inflated F(g)
65
+ * Cost_score of 0.008 or below and F(g) collapses to ~0.002 — far under
66
+ * any admission threshold. While it divided, the same mismatch was invisible: it inflated F(g)
51
67
  * past the 1.0 cap instead. This is why `arena submit` does not gate on F(g)
52
68
  * while `hasCompleteFitnessInputs` is false: a threshold comparison against a
53
69
  * provisional scale is not an admission decision. Picking new values is a
@@ -117,7 +133,7 @@ export interface FitnessInputs {
117
133
  }
118
134
  export interface FitnessBreakdown {
119
135
  /**
120
- * F(g), in (0, 2·ln 2] ≈ (0, 1.386].
136
+ * F(g), in [0, 1] (ADR-346).
121
137
  *
122
138
  * Not capped. The old `min(1.0)` was there because dividing by the
123
139
  * efficiency scores made the value unbounded — with them multiplied the
@@ -1 +1 @@
1
- {"version":3,"file":"fitness-formula.d.ts","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,cAAc,CAGtD,CAAC;AAEH,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAKpE;AAED,4FAA4F;AAC5F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,eAAe,GAAG,UAAU,CAAC;IACrC;;;;;;;;OAQG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,GACvF,OAAO,CAAC,iBAAiB,CAAC,CAuC5B;AAED,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,eAAe,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,GAAE,MAAyB,GAAG,MAAM,CAErG;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,GAAE,MAA6B,GAAG,MAAM,CAE7G;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,cAAmC,GAC7C,gBAAgB,CAWlB"}
1
+ {"version":3,"file":"fitness-formula.d.ts","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,cAAc,CAGtD,CAAC;AAEH,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAKpE;AAED,4FAA4F;AAC5F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,eAAe,GAAG,UAAU,CAAC;IACrC;;;;;;;;OAQG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,GACvF,OAAO,CAAC,iBAAiB,CAAC,CAuC5B;AAED,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,eAAe,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,GAAE,MAAyB,GAAG,MAAM,CAErG;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,GAAE,MAA6B,GAAG,MAAM,CAE7G;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,cAAmC,GAC7C,gBAAgB,CAalB"}
@@ -1,6 +1,14 @@
1
1
  "use strict";
2
2
  /**
3
- * The §5.1 fitness formula, in one place.
3
+ * The §5.1 fitness formula, in one place, normalized to [0, 1] (ADR-346):
4
+ *
5
+ * F(g) = S_r · log₂(1 + C_util) · (1 + R_rob)/2 · L_score · Cost_score
6
+ *
7
+ * Five factors, each in [0, 1], so F(g) is in [0, 1] with no cap; the maximum,
8
+ * exactly 1, is S_r = C_util = R_rob = 1 at zero latency and cost. This equals
9
+ * the ADR-318 D2 form divided by 2·ln 2, but is written as the product so the
10
+ * maximum comes out as exactly 1 rather than as a quotient that could round
11
+ * past it. The spec's original statement was
4
12
  *
5
13
  * F(g) = [S_r · ln(1 + C_util) · (1 + R_rob)] / [L · Resource_Cost]
6
14
  *
@@ -27,12 +35,20 @@
27
35
  * tests in `tests/unit/fitness-formula.test.ts` hold the direction.
28
36
  */
29
37
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.REFERENCE_FUNCTION_MISSING = exports.FALLBACK_REFERENCE = exports.RESOURCE_SCALE_UNITS = exports.LATENCY_SCALE_MS = void 0;
38
+ exports.REFERENCE_FUNCTION_MISSING = exports.FALLBACK_REFERENCE = exports.RESOURCE_SCALE_UNITS = exports.LATENCY_SCALE_MS = exports.FITNESS_FORMULA_VERSION = void 0;
31
39
  exports.isUsableReference = isUsableReference;
32
40
  exports.resolveFitnessReference = resolveFitnessReference;
33
41
  exports.latencyScoreFor = latencyScoreFor;
34
42
  exports.resourceEfficiencyFor = resourceEfficiencyFor;
35
43
  exports.computeBaseFitness = computeBaseFitness;
44
+ /**
45
+ * Which formula `computeBaseFitness` implements, numbered as rotifer-core's
46
+ * `fitness::FORMULA_VERSION`: 1 additive, 2 multiplicative in (0, 2·ln 2]
47
+ * (ADR-318 D2), 3 multiplicative normalized to [0, 1] (ADR-346). Sent with
48
+ * every Arena upload as `formula_version`, so the registry can tell the scales
49
+ * apart.
50
+ */
51
+ exports.FITNESS_FORMULA_VERSION = 3;
36
52
  /**
37
53
  * Fallback L_ref: latency at which L_score halves when no season median is
38
54
  * available. `[N]` — provisional, uncalibrated.
@@ -54,8 +70,8 @@ exports.LATENCY_SCALE_MS = 1000;
54
70
  * sandbox runs each over the bundled Native corpus burn 1.2M–83M fuel
55
71
  * (url-extractor 1.22M, debugger 1.44M, citation-manager 1.80M,
56
72
  * particle-spatial 83.3M), so at a 10k scale every real gene lands at a
57
- * Cost_score of 0.008 or below and F(g) collapses to ~0.003 — far under
58
- * τ = 0.3. While it divided, the same mismatch was invisible: it inflated F(g)
73
+ * Cost_score of 0.008 or below and F(g) collapses to ~0.002 — far under
74
+ * any admission threshold. While it divided, the same mismatch was invisible: it inflated F(g)
59
75
  * past the 1.0 cap instead. This is why `arena submit` does not gate on F(g)
60
76
  * while `hasCompleteFitnessInputs` is false: a threshold comparison against a
61
77
  * provisional scale is not an admission decision. Picking new values is a
@@ -144,10 +160,12 @@ function computeBaseFitness(inputs, reference = exports.FALLBACK_REFERENCE) {
144
160
  const scale = isUsableReference(reference) ? reference : exports.FALLBACK_REFERENCE;
145
161
  const latencyScore = latencyScoreFor(inputs.avgLatencyMs, scale.latencyMs);
146
162
  const resourceEfficiency = resourceEfficiencyFor(inputs.avgResourceCost, scale.resourceCost);
147
- const quality = inputs.successRate * Math.log1p(inputs.coverage) * (1 + inputs.robustness);
163
+ // Each factor is in [0, 1]: log₂(1 + C) is 1 at C = 1 and (1 + R)/2 is 1 at
164
+ // R = 1 — exactly, which keeps the product's maximum at exactly 1.
165
+ const quality = inputs.successRate * Math.log2(1 + inputs.coverage) * ((1 + inputs.robustness) / 2);
148
166
  // Multiplied, not divided: L_score and Cost_score are already inverted, so
149
167
  // multiplying by them is what makes slower and costlier score lower. No cap —
150
- // every factor is bounded, so the product is too.
168
+ // every factor is in [0, 1], so the product is too.
151
169
  const value = quality * latencyScore * resourceEfficiency;
152
170
  return { value, latencyScore, resourceEfficiency };
153
171
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fitness-formula.js","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fitness-formula.js","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Print the gene's v2 ID, or why it has none (docs/gene-id-v2.md) — the ID
3
+ * the protocol names the gene by: P2P announces it and agent memory records
4
+ * it as createdBy. Not the unprefixed phenotype hash (superseded).
5
+ */
6
+ export declare function showGeneIdV2(geneDir: string): void;
7
+ /**
8
+ * Print the content_hash `rotifer publish` sends for this phenotype
9
+ * (docs/content-hash-v1.md, ADR-341) — what install compares against.
10
+ * Labelled for what it is: a hash of phenotype.json as it stands, not an
11
+ * identity (that is the v2 ID above).
12
+ */
13
+ export declare function showContentHash(phenotype: Record<string, unknown>): void;
14
+ //# sourceMappingURL=gene-id-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gene-id-display.d.ts","sourceRoot":"","sources":["../../src/utils/gene-id-display.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIlD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAExE"}
@@ -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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.showGeneIdV2 = showGeneIdV2;
37
+ exports.showContentHash = showContentHash;
38
+ const node_path_1 = require("node:path");
39
+ const display = __importStar(require("./display.js"));
40
+ const palette_js_1 = require("./palette.js");
41
+ const binding_js_1 = require("./binding.js");
42
+ const content_hash_js_1 = require("./content-hash.js");
43
+ /**
44
+ * Print the gene's v2 ID, or why it has none (docs/gene-id-v2.md) — the ID
45
+ * the protocol names the gene by: P2P announces it and agent memory records
46
+ * it as createdBy. Not the unprefixed phenotype hash (superseded).
47
+ */
48
+ function showGeneIdV2(geneDir) {
49
+ const r = (0, binding_js_1.geneIdV2)((0, node_path_1.dirname)(geneDir), (0, node_path_1.basename)(geneDir));
50
+ if ("id" in r)
51
+ display.keyValue("Gene ID (v2)", palette_js_1.c.warn(r.id));
52
+ else
53
+ display.keyValue("Gene ID (v2)", `not computable — ${r.reason}`);
54
+ }
55
+ /**
56
+ * Print the content_hash `rotifer publish` sends for this phenotype
57
+ * (docs/content-hash-v1.md, ADR-341) — what install compares against.
58
+ * Labelled for what it is: a hash of phenotype.json as it stands, not an
59
+ * identity (that is the v2 ID above).
60
+ */
61
+ function showContentHash(phenotype) {
62
+ display.keyValue("Content hash", `${(0, content_hash_js_1.contentHash)(phenotype)} (phenotype.json as publish sends it — not an identity)`);
63
+ }
64
+ //# sourceMappingURL=gene-id-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gene-id-display.js","sourceRoot":"","sources":["../../src/utils/gene-id-display.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,oCAIC;AAQD,0CAEC;AAzBD,yCAA8C;AAC9C,sDAAwC;AACxC,6CAAiC;AACjC,6CAAwC;AACxC,uDAAgD;AAEhD;;;;GAIG;AACH,SAAgB,YAAY,CAAC,OAAe;IAC1C,MAAM,CAAC,GAAG,IAAA,qBAAQ,EAAC,IAAA,mBAAO,EAAC,OAAO,CAAC,EAAE,IAAA,oBAAQ,EAAC,OAAO,CAAC,CAAC,CAAC;IACxD,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;QACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,SAAkC;IAChE,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,IAAA,6BAAW,EAAC,SAAS,CAAC,yDAAyD,CAAC,CAAC;AACvH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"l0-gate.d.ts","sourceRoot":"","sources":["../../src/utils/l0-gate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,SAAS,CAaX;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAW5D"}
1
+ {"version":3,"file":"l0-gate.d.ts","sourceRoot":"","sources":["../../src/utils/l0-gate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,SAAS,CAeX;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAW5D"}
@@ -4,6 +4,7 @@ exports.evaluateL0 = evaluateL0;
4
4
  exports.isExternallySourced = isExternallySourced;
5
5
  const node_fs_1 = require("node:fs");
6
6
  const node_path_1 = require("node:path");
7
+ const rust_phenotype_js_1 = require("./rust-phenotype.js");
7
8
  /**
8
9
  * 对一个基因的 phenotype 跑 L0 门控。
9
10
  *
@@ -18,8 +19,10 @@ function evaluateL0(binding, phenotype) {
18
19
  return { kind: "unavailable", detail: "native addon failed to load" };
19
20
  }
20
21
  try {
22
+ // In rotifer-core's shape: wrap's ISO createdAt made every wrapped gene's
23
+ // gate "unavailable" before (#448), which runs a local gene unchecked.
21
24
  const { irHash: _strip, ...phenotypeForL0 } = phenotype;
22
- const result = binding.l0Check(JSON.stringify(phenotypeForL0));
25
+ const result = binding.l0Check(JSON.stringify((0, rust_phenotype_js_1.toRustPhenotype)(phenotypeForL0)));
23
26
  return result.passed
24
27
  ? { kind: "pass" }
25
28
  : { kind: "violation", detail: result.violations.join("; ") };
@@ -1 +1 @@
1
- {"version":3,"file":"l0-gate.js","sourceRoot":"","sources":["../../src/utils/l0-gate.ts"],"names":[],"mappings":";;AA6BA,gCAgBC;AAuBD,kDAWC;AA/ED,qCAAmD;AACnD,yCAAiC;AAmBjC;;;;;;;;GAQG;AACH,SAAgB,UAAU,CACxB,OAA6B,EAC7B,SAAkC;IAElC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,GAAG,SAAS,CAAC;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC,MAAM;YAClB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;YAClB,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAClE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,yBAAyB,GAAG,EAAE,OAAO,IAAI,GAAG,GAAG,EAAE,CAAC;IAC1F,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,mBAAmB,CAAC,OAAe;IACjD,MAAM,YAAY,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAC3D,IAAI,CAAC,IAAA,oBAAU,EAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAA4B,CAAC;QACrF,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC;QAC3D,MAAM,eAAe,GAAG,cAAc,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"l0-gate.js","sourceRoot":"","sources":["../../src/utils/l0-gate.ts"],"names":[],"mappings":";;AA8BA,gCAkBC;AAuBD,kDAWC;AAlFD,qCAAmD;AACnD,yCAAiC;AAEjC,2DAAsD;AAkBtD;;;;;;;;GAQG;AACH,SAAgB,UAAU,CACxB,OAA6B,EAC7B,SAAkC;IAElC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,CAAC;QACH,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,GAAG,SAAS,CAAC;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAA,mCAAe,EAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,MAAM,CAAC,MAAM;YAClB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;YAClB,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAClE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,yBAAyB,GAAG,EAAE,OAAO,IAAI,GAAG,GAAG,EAAE,CAAC;IAC1F,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,mBAAmB,CAAC,OAAe;IACjD,MAAM,YAAY,GAAG,IAAA,gBAAI,EAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAC3D,IAAI,CAAC,IAAA,oBAAU,EAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAA4B,CAAC;QACrF,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC;QAC3D,MAAM,eAAe,GAAG,cAAc,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -10,15 +10,27 @@
10
10
  *
11
11
  * Values are converted, not dropped. A value that cannot be converted
12
12
  * faithfully (an irHash that is not 32 bytes of hex, a createdAt that is not a
13
- * date) is omitted, so Rust falls back to its serde default (`None` / `0`).
14
- * None of the three fields is read while executing a gene — they are
15
- * metadata — so omitting one does not change what runs.
13
+ * date, a dependency named without a way to resolve the name) is omitted, so
14
+ * Rust falls back to its serde default (`None` / `0` / empty). None of the
15
+ * three fields is read while executing a gene — they are metadata — so
16
+ * omitting one does not change what runs. A caller that must not lose a value
17
+ * silently checks `createdAtProblem` first.
18
+ *
19
+ * Every path that hands a phenotype.json to rotifer-core goes through this:
20
+ * `agent run`'s algebra executor, `compile`'s IR compiler (#448), the L0 gate
21
+ * and `test --compliance` (#449).
16
22
  *
17
23
  * Other fields pass through unchanged.
18
24
  */
25
+ /**
26
+ * Why `createdAt` cannot be converted, or undefined when it can (or is absent).
27
+ * For callers that report the field rather than let Rust default it to 0.
28
+ */
29
+ export declare function createdAtProblem(phenotype: Record<string, unknown>): string | undefined;
19
30
  /**
20
31
  * @param geneId maps a dependency given by gene name to its gene id, using the
21
- * same derivation as the gene entries passed alongside the phenotype.
32
+ * same derivation as the gene entries passed alongside the phenotype. Without
33
+ * it, only dependencies already given as 64-char hex ids are kept.
22
34
  */
23
- export declare function toRustPhenotype(phenotype: Record<string, unknown>, geneId: (geneName: string) => string): Record<string, unknown>;
35
+ export declare function toRustPhenotype(phenotype: Record<string, unknown>, geneId?: (geneName: string) => string): Record<string, unknown>;
24
36
  //# sourceMappingURL=rust-phenotype.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rust-phenotype.d.ts","sourceRoot":"","sources":["../../src/utils/rust-phenotype.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAqBH;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
1
+ {"version":3,"file":"rust-phenotype.d.ts","sourceRoot":"","sources":["../../src/utils/rust-phenotype.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAqBH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAKvF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB"}
@@ -11,13 +11,20 @@
11
11
  *
12
12
  * Values are converted, not dropped. A value that cannot be converted
13
13
  * faithfully (an irHash that is not 32 bytes of hex, a createdAt that is not a
14
- * date) is omitted, so Rust falls back to its serde default (`None` / `0`).
15
- * None of the three fields is read while executing a gene — they are
16
- * metadata — so omitting one does not change what runs.
14
+ * date, a dependency named without a way to resolve the name) is omitted, so
15
+ * Rust falls back to its serde default (`None` / `0` / empty). None of the
16
+ * three fields is read while executing a gene — they are metadata — so
17
+ * omitting one does not change what runs. A caller that must not lose a value
18
+ * silently checks `createdAtProblem` first.
19
+ *
20
+ * Every path that hands a phenotype.json to rotifer-core goes through this:
21
+ * `agent run`'s algebra executor, `compile`'s IR compiler (#448), the L0 gate
22
+ * and `test --compliance` (#449).
17
23
  *
18
24
  * Other fields pass through unchanged.
19
25
  */
20
26
  Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.createdAtProblem = createdAtProblem;
21
28
  exports.toRustPhenotype = toRustPhenotype;
22
29
  const HEX_32_BYTES = /^[0-9a-fA-F]{64}$/;
23
30
  function hexToBytes(hex) {
@@ -36,9 +43,22 @@ function toEpochMillis(value) {
36
43
  }
37
44
  return undefined;
38
45
  }
46
+ /**
47
+ * Why `createdAt` cannot be converted, or undefined when it can (or is absent).
48
+ * For callers that report the field rather than let Rust default it to 0.
49
+ */
50
+ function createdAtProblem(phenotype) {
51
+ const { createdAt } = phenotype;
52
+ if (createdAt === undefined)
53
+ return undefined;
54
+ if (toEpochMillis(createdAt) !== undefined)
55
+ return undefined;
56
+ return `createdAt ${JSON.stringify(createdAt)} is not a date: use epoch milliseconds or an ISO 8601 timestamp`;
57
+ }
39
58
  /**
40
59
  * @param geneId maps a dependency given by gene name to its gene id, using the
41
- * same derivation as the gene entries passed alongside the phenotype.
60
+ * same derivation as the gene entries passed alongside the phenotype. Without
61
+ * it, only dependencies already given as 64-char hex ids are kept.
42
62
  */
43
63
  function toRustPhenotype(phenotype, geneId) {
44
64
  const { irHash, createdAt, dependencies, ...rest } = phenotype;
@@ -52,6 +72,7 @@ function toRustPhenotype(phenotype, geneId) {
52
72
  if (Array.isArray(dependencies)) {
53
73
  out.dependencies = dependencies
54
74
  .filter((d) => typeof d === "string" && d.length > 0)
75
+ .filter((d) => HEX_32_BYTES.test(d) || geneId !== undefined)
55
76
  .map((d) => hexToBytes(HEX_32_BYTES.test(d) ? d : geneId(d)));
56
77
  }
57
78
  return out;
@@ -1 +1 @@
1
- {"version":3,"file":"rust-phenotype.js","sourceRoot":"","sources":["../../src/utils/rust-phenotype.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAyBH,0CAqBC;AA5CD,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAC7B,SAAkC,EAClC,MAAoC;IAEpC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC;IAC/D,MAAM,GAAG,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IAEjD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,EAAE,KAAK,SAAS;QAAE,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC;IAEzC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,YAAY,GAAG,YAAY;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aACjE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"rust-phenotype.js","sourceRoot":"","sources":["../../src/utils/rust-phenotype.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;AAyBH,4CAKC;AAOD,0CAsBC;AAzDD,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,SAAkC;IACjE,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IAChC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,aAAa,CAAC,SAAS,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7D,OAAO,aAAa,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,iEAAiE,CAAC;AACjH,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAC7B,SAAkC,EAClC,MAAqC;IAErC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC;IAC/D,MAAM,GAAG,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IAEjD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,EAAE,KAAK,SAAS;QAAE,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC;IAEzC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,YAAY,GAAG,YAAY;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aACjE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,SAAS,CAAC;aAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}