zidane 7.1.10 → 7.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/{acp-Bt-eb5Z8.js → acp-D-tVyUjw.js} +2 -2
  2. package/dist/{acp-Bt-eb5Z8.js.map → acp-D-tVyUjw.js.map} +1 -1
  3. package/dist/acp-cli.js +4 -4
  4. package/dist/acp.d.ts +1 -1
  5. package/dist/acp.js +1 -1
  6. package/dist/{agent-B6etKd_o.js → agent-D0zZnGbt.js} +135 -6
  7. package/dist/agent-D0zZnGbt.js.map +1 -0
  8. package/dist/agent.d.ts +1 -1
  9. package/dist/agent.js +1 -1
  10. package/dist/{anthropic-BQdAnY-w.js → anthropic-C2aole0G.js} +83 -100
  11. package/dist/anthropic-C2aole0G.js.map +1 -0
  12. package/dist/{approvals-CIKGWmiU.js → approvals-CnE_8JVZ.js} +53 -11
  13. package/dist/approvals-CnE_8JVZ.js.map +1 -0
  14. package/dist/{auth-CDDNbEmd.js → auth-BG2rVKSt.js} +2 -2
  15. package/dist/{auth-CDDNbEmd.js.map → auth-BG2rVKSt.js.map} +1 -1
  16. package/dist/chat/pure.d.ts +24 -8
  17. package/dist/chat/pure.d.ts.map +1 -1
  18. package/dist/chat/pure.js +248 -3
  19. package/dist/chat/pure.js.map +1 -0
  20. package/dist/chat.d.ts +6 -6
  21. package/dist/chat.js +4 -4
  22. package/dist/contexts/daytona.d.ts +1 -1
  23. package/dist/contexts/e2b.d.ts +1 -1
  24. package/dist/daemon-cli.js +1 -1
  25. package/dist/eval.d.ts +1 -1
  26. package/dist/extensions.d.ts +2 -2
  27. package/dist/extensions.js +1 -1
  28. package/dist/headless.d.ts +1 -1
  29. package/dist/headless.js +1 -1
  30. package/dist/{index-dXnPmqFx.d.ts → index-BgN1T3lk.d.ts} +342 -109
  31. package/dist/index-BgN1T3lk.d.ts.map +1 -0
  32. package/dist/{index-C45NxBZm.d.ts → index-CWHSTD2Q.d.ts} +5 -5
  33. package/dist/{index-C45NxBZm.d.ts.map → index-CWHSTD2Q.d.ts.map} +1 -1
  34. package/dist/index.d.ts +2 -2
  35. package/dist/index.js +2 -2
  36. package/dist/{ipc-CNRlwg7u.js → ipc-QMxe90Mo.js} +2 -2
  37. package/dist/{ipc-CNRlwg7u.js.map → ipc-QMxe90Mo.js.map} +1 -1
  38. package/dist/ipc.d.ts +5 -5
  39. package/dist/ipc.js +3 -3
  40. package/dist/mcp.d.ts +1 -1
  41. package/dist/output/stream-json.d.ts +1 -1
  42. package/dist/output/terminal.d.ts +1 -1
  43. package/dist/panels-B6gRk4bf.js.map +1 -1
  44. package/dist/plugins.d.ts +1 -1
  45. package/dist/presets.d.ts +1 -1
  46. package/dist/presets.js +1 -1
  47. package/dist/providers/anthropic.d.ts +1 -1
  48. package/dist/providers/anthropic.js +1 -1
  49. package/dist/providers/arcee.d.ts +1 -1
  50. package/dist/providers/baseten.d.ts +1 -1
  51. package/dist/providers/cerebras.d.ts +1 -1
  52. package/dist/providers/local.d.ts +1 -1
  53. package/dist/providers/openai-compat.d.ts +1 -1
  54. package/dist/providers/openai.d.ts +1 -1
  55. package/dist/providers/openai.js +3 -2
  56. package/dist/providers/openai.js.map +1 -1
  57. package/dist/providers/openrouter.d.ts +1 -1
  58. package/dist/providers/xai.d.ts +1 -1
  59. package/dist/providers.d.ts +1 -1
  60. package/dist/providers.js +1 -1
  61. package/dist/restate.d.ts +1 -1
  62. package/dist/restate.js +1 -1
  63. package/dist/session/sqlite.d.ts +19 -2
  64. package/dist/session/sqlite.d.ts.map +1 -1
  65. package/dist/session/sqlite.js +45 -1
  66. package/dist/session/sqlite.js.map +1 -1
  67. package/dist/session.d.ts +1 -1
  68. package/dist/{shell-path-Db04cLEP.js → shell-path-C-fcAmH-.js} +6 -6
  69. package/dist/{shell-path-Db04cLEP.js.map → shell-path-C-fcAmH-.js.map} +1 -1
  70. package/dist/skills.d.ts +1 -1
  71. package/dist/{todo-edits-PxMJvYIX.js → todo-edits-UOwgxGKu.js} +74 -13
  72. package/dist/todo-edits-UOwgxGKu.js.map +1 -0
  73. package/dist/{tool-formatters-Bl1afA8N.d.ts → tool-formatters-DoRLnfuD.d.ts} +5 -3
  74. package/dist/tool-formatters-DoRLnfuD.d.ts.map +1 -0
  75. package/dist/tools/fetch-url.d.ts +1 -1
  76. package/dist/tools/web-search.d.ts +1 -1
  77. package/dist/tools.d.ts +1 -1
  78. package/dist/tools.js +1 -1
  79. package/dist/{transcript-anchors-BfI3ZXh1.d.ts → transcript-anchors-BeudMbXx.d.ts} +12 -4
  80. package/dist/transcript-anchors-BeudMbXx.d.ts.map +1 -0
  81. package/dist/tui.d.ts +3 -3
  82. package/dist/tui.d.ts.map +1 -1
  83. package/dist/tui.js +290 -40
  84. package/dist/tui.js.map +1 -1
  85. package/dist/{turn-operations-D0x_g6XQ.d.ts → turn-operations-C8bMBDl_.d.ts} +3 -3
  86. package/dist/{turn-operations-D0x_g6XQ.d.ts.map → turn-operations-C8bMBDl_.d.ts.map} +1 -1
  87. package/dist/{turn-operations-D_k_FEur.js → turn-operations-DrbJlpq9.js} +5 -2
  88. package/dist/turn-operations-DrbJlpq9.js.map +1 -0
  89. package/dist/types.d.ts +1 -1
  90. package/docs/EXTENSIONS.md +1 -1
  91. package/docs/PANELS.md +16 -2
  92. package/package.json +3 -3
  93. package/dist/agent-B6etKd_o.js.map +0 -1
  94. package/dist/anthropic-BQdAnY-w.js.map +0 -1
  95. package/dist/approvals-CIKGWmiU.js.map +0 -1
  96. package/dist/index-dXnPmqFx.d.ts.map +0 -1
  97. package/dist/todo-edits-PxMJvYIX.js.map +0 -1
  98. package/dist/tool-formatters-Bl1afA8N.d.ts.map +0 -1
  99. package/dist/transcript-anchors-BfI3ZXh1.d.ts.map +0 -1
  100. package/dist/turn-operations-D_k_FEur.js.map +0 -1
