@a1hvdy/cc-openclaw 0.10.4 → 0.11.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 (275) hide show
  1. package/dist/src/channels/telegram/card-renderer.d.ts +63 -0
  2. package/dist/src/channels/telegram/card-renderer.js +149 -0
  3. package/dist/src/channels/telegram/card-renderer.js.map +1 -0
  4. package/dist/src/channels/telegram/insight-formatter.d.ts +36 -0
  5. package/dist/src/channels/telegram/insight-formatter.js +36 -0
  6. package/dist/src/channels/telegram/insight-formatter.js.map +1 -0
  7. package/dist/src/channels/telegram/live-card.d.ts +7 -90
  8. package/dist/src/channels/telegram/live-card.js +22 -265
  9. package/dist/src/channels/telegram/live-card.js.map +1 -1
  10. package/dist/src/channels/telegram/logger.d.ts +10 -0
  11. package/dist/src/channels/telegram/logger.js +13 -0
  12. package/dist/src/channels/telegram/logger.js.map +1 -0
  13. package/dist/src/channels/telegram/throttle-controller.d.ts +54 -0
  14. package/dist/src/channels/telegram/throttle-controller.js +132 -0
  15. package/dist/src/channels/telegram/throttle-controller.js.map +1 -0
  16. package/dist/src/channels/telegram/tool-tracker.js +3 -14
  17. package/dist/src/channels/telegram/tool-tracker.js.map +1 -1
  18. package/dist/src/cli/doctor.d.ts +24 -0
  19. package/dist/src/cli/doctor.js +194 -0
  20. package/dist/src/cli/doctor.js.map +1 -0
  21. package/dist/src/cli/index.d.ts +8 -0
  22. package/dist/src/cli/index.js +39 -0
  23. package/dist/src/cli/index.js.map +1 -0
  24. package/dist/src/command-router/cc-handler.js +35 -709
  25. package/dist/src/command-router/cc-handler.js.map +1 -1
  26. package/dist/src/command-router/launch-policy.d.ts +93 -0
  27. package/dist/src/command-router/launch-policy.js +323 -0
  28. package/dist/src/command-router/launch-policy.js.map +1 -0
  29. package/dist/src/command-router/resume-policy.d.ts +18 -0
  30. package/dist/src/command-router/resume-policy.js +236 -0
  31. package/dist/src/command-router/resume-policy.js.map +1 -0
  32. package/dist/src/command-router/turn-formatter.d.ts +19 -0
  33. package/dist/src/command-router/turn-formatter.js +144 -0
  34. package/dist/src/command-router/turn-formatter.js.map +1 -0
  35. package/dist/src/openai-compat/bridges/allowlist.d.ts +10 -0
  36. package/dist/src/openai-compat/bridges/allowlist.js +17 -0
  37. package/dist/src/openai-compat/bridges/allowlist.js.map +1 -0
  38. package/dist/src/openai-compat/bridges/factory.d.ts +30 -0
  39. package/dist/src/openai-compat/bridges/factory.js +84 -0
  40. package/dist/src/openai-compat/bridges/factory.js.map +1 -0
  41. package/dist/src/openai-compat/bridges/media-bridge.d.ts +34 -0
  42. package/dist/src/openai-compat/bridges/media-bridge.js +20 -0
  43. package/dist/src/openai-compat/bridges/media-bridge.js.map +1 -0
  44. package/dist/src/openai-compat/bridges/openclaw-native-tools.d.ts +61 -0
  45. package/dist/src/openai-compat/bridges/openclaw-native-tools.js +171 -0
  46. package/dist/src/openai-compat/bridges/openclaw-native-tools.js.map +1 -0
  47. package/dist/src/openai-compat/bridges/openclaw-tool-registry.d.ts +26 -0
  48. package/dist/src/openai-compat/bridges/openclaw-tool-registry.js +38 -0
  49. package/dist/src/openai-compat/bridges/openclaw-tool-registry.js.map +1 -0
  50. package/dist/src/openai-compat/bridges/tts-media-bridge.d.ts +19 -0
  51. package/dist/src/openai-compat/bridges/tts-media-bridge.js +59 -0
  52. package/dist/src/openai-compat/bridges/tts-media-bridge.js.map +1 -0
  53. package/dist/src/openai-compat/openai-compat.js.map +1 -1
  54. package/dist/src/types/tool-bridge.d.ts +2 -1
  55. package/dist/src/types/tool-bridge.js +1 -0
  56. package/dist/src/types/tool-bridge.js.map +1 -1
  57. package/package.json +1 -1
  58. package/dist/scripts/bench/ab-harness.d.ts +0 -58
  59. package/dist/scripts/bench/ab-harness.d.ts.map +0 -1
  60. package/dist/scripts/bench/ab-harness.js +0 -78
  61. package/dist/scripts/bench/ab-harness.js.map +0 -1
  62. package/dist/src/channels/adapter.d.ts.map +0 -1
  63. package/dist/src/channels/telegram/completion-summary.d.ts.map +0 -1
  64. package/dist/src/channels/telegram/error-renderer.d.ts.map +0 -1
  65. package/dist/src/channels/telegram/event-reducer.d.ts.map +0 -1
  66. package/dist/src/channels/telegram/index.d.ts.map +0 -1
  67. package/dist/src/channels/telegram/injector.d.ts.map +0 -1
  68. package/dist/src/channels/telegram/live-card.d.ts.map +0 -1
  69. package/dist/src/channels/telegram/state-machine.d.ts.map +0 -1
  70. package/dist/src/channels/telegram/tool-tracker.d.ts.map +0 -1
  71. package/dist/src/command-router/cc-handler.d.ts.map +0 -1
  72. package/dist/src/command-router/index.d.ts.map +0 -1
  73. package/dist/src/constants.d.ts.map +0 -1
  74. package/dist/src/council/consensus.d.ts.map +0 -1
  75. package/dist/src/council/council.d.ts.map +0 -1
  76. package/dist/src/council/index.d.ts.map +0 -1
  77. package/dist/src/engines/base-oneshot-session.d.ts.map +0 -1
  78. package/dist/src/engines/index.d.ts.map +0 -1
  79. package/dist/src/engines/persistent-codex-session.d.ts.map +0 -1
  80. package/dist/src/engines/persistent-cursor-session.d.ts.map +0 -1
  81. package/dist/src/engines/persistent-custom-session.d.ts.map +0 -1
  82. package/dist/src/engines/persistent-gemini-session.d.ts.map +0 -1
  83. package/dist/src/engines/persistent-session.d.ts.map +0 -1
  84. package/dist/src/health/handler.d.ts.map +0 -1
  85. package/dist/src/health/index.d.ts.map +0 -1
  86. package/dist/src/index.d.ts.map +0 -1
  87. package/dist/src/lib/auto-recovery.d.ts.map +0 -1
  88. package/dist/src/lib/cache-parity.d.ts.map +0 -1
  89. package/dist/src/lib/circuit-breaker.d.ts.map +0 -1
  90. package/dist/src/lib/config.d.ts.map +0 -1
  91. package/dist/src/lib/drift-detector.d.ts.map +0 -1
  92. package/dist/src/lib/error-formatter.d.ts.map +0 -1
  93. package/dist/src/lib/heartbeat-workaround.d.ts.map +0 -1
  94. package/dist/src/lib/index.d.ts.map +0 -1
  95. package/dist/src/lib/register-guard.d.ts.map +0 -1
  96. package/dist/src/lib/route-flag.d.ts +0 -49
  97. package/dist/src/lib/route-flag.d.ts.map +0 -1
  98. package/dist/src/lib/route-flag.js +0 -52
  99. package/dist/src/lib/route-flag.js.map +0 -1
  100. package/dist/src/lib/sysprompt-strip.d.ts.map +0 -1
  101. package/dist/src/lib/telemetry.d.ts.map +0 -1
  102. package/dist/src/lib/test-mode.d.ts.map +0 -1
  103. package/dist/src/lib/vendor-paths.d.ts.map +0 -1
  104. package/dist/src/logger.d.ts.map +0 -1
  105. package/dist/src/mcp/bridge.d.ts.map +0 -1
  106. package/dist/src/mcp/index.d.ts.map +0 -1
  107. package/dist/src/models.d.ts.map +0 -1
  108. package/dist/src/openai-compat/cli-stream-parser.d.ts.map +0 -1
  109. package/dist/src/openai-compat/index.d.ts.map +0 -1
  110. package/dist/src/openai-compat/openai-compat.d.ts.map +0 -1
  111. package/dist/src/openai-compat/skill-resolver.d.ts.map +0 -1
  112. package/dist/src/openai-compat/sse-translator.d.ts.map +0 -1
  113. package/dist/src/proxy/anthropic-adapter.d.ts.map +0 -1
  114. package/dist/src/proxy/handler.d.ts.map +0 -1
  115. package/dist/src/proxy/index.d.ts.map +0 -1
  116. package/dist/src/proxy/schema-cleaner.d.ts.map +0 -1
  117. package/dist/src/proxy/thought-cache.d.ts.map +0 -1
  118. package/dist/src/session/embedded-server.d.ts.map +0 -1
  119. package/dist/src/session/inbox-manager.d.ts.map +0 -1
  120. package/dist/src/session/index.d.ts.map +0 -1
  121. package/dist/src/session/session-manager.d.ts.map +0 -1
  122. package/dist/src/session-bootstrap/cwd-patch.d.ts.map +0 -1
  123. package/dist/src/session-bootstrap/index.d.ts.map +0 -1
  124. package/dist/src/session-bootstrap/sysprompt-strip.d.ts.map +0 -1
  125. package/dist/src/session-bootstrap/think-conflict-resolver.d.ts.map +0 -1
  126. package/dist/src/types.d.ts.map +0 -1
  127. package/dist/src/validation.d.ts.map +0 -1
  128. package/dist/tests/_helpers/subprocess-mock.d.ts +0 -35
  129. package/dist/tests/_helpers/subprocess-mock.d.ts.map +0 -1
  130. package/dist/tests/_helpers/subprocess-mock.js +0 -136
  131. package/dist/tests/_helpers/subprocess-mock.js.map +0 -1
  132. package/dist/tests/auto-recovery.test.d.ts +0 -2
  133. package/dist/tests/auto-recovery.test.d.ts.map +0 -1
  134. package/dist/tests/auto-recovery.test.js +0 -185
  135. package/dist/tests/auto-recovery.test.js.map +0 -1
  136. package/dist/tests/bench-harness.test.d.ts +0 -2
  137. package/dist/tests/bench-harness.test.d.ts.map +0 -1
  138. package/dist/tests/bench-harness.test.js +0 -21
  139. package/dist/tests/bench-harness.test.js.map +0 -1
  140. package/dist/tests/cache-parity.test.d.ts +0 -2
  141. package/dist/tests/cache-parity.test.d.ts.map +0 -1
  142. package/dist/tests/cache-parity.test.js +0 -401
  143. package/dist/tests/cache-parity.test.js.map +0 -1
  144. package/dist/tests/command-router.test.d.ts +0 -2
  145. package/dist/tests/command-router.test.d.ts.map +0 -1
  146. package/dist/tests/command-router.test.js +0 -60
  147. package/dist/tests/command-router.test.js.map +0 -1
  148. package/dist/tests/council.test.d.ts +0 -2
  149. package/dist/tests/council.test.d.ts.map +0 -1
  150. package/dist/tests/council.test.js +0 -20
  151. package/dist/tests/council.test.js.map +0 -1
  152. package/dist/tests/drift-detector.test.d.ts +0 -2
  153. package/dist/tests/drift-detector.test.d.ts.map +0 -1
  154. package/dist/tests/drift-detector.test.js +0 -268
  155. package/dist/tests/drift-detector.test.js.map +0 -1
  156. package/dist/tests/eager-bootstrap-gating.test.d.ts +0 -9
  157. package/dist/tests/eager-bootstrap-gating.test.d.ts.map +0 -1
  158. package/dist/tests/eager-bootstrap-gating.test.js +0 -97
  159. package/dist/tests/eager-bootstrap-gating.test.js.map +0 -1
  160. package/dist/tests/engines.test.d.ts +0 -2
  161. package/dist/tests/engines.test.d.ts.map +0 -1
  162. package/dist/tests/engines.test.js +0 -8
  163. package/dist/tests/engines.test.js.map +0 -1
  164. package/dist/tests/error-formatter.test.d.ts +0 -2
  165. package/dist/tests/error-formatter.test.d.ts.map +0 -1
  166. package/dist/tests/error-formatter.test.js +0 -220
  167. package/dist/tests/error-formatter.test.js.map +0 -1
  168. package/dist/tests/health.test.d.ts +0 -2
  169. package/dist/tests/health.test.d.ts.map +0 -1
  170. package/dist/tests/health.test.js +0 -110
  171. package/dist/tests/health.test.js.map +0 -1
  172. package/dist/tests/heartbeat-workaround.test.d.ts +0 -2
  173. package/dist/tests/heartbeat-workaround.test.d.ts.map +0 -1
  174. package/dist/tests/heartbeat-workaround.test.js +0 -90
  175. package/dist/tests/heartbeat-workaround.test.js.map +0 -1
  176. package/dist/tests/index.test.d.ts +0 -2
  177. package/dist/tests/index.test.d.ts.map +0 -1
  178. package/dist/tests/index.test.js +0 -7
  179. package/dist/tests/index.test.js.map +0 -1
  180. package/dist/tests/lib-sysprompt-strip.test.d.ts +0 -2
  181. package/dist/tests/lib-sysprompt-strip.test.d.ts.map +0 -1
  182. package/dist/tests/lib-sysprompt-strip.test.js +0 -145
  183. package/dist/tests/lib-sysprompt-strip.test.js.map +0 -1
  184. package/dist/tests/listener-activation.test.d.ts +0 -2
  185. package/dist/tests/listener-activation.test.d.ts.map +0 -1
  186. package/dist/tests/listener-activation.test.js +0 -87
  187. package/dist/tests/listener-activation.test.js.map +0 -1
  188. package/dist/tests/mcp-bridge.test.d.ts +0 -2
  189. package/dist/tests/mcp-bridge.test.d.ts.map +0 -1
  190. package/dist/tests/mcp-bridge.test.js +0 -137
  191. package/dist/tests/mcp-bridge.test.js.map +0 -1
  192. package/dist/tests/openai-compat.test.d.ts +0 -2
  193. package/dist/tests/openai-compat.test.d.ts.map +0 -1
  194. package/dist/tests/openai-compat.test.js +0 -8
  195. package/dist/tests/openai-compat.test.js.map +0 -1
  196. package/dist/tests/proxy-heartbeat-integration.test.d.ts +0 -15
  197. package/dist/tests/proxy-heartbeat-integration.test.d.ts.map +0 -1
  198. package/dist/tests/proxy-heartbeat-integration.test.js +0 -122
  199. package/dist/tests/proxy-heartbeat-integration.test.js.map +0 -1
  200. package/dist/tests/proxy.test.d.ts +0 -2
  201. package/dist/tests/proxy.test.d.ts.map +0 -1
  202. package/dist/tests/proxy.test.js +0 -8
  203. package/dist/tests/proxy.test.js.map +0 -1
  204. package/dist/tests/register-guard-stacking.test.d.ts +0 -2
  205. package/dist/tests/register-guard-stacking.test.d.ts.map +0 -1
  206. package/dist/tests/register-guard-stacking.test.js +0 -61
  207. package/dist/tests/register-guard-stacking.test.js.map +0 -1
  208. package/dist/tests/register-guard.test.d.ts +0 -2
  209. package/dist/tests/register-guard.test.d.ts.map +0 -1
  210. package/dist/tests/register-guard.test.js +0 -129
  211. package/dist/tests/register-guard.test.js.map +0 -1
  212. package/dist/tests/route-flag-rollback.test.d.ts +0 -2
  213. package/dist/tests/route-flag-rollback.test.d.ts.map +0 -1
  214. package/dist/tests/route-flag-rollback.test.js +0 -70
  215. package/dist/tests/route-flag-rollback.test.js.map +0 -1
  216. package/dist/tests/route-flag.test.d.ts +0 -2
  217. package/dist/tests/route-flag.test.d.ts.map +0 -1
  218. package/dist/tests/route-flag.test.js +0 -101
  219. package/dist/tests/route-flag.test.js.map +0 -1
  220. package/dist/tests/session-bootstrap.test.d.ts +0 -2
  221. package/dist/tests/session-bootstrap.test.d.ts.map +0 -1
  222. package/dist/tests/session-bootstrap.test.js +0 -183
  223. package/dist/tests/session-bootstrap.test.js.map +0 -1
  224. package/dist/tests/session.test.d.ts +0 -2
  225. package/dist/tests/session.test.d.ts.map +0 -1
  226. package/dist/tests/session.test.js +0 -17
  227. package/dist/tests/session.test.js.map +0 -1
  228. package/dist/tests/state-machine.test.d.ts +0 -2
  229. package/dist/tests/state-machine.test.d.ts.map +0 -1
  230. package/dist/tests/state-machine.test.js +0 -133
  231. package/dist/tests/state-machine.test.js.map +0 -1
  232. package/dist/tests/streaming/cli-stream-parser.test.d.ts +0 -2
  233. package/dist/tests/streaming/cli-stream-parser.test.d.ts.map +0 -1
  234. package/dist/tests/streaming/cli-stream-parser.test.js +0 -233
  235. package/dist/tests/streaming/cli-stream-parser.test.js.map +0 -1
  236. package/dist/tests/streaming/feature-flag.test.d.ts +0 -14
  237. package/dist/tests/streaming/feature-flag.test.d.ts.map +0 -1
  238. package/dist/tests/streaming/feature-flag.test.js +0 -163
  239. package/dist/tests/streaming/feature-flag.test.js.map +0 -1
  240. package/dist/tests/streaming/no-tools-prompt.test.d.ts +0 -17
  241. package/dist/tests/streaming/no-tools-prompt.test.d.ts.map +0 -1
  242. package/dist/tests/streaming/no-tools-prompt.test.js +0 -229
  243. package/dist/tests/streaming/no-tools-prompt.test.js.map +0 -1
  244. package/dist/tests/streaming/skill-plus-tools.test.d.ts +0 -14
  245. package/dist/tests/streaming/skill-plus-tools.test.d.ts.map +0 -1
  246. package/dist/tests/streaming/skill-plus-tools.test.js +0 -234
  247. package/dist/tests/streaming/skill-plus-tools.test.js.map +0 -1
  248. package/dist/tests/streaming/sse-translator.test.d.ts +0 -2
  249. package/dist/tests/streaming/sse-translator.test.d.ts.map +0 -1
  250. package/dist/tests/streaming/sse-translator.test.js +0 -227
  251. package/dist/tests/streaming/sse-translator.test.js.map +0 -1
  252. package/dist/tests/streaming/tool-result-roundtrip.test.d.ts +0 -11
  253. package/dist/tests/streaming/tool-result-roundtrip.test.d.ts.map +0 -1
  254. package/dist/tests/streaming/tool-result-roundtrip.test.js +0 -215
  255. package/dist/tests/streaming/tool-result-roundtrip.test.js.map +0 -1
  256. package/dist/tests/streaming/tool-use-translation.test.d.ts +0 -10
  257. package/dist/tests/streaming/tool-use-translation.test.d.ts.map +0 -1
  258. package/dist/tests/streaming/tool-use-translation.test.js +0 -251
  259. package/dist/tests/streaming/tool-use-translation.test.js.map +0 -1
  260. package/dist/tests/telegram-bridge.test.d.ts +0 -2
  261. package/dist/tests/telegram-bridge.test.d.ts.map +0 -1
  262. package/dist/tests/telegram-bridge.test.js +0 -17
  263. package/dist/tests/telegram-bridge.test.js.map +0 -1
  264. package/dist/tests/telegram-injector.test.d.ts +0 -2
  265. package/dist/tests/telegram-injector.test.d.ts.map +0 -1
  266. package/dist/tests/telegram-injector.test.js +0 -74
  267. package/dist/tests/telegram-injector.test.js.map +0 -1
  268. package/dist/tests/telemetry.test.d.ts +0 -2
  269. package/dist/tests/telemetry.test.d.ts.map +0 -1
  270. package/dist/tests/telemetry.test.js +0 -405
  271. package/dist/tests/telemetry.test.js.map +0 -1
  272. package/dist/tests/test-mode.test.d.ts +0 -2
  273. package/dist/tests/test-mode.test.d.ts.map +0 -1
  274. package/dist/tests/test-mode.test.js +0 -39
  275. package/dist/tests/test-mode.test.js.map +0 -1
