@seawork/server 1.0.19 → 1.0.20-rc.1

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 (61) hide show
  1. package/dist/scripts/supervisor-entrypoint.js +169 -0
  2. package/dist/scripts/supervisor-entrypoint.js.map +1 -1
  3. package/dist/scripts/supervisor.js +60 -10
  4. package/dist/scripts/supervisor.js.map +1 -1
  5. package/dist/server/client/daemon-client.d.ts +27 -1
  6. package/dist/server/client/daemon-client.d.ts.map +1 -1
  7. package/dist/server/client/daemon-client.js +45 -2
  8. package/dist/server/client/daemon-client.js.map +1 -1
  9. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  10. package/dist/server/server/agent/agent-manager.js +58 -3
  11. package/dist/server/server/agent/agent-manager.js.map +1 -1
  12. package/dist/server/server/agent/agent-sdk-types.d.ts +1 -0
  13. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  14. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  15. package/dist/server/server/agent/providers/claude-agent.js +27 -9
  16. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  17. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  18. package/dist/server/server/agent/providers/codex-app-server-agent.js +20 -5
  19. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  20. package/dist/server/server/bootstrap.d.ts.map +1 -1
  21. package/dist/server/server/bootstrap.js +10 -0
  22. package/dist/server/server/bootstrap.js.map +1 -1
  23. package/dist/server/server/crash-report.d.ts +12 -0
  24. package/dist/server/server/crash-report.d.ts.map +1 -0
  25. package/dist/server/server/crash-report.js +217 -0
  26. package/dist/server/server/crash-report.js.map +1 -0
  27. package/dist/server/server/editor-targets.d.ts +3 -1
  28. package/dist/server/server/editor-targets.d.ts.map +1 -1
  29. package/dist/server/server/editor-targets.js +51 -2
  30. package/dist/server/server/editor-targets.js.map +1 -1
  31. package/dist/server/server/exports.d.ts +1 -0
  32. package/dist/server/server/exports.d.ts.map +1 -1
  33. package/dist/server/server/exports.js +5 -0
  34. package/dist/server/server/exports.js.map +1 -1
  35. package/dist/server/server/index.js +20 -2
  36. package/dist/server/server/index.js.map +1 -1
  37. package/dist/server/server/latency-proxy.d.ts +39 -0
  38. package/dist/server/server/latency-proxy.d.ts.map +1 -0
  39. package/dist/server/server/latency-proxy.js +148 -0
  40. package/dist/server/server/latency-proxy.js.map +1 -0
  41. package/dist/server/server/latency-tracker.d.ts +120 -0
  42. package/dist/server/server/latency-tracker.d.ts.map +1 -0
  43. package/dist/server/server/latency-tracker.js +253 -0
  44. package/dist/server/server/latency-tracker.js.map +1 -0
  45. package/dist/server/server/session.d.ts +1 -0
  46. package/dist/server/server/session.d.ts.map +1 -1
  47. package/dist/server/server/session.js +13 -1
  48. package/dist/server/server/session.js.map +1 -1
  49. package/dist/server/shared/messages.d.ts +540 -0
  50. package/dist/server/shared/messages.d.ts.map +1 -1
  51. package/dist/server/shared/messages.js +26 -0
  52. package/dist/server/shared/messages.js.map +1 -1
  53. package/dist/src/server/bug-report-redact.js +145 -0
  54. package/dist/src/server/bug-report-redact.js.map +1 -0
  55. package/dist/src/server/crash-report.js +217 -0
  56. package/dist/src/server/crash-report.js.map +1 -0
  57. package/dist/src/server/daemon-version.js +22 -0
  58. package/dist/src/server/daemon-version.js.map +1 -0
  59. package/dist/src/server/package-version.js +46 -0
  60. package/dist/src/server/package-version.js.map +1 -0
  61. package/package.json +3 -3
