@cotal-ai/auth 0.87.0 → 0.89.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.
@@ -0,0 +1,44 @@
1
+ import { type AnchorResolver, type SecretStore, type ToolResultConsent } from "@cotal-ai/core";
2
+ import type { KV } from "@nats-io/kv";
3
+ import { type IdpConfig } from "./idp.js";
4
+ /** Provisioned by the trusted host. The seed is read only inside the auth process. */
5
+ export declare const toolResultConsentKey: (space: string) => string;
6
+ export interface ToolResultConsentInput {
7
+ id: string;
8
+ idpToken: string;
9
+ subject: string;
10
+ accountPublicKey: string;
11
+ holder: {
12
+ actor: string;
13
+ lifecycleUid: string;
14
+ };
15
+ target: {
16
+ owner: string;
17
+ actor: string;
18
+ lifecycleUid: string;
19
+ };
20
+ ttlMs: number;
21
+ }
22
+ export interface ToolResultConsentSignerOptions {
23
+ keyId: string;
24
+ /** Fresh account-local anchor resolution, injected only by the trusted composition. */
25
+ resolveAnchor: AnchorResolver;
26
+ }
27
+ export type ToolResultConsentRecorder = (consent: ToolResultConsent) => Promise<void>;
28
+ /** Closed host envelope. Owner, scope and timestamps cannot be supplied for the holder. */
29
+ export declare function parseToolResultConsentInput(raw: unknown): ToolResultConsentInput;
30
+ /** Native atomic create, without a retry or a success classification after a lost acknowledgement. */
31
+ export declare function makeToolResultConsentRecorder(kv: Pick<KV, "put">, fence: () => void, space: string): ToolResultConsentRecorder;
32
+ /** Sign and record within the host process. Nothing returns until the create-only write succeeds. */
33
+ export declare function createToolResultConsentSigner(deps: {
34
+ space: string;
35
+ accountPublicKey: string;
36
+ dir: string;
37
+ store: SecretStore;
38
+ idp: IdpConfig;
39
+ ownerSecret: string | Uint8Array;
40
+ signer: ToolResultConsentSignerOptions;
41
+ record: ToolResultConsentRecorder;
42
+ now?: () => number;
43
+ }): (raw: unknown) => Promise<ToolResultConsent>;
44
+ //# sourceMappingURL=tool-result-consent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result-consent.d.ts","sourceRoot":"","sources":["../src/tool-result-consent.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGtC,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAGtE,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,KAAG,MAAoE,CAAC;AAC1H,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,aAAa,EAAE,cAAc,CAAC;CAC/B;AACD,MAAM,MAAM,yBAAyB,GAAG,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAOtF,2FAA2F;AAC3F,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAchF;AAED,sGAAsG;AACtG,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,yBAAyB,CAa9H;AAED,qGAAqG;AACrG,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,KAAK,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,SAAS,CAAC;IACzF,WAAW,EAAE,MAAM,GAAG,UAAU,CAAC;IAAC,MAAM,EAAE,8BAA8B,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACjI,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAsD/C"}
@@ -0,0 +1,135 @@
1
+ import { fromSeed } from "@nats-io/nkeys";
2
+ import { EpEnvelopeError, assertDerivedOwnerToken, assertLifecycleToken, assertValidOwnerToken, canonicalJson, isCasLoss, parseToolResultConsent, resolveToolResultConsentAnchor, signArtifact, verifyArtifactSignature, TOOL_RESULT_CONSENT_MAX_TTL_MS } from "@cotal-ai/core";
3
+ import { spaceSegment } from "@cotal-ai/workspace";
4
+ import { deriveOwnerForIdpSubject } from "./derive.js";
5
+ import { verifyToolResultHumanProof } from "./idp.js";
6
+ import { findInteractiveActor, findManagedActor } from "./ledger.js";
7
+ /** Provisioned by the trusted host. The seed is read only inside the auth process. */
8
+ export const toolResultConsentKey = (space) => `auth/${spaceSegment(space)}/tool-result-consent-key.json`;
9
+ function fail(code, message) {
10
+ throw new EpEnvelopeError(code, message, undefined, "not-executed");
11
+ }
12
+ const rec = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
13
+ const exact = (v, keys) => rec(v) && Object.keys(v).length === keys.length && keys.every(k => Object.hasOwn(v, k));
14
+ /** Closed host envelope. Owner, scope and timestamps cannot be supplied for the holder. */
15
+ export function parseToolResultConsentInput(raw) {
16
+ if (!exact(raw, ["id", "idpToken", "subject", "accountPublicKey", "holder", "target", "ttlMs"]) ||
17
+ !exact(raw.holder, ["actor", "lifecycleUid"]) || !exact(raw.target, ["owner", "actor", "lifecycleUid"]) ||
18
+ typeof raw.id !== "string" || !/^[A-Za-z0-9_-]{1,200}$/.test(raw.id) ||
19
+ typeof raw.idpToken !== "string" || !raw.idpToken || raw.idpToken.length > 16_384 ||
20
+ typeof raw.subject !== "string" || !raw.subject || raw.subject.length > 512 ||
21
+ typeof raw.accountPublicKey !== "string" || typeof raw.ttlMs !== "number" || !Number.isSafeInteger(raw.ttlMs) || raw.ttlMs <= 0 || raw.ttlMs > TOOL_RESULT_CONSENT_MAX_TTL_MS)
22
+ fail("bad-request", "invalid closed tool-result consent request");
23
+ try {
24
+ assertDerivedOwnerToken(raw.target.owner);
25
+ assertValidOwnerToken(raw.target.actor);
26
+ assertValidOwnerToken(raw.holder.actor);
27
+ assertLifecycleToken(raw.target.lifecycleUid);
28
+ assertLifecycleToken(raw.holder.lifecycleUid);
29
+ }
30
+ catch {
31
+ fail("bad-request", "invalid consent principal or lifecycle");
32
+ }
33
+ return JSON.parse(canonicalJson(raw));
34
+ }
35
+ /** Native atomic create, without a retry or a success classification after a lost acknowledgement. */
36
+ export function makeToolResultConsentRecorder(kv, fence, space) {
37
+ return async (consent) => {
38
+ parseToolResultConsent(consent);
39
+ if (consent.space !== space)
40
+ fail("permission-denied", "consent record belongs to another space");
41
+ fence();
42
+ try {
43
+ await kv.put(`consent.${consent.id}`, new TextEncoder().encode(JSON.stringify(consent)), { previousSeq: 0 });
44
+ }
45
+ catch (error) {
46
+ if (isCasLoss(error))
47
+ throw new EpEnvelopeError("conflict", "consent id is already recorded", undefined, "not-executed");
48
+ throw new EpEnvelopeError("unavailable", "consent persistence outcome is unknown; no automatic retry", undefined, "unknown");
49
+ }
50
+ try {
51
+ fence();
52
+ }
53
+ catch {
54
+ throw new EpEnvelopeError("unavailable", "consent recorded but authority fenced before release", undefined, "unknown");
55
+ }
56
+ };
57
+ }
58
+ /** Sign and record within the host process. Nothing returns until the create-only write succeeds. */
59
+ export function createToolResultConsentSigner(deps) {
60
+ return async (raw) => {
61
+ const input = parseToolResultConsentInput(raw);
62
+ if (input.accountPublicKey !== deps.accountPublicKey)
63
+ fail("permission-denied", "consent account mismatch");
64
+ let proof;
65
+ try {
66
+ proof = await verifyToolResultHumanProof(input.idpToken, deps.idp, deps.now);
67
+ }
68
+ catch {
69
+ fail("permission-denied", "fresh signed password proof required");
70
+ }
71
+ const owner = deriveOwnerForIdpSubject(deps.ownerSecret, deps.idp.issuer, proof.sub);
72
+ const current = () => {
73
+ const now = (deps.now ?? Date.now)();
74
+ if (!Number.isSafeInteger(now) || now < 0 || now < proof.authTime * 1000 || now - proof.authTime * 1000 > 300_000 || now >= proof.exp * 1000)
75
+ fail("permission-denied", "fresh signed password proof required");
76
+ if (proof.sub !== input.subject || input.target.owner !== owner || input.target.actor === input.holder.actor)
77
+ fail("permission-denied", "consent requires the same verified owner and an interactive holder");
78
+ const holder = findInteractiveActor(deps.dir, owner, input.holder.actor);
79
+ const target = findManagedActor(deps.dir, owner, input.target.actor);
80
+ if (!holder || holder.lifecycleUid !== input.holder.lifecycleUid || !target || target.lifecycleUid !== input.target.lifecycleUid)
81
+ fail("permission-denied", "consent holder or managed target lifecycle is not current");
82
+ return now;
83
+ };
84
+ current();
85
+ let stored;
86
+ try {
87
+ const value = await deps.store.get(toolResultConsentKey(deps.space));
88
+ stored = value === undefined ? undefined : JSON.parse(value);
89
+ }
90
+ catch {
91
+ fail("unavailable", "consent signing material unavailable");
92
+ }
93
+ if (!exact(stored, ["ver", "keyId", "seed"]) || stored.ver !== 1 || stored.keyId !== deps.signer.keyId || typeof stored.seed !== "string")
94
+ fail("unavailable", "consent signing material unavailable");
95
+ const now = current();
96
+ const anchor = await resolveToolResultConsentAnchor(deps.signer.resolveAnchor, deps.signer.keyId, now);
97
+ let signed;
98
+ try {
99
+ const key = fromSeed(new TextEncoder().encode(stored.seed));
100
+ try {
101
+ if (key.getPublicKey() !== anchor.publicKey)
102
+ fail("unavailable", "consent signing key does not match its anchor");
103
+ const iat = current();
104
+ if (iat < anchor.validFrom || iat > anchor.validTo)
105
+ fail("permission-denied", "consent anchor is no longer current");
106
+ signed = parseToolResultConsent(signArtifact({ v: 1, kind: "tool-result-consent", id: input.id, space: deps.space,
107
+ target: input.target, holder: { owner, actor: input.holder.actor }, iat, exp: iat + input.ttlMs, issuer: { keyId: deps.signer.keyId } }, key));
108
+ verifyArtifactSignature(signed, anchor);
109
+ }
110
+ finally {
111
+ key.clear();
112
+ }
113
+ }
114
+ catch (error) {
115
+ if (error instanceof EpEnvelopeError)
116
+ throw error;
117
+ fail("unavailable", "consent signing failed");
118
+ }
119
+ current();
120
+ await deps.record(signed);
121
+ try {
122
+ current();
123
+ const releasedAnchor = await resolveToolResultConsentAnchor(deps.signer.resolveAnchor, deps.signer.keyId, signed.iat);
124
+ verifyArtifactSignature(signed, releasedAnchor);
125
+ current();
126
+ if ((deps.now ?? Date.now)() >= signed.exp)
127
+ throw new Error("expired before release");
128
+ }
129
+ catch {
130
+ throw new EpEnvelopeError("unavailable", "consent recorded but release authority changed", undefined, "unknown");
131
+ }
132
+ return signed;
133
+ };
134
+ }
135
+ //# sourceMappingURL=tool-result-consent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result-consent.js","sourceRoot":"","sources":["../src/tool-result-consent.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cotal-ai/auth",
3
3
  "description": "Cotal per-user auth bridge: opaque owner-token derivation and strict user-token validation for the NATS auth-callout cutover (Plane 1 ↔ Plane 2).",
4
- "version": "0.87.0",
4
+ "version": "0.89.0",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -18,9 +18,9 @@
18
18
  }
19
19
  },
20
20
  "dependencies": {
21
- "@cotal-ai/core": "0.87.0",
22
- "@cotal-ai/lang": "0.87.0",
23
- "@cotal-ai/workspace": "0.87.0",
21
+ "@cotal-ai/core": "0.89.0",
22
+ "@cotal-ai/lang": "0.89.0",
23
+ "@cotal-ai/workspace": "0.89.0",
24
24
  "@nats-io/jwt": "0.0.10-5",
25
25
  "@nats-io/nkeys": "^2.0.3",
26
26
  "@nats-io/transport-node": "^3.4.0",