clawconnect-agent 0.1.6 → 0.1.8

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 (216) hide show
  1. package/README.md +142 -34
  2. package/README.zh-CN.md +152 -44
  3. package/dist/commands/install.js +10 -4
  4. package/dist/commands/install.js.map +1 -1
  5. package/dist/commands/pair.d.ts +6 -0
  6. package/dist/commands/pair.js +78 -10
  7. package/dist/commands/pair.js.map +1 -1
  8. package/dist/commands/run.js +14 -17
  9. package/dist/commands/run.js.map +1 -1
  10. package/dist/commands/send-file.d.ts +3 -24
  11. package/dist/commands/send-file.js +22 -449
  12. package/dist/commands/send-file.js.map +1 -1
  13. package/dist/commands/status.d.ts +13 -1
  14. package/dist/commands/status.js +58 -15
  15. package/dist/commands/status.js.map +1 -1
  16. package/dist/config/config.d.ts +6 -11
  17. package/dist/config/config.js +19 -48
  18. package/dist/config/config.js.map +1 -1
  19. package/dist/config/env.d.ts +1 -1
  20. package/dist/config/env.js +4 -5
  21. package/dist/config/env.js.map +1 -1
  22. package/dist/config/profile.d.ts +11 -0
  23. package/dist/config/profile.js +80 -0
  24. package/dist/config/profile.js.map +1 -0
  25. package/dist/core/command-types.d.ts +18 -0
  26. package/dist/core/command-types.js +2 -0
  27. package/dist/core/command-types.js.map +1 -0
  28. package/dist/core/relay/attachment-staging.js.map +1 -0
  29. package/dist/{relay → core/relay}/chat-payload.js +17 -3
  30. package/dist/core/relay/chat-payload.js.map +1 -0
  31. package/dist/{commands/send-file-utils.js → core/relay/file-upload-utils.js} +1 -1
  32. package/dist/core/relay/file-upload-utils.js.map +1 -0
  33. package/dist/core/relay/file-upload.d.ts +40 -0
  34. package/dist/core/relay/file-upload.js +401 -0
  35. package/dist/core/relay/file-upload.js.map +1 -0
  36. package/dist/core/relay/mobile-chat-run-bridge.d.ts +201 -0
  37. package/dist/core/relay/mobile-chat-run-bridge.js +192 -0
  38. package/dist/core/relay/mobile-chat-run-bridge.js.map +1 -0
  39. package/dist/core/relay/office-payload.js.map +1 -0
  40. package/dist/core/relay/reconnect.js.map +1 -0
  41. package/dist/core/relay/relay-server-connection.d.ts +6 -0
  42. package/dist/core/relay/relay-server-connection.js +32 -0
  43. package/dist/core/relay/relay-server-connection.js.map +1 -0
  44. package/dist/core/relay/slash-command-types.d.ts +7 -0
  45. package/dist/core/relay/slash-command-types.js +2 -0
  46. package/dist/core/relay/slash-command-types.js.map +1 -0
  47. package/dist/core/relay/timeline-event-builder.d.ts +86 -0
  48. package/dist/core/relay/timeline-event-builder.js +199 -0
  49. package/dist/core/relay/timeline-event-builder.js.map +1 -0
  50. package/dist/core/relay/timeline-event-log.d.ts +81 -0
  51. package/dist/core/relay/timeline-event-log.js +254 -0
  52. package/dist/core/relay/timeline-event-log.js.map +1 -0
  53. package/dist/core/relay/voice-input.d.ts +11 -0
  54. package/dist/core/relay/voice-input.js +120 -0
  55. package/dist/core/relay/voice-input.js.map +1 -0
  56. package/dist/gateway-profiles.d.ts +8 -0
  57. package/dist/gateway-profiles.js +24 -0
  58. package/dist/gateway-profiles.js.map +1 -0
  59. package/dist/hermes/hermes-relay-manager.d.ts +59 -0
  60. package/dist/hermes/hermes-relay-manager.js +754 -0
  61. package/dist/hermes/hermes-relay-manager.js.map +1 -0
  62. package/dist/hermes/hermes-runtime.d.ts +9 -0
  63. package/dist/hermes/hermes-runtime.js +9 -0
  64. package/dist/hermes/hermes-runtime.js.map +1 -0
  65. package/dist/hermes/hermes-session-store.d.ts +15 -0
  66. package/dist/hermes/hermes-session-store.js +174 -0
  67. package/dist/hermes/hermes-session-store.js.map +1 -0
  68. package/dist/hermes/hermes-voice-input.d.ts +13 -0
  69. package/dist/hermes/hermes-voice-input.js +27 -0
  70. package/dist/hermes/hermes-voice-input.js.map +1 -0
  71. package/dist/hermes/runtime/hermes-runtime-artifacts.d.ts +3 -0
  72. package/dist/hermes/runtime/hermes-runtime-artifacts.js +65 -0
  73. package/dist/hermes/runtime/hermes-runtime-artifacts.js.map +1 -0
  74. package/dist/hermes/runtime/hermes-runtime-backups.d.ts +5 -0
  75. package/dist/hermes/runtime/hermes-runtime-backups.js +128 -0
  76. package/dist/hermes/runtime/hermes-runtime-backups.js.map +1 -0
  77. package/dist/hermes/runtime/hermes-runtime-chat.d.ts +41 -0
  78. package/dist/hermes/runtime/hermes-runtime-chat.js +723 -0
  79. package/dist/hermes/runtime/hermes-runtime-chat.js.map +1 -0
  80. package/dist/hermes/runtime/hermes-runtime-command-router.d.ts +2 -0
  81. package/dist/hermes/runtime/hermes-runtime-command-router.js +96 -0
  82. package/dist/hermes/runtime/hermes-runtime-command-router.js.map +1 -0
  83. package/dist/hermes/runtime/hermes-runtime-command-utils.d.ts +3 -0
  84. package/dist/hermes/runtime/hermes-runtime-command-utils.js +19 -0
  85. package/dist/hermes/runtime/hermes-runtime-command-utils.js.map +1 -0
  86. package/dist/hermes/runtime/hermes-runtime-cron.d.ts +11 -0
  87. package/dist/hermes/runtime/hermes-runtime-cron.js +301 -0
  88. package/dist/hermes/runtime/hermes-runtime-cron.js.map +1 -0
  89. package/dist/hermes/runtime/hermes-runtime-history.d.ts +2 -0
  90. package/dist/hermes/runtime/hermes-runtime-history.js +249 -0
  91. package/dist/hermes/runtime/hermes-runtime-history.js.map +1 -0
  92. package/dist/hermes/runtime/hermes-runtime-lifecycle.d.ts +9 -0
  93. package/dist/hermes/runtime/hermes-runtime-lifecycle.js +111 -0
  94. package/dist/hermes/runtime/hermes-runtime-lifecycle.js.map +1 -0
  95. package/dist/hermes/runtime/hermes-runtime-models.d.ts +29 -0
  96. package/dist/hermes/runtime/hermes-runtime-models.js +125 -0
  97. package/dist/hermes/runtime/hermes-runtime-models.js.map +1 -0
  98. package/dist/hermes/runtime/hermes-runtime-process.d.ts +24 -0
  99. package/dist/hermes/runtime/hermes-runtime-process.js +147 -0
  100. package/dist/hermes/runtime/hermes-runtime-process.js.map +1 -0
  101. package/dist/hermes/runtime/hermes-runtime-sessions.d.ts +5 -0
  102. package/dist/hermes/runtime/hermes-runtime-sessions.js +88 -0
  103. package/dist/hermes/runtime/hermes-runtime-sessions.js.map +1 -0
  104. package/dist/hermes/runtime/hermes-runtime-skills.d.ts +13 -0
  105. package/dist/hermes/runtime/hermes-runtime-skills.js +322 -0
  106. package/dist/hermes/runtime/hermes-runtime-skills.js.map +1 -0
  107. package/dist/hermes/runtime/hermes-runtime-types.d.ts +19 -0
  108. package/dist/hermes/runtime/hermes-runtime-types.js +2 -0
  109. package/dist/hermes/runtime/hermes-runtime-types.js.map +1 -0
  110. package/dist/hermes/runtime/hermes-runtime-usage.d.ts +22 -0
  111. package/dist/hermes/runtime/hermes-runtime-usage.js +211 -0
  112. package/dist/hermes/runtime/hermes-runtime-usage.js.map +1 -0
  113. package/dist/hermes/runtime/hermes-runtime-values.d.ts +14 -0
  114. package/dist/hermes/runtime/hermes-runtime-values.js +105 -0
  115. package/dist/hermes/runtime/hermes-runtime-values.js.map +1 -0
  116. package/dist/i18n/index.js +4 -0
  117. package/dist/i18n/index.js.map +1 -1
  118. package/dist/index.js +115 -9
  119. package/dist/index.js.map +1 -1
  120. package/dist/openclaw/backups/backup-manager.js.map +1 -0
  121. package/dist/{commands → openclaw/config}/provider-config.js +1 -1
  122. package/dist/openclaw/config/provider-config.js.map +1 -0
  123. package/dist/openclaw/config/provider-registry.js.map +1 -0
  124. package/dist/{relay → openclaw}/gateway-client.js +4 -3
  125. package/dist/openclaw/gateway-client.js.map +1 -0
  126. package/dist/{commands → openclaw/handlers}/local-handlers.d.ts +1 -1
  127. package/dist/{commands → openclaw/handlers}/local-handlers.js +2 -30
  128. package/dist/openclaw/handlers/local-handlers.js.map +1 -0
  129. package/dist/{commands → openclaw/handlers}/provider-handlers.d.ts +1 -1
  130. package/dist/{commands → openclaw/handlers}/provider-handlers.js +3 -3
  131. package/dist/openclaw/handlers/provider-handlers.js.map +1 -0
  132. package/dist/openclaw/relay/chat-history.d.ts +51 -0
  133. package/dist/openclaw/relay/chat-history.js +347 -0
  134. package/dist/openclaw/relay/chat-history.js.map +1 -0
  135. package/dist/{relay → openclaw/relay}/chat-send-attachments.js +12 -1
  136. package/dist/openclaw/relay/chat-send-attachments.js.map +1 -0
  137. package/dist/openclaw/relay/openclaw-voice-input.d.ts +13 -0
  138. package/dist/openclaw/relay/openclaw-voice-input.js +18 -0
  139. package/dist/openclaw/relay/openclaw-voice-input.js.map +1 -0
  140. package/dist/openclaw/relay/outgoing-media-relay.d.ts +11 -0
  141. package/dist/openclaw/relay/outgoing-media-relay.js +120 -0
  142. package/dist/openclaw/relay/outgoing-media-relay.js.map +1 -0
  143. package/dist/{relay → openclaw/relay}/session-context.d.ts +6 -0
  144. package/dist/{relay → openclaw/relay}/session-context.js +53 -3
  145. package/dist/openclaw/relay/session-context.js.map +1 -0
  146. package/dist/openclaw/relay/slash-command-catalog.d.ts +2 -0
  147. package/dist/{relay → openclaw/relay}/slash-command-catalog.generated.d.ts +0 -5
  148. package/dist/{relay → openclaw/relay}/slash-command-catalog.generated.js +0 -6
  149. package/dist/openclaw/relay/slash-command-catalog.generated.js.map +1 -0
  150. package/dist/openclaw/relay/slash-command-catalog.js.map +1 -0
  151. package/dist/openclaw/relay/transcript-dedupe.d.ts +21 -0
  152. package/dist/openclaw/relay/transcript-dedupe.js +211 -0
  153. package/dist/openclaw/relay/transcript-dedupe.js.map +1 -0
  154. package/dist/{relay → openclaw}/relay-manager.d.ts +1 -4
  155. package/dist/openclaw/relay-manager.js +787 -0
  156. package/dist/openclaw/relay-manager.js.map +1 -0
  157. package/dist/{commands → openclaw/runtime}/local-runtime.d.ts +1 -17
  158. package/dist/openclaw/runtime/local-runtime.js.map +1 -0
  159. package/dist/openclaw/session-store.d.ts +1 -0
  160. package/dist/openclaw/session-store.js +70 -0
  161. package/dist/openclaw/session-store.js.map +1 -0
  162. package/dist/platform/service-manager-common.d.ts +5 -2
  163. package/dist/platform/service-manager-common.js +18 -7
  164. package/dist/platform/service-manager-common.js.map +1 -1
  165. package/dist/platform/service-manager.d.ts +16 -5
  166. package/dist/platform/service-manager.js +85 -50
  167. package/dist/platform/service-manager.js.map +1 -1
  168. package/dist/runtime-adapters.d.ts +19 -0
  169. package/dist/runtime-adapters.js +39 -0
  170. package/dist/runtime-adapters.js.map +1 -0
  171. package/package.json +3 -3
  172. package/dist/commands/backup-manager.js.map +0 -1
  173. package/dist/commands/local-handlers.js.map +0 -1
  174. package/dist/commands/local-runtime.js.map +0 -1
  175. package/dist/commands/provider-config.js.map +0 -1
  176. package/dist/commands/provider-handlers.js.map +0 -1
  177. package/dist/commands/provider-registry.js.map +0 -1
  178. package/dist/commands/send-file-utils.js.map +0 -1
  179. package/dist/commands/voice-reply.d.ts +0 -39
  180. package/dist/commands/voice-reply.js +0 -329
  181. package/dist/commands/voice-reply.js.map +0 -1
  182. package/dist/relay/attachment-staging.js.map +0 -1
  183. package/dist/relay/chat-history.d.ts +0 -29
  184. package/dist/relay/chat-history.js +0 -69
  185. package/dist/relay/chat-history.js.map +0 -1
  186. package/dist/relay/chat-payload.js.map +0 -1
  187. package/dist/relay/chat-send-attachments.js.map +0 -1
  188. package/dist/relay/gateway-client.js.map +0 -1
  189. package/dist/relay/office-payload.js.map +0 -1
  190. package/dist/relay/reconnect.js.map +0 -1
  191. package/dist/relay/relay-manager.js +0 -644
  192. package/dist/relay/relay-manager.js.map +0 -1
  193. package/dist/relay/session-context.js.map +0 -1
  194. package/dist/relay/slash-command-catalog.d.ts +0 -8
  195. package/dist/relay/slash-command-catalog.generated.js.map +0 -1
  196. package/dist/relay/slash-command-catalog.js.map +0 -1
  197. package/dist/relay/voice-reply-preference.d.ts +0 -25
  198. package/dist/relay/voice-reply-preference.js +0 -103
  199. package/dist/relay/voice-reply-preference.js.map +0 -1
  200. /package/dist/{relay → core/relay}/attachment-staging.d.ts +0 -0
  201. /package/dist/{relay → core/relay}/attachment-staging.js +0 -0
  202. /package/dist/{relay → core/relay}/chat-payload.d.ts +0 -0
  203. /package/dist/{commands/send-file-utils.d.ts → core/relay/file-upload-utils.d.ts} +0 -0
  204. /package/dist/{relay → core/relay}/office-payload.d.ts +0 -0
  205. /package/dist/{relay → core/relay}/office-payload.js +0 -0
  206. /package/dist/{relay → core/relay}/reconnect.d.ts +0 -0
  207. /package/dist/{relay → core/relay}/reconnect.js +0 -0
  208. /package/dist/{commands → openclaw/backups}/backup-manager.d.ts +0 -0
  209. /package/dist/{commands → openclaw/backups}/backup-manager.js +0 -0
  210. /package/dist/{commands → openclaw/config}/provider-config.d.ts +0 -0
  211. /package/dist/{commands → openclaw/config}/provider-registry.d.ts +0 -0
  212. /package/dist/{commands → openclaw/config}/provider-registry.js +0 -0
  213. /package/dist/{relay → openclaw}/gateway-client.d.ts +0 -0
  214. /package/dist/{relay → openclaw/relay}/chat-send-attachments.d.ts +0 -0
  215. /package/dist/{relay → openclaw/relay}/slash-command-catalog.js +0 -0
  216. /package/dist/{commands → openclaw/runtime}/local-runtime.js +0 -0
