@tutti-os/agent-gui 0.0.233 → 0.0.234

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 (87) hide show
  1. package/README.md +49 -0
  2. package/dist/{AgentRichTextReadonly-U3XUJYCW.js → AgentRichTextReadonly-CCELQPHE.js} +5 -5
  3. package/dist/agent-conversation/index.d.ts +17 -4
  4. package/dist/agent-conversation/index.js +13 -9
  5. package/dist/agent-conversation/index.js.map +1 -1
  6. package/dist/agent-gui.d.ts +19 -3
  7. package/dist/agent-gui.js +22 -16
  8. package/dist/agent-message-center/index.d.ts +1 -1
  9. package/dist/agent-message-center/index.js +10 -7
  10. package/dist/agent-message-center/index.js.map +1 -1
  11. package/dist/{agentGuiNodeTypes-DW7T--Y8.d.ts → agentGuiNodeTypes-Dgl7kQHA.d.ts} +2 -2
  12. package/dist/agents.d.ts +1 -1
  13. package/dist/app/renderer/agentactivity.css +17 -0
  14. package/dist/{chunk-M6WEFXPL.js → chunk-2MCNNB2P.js} +2 -24
  15. package/dist/chunk-2MCNNB2P.js.map +1 -0
  16. package/dist/{chunk-CQFT3MI5.js → chunk-3YYI6RXA.js} +7 -5
  17. package/dist/{chunk-CQFT3MI5.js.map → chunk-3YYI6RXA.js.map} +1 -1
  18. package/dist/{chunk-EDP4D42H.js → chunk-45KN5Z5F.js} +877 -871
  19. package/dist/chunk-45KN5Z5F.js.map +1 -0
  20. package/dist/{chunk-T57ZZWTC.js → chunk-4HAG3FOY.js} +2 -2
  21. package/dist/{chunk-ZBI6R46N.js → chunk-5DN5N2XS.js} +2 -2
  22. package/dist/{chunk-BCBB4HOV.js → chunk-634MNSI5.js} +2 -2
  23. package/dist/chunk-A4KKC324.js +4768 -0
  24. package/dist/chunk-A4KKC324.js.map +1 -0
  25. package/dist/chunk-ALAGL6VL.js +48 -0
  26. package/dist/chunk-ALAGL6VL.js.map +1 -0
  27. package/dist/{chunk-2STAUA73.js → chunk-AYTUAZE3.js} +5 -2
  28. package/dist/chunk-AYTUAZE3.js.map +1 -0
  29. package/dist/{chunk-SWO67UWQ.js → chunk-CZOZBUIM.js} +7 -7
  30. package/dist/{chunk-SWO67UWQ.js.map → chunk-CZOZBUIM.js.map} +1 -1
  31. package/dist/{chunk-2L2LVSOD.js → chunk-EHNPHZE4.js} +881 -5812
  32. package/dist/chunk-EHNPHZE4.js.map +1 -0
  33. package/dist/{chunk-N5356722.js → chunk-EKQ7UX2B.js} +13 -319
  34. package/dist/chunk-EKQ7UX2B.js.map +1 -0
  35. package/dist/{chunk-ZXEICU6J.js → chunk-KK7YXPTS.js} +3 -1
  36. package/dist/chunk-KK7YXPTS.js.map +1 -0
  37. package/dist/{chunk-WGCDSA7P.js → chunk-MBM7PJIF.js} +27 -506
  38. package/dist/chunk-MBM7PJIF.js.map +1 -0
  39. package/dist/chunk-RMC2MGL4.js +557 -0
  40. package/dist/chunk-RMC2MGL4.js.map +1 -0
  41. package/dist/{chunk-JA6XAKKE.js → chunk-TWF6JXPC.js} +2 -2
  42. package/dist/{chunk-7AYFKNLD.js → chunk-TWMV6YTX.js} +4 -4
  43. package/dist/chunk-VV3YIU5W.js +25 -0
  44. package/dist/chunk-VV3YIU5W.js.map +1 -0
  45. package/dist/{chunk-GLVENTN6.js → chunk-WXLO33YP.js} +2 -2
  46. package/dist/chunk-XWPHTXEM.js +529 -0
  47. package/dist/chunk-XWPHTXEM.js.map +1 -0
  48. package/dist/chunk-YEXRTXTE.js +315 -0
  49. package/dist/chunk-YEXRTXTE.js.map +1 -0
  50. package/dist/{chunk-WMJDOMG6.js → chunk-ZELGKLW5.js} +4 -4
  51. package/dist/composer-projection.d.ts +37 -0
  52. package/dist/composer-projection.js +21 -0
  53. package/dist/composer-projection.js.map +1 -0
  54. package/dist/context-mention-palette/index.js +9 -7
  55. package/dist/conversation-projection.d.ts +551 -0
  56. package/dist/conversation-projection.js +42 -0
  57. package/dist/conversation-projection.js.map +1 -0
  58. package/dist/conversation-rail-projection.js +3 -3
  59. package/dist/i18n/index.d.ts +2 -0
  60. package/dist/i18n/index.js +2 -2
  61. package/dist/index.d.ts +32 -13
  62. package/dist/index.js +22 -16
  63. package/dist/index.js.map +1 -1
  64. package/dist/mention-search.js +7 -5
  65. package/dist/{types-CHAMK2g7.d.ts → types-DtXXsISB.d.ts} +1 -1
  66. package/dist/workbench/contribution.js +4 -4
  67. package/dist/workbench/index.js +4 -4
  68. package/dist/workbench/sessionTitle.js +3 -3
  69. package/dist/workspace-agent-generated-files.d.ts +1 -12
  70. package/dist/workspaceAgentActivityListTypes-BUKNyMbh.d.ts +48 -0
  71. package/dist/{workspaceLinkActions-CzsbvGmC.d.ts → workspaceLinkActions-DxyzMy10.d.ts} +13 -12
  72. package/package.json +31 -17
  73. package/dist/chunk-2L2LVSOD.js.map +0 -1
  74. package/dist/chunk-2STAUA73.js.map +0 -1
  75. package/dist/chunk-EDP4D42H.js.map +0 -1
  76. package/dist/chunk-M6WEFXPL.js.map +0 -1
  77. package/dist/chunk-N5356722.js.map +0 -1
  78. package/dist/chunk-WGCDSA7P.js.map +0 -1
  79. package/dist/chunk-ZXEICU6J.js.map +0 -1
  80. /package/dist/{AgentRichTextReadonly-U3XUJYCW.js.map → AgentRichTextReadonly-CCELQPHE.js.map} +0 -0
  81. /package/dist/{chunk-T57ZZWTC.js.map → chunk-4HAG3FOY.js.map} +0 -0
  82. /package/dist/{chunk-ZBI6R46N.js.map → chunk-5DN5N2XS.js.map} +0 -0
  83. /package/dist/{chunk-BCBB4HOV.js.map → chunk-634MNSI5.js.map} +0 -0
  84. /package/dist/{chunk-JA6XAKKE.js.map → chunk-TWF6JXPC.js.map} +0 -0
  85. /package/dist/{chunk-7AYFKNLD.js.map → chunk-TWMV6YTX.js.map} +0 -0
  86. /package/dist/{chunk-GLVENTN6.js.map → chunk-WXLO33YP.js.map} +0 -0
  87. /package/dist/{chunk-WMJDOMG6.js.map → chunk-ZELGKLW5.js.map} +0 -0
