@tutti-os/agent-gui 0.0.190 → 0.0.192

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 (91) hide show
  1. package/dist/AgentRichTextReadonly-HJQQ4KAL.js +19 -0
  2. package/dist/agent-conversation/index.d.ts +29 -15
  3. package/dist/agent-conversation/index.js +11 -11
  4. package/dist/agent-env/index.js +1 -1
  5. package/dist/agent-gui.d.ts +310 -11
  6. package/dist/agent-gui.js +23 -23
  7. package/dist/agent-message-center/index.d.ts +4 -7
  8. package/dist/agent-message-center/index.js +9 -9
  9. package/dist/{agentGuiNodeTypes-RL1iNmSe.d.ts → agentGuiNodeTypes-B23ubO8n.d.ts} +8 -3
  10. package/dist/agents.d.ts +2 -1
  11. package/dist/app/renderer/agentactivity.css +16 -0
  12. package/dist/{chunk-DCZTHKWI.js → chunk-4CHBM3G3.js} +9 -3
  13. package/dist/chunk-4CHBM3G3.js.map +1 -0
  14. package/dist/{chunk-4ZCSXKK5.js → chunk-5VECGOBU.js} +3 -3
  15. package/dist/{chunk-F2U7LSJN.js → chunk-AFUVWWQY.js} +2 -2
  16. package/dist/{chunk-MHOYBRCY.js → chunk-CBMWHQ7P.js} +1 -1
  17. package/dist/chunk-CBMWHQ7P.js.map +1 -0
  18. package/dist/{chunk-2TPRBVDM.js → chunk-CUIJXYHG.js} +3566 -786
  19. package/dist/chunk-CUIJXYHG.js.map +1 -0
  20. package/dist/{chunk-THBCAUBR.js → chunk-CXC3ROXQ.js} +2 -2
  21. package/dist/{chunk-THBCAUBR.js.map → chunk-CXC3ROXQ.js.map} +1 -1
  22. package/dist/{chunk-44IFVKLS.js → chunk-DKGFEIZ7.js} +2 -2
  23. package/dist/{chunk-HH5PLD7L.js → chunk-DNHDR2YC.js} +3 -3
  24. package/dist/{chunk-V3VPKWVK.js → chunk-FGD2K7AB.js} +3 -3
  25. package/dist/chunk-FGD2K7AB.js.map +1 -0
  26. package/dist/{chunk-CFWR4C36.js → chunk-G7DS23D4.js} +2 -2
  27. package/dist/{chunk-AHDJFZAC.js → chunk-I4ICM3U4.js} +175 -33
  28. package/dist/chunk-I4ICM3U4.js.map +1 -0
  29. package/dist/{chunk-ML53N3II.js → chunk-KDN6SLJM.js} +2 -2
  30. package/dist/{chunk-RSFK6YRS.js → chunk-L3YCXXMA.js} +9 -9
  31. package/dist/{chunk-RWUYIHO3.js → chunk-M6HTOCQK.js} +3 -3
  32. package/dist/{chunk-UCDLFE2I.js → chunk-MGSRWYRN.js} +2 -2
  33. package/dist/{chunk-EWS7OGQK.js → chunk-O433KXLK.js} +2 -2
  34. package/dist/chunk-O433KXLK.js.map +1 -0
  35. package/dist/{chunk-2CZIBPST.js → chunk-PFTST5V6.js} +4 -4
  36. package/dist/{chunk-6YRJ4OPB.js → chunk-S7OROGUS.js} +2 -2
  37. package/dist/{chunk-HOT2PJ6T.js → chunk-SQZIKBOM.js} +4 -7
  38. package/dist/{chunk-HOT2PJ6T.js.map → chunk-SQZIKBOM.js.map} +1 -1
  39. package/dist/{chunk-FJ4A3A6W.js → chunk-TYQTSC7Y.js} +5 -5
  40. package/dist/{chunk-HD2TXBXU.js → chunk-U6TH4RJJ.js} +228 -43
  41. package/dist/chunk-U6TH4RJJ.js.map +1 -0
  42. package/dist/{chunk-KE3UYJMW.js → chunk-Z5Y3RB2U.js} +2 -2
  43. package/dist/{chunk-QKCSWK7Y.js → chunk-ZE6VLLFC.js} +51 -4
  44. package/dist/chunk-ZE6VLLFC.js.map +1 -0
  45. package/dist/context-mention-palette/index.js +10 -10
  46. package/dist/context-mention-provider.d.ts +1 -0
  47. package/dist/conversation-rail-runtime.d.ts +4 -1
  48. package/dist/dock-icons.js +2 -2
  49. package/dist/i18n/index.d.ts +280 -154
  50. package/dist/i18n/index.js +2 -2
  51. package/dist/index.d.ts +1285 -835
  52. package/dist/index.js +23 -23
  53. package/dist/index.js.map +1 -1
  54. package/dist/mention-search.js +8 -8
  55. package/dist/planImplementationPresentation-BxVOLt6A.d.ts +24 -0
  56. package/dist/provider-identity.js +1 -1
  57. package/dist/{types-izfKbJ8v.d.ts → types-CWKbqBmi.d.ts} +4 -0
  58. package/dist/workbench/contribution.js +10 -10
  59. package/dist/workbench/index.js +10 -10
  60. package/dist/workbench/launch.d.ts +4 -0
  61. package/dist/workbench/launch.js +4 -4
  62. package/dist/workbench/providerCatalog.js +2 -2
  63. package/dist/workbench/sessionTitle.js +3 -3
  64. package/dist/workbench/state.js +3 -3
  65. package/dist/workbench/types.d.ts +3 -0
  66. package/dist/workbench/types.js +1 -1
  67. package/package.json +14 -14
  68. package/dist/AgentRichTextReadonly-UZQ5VSGO.js +0 -19
  69. package/dist/chunk-2TPRBVDM.js.map +0 -1
  70. package/dist/chunk-AHDJFZAC.js.map +0 -1
  71. package/dist/chunk-DCZTHKWI.js.map +0 -1
  72. package/dist/chunk-EWS7OGQK.js.map +0 -1
  73. package/dist/chunk-HD2TXBXU.js.map +0 -1
  74. package/dist/chunk-MHOYBRCY.js.map +0 -1
  75. package/dist/chunk-QKCSWK7Y.js.map +0 -1
  76. package/dist/chunk-V3VPKWVK.js.map +0 -1
  77. package/dist/{AgentRichTextReadonly-UZQ5VSGO.js.map → AgentRichTextReadonly-HJQQ4KAL.js.map} +0 -0
  78. package/dist/{chunk-4ZCSXKK5.js.map → chunk-5VECGOBU.js.map} +0 -0
  79. package/dist/{chunk-F2U7LSJN.js.map → chunk-AFUVWWQY.js.map} +0 -0
  80. package/dist/{chunk-44IFVKLS.js.map → chunk-DKGFEIZ7.js.map} +0 -0
  81. package/dist/{chunk-HH5PLD7L.js.map → chunk-DNHDR2YC.js.map} +0 -0
  82. package/dist/{chunk-CFWR4C36.js.map → chunk-G7DS23D4.js.map} +0 -0
  83. package/dist/{chunk-ML53N3II.js.map → chunk-KDN6SLJM.js.map} +0 -0
  84. package/dist/{chunk-RSFK6YRS.js.map → chunk-L3YCXXMA.js.map} +0 -0
  85. package/dist/{chunk-RWUYIHO3.js.map → chunk-M6HTOCQK.js.map} +0 -0
  86. package/dist/{chunk-UCDLFE2I.js.map → chunk-MGSRWYRN.js.map} +0 -0
  87. package/dist/{chunk-2CZIBPST.js.map → chunk-PFTST5V6.js.map} +0 -0
  88. package/dist/{chunk-6YRJ4OPB.js.map → chunk-S7OROGUS.js.map} +0 -0
  89. package/dist/{chunk-FJ4A3A6W.js.map → chunk-TYQTSC7Y.js.map} +0 -0
  90. package/dist/{chunk-KE3UYJMW.js.map → chunk-Z5Y3RB2U.js.map} +0 -0
  91. package/dist/{agentConversationVM-Bn5s1UMx.d.ts → workspaceLinkActions-BmVLZszV.d.ts} +72 -72
