@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.
Files changed (116) hide show
  1. package/BOUNDARY.md +30 -5
  2. package/PUBLICATION.md +181 -0
  3. package/README.md +73 -1
  4. package/README.zh.md +44 -1
  5. package/V7-MANAGEMENT.md +18 -0
  6. package/cordis.patch.yml +9 -0
  7. package/examples/fresh-bootstrap.cordis.patch.yml +38 -0
  8. package/lib/authorization-types.d.ts +6 -0
  9. package/lib/authorization-types.d.ts.map +1 -1
  10. package/lib/authorization.d.ts.map +1 -1
  11. package/lib/authorization.js +23 -6
  12. package/lib/authorization.js.map +1 -1
  13. package/lib/catalog.d.ts +3 -1
  14. package/lib/catalog.d.ts.map +1 -1
  15. package/lib/catalog.js +15 -3
  16. package/lib/catalog.js.map +1 -1
  17. package/lib/client/controller.d.ts +18 -0
  18. package/lib/client/controller.d.ts.map +1 -1
  19. package/lib/client/controller.js +89 -5
  20. package/lib/client/controller.js.map +1 -1
  21. package/lib/client/views.d.ts.map +1 -1
  22. package/lib/client/views.js +37 -6
  23. package/lib/client/views.js.map +1 -1
  24. package/lib/client-metadata.d.ts +3 -0
  25. package/lib/client-metadata.d.ts.map +1 -0
  26. package/lib/client-metadata.js +11 -0
  27. package/lib/client-metadata.js.map +1 -0
  28. package/lib/client.js +260 -14
  29. package/lib/client.js.map +4 -4
  30. package/lib/host-management-secret.d.ts +41 -0
  31. package/lib/host-management-secret.d.ts.map +1 -0
  32. package/lib/host-management-secret.js +92 -0
  33. package/lib/host-management-secret.js.map +1 -0
  34. package/lib/index.d.ts +73 -3
  35. package/lib/index.d.ts.map +1 -1
  36. package/lib/index.js +331 -22
  37. package/lib/index.js.map +1 -1
  38. package/lib/initial-registration-proof.d.ts +13 -0
  39. package/lib/initial-registration-proof.d.ts.map +1 -0
  40. package/lib/initial-registration-proof.js +48 -0
  41. package/lib/initial-registration-proof.js.map +1 -0
  42. package/lib/installed-consumer.d.ts +25 -0
  43. package/lib/installed-consumer.d.ts.map +1 -0
  44. package/lib/installed-consumer.js +66 -0
  45. package/lib/installed-consumer.js.map +1 -0
  46. package/lib/management-credentials.d.ts +15 -0
  47. package/lib/management-credentials.d.ts.map +1 -0
  48. package/lib/management-credentials.js +126 -0
  49. package/lib/management-credentials.js.map +1 -0
  50. package/lib/management-driver.d.ts +83 -0
  51. package/lib/management-driver.d.ts.map +1 -0
  52. package/lib/management-driver.js +405 -0
  53. package/lib/management-driver.js.map +1 -0
  54. package/lib/management-remote.d.ts +27 -1
  55. package/lib/management-remote.d.ts.map +1 -1
  56. package/lib/management-remote.js +69 -3
  57. package/lib/management-remote.js.map +1 -1
  58. package/lib/management-types.d.ts +7 -0
  59. package/lib/management-types.d.ts.map +1 -1
  60. package/lib/pap-callback.d.ts +110 -0
  61. package/lib/pap-callback.d.ts.map +1 -0
  62. package/lib/pap-callback.js +51 -0
  63. package/lib/pap-callback.js.map +1 -0
  64. package/lib/protocol-bootstrap.d.ts +24 -0
  65. package/lib/protocol-bootstrap.d.ts.map +1 -0
  66. package/lib/protocol-bootstrap.js +34 -0
  67. package/lib/protocol-bootstrap.js.map +1 -0
  68. package/lib/protocol-client.d.ts +137 -0
  69. package/lib/protocol-client.d.ts.map +1 -0
  70. package/lib/protocol-client.js +11 -0
  71. package/lib/protocol-client.js.map +1 -0
  72. package/lib/provider-api.d.ts +6 -2
  73. package/lib/provider-api.d.ts.map +1 -1
  74. package/lib/provider-api.js.map +1 -1
  75. package/lib/publication-http.d.ts +19 -0
  76. package/lib/publication-http.d.ts.map +1 -0
  77. package/lib/publication-http.js +183 -0
  78. package/lib/publication-http.js.map +1 -0
  79. package/lib/publication-types.d.ts +161 -0
  80. package/lib/publication-types.d.ts.map +1 -0
  81. package/lib/publication-types.js +35 -0
  82. package/lib/publication-types.js.map +1 -0
  83. package/lib/publication.d.ts +21 -0
  84. package/lib/publication.d.ts.map +1 -0
  85. package/lib/publication.js +235 -0
  86. package/lib/publication.js.map +1 -0
  87. package/lib/registration-bootstrap.d.ts +56 -0
  88. package/lib/registration-bootstrap.d.ts.map +1 -0
  89. package/lib/registration-bootstrap.js +523 -0
  90. package/lib/registration-bootstrap.js.map +1 -0
  91. package/lib/registration-service-settings.d.ts +12 -0
  92. package/lib/registration-service-settings.d.ts.map +1 -0
  93. package/lib/registration-service-settings.js +124 -0
  94. package/lib/registration-service-settings.js.map +1 -0
  95. package/lib/registration-service-types.d.ts +11 -0
  96. package/lib/registration-service-types.d.ts.map +1 -0
  97. package/lib/registration-service-types.js +3 -0
  98. package/lib/registration-service-types.js.map +1 -0
  99. package/lib/remote.d.ts.map +1 -1
  100. package/lib/remote.js +11 -2
  101. package/lib/remote.js.map +1 -1
  102. package/lib/target-policy.d.ts +35 -0
  103. package/lib/target-policy.d.ts.map +1 -0
  104. package/lib/target-policy.js +319 -0
  105. package/lib/target-policy.js.map +1 -0
  106. package/lib/user-client.d.ts +6 -0
  107. package/lib/user-client.d.ts.map +1 -1
  108. package/lib/user-client.js.map +1 -1
  109. package/lib/user-operation.d.ts.map +1 -1
  110. package/lib/user-operation.js +9 -0
  111. package/lib/user-operation.js.map +1 -1
  112. package/lib/user-service.d.ts +8 -1
  113. package/lib/user-service.d.ts.map +1 -1
  114. package/lib/user-service.js +58 -4
  115. package/lib/user-service.js.map +1 -1
  116. package/package.json +51 -29