@@ -0,0 +1,315 @@
1
+ import {
2
+ changedFilesForSession,
3
+ workspaceAgentSessionMessageAliases
4
+ } from "./chunk-VMPA46ET.js";
5
+ import {
6
+ resolveWorkspaceAgentSessionSortTimeUnixMs
7
+ } from "./chunk-YMXYBG7U.js";
8
+ import {
9
+ isWorkspaceAgentSyntheticControlMessage
10
+ } from "./chunk-XJ34OIEQ.js";
11
+ import {
12
+ workspaceAgentProviderLabel
13
+ } from "./chunk-VV3YIU5W.js";
14
+ import {
15
+ translate,
16
+ translateInUiLanguage
17
+ } from "./chunk-WXLO33YP.js";
18
+ import {
19
+ normalizeAgentTitleText
20
+ } from "./chunk-MIJXEELH.js";
21
+
22
+ // shared/workspaceAgentActivityStatus.ts
23
+ function resolveWorkspaceAgentActivityStatus(session) {
24
+ const normalized = canonicalSessionStatus(session);
25
+ switch (normalized) {
26
+ case "failed":
27
+ return "failed";
28
+ case "canceled":
29
+ return "canceled";
30
+ case "completed":
31
+ return "completed";
32
+ case "waiting":
33
+ return "waiting";
34
+ case "working":
35
+ return "working";
36
+ default:
37
+ return "idle";
38
+ }
39
+ }
40
+ function canonicalSessionStatus(session) {
41
+ if ((session.pendingInteractions?.length ?? 0) > 0) return "waiting";
42
+ if (session.activeTurn && session.activeTurn.phase !== "settled") {
43
+ return session.activeTurn.phase === "waiting" ? "waiting" : "working";
44
+ }
45
+ switch (session.latestTurn?.outcome) {
46
+ case "completed":
47
+ return "completed";
48
+ case "failed":
49
+ return "failed";
50
+ case "canceled":
51
+ case "interrupted":
52
+ return "canceled";
53
+ default:
54
+ return "idle";
55
+ }
56
+ }
57
+
58
+ // shared/workspaceAgentLatestActivitySummary.ts
59
+ function fallbackSummary(status) {
60
+ switch (status) {
61
+ case "working":
62
+ return translate("agentHost.workspaceAgentActivityStatusWorking");
63
+ case "waiting":
64
+ return translate("agentHost.workspaceAgentActivityStatusWaiting");
65
+ case "idle":
66
+ return translate("agentHost.workspaceAgentActivityStatusIdle");
67
+ case "canceled":
68
+ case "completed":
69
+ return translate("agentHost.workspaceAgentActivityStatusEnd");
70
+ case "failed":
71
+ return translate("agentHost.workspaceAgentActivityStatusFailed");
72
+ }
73
+ }
74
+ function isWorkspaceAgentUntitledConversation(title) {
75
+ return localizedWorkspaceAgentLabelSet(
76
+ "agentHost.workspaceAgentsUntitledConversation"
77
+ ).has(compactText(title));
78
+ }
79
+ function compactText(value) {
80
+ return value.trim().replace(/\s+/g, " ");
81
+ }
82
+ function localizedWorkspaceAgentLabelSet(key) {
83
+ return new Set(
84
+ ["en", "zh-CN"].map((language) => compactText(translateInUiLanguage(language, key))).filter(Boolean)
85
+ );
86
+ }
87
+
88
+ // shared/workspaceAgentActivitySummary.ts
89
+ function resolveWorkspaceAgentActivityTitle(session) {
90
+ return session.title.trim() || workspaceAgentUntitledConversationLabel();
91
+ }
92
+ function resolveLatestActivity(messages, status, actors) {
93
+ const latestMessage = latestDisplayableMessage(messages);
94
+ if (latestMessage) {
95
+ return {
96
+ actorName: messageRole(latestMessage.message) === "user" ? actors.userName : actors.agentName,
97
+ summary: latestMessage.text
98
+ };
99
+ }
100
+ return {
101
+ actorName: actors.agentName,
102
+ summary: fallbackSummary(status)
103
+ };
104
+ }
105
+ function latestDisplayableMessage(messages) {
106
+ return messages.map((message) => ({
107
+ message,
108
+ text: messageDisplayText(message),
109
+ time: messageTime(message)
110
+ })).filter(
111
+ (item) => item.text.length > 0 && normalizeToken(item.message.kind) !== "tool_call"
112
+ ).sort((left, right) => {
113
+ const timeDiff = (right.time ?? 0) - (left.time ?? 0);
114
+ if (timeDiff !== 0) {
115
+ return timeDiff;
116
+ }
117
+ return right.message.messageId.localeCompare(left.message.messageId);
118
+ })[0] ?? null;
119
+ }
120
+ function messageDisplayText(message) {
121
+ const payload = message.payload ?? {};
122
+ const text = normalizeAgentTitleText(
123
+ compactText2(
124
+ stringValue(payload.displayPrompt) || stringValue(payload.text) || stringValue(payload.content) || stringValue(payload.message) || stringValue(payload.body) || stringValue(payload.title) || ""
125
+ )
126
+ );
127
+ return isWorkspaceAgentSyntheticControlMessage(text) ? "" : text;
128
+ }
129
+ function messageRole(message) {
130
+ return normalizeToken(message.role);
131
+ }
132
+ function messageTime(message) {
133
+ return message.occurredAtUnixMs ?? message.completedAtUnixMs ?? message.startedAtUnixMs;
134
+ }
135
+ function normalizeToken(value) {
136
+ return value?.trim().toLowerCase() ?? "";
137
+ }
138
+ function compactText2(value) {
139
+ return value.replace(/\s+/g, " ").trim();
140
+ }
141
+ function workspaceAgentUntitledConversationLabel() {
142
+ return normalizeAgentTitleText(
143
+ translate("agentHost.workspaceAgentsUntitledConversation")
144
+ );
145
+ }
146
+ function stringValue(value) {
147
+ return typeof value === "string" && value.trim() ? value.trim() : null;
148
+ }
149
+
150
+ // shared/workspaceAgentSessionTitle.ts
151
+ function resolveDisplayableWorkspaceAgentSessionTitle(session) {
152
+ const title = session.title.trim();
153
+ if (!title || isWorkspaceAgentUntitledConversation(title) || isWorkspaceAgentSyntheticControlMessage(title)) {
154
+ return "";
155
+ }
156
+ const provider = session.provider?.trim();
157
+ if (provider && workspaceAgentProviderLabel(provider).toLowerCase() === title.toLowerCase()) {
158
+ return "";
159
+ }
160
+ return title;
161
+ }
162
+
163
+ // shared/workspaceAgentActivityListProjection.ts
164
+ import { selectRootAgentActivitySessions } from "@tutti-os/agent-activity-core";
165
+
166
+ // shared/workspaceAgentActivityListOrdering.ts
167
+ function shouldHideEmptyRuntimePlaceholderSession(session, messages, status, options) {
168
+ if (messages.length > 0) {
169
+ return false;
170
+ }
171
+ if (!hasLoadedSessionMessageRecord(session, options.sessionMessagesById)) {
172
+ return false;
173
+ }
174
+ if (!isRuntimePlaceholderTerminalStatus(status)) {
175
+ return false;
176
+ }
177
+ return resolveDisplayableWorkspaceAgentSessionTitle(session) === "";
178
+ }
179
+ function hasLoadedSessionMessageRecord(session, sessionMessagesById) {
180
+ if (!sessionMessagesById) {
181
+ return false;
182
+ }
183
+ return workspaceAgentSessionMessageAliases(session).some(
184
+ (alias) => alias in sessionMessagesById
185
+ );
186
+ }
187
+ function isRuntimePlaceholderTerminalStatus(status) {
188
+ return status === "idle" || status === "completed" || status === "canceled";
189
+ }
190
+ function compareActivities(left, right) {
191
+ const timeDiff = right.sortTimeUnixMs - left.sortTimeUnixMs;
192
+ if (timeDiff !== 0) {
193
+ return timeDiff;
194
+ }
195
+ return left.sessionId.localeCompare(right.sessionId);
196
+ }
197
+
198
+ // shared/workspaceAgentActivityListProjection.ts
199
+ function buildWorkspaceAgentActivityListViewModel(snapshot, options = {}) {
200
+ const activities = selectRootAgentActivitySessions(snapshot).map((session) => {
201
+ const presence = snapshot.presences.find(
202
+ (candidate) => candidate.provider === session.provider && Boolean(candidate.userId) && candidate.userId === session.userId
203
+ ) ?? null;
204
+ const messages = resolveWorkspaceAgentSessionMessages(
205
+ options.sessionMessagesById,
206
+ session
207
+ );
208
+ const status = resolveWorkspaceAgentActivityStatus(session);
209
+ if (shouldHideEmptyRuntimePlaceholderSession(
210
+ session,
211
+ messages,
212
+ status,
213
+ options
214
+ )) {
215
+ return null;
216
+ }
217
+ const user = resolveActivityUser(session, presence, options);
218
+ const agentProvider = resolveProvider(session, presence);
219
+ const agentName = workspaceAgentProviderLabel(agentProvider);
220
+ const resolvedSortTimeUnixMs = resolveWorkspaceAgentSessionSortTimeUnixMs(session);
221
+ const latestActivity = resolveLatestActivity(messages, status, {
222
+ agentName,
223
+ userName: user.userName
224
+ });
225
+ const activity = {
226
+ id: `activity-${session.agentSessionId}`,
227
+ sessionId: session.agentSessionId,
228
+ userId: user.userId,
229
+ userName: user.userName,
230
+ ...user.userAvatarUrl ? { userAvatarUrl: user.userAvatarUrl } : {},
231
+ agentProvider,
232
+ agentName,
233
+ title: resolveWorkspaceAgentActivityTitle(session),
234
+ status,
235
+ latestActivitySummary: latestActivity.summary,
236
+ latestActivityActorName: latestActivity.actorName,
237
+ changedFiles: changedFilesForSession(messages),
238
+ sortTimeUnixMs: resolvedSortTimeUnixMs,
239
+ readTimeUnixMs: readTimeUnixMs(session, status, resolvedSortTimeUnixMs)
240
+ };
241
+ return activity;
242
+ }).filter(
243
+ (activity) => activity !== null
244
+ ).sort(compareActivities);
245
+ return { activities };
246
+ }
247
+ function resolveWorkspaceAgentSessionMessages(sessionMessagesById, session) {
248
+ if (!sessionMessagesById) {
249
+ return [];
250
+ }
251
+ for (const alias of workspaceAgentSessionMessageAliases(session)) {
252
+ const messages = sessionMessagesById[alias];
253
+ if (messages) {
254
+ return messages;
255
+ }
256
+ }
257
+ return [];
258
+ }
259
+ function resolveActivityUser(session, presence, options) {
260
+ if (presence) {
261
+ return resolveUserFromId(presence.userId ?? "", options);
262
+ }
263
+ const sessionUserId = session.userId?.trim() ?? "";
264
+ if (sessionUserId) {
265
+ return resolveUserFromId(sessionUserId, options);
266
+ }
267
+ return {
268
+ userId: null,
269
+ userName: "Unknown member"
270
+ };
271
+ }
272
+ function resolveUserFromId(rawUserId, options) {
273
+ const userId = rawUserId.trim();
274
+ const profile = options.userProfilesById?.[userId];
275
+ const profileName = compactText3(profile?.name ?? "");
276
+ const profileAvatar = profile?.avatar?.trim();
277
+ const rawName = profileName || userId || "Unknown member";
278
+ return {
279
+ userId,
280
+ userName: stripTrailingParentheticalEmailFromLabel(rawName) || rawName,
281
+ ...profileAvatar ? { userAvatarUrl: profileAvatar } : {}
282
+ };
283
+ }
284
+ function resolveProvider(session, presence) {
285
+ const sessionProvider = normalizeProvider(session.provider);
286
+ if (sessionProvider) {
287
+ return sessionProvider;
288
+ }
289
+ const presenceProvider = normalizeProvider(presence?.provider);
290
+ if (presenceProvider) {
291
+ return presenceProvider;
292
+ }
293
+ return "unknown";
294
+ }
295
+ function normalizeProvider(provider) {
296
+ const trimmed = provider?.trim();
297
+ return trimmed ? trimmed.toLowerCase() : null;
298
+ }
299
+ function readTimeUnixMs(session, status, fallbackUnixMs) {
300
+ if (status === "completed" || status === "failed") {
301
+ return session.endedAtUnixMs ?? session.updatedAtUnixMs ?? fallbackUnixMs;
302
+ }
303
+ return fallbackUnixMs;
304
+ }
305
+ function stripTrailingParentheticalEmailFromLabel(label) {
306
+ return label.trim().replace(/\s*\([^)]*@[^)]+\)\s*$/u, "").trim();
307
+ }
308
+ function compactText3(value) {
309
+ return value.replace(/\s+/g, " ").trim();
310
+ }
311
+
312
+ export {
313
+ buildWorkspaceAgentActivityListViewModel
314
+ };
315
+ //# sourceMappingURL=chunk-YEXRTXTE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/workspaceAgentActivityStatus.ts","../shared/workspaceAgentLatestActivitySummary.ts","../shared/workspaceAgentActivitySummary.ts","../shared/workspaceAgentSessionTitle.ts","../shared/workspaceAgentActivityListProjection.ts","../shared/workspaceAgentActivityListOrdering.ts"],"sourcesContent":["import { type AgentActivitySession } from \"@tutti-os/agent-activity-core\";\nimport type { WorkspaceAgentActivityStatus } from \"./workspaceAgentActivityListTypes\";\n\nexport function resolveWorkspaceAgentActivityStatus(\n session: AgentActivitySession\n): WorkspaceAgentActivityStatus {\n const normalized = canonicalSessionStatus(session);\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\nfunction canonicalSessionStatus(\n session: AgentActivitySession\n): WorkspaceAgentActivityStatus {\n if ((session.pendingInteractions?.length ?? 0) > 0) return \"waiting\";\n if (session.activeTurn && session.activeTurn.phase !== \"settled\") {\n return session.activeTurn.phase === \"waiting\" ? \"waiting\" : \"working\";\n }\n switch (session.latestTurn?.outcome) {\n case \"completed\":\n return \"completed\";\n case \"failed\":\n return \"failed\";\n case \"canceled\":\n case \"interrupted\":\n return \"canceled\";\n default:\n return \"idle\";\n }\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentTimelineTypes\";\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 workspaceAgentUntitledConversationLabel()\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 isWorkspaceAgentUntitledConversation(title: string): boolean {\n return localizedWorkspaceAgentLabelSet(\n \"agentHost.workspaceAgentsUntitledConversation\"\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 workspaceAgentUntitledConversationLabel(): string {\n return translate(\"agentHost.workspaceAgentsUntitledConversation\");\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 type {\n AgentActivityMessage,\n AgentActivitySession\n} from \"@tutti-os/agent-activity-core\";\nimport { translate } from \"../i18n/index\";\nimport { normalizeAgentTitleText } from \"./utils/agentTitleText\";\nimport { fallbackSummary } from \"./workspaceAgentLatestActivitySummary\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\nimport type { WorkspaceAgentActivityStatus } from \"./workspaceAgentActivityListTypes\";\n\nexport function resolveWorkspaceAgentActivityTitle(\n session: AgentActivitySession\n): string {\n return session.title.trim() || workspaceAgentUntitledConversationLabel();\n}\n\nexport function resolveLatestActivity(\n messages: readonly AgentActivityMessage[],\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\nfunction latestDisplayableMessage(messages: readonly AgentActivityMessage[]): {\n message: AgentActivityMessage;\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 right.message.messageId.localeCompare(left.message.messageId);\n })[0] ?? null\n );\n}\n\nfunction messageDisplayText(message: AgentActivityMessage): 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: AgentActivityMessage): string {\n return normalizeToken(message.role);\n}\n\nfunction messageTime(message: AgentActivityMessage): 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 compactText(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction workspaceAgentUntitledConversationLabel(): string {\n return normalizeAgentTitleText(\n translate(\"agentHost.workspaceAgentsUntitledConversation\")\n );\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n","import type { AgentActivitySession } from \"@tutti-os/agent-activity-core\";\nimport { isWorkspaceAgentUntitledConversation } from \"./workspaceAgentLatestActivitySummary\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\n\nexport function resolveDisplayableWorkspaceAgentSessionTitle(\n session: Pick<AgentActivitySession, \"title\" | \"provider\">\n): string {\n const title = session.title.trim();\n if (\n !title ||\n isWorkspaceAgentUntitledConversation(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","import type {\n AgentActivityMessage,\n AgentActivityPresence,\n AgentActivitySession\n} from \"@tutti-os/agent-activity-core\";\nimport { selectRootAgentActivitySessions } from \"@tutti-os/agent-activity-core\";\nimport { resolveWorkspaceAgentSessionSortTimeUnixMs } from \"./workspaceAgentSessionSortTime\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport {\n type BuildWorkspaceAgentActivityListOptions,\n type WorkspaceAgentActivityCard,\n type WorkspaceAgentActivityListViewModel,\n type WorkspaceAgentActivityListSnapshot,\n type WorkspaceAgentActivityStatus\n} from \"./workspaceAgentActivityListTypes\";\nimport { changedFilesForSession } from \"./workspaceAgentGeneratedFiles\";\nimport { resolveWorkspaceAgentActivityStatus } from \"./workspaceAgentActivityStatus\";\nimport {\n resolveLatestActivity,\n resolveWorkspaceAgentActivityTitle\n} from \"./workspaceAgentActivitySummary\";\nimport {\n compareActivities,\n shouldHideEmptyRuntimePlaceholderSession,\n workspaceAgentSessionMessageAliases\n} from \"./workspaceAgentActivityListOrdering\";\n\nexport function buildWorkspaceAgentActivityListViewModel(\n snapshot: WorkspaceAgentActivityListSnapshot,\n options: BuildWorkspaceAgentActivityListOptions = {}\n): WorkspaceAgentActivityListViewModel {\n const activities = selectRootAgentActivitySessions(snapshot)\n .map((session): WorkspaceAgentActivityCard | null => {\n const presence =\n snapshot.presences.find(\n (candidate) =>\n candidate.provider === session.provider &&\n Boolean(candidate.userId) &&\n candidate.userId === session.userId\n ) ?? null;\n const messages = resolveWorkspaceAgentSessionMessages(\n options.sessionMessagesById,\n session\n );\n const status = resolveWorkspaceAgentActivityStatus(session);\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 =\n resolveWorkspaceAgentSessionSortTimeUnixMs(session);\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),\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 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: Record<string, AgentActivityMessage[]> | undefined,\n session: AgentActivitySession\n): AgentActivityMessage[] {\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: AgentActivitySession,\n presence: AgentActivityPresence | 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 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 resolveProvider(\n session: AgentActivitySession,\n presence: AgentActivityPresence | 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\nfunction readTimeUnixMs(\n session: AgentActivitySession,\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 stripTrailingParentheticalEmailFromLabel(label: string): string {\n return label\n .trim()\n .replace(/\\s*\\([^)]*@[^)]+\\)\\s*$/u, \"\")\n .trim();\n}\n\nfunction compactText(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n","import type {\n AgentActivityMessage,\n AgentActivitySession\n} from \"@tutti-os/agent-activity-core\";\nimport { resolveDisplayableWorkspaceAgentSessionTitle } from \"./workspaceAgentSessionTitle\";\nimport { workspaceAgentSessionMessageAliases } from \"./workspaceAgentSessionMessageAliases.ts\";\nexport { workspaceAgentSessionMessageAliases } from \"./workspaceAgentSessionMessageAliases.ts\";\nimport type {\n BuildWorkspaceAgentActivityListOptions,\n WorkspaceAgentActivityCard,\n WorkspaceAgentActivityStatus\n} from \"./workspaceAgentActivityListTypes\";\n\nexport function shouldHideEmptyRuntimePlaceholderSession(\n session: AgentActivitySession,\n messages: readonly AgentActivityMessage[],\n status: WorkspaceAgentActivityStatus,\n options: BuildWorkspaceAgentActivityListOptions\n): boolean {\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: AgentActivitySession,\n sessionMessagesById: Record<string, AgentActivityMessage[]> | 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\nexport function 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\n/** Remove trailing ` (user@host...)` that some APIs pack into names. */\n"],"mappings":"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","names":["compactText","compactText"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  userAvatarPlaceholderUrl,
3
3
  workspaceAgentActivityStatusLabel