package/dist/tui.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { C as estimateRebilledCostUsd } from "./openai-compat-Dy56weK8.js";
2
2
  import { n as THINKING_LEVELS } from "./types-CWgENVLY.js";
3
3
  import { m as buildContextSegments, n as normalizePanelContent, p as oauthAccountLabel, r as panelBadgeText, s as DEFAULT_OAUTH_ACCOUNT_LABEL } from "./panels-B6gRk4bf.js";
4
- import { $ as ExtensionInstallError, A as buildPostCompactAttachments, An as resolveExtensionConfigValue, C as rehomePersistedStubs, Cn as setDebugLogSink, Ct as basic_default, D as resolvePersistDir, E as resolveMcpWarningsDir, En as coerceExtensionConfigInput, Gn as renderArtifactRow, Ln as artifactKindLabel, Lt as tailTruncate, M as selectFilesFromSession, O as resolveSessionDir, P as compactConversation, Pn as createExtensionBus, Q as createExtensionPromptBridge, Sn as createDebugLog, T as resolveLegacySessionDir, Vt as createModelSearchTool, Wn as refreshArtifact, Xn as effectiveContextWindow, Xt as artifacts_default, Yn as OUTPUT_RESERVE_TOKENS, an as groupBindings, at as removeInstalledExtension, b as cleanupPersistedSession, bn as parseExtensionScanPathEnv, bt as composePresets, ct as discoverAndBuildExtensionRegistry, dt as composeExtensionPreset, f as applyCompactSummaryCutoff, fn as resolveExtensionKeybindings, ft as disposeExtensionRegistry, gt as partitionExtensionCatalog, in as formatBindingForDisplay, jn as sanitizeExtensionConfigActionPatch, k as resolveTasksDir, kt as isSpawnTool, mn as registerExtensionHostModules, mt as filterRegistryPlugins, nn as KEYBINDING_KEY_COL_WIDTH, on as keybindingsPath, ot as updateInstalledExtension, pt as filterExtensionRegistry, q as summaryToTurn, rn as ensureKeybindingsFile, sn as matchesBinding, st as createExtensionHud, t as createAgent, tt as installExtensionFromSpec, vn as inlineLoadedExtension, vt as createExtensionHostRuntimeBridge, w as resolveLegacyPersistDir, xn as scanExtensionDirectories, zt as looksBinary } from "./agent-B6etKd_o.js";
4
+ import { $ as ExtensionInstallError, A as buildPostCompactAttachments, An as resolveExtensionConfigValue, C as rehomePersistedStubs, Cn as setDebugLogSink, Ct as basic_default, D as resolvePersistDir, E as resolveMcpWarningsDir, En as coerceExtensionConfigInput, Gn as renderArtifactRow, Ln as artifactKindLabel, Lt as tailTruncate, M as selectFilesFromSession, O as resolveSessionDir, P as compactConversation, Pn as createExtensionBus, Q as createExtensionPromptBridge, Sn as createDebugLog, T as resolveLegacySessionDir, Vt as createModelSearchTool, Wn as refreshArtifact, Xn as effectiveContextWindow, Xt as artifacts_default, Yn as OUTPUT_RESERVE_TOKENS, an as groupBindings, at as removeInstalledExtension, b as cleanupPersistedSession, bn as parseExtensionScanPathEnv, bt as composePresets, ct as discoverAndBuildExtensionRegistry, dt as composeExtensionPreset, f as applyCompactSummaryCutoff, fn as resolveExtensionKeybindings, ft as disposeExtensionRegistry, gt as partitionExtensionCatalog, in as formatBindingForDisplay, jn as sanitizeExtensionConfigActionPatch, k as resolveTasksDir, kt as isSpawnTool, mn as registerExtensionHostModules, mt as filterRegistryPlugins, nn as KEYBINDING_KEY_COL_WIDTH, on as keybindingsPath, ot as updateInstalledExtension, pt as filterExtensionRegistry, q as summaryToTurn, rn as ensureKeybindingsFile, sn as matchesBinding, st as createExtensionHud, t as createAgent, tt as installExtensionFromSpec, vn as inlineLoadedExtension, vt as createExtensionHostRuntimeBridge, w as resolveLegacyPersistDir, xn as scanExtensionDirectories, zt as looksBinary } from "./agent-D0zZnGbt.js";
5
5
  import { D as shouldAutoGenerateTitle, E as generateSessionTitle, F as parseCommandInvocation, M as commandBlocksToContent, P as executeCommand, S as resolveInlineSuggestion, a as loginMcpServer, b as createPathAutocompleteProvider, c as SKILL_EDIT_METADATA_KEY, g as readSkillEditMarker, h as extensionScaffold, j as commandBlockToEvent, l as ZIDANE_EXTENSION_SKILL_NAME, m as extensionDirForCwd, p as editSessionMetadata, u as ZIDANE_SKILL_EDIT_SKILL_NAME, v as withZidaneExtensionSkill, w as generateStructuredData, x as patchInlineGhost, y as withZidaneSkillEditSkill } from "./src-CkNQKFKr.js";
6
6
  import { a as formatDuration, c as previewLine, i as fmtTokens, l as shortId, n as compactPath, o as formatTaskStatus, r as fmtCost, s as formatTaskSummary, t as ageString } from "./format-BF745pLL.js";
7
7
  import { i as killProcessGroup, n as SUPPORTS_PROCESS_GROUPS, r as createProcessContext } from "./contexts-CRE9pw07.js";
@@ -19,14 +19,14 @@ import { s as withTimeout } from "./timeout-CjOG2mea.js";
19
19
  import { i as installCacheBreakLogger } from "./cache-telemetry-D0xemhgK.js";
20
20
  import { s as resolveCompletionSubmit } from "./completion-core-BRo86R_L.js";
21
21
  import { n as JsonRpcRemoteError, t as JsonRpcConnectionClosedError } from "./json-rpc-rSWMUh9b.js";
