agent-shim 8.19.0 → 8.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/cli.cjs +276 -98
- package/dist/index.cjs +289 -130
- package/dist/index.mjs +289 -130
- package/dist/types/index.d.ts +49 -8
- package/package.json +2 -2
package/dist/types/index.d.ts
CHANGED
|
@@ -354,9 +354,25 @@ declare const ConfigProfileSchema: z.ZodObject<{
|
|
|
354
354
|
type ConfigProfile = z.infer<typeof ConfigProfileSchema>;
|
|
355
355
|
/** A pool's own name: the identity alphabet minus `@`, since a pool is never an email address. */
|
|
356
356
|
declare const PoolNameSchema: z.ZodString;
|
|
357
|
-
/**
|
|
357
|
+
/** How a pool chooses the member a launch runs as: "score" by remaining quota, "listed" in the order the pool names its members. */
|
|
358
|
+
declare const PoolPreferenceSchema: z.ZodEnum<{
|
|
359
|
+
score: "score";
|
|
360
|
+
listed: "listed";
|
|
361
|
+
}>;
|
|
362
|
+
type PoolPreference = z.infer<typeof PoolPreferenceSchema>;
|
|
363
|
+
/**
|
|
364
|
+
* A named, explicit set of identities to choose among at launch. Never implicit: a pool lists its members, so an identity that bills a client is only ever picked when someone put it there.
|
|
365
|
+
*
|
|
366
|
+
* A member entry may name another pool (`pool:<name>`), which is ranked with its own preference and contributes its pick at the entry's position; see `PoolMemberSchema`. The graph must stay acyclic, which `pool add`/`pool set` enforce and `doctor` re-checks.
|
|
367
|
+
*
|
|
368
|
+
* `preference` decides how the member is chosen, and an absent field means "score". "score" ranks members by plan-size-weighted remaining quota per hour until reset, so the quota closest to expiring is spent first (use-it-or-lose-it). "listed" ranks members strictly in the order the pool lists them, skipping only a member that is currently refused, so a pool can pin one identity first and fall back to the others only while that one is refused.
|
|
369
|
+
*/
|
|
358
370
|
declare const PoolSchema: z.ZodObject<{
|
|
359
371
|
identities: z.ZodArray<z.ZodString>;
|
|
372
|
+
preference: z.ZodOptional<z.ZodEnum<{
|
|
373
|
+
score: "score";
|
|
374
|
+
listed: "listed";
|
|
375
|
+
}>>;
|
|
360
376
|
}, z.core.$strict>;
|
|
361
377
|
type Pool = z.infer<typeof PoolSchema>;
|
|
362
378
|
/** One directory rule in `~/.agent-shim/directory-rules.json`, scoped to an explicit absolute (or `~`-rooted) path. */
|
|
@@ -588,6 +604,10 @@ declare const GlobalConfigSchema: z.ZodObject<{
|
|
|
588
604
|
}, z.core.$strict>>;
|
|
589
605
|
pools: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
590
606
|
identities: z.ZodArray<z.ZodString>;
|
|
607
|
+
preference: z.ZodOptional<z.ZodEnum<{
|
|
608
|
+
score: "score";
|
|
609
|
+
listed: "listed";
|
|
610
|
+
}>>;
|
|
591
611
|
}, z.core.$strict>>>;
|
|
592
612
|
}, z.core.$strict>;
|
|
593
613
|
type GlobalConfig = z.infer<typeof GlobalConfigSchema>;
|
|
@@ -5058,6 +5078,21 @@ declare function planOf(account: AccountMetadata | undefined): PlanClass;
|
|
|
5058
5078
|
|
|
5059
5079
|
/** Anthropic's longest prompt-cache lifetime (the one-hour tier): a conversation resumed within it still has a warm cache on the account that served it, and the cache is per organisation, so it is lost by switching. */
|
|
5060
5080
|
declare const PROMPT_CACHE_TTL_MS: number;
|
|
5081
|
+
/**
|
|
5082
|
+
* Stands for a nested `pool:<name>` member entry rather than a direct identity. `pick` carries the nested pool's own pick (its identity and reasons), which the outer ranking re-ranks from that identity's snapshot like any member; `refused` marks an entry whose every member is refused, so the entry itself is ineligible, carrying the nested pool's earliest return.
|
|
5083
|
+
*/
|
|
5084
|
+
type NestedContribution = {
|
|
5085
|
+
readonly kind: "pick";
|
|
5086
|
+
readonly pool: string;
|
|
5087
|
+
readonly reasons: readonly string[];
|
|
5088
|
+
} | {
|
|
5089
|
+
readonly kind: "refused";
|
|
5090
|
+
readonly pool: string;
|
|
5091
|
+
readonly earliestReturn?: {
|
|
5092
|
+
readonly identity: string;
|
|
5093
|
+
readonly atMs: number;
|
|
5094
|
+
};
|
|
5095
|
+
};
|
|
5061
5096
|
/** The state a member's ranking was built from. */
|
|
5062
5097
|
interface PoolMember {
|
|
5063
5098
|
readonly identity: string;
|
|
@@ -5068,6 +5103,8 @@ interface PoolMember {
|
|
|
5068
5103
|
readonly account?: AccountMetadata;
|
|
5069
5104
|
/** The member's usage-log records from the current five-hour window on. */
|
|
5070
5105
|
readonly records: readonly UsageRecord[];
|
|
5106
|
+
/** Present when this member stands for a nested `pool:<name>` entry rather than a direct identity. */
|
|
5107
|
+
readonly nested?: NestedContribution;
|
|
5071
5108
|
}
|
|
5072
5109
|
/** The member last picked for this directory, kept so a conversation stays on the account whose prompt cache is warm. */
|
|
5073
5110
|
interface StickyPick {
|
|
@@ -5080,6 +5117,8 @@ interface RankPoolInput {
|
|
|
5080
5117
|
readonly sticky?: StickyPick;
|
|
5081
5118
|
/** True when the launch continues or resumes a conversation, which belongs on the account it started on whatever the cache lifetime. */
|
|
5082
5119
|
readonly resuming: boolean;
|
|
5120
|
+
/** How members are ordered: "score" (the default when absent) by the use-it-or-lose-it ranking, "listed" strictly in `members` order. */
|
|
5121
|
+
readonly preference?: "score" | "listed";
|
|
5083
5122
|
}
|
|
5084
5123
|
/** In pick order. `scored` has usable quota data; `unknown` has none (never recorded, or unreadable); `pay-per-use` bills by use instead of drawing on a plan; `ineligible` is refused right now. */
|
|
5085
5124
|
type CandidateClass = "scored" | "unknown" | "pay-per-use" | "ineligible";
|
|
@@ -5111,18 +5150,20 @@ interface PoolRanking {
|
|
|
5111
5150
|
* Ranks `members` for a launch.
|
|
5112
5151
|
*
|
|
5113
5152
|
* A member is `ineligible` while a window of its plan, or a refusal it last hit, still binds; it is `unknown` without recorded quota, `pay-per-use` when its usage bills by use, and otherwise `scored`. Scored members order by how much plan-size-weighted quota would expire unused per hour of runway, with any whose five-hour window would run dry at the observed pace (their own, or the person's pace on another member rescaled by plan size) placed behind those that would not. The member last picked for this directory then moves to the front if it is still usable and either the launch resumes a conversation or its prompt cache is still warm.
|
|
5153
|
+
*
|
|
5154
|
+
* How members are ordered depends on `preference`. The default, "score", is the order above: class first, then feasibility, then score, with ties by name. "listed" keeps the order of `members`, which callers build in pool member order, so member order, not class, decides: an `unknown` (no usage recorded) or `pay-per-use` member can be picked before a later `scored` one, which is the list owner's stated preference, and a `scored` member that is not feasible keeps its place and its reason line rather than being demoted. In both modes the pick is the first non-`ineligible` candidate, `earliestReturn` still reports the soonest returning refused member, and the sticky-pick promotion applies unchanged.
|
|
5114
5155
|
*/
|
|
5115
5156
|
declare function rankPool(input: RankPoolInput): PoolRanking;
|
|
5116
5157
|
|
|
5117
5158
|
/**
|
|
5118
|
-
* Ranks a pool exactly as a launch from `directory` would right now, without recording a pick. Shares `
|
|
5159
|
+
* Ranks a pool exactly as a launch from `directory` would right now, without recording a pick. Shares `rankPoolGraph` with the launcher, so what this prints is what a launch does.
|
|
5119
5160
|
*/
|
|
5120
5161
|
declare function collectPoolPick(params: Readonly<{
|
|
5121
5162
|
paths: LayoutPaths;
|
|
5122
5163
|
fs: FsPort;
|
|
5123
5164
|
usageFs: FarmFs;
|
|
5124
5165
|
poolName: string;
|
|
5125
|
-
|
|
5166
|
+
pools: Readonly<Record<string, Pool>>;
|
|
5126
5167
|
directory: string;
|
|
5127
5168
|
nowMs: number;
|
|
5128
5169
|
}>): PoolPickReport;
|
|
@@ -5492,10 +5533,10 @@ declare class PoolNotFoundError extends CliError {
|
|
|
5492
5533
|
declare function readPools(paths: LayoutPaths): Readonly<Record<string, Pool>>;
|
|
5493
5534
|
/** The pool named `name`; throws `PoolNotFoundError` when none is defined. */
|
|
5494
5535
|
declare function requirePool(paths: LayoutPaths, name: string): Pool;
|
|
5495
|
-
/** Defines a new pool. Throws `InvalidPoolNameError` for a name `PoolNameSchema` rejects
|
|
5496
|
-
declare function addPool(paths: LayoutPaths, name: string, identities: readonly string[]): Pool;
|
|
5497
|
-
/** Replaces an existing pool's members. Throws `PoolNotFoundError` when it is not defined. */
|
|
5498
|
-
declare function setPool(paths: LayoutPaths, name: string, identities: readonly string[]): Pool;
|
|
5536
|
+
/** Defines a new pool. Throws `InvalidPoolNameError` for a name `PoolNameSchema` rejects, `PoolAlreadyExistsError` for one already defined, and `UsageError` for a nested member that names an undefined pool or a cycle. */
|
|
5537
|
+
declare function addPool(paths: LayoutPaths, name: string, identities: readonly string[], preference?: PoolPreference): Pool;
|
|
5538
|
+
/** Replaces an existing pool's members and preference. Throws `PoolNotFoundError` when it is not defined, and `UsageError` for a nested member that names an undefined pool or a cycle. */
|
|
5539
|
+
declare function setPool(paths: LayoutPaths, name: string, identities: readonly string[], preference?: PoolPreference): Pool;
|
|
5499
5540
|
/** Removes a pool. Throws `PoolNotFoundError` when it is not defined. Anything that selected it (an active-identity file, a directory rule) is left for `doctor` to report, as with a removed identity. */
|
|
5500
5541
|
declare function removePool(paths: LayoutPaths, name: string): void;
|
|
5501
5542
|
|
|
@@ -5687,4 +5728,4 @@ interface PrepareClaudeLaunchOptions {
|
|
|
5687
5728
|
declare function prepareClaudeLaunch(options: PrepareClaudeLaunchOptions): LaunchPlan;
|
|
5688
5729
|
|
|
5689
5730
|
export { AMBIENT_CREDENTIAL_VARS, CHECK_CREDENTIAL_APPLIES, CONNECT_INTERCEPT_HOST, CONNECT_INTERCEPT_HOSTS, CONNECT_LIMITS, CONTROL_PATH_PREFIX, CategoryClassificationOverlaySchema, CategoryClassificationSchema, CategoryMapSchema, CheckReportJsonSchema, CheckRunInputSchema, CliError, ConfigProfileSchema, CredentialCacheSchema, CredentialSchema, CredentialSourceSchema, DOOR_EVENT_BUFFER_EVENTS, DOOR_EVENT_SOURCE_RC, DirectoryRuleAlreadyExistsError, DirectoryRuleMissingTargetError, DirectoryRuleNotFoundError, DirectoryRuleSchema, DirectoryRulesSchema, DoctorFindingSchema, DoctorRunOutputSchema, DoorEventSchema, DoorEventSourceQuerySchema, EXIT_FAILURE, EXIT_USAGE, EffectiveWindowSchema, EntryValueSchema, FARM_MANIFEST_FILENAME, FrontDoorSessionStatusSchema, FrontDoorSessionsOutputSchema, FrontDoorStartError, FrontDoorStateSchema, FrontDoorStatusOutputSchema, GlobalConfigSchema, HeadroomSocketTargetSchema, HeadroomStartError, IdentityAlreadyExistsError, IdentityNotFoundError, IdentitySchema, InvalidCategoryNameError, InvalidIdentityNameError, InvalidProviderNameError, LAUNCH_EVENT_SOURCE, LaunchLifecycleEventSchema, LaunchRefusedError, LegacyProviderFileError, PROMPT_CACHE_TTL_MS, PlanClassSchema, PoolNameSchema, PoolNotFoundError, PoolPickReportSchema, PoolSchema, PortableConfigSchema, ProfileAlreadyExistsError, ProfileNotFoundError, ProviderAlreadyExistsError, ProviderKindMismatchError, ProviderNotFoundError, ProviderSchema, RC_IDLE_EXPIRY_MS, RC_ORPC_PATH_PREFIX, RC_PENDING_DEADLINE_MS, RC_PERMISSION_MODES, RC_REQUEST_PARSE_CAP_BYTES, RC_SELF_HOST_ENV, RC_SELF_HOST_KEEPALIVE_MS, RC_SELF_HOST_RECORD_DIR, RC_SELF_HOST_RECORD_FILE, RC_SELF_HOST_RETENTION_MS, RC_SELF_HOST_SCOPE_LIST, RC_SELF_HOST_WORKER_JWT_TTL_SECONDS, RC_SESSIONS_PATH_PREFIX, RC_STREAM_BACKOFF_MS, ROUTED_PATH_PREFIX, RcPermissionModeSchema, RcStreamEnvelopeSchema, RcStreamEventSchema, UsageError, UsageListOutputSchema, UsageSnapshotError, UsageSnapshotSchema, UsageWindowsInputSchema, UsageWindowsOutputSchema, WhenSchema, addDirectoryRule, addIdentity, addPool, addProvider, answerRcControlRequest, buildEntryFacts, buildLayoutPaths, buildRcControlResponsePayload, buildRcEventWriteBody, buildRcInterruptPayload, buildRcSetModelPayload, buildRcSetPermissionModePayload, buildRcUserMessagePayload, carryOver, checkReportHasWarnings, checkReportToJson, collectCheckReport, collectDoctorReport, collectFrontDoorStatus, collectPoolPick, createControlApiRouter, createDoorApiNodeHandler, createDoorApiRouter, createDoorEventHub, createEventsApiRouter, createLaunchEventPublisher, createLeafCache, createProfile, createRcApiNodeHandler, createRcApiRouter, createRcControlHandler, createRcCredentialStore, createRcEventFanout, createRcSelfHostSurface, createRcSessionTracker, createRcStreamHub, createSseParser, describeProviderEndpoint, detectAmbientCredential, doorApiAuth, doorApiNodeHandlerOf, effectiveWindow, ensureCa, ensureFrontDoor, ensureHeadroom, evaluateAmbientCredentialGuard, evaluateWhen, formatAmbientCredentialGuardMessage, formatCheckReport, formatDoctorReport, formatFrontDoorStatus, forwardableHeaders, frontDoorApiClient, frontDoorApiLink, frontDoorRcApiClient, frontDoorRcControl, generateCa, headroomSocketTarget, identityExists, injectRcUserMessage, interruptRcSession, isIdentityDirectoryName, isInterceptedHost, isRcPermissionMode, lateRcEventDial, lateRcStreamDial, listDirectoryRules, listIdentities, listProfiles, listProviders, listUsageSnapshots, matchBranch, mintLeaf, mintRcSelfHostCredential, observingRoutedRoute, parseConnectTarget, parseRcStreamEnvelope, planOf, prepareClaudeLaunch, prepareLaunch, profileExists, providerExists, rankPool, rcEventWriteResultFromAnswer, rcFanoutOnDoorHub, rcObserverAsPassthrough, rcSelfHostFromEnv, readActiveIdentity, readDirectoryRules, readFarmManifest, readGlobalConfig, readIdentity, readPools, readProfile, readProvider, readRcSelfHostRecord, readUsageSnapshot, realConnectCertStore, realConnectEffects, realRcControlTransport, realRcEventDial, realRcStreamDial, recoverFarm, recoveryDiagnostics, removeDirectoryRule, removeIdentity, removePool, removeProfile, removeProvider, requirePool, resolveAgentShimHome, resolveClaudeHome, resolveDecisions, resolveLayoutPaths, resolveSupervisorConfig, resyncFarm, runCheck, runDoctor, runFrontDoorSupervisor, runLauncher, runSupervisor, servedByPipeline, setAllowAmbientCredential, setDefaultConfigProfile, setGlobalDefaultProfile, setIdentityCredential, setPool, setProfileCategories, setProfileEntries, setProfileLaunchFlags, setProfileMetadata, setRcSessionModel, setRcSessionPermissionMode, snapshotPath, spawnClaude, startConnectServer, topLevelNames, updateDirectoryRule, updateProvider, useIdentity, writeDirectoryRules };
|
|
5690
|
-
export type { AddDirectoryRuleOptions, AddProviderInput, AmbientCredentialDetection, AmbientCredentialGuardResult, AmbientCredentialVar, BuildEntryFactsParams, CaMaterial, Candidate, CarryOverParams, CarryOverResult, CategoryMap, CheckReport, CheckReportJson, CollectCheckReportParams, CollectDoctorReportParams, CompiledRule, ConditionContext, ConfigProfile, ConnectCertStore, ConnectEffects, ConnectLimits, ConnectLocalSurface, ConnectServerConfig, ConnectServerHandle, ConnectTarget, ControlApiClient, ControlApiDeps, ControlApiRouter, Credential, CredentialSource, Decision, Diagnostic, DirectoryRule, DirectoryRules, DoctorReport, DoorApiClient, DoorApiContext, DoorApiDeps, DoorApiRouter, DoorEvent, DoorEventHub, DoorEventPublisher, DoorEventStream, DoorEventsApiDeps, EffectiveWindow, EliminatedRule, EnsureFrontDoorPorts, EnsureHeadroomPorts, EntryFact, EntryFacts, EntryValue, EvaluateAmbientCredentialGuardParams, FlattenedCascade, FrontDoorRcControl, FrontDoorSessionStatus, FrontDoorStatus, FrontDoorSupervisorPorts, GlobalConfig, HeadroomSupervisorConfig, Identity, IdentityCredentialChange, IdentityListEntry, IdentityListing, InjectedCredential, LaunchEventPublisher, LaunchLifecycleEvent, LaunchPlan, Layer, LayerId, LayoutPaths, LeafCert, PlanClass, Pool, PoolMember, PoolPickReport, PoolRanking, PortableConfig, PrepareClaudeLaunchOptions, PrepareLaunchParams, ProfileListEntry, Provider, ProviderListEntry, RankPoolInput, RcAnswerDecision, RcAnswerDeps, RcApiClient, RcApiDeps, RcApiRouter, RcControlAnswer, RcControlHandlerDeps, RcControlRequestDeps, RcControlTransport, RcCredentialStore, RcDialAnswer, RcDialTarget, RcEventDial, RcEventFanout, RcEventWriteResult, RcExchangeObserver, RcInjectDeps, RcObservedCredential, RcObservedRequest, RcPendingRequestSummary, RcPermissionMode, RcPresenceAnswer, RcSelfHostCredentialRecord, RcSelfHostDeps, RcSelfHostMintResult, RcSelfHostSurface, RcSessionStatus, RcSessionSummary, RcSessionTracker, RcSessionTrackerDeps, RcStreamAnswer, RcStreamDial, RcStreamEnvelope, RcStreamEvent, RcStreamHub, RcStreamHubDeps, RcWorkerFact, RcWriteHeaders, RecoverFarmParams, RecoveryResult, ResolveDecisionsInput, ResolvedState, ResyncFarmParams, ResyncFarmResult, RunCheckParams, RunDoctorParams, RunFrontDoorSupervisorOptions, RunLauncherParams, RunSupervisorOptions, SpawnClaudeParams, SseParsedEvent, StickyPick, SupervisorPorts, UnreadableIdentityListEntry, UpdateDirectoryRuleOptions, UpdateProviderInput, UsageReadFs, UsageSnapshot, WhenCondition, WhenEvaluation };
|
|
5731
|
+
export type { AddDirectoryRuleOptions, AddProviderInput, AmbientCredentialDetection, AmbientCredentialGuardResult, AmbientCredentialVar, BuildEntryFactsParams, CaMaterial, Candidate, CarryOverParams, CarryOverResult, CategoryMap, CheckReport, CheckReportJson, CollectCheckReportParams, CollectDoctorReportParams, CompiledRule, ConditionContext, ConfigProfile, ConnectCertStore, ConnectEffects, ConnectLimits, ConnectLocalSurface, ConnectServerConfig, ConnectServerHandle, ConnectTarget, ControlApiClient, ControlApiDeps, ControlApiRouter, Credential, CredentialSource, Decision, Diagnostic, DirectoryRule, DirectoryRules, DoctorReport, DoorApiClient, DoorApiContext, DoorApiDeps, DoorApiRouter, DoorEvent, DoorEventHub, DoorEventPublisher, DoorEventStream, DoorEventsApiDeps, EffectiveWindow, EliminatedRule, EnsureFrontDoorPorts, EnsureHeadroomPorts, EntryFact, EntryFacts, EntryValue, EvaluateAmbientCredentialGuardParams, FlattenedCascade, FrontDoorRcControl, FrontDoorSessionStatus, FrontDoorStatus, FrontDoorSupervisorPorts, GlobalConfig, HeadroomSupervisorConfig, Identity, IdentityCredentialChange, IdentityListEntry, IdentityListing, InjectedCredential, LaunchEventPublisher, LaunchLifecycleEvent, LaunchPlan, Layer, LayerId, LayoutPaths, LeafCert, NestedContribution, PlanClass, Pool, PoolMember, PoolPickReport, PoolRanking, PortableConfig, PrepareClaudeLaunchOptions, PrepareLaunchParams, ProfileListEntry, Provider, ProviderListEntry, RankPoolInput, RcAnswerDecision, RcAnswerDeps, RcApiClient, RcApiDeps, RcApiRouter, RcControlAnswer, RcControlHandlerDeps, RcControlRequestDeps, RcControlTransport, RcCredentialStore, RcDialAnswer, RcDialTarget, RcEventDial, RcEventFanout, RcEventWriteResult, RcExchangeObserver, RcInjectDeps, RcObservedCredential, RcObservedRequest, RcPendingRequestSummary, RcPermissionMode, RcPresenceAnswer, RcSelfHostCredentialRecord, RcSelfHostDeps, RcSelfHostMintResult, RcSelfHostSurface, RcSessionStatus, RcSessionSummary, RcSessionTracker, RcSessionTrackerDeps, RcStreamAnswer, RcStreamDial, RcStreamEnvelope, RcStreamEvent, RcStreamHub, RcStreamHubDeps, RcWorkerFact, RcWriteHeaders, RecoverFarmParams, RecoveryResult, ResolveDecisionsInput, ResolvedState, ResyncFarmParams, ResyncFarmResult, RunCheckParams, RunDoctorParams, RunFrontDoorSupervisorOptions, RunLauncherParams, RunSupervisorOptions, SpawnClaudeParams, SseParsedEvent, StickyPick, SupervisorPorts, UnreadableIdentityListEntry, UpdateDirectoryRuleOptions, UpdateProviderInput, UsageReadFs, UsageSnapshot, WhenCondition, WhenEvaluation };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-shim",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.20.1",
|
|
4
4
|
"description": "A profile manager and launcher for Claude Code that lets one person run multiple logins from one machine while controlling what gets shared between them.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Joseph Mearman <joseph@mearman.co.uk>",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"rollup": "4.64.0",
|
|
80
80
|
"rollup-plugin-dts": "6.5.1",
|
|
81
81
|
"semantic-release": "^25.0.9",
|
|
82
|
-
"turbo": "^2.
|
|
82
|
+
"turbo": "^2.11.5",
|
|
83
83
|
"typescript": "^6.0.3",
|
|
84
84
|
"typescript-eslint": "^8.70.0",
|
|
85
85
|
"vitest": "^4.1.11"
|