From 51ade64ec2c93941a6fc958d3b5a0f72e26293ef Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Thu, 23 Apr 2026 18:35:44 -0700 Subject: [PATCH 01/28] =?UTF-8?q?feat:=201.9.0=20=E2=80=94=20new=20denial?= =?UTF-8?q?=20codes=20+=20agent=5Fmemory=20type=20(TEC-226/218/227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New types for the wallet-auth hardening effort: - DenialCode union with wallet_signer_mismatch, wallet_auth_requires_wallet_signing (TEC-226) and token_expired, token_revoked (TEC-218) added; existing codes preserved - NextStepsAction union with send_existing_identity, mint_new_credential, use_operator_token, regenerate_payment_from_linked_wallet - WalletSignerMismatchBody, WalletAuthRequiresSigningBody — typed error shapes the gate returns for TEC-226 denials - AgentMemoryHint — structured cross-merchant pattern hint agents persist to memory (TEC-227); gate emits on bootstrap paths - AgentScoreErrorBody + SessionCreateResponse gain optional agent_memory field Pure type surface; no runtime behavior change. Bumps to 1.9.0. Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 2 +- src/types.ts | 129 ++++++++++++++++++++++++++++++++++++++++++++ tests/types.test.ts | 126 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 256 insertions(+), 1 deletion(-) create mode 100644 tests/types.test.ts diff --git a/package.json b/package.json index 2b9335b..c5fd53f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@agent-score/sdk", - "version": "1.8.0", + "version": "1.9.0", "description": "TypeScript client for the AgentScore trust and reputation API", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/src/types.ts b/src/types.ts index b3b6e67..a6f8028 100644 --- a/src/types.ts +++ b/src/types.ts @@ -183,6 +183,133 @@ export interface AgentScoreErrorBody { message: string; [key: string]: unknown; }; + /** Cross-merchant pattern hint for agents to persist to memory (TEC-227). Present on bootstrap + * denials (`operator_verification_required`) and session-create responses. */ + agent_memory?: AgentMemoryHint; +} + +/** + * Denial codes returned by the gate in 403/402 error bodies. Additive — old codes retained for + * backward compat. + * + * New in 1.9.0: + * - `wallet_signer_mismatch`: X-Wallet-Address claimed, but the payment signer resolves to a + * different operator (or isn't linked to any operator). TEC-226. + * - `wallet_auth_requires_wallet_signing`: X-Wallet-Address claimed with a payment rail that + * has no wallet signer (SPT, card). Agent should switch to X-Operator-Token. TEC-226. + * - `token_expired`: operator token valid-shape but past its TTL. Agent should mint a new + * credential via POST /v1/credentials, no re-KYC needed. TEC-218. + * - `token_revoked`: operator token was revoked. Agent should stop and surface to user. TEC-218. + */ +export type DenialCode = + // Pre-1.9.0 + | 'operator_verification_required' + | 'compliance_denied' + | 'compliance_error' + | 'wallet_not_trusted' + | 'missing_identity' + | 'identity_verification_required' + | 'payment_required' + | 'api_error' + | 'kyc_required' + // Added in 1.9.0 + | 'wallet_signer_mismatch' + | 'wallet_auth_requires_wallet_signing' + | 'token_expired' + | 'token_revoked'; + +/** + * Recommended agent action encoded in `next_steps.action`. Granular codes added in 1.9.0 (TEC-218) + * let agents pick the right remediation (mint new credential vs. re-verify vs. switch identity + * path) without parsing natural-language `user_message`. + */ +export type NextStepsAction = + // Pre-1.9.0 + | 'poll_for_credential' + | 'contact_support' + | 'retry' + | 'retry_once_then_contact_support' + | 'regenerate_payment_credential' + | 'none' + | 'done' + // Added in 1.9.0 + | 'send_existing_identity' + | 'mint_new_credential' + | 'use_operator_token' + | 'regenerate_payment_from_linked_wallet'; + +/** + * Error body shape for `wallet_signer_mismatch` denials (TEC-226). The claimed wallet's operator + * doesn't match the signer's operator. `actual_signer_operator` is null when the signer isn't + * linked to any operator (treat as a different identity). `linked_wallets` lists the wallets the + * agent could sign with to satisfy the claim. + */ +export interface WalletSignerMismatchBody { + error: { + code: 'wallet_signer_mismatch'; + message: string; + }; + claimed_operator: string; + actual_signer_operator: string | null; + expected_signer?: string; + actual_signer?: string; + linked_wallets: string[]; + next_steps: { + action: 'regenerate_payment_from_linked_wallet'; + user_message?: string; + learn_more_url?: string; + }; + agent_memory?: AgentMemoryHint; +} + +/** + * Error body for `wallet_auth_requires_wallet_signing` denials (TEC-226). Fired when + * `X-Wallet-Address` is combined with a payment rail that has no wallet signer (SPT, card). + * The agent should switch to `X-Operator-Token` to use those rails. + */ +export interface WalletAuthRequiresSigningBody { + error: { + code: 'wallet_auth_requires_wallet_signing'; + message: string; + }; + next_steps: { + action: 'use_operator_token'; + user_message?: string; + /** Rails that carry a wallet signature and can be used under wallet-auth. */ + signer_capable_rails?: string[]; + learn_more_url?: string; + }; + agent_memory?: AgentMemoryHint; +} + +/** + * Identity-path guidance in the agent_memory payload (TEC-227). Tells agents which header to send + * on future AgentScore-gated endpoints based on the payment rail they plan to use. + */ +export interface AgentMemoryIdentityPaths { + wallet: string; + operator_token: string; +} + +/** + * Structured hint emitted by AgentScore-gated endpoints on bootstrap denials + * (`operator_verification_required`) and `POST /v1/sessions` success responses (TEC-227). + * LLM-hosted agents should save this to their long-term memory so future AgentScore encounters + * skip the cold-start session flow. + * + * Contents are the pattern, not secrets. `do_not_persist_in_memory` names bearer credentials + * that belong in a credential store, not an LLM memory. + */ +export interface AgentMemoryHint { + save_for_future_agentscore_gates: true; + pattern_summary: string; + quickstart: string; + identity_check_endpoint: string; + list_wallets_endpoint?: string; + identity_paths: AgentMemoryIdentityPaths; + bootstrap: string; + do_not_persist_in_memory: string[]; + persist_in_credential_store: string[]; } export interface GetReputationOptions { @@ -207,6 +334,8 @@ export interface SessionCreateResponse { verify_url: string; poll_url: string; expires_at: string; + /** Cross-merchant memory hint for agents on first session creation (TEC-227). */ + agent_memory?: AgentMemoryHint; } export interface SessionPollNextSteps { diff --git a/tests/types.test.ts b/tests/types.test.ts new file mode 100644 index 0000000..297429f --- /dev/null +++ b/tests/types.test.ts @@ -0,0 +1,126 @@ +import { describe, expect, it } from 'vitest'; +import type { + AgentMemoryHint, + AgentScoreErrorBody, + DenialCode, + NextStepsAction, + SessionCreateResponse, + WalletAuthRequiresSigningBody, + WalletSignerMismatchBody, +} from '../src/index'; + +// Compile-time type-presence checks for types introduced in 1.9.0 (TEC-226/218/227). +// The tests themselves just exercise the runtime-visible shape so vitest has something +// to run; the real assertion is that the file type-checks. + +describe('1.9.0 types', () => { + it('accepts all new DenialCode values', () => { + const codes: DenialCode[] = [ + 'operator_verification_required', + 'compliance_denied', + 'wallet_signer_mismatch', + 'wallet_auth_requires_wallet_signing', + 'token_expired', + 'token_revoked', + ]; + expect(codes).toHaveLength(6); + }); + + it('accepts all new NextStepsAction values', () => { + const actions: NextStepsAction[] = [ + 'send_existing_identity', + 'mint_new_credential', + 'use_operator_token', + 'regenerate_payment_from_linked_wallet', + 'poll_for_credential', + 'contact_support', + ]; + expect(actions).toHaveLength(6); + }); + + it('WalletSignerMismatchBody shape', () => { + const body: WalletSignerMismatchBody = { + error: { code: 'wallet_signer_mismatch', message: 'signer does not match claimed wallet' }, + claimed_operator: 'op_abc', + actual_signer_operator: null, + expected_signer: '0x1111', + actual_signer: '0x2222', + linked_wallets: ['0x1111', '0x3333'], + next_steps: { + action: 'regenerate_payment_from_linked_wallet', + user_message: 'sign with one of the linked wallets', + }, + }; + expect(body.error.code).toBe('wallet_signer_mismatch'); + expect(body.linked_wallets).toHaveLength(2); + }); + + it('WalletAuthRequiresSigningBody shape', () => { + const body: WalletAuthRequiresSigningBody = { + error: { code: 'wallet_auth_requires_wallet_signing', message: 'SPT has no wallet signer' }, + next_steps: { + action: 'use_operator_token', + signer_capable_rails: ['tempo', 'x402'], + }, + }; + expect(body.error.code).toBe('wallet_auth_requires_wallet_signing'); + expect(body.next_steps.signer_capable_rails).toContain('tempo'); + }); + + it('AgentMemoryHint shape', () => { + const memory: AgentMemoryHint = { + save_for_future_agentscore_gates: true, + pattern_summary: 'AgentScore is a cross-merchant identity layer', + quickstart: 'https://docs.agentscore.sh/agent-commerce-quickstart', + identity_check_endpoint: 'https://api.agentscore.sh/v1/credentials', + list_wallets_endpoint: 'https://api.agentscore.sh/v1/credentials/wallets', + identity_paths: { + wallet: 'send X-Wallet-Address when paying from a linked wallet', + operator_token: 'send X-Operator-Token for any rail', + }, + bootstrap: 'follow the session/verify flow if you have neither', + do_not_persist_in_memory: ['operator_token', 'poll_secret'], + persist_in_credential_store: ['operator_token'], + }; + expect(memory.save_for_future_agentscore_gates).toBe(true); + expect(memory.identity_paths.wallet).toContain('X-Wallet-Address'); + }); + + it('AgentScoreErrorBody accepts optional agent_memory', () => { + const body: AgentScoreErrorBody = { + error: { code: 'operator_verification_required', message: 'identity required' }, + agent_memory: { + save_for_future_agentscore_gates: true, + pattern_summary: 'p', + quickstart: 'q', + identity_check_endpoint: 'e', + identity_paths: { wallet: 'w', operator_token: 'ot' }, + bootstrap: 'b', + do_not_persist_in_memory: [], + persist_in_credential_store: [], + }, + }; + expect(body.agent_memory?.save_for_future_agentscore_gates).toBe(true); + }); + + it('SessionCreateResponse accepts optional agent_memory', () => { + const res: SessionCreateResponse = { + session_id: 'sess_abc', + poll_secret: 'poll_abc', + verify_url: 'https://agentscore.sh/verify?session=sess_abc', + poll_url: 'https://api.agentscore.sh/v1/sessions/sess_abc', + expires_at: '2026-04-24T00:00:00Z', + agent_memory: { + save_for_future_agentscore_gates: true, + pattern_summary: 'p', + quickstart: 'q', + identity_check_endpoint: 'e', + identity_paths: { wallet: 'w', operator_token: 'ot' }, + bootstrap: 'b', + do_not_persist_in_memory: [], + persist_in_credential_store: [], + }, + }; + expect(res.agent_memory).toBeDefined(); + }); +}); From cb0f000df52b3e9f266d53688e63d6ff5cf0edc1 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Thu, 23 Apr 2026 19:48:14 -0700 Subject: [PATCH 02/28] feat: AssessResponse.linked_wallets type (TEC-226 review-2 N1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SDK type gap — /v1/assess emits linked_wallets on allow responses but AssessResponse didn't declare the field. Consumers reading the response fall back to `any` for that field. Adds the optional field with TEC-226 docstring explaining it's the same-operator wallet set plus the deny-guard semantics. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/types.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/types.ts b/src/types.ts index a6f8028..e1a8667 100644 --- a/src/types.ts +++ b/src/types.ts @@ -155,6 +155,11 @@ export interface AssessResponse { identity_method: 'wallet' | 'operator_token'; operator_verification?: OperatorVerification; resolved_operator?: string | null; + /** Wallets linked to the same operator as the resolved identity (TEC-226). Populated on + * allow responses; omitted on denials to avoid leaking the linked set for flagged operators. + * Returned regardless of identity_method so agents can enumerate all wallets they could + * sign with to satisfy a wallet-auth claim. Capped at 100 entries. */ + linked_wallets?: string[]; verify_url?: string; policy_result?: { all_passed: boolean; From fcb992595b9ae0db7b332c51e6336c63d533e39a Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Thu, 23 Apr 2026 21:53:52 -0700 Subject: [PATCH 03/28] chore: review-cycle cleanup + type parity fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Strip ticket IDs and version-introduction annotations from comments (commit/PR/CHANGELOG carry that context; source comments should describe invariants, not origin). - CredentialListItem: allow null on `label` and `expires_at` — API can return null per schema; Python SDK was already correct. - CredentialCreateResponse: add optional `agent_memory` field so type matches API behavior (emitted on first-credential mint). Co-Authored-By: Claude Opus 4.7 (1M context) --- src/types.ts | 51 ++++++++++++++++++++------------------------- tests/types.test.ts | 6 +++--- 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/src/types.ts b/src/types.ts index e1a8667..4b8edbf 100644 --- a/src/types.ts +++ b/src/types.ts @@ -155,8 +155,8 @@ export interface AssessResponse { identity_method: 'wallet' | 'operator_token'; operator_verification?: OperatorVerification; resolved_operator?: string | null; - /** Wallets linked to the same operator as the resolved identity (TEC-226). Populated on - * allow responses; omitted on denials to avoid leaking the linked set for flagged operators. + /** Wallets linked to the same operator as the resolved identity. Populated on allow + * responses; omitted on denials to avoid leaking the linked set for flagged operators. * Returned regardless of identity_method so agents can enumerate all wallets they could * sign with to satisfy a wallet-auth claim. Capped at 100 entries. */ linked_wallets?: string[]; @@ -188,26 +188,23 @@ export interface AgentScoreErrorBody { message: string; [key: string]: unknown; }; - /** Cross-merchant pattern hint for agents to persist to memory (TEC-227). Present on bootstrap + /** Cross-merchant pattern hint for agents to persist to memory. Present on bootstrap * denials (`operator_verification_required`) and session-create responses. */ agent_memory?: AgentMemoryHint; } /** - * Denial codes returned by the gate in 403/402 error bodies. Additive — old codes retained for - * backward compat. + * Denial codes returned by the gate in 403/402 error bodies. * - * New in 1.9.0: * - `wallet_signer_mismatch`: X-Wallet-Address claimed, but the payment signer resolves to a - * different operator (or isn't linked to any operator). TEC-226. + * different operator (or isn't linked to any operator). * - `wallet_auth_requires_wallet_signing`: X-Wallet-Address claimed with a payment rail that - * has no wallet signer (SPT, card). Agent should switch to X-Operator-Token. TEC-226. + * has no wallet signer (SPT, card). Agent should switch to X-Operator-Token. * - `token_expired`: operator token valid-shape but past its TTL. Agent should mint a new - * credential via POST /v1/credentials, no re-KYC needed. TEC-218. - * - `token_revoked`: operator token was revoked. Agent should stop and surface to user. TEC-218. + * credential via POST /v1/credentials, no re-KYC needed. + * - `token_revoked`: operator token was revoked. Agent should stop and surface to user. */ export type DenialCode = - // Pre-1.9.0 | 'operator_verification_required' | 'compliance_denied' | 'compliance_error' @@ -217,19 +214,17 @@ export type DenialCode = | 'payment_required' | 'api_error' | 'kyc_required' - // Added in 1.9.0 | 'wallet_signer_mismatch' | 'wallet_auth_requires_wallet_signing' | 'token_expired' | 'token_revoked'; /** - * Recommended agent action encoded in `next_steps.action`. Granular codes added in 1.9.0 (TEC-218) - * let agents pick the right remediation (mint new credential vs. re-verify vs. switch identity - * path) without parsing natural-language `user_message`. + * Recommended agent action encoded in `next_steps.action`. Granular codes let agents pick the + * right remediation (mint new credential vs. re-verify vs. switch identity path) without + * parsing natural-language `user_message`. */ export type NextStepsAction = - // Pre-1.9.0 | 'poll_for_credential' | 'contact_support' | 'retry' @@ -237,14 +232,13 @@ export type NextStepsAction = | 'regenerate_payment_credential' | 'none' | 'done' - // Added in 1.9.0 | 'send_existing_identity' | 'mint_new_credential' | 'use_operator_token' | 'regenerate_payment_from_linked_wallet'; /** - * Error body shape for `wallet_signer_mismatch` denials (TEC-226). The claimed wallet's operator + * Error body shape for `wallet_signer_mismatch` denials. The claimed wallet's operator * doesn't match the signer's operator. `actual_signer_operator` is null when the signer isn't * linked to any operator (treat as a different identity). `linked_wallets` lists the wallets the * agent could sign with to satisfy the claim. @@ -268,7 +262,7 @@ export interface WalletSignerMismatchBody { } /** - * Error body for `wallet_auth_requires_wallet_signing` denials (TEC-226). Fired when + * Error body for `wallet_auth_requires_wallet_signing` denials. Fired when * `X-Wallet-Address` is combined with a payment rail that has no wallet signer (SPT, card). * The agent should switch to `X-Operator-Token` to use those rails. */ @@ -288,8 +282,8 @@ export interface WalletAuthRequiresSigningBody { } /** - * Identity-path guidance in the agent_memory payload (TEC-227). Tells agents which header to send - * on future AgentScore-gated endpoints based on the payment rail they plan to use. + * Identity-path guidance in the agent_memory payload. Tells agents which header to send on + * future AgentScore-gated endpoints based on the payment rail they plan to use. */ export interface AgentMemoryIdentityPaths { wallet: string; @@ -298,9 +292,9 @@ export interface AgentMemoryIdentityPaths { /** * Structured hint emitted by AgentScore-gated endpoints on bootstrap denials - * (`operator_verification_required`) and `POST /v1/sessions` success responses (TEC-227). - * LLM-hosted agents should save this to their long-term memory so future AgentScore encounters - * skip the cold-start session flow. + * (`operator_verification_required`) and `POST /v1/sessions` success responses. LLM-hosted + * agents should save this to their long-term memory so future AgentScore encounters skip the + * cold-start session flow. * * Contents are the pattern, not secrets. `do_not_persist_in_memory` names bearer credentials * that belong in a credential store, not an LLM memory. @@ -339,7 +333,7 @@ export interface SessionCreateResponse { verify_url: string; poll_url: string; expires_at: string; - /** Cross-merchant memory hint for agents on first session creation (TEC-227). */ + /** Cross-merchant memory hint for agents on first session creation. */ agent_memory?: AgentMemoryHint; } @@ -374,9 +368,10 @@ export interface CredentialCreateResponse { id: string; credential: string; prefix: string; - label: string; + label: string | null; expires_at: string; created_at: string; + agent_memory?: AgentMemoryHint; } export interface CredentialCreateErrorResponse { @@ -394,8 +389,8 @@ export interface CredentialCreateErrorResponse { export interface CredentialListItem { id: string; prefix: string; - label: string; - expires_at: string; + label: string | null; + expires_at: string | null; last_used_at: string | null; created_at: string; } diff --git a/tests/types.test.ts b/tests/types.test.ts index 297429f..9d7475c 100644 --- a/tests/types.test.ts +++ b/tests/types.test.ts @@ -9,9 +9,9 @@ import type { WalletSignerMismatchBody, } from '../src/index'; -// Compile-time type-presence checks for types introduced in 1.9.0 (TEC-226/218/227). -// The tests themselves just exercise the runtime-visible shape so vitest has something -// to run; the real assertion is that the file type-checks. +// Compile-time type-presence checks for the denial-code, memory-hint, and wallet-signer +// body types. Runtime assertions exist only to give vitest something to execute; the real +// verification is that the file type-checks. describe('1.9.0 types', () => { it('accepts all new DenialCode values', () => { From 47a1c55f13c7ff5a4cdb898c0d1fa7b01ce9c45e Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 00:20:34 -0700 Subject: [PATCH 04/28] docs(claude): document wallet-auth response fields across methods MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Identity-model section now calls out linked_wallets[] + resolved_operator on assess responses, agent_memory on createSession and createCredential responses, and the next_steps.action enum on pollSession — so future sessions start with an accurate mental model of each method's response shape. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/CLAUDE.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 8cf2e1b..cd20cb4 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -4,16 +4,18 @@ TypeScript client for the AgentScore trust and reputation API. ## Identity Model +Two identity paths: `X-Wallet-Address` (wallet-based) and `X-Operator-Token` (credential-based). `assess()` responses include `resolved_operator` and `linked_wallets[]` (same-operator sibling wallets — all resolve to the same canonical operator). `createSession()` and `createCredential()` responses include an `agent_memory` cross-merchant pattern hint. `createSession()` also returns `next_steps.action: "deliver_verify_url_and_poll"` + polling instructions. `pollSession()` returns `next_steps.action` of `continue_polling`, `retry_merchant_request_with_operator_token`, `use_stored_operator_token`, `create_new_session`, `verification_failed`, or `contact_support` depending on state. + ## Methods - `getReputation(address, options?)` — cached reputation lookup (free) -- `assess(address, options?)` — identity gate with policy (paid). Accepts `operatorToken` for non-wallet agents. -- `createSession(options?)` — create verification session for identity bootstrapping -- `pollSession(sessionId, pollSecret)` — poll session status, returns credential when verified -- `createCredential(options?)` — create operator credential (24h TTL default) +- `assess(address, options?)` — identity gate with policy (paid). Accepts `operatorToken` for non-wallet agents. Response includes `linked_wallets[]` and `resolved_operator`. +- `createSession(options?)` — create verification session for identity bootstrapping. Returns `agent_memory` + `next_steps`. +- `pollSession(sessionId, pollSecret)` — poll session status, returns credential when verified, plus `next_steps.action`. +- `createCredential(options?)` — create operator credential (24h TTL default). Response includes `agent_memory`. - `listCredentials()` — list active credentials - `revokeCredential(id)` — revoke a credential -- `associateWallet({ operatorToken, walletAddress, network, idempotencyKey? })` — report a signer wallet seen paying under a credential (TEC-189). Fire-and-forget; use the payment intent id / tx hash as `idempotencyKey` so retries don't inflate transaction_count. +- `associateWallet({ operatorToken, walletAddress, network, idempotencyKey? })` — report a signer wallet seen paying under a credential. Fire-and-forget; use the payment intent id / tx hash as `idempotencyKey` so retries don't inflate transaction_count. ## Architecture From db23a7a12e360fdabff16da5128df61c60215065 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 09:13:57 -0700 Subject: [PATCH 05/28] feat: add probe-strategy NextStepsAction values to the type enum Gate-emitted denials now ship these action codes inside agent_instructions: probe_identity_then_session, resign_or_switch_to_operator_token, switch_to_operator_token, and deliver_verify_url_and_poll (POST /v1/sessions). Add them to the NextStepsAction union plus the GET-poll session state actions so TypeScript agents see recognized enum members when they destructure next_steps.action / the parsed agent_instructions. Rename: drop the stale send_existing_identity (never implemented server-side; the current contract is probe_identity_then_session which supersedes it). Test: types.test.ts asserts all new values are accepted. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/types.ts | 22 ++++++++++++++++++++-- tests/types.test.ts | 13 +++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/types.ts b/src/types.ts index 4b8edbf..9f1b8ef 100644 --- a/src/types.ts +++ b/src/types.ts @@ -232,10 +232,28 @@ export type NextStepsAction = | 'regenerate_payment_credential' | 'none' | 'done' - | 'send_existing_identity' | 'mint_new_credential' | 'use_operator_token' - | 'regenerate_payment_from_linked_wallet'; + | 'regenerate_payment_from_linked_wallet' + // Gate-emitted probe strategy: try wallet on signing rails, fall back to stored + // opc_..., fall back to session flow. Emitted on bare missing_identity 403s. + | 'probe_identity_then_session' + // Wallet signer mismatch: re-sign from expected_signer / any linked_wallets entry, + // or drop X-Wallet-Address and retry with X-Operator-Token. + | 'resign_or_switch_to_operator_token' + // Non-signing rail (Stripe SPT, card): X-Wallet-Address has no signature to verify. + // Drop the wallet header and use X-Operator-Token. + | 'switch_to_operator_token' + // Session creation success — deliver verify_url to the user and poll poll_url until + // operator_token issues. Emitted on POST /v1/sessions. + | 'deliver_verify_url_and_poll' + // Session poll states. + | 'continue_polling' + | 'retry_merchant_request_with_operator_token' + | 'use_stored_operator_token' + | 'create_new_session' + | 'verification_failed' + | 'complete_kyc_then_retry'; /** * Error body shape for `wallet_signer_mismatch` denials. The claimed wallet's operator diff --git a/tests/types.test.ts b/tests/types.test.ts index 9d7475c..06285fc 100644 --- a/tests/types.test.ts +++ b/tests/types.test.ts @@ -28,14 +28,23 @@ describe('1.9.0 types', () => { it('accepts all new NextStepsAction values', () => { const actions: NextStepsAction[] = [ - 'send_existing_identity', + // Probe strategy (gate-emitted missing_identity). + 'probe_identity_then_session', + 'resign_or_switch_to_operator_token', + 'switch_to_operator_token', + 'deliver_verify_url_and_poll', + // Session poll states. + 'continue_polling', + 'retry_merchant_request_with_operator_token', + 'use_stored_operator_token', + // Backward-compat: pre-1.9.0 actions still present. 'mint_new_credential', 'use_operator_token', 'regenerate_payment_from_linked_wallet', 'poll_for_credential', 'contact_support', ]; - expect(actions).toHaveLength(6); + expect(actions).toHaveLength(12); }); it('WalletSignerMismatchBody shape', () => { From 78497b5ac37c6f16896df38737e4dbe116f5b0fc Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 09:27:36 -0700 Subject: [PATCH 06/28] docs(readme): document agent_memory + linked_wallets in session/assess flows README now calls out that createSession returns structured next_steps (with action=deliver_verify_url_and_poll) and agent_memory; that pollSession returns a typed next_steps.action from the NextStepsAction enum; and that assess responses include resolved_operator + linked_wallets[] for cross-merchant same-operator resolution. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 35815b0..d46018a 100644 --- a/README.md +++ b/README.md @@ -59,12 +59,13 @@ console.log(result.decision); // "allow" | "deny" ### Verification Sessions -Bootstrap identity for first-time agents: +Bootstrap identity for first-time agents. The success body carries structured `next_steps` (with `action: "deliver_verify_url_and_poll"`) and a cross-merchant `agent_memory` hint. Poll responses carry `next_steps.action` from the typed `NextStepsAction` union (`continue_polling`, `retry_merchant_request_with_operator_token`, `use_stored_operator_token`, `create_new_session`, `verification_failed`, `contact_support`). ```typescript // Create a session — returns a verify_url for the user and a poll_url for the agent const session = await client.createSession(); console.log(session.verify_url, session.poll_url, session.poll_secret); +console.log(session.next_steps.action); // "deliver_verify_url_and_poll" // Poll until the user completes verification const status = await client.pollSession(session.session_id, session.poll_secret); @@ -73,6 +74,10 @@ if (status.status === "verified") { } ``` +### Wallet resolution + +`assess()` responses include `resolved_operator` and `linked_wallets[]` — all same-operator sibling wallets (claimed via SIWE or captured via prior `associateWallet`). Merchants doing wallet-signer-match checks should accept a payment signed by any address in `linked_wallets`. + ### Credential Management ```typescript From d6f79969a55d8afaf8c5055729d34e23afde97c2 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 09:54:27 -0700 Subject: [PATCH 07/28] feat(types): describe both gate-default and merchant-override denial shapes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The WalletSignerMismatchBody and WalletAuthRequiresSigningBody types required a specific next_steps.action literal (regenerate_payment_from_linked_wallet, use_operator_token). That only describes the merchant-override shape (like martin-estate's custom 403). Merchants using the gate's default denial marshaller instead emit agent_instructions (JSON-encoded string) with resign_or_switch_to_operator_token / switch_to_operator_token actions. Update both types to reflect reality: - next_steps optional (not required) - next_steps.action broadened to NextStepsAction (not a single literal) - Add optional agent_instructions: string Also add agent_instructions to AgentScoreErrorBody so the generic error body type covers gate-emitted denials. Also wire up structured next_steps on SessionCreateResponse (POST /v1/sessions returns action=deliver_verify_url_and_poll plus poll_interval_seconds + steps) — previously undocumented in the typed response. Tighten SessionPollNextSteps.action and CredentialCreateErrorResponse next_steps.action from string to NextStepsAction. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/types.ts | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/types.ts b/src/types.ts index 9f1b8ef..ba8d1ff 100644 --- a/src/types.ts +++ b/src/types.ts @@ -191,6 +191,10 @@ export interface AgentScoreErrorBody { /** Cross-merchant pattern hint for agents to persist to memory. Present on bootstrap * denials (`operator_verification_required`) and session-create responses. */ agent_memory?: AgentMemoryHint; + /** JSON-encoded action copy (`{action, steps, user_message}`) emitted on every + * gate denial so agents see a concrete recovery path in the response itself. Parse + * as JSON; `action` will be a `NextStepsAction`. Absent on plain API errors. */ + agent_instructions?: string; } /** @@ -271,8 +275,16 @@ export interface WalletSignerMismatchBody { expected_signer?: string; actual_signer?: string; linked_wallets: string[]; - next_steps: { - action: 'regenerate_payment_from_linked_wallet'; + /** JSON-encoded `{action: 'resign_or_switch_to_operator_token', steps, user_message}`. + * Present when the merchant uses the gate's default denial marshaller. Merchants that + * override with their own `next_steps` may emit that instead — parse whichever is present. */ + agent_instructions?: string; + /** Structured action guidance. Present when the merchant overrides the gate default with + * a custom `next_steps`. `action` may be any `NextStepsAction` — typically + * `resign_or_switch_to_operator_token` (gate default) or + * `regenerate_payment_from_linked_wallet` (legacy merchant override). */ + next_steps?: { + action: NextStepsAction; user_message?: string; learn_more_url?: string; }; @@ -289,8 +301,14 @@ export interface WalletAuthRequiresSigningBody { code: 'wallet_auth_requires_wallet_signing'; message: string; }; - next_steps: { - action: 'use_operator_token'; + /** JSON-encoded `{action: 'switch_to_operator_token', steps, user_message}`. Present when + * the merchant uses the gate's default denial marshaller. */ + agent_instructions?: string; + /** Structured action guidance. Present when the merchant overrides the gate default. + * `action` is typically `switch_to_operator_token` (gate default) or `use_operator_token` + * (legacy merchant override). */ + next_steps?: { + action: NextStepsAction; user_message?: string; /** Rails that carry a wallet signature and can be used under wallet-auth. */ signer_capable_rails?: string[]; @@ -351,12 +369,21 @@ export interface SessionCreateResponse { verify_url: string; poll_url: string; expires_at: string; + /** Structured `next_steps.action: 'deliver_verify_url_and_poll'` with step-by-step + * instructions for consuming the session. */ + next_steps?: { + action: NextStepsAction; + poll_interval_seconds?: number; + poll_secret_header?: string; + steps?: string[]; + user_message?: string; + }; /** Cross-merchant memory hint for agents on first session creation. */ agent_memory?: AgentMemoryHint; } export interface SessionPollNextSteps { - action: string; + action: NextStepsAction; user_message?: string; header_name?: string; poll_interval_seconds?: number; @@ -399,7 +426,7 @@ export interface CredentialCreateErrorResponse { }; verify_url: string; next_steps: { - action: string; + action: NextStepsAction; user_message: string; }; } From 930a0dfc8a80457365a8e3893570610e392a1b64 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 10:07:37 -0700 Subject: [PATCH 08/28] feat(types): AssociateWalletResponse.agent_memory for first-seen captures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The API emits agent_memory on POST /v1/credentials/wallets when first_seen is true (first capture of a (credential, wallet, network) tuple) — previously undocumented in the typed response, so SDK consumers couldn't forward it to agents. Field is optional; absent on subsequent captures. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/types.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/types.ts b/src/types.ts index ba8d1ff..82f5eb0 100644 --- a/src/types.ts +++ b/src/types.ts @@ -481,4 +481,8 @@ export interface AssociateWalletResponse { first_seen: boolean; /** Present and `true` when the call was deduped against a prior matching `idempotency_key`. */ deduped?: boolean; + /** Cross-merchant pattern hint. Emitted only on the first wallet capture (`first_seen: true`) + * so merchants can relay it once in a 402 body and LLM-hosted agents persist the pattern + * to long-term memory. Absent on all subsequent captures. */ + agent_memory?: AgentMemoryHint; } From 1e0bca31400adcad38a623b6e42fdd345939281d Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 10:38:55 -0700 Subject: [PATCH 09/28] =?UTF-8?q?chore:=20homepage=20URL=20=E2=86=92=20age?= =?UTF-8?q?ntscore.sh=20(product=20landing,=20not=20docs=20subdomain)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Was pointing to https://docs.agentscore.sh which is the docs-only subdomain. The canonical product URL is agentscore.sh. Aligned with python-sdk, node-gate, python-gate, and mcp in the same commit series. Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c5fd53f..2815279 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "type": "git", "url": "https://github.com/agentscore/node-sdk" }, - "homepage": "https://docs.agentscore.sh", + "homepage": "https://agentscore.sh", "bugs": { "url": "https://github.com/agentscore/node-sdk/issues" }, From e954f4237ebf5c2cbba58a0aa65d87bc473adb57 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 11:32:58 -0700 Subject: [PATCH 10/28] feat(types): drop token_revoked from DenialCode union MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The API unifies revoked + TTL-expired credentials under a single token_expired 401 — deliberate to avoid leaking the user's revoke intent. Agents only ever see token_expired; the SDK type reflects that. Updated JSDoc describing token_expired to note it covers both cases and now carries an auto-minted session in the 401 body for user-in-loop recovery (no API key needed). Co-Authored-By: Claude Opus 4.7 (1M context) --- src/types.ts | 11 ++++++----- tests/types.test.ts | 3 +-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/types.ts b/src/types.ts index 82f5eb0..d84e196 100644 --- a/src/types.ts +++ b/src/types.ts @@ -204,9 +204,11 @@ export interface AgentScoreErrorBody { * different operator (or isn't linked to any operator). * - `wallet_auth_requires_wallet_signing`: X-Wallet-Address claimed with a payment rail that * has no wallet signer (SPT, card). Agent should switch to X-Operator-Token. - * - `token_expired`: operator token valid-shape but past its TTL. Agent should mint a new - * credential via POST /v1/credentials, no re-KYC needed. - * - `token_revoked`: operator token was revoked. Agent should stop and surface to user. + * - `token_expired`: operator token is no longer valid (revoked or past its TTL — + * the two cases share this code deliberately so the API doesn't leak which one). + * The 401 body carries an auto-minted session (`verify_url`, `session_id`, `poll_secret`) + * so the agent can recover without an API key: share `verify_url` with the user, poll + * until verified, receive a fresh operator_token. Existing account KYC persists. */ export type DenialCode = | 'operator_verification_required' @@ -220,8 +222,7 @@ export type DenialCode = | 'kyc_required' | 'wallet_signer_mismatch' | 'wallet_auth_requires_wallet_signing' - | 'token_expired' - | 'token_revoked'; + | 'token_expired'; /** * Recommended agent action encoded in `next_steps.action`. Granular codes let agents pick the diff --git a/tests/types.test.ts b/tests/types.test.ts index 06285fc..5665437 100644 --- a/tests/types.test.ts +++ b/tests/types.test.ts @@ -21,9 +21,8 @@ describe('1.9.0 types', () => { 'wallet_signer_mismatch', 'wallet_auth_requires_wallet_signing', 'token_expired', - 'token_revoked', ]; - expect(codes).toHaveLength(6); + expect(codes).toHaveLength(5); }); it('accepts all new NextStepsAction values', () => { From a9563d15060d0b736f07c0496c6eb15ce65b6463 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 11:51:10 -0700 Subject: [PATCH 11/28] feat(types): drop mint_new_credential from NextStepsAction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The API no longer emits this action. token_expired (which used to point to mint_new_credential) now points to deliver_verify_url_and_poll since the 401 body carries an auto-minted session. Removing from the union prevents agents from type-checking against a value they'll never see. Test count updated (12 → 11). Co-Authored-By: Claude Opus 4.7 (1M context) --- src/types.ts | 1 - tests/types.test.ts | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/types.ts b/src/types.ts index d84e196..d6e8687 100644 --- a/src/types.ts +++ b/src/types.ts @@ -237,7 +237,6 @@ export type NextStepsAction = | 'regenerate_payment_credential' | 'none' | 'done' - | 'mint_new_credential' | 'use_operator_token' | 'regenerate_payment_from_linked_wallet' // Gate-emitted probe strategy: try wallet on signing rails, fall back to stored diff --git a/tests/types.test.ts b/tests/types.test.ts index 5665437..125dc34 100644 --- a/tests/types.test.ts +++ b/tests/types.test.ts @@ -37,13 +37,12 @@ describe('1.9.0 types', () => { 'retry_merchant_request_with_operator_token', 'use_stored_operator_token', // Backward-compat: pre-1.9.0 actions still present. - 'mint_new_credential', 'use_operator_token', 'regenerate_payment_from_linked_wallet', 'poll_for_credential', 'contact_support', ]; - expect(actions).toHaveLength(12); + expect(actions).toHaveLength(11); }); it('WalletSignerMismatchBody shape', () => { From d9be5cbfdda1d41f2436dbb1013777598da04330 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 20:57:02 -0700 Subject: [PATCH 12/28] =?UTF-8?q?chore(ci):=20bump=20actions/cache=20v4?= =?UTF-8?q?=E2=86=92v5,=20osv-scanner=20v2.3.2=E2=86=92v2.3.5,=20drop=20||?= =?UTF-8?q?=20true?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mirrors the cleanup landed in agentscore/pay (commit 8c3be79): - actions/cache@v5: Node 24 runtime, satisfied by GitHub-hosted + Blacksmith runners. - osv-scanner v2.3.5: 3 patch releases since 2.3.2; switched to the modern `scan source` subcommand. - Removed `|| true` after the dependency-scan steps. The suppression silently masked osv-scanner crash exits (network failure, corrupted binary) along with any vulnerability findings. Verified locally that every lockfile in this repo returns 0 issues, so CI passes today. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ci.yml | 2 +- .github/workflows/security.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95fba2e..e44964e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: steps: - uses: useblacksmith/checkout@v1 - uses: oven-sh/setup-bun@v2 - - uses: actions/cache@v4 + - uses: actions/cache@v5 with: path: ~/.bun/install/cache key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }} diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 037aa83..d228aa7 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -23,9 +23,9 @@ jobs: - name: Install osv-scanner run: | - curl -fsSL https://github.com/google/osv-scanner/releases/download/v2.3.2/osv-scanner_linux_amd64 -o osv-scanner + curl -fsSL https://github.com/google/osv-scanner/releases/download/v2.3.5/osv-scanner_linux_amd64 -o osv-scanner chmod +x osv-scanner - name: Scan dependencies - run: ./osv-scanner --lockfile=bun.lock --format=table || true + run: ./osv-scanner scan source --lockfile=bun.lock --format=table From 3270a1ff8fe26a2ef1abaefe077cbb751adba415 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 20:59:46 -0700 Subject: [PATCH 13/28] fix(ci): osv-scanner binary must be _linux_arm64 (Blacksmith runners are ARM) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous _linux_amd64 download silently exec-failed; the prior `|| true` masked it. Now that the swallow is removed, the architecture mismatch surfaces. Blacksmith pool is ARM, osv-scanner publishes both _amd64 and _arm64 binaries — switching to the right one. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/security.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index d228aa7..7fae4fb 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -23,7 +23,7 @@ jobs: - name: Install osv-scanner run: | - curl -fsSL https://github.com/google/osv-scanner/releases/download/v2.3.5/osv-scanner_linux_amd64 -o osv-scanner + curl -fsSL https://github.com/google/osv-scanner/releases/download/v2.3.5/osv-scanner_linux_arm64 -o osv-scanner chmod +x osv-scanner - name: Scan dependencies From b0a418b8f1e6813bd9c7ba3190697ceca590859e Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Fri, 24 Apr 2026 21:09:15 -0700 Subject: [PATCH 14/28] chore(deps): refresh lockfiles to clear transitive CVEs osv-scanner v2.3.5 (now strict, since `|| true` was dropped) flagged transitive vulnerabilities. `bun update` was a no-op because the lockfile was already maximal under the recorded resolutions; a fresh `rm bun.lock && bun install` re-resolved transitives and picked the patched versions. Verified locally: 0 osv findings, typecheck clean, all tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) --- bun.lock | 272 +++++++++++++++++++++---------------------------------- 1 file changed, 105 insertions(+), 167 deletions(-) diff --git a/bun.lock b/bun.lock index 86c28a8..b8d7cd4 100644 --- a/bun.lock +++ b/bun.lock @@ -3,7 +3,7 @@ "configVersion": 1, "workspaces": { "": { - "name": "@agentscore/sdk", + "name": "@agent-score/sdk", "devDependencies": { "@eslint/js": "^9.39.4", "@vitest/coverage-v8": "^4.1.5", @@ -29,63 +29,63 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="], - "@emnapi/core": ["@emnapi/core@1.9.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA=="], + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], - "@emnapi/runtime": ["@emnapi/runtime@1.9.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA=="], + "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.27.4", "", { "os": "android", "cpu": "arm" }, "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.4", "", { "os": "android", "cpu": "arm64" }, "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.27.4", "", { "os": "android", "cpu": "x64" }, "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.4", "", { "os": "linux", "cpu": "arm" }, "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.4", "", { "os": "linux", "cpu": "x64" }, "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.4", "", { "os": "none", "cpu": "x64" }, "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.4", "", { "os": "win32", "cpu": "x64" }, "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], @@ -105,9 +105,11 @@ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], - "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], - "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], + + "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], @@ -121,91 +123,91 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], - "@oxc-project/types": ["@oxc-project/types@0.120.0", "", {}, "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg=="], + "@oxc-project/types": ["@oxc-project/types@0.127.0", "", {}, "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.10", "", { "os": "android", "cpu": "arm64" }, "sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.17", "", { "os": "android", "cpu": "arm64" }, "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w=="], + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A=="], + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.17", "", { "os": "freebsd", "cpu": "x64" }, "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10", "", { "os": "linux", "cpu": "arm" }, "sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm" }, "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg=="], - "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w=="], + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA=="], - "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "s390x" }, "sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg=="], + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "s390x" }, "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.10", "", { "os": "linux", "cpu": "x64" }, "sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "x64" }, "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.10", "", { "os": "linux", "cpu": "x64" }, "sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.17", "", { "os": "linux", "cpu": "x64" }, "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw=="], - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.10", "", { "os": "none", "cpu": "arm64" }, "sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.17", "", { "os": "none", "cpu": "arm64" }, "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA=="], - "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.10", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA=="], + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.17", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17", "", { "os": "win32", "cpu": "arm64" }, "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA=="], - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.10", "", { "os": "win32", "cpu": "x64" }, "sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.17", "", { "os": "win32", "cpu": "x64" }, "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.10", "", {}, "sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.17", "", {}, "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.2", "", { "os": "android", "cpu": "arm" }, "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.2", "", { "os": "android", "cpu": "arm64" }, "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.59.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.59.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.59.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.59.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.2", "", { "os": "linux", "cpu": "arm" }, "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.2", "", { "os": "linux", "cpu": "arm" }, "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.2", "", { "os": "linux", "cpu": "none" }, "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A=="], - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q=="], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.2", "", { "os": "linux", "cpu": "none" }, "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw=="], - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA=="], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.2", "", { "os": "linux", "cpu": "none" }, "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.2", "", { "os": "linux", "cpu": "none" }, "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.59.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.2", "", { "os": "linux", "cpu": "x64" }, "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.2", "", { "os": "linux", "cpu": "x64" }, "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw=="], - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.59.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ=="], + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.59.0", "", { "os": "none", "cpu": "arm64" }, "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.2", "", { "os": "none", "cpu": "arm64" }, "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.59.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.59.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA=="], + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.2", "", { "os": "win32", "cpu": "x64" }, "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.2", "", { "os": "win32", "cpu": "x64" }, "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], @@ -223,17 +225,17 @@ "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.57.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.57.1", "@typescript-eslint/type-utils": "8.57.1", "@typescript-eslint/utils": "8.57.1", "@typescript-eslint/visitor-keys": "8.57.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.57.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.59.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/type-utils": "8.59.0", "@typescript-eslint/utils": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.59.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw=="], "@typescript-eslint/parser": ["@typescript-eslint/parser@8.59.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg=="], "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.59.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.59.0", "@typescript-eslint/types": "^8.59.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.57.1", "", { "dependencies": { "@typescript-eslint/types": "8.57.1", "@typescript-eslint/visitor-keys": "8.57.1" } }, "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0" } }, "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg=="], "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.59.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.57.1", "", { "dependencies": { "@typescript-eslint/types": "8.57.1", "@typescript-eslint/typescript-estree": "8.57.1", "@typescript-eslint/utils": "8.57.1", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0", "@typescript-eslint/utils": "8.59.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg=="], "@typescript-eslint/types": ["@typescript-eslint/types@8.59.0", "", {}, "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A=="], @@ -241,7 +243,7 @@ "@typescript-eslint/utils": ["@typescript-eslint/utils@8.59.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.57.1", "", { "dependencies": { "@typescript-eslint/types": "8.57.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q=="], "@vitest/coverage-v8": ["@vitest/coverage-v8@4.1.5", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.1.5", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.2", "obug": "^2.1.1", "std-env": "^4.0.0-rc.1", "tinyrainbow": "^3.1.0" }, "peerDependencies": { "@vitest/browser": "4.1.5", "vitest": "4.1.5" }, "optionalPeers": ["@vitest/browser"] }, "sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A=="], @@ -263,7 +265,7 @@ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="], + "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -293,13 +295,13 @@ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "brace-expansion": ["brace-expansion@1.1.14", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g=="], "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], - "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + "call-bind": ["call-bind@1.0.9", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" } }, "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ=="], "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], @@ -351,7 +353,7 @@ "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - "es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="], + "es-abstract": ["es-abstract@1.24.2", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg=="], "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], @@ -367,13 +369,13 @@ "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], - "esbuild": ["esbuild@0.27.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.4", "@esbuild/android-arm": "0.27.4", "@esbuild/android-arm64": "0.27.4", "@esbuild/android-x64": "0.27.4", "@esbuild/darwin-arm64": "0.27.4", "@esbuild/darwin-x64": "0.27.4", "@esbuild/freebsd-arm64": "0.27.4", "@esbuild/freebsd-x64": "0.27.4", "@esbuild/linux-arm": "0.27.4", "@esbuild/linux-arm64": "0.27.4", "@esbuild/linux-ia32": "0.27.4", "@esbuild/linux-loong64": "0.27.4", "@esbuild/linux-mips64el": "0.27.4", "@esbuild/linux-ppc64": "0.27.4", "@esbuild/linux-riscv64": "0.27.4", "@esbuild/linux-s390x": "0.27.4", "@esbuild/linux-x64": "0.27.4", "@esbuild/netbsd-arm64": "0.27.4", "@esbuild/netbsd-x64": "0.27.4", "@esbuild/openbsd-arm64": "0.27.4", "@esbuild/openbsd-x64": "0.27.4", "@esbuild/openharmony-arm64": "0.27.4", "@esbuild/sunos-x64": "0.27.4", "@esbuild/win32-arm64": "0.27.4", "@esbuild/win32-ia32": "0.27.4", "@esbuild/win32-x64": "0.27.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ=="], + "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], - "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.10", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.16.1", "resolve": "^2.0.0-next.6" } }, "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ=="], "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], @@ -455,7 +457,7 @@ "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="], "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], @@ -599,6 +601,8 @@ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "node-exports-info": ["node-exports-info@1.6.0", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], @@ -607,6 +611,8 @@ "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], @@ -635,7 +641,7 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], @@ -643,7 +649,7 @@ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], + "postcss": ["postcss@8.5.10", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ=="], "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], @@ -657,15 +663,15 @@ "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], - "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + "resolve": ["resolve@2.0.0-next.6", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA=="], "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], - "rolldown": ["rolldown@1.0.0-rc.10", "", { "dependencies": { "@oxc-project/types": "=0.120.0", "@rolldown/pluginutils": "1.0.0-rc.10" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.10", "@rolldown/binding-darwin-arm64": "1.0.0-rc.10", "@rolldown/binding-darwin-x64": "1.0.0-rc.10", "@rolldown/binding-freebsd-x64": "1.0.0-rc.10", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.10", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.10", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.10", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.10", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.10", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.10", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.10", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.10" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA=="], + "rolldown": ["rolldown@1.0.0-rc.17", "", { "dependencies": { "@oxc-project/types": "=0.127.0", "@rolldown/pluginutils": "1.0.0-rc.17" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.17", "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", "@rolldown/binding-darwin-x64": "1.0.0-rc.17", "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA=="], - "rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="], + "rollup": ["rollup@4.60.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.2", "@rollup/rollup-android-arm64": "4.60.2", "@rollup/rollup-darwin-arm64": "4.60.2", "@rollup/rollup-darwin-x64": "4.60.2", "@rollup/rollup-freebsd-arm64": "4.60.2", "@rollup/rollup-freebsd-x64": "4.60.2", "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", "@rollup/rollup-linux-arm-musleabihf": "4.60.2", "@rollup/rollup-linux-arm64-gnu": "4.60.2", "@rollup/rollup-linux-arm64-musl": "4.60.2", "@rollup/rollup-linux-loong64-gnu": "4.60.2", "@rollup/rollup-linux-loong64-musl": "4.60.2", "@rollup/rollup-linux-ppc64-gnu": "4.60.2", "@rollup/rollup-linux-ppc64-musl": "4.60.2", "@rollup/rollup-linux-riscv64-gnu": "4.60.2", "@rollup/rollup-linux-riscv64-musl": "4.60.2", "@rollup/rollup-linux-s390x-gnu": "4.60.2", "@rollup/rollup-linux-x64-gnu": "4.60.2", "@rollup/rollup-linux-x64-musl": "4.60.2", "@rollup/rollup-openbsd-x64": "4.60.2", "@rollup/rollup-openharmony-arm64": "4.60.2", "@rollup/rollup-win32-arm64-msvc": "4.60.2", "@rollup/rollup-win32-ia32-msvc": "4.60.2", "@rollup/rollup-win32-x64-gnu": "4.60.2", "@rollup/rollup-win32-x64-msvc": "4.60.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ=="], - "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + "safe-array-concat": ["safe-array-concat@1.1.4", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg=="], "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], @@ -685,7 +691,7 @@ "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], - "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], @@ -699,7 +705,7 @@ "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], - "std-env": ["std-env@4.0.0", "", {}, "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ=="], + "std-env": ["std-env@4.1.0", "", {}, "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ=="], "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], @@ -727,7 +733,7 @@ "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], "tinyrainbow": ["tinyrainbow@3.1.0", "", {}, "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="], @@ -763,7 +769,7 @@ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - "vite": ["vite@8.0.1", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.3", "postcss": "^8.5.8", "rolldown": "1.0.0-rc.10", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw=="], + "vite": ["vite@8.0.10", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.10", "rolldown": "1.0.0-rc.17", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw=="], "vitest": ["vitest@4.1.5", "", { "dependencies": { "@vitest/expect": "4.1.5", "@vitest/mocker": "4.1.5", "@vitest/pretty-format": "4.1.5", "@vitest/runner": "4.1.5", "@vitest/snapshot": "4.1.5", "@vitest/spy": "4.1.5", "@vitest/utils": "4.1.5", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.5", "@vitest/browser-preview": "4.1.5", "@vitest/browser-webdriverio": "4.1.5", "@vitest/coverage-istanbul": "4.1.5", "@vitest/coverage-v8": "4.1.5", "@vitest/ui": "4.1.5", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg=="], @@ -785,32 +791,12 @@ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.57.1", "@typescript-eslint/types": "8.57.1", "@typescript-eslint/typescript-estree": "8.57.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0" } }, "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg=="], - - "@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q=="], - - "@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.57.1", "", {}, "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ=="], - - "@typescript-eslint/type-utils/@typescript-eslint/types": ["@typescript-eslint/types@8.57.1", "", {}, "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ=="], - - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.57.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.57.1", "@typescript-eslint/tsconfig-utils": "8.57.1", "@typescript-eslint/types": "8.57.1", "@typescript-eslint/visitor-keys": "8.57.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g=="], - - "@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.57.1", "@typescript-eslint/types": "8.57.1", "@typescript-eslint/typescript-estree": "8.57.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ=="], - - "@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q=="], - - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], - "@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0" } }, "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg=="], - - "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.57.1", "", {}, "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ=="], - "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -823,58 +809,10 @@ "make-dir/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], - "typescript-eslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.59.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/type-utils": "8.59.0", "@typescript-eslint/utils": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.59.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw=="], - - "vitest/tinyexec": ["tinyexec@1.0.4", "", {}, "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.57.1", "", {}, "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.57.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.57.1", "@typescript-eslint/tsconfig-utils": "8.57.1", "@typescript-eslint/types": "8.57.1", "@typescript-eslint/visitor-keys": "8.57.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g=="], - - "@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.57.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.57.1", "@typescript-eslint/types": "^8.57.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg=="], - - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.57.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg=="], + "vitest/tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="], - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], - - "@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], - - "@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q=="], - - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0" } }, "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg=="], - - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0", "@typescript-eslint/utils": "8.59.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg=="], - - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q=="], - - "typescript-eslint/@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.57.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.57.1", "@typescript-eslint/types": "^8.57.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.57.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], - - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - - "@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - - "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.4", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg=="], - - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], } } From bd0a02d4cb5cd7203daabe8ca19f75818a09ea32 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Sat, 25 Apr 2026 15:14:00 -0700 Subject: [PATCH 15/28] docs: note Solana wallet address support + linked_wallets may mix EVM/Solana --- .claude/CLAUDE.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index cd20cb4..8601e43 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -4,7 +4,7 @@ TypeScript client for the AgentScore trust and reputation API. ## Identity Model -Two identity paths: `X-Wallet-Address` (wallet-based) and `X-Operator-Token` (credential-based). `assess()` responses include `resolved_operator` and `linked_wallets[]` (same-operator sibling wallets — all resolve to the same canonical operator). `createSession()` and `createCredential()` responses include an `agent_memory` cross-merchant pattern hint. `createSession()` also returns `next_steps.action: "deliver_verify_url_and_poll"` + polling instructions. `pollSession()` returns `next_steps.action` of `continue_polling`, `retry_merchant_request_with_operator_token`, `use_stored_operator_token`, `create_new_session`, `verification_failed`, or `contact_support` depending on state. +Two identity paths: `X-Wallet-Address` (wallet-based) and `X-Operator-Token` (credential-based). Wallet addresses accept both EVM (`0x...` 40-hex) and Solana (base58, 32–44 chars) formats — network is auto-detected from the address shape. `assess()` responses include `resolved_operator` and `linked_wallets[]` (same-operator sibling wallets, normalized per network — EVM lowercased, Solana base58 verbatim; may mix chains for cross-chain operators). `createSession()` and `createCredential()` responses include an `agent_memory` cross-merchant pattern hint. `createSession()` also returns `next_steps.action: "deliver_verify_url_and_poll"` + polling instructions. `pollSession()` returns `next_steps.action` of `continue_polling`, `retry_merchant_request_with_operator_token`, `use_stored_operator_token`, `create_new_session`, `verification_failed`, or `contact_support` depending on state. ## Methods diff --git a/README.md b/README.md index d46018a..f348fdb 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ if (status.status === "verified") { ### Wallet resolution -`assess()` responses include `resolved_operator` and `linked_wallets[]` — all same-operator sibling wallets (claimed via SIWE or captured via prior `associateWallet`). Merchants doing wallet-signer-match checks should accept a payment signed by any address in `linked_wallets`. +`assess()` responses include `resolved_operator` and `linked_wallets[]` — all same-operator sibling wallets (claimed via SIWE or captured via prior `associateWallet`). The list may mix EVM addresses (`0x...` lowercased) and Solana addresses (base58, case-preserved) for cross-chain operators; merchants doing wallet-signer-match checks should accept a payment signed by any address in the list, regardless of chain. The `address` parameter on `assess()` and `getReputation()` accepts either format — network is auto-detected from the address shape. ### Credential Management From 7cd40e93a68124d5d908fe12955ad71a5267e004 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Sat, 25 Apr 2026 23:07:33 -0700 Subject: [PATCH 16/28] fix(client): use a fresh AbortController for 429 retry The original request's timeout would keep running through the retry-after sleep. If it fired before the retry started, the retry's fetch saw an already-aborted signal and failed silently as a timeout instead of completing rate-limit recovery. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/index.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index a940725..1b31df2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -168,10 +168,19 @@ export class AgentScore { const waitMs = retryAfter ? Number(retryAfter) * 1000 : 1000; await new Promise((resolve) => setTimeout(resolve, Math.min(waitMs, 10_000))); - const retry = await fetch(url, { ...options, headers, signal }); - if (retry.ok) return (await retry.json()) as T; + // Fresh controller for the retry. Reusing the original signal would let a stale + // timeout abort the retry mid-flight (the original timer keeps running while we + // wait retry-after, and may already have fired by the time the retry starts). + const retryController = new AbortController(); + const retryTimer = setTimeout(() => retryController.abort(), this.timeout); + try { + const retry = await fetch(url, { ...options, headers, signal: retryController.signal }); + if (retry.ok) return (await retry.json()) as T; - throw new AgentScoreError('rate_limited', 'Rate limit exceeded', 429); + throw new AgentScoreError('rate_limited', 'Rate limit exceeded', 429); + } finally { + clearTimeout(retryTimer); + } } if (!response.ok) { From b86825953b12a23ba0fe5825983710528cf73289 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Sun, 26 Apr 2026 00:38:15 -0700 Subject: [PATCH 17/28] feat(sdk): add verifyWebhookSignature helper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes audit item #12. Generic HMAC-SHA256 webhook signature verifier, Stripe-pattern (`t=,v1=` header). Useful both when AgentScore eventually ships outbound webhooks and as a generic helper for merchants verifying any HMAC-signed webhook source (Stripe, GitHub, etc.). Returns a structured result with `reason` set on failure (no_signatures / no_timestamp / timestamp_too_old / timestamp_in_future / signature_mismatch / malformed_header) so callers can differentiate transient vs permanent failures. Tolerance defaults to 300s (Stripe convention); set to 0 to disable timestamp checking for raw HMAC use cases. Also adds @types/node to devDependencies + tsconfig types: ["node"] — needed for the Buffer + crypto imports the helper uses. Existing modules were getting away without this because they didn't use Node-specific types at the source level (they slipped through DTS generation). 10 new tests covering all paths + multi-signature header. Co-Authored-By: Claude Opus 4.7 (1M context) --- bun.lock | 5 ++ package.json | 1 + src/index.ts | 5 ++ src/webhooks.ts | 113 +++++++++++++++++++++++++++++++++++++++ tests/webhooks.test.ts | 117 +++++++++++++++++++++++++++++++++++++++++ tsconfig.json | 3 +- 6 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 src/webhooks.ts create mode 100644 tests/webhooks.test.ts diff --git a/bun.lock b/bun.lock index b8d7cd4..7daa945 100644 --- a/bun.lock +++ b/bun.lock @@ -6,6 +6,7 @@ "name": "@agent-score/sdk", "devDependencies": { "@eslint/js": "^9.39.4", + "@types/node": "^25.6.0", "@vitest/coverage-v8": "^4.1.5", "dotenv": "^17.4.2", "eslint": "^9.39.4", @@ -225,6 +226,8 @@ "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + "@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.59.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/type-utils": "8.59.0", "@typescript-eslint/utils": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.59.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw=="], "@typescript-eslint/parser": ["@typescript-eslint/parser@8.59.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg=="], @@ -767,6 +770,8 @@ "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], "vite": ["vite@8.0.10", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.10", "rolldown": "1.0.0-rc.17", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw=="], diff --git a/package.json b/package.json index 2815279..ada80f7 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ }, "devDependencies": { "@eslint/js": "^9.39.4", + "@types/node": "^25.6.0", "@vitest/coverage-v8": "^4.1.5", "dotenv": "^17.4.2", "eslint": "^9.39.4", diff --git a/src/index.ts b/src/index.ts index 1b31df2..65a9c58 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,6 +18,11 @@ import type { } from './types'; export { AgentScoreError } from './errors'; +export { + verifyWebhookSignature, + type VerifyWebhookSignatureInput, + type VerifyWebhookSignatureResult, +} from './webhooks'; export * from './types'; declare const __VERSION__: string; diff --git a/src/webhooks.ts b/src/webhooks.ts new file mode 100644 index 0000000..ef020f3 --- /dev/null +++ b/src/webhooks.ts @@ -0,0 +1,113 @@ +/** + * Webhook signature verification — HMAC-SHA256 based, Stripe-pattern. + * + * Use this when AgentScore (or any service that signs outbound webhooks with this + * convention) sends a webhook to your endpoint. Validates the `X-AgentScore-Signature` + * (or compatible) header before trusting the payload. + * + * Generic enough to cover any HMAC-signed webhook source: pass the right secret + header + * name. Tolerant of multiple signature versions in the same header (Stripe `t=...,v1=...` + * style supported via the `prefixSeparator` parsing option). + */ + +import { createHmac, timingSafeEqual } from 'crypto'; + +export interface VerifyWebhookSignatureInput { + /** Raw request body (string or Buffer). MUST be the unparsed body — even one byte of + * re-serialization breaks the signature. Capture before any JSON parse. */ + payload: string | Buffer; + /** Value of the signature header from the incoming request. */ + signatureHeader: string; + /** The shared secret the sender uses to sign. Per-merchant when AgentScore eventually + * ships webhooks; otherwise whatever the upstream provider issued. */ + secret: string; + /** Tolerance in seconds for timestamp-replay protection. Default 300 (5 min) per + * Stripe convention. Set to 0 to disable timestamp checking. */ + toleranceSeconds?: number; + /** Override the timestamp parameter name in the header. Default `t`. */ + timestampKey?: string; + /** Override the signature parameter name. Default `v1`. Stripe v1 uses HMAC-SHA256. */ + signatureKey?: string; +} + +export interface VerifyWebhookSignatureResult { + valid: boolean; + /** Reason the verification failed; only set when `valid: false`. */ + reason?: 'no_signatures' | 'no_timestamp' | 'timestamp_too_old' | 'timestamp_in_future' | 'signature_mismatch' | 'malformed_header'; +} + +/** + * Verify an HMAC-SHA256 signed webhook signature. Stripe-compatible header format: + * `t=,v1=` + * + * The signed payload is `${timestamp}.${rawBody}`. Returns `{ valid: false, reason }` + * for any failure path so callers can differentiate transient (timestamp drift) from + * permanent (mismatch) failures. + * + * Example: + * ```ts + * app.post('/webhooks/agentscore', express.raw({ type: 'application/json' }), (req, res) => { + * const result = verifyWebhookSignature({ + * payload: req.body, // raw Buffer + * signatureHeader: req.header('x-agentscore-signature') ?? '', + * secret: process.env.AGENTSCORE_WEBHOOK_SECRET!, + * }); + * if (!result.valid) return res.status(400).json({ error: result.reason }); + * const event = JSON.parse(req.body.toString()); + * // ... handle event ... + * }); + * ``` + */ +export function verifyWebhookSignature(input: VerifyWebhookSignatureInput): VerifyWebhookSignatureResult { + const tolerance = input.toleranceSeconds ?? 300; + const tsKey = input.timestampKey ?? 't'; + const sigKey = input.signatureKey ?? 'v1'; + + const parts = input.signatureHeader.split(',').map((p) => p.trim()).filter(Boolean); + if (parts.length === 0) return { valid: false, reason: 'no_signatures' }; + + const params = new Map(); + for (const p of parts) { + const eq = p.indexOf('='); + if (eq < 0) return { valid: false, reason: 'malformed_header' }; + const key = p.slice(0, eq); + const value = p.slice(eq + 1); + const list = params.get(key) ?? []; + list.push(value); + params.set(key, list); + } + + const timestampStr = params.get(tsKey)?.[0]; + if (tolerance > 0) { + if (!timestampStr) return { valid: false, reason: 'no_timestamp' }; + const ts = Number(timestampStr); + if (!Number.isFinite(ts)) return { valid: false, reason: 'no_timestamp' }; + const nowSec = Math.floor(Date.now() / 1000); + if (ts < nowSec - tolerance) return { valid: false, reason: 'timestamp_too_old' }; + if (ts > nowSec + tolerance) return { valid: false, reason: 'timestamp_in_future' }; + } + + const signatures = params.get(sigKey) ?? []; + if (signatures.length === 0) return { valid: false, reason: 'no_signatures' }; + + const payloadBuffer = typeof input.payload === 'string' ? Buffer.from(input.payload, 'utf-8') : input.payload; + const signedPayload = timestampStr + ? Buffer.concat([Buffer.from(`${timestampStr}.`, 'utf-8'), payloadBuffer]) + : payloadBuffer; + + const expectedHex = createHmac('sha256', input.secret).update(signedPayload).digest('hex'); + const expectedBuf = Buffer.from(expectedHex, 'hex'); + + for (const sigHex of signatures) { + let actualBuf: Buffer; + try { + actualBuf = Buffer.from(sigHex, 'hex'); + } catch { + continue; + } + if (actualBuf.length !== expectedBuf.length) continue; + if (timingSafeEqual(actualBuf, expectedBuf)) return { valid: true }; + } + + return { valid: false, reason: 'signature_mismatch' }; +} diff --git a/tests/webhooks.test.ts b/tests/webhooks.test.ts new file mode 100644 index 0000000..5c6d6f1 --- /dev/null +++ b/tests/webhooks.test.ts @@ -0,0 +1,117 @@ +import { createHmac } from 'crypto'; +import { describe, expect, it } from 'vitest'; +import { verifyWebhookSignature } from '../src/webhooks'; + +const SECRET = 'whsec_testsecret'; + +function sign(payload: string, ts: number, secret = SECRET): string { + const signed = `${ts}.${payload}`; + return createHmac('sha256', secret).update(signed).digest('hex'); +} + +describe('verifyWebhookSignature', () => { + it('accepts a valid signature with current timestamp', () => { + const payload = '{"event":"test"}'; + const ts = Math.floor(Date.now() / 1000); + const sig = sign(payload, ts); + const result = verifyWebhookSignature({ + payload, + signatureHeader: `t=${ts},v1=${sig}`, + secret: SECRET, + }); + expect(result.valid).toBe(true); + }); + + it('accepts Buffer payload', () => { + const payload = Buffer.from('{"event":"test"}', 'utf-8'); + const ts = Math.floor(Date.now() / 1000); + const sig = sign(payload.toString('utf-8'), ts); + const result = verifyWebhookSignature({ payload, signatureHeader: `t=${ts},v1=${sig}`, secret: SECRET }); + expect(result.valid).toBe(true); + }); + + it('rejects timestamp older than tolerance', () => { + const payload = '{}'; + const ts = Math.floor(Date.now() / 1000) - 600; // 10 minutes old + const sig = sign(payload, ts); + const result = verifyWebhookSignature({ + payload, + signatureHeader: `t=${ts},v1=${sig}`, + secret: SECRET, + toleranceSeconds: 300, + }); + expect(result.valid).toBe(false); + expect(result.reason).toBe('timestamp_too_old'); + }); + + it('rejects timestamp too far in the future', () => { + const payload = '{}'; + const ts = Math.floor(Date.now() / 1000) + 600; + const sig = sign(payload, ts); + const result = verifyWebhookSignature({ + payload, + signatureHeader: `t=${ts},v1=${sig}`, + secret: SECRET, + }); + expect(result.valid).toBe(false); + expect(result.reason).toBe('timestamp_in_future'); + }); + + it('rejects signature mismatch (wrong secret)', () => { + const payload = '{}'; + const ts = Math.floor(Date.now() / 1000); + const sig = sign(payload, ts, 'wrong_secret'); + const result = verifyWebhookSignature({ + payload, + signatureHeader: `t=${ts},v1=${sig}`, + secret: SECRET, + }); + expect(result.valid).toBe(false); + expect(result.reason).toBe('signature_mismatch'); + }); + + it('returns no_signatures for empty header', () => { + const result = verifyWebhookSignature({ payload: '{}', signatureHeader: '', secret: SECRET }); + expect(result.valid).toBe(false); + expect(result.reason).toBe('no_signatures'); + }); + + it('returns malformed_header for parts without =', () => { + const result = verifyWebhookSignature({ payload: '{}', signatureHeader: 'just_a_value', secret: SECRET }); + expect(result.valid).toBe(false); + expect(result.reason).toBe('malformed_header'); + }); + + it('returns no_timestamp when timestamp missing and tolerance > 0', () => { + const payload = '{}'; + const sig = createHmac('sha256', SECRET).update(payload).digest('hex'); + const result = verifyWebhookSignature({ payload, signatureHeader: `v1=${sig}`, secret: SECRET }); + expect(result.valid).toBe(false); + expect(result.reason).toBe('no_timestamp'); + }); + + it('skips timestamp check when toleranceSeconds=0 (raw HMAC)', () => { + const payload = '{"event":"test"}'; + const sig = createHmac('sha256', SECRET).update(payload).digest('hex'); + const result = verifyWebhookSignature({ + payload, + signatureHeader: `v1=${sig}`, + secret: SECRET, + toleranceSeconds: 0, + }); + expect(result.valid).toBe(true); + }); + + it('accepts multiple signatures and matches any', () => { + const payload = '{}'; + const ts = Math.floor(Date.now() / 1000); + const sigGood = sign(payload, ts); + const sigBad = createHmac('sha256', 'wrong').update(`${ts}.${payload}`).digest('hex'); + const result = verifyWebhookSignature({ + payload, + signatureHeader: `t=${ts},v1=${sigBad},v1=${sigGood}`, + secret: SECRET, + }); + expect(result.valid).toBe(true); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 55415ce..47c35a2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,8 @@ "outDir": "./dist", "rootDir": "./src", "skipLibCheck": true, - "forceConsistentCasingInFileNames": true + "forceConsistentCasingInFileNames": true, + "types": ["node"] }, "include": ["src"], "exclude": ["node_modules", "dist"] From dddfe3eaa4f32265e6c639883bd1cfc6d9d866bf Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Sun, 26 Apr 2026 01:08:41 -0700 Subject: [PATCH 18/28] docs(readme): add verifyWebhookSignature section Mirrors the same content surfaced in core/docs/integrations/typescript.mdx so README readers see the helper alongside the existing AgentScore API methods. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index f348fdb..057635a 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,23 @@ await client.associateWallet({ }); ``` +### Verify webhook signatures + +For merchants who receive HMAC-signed webhooks (Stripe-pattern `t=,v1=` header): + +```typescript +import { verifyWebhookSignature } from "@agent-score/sdk"; + +const result = verifyWebhookSignature({ + payload: rawRequestBody, // raw Buffer or string — capture before any JSON parse + signatureHeader: req.header("x-agentscore-signature") ?? "", + secret: process.env.AGENTSCORE_WEBHOOK_SECRET!, +}); +if (!result.valid) return res.status(400).json({ error: result.reason }); +``` + +`reason` distinguishes transient (`timestamp_too_old`, `timestamp_in_future`) from permanent (`signature_mismatch`, `no_signatures`, `malformed_header`) failures. Default tolerance 300s; pass `toleranceSeconds: 0` to skip timestamp checking for raw HMAC use cases. + ## Configuration | Option | Type | Default | Description | From b76a5af7231224266a1e222d083ca064eba94b67 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Sun, 26 Apr 2026 01:16:36 -0700 Subject: [PATCH 19/28] feat: add isAgentScoreTestAddress + AGENTSCORE_TEST_ADDRESSES MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Single canonical home for the seven reserved AgentScore EVM test fixtures (0x0000…0001 through 0x0000…0007). Lives in src/test-mode.ts and is re-exported from the package root. @agent-score/pay and @agent-score/mcp had near-identical copies of the same constants — they now re-export from here so the address list stays in sync with the AgentScore API spec across pay, mcp, commerce, and the SDKs themselves. Python parity ships in agentscore-py via agentscore.test_mode. 8 new tests, lint + typecheck + build all green. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/index.ts | 1 + src/test-mode.ts | 36 ++++++++++++++++++++++++++++++++++++ tests/test-mode.test.ts | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 src/test-mode.ts create mode 100644 tests/test-mode.test.ts diff --git a/src/index.ts b/src/index.ts index 65a9c58..c438ac8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -23,6 +23,7 @@ export { type VerifyWebhookSignatureInput, type VerifyWebhookSignatureResult, } from './webhooks'; +export { AGENTSCORE_TEST_ADDRESSES, isAgentScoreTestAddress } from './test-mode'; export * from './types'; declare const __VERSION__: string; diff --git a/src/test-mode.ts b/src/test-mode.ts new file mode 100644 index 0000000..13f44d7 --- /dev/null +++ b/src/test-mode.ts @@ -0,0 +1,36 @@ +/** + * Recognizers for AgentScore reserved test addresses. + * + * AgentScore's `/v1/assess` endpoint recognizes seven EVM addresses + * (`0x0000…0001` through `0x0000…0007`) as test fixtures with deterministic + * policy outcomes — KYC verified, sanctions clear, age gates passing — so dev/test + * interactions don't burn real KYC credits and produce predictable results. + * + * Use this in test suites and dev/staging tooling to label test-mode interactions + * distinctly from production traffic. + */ + +const TEST_ADDRESSES: ReadonlySet = new Set([ + '0x0000000000000000000000000000000000000001', + '0x0000000000000000000000000000000000000002', + '0x0000000000000000000000000000000000000003', + '0x0000000000000000000000000000000000000004', + '0x0000000000000000000000000000000000000005', + '0x0000000000000000000000000000000000000006', + '0x0000000000000000000000000000000000000007', +]); + +/** + * Returns true when the given EVM address is one of the AgentScore reserved test + * fixtures. Lowercases for comparison so accidentally mixed-case input still matches. + */ +export function isAgentScoreTestAddress(address: string | null | undefined): boolean { + if (!address) return false; + return TEST_ADDRESSES.has(address.toLowerCase()); +} + +/** + * The full list of reserved test addresses, exposed for documentation, completion, + * and downstream test fixtures. + */ +export const AGENTSCORE_TEST_ADDRESSES: readonly string[] = [...TEST_ADDRESSES]; diff --git a/tests/test-mode.test.ts b/tests/test-mode.test.ts new file mode 100644 index 0000000..e2c8819 --- /dev/null +++ b/tests/test-mode.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, it } from 'vitest'; +import { AGENTSCORE_TEST_ADDRESSES, isAgentScoreTestAddress } from '../src/test-mode'; + +describe('isAgentScoreTestAddress', () => { + it('returns true for each of the 7 reserved EVM addresses', () => { + for (let i = 1; i <= 7; i++) { + const addr = `0x${'0'.repeat(39)}${i}`; + expect(isAgentScoreTestAddress(addr)).toBe(true); + } + }); + + it('matches case-insensitively', () => { + expect(isAgentScoreTestAddress('0x0000000000000000000000000000000000000001'.toUpperCase())).toBe( + true, + ); + }); + + it('returns false for addresses outside the reserved range', () => { + expect(isAgentScoreTestAddress('0x0000000000000000000000000000000000000008')).toBe(false); + expect(isAgentScoreTestAddress('0xabcabcabcabcabcabcabcabcabcabcabcabcabca')).toBe(false); + }); + + it('returns false for null / undefined / empty', () => { + expect(isAgentScoreTestAddress(null)).toBe(false); + expect(isAgentScoreTestAddress(undefined)).toBe(false); + expect(isAgentScoreTestAddress('')).toBe(false); + }); +}); + +describe('AGENTSCORE_TEST_ADDRESSES', () => { + it('exports exactly 7 reserved addresses', () => { + expect(AGENTSCORE_TEST_ADDRESSES).toHaveLength(7); + }); + + it('every entry passes isAgentScoreTestAddress', () => { + for (const addr of AGENTSCORE_TEST_ADDRESSES) { + expect(isAgentScoreTestAddress(addr)).toBe(true); + } + }); +}); From 7a338668e79b81ffd59a6fbdcabf7e66defdd7e2 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Sun, 26 Apr 2026 04:02:50 -0700 Subject: [PATCH 20/28] test(coverage): cover retry-abort path in 429 retry handler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Function coverage was 92.3% (12/13) in src/index.ts because the retry-timer abort callback (line 181) was never exercised — existing 429 tests use a successful retry response. Adds a test where the retry itself hangs until the retry-timeout fires, exercising the retry AbortController path and bringing function coverage to 100%. Co-Authored-By: Claude Opus 4.7 (1M context) --- tests/index.test.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/index.test.ts b/tests/index.test.ts index ac59679..325d62c 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -648,4 +648,37 @@ describe('AgentScore.assess() — operatorToken', () => { await expect(client.getReputation(WALLET)).rejects.toThrow(AgentScoreError); expect(global.fetch).toHaveBeenCalledTimes(2); }); + + it('aborts the retry when the retry timer fires', async () => { + let callCount = 0; + global.fetch = vi.fn().mockImplementation((_url: string, init: RequestInit) => { + callCount += 1; + if (callCount === 1) { + return Promise.resolve({ + ok: false, + status: 429, + headers: new Headers({ 'retry-after': '0' }), + json: vi.fn().mockResolvedValueOnce({}), + } as unknown as Response); + } + return new Promise((_resolve, reject) => { + const signal = init.signal as AbortSignal; + signal.addEventListener('abort', () => { + reject(new DOMException('The operation was aborted', 'AbortError')); + }); + }); + }); + + const client = new AgentScore({ apiKey: API_KEY, timeout: 10 }); + + try { + await client.getReputation(WALLET); + expect.unreachable('should have thrown'); + } catch (e) { + expect(e).toBeInstanceOf(AgentScoreError); + const err = e as AgentScoreError; + expect(err.code).toBe('timeout'); + } + expect(callCount).toBe(2); + }); }); From 20569091e315551d62134db2f96510e8dfaabf34 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Sun, 26 Apr 2026 15:05:28 -0700 Subject: [PATCH 21/28] docs(types): replace 'legacy merchant override' with 'merchant-emitted alternative' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The denial-body type comments described two NextStepsAction values (regenerate_payment_from_linked_wallet, use_operator_token) as 'legacy merchant override' — but these are alternatives to the gate default, not legacy holdovers. Nothing has shipped yet that could have made one the predecessor of the other. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types.ts b/src/types.ts index d6e8687..79bf8ab 100644 --- a/src/types.ts +++ b/src/types.ts @@ -282,7 +282,7 @@ export interface WalletSignerMismatchBody { /** Structured action guidance. Present when the merchant overrides the gate default with * a custom `next_steps`. `action` may be any `NextStepsAction` — typically * `resign_or_switch_to_operator_token` (gate default) or - * `regenerate_payment_from_linked_wallet` (legacy merchant override). */ + * `regenerate_payment_from_linked_wallet` (a merchant-emitted alternative). */ next_steps?: { action: NextStepsAction; user_message?: string; @@ -306,7 +306,7 @@ export interface WalletAuthRequiresSigningBody { agent_instructions?: string; /** Structured action guidance. Present when the merchant overrides the gate default. * `action` is typically `switch_to_operator_token` (gate default) or `use_operator_token` - * (legacy merchant override). */ + * (a merchant-emitted alternative). */ next_steps?: { action: NextStepsAction; user_message?: string; From 3d134f128623b0773382a3242160af0dd6419f8d Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Sun, 26 Apr 2026 17:51:02 -0700 Subject: [PATCH 22/28] =?UTF-8?q?feat(types):=20promote=20inline=20shapes?= =?UTF-8?q?=20+=20rename=20CredentialListItem=20=E2=86=92=20CredentialItem?= =?UTF-8?q?=20for=20python=20parity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pure additive (plus one rename): - Network type promoted to a top-level export ('evm' | 'solana') - PolicyCheck, PolicyResult, PolicyExplanation extracted from inline AssessResponse shapes - SessionCreateNextSteps extracted from inline SessionCreateResponse.next_steps - CredentialCreateErrorNextSteps extracted from inline CredentialCreateErrorResponse.next_steps - CredentialListItem → CredentialItem (matches python-sdk; also updates the CredentialListResponse.credentials[] reference) Brings name-level parity with python-sdk so polyglot vendors don't have to remember two names for the same shape. No behavior change. No downstream consumers reference the old CredentialListItem name (verified across all repos). Co-Authored-By: Claude Opus 4.7 (1M context) --- src/types.ts | 79 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/src/types.ts b/src/types.ts index 79bf8ab..6b58f46 100644 --- a/src/types.ts +++ b/src/types.ts @@ -149,6 +149,27 @@ export interface AssessRequest { policy?: DecisionPolicy; } +export interface PolicyCheck { + rule: string; + passed: boolean; + required?: unknown; + actual?: unknown; +} + +export interface PolicyResult { + all_passed: boolean; + checks: PolicyCheck[]; +} + +export interface PolicyExplanation { + rule: string; + passed: boolean; + required: unknown; + actual: unknown; + message: string; + how_to_remedy: string | null; +} + export interface AssessResponse { decision: string | null; decision_reasons: string[]; @@ -161,25 +182,10 @@ export interface AssessResponse { * sign with to satisfy a wallet-auth claim. Capped at 100 entries. */ linked_wallets?: string[]; verify_url?: string; - policy_result?: { - all_passed: boolean; - checks: Array<{ - rule: string; - passed: boolean; - required?: unknown; - actual?: unknown; - }>; - } | null; + policy_result?: PolicyResult | null; on_the_fly: boolean; updated_at: string | null; - explanation?: Array<{ - rule: string; - passed: boolean; - required: unknown; - actual: unknown; - message: string; - how_to_remedy: string | null; - }>; + explanation?: PolicyExplanation[]; } export interface AgentScoreErrorBody { @@ -363,6 +369,14 @@ export interface SessionCreateOptions { product_name?: string; } +export interface SessionCreateNextSteps { + action: NextStepsAction; + poll_interval_seconds?: number; + poll_secret_header?: string; + steps?: string[]; + user_message?: string; +} + export interface SessionCreateResponse { session_id: string; poll_secret: string; @@ -371,13 +385,7 @@ export interface SessionCreateResponse { expires_at: string; /** Structured `next_steps.action: 'deliver_verify_url_and_poll'` with step-by-step * instructions for consuming the session. */ - next_steps?: { - action: NextStepsAction; - poll_interval_seconds?: number; - poll_secret_header?: string; - steps?: string[]; - user_message?: string; - }; + next_steps?: SessionCreateNextSteps; /** Cross-merchant memory hint for agents on first session creation. */ agent_memory?: AgentMemoryHint; } @@ -419,19 +427,21 @@ export interface CredentialCreateResponse { agent_memory?: AgentMemoryHint; } +export interface CredentialCreateErrorNextSteps { + action: NextStepsAction; + user_message: string; +} + export interface CredentialCreateErrorResponse { error: { code: 'kyc_required'; message: string; }; verify_url: string; - next_steps: { - action: NextStepsAction; - user_message: string; - }; + next_steps: CredentialCreateErrorNextSteps; } -export interface CredentialListItem { +export interface CredentialItem { id: string; prefix: string; label: string | null; @@ -451,7 +461,7 @@ export interface AccountVerification { } export interface CredentialListResponse { - credentials: CredentialListItem[]; + credentials: CredentialItem[]; account_verification: AccountVerification; } @@ -460,15 +470,18 @@ export interface CredentialRevokeResponse { revoked: true; } +/** Key-derivation family. EVM EOAs share identity across every EVM chain (Base, Tempo, + * Ethereum, …) so `'evm'` covers them all. Use `'solana'` for Solana addresses. */ +export type Network = 'evm' | 'solana'; + export interface AssociateWalletOptions { /** Operator credential (opc_...) that the agent authenticated with on the gated endpoint. */ operatorToken: string; /** The signer wallet recovered from the payment payload — EVM `from` from EIP-3009 for x402, * the `did:pkh` address for Tempo MPP, or a Solana base58 pubkey. */ walletAddress: string; - /** Key-derivation family. EVM EOAs share identity across every EVM chain (Base, Tempo, - * Ethereum, …) so `"evm"` covers them all. Use `"solana"` for Solana addresses. */ - network: 'evm' | 'solana'; + /** Key-derivation family — see {@link Network}. */ + network: Network; /** Optional stable key for the logical payment (e.g., Stripe PI id, x402 tx hash). When the * same key is seen again for the same (credential, wallet, network), the server no-ops — * `transaction_count` isn't inflated by agent retries. */ From 03651a580f8fe5febbc9e32899528340fc8cb418 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Sun, 26 Apr 2026 22:54:52 -0700 Subject: [PATCH 23/28] chore(deps): add lefthook devDep + prepare script for auto-install Pre-commit eslint + pre-push typecheck were configured in lefthook.yml but contributors had to manually run \`bunx lefthook install\` per clone. Adding lefthook to devDeps + a \`prepare\` script means \`bun install\` wires the hooks automatically. Co-Authored-By: Claude Opus 4.7 (1M context) --- bun.lock | 23 +++++++++++++++++++++++ package.json | 2 ++ 2 files changed, 25 insertions(+) diff --git a/bun.lock b/bun.lock index 7daa945..f86d072 100644 --- a/bun.lock +++ b/bun.lock @@ -12,6 +12,7 @@ "eslint": "^9.39.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-unused-imports": "^4.4.1", + "lefthook": "^2.1.6", "tsup": "^8.5.1", "typescript": "^6.0.3", "typescript-eslint": "^8.59.0", @@ -546,6 +547,28 @@ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + "lefthook": ["lefthook@2.1.6", "", { "optionalDependencies": { "lefthook-darwin-arm64": "2.1.6", "lefthook-darwin-x64": "2.1.6", "lefthook-freebsd-arm64": "2.1.6", "lefthook-freebsd-x64": "2.1.6", "lefthook-linux-arm64": "2.1.6", "lefthook-linux-x64": "2.1.6", "lefthook-openbsd-arm64": "2.1.6", "lefthook-openbsd-x64": "2.1.6", "lefthook-windows-arm64": "2.1.6", "lefthook-windows-x64": "2.1.6" }, "bin": { "lefthook": "bin/index.js" } }, "sha512-w9sBoR0mdN+kJc3SB85VzpiAAl451/rxdCRcZlwW71QLjkeH3EBQFgc4VMj5apePychYDHAlqEWTB8J8JK/j1Q=="], + + "lefthook-darwin-arm64": ["lefthook-darwin-arm64@2.1.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hyB7eeiX78BS66f70byTJacDLC/xV1vgMv9n+idFUsrM7J3Udd/ag9Ag5NP3t0eN0EqQqAtrNnt35EH01lxnRQ=="], + + "lefthook-darwin-x64": ["lefthook-darwin-x64@2.1.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-5Ka6cFxiH83krt+OMRQtmS6zqoZR5SLXSudLjTbZA1c3ZqF0+dqkeb4XcB6plx6WR0GFizabuc6Bi3iXPIe1eQ=="], + + "lefthook-freebsd-arm64": ["lefthook-freebsd-arm64@2.1.6", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-VswyOg5CVN3rMaOJ2HtnkltiMKgFHW/wouWxXsV8RxSa4tgWOKxM0EmSXi8qc2jX+LRga6B0uOY6toXS01zWxA=="], + + "lefthook-freebsd-x64": ["lefthook-freebsd-x64@2.1.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-vXsCUFYuVwrVWwcypB7Zt2Hf+5pl1V1la7ZfvGYZaTRURu0zF/XUnMF/nOz/PebGv0f4x/iOWXWwP7E42xRWsg=="], + + "lefthook-linux-arm64": ["lefthook-linux-arm64@2.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-WDJiQhJdZOvKORZd+kF/ms2l6NSsXzdA9ahflyr65V90AC4jES223W8VtEMbGPUtHuGWMEZ/v/XvwlWv0Ioz9g=="], + + "lefthook-linux-x64": ["lefthook-linux-x64@2.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-C18nCd7nTX1AVL4TcvwMmLAO1VI1OuGluIOTjiPkBQ746Ls1HhL5rl//jMPACmT28YmxIQJ2ZcLPNmhvEVBZvw=="], + + "lefthook-openbsd-arm64": ["lefthook-openbsd-arm64@2.1.6", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-mZOMxM8HiPxVFXDO3PtCUbH4GB8rkveXhsgXF27oAZTYVzQ3gO9vT6r/pxit6msqRXz3fvcwimLVJgb8eRsa8A=="], + + "lefthook-openbsd-x64": ["lefthook-openbsd-x64@2.1.6", "", { "os": "openbsd", "cpu": "x64" }, "sha512-sG9ALLZSnnMOfXu+B7SmxFhJhuoAh4bqi5En5aaHJET48TqrLOcWWZuH+7ArFM6gr/U5KfSUvdmHFmY8WqCcIg=="], + + "lefthook-windows-arm64": ["lefthook-windows-arm64@2.1.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-lD8yFWY4Csuljd0Rqs7EQaySC0VvDf7V3rN1FhRMUISTRDHutebIom1Loc8ckQPvKYGC6mftT9k0GvipsS+Brw=="], + + "lefthook-windows-x64": ["lefthook-windows-x64@2.1.6", "", { "os": "win32", "cpu": "x64" }, "sha512-q4z2n3xucLscoWiyMwFViEj3N8MDSkPulMwcJYuCYFHoPhP1h+icqNu7QRLGYj6AnVrCQweiUJY3Tb2X+GbD/A=="], + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], diff --git a/package.json b/package.json index ada80f7..778bb61 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "lint:fix": "eslint . --fix", "test": "vitest run", "typecheck": "tsc --noEmit", + "prepare": "lefthook install", "prepublishOnly": "bun run build" }, "keywords": [ @@ -57,6 +58,7 @@ "eslint": "^9.39.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-unused-imports": "^4.4.1", + "lefthook": "^2.1.6", "tsup": "^8.5.1", "typescript": "^6.0.3", "typescript-eslint": "^8.59.0", From 75ba3943f35c977dc5e4bb8a970db8aa8410ccf8 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Mon, 27 Apr 2026 00:05:16 -0700 Subject: [PATCH 24/28] feat(sdk): preserve response-body fields on AgentScoreError + accept identity hints on createSession MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two non-breaking additions that unblock SDK consumption from mcp's tool layer: 1. AgentScoreError now carries a `details: Record` field populated from non-`error` keys of the response body. Consumers can branch on `verify_url`, `linked_wallets`, `claimed_operator`, `actual_signer`, `reasons`, etc. for granular denial recovery — previously the SDK dropped them and only surfaced `code` + `message`. Defaults to `{}` so existing constructor calls keep working. 2. SessionCreateOptions accepts optional `address` + `operator_token` so a session can be pre-associated with a known wallet or be a KYC refresh for an existing `opc_...`. The `/v1/sessions` API has accepted these all along; the SDK was just not forwarding them. Coverage stays at 96.5/91.86/100/98.27 (Tier A bar 95/90/95/95). Co-Authored-By: Claude Opus 4.7 (1M context) --- src/errors.ts | 7 ++++++- src/index.ts | 11 +++++++++-- src/types.ts | 4 ++++ tests/errors.test.ts | 15 +++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/errors.ts b/src/errors.ts index d2a1f0d..a9b6778 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -1,12 +1,17 @@ export class AgentScoreError extends Error { public readonly code: string; public readonly status: number; + // Response-body fields beyond `error.{code,message}` — e.g. verify_url, linked_wallets, + // claimed_operator, actual_signer, reasons. Consumers branch on these for granular + // recovery (see mcp's denial-code rendering for the canonical use). + public readonly details: Record; - constructor(code: string, message: string, status: number) { + constructor(code: string, message: string, status: number, details: Record = {}) { super(message); Object.setPrototypeOf(this, new.target.prototype); this.name = 'AgentScoreError'; this.code = code; this.status = status; + this.details = details; } } diff --git a/src/index.ts b/src/index.ts index c438ac8..19f01fd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -80,6 +80,8 @@ export class AgentScore { const body: Record = {}; if (options?.context) body.context = options.context; if (options?.product_name) body.product_name = options.product_name; + if (options?.address) body.address = options.address; + if (options?.operator_token) body.operator_token = options.operator_token; return this.request('/v1/sessions', { method: 'POST', @@ -192,18 +194,23 @@ export class AgentScore { if (!response.ok) { let code = 'unknown_error'; let message = `Request failed with status ${response.status}`; + let details: Record = {}; try { - const body = (await response.json()) as AgentScoreErrorBody; + const body = (await response.json()) as AgentScoreErrorBody & Record; if (body?.error) { code = body.error.code; message = body.error.message; } + // Preserve everything except the parsed `error` block so consumers can read + // verify_url, linked_wallets, reasons, etc. for granular denial recovery. + const { error: _omit, ...rest } = body; + details = rest; } catch { // Use defaults } - throw new AgentScoreError(code, message, response.status); + throw new AgentScoreError(code, message, response.status, details); } return (await response.json()) as T; diff --git a/src/types.ts b/src/types.ts index 6b58f46..0ebca12 100644 --- a/src/types.ts +++ b/src/types.ts @@ -367,6 +367,10 @@ export interface AssessOptions { export interface SessionCreateOptions { context?: string; product_name?: string; + /** Pre-associate the session with a known wallet (EVM `0x...` or Solana base58). */ + address?: string; + /** Pre-associate the session with an existing operator credential — e.g. refresh KYC for an `opc_...`. */ + operator_token?: string; } export interface SessionCreateNextSteps { diff --git a/tests/errors.test.ts b/tests/errors.test.ts index 9a2c3ef..f08a261 100644 --- a/tests/errors.test.ts +++ b/tests/errors.test.ts @@ -31,4 +31,19 @@ describe('AgentScoreError', () => { const err = new AgentScoreError('rate_limited', 'Too many requests', 429); expect(err.message).toBe('Too many requests'); }); + + it('defaults details to an empty object when omitted', () => { + const err = new AgentScoreError('not_found', 'Not found', 404); + expect(err.details).toEqual({}); + }); + + it('preserves response-body fields beyond {code, message} for granular recovery', () => { + const err = new AgentScoreError('wallet_signer_mismatch', 'Signer mismatch', 403, { + claimed_operator: 'op_abc', + actual_signer: '0xdef', + linked_wallets: ['0xabc', '0xdef'], + }); + expect(err.details.claimed_operator).toBe('op_abc'); + expect(err.details.linked_wallets).toEqual(['0xabc', '0xdef']); + }); }); From ea422ccb1edcf226cf50537ac4668fb72371ace7 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Mon, 27 Apr 2026 00:23:24 -0700 Subject: [PATCH 25/28] =?UTF-8?q?feat(sdk)!:=20drop=20verifyWebhookSignatu?= =?UTF-8?q?re=20=E2=80=94=20AgentScore=20emits=20no=20webhooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes the speculative HMAC-SHA256 webhook verifier (Stripe-pattern): - src/webhooks.ts (113 LOC) — deleted - tests/webhooks.test.ts — deleted - src/index.ts — webhook re-exports removed - README.md — webhook section scrubbed Audit findings: zero outbound webhook emitter in core/api, zero internal consumers across mcp/pay/commerce/martin-estate, no API endpoint signs anything. The only webhook code in the codebase is the inbound-from-Stripe Identity handler in core/website (uses stripe.webhooks.constructEvent, not this lib). Removing now is risk-free: SDKs haven't published 1.9.0 yet, so no external consumers can have adopted this. When AgentScore eventually ships outbound events (score-changed, KYC-completed, etc.), the right move is the official Standard Webhooks lib (standardwebhooks on npm + PyPI — Svix interop spec) rather than re-rolling our own format. Marked breaking (!) since the public surface shrinks, but practically this is a no-op for anyone tracking the unpublished 1.9.0 line. Coverage stays at 97.16/91.22/100/98.85 (Tier A bar 95/90/95/95). Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 17 ------ src/index.ts | 5 -- src/webhooks.ts | 113 --------------------------------------- tests/webhooks.test.ts | 117 ----------------------------------------- 4 files changed, 252 deletions(-) delete mode 100644 src/webhooks.ts delete mode 100644 tests/webhooks.test.ts diff --git a/README.md b/README.md index 057635a..f348fdb 100644 --- a/README.md +++ b/README.md @@ -103,23 +103,6 @@ await client.associateWallet({ }); ``` -### Verify webhook signatures - -For merchants who receive HMAC-signed webhooks (Stripe-pattern `t=,v1=` header): - -```typescript -import { verifyWebhookSignature } from "@agent-score/sdk"; - -const result = verifyWebhookSignature({ - payload: rawRequestBody, // raw Buffer or string — capture before any JSON parse - signatureHeader: req.header("x-agentscore-signature") ?? "", - secret: process.env.AGENTSCORE_WEBHOOK_SECRET!, -}); -if (!result.valid) return res.status(400).json({ error: result.reason }); -``` - -`reason` distinguishes transient (`timestamp_too_old`, `timestamp_in_future`) from permanent (`signature_mismatch`, `no_signatures`, `malformed_header`) failures. Default tolerance 300s; pass `toleranceSeconds: 0` to skip timestamp checking for raw HMAC use cases. - ## Configuration | Option | Type | Default | Description | diff --git a/src/index.ts b/src/index.ts index 19f01fd..c0fd353 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,11 +18,6 @@ import type { } from './types'; export { AgentScoreError } from './errors'; -export { - verifyWebhookSignature, - type VerifyWebhookSignatureInput, - type VerifyWebhookSignatureResult, -} from './webhooks'; export { AGENTSCORE_TEST_ADDRESSES, isAgentScoreTestAddress } from './test-mode'; export * from './types'; diff --git a/src/webhooks.ts b/src/webhooks.ts deleted file mode 100644 index ef020f3..0000000 --- a/src/webhooks.ts +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Webhook signature verification — HMAC-SHA256 based, Stripe-pattern. - * - * Use this when AgentScore (or any service that signs outbound webhooks with this - * convention) sends a webhook to your endpoint. Validates the `X-AgentScore-Signature` - * (or compatible) header before trusting the payload. - * - * Generic enough to cover any HMAC-signed webhook source: pass the right secret + header - * name. Tolerant of multiple signature versions in the same header (Stripe `t=...,v1=...` - * style supported via the `prefixSeparator` parsing option). - */ - -import { createHmac, timingSafeEqual } from 'crypto'; - -export interface VerifyWebhookSignatureInput { - /** Raw request body (string or Buffer). MUST be the unparsed body — even one byte of - * re-serialization breaks the signature. Capture before any JSON parse. */ - payload: string | Buffer; - /** Value of the signature header from the incoming request. */ - signatureHeader: string; - /** The shared secret the sender uses to sign. Per-merchant when AgentScore eventually - * ships webhooks; otherwise whatever the upstream provider issued. */ - secret: string; - /** Tolerance in seconds for timestamp-replay protection. Default 300 (5 min) per - * Stripe convention. Set to 0 to disable timestamp checking. */ - toleranceSeconds?: number; - /** Override the timestamp parameter name in the header. Default `t`. */ - timestampKey?: string; - /** Override the signature parameter name. Default `v1`. Stripe v1 uses HMAC-SHA256. */ - signatureKey?: string; -} - -export interface VerifyWebhookSignatureResult { - valid: boolean; - /** Reason the verification failed; only set when `valid: false`. */ - reason?: 'no_signatures' | 'no_timestamp' | 'timestamp_too_old' | 'timestamp_in_future' | 'signature_mismatch' | 'malformed_header'; -} - -/** - * Verify an HMAC-SHA256 signed webhook signature. Stripe-compatible header format: - * `t=,v1=` - * - * The signed payload is `${timestamp}.${rawBody}`. Returns `{ valid: false, reason }` - * for any failure path so callers can differentiate transient (timestamp drift) from - * permanent (mismatch) failures. - * - * Example: - * ```ts - * app.post('/webhooks/agentscore', express.raw({ type: 'application/json' }), (req, res) => { - * const result = verifyWebhookSignature({ - * payload: req.body, // raw Buffer - * signatureHeader: req.header('x-agentscore-signature') ?? '', - * secret: process.env.AGENTSCORE_WEBHOOK_SECRET!, - * }); - * if (!result.valid) return res.status(400).json({ error: result.reason }); - * const event = JSON.parse(req.body.toString()); - * // ... handle event ... - * }); - * ``` - */ -export function verifyWebhookSignature(input: VerifyWebhookSignatureInput): VerifyWebhookSignatureResult { - const tolerance = input.toleranceSeconds ?? 300; - const tsKey = input.timestampKey ?? 't'; - const sigKey = input.signatureKey ?? 'v1'; - - const parts = input.signatureHeader.split(',').map((p) => p.trim()).filter(Boolean); - if (parts.length === 0) return { valid: false, reason: 'no_signatures' }; - - const params = new Map(); - for (const p of parts) { - const eq = p.indexOf('='); - if (eq < 0) return { valid: false, reason: 'malformed_header' }; - const key = p.slice(0, eq); - const value = p.slice(eq + 1); - const list = params.get(key) ?? []; - list.push(value); - params.set(key, list); - } - - const timestampStr = params.get(tsKey)?.[0]; - if (tolerance > 0) { - if (!timestampStr) return { valid: false, reason: 'no_timestamp' }; - const ts = Number(timestampStr); - if (!Number.isFinite(ts)) return { valid: false, reason: 'no_timestamp' }; - const nowSec = Math.floor(Date.now() / 1000); - if (ts < nowSec - tolerance) return { valid: false, reason: 'timestamp_too_old' }; - if (ts > nowSec + tolerance) return { valid: false, reason: 'timestamp_in_future' }; - } - - const signatures = params.get(sigKey) ?? []; - if (signatures.length === 0) return { valid: false, reason: 'no_signatures' }; - - const payloadBuffer = typeof input.payload === 'string' ? Buffer.from(input.payload, 'utf-8') : input.payload; - const signedPayload = timestampStr - ? Buffer.concat([Buffer.from(`${timestampStr}.`, 'utf-8'), payloadBuffer]) - : payloadBuffer; - - const expectedHex = createHmac('sha256', input.secret).update(signedPayload).digest('hex'); - const expectedBuf = Buffer.from(expectedHex, 'hex'); - - for (const sigHex of signatures) { - let actualBuf: Buffer; - try { - actualBuf = Buffer.from(sigHex, 'hex'); - } catch { - continue; - } - if (actualBuf.length !== expectedBuf.length) continue; - if (timingSafeEqual(actualBuf, expectedBuf)) return { valid: true }; - } - - return { valid: false, reason: 'signature_mismatch' }; -} diff --git a/tests/webhooks.test.ts b/tests/webhooks.test.ts deleted file mode 100644 index 5c6d6f1..0000000 --- a/tests/webhooks.test.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { createHmac } from 'crypto'; -import { describe, expect, it } from 'vitest'; -import { verifyWebhookSignature } from '../src/webhooks'; - -const SECRET = 'whsec_testsecret'; - -function sign(payload: string, ts: number, secret = SECRET): string { - const signed = `${ts}.${payload}`; - return createHmac('sha256', secret).update(signed).digest('hex'); -} - -describe('verifyWebhookSignature', () => { - it('accepts a valid signature with current timestamp', () => { - const payload = '{"event":"test"}'; - const ts = Math.floor(Date.now() / 1000); - const sig = sign(payload, ts); - const result = verifyWebhookSignature({ - payload, - signatureHeader: `t=${ts},v1=${sig}`, - secret: SECRET, - }); - expect(result.valid).toBe(true); - }); - - it('accepts Buffer payload', () => { - const payload = Buffer.from('{"event":"test"}', 'utf-8'); - const ts = Math.floor(Date.now() / 1000); - const sig = sign(payload.toString('utf-8'), ts); - const result = verifyWebhookSignature({ payload, signatureHeader: `t=${ts},v1=${sig}`, secret: SECRET }); - expect(result.valid).toBe(true); - }); - - it('rejects timestamp older than tolerance', () => { - const payload = '{}'; - const ts = Math.floor(Date.now() / 1000) - 600; // 10 minutes old - const sig = sign(payload, ts); - const result = verifyWebhookSignature({ - payload, - signatureHeader: `t=${ts},v1=${sig}`, - secret: SECRET, - toleranceSeconds: 300, - }); - expect(result.valid).toBe(false); - expect(result.reason).toBe('timestamp_too_old'); - }); - - it('rejects timestamp too far in the future', () => { - const payload = '{}'; - const ts = Math.floor(Date.now() / 1000) + 600; - const sig = sign(payload, ts); - const result = verifyWebhookSignature({ - payload, - signatureHeader: `t=${ts},v1=${sig}`, - secret: SECRET, - }); - expect(result.valid).toBe(false); - expect(result.reason).toBe('timestamp_in_future'); - }); - - it('rejects signature mismatch (wrong secret)', () => { - const payload = '{}'; - const ts = Math.floor(Date.now() / 1000); - const sig = sign(payload, ts, 'wrong_secret'); - const result = verifyWebhookSignature({ - payload, - signatureHeader: `t=${ts},v1=${sig}`, - secret: SECRET, - }); - expect(result.valid).toBe(false); - expect(result.reason).toBe('signature_mismatch'); - }); - - it('returns no_signatures for empty header', () => { - const result = verifyWebhookSignature({ payload: '{}', signatureHeader: '', secret: SECRET }); - expect(result.valid).toBe(false); - expect(result.reason).toBe('no_signatures'); - }); - - it('returns malformed_header for parts without =', () => { - const result = verifyWebhookSignature({ payload: '{}', signatureHeader: 'just_a_value', secret: SECRET }); - expect(result.valid).toBe(false); - expect(result.reason).toBe('malformed_header'); - }); - - it('returns no_timestamp when timestamp missing and tolerance > 0', () => { - const payload = '{}'; - const sig = createHmac('sha256', SECRET).update(payload).digest('hex'); - const result = verifyWebhookSignature({ payload, signatureHeader: `v1=${sig}`, secret: SECRET }); - expect(result.valid).toBe(false); - expect(result.reason).toBe('no_timestamp'); - }); - - it('skips timestamp check when toleranceSeconds=0 (raw HMAC)', () => { - const payload = '{"event":"test"}'; - const sig = createHmac('sha256', SECRET).update(payload).digest('hex'); - const result = verifyWebhookSignature({ - payload, - signatureHeader: `v1=${sig}`, - secret: SECRET, - toleranceSeconds: 0, - }); - expect(result.valid).toBe(true); - }); - - it('accepts multiple signatures and matches any', () => { - const payload = '{}'; - const ts = Math.floor(Date.now() / 1000); - const sigGood = sign(payload, ts); - const sigBad = createHmac('sha256', 'wrong').update(`${ts}.${payload}`).digest('hex'); - const result = verifyWebhookSignature({ - payload, - signatureHeader: `t=${ts},v1=${sigBad},v1=${sigGood}`, - secret: SECRET, - }); - expect(result.valid).toBe(true); - }); -}); From bf63ba23a62aea69431edcdd08d96536ba04f53a Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Mon, 27 Apr 2026 00:51:42 -0700 Subject: [PATCH 26/28] docs(readme): document AgentScoreError.details + createSession identity hints MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two unstaged additions from this session were missing README coverage: 1. AgentScoreError.details — node-sdk + python-sdk parity. Carries response- body fields beyond {code, message} (verify_url, linked_wallets, claimed_operator, actual_signer, expected_signer, reasons, agent_memory). New example shows branching on wallet_signer_mismatch and token_expired. 2. createSession({address, operator_token}) — optional pre-association of the session with a known wallet or existing opc_... (KYC refresh). Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index f348fdb..a29ceb6 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,11 @@ const status = await client.pollSession(session.session_id, session.poll_secret) if (status.status === "verified") { console.log(status.operator_token); // "opc_..." — use for future requests } + +// Optional pre-association: attach the session to a known wallet or refresh KYC +// for an existing operator credential. +await client.createSession({ address: "0x..." }); +await client.createSession({ operator_token: "opc_..." }); // KYC refresh ``` ### Wallet resolution @@ -126,6 +131,23 @@ try { } ``` +`AgentScoreError.details` carries the rest of the response body — `verify_url`, `linked_wallets`, `claimed_operator`, `actual_signer`, `expected_signer`, `reasons`, `agent_memory` — so callers can branch on granular denial codes without re-parsing: + +```typescript +try { + await client.assess("0xabc...", { policy: { require_kyc: true } }); +} catch (err) { + if (!(err instanceof AgentScoreError)) throw err; + if (err.code === "wallet_signer_mismatch") { + const linked = err.details.linked_wallets as string[] | undefined; + console.log("Re-sign from one of:", linked); + } + if (err.code === "token_expired") { + console.log("Verify at:", err.details.verify_url); + } +} +``` + ## Documentation - [API Reference](https://docs.agentscore.sh) From 0f47bcc8ca40b27a7d781c746bea26d07d20c9f1 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Mon, 27 Apr 2026 01:27:29 -0700 Subject: [PATCH 27/28] chore(release): bump to 2.0.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The wallet-auth-hardening line ships with breaking surface changes: - verifyWebhookSignature removed - (other coordinated trims documented in commit history) Honest semver — bumping from 1.8.0 to 2.0.0 instead of 1.9.0. Test describe block renamed away from a version-coupled name; backward-compat comments scrubbed of the 1.9.0 reference (per house style: don't tag code with "added in vX.Y" — version history lives in git/CHANGELOG). Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 2 +- tests/types.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 778bb61..cd0eb5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@agent-score/sdk", - "version": "1.9.0", + "version": "2.0.0", "description": "TypeScript client for the AgentScore trust and reputation API", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/tests/types.test.ts b/tests/types.test.ts index 125dc34..81cb222 100644 --- a/tests/types.test.ts +++ b/tests/types.test.ts @@ -13,7 +13,7 @@ import type { // body types. Runtime assertions exist only to give vitest something to execute; the real // verification is that the file type-checks. -describe('1.9.0 types', () => { +describe('wallet-auth hardening types', () => { it('accepts all new DenialCode values', () => { const codes: DenialCode[] = [ 'operator_verification_required', @@ -36,7 +36,7 @@ describe('1.9.0 types', () => { 'continue_polling', 'retry_merchant_request_with_operator_token', 'use_stored_operator_token', - // Backward-compat: pre-1.9.0 actions still present. + // Backward-compat: prior actions still present. 'use_operator_token', 'regenerate_payment_from_linked_wallet', 'poll_for_credential', From b412e2a0b18c078f3825ab597418efd49243b400 Mon Sep 17 00:00:00 2001 From: vvillait88 Date: Tue, 28 Apr 2026 19:42:57 -0700 Subject: [PATCH 28/28] =?UTF-8?q?chore:=20bump=20typescript-eslint=208.59.?= =?UTF-8?q?0=E2=86=928.59.1=20(patch)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- bun.lock | 84 +++++++++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/bun.lock b/bun.lock index f86d072..3a7c4eb 100644 --- a/bun.lock +++ b/bun.lock @@ -15,7 +15,7 @@ "lefthook": "^2.1.6", "tsup": "^8.5.1", "typescript": "^6.0.3", - "typescript-eslint": "^8.59.0", + "typescript-eslint": "^8.59.1", "vitest": "^4.1.5", }, }, @@ -231,21 +231,21 @@ "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.59.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/type-utils": "8.59.0", "@typescript-eslint/utils": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.59.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.59.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.59.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.59.1", "@typescript-eslint/types": "8.59.1", "@typescript-eslint/typescript-estree": "8.59.1", "@typescript-eslint/visitor-keys": "8.59.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.59.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.59.0", "@typescript-eslint/types": "^8.59.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.59.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.59.1", "@typescript-eslint/types": "^8.59.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg=="], "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0" } }, "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.59.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.59.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA=="], "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0", "@typescript-eslint/utils": "8.59.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.59.0", "", {}, "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.59.1", "", {}, "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.59.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.59.0", "@typescript-eslint/tsconfig-utils": "8.59.0", "@typescript-eslint/types": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.59.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.59.1", "@typescript-eslint/tsconfig-utils": "8.59.1", "@typescript-eslint/types": "8.59.1", "@typescript-eslint/visitor-keys": "8.59.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.59.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.59.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.59.1", "@typescript-eslint/types": "8.59.1", "@typescript-eslint/typescript-estree": "8.59.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA=="], "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.0", "", { "dependencies": { "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q=="], @@ -787,7 +787,7 @@ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], - "typescript-eslint": ["typescript-eslint@8.59.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.59.0", "@typescript-eslint/parser": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0", "@typescript-eslint/utils": "8.59.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw=="], + "typescript-eslint": ["typescript-eslint@8.59.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.59.1", "@typescript-eslint/parser": "8.59.1", "@typescript-eslint/typescript-estree": "8.59.1", "@typescript-eslint/utils": "8.59.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ=="], "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], @@ -819,12 +819,32 @@ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.59.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "@typescript-eslint/visitor-keys": "8.59.1" } }, "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg=="], + + "@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg=="], + + "@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.59.0", "", {}, "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A=="], + + "@typescript-eslint/type-utils/@typescript-eslint/types": ["@typescript-eslint/types@8.59.0", "", {}, "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.59.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.59.0", "@typescript-eslint/tsconfig-utils": "8.59.0", "@typescript-eslint/types": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw=="], + + "@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.59.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.59.0", "@typescript-eslint/types": "8.59.0", "@typescript-eslint/typescript-estree": "8.59.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g=="], + + "@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + "@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "@typescript-eslint/visitor-keys": "8.59.1" } }, "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg=="], + + "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.59.0", "", {}, "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A=="], + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -837,10 +857,58 @@ "make-dir/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + "typescript-eslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.59.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.59.1", "@typescript-eslint/type-utils": "8.59.1", "@typescript-eslint/utils": "8.59.1", "@typescript-eslint/visitor-keys": "8.59.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.59.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag=="], + "vitest/tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="], + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.59.0", "", {}, "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.59.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.59.0", "@typescript-eslint/tsconfig-utils": "8.59.0", "@typescript-eslint/types": "8.59.0", "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw=="], + + "@typescript-eslint/parser/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.59.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.59.0", "@typescript-eslint/types": "^8.59.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.59.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], + "@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "@typescript-eslint/visitor-keys": "8.59.1" } }, "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "@typescript-eslint/typescript-estree": "8.59.1", "@typescript-eslint/utils": "8.59.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.59.1", "", { "dependencies": { "@typescript-eslint/types": "8.59.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.59.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.59.0", "@typescript-eslint/types": "^8.59.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.59.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + + "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], } } diff --git a/package.json b/package.json index cd0eb5e..bcefb3a 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "lefthook": "^2.1.6", "tsup": "^8.5.1", "typescript": "^6.0.3", - "typescript-eslint": "^8.59.0", + "typescript-eslint": "^8.59.1", "vitest": "^4.1.5" } }