@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.
- package/README.md +49 -0
- package/dist/{AgentRichTextReadonly-U3XUJYCW.js → AgentRichTextReadonly-CCELQPHE.js} +5 -5
- package/dist/agent-conversation/index.d.ts +17 -4
- package/dist/agent-conversation/index.js +13 -9
- package/dist/agent-conversation/index.js.map +1 -1
- package/dist/agent-gui.d.ts +19 -3
- package/dist/agent-gui.js +22 -16
- package/dist/agent-message-center/index.d.ts +1 -1
- package/dist/agent-message-center/index.js +10 -7
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/{agentGuiNodeTypes-DW7T--Y8.d.ts → agentGuiNodeTypes-Dgl7kQHA.d.ts} +2 -2
- package/dist/agents.d.ts +1 -1
- package/dist/app/renderer/agentactivity.css +17 -0
- package/dist/{chunk-M6WEFXPL.js → chunk-2MCNNB2P.js} +2 -24
- package/dist/chunk-2MCNNB2P.js.map +1 -0
- package/dist/{chunk-CQFT3MI5.js → chunk-3YYI6RXA.js} +7 -5
- package/dist/{chunk-CQFT3MI5.js.map → chunk-3YYI6RXA.js.map} +1 -1
- package/dist/{chunk-EDP4D42H.js → chunk-45KN5Z5F.js} +877 -871
- package/dist/chunk-45KN5Z5F.js.map +1 -0
- package/dist/{chunk-T57ZZWTC.js → chunk-4HAG3FOY.js} +2 -2
- package/dist/{chunk-ZBI6R46N.js → chunk-5DN5N2XS.js} +2 -2
- package/dist/{chunk-BCBB4HOV.js → chunk-634MNSI5.js} +2 -2
- package/dist/chunk-A4KKC324.js +4768 -0
- package/dist/chunk-A4KKC324.js.map +1 -0
- package/dist/chunk-ALAGL6VL.js +48 -0
- package/dist/chunk-ALAGL6VL.js.map +1 -0
- package/dist/{chunk-2STAUA73.js → chunk-AYTUAZE3.js} +5 -2
- package/dist/chunk-AYTUAZE3.js.map +1 -0
- package/dist/{chunk-SWO67UWQ.js → chunk-CZOZBUIM.js} +7 -7
- package/dist/{chunk-SWO67UWQ.js.map → chunk-CZOZBUIM.js.map} +1 -1
- package/dist/{chunk-2L2LVSOD.js → chunk-EHNPHZE4.js} +881 -5812
- package/dist/chunk-EHNPHZE4.js.map +1 -0
- package/dist/{chunk-N5356722.js → chunk-EKQ7UX2B.js} +13 -319
- package/dist/chunk-EKQ7UX2B.js.map +1 -0
- package/dist/{chunk-ZXEICU6J.js → chunk-KK7YXPTS.js} +3 -1
- package/dist/chunk-KK7YXPTS.js.map +1 -0
- package/dist/{chunk-WGCDSA7P.js → chunk-MBM7PJIF.js} +27 -506
- package/dist/chunk-MBM7PJIF.js.map +1 -0
- package/dist/chunk-RMC2MGL4.js +557 -0
- package/dist/chunk-RMC2MGL4.js.map +1 -0
- package/dist/{chunk-JA6XAKKE.js → chunk-TWF6JXPC.js} +2 -2
- package/dist/{chunk-7AYFKNLD.js → chunk-TWMV6YTX.js} +4 -4
- package/dist/chunk-VV3YIU5W.js +25 -0
- package/dist/chunk-VV3YIU5W.js.map +1 -0
- package/dist/{chunk-GLVENTN6.js → chunk-WXLO33YP.js} +2 -2
- package/dist/chunk-XWPHTXEM.js +529 -0
- package/dist/chunk-XWPHTXEM.js.map +1 -0
- package/dist/chunk-YEXRTXTE.js +315 -0
- package/dist/chunk-YEXRTXTE.js.map +1 -0
- package/dist/{chunk-WMJDOMG6.js → chunk-ZELGKLW5.js} +4 -4
- package/dist/composer-projection.d.ts +37 -0
- package/dist/composer-projection.js +21 -0
- package/dist/composer-projection.js.map +1 -0
- package/dist/context-mention-palette/index.js +9 -7
- package/dist/conversation-projection.d.ts +551 -0
- package/dist/conversation-projection.js +42 -0
- package/dist/conversation-projection.js.map +1 -0
- package/dist/conversation-rail-projection.js +3 -3
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +32 -13
- package/dist/index.js +22 -16
- package/dist/index.js.map +1 -1
- package/dist/mention-search.js +7 -5
- package/dist/{types-CHAMK2g7.d.ts → types-DtXXsISB.d.ts} +1 -1
- package/dist/workbench/contribution.js +4 -4
- package/dist/workbench/index.js +4 -4
- package/dist/workbench/sessionTitle.js +3 -3
- package/dist/workspace-agent-generated-files.d.ts +1 -12
- package/dist/workspaceAgentActivityListTypes-BUKNyMbh.d.ts +48 -0
- package/dist/{workspaceLinkActions-CzsbvGmC.d.ts → workspaceLinkActions-DxyzMy10.d.ts} +13 -12
- package/package.json +31 -17
- package/dist/chunk-2L2LVSOD.js.map +0 -1
- package/dist/chunk-2STAUA73.js.map +0 -1
- package/dist/chunk-EDP4D42H.js.map +0 -1
- package/dist/chunk-M6WEFXPL.js.map +0 -1
- package/dist/chunk-N5356722.js.map +0 -1
- package/dist/chunk-WGCDSA7P.js.map +0 -1
- package/dist/chunk-ZXEICU6J.js.map +0 -1
- /package/dist/{AgentRichTextReadonly-U3XUJYCW.js.map → AgentRichTextReadonly-CCELQPHE.js.map} +0 -0
- /package/dist/{chunk-T57ZZWTC.js.map → chunk-4HAG3FOY.js.map} +0 -0
- /package/dist/{chunk-ZBI6R46N.js.map → chunk-5DN5N2XS.js.map} +0 -0
- /package/dist/{chunk-BCBB4HOV.js.map → chunk-634MNSI5.js.map} +0 -0
- /package/dist/{chunk-JA6XAKKE.js.map → chunk-TWF6JXPC.js.map} +0 -0
- /package/dist/{chunk-7AYFKNLD.js.map → chunk-TWMV6YTX.js.map} +0 -0
- /package/dist/{chunk-GLVENTN6.js.map → chunk-WXLO33YP.js.map} +0 -0
- /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-
|
|
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-
|
|
280
|
+
//# sourceMappingURL=chunk-TWF6JXPC.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveAgentGuiWorkbenchHeaderTitle,
|
|
3
3
|
resolveAgentGuiWorkbenchSessionTitle
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-4HAG3FOY.js";
|
|
5
5
|
import {
|
|
6
6
|
resolveAgentGUIConversationBrowserFreeTitle,
|
|
7
7
|
resolveAgentGUIConversationTitleDisplayPrompt
|
|
8
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
1529
|
+
//# sourceMappingURL=chunk-TWMV6YTX.js.map
|