@agent-network-protocol/dsh-anp-identity 0.1.2 → 0.1.3-rc.2

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 (75) hide show
  1. package/BOUNDARY.md +14 -2
  2. package/README.md +33 -4
  3. package/README.zh.md +10 -2
  4. package/V7-MANAGEMENT.md +90 -0
  5. package/cordis.patch.yml +4 -0
  6. package/lib/authorization-types.d.ts +150 -0
  7. package/lib/authorization-types.d.ts.map +1 -0
  8. package/lib/authorization-types.js +2 -0
  9. package/lib/authorization-types.js.map +1 -0
  10. package/lib/authorization.d.ts +45 -0
  11. package/lib/authorization.d.ts.map +1 -0
  12. package/lib/authorization.js +718 -0
  13. package/lib/authorization.js.map +1 -0
  14. package/lib/catalog.d.ts +7 -2
  15. package/lib/catalog.d.ts.map +1 -1
  16. package/lib/catalog.js +45 -23
  17. package/lib/catalog.js.map +1 -1
  18. package/lib/client/controller.d.ts +78 -0
  19. package/lib/client/controller.d.ts.map +1 -0
  20. package/lib/client/controller.js +365 -0
  21. package/lib/client/controller.js.map +1 -0
  22. package/lib/client/identity-icon.d.ts +3 -0
  23. package/lib/client/identity-icon.d.ts.map +1 -0
  24. package/lib/client/identity-icon.js +6 -0
  25. package/lib/client/identity-icon.js.map +1 -0
  26. package/lib/client/index.d.ts +7 -0
  27. package/lib/client/index.d.ts.map +1 -0
  28. package/lib/client/index.js +51 -0
  29. package/lib/client/index.js.map +1 -0
  30. package/lib/client/settings-icon-slot.d.ts +13 -0
  31. package/lib/client/settings-icon-slot.d.ts.map +1 -0
  32. package/lib/client/settings-icon-slot.js +2 -0
  33. package/lib/client/settings-icon-slot.js.map +1 -0
  34. package/lib/client/styles.d.ts +4 -0
  35. package/lib/client/styles.d.ts.map +1 -0
  36. package/lib/client/styles.js +39 -0
  37. package/lib/client/styles.js.map +1 -0
  38. package/lib/client/views.d.ts +11 -0
  39. package/lib/client/views.d.ts.map +1 -0
  40. package/lib/client/views.js +287 -0
  41. package/lib/client/views.js.map +1 -0
  42. package/lib/client.js +21008 -0
  43. package/lib/client.js.map +7 -0
  44. package/lib/index.d.ts +26 -0
  45. package/lib/index.d.ts.map +1 -1
  46. package/lib/index.js +413 -58
  47. package/lib/index.js.map +1 -1
  48. package/lib/management-remote.d.ts +23 -0
  49. package/lib/management-remote.d.ts.map +1 -0
  50. package/lib/management-remote.js +126 -0
  51. package/lib/management-remote.js.map +1 -0
  52. package/lib/management-types.d.ts +50 -0
  53. package/lib/management-types.d.ts.map +1 -0
  54. package/lib/management-types.js +2 -0
  55. package/lib/management-types.js.map +1 -0
  56. package/lib/provider-api.d.ts +3 -0
  57. package/lib/provider-api.d.ts.map +1 -1
  58. package/lib/provider-api.js.map +1 -1
  59. package/lib/remote.d.ts +4 -0
  60. package/lib/remote.d.ts.map +1 -0
  61. package/lib/remote.js +86 -0
  62. package/lib/remote.js.map +1 -0
  63. package/lib/user-client.d.ts +41 -0
  64. package/lib/user-client.d.ts.map +1 -0
  65. package/lib/user-client.js +6 -0
  66. package/lib/user-client.js.map +1 -0
  67. package/lib/user-operation.d.ts +7 -0
  68. package/lib/user-operation.d.ts.map +1 -0
  69. package/lib/user-operation.js +87 -0
  70. package/lib/user-operation.js.map +1 -0
  71. package/lib/user-service.d.ts +26 -0
  72. package/lib/user-service.d.ts.map +1 -0
  73. package/lib/user-service.js +140 -0
  74. package/lib/user-service.js.map +1 -0
  75. package/package.json +113 -10
