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,120 @@
1
+ export const PROVIDER_REGISTRY = {
2
+ anthropic: {
3
+ displayName: "Anthropic",
4
+ defaultBaseUrl: "https://api.anthropic.com",
5
+ api: "anthropic-messages",
6
+ apiKeyEnvName: "ANTHROPIC_API_KEY",
7
+ validationPath: "/v1/models",
8
+ validationAuth: "x-api-key",
9
+ requiresApiKey: true,
10
+ allowMultiple: false,
11
+ showBaseUrl: false,
12
+ showModelId: false,
13
+ defaultModelId: "claude-opus-4-6",
14
+ builtIn: true,
15
+ },
16
+ openai: {
17
+ displayName: "OpenAI",
18
+ defaultBaseUrl: "https://api.openai.com",
19
+ api: "openai-responses",
20
+ apiKeyEnvName: "OPENAI_API_KEY",
21
+ validationPath: "/v1/models",
22
+ validationAuth: "bearer",
23
+ requiresApiKey: true,
24
+ allowMultiple: false,
25
+ showBaseUrl: false,
26
+ showModelId: false,
27
+ defaultModelId: "gpt-4o",
28
+ },
29
+ google: {
30
+ displayName: "Google",
31
+ defaultBaseUrl: "https://generativelanguage.googleapis.com",
32
+ api: "openai-completions",
33
+ apiKeyEnvName: "GOOGLE_API_KEY",
34
+ validationPath: "/v1beta/models",
35
+ validationAuth: "google-query-param",
36
+ requiresApiKey: true,
37
+ allowMultiple: false,
38
+ showBaseUrl: false,
39
+ showModelId: false,
40
+ defaultModelId: "gemini-2.0-flash",
41
+ builtIn: true,
42
+ },
43
+ openrouter: {
44
+ displayName: "OpenRouter",
45
+ defaultBaseUrl: "https://openrouter.ai",
46
+ api: "openai-completions",
47
+ apiKeyEnvName: "OPENROUTER_API_KEY",
48
+ validationPath: "/api/v1/models",
49
+ validationAuth: "bearer",
50
+ requiresApiKey: true,
51
+ allowMultiple: false,
52
+ showBaseUrl: false,
53
+ showModelId: false,
54
+ defaultModelId: "anthropic/claude-opus-4-6",
55
+ },
56
+ ark: {
57
+ displayName: "ByteDance (Ark)",
58
+ defaultBaseUrl: "https://ark.cn-beijing.volces.com",
59
+ api: "openai-completions",
60
+ apiKeyEnvName: "ARK_API_KEY",
61
+ validationPath: "/api/v3/models",
62
+ validationAuth: "bearer",
63
+ requiresApiKey: true,
64
+ allowMultiple: false,
65
+ showBaseUrl: false,
66
+ showModelId: true, // Ark is a platform; user must specify the model endpoint ID
67
+ },
68
+ moonshot: {
69
+ displayName: "Moonshot (Kimi)",
70
+ defaultBaseUrl: "https://api.moonshot.cn",
71
+ api: "openai-completions",
72
+ apiKeyEnvName: "MOONSHOT_API_KEY",
73
+ validationPath: "/v1/models",
74
+ validationAuth: "bearer",
75
+ requiresApiKey: true,
76
+ allowMultiple: false,
77
+ showBaseUrl: false,
78
+ showModelId: false,
79
+ defaultModelId: "kimi-k2.5",
80
+ },
81
+ siliconflow: {
82
+ displayName: "SiliconFlow",
83
+ defaultBaseUrl: "https://api.siliconflow.cn",
84
+ api: "openai-completions",
85
+ apiKeyEnvName: "SILICONFLOW_API_KEY",
86
+ validationPath: "/v1/models",
87
+ validationAuth: "bearer",
88
+ requiresApiKey: true,
89
+ allowMultiple: false,
90
+ showBaseUrl: false,
91
+ showModelId: false,
92
+ defaultModelId: "Qwen/QwQ-32B",
93
+ },
94
+ ollama: {
95
+ displayName: "Ollama",
96
+ defaultBaseUrl: "http://localhost:11434",
97
+ api: "openai-completions",
98
+ apiKeyEnvName: "OLLAMA_API_KEY",
99
+ validationPath: "/api/tags",
100
+ validationAuth: "none",
101
+ requiresApiKey: false,
102
+ allowMultiple: false,
103
+ showBaseUrl: true,
104
+ showModelId: true, // User must specify which model they have pulled
105
+ },
106
+ custom: {
107
+ displayName: "Custom",
108
+ defaultBaseUrl: "",
109
+ api: "openai-completions",
110
+ apiKeyEnvName: "CUSTOM_API_KEY",
111
+ validationPath: "/v1/models",
112
+ validationAuth: "bearer",
113
+ requiresApiKey: false,
114
+ allowMultiple: true,
115
+ showBaseUrl: true,
116
+ showModelId: true,
117
+ defaultModelId: "custom-model",
118
+ },
119
+ };
120
+ //# sourceMappingURL=provider-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/commands/provider-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runCommand(): Promise<void>;
@@ -0,0 +1,35 @@
1
+ import { readConfig, readGatewayUrl, readGatewayAuth, readVoiceReplyConfig } from "../config/config.js";
2
+ import { runRelayManager } from "../relay/relay-manager.js";
3
+ import { withReconnect } from "../relay/reconnect.js";
4
+ import { t } from "../i18n/index.js";
5
+ function parseBooleanEnv(value) {
6
+ return /^(1|true|yes|on)$/i.test((value ?? "").trim());
7
+ }
8
+ export async function runCommand() {
9
+ const config = readConfig();
10
+ const gatewayUrl = readGatewayUrl();
11
+ const gatewayAuth = readGatewayAuth(config);
12
+ const defaultVoiceReplyEnabled = parseBooleanEnv(process.env.OPENCLAW_TTS_ENABLED);
13
+ const defaultVoiceReplyConfig = readVoiceReplyConfig(config);
14
+ console.log(t("run.starting"));
15
+ console.log(t("run.gatewayId", config.gatewayId));
16
+ console.log(t("run.relayServer", config.relayServerUrl));
17
+ console.log(t("run.gatewayUrl", gatewayUrl));
18
+ await withReconnect(() => runRelayManager({
19
+ relayServerUrl: config.relayServerUrl,
20
+ gatewayId: config.gatewayId,
21
+ relaySecret: config.relaySecret,
22
+ gatewayUrl,
23
+ gatewayToken: gatewayAuth.token,
24
+ gatewayPassword: gatewayAuth.password,
25
+ defaultVoiceReplyEnabled,
26
+ defaultVoiceReplyConfig,
27
+ onConnected: () => console.log(t("run.connected")),
28
+ onDisconnected: () => console.log(t("run.disconnected")),
29
+ }), {
30
+ onRetry: (attempt, delayMs) => {
31
+ console.log(t("run.retry", String(attempt), String(delayMs)));
32
+ },
33
+ });
34
+ }
35
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAErC,SAAS,eAAe,CAAC,KAAyB;IAChD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,wBAAwB,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACnF,MAAM,uBAAuB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7C,MAAM,aAAa,CACjB,GAAG,EAAE,CACH,eAAe,CAAC;QACd,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU;QACV,YAAY,EAAE,WAAW,CAAC,KAAK;QAC/B,eAAe,EAAE,WAAW,CAAC,QAAQ;QACrC,wBAAwB;QACxB,uBAAuB;QACvB,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAClD,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;KACzD,CAAC,EACJ;QACE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;KACF,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const DEFAULT_FILE_CHUNK_SIZE: number;
2
+ export declare function normalizeSessionKey(sessionKey?: string): string;
3
+ export declare function toRelayHttpBase(relayServerUrl: string): string;
4
+ export declare function inferMimeType(fileName: string): string;
5
+ export declare function calculateChunkCount(sizeBytes: number, chunkSize: number): number;
6
+ export declare function formatFileSize(sizeBytes: number): string;
@@ -0,0 +1,94 @@
1
+ const MIME_BY_EXTENSION = {
2
+ ".aac": "audio/aac",
3
+ ".aiff": "audio/aiff",
4
+ ".apk": "application/vnd.android.package-archive",
5
+ ".avif": "image/avif",
6
+ ".bmp": "image/bmp",
7
+ ".csv": "text/csv",
8
+ ".dmg": "application/x-apple-diskimage",
9
+ ".doc": "application/msword",
10
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
11
+ ".gif": "image/gif",
12
+ ".heic": "image/heic",
13
+ ".heif": "image/heif",
14
+ ".htm": "text/html",
15
+ ".html": "text/html",
16
+ ".ico": "image/x-icon",
17
+ ".jpeg": "image/jpeg",
18
+ ".jpg": "image/jpeg",
19
+ ".json": "application/json",
20
+ ".m4a": "audio/mp4",
21
+ ".md": "text/markdown",
22
+ ".mov": "video/quicktime",
23
+ ".mp3": "audio/mpeg",
24
+ ".mp4": "video/mp4",
25
+ ".msi": "application/x-msi",
26
+ ".pdf": "application/pdf",
27
+ ".pkg": "application/octet-stream",
28
+ ".png": "image/png",
29
+ ".ppt": "application/vnd.ms-powerpoint",
30
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
31
+ ".rar": "application/vnd.rar",
32
+ ".rtf": "application/rtf",
33
+ ".svg": "image/svg+xml",
34
+ ".tar": "application/x-tar",
35
+ ".tgz": "application/gzip",
36
+ ".txt": "text/plain",
37
+ ".wav": "audio/wav",
38
+ ".webm": "video/webm",
39
+ ".webp": "image/webp",
40
+ ".xls": "application/vnd.ms-excel",
41
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
42
+ ".xml": "application/xml",
43
+ ".zip": "application/zip",
44
+ };
45
+ export const DEFAULT_FILE_CHUNK_SIZE = 5 * 1024 * 1024;
46
+ export function normalizeSessionKey(sessionKey) {
47
+ const trimmed = sessionKey?.trim() ?? "";
48
+ return trimmed.length > 0 ? trimmed : "main";
49
+ }
50
+ export function toRelayHttpBase(relayServerUrl) {
51
+ const trimmed = relayServerUrl.trim().replace(/\/+$/, "");
52
+ if (!trimmed) {
53
+ throw new Error("relay_server_url_required");
54
+ }
55
+ if (/^https?:\/\//i.test(trimmed)) {
56
+ return trimmed;
57
+ }
58
+ if (/^wss?:\/\//i.test(trimmed)) {
59
+ return trimmed
60
+ .replace(/^wss:\/\//i, "https://")
61
+ .replace(/^ws:\/\//i, "http://");
62
+ }
63
+ return `http://${trimmed}`;
64
+ }
65
+ export function inferMimeType(fileName) {
66
+ const lowerName = fileName.trim().toLowerCase();
67
+ const dotIndex = lowerName.lastIndexOf(".");
68
+ if (dotIndex < 0) {
69
+ return "application/octet-stream";
70
+ }
71
+ const extension = lowerName.slice(dotIndex);
72
+ if (!extension || extension.length > 16) {
73
+ return "application/octet-stream";
74
+ }
75
+ return MIME_BY_EXTENSION[extension] ?? "application/octet-stream";
76
+ }
77
+ export function calculateChunkCount(sizeBytes, chunkSize) {
78
+ const normalizedSize = Math.max(0, Math.floor(sizeBytes));
79
+ const normalizedChunkSize = Math.max(1, Math.floor(chunkSize));
80
+ return Math.max(1, Math.ceil(normalizedSize / normalizedChunkSize));
81
+ }
82
+ export function formatFileSize(sizeBytes) {
83
+ const normalized = Math.max(0, sizeBytes);
84
+ const units = ["B", "KB", "MB", "GB", "TB"];
85
+ let value = normalized;
86
+ let unitIndex = 0;
87
+ while (value >= 1024 && unitIndex < units.length - 1) {
88
+ value /= 1024;
89
+ unitIndex += 1;
90
+ }
91
+ const precision = unitIndex === 0 ? 0 : value >= 10 ? 1 : 2;
92
+ return `${value.toFixed(precision)} ${units[unitIndex]}`;
93
+ }
94
+ //# sourceMappingURL=send-file-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-file-utils.js","sourceRoot":"","sources":["../../src/commands/send-file-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type ClawConnectConfig } from "../config/config.js";
2
+ export interface SendFileCommandOptions {
3
+ filePath: string;
4
+ gateway?: string;
5
+ session?: string;
6
+ json?: boolean;
7
+ durationMs?: number;
8
+ transcript?: string;
9
+ }
10
+ export interface SendFileCommandDependencies {
11
+ loadConfig?: () => ClawConnectConfig;
12
+ fetchImpl?: typeof fetch;
13
+ stdout?: Pick<NodeJS.WritableStream, "write">;
14
+ stderr?: Pick<NodeJS.WritableStream, "write">;
15
+ sessionStoreRoot?: string;
16
+ }
17
+ export interface SendFileResult {
18
+ filePath: string;
19
+ absolutePath: string;
20
+ gatewayId: string;
21
+ sessionKey: string;
22
+ fileId: string;
23
+ uploadId: string;
24
+ fileName: string;
25
+ mimeType: string;
26
+ sizeBytes: number;
27
+ durationMs?: number;
28
+ imageWidth?: number;
29
+ imageHeight?: number;
30
+ sha256: string;
31
+ chunkSize: number;
32
+ totalChunks: number;
33
+ expiresAt: string;
34
+ downloadPath: string;
35
+ downloadUrl: string;
36
+ senderDisplayName?: string;
37
+ status: string;
38
+ createdAt: string;
39
+ updatedAt: string;
40
+ }
41
+ export declare function sendFileCommand(opts: SendFileCommandOptions, deps?: SendFileCommandDependencies): Promise<SendFileResult>;