@tutti-os/agent-gui 0.0.94 → 0.0.95

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 (153) hide show
  1. package/README.md +48 -32
  2. package/dist/AgentGUI-CwBLYtv-.d.ts +992 -0
  3. package/dist/agent-conversation/index.d.ts +5 -7
  4. package/dist/agent-conversation/index.js +12 -8
  5. package/dist/agent-conversation/index.js.map +1 -1
  6. package/dist/agent-env/index.d.ts +10 -36
  7. package/dist/agent-env/index.js +1 -56
  8. package/dist/agent-env/index.js.map +1 -1
  9. package/dist/agent-gui.d.ts +21 -0
  10. package/dist/agent-gui.js +39 -0
  11. package/dist/agent-message-center/index.d.ts +145 -124
  12. package/dist/agent-message-center/index.js +1374 -1316
  13. package/dist/agent-message-center/index.js.map +1 -1
  14. package/dist/{agentConversationVM-Cl4G0Lln.d.ts → agentConversationVM-C335TR6S.d.ts} +112 -7
  15. package/dist/agentFileMentionContracts-Czvz6YMI.d.ts +107 -0
  16. package/dist/{agentGuiNodeTypes-CAioPXK9.d.ts → agentGuiNodeTypes-DppADPHW.d.ts} +96 -148
  17. package/dist/agentPlanPromptDispatch-C7cCMjve.d.ts +37 -0
  18. package/dist/agents.d.ts +13 -0
  19. package/dist/agents.js +13 -0
  20. package/dist/app/renderer/agentactivity.css +126 -80
  21. package/dist/app/renderer/assets/icons/agent-vinyls/tutti-vinyl.png +0 -0
  22. package/dist/app/renderer/assets/icons/open-link-lined.svg +4 -0
  23. package/dist/{chunk-P72YLKC6.js → chunk-3R2D4E57.js} +3127 -3398
  24. package/dist/chunk-3R2D4E57.js.map +1 -0
  25. package/dist/chunk-4YG7YK7S.js +23 -0
  26. package/dist/chunk-4YG7YK7S.js.map +1 -0
  27. package/dist/chunk-5X7YDOC6.js +42 -0
  28. package/dist/chunk-5X7YDOC6.js.map +1 -0
  29. package/dist/{chunk-IBIMGLCD.js → chunk-7J4K6WKB.js} +1 -1
  30. package/dist/chunk-7J4K6WKB.js.map +1 -0
  31. package/dist/{chunk-BXVPOGYK.js → chunk-7PFDA2HQ.js} +505 -504
  32. package/dist/chunk-7PFDA2HQ.js.map +1 -0
  33. package/dist/{chunk-AWAIUYG4.js → chunk-7RDD3EWP.js} +513 -555
  34. package/dist/chunk-7RDD3EWP.js.map +1 -0
  35. package/dist/{chunk-UBDPV34P.js → chunk-AOS2VWU6.js} +1355 -1305
  36. package/dist/chunk-AOS2VWU6.js.map +1 -0
  37. package/dist/{chunk-E5FOXRUM.js → chunk-BFNJKTDV.js} +295 -255
  38. package/dist/chunk-BFNJKTDV.js.map +1 -0
  39. package/dist/{chunk-5FE7M42A.js → chunk-BIHBXWK5.js} +2 -2
  40. package/dist/{chunk-7BUYFVRI.js → chunk-C5FV4UGI.js} +2921 -2944
  41. package/dist/chunk-C5FV4UGI.js.map +1 -0
  42. package/dist/{chunk-SCLLP5DO.js → chunk-CRO2MV2Y.js} +36 -46
  43. package/dist/chunk-CRO2MV2Y.js.map +1 -0
  44. package/dist/chunk-FGLQZ6I4.js +9 -0
  45. package/dist/chunk-FGLQZ6I4.js.map +1 -0
  46. package/dist/chunk-H6IQ63DQ.js +14 -0
  47. package/dist/chunk-H6IQ63DQ.js.map +1 -0
  48. package/dist/{chunk-IGY4ASUF.js → chunk-JX2SIXNL.js} +1293 -1702
  49. package/dist/chunk-JX2SIXNL.js.map +1 -0
  50. package/dist/chunk-KAL4XZMA.js +231 -0
  51. package/dist/chunk-KAL4XZMA.js.map +1 -0
  52. package/dist/chunk-KJQERFKX.js +259 -0
  53. package/dist/chunk-KJQERFKX.js.map +1 -0
  54. package/dist/chunk-LQVXBT65.js +491 -0
  55. package/dist/chunk-LQVXBT65.js.map +1 -0
  56. package/dist/{chunk-554VG7ZW.js → chunk-NITOD7WF.js} +2 -2
  57. package/dist/{chunk-7LMJXF4R.js → chunk-NJAZ7LQM.js} +20 -16
  58. package/dist/chunk-NJAZ7LQM.js.map +1 -0
  59. package/dist/chunk-NX3CZJXW.js +25 -0
  60. package/dist/chunk-NX3CZJXW.js.map +1 -0
  61. package/dist/chunk-O6W72SEP.js +93 -0
  62. package/dist/chunk-O6W72SEP.js.map +1 -0
  63. package/dist/chunk-RY6GIO3K.js +31700 -0
  64. package/dist/chunk-RY6GIO3K.js.map +1 -0
  65. package/dist/{chunk-XDV4ZRVK.js → chunk-UGVI47X6.js} +98 -37
  66. package/dist/chunk-UGVI47X6.js.map +1 -0
  67. package/dist/{chunk-XW4CVBUH.js → chunk-UQJPV6HP.js} +18 -11
  68. package/dist/chunk-UQJPV6HP.js.map +1 -0
  69. package/dist/{chunk-GAPTLVII.js → chunk-VF22EG3F.js} +1 -1
  70. package/dist/{chunk-GAPTLVII.js.map → chunk-VF22EG3F.js.map} +1 -1
  71. package/dist/{chunk-45FF4DQU.js → chunk-WEDMAVX2.js} +22 -24
  72. package/dist/chunk-WEDMAVX2.js.map +1 -0
  73. package/dist/{chunk-MATIJPGF.js → chunk-XMO45GKA.js} +531 -401
  74. package/dist/chunk-XMO45GKA.js.map +1 -0
  75. package/dist/{chunk-ZUW4B5AT.js → chunk-YE25HN6T.js} +6 -9
  76. package/dist/chunk-YE25HN6T.js.map +1 -0
  77. package/dist/context-mention-palette/index.d.ts +3 -2
  78. package/dist/context-mention-palette/index.js +19 -14
  79. package/dist/custom-mention.d.ts +44 -0
  80. package/dist/custom-mention.js +17 -0
  81. package/dist/custom-mention.js.map +1 -0
  82. package/dist/dock-icons.d.ts +6 -0
  83. package/dist/dock-icons.js +11 -0
  84. package/dist/dock-icons.js.map +1 -0
  85. package/dist/i18n/index.d.ts +850 -841
  86. package/dist/i18n/index.js +2 -2
  87. package/dist/index.d.ts +52 -1061
  88. package/dist/index.js +72 -35530
  89. package/dist/index.js.map +1 -1
  90. package/dist/mention-search.d.ts +226 -0
  91. package/dist/mention-search.js +29 -0
  92. package/dist/mention-search.js.map +1 -0
  93. package/dist/open-link-lined-JWEKUKME.svg +4 -0
  94. package/dist/provider-icons.d.ts +6 -0
  95. package/dist/provider-icons.js +12 -0
  96. package/dist/provider-icons.js.map +1 -0
  97. package/dist/provider-identity.d.ts +9 -0
  98. package/dist/provider-identity.js +21 -0
  99. package/dist/provider-identity.js.map +1 -0
  100. package/dist/runtime-BBNdWgDU.d.ts +10 -0
  101. package/dist/{types-PLFZ8SBX.d.ts → types-DX2bxgB8.d.ts} +28 -83
  102. package/dist/workbench/contribution.d.ts +32 -40
  103. package/dist/workbench/contribution.js +10 -6
  104. package/dist/workbench/index.d.ts +3 -2
  105. package/dist/workbench/index.js +24 -20
  106. package/dist/workbench/launch.d.ts +2 -5
  107. package/dist/workbench/launch.js +4 -3
  108. package/dist/workbench/providerCatalog.js +2 -1
  109. package/dist/workbench/sessionTitle.d.ts +4 -3
  110. package/dist/workbench/sessionTitle.js +4 -3
  111. package/dist/workbench/state.d.ts +1 -1
  112. package/dist/workbench/state.js +3 -2
  113. package/dist/workbench/types.d.ts +0 -3
  114. package/dist/workbench/types.js +1 -1
  115. package/dist/workspace-agent-generated-files.d.ts +20 -2
  116. package/dist/workspace-agent-generated-files.js +7 -6
  117. package/dist/workspaceAgentActivityListTypes-C7gPWYiA.d.ts +71 -0
  118. package/package.json +63 -26
  119. package/dist/AgentMentionSearchController-DD_WOred.d.ts +0 -241
  120. package/dist/AgentMessageMarkdown-DeYPURtF.d.ts +0 -7
  121. package/dist/chunk-45FF4DQU.js.map +0 -1
  122. package/dist/chunk-4HP6V2YA.js +0 -207
  123. package/dist/chunk-4HP6V2YA.js.map +0 -1
  124. package/dist/chunk-7BUYFVRI.js.map +0 -1
  125. package/dist/chunk-7LMJXF4R.js.map +0 -1
  126. package/dist/chunk-AWAIUYG4.js.map +0 -1
  127. package/dist/chunk-BXVPOGYK.js.map +0 -1
  128. package/dist/chunk-E5FOXRUM.js.map +0 -1
  129. package/dist/chunk-IBIMGLCD.js.map +0 -1
  130. package/dist/chunk-IGY4ASUF.js.map +0 -1
  131. package/dist/chunk-LR4FA5X6.js +0 -368
  132. package/dist/chunk-LR4FA5X6.js.map +0 -1
  133. package/dist/chunk-MATIJPGF.js.map +0 -1
  134. package/dist/chunk-MKHDRIGN.js +0 -71
  135. package/dist/chunk-MKHDRIGN.js.map +0 -1
  136. package/dist/chunk-P72YLKC6.js.map +0 -1
  137. package/dist/chunk-SCLLP5DO.js.map +0 -1
  138. package/dist/chunk-UBDPV34P.js.map +0 -1
  139. package/dist/chunk-VAKFNNKT.js +0 -410
  140. package/dist/chunk-VAKFNNKT.js.map +0 -1
  141. package/dist/chunk-XDV4ZRVK.js.map +0 -1
  142. package/dist/chunk-XW4CVBUH.js.map +0 -1
  143. package/dist/chunk-ZUW4B5AT.js.map +0 -1
  144. package/dist/plan-decision-ops.d.ts +0 -70
  145. package/dist/plan-decision-ops.js +0 -19
  146. package/dist/queued-prompt-runtime.d.ts +0 -115
  147. package/dist/queued-prompt-runtime.js +0 -9
  148. package/dist/workspaceAgentActivityListViewModel-BzV-cf0D.d.ts +0 -340
  149. package/dist/workspaceLinkActions-DS9LWqzI.d.ts +0 -74
  150. /package/dist/{plan-decision-ops.js.map → agent-gui.js.map} +0 -0
  151. /package/dist/{queued-prompt-runtime.js.map → agents.js.map} +0 -0
  152. /package/dist/{chunk-5FE7M42A.js.map → chunk-BIHBXWK5.js.map} +0 -0
  153. /package/dist/{chunk-554VG7ZW.js.map → chunk-NITOD7WF.js.map} +0 -0
