@tom2012/cc-web 2026.4.22-a → 2026.4.22-c

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 (132) hide show
  1. package/README.md +1 -1
  2. package/backend/dist/adapters/claude/usage.d.ts +29 -0
  3. package/backend/dist/adapters/claude/usage.d.ts.map +1 -0
  4. package/backend/dist/adapters/claude/usage.js +202 -0
  5. package/backend/dist/adapters/claude/usage.js.map +1 -0
  6. package/backend/dist/adapters/claude-adapter.d.ts +1 -0
  7. package/backend/dist/adapters/claude-adapter.d.ts.map +1 -1
  8. package/backend/dist/adapters/claude-adapter.js +7 -4
  9. package/backend/dist/adapters/claude-adapter.js.map +1 -1
  10. package/backend/dist/adapters/codex-adapter.d.ts +18 -1
  11. package/backend/dist/adapters/codex-adapter.d.ts.map +1 -1
  12. package/backend/dist/adapters/codex-adapter.js +163 -20
  13. package/backend/dist/adapters/codex-adapter.js.map +1 -1
  14. package/backend/dist/adapters/gemini-adapter.d.ts +1 -0
  15. package/backend/dist/adapters/gemini-adapter.d.ts.map +1 -1
  16. package/backend/dist/adapters/gemini-adapter.js +1 -0
  17. package/backend/dist/adapters/gemini-adapter.js.map +1 -1
  18. package/backend/dist/adapters/opencode-adapter.d.ts +1 -0
  19. package/backend/dist/adapters/opencode-adapter.d.ts.map +1 -1
  20. package/backend/dist/adapters/opencode-adapter.js +1 -0
  21. package/backend/dist/adapters/opencode-adapter.js.map +1 -1
  22. package/backend/dist/adapters/qwen-adapter.d.ts +1 -0
  23. package/backend/dist/adapters/qwen-adapter.d.ts.map +1 -1
  24. package/backend/dist/adapters/qwen-adapter.js +1 -0
  25. package/backend/dist/adapters/qwen-adapter.js.map +1 -1
  26. package/backend/dist/adapters/terminal-adapter.d.ts +1 -0
  27. package/backend/dist/adapters/terminal-adapter.d.ts.map +1 -1
  28. package/backend/dist/adapters/terminal-adapter.js +1 -0
  29. package/backend/dist/adapters/terminal-adapter.js.map +1 -1
  30. package/backend/dist/adapters/types.d.ts +10 -0
  31. package/backend/dist/adapters/types.d.ts.map +1 -1
  32. package/backend/dist/agent-prompts.d.ts +14 -10
  33. package/backend/dist/agent-prompts.d.ts.map +1 -1
  34. package/backend/dist/agent-prompts.js +51 -21
  35. package/backend/dist/agent-prompts.js.map +1 -1
  36. package/backend/dist/approval-manager.d.ts +10 -0
  37. package/backend/dist/approval-manager.d.ts.map +1 -1
  38. package/backend/dist/approval-manager.js +14 -2
  39. package/backend/dist/approval-manager.js.map +1 -1
  40. package/backend/dist/auth.d.ts.map +1 -1
  41. package/backend/dist/auth.js +15 -2
  42. package/backend/dist/auth.js.map +1 -1
  43. package/backend/dist/config.d.ts.map +1 -1
  44. package/backend/dist/config.js +3 -1
  45. package/backend/dist/config.js.map +1 -1
  46. package/backend/dist/hooks-manager.d.ts +9 -0
  47. package/backend/dist/hooks-manager.d.ts.map +1 -1
  48. package/backend/dist/hooks-manager.js +14 -3
  49. package/backend/dist/hooks-manager.js.map +1 -1
  50. package/backend/dist/index.d.ts.map +1 -1
  51. package/backend/dist/index.js +49 -13
  52. package/backend/dist/index.js.map +1 -1
  53. package/backend/dist/logger.d.ts +47 -0
  54. package/backend/dist/logger.d.ts.map +1 -0
  55. package/backend/dist/logger.js +355 -0
  56. package/backend/dist/logger.js.map +1 -0
  57. package/backend/dist/memory-prompts.d.ts +3 -2
  58. package/backend/dist/memory-prompts.d.ts.map +1 -1
  59. package/backend/dist/memory-prompts.js +10 -10
  60. package/backend/dist/memory-prompts.js.map +1 -1
  61. package/backend/dist/middleware/request-log.d.ts +3 -0
  62. package/backend/dist/middleware/request-log.d.ts.map +1 -0
  63. package/backend/dist/middleware/request-log.js +97 -0
  64. package/backend/dist/middleware/request-log.js.map +1 -0
  65. package/backend/dist/notify-service.d.ts.map +1 -1
  66. package/backend/dist/notify-service.js +3 -1
  67. package/backend/dist/notify-service.js.map +1 -1
  68. package/backend/dist/plugin-manager.d.ts.map +1 -1
  69. package/backend/dist/plugin-manager.js +8 -6
  70. package/backend/dist/plugin-manager.js.map +1 -1
  71. package/backend/dist/routes/agent-prompts.d.ts.map +1 -1
  72. package/backend/dist/routes/agent-prompts.js +28 -26
  73. package/backend/dist/routes/agent-prompts.js.map +1 -1
  74. package/backend/dist/routes/auth.d.ts.map +1 -1
  75. package/backend/dist/routes/auth.js +3 -1
  76. package/backend/dist/routes/auth.js.map +1 -1
  77. package/backend/dist/routes/hooks.d.ts.map +1 -1
  78. package/backend/dist/routes/hooks.js +19 -0
  79. package/backend/dist/routes/hooks.js.map +1 -1
  80. package/backend/dist/routes/memory-prompts.d.ts.map +1 -1
  81. package/backend/dist/routes/memory-prompts.js +13 -11
  82. package/backend/dist/routes/memory-prompts.js.map +1 -1
  83. package/backend/dist/routes/projects.d.ts.map +1 -1
  84. package/backend/dist/routes/projects.js +12 -3
  85. package/backend/dist/routes/projects.js.map +1 -1
  86. package/backend/dist/routes/skillhub.d.ts.map +1 -1
  87. package/backend/dist/routes/skillhub.js +4 -2
  88. package/backend/dist/routes/skillhub.js.map +1 -1
  89. package/backend/dist/routes/update.d.ts.map +1 -1
  90. package/backend/dist/routes/update.js +24 -6
  91. package/backend/dist/routes/update.js.map +1 -1
  92. package/backend/dist/session-manager.d.ts.map +1 -1
  93. package/backend/dist/session-manager.js +66 -16
  94. package/backend/dist/session-manager.js.map +1 -1
  95. package/backend/dist/sync-scheduler.d.ts.map +1 -1
  96. package/backend/dist/sync-scheduler.js +41 -2
  97. package/backend/dist/sync-scheduler.js.map +1 -1
  98. package/backend/dist/sync-service.d.ts +3 -1
  99. package/backend/dist/sync-service.d.ts.map +1 -1
  100. package/backend/dist/sync-service.js +18 -6
  101. package/backend/dist/sync-service.js.map +1 -1
  102. package/backend/dist/terminal-manager.d.ts +4 -1
  103. package/backend/dist/terminal-manager.d.ts.map +1 -1
  104. package/backend/dist/terminal-manager.js +31 -8
  105. package/backend/dist/terminal-manager.js.map +1 -1
  106. package/backend/dist/usage-terminal.d.ts.map +1 -1
  107. package/backend/dist/usage-terminal.js +5 -3
  108. package/backend/dist/usage-terminal.js.map +1 -1
  109. package/backend/package-lock.json +153 -0
  110. package/backend/package.json +2 -0
  111. package/bin/ccweb.js +3 -1
  112. package/frontend/dist/assets/AssistantMessageContent-D9UiFFE2.js +13 -0
  113. package/frontend/dist/assets/{GraphPreview-oSG5zw4O.js → GraphPreview-MfS2qFbu.js} +1 -1
  114. package/frontend/dist/assets/{MobilePage-DNkQnE7-.js → MobilePage-C32pb6m8.js} +3 -3
  115. package/frontend/dist/assets/{OfficePreview-C5YVCs_i.js → OfficePreview-BTOmTUcw.js} +2 -2
  116. package/frontend/dist/assets/ProjectPage-Dhxpa8db.js +26 -0
  117. package/frontend/dist/assets/{SettingsPage-BBVvLPDr.js → SettingsPage-ChzjDTNX.js} +2 -2
  118. package/frontend/dist/assets/{SkillHubPage-fxW189Ca.js → SkillHubPage-DKtZOrUk.js} +3 -3
  119. package/frontend/dist/assets/{chevron-down-DwQtRZFp.js → chevron-down-CDoIuDnn.js} +1 -1
  120. package/frontend/dist/assets/{chevron-up-B43U8MiF.js → chevron-up-jGWs6GMh.js} +1 -1
  121. package/frontend/dist/assets/index-CPwZI53Z.js +75 -0
  122. package/frontend/dist/assets/{index-DHlRaHat.js → index-D7HRanYr.js} +1 -1
  123. package/frontend/dist/assets/{index-CqX-dw66.js → index-DqgIuQ6k.js} +1 -1
  124. package/frontend/dist/assets/index-t3Zp9UzI.css +1 -0
  125. package/frontend/dist/assets/{jszip.min-COVqv5KF.js → jszip.min-BRHGpQBe.js} +1 -1
  126. package/frontend/dist/assets/{search-Bg2yBV9K.js → search-DM1GyKez.js} +1 -1
  127. package/frontend/dist/index.html +2 -2
  128. package/package.json +1 -1
  129. package/frontend/dist/assets/AssistantMessageContent-Cbd8kEKb.js +0 -13
  130. package/frontend/dist/assets/ProjectPage-BI-45S2D.js +0 -26
  131. package/frontend/dist/assets/index-CjKxGpPA.css +0 -1
  132. package/frontend/dist/assets/index-CjiPKISh.js +0 -75
