@cotal-ai/core 0.85.0 → 0.87.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.
- package/dist/agent-file.d.ts.map +1 -1
- package/dist/agent-file.js +10 -3
- package/dist/agent-file.js.map +1 -1
- package/dist/base64url.d.ts +5 -0
- package/dist/base64url.d.ts.map +1 -0
- package/dist/base64url.js +14 -0
- package/dist/base64url.js.map +1 -0
- package/dist/browser-control.d.ts +149 -0
- package/dist/browser-control.d.ts.map +1 -0
- package/dist/browser-control.js +167 -0
- package/dist/browser-control.js.map +1 -0
- package/dist/browser-validators-build.d.ts +23 -0
- package/dist/browser-validators-build.d.ts.map +1 -0
- package/dist/browser-validators-build.js +149 -0
- package/dist/browser-validators-build.js.map +1 -0
- package/dist/canonical-json.d.ts +14 -0
- package/dist/canonical-json.d.ts.map +1 -0
- package/dist/canonical-json.js +121 -0
- package/dist/canonical-json.js.map +1 -0
- package/dist/canonical.d.ts +2 -10
- package/dist/canonical.d.ts.map +1 -1
- package/dist/canonical.js +2 -108
- package/dist/canonical.js.map +1 -1
- package/dist/channels.d.ts +4 -0
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +6 -2
- package/dist/channels.js.map +1 -1
- package/dist/checkpoint-answer.d.ts.map +1 -1
- package/dist/checkpoint-answer.js +3 -4
- package/dist/checkpoint-answer.js.map +1 -1
- package/dist/connector-setup.d.ts +10 -1
- package/dist/connector-setup.d.ts.map +1 -1
- package/dist/digest-id.d.ts +4 -0
- package/dist/digest-id.d.ts.map +1 -0
- package/dist/digest-id.js +7 -0
- package/dist/digest-id.js.map +1 -0
- package/dist/endpoint-action.d.ts +2 -2
- package/dist/endpoint-action.d.ts.map +1 -1
- package/dist/endpoint-action.js +6 -44
- package/dist/endpoint-action.js.map +1 -1
- package/dist/endpoint-auth-digest.d.ts +7 -0
- package/dist/endpoint-auth-digest.d.ts.map +1 -0
- package/dist/endpoint-auth-digest.js +13 -0
- package/dist/endpoint-auth-digest.js.map +1 -0
- package/dist/endpoint-call.d.ts +176 -0
- package/dist/endpoint-call.d.ts.map +1 -0
- package/dist/endpoint-call.js +490 -0
- package/dist/endpoint-call.js.map +1 -0
- package/dist/endpoint-caller.d.ts +113 -0
- package/dist/endpoint-caller.d.ts.map +1 -0
- package/dist/endpoint-caller.js +260 -0
- package/dist/endpoint-caller.js.map +1 -0
- package/dist/endpoint-checkpoint.d.ts.map +1 -1
- package/dist/endpoint-checkpoint.js +5 -14
- package/dist/endpoint-checkpoint.js.map +1 -1
- package/dist/endpoint-envelope.d.ts +0 -6
- package/dist/endpoint-envelope.d.ts.map +1 -1
- package/dist/endpoint-envelope.js +17 -18
- package/dist/endpoint-envelope.js.map +1 -1
- package/dist/endpoint-goal-follow.d.ts +37 -0
- package/dist/endpoint-goal-follow.d.ts.map +1 -0
- package/dist/endpoint-goal-follow.js +328 -0
- package/dist/endpoint-goal-follow.js.map +1 -0
- package/dist/endpoint-grants.d.ts +0 -4
- package/dist/endpoint-grants.d.ts.map +1 -1
- package/dist/endpoint-grants.js +1 -7
- package/dist/endpoint-grants.js.map +1 -1
- package/dist/endpoint-guard.d.ts.map +1 -1
- package/dist/endpoint-guard.js +2 -10
- package/dist/endpoint-guard.js.map +1 -1
- package/dist/endpoint-invoke.d.ts +37 -143
- package/dist/endpoint-invoke.d.ts.map +1 -1
- package/dist/endpoint-invoke.js +60 -605
- package/dist/endpoint-invoke.js.map +1 -1
- package/dist/endpoint-publish-denial.d.ts +1 -1
- package/dist/endpoint-publish-denial.d.ts.map +1 -1
- package/dist/endpoint-publish-denial.js +1 -1
- package/dist/endpoint-publish-denial.js.map +1 -1
- package/dist/endpoint-receipt.d.ts.map +1 -1
- package/dist/endpoint-receipt.js +2 -16
- package/dist/endpoint-receipt.js.map +1 -1
- package/dist/endpoint-signing.d.ts +1 -1
- package/dist/endpoint-signing.d.ts.map +1 -1
- package/dist/endpoint-signing.js +1 -1
- package/dist/endpoint-signing.js.map +1 -1
- package/dist/endpoint-subjects.d.ts +4 -0
- package/dist/endpoint-subjects.d.ts.map +1 -1
- package/dist/endpoint-subjects.js +6 -0
- package/dist/endpoint-subjects.js.map +1 -1
- package/dist/endpoint-traits.d.ts.map +1 -1
- package/dist/endpoint-traits.js +3 -20
- package/dist/endpoint-traits.js.map +1 -1
- package/dist/endpoint-verbs.d.ts +18 -151
- package/dist/endpoint-verbs.d.ts.map +1 -1
- package/dist/endpoint-verbs.js +4 -500
- package/dist/endpoint-verbs.js.map +1 -1
- package/dist/endpoint-work.d.ts.map +1 -1
- package/dist/endpoint-work.js +2 -17
- package/dist/endpoint-work.js.map +1 -1
- package/dist/endpoint.d.ts +113 -24
- package/dist/endpoint.d.ts.map +1 -1
- package/dist/endpoint.js +330 -78
- package/dist/endpoint.js.map +1 -1
- package/dist/goal-result-fact.d.ts +13 -0
- package/dist/goal-result-fact.d.ts.map +1 -0
- package/dist/goal-result-fact.js +40 -0
- package/dist/goal-result-fact.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/issued-accepted.d.ts +27 -0
- package/dist/issued-accepted.d.ts.map +1 -0
- package/dist/issued-accepted.js +62 -0
- package/dist/issued-accepted.js.map +1 -0
- package/dist/issued-authority.d.ts +3 -18
- package/dist/issued-authority.d.ts.map +1 -1
- package/dist/issued-authority.js +4 -55
- package/dist/issued-authority.js.map +1 -1
- package/dist/jetstream-missing.d.ts +4 -0
- package/dist/jetstream-missing.d.ts.map +1 -1
- package/dist/jetstream-missing.js +6 -0
- package/dist/jetstream-missing.js.map +1 -1
- package/dist/kv-scan.d.ts +15 -0
- package/dist/kv-scan.d.ts.map +1 -1
- package/dist/kv-scan.js +32 -0
- package/dist/kv-scan.js.map +1 -1
- package/dist/launch-material.d.ts.map +1 -1
- package/dist/launch-material.js +6 -2
- package/dist/launch-material.js.map +1 -1
- package/dist/lease.d.ts +50 -0
- package/dist/lease.d.ts.map +1 -1
- package/dist/lease.js +71 -0
- package/dist/lease.js.map +1 -1
- package/dist/lifecycle-state.d.ts +3 -0
- package/dist/lifecycle-state.d.ts.map +1 -1
- package/dist/lifecycle-state.js +7 -0
- package/dist/lifecycle-state.js.map +1 -1
- package/dist/manager-caller.d.ts.map +1 -1
- package/dist/manager-caller.js +2 -1
- package/dist/manager-caller.js.map +1 -1
- package/dist/one-line.d.ts +6 -0
- package/dist/one-line.d.ts.map +1 -0
- package/dist/one-line.js +8 -0
- package/dist/one-line.js.map +1 -0
- package/dist/peer-label.d.ts +16 -0
- package/dist/peer-label.d.ts.map +1 -0
- package/dist/peer-label.js +15 -0
- package/dist/peer-label.js.map +1 -0
- package/dist/permission-denied.d.ts +8 -0
- package/dist/permission-denied.d.ts.map +1 -0
- package/dist/permission-denied.js +15 -0
- package/dist/permission-denied.js.map +1 -0
- package/dist/presence-text.d.ts +6 -0
- package/dist/presence-text.d.ts.map +1 -0
- package/dist/presence-text.js +25 -0
- package/dist/presence-text.js.map +1 -0
- package/dist/private-tool-results.d.ts +253 -0
- package/dist/private-tool-results.d.ts.map +1 -0
- package/dist/private-tool-results.js +141 -0
- package/dist/private-tool-results.js.map +1 -0
- package/dist/provision.d.ts +5 -0
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +40 -16
- package/dist/provision.js.map +1 -1
- package/dist/remote-manager-authority.d.ts +17 -0
- package/dist/remote-manager-authority.d.ts.map +1 -1
- package/dist/remote-manager-authority.js +40 -1
- package/dist/remote-manager-authority.js.map +1 -1
- package/dist/resolve.d.ts +2 -13
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +2 -12
- package/dist/resolve.js.map +1 -1
- package/dist/run-driver-grants.d.ts +5 -0
- package/dist/run-driver-grants.d.ts.map +1 -1
- package/dist/run-driver-grants.js +16 -4
- package/dist/run-driver-grants.js.map +1 -1
- package/dist/run-journal.d.ts.map +1 -1
- package/dist/run-journal.js +1 -6
- package/dist/run-journal.js.map +1 -1
- package/dist/run-migration.d.ts +21 -0
- package/dist/run-migration.d.ts.map +1 -1
- package/dist/run-migration.js +2 -27
- package/dist/run-migration.js.map +1 -1
- package/dist/run-notice.d.ts +20 -0
- package/dist/run-notice.d.ts.map +1 -1
- package/dist/run-notice.js +3 -28
- package/dist/run-notice.js.map +1 -1
- package/dist/schema-bounds.d.ts +24 -0
- package/dist/schema-bounds.d.ts.map +1 -0
- package/dist/schema-bounds.js +74 -0
- package/dist/schema-bounds.js.map +1 -0
- package/dist/schema-profile.d.ts +11 -24
- package/dist/schema-profile.d.ts.map +1 -1
- package/dist/schema-profile.js +16 -73
- package/dist/schema-profile.js.map +1 -1
- package/dist/subjects.d.ts +17 -0
- package/dist/subjects.d.ts.map +1 -1
- package/dist/subjects.js +30 -2
- package/dist/subjects.js.map +1 -1
- package/dist/turn-contract.d.ts.map +1 -1
- package/dist/turn-contract.js +14 -4
- package/dist/turn-contract.js.map +1 -1
- package/package.json +14 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build-time generator for `@cotal-ai/core/browser-control` (`@cotal-ai/core/browser-validators-build`).
|
|
3
|
+
* Node only: it runs Ajv's code generation at the host's build, so the page never does.
|
|
4
|
+
*
|
|
5
|
+
* Input: the cluster documents and schema roots of the endpoints a host will call, as data. Each
|
|
6
|
+
* cluster and closure digest is recomputed with THIS core's §13.7 profile, and a digest that does
|
|
7
|
+
* not match the recorded one refuses. Output: one ES module exporting `contracts`, a
|
|
8
|
+
* `BrowserContractSet` with one standalone validator per closure digest (`standaloneContractSource`,
|
|
9
|
+
* the same profile options as `compileContract`) and the cluster documents by cluster digest.
|
|
10
|
+
*/
|
|
11
|
+
import { parse } from "acorn";
|
|
12
|
+
import { singleDocumentClosure, standaloneContractSource } from "./schema-profile.js";
|
|
13
|
+
/** Ajv's standalone output still names its runtime helpers with `require`, even in ESM mode. Each
|
|
14
|
+
* `require("ajv/dist/runtime/<helper>").<name>` read is rewritten to an ESM namespace import. The
|
|
15
|
+
* check walks the parsed validator, so schema data in a string literal or a comment is never taken
|
|
16
|
+
* for code: any other reference to `require`, `eval` or `Function`, or a call of a member with one
|
|
17
|
+
* of those names, refuses. */
|
|
18
|
+
const RUNTIME_HELPERS = new Set(["ucs2length", "equal", "uri", "quote", "timestamp", "re2", "parseJson"]);
|
|
19
|
+
const RUNTIME_PREFIX = "ajv/dist/runtime/";
|
|
20
|
+
const EXECUTABLE = new Set(["require", "eval", "Function"]);
|
|
21
|
+
const HEADER = /^"use strict";\s*export const validate = (\w+);\s*export default \1;/;
|
|
22
|
+
const PROLOGUE = '(() => {\n"use strict";\n';
|
|
23
|
+
const isNode = (value) => typeof value === "object" && value !== null && typeof value.type === "string";
|
|
24
|
+
/** The name a callee reads: `x`, `o.x` and `o["x"]` all name `x`. */
|
|
25
|
+
function calleeName(node) {
|
|
26
|
+
if (node.type === "Identifier")
|
|
27
|
+
return node.name;
|
|
28
|
+
if (node.type !== "MemberExpression")
|
|
29
|
+
return undefined;
|
|
30
|
+
const property = node.property;
|
|
31
|
+
if (!node.computed)
|
|
32
|
+
return property.type === "Identifier" ? property.name : undefined;
|
|
33
|
+
return property.type === "Literal" && typeof property.value === "string" ? property.value : undefined;
|
|
34
|
+
}
|
|
35
|
+
/** `require("ajv/dist/runtime/<helper>").<name>` with a known helper, as that helper and name. */
|
|
36
|
+
function runtimeHelper(node) {
|
|
37
|
+
if (node.type !== "MemberExpression" || node.computed || node.optional)
|
|
38
|
+
return undefined;
|
|
39
|
+
const call = node.object;
|
|
40
|
+
const property = node.property;
|
|
41
|
+
if (call.type !== "CallExpression" || call.optional || property.type !== "Identifier")
|
|
42
|
+
return undefined;
|
|
43
|
+
const callee = call.callee;
|
|
44
|
+
const args = call.arguments;
|
|
45
|
+
const spec = args[0];
|
|
46
|
+
if (callee.type !== "Identifier" || callee.name !== "require" || args.length !== 1 || spec?.type !== "Literal")
|
|
47
|
+
return undefined;
|
|
48
|
+
if (typeof spec.value !== "string" || !spec.value.startsWith(RUNTIME_PREFIX))
|
|
49
|
+
return undefined;
|
|
50
|
+
const helper = spec.value.slice(RUNTIME_PREFIX.length);
|
|
51
|
+
return RUNTIME_HELPERS.has(helper) ? { helper, name: property.name } : undefined;
|
|
52
|
+
}
|
|
53
|
+
function collectHelperReads(node, digest, reads) {
|
|
54
|
+
const read = runtimeHelper(node);
|
|
55
|
+
if (read) {
|
|
56
|
+
reads.push({ start: node.start, end: node.end, ...read });
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const callee = node.type === "CallExpression" || node.type === "NewExpression" ? node.callee
|
|
60
|
+
: node.type === "TaggedTemplateExpression" ? node.tag
|
|
61
|
+
: undefined;
|
|
62
|
+
const called = callee && calleeName(callee);
|
|
63
|
+
if ((node.type === "Identifier" && EXECUTABLE.has(node.name)) || (called !== undefined && EXECUTABLE.has(called)))
|
|
64
|
+
throw new Error(`closure ${digest}: standalone output still needs require or runtime evaluation`);
|
|
65
|
+
for (const [key, value] of Object.entries(node)) {
|
|
66
|
+
// A property name is not a reference: `data.eval` reads the field a schema calls "eval".
|
|
67
|
+
if (!node.computed && ((node.type === "MemberExpression" && key === "property") || (node.type === "Property" && key === "key")))
|
|
68
|
+
continue;
|
|
69
|
+
for (const child of Array.isArray(value) ? value : [value])
|
|
70
|
+
if (isNode(child))
|
|
71
|
+
collectHelperReads(child, digest, reads);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function validatorBody(source, digest, helpers) {
|
|
75
|
+
const head = HEADER.exec(source);
|
|
76
|
+
if (!head)
|
|
77
|
+
throw new Error(`closure ${digest}: unexpected standalone output shape`);
|
|
78
|
+
const body = source.slice(head[0].length);
|
|
79
|
+
const epilogue = `\nreturn ${head[1]};\n})()`;
|
|
80
|
+
let program;
|
|
81
|
+
try {
|
|
82
|
+
program = parse(PROLOGUE + body + epilogue, { ecmaVersion: "latest", sourceType: "script" });
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
throw new Error(`closure ${digest}: standalone output does not parse: ${error.message}`);
|
|
86
|
+
}
|
|
87
|
+
const reads = [];
|
|
88
|
+
collectHelperReads(program, digest, reads);
|
|
89
|
+
let rewritten = body;
|
|
90
|
+
for (const { start, end, helper, name } of reads.sort((a, b) => b.start - a.start)) {
|
|
91
|
+
helpers.add(helper);
|
|
92
|
+
rewritten = `${rewritten.slice(0, start - PROLOGUE.length)}__rt(__rt_${helper}, ${JSON.stringify(name)})${rewritten.slice(end - PROLOGUE.length)}`;
|
|
93
|
+
}
|
|
94
|
+
return PROLOGUE + rewritten + epilogue;
|
|
95
|
+
}
|
|
96
|
+
/** The generated module text, and how many clusters and closures it carries. */
|
|
97
|
+
export function generateBrowserContracts(sources) {
|
|
98
|
+
if (sources.length === 0)
|
|
99
|
+
throw new Error("no contract sources");
|
|
100
|
+
const clusters = new Map();
|
|
101
|
+
const roots = new Map();
|
|
102
|
+
for (const src of sources) {
|
|
103
|
+
const clusterDigest = singleDocumentClosure(src.document).closureDigest;
|
|
104
|
+
if (clusterDigest !== src.clusterDigest)
|
|
105
|
+
throw new Error(`${src.label}: cluster document recomputes to ${clusterDigest}, the source recorded ${src.clusterDigest}`);
|
|
106
|
+
for (const root of src.roots)
|
|
107
|
+
roots.set(singleDocumentClosure(root).closureDigest, root);
|
|
108
|
+
for (const command of src.document.commands)
|
|
109
|
+
for (const digest of [command.inputDigest, command.outputDigest])
|
|
110
|
+
if (!roots.has(digest))
|
|
111
|
+
throw new Error(`${src.label}: ${command.name} names closure ${digest} with no schema root`);
|
|
112
|
+
const seen = clusters.get(clusterDigest);
|
|
113
|
+
if (seen)
|
|
114
|
+
seen.labels.push(src.label);
|
|
115
|
+
else
|
|
116
|
+
clusters.set(clusterDigest, { labels: [src.label], document: src.document });
|
|
117
|
+
}
|
|
118
|
+
const helpers = new Set();
|
|
119
|
+
const validators = [];
|
|
120
|
+
for (const [digest, root] of [...roots].sort(([a], [b]) => a.localeCompare(b))) {
|
|
121
|
+
const { closureDigest, source } = standaloneContractSource({ root });
|
|
122
|
+
if (closureDigest !== digest)
|
|
123
|
+
throw new Error(`closure ${digest} compiles as ${closureDigest}`);
|
|
124
|
+
validators.push(` ${JSON.stringify(digest)}: ${validatorBody(source, digest, helpers)},`);
|
|
125
|
+
}
|
|
126
|
+
const imports = [...helpers].sort().map((m) => `import * as __rt_${m} from "ajv/dist/runtime/${m}.js";`);
|
|
127
|
+
const clusterRows = [...clusters].sort(([a], [b]) => a.localeCompare(b))
|
|
128
|
+
.map(([digest, c]) => ` ${JSON.stringify(digest)}: ${JSON.stringify({ sources: c.labels, ...c.document })},`);
|
|
129
|
+
const text = [
|
|
130
|
+
"// @ts-nocheck",
|
|
131
|
+
"// GENERATED by @cotal-ai/core/browser-validators-build. Do not edit; regenerate from the contract sources.",
|
|
132
|
+
...imports,
|
|
133
|
+
"/** An Ajv runtime helper from a CommonJS module, whichever way the importer exposes its exports. */",
|
|
134
|
+
"const __rt = (ns, name) => {",
|
|
135
|
+
" const exports = ns.default !== null && typeof ns.default === \"object\" && name in ns.default ? ns.default : ns;",
|
|
136
|
+
" const value = exports[name];",
|
|
137
|
+
" if (typeof value !== \"function\") throw new Error(`ajv runtime helper ${name} is not a function`);",
|
|
138
|
+
" return value;",
|
|
139
|
+
"};",
|
|
140
|
+
"export const contracts = Object.freeze({ validators: Object.freeze({",
|
|
141
|
+
...validators,
|
|
142
|
+
"}), clusters: Object.freeze({",
|
|
143
|
+
...clusterRows,
|
|
144
|
+
"}) });",
|
|
145
|
+
"",
|
|
146
|
+
].join("\n");
|
|
147
|
+
return { text, clusters: clusters.size, closures: roots.size };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=browser-validators-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-validators-build.js","sourceRoot":"","sources":["../src/browser-validators-build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Digest identity form used everywhere a contract artifact is referenced: `sha256:<hex>`. */
|
|
2
|
+
export declare const DIGEST_PREFIX: "sha256:";
|
|
3
|
+
/** True iff `s` is a well-formed `sha256:<hex>` artifact digest. */
|
|
4
|
+
export declare function isContractDigest(s: string): boolean;
|
|
5
|
+
/** True iff the string is well-formed UTF-16 (no unpaired surrogate). A lone surrogate has NO
|
|
6
|
+
* UTF-8 byte encoding — encoders silently substitute U+FFFD, so two distinct malformed strings
|
|
7
|
+
* can collapse to one byte sequence; anything digest- or wire-bound must refuse them. */
|
|
8
|
+
export declare function isWellFormedUnicode(s: string): boolean;
|
|
9
|
+
/** True iff the string contains an unpaired UTF-16 surrogate (not well-formed / I-JSON
|
|
10
|
+
* violation). Manual scan: the repo's TS lib target predates `String#isWellFormed`. */
|
|
11
|
+
export declare function hasLoneSurrogate(s: string): boolean;
|
|
12
|
+
/** RFC 8785 canonical JSON text of a value (strict: I-JSON enforced, no undefined→null). */
|
|
13
|
+
export declare function canonicalJson(value: unknown): string;
|
|
14
|
+
//# sourceMappingURL=canonical-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-json.d.ts","sourceRoot":"","sources":["../src/canonical-json.ts"],"names":[],"mappings":"AAGA,8FAA8F;AAC9F,eAAO,MAAM,aAAa,EAAG,SAAkB,CAAC;AAGhD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;0FAE0F;AAC1F,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;wFACwF;AACxF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAYnD;AAkFD,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/** The node-free half of `canonical.ts`: digest grammar and RFC 8785 canonical JSON. */
|
|
2
|
+
import { canonicalizeEx } from "json-canonicalize";
|
|
3
|
+
/** Digest identity form used everywhere a contract artifact is referenced: `sha256:<hex>`. */
|
|
4
|
+
export const DIGEST_PREFIX = "sha256:";
|
|
5
|
+
const DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
|
|
6
|
+
/** True iff `s` is a well-formed `sha256:<hex>` artifact digest. */
|
|
7
|
+
export function isContractDigest(s) {
|
|
8
|
+
return DIGEST_RE.test(s);
|
|
9
|
+
}
|
|
10
|
+
/** True iff the string is well-formed UTF-16 (no unpaired surrogate). A lone surrogate has NO
|
|
11
|
+
* UTF-8 byte encoding — encoders silently substitute U+FFFD, so two distinct malformed strings
|
|
12
|
+
* can collapse to one byte sequence; anything digest- or wire-bound must refuse them. */
|
|
13
|
+
export function isWellFormedUnicode(s) {
|
|
14
|
+
return !hasLoneSurrogate(s);
|
|
15
|
+
}
|
|
16
|
+
/** True iff the string contains an unpaired UTF-16 surrogate (not well-formed / I-JSON
|
|
17
|
+
* violation). Manual scan: the repo's TS lib target predates `String#isWellFormed`. */
|
|
18
|
+
export function hasLoneSurrogate(s) {
|
|
19
|
+
for (let i = 0; i < s.length; i++) {
|
|
20
|
+
const c = s.charCodeAt(i);
|
|
21
|
+
if (c >= 0xd800 && c <= 0xdbff) {
|
|
22
|
+
const n = s.charCodeAt(i + 1);
|
|
23
|
+
if (!(n >= 0xdc00 && n <= 0xdfff))
|
|
24
|
+
return true;
|
|
25
|
+
i++; // well-formed pair; skip the low half
|
|
26
|
+
}
|
|
27
|
+
else if (c >= 0xdc00 && c <= 0xdfff) {
|
|
28
|
+
return true; // low surrogate with no preceding high half
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
/** Walk a JSON value once and return a plain copy of what the walk read, throwing on anything
|
|
34
|
+
* that cannot canonicalize EXACTLY (D28: verification and digesting must never run over a
|
|
35
|
+
* normalizing projection):
|
|
36
|
+
* - strings that are not well-formed UTF-16 (a lone surrogate violates I-JSON; canonicalizing
|
|
37
|
+
* it would mint a digest for text that cannot interchange), in values AND keys;
|
|
38
|
+
* - `undefined` anywhere and non-finite numbers (RFC 8785 cannot represent them);
|
|
39
|
+
* - NON-PLAIN-DATA graphs. `Object.entries` sees only enumerable string-keyed own data props,
|
|
40
|
+
* and the canonicalizer applies `toJSON`, so a symbol-keyed or non-enumerable own property,
|
|
41
|
+
* an accessor, or a class/exotic instance (Date → ISO string, Map → `{}`) would be SILENTLY
|
|
42
|
+
* projected away or rewritten — the exact field-dropping class D28 forbids (an artifact
|
|
43
|
+
* carrying state its signature never covered must refuse, not launder through the
|
|
44
|
+
* projection). Objects must be ordinary with a `null`/`Object.prototype` prototype and only
|
|
45
|
+
* enumerable string-keyed own DATA properties; arrays must be ordinary `Array.prototype`
|
|
46
|
+
* arrays with no holes and no extra own properties.
|
|
47
|
+
* The serializer gets the copy, never the input, and each copied value is the one in the
|
|
48
|
+
* descriptor the check inspected: a Proxy can answer a second read, or `toJSON`, differently,
|
|
49
|
+
* and the text must encode only data that was checked. */
|
|
50
|
+
function interchangeableCopy(v, path) {
|
|
51
|
+
if (v === null)
|
|
52
|
+
return null;
|
|
53
|
+
switch (typeof v) {
|
|
54
|
+
case "string":
|
|
55
|
+
if (hasLoneSurrogate(v))
|
|
56
|
+
throw new Error(`canonicalJson: lone surrogate in string at ${path} (I-JSON violation)`);
|
|
57
|
+
return v;
|
|
58
|
+
case "number":
|
|
59
|
+
if (!Number.isFinite(v))
|
|
60
|
+
throw new Error(`canonicalJson: non-finite number at ${path}`);
|
|
61
|
+
return v;
|
|
62
|
+
case "boolean":
|
|
63
|
+
return v;
|
|
64
|
+
case "undefined":
|
|
65
|
+
throw new Error(`canonicalJson: undefined at ${path} (strict mode never coerces to null)`);
|
|
66
|
+
case "object": {
|
|
67
|
+
if (Array.isArray(v)) {
|
|
68
|
+
if (Object.getPrototypeOf(v) !== Array.prototype)
|
|
69
|
+
throw new Error(`canonicalJson: non-ordinary array at ${path} (a subclassed/exotic array canonicalizes through projections)`);
|
|
70
|
+
// One read of `length`, from its descriptor, bounds both the index check and the copy. A
|
|
71
|
+
// second read could add an element no index check covered or drop one the check accepted.
|
|
72
|
+
const length = Object.getOwnPropertyDescriptor(v, "length")?.value;
|
|
73
|
+
if (typeof length !== "number" || !Number.isInteger(length) || length < 0)
|
|
74
|
+
throw new Error(`canonicalJson: invalid array length at ${path} (refusing the projection)`);
|
|
75
|
+
for (const k of Reflect.ownKeys(v)) {
|
|
76
|
+
if (typeof k !== "string")
|
|
77
|
+
throw new Error(`canonicalJson: symbol-keyed own property on array at ${path} (invisible to canonicalization; refusing the projection)`);
|
|
78
|
+
if (k === "length")
|
|
79
|
+
continue;
|
|
80
|
+
if (!/^(0|[1-9][0-9]*)$/.test(k) || Number(k) >= length)
|
|
81
|
+
throw new Error(`canonicalJson: non-index own property "${k}" on array at ${path} (invisible to canonicalization; refusing the projection)`);
|
|
82
|
+
}
|
|
83
|
+
const copy = [];
|
|
84
|
+
for (let i = 0; i < length; i++) {
|
|
85
|
+
const d = Object.getOwnPropertyDescriptor(v, i);
|
|
86
|
+
if (d === undefined)
|
|
87
|
+
throw new Error(`canonicalJson: hole at ${path}[${i}] (a hole would be coerced to null; refusing the projection)`);
|
|
88
|
+
if (!d.enumerable || d.get !== undefined || d.set !== undefined)
|
|
89
|
+
throw new Error(`canonicalJson: non-enumerable or accessor element at ${path}[${i}] (refusing the projection)`);
|
|
90
|
+
copy.push(interchangeableCopy(d.value, `${path}[${i}]`));
|
|
91
|
+
}
|
|
92
|
+
return copy;
|
|
93
|
+
}
|
|
94
|
+
const proto = Object.getPrototypeOf(v);
|
|
95
|
+
if (proto !== Object.prototype && proto !== null)
|
|
96
|
+
throw new Error(`canonicalJson: non-plain object at ${path} (a class/exotic instance canonicalizes through projections like toJSON; only plain data objects are interchangeable)`);
|
|
97
|
+
// A null prototype keeps an own `__proto__` key a key instead of a prototype assignment.
|
|
98
|
+
const copy = Object.create(null);
|
|
99
|
+
for (const k of Reflect.ownKeys(v)) {
|
|
100
|
+
if (typeof k !== "string")
|
|
101
|
+
throw new Error(`canonicalJson: symbol-keyed own property at ${path} (invisible to canonicalization; refusing the projection)`);
|
|
102
|
+
if (hasLoneSurrogate(k))
|
|
103
|
+
throw new Error(`canonicalJson: lone surrogate in key at ${path}.${k}`);
|
|
104
|
+
const d = Object.getOwnPropertyDescriptor(v, k);
|
|
105
|
+
if (!d.enumerable)
|
|
106
|
+
throw new Error(`canonicalJson: non-enumerable own property "${k}" at ${path} (invisible to canonicalization; refusing the projection)`);
|
|
107
|
+
if (d.get !== undefined || d.set !== undefined)
|
|
108
|
+
throw new Error(`canonicalJson: accessor property "${k}" at ${path} (a getter is code, not data; refusing the projection)`);
|
|
109
|
+
copy[k] = interchangeableCopy(d.value, `${path}.${k}`);
|
|
110
|
+
}
|
|
111
|
+
return copy;
|
|
112
|
+
}
|
|
113
|
+
default:
|
|
114
|
+
throw new Error(`canonicalJson: unsupported ${typeof v} at ${path}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** RFC 8785 canonical JSON text of a value (strict: I-JSON enforced, no undefined→null). */
|
|
118
|
+
export function canonicalJson(value) {
|
|
119
|
+
return canonicalizeEx(interchangeableCopy(value, "$"), { undefinedInArrayToNull: false });
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=canonical-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../src/canonical-json.ts"],"names":[],"mappings":"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"}
|
package/dist/canonical.d.ts
CHANGED
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
/** True iff `s` is a well-formed `sha256:<hex>` artifact digest. */
|
|
4
|
-
export declare function isContractDigest(s: string): boolean;
|
|
5
|
-
/** True iff the string is well-formed UTF-16 (no unpaired surrogate). A lone surrogate has NO
|
|
6
|
-
* UTF-8 byte encoding — encoders silently substitute U+FFFD, so two distinct malformed strings
|
|
7
|
-
* can collapse to one byte sequence; anything digest- or wire-bound must refuse them. */
|
|
8
|
-
export declare function isWellFormedUnicode(s: string): boolean;
|
|
9
|
-
/** RFC 8785 canonical JSON text of a value (strict: I-JSON enforced, no undefined→null). */
|
|
10
|
-
export declare function canonicalJson(value: unknown): string;
|
|
1
|
+
import { DIGEST_PREFIX, canonicalJson, isContractDigest, isWellFormedUnicode } from "./canonical-json.js";
|
|
2
|
+
export { DIGEST_PREFIX, canonicalJson, isContractDigest, isWellFormedUnicode };
|
|
11
3
|
/** Content address of a contract artifact: `sha256:<hex>` over its RFC 8785 form (SPEC §13.7). */
|
|
12
4
|
export declare function contractDigest(value: unknown): string;
|
|
13
5
|
/** `sha256:<hex>` over RAW bytes (a string digests as its UTF-8 encoding), NEVER re-canonicalized:
|
package/dist/canonical.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAoB,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE5H,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;AAE/E,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAErD;AAED;;;;;qEAKqE;AACrE,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAS3D;AAED;;;;;;;;;;0CAU0C;AAC1C,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAK5E;AAED;;;8DAG8D;AAC9D,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAWzE"}
|
package/dist/canonical.js
CHANGED
|
@@ -8,114 +8,8 @@
|
|
|
8
8
|
* error, not data, and MUST NOT silently become `null`.
|
|
9
9
|
*/
|
|
10
10
|
import { createHash } from "node:crypto";
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
export const DIGEST_PREFIX = "sha256:";
|
|
14
|
-
const DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
|
|
15
|
-
/** True iff `s` is a well-formed `sha256:<hex>` artifact digest. */
|
|
16
|
-
export function isContractDigest(s) {
|
|
17
|
-
return DIGEST_RE.test(s);
|
|
18
|
-
}
|
|
19
|
-
/** True iff the string is well-formed UTF-16 (no unpaired surrogate). A lone surrogate has NO
|
|
20
|
-
* UTF-8 byte encoding — encoders silently substitute U+FFFD, so two distinct malformed strings
|
|
21
|
-
* can collapse to one byte sequence; anything digest- or wire-bound must refuse them. */
|
|
22
|
-
export function isWellFormedUnicode(s) {
|
|
23
|
-
return !hasLoneSurrogate(s);
|
|
24
|
-
}
|
|
25
|
-
/** True iff the string contains an unpaired UTF-16 surrogate (not well-formed / I-JSON
|
|
26
|
-
* violation). Manual scan: the repo's TS lib target predates `String#isWellFormed`. */
|
|
27
|
-
function hasLoneSurrogate(s) {
|
|
28
|
-
for (let i = 0; i < s.length; i++) {
|
|
29
|
-
const c = s.charCodeAt(i);
|
|
30
|
-
if (c >= 0xd800 && c <= 0xdbff) {
|
|
31
|
-
const n = s.charCodeAt(i + 1);
|
|
32
|
-
if (!(n >= 0xdc00 && n <= 0xdfff))
|
|
33
|
-
return true;
|
|
34
|
-
i++; // well-formed pair; skip the low half
|
|
35
|
-
}
|
|
36
|
-
else if (c >= 0xdc00 && c <= 0xdfff) {
|
|
37
|
-
return true; // low surrogate with no preceding high half
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
/** Walk a JSON value and throw on anything that cannot canonicalize EXACTLY (D28: verification
|
|
43
|
-
* and digesting must never run over a normalizing projection):
|
|
44
|
-
* - strings that are not well-formed UTF-16 (a lone surrogate violates I-JSON; canonicalizing
|
|
45
|
-
* it would mint a digest for text that cannot interchange), in values AND keys;
|
|
46
|
-
* - `undefined` anywhere and non-finite numbers (RFC 8785 cannot represent them);
|
|
47
|
-
* - NON-PLAIN-DATA graphs. `Object.entries` sees only enumerable string-keyed own data props,
|
|
48
|
-
* and the canonicalizer applies `toJSON`, so a symbol-keyed or non-enumerable own property,
|
|
49
|
-
* an accessor, or a class/exotic instance (Date → ISO string, Map → `{}`) would be SILENTLY
|
|
50
|
-
* projected away or rewritten — the exact field-dropping class D28 forbids (an artifact
|
|
51
|
-
* carrying state its signature never covered must refuse, not launder through the
|
|
52
|
-
* projection). Objects must be ordinary with a `null`/`Object.prototype` prototype and only
|
|
53
|
-
* enumerable string-keyed own DATA properties; arrays must be ordinary `Array.prototype`
|
|
54
|
-
* arrays with no holes and no extra own properties. */
|
|
55
|
-
function assertInterchangeable(v, path) {
|
|
56
|
-
if (v === null)
|
|
57
|
-
return;
|
|
58
|
-
switch (typeof v) {
|
|
59
|
-
case "string":
|
|
60
|
-
if (hasLoneSurrogate(v))
|
|
61
|
-
throw new Error(`canonicalJson: lone surrogate in string at ${path} (I-JSON violation)`);
|
|
62
|
-
return;
|
|
63
|
-
case "number":
|
|
64
|
-
if (!Number.isFinite(v))
|
|
65
|
-
throw new Error(`canonicalJson: non-finite number at ${path}`);
|
|
66
|
-
return;
|
|
67
|
-
case "boolean":
|
|
68
|
-
return;
|
|
69
|
-
case "undefined":
|
|
70
|
-
throw new Error(`canonicalJson: undefined at ${path} (strict mode never coerces to null)`);
|
|
71
|
-
case "object": {
|
|
72
|
-
if (Array.isArray(v)) {
|
|
73
|
-
if (Object.getPrototypeOf(v) !== Array.prototype)
|
|
74
|
-
throw new Error(`canonicalJson: non-ordinary array at ${path} (a subclassed/exotic array canonicalizes through projections)`);
|
|
75
|
-
for (const k of Reflect.ownKeys(v)) {
|
|
76
|
-
if (typeof k !== "string")
|
|
77
|
-
throw new Error(`canonicalJson: symbol-keyed own property on array at ${path} (invisible to canonicalization; refusing the projection)`);
|
|
78
|
-
if (k === "length")
|
|
79
|
-
continue;
|
|
80
|
-
if (!/^(0|[1-9][0-9]*)$/.test(k) || Number(k) >= v.length)
|
|
81
|
-
throw new Error(`canonicalJson: non-index own property "${k}" on array at ${path} (invisible to canonicalization; refusing the projection)`);
|
|
82
|
-
}
|
|
83
|
-
for (let i = 0; i < v.length; i++) {
|
|
84
|
-
const d = Object.getOwnPropertyDescriptor(v, i);
|
|
85
|
-
if (d === undefined)
|
|
86
|
-
throw new Error(`canonicalJson: hole at ${path}[${i}] (a hole would be coerced to null; refusing the projection)`);
|
|
87
|
-
if (!d.enumerable || d.get !== undefined || d.set !== undefined)
|
|
88
|
-
throw new Error(`canonicalJson: non-enumerable or accessor element at ${path}[${i}] (refusing the projection)`);
|
|
89
|
-
assertInterchangeable(v[i], `${path}[${i}]`);
|
|
90
|
-
}
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const proto = Object.getPrototypeOf(v);
|
|
94
|
-
if (proto !== Object.prototype && proto !== null)
|
|
95
|
-
throw new Error(`canonicalJson: non-plain object at ${path} (a class/exotic instance canonicalizes through projections like toJSON; only plain data objects are interchangeable)`);
|
|
96
|
-
for (const k of Reflect.ownKeys(v)) {
|
|
97
|
-
if (typeof k !== "string")
|
|
98
|
-
throw new Error(`canonicalJson: symbol-keyed own property at ${path} (invisible to canonicalization; refusing the projection)`);
|
|
99
|
-
if (hasLoneSurrogate(k))
|
|
100
|
-
throw new Error(`canonicalJson: lone surrogate in key at ${path}.${k}`);
|
|
101
|
-
const d = Object.getOwnPropertyDescriptor(v, k);
|
|
102
|
-
if (!d.enumerable)
|
|
103
|
-
throw new Error(`canonicalJson: non-enumerable own property "${k}" at ${path} (invisible to canonicalization; refusing the projection)`);
|
|
104
|
-
if (d.get !== undefined || d.set !== undefined)
|
|
105
|
-
throw new Error(`canonicalJson: accessor property "${k}" at ${path} (a getter is code, not data; refusing the projection)`);
|
|
106
|
-
assertInterchangeable(v[k], `${path}.${k}`);
|
|
107
|
-
}
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
default:
|
|
111
|
-
throw new Error(`canonicalJson: unsupported ${typeof v} at ${path}`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/** RFC 8785 canonical JSON text of a value (strict: I-JSON enforced, no undefined→null). */
|
|
115
|
-
export function canonicalJson(value) {
|
|
116
|
-
assertInterchangeable(value, "$");
|
|
117
|
-
return canonicalizeEx(value, { undefinedInArrayToNull: false });
|
|
118
|
-
}
|
|
11
|
+
import { DIGEST_PREFIX, canonicalJson, hasLoneSurrogate, isContractDigest, isWellFormedUnicode } from "./canonical-json.js";
|
|
12
|
+
export { DIGEST_PREFIX, canonicalJson, isContractDigest, isWellFormedUnicode };
|
|
119
13
|
/** Content address of a contract artifact: `sha256:<hex>` over its RFC 8785 form (SPEC §13.7). */
|
|
120
14
|
export function contractDigest(value) {
|
|
121
15
|
return DIGEST_PREFIX + createHash("sha256").update(canonicalJson(value), "utf8").digest("hex");
|
package/dist/canonical.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE5H,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;AAE/E,kGAAkG;AAClG,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjG,CAAC;AAED;;;;;qEAKqE;AACrE,MAAM,UAAU,SAAS,CAAC,IAAyB;IACjD,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,gBAAgB,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qHAAqH,CAAC,CAAC;QACnK,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;;0CAU0C;AAC1C,MAAM,UAAU,cAAc,CAAC,KAAiB,EAAE,MAAc;IAC9D,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7G,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,CAAC,UAAU,sBAAsB,MAAM,gBAAgB,MAAM,EAAE,CAAC,CAAC;IACrJ,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;8DAG8D;AAC9D,MAAM,UAAU,cAAc,CAAC,KAAiB,EAAE,MAAc;IAC9D,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7G,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,6BAA8B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7G,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,MAAM,gBAAgB,MAAM,EAAE,CAAC,CAAC;IACtH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/channels.d.ts
CHANGED
|
@@ -114,5 +114,9 @@ export declare function readChannelRegistry(opts: {
|
|
|
114
114
|
* world-readable in-space, so no elevated view is needed for the read side. */
|
|
115
115
|
bearer?: string;
|
|
116
116
|
sentinelCreds?: string;
|
|
117
|
+
/** Read with one batched Direct Get ({@link lastKvEntries}) and bind no consumer. For a credential
|
|
118
|
+
* that holds the bare `$JS.API.DIRECT.GET` row on the registry stream (the `operator` profile) and
|
|
119
|
+
* no CONSUMER.DELETE there: the default scan's consumer outlives the read by five minutes (#4091). */
|
|
120
|
+
directGet?: boolean;
|
|
117
121
|
}): Promise<ChannelRegistryFile>;
|
|
118
122
|
//# sourceMappingURL=channels.d.ts.map
|
package/dist/channels.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAO,KAAK,EAAE,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhF,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC1C;AAED;iFACiF;AACjF,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C;;qBAEqB;AACrB,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAI9D;AAQD;;sDAEsD;AACtD,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI,CAMhE;AAED;;;iFAGiF;AACjF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,GAAG,aAAa,GAAG,eAAe,CAO9E;AAED;8EAC8E;AAC9E,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;8EAC8E;AAC9E,wBAAgB,eAAe,CAC7B,GAAG,EAAE,aAAa,GAAG,SAAS,EAC9B,QAAQ,EAAE,eAAe,GAAG,SAAS,GACpC,OAAO,CAET;AAED;8EAC8E;AAC9E,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,aAAa,GAAG,SAAS,EAC9B,QAAQ,EAAE,eAAe,GAAG,SAAS,GACpC,MAAM,GAAG,SAAS,CAGpB;AAED;;;;8CAI8C;AAC9C,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,aAAa,GAAG,SAAS,EAC9B,QAAQ,EAAE,eAAe,GAAG,SAAS,GACpC,aAAa,CAEf;AAED;;wFAEwF;AACxF,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9B,OAAO,CAAC,EAAE,CAAC,CAGb;AAED,iEAAiE;AACjE,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAEpC;AAED,4DAA4D;AAC5D,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAEtF;AAED;gFACgF;AAChF,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;wFACwF;AACxF,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxF;AAYD;;;iGAGiG;AACjG,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,mBAAmB,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAahB;AAED;;;;;mGAKmG;AACnG,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;CAC9B,GAAG,OAAO,CAAC,OAAO,CAAC,CAUnB;AAED;;;;iDAIiD;AACjD,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhB;AAED;;qCAEqC;AACrC,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;oFACgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"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"}
|
package/dist/channels.js
CHANGED
|
@@ -12,7 +12,7 @@ import {} from "@nats-io/transport-node";
|
|
|
12
12
|
import { dialerFor } from "./endpoint.js";
|
|
13
13
|
import { channelBucket, CHANNEL_DEFAULTS_KEY } from "./subjects.js";
|
|
14
14
|
import { standaloneConnectOpts } from "./streams.js";
|
|
15
|
-
import { liveKvEntries } from "./kv-scan.js";
|
|
15
|
+
import { lastKvEntries, liveKvEntries } from "./kv-scan.js";
|
|
16
16
|
/** Length caps on the model-facing registry text — unbounded text would stuff every agent's
|
|
17
17
|
* context and bloat the KV, so a write past these throws rather than clamps. */
|
|
18
18
|
export const MAX_CHANNEL_DESCRIPTION = 200;
|
|
@@ -196,7 +196,11 @@ export async function readChannelRegistry(opts) {
|
|
|
196
196
|
let defaults;
|
|
197
197
|
try {
|
|
198
198
|
// ONE pass: this was a `keys()` scan plus a per-key `get()`, so one round trip per channel.
|
|
199
|
-
|
|
199
|
+
// A Direct Get to a missing stream has no responder, so its 404 comes from STREAM.INFO first.
|
|
200
|
+
const entries = opts.directGet
|
|
201
|
+
? (await kv.status(), (await lastKvEntries(kv)).filter((e) => e.operation !== "DEL" && e.operation !== "PURGE"))
|
|
202
|
+
: await liveKvEntries(kv);
|
|
203
|
+
for (const e of entries) {
|
|
200
204
|
if (e.key === CHANNEL_DEFAULTS_KEY) {
|
|
201
205
|
try {
|
|
202
206
|
defaults = decodeChannelEntry(e);
|
package/dist/channels.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,GAAG,EAAyB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAuB,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,GAAG,EAAyB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAuB,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAS5D;iFACiF;AACjF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C;;qBAEqB;AACrB,MAAM,UAAU,qBAAqB,CAAC,GAAkB;IACtD,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC7B,YAAY,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;IACtE,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,IAAwB,EAAE,GAAW;IACxE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,mBAAmB,CAAC,CAAC;IACnF,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,cAAc,IAAI,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;AACtG,CAAC;AAED;;sDAEsD;AACtD,MAAM,UAAU,uBAAuB,CAAC,CAAkB;IACxD,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS;QACzD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,MAAM,4BAA4B,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS;QAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,wBAAwB;IACzF,IAAI,CAAC,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,aAAa,KAAK,MAAM,IAAI,CAAC,CAAC,aAAa,KAAK,SAAS;QAC9F,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,aAAa,kCAAkC,CAAC,CAAC;AACjG,CAAC;AAED;;;iFAGiF;AACjF,MAAM,UAAU,kBAAkB,CAAC,CAAU;IAC3C,MAAM,KAAK,GAAY,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC,GAAG,KAAK,oBAAoB;QAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC;;QAC9D,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;8EAC8E;AAC9E,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,4CAA4C,CAAC,CAAC;IAC5F,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAA0B,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,IAAI,CAAC;AAClB,CAAC;AAED;8EAC8E;AAC9E,MAAM,UAAU,eAAe,CAC7B,GAA8B,EAC9B,QAAqC;IAErC,OAAO,GAAG,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,IAAI,IAAI,CAAC;AACjD,CAAC;AAED;8EAC8E;AAC9E,MAAM,UAAU,uBAAuB,CACrC,GAA8B,EAC9B,QAAqC;IAErC,MAAM,CAAC,GAAG,GAAG,EAAE,YAAY,IAAI,QAAQ,EAAE,YAAY,CAAC;IACtD,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;8CAI8C;AAC9C,MAAM,UAAU,sBAAsB,CACpC,GAA8B,EAC9B,QAAqC;IAErC,OAAO,GAAG,EAAE,aAAa,IAAI,QAAQ,EAAE,aAAa,IAAI,SAAS,CAAC;AACpE,CAAC;AAED;;wFAEwF;AACxF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAkB,EAClB,KAAa,EACb,OAA6B,EAAE;IAE/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAM,EACN,OAAe;IAEf,OAAO,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAM;IAC9C,OAAO,MAAM,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;AAC1C,CAAC;AAED;gFACgF;AAChF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAM,EACN,OAAe,EACf,KAAoB;IAEpB,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAkB,EAAE,GAAG,CAAC,MAAM,iBAAiB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;IACtF,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;wFACwF;AACxF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,EAAM,EAAE,KAAsB;IACvE,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAoB,EAAE,GAAG,CAAC,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;IACjF,MAAM,EAAE,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,EAAM,EAAE,GAAW;IACvC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,CAAC,SAAS,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAC7E,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;iGAGiG;AACjG,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAQzC;IACC,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,qBAAqB,CAAC,EAAE,GAAG,IAAI,EAAE,8EAA8E,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACtM,IAAI,CAAC;QACH,oHAAoH;QACpH,0FAA0F;QAC1F,uEAAuE;QACvE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3E,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;YACnE,MAAM,kBAAkB,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;mGAKmG;AACnG,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,IAKhD;IACC,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,qBAAqB,CAAC,EAAE,GAAG,IAAI,EAAE,8EAA8E,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACtM,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC/E,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;iDAIiD;AACjD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAQpC;IACC,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,qBAAqB,CAAC,EAAE,GAAG,IAAI,EAAE,8EAA8E,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACtM,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;qCAEqC;AACrC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAYzC;IACC,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,qBAAqB,CAAC,EAAE,GAAG,IAAI,EAAE,8EAA8E,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACtM,IAAI,CAAC;QACH,iGAAiG;QACjG,iGAAiG;QACjG,gGAAgG;QAChG,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAkC,EAAE,CAAC;QACnD,IAAI,QAAqC,CAAC;QAC1C,IAAI,CAAC;YACH,4FAA4F;YAC5F,8FAA8F;YAC9F,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS;gBAC5B,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;gBAChH,CAAC,CAAC,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,GAAG,KAAK,oBAAoB,EAAE,CAAC;oBACnC,IAAI,CAAC;wBAAC,QAAQ,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,uCAAuC,CAAC,CAAC;oBAC3F,SAAS;gBACX,CAAC;gBACD,IAAI,GAA8B,CAAC;gBACnC,IAAI,CAAC;oBAAC,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;gBACrE,uFAAuF;gBACvF,wFAAwF;gBACxF,IAAI,GAAG;oBACL,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE;wBACrC,KAAK,EAAE,GAAG;wBACV,UAAU,EAAE,IAAI;wBAChB,YAAY,EAAE,IAAI;wBAClB,QAAQ,EAAE,IAAI;qBACf,CAAC,CAAC;YACP,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,iGAAiG;YACjG,IAAK,CAAuB,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAE,CAAW,CAAC,OAAO,CAAC;gBAAE,MAAM,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint-answer.d.ts","sourceRoot":"","sources":["../src/checkpoint-answer.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"checkpoint-answer.d.ts","sourceRoot":"","sources":["../src/checkpoint-answer.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAQtC;oGACoG;AACpG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACd,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;uEACmE;IACnE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AA+BD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAQ/G;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAe5C;AAED,wEAAwE;AACxE,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAO5C;AAED;;;;;;;4EAO4E;AAC5E,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAQxH"}
|
|
@@ -27,9 +27,10 @@
|
|
|
27
27
|
* acted on the accepted answer and that stays true. It exists so a participant who changes their
|
|
28
28
|
* position records the change where the original sits, and a reader of the run sees both.
|
|
29
29
|
*/
|
|
30
|
-
import {
|
|
30
|
+
import { randomBytes } from "node:crypto";
|
|
31
31
|
import { EpEnvelopeError } from "./endpoint-envelope.js";
|
|
32
32
|
import { assertIdToken, endpointToken } from "./endpoint-subjects.js";
|
|
33
|
+
import { digestIdToken } from "./digest-id.js";
|
|
33
34
|
import { RECORD_KINDS, createRecordEntry, recordAtomicKey } from "./endpoint-records.js";
|
|
34
35
|
import { canonicalJson } from "./canonical.js";
|
|
35
36
|
import { walkKvEntries } from "./kv-scan.js";
|
|
@@ -79,9 +80,7 @@ export function checkpointAnswerId(a) {
|
|
|
79
80
|
value: a.value ?? null,
|
|
80
81
|
artifact: a.artifact ?? null,
|
|
81
82
|
});
|
|
82
|
-
|
|
83
|
-
// request ids use, so an answer id is a `<token>` by construction rather than by hope.
|
|
84
|
-
return createHash("sha256").update(canonical, "utf8").digest("base64url").slice(0, 43);
|
|
83
|
+
return digestIdToken(canonical);
|
|
85
84
|
}
|
|
86
85
|
/**
|
|
87
86
|
* The id an AMENDMENT is filed under: fresh for every filing, never derived from its content.
|