@@ -1,401 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { writeFileSync, existsSync, unlinkSync, readFileSync } from 'node:fs';
3
- import { tmpdir } from 'node:os';
4
- import { join } from 'node:path';
5
- import { isCacheParityEnabled, hashPrompt, recordAttachment, readRegistry, REGISTRY_PATH, _setWriterForTests, _restoreDefaultWriterForTests, } from '../src/lib/cache-parity.js';
6
- describe('isCacheParityEnabled()', () => {
7
- const origEnv = process.env.OPENCLAW_CACHE_PARITY;
8
- afterEach(() => {
9
- if (origEnv === undefined) {
10
- delete process.env.OPENCLAW_CACHE_PARITY;
11
- }
12
- else {
13
- process.env.OPENCLAW_CACHE_PARITY = origEnv;
14
- }
15
- });
16
- it('returns true when env is unset (default-on)', () => {
17
- delete process.env.OPENCLAW_CACHE_PARITY;
18
- expect(isCacheParityEnabled()).toBe(true);
19
- });
20
- it('returns false when OPENCLAW_CACHE_PARITY=0', () => {
21
- process.env.OPENCLAW_CACHE_PARITY = '0';
22
- expect(isCacheParityEnabled()).toBe(false);
23
- });
24
- it('returns false when OPENCLAW_CACHE_PARITY=false', () => {
25
- process.env.OPENCLAW_CACHE_PARITY = 'false';
26
- expect(isCacheParityEnabled()).toBe(false);
27
- });
28
- it('returns false when OPENCLAW_CACHE_PARITY=off', () => {
29
- process.env.OPENCLAW_CACHE_PARITY = 'off';
30
- expect(isCacheParityEnabled()).toBe(false);
31
- });
32
- it('returns true when OPENCLAW_CACHE_PARITY=1', () => {
33
- process.env.OPENCLAW_CACHE_PARITY = '1';
34
- expect(isCacheParityEnabled()).toBe(true);
35
- });
36
- });
37
- describe('hashPrompt()', () => {
38
- it('returns a 16-character hex string', () => {
39
- const h = hashPrompt('hello world');
40
- expect(h).toHaveLength(16);
41
- expect(h).toMatch(/^[0-9a-f]{16}$/);
42
- });
43
- it('is deterministic — same input → same hash', () => {
44
- const prompt = 'You are a helpful assistant.';
45
- expect(hashPrompt(prompt)).toBe(hashPrompt(prompt));
46
- });
47
- it('produces different hashes for different inputs', () => {
48
- expect(hashPrompt('prompt A')).not.toBe(hashPrompt('prompt B'));
49
- });
50
- it('handles empty string without throwing', () => {
51
- expect(() => hashPrompt('')).not.toThrow();
52
- expect(hashPrompt('')).toHaveLength(16);
53
- });
54
- });
55
- describe('recordAttachment()', () => {
56
- let captured;
57
- beforeEach(() => {
58
- captured = [];
59
- _setWriterForTests((entry) => captured.push(entry));
60
- });
61
- afterEach(() => {
62
- _restoreDefaultWriterForTests();
63
- });
64
- it('calls injected writer with a well-formed entry', () => {
65
- recordAttachment({
66
- sessionId: 'sess-001',
67
- prompt: 'You are a helpful assistant.',
68
- attached: true,
69
- source: 'appendSystemPrompt',
70
- });
71
- expect(captured).toHaveLength(1);
72
- });
73
- it('entry contains a valid ISO timestamp', () => {
74
- recordAttachment({ sessionId: 's1', prompt: 'sys', attached: true, source: 'appendSystemPrompt' });
75
- expect(captured[0].ts).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
76
- });
77
- it('entry promptHash matches hashPrompt output', () => {
78
- const prompt = 'My system prompt content.';
79
- recordAttachment({ sessionId: 's2', prompt, attached: true, source: 'appendSystemPrompt' });
80
- expect(captured[0].promptHash).toBe(hashPrompt(prompt));
81
- });
82
- it('entry promptBytes matches byte length of prompt', () => {
83
- const prompt = 'hello';
84
- recordAttachment({ sessionId: 's3', prompt, attached: true, source: 'appendSystemPrompt' });
85
- expect(captured[0].promptBytes).toBe(Buffer.byteLength(prompt, 'utf8'));
86
- });
87
- it('entry promptBytes handles multi-byte UTF-8 correctly', () => {
88
- const prompt = '日本語テスト'; // 3 bytes per char in UTF-8
89
- recordAttachment({ sessionId: 's4', prompt, attached: false, source: 'unknown' });
90
- expect(captured[0].promptBytes).toBe(Buffer.byteLength(prompt, 'utf8'));
91
- expect(captured[0].promptBytes).toBeGreaterThan(prompt.length);
92
- });
93
- it('entry sessionId, attached, and source are preserved', () => {
94
- recordAttachment({ sessionId: 'my-session', prompt: 'x', attached: false, source: 'body.system' });
95
- expect(captured[0].sessionId).toBe('my-session');
96
- expect(captured[0].attached).toBe(false);
97
- expect(captured[0].source).toBe('body.system');
98
- });
99
- it('default writer skips writing when OPENCLAW_CACHE_PARITY=0', () => {
100
- _restoreDefaultWriterForTests();
101
- const origEnv = process.env.OPENCLAW_CACHE_PARITY;
102
- process.env.OPENCLAW_CACHE_PARITY = '0';
103
- // Re-inject to track: default writer won't call our array, so nothing captured.
104
- _setWriterForTests((entry) => captured.push(entry));
105
- // With env=0, isCacheParityEnabled() is false — verify the guard holds
106
- expect(isCacheParityEnabled()).toBe(false);
107
- if (origEnv === undefined) {
108
- delete process.env.OPENCLAW_CACHE_PARITY;
109
- }
110
- else {
111
- process.env.OPENCLAW_CACHE_PARITY = origEnv;
112
- }
113
- });
114
- it('defaultWriter: writes entry to disk when cache-parity is enabled', () => {
115
- // Redirect the default writer to a tmp file to observe the disk-write path
116
- _restoreDefaultWriterForTests();
117
- const origEnv = process.env.OPENCLAW_CACHE_PARITY;
118
- process.env.OPENCLAW_CACHE_PARITY = '1';
119
- // Inject a writer that writes to a tmp file mirroring defaultWriter behaviour
120
- const tmpFile = join(tmpdir(), `cp-test-${Date.now()}.jsonl`);
121
- _setWriterForTests((entry) => {
122
- // Simulate what defaultWriter does: append JSON line
123
- writeFileSync(tmpFile, JSON.stringify(entry) + '\n', { flag: 'a' });
124
- });
125
- recordAttachment({ sessionId: 'disk-test', prompt: 'sys-disk', attached: true, source: 'appendSystemPrompt' });
126
- const content = readFileSync(tmpFile, 'utf8');
127
- const parsed = JSON.parse(content.trim());
128
- expect(parsed.sessionId).toBe('disk-test');
129
- expect(parsed.attached).toBe(true);
130
- expect(parsed.source).toBe('appendSystemPrompt');
131
- unlinkSync(tmpFile);
132
- if (origEnv === undefined)
133
- delete process.env.OPENCLAW_CACHE_PARITY;
134
- else
135
- process.env.OPENCLAW_CACHE_PARITY = origEnv;
136
- });
137
- it('defaultWriter: catch path — silently handles write errors when not debug', () => {
138
- // Restore default writer so it exercises the try/catch
139
- _restoreDefaultWriterForTests();
140
- const origEnv = process.env.OPENCLAW_CACHE_PARITY;
141
- const origLog = process.env.OPENCLAW_LOG_LEVEL;
142
- process.env.OPENCLAW_CACHE_PARITY = '1';
143
- delete process.env.OPENCLAW_LOG_LEVEL;
144
- // Replace appendFileSync-path: inject a writer that throws
145
- _setWriterForTests((_entry) => {
146
- throw new Error('simulated disk full');
147
- });
148
- // Should NOT throw even when writer errors
149
- expect(() => recordAttachment({ sessionId: 'err-test', prompt: 'p', attached: false, source: 'unknown' })).toThrow(); // our injected writer throws — that's expected since we injected it directly
150
- // Now test that real defaultWriter's catch swallows errors (via fs mock)
151
- _restoreDefaultWriterForTests();
152
- const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
153
- // Point REGISTRY_PATH-equivalent to a read-only path by setting debug mode
154
- // and then triggering an error through a bad path scenario
155
- process.env.OPENCLAW_LOG_LEVEL = 'debug';
156
- // We can't easily make appendFileSync throw in ESM without full mocking,
157
- // so just verify the debug path doesn't crash the process
158
- stderrSpy.mockRestore();
159
- if (origEnv === undefined)
160
- delete process.env.OPENCLAW_CACHE_PARITY;
161
- else
162
- process.env.OPENCLAW_CACHE_PARITY = origEnv;
163
- if (origLog === undefined)
164
- delete process.env.OPENCLAW_LOG_LEVEL;
165
- else
166
- process.env.OPENCLAW_LOG_LEVEL = origLog;
167
- });
168
- it('defaultWriter: emits stderr debug message on write failure when OPENCLAW_LOG_LEVEL=debug', () => {
169
- _restoreDefaultWriterForTests();
170
- const origEnv = process.env.OPENCLAW_CACHE_PARITY;
171
- const origLog = process.env.OPENCLAW_LOG_LEVEL;
172
- process.env.OPENCLAW_CACHE_PARITY = '1';
173
- process.env.OPENCLAW_LOG_LEVEL = 'debug';
174
- const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
175
- // Inject a writer that calls stderr — simulating the catch path
176
- _setWriterForTests((_entry) => {
177
- if (process.env.OPENCLAW_LOG_LEVEL === 'debug') {
178
- process.stderr.write(`[cache-parity] registry write failed: simulated\n`);
179
- }
180
- });
181
- recordAttachment({ sessionId: 'debug-err', prompt: 'p', attached: false, source: 'unknown' });
182
- expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining('[cache-parity]'));
183
- stderrSpy.mockRestore();
184
- if (origEnv === undefined)
185
- delete process.env.OPENCLAW_CACHE_PARITY;
186
- else
187
- process.env.OPENCLAW_CACHE_PARITY = origEnv;
188
- if (origLog === undefined)
189
- delete process.env.OPENCLAW_LOG_LEVEL;
190
- else
191
- process.env.OPENCLAW_LOG_LEVEL = origLog;
192
- });
193
- });
194
- describe('readRegistry()', () => {
195
- it('returns empty array when registry file does not exist', () => {
196
- const result = readRegistry();
197
- expect(Array.isArray(result)).toBe(true);
198
- });
199
- it('parses a jsonl fixture and returns typed RegistryEntry array', () => {
200
- // Write a known fixture to a temp path and read it back via readRegistry
201
- // We use the _setWriterForTests + real appendFileSync to populate a known path,
202
- // then verify readRegistry round-trips correctly.
203
- const tmpFile = join(tmpdir(), `cp-registry-${Date.now()}.jsonl`);
204
- const entry1 = {
205
- ts: '2026-04-27T00:00:00.000Z',
206
- sessionId: 'sess-fixture-1',
207
- promptHash: 'abcdef1234567890',
208
- promptBytes: 42,
209
- attached: true,
210
- source: 'appendSystemPrompt',
211
- };
212
- const entry2 = {
213
- ts: '2026-04-27T00:01:00.000Z',
214
- sessionId: 'sess-fixture-2',
215
- promptHash: 'fedcba0987654321',
216
- promptBytes: 100,
217
- attached: false,
218
- source: 'body.system',
219
- };
220
- writeFileSync(tmpFile, JSON.stringify(entry1) + '\n' + JSON.stringify(entry2) + '\n');
221
- // readRegistry reads from REGISTRY_PATH; we can't easily redirect it without mocking,
222
- // but we can verify the parsing logic by reading the file ourselves the same way
223
- const content = readFileSync(tmpFile, 'utf8');
224
- const parsed = content
225
- .split('\n')
226
- .filter((line) => line.trim().length > 0)
227
- .map((line) => JSON.parse(line));
228
- expect(parsed).toHaveLength(2);
229
- expect(parsed[0].sessionId).toBe('sess-fixture-1');
230
- expect(parsed[0].source).toBe('appendSystemPrompt');
231
- expect(parsed[1].sessionId).toBe('sess-fixture-2');
232
- expect(parsed[1].attached).toBe(false);
233
- unlinkSync(tmpFile);
234
- });
235
- it('returns empty array on malformed jsonl (catch path)', () => {
236
- // readRegistry's catch path returns [] on parse failure
237
- // Simulate by verifying the function always returns an array
238
- const result = readRegistry();
239
- expect(Array.isArray(result)).toBe(true);
240
- });
241
- it('readRegistry() returns RegistryEntry objects with expected shape when file exists', () => {
242
- // Write real entries to REGISTRY_PATH using the injected writer, then read back
243
- const captured = [];
244
- _setWriterForTests((e) => captured.push(e));
245
- recordAttachment({ sessionId: 'rr-test', prompt: 'readback prompt', attached: true, source: 'appendSystemPrompt' });
246
- _restoreDefaultWriterForTests();
247
- // The captured array has the entry shape — verify shape matches RegistryEntry
248
- expect(captured[0]).toMatchObject({
249
- sessionId: 'rr-test',
250
- attached: true,
251
- source: 'appendSystemPrompt',
252
- promptBytes: expect.any(Number),
253
- promptHash: expect.any(String),
254
- ts: expect.any(String),
255
- });
256
- });
257
- });
258
- describe('REGISTRY_PATH', () => {
259
- it('points to ~/.openclaw/workspace/memory/cc-openclaw-cache-registry.jsonl', () => {
260
- expect(REGISTRY_PATH).toContain('.openclaw/workspace/memory/cc-openclaw-cache-registry.jsonl');
261
- });
262
- });
263
- // ── defaultWriter real execution (lines 62-72) ───────────────────────────────
264
- describe('defaultWriter real execution (lines 62-72)', () => {
265
- const origCacheParity = process.env.OPENCLAW_CACHE_PARITY;
266
- const origLogLevel = process.env.OPENCLAW_LOG_LEVEL;
267
- afterEach(() => {
268
- _restoreDefaultWriterForTests();
269
- if (origCacheParity === undefined)
270
- delete process.env.OPENCLAW_CACHE_PARITY;
271
- else
272
- process.env.OPENCLAW_CACHE_PARITY = origCacheParity;
273
- if (origLogLevel === undefined)
274
- delete process.env.OPENCLAW_LOG_LEVEL;
275
- else
276
- process.env.OPENCLAW_LOG_LEVEL = origLogLevel;
277
- });
278
- it('defaultWriter writes a real jsonl entry to REGISTRY_PATH when enabled', () => {
279
- // Restore the actual defaultWriter so lines 62-72 execute
280
- _restoreDefaultWriterForTests();
281
- process.env.OPENCLAW_CACHE_PARITY = '1';
282
- delete process.env.OPENCLAW_LOG_LEVEL;
283
- // This will write to the real REGISTRY_PATH — ensure dir exists first (ensureDir covers line 28)
284
- expect(() => recordAttachment({
285
- sessionId: 'real-write-test',
286
- prompt: 'defaultWriter coverage prompt',
287
- attached: true,
288
- source: 'appendSystemPrompt',
289
- })).not.toThrow();
290
- // Verify the file was actually written and contains our entry
291
- expect(existsSync(REGISTRY_PATH)).toBe(true);
292
- const content = readFileSync(REGISTRY_PATH, 'utf8');
293
- const lines = content.split('\n').filter((l) => l.trim().length > 0);
294
- const last = JSON.parse(lines[lines.length - 1]);
295
- expect(last.sessionId).toBe('real-write-test');
296
- expect(last.source).toBe('appendSystemPrompt');
297
- });
298
- it('defaultWriter is a no-op when OPENCLAW_CACHE_PARITY=0 (covers early return line 63)', () => {
299
- _restoreDefaultWriterForTests();
300
- process.env.OPENCLAW_CACHE_PARITY = '0';
301
- // File may or may not exist; just verify no throw and no new write
302
- const sizeBefore = existsSync(REGISTRY_PATH)
303
- ? readFileSync(REGISTRY_PATH, 'utf8').length
304
- : 0;
305
- recordAttachment({ sessionId: 'skip-write', prompt: 'p', attached: false, source: 'unknown' });
306
- const sizeAfter = existsSync(REGISTRY_PATH)
307
- ? readFileSync(REGISTRY_PATH, 'utf8').length
308
- : 0;
309
- expect(sizeAfter).toBe(sizeBefore);
310
- });
311
- it('defaultWriter catch path: emits to stderr when write fails and debug is on (lines 68-70)', () => {
312
- _restoreDefaultWriterForTests();
313
- process.env.OPENCLAW_CACHE_PARITY = '1';
314
- process.env.OPENCLAW_LOG_LEVEL = 'debug';
315
- // Simulate the catch path by injecting a writer that replicates defaultWriter's catch branch
316
- const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
317
- _setWriterForTests((_entry) => {
318
- try {
319
- throw new Error('ENOSPC: no space left on device');
320
- }
321
- catch (err) {
322
- if (process.env.OPENCLAW_LOG_LEVEL === 'debug') {
323
- process.stderr.write(`[cache-parity] registry write failed: ${err.message}\n`);
324
- }
325
- }
326
- });
327
- recordAttachment({ sessionId: 'catch-test', prompt: 'x', attached: false, source: 'unknown' });
328
- expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining('[cache-parity] registry write failed:'));
329
- stderrSpy.mockRestore();
330
- });
331
- });
332
- // ── readRegistry() real parse path (lines 97-105) ───────────────────────────
333
- describe('readRegistry() real parse path', () => {
334
- const origCacheParity = process.env.OPENCLAW_CACHE_PARITY;
335
- // Save and restore registry around each test to avoid cross-test contamination
336
- let registrySnapshot = null;
337
- beforeEach(() => {
338
- // Read current file; if corrupt, treat as null so we start fresh
339
- if (existsSync(REGISTRY_PATH)) {
340
- try {
341
- const raw = readFileSync(REGISTRY_PATH, 'utf8');
342
- // Validate it parses cleanly — if not, start fresh
343
- raw.split('\n').filter((l) => l.trim()).forEach((l) => JSON.parse(l));
344
- registrySnapshot = raw;
345
- }
346
- catch {
347
- // File is corrupt — overwrite with empty to start clean
348
- writeFileSync(REGISTRY_PATH, '');
349
- registrySnapshot = '';
350
- }
351
- }
352
- else {
353
- registrySnapshot = null;
354
- }
355
- });
356
- afterEach(() => {
357
- _restoreDefaultWriterForTests();
358
- if (origCacheParity === undefined)
359
- delete process.env.OPENCLAW_CACHE_PARITY;
360
- else
361
- process.env.OPENCLAW_CACHE_PARITY = origCacheParity;
362
- // Restore registry to pre-test state
363
- if (registrySnapshot !== null) {
364
- writeFileSync(REGISTRY_PATH, registrySnapshot);
365
- }
366
- });
367
- it('readRegistry() parses the real REGISTRY_PATH if it exists (lines 98-102)', () => {
368
- _restoreDefaultWriterForTests();
369
- process.env.OPENCLAW_CACHE_PARITY = '1';
370
- recordAttachment({
371
- sessionId: 'readback-real',
372
- prompt: 'real readRegistry test',
373
- attached: true,
374
- source: 'appendSystemPrompt',
375
- });
376
- const entries = readRegistry();
377
- expect(Array.isArray(entries)).toBe(true);
378
- expect(entries.length).toBeGreaterThan(0);
379
- const found = entries.find((e) => e.sessionId === 'readback-real');
380
- expect(found).toBeDefined();
381
- expect(found.source).toBe('appendSystemPrompt');
382
- expect(found.attached).toBe(true);
383
- });
384
- it('readRegistry() catch path: returns [] when file contains malformed JSON (lines 103-105)', () => {
385
- // Write a file with a valid line + a bad line — .map(JSON.parse) throws on bad line → catch
386
- const validEntry = {
387
- ts: new Date().toISOString(),
388
- sessionId: 'corrupt-test',
389
- promptHash: 'abcdef1234567890',
390
- promptBytes: 5,
391
- attached: false,
392
- source: 'unknown',
393
- };
394
- writeFileSync(REGISTRY_PATH, JSON.stringify(validEntry) + '\nTHIS IS NOT JSON\n');
395
- const entries = readRegistry();
396
- expect(Array.isArray(entries)).toBe(true);
397
- expect(entries).toHaveLength(0);
398
- // afterEach restores the registry to pre-test state
399
- });
400
- });
401
- //# sourceMappingURL=cache-parity.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache-parity.test.js","sourceRoot":"","sources":["../../tests/cache-parity.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=command-router.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-router.test.d.ts","sourceRoot":"","sources":["../../tests/command-router.test.ts"],"names":[],"mappings":""}
@@ -1,60 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { register, parseCcCommand } from '../src/command-router/index.js';
3
- describe('register()', () => {
4
- it('wires before_dispatch handler', () => {
5
- const on = vi.fn();
6
- const api = {
7
- on,
8
- registerService: vi.fn(),
9
- };
10
- register(api);
11
- expect(on).toHaveBeenCalledWith('before_dispatch', expect.any(Function));
12
- });
13
- // Note: idempotency test for cc-handler is brittle without resetting module state.
14
- // P2 cco-hardening will refactor to centralized register-guard with reset hook.
15
- });
16
- describe('parseCcCommand()', () => {
17
- it('returns null for empty input', () => {
18
- expect(parseCcCommand('')).toBeNull();
19
- });
20
- it('returns null for non-/cc input', () => {
21
- expect(parseCcCommand('hello world')).toBeNull();
22
- });
23
- it('parses /cc <prompt> as new session', () => {
24
- const result = parseCcCommand('/cc fix the auth bug');
25
- expect(result).toEqual({ subcommand: 'new', prompt: 'fix the auth bug' });
26
- });
27
- it('parses /cc+ <prompt> as continue', () => {
28
- const result = parseCcCommand('/cc+ add error handling');
29
- expect(result).toEqual({ subcommand: 'continue', prompt: 'add error handling' });
30
- });
31
- it('parses /cc continue <prompt> as continue', () => {
32
- const result = parseCcCommand('/cc continue add tests');
33
- expect(result).toEqual({ subcommand: 'continue', prompt: 'add tests' });
34
- });
35
- it('parses /cc stop', () => {
36
- expect(parseCcCommand('/cc stop')).toEqual({ subcommand: 'stop' });
37
- });
38
- it('parses /cc status', () => {
39
- expect(parseCcCommand('/cc status')).toEqual({ subcommand: 'status' });
40
- });
41
- it('parses /cc list', () => {
42
- expect(parseCcCommand('/cc list')).toEqual({ subcommand: 'list' });
43
- });
44
- it('parses /cc resume without target', () => {
45
- expect(parseCcCommand('/cc resume')).toEqual({ subcommand: 'resume', target: undefined });
46
- });
47
- it('parses /cc resume with session id', () => {
48
- expect(parseCcCommand('/cc resume a3f1b70c')).toEqual({
49
- subcommand: 'resume',
50
- target: 'a3f1b70c',
51
- });
52
- });
53
- it('returns null for bare /cc with no prompt', () => {
54
- expect(parseCcCommand('/cc')).toBeNull();
55
- });
56
- it('returns null for /cc+ with no prompt', () => {
57
- expect(parseCcCommand('/cc+')).toBeNull();
58
- });
59
- });
60
- //# sourceMappingURL=command-router.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-router.test.js","sourceRoot":"","sources":["../../tests/command-router.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAkB,MAAM,gCAAgC,CAAC;AAE1F,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,GAAG,GAAc;YACrB,EAAE;YACF,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;SACzB,CAAC;QACF,QAAQ,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,mFAAmF;IACnF,gFAAgF;AAClF,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,sBAAsB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,yBAAyB,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,cAAc,CAAC,wBAAwB,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC;YACpD,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=council.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"council.test.d.ts","sourceRoot":"","sources":["../../tests/council.test.ts"],"names":[],"mappings":""}
@@ -1,20 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import * as council from '../src/council/index.js';
3
- import { parseConsensus, stripConsensusTags, hasConsensusMarker } from '../src/council/consensus.js';
4
- describe('council barrel', () => {
5
- it('imports without crashing', () => {
6
- expect(council).toBeDefined();
7
- });
8
- });
9
- describe('consensus helpers', () => {
10
- it('hasConsensusMarker returns false for plain text', () => {
11
- expect(hasConsensusMarker('hello world')).toBe(false);
12
- });
13
- it('stripConsensusTags returns input when no tags present', () => {
14
- expect(stripConsensusTags('plain text')).toBe('plain text');
15
- });
16
- it('parseConsensus is callable', () => {
17
- expect(typeof parseConsensus).toBe('function');
18
- });
19
- });
20
- //# sourceMappingURL=council.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"council.test.js","sourceRoot":"","sources":["../../tests/council.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAErG,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=drift-detector.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drift-detector.test.d.ts","sourceRoot":"","sources":["../../tests/drift-detector.test.ts"],"names":[],"mappings":""}