@@ -0,0 +1,355 @@
1
+ "use strict";
2
+ /*
3
+ * ccweb 结构化日志(pino + pino-roll + ALS)
4
+ *
5
+ * === 红线(hard rules;违反视同引入安全 bug) ===
6
+ * 1. PTY 字节流(input 或 output)永不入日志,无论截断、preview、还是 hex。
7
+ * terminal-manager.writeRaw / xterm output 都在此范围。理由:用户在 Claude TUI
8
+ * 粘贴的可能是 API key / token / 密码,PTY 字节流是"用户秘密污染"的。
9
+ * 2. 聊天消息 body 永不整段入日志;仅 { len, preview: text.slice(0, 80) }。
10
+ * 3. 文件内容永不入日志;仅 { path, size }。
11
+ * 4. REDACT_KEYS 白名单外的可疑字段按 "宁愿 redact 不冒险" 处理。
12
+ *
13
+ * === 用法 ===
14
+ * 启动时: await initLogger(); installFatalHandlers();
15
+ * 模块: const log = modLogger('terminal'); log.info({ projectId }, 'started');
16
+ * HTTP: als.run({ reqId, user }, () => next()) —— middleware 里一行,下游自动带
17
+ * 子进程: 子进程 runId 由调用方生成并塞进 mixin(见 sync / update 模块)
18
+ * 退出: SIGTERM 走 flushLogger() + server.close() + process.exit(0)
19
+ * uncaught 异常由 installFatalHandlers 接管,保证 rollStream.flushSync 后才退
20
+ *
21
+ * === 运行期 toggle ===
22
+ * kill -USR1 $(cat ~/.ccweb/ccweb.pid) 在 info / debug 之间切换级别,无需重启
23
+ */
24
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ var desc = Object.getOwnPropertyDescriptor(m, k);
27
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
28
+ desc = { enumerable: true, get: function() { return m[k]; } };
29
+ }
30
+ Object.defineProperty(o, k2, desc);
31
+ }) : (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ o[k2] = m[k];
34
+ }));
35
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
36
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
37
+ }) : function(o, v) {
38
+ o["default"] = v;
39
+ });
40
+ var __importStar = (this && this.__importStar) || (function () {
41
+ var ownKeys = function(o) {
42
+ ownKeys = Object.getOwnPropertyNames || function (o) {
43
+ var ar = [];
44
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
45
+ return ar;
46
+ };
47
+ return ownKeys(o);
48
+ };
49
+ return function (mod) {
50
+ if (mod && mod.__esModule) return mod;
51
+ var result = {};
52
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
53
+ __setModuleDefault(result, mod);
54
+ return result;
55
+ };
56
+ })();
57
+ var __importDefault = (this && this.__importDefault) || function (mod) {
58
+ return (mod && mod.__esModule) ? mod : { "default": mod };
59
+ };
60
+ Object.defineProperty(exports, "__esModule", { value: true });
61
+ exports.als = void 0;
62
+ exports.runWithContext = runWithContext;
63
+ exports.initLogger = initLogger;
64
+ exports.getLogger = getLogger;
65
+ exports.modLogger = modLogger;
66
+ exports.installFatalHandlers = installFatalHandlers;
67
+ exports.flushLogger = flushLogger;
68
+ const pino_1 = __importDefault(require("pino"));
69
+ const pino_roll_1 = __importDefault(require("pino-roll"));
70
+ const async_hooks_1 = require("async_hooks");
71
+ const path = __importStar(require("path"));
72
+ const fs = __importStar(require("fs"));
73
+ const os = __importStar(require("os"));
74
+ // ────────────────── 常量 ──────────────────
75
+ const LOGS_DIR = path.join(os.homedir(), '.ccweb', 'logs');
76
+ const VERSION = (() => {
77
+ try {
78
+ const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8'));
79
+ return `v${pkg.version}`;
80
+ }
81
+ catch {
82
+ return 'v?';
83
+ }
84
+ })();
85
+ const DEFAULT_MAX_MB = parseInt(process.env.CCWEB_LOG_MAX_MB_PER_DAY || '20', 10);
86
+ const DEFAULT_RETAIN = parseInt(process.env.CCWEB_LOG_RETAIN_DAYS || '7', 10);
87
+ const DEFAULT_LEVEL = process.env.CCWEB_LOG_LEVEL || 'info';
88
+ /** Fields whose values are always replaced with '***'. */
89
+ const REDACT_KEYS = [
90
+ 'password',
91
+ 'passwordHash',
92
+ 'token',
93
+ 'jwtSecret',
94
+ 'approvalSecret',
95
+ 'authorization',
96
+ 'apiKey',
97
+ 'SSHPASS',
98
+ 'hubToken',
99
+ 'publishToken',
100
+ 'oauthToken',
101
+ 'accessToken',
102
+ 'refreshToken',
103
+ '*.password',
104
+ '*.token',
105
+ '*.secret',
106
+ 'req.headers.authorization',
107
+ 'req.headers.cookie',
108
+ ];
109
+ /**
110
+ * Regex redactors applied to every string value we encounter — AND to nested
111
+ * err.message / err.stack (pino's built-in err serializer unpacks Error into
112
+ * `{type, message, stack}`, which bypasses both REDACT_KEYS and the shallow
113
+ * top-level sweep unless we handle err explicitly).
114
+ *
115
+ * Threshold for hex redaction is 64 chars (SHA-256 / generated 32-byte hex
116
+ * secrets). 40-hex would false-positive on git SHAs and unlucky directory
117
+ * names (reviewer C2).
118
+ *
119
+ * GitHub PAT prefixes cover ghp_/gho_/ghu_/ghs_/ghr_ (legacy) and
120
+ * github_pat_ (fine-grained). skillhub routes user PATs through this
121
+ * logger when ops throw (reviewer N6 — zero-cost defence).
122
+ */
123
+ const REGEX_REDACTORS = [
124
+ [/Bearer [A-Za-z0-9._\-]+/g, 'Bearer ***'],
125
+ [/npm_[A-Za-z0-9]{20,}/g, 'npm_***'],
126
+ [/\b(ghp_|gho_|ghu_|ghs_|ghr_|github_pat_)[A-Za-z0-9_]{20,}\b/g, 'gh_***'],
127
+ [/\b[a-f0-9]{64,}\b/gi, 'hex:***'],
128
+ ];
129
+ function redactString(s) {
130
+ let out = s;
131
+ for (const [re, rep] of REGEX_REDACTORS)
132
+ out = out.replace(re, rep);
133
+ return out;
134
+ }
135
+ /**
136
+ * Recursively redact message/stack along the `err.cause` chain.
137
+ *
138
+ * Reviewer Critical #1: pino's err serializer expands `{cause}` into its own
139
+ * nested `{type, message, stack}` object in the final output; the parent's
140
+ * `err.stack` also contains a "Caused by:" block with the child stack joined.
141
+ * Single-level redact (obj.err.message + obj.err.stack) misses cause.message
142
+ * / cause.stack as separate fields. Depth cap 3 prevents infinite loops on
143
+ * self-referential causes and caps CPU on malicious err graphs.
144
+ */
145
+ function redactErrDeep(err, depth = 0) {
146
+ if (!err || typeof err !== 'object' || depth > 3)
147
+ return;
148
+ const e = err;
149
+ if (typeof e.message === 'string')
150
+ e.message = redactString(e.message);
151
+ if (typeof e.stack === 'string')
152
+ e.stack = redactString(e.stack);
153
+ if (e.cause)
154
+ redactErrDeep(e.cause, depth + 1);
155
+ }
156
+ exports.als = new async_hooks_1.AsyncLocalStorage();
157
+ function runWithContext(ctx, fn) {
158
+ return exports.als.run(ctx, fn);
159
+ }
160
+ // ────────────────── Logger 实例(延迟初始化)──────────────────
161
+ let logger = null;
162
+ // pino-roll returns a SonicBoom stream; we hold it for flushSync on fatal exit.
163
+ let rollStream = null;
164
+ function ensureDir() {
165
+ try {
166
+ fs.mkdirSync(LOGS_DIR, { mode: 0o700, recursive: true });
167
+ // chmod even if dir existed (recreated between versions)
168
+ fs.chmodSync(LOGS_DIR, 0o700);
169
+ }
170
+ catch {
171
+ /* best effort */
172
+ }
173
+ }
174
+ async function initLogger() {
175
+ if (logger)
176
+ return logger;
177
+ ensureDir();
178
+ rollStream = await (0, pino_roll_1.default)({
179
+ file: path.join(LOGS_DIR, 'ccweb'),
180
+ dateFormat: 'yyyy-MM-dd',
181
+ extension: '.log',
182
+ frequency: 'daily',
183
+ size: `${DEFAULT_MAX_MB}m`,
184
+ limit: { count: DEFAULT_RETAIN },
185
+ mkdir: true,
186
+ // sonic-boom passthrough: create log files 0600 (owner-only)
187
+ mode: 0o600,
188
+ });
189
+ logger = (0, pino_1.default)({
190
+ level: DEFAULT_LEVEL,
191
+ base: { ver: VERSION, pid: process.pid },
192
+ timestamp: pino_1.default.stdTimeFunctions.isoTime,
193
+ messageKey: 'msg',
194
+ errorKey: 'err',
195
+ formatters: {
196
+ level: (label) => ({ lvl: label }),
197
+ log: (obj) => {
198
+ // ALS injection: HTTP/WS handlers put reqId/user into ALS;
199
+ // any log event downstream in the same async chain auto-tags.
200
+ const ctx = exports.als.getStore();
201
+ if (ctx) {
202
+ if (ctx.reqId && !obj.reqId)
203
+ obj.reqId = ctx.reqId;
204
+ if (ctx.user && !obj.user)
205
+ obj.user = ctx.user;
206
+ if (ctx.projectId && !obj.projectId)
207
+ obj.projectId = ctx.projectId;
208
+ if (ctx.wsId && !obj.wsId)
209
+ obj.wsId = ctx.wsId;
210
+ if (ctx.runId && !obj.runId)
211
+ obj.runId = ctx.runId;
212
+ }
213
+ // Shallow regex sweep over string values.
214
+ for (const k of Object.keys(obj)) {
215
+ const v = obj[k];
216
+ if (typeof v === 'string')
217
+ obj[k] = redactString(v);
218
+ }
219
+ // Deep sweep on serialized Error along the `cause` chain.
220
+ // pino's err serializer expands nested err.cause into its own
221
+ // {type, message, stack} sub-object; the parent stack also
222
+ // contains a "Caused by:" block. Single-level redact misses
223
+ // cause.message / cause.stack as separate fields.
224
+ // Reviewer C1 + new: undici (node fetch) errors surface TLS /
225
+ // DNS cause with stack occasionally bearing cert fingerprints /
226
+ // cookie headers / token fragments. Depth 3 caps self-ref loops.
227
+ if (obj.err)
228
+ redactErrDeep(obj.err);
229
+ return obj;
230
+ },
231
+ },
232
+ redact: {
233
+ paths: REDACT_KEYS,
234
+ censor: '***',
235
+ },
236
+ }, rollStream);
237
+ // Runtime level toggle without restart.
238
+ process.on('SIGUSR1', () => {
239
+ if (!logger)
240
+ return;
241
+ logger.level = logger.level === 'debug' ? 'info' : 'debug';
242
+ logger.info({ mod: 'server', level: logger.level }, 'log level toggled');
243
+ });
244
+ return logger;
245
+ }
246
+ /** Get the base logger. Caller MUST initLogger() first. */
247
+ function getLogger() {
248
+ if (!logger)
249
+ throw new Error('logger not initialized — call initLogger() first');
250
+ return logger;
251
+ }
252
+ /**
253
+ * Module-scoped child logger.
254
+ *
255
+ * Safe to call at module top level: returns a lazy Proxy that defers the
256
+ * actual `logger.child({ mod })` call until the first `.info/.warn/...`.
257
+ * This lets any module do `const log = modLogger('x')` regardless of
258
+ * import order relative to `initLogger()`.
259
+ *
260
+ * If called after init, child is created eagerly (no Proxy cost).
261
+ *
262
+ * Pre-init calls fall back to a console-shim — bootstrap-phase events
263
+ * still surface via daemon stdout → `~/.ccweb/ccweb.log` (plan §11). Once
264
+ * pino is ready, the Proxy swaps to the real child for the next call.
265
+ */
266
+ function modLogger(mod) {
267
+ if (logger)
268
+ return logger.child({ mod });
269
+ // Pre-init fallback: shim mapping pino-style calls to console.
270
+ // Never throws — bootstrap code does not break if it logs before pino.
271
+ const bootstrapShim = {
272
+ fatal: (obj, msg) => console.error(`[boot ${mod}] fatal`, msg ?? '', obj),
273
+ error: (obj, msg) => console.error(`[boot ${mod}] ${msg ?? ''}`, obj),
274
+ warn: (obj, msg) => console.warn(`[boot ${mod}] ${msg ?? ''}`, obj),
275
+ info: (obj, msg) => console.log(`[boot ${mod}] ${msg ?? ''}`, obj),
276
+ debug: () => { },
277
+ trace: () => { },
278
+ child: () => bootstrapShim,
279
+ };
280
+ let cached = null;
281
+ const resolve = () => {
282
+ if (cached)
283
+ return cached;
284
+ if (!logger)
285
+ return bootstrapShim; // still pre-init — route to console
286
+ cached = logger.child({ mod });
287
+ return cached;
288
+ };
289
+ // Proxy every access through resolve(). Bind functions back to the target
290
+ // so `this` stays correct on both shim and real child.
291
+ return new Proxy({}, {
292
+ get(_target, prop) {
293
+ const target = resolve();
294
+ const val = target[prop];
295
+ return typeof val === 'function' ? val.bind(target) : val;
296
+ },
297
+ set(_target, prop, value) {
298
+ const target = resolve();
299
+ target[prop] = value;
300
+ return true;
301
+ },
302
+ });
303
+ }
304
+ // ────────────────── Fatal handlers ──────────────────
305
+ /**
306
+ * Install process-level uncaughtException / unhandledRejection handlers
307
+ * that write the fatal record, then call flushSync on the pino-roll stream
308
+ * (sonic-boom) before exit. Without the flushSync, sonic-boom's async buffer
309
+ * would drop the very stack trace we most need to investigate
310
+ * (reviewer Critical #1).
311
+ *
312
+ * Note: pino v10 removed `pino.final` — the recommended pattern is direct
313
+ * flushSync on the sonic-boom destination (pino-roll returns a SonicBoom).
314
+ */
315
+ function installFatalHandlers() {
316
+ const base = logger;
317
+ if (!base)
318
+ throw new Error('logger not initialized');
319
+ const handler = (err, origin) => {
320
+ try {
321
+ base.fatal({ err, origin, mod: 'server' }, 'fatal — process exiting');
322
+ }
323
+ catch {
324
+ /* don't let logging fail stop exit */
325
+ }
326
+ try {
327
+ if (rollStream && typeof rollStream.flushSync === 'function') {
328
+ rollStream.flushSync();
329
+ }
330
+ }
331
+ catch {
332
+ /* flush best-effort */
333
+ }
334
+ process.exit(1);
335
+ };
336
+ process.on('uncaughtException', (err) => handler(err, 'uncaughtException'));
337
+ process.on('unhandledRejection', (reason) => {
338
+ const err = reason instanceof Error ? reason : new Error(String(reason));
339
+ handler(err, 'unhandledRejection');
340
+ });
341
+ }
342
+ /**
343
+ * Graceful flush — for SIGTERM / planned shutdown. Non-fatal path.
344
+ * Returns a promise that resolves after pino has flushed.
345
+ */
346
+ function flushLogger() {
347
+ return new Promise((resolve) => {
348
+ if (!logger) {
349
+ resolve();
350
+ return;
351
+ }
352
+ logger.flush(() => resolve());
353
+ });
354
+ }
355
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { CliTool } from './types';
1
2
  /**
2
3
  * Memory Prompts — filesystem-backed prompt snippets located at
3
4
  * `<project>/.ccweb/memory/*.md`, toggleable into CLAUDE.md with
@@ -26,7 +27,7 @@ export interface MemoryListResult {
26
27
  items: MemoryPromptItem[];
27
28
  claudeMdLineCount: number;
28
29
  }
29
- export declare function listMemoryPrompts(folderPath: string): MemoryListResult;
30
+ export declare function listMemoryPrompts(folderPath: string, cliTool?: CliTool): MemoryListResult;
30
31
  export type ToggleAction = 'insert' | 'remove';
31
32
  export interface ToggleResult {
32
33
  ok: boolean;
@@ -35,5 +36,5 @@ export interface ToggleResult {
35
36
  reason?: string;
36
37
  claudeMdLineCount?: number;
37
38
  }
38
- export declare function toggleMemoryPrompt(folderPath: string, filename: string, action: ToggleAction): ToggleResult;
39
+ export declare function toggleMemoryPrompt(folderPath: string, filename: string, action: ToggleAction, cliTool?: CliTool): ToggleResult;
39
40
  //# sourceMappingURL=memory-prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-prompts.d.ts","sourceRoot":"","sources":["../src/memory-prompts.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AA+BD;6EAC6E;AAC7E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGnD;AAID,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CA8BtE;AAID,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,GACnB,YAAY,CAiEd"}
1
+ {"version":3,"file":"memory-prompts.d.ts","sourceRoot":"","sources":["../src/memory-prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AA+BD;6EAC6E;AAC7E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGnD;AAID,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,gBAAgB,CA8BzF;AAID,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,OAAO,GAChB,YAAY,CAiEd"}
@@ -70,17 +70,17 @@ function lineCountOf(content) {
70
70
  return 0;
71
71
  return content.replace(/\n$/, '').split('\n').length;
72
72
  }
73
- function listMemoryPrompts(folderPath) {
73
+ function listMemoryPrompts(folderPath, cliTool) {
74
74
  const dir = memoryDir(folderPath);
75
75
  let files = [];
76
76
  try {
77
77
  files = fs.readdirSync(dir).filter((f) => f.endsWith('.md'));
78
78
  }
79
79
  catch {
80
- // dir missing is normal — still return CLAUDE.md line count
81
- return { items: [], claudeMdLineCount: lineCountOf((0, agent_prompts_1.readClaudeMd)(folderPath)) };
80
+ // dir missing is normal — still return instructions file line count
81
+ return { items: [], claudeMdLineCount: lineCountOf((0, agent_prompts_1.readClaudeMd)(folderPath, cliTool)) };
82
82
  }
83
- const claudeMd = (0, agent_prompts_1.readClaudeMd)(folderPath);
83
+ const claudeMd = (0, agent_prompts_1.readClaudeMd)(folderPath, cliTool);
84
84
  const out = [];
85
85
  for (const filename of files) {
86
86
  const name = filename.replace(/\.md$/, '');
@@ -109,7 +109,7 @@ function listMemoryPrompts(folderPath) {
109
109
  out.sort((a, b) => a.name.localeCompare(b.name));
110
110
  return { items: out, claudeMdLineCount: lineCountOf(claudeMd) };
111
111
  }
112
- function toggleMemoryPrompt(folderPath, filename, action) {
112
+ function toggleMemoryPrompt(folderPath, filename, action, cliTool) {
113
113
  // Guard filename — reject anything that could escape memory/ via the name.
114
114
  if (!filename || filename.includes('/') || filename.includes('\\') || filename.includes('\0')) {
115
115
  return { ok: false, changed: false, inserted: false, reason: 'invalid-filename' };
@@ -119,7 +119,7 @@ function toggleMemoryPrompt(folderPath, filename, action) {
119
119
  }
120
120
  const name = filename.replace(/\.md$/, '');
121
121
  const filePath = path.join(memoryDir(folderPath), filename);
122
- let claudeMd = (0, agent_prompts_1.readClaudeMd)(folderPath);
122
+ let claudeMd = (0, agent_prompts_1.readClaudeMd)(folderPath, cliTool);
123
123
  const re = blockRegex(name);
124
124
  const currentlyInserted = re.test(claudeMd);
125
125
  if (action === 'remove') {
@@ -129,7 +129,7 @@ function toggleMemoryPrompt(folderPath, filename, action) {
129
129
  claudeMd = claudeMd.replace(re, '\n\n');
130
130
  // Collapse any runs of 3+ blank lines left behind into 2
131
131
  claudeMd = claudeMd.replace(/\n{3,}/g, '\n\n');
132
- (0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd);
132
+ (0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd, cliTool);
133
133
  return { ok: true, changed: true, inserted: false, claudeMdLineCount: lineCountOf(claudeMd) };
134
134
  }
135
135
  // Insert (or refresh in place). Symlink guard mirrors `listMemoryPrompts`
@@ -165,13 +165,13 @@ function toggleMemoryPrompt(folderPath, filename, action) {
165
165
  // have been edited since last insert).
166
166
  claudeMd = claudeMd.replace(re, `\n\n${block}\n\n`);
167
167
  claudeMd = claudeMd.replace(/\n{3,}/g, '\n\n');
168
- (0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd);
168
+ (0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd, cliTool);
169
169
  return { ok: true, changed: true, inserted: true, reason: 'refreshed', claudeMdLineCount: lineCountOf(claudeMd) };
170
170
  }
171
- // Append with separating blank line if CLAUDE.md doesn't already end with one
171
+ // Append with separating blank line if instructions file doesn't already end with one
172
172
  const sep = claudeMd.length === 0 ? '' : claudeMd.endsWith('\n\n') ? '' : claudeMd.endsWith('\n') ? '\n' : '\n\n';
173
173
  claudeMd = claudeMd + sep + block + '\n';
174
- (0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd);
174
+ (0, agent_prompts_1.writeClaudeMd)(folderPath, claudeMd, cliTool);
175
175
  return { ok: true, changed: true, inserted: true, claudeMdLineCount: lineCountOf(claudeMd) };
176
176
  }
177
177
  //# sourceMappingURL=memory-prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-prompts.js","sourceRoot":"","sources":["../src/memory-prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-prompts.js","sourceRoot":"","sources":["../src/memory-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Request, Response, NextFunction } from 'express';
2
+ export declare function requestLog(req: Request, res: Response, next: NextFunction): void;
3
+ //# sourceMappingURL=request-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-log.d.ts","sourceRoot":"","sources":["../../src/middleware/request-log.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA4B/D,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAgChF"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /*
3
+ * Express middleware:生成 reqId,放入 AsyncLocalStorage,log HTTP 请求摘要。
4
+ *
5
+ * 目的:让 HTTP → WS → PTY 的因果链可通过 reqId 串起来(reviewer Important #7)。
6
+ * 下游任何 logger 调用(包括 AsyncLocalStorage 跨越的 setImmediate / await)
7
+ * 自动带上 reqId,无需显式传参。
8
+ *
9
+ * 不打印 body / query / headers——只 method/path/status/duration/user。
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.requestLog = requestLog;
46
+ const crypto = __importStar(require("crypto"));
47
+ const logger_1 = require("../logger");
48
+ // modLogger returns a lazy Proxy when called before initLogger, so
49
+ // module-top-level use is safe.
50
+ const log = (0, logger_1.modLogger)('server');
51
+ /**
52
+ * 噪声路径:不值得每次都记一条。使用 req.originalUrl 的完整路径匹配
53
+ * (在 path 被 Express sub-router mutate 前快照)。
54
+ */
55
+ const SILENCED = new RegExp([
56
+ '^/health$',
57
+ '^/api/health$',
58
+ '^/api/auth/local-token$', // localhost 预认证,每次挂载
59
+ '^/api/tool/skills/check', // 前端高频轮询
60
+ '^/api/user-prefs/language', // 每个页面加载都拉一次
61
+ '^/api/claude/usage', // dashboard 轮询
62
+ '^/manifest\\.json$',
63
+ '^/favicon',
64
+ '^/assets/', // 前端静态资源
65
+ '^/plugin-sdk/',
66
+ '^/$', // SPA 路由回 index.html,刷新噪声大
67
+ ].join('|'));
68
+ function requestLog(req, res, next) {
69
+ const reqId = crypto.randomUUID().slice(0, 8);
70
+ const start = Date.now();
71
+ // Snapshot originalUrl (immutable); req.path is mutated by Express sub-routers
72
+ // so by the time res.on('finish') fires it only holds the post-mount segment.
73
+ const fullPath = (req.originalUrl || req.url).split('?')[0];
74
+ // Reviewer I1: `requestLog` runs BEFORE `authMiddleware`, so `req.user` is
75
+ // always undefined at middleware entry. We pass a MUTABLE context object
76
+ // into ALS — `authMiddleware` (and anywhere else that identifies the user)
77
+ // can populate `ctx.user` later, and downstream log events see it via the
78
+ // same object reference. The http summary below reads user at finish time.
79
+ const ctx = { reqId };
80
+ logger_1.als.run(ctx, () => {
81
+ res.on('finish', () => {
82
+ if (SILENCED.test(fullPath))
83
+ return;
84
+ // Pull user as set by any downstream auth middleware.
85
+ const userAtEnd = req.user?.username;
86
+ if (userAtEnd && !ctx.user)
87
+ ctx.user = userAtEnd;
88
+ const ms = Date.now() - start;
89
+ const level = res.statusCode >= 500 ? 'error' :
90
+ res.statusCode >= 400 ? 'warn' :
91
+ 'info';
92
+ log[level]({ method: req.method, path: fullPath, status: res.statusCode, ms, user: userAtEnd }, 'http');
93
+ });
94
+ next();
95
+ });
96
+ }
97
+ //# sourceMappingURL=request-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-log.js","sourceRoot":"","sources":["../../src/middleware/request-log.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BH,gCAgCC;AA3DD,+CAAiC;AACjC,sCAA2C;AAE3C,mEAAmE;AACnE,gCAAgC;AAChC,MAAM,GAAG,GAAG,IAAA,kBAAS,EAAC,QAAQ,CAAC,CAAC;AAEhC;;;GAGG;AACH,MAAM,QAAQ,GAAG,IAAI,MAAM,CACzB;IACE,WAAW;IACX,eAAe;IACf,yBAAyB,EAAO,qBAAqB;IACrD,yBAAyB,EAAO,SAAS;IACzC,2BAA2B,EAAK,aAAa;IAC7C,oBAAoB,EAAY,eAAe;IAC/C,oBAAoB;IACpB,WAAW;IACX,WAAW,EAAqB,SAAS;IACzC,eAAe;IACf,KAAK,EAA2B,2BAA2B;CAC5D,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ,CAAC;AAEF,SAAgB,UAAU,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACxE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,+EAA+E;IAC/E,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5D,2EAA2E;IAC3E,yEAAyE;IACzE,2EAA2E;IAC3E,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAM,GAAG,GAAqC,EAAE,KAAK,EAAE,CAAC;IAExD,YAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;QAChB,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,OAAO;YACpC,sDAAsD;YACtD,MAAM,SAAS,GAAI,GAAkD,CAAC,IAAI,EAAE,QAAQ,CAAC;YACrF,IAAI,SAAS,IAAI,CAAC,GAAG,CAAC,IAAI;gBAAE,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;YACjD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAC9B,MAAM,KAAK,GACT,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACjC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC;oBACjC,MAAM,CAAC;YACT,GAAG,CAAC,KAAK,CAAC,CACR,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EACnF,MAAM,CACP,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"notify-service.d.ts","sourceRoot":"","sources":["../src/notify-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACzB;AAID,wBAAgB,eAAe,IAAI,YAAY,CAO9C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAI3D;AAED,cAAM,aAAc,SAAQ,YAAY;IAChC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmC9E;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
1
+ {"version":3,"file":"notify-service.d.ts","sourceRoot":"","sources":["../src/notify-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACzB;AAID,wBAAgB,eAAe,IAAI,YAAY,CAO9C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAI3D;AAED,cAAM,aAAc,SAAQ,YAAY;IAChC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmC9E;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -40,6 +40,8 @@ const fs = __importStar(require("fs"));
40
40
  const path = __importStar(require("path"));
41
41
  const config_1 = require("./config");
42
42
  const events_1 = require("events");
43
+ const logger_1 = require("./logger");
44
+ const log = (0, logger_1.modLogger)('notify');
43
45
  const NOTIFY_CONFIG_FILE = path.join(config_1.DATA_DIR, 'notify-config.json');
44
46
  function getNotifyConfig() {
45
47
  try {
@@ -95,7 +97,7 @@ class NotifyService extends events_1.EventEmitter {
95
97
  });
96
98
  }
97
99
  catch (err) {
98
- console.warn('[NotifyService] Webhook delivery failed:', err instanceof Error ? err.message : String(err));
100
+ log.warn({ err }, 'webhook delivery failed');
99
101
  }
100
102
  }
101
103
  }