package/lib/remote.js ADDED
@@ -0,0 +1,86 @@
1
+ /** Explicit browser-safe Typert method contract for the optional manager. */
2
+ import { z } from "zod";
3
+ const reference = z
4
+ .object({
5
+ storeId: z.string().min(1),
6
+ identityId: z.string().min(1),
7
+ did: z.string().min(1),
8
+ })
9
+ .strict();
10
+ const version = z
11
+ .object({
12
+ requestId: z.string().min(1),
13
+ expectedVersion: z.number().int().positive(),
14
+ })
15
+ .strict();
16
+ const decision = version
17
+ .extend({
18
+ decision: z.enum(["approve", "deny"]),
19
+ identity: reference.optional(),
20
+ mode: z.enum(["once", "permanent"]).optional(),
21
+ reviewedSnapshot: z
22
+ .object({
23
+ version: z.string().min(1),
24
+ capabilities: z.array(z.enum(["identity:read", "identity:sign", "identity:http-auth"])),
25
+ signingPurposes: z.array(z.string()),
26
+ httpOrigins: z.array(z.string()),
27
+ })
28
+ .strict()
29
+ .optional(),
30
+ })
31
+ .strict();
32
+ const methods = [
33
+ ["listIdentities", undefined],
34
+ ["listRequests", z.boolean().optional()],
35
+ ["getRequest", z.string().min(1)],
36
+ ["decide", decision],
37
+ ["grants", reference],
38
+ [
39
+ "revoke",
40
+ z
41
+ .object({
42
+ grantId: z.string().min(1),
43
+ expectedVersion: z.number().int().positive(),
44
+ })
45
+ .strict(),
46
+ ],
47
+ ["publicDocument", reference],
48
+ [
49
+ "deleteIdentity",
50
+ z.object({ reference, confirmationName: z.string().min(1) }).strict(),
51
+ ],
52
+ ["markPrompted", version],
53
+ ["reauthorize", version],
54
+ ];
55
+ const contribution = {
56
+ package: "@agent-network-protocol/dsh-anp-identity",
57
+ descriptors: methods.map(([method, schema]) => ({
58
+ id: `@agent-network-protocol/dsh-anp-identity#anpIdentityManager/${method}`,
59
+ service: "anpIdentityManager",
60
+ namespace: "anpIdentityManager",
61
+ method,
62
+ invocation: { kind: "direct" },
63
+ parameters: schema === undefined
64
+ ? []
65
+ : [
66
+ {
67
+ name: "input",
68
+ wire: "input",
69
+ source: "json",
70
+ ...(method === "listRequests" ? { acceptsUndefined: true } : {}),
71
+ codec: {
72
+ mode: "strict",
73
+ typeSymbol: `anp-identity/manager#${method}Input`,
74
+ schema,
75
+ },
76
+ },
77
+ ],
78
+ result: {
79
+ mode: "strict",
80
+ typeSymbol: `anp-identity/manager#${method}Result`,
81
+ schema: z.json().nullable(),
82
+ },
83
+ })),
84
+ };
85
+ export default contribution;
86
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { PublicIdentity, SignRequest, Signature, IdentityReference } from './types.js';
3
+ import type { AuthorizationRequest, AuthorizationExecution, RequestCreateInput } from './authorization-types.js';
4
+ /** Raw operation input. The Host computes the fingerprint; consumers cannot supply one. */
5
+ export type UserOperation = {
6
+ readonly action: 'read';
7
+ } | {
8
+ readonly action: 'sign';
9
+ readonly request: SignRequest;
10
+ } | {
11
+ readonly action: 'http';
12
+ readonly request: Request;
13
+ };
14
+ export interface UserAccessRequest {
15
+ readonly requestId: string;
16
+ readonly purpose: string;
17
+ readonly identity?: IdentityReference;
18
+ readonly operation?: UserOperation;
19
+ }
20
+ /** A caller- and identity-bound object with no management or Provider methods. */
21
+ export interface AuthorizedIdentity {
22
+ publicIdentity(executionId?: string): Promise<PublicIdentity>;
23
+ sign(request: SignRequest, executionId?: string): Promise<Signature>;
24
+ readonly authenticatedHttp: {
25
+ dispatch(request: Request, executionId?: string): Promise<Response>;
26
+ };
27
+ }
28
+ export interface UserIdentityClient {
29
+ requestCreateIdentity(input: RequestCreateInput): Promise<AuthorizationRequest>;
30
+ getCreateRequest(requestId: string): Promise<AuthorizationRequest>;
31
+ cancelCreateRequest(requestId: string, expectedVersion: number): Promise<AuthorizationRequest>;
32
+ requestAccess(input: UserAccessRequest): Promise<AuthorizationRequest>;
33
+ getAccessRequest(requestId: string): Promise<AuthorizationRequest>;
34
+ cancelAccessRequest(requestId: string, expectedVersion: number): Promise<AuthorizationRequest>;
35
+ openAuthorizedIdentity(grantId: string): Promise<AuthorizedIdentity>;
36
+ getExecution(executionId: string): Promise<AuthorizationExecution>;
37
+ subscribeRequestChanges(listener: () => void): () => void;
38
+ }
39
+ /** Bind using the installed Cordis context, never a consumer string from a request. */
40
+ export declare function bindIdentityClient(ctx: Context): UserIdentityClient;
41
+ //# sourceMappingURL=user-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-client.d.ts","sourceRoot":"","sources":["../src/user-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC3F,OAAO,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAEhH,2FAA2F;AAC3F,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAA;AAE1D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAA;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAA;CACnC;AAED,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7D,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACpE,QAAQ,CAAC,iBAAiB,EAAE;QAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;KACpE,CAAA;CACF;AAED,MAAM,WAAW,kBAAkB;IACjC,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAC/E,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAClE,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAC9F,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACtE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAClE,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAC9F,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACpE,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;IAClE,uBAAuB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CAC1D;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAGnE"}
@@ -0,0 +1,6 @@
1
+ /** Bind using the installed Cordis context, never a consumer string from a request. */
2
+ export function bindIdentityClient(ctx) {
3
+ const service = ctx.anpIdentity;
4
+ return service.bindUserConsumer(ctx);
5
+ }
6
+ //# sourceMappingURL=user-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-client.js","sourceRoot":"","sources":["../src/user-client.ts"],"names":[],"mappings":"AAsCA,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,WAAoF,CAAA;IACxG,OAAO,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;AACtC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ControlledOperation } from './authorization-types.js';
2
+ import type { UserOperation } from './user-client.js';
3
+ export declare function normalizeOperation(operation: UserOperation): Promise<{
4
+ readonly frozen: ControlledOperation;
5
+ readonly input: UserOperation;
6
+ }>;
7
+ //# sourceMappingURL=user-operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-operation.d.ts","sourceRoot":"","sources":["../src/user-operation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAIrD,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC;IAC1E,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAA;IACpC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;CAC9B,CAAC,CAwED"}
@@ -0,0 +1,87 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { pluginError } from './errors.js';
3
+ import { ANP_IDENTITY_HTTP_MAX_BODY_BYTES } from './http-auth.js';
4
+ export async function normalizeOperation(operation) {
5
+ if (operation?.action === 'read')
6
+ return {
7
+ frozen: fingerprint('identity:read', 'Read public identity', { action: 'read' }),
8
+ input: { action: 'read' },
9
+ };
10
+ if (operation?.action === 'sign') {
11
+ const original = operation.request;
12
+ if (!original || !Buffer.isBuffer(original.payload)
13
+ || original.payload.length > ANP_IDENTITY_HTTP_MAX_BODY_BYTES
14
+ || !['authentication', 'application_assertion'].includes(original.purpose)
15
+ || (original.kid !== undefined && typeof original.kid !== 'string')
16
+ || (original.purpose === 'application_assertion' && (typeof original.domain !== 'string' || !original.domain))) {
17
+ throw pluginError('invalid_request');
18
+ }
19
+ const request = original.purpose === 'application_assertion'
20
+ ? { purpose: original.purpose, domain: original.domain, payload: Buffer.from(original.payload), ...(original.kid === undefined ? {} : { kid: original.kid }) }
21
+ : { purpose: 'authentication', payload: Buffer.from(original.payload), ...(original.kid === undefined ? {} : { kid: original.kid }) };
22
+ return {
23
+ frozen: { ...fingerprint('identity:sign', `Sign: ${request.purpose}`, {
24
+ action: 'sign', purpose: request.purpose, kid: request.kid ?? null,
25
+ domain: request.purpose === 'application_assertion' ? request.domain : null,
26
+ payload: request.payload.toString('base64'),
27
+ }), signingPurpose: request.purpose },
28
+ input: { action: 'sign', request },
29
+ };
30
+ }
31
+ if (operation?.action !== 'http' || !(operation.request instanceof Request) || operation.request.bodyUsed) {
32
+ throw pluginError('invalid_request');
33
+ }
34
+ const original = operation.request;
35
+ const url = new URL(original.url);
36
+ if (url.protocol !== 'https:' || url.username || url.password || url.hash)
37
+ throw pluginError('http_origin_forbidden');
38
+ for (const header of ['authorization', 'signature', 'signature-input', 'content-digest']) {
39
+ if (original.headers.has(header))
40
+ throw pluginError('invalid_request');
41
+ }
42
+ const clone = original.clone();
43
+ const reader = clone.body?.getReader();
44
+ let body;
45
+ if (reader) {
46
+ const chunks = [];
47
+ let size = 0;
48
+ try {
49
+ for (;;) {
50
+ const result = await reader.read();
51
+ if (result.done)
52
+ break;
53
+ size += result.value.length;
54
+ if (size > ANP_IDENTITY_HTTP_MAX_BODY_BYTES) {
55
+ void reader.cancel().catch(() => { });
56
+ throw pluginError('http_body_too_large');
57
+ }
58
+ chunks.push(Uint8Array.from(result.value));
59
+ }
60
+ body = Buffer.concat(chunks);
61
+ }
62
+ finally {
63
+ reader.releaseLock();
64
+ }
65
+ }
66
+ const request = new Request(original.url, {
67
+ method: original.method, headers: new Headers(original.headers), redirect: 'manual',
68
+ signal: original.signal, credentials: original.credentials, cache: original.cache,
69
+ mode: original.mode, referrer: original.referrer, referrerPolicy: original.referrerPolicy,
70
+ integrity: original.integrity, keepalive: original.keepalive,
71
+ ...(body === undefined ? {} : { body: Uint8Array.from(body) }),
72
+ });
73
+ return {
74
+ frozen: { ...fingerprint('identity:http-auth', `${request.method} ${url.origin}${url.pathname}${url.href.includes('?') ? '(包含查询参数,内容未展示)' : ''}`, {
75
+ action: 'http', url: request.url, method: request.method, headers: [...request.headers],
76
+ body: body === undefined ? null : Buffer.from(body).toString('base64'),
77
+ credentials: request.credentials, cache: request.cache, mode: request.mode,
78
+ referrer: request.referrer, referrerPolicy: request.referrerPolicy,
79
+ integrity: request.integrity, keepalive: request.keepalive,
80
+ }), httpOrigin: url.origin },
81
+ input: { action: 'http', request },
82
+ };
83
+ }
84
+ function fingerprint(capability, summary, payload) {
85
+ return { capability, summary, fingerprint: createHash('sha256').update(JSON.stringify(payload)).digest('hex') };
86
+ }
87
+ //# sourceMappingURL=user-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-operation.js","sourceRoot":"","sources":["../src/user-operation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { ProviderLease } from '@agent-network-protocol/anp-identity/provider';
3
+ import type { IdentityReference, PublicIdentity } from './types.js';
4
+ import { AuthorizationEngine } from './authorization.js';
5
+ import type { CapabilitySnapshot, CreateParameters, CreateResult, VerifiedCaller } from './authorization-types.js';
6
+ import type { UserIdentityClient } from './user-client.js';
7
+ export interface UserServiceHost {
8
+ ensureReady(): Promise<void>;
9
+ resolveCaller(context: Context): VerifiedCaller;
10
+ validateCaller(caller: VerifiedCaller): Promise<void>;
11
+ resolveSnapshot(caller: VerifiedCaller, identity: IdentityReference): Promise<CapabilitySnapshot>;
12
+ createIdentity(operationId: string, caller: VerifiedCaller, parameters: CreateParameters): Promise<CreateResult>;
13
+ reconcileCreation(operationId: string, caller: VerifiedCaller, parameters: CreateParameters): Promise<CreateResult | undefined>;
14
+ withNative<T>(operation: (lease: ProviderLease) => Promise<T>): Promise<T>;
15
+ }
16
+ /** Host boundary. The engine is never exposed on the ordinary client or management Remote. */
17
+ export declare class UserIdentityService {
18
+ readonly host: UserServiceHost;
19
+ readonly engine: AuthorizationEngine;
20
+ readonly ready: Promise<void>;
21
+ constructor(stateRoot: string, host: UserServiceHost);
22
+ bind(context: Context): UserIdentityClient;
23
+ private managed;
24
+ }
25
+ export declare function requestSigningKid(identity: PublicIdentity): string;
26
+ //# sourceMappingURL=user-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-service.d.ts","sourceRoot":"","sources":["../src/user-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAA;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAmB,kBAAkB,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACnI,OAAO,KAAK,EAAsB,kBAAkB,EAAiB,MAAM,kBAAkB,CAAA;AAK7F,MAAM,WAAW,eAAe;IAC9B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAAA;IAC/C,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrD,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACjG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAChH,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;IAC/H,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC3E;AAED,8FAA8F;AAC9F,qBAAa,mBAAmB;IAGC,QAAQ,CAAC,IAAI,EAAE,eAAe;IAF7D,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAA;IACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;gBACjB,SAAS,EAAE,MAAM,EAAW,IAAI,EAAE,eAAe;IAM7D,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,kBAAkB;IAuD1C,OAAO,CAAC,OAAO;CAwDhB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAKlE"}
@@ -0,0 +1,140 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { AuthorizationEngine } from './authorization.js';
3
+ import { normalizeOperation } from './user-operation.js';
4
+ import { createAuthenticatedHttp } from './http-auth.js';
5
+ import { pluginError } from './errors.js';
6
+ /** Host boundary. The engine is never exposed on the ordinary client or management Remote. */
7
+ export class UserIdentityService {
8
+ host;
9
+ engine;
10
+ ready;
11
+ constructor(stateRoot, host) {
12
+ this.host = host;
13
+ this.engine = new AuthorizationEngine(stateRoot, host);
14
+ this.ready = this.engine.initialize();
15
+ void this.ready.catch(() => { });
16
+ }
17
+ bind(context) {
18
+ const source = this.host.resolveCaller(context);
19
+ const check = async () => {
20
+ await this.ready;
21
+ // Provider startup may need the ledger lock; never wait for it inside a transaction.
22
+ await this.host.ensureReady();
23
+ const current = this.host.resolveCaller(context);
24
+ if (current.consumer !== source.consumer)
25
+ throw pluginError('consumer_forbidden');
26
+ await this.host.validateCaller(current);
27
+ };
28
+ const get = async (id, kind) => {
29
+ await check();
30
+ let request = await this.engine.getRequest(source, id);
31
+ if (request.kind !== kind)
32
+ throw pluginError('invalid_request');
33
+ if (request.kind === 'create' && request.status === 'approved'
34
+ && (request.executionStatus === 'running' || request.executionStatus === 'unknown')) {
35
+ request = await this.engine.reconcileCreation(id);
36
+ }
37
+ return request;
38
+ };
39
+ const cancel = async (id, version, kind) => {
40
+ await get(id, kind);
41
+ return this.engine.cancel(source, id, version);
42
+ };
43
+ return Object.freeze({
44
+ requestCreateIdentity: async (input) => { await check(); return this.engine.requestCreate(source, input); },
45
+ getCreateRequest: (id) => get(id, 'create'),
46
+ cancelCreateRequest: (id, version) => cancel(id, version, 'create'),
47
+ requestAccess: async (input) => {
48
+ await check();
49
+ const normalized = input.operation === undefined ? undefined : await normalizeOperation(input.operation);
50
+ return this.engine.requestAccess(source, {
51
+ requestId: input.requestId, purpose: input.purpose,
52
+ ...(input.identity === undefined ? {} : { identity: structuredClone(input.identity) }),
53
+ ...(normalized === undefined ? {} : { operation: normalized.frozen }),
54
+ });
55
+ },
56
+ getAccessRequest: (id) => get(id, 'access'),
57
+ cancelAccessRequest: (id, version) => cancel(id, version, 'access'),
58
+ openAuthorizedIdentity: async (id) => {
59
+ await check();
60
+ return this.managed(source, await this.engine.open(source, id), check);
61
+ },
62
+ getExecution: async (id) => { await check(); return this.engine.getExecution(source, id); },
63
+ subscribeRequestChanges: (listener) => {
64
+ if (typeof listener !== 'function')
65
+ throw pluginError('invalid_request');
66
+ const dispose = this.engine.subscribeRequestChanges(() => {
67
+ void check().then(() => { listener(); }).catch(() => { });
68
+ });
69
+ context.effect(() => dispose, 'anp-identity: request notifications');
70
+ return dispose;
71
+ },
72
+ });
73
+ }
74
+ managed(source, lease, checkCaller) {
75
+ const run = async (raw, id, execute) => {
76
+ await checkCaller();
77
+ const { frozen, input } = await normalizeOperation(raw);
78
+ if (id !== undefined && (typeof id !== 'string' || !id || id.length > 256))
79
+ throw pluginError('invalid_request');
80
+ if (input.action === 'sign') {
81
+ await this.host.withNative(async (native) => {
82
+ const identity = await native.publicIdentity(lease.identity);
83
+ const keys = identity.activeKeys.filter(key => key.algorithm === 'ed25519'
84
+ && key.purposes.includes(input.request.purpose)
85
+ && (input.request.kid === undefined || key.kid === input.request.kid));
86
+ if (keys.length !== 1)
87
+ throw pluginError('invalid_request');
88
+ });
89
+ }
90
+ const executionId = id ?? randomUUID();
91
+ await this.engine.admit(source, lease, frozen, executionId);
92
+ const assertActive = async () => {
93
+ await checkCaller();
94
+ await this.engine.assertExecutionActive(source, lease, executionId);
95
+ };
96
+ try {
97
+ const result = await this.host.withNative(async (native) => {
98
+ await assertActive();
99
+ return execute(native, input, assertActive);
100
+ });
101
+ await this.engine.recordExecution(source, executionId, 'succeeded');
102
+ return result;
103
+ }
104
+ catch (error) {
105
+ // Once admission is durable; neither transport errors nor lost results refund it.
106
+ await this.engine.recordExecution(source, executionId, 'unknown').catch(() => { });
107
+ throw error;
108
+ }
109
+ };
110
+ return Object.freeze({
111
+ publicIdentity: (executionId) => run({ action: 'read' }, executionId, native => native.publicIdentity(lease.identity)),
112
+ sign: (request, executionId) => run({ action: 'sign', request }, executionId, (native, operation) => {
113
+ if (operation.action !== 'sign')
114
+ throw pluginError('invalid_request');
115
+ return native.sign(lease.identity, operation.request);
116
+ }),
117
+ authenticatedHttp: Object.freeze({
118
+ dispatch: async (request, executionId) => {
119
+ return run({ action: 'http', request }, executionId, async (native, operation, assertActive) => {
120
+ if (operation.action !== 'http')
121
+ throw pluginError('invalid_request');
122
+ const origins = new Set([new URL(operation.request.url).origin]);
123
+ return createAuthenticatedHttp(lease.identity, native, origins, assertActive, async () => {
124
+ const identity = await native.publicIdentity(lease.identity);
125
+ return requestSigningKid(identity);
126
+ }).dispatch(operation.request, outgoing => fetch(outgoing));
127
+ });
128
+ },
129
+ }),
130
+ });
131
+ }
132
+ }
133
+ export function requestSigningKid(identity) {
134
+ const keys = identity.activeKeys.filter(key => key.algorithm === 'ed25519'
135
+ && key.purposes.includes('authentication') && key.purposes.includes('application_assertion'));
136
+ if (keys.length !== 1)
137
+ throw pluginError('provider_incompatible');
138
+ return keys[0].kid;
139
+ }
140
+ //# sourceMappingURL=user-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-service.js","sourceRoot":"","sources":["../src/user-service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-network-protocol/dsh-anp-identity",
3
- "version": "0.1.2",
3
+ "version": "0.1.3-rc.2",
4
4
  "description": "ANP Identity management plugin for DeepSeek Harness",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -18,6 +18,22 @@
