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,81 @@
1
+ export declare const CANONICAL_TIMELINE_PROTOCOL_VERSION: 2;
2
+ export type TimelineEventType = "turn.user.created" | "message.part.delta" | "message.completed" | "run.completed" | "run.failed" | "run.aborted" | "history.snapshot.page" | "attachment.state.changed" | "tool.invocation.updated";
3
+ export type TimelineRole = "user" | "assistant" | "tool" | "system";
4
+ export type TimelineMessageState = "pending" | "streaming" | "completed" | "failed" | "aborted";
5
+ export type TimelineRunState = "inactive" | "active" | "completed" | "failed" | "aborted";
6
+ export type TimelineSource = "local" | "live" | "history" | "relay-legacy";
7
+ export type AttachmentState = "local_pending" | "uploading" | "uploaded" | "linked" | "available" | "expired" | "failed";
8
+ export type ToolState = "pending_approval" | "approved" | "denied" | "running" | "streaming_output" | "success" | "failed" | "cancelled";
9
+ export type TimelineContentBlock = Record<string, unknown> & {
10
+ type: string;
11
+ };
12
+ export type TimelineAttachment = Record<string, unknown> & {
13
+ attachmentId: string;
14
+ state: AttachmentState;
15
+ };
16
+ export type TimelineError = Record<string, unknown> & {
17
+ userMessage?: string;
18
+ code?: string;
19
+ };
20
+ export type CanonicalTimelineEvent = {
21
+ protocolVersion: 2;
22
+ eventId: string;
23
+ eventType: TimelineEventType;
24
+ gatewayId: string;
25
+ sessionKey: string;
26
+ turnId: string;
27
+ runId: string;
28
+ messageId: string;
29
+ partId: string;
30
+ attachmentId: string | null;
31
+ seq: number;
32
+ turnSeq: number;
33
+ role: TimelineRole;
34
+ messageState: TimelineMessageState;
35
+ runState: TimelineRunState;
36
+ createdAt: string;
37
+ source: TimelineSource;
38
+ content: TimelineContentBlock[];
39
+ attachment: TimelineAttachment | null;
40
+ error: TimelineError | null;
41
+ toolInvocationId?: string;
42
+ toolState?: ToolState;
43
+ extensions?: Record<string, unknown>;
44
+ };
45
+ export type TimelineHistoryMessage = {
46
+ turnId: string;
47
+ messageId: string;
48
+ role: TimelineRole;
49
+ messageState: TimelineMessageState;
50
+ createdAt: string;
51
+ content: TimelineContentBlock[];
52
+ partId?: string;
53
+ runId?: string;
54
+ };
55
+ export type CanonicalTimelineHistorySnapshotPage = {
56
+ protocolVersion: 2;
57
+ eventType: "history.snapshot.page";
58
+ gatewayId: string;
59
+ sessionKey: string;
60
+ source: TimelineSource;
61
+ cursor: string | null;
62
+ hasMore: boolean;
63
+ nextCursor: string | null;
64
+ newestCursor: string | null;
65
+ messages: TimelineHistoryMessage[];
66
+ attachments: TimelineAttachment[];
67
+ extensions?: Record<string, unknown>;
68
+ };
69
+ export declare function parseCanonicalTimelineEvent(input: unknown): CanonicalTimelineEvent;
70
+ export declare function isCanonicalTimelineEvent(input: unknown): input is CanonicalTimelineEvent;
71
+ export declare function parseCanonicalTimelineHistorySnapshotPage(input: unknown): CanonicalTimelineHistorySnapshotPage;
72
+ export declare function createTimelineIdempotencyTracker(): {
73
+ acceptEvent(input: Pick<CanonicalTimelineEvent, "eventId">): {
74
+ accepted: boolean;
75
+ reason?: string;
76
+ };
77
+ acceptPartSeq(input: Pick<CanonicalTimelineEvent, "messageId" | "partId" | "seq">): {
78
+ accepted: boolean;
79
+ reason?: string;
80
+ };
81
+ };
@@ -0,0 +1,254 @@
1
+ export const CANONICAL_TIMELINE_PROTOCOL_VERSION = 2;
2
+ const eventTypes = new Set([
3
+ "turn.user.created",
4
+ "message.part.delta",
5
+ "message.completed",
6
+ "run.completed",
7
+ "run.failed",
8
+ "run.aborted",
9
+ "history.snapshot.page",
10
+ "attachment.state.changed",
11
+ "tool.invocation.updated",
12
+ ]);
13
+ const roles = new Set(["user", "assistant", "tool", "system"]);
14
+ const messageStates = new Set([
15
+ "pending",
16
+ "streaming",
17
+ "completed",
18
+ "failed",
19
+ "aborted",
20
+ ]);
21
+ const runStates = new Set([
22
+ "inactive",
23
+ "active",
24
+ "completed",
25
+ "failed",
26
+ "aborted",
27
+ ]);
28
+ const sources = new Set(["local", "live", "history", "relay-legacy"]);
29
+ const canonicalEventFields = new Set([
30
+ "protocolVersion",
31
+ "eventId",
32
+ "eventType",
33
+ "gatewayId",
34
+ "sessionKey",
35
+ "turnId",
36
+ "runId",
37
+ "messageId",
38
+ "partId",
39
+ "attachmentId",
40
+ "seq",
41
+ "turnSeq",
42
+ "role",
43
+ "messageState",
44
+ "runState",
45
+ "createdAt",
46
+ "source",
47
+ "content",
48
+ "attachment",
49
+ "error",
50
+ "toolInvocationId",
51
+ "toolState",
52
+ ]);
53
+ const historyPageFields = new Set([
54
+ "protocolVersion",
55
+ "eventType",
56
+ "gatewayId",
57
+ "sessionKey",
58
+ "source",
59
+ "cursor",
60
+ "hasMore",
61
+ "nextCursor",
62
+ "newestCursor",
63
+ "messages",
64
+ "attachments",
65
+ ]);
66
+ function isRecord(value) {
67
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
68
+ }
69
+ function requiredString(record, field) {
70
+ const value = record[field];
71
+ if (typeof value !== "string" || value.length === 0) {
72
+ throw new Error(`Invalid canonical timeline event: missing ${field}`);
73
+ }
74
+ return value;
75
+ }
76
+ function requiredNumber(record, field) {
77
+ const value = record[field];
78
+ if (typeof value !== "number" || !Number.isFinite(value)) {
79
+ throw new Error(`Invalid canonical timeline event: missing ${field}`);
80
+ }
81
+ return value;
82
+ }
83
+ function parseContentBlocks(value) {
84
+ if (!Array.isArray(value)) {
85
+ throw new Error("Invalid canonical timeline event: content must be an array");
86
+ }
87
+ return value.map((block) => {
88
+ if (!isRecord(block) || typeof block.type !== "string" || block.type.length === 0) {
89
+ throw new Error("Invalid canonical timeline event: content block requires type");
90
+ }
91
+ return { ...block, type: block.type };
92
+ });
93
+ }
94
+ function parseNullableRecord(value, field) {
95
+ if (value === undefined || value === null) {
96
+ return null;
97
+ }
98
+ if (!isRecord(value)) {
99
+ throw new Error(`Invalid canonical timeline event: ${field} must be an object or null`);
100
+ }
101
+ return value;
102
+ }
103
+ function collectExtensions(record, knownFields) {
104
+ const extensions = {};
105
+ for (const [key, value] of Object.entries(record)) {
106
+ if (!knownFields.has(key)) {
107
+ extensions[key] = value;
108
+ }
109
+ }
110
+ return Object.keys(extensions).length > 0 ? extensions : undefined;
111
+ }
112
+ export function parseCanonicalTimelineEvent(input) {
113
+ if (!isRecord(input)) {
114
+ throw new Error("Invalid canonical timeline event: expected object");
115
+ }
116
+ if (input.protocolVersion !== CANONICAL_TIMELINE_PROTOCOL_VERSION) {
117
+ throw new Error("Invalid canonical timeline event: protocolVersion must be 2");
118
+ }
119
+ const eventType = requiredString(input, "eventType");
120
+ if (!eventTypes.has(eventType)) {
121
+ throw new Error(`Invalid canonical timeline event: unsupported eventType ${eventType}`);
122
+ }
123
+ const role = requiredString(input, "role");
124
+ if (!roles.has(role)) {
125
+ throw new Error(`Invalid canonical timeline event: unsupported role ${role}`);
126
+ }
127
+ const messageState = requiredString(input, "messageState");
128
+ if (!messageStates.has(messageState)) {
129
+ throw new Error(`Invalid canonical timeline event: unsupported messageState ${messageState}`);
130
+ }
131
+ const runState = requiredString(input, "runState");
132
+ if (!runStates.has(runState)) {
133
+ throw new Error(`Invalid canonical timeline event: unsupported runState ${runState}`);
134
+ }
135
+ const source = requiredString(input, "source");
136
+ if (!sources.has(source)) {
137
+ throw new Error(`Invalid canonical timeline event: unsupported source ${source}`);
138
+ }
139
+ return {
140
+ protocolVersion: CANONICAL_TIMELINE_PROTOCOL_VERSION,
141
+ eventId: requiredString(input, "eventId"),
142
+ eventType,
143
+ gatewayId: requiredString(input, "gatewayId"),
144
+ sessionKey: requiredString(input, "sessionKey"),
145
+ turnId: requiredString(input, "turnId"),
146
+ runId: requiredString(input, "runId"),
147
+ messageId: requiredString(input, "messageId"),
148
+ partId: requiredString(input, "partId"),
149
+ attachmentId: input.attachmentId === undefined || input.attachmentId === null
150
+ ? null
151
+ : requiredString(input, "attachmentId"),
152
+ seq: requiredNumber(input, "seq"),
153
+ turnSeq: requiredNumber(input, "turnSeq"),
154
+ role,
155
+ messageState,
156
+ runState,
157
+ createdAt: requiredString(input, "createdAt"),
158
+ source,
159
+ content: parseContentBlocks(input.content),
160
+ attachment: parseNullableRecord(input.attachment, "attachment"),
161
+ error: parseNullableRecord(input.error, "error"),
162
+ ...(typeof input.toolInvocationId === "string" ? { toolInvocationId: input.toolInvocationId } : {}),
163
+ ...(typeof input.toolState === "string" ? { toolState: input.toolState } : {}),
164
+ ...(collectExtensions(input, canonicalEventFields)
165
+ ? { extensions: collectExtensions(input, canonicalEventFields) }
166
+ : {}),
167
+ };
168
+ }
169
+ export function isCanonicalTimelineEvent(input) {
170
+ try {
171
+ parseCanonicalTimelineEvent(input);
172
+ return true;
173
+ }
174
+ catch {
175
+ return false;
176
+ }
177
+ }
178
+ function parseHistoryMessage(input) {
179
+ if (!isRecord(input)) {
180
+ throw new Error("Invalid canonical history snapshot page: message must be an object");
181
+ }
182
+ const role = requiredString(input, "role");
183
+ const messageState = requiredString(input, "messageState");
184
+ if (!roles.has(role) || !messageStates.has(messageState)) {
185
+ throw new Error("Invalid canonical history snapshot page: invalid message role/state");
186
+ }
187
+ return {
188
+ turnId: requiredString(input, "turnId"),
189
+ messageId: requiredString(input, "messageId"),
190
+ role,
191
+ messageState,
192
+ createdAt: requiredString(input, "createdAt"),
193
+ content: parseContentBlocks(input.content),
194
+ ...(typeof input.partId === "string" ? { partId: input.partId } : {}),
195
+ ...(typeof input.runId === "string" ? { runId: input.runId } : {}),
196
+ };
197
+ }
198
+ export function parseCanonicalTimelineHistorySnapshotPage(input) {
199
+ if (!isRecord(input)) {
200
+ throw new Error("Invalid canonical history snapshot page: expected object");
201
+ }
202
+ if (input.protocolVersion !== CANONICAL_TIMELINE_PROTOCOL_VERSION) {
203
+ throw new Error("Invalid canonical history snapshot page: protocolVersion must be 2");
204
+ }
205
+ if (input.eventType !== "history.snapshot.page") {
206
+ throw new Error("Invalid canonical history snapshot page: eventType must be history.snapshot.page");
207
+ }
208
+ const source = requiredString(input, "source");
209
+ if (!sources.has(source)) {
210
+ throw new Error(`Invalid canonical history snapshot page: unsupported source ${source}`);
211
+ }
212
+ if (!Array.isArray(input.messages)) {
213
+ throw new Error("Invalid canonical history snapshot page: messages must be an array");
214
+ }
215
+ const attachments = Array.isArray(input.attachments) ? input.attachments : [];
216
+ return {
217
+ protocolVersion: CANONICAL_TIMELINE_PROTOCOL_VERSION,
218
+ eventType: "history.snapshot.page",
219
+ gatewayId: requiredString(input, "gatewayId"),
220
+ sessionKey: requiredString(input, "sessionKey"),
221
+ source,
222
+ cursor: typeof input.cursor === "string" ? input.cursor : null,
223
+ hasMore: Boolean(input.hasMore),
224
+ nextCursor: typeof input.nextCursor === "string" ? input.nextCursor : null,
225
+ newestCursor: typeof input.newestCursor === "string" ? input.newestCursor : null,
226
+ messages: input.messages.map(parseHistoryMessage),
227
+ attachments: attachments.filter(isRecord),
228
+ ...(collectExtensions(input, historyPageFields)
229
+ ? { extensions: collectExtensions(input, historyPageFields) }
230
+ : {}),
231
+ };
232
+ }
233
+ export function createTimelineIdempotencyTracker() {
234
+ const eventIds = new Set();
235
+ const partSeqKeys = new Set();
236
+ return {
237
+ acceptEvent(input) {
238
+ if (eventIds.has(input.eventId)) {
239
+ return { accepted: false, reason: "duplicate_event_id" };
240
+ }
241
+ eventIds.add(input.eventId);
242
+ return { accepted: true };
243
+ },
244
+ acceptPartSeq(input) {
245
+ const key = `${input.messageId}\u0000${input.partId}\u0000${input.seq}`;
246
+ if (partSeqKeys.has(key)) {
247
+ return { accepted: false, reason: "duplicate_part_seq" };
248
+ }
249
+ partSeqKeys.add(key);
250
+ return { accepted: true };
251
+ },
252
+ };
253
+ }
254
+ //# sourceMappingURL=timeline-event-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-event-log.js","sourceRoot":"","sources":["../../../src/core/relay/timeline-event-log.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAU,CAAC;AAqG9D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAoB;IAC5C,mBAAmB;IACnB,oBAAoB;IACpB,mBAAmB;IACnB,eAAe;IACf,YAAY;IACZ,aAAa;IACb,uBAAuB;IACvB,0BAA0B;IAC1B,yBAAyB;CAC1B,CAAC,CAAC;AAEH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAe,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC7E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAuB;IAClD,SAAS;IACT,WAAW;IACX,WAAW;IACX,QAAQ;IACR,SAAS;CACV,CAAC,CAAC;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAmB;IAC1C,UAAU;IACV,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,SAAS;CACV,CAAC,CAAC;AACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;AAEtF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,iBAAiB;IACjB,SAAS;IACT,WAAW;IACX,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,OAAO;IACP,WAAW;IACX,QAAQ;IACR,cAAc;IACd,KAAK;IACL,SAAS;IACT,MAAM;IACN,cAAc;IACd,UAAU;IACV,WAAW;IACX,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,OAAO;IACP,kBAAkB;IAClB,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,iBAAiB;IACjB,WAAW;IACX,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,cAAc;IACd,UAAU;IACV,aAAa;CACd,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,MAA+B,EAAE,KAAa;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,6CAA6C,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,MAA+B,EAAE,KAAa;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,6CAA6C,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAc,EACd,KAAa;IAEb,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,4BAA4B,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,KAAU,CAAC;AACpB,CAAC;AAED,SAAS,iBAAiB,CACxB,MAA+B,EAC/B,WAAwB;IAExB,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACxD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,KAAK,CAAC,eAAe,KAAK,mCAAmC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,WAAW,CAAsB,CAAC;IAC1E,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,2DAA2D,SAAS,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAiB,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,sDAAsD,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,EAAE,cAAc,CAAyB,CAAC;IACnF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,8DAA8D,YAAY,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,UAAU,CAAqB,CAAC;IACvE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0DAA0D,QAAQ,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAmB,CAAC;IACjE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,wDAAwD,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,OAAO;QACL,eAAe,EAAE,mCAAmC;QACpD,OAAO,EAAE,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC;QACzC,SAAS;QACT,SAAS,EAAE,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC;QAC7C,UAAU,EAAE,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC;QAC/C,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC;QACvC,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC;QACrC,SAAS,EAAE,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC;QAC7C,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC;QACvC,YAAY,EACV,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;YAC7D,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC;QAC3C,GAAG,EAAE,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC;QACjC,OAAO,EAAE,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC;QACzC,IAAI;QACJ,YAAY;QACZ,QAAQ;QACR,SAAS,EAAE,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC;QAC7C,MAAM;QACN,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1C,UAAU,EAAE,mBAAmB,CAAqB,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC;QACnF,KAAK,EAAE,mBAAmB,CAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC;QAC/D,GAAG,CAAC,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,GAAG,CAAC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,CAAC;YAChD,CAAC,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,CAAC,EAAE;YAChE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,CAAC;QACH,2BAA2B,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAiB,CAAC;IAC3D,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,EAAE,cAAc,CAAyB,CAAC;IACnF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO;QACL,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC;QACvC,SAAS,EAAE,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC;QAC7C,IAAI;QACJ,YAAY;QACZ,SAAS,EAAE,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC;QAC7C,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1C,GAAG,CAAC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yCAAyC,CACvD,KAAc;IAEd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,KAAK,mCAAmC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,uBAAuB,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IACtG,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAmB,CAAC;IACjE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,+DAA+D,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9E,OAAO;QACL,eAAe,EAAE,mCAAmC;QACpD,SAAS,EAAE,uBAAuB;QAClC,SAAS,EAAE,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC;QAC7C,UAAU,EAAE,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC;QAC/C,MAAM;QACN,MAAM,EAAE,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QAC9D,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC/B,UAAU,EAAE,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;QAC1E,YAAY,EAAE,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;QAChF,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC;QACjD,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAyB;QACjE,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC;YAC7C,CAAC,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,EAAE;YAC7D,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,OAAO;QACL,WAAW,CAAC,KAA8C;YACxD,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YAC3D,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QACD,aAAa,CACX,KAAmE;YAEnE,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,GAAG,EAAE,CAAC;YACxE,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;YAC3D,CAAC;YACD,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface VoiceTranscriptionOptions {
2
+ audioPath: string;
3
+ mimeType: string;
4
+ languageHint?: string;
5
+ }
6
+ export interface VoiceSendParamsOptions {
7
+ stagingDir?: string;
8
+ transcribeAudioImpl?: (opts: VoiceTranscriptionOptions) => Promise<string>;
9
+ }
10
+ export declare function prepareVoiceSendParams(rawParams: unknown, options?: VoiceSendParamsOptions): Promise<unknown>;
11
+ export declare function voiceInputSetupMessage(error: unknown): string | undefined;
@@ -0,0 +1,120 @@
1
+ import { execFile as execFileCb } from "node:child_process";
2
+ import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { basename, extname, join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { extensionForMimeType } from "./attachment-staging.js";
7
+ const execFile = promisify(execFileCb);
8
+ export async function prepareVoiceSendParams(rawParams, options = {}) {
9
+ const record = rawParams && typeof rawParams === "object" && !Array.isArray(rawParams)
10
+ ? { ...rawParams }
11
+ : {};
12
+ const audio = resolveVoiceAudioPayload(record);
13
+ if (!audio) {
14
+ throw new Error("voice_audio_required");
15
+ }
16
+ if (!audio.mimeType.toLowerCase().startsWith("audio/")) {
17
+ throw new Error("voice_audio_required");
18
+ }
19
+ const languageHint = stringValue(record.languageHint) ?? stringValue(record.language);
20
+ const stagingRoot = options.stagingDir ?? await mkdtemp(join(tmpdir(), "clawconnect-voice-input-"));
21
+ await mkdir(stagingRoot, { recursive: true });
22
+ const audioPath = join(stagingRoot, resolveVoiceAudioFileName(audio));
23
+ await writeFile(audioPath, Buffer.from(audio.content, "base64"));
24
+ const transcribeAudio = options.transcribeAudioImpl ?? transcribeAudioWithConfiguredCommand;
25
+ const transcript = (await transcribeAudio({
26
+ audioPath,
27
+ mimeType: audio.mimeType,
28
+ languageHint,
29
+ })).trim();
30
+ if (!transcript) {
31
+ throw new Error("voice_transcript_empty");
32
+ }
33
+ const typedMessage = stringValue(record.message);
34
+ const message = typedMessage ? `${typedMessage}\n\n${transcript}` : transcript;
35
+ const next = {
36
+ ...record,
37
+ message,
38
+ };
39
+ delete next.audio;
40
+ delete next.languageHint;
41
+ delete next.language;
42
+ delete next.attachments;
43
+ return next;
44
+ }
45
+ export function voiceInputSetupMessage(error) {
46
+ const message = error instanceof Error ? error.message : String(error);
47
+ if (!message.includes("voice_asr_not_configured")) {
48
+ return undefined;
49
+ }
50
+ return [
51
+ "未安装语音输入技能,暂时不能使用语音对话。",
52
+ "安装路径:ClawLink → 技能扩展 → 语音转文字(SenseVoice int8)→ 安装。",
53
+ "安装完成后会写入 CLAWCONNECT_ASR_COMMAND;旧版 OPENCLAW_ASR_COMMAND 仍兼容。然后重启 ClawConnect 再试。",
54
+ ].join("\n");
55
+ }
56
+ async function transcribeAudioWithConfiguredCommand(opts) {
57
+ const command = process.env.CLAWCONNECT_ASR_COMMAND?.trim()
58
+ || process.env.OPENCLAW_ASR_COMMAND?.trim();
59
+ if (!command) {
60
+ throw new Error("voice_asr_not_configured");
61
+ }
62
+ const rendered = command
63
+ .replaceAll("{file}", shellQuote(opts.audioPath))
64
+ .replaceAll("{language}", shellQuote(opts.languageHint ?? ""))
65
+ .replaceAll("{mimeType}", shellQuote(opts.mimeType));
66
+ const { stdout } = await execFile("sh", ["-lc", rendered], {
67
+ timeout: 120_000,
68
+ maxBuffer: 10 * 1024 * 1024,
69
+ });
70
+ return stdout.trim();
71
+ }
72
+ function resolveVoiceAudioPayload(record) {
73
+ const inline = normalizeAudioRecord(record.audio);
74
+ if (inline) {
75
+ return inline;
76
+ }
77
+ const attachments = Array.isArray(record.attachments) ? record.attachments : [];
78
+ for (const attachment of attachments) {
79
+ const normalized = normalizeAudioRecord(attachment);
80
+ if (normalized?.mimeType.toLowerCase().startsWith("audio/")) {
81
+ return normalized;
82
+ }
83
+ }
84
+ return undefined;
85
+ }
86
+ function normalizeAudioRecord(value) {
87
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
88
+ return undefined;
89
+ }
90
+ const record = value;
91
+ const content = stringValue(record.content);
92
+ if (!content) {
93
+ return undefined;
94
+ }
95
+ const mimeType = stringValue(record.mimeType) ?? stringValue(record.contentType) ?? stringValue(record.type) ?? "application/octet-stream";
96
+ const fileName = sanitizeFileName(stringValue(record.fileName) ?? stringValue(record.name) ?? stringValue(record.filename), mimeType);
97
+ return { fileName, mimeType, content };
98
+ }
99
+ function resolveVoiceAudioFileName(audio) {
100
+ const ext = extname(audio.fileName);
101
+ return ext ? audio.fileName : `${audio.fileName}${extensionForMimeType(audio.mimeType)}`;
102
+ }
103
+ function sanitizeFileName(value, mimeType) {
104
+ const fallback = `voice-input${extensionForMimeType(mimeType)}`;
105
+ const trimmed = value?.trim();
106
+ if (!trimmed) {
107
+ return fallback;
108
+ }
109
+ const leaf = basename(trimmed.replace(/\\/g, "/"))
110
+ .replace(/[\u0000-\u001f\u007f]/g, "")
111
+ .trim();
112
+ return leaf || fallback;
113
+ }
114
+ function stringValue(value) {
115
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
116
+ }
117
+ function shellQuote(value) {
118
+ return `'${value.replaceAll("'", "'\\''")}'`;
119
+ }
120
+ //# sourceMappingURL=voice-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-input.js","sourceRoot":"","sources":["../../../src/core/relay/voice-input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type GatewayType = "openclaw" | "hermes";
2
+ export type GatewayProfile = {
3
+ type: GatewayType;
4
+ capabilities: string[];
5
+ };
6
+ export declare function normalizeGatewayType(value: string | undefined): GatewayType;
7
+ export declare function getGatewayProfile(gatewayType: GatewayType): GatewayProfile;
8
+ export declare function gatewayCapabilitiesForType(gatewayType: GatewayType): string[];
@@ -0,0 +1,24 @@
1
+ const GATEWAY_PROFILES = {
2
+ openclaw: {
3
+ type: "openclaw",
4
+ capabilities: ["chat", "skills", "schedules", "logs", "files", "voice_input"],
5
+ },
6
+ hermes: {
7
+ type: "hermes",
8
+ capabilities: ["chat", "files", "logs", "restart", "sessions", "skills", "gateway_service", "voice_input"],
9
+ },
10
+ };
11
+ export function normalizeGatewayType(value) {
12
+ return value === "hermes" ? "hermes" : "openclaw";
13
+ }
14
+ export function getGatewayProfile(gatewayType) {
15
+ const profile = GATEWAY_PROFILES[gatewayType];
16
+ return {
17
+ type: profile.type,
18
+ capabilities: [...profile.capabilities],
19
+ };
20
+ }
21
+ export function gatewayCapabilitiesForType(gatewayType) {
22
+ return getGatewayProfile(gatewayType).capabilities;
23
+ }
24
+ //# sourceMappingURL=gateway-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-profiles.js","sourceRoot":"","sources":["../src/gateway-profiles.ts"],"names":[],"mappings":"AAOA,MAAM,gBAAgB,GAAwC;IAC5D,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,YAAY,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;KAC9E;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC;KAC3G;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,KAAyB;IAC5D,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAAwB;IACxD,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC9C,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,WAAwB;IACjE,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC;AACrD,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { type FileUploadRequest } from "../core/relay/file-upload.js";
2
+ import type { RelaySlashCommandDescriptor } from "../core/relay/slash-command-types.js";
3
+ import { type MobileChatRun } from "../core/relay/mobile-chat-run-bridge.js";
4
+ export type ActiveHermesChatRun = {
5
+ controller: AbortController;
6
+ run: MobileChatRun;
7
+ };
8
+ export type HermesRelayHelloMessage = {
9
+ type: "hello";
10
+ platform: string;
11
+ agentVersion: string;
12
+ capabilities?: string[];
13
+ slashCommands?: readonly RelaySlashCommandDescriptor[];
14
+ };
15
+ export interface HermesRelayManagerOptions {
16
+ relayServerUrl: string;
17
+ gatewayId: string;
18
+ relaySecret: string;
19
+ displayName?: string;
20
+ capabilities?: string[];
21
+ signal?: AbortSignal;
22
+ onConnected?: () => void;
23
+ onDisconnected?: () => void;
24
+ }
25
+ type HermesSlashCommandRunner = (script: string) => string;
26
+ type HermesSlashCommandCollector = () => readonly RelaySlashCommandDescriptor[];
27
+ export interface HermesSlashCommandSearchResult {
28
+ items: RelaySlashCommandDescriptor[];
29
+ hasMore: boolean;
30
+ nextOffset?: number;
31
+ total: number;
32
+ }
33
+ export declare function collectHermesSlashCommandCatalog(runPython?: HermesSlashCommandRunner): RelaySlashCommandDescriptor[];
34
+ export declare function searchHermesSlashCommandCatalog(opts?: {
35
+ query?: unknown;
36
+ limit?: unknown;
37
+ offset?: unknown;
38
+ collect?: HermesSlashCommandCollector;
39
+ }): HermesSlashCommandSearchResult;
40
+ export declare function buildHermesRelayHelloMessage(opts: {
41
+ platform: string;
42
+ agentVersion: string;
43
+ capabilities?: string[];
44
+ slashCommands?: readonly RelaySlashCommandDescriptor[];
45
+ }): HermesRelayHelloMessage;
46
+ export declare function rememberActiveHermesChatRun(activeChatRuns: Map<string, ActiveHermesChatRun>, run: MobileChatRun, params: unknown, requestId: string | undefined, controller: AbortController): void;
47
+ export declare function resolveHermesAbortRun(params: unknown, activeChatRuns: Map<string, ActiveHermesChatRun>): ActiveHermesChatRun | undefined;
48
+ export declare function resolveHermesChatPreferredRunId(params: unknown, voiceInputRun?: MobileChatRun): string | undefined;
49
+ export declare function runHermesRelayManager(opts: HermesRelayManagerOptions): Promise<boolean>;
50
+ export declare function buildHermesArtifactUploadRequest(params: {
51
+ artifactPath: string;
52
+ relayServerUrl: string;
53
+ relaySecret: string;
54
+ gatewayId: string;
55
+ sessionKey: string;
56
+ runId: string;
57
+ }): FileUploadRequest;
58
+ export declare function shouldPublishHermesOfficeSnapshot(eventName: string | undefined, payload: unknown): boolean;
59
+ export {};