@vess-id/vess 0.0.0-dev-20260902121045
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/LICENSE +64 -0
- package/README.md +215 -0
- package/bin/vess.js +2 -0
- package/dist/__mocks__/@napi-rs/keyring.d.ts +9 -0
- package/dist/__mocks__/@napi-rs/keyring.d.ts.map +1 -0
- package/dist/__mocks__/@napi-rs/keyring.js +33 -0
- package/dist/__mocks__/@napi-rs/keyring.js.map +1 -0
- package/dist/__mocks__/node-mac-auth.d.ts +8 -0
- package/dist/__mocks__/node-mac-auth.d.ts.map +1 -0
- package/dist/__mocks__/node-mac-auth.js +29 -0
- package/dist/__mocks__/node-mac-auth.js.map +1 -0
- package/dist/adapter/mcp/http-transport.d.ts +40 -0
- package/dist/adapter/mcp/http-transport.d.ts.map +1 -0
- package/dist/adapter/mcp/http-transport.js +228 -0
- package/dist/adapter/mcp/http-transport.js.map +1 -0
- package/dist/adapter/mcp/mcp-adapter.d.ts +43 -0
- package/dist/adapter/mcp/mcp-adapter.d.ts.map +1 -0
- package/dist/adapter/mcp/mcp-adapter.js +65 -0
- package/dist/adapter/mcp/mcp-adapter.js.map +1 -0
- package/dist/adapter/mcp/mcp-server.factory.d.ts +44 -0
- package/dist/adapter/mcp/mcp-server.factory.d.ts.map +1 -0
- package/dist/adapter/mcp/mcp-server.factory.js +311 -0
- package/dist/adapter/mcp/mcp-server.factory.js.map +1 -0
- package/dist/adapter/mcp/stdio-transport.d.ts +7 -0
- package/dist/adapter/mcp/stdio-transport.d.ts.map +1 -0
- package/dist/adapter/mcp/stdio-transport.js +13 -0
- package/dist/adapter/mcp/stdio-transport.js.map +1 -0
- package/dist/adapter/mcp/transport.d.ts +10 -0
- package/dist/adapter/mcp/transport.d.ts.map +1 -0
- package/dist/adapter/mcp/transport.js +14 -0
- package/dist/adapter/mcp/transport.js.map +1 -0
- package/dist/approval/approval-token.d.ts +23 -0
- package/dist/approval/approval-token.d.ts.map +1 -0
- package/dist/approval/approval-token.js +81 -0
- package/dist/approval/approval-token.js.map +1 -0
- package/dist/audit/audit-dto-mapper.d.ts +29 -0
- package/dist/audit/audit-dto-mapper.d.ts.map +1 -0
- package/dist/audit/audit-dto-mapper.js +61 -0
- package/dist/audit/audit-dto-mapper.js.map +1 -0
- package/dist/audit/audit-logger.d.ts +35 -0
- package/dist/audit/audit-logger.d.ts.map +1 -0
- package/dist/audit/audit-logger.js +67 -0
- package/dist/audit/audit-logger.js.map +1 -0
- package/dist/audit/audit-sync.d.ts +12 -0
- package/dist/audit/audit-sync.d.ts.map +1 -0
- package/dist/audit/audit-sync.js +65 -0
- package/dist/audit/audit-sync.js.map +1 -0
- package/dist/auth/user-authenticator.d.ts +51 -0
- package/dist/auth/user-authenticator.d.ts.map +1 -0
- package/dist/auth/user-authenticator.js +155 -0
- package/dist/auth/user-authenticator.js.map +1 -0
- package/dist/bootstrap/sdk-precheck.d.ts +9 -0
- package/dist/bootstrap/sdk-precheck.d.ts.map +1 -0
- package/dist/bootstrap/sdk-precheck.js +103 -0
- package/dist/bootstrap/sdk-precheck.js.map +1 -0
- package/dist/cli/claude-config-path.d.ts +17 -0
- package/dist/cli/claude-config-path.d.ts.map +1 -0
- package/dist/cli/claude-config-path.js +59 -0
- package/dist/cli/claude-config-path.js.map +1 -0
- package/dist/cli/cli-db.d.ts +12 -0
- package/dist/cli/cli-db.d.ts.map +1 -0
- package/dist/cli/cli-db.js +20 -0
- package/dist/cli/cli-db.js.map +1 -0
- package/dist/cli/cli-utils.d.ts +14 -0
- package/dist/cli/cli-utils.d.ts.map +1 -0
- package/dist/cli/cli-utils.js +57 -0
- package/dist/cli/cli-utils.js.map +1 -0
- package/dist/cli/daemon-utils.d.ts +30 -0
- package/dist/cli/daemon-utils.d.ts.map +1 -0
- package/dist/cli/daemon-utils.js +131 -0
- package/dist/cli/daemon-utils.js.map +1 -0
- package/dist/cli/daemon.d.ts +13 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +207 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/doctor.d.ts +6 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +136 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/env-delete.d.ts +6 -0
- package/dist/cli/env-delete.d.ts.map +1 -0
- package/dist/cli/env-delete.js +80 -0
- package/dist/cli/env-delete.js.map +1 -0
- package/dist/cli/env-list.d.ts +5 -0
- package/dist/cli/env-list.d.ts.map +1 -0
- package/dist/cli/env-list.js +42 -0
- package/dist/cli/env-list.js.map +1 -0
- package/dist/cli/env-post-integration.d.ts +21 -0
- package/dist/cli/env-post-integration.d.ts.map +1 -0
- package/dist/cli/env-post-integration.js +300 -0
- package/dist/cli/env-post-integration.js.map +1 -0
- package/dist/cli/env-restore.d.ts +15 -0
- package/dist/cli/env-restore.d.ts.map +1 -0
- package/dist/cli/env-restore.js +130 -0
- package/dist/cli/env-restore.js.map +1 -0
- package/dist/cli/env.d.ts +14 -0
- package/dist/cli/env.d.ts.map +1 -0
- package/dist/cli/env.js +182 -0
- package/dist/cli/env.js.map +1 -0
- package/dist/cli/error-handlers.d.ts +13 -0
- package/dist/cli/error-handlers.d.ts.map +1 -0
- package/dist/cli/error-handlers.js +32 -0
- package/dist/cli/error-handlers.js.map +1 -0
- package/dist/cli/hook-check-env.d.ts +12 -0
- package/dist/cli/hook-check-env.d.ts.map +1 -0
- package/dist/cli/hook-check-env.js +117 -0
- package/dist/cli/hook-check-env.js.map +1 -0
- package/dist/cli/hook-session-project.d.ts +10 -0
- package/dist/cli/hook-session-project.d.ts.map +1 -0
- package/dist/cli/hook-session-project.js +206 -0
- package/dist/cli/hook-session-project.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +361 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-guard.d.ts +13 -0
- package/dist/cli/init-guard.d.ts.map +1 -0
- package/dist/cli/init-guard.js +62 -0
- package/dist/cli/init-guard.js.map +1 -0
- package/dist/cli/init.d.ts +19 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +440 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/install.d.ts +14 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +183 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/login.d.ts +6 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +76 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/logs.d.ts +32 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +147 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/otel-headers.d.ts +12 -0
- package/dist/cli/otel-headers.d.ts.map +1 -0
- package/dist/cli/otel-headers.js +38 -0
- package/dist/cli/otel-headers.js.map +1 -0
- package/dist/cli/project.d.ts +8 -0
- package/dist/cli/project.d.ts.map +1 -0
- package/dist/cli/project.js +102 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli/reset.d.ts +8 -0
- package/dist/cli/reset.d.ts.map +1 -0
- package/dist/cli/reset.js +137 -0
- package/dist/cli/reset.js.map +1 -0
- package/dist/cli/run.d.ts +22 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +103 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/start.d.ts +2 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +29 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/status.d.ts +12 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +131 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/telemetry-setup.d.ts +27 -0
- package/dist/cli/telemetry-setup.d.ts.map +1 -0
- package/dist/cli/telemetry-setup.js +157 -0
- package/dist/cli/telemetry-setup.js.map +1 -0
- package/dist/cli/uninstall.d.ts +8 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +110 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/version.d.ts +2 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +10 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/config/config.d.ts +10 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +64 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/constants.d.ts +11 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +14 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/paths.d.ts +9 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +58 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/version.d.ts +3 -0
- package/dist/config/version.d.ts.map +1 -0
- package/dist/config/version.js +80 -0
- package/dist/config/version.js.map +1 -0
- package/dist/core/execution-engine.d.ts +289 -0
- package/dist/core/execution-engine.d.ts.map +1 -0
- package/dist/core/execution-engine.js +1931 -0
- package/dist/core/execution-engine.js.map +1 -0
- package/dist/core/runtime.d.ts +43 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +147 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/sync-scheduler.d.ts +42 -0
- package/dist/core/sync-scheduler.d.ts.map +1 -0
- package/dist/core/sync-scheduler.js +131 -0
- package/dist/core/sync-scheduler.js.map +1 -0
- package/dist/core/types.d.ts +106 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/daemon/service-manager.d.ts +68 -0
- package/dist/daemon/service-manager.d.ts.map +1 -0
- package/dist/daemon/service-manager.js +303 -0
- package/dist/daemon/service-manager.js.map +1 -0
- package/dist/env/env-classifier.d.ts +14 -0
- package/dist/env/env-classifier.d.ts.map +1 -0
- package/dist/env/env-classifier.js +94 -0
- package/dist/env/env-classifier.js.map +1 -0
- package/dist/env/env-parser.d.ts +13 -0
- package/dist/env/env-parser.d.ts.map +1 -0
- package/dist/env/env-parser.js +33 -0
- package/dist/env/env-parser.js.map +1 -0
- package/dist/env/env-profile-store.d.ts +15 -0
- package/dist/env/env-profile-store.d.ts.map +1 -0
- package/dist/env/env-profile-store.js +35 -0
- package/dist/env/env-profile-store.js.map +1 -0
- package/dist/env/env-reference.d.ts +10 -0
- package/dist/env/env-reference.d.ts.map +1 -0
- package/dist/env/env-reference.js +33 -0
- package/dist/env/env-reference.js.map +1 -0
- package/dist/env/env-resolver.d.ts +18 -0
- package/dist/env/env-resolver.d.ts.map +1 -0
- package/dist/env/env-resolver.js +48 -0
- package/dist/env/env-resolver.js.map +1 -0
- package/dist/env/fs-utils.d.ts +9 -0
- package/dist/env/fs-utils.d.ts.map +1 -0
- package/dist/env/fs-utils.js +59 -0
- package/dist/env/fs-utils.js.map +1 -0
- package/dist/env/secret-backend.d.ts +15 -0
- package/dist/env/secret-backend.d.ts.map +1 -0
- package/dist/env/secret-backend.js +24 -0
- package/dist/env/secret-backend.js.map +1 -0
- package/dist/executor/executor-registry.d.ts +22 -0
- package/dist/executor/executor-registry.d.ts.map +1 -0
- package/dist/executor/executor-registry.js +42 -0
- package/dist/executor/executor-registry.js.map +1 -0
- package/dist/executor/process-launcher.d.ts +26 -0
- package/dist/executor/process-launcher.d.ts.map +1 -0
- package/dist/executor/process-launcher.js +98 -0
- package/dist/executor/process-launcher.js.map +1 -0
- package/dist/executor/secret-file.d.ts +28 -0
- package/dist/executor/secret-file.d.ts.map +1 -0
- package/dist/executor/secret-file.js +127 -0
- package/dist/executor/secret-file.js.map +1 -0
- package/dist/gateway/auth.d.ts +26 -0
- package/dist/gateway/auth.d.ts.map +1 -0
- package/dist/gateway/auth.js +66 -0
- package/dist/gateway/auth.js.map +1 -0
- package/dist/gateway/gateway-client.d.ts +363 -0
- package/dist/gateway/gateway-client.d.ts.map +1 -0
- package/dist/gateway/gateway-client.js +611 -0
- package/dist/gateway/gateway-client.js.map +1 -0
- package/dist/identity/agent-identity.d.ts +29 -0
- package/dist/identity/agent-identity.d.ts.map +1 -0
- package/dist/identity/agent-identity.js +54 -0
- package/dist/identity/agent-identity.js.map +1 -0
- package/dist/identity/did-manager.d.ts +17 -0
- package/dist/identity/did-manager.d.ts.map +1 -0
- package/dist/identity/did-manager.js +29 -0
- package/dist/identity/did-manager.js.map +1 -0
- package/dist/identity/key-manager.d.ts +21 -0
- package/dist/identity/key-manager.d.ts.map +1 -0
- package/dist/identity/key-manager.js +126 -0
- package/dist/identity/key-manager.js.map +1 -0
- package/dist/identity/session-key.d.ts +13 -0
- package/dist/identity/session-key.d.ts.map +1 -0
- package/dist/identity/session-key.js +17 -0
- package/dist/identity/session-key.js.map +1 -0
- package/dist/policy/policy-evaluator.d.ts +63 -0
- package/dist/policy/policy-evaluator.d.ts.map +1 -0
- package/dist/policy/policy-evaluator.js +266 -0
- package/dist/policy/policy-evaluator.js.map +1 -0
- package/dist/policy/policy-loader.d.ts +10 -0
- package/dist/policy/policy-loader.d.ts.map +1 -0
- package/dist/policy/policy-loader.js +71 -0
- package/dist/policy/policy-loader.js.map +1 -0
- package/dist/policy/types.d.ts +21 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +3 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/telemetry/claude-settings.d.ts +67 -0
- package/dist/telemetry/claude-settings.d.ts.map +1 -0
- package/dist/telemetry/claude-settings.js +191 -0
- package/dist/telemetry/claude-settings.js.map +1 -0
- package/dist/telemetry/otel-headers.d.ts +27 -0
- package/dist/telemetry/otel-headers.d.ts.map +1 -0
- package/dist/telemetry/otel-headers.js +33 -0
- package/dist/telemetry/otel-headers.js.map +1 -0
- package/dist/telemetry/project-key.d.ts +12 -0
- package/dist/telemetry/project-key.d.ts.map +1 -0
- package/dist/telemetry/project-key.js +113 -0
- package/dist/telemetry/project-key.js.map +1 -0
- package/dist/utils/credential-errors.d.ts +73 -0
- package/dist/utils/credential-errors.d.ts.map +1 -0
- package/dist/utils/credential-errors.js +90 -0
- package/dist/utils/credential-errors.js.map +1 -0
- package/dist/utils/resource-canonicalizer.d.ts +19 -0
- package/dist/utils/resource-canonicalizer.d.ts.map +1 -0
- package/dist/utils/resource-canonicalizer.js +100 -0
- package/dist/utils/resource-canonicalizer.js.map +1 -0
- package/dist/utils/vc-utils.d.ts +23 -0
- package/dist/utils/vc-utils.d.ts.map +1 -0
- package/dist/utils/vc-utils.js +53 -0
- package/dist/utils/vc-utils.js.map +1 -0
- package/dist/wallet/sqlite.d.ts +4 -0
- package/dist/wallet/sqlite.d.ts.map +1 -0
- package/dist/wallet/sqlite.js +158 -0
- package/dist/wallet/sqlite.js.map +1 -0
- package/dist/wallet/vp-builder.d.ts +26 -0
- package/dist/wallet/vp-builder.d.ts.map +1 -0
- package/dist/wallet/vp-builder.js +55 -0
- package/dist/wallet/vp-builder.js.map +1 -0
- package/dist/wallet/wallet.d.ts +64 -0
- package/dist/wallet/wallet.d.ts.map +1 -0
- package/dist/wallet/wallet.js +179 -0
- package/dist/wallet/wallet.js.map +1 -0
- package/package.json +71 -0
- package/required-sdk-symbols.json +15 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal shape extracted from an api invoke-time `auth_required` (HTTP 202)
|
|
3
|
+
* response. The approval URL is NOT carried here — the 202 body has none; the
|
|
4
|
+
* ExecutionEngine mints one via `createApprovalRequest` after detecting this
|
|
5
|
+
* signal. `action` is surfaced for the error message; the wire's
|
|
6
|
+
* `determining_policy_ids` is intentionally NOT carried — the agentd audit
|
|
7
|
+
* sink has no attribution field for it today (same gap as the forbid branch),
|
|
8
|
+
* so parsing it would imply coverage that doesn't exist.
|
|
9
|
+
*/
|
|
10
|
+
export interface ApiApprovalRequired {
|
|
11
|
+
action?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Probe an api response body for an invoke-time `auth_required` signal.
|
|
15
|
+
*
|
|
16
|
+
* The api shape (HTTP 202, produced by GlobalHttpExceptionFilter's passthrough
|
|
17
|
+
* for AuthRequiredException) is TOP-LEVEL — NOT the `metadata.action` envelope
|
|
18
|
+
* that reauth uses:
|
|
19
|
+
* `{ statusCode: 202, code: 'auth_required', decision: 'auth_required',
|
|
20
|
+
* action, determining_policy_ids }`
|
|
21
|
+
*
|
|
22
|
+
* So we key off `code`/`decision` at the top level (either may be present).
|
|
23
|
+
* Returns the extracted payload if present, otherwise `undefined`.
|
|
24
|
+
*
|
|
25
|
+
* Note: a Cedar `policy_forbidden` (403) is a DIFFERENT, terminal signal and is
|
|
26
|
+
* intentionally not matched here — it arrives on the non-2xx path and is
|
|
27
|
+
* classified separately by the gateway-client.
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractApprovalRequired(body: unknown): ApiApprovalRequired | undefined;
|
|
30
|
+
/** Check if an error message indicates an invalid credential (expired, revoked, etc.) */
|
|
31
|
+
export declare function isCredentialInvalidError(message?: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Minimal shape of the reauth payload api returns on revoked/expired OAuth tokens.
|
|
34
|
+
* Kept loose on purpose — the api may add fields without breaking agentd.
|
|
35
|
+
*
|
|
36
|
+
* Layer note — three similar types intentionally exist in this repo:
|
|
37
|
+
* - `ApiReauthRequired` (this file): wire shape parsed from api bodies
|
|
38
|
+
* - `ReauthRequiredInfo` (gateway-client.ts): wire-level result carried
|
|
39
|
+
* alongside `InvokeToolResult.errorCode`
|
|
40
|
+
* - `ReauthRequiredExecutionInfo` (core/types.ts): user-facing ExecuteResult
|
|
41
|
+
* field, trimmed of wire-level knobs (e.g. `metadata`)
|
|
42
|
+
* The duplication is deliberate: each layer drops context the next one
|
|
43
|
+
* doesn't need, which keeps the CLI surface minimal.
|
|
44
|
+
*/
|
|
45
|
+
export interface ApiReauthRequired {
|
|
46
|
+
provider: string;
|
|
47
|
+
reason: string;
|
|
48
|
+
message: string;
|
|
49
|
+
authUrl: string;
|
|
50
|
+
projectId?: string;
|
|
51
|
+
metadata?: Record<string, any>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Probe an api response body for a reauth_required signal.
|
|
55
|
+
*
|
|
56
|
+
* The api shape is:
|
|
57
|
+
* `{ success:false, error, metadata: { action: 'reauth_required',
|
|
58
|
+
* reauthRequired: { provider, reason, message, authUrl, projectId, ... } } }`
|
|
59
|
+
*
|
|
60
|
+
* Returns the extracted payload if present, otherwise `undefined`.
|
|
61
|
+
*
|
|
62
|
+
* Guards:
|
|
63
|
+
* - Requires `authUrl` to be a non-empty string (without it the signal is
|
|
64
|
+
* useless — the CLI caller has nothing to surface to the user).
|
|
65
|
+
* - Does not trust the outer `success` flag. If a future api bug sets
|
|
66
|
+
* `success:true` on a reauth response, we still treat it as a reauth
|
|
67
|
+
* failure: the underlying SaaS token is gone, and any "data" in that
|
|
68
|
+
* envelope would be stale or misleading. `action:'reauth_required'`
|
|
69
|
+
* is the canonical signal, not `success`. (Spec'd in gateway-client
|
|
70
|
+
* reauth tests as the "contradictory body" regression guard.)
|
|
71
|
+
*/
|
|
72
|
+
export declare function extractReauthRequired(body: unknown): ApiReauthRequired | undefined;
|
|
73
|
+
//# sourceMappingURL=credential-errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-errors.d.ts","sourceRoot":"","sources":["../../src/utils/credential-errors.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,mBAAmB,GAAG,SAAS,CAQtF;AAgBD,yFAAyF;AACzF,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAGlE;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAclF"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractApprovalRequired = extractApprovalRequired;
|
|
4
|
+
exports.isCredentialInvalidError = isCredentialInvalidError;
|
|
5
|
+
exports.extractReauthRequired = extractReauthRequired;
|
|
6
|
+
const ai_identity_1 = require("@vess-id/ai-identity");
|
|
7
|
+
/**
|
|
8
|
+
* Probe an api response body for an invoke-time `auth_required` signal.
|
|
9
|
+
*
|
|
10
|
+
* The api shape (HTTP 202, produced by GlobalHttpExceptionFilter's passthrough
|
|
11
|
+
* for AuthRequiredException) is TOP-LEVEL — NOT the `metadata.action` envelope
|
|
12
|
+
* that reauth uses:
|
|
13
|
+
* `{ statusCode: 202, code: 'auth_required', decision: 'auth_required',
|
|
14
|
+
* action, determining_policy_ids }`
|
|
15
|
+
*
|
|
16
|
+
* So we key off `code`/`decision` at the top level (either may be present).
|
|
17
|
+
* Returns the extracted payload if present, otherwise `undefined`.
|
|
18
|
+
*
|
|
19
|
+
* Note: a Cedar `policy_forbidden` (403) is a DIFFERENT, terminal signal and is
|
|
20
|
+
* intentionally not matched here — it arrives on the non-2xx path and is
|
|
21
|
+
* classified separately by the gateway-client.
|
|
22
|
+
*/
|
|
23
|
+
function extractApprovalRequired(body) {
|
|
24
|
+
if (!body || typeof body !== 'object')
|
|
25
|
+
return undefined;
|
|
26
|
+
const b = body;
|
|
27
|
+
const isAuthRequired = b.code === 'auth_required' || b.decision === 'auth_required';
|
|
28
|
+
if (!isAuthRequired)
|
|
29
|
+
return undefined;
|
|
30
|
+
return {
|
|
31
|
+
action: typeof b.action === 'string' ? b.action : undefined,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Patterns that indicate a credential/VP is invalid (expired, revoked, malformed).
|
|
36
|
+
* Shared between gateway-client (HTTP response detection) and execution-engine (error classification).
|
|
37
|
+
*/
|
|
38
|
+
const CREDENTIAL_ERROR_PATTERNS = [
|
|
39
|
+
/VP verification failed/i,
|
|
40
|
+
/SD-JWT.*verification failed/i,
|
|
41
|
+
/JWT is expired/i,
|
|
42
|
+
/VC has expired/i,
|
|
43
|
+
/credential is not valid/i,
|
|
44
|
+
/credential.*expired/i,
|
|
45
|
+
/Authentication failed/i,
|
|
46
|
+
];
|
|
47
|
+
/** Check if an error message indicates an invalid credential (expired, revoked, etc.) */
|
|
48
|
+
function isCredentialInvalidError(message) {
|
|
49
|
+
if (!message)
|
|
50
|
+
return false;
|
|
51
|
+
return CREDENTIAL_ERROR_PATTERNS.some(pattern => pattern.test(message));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Probe an api response body for a reauth_required signal.
|
|
55
|
+
*
|
|
56
|
+
* The api shape is:
|
|
57
|
+
* `{ success:false, error, metadata: { action: 'reauth_required',
|
|
58
|
+
* reauthRequired: { provider, reason, message, authUrl, projectId, ... } } }`
|
|
59
|
+
*
|
|
60
|
+
* Returns the extracted payload if present, otherwise `undefined`.
|
|
61
|
+
*
|
|
62
|
+
* Guards:
|
|
63
|
+
* - Requires `authUrl` to be a non-empty string (without it the signal is
|
|
64
|
+
* useless — the CLI caller has nothing to surface to the user).
|
|
65
|
+
* - Does not trust the outer `success` flag. If a future api bug sets
|
|
66
|
+
* `success:true` on a reauth response, we still treat it as a reauth
|
|
67
|
+
* failure: the underlying SaaS token is gone, and any "data" in that
|
|
68
|
+
* envelope would be stale or misleading. `action:'reauth_required'`
|
|
69
|
+
* is the canonical signal, not `success`. (Spec'd in gateway-client
|
|
70
|
+
* reauth tests as the "contradictory body" regression guard.)
|
|
71
|
+
*/
|
|
72
|
+
function extractReauthRequired(body) {
|
|
73
|
+
if (!body || typeof body !== 'object')
|
|
74
|
+
return undefined;
|
|
75
|
+
const metadata = body.metadata;
|
|
76
|
+
if (!metadata || metadata.action !== ai_identity_1.REAUTH_REQUIRED_ACTION)
|
|
77
|
+
return undefined;
|
|
78
|
+
const r = metadata.reauthRequired;
|
|
79
|
+
if (!r || typeof r.authUrl !== 'string' || r.authUrl.length === 0)
|
|
80
|
+
return undefined;
|
|
81
|
+
return {
|
|
82
|
+
provider: String(r.provider ?? ''),
|
|
83
|
+
reason: String(r.reason ?? ''),
|
|
84
|
+
message: String(r.message ?? body.error ?? ''),
|
|
85
|
+
authUrl: r.authUrl,
|
|
86
|
+
projectId: r.projectId,
|
|
87
|
+
metadata: r.metadata,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=credential-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-errors.js","sourceRoot":"","sources":["../../src/utils/credential-errors.ts"],"names":[],"mappings":";;AA+BA,0DAQC;AAiBD,4DAGC;AA2CD,sDAcC;AApHD,sDAA6D;AAe7D;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,uBAAuB,CAAC,IAAa;IACnD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IACvD,MAAM,CAAC,GAAG,IAAW,CAAA;IACrB,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,QAAQ,KAAK,eAAe,CAAA;IACnF,IAAI,CAAC,cAAc;QAAE,OAAO,SAAS,CAAA;IACrC,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,yBAAyB,GAAa;IAC1C,yBAAyB;IACzB,8BAA8B;IAC9B,iBAAiB;IACjB,iBAAiB;IACjB,0BAA0B;IAC1B,sBAAsB;IACtB,wBAAwB;CACzB,CAAA;AAED,yFAAyF;AACzF,SAAgB,wBAAwB,CAAC,OAAgB;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAA;IAC1B,OAAO,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;AACzE,CAAC;AAwBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,qBAAqB,CAAC,IAAa;IACjD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IACvD,MAAM,QAAQ,GAAI,IAAY,CAAC,QAAQ,CAAA;IACvC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,oCAAsB;QAAE,OAAO,SAAS,CAAA;IAC7E,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAA;IACjC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACnF,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;QAClC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAK,IAAY,CAAC,KAAK,IAAI,EAAE,CAAC;QACvD,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;KACrB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonicalize a file path for resource identity (spec §8.3).
|
|
3
|
+
*
|
|
4
|
+
* Steps:
|
|
5
|
+
* 1. Expand ~ to home directory
|
|
6
|
+
* 2. Convert to absolute path
|
|
7
|
+
* 3. Normalize . and ..
|
|
8
|
+
* 4. Resolve symlinks (realpath) if file exists
|
|
9
|
+
* 5. Normalize case (macOS is case-insensitive)
|
|
10
|
+
*/
|
|
11
|
+
export declare function canonicalizePath(filePath: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Compute a fingerprint for a resource (spec §8.3).
|
|
14
|
+
*
|
|
15
|
+
* Fingerprint = sha256(canonical_path + device_id + inode)
|
|
16
|
+
* device_id = Root DID (cryptographically bound to device)
|
|
17
|
+
*/
|
|
18
|
+
export declare function computeFingerprint(canonicalPath: string, deviceId: string): string;
|
|
19
|
+
//# sourceMappingURL=resource-canonicalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-canonicalizer.d.ts","sourceRoot":"","sources":["../../src/utils/resource-canonicalizer.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiCzD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,MAAM,CAYR"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.canonicalizePath = canonicalizePath;
|
|
37
|
+
exports.computeFingerprint = computeFingerprint;
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const crypto_1 = require("crypto");
|
|
42
|
+
/**
|
|
43
|
+
* Canonicalize a file path for resource identity (spec §8.3).
|
|
44
|
+
*
|
|
45
|
+
* Steps:
|
|
46
|
+
* 1. Expand ~ to home directory
|
|
47
|
+
* 2. Convert to absolute path
|
|
48
|
+
* 3. Normalize . and ..
|
|
49
|
+
* 4. Resolve symlinks (realpath) if file exists
|
|
50
|
+
* 5. Normalize case (macOS is case-insensitive)
|
|
51
|
+
*/
|
|
52
|
+
function canonicalizePath(filePath) {
|
|
53
|
+
let resolved = filePath;
|
|
54
|
+
// 1. Expand ~
|
|
55
|
+
if (resolved.startsWith('~/') || resolved === '~') {
|
|
56
|
+
resolved = path.join(os.homedir(), resolved.slice(1));
|
|
57
|
+
}
|
|
58
|
+
// 2. Convert to absolute
|
|
59
|
+
if (!path.isAbsolute(resolved)) {
|
|
60
|
+
resolved = path.resolve(resolved);
|
|
61
|
+
}
|
|
62
|
+
// 3. Normalize . and ..
|
|
63
|
+
resolved = path.normalize(resolved);
|
|
64
|
+
// 4. Resolve symlinks if file exists
|
|
65
|
+
try {
|
|
66
|
+
resolved = fs.realpathSync(resolved);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// File doesn't exist yet, use normalized path
|
|
70
|
+
}
|
|
71
|
+
// 5. Case normalization (macOS is case-insensitive)
|
|
72
|
+
// NOTE: Fingerprints generated on macOS (lowercased) will differ from Linux
|
|
73
|
+
// (case-preserved) for the same file. This is by design since fingerprints
|
|
74
|
+
// are device-bound (via Root DID), but cross-platform migration would
|
|
75
|
+
// require re-canonicalization.
|
|
76
|
+
if (process.platform === 'darwin') {
|
|
77
|
+
resolved = resolved.toLowerCase();
|
|
78
|
+
}
|
|
79
|
+
return resolved;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Compute a fingerprint for a resource (spec §8.3).
|
|
83
|
+
*
|
|
84
|
+
* Fingerprint = sha256(canonical_path + device_id + inode)
|
|
85
|
+
* device_id = Root DID (cryptographically bound to device)
|
|
86
|
+
*/
|
|
87
|
+
function computeFingerprint(canonicalPath, deviceId) {
|
|
88
|
+
let inode = '';
|
|
89
|
+
try {
|
|
90
|
+
const stat = fs.statSync(canonicalPath);
|
|
91
|
+
inode = String(stat.ino);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// File doesn't exist, omit inode
|
|
95
|
+
}
|
|
96
|
+
const data = `${canonicalPath}:${deviceId}:${inode}`;
|
|
97
|
+
const hash = (0, crypto_1.createHash)('sha256').update(data).digest('hex');
|
|
98
|
+
return `sha256:${hash}`;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=resource-canonicalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-canonicalizer.js","sourceRoot":"","sources":["../../src/utils/resource-canonicalizer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,4CAiCC;AAQD,gDAeC;AAvED,2CAA4B;AAC5B,uCAAwB;AACxB,uCAAwB;AACxB,mCAAmC;AAEnC;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,IAAI,QAAQ,GAAG,QAAQ,CAAA;IAEvB,cAAc;IACd,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAClD,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC;IAED,wBAAwB;IACxB,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAEnC,qCAAqC;IACrC,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IAED,oDAAoD;IACpD,4EAA4E;IAC5E,2EAA2E;IAC3E,sEAAsE;IACtE,+BAA+B;IAC/B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;IACnC,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,aAAqB,EACrB,QAAgB;IAEhB,IAAI,KAAK,GAAG,EAAE,CAAA;IACd,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;QACvC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,aAAa,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAA;IACpD,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5D,OAAO,UAAU,IAAI,EAAE,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared VC utility functions for agentd.
|
|
3
|
+
*
|
|
4
|
+
* NOTE: These functions decode the JWT payload WITHOUT verifying the signature.
|
|
5
|
+
* This is intentional — the Gateway is the authoritative verifier. These local
|
|
6
|
+
* checks are optimizations to avoid sending obviously-expired VCs over the network.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Extract jti (JWT ID) from an SD-JWT VC credential string.
|
|
10
|
+
*
|
|
11
|
+
* @param credentialJwt - The full SD-JWT credential string
|
|
12
|
+
* @returns The jti string, or null if extraction fails
|
|
13
|
+
*/
|
|
14
|
+
export declare function extractJtiFromVC(credentialJwt: string): string | null;
|
|
15
|
+
/**
|
|
16
|
+
* Extract exp (expiration time) from an SD-JWT VC credential string.
|
|
17
|
+
*
|
|
18
|
+
* @param credentialJwt - The full SD-JWT credential string
|
|
19
|
+
* @returns The exp as seconds since epoch, or null if extraction fails.
|
|
20
|
+
* Returns null for non-finite or non-positive values.
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractExpFromVC(credentialJwt: string): number | null;
|
|
23
|
+
//# sourceMappingURL=vc-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vc-utils.d.ts","sourceRoot":"","sources":["../../src/utils/vc-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqBH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMrE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared VC utility functions for agentd.
|
|
4
|
+
*
|
|
5
|
+
* NOTE: These functions decode the JWT payload WITHOUT verifying the signature.
|
|
6
|
+
* This is intentional — the Gateway is the authoritative verifier. These local
|
|
7
|
+
* checks are optimizations to avoid sending obviously-expired VCs over the network.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.extractJtiFromVC = extractJtiFromVC;
|
|
11
|
+
exports.extractExpFromVC = extractExpFromVC;
|
|
12
|
+
/**
|
|
13
|
+
* Parse the payload of an SD-JWT VC credential string without signature verification.
|
|
14
|
+
* Shared helper to avoid duplicating base64url decode logic.
|
|
15
|
+
*/
|
|
16
|
+
function parseVCPayload(credentialJwt) {
|
|
17
|
+
try {
|
|
18
|
+
// SD-JWT format: <issuer-jwt>~<disclosure1>~<disclosure2>~...
|
|
19
|
+
const issuerJwt = credentialJwt.split('~')[0];
|
|
20
|
+
const parts = issuerJwt.split('.');
|
|
21
|
+
if (parts.length < 2)
|
|
22
|
+
return null;
|
|
23
|
+
return JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extract jti (JWT ID) from an SD-JWT VC credential string.
|
|
31
|
+
*
|
|
32
|
+
* @param credentialJwt - The full SD-JWT credential string
|
|
33
|
+
* @returns The jti string, or null if extraction fails
|
|
34
|
+
*/
|
|
35
|
+
function extractJtiFromVC(credentialJwt) {
|
|
36
|
+
const payload = parseVCPayload(credentialJwt);
|
|
37
|
+
return typeof payload?.jti === 'string' ? payload.jti : null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Extract exp (expiration time) from an SD-JWT VC credential string.
|
|
41
|
+
*
|
|
42
|
+
* @param credentialJwt - The full SD-JWT credential string
|
|
43
|
+
* @returns The exp as seconds since epoch, or null if extraction fails.
|
|
44
|
+
* Returns null for non-finite or non-positive values.
|
|
45
|
+
*/
|
|
46
|
+
function extractExpFromVC(credentialJwt) {
|
|
47
|
+
const payload = parseVCPayload(credentialJwt);
|
|
48
|
+
if (typeof payload?.exp === 'number' && Number.isFinite(payload.exp) && payload.exp > 0) {
|
|
49
|
+
return payload.exp;
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=vc-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vc-utils.js","sourceRoot":"","sources":["../../src/utils/vc-utils.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AA2BH,4CAGC;AASD,4CAMC;AA3CD;;;GAGG;AACH,SAAS,cAAc,CAAC,aAAqB;IAC3C,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAEjC,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACrD,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,aAAqB;IACpD,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;IAC7C,OAAO,OAAO,OAAO,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,aAAqB;IACpD,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;IAC7C,IAAI,OAAO,OAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACxF,OAAO,OAAO,CAAC,GAAG,CAAA;IACpB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/wallet/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAGrC,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAO9D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA2GtD"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.openDatabase = openDatabase;
|
|
40
|
+
exports.initSchema = initSchema;
|
|
41
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
function openDatabase(dbPath) {
|
|
44
|
+
const existed = fs.existsSync(dbPath);
|
|
45
|
+
const db = new better_sqlite3_1.default(dbPath);
|
|
46
|
+
if (!existed && fs.existsSync(dbPath)) {
|
|
47
|
+
fs.chmodSync(dbPath, 0o600);
|
|
48
|
+
}
|
|
49
|
+
return db;
|
|
50
|
+
}
|
|
51
|
+
function initSchema(db) {
|
|
52
|
+
db.exec(`
|
|
53
|
+
CREATE TABLE IF NOT EXISTS projects (
|
|
54
|
+
id TEXT PRIMARY KEY,
|
|
55
|
+
name TEXT NOT NULL,
|
|
56
|
+
is_default INTEGER DEFAULT 0,
|
|
57
|
+
user_role TEXT,
|
|
58
|
+
synced_at INTEGER
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
CREATE TABLE IF NOT EXISTS keys (
|
|
62
|
+
id TEXT PRIMARY KEY,
|
|
63
|
+
did TEXT NOT NULL UNIQUE,
|
|
64
|
+
key_type TEXT NOT NULL,
|
|
65
|
+
public_key TEXT NOT NULL,
|
|
66
|
+
keychain_ref TEXT NOT NULL,
|
|
67
|
+
storage_type TEXT NOT NULL DEFAULT 'keychain',
|
|
68
|
+
parent_did TEXT,
|
|
69
|
+
project_id TEXT,
|
|
70
|
+
client_name TEXT,
|
|
71
|
+
status TEXT DEFAULT 'active',
|
|
72
|
+
created_at INTEGER NOT NULL,
|
|
73
|
+
rotated_at INTEGER,
|
|
74
|
+
FOREIGN KEY (project_id) REFERENCES projects(id)
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
CREATE TABLE IF NOT EXISTS credentials (
|
|
78
|
+
id TEXT PRIMARY KEY,
|
|
79
|
+
holder_did TEXT NOT NULL,
|
|
80
|
+
project_id TEXT NOT NULL,
|
|
81
|
+
credential_jwt TEXT NOT NULL,
|
|
82
|
+
actions TEXT NOT NULL,
|
|
83
|
+
provider TEXT NOT NULL,
|
|
84
|
+
resources TEXT,
|
|
85
|
+
normalized_resource_key TEXT,
|
|
86
|
+
resource_fingerprint TEXT,
|
|
87
|
+
delegated_from TEXT,
|
|
88
|
+
status TEXT DEFAULT 'active',
|
|
89
|
+
expires_at INTEGER,
|
|
90
|
+
created_at INTEGER,
|
|
91
|
+
metadata TEXT,
|
|
92
|
+
FOREIGN KEY (project_id) REFERENCES projects(id)
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_credentials_status ON credentials(status, provider);
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_credentials_normalized_resource ON credentials(normalized_resource_key, status);
|
|
97
|
+
|
|
98
|
+
CREATE TABLE IF NOT EXISTS synced_policies (
|
|
99
|
+
id TEXT PRIMARY KEY,
|
|
100
|
+
project_id TEXT NOT NULL,
|
|
101
|
+
policy_json TEXT NOT NULL,
|
|
102
|
+
synced_at INTEGER NOT NULL,
|
|
103
|
+
FOREIGN KEY (project_id) REFERENCES projects(id)
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
`);
|
|
107
|
+
// Migration: add metadata column to existing databases
|
|
108
|
+
try {
|
|
109
|
+
db.exec('ALTER TABLE credentials ADD COLUMN metadata TEXT');
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Column already exists — safe to ignore
|
|
113
|
+
}
|
|
114
|
+
// Migration: add resources column to existing databases
|
|
115
|
+
try {
|
|
116
|
+
db.exec('ALTER TABLE credentials ADD COLUMN resources TEXT');
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Column already exists — safe to ignore
|
|
120
|
+
}
|
|
121
|
+
db.exec(`
|
|
122
|
+
CREATE TABLE IF NOT EXISTS env_profiles (
|
|
123
|
+
id TEXT PRIMARY KEY,
|
|
124
|
+
profile_name TEXT NOT NULL,
|
|
125
|
+
key_name TEXT NOT NULL,
|
|
126
|
+
backend_type TEXT NOT NULL DEFAULT 'keychain',
|
|
127
|
+
imported_at INTEGER NOT NULL,
|
|
128
|
+
UNIQUE(profile_name, key_name)
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
CREATE TABLE IF NOT EXISTS audit_log (
|
|
132
|
+
id TEXT PRIMARY KEY,
|
|
133
|
+
timestamp INTEGER NOT NULL,
|
|
134
|
+
project_id TEXT,
|
|
135
|
+
root_did TEXT,
|
|
136
|
+
agent_did TEXT,
|
|
137
|
+
presenter_did TEXT,
|
|
138
|
+
action TEXT NOT NULL,
|
|
139
|
+
provider TEXT,
|
|
140
|
+
enforcement_type TEXT,
|
|
141
|
+
decision_source TEXT,
|
|
142
|
+
execution_type TEXT NOT NULL,
|
|
143
|
+
decision TEXT NOT NULL,
|
|
144
|
+
decision_reason TEXT,
|
|
145
|
+
requested_resource TEXT,
|
|
146
|
+
normalized_resource TEXT,
|
|
147
|
+
resource_fingerprint TEXT,
|
|
148
|
+
grant_id TEXT,
|
|
149
|
+
credential_id TEXT,
|
|
150
|
+
approval_mode TEXT,
|
|
151
|
+
approval_nonce TEXT,
|
|
152
|
+
metadata TEXT,
|
|
153
|
+
synced_at INTEGER,
|
|
154
|
+
FOREIGN KEY (project_id) REFERENCES projects(id)
|
|
155
|
+
);
|
|
156
|
+
`);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/wallet/sqlite.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,oCAOC;AAED,gCA2GC;AAvHD,oEAAqC;AACrC,uCAAwB;AAExB,SAAgB,YAAY,CAAC,MAAc;IACzC,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrC,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAA;IAC/B,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAgB,UAAU,CAAC,EAAqB;IAC9C,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDP,CAAC,CAAA;IAEF,uDAAuD;IACvD,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAA;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IAED,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCP,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface VPBuildOptions {
|
|
2
|
+
credentialJwt: string;
|
|
3
|
+
signerDid: string;
|
|
4
|
+
signerPrivateKeyJwk: string;
|
|
5
|
+
nonce: string;
|
|
6
|
+
domain: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Build a Verifiable Presentation (SD-JWT KB-JWT) for local signing.
|
|
10
|
+
*
|
|
11
|
+
* The VP signer is the Agent DID (not Root DID — spec §4.2).
|
|
12
|
+
*
|
|
13
|
+
* KB-JWT payload construction is delegated to
|
|
14
|
+
* `buildKbJwtPayload()` in `@vess-id/ai-identity`
|
|
15
|
+
* (`packages/sdk/src/vp/kb-jwt-builder.ts`), which is the SINGLE SOURCE OF
|
|
16
|
+
* TRUTH shared with the api / remote-mcp / SDK issuers. Do NOT inline an
|
|
17
|
+
* `{ iss, aud, nonce, iat }` literal here: agentd alpha builds prior to
|
|
18
|
+
* this change drifted from the API verifier's `exp` requirement and every
|
|
19
|
+
* VP was rejected with `KB-JWT missing exp`. The four-way lock-step
|
|
20
|
+
* (api / remote-mcp / SDK / agentd) is documented in the kb-jwt-builder
|
|
21
|
+
* header.
|
|
22
|
+
*/
|
|
23
|
+
export declare class VPBuilder {
|
|
24
|
+
buildVP(options: VPBuildOptions): Promise<string>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=vp-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vp-builder.d.ts","sourceRoot":"","sources":["../../src/wallet/vp-builder.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,SAAS;IACd,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAwCxD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VPBuilder = void 0;
|
|
4
|
+
const sd_jwt_vc_1 = require("@sd-jwt/sd-jwt-vc");
|
|
5
|
+
const crypto_nodejs_1 = require("@sd-jwt/crypto-nodejs");
|
|
6
|
+
const ai_identity_1 = require("@vess-id/ai-identity");
|
|
7
|
+
/**
|
|
8
|
+
* Build a Verifiable Presentation (SD-JWT KB-JWT) for local signing.
|
|
9
|
+
*
|
|
10
|
+
* The VP signer is the Agent DID (not Root DID — spec §4.2).
|
|
11
|
+
*
|
|
12
|
+
* KB-JWT payload construction is delegated to
|
|
13
|
+
* `buildKbJwtPayload()` in `@vess-id/ai-identity`
|
|
14
|
+
* (`packages/sdk/src/vp/kb-jwt-builder.ts`), which is the SINGLE SOURCE OF
|
|
15
|
+
* TRUTH shared with the api / remote-mcp / SDK issuers. Do NOT inline an
|
|
16
|
+
* `{ iss, aud, nonce, iat }` literal here: agentd alpha builds prior to
|
|
17
|
+
* this change drifted from the API verifier's `exp` requirement and every
|
|
18
|
+
* VP was rejected with `KB-JWT missing exp`. The four-way lock-step
|
|
19
|
+
* (api / remote-mcp / SDK / agentd) is documented in the kb-jwt-builder
|
|
20
|
+
* header.
|
|
21
|
+
*/
|
|
22
|
+
class VPBuilder {
|
|
23
|
+
async buildVP(options) {
|
|
24
|
+
const privateKey = JSON.parse(options.signerPrivateKeyJwk);
|
|
25
|
+
const signer = await crypto_nodejs_1.ES256.getSigner(privateKey);
|
|
26
|
+
const { d, key_ops, ...publicKeyJwk } = privateKey;
|
|
27
|
+
const verifier = await crypto_nodejs_1.ES256.getVerifier(publicKeyJwk);
|
|
28
|
+
const sdJwtInstance = new sd_jwt_vc_1.SDJwtVcInstance({
|
|
29
|
+
signer,
|
|
30
|
+
verifier,
|
|
31
|
+
signAlg: crypto_nodejs_1.ES256.alg,
|
|
32
|
+
hasher: crypto_nodejs_1.digest,
|
|
33
|
+
hashAlg: 'sha-256',
|
|
34
|
+
saltGenerator: crypto_nodejs_1.generateSalt,
|
|
35
|
+
kbSigner: signer,
|
|
36
|
+
kbSignAlg: crypto_nodejs_1.ES256.alg,
|
|
37
|
+
});
|
|
38
|
+
const decodedVC = await sdJwtInstance.decode(options.credentialJwt);
|
|
39
|
+
const presentableKeys = await decodedVC.presentableKeys(crypto_nodejs_1.digest);
|
|
40
|
+
const presentationFrame = {};
|
|
41
|
+
for (const key of presentableKeys) {
|
|
42
|
+
presentationFrame[key] = true;
|
|
43
|
+
}
|
|
44
|
+
const kbJwtPayload = (0, ai_identity_1.buildKbJwtPayload)({
|
|
45
|
+
holderDid: options.signerDid,
|
|
46
|
+
audience: options.domain,
|
|
47
|
+
nonce: options.nonce,
|
|
48
|
+
vcCredential: options.credentialJwt,
|
|
49
|
+
});
|
|
50
|
+
const presentation = await sdJwtInstance.present(options.credentialJwt, presentationFrame, { kb: { payload: kbJwtPayload } });
|
|
51
|
+
return presentation;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.VPBuilder = VPBuilder;
|
|
55
|
+
//# sourceMappingURL=vp-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vp-builder.js","sourceRoot":"","sources":["../../src/wallet/vp-builder.ts"],"names":[],"mappings":";;;AAAA,iDAAmD;AACnD,yDAAmE;AACnE,sDAAwD;AAUxD;;;;;;;;;;;;;;GAcG;AACH,MAAa,SAAS;IACpB,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,qBAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAChD,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,UAAqC,CAAA;QAC7E,MAAM,QAAQ,GAAG,MAAM,qBAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;QAEtD,MAAM,aAAa,GAAG,IAAI,2BAAe,CAAC;YACxC,MAAM;YACN,QAAQ;YACR,OAAO,EAAE,qBAAK,CAAC,GAAG;YAClB,MAAM,EAAE,sBAAM;YACd,OAAO,EAAE,SAAS;YAClB,aAAa,EAAE,4BAAY;YAC3B,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,qBAAK,CAAC,GAAG;SACrB,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QACnE,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,sBAAM,CAAC,CAAA;QAE/D,MAAM,iBAAiB,GAA4B,EAAE,CAAA;QACrD,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,iBAAiB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;QAC/B,CAAC;QAED,MAAM,YAAY,GAAG,IAAA,+BAAiB,EAAC;YACrC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,OAAO,CAAC,MAAM;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,YAAY,EAAE,OAAO,CAAC,aAAa;SACpC,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,OAAO,CAC9C,OAAO,CAAC,aAAa,EACrB,iBAAiB,EACjB,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CAClC,CAAA;QAED,OAAO,YAAY,CAAA;IACrB,CAAC;CACF;AAzCD,8BAyCC"}
|