chatccc 0.2.231 → 0.2.233

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 (130) hide show
  1. package/.agents/skills/create-chatccc-feishu-app/SKILL.md +85 -85
  2. package/.claude/skills/create-chatccc-feishu-app/SKILL.md +85 -85
  3. package/.cursor/skills/create-chatccc-feishu-app/SKILL.md +85 -85
  4. package/README.md +90 -90
  5. package/agent-prompts/claude_specific.md +45 -45
  6. package/agent-prompts/codex_specific.md +2 -2
  7. package/agent-prompts/cursor_specific.md +13 -13
  8. package/bin/cccagent.mjs +17 -17
  9. package/im-skills/feishu-skill/receive-send-file.md +63 -63
  10. package/im-skills/feishu-skill/receive-send-image.md +24 -24
  11. package/im-skills/feishu-skill/skill.md +3 -3
  12. package/im-skills/wechat-file-skill/receive-send-file.md +38 -38
  13. package/im-skills/wechat-file-skill/send-file.mjs +83 -83
  14. package/im-skills/wechat-file-skill/skill.md +10 -10
  15. package/im-skills/wechat-image-skill/skill.md +10 -10
  16. package/im-skills/wechat-video-skill/receive-send-video.md +38 -38
  17. package/im-skills/wechat-video-skill/send-video.mjs +79 -79
  18. package/im-skills/wechat-video-skill/skill.md +10 -10
  19. package/package.json +1 -1
  20. package/scripts/postinstall-sharp-check.mjs +58 -58
  21. package/src/__tests__/agent-activity.test.ts +86 -86
  22. package/src/__tests__/agent-delegate-task-rpc.test.ts +165 -165
  23. package/src/__tests__/agent-reload-config-rpc.test.ts +99 -99
  24. package/src/__tests__/builtin-chat-session.test.ts +449 -393
  25. package/src/__tests__/builtin-cli-json.test.ts +39 -39
  26. package/src/__tests__/builtin-config.test.ts +26 -26
  27. package/src/__tests__/builtin-context.test.ts +319 -202
  28. package/src/__tests__/builtin-file-tools.test.ts +240 -240
  29. package/src/__tests__/builtin-permissions.test.ts +211 -211
  30. package/src/__tests__/builtin-session-search.test.ts +228 -0
  31. package/src/__tests__/builtin-session-select.test.ts +116 -116
  32. package/src/__tests__/builtin-sigint.test.ts +56 -56
  33. package/src/__tests__/builtin-skills.test.ts +284 -284
  34. package/src/__tests__/builtin-web-tools.test.ts +220 -220
  35. package/src/__tests__/card-action-routing.test.ts +18 -18
  36. package/src/__tests__/cardkit.test.ts +60 -60
  37. package/src/__tests__/ccc-adapter.test.ts +170 -170
  38. package/src/__tests__/chatgpt-subscription-rpc.test.ts +89 -89
  39. package/src/__tests__/chatgpt-subscription.test.ts +135 -135
  40. package/src/__tests__/chrome-devtools-guard.test.ts +165 -165
  41. package/src/__tests__/claude-adapter.test.ts +614 -614
  42. package/src/__tests__/claude-raw-stream-log.test.ts +87 -87
  43. package/src/__tests__/codex-adapter.test.ts +58 -58
  44. package/src/__tests__/codex-raw-stream-log.test.ts +170 -170
  45. package/src/__tests__/codex-reset-actions.test.ts +146 -146
  46. package/src/__tests__/crash-logging.test.ts +95 -1
  47. package/src/__tests__/cursor-adapter.test.ts +268 -268
  48. package/src/__tests__/feishu-api.test.ts +60 -60
  49. package/src/__tests__/feishu-avatar.test.ts +164 -164
  50. package/src/__tests__/feishu-message-ingress.test.ts +138 -138
  51. package/src/__tests__/feishu-platform.test.ts +22 -22
  52. package/src/__tests__/format-message.test.ts +47 -47
  53. package/src/__tests__/jsonl-stream.test.ts +79 -79
  54. package/src/__tests__/package-files.test.ts +24 -24
  55. package/src/__tests__/privacy.test.ts +198 -198
  56. package/src/__tests__/progress-reducer.test.ts +121 -121
  57. package/src/__tests__/raw-stream-log.test.ts +106 -106
  58. package/src/__tests__/response-stall.test.ts +49 -49
  59. package/src/__tests__/restart.test.ts +55 -10
  60. package/src/__tests__/session.test.ts +199 -199
  61. package/src/__tests__/shared-prefix.test.ts +36 -36
  62. package/src/__tests__/sim-platform.test.ts +16 -16
  63. package/src/__tests__/startup-lifecycle.test.ts +231 -231
  64. package/src/__tests__/stop-session.test.ts +34 -34
  65. package/src/__tests__/stream-state.test.ts +42 -42
  66. package/src/__tests__/terminal-error.test.ts +54 -54
  67. package/src/__tests__/terminal-renderer.test.ts +247 -247
  68. package/src/__tests__/update-command-guard.test.ts +144 -144
  69. package/src/__tests__/web-ui.test.ts +326 -326
  70. package/src/adapters/adapter-interface.ts +33 -33
  71. package/src/adapters/ccc-adapter.ts +141 -141
  72. package/src/adapters/claude-adapter.ts +620 -620
  73. package/src/adapters/claude-session-meta-store.ts +120 -120
  74. package/src/adapters/codex-adapter.ts +426 -426
  75. package/src/adapters/cursor-adapter.ts +681 -681
  76. package/src/adapters/jsonl-stream.ts +157 -157
  77. package/src/adapters/raw-stream-log.ts +124 -124
  78. package/src/adapters/resource-monitor.ts +140 -140
  79. package/src/agent-activity.ts +175 -175
  80. package/src/agent-delegate-task-rpc.ts +153 -153
  81. package/src/agent-delegate-task.ts +91 -91
  82. package/src/agent-reload-config-rpc.ts +34 -34
  83. package/src/agent-stop-stuck.ts +129 -129
  84. package/src/builtin/cli.ts +6 -0
  85. package/src/builtin/config.ts +84 -84
  86. package/src/builtin/context.ts +465 -391
  87. package/src/builtin/file-log.ts +38 -38
  88. package/src/builtin/file-tools.ts +34 -0
  89. package/src/builtin/index.ts +24 -23
  90. package/src/builtin/proc-tree-kill.ts +61 -61
  91. package/src/builtin/progress/cards-helpers.ts +76 -76
  92. package/src/builtin/progress/reducer.ts +113 -113
  93. package/src/builtin/progress/terminal-renderer.ts +294 -294
  94. package/src/builtin/progress/view.ts +77 -77
  95. package/src/builtin/raw-stream-log.ts +124 -124
  96. package/src/builtin/session-search.ts +363 -0
  97. package/src/builtin/session-select.ts +48 -48
  98. package/src/builtin/sigint.ts +50 -50
  99. package/src/builtin/skills.ts +205 -205
  100. package/src/builtin/web-tools.ts +313 -313
  101. package/src/card-action-routing.ts +14 -14
  102. package/src/chatgpt-subscription-rpc.ts +27 -27
  103. package/src/chatgpt-subscription.ts +299 -299
  104. package/src/chrome-devtools-guard.ts +318 -318
  105. package/src/codex-reset-actions.ts +184 -184
  106. package/src/feishu-api.ts +193 -193
  107. package/src/feishu-message-ingress.ts +195 -195
  108. package/src/feishu-platform.ts +20 -20
  109. package/src/format-message.ts +293 -293
  110. package/src/index.ts +6 -1
  111. package/src/litellm-proxy.ts +374 -374
  112. package/src/orchestrator.ts +36 -13
  113. package/src/platform-adapter.ts +6 -6
  114. package/src/privacy.ts +118 -118
  115. package/src/progress/reducer.ts +113 -113
  116. package/src/progress/terminal-renderer.ts +294 -294
  117. package/src/progress/view.ts +77 -77
  118. package/src/response-stall.ts +28 -28
  119. package/src/runtime-reload.ts +34 -34
  120. package/src/session-chat-binding.ts +82 -82
  121. package/src/session-name.ts +8 -8
  122. package/src/session.ts +201 -201
  123. package/src/shared-prefix.ts +29 -29
  124. package/src/shared.ts +44 -0
  125. package/src/sim-platform.ts +20 -20
  126. package/src/startup-lifecycle.ts +250 -250
  127. package/src/stream-state.ts +21 -21
  128. package/src/terminal-error.ts +129 -129
  129. package/src/turn-cards.ts +117 -117
  130. package/src/update-command-guard.ts +165 -165
