diff --git a/apps/cli/src/agent/AGENTS.md b/apps/cli/src/agent/AGENTS.md index 88b8d5b25a..3914225b3c 100644 --- a/apps/cli/src/agent/AGENTS.md +++ b/apps/cli/src/agent/AGENTS.md @@ -10,6 +10,13 @@ arrive: context/message-flow.md "Upstream". - `agent-client.ts` — the ACP connection: initialize/session lifecycle, client capabilities (fs, elicitation), permission/fs request handling, update callbacks. + Goal session-info updates use provider-neutral `_meta.goal`; keep the + `_meta.codex.goal` reader only as a compatibility fallback for older Codex adapters. + A present neutral field wins, including `null`, so malformed new metadata is not + silently hidden by a legacy duplicate. Validate neutral snapshots against + `controlMethod: _session/goal`; normalize neutral `limited` to the legacy durable + `blocked` status so older readers can consume mixed-version history without + inventing a provider-specific limit reason. Its built-in `lody` stdio MCP config is an explicit environment allowlist, not ordinary child-process inheritance. Keep the public CLI deployment endpoints (`LODY_AUTH_URL`, `LODY_AUTH_SITE_URL`, `LODY_SERVER_URL`) in that config so diff --git a/apps/cli/src/agent/agent-client.ts b/apps/cli/src/agent/agent-client.ts index d525ed3ceb..179bfa79b2 100644 --- a/apps/cli/src/agent/agent-client.ts +++ b/apps/cli/src/agent/agent-client.ts @@ -330,7 +330,7 @@ export type AcpSessionStartTarget = { resumeSessionId?: ACPSessionId; }; -const ThreadGoalStatusSchema = z.enum([ +const LegacyCodexGoalStatusSchema = z.enum([ 'active', 'paused', 'blocked', @@ -339,10 +339,24 @@ const ThreadGoalStatusSchema = z.enum([ 'complete', 'cleared', ]); -const CodexGoalSnapshotSchema = z.object({ +const LegacyCodexGoalSnapshotSchema = z.object({ objective: z.string(), - status: ThreadGoalStatusSchema, + status: LegacyCodexGoalStatusSchema, tokenBudget: z.number().nullable().optional(), + tokensUsed: z.number().optional(), + timeUsedSeconds: z.number().optional(), + createdAt: z.number().optional(), + updatedAt: z.number().optional(), +}); +const NeutralGoalSnapshotSchema = z.object({ + objective: z.string(), + status: z.enum(['active', 'paused', 'blocked', 'limited', 'complete']), + controlMethod: z.literal('_session/goal'), + tokenBudget: z.number().nullable().optional(), + tokensUsed: z.number().optional(), + timeUsedSeconds: z.number().optional(), + createdAt: z.number().optional(), + updatedAt: z.number().optional(), }); const CodexRetryErrorSchema = z.object({ @@ -760,7 +774,7 @@ export class AgentClient implements acp.Client { const notification = parseSessionNotification(params); - this.handleCodexGoalSessionInfoUpdate(notification); + this.handleGoalSessionInfoUpdate(notification); this.handleCodexWarningSessionInfoUpdate(notification); this.handleAgentSessionTitleUpdate(notification); @@ -783,20 +797,40 @@ export class AgentClient implements acp.Client { return; } - private handleCodexGoalSessionInfoUpdate(notification: AcpSessionNotification): void { - if (!this.isCodexAgent() || notification.update.sessionUpdate !== 'session_info_update') { + private handleGoalSessionInfoUpdate(notification: AcpSessionNotification): void { + if (notification.update.sessionUpdate !== 'session_info_update') { return; } - const codexMeta = notification.update._meta?.codex; - if (typeof codexMeta !== 'object' || codexMeta === null || !('goal' in codexMeta)) { + const meta = notification.update._meta; + if (typeof meta !== 'object' || meta === null) { return; } - const parsed = z.object({ goal: CodexGoalSnapshotSchema.nullable() }).safeParse(codexMeta); + let goalContainer: unknown; + let source: 'ACP' | 'legacy Codex'; + if ('goal' in meta) { + goalContainer = meta; + source = 'ACP'; + } else { + const codexMeta = meta.codex; + if ( + !this.isCodexAgent() || + typeof codexMeta !== 'object' || + codexMeta === null || + !('goal' in codexMeta) + ) { + return; + } + goalContainer = codexMeta; + source = 'legacy Codex'; + } + + const goalSchema = source === 'ACP' ? NeutralGoalSnapshotSchema : LegacyCodexGoalSnapshotSchema; + const parsed = z.object({ goal: goalSchema.nullable() }).safeParse(goalContainer); if (!parsed.success) { this.logger.debug( - `[${this.options.sessionId}] Dropping invalid Codex goal session info: ${parsed.error.message}` + `[${this.options.sessionId}] Dropping invalid ${source} goal session info: ${parsed.error.message}` ); return; } @@ -807,12 +841,21 @@ export class AgentClient implements acp.Client { return; } + const goal = parsed.data.goal; this.options.onThreadGoalUpdated?.({ type: 'goal', threadId, - objective: sanitizeGoalObjective(parsed.data.goal.objective), - status: parsed.data.goal.status, - tokenBudget: parsed.data.goal.tokenBudget ?? null, + objective: sanitizeGoalObjective(goal.objective), + // The neutral extension collapses provider-specific limit reasons into + // `limited`. Normalize to the older generic blocked state at the durable + // boundary: mixed-version readers can consume it without falsely claiming + // that a usage or token budget was the specific limiting resource. + status: goal.status === 'limited' ? 'blocked' : goal.status, + tokenBudget: goal.tokenBudget ?? null, + ...(goal.tokensUsed !== undefined ? { tokensUsed: goal.tokensUsed } : {}), + ...(goal.timeUsedSeconds !== undefined ? { timeUsedSeconds: goal.timeUsedSeconds } : {}), + ...(goal.createdAt !== undefined ? { createdAt: goal.createdAt } : {}), + ...(goal.updatedAt !== undefined ? { updatedAt: goal.updatedAt } : {}), }); } diff --git a/apps/cli/src/agent/managed-agent-runtime.ts b/apps/cli/src/agent/managed-agent-runtime.ts index 6ed67e5bc7..0f598d22f8 100644 --- a/apps/cli/src/agent/managed-agent-runtime.ts +++ b/apps/cli/src/agent/managed-agent-runtime.ts @@ -269,43 +269,43 @@ const RUNTIMES: Record = { platforms: { 'darwin-arm64': { fileName: 'codex-package-aarch64-apple-darwin.tar.zst', - sha256: '24067128ccca24e4c582df7fabca06c107d9802e3ccc1280c6fa5dc3186f4a29', - size: 87286963, + sha256: '4b0a3c2967f6db11b67dac0a6f0630327077888157b2020b5b1159e8d4a5a01c', + size: 77491677, compression: 'zstd', cmd: 'bin/codex', }, 'darwin-x64': { fileName: 'codex-package-x86_64-apple-darwin.tar.zst', - sha256: 'b15c6922599097c24e700563e59feb0b59cc84b60eadf036ea38d4118e900c9c', - size: 95382310, + sha256: '373c728c0912b7c65af742bb649f0ff056300f8e8a33a619be0bab62f2afc6ba', + size: 85008508, compression: 'zstd', cmd: 'bin/codex', }, 'linux-arm64': { fileName: 'codex-package-aarch64-unknown-linux-musl.tar.zst', - sha256: '8f27d60343abd8a6016516974f8b55e512b1a3b614841596fd548745b9c4c3ed', - size: 90024268, + sha256: '692ff5c5d9eb86774c0448d930895e46659eee6a2c12f46b97399da458c1e8b7', + size: 80608473, compression: 'zstd', cmd: 'bin/codex', }, 'linux-x64': { fileName: 'codex-package-x86_64-unknown-linux-musl.tar.zst', - sha256: '8ed235186b6a53e62d8228057fba5c5da4c63eeafff046fc1161b9c2298461f9', - size: 96762435, + sha256: '494368127e27ab625b2a5e759f83447e1d7d00b6ae49a5e2c17df5fd7c4aac1d', + size: 86804357, compression: 'zstd', cmd: 'bin/codex', }, 'win32-arm64': { fileName: 'codex-package-aarch64-pc-windows-msvc.tar.zst', - sha256: 'ab915ae7861c86148078484df27c9a4900411ed25ad4435613f235c50acc4151', - size: 101491458, + sha256: '0c9d43e1ce013900850c82ab558cbafae9e8b05363689ab68cc0b4c87ac2b267', + size: 88080469, compression: 'zstd', cmd: 'bin/codex.exe', }, 'win32-x64': { fileName: 'codex-package-x86_64-pc-windows-msvc.tar.zst', - sha256: '608c193cb0723af1759e44747229c3a68e38988042abd7cf0f6efb9de6ef6b92', - size: 108999653, + sha256: '5931e080440a0bff1413d55b62921e26238f5410d82d79e5327202bfef1833a4', + size: 95093149, compression: 'zstd', cmd: 'bin/codex.exe', }, diff --git a/apps/cli/src/lib/message-handler.ts b/apps/cli/src/lib/message-handler.ts index ebf0c862f6..d926008680 100644 --- a/apps/cli/src/lib/message-handler.ts +++ b/apps/cli/src/lib/message-handler.ts @@ -133,7 +133,7 @@ import { getServerNow, CODE_COLLAB_V2_TEXT_LIMITS, isActiveSessionStatus, - isSessionGoalWorking, + isSessionGoalActive, resolveLatestSessionGoalFromHistory, resolveProjectGitHubRepo, type RepoId, @@ -9855,15 +9855,16 @@ export class MessageHandler { } /** - * Active Codex goals run as background ACP turns. They may be idle from - * Lody's user-turn perspective, but killing the session kills goal progress. + * Persistent active goals may drive a later autonomous ACP cycle even while + * no prompt is running. They are not a live-presence signal, but evicting the + * ACP process would discard that resumable session state. */ async hasActiveGoal(sessionId: SessionId): Promise { const sessionDoc = await this.workspaceDocument.getOrCreateSessionDoc(sessionId); const meta = await sessionDoc.getMetaState(); const legacyMeta = meta as SessionLegacyMetaFields | null | undefined; const historyGoal = resolveLatestSessionGoalFromHistory(await sessionDoc.getHistory()); - return isSessionGoalWorking(historyGoal ?? legacyMeta?.latestGoal); + return isSessionGoalActive(historyGoal ?? legacyMeta?.latestGoal); } /** diff --git a/apps/cli/src/session/AGENTS.md b/apps/cli/src/session/AGENTS.md index 14f15f0ab2..f61c743c3f 100644 --- a/apps/cli/src/session/AGENTS.md +++ b/apps/cli/src/session/AGENTS.md @@ -59,6 +59,10 @@ delegation proofs or a shared-machine gate without a new product and security de - `session-dispatch-logic.ts` — pure decision functions for the watcher (testable). - `session-execution-service.ts` — runs one turn end-to-end: ACP prompt, turn ids, lifecycle/error handling, GitHub/local project setup, and post-turn diffStats. + Goal lifecycle is independent from prompt lifecycle: an `active` session goal does + not suppress turn completion or completion notification once the current prompt is + quiescent. Use live execution/presence for current-work signals; goal activity may + still protect history rewrites or an in-memory runtime that can resume autonomously. It is the per-session execution mutex: never mint a second visible turn while a `TurnRuntimeState` is registered. User-dispatch turns derive assistant entry ids from `userTurnId` (`assistant:`), so a retried/recovered dispatch reuses diff --git a/apps/cli/src/session/session-edit-and-resend-service.ts b/apps/cli/src/session/session-edit-and-resend-service.ts index 725fd0139c..df0cc83f2b 100644 --- a/apps/cli/src/session/session-edit-and-resend-service.ts +++ b/apps/cli/src/session/session-edit-and-resend-service.ts @@ -2,7 +2,7 @@ import { buildPendingUserHistoryEntry, getServerNow, getSessionRoomId, - isSessionGoalWorking, + isSessionGoalActive, normalizeSessionInputBlocks, resolveLatestSessionGoalFromHistory, sessionEditAndResendFailure, @@ -162,7 +162,7 @@ export class SessionEditAndResendService { const legacyMeta = meta as SessionMeta & SessionLegacyMetaFields; const latestGoal = resolveLatestSessionGoalFromHistory(history) ?? legacyMeta.latestGoal; const execution = this.deps.executionService.getExecutionSnapshot(spec.sessionId); - if (meta.autoReview || execution.hasActiveAutomation || isSessionGoalWorking(latestGoal)) { + if (meta.autoReview || execution.hasActiveAutomation || isSessionGoalActive(latestGoal)) { return sessionEditAndResendFailure( spec, 'ACTIVE_AUTOMATION', @@ -254,7 +254,7 @@ export class SessionEditAndResendService { if ( freshMeta.autoReview || freshExecution.hasActiveAutomation || - isSessionGoalWorking(freshGoal) + isSessionGoalActive(freshGoal) ) { await this.closePrepared(runtime, preparedSessionId); preparedSessionId = null; @@ -365,7 +365,7 @@ export class SessionEditAndResendService { const currentGoal = resolveLatestSessionGoalFromHistory(currentHistory) ?? (commitMeta as SessionMeta & SessionLegacyMetaFields).latestGoal; - if (isSessionGoalWorking(currentGoal)) { + if (isSessionGoalActive(currentGoal)) { throw new Error( '[ACTIVE_AUTOMATION] A session goal started before history replacement.' ); diff --git a/apps/cli/src/session/session-execution-service.ts b/apps/cli/src/session/session-execution-service.ts index 5f452e11da..6081665687 100644 --- a/apps/cli/src/session/session-execution-service.ts +++ b/apps/cli/src/session/session-execution-service.ts @@ -29,8 +29,6 @@ import { type ProjectRef, resolveBaseBranchPreference, resolveProjectGitHubRepo, - resolveLatestSessionGoalFromHistory, - isSessionGoalWorking, getSessionRoomId, getServerNow, SessionCreateRequestValidated, @@ -38,8 +36,6 @@ import { type SessionId, type SessionInputBlock, type SessionTurnInputConfig, - type SessionGoalMessage, - type SessionLegacyMetaFields, type SessionMeta, SessionStatusFactory, SessionChatRequestValidated, @@ -1487,30 +1483,6 @@ export class SessionExecutionService { } } - private async resolveLatestGoalForCompletionNotification( - sessionId: SessionId, - sessionDoc: SessionDocument - ): Promise { - let metaGoal: SessionGoalMessage | null = null; - try { - const meta = await sessionDoc.getMetaState(); - metaGoal = (meta as SessionLegacyMetaFields | null | undefined)?.latestGoal ?? null; - } catch (error) { - this.deps.logger.debug( - `[${sessionId}] Failed to read latest goal meta before completion notification: ${formatErrorMessage(error)}` - ); - } - - try { - return resolveLatestSessionGoalFromHistory(await sessionDoc.getHistory()) ?? metaGoal; - } catch (error) { - this.deps.logger.debug( - `[${sessionId}] Failed to read latest goal history before completion notification: ${formatErrorMessage(error)}` - ); - return metaGoal; - } - } - private async evictForTurnStart(sessionId: SessionId): Promise { return await this.deps.evictForMemoryPressure(sessionId); } @@ -2565,19 +2537,6 @@ export class SessionExecutionService { return; } - const latestGoal = await this.runTurnFinalizationStage( - sessionId, - turnId, - 'resolveLatestGoalForCompletionNotification', - async () => await this.resolveLatestGoalForCompletionNotification(sessionId, sessionDoc) - ); - if (isSessionGoalWorking(latestGoal)) { - this.deps.logger.debug( - `[${sessionId}] Skipping session completion notification because a thread goal is still active` - ); - return; - } - await this.runTurnFinalizationStage(sessionId, turnId, 'notifySessionCompleted', async () => { await this.deps.turnFinalization.notifySessionCompleted(sessionId, userId, turnId); }); diff --git a/apps/cli/tests/agent-client-plan-mode.test.ts b/apps/cli/tests/agent-client-plan-mode.test.ts index ce6a0192dd..618c012002 100644 --- a/apps/cli/tests/agent-client-plan-mode.test.ts +++ b/apps/cli/tests/agent-client-plan-mode.test.ts @@ -1240,7 +1240,7 @@ describe('unstable_createElicitation (AskUserQuestion bridge)', () => { }); }); -describe('AgentClient Codex goal session info', () => { +describe('AgentClient goal session info', () => { it('shows a retry activity until Codex resumes streaming', async () => { const { client, onUpdateMessage } = createTestClient(); @@ -1278,7 +1278,79 @@ describe('AgentClient Codex goal session info', () => { ]); }); - it('normalizes Codex goal metadata into sparse goal message content', async () => { + it('normalizes provider-neutral goal metadata for non-Codex agents', async () => { + const { client, onThreadGoalUpdated, onUpdateMessage } = createTestClient({ + agentType: 'claude', + }); + + await client.sessionUpdate({ + sessionId: 'acp-test', + update: { + sessionUpdate: 'session_info_update', + _meta: { + goal: { + objective: 'ship the release', + status: 'limited', + tokenBudget: 42_000, + iterations: 7, + lastReason: 'waiting for review', + tokensUsed: 12_000, + timeUsedSeconds: 90, + createdAt: 100, + updatedAt: 200, + controlMethod: '_session/goal', + }, + }, + }, + } as unknown as SessionNotification); + + expect(onThreadGoalUpdated).toHaveBeenCalledWith({ + type: 'goal', + threadId: 'acp-test', + objective: 'ship the release', + status: 'blocked', + tokenBudget: 42_000, + tokensUsed: 12_000, + timeUsedSeconds: 90, + createdAt: 100, + updatedAt: 200, + }); + expect(onUpdateMessage).toHaveBeenCalledTimes(1); + }); + + it('prefers valid provider-neutral metadata over a legacy Codex duplicate', async () => { + const { client, onThreadGoalUpdated } = createTestClient(); + + await client.sessionUpdate({ + sessionId: 'acp-test', + update: { + sessionUpdate: 'session_info_update', + _meta: { + goal: { + objective: 'neutral objective', + status: 'active', + controlMethod: '_session/goal', + }, + codex: { + goal: { + objective: 'legacy objective', + status: 'paused', + }, + }, + }, + }, + } as unknown as SessionNotification); + + expect(onThreadGoalUpdated).toHaveBeenCalledWith({ + type: 'goal', + threadId: 'acp-test', + objective: 'neutral objective', + status: 'active', + tokenBudget: null, + }); + }); + + it('keeps parsing legacy Codex goal metadata', async () => { const { client, onThreadGoalUpdated, onUpdateMessage } = createTestClient(); await client.sessionUpdate({ @@ -1307,28 +1379,50 @@ describe('AgentClient Codex goal session info', () => { expect(onUpdateMessage).toHaveBeenCalledTimes(1); }); - it('handles a null Codex goal as cleared', async () => { - const { client, onThreadGoalCleared } = createTestClient(); + it('handles a null provider-neutral goal as cleared', async () => { + const { client, onThreadGoalCleared } = createTestClient({ agentType: 'claude' }); await client.sessionUpdate({ sessionId: 'acp-test', update: { sessionUpdate: 'session_info_update', - _meta: { codex: { goal: null } }, + _meta: { + goal: null, + codex: { + goal: { + objective: 'legacy objective', + status: 'active', + }, + }, + }, }, - }); + } as unknown as SessionNotification); expect(onThreadGoalCleared).toHaveBeenCalledWith('acp-test'); }); - it('ignores invalid Codex goal metadata without breaking the session stream', async () => { - const { client, onThreadGoalUpdated, onUpdateMessage } = createTestClient(); + it('ignores invalid provider-neutral goal metadata without breaking the session stream', async () => { + const { client, onThreadGoalUpdated, onUpdateMessage } = createTestClient({ + agentType: 'claude', + }); await client.sessionUpdate({ sessionId: 'acp-test', update: { sessionUpdate: 'session_info_update', - _meta: { codex: { goal: { objective: 42, status: 'active' } } }, + _meta: { + goal: { + objective: 'neutral objective', + status: 'active', + controlMethod: '_wrong/goal', + }, + codex: { + goal: { + objective: 'legacy objective', + status: 'active', + }, + }, + }, }, } as unknown as SessionNotification); diff --git a/apps/cli/tests/session-execution-service.test.ts b/apps/cli/tests/session-execution-service.test.ts index 9eb13e839c..4a2962cd35 100644 --- a/apps/cli/tests/session-execution-service.test.ts +++ b/apps/cli/tests/session-execution-service.test.ts @@ -980,7 +980,7 @@ describe('SessionExecutionService', () => { expect(upsertDocMeta).not.toHaveBeenCalled(); }); - it('skips completion notifications while a Codex goal remains active', async () => { + it('notifies when a prompt completes while a persistent goal remains active', async () => { let history: Array> = [ { id: 'turn-user-1', @@ -1071,7 +1071,7 @@ describe('SessionExecutionService', () => { expect(agentClient.prompt).toHaveBeenCalled(); expect(history[0]?.status).toBe('handled'); - expect(notifySessionCompleted).not.toHaveBeenCalled(); + expect(notifySessionCompleted).toHaveBeenCalledTimes(1); }); it('rejects a chat turn before prompt when memory pressure persists', async () => { diff --git a/packages/acp-extension-claude b/packages/acp-extension-claude index 3c07d9c91d..22c5d68d19 160000 --- a/packages/acp-extension-claude +++ b/packages/acp-extension-claude @@ -1 +1 @@ -Subproject commit 3c07d9c91da83760650a6e2847e837c63289a1db +Subproject commit 22c5d68d198293f21eb7d81ffda348111ec72343 diff --git a/packages/acp-extension-codex b/packages/acp-extension-codex index d058788469..abaf91233f 160000 --- a/packages/acp-extension-codex +++ b/packages/acp-extension-codex @@ -1 +1 @@ -Subproject commit d05878846983189556d46fd3040f55d5609660f8 +Subproject commit abaf91233f60de577adb08ffb5082acbb9a53552 diff --git a/packages/components/src/components/sessions/AGENTS.md b/packages/components/src/components/sessions/AGENTS.md index 384ad97dee..7e370fd21b 100644 --- a/packages/components/src/components/sessions/AGENTS.md +++ b/packages/components/src/components/sessions/AGENTS.md @@ -406,7 +406,14 @@ labelClassName`) so the stage diffstat never clips. Wired from content appears instantly. Radix gotcha: popover anchors use PopoverAnchor (not Trigger) and must preventDefault onPointerDownOutside when the target is the anchor, or dismiss + click-toggle cancel out. GoalChip's popover reuses - `GoalActionButton`/`formatTokensCompact` from `session-goal-banner.tsx`; + `GoalActionButton`/`formatTokensCompact` from `session-goal-banner.tsx`. + Goal controls are transport-gated: the current `/goal …` prompt bridge is + Codex-only, so provider-neutral snapshots remain read-only until their advertised + `_session/goal` method is routed through the session control plane; Stop must never + synthesize `pause` for those providers. An `active` goal is persistent session state, + not proof that an ACP prompt is running: current busy/running UI, message queue routing, + and completion prompts must use live turn presence only. Active goal state may still + gate destructive history rewrites and expose an explicit Codex Pause control. ScheduleChip reuses `useResolvedScheduledTasks`/`ScheduledTaskList` from `scheduled-tasks-panel.tsx` (same adaptive countdown clock, cannot drift). The message queue intentionally stays OUT of the bar. The bar renders on diff --git a/packages/components/src/components/sessions/session-chat-interface.tsx b/packages/components/src/components/sessions/session-chat-interface.tsx index ed4bc46e4c..58cbe202f4 100644 --- a/packages/components/src/components/sessions/session-chat-interface.tsx +++ b/packages/components/src/components/sessions/session-chat-interface.tsx @@ -91,7 +91,7 @@ import { historyItemsToInputBlocks, hasReportedPreviewTarget, isSessionGoalCleared, - isSessionGoalWorking, + isSessionGoalActive, normalizeSessionInputBlocks, normalizeSessionTurnInputConfig, resolveSessionConversationConfig, @@ -178,6 +178,11 @@ import { PullRequestBadge } from './pull-request-badge'; import { SessionInfoBar } from './session-info-bar'; import type { ContextChipAction, PrCiRun } from './session-info-chips'; import { resolveSessionInfoBarGitHubActionIds } from './session-info-action-state'; +import { + canPauseGoalThroughPromptBridge, + getPromptBridgeGoalCommands, + isSessionPromptBusy, +} from './session-goal-control'; import { buildFixCiErrorsPrompt, buildResolvePrConflictsPrompt } from './session-pr-prompts'; import { resolveConflictsActionAtomFamily } from './session-pr-agent-action'; import { setPreferredPrMergeMethod, usePreferredPrMergeMethod } from './pr-merge-method'; @@ -367,7 +372,6 @@ interface ActionOption { const ACTION_OPTIONS: ActionOption[] = [{ id: 'copy-path', label: 'Copy Path', Icon: Copy }]; const EMPTY_ASSISTANT_QUICK_ACTIONS: AssistantMessageAction[] = []; - const DISPATCHING_TIMEOUT_MS = 15_000; /** Grace before the header "Syncing" spinner appears (kills session-switch flicker). */ const TITLE_SYNCING_INDICATOR_DELAY_MS = 400; @@ -2411,7 +2415,12 @@ export const SessionChatInterface = memo( ), [legacySession.latestGoal, session.dismissedGoalThreadId, sessionHistory] ); - const isGoalWorking = isSessionGoalWorking(latestGoal); + const isGoalActive = isSessionGoalActive(latestGoal); + // The existing prompt bridge is Codex-specific. Other providers may publish + // neutral goal snapshots, but their advertised `_session/goal` extension is + // not yet routed through Lody's session control plane, so keep them read-only. + const goalCommands = getPromptBridgeGoalCommands(session.agentType); + const canPauseGoal = canPauseGoalThroughPromptBridge(session.agentType); useEffect(() => { if (!pendingGoalCommand) { @@ -2603,7 +2612,7 @@ export const SessionChatInterface = memo( if ( session.isArchived || session.autoReview || - isGoalWorking || + isGoalActive || session.cliType !== 'builtin' || (session.agentType !== 'codex' && session.agentType !== 'claude') ) { @@ -2643,7 +2652,7 @@ export const SessionChatInterface = memo( // The first user message uses session/new and therefore has no fork boundary. return userMessage.id; }, [ - isGoalWorking, + isGoalActive, session.agentConfigId, session.agentType, session.autoReview, @@ -3125,8 +3134,13 @@ export const SessionChatInterface = memo( }, [markSessionRead, session.id, session.lastMessageAt, shouldMarkRead]); const isDispatching = inputActionState === 'dispatching'; - const isAgentBusy = isDispatching || isSessionWorking || isGoalWorking; - const canStopAgent = (isSessionActive && activeAssistantTurnId != null) || isGoalWorking; + const isAgentBusy = isSessionPromptBusy({ + isDispatching, + isSessionWorking, + isGoalActive, + }); + const canStopAgent = + (isSessionActive && activeAssistantTurnId != null) || (isGoalActive && canPauseGoal); const latestCompletedProposedPlan = useMemo( () => findLatestCompletedCodexProposedPlan(sessionDoc?.history), [sessionDoc?.history] @@ -3253,9 +3267,7 @@ export const SessionChatInterface = memo( // connection/machine problem (browser offline, machine removed or // offline) hands the story to the status chip instead. t('sessions.statusIndicator.pendingDispatch') - : isGoalWorking - ? t('sessions.statusIndicator.goal', 'Pursuing goal') - : null; + : null; const agentActivityTone = isSessionActive && liveSessionStatus?.type === 'requestPermission' ? 'warning' : 'primary'; @@ -3733,6 +3745,17 @@ export const SessionChatInterface = memo( goal: Extract | null = latestGoal, options?: { showPending?: boolean } ): Promise => { + if (!goalCommands.includes(command)) { + captureSessionEvent('session/goal_command_failed', { + command, + goal_thread_id: goal?.threadId ?? null, + error_name: 'UnsupportedGoalCommand', + error_message: 'Goal command is unavailable for this agent transport', + }); + toast.error(t('sessions.goal.commandError', 'Failed to send goal command')); + return false; + } + if (!goal) { toast.error(t('sessions.goal.commandError', 'Failed to send goal command')); return false; @@ -3772,7 +3795,7 @@ export const SessionChatInterface = memo( return false; } }, - [captureSessionEvent, dispatchPrompt, latestGoal, t] + [captureSessionEvent, dispatchPrompt, goalCommands, latestGoal, t] ); const handleGoalCardCommand = useCallback( @@ -4343,7 +4366,7 @@ export const SessionChatInterface = memo( return undefined; } - if (isSessionWorking || isGoalWorking) { + if (isSessionWorking) { setInputActionState('ready'); return undefined; } @@ -4357,7 +4380,7 @@ export const SessionChatInterface = memo( }, DISPATCHING_TIMEOUT_MS); return () => window.clearTimeout(timeoutId); - }, [captureSessionEvent, inputActionState, isGoalWorking, isSessionWorking, liveSessionStatus]); + }, [captureSessionEvent, inputActionState, isSessionWorking, liveSessionStatus]); useEffect(() => { if (hideMessageArea) return undefined; @@ -4441,7 +4464,7 @@ export const SessionChatInterface = memo( return; } - const goalToPause = isGoalWorking ? latestGoal : null; + const goalToPause = isGoalActive && canPauseGoal ? latestGoal : null; const goalTurnId = goalToPause?.turnId?.trim() || null; const turnIdToCancel = activeAssistantTurnId ?? goalTurnId; @@ -4493,9 +4516,10 @@ export const SessionChatInterface = memo( } }, [ activeAssistantTurnId, + canPauseGoal, captureSessionEvent, handleGoalCommand, - isGoalWorking, + isGoalActive, latestGoal, requestSessionCancel, session.id, @@ -5334,9 +5358,7 @@ export const SessionChatInterface = memo( and the actual grant/deny resolves on the settings page, so these must be emitted from that component via onShown/onEnableClicked/onDismissed callbacks (see crossFileNeeds). */} {/* An active auto-review run states itself here rather than @@ -5379,6 +5401,7 @@ export const SessionChatInterface = memo( lastReadAt); const isWaiting = activeSessionLiveStatus?.type === 'requestPermission'; - const legacyActiveSession = activeSession as SessionLegacyMetaFields; - // CLI-reported presence (plus goal state) is the fact source for - // "working"; meta dispatch pointers are CLI mechanics and can be stale. - const isWorking = - activeSessionLiveStatus != null || isSessionGoalWorking(legacyActiveSession.latestGoal); + // CLI-reported presence is the fact source for "working"; persistent goal + // state and meta dispatch pointers do not imply a prompt is running. + const isWorking = activeSessionLiveStatus != null; if (isWaiting) return 'waiting'; if (isWorking) return 'working'; if (hasUnread) return 'unread'; @@ -3838,7 +3834,6 @@ const SessionDetail = ({ ? activeSession : (visibleChildSessions.find((s) => s.id === tabId) ?? null); const draft = meta ? null : (draftTabs.find((d) => d.id === tabId) ?? null); - const legacy = meta as SessionLegacyMetaFields | null; const lastMessageAt = typeof meta?.lastMessageAt === 'number' ? meta.lastMessageAt : null; const lastReadAt = typeof meta?.lastReadAt === 'number' ? meta.lastReadAt : null; return { @@ -3849,9 +3844,7 @@ const SessionDetail = ({ t('sessions.tabs.newTab', 'New Tab'), active: conversationTabActive && tabId === activeTabSessionId, main: tabId === sessionId, - running: - meta != null && - (conversationWorkingMap[tabId] === true || isSessionGoalWorking(legacy?.latestGoal)), + running: meta != null && conversationWorkingMap[tabId] === true, unread: meta != null && lastMessageAt !== null && diff --git a/packages/components/src/components/sessions/session-goal-banner.tsx b/packages/components/src/components/sessions/session-goal-banner.tsx index bda866fe8a..a4abbbfa29 100644 --- a/packages/components/src/components/sessions/session-goal-banner.tsx +++ b/packages/components/src/components/sessions/session-goal-banner.tsx @@ -30,6 +30,8 @@ export type SessionGoalBannerCommandHandler = ( interface SessionGoalBannerProps { goal: SessionGoalMessage | null | undefined; + /** Commands the current session transport can safely dispatch. */ + commands?: readonly SessionGoalCommand[]; pendingCommand?: SessionGoalCommand | null; onGoalCommand?: SessionGoalBannerCommandHandler; /** Dismiss the banner once the goal is in a terminal state. When omitted @@ -117,6 +119,7 @@ export const formatTokensCompact = (value: number): string => { */ export const SessionGoalBanner = memo(function SessionGoalBanner({ goal, + commands, pendingCommand, onGoalCommand, onDismiss, @@ -167,9 +170,12 @@ export const SessionGoalBanner = memo(function SessionGoalBanner({ const statusLabel = t(meta.labelKey, meta.fallbackLabel); const isPending = pendingCommand != null; const isCleared = isSessionGoalCleared(goal); - const showPause = goal.status === 'active' && onGoalCommand != null; - const showResume = goal.status === 'paused' && onGoalCommand != null; - const showClear = !isCleared && onGoalCommand != null; + const showPause = + goal.status === 'active' && commands?.includes('pause') === true && onGoalCommand != null; + const showResume = + goal.status === 'paused' && commands?.includes('resume') === true && onGoalCommand != null; + const showClear = + !isCleared && commands?.includes('clear') === true && onGoalCommand != null; const showDismiss = isCleared && onDismiss != null; const triggerCommand = (command: SessionGoalCommand) => { diff --git a/packages/components/src/components/sessions/session-goal-control.ts b/packages/components/src/components/sessions/session-goal-control.ts new file mode 100644 index 0000000000..970ebf196a --- /dev/null +++ b/packages/components/src/components/sessions/session-goal-control.ts @@ -0,0 +1,31 @@ +import { SESSION_GOAL_COMMANDS, type SessionGoalCommand } from '@lody/shared'; + +const NO_GOAL_COMMANDS: readonly SessionGoalCommand[] = []; + +/** + * Commands supported by Lody's current `/goal …` prompt bridge. + * + * Provider-neutral goal snapshots are displayable for every ACP agent, but the + * prompt bridge itself is Codex-specific. Other providers remain read-only until + * Lody routes their advertised `_session/goal` extension method. + */ +export const getPromptBridgeGoalCommands = ( + agentType: string | null | undefined +): readonly SessionGoalCommand[] => + agentType === 'codex' ? SESSION_GOAL_COMMANDS : NO_GOAL_COMMANDS; + +export const canPauseGoalThroughPromptBridge = ( + agentType: string | null | undefined +): boolean => getPromptBridgeGoalCommands(agentType).includes('pause'); + +export type SessionPromptActivity = { + isDispatching: boolean; + isSessionWorking: boolean; + /** Persistent goal state is intentionally not a prompt-activity signal. */ + isGoalActive: boolean; +}; + +export const isSessionPromptBusy = ({ + isDispatching, + isSessionWorking, +}: SessionPromptActivity): boolean => isDispatching || isSessionWorking; diff --git a/packages/components/src/components/sessions/session-info-bar.tsx b/packages/components/src/components/sessions/session-info-bar.tsx index d207f066d3..788fe906de 100644 --- a/packages/components/src/components/sessions/session-info-bar.tsx +++ b/packages/components/src/components/sessions/session-info-bar.tsx @@ -31,6 +31,7 @@ export type SessionInfoBarProps = { onOpenTask?: (taskId: string) => void; /** Active/paused/terminal goal snapshot; the chip replaces the old sticky top banner. */ goal?: SessionGoalMessage | null; + goalCommands?: readonly SessionGoalCommand[]; goalPendingCommand?: SessionGoalCommand | null; onGoalCommand?: GoalChipCommandHandler; onGoalDismiss?: (goal: SessionGoalMessage) => void; @@ -103,6 +104,7 @@ export type SessionInfoBarProps = { export function SessionInfoBar({ status, goal, + goalCommands, goalPendingCommand, onGoalCommand, onGoalDismiss, @@ -224,6 +226,7 @@ export function SessionInfoBar({ void; @@ -161,9 +164,12 @@ export function GoalChip({ const isPending = pendingCommand != null; const isCleared = isSessionGoalCleared(goal); - const showPause = goal.status === 'active' && onGoalCommand != null; - const showResume = goal.status === 'paused' && onGoalCommand != null; - const showClear = !isCleared && onGoalCommand != null; + const showPause = + goal.status === 'active' && commands?.includes('pause') === true && onGoalCommand != null; + const showResume = + goal.status === 'paused' && commands?.includes('resume') === true && onGoalCommand != null; + const showClear = + !isCleared && commands?.includes('clear') === true && onGoalCommand != null; const showDismiss = isCleared && onDismiss != null; const durationUnitLabels: DurationUnitLabels = { diff --git a/packages/components/src/components/sessions/session-list-rows.ts b/packages/components/src/components/sessions/session-list-rows.ts index 5e5d485f55..221e6fb728 100644 --- a/packages/components/src/components/sessions/session-list-rows.ts +++ b/packages/components/src/components/sessions/session-list-rows.ts @@ -4,14 +4,12 @@ import type { PrStatus, SessionPullRequestCiState, SessionPullRequestReadiness, - SessionLegacyMetaFields, SessionMeta, SessionStatus, } from '@lody/shared'; import { deriveSessionPullRequestReadiness, getSessionPullRequestLegacyFields, - isSessionGoalWorking, parseGitHubPrNumber, resolveProjectGitHubRepo, } from '@lody/shared'; @@ -122,12 +120,11 @@ export function getEffectiveSessionActivitySummary( childSessionsByParent?: Map, liveSessionStatuses?: ReadonlyMap ): EffectiveSessionActivitySummary { - const legacy = session as SessionLegacyMetaFields; const liveStatus = liveSessionStatuses?.get(session.id); - // Sidebar working state is presence/goal only. Meta dispatch pointers are - // CLI dispatch mechanics and can be stale in this client — deriving a - // spinner from them shows sessions as working long after they finished. - let isWorking = liveStatus != null || isSessionGoalWorking(legacy.latestGoal); + // Sidebar working state is live presence only. A goal may remain active while + // quiescent, and meta dispatch pointers can be stale in this client — deriving + // a spinner from either shows sessions as working long after the prompt finished. + let isWorking = liveStatus != null; let isWaitingPermission = liveStatus?.type === 'requestPermission'; let hasUnreadMessages = sessionHasUnreadMessages(session); let latestMessageAt = @@ -136,12 +133,8 @@ export function getEffectiveSessionActivitySummary( const children = childSessionsByParent?.get(session.id); if (children) { for (const child of children) { - const legacyChild = child as SessionLegacyMetaFields; const childLiveStatus = liveSessionStatuses?.get(child.id); - if ( - !isWorking && - (childLiveStatus != null || isSessionGoalWorking(legacyChild.latestGoal)) - ) { + if (!isWorking && childLiveStatus != null) { isWorking = true; } if (!isWaitingPermission && childLiveStatus?.type === 'requestPermission') { @@ -246,8 +239,7 @@ export function mapSessionMetaToSessionListRow( latestMessageAt, addedLines: lineChange.add, deletedLines: lineChange.del, - isWorking: - liveStatus != null || isSessionGoalWorking((session as SessionLegacyMetaFields).latestGoal), + isWorking: liveStatus != null, hasUnreadMessages, isOffline, isWaitingPermission: liveStatus?.type === 'requestPermission', diff --git a/packages/components/src/components/sessions/session-tab-bar.tsx b/packages/components/src/components/sessions/session-tab-bar.tsx index 0061c1748b..fe08cac222 100644 --- a/packages/components/src/components/sessions/session-tab-bar.tsx +++ b/packages/components/src/components/sessions/session-tab-bar.tsx @@ -3,9 +3,7 @@ import { Plus, Loader2, X, History, Undo2, Pin, FileDiff } from 'lucide-react'; import { cn } from '@/lib/utils'; import { getSessionLaunchConfigLegacyFields, - isSessionGoalWorking, type SessionId, - type SessionLegacyMetaFields, type SessionMeta, } from '@lody/shared'; import { useTranslation } from 'react-i18next'; @@ -182,9 +180,8 @@ function TabContent({ isL2Focus: boolean; t: (key: string, fallback: string) => string; }) { - const legacy = session as SessionLegacyMetaFields; const liveStatus = useAtomValue(sessionLiveStatusAtomFamily(session.id)); - const isWorking = liveStatus != null || isSessionGoalWorking(legacy.latestGoal); + const isWorking = liveStatus != null; const isWaiting = liveStatus?.type === 'requestPermission'; const label = getTabLabel(session, isParent, defaultTitle, t); const showClose = !isParent && onTabClose && !isEditing; diff --git a/packages/components/src/components/sessions/session-tasklist-mapping.ts b/packages/components/src/components/sessions/session-tasklist-mapping.ts index 07e7082f5f..9d3fab841f 100644 --- a/packages/components/src/components/sessions/session-tasklist-mapping.ts +++ b/packages/components/src/components/sessions/session-tasklist-mapping.ts @@ -4,14 +4,12 @@ import type { PrStatus, SessionPullRequestCiState, SessionPullRequestReadiness, - SessionLegacyMetaFields, SessionMeta, SessionStatus, } from '@lody/shared'; import { deriveSessionPullRequestReadiness, getSessionPullRequestLegacyFields, - isSessionGoalWorking, parseGitHubPrNumber, resolveProjectGitHubRepo, } from '@lody/shared'; @@ -122,12 +120,11 @@ export function getEffectiveSessionActivitySummary( childSessionsByParent?: Map, liveSessionStatuses?: ReadonlyMap ): EffectiveSessionActivitySummary { - const legacy = session as SessionLegacyMetaFields; const liveStatus = liveSessionStatuses?.get(session.id); - // Sidebar working state is presence/goal only. Meta dispatch pointers are - // CLI dispatch mechanics and can be stale in this client — deriving a - // spinner from them shows sessions as working long after they finished. - let isWorking = liveStatus != null || isSessionGoalWorking(legacy.latestGoal); + // Sidebar working state is live presence only. A goal may remain active while + // quiescent, and meta dispatch pointers can be stale in this client — deriving + // a spinner from either shows sessions as working long after the prompt finished. + let isWorking = liveStatus != null; let isWaitingPermission = liveStatus?.type === 'requestPermission'; let hasUnreadMessages = sessionHasUnreadMessages(session); let latestMessageAt = @@ -136,12 +133,8 @@ export function getEffectiveSessionActivitySummary( const children = childSessionsByParent?.get(session.id); if (children) { for (const child of children) { - const legacyChild = child as SessionLegacyMetaFields; const childLiveStatus = liveSessionStatuses?.get(child.id); - if ( - !isWorking && - (childLiveStatus != null || isSessionGoalWorking(legacyChild.latestGoal)) - ) { + if (!isWorking && childLiveStatus != null) { isWorking = true; } if (!isWaitingPermission && childLiveStatus?.type === 'requestPermission') { @@ -246,8 +239,7 @@ export function mapSessionMetaToTaskListTask( latestMessageAt, addedLines: lineChange.add, deletedLines: lineChange.del, - isWorking: - liveStatus != null || isSessionGoalWorking((session as SessionLegacyMetaFields).latestGoal), + isWorking: liveStatus != null, hasUnreadMessages, isOffline, isWaitingPermission: liveStatus?.type === 'requestPermission', diff --git a/packages/components/src/lib/session-completion-notification.ts b/packages/components/src/lib/session-completion-notification.ts index 0b692bb760..fc408329bf 100644 --- a/packages/components/src/lib/session-completion-notification.ts +++ b/packages/components/src/lib/session-completion-notification.ts @@ -1,4 +1,4 @@ -import { isSessionGoalWorking, type SessionGoalMessage } from '@lody/shared'; +import type { SessionGoalMessage } from '@lody/shared'; export function isAppForeground(): boolean { return typeof document !== 'undefined' && document.visibilityState === 'visible' && document.hasFocus(); @@ -23,14 +23,12 @@ export function shouldNotifySessionCompletion({ enabled, previousStatusType, currentStatusType, - latestGoal, }: ShouldNotifySessionCompletionInput): boolean { return ( initialized && enabled && previousStatusType !== undefined && previousStatusType !== 'idle' && - currentStatusType === 'idle' && - !isSessionGoalWorking(latestGoal) + currentStatusType === 'idle' ); } diff --git a/packages/components/src/stories/SessionConversationPage.stories.tsx b/packages/components/src/stories/SessionConversationPage.stories.tsx index 327e201e6f..2ff97ed6de 100644 --- a/packages/components/src/stories/SessionConversationPage.stories.tsx +++ b/packages/components/src/stories/SessionConversationPage.stories.tsx @@ -36,6 +36,7 @@ import { getMachineRoomId, getServerNow, getSessionRoomId, + SESSION_GOAL_COMMANDS, type AgentConfigId, type AgentConfigMeta, type LodyPresenceInstanceId, @@ -656,6 +657,7 @@ function StoryInfoBar({ session }: { session: SessionMeta }) { objective: 'Ship the session info bar and wire it into production.', status: 'active', }} + goalCommands={SESSION_GOAL_COMMANDS} onGoalCommand={fn()} scheduledTasks={[ { diff --git a/packages/components/src/stories/SessionGoalBanner.stories.tsx b/packages/components/src/stories/SessionGoalBanner.stories.tsx index b2a0232026..eeb29e44e7 100644 --- a/packages/components/src/stories/SessionGoalBanner.stories.tsx +++ b/packages/components/src/stories/SessionGoalBanner.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { fn } from 'storybook/test'; -import type { SessionGoalMessage } from '@lody/shared'; +import { SESSION_GOAL_COMMANDS, type SessionGoalMessage } from '@lody/shared'; import { SessionGoalBanner } from '@/components/sessions/session-goal-banner'; const baseGoal: SessionGoalMessage = { @@ -35,6 +35,9 @@ const longObjective = const meta = { title: 'Sessions/SessionGoalBanner', component: SessionGoalBanner, + args: { + commands: SESSION_GOAL_COMMANDS, + }, parameters: { layout: 'padded', }, diff --git a/packages/components/src/stories/SessionInfoBar.stories.tsx b/packages/components/src/stories/SessionInfoBar.stories.tsx index 0eb3ba8507..95e0f85c6b 100644 --- a/packages/components/src/stories/SessionInfoBar.stories.tsx +++ b/packages/components/src/stories/SessionInfoBar.stories.tsx @@ -3,6 +3,7 @@ import { useState } from 'react'; import { fn } from 'storybook/test'; import { getServerNow, + SESSION_GOAL_COMMANDS, type GitHubMergeMethod, type PendingScheduledTask, type SessionGoalCommand, @@ -157,6 +158,7 @@ function StoryHarness({ setCurrentGoal(null)} @@ -513,6 +515,7 @@ function PeekPlayground() { setGoal(null)} scheduledTasks={tasks} diff --git a/packages/components/tests/live-activity-sessions.test.ts b/packages/components/tests/live-activity-sessions.test.ts index 9ef56ef65b..e6c63ec08a 100644 --- a/packages/components/tests/live-activity-sessions.test.ts +++ b/packages/components/tests/live-activity-sessions.test.ts @@ -133,6 +133,33 @@ describe('buildLiveActivityConversationItems', () => { ).toEqual({ permission: 2, question: 0, running: 1, unread: 1 }); }); + it('does not report a quiescent session as running only because its goal is active', () => { + const session = { + ...baseSession, + status: { type: 'idle' }, + lastMessageAt: 100, + lastReadAt: 200, + latestGoal: { + type: 'goal', + threadId: 'thread-1', + objective: 'Keep the objective available', + status: 'active', + }, + } as unknown as SessionMeta; + + expect(buildItems([session])).toEqual([]); + expect( + buildLiveActivityConversationItems({ + sessions: [session], + currentUserId: 'user-1', + defaultTitle: 'New Task', + statusLabels: labels, + formatUpdatedAt: (updatedAt) => String(updatedAt), + liveSessionStatuses: new Map(), + }) + ).toEqual([]); + }); + it('builds an alert candidate for the latest permission request', () => { const sessions = [ { diff --git a/packages/components/tests/session-completion-notification.test.ts b/packages/components/tests/session-completion-notification.test.ts index 44a9b3968b..2707859233 100644 --- a/packages/components/tests/session-completion-notification.test.ts +++ b/packages/components/tests/session-completion-notification.test.ts @@ -30,7 +30,7 @@ describe('shouldNotifySessionCompletion', () => { ).toBe(true); }); - it('suppresses normal completion notifications while a goal is still active', () => { + it('notifies when a prompt completes while a persistent goal remains active', () => { expect( shouldNotifySessionCompletion({ initialized: true, @@ -39,7 +39,7 @@ describe('shouldNotifySessionCompletion', () => { currentStatusType: 'idle', latestGoal: activeGoal, }) - ).toBe(false); + ).toBe(true); }); it('does not suppress when the latest goal is no longer active', () => { diff --git a/packages/components/tests/session-goal-control.test.ts b/packages/components/tests/session-goal-control.test.ts new file mode 100644 index 0000000000..f430bf583b --- /dev/null +++ b/packages/components/tests/session-goal-control.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, it } from 'vitest'; +import { + canPauseGoalThroughPromptBridge, + getPromptBridgeGoalCommands, + isSessionPromptBusy, +} from '../src/components/sessions/session-goal-control'; + +describe('session goal prompt bridge', () => { + it('keeps provider-neutral Claude goals read-only', () => { + expect(getPromptBridgeGoalCommands('claude')).toEqual([]); + expect(canPauseGoalThroughPromptBridge('claude')).toBe(false); + }); + + it('keeps the existing Codex pause, resume, and clear controls', () => { + expect(getPromptBridgeGoalCommands('codex')).toEqual(['pause', 'resume', 'clear']); + expect(canPauseGoalThroughPromptBridge('codex')).toBe(true); + }); + + it('defaults unknown ACP providers to read-only goals', () => { + expect(getPromptBridgeGoalCommands('custom-agent')).toEqual([]); + expect(canPauseGoalThroughPromptBridge(undefined)).toBe(false); + }); + + it('keeps a quiescent session direct-dispatchable while its goal remains active', () => { + expect( + isSessionPromptBusy({ + isDispatching: false, + isSessionWorking: false, + isGoalActive: true, + }) + ).toBe(false); + }); + + it('reports only dispatch and live turn activity as prompt-busy', () => { + expect( + isSessionPromptBusy({ + isDispatching: true, + isSessionWorking: false, + isGoalActive: false, + }) + ).toBe(true); + expect( + isSessionPromptBusy({ + isDispatching: false, + isSessionWorking: true, + isGoalActive: false, + }) + ).toBe(true); + }); +}); diff --git a/packages/components/tests/session-info-bar-syncing.test.tsx b/packages/components/tests/session-info-bar-syncing.test.tsx index c9c96edcdf..a63f002f50 100644 --- a/packages/components/tests/session-info-bar-syncing.test.tsx +++ b/packages/components/tests/session-info-bar-syncing.test.tsx @@ -3,6 +3,7 @@ import { act } from 'react'; import { createRoot, type Root } from 'react-dom/client'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { SESSION_GOAL_COMMANDS, type SessionGoalMessage } from '@lody/shared'; import { SessionInfoBar } from '../src/components/sessions/session-info-bar'; vi.mock('react-i18next', () => ({ @@ -23,6 +24,13 @@ const CONTEXT_LESS_PROPS = { diffStat: null, } as const; +const ACTIVE_GOAL: SessionGoalMessage = { + type: 'goal', + threadId: 'thread-1', + objective: 'Ship the ACP update', + status: 'active', +}; + describe('SessionInfoBar syncing indicator', () => { let container: HTMLDivElement; let root: Root; @@ -82,4 +90,46 @@ describe('SessionInfoBar syncing indicator', () => { expect(container.textContent).toContain('loro-dev/lody'); expect(container.textContent).toContain('Syncing'); }); + + it('keeps a neutral goal read-only when no commands are supported', () => { + act(() => { + root.render( + + ); + }); + + act(() => container.querySelector('button[aria-label="Goal"]')?.click()); + + expect(document.body.textContent).not.toContain('Pause'); + expect(document.body.textContent).not.toContain('Clear'); + }); + + it('shows and dispatches Codex prompt-bridge goal commands', () => { + const onGoalCommand = vi.fn(); + act(() => { + root.render( + + ); + }); + + act(() => container.querySelector('button[aria-label="Goal"]')?.click()); + const pauseButton = Array.from(document.body.querySelectorAll('button')).find( + (button) => button.textContent === 'Pause' + ); + expect(pauseButton).toBeDefined(); + expect(document.body.textContent).toContain('Clear'); + + act(() => pauseButton?.click()); + expect(onGoalCommand).toHaveBeenCalledWith('pause', ACTIVE_GOAL); + }); }); diff --git a/packages/shared/src/ai.ts b/packages/shared/src/ai.ts index ec4c9ab217..6f987bf3da 100644 --- a/packages/shared/src/ai.ts +++ b/packages/shared/src/ai.ts @@ -1074,13 +1074,13 @@ export type SessionGoalContent = { objective: string; status: SessionGoalStatus; tokenBudget?: number | null; - /** Legacy Codex goal telemetry. Current ACP goal snapshots do not report it. */ + /** Legacy Codex goal telemetry. Current ACP goal snapshots may omit it. */ tokensUsed?: number; - /** Legacy Codex goal telemetry. Current ACP goal snapshots do not report it. */ + /** Legacy Codex goal telemetry. Current ACP goal snapshots may omit it. */ timeUsedSeconds?: number; - /** Legacy goal timestamp retained for previously persisted history. */ + /** ACP goal timestamp; legacy history may also contain it. */ createdAt?: number; - /** Legacy goal timestamp retained for previously persisted history. */ + /** ACP goal timestamp; legacy history may also contain it. */ updatedAt?: number; }; diff --git a/packages/shared/src/goal.ts b/packages/shared/src/goal.ts index 0a9b2820da..f5d31fb095 100644 --- a/packages/shared/src/goal.ts +++ b/packages/shared/src/goal.ts @@ -92,9 +92,16 @@ export const resolveVisibleSessionGoal = ( return resolved; }; -export const isSessionGoalWorking = (goal: SessionGoalMessage | null | undefined): boolean => +/** A persistent objective can be active while the ACP session has no running prompt. */ +export const isSessionGoalActive = (goal: SessionGoalMessage | null | undefined): boolean => goal?.status === 'active'; +/** + * @deprecated Use `isSessionGoalActive`. This reports persistent goal state, + * not whether an ACP prompt is currently running. + */ +export const isSessionGoalWorking = isSessionGoalActive; + export const isSessionGoalPaused = (goal: SessionGoalMessage | null | undefined): boolean => goal?.status === 'paused'; diff --git a/packages/shared/src/live-activity-summary.ts b/packages/shared/src/live-activity-summary.ts index f82c9b7454..2130da6d38 100644 --- a/packages/shared/src/live-activity-summary.ts +++ b/packages/shared/src/live-activity-summary.ts @@ -1,6 +1,5 @@ -import type { AgentConfigMeta, SessionLegacyMetaFields, SessionMeta, SessionStatus } from './schema'; +import type { AgentConfigMeta, SessionMeta, SessionStatus } from './schema'; import { isSessionActiveWithHeartbeat } from './session-status-machine'; -import { isSessionGoalWorking } from './goal'; import { resolveAgentBrandId, type AgentBrandId } from './agent-brand'; import { getSessionLaunchConfigLegacyFields } from './machine-flock'; @@ -104,13 +103,11 @@ function resolveStatus( liveSessionStatuses?: ReadonlyMap ): LiveActivityConversationStatus | null { const liveStatus = liveSessionStatuses?.get(session.id); - const legacy = session as SessionLegacyMetaFields; - if (liveSessionStatuses) { if (liveStatus?.type === 'requestPermission') { return 'permission'; } - if (liveStatus != null || isSessionGoalWorking(legacy.latestGoal)) { + if (liveStatus != null) { return 'running'; } } else { @@ -118,7 +115,7 @@ function resolveStatus( if (session.status?.type === 'requestPermission') { return isHeartbeatActive ? 'permission' : null; } - if (isHeartbeatActive || isSessionGoalWorking(legacy.latestGoal)) { + if (isHeartbeatActive) { return 'running'; } } diff --git a/packages/shared/tests/goal.test.ts b/packages/shared/tests/goal.test.ts index b02f17dea9..ddc3c86a9b 100644 --- a/packages/shared/tests/goal.test.ts +++ b/packages/shared/tests/goal.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from 'vitest'; import { isSessionGoalComplete, isSessionGoalPaused, + isSessionGoalActive, isSessionGoalWorking, resolveLatestSessionGoalFromHistory, resolveVisibleSessionGoal, @@ -102,11 +103,15 @@ describe('session goal state helpers', () => { }); }); - it('maps goal statuses to working/paused/complete states', () => { - expect(isSessionGoalWorking(goal)).toBe(true); + it('maps goal statuses to active/paused/complete states', () => { + expect(isSessionGoalActive(goal)).toBe(true); expect(isSessionGoalPaused({ ...goal, status: 'paused' })).toBe(true); expect(isSessionGoalComplete({ ...goal, status: 'complete' })).toBe(true); - expect(isSessionGoalWorking({ ...goal, status: 'complete' })).toBe(false); + expect(isSessionGoalActive({ ...goal, status: 'complete' })).toBe(false); + }); + + it('keeps the legacy working helper as an active-state compatibility alias', () => { + expect(isSessionGoalWorking(goal)).toBe(isSessionGoalActive(goal)); }); it('shows a new goal on the same Codex thread after dismissing the cleared snapshot', () => { diff --git a/packages/shared/tests/message-schemas.test.ts b/packages/shared/tests/message-schemas.test.ts index d1e476bc55..c1b069cd8e 100644 --- a/packages/shared/tests/message-schemas.test.ts +++ b/packages/shared/tests/message-schemas.test.ts @@ -127,13 +127,14 @@ describe('message-schemas system_notice', () => { expect(result.success).toBe(true); }); - it('accepts current sparse Codex goal content', () => { + it('accepts normalized provider-neutral goal content', () => { const result = MessageContentSchema.safeParse({ type: 'goal', threadId: 'thread-1', objective: 'ship the release', - status: 'active', - tokenBudget: null, + status: 'blocked', + tokenBudget: 42_000, + tokensUsed: 12_000, }); expect(result.success).toBe(true); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index addf8b8d3a..4a7f622011 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -214,7 +214,7 @@ importers: version: 1.3.0(zod@4.3.6) '@anthropic-ai/claude-agent-sdk': specifier: 0.3.220 - version: 0.3.220(@anthropic-ai/sdk@0.114.0(zod@4.3.6))(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(zod@4.3.6) + version: 0.3.220(@anthropic-ai/sdk@0.115.0(zod@4.3.6))(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(zod@4.3.6) '@better-auth/api-key': specifier: 'catalog:' version: 1.5.5(patch_hash=ba3020ffdebafda4df4a616ccbcdb40c0101374c9fe08e0a8f87c5c96102f054)(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(better-auth@1.5.5(f00b050de135afaee0bf8a26fdaa86ac)) @@ -545,7 +545,7 @@ importers: version: 1.3.0(zod@4.3.6) '@anthropic-ai/claude-agent-sdk': specifier: 0.3.220 - version: 0.3.220(@anthropic-ai/sdk@0.114.0(zod@4.3.6))(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(zod@4.3.6) + version: 0.3.220(@anthropic-ai/sdk@0.115.0(zod@4.3.6))(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(zod@4.3.6) acp-extension-core: specifier: workspace:* version: link:../acp-extension-core @@ -554,44 +554,44 @@ importers: version: 4.3.6 devDependencies: '@anthropic-ai/sdk': - specifier: 0.114.0 - version: 0.114.0(zod@4.3.6) + specifier: 0.115.0 + version: 0.115.0(zod@4.3.6) '@eslint/js': specifier: 10.0.1 - version: 10.0.1(eslint@10.7.0(jiti@2.7.0)) + version: 10.0.1(eslint@10.8.0(jiti@2.7.0)) '@tsconfig/node22': specifier: 22.0.5 version: 22.0.5 '@types/node': - specifier: 26.1.1 - version: 26.1.1 + specifier: 26.1.2 + version: 26.1.2 '@typescript-eslint/eslint-plugin': specifier: 8.65.0 - version: 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) + version: 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/parser': specifier: 8.65.0 - version: 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) + version: 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) eslint: - specifier: 10.7.0 - version: 10.7.0(jiti@2.7.0) + specifier: 10.8.0 + version: 10.8.0(jiti@2.7.0) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@10.7.0(jiti@2.7.0)) + version: 10.1.8(eslint@10.8.0(jiti@2.7.0)) globals: - specifier: 17.7.0 - version: 17.7.0 + specifier: 17.9.0 + version: 17.9.0 prettier: specifier: 3.9.6 version: 3.9.6 ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.15.11)(@swc/wasm@1.15.11)(@types/node@26.1.1)(typescript@6.0.3) + version: 10.9.2(@swc/core@1.15.11)(@swc/wasm@1.15.11)(@types/node@26.1.2)(typescript@6.0.3) typescript: specifier: 6.0.3 version: 6.0.3 vitest: specifier: 4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@26.1.1)(jsdom@26.1.0)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@26.1.2)(jsdom@26.1.0)(vite@8.1.5(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) packages/acp-extension-codex: dependencies: @@ -599,8 +599,8 @@ importers: specifier: ^1.3.0 version: 1.3.0(zod@4.3.6) '@openai/codex': - specifier: ^0.145.0 - version: 0.145.0 + specifier: ^0.147.0 + version: 0.147.0 diff: specifier: ^9.0.0 version: 9.0.0 @@ -792,7 +792,7 @@ importers: version: 0.10.9(@assistant-ui/react@0.10.50(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(immer@11.1.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)))(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@better-auth/electron': specifier: 'catalog:' - version: 1.5.5(patch_hash=c0bab8bf6f42816473109d61f757f961d4f3bcc1b1cd07c4fe7c2f012fd291ac)(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-auth@1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8))(better-call@1.3.2(zod@4.3.6))(conf@15.1.0)(electron@39.5.1) + version: 1.5.5(patch_hash=c0bab8bf6f42816473109d61f757f961d4f3bcc1b1cd07c4fe7c2f012fd291ac)(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-auth@1.5.5(affc8643d2a62eb147455ed14c80743d))(better-call@1.3.2(zod@4.3.6))(conf@15.1.0)(electron@39.5.1) '@capacitor/browser': specifier: ^8.0.0 version: 8.0.3(@capacitor/core@8.5.0) @@ -804,7 +804,7 @@ importers: version: 8.0.1(@capacitor/core@8.5.0) '@convex-dev/better-auth': specifier: 'catalog:' - version: 0.11.2(@standard-schema/spec@1.1.0)(better-auth@1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8))(convex@1.33.1(react@18.3.1))(hono@4.12.14)(react@18.3.1)(typescript@5.9.3) + version: 0.11.2(@standard-schema/spec@1.1.0)(better-auth@1.5.5(affc8643d2a62eb147455ed14c80743d))(convex@1.33.1(react@18.3.1))(hono@4.12.14)(react@18.3.1)(typescript@5.9.3) '@diceui/shared': specifier: 0.12.0 version: 0.12.0(@floating-ui/react@0.27.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -960,10 +960,10 @@ importers: version: 2.3.5 better-auth: specifier: 'catalog:' - version: 1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8) + version: 1.5.5(affc8643d2a62eb147455ed14c80743d) better-auth-capacitor: specifier: 'catalog:' - version: 0.3.6(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0))(@capacitor/app@8.1.0(@capacitor/core@8.5.0))(@capacitor/core@8.5.0)(@capacitor/preferences@8.0.1(@capacitor/core@8.5.0))(better-auth@1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8)) + version: 0.3.6(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0))(@capacitor/app@8.1.0(@capacitor/core@8.5.0))(@capacitor/core@8.5.0)(@capacitor/preferences@8.0.1(@capacitor/core@8.5.0))(better-auth@1.5.5(affc8643d2a62eb147455ed14c80743d)) broadcast-channel: specifier: ^7.0.0 version: 7.3.0 @@ -1147,10 +1147,10 @@ importers: version: 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@storybook/react': specifier: ^9.0.16 - version: 9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(typescript@5.9.3) + version: 9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(typescript@5.9.3) '@storybook/react-vite': specifier: ^9.0.16 - version: 9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + version: 9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) '@tailwindcss/container-queries': specifier: ^0.1.1 version: 0.1.1(tailwindcss@4.3.0) @@ -1159,13 +1159,13 @@ importers: version: 4.3.0 '@tailwindcss/vite': specifier: ^4.3.0 - version: 4.3.0(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + version: 4.3.0(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) '@tanstack/router-cli': specifier: 1.159.4 version: 1.159.4 '@tanstack/router-plugin': specifier: 'catalog:' - version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + version: 1.159.5(@tanstack/react-router@1.159.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) '@types/debug': specifier: ^4.1.12 version: 4.1.12 @@ -1189,7 +1189,7 @@ importers: version: 13.15.10 '@vitejs/plugin-react': specifier: 'catalog:' - version: 4.7.0(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + version: 4.7.0(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -1201,7 +1201,7 @@ importers: version: 7.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) storybook: specifier: ^9.0.16 - version: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + version: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) tailwindcss: specifier: ^4.3.0 version: 4.3.0 @@ -1210,22 +1210,22 @@ importers: version: 5.9.3 vite: specifier: 'catalog:' - version: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + version: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) vite-plugin-dts: specifier: ^4.5.0 - version: 4.5.4(@types/node@26.1.1)(rollup@4.57.1)(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + version: 4.5.4(@types/node@26.1.2)(rollup@4.57.1)(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) vite-plugin-top-level-await: specifier: ^1.6.0 - version: 1.6.0(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + version: 1.6.0(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) vite-plugin-wasm: specifier: ^3.5.0 - version: 3.5.0(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + version: 3.5.0(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@26.1.1)(jiti@2.7.0)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@26.1.2)(jiti@2.7.0)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) packages/configs: dependencies: @@ -1548,8 +1548,8 @@ packages: '@modelcontextprotocol/sdk': ^1.29.0 zod: 4.3.6 - '@anthropic-ai/sdk@0.114.0': - resolution: {integrity: sha512-zRFGTVMFEm77gt70Q0B+CDRKa9AcguydCcp6bD/dXWv8UkfsVFqCbaqU8+4B/pob3+Vy434LgtrBmwSvxfKr3g==} + '@anthropic-ai/sdk@0.115.0': + resolution: {integrity: sha512-BJrFIVyjNuU8lfDyIJTvlRYzgQg+zEl78BxE7fq8esULsGz9IRQvGtW5spq3tydmtjQb/GFdooKGdGsetpx+lQ==} hasBin: true peerDependencies: zod: 4.3.6 @@ -2801,8 +2801,8 @@ packages: resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@0.17.0': @@ -3400,43 +3400,43 @@ packages: resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} engines: {node: '>=20.0'} - '@openai/codex@0.145.0': - resolution: {integrity: sha512-/PSPSFujjjmiyVFvG2yu/grOFhsWdokTH8t2KGWhXSo/M5n/dIDsnbsnO82/7bLtIoDuzQf7ATBUMWqPWQINlQ==} + '@openai/codex@0.147.0': + resolution: {integrity: sha512-EQLEXecAG2ptxI7UpBMo2TR/ga5596/c/OsYF/0LoUDh5JANZ7IoGqlzBEWbuEVQ76JePIbtTW/ihCkp1a7Z3w==} engines: {node: '>=16'} hasBin: true - '@openai/codex@0.145.0-darwin-arm64': - resolution: {integrity: sha512-h6aQ0UxnaP8mIM/9/qPAH9MNkRliJo88toq1T36IxNM2L5JSU0TFamu+MZn7YkFgDsrp0RfiI+97Tm8AVVxqtA==} + '@openai/codex@0.147.0-darwin-arm64': + resolution: {integrity: sha512-BEUVkiOW7kLcRyrMLfAr/h9wF8sRVJyZDy6OHtVn6QGDXiv3BvAZVTY1Pu9xF7KdIdkYXbp4uayN0aDQQaAUJw==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@openai/codex@0.145.0-darwin-x64': - resolution: {integrity: sha512-FCYzVKCa9VoLtg9gVyzKpqylonfgZrfcWZN6HsXAZPeuo8CukdMqdgTUOhDn2V6h3MbqS0z6VqQVKUllN/yKhA==} + '@openai/codex@0.147.0-darwin-x64': + resolution: {integrity: sha512-Tb8McE5SvJIH0Vs5R6sq7u+quiC931yan2KOOl6km1OdZ82+Wi7eF5XrSFPs5CF7xCgoIK4Vs+byMbT5hN+ZUw==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@openai/codex@0.145.0-linux-arm64': - resolution: {integrity: sha512-8OLcPXaAol/FOrRoDxWhIiHIFa73KRsM41EKocjRZOwiT4TcelzJWn3dHyiuSb7teWF25rrslvSPyvhULYRRCQ==} + '@openai/codex@0.147.0-linux-arm64': + resolution: {integrity: sha512-SLC1JXw2TYfr/c3HhrJubyyLelq7vTOLWVmiThFA+z0+WgzCPmaseJ/kzDD3Gge/TO7fCnnj7UcPmC0d2c8XAg==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@openai/codex@0.145.0-linux-x64': - resolution: {integrity: sha512-u8w8LLv3DvsfrDCoswLIemZ0SoNEXyi511WsfFsSiYUazk9qMsB/NtU8N9vhAfN7mZAxLFoMex4v66JjHuZWwA==} + '@openai/codex@0.147.0-linux-x64': + resolution: {integrity: sha512-0W9MBxPpWW0cSkNqrTDN2jR7rzzT7oNMhQY5446lT2Lw5cz5yhDTck4Va9rjkQEm+HlFzP/dmEMSZbXfJsINmw==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@openai/codex@0.145.0-win32-arm64': - resolution: {integrity: sha512-sub61rjEFevi1i3Zx7nAd4JM5XxoNFqMqFc5LfTo2xSI8ixHjFvEYDFDXwXOftT04n3Ht1Wh271ioUZpDiEjEg==} + '@openai/codex@0.147.0-win32-arm64': + resolution: {integrity: sha512-e2ZstJ8zT8Rm1nvR7CUVO+Gr3cTChE41+VfOzGhynzDXEoW0wfbjUQbc2bWbh1arG94LMm4y3dqBtUIbSrfeGA==} engines: {node: '>=16'} cpu: [arm64] os: [win32] - '@openai/codex@0.145.0-win32-x64': - resolution: {integrity: sha512-u0h9lk094CaXRSqE34SBW2dRaQTPa6fASXqehczWH9QdsU62mBsiAgAdp6tCG4i+YzPmmhjD8FdXNnYGNmwuMg==} + '@openai/codex@0.147.0-win32-x64': + resolution: {integrity: sha512-oT7Ss5fAPf2fiWE9QNURqZcQGAAawSVxmIUdgPzckq4KFZAM+pRz9JbM4Rr498CjtbNgTOjWvDJ+DXvIBSfOPA==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -5716,6 +5716,9 @@ packages: '@types/node@26.1.1': resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} + '@types/node@26.1.2': + resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==} + '@types/pg@8.15.6': resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==} @@ -7803,8 +7806,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.7.0: - resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} + eslint@10.8.0: + resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -8335,8 +8338,8 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} - globals@17.7.0: - resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} + globals@17.9.0: + resolution: {integrity: sha512-m/MvAW61QVU5VDNF1Vj8axt016h8w7L5TU1e9zlab7XIttAT2YAlCwl75K1fOqvMM9apmD7lbCIRhpfkhmxhCg==} engines: {node: '>=18'} globalthis@1.0.4: @@ -12392,9 +12395,9 @@ snapshots: '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.220': optional: true - '@anthropic-ai/claude-agent-sdk@0.3.220(@anthropic-ai/sdk@0.114.0(zod@4.3.6))(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(zod@4.3.6)': + '@anthropic-ai/claude-agent-sdk@0.3.220(@anthropic-ai/sdk@0.115.0(zod@4.3.6))(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(zod@4.3.6)': dependencies: - '@anthropic-ai/sdk': 0.114.0(zod@4.3.6) + '@anthropic-ai/sdk': 0.115.0(zod@4.3.6) '@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6) zod: 4.3.6 optionalDependencies: @@ -12407,7 +12410,7 @@ snapshots: '@anthropic-ai/claude-agent-sdk-win32-arm64': 0.3.220 '@anthropic-ai/claude-agent-sdk-win32-x64': 0.3.220 - '@anthropic-ai/sdk@0.114.0(zod@4.3.6)': + '@anthropic-ai/sdk@0.115.0(zod@4.3.6)': dependencies: json-schema-to-ts: 3.1.1 standardwebhooks: 1.0.0 @@ -12729,12 +12732,12 @@ snapshots: conf: 15.1.0 electron: 39.5.1 - '@better-auth/electron@1.5.5(patch_hash=c0bab8bf6f42816473109d61f757f961d4f3bcc1b1cd07c4fe7c2f012fd291ac)(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-auth@1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8))(better-call@1.3.2(zod@4.3.6))(conf@15.1.0)(electron@39.5.1)': + '@better-auth/electron@1.5.5(patch_hash=c0bab8bf6f42816473109d61f757f961d4f3bcc1b1cd07c4fe7c2f012fd291ac)(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-auth@1.5.5(affc8643d2a62eb147455ed14c80743d))(better-call@1.3.2(zod@4.3.6))(conf@15.1.0)(electron@39.5.1)': dependencies: '@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0) '@better-auth/utils': 0.3.1 '@better-fetch/fetch': 1.1.21 - better-auth: 1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8) + better-auth: 1.5.5(affc8643d2a62eb147455ed14c80743d) better-call: 1.3.2(zod@4.3.6) zod: 4.3.6 optionalDependencies: @@ -13109,10 +13112,10 @@ snapshots: - hono - typescript - '@convex-dev/better-auth@0.11.2(@standard-schema/spec@1.1.0)(better-auth@1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8))(convex@1.33.1(react@18.3.1))(hono@4.12.14)(react@18.3.1)(typescript@5.9.3)': + '@convex-dev/better-auth@0.11.2(@standard-schema/spec@1.1.0)(better-auth@1.5.5(affc8643d2a62eb147455ed14c80743d))(convex@1.33.1(react@18.3.1))(hono@4.12.14)(react@18.3.1)(typescript@5.9.3)': dependencies: '@better-fetch/fetch': 1.1.21 - better-auth: 1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8) + better-auth: 1.5.5(affc8643d2a62eb147455ed14c80743d) common-tags: 1.8.2 convex: 1.33.1(react@18.3.1) convex-helpers: 0.1.111(@standard-schema/spec@1.1.0)(convex@1.33.1(react@18.3.1))(hono@4.12.14)(react@18.3.1)(typescript@5.9.3)(zod@4.3.6) @@ -13684,9 +13687,9 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.8.0(jiti@2.7.0))': dependencies: - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.7.0))': @@ -13716,7 +13719,7 @@ snapshots: dependencies: '@eslint/core': 0.17.0 - '@eslint/config-helpers@0.6.0': + '@eslint/config-helpers@0.7.0': dependencies: '@eslint/core': 1.2.1 @@ -13742,9 +13745,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@10.0.1(eslint@10.7.0(jiti@2.7.0))': + '@eslint/js@10.0.1(eslint@10.8.0(jiti@2.7.0))': optionalDependencies: - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) '@eslint/js@9.39.2': {} @@ -14030,12 +14033,12 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: glob: 10.5.0 magic-string: 0.30.21 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) optionalDependencies: typescript: 5.9.3 @@ -14396,23 +14399,23 @@ snapshots: dependencies: '@chevrotain/types': 11.1.2 - '@microsoft/api-extractor-model@7.32.2(@types/node@26.1.1)': + '@microsoft/api-extractor-model@7.32.2(@types/node@26.1.2)': dependencies: '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.0 - '@rushstack/node-core-library': 5.19.1(@types/node@26.1.1) + '@rushstack/node-core-library': 5.19.1(@types/node@26.1.2) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.56.3(@types/node@26.1.1)': + '@microsoft/api-extractor@7.56.3(@types/node@26.1.2)': dependencies: - '@microsoft/api-extractor-model': 7.32.2(@types/node@26.1.1) + '@microsoft/api-extractor-model': 7.32.2(@types/node@26.1.2) '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.0 - '@rushstack/node-core-library': 5.19.1(@types/node@26.1.1) + '@rushstack/node-core-library': 5.19.1(@types/node@26.1.2) '@rushstack/rig-package': 0.6.0 - '@rushstack/terminal': 0.21.0(@types/node@26.1.1) - '@rushstack/ts-command-line': 5.2.0(@types/node@26.1.1) + '@rushstack/terminal': 0.21.0(@types/node@26.1.2) + '@rushstack/ts-command-line': 5.2.0(@types/node@26.1.2) diff: 8.0.3 lodash: 4.17.23 minimatch: 10.1.2 @@ -14529,31 +14532,31 @@ snapshots: '@oozcitak/util@10.0.0': {} - '@openai/codex@0.145.0': + '@openai/codex@0.147.0': optionalDependencies: - '@openai/codex-darwin-arm64': '@openai/codex@0.145.0-darwin-arm64' - '@openai/codex-darwin-x64': '@openai/codex@0.145.0-darwin-x64' - '@openai/codex-linux-arm64': '@openai/codex@0.145.0-linux-arm64' - '@openai/codex-linux-x64': '@openai/codex@0.145.0-linux-x64' - '@openai/codex-win32-arm64': '@openai/codex@0.145.0-win32-arm64' - '@openai/codex-win32-x64': '@openai/codex@0.145.0-win32-x64' + '@openai/codex-darwin-arm64': '@openai/codex@0.147.0-darwin-arm64' + '@openai/codex-darwin-x64': '@openai/codex@0.147.0-darwin-x64' + '@openai/codex-linux-arm64': '@openai/codex@0.147.0-linux-arm64' + '@openai/codex-linux-x64': '@openai/codex@0.147.0-linux-x64' + '@openai/codex-win32-arm64': '@openai/codex@0.147.0-win32-arm64' + '@openai/codex-win32-x64': '@openai/codex@0.147.0-win32-x64' - '@openai/codex@0.145.0-darwin-arm64': + '@openai/codex@0.147.0-darwin-arm64': optional: true - '@openai/codex@0.145.0-darwin-x64': + '@openai/codex@0.147.0-darwin-x64': optional: true - '@openai/codex@0.145.0-linux-arm64': + '@openai/codex@0.147.0-linux-arm64': optional: true - '@openai/codex@0.145.0-linux-x64': + '@openai/codex@0.147.0-linux-x64': optional: true - '@openai/codex@0.145.0-win32-arm64': + '@openai/codex@0.147.0-win32-arm64': optional: true - '@openai/codex@0.145.0-win32-x64': + '@openai/codex@0.147.0-win32-x64': optional: true '@opentelemetry/api@1.9.0': @@ -15846,7 +15849,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true - '@rushstack/node-core-library@5.19.1(@types/node@26.1.1)': + '@rushstack/node-core-library@5.19.1(@types/node@26.1.2)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -15857,28 +15860,28 @@ snapshots: resolve: 1.22.11 semver: 7.5.4 optionalDependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 - '@rushstack/problem-matcher@0.1.1(@types/node@26.1.1)': + '@rushstack/problem-matcher@0.1.1(@types/node@26.1.2)': optionalDependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 '@rushstack/rig-package@0.6.0': dependencies: resolve: 1.22.11 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.21.0(@types/node@26.1.1)': + '@rushstack/terminal@0.21.0(@types/node@26.1.2)': dependencies: - '@rushstack/node-core-library': 5.19.1(@types/node@26.1.1) - '@rushstack/problem-matcher': 0.1.1(@types/node@26.1.1) + '@rushstack/node-core-library': 5.19.1(@types/node@26.1.2) + '@rushstack/problem-matcher': 0.1.1(@types/node@26.1.2) supports-color: 8.1.1 optionalDependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 - '@rushstack/ts-command-line@5.2.0(@types/node@26.1.1)': + '@rushstack/ts-command-line@5.2.0(@types/node@26.1.2)': dependencies: - '@rushstack/terminal': 0.21.0(@types/node@26.1.1) + '@rushstack/terminal': 0.21.0(@types/node@26.1.2) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -16023,21 +16026,21 @@ snapshots: ts-dedent: 2.2.0 vite: 6.4.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - '@storybook/builder-vite@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@storybook/builder-vite@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: - '@storybook/csf-plugin': 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))) - storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@storybook/csf-plugin': 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))) + storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) ts-dedent: 2.2.0 - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) '@storybook/csf-plugin@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))': dependencies: storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) unplugin: 1.16.1 - '@storybook/csf-plugin@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))': + '@storybook/csf-plugin@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))': dependencies: - storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) unplugin: 1.16.1 '@storybook/global@5.0.0': {} @@ -16048,27 +16051,27 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - '@storybook/react-dom-shim@9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))': + '@storybook/react-dom-shim@9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) - '@storybook/react-vite@9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@storybook/react-vite@9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) '@rollup/pluginutils': 5.3.0(rollup@4.57.1) - '@storybook/builder-vite': 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) - '@storybook/react': 9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(typescript@5.9.3) + '@storybook/builder-vite': 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@storybook/react': 9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(typescript@5.9.3) find-up: 7.0.0 magic-string: 0.30.21 react: 18.3.1 react-docgen: 8.0.2 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.11 - storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) tsconfig-paths: 4.2.0 - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) transitivePeerDependencies: - rollup - supports-color @@ -16104,13 +16107,13 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@storybook/react@9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(typescript@5.9.3)': + '@storybook/react@9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))) + '@storybook/react-dom-shim': 9.1.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + storybook: 9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) optionalDependencies: typescript: 5.9.3 @@ -16322,12 +16325,12 @@ snapshots: tailwindcss: 4.3.0 vite: 6.4.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - '@tailwindcss/vite@4.3.0(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@tailwindcss/vite@4.3.0(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.3.0 '@tailwindcss/oxide': 4.3.0 tailwindcss: 4.3.0 - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) '@tailwindcss/vite@4.3.0(vite@7.3.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: @@ -16488,14 +16491,14 @@ snapshots: - webpack optional: true - '@tanstack/react-start-rsc@0.1.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@tanstack/react-start-rsc@0.1.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: '@tanstack/react-router': 1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-core': 1.171.15 '@tanstack/router-utils': 1.162.2 '@tanstack/start-client-core': 1.170.14 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.24(@tanstack/react-router@1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@tanstack/start-plugin-core': 1.171.24(@tanstack/react-router@1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) '@tanstack/start-server-core': 1.169.17 '@tanstack/start-storage-context': 1.167.17 pathe: 2.0.3 @@ -16654,21 +16657,21 @@ snapshots: - webpack optional: true - '@tanstack/react-start@1.168.33(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@tanstack/react-start@1.168.33(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: '@tanstack/react-router': 1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start-client': 1.168.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-start-rsc': 0.1.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@tanstack/react-start-rsc': 0.1.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) '@tanstack/react-start-server': 1.167.22(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-utils': 1.162.2 '@tanstack/start-client-core': 1.170.14 - '@tanstack/start-plugin-core': 1.171.24(@tanstack/react-router@1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@tanstack/start-plugin-core': 1.171.24(@tanstack/react-router@1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) '@tanstack/start-server-core': 1.169.17 pathe: 2.0.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -16823,7 +16826,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@tanstack/router-plugin@1.159.5(@tanstack/react-router@1.159.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -16840,11 +16843,11 @@ snapshots: zod: 4.3.6 optionalDependencies: '@tanstack/react-router': 1.159.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.23(@tanstack/react-router@1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@tanstack/router-plugin@1.168.23(@tanstack/react-router@1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/template': 7.28.6 @@ -16853,11 +16856,11 @@ snapshots: '@tanstack/router-generator': 1.167.21 '@tanstack/router-utils': 1.162.2 chokidar: 5.0.0 - unplugin: 3.3.0(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + unplugin: 3.3.0(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) zod: 4.3.6 optionalDependencies: '@tanstack/react-router': 1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -17004,14 +17007,14 @@ snapshots: '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.24(@tanstack/react-router@1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@tanstack/start-plugin-core@1.171.24(@tanstack/react-router@1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 '@babel/types': 7.29.0 '@tanstack/router-core': 1.171.15 '@tanstack/router-generator': 1.167.21 - '@tanstack/router-plugin': 1.168.23(@tanstack/react-router@1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@tanstack/router-plugin': 1.168.23(@tanstack/react-router@1.170.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) '@tanstack/router-utils': 1.162.2 '@tanstack/start-server-core': 1.169.17 exsolve: 1.0.8 @@ -17023,11 +17026,11 @@ snapshots: srvx: 0.11.22 tinyglobby: 0.2.17 ufo: 1.6.3 - vitefu: 1.1.3(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + vitefu: 1.1.3(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) xmlbuilder2: 4.0.3 zod: 4.3.6 optionalDependencies: - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -17307,7 +17310,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 26.1.1 + '@types/node': 26.1.2 '@types/responselike': 1.0.3 '@types/chai@5.2.3': @@ -17446,13 +17449,13 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 '@types/ssh2': 1.15.5 '@types/dockerode@3.3.47': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 26.1.1 + '@types/node': 26.1.2 '@types/ssh2': 1.15.5 '@types/doctrine@0.0.9': {} @@ -17469,7 +17472,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 '@types/geojson@7946.0.16': {} @@ -17489,7 +17492,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 '@types/lodash@4.17.23': {} @@ -17503,7 +17506,7 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 '@types/node@18.19.130': dependencies: @@ -17525,9 +17528,13 @@ snapshots: dependencies: undici-types: 8.3.0 + '@types/node@26.1.2': + dependencies: + undici-types: 8.3.0 + '@types/pg@8.15.6': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 pg-protocol: 1.11.0 pg-types: 2.2.0 optional: true @@ -17573,7 +17580,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 '@types/ssh2@1.15.5': dependencies: @@ -17639,15 +17646,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/type-utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.65.0 - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -17667,14 +17674,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.65.0 '@typescript-eslint/types': 8.65.0 '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3 - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -17727,13 +17734,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.65.0 '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -17786,13 +17793,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.65.0 '@typescript-eslint/types': 8.65.0 '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -17924,7 +17931,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -17932,7 +17939,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -17997,13 +18004,13 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.12)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: @@ -18029,13 +18036,13 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 7.3.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) '@vitest/mocker@4.1.10(vite@7.3.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': dependencies: @@ -18054,6 +18061,14 @@ snapshots: optionalDependencies: vite: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2))': + dependencies: + '@vitest/spy': 4.1.10 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.1.5(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 @@ -18557,12 +18572,12 @@ snapshots: elkjs: 0.11.1 entities: 7.0.1 - better-auth-capacitor@0.3.6(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0))(@capacitor/app@8.1.0(@capacitor/core@8.5.0))(@capacitor/core@8.5.0)(@capacitor/preferences@8.0.1(@capacitor/core@8.5.0))(better-auth@1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8)): + better-auth-capacitor@0.3.6(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0))(@capacitor/app@8.1.0(@capacitor/core@8.5.0))(@capacitor/core@8.5.0)(@capacitor/preferences@8.0.1(@capacitor/core@8.5.0))(better-auth@1.5.5(affc8643d2a62eb147455ed14c80743d)): dependencies: '@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0) '@capacitor/core': 8.5.0 '@capacitor/preferences': 8.0.1(@capacitor/core@8.5.0) - better-auth: 1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8) + better-auth: 1.5.5(affc8643d2a62eb147455ed14c80743d) zod: 4.3.6 optionalDependencies: '@capacitor/app': 8.1.0(@capacitor/core@8.5.0) @@ -18635,7 +18650,7 @@ snapshots: transitivePeerDependencies: - '@cloudflare/workers-types' - better-auth@1.5.5(c8dc6eb7cd0635aa08da9aaba2cd74a8): + better-auth@1.5.5(affc8643d2a62eb147455ed14c80743d): dependencies: '@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0) '@better-auth/drizzle-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.2.2)(kysely@0.28.11)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.0(prisma@7.4.0(@types/react@18.3.28)(better-sqlite3@12.10.0)(magicast@0.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(better-sqlite3@12.10.0)(kysely@0.28.11)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.0(@types/react@18.3.28)(better-sqlite3@12.10.0)(magicast@0.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))) @@ -18656,7 +18671,7 @@ snapshots: zod: 4.3.6 optionalDependencies: '@prisma/client': 7.4.0(prisma@7.4.0(@types/react@18.3.28)(better-sqlite3@12.10.0)(magicast@0.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(typescript@5.9.3) - '@tanstack/react-start': 1.168.33(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@tanstack/react-start': 1.168.33(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) better-sqlite3: 12.10.0 drizzle-orm: 0.45.1(@cloudflare/workers-types@4.20260317.1)(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.0(prisma@7.4.0(@types/react@18.3.28)(better-sqlite3@12.10.0)(magicast@0.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.15.6)(better-sqlite3@12.10.0)(kysely@0.28.11)(mysql2@3.15.3)(postgres@3.4.7)(prisma@7.4.0(@types/react@18.3.28)(better-sqlite3@12.10.0)(magicast@0.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)) mongodb: 7.1.0(socks@2.8.7) @@ -18664,7 +18679,7 @@ snapshots: prisma: 7.4.0(@types/react@18.3.28)(better-sqlite3@12.10.0)(magicast@0.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@26.1.1)(jiti@2.7.0)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@26.1.2)(jiti@2.7.0)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) vue: 3.5.28(typescript@5.9.3) transitivePeerDependencies: - '@cloudflare/workers-types' @@ -20060,9 +20075,9 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)): + eslint-config-prettier@10.1.8(eslint@10.8.0(jiti@2.7.0)): dependencies: - eslint: 10.7.0(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.7.0)): dependencies: @@ -20132,12 +20147,12 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.7.0(jiti@2.7.0): + eslint@10.8.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.6.0 + '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.7 @@ -20792,7 +20807,7 @@ snapshots: globals@16.5.0: {} - globals@17.7.0: {} + globals@17.9.0: {} globalthis@1.0.4: dependencies: @@ -23234,7 +23249,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 26.1.1 + '@types/node': 26.1.2 long: 5.3.2 proxy-addr@2.0.7: @@ -24301,13 +24316,13 @@ snapshots: - utf-8-validate - vite - storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): + storybook@9.1.17(@testing-library/dom@10.4.1)(prettier@3.9.6)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) '@vitest/spy': 3.2.4 better-opn: 3.0.2 esbuild: 0.24.2 @@ -24655,14 +24670,14 @@ snapshots: ts-dedent@2.2.0: {} - ts-node@10.9.2(@swc/core@1.15.11)(@swc/wasm@1.15.11)(@types/node@26.1.1)(typescript@6.0.3): + ts-node@10.9.2(@swc/core@1.15.11)(@swc/wasm@1.15.11)(@types/node@26.1.2)(typescript@6.0.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 26.1.1 + '@types/node': 26.1.2 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -24928,14 +24943,14 @@ snapshots: rollup: 4.57.1 vite: 8.1.5(@types/node@24.10.12)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) - unplugin@3.3.0(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): + unplugin@3.3.0(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 optionalDependencies: rollup: 4.57.1 - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) optional: true unplugin@3.3.0(rollup@4.57.1)(vite@7.3.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): @@ -25156,13 +25171,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2): + vite-node@3.2.4(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 7.3.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -25177,9 +25192,9 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@26.1.1)(rollup@4.57.1)(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): + vite-plugin-dts@4.5.4(@types/node@26.1.2)(rollup@4.57.1)(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): dependencies: - '@microsoft/api-extractor': 7.56.3(@types/node@26.1.1) + '@microsoft/api-extractor': 7.56.3(@types/node@26.1.2) '@rollup/pluginutils': 5.3.0(rollup@4.57.1) '@volar/typescript': 2.4.28 '@vue/language-core': 2.2.0(typescript@5.9.3) @@ -25190,7 +25205,7 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup @@ -25212,13 +25227,13 @@ snapshots: - '@swc/helpers' - rollup - vite-plugin-top-level-await@1.6.0(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): + vite-plugin-top-level-await@1.6.0(rollup@4.57.1)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@4.57.1) '@swc/core': 1.15.11 '@swc/wasm': 1.15.11 uuid: 10.0.0 - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) transitivePeerDependencies: - '@swc/helpers' - rollup @@ -25238,21 +25253,21 @@ snapshots: dependencies: vite: 6.4.1(@types/node@24.10.12)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) - vite-plugin-wasm@3.5.0(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): + vite-plugin-wasm@3.5.0(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): dependencies: - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) vite-plugin-wasm@3.5.0(vite@7.3.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): dependencies: vite: 7.3.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript @@ -25291,7 +25306,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.2 - vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2): + vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -25300,7 +25315,7 @@ snapshots: rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 fsevents: 2.3.3 jiti: 2.7.0 lightningcss: 1.32.0 @@ -25359,7 +25374,7 @@ snapshots: tsx: 4.23.7 yaml: 2.8.2 - vite@7.3.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2): + vite@7.3.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2): dependencies: esbuild: 0.27.0 fdir: 6.5.0(picomatch@4.0.3) @@ -25368,7 +25383,7 @@ snapshots: rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 26.1.1 + '@types/node': 26.1.2 fsevents: 2.3.3 jiti: 2.7.0 lightningcss: 1.32.0 @@ -25408,14 +25423,30 @@ snapshots: tsx: 4.23.7 yaml: 2.8.2 + vite@8.1.5(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.5 + postcss: 8.5.25 + rolldown: 1.1.5 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 26.1.2 + esbuild: 0.28.1 + fsevents: 2.3.3 + jiti: 2.7.0 + terser: 5.46.0 + tsx: 4.23.7 + yaml: 2.8.2 + vitefu@1.1.3(vite@6.4.1(@types/node@24.10.12)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): optionalDependencies: vite: 6.4.1(@types/node@24.10.12)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) optional: true - vitefu@1.1.3(vite@6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): + vitefu@1.1.3(vite@6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): optionalDependencies: - vite: 6.4.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 6.4.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) optional: true vitefu@1.1.3(vite@7.3.1(@types/node@24.10.12)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): @@ -25556,11 +25587,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@26.1.1)(jiti@2.7.0)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@26.1.2)(jiti@2.7.0)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -25578,12 +25609,12 @@ snapshots: tinyglobby: 0.2.17 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@26.1.1)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite: 7.3.1(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@26.1.2)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 26.1.1 + '@types/node': 26.1.2 jsdom: 26.1.0 transitivePeerDependencies: - jiti @@ -25658,6 +25689,35 @@ snapshots: transitivePeerDependencies: - msw + vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@26.1.2)(jsdom@26.1.0)(vite@8.1.5(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)): + dependencies: + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + es-module-lexer: 2.3.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.3 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.1.1 + tinyglobby: 0.2.15 + tinyrainbow: 3.1.0 + vite: 8.1.5(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.0)(tsx@4.23.7)(yaml@2.8.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@types/node': 26.1.2 + jsdom: 26.1.0 + transitivePeerDependencies: + - msw + void-elements@3.1.0: {} vscode-jsonrpc@9.0.1: {}