@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,557 @@
1
+ import {
2
+ buildCanonicalWorkspaceAgentDetailView,
3
+ normalizeAgentApprovalOptions,
4
+ projectAgentConversationVM,
5
+ resolveWorkspaceAgentNoticeCommandSemantics
6
+ } from "./chunk-A4KKC324.js";
7
+ import {
8
+ extractExitPlanKeepPlanningOptionId,
9
+ extractExitPlanModeOptions,
10
+ normalizeAgentApprovalPurpose,
11
+ normalizeAskUserQuestions
12
+ } from "./chunk-XWPHTXEM.js";
13
+ import {
14
+ buildWorkspaceAgentActivityListViewModel
15
+ } from "./chunk-YEXRTXTE.js";
16
+
17
+ // shared/agentConversation/projection/workspaceAgentMessageProjection.ts
18
+ function projectAgentActivitySessionToConversationVM({
19
+ activitySnapshot,
20
+ agentSessionId,
21
+ sessionTurns,
22
+ workspaceRoot
23
+ }) {
24
+ const session = activitySnapshot.sessions.find(
25
+ (candidate) => candidate.agentSessionId === agentSessionId
26
+ ) ?? null;
27
+ if (!session) return null;
28
+ const messages = activitySnapshot.sessionMessagesById[agentSessionId] ?? [];
29
+ const activity = buildWorkspaceAgentActivityListViewModel(activitySnapshot, {
30
+ sessionMessagesById: activitySnapshot.sessionMessagesById
31
+ }).activities.find(
32
+ (candidate) => candidate.sessionId === session.agentSessionId
33
+ ) ?? null;
34
+ if (!activity) return null;
35
+ return projectWorkspaceAgentMessagesToConversationVM({
36
+ activity,
37
+ messages,
38
+ session,
39
+ sessionTurns,
40
+ workspaceRoot
41
+ });
42
+ }
43
+ function projectWorkspaceAgentMessagesToConversationVM(input, options = {}) {
44
+ const { messages, ...detailInput } = input;
45
+ const timelineItems = projectWorkspaceAgentMessagesToTimelineItems(messages);
46
+ const detail = buildCanonicalWorkspaceAgentDetailView({
47
+ ...detailInput,
48
+ sessionTurns: detailInput.sessionTurns?.filter(
49
+ (turn) => turn.agentSessionId === detailInput.session.agentSessionId
50
+ ),
51
+ timelineItems
52
+ });
53
+ return projectAgentConversationVM(detail, options);
54
+ }
55
+ var tuttiPlanIssueDispatchTriggerPrefix = "issue:tutti-mode-plan-";
56
+ function isTuttiPlanIssueDispatchCollaboration(message) {
57
+ if (message.kind?.trim() !== "collaboration") {
58
+ return false;
59
+ }
60
+ const triggerReason = message.payload?.triggerReason;
61
+ return typeof triggerReason === "string" && triggerReason.startsWith(tuttiPlanIssueDispatchTriggerPrefix);
62
+ }
63
+ function projectWorkspaceAgentMessagesToTimelineItems(messages) {
64
+ const sortedMessages = latestMessageSnapshots(messages).filter((message) => !isTuttiPlanIssueDispatchCollaboration(message)).sort(compareMessagesByDisplayOrder);
65
+ const mergedToolPayloadByKey = /* @__PURE__ */ new Map();
66
+ return sortedMessages.map((message, index) => {
67
+ const kind = normalizeToken(message.kind);
68
+ const role = normalizeToken(message.role);
69
+ const payload = normalizedPayload(message.payload);
70
+ const goalControlAudit = isGoalControlAudit(message);
71
+ const id = normalizedMessageId(message.version, index);
72
+ const seq = index + 1;
73
+ const eventId = goalControlAudit ? firstNonEmptyString(
74
+ stringValue(payload.messageId),
75
+ message.messageId,
76
+ `message:${id}`
77
+ ) : message.messageId.trim() || `message:${id}`;
78
+ const turnId = message.turnId?.trim() || void 0;
79
+ const occurredAtUnixMs = messageDisplayOrderTime(message);
80
+ if (goalControlAudit) {
81
+ return messageTimelineItem({
82
+ message,
83
+ id,
84
+ seq,
85
+ eventId,
86
+ actorType: "user",
87
+ itemType: "goal.control",
88
+ role: "user",
89
+ content: messageText(message),
90
+ occurredAtUnixMs
91
+ });
92
+ }
93
+ if (kind === "tool_call") {
94
+ const callId = firstNonEmptyString(
95
+ messagePayloadString(message, "callId"),
96
+ message.messageId
97
+ );
98
+ const title = messagePayloadString(message, "title");
99
+ const toolKey = callId || eventId;
100
+ const payloadToolName = displayToolNameCandidate(
101
+ stringValue(payload.toolName),
102
+ callId
103
+ );
104
+ const titleToolName = displayToolNameCandidate(title, callId);
105
+ const toolName = firstNonEmptyString(payloadToolName, titleToolName);
106
+ const toolPayload = sanitizedToolPayload(payload, callId);
107
+ const mergedPayload = mergePayload(mergedToolPayloadByKey.get(toolKey), {
108
+ ...toolPayload,
109
+ ...toolName ? { toolName } : {},
110
+ ...message.status?.trim() ? { status: message.status.trim() } : {}
111
+ });
112
+ mergedToolPayloadByKey.set(toolKey, mergedPayload);
113
+ const callType = firstNonEmptyString(stringValue(mergedPayload.callType)) || "tool";
114
+ const workspaceId = workspaceIdFromMessage(message);
115
+ return {
116
+ id,
117
+ ...workspaceTimelineFields(workspaceId),
118
+ agentSessionId: message.agentSessionId,
119
+ seq,
120
+ ...turnId ? { turnId } : {},
121
+ eventId,
122
+ actorType: "agent",
123
+ actorId: message.agentSessionId,
124
+ itemType: toolCallItemType(message.status ?? void 0),
125
+ role: "assistant",
126
+ callType,
127
+ callId,
128
+ name: firstNonEmptyString(toolName, titleToolName) || "Tool",
129
+ ...message.status !== void 0 ? { status: message.status } : {},
130
+ payload: mergedPayload,
131
+ ...occurredAtUnixMs !== void 0 ? { occurredAtUnixMs } : {},
132
+ ...message.startedAtUnixMs !== void 0 ? { createdAtUnixMs: message.startedAtUnixMs } : {}
133
+ };
134
+ }
135
+ if (kind === "collaboration") {
136
+ return messageTimelineItem({
137
+ message,
138
+ id,
139
+ seq,
140
+ eventId,
141
+ turnId,
142
+ actorType: "agent",
143
+ itemType: "collaboration",
144
+ role: "assistant",
145
+ content: messagePayloadString(message, "resultText") ?? "",
146
+ occurredAtUnixMs
147
+ });
148
+ }
149
+ if (kind === "reasoning") {
150
+ return messageTimelineItem({
151
+ message,
152
+ id,
153
+ seq,
154
+ eventId,
155
+ turnId,
156
+ actorType: "agent",
157
+ itemType: "message.assistant_thinking",
158
+ role: "assistant_thinking",
159
+ content: messageText(message),
160
+ occurredAtUnixMs
161
+ });
162
+ }
163
+ if ((kind === "text" || kind === "session_audit") && role === "user") {
164
+ return messageTimelineItem({
165
+ message,
166
+ id,
167
+ seq,
168
+ eventId,
169
+ turnId,
170
+ actorType: "user",
171
+ itemType: "message.user",
172
+ role: "user",
173
+ content: messageText(message),
174
+ occurredAtUnixMs
175
+ });
176
+ }
177
+ if (kind === "text" && (role === "assistant" || role === "agent")) {
178
+ const projectedMessage = normalizeLegacyCompactNotice(message, payload);
179
+ return messageTimelineItem({
180
+ message: projectedMessage,
181
+ id,
182
+ seq,
183
+ eventId,
184
+ turnId,
185
+ actorType: "agent",
186
+ itemType: "message.assistant",
187
+ role: "assistant",
188
+ content: messageText(projectedMessage),
189
+ occurredAtUnixMs
190
+ });
191
+ }
192
+ const statusTurnId = turnId ?? `session-status:${kind === "error" ? "error" : "notice"}`;
193
+ const statusMessage = {
194
+ ...message,
195
+ payload: kind === "error" ? {
196
+ ...payload,
197
+ detail: messageText(message),
198
+ kind: "agent_visible_error"
199
+ } : {
200
+ ...payload,
201
+ detail: messageText(message),
202
+ kind: "agent_system_notice",
203
+ noticeKind: kind,
204
+ severity: "info"
205
+ }
206
+ };
207
+ return messageTimelineItem({
208
+ message: statusMessage,
209
+ id,
210
+ seq,
211
+ eventId,
212
+ turnId: statusTurnId,
213
+ actorType: role === "user" ? "user" : "agent",
214
+ itemType: role === "user" ? "message.user" : "message.assistant",
215
+ role: role === "user" ? "user" : "assistant",
216
+ content: statusMessageText(statusMessage),
217
+ occurredAtUnixMs
218
+ });
219
+ });
220
+ }
221
+ function isGoalControlAudit(message) {
222
+ return normalizeToken(message.kind) === "session_audit" && normalizedPayload(message.payload).goalControl === true;
223
+ }
224
+ function normalizeLegacyCompactNotice(message, payload) {
225
+ const commandSemantics = resolveWorkspaceAgentNoticeCommandSemantics({
226
+ eventId: message.messageId,
227
+ messageSemantics: message.semantics,
228
+ payload,
229
+ status: message.status
230
+ });
231
+ if (commandSemantics?.command !== "compact") {
232
+ return message;
233
+ }
234
+ const commandStatus = commandSemantics.commandStatus;
235
+ const title = stringValue(payload.title) || (commandStatus === "completed" ? "Context compacted." : commandStatus === "running" ? "Compacting context." : "Context compaction interrupted.");
236
+ const originalText = messageText(message);
237
+ const detail = stringValue(payload.detail) || (commandStatus === "failed" || commandStatus === "canceled" ? originalText.replace(/^Compacting failed:\s*/iu, "").trim() : "");
238
+ return {
239
+ ...message,
240
+ semantics: {
241
+ ...message.semantics,
242
+ noticeCommand: "compact",
243
+ noticeCommandStatus: commandStatus
244
+ },
245
+ payload: {
246
+ ...payload,
247
+ kind: "agent_system_notice",
248
+ noticeKind: stringValue(payload.noticeKind) || "system_notice",
249
+ noticeCommand: "compact",
250
+ noticeCommandStatus: commandStatus,
251
+ title,
252
+ text: title,
253
+ content: title,
254
+ ...detail ? { detail } : {}
255
+ }
256
+ };
257
+ }
258
+ function latestMessageSnapshots(messages) {
259
+ const latestByKey = /* @__PURE__ */ new Map();
260
+ const unkeyedMessages = [];
261
+ for (const message of messages) {
262
+ const key = messageSnapshotKey(message);
263
+ if (!key) {
264
+ unkeyedMessages.push(message);
265
+ continue;
266
+ }
267
+ const previous = latestByKey.get(key);
268
+ if (!previous || (message.version ?? 0) >= (previous.version ?? 0)) {
269
+ latestByKey.set(key, mergeMessageSnapshot(previous, message));
270
+ } else {
271
+ latestByKey.set(key, mergeMessageSnapshot(message, previous));
272
+ }
273
+ }
274
+ return [...unkeyedMessages, ...latestByKey.values()];
275
+ }
276
+ function mergeMessageSnapshot(previous, next) {
277
+ const semantics = previous?.semantics || next.semantics ? { ...previous?.semantics, ...next.semantics } : void 0;
278
+ return {
279
+ ...previous,
280
+ ...next,
281
+ sequence: next.sequence ?? previous?.sequence,
282
+ createdAtUnixMs: next.createdAtUnixMs ?? previous?.createdAtUnixMs,
283
+ ...semantics ? { semantics } : {},
284
+ payload: {
285
+ ...previous?.payload ?? {},
286
+ ...next.payload ?? {}
287
+ }
288
+ };
289
+ }
290
+ function messageSnapshotKey(message) {
291
+ const messageId = message.messageId.trim();
292
+ if (!messageId) {
293
+ return null;
294
+ }
295
+ return `${message.agentSessionId.trim()}\0${messageId}`;
296
+ }
297
+ function messageTimelineItem({
298
+ message,
299
+ id,
300
+ seq,
301
+ eventId,
302
+ turnId,
303
+ actorType,
304
+ itemType,
305
+ role,
306
+ content,
307
+ occurredAtUnixMs
308
+ }) {
309
+ const workspaceId = workspaceIdFromMessage(message);
310
+ return {
311
+ id,
312
+ ...workspaceTimelineFields(workspaceId),
313
+ agentSessionId: message.agentSessionId,
314
+ seq,
315
+ ...turnId ? { turnId } : {},
316
+ eventId,
317
+ actorType,
318
+ actorId: actorType === "user" ? "user" : message.agentSessionId,
319
+ itemType,
320
+ role,
321
+ status: message.status,
322
+ ...message.semantics ? { messageSemantics: message.semantics } : {},
323
+ content,
324
+ payload: normalizedPayload(message.payload),
325
+ ...occurredAtUnixMs !== void 0 ? { occurredAtUnixMs } : {},
326
+ ...message.startedAtUnixMs !== void 0 ? { createdAtUnixMs: message.startedAtUnixMs } : {}
327
+ };
328
+ }
329
+ function workspaceIdFromMessage(message) {
330
+ return message.workspaceId?.trim() || "";
331
+ }
332
+ function workspaceTimelineFields(workspaceId) {
333
+ return {
334
+ workspaceId
335
+ };
336
+ }
337
+ function compareMessagesByDisplayOrder(left, right) {
338
+ const leftSequence = normalizedPositiveNumber(left.sequence);
339
+ const rightSequence = normalizedPositiveNumber(right.sequence);
340
+ if (leftSequence > 0 && rightSequence > 0 && leftSequence !== rightSequence) {
341
+ return leftSequence - rightSequence;
342
+ }
343
+ const leftTime = messageDisplayOrderTime(left);
344
+ const rightTime = messageDisplayOrderTime(right);
345
+ if (leftTime > 0 && rightTime > 0 && leftTime !== rightTime) {
346
+ return leftTime - rightTime;
347
+ }
348
+ const leftVersion = normalizedPositiveNumber(left.version);
349
+ const rightVersion = normalizedPositiveNumber(right.version);
350
+ if (leftVersion > 0 && rightVersion > 0 && leftVersion !== rightVersion) {
351
+ return leftVersion - rightVersion;
352
+ }
353
+ return 0;
354
+ }
355
+ function normalizedMessageId(id, index) {
356
+ const normalizedId = typeof id === "number" ? id : 0;
357
+ return Number.isFinite(normalizedId) && normalizedId > 0 ? normalizedId : index + 1;
358
+ }
359
+ function normalizedPositiveNumber(value) {
360
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
361
+ }
362
+ function messageDisplayOrderTime(message) {
363
+ return normalizedPositiveNumber(message.startedAtUnixMs) || normalizedPositiveNumber(message.createdAtUnixMs) || normalizedPositiveNumber(message.occurredAtUnixMs) || normalizedPositiveNumber(message.completedAtUnixMs);
364
+ }
365
+ function toolCallItemType(status) {
366
+ switch (normalizeToken(status)) {
367
+ case "running":
368
+ case "working":
369
+ case "active":
370
+ return "call.started";
371
+ case "completed":
372
+ case "complete":
373
+ case "done":
374
+ case "success":
375
+ case "succeeded":
376
+ return "call.completed";
377
+ case "failed":
378
+ case "error":
379
+ return "call.failed";
380
+ case "canceled":
381
+ return "call.canceled";
382
+ default:
383
+ return "call";
384
+ }
385
+ }
386
+ function messageText(message) {
387
+ const payload = normalizedPayload(message.payload);
388
+ const title = messagePayloadString(message, "title");
389
+ return firstNonEmptyString(
390
+ stringValue(payload.displayPrompt),
391
+ stringValue(payload.text),
392
+ stringValue(payload.content),
393
+ stringValue(payload.message),
394
+ stringValue(payload.body),
395
+ title
396
+ );
397
+ }
398
+ function statusMessageText(message) {
399
+ const title = messagePayloadString(message, "title") ?? "";
400
+ const text = messageText(message);
401
+ if (title && text && title !== text) {
402
+ return `${title}
403
+
404
+ ${text}`;
405
+ }
406
+ return title || text;
407
+ }
408
+ function messagePayloadString(message, key) {
409
+ return stringValue(normalizedPayload(message.payload)[key]);
410
+ }
411
+ function mergePayload(previous, next) {
412
+ if (!previous) {
413
+ return next;
414
+ }
415
+ const merged = { ...previous, ...next };
416
+ for (const key of [
417
+ "input",
418
+ "output",
419
+ "error",
420
+ "metadata",
421
+ "toolState",
422
+ "tool_state"
423
+ ]) {
424
+ if (isRecord(previous[key]) || isRecord(next[key])) {
425
+ merged[key] = {
426
+ ...isRecord(previous[key]) ? previous[key] : {},
427
+ ...isRecord(next[key]) ? next[key] : {}
428
+ };
429
+ }
430
+ }
431
+ return merged;
432
+ }
433
+ function normalizedPayload(payload) {
434
+ return payload && typeof payload === "object" && !Array.isArray(payload) ? payload : {};
435
+ }
436
+ function sanitizedToolPayload(payload, callId) {
437
+ if (!isOpaqueCallIdentifierString(stringValue(payload.toolName), callId)) {
438
+ return payload;
439
+ }
440
+ const { toolName: _toolName, ...rest } = payload;
441
+ return rest;
442
+ }
443
+ function isRecord(value) {
444
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
445
+ }
446
+ function stringValue(value) {
447
+ return typeof value === "string" && value.trim() ? value.trim() : "";
448
+ }
449
+ function firstNonEmptyString(...values) {
450
+ for (const value of values) {
451
+ if (typeof value === "string" && value.trim()) {
452
+ return value.trim();
453
+ }
454
+ }
455
+ return "";
456
+ }
457
+ function displayToolNameCandidate(value, callId) {
458
+ const trimmed = value?.trim() ?? "";
459
+ if (!trimmed || isOpaqueCallIdentifierString(trimmed, callId)) {
460
+ return "";
461
+ }
462
+ return trimmed;
463
+ }
464
+ function isOpaqueCallIdentifierString(value, callId) {
465
+ const trimmed = value.trim();
466
+ if (!trimmed) {
467
+ return false;
468
+ }
469
+ if (callId?.trim() && trimmed === callId.trim()) {
470
+ return true;
471
+ }
472
+ const lower = trimmed.toLowerCase();
473
+ if (lower.startsWith("call_")) {
474
+ return isOpaqueIdentifierTail(trimmed.slice("call_".length));
475
+ }
476
+ if (lower.startsWith("ws_")) {
477
+ return isOpaqueIdentifierTail(trimmed.slice("ws_".length));
478
+ }
479
+ return false;
480
+ }
481
+ function isOpaqueIdentifierTail(value) {
482
+ return value.length >= 12 && /^[a-z0-9]+$/i.test(value);
483
+ }
484
+ function normalizeToken(value) {
485
+ return value?.trim().toLowerCase() ?? "";
486
+ }
487
+
488
+ // shared/agentConversation/projection/agentInteractionPromptProjection.ts
489
+ function projectAgentConversationPromptFromInteraction(interaction) {
490
+ return interaction.kind === "approval" ? projectAgentApprovalPromptFromInteraction(interaction) : projectAgentInteractivePromptFromInteraction(interaction);
491
+ }
492
+ function projectAgentApprovalPromptFromInteraction(interaction) {
493
+ if (!interaction || interaction.kind !== "approval") return null;
494
+ const callId = typeof interaction.input?.callId === "string" && interaction.input.callId.trim() ? interaction.input.callId.trim() : interaction.requestId.trim();
495
+ const options = normalizeAgentApprovalOptions(interaction.input?.options);
496
+ if (!callId || options.length === 0) return null;
497
+ const approvalPurpose = normalizeAgentApprovalPurpose(
498
+ interaction.metadata?.approvalPurpose
499
+ );
500
+ return {
501
+ kind: "approval",
502
+ id: `approval:${callId}`,
503
+ turnId: interaction.turnId,
504
+ requestId: interaction.requestId,
505
+ callId,
506
+ ...approvalPurpose ? { approvalPurpose } : {},
507
+ title: interaction.toolName?.trim() || "",
508
+ status: "waiting_approval",
509
+ toolName: interaction.toolName?.trim() || null,
510
+ input: interaction.input ?? null,
511
+ options,
512
+ output: interaction.output ?? null,
513
+ occurredAtUnixMs: interaction.createdAtUnixMs
514
+ };
515
+ }
516
+ function projectAgentInteractivePromptFromInteraction(interaction) {
517
+ if (!interaction || interaction.kind === "approval") return null;
518
+ const toolName = normalizeInteractiveToolName(
519
+ interaction.toolName ?? void 0
520
+ );
521
+ if (interaction.kind === "plan" || toolName === "exitplanmode") {
522
+ const keepPlanningOptionId = extractExitPlanKeepPlanningOptionId(
523
+ interaction.input
524
+ );
525
+ return {
526
+ kind: "exit-plan",
527
+ requestId: interaction.requestId,
528
+ title: interaction.toolName?.trim() || "",
529
+ options: extractExitPlanModeOptions(interaction.input),
530
+ ...keepPlanningOptionId ? { keepPlanningOptionId } : {}
531
+ };
532
+ }
533
+ if (interaction.kind !== "question" || toolName !== "askuserquestion") {
534
+ return null;
535
+ }
536
+ const questions = normalizeAskUserQuestions(interaction.input?.questions, {
537
+ missingText: ""
538
+ });
539
+ return questions.length > 0 ? {
540
+ kind: "ask-user",
541
+ requestId: interaction.requestId,
542
+ title: interaction.toolName?.trim() || "",
543
+ questions
544
+ } : null;
545
+ }
546
+ function normalizeInteractiveToolName(toolName) {
547
+ return (toolName?.trim() ?? "").replace(/[_\s-]+/g, "").toLowerCase();
548
+ }
549
+
550
+ export {
551
+ projectAgentActivitySessionToConversationVM,
552
+ projectWorkspaceAgentMessagesToTimelineItems,
553
+ projectAgentConversationPromptFromInteraction,
554
+ projectAgentApprovalPromptFromInteraction,
555
+ projectAgentInteractivePromptFromInteraction
556
+ };
557
+ //# sourceMappingURL=chunk-RMC2MGL4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/agentConversation/projection/workspaceAgentMessageProjection.ts","../shared/agentConversation/projection/agentInteractionPromptProjection.ts"],"sourcesContent":["import type {\n AgentActivityMessage,\n AgentActivitySnapshot,\n AgentActivityTurn\n} from \"@tutti-os/agent-activity-core\";\nimport { buildWorkspaceAgentActivityListViewModel } from \"../../workspaceAgentActivityListViewModel\";\nimport type { BuildWorkspaceAgentSessionDetailInput } from \"../../workspaceAgentSessionDetailViewModel\";\nimport { buildCanonicalWorkspaceAgentDetailView } from \"../../workspaceAgentTimelineCanonical\";\nimport { resolveWorkspaceAgentNoticeCommandSemantics } from \"../../workspaceAgentSystemNoticeSemantics\";\nimport type { WorkspaceAgentActivityTimelineItem } from \"../../workspaceAgentTimelineTypes\";\nimport type { AgentConversationVM } from \"../contracts/agentConversationVM\";\nimport {\n projectAgentConversationVM,\n type AgentConversationProjectionOptions\n} from \"./agentConversationProjection\";\n\nexport interface ProjectWorkspaceAgentMessagesInput extends Omit<\n BuildWorkspaceAgentSessionDetailInput,\n \"timelineItems\"\n> {\n messages: AgentActivityMessage[];\n}\n\nexport interface ProjectAgentActivitySessionConversationInput {\n activitySnapshot: AgentActivitySnapshot;\n agentSessionId: string;\n sessionTurns?: readonly AgentActivityTurn[];\n workspaceRoot?: string | null;\n}\n\nexport function projectAgentActivitySessionToConversationVM({\n activitySnapshot,\n agentSessionId,\n sessionTurns,\n workspaceRoot\n}: ProjectAgentActivitySessionConversationInput): AgentConversationVM | null {\n const session =\n activitySnapshot.sessions.find(\n (candidate) => candidate.agentSessionId === agentSessionId\n ) ?? null;\n if (!session) return null;\n const messages = activitySnapshot.sessionMessagesById[agentSessionId] ?? [];\n const activity =\n buildWorkspaceAgentActivityListViewModel(activitySnapshot, {\n sessionMessagesById: activitySnapshot.sessionMessagesById\n }).activities.find(\n (candidate) => candidate.sessionId === session.agentSessionId\n ) ?? null;\n if (!activity) return null;\n return projectWorkspaceAgentMessagesToConversationVM({\n activity,\n messages,\n session,\n sessionTurns,\n workspaceRoot\n });\n}\n\nexport function projectWorkspaceAgentMessagesToConversationVM(\n input: ProjectWorkspaceAgentMessagesInput,\n options: AgentConversationProjectionOptions = {}\n): AgentConversationVM {\n const { messages, ...detailInput } = input;\n const timelineItems = projectWorkspaceAgentMessagesToTimelineItems(messages);\n const detail = buildCanonicalWorkspaceAgentDetailView({\n ...detailInput,\n sessionTurns: detailInput.sessionTurns?.filter(\n (turn) => turn.agentSessionId === detailInput.session.agentSessionId\n ),\n timelineItems\n });\n return projectAgentConversationVM(detail, options);\n}\n\nconst tuttiPlanIssueDispatchTriggerPrefix = \"issue:tutti-mode-plan-\";\n\n/**\n * Per-run delegate cards for tutti-plan Issue dispatch stay out of the\n * timeline: the embedded plan-issue panel carries that state per task, and a\n * duplicate card per run reads as unrelated noise. Collaboration records from\n * any other source keep their cards.\n */\nfunction isTuttiPlanIssueDispatchCollaboration(\n message: AgentActivityMessage\n): boolean {\n if (message.kind?.trim() !== \"collaboration\") {\n return false;\n }\n const triggerReason = message.payload?.triggerReason;\n return (\n typeof triggerReason === \"string\" &&\n triggerReason.startsWith(tuttiPlanIssueDispatchTriggerPrefix)\n );\n}\n\nexport function projectWorkspaceAgentMessagesToTimelineItems(\n messages: readonly AgentActivityMessage[]\n): WorkspaceAgentActivityTimelineItem[] {\n const sortedMessages = latestMessageSnapshots(messages)\n .filter((message) => !isTuttiPlanIssueDispatchCollaboration(message))\n .sort(compareMessagesByDisplayOrder);\n const mergedToolPayloadByKey = new Map<string, Record<string, unknown>>();\n\n return sortedMessages.map((message, index) => {\n const kind = normalizeToken(message.kind);\n const role = normalizeToken(message.role);\n const payload = normalizedPayload(message.payload);\n const goalControlAudit = isGoalControlAudit(message);\n const id = normalizedMessageId(message.version, index);\n const seq = index + 1;\n const eventId = goalControlAudit\n ? firstNonEmptyString(\n stringValue(payload.messageId),\n message.messageId,\n `message:${id}`\n )\n : message.messageId.trim() || `message:${id}`;\n const turnId = message.turnId?.trim() || undefined;\n const occurredAtUnixMs = messageDisplayOrderTime(message);\n\n if (goalControlAudit) {\n return messageTimelineItem({\n message,\n id,\n seq,\n eventId,\n actorType: \"user\",\n itemType: \"goal.control\",\n role: \"user\",\n content: messageText(message),\n occurredAtUnixMs\n });\n }\n\n if (kind === \"tool_call\") {\n const callId = firstNonEmptyString(\n messagePayloadString(message, \"callId\"),\n message.messageId\n );\n const title = messagePayloadString(message, \"title\");\n const toolKey = callId || eventId;\n const payloadToolName = displayToolNameCandidate(\n stringValue(payload.toolName),\n callId\n );\n const titleToolName = displayToolNameCandidate(title, callId);\n const toolName = firstNonEmptyString(payloadToolName, titleToolName);\n const toolPayload = sanitizedToolPayload(payload, callId);\n const mergedPayload = mergePayload(mergedToolPayloadByKey.get(toolKey), {\n ...toolPayload,\n ...(toolName ? { toolName } : {}),\n ...(message.status?.trim() ? { status: message.status.trim() } : {})\n });\n mergedToolPayloadByKey.set(toolKey, mergedPayload);\n const callType =\n firstNonEmptyString(stringValue(mergedPayload.callType)) || \"tool\";\n const workspaceId = workspaceIdFromMessage(message);\n return {\n id,\n ...workspaceTimelineFields(workspaceId),\n agentSessionId: message.agentSessionId,\n seq,\n ...(turnId ? { turnId } : {}),\n eventId,\n actorType: \"agent\",\n actorId: message.agentSessionId,\n itemType: toolCallItemType(message.status ?? undefined),\n role: \"assistant\",\n callType,\n callId,\n name: firstNonEmptyString(toolName, titleToolName) || \"Tool\",\n ...(message.status !== undefined ? { status: message.status } : {}),\n payload: mergedPayload,\n ...(occurredAtUnixMs !== undefined ? { occurredAtUnixMs } : {}),\n ...(message.startedAtUnixMs !== undefined\n ? { createdAtUnixMs: message.startedAtUnixMs }\n : {})\n };\n }\n\n if (kind === \"collaboration\") {\n // Collaboration runs (model consult/fork/delegate/handoff) are durable\n // assistant-side messages the daemon updates in place by messageId\n // (\"collab:<runId>\"). Keep the full payload so the canonical detail view\n // can project the typed collaboration card even while resultText is\n // still empty (running consult).\n return messageTimelineItem({\n message,\n id,\n seq,\n eventId,\n turnId,\n actorType: \"agent\",\n itemType: \"collaboration\",\n role: \"assistant\",\n content: messagePayloadString(message, \"resultText\") ?? \"\",\n occurredAtUnixMs\n });\n }\n\n if (kind === \"reasoning\") {\n return messageTimelineItem({\n message,\n id,\n seq,\n eventId,\n turnId,\n actorType: \"agent\",\n itemType: \"message.assistant_thinking\",\n role: \"assistant_thinking\",\n content: messageText(message),\n occurredAtUnixMs\n });\n }\n\n if ((kind === \"text\" || kind === \"session_audit\") && role === \"user\") {\n return messageTimelineItem({\n message,\n id,\n seq,\n eventId,\n turnId,\n actorType: \"user\",\n itemType: \"message.user\",\n role: \"user\",\n content: messageText(message),\n occurredAtUnixMs\n });\n }\n\n if (kind === \"text\" && (role === \"assistant\" || role === \"agent\")) {\n const projectedMessage = normalizeLegacyCompactNotice(message, payload);\n return messageTimelineItem({\n message: projectedMessage,\n id,\n seq,\n eventId,\n turnId,\n actorType: \"agent\",\n itemType: \"message.assistant\",\n role: \"assistant\",\n content: messageText(projectedMessage),\n occurredAtUnixMs\n });\n }\n\n const statusTurnId =\n turnId ?? `session-status:${kind === \"error\" ? \"error\" : \"notice\"}`;\n const statusMessage: AgentActivityMessage = {\n ...message,\n payload:\n kind === \"error\"\n ? {\n ...payload,\n detail: messageText(message),\n kind: \"agent_visible_error\"\n }\n : {\n ...payload,\n detail: messageText(message),\n kind: \"agent_system_notice\",\n noticeKind: kind,\n severity: \"info\"\n }\n };\n return messageTimelineItem({\n message: statusMessage,\n id,\n seq,\n eventId,\n turnId: statusTurnId,\n actorType: role === \"user\" ? \"user\" : \"agent\",\n itemType: role === \"user\" ? \"message.user\" : \"message.assistant\",\n role: role === \"user\" ? \"user\" : \"assistant\",\n content: statusMessageText(statusMessage),\n occurredAtUnixMs\n });\n });\n}\n\nfunction isGoalControlAudit(message: AgentActivityMessage): boolean {\n return (\n normalizeToken(message.kind) === \"session_audit\" &&\n normalizedPayload(message.payload).goalControl === true\n );\n}\n\nfunction normalizeLegacyCompactNotice(\n message: AgentActivityMessage,\n payload: Record<string, unknown>\n): AgentActivityMessage {\n const commandSemantics = resolveWorkspaceAgentNoticeCommandSemantics({\n eventId: message.messageId,\n messageSemantics: message.semantics,\n payload,\n status: message.status\n });\n if (commandSemantics?.command !== \"compact\") {\n return message;\n }\n const commandStatus = commandSemantics.commandStatus;\n const title =\n stringValue(payload.title) ||\n (commandStatus === \"completed\"\n ? \"Context compacted.\"\n : commandStatus === \"running\"\n ? \"Compacting context.\"\n : \"Context compaction interrupted.\");\n const originalText = messageText(message);\n const detail =\n stringValue(payload.detail) ||\n (commandStatus === \"failed\" || commandStatus === \"canceled\"\n ? originalText.replace(/^Compacting failed:\\s*/iu, \"\").trim()\n : \"\");\n return {\n ...message,\n semantics: {\n ...message.semantics,\n noticeCommand: \"compact\",\n noticeCommandStatus: commandStatus\n },\n payload: {\n ...payload,\n kind: \"agent_system_notice\",\n noticeKind: stringValue(payload.noticeKind) || \"system_notice\",\n noticeCommand: \"compact\",\n noticeCommandStatus: commandStatus,\n title,\n text: title,\n content: title,\n ...(detail ? { detail } : {})\n }\n };\n}\n\nfunction latestMessageSnapshots(\n messages: readonly AgentActivityMessage[]\n): AgentActivityMessage[] {\n const latestByKey = new Map<string, AgentActivityMessage>();\n const unkeyedMessages: AgentActivityMessage[] = [];\n for (const message of messages) {\n const key = messageSnapshotKey(message);\n if (!key) {\n unkeyedMessages.push(message);\n continue;\n }\n const previous = latestByKey.get(key);\n if (!previous || (message.version ?? 0) >= (previous.version ?? 0)) {\n latestByKey.set(key, mergeMessageSnapshot(previous, message));\n } else {\n latestByKey.set(key, mergeMessageSnapshot(message, previous));\n }\n }\n\n return [...unkeyedMessages, ...latestByKey.values()];\n}\n\nfunction mergeMessageSnapshot(\n previous: AgentActivityMessage | undefined,\n next: AgentActivityMessage\n): AgentActivityMessage {\n const semantics =\n previous?.semantics || next.semantics\n ? { ...previous?.semantics, ...next.semantics }\n : undefined;\n return {\n ...previous,\n ...next,\n sequence: next.sequence ?? previous?.sequence,\n createdAtUnixMs: next.createdAtUnixMs ?? previous?.createdAtUnixMs,\n ...(semantics ? { semantics } : {}),\n payload: {\n ...(previous?.payload ?? {}),\n ...(next.payload ?? {})\n }\n };\n}\n\nfunction messageSnapshotKey(message: AgentActivityMessage): string | null {\n const messageId = message.messageId.trim();\n if (!messageId) {\n return null;\n }\n\n return `${message.agentSessionId.trim()}\\u0000${messageId}`;\n}\n\nfunction messageTimelineItem({\n message,\n id,\n seq,\n eventId,\n turnId,\n actorType,\n itemType,\n role,\n content,\n occurredAtUnixMs\n}: {\n message: AgentActivityMessage;\n id: number;\n seq: number;\n eventId: string;\n turnId?: string;\n actorType: string;\n itemType: string;\n role: string;\n content: string;\n occurredAtUnixMs?: number;\n}): WorkspaceAgentActivityTimelineItem {\n const workspaceId = workspaceIdFromMessage(message);\n return {\n id,\n ...workspaceTimelineFields(workspaceId),\n agentSessionId: message.agentSessionId,\n seq,\n ...(turnId ? { turnId } : {}),\n eventId,\n actorType,\n actorId: actorType === \"user\" ? \"user\" : message.agentSessionId,\n itemType,\n role,\n status: message.status,\n ...(message.semantics ? { messageSemantics: message.semantics } : {}),\n content,\n payload: normalizedPayload(message.payload),\n ...(occurredAtUnixMs !== undefined ? { occurredAtUnixMs } : {}),\n ...(message.startedAtUnixMs !== undefined\n ? { createdAtUnixMs: message.startedAtUnixMs }\n : {})\n };\n}\n\nfunction workspaceIdFromMessage(message: AgentActivityMessage): string {\n return message.workspaceId?.trim() || \"\";\n}\n\nfunction workspaceTimelineFields(\n workspaceId: string\n): Pick<WorkspaceAgentActivityTimelineItem, \"workspaceId\"> {\n return {\n workspaceId\n };\n}\n\nfunction compareMessagesByDisplayOrder(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): number {\n // Durable sequence is assigned once when the message is first stored and is\n // not changed by later streaming snapshots. Timestamps are compatibility\n // fallbacks for messages produced by older runtimes.\n const leftSequence = normalizedPositiveNumber(left.sequence);\n const rightSequence = normalizedPositiveNumber(right.sequence);\n if (leftSequence > 0 && rightSequence > 0 && leftSequence !== rightSequence) {\n return leftSequence - rightSequence;\n }\n const leftTime = messageDisplayOrderTime(left);\n const rightTime = messageDisplayOrderTime(right);\n if (leftTime > 0 && rightTime > 0 && leftTime !== rightTime) {\n return leftTime - rightTime;\n }\n const leftVersion = normalizedPositiveNumber(left.version);\n const rightVersion = normalizedPositiveNumber(right.version);\n if (leftVersion > 0 && rightVersion > 0 && leftVersion !== rightVersion) {\n return leftVersion - rightVersion;\n }\n // Sorting opaque message ids would manufacture chronology and can move a\n // user prompt behind the assistant output it initiated.\n return 0;\n}\n\nfunction normalizedMessageId(id: number | undefined, index: number): number {\n const normalizedId = typeof id === \"number\" ? id : 0;\n return Number.isFinite(normalizedId) && normalizedId > 0\n ? normalizedId\n : index + 1;\n}\n\nfunction normalizedPositiveNumber(value: number | undefined): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : 0;\n}\n\nfunction messageDisplayOrderTime(message: AgentActivityMessage): number {\n return (\n normalizedPositiveNumber(message.startedAtUnixMs) ||\n normalizedPositiveNumber(message.createdAtUnixMs) ||\n normalizedPositiveNumber(message.occurredAtUnixMs) ||\n normalizedPositiveNumber(message.completedAtUnixMs)\n );\n}\n\nfunction toolCallItemType(status: string | undefined): string {\n switch (normalizeToken(status)) {\n case \"running\":\n case \"working\":\n case \"active\":\n return \"call.started\";\n case \"completed\":\n case \"complete\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"call.completed\";\n case \"failed\":\n case \"error\":\n return \"call.failed\";\n case \"canceled\":\n return \"call.canceled\";\n default:\n return \"call\";\n }\n}\n\nfunction messageText(message: AgentActivityMessage): string {\n const payload = normalizedPayload(message.payload);\n const title = messagePayloadString(message, \"title\");\n return firstNonEmptyString(\n stringValue(payload.displayPrompt),\n stringValue(payload.text),\n stringValue(payload.content),\n stringValue(payload.message),\n stringValue(payload.body),\n title\n );\n}\n\nfunction statusMessageText(message: AgentActivityMessage): string {\n const title = messagePayloadString(message, \"title\") ?? \"\";\n const text = messageText(message);\n if (title && text && title !== text) {\n return `${title}\\n\\n${text}`;\n }\n return title || text;\n}\n\nfunction messagePayloadString(\n message: AgentActivityMessage,\n key: string\n): string | undefined {\n return stringValue(normalizedPayload(message.payload)[key]);\n}\n\nfunction mergePayload(\n previous: Record<string, unknown> | undefined,\n next: Record<string, unknown>\n): Record<string, unknown> {\n if (!previous) {\n return next;\n }\n const merged = { ...previous, ...next };\n for (const key of [\n \"input\",\n \"output\",\n \"error\",\n \"metadata\",\n \"toolState\",\n \"tool_state\"\n ]) {\n if (isRecord(previous[key]) || isRecord(next[key])) {\n merged[key] = {\n ...(isRecord(previous[key]) ? previous[key] : {}),\n ...(isRecord(next[key]) ? next[key] : {})\n };\n }\n }\n return merged;\n}\n\nfunction normalizedPayload(\n payload: Record<string, unknown> | undefined\n): Record<string, unknown> {\n return payload && typeof payload === \"object\" && !Array.isArray(payload)\n ? payload\n : {};\n}\n\nfunction sanitizedToolPayload(\n payload: Record<string, unknown>,\n callId: string | undefined\n): Record<string, unknown> {\n if (!isOpaqueCallIdentifierString(stringValue(payload.toolName), callId)) {\n return payload;\n }\n const { toolName: _toolName, ...rest } = payload;\n return rest;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" && value.trim() ? value.trim() : \"\";\n}\n\nfunction firstNonEmptyString(\n ...values: Array<string | undefined | null>\n): string {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return \"\";\n}\n\nfunction displayToolNameCandidate(\n value: string | undefined,\n callId: string | undefined\n): string {\n const trimmed = value?.trim() ?? \"\";\n if (!trimmed || isOpaqueCallIdentifierString(trimmed, callId)) {\n return \"\";\n }\n return trimmed;\n}\n\nfunction isOpaqueCallIdentifierString(\n value: string,\n callId: string | undefined\n): boolean {\n const trimmed = value.trim();\n if (!trimmed) {\n return false;\n }\n if (callId?.trim() && trimmed === callId.trim()) {\n return true;\n }\n const lower = trimmed.toLowerCase();\n if (lower.startsWith(\"call_\")) {\n return isOpaqueIdentifierTail(trimmed.slice(\"call_\".length));\n }\n if (lower.startsWith(\"ws_\")) {\n return isOpaqueIdentifierTail(trimmed.slice(\"ws_\".length));\n }\n return false;\n}\n\nfunction isOpaqueIdentifierTail(value: string): boolean {\n return value.length >= 12 && /^[a-z0-9]+$/i.test(value);\n}\n\nfunction normalizeToken(value: string | undefined): string {\n return value?.trim().toLowerCase() ?? \"\";\n}\n","import type { AgentActivityInteraction } from \"@tutti-os/agent-activity-core\";\nimport type { AgentConversationPromptVM } from \"../contracts/agentConversationVM\";\nimport { normalizeAgentApprovalPurpose } from \"../agentApprovalPurpose\";\nimport { normalizeAskUserQuestions } from \"../askUserQuestions\";\nimport {\n extractExitPlanKeepPlanningOptionId,\n extractExitPlanModeOptions\n} from \"../exitPlanOptions\";\nimport { normalizeAgentApprovalOptions } from \"./agentApprovalProjection\";\n\ntype ApprovalPrompt = Extract<AgentConversationPromptVM, { kind: \"approval\" }>;\ntype InteractivePrompt = Exclude<\n AgentConversationPromptVM,\n ApprovalPrompt | { kind: \"plan-implementation\" }\n>;\n\nexport function projectAgentConversationPromptFromInteraction(\n interaction: AgentActivityInteraction\n): ApprovalPrompt | InteractivePrompt | null {\n return interaction.kind === \"approval\"\n ? projectAgentApprovalPromptFromInteraction(interaction)\n : projectAgentInteractivePromptFromInteraction(interaction);\n}\n\nexport function projectAgentApprovalPromptFromInteraction(\n interaction: AgentActivityInteraction | null\n): ApprovalPrompt | null {\n if (!interaction || interaction.kind !== \"approval\") return null;\n const callId =\n typeof interaction.input?.callId === \"string\" &&\n interaction.input.callId.trim()\n ? interaction.input.callId.trim()\n : interaction.requestId.trim();\n const options = normalizeAgentApprovalOptions(interaction.input?.options);\n if (!callId || options.length === 0) return null;\n const approvalPurpose = normalizeAgentApprovalPurpose(\n interaction.metadata?.approvalPurpose\n );\n return {\n kind: \"approval\",\n id: `approval:${callId}`,\n turnId: interaction.turnId,\n requestId: interaction.requestId,\n callId,\n ...(approvalPurpose ? { approvalPurpose } : {}),\n title: interaction.toolName?.trim() || \"\",\n status: \"waiting_approval\",\n toolName: interaction.toolName?.trim() || null,\n input: interaction.input ?? null,\n options,\n output: interaction.output ?? null,\n occurredAtUnixMs: interaction.createdAtUnixMs\n };\n}\n\nexport function projectAgentInteractivePromptFromInteraction(\n interaction: AgentActivityInteraction | null\n): InteractivePrompt | null {\n if (!interaction || interaction.kind === \"approval\") return null;\n const toolName = normalizeInteractiveToolName(\n interaction.toolName ?? undefined\n );\n if (interaction.kind === \"plan\" || toolName === \"exitplanmode\") {\n const keepPlanningOptionId = extractExitPlanKeepPlanningOptionId(\n interaction.input\n );\n return {\n kind: \"exit-plan\",\n requestId: interaction.requestId,\n title: interaction.toolName?.trim() || \"\",\n options: extractExitPlanModeOptions(interaction.input),\n ...(keepPlanningOptionId ? { keepPlanningOptionId } : {})\n };\n }\n if (interaction.kind !== \"question\" || toolName !== \"askuserquestion\") {\n return null;\n }\n const questions = normalizeAskUserQuestions(interaction.input?.questions, {\n missingText: \"\"\n });\n return questions.length > 0\n ? {\n kind: \"ask-user\",\n requestId: interaction.requestId,\n title: interaction.toolName?.trim() || \"\",\n questions\n }\n : null;\n}\n\nfunction normalizeInteractiveToolName(toolName: string | undefined): string {\n return (toolName?.trim() ?? \"\").replace(/[_\\s-]+/g, \"\").toLowerCase();\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-MIJXEELH.js";
4
4
  import {
5
5
  translateInUiLanguage
6
- } from "./chunk-ZXEICU6J.js";
6
+ } from "./chunk-KK7YXPTS.js";
7
7
  import {
8
8
  resolveAgentGUIProviderCatalogIdentity
9
9
  } from "./chunk-O433KXLK.js";