@@ -0,0 +1,347 @@
1
+ import { readFile, stat } from "fs/promises";
2
+ import { resolveOpenClawSessionTranscript, } from "./session-context.js";
3
+ const DEFAULT_TRANSCRIPT_HISTORY_LIMIT = 100;
4
+ const MAX_TRANSCRIPT_HISTORY_LIMIT = 200;
5
+ const CURSOR_PREFIX = "seq:";
6
+ const transcriptHistoryCache = new Map();
7
+ export function clearTranscriptHistoryCache() {
8
+ transcriptHistoryCache.clear();
9
+ }
10
+ export async function readOpenClawTranscriptChatHistory(rawParams, defaults) {
11
+ const params = normalizeTranscriptHistoryParams(rawParams, defaults.mainSessionKey);
12
+ const transcript = await resolveOpenClawSessionTranscript(params.sessionKey, defaults);
13
+ if (!transcript) {
14
+ return null;
15
+ }
16
+ return readChatHistoryFromTranscriptFile({
17
+ sessionKey: transcript.sessionKey,
18
+ sessionId: transcript.sessionId,
19
+ transcriptPath: transcript.logPath,
20
+ limit: params.limit,
21
+ cursor: params.cursor,
22
+ direction: params.direction,
23
+ });
24
+ }
25
+ export async function readChatHistoryFromTranscriptFile(request) {
26
+ const messages = await readIndexedTranscriptMessages(request.transcriptPath);
27
+ const limit = normalizeHistoryLimit(request.limit);
28
+ const direction = normalizeHistoryDirection(request.direction);
29
+ const cursorSeq = parseHistoryCursorSeq(request.cursor);
30
+ const page = paginateHistoryMessages(messages, {
31
+ limit,
32
+ direction,
33
+ cursorSeq,
34
+ });
35
+ return {
36
+ sessionKey: request.sessionKey,
37
+ ...(request.sessionId ? { sessionId: request.sessionId } : {}),
38
+ messages: page.messages,
39
+ hasMore: page.hasMore,
40
+ ...(page.nextCursor ? { nextCursor: page.nextCursor } : {}),
41
+ ...(page.newestCursor ? { newestCursor: page.newestCursor } : {}),
42
+ };
43
+ }
44
+ function normalizeTranscriptHistoryParams(rawParams, fallbackSessionKey) {
45
+ const record = isRecord(rawParams) ? rawParams : {};
46
+ const sessionKey = typeof record.sessionKey === "string" && record.sessionKey.trim().length > 0
47
+ ? record.sessionKey.trim()
48
+ : fallbackSessionKey;
49
+ const cursor = normalizeCursor(record.cursor);
50
+ return {
51
+ sessionKey,
52
+ limit: normalizeHistoryLimit(record.limit),
53
+ ...(cursor ? { cursor } : {}),
54
+ direction: normalizeHistoryDirection(record.direction),
55
+ };
56
+ }
57
+ async function readIndexedTranscriptMessages(transcriptPath) {
58
+ const stats = await stat(transcriptPath);
59
+ const cached = transcriptHistoryCache.get(transcriptPath);
60
+ if (cached && cached.size === stats.size && cached.mtimeMs === stats.mtimeMs) {
61
+ return cached.messages;
62
+ }
63
+ const raw = await readFile(transcriptPath, "utf8");
64
+ const messages = [];
65
+ for (const line of raw.split(/\n+/)) {
66
+ const trimmed = line.trim();
67
+ if (!trimmed) {
68
+ continue;
69
+ }
70
+ const message = parseTranscriptHistoryLine(trimmed, messages.length + 1);
71
+ if (message) {
72
+ messages.push(message);
73
+ }
74
+ }
75
+ transcriptHistoryCache.set(transcriptPath, {
76
+ size: stats.size,
77
+ mtimeMs: stats.mtimeMs,
78
+ messages,
79
+ });
80
+ return messages;
81
+ }
82
+ function parseTranscriptHistoryLine(line, seq) {
83
+ let parsed;
84
+ try {
85
+ parsed = JSON.parse(line);
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ if (!isRecord(parsed) || parsed.type !== "message") {
91
+ return null;
92
+ }
93
+ const rawMessage = isRecord(parsed.message) ? parsed.message : undefined;
94
+ if (!rawMessage) {
95
+ return null;
96
+ }
97
+ const message = { ...rawMessage, seq };
98
+ if (typeof message.id !== "string" || message.id.trim().length === 0) {
99
+ const id = typeof parsed.id === "string" && parsed.id.trim().length > 0 ? parsed.id.trim() : `transcript-${seq}`;
100
+ message.id = id;
101
+ }
102
+ const timestamp = normalizeHistoryTimestamp(message.timestamp ?? parsed.timestamp);
103
+ if (timestamp !== undefined) {
104
+ message.timestamp = timestamp;
105
+ }
106
+ const createdAt = normalizeHistoryCreatedAt(parsed.timestamp ?? message.timestamp);
107
+ if (createdAt && (typeof message.createdAt !== "string" || message.createdAt.trim().length === 0)) {
108
+ message.createdAt = createdAt;
109
+ }
110
+ return message;
111
+ }
112
+ function paginateHistoryMessages(messages, opts) {
113
+ if (messages.length === 0) {
114
+ return { messages: [], hasMore: false };
115
+ }
116
+ if (opts.direction === "newer") {
117
+ const startIndex = opts.cursorSeq === undefined
118
+ ? Math.max(0, messages.length - opts.limit)
119
+ : firstIndexAfterSeq(messages, opts.cursorSeq);
120
+ const page = messages.slice(startIndex, startIndex + opts.limit);
121
+ return {
122
+ messages: page,
123
+ hasMore: startIndex + page.length < messages.length,
124
+ ...(lastMessageSeq(page) ? { newestCursor: formatHistoryCursor(lastMessageSeq(page)) } : {}),
125
+ };
126
+ }
127
+ const endExclusive = resolveOlderEndExclusive(messages, opts.cursorSeq);
128
+ const start = Math.max(0, endExclusive - opts.limit);
129
+ const page = messages.slice(start, endExclusive);
130
+ const firstSeq = firstMessageSeq(page);
131
+ const newestSeq = lastMessageSeq(page);
132
+ return {
133
+ messages: page,
134
+ hasMore: start > 0,
135
+ ...(start > 0 && firstSeq ? { nextCursor: formatHistoryCursor(firstSeq) } : {}),
136
+ ...(newestSeq ? { newestCursor: formatHistoryCursor(newestSeq) } : {}),
137
+ };
138
+ }
139
+ function resolveOlderEndExclusive(messages, cursorSeq) {
140
+ if (cursorSeq === undefined) {
141
+ return messages.length;
142
+ }
143
+ const newestSeq = messageSeq(messages[messages.length - 1]);
144
+ if (newestSeq !== undefined && cursorSeq > newestSeq) {
145
+ return messages.length;
146
+ }
147
+ const index = messages.findIndex((message) => {
148
+ const seq = messageSeq(message);
149
+ return seq !== undefined && seq >= cursorSeq;
150
+ });
151
+ return index === -1 ? messages.length : Math.max(0, index);
152
+ }
153
+ function firstIndexAfterSeq(messages, cursorSeq) {
154
+ const index = messages.findIndex((message) => {
155
+ const seq = messageSeq(message);
156
+ return seq !== undefined && seq > cursorSeq;
157
+ });
158
+ return index === -1 ? messages.length : index;
159
+ }
160
+ function normalizeHistoryLimit(value) {
161
+ const parsed = typeof value === "number" && Number.isFinite(value)
162
+ ? Math.round(value)
163
+ : typeof value === "string" && value.trim().length > 0
164
+ ? Number.parseInt(value.trim(), 10)
165
+ : DEFAULT_TRANSCRIPT_HISTORY_LIMIT;
166
+ if (!Number.isFinite(parsed)) {
167
+ return DEFAULT_TRANSCRIPT_HISTORY_LIMIT;
168
+ }
169
+ return Math.max(1, Math.min(MAX_TRANSCRIPT_HISTORY_LIMIT, parsed));
170
+ }
171
+ function normalizeHistoryDirection(value) {
172
+ return value === "newer" ? "newer" : "older";
173
+ }
174
+ function normalizeCursor(value) {
175
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
176
+ }
177
+ function parseHistoryCursorSeq(value) {
178
+ const cursor = normalizeCursor(value);
179
+ if (!cursor) {
180
+ return undefined;
181
+ }
182
+ const raw = cursor.startsWith(CURSOR_PREFIX) ? cursor.slice(CURSOR_PREFIX.length) : cursor;
183
+ const parsed = Number.parseInt(raw, 10);
184
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
185
+ }
186
+ function formatHistoryCursor(seq) {
187
+ return `${CURSOR_PREFIX}${seq}`;
188
+ }
189
+ function firstMessageSeq(messages) {
190
+ return messageSeq(messages[0]);
191
+ }
192
+ function lastMessageSeq(messages) {
193
+ return messageSeq(messages[messages.length - 1]);
194
+ }
195
+ function messageSeq(message) {
196
+ const raw = message?.seq;
197
+ return typeof raw === "number" && Number.isFinite(raw) && raw > 0 ? Math.round(raw) : undefined;
198
+ }
199
+ function normalizeHistoryTimestamp(value) {
200
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
201
+ return Math.round(value > 10_000_000_000 ? value : value * 1000);
202
+ }
203
+ if (typeof value === "string" && value.trim().length > 0) {
204
+ const numeric = Number(value.trim());
205
+ if (Number.isFinite(numeric) && numeric > 0) {
206
+ return Math.round(numeric > 10_000_000_000 ? numeric : numeric * 1000);
207
+ }
208
+ const parsed = Date.parse(value.trim());
209
+ if (Number.isFinite(parsed) && parsed > 0) {
210
+ return Math.round(parsed);
211
+ }
212
+ }
213
+ return undefined;
214
+ }
215
+ function normalizeHistoryCreatedAt(value) {
216
+ const timestamp = normalizeHistoryTimestamp(value);
217
+ return timestamp === undefined ? undefined : new Date(timestamp).toISOString();
218
+ }
219
+ function isRecord(value) {
220
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
221
+ }
222
+ export function extractHistoryOutcome(history, context) {
223
+ const messages = history?.messages ?? [];
224
+ if (messages.length === 0) {
225
+ return null;
226
+ }
227
+ const userIndex = findHistoryUserIndex(messages, context);
228
+ if (userIndex === -1) {
229
+ return null;
230
+ }
231
+ if (hasUnresolvedUserBefore(messages, userIndex)) {
232
+ return null;
233
+ }
234
+ let latestError = null;
235
+ for (let index = userIndex + 1; index < messages.length; index += 1) {
236
+ const message = messages[index];
237
+ if (message.role === "user") {
238
+ return null;
239
+ }
240
+ if (message.role !== "assistant") {
241
+ continue;
242
+ }
243
+ const text = extractHistoryMessageText(message);
244
+ if (text.length > 0 || hasHistoryMessageContent(message)) {
245
+ return { kind: "final", text, message };
246
+ }
247
+ if (typeof message.errorMessage === "string" &&
248
+ message.errorMessage.trim().length > 0 &&
249
+ (message.stopReason === "error" || !message.stopReason)) {
250
+ latestError = message.errorMessage.trim();
251
+ }
252
+ }
253
+ return latestError ? { kind: "error", errorMessage: latestError } : null;
254
+ }
255
+ function hasUnresolvedUserBefore(messages, userIndex) {
256
+ for (let index = userIndex - 1; index >= 0; index -= 1) {
257
+ const role = messages[index]?.role;
258
+ if (role === "assistant") {
259
+ return false;
260
+ }
261
+ if (role === "user") {
262
+ return true;
263
+ }
264
+ }
265
+ return false;
266
+ }
267
+ export async function withTimeout(promise, timeoutMs, label) {
268
+ return await new Promise((resolve, reject) => {
269
+ const timer = setTimeout(() => reject(new Error(`${label} timeout after ${timeoutMs}ms`)), timeoutMs);
270
+ promise
271
+ .then((value) => {
272
+ clearTimeout(timer);
273
+ resolve(value);
274
+ })
275
+ .catch((error) => {
276
+ clearTimeout(timer);
277
+ reject(error);
278
+ });
279
+ });
280
+ }
281
+ function extractHistoryMessageText(message) {
282
+ if (typeof message?.content === "string") {
283
+ return message.content.trim();
284
+ }
285
+ const content = Array.isArray(message?.content) ? message.content : [];
286
+ const parts = content
287
+ .filter((block) => block?.type === "text" && typeof block.text === "string")
288
+ .map((block) => block.text?.trim() ?? "")
289
+ .filter((text) => text.length > 0);
290
+ return parts.join("\n\n");
291
+ }
292
+ function hasHistoryMessageContent(message) {
293
+ const content = Array.isArray(message?.content) ? message.content : [];
294
+ return content.some((block) => {
295
+ if (!block || typeof block !== "object") {
296
+ return false;
297
+ }
298
+ const type = typeof block.type === "string" ? block.type.trim().toLowerCase() : "";
299
+ if (type === "text" || type === "markdown" || type === "output_text" || type === "input_text") {
300
+ return typeof block.text === "string" && block.text.trim().length > 0;
301
+ }
302
+ if (isToolOnlyHistoryBlockType(type)) {
303
+ return false;
304
+ }
305
+ return Object.entries(block).some(([key, value]) => {
306
+ if (key === "type") {
307
+ return false;
308
+ }
309
+ if (typeof value === "string") {
310
+ return value.trim().length > 0;
311
+ }
312
+ return value !== undefined && value !== null;
313
+ });
314
+ });
315
+ }
316
+ function isToolOnlyHistoryBlockType(type) {
317
+ return type === "tool_call"
318
+ || type === "tool_use"
319
+ || type === "tool_result"
320
+ || type === "function_call"
321
+ || type === "function_result"
322
+ || type === "computer_call"
323
+ || type === "computer_call_output";
324
+ }
325
+ function findHistoryUserIndex(messages, context) {
326
+ const normalizedPrompt = context.promptText?.trim();
327
+ const notBeforeMs = context.requestedAtMs - 1_000;
328
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
329
+ const message = messages[index];
330
+ if (message.role !== "user") {
331
+ continue;
332
+ }
333
+ const timestamp = typeof message.timestamp === "number" ? message.timestamp : Number.NaN;
334
+ if (Number.isFinite(timestamp) && timestamp < notBeforeMs) {
335
+ continue;
336
+ }
337
+ const text = extractHistoryMessageText(message);
338
+ if (!normalizedPrompt || historyUserTextMatches(text, normalizedPrompt)) {
339
+ return index;
340
+ }
341
+ }
342
+ return -1;
343
+ }
344
+ function historyUserTextMatches(text, normalizedPrompt) {
345
+ return text === normalizedPrompt || text.endsWith(normalizedPrompt);
346
+ }
347
+ //# sourceMappingURL=chat-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-history.js","sourceRoot":"","sources":["../../../src/openclaw/relay/chat-history.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,24 @@ import { randomUUID } from "crypto";
2
2
  import { mkdir, writeFile } from "fs/promises";