@@ -0,0 +1,37 @@
1
+ import * as _tutti_os_agent_activity_core from '@tutti-os/agent-activity-core';
2
+ import { AgentSessionEngine, AgentSessionEngineState } from '@tutti-os/agent-activity-core';
3
+
4
+ /**
5
+ * Structural surface the binding needs from an engine instance. Matches
6
+ * AgentSessionEngine from @tutti-os/agent-activity-core, but stays structural
7
+ * so focused tests and future engine slices can bind without the full engine.
8
+ *
9
+ * Contract: `subscribe` and `getSnapshot` must be stable, this-free function
10
+ * references for the lifetime of the instance (the engine factory returns
11
+ * closures, satisfying this by construction). A fresh `subscribe` identity per
12
+ * render would force useSyncExternalStore to resubscribe on every render.
13
+ */
14
+ interface EngineStateStore<TState> {
15
+ getSnapshot(): TState;
16
+ subscribe(listener: (state: TState) => void): () => void;
17
+ }
18
+ declare function useEngineSelector<TState, TSelected>(engine: EngineStateStore<TState>, selector: (state: TState) => TSelected, isEqual?: (a: TSelected, b: TSelected) => boolean): TSelected;
19
+
20
+ declare const PLAN_IMPLEMENTATION_PROMPT = "Implement the plan.";
21
+ declare const PLAN_IMPLEMENTATION_ACTION_IMPLEMENT = "implement";
22
+ declare const PLAN_IMPLEMENTATION_ACTION_FEEDBACK = "feedback";
23
+ declare const PLAN_IMPLEMENTATION_ACTION_SKIP = "skip";
24
+
25
+ type AgentPlanPromptAction = typeof PLAN_IMPLEMENTATION_ACTION_IMPLEMENT | typeof PLAN_IMPLEMENTATION_ACTION_FEEDBACK | typeof PLAN_IMPLEMENTATION_ACTION_SKIP;
26
+ declare function selectAgentPlanPromptTurn(state: AgentSessionEngineState, agentSessionId: string, requestId: string): _tutti_os_agent_activity_core.AgentActivityTurn | null;
27
+ declare function dispatchAgentPlanPromptAction(input: {
28
+ action: AgentPlanPromptAction;
29
+ agentSessionId: string;
30
+ engine: AgentSessionEngine;
31
+ feedbackText?: string;
32
+ nowUnixMs?: () => number;
33
+ requestId: string;
34
+ workspaceId: string;
35
+ }): boolean;
36
+
37
+ export { type AgentPlanPromptAction as A, type EngineStateStore as E, PLAN_IMPLEMENTATION_ACTION_IMPLEMENT as P, PLAN_IMPLEMENTATION_PROMPT as a, dispatchAgentPlanPromptAction as d, selectAgentPlanPromptTurn as s, useEngineSelector as u };
@@ -0,0 +1,13 @@
1
+ import { A as AgentGUIAgent, h as AgentGUIAgentTarget } from './types-DX2bxgB8.js';
2
+
3
+ declare function normalizeAgentGUIAgents(agents: readonly AgentGUIAgent[] | null | undefined): AgentGUIAgent[];
4
+ declare function agentGUIAgentIsReady(agent: AgentGUIAgent): boolean;
5
+ declare function resolveAgentGUISelectedDirectoryAgent(input: {
6
+ agents: readonly AgentGUIAgent[];
7
+ agentTargetId?: string | null;
8
+ defaultAgentTargetId?: string | null;
9
+ }): AgentGUIAgent | null;
10
+ /** Package-internal bridge while the carried node is migrated to agent names. */
11
+ declare function projectAgentGUIAgentsToInternalTargets(agents: readonly AgentGUIAgent[]): AgentGUIAgentTarget[];
12
+
13
+ export { agentGUIAgentIsReady, normalizeAgentGUIAgents, projectAgentGUIAgentsToInternalTargets, resolveAgentGUISelectedDirectoryAgent };
package/dist/agents.js ADDED
@@ -0,0 +1,13 @@
1
+ import {
2
+ agentGUIAgentIsReady,
3
+ normalizeAgentGUIAgents,
4
+ projectAgentGUIAgentsToInternalTargets,
5
+ resolveAgentGUISelectedDirectoryAgent
6
+ } from "./chunk-O6W72SEP.js";
7
+ export {
8
+ agentGUIAgentIsReady,
9
+ normalizeAgentGUIAgents,
10
+ projectAgentGUIAgentsToInternalTargets,
11
+ resolveAgentGUISelectedDirectoryAgent
12
+ };
13
+ //# sourceMappingURL=agents.js.map
@@ -136,6 +136,22 @@
136
136
  background: rgb(0 0 0 / 0%);
