clawconnect-agent 0.1.0

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 (103) hide show
  1. package/.env.example +41 -0
  2. package/README.md +259 -0
  3. package/README.zh-CN.md +329 -0
  4. package/dist/commands/backup-manager.d.ts +21 -0
  5. package/dist/commands/backup-manager.js +346 -0
  6. package/dist/commands/backup-manager.js.map +1 -0
  7. package/dist/commands/install.d.ts +6 -0
  8. package/dist/commands/install.js +107 -0
  9. package/dist/commands/install.js.map +1 -0
  10. package/dist/commands/local-handlers.d.ts +2 -0
  11. package/dist/commands/local-handlers.js +375 -0
  12. package/dist/commands/local-handlers.js.map +1 -0
  13. package/dist/commands/local-runtime.d.ts +36 -0
  14. package/dist/commands/local-runtime.js +445 -0
  15. package/dist/commands/local-runtime.js.map +1 -0
  16. package/dist/commands/pair.d.ts +7 -0
  17. package/dist/commands/pair.js +100 -0
  18. package/dist/commands/pair.js.map +1 -0
  19. package/dist/commands/provider-config.d.ts +35 -0
  20. package/dist/commands/provider-config.js +291 -0
  21. package/dist/commands/provider-config.js.map +1 -0
  22. package/dist/commands/provider-handlers.d.ts +2 -0
  23. package/dist/commands/provider-handlers.js +216 -0
  24. package/dist/commands/provider-handlers.js.map +1 -0
  25. package/dist/commands/provider-registry.d.ts +19 -0
  26. package/dist/commands/provider-registry.js +120 -0
  27. package/dist/commands/provider-registry.js.map +1 -0
  28. package/dist/commands/run.d.ts +1 -0
  29. package/dist/commands/run.js +35 -0
  30. package/dist/commands/run.js.map +1 -0
  31. package/dist/commands/send-file-utils.d.ts +6 -0
  32. package/dist/commands/send-file-utils.js +94 -0
  33. package/dist/commands/send-file-utils.js.map +1 -0
  34. package/dist/commands/send-file.d.ts +41 -0
  35. package/dist/commands/send-file.js +492 -0
  36. package/dist/commands/send-file.js.map +1 -0
  37. package/dist/commands/set-token.d.ts +1 -0
  38. package/dist/commands/set-token.js +43 -0
  39. package/dist/commands/set-token.js.map +1 -0
  40. package/dist/commands/status.d.ts +1 -0
  41. package/dist/commands/status.js +135 -0
  42. package/dist/commands/status.js.map +1 -0
  43. package/dist/commands/voice-reply.d.ts +39 -0
  44. package/dist/commands/voice-reply.js +329 -0
  45. package/dist/commands/voice-reply.js.map +1 -0
  46. package/dist/config/config.d.ts +32 -0
  47. package/dist/config/config.js +103 -0
  48. package/dist/config/config.js.map +1 -0
  49. package/dist/config/env.d.ts +16 -0
  50. package/dist/config/env.js +138 -0
  51. package/dist/config/env.js.map +1 -0
  52. package/dist/i18n/index.d.ts +1 -0
  53. package/dist/i18n/index.js +147 -0
  54. package/dist/i18n/index.js.map +1 -0
  55. package/dist/index.d.ts +2 -0
  56. package/dist/index.js +117 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/platform/service-manager-common.d.ts +26 -0
  59. package/dist/platform/service-manager-common.js +51 -0
  60. package/dist/platform/service-manager-common.js.map +1 -0
  61. package/dist/platform/service-manager-linux.d.ts +6 -0
  62. package/dist/platform/service-manager-linux.js +229 -0
  63. package/dist/platform/service-manager-linux.js.map +1 -0
  64. package/dist/platform/service-manager.d.ts +16 -0
  65. package/dist/platform/service-manager.js +165 -0
  66. package/dist/platform/service-manager.js.map +1 -0
  67. package/dist/relay/attachment-staging.d.ts +12 -0
  68. package/dist/relay/attachment-staging.js +116 -0
  69. package/dist/relay/attachment-staging.js.map +1 -0
  70. package/dist/relay/chat-history.d.ts +29 -0
  71. package/dist/relay/chat-history.js +69 -0
  72. package/dist/relay/chat-history.js.map +1 -0
  73. package/dist/relay/chat-payload.d.ts +6 -0
  74. package/dist/relay/chat-payload.js +170 -0
  75. package/dist/relay/chat-payload.js.map +1 -0
  76. package/dist/relay/chat-send-attachments.d.ts +4 -0
  77. package/dist/relay/chat-send-attachments.js +47 -0
  78. package/dist/relay/chat-send-attachments.js.map +1 -0
  79. package/dist/relay/gateway-client.d.ts +41 -0
  80. package/dist/relay/gateway-client.js +288 -0
  81. package/dist/relay/gateway-client.js.map +1 -0
  82. package/dist/relay/office-payload.d.ts +19 -0
  83. package/dist/relay/office-payload.js +205 -0
  84. package/dist/relay/office-payload.js.map +1 -0
  85. package/dist/relay/reconnect.d.ts +14 -0
  86. package/dist/relay/reconnect.js +27 -0
  87. package/dist/relay/reconnect.js.map +1 -0
  88. package/dist/relay/relay-manager.d.ts +36 -0
  89. package/dist/relay/relay-manager.js +619 -0
  90. package/dist/relay/relay-manager.js.map +1 -0
  91. package/dist/relay/session-context.d.ts +19 -0
  92. package/dist/relay/session-context.js +323 -0
  93. package/dist/relay/session-context.js.map +1 -0
  94. package/dist/relay/slash-command-catalog.d.ts +8 -0
  95. package/dist/relay/slash-command-catalog.generated.d.ts +226 -0
  96. package/dist/relay/slash-command-catalog.generated.js +275 -0
  97. package/dist/relay/slash-command-catalog.generated.js.map +1 -0
  98. package/dist/relay/slash-command-catalog.js +3 -0
  99. package/dist/relay/slash-command-catalog.js.map +1 -0
  100. package/dist/relay/voice-reply-preference.d.ts +25 -0
  101. package/dist/relay/voice-reply-preference.js +103 -0
  102. package/dist/relay/voice-reply-preference.js.map +1 -0
  103. package/package.json +50 -0