3
3
  import { homedir } from "os";
4
4
  import { join } from "path";
5
- import { buildAttachmentStagingPath, resolveAttachmentMimeType, } from "./attachment-staging.js";
5
+ import { buildAttachmentStagingPath, resolveAttachmentMimeType, } from "../../core/relay/attachment-staging.js";
6
6
  const DEFAULT_OUTBOUND_DIR = join(homedir(), ".openclaw", "media", "outbound");
7
+ const CLIENT_ONLY_CHAT_SEND_FIELDS = [
8
+ "runId",
9
+ "run_id",
10
+ "requestId",
11
+ "request_id",
12
+ "clientRunId",
13
+ "client_run_id",
14
+ ];
7
15
  export async function prepareChatSendParams(rawParams, options) {
8
16
  if (!rawParams || typeof rawParams !== "object" || Array.isArray(rawParams)) {
9
17
  return rawParams;
10
18
  }
11
19
  const params = { ...rawParams };
20
+ for (const key of CLIENT_ONLY_CHAT_SEND_FIELDS) {
21
+ delete params[key];
22
+ }
12
23
  params.deliver = false;
13
24
  const attachments = Array.isArray(params.attachments) ? params.attachments : [];
14
25
  if (attachments.length === 0) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-send-attachments.js","sourceRoot":"","sources":["../../../src/openclaw/relay/chat-send-attachments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAE1B,MAAM,wCAAwC,CAAC;AAEhD,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAC/E,MAAM,4BAA4B,GAAG;IACnC,OAAO;IACP,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,aAAa;IACb,eAAe;CACP,CAAC;AAYX,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAAkB,EAClB,OAGC;IAED,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAmB,EAAE,GAAI,SAAqC,EAAE,CAAC;IAC7E,KAAK,MAAM,GAAG,IAAI,4BAA4B,EAAE,CAAC;QAC/C,OAAQ,MAAkC,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;IAEvB,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,WAAwC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9G,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,oBAAoB,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC;IAC1C,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,IAAI,OAAO,UAAU,EAAE,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/E,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACzD,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,0BAA0B,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;YAClF,MAAM,QAAQ,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;YAEvD,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;YAEzD,cAAc,CAAC,IAAI,CAAC,oBAAoB,UAAU,KAAK,QAAQ,OAAO,UAAU,GAAG,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sCAAsC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { GatewaySessionDefaults } from "./session-context.js";
2
+ export type PreparedOpenClawVoiceInput = {
3
+ method: "chat.send";
4
+ params: unknown;
5
+ run: {
6
+ runId: string;
7
+ sessionKey: string;
8
+ };
9
+ };
10
+ export declare function prepareOpenClawVoiceInputCommand(params: unknown, options: {
11
+ requestId?: string;
12
+ sessionDefaults: GatewaySessionDefaults;
13
+ }): Promise<PreparedOpenClawVoiceInput>;
@@ -0,0 +1,18 @@
1
+ import { prepareVoiceSendParams } from "../../core/relay/voice-input.js";
2
+ export async function prepareOpenClawVoiceInputCommand(params, options) {
3
+ const voiceParamsRecord = params && typeof params === "object" && !Array.isArray(params)
4
+ ? params
5
+ : {};
6
+ const voiceSessionKey = typeof voiceParamsRecord.sessionKey === "string" && voiceParamsRecord.sessionKey.trim().length > 0
7
+ ? voiceParamsRecord.sessionKey.trim()
8
+ : options.sessionDefaults.mainSessionKey;
9
+ return {
10
+ method: "chat.send",
11
+ params: await prepareVoiceSendParams(params),
12
+ run: {
13
+ runId: options.requestId ?? `voice-${Date.now()}`,
14
+ sessionKey: voiceSessionKey,
15
+ },
16
+ };
17
+ }
18
+ //# sourceMappingURL=openclaw-voice-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-voice-input.js","sourceRoot":"","sources":["../../../src/openclaw/relay/openclaw-voice-input.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAWzE,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,MAAe,EACf,OAGC;IAED,MAAM,iBAAiB,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACtF,CAAC,CAAC,MAAiC;QACnC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,eAAe,GAAG,OAAO,iBAAiB,CAAC,UAAU,KAAK,QAAQ,IAAI,iBAAiB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACxH,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,EAAE;QACrC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC;IAE3C,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,MAAM,sBAAsB,CAAC,MAAM,CAAC;QAC5C,GAAG,EAAE;YACH,KAAK,EAAE,OAAO,CAAC,SAAS,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE;YACjD,UAAU,EAAE,eAAe;SAC5B;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type FileUploadResult } from "../../core/relay/file-upload.js";
2
+ export type OutgoingMediaRelayOptions = {
3
+ relayServerUrl: string;
4
+ relaySecret: string;
5
+ gatewayId: string;
6
+ senderDisplayName?: string;
7
+ recordsDir?: string;
8
+ cache?: Map<string, FileUploadResult>;
9
+ };
10
+ export declare function relayOutgoingMediaInPayload(payload: unknown, opts: OutgoingMediaRelayOptions): Promise<unknown>;
11
+ export declare function relayOutgoingMediaInHistoryResponse(response: unknown, opts: OutgoingMediaRelayOptions): Promise<unknown>;
@@ -0,0 +1,120 @@
1
+ import { readFile } from "fs/promises";
2
+ import { homedir } from "os";
3
+ import { join } from "path";
4
+ import { uploadFileToRelay } from "../../core/relay/file-upload.js";
5
+ const OUTGOING_MEDIA_RE = /\/api\/chat\/media\/outgoing\/[^/]+\/([^/]+)\/full(?:$|[?#])/;
6
+ export async function relayOutgoingMediaInPayload(payload, opts) {
7
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
8
+ return payload;
9
+ }
10
+ const message = payload.message;
11
+ if (!message || typeof message !== "object" || Array.isArray(message)) {
12
+ return payload;
13
+ }
14
+ const content = message.content;
15
+ if (!Array.isArray(content)) {
16
+ return payload;
17
+ }
18
+ let changed = false;
19
+ const nextContent = await Promise.all(content.map(async (block) => {
20
+ const nextBlock = await relayOutgoingMediaBlock(block, opts);
21
+ changed ||= nextBlock !== block;
22
+ return nextBlock;
23
+ }));
24
+ if (!changed) {
25
+ return payload;
26
+ }
27
+ return {
28
+ ...payload,
29
+ message: {
30
+ ...message,
31
+ content: nextContent,
32
+ },
33
+ };
34
+ }
35
+ export async function relayOutgoingMediaInHistoryResponse(response, opts) {
36
+ if (!response || typeof response !== "object" || Array.isArray(response)) {
37
+ return response;
38
+ }
39
+ const messages = response.messages;
40
+ if (!Array.isArray(messages)) {
41
+ return response;
42
+ }
43
+ let changed = false;
44
+ const nextMessages = await Promise.all(messages.map(async (message) => {
45
+ const wrapper = await relayOutgoingMediaInPayload({ message }, opts);
46
+ const nextMessage = wrapper.message ?? message;
47
+ changed ||= nextMessage !== message;
48
+ return nextMessage;
49
+ }));
50
+ return changed
51
+ ? { ...response, messages: nextMessages }
52
+ : response;
53
+ }
54
+ async function relayOutgoingMediaBlock(block, opts) {
55
+ if (!block || typeof block !== "object" || Array.isArray(block)) {
56
+ return block;
57
+ }
58
+ const source = block;
59
+ const url = firstString(source.url, source.openUrl, source.downloadUrl, source.download_path, source.downloadPath);
60
+ const attachmentId = outgoingAttachmentId(url);
61
+ if (!attachmentId) {
62
+ return block;
63
+ }
64
+ try {
65
+ const record = await readOutgoingMediaRecord(attachmentId, opts.recordsDir);
66
+ const filePath = record.original?.path?.trim();
67
+ const sessionKey = record.sessionKey?.trim();
68
+ if (!filePath || !sessionKey) {
69
+ return block;
70
+ }
71
+ const cacheKey = `${opts.gatewayId}:${sessionKey}:${attachmentId}`;
72
+ let upload = opts.cache?.get(cacheKey);
73
+ if (!upload) {
74
+ upload = await uploadFileToRelay({
75
+ relayServerUrl: opts.relayServerUrl,
76
+ relaySecret: opts.relaySecret,
77
+ gatewayId: opts.gatewayId,
78
+ sessionKey,
79
+ filePath,
80
+ senderDisplayName: opts.senderDisplayName,
81
+ });
82
+ opts.cache?.set(cacheKey, upload);
83
+ }
84
+ return {
85
+ ...source,
86
+ type: typeof source.type === "string" && source.type.trim() ? source.type : "image",
87
+ fileId: upload.fileId,
88
+ fileName: record.alt || upload.fileName,
89
+ mimeType: record.original?.contentType || upload.mimeType,
90
+ sizeBytes: record.original?.sizeBytes || upload.sizeBytes,
91
+ imageWidth: record.original?.width || upload.imageWidth,
92
+ imageHeight: record.original?.height || upload.imageHeight,
93
+ downloadUrl: upload.downloadPath,
94
+ downloadPath: upload.downloadPath,
95
+ expiresAt: upload.expiresAt,
96
+ gatewayId: upload.gatewayId,
97
+ sessionKey: upload.sessionKey,
98
+ };
99
+ }
100
+ catch (error) {
101
+ console.warn(`[relay] failed to publish outgoing media attachment ${attachmentId}: ${String(error)}`);
102
+ return block;
103
+ }
104
+ }
105
+ function outgoingAttachmentId(url) {
106
+ if (!url) {
107
+ return undefined;
108
+ }
109
+ const match = OUTGOING_MEDIA_RE.exec(url);
110
+ return match?.[1]?.trim() || undefined;
111
+ }
112
+ async function readOutgoingMediaRecord(attachmentId, recordsDir) {
113
+ const root = recordsDir ?? join(homedir(), ".openclaw", "media", "outgoing", "records");
114
+ const raw = await readFile(join(root, `${attachmentId}.json`), "utf8");
115
+ return JSON.parse(raw);
116
+ }
117
+ function firstString(...values) {
118
+ return values.find((value) => typeof value === "string" && value.trim().length > 0)?.trim();
119
+ }
120
+ //# sourceMappingURL=outgoing-media-relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outgoing-media-relay.js","sourceRoot":"","sources":["../../../src/openclaw/relay/outgoing-media-relay.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,14 @@ export type ContextUsageSnapshot = {
12
12
  totalTokens?: number;
13
13
  };
14
14
  export declare function buildContextUsageFingerprint(snapshot: ContextUsageSnapshot): string;
15
+ export type OpenClawSessionTranscript = {
16
+ sessionKey: string;
17
+ sessionId?: string;
18
+ logPath: string;
19
+ };
15
20
  export declare const DEFAULT_GATEWAY_SESSION_DEFAULTS: GatewaySessionDefaults;
16
21
  export declare function readContextUsageSnapshot(sessionKey: string, defaults: GatewaySessionDefaults): Promise<ContextUsageSnapshot | null>;
17
22
  export declare function extractGatewaySessionDefaults(rawPayload: unknown): GatewaySessionDefaults | null;
18
23
  export declare function canonicalizeSessionKey(rawValue: unknown, defaults: GatewaySessionDefaults): string | unknown;
19
24
  export declare function canonicalizeRelayParams(method: string, rawParams: unknown, defaults: GatewaySessionDefaults): unknown;
25
+ export declare function resolveOpenClawSessionTranscript(sessionKey: string, defaults: GatewaySessionDefaults): Promise<OpenClawSessionTranscript | null>;