18
18
  "types": "./lib/provider-api.d.ts",
19
19
  "default": "./lib/provider-api.js"
20
20
  },
21
+ "./user-client": {
22
+ "types": "./lib/user-client.d.ts",
23
+ "default": "./lib/user-client.js"
24
+ },
25
+ "./client": {
26
+ "types": "./lib/client/index.d.ts",
27
+ "default": "./lib/client.js"
28
+ },
29
+ "./remote": {
30
+ "types": "./lib/remote.d.ts",
31
+ "default": "./lib/remote.js"
32
+ },
33
+ "./management-remote": {
34
+ "types": "./lib/management-remote.d.ts",
35
+ "default": "./lib/management-remote.js"
36
+ },
21
37
  "./cordis.patch.yml": "./cordis.patch.yml",
22
38
  "./package.json": "./package.json"
23
39
  },
@@ -27,19 +43,20 @@
27
43
  "README.md",
28
44
  "README.zh.md",
29
45
  "BOUNDARY.md",
46
+ "V7-MANAGEMENT.md",
30
47
  "examples/**",
31
48
  "LICENSE"
32
49
  ],
33
50
  "scripts": {
34
- "build": "tsc -p tsconfig.json",
51
+ "build": "tsc -p tsconfig.json && node scripts/build-client.mjs",
35
52
  "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
36
53
  "test": "npm run build && vitest run",
37
- "test:functional": "node scripts/run-functional-e2e.mjs",
38
54
  "update:public": "node scripts/public-snapshot.mjs --update",
39
55
  "check:public": "npm run build && node scripts/public-snapshot.mjs",
40
56
  "check:generated": "node scripts/check-generated.mjs",
41
- "verify": "npm run typecheck && npm run check:public && npm run check:generated && npm test",
42
- "prepack": "npm run verify"
57
+ "verify": "npm run check:public && npm run typecheck && npm run check:generated && npm test",
58
+ "prepack": "npm run verify",
59
+ "test:functional": "node scripts/run-functional-e2e.mjs"
43
60
  },