@@ -0,0 +1,19 @@
1
+ import {
2
+ AgentRichTextReadonly
3
+ } from "./chunk-S7OROGUS.js";
4
+ import "./chunk-5VECGOBU.js";
5
+ import "./chunk-3V5OCA2M.js";
6
+ import "./chunk-FGLQZ6I4.js";
7
+ import "./chunk-ZVYUTXQJ.js";
8
+ import "./chunk-M6HTOCQK.js";
9
+ import "./chunk-DKGFEIZ7.js";
10
+ import "./chunk-5BJYO6X3.js";
11
+ import "./chunk-AFUVWWQY.js";
12
+ import "./chunk-I4ICM3U4.js";
13
+ import "./chunk-D2JUDUYY.js";
14
+ import "./chunk-QNE2ZPPV.js";
15
+ import "./chunk-O433KXLK.js";
16
+ export {
17
+ AgentRichTextReadonly
18
+ };
19
+ //# sourceMappingURL=AgentRichTextReadonly-HJQQ4KAL.js.map
@@ -1,19 +1,26 @@
1
1
  import * as react from 'react';
2
- import { ReactNode, JSX } from 'react';
3
- import { c as AgentConversationVM, g as WorkspaceLinkAction, f as WorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-Bn5s1UMx.js';
4
- export { B as BuildWorkspaceAgentSessionDetailInput, W as WorkspaceAgentActivityCard, e as WorkspaceAgentActivityTimelineItem, h as buildWorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-Bn5s1UMx.js';
5
- import { d as AgentGUIProviderSkillOption, h as AgentMessageMarkdownWorkspaceAppIcon } from '../agentGuiNodeTypes-RL1iNmSe.js';
2
+ import { ReactNode, Ref, JSX } from 'react';
3
+ import { c as AgentConversationVM, g as WorkspaceLinkAction, f as WorkspaceAgentSessionDetailViewModel } from '../workspaceLinkActions-BmVLZszV.js';
4
+ export { B as BuildWorkspaceAgentSessionDetailInput, W as WorkspaceAgentActivityCard, e as WorkspaceAgentActivityTimelineItem, h as buildWorkspaceAgentSessionDetailViewModel } from '../workspaceLinkActions-BmVLZszV.js';
5
+ import { d as AgentGUIProviderSkillOption, h as AgentMessageMarkdownWorkspaceAppIcon } from '../agentGuiNodeTypes-B23ubO8n.js';
6
6
  import { AgentActivityMessage } from '@tutti-os/agent-activity-core';
7
7
  import '@tutti-os/workspace-issue-manager/core';
8
- import '../types-izfKbJ8v.js';
8
+ import '../types-CWKbqBmi.js';
9
+ import '../planImplementationPresentation-BxVOLt6A.js';
9
10
  import '@tutti-os/workspace-user-project/contracts';
10
11
 
11
- interface AgentConversationFlowProps {
12
- conversation: AgentConversationVM | null;
13
- isLoading: boolean;
14
- loadingLabel: string;
15
- loadingTestId?: string;
16
- empty: ReactNode;
12
+ interface AgentTranscriptTurnAttachment {
13
+ id: string;
14
+ anchorTurnId: string | null;
15
+ content: ReactNode;
16
+ }
17
+ type AgentTranscriptAttachmentLocator = (attachmentId: string) => void;
18
+
19
+ interface AgentTranscriptViewProps {
20
+ conversation: AgentConversationVM;
21
+ turnAttachments?: readonly AgentTranscriptTurnAttachment[];
22
+ turnAttachmentLocatorRef?: Ref<AgentTranscriptAttachmentLocator>;
23
+ onTurnAttachmentVisibilityChange?: (attachmentId: string, visible: boolean) => void;
17
24
  onLinkAction?: (action: WorkspaceLinkAction) => void;
18
25
  onAuthLogin?: (provider?: string | null) => void;
19
26
  availableSkills?: readonly AgentGUIProviderSkillOption[];
@@ -29,10 +36,17 @@ interface AgentConversationFlowProps {
29
36
  userMessageLocator?: string;
30
37
  };
31
38
  }
32
- declare const AgentConversationFlow: react.NamedExoticComponent<AgentConversationFlowProps>;
39
+ declare const AgentTranscriptView: react.NamedExoticComponent<AgentTranscriptViewProps>;
33
40
 
34
- interface AgentTranscriptViewProps {
35
- conversation: AgentConversationVM;
41
+ interface AgentConversationFlowProps {
42
+ conversation: AgentConversationVM | null;
43
+ turnAttachments?: readonly AgentTranscriptTurnAttachment[];
44
+ turnAttachmentLocatorRef?: Ref<AgentTranscriptAttachmentLocator>;
45
+ onTurnAttachmentVisibilityChange?: (attachmentId: string, visible: boolean) => void;
46
+ isLoading: boolean;
47
+ loadingLabel: string;
48
+ loadingTestId?: string;
49
+ empty: ReactNode;
36
50
  onLinkAction?: (action: WorkspaceLinkAction) => void;
37
51
  onAuthLogin?: (provider?: string | null) => void;
38
52
  availableSkills?: readonly AgentGUIProviderSkillOption[];
@@ -48,7 +62,7 @@ interface AgentTranscriptViewProps {
48
62
  userMessageLocator?: string;
49
63
  };
50
64
  }
51
- declare const AgentTranscriptView: react.NamedExoticComponent<AgentTranscriptViewProps>;
65
+ declare const AgentConversationFlow: react.NamedExoticComponent<AgentConversationFlowProps>;
52
66
 
53
67
  declare function AgentTranscriptSkeleton({ label, testId }: {
54
68
  label: string;
@@ -7,29 +7,29 @@ import {
7
7
  reconcileProjectedAgentConversationVM,
8
8
  serializeAgentConversationForClipboard,
9
9
  useProjectedAgentConversation
10
- } from "../chunk-HD2TXBXU.js";
11
- import "../chunk-6YRJ4OPB.js";
12
- import "../chunk-THBCAUBR.js";
10
+ } from "../chunk-U6TH4RJJ.js";
11
+ import "../chunk-S7OROGUS.js";
12
+ import "../chunk-CXC3ROXQ.js";
13
13
  import "../chunk-XJ34OIEQ.js";
14
14
  import "../chunk-JDVP33S5.js";
15
- import "../chunk-4ZCSXKK5.js";
15
+ import "../chunk-5VECGOBU.js";
16
16
  import "../chunk-3V5OCA2M.js";
17
17
  import "../chunk-FGLQZ6I4.js";
18
- import "../chunk-2CZIBPST.js";
18
+ import "../chunk-PFTST5V6.js";
19
19
  import "../chunk-ZVYUTXQJ.js";
20
- import "../chunk-V3VPKWVK.js";
20
+ import "../chunk-FGD2K7AB.js";
21
21
  import "../chunk-F5UR6EJG.js";
22
- import "../chunk-RWUYIHO3.js";
22
+ import "../chunk-M6HTOCQK.js";
23
23
  import {
24
24
  translate
25
- } from "../chunk-44IFVKLS.js";
25
+ } from "../chunk-DKGFEIZ7.js";
26
26
  import "../chunk-5BJYO6X3.js";
27
- import "../chunk-F2U7LSJN.js";
28
- import "../chunk-AHDJFZAC.js";
27
+ import "../chunk-AFUVWWQY.js";
28
+ import "../chunk-I4ICM3U4.js";
29
29
  import "../chunk-MIJXEELH.js";
30
30
  import "../chunk-D2JUDUYY.js";
31
31
  import "../chunk-QNE2ZPPV.js";
32
- import "../chunk-EWS7OGQK.js";
32
+ import "../chunk-O433KXLK.js";
33
33
 
34
34
  // shared/WorkspaceAgentSessionDetail.tsx
35
35
  import { useMemo } from "react";
@@ -12,7 +12,7 @@ import {
12
12
  shouldAdvanceReveal,
13
13
  stageRemediation,
14
14
  useOpenAgentEnvPanel
15
- } from "../chunk-THBCAUBR.js";
15
+ } from "../chunk-CXC3ROXQ.js";
16
16
  export {
17
17
  AgentEnvPanelActionProvider,
18
18
  buildAgentEnvWizardViewModel,
@@ -1,21 +1,22 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { I18nRuntime } from '@tutti-os/ui-i18n-runtime';
4
- import { AgentActivityGoalControlInput, AgentActivityGoalControlResult, AgentActivityCreateSessionInput, AgentActivitySession, AgentActivityDeleteSessionInput, AgentActivityDeleteSessionResult, AgentActivitySendInput, AgentActivitySessionSettings, AgentActivityActivateSessionResult, AgentActivitySnapshot, AgentSessionEngine, AgentActivityMessageOrder, AgentActivityMessagePage, AgentActivitySendInputResult, AgentActivityRenameSessionInput, AgentActivitySetCollaborationAdoptionInput, AgentActivityCollaborationRun, AgentActivitySubmitInteractiveInput, AgentActivitySubmitInteractiveResult, AgentActivitySnapshotListener, AgentActivitySubmitSettingsPatch } from '@tutti-os/agent-activity-core';
5
- import { k as AgentHostAgentSessionComposerSettings, o as AgentHostUnactivateAgentSessionResult, b as AgentGUIAgentTarget, f as AgentGUIProvider, p as AgentPromptContentBlock, e as AgentGUINodeData, P as Point, g as AgentGUIProviderRailAllPresentation, h as AgentGUIProviderRailMode, i as AgentGUIProviderReadinessGate, d as AgentGUIHomeSuggestionId, N as NodeFrame, a as AgentGUIAgentDirectorySnapshot, c as AgentGUIAllAgentsPresentation } from './types-izfKbJ8v.js';
6
- import { A as AgentComposerDraft, i as AgentSessionCommand, d as AgentGUIProviderSkillOption, b as AgentGUIComposerSettingsVM, e as AgentGUIQueueStatus, f as AgentGUIQueuedPromptVM, h as AgentMessageMarkdownWorkspaceAppIcon, j as AgentSlashCommandCapability, c as AgentGUINodeViewModel, a as AgentComposerDraftFile, k as AgentUsageQuota, g as AgentHostInputApi } from './agentGuiNodeTypes-RL1iNmSe.js';
4
+ import { AgentActivityGoalControlInput, AgentActivityGoalControlResult, AgentActivityCreateSessionInput, AgentActivitySession, AgentActivityDeleteSessionInput, AgentActivityDeleteSessionResult, AgentActivitySendInput, AgentActivitySessionSettings, AgentActivityActivateSessionResult, AgentActivityUpdateTuttiModeActivationInput, AgentActivityUpdateTuttiModeActivationResult, AgentActivitySnapshot, AgentSessionEngine, AgentActivityMessageOrder, AgentActivityMessagePage, AgentActivitySendInputResult, AgentActivityRenameSessionInput, AgentActivitySetCollaborationAdoptionInput, AgentActivityCollaborationRun, AgentActivitySubmitInteractiveInput, AgentActivitySubmitInteractiveResult, AgentActivitySnapshotListener, AgentActivitySubmitSettingsPatch } from '@tutti-os/agent-activity-core';
5
+ import { k as AgentHostAgentSessionComposerSettings, o as AgentHostUnactivateAgentSessionResult, b as AgentGUIAgentTarget, f as AgentGUIProvider, p as AgentPromptContentBlock, e as AgentGUINodeData, P as Point, g as AgentGUIProviderRailAllPresentation, h as AgentGUIProviderRailMode, i as AgentGUIProviderReadinessGate, d as AgentGUIHomeSuggestionId, N as NodeFrame, a as AgentGUIAgentDirectorySnapshot, c as AgentGUIAllAgentsPresentation } from './types-CWKbqBmi.js';
6
+ import { A as AgentComposerDraft, i as AgentSessionCommand, d as AgentGUIProviderSkillOption, b as AgentGUIComposerSettingsVM, e as AgentGUIQueueStatus, f as AgentGUIQueuedPromptVM, h as AgentMessageMarkdownWorkspaceAppIcon, j as AgentSlashCommandCapability, c as AgentGUINodeViewModel, a as AgentComposerDraftFile, k as AgentUsageQuota, g as AgentHostInputApi } from './agentGuiNodeTypes-B23ubO8n.js';
7
7
  import { WorkspaceFileReference, ReferenceLocateTarget, WorkspaceFileReferenceAdapter, ReferenceProvenanceCatalog } from '@tutti-os/workspace-file-reference/contracts';
8
8
  export { ReferenceProvenanceCatalog as AgentGUIReferenceProvenanceFilterCatalog } from '@tutti-os/workspace-file-reference/contracts';
9
9
  import { A as AgentContextMentionItem } from './agentFileMentionContracts-B0yQizXB.js';
10
10
  import { A as AgentGuiI18nLocale } from './runtime-Dwf44VKc.js';
11
11
  import { WorkspaceFileEntry } from '@tutti-os/workspace-file-manager/services';
12
12
  import { ReferenceSourceAggregator } from '@tutti-os/workspace-file-reference/core';
13
- import { b as AgentConversationPromptVM, g as WorkspaceLinkAction } from './agentConversationVM-Bn5s1UMx.js';
13
+ import { b as AgentConversationPromptVM, g as WorkspaceLinkAction } from './workspaceLinkActions-BmVLZszV.js';
14
14
  import { WorkspaceUserProjectI18nRuntime } from '@tutti-os/workspace-user-project/i18n';
15
15
  import { WorkspaceUserProjectSelectChangeAction } from '@tutti-os/workspace-user-project/ui';
16
16
  import { WorkspaceUserProject } from '@tutti-os/workspace-user-project/contracts';
17
17
  import { ReferenceProvenanceFilterSnapshot, ReferenceProvenanceFilterController } from '@tutti-os/workspace-file-reference/react';
18
18
  import { RichTextMentionService } from '@tutti-os/ui-rich-text/service';
19
+ import './planImplementationPresentation-BxVOLt6A.js';
19
20
  import '@tutti-os/workspace-issue-manager/core';
20
21
 
21
22
  declare const APP_UPDATE_POLICIES: readonly ["off", "prompt", "auto"];
@@ -178,6 +179,7 @@ interface AgentActivityRuntimeDiagnosticInput {
178
179
  }
179
180
  interface AgentActivityRuntimeActivateSessionInputBase {
180
181
  agentSessionId: string;
182
+ capabilityRefs?: AgentActivityCreateSessionInput["capabilityRefs"];
181
183
  cwd?: string;
182
184
  initialContent?: AgentActivitySendInput["content"];
183
185
  /** 仅展示用首轮文本(bundle 折叠成一个 chip);initialContent 仍带展开后的文件。 */
@@ -192,6 +194,7 @@ interface AgentActivityRuntimeActivateSessionInputBase {
192
194
  type AgentActivityRuntimeActivateSessionInput = (AgentActivityRuntimeActivateSessionInputBase & {
193
195
  agentTargetId: string;
194
196
  clientSubmitId: string;
197
+ initialTuttiModeActivation?: AgentActivityCreateSessionInput["initialTuttiModeActivation"];
195
198
  mode: "new";
196
199
  }) | (AgentActivityRuntimeActivateSessionInputBase & {
197
200
  agentTargetId?: string | null;
@@ -324,6 +327,7 @@ interface AgentActivityRuntime {
324
327
  getSession(workspaceId: string, agentSessionId: string): Promise<AgentActivitySession>;
325
328
  getComposerOptions(input: AgentActivityRuntimeGetComposerOptionsInput): Promise<unknown>;
326
329
  updateSessionSettings(input: AgentActivityRuntimeUpdateSessionSettingsInput): Promise<AgentActivityRuntimeUpdateSessionSettingsResult>;
330
+ updateTuttiModeActivation(input: AgentActivityUpdateTuttiModeActivationInput): Promise<AgentActivityUpdateTuttiModeActivationResult>;
327
331
  getSnapshot(workspaceId: string): AgentActivitySnapshot;
328
332
  getSessionEngine(workspaceId: string): AgentSessionEngine;
329
333
  getSessionSectionsQueryCache?(workspaceId: string): WorkspaceQueryCache<unknown>;
@@ -639,6 +643,11 @@ interface AgentComposerReferenceProvenanceFilter {
639
643
  }
640
644
  interface AgentComposerSubmitOptions {
641
645
  requiredSettingsPatch?: AgentActivitySubmitSettingsPatch;
646
+ capabilityRefs?: readonly AgentComposerCapabilityReference[];
647
+ }
648
+ interface AgentComposerCapabilityReference {
649
+ capability: "tutti";
650
+ source: "slash_command";
642
651
  }
643
652
  interface AgentComposerProps {
644
653
  workspaceId: string;
@@ -658,6 +667,10 @@ interface AgentComposerProps {
658
667
  disabled: boolean;
659
668
  disabledReason?: string | null;
660
669
  submitDisabled: boolean;
670
+ /** Canonical engine projection of the independent TuttiModeActivation. */
671
+ tuttiModeActive?: boolean;
672
+ /** Blocks submission/removal while activation CAS or creation is unresolved. */
673
+ tuttiModeUpdating?: boolean;
661
674
  placeholder: string;
662
675
  composerSettings: AgentGUIComposerSettingsVM;
663
676
  queueStatus?: AgentGUIQueueStatus;
@@ -697,6 +710,13 @@ interface AgentComposerProps {
697
710
  handoffMenuLabel?: string;
698
711
  labels: {
699
712
  send: string;
713
+ /**
714
+ * Plan-review send copy: with an empty-send override active the send
715
+ * button reads sendAccept on an empty draft and sendRequestChanges once
716
+ * feedback is typed, so the composer decision semantics stay legible.
717
+ */
718
+ sendAccept?: string;
719
+ sendRequestChanges?: string;
700
720
  modelLabel: string;
701
721
  modelSelectionLabel: string;
702
722
  modelContextWindowSuffix: string;
@@ -735,6 +755,15 @@ interface AgentComposerProps {
735
755
  professionalLongRunning: string;
736
756
  };
737
757
  planModeLabel: string;
758
+ tuttiModeLabel: string;
759
+ tuttiModeDescription: string;
760
+ tuttiBudgetTitle: string;
761
+ tuttiBudgetIntensityLabel: string;
762
+ tuttiBudgetIntensityMin: string;
763
+ tuttiBudgetIntensityMax: string;
764
+ tuttiBudgetConfirm: string;
765
+ tuttiBudgetCancel: string;
766
+ planModeDescription?: string;
738
767
  planModeOnLabel: string;
739
768
  planModeOffLabel: string;
740
769
  planUnavailable: string;
@@ -891,6 +920,7 @@ interface AgentComposerProps {
891
920
  computerUse?: boolean;
892
921
  permissionModeId?: string | null;
893
922
  }) => void;
923
+ onTuttiModeChange?: (active: boolean) => void;
894
924
  capabilityMenuState?: AgentComposerCapabilityMenuState;
895
925
  capabilityControlsReadOnly?: boolean;
896
926
  onCapabilitySettingsRequest?: (capability: AgentComposerCapabilitySettingsTarget) => void;
@@ -898,7 +928,19 @@ interface AgentComposerProps {
898
928
  onSlashStatusClose?: () => void;
899
929
  onSlashStatusRefresh?: () => void;
900
930
  onSubmit: (content: AgentPromptContentBlock[], displayPrompt?: string, options?: AgentComposerSubmitOptions) => void;
901
- onSubmitGuidance?: (content: AgentPromptContentBlock[], displayPrompt?: string) => void;
931
+ /**
932
+ * When set, an empty-draft send is enabled and routed here instead of being
933
+ * blocked (e.g. Tutti plan review: empty send = accept). Typed sends keep
934
+ * flowing through onSubmit.
935
+ */
936
+ onSubmitEmpty?: () => void;
937
+ /**
938
+ * Overrides the empty-draft send button copy while the empty-send override
939
+ * is active (e.g. plan review with a diverged intensity reads "Request
940
+ * changes" instead of "Accept plan"). Falls back to labels.sendAccept.
941
+ */
942
+ emptySubmitLabel?: string;
943
+ onSubmitGuidance?: (content: AgentPromptContentBlock[], displayPrompt?: string, options?: AgentComposerSubmitOptions) => void;
902
944
  onSendQueuedPromptNext: (queuedPromptId: string) => void;
903
945
  onRemoveQueuedPrompt: (queuedPromptId: string) => void;
904
946
  onEditQueuedPrompt: (queuedPromptId: string) => void;
@@ -921,7 +963,7 @@ interface AgentComposerProps {
921
963
  onRequestGitBranches?: AgentComposerGitBranchLoader | null;
922
964
  referenceProvenanceFilter?: AgentComposerReferenceProvenanceFilter | null;
923
965
  }
924
- type AgentComposerCapabilitySettingsTarget = AgentSlashCommandCapability["capability"];
966
+ type AgentComposerCapabilitySettingsTarget = Exclude<AgentSlashCommandCapability["capability"], "tutti">;
925
967
  interface AgentComposerCapabilityMenuState {
926
968
  browserUse?: {
927
969
  connectionMode?: "autoConnect" | "isolated" | null;
@@ -930,6 +972,9 @@ interface AgentComposerCapabilityMenuState {
930
972
  authorization?: AgentComposerComputerUseAuthorizationState | null;
931
973
  installed?: boolean | null;
932
974
  };
975
+ tuttiMode?: {
976
+ enabled?: boolean | null;
977
+ };
933
978
  }
934
979
  type AgentComposerComputerUseAuthorizationState = "authorized" | "needs-authorization" | "unknown";
935
980
  interface AgentComposerGitBranches {
@@ -980,6 +1025,256 @@ interface OpenAgentEnvPanelInput {
980
1025
  focus?: AgentEnvPanelFocus | null;
981
1026
  }
982
1027
 
1028
+ type TuttiModePlanWorkflowStatus = "pending_review" | "in_progress" | "accepted" | "rejected" | "completed" | "failed" | "canceled";
1029
+ type TuttiModePlanCheckpointKind = "configuration_review" | "task_review";
1030
+ type TuttiModePlanCheckpointStatus = "pending" | "accepted" | "rejected" | "superseded" | "canceled";
1031
+ interface TuttiModePlanReviewSnapshot {
1032
+ workflow: TuttiModePlanWorkflow;
1033
+ revisions: TuttiModePlanRevision[];
1034
+ checkpoints: TuttiModePlanCheckpoint[];
1035
+ }
1036
+ interface TuttiModePlanWorkflow {
1037
+ id: string;
1038
+ workspaceId: string;
1039
+ type: string;
1040
+ owner: string;
1041
+ triggerKind: string;
1042
+ sourceSessionId: string;
1043
+ sourceTurnId?: string | null;
1044
+ sourceToolCallId?: string | null;
1045
+ status: TuttiModePlanWorkflowStatus;
1046
+ currentRevisionId: string;
1047
+ }
1048
+ interface TuttiModePlanRevision {
1049
+ id: string;
1050
+ workflowId: string;
1051
+ sequence: number;
1052
+ schemaVersion: string;
1053
+ documentPath: string;
1054
+ sha256: string;
1055
+ producedByTurnId?: string | null;
1056
+ createdAtUnixMs: number;
1057
+ document: TuttiModePlanDocument;
1058
+ }
1059
+ interface TuttiModePlanDocument {
1060
+ schema: string;
1061
+ phase: "configuration" | "task_graph";
1062
+ title: string;
1063
+ topicId: string;
1064
+ markdownBody: string;
1065
+ execution: TuttiModePlanExecution;
1066
+ budget: TuttiModePlanBudget;
1067
+ tasks: TuttiModePlanTask[];
1068
+ }
1069
+ interface TuttiModePlanExecution {
1070
+ mode: "sequential" | "parallel";
1071
+ reasoningIntensity: number;
1072
+ orchestrationIntensity: number;
1073
+ }
1074
+ interface TuttiModePlanBudget {
1075
+ mode: "auto" | "fixed";
1076
+ tokenLimit: number;
1077
+ quotaWaterlinePercent: number;
1078
+ }
1079
+ interface TuttiModePlanTask {
1080
+ id: string;
1081
+ title: string;
1082
+ content: string;
1083
+ priority: "high" | "medium" | "low";
1084
+ agentTargetId?: string | null;
1085
+ modelPlanId?: string | null;
1086
+ model?: string | null;
1087
+ permissionModeId?: string | null;
1088
+ reasoningEffort?: string | null;
1089
+ executionDirectory?: string | null;
1090
+ dependsOn: string[];
1091
+ parallelizable?: boolean;
1092
+ autoAccept?: boolean;
1093
+ }
1094
+ interface TuttiModePlanCheckpoint {
1095
+ id: string;
1096
+ workflowId: string;
1097
+ kind: TuttiModePlanCheckpointKind;
1098
+ revisionId: string;
1099
+ status: TuttiModePlanCheckpointStatus;
1100
+ decidedBy?: string | null;
1101
+ decisionReason?: string | null;
1102
+ createdAtUnixMs: number;
1103
+ updatedAtUnixMs: number;
1104
+ decidedAtUnixMs?: number | null;
1105
+ }
1106
+
1107
+ interface TuttiModePlanReviewUpdate {
1108
+ kind: "workflow_updated";
1109
+ workspaceId: string;
1110
+ workflowId: string;
1111
+ sourceSessionId: string;
1112
+ checkpointId: string;
1113
+ changeKind: "proposal_created" | "revision_created" | "checkpoint_decided" | "operation_updated";
1114
+ }
1115
+ interface TuttiModePlanReviewConnectionRestored {
1116
+ kind: "connection_restored";
1117
+ workspaceId: string;
1118
+ }
1119
+ /**
1120
+ * A root turn of the source session settled. The host derives this from the
1121
+ * daemon's canonical turn fan-out and relays it as a read-repair trigger: a
1122
+ * plan proposed mid-turn announces itself through one workflow event, and if
1123
+ * that single event is lost no later workflow signal re-reads review state.
1124
+ */
1125
+ interface TuttiModePlanReviewSessionSettled {
1126
+ kind: "session_settled";
1127
+ workspaceId: string;
1128
+ sourceSessionId: string;
1129
+ }
1130
+ type TuttiModePlanReviewInvalidation = TuttiModePlanReviewUpdate | TuttiModePlanReviewConnectionRestored | TuttiModePlanReviewSessionSettled;
1131
+ interface TuttiModePlanTaskAssignmentInput {
1132
+ taskId: string;
1133
+ agentTargetId?: string | null;
1134
+ modelPlanId?: string | null;
1135
+ model?: string | null;
1136
+ permissionModeId?: string | null;
1137
+ reasoningEffort?: string | null;
1138
+ parallelizable?: boolean | null;
1139
+ autoAccept?: boolean | null;
1140
+ }
1141
+ interface TuttiModePlanReviewDecisionInput {
1142
+ workspaceId: string;
1143
+ workflowId: string;
1144
+ checkpointId: string;
1145
+ decision: "accepted" | "rejected" | "canceled";
1146
+ decidedBy: string;
1147
+ reason?: string | null;
1148
+ /** Per-task overrides; only meaningful with an accepted task review. */
1149
+ taskAssignments?: readonly TuttiModePlanTaskAssignmentInput[];
1150
+ }
1151
+ interface TuttiModePlanAssignmentAgentOption {
1152
+ agentTargetId: string;
1153
+ label: string;
1154
+ }
1155
+ interface TuttiModePlanAssignmentAgentDetail {
1156
+ /** Provider-native models usable without a model plan. */
1157
+ models: readonly string[];
1158
+ modelPlans: readonly {
1159
+ modelPlanId: string;
1160
+ label: string;
1161
+ models: readonly string[];
1162
+ }[];
1163
+ permissionModes: readonly {
1164
+ id: string;
1165
+ label: string;
1166
+ }[];
1167
+ reasoningEfforts: readonly string[];
1168
+ }
1169
+ interface TuttiPlanIssueTaskSnapshot {
1170
+ taskId: string;
1171
+ title: string;
1172
+ content: string;
1173
+ status: string;
1174
+ sortIndex: number;
1175
+ parallelizable: boolean;
1176
+ autoAccept: boolean;
1177
+ dependencyTaskIds: string[];
1178
+ }
1179
+ /** Read-only snapshot of the Issue a session's accepted plan materialized. */
1180
+ interface TuttiPlanIssueSnapshot {
1181
+ workflowId: string;
1182
+ sourceTurnId: string | null;
1183
+ issueId: string;
1184
+ topicId: string;
1185
+ title: string;
1186
+ tasks: TuttiPlanIssueTaskSnapshot[];
1187
+ }
1188
+ /**
1189
+ * An accepted plan whose create_issue operation durably failed. The
1190
+ * conversation must surface this instead of rendering nothing: there is no
1191
+ * pending checkpoint (the review panel is gone) and no Issue (the issue panel
1192
+ * never appears), so silence would hide the failure entirely.
1193
+ */
1194
+ interface TuttiPlanIssueMaterializationFailure {
1195
+ workflowId: string;
1196
+ sourceTurnId: string | null;
1197
+ errorMessage: string | null;
1198
+ }
1199
+ type TuttiPlanIssueQueryResult = {
1200
+ kind: "issue";
1201
+ issue: TuttiPlanIssueSnapshot;
1202
+ } | ({
1203
+ kind: "materialization_failed";
1204
+ } & TuttiPlanIssueMaterializationFailure) | null;
1205
+ /**
1206
+ * Read-only source for the embedded plan-issue panel in the conversation.
1207
+ * The host resolves "the Issue this session's accepted plan created" and
1208
+ * relays live issue updates; all mutations stay in the Issue Manager.
1209
+ */
1210
+ interface TuttiPlanIssueSource {
1211
+ getSessionPlanIssue(input: {
1212
+ workspaceId: string;
1213
+ sourceSessionId: string;
1214
+ }): Promise<TuttiPlanIssueQueryResult>;
1215
+ subscribeIssueUpdates(workspaceId: string, listener: (update: {
1216
+ issueId: string;
1217
+ }) => void): () => void;
1218
+ /** Accepts a pending-acceptance task (the human gate) from the embed. */
1219
+ acceptTask(input: {
1220
+ workspaceId: string;
1221
+ issueId: string;
1222
+ taskId: string;
1223
+ }): Promise<void>;
1224
+ /** Sends a pending-acceptance task back to rework (re-dispatch). */
1225
+ rejectTask(input: {
1226
+ workspaceId: string;
1227
+ issueId: string;
1228
+ taskId: string;
1229
+ }): Promise<void>;
1230
+ /**
1231
+ * Stops the Issue's execution: pauses future dispatch and cancels every
1232
+ * running task run. Idempotent; the daemon owns the cascade.
1233
+ */
1234
+ cancelExecution(input: {
1235
+ workspaceId: string;
1236
+ issueId: string;
1237
+ }): Promise<void>;
1238
+ /**
1239
+ * Resolves the delegate agent session that ran (or is running) a task's
1240
+ * latest run, so a task card can jump straight into that conversation.
1241
+ * Null when the task has not launched yet.
1242
+ */
1243
+ resolveTaskSession(input: {
1244
+ workspaceId: string;
1245
+ issueId: string;
1246
+ taskId: string;
1247
+ }): Promise<{
1248
+ agentSessionId: string;
1249
+ } | null>;
1250
+ }
1251
+ /**
1252
+ * Option catalogs for per-task assignment editing. The desktop host reuses
1253
+ * its agent directory and composer capability catalogs; the panel never
1254
+ * hardcodes providers or modes.
1255
+ */
1256
+ interface TuttiModePlanAssignmentOptionsSource {
1257
+ listAgents(input: {
1258
+ workspaceId: string;
1259
+ }): Promise<readonly TuttiModePlanAssignmentAgentOption[]>;
1260
+ loadAgentOptions(input: {
1261
+ workspaceId: string;
1262
+ agentTargetId: string;
1263
+ }): Promise<TuttiModePlanAssignmentAgentDetail>;
1264
+ }
1265
+ interface TuttiModePlanReviewRuntime {
1266
+ listPending(input: {
1267
+ workspaceId: string;
1268
+ sourceSessionId: string;
1269
+ }): Promise<readonly TuttiModePlanReviewSnapshot[]>;
1270
+ decide(input: TuttiModePlanReviewDecisionInput): Promise<void>;
1271
+ subscribe(workspaceId: string, listener: (update: TuttiModePlanReviewInvalidation) => void): () => void;
1272
+ /** Optional; the panel degrades to read-only assignment display without it. */
1273
+ assignmentOptions?: TuttiModePlanAssignmentOptionsSource;
1274
+ /** Optional; without it the embedded plan-issue panel never renders. */
1275
+ planIssues?: TuttiPlanIssueSource;
1276
+ }
1277
+
983
1278
  type AgentMentionReferenceTargetResolver = (item: AgentContextMentionItem) => ReferenceLocateTarget | null;
984
1279
  interface AgentWorkspaceReferenceInitialTargetInput {
985
1280
  activeConversation: AgentGUINodeViewModel["rail"]["activeConversation"];
@@ -1042,11 +1337,6 @@ interface AgentGUIRememberComposerDefaultsResult {
1042
1337
  supersededFields: AgentGUIComposerDefaultsField[];
1043
1338
  }
1044
1339
 
1045
- interface AgentGUIOpenSessionRequest {
1046
- agentSessionId: string;
1047
- sequence: number;
1048
- }
1049
-
1050
1340
  type AgentGUIComposerAppendRequest = {
1051
1341
  files: readonly AgentComposerDraftFile[];
1052
1342
  prompt?: string;
@@ -1061,11 +1351,18 @@ interface AgentGUIPrefillPromptRequest {
1061
1351
  agentTargetId?: string | null;
1062
1352
  autoSubmit?: boolean;
1063
1353
  draftPrompt: string;
1354
+ model?: string | null;
1355
+ modelPlanId?: string | null;
1064
1356
  provider?: AgentGUIProvider;
1065
1357
  sequence: number;
1066
1358
  userProjectPath?: string | null;
1067
1359
  }
1068
1360
 
1361
+ interface AgentGUIOpenSessionRequest {
1362
+ agentSessionId: string;
1363
+ sequence: number;
1364
+ }
1365
+
1069
1366
  type AgentStatusSectionState = "available" | "unavailable" | "error";
1070
1367
  type AgentStatusRequestReason = "slash-status" | "agent-info" | "agent-config";
1071
1368
  interface AgentStatusQuery {
@@ -1197,6 +1494,7 @@ interface AgentGUINodeHostActions {
1197
1494
  agentTargetId?: string | null;
1198
1495
  draftPrompt: string;
1199
1496
  provider: AgentGUIProvider;
1497
+ sourceAgentSessionId: string;
1200
1498
  userProjectPath?: string | null;
1201
1499
  }) => void | Promise<void>;
1202
1500
  onCapabilitySettingsRequest?: (capability: AgentComposerCapabilitySettingsTarget) => void;
@@ -1248,6 +1546,7 @@ interface AgentGUIProps extends Omit<AgentGUINodeProps, "hostCapabilities" | "re
1248
1546
  renderAgentsEmpty?: AgentGUIAgentsEmptyRenderer;
1249
1547
  agentActivityRuntime: AgentActivityRuntime;
1250
1548
  agentHostApi?: AgentHostInputApi | null;
1549
+ tuttiModePlanReviewRuntime?: TuttiModePlanReviewRuntime | null;
1251
1550
  /** Starter entries to hide below the empty new-session composer. */
1252
1551
  disabled?: readonly AgentGUIHomeSuggestionId[];
1253
1552
  i18n?: I18nRuntime<string> | null;
package/dist/agent-gui.js CHANGED
@@ -1,47 +1,47 @@
1
1
  import {
2
2
  AgentGUI
3
- } from "./chunk-2TPRBVDM.js";
3
+ } from "./chunk-CUIJXYHG.js";
4
4
  import "./chunk-LB4AGT7B.js";
5
5
  import "./chunk-A4WCTHWS.js";
6
- import "./chunk-RSFK6YRS.js";
7
- import "./chunk-ML53N3II.js";
8
- import "./chunk-DCZTHKWI.js";
9
- import "./chunk-MHOYBRCY.js";
10
- import "./chunk-UCDLFE2I.js";
11
- import "./chunk-HH5PLD7L.js";
12
- import "./chunk-HD2TXBXU.js";
13
- import "./chunk-6YRJ4OPB.js";
14
- import "./chunk-THBCAUBR.js";
6
+ import "./chunk-L3YCXXMA.js";
7
+ import "./chunk-KDN6SLJM.js";
8
+ import "./chunk-4CHBM3G3.js";
9
+ import "./chunk-CBMWHQ7P.js";
10
+ import "./chunk-MGSRWYRN.js";
11
+ import "./chunk-DNHDR2YC.js";
12
+ import "./chunk-U6TH4RJJ.js";
13
+ import "./chunk-S7OROGUS.js";
14
+ import "./chunk-CXC3ROXQ.js";
15
15
  import "./chunk-UP3ZDYTN.js";
16
16
  import "./chunk-GUFEHWUX.js";
17
- import "./chunk-FJ4A3A6W.js";
17
+ import "./chunk-TYQTSC7Y.js";
18
18
  import "./chunk-CX6XXG6R.js";
19
- import "./chunk-CFWR4C36.js";
20
- import "./chunk-HOT2PJ6T.js";
19
+ import "./chunk-G7DS23D4.js";
20
+ import "./chunk-SQZIKBOM.js";
21
21
  import "./chunk-VMPA46ET.js";
22
22
  import "./chunk-XJ34OIEQ.js";
23
23
  import "./chunk-JDVP33S5.js";
24
- import "./chunk-4ZCSXKK5.js";
24
+ import "./chunk-5VECGOBU.js";
25
25
  import "./chunk-3V5OCA2M.js";
26
26
  import "./chunk-RMQREVJY.js";
27
27
  import "./chunk-FGLQZ6I4.js";
28
- import "./chunk-QKCSWK7Y.js";
28
+ import "./chunk-ZE6VLLFC.js";
29
29
  import "./chunk-EVQ4JY3N.js";
30
- import "./chunk-2CZIBPST.js";
30
+ import "./chunk-PFTST5V6.js";
31
31
  import "./chunk-ZVYUTXQJ.js";
32
- import "./chunk-KE3UYJMW.js";
32
+ import "./chunk-Z5Y3RB2U.js";
33
33
  import "./chunk-YMXYBG7U.js";
34
- import "./chunk-V3VPKWVK.js";
34
+ import "./chunk-FGD2K7AB.js";
35
35
  import "./chunk-F5UR6EJG.js";
36
- import "./chunk-RWUYIHO3.js";
37
- import "./chunk-44IFVKLS.js";
36
+ import "./chunk-M6HTOCQK.js";
37
+ import "./chunk-DKGFEIZ7.js";
38
38
  import "./chunk-5BJYO6X3.js";
39
- import "./chunk-F2U7LSJN.js";
40
- import "./chunk-AHDJFZAC.js";
39
+ import "./chunk-AFUVWWQY.js";
40
+ import "./chunk-I4ICM3U4.js";
41
41
  import "./chunk-MIJXEELH.js";
42
42
  import "./chunk-D2JUDUYY.js";
43
43
  import "./chunk-QNE2ZPPV.js";
44
- import "./chunk-EWS7OGQK.js";
44
+ import "./chunk-O433KXLK.js";
45
45
  export {
46
46
  AgentGUI
47
47
  };