4
- } from "./chunk-BCBB4HOV.js";
4
+ } from "./chunk-634MNSI5.js";
5
5
  import {
6
6
  AGENT_MENTION_FILTER_TAB_ORDER,
7
7
  agentGeneratedMentionItemKey,
@@ -9,7 +9,7 @@ import {
9
9
  agentMentionFilterLabel,
10
10
  agentMentionGroupLabel,
11
11
  mentionGroupExpandCount
12
- } from "./chunk-N5356722.js";
12
+ } from "./chunk-EKQ7UX2B.js";
13
13
  import {
14
14
  resolveAgentMentionFileThumbnailUrl,
15
15
  resolveAgentMentionFileVisualKind
@@ -19,7 +19,7 @@ import {
19
19
  } from "./chunk-3X5VDG6T.js";
20
20
  import {
21
21
  translate
22
- } from "./chunk-GLVENTN6.js";
22
+ } from "./chunk-WXLO33YP.js";
23
23
 
24
24
  // agent-gui/agentGuiNode/AgentFileMentionPalette.tsx
25
25
  import {
@@ -522,4 +522,4 @@ export {
522
522
  AgentFileMentionPalette,
523
523
  AgentContextMentionPalette
524
524
  };
525
- //# sourceMappingURL=chunk-WMJDOMG6.js.map
525
+ //# sourceMappingURL=chunk-ZELGKLW5.js.map
@@ -0,0 +1,37 @@
1
+ import { AgentActivityComposerOptions, AgentActivitySessionCapabilities, AgentActivitySessionSettings, AgentActivitySession } from '@tutti-os/agent-activity-core';
2
+
3
+ interface AgentComposerSettingsSupport {
4
+ model: boolean;
5
+ reasoning: boolean;
6
+ speed: boolean;
7
+ permission: boolean;
8
+ plan: boolean;
9
+ browser: boolean;
10
+ computer: boolean;
11
+ planImplementation: boolean;
12
+ permissionModeChangeDuringTurn: boolean;
13
+ permissionModeChangeDeferred: boolean;
14
+ modelSwitch: boolean;
15
+ }
16
+ declare function composerSettingsSupportFromOptions(composerOptions: AgentActivityComposerOptions | null, sessionCapabilities: Partial<AgentActivitySessionCapabilities> | null): AgentComposerSettingsSupport;
17
+
18
+ /**
19
+ * DOM-free Composer projections for alternate renderers such as Mobile.
20
+ *
21
+ * The workspace engine remains the owner of option loading and settings
22
+ * commands. Consumers receive canonical activity-core data and retain only
23
+ * their local visual controls and disclosure state.
24
+ */
25
+
26
+ /**
27
+ * Resolves the settings that a renderer should present without copying
28
+ * provider defaults into a Mobile-specific model. Session facts win; a
29
+ * pre-session composer uses the daemon-projected effective defaults.
30
+ */
31
+ declare function resolvePresentedAgentComposerSettings(input: {
32
+ composerOptions: AgentActivityComposerOptions | null;
33
+ settings?: AgentActivitySessionSettings | null;
34
+ session: Pick<AgentActivitySession, "settings"> | null;
35
+ }): AgentActivitySessionSettings;
36
+
37
+ export { type AgentComposerSettingsSupport, composerSettingsSupportFromOptions, resolvePresentedAgentComposerSettings };
@@ -0,0 +1,21 @@
1
+ import {
2
+ composerSettingsSupportFromOptions
3
+ } from "./chunk-ALAGL6VL.js";
4
+
5
+ // composerProjection.ts
6
+ function resolvePresentedAgentComposerSettings(input) {
7
+ const defaults = input.composerOptions?.effectiveSettings;
8
+ const sessionSettings = input.session?.settings ?? input.settings;
9
+ return {
10
+ model: sessionSettings?.model ?? defaults?.model ?? null,
11
+ permissionModeId: sessionSettings?.permissionModeId ?? defaults?.permissionModeId ?? null,
12
+ planMode: sessionSettings?.planMode ?? defaults?.planMode ?? null,
13
+ reasoningEffort: sessionSettings?.reasoningEffort ?? defaults?.reasoningEffort ?? null,
14
+ speed: sessionSettings?.speed ?? defaults?.speed ?? null
15
+ };
16
+ }
17
+ export {
18
+ composerSettingsSupportFromOptions,
19
+ resolvePresentedAgentComposerSettings
20
+ };
21
+ //# sourceMappingURL=composer-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../composerProjection.ts"],"sourcesContent":["/**\n * DOM-free Composer projections for alternate renderers such as Mobile.\n *\n * The workspace engine remains the owner of option loading and settings\n * commands. Consumers receive canonical activity-core data and retain only\n * their local visual controls and disclosure state.\n */\nimport type {\n AgentActivityComposerOptions,\n AgentActivitySession,\n AgentActivitySessionSettings\n} from \"@tutti-os/agent-activity-core\";\n\nexport {\n composerSettingsSupportFromOptions,\n type AgentComposerSettingsSupport\n} from \"./agent-gui/agentGuiNode/model/composerSettingsSupport.ts\";\n\n/**\n * Resolves the settings that a renderer should present without copying\n * provider defaults into a Mobile-specific model. Session facts win; a\n * pre-session composer uses the daemon-projected effective defaults.\n */\nexport function resolvePresentedAgentComposerSettings(input: {\n composerOptions: AgentActivityComposerOptions | null;\n settings?: AgentActivitySessionSettings | null;\n session: Pick<AgentActivitySession, \"settings\"> | null;\n}): AgentActivitySessionSettings {\n const defaults = input.composerOptions?.effectiveSettings;\n const sessionSettings = input.session?.settings ?? input.settings;\n return {\n model: sessionSettings?.model ?? defaults?.model ?? null,\n permissionModeId:\n sessionSettings?.permissionModeId ?? defaults?.permissionModeId ?? null,\n planMode: sessionSettings?.planMode ?? defaults?.planMode ?? null,\n reasoningEffort:\n sessionSettings?.reasoningEffort ?? defaults?.reasoningEffort ?? null,\n speed: sessionSettings?.speed ?? defaults?.speed ?? null\n };\n}\n"],"mappings":";;;;;AAuBO,SAAS,sCAAsC,OAIrB;AAC/B,QAAM,WAAW,MAAM,iBAAiB;AACxC,QAAM,kBAAkB,MAAM,SAAS,YAAY,MAAM;AACzD,SAAO;AAAA,IACL,OAAO,iBAAiB,SAAS,UAAU,SAAS;AAAA,IACpD,kBACE,iBAAiB,oBAAoB,UAAU,oBAAoB;AAAA,IACrE,UAAU,iBAAiB,YAAY,UAAU,YAAY;AAAA,IAC7D,iBACE,iBAAiB,mBAAmB,UAAU,mBAAmB;AAAA,IACnE,OAAO,iBAAiB,SAAS,UAAU,SAAS;AAAA,EACtD;AACF;","names":[]}
@@ -3,25 +3,27 @@ import {
3
3
  AgentFileMentionPalette,
4
4
  flattenAgentMentionPaletteEntries,
5
5
  groupStartKeys
6
- } from "../chunk-WMJDOMG6.js";
7
- import "../chunk-BCBB4HOV.js";
6
+ } from "../chunk-ZELGKLW5.js";
7
+ import "../chunk-634MNSI5.js";
8
8
  import {
9
9
  AgentMentionSearchController
10
- } from "../chunk-N5356722.js";
10
+ } from "../chunk-EKQ7UX2B.js";
11
+ import "../chunk-YEXRTXTE.js";
11
12
  import "../chunk-VMPA46ET.js";
12
13
  import "../chunk-YMXYBG7U.js";
13
14
  import "../chunk-XJ34OIEQ.js";
14
- import "../chunk-SWO67UWQ.js";
15
+ import "../chunk-CZOZBUIM.js";
15
16
  import "../chunk-JDVP33S5.js";
16
17
  import "../chunk-3V5OCA2M.js";
17
- import "../chunk-M6WEFXPL.js";
18
+ import "../chunk-2MCNNB2P.js";
19
+ import "../chunk-VV3YIU5W.js";
18
20
  import "../chunk-3X5VDG6T.js";
19
21
  import "../chunk-F5UR6EJG.js";
20
- import "../chunk-GLVENTN6.js";
22
+ import "../chunk-WXLO33YP.js";
21
23
  import "../chunk-5BJYO6X3.js";
22
24
  import "../chunk-AFUVWWQY.js";
23
25
  import "../chunk-MIJXEELH.js";
24
- import "../chunk-ZXEICU6J.js";
26
+ import "../chunk-KK7YXPTS.js";
25
27
  import {
26
28
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
27
29
  } from "../chunk-RMQREVJY.js";