@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.
- package/dist/src/channels/telegram/card-renderer.d.ts +63 -0
- package/dist/src/channels/telegram/card-renderer.js +149 -0
- package/dist/src/channels/telegram/card-renderer.js.map +1 -0
- package/dist/src/channels/telegram/insight-formatter.d.ts +36 -0
- package/dist/src/channels/telegram/insight-formatter.js +36 -0
- package/dist/src/channels/telegram/insight-formatter.js.map +1 -0
- package/dist/src/channels/telegram/live-card.d.ts +7 -90
- package/dist/src/channels/telegram/live-card.js +22 -265
- package/dist/src/channels/telegram/live-card.js.map +1 -1
- package/dist/src/channels/telegram/logger.d.ts +10 -0
- package/dist/src/channels/telegram/logger.js +13 -0
- package/dist/src/channels/telegram/logger.js.map +1 -0
- package/dist/src/channels/telegram/throttle-controller.d.ts +54 -0
- package/dist/src/channels/telegram/throttle-controller.js +132 -0
- package/dist/src/channels/telegram/throttle-controller.js.map +1 -0
- package/dist/src/channels/telegram/tool-tracker.js +3 -14
- package/dist/src/channels/telegram/tool-tracker.js.map +1 -1
- package/dist/src/cli/doctor.d.ts +24 -0
- package/dist/src/cli/doctor.js +194 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/index.d.ts +8 -0
- package/dist/src/cli/index.js +39 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/command-router/cc-handler.js +35 -709
- package/dist/src/command-router/cc-handler.js.map +1 -1
- package/dist/src/command-router/launch-policy.d.ts +93 -0
- package/dist/src/command-router/launch-policy.js +323 -0
- package/dist/src/command-router/launch-policy.js.map +1 -0
- package/dist/src/command-router/resume-policy.d.ts +18 -0
- package/dist/src/command-router/resume-policy.js +236 -0
- package/dist/src/command-router/resume-policy.js.map +1 -0
- package/dist/src/command-router/turn-formatter.d.ts +19 -0
- package/dist/src/command-router/turn-formatter.js +144 -0
- package/dist/src/command-router/turn-formatter.js.map +1 -0
- package/dist/src/openai-compat/bridges/allowlist.d.ts +10 -0
- package/dist/src/openai-compat/bridges/allowlist.js +17 -0
- package/dist/src/openai-compat/bridges/allowlist.js.map +1 -0
- package/dist/src/openai-compat/bridges/factory.d.ts +30 -0
- package/dist/src/openai-compat/bridges/factory.js +84 -0
- package/dist/src/openai-compat/bridges/factory.js.map +1 -0
- package/dist/src/openai-compat/bridges/media-bridge.d.ts +34 -0
- package/dist/src/openai-compat/bridges/media-bridge.js +20 -0
- package/dist/src/openai-compat/bridges/media-bridge.js.map +1 -0
- package/dist/src/openai-compat/bridges/openclaw-native-tools.d.ts +61 -0
- package/dist/src/openai-compat/bridges/openclaw-native-tools.js +171 -0
- package/dist/src/openai-compat/bridges/openclaw-native-tools.js.map +1 -0
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.d.ts +26 -0
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.js +38 -0
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.js.map +1 -0
- package/dist/src/openai-compat/bridges/tts-media-bridge.d.ts +19 -0
- package/dist/src/openai-compat/bridges/tts-media-bridge.js +59 -0
- package/dist/src/openai-compat/bridges/tts-media-bridge.js.map +1 -0
- package/dist/src/openai-compat/openai-compat.js.map +1 -1
- package/dist/src/types/tool-bridge.d.ts +2 -1
- package/dist/src/types/tool-bridge.js +1 -0
- package/dist/src/types/tool-bridge.js.map +1 -1
- package/package.json +1 -1
- package/dist/scripts/bench/ab-harness.d.ts +0 -58
- package/dist/scripts/bench/ab-harness.d.ts.map +0 -1
- package/dist/scripts/bench/ab-harness.js +0 -78
- package/dist/scripts/bench/ab-harness.js.map +0 -1
- package/dist/src/channels/adapter.d.ts.map +0 -1
- package/dist/src/channels/telegram/completion-summary.d.ts.map +0 -1
- package/dist/src/channels/telegram/error-renderer.d.ts.map +0 -1
- package/dist/src/channels/telegram/event-reducer.d.ts.map +0 -1
- package/dist/src/channels/telegram/index.d.ts.map +0 -1
- package/dist/src/channels/telegram/injector.d.ts.map +0 -1
- package/dist/src/channels/telegram/live-card.d.ts.map +0 -1
- package/dist/src/channels/telegram/state-machine.d.ts.map +0 -1
- package/dist/src/channels/telegram/tool-tracker.d.ts.map +0 -1
- package/dist/src/command-router/cc-handler.d.ts.map +0 -1
- package/dist/src/command-router/index.d.ts.map +0 -1
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/council/consensus.d.ts.map +0 -1
- package/dist/src/council/council.d.ts.map +0 -1
- package/dist/src/council/index.d.ts.map +0 -1
- package/dist/src/engines/base-oneshot-session.d.ts.map +0 -1
- package/dist/src/engines/index.d.ts.map +0 -1
- package/dist/src/engines/persistent-codex-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-cursor-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-custom-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-gemini-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-session.d.ts.map +0 -1
- package/dist/src/health/handler.d.ts.map +0 -1
- package/dist/src/health/index.d.ts.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/lib/auto-recovery.d.ts.map +0 -1
- package/dist/src/lib/cache-parity.d.ts.map +0 -1
- package/dist/src/lib/circuit-breaker.d.ts.map +0 -1
- package/dist/src/lib/config.d.ts.map +0 -1
- package/dist/src/lib/drift-detector.d.ts.map +0 -1
- package/dist/src/lib/error-formatter.d.ts.map +0 -1
- package/dist/src/lib/heartbeat-workaround.d.ts.map +0 -1
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/register-guard.d.ts.map +0 -1
- package/dist/src/lib/route-flag.d.ts +0 -49
- package/dist/src/lib/route-flag.d.ts.map +0 -1
- package/dist/src/lib/route-flag.js +0 -52
- package/dist/src/lib/route-flag.js.map +0 -1
- package/dist/src/lib/sysprompt-strip.d.ts.map +0 -1
- package/dist/src/lib/telemetry.d.ts.map +0 -1
- package/dist/src/lib/test-mode.d.ts.map +0 -1
- package/dist/src/lib/vendor-paths.d.ts.map +0 -1
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/mcp/bridge.d.ts.map +0 -1
- package/dist/src/mcp/index.d.ts.map +0 -1
- package/dist/src/models.d.ts.map +0 -1
- package/dist/src/openai-compat/cli-stream-parser.d.ts.map +0 -1
- package/dist/src/openai-compat/index.d.ts.map +0 -1
- package/dist/src/openai-compat/openai-compat.d.ts.map +0 -1
- package/dist/src/openai-compat/skill-resolver.d.ts.map +0 -1
- package/dist/src/openai-compat/sse-translator.d.ts.map +0 -1
- package/dist/src/proxy/anthropic-adapter.d.ts.map +0 -1
- package/dist/src/proxy/handler.d.ts.map +0 -1
- package/dist/src/proxy/index.d.ts.map +0 -1
- package/dist/src/proxy/schema-cleaner.d.ts.map +0 -1
- package/dist/src/proxy/thought-cache.d.ts.map +0 -1
- package/dist/src/session/embedded-server.d.ts.map +0 -1
- package/dist/src/session/inbox-manager.d.ts.map +0 -1
- package/dist/src/session/index.d.ts.map +0 -1
- package/dist/src/session/session-manager.d.ts.map +0 -1
- package/dist/src/session-bootstrap/cwd-patch.d.ts.map +0 -1
- package/dist/src/session-bootstrap/index.d.ts.map +0 -1
- package/dist/src/session-bootstrap/sysprompt-strip.d.ts.map +0 -1
- package/dist/src/session-bootstrap/think-conflict-resolver.d.ts.map +0 -1
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/validation.d.ts.map +0 -1
- package/dist/tests/_helpers/subprocess-mock.d.ts +0 -35
- package/dist/tests/_helpers/subprocess-mock.d.ts.map +0 -1
- package/dist/tests/_helpers/subprocess-mock.js +0 -136
- package/dist/tests/_helpers/subprocess-mock.js.map +0 -1
- package/dist/tests/auto-recovery.test.d.ts +0 -2
- package/dist/tests/auto-recovery.test.d.ts.map +0 -1
- package/dist/tests/auto-recovery.test.js +0 -185
- package/dist/tests/auto-recovery.test.js.map +0 -1
- package/dist/tests/bench-harness.test.d.ts +0 -2
- package/dist/tests/bench-harness.test.d.ts.map +0 -1
- package/dist/tests/bench-harness.test.js +0 -21
- package/dist/tests/bench-harness.test.js.map +0 -1
- package/dist/tests/cache-parity.test.d.ts +0 -2
- package/dist/tests/cache-parity.test.d.ts.map +0 -1
- package/dist/tests/cache-parity.test.js +0 -401
- package/dist/tests/cache-parity.test.js.map +0 -1
- package/dist/tests/command-router.test.d.ts +0 -2
- package/dist/tests/command-router.test.d.ts.map +0 -1
- package/dist/tests/command-router.test.js +0 -60
- package/dist/tests/command-router.test.js.map +0 -1
- package/dist/tests/council.test.d.ts +0 -2
- package/dist/tests/council.test.d.ts.map +0 -1
- package/dist/tests/council.test.js +0 -20
- package/dist/tests/council.test.js.map +0 -1
- package/dist/tests/drift-detector.test.d.ts +0 -2
- package/dist/tests/drift-detector.test.d.ts.map +0 -1
- package/dist/tests/drift-detector.test.js +0 -268
- package/dist/tests/drift-detector.test.js.map +0 -1
- package/dist/tests/eager-bootstrap-gating.test.d.ts +0 -9
- package/dist/tests/eager-bootstrap-gating.test.d.ts.map +0 -1
- package/dist/tests/eager-bootstrap-gating.test.js +0 -97
- package/dist/tests/eager-bootstrap-gating.test.js.map +0 -1
- package/dist/tests/engines.test.d.ts +0 -2
- package/dist/tests/engines.test.d.ts.map +0 -1
- package/dist/tests/engines.test.js +0 -8
- package/dist/tests/engines.test.js.map +0 -1
- package/dist/tests/error-formatter.test.d.ts +0 -2
- package/dist/tests/error-formatter.test.d.ts.map +0 -1
- package/dist/tests/error-formatter.test.js +0 -220
- package/dist/tests/error-formatter.test.js.map +0 -1
- package/dist/tests/health.test.d.ts +0 -2
- package/dist/tests/health.test.d.ts.map +0 -1
- package/dist/tests/health.test.js +0 -110
- package/dist/tests/health.test.js.map +0 -1
- package/dist/tests/heartbeat-workaround.test.d.ts +0 -2
- package/dist/tests/heartbeat-workaround.test.d.ts.map +0 -1
- package/dist/tests/heartbeat-workaround.test.js +0 -90
- package/dist/tests/heartbeat-workaround.test.js.map +0 -1
- package/dist/tests/index.test.d.ts +0 -2
- package/dist/tests/index.test.d.ts.map +0 -1
- package/dist/tests/index.test.js +0 -7
- package/dist/tests/index.test.js.map +0 -1
- package/dist/tests/lib-sysprompt-strip.test.d.ts +0 -2
- package/dist/tests/lib-sysprompt-strip.test.d.ts.map +0 -1
- package/dist/tests/lib-sysprompt-strip.test.js +0 -145
- package/dist/tests/lib-sysprompt-strip.test.js.map +0 -1
- package/dist/tests/listener-activation.test.d.ts +0 -2
- package/dist/tests/listener-activation.test.d.ts.map +0 -1
- package/dist/tests/listener-activation.test.js +0 -87
- package/dist/tests/listener-activation.test.js.map +0 -1
- package/dist/tests/mcp-bridge.test.d.ts +0 -2
- package/dist/tests/mcp-bridge.test.d.ts.map +0 -1
- package/dist/tests/mcp-bridge.test.js +0 -137
- package/dist/tests/mcp-bridge.test.js.map +0 -1
- package/dist/tests/openai-compat.test.d.ts +0 -2
- package/dist/tests/openai-compat.test.d.ts.map +0 -1
- package/dist/tests/openai-compat.test.js +0 -8
- package/dist/tests/openai-compat.test.js.map +0 -1
- package/dist/tests/proxy-heartbeat-integration.test.d.ts +0 -15
- package/dist/tests/proxy-heartbeat-integration.test.d.ts.map +0 -1
- package/dist/tests/proxy-heartbeat-integration.test.js +0 -122
- package/dist/tests/proxy-heartbeat-integration.test.js.map +0 -1
- package/dist/tests/proxy.test.d.ts +0 -2
- package/dist/tests/proxy.test.d.ts.map +0 -1
- package/dist/tests/proxy.test.js +0 -8
- package/dist/tests/proxy.test.js.map +0 -1
- package/dist/tests/register-guard-stacking.test.d.ts +0 -2
- package/dist/tests/register-guard-stacking.test.d.ts.map +0 -1
- package/dist/tests/register-guard-stacking.test.js +0 -61
- package/dist/tests/register-guard-stacking.test.js.map +0 -1
- package/dist/tests/register-guard.test.d.ts +0 -2
- package/dist/tests/register-guard.test.d.ts.map +0 -1
- package/dist/tests/register-guard.test.js +0 -129
- package/dist/tests/register-guard.test.js.map +0 -1
- package/dist/tests/route-flag-rollback.test.d.ts +0 -2
- package/dist/tests/route-flag-rollback.test.d.ts.map +0 -1
- package/dist/tests/route-flag-rollback.test.js +0 -70
- package/dist/tests/route-flag-rollback.test.js.map +0 -1
- package/dist/tests/route-flag.test.d.ts +0 -2
- package/dist/tests/route-flag.test.d.ts.map +0 -1
- package/dist/tests/route-flag.test.js +0 -101
- package/dist/tests/route-flag.test.js.map +0 -1
- package/dist/tests/session-bootstrap.test.d.ts +0 -2
- package/dist/tests/session-bootstrap.test.d.ts.map +0 -1
- package/dist/tests/session-bootstrap.test.js +0 -183
- package/dist/tests/session-bootstrap.test.js.map +0 -1
- package/dist/tests/session.test.d.ts +0 -2
- package/dist/tests/session.test.d.ts.map +0 -1
- package/dist/tests/session.test.js +0 -17
- package/dist/tests/session.test.js.map +0 -1
- package/dist/tests/state-machine.test.d.ts +0 -2
- package/dist/tests/state-machine.test.d.ts.map +0 -1
- package/dist/tests/state-machine.test.js +0 -133
- package/dist/tests/state-machine.test.js.map +0 -1
- package/dist/tests/streaming/cli-stream-parser.test.d.ts +0 -2
- package/dist/tests/streaming/cli-stream-parser.test.d.ts.map +0 -1
- package/dist/tests/streaming/cli-stream-parser.test.js +0 -233
- package/dist/tests/streaming/cli-stream-parser.test.js.map +0 -1
- package/dist/tests/streaming/feature-flag.test.d.ts +0 -14
- package/dist/tests/streaming/feature-flag.test.d.ts.map +0 -1
- package/dist/tests/streaming/feature-flag.test.js +0 -163
- package/dist/tests/streaming/feature-flag.test.js.map +0 -1
- package/dist/tests/streaming/no-tools-prompt.test.d.ts +0 -17
- package/dist/tests/streaming/no-tools-prompt.test.d.ts.map +0 -1
- package/dist/tests/streaming/no-tools-prompt.test.js +0 -229
- package/dist/tests/streaming/no-tools-prompt.test.js.map +0 -1
- package/dist/tests/streaming/skill-plus-tools.test.d.ts +0 -14
- package/dist/tests/streaming/skill-plus-tools.test.d.ts.map +0 -1
- package/dist/tests/streaming/skill-plus-tools.test.js +0 -234
- package/dist/tests/streaming/skill-plus-tools.test.js.map +0 -1
- package/dist/tests/streaming/sse-translator.test.d.ts +0 -2
- package/dist/tests/streaming/sse-translator.test.d.ts.map +0 -1
- package/dist/tests/streaming/sse-translator.test.js +0 -227
- package/dist/tests/streaming/sse-translator.test.js.map +0 -1
- package/dist/tests/streaming/tool-result-roundtrip.test.d.ts +0 -11
- package/dist/tests/streaming/tool-result-roundtrip.test.d.ts.map +0 -1
- package/dist/tests/streaming/tool-result-roundtrip.test.js +0 -215
- package/dist/tests/streaming/tool-result-roundtrip.test.js.map +0 -1
- package/dist/tests/streaming/tool-use-translation.test.d.ts +0 -10
- package/dist/tests/streaming/tool-use-translation.test.d.ts.map +0 -1
- package/dist/tests/streaming/tool-use-translation.test.js +0 -251
- package/dist/tests/streaming/tool-use-translation.test.js.map +0 -1
- package/dist/tests/telegram-bridge.test.d.ts +0 -2
- package/dist/tests/telegram-bridge.test.d.ts.map +0 -1
- package/dist/tests/telegram-bridge.test.js +0 -17
- package/dist/tests/telegram-bridge.test.js.map +0 -1
- package/dist/tests/telegram-injector.test.d.ts +0 -2
- package/dist/tests/telegram-injector.test.d.ts.map +0 -1
- package/dist/tests/telegram-injector.test.js +0 -74
- package/dist/tests/telegram-injector.test.js.map +0 -1
- package/dist/tests/telemetry.test.d.ts +0 -2
- package/dist/tests/telemetry.test.d.ts.map +0 -1
- package/dist/tests/telemetry.test.js +0 -405
- package/dist/tests/telemetry.test.js.map +0 -1
- package/dist/tests/test-mode.test.d.ts +0 -2
- package/dist/tests/test-mode.test.d.ts.map +0 -1
- package/dist/tests/test-mode.test.js +0 -39
- package/dist/tests/test-mode.test.js.map +0 -1
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
// phase: 4 | pillar: 2 | agent: P2.B
|
|
2
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
3
|
-
import { writeFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { captureVersionSlot, checkDrift, startDriftPolling, stopDriftPolling, _resetDriftAlertForTests, _isDriftPollingActive, } from '../src/lib/drift-detector.js';
|
|
6
|
-
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
7
|
-
const STATE_PATH = join(process.env.HOME || '/tmp', '.openclaw', 'state', 'cc-openclaw-version-state.json');
|
|
8
|
-
const DRIFT_JSONL = join(process.env.HOME || '/tmp', '.openclaw', 'workspace', 'memory', 'cc-openclaw-drift.jsonl');
|
|
9
|
-
function readStateFile() {
|
|
10
|
-
if (!existsSync(STATE_PATH))
|
|
11
|
-
return {};
|
|
12
|
-
return JSON.parse(readFileSync(STATE_PATH, 'utf8'));
|
|
13
|
-
}
|
|
14
|
-
function writeStateFile(state) {
|
|
15
|
-
const dir = STATE_PATH.split('/').slice(0, -1).join('/');
|
|
16
|
-
if (!existsSync(dir))
|
|
17
|
-
mkdirSync(dir, { recursive: true });
|
|
18
|
-
writeFileSync(STATE_PATH, JSON.stringify(state, null, 2) + '\n');
|
|
19
|
-
}
|
|
20
|
-
function getDriftJsonlLines() {
|
|
21
|
-
if (!existsSync(DRIFT_JSONL))
|
|
22
|
-
return [];
|
|
23
|
-
return readFileSync(DRIFT_JSONL, 'utf8')
|
|
24
|
-
.trim()
|
|
25
|
-
.split('\n')
|
|
26
|
-
.filter((l) => l.trim())
|
|
27
|
-
.map((l) => JSON.parse(l));
|
|
28
|
-
}
|
|
29
|
-
// ─── captureVersionSlot ───────────────────────────────────────────────────────
|
|
30
|
-
describe('captureVersionSlot', () => {
|
|
31
|
-
it('returns a VersionSlot with required fields', () => {
|
|
32
|
-
const slot = captureVersionSlot();
|
|
33
|
-
expect(slot.laptopId).toBeTruthy();
|
|
34
|
-
expect(typeof slot.ccOpenclawBuildHash).toBe('string');
|
|
35
|
-
expect(typeof slot.openclawBinaryVersion).toBe('string');
|
|
36
|
-
expect(typeof slot.claudeCodeVersion).toBe('string');
|
|
37
|
-
expect(slot.ts).toMatch(/^\d{4}-\d{2}-\d{2}T/);
|
|
38
|
-
});
|
|
39
|
-
it('uses OPENCLAW_LAPTOP_ID env override', () => {
|
|
40
|
-
const orig = process.env.OPENCLAW_LAPTOP_ID;
|
|
41
|
-
process.env.OPENCLAW_LAPTOP_ID = 'test-laptop-override';
|
|
42
|
-
const slot = captureVersionSlot();
|
|
43
|
-
expect(slot.laptopId).toBe('test-laptop-override');
|
|
44
|
-
if (orig === undefined)
|
|
45
|
-
delete process.env.OPENCLAW_LAPTOP_ID;
|
|
46
|
-
else
|
|
47
|
-
process.env.OPENCLAW_LAPTOP_ID = orig;
|
|
48
|
-
});
|
|
49
|
-
it('build hash is 12 hex chars or "unknown"', () => {
|
|
50
|
-
const slot = captureVersionSlot();
|
|
51
|
-
const isHex12 = /^[0-9a-f]{12}$/.test(slot.ccOpenclawBuildHash);
|
|
52
|
-
const isUnknown = slot.ccOpenclawBuildHash === 'unknown';
|
|
53
|
-
expect(isHex12 || isUnknown).toBe(true);
|
|
54
|
-
});
|
|
55
|
-
it('consecutive calls produce same laptopId', () => {
|
|
56
|
-
const a = captureVersionSlot();
|
|
57
|
-
const b = captureVersionSlot();
|
|
58
|
-
expect(a.laptopId).toBe(b.laptopId);
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
// ─── checkDrift — no conflict ─────────────────────────────────────────────────
|
|
62
|
-
describe('checkDrift — no conflict', () => {
|
|
63
|
-
const origLaptopId = process.env.OPENCLAW_LAPTOP_ID;
|
|
64
|
-
beforeEach(() => {
|
|
65
|
-
_resetDriftAlertForTests();
|
|
66
|
-
process.env.OPENCLAW_LAPTOP_ID = `test-own-${Date.now()}`;
|
|
67
|
-
// Ensure state file only has our own slot (or is empty)
|
|
68
|
-
const state = readStateFile();
|
|
69
|
-
const keep = {};
|
|
70
|
-
if (state[process.env.OPENCLAW_LAPTOP_ID]) {
|
|
71
|
-
keep[process.env.OPENCLAW_LAPTOP_ID] = state[process.env.OPENCLAW_LAPTOP_ID];
|
|
72
|
-
}
|
|
73
|
-
writeStateFile(keep);
|
|
74
|
-
});
|
|
75
|
-
afterEach(() => {
|
|
76
|
-
if (origLaptopId === undefined)
|
|
77
|
-
delete process.env.OPENCLAW_LAPTOP_ID;
|
|
78
|
-
else
|
|
79
|
-
process.env.OPENCLAW_LAPTOP_ID = origLaptopId;
|
|
80
|
-
});
|
|
81
|
-
it('returns detected=false when only own slot exists', async () => {
|
|
82
|
-
const report = await checkDrift();
|
|
83
|
-
expect(report.detected).toBe(false);
|
|
84
|
-
expect(report.conflictingSlots).toHaveLength(0);
|
|
85
|
-
});
|
|
86
|
-
it('writes own slot to state file', async () => {
|
|
87
|
-
await checkDrift();
|
|
88
|
-
const state = readStateFile();
|
|
89
|
-
const ownId = process.env.OPENCLAW_LAPTOP_ID;
|
|
90
|
-
expect(state[ownId]).toBeDefined();
|
|
91
|
-
expect(state[ownId].laptopId).toBe(ownId);
|
|
92
|
-
});
|
|
93
|
-
it('does not send Telegram when no drift', async () => {
|
|
94
|
-
// Just verify no throw and no crash
|
|
95
|
-
await expect(checkDrift()).resolves.toBeDefined();
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
// ─── checkDrift — with conflict ───────────────────────────────────────────────
|
|
99
|
-
describe('checkDrift — with conflict', () => {
|
|
100
|
-
const origLaptopId = process.env.OPENCLAW_LAPTOP_ID;
|
|
101
|
-
const origDriftAlerts = process.env.OPENCLAW_CC_OPENCLAW_DRIFT_ALERTS;
|
|
102
|
-
const FAKE_OTHER = 'chaos-test-other-laptop';
|
|
103
|
-
const OWN_ID = `test-own-conflict-${Date.now()}`;
|
|
104
|
-
beforeEach(() => {
|
|
105
|
-
_resetDriftAlertForTests();
|
|
106
|
-
process.env.OPENCLAW_LAPTOP_ID = OWN_ID;
|
|
107
|
-
// Disable Telegram alerts to avoid real sends in tests
|
|
108
|
-
process.env.OPENCLAW_CC_OPENCLAW_DRIFT_ALERTS = '0';
|
|
109
|
-
// Pre-seed state with a conflicting other laptop
|
|
110
|
-
const state = {
|
|
111
|
-
[FAKE_OTHER]: {
|
|
112
|
-
laptopId: FAKE_OTHER,
|
|
113
|
-
ccOpenclawBuildHash: 'deadbeef0001',
|
|
114
|
-
openclawBinaryVersion: '0.0.0-other',
|
|
115
|
-
claudeCodeVersion: '0.0.0-other',
|
|
116
|
-
ts: new Date().toISOString(),
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
writeStateFile(state);
|
|
120
|
-
});
|
|
121
|
-
afterEach(() => {
|
|
122
|
-
if (origLaptopId === undefined)
|
|
123
|
-
delete process.env.OPENCLAW_LAPTOP_ID;
|
|
124
|
-
else
|
|
125
|
-
process.env.OPENCLAW_LAPTOP_ID = origLaptopId;
|
|
126
|
-
if (origDriftAlerts === undefined)
|
|
127
|
-
delete process.env.OPENCLAW_CC_OPENCLAW_DRIFT_ALERTS;
|
|
128
|
-
else
|
|
129
|
-
process.env.OPENCLAW_CC_OPENCLAW_DRIFT_ALERTS = origDriftAlerts;
|
|
130
|
-
// Clean up injected slot
|
|
131
|
-
const state = readStateFile();
|
|
132
|
-
delete state[FAKE_OTHER];
|
|
133
|
-
writeStateFile(state);
|
|
134
|
-
});
|
|
135
|
-
it('returns detected=true when other laptop has different hashes', async () => {
|
|
136
|
-
const report = await checkDrift();
|
|
137
|
-
expect(report.detected).toBe(true);
|
|
138
|
-
expect(report.conflictingSlots.length).toBeGreaterThan(0);
|
|
139
|
-
});
|
|
140
|
-
it('reports the correct conflicting laptopId', async () => {
|
|
141
|
-
const report = await checkDrift();
|
|
142
|
-
const conflict = report.conflictingSlots.find((s) => s.laptopId === FAKE_OTHER);
|
|
143
|
-
expect(conflict).toBeDefined();
|
|
144
|
-
});
|
|
145
|
-
it('reports mismatched fields', async () => {
|
|
146
|
-
const report = await checkDrift();
|
|
147
|
-
const conflict = report.conflictingSlots[0];
|
|
148
|
-
expect(conflict.fields.length).toBeGreaterThan(0);
|
|
149
|
-
// At minimum build hash should differ (ours is real, theirs is deadbeef0001)
|
|
150
|
-
expect(conflict.fields).toContain('openclawBinaryVersion');
|
|
151
|
-
});
|
|
152
|
-
it('ownSlot has correct laptopId', async () => {
|
|
153
|
-
const report = await checkDrift();
|
|
154
|
-
expect(report.ownSlot.laptopId).toBe(OWN_ID);
|
|
155
|
-
});
|
|
156
|
-
it('does not fire Telegram when DRIFT_ALERTS=0', async () => {
|
|
157
|
-
// Should resolve without error; alert suppressed by env flag
|
|
158
|
-
await expect(checkDrift()).resolves.toBeDefined();
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
// ─── checkDrift — same hashes across laptops ──────────────────────────────────
|
|
162
|
-
describe('checkDrift — no drift when hashes match', () => {
|
|
163
|
-
const origLaptopId = process.env.OPENCLAW_LAPTOP_ID;
|
|
164
|
-
const SAME_OTHER = `same-other-${Date.now()}`;
|
|
165
|
-
const OWN_ID = `test-own-same-${Date.now()}`;
|
|
166
|
-
beforeEach(() => {
|
|
167
|
-
_resetDriftAlertForTests();
|
|
168
|
-
process.env.OPENCLAW_LAPTOP_ID = OWN_ID;
|
|
169
|
-
process.env.OPENCLAW_CC_OPENCLAW_DRIFT_ALERTS = '0';
|
|
170
|
-
});
|
|
171
|
-
afterEach(() => {
|
|
172
|
-
if (origLaptopId === undefined)
|
|
173
|
-
delete process.env.OPENCLAW_LAPTOP_ID;
|
|
174
|
-
else
|
|
175
|
-
process.env.OPENCLAW_LAPTOP_ID = origLaptopId;
|
|
176
|
-
delete process.env.OPENCLAW_CC_OPENCLAW_DRIFT_ALERTS;
|
|
177
|
-
const state = readStateFile();
|
|
178
|
-
delete state[SAME_OTHER];
|
|
179
|
-
writeStateFile(state);
|
|
180
|
-
});
|
|
181
|
-
it('no conflict when other laptop has same hashes as own', async () => {
|
|
182
|
-
// First run own check to capture real values
|
|
183
|
-
const ownReport = await checkDrift();
|
|
184
|
-
const own = ownReport.ownSlot;
|
|
185
|
-
// Seed another laptop with identical hashes
|
|
186
|
-
const state = readStateFile();
|
|
187
|
-
state[SAME_OTHER] = {
|
|
188
|
-
laptopId: SAME_OTHER,
|
|
189
|
-
ccOpenclawBuildHash: own.ccOpenclawBuildHash,
|
|
190
|
-
openclawBinaryVersion: own.openclawBinaryVersion,
|
|
191
|
-
claudeCodeVersion: own.claudeCodeVersion,
|
|
192
|
-
ts: new Date().toISOString(),
|
|
193
|
-
};
|
|
194
|
-
writeStateFile(state);
|
|
195
|
-
const report = await checkDrift();
|
|
196
|
-
// No conflict with the same-hash slot
|
|
197
|
-
const conflict = report.conflictingSlots.find((s) => s.laptopId === SAME_OTHER);
|
|
198
|
-
expect(conflict).toBeUndefined();
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
// ─── Dedup window ─────────────────────────────────────────────────────────────
|
|
202
|
-
describe('drift dedup window', () => {
|
|
203
|
-
const origLaptopId = process.env.OPENCLAW_LAPTOP_ID;
|
|
204
|
-
const FAKE_OTHER2 = `chaos-dedup-${Date.now()}`;
|
|
205
|
-
const OWN_ID2 = `test-own-dedup-${Date.now()}`;
|
|
206
|
-
beforeEach(() => {
|
|
207
|
-
_resetDriftAlertForTests();
|
|
208
|
-
process.env.OPENCLAW_LAPTOP_ID = OWN_ID2;
|
|
209
|
-
process.env.OPENCLAW_CC_OPENCLAW_DRIFT_ALERTS = '0'; // suppress actual sends
|
|
210
|
-
const state = {
|
|
211
|
-
[FAKE_OTHER2]: {
|
|
212
|
-
laptopId: FAKE_OTHER2,
|
|
213
|
-
ccOpenclawBuildHash: 'fff000fff000',
|
|
214
|
-
openclawBinaryVersion: 'dedup-test',
|
|
215
|
-
claudeCodeVersion: 'dedup-test',
|
|
216
|
-
ts: new Date().toISOString(),
|
|
217
|
-
},
|
|
218
|
-
};
|
|
219
|
-
writeStateFile(state);
|
|
220
|
-
});
|
|
221
|
-
afterEach(() => {
|
|
222
|
-
if (origLaptopId === undefined)
|
|
223
|
-
delete process.env.OPENCLAW_LAPTOP_ID;
|
|
224
|
-
else
|
|
225
|
-
process.env.OPENCLAW_LAPTOP_ID = origLaptopId;
|
|
226
|
-
delete process.env.OPENCLAW_CC_OPENCLAW_DRIFT_ALERTS;
|
|
227
|
-
const state = readStateFile();
|
|
228
|
-
delete state[FAKE_OTHER2];
|
|
229
|
-
writeStateFile(state);
|
|
230
|
-
});
|
|
231
|
-
it('drift detected on first call after reset', async () => {
|
|
232
|
-
const report = await checkDrift();
|
|
233
|
-
expect(report.detected).toBe(true);
|
|
234
|
-
});
|
|
235
|
-
it('drift still detected on second call (Telegram deduped, but detection still returns true)', async () => {
|
|
236
|
-
await checkDrift();
|
|
237
|
-
const report2 = await checkDrift();
|
|
238
|
-
// Detection is still true — only Telegram send is deduped
|
|
239
|
-
expect(report2.detected).toBe(true);
|
|
240
|
-
});
|
|
241
|
-
});
|
|
242
|
-
// ─── Polling lifecycle ────────────────────────────────────────────────────────
|
|
243
|
-
describe('polling lifecycle', () => {
|
|
244
|
-
afterEach(() => {
|
|
245
|
-
stopDriftPolling();
|
|
246
|
-
});
|
|
247
|
-
it('startDriftPolling activates polling', () => {
|
|
248
|
-
stopDriftPolling(); // ensure clean start
|
|
249
|
-
expect(_isDriftPollingActive()).toBe(false);
|
|
250
|
-
startDriftPolling();
|
|
251
|
-
expect(_isDriftPollingActive()).toBe(true);
|
|
252
|
-
});
|
|
253
|
-
it('stopDriftPolling deactivates polling', () => {
|
|
254
|
-
startDriftPolling();
|
|
255
|
-
stopDriftPolling();
|
|
256
|
-
expect(_isDriftPollingActive()).toBe(false);
|
|
257
|
-
});
|
|
258
|
-
it('calling startDriftPolling twice does not double-register', () => {
|
|
259
|
-
startDriftPolling();
|
|
260
|
-
startDriftPolling(); // idempotent
|
|
261
|
-
expect(_isDriftPollingActive()).toBe(true);
|
|
262
|
-
});
|
|
263
|
-
it('calling stopDriftPolling when not polling is safe', () => {
|
|
264
|
-
stopDriftPolling();
|
|
265
|
-
expect(() => stopDriftPolling()).not.toThrow();
|
|
266
|
-
});
|
|
267
|
-
});
|
|
268
|
-
//# sourceMappingURL=drift-detector.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"drift-detector.test.js","sourceRoot":"","sources":["../../tests/drift-detector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Proves that OPENCLAW_PLUGIN_TEST_MODE=1 skips eager-bootstrap side
|
|
3
|
-
* effects across plugin modules, while preserving api surface calls.
|
|
4
|
-
*
|
|
5
|
-
* Smoke context: A1's 2026-04-27 smoke run showed register() touching
|
|
6
|
-
* live production state. These tests lock down the gate.
|
|
7
|
-
*/
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=eager-bootstrap-gating.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eager-bootstrap-gating.test.d.ts","sourceRoot":"","sources":["../../tests/eager-bootstrap-gating.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Proves that OPENCLAW_PLUGIN_TEST_MODE=1 skips eager-bootstrap side
|
|
3
|
-
* effects across plugin modules, while preserving api surface calls.
|
|
4
|
-
*
|
|
5
|
-
* Smoke context: A1's 2026-04-27 smoke run showed register() touching
|
|
6
|
-
* live production state. These tests lock down the gate.
|
|
7
|
-
*/
|
|
8
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
9
|
-
import { _setTestModeForTests } from '../src/lib/test-mode.js';
|
|
10
|
-
import { defaultRegisterGuard } from '../src/lib/register-guard.js';
|
|
11
|
-
describe('TEST_MODE=1 gates eager-bootstrap side effects', () => {
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
_setTestModeForTests(true);
|
|
14
|
-
// Reset guard so each test re-runs the register body (id-only tracking
|
|
15
|
-
// would skip subsequent calls within the same test process otherwise).
|
|
16
|
-
defaultRegisterGuard._resetForTests();
|
|
17
|
-
// Clear globalThis session-manager key between tests
|
|
18
|
-
const SM_KEY = Symbol.for('claude-local-enhancer:session-manager');
|
|
19
|
-
delete globalThis[SM_KEY];
|
|
20
|
-
});
|
|
21
|
-
afterEach(() => {
|
|
22
|
-
_setTestModeForTests(false);
|
|
23
|
-
const SM_KEY = Symbol.for('claude-local-enhancer:session-manager');
|
|
24
|
-
delete globalThis[SM_KEY];
|
|
25
|
-
vi.restoreAllMocks();
|
|
26
|
-
});
|
|
27
|
-
// ── cwd-patch tests ──────────────────────────────────────────────────────
|
|
28
|
-
it('cwd-patch register() in TEST_MODE does NOT mutate process.env.UX_BRIDGE_ALL_SESSIONS', async () => {
|
|
29
|
-
const before = process.env.UX_BRIDGE_ALL_SESSIONS;
|
|
30
|
-
delete process.env.UX_BRIDGE_ALL_SESSIONS;
|
|
31
|
-
const { registerCwdPatch } = await import('../src/session-bootstrap/index.js');
|
|
32
|
-
const api = { on: vi.fn(), registerService: vi.fn(), logger: console };
|
|
33
|
-
registerCwdPatch(api);
|
|
34
|
-
expect(process.env.UX_BRIDGE_ALL_SESSIONS).toBeUndefined();
|
|
35
|
-
// Restore
|
|
36
|
-
if (before !== undefined)
|
|
37
|
-
process.env.UX_BRIDGE_ALL_SESSIONS = before;
|
|
38
|
-
});
|
|
39
|
-
it('cwd-patch register() in TEST_MODE does NOT expose globalThis SessionManager via SM_KEY', async () => {
|
|
40
|
-
const { registerCwdPatch } = await import('../src/session-bootstrap/index.js');
|
|
41
|
-
const api = { on: vi.fn(), registerService: vi.fn(), logger: console };
|
|
42
|
-
registerCwdPatch(api);
|
|
43
|
-
const SM_KEY = Symbol.for('claude-local-enhancer:session-manager');
|
|
44
|
-
expect(globalThis[SM_KEY]).toBeUndefined();
|
|
45
|
-
});
|
|
46
|
-
it('cwd-patch register() in TEST_MODE DOES call api.registerService (API compliance preserved)', async () => {
|
|
47
|
-
const { registerCwdPatch } = await import('../src/session-bootstrap/index.js');
|
|
48
|
-
const registerServiceSpy = vi.fn();
|
|
49
|
-
const api = { on: vi.fn(), registerService: registerServiceSpy, logger: console };
|
|
50
|
-
registerCwdPatch(api);
|
|
51
|
-
expect(registerServiceSpy).toHaveBeenCalledOnce();
|
|
52
|
-
expect(registerServiceSpy.mock.calls[0][0]).toMatchObject({ id: 'claude-local-enhancer' });
|
|
53
|
-
});
|
|
54
|
-
it('cwd-patch register() in TEST_MODE emits the TEST_MODE skip log (proving eager path was not entered)', async () => {
|
|
55
|
-
// The eager-bootstrap skip log is emitted iff isTestMode() returns true inside
|
|
56
|
-
// the guard body — which is the gate that prevents all file writes, process kills,
|
|
57
|
-
// env mutations, and globalThis patches. Detecting that log proves the gate fired.
|
|
58
|
-
const logInfoSpy = vi.spyOn(console, 'info');
|
|
59
|
-
const { registerCwdPatch } = await import('../src/session-bootstrap/index.js');
|
|
60
|
-
const api = { on: vi.fn(), registerService: vi.fn(), logger: console };
|
|
61
|
-
registerCwdPatch(api);
|
|
62
|
-
const skipLogs = logInfoSpy.mock.calls.filter(args => typeof args[0] === 'string' && args[0].includes('TEST_MODE=1'));
|
|
63
|
-
expect(skipLogs.length).toBeGreaterThan(0);
|
|
64
|
-
});
|
|
65
|
-
// ── Production-path positive test (gate is NOT entered when TEST_MODE=0) ──
|
|
66
|
-
it('cwd-patch production path IS entered when TEST_MODE unset (gate not triggered)', async () => {
|
|
67
|
-
// Unset test mode for this specific test
|
|
68
|
-
_setTestModeForTests(false);
|
|
69
|
-
const { isTestMode } = await import('../src/lib/test-mode.js');
|
|
70
|
-
// Verify isTestMode() returns false — production path is reachable
|
|
71
|
-
expect(isTestMode()).toBe(false);
|
|
72
|
-
// Spy on the logger to detect validatePaths() info log (production-path entry point)
|
|
73
|
-
const logInfoSpy = vi.spyOn(console, 'info');
|
|
74
|
-
const { registerCwdPatch } = await import('../src/session-bootstrap/index.js');
|
|
75
|
-
const api = { on: vi.fn(), registerService: vi.fn(), logger: console };
|
|
76
|
-
// In production mode, register() will attempt validatePaths() + eager init.
|
|
77
|
-
// The CC module paths don't exist in test env so they fail gracefully, but
|
|
78
|
-
// we detect the production-path was entered by checking that the TEST_MODE
|
|
79
|
-
// skip log was NOT emitted.
|
|
80
|
-
registerCwdPatch(api);
|
|
81
|
-
const skipLogs = logInfoSpy.mock.calls.filter(args => typeof args[0] === 'string' && args[0].includes('TEST_MODE=1'));
|
|
82
|
-
expect(skipLogs).toHaveLength(0);
|
|
83
|
-
_setTestModeForTests(true); // restore for afterEach
|
|
84
|
-
});
|
|
85
|
-
// ── live-card tests ──────────────────────────────────────────────────────
|
|
86
|
-
it('live-card register() in TEST_MODE does NOT call applyPatch (no sendMessage monkey-patch)', async () => {
|
|
87
|
-
// We can only verify this indirectly: applyPatch tries to dynamic-import the CC plugin path.
|
|
88
|
-
// In TEST_MODE it must be skipped. We spy on dynamic import to verify it's never triggered
|
|
89
|
-
// from the eager path (BOT_TOKEN branch).
|
|
90
|
-
// Since BOT_TOKEN is empty in test env, the eager branch is also skipped — just verify
|
|
91
|
-
// the test-mode log is emitted when BOT_TOKEN would be set.
|
|
92
|
-
// This is a structural test: isTestMode() gate in live-card is present and correct.
|
|
93
|
-
const { isTestMode } = await import('../src/lib/test-mode.js');
|
|
94
|
-
expect(isTestMode()).toBe(true); // confirm we're in test mode during this test
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
//# sourceMappingURL=eager-bootstrap-gating.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eager-bootstrap-gating.test.js","sourceRoot":"","sources":["../../tests/eager-bootstrap-gating.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"engines.test.d.ts","sourceRoot":"","sources":["../../tests/engines.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import * as engines from '../src/engines/index.js';
|
|
3
|
-
describe('engines barrel export', () => {
|
|
4
|
-
it('imports without crashing', () => {
|
|
5
|
-
expect(engines).toBeDefined();
|
|
6
|
-
});
|
|
7
|
-
});
|
|
8
|
-
//# sourceMappingURL=engines.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"engines.test.js","sourceRoot":"","sources":["../../tests/engines.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AAEnD,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-formatter.test.d.ts","sourceRoot":"","sources":["../../tests/error-formatter.test.ts"],"names":[],"mappings":""}
|