@@ -0,0 +1,124 @@
1
+ import { mkdir, lstat, readFile, open, rename, rm } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ import lockfile from 'proper-lockfile';
5
+ import { z } from 'zod';
6
+ import { syncDirectory } from './sync-directory.js';
7
+ import { DEFAULT_REGISTRATION_ORIGIN } from './registration-service-types.js';
8
+ export function registrationOrigin(value) {
9
+ try {
10
+ if (value.length > 2048)
11
+ throw new Error();
12
+ const url = new URL(value.trim());
13
+ if (url.hostname.length > 253 || url.protocol !== 'https:' || url.username || url.password || url.search || url.hash || url.pathname !== '/')
14
+ throw new Error();
15
+ return url.origin;
16
+ }
17
+ catch {
18
+ throw new Error('registration_service_invalid_origin');
19
+ }
20
+ }
21
+ const document = z.object({
22
+ schema: z.literal(1), version: z.number().int().nonnegative(),
23
+ origin: z.string().refine(value => { try {
24
+ return registrationOrigin(value) === value;
25
+ }
26
+ catch {
27
+ return false;
28
+ } }),
29
+ flows: z.record(z.string().regex(/^[a-f0-9]{64}$/u), z.object({
30
+ fingerprint: z.string().regex(/^[a-f0-9]{64}$/u), origin: z.string(),
31
+ }).strict()),
32
+ }).strict();
33
+ const initial = () => ({ schema: 1, version: 0, origin: DEFAULT_REGISTRATION_ORIGIN, flows: {} });
34
+ /** Host-owned preferences and immutable per-flow origin pins, never credentials. */
35
+ export class RegistrationServiceSettingsStore {
36
+ root;
37
+ constructor(stateRoot) { this.root = join(stateRoot, 'manager-settings'); }
38
+ async transaction(assertActive, operation) {
39
+ assertActive();
40
+ await mkdir(this.root, { recursive: true, mode: 0o700 });
41
+ const info = await lstat(this.root);
42
+ if (!info.isDirectory() || info.isSymbolicLink() || (process.platform !== 'win32' && Boolean(info.mode & 0o077)) ||
43
+ typeof process.getuid === 'function' && info.uid !== process.getuid())
44
+ throw new Error('registration_service_settings_unavailable');
45
+ const release = await lockfile.lock(this.root, { realpath: true, retries: { retries: 80, minTimeout: 10, maxTimeout: 100 } });
46
+ try {
47
+ assertActive();
48
+ const path = join(this.root, 'registration.json');
49
+ let state = initial();
50
+ try {
51
+ const stat = await lstat(path);
52
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 131072 || (process.platform !== 'win32' && Boolean(stat.mode & 0o077)) ||
53
+ typeof process.getuid === 'function' && stat.uid !== process.getuid())
54
+ throw new Error('registration_service_settings_unavailable');
55
+ state = document.parse(JSON.parse(await readFile(path, 'utf8')));
56
+ for (const pin of Object.values(state.flows))
57
+ if (registrationOrigin(pin.origin) !== pin.origin)
58
+ throw new Error();
59
+ }
60
+ catch (error) {
61
+ if (error.code !== 'ENOENT')
62
+ throw new Error('registration_service_settings_unavailable');
63
+ }
64
+ assertActive();
65
+ const result = operation(state);
66
+ if (result.changed) {
67
+ state.version++;
68
+ const temp = join(this.root, '.' + randomUUID() + '.tmp');
69
+ try {
70
+ const file = await open(temp, 'wx', 0o600);
71
+ try {
72
+ await file.writeFile(JSON.stringify(state) + '\n');
73
+ await file.sync();
74
+ }
75
+ finally {
76
+ await file.close();
77
+ }
78
+ assertActive();
79
+ await rename(temp, path);
80
+ await syncDirectory(this.root);
81
+ }
82
+ finally {
83
+ await rm(temp, { force: true });
84
+ }
85
+ }
86
+ assertActive();
87
+ return structuredClone(result.value);
88
+ }
89
+ finally {
90
+ await release();
91
+ }
92
+ }
93
+ read(assertActive) {
94
+ return this.transaction(assertActive, state => ({ value: { origin: state.origin, version: state.version }, changed: false }));
95
+ }
96
+ update(input, assertActive) {
97
+ const origin = registrationOrigin(input.origin);
98
+ if (!Number.isSafeInteger(input.expectedVersion) || input.expectedVersion < 0)
99
+ throw new Error('registration_service_invalid_version');
100
+ return this.transaction(assertActive, state => {
101
+ if (state.version !== input.expectedVersion)
102
+ throw new Error('registration_service_conflict');
103
+ state.origin = origin;
104
+ return { value: { origin, version: state.version + 1 }, changed: true };
105
+ });
106
+ }
107
+ pin(key, fingerprint, assertActive) {
108
+ if (![key, fingerprint].every(value => /^[a-f0-9]{64}$/u.test(value)))
109
+ throw new Error('registration_service_invalid_flow');
110
+ return this.transaction(assertActive, state => {
111
+ const pin = state.flows[key];
112
+ if (pin) {
113
+ if (pin.fingerprint !== fingerprint)
114
+ throw new Error('registration_service_flow_conflict');
115
+ return { value: pin.origin, changed: false };
116
+ }
117
+ if (Object.keys(state.flows).length >= 256)
118
+ throw new Error('registration_service_settings_unavailable');
119
+ state.flows[key] = { origin: state.origin, fingerprint };
120
+ return { value: state.origin, changed: true };
121
+ });
122
+ }
123
+ }
124
+ //# sourceMappingURL=registration-service-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration-service-settings.js","sourceRoot":"","sources":["../src/registration-service-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Default for new registrations only; existing identities retain their own origin. */
2
+ export declare const DEFAULT_REGISTRATION_ORIGIN = "https://awiki.me";
3
+ export interface RegistrationServiceSettings {
4
+ readonly origin: string;
5
+ readonly version: number;
6
+ }
7
+ export interface UpdateRegistrationServiceSettings {
8
+ readonly origin: string;
9
+ readonly expectedVersion: number;
10
+ }
11
+ //# sourceMappingURL=registration-service-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration-service-types.d.ts","sourceRoot":"","sources":["../src/registration-service-types.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,eAAO,MAAM,2BAA2B,qBAAqB,CAAC;AAC9D,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC"}
@@ -0,0 +1,3 @@
1
+ /** Default for new registrations only; existing identities retain their own origin. */
2
+ export const DEFAULT_REGISTRATION_ORIGIN = 'https://awiki.me';
3
+ //# sourceMappingURL=registration-service-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration-service-types.js","sourceRoot":"","sources":["../src/registration-service-types.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,CAAC,MAAM,2BAA2B,GAAG,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAyDjF,QAAA,MAAM,YAAY,EAAE,wBA8BnB,CAAC;AACF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAiEjF,QAAA,MAAM,YAAY,EAAE,wBA8BnB,CAAC;AACF,eAAe,YAAY,CAAC"}
package/lib/remote.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { PublicationConfigSchema } from './publication-types.js';
1
2
  /** Explicit browser-safe Typert method contract for the optional manager. */