@@ -1 +1 @@
1
- {"version":3,"file":"notify-service.js","sourceRoot":"","sources":["../src/notify-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notify-service.js","sourceRoot":"","sources":["../src/notify-service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,0CAOC;AAED,4CAIC;AA5BD,uCAAyB;AACzB,2CAA6B;AAC7B,qCAAoC;AACpC,mCAAsC;AACtC,qCAAqC;AAErC,MAAM,GAAG,GAAG,IAAA,kBAAS,EAAC,QAAQ,CAAC,CAAC;AAOhC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAQ,EAAE,oBAAoB,CAAC,CAAC;AAErE,SAAgB,eAAe;IAC7B,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC;YAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAiB,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAoB;IACnD,MAAM,OAAO,GAAG,kBAAkB,GAAG,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3D,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,aAAc,SAAQ,qBAAY;IACtC,KAAK,CAAC,gBAAgB,CAAC,SAAiB,EAAE,WAAmB;QAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO;QACzD,4DAA4D;QAC5D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB;YAC5E,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,SAAS;gBAC1C,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK;gBACtC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBACrD,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAC3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBACzE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAC/F,IAAI,KAAK,0BAA0B;gBAAE,OAAO;QAClD,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO;QAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC7B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,iBAAiB;oBACxB,SAAS;oBACT,WAAW;oBACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC;gBACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF;AAEY,QAAA,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}