22
- import { $ as pickChainPrimary, $t as formatCostUsd, At as selectionAfterTurnRemoval, Bt as isMainSession, C as resetLabel, Cn as resolveApprovalForPayload, Ct as isVisible, D as splitPromptSegments, Dt as retagUserPromptEvents, E as usageTone, En as summarizeOutcomes, F as codeTokenHasClosingFence, Gt as sessionDirLabel, H as liveSessionCost, I as normalizeMarkdownCodeFences, It as SESSION_EVENT_STATUS_STYLE, Jt as sessionEventMeta, K as DAEMON_HEALTH_STYLE, Kt as sessionEventExcerpt, L as splitMarkdownCodeBlocks, Mt as turnSelectionOwnership, N as chunkMarkdownForRender, O as buildModelCatalog, Ot as retagUserPromptEventsFromRefs, P as closeDanglingCodeFence, Q as filterChainFallbacks, Qt as fitRunReceiptCells, R as stripHtmlCommentsOutsideCode, S as mostConstrainedWindow, Sn as parseEditOutcomesFromResult, St as isUserBashEvent, T as updatedLabel, Tn as stripEditOutcomesAnnotation, Tt as promptHistoryFromEvents, V as compactingLabel, W as streamingLabel, X as chainsEqual, Xt as truncateTitle, Y as chainPositionOf, Yt as shortSessionId, _ as turnContextSize, _n as summarizeEditPayload, _t as buildLinearRamp, a as TOOL_DISPLAY, an as hasRunReceipt, bt as isEditErrorResult, cn as buildContextualDiff, d as finalizeStreamingMarkdown, f as finalizeStreamingMarkdownForOwner, ft as createFilesCompletionProvider, g as revealEarlierTranscriptEvents, gt as blendHsl, h as replaceTranscriptTurnEvents, hn as previewEditPayload, ht as createCommandsCompletionProvider, i as turnAsText, it as restoreChainFallbacks, j as parseCustomModelQuery, jt as streamEventSearchText, k as filterModelCatalog, kn as createChatsCompletionProvider, kt as selectableTurnIds, ln as buildUnifiedDiff, lt as createSkillsCompletionProvider, mn as filetypeFromPath, n as deleteTurnSafely, nn as formatRunReceiptLine, nt as providerKeySetChanged, o as displayNameFor, on as runReceiptFromRun, ot as toggleChainEntry, p as hiddenEarlierTranscriptCount, pn as extractEditPayload, q as buildRunModel, r as truncateTurnsAt, rn as formatTokenCount, rt as reorderKeyed, s as formatToolCall, tn as formatRunReceiptCells, u as capTranscriptEvents, un as clipDiffForRender, ut as uniqueSkillNamesFromReferences, vt as BASH_CALL_ID_PREFIX, w as showsAccount, wn as rewriteMultiEditHeader, wt as isVisibleDuringSearch, x as formatUsagePercent, xn as mergeApprovalAndBodyOutcomes, xt as isTurnHighlighted, y as formatBalance, yn as buildEditOutcomesAnnotation, yt as EDIT_TOOL_NAMES, z as cacheBreakChip } from "./turn-operations-D_k_FEur.js";
22
+ import { $ as pickChainPrimary, $t as fitRunReceiptCells, An as createChatsCompletionProvider, At as selectableTurnIds, C as resetLabel, Cn as parseEditOutcomesFromResult, Ct as isUserBashEvent, D as splitPromptSegments, Dn as summarizeOutcomes, E as usageTone, En as stripEditOutcomesAnnotation, Et as promptHistoryFromEvents, F as codeTokenHasClosingFence, H as liveSessionCost, I as normalizeMarkdownCodeFences, K as DAEMON_HEALTH_STYLE, Kt as sessionDirLabel, L as splitMarkdownCodeBlocks, Lt as SESSION_EVENT_STATUS_STYLE, Mt as streamEventSearchText, N as chunkMarkdownForRender, Nt as turnSelectionOwnership, O as buildModelCatalog, Ot as retagUserPromptEvents, P as closeDanglingCodeFence, Q as filterChainFallbacks, R as stripHtmlCommentsOutsideCode, S as mostConstrainedWindow, Sn as mergeApprovalAndBodyOutcomes, St as isTurnHighlighted, T as updatedLabel, Tn as rewriteMultiEditHeader, Tt as isVisibleDuringSearch, V as compactingLabel, Vt as isMainSession, W as streamingLabel, X as chainsEqual, Xt as shortSessionId, Y as chainPositionOf, Yt as sessionEventMeta, Zt as truncateTitle, _ as turnContextSize, _t as buildLinearRamp, a as TOOL_DISPLAY, bn as buildEditOutcomesAnnotation, bt as EDIT_TOOL_NAMES, d as finalizeStreamingMarkdown, dn as clipDiffForRender, en as formatCostUsd, f as finalizeStreamingMarkdownForOwner, ft as createFilesCompletionProvider, g as revealEarlierTranscriptEvents, gn as previewEditPayload, gt as blendHsl, h as replaceTranscriptTurnEvents, hn as filetypeFromPath, ht as createCommandsCompletionProvider, i as turnAsText, in as formatTokenCount, it as restoreChainFallbacks, j as parseCustomModelQuery, jt as selectionAfterTurnRemoval, k as filterModelCatalog, kt as retagUserPromptEventsFromRefs, ln as buildContextualDiff, lt as createSkillsCompletionProvider, mn as extractEditPayload, n as deleteTurnSafely, nn as formatRunReceiptCells, nt as providerKeySetChanged, o as displayNameFor, on as hasRunReceipt, ot as toggleChainEntry, p as hiddenEarlierTranscriptCount, q as buildRunModel, qt as sessionEventExcerpt, r as truncateTurnsAt, rn as formatRunReceiptLine, rt as reorderKeyed, s as formatToolCall, sn as runReceiptFromRun, u as capTranscriptEvents, un as buildUnifiedDiff, ut as uniqueSkillNamesFromReferences, vn as summarizeEditPayload, vt as BASH_CALL_ID_PREFIX, w as showsAccount, wn as resolveApprovalForPayload, wt as isVisible, x as formatUsagePercent, xt as isEditErrorResult, y as formatBalance, z as cacheBreakChip } from "./turn-operations-DrbJlpq9.js";
23
23
  import { a as searchHighlightRanges, c as searchSessionHistoryIndexAsync, i as highlightSegments, n as buildSessionSearchIndexAsync, r as filterSessionSearchCatalog, u as searchSessionIndexAsync } from "./history-search-C4bk1Wz_.js";