2
3
  import { z } from "zod";
3
4
  const reference = z
@@ -24,12 +25,17 @@ const decision = version
24
25
  capabilities: z.array(z.enum(["identity:read", "identity:sign", "identity:http-auth"])),
25
26
  signingPurposes: z.array(z.string()),
26
27
  httpOrigins: z.array(z.string()),
28
+ oauthAudiences: z.array(z.string()).optional(),
27
29
  })
28
30
  .strict()
29
31
  .optional(),
30
32
  })
31
33
  .strict();
32
34
  const methods = [
35
+ ["registrationBootstrapStatus", undefined],
36
+ ["registrationServiceSettings", undefined],
37
+ ["configureRegistrationService", z.object({ origin: z.string().min(1).max(2048), expectedVersion: z.number().int().nonnegative() }).strict()],
38
+ ["submitRegistrationOtp", z.object({ code: z.string().regex(/^[0-9]{6}$/u) }).strict()],
33
39
  ["listIdentities", undefined],
34
40
  ["listRequests", z.boolean().optional()],
35
41
  ["getRequest", z.string().min(1)],
@@ -45,6 +51,9 @@ const methods = [
45
51
  .strict(),
46
52
  ],
47
53
  ["publicDocument", reference],
54
+ ["publicationStatus", reference],
55
+ ["retryPublication", reference],
56
+ ["publishIdentity", z.object({ reference, config: PublicationConfigSchema }).strict()],
48
57
  [
49
58
  "deleteIdentity",
50
59
  z.object({ reference, confirmationName: z.string().min(1) }).strict(),
@@ -71,14 +80,14 @@ const contribution = {
71
80
  codec: {
72
81
  mode: "strict",
73
82
  typeSymbol: `anp-identity/manager#${method}Input`,
74
- schema,
83
+ create: () => schema,
75
84
  },
76
85
  },
77
86
  ],
78
87
  result: {
79
88
  mode: "strict",
80
89
  typeSymbol: `anp-identity/manager#${method}Result`,
81
- schema: z.json().nullable(),
90
+ create: () => z.json().nullable(),
82
91
  },
83
92
  })),