@@ -277,4 +277,4 @@ export {
277
277
  resolveAgentGUIExplicitConversationTitle,
278
278
  resolveAgentGUIProviderDisplayLabel
279
279
  };
280
- //# sourceMappingURL=chunk-JA6XAKKE.js.map
280
+ //# sourceMappingURL=chunk-TWF6JXPC.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  resolveAgentGuiWorkbenchHeaderTitle,
3
3
  resolveAgentGuiWorkbenchSessionTitle
4
- } from "./chunk-T57ZZWTC.js";
4
+ } from "./chunk-4HAG3FOY.js";
5
5
  import {
6
6
  resolveAgentGUIConversationBrowserFreeTitle,
7
7
  resolveAgentGUIConversationTitleDisplayPrompt
8
- } from "./chunk-JA6XAKKE.js";
8
+ } from "./chunk-TWF6JXPC.js";
9
9
  import {
10
10
  createAgentGuiWorkbenchNodeStateSource,
11
11
  migrateLegacyAgentGuiWorkbenchState,
@@ -324,7 +324,7 @@ function stopPointerPropagation(event) {
324
324
 
325
325
  // workbench/header.ts
326
326
  var LazyAgentRichTextReadonly = lazy(
327
- () => import("./AgentRichTextReadonly-U3XUJYCW.js").then((module) => ({
327
+ () => import("./AgentRichTextReadonly-CCELQPHE.js").then((module) => ({
328
328
  default: module.AgentRichTextReadonly
329
329
  }))
330
330
  );
@@ -1526,4 +1526,4 @@ export {
1526
1526
  AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT,
1527
1527
  createAgentGuiWorkbenchContribution
1528
1528
  };
1529
- //# sourceMappingURL=chunk-7AYFKNLD.js.map
1529
+ //# sourceMappingURL=chunk-TWMV6YTX.js.map