137
137
  }
138
138
 
139
+ .tsh-zoom-dialog[data-closing="true"] {
140
+ animation: tsh-zoom-dialog-close 180ms ease-out forwards;
141
+ }
142
+
143
+ @keyframes tsh-zoom-dialog-close {
144
+ to {
145
+ opacity: 0;
146
+ }
147
+ }
148
+
149
+ @media (prefers-reduced-motion: reduce) {
150
+ .tsh-zoom-dialog[data-closing="true"] {
151
+ animation-duration: 1ms;
152
+ }
153
+ }
154
+
139
155
  .tsh-zoom-dialog [data-rmiz-btn-unzoom] {
140
156
  position: fixed;
141
157
  top: max(20px, calc(var(--cove-titlebar-reserve, 0px) + 10px));
@@ -4457,6 +4473,20 @@ aside.workspace-agents-status-panel
4457
4473
  cursor: grabbing !important;
4458
4474
  }
4459
4475
 
4476
+ .workbench-window:has(
4477
+ .agent-gui-workbench-header[data-agent-gui-standalone-window-header="true"]
4478
+ )
4479
+ .workbench-window__header {
4480
+ z-index: calc(var(--z-panel) + 1);
4481
+ }
4482
+
4483
+ .workbench-window:has(
4484
+ .agent-gui-workbench-header[data-agent-gui-standalone-window-header="true"]
4485
+ )
4486
+ .agent-gui-workbench-header::after {
4487
+ display: none;
4488
+ }
4489
+
4460
4490
  .workbench-window:has([data-agent-gui-workbench-header="true"])