84
93
  };
package/lib/remote.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /** Context-bound protocol authorization with opaque target, scope and temporary-key references. */
2
+ import type { Context } from '@deepseek-ai/cordis';
3
+ import type { IdentityReference } from '@agent-network-protocol/anp-identity';
4
+ import type { ProviderLease } from '@agent-network-protocol/anp-identity/provider';
5
+ import type { VerifiedCaller } from './authorization-types.js';
6
+ import type { PublicationCoordinator } from './publication.js';
7
+ import type { ProtocolUsePolicy, ProtocolIdentityClient, PapHostConsumer } from './protocol-client.js';
8
+ import type { PapCallbackManagementOperations } from './pap-callback.js';
9
+ export interface ProtocolAuthorityHost {
10
+ resolveCaller(context: Context): VerifiedCaller;
11
+ assertCaller(caller: VerifiedCaller): void;
12
+ providerGeneration(): unknown;
13
+ withNative<T>(operation: (native: ProviderLease) => Promise<T>): Promise<T>;
14
+ }
15
+ /** Private manager-owned driver and encrypted public transaction bindings. No credential value is returned. */
16
+ export interface PapCallbackHostAuthority {
17
+ assertActive(): Promise<void>;
18
+ operations: PapCallbackManagementOperations;
19
+ reserve(transactionId: string, binding: Record<string, unknown>): Promise<Record<string, unknown>>;
20
+ read(transactionId: string): Promise<Record<string, unknown> | undefined>;
21
+ }
22
+ /** The trusted adapter validates public discovery; this authority enforces identity and permission policy. */
23
+ export declare class ProtocolIdentityAuthority {
24
+ private readonly policies;
25
+ private readonly host;
26
+ private readonly publications;
27
+ private readonly targets;
28
+ constructor(policies: readonly ProtocolUsePolicy[], host: ProtocolAuthorityHost, publications: PublicationCoordinator);
29
+ bind(context: Context): ProtocolIdentityClient;
30
+ /** Bind the exact installed PAP plugin; publication and callback data never replace its Host policy. */
31
+ bindPapHost(context: Context, callbackAuthority: (identity: IdentityReference, backend: string) => Promise<PapCallbackHostAuthority>): PapHostConsumer;
32
+ private validateEvidence;
33
+ private validateRequest;
34
+ }
35
+ //# sourceMappingURL=target-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-policy.d.ts","sourceRoot":"","sources":["../src/target-policy.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAA;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAE9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAsE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE1K,OAAO,KAAK,EAAE,+BAA+B,EACY,MAAM,mBAAmB,CAAA;AAclF,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAAA;IAC/C,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAA;IAC1C,kBAAkB,IAAI,OAAO,CAAA;IAC7B,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC5E;AACD,+GAA+G;AAC/G,MAAM,WAAW,wBAAwB;IACvC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,UAAU,EAAE,+BAA+B,CAAA;IAC3C,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAClG,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAA;CAC1E;AAKD,8GAA8G;AAC9G,qBAAa,yBAAyB;IAExB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAgC,OAAO,CAAC,QAAQ,CAAC,IAAI;IACxF,OAAO,CAAC,QAAQ,CAAC,YAAY;IAF/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;gBAC9B,QAAQ,EAAE,SAAS,iBAAiB,EAAE,EAAmB,IAAI,EAAE,qBAAqB,EAC9F,YAAY,EAAE,sBAAsB;IAYvD,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,sBAAsB;IAwI9C,wGAAwG;IACxG,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,wBAAwB,CAAC,GAAG,eAAe;IA4FtJ,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,eAAe;CAKxB"}
@@ -0,0 +1,319 @@
1
+ import { PapCallbackManagementError, PapCallbackOperationSchema } from './pap-callback.js';
2
+ import { exactHttps } from './publication-http.js';
3
+ import { pluginError } from './errors.js';
4
+ /** Runtime capability checks precede every optional native method. A missing implementation is incompatible. */
5
+ async function invoke(native, name, reference, request) {
6
+ const method = native[name];
7
+ if (typeof method !== 'function')
8
+ throw pluginError('provider_incompatible');
9
+ return Reflect.apply(method, native, [reference, request]);
10
+ }
11
+ const same = (a, b) => a.storeId === b.storeId && a.identityId === b.identityId && a.did === b.did;
12
+ /** The trusted adapter validates public discovery; this authority enforces identity and permission policy. */
13
+ export class ProtocolIdentityAuthority {
14
+ policies;
15
+ host;
16
+ publications;
17
+ targets = new WeakMap();
18
+ constructor(policies, host, publications) {
19
+ this.policies = policies;
20
+ this.host = host;
21
+ this.publications = publications;
22
+ this.policies = structuredClone(policies);
23
+ const ids = new Set();
24
+ for (const policy of this.policies) {
25
+ if (ids.has(policy.id) || !policy.id || !Number.isSafeInteger(policy.version) || policy.version < 1
26
+ || !policy.consumer || policy.owner !== '@agent-network-protocol/dsh-anp-identity' || !policy.profiles.length || !Number.isSafeInteger(policy.expiresAt)
27
+ || !policy.scopes.length && !policy.profiles.every(profile => profile === 'pap_session')
28
+ || !policy.publicTargets && (!policy.issuers.length || !policy.resources.length))
29
+ throw pluginError('invalid_request');
30
+ ids.add(policy.id);
31
+ policy.issuers.forEach(value => exactHttps(value));
32
+ policy.resources.forEach(value => exactHttps(value));
33
+ }
34
+ }
35
+ bind(context) {
36
+ const caller = this.host.resolveCaller(context);
37
+ if (!this.policies.some(policy => policy.consumer === caller.consumer))
38
+ throw pluginError('consumer_forbidden');
39
+ const contextGeneration = this.host.providerGeneration();
40
+ return Object.freeze({ registerValidatedTarget: async (input) => {
41
+ const evidence = structuredClone(input.discovery);
42
+ const policy = this.policies.find(value => value.id === input.policyRef && value.consumer === caller.consumer && same(value.identity, input.identityRef));
43
+ const checkCaller = () => {
44
+ const current = this.host.resolveCaller(context);
45
+ if (current.consumer !== caller.consumer || this.host.providerGeneration() !== contextGeneration)
46
+ throw pluginError('provider_disposed');
47
+ this.host.assertCaller(current);
48
+ };
49
+ checkCaller();
50
+ this.validateEvidence(evidence);
51
+ if (!policy || Date.now() >= policy.expiresAt || !policy.profiles.includes(evidence.profile)
52
+ || (!policy.publicTargets && (!policy.issuers.includes(evidence.issuer) || !policy.resources.includes(evidence.resource)))
53
+ || input.requestedScopes.some(scope => !policy.scopes.includes(scope)))
54
+ throw pluginError('capability_forbidden');
55
+ let disposed = false;
56
+ let publicationVersion;
57
+ let publicationKid;
58
+ const targetRef = Object.freeze({});
59
+ const scopes = new WeakMap();
60
+ const keys = new WeakMap();
61
+ const checkCurrent = () => {
62
+ checkCaller();
63
+ if (disposed || Date.now() >= policy.expiresAt || Date.now() >= evidence.expiresAt)
64
+ throw pluginError('capability_forbidden');
65
+ };
66
+ const check = async () => {
67
+ checkCurrent();
68
+ const record = await this.publications.requirePublished(input.identityRef);
69
+ checkCurrent();
70
+ if (publicationVersion !== undefined && (record.version !== publicationVersion || record.key.kid !== publicationKid))
71
+ throw pluginError('capability_forbidden');
72
+ if (record.key.alg !== 'ES256' || !record.config.capabilities
73
+ || evidence.profile === 'mcp_machine' && !record.config.capabilities.mcpMachine
74
+ || evidence.profile === 'pap_session' && !record.config.capabilities.papSession
75
+ || evidence.profile === 'pap_account' && !record.config.capabilities.papAccount)
76
+ throw pluginError('provider_incompatible');
77
+ // Keep the live custody observation after metadata awaits; cached OAuth tokens still require it.
78
+ await this.host.withNative(async (native) => {
79
+ checkCurrent();
80
+ const info = await native.info();
81
+ checkCurrent();
82
+ if (typeof info.backendAvailable !== 'boolean')
83
+ throw pluginError('provider_incompatible');
84
+ if (!info.backendAvailable || info.storeId !== input.identityRef.storeId || !info.schemaCompatible
85
+ || info.health !== 'ready')
86
+ throw pluginError('provider_unavailable');
87
+ });
88
+ checkCurrent();
89
+ return record;
90
+ };
91
+ const scope = (ref) => {
92
+ const value = scopes.get(ref);
93
+ if (!value)
94
+ throw pluginError('capability_forbidden');
95
+ return value;
96
+ };
97
+ const key = (scopeRef, keyRef, purpose) => {
98
+ scope(scopeRef);
99
+ const value = keys.get(keyRef);
100
+ if (!value || value.scopeRef !== scopeRef || purpose && value.native.purpose !== purpose)
101
+ throw pluginError('capability_forbidden');
102
+ return value.native;
103
+ };
104
+ const run = async (method, request) => {
105
+ await check();
106
+ const result = await this.host.withNative(async (native) => {
107
+ await check();
108
+ const value = await invoke(native, method, input.identityRef, request);
109
+ await check();
110
+ return value;
111
+ });
112
+ await check();
113
+ return result;
114
+ };
115
+ const create = async (scopeRef, operationId, purpose) => {
116
+ const result = await run(purpose === 'pap_session' ? 'createDelegatedKey' : 'createDpopKey', { scope: scope(scopeRef), operation_id: operationId });
117
+ if (result.purpose !== purpose || typeof result.handle !== 'string' || !Number.isSafeInteger(result.generation)
118
+ || result.public_jwk?.kty !== 'EC' || result.public_jwk.crv !== 'P-256' || typeof result.thumbprint !== 'string')
119
+ throw pluginError('provider_incompatible');
120
+ const keyRef = Object.freeze({});
121
+ keys.set(keyRef, { scopeRef, native: result });
122
+ return Object.freeze({ handle: result.handle, keyRef, purpose, generation: result.generation, publicJwk: structuredClone(result.public_jwk), thumbprint: result.thumbprint });
123
+ };
124
+ const lease = Object.freeze({
125
+ targetRef, policyGeneration: policy.version,
126
+ assertActive: async () => { await check(); },
127
+ getOAuthClientIdentity: async () => { const record = await check(); return { clientId: record.clientId, keyId: record.key.kid, algorithm: 'ES256', version: record.version, signerMode: 'local', publicJwk: { kty: 'EC', crv: 'P-256', x: record.key.x, y: 'y' in record.key ? record.key.y : '' }, redirectUris: [...record.config.redirectUris] }; },
128
+ signOAuthClientAssertion: async (ref) => {
129
+ if (ref !== targetRef || !evidence.tokenEndpoint)
130
+ throw pluginError('capability_forbidden');
131
+ const record = await check();
132
+ return await run('signOAuthClientAssertion', { client_id: record.clientId, audience: evidence.issuer, key: { kid: record.key.kid } });
133
+ },
134
+ bindPapScope: input => {
135
+ checkCaller();
136
+ if (disposed || evidence.profile === 'mcp_machine' || !evidence.companyId || !input.userId
137
+ || input.accountSlot !== undefined && evidence.profile !== 'pap_account')
138
+ throw pluginError('capability_forbidden');
139
+ const ref = Object.freeze({});
140
+ scopes.set(ref, { owner: policy.owner, company_id: evidence.companyId, user_id: input.userId,
141
+ ...(input.accountSlot === undefined ? {} : { account_slot: input.accountSlot }) });
142
+ return ref;
143
+ },
144
+ restorePapKey: async (ref, request) => {
145
+ const result = await run('describeTemporaryKey', { ...request, scope: scope(ref) });
146
+ if (result.handle !== request.handle || result.generation !== request.generation || result.purpose !== request.purpose
147
+ || result.public_jwk?.kty !== 'EC' || result.public_jwk.crv !== 'P-256')
148
+ throw pluginError('provider_incompatible');
149
+ const keyRef = Object.freeze({});
150
+ keys.set(keyRef, { scopeRef: ref, native: result });
151
+ return { handle: result.handle, keyRef, purpose: result.purpose, generation: result.generation, publicJwk: structuredClone(result.public_jwk), thumbprint: result.thumbprint };
152
+ },
153
+ createDelegatedKey: (ref, id) => create(ref, id, 'pap_session'),
154
+ createDpopKey: (ref, id) => create(ref, id, 'pap_dpop'),
155
+ issuePapDelegation: async (ref, request) => {
156
+ const selected = key(ref, request.keyRef, 'pap_session');
157
+ const record = await check();
158
+ return await run('issuePapDelegation', { client_id: record.clientId, key: { kid: record.key.kid },
159
+ delegated_key: { handle: selected.handle, generation: selected.generation }, scope: scope(ref), ttl_seconds: request.ttlSeconds });
160
+ },
161
+ signPapSessionRequest: async (ref, request) => {
162
+ const selected = key(ref, request.keyRef, 'pap_session');
163
+ const record = await check();
164
+ this.validateRequest(evidence, request.httpUri);
165
+ if (request.clientId !== record.clientId || request.sub !== scope(ref).user_id)
166
+ throw pluginError('capability_forbidden');
167
+ return await run('signPapSessionRequest', { handle: selected.handle, generation: selected.generation, scope: scope(ref),
168
+ delegation: request.delegation, client_id: record.clientId, sid: request.sid, sub: request.sub,
169
+ ...(request.agentId === undefined ? {} : { agent_id: request.agentId }), http_method: request.httpMethod, http_uri: request.httpUri,
170
+ ...(request.accessToken === undefined ? {} : { access_token: request.accessToken }) });
171
+ },
172
+ signDpopProof: async (ref, request) => {
173
+ const selected = key(ref, request.keyRef, 'pap_dpop');
174
+ if (evidence.profile !== 'pap_account')
175
+ throw pluginError('capability_forbidden');
176
+ this.validateRequest(evidence, request.httpUri);
177
+ return await run('signDpopProof', { handle: selected.handle, generation: selected.generation, scope: scope(ref),
178
+ http_method: request.httpMethod, http_uri: request.httpUri,
179
+ ...(request.accessToken === undefined ? {} : { access_token: request.accessToken }), ...(request.nonce === undefined ? {} : { nonce: request.nonce }) });
180
+ },
181
+ retireTemporaryKey: async (ref, keyRef) => { const selected = key(ref, keyRef); await run('retireTemporaryKey', { handle: selected.handle, generation: selected.generation, scope: scope(ref) }); keys.delete(keyRef); },
182
+ dispose: () => { disposed = true; },
183
+ });
184
+ const initial = await check();
185
+ publicationVersion = initial.version;
186
+ publicationKid = initial.key.kid;
187
+ this.targets.set(targetRef, { fiber: context.fiber, identity: structuredClone(input.identityRef), policy,
188
+ evidence, scopes: [...new Set(input.requestedScopes)].sort(), check });
189
+ return lease;
190
+ } });
191
+ }
192
+ /** Bind the exact installed PAP plugin; publication and callback data never replace its Host policy. */
193
+ bindPapHost(context, callbackAuthority) {
194
+ const caller = this.host.resolveCaller(context);
195
+ if (caller.consumer !== '@agentconnect/dsh-pap/plugin')
196
+ throw pluginError('consumer_forbidden');
197
+ const generation = this.host.providerGeneration();
198
+ const selectedPolicies = new Set();
199
+ let disposed = false;
200
+ const checkActive = () => {
201
+ const current = this.host.resolveCaller(context);
202
+ if (disposed || current.consumer !== caller.consumer || this.host.providerGeneration() !== generation)
203
+ throw pluginError('provider_disposed');
204
+ this.host.assertCaller(current);
205
+ if ([...selectedPolicies].some(policy => Date.now() >= policy.expiresAt))
206
+ throw pluginError('capability_forbidden');
207
+ };
208
+ const assertActive = async () => { checkActive(); };
209
+ const policyFor = (identity, policyRef, profile) => {
210
+ const policy = this.policies.find(value => value.id === policyRef && value.consumer === caller.consumer && same(value.identity, identity));
211
+ if (!policy || !policy.profiles.includes(profile) || Date.now() >= policy.expiresAt)
212
+ throw pluginError('capability_forbidden');
213
+ selectedPolicies.add(policy);
214
+ return policy;
215
+ };
216
+ const publishedFor = async (identity, profile) => {
217
+ const record = await this.publications.requirePublished(identity);
218
+ if (record.key.alg !== 'ES256' || !record.config.capabilities?.papSession
219
+ || profile === 'pap_account' && !record.config.capabilities.papAccount)
220
+ throw pluginError('provider_incompatible');
221
+ return record;
222
+ };
223
+ const relay = (record) => {
224
+ const uri = new URL(record.clientId).origin + '/user-service/v1/pap-callback';
225
+ return record.config.redirectUris.includes(uri) ? uri : undefined;
226
+ };
227
+ return Object.freeze({
228
+ assertActive,
229
+ dispose: () => { disposed = true; },
230
+ resolveBinding: async (identity, policyRef, profile) => {
231
+ checkActive();
232
+ const policy = policyFor(identity, policyRef, profile);
233
+ const record = await publishedFor(identity, profile);
234
+ checkActive();
235
+ await this.host.withNative(async (native) => { checkActive(); await native.publicIdentity(identity); checkActive(); });
236
+ checkActive();
237
+ const current = await publishedFor(identity, profile);
238
+ checkActive();
239
+ if (record.version !== current.version || record.key.kid !== current.key.kid)
240
+ throw pluginError('capability_forbidden');
241
+ const redirectUri = profile === 'pap_account' ? relay(current) : undefined;
242
+ return { binding: { identityRef: structuredClone(identity), ownerRef: policy.owner, clientId: current.clientId },
243
+ ...(redirectUri ? { redirectUri } : {}) };
244
+ },
245
+ callbackManagementFor: async (input) => {
246
+ await assertActive();
247
+ const policy = policyFor(input.identityRef, input.policyRef, 'pap_account');
248
+ const target = this.targets.get(input.targetRef);
249
+ if (!target || target.fiber !== context.fiber || !same(target.identity, input.identityRef)
250
+ || target.policy !== policy || target.evidence.profile !== 'pap_account')
251
+ throw pluginError('capability_forbidden');
252
+ const record = await target.check();
253
+ const redirectUri = relay(record);
254
+ if (!redirectUri)
255
+ throw new PapCallbackManagementError('callback_redirect_mismatch');
256
+ const authority = await callbackAuthority(input.identityRef, record.config.backend);
257
+ let released = false;
258
+ const check = async () => {
259
+ await assertActive();
260
+ if (released)
261
+ throw pluginError('provider_disposed');
262
+ await target.check();
263
+ await authority.assertActive();
264
+ checkActive();
265
+ };
266
+ await check();
267
+ const binding = { schema: 'pap-host-target/1', consumer: caller.consumer, policyRef: policy.id,
268
+ issuer: target.evidence.issuer, resource: target.evidence.resource, scopes: target.scopes,
269
+ clientId: record.clientId, redirectUri };
270
+ async function execute(command) {
271
+ const parsed = PapCallbackOperationSchema.safeParse(command);
272
+ if (!parsed.success)
273
+ throw pluginError('invalid_request');
274
+ const operation = parsed.data;
275
+ await check();
276
+ if (operation.action === 'pap-callback-register') {
277
+ if (operation.callback.client_id !== record.clientId || operation.callback.issuer !== target.evidence.issuer
278
+ || operation.callback.redirect_uri !== redirectUri)
279
+ throw pluginError('capability_forbidden');
280
+ const saved = await authority.reserve(operation.callback.transaction_id, binding);
281
+ if (JSON.stringify(saved) !== JSON.stringify(binding))
282
+ throw pluginError('capability_forbidden');
283
+ await check();
284
+ const result = await authority.operations.execute(operation);
285
+ await check();
286
+ checkActive();
287
+ return result;
288
+ }
289
+ const saved = await authority.read(operation.callback.transaction_id);
290
+ if (!saved || JSON.stringify(saved) !== JSON.stringify(binding))
291
+ throw pluginError('capability_forbidden');
292
+ await check();
293
+ checkActive();
294
+ const result = await authority.operations.execute(operation);
295
+ await check();
296
+ if (result.iss !== target.evidence.issuer)
297
+ throw pluginError('capability_forbidden');
298
+ return result;
299
+ }
300
+ return Object.freeze({ execute, dispose: () => { released = true; } });
301
+ },
302
+ });
303
+ }
304
+ validateEvidence(evidence) {
305
+ for (const value of [evidence.issuer, evidence.resource, evidence.sources.resource, evidence.sources.authorizationServer,
306
+ ...(evidence.tokenEndpoint ? [evidence.tokenEndpoint] : []), ...(evidence.allowedEndpoints ?? [])])
307
+ exactHttps(value);
308
+ if (!/^[a-f0-9]{64}$/u.test(evidence.metadataDigest) || !Number.isSafeInteger(evidence.expiresAt)
309
+ || evidence.expiresAt <= Date.now() || evidence.expiresAt > Date.now() + 3600000)
310
+ throw pluginError('invalid_request');
311
+ }
312
+ validateRequest(evidence, uri) {
313
+ const request = new URL(uri);
314
+ if (request.username || request.password || request.hash || request.protocol !== 'https:'
315
+ || ![evidence.resource, evidence.tokenEndpoint, ...(evidence.allowedEndpoints ?? [])].includes(`${request.origin}${request.pathname}`))
316
+ throw pluginError('capability_forbidden');
317
+ }
318
+ }
319
+ //# sourceMappingURL=target-policy.js.map