@agent-network-protocol/dsh-anp-identity 0.1.6 → 0.1.8
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/BOUNDARY.md +30 -5
- package/PUBLICATION.md +181 -0
- package/README.md +73 -1
- package/README.zh.md +44 -1
- package/V7-MANAGEMENT.md +18 -0
- package/cordis.patch.yml +9 -0
- package/examples/fresh-bootstrap.cordis.patch.yml +38 -0
- package/lib/authorization-types.d.ts +6 -0
- package/lib/authorization-types.d.ts.map +1 -1
- package/lib/authorization.d.ts.map +1 -1
- package/lib/authorization.js +23 -6
- package/lib/authorization.js.map +1 -1
- package/lib/catalog.d.ts +3 -1
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +15 -3
- package/lib/catalog.js.map +1 -1
- package/lib/client/controller.d.ts +18 -0
- package/lib/client/controller.d.ts.map +1 -1
- package/lib/client/controller.js +89 -5
- package/lib/client/controller.js.map +1 -1
- package/lib/client/views.d.ts.map +1 -1
- package/lib/client/views.js +37 -6
- package/lib/client/views.js.map +1 -1
- package/lib/client-metadata.d.ts +3 -0
- package/lib/client-metadata.d.ts.map +1 -0
- package/lib/client-metadata.js +11 -0
- package/lib/client-metadata.js.map +1 -0
- package/lib/client.js +260 -14
- package/lib/client.js.map +4 -4
- package/lib/host-management-secret.d.ts +41 -0
- package/lib/host-management-secret.d.ts.map +1 -0
- package/lib/host-management-secret.js +92 -0
- package/lib/host-management-secret.js.map +1 -0
- package/lib/index.d.ts +73 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +331 -22
- package/lib/index.js.map +1 -1
- package/lib/initial-registration-proof.d.ts +13 -0
- package/lib/initial-registration-proof.d.ts.map +1 -0
- package/lib/initial-registration-proof.js +48 -0
- package/lib/initial-registration-proof.js.map +1 -0
- package/lib/installed-consumer.d.ts +25 -0
- package/lib/installed-consumer.d.ts.map +1 -0
- package/lib/installed-consumer.js +66 -0
- package/lib/installed-consumer.js.map +1 -0
- package/lib/management-credentials.d.ts +15 -0
- package/lib/management-credentials.d.ts.map +1 -0
- package/lib/management-credentials.js +126 -0
- package/lib/management-credentials.js.map +1 -0
- package/lib/management-driver.d.ts +83 -0
- package/lib/management-driver.d.ts.map +1 -0
- package/lib/management-driver.js +405 -0
- package/lib/management-driver.js.map +1 -0
- package/lib/management-remote.d.ts +27 -1
- package/lib/management-remote.d.ts.map +1 -1
- package/lib/management-remote.js +69 -3
- package/lib/management-remote.js.map +1 -1
- package/lib/management-types.d.ts +7 -0
- package/lib/management-types.d.ts.map +1 -1
- package/lib/pap-callback.d.ts +110 -0
- package/lib/pap-callback.d.ts.map +1 -0
- package/lib/pap-callback.js +51 -0
- package/lib/pap-callback.js.map +1 -0
- package/lib/protocol-bootstrap.d.ts +24 -0
- package/lib/protocol-bootstrap.d.ts.map +1 -0
- package/lib/protocol-bootstrap.js +34 -0
- package/lib/protocol-bootstrap.js.map +1 -0
- package/lib/protocol-client.d.ts +137 -0
- package/lib/protocol-client.d.ts.map +1 -0
- package/lib/protocol-client.js +11 -0
- package/lib/protocol-client.js.map +1 -0
- package/lib/provider-api.d.ts +6 -2
- package/lib/provider-api.d.ts.map +1 -1
- package/lib/provider-api.js.map +1 -1
- package/lib/publication-http.d.ts +19 -0
- package/lib/publication-http.d.ts.map +1 -0
- package/lib/publication-http.js +183 -0
- package/lib/publication-http.js.map +1 -0
- package/lib/publication-types.d.ts +161 -0
- package/lib/publication-types.d.ts.map +1 -0
- package/lib/publication-types.js +35 -0
- package/lib/publication-types.js.map +1 -0
- package/lib/publication.d.ts +21 -0
- package/lib/publication.d.ts.map +1 -0
- package/lib/publication.js +235 -0
- package/lib/publication.js.map +1 -0
- package/lib/registration-bootstrap.d.ts +56 -0
- package/lib/registration-bootstrap.d.ts.map +1 -0
- package/lib/registration-bootstrap.js +523 -0
- package/lib/registration-bootstrap.js.map +1 -0
- package/lib/registration-service-settings.d.ts +12 -0
- package/lib/registration-service-settings.d.ts.map +1 -0
- package/lib/registration-service-settings.js +124 -0
- package/lib/registration-service-settings.js.map +1 -0
- package/lib/registration-service-types.d.ts +11 -0
- package/lib/registration-service-types.d.ts.map +1 -0
- package/lib/registration-service-types.js +3 -0
- package/lib/registration-service-types.js.map +1 -0
- package/lib/remote.d.ts.map +1 -1
- package/lib/remote.js +11 -2
- package/lib/remote.js.map +1 -1
- package/lib/target-policy.d.ts +35 -0
- package/lib/target-policy.d.ts.map +1 -0
- package/lib/target-policy.js +319 -0
- package/lib/target-policy.js.map +1 -0
- package/lib/user-client.d.ts +6 -0
- package/lib/user-client.d.ts.map +1 -1
- package/lib/user-client.js.map +1 -1
- package/lib/user-operation.d.ts.map +1 -1
- package/lib/user-operation.js +9 -0
- package/lib/user-operation.js.map +1 -1
- package/lib/user-service.d.ts +8 -1
- package/lib/user-service.d.ts.map +1 -1
- package/lib/user-service.js +58 -4
- package/lib/user-service.js.map +1 -1
- package/package.json +51 -29
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Public material state only. Credentials and assertions never enter the catalog. */
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
const LegacyPublicJwkSchema = z.object({
|
|
4
|
+
kty: z.literal('OKP'), crv: z.literal('Ed25519'), x: z.string().regex(/^[A-Za-z0-9_-]{43}$/u),
|
|
5
|
+
kid: z.string().min(1).max(1024), alg: z.literal('EdDSA'), use: z.literal('sig'),
|
|
6
|
+
}).strict();
|
|
7
|
+
export const EcPublicJwkSchema = z.object({
|
|
8
|
+
kty: z.literal('EC'), crv: z.literal('P-256'), x: z.string().regex(/^[A-Za-z0-9_-]{43}$/u),
|
|
9
|
+
y: z.string().regex(/^[A-Za-z0-9_-]{43}$/u), kid: z.string().min(1).max(1024),
|
|
10
|
+
alg: z.literal('ES256'), use: z.literal('sig'),
|
|
11
|
+
}).strict();
|
|
12
|
+
export const PublicJwkSchema = z.union([LegacyPublicJwkSchema, EcPublicJwkSchema]);
|
|
13
|
+
export const PublicationCapabilitiesSchema = z.object({
|
|
14
|
+
mcpMachine: z.boolean(), papSession: z.boolean(), papAccount: z.boolean(),
|
|
15
|
+
}).strict().refine(v => (v.mcpMachine || v.papSession) && (!v.papAccount || v.papSession), 'Invalid capability combination');
|
|
16
|
+
/** Derive the server profile from actual enabled capabilities. */
|
|
17
|
+
export function publicationProfile(v) {
|
|
18
|
+
return [v.mcpMachine ? 'mcp_machine' : '', v.papAccount ? 'pap_account' : v.papSession ? 'pap_session' : ''].filter(Boolean).join('_');
|
|
19
|
+
}
|
|
20
|
+
export const PublicationConfigSchema = z.object({
|
|
21
|
+
backend: z.string().min(1).max(128), documentId: z.string().regex(/^[A-Za-z0-9_-]{1,128}$/u),
|
|
22
|
+
clientName: z.string().trim().min(1).max(128), redirectUris: z.array(z.string().max(2048)).max(8),
|
|
23
|
+
capabilities: PublicationCapabilitiesSchema.optional(), activeKid: z.string().min(1).max(1024).optional(),
|
|
24
|
+
}).strict();
|
|
25
|
+
export const PublicationRecordSchema = z.object({
|
|
26
|
+
config: PublicationConfigSchema, operationId: z.string().regex(/^[A-Za-z0-9_-]{1,128}$/u),
|
|
27
|
+
expectedVersion: z.number().int().nonnegative(), state: z.enum(['awaiting_configuration', 'publishing', 'published', 'failed']),
|
|
28
|
+
clientId: z.string().max(2048), version: z.number().int().nonnegative(),
|
|
29
|
+
key: PublicJwkSchema,
|
|
30
|
+
metadata: z.string().max(16384).optional(), jwks: z.string().max(16384).optional(),
|
|
31
|
+
metadataSha256: z.string().regex(/^[a-f0-9]{64}$/u).optional(),
|
|
32
|
+
failure: z.enum(['unavailable', 'publication_failed', 'material_mismatch']).optional(),
|
|
33
|
+
}).strict().refine(value => value.state !== 'published' ||
|
|
34
|
+
(!!value.metadata && !!value.jwks && !!value.metadataSha256 && value.version > 0), 'Incomplete published materials');
|
|
35
|
+
//# sourceMappingURL=publication-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication-types.js","sourceRoot":"","sources":["../src/publication-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { IdentityReference } from '@agent-network-protocol/anp-identity';
|
|
2
|
+
import type { ProviderLease } from '@agent-network-protocol/anp-identity/provider';
|
|
3
|
+
import { CatalogStore } from './catalog.js';
|
|
4
|
+
import { type PublicationBackend, type PublicationConfig, type PublicationRecord, type OAuthClientIdentity } from './publication-types.js';
|
|
5
|
+
export declare class PublicationCoordinator {
|
|
6
|
+
readonly store: CatalogStore;
|
|
7
|
+
readonly host: {
|
|
8
|
+
withNative<T>(operation: (native: ProviderLease) => Promise<T>): Promise<T>;
|
|
9
|
+
};
|
|
10
|
+
constructor(store: CatalogStore, host: {
|
|
11
|
+
withNative<T>(operation: (native: ProviderLease) => Promise<T>): Promise<T>;
|
|
12
|
+
});
|
|
13
|
+
status(reference: IdentityReference): Promise<OAuthClientIdentity>;
|
|
14
|
+
requirePublished(reference: IdentityReference): Promise<PublicationRecord>;
|
|
15
|
+
publish(reference: IdentityReference, raw: PublicationConfig, backend: PublicationBackend, assertActive: () => Promise<void>): Promise<OAuthClientIdentity>;
|
|
16
|
+
private materials;
|
|
17
|
+
private readBack;
|
|
18
|
+
private entry;
|
|
19
|
+
private save;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=publication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication.d.ts","sourceRoot":"","sources":["../src/publication.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,sCAAsC,CAAA;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAA;AAClF,OAAO,EAAE,YAAY,EAAgC,MAAM,cAAc,CAAA;AAGzE,OAAO,EACL,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAC9C,MAAM,wBAAwB,CAAA;AAgBnF,qBAAa,sBAAsB;IACrB,QAAQ,CAAC,KAAK,EAAE,YAAY;IAAE,QAAQ,CAAC,IAAI,EAAE;QACvD,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;KAC5E;gBAFoB,KAAK,EAAE,YAAY,EAAW,IAAI,EAAE;QACvD,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;KAC5E;IAEK,MAAM,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAWlE,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAY1E,OAAO,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,kBAAkB,EAC7F,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA0GlE,OAAO,CAAC,SAAS;YAwBH,QAAQ;YAOR,KAAK;YAML,IAAI;CAOnB"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/** Recoverable Host publication coordinator, sharing the existing identity and catalog. */
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { mkdir } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import lockfile from 'proper-lockfile';
|
|
6
|
+
import { CatalogStore, findEntry } from './catalog.js';
|
|
7
|
+
import { pluginError } from './errors.js';
|
|
8
|
+
import { exactHttps, parsePublicJson, publicationRedirectUri } from './publication-http.js';
|
|
9
|
+
import { PublicationConfigSchema, PublicJwkSchema, publicationProfile } from './publication-types.js';
|
|
10
|
+
const sha = (value) => createHash('sha256').update(value).digest('hex');
|
|
11
|
+
function sameKey(left, right) {
|
|
12
|
+
const result = PublicJwkSchema.safeParse(left);
|
|
13
|
+
return result.success && Object.keys(result.data).every(key => result.data[key] === right[key]);
|
|
14
|
+
}
|
|
15
|
+
function binding(identity, record) {
|
|
16
|
+
const services = identity.document.service ?? [];
|
|
17
|
+
const matches = services.filter(service => service.type === 'ANPCIMD');
|
|
18
|
+
const service = matches[0];
|
|
19
|
+
if (matches.length !== 1 || !service || service.serviceEndpoint !== record.clientId
|
|
20
|
+
|| service.anp_metadata_sha256 !== record.metadataSha256
|
|
21
|
+
|| JSON.stringify(service.anp_oauth_keys) !== JSON.stringify([record.key.kid]))
|
|
22
|
+
throw pluginError('provider_incompatible');
|
|
23
|
+
}
|
|
24
|
+
export class PublicationCoordinator {
|
|
25
|
+
store;
|
|
26
|
+
host;
|
|
27
|
+
constructor(store, host) {
|
|
28
|
+
this.store = store;
|
|
29
|
+
this.host = host;
|
|
30
|
+
}
|
|
31
|
+
async status(reference) {
|
|
32
|
+
const entry = await this.entry(reference);
|
|
33
|
+
const record = entry.publication;
|
|
34
|
+
if (!record)
|
|
35
|
+
return { state: 'local', did: reference.did };
|
|
36
|
+
if (record.state === 'published')
|
|
37
|
+
await this.requirePublished(reference);
|
|
38
|
+
return { state: record.state, did: reference.did, clientId: record.clientId,
|
|
39
|
+
...(record.metadata ? { jwksUri: parsePublicJson(record.metadata).jwks_uri } : {}),
|
|
40
|
+
keyId: record.key.kid, algorithm: record.key.alg, version: record.version, signerMode: 'local',
|
|
41
|
+
...(record.config.capabilities ? { capabilities: record.config.capabilities } : {}) };
|
|
42
|
+
}
|
|
43
|
+
async requirePublished(reference) {
|
|
44
|
+
const record = (await this.entry(reference)).publication;
|
|
45
|
+
if (!record || record.state !== 'published' || !record.metadata || sha(record.metadata) !== record.metadataSha256)
|
|
46
|
+
throw pluginError('provider_unavailable');
|
|
47
|
+
await this.host.withNative(async (native) => {
|
|
48
|
+
const identity = await native.publicIdentity(reference);
|
|
49
|
+
const key = await native.oauthPublicJwk(reference, record.key.kid);
|
|
50
|
+
if (!sameKey(key, record.key))
|
|
51
|
+
throw pluginError('provider_incompatible');
|
|
52
|
+
binding(identity, record);
|
|
53
|
+
});
|
|
54
|
+
return structuredClone(record);
|
|
55
|
+
}
|
|
56
|
+
async publish(reference, raw, backend, assertActive) {
|
|
57
|
+
const parsed = PublicationConfigSchema.safeParse(raw);
|
|
58
|
+
if (!parsed.success)
|
|
59
|
+
throw pluginError('invalid_request');
|
|
60
|
+
const config = parsed.data;
|
|
61
|
+
exactHttps(backend.origin);
|
|
62
|
+
config.redirectUris.forEach(uri => publicationRedirectUri(uri, config.capabilities));
|
|
63
|
+
if (new Set(config.redirectUris).size !== config.redirectUris.length)
|
|
64
|
+
throw pluginError('invalid_request');
|
|
65
|
+
const clientId = exactHttps(await backend.clientId(config.documentId), true);
|
|
66
|
+
if (new URL(clientId).origin !== backend.origin)
|
|
67
|
+
throw pluginError('invalid_request');
|
|
68
|
+
const lockRoot = join(this.store.stateRoot, 'journal', 'publication', sha(JSON.stringify(reference)));
|
|
69
|
+
await mkdir(lockRoot, { recursive: true, mode: 0o700 });
|
|
70
|
+
const release = await lockfile.lock(lockRoot, { realpath: false, stale: 60000, update: 10000,
|
|
71
|
+
retries: { retries: 50, minTimeout: 20, maxTimeout: 100 } });
|
|
72
|
+
try {
|
|
73
|
+
await assertActive();
|
|
74
|
+
const previous = (await this.entry(reference)).publication;
|
|
75
|
+
const key = PublicJwkSchema.parse(await this.host.withNative(async (native) => {
|
|
76
|
+
if (!config.capabilities) {
|
|
77
|
+
const identity = await native.publicIdentity(reference);
|
|
78
|
+
const candidates = identity.activeKeys.filter(key => key.algorithm === 'ed25519' && key.purposes.includes('authentication') && !key.purposes.includes('device_assertion'));
|
|
79
|
+
const selected = config.activeKid ?? previous?.key.kid ?? (candidates.length === 1 ? candidates[0].kid : undefined);
|
|
80
|
+
if (!selected)
|
|
81
|
+
throw pluginError('provider_incompatible');
|
|
82
|
+
return native.oauthPublicJwk(reference, selected);
|
|
83
|
+
}
|
|
84
|
+
if (!config.activeKid || !config.activeKid.startsWith(reference.did + '#'))
|
|
85
|
+
throw pluginError('invalid_request');
|
|
86
|
+
try {
|
|
87
|
+
return await native.oauthPublicJwk(reference, config.activeKid);
|
|
88
|
+
}
|
|
89
|
+
catch { /* An unenrolled selected key must first pass the authorized DID update. */ }
|
|
90
|
+
const provider = native;
|
|
91
|
+
if (typeof provider.prepareOAuthKeyChange !== 'function' || typeof provider.exportCandidateOAuthPublicJwk !== 'function')
|
|
92
|
+
throw pluginError('provider_incompatible');
|
|
93
|
+
const identity = await native.publicIdentity(reference);
|
|
94
|
+
const session = await native.resumeDocumentChange(reference) ?? await provider.prepareOAuthKeyChange(reference, {
|
|
95
|
+
fragment: config.activeKid.slice(reference.did.length + 1), operation_id: 'oauth-key-' + sha(config.activeKid).slice(0, 48), expected_revision: identity.revision,
|
|
96
|
+
});
|
|
97
|
+
const selected = PublicJwkSchema.parse(await provider.exportCandidateOAuthPublicJwk(reference, config.activeKid));
|
|
98
|
+
if (selected.alg !== 'ES256' || selected.kid !== config.activeKid)
|
|
99
|
+
throw pluginError('provider_incompatible');
|
|
100
|
+
await assertActive();
|
|
101
|
+
await backend.publishDocument(reference, session, assertActive);
|
|
102
|
+
if (await native.resumeDocumentChange(reference))
|
|
103
|
+
throw pluginError('provider_unavailable');
|
|
104
|
+
return native.oauthPublicJwk(reference, config.activeKid);
|
|
105
|
+
}));
|
|
106
|
+
if (config.capabilities && (key.alg !== 'ES256' || !config.activeKid || key.kid !== config.activeKid))
|
|
107
|
+
throw pluginError('provider_incompatible');
|
|
108
|
+
if (previous && previous.clientId !== clientId)
|
|
109
|
+
throw pluginError('invalid_request');
|
|
110
|
+
const same = previous && JSON.stringify(previous.config) === JSON.stringify(config) && sameKey(previous.key, key);
|
|
111
|
+
if (previous && previous.state !== 'published' && previous.state !== 'awaiting_configuration' && !same)
|
|
112
|
+
throw pluginError('catalog_conflict');
|
|
113
|
+
let record = same ? structuredClone(previous) : {
|
|
114
|
+
config, clientId, key, state: 'publishing', operationId: randomUUID(),
|
|
115
|
+
expectedVersion: previous?.version ?? 0, version: previous?.version ?? 0,
|
|
116
|
+
};
|
|
117
|
+
if (same && record.state === 'published') {
|
|
118
|
+
try {
|
|
119
|
+
await this.readBack(backend, record);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
await this.save(reference, { ...record, state: 'failed', failure: 'material_mismatch' });
|
|
123
|
+
throw pluginError('provider_unavailable');
|
|
124
|
+
}
|
|
125
|
+
return this.status(reference);
|
|
126
|
+
}
|
|
127
|
+
record = { ...record, state: (config.capabilities ? !config.capabilities.papAccount || config.redirectUris.length > 0 : config.redirectUris.length > 0) ? 'publishing' : 'awaiting_configuration' };
|
|
128
|
+
await this.save(reference, record);
|
|
129
|
+
if (record.state === 'awaiting_configuration')
|
|
130
|
+
return this.status(reference);
|
|
131
|
+
try {
|
|
132
|
+
await assertActive();
|
|
133
|
+
const prepared = await backend.prepare(config.documentId, {
|
|
134
|
+
operation_id: record.operationId, expected_version: record.expectedVersion,
|
|
135
|
+
client_name: config.clientName, redirect_uris: config.redirectUris,
|
|
136
|
+
...(config.capabilities ? { schema_version: 2,
|
|
137
|
+
capabilities: { mcp_machine: config.capabilities.mcpMachine, pap_session: config.capabilities.papSession, pap_account: config.capabilities.papAccount },
|
|
138
|
+
signing_keys: [key], active_kid: key.kid } : { key: key }),
|
|
139
|
+
});
|
|
140
|
+
record = this.materials(record, prepared);
|
|
141
|
+
await this.save(reference, record);
|
|
142
|
+
await this.host.withNative(async (native) => {
|
|
143
|
+
await assertActive();
|
|
144
|
+
const identity = await native.publicIdentity(reference);
|
|
145
|
+
let current = false;
|
|
146
|
+
try {
|
|
147
|
+
binding(identity, record);
|
|
148
|
+
current = true;
|
|
149
|
+
}
|
|
150
|
+
catch { /* Prepare/reconcile below. */ }
|
|
151
|
+
const pending = await native.resumeDocumentChange(reference);
|
|
152
|
+
if (pending || !current) {
|
|
153
|
+
const session = pending ?? await native.prepareDocumentChange(reference, { changes: [{
|
|
154
|
+
change: 'bind_oauth_client', clientId, kid: key.kid, metadataSha256: record.metadataSha256,
|
|
155
|
+
}] });
|
|
156
|
+
const candidate = await session.candidate();
|
|
157
|
+
binding({ ...identity, document: candidate.candidateDocument }, record);
|
|
158
|
+
await backend.publishDocument(reference, session, assertActive);
|
|
159
|
+
if (await native.resumeDocumentChange(reference))
|
|
160
|
+
throw pluginError('provider_unavailable');
|
|
161
|
+
binding(await native.publicIdentity(reference), record);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
await assertActive();
|
|
165
|
+
const activated = await backend.activate(config.documentId, record.operationId);
|
|
166
|
+
const accepted = this.materials(record, activated);
|
|
167
|
+
if (activated.state !== 'published' || accepted.version !== record.version
|
|
168
|
+
|| accepted.metadata !== record.metadata || accepted.jwks !== record.jwks)
|
|
169
|
+
throw pluginError('provider_incompatible');
|
|
170
|
+
await this.readBack(backend, record);
|
|
171
|
+
await assertActive();
|
|
172
|
+
await this.save(reference, { ...record, state: 'published' });
|
|
173
|
+
return this.status(reference);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
await this.save(reference, { ...record, state: 'failed', failure: 'publication_failed' }).catch(() => { });
|
|
177
|
+
throw pluginError('provider_unavailable');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
await release();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
materials(record, result) {
|
|
185
|
+
if (!['prepared', 'published'].includes(result.state) || result.client_id !== record.clientId
|
|
186
|
+
|| result.operation_id !== record.operationId || !Number.isSafeInteger(result.version) || result.version <= record.expectedVersion
|
|
187
|
+
|| typeof result.metadata !== 'string' || typeof result.jwks !== 'string'
|
|
188
|
+
|| result.metadata.length > 16384 || result.jwks.length > 16384 || sha(result.metadata) !== result.metadata_sha256)
|
|
189
|
+
throw pluginError('provider_incompatible');
|
|
190
|
+
if (record.config.capabilities && (result.schema_version !== 2 || result.profile !== publicationProfile(record.config.capabilities)
|
|
191
|
+
|| result.active_kid !== record.key.kid || result.key_set_digest !== sha(result.jwks)
|
|
192
|
+
|| !result.capabilities || result.capabilities.mcp_machine !== record.config.capabilities.mcpMachine
|
|
193
|
+
|| result.capabilities.pap_session !== record.config.capabilities.papSession || result.capabilities.pap_account !== record.config.capabilities.papAccount))
|
|
194
|
+
throw pluginError('provider_incompatible');
|
|
195
|
+
const metadata = parsePublicJson(result.metadata);
|
|
196
|
+
const jwks = parsePublicJson(result.jwks);
|
|
197
|
+
if (metadata.client_id !== record.clientId || typeof metadata.jwks_uri !== 'string' || new URL(exactHttps(metadata.jwks_uri, true)).origin !== new URL(record.clientId).origin
|
|
198
|
+
|| metadata.token_endpoint_auth_method !== 'private_key_jwt' || metadata.token_endpoint_auth_signing_alg !== record.key.alg
|
|
199
|
+
|| metadata.client_name !== record.config.clientName || JSON.stringify(metadata.redirect_uris) !== JSON.stringify(record.config.redirectUris)
|
|
200
|
+
|| JSON.stringify(metadata.grant_types) !== JSON.stringify(record.config.capabilities ? [
|
|
201
|
+
...(record.config.capabilities.mcpMachine ? ['client_credentials'] : []),
|
|
202
|
+
...(record.config.capabilities.papAccount ? ['authorization_code', 'refresh_token'] : []),
|
|
203
|
+
] : ['authorization_code']) || JSON.stringify(metadata.response_types) !== JSON.stringify(record.config.capabilities ? (record.config.capabilities.papAccount ? ['code'] : []) : ['code'])
|
|
204
|
+
|| !Array.isArray(jwks.keys) || jwks.keys.length !== 1 || !sameKey(jwks.keys[0], record.key))
|
|
205
|
+
throw pluginError('provider_incompatible');
|
|
206
|
+
const allowed = new Set(['client_id', 'jwks_uri', 'client_name', 'redirect_uris', 'grant_types', 'response_types', 'token_endpoint_auth_method', 'token_endpoint_auth_signing_alg']);
|
|
207
|
+
if (Object.keys(metadata).some(key => !allowed.has(key)) || Object.keys(jwks).some(key => key !== 'keys'))
|
|
208
|
+
throw pluginError('provider_incompatible');
|
|
209
|
+
return { ...record, version: result.version, metadata: result.metadata, jwks: result.jwks, metadataSha256: result.metadata_sha256 };
|
|
210
|
+
}
|
|
211
|
+
async readBack(backend, record) {
|
|
212
|
+
const [metadata, jwks] = await Promise.all([
|
|
213
|
+
backend.readPublic(record.config.documentId, 'client.json', record.clientId),
|
|
214
|
+
backend.readPublic(record.config.documentId, 'jwks.json', parsePublicJson(record.metadata).jwks_uri),
|
|
215
|
+
]);
|
|
216
|
+
if (metadata !== record.metadata || jwks !== record.jwks || sha(metadata) !== record.metadataSha256)
|
|
217
|
+
throw pluginError('provider_incompatible');
|
|
218
|
+
}
|
|
219
|
+
async entry(reference) {
|
|
220
|
+
const catalog = await this.store.load().catch(() => { throw pluginError('catalog_corrupt'); });
|
|
221
|
+
const entry = findEntry(catalog, reference);
|
|
222
|
+
if (!entry || entry.state !== 'active')
|
|
223
|
+
throw pluginError('identity_not_found');
|
|
224
|
+
return entry;
|
|
225
|
+
}
|
|
226
|
+
async save(reference, record) {
|
|
227
|
+
await this.store.mutate(catalog => {
|
|
228
|
+
const entry = findEntry(catalog, reference);
|
|
229
|
+
if (!entry || entry.state !== 'active')
|
|
230
|
+
throw pluginError('identity_not_found');
|
|
231
|
+
return { ...catalog, entries: catalog.entries.map(item => item === entry ? { ...item, publication: structuredClone(record) } : item) };
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=publication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publication.js","sourceRoot":"","sources":["../src/publication.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Private Host orchestration from a real creation approval to verified device publication. */
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import type { IdentityReference } from '@agent-network-protocol/anp-identity';
|
|
4
|
+
import type AnpIdentityService from './index.js';
|
|
5
|
+
import type { IdentityManagement } from './management-types.js';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
export declare const RegistrationBootstrapConfigSchema: z.ZodObject<{
|
|
8
|
+
id: z.ZodString;
|
|
9
|
+
requestId: z.ZodString;
|
|
10
|
+
stateRoot: z.ZodString;
|
|
11
|
+
origin: z.ZodDefault<z.ZodString>;
|
|
12
|
+
email: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
|
|
13
|
+
phone: z.ZodOptional<z.ZodString>;
|
|
14
|
+
clientName: z.ZodString;
|
|
15
|
+
capabilities: z.ZodDefault<z.ZodObject<{
|
|
16
|
+
mcpMachine: z.ZodBoolean;
|
|
17
|
+
papSession: z.ZodBoolean;
|
|
18
|
+
papAccount: z.ZodBoolean;
|
|
19
|
+
}, z.core.$strict>>;
|
|
20
|
+
redirectUris: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
21
|
+
managementAudience: z.ZodDefault<z.ZodString>;
|
|
22
|
+
pollIntervalMs: z.ZodDefault<z.ZodNumber>;
|
|
23
|
+
providerReadyTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
24
|
+
}, z.core.$strict>;
|
|
25
|
+
export type RegistrationBootstrapConfig = z.infer<typeof RegistrationBootstrapConfigSchema>;
|
|
26
|
+
export type RegistrationBootstrapInput = z.input<typeof RegistrationBootstrapConfigSchema>;
|
|
27
|
+
export type RegistrationBootstrapPhase = 'awaiting_approval' | 'awaiting_email_verification' | 'awaiting_phone_verification' | 'registering' | 'publishing' | 'published' | 'registration_uncertain' | 'blocked' | 'disposed';
|
|
28
|
+
export type RegistrationBootstrapReason = 'approval_unavailable' | 'approval_denied' | 'invalid_configuration' | 'credential_unavailable' | 'email_unavailable' | 'phone_unavailable' | 'provider_unavailable' | 'publication_failed' | 'client_upgrade_required';
|
|
29
|
+
/** Safe manager/UI projection; no factor, credential, key or remote response is returned. */
|
|
30
|
+
export interface RegistrationBootstrapStatus {
|
|
31
|
+
id: string;
|
|
32
|
+
requestId: string;
|
|
33
|
+
phase: RegistrationBootstrapPhase;
|
|
34
|
+
origin?: string;
|
|
35
|
+
clientVersion?: string;
|
|
36
|
+
reason?: RegistrationBootstrapReason;
|
|
37
|
+
reference?: IdentityReference;
|
|
38
|
+
clientId?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface RegistrationBootstrapController {
|
|
41
|
+
submitOtp(code: string): void;
|
|
42
|
+
status(): RegistrationBootstrapStatus;
|
|
43
|
+
dispose(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
/** Install the configured manager-owned flow. Its caller supplies the actual management facade and Context.
|
|
46
|
+
* @param options - Non-secret configuration, actual Host management authority and optional HTTP transport.
|
|
47
|
+
* @returns A safe status projection and quiescent disposer.
|
|
48
|
+
*/
|
|
49
|
+
export declare function startRegistrationBootstrap(options: {
|
|
50
|
+
context: Context;
|
|
51
|
+
service: AnpIdentityService;
|
|
52
|
+
manager: IdentityManagement;
|
|
53
|
+
config: RegistrationBootstrapConfig;
|
|
54
|
+
fetch?: typeof fetch;
|
|
55
|
+
}): RegistrationBootstrapController;
|
|
56
|
+
//# sourceMappingURL=registration-bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-bootstrap.d.ts","sourceRoot":"","sources":["../src/registration-bootstrap.ts"],"names":[],"mappings":"AACA,+FAA+F;AAC/F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,KAAK,kBAAkB,MAAM,YAAY,CAAA;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAQ/D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;kBAyB5C,CAAA;AACF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAA;AAC3F,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAA;AAC1F,MAAM,MAAM,0BAA0B,GAAG,mBAAmB,GAAG,6BAA6B,GAAG,6BAA6B,GAAG,aAAa,GACxI,YAAY,GAAG,WAAW,GAAG,wBAAwB,GAAG,SAAS,GAAG,UAAU,CAAA;AAClF,MAAM,MAAM,2BAA2B,GAAG,sBAAsB,GAAG,iBAAiB,GAAG,uBAAuB,GAC1G,wBAAwB,GAAG,mBAAmB,GAAG,mBAAmB,GAAG,sBAAsB,GAAG,oBAAoB,GAAG,yBAAyB,CAAA;AACpJ,6FAA6F;AAC7F,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,0BAA0B,CAAA;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,2BAA2B,CAAA;IACpC,SAAS,CAAC,EAAE,iBAAiB,CAAA;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AACD,MAAM,WAAW,+BAA+B;IAC9C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,MAAM,IAAI,2BAA2B,CAAA;IACrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB;AAkCD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,kBAAkB,CAAA;IAC3B,OAAO,EAAE,kBAAkB,CAAA;IAC3B,MAAM,EAAE,2BAA2B,CAAA;IACnC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB,GAAG,+BAA+B,CA8RlC"}
|