24
- import { $ as runOAuthLogin, $n as dedupMcpServersByName, $t as discoverProjectPlugins, A as useSafeModeQueue, Ai as lastContextSizeFromTurns, Bi as toolCallPreview, Bn as resolveConfig, Ci as createChatTurnsReadTool, Cn as resolveChipColor, Ct as buildResumedToolResultsTurn, Di as deriveSessionTitle, Dt as isModelInteraction, Fn as DiscoveryProvider, G as providerUsageSupported, Gn as useCompletion, Gt as modelChainMetadata, H as fetchAllProviderUsage, Hi as updateToolEventOutcomes, Hr as accentColor, Ht as createBuiltinCommands, Ii as serverToolResultSummary, In as useDiscovery, It as installProviderDiagnosticHook, J as formatPathForCwd, Jn as importFromClaudeCode, Jt as createFileMcpCredentialStore, K as usageChecksOptedOut, Kn as countClaudeSessionFiles, Li as stripSpawnTokensLine, Ln as useDiscoveryOptional, M as addToSafelist, Mi as loadState, Mn as parseEditorCommand, Mr as groupArtifacts, Mt as useInteractionsQueue, N as getSafelist, Ni as marginTopFor, Nn as quoteForShell, O as SafeModeProvider, Oi as eventsFromTurns, Ot as makeRequestInteraction, P as isOnSafelist, Pi as noticeTurnContent, Pn as createDiscoverySlot, Pr as discoverAgentsMd, Q as oauthUsesManualCodePaste, Qn as buildMcpServers, Qt as buildPluginContributions, R as suggestSafelistEntries, Ri as sumRunCosts, Rn as ConfigProvider, Si as chatReferenceTokensForPrompt, St as PRESENT_PLAN_TOOL, Ti as compactSummaryEvent, Tt as createInteractionTools, U as fetchProviderUsage, Ui as usageByModel, Un as createArtifactsCompletionProvider, Ut as applyThinkingBindingSetting, V as clearProviderUsageCache, Vi as toolResultText, Vn as resolveStoragePaths, Wt as createMainSession, Xn as removeMcpServer, Y as fetchOAuthRedirect, Yn as mcpsWritePath, Yr as TODO_STATUS_GLYPHS, Z as redirectUriFromAuthUrl, Zn as upsertMcpServer, Zr as applyTodosSnapshot, Zt as runEndNotice, _ as buildSpawnEndEvent, _n as SettingsProvider, _r as useRestartRequired, ai as selectActiveTodos, an as clipHintsToWidth, b as defaultSkillScanPaths, bi as buildPlanSystem, bn as useSettings, bt as HOST_INTERACTION_ID_PREFIX, c as useSelectStyle, ci as useActiveTodos, cn as buildHints, cr as buildRestartHint, ct as useMcpToolToggleMap, d as useTheme, dn as useEnabledToggleSet, dt as indexOfServerRow, en as parsePluginScanPathEnv, et as supportsOAuth, f as discoverSystemMd, fn as DEFAULT_SETTINGS, ft as parentServerName, g as useStreamBuffer, gn as SETTINGS_TOGGLES, gt as getMcpAuthStatus, h as userSystemMdPath, hn as SETTINGS_INPUTS, ht as useMcpAuthState, in as EMPTY_HINTS, ir as tryRevealPath, it as refreshMcpToolsCatalog, ji as listSessionMeta, jr as chatWindowBehavior, jt as useInteractionsActions, k as useSafeModeActions, ki as getSessionMeta, kt as pendingInteractionsFromTurns, l as useSurfaces, lr as buildUpdateHint, m as userScopeOverridesLoad, mn as SETTINGS_CHOICES, mt as useMcpAuthDispatch, ni as pickActiveRunId, nt as loadMcpToolsCache, o as ThemeProvider, oi as setTodosForRun, on as hintsLength, or as bootTick, ot as subscribeMcpToolsCache, p as renderSystemMdSeed, pn as SETTINGS_CATEGORIES, pt as McpAuthProvider, qn as hasClaudeCodeSetup, qt as resolveSandboxFromSettings, r as computeTurnAnchors, ri as pruneTodosByRun, rr as tryOpenBrowser, rt as mcpToolsCachePath, s as useColors, si as todoProgressLabel, sn as truncateTrailing, tn as attachMcpWarnLog, tr as discoverProjectMcps, un as listProjectFiles, ur as useUpdateCheck, ut as buildVisibleMcpRows, v as buildSpawnStartEvent, vn as clampFps, vt as ASK_USER_TOOL, w as writeSessionExport, wn as resolveTheme, wt as createAutomaticInteractionResponse, x as discoverProjectSkills, xi as envSection, xt as InteractionsProvider, y as buildSkillsConfig, yi as buildBuildSystem, zn as useConfig } from "./approvals-CIKGWmiU.js";
25
- import { A as renderDefaultCallbackPage, C as modelOptionsFor, O as piIdOf, b as getContextWindow, d as setPreferredCredential, f as setProviderCredential, k as restoreModelOptions, l as removeStoredCredential, n as applyApiKeyEnv, s as readProviderCredentials, t as detectAuth, u as setCredentialLabel, w as modelSupportsReasoning, y as enabledModelOptions } from "./auth-CDDNbEmd.js";
26
- import { _ as selfDaemonSpawnCommand, c as connectIpcClient, h as ensureDaemonRunning, l as connectOrSpawnDaemon, m as defaultSocketPath } from "./shell-path-Db04cLEP.js";
24
+ import { $ as runOAuthLogin, $n as dedupMcpServersByName, $t as discoverProjectPlugins, A as useSafeModeQueue, Ai as lastContextSizeFromTurns, Bi as toolCallPreview, Bn as resolveConfig, Ci as createChatTurnsReadTool, Cn as resolveChipColor, Ct as buildResumedToolResultsTurn, Di as deriveSessionTitle, Dt as isModelInteraction, Fn as DiscoveryProvider, G as providerUsageSupported, Gn as useCompletion, Gt as modelChainMetadata, H as fetchAllProviderUsage, Hi as updateToolEventOutcomes, Hr as accentColor, Ht as createBuiltinCommands, Ii as serverToolResultSummary, In as useDiscovery, It as installProviderDiagnosticHook, J as formatPathForCwd, Jn as importFromClaudeCode, Jt as createFileMcpCredentialStore, K as usageChecksOptedOut, Kn as countClaudeSessionFiles, Li as stripSpawnTokensLine, Ln as useDiscoveryOptional, M as addToSafelist, Mi as loadState, Mn as parseEditorCommand, Mr as groupArtifacts, Mt as useInteractionsQueue, N as getSafelist, Ni as marginTopFor, Nn as quoteForShell, O as SafeModeProvider, Oi as eventsFromTurns, Ot as makeRequestInteraction, P as isOnSafelist, Pi as noticeTurnContent, Pn as createDiscoverySlot, Pr as discoverAgentsMd, Q as oauthUsesManualCodePaste, Qn as buildMcpServers, Qt as buildPluginContributions, R as suggestSafelistEntries, Ri as sumRunCosts, Rn as ConfigProvider, Si as chatReferenceTokensForPrompt, St as PRESENT_PLAN_TOOL, Ti as compactSummaryEvent, Tt as createInteractionTools, U as fetchProviderUsage, Ui as usageByModel, Un as createArtifactsCompletionProvider, Ut as applyThinkingBindingSetting, V as clearProviderUsageCache, Vi as toolResultText, Vn as resolveStoragePaths, Wt as createMainSession, Xn as removeMcpServer, Y as fetchOAuthRedirect, Yn as mcpsWritePath, Yr as TODO_STATUS_GLYPHS, Z as redirectUriFromAuthUrl, Zn as upsertMcpServer, Zr as applyTodosSnapshot, Zt as runEndNotice, _ as buildSpawnEndEvent, _n as SettingsProvider, _r as useRestartRequired, ai as selectActiveTodos, an as clipHintsToWidth, b as defaultSkillScanPaths, bi as buildPlanSystem, bn as useSettings, bt as HOST_INTERACTION_ID_PREFIX, c as useSelectStyle, ci as useActiveTodos, cn as buildHints, cr as buildRestartHint, ct as useMcpToolToggleMap, d as useTheme, dn as useEnabledToggleSet, dt as indexOfServerRow, en as parsePluginScanPathEnv, et as supportsOAuth, f as discoverSystemMd, fn as DEFAULT_SETTINGS, ft as parentServerName, g as useStreamBuffer, gn as SETTINGS_TOGGLES, gt as getMcpAuthStatus, h as userSystemMdPath, hn as SETTINGS_INPUTS, ht as useMcpAuthState, in as EMPTY_HINTS, ir as tryRevealPath, it as refreshMcpToolsCatalog, ji as listSessionMeta, jr as chatWindowBehavior, jt as useInteractionsActions, k as useSafeModeActions, ki as getSessionMeta, kt as pendingInteractionsFromTurns, l as useSurfaces, lr as buildUpdateHint, m as userScopeOverridesLoad, mn as SETTINGS_CHOICES, mt as useMcpAuthDispatch, ni as pickActiveRunId, nt as loadMcpToolsCache, o as ThemeProvider, oi as setTodosForRun, on as hintsLength, or as bootTick, ot as subscribeMcpToolsCache, p as renderSystemMdSeed, pn as SETTINGS_CATEGORIES, pt as McpAuthProvider, qn as hasClaudeCodeSetup, qt as resolveSandboxFromSettings, r as computeTurnAnchors, ri as pruneTodosByRun, rr as tryOpenBrowser, rt as mcpToolsCachePath, s as useColors, si as todoProgressLabel, sn as truncateTrailing, tn as attachMcpWarnLog, tr as discoverProjectMcps, un as listProjectFiles, ur as useUpdateCheck, ut as buildVisibleMcpRows, v as buildSpawnStartEvent, vn as clampFps, vt as ASK_USER_TOOL, w as writeSessionExport, wn as resolveTheme, wt as createAutomaticInteractionResponse, x as discoverProjectSkills, xi as envSection, xt as InteractionsProvider, y as buildSkillsConfig, yi as buildBuildSystem, zn as useConfig } from "./approvals-CnE_8JVZ.js";
25
+ import { A as renderDefaultCallbackPage, C as modelOptionsFor, O as piIdOf, b as getContextWindow, d as setPreferredCredential, f as setProviderCredential, k as restoreModelOptions, l as removeStoredCredential, n as applyApiKeyEnv, s as readProviderCredentials, t as detectAuth, u as setCredentialLabel, w as modelSupportsReasoning, y as enabledModelOptions } from "./auth-BG2rVKSt.js";
26
+ import { _ as selfDaemonSpawnCommand, c as connectIpcClient, h as ensureDaemonRunning, l as connectOrSpawnDaemon, m as defaultSocketPath } from "./shell-path-C-fcAmH-.js";
27
27
  import { createDockerContext } from "./contexts/docker.js";
