@cotal-ai/auth 0.88.0 → 0.90.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/README.md +11 -0
- package/dist/authority-client.d.ts +8 -1
- package/dist/authority-client.d.ts.map +1 -1
- package/dist/authority-client.js +11 -9
- package/dist/authority-client.js.map +1 -1
- package/dist/callout.d.ts +3 -0
- package/dist/callout.d.ts.map +1 -1
- package/dist/callout.js +24 -2
- package/dist/callout.js.map +1 -1
- package/dist/connect-reader.d.ts +7 -0
- package/dist/connect-reader.d.ts.map +1 -1
- package/dist/connect-reader.js +16 -1
- package/dist/connect-reader.js.map +1 -1
- package/dist/credential-ledger.d.ts.map +1 -1
- package/dist/credential-ledger.js +7 -1
- package/dist/credential-ledger.js.map +1 -1
- package/dist/idp.d.ts.map +1 -1
- package/dist/idp.js +8 -1
- package/dist/idp.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/issuer.d.ts +15 -0
- package/dist/issuer.d.ts.map +1 -1
- package/dist/issuer.js +35 -2
- package/dist/issuer.js.map +1 -1
- package/dist/lifecycle-registry.d.ts +6 -0
- package/dist/lifecycle-registry.d.ts.map +1 -1
- package/dist/lifecycle-registry.js +13 -1
- package/dist/lifecycle-registry.js.map +1 -1
- package/dist/native-issuance.d.ts +13 -1
- package/dist/native-issuance.d.ts.map +1 -1
- package/dist/native-issuance.js +76 -10
- package/dist/native-issuance.js.map +1 -1
- package/dist/native-service-callout.d.ts +38 -0
- package/dist/native-service-callout.d.ts.map +1 -0
- package/dist/native-service-callout.js +71 -0
- package/dist/native-service-callout.js.map +1 -0
- package/dist/native-service-gate.d.ts +72 -0
- package/dist/native-service-gate.d.ts.map +1 -0
- package/dist/native-service-gate.js +219 -0
- package/dist/native-service-gate.js.map +1 -0
- package/dist/native-service-name.d.ts +17 -0
- package/dist/native-service-name.d.ts.map +1 -0
- package/dist/native-service-name.js +77 -0
- package/dist/native-service-name.js.map +1 -0
- package/dist/permissions.js +2 -0
- package/dist/permissions.js.map +1 -1
- package/dist/plane-claim.d.ts +8 -0
- package/dist/plane-claim.d.ts.map +1 -1
- package/dist/plane-claim.js +11 -1
- package/dist/plane-claim.js.map +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +48 -4
- package/dist/provider.js.map +1 -1
- package/dist/retirement-barrier.d.ts.map +1 -1
- package/dist/retirement-barrier.js +2 -1
- package/dist/retirement-barrier.js.map +1 -1
- package/dist/root-credential.d.ts.map +1 -1
- package/dist/root-credential.js +2 -1
- package/dist/root-credential.js.map +1 -1
- package/dist/service-authority-client.d.ts +19 -0
- package/dist/service-authority-client.d.ts.map +1 -0
- package/dist/service-authority-client.js +152 -0
- package/dist/service-authority-client.js.map +1 -0
- package/dist/service-caller-policy.d.ts +32 -0
- package/dist/service-caller-policy.d.ts.map +1 -0
- package/dist/service-caller-policy.js +218 -0
- package/dist/service-caller-policy.js.map +1 -0
- package/dist/service-custody-shapes.d.ts +109 -0
- package/dist/service-custody-shapes.d.ts.map +1 -0
- package/dist/service-custody-shapes.js +138 -0
- package/dist/service-custody-shapes.js.map +1 -0
- package/dist/service-custody.d.ts +96 -0
- package/dist/service-custody.d.ts.map +1 -0
- package/dist/service-custody.js +667 -0
- package/dist/service-custody.js.map +1 -0
- package/dist/service-host-contract.d.ts +312 -0
- package/dist/service-host-contract.d.ts.map +1 -0
- package/dist/service-host-contract.js +176 -0
- package/dist/service-host-contract.js.map +1 -0
- package/dist/service-renewal.d.ts +23 -0
- package/dist/service-renewal.d.ts.map +1 -0
- package/dist/service-renewal.js +51 -0
- package/dist/service-renewal.js.map +1 -0
- package/dist/service-root-reader.d.ts +16 -0
- package/dist/service-root-reader.d.ts.map +1 -0
- package/dist/service-root-reader.js +93 -0
- package/dist/service-root-reader.js.map +1 -0
- package/dist/session-ledger.d.ts.map +1 -1
- package/dist/session-ledger.js +8 -2
- package/dist/session-ledger.js.map +1 -1
- package/dist/store.d.ts +2 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +2 -0
- package/dist/store.js.map +1 -1
- package/dist/token.d.ts +11 -1
- package/dist/token.d.ts.map +1 -1
- package/dist/token.js +31 -3
- package/dist/token.js.map +1 -1
- package/dist/tool-result-prerequisites.d.ts +55 -0
- package/dist/tool-result-prerequisites.d.ts.map +1 -0
- package/dist/tool-result-prerequisites.js +352 -0
- package/dist/tool-result-prerequisites.js.map +1 -0
- package/package.json +7 -4
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { SERVICE_AUTHORITY_MAX_BYTES, SERVICE_DESCRIBE_QUERY_BUDGET_MS, ServiceAuthorityTransportError, parseServiceAuthorityEnvelope, parseServiceAuthorityInfo, parseServiceAuthorityResult, } from "@cotal-ai/core";
|
|
2
|
+
import { assertPinnedFetchUrl } from "@cotal-ai/workspace";
|
|
3
|
+
const isMutation = (operation) => operation !== "status" && operation !== "describe-view";
|
|
4
|
+
/** One original local deadline covers preparation, fetch, body and response validation. */
|
|
5
|
+
export async function withServiceAuthorityBudget(operation, options, work, startedAt = performance.now()) {
|
|
6
|
+
const signal = options.signal;
|
|
7
|
+
const cap = operation === "describe-view" ? SERVICE_DESCRIBE_QUERY_BUDGET_MS : 30_000;
|
|
8
|
+
const requested = options.timeoutMs ?? cap;
|
|
9
|
+
if (typeof requested !== "number" || !Number.isFinite(requested) || requested <= 0)
|
|
10
|
+
throw new Error("service authority budget must be a positive finite duration");
|
|
11
|
+
const deadline = startedAt + Math.min(cap, requested), controller = new AbortController();
|
|
12
|
+
const failure = () => new ServiceAuthorityTransportError("service authority deadline expired or request was cancelled", isMutation(operation) ? "unknown" : "not-executed");
|
|
13
|
+
const abort = () => controller.abort();
|
|
14
|
+
const timer = setTimeout(abort, Math.max(1, Math.ceil(deadline - performance.now())));
|
|
15
|
+
timer.unref();
|
|
16
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
17
|
+
if (signal?.aborted)
|
|
18
|
+
abort();
|
|
19
|
+
let rejectOnAbort;
|
|
20
|
+
const aborted = new Promise((_, reject) => {
|
|
21
|
+
rejectOnAbort = () => reject(failure());
|
|
22
|
+
controller.signal.addEventListener("abort", rejectOnAbort, { once: true });
|
|
23
|
+
if (controller.signal.aborted)
|
|
24
|
+
rejectOnAbort();
|
|
25
|
+
});
|
|
26
|
+
const budget = { signal: controller.signal,
|
|
27
|
+
remainingMs: () => Math.max(0, deadline - performance.now()),
|
|
28
|
+
check: () => { if (controller.signal.aborted || performance.now() >= deadline)
|
|
29
|
+
throw failure(); },
|
|
30
|
+
};
|
|
31
|
+
try {
|
|
32
|
+
return await Promise.race([Promise.resolve().then(async () => { budget.check(); const result = await work(budget); budget.check(); return result; }), aborted]);
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
signal?.removeEventListener("abort", abort);
|
|
37
|
+
controller.signal.removeEventListener("abort", rejectOnAbort);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function assertServiceViewFreshness(result, startedAt) {
|
|
41
|
+
if (result.state === "view" && result.validForMs <= performance.now() - startedAt)
|
|
42
|
+
throw new ServiceAuthorityTransportError("service Describe view expired during the full query roundtrip", "not-executed");
|
|
43
|
+
}
|
|
44
|
+
/** Derive the protocol's fixed sibling from the protected exchange base. */
|
|
45
|
+
export function serviceAuthorityUrl(base) {
|
|
46
|
+
let url;
|
|
47
|
+
try {
|
|
48
|
+
url = new URL(base);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
throw new Error("service authority requires a valid pinned exchange URL");
|
|
52
|
+
}
|
|
53
|
+
if (url.username || url.password)
|
|
54
|
+
throw new Error("service authority URL must not carry user credentials");
|
|
55
|
+
const refusal = assertPinnedFetchUrl(url, "service authority");
|
|
56
|
+
if (refusal)
|
|
57
|
+
throw new Error(refusal);
|
|
58
|
+
url.pathname = `${url.pathname.replace(/\/$/, "")}/service-endpoint-authority`;
|
|
59
|
+
url.search = "";
|
|
60
|
+
url.hash = "";
|
|
61
|
+
return url.toString();
|
|
62
|
+
}
|
|
63
|
+
async function readBoundedJson(response) {
|
|
64
|
+
if (!response.body)
|
|
65
|
+
throw new Error("empty authority response");
|
|
66
|
+
const reader = response.body.getReader();
|
|
67
|
+
const parts = [];
|
|
68
|
+
let length = 0;
|
|
69
|
+
try {
|
|
70
|
+
for (;;) {
|
|
71
|
+
const { done, value } = await reader.read();
|
|
72
|
+
if (done)
|
|
73
|
+
break;
|
|
74
|
+
length += value.byteLength;
|
|
75
|
+
if (length > SERVICE_AUTHORITY_MAX_BYTES)
|
|
76
|
+
throw new Error("authority response exceeds its byte limit");
|
|
77
|
+
parts.push(value);
|
|
78
|
+
}
|
|
79
|
+
const bytes = new Uint8Array(length);
|
|
80
|
+
let offset = 0;
|
|
81
|
+
for (const part of parts) {
|
|
82
|
+
bytes.set(part, offset);
|
|
83
|
+
offset += part.byteLength;
|
|
84
|
+
}
|
|
85
|
+
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
await reader.cancel().catch(() => { });
|
|
89
|
+
reader.releaseLock();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function send(url, init, mutation) {
|
|
93
|
+
let response;
|
|
94
|
+
try {
|
|
95
|
+
response = await fetch(url, { ...init, redirect: "manual", signal: init.signal ?? AbortSignal.timeout(30_000) });
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
throw new ServiceAuthorityTransportError("service authority did not return a response; retain the existing request identity", mutation ? "unknown" : "not-executed");
|
|
99
|
+
}
|
|
100
|
+
if (response.status >= 300 && response.status < 400) {
|
|
101
|
+
await response.body?.cancel().catch(() => { });
|
|
102
|
+
throw new ServiceAuthorityTransportError("service authority redirects are refused", mutation ? "unknown" : "not-executed", response.status);
|
|
103
|
+
}
|
|
104
|
+
return response;
|
|
105
|
+
}
|
|
106
|
+
export async function readRemoteServiceAuthorityInfo(base, space) {
|
|
107
|
+
const response = await send(serviceAuthorityUrl(base), { method: "GET", headers: { "cache-control": "no-store" } }, false);
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
await response.body?.cancel().catch(() => { });
|
|
110
|
+
throw new ServiceAuthorityTransportError("service authority account metadata request failed", "not-executed", response.status);
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
return parseServiceAuthorityInfo(await readBoundedJson(response), space);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
throw new ServiceAuthorityTransportError("service authority returned invalid account metadata", "not-executed", response.status);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export async function postRemoteServiceAuthority(base, raw, options = {}) {
|
|
120
|
+
const startedAt = performance.now();
|
|
121
|
+
const envelope = parseServiceAuthorityEnvelope(raw);
|
|
122
|
+
const url = serviceAuthorityUrl(base);
|
|
123
|
+
return withServiceAuthorityBudget(envelope.request.operation, options, async (budget) => {
|
|
124
|
+
const mutation = isMutation(envelope.request.operation);
|
|
125
|
+
const response = await send(url, {
|
|
126
|
+
method: "POST", headers: { "content-type": "application/json", "cache-control": "no-store" }, body: JSON.stringify(envelope), signal: budget.signal,
|
|
127
|
+
}, mutation);
|
|
128
|
+
if (response.status >= 500) {
|
|
129
|
+
await response.body?.cancel().catch(() => { });
|
|
130
|
+
throw new ServiceAuthorityTransportError("service authority HTTP failure leaves the request unconfirmed; retain the existing request identity", mutation ? "unknown" : "not-executed", response.status);
|
|
131
|
+
}
|
|
132
|
+
if (envelope.request.operation === "describe-view" && !(response.headers.get("cache-control") ?? "").split(",").some((p) => p.trim().toLowerCase() === "no-store")) {
|
|
133
|
+
await response.body?.cancel().catch(() => { });
|
|
134
|
+
throw new ServiceAuthorityTransportError("service Describe response must forbid storage", "not-executed", response.status);
|
|
135
|
+
}
|
|
136
|
+
let result;
|
|
137
|
+
try {
|
|
138
|
+
result = parseServiceAuthorityResult(await readBoundedJson(response), envelope.request);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
throw new ServiceAuthorityTransportError("service authority returned an unconfirmed response; retain the existing request identity", mutation ? "unknown" : "not-executed", response.status);
|
|
142
|
+
}
|
|
143
|
+
if (!response.ok && result.state !== "denied")
|
|
144
|
+
throw new ServiceAuthorityTransportError("service authority HTTP status disagrees with its result", mutation ? "unknown" : "not-executed", response.status);
|
|
145
|
+
if (result.state === "approval-required" && result.approvalUrl !== undefined && new URL(result.approvalUrl).origin !== new URL(url).origin)
|
|
146
|
+
throw new ServiceAuthorityTransportError("service approval URL leaves the pinned authority origin", mutation ? "unknown" : "not-executed", response.status);
|
|
147
|
+
budget.check();
|
|
148
|
+
assertServiceViewFreshness(result, startedAt);
|
|
149
|
+
return result;
|
|
150
|
+
}, startedAt);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=service-authority-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-authority-client.js","sourceRoot":"","sources":["../src/service-authority-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type ServicePrincipal } from "@cotal-ai/core";
|
|
2
|
+
import { type LifecycleRegistry } from "./lifecycle-registry.js";
|
|
3
|
+
import type { ServiceCallerGrant } from "./service-host-contract.js";
|
|
4
|
+
export interface ServiceCallerPolicyBinding {
|
|
5
|
+
accountPublicKey: string;
|
|
6
|
+
space: string;
|
|
7
|
+
grantee: ServicePrincipal;
|
|
8
|
+
}
|
|
9
|
+
export interface NativeServiceCallerPolicy extends ServiceCallerPolicyBinding {
|
|
10
|
+
v: 1;
|
|
11
|
+
grants: ServiceCallerGrant[];
|
|
12
|
+
}
|
|
13
|
+
export interface NativeServiceCallerPolicyRead {
|
|
14
|
+
row: NativeServiceCallerPolicy;
|
|
15
|
+
revision: number;
|
|
16
|
+
}
|
|
17
|
+
/** Stored syntax only. Eligibility, ancestry and native capability containment are host checks. */
|
|
18
|
+
export declare function parseNativeServiceCallerPolicy(raw: unknown): NativeServiceCallerPolicy;
|
|
19
|
+
/** Internal leader-served read. Deleted or corrupt records are not an absent/empty policy. */
|
|
20
|
+
export declare function readNativeServiceCallerPolicy(reg: LifecycleRegistry, binding: ServiceCallerPolicyBinding): Promise<NativeServiceCallerPolicyRead | undefined>;
|
|
21
|
+
/** Storage commit only, after trusted host eligibility checks. Never replaces an existing grant. */
|
|
22
|
+
export declare function appendNativeServiceCallerGrant(reg: LifecycleRegistry, binding: ServiceCallerPolicyBinding, args: {
|
|
23
|
+
expectedRevision: number;
|
|
24
|
+
grant: ServiceCallerGrant;
|
|
25
|
+
}): Promise<NativeServiceCallerPolicyRead>;
|
|
26
|
+
/** Monotonic deny-new intent only. Cutoff, descendant invalidation and live retirement remain host work. */
|
|
27
|
+
export declare function beginNativeServiceCallerRevocation(reg: LifecycleRegistry, binding: ServiceCallerPolicyBinding, args: {
|
|
28
|
+
expectedRevision: number;
|
|
29
|
+
grantId: string;
|
|
30
|
+
operationId: string;
|
|
31
|
+
}): Promise<NativeServiceCallerPolicyRead>;
|
|
32
|
+
//# sourceMappingURL=service-caller-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-caller-policy.d.ts","sourceRoot":"","sources":["../src/service-caller-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAGmC,KAAK,gBAAgB,EAC9D,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,KAAK,EAAE,kBAAkB,EAA4E,MAAM,4BAA4B,CAAC;AAE/I,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AACD,MAAM,WAAW,yBAA0B,SAAQ,0BAA0B;IAC3E,CAAC,EAAE,CAAC,CAAC;IACL,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AACD,MAAM,WAAW,6BAA6B;IAAG,GAAG,EAAE,yBAAyB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAuFnG,mGAAmG;AACnG,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,OAAO,GAAG,yBAAyB,CAYtF;AAQD,8FAA8F;AAC9F,wBAAsB,6BAA6B,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,6BAA6B,GAAG,SAAS,CAAC,CAQnK;AA0BD,oGAAoG;AACpG,wBAAsB,8BAA8B,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,0BAA0B,EAAE,IAAI,EAAE;IACtH,gBAAgB,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAC;CACrD,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAgBzC;AAED,4GAA4G;AAC5G,wBAAsB,kCAAkC,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,0BAA0B,EAAE,IAAI,EAAE;IAC1H,gBAAgB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;CAChE,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAezC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { EpEnvelopeError, SERVICE_AUTHORITY_MAX_BYTES, assertBoundedOwner, assertDerivedOwnerToken, assertLifecycleToken, canonicalJson, endpointToken, isAccountNkey, isCasLoss, isContractDigest, parseEndpointCapabilities, spacePrefix, } from "@cotal-ai/core";
|
|
2
|
+
import { registryStores } from "./lifecycle-registry.js";
|
|
3
|
+
const enc = new TextEncoder(), dec = new TextDecoder("utf-8", { fatal: true });
|
|
4
|
+
const compare = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
5
|
+
function bad() { throw new EpEnvelopeError("bad-request", "invalid native service caller policy"); }
|
|
6
|
+
function conflict(message) { throw new EpEnvelopeError("conflict", message); }
|
|
7
|
+
function object(raw, fields) {
|
|
8
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
9
|
+
bad();
|
|
10
|
+
const proto = Object.getPrototypeOf(raw);
|
|
11
|
+
if (proto !== Object.prototype && proto !== null)
|
|
12
|
+
bad();
|
|
13
|
+
if (fields.some((k) => !Object.hasOwn(raw, k)) || Reflect.ownKeys(raw).some((k) => typeof k !== "string" || !fields.includes(k)))
|
|
14
|
+
bad();
|
|
15
|
+
return raw;
|
|
16
|
+
}
|
|
17
|
+
function id(raw) {
|
|
18
|
+
if (typeof raw !== "string" || !/^[0-9a-f]{32}$/.test(raw))
|
|
19
|
+
bad();
|
|
20
|
+
return raw;
|
|
21
|
+
}
|
|
22
|
+
function uint(raw, positive = false) {
|
|
23
|
+
if (typeof raw !== "number" || !Number.isSafeInteger(raw) || raw < (positive ? 1 : 0))
|
|
24
|
+
bad();
|
|
25
|
+
return raw;
|
|
26
|
+
}
|
|
27
|
+
function digest(raw) { if (typeof raw !== "string" || !isContractDigest(raw))
|
|
28
|
+
bad(); return raw; }
|
|
29
|
+
function lifecycle(raw) { if (typeof raw !== "string")
|
|
30
|
+
bad(); return assertLifecycleToken(raw, "policy lifecycle"); }
|
|
31
|
+
function principal(raw) {
|
|
32
|
+
const o = object(raw, ["owner", "actor", "lifecycleUid"]);
|
|
33
|
+
if (typeof o.owner !== "string" || typeof o.actor !== "string")
|
|
34
|
+
bad();
|
|
35
|
+
return { owner: assertDerivedOwnerToken(o.owner), actor: assertBoundedOwner(o.actor, "policy actor"), lifecycleUid: lifecycle(o.lifecycleUid) };
|
|
36
|
+
}
|
|
37
|
+
function refs(raw) {
|
|
38
|
+
if (!Array.isArray(raw) || raw.length === 0)
|
|
39
|
+
bad();
|
|
40
|
+
const seen = new Set();
|
|
41
|
+
const result = raw.map((r) => {
|
|
42
|
+
const o = object(r, ["granteeUid", "grantId"]), ref = { granteeUid: lifecycle(o.granteeUid), grantId: id(o.grantId) };
|
|
43
|
+
const key = canonicalJson(ref);
|
|
44
|
+
if (seen.has(key))
|
|
45
|
+
bad();
|
|
46
|
+
seen.add(key);
|
|
47
|
+
return ref;
|
|
48
|
+
});
|
|
49
|
+
return result.sort((a, b) => compare(canonicalJson(a), canonicalJson(b)));
|
|
50
|
+
}
|
|
51
|
+
function source(raw) {
|
|
52
|
+
const kind = raw && typeof raw === "object" ? raw.kind : undefined;
|
|
53
|
+
if (kind === "service-owner") {
|
|
54
|
+
const o = object(raw, ["kind", "owner", "approvalDigest", "nameAuthorityRevision"]);
|
|
55
|
+
if (typeof o.owner !== "string")
|
|
56
|
+
bad();
|
|
57
|
+
return { kind, owner: assertDerivedOwnerToken(o.owner), approvalDigest: digest(o.approvalDigest), nameAuthorityRevision: uint(o.nameAuthorityRevision, true) };
|
|
58
|
+
}
|
|
59
|
+
if (kind === "delegated") {
|
|
60
|
+
const o = object(raw, ["kind", "principal", "grants"]), holder = principal(o.principal), grants = refs(o.grants);
|
|
61
|
+
if (grants.some((g) => g.granteeUid !== holder.lifecycleUid))
|
|
62
|
+
bad();
|
|
63
|
+
return { kind, principal: holder, grants };
|
|
64
|
+
}
|
|
65
|
+
return bad();
|
|
66
|
+
}
|
|
67
|
+
function state(raw) {
|
|
68
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
69
|
+
bad();
|
|
70
|
+
const s = raw;
|
|
71
|
+
if (s.state === "active") {
|
|
72
|
+
object(s, ["state"]);
|
|
73
|
+
return { state: "active" };
|
|
74
|
+
}
|
|
75
|
+
if (s.state === "revoking" && s.phase === "cutoff-required") {
|
|
76
|
+
object(s, ["state", "operationId", "phase"]);
|
|
77
|
+
return { state: "revoking", operationId: id(s.operationId), phase: "cutoff-required" };
|
|
78
|
+
}
|
|
79
|
+
if (s.state === "revoking") {
|
|
80
|
+
object(s, ["state", "operationId", "markerKey", "markerRevision", "notBefore"]);
|
|
81
|
+
if (typeof s.markerKey !== "string" || !/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)*$/.test(s.markerKey) || s.markerKey.length > 512)
|
|
82
|
+
bad();
|
|
83
|
+
return { state: "revoking", operationId: id(s.operationId), markerKey: s.markerKey,
|
|
84
|
+
markerRevision: uint(s.markerRevision, true), notBefore: uint(s.notBefore, true) };
|
|
85
|
+
}
|
|
86
|
+
if (s.state === "revoked") {
|
|
87
|
+
object(s, ["state", "operationId", "verifiedAt"]);
|
|
88
|
+
return { state: "revoked", operationId: id(s.operationId), verifiedAt: uint(s.verifiedAt, true) };
|
|
89
|
+
}
|
|
90
|
+
return bad();
|
|
91
|
+
}
|
|
92
|
+
function grant(raw) {
|
|
93
|
+
const o = object(raw, ["grantId", "endpoint", "instanceId", "serviceApprovalDigest", "capabilities", "source", "parentRefs", "status"]);
|
|
94
|
+
if (typeof o.endpoint !== "string" || !Array.isArray(o.parentRefs))
|
|
95
|
+
bad();
|
|
96
|
+
endpointToken(o.endpoint);
|
|
97
|
+
const seen = new Set();
|
|
98
|
+
const parents = o.parentRefs.map((p) => {
|
|
99
|
+
const ref = object(p, ["principal", "grants"]), holder = principal(ref.principal), grants = refs(ref.grants);
|
|
100
|
+
if (seen.has(holder.lifecycleUid) || grants.some((g) => g.granteeUid !== holder.lifecycleUid))
|
|
101
|
+
bad();
|
|
102
|
+
seen.add(holder.lifecycleUid);
|
|
103
|
+
return { principal: holder, grants };
|
|
104
|
+
});
|
|
105
|
+
parents.sort((a, b) => compare(a.principal.lifecycleUid, b.principal.lifecycleUid));
|
|
106
|
+
const capabilities = parseEndpointCapabilities(o.capabilities), provenance = source(o.source), approvalDigest = digest(o.serviceApprovalDigest);
|
|
107
|
+
if (capabilities.some((c) => c.endpoint !== o.endpoint) || (provenance.kind === "service-owner" && provenance.approvalDigest !== approvalDigest))
|
|
108
|
+
bad();
|
|
109
|
+
return { grantId: id(o.grantId), endpoint: o.endpoint, instanceId: lifecycle(o.instanceId), serviceApprovalDigest: approvalDigest,
|
|
110
|
+
capabilities, source: provenance, parentRefs: parents, status: state(o.status) };
|
|
111
|
+
}
|
|
112
|
+
/** Stored syntax only. Eligibility, ancestry and native capability containment are host checks. */
|
|
113
|
+
export function parseNativeServiceCallerPolicy(raw) {
|
|
114
|
+
const o = object(raw, ["v", "accountPublicKey", "space", "grantee", "grants"]);
|
|
115
|
+
if (o.v !== 1 || typeof o.accountPublicKey !== "string" || !isAccountNkey(o.accountPublicKey)
|
|
116
|
+
|| typeof o.space !== "string" || !Array.isArray(o.grants))
|
|
117
|
+
bad();
|
|
118
|
+
spacePrefix(o.space);
|
|
119
|
+
if (Buffer.byteLength(canonicalJson(o), "utf8") > SERVICE_AUTHORITY_MAX_BYTES)
|
|
120
|
+
throw new EpEnvelopeError("resource-exhausted", "native service caller policy exceeds its byte bound");
|
|
121
|
+
const grantee = principal(o.grantee), seen = new Set();
|
|
122
|
+
const grants = o.grants.map((g) => {
|
|
123
|
+
const parsed = grant(g);
|
|
124
|
+
if (seen.has(parsed.grantId))
|
|
125
|
+
bad();
|
|
126
|
+
seen.add(parsed.grantId);
|
|
127
|
+
return parsed;
|
|
128
|
+
});
|
|
129
|
+
return { v: 1, accountPublicKey: o.accountPublicKey, space: o.space, grantee, grants };
|
|
130
|
+
}
|
|
131
|
+
function context(reg, binding) {
|
|
132
|
+
const stores = registryStores(reg);
|
|
133
|
+
const expected = parseNativeServiceCallerPolicy({ v: 1, ...binding, grants: [] });
|
|
134
|
+
if (stores.space !== expected.space)
|
|
135
|
+
throw new EpEnvelopeError("permission-denied", "caller policy belongs to another registry space");
|
|
136
|
+
return { kv: stores.authKv, key: `servicepolicy.${expected.grantee.lifecycleUid}`, expected };
|
|
137
|
+
}
|
|
138
|
+
/** Internal leader-served read. Deleted or corrupt records are not an absent/empty policy. */
|
|
139
|
+
export async function readNativeServiceCallerPolicy(reg, binding) {
|
|
140
|
+
const { kv, key, expected } = context(reg, binding), entry = await kv.get(key);
|
|
141
|
+
if (!entry)
|
|
142
|
+
return undefined;
|
|
143
|
+
if (entry.operation !== "PUT")
|
|
144
|
+
throw new EpEnvelopeError("failed-precondition", "native caller policy carries a deletion marker");
|
|
145
|
+
const row = parseNativeServiceCallerPolicy(JSON.parse(dec.decode(entry.value)));
|
|
146
|
+
if (row.accountPublicKey !== expected.accountPublicKey || row.space !== expected.space || canonicalJson(row.grantee) !== canonicalJson(expected.grantee))
|
|
147
|
+
conflict("native caller policy belongs to another immutable grantee binding");
|
|
148
|
+
return { row, revision: entry.revision };
|
|
149
|
+
}
|
|
150
|
+
async function write(reg, binding, row, revision) {
|
|
151
|
+
const { kv, key } = context(reg, binding), parsed = parseNativeServiceCallerPolicy(row), bytes = enc.encode(canonicalJson(parsed));
|
|
152
|
+
try {
|
|
153
|
+
return { row: parsed, revision: revision === 0 ? await kv.put(key, bytes, { previousSeq: 0 }) : await kv.update(key, bytes, revision) };
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
if (isCasLoss(error))
|
|
157
|
+
conflict("native caller policy changed; re-read before another mutation");
|
|
158
|
+
throw new EpEnvelopeError("unavailable", "native caller policy write outcome is unknown; retain the operation identity");
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const byteSize = (value) => Buffer.byteLength(canonicalJson(value), "utf8");
|
|
162
|
+
// Exact closed status syntax bounds. Reserve for all grants simultaneously, not just the
|
|
163
|
+
// newly appended grant or the first cutoff intent. No cap increase or old-row rewriting.
|
|
164
|
+
const maxStatusBytes = Math.max(...[
|
|
165
|
+
{ state: "active" },
|
|
166
|
+
{ state: "revoking", operationId: "f".repeat(32), phase: "cutoff-required" },
|
|
167
|
+
{ state: "revoking", operationId: "f".repeat(32), markerKey: "m".repeat(512),
|
|
168
|
+
markerRevision: Number.MAX_SAFE_INTEGER, notBefore: Number.MAX_SAFE_INTEGER },
|
|
169
|
+
{ state: "revoked", operationId: "f".repeat(32), verifiedAt: Number.MAX_SAFE_INTEGER },
|
|
170
|
+
].map(byteSize));
|
|
171
|
+
function assertRevocationHeadroom(row) {
|
|
172
|
+
const worstBytes = byteSize(row) + row.grants.reduce((sum, g) => sum + Math.max(0, maxStatusBytes - byteSize(g.status)), 0);
|
|
173
|
+
if (worstBytes > SERVICE_AUTHORITY_MAX_BYTES)
|
|
174
|
+
throw new EpEnvelopeError("resource-exhausted", "native service caller policy lacks all-grant revocation status headroom");
|
|
175
|
+
}
|
|
176
|
+
/** Storage commit only, after trusted host eligibility checks. Never replaces an existing grant. */
|
|
177
|
+
export async function appendNativeServiceCallerGrant(reg, binding, args) {
|
|
178
|
+
const revision = uint(args.expectedRevision);
|
|
179
|
+
const { accountPublicKey, space, grantee } = context(reg, binding).expected;
|
|
180
|
+
binding = { accountPublicKey, space, grantee };
|
|
181
|
+
const candidate = parseNativeServiceCallerPolicy({ v: 1, ...binding, grants: [args.grant] }).grants[0];
|
|
182
|
+
if (candidate.status.state !== "active")
|
|
183
|
+
bad();
|
|
184
|
+
const found = await readNativeServiceCallerPolicy(reg, binding), existing = found?.row.grants.find((g) => g.grantId === candidate.grantId);
|
|
185
|
+
if (existing) {
|
|
186
|
+
if (canonicalJson(existing) !== canonicalJson(candidate))
|
|
187
|
+
conflict("grant id is immutable and cannot be rebound or reactivated");
|
|
188
|
+
return found;
|
|
189
|
+
}
|
|
190
|
+
if ((found?.revision ?? 0) !== revision)
|
|
191
|
+
conflict("native caller policy revision changed");
|
|
192
|
+
const row = found?.row ?? context(reg, binding).expected;
|
|
193
|
+
const next = { ...row, grants: [...row.grants, candidate] };
|
|
194
|
+
assertRevocationHeadroom(next);
|
|
195
|
+
return write(reg, binding, next, revision);
|
|
196
|
+
}
|
|
197
|
+
/** Monotonic deny-new intent only. Cutoff, descendant invalidation and live retirement remain host work. */
|
|
198
|
+
export async function beginNativeServiceCallerRevocation(reg, binding, args) {
|
|
199
|
+
const revision = uint(args.expectedRevision), grantId = id(args.grantId), operationId = id(args.operationId);
|
|
200
|
+
const { accountPublicKey, space, grantee } = context(reg, binding).expected;
|
|
201
|
+
binding = { accountPublicKey, space, grantee };
|
|
202
|
+
const found = await readNativeServiceCallerPolicy(reg, binding);
|
|
203
|
+
if (!found)
|
|
204
|
+
throw new EpEnvelopeError("not-found", "native caller policy is absent");
|
|
205
|
+
const existing = found.row.grants.find((g) => g.grantId === grantId);
|
|
206
|
+
if (!existing)
|
|
207
|
+
throw new EpEnvelopeError("not-found", "native caller grant is absent");
|
|
208
|
+
if (existing.status.state !== "active") {
|
|
209
|
+
if (existing.status.operationId !== operationId)
|
|
210
|
+
conflict("caller grant is already bound to another revocation operation");
|
|
211
|
+
return found;
|
|
212
|
+
}
|
|
213
|
+
if (found.revision !== revision)
|
|
214
|
+
conflict("native caller policy revision changed");
|
|
215
|
+
return write(reg, binding, { ...found.row, grants: found.row.grants.map((g) => g.grantId === grantId
|
|
216
|
+
? { ...g, status: { state: "revoking", operationId, phase: "cutoff-required" } } : g) }, found.revision);
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=service-caller-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-caller-policy.js","sourceRoot":"","sources":["../src/service-caller-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/** Package-internal closed shapes for canonical R9 service native custody: the head variants, the
|
|
2
|
+
* native gate variants, the native root row and the digest mirror. The active-root reader and the
|
|
3
|
+
* dormant custody writer share the closed field sets, the closed-record check and the mirror rule
|
|
4
|
+
* from here. Each keeps its own predicates: the writer's parsers also accept the creating,
|
|
5
|
+
* cancelling, frozen and revoked forms that the active-only reader refuses. Never exported from
|
|
6
|
+
* the index. */
|
|
7
|
+
import { type ServiceUidCustodyV1 } from "@cotal-ai/core";
|
|
8
|
+
export interface Mirror {
|
|
9
|
+
v: 1;
|
|
10
|
+
uidDigest: string;
|
|
11
|
+
}
|
|
12
|
+
export interface RootPlan {
|
|
13
|
+
credentialId: string;
|
|
14
|
+
expMs: number;
|
|
15
|
+
}
|
|
16
|
+
export interface CreateOp {
|
|
17
|
+
kind: "service-create";
|
|
18
|
+
opId: string;
|
|
19
|
+
requestDigest: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CancelOp {
|
|
22
|
+
kind: "service-cancel";
|
|
23
|
+
opId: string;
|
|
24
|
+
requestDigest: string;
|
|
25
|
+
}
|
|
26
|
+
interface HeadBase {
|
|
27
|
+
owner: string;
|
|
28
|
+
actor: string;
|
|
29
|
+
lifecycleUid: string;
|
|
30
|
+
managerInstance: string;
|
|
31
|
+
processEpoch: 1;
|
|
32
|
+
serviceCustody: Mirror;
|
|
33
|
+
}
|
|
34
|
+
export type ServiceHead = (HeadBase & {
|
|
35
|
+
state: "service-creating";
|
|
36
|
+
op: CreateOp;
|
|
37
|
+
rootPlan: RootPlan | null;
|
|
38
|
+
}) | (HeadBase & {
|
|
39
|
+
state: "active";
|
|
40
|
+
currentCredentialId: string;
|
|
41
|
+
}) | (HeadBase & {
|
|
42
|
+
state: "service-cancelling";
|
|
43
|
+
op: CancelOp;
|
|
44
|
+
rootPlan: RootPlan | null;
|
|
45
|
+
currentCredentialId: string | null;
|
|
46
|
+
});
|
|
47
|
+
export type ServiceNativeGate = {
|
|
48
|
+
lifecycleUid: string;
|
|
49
|
+
state: "open";
|
|
50
|
+
generation: 1;
|
|
51
|
+
serviceCustody: Mirror;
|
|
52
|
+
} | {
|
|
53
|
+
lifecycleUid: string;
|
|
54
|
+
state: "frozen";
|
|
55
|
+
generation: 0 | 1;
|
|
56
|
+
serviceCustody: Mirror;
|
|
57
|
+
op: {
|
|
58
|
+
opId: string;
|
|
59
|
+
kind: "activation" | "service-cancel";
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
export interface ServiceNativeRoot {
|
|
63
|
+
credentialId: string;
|
|
64
|
+
holderPrincipal: string;
|
|
65
|
+
lifecycleUid: string;
|
|
66
|
+
sourceChain: ["root"];
|
|
67
|
+
state: "active" | "revoked";
|
|
68
|
+
exp: number;
|
|
69
|
+
serviceCustody: Mirror;
|
|
70
|
+
}
|
|
71
|
+
/** Closed field sets, one per record variant. */
|
|
72
|
+
export declare const HEAD_FIELDS: {
|
|
73
|
+
readonly "service-creating": readonly ["owner", "actor", "lifecycleUid", "managerInstance", "processEpoch", "serviceCustody", "state", "op", "rootPlan"];
|
|
74
|
+
readonly active: readonly ["owner", "actor", "lifecycleUid", "managerInstance", "processEpoch", "serviceCustody", "state", "currentCredentialId"];
|
|
75
|
+
readonly "service-cancelling": readonly ["owner", "actor", "lifecycleUid", "managerInstance", "processEpoch", "serviceCustody", "state", "op", "rootPlan", "currentCredentialId"];
|
|
76
|
+
};
|
|
77
|
+
export declare const GATE_FIELDS: {
|
|
78
|
+
readonly open: readonly ["lifecycleUid", "state", "generation", "serviceCustody"];
|
|
79
|
+
readonly frozen: readonly ["lifecycleUid", "state", "generation", "serviceCustody", "op"];
|
|
80
|
+
};
|
|
81
|
+
export declare const ROOT_FIELDS: readonly ["credentialId", "holderPrincipal", "lifecycleUid", "sourceChain", "state", "exp", "serviceCustody"];
|
|
82
|
+
/** A plain-prototype object carrying exactly `fields`, or `fail` is called. */
|
|
83
|
+
export declare function closedRecord(value: unknown, fields: readonly string[], fail: () => never): Record<string, unknown>;
|
|
84
|
+
/** The closed `{v:1, uidDigest}` mirror must name exactly `digest`. A malformed mirror calls
|
|
85
|
+
* `failShape` (default `fail`); a well-formed mirror naming another digest calls `fail`. */
|
|
86
|
+
export declare function assertMirror(value: unknown, digest: string, fail: () => never, failShape?: () => never): void;
|
|
87
|
+
/** The immutable coordinates every service record of one UID is compared with. */
|
|
88
|
+
export interface ServiceCustodyIdentity {
|
|
89
|
+
uid: ServiceUidCustodyV1;
|
|
90
|
+
digest: string;
|
|
91
|
+
lifecycleUid: string;
|
|
92
|
+
owner: string;
|
|
93
|
+
actor: string;
|
|
94
|
+
instanceId: string;
|
|
95
|
+
endpoint: string;
|
|
96
|
+
holderPrincipal: string;
|
|
97
|
+
mirror: Mirror;
|
|
98
|
+
}
|
|
99
|
+
export declare function serviceCustodyIdentity(uid: ServiceUidCustodyV1): ServiceCustodyIdentity;
|
|
100
|
+
/** Parse a head of this UID. Throws `failed-precondition` for any other identity, digest or shape. */
|
|
101
|
+
export declare function parseServiceHead(value: unknown, id: ServiceCustodyIdentity): ServiceHead;
|
|
102
|
+
/** Parse the native gate of this UID. Throws `failed-precondition` for any other identity or shape. */
|
|
103
|
+
export declare function parseServiceNativeGate(value: unknown, id: ServiceCustodyIdentity): ServiceNativeGate;
|
|
104
|
+
/** Parse the native root row of this UID. Throws `failed-precondition` for any other identity or shape. */
|
|
105
|
+
export declare function parseServiceNativeRoot(value: unknown, id: ServiceCustodyIdentity, credentialId: string): ServiceNativeRoot;
|
|
106
|
+
/** Encode one record, refusing bytes its own parser would not read back to the same value. */
|
|
107
|
+
export declare function encodeRoundTrip<T>(value: T, parse: (decoded: unknown) => T): Uint8Array;
|
|
108
|
+
export {};
|
|
109
|
+
//# sourceMappingURL=service-custody-shapes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-custody-shapes.d.ts","sourceRoot":"","sources":["../src/service-custody-shapes.ts"],"names":[],"mappings":"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"}
|