@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,138 @@
|
|
|
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 { EpEnvelopeError, assertLifecycleToken, contractDigest, isContractDigest, serviceEndpointActor, } from "@cotal-ai/core";
|
|
8
|
+
const HEAD_BASE = ["owner", "actor", "lifecycleUid", "managerInstance", "processEpoch", "serviceCustody"];
|
|
9
|
+
/** Closed field sets, one per record variant. */
|
|
10
|
+
export const HEAD_FIELDS = {
|
|
11
|
+
"service-creating": [...HEAD_BASE, "state", "op", "rootPlan"],
|
|
12
|
+
active: [...HEAD_BASE, "state", "currentCredentialId"],
|
|
13
|
+
"service-cancelling": [...HEAD_BASE, "state", "op", "rootPlan", "currentCredentialId"],
|
|
14
|
+
};
|
|
15
|
+
export const GATE_FIELDS = { open: ["lifecycleUid", "state", "generation", "serviceCustody"], frozen: ["lifecycleUid", "state", "generation", "serviceCustody", "op"] };
|
|
16
|
+
export const ROOT_FIELDS = ["credentialId", "holderPrincipal", "lifecycleUid", "sourceChain", "state", "exp", "serviceCustody"];
|
|
17
|
+
/** A plain-prototype object carrying exactly `fields`, or `fail` is called. */
|
|
18
|
+
export function closedRecord(value, fields, fail) {
|
|
19
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
20
|
+
return fail();
|
|
21
|
+
const proto = Object.getPrototypeOf(value);
|
|
22
|
+
if ((proto !== Object.prototype && proto !== null) || Reflect.ownKeys(value).length !== fields.length
|
|
23
|
+
|| fields.some(k => !Object.hasOwn(value, k)))
|
|
24
|
+
return fail();
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
/** The closed `{v:1, uidDigest}` mirror must name exactly `digest`. A malformed mirror calls
|
|
28
|
+
* `failShape` (default `fail`); a well-formed mirror naming another digest calls `fail`. */
|
|
29
|
+
export function assertMirror(value, digest, fail, failShape = fail) {
|
|
30
|
+
const o = closedRecord(value, ["v", "uidDigest"], failShape);
|
|
31
|
+
if (o.v !== 1 || o.uidDigest !== digest)
|
|
32
|
+
fail();
|
|
33
|
+
}
|
|
34
|
+
export function serviceCustodyIdentity(uid) {
|
|
35
|
+
const { native, assignment } = uid;
|
|
36
|
+
const actor = serviceEndpointActor({ accountPublicKey: native.accountPublicKey, space: native.space, owner: assignment.owner, endpoint: assignment.endpoint, instanceId: assignment.instanceId });
|
|
37
|
+
if (actor !== assignment.actor)
|
|
38
|
+
invalid("service reservation does not carry its derived actor");
|
|
39
|
+
const digest = contractDigest(uid);
|
|
40
|
+
return { uid: structuredClone(uid), digest, lifecycleUid: native.lifecycleUid, owner: assignment.owner, actor, instanceId: assignment.instanceId,
|
|
41
|
+
endpoint: assignment.endpoint, holderPrincipal: `${assignment.owner}.${actor}`, mirror: { v: 1, uidDigest: digest } };
|
|
42
|
+
}
|
|
43
|
+
function invalid(detail) {
|
|
44
|
+
throw new EpEnvelopeError("failed-precondition", `service custody ${detail}`);
|
|
45
|
+
}
|
|
46
|
+
const shapeFail = (what) => () => invalid(`${what} does not match its closed schema`);
|
|
47
|
+
const lifecycleToken = (v) => {
|
|
48
|
+
if (typeof v !== "string")
|
|
49
|
+
return false;
|
|
50
|
+
try {
|
|
51
|
+
assertLifecycleToken(v);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const positiveSafe = (v) => typeof v === "number" && Number.isSafeInteger(v) && v > 0;
|
|
59
|
+
function parsePlan(value) {
|
|
60
|
+
if (value === null)
|
|
61
|
+
return null;
|
|
62
|
+
const o = closedRecord(value, ["credentialId", "expMs"], shapeFail("root plan"));
|
|
63
|
+
if (!lifecycleToken(o.credentialId) || !positiveSafe(o.expMs))
|
|
64
|
+
invalid("root plan has invalid coordinates");
|
|
65
|
+
return { credentialId: o.credentialId, expMs: o.expMs };
|
|
66
|
+
}
|
|
67
|
+
function parseOp(value, kind) {
|
|
68
|
+
const o = closedRecord(value, ["kind", "opId", "requestDigest"], shapeFail(`${kind} operation`));
|
|
69
|
+
if (o.kind !== kind || !lifecycleToken(o.opId) || typeof o.requestDigest !== "string" || !isContractDigest(o.requestDigest))
|
|
70
|
+
invalid(`${kind} operation has invalid coordinates`);
|
|
71
|
+
return { kind, opId: o.opId, requestDigest: o.requestDigest };
|
|
72
|
+
}
|
|
73
|
+
/** Parse a head of this UID. Throws `failed-precondition` for any other identity, digest or shape. */
|
|
74
|
+
export function parseServiceHead(value, id) {
|
|
75
|
+
const state = value && typeof value === "object" ? value.state : undefined;
|
|
76
|
+
if (state !== "service-creating" && state !== "active" && state !== "service-cancelling")
|
|
77
|
+
return invalid("head has no service state");
|
|
78
|
+
const o = closedRecord(value, HEAD_FIELDS[state], shapeFail(`${state} head`));
|
|
79
|
+
assertMirror(o.serviceCustody, id.digest, () => invalid("head mirror is missing or mismatched"));
|
|
80
|
+
if (o.owner !== id.owner || o.actor !== id.actor || o.lifecycleUid !== id.lifecycleUid
|
|
81
|
+
|| o.managerInstance !== id.instanceId || o.processEpoch !== 1)
|
|
82
|
+
invalid("head does not bind this immutable service identity");
|
|
83
|
+
const base = { owner: id.owner, actor: id.actor, lifecycleUid: id.lifecycleUid, managerInstance: id.instanceId, processEpoch: 1, serviceCustody: { ...id.mirror } };
|
|
84
|
+
if (state === "service-creating") {
|
|
85
|
+
const op = parseOp(o.op, "service-create");
|
|
86
|
+
if (op.opId !== id.uid.creation.operationId || op.requestDigest !== id.uid.creation.requestDigest)
|
|
87
|
+
invalid("creating head does not carry its creation operation");
|
|
88
|
+
return { ...base, state, op, rootPlan: parsePlan(o.rootPlan) };
|
|
89
|
+
}
|
|
90
|
+
if (state === "active") {
|
|
91
|
+
if (!lifecycleToken(o.currentCredentialId))
|
|
92
|
+
invalid("active head has no root credential id");
|
|
93
|
+
return { ...base, state, currentCredentialId: o.currentCredentialId };
|
|
94
|
+
}
|
|
95
|
+
const op = parseOp(o.op, "service-cancel"), rootPlan = parsePlan(o.rootPlan);
|
|
96
|
+
const stamp = o.currentCredentialId;
|
|
97
|
+
if (stamp !== null && (!lifecycleToken(stamp) || rootPlan === null || rootPlan.credentialId !== stamp))
|
|
98
|
+
invalid("cancelling head stamp does not match its preserved root plan");
|
|
99
|
+
return { ...base, state, op, rootPlan, currentCredentialId: stamp };
|
|
100
|
+
}
|
|
101
|
+
/** Parse the native gate of this UID. Throws `failed-precondition` for any other identity or shape. */
|
|
102
|
+
export function parseServiceNativeGate(value, id) {
|
|
103
|
+
const state = value && typeof value === "object" ? value.state : undefined;
|
|
104
|
+
if (state !== "open" && state !== "frozen")
|
|
105
|
+
return invalid("native gate has no service state");
|
|
106
|
+
const o = closedRecord(value, GATE_FIELDS[state], shapeFail(`${state} native gate`));
|
|
107
|
+
assertMirror(o.serviceCustody, id.digest, () => invalid("native gate mirror is missing or mismatched"));
|
|
108
|
+
if (o.lifecycleUid !== id.lifecycleUid)
|
|
109
|
+
invalid("native gate belongs to another UID");
|
|
110
|
+
if (state === "open") {
|
|
111
|
+
if (o.generation !== 1)
|
|
112
|
+
invalid("open native gate is not at generation 1");
|
|
113
|
+
return { lifecycleUid: id.lifecycleUid, state, generation: 1, serviceCustody: { ...id.mirror } };
|
|
114
|
+
}
|
|
115
|
+
const op = closedRecord(o.op, ["opId", "kind"], shapeFail("native gate operation"));
|
|
116
|
+
// Activation freezes only the initial generation 0; a cancellation keeps the generation it froze.
|
|
117
|
+
if (!lifecycleToken(op.opId) || !(op.kind === "activation" ? o.generation === 0 : op.kind === "service-cancel" && (o.generation === 0 || o.generation === 1)))
|
|
118
|
+
invalid("frozen native gate has invalid coordinates");
|
|
119
|
+
return { lifecycleUid: id.lifecycleUid, state, generation: o.generation, serviceCustody: { ...id.mirror }, op: { opId: op.opId, kind: op.kind } };
|
|
120
|
+
}
|
|
121
|
+
/** Parse the native root row of this UID. Throws `failed-precondition` for any other identity or shape. */
|
|
122
|
+
export function parseServiceNativeRoot(value, id, credentialId) {
|
|
123
|
+
const o = closedRecord(value, ROOT_FIELDS, shapeFail("native root"));
|
|
124
|
+
assertMirror(o.serviceCustody, id.digest, () => invalid("native root mirror is missing or mismatched"));
|
|
125
|
+
if (o.credentialId !== credentialId || o.lifecycleUid !== id.lifecycleUid || o.holderPrincipal !== id.holderPrincipal
|
|
126
|
+
|| !Array.isArray(o.sourceChain) || o.sourceChain.length !== 1 || o.sourceChain[0] !== "root"
|
|
127
|
+
|| (o.state !== "active" && o.state !== "revoked") || !positiveSafe(o.exp))
|
|
128
|
+
invalid("native root does not bind this immutable service identity");
|
|
129
|
+
return { credentialId, holderPrincipal: id.holderPrincipal, lifecycleUid: id.lifecycleUid, sourceChain: ["root"], state: o.state, exp: o.exp, serviceCustody: { ...id.mirror } };
|
|
130
|
+
}
|
|
131
|
+
/** Encode one record, refusing bytes its own parser would not read back to the same value. */
|
|
132
|
+
export function encodeRoundTrip(value, parse) {
|
|
133
|
+
const text = JSON.stringify(value);
|
|
134
|
+
if (contractDigest(parse(JSON.parse(text))) !== contractDigest(value))
|
|
135
|
+
invalid("encoder produced a row its parser reads differently");
|
|
136
|
+
return new TextEncoder().encode(text);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=service-custody-shapes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-custody-shapes.js","sourceRoot":"","sources":["../src/service-custody-shapes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type ServiceUidCustodyV1 } from "@cotal-ai/core";
|
|
2
|
+
import { type LifecycleRegistry } from "./lifecycle-registry.js";
|
|
3
|
+
import { type PlaneClaimHold } from "./plane-claim.js";
|
|
4
|
+
/** One broker request, clipped to the remaining original deadline. */
|
|
5
|
+
export declare const S1_REQUEST_TIMEOUT_MS = 5000;
|
|
6
|
+
/** Re-reads after a CAS loss before a step holds. */
|
|
7
|
+
export declare const S1_MAX_CAS_REDECIDE = 4;
|
|
8
|
+
/** Re-pins of a byte-identical open native gate after a sibling's touch. */
|
|
9
|
+
export declare const S1_MAX_GATE_REPIN = 8;
|
|
10
|
+
/** Classify-then-retry rounds for a write whose outcome is unknown. */
|
|
11
|
+
export declare const S1_MAX_UNKNOWN_ROUNDS = 3;
|
|
12
|
+
export interface ServiceCustodyHost {
|
|
13
|
+
readonly space: string;
|
|
14
|
+
readonly accountPublicKey: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ServiceBootstrapIntent {
|
|
17
|
+
readonly lifecycleUid: string;
|
|
18
|
+
readonly notAfterMs: number;
|
|
19
|
+
}
|
|
20
|
+
export interface ServiceCancelIntent {
|
|
21
|
+
readonly lifecycleUid: string;
|
|
22
|
+
readonly opId: string;
|
|
23
|
+
}
|
|
24
|
+
export type ServiceCustodyHeld = {
|
|
25
|
+
kind: "held";
|
|
26
|
+
reason: string;
|
|
27
|
+
step: string;
|
|
28
|
+
detail: string;
|
|
29
|
+
opId: string;
|
|
30
|
+
};
|
|
31
|
+
export type ServiceBootstrapResult = {
|
|
32
|
+
kind: "active";
|
|
33
|
+
root: {
|
|
34
|
+
credentialId: string;
|
|
35
|
+
expMs: number;
|
|
36
|
+
};
|
|
37
|
+
} | {
|
|
38
|
+
kind: "cancelled";
|
|
39
|
+
opId: string;
|
|
40
|
+
} | {
|
|
41
|
+
kind: "endpoint-revoked";
|
|
42
|
+
} | {
|
|
43
|
+
kind: "uid-burned";
|
|
44
|
+
} | {
|
|
45
|
+
kind: "identity-collision";
|
|
46
|
+
} | {
|
|
47
|
+
kind: "name-unbound";
|
|
48
|
+
} | ServiceCustodyHeld;
|
|
49
|
+
export type ServiceCancelResult = {
|
|
50
|
+
kind: "pending";
|
|
51
|
+
phase: "cancelled-nonterminal";
|
|
52
|
+
root: "none" | "revoked" | "retained-stamped";
|
|
53
|
+
rootDetail?: "created-revoked" | "cas-revoked" | "already-revoked";
|
|
54
|
+
opId: string;
|
|
55
|
+
} | {
|
|
56
|
+
kind: "uid-unconfirmed";
|
|
57
|
+
held: true;
|
|
58
|
+
opId: string;
|
|
59
|
+
} | {
|
|
60
|
+
kind: "uid-foreign";
|
|
61
|
+
} | {
|
|
62
|
+
kind: "foreign-operation";
|
|
63
|
+
opId: string;
|
|
64
|
+
} | ServiceCustodyHeld;
|
|
65
|
+
/** The one trusted composition: a genuine registry, a genuine hold for the same space, the
|
|
66
|
+
* configured account, and a fatal latch only the returned `trip` sets. The held check is the
|
|
67
|
+
* closure captured when the hold was acquired, never the hold's mutable `guard` field. */
|
|
68
|
+
export declare function openServiceCustodyHost(opts: {
|
|
69
|
+
registry: LifecycleRegistry;
|
|
70
|
+
hold: PlaneClaimHold;
|
|
71
|
+
accountPublicKey: string;
|
|
72
|
+
}): {
|
|
73
|
+
host: ServiceCustodyHost;
|
|
74
|
+
trip(reason: string): void;
|
|
75
|
+
};
|
|
76
|
+
/** Seal the original admitted bootstrap material once. `notAfterMs` is the creation authority's
|
|
77
|
+
* fixed deadline; the writer never defaults, extends or resets it. */
|
|
78
|
+
export declare function sealServiceBootstrapIntent(host: ServiceCustodyHost, input: {
|
|
79
|
+
reservation: ServiceUidCustodyV1;
|
|
80
|
+
notAfterMs: number;
|
|
81
|
+
}): ServiceBootstrapIntent;
|
|
82
|
+
/** Seal an accepted cancellation of this exact reservation. The intent itself does not expire. */
|
|
83
|
+
export declare function sealServiceCancelIntent(host: ServiceCustodyHost, input: {
|
|
84
|
+
reservation: ServiceUidCustodyV1;
|
|
85
|
+
opId: string;
|
|
86
|
+
requestDigest: string;
|
|
87
|
+
}): ServiceCancelIntent;
|
|
88
|
+
/** Bootstrap the exact sealed reservation toward an active stamped root, resuming any durable
|
|
89
|
+
* progress of the same creation. Every request is bounded by the intent's original deadline. */
|
|
90
|
+
export declare function runServiceBootstrap(intent: ServiceBootstrapIntent): Promise<ServiceBootstrapResult>;
|
|
91
|
+
/** Run one bounded invocation of an accepted cancellation. `deadlineMs` bounds this invocation
|
|
92
|
+
* only; the same intent may be invoked again and resumes its own durable progress. */
|
|
93
|
+
export declare function cancelServiceCustody(intent: ServiceCancelIntent, opts: {
|
|
94
|
+
deadlineMs: number;
|
|
95
|
+
}): Promise<ServiceCancelResult>;
|
|
96
|
+
//# sourceMappingURL=service-custody.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-custody.d.ts","sourceRoot":"","sources":["../src/service-custody.ts"],"names":[],"mappings":"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"}
|