28
28
  import { createTuiStore } from "./session/sqlite.js";
29
- import { A as parentProviderKey, D as buildVisibleAuthRows, E as instructionPreviewLines, O as indexOfProviderRow, S as validateMcpForm, T as instructionOriginBadge, _ as togglePanel, a as editTodo, d as buildPanelCatalog, g as resolveActiveTab, h as pickTab, i as cycleTodoStatus, j as selectableSources, n as buildTodoRetryMessage, p as cycleTab, r as clearTodos, s as removeTodo, t as addTodo, u as INITIAL_PANEL_STATE, v as NOTICE_GLYPH, w as buildVisibleInstructionRows, y as MCP_TRANSPORTS } from "./todo-edits-PxMJvYIX.js";
29
+ import { A as buildVisibleInstructionRows, C as togglePanel, I as parentProviderKey, L as selectableSources, M as instructionPreviewLines, N as buildVisibleAuthRows, O as validateMcpForm, P as indexOfProviderRow, S as resolveActiveTab, T as MCP_TRANSPORTS, _ as cycleTab, a as editTodo, b as pickTab, h as buildPanelCatalog, i as cycleTodoStatus, j as instructionOriginBadge, n as buildTodoRetryMessage, p as INITIAL_PANEL_STATE, r as clearTodos, s as removeTodo, t as addTodo, w as NOTICE_GLYPH } from "./todo-edits-UOwgxGKu.js";
30
30
  import { basename, dirname, join, relative, resolve } from "node:path";
31
31
  import { Buffer } from "node:buffer";
32
32
  import * as fs from "node:fs";