44
61
  "keywords": [
45
62
  "anp",
@@ -61,23 +78,109 @@
61
78
  "dsh": {
62
79
  "bundle": {
63
80
  "patch": "./cordis.patch.yml"
81
+ },
82
+ "client": {
83
+ "inject": [
84
+ "@deepseek-ai/dsh-client-ui-renderer",
85
+ "@deepseek-ai/dsh-api-remotes",
86
+ "@deepseek-ai/dsh-client-connection",
87
+ "@deepseek-ai/dsh-client-ui-layout",
88
+ "@deepseek-ai/dsh-client-ui-settings"
89
+ ],
90
+ "platform": "web"
64
91
  }
65
92
  },
66
93
  "peerDependencies": {
67
- "@deepseek-ai/cordis": "^4.0.1"
94
+ "@deepseek-ai/cordis": "^4.0.2",
95
+ "@deepseek-ai/dsh-api-remotes": "^0.1.5-rc.1",
96
+ "@deepseek-ai/dsh-client-connection": "^0.1.5-rc.1",
97
+ "@deepseek-ai/dsh-client-ui-layout": "^0.1.5-rc.1",
98
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-rc.1",
99
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-rc.1",
100
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.5-rc.1",
101
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.5-rc.1",
102
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.5-rc.1",
103
+ "react": "^18.3.1"
104
+ },
105
+ "peerDependenciesMeta": {
106
+ "@deepseek-ai/dsh-typert-protocol": {
107
+ "optional": true
108
+ },
109
+ "@deepseek-ai/dsh-client-ui-renderer": {
110
+ "optional": true
111
+ },
112
+ "@deepseek-ai/dsh-api-remotes": {
113
+ "optional": true
114
+ },
115
+ "@deepseek-ai/dsh-client-connection": {
116
+ "optional": true
117
+ },
118
+ "@deepseek-ai/dsh-client-ui-layout": {
119
+ "optional": true
120
+ },
121
+ "@deepseek-ai/dsh-client-ui-settings": {
122
+ "optional": true
123
+ },
124
+ "@deepseek-ai/dsh-client-ui-slots": {
125
+ "optional": true
126
+ },
127
+ "@deepseek-ai/dsh-client-ui-primitives": {
128
+ "optional": true
129
+ },
130
+ "react": {
131
+ "optional": true
132
+ }
68
133
  },
69
134
  "dependencies": {
70
- "@agent-network-protocol/anp-identity": "0.2.2",
71
135
  "@deepseek-ai/schemastery": "^3.18.1",
72
- "proper-lockfile": "^4.1.2"
136
+ "proper-lockfile": "^4.1.2",
137
+ "zod": "^4.6.2",
138
+ "@agent-network-protocol/anp-identity": "0.2.2"
73
139
  },
74
140
  "devDependencies": {
75
141
  "@agent-network-protocol/anp-identity": "file:../../bindings/node",
76
- "@deepseek-ai/cordis": "^4.0.1",
142
+ "@deepseek-ai/cordis": "4.0.2",
143
+ "@deepseek-ai/cordis-plugin-loader": "1.0.3",
144
+ "@deepseek-ai/dsh-api-gateway": "0.1.5-rc.1",
145
+ "@deepseek-ai/dsh-api-remotes": "0.1.5-rc.1",
146
+ "@deepseek-ai/dsh-client-connection": "0.1.5-rc.1",
147
+ "@deepseek-ai/dsh-client-store": "0.1.5-rc.1",
148
+ "@deepseek-ai/dsh-client-ui-layout": "0.1.5-rc.1",
149
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.5-rc.1",
150
+ "@deepseek-ai/dsh-client-ui-renderer": "0.1.5-rc.1",
151
+ "@deepseek-ai/dsh-client-ui-settings": "0.1.5-rc.1",
152
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.5-rc.1",
153
+ "@deepseek-ai/dsh-typert-protocol": "0.1.5-rc.1",
154
+ "@deepseek-ai/dsh-typert-registry": "0.1.5-rc.1",
155
+ "@shikijs/langs": "^4.3.1",
156
+ "@testing-library/dom": "^10.4.1",
157
+ "@testing-library/react": "^16.3.3",
77
158
  "@types/node": "^24.0.0",
78
159
  "@types/proper-lockfile": "^4.1.4",
160
+ "@types/react": "^18.3.31",
161
+ "@types/react-dom": "^18.3.7",
162
+ "anser": "^2.3.5",
163
+ "clsx": "^2.0.0",
164
+ "esbuild": "^0.25.12",
165
+ "jsdom": "^26.1.0",
166
+ "katex": "^0.16.47",
167
+ "mdast-util-from-markdown": "^2.0.3",
168
+ "mdast-util-gfm": "^3.1.0",
169
+ "mdast-util-math": "^3.0.0",
170
+ "micromark-core-commonmark": "^2.0.3",
171
+ "micromark-extension-gfm": "^3.0.0",
172
+ "micromark-extension-math": "^3.1.0",
173
+ "micromark-factory-space": "^2.0.1",
174
+ "micromark-util-character": "^2.1.1",
175
+ "micromark-util-classify-character": "^2.0.1",
176
+ "micromark-util-sanitize-uri": "^2.0.1",
177
+ "micromark-util-symbol": "^2.0.1",
178
+ "react": "^18.3.1",
179
+ "react-dom": "^18.3.1",
180
+ "shiki": "^4.3.1",
79
181
  "typescript": "^6.0.3",
80
- "vitest": "^4.1.10"
182
+ "vitest": "^4.1.10",
183
+ "zod": "^4.6.2"
81
184
  },
82
185
  "engines": {
83
186
  "node": "^22.19.0 || >=24.0.0"