@@ -0,0 +1,145 @@
1
+ const MAX_LINE_LENGTH = 2000;
2
+ const MAX_CLIENT_LOGS = 200;
3
+ const REDACTIONS = [
4
+ // URL userinfo: `scheme://user:pass@host…` — strip both user and pass
5
+ // entirely. Must run before the email rule, otherwise `user:pass@` would
6
+ // be partially absorbed as an email-like token (leaving `user` and the
7
+ // password's leading characters visible). `bun install` stderr quotes
8
+ // the active registry verbatim, so a corp Nexus mirror configured with
9
+ // basic auth would otherwise leak credentials here.
10
+ {
11
+ pattern: /(\b[a-z][a-z0-9+.\-]*:\/\/)[^/\s"'@]+@/gi,
12
+ replace: "$1<redacted>@",
13
+ },
14
+ // Bearer / Basic auth headers
15
+ { pattern: /\b(Bearer|Basic)\s+[A-Za-z0-9._\-+/=]{8,}/gi, replace: "$1 <redacted>" },
16
+ // Authorization: header value
17
+ { pattern: /(authorization"?\s*[:=]\s*"?)([^",\s]{8,})/gi, replace: "$1<redacted>" },
18
+ // Key/token/secret in KEY=value, "key":"value", key: value (JSON + env style)
19
+ {
20
+ pattern: /((?:api[_-]?key|access[_-]?token|secret|password|passwd|github[_-]?token|auth[_-]?token|session[_-]?id|cookie|refresh[_-]?token|client[_-]?secret)"?\s*[:=]\s*"?)([^",\s}]{4,})/gi,
21
+ replace: "$1<redacted>",
22
+ },
23
+ // GitHub tokens
24
+ { pattern: /\bgh[pousr]_[A-Za-z0-9]{20,}/g, replace: "<redacted-gh-token>" },
25
+ // Generic high-entropy *_KEY / *_TOKEN env-style values
26
+ {
27
+ pattern: /\b([A-Z][A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD))=([^\s"]{4,})/g,
28
+ replace: "$1=<redacted>",
29
+ },
30
+ // JWT (3 dot-separated base64url segments)
31
+ {
32
+ pattern: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,
33
+ replace: "<redacted-jwt>",
34
+ },
35
+ // Emails (except the reporter's — reporter is handled separately upstream)
36
+ {
37
+ pattern: /\b([A-Za-z0-9_.+-]{1,3})[A-Za-z0-9_.+-]*(@[A-Za-z0-9.-]+\.[A-Za-z]{2,})/g,
38
+ replace: "$1***$2",
39
+ },
40
+ // macOS / Linux user home paths
41
+ { pattern: /\/Users\/[^/\s"']+/g, replace: "/Users/<user>" },
42
+ { pattern: /\/home\/[^/\s"']+/g, replace: "/home/<user>" },
43
+ // Windows user path
44
+ { pattern: /C:\\Users\\[^\\\s"']+/g, replace: "C:\\Users\\<user>" },
45
+ ];
46
+ export function redactString(raw) {
47
+ let out = raw;
48
+ for (const { pattern, replace } of REDACTIONS) {
49
+ out = out.replace(pattern, replace);
50
+ }
51
+ if (out.length > MAX_LINE_LENGTH) {
52
+ out = out.slice(0, MAX_LINE_LENGTH) + "…[truncated]";
53
+ }
54
+ return out;
55
+ }
56
+ export function redactLogLine(msg) {
57
+ return redactString(msg);
58
+ }
59
+ export function redactClientLogs(logs) {
60
+ if (!logs)
61
+ return undefined;
62
+ const tail = logs.slice(-MAX_CLIENT_LOGS);
63
+ return tail.map((l) => ({ level: l.level, ts: l.ts, msg: redactString(l.msg) }));
64
+ }
65
+ export function redactDaemonLogTail(tail) {
66
+ if (!tail)
67
+ return undefined;
68
+ return tail
69
+ .split("\n")
70
+ .map((line) => redactString(line))
71
+ .join("\n");
72
+ }
73
+ /**
74
+ * Sanitize each free-text field of an install attempt before sending to
75
+ * bug-intake. `stderrTail` from `bun install` regularly carries the active
76
+ * registry URL (which on corp networks may include `https://user:pass@host`),
77
+ * and `cmd` / `args` may surface user-home paths. We run them through the
78
+ * same redaction the daemon uses for client/daemon logs.
79
+ */
80
+ export function redactDesktopInstallAttempts(attempts) {
81
+ if (!attempts)
82
+ return undefined;
83
+ return attempts.map((a) => ({
84
+ ts: a.ts,
85
+ agent: a.agent,
86
+ cmd: redactString(a.cmd),
87
+ args: a.args.map((arg) => redactString(arg)),
88
+ code: a.code,
89
+ reason: a.reason,
90
+ stderrTail: redactString(a.stderrTail),
91
+ spawnError: a.spawnError ? redactString(a.spawnError) : undefined,
92
+ }));
93
+ }
94
+ export function redactAgentStderrTails(tails) {
95
+ if (!tails)
96
+ return undefined;
97
+ return tails.map((tail) => ({
98
+ agentId: redactString(tail.agentId),
99
+ provider: redactString(tail.provider),
100
+ stderrTail: redactString(tail.stderrTail),
101
+ }));
102
+ }
103
+ export function redactAgentRuntimeStats(stats) {
104
+ if (!stats)
105
+ return undefined;
106
+ return stats.map((entry) => ({
107
+ agentId: redactString(entry.agentId),
108
+ provider: redactString(entry.provider),
109
+ lifecycle: entry.lifecycle ? redactString(entry.lifecycle) : undefined,
110
+ activeForegroundTurnId: entry.activeForegroundTurnId
111
+ ? redactString(entry.activeForegroundTurnId)
112
+ : entry.activeForegroundTurnId,
113
+ activeForegroundTurnStartedAt: entry.activeForegroundTurnStartedAt,
114
+ lastUserMessageAt: entry.lastUserMessageAt,
115
+ lastNotificationAt: entry.lastNotificationAt,
116
+ msSinceLastNotification: entry.msSinceLastNotification,
117
+ pendingPermissions: entry.pendingPermissions
118
+ ? entry.pendingPermissions.map((permission) => redactString(JSON.stringify(permission)))
119
+ : undefined,
120
+ }));
121
+ }
122
+ export function redactWsMessageRing(entries) {
123
+ if (!entries)
124
+ return undefined;
125
+ return entries.map((entry) => {
126
+ let preview = entry.preview;
127
+ if (typeof preview === "string") {
128
+ preview = redactString(preview);
129
+ }
130
+ else if (preview !== undefined) {
131
+ preview = redactString(JSON.stringify(preview));
132
+ }
133
+ return {
134
+ ts: entry.ts,
135
+ direction: entry.direction,
136
+ type: redactString(entry.type),
137
+ requestId: entry.requestId ? redactString(entry.requestId) : undefined,
138
+ agentId: entry.agentId ? redactString(entry.agentId) : undefined,
139
+ messageId: entry.messageId ? redactString(entry.messageId) : undefined,
140
+ durationMs: entry.durationMs,
141
+ preview,
142
+ };
143
+ });
144
+ }
145
+ //# sourceMappingURL=bug-report-redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bug-report-redact.js","sourceRoot":"","sources":["../../../src/server/bug-report-redact.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,IAAK,CAAC;AAC9B,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,MAAM,UAAU,GAA2C;IACzD,sEAAsE;IACtE,yEAAyE;IACzE,uEAAuE;IACvE,sEAAsE;IACtE,uEAAuE;IACvE,oDAAoD;IACpD;QACE,OAAO,EAAE,0CAA0C;QACnD,OAAO,EAAE,eAAe;KACzB;IACD,8BAA8B;IAC9B,EAAE,OAAO,EAAE,6CAA6C,EAAE,OAAO,EAAE,eAAe,EAAE;IACpF,8BAA8B;IAC9B,EAAE,OAAO,EAAE,8CAA8C,EAAE,OAAO,EAAE,cAAc,EAAE;IACpF,8EAA8E;IAC9E;QACE,OAAO,EACL,mLAAmL;QACrL,OAAO,EAAE,cAAc;KACxB;IACD,gBAAgB;IAChB,EAAE,OAAO,EAAE,+BAA+B,EAAE,OAAO,EAAE,qBAAqB,EAAE;IAC5E,wDAAwD;IACxD;QACE,OAAO,EAAE,gEAAgE;QACzE,OAAO,EAAE,eAAe;KACzB;IACD,2CAA2C;IAC3C;QACE,OAAO,EAAE,oEAAoE;QAC7E,OAAO,EAAE,gBAAgB;KAC1B;IACD,2EAA2E;IAC3E;QACE,OAAO,EAAE,0EAA0E;QACnF,OAAO,EAAE,SAAS;KACnB;IACD,gCAAgC;IAChC,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,eAAe,EAAE;IAC5D,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAE;IAC1D,oBAAoB;IACpB,EAAE,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,mBAAmB,EAAE;CACpE,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,CAAC;QAC9C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,cAAc,CAAC;IACvD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAA8D;IAE9D,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAwB;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACjC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AA0CD;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAA6C;IAE7C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;QACxB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;QACtC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;KAClE,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAoC;IAEpC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QACnC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrC,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;KAC1C,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAsC;IAEtC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3B,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC;QACpC,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC;QACtC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QACtE,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;YAClD,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,sBAAsB,CAAC;YAC5C,CAAC,CAAC,KAAK,CAAC,sBAAsB;QAChC,6BAA6B,EAAE,KAAK,CAAC,6BAA6B;QAClE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,uBAAuB,EAAE,KAAK,CAAC,uBAAuB;QACtD,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC1C,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;YACxF,CAAC,CAAC,SAAS;KACd,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAyC;IAEzC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC3B,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC5B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;YACtE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YAChE,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;YACtE,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO;SACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,217 @@
1
+ import { constants as fsConstants, existsSync, readFileSync } from "node:fs";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { redactDaemonLogTail, redactString } from "./bug-report-redact.js";
5
+ import { resolveDaemonVersion } from "./daemon-version.js";
6
+ // File the desktop main process writes whenever the user flips the
7
+ // crash-reporting toggle. Lives in the daemon's SEAWORK_HOME so the
8
+ // daemon and supervisor can pick the new value up on the very next
9
+ // emit — no respawn required. The spawn-time env var
10
+ // SEAWORK_CRASH_REPORTING is retained as the boot-time default.
11
+ const ENABLED_FILE_NAME = "crash-reporting.enabled";
12
+ export function isCrashReportingEnabledSync(seaworkHome) {
13
+ try {
14
+ const file = path.join(seaworkHome, ENABLED_FILE_NAME);
15
+ if (existsSync(file)) {
16
+ const raw = readFileSync(file, "utf-8").trim();
17
+ if (raw === "0" || raw === "false")
18
+ return false;
19
+ if (raw === "1" || raw === "true")
20
+ return true;
21
+ }
22
+ }
23
+ catch {
24
+ /* fall through to env */
25
+ }
26
+ return process.env.SEAWORK_CRASH_REPORTING !== "0";
27
+ }
28
+ // Tail size matches the manual bug-report path so engineers see the same
29
+ // context regardless of whether the report was filed by a human or auto-
30
+ // generated by the fatal handler.
31
+ const DAEMON_LOG_TAIL_BYTES = 32 * 1024;
32
+ // Cap the time we spend trying to deliver a crash report; the process is
33
+ // already on its way out and we don't want to delay exit indefinitely.
34
+ const CRASH_POST_TIMEOUT_MS = 5000;
35
+ // Per-signature suppression window. If a crashloop fires the same error
36
+ // repeatedly (supervisor in dev mode respawns the daemon on every crash),
37
+ // we don't want to flood bug-intake with one issue per loop iteration —
38
+ // the first report is enough. State lives in the seaworkHome so it
39
+ // survives respawns within a single install.
40
+ const DEDUPE_WINDOW_MS = 5 * 60 * 1000;
41
+ const DEDUPE_STATE_FILE = "crash-report-dedupe.json";
42
+ const BUG_INTAKE_URL = process.env.BUG_INTAKE_URL?.replace(/\/+$/, "") || "https://seawork-bug-intake.sg.seaverse.dev";
43
+ async function readLogTail(logPath, maxBytes) {
44
+ try {
45
+ await fs.access(logPath, fsConstants.R_OK);
46
+ }
47
+ catch {
48
+ return undefined;
49
+ }
50
+ const handle = await fs.open(logPath, "r");
51
+ try {
52
+ const stat = await handle.stat();
53
+ const start = Math.max(0, stat.size - maxBytes);
54
+ const length = stat.size - start;
55
+ const buffer = Buffer.alloc(length);
56
+ await handle.read(buffer, 0, length, start);
57
+ return buffer.toString("utf8");
58
+ }
59
+ finally {
60
+ await handle.close();
61
+ }
62
+ }
63
+ // Persist a tiny "last reported at" record per crash signature across
64
+ // daemon respawns so a fast crashloop only fires one report per window.
65
+ // File format: { [signature: string]: epochMs }.
66
+ async function shouldSuppressBySignature(seaworkHome, signature) {
67
+ const file = path.join(seaworkHome, DEDUPE_STATE_FILE);
68
+ let state = {};
69
+ try {
70
+ const raw = await fs.readFile(file, "utf-8");
71
+ const parsed = JSON.parse(raw);
72
+ if (parsed && typeof parsed === "object")
73
+ state = parsed;
74
+ }
75
+ catch {
76
+ /* missing or unreadable → treat as empty */
77
+ }
78
+ const now = Date.now();
79
+ const last = state[signature];
80
+ if (typeof last === "number" && now - last < DEDUPE_WINDOW_MS) {
81
+ return true;
82
+ }
83
+ // Prune old entries to keep the file from growing unbounded across
84
+ // upgrades, then write back. Best-effort — write failure just means
85
+ // we may re-report once, which is preferable to throwing.
86
+ for (const key of Object.keys(state)) {
87
+ if (now - (state[key] ?? 0) > DEDUPE_WINDOW_MS)
88
+ delete state[key];
89
+ }
90
+ state[signature] = now;
91
+ try {
92
+ await fs.mkdir(path.dirname(file), { recursive: true });
93
+ await fs.writeFile(file, JSON.stringify(state), "utf-8");
94
+ }
95
+ catch {
96
+ /* ignore */
97
+ }
98
+ return false;
99
+ }
100
+ function errorSummary(err) {
101
+ if (err instanceof Error) {
102
+ return { message: err.message, stack: err.stack, name: err.name };
103
+ }
104
+ if (typeof err === "string")
105
+ return { message: err };
106
+ try {
107
+ return { message: JSON.stringify(err) };
108
+ }
109
+ catch {
110
+ return { message: String(err) };
111
+ }
112
+ }
113
+ // Best-effort POST a crash report to bug-intake. Never throws — the caller is
114
+ // already in a fatal-exit path and must keep going regardless.
115
+ export async function emitDaemonCrashReport(args) {
116
+ const { err, kind, logger, seaworkHome } = args;
117
+ // Prefer the explicit clientId from the caller; fall back to the
118
+ // SEAWORK_INSTALL_ID env injected by the desktop daemon-manager so
119
+ // crashes from a desktop-managed daemon still carry the install's
120
+ // stable identifier for server-side dedupe and triage correlation.
121
+ const clientId = args.clientId ?? process.env.SEAWORK_INSTALL_ID ?? undefined;
122
+ // Honor the latest user preference even if it changed since spawn:
123
+ // the file is rewritten by the desktop main process as soon as the
124
+ // toggle flips, so a user who opts out doesn't have to wait for the
125
+ // next daemon restart for it to take effect.
126
+ if (!isCrashReportingEnabledSync(seaworkHome)) {
127
+ return;
128
+ }
129
+ const summary = errorSummary(err);
130
+ // Error messages and stack traces routinely contain absolute paths
131
+ // (e.g. `ENOENT: /Users/<name>/...`) and other identifying tokens, so
132
+ // run them through the same redactor we use for daemon.log before the
133
+ // payload leaves the process.
134
+ const redactedMessage = redactString(summary.message);
135
+ const redactedStack = summary.stack ? redactString(summary.stack) : undefined;
136
+ const firstLine = redactedMessage.split("\n")[0]?.slice(0, 140) ?? "(no message)";
137
+ const title = `daemon ${kind}: ${firstLine}`;
138
+ // Suppress duplicate reports for the same (kind, error-name, first-line)
139
+ // signature within DEDUPE_WINDOW_MS. A crashlooping daemon that respawns
140
+ // every few seconds would otherwise file one issue per loop.
141
+ const signature = `${kind}::${summary.name ?? ""}::${firstLine}`;
142
+ if (await shouldSuppressBySignature(seaworkHome, signature)) {
143
+ logger.info({ kind, signature }, "daemon crash report suppressed (recent duplicate)");
144
+ return;
145
+ }
146
+ const daemonLogTail = await readLogTail(path.join(seaworkHome, "daemon.log"), DAEMON_LOG_TAIL_BYTES).catch(() => undefined);
147
+ let appVersion;
148
+ try {
149
+ appVersion = resolveDaemonVersion();
150
+ }
151
+ catch {
152
+ appVersion = undefined;
153
+ }
154
+ // bug-intake caps `description` at 20_000 chars; long V8 stacks (deep
155
+ // promise chains, native module errors) easily blow past that and would
156
+ // 400 the report. Cap the stack the same way the desktop side does so
157
+ // both auto-report paths behave consistently. The daemon log tail goes
158
+ // in its own schema-level field and isn't subject to this cap.
159
+ const STACK_CAP = 8000;
160
+ const MESSAGE_CAP = 1000;
161
+ const truncateForDescription = (s, cap) => s.length <= cap ? s : s.slice(0, cap) + "\n…[truncated]";
162
+ const cappedMessage = truncateForDescription(redactedMessage, MESSAGE_CAP);
163
+ const cappedStack = redactedStack ? truncateForDescription(redactedStack, STACK_CAP) : undefined;
164
+ const description = [
165
+ `Auto-reported by the daemon fatal handler.`,
166
+ "",
167
+ `**kind**: ${kind}`,
168
+ `**error.name**: ${summary.name ?? "(unknown)"}`,
169
+ `**error.message**: ${cappedMessage}`,
170
+ "",
171
+ "<details><summary>stack</summary>",
172
+ "",
173
+ "```",
174
+ cappedStack ?? "(no stack)",
175
+ "```",
176
+ "",
177
+ "</details>",
178
+ ].join("\n");
179
+ const payload = {
180
+ title,
181
+ description,
182
+ email: "crash-noreply@daemon.local",
183
+ displayName: "Crash Reporter",
184
+ kind: "crash",
185
+ clientId,
186
+ appVersion,
187
+ // device intentionally omits user-identifying values (hostname,
188
+ // seaworkHome, etc.) — these are commonly tied to a real person's
189
+ // username or machine name, and the auto-crash reports land in
190
+ // GitHub-backed bug intake.
191
+ device: {
192
+ platform: process.platform,
193
+ arch: process.arch,
194
+ nodeVersion: process.version,
195
+ },
196
+ daemonLogTail: redactDaemonLogTail(daemonLogTail),
197
+ };
198
+ try {
199
+ const res = await fetch(BUG_INTAKE_URL + "/bugs", {
200
+ method: "POST",
201
+ headers: { "content-type": "application/json" },
202
+ body: JSON.stringify(payload),
203
+ signal: AbortSignal.timeout(CRASH_POST_TIMEOUT_MS),
204
+ });
205
+ if (!res.ok) {
206
+ const text = await res.text().catch(() => "");
207
+ logger.warn({ status: res.status, text }, "bug-intake rejected crash report");
208
+ return;
209
+ }
210
+ logger.info({ kind }, "daemon crash report delivered");
211
+ }
212
+ catch (postErr) {
213
+ // The process is crashing; surface the failure once and move on.
214
+ logger.warn({ err: postErr, url: BUG_INTAKE_URL }, "crash report POST failed");
215
+ }
216
+ }
217
+ //# sourceMappingURL=crash-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crash-report.js","sourceRoot":"","sources":["../../../src/server/crash-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { PackageVersionResolutionError, resolvePackageVersion } from "./package-version.js";
2
+ const SERVER_PACKAGE_NAME = "@seawork/server";
3
+ export class DaemonVersionResolutionError extends PackageVersionResolutionError {
4
+ }
5
+ export function resolveDaemonVersion(moduleUrl = import.meta.url) {
6
+ try {
7
+ return resolvePackageVersion({
8
+ moduleUrl,
9
+ packageName: SERVER_PACKAGE_NAME,
10
+ });
11
+ }
12
+ catch (error) {
13
+ if (error instanceof PackageVersionResolutionError) {
14
+ throw new DaemonVersionResolutionError({
15
+ moduleUrl,
16
+ packageName: SERVER_PACKAGE_NAME,
17
+ });
18
+ }
19
+ throw error;
20
+ }
21
+ }
22
+ //# sourceMappingURL=daemon-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-version.js","sourceRoot":"","sources":["../../../src/server/daemon-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE5F,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAE9C,MAAM,OAAO,4BAA6B,SAAQ,6BAA6B;CAAG;AAElF,MAAM,UAAU,oBAAoB,CAAC,YAAoB,MAAM,CAAC,IAAI,CAAC,GAAG;IACtE,IAAI,CAAC;QACH,OAAO,qBAAqB,CAAC;YAC3B,SAAS;YACT,WAAW,EAAE,mBAAmB;SACjC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,6BAA6B,EAAE,CAAC;YACnD,MAAM,IAAI,4BAA4B,CAAC;gBACrC,SAAS;gBACT,WAAW,EAAE,mBAAmB;aACjC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export class PackageVersionResolutionError extends Error {
5
+ constructor(params) {
6
+ super(`Unable to resolve ${params.packageName} version from module URL ${params.moduleUrl}.`);
7
+ this.name = "PackageVersionResolutionError";
8
+ }
9
+ }
10
+ export function resolvePackageVersion(params) {
11
+ const moduleUrl = params.moduleUrl ?? import.meta.url;
12
+ let currentDir = path.dirname(fileURLToPath(moduleUrl));
13
+ while (true) {
14
+ const packageJsonPath = path.join(currentDir, "package.json");
15
+ if (existsSync(packageJsonPath)) {
16
+ try {
17
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
18
+ if (packageJson.name === params.packageName) {
19
+ if (typeof packageJson.version === "string" && packageJson.version.trim().length > 0) {
20
+ return packageJson.version.trim();
21
+ }
22
+ throw new PackageVersionResolutionError({
23
+ moduleUrl,
24
+ packageName: params.packageName,
25
+ });
26
+ }
27
+ }
28
+ catch (error) {
29
+ if (error instanceof PackageVersionResolutionError) {
30
+ throw error;
31
+ }
32
+ // Continue searching parent directories.
33
+ }
34
+ }
35
+ const parentDir = path.dirname(currentDir);
36
+ if (parentDir === currentDir) {
37
+ break;
38
+ }
39
+ currentDir = parentDir;
40
+ }
41
+ throw new PackageVersionResolutionError({
42
+ moduleUrl,
43
+ packageName: params.packageName,
44
+ });
45
+ }
46
+ //# sourceMappingURL=package-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-version.js","sourceRoot":"","sources":["../../../src/server/package-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAYzC,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACtD,YAAY,MAAkD;QAC5D,KAAK,CAAC,qBAAqB,MAAM,CAAC,WAAW,4BAA4B,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QAC9F,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAmC;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACtD,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAExD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC9D,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAgB,CAAC;gBACrF,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC5C,IAAI,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrF,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACpC,CAAC;oBACD,MAAM,IAAI,6BAA6B,CAAC;wBACtC,SAAS;wBACT,WAAW,EAAE,MAAM,CAAC,WAAW;qBAChC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,6BAA6B,EAAE,CAAC;oBACnD,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,yCAAyC;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM;QACR,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,6BAA6B,CAAC;QACtC,SAAS;QACT,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seawork/server",
3
- "version": "1.0.19",
3
+ "version": "1.0.20-rc.1",
4
4
  "description": "Seawork backend server",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -74,8 +74,8 @@
74
74
  "@isaacs/ttlcache": "^2.1.4",
75
75
  "@modelcontextprotocol/sdk": "^1.20.1",
76
76
  "@sctg/sentencepiece-js": "^1.1.0",
77
- "@seawork/highlight": "1.0.19",
78
- "@seawork/relay": "1.0.19",
77
+ "@seawork/highlight": "1.0.20-rc.1",
78
+ "@seawork/relay": "1.0.20-rc.1",
79
79
  "@xterm/headless": "^6.0.0",
80
80
  "ai": "5.0.78",
81
81
  "ajv": "^8.17.1",