@@ -2395,10 +2395,49 @@ function sameElements(a, b) {
2395
2395
  * `partitionTranscript` rebuilds the `events` array per drain tick, but
2396
2396
  * the inner event references stay stable until their content changes.
2397
2397
  */
2398
- const ToolGroupBlock = memo(({ groupKey, events, previous, expanded, onToggle, selectedTurnId = null, ownership, anchorIds }) => {
2398
+ /** `↳ ▸ ` / `↳ ▾ ` prefix plus ` [expand]` / ` [collapse]` suffix, in cells. */
2399
+ const COLLAPSIBLE_HEADER_CHROME = 16;
2400
+ /**
2401
+ * One-line header for a collapsible transcript row (tool group, exchange
2402
+ * fold): the label is clipped with an ellipsis so the row never wraps
2403
+ * onto a second line however long the summary or the live activity gets.
2404
+ * `reserved` is any extra cells the caller paints before the label (the
2405
+ * live spinner and its space).
2406
+ */
2407
+ function CollapsibleHeader({ expanded, label, onToggle, prefix, reserved = 0 }) {
2399
2408
  const COLOR = useColors();
2400
- const SURFACE = useSurfaces();
2409
+ const { width } = useTerminalDimensions();
2401
2410
  const [hovered, setHovered] = useState(false);
2411
+ const shown = truncateTitle(label, Math.max(8, width - 2 - COLLAPSIBLE_HEADER_CHROME - reserved));
2412
+ return /* @__PURE__ */ jsxs("text", {
2413
+ selectable: false,
2414
+ wrapMode: "none",
2415
+ onMouseDown: (event) => {
2416
+ event.stopPropagation();
2417
+ event.preventDefault();
2418
+ onToggle();
2419
+ },
2420
+ onMouseOver: () => setHovered(true),
2421
+ onMouseOut: () => setHovered(false),
2422
+ children: [
2423
+ /* @__PURE__ */ jsx$1("span", {
2424
+ fg: COLOR.mute,
2425
+ children: expanded ? "↳ ▾ " : "↳ ▸ "
2426
+ }),
2427
+ prefix,
2428
+ /* @__PURE__ */ jsx$1("span", {
2429
+ fg: hovered ? COLOR.accent : COLOR.mute,
2430
+ children: shown
2431
+ }),
2432
+ /* @__PURE__ */ jsx$1("span", {
2433
+ fg: hovered ? COLOR.accent : COLOR.mute,
2434
+ children: expanded ? " [collapse]" : " [expand]"
2435
+ })
2436
+ ]
2437
+ });
2438
+ }
2439
+ const ToolGroupBlock = memo(({ groupKey, events, previous, expanded, onToggle, selectedTurnId = null, ownership, anchorIds }) => {
2440
+ const SURFACE = useSurfaces();
2402
2441
  const summary = summarizeToolGroup(events);
2403
2442
  const gap = marginTopFor(events[0], previous);
2404
2443
  const isRowSelected = (evt) => selectedTurnId !== null && ownership !== void 0 && isTurnHighlighted(evt, selectedTurnId, ownership);
@@ -2413,29 +2452,10 @@ const ToolGroupBlock = memo(({ groupKey, events, previous, expanded, onToggle, s
2413
2452
  flexShrink: 0,
2414
2453
  flexDirection: "column"
2415
2454
  },
2416
- children: [/* @__PURE__ */ jsxs("text", {
2417
- selectable: false,
2418
- onMouseDown: (event) => {
2419
- event.stopPropagation();
2420
- event.preventDefault();
2421
- onToggle(groupKey);
2422
- },
2423
- onMouseOver: () => setHovered(true),
2424
- onMouseOut: () => setHovered(false),
2425
- children: [
2426
- /* @__PURE__ */ jsx$1("span", {
2427
- fg: COLOR.mute,
2428
- children: expanded ? "↳ ▾ " : "↳ ▸ "
2429
- }),
2430
- /* @__PURE__ */ jsx$1("span", {
2431
- fg: hovered ? COLOR.accent : COLOR.mute,
2432
- children: summary
2433
- }),
2434
- /* @__PURE__ */ jsx$1("span", {
2435
- fg: hovered ? COLOR.accent : COLOR.mute,
2436
- children: expanded ? " [collapse]" : " [expand]"
2437
- })
2438
- ]
2455
+ children: [/* @__PURE__ */ jsx$1(CollapsibleHeader, {
2456
+ expanded,
2457
+ label: summary,
2458
+ onToggle: () => onToggle(groupKey)
2439
2459
  }), expanded && events.map((evt, i) => /* @__PURE__ */ jsx$1(EventLine, {
2440
2460
  event: evt,
2441
2461
  previous: i === 0 ? events[0] : events[i - 1],
@@ -2444,6 +2464,74 @@ const ToolGroupBlock = memo(({ groupKey, events, previous, expanded, onToggle, s
2444
2464
  }, i))]
2445
2465
  });
2446
2466
  }, (prev, next) => sameElements(prev.events, next.events) && sameElements(prev.anchorIds, next.anchorIds) && prev.groupKey === next.groupKey && prev.previous === next.previous && prev.expanded === next.expanded && prev.onToggle === next.onToggle && prev.selectedTurnId === next.selectedTurnId && prev.ownership === next.ownership);
2467
+ /**
2468
+ * Compact density: one row for everything an exchange did (thinking, tool
2469
+ * calls, worker output). Header while live: spinner + `Working · <what>`;
2470
+ * settled: `Worked · 9 tools · 3 thoughts`. Expanded, the body paints the
2471
+ * folded events through the full-density partition, so worker lanes get
2472
+ * their bordered box and tool rows read exactly as they do in `full`.
2473
+ */
2474
+ const ExchangeFoldBlock = memo(({ foldKey, events, previous, expanded, onToggle, live, liveSpawns, selectedTurnId = null, ownership, anchorIds, settings, codeSettleTargets, codeSettleEpoch = 0 }) => {
2475
+ const COLOR = useColors();
2476
+ const SURFACE = useSurfaces();
2477
+ const label = live ? `Working · ${exchangeFoldActivity(events)}` : summarizeExchangeFold(events);
2478
+ const gap = marginTopFor(events[0], previous);
2479
+ const isRowSelected = (evt) => selectedTurnId !== null && ownership !== void 0 && isTurnHighlighted(evt, selectedTurnId, ownership);
2480
+ const highlighted = events.some((evt) => isRowSelected(evt));
2481
+ const firstAnchorId = anchorIds?.find((id) => id !== void 0);
2482
+ const anchorByEvent = useMemo(() => {
2483
+ const map = /* @__PURE__ */ new Map();
2484
+ anchorIds?.forEach((id, i) => {
2485
+ if (id !== void 0 && events[i]) map.set(events[i], id);
2486
+ });
2487
+ return map;
2488
+ }, [events, anchorIds]);
2489
+ const body = useMemo(() => expanded ? partitionTranscript(events, {
2490
+ ...settings,
2491
+ transcriptDensity: "full",
2492
+ groupToolCalls: false
2493
+ }) : [], [
2494
+ expanded,
2495
+ events,
2496
+ settings
2497
+ ]);
2498
+ return /* @__PURE__ */ jsxs("box", {
2499
+ id: expanded ? void 0 : firstAnchorId,
2500
+ style: {
2501
+ paddingTop: gap,
2502
+ backgroundColor: !expanded && highlighted ? SURFACE.selection : SURFACE.background,
2503
+ alignSelf: "stretch",
2504
+ flexShrink: 0,
2505
+ flexDirection: "column"
2506
+ },
2507
+ children: [/* @__PURE__ */ jsx$1(CollapsibleHeader, {
2508
+ expanded,
2509
+ label,
2510
+ onToggle: () => onToggle(foldKey),
2511
+ prefix: live ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx$1(StatusSpinner, { color: COLOR.accent }), " "] }) : void 0,
2512
+ reserved: live ? 2 : 0
2513
+ }), expanded && body.map((item, i) => {
2514
+ if (item.kind === "event") return /* @__PURE__ */ jsx$1(EventLine, {
2515
+ event: item.event,
2516
+ previous: i === 0 ? item.event : item.previous,
2517
+ selected: isRowSelected(item.event),
2518
+ anchorId: anchorByEvent.get(item.event),
2519
+ settleCodeEpoch: codeSettleTargets?.has(item.event) ? codeSettleEpoch : 0,
2520
+ liveSpawn: item.event.kind === "spawn-start" ? liveSpawns?.find((spawn) => spawn.id === item.event.childId) : void 0
2521
+ }, i);
2522
+ const lane = item.events;
2523
+ return /* @__PURE__ */ jsx$1(SubagentBlock, {
2524
+ events: lane,
2525
+ previous: i === 0 ? void 0 : item.previous,
2526
+ selectedTurnId,
2527
+ anchorIds: lane.map((e) => anchorByEvent.get(e)),
2528
+ codeSettleTargets,
2529
+ codeSettleEpoch,
2530
+ live: liveSpawns?.filter((spawn) => lane.some((e) => e.childId === spawn.id))
2531
+ }, i);
2532
+ })]
2533
+ });
2534
+ }, (prev, next) => sameElements(prev.events, next.events) && sameElements(prev.anchorIds, next.anchorIds) && sameElements(prev.liveSpawns, next.liveSpawns) && prev.foldKey === next.foldKey && prev.previous === next.previous && prev.expanded === next.expanded && prev.live === next.live && prev.onToggle === next.onToggle && prev.selectedTurnId === next.selectedTurnId && prev.ownership === next.ownership && prev.settings === next.settings && prev.codeSettleTargets === next.codeSettleTargets && prev.codeSettleEpoch === next.codeSettleEpoch);
2447
2535
  const NO_SEARCH_MATCHES = {
2448
2536
  direct: /* @__PURE__ */ new Set(),
2449
2537
  callIds: /* @__PURE__ */ new Set(),
@@ -2603,7 +2691,7 @@ function Transcript({ events, settings, selectedTurnId = null, busy = false, sea
2603
2691
  for (let i = items.length - 1; i >= 0 && open.size > 0; i--) {
2604
2692
  const item = items[i];
2605
2693
  const here = [];
2606
- for (const [id, child] of open) if (item.kind === "child-run" ? item.events.some((e) => e.childId === id) : item.kind === "event" && item.event.kind === "spawn-start" && item.event.childId === id) {
2694
+ for (const [id, child] of open) if (item.kind === "child-run" || item.kind === "exchange-fold" ? item.events.some((e) => e.childId === id) : item.kind === "event" && item.event.kind === "spawn-start" && item.event.childId === id) {
2607
2695
  here.push({
2608
2696
  id,
2609
2697
  activity: spawnActivity(child.events),
@@ -2616,6 +2704,7 @@ function Transcript({ events, settings, selectedTurnId = null, busy = false, sea
2616
2704
  }
2617
2705
  return map;
2618
2706
  }, [items, events]);
2707
+ const lastFoldIndex = useMemo(() => items.findLastIndex((item) => item.kind === "exchange-fold"), [items]);
2619
2708
  useEffect(() => {
2620
2709
  if (!selectedTurnId) return;
2621
2710
  if (mouseSelectionRef.current) {
@@ -2731,6 +2820,24 @@ function Transcript({ events, settings, selectedTurnId = null, busy = false, sea
2731
2820
  ownership,
2732
2821
  anchorIds: anchors.ids[i]
2733
2822
  }, i);
2823
+ if (item.kind === "exchange-fold") {
2824
+ const live = busy && i >= lastFoldIndex && (i === items.length - 1 || exchangeFoldStats(item.events).pending > 0);
2825
+ return /* @__PURE__ */ jsx$1(ExchangeFoldBlock, {
2826
+ foldKey: item.key,
2827
+ events: item.events,
2828
+ previous: item.previous,
2829
+ expanded: expandedGroups.has(item.key),
2830
+ onToggle: toggleGroup,
2831
+ live,
2832
+ liveSpawns: liveByItem.get(i),
2833
+ selectedTurnId,
2834
+ ownership,
2835
+ anchorIds: anchors.ids[i],
2836
+ settings,
2837
+ codeSettleTargets: codeSettle.current.targets,
2838
+ codeSettleEpoch: codeSettle.current.epoch
2839
+ }, i);
2840
+ }
2734
2841
  return /* @__PURE__ */ jsx$1(SubagentBlock, {
2735
2842
  events: item.events,
2736
2843
  previous: item.previous,
@@ -2910,10 +3017,119 @@ function summarizeToolGroup(events) {
2910
3017
  if (commands > 0) parts.push(`${commands} command${commands === 1 ? "" : "s"}`);
2911
3018
  return parts.join(" · ");
2912
3019
  }
3020
+ /**
3021
+ * Compact density: does this visible event fold into the exchange's one
3022
+ * row? Thinking, tool traffic, worker lifecycle and everything a worker
3023
+ * produced fold; the prompt, the assistant's prose, errors, notices, the
3024
+ * user's own `!` runs and session events stay in the transcript.
3025
+ */
3026
+ function foldsInCompact(event) {
3027
+ if ((event.depth ?? 0) > 0 || event.childId) return true;
3028
+ switch (event.kind) {
3029
+ case "thinking":
3030
+ case "spawn-start":
3031
+ case "spawn-end": return true;
3032
+ case "tool":
3033
+ case "tool-result": return !isUserBashEvent(event);
3034
+ case "info": return event.notice === void 0;
3035
+ default: return false;
3036
+ }
3037
+ }
3038
+ /**
3039
+ * Per-event fold keys for `Settings.transcriptDensity: 'compact'`: one
3040
+ * key per exchange (split at {@link TOOL_GROUP_BOUNDARIES}), tagged on
3041
+ * every event that {@link foldsInCompact}. Unlike tool groups a single
3042
+ * folded event is enough: compact means the exchange reads as prompt and
3043
+ * answer, whatever happened in between. The key derives from the first
3044
+ * folded event so a live exchange keeps growing under a stable key.
3045
+ */
3046
+ function computeExchangeFoldKeys(visible) {
3047
+ const keys = Array.from({ length: visible.length }).fill(null);
3048
+ let exchange = [];
3049
+ let ordinal = 0;
3050
+ const flush = () => {
3051
+ if (exchange.length > 0) {
3052
+ const first = visible[exchange[0]];
3053
+ const key = `exchange-fold-${first.callId ?? first.childId ?? first.turnId ?? ordinal}`;
3054
+ for (const i of exchange) keys[i] = key;
3055
+ }
3056
+ exchange = [];
3057
+ ordinal += 1;
3058
+ };
3059
+ for (let i = 0; i < visible.length; i++) {
3060
+ const event = visible[i];
3061
+ if (TOOL_GROUP_BOUNDARIES.has(event.kind)) {
3062
+ flush();
3063
+ continue;
3064
+ }
3065
+ if (foldsInCompact(event)) exchange.push(i);
3066
+ }
3067
+ flush();
3068
+ return keys;
3069
+ }
3070
+ function exchangeFoldStats(events) {
3071
+ const stats = {
3072
+ tools: 0,
3073
+ thoughts: 0,
3074
+ workers: 0,
3075
+ pending: 0
3076
+ };
3077
+ const workers = /* @__PURE__ */ new Set();
3078
+ const open = /* @__PURE__ */ new Set();
3079
+ for (const event of events) {
3080
+ if (event.childId) workers.add(event.childId);
3081
+ const child = (event.depth ?? 0) > 0 || event.childId !== void 0;
3082
+ switch (event.kind) {
3083
+ case "thinking":
3084
+ if (!child) stats.thoughts += 1;
3085
+ break;
3086
+ case "tool":
3087
+ if (!child) {
3088
+ stats.tools += 1;
3089
+ if (event.callId) open.add(event.callId);
3090
+ }
3091
+ break;
3092
+ case "tool-result":
3093
+ if (!child && event.callId) open.delete(event.callId);
3094
+ break;
3095
+ default: break;
3096
+ }
3097
+ }
3098
+ stats.workers = workers.size;
3099
+ stats.pending = open.size;
3100
+ return stats;
3101
+ }
3102
+ /** Settled fold header: `Worked · 9 tools · 3 thoughts · 2 workers`. */
3103
+ function summarizeExchangeFold(events) {
3104
+ const stats = exchangeFoldStats(events);
3105
+ const parts = ["Worked"];
3106
+ if (stats.tools > 0) parts.push(`${stats.tools} tool${stats.tools === 1 ? "" : "s"}`);
3107
+ if (stats.thoughts > 0) parts.push(`${stats.thoughts} thought${stats.thoughts === 1 ? "" : "s"}`);
3108
+ if (stats.workers > 0) parts.push(`${stats.workers} worker${stats.workers === 1 ? "" : "s"}`);
3109
+ return parts.join(" · ");
3110
+ }
3111
+ /**
3112
+ * What a live fold says it is doing: the tool's formatted target when it
3113
+ * has one (`read_file src/x.ts`), otherwise the same vocabulary the
3114
+ * subagent marker tail uses (`thinking`, `tool call ×3`).
3115
+ */
3116
+ function exchangeFoldActivity(events) {
3117
+ const last = events[events.length - 1];
3118
+ if (last && (last.kind === "tool" || last.kind === "tool-result") && last.tool) {
3119
+ const call = last.kind === "tool" ? last : [...events].reverse().find((e) => e.kind === "tool" && e.callId === last.callId);
3120
+ const target = call?.input ? formatToolCall(last.tool, call.input)?.target : void 0;
3121
+ if (target) return `${displayNameFor(last.tool)} ${target}`;
3122
+ }
3123
+ if (last?.kind === "spawn-start") return "delegating to a worker";
3124
+ if (last?.kind === "spawn-end") return "worker finished";
3125
+ return spawnActivity(events);
3126
+ }
2913
3127
  function partitionTranscript(events, settings, searchReveal) {
2914
3128
  const visible = collapseCompletedSpawnStarts(events).filter((event) => isVisible(event, settings) || searchReveal !== void 0 && (event.depth ?? 0) === 0 && searchReveal(event));
2915
3129
  if (visible.length === 0) return [];
2916
- const groupKeys = settings.groupToolCalls && searchReveal === void 0 ? computeToolGroupKeys(visible) : null;
3130
+ const compact = settings.transcriptDensity === "compact" && searchReveal === void 0;
3131
+ const groupKeys = compact ? computeExchangeFoldKeys(visible) : settings.groupToolCalls && searchReveal === void 0 ? computeToolGroupKeys(visible) : null;
3132
+ const groupKind = compact ? "exchange-fold" : "tool-group";
2917
3133
  const groups = /* @__PURE__ */ new Map();
2918
3134
  const items = [];
2919
3135
  let lanes = /* @__PURE__ */ new Map();
@@ -2941,7 +3157,7 @@ function partitionTranscript(events, settings, searchReveal) {
2941
3157
  if (group) group.events.push(event);
2942
3158
  else {
2943
3159
  const created = {
2944
- kind: "tool-group",
3160
+ kind: groupKind,
2945
3161
  key: groupKey,
2946
3162
  events: [event],
2947
3163
  previous: visible[i - 1]
@@ -23619,7 +23835,15 @@ function AppShell() {
23619
23835
  artifactCatalogSessionRef.current = null;
23620
23836
  }), [subscribeArtifacts]);
23621
23837
  const [panelState, setPanelState] = useState(INITIAL_PANEL_STATE);
23622
- const panelTabs = useMemo(() => buildPanelCatalog(filteredExtensionRegistry.panels, { showArtifacts: settings.artifacts !== false }), [filteredExtensionRegistry.panels, settings.artifacts]);
23838
+ const panelTabs = useMemo(() => buildPanelCatalog(filteredExtensionRegistry.panels, {
23839
+ showArtifacts: settings.artifacts !== false,
23840
+ omitBuiltins: [
23841
+ "inbox",
23842
+ "todos",
23843
+ "diffs",
23844
+ "files"
23845
+ ]
23846
+ }), [filteredExtensionRegistry.panels, settings.artifacts]);
23623
23847
  const activePanelTab = useMemo(() => resolveActiveTab(panelState, panelTabs), [panelState, panelTabs]);
23624
23848
  const panelLoadCtx = useMemo(() => ({
23625
23849
  ...currentSession ? { sessionId: currentSession.id } : {},
@@ -25911,26 +26135,52 @@ function AppShell() {
25911
26135
  if (!resumeProvider) return;
25912
26136
  let cancelled = false;
25913
26137
  (async () => {
26138
+ let storeError;
25914
26139
  if (resumeLastSessionOnLaunch && lastResumedSessionId) {
25915
- const data = await store.load(lastResumedSessionId);
26140
+ let data = null;
26141
+ try {
26142
+ data = await store.load(lastResumedSessionId);
26143
+ } catch (err) {
26144
+ storeError = err;
26145
+ bootTick(`resume:load-failed (sessionId=${lastResumedSessionId.slice(-8)})`);
26146
+ }
25916
26147
  if (data) demoteStaleRunningStatus(data);
25917
26148
  if (cancelled) return;
25918
26149
  const sessionMatchesProject = settings.showAllProjects || data?.projectRoot != null && data.projectRoot === projectDir;
25919
- if (data && sessionMatchesProject) {
26150
+ if (data && sessionMatchesProject) try {
25920
26151
  await activateSessionRef.current(lastResumedSessionId, resumeProvider.key);
25921
26152
  bootTick(`resume:activate (sessionId=${lastResumedSessionId.slice(-8)})`);
25922
26153
  return;
26154
+ } catch (err) {
26155
+ if (cancelled) return;
26156
+ storeError = err;
26157
+ bootTick(`resume:activate-failed (sessionId=${lastResumedSessionId.slice(-8)})`);
25923
26158
  }
25924
26159
  }
25925
- const list = await refreshSessionsRef.current();
26160
+ let list = [];
26161
+ try {
26162
+ list = await refreshSessionsRef.current();
26163
+ } catch (err) {
26164
+ storeError ??= err;
26165
+ bootTick("resume:list-failed");
26166
+ }
25926
26167
  if (cancelled) return;
25927
- if (list.length === 0) {
26168
+ if (list.length === 0) try {
25928
26169
  await activateSessionRef.current(null, resumeProvider.key);
25929
26170
  bootTick("resume:fresh-session (empty list)");
25930
- } else {
26171
+ } catch (err) {
26172
+ storeError ??= err;
26173
+ bootTick("resume:fresh-session-failed");
26174
+ }
26175
+ else {
25931
26176
  setScreen("sessions");
25932
26177
  bootTick(`resume:sessions-list (${list.length})`);
25933
26178
  }
26179
+ if (cancelled) return;
26180
+ if (storeError !== void 0) stream.appendImmediate({
26181
+ kind: "error",
26182
+ text: errorMessage(storeError)
26183
+ });
25934
26184
  })();
25935
26185
  return () => {
25936
26186
  cancelled = true;