clawconnect-agent 0.2.5 → 0.2.7
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 +7 -3
- package/README.zh-CN.md +7 -3
- package/dist/commands/hermes-file-transfer-outcome.d.ts +18 -0
- package/dist/commands/hermes-file-transfer-outcome.js +40 -0
- package/dist/commands/hermes-file-transfer-outcome.js.map +1 -0
- package/dist/commands/send-file.js +39 -33
- package/dist/commands/send-file.js.map +1 -1
- package/dist/core/command-types.d.ts +5 -0
- package/dist/core/relay/chat-payload.js +32 -22
- package/dist/core/relay/chat-payload.js.map +1 -1
- package/dist/core/relay/file-upload.d.ts +3 -0
- package/dist/core/relay/file-upload.js +4 -0
- package/dist/core/relay/file-upload.js.map +1 -1
- package/dist/core/relay/mobile-chat-run-bridge.d.ts +53 -8
- package/dist/core/relay/mobile-chat-run-bridge.js +45 -0
- package/dist/core/relay/mobile-chat-run-bridge.js.map +1 -1
- package/dist/core/relay/office-payload.js +54 -22
- package/dist/core/relay/office-payload.js.map +1 -1
- package/dist/core/relay/source-commit.d.ts +41 -0
- package/dist/core/relay/source-commit.js +118 -0
- package/dist/core/relay/source-commit.js.map +1 -0
- package/dist/core/relay/timeline-event-builder.d.ts +6 -0
- package/dist/core/relay/timeline-event-builder.js +3 -0
- package/dist/core/relay/timeline-event-builder.js.map +1 -1
- package/dist/core/relay/timeline-event-log.d.ts +29 -0
- package/dist/core/relay/timeline-event-log.js +37 -0
- package/dist/core/relay/timeline-event-log.js.map +1 -1
- package/dist/core/relay/timeline-projection-v3.d.ts +63 -0
- package/dist/core/relay/timeline-projection-v3.js +87 -0
- package/dist/core/relay/timeline-projection-v3.js.map +1 -0
- package/dist/hermes/hermes-relay-manager.js +3 -0
- package/dist/hermes/hermes-relay-manager.js.map +1 -1
- package/dist/hermes/hermes-runtime-test-support.d.ts +3 -3
- package/dist/hermes/hermes-runtime-test-support.js +12 -6
- package/dist/hermes/hermes-runtime-test-support.js.map +1 -1
- package/dist/hermes/runtime/hermes-file-transfer-state.d.ts +33 -0
- package/dist/hermes/runtime/hermes-file-transfer-state.js +139 -0
- package/dist/hermes/runtime/hermes-file-transfer-state.js.map +1 -0
- package/dist/hermes/runtime/hermes-mobile-file-route-store.d.ts +17 -0
- package/dist/hermes/runtime/hermes-mobile-file-route-store.js +103 -0
- package/dist/hermes/runtime/hermes-mobile-file-route-store.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-api-client.d.ts +1 -0
- package/dist/hermes/runtime/hermes-runtime-api-client.js +16 -0
- package/dist/hermes/runtime/hermes-runtime-api-client.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-chat.d.ts +35 -4
- package/dist/hermes/runtime/hermes-runtime-chat.js +426 -51
- package/dist/hermes/runtime/hermes-runtime-chat.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-command-router.js +9 -1
- package/dist/hermes/runtime/hermes-runtime-command-router.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-cron.d.ts +1 -0
- package/dist/hermes/runtime/hermes-runtime-cron.js +34 -66
- package/dist/hermes/runtime/hermes-runtime-cron.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-history-completion.d.ts +8 -1
- package/dist/hermes/runtime/hermes-runtime-history-completion.js +112 -41
- package/dist/hermes/runtime/hermes-runtime-history-completion.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-history.js +92 -17
- package/dist/hermes/runtime/hermes-runtime-history.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-models.js +4 -1
- package/dist/hermes/runtime/hermes-runtime-models.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-process.js +4 -3
- package/dist/hermes/runtime/hermes-runtime-process.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-state-db.d.ts +6 -0
- package/dist/hermes/runtime/hermes-runtime-state-db.js +20 -1
- package/dist/hermes/runtime/hermes-runtime-state-db.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-tool-log-watcher.js +12 -20
- package/dist/hermes/runtime/hermes-runtime-tool-log-watcher.js.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/openclaw/config/provider-config.js +4 -1
- package/dist/openclaw/config/provider-config.js.map +1 -1
- package/dist/openclaw/relay/agent-identity-helpers.d.ts +9 -0
- package/dist/openclaw/relay/agent-identity-helpers.js +118 -0
- package/dist/openclaw/relay/agent-identity-helpers.js.map +1 -0
- package/dist/openclaw/relay/assistant-media-sidecar.d.ts +28 -1
- package/dist/openclaw/relay/assistant-media-sidecar.js +270 -10
- package/dist/openclaw/relay/assistant-media-sidecar.js.map +1 -1
- package/dist/openclaw/relay/chat-history.d.ts +37 -2
- package/dist/openclaw/relay/chat-history.js +570 -49
- package/dist/openclaw/relay/chat-history.js.map +1 -1
- package/dist/openclaw/relay/chat-run-identity.js +3 -1
- package/dist/openclaw/relay/chat-run-identity.js.map +1 -1
- package/dist/openclaw/relay/gateway-history-projection.d.ts +4 -0
- package/dist/openclaw/relay/gateway-history-projection.js +67 -0
- package/dist/openclaw/relay/gateway-history-projection.js.map +1 -0
- package/dist/openclaw/relay/openclaw-active-run-state.d.ts +67 -0
- package/dist/openclaw/relay/openclaw-active-run-state.js +283 -0
- package/dist/openclaw/relay/openclaw-active-run-state.js.map +1 -0
- package/dist/openclaw/relay/openclaw-message-tool-real-shape.fixture.d.ts +12 -0
- package/dist/openclaw/relay/openclaw-message-tool-real-shape.fixture.js +48 -0
- package/dist/openclaw/relay/openclaw-message-tool-real-shape.fixture.js.map +1 -0
- package/dist/openclaw/relay/openclaw-source-commit-watcher.d.ts +22 -0
- package/dist/openclaw/relay/openclaw-source-commit-watcher.js +64 -0
- package/dist/openclaw/relay/openclaw-source-commit-watcher.js.map +1 -0
- package/dist/openclaw/relay/outgoing-media-relay.d.ts +35 -1
- package/dist/openclaw/relay/outgoing-media-relay.js +541 -123
- package/dist/openclaw/relay/outgoing-media-relay.js.map +1 -1
- package/dist/openclaw/relay/relay-manager-history-timing.d.ts +1 -4
- package/dist/openclaw/relay/relay-manager-history-timing.js +4 -4
- package/dist/openclaw/relay/relay-manager-history-timing.js.map +1 -1
- package/dist/openclaw/relay/relay-manager-payload-helpers.d.ts +28 -1
- package/dist/openclaw/relay/relay-manager-payload-helpers.js +219 -11
- package/dist/openclaw/relay/relay-manager-payload-helpers.js.map +1 -1
- package/dist/openclaw/relay/session-context.d.ts +15 -0
- package/dist/openclaw/relay/session-context.js +48 -4
- package/dist/openclaw/relay/session-context.js.map +1 -1
- package/dist/openclaw/relay/source-commit-projection.d.ts +25 -0
- package/dist/openclaw/relay/source-commit-projection.js +140 -0
- package/dist/openclaw/relay/source-commit-projection.js.map +1 -0
- package/dist/openclaw/relay/transcript-dedupe.js +11 -42
- package/dist/openclaw/relay/transcript-dedupe.js.map +1 -1
- package/dist/openclaw/relay-manager.js +329 -131
- package/dist/openclaw/relay-manager.js.map +1 -1
- package/dist/openclaw/runtime/local-runtime.js +4 -2
- package/dist/openclaw/runtime/local-runtime.js.map +1 -1
- package/package.json +1 -1
- package/dist/openclaw/session-store.d.ts +0 -6
- package/dist/openclaw/session-store.js +0 -231
- package/dist/openclaw/session-store.js.map +0 -1
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import { canonicalizeOpenClawSessionScope, } from "./session-context.js";
|
|
1
2
|
const OPENCLAW_ASSISTANT_MEDIA_IDEMPOTENCY_SUFFIX = ":assistant-media";
|
|
3
|
+
const OPENCLAW_MESSAGE_TOOL_IDEMPOTENCY_MARKER = ":message-tool:";
|
|
2
4
|
/**
|
|
3
5
|
* OpenClaw persists automatic outgoing media as a second assistant record whose
|
|
4
6
|
* idempotency key explicitly names its parent run. The desktop UI projects the
|
|
5
7
|
* pair as one activity; mobile history must use the same stable relation.
|
|
6
8
|
*/
|
|
7
|
-
export function normalizeOpenClawAssistantMediaSidecars(messages, fallbackSessionKey) {
|
|
9
|
+
export function normalizeOpenClawAssistantMediaSidecars(messages, fallbackSessionKey, options) {
|
|
10
|
+
const materialized = materializeOpenClawDisplayContent(messages);
|
|
11
|
+
messages = materialized.messages;
|
|
8
12
|
const candidatesByScopeAndRun = new Map();
|
|
9
13
|
const messagesById = new Map();
|
|
10
14
|
const sidecars = [];
|
|
@@ -12,7 +16,7 @@ export function normalizeOpenClawAssistantMediaSidecars(messages, fallbackSessio
|
|
|
12
16
|
const message = asRecord(messages[index]);
|
|
13
17
|
if (!message || message.role !== "assistant")
|
|
14
18
|
continue;
|
|
15
|
-
const scope = messageSessionScope(message, fallbackSessionKey);
|
|
19
|
+
const scope = messageSessionScope(message, fallbackSessionKey, options?.sessionDefaults);
|
|
16
20
|
const messageId = firstString(message.id, message.messageId, message.message_id);
|
|
17
21
|
if (messageId && !messagesById.has(messageId)) {
|
|
18
22
|
messagesById.set(messageId, { index, message });
|
|
@@ -38,7 +42,7 @@ export function normalizeOpenClawAssistantMediaSidecars(messages, fallbackSessio
|
|
|
38
42
|
candidatesByScopeAndRun.set(key, candidates);
|
|
39
43
|
}
|
|
40
44
|
if (sidecars.length === 0)
|
|
41
|
-
return { messages, changed:
|
|
45
|
+
return { messages, changed: materialized.changed };
|
|
42
46
|
const mergedByIndex = new Map();
|
|
43
47
|
const suppressedIndexes = new Set();
|
|
44
48
|
const processedSidecarKeys = new Set();
|
|
@@ -46,13 +50,15 @@ export function normalizeOpenClawAssistantMediaSidecars(messages, fallbackSessio
|
|
|
46
50
|
const explicitParent = sidecar.parentId ? messagesById.get(sidecar.parentId) : undefined;
|
|
47
51
|
const candidates = explicitParent
|
|
48
52
|
? [explicitParent]
|
|
49
|
-
:
|
|
53
|
+
: options?.projectionVersion === 3
|
|
54
|
+
? undefined
|
|
55
|
+
: candidatesByScopeAndRun.get(`${sidecar.scope}\u0000${sidecar.runId}`);
|
|
50
56
|
// An ambiguous or incomplete relation is deliberately preserved. We never
|
|
51
57
|
// infer a parent by matching text, time, position, or a "latest" message.
|
|
52
58
|
if (!candidates || candidates.length !== 1)
|
|
53
59
|
continue;
|
|
54
60
|
const parent = candidates[0];
|
|
55
|
-
if (messageSessionScope(parent.message, fallbackSessionKey) !== sidecar.scope ||
|
|
61
|
+
if (messageSessionScope(parent.message, fallbackSessionKey, options?.sessionDefaults) !== sidecar.scope ||
|
|
56
62
|
(normalAssistantRunId(parent.message) && normalAssistantRunId(parent.message) !== sidecar.runId))
|
|
57
63
|
continue;
|
|
58
64
|
const sidecarKey = `${sidecar.scope}\u0000${sidecar.runId}`;
|
|
@@ -68,7 +74,136 @@ export function normalizeOpenClawAssistantMediaSidecars(messages, fallbackSessio
|
|
|
68
74
|
processedSidecarKeys.add(sidecarKey);
|
|
69
75
|
}
|
|
70
76
|
if (suppressedIndexes.size === 0)
|
|
71
|
-
return { messages, changed:
|
|
77
|
+
return { messages, changed: materialized.changed };
|
|
78
|
+
return {
|
|
79
|
+
messages: messages.flatMap((message, index) => {
|
|
80
|
+
if (suppressedIndexes.has(index))
|
|
81
|
+
return [];
|
|
82
|
+
return [mergedByIndex.get(index) ?? message];
|
|
83
|
+
}),
|
|
84
|
+
changed: true,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* OpenClaw's message(media) tool persists each delivered file as a separate
|
|
89
|
+
* assistant record. Its idempotency key names both the source run and exact
|
|
90
|
+
* tool call. Concurrent calls may finish in any order, so restore the original
|
|
91
|
+
* tool-call order before folding them into the turn's visible assistant reply.
|
|
92
|
+
*/
|
|
93
|
+
export function normalizeOpenClawAutomaticMediaReplies(messages, fallbackSessionKey, options) {
|
|
94
|
+
const materialized = materializeOpenClawDisplayContent(messages);
|
|
95
|
+
messages = materialized.messages;
|
|
96
|
+
// A message-tool delivery is a source row in the transcript, not a media
|
|
97
|
+
// fragment of the final assistant row. In projection v3 it stays visible
|
|
98
|
+
// (and gets its own sourceMessageId), but a replay of the same exact tool
|
|
99
|
+
// call is still projected only once. Distinct tool calls remain distinct,
|
|
100
|
+
// even when they reference the same file.
|
|
101
|
+
if (options?.projectionVersion === 3) {
|
|
102
|
+
const seenRelations = new Set();
|
|
103
|
+
let changed = materialized.changed;
|
|
104
|
+
const deduped = messages.filter((message) => {
|
|
105
|
+
const record = asRecord(message);
|
|
106
|
+
const relation = record ? extractOpenClawMessageToolRelation(record) : undefined;
|
|
107
|
+
const scope = record
|
|
108
|
+
? messageSessionScope(record, fallbackSessionKey, options.sessionDefaults)
|
|
109
|
+
: undefined;
|
|
110
|
+
if (!relation || !scope)
|
|
111
|
+
return true;
|
|
112
|
+
const relationKey = `${scope}\u0000${relation.sourceRunId}\u0000${relation.toolCallId}`;
|
|
113
|
+
if (seenRelations.has(relationKey)) {
|
|
114
|
+
changed = true;
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
seenRelations.add(relationKey);
|
|
118
|
+
return true;
|
|
119
|
+
});
|
|
120
|
+
return { messages: changed ? deduped : messages, changed };
|
|
121
|
+
}
|
|
122
|
+
const runs = new Map();
|
|
123
|
+
const automaticReplies = [];
|
|
124
|
+
for (let index = 0; index < messages.length; index += 1) {
|
|
125
|
+
const message = asRecord(messages[index]);
|
|
126
|
+
if (!message || message.role !== "assistant")
|
|
127
|
+
continue;
|
|
128
|
+
const scope = messageSessionScope(message, fallbackSessionKey, options?.sessionDefaults);
|
|
129
|
+
if (!scope)
|
|
130
|
+
continue;
|
|
131
|
+
const relation = automaticMediaReplyRelation(message);
|
|
132
|
+
const media = mediaContentBlocks(message.content);
|
|
133
|
+
if (relation && media.length > 0) {
|
|
134
|
+
const identity = firstString(message.idempotencyKey, message.idempotency_key, message.messageId, message.message_id, message.id);
|
|
135
|
+
// A source-run relationship without the sidecar's own stable identity
|
|
136
|
+
// cannot be deduplicated safely during transcript replay.
|
|
137
|
+
if (identity) {
|
|
138
|
+
automaticReplies.push({ index, message, ...relation, scope, identity });
|
|
139
|
+
}
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const runId = normalAssistantRunId(message);
|
|
143
|
+
if (!runId)
|
|
144
|
+
continue;
|
|
145
|
+
const key = `${scope}\u0000${runId}`;
|
|
146
|
+
const run = runs.get(key) ?? {
|
|
147
|
+
parents: [],
|
|
148
|
+
toolCallOrder: new Map(),
|
|
149
|
+
ambiguousToolCallIds: new Set(),
|
|
150
|
+
nextToolCallOrder: 0,
|
|
151
|
+
};
|
|
152
|
+
run.parents.push({ index, message });
|
|
153
|
+
for (const toolCallId of messageToolCallIds(message.content)) {
|
|
154
|
+
if (run.toolCallOrder.has(toolCallId)) {
|
|
155
|
+
run.ambiguousToolCallIds.add(toolCallId);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
run.toolCallOrder.set(toolCallId, run.nextToolCallOrder);
|
|
159
|
+
run.nextToolCallOrder += 1;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
runs.set(key, run);
|
|
163
|
+
}
|
|
164
|
+
if (automaticReplies.length === 0)
|
|
165
|
+
return { messages, changed: materialized.changed };
|
|
166
|
+
const mergedByIndex = new Map();
|
|
167
|
+
const suppressedIndexes = new Set();
|
|
168
|
+
const processedReplies = new Set();
|
|
169
|
+
const repliesByRun = new Map();
|
|
170
|
+
for (const reply of automaticReplies) {
|
|
171
|
+
const key = `${reply.scope}\u0000${reply.sourceRunId}`;
|
|
172
|
+
const replies = repliesByRun.get(key) ?? [];
|
|
173
|
+
replies.push(reply);
|
|
174
|
+
repliesByRun.set(key, replies);
|
|
175
|
+
}
|
|
176
|
+
for (const [key, replies] of repliesByRun.entries()) {
|
|
177
|
+
const run = runs.get(key);
|
|
178
|
+
const parent = run ? selectAutomaticMediaParent(run.parents) : undefined;
|
|
179
|
+
if (!run || !parent)
|
|
180
|
+
continue;
|
|
181
|
+
const uniqueReplies = replies.filter((reply) => {
|
|
182
|
+
const replayKey = reply.toolCallId
|
|
183
|
+
? `${key}\u0000tool-call\u0000${reply.toolCallId}`
|
|
184
|
+
: `${key}\u0000identity\u0000${reply.identity}`;
|
|
185
|
+
if (processedReplies.has(replayKey)) {
|
|
186
|
+
suppressedIndexes.add(reply.index);
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
processedReplies.add(replayKey);
|
|
190
|
+
return true;
|
|
191
|
+
});
|
|
192
|
+
const canRestoreToolCallOrder = uniqueReplies.length > 0 && uniqueReplies.every((reply) => (Boolean(reply.toolCallId)
|
|
193
|
+
&& !run.ambiguousToolCallIds.has(reply.toolCallId)
|
|
194
|
+
&& run.toolCallOrder.has(reply.toolCallId)));
|
|
195
|
+
const orderedReplies = canRestoreToolCallOrder
|
|
196
|
+
? [...uniqueReplies].sort((left, right) => (run.toolCallOrder.get(left.toolCallId) - run.toolCallOrder.get(right.toolCallId)))
|
|
197
|
+
: uniqueReplies;
|
|
198
|
+
let currentParent = mergedByIndex.get(parent.index) ?? parent.message;
|
|
199
|
+
for (const reply of orderedReplies) {
|
|
200
|
+
currentParent = mergeAssistantMediaSidecar(currentParent, reply.message);
|
|
201
|
+
suppressedIndexes.add(reply.index);
|
|
202
|
+
}
|
|
203
|
+
mergedByIndex.set(parent.index, currentParent);
|
|
204
|
+
}
|
|
205
|
+
if (suppressedIndexes.size === 0)
|
|
206
|
+
return { messages, changed: materialized.changed };
|
|
72
207
|
return {
|
|
73
208
|
messages: messages.flatMap((message, index) => {
|
|
74
209
|
if (suppressedIndexes.has(index))
|
|
@@ -95,6 +230,26 @@ export function canonicalizeOpenClawAssistantMediaSidecarPayload(payload) {
|
|
|
95
230
|
return payload;
|
|
96
231
|
return { ...record, runId: sidecarRunId, turnId: sidecarRunId };
|
|
97
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Materialize the media projection on a live chat event as canonical message
|
|
235
|
+
* content. OpenClaw's delivery mirror can expose the image only through
|
|
236
|
+
* `openclawDisplayContent`; Control UI renders that field, while Relay clients
|
|
237
|
+
* consume `message.content`.
|
|
238
|
+
*/
|
|
239
|
+
export function materializeOpenClawDisplayContentPayload(payload) {
|
|
240
|
+
const record = asRecord(payload);
|
|
241
|
+
if (!record)
|
|
242
|
+
return payload;
|
|
243
|
+
const message = asRecord(record.message);
|
|
244
|
+
if (message) {
|
|
245
|
+
const materialized = materializeOpenClawDisplayContent([message]);
|
|
246
|
+
if (!materialized.changed)
|
|
247
|
+
return payload;
|
|
248
|
+
return { ...record, message: materialized.messages[0] };
|
|
249
|
+
}
|
|
250
|
+
const materialized = materializeOpenClawDisplayContent([record]);
|
|
251
|
+
return materialized.changed ? materialized.messages[0] : payload;
|
|
252
|
+
}
|
|
98
253
|
/** True only for the documented OpenClaw automatic-media sidecar identity. */
|
|
99
254
|
export function isOpenClawAssistantMediaSidecarPayload(payload) {
|
|
100
255
|
const record = asRecord(payload);
|
|
@@ -104,11 +259,64 @@ export function isOpenClawAssistantMediaSidecarPayload(payload) {
|
|
|
104
259
|
}
|
|
105
260
|
function mergeAssistantMediaSidecar(parent, sidecar) {
|
|
106
261
|
const parentContent = normalizeContentBlocks(parent.content);
|
|
107
|
-
const sidecarMedia =
|
|
262
|
+
const sidecarMedia = mediaContentBlocks(sidecar.content);
|
|
108
263
|
return sidecarMedia.length === 0
|
|
109
264
|
? parent
|
|
110
265
|
: { ...parent, content: [...parentContent, ...sidecarMedia] };
|
|
111
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* OpenClaw's delivery-mirror transcript rows keep media-only output in
|
|
269
|
+
* `openclawDisplayContent` while leaving protocol `content` empty. The
|
|
270
|
+
* desktop Control UI renders that display projection directly, but Relay and
|
|
271
|
+
* mobile clients consume canonical content blocks. Promote only media display
|
|
272
|
+
* blocks here, before sidecar folding and outgoing-media upload, so the same
|
|
273
|
+
* transcript event has one portable representation across clients.
|
|
274
|
+
*/
|
|
275
|
+
function materializeOpenClawDisplayContent(messages) {
|
|
276
|
+
let changed = false;
|
|
277
|
+
const nextMessages = messages.map((message) => {
|
|
278
|
+
const record = asRecord(message);
|
|
279
|
+
if (!record || record.role !== "assistant" || !Array.isArray(record.openclawDisplayContent)) {
|
|
280
|
+
return message;
|
|
281
|
+
}
|
|
282
|
+
const displayMedia = record.openclawDisplayContent.filter(isDisplayMediaBlock);
|
|
283
|
+
if (displayMedia.length === 0)
|
|
284
|
+
return message;
|
|
285
|
+
const content = normalizeContentBlocks(record.content);
|
|
286
|
+
const existingMediaKeys = new Set(mediaContentBlocks(content).map(mediaContentIdentity).filter((key) => Boolean(key)));
|
|
287
|
+
const additions = displayMedia.filter((block) => {
|
|
288
|
+
const key = mediaContentIdentity(block);
|
|
289
|
+
// Only suppress a display block already represented by protocol content.
|
|
290
|
+
// Do not update this set while walking displayMedia: two display entries
|
|
291
|
+
// with the same identity can be intentional repeated sends.
|
|
292
|
+
return !key || !existingMediaKeys.has(key);
|
|
293
|
+
});
|
|
294
|
+
if (additions.length === 0)
|
|
295
|
+
return message;
|
|
296
|
+
changed = true;
|
|
297
|
+
return { ...record, content: [...content, ...additions] };
|
|
298
|
+
});
|
|
299
|
+
return { messages: changed ? nextMessages : messages, changed };
|
|
300
|
+
}
|
|
301
|
+
function isDisplayMediaBlock(block) {
|
|
302
|
+
const record = asRecord(block);
|
|
303
|
+
if (!record)
|
|
304
|
+
return false;
|
|
305
|
+
const type = firstString(record.type)?.toLowerCase();
|
|
306
|
+
if (!type || !["image", "file", "audio", "voice", "video"].includes(type))
|
|
307
|
+
return false;
|
|
308
|
+
return Boolean(firstString(record.url, record.openUrl, record.downloadUrl, record.downloadPath, record.download_path, record.artifactId, record.attachmentId, record.fileId));
|
|
309
|
+
}
|
|
310
|
+
function mediaContentIdentity(block) {
|
|
311
|
+
const record = asRecord(block);
|
|
312
|
+
if (!record)
|
|
313
|
+
return undefined;
|
|
314
|
+
const value = firstString(record.url, record.openUrl, record.downloadUrl, record.downloadPath, record.download_path, record.artifactId, record.attachmentId, record.fileId);
|
|
315
|
+
return value ? `${firstString(record.type)?.toLowerCase() ?? "media"}\u0000${value}` : undefined;
|
|
316
|
+
}
|
|
317
|
+
function mediaContentBlocks(content) {
|
|
318
|
+
return normalizeContentBlocks(content).filter((block) => !isTextContentBlock(block));
|
|
319
|
+
}
|
|
112
320
|
function normalizeContentBlocks(content) {
|
|
113
321
|
if (Array.isArray(content))
|
|
114
322
|
return content;
|
|
@@ -119,15 +327,67 @@ function isTextContentBlock(block) {
|
|
|
119
327
|
const type = typeof record?.type === "string" ? record.type.trim().toLowerCase() : "";
|
|
120
328
|
return type === "text" || type === "input_text" || type === "output_text";
|
|
121
329
|
}
|
|
122
|
-
function messageSessionScope(message, fallbackSessionKey) {
|
|
123
|
-
return firstString(message.sessionKey, message.sessionId, fallbackSessionKey);
|
|
330
|
+
function messageSessionScope(message, fallbackSessionKey, sessionDefaults) {
|
|
331
|
+
return canonicalizeOpenClawSessionScope(firstString(message.sessionKey, message.sessionId, fallbackSessionKey), sessionDefaults);
|
|
124
332
|
}
|
|
125
333
|
function normalAssistantRunId(message) {
|
|
126
334
|
const idempotencyKey = firstString(message.idempotencyKey, message.idempotency_key);
|
|
127
|
-
|
|
335
|
+
const metadata = asRecord(message.__openclaw);
|
|
336
|
+
return firstString(message.runId, message.run_id, message.turnId, message.turn_id, metadata?.runId, metadata?.run_id, idempotencyKey && !assistantMediaSidecarRunId(idempotencyKey)
|
|
128
337
|
? normalizeOpenClawRunId(idempotencyKey)
|
|
129
338
|
: undefined);
|
|
130
339
|
}
|
|
340
|
+
function automaticMediaReplySourceRunId(message) {
|
|
341
|
+
const metadata = asRecord(message.__openclaw);
|
|
342
|
+
return firstString(message.sourceRunId, message.source_run_id, metadata?.sourceRunId, metadata?.source_run_id);
|
|
343
|
+
}
|
|
344
|
+
export function extractOpenClawMessageToolRelation(message) {
|
|
345
|
+
const explicitSourceRunId = automaticMediaReplySourceRunId(message);
|
|
346
|
+
const explicitToolCallId = firstString(message.toolCallId, message.tool_call_id, message.sourceToolCallId, message.source_tool_call_id);
|
|
347
|
+
if (explicitSourceRunId && explicitToolCallId) {
|
|
348
|
+
return { sourceRunId: explicitSourceRunId, toolCallId: explicitToolCallId };
|
|
349
|
+
}
|
|
350
|
+
const idempotencyKey = firstString(message.idempotencyKey, message.idempotency_key, asRecord(message.__openclaw)?.idempotencyKey, asRecord(message.__openclaw)?.idempotency_key);
|
|
351
|
+
const markerIndex = idempotencyKey?.indexOf(OPENCLAW_MESSAGE_TOOL_IDEMPOTENCY_MARKER) ?? -1;
|
|
352
|
+
if (!idempotencyKey || markerIndex <= 0) {
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
const sourceRunId = idempotencyKey.slice(0, markerIndex).trim();
|
|
356
|
+
const suffix = idempotencyKey.slice(markerIndex + OPENCLAW_MESSAGE_TOOL_IDEMPOTENCY_MARKER.length);
|
|
357
|
+
const toolCallId = suffix.slice(suffix.lastIndexOf(":") + 1).trim();
|
|
358
|
+
if (!sourceRunId || !toolCallId || (explicitSourceRunId && explicitSourceRunId !== sourceRunId)) {
|
|
359
|
+
return undefined;
|
|
360
|
+
}
|
|
361
|
+
return { sourceRunId, toolCallId };
|
|
362
|
+
}
|
|
363
|
+
function automaticMediaReplyRelation(message) {
|
|
364
|
+
const relation = extractOpenClawMessageToolRelation(message);
|
|
365
|
+
if (relation)
|
|
366
|
+
return relation;
|
|
367
|
+
const explicitSourceRunId = automaticMediaReplySourceRunId(message);
|
|
368
|
+
return explicitSourceRunId ? { sourceRunId: explicitSourceRunId } : undefined;
|
|
369
|
+
}
|
|
370
|
+
function messageToolCallIds(content) {
|
|
371
|
+
if (!Array.isArray(content))
|
|
372
|
+
return [];
|
|
373
|
+
const calls = [];
|
|
374
|
+
for (const contentBlock of content) {
|
|
375
|
+
const block = asRecord(contentBlock);
|
|
376
|
+
const type = firstString(block?.type)?.toLowerCase();
|
|
377
|
+
const name = firstString(block?.name, block?.toolName, block?.tool_name)?.toLowerCase();
|
|
378
|
+
const id = firstString(block?.id, block?.toolCallId, block?.tool_call_id);
|
|
379
|
+
if (id && name === "message" && ["toolcall", "tool_call", "tool-use", "tooluse"].includes(type ?? "")) {
|
|
380
|
+
calls.push(id);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return calls;
|
|
384
|
+
}
|
|
385
|
+
function selectAutomaticMediaParent(parents) {
|
|
386
|
+
const textParents = parents.filter(({ message }) => normalizeContentBlocks(message.content).some(isTextContentBlock));
|
|
387
|
+
if (textParents.length === 1)
|
|
388
|
+
return textParents[0];
|
|
389
|
+
return parents.length === 1 ? parents[0] : undefined;
|
|
390
|
+
}
|
|
131
391
|
function assistantMediaSidecarRunId(idempotencyKey) {
|
|
132
392
|
if (!idempotencyKey?.endsWith(OPENCLAW_ASSISTANT_MEDIA_IDEMPOTENCY_SUFFIX))
|
|
133
393
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-media-sidecar.js","sourceRoot":"","sources":["../../../src/openclaw/relay/assistant-media-sidecar.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assistant-media-sidecar.js","sourceRoot":"","sources":["../../../src/openclaw/relay/assistant-media-sidecar.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { CanonicalTimelineHistorySnapshotPage } from "../../core/relay/timeline-event-log.js";
|
|
1
|
+
import type { CanonicalTimelineHistorySnapshotPage, TimelineContentBlock } from "../../core/relay/timeline-event-log.js";
|
|
2
2
|
import { type GatewaySessionDefaults } from "./session-context.js";
|
|
3
|
+
import { type SourceCommit } from "../../core/relay/source-commit.js";
|
|
3
4
|
export type HistoryMessage = {
|
|
4
5
|
[key: string]: unknown;
|
|
5
6
|
id?: string;
|
|
@@ -28,7 +29,13 @@ export type HistoryResponse = {
|
|
|
28
29
|
hasMore?: boolean;
|
|
29
30
|
nextCursor?: string;
|
|
30
31
|
newestCursor?: string;
|
|
32
|
+
projectionVersion?: 3;
|
|
31
33
|
timelineSnapshot?: CanonicalTimelineHistorySnapshotPage;
|
|
34
|
+
/** Internal source-range metadata used by the source-commit watcher. */
|
|
35
|
+
sourceReadThroughSeq?: number;
|
|
36
|
+
sourceRangeStartSeq?: number;
|
|
37
|
+
sourceRangeHasGap?: boolean;
|
|
38
|
+
sourceHasMore?: boolean;
|
|
32
39
|
};
|
|
33
40
|
export type ChatHistoryOutcome = {
|
|
34
41
|
kind: "final";
|
|
@@ -48,10 +55,21 @@ export type TranscriptHistoryRequest = {
|
|
|
48
55
|
sessionKey: string;
|
|
49
56
|
sessionId?: string;
|
|
50
57
|
transcriptPath: string;
|
|
58
|
+
/** Internal Relay identity; never forwarded to OpenClaw's wire API. */
|
|
59
|
+
projectionGatewayId?: string;
|
|
51
60
|
limit?: unknown;
|
|
52
61
|
cursor?: unknown;
|
|
53
62
|
direction?: unknown;
|
|
63
|
+
projectionVersion?: 3;
|
|
64
|
+
sessionDefaults?: GatewaySessionDefaults;
|
|
54
65
|
};
|
|
66
|
+
/**
|
|
67
|
+
* Read the durable OpenClaw SQLite watermark for one session. This is a
|
|
68
|
+
* source-commit signal only; callers must not use it to derive message ids or
|
|
69
|
+
* reorder rows. It intentionally returns null when the authoritative SQLite
|
|
70
|
+
* source is not available so the caller can use the native gateway stream.
|
|
71
|
+
*/
|
|
72
|
+
export declare function readOpenClawSourceCommitCursor(rawParams: unknown, defaults: GatewaySessionDefaults): SourceCommit | null;
|
|
55
73
|
export declare function clearTranscriptHistoryCache(): void;
|
|
56
74
|
export declare function readOpenClawTranscriptChatHistory(rawParams: unknown, defaults: GatewaySessionDefaults): Promise<HistoryResponse | null>;
|
|
57
75
|
export declare function readChatHistoryFromTranscriptFile(request: TranscriptHistoryRequest): Promise<HistoryResponse>;
|
|
@@ -65,6 +83,9 @@ export declare function readChatHistoryFromTranscriptFile(request: TranscriptHis
|
|
|
65
83
|
export declare function canonicalizeOpenClawGatewayHistoryResponse(history: HistoryResponse, request: {
|
|
66
84
|
sessionKey: string;
|
|
67
85
|
cursor?: string;
|
|
86
|
+
projectionVersion?: 3;
|
|
87
|
+
projectionGatewayId?: string;
|
|
88
|
+
sessionDefaults?: GatewaySessionDefaults;
|
|
68
89
|
}): HistoryResponse;
|
|
69
90
|
/**
|
|
70
91
|
* OpenClaw 会把内部心跳探测写入 transcript。只有精确的保留提示最终得到纯确认回执时,
|
|
@@ -72,5 +93,19 @@ export declare function canonicalizeOpenClawGatewayHistoryResponse(history: Hist
|
|
|
72
93
|
*/
|
|
73
94
|
export declare function filterOpenClawHeartbeatArtifacts<T extends HistoryMessage>(messages: T[]): T[];
|
|
74
95
|
export declare function filterOpenClawHeartbeatHistoryResponse(history: HistoryResponse): HistoryResponse;
|
|
75
|
-
export declare function extractHistoryOutcome(history: HistoryResponse | undefined, context: ChatRunContext): ChatHistoryOutcome;
|
|
96
|
+
export declare function extractHistoryOutcome(history: HistoryResponse | undefined, context: ChatRunContext, preferredText?: string): ChatHistoryOutcome;
|
|
97
|
+
/**
|
|
98
|
+
* Return all media delivery rows belonging to the matched OpenClaw turn.
|
|
99
|
+
* A provider may emit only the first image on the live terminal while the
|
|
100
|
+
* remaining message-tool deliveries are committed to history. This helper
|
|
101
|
+
* keeps the user-turn boundary as the only scope and never matches by text.
|
|
102
|
+
*/
|
|
103
|
+
export declare function extractHistoryMediaContent(history: HistoryResponse | undefined, context: ChatRunContext): TimelineContentBlock[];
|
|
104
|
+
/**
|
|
105
|
+
* Collect media rows only when the provider gives an explicit parent edge.
|
|
106
|
+
* v3 message-tool rows remain independent canonical messages; this helper is
|
|
107
|
+
* solely for an outgoing terminal payload that deliberately owns its child
|
|
108
|
+
* sidecars, and never falls back to run/client/text/time matching.
|
|
109
|
+
*/
|
|
110
|
+
export declare function extractExplicitParentMediaContent(history: HistoryResponse | undefined, parentMessage: HistoryMessage | undefined): TimelineContentBlock[];
|
|
76
111
|
export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, label: string): Promise<T>;
|