@a1hvdy/cc-openclaw 0.4.8 → 0.4.9

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 (223) hide show
  1. package/dist/src/models.js +9 -1
  2. package/dist/src/models.js.map +1 -1
  3. package/dist/src/openai-compat/openai-compat.js +14 -4
  4. package/dist/src/openai-compat/openai-compat.js.map +1 -1
  5. package/package.json +1 -1
  6. package/vendor/openai-compat.js +18 -2
  7. package/vendor/persistent-session.js +1 -2
  8. package/dist/scripts/bench/ab-harness.d.ts +0 -58
  9. package/dist/scripts/bench/ab-harness.d.ts.map +0 -1
  10. package/dist/scripts/bench/ab-harness.js +0 -78
  11. package/dist/scripts/bench/ab-harness.js.map +0 -1
  12. package/dist/src/channels/adapter.d.ts.map +0 -1
  13. package/dist/src/channels/telegram/completion-summary.d.ts.map +0 -1
  14. package/dist/src/channels/telegram/error-renderer.d.ts.map +0 -1
  15. package/dist/src/channels/telegram/event-reducer.d.ts.map +0 -1
  16. package/dist/src/channels/telegram/index.d.ts.map +0 -1
  17. package/dist/src/channels/telegram/injector.d.ts.map +0 -1
  18. package/dist/src/channels/telegram/live-card.d.ts.map +0 -1
  19. package/dist/src/channels/telegram/state-machine.d.ts.map +0 -1
  20. package/dist/src/channels/telegram/tool-tracker.d.ts.map +0 -1
  21. package/dist/src/command-router/cc-handler.d.ts.map +0 -1
  22. package/dist/src/command-router/index.d.ts.map +0 -1
  23. package/dist/src/constants.d.ts.map +0 -1
  24. package/dist/src/council/consensus.d.ts.map +0 -1
  25. package/dist/src/council/council.d.ts.map +0 -1
  26. package/dist/src/council/index.d.ts.map +0 -1
  27. package/dist/src/engines/base-oneshot-session.d.ts.map +0 -1
  28. package/dist/src/engines/index.d.ts.map +0 -1
  29. package/dist/src/engines/persistent-codex-session.d.ts.map +0 -1
  30. package/dist/src/engines/persistent-cursor-session.d.ts.map +0 -1
  31. package/dist/src/engines/persistent-custom-session.d.ts.map +0 -1
  32. package/dist/src/engines/persistent-gemini-session.d.ts.map +0 -1
  33. package/dist/src/engines/persistent-session.d.ts.map +0 -1
  34. package/dist/src/health/handler.d.ts.map +0 -1
  35. package/dist/src/health/index.d.ts.map +0 -1
  36. package/dist/src/index.d.ts.map +0 -1
  37. package/dist/src/lib/auto-recovery.d.ts.map +0 -1
  38. package/dist/src/lib/cache-parity.d.ts.map +0 -1
  39. package/dist/src/lib/circuit-breaker.d.ts.map +0 -1
  40. package/dist/src/lib/config.d.ts.map +0 -1
  41. package/dist/src/lib/debug-tap.d.ts.map +0 -1
  42. package/dist/src/lib/drift-detector.d.ts.map +0 -1
  43. package/dist/src/lib/error-formatter.d.ts.map +0 -1
  44. package/dist/src/lib/heartbeat-workaround.d.ts.map +0 -1
  45. package/dist/src/lib/index.d.ts.map +0 -1
  46. package/dist/src/lib/register-guard.d.ts.map +0 -1
  47. package/dist/src/lib/route-flag.d.ts.map +0 -1
  48. package/dist/src/lib/sysprompt-strip.d.ts.map +0 -1
  49. package/dist/src/lib/telemetry.d.ts.map +0 -1
  50. package/dist/src/lib/test-mode.d.ts.map +0 -1
  51. package/dist/src/lib/vendor-paths.d.ts.map +0 -1
  52. package/dist/src/logger.d.ts.map +0 -1
  53. package/dist/src/mcp/bridge.d.ts.map +0 -1
  54. package/dist/src/mcp/index.d.ts.map +0 -1
  55. package/dist/src/models.d.ts.map +0 -1
  56. package/dist/src/openai-compat/cli-stream-parser.d.ts.map +0 -1
  57. package/dist/src/openai-compat/index.d.ts.map +0 -1
  58. package/dist/src/openai-compat/openai-compat.d.ts.map +0 -1
  59. package/dist/src/openai-compat/skill-resolver.d.ts.map +0 -1
  60. package/dist/src/openai-compat/sse-translator.d.ts.map +0 -1
  61. package/dist/src/proxy/anthropic-adapter.d.ts.map +0 -1
  62. package/dist/src/proxy/handler.d.ts.map +0 -1
  63. package/dist/src/proxy/index.d.ts.map +0 -1
  64. package/dist/src/proxy/schema-cleaner.d.ts.map +0 -1
  65. package/dist/src/proxy/thought-cache.d.ts.map +0 -1
  66. package/dist/src/session/embedded-server.d.ts.map +0 -1
  67. package/dist/src/session/inbox-manager.d.ts.map +0 -1
  68. package/dist/src/session/index.d.ts.map +0 -1
  69. package/dist/src/session/session-manager.d.ts.map +0 -1
  70. package/dist/src/session-bootstrap/cwd-patch.d.ts.map +0 -1
  71. package/dist/src/session-bootstrap/index.d.ts.map +0 -1
  72. package/dist/src/session-bootstrap/sysprompt-strip.d.ts.map +0 -1
  73. package/dist/src/session-bootstrap/think-conflict-resolver.d.ts.map +0 -1
  74. package/dist/src/types.d.ts.map +0 -1
  75. package/dist/src/validation.d.ts.map +0 -1
  76. package/dist/tests/_helpers/subprocess-mock.d.ts +0 -35
  77. package/dist/tests/_helpers/subprocess-mock.d.ts.map +0 -1
  78. package/dist/tests/_helpers/subprocess-mock.js +0 -136
  79. package/dist/tests/_helpers/subprocess-mock.js.map +0 -1
  80. package/dist/tests/auto-recovery.test.d.ts +0 -2
  81. package/dist/tests/auto-recovery.test.d.ts.map +0 -1
  82. package/dist/tests/auto-recovery.test.js +0 -189
  83. package/dist/tests/auto-recovery.test.js.map +0 -1
  84. package/dist/tests/bench-harness.test.d.ts +0 -2
  85. package/dist/tests/bench-harness.test.d.ts.map +0 -1
  86. package/dist/tests/bench-harness.test.js +0 -21
  87. package/dist/tests/bench-harness.test.js.map +0 -1
  88. package/dist/tests/cache-parity.test.d.ts +0 -2
  89. package/dist/tests/cache-parity.test.d.ts.map +0 -1
  90. package/dist/tests/cache-parity.test.js +0 -401
  91. package/dist/tests/cache-parity.test.js.map +0 -1
  92. package/dist/tests/command-router.test.d.ts +0 -2
  93. package/dist/tests/command-router.test.d.ts.map +0 -1
  94. package/dist/tests/command-router.test.js +0 -60
  95. package/dist/tests/command-router.test.js.map +0 -1
  96. package/dist/tests/council.test.d.ts +0 -2
  97. package/dist/tests/council.test.d.ts.map +0 -1
  98. package/dist/tests/council.test.js +0 -20
  99. package/dist/tests/council.test.js.map +0 -1
  100. package/dist/tests/drift-detector.test.d.ts +0 -2
  101. package/dist/tests/drift-detector.test.d.ts.map +0 -1
  102. package/dist/tests/drift-detector.test.js +0 -268
  103. package/dist/tests/drift-detector.test.js.map +0 -1
  104. package/dist/tests/eager-bootstrap-gating.test.d.ts +0 -9
  105. package/dist/tests/eager-bootstrap-gating.test.d.ts.map +0 -1
  106. package/dist/tests/eager-bootstrap-gating.test.js +0 -97
  107. package/dist/tests/eager-bootstrap-gating.test.js.map +0 -1
  108. package/dist/tests/engines.test.d.ts +0 -2
  109. package/dist/tests/engines.test.d.ts.map +0 -1
  110. package/dist/tests/engines.test.js +0 -8
  111. package/dist/tests/engines.test.js.map +0 -1
  112. package/dist/tests/error-formatter.test.d.ts +0 -2
  113. package/dist/tests/error-formatter.test.d.ts.map +0 -1
  114. package/dist/tests/error-formatter.test.js +0 -220
  115. package/dist/tests/error-formatter.test.js.map +0 -1
  116. package/dist/tests/health.test.d.ts +0 -2
  117. package/dist/tests/health.test.d.ts.map +0 -1
  118. package/dist/tests/health.test.js +0 -110
  119. package/dist/tests/health.test.js.map +0 -1
  120. package/dist/tests/heartbeat-workaround.test.d.ts +0 -2
  121. package/dist/tests/heartbeat-workaround.test.d.ts.map +0 -1
  122. package/dist/tests/heartbeat-workaround.test.js +0 -90
  123. package/dist/tests/heartbeat-workaround.test.js.map +0 -1
  124. package/dist/tests/index.test.d.ts +0 -2
  125. package/dist/tests/index.test.d.ts.map +0 -1
  126. package/dist/tests/index.test.js +0 -7
  127. package/dist/tests/index.test.js.map +0 -1
  128. package/dist/tests/lib-sysprompt-strip.test.d.ts +0 -2
  129. package/dist/tests/lib-sysprompt-strip.test.d.ts.map +0 -1
  130. package/dist/tests/lib-sysprompt-strip.test.js +0 -145
  131. package/dist/tests/lib-sysprompt-strip.test.js.map +0 -1
  132. package/dist/tests/listener-activation.test.d.ts +0 -2
  133. package/dist/tests/listener-activation.test.d.ts.map +0 -1
  134. package/dist/tests/listener-activation.test.js +0 -87
  135. package/dist/tests/listener-activation.test.js.map +0 -1
  136. package/dist/tests/mcp-bridge.test.d.ts +0 -2
  137. package/dist/tests/mcp-bridge.test.d.ts.map +0 -1
  138. package/dist/tests/mcp-bridge.test.js +0 -137
  139. package/dist/tests/mcp-bridge.test.js.map +0 -1
  140. package/dist/tests/openai-compat.test.d.ts +0 -2
  141. package/dist/tests/openai-compat.test.d.ts.map +0 -1
  142. package/dist/tests/openai-compat.test.js +0 -8
  143. package/dist/tests/openai-compat.test.js.map +0 -1
  144. package/dist/tests/proxy-heartbeat-integration.test.d.ts +0 -15
  145. package/dist/tests/proxy-heartbeat-integration.test.d.ts.map +0 -1
  146. package/dist/tests/proxy-heartbeat-integration.test.js +0 -122
  147. package/dist/tests/proxy-heartbeat-integration.test.js.map +0 -1
  148. package/dist/tests/proxy.test.d.ts +0 -2
  149. package/dist/tests/proxy.test.d.ts.map +0 -1
  150. package/dist/tests/proxy.test.js +0 -8
  151. package/dist/tests/proxy.test.js.map +0 -1
  152. package/dist/tests/register-guard-stacking.test.d.ts +0 -2
  153. package/dist/tests/register-guard-stacking.test.d.ts.map +0 -1
  154. package/dist/tests/register-guard-stacking.test.js +0 -61
  155. package/dist/tests/register-guard-stacking.test.js.map +0 -1
  156. package/dist/tests/register-guard.test.d.ts +0 -2
  157. package/dist/tests/register-guard.test.d.ts.map +0 -1
  158. package/dist/tests/register-guard.test.js +0 -129
  159. package/dist/tests/register-guard.test.js.map +0 -1
  160. package/dist/tests/route-flag-rollback.test.d.ts +0 -2
  161. package/dist/tests/route-flag-rollback.test.d.ts.map +0 -1
  162. package/dist/tests/route-flag-rollback.test.js +0 -70
  163. package/dist/tests/route-flag-rollback.test.js.map +0 -1
  164. package/dist/tests/route-flag.test.d.ts +0 -2
  165. package/dist/tests/route-flag.test.d.ts.map +0 -1
  166. package/dist/tests/route-flag.test.js +0 -101
  167. package/dist/tests/route-flag.test.js.map +0 -1
  168. package/dist/tests/session-bootstrap.test.d.ts +0 -2
  169. package/dist/tests/session-bootstrap.test.d.ts.map +0 -1
  170. package/dist/tests/session-bootstrap.test.js +0 -183
  171. package/dist/tests/session-bootstrap.test.js.map +0 -1
  172. package/dist/tests/session.test.d.ts +0 -2
  173. package/dist/tests/session.test.d.ts.map +0 -1
  174. package/dist/tests/session.test.js +0 -17
  175. package/dist/tests/session.test.js.map +0 -1
  176. package/dist/tests/state-machine.test.d.ts +0 -2
  177. package/dist/tests/state-machine.test.d.ts.map +0 -1
  178. package/dist/tests/state-machine.test.js +0 -133
  179. package/dist/tests/state-machine.test.js.map +0 -1
  180. package/dist/tests/streaming/cli-stream-parser.test.d.ts +0 -2
  181. package/dist/tests/streaming/cli-stream-parser.test.d.ts.map +0 -1
  182. package/dist/tests/streaming/cli-stream-parser.test.js +0 -233
  183. package/dist/tests/streaming/cli-stream-parser.test.js.map +0 -1
  184. package/dist/tests/streaming/feature-flag.test.d.ts +0 -14
  185. package/dist/tests/streaming/feature-flag.test.d.ts.map +0 -1
  186. package/dist/tests/streaming/feature-flag.test.js +0 -163
  187. package/dist/tests/streaming/feature-flag.test.js.map +0 -1
  188. package/dist/tests/streaming/no-tools-prompt.test.d.ts +0 -17
  189. package/dist/tests/streaming/no-tools-prompt.test.d.ts.map +0 -1
  190. package/dist/tests/streaming/no-tools-prompt.test.js +0 -229
  191. package/dist/tests/streaming/no-tools-prompt.test.js.map +0 -1
  192. package/dist/tests/streaming/skill-plus-tools.test.d.ts +0 -14
  193. package/dist/tests/streaming/skill-plus-tools.test.d.ts.map +0 -1
  194. package/dist/tests/streaming/skill-plus-tools.test.js +0 -234
  195. package/dist/tests/streaming/skill-plus-tools.test.js.map +0 -1
  196. package/dist/tests/streaming/sse-translator.test.d.ts +0 -2
  197. package/dist/tests/streaming/sse-translator.test.d.ts.map +0 -1
  198. package/dist/tests/streaming/sse-translator.test.js +0 -227
  199. package/dist/tests/streaming/sse-translator.test.js.map +0 -1
  200. package/dist/tests/streaming/tool-result-roundtrip.test.d.ts +0 -11
  201. package/dist/tests/streaming/tool-result-roundtrip.test.d.ts.map +0 -1
  202. package/dist/tests/streaming/tool-result-roundtrip.test.js +0 -215
  203. package/dist/tests/streaming/tool-result-roundtrip.test.js.map +0 -1
  204. package/dist/tests/streaming/tool-use-translation.test.d.ts +0 -10
  205. package/dist/tests/streaming/tool-use-translation.test.d.ts.map +0 -1
  206. package/dist/tests/streaming/tool-use-translation.test.js +0 -251
  207. package/dist/tests/streaming/tool-use-translation.test.js.map +0 -1
  208. package/dist/tests/telegram-bridge.test.d.ts +0 -2
  209. package/dist/tests/telegram-bridge.test.d.ts.map +0 -1
  210. package/dist/tests/telegram-bridge.test.js +0 -17
  211. package/dist/tests/telegram-bridge.test.js.map +0 -1
  212. package/dist/tests/telegram-injector.test.d.ts +0 -2
  213. package/dist/tests/telegram-injector.test.d.ts.map +0 -1
  214. package/dist/tests/telegram-injector.test.js +0 -74
  215. package/dist/tests/telegram-injector.test.js.map +0 -1
  216. package/dist/tests/telemetry.test.d.ts +0 -2
  217. package/dist/tests/telemetry.test.d.ts.map +0 -1
  218. package/dist/tests/telemetry.test.js +0 -405
  219. package/dist/tests/telemetry.test.js.map +0 -1
  220. package/dist/tests/test-mode.test.d.ts +0 -2
  221. package/dist/tests/test-mode.test.d.ts.map +0 -1
  222. package/dist/tests/test-mode.test.js +0 -39
  223. package/dist/tests/test-mode.test.js.map +0 -1