@@ -1,9 +1,15 @@
1
1
  import { mkdtemp, readFile, rm } from "node:fs/promises";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
+ import { EventEmitter } from "node:events";
4
5
  import { describe, it, expect, vi } from "vitest";
5
6
 
6
- import { buildCrashLoggingHandlers, installCrashLogging, setupFileLogging } from "../shared.ts";
7
+ import {
8
+ buildCrashLoggingHandlers,
9
+ installCrashLogging,
10
+ installEpipeGuard,
11
+ setupFileLogging,
12
+ } from "../shared.ts";
7
13
 
8
14
  describe("buildCrashLoggingHandlers", () => {
9
15
  it("uncaughtException: 写诊断、刷新日志、调用 onFatal", () => {
@@ -212,6 +218,69 @@ describe("installCrashLogging", () => {
212
218
  });
213
219
  });
214
220
 
221
+ describe("installEpipeGuard", () => {
222
+ function fakeStream(): EventEmitter & { on: typeof EventEmitter.prototype.on; off: typeof EventEmitter.prototype.off } {
223
+ return new EventEmitter() as unknown as EventEmitter & {
224
+ on: typeof EventEmitter.prototype.on;
225
+ off: typeof EventEmitter.prototype.off;
226
+ };
227
+ }
228
+
229
+ it("吞掉 EPIPE 写错误并记录非致命 trace,不抛出", () => {
230
+ const stream = fakeStream();
231
+ const tracer = vi.fn();
232
+ const cleanup = installEpipeGuard([stream as never], { tracer });
233
+
234
+ const err = Object.assign(new Error("broken pipe"), { code: "EPIPE" });
235
+ expect(() => stream.emit("error", err)).not.toThrow();
236
+ expect(tracer).toHaveBeenCalledWith(
237
+ "stdio write error (non-fatal)",
238
+ expect.objectContaining({ code: "EPIPE" }),
239
+ );
240
+
241
+ cleanup();
242
+ });
243
+
244
+ it("其它 IO 错误同样非致命(日志失败不能拖垮服务)", () => {
245
+ const stream = fakeStream();
246
+ const tracer = vi.fn();
247
+ const cleanup = installEpipeGuard([stream as never], { tracer });
248
+
249
+ const err = Object.assign(new Error("permission denied"), { code: "EACCES" });
250
+ expect(() => stream.emit("error", err)).not.toThrow();
251
+ expect(tracer).toHaveBeenCalledWith(
252
+ "stdio write error (non-fatal)",
253
+ expect.objectContaining({ code: "EACCES" }),
254
+ );
255
+
256
+ cleanup();
257
+ });
258
+
259
+ it("cleanup 后不再监听,错误可正常传播", () => {
260
+ const stream = fakeStream();
261
+ const tracer = vi.fn();
262
+ const cleanup = installEpipeGuard([stream as never], { tracer });
263
+ cleanup();
264
+
265
+ expect(() => stream.emit("error", new Error("boom"))).toThrow("boom");
266
+ expect(tracer).not.toHaveBeenCalled();
267
+ });
268
+
269
+ it("默认同时守护 stdout 与 stderr", () => {
270
+ const stdoutBefore = process.stdout.listenerCount("error");
271
+ const stderrBefore = process.stderr.listenerCount("error");
272
+ const cleanup = installEpipeGuard(undefined, { tracer: () => {} });
273
+ try {
274
+ expect(process.stdout.listenerCount("error")).toBe(stdoutBefore + 1);
275
+ expect(process.stderr.listenerCount("error")).toBe(stderrBefore + 1);
276
+ } finally {
277
+ cleanup();
278
+ expect(process.stdout.listenerCount("error")).toBe(stdoutBefore);
279
+ expect(process.stderr.listenerCount("error")).toBe(stderrBefore);
280
+ }
281
+ });
282
+ });
283
+
215
284
  describe("setupFileLogging", () => {
216
285
  it("flush 后继续写日志不会触发 write after end,且日志已落盘", async () => {
217
286
  const originalLog = console.log;
@@ -263,4 +332,29 @@ describe("setupFileLogging", () => {
263
332
  await rm(dir, { recursive: true, force: true });
264
333
  }
265
334
  });
335
+
336
+ it("console.warn 也会落盘并包含 WARN 级别标记", async () => {
337
+ const originalLog = console.log;
338
+ const originalError = console.error;
339
+ const originalWarn = console.warn;
340
+ console.log = vi.fn() as never;
341
+ console.error = vi.fn() as never;
342
+ console.warn = vi.fn() as never;
343
+ const dir = await mkdtemp(join(tmpdir(), "chatccc-log-"));
344
+
345
+ try {
346
+ const fileLog = setupFileLogging(dir, "index");
347
+
348
+ expect(() => console.warn("sdk warning")).not.toThrow();
349
+ fileLog.flush();
350
+
351
+ const content = await readFile(fileLog.logPath, "utf8");
352
+ expect(content).toContain("[WARN] sdk warning");
353
+ } finally {
354
+ console.log = originalLog;
355
+ console.error = originalError;
356
+ console.warn = originalWarn;
357
+ await rm(dir, { recursive: true, force: true });
358
+ }
359
+ });
266
360
  });