@tutti-os/agent-gui 0.0.72 → 0.0.74
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.
- package/README.md +9 -0
- package/dist/agent-conversation/index.d.ts +2 -2
- package/dist/agent-conversation/index.js +8 -8
- package/dist/agent-message-center/index.js +10 -10
- package/dist/{agentGuiNodeTypes-aJ3AX7u2.d.ts → agentGuiNodeTypes-C0WUHQzu.d.ts} +2 -1
- package/dist/app/renderer/agentactivity.css +6 -9
- package/dist/{chunk-C7K3EFGI.js → chunk-4XIHKCWC.js} +2 -2
- package/dist/{chunk-3PKRGSMH.js → chunk-6EREXANR.js} +4 -12
- package/dist/chunk-6EREXANR.js.map +1 -0
- package/dist/{chunk-ATEZXUHK.js → chunk-BT2DT2P7.js} +1 -1
- package/dist/chunk-BT2DT2P7.js.map +1 -0
- package/dist/{chunk-BHNJN2TR.js → chunk-BTUOROCD.js} +1 -4
- package/dist/chunk-BTUOROCD.js.map +1 -0
- package/dist/{chunk-XZF4QNT4.js → chunk-D2Z2QZVE.js} +2 -2
- package/dist/{chunk-GDFQXJMG.js → chunk-FHWE5SUF.js} +3 -7
- package/dist/chunk-FHWE5SUF.js.map +1 -0
- package/dist/{chunk-UAAXRSW2.js → chunk-FPODKSSV.js} +4 -4
- package/dist/chunk-FPODKSSV.js.map +1 -0
- package/dist/{chunk-IVIXKAEH.js → chunk-GLMDAZSQ.js} +3 -3
- package/dist/{chunk-466AWJTS.js → chunk-KVS7J7BJ.js} +5 -5
- package/dist/{chunk-5H6NINJY.js → chunk-LWFV4PS5.js} +2 -7
- package/dist/chunk-LWFV4PS5.js.map +1 -0
- package/dist/{chunk-KWQ4N4IZ.js → chunk-NO7WDGST.js} +3 -3
- package/dist/{chunk-4US2YHBY.js → chunk-RA3OUR64.js} +1 -3
- package/dist/chunk-RA3OUR64.js.map +1 -0
- package/dist/{chunk-SZF52NMJ.js → chunk-RF7GK4SM.js} +18 -12
- package/dist/chunk-RF7GK4SM.js.map +1 -0
- package/dist/{chunk-4I2VCAMW.js → chunk-SL2QSEIE.js} +1 -8
- package/dist/chunk-SL2QSEIE.js.map +1 -0
- package/dist/{chunk-2I2WRI4F.js → chunk-T5CEU7WH.js} +2 -3
- package/dist/chunk-T5CEU7WH.js.map +1 -0
- package/dist/{chunk-SVGIWXNK.js → chunk-VERGPY42.js} +2 -2
- package/dist/{chunk-G6BVEY7I.js → chunk-W5AJTBA7.js} +1 -15
- package/dist/chunk-W5AJTBA7.js.map +1 -0
- package/dist/{chunk-Q6AWM3RH.js → chunk-Z72JKSAY.js} +4 -4
- package/dist/{chunk-OBJRIQPX.js → chunk-ZSYDFQ4N.js} +38 -25
- package/dist/chunk-ZSYDFQ4N.js.map +1 -0
- package/dist/context-mention-palette/index.js +9 -9
- package/dist/i18n/index.d.ts +0 -14
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +58 -6
- package/dist/index.js +317 -89
- package/dist/index.js.map +1 -1
- package/dist/queued-prompt-runtime.d.ts +2 -2
- package/dist/{types-CrwMqBm1.d.ts → types-DUHHejs2.d.ts} +3 -3
- package/dist/workbench/contribution.d.ts +1 -1
- package/dist/workbench/contribution.js +6 -6
- package/dist/workbench/index.d.ts +1 -1
- package/dist/workbench/index.js +9 -9
- package/dist/workbench/launch.d.ts +1 -1
- package/dist/workbench/launch.js +3 -3
- package/dist/workbench/providerCatalog.d.ts +3 -3
- package/dist/workbench/providerCatalog.js +1 -1
- package/dist/workbench/sessionTitle.d.ts +1 -1
- package/dist/workbench/sessionTitle.js +3 -3
- package/dist/workbench/state.d.ts +1 -1
- package/dist/workbench/state.js +2 -2
- package/dist/workbench/types.d.ts +2 -2
- package/dist/workbench/types.js +1 -1
- package/dist/workspace-agent-generated-files.js +4 -4
- package/package.json +12 -12
- package/dist/chunk-2I2WRI4F.js.map +0 -1
- package/dist/chunk-3PKRGSMH.js.map +0 -1
- package/dist/chunk-4I2VCAMW.js.map +0 -1
- package/dist/chunk-4US2YHBY.js.map +0 -1
- package/dist/chunk-5H6NINJY.js.map +0 -1
- package/dist/chunk-ATEZXUHK.js.map +0 -1
- package/dist/chunk-BHNJN2TR.js.map +0 -1
- package/dist/chunk-G6BVEY7I.js.map +0 -1
- package/dist/chunk-GDFQXJMG.js.map +0 -1
- package/dist/chunk-OBJRIQPX.js.map +0 -1
- package/dist/chunk-SZF52NMJ.js.map +0 -1
- package/dist/chunk-UAAXRSW2.js.map +0 -1
- /package/dist/{chunk-C7K3EFGI.js.map → chunk-4XIHKCWC.js.map} +0 -0
- /package/dist/{chunk-XZF4QNT4.js.map → chunk-D2Z2QZVE.js.map} +0 -0
- /package/dist/{chunk-IVIXKAEH.js.map → chunk-GLMDAZSQ.js.map} +0 -0
- /package/dist/{chunk-466AWJTS.js.map → chunk-KVS7J7BJ.js.map} +0 -0
- /package/dist/{chunk-KWQ4N4IZ.js.map → chunk-NO7WDGST.js.map} +0 -0
- /package/dist/{chunk-SVGIWXNK.js.map → chunk-VERGPY42.js.map} +0 -0
- /package/dist/{chunk-Q6AWM3RH.js.map → chunk-Z72JKSAY.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { f as AgentGUIQueuedPromptVM } from './agentGuiNodeTypes-
|
|
1
|
+
import { f as AgentGUIQueuedPromptVM } from './agentGuiNodeTypes-C0WUHQzu.js';
|
|
2
2
|
import '@tutti-os/agent-activity-core';
|
|
3
|
-
import './types-
|
|
3
|
+
import './types-DUHHejs2.js';
|
|
4
4
|
import './workspaceAgentActivityListViewModel-DJvAqZso.js';
|
|
5
5
|
import './agentConversationVM-DPAgUJlR.js';
|
|
6
6
|
import '@tutti-os/workspace-user-project/contracts';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type AgentHostAgentSessionProvider = "claude-code" | "codex" | "tutti-agent" | "cursor" | "nexight" | "
|
|
1
|
+
type AgentHostAgentSessionProvider = "claude-code" | "codex" | "tutti-agent" | "cursor" | "nexight" | "hermes" | "opencode" | "openclaw";
|
|
2
2
|
type AgentHostAgentSessionPermissionModeSemantic = "ask-before-write" | "accept-edits" | "locked-down" | "auto" | "full-access" | "unconfigurable";
|
|
3
3
|
type AgentHostAgentSessionReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh" | string;
|
|
4
4
|
type AgentHostAgentSessionSpeed = "standard" | "fast" | string;
|
|
@@ -128,7 +128,7 @@ interface AgentHostAgentSessionCommand {
|
|
|
128
128
|
inputHint?: string;
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
-
declare const AGENT_PROVIDERS: readonly ["claude-code", "codex", "cursor", "tutti-agent", "nexight", "opencode", "
|
|
131
|
+
declare const AGENT_PROVIDERS: readonly ["claude-code", "codex", "cursor", "tutti-agent", "nexight", "opencode", "openclaw", "hermes"];
|
|
132
132
|
type AgentProvider = (typeof AGENT_PROVIDERS)[number];
|
|
133
133
|
|
|
134
134
|
interface AgentGUINodeData {
|
|
@@ -147,7 +147,7 @@ interface AgentGUINodeData {
|
|
|
147
147
|
composerOverridesByAgentTargetId?: Record<string, AgentHostAgentSessionComposerSettings | null> | null;
|
|
148
148
|
composerOverridesByProvider?: Partial<Record<AgentGUIProvider, AgentHostAgentSessionComposerSettings | null>> | null;
|
|
149
149
|
}
|
|
150
|
-
type AgentGUIProvider = Extract<AgentProvider, "claude-code" | "codex" | "tutti-agent" | "cursor" | "nexight" | "
|
|
150
|
+
type AgentGUIProvider = Extract<AgentProvider, "claude-code" | "codex" | "tutti-agent" | "cursor" | "nexight" | "hermes" | "openclaw" | "opencode">;
|
|
151
151
|
interface AgentGUIProviderTargetRef {
|
|
152
152
|
kind: string;
|
|
153
153
|
provider: AgentGUIProvider;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { WorkbenchFrame, WorkbenchHostNodeBodyContext, WorkbenchHostLaunchRequest, WorkbenchHostDockEntry, WorkbenchContribution } from '@tutti-os/workbench-surface';
|
|
3
3
|
import { AgentGuiWorkbenchProvider, AgentGuiWorkbenchState } from './types.js';
|
|
4
|
-
import { g as AgentGUIProviderTarget, i as AgentGUIProviderTargetRef } from '../types-
|
|
4
|
+
import { g as AgentGUIProviderTarget, i as AgentGUIProviderTargetRef } from '../types-DUHHejs2.js';
|
|
5
5
|
|
|
6
6
|
declare const agentGuiWorkbenchDefaultNodeFrame: WorkbenchFrame;
|
|
7
7
|
declare const agentGuiWorkbenchDefaultUsableWidthRatio = 0.8;
|
|
@@ -14,12 +14,12 @@ import {
|
|
|
14
14
|
resolveAgentGuiUnifiedDockLaunchPayload,
|
|
15
15
|
resolveAgentGuiWorkbenchContributionCopy,
|
|
16
16
|
resolveAgentGuiWorkbenchDefaultLaunchFrame
|
|
17
|
-
} from "../chunk-
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-
|
|
20
|
-
import "../chunk-
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
17
|
+
} from "../chunk-RF7GK4SM.js";
|
|
18
|
+
import "../chunk-T5CEU7WH.js";
|
|
19
|
+
import "../chunk-FPODKSSV.js";
|
|
20
|
+
import "../chunk-BT2DT2P7.js";
|
|
21
|
+
import "../chunk-BTUOROCD.js";
|
|
22
|
+
import "../chunk-SL2QSEIE.js";
|
|
23
23
|
export {
|
|
24
24
|
AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT,
|
|
25
25
|
AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT,
|
|
@@ -6,7 +6,7 @@ import { HTMLAttributes, ReactNode } from 'react';
|
|
|
6
6
|
import { WorkbenchDisplayMode, WorkbenchHostNodeHeaderWindowActions } from '@tutti-os/workbench-surface';
|
|
7
7
|
export { AgentGuiSessionTitleFormatOptions, AgentGuiWorkbenchSessionTitleResult, ResolveAgentGuiWorkbenchSessionTitleInput, formatAgentGuiConversationPlainTitle, formatAgentGuiSessionPlainTitle, resolveAgentGuiWorkbenchSessionTitle } from './sessionTitle.js';
|
|
8
8
|
export { AgentGuiWorkbenchComposerOverrides, AgentGuiWorkbenchNodeState, AgentGuiWorkbenchPrefillPromptPayload, AgentGuiWorkbenchProvider, AgentGuiWorkbenchState, AgentGuiWorkbenchWorkspaceState, agentGuiWorkbenchOpenSessionActivationType, agentGuiWorkbenchPrefillPromptActivationType } from './types.js';
|
|
9
|
-
import '../types-
|
|
9
|
+
import '../types-DUHHejs2.js';
|
|
10
10
|
import '@tutti-os/agent-activity-core';
|
|
11
11
|
import '../uiSettings-BQS9r2eo.js';
|
|
12
12
|
|
package/dist/workbench/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
createAgentGuiWorkbenchContribution,
|
|
9
9
|
resolveAgentGuiUnifiedDockLaunchPayload,
|
|
10
10
|
resolveAgentGuiWorkbenchContributionCopy
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-RF7GK4SM.js";
|
|
12
12
|
import {
|
|
13
13
|
agentGuiWorkbenchProviderFromInstanceId,
|
|
14
14
|
areAgentGuiWorkbenchNodeStatesEqual,
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
normalizeAgentGuiWorkbenchNodeState,
|
|
19
19
|
normalizeAgentGuiWorkbenchState,
|
|
20
20
|
projectAgentGuiWorkbenchState
|
|
21
|
-
} from "../chunk-
|
|
21
|
+
} from "../chunk-T5CEU7WH.js";
|
|
22
22
|
import {
|
|
23
23
|
agentGuiWorkbenchDockEntryId,
|
|
24
24
|
agentGuiWorkbenchDockIdentityFromIdentifier,
|
|
@@ -31,11 +31,11 @@ import {
|
|
|
31
31
|
createAgentGuiWorkbenchInstanceId,
|
|
32
32
|
createAgentGuiWorkbenchLaunchDescriptor,
|
|
33
33
|
createAgentGuiWorkbenchSessionLaunchRequest
|
|
34
|
-
} from "../chunk-
|
|
34
|
+
} from "../chunk-FPODKSSV.js";
|
|
35
35
|
import {
|
|
36
36
|
agentGuiWorkbenchOpenSessionActivationType,
|
|
37
37
|
agentGuiWorkbenchPrefillPromptActivationType
|
|
38
|
-
} from "../chunk-
|
|
38
|
+
} from "../chunk-BT2DT2P7.js";
|
|
39
39
|
import {
|
|
40
40
|
agentGuiWorkbenchComingSoonProviders,
|
|
41
41
|
agentGuiWorkbenchDefaultDockProviders,
|
|
@@ -48,15 +48,15 @@ import {
|
|
|
48
48
|
isAgentGuiWorkbenchProvider,
|
|
49
49
|
normalizeAgentGuiWorkbenchProvider,
|
|
50
50
|
resolveAgentGuiWorkbenchProviderLabel
|
|
51
|
-
} from "../chunk-
|
|
51
|
+
} from "../chunk-BTUOROCD.js";
|
|
52
52
|
import {
|
|
53
53
|
formatAgentGuiConversationPlainTitle,
|
|
54
54
|
formatAgentGuiSessionPlainTitle,
|
|
55
55
|
resolveAgentGuiWorkbenchSessionTitle
|
|
56
|
-
} from "../chunk-
|
|
57
|
-
import "../chunk-
|
|
58
|
-
import "../chunk-
|
|
59
|
-
import "../chunk-
|
|
56
|
+
} from "../chunk-D2Z2QZVE.js";
|
|
57
|
+
import "../chunk-LWFV4PS5.js";
|
|
58
|
+
import "../chunk-SL2QSEIE.js";
|
|
59
|
+
import "../chunk-W5AJTBA7.js";
|
|
60
60
|
import "../chunk-GCBDIQDX.js";
|
|
61
61
|
export {
|
|
62
62
|
AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { WorkbenchHostLaunchRequest } from '@tutti-os/workbench-surface';
|
|
2
2
|
import { agentGuiWorkbenchOpenSessionActivationType, AgentGuiWorkbenchPrefillPromptPayload, agentGuiWorkbenchPrefillPromptActivationType, AgentGuiWorkbenchProvider } from './types.js';
|
|
3
|
-
import '../types-
|
|
3
|
+
import '../types-DUHHejs2.js';
|
|
4
4
|
|
|
5
5
|
type AgentGuiWorkbenchLaunchRequestInput = Pick<WorkbenchHostLaunchRequest, "payload" | "typeId"> & {
|
|
6
6
|
dockEntryId?: string | null;
|
package/dist/workbench/launch.js
CHANGED
|
@@ -12,11 +12,11 @@ import {
|
|
|
12
12
|
createAgentGuiWorkbenchSessionLaunchRequest,
|
|
13
13
|
resolveAgentGuiWorkbenchLaunchDockEntryId,
|
|
14
14
|
shouldReuseAgentGuiWorkbenchDockEntryNode
|
|
15
|
-
} from "../chunk-
|
|
15
|
+
} from "../chunk-FPODKSSV.js";
|
|
16
16
|
import {
|
|
17
17
|
agentGuiWorkbenchPrefillPromptActivationType
|
|
18
|
-
} from "../chunk-
|
|
19
|
-
import "../chunk-
|
|
18
|
+
} from "../chunk-BT2DT2P7.js";
|
|
19
|
+
import "../chunk-BTUOROCD.js";
|
|
20
20
|
export {
|
|
21
21
|
agentGuiWorkbenchDockEntryId,
|
|
22
22
|
agentGuiWorkbenchDockIdentityFromIdentifier,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { AgentGuiWorkbenchProvider } from './types.js';
|
|
2
|
-
import '../types-
|
|
2
|
+
import '../types-DUHHejs2.js';
|
|
3
3
|
|
|
4
|
-
declare const agentGuiWorkbenchProviders: readonly ["claude-code", "codex", "cursor", "tutti-agent", "opencode", "hermes", "
|
|
4
|
+
declare const agentGuiWorkbenchProviders: readonly ["claude-code", "codex", "cursor", "tutti-agent", "opencode", "hermes", "openclaw"];
|
|
5
5
|
declare const agentGuiWorkbenchDefaultDockProviders: readonly ["codex", "claude-code", "tutti-agent"];
|
|
6
|
-
declare const agentGuiWorkbenchDockSuppressedProviders: readonly ["hermes", "
|
|
6
|
+
declare const agentGuiWorkbenchDockSuppressedProviders: readonly ["hermes", "opencode"];
|
|
7
7
|
declare const agentGuiWorkbenchComingSoonProviders: readonly [];
|
|
8
8
|
declare const agentGuiWorkbenchProviderLabels: Record<AgentGuiWorkbenchProvider, string>;
|
|
9
9
|
declare function resolveAgentGuiWorkbenchProviderLabel(provider: AgentGuiWorkbenchProvider): string;
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
isAgentGuiWorkbenchProvider,
|
|
11
11
|
normalizeAgentGuiWorkbenchProvider,
|
|
12
12
|
resolveAgentGuiWorkbenchProviderLabel
|
|
13
|
-
} from "../chunk-
|
|
13
|
+
} from "../chunk-BTUOROCD.js";
|
|
14
14
|
export {
|
|
15
15
|
agentGuiWorkbenchComingSoonProviders,
|
|
16
16
|
agentGuiWorkbenchDefaultDockProviders,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AgentActivitySnapshot } from '@tutti-os/agent-activity-core';
|
|
2
2
|
import { U as UiLanguage } from '../uiSettings-BQS9r2eo.js';
|
|
3
3
|
import { AgentGuiWorkbenchProvider } from './types.js';
|
|
4
|
-
import '../types-
|
|
4
|
+
import '../types-DUHHejs2.js';
|
|
5
5
|
|
|
6
6
|
interface AgentGuiSessionTitleFormatOptions {
|
|
7
7
|
fallbackAgentLabel?: string;
|
|
@@ -2,9 +2,9 @@ import {
|
|
|
2
2
|
formatAgentGuiConversationPlainTitle,
|
|
3
3
|
formatAgentGuiSessionPlainTitle,
|
|
4
4
|
resolveAgentGuiWorkbenchSessionTitle
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-D2Z2QZVE.js";
|
|
6
|
+
import "../chunk-LWFV4PS5.js";
|
|
7
|
+
import "../chunk-W5AJTBA7.js";
|
|
8
8
|
import "../chunk-GCBDIQDX.js";
|
|
9
9
|
export {
|
|
10
10
|
formatAgentGuiConversationPlainTitle,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { WorkbenchHostExternalStateSource, WorkbenchHostExternalStateLookupInput } from '@tutti-os/workbench-surface';
|
|
2
2
|
import { AgentGuiWorkbenchProvider, AgentGuiWorkbenchNodeState, AgentGuiWorkbenchState, AgentGuiWorkbenchWorkspaceState } from './types.js';
|
|
3
|
-
import '../types-
|
|
3
|
+
import '../types-DUHHejs2.js';
|
|
4
4
|
|
|
5
5
|
type AgentGuiWorkbenchStateLookupRequest = Pick<WorkbenchHostExternalStateLookupInput, "instanceId" | "typeId"> & Partial<Pick<WorkbenchHostExternalStateLookupInput, "nodeId">>;
|
|
6
6
|
declare function createDefaultAgentGuiWorkbenchNodeState(provider?: AgentGuiWorkbenchProvider): AgentGuiWorkbenchNodeState;
|
package/dist/workbench/state.js
CHANGED
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
normalizeAgentGuiWorkbenchNodeState,
|
|
9
9
|
normalizeAgentGuiWorkbenchState,
|
|
10
10
|
projectAgentGuiWorkbenchState
|
|
11
|
-
} from "../chunk-
|
|
12
|
-
import "../chunk-
|
|
11
|
+
} from "../chunk-T5CEU7WH.js";
|
|
12
|
+
import "../chunk-BTUOROCD.js";
|
|
13
13
|
export {
|
|
14
14
|
agentGuiWorkbenchProviderFromInstanceId,
|
|
15
15
|
agentGuiWorkbenchProviderFromInstanceIdOrNull,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { i as AgentGUIProviderTargetRef } from '../types-
|
|
1
|
+
import { i as AgentGUIProviderTargetRef } from '../types-DUHHejs2.js';
|
|
2
2
|
|
|
3
|
-
type AgentGuiWorkbenchProvider = "claude-code" | "codex" | "tutti-agent" | "cursor" | "nexight" | "
|
|
3
|
+
type AgentGuiWorkbenchProvider = "claude-code" | "codex" | "tutti-agent" | "cursor" | "nexight" | "hermes" | "openclaw" | "opencode";
|
|
4
4
|
declare const agentGuiWorkbenchOpenSessionActivationType = "agent-gui:open-session";
|
|
5
5
|
declare const agentGuiWorkbenchPrefillPromptActivationType = "agent-gui:prefill-prompt";
|
|
6
6
|
interface AgentGuiWorkbenchPrefillPromptPayload {
|
package/dist/workbench/types.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
agentGuiWorkbenchOpenSessionActivationType,
|
|
3
3
|
agentGuiWorkbenchPrefillPromptActivationType
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-BT2DT2P7.js";
|
|
5
5
|
export {
|
|
6
6
|
agentGuiWorkbenchOpenSessionActivationType,
|
|
7
7
|
agentGuiWorkbenchPrefillPromptActivationType
|
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
resolveWorkspaceAgentActivityStatus,
|
|
5
5
|
resolveWorkspaceAgentActivityTitle,
|
|
6
6
|
reuseWorkspaceAgentActivityListViewModelIfUnchanged
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-6EREXANR.js";
|
|
8
8
|
import "./chunk-IBIMGLCD.js";
|
|
9
9
|
import "./chunk-Y35GDLP2.js";
|
|
10
10
|
import {
|
|
11
11
|
workspaceAgentProviderLabel
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-RA3OUR64.js";
|
|
13
|
+
import "./chunk-4XIHKCWC.js";
|
|
14
|
+
import "./chunk-W5AJTBA7.js";
|
|
15
15
|
import "./chunk-GCBDIQDX.js";
|
|
16
16
|
export {
|
|
17
17
|
buildWorkspaceAgentActivityListViewModel,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tutti-os/agent-gui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.74",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -94,17 +94,17 @@
|
|
|
94
94
|
},
|
|
95
95
|
"dependencies": {
|
|
96
96
|
"@monaco-editor/react": "^4.7.0",
|
|
97
|
-
"@tutti-os/agent-activity-core": "0.0.
|
|
98
|
-
"@tutti-os/ui-i18n-runtime": "0.0.
|
|
99
|
-
"@tutti-os/ui-rich-text": "0.0.
|
|
100
|
-
"@tutti-os/ui-react-hooks": "0.0.
|
|
101
|
-
"@tutti-os/ui-system": "0.0.
|
|
102
|
-
"@tutti-os/workbench-surface": "0.0.
|
|
103
|
-
"@tutti-os/workspace-external-core": "0.0.
|
|
104
|
-
"@tutti-os/workspace-file-manager": "0.0.
|
|
105
|
-
"@tutti-os/workspace-file-reference": "0.0.
|
|
106
|
-
"@tutti-os/workspace-issue-manager": "0.0.
|
|
107
|
-
"@tutti-os/workspace-user-project": "0.0.
|
|
97
|
+
"@tutti-os/agent-activity-core": "0.0.74",
|
|
98
|
+
"@tutti-os/ui-i18n-runtime": "0.0.74",
|
|
99
|
+
"@tutti-os/ui-rich-text": "0.0.74",
|
|
100
|
+
"@tutti-os/ui-react-hooks": "0.0.74",
|
|
101
|
+
"@tutti-os/ui-system": "0.0.74",
|
|
102
|
+
"@tutti-os/workbench-surface": "0.0.74",
|
|
103
|
+
"@tutti-os/workspace-external-core": "0.0.74",
|
|
104
|
+
"@tutti-os/workspace-file-manager": "0.0.74",
|
|
105
|
+
"@tutti-os/workspace-file-reference": "0.0.74",
|
|
106
|
+
"@tutti-os/workspace-issue-manager": "0.0.74",
|
|
107
|
+
"@tutti-os/workspace-user-project": "0.0.74",
|
|
108
108
|
"@tanstack/react-virtual": "^3.13.12",
|
|
109
109
|
"@tiptap/core": "^3.11.1",
|
|
110
110
|
"@tiptap/pm": "^3.23.6",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../providerTargets.ts","../workbench/state.ts"],"sourcesContent":["import type {\n AgentGUIProvider,\n AgentGUIProviderTarget,\n AgentGUIProviderTargetBadge,\n AgentGUIProviderTargetRef\n} from \"./types.ts\";\n\nconst agentGUIProviderTargetStaticLabels: Record<AgentGUIProvider, string> = {\n \"claude-code\": \"Claude Code\",\n codex: \"Codex\",\n cursor: \"Cursor\",\n gemini: \"Gemini\",\n hermes: \"Hermes\",\n nexight: \"Tutti Agent\",\n openclaw: \"OpenClaw\",\n opencode: \"OpenCode\",\n \"tutti-agent\": \"Tutti Agent\"\n};\n\nexport const agentGUIDefaultTargetProviders = [\n \"codex\",\n \"claude-code\",\n \"cursor\",\n \"tutti-agent\",\n \"opencode\",\n \"hermes\",\n \"openclaw\"\n] as const satisfies readonly AgentGUIProvider[];\n\nconst agentGUIDisabledPlaceholderProviders = [\n \"hermes\",\n \"openclaw\"\n] as const satisfies readonly AgentGUIProvider[];\n\nexport function createLocalAgentGUIProviderTarget(\n provider: AgentGUIProvider\n): AgentGUIProviderTarget {\n const targetId = localAgentGUIProviderTargetId(provider);\n const agentTargetId = localAgentGUIAgentTargetId(provider);\n return {\n targetId,\n ...(agentTargetId ? { agentTargetId } : {}),\n provider,\n ref: {\n kind: \"local\",\n provider\n },\n label: agentGUIProviderTargetStaticLabels[provider] ?? provider\n };\n}\n\nexport function createDisabledPlaceholderAgentGUIProviderTarget(\n provider: AgentGUIProvider\n): AgentGUIProviderTarget {\n return {\n ...createLocalAgentGUIProviderTarget(provider),\n disabled: true\n };\n}\n\nexport function createSharedAgentGUIProviderTarget(input: {\n provider: AgentGUIProvider;\n sharedAgentId: string;\n label: string;\n agentTargetId?: string | null;\n badge?: AgentGUIProviderTargetBadge | null;\n ownerLabel?: string | null;\n iconUrl?: string | null;\n unavailableReason?: string | null;\n disabled?: boolean;\n ref?: Record<string, unknown> | null;\n}): AgentGUIProviderTarget {\n const sharedAgentId = input.sharedAgentId.trim();\n const targetId = `shared-agent:${sharedAgentId}`;\n const badge = normalizeAgentGUIProviderTargetBadge(input.badge);\n return {\n targetId,\n ...(input.agentTargetId?.trim()\n ? { agentTargetId: input.agentTargetId.trim() }\n : {}),\n provider: input.provider,\n ref: {\n ...(input.ref ?? {}),\n kind: \"shared-agent\",\n provider: input.provider,\n sharedAgentId\n },\n label: input.label,\n ...(badge ? { badge } : {}),\n ...(input.ownerLabel?.trim()\n ? { ownerLabel: input.ownerLabel.trim() }\n : {}),\n ...(input.iconUrl?.trim() ? { iconUrl: input.iconUrl.trim() } : {}),\n ...(input.unavailableReason?.trim()\n ? { unavailableReason: input.unavailableReason.trim() }\n : {}),\n ...(input.disabled === true ? { disabled: true } : {})\n };\n}\n\nexport function createLocalAgentGUIProviderTargets(\n providers: readonly AgentGUIProvider[] = agentGUIDefaultTargetProviders\n): AgentGUIProviderTarget[] {\n return providers.map((provider) =>\n createLocalAgentGUIProviderTarget(provider)\n );\n}\n\nfunction createStaticAgentGUIProviderTargets(\n providers: readonly AgentGUIProvider[] = agentGUIDefaultTargetProviders,\n options?: { includeDisabledPlaceholders?: boolean }\n): AgentGUIProviderTarget[] {\n const disabledProviders = new Set<AgentGUIProvider>(\n options?.includeDisabledPlaceholders === true\n ? agentGUIDisabledPlaceholderProviders\n : []\n );\n return providers.map((provider) =>\n disabledProviders.has(provider)\n ? createDisabledPlaceholderAgentGUIProviderTarget(provider)\n : createLocalAgentGUIProviderTarget(provider)\n );\n}\n\nexport function localAgentGUIProviderTargetId(\n provider: AgentGUIProvider\n): string {\n return `local:${provider}`;\n}\n\nexport function localAgentGUIAgentTargetId(\n provider: AgentGUIProvider\n): string | null {\n switch (provider) {\n case \"codex\":\n return \"local:codex\";\n case \"claude-code\":\n return \"local:claude-code\";\n case \"tutti-agent\":\n return \"local:tutti-agent\";\n case \"cursor\":\n return \"local:cursor\";\n case \"hermes\":\n return \"local:hermes\";\n case \"nexight\":\n return \"local:nexight\";\n case \"openclaw\":\n return \"local:openclaw\";\n case \"opencode\":\n return \"local:opencode\";\n default:\n return null;\n }\n}\n\nexport function normalizeAgentGUIProviderTargets(\n targets: readonly AgentGUIProviderTarget[] | null | undefined,\n options?: {\n includeDisabledPlaceholders?: boolean;\n useStaticCatalog?: boolean;\n }\n): AgentGUIProviderTarget[] {\n const includeDisabledPlaceholders =\n options?.includeDisabledPlaceholders === true;\n const useStaticCatalog = options?.useStaticCatalog !== false;\n const source = targets && targets.length > 0 ? targets : [];\n const normalizedTargets: AgentGUIProviderTarget[] = [];\n const seenTargetKeys = new Set<string>();\n const seenProviders = new Set<AgentGUIProvider>();\n for (const target of source) {\n const normalized = normalizeAgentGUIProviderTarget(target);\n if (!normalized) {\n continue;\n }\n const dedupeKey = `${normalized.provider}\\u0000${normalized.targetId}`;\n if (seenTargetKeys.has(dedupeKey)) {\n continue;\n }\n seenTargetKeys.add(dedupeKey);\n seenProviders.add(normalized.provider);\n normalizedTargets.push(normalized);\n }\n if (includeDisabledPlaceholders && normalizedTargets.length > 0) {\n for (const provider of agentGUIDisabledPlaceholderProviders) {\n if (seenProviders.has(provider)) {\n continue;\n }\n normalizedTargets.push(\n createDisabledPlaceholderAgentGUIProviderTarget(provider)\n );\n }\n }\n return normalizedTargets.length > 0 || !useStaticCatalog\n ? normalizedTargets\n : createStaticAgentGUIProviderTargets(undefined, {\n includeDisabledPlaceholders\n });\n}\n\nexport function resolveAgentGUIProviderTarget(input: {\n agentTargetId?: string | null;\n defaultProviderTargetId?: string | null;\n provider: AgentGUIProvider;\n providerTargetId?: string | null;\n providerTargets: readonly AgentGUIProviderTarget[];\n useStaticCatalog?: boolean;\n}): AgentGUIProviderTarget | null {\n const targetByAgentTargetId = new Map(\n input.providerTargets.flatMap((target) =>\n target.agentTargetId ? [[target.agentTargetId, target] as const] : []\n )\n );\n const agentTarget = targetByAgentTargetId.get(\n input.agentTargetId?.trim() ?? \"\"\n );\n if (agentTarget) {\n return agentTarget;\n }\n const providerTargets = input.providerTargets.filter(\n (target) => target.provider === input.provider\n );\n const targetById = new Map(\n providerTargets.map((target) => [target.targetId, target])\n );\n return (\n targetById.get(input.providerTargetId?.trim() ?? \"\") ??\n targetById.get(input.defaultProviderTargetId?.trim() ?? \"\") ??\n targetById.get(localAgentGUIProviderTargetId(input.provider)) ??\n providerTargets.find((target) => target.disabled !== true) ??\n providerTargets[0] ??\n (input.useStaticCatalog === false\n ? null\n : createLocalAgentGUIProviderTarget(input.provider))\n );\n}\n\nexport function agentGUIProviderTargetRefsEqual(\n left: AgentGUIProviderTargetRef | null | undefined,\n right: AgentGUIProviderTargetRef | null | undefined\n): boolean {\n if (left === right) {\n return true;\n }\n if (!left && !right) {\n return true;\n }\n if (!left || !right) {\n return false;\n }\n return stableProviderTargetRefKey(left) === stableProviderTargetRefKey(right);\n}\n\nfunction normalizeAgentGUIProviderTarget(\n target: AgentGUIProviderTarget\n): AgentGUIProviderTarget | null {\n const {\n targetId: _targetId,\n agentTargetId: _agentTargetId,\n provider: _provider,\n ref: _ref,\n label: _label,\n badge,\n description,\n iconUrl,\n ownerLabel,\n unavailableReason,\n ...rest\n } = target;\n const targetId = target.targetId.trim();\n const agentTargetId = target.agentTargetId?.trim();\n const label = target.label.trim();\n const kind =\n typeof target.ref.kind === \"string\" ? target.ref.kind.trim() : \"\";\n if (!targetId || !label || !kind || target.ref.provider !== target.provider) {\n return null;\n }\n const normalizedBadge = normalizeAgentGUIProviderTargetBadge(badge);\n return {\n ...rest,\n targetId,\n ...(agentTargetId ? { agentTargetId } : {}),\n provider: target.provider,\n ref: {\n ...target.ref,\n kind,\n provider: target.provider\n },\n label,\n ...(normalizedBadge ? { badge: normalizedBadge } : {}),\n ...(description?.trim() ? { description: description.trim() } : {}),\n ...(iconUrl?.trim() ? { iconUrl: iconUrl.trim() } : {}),\n ...(ownerLabel?.trim() ? { ownerLabel: ownerLabel.trim() } : {}),\n ...(unavailableReason?.trim()\n ? { unavailableReason: unavailableReason.trim() }\n : {})\n };\n}\n\nfunction normalizeAgentGUIProviderTargetBadge(\n badge: AgentGUIProviderTargetBadge | null | undefined\n): AgentGUIProviderTargetBadge | null {\n const iconUrl = badge?.iconUrl?.trim() ?? \"\";\n if (!iconUrl) {\n return null;\n }\n const label = badge?.label?.trim() ?? \"\";\n return {\n iconUrl,\n ...(label ? { label } : {})\n };\n}\n\nfunction stableProviderTargetRefKey(ref: AgentGUIProviderTargetRef): string {\n return JSON.stringify(sortProviderTargetRefValue(ref));\n}\n\nfunction sortProviderTargetRefValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortProviderTargetRefValue);\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entryValue]) => [key, sortProviderTargetRefValue(entryValue)])\n );\n}\n","import type {\n WorkbenchHostExternalStateLookupInput,\n WorkbenchHostExternalStateSource\n} from \"@tutti-os/workbench-surface\";\nimport {\n agentGuiWorkbenchProviders,\n isAgentGuiWorkbenchProvider,\n normalizeAgentGuiWorkbenchProvider\n} from \"./providerCatalog.ts\";\nimport { agentGUIProviderTargetRefsEqual } from \"../providerTargets.ts\";\nimport type {\n AgentGuiWorkbenchComposerOverrides,\n AgentGuiWorkbenchComposerOverridesByAgentTargetId,\n AgentGuiWorkbenchComposerOverridesByProvider,\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState,\n AgentGuiWorkbenchWorkspaceState\n} from \"./types.ts\";\nimport type { AgentGUIProviderTargetRef } from \"../types.ts\";\n\ntype AgentGuiWorkbenchStateLookupRequest = Pick<\n WorkbenchHostExternalStateLookupInput,\n \"instanceId\" | \"typeId\"\n> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>;\n\nexport function createDefaultAgentGuiWorkbenchNodeState(\n provider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n return {\n agentTargetId: null,\n composerOverrides: null,\n composerOverridesByAgentTargetId: null,\n composerOverridesByProvider: null,\n conversationCount: null,\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null,\n lastActiveConversationTitle: null,\n provider,\n providerTargetId: null,\n providerTargetRef: null\n };\n}\n\nexport function normalizeAgentGuiWorkbenchState(\n state: unknown\n): AgentGuiWorkbenchState {\n if (!isRecord(state)) {\n return createDefaultAgentGuiWorkbenchState();\n }\n const agentTargetId =\n normalizeOptionalNonEmptyString(state.agentTargetId) ??\n normalizeOptionalNonEmptyString(state.providerTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof state.lastActiveAgentSessionId === \"string\"\n ? state.lastActiveAgentSessionId\n : null,\n ...(typeof state.lastActiveConversationTitle === \"string\"\n ? { lastActiveConversationTitle: state.lastActiveConversationTitle }\n : {})\n };\n}\n\nexport function projectAgentGuiWorkbenchState(\n state: AgentGuiWorkbenchNodeState\n): AgentGuiWorkbenchState {\n const agentTargetId =\n normalizeOptionalNonEmptyString(state.agentTargetId) ??\n normalizeOptionalNonEmptyString(state.providerTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId: state.lastActiveAgentSessionId ?? null,\n ...(typeof state.lastActiveConversationTitle === \"string\"\n ? { lastActiveConversationTitle: state.lastActiveConversationTitle }\n : {})\n };\n}\n\nexport function areAgentGuiWorkbenchStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId &&\n (left.lastActiveConversationTitle ?? null) ===\n (right.lastActiveConversationTitle ?? null)\n );\n}\n\nexport function normalizeAgentGuiWorkbenchNodeState(\n state: Partial<AgentGuiWorkbenchNodeState> | null | undefined,\n fallbackProvider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n const provider = normalizeAgentGuiWorkbenchProvider(\n state?.provider,\n fallbackProvider\n );\n return {\n ...createDefaultAgentGuiWorkbenchNodeState(provider),\n agentTargetId:\n normalizeOptionalNonEmptyString(state?.agentTargetId) ??\n normalizeOptionalNonEmptyString(state?.providerTargetId),\n composerOverrides: normalizeAgentGuiWorkbenchComposerOverrides(\n state?.composerOverrides\n ),\n composerOverridesByAgentTargetId:\n normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n state?.composerOverridesByAgentTargetId\n ),\n composerOverridesByProvider:\n normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n state?.composerOverridesByProvider\n ),\n conversationCount: normalizeOptionalNonNegativeNumber(\n state?.conversationCount\n ),\n conversationRailCollapsed: state?.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state?.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof state?.lastActiveAgentSessionId === \"string\"\n ? state.lastActiveAgentSessionId\n : null,\n lastActiveConversationTitle:\n typeof state?.lastActiveConversationTitle === \"string\"\n ? state.lastActiveConversationTitle\n : null,\n provider,\n providerTargetId: normalizeOptionalNonEmptyString(state?.providerTargetId),\n providerTargetRef: normalizeAgentGuiProviderTargetRef(\n state?.providerTargetRef,\n provider\n )\n };\n}\n\nexport function areAgentGuiWorkbenchNodeStatesEqual(\n left: AgentGuiWorkbenchNodeState,\n right: AgentGuiWorkbenchNodeState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n composerOverridesEqual(left.composerOverrides, right.composerOverrides) &&\n composerOverridesByAgentTargetIdEqual(\n left.composerOverridesByAgentTargetId,\n right.composerOverridesByAgentTargetId\n ) &&\n composerOverridesByProviderEqual(\n left.composerOverridesByProvider,\n right.composerOverridesByProvider\n ) &&\n left.conversationCount === right.conversationCount &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId &&\n left.lastActiveConversationTitle === right.lastActiveConversationTitle &&\n left.provider === right.provider &&\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n (left.providerTargetId ?? null) === (right.providerTargetId ?? null) &&\n agentGUIProviderTargetRefsEqual(\n left.providerTargetRef,\n right.providerTargetRef\n )\n );\n}\n\nexport function agentGuiWorkbenchProviderFromInstanceId(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider {\n const normalized = instanceId?.trim();\n if (!normalized || normalized === \"agent-gui\") {\n return \"codex\";\n }\n const [, provider] = normalized.split(\":\", 3);\n return normalizeAgentGuiWorkbenchProvider(provider);\n}\n\n/**\n * Like {@link agentGuiWorkbenchProviderFromInstanceId} but returns `null`\n * instead of defaulting to `\"codex\"` when the provider cannot be determined\n * yet (e.g. a freshly created session whose instanceId does not encode a\n * provider). Callers that render a provider icon use this so they can show a\n * neutral placeholder during that transient window instead of flashing the\n * wrong provider's icon.\n */\nexport function agentGuiWorkbenchProviderFromInstanceIdOrNull(\n instanceId: string | null | undefined\n): AgentGuiWorkbenchProvider | null {\n const normalized = instanceId?.trim();\n if (!normalized || normalized === \"agent-gui\") {\n return null;\n }\n const [, provider] = normalized.split(\":\", 3);\n return isAgentGuiWorkbenchProvider(provider) ? provider : null;\n}\n\nexport function createAgentGuiWorkbenchNodeStateSource(input: {\n typeId?: string;\n workspaceId: string;\n}): {\n externalStateSource: WorkbenchHostExternalStateSource<\n AgentGuiWorkbenchState | null,\n AgentGuiWorkbenchWorkspaceState\n >;\n readNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest\n ) => AgentGuiWorkbenchState | null;\n writeNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest & {\n state: AgentGuiWorkbenchState;\n }\n ) => void;\n /**\n * Returns the launch instanceId of an open node currently showing the given\n * agent session, or null when none is found. Used to focus an existing\n * conversation instead of launching a duplicate node.\n */\n findInstanceIdByAgentSessionId: (agentSessionId: string) => string | null;\n} {\n const typeId = input.typeId ?? \"agent-gui\";\n const nodeStateByKey = new Map<string, AgentGuiWorkbenchState>();\n // Tracks the launch instanceId behind each state key so a node can be located\n // by the session it is currently showing, even when its key is node-scoped.\n const instanceIdByKey = new Map<string, string>();\n const listeners = new Set<() => void>();\n\n const lookupState = (request: AgentGuiWorkbenchStateLookupRequest) => {\n const nodeState = request.nodeId\n ? nodeStateByKey.get(agentGuiWorkbenchNodeStateKey(request))\n : null;\n const state =\n nodeState ??\n nodeStateByKey.get(agentGuiWorkbenchInstanceStateKey(request));\n return state ? { ...state } : null;\n };\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n externalStateSource: {\n getNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getSnapshotNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getWorkspaceState() {\n return {\n workspaceId: input.workspaceId\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n },\n readNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n findInstanceIdByAgentSessionId(agentSessionId) {\n const target = agentSessionId.trim();\n if (!target) {\n return null;\n }\n for (const [key, state] of nodeStateByKey) {\n if (state.lastActiveAgentSessionId?.trim() === target) {\n return instanceIdByKey.get(key) ?? null;\n }\n }\n return null;\n },\n writeNodeState(request) {\n if (request.typeId !== typeId) {\n return;\n }\n const key = agentGuiWorkbenchNodeStateKey(request);\n instanceIdByKey.set(key, request.instanceId);\n const previous = nodeStateByKey.get(key);\n let clearedInstanceSeed = false;\n if (request.nodeId) {\n const instanceKey = agentGuiWorkbenchInstanceStateKey(request);\n instanceIdByKey.delete(instanceKey);\n clearedInstanceSeed = nodeStateByKey.delete(instanceKey);\n }\n const next = {\n ...normalizeAgentGuiWorkbenchState(request.state)\n };\n nodeStateByKey.set(key, next);\n if (\n !clearedInstanceSeed &&\n previous &&\n areAgentGuiWorkbenchMemoryStatesEqual(previous, next)\n ) {\n return;\n }\n notify();\n }\n };\n}\n\nfunction areAgentGuiWorkbenchMemoryStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return areAgentGuiWorkbenchStatesEqual(left, right);\n}\n\nfunction agentGuiWorkbenchNodeStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\"> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>\n): string {\n return request.nodeId\n ? `node:${request.nodeId}`\n : agentGuiWorkbenchInstanceStateKey(request);\n}\n\nfunction agentGuiWorkbenchInstanceStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\">\n): string {\n return `instance:${request.instanceId}`;\n}\n\nfunction createDefaultAgentGuiWorkbenchState(): AgentGuiWorkbenchState {\n return {\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null\n };\n}\n\nfunction normalizeOptionalNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction normalizeAgentGuiProviderTargetRef(\n value: unknown,\n expectedProvider?: AgentGuiWorkbenchProvider\n): AgentGUIProviderTargetRef | null {\n if (!isRecord(value)) {\n return null;\n }\n const kind = normalizeOptionalNonEmptyString(value.kind);\n const provider = value.provider;\n if (!kind || !isAgentGuiWorkbenchProvider(provider)) {\n return null;\n }\n if (expectedProvider && provider !== expectedProvider) {\n return null;\n }\n return {\n ...value,\n kind,\n provider\n };\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverrides(\n value: unknown\n): AgentGuiWorkbenchComposerOverrides | null {\n if (!isRecord(value)) {\n return null;\n }\n const composerOverrides: AgentGuiWorkbenchComposerOverrides = {};\n if (typeof value.model === \"string\" && value.model.trim()) {\n composerOverrides.model = value.model.trim();\n }\n if (\n typeof value.reasoningEffort === \"string\" &&\n value.reasoningEffort.trim()\n ) {\n composerOverrides.reasoningEffort = value.reasoningEffort.trim();\n }\n if (\n typeof value.permissionModeId === \"string\" &&\n value.permissionModeId.trim()\n ) {\n composerOverrides.permissionModeId = value.permissionModeId.trim();\n }\n if (typeof value.planMode === \"boolean\") {\n composerOverrides.planMode = value.planMode;\n }\n return Object.keys(composerOverrides).length > 0 ? composerOverrides : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByProvider | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByProvider = {};\n for (const provider of agentGuiWorkbenchProviders) {\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(\n value[provider]\n );\n if (overrides) {\n result[provider] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByAgentTargetId | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByAgentTargetId = {};\n for (const [rawAgentTargetId, rawOverrides] of Object.entries(value)) {\n const agentTargetId = normalizeOptionalNonEmptyString(rawAgentTargetId);\n if (!agentTargetId) {\n continue;\n }\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(rawOverrides);\n if (overrides) {\n result[agentTargetId] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeOptionalPositiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? Math.round(value)\n : null;\n}\n\nfunction normalizeOptionalNonNegativeNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? Math.round(value)\n : null;\n}\n\nfunction composerOverridesEqual(\n left: AgentGuiWorkbenchComposerOverrides | null | undefined,\n right: AgentGuiWorkbenchComposerOverrides | null | undefined\n): boolean {\n return (\n (left?.model ?? null) === (right?.model ?? null) &&\n (left?.permissionModeId ?? null) === (right?.permissionModeId ?? null) &&\n (left?.planMode ?? null) === (right?.planMode ?? null) &&\n (left?.reasoningEffort ?? null) === (right?.reasoningEffort ?? null)\n );\n}\n\nfunction composerOverridesByProviderEqual(\n left: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined\n): boolean {\n for (const provider of agentGuiWorkbenchProviders) {\n if (!composerOverridesEqual(left?.[provider], right?.[provider])) {\n return false;\n }\n }\n return true;\n}\n\nfunction composerOverridesByAgentTargetIdEqual(\n left: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined\n): boolean {\n const leftKeys = Object.keys(left ?? {}).sort();\n const rightKeys = Object.keys(right ?? {}).sort();\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n return leftKeys.every(\n (key, index) =>\n key === rightKeys[index] &&\n composerOverridesEqual(left?.[key], right?.[key])\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../shared/workspaceAgentActivityListViewModel.ts","../shared/workspaceAgentLatestActivitySummary.ts","../shared/workspaceAgentSessionTitle.ts"],"sourcesContent":["import {\n normalizeAgentActivityDisplayStatus,\n resolveLatestAgentActivityMessageDisplayStatus\n} from \"@tutti-os/agent-activity-core\";\nimport type { AgentHostUserInfo } from \"./contracts/dto\";\nimport { translate } from \"../i18n/index\";\nimport { fileChangePathsFromChanges } from \"./workspaceAgentFileChangePayload\";\nimport { normalizeAgentTitleText } from \"./utils/agentTitleText\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport type { RoomShareMemberView } from \"./roomShare\";\nimport { resolveDisplayableWorkspaceAgentSessionTitle } from \"./workspaceAgentSessionTitle\";\nimport type { WorkspaceAgentToolCallDisplay } from \"./workspaceAgentToolCallDisplay\";\nimport {\n fallbackSummary,\n type WorkspaceAgentConversationPreviewLine,\n type WorkspaceAgentLatestActivityStatus\n} from \"./workspaceAgentLatestActivitySummary\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\nimport {\n isWorkspaceAgentActivityRuntimeSessionOrigin,\n type WorkspaceAgentActivityMessage,\n type WorkspaceAgentActivityPresence,\n type WorkspaceAgentActivitySession,\n type WorkspaceAgentActivitySnapshot\n} from \"./workspaceAgentActivityTypes\";\nimport { resolveWorkspaceAgentSessionSortTimeUnixMs } from \"./workspaceAgentSessionSortTime\";\n\nexport type WorkspaceAgentActivityStatus = WorkspaceAgentLatestActivityStatus;\n\nexport interface WorkspaceAgentChangedFile {\n path: string;\n label: string;\n}\n\nexport interface WorkspaceAgentActivityCard {\n id: string;\n sessionId: string;\n userId: string | null;\n userName: string;\n userAvatarUrl?: string;\n agentProvider: string;\n agentName: string;\n title: string;\n status: WorkspaceAgentActivityStatus;\n latestActivitySummary: string;\n /** User prompt + latest agent reply for task/issue execution cards; room status list uses single-line summary only. */\n conversationPreview?: WorkspaceAgentConversationPreviewLine[];\n latestActivityActorName?: string;\n toolCalls?: WorkspaceAgentToolCallDisplay[];\n changedFiles: WorkspaceAgentChangedFile[];\n sortTimeUnixMs: number;\n readTimeUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivityListViewModel {\n activities: WorkspaceAgentActivityCard[];\n}\n\nexport interface BuildWorkspaceAgentActivityListOptions {\n sessionMessagesById?: Record<string, WorkspaceAgentActivityMessage[]>;\n userProfilesById?: Record<string, AgentHostUserInfo>;\n fallbackMembers?: RoomShareMemberView[];\n}\n\nexport interface CollectWorkspaceAgentGeneratedFilesOptions {\n workspaceRoot?: string | null;\n /** When set, only include files from sessions whose cwd matches this path. */\n sessionCwd?: string | null;\n}\n\nexport function collectWorkspaceAgentGeneratedFiles(\n snapshot: WorkspaceAgentActivitySnapshot,\n options: CollectWorkspaceAgentGeneratedFilesOptions = {}\n): WorkspaceAgentChangedFile[] {\n const sessionCwdFilter = normalizeComparablePath(options.sessionCwd ?? \"\");\n const workspaceRoot =\n sessionCwdFilter ||\n normalizeComparablePath(options.workspaceRoot ?? \"\") ||\n resolveWorkspaceRootFromSessions(snapshot.sessions);\n const sessions = sessionCwdFilter\n ? snapshot.sessions.filter(\n (session) =>\n normalizeComparablePath(session.cwd ?? \"\") === sessionCwdFilter\n )\n : snapshot.sessions;\n const filesByPath = new Map<string, WorkspaceAgentChangedFile>();\n\n for (const session of sessions) {\n const sessionCwd =\n normalizeComparablePath(session.cwd ?? \"\") || workspaceRoot;\n const normalizePath = createAgentGeneratedFilePathNormalizer({\n sessionCwd,\n workspaceRoot\n });\n const messages = resolveWorkspaceAgentSessionMessages(\n snapshot.sessionMessagesById,\n session\n );\n if (messages.length === 0) {\n continue;\n }\n for (const file of changedFilesForSession(messages, normalizePath, {\n requireSuccessfulFileChangeTool: true\n })) {\n filesByPath.set(file.path, file);\n }\n for (const path of imageGenerationPathsFromMessages(\n messages,\n normalizePath\n )) {\n if (filesByPath.has(path)) {\n continue;\n }\n filesByPath.set(path, {\n path,\n label: path.split(\"/\").filter(Boolean).at(-1) ?? path\n });\n }\n }\n\n return applyShortestUniqueFileLabels([...filesByPath.values()]);\n}\n\nexport function buildWorkspaceAgentActivityListViewModel(\n snapshot: WorkspaceAgentActivitySnapshot,\n options: BuildWorkspaceAgentActivityListOptions = {}\n): WorkspaceAgentActivityListViewModel {\n const presencesById = new Map(\n snapshot.presences.map((presence) => [presence.id, presence])\n );\n\n const activities = snapshot.sessions\n .map((session): WorkspaceAgentActivityCard | null => {\n const presence =\n session.presenceId === undefined\n ? null\n : (presencesById.get(session.presenceId) ?? null);\n const messages = resolveWorkspaceAgentSessionMessages(\n options.sessionMessagesById,\n session\n );\n const status = resolveWorkspaceAgentActivityStatus(session, messages);\n if (\n shouldHideEmptyRuntimePlaceholderSession(\n session,\n messages,\n status,\n options\n )\n ) {\n return null;\n }\n const user = resolveActivityUser(session, presence, options);\n const agentProvider = resolveProvider(session, presence);\n const agentName = workspaceAgentProviderLabel(agentProvider);\n const resolvedSortTimeUnixMs = resolveWorkspaceAgentSessionSortTimeUnixMs(\n session,\n {\n messages\n }\n );\n const latestActivity = resolveLatestActivity(messages, status, {\n agentName,\n userName: user.userName\n });\n\n const activity: WorkspaceAgentActivityCard = {\n id: `activity-${session.agentSessionId}`,\n sessionId: session.agentSessionId,\n userId: user.userId,\n userName: user.userName,\n ...(user.userAvatarUrl ? { userAvatarUrl: user.userAvatarUrl } : {}),\n agentProvider,\n agentName,\n title: resolveWorkspaceAgentActivityTitle(session, messages),\n status,\n latestActivitySummary: latestActivity.summary,\n latestActivityActorName: latestActivity.actorName,\n changedFiles: changedFilesForSession(messages),\n sortTimeUnixMs: resolvedSortTimeUnixMs,\n readTimeUnixMs: readTimeUnixMs(session, status, resolvedSortTimeUnixMs)\n };\n\n return activity;\n })\n .filter(\n (activity): activity is WorkspaceAgentActivityCard => activity !== null\n )\n .sort(compareActivities);\n\n return { activities };\n}\n\nexport function reuseWorkspaceAgentActivityListViewModelIfUnchanged(\n previous: WorkspaceAgentActivityListViewModel | null,\n next: WorkspaceAgentActivityListViewModel\n): WorkspaceAgentActivityListViewModel {\n if (!previous) {\n return next;\n }\n if (next.activities.length === 0) {\n return previous.activities.length === 0 ? previous : next;\n }\n\n const previousActivitiesById = new Map(\n previous.activities.map((activity) => [activity.id, activity])\n );\n const activities = next.activities.map((activity) => {\n const previousActivity = previousActivitiesById.get(activity.id);\n if (\n !previousActivity ||\n !workspaceAgentActivityCardEquals(previousActivity, activity)\n ) {\n return activity;\n }\n return previousActivity;\n });\n const reusedEveryActivityInPlace =\n previous.activities.length === activities.length &&\n previous.activities.every(\n (activity, index) => activity === activities[index]\n );\n\n return reusedEveryActivityInPlace ? previous : { activities };\n}\nexport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\n\nfunction shouldHideEmptyRuntimePlaceholderSession(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[],\n status: WorkspaceAgentActivityStatus,\n options: BuildWorkspaceAgentActivityListOptions\n): boolean {\n if (!isWorkspaceAgentActivityRuntimeSessionOrigin(session.sessionOrigin)) {\n return false;\n }\n if (messages.length > 0) {\n return false;\n }\n if (!hasLoadedSessionMessageRecord(session, options.sessionMessagesById)) {\n return false;\n }\n if (!isRuntimePlaceholderTerminalStatus(status)) {\n return false;\n }\n return resolveDisplayableWorkspaceAgentSessionTitle(session) === \"\";\n}\n\nfunction hasLoadedSessionMessageRecord(\n session: WorkspaceAgentActivitySession,\n sessionMessagesById:\n | Record<string, WorkspaceAgentActivityMessage[]>\n | undefined\n): boolean {\n if (!sessionMessagesById) {\n return false;\n }\n return workspaceAgentSessionMessageAliases(session).some(\n (alias) => alias in sessionMessagesById\n );\n}\n\nfunction isRuntimePlaceholderTerminalStatus(\n status: WorkspaceAgentActivityStatus\n): boolean {\n return status === \"idle\" || status === \"completed\" || status === \"canceled\";\n}\n\nfunction workspaceAgentActivityCardEquals(\n left: WorkspaceAgentActivityCard,\n right: WorkspaceAgentActivityCard\n): boolean {\n return (\n left.id === right.id &&\n left.sessionId === right.sessionId &&\n left.userId === right.userId &&\n left.userName === right.userName &&\n left.userAvatarUrl === right.userAvatarUrl &&\n left.agentProvider === right.agentProvider &&\n left.agentName === right.agentName &&\n left.title === right.title &&\n left.status === right.status &&\n left.latestActivitySummary === right.latestActivitySummary &&\n left.latestActivityActorName === right.latestActivityActorName &&\n left.sortTimeUnixMs === right.sortTimeUnixMs &&\n JSON.stringify(left.conversationPreview ?? []) ===\n JSON.stringify(right.conversationPreview ?? []) &&\n JSON.stringify(left.toolCalls ?? []) ===\n JSON.stringify(right.toolCalls ?? []) &&\n JSON.stringify(left.changedFiles) === JSON.stringify(right.changedFiles)\n );\n}\n\nfunction resolveWorkspaceAgentSessionMessages(\n sessionMessagesById:\n | Record<string, WorkspaceAgentActivityMessage[]>\n | undefined,\n session: WorkspaceAgentActivitySession\n): WorkspaceAgentActivityMessage[] {\n if (!sessionMessagesById) {\n return [];\n }\n for (const alias of workspaceAgentSessionMessageAliases(session)) {\n const messages = sessionMessagesById[alias];\n if (messages) {\n return messages;\n }\n }\n return [];\n}\n\nfunction resolveActivityUser(\n session: WorkspaceAgentActivitySession,\n presence: WorkspaceAgentActivityPresence | null,\n options: BuildWorkspaceAgentActivityListOptions\n): Pick<WorkspaceAgentActivityCard, \"userId\" | \"userName\" | \"userAvatarUrl\"> {\n if (presence) {\n return resolveUserFromId(presence.userId ?? \"\", options);\n }\n\n const sessionUserId = session.userId?.trim() ?? \"\";\n if (sessionUserId) {\n return resolveUserFromId(sessionUserId, options);\n }\n\n const fallbackMember = selectFallbackMember(options.fallbackMembers ?? []);\n if (fallbackMember) {\n return {\n userId: fallbackMember.userId,\n userName: fallbackMember.label || \"Unknown member\",\n ...(fallbackMember.avatarUrl\n ? { userAvatarUrl: fallbackMember.avatarUrl }\n : {})\n };\n }\n\n return {\n userId: null,\n userName: \"Unknown member\"\n };\n}\n\nfunction resolveUserFromId(\n rawUserId: string,\n options: BuildWorkspaceAgentActivityListOptions\n): Pick<WorkspaceAgentActivityCard, \"userId\" | \"userName\" | \"userAvatarUrl\"> {\n const userId = rawUserId.trim();\n const profile = options.userProfilesById?.[userId];\n const profileName = compactText(profile?.name ?? \"\");\n const profileAvatar = profile?.avatar?.trim();\n const rawName = profileName || userId || \"Unknown member\";\n\n return {\n userId,\n userName: stripTrailingParentheticalEmailFromLabel(rawName) || rawName,\n ...(profileAvatar ? { userAvatarUrl: profileAvatar } : {})\n };\n}\n\nfunction selectFallbackMember(\n members: RoomShareMemberView[]\n): RoomShareMemberView | null {\n return (\n members.find((member) => member.role === \"owner\") ?? members[0] ?? null\n );\n}\n\nfunction resolveProvider(\n session: WorkspaceAgentActivitySession,\n presence: WorkspaceAgentActivityPresence | null\n): string {\n const sessionProvider = normalizeProvider(session.provider);\n if (sessionProvider) {\n return sessionProvider;\n }\n\n const presenceProvider = normalizeProvider(presence?.provider);\n if (presenceProvider) {\n return presenceProvider;\n }\n\n return \"unknown\";\n}\n\nfunction normalizeProvider(provider: string | undefined): string | null {\n const trimmed = provider?.trim();\n return trimmed ? trimmed.toLowerCase() : null;\n}\n\nexport function resolveWorkspaceAgentActivityStatus(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[] = []\n): WorkspaceAgentActivityStatus {\n const sessionStatus = normalizeAgentActivityDisplayStatus(session.status, {\n currentPhase: session.currentPhase,\n turnLifecycleOutcome: session.turnLifecycle?.outcome,\n turnLifecyclePhase: session.turnLifecycle?.phase ?? session.turnPhase\n });\n const normalized =\n sessionStatus === \"failed\"\n ? (resolveLatestAgentActivityMessageDisplayStatus(messages) ??\n sessionStatus)\n : sessionStatus;\n switch (normalized) {\n case \"failed\":\n return \"failed\";\n case \"canceled\":\n return \"canceled\";\n case \"completed\":\n return \"completed\";\n case \"waiting\":\n return \"waiting\";\n case \"working\":\n return \"working\";\n default:\n return \"idle\";\n }\n}\n\nexport function resolveWorkspaceAgentActivityTitle(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[] = []\n): string {\n const sessionTitle = resolveDisplayableWorkspaceAgentSessionTitle(session);\n const userMessageTitle = firstUserMessageText(messages);\n if (\n sessionTitle &&\n !isProviderPlaceholderTitleForSession(sessionTitle, session)\n ) {\n return sessionTitle;\n }\n return userMessageTitle || sessionTitle || workspaceAgentUntitledTaskLabel();\n}\n\nfunction isProviderPlaceholderTitleForSession(\n title: string,\n session: WorkspaceAgentActivitySession\n): boolean {\n const provider = normalizeProvider(session.provider);\n if (!provider) {\n return false;\n }\n const normalizedTitle = title.trim().toLowerCase();\n return (\n workspaceAgentProviderLabel(provider).toLowerCase() === normalizedTitle\n );\n}\n\nfunction resolveLatestActivity(\n messages: readonly WorkspaceAgentActivityMessage[],\n status: WorkspaceAgentActivityStatus,\n actors: { agentName: string; userName: string }\n): { actorName: string; summary: string } {\n const latestMessage = latestDisplayableMessage(messages);\n if (latestMessage) {\n return {\n actorName:\n messageRole(latestMessage.message) === \"user\"\n ? actors.userName\n : actors.agentName,\n summary: latestMessage.text\n };\n }\n return {\n actorName: actors.agentName,\n summary: fallbackSummary(status)\n };\n}\n\ntype ChangedFilePathNormalizer = (value: unknown) => string | null;\n\ninterface ChangedFileCollectionOptions {\n requireSuccessfulFileChangeTool?: boolean;\n}\n\nfunction changedFilesForSession(\n messages: readonly WorkspaceAgentActivityMessage[],\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer,\n options: ChangedFileCollectionOptions = {}\n): WorkspaceAgentChangedFile[] {\n const changedFilesByPath = new Map<string, WorkspaceAgentChangedFile>();\n const appendPath = (path: string | null): void => {\n if (!path || changedFilesByPath.has(path)) {\n return;\n }\n changedFilesByPath.set(path, {\n path,\n label: path\n });\n };\n\n for (const message of messages) {\n for (const path of changedFilePathsFromMessage(\n message,\n normalizePath,\n options\n )) {\n appendPath(path);\n }\n }\n\n return applyShortestUniqueFileLabels(Array.from(changedFilesByPath.values()));\n}\n\nfunction changedFilePathsFromMessage(\n message: WorkspaceAgentActivityMessage,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer,\n options: ChangedFileCollectionOptions = {}\n): string[] {\n const isSuccessfulFileChangeTool = isSuccessfulFileChangeToolMessage(message);\n if (options.requireSuccessfulFileChangeTool && !isSuccessfulFileChangeTool) {\n return [];\n }\n const payload = objectValue(message.payload);\n const explicitFileChanges = fileChangePaths(\n arrayValue(objectValue(payload?.fileChanges)?.files),\n normalizePath\n );\n if (explicitFileChanges.length > 0) {\n return explicitFileChanges;\n }\n if (!isSuccessfulFileChangeTool) {\n return [];\n }\n\n const toolState = objectValue(payload?.tool_state);\n const input =\n objectValue(payload?.input) ?? objectValue(toolState?.input) ?? null;\n const output = objectValue(payload?.output);\n const paths = dedupeStrings([\n ...pathsValue(payload?.paths, normalizePath),\n ...pathsValue(output?.paths, normalizePath),\n ...pathsValue(input?.paths, normalizePath),\n ...changeMapPaths(payload?.changes, normalizePath),\n ...changeMapPaths(output?.changes, normalizePath),\n ...changeMapPaths(input?.changes, normalizePath),\n ...contentDiffPaths(payload?.content, normalizePath),\n ...contentDiffPaths(output?.content, normalizePath),\n ...contentDiffPaths(input?.content, normalizePath),\n stringValue(payload?.path),\n stringValue(payload?.filePath),\n stringValue(payload?.file_path),\n stringValue(input?.path),\n stringValue(input?.filePath),\n stringValue(input?.file_path),\n stringValue(output?.path),\n stringValue(output?.filePath),\n stringValue(output?.file_path)\n ]);\n return paths\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction defaultChangedFilePathNormalizer(value: unknown): string | null {\n return normalizedChangedFilePath(value);\n}\n\nfunction resolveWorkspaceRootFromSessions(\n sessions: readonly WorkspaceAgentActivitySession[]\n): string {\n for (const session of sessions) {\n const cwd = normalizeComparablePath(session.cwd ?? \"\");\n if (cwd) {\n return cwd;\n }\n }\n return \"\";\n}\n\nfunction normalizeComparablePath(path: string): string {\n return path.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n}\n\nfunction createAgentGeneratedFilePathNormalizer(input: {\n sessionCwd?: string | null;\n workspaceRoot?: string | null;\n}): ChangedFilePathNormalizer {\n const workspaceRoot = input.workspaceRoot?.trim().replace(/\\/+$/, \"\") ?? \"\";\n const sessionCwd =\n input.sessionCwd?.trim().replace(/\\/+$/, \"\") || workspaceRoot;\n return (value: unknown) => {\n if (typeof value !== \"string\") {\n return null;\n }\n return resolveAgentGeneratedFilePath(value, workspaceRoot, sessionCwd);\n };\n}\n\nfunction resolveAgentGeneratedFilePath(\n rawPath: string,\n workspaceRoot: string,\n sessionCwd: string\n): string | null {\n const path = rawPath.trim();\n if (!path || isStructuredPayloadPath(path)) {\n return null;\n }\n if (path.startsWith(\"/workspace/\")) {\n return path;\n }\n if (isAgentStateGeneratedImagePath(path)) {\n return path;\n }\n if (isAbsoluteAgentGeneratedFilePath(path)) {\n if (\n workspaceRoot &&\n !isPathInsideOrEqual(path, workspaceRoot) &&\n !isAgentStateGeneratedImagePath(path)\n ) {\n return null;\n }\n return path.replace(/\\\\/g, \"/\");\n }\n\n const base = sessionCwd || workspaceRoot;\n if (!base) {\n return null;\n }\n const resolved = joinAgentGeneratedFilePath(base, path.replace(/^\\.?\\//, \"\"));\n if (\n workspaceRoot &&\n !isPathInsideOrEqual(resolved, workspaceRoot) &&\n !isAgentStateGeneratedImagePath(resolved)\n ) {\n return null;\n }\n return resolved;\n}\n\nfunction isAbsoluteAgentGeneratedFilePath(path: string): boolean {\n return path.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(path);\n}\n\nfunction isPathInsideOrEqual(path: string, root: string): boolean {\n const normalizedPath = path.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const normalizedRoot = root.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n if (!normalizedRoot) {\n return false;\n }\n return (\n normalizedPath === normalizedRoot ||\n normalizedPath.startsWith(`${normalizedRoot}/`)\n );\n}\n\nfunction joinAgentGeneratedFilePath(\n base: string,\n relativePath: string\n): string {\n const normalizedBase = base.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const normalizedRelative = relativePath.replace(/\\\\/g, \"/\");\n return `${normalizedBase}/${normalizedRelative}`;\n}\n\nfunction imageGenerationPathsFromMessages(\n messages: readonly WorkspaceAgentActivityMessage[],\n normalizePath: ChangedFilePathNormalizer\n): string[] {\n const paths: string[] = [];\n for (const message of messages) {\n const payload = objectValue(message.payload);\n if (!payload) {\n continue;\n }\n const output = objectValue(payload.output);\n for (const uri of [\n ...imageGenerationUris(payload.content),\n ...imageGenerationUris(output?.content)\n ]) {\n const normalized = normalizePath(uri);\n if (normalized) {\n paths.push(normalized);\n }\n }\n }\n return dedupeStrings(paths);\n}\n\nfunction imageGenerationUris(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const uris: string[] = [];\n for (const item of value) {\n const record = objectValue(item);\n if (!record) {\n continue;\n }\n const type = stringValue(record.type)?.toLowerCase();\n const uri = stringValue(record.uri) ?? stringValue(record.path);\n if (!uri) {\n continue;\n }\n if (\n type === \"image\" ||\n uri.toLowerCase().includes(\"generated_images\") ||\n /\\.(?:png|jpe?g|gif|webp|bmp|svg)$/i.test(uri)\n ) {\n uris.push(uri);\n }\n }\n return uris;\n}\n\nfunction isAgentStateGeneratedImagePath(path: string): boolean {\n const segments = path.split(\"/\").filter(Boolean);\n const stateRootIndex = segments.findIndex(\n (segment) => segment === \".tutti\" || segment === \".tutti-dev\"\n );\n if (stateRootIndex < 0) {\n return false;\n }\n const statePath = segments.slice(stateRootIndex);\n return (\n statePath[1] === \"agent\" &&\n statePath[2] === \"runs\" &&\n statePath.includes(\"generated_images\")\n );\n}\n\nfunction normalizedChangedFilePath(\n value: unknown,\n options: { allowRelative?: boolean } = {}\n): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const path = value.trim();\n if (!path || isStructuredPayloadPath(path)) {\n return null;\n }\n if (!options.allowRelative && !path.startsWith(\"/workspace/\")) {\n return null;\n }\n return path;\n}\n\nfunction applyShortestUniqueFileLabels(\n files: WorkspaceAgentChangedFile[]\n): WorkspaceAgentChangedFile[] {\n const suffixByPath = shortestUniquePathSuffixByPath(\n files.map((file) => file.path)\n );\n return files.map((file) => ({\n ...file,\n label: suffixByPath.get(file.path) ?? file.label\n }));\n}\n\nfunction shortestUniquePathSuffixByPath(paths: string[]): Map<string, string> {\n const partsByPath = new Map(\n paths.map((path) => [path, splitPathSegments(path)])\n );\n const labels = new Map<string, string>();\n const unresolved = new Set(paths);\n\n for (let depth = 1; unresolved.size > 0; depth += 1) {\n const grouped = new Map<string, string[]>();\n\n for (const path of unresolved) {\n const parts = partsByPath.get(path) ?? [];\n const suffix = parts.slice(-Math.min(depth, parts.length)).join(\"/\");\n const fallback = parts.at(-1) ?? path;\n const label = suffix || fallback;\n const group = grouped.get(label);\n if (group) {\n group.push(path);\n } else {\n grouped.set(label, [path]);\n }\n }\n\n let resolvedCount = 0;\n for (const [label, group] of grouped) {\n if (group.length !== 1) {\n continue;\n }\n const path = group[0];\n if (!path) {\n continue;\n }\n labels.set(path, label);\n unresolved.delete(path);\n resolvedCount += 1;\n }\n\n if (resolvedCount === 0) {\n for (const path of unresolved) {\n labels.set(path, path);\n }\n break;\n }\n }\n\n return labels;\n}\n\nfunction splitPathSegments(path: string): string[] {\n return path.trim().split(/[\\\\/]/).filter(Boolean);\n}\n\nfunction isSuccessfulFileChangeToolMessage(\n message: WorkspaceAgentActivityMessage\n): boolean {\n if (normalizeToken(message.kind) !== \"tool_call\") {\n return false;\n }\n if (!isSuccessfulFileChangeStatus(message.status ?? undefined)) {\n return false;\n }\n const payload = objectValue(message.payload);\n if (!isSuccessfulFileChangePayloadStatus(payload)) {\n return false;\n }\n return hasFileChangeSignal(payload);\n}\n\nfunction isSuccessfulFileChangePayloadStatus(\n payload: Record<string, unknown> | null\n): boolean {\n if (!payload) {\n return true;\n }\n if (!isSuccessfulFileChangeRecordStatus(payload)) {\n return false;\n }\n const output = objectValue(payload.output);\n if (output && !isSuccessfulFileChangeRecordStatus(output)) {\n return false;\n }\n return true;\n}\n\nfunction isSuccessfulFileChangeRecordStatus(\n record: Record<string, unknown>\n): boolean {\n const status = stringValue(record.status);\n if (status && !isSuccessfulFileChangeStatus(status)) {\n return false;\n }\n const success = booleanValue(record.success);\n if (success === false) {\n return false;\n }\n return true;\n}\n\nfunction isSuccessfulFileChangeStatus(value: string | undefined): boolean {\n const normalizedStatus = normalizeToken(value);\n return (\n !normalizedStatus ||\n normalizedStatus === \"completed\" ||\n normalizedStatus === \"success\" ||\n normalizedStatus === \"succeeded\" ||\n normalizedStatus === \"ok\"\n );\n}\n\nfunction hasFileChangeSignal(payload: Record<string, unknown> | null): boolean {\n if (!payload) {\n return false;\n }\n const toolState = objectValue(payload.tool_state);\n return [\n payload,\n objectValue(payload.input),\n objectValue(payload.output),\n objectValue(toolState?.input)\n ].some((record) => record !== null && recordHasFileChangeToolSignal(record));\n}\n\nfunction recordHasFileChangeToolSignal(\n record: Record<string, unknown>\n): boolean {\n const activityKind = stringValue(record.activityKind);\n if (\n activityKind &&\n isFileChangeNormalizedToolName(normalizeToolName(activityKind))\n ) {\n return true;\n }\n if (stringValue(record.fileChangeKind)) {\n return true;\n }\n const toolCall = objectValue(record.toolCall);\n const toolCallKind = normalizeToken(stringValue(toolCall?.kind) ?? undefined);\n if (\n toolCallKind === \"write\" ||\n toolCallKind === \"edit\" ||\n toolCallKind === \"delete\"\n ) {\n return true;\n }\n const toolName = normalizeToolName(\n stringValue(record.toolName) ??\n stringValue(record.title) ??\n stringValue(record.name) ??\n \"\"\n );\n return isFileChangeNormalizedToolName(toolName);\n}\n\nfunction isFileChangeNormalizedToolName(normalizedToolName: string): boolean {\n if (!normalizedToolName) {\n return false;\n }\n const exactMatches = new Set([\n \"write\",\n \"writefile\",\n \"create\",\n \"createfile\",\n \"delete\",\n \"deletefile\",\n \"edit\",\n \"editfile\",\n \"multiedit\",\n \"applypatch\",\n \"move\",\n \"notebookedit\"\n ]);\n if (exactMatches.has(normalizedToolName)) {\n return true;\n }\n for (const prefix of exactMatches) {\n if (normalizedToolName.startsWith(`${prefix}/`)) {\n return true;\n }\n }\n return false;\n}\n\nfunction fileChangePaths(\n files: readonly unknown[] | null,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n if (!files) {\n return [];\n }\n return files\n .map((file) => normalizePath(objectValue(file)?.path))\n .filter((path): path is string => path !== null);\n}\n\nfunction changeMapPaths(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n return fileChangePathsFromChanges(value)\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction contentDiffPaths(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n const content = arrayValue(value);\n if (!content) {\n return [];\n }\n return content\n .map((entry) => {\n const record = objectValue(entry);\n if (!record || stringValue(record.type) !== \"diff\") {\n return null;\n }\n return normalizePath(record.path);\n })\n .filter((path): path is string => path !== null);\n}\n\nfunction pathsValue(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n const paths = arrayValue(value);\n if (!paths) {\n return [];\n }\n return paths\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction arrayValue(value: unknown): readonly unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction booleanValue(value: unknown): boolean | null {\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction dedupeStrings(values: Array<string | null>): string[] {\n return [\n ...new Set(\n values.filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0\n )\n )\n ];\n}\n\nfunction normalizeToolName(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replaceAll(\"_\", \"\")\n .replaceAll(\"-\", \"\")\n .replaceAll(\" \", \"\");\n}\n\nfunction isStructuredPayloadPath(path: string): boolean {\n if (/[\\r\\n]/.test(path)) {\n return true;\n }\n if (!path.startsWith(\"{\") && !path.startsWith(\"[\")) {\n return false;\n }\n try {\n JSON.parse(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction readTimeUnixMs(\n session: WorkspaceAgentActivitySession,\n status: WorkspaceAgentActivityStatus,\n fallbackUnixMs: number\n): number {\n if (status === \"completed\" || status === \"failed\") {\n return session.endedAtUnixMs ?? session.updatedAtUnixMs ?? fallbackUnixMs;\n }\n return fallbackUnixMs;\n}\n\nfunction firstUserMessageText(\n messages: readonly WorkspaceAgentActivityMessage[]\n): string {\n const firstUserMessage = messages\n .map((message) => ({\n message,\n text: messageDisplayText(message),\n time: messageTime(message)\n }))\n .filter(\n (item) => messageRole(item.message) === \"user\" && item.text.length > 0\n )\n .sort((left, right) => {\n const timeDiff = (left.time ?? 0) - (right.time ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return (\n (left.message.id ?? 0) - (right.message.id ?? 0) ||\n left.message.messageId.localeCompare(right.message.messageId)\n );\n })[0];\n\n return firstUserMessage?.text ?? \"\";\n}\n\nfunction latestDisplayableMessage(\n messages: readonly WorkspaceAgentActivityMessage[]\n): {\n message: WorkspaceAgentActivityMessage;\n text: string;\n time?: number;\n} | null {\n return (\n messages\n .map((message) => ({\n message,\n text: messageDisplayText(message),\n time: messageTime(message)\n }))\n .filter(\n (item) =>\n item.text.length > 0 &&\n normalizeToken(item.message.kind) !== \"tool_call\"\n )\n .sort((left, right) => {\n const timeDiff = (right.time ?? 0) - (left.time ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return (\n (right.message.id ?? 0) - (left.message.id ?? 0) ||\n right.message.messageId.localeCompare(left.message.messageId)\n );\n })[0] ?? null\n );\n}\n\nfunction messageDisplayText(message: WorkspaceAgentActivityMessage): string {\n const payload = message.payload ?? {};\n const text = normalizeAgentTitleText(\n compactText(\n stringValue(payload.displayPrompt) ||\n stringValue(payload.text) ||\n stringValue(payload.content) ||\n stringValue(payload.message) ||\n stringValue(payload.body) ||\n stringValue(payload.title) ||\n \"\"\n )\n );\n return isWorkspaceAgentSyntheticControlMessage(text) ? \"\" : text;\n}\n\nfunction messageRole(message: WorkspaceAgentActivityMessage): string {\n return normalizeToken(message.role);\n}\n\nfunction messageTime(\n message: WorkspaceAgentActivityMessage\n): number | undefined {\n return (\n message.occurredAtUnixMs ??\n message.completedAtUnixMs ??\n message.startedAtUnixMs\n );\n}\n\nfunction normalizeToken(value: string | undefined): string {\n return value?.trim().toLowerCase() ?? \"\";\n}\n\nfunction compareActivities(\n left: WorkspaceAgentActivityCard,\n right: WorkspaceAgentActivityCard\n): number {\n const timeDiff = right.sortTimeUnixMs - left.sortTimeUnixMs;\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return left.sessionId.localeCompare(right.sessionId);\n}\n\nfunction compactText(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction workspaceAgentUntitledTaskLabel(): string {\n return normalizeAgentTitleText(\n translate(\"agentHost.workspaceAgentsUntitledTask\")\n );\n}\n\nfunction workspaceAgentSessionMessageAliases(\n session: WorkspaceAgentActivitySession\n): string[] {\n const values = [\n session.syncState?.agentSessionId,\n session.agentSessionId,\n session.providerSessionId\n ];\n const seen = new Set<string>();\n const aliases: string[] = [];\n for (const value of values) {\n const normalized = value?.trim() ?? \"\";\n if (!normalized || seen.has(normalized)) {\n continue;\n }\n seen.add(normalized);\n aliases.push(normalized);\n }\n return aliases;\n}\n\n/** Remove trailing ` (user@host...)` that some APIs pack into names. */\nfunction stripTrailingParentheticalEmailFromLabel(label: string): string {\n return label\n .trim()\n .replace(/\\s*\\([^)]*@[^)]+\\)\\s*$/u, \"\")\n .trim();\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentActivityTypes\";\nimport { translate, translateInUiLanguage } from \"../i18n/index\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\n\nexport type WorkspaceAgentLatestActivityStatus =\n | \"working\"\n | \"waiting\"\n | \"idle\"\n | \"completed\"\n | \"canceled\"\n | \"failed\";\n\nexport interface WorkspaceAgentLatestActivityActors {\n agentName: string;\n userName: string;\n}\n\nexport interface WorkspaceAgentLatestActivitySummary {\n actorName: string;\n summary: string;\n}\n\nexport interface WorkspaceAgentConversationPreviewLine {\n actorName: string;\n summary: string;\n}\n\nexport function activityTitleFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[],\n fallbackTitle = \"\"\n): string {\n return (\n compactText(fallbackTitle) ||\n latestUserMessageText(timelineItems) ||\n workspaceAgentUntitledTaskLabel()\n );\n}\n\nexport function resolveLatestActivitySummary(\n timelineItems: WorkspaceAgentActivityTimelineItem[],\n status: WorkspaceAgentLatestActivityStatus,\n actors: WorkspaceAgentLatestActivityActors\n): WorkspaceAgentLatestActivitySummary {\n for (const item of [...timelineItems].sort(compareTimelineItemsDescending)) {\n const summary = displayableActivitySummary(item);\n if (summary) {\n return {\n actorName: activityActorName(item, actors),\n summary\n };\n }\n }\n return {\n actorName: actors.agentName,\n summary: fallbackSummary(status)\n };\n}\n\nexport function fallbackSummary(\n status: WorkspaceAgentLatestActivityStatus\n): string {\n switch (status) {\n case \"working\":\n return translate(\"agentHost.workspaceAgentActivityStatusWorking\");\n case \"waiting\":\n return translate(\"agentHost.workspaceAgentActivityStatusWaiting\");\n case \"idle\":\n return translate(\"agentHost.workspaceAgentActivityStatusIdle\");\n case \"canceled\":\n case \"completed\":\n return translate(\"agentHost.workspaceAgentActivityStatusEnd\");\n case \"failed\":\n return translate(\"agentHost.workspaceAgentActivityStatusFailed\");\n }\n}\n\nexport function isWorkspaceAgentIdleSummary(summary: string): boolean {\n return localizedWorkspaceAgentLabelSet(\n \"agentHost.workspaceAgentActivityStatusIdle\"\n ).has(compactText(summary));\n}\n\nexport function isWorkspaceAgentUntitledTask(title: string): boolean {\n return localizedWorkspaceAgentLabelSet(\n \"agentHost.workspaceAgentsUntitledTask\"\n ).has(compactText(title));\n}\n\nexport function latestUserMessageFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n return latestUserMessageText(timelineItems);\n}\n\nexport function latestAgentMessageFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n return latestAgentMessageText(timelineItems);\n}\n\nexport function buildUserAndAgentConversationPreview(input: {\n timelineItems: WorkspaceAgentActivityTimelineItem[];\n userName: string;\n agentName: string;\n userPromptFallback?: string;\n status: WorkspaceAgentLatestActivityStatus;\n}): WorkspaceAgentConversationPreviewLine[] {\n const timeline = input.timelineItems ?? [];\n const lines: WorkspaceAgentConversationPreviewLine[] = [];\n const userMessage =\n compactText(input.userPromptFallback ?? \"\") ||\n latestUserMessageFromTimeline(timeline);\n\n if (userMessage) {\n lines.push({ actorName: input.userName, summary: userMessage });\n }\n\n const agentMessage = latestAgentMessageFromTimeline(timeline);\n if (agentMessage) {\n lines.push({ actorName: input.agentName, summary: agentMessage });\n } else if (userMessage || timeline.length > 0) {\n const latestActivity = resolveLatestActivitySummary(\n timeline,\n input.status,\n {\n userName: input.userName,\n agentName: input.agentName\n }\n );\n if (\n latestActivity.actorName === input.agentName &&\n latestActivity.summary\n ) {\n lines.push({\n actorName: input.agentName,\n summary: latestActivity.summary\n });\n } else {\n lines.push({\n actorName: input.agentName,\n summary: fallbackSummary(input.status)\n });\n }\n }\n\n return lines;\n}\n\nfunction latestUserMessageText(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n const latestUserMessage = [...timelineItems]\n .filter(isUserMessageItem)\n .sort(compareTimelineItemsDescending)[0];\n if (!latestUserMessage) {\n return \"\";\n }\n\n return firstPresentText(\n stringPayloadValue(latestUserMessage, \"displayPrompt\"),\n stringPayloadValue(latestUserMessage, \"text\"),\n stringPayloadValue(latestUserMessage, \"content\"),\n latestUserMessage.content\n );\n}\n\nfunction displayableActivitySummary(\n item: WorkspaceAgentActivityTimelineItem\n): string {\n if (messageRole(item)) {\n return messageContent(item);\n }\n\n return \"\";\n}\n\nfunction activityActorName(\n item: WorkspaceAgentActivityTimelineItem,\n actors: WorkspaceAgentLatestActivityActors\n): string {\n return messageRole(item) === \"user\" ? actors.userName : actors.agentName;\n}\n\nfunction isUserMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return (\n isMessageItem(item) &&\n messageRole(item) === \"user\" &&\n messageContent(item).length > 0\n );\n}\n\nfunction latestAgentMessageText(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n const latestAgentMessage = [...timelineItems]\n .filter(isAgentMessageItem)\n .sort(compareTimelineItemsDescending)[0];\n if (!latestAgentMessage) {\n return \"\";\n }\n\n return messageContent(latestAgentMessage);\n}\n\nfunction isAgentMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return (\n isMessageItem(item) &&\n messageRole(item) === \"agent\" &&\n messageContent(item).length > 0\n );\n}\n\nfunction isMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return item.itemType === \"message\" || item.itemType.startsWith(\"message.\");\n}\n\nfunction messageRole(\n item: WorkspaceAgentActivityTimelineItem\n): \"user\" | \"agent\" | null {\n const explicitRole = item.role?.trim().toLowerCase();\n if (explicitRole === \"user\") {\n return \"user\";\n }\n if (explicitRole === \"assistant\" || explicitRole === \"agent\") {\n return \"agent\";\n }\n\n const itemType = item.itemType.trim().toLowerCase();\n if (itemType === \"message.user\") {\n return \"user\";\n }\n if (itemType === \"message.agent\" || itemType === \"message.assistant\") {\n return \"agent\";\n }\n return null;\n}\n\nfunction messageContent(item: WorkspaceAgentActivityTimelineItem): string {\n const content = firstPresentText(\n stringPayloadValue(item, \"displayPrompt\"),\n stringPayloadValue(item, \"text\"),\n stringPayloadValue(item, \"content\"),\n item.content\n );\n return isWorkspaceAgentSyntheticControlMessage(content) ? \"\" : content;\n}\n\nfunction stringPayloadValue(\n item: WorkspaceAgentActivityTimelineItem,\n key: \"content\" | \"displayPrompt\" | \"summary\" | \"text\"\n): string {\n const value = item.payload?.[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction compareTimelineItemsDescending(\n left: WorkspaceAgentActivityTimelineItem,\n right: WorkspaceAgentActivityTimelineItem\n): number {\n const leftTime = timelineTime(left);\n const rightTime = timelineTime(right);\n const timeDiff = (rightTime ?? 0) - (leftTime ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return right.id - left.id || right.eventId.localeCompare(left.eventId);\n}\n\nfunction timelineTime(\n item: WorkspaceAgentActivityTimelineItem | null | undefined\n): number | null {\n if (!item) {\n return null;\n }\n return item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null;\n}\n\nfunction firstPresentText(...values: Array<string | undefined>): string {\n for (const value of values) {\n const text = compactText(value ?? \"\");\n if (text) {\n return text;\n }\n }\n return \"\";\n}\n\nfunction compactText(value: string): string {\n return value.trim().replace(/\\s+/g, \" \");\n}\n\nfunction workspaceAgentUntitledTaskLabel(): string {\n return translate(\"agentHost.workspaceAgentsUntitledTask\");\n}\n\nfunction localizedWorkspaceAgentLabelSet(key: string): Set<string> {\n return new Set(\n ([\"en\", \"zh-CN\"] as const)\n .map((language) => compactText(translateInUiLanguage(language, key)))\n .filter(Boolean)\n );\n}\n","import { normalizeAgentTitleText } from \"./utils/agentTitleText\";\nimport { isWorkspaceAgentUntitledTask } from \"./workspaceAgentLatestActivitySummary\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\nimport type { WorkspaceAgentActivitySession } from \"./workspaceAgentActivityTypes\";\n\nexport function resolveDisplayableWorkspaceAgentSessionTitle(\n session: Pick<WorkspaceAgentActivitySession, \"title\" | \"provider\">\n): string {\n const title = normalizeAgentTitleText(session.title);\n if (\n !title ||\n isWorkspaceAgentUntitledTask(title) ||\n isWorkspaceAgentSyntheticControlMessage(title)\n ) {\n return \"\";\n }\n const provider = session.provider?.trim();\n if (\n provider &&\n workspaceAgentProviderLabel(provider).toLowerCase() === title.toLowerCase()\n ) {\n return \"\";\n }\n return title;\n}\n"],"mappings":"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","names":["compactText"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../shared/managedAgentProviders.ts","../managedAgentIconAssets.ts"],"sourcesContent":["export function normalizeManagedAgentProvider(\n provider: string | undefined\n): string {\n const normalized =\n provider\n ?.trim()\n .toLowerCase()\n .replace(/[_\\s]+/gu, \"-\") ?? \"\";\n switch (normalized) {\n case \"claude\":\n case \"claude-code\":\n return \"claude-code\";\n case \"nexight\":\n case \"tutti-doc\":\n case \"tutti-agent\":\n return \"tutti\";\n default:\n return normalized;\n }\n}\n","import claudeRoundedAssetUrl from \"./app/renderer/assets/icons/agents/claude-rounded.png\";\nimport codexRoundedAssetUrl from \"./app/renderer/assets/icons/agents/codex-rounded.png\";\nimport cursorColorfulAssetUrl from \"./app/renderer/assets/icons/agents/cursor-colorful.png\";\nimport cursorRoundedAssetUrl from \"./app/renderer/assets/icons/agents/cursor-rounded.png\";\nimport geminiRoundedAssetUrl from \"./app/renderer/assets/icons/agents/gemini-rounded.png\";\nimport hermesRoundedAssetUrl from \"./app/renderer/assets/icons/agents/hermes-rounded.png\";\nimport agentColorfulAssetUrl from \"./app/renderer/assets/icons/agents/agent-colorful.png\";\nimport manageAgentTuttiAssetUrl from \"./app/renderer/assets/icons/agents/manage-agent-tutti.png\";\nimport opencodeRoundedAssetUrl from \"./app/renderer/assets/icons/agents/opencode-rounded.png\";\nimport openclawRoundedAssetUrl from \"./app/renderer/assets/icons/agents/openclaw-rounded.png\";\nimport providerRailClaudeCodeColorfulAssetUrl from \"./app/renderer/assets/icons/agents/provider-rail-claude-code-colorful.png\";\nimport providerRailCodexColorfulAssetUrl from \"./app/renderer/assets/icons/agents/provider-rail-codex-colorful.png\";\nimport providerRailHermesColorfulAssetUrl from \"./app/renderer/assets/icons/agents/provider-rail-hermes-colorful.png\";\nimport providerRailOpenCodeColorfulAssetUrl from \"./app/renderer/assets/icons/agents/provider-rail-opencode-colorful.png\";\nimport providerRailTuttiAssetUrl from \"./app/renderer/assets/icons/agents/provider-rail-tutti.png\";\n\nexport const manageAgentClaudeCodeUrl = claudeRoundedAssetUrl;\nexport const manageAgentCodexUrl = codexRoundedAssetUrl;\nexport const manageAgentCursorUrl = cursorRoundedAssetUrl;\nexport const manageAgentGeminiUrl = geminiRoundedAssetUrl;\nexport const manageAgentHermesUrl = hermesRoundedAssetUrl;\nexport const manageAgentTuttiUrl = manageAgentTuttiAssetUrl;\nexport const manageAgentTuttiAgentUrl = manageAgentTuttiAssetUrl;\nexport const manageAgentOpenCodeUrl = opencodeRoundedAssetUrl;\nexport const manageAgentOpenclawUrl = openclawRoundedAssetUrl;\nexport const agentColorfulUrl = agentColorfulAssetUrl;\nexport const claudeRoundedUrl = claudeRoundedAssetUrl;\nexport const codexRoundedUrl = codexRoundedAssetUrl;\nexport const cursorColorfulUrl = cursorColorfulAssetUrl;\nexport const cursorRoundedUrl = cursorRoundedAssetUrl;\nexport const geminiRoundedUrl = geminiRoundedAssetUrl;\nexport const hermesRoundedUrl = hermesRoundedAssetUrl;\nexport const tuttiDocRoundedUrl = manageAgentTuttiAssetUrl;\nexport const tuttiAgentRoundedUrl = manageAgentTuttiAssetUrl;\nexport const opencodeRoundedUrl = opencodeRoundedAssetUrl;\nexport const openclawRoundedUrl = openclawRoundedAssetUrl;\nexport const providerRailClaudeCodeColorfulUrl =\n providerRailClaudeCodeColorfulAssetUrl;\nexport const providerRailCodexColorfulUrl = providerRailCodexColorfulAssetUrl;\nexport const providerRailHermesColorfulUrl = providerRailHermesColorfulAssetUrl;\nexport const providerRailOpenCodeColorfulUrl =\n providerRailOpenCodeColorfulAssetUrl;\nexport const providerRailTuttiUrl = providerRailTuttiAssetUrl;\n"],"mappings":";AAAO,SAAS,8BACd,UACQ;AACR,QAAM,aACJ,UACI,KAAK,EACN,YAAY,EACZ,QAAQ,YAAY,GAAG,KAAK;AACjC,UAAQ,YAAY;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACHO,IAAM,2BAA2B;AACjC,IAAM,sBAAsB;AAE5B,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAE5B,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAC/B,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,oCACX;AACK,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AACtC,IAAM,kCACX;AACK,IAAM,uBAAuB;","names":[]}
|