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,229 @@
1
+ import { commandExists, ensureLogDir, ERROR_LOG_PATH, getProgramArgs, LINUX_NOHUP_PID_PATH, LINUX_NOHUP_START_SCRIPT_PATH, LINUX_SERVICE_NAME, LINUX_SERVICE_PATH, LINUX_SYSTEMD_USER_DIR, LOG_DIR, LOG_PATH, run, shellEscape, } from "./service-manager-common.js";
2
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
3
+ function canUseSystemdUser() {
4
+ if (!commandExists("systemctl"))
5
+ return false;
6
+ try {
7
+ run("systemctl --user show-environment", "pipe");
8
+ return true;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ function isPidRunning(pid) {
15
+ try {
16
+ process.kill(pid, 0);
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ function readNohupPid() {
24
+ if (!existsSync(LINUX_NOHUP_PID_PATH))
25
+ return null;
26
+ try {
27
+ const raw = readFileSync(LINUX_NOHUP_PID_PATH, "utf-8").trim();
28
+ const pid = Number(raw);
29
+ return Number.isInteger(pid) && pid > 0 ? pid : null;
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ function removeNohupPidFile() {
36
+ if (existsSync(LINUX_NOHUP_PID_PATH)) {
37
+ unlinkSync(LINUX_NOHUP_PID_PATH);
38
+ }
39
+ }
40
+ function getNohupStartCommand() {
41
+ return `bash ${shellEscape(LINUX_NOHUP_START_SCRIPT_PATH)}`;
42
+ }
43
+ function writeLinuxNohupStartScript() {
44
+ const args = getProgramArgs().map(shellEscape).join(" ");
45
+ const script = `#!/usr/bin/env bash
46
+ set -euo pipefail
47
+
48
+ mkdir -p ${shellEscape(LOG_DIR)}
49
+ if [ -f ${shellEscape(LINUX_NOHUP_PID_PATH)} ]; then
50
+ pid="$(cat ${shellEscape(LINUX_NOHUP_PID_PATH)} 2>/dev/null || true)"
51
+ if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
52
+ echo "clawconnect is already running (pid=$pid)"
53
+ exit 0
54
+ fi
55
+ fi
56
+
57
+ nohup ${args} >> ${shellEscape(LOG_PATH)} 2>> ${shellEscape(ERROR_LOG_PATH)} < /dev/null &
58
+ echo $! > ${shellEscape(LINUX_NOHUP_PID_PATH)}
59
+ echo "clawconnect started in nohup mode (pid=$(cat ${shellEscape(LINUX_NOHUP_PID_PATH)}))"
60
+ `;
61
+ writeFileSync(LINUX_NOHUP_START_SCRIPT_PATH, script, { encoding: "utf-8", mode: 0o755 });
62
+ }
63
+ function installLinuxServiceSystemd() {
64
+ mkdirSync(LINUX_SYSTEMD_USER_DIR, { recursive: true });
65
+ ensureLogDir();
66
+ const args = getProgramArgs().map(shellEscape).join(" ");
67
+ const serviceContent = `[Unit]
68
+ Description=ClawConnect host agent
69
+ After=network-online.target
70
+ Wants=network-online.target
71
+
72
+ [Service]
73
+ Type=simple
74
+ ExecStart=${args}
75
+ Restart=always
76
+ RestartSec=5
77
+ WorkingDirectory=${shellEscape(process.cwd())}
78
+ StandardOutput=append:${LOG_PATH}
79
+ StandardError=append:${ERROR_LOG_PATH}
80
+
81
+ [Install]
82
+ WantedBy=default.target
83
+ `;
84
+ writeFileSync(LINUX_SERVICE_PATH, serviceContent, "utf-8");
85
+ run("systemctl --user daemon-reload", "inherit");
86
+ run(`systemctl --user enable --now ${LINUX_SERVICE_NAME}`, "inherit");
87
+ return true;
88
+ }
89
+ function installLinuxServiceNohup() {
90
+ ensureLogDir();
91
+ writeLinuxNohupStartScript();
92
+ run(`sh -lc ${shellEscape(getNohupStartCommand())}`, "inherit");
93
+ const pid = readNohupPid();
94
+ return pid != null && isPidRunning(pid);
95
+ }
96
+ export function installLinuxService() {
97
+ if (canUseSystemdUser()) {
98
+ try {
99
+ return installLinuxServiceSystemd();
100
+ }
101
+ catch {
102
+ // Fall back to nohup below.
103
+ }
104
+ }
105
+ try {
106
+ return installLinuxServiceNohup();
107
+ }
108
+ catch {
109
+ return false;
110
+ }
111
+ }
112
+ function uninstallLinuxArtifacts(removeFile) {
113
+ let changed = false;
114
+ if (canUseSystemdUser()) {
115
+ try {
116
+ run(`systemctl --user stop ${LINUX_SERVICE_NAME}`);
117
+ changed = true;
118
+ }
119
+ catch {
120
+ // ignore
121
+ }
122
+ try {
123
+ run(`systemctl --user disable ${LINUX_SERVICE_NAME}`);
124
+ changed = true;
125
+ }
126
+ catch {
127
+ // ignore
128
+ }
129
+ try {
130
+ run("systemctl --user daemon-reload");
131
+ }
132
+ catch {
133
+ // ignore
134
+ }
135
+ }
136
+ const nohupPid = readNohupPid();
137
+ if (nohupPid != null) {
138
+ try {
139
+ process.kill(nohupPid, "SIGTERM");
140
+ changed = true;
141
+ }
142
+ catch {
143
+ // ignore
144
+ }
145
+ removeNohupPidFile();
146
+ changed = true;
147
+ }
148
+ if (removeFile && existsSync(LINUX_SERVICE_PATH)) {
149
+ unlinkSync(LINUX_SERVICE_PATH);
150
+ changed = true;
151
+ }
152
+ if (removeFile && existsSync(LINUX_NOHUP_START_SCRIPT_PATH)) {
153
+ unlinkSync(LINUX_NOHUP_START_SCRIPT_PATH);
154
+ changed = true;
155
+ }
156
+ return changed;
157
+ }
158
+ export function stopLinuxService() {
159
+ return uninstallLinuxArtifacts(false);
160
+ }
161
+ export function uninstallLinuxService() {
162
+ return uninstallLinuxArtifacts(true);
163
+ }
164
+ export function restartLinuxService() {
165
+ if (canUseSystemdUser() && existsSync(LINUX_SERVICE_PATH)) {
166
+ try {
167
+ run("systemctl --user daemon-reload", "inherit");
168
+ run(`systemctl --user restart ${LINUX_SERVICE_NAME}`, "inherit");
169
+ return true;
170
+ }
171
+ catch {
172
+ // Fall back to nohup restart below.
173
+ }
174
+ }
175
+ uninstallLinuxArtifacts(false);
176
+ try {
177
+ return installLinuxServiceNohup();
178
+ }
179
+ catch {
180
+ return false;
181
+ }
182
+ }
183
+ export function getLinuxServiceStatus() {
184
+ const buildNohupStatus = (installed, running) => ({
185
+ platform: "linux",
186
+ installed,
187
+ running,
188
+ serviceName: "clawconnect (nohup)",
189
+ manager: "nohup",
190
+ servicePath: existsSync(LINUX_NOHUP_START_SCRIPT_PATH) ? LINUX_NOHUP_START_SCRIPT_PATH : undefined,
191
+ logPath: LOG_PATH,
192
+ startHint: getNohupStartCommand(),
193
+ });
194
+ const isSystemdActive = () => {
195
+ if (!canUseSystemdUser())
196
+ return false;
197
+ try {
198
+ run(`systemctl --user is-active --quiet ${LINUX_SERVICE_NAME}`);
199
+ return true;
200
+ }
201
+ catch {
202
+ return false;
203
+ }
204
+ };
205
+ const pid = readNohupPid();
206
+ const hasNohupArtifacts = pid != null || existsSync(LINUX_NOHUP_START_SCRIPT_PATH);
207
+ const running = pid != null && isPidRunning(pid);
208
+ if (!running && pid != null) {
209
+ removeNohupPidFile();
210
+ }
211
+ if (running || (hasNohupArtifacts && !canUseSystemdUser())) {
212
+ return buildNohupStatus(hasNohupArtifacts, running);
213
+ }
214
+ const hasSystemdServiceFile = existsSync(LINUX_SERVICE_PATH);
215
+ if (hasSystemdServiceFile) {
216
+ return {
217
+ platform: "linux",
218
+ installed: true,
219
+ running: isSystemdActive(),
220
+ serviceName: LINUX_SERVICE_NAME,
221
+ manager: "systemd",
222
+ servicePath: LINUX_SERVICE_PATH,
223
+ logPath: LOG_PATH,
224
+ startHint: `systemctl --user start ${LINUX_SERVICE_NAME}`,
225
+ };
226
+ }
227
+ return buildNohupStatus(hasNohupArtifacts, running);
228
+ }
229
+ //# sourceMappingURL=service-manager-linux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-manager-linux.js","sourceRoot":"","sources":["../../src/platform/service-manager-linux.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ServicePlatform, ServiceStatus } from "./service-manager-common.js";
2
+ export type { ServicePlatform, ServiceStatus } from "./service-manager-common.js";
3
+ export declare function getServicePlatform(): ServicePlatform;
4
+ export declare function installService(): boolean;
5
+ export declare function restartService(): boolean;
6
+ export declare function stopService(): boolean;
7
+ export declare function uninstallService(): boolean;
8
+ export declare function getServiceStatus(): ServiceStatus;
9
+ export declare const servicePaths: {
10
+ logPath: string;
11
+ errorLogPath: string;
12
+ macPlistPath: string;
13
+ linuxServicePath: string;
14
+ linuxNohupPidPath: string;
15
+ linuxNohupStartScriptPath: string;
16
+ };
@@ -0,0 +1,165 @@
1
+ import { existsSync, mkdirSync, unlinkSync, writeFileSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { join } from "path";
4
+ import { detectPlatform, ensureLogDir, ERROR_LOG_PATH, getProgramArgs, LINUX_NOHUP_PID_PATH, LINUX_NOHUP_START_SCRIPT_PATH, LINUX_SERVICE_PATH, LOG_PATH, run, } from "./service-manager-common.js";
5
+ import { getLinuxServiceStatus, installLinuxService, restartLinuxService, stopLinuxService, uninstallLinuxService, } from "./service-manager-linux.js";
6
+ const MAC_LABEL = "com.openclaw.clawconnect.agent";
7
+ const MAC_LABEL_OLD = "com.rethinkingstudio.clawpilot";
8
+ const MAC_PLIST_DIR = join(homedir(), "Library", "LaunchAgents");
9
+ const MAC_PLIST_PATH = join(MAC_PLIST_DIR, `${MAC_LABEL}.plist`);
10
+ const MAC_PLIST_PATH_OLD = join(MAC_PLIST_DIR, `${MAC_LABEL_OLD}.plist`);
11
+ function installMacService() {
12
+ const argsXml = getProgramArgs().map((arg) => ` <string>${arg}</string>`).join("\n");
13
+ const plistContent = `<?xml version="1.0" encoding="UTF-8"?>
14
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
15
+ "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
16
+ <plist version="1.0">
17
+ <dict>
18
+ <key>Label</key>
19
+ <string>${MAC_LABEL}</string>
20
+ <key>ProgramArguments</key>
21
+ <array>
22
+ ${argsXml}
23
+ </array>
24
+ <key>RunAtLoad</key>
25
+ <true/>
26
+ <key>KeepAlive</key>
27
+ <true/>
28
+ <key>StandardOutPath</key>
29
+ <string>${LOG_PATH}</string>
30
+ <key>StandardErrorPath</key>
31
+ <string>${ERROR_LOG_PATH}</string>
32
+ </dict>
33
+ </plist>`;
34
+ mkdirSync(MAC_PLIST_DIR, { recursive: true });
35
+ ensureLogDir();
36
+ try {
37
+ run(`launchctl unload -w "${MAC_PLIST_PATH}"`);
38
+ }
39
+ catch {
40
+ // Ignore if not loaded.
41
+ }
42
+ writeFileSync(MAC_PLIST_PATH, plistContent, "utf-8");
43
+ try {
44
+ run(`launchctl load -w "${MAC_PLIST_PATH}"`, "inherit");
45
+ return true;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ function uninstallMacArtifacts() {
52
+ let changed = false;
53
+ try {
54
+ run(`launchctl unload -w "${MAC_PLIST_PATH}"`);
55
+ changed = true;
56
+ }
57
+ catch {
58
+ // ignore
59
+ }
60
+ if (existsSync(MAC_PLIST_PATH)) {
61
+ unlinkSync(MAC_PLIST_PATH);
62
+ changed = true;
63
+ }
64
+ try {
65
+ run(`launchctl unload -w "${MAC_PLIST_PATH_OLD}"`);
66
+ changed = true;
67
+ }
68
+ catch {
69
+ // ignore
70
+ }
71
+ if (existsSync(MAC_PLIST_PATH_OLD)) {
72
+ unlinkSync(MAC_PLIST_PATH_OLD);
73
+ changed = true;
74
+ }
75
+ return changed;
76
+ }
77
+ function restartMacService() {
78
+ return installMacService();
79
+ }
80
+ export function getServicePlatform() {
81
+ return detectPlatform();
82
+ }
83
+ export function installService() {
84
+ switch (detectPlatform()) {
85
+ case "macos":
86
+ return installMacService();
87
+ case "linux":
88
+ return installLinuxService();
89
+ default:
90
+ return false;
91
+ }
92
+ }
93
+ export function restartService() {
94
+ switch (detectPlatform()) {
95
+ case "macos":
96
+ return restartMacService();
97
+ case "linux":
98
+ return restartLinuxService();
99
+ default:
100
+ return false;
101
+ }
102
+ }
103
+ export function stopService() {
104
+ switch (detectPlatform()) {
105
+ case "macos":
106
+ return uninstallMacArtifacts();
107
+ case "linux":
108
+ return stopLinuxService();
109
+ default:
110
+ return false;
111
+ }
112
+ }
113
+ export function uninstallService() {
114
+ switch (detectPlatform()) {
115
+ case "macos":
116
+ return uninstallMacArtifacts();
117
+ case "linux":
118
+ return uninstallLinuxService();
119
+ default:
120
+ return false;
121
+ }
122
+ }
123
+ export function getServiceStatus() {
124
+ const platform = detectPlatform();
125
+ if (platform === "macos") {
126
+ let running = false;
127
+ try {
128
+ run(`launchctl list ${MAC_LABEL}`);
129
+ running = true;
130
+ }
131
+ catch {
132
+ running = false;
133
+ }
134
+ return {
135
+ platform,
136
+ installed: existsSync(MAC_PLIST_PATH),
137
+ running,
138
+ serviceName: MAC_LABEL,
139
+ manager: "launchd",
140
+ servicePath: MAC_PLIST_PATH,
141
+ logPath: LOG_PATH,
142
+ startHint: `launchctl start ${MAC_LABEL}`,
143
+ };
144
+ }
145
+ if (platform === "linux") {
146
+ return getLinuxServiceStatus();
147
+ }
148
+ return {
149
+ platform,
150
+ installed: false,
151
+ running: false,
152
+ serviceName: "",
153
+ manager: "unsupported",
154
+ logPath: LOG_PATH,
155
+ };
156
+ }
157
+ export const servicePaths = {
158
+ logPath: LOG_PATH,
159
+ errorLogPath: ERROR_LOG_PATH,
160
+ macPlistPath: MAC_PLIST_PATH,
161
+ linuxServicePath: LINUX_SERVICE_PATH,
162
+ linuxNohupPidPath: LINUX_NOHUP_PID_PATH,
163
+ linuxNohupStartScriptPath: LINUX_NOHUP_START_SCRIPT_PATH,
164
+ };
165
+ //# sourceMappingURL=service-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-manager.js","sourceRoot":"","sources":["../../src/platform/service-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface RelayAttachmentLike {
2
+ fileName?: unknown;
3
+ name?: unknown;
4
+ filename?: unknown;
5
+ mimeType?: unknown;
6
+ contentType?: unknown;
7
+ type?: unknown;
8
+ }
9
+ export declare function resolveAttachmentMimeType(attachment: RelayAttachmentLike): string;
10
+ export declare function resolveAttachmentFileName(attachment: RelayAttachmentLike): string;
11
+ export declare function buildAttachmentStagingPath(attachment: RelayAttachmentLike, outboundDir: string, uniqueId?: string): string;
12
+ export declare function extensionForMimeType(mimeType: string): string;
@@ -0,0 +1,116 @@
1
+ import { basename, extname, join } from "node:path";
2
+ import { randomUUID } from "node:crypto";
3
+ export function resolveAttachmentMimeType(attachment) {
4
+ const rawMimeType = firstString(attachment.mimeType, attachment.contentType, attachment.type);
5
+ return rawMimeType || "application/octet-stream";
6
+ }
7
+ export function resolveAttachmentFileName(attachment) {
8
+ const mimeType = resolveAttachmentMimeType(attachment).toLowerCase();
9
+ const originalName = sanitizeFileName(firstString(attachment.fileName, attachment.name, attachment.filename));
10
+ if (originalName) {
11
+ if (extname(originalName)) {
12
+ return originalName;
13
+ }
14
+ return `${originalName}${extensionForMimeType(mimeType)}`;
15
+ }
16
+ return `attachment${extensionForMimeType(mimeType)}`;
17
+ }
18
+ export function buildAttachmentStagingPath(attachment, outboundDir, uniqueId = randomUUID()) {
19
+ return join(outboundDir, uniqueId, resolveAttachmentFileName(attachment));
20
+ }
21
+ export function extensionForMimeType(mimeType) {
22
+ const normalized = mimeType.trim().toLowerCase();
23
+ if (!normalized) {
24
+ return ".bin";
25
+ }
26
+ if (normalized === "image/png")
27
+ return ".png";
28
+ if (normalized === "image/jpeg" || normalized === "image/jpg")
29
+ return ".jpg";
30
+ if (normalized === "image/gif")
31
+ return ".gif";
32
+ if (normalized === "image/webp")
33
+ return ".webp";
34
+ if (normalized === "image/heic")
35
+ return ".heic";
36
+ if (normalized === "image/heif")
37
+ return ".heif";
38
+ if (normalized === "image/bmp")
39
+ return ".bmp";
40
+ if (normalized === "image/avif")
41
+ return ".avif";
42
+ if (normalized === "image/svg+xml")
43
+ return ".svg";
44
+ if (normalized === "video/mp4")
45
+ return ".mp4";
46
+ if (normalized === "video/quicktime")
47
+ return ".mov";
48
+ if (normalized === "video/webm")
49
+ return ".webm";
50
+ if (normalized === "audio/mpeg")
51
+ return ".mp3";
52
+ if (normalized === "audio/mp4")
53
+ return ".m4a";
54
+ if (normalized === "audio/aac")
55
+ return ".aac";
56
+ if (normalized === "audio/wav" || normalized === "audio/x-wav")
57
+ return ".wav";
58
+ if (normalized === "application/pdf")
59
+ return ".pdf";
60
+ if (normalized === "application/msword")
61
+ return ".doc";
62
+ if (normalized === "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
63
+ return ".docx";
64
+ if (normalized === "application/vnd.ms-powerpoint")
65
+ return ".ppt";
66
+ if (normalized === "application/vnd.openxmlformats-officedocument.presentationml.presentation")
67
+ return ".pptx";
68
+ if (normalized === "application/vnd.ms-excel")
69
+ return ".xls";
70
+ if (normalized === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
71
+ return ".xlsx";
72
+ if (normalized === "application/zip")
73
+ return ".zip";
74
+ if (normalized === "application/gzip")
75
+ return ".gz";
76
+ if (normalized === "application/x-tar")
77
+ return ".tar";
78
+ if (normalized === "application/vnd.rar")
79
+ return ".rar";
80
+ if (normalized === "application/x-apple-diskimage")
81
+ return ".dmg";
82
+ if (normalized === "application/json")
83
+ return ".json";
84
+ if (normalized === "text/plain")
85
+ return ".txt";
86
+ if (normalized.startsWith("image/"))
87
+ return ".bin";
88
+ if (normalized.startsWith("video/"))
89
+ return ".bin";
90
+ if (normalized.startsWith("audio/"))
91
+ return ".bin";
92
+ return ".bin";
93
+ }
94
+ function sanitizeFileName(value) {
95
+ const trimmed = firstString(value)?.trim();
96
+ if (!trimmed) {
97
+ return undefined;
98
+ }
99
+ const normalizedSeparators = trimmed.replace(/\\/g, "/");
100
+ const leaf = basename(normalizedSeparators)
101
+ .replace(/[\u0000-\u001f\u007f]/g, "")
102
+ .trim();
103
+ return leaf || undefined;
104
+ }
105
+ function firstString(...values) {
106
+ for (const value of values) {
107
+ if (typeof value === "string") {
108
+ const trimmed = value.trim();
109
+ if (trimmed) {
110
+ return trimmed;
111
+ }
112
+ }
113
+ }
114
+ return undefined;
115
+ }
116
+ //# sourceMappingURL=attachment-staging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-staging.js","sourceRoot":"","sources":["../../src/relay/attachment-staging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export type HistoryMessage = {
2
+ role?: string;
3
+ content?: Array<{
4
+ type?: string;
5
+ text?: string;
6
+ }>;
7
+ timestamp?: number;
8
+ stopReason?: string;
9
+ errorMessage?: string;
10
+ };
11
+ export type HistoryResponse = {
12
+ sessionKey?: string;
13
+ sessionId?: string;
14
+ messages?: HistoryMessage[];
15
+ };
16
+ export type ChatHistoryOutcome = {
17
+ kind: "final";
18
+ text: string;
19
+ } | {
20
+ kind: "error";
21
+ errorMessage: string;
22
+ } | null;
23
+ export type ChatRunContext = {
24
+ sessionKey: string;
25
+ requestedAtMs: number;
26
+ promptText?: string;
27
+ };
28
+ export declare function extractHistoryOutcome(history: HistoryResponse | undefined, context: ChatRunContext): ChatHistoryOutcome;
29
+ export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, label: string): Promise<T>;
@@ -0,0 +1,69 @@
1
+ export function extractHistoryOutcome(history, context) {
2
+ const messages = history?.messages ?? [];
3
+ if (messages.length === 0) {
4
+ return null;
5
+ }
6
+ const userIndex = findHistoryUserIndex(messages, context);
7
+ if (userIndex === -1) {
8
+ return null;
9
+ }
10
+ let latestError = null;
11
+ for (let index = userIndex + 1; index < messages.length; index += 1) {
12
+ const message = messages[index];
13
+ if (message.role !== "assistant") {
14
+ continue;
15
+ }
16
+ const text = extractHistoryMessageText(message);
17
+ if (text.length > 0) {
18
+ return { kind: "final", text };
19
+ }
20
+ if (typeof message.errorMessage === "string" &&
21
+ message.errorMessage.trim().length > 0 &&
22
+ (message.stopReason === "error" || !message.stopReason)) {
23
+ latestError = message.errorMessage.trim();
24
+ }
25
+ }
26
+ return latestError ? { kind: "error", errorMessage: latestError } : null;
27
+ }
28
+ export async function withTimeout(promise, timeoutMs, label) {
29
+ return await new Promise((resolve, reject) => {
30
+ const timer = setTimeout(() => reject(new Error(`${label} timeout after ${timeoutMs}ms`)), timeoutMs);
31
+ promise
32
+ .then((value) => {
33
+ clearTimeout(timer);
34
+ resolve(value);
35
+ })
36
+ .catch((error) => {
37
+ clearTimeout(timer);
38
+ reject(error);
39
+ });
40
+ });
41
+ }
42
+ function extractHistoryMessageText(message) {
43
+ const content = Array.isArray(message?.content) ? message.content : [];
44
+ const parts = content
45
+ .filter((block) => block?.type === "text" && typeof block.text === "string")
46
+ .map((block) => block.text?.trim() ?? "")
47
+ .filter((text) => text.length > 0);
48
+ return parts.join("\n\n");
49
+ }
50
+ function findHistoryUserIndex(messages, context) {
51
+ const normalizedPrompt = context.promptText?.trim();
52
+ const notBeforeMs = context.requestedAtMs - 1_000;
53
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
54
+ const message = messages[index];
55
+ if (message.role !== "user") {
56
+ continue;
57
+ }
58
+ const timestamp = typeof message.timestamp === "number" ? message.timestamp : Number.NaN;
59
+ if (Number.isFinite(timestamp) && timestamp < notBeforeMs) {
60
+ continue;
61
+ }
62
+ const text = extractHistoryMessageText(message);
63
+ if (!normalizedPrompt || text === normalizedPrompt) {
64
+ return index;
65
+ }
66
+ }
67
+ return -1;
68
+ }
69
+ //# sourceMappingURL=chat-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-history.js","sourceRoot":"","sources":["../../src/relay/chat-history.ts"],"names":[],"mappings":"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"}