4461
4491
  .workbench-window__body {
4462
4492
  grid-row: 1;
@@ -4680,16 +4710,32 @@ aside.workspace-agents-status-panel
4680
4710
  .agent-gui-workbench-header[data-agent-gui-workbench-header-collapsed="true"]
4681
4711
  .agent-gui-workbench-header__primary {
4682
4712
  grid-column: 1 / -1;
4683
- width: min(100%, 720px);
4713
+ width: 100%;
4684
4714
  background: transparent;
4685
4715
  }
4686
4716
 
4717
+ /*
4718
+ * The standalone window's tool actions belong to native-window chrome, so
4719
+ * collapsing the conversation rail must not pull them into the 720px content
4720
+ * cap. Let the primary row span the window and keep the same trailing inset as
4721
+ * the expanded detail row.
4722
+ */
4723
+ .agent-gui-workbench-header[data-agent-gui-standalone-window-header="true"][data-agent-gui-workbench-header-collapsed="true"]
4724
+ .agent-gui-workbench-header__primary {
4725
+ width: 100%;
4726
+ }
4727
+
4728
+ .agent-gui-workbench-header[data-agent-gui-standalone-window-header="true"]
4729
+ .agent-gui-workbench-header__secondary-accessory {
4730
+ padding-right: 0;
4731
+ }
4732
+
4687
4733
  /*
4688
4734
  * In the collapsed empty state there is no session title to anchor the control
4689
4735
  * cluster, so the detached-window button's margin-left:auto would strand the
4690
- * icons (in the middle of the 720px content cap, or at the far window edge).
4691
- * Drop the auto push so the controls sit as a compact group right after the
4692
- * traffic lights instead.
4736
+ * icons at the far window edge. Drop the auto push so those window controls sit
4737
+ * as a compact group right after the traffic lights instead. Secondary tool
4738
+ * actions retain their own right alignment across the full header width.
4693
4739
  */
4694
4740
  .agent-gui-workbench-header[data-agent-gui-workbench-header-collapsed="true"][data-agent-gui-workbench-header-has-session="false"]
4695
4741
  .agent-gui-workbench-header__detached-window {
@@ -4846,6 +4892,13 @@ aside.workspace-agents-status-panel
4846
4892
  -webkit-app-region: no-drag;
4847
4893
  }
4848
4894
 
4895
+ /* The collapsed primary row already supplies the header's right inset. Avoid
4896
+ stacking the accessory inset when actions move out of the detail column. */
4897
+ .agent-gui-workbench-header[data-agent-gui-workbench-header-collapsed="true"]
4898
+ .agent-gui-workbench-header__secondary-accessory {
4899
+ padding-right: 0;
4900
+ }
4901
+
4849
4902
  .agent-gui-workbench-header__agent-name,
4850
4903
  .agent-gui-workbench-header__session-title,
4851
4904
  .agent-gui-workbench-header__detail-title {
@@ -4913,6 +4966,24 @@ aside.workspace-agents-status-panel
4913
4966
  pointer-events: none;
4914
4967
  }
4915
4968
 
4969
+ .workbench-window:has(
4970
+ .agent-gui-workbench-header[data-agent-gui-standalone-window-header="true"]
4971
+ )
4972
+ .agent-gui-workbench-header__session-title,
4973
+ .workbench-window:has(
4974
+ .agent-gui-workbench-header[data-agent-gui-standalone-window-header="true"]
4975
+ )
4976
+ .agent-gui-workbench-header__detail-title {
4977
+ box-sizing: border-box;
4978
+ width: auto;
4979
+ max-width: calc(
4980
+ 100% - var(--agent-gui-tool-sidebar-layout-width, 0px) - 16px
4981
+ );
4982
+ flex: 1 1 0;
4983
+ min-width: 0;
4984
+ overflow: hidden;
4985
+ }
4986
+
4916
4987
  .agent-gui-workbench-header[data-agent-gui-standalone-window-header="true"]
4917
4988
  .agent-gui-workbench-header__agent-brand,
4918
4989
  .agent-gui-workbench-header[data-agent-gui-standalone-window-header="true"]
@@ -4979,7 +5050,8 @@ aside.workspace-agents-status-panel
4979
5050
 
4980
5051
  .agent-gui-workbench-header__detached-window
4981
5052
  + .agent-gui-workbench-header__rail-toggle {
4982
- margin-left: 0;
5053
+ /* The primary row gap is 12px; keep this icon pair at a net 8px. */
5054
+ margin-left: -4px;
4983
5055
  }
4984
5056
 
4985
5057
  .workbench-window:has([data-workbench-node-render-error="true"])
@@ -5926,17 +5998,14 @@ button.agent-gui-node__conversation-section-toggle:hover
5926
5998
 
5927
5999
  .agent-gui-node__conversation-list-skeleton-rib {
5928
6000
  height: 12px;
5929
- transform-origin: left center;
5930
6001
  }
5931
6002
 
5932
6003
  .agent-gui-node__conversation-list-skeleton-rib-primary {
5933
6004
  width: 78%;
5934
- transform: rotate(1deg);
5935
6005
  }
5936
6006
 
5937
6007
  .agent-gui-node__conversation-list-skeleton-rib-secondary {
5938
6008
  width: 52%;
5939
- transform: rotate(-1deg);
5940
6009
  opacity: 0.72;
5941
6010
  }
5942
6011
 
@@ -7338,7 +7407,7 @@ button.agent-gui-node__conversation-section-toggle:hover
7338
7407
  isolation: isolate;
7339
7408
  z-index: 2;
7340
7409
  min-width: 0;
7341
- padding: 12px;
7410
+ padding: 8px;
7342
7411
  border: 1px solid var(--agent-gui-border-subtle);
7343
7412
  border-radius: 12px;
7344
7413
  background: var(--agent-gui-surface-raised);
@@ -7346,6 +7415,12 @@ button.agent-gui-node__conversation-section-toggle:hover
7346
7415
  transition: box-shadow 140ms ease;
7347
7416
  }