@@ -0,0 +1,205 @@
1
+ import { extractChatRole, extractChatText, } from "./chat-payload.js";
2
+ export function buildOfficeEventPayload(eventName, payload, nowIso = () => new Date().toISOString()) {
3
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
4
+ return null;
5
+ }
6
+ const record = payload;
7
+ const data = getObject(record.data);
8
+ const office = getObject(record.office);
9
+ const sessionKey = stringValue(record.sessionKey) ?? stringValue(office?.sessionKey);
10
+ const currentModel = stringValue(record.currentModel) ?? stringValue(record.model);
11
+ const contextUsage = numberValue(record.contextUsage)
12
+ ?? numberValue(record.promptTokens)
13
+ ?? numberValue(record.inputTokens);
14
+ const contextLimit = numberValue(record.contextLimit)
15
+ ?? numberValue(record.maxInputTokens)
16
+ ?? numberValue(record.max_input_tokens);
17
+ const role = extractChatRole(record);
18
+ const text = extractChatText(record);
19
+ const phase = normalizePhaseValue(stringValue(record.state)
20
+ ?? stringValue(record.phase)
21
+ ?? stringValue(data?.phase)
22
+ ?? stringValue(office?.phase));
23
+ const toolName = stringValue(office?.toolName)
24
+ ?? stringValue(office?.tool_name)
25
+ ?? stringValue(data?.toolName)
26
+ ?? stringValue(data?.tool_name);
27
+ const toolCallId = stringValue(office?.toolCallId)
28
+ ?? stringValue(office?.tool_call_id)
29
+ ?? stringValue(data?.toolCallId)
30
+ ?? stringValue(data?.tool_call_id);
31
+ const kind = resolveKind(eventName, phase, role, toolName);
32
+ const title = resolveTitle(kind);
33
+ const detail = resolveDetail(kind, {
34
+ eventName,
35
+ text,
36
+ currentModel,
37
+ contextUsage,
38
+ contextLimit,
39
+ toolName,
40
+ phase,
41
+ office,
42
+ record,
43
+ });
44
+ const progress = resolveProgress(kind, phase);
45
+ return {
46
+ ...(sessionKey ? { sessionKey } : {}),
47
+ ...(currentModel ? { currentModel } : {}),
48
+ ...(contextUsage !== undefined ? { contextUsage } : {}),
49
+ ...(contextLimit !== undefined ? { contextLimit } : {}),
50
+ office: {
51
+ kind,
52
+ title,
53
+ detail,
54
+ ...(phase ? { phase } : {}),
55
+ ...(text ? { text } : {}),
56
+ ...(toolName ? { toolName } : {}),
57
+ ...(toolCallId ? { toolCallId } : {}),
58
+ ...(progress !== undefined ? { progress } : {}),
59
+ updatedAt: nowIso(),
60
+ },
61
+ };
62
+ }
63
+ function resolveKind(eventName, phase, role, toolName) {
64
+ const loweredTool = toolName?.toLowerCase() ?? "";
65
+ if (eventName === "gateway_disconnected") {
66
+ return "offline";
67
+ }
68
+ if (eventName === "gateway_connected" || eventName === "context_usage") {
69
+ return "syncing";
70
+ }
71
+ if (phase.includes("error") || phase.includes("fail")) {
72
+ return "error";
73
+ }
74
+ if (phase.includes("final") || phase.includes("complete") || phase.includes("done") || phase.includes("end")) {
75
+ return "idle";
76
+ }
77
+ if (phase.includes("sync") || phase.includes("waiting")) {
78
+ return "syncing";
79
+ }
80
+ if (loweredTool.includes("search") || loweredTool.includes("browse") || loweredTool.includes("research") || loweredTool.includes("web")) {
81
+ return "researching";
82
+ }
83
+ if (loweredTool.includes("code") || loweredTool.includes("shell") || loweredTool.includes("run") || loweredTool.includes("exec")) {
84
+ return "executing";
85
+ }
86
+ if (phase.includes("stream") || phase.includes("delta") || phase.includes("progress") || phase.includes("write")) {
87
+ return eventName === "agent" ? "executing" : "writing";
88
+ }
89
+ if (role === "user") {
90
+ return "writing";
91
+ }
92
+ return "idle";
93
+ }
94
+ function resolveTitle(kind) {
95
+ switch (kind) {
96
+ case "idle":
97
+ return "待命中";
98
+ case "writing":
99
+ return "写作中";
100
+ case "researching":
101
+ return "检索中";
102
+ case "executing":
103
+ return "执行中";
104
+ case "syncing":
105
+ return "同步中";
106
+ case "offline":
107
+ return "离线";
108
+ case "error":
109
+ return "异常";
110
+ }
111
+ }
112
+ function resolveDetail(kind, context) {
113
+ const officeDetail = stringValue(context.office?.detail);
114
+ if (officeDetail) {
115
+ return officeDetail;
116
+ }
117
+ const officeText = stringValue(context.office?.text);
118
+ if (officeText) {
119
+ return officeText;
120
+ }
121
+ const dataText = stringValue(context.record.text) ?? stringValue(getObject(context.record.data)?.text);
122
+ const messageText = stringValue(getObject(context.record.message)?.text);
123
+ const text = context.text || dataText || messageText;
124
+ switch (kind) {
125
+ case "idle":
126
+ if (context.currentModel) {
127
+ return `模型 ${context.currentModel} 正在待命`;
128
+ }
129
+ return "等待下一次任务";
130
+ case "writing":
131
+ return text || "正在整理回复";
132
+ case "researching":
133
+ if (context.toolName) {
134
+ return `正在检索 ${context.toolName}`;
135
+ }
136
+ return text || "正在检索资料";
137
+ case "executing":
138
+ if (context.toolName) {
139
+ return `正在执行 ${context.toolName}`;
140
+ }
141
+ return text || "正在执行工具";
142
+ case "syncing":
143
+ if (context.contextUsage !== undefined && context.contextLimit !== undefined) {
144
+ return `${formatCount(context.contextUsage)} / ${formatCount(context.contextLimit)}`;
145
+ }
146
+ return text || "正在同步状态";
147
+ case "offline":
148
+ return "主机暂时离线";
149
+ case "error":
150
+ return text || stringValue(context.record.errorMessage) || stringValue(context.record.error) || "发生错误";
151
+ }
152
+ }
153
+ function resolveProgress(kind, phase) {
154
+ if (phase.includes("final") || phase.includes("complete") || phase.includes("done")) {
155
+ return 1;
156
+ }
157
+ if (phase.includes("error") || phase.includes("fail")) {
158
+ return 1;
159
+ }
160
+ switch (kind) {
161
+ case "idle":
162
+ return 0;
163
+ case "writing":
164
+ return 0.42;
165
+ case "researching":
166
+ return 0.55;
167
+ case "executing":
168
+ return 0.72;
169
+ case "syncing":
170
+ return 0.36;
171
+ case "offline":
172
+ return 0;
173
+ case "error":
174
+ return 1;
175
+ }
176
+ }
177
+ function getObject(value) {
178
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
179
+ return undefined;
180
+ }
181
+ return value;
182
+ }
183
+ function stringValue(value) {
184
+ if (typeof value !== "string") {
185
+ return undefined;
186
+ }
187
+ const trimmed = value.trim();
188
+ return trimmed || undefined;
189
+ }
190
+ function numberValue(value) {
191
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.round(value) : undefined;
192
+ }
193
+ function normalizePhaseValue(value) {
194
+ return value?.trim().toLowerCase() ?? "";
195
+ }
196
+ function formatCount(value) {
197
+ if (value >= 1_000_000) {
198
+ return `${Math.round((value / 1_000_000) * 10) / 10}m`;
199
+ }
200
+ if (value >= 1_000) {
201
+ return `${Math.round((value / 1_000) * 10) / 10}k`;
202
+ }
203
+ return String(value);
204
+ }
205
+ //# sourceMappingURL=office-payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"office-payload.js","sourceRoot":"","sources":["../../src/relay/office-payload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface ReconnectOptions {
2
+ initialDelayMs?: number;
3
+ maxDelayMs?: number;
4
+ onRetry?: (attempt: number, delayMs: number) => void;
5
+ }
6
+ /**
7
+ * Implements exponential backoff: 500ms → 1s → 2s → ... → 30s cap.
8
+ * Calls `connect` repeatedly until `connect` returns false (permanent failure)
9
+ * or the returned WebSocket connection stays alive.
10
+ *
11
+ * The `connect` callback should return `true` if it attempted a connection
12
+ * and `false` if it should stop retrying.
13
+ */
14
+ export declare function withReconnect(connect: () => Promise<boolean>, opts?: ReconnectOptions): Promise<void>;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Implements exponential backoff: 500ms → 1s → 2s → ... → 30s cap.
3
+ * Calls `connect` repeatedly until `connect` returns false (permanent failure)
4
+ * or the returned WebSocket connection stays alive.
5
+ *
6
+ * The `connect` callback should return `true` if it attempted a connection
7
+ * and `false` if it should stop retrying.
8
+ */
9
+ export async function withReconnect(connect, opts = {}) {
10
+ const initialDelay = opts.initialDelayMs ?? 500;
11
+ const maxDelay = opts.maxDelayMs ?? 30_000;
12
+ let attempt = 0;
13
+ let delay = initialDelay;
14
+ while (true) {
15
+ const shouldRetry = await connect();
16
+ if (!shouldRetry)
17
+ break;
18
+ attempt++;
19
+ opts.onRetry?.(attempt, delay);
20
+ await sleep(delay);
21
+ delay = Math.min(delay * 2, maxDelay);
22
+ }
23
+ }
24
+ function sleep(ms) {
25
+ return new Promise((resolve) => setTimeout(resolve, ms));
26
+ }
27
+ //# sourceMappingURL=reconnect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconnect.js","sourceRoot":"","sources":["../../src/relay/reconnect.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA+B,EAC/B,OAAyB,EAAE;IAE3B,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,YAAY,CAAC;IAEzB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW;YAAE,MAAM;QAExB,OAAO,EAAE,CAAC;QACV,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/B,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { type VoiceReplyConfig } from "../config/config.js";
2
+ import { type RelaySlashCommandDescriptor } from "./slash-command-catalog.js";
3
+ /** Messages the relay client sends to the relay server. */
4
+ export type RelayHelloMessage = {
5
+ type: "hello";
6
+ platform: string;
7
+ agentVersion: string;
8
+ capabilities?: string[];
9
+ slashCommands?: readonly RelaySlashCommandDescriptor[];
10
+ };
11
+ export interface RelayManagerOptions {
12
+ relayServerUrl: string;
13
+ gatewayId: string;
14
+ relaySecret: string;
15
+ gatewayUrl: string;
16
+ gatewayToken?: string;
17
+ gatewayPassword?: string;
18
+ defaultVoiceReplyEnabled?: boolean;
19
+ defaultVoiceReplyConfig?: VoiceReplyConfig;
20
+ onConnected?: () => void;
21
+ onDisconnected?: () => void;
22
+ }
23
+ /**
24
+ * Connects to the cloud relay server and the local OpenClaw Gateway,
25
+ * then bridges messages between them indefinitely.
26
+ *
27
+ * The gateway client runs for as long as this relay connection is alive.
28
+ * Returns a Promise that resolves `true` (retry) when the relay server
29
+ * connection closes.
30
+ */
31
+ export declare function runRelayManager(opts: RelayManagerOptions): Promise<boolean>;
32
+ export declare function buildRelayHelloMessage(opts: {
33
+ platform: string;
34
+ agentVersion: string;
35
+ capabilities?: string[];
36
+ }): RelayHelloMessage;