@@ -1,145 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import { isStripEnabled, stripSysprompt } from '../src/lib/sysprompt-strip.js';
3
- // ── Helpers ───────────────────────────────────────────────────────────────
4
- const ORIGINAL_ENV = process.env.OPENCLAW_AGGRESSIVE_STRIP;
5
- function setEnv(value) {
6
- if (value === undefined) {
7
- delete process.env.OPENCLAW_AGGRESSIVE_STRIP;
8
- }
9
- else {
10
- process.env.OPENCLAW_AGGRESSIVE_STRIP = value;
11
- }
12
- }
13
- afterEach(() => {
14
- setEnv(ORIGINAL_ENV);
15
- });
16
- // ── isStripEnabled() ──────────────────────────────────────────────────────
17
- describe('isStripEnabled()', () => {
18
- it('returns true when env is unset (default-on)', () => {
19
- setEnv(undefined);
20
- expect(isStripEnabled()).toBe(true);
21
- });
22
- it('returns false when env="0" (opt-out)', () => {
23
- setEnv('0');
24
- expect(isStripEnabled()).toBe(false);
25
- });
26
- it('returns false when env="false" (opt-out)', () => {
27
- setEnv('false');
28
- expect(isStripEnabled()).toBe(false);
29
- });
30
- it('returns false when env="off" (opt-out)', () => {
31
- setEnv('off');
32
- expect(isStripEnabled()).toBe(false);
33
- });
34
- it('returns true when env="1" (explicit on — backward compat with upstream)', () => {
35
- setEnv('1');
36
- expect(isStripEnabled()).toBe(true);
37
- });
38
- it('returns true when env is some other truthy string', () => {
39
- setEnv('yes');
40
- expect(isStripEnabled()).toBe(true);
41
- });
42
- it('respects forceDisabled override regardless of env', () => {
43
- setEnv('1');
44
- expect(isStripEnabled({ forceDisabled: true })).toBe(false);
45
- });
46
- it('respects forceEnabled override regardless of env', () => {
47
- setEnv('0');
48
- expect(isStripEnabled({ forceEnabled: true })).toBe(true);
49
- });
50
- it('forceDisabled takes priority over forceEnabled', () => {
51
- // forceDisabled is checked first in the implementation
52
- expect(isStripEnabled({ forceDisabled: true, forceEnabled: true })).toBe(false);
53
- });
54
- });
55
- // ── stripSysprompt() — disabled path ─────────────────────────────────────
56
- describe('stripSysprompt() — disabled', () => {
57
- it('returns input unchanged when forceDisabled=true', () => {
58
- const input = '## SELF_IMPROVEMENT_REMINDER.md\nsome content\n<location>/foo</location>';
59
- const result = stripSysprompt(input, { forceDisabled: true });
60
- expect(result.content).toBe(input);
61
- expect(result.changed).toBe(false);
62
- expect(result.aggressiveStripped).toBe(false);
63
- });
64
- });
65
- // ── stripSysprompt() — enabled path ──────────────────────────────────────
66
- describe('stripSysprompt() — enabled', () => {
67
- const FIXTURE_SELF_IMPROVEMENT = [
68
- 'Some preamble text.',
69
- '## SELF_IMPROVEMENT_REMINDER.md',
70
- '## Self-Improvement Reminder',
71
- 'Remember to improve yourself daily.',
72
- 'Keep growing.',
73
- '## Next Section',
74
- 'This should remain.',
75
- ].join('\n');
76
- it('strips SELF_IMPROVEMENT_REMINDER.md marker line', () => {
77
- const result = stripSysprompt(FIXTURE_SELF_IMPROVEMENT, { forceEnabled: true });
78
- expect(result.content).not.toContain('## SELF_IMPROVEMENT_REMINDER.md');
79
- expect(result.changed).toBe(true);
80
- });
81
- it('strips Self-Improvement Reminder block through next heading', () => {
82
- const result = stripSysprompt(FIXTURE_SELF_IMPROVEMENT, { forceEnabled: true });
83
- expect(result.content).not.toContain('Self-Improvement Reminder');
84
- expect(result.content).not.toContain('Remember to improve yourself daily.');
85
- // Next section content should survive
86
- expect(result.content).toContain('This should remain.');
87
- });
88
- it('strips <location> lines from skills catalog', () => {
89
- const input = 'Skill list:\n <location>/home/user/.openclaw/skills/foo.ts</location>\nOther content.';
90
- const result = stripSysprompt(input, { forceEnabled: true });
91
- expect(result.content).not.toContain('<location>');
92
- expect(result.content).toContain('Skill list:');
93
- expect(result.content).toContain('Other content.');
94
- expect(result.changed).toBe(true);
95
- });
96
- it('strips **Tool escalation:** numbered cheat-sheet block (F2.1)', () => {
97
- const input = [
98
- 'Some intro about tool routing.',
99
- '**Tool escalation:**',
100
- '1. Try A first.',
101
- '2. Then B.',
102
- '3. Then C.',
103
- '**Scope selection rule:**',
104
- 'Use the narrowest scope.',
105
- ].join('\n');
106
- const result = stripSysprompt(input, { forceEnabled: true });
107
- expect(result.content).not.toContain('**Tool escalation:**');
108
- expect(result.content).not.toContain('1. Try A first.');
109
- expect(result.content).toContain('**Scope selection rule:**');
110
- expect(result.aggressiveStripped).toBe(true);
111
- expect(result.changed).toBe(true);
112
- });
113
- it('output is shorter than input on combined fixture (actually shrinks)', () => {
114
- const combined = [
115
- '## SELF_IMPROVEMENT_REMINDER.md',
116
- '## Self-Improvement Reminder',
117
- 'Improve daily.',
118
- '## Tools',
119
- 'Tool list:\n <location>/foo/bar.ts</location>',
120
- '**Tool escalation:**',
121
- '1. Step 1.',
122
- '**Scope selection rule:**',
123
- 'Narrow scope always.',
124
- ].join('\n');
125
- const result = stripSysprompt(combined, { forceEnabled: true });
126
- expect(result.content.length).toBeLessThan(combined.length);
127
- expect(result.changed).toBe(true);
128
- });
129
- it('returns unchanged=false when nothing to strip', () => {
130
- const clean = 'This is a clean system prompt with no strippable content.';
131
- const result = stripSysprompt(clean, { forceEnabled: true });
132
- expect(result.content).toBe(clean);
133
- expect(result.changed).toBe(false);
134
- expect(result.aggressiveStripped).toBe(false);
135
- });
136
- });
137
- // ── Re-export check via src/lib/index.ts ─────────────────────────────────
138
- describe('lib index re-export', () => {
139
- it('isStripEnabled and stripSysprompt are accessible from src/lib barrel', async () => {
140
- const lib = await import('../src/lib/index.js');
141
- expect(typeof lib.isStripEnabled).toBe('function');
142
- expect(typeof lib.stripSysprompt).toBe('function');
143
- });
144
- });
145
- //# sourceMappingURL=lib-sysprompt-strip.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lib-sysprompt-strip.test.js","sourceRoot":"","sources":["../../tests/lib-sysprompt-strip.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=listener-activation.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"listener-activation.test.d.ts","sourceRoot":"","sources":["../../tests/listener-activation.test.ts"],"names":[],"mappings":""}
@@ -1,87 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { register, _resetRegisteredForTests } from '../src/index.js';
3
- const LISTENERS_ENV = 'OPENCLAW_CC_OPENCLAW_LISTENERS';
4
- const TEST_MODE_ENV = 'OPENCLAW_PLUGIN_TEST_MODE';
5
- function makeApi() {
6
- const logger = { info: vi.fn(), warn: vi.fn(), error: vi.fn() };
7
- return {
8
- on: vi.fn(),
9
- registerService: vi.fn(),
10
- logger: logger,
11
- };
12
- }
13
- describe('cc-openclaw listener-activation gate', () => {
14
- const origListenersEnv = process.env[LISTENERS_ENV];
15
- const origTestModeEnv = process.env[TEST_MODE_ENV];
16
- beforeEach(() => {
17
- _resetRegisteredForTests();
18
- delete process.env[LISTENERS_ENV];
19
- process.env[TEST_MODE_ENV] = '1'; // Always run in test mode to avoid eager-bootstrap side effects
20
- });
21
- afterEach(() => {
22
- _resetRegisteredForTests();
23
- if (origListenersEnv !== undefined)
24
- process.env[LISTENERS_ENV] = origListenersEnv;
25
- else
26
- delete process.env[LISTENERS_ENV];
27
- if (origTestModeEnv !== undefined)
28
- process.env[TEST_MODE_ENV] = origTestModeEnv;
29
- else
30
- delete process.env[TEST_MODE_ENV];
31
- });
32
- it('default (env unset): top-level register logs passive load and does NOT wire api.on()', () => {
33
- const api = makeApi();
34
- register(api);
35
- expect(api.on).not.toHaveBeenCalled();
36
- expect(api.registerService).not.toHaveBeenCalled();
37
- const passiveLog = api.logger.info.mock.calls.find((args) => typeof args[0] === 'string' && args[0].includes('passive load'));
38
- expect(passiveLog).toBeDefined();
39
- });
40
- it("env='0' (explicit off): same passive behavior as default", () => {
41
- process.env[LISTENERS_ENV] = '0';
42
- const api = makeApi();
43
- register(api);
44
- expect(api.on).not.toHaveBeenCalled();
45
- });
46
- it("env='1': wires sub-modules (api.on or registerService called)", () => {
47
- process.env[LISTENERS_ENV] = '1';
48
- const api = makeApi();
49
- register(api);
50
- // At minimum, registerService should have been called (cwd-patch wires services)
51
- // OR api.on should have been called (sub-modules wire listeners)
52
- const totalWires = api.on.mock.calls.length
53
- + api.registerService.mock.calls.length;
54
- expect(totalWires).toBeGreaterThan(0);
55
- });
56
- it("env='true' (case-insensitive): activates listeners", () => {
57
- process.env[LISTENERS_ENV] = 'TRUE';
58
- const api = makeApi();
59
- register(api);
60
- const totalWires = api.on.mock.calls.length
61
- + api.registerService.mock.calls.length;
62
- expect(totalWires).toBeGreaterThan(0);
63
- });
64
- it("env='on': activates listeners", () => {
65
- process.env[LISTENERS_ENV] = 'on';
66
- const api = makeApi();
67
- register(api);
68
- const totalWires = api.on.mock.calls.length
69
- + api.registerService.mock.calls.length;
70
- expect(totalWires).toBeGreaterThan(0);
71
- });
72
- it("non-truthy values (e.g. 'off', 'no', 'random'): stay passive", () => {
73
- for (const v of ['off', 'no', 'random', 'false']) {
74
- _resetRegisteredForTests();
75
- process.env[LISTENERS_ENV] = v;
76
- const api = makeApi();
77
- register(api);
78
- expect(api.on, `value=${v}`).not.toHaveBeenCalled();
79
- }
80
- });
81
- it('passive mode: PLUGIN_ID + VERSION still exported (passive ≠ unloaded)', async () => {
82
- const { PLUGIN_ID, VERSION } = await import('../src/index.js');
83
- expect(PLUGIN_ID).toBe('cc-openclaw');
84
- expect(VERSION).toBe('0.1.0');
85
- });
86
- });
87
- //# sourceMappingURL=listener-activation.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"listener-activation.test.js","sourceRoot":"","sources":["../../tests/listener-activation.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mcp-bridge.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-bridge.test.d.ts","sourceRoot":"","sources":["../../tests/mcp-bridge.test.ts"],"names":[],"mappings":""}
@@ -1,137 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { McpBridge, register } from '../src/mcp/index.js';
3
- import { defaultRegisterGuard } from '../src/lib/register-guard.js';
4
- beforeEach(() => {
5
- defaultRegisterGuard._resetForTests();
6
- });
7
- describe('McpBridge', () => {
8
- it('constructs without crashing', () => {
9
- const b = new McpBridge();
10
- expect(b.isRunning()).toBe(false);
11
- });
12
- it('isRunning() reports false before start', () => {
13
- expect(new McpBridge().isRunning()).toBe(false);
14
- });
15
- it('isRunning() is false before any start()', () => {
16
- const bridge = new McpBridge();
17
- expect(bridge.isRunning()).toBe(false);
18
- });
19
- it('stop() resolves immediately when bridge is not running', async () => {
20
- const bridge = new McpBridge();
21
- await expect(bridge.stop()).resolves.toBeUndefined();
22
- expect(bridge.isRunning()).toBe(false);
23
- });
24
- it('isRunning() stays false after stop() when never started', async () => {
25
- const bridge = new McpBridge();
26
- await bridge.stop();
27
- expect(bridge.isRunning()).toBe(false);
28
- });
29
- });
30
- describe('register()', () => {
31
- it('does NOT wire any OpenClaw event hooks (sidecar lifecycle owned by Claude Code MCP client)', () => {
32
- const on = vi.fn();
33
- const api = { on };
34
- register(api);
35
- expect(on).not.toHaveBeenCalled();
36
- });
37
- it('returns sidecar metadata { sidecarPath, sidecarExists }', () => {
38
- const on = vi.fn();
39
- const api = { on };
40
- const result = register(api);
41
- expect(result).toHaveProperty('sidecarPath');
42
- expect(result).toHaveProperty('sidecarExists');
43
- expect(typeof result.sidecarPath).toBe('string');
44
- expect(typeof result.sidecarExists).toBe('boolean');
45
- });
46
- it('is idempotent — second call with same api is a no-op', () => {
47
- const log = vi.fn();
48
- const api = { on: vi.fn(), logger: { info: log, error: log } };
49
- register(api);
50
- const firstCallCount = log.mock.calls.length;
51
- register(api);
52
- expect(log.mock.calls.length).toBe(firstCallCount);
53
- });
54
- it('logs sidecar presence (info) when the .cjs file exists', () => {
55
- const info = vi.fn();
56
- const error = vi.fn();
57
- const api = { on: vi.fn(), logger: { info, error } };
58
- const result = register(api);
59
- if (result.sidecarExists) {
60
- expect(info).toHaveBeenCalledWith(expect.stringMatching(/sidecar present at/));
61
- expect(error).not.toHaveBeenCalled();
62
- }
63
- else {
64
- expect(error).toHaveBeenCalledWith(expect.stringMatching(/sidecar MISSING/));
65
- }
66
- });
67
- it('re-registration with new api object re-fires the validator', () => {
68
- const info1 = vi.fn();
69
- const api1 = { on: vi.fn(), logger: { info: info1, error: vi.fn() } };
70
- register(api1);
71
- const beforeSecond = info1.mock.calls.length;
72
- const info2 = vi.fn();
73
- const api2 = { on: vi.fn(), logger: { info: info2, error: vi.fn() } };
74
- register(api2);
75
- expect(info2.mock.calls.length).toBeGreaterThanOrEqual(0); // depends on sidecar presence
76
- expect(info1.mock.calls.length).toBe(beforeSecond); // first api logger untouched by second call
77
- });
78
- });
79
- describe('McpBridge stop() with SIGKILL fallback', () => {
80
- it('stop() SIGTERM path: resolves when exit event fires', async () => {
81
- let exitCallback = null;
82
- const fakeChild = {
83
- stderr: { on: vi.fn() },
84
- on: vi.fn((event, cb) => {
85
- if (event === 'exit')
86
- exitCallback = cb;
87
- }),
88
- once: vi.fn((event, cb) => {
89
- if (event === 'exit')
90
- exitCallback = cb;
91
- }),
92
- kill: vi.fn((_signal) => {
93
- if (exitCallback)
94
- exitCallback();
95
- }),
96
- pid: 99999,
97
- };
98
- const bridge = new McpBridge();
99
- bridge.child = fakeChild;
100
- expect(bridge.isRunning()).toBe(true);
101
- await expect(bridge.stop()).resolves.toBeUndefined();
102
- expect(fakeChild.kill).toHaveBeenCalledWith('SIGTERM');
103
- });
104
- it('stop() SIGKILL fallback: sends SIGKILL after 3s if process does not exit', async () => {
105
- vi.useFakeTimers();
106
- const fakeChild = {
107
- stderr: { on: vi.fn() },
108
- on: vi.fn(),
109
- once: vi.fn((_event, _cb) => {
110
- // Never fires exit — simulates hung process
111
- }),
112
- kill: vi.fn(),
113
- pid: 11111,
114
- };
115
- const bridge = new McpBridge();
116
- bridge.child = fakeChild;
117
- bridge.stop();
118
- vi.advanceTimersByTime(3100);
119
- expect(fakeChild.kill).toHaveBeenCalledWith('SIGKILL');
120
- vi.useRealTimers();
121
- });
122
- it('start() is idempotent — second call when child exists is a no-op', () => {
123
- const fakeChild = {
124
- stderr: { on: vi.fn() },
125
- on: vi.fn(),
126
- once: vi.fn(),
127
- kill: vi.fn(),
128
- pid: 22222,
129
- };
130
- const bridge = new McpBridge();
131
- bridge.child = fakeChild;
132
- expect(bridge.isRunning()).toBe(true);
133
- bridge.start();
134
- expect(bridge.child).toBe(fakeChild);
135
- });
136
- });
137
- //# sourceMappingURL=mcp-bridge.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-bridge.test.js","sourceRoot":"","sources":["../../tests/mcp-bridge.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=openai-compat.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-compat.test.d.ts","sourceRoot":"","sources":["../../tests/openai-compat.test.ts"],"names":[],"mappings":""}
@@ -1,8 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import * as openaiCompat from '../src/openai-compat/index.js';
3
- describe('openai-compat barrel', () => {
4
- it('imports without crashing', () => {
5
- expect(openaiCompat).toBeDefined();
6
- });
7
- });
8
- //# sourceMappingURL=openai-compat.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-compat.test.js","sourceRoot":"","sources":["../../tests/openai-compat.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAC;AAE9D,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,15 +0,0 @@
1
- /**
2
- * task-018 — proxy/handler heartbeat-workaround SDK-layer wiring.
3
- *
4
- * Verifies that `createProxyHandler()` applies `applyHeartbeatWorkaround()`
5
- * to the request payload BEFORE forwarding upstream, so heartbeat-shaped
6
- * requests get routed to haiku instead of the user's primary (opus) model.
7
- *
8
- * The unit-level coverage of `applyHeartbeatWorkaround()` itself lives in
9
- * tests/heartbeat-workaround.test.ts (17 tests). This file specifically
10
- * pins down the *integration* — i.e. that the workaround is wired into
11
- * the proxy request flow at the right layer (SDK request layer), not
12
- * accidentally bypassed.
13
- */
14
- export {};
15
- //# sourceMappingURL=proxy-heartbeat-integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy-heartbeat-integration.test.d.ts","sourceRoot":"","sources":["../../tests/proxy-heartbeat-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -1,122 +0,0 @@
1
- /**
2
- * task-018 — proxy/handler heartbeat-workaround SDK-layer wiring.
3
- *
4
- * Verifies that `createProxyHandler()` applies `applyHeartbeatWorkaround()`
5
- * to the request payload BEFORE forwarding upstream, so heartbeat-shaped
6
- * requests get routed to haiku instead of the user's primary (opus) model.
7
- *
8
- * The unit-level coverage of `applyHeartbeatWorkaround()` itself lives in
9
- * tests/heartbeat-workaround.test.ts (17 tests). This file specifically
10
- * pins down the *integration* — i.e. that the workaround is wired into
11
- * the proxy request flow at the right layer (SDK request layer), not
12
- * accidentally bypassed.
13
- */
14
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
15
- import { createProxyHandler } from '../src/proxy/handler.js';
16
- function makeRes() {
17
- const res = {};
18
- res.status = vi.fn().mockReturnValue(res);
19
- res.json = vi.fn().mockReturnValue(res);
20
- res.setHeader = vi.fn();
21
- res.write = vi.fn();
22
- res.end = vi.fn();
23
- res.flushHeaders = vi.fn();
24
- return res;
25
- }
26
- describe('proxy/handler — heartbeat workaround integration (task-018)', () => {
27
- const origDisableEnv = process.env.CC_OPENCLAW_DISABLE_HEARTBEAT_WORKAROUND;
28
- const origFetch = globalThis.fetch;
29
- beforeEach(() => {
30
- delete process.env.CC_OPENCLAW_DISABLE_HEARTBEAT_WORKAROUND;
31
- });
32
- afterEach(() => {
33
- globalThis.fetch = origFetch;
34
- if (origDisableEnv === undefined) {
35
- delete process.env.CC_OPENCLAW_DISABLE_HEARTBEAT_WORKAROUND;
36
- }
37
- else {
38
- process.env.CC_OPENCLAW_DISABLE_HEARTBEAT_WORKAROUND = origDisableEnv;
39
- }
40
- });
41
- it('swaps heartbeat-shaped opus requests to haiku before forwarding to Anthropic', async () => {
42
- const captured = [];
43
- globalThis.fetch = vi.fn(async (_url, init) => {
44
- captured.push(JSON.parse(String(init?.body)));
45
- return new Response(JSON.stringify({ id: 'msg_x', type: 'message', role: 'assistant', content: [], model: 'claude-haiku-4-5' }), { status: 200, headers: { 'content-type': 'application/json' } });
46
- });
47
- const handler = createProxyHandler(undefined, { anthropicApiKey: 'test-key' });
48
- const req = {
49
- method: 'POST',
50
- url: '/v1/messages',
51
- headers: {},
52
- json: async () => ({
53
- model: 'claude-opus-4-7',
54
- messages: [{ role: 'user', content: '__heartbeat__' }],
55
- max_tokens: 64,
56
- }),
57
- };
58
- await handler(req, makeRes());
59
- expect(captured).toHaveLength(1);
60
- expect(captured[0].model).toBe('claude-haiku-4-5');
61
- });
62
- it('uses the explicit heartbeat.model when provided (top-level)', async () => {
63
- const captured = [];
64
- globalThis.fetch = vi.fn(async (_url, init) => {
65
- captured.push(JSON.parse(String(init?.body)));
66
- return new Response(JSON.stringify({ id: 'm', content: [], model: 'claude-haiku-4-5' }), { status: 200 });
67
- });
68
- const handler = createProxyHandler(undefined, { anthropicApiKey: 'test-key' });
69
- const req = {
70
- method: 'POST',
71
- url: '/v1/messages',
72
- headers: {},
73
- json: async () => ({
74
- model: 'claude-opus-4-7',
75
- heartbeat: { model: 'claude-haiku-4-5' },
76
- messages: [{ role: 'user', content: 'ping' }],
77
- }),
78
- };
79
- await handler(req, makeRes());
80
- expect(captured[0].model).toBe('claude-haiku-4-5');
81
- });
82
- it('does NOT swap when CC_OPENCLAW_DISABLE_HEARTBEAT_WORKAROUND=1 — kill switch honored', async () => {
83
- process.env.CC_OPENCLAW_DISABLE_HEARTBEAT_WORKAROUND = '1';
84
- const captured = [];
85
- globalThis.fetch = vi.fn(async (_url, init) => {
86
- captured.push(JSON.parse(String(init?.body)));
87
- return new Response(JSON.stringify({ id: 'm', content: [], model: 'claude-opus-4-7' }), { status: 200 });
88
- });
89
- const handler = createProxyHandler(undefined, { anthropicApiKey: 'test-key' });
90
- const req = {
91
- method: 'POST',
92
- url: '/v1/messages',
93
- headers: {},
94
- json: async () => ({
95
- model: 'claude-opus-4-7',
96
- messages: [{ role: 'user', content: '__heartbeat__' }],
97
- }),
98
- };
99
- await handler(req, makeRes());
100
- expect(captured[0].model).toBe('claude-opus-4-7');
101
- });
102
- it('leaves non-heartbeat requests untouched', async () => {
103
- const captured = [];
104
- globalThis.fetch = vi.fn(async (_url, init) => {
105
- captured.push(JSON.parse(String(init?.body)));
106
- return new Response(JSON.stringify({ id: 'm', content: [], model: 'claude-opus-4-7' }), { status: 200 });
107
- });
108
- const handler = createProxyHandler(undefined, { anthropicApiKey: 'test-key' });
109
- const req = {
110
- method: 'POST',
111
- url: '/v1/messages',
112
- headers: {},
113
- json: async () => ({
114
- model: 'claude-opus-4-7',
115
- messages: [{ role: 'user', content: 'Hello, write me a poem' }],
116
- }),
117
- };
118
- await handler(req, makeRes());
119
- expect(captured[0].model).toBe('claude-opus-4-7');
120
- });
121
- });
122
- //# sourceMappingURL=proxy-heartbeat-integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy-heartbeat-integration.test.js","sourceRoot":"","sources":["../../tests/proxy-heartbeat-integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=proxy.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy.test.d.ts","sourceRoot":"","sources":["../../tests/proxy.test.ts"],"names":[],"mappings":""}
@@ -1,8 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import * as proxy from '../src/proxy/index.js';
3
- describe('proxy barrel', () => {
4
- it('imports without crashing', () => {
5
- expect(proxy).toBeDefined();
6
- });
7
- });
8
- //# sourceMappingURL=proxy.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy.test.js","sourceRoot":"","sources":["../../tests/proxy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAC/C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=register-guard-stacking.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"register-guard-stacking.test.d.ts","sourceRoot":"","sources":["../../tests/register-guard-stacking.test.ts"],"names":[],"mappings":""}