7348
7417
 
7418
+ .agent-gui-node__composer-hero-prompt-input-area {
7419
+ box-sizing: border-box;
7420
+ width: calc(100% - 8px);
7421
+ margin-inline: 4px;
7422
+ }
7423
+
7349
7424
  .agent-gui-node__composer[data-layout="dock"]
7350
7425
  .agent-gui-node__composer-input-shell {
7351
7426
  gap: 6px;
@@ -8262,12 +8337,12 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
8262
8337
  align-items: center;
8263
8338
  justify-content: space-between;
8264
8339
  gap: 8px;
8265
- padding: 2px 12px;
8340
+ padding: 2px 8px;
8266
8341
  }
8267
8342
 
8268
8343
  .agent-gui-node__composer-input-group-hero
8269
8344
  .agent-gui-node__composer-project-row {
8270
- padding: 2px 12px;
8345
+ padding: 2px 8px;
8271
8346
  }
8272
8347
 
8273
8348
  .agent-gui-node__composer-project-row .agent-gui-node__composer-menu-trigger {
@@ -8769,7 +8844,7 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
8769
8844
  flex: 1 1 auto;
8770
8845
  flex-direction: column;
8771
8846
  align-items: center;
8772
- padding: 2px 0 12px;
8847
+ padding: 2px 0 16px;
8773
8848
  overflow-x: hidden;
8774
8849
  overflow-y: auto;
8775
8850
  mask-image: linear-gradient(
@@ -8796,10 +8871,22 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
8796
8871
  align-items: center;
8797
8872
  justify-content: center;
8798
8873
  gap: 8px;
8799
- padding: 0 0 12px;
8874
+ padding: 0;
8800
8875
  -webkit-app-region: no-drag;
8801
8876
  }
8802
8877
 
8878
+ .agent-gui-node__provider-rail-config-footer {
8879
+ padding-bottom: 8px;
8880
+ }
8881
+
8882
+ .agent-gui-node__provider-rail-config-footer:last-child {
8883
+ padding-bottom: 12px;
8884
+ }
8885
+
8886
+ .agent-gui-node__provider-rail-sidebar-footer {
8887
+ padding-bottom: 12px;
8888
+ }
8889
+
8803
8890
  .agent-gui-node__provider-rail-config-button {
8804
8891
  display: grid;
8805
8892
  width: 32px;
@@ -9048,6 +9135,10 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
9048
9135
  }
9049
9136
 
9050
9137
  .agent-gui-node__empty-hero {
9138
+ /* Center one shared frame instead of each state's intrinsic content height.
9139
+ Wrapped titles, composer controls, and readiness actions then grow down. */
9140
+ --agent-gui-empty-hero-anchor-block-size: 398px;
9141
+
9051
9142
  display: flex;
9052
9143
  width: 100%;
9053
9144
  min-height: 100%;
@@ -9061,6 +9152,8 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
9061
9152
 
9062
9153
  display: grid;
9063
9154
  width: min(820px, 100%);
9155
+ block-size: var(--agent-gui-empty-hero-anchor-block-size);
9156
+ align-content: start;
9064
9157
  gap: var(--agent-gui-empty-hero-gap);
9065
9158
  justify-items: center;
9066
9159
  }
@@ -9092,10 +9185,14 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
9092
9185
  .agent-gui-node__empty-hero-carousel-layer {
9093
9186
  position: absolute;
9094
9187
  z-index: 1;
9095
- top: calc(50% - 210px);
9188
+
9189
+ /* The stage measures the body's placeholder slot and pins the layer to it;
9190
+ the calc() remains only as the first-paint estimate. */
9191
+ top: var(--agent-gui-hero-carousel-slot-top, calc(50% - 210px));
9096
9192
  left: 50%;
9097
- width: min(400px, calc(100% - 64px));
9098
- transform: translateX(-50%);
9193
+ width: round(nearest, min(400px, calc(100% - 64px)), 1px);
9194
+ transform: translateX(-50%) scale(0.8);
9195
+ transform-origin: center center;
9099
9196
  }
9100
9197
 
9101
9198
  .agent-gui-node__empty-hero-carousel-placeholder {
@@ -9123,63 +9220,6 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
9123
9220
  both;
9124
9221
  }
9125
9222
 
9126
- .agent-gui-node__empty-hero-icon-rail {
9127
- display: flex;
9128
- width: min(216px, 44vw);
9129
- height: 64px;
9130
- align-items: center;
9131
- overflow: hidden;
9132
- object-fit: unset;
9133
- }
9134
-
9135
- .agent-gui-node__empty-hero-icon-rail-scroller {
9136
- display: flex;
9137
- width: 100%;
9138
- min-width: 0;
9139
- align-items: center;
9140
- gap: 12px;
9141
- overflow-x: auto;
9142
- overflow-y: hidden;
9143
- padding: 8px 20px;
9144
- overscroll-behavior-x: contain;
9145
- scrollbar-width: none;
9146
- scroll-snap-type: x proximity;
9147
- mask-image: linear-gradient(
9148
- 90deg,
9149
- transparent 0,
9150
- #000 24px,
9151
- #000 calc(100% - 24px),
9152
- transparent 100%
9153
- );
9154
- }
9155
-
9156
- .agent-gui-node__empty-hero-icon-rail-scroller::-webkit-scrollbar {
9157
- display: none;
9158
- }
9159
-
9160
- .agent-gui-node__empty-hero-icon-rail-item {
9161
- display: grid;
9162
- width: 48px;
9163
- height: 48px;
9164
- flex: 0 0 48px;
9165
- place-items: center;
9166
- scroll-snap-align: center;
9167
- transition:
9168
- opacity 140ms ease,
9169
- transform 140ms ease;
9170
- }
9171
-
9172
- .agent-gui-node__empty-hero-icon-rail-item:hover {
9173
- transform: translateY(-1px);
9174
- }
9175
-
9176
- .agent-gui-node__empty-hero-icon-rail-item > img {
9177
- display: block;
9178
- width: 48px;
9179
- height: 48px;
9180
- object-fit: contain;
9181
- }
9182
-
9183
9223
  /* Empty-hero agent carousel ("All" tab): a three.js ring of same-sized agent
9184
9224
  records (see agentGuiHeroCarouselScene.ts). Records farther around the ring
9185
9225
  genuinely shrink and fade with perspective; visuals live on the canvas,
@@ -9431,14 +9471,21 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
9431
9471
  opacity: 0;
9432
9472
  transition: opacity 120ms ease-out;
9433
9473
 
9434
- /* Fade-out mask: a horizontal band dissolves tiles toward the stage sides
9435
- (the fully-transparent stops sit where the outermost tiles ride, not at
9436
- the canvas edges), intersected with a vertical band so tiles sinking
9437
- down the wheel melt away instead of being cut by the canvas bottom. */
9474
+ /* Fade-out mask: the horizontal fade runs edge to edge so there is no dead
9475
+ band beside the integer-aligned canvas buffer. The vertical band melts
9476
+ tiles sinking down the wheel instead of clipping them at the bottom. */
9438
9477
  mask-image:
9439
- linear-gradient(90deg, transparent 4%, #000 30%, #000 70%, transparent 96%),
9440
- linear-gradient(180deg, #000 0%, #000 70%, transparent 96%);
9478
+ linear-gradient(
9479
+ 90deg,
9480
+ transparent 0%,
9481
+ #000 20%,
9482
+ #000 80%,
9483
+ transparent 100%
9484
+ ),
9485
+ linear-gradient(180deg, #000 0%, #000 70%, transparent 100%);
9441
9486
  mask-composite: intersect;
9487
+ mask-size: 100% 100%;
9488
+ mask-position: center;
9442
9489
  }
9443
9490
 
9444
9491
  .agent-gui-node__empty-hero-carousel[data-icons-ready="true"]
@@ -9478,7 +9525,6 @@ html[data-theme="light"] [data-message-center-item-id].agent-gui-edge-glow {
9478
9525
  .agent-gui-node__empty-provider-gate {
9479
9526
  max-width: 520px;
9480
9527
  gap: 8px;
9481
- transform: translateY(-40px);
9482
9528
  }
9483
9529
 
9484
9530
  /* Gate gap is 8px; add 16px so the icon-to-title spacing is 24px. */
@@ -0,0 +1,4 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M14 3H21V10M20 4L10 14" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
3
+ <path d="M19 13V19C19 20.1046 18.1046 21 17 21H5C3.89543 21 3 20.1046 3 19V7C3 5.89543 3.89543 5 5 5H11" stroke="black" stroke-width="2" stroke-linecap="round"/>
4
+ </svg>