@tutti-os/agent-gui 0.0.74 → 0.0.76

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 (83) hide show
  1. package/README.md +17 -0
  2. package/dist/agent-conversation/index.d.ts +4 -4
  3. package/dist/agent-conversation/index.js +8 -8
  4. package/dist/agent-message-center/index.d.ts +2 -2
  5. package/dist/agent-message-center/index.js +170 -12
  6. package/dist/agent-message-center/index.js.map +1 -1
  7. package/dist/{agentConversationVM-DPAgUJlR.d.ts → agentConversationVM-BgoqFyE9.d.ts} +1 -1
  8. package/dist/{agentGuiNodeTypes-C0WUHQzu.d.ts → agentGuiNodeTypes-CmuJ7VDZ.d.ts} +15 -5
  9. package/dist/app/renderer/agentactivity.css +110 -27
  10. package/dist/app/renderer/assets/icons/agents/cursor-colorful.png +0 -0
  11. package/dist/app/renderer/assets/icons/agents/opencode-rounded.png +0 -0
  12. package/dist/app/renderer/assets/icons/agents/provider-rail-opencode-colorful.png +0 -0
  13. package/dist/{chunk-GLMDAZSQ.js → chunk-3FYA2K4P.js} +76 -7
  14. package/dist/chunk-3FYA2K4P.js.map +1 -0
  15. package/dist/{chunk-RA3OUR64.js → chunk-4HP6V2YA.js} +16 -2
  16. package/dist/chunk-4HP6V2YA.js.map +1 -0
  17. package/dist/{chunk-W5AJTBA7.js → chunk-4TNM6ZEC.js} +3 -100
  18. package/dist/chunk-4TNM6ZEC.js.map +1 -0
  19. package/dist/{chunk-6EREXANR.js → chunk-52GTPN7X.js} +3 -14
  20. package/dist/chunk-52GTPN7X.js.map +1 -0
  21. package/dist/{chunk-ZSYDFQ4N.js → chunk-7GSBP5CN.js} +36 -15
  22. package/dist/chunk-7GSBP5CN.js.map +1 -0
  23. package/dist/{chunk-T5CEU7WH.js → chunk-BEM3KDOJ.js} +3 -3
  24. package/dist/chunk-BEM3KDOJ.js.map +1 -0
  25. package/dist/{chunk-VERGPY42.js → chunk-GZX2SGAG.js} +2 -2
  26. package/dist/{chunk-NO7WDGST.js → chunk-KELYWKTC.js} +28 -6
  27. package/dist/chunk-KELYWKTC.js.map +1 -0
  28. package/dist/{chunk-FPODKSSV.js → chunk-L2ZMLLYL.js} +12 -5
  29. package/dist/chunk-L2ZMLLYL.js.map +1 -0
  30. package/dist/{chunk-LWFV4PS5.js → chunk-M6FZ2YIR.js} +3 -3
  31. package/dist/chunk-M6FZ2YIR.js.map +1 -0
  32. package/dist/{chunk-D2Z2QZVE.js → chunk-MNESUMOS.js} +2 -2
  33. package/dist/{chunk-KVS7J7BJ.js → chunk-QDKD6RNC.js} +15 -6
  34. package/dist/{chunk-KVS7J7BJ.js.map → chunk-QDKD6RNC.js.map} +1 -1
  35. package/dist/{chunk-FHWE5SUF.js → chunk-RIRFNGPB.js} +7 -3
  36. package/dist/chunk-RIRFNGPB.js.map +1 -0
  37. package/dist/{chunk-SL2QSEIE.js → chunk-SYWMKIRW.js} +4 -4
  38. package/dist/{chunk-RF7GK4SM.js → chunk-U6AZ3XQS.js} +25 -6
  39. package/dist/chunk-U6AZ3XQS.js.map +1 -0
  40. package/dist/{chunk-Z72JKSAY.js → chunk-U6EDUTUO.js} +4 -4
  41. package/dist/{chunk-MYD37I32.js → chunk-VAKFNNKT.js} +1 -15
  42. package/dist/chunk-VAKFNNKT.js.map +1 -0
  43. package/dist/{chunk-BTUOROCD.js → chunk-XW4CVBUH.js} +2 -2
  44. package/dist/chunk-XW4CVBUH.js.map +1 -0
  45. package/dist/{chunk-4XIHKCWC.js → chunk-YWQHNFYA.js} +2 -2
  46. package/dist/context-mention-palette/index.js +9 -9
  47. package/dist/i18n/index.d.ts +2 -96
  48. package/dist/i18n/index.js +2 -2
  49. package/dist/index.d.ts +49 -7
  50. package/dist/index.js +1167 -617
  51. package/dist/index.js.map +1 -1
  52. package/dist/plan-decision-ops.d.ts +2 -2
  53. package/dist/queued-prompt-runtime.d.ts +3 -5
  54. package/dist/queued-prompt-runtime.js +1 -1
  55. package/dist/workbench/contribution.js +5 -5
  56. package/dist/workbench/index.js +8 -8
  57. package/dist/workbench/launch.d.ts +1 -1
  58. package/dist/workbench/launch.js +2 -2
  59. package/dist/workbench/providerCatalog.js +1 -1
  60. package/dist/workbench/sessionTitle.js +3 -3
  61. package/dist/workbench/state.js +2 -2
  62. package/dist/workspace-agent-generated-files.d.ts +1 -1
  63. package/dist/workspace-agent-generated-files.js +4 -4
  64. package/dist/{workspaceAgentActivityListViewModel-DJvAqZso.d.ts → workspaceAgentActivityListViewModel-TXH1VXrk.d.ts} +0 -10
  65. package/package.json +12 -12
  66. package/dist/chunk-6EREXANR.js.map +0 -1
  67. package/dist/chunk-BTUOROCD.js.map +0 -1
  68. package/dist/chunk-FHWE5SUF.js.map +0 -1
  69. package/dist/chunk-FPODKSSV.js.map +0 -1
  70. package/dist/chunk-GLMDAZSQ.js.map +0 -1
  71. package/dist/chunk-LWFV4PS5.js.map +0 -1
  72. package/dist/chunk-MYD37I32.js.map +0 -1
  73. package/dist/chunk-NO7WDGST.js.map +0 -1
  74. package/dist/chunk-RA3OUR64.js.map +0 -1
  75. package/dist/chunk-RF7GK4SM.js.map +0 -1
  76. package/dist/chunk-T5CEU7WH.js.map +0 -1
  77. package/dist/chunk-W5AJTBA7.js.map +0 -1
  78. package/dist/chunk-ZSYDFQ4N.js.map +0 -1
  79. /package/dist/{chunk-VERGPY42.js.map → chunk-GZX2SGAG.js.map} +0 -0
  80. /package/dist/{chunk-D2Z2QZVE.js.map → chunk-MNESUMOS.js.map} +0 -0
  81. /package/dist/{chunk-SL2QSEIE.js.map → chunk-SYWMKIRW.js.map} +0 -0
  82. /package/dist/{chunk-Z72JKSAY.js.map → chunk-U6EDUTUO.js.map} +0 -0
  83. /package/dist/{chunk-4XIHKCWC.js.map → chunk-YWQHNFYA.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import { W as WorkspaceAgentActivityCard, n as WorkspaceAgentActivitySession, T as ToolCallStatusKind, q as WorkspaceAgentActivityTimelineItem } from './workspaceAgentActivityListViewModel-DJvAqZso.js';
1
+ import { W as WorkspaceAgentActivityCard, n as WorkspaceAgentActivitySession, T as ToolCallStatusKind, q as WorkspaceAgentActivityTimelineItem } from './workspaceAgentActivityListViewModel-TXH1VXrk.js';
2
2
 
3
3
  interface WorkspaceAgentSessionDetailMessage {
4
4
  id: string;
@@ -1,7 +1,7 @@
1
1
  import { AgentActivityUsage } from '@tutti-os/agent-activity-core';
2
2
  import { k as AgentHostAgentSessionCommand, l as AgentHostAgentSessionComposerSettings, n as AgentHostAgentSessionReasoningEffort, o as AgentHostAgentSessionSpeed, m as AgentHostAgentSessionPermissionConfig, p as AgentHostAgentSessionState, a as AgentGUIProvider, s as AgentPromptContentBlock, A as AgentGUINodeData, g as AgentGUIProviderTarget, c as AgentGUIProviderRailMode, d as AgentGUIProviderReadinessGate } from './types-DUHHejs2.js';
3
- import { A as AgentHostBatchUserInfoInput, a as AgentHostBatchUserInfoResult, b as AgentHostDeleteWorkspaceAgentSessionInput, k as AgentHostWorkspaceAgentSessionSummaryInput, j as AgentHostWorkspaceAgentSessionSummary, e as AgentHostWorkspaceAgentListInput, l as AgentHostWorkspaceAgentSnapshot, i as AgentHostWorkspaceAgentSessionMessagesInput, h as AgentHostWorkspaceAgentSessionMessages, p as WorkspaceAgentActivitySyncState } from './workspaceAgentActivityListViewModel-DJvAqZso.js';
4
- import { A as AgentApprovalItemVM, a as AgentAskUserQuestionVM, b as AgentConversationPromptVM, c as AgentConversationVM, W as WorkspaceAgentSessionDetailViewModel } from './agentConversationVM-DPAgUJlR.js';
3
+ import { A as AgentHostBatchUserInfoInput, a as AgentHostBatchUserInfoResult, b as AgentHostDeleteWorkspaceAgentSessionInput, k as AgentHostWorkspaceAgentSessionSummaryInput, j as AgentHostWorkspaceAgentSessionSummary, e as AgentHostWorkspaceAgentListInput, l as AgentHostWorkspaceAgentSnapshot, i as AgentHostWorkspaceAgentSessionMessagesInput, h as AgentHostWorkspaceAgentSessionMessages, p as WorkspaceAgentActivitySyncState } from './workspaceAgentActivityListViewModel-TXH1VXrk.js';
4
+ import { A as AgentApprovalItemVM, a as AgentAskUserQuestionVM, b as AgentConversationPromptVM, c as AgentConversationVM, W as WorkspaceAgentSessionDetailViewModel } from './agentConversationVM-BgoqFyE9.js';
5
5
  import { WorkspaceUserProjectService } from '@tutti-os/workspace-user-project/contracts';
6
6
 
7
7
  declare const APP_ERROR_CODES: readonly ["common.invalid_input", "common.approved_path_required", "common.unavailable", "common.unexpected", "session.not_found", "control_surface.unauthorized", "workspace.select_directory_failed", "workspace.select_files_failed", "workspace.ensure_directory_failed", "workspace.import_files_failed", "workspace.read_file_failed", "workspace.write_file_failed", "workspace.export_file_failed", "workspace.copy_path_failed", "workspace.host_unsupported", "workspace.runtime_artifact_unavailable", "runtime.guest_agent_lane_unavailable", "workspace.room_full", "workspace.room_delete_forbidden", "workspace.room_delete_not_found", "filesystem.create_directory_failed", "filesystem.read_file_bytes_failed", "filesystem.read_file_text_failed", "filesystem.write_file_text_failed", "filesystem.copy_entry_failed", "filesystem.move_entry_failed", "filesystem.rename_entry_failed", "filesystem.delete_entry_failed", "filesystem.read_directory_failed", "filesystem.stat_failed", "terminal.spawn_failed", "terminal.write_failed", "terminal.resize_failed", "terminal.close_failed", "terminal.attach_failed", "terminal.detach_failed", "terminal.snapshot_failed", "agent.list_models_failed", "agent.launch_failed", "agent.read_last_message_failed", "agent.provider_session_not_found", "agent.resume_session_not_local", "agent.resume_session_resolve_failed", "agent.settings_require_new_session", "task.suggest_title_failed", "persistence.unavailable", "persistence.quota_exceeded", "persistence.payload_too_large", "persistence.io_failed", "persistence.invalid_state", "persistence.invalid_node_id", "update.get_state_failed", "update.configure_failed", "update.check_failed", "update.download_failed", "update.install_failed", "PACKAGE_DOWNLOAD_INTERRUPTED", "PACKAGE_DOWNLOAD_HTTP_STATUS", "PACKAGE_DOWNLOAD_INVALID", "PACKAGE_DOWNLOAD_DISK_ERROR"];
@@ -276,6 +276,7 @@ interface AgentHostUserProject {
276
276
  id: string;
277
277
  path: string;
278
278
  label: string;
279
+ sectionKey?: string;
279
280
  createdAtUnixMs?: number;
280
281
  updatedAtUnixMs?: number;
281
282
  lastUsedAtUnixMs?: number;
@@ -410,11 +411,12 @@ interface AgentGUIConversationProjectSummary {
410
411
  id: string;
411
412
  path: string;
412
413
  label: string;
414
+ sectionKey?: string;
413
415
  createdAtUnixMs?: number;
414
416
  updatedAtUnixMs?: number;
415
417
  lastUsedAtUnixMs?: number;
416
418
  }
417
- type AgentGUIConversationUserProject = Pick<AgentHostUserProject, "id" | "path" | "label" | "createdAtUnixMs" | "updatedAtUnixMs" | "lastUsedAtUnixMs">;
419
+ type AgentGUIConversationUserProject = Pick<AgentHostUserProject, "id" | "path" | "label" | "sectionKey" | "createdAtUnixMs" | "updatedAtUnixMs" | "lastUsedAtUnixMs">;
418
420
 
419
421
  interface AgentGUIConversationSummary {
420
422
  id: string;
@@ -476,10 +478,13 @@ interface AgentGUIInlineNotice {
476
478
  autoDismissMs: number | null;
477
479
  }
478
480
  interface AgentGUIProjectConversationDeleteTarget {
479
- conversationCount: number;
481
+ conversationCount: number | null;
480
482
  label: string;
481
483
  path: string;
482
484
  }
485
+ interface AgentGUIConversationSectionDeleteTarget {
486
+ conversationCount: number | null;
487
+ }
483
488
  interface AgentGUIComposerSettingOption {
484
489
  value: string;
485
490
  label: string;
@@ -624,6 +629,10 @@ interface AgentGUINodeViewModel {
624
629
  isInterrupting: boolean;
625
630
  isCancelPending: boolean;
626
631
  isRespondingApproval: boolean;
632
+ canCancel: boolean;
633
+ canSubmitInteractive: boolean;
634
+ canGoalControl: boolean;
635
+ canUploadAttachment: boolean;
627
636
  promptImagesSupported: boolean;
628
637
  compactSupported: boolean | null;
629
638
  /**
@@ -639,6 +648,7 @@ interface AgentGUINodeViewModel {
639
648
  isDeletingProjectConversations: boolean;
640
649
  pendingDeleteConversation: AgentGUIConversationSummary | null;
641
650
  pendingDeleteProjectConversations: AgentGUIProjectConversationDeleteTarget | null;
651
+ pendingDeleteConversations: AgentGUIConversationSectionDeleteTarget | null;
642
652
  pendingApproval: AgentGUIApprovalRequest | null;
643
653
  pendingInteractivePrompt: AgentGUIInteractivePrompt | null;
644
654
  activeLiveState: "inactive" | "activating" | "active" | "failed";
@@ -647,7 +657,7 @@ interface AgentGUINodeViewModel {
647
657
  activeConversationBusy: boolean;
648
658
  canSubmit: boolean;
649
659
  composerSettings: AgentGUIComposerSettingsVM;
650
- queuedPrompts: AgentGUIQueuedPromptVM[];
660
+ queuedPrompts: readonly AgentGUIQueuedPromptVM[];
651
661
  drainingQueuedPromptId: string | null;
652
662
  canQueueWhileBusy: boolean;
653
663
  hasSentUserMessage: boolean;
@@ -1857,6 +1857,37 @@ aside.workspace-agents-status-panel
1857
1857
  white-space: nowrap;
1858
1858
  }
1859
1859
 
1860
+ /* Compact tool-call rows when nested inside a details block (e.g. task STEPS) */
1861
+ .workspace-agents-status-panel__detail-tool-body
1862
+ .workspace-agents-status-panel__detail-tool-row-title,
1863
+ .workspace-agents-status-panel__detail-tool-body
1864
+ .workspace-agents-status-panel__detail-tool-status,
1865
+ .workspace-agents-status-panel__detail-tool-body
1866
+ .workspace-agents-status-panel__detail-tool-diff-stats,
1867
+ .workspace-agents-status-panel__detail-tool-body
1868
+ .workspace-agents-status-panel__detail-tool-row-summary {
1869
+ font-size: 11px;
1870
+ }
1871
+
1872
+ .workspace-agents-status-panel__detail-tool-body
1873
+ .workspace-agents-status-panel__detail-tool-row-icon {
1874
+ width: 14px;
1875
+ height: 14px;
1876
+ }
1877
+
1878
+ .workspace-agents-status-panel__detail-tool-body
1879
+ .workspace-agents-status-panel__detail-tool-row-icon
1880
+ svg {
1881
+ width: 14px;
1882
+ height: 14px;
1883
+ }
1884
+
1885
+ /* Looser vertical rhythm for the nested step rows so they don't feel cramped */
1886
+ .workspace-agents-status-panel__detail-tool-body
1887
+ .workspace-agents-status-panel__detail-tool-stack {
1888
+ gap: 12px;
1889
+ }
1890
+
1860
1891
  .workspace-agents-status-panel__detail-tool-row-head
1861
1892
  .workspace-agents-status-panel__detail-tool-row-chevron {
1862
1893
  flex: 0 0 auto;
@@ -1915,7 +1946,7 @@ aside.workspace-agents-status-panel
1915
1946
  .workspace-agents-status-panel__detail-tool-body {
1916
1947
  display: flex;
1917
1948
  flex-direction: column;
1918
- gap: 10px;
1949
+ gap: 16px;
1919
1950
  box-sizing: border-box;
1920
1951
  width: 100%;
1921
1952
  min-width: 0;
@@ -6315,12 +6346,8 @@ button.agent-gui-node__conversation-section-toggle:hover
6315
6346
  left: 50%;
6316
6347
  width: 1px;
6317
6348
  height: 8px;
6318
- transform: translateX(-50%);
6319
- background: color-mix(
6320
- in srgb,
6321
- var(--line-2, var(--tutti-line-2)) 82%,
6322
- transparent
6323
- );
6349
+ transform: translate(-50%, -50%);
6350
+ background: var(--line-1, var(--nexight-line-1));
6324
6351
  }
6325
6352
 
6326
6353
  .agent-gui-message-locator__tick {
@@ -6491,7 +6518,7 @@ button.agent-gui-node__conversation-section-toggle:hover
6491
6518
  box-sizing: border-box;
6492
6519
  width: 100%;
6493
6520
  min-width: 0;
6494
- padding-bottom: 24px;
6521
+ padding-bottom: 16px;
6495
6522
  will-change: transform;
6496
6523
  }
6497
6524
 
@@ -6501,7 +6528,7 @@ button.agent-gui-node__conversation-section-toggle:hover
6501
6528
  .agent-gui-transcript-virtual-item
6502
6529
  > [data-testid="agent-transcript-turn-divider"]
6503
6530
  + .agent-gui-transcript-row {
6504
- margin-top: 24px;
6531
+ margin-top: 16px;
6505
6532
  }
6506
6533
 
6507
6534
  .agent-gui-transcript-row[data-agent-transcript-row-enter="true"] {
@@ -8905,33 +8932,80 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
8905
8932
  }
8906
8933
 
8907
8934
  .agent-gui-node__empty-hero-launchpad-icon {
8908
- width: 54px;
8909
- height: 54px;
8910
- border-color: var(--tutti-purple);
8911
- border-radius: 8px;
8912
- background: var(--transparency-block);
8935
+ /* Size to the strip's actual content and stay centered. A fixed width narrower
8936
+ than the icons left-anchors the overflow, dragging the "centered" selected
8937
+ agent off to one side. */
8938
+ width: fit-content;
8939
+ max-width: 100%;
8940
+ height: 48px;
8941
+ border: 0;
8942
+ border-radius: 0;
8943
+ background: transparent;
8944
+ box-shadow: none;
8945
+ overflow: visible;
8913
8946
  color: var(--tutti-purple);
8914
8947
  animation: agent-gui-empty-hero-enter 260ms cubic-bezier(0.16, 1, 0.3, 1) 40ms
8915
8948
  both;
8916
8949
  }
8917
8950
 
8951
+ /* Hero launchpad: agents laid out as one centered horizontal group while
8952
+ neighbours fade away from the selected agent. Scoped to the hero so the left
8953
+ rail "All" tile (a single composed image) is unaffected. */
8918
8954
  .agent-gui-node__empty-hero-launchpad-icon
8919
8955
  .agent-gui-node__provider-rail-launchpad-icon {
8920
- width: 48px;
8956
+ display: flex;
8957
+ width: max-content;
8958
+ max-width: 100%;
8921
8959
  height: 48px;
8922
- gap: 3px;
8923
- padding: 1px;
8924
- border-radius: 8px;
8960
+ align-items: center;
8961
+ justify-content: center;
8962
+ gap: 10px;
8963
+ padding: 0;
8964
+ border-radius: 0;
8965
+ background: transparent;
8966
+ overflow: visible;
8925
8967
  }
8926
8968
 
8927
8969
  .agent-gui-node__empty-hero-launchpad-icon
8928
8970
  .agent-gui-node__provider-rail-launchpad-item {
8929
- border-radius: 6px;
8971
+ flex: 0 0 auto;
8972
+ width: 36px;
8973
+ height: 36px;
8974
+ border-radius: 9px;
8975
+ transition:
8976
+ opacity 220ms ease,
8977
+ transform 220ms cubic-bezier(0.16, 1, 0.3, 1),
8978
+ box-shadow 220ms ease;
8930
8979
  }
8931
8980
 
8932
8981
  .agent-gui-node__empty-hero-launchpad-icon
8933
- .agent-gui-node__provider-rail-launchpad-item[data-provider-active="false"] {
8934
- opacity: 0.5;
8982
+ .agent-gui-node__provider-rail-launchpad-item[data-provider-active="true"] {
8983
+ transform: scale(1.14);
8984
+ box-shadow: 0 0 0 1.5px var(--tutti-purple);
8985
+ }
8986
+
8987
+ /* Clickable agent switchers: reset native button chrome, keep the same box, and
8988
+ give a hover/focus affordance so the strip reads as interactive. */
8989
+ button.agent-gui-node__provider-rail-launchpad-item {
8990
+ padding: 0;
8991
+ border: 0;
8992
+ cursor: pointer;
8993
+ appearance: none;
8994
+ -webkit-appearance: none;
8995
+ }
8996
+
8997
+ .agent-gui-node__empty-hero-launchpad-icon
8998
+ button.agent-gui-node__provider-rail-launchpad-item:hover:not(
8999
+ [data-provider-active="true"]
9000
+ ) {
9001
+ opacity: 1 !important;
9002
+ transform: scale(1.08);
9003
+ }
9004
+
9005
+ .agent-gui-node__empty-hero-launchpad-icon
9006
+ button.agent-gui-node__provider-rail-launchpad-item:focus-visible {
9007
+ outline: none;
9008
+ box-shadow: 0 0 0 1.5px var(--tutti-purple);
8935
9009
  }
8936
9010
 
8937
9011
  .agent-gui-node__provider-rail-tile[data-loading="true"]
@@ -8981,6 +9055,14 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
8981
9055
  place-items: center;
8982
9056
  }
8983
9057
 
9058
+ /* The horizontal launchpad strip is wider than the single-icon slot; let the
9059
+ slot grow to the strip's width so the selected agent stays centered. */
9060
+ .agent-gui-node__empty-hero-icon-slot:has(
9061
+ > .agent-gui-node__empty-hero-launchpad-icon
9062
+ ) {
9063
+ width: auto;
9064
+ }
9065
+
8984
9066
  .agent-gui-node__empty-hero-icon-effect {
8985
9067
  display: block;
8986
9068
  width: 48px;
@@ -9069,12 +9151,11 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
9069
9151
  gap: 8px;
9070
9152
  }
9071
9153
 
9072
- .agent-gui-node__empty-provider-gate > .agent-gui-node__empty-hero-icon-effect {
9073
- margin-bottom: 10px;
9074
- }
9075
-
9076
- .agent-gui-node__empty-provider-gate > .agent-gui-node__empty-hero-title {
9077
- font-size: 24px;
9154
+ /* Gate gap is 8px; add 16px so the icon-to-title spacing is 24px. */
9155
+ .agent-gui-node__empty-provider-gate > .agent-gui-node__empty-hero-icon-effect,
9156
+ .agent-gui-node__empty-provider-gate
9157
+ > .agent-gui-node__empty-hero-launchpad-icon {
9158
+ margin-bottom: 16px;
9078
9159
  }
9079
9160
 
9080
9161
  .agent-gui-node__empty-provider-gate-description {
@@ -9098,6 +9179,8 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
9098
9179
  }
9099
9180
 
9100
9181
  .agent-gui-node__empty-provider-gate-action {
9182
+ /* Container gap is 8px; add 16px so the description-to-button spacing is 24px. */
9183
+ margin-top: 16px;
9101
9184
  animation: agent-gui-empty-hero-enter 300ms cubic-bezier(0.16, 1, 0.3, 1)
9102
9185
  190ms both;
9103
9186
  }
@@ -3,11 +3,11 @@ import {
3
3
  getOptionalAgentHostApi,
4
4
  managedAgentRoundedIconUrl,
5
5
  useOptionalAgentHostApi
6
- } from "./chunk-FHWE5SUF.js";
6
+ } from "./chunk-RIRFNGPB.js";
7
7
  import {
8
8
  translate,
9
9
  useTranslation
10
- } from "./chunk-4XIHKCWC.js";
10
+ } from "./chunk-YWQHNFYA.js";
11
11
  import {
12
12
  resolveAgentWorkspaceFileVisualKind
13
13
  } from "./chunk-PJP5BUU6.js";
@@ -1896,10 +1896,12 @@ function AgentMessageMarkdown({
1896
1896
  );
1897
1897
  const normalizedContent = useMemo(
1898
1898
  () => linkBareLocalAbsolutePaths(
1899
- normalizeMentionMarkdownLinks(
1900
- normalizePlainIssueMentionTitle ? normalizePlainIssueMentionTitleContent(
1901
- normalizePlainSessionMentionTitle(stabilizedContent)
1902
- ) : normalizePlainSessionMentionTitle(stabilizedContent)
1899
+ normalizeLocalPathMarkdownLinks(
1900
+ normalizeMentionMarkdownLinks(
1901
+ normalizePlainIssueMentionTitle ? normalizePlainIssueMentionTitleContent(
1902
+ normalizePlainSessionMentionTitle(stabilizedContent)
1903
+ ) : normalizePlainSessionMentionTitle(stabilizedContent)
1904
+ )
1903
1905
  )
1904
1906
  ),
1905
1907
  [normalizePlainIssueMentionTitle, stabilizedContent]
@@ -2961,6 +2963,73 @@ function normalizePlainIssueMentionTitleContent(content) {
2961
2963
  function normalizeMentionMarkdownLinks(content) {
2962
2964
  return content.replace(/\]([\t ]*\r?\n[\t ]*)+\((mention:\/\/)/g, "]($2").replace(/\]\((mention:\/\/[A-Za-z0-9.-]+)\)\?([^\s)]+)/g, "]($1?$2)");
2963
2965
  }
2966
+ function normalizeLocalPathMarkdownLinks(content) {
2967
+ let out = "";
2968
+ for (let index = 0; index < content.length; ) {
2969
+ const codeSpanEnd = codeSpanEndIndex(content, index);
2970
+ if (codeSpanEnd > index) {
2971
+ out += content.slice(index, codeSpanEnd);
2972
+ index = codeSpanEnd;
2973
+ continue;
2974
+ }
2975
+ const normalized = normalizeLocalPathMarkdownLinkAt(content, index);
2976
+ if (normalized) {
2977
+ out += normalized.markdown;
2978
+ index = normalized.end;
2979
+ continue;
2980
+ }
2981
+ out += content[index];
2982
+ index += 1;
2983
+ }
2984
+ return out;
2985
+ }
2986
+ function normalizeLocalPathMarkdownLinkAt(content, index) {
2987
+ if (content[index] !== "[") {
2988
+ return null;
2989
+ }
2990
+ const labelEnd = content.indexOf("]", index + 1);
2991
+ if (labelEnd < 0 || content[labelEnd + 1] !== "(") {
2992
+ return null;
2993
+ }
2994
+ const hrefStart = labelEnd + 2;
2995
+ if (content[hrefStart] === "<") {
2996
+ return null;
2997
+ }
2998
+ let hrefEnd = hrefStart;
2999
+ while (hrefEnd < content.length) {
3000
+ const current = content[hrefEnd];
3001
+ if (current === "\\" && hrefEnd + 1 < content.length) {
3002
+ hrefEnd += 2;
3003
+ continue;
3004
+ }
3005
+ if (current === "\n" || current === "\r") {
3006
+ return null;
3007
+ }
3008
+ if (current === ")") {
3009
+ break;
3010
+ }
3011
+ hrefEnd += 1;
3012
+ }
3013
+ if (content[hrefEnd] !== ")") {
3014
+ return null;
3015
+ }
3016
+ const href = content.slice(hrefStart, hrefEnd);
3017
+ const target = href.trim();
3018
+ if (target.length === 0 || !/\s/.test(target) || /[<>]/.test(target) || !isPotentialLocalMarkdownPathHref(target)) {
3019
+ return null;
3020
+ }
3021
+ return {
3022
+ markdown: `${content.slice(index, hrefStart)}<${target}>)`,
3023
+ end: hrefEnd + 1
3024
+ };
3025
+ }
3026
+ function isPotentialLocalMarkdownPathHref(href) {
3027
+ const target = href.trim();
3028
+ if (!target || target.includes("://")) {
3029
+ return false;
3030
+ }
3031
+ return target.startsWith("/") && !target.startsWith("//") || target.startsWith("~/") || target.startsWith("~\\") || /^[A-Za-z]:[\\/]/.test(target);
3032
+ }
2964
3033
  function isMentionOnlyMarkdownContent(content) {
2965
3034
  const trimmed = content.trim();
2966
3035
  if (trimmed.length === 0) {
@@ -3707,4 +3776,4 @@ export {
3707
3776
  CustomScrollArea,
3708
3777
  MessageSquareMoreIcon
3709
3778
  };
3710
- //# sourceMappingURL=chunk-GLMDAZSQ.js.map
3779
+ //# sourceMappingURL=chunk-3FYA2K4P.js.map