@a1hvdy/cc-openclaw 0.11.0 → 0.13.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/event-reducer.js +3 -15
- package/dist/src/channels/telegram/event-reducer.js.map +1 -1
- package/dist/src/channels/telegram/format-helpers.d.ts +20 -0
- package/dist/src/channels/telegram/format-helpers.js +34 -0
- package/dist/src/channels/telegram/format-helpers.js.map +1 -0
- package/dist/src/channels/telegram/live-card.js +3 -21
- package/dist/src/channels/telegram/live-card.js.map +1 -1
- package/dist/src/channels/telegram/result-preview.d.ts +12 -0
- package/dist/src/channels/telegram/result-preview.js +48 -0
- package/dist/src/channels/telegram/result-preview.js.map +1 -0
- package/dist/src/channels/telegram/tool-tracker.d.ts +1 -2
- package/dist/src/channels/telegram/tool-tracker.js +11 -38
- package/dist/src/channels/telegram/tool-tracker.js.map +1 -1
- package/dist/src/cli/checks/bridge-wiring.d.ts +14 -0
- package/dist/src/cli/checks/bridge-wiring.js +64 -0
- package/dist/src/cli/checks/bridge-wiring.js.map +1 -0
- package/dist/src/cli/checks/config-schema.d.ts +11 -0
- package/dist/src/cli/checks/config-schema.js +51 -0
- package/dist/src/cli/checks/config-schema.js.map +1 -0
- package/dist/src/cli/checks/critical-openclaw-json-keys.d.ts +21 -0
- package/dist/src/cli/checks/critical-openclaw-json-keys.js +106 -0
- package/dist/src/cli/checks/critical-openclaw-json-keys.js.map +1 -0
- package/dist/src/cli/checks/install-path.d.ts +11 -0
- package/dist/src/cli/checks/install-path.js +89 -0
- package/dist/src/cli/checks/install-path.js.map +1 -0
- package/dist/src/cli/checks/patch-scaffold.d.ts +17 -0
- package/dist/src/cli/checks/patch-scaffold.js +56 -0
- package/dist/src/cli/checks/patch-scaffold.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +5 -9
- package/dist/src/cli/doctor.js +28 -129
- package/dist/src/cli/doctor.js.map +1 -1
- package/dist/src/cli/index.js +2 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/migrate.d.ts +29 -0
- package/dist/src/cli/migrate.js +75 -0
- package/dist/src/cli/migrate.js.map +1 -0
- package/dist/src/config/drift-detector.d.ts +28 -0
- package/dist/src/config/drift-detector.js +75 -0
- package/dist/src/config/drift-detector.js.map +1 -0
- package/dist/src/config/loader.d.ts +8 -0
- package/dist/src/config/loader.js +69 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/schema.d.ts +188 -0
- package/dist/src/config/schema.js +98 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/council/build-agent-prompt.d.ts +11 -0
- package/dist/src/council/build-agent-prompt.js +96 -0
- package/dist/src/council/build-agent-prompt.js.map +1 -0
- package/dist/src/council/cleanup-worktrees.d.ts +10 -0
- package/dist/src/council/cleanup-worktrees.js +22 -0
- package/dist/src/council/cleanup-worktrees.js.map +1 -0
- package/dist/src/council/council.js +15 -186
- package/dist/src/council/council.js.map +1 -1
- package/dist/src/council/system-prompt.d.ts +16 -0
- package/dist/src/council/system-prompt.js +40 -0
- package/dist/src/council/system-prompt.js.map +1 -0
- package/dist/src/council/write-worktree-claude-md.d.ts +10 -0
- package/dist/src/council/write-worktree-claude-md.js +41 -0
- package/dist/src/council/write-worktree-claude-md.js.map +1 -0
- package/dist/src/engines/persistent-custom-session.js +3 -8
- package/dist/src/engines/persistent-custom-session.js.map +1 -1
- package/dist/src/engines/resolve-bin.d.ts +14 -0
- package/dist/src/engines/resolve-bin.js +18 -0
- package/dist/src/engines/resolve-bin.js.map +1 -0
- package/dist/src/lib/config-service.js +8 -0
- package/dist/src/lib/config-service.js.map +1 -1
- package/dist/src/lib/debounce.d.ts +12 -0
- package/dist/src/lib/debounce.js +23 -0
- package/dist/src/lib/debounce.js.map +1 -0
- package/dist/src/lib/domain-error.d.ts +59 -0
- package/dist/src/lib/domain-error.js +79 -0
- package/dist/src/lib/domain-error.js.map +1 -0
- package/dist/src/lib/json-array.d.ts +10 -0
- package/dist/src/lib/json-array.js +23 -0
- package/dist/src/lib/json-array.js.map +1 -0
- package/dist/src/lib/safe-upstream-probes.d.ts +25 -0
- package/dist/src/lib/safe-upstream-probes.js +42 -0
- package/dist/src/lib/safe-upstream-probes.js.map +1 -0
- package/dist/src/lib/spawn-async.d.ts +18 -0
- package/dist/src/lib/spawn-async.js +47 -0
- package/dist/src/lib/spawn-async.js.map +1 -0
- package/dist/src/lib/stale-pid-files.d.ts +17 -0
- package/dist/src/lib/stale-pid-files.js +40 -0
- package/dist/src/lib/stale-pid-files.js.map +1 -0
- package/dist/src/lifecycle/boot.d.ts +59 -0
- package/dist/src/lifecycle/boot.js +132 -0
- package/dist/src/lifecycle/boot.js.map +1 -0
- package/dist/src/lifecycle/patch-manifest.d.ts +82 -0
- package/dist/src/lifecycle/patch-manifest.js +126 -0
- package/dist/src/lifecycle/patch-manifest.js.map +1 -0
- package/dist/src/lifecycle/phase-import-upstream.d.ts +12 -0
- package/dist/src/lifecycle/phase-import-upstream.js +18 -0
- package/dist/src/lifecycle/phase-import-upstream.js.map +1 -0
- package/dist/src/lifecycle/phase-install-patches.d.ts +12 -0
- package/dist/src/lifecycle/phase-install-patches.js +31 -0
- package/dist/src/lifecycle/phase-install-patches.js.map +1 -0
- package/dist/src/lifecycle/phase-schedule-jobs.d.ts +12 -0
- package/dist/src/lifecycle/phase-schedule-jobs.js +15 -0
- package/dist/src/lifecycle/phase-schedule-jobs.js.map +1 -0
- package/dist/src/lifecycle/phase-start-server.d.ts +11 -0
- package/dist/src/lifecycle/phase-start-server.js +11 -0
- package/dist/src/lifecycle/phase-start-server.js.map +1 -0
- package/dist/src/lifecycle/phase-validate-config.d.ts +9 -0
- package/dist/src/lifecycle/phase-validate-config.js +25 -0
- package/dist/src/lifecycle/phase-validate-config.js.map +1 -0
- package/dist/src/lifecycle/phase-validate-upstream.d.ts +11 -0
- package/dist/src/lifecycle/phase-validate-upstream.js +16 -0
- package/dist/src/lifecycle/phase-validate-upstream.js.map +1 -0
- package/dist/src/lifecycle/phase-wire-handlers.d.ts +12 -0
- package/dist/src/lifecycle/phase-wire-handlers.js +16 -0
- package/dist/src/lifecycle/phase-wire-handlers.js.map +1 -0
- package/dist/src/observability/event-bus.d.ts +75 -0
- package/dist/src/observability/event-bus.js +63 -0
- package/dist/src/observability/event-bus.js.map +1 -0
- package/dist/src/observability/get-event-bus.d.ts +25 -0
- package/dist/src/observability/get-event-bus.js +34 -0
- package/dist/src/observability/get-event-bus.js.map +1 -0
- package/dist/src/observability/observability-service.d.ts +19 -0
- package/dist/src/observability/observability-service.js +24 -0
- package/dist/src/observability/observability-service.js.map +1 -0
- package/dist/src/observability/subscribers/metrics.d.ts +11 -0
- package/dist/src/observability/subscribers/metrics.js +21 -0
- package/dist/src/observability/subscribers/metrics.js.map +1 -0
- package/dist/src/observability/subscribers/session-capture.d.ts +15 -0
- package/dist/src/observability/subscribers/session-capture.js +25 -0
- package/dist/src/observability/subscribers/session-capture.js.map +1 -0
- package/dist/src/openai-compat/bridges/allowlist.d.ts +14 -5
- package/dist/src/openai-compat/bridges/allowlist.js +18 -7
- package/dist/src/openai-compat/bridges/allowlist.js.map +1 -1
- package/dist/src/openai-compat/bridges/openclaw-api-shim.d.ts +54 -0
- package/dist/src/openai-compat/bridges/openclaw-api-shim.js +45 -0
- package/dist/src/openai-compat/bridges/openclaw-api-shim.js.map +1 -0
- package/dist/src/openai-compat/openai-chunk-types.d.ts +35 -0
- package/dist/src/openai-compat/openai-chunk-types.js +9 -0
- package/dist/src/openai-compat/openai-chunk-types.js.map +1 -0
- package/dist/src/openai-compat/openai-compat.d.ts +2 -90
- package/dist/src/openai-compat/openai-compat.js +68 -68
- package/dist/src/openai-compat/openai-compat.js.map +1 -1
- package/dist/src/openai-compat/openai-types.d.ts +71 -0
- package/dist/src/openai-compat/openai-types.js +11 -0
- package/dist/src/openai-compat/openai-types.js.map +1 -0
- package/dist/src/openai-compat/parse-route-body.d.ts +24 -0
- package/dist/src/openai-compat/parse-route-body.js +45 -0
- package/dist/src/openai-compat/parse-route-body.js.map +1 -0
- package/dist/src/openai-compat/tts-rule.d.ts +20 -0
- package/dist/src/openai-compat/tts-rule.js +58 -0
- package/dist/src/openai-compat/tts-rule.js.map +1 -0
- package/dist/src/openai-compat/voice-recovery.js +0 -1
- package/dist/src/openai-compat/voice-recovery.js.map +1 -1
- package/dist/src/patches/cache-parity-registry.d.ts +20 -0
- package/dist/src/patches/cache-parity-registry.js +64 -0
- package/dist/src/patches/cache-parity-registry.js.map +1 -0
- package/dist/src/patches/claude-md-injection.d.ts +10 -0
- package/dist/src/patches/claude-md-injection.js +46 -0
- package/dist/src/patches/claude-md-injection.js.map +1 -0
- package/dist/src/patches/cwd-redirect.d.ts +10 -0
- package/dist/src/patches/cwd-redirect.js +51 -0
- package/dist/src/patches/cwd-redirect.js.map +1 -0
- package/dist/src/patches/embedded-server-route.d.ts +23 -0
- package/dist/src/patches/embedded-server-route.js +64 -0
- package/dist/src/patches/embedded-server-route.js.map +1 -0
- package/dist/src/patches/pricing-overrides.d.ts +10 -0
- package/dist/src/patches/pricing-overrides.js +55 -0
- package/dist/src/patches/pricing-overrides.js.map +1 -0
- package/dist/src/patches/resume-registry-restore.d.ts +11 -0
- package/dist/src/patches/resume-registry-restore.js +48 -0
- package/dist/src/patches/resume-registry-restore.js.map +1 -0
- package/dist/src/patches/session-pid-tracking.d.ts +10 -0
- package/dist/src/patches/session-pid-tracking.js +45 -0
- package/dist/src/patches/session-pid-tracking.js.map +1 -0
- package/dist/src/patches/sysprompt-strip.d.ts +46 -0
- package/dist/src/patches/sysprompt-strip.js +78 -0
- package/dist/src/patches/sysprompt-strip.js.map +1 -0
- package/dist/src/patches/sysprompt-strip.spec.d.ts +33 -0
- package/dist/src/patches/sysprompt-strip.spec.js +53 -0
- package/dist/src/patches/sysprompt-strip.spec.js.map +1 -0
- package/dist/src/patches/tools-restoration.d.ts +12 -0
- package/dist/src/patches/tools-restoration.js +43 -0
- package/dist/src/patches/tools-restoration.js.map +1 -0
- package/dist/src/persistence/migration-v0.d.ts +24 -0
- package/dist/src/persistence/migration-v0.js +142 -0
- package/dist/src/persistence/migration-v0.js.map +1 -0
- package/dist/src/persistence/session-registry.d.ts +57 -0
- package/dist/src/persistence/session-registry.js +58 -0
- package/dist/src/persistence/session-registry.js.map +1 -0
- package/dist/src/persistence/snapshot.d.ts +18 -0
- package/dist/src/persistence/snapshot.js +32 -0
- package/dist/src/persistence/snapshot.js.map +1 -0
- package/dist/src/persistence/wal.d.ts +17 -0
- package/dist/src/persistence/wal.js +32 -0
- package/dist/src/persistence/wal.js.map +1 -0
- package/dist/src/session/persisted-sessions.d.ts +26 -0
- package/dist/src/session/persisted-sessions.js +70 -0
- package/dist/src/session/persisted-sessions.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +2 -11
- package/dist/src/session/session-manager.js +22 -66
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/session-bootstrap/boot-self-heal.d.ts +32 -0
- package/dist/src/session-bootstrap/boot-self-heal.js +54 -0
- package/dist/src/session-bootstrap/boot-self-heal.js.map +1 -0
- package/dist/src/session-bootstrap/cwd-patch.js +11 -87
- package/dist/src/session-bootstrap/cwd-patch.js.map +1 -1
- package/dist/src/session-bootstrap/resume-registry.d.ts +29 -0
- package/dist/src/session-bootstrap/resume-registry.js +58 -0
- package/dist/src/session-bootstrap/resume-registry.js.map +1 -0
- package/dist/src/session-bootstrap/session-hygiene.d.ts +23 -0
- package/dist/src/session-bootstrap/session-hygiene.js +41 -0
- package/dist/src/session-bootstrap/session-hygiene.js.map +1 -0
- package/dist/src/types/runtime-config.d.ts +11 -0
- package/dist/src/types/runtime-config.js +9 -0
- package/dist/src/types/runtime-config.js.map +1 -1
- package/package.json +1 -1
package/dist/src/cli/doctor.js
CHANGED
|
@@ -12,133 +12,29 @@
|
|
|
12
12
|
* Future planes add checks via the exported `ALL_CHECKS` registry.
|
|
13
13
|
*/
|
|
14
14
|
import { Command } from 'commander';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const _thisDir = dirname(fileURLToPath(import.meta.url));
|
|
39
|
-
const _projectRoot = findProjectRoot(_thisDir);
|
|
40
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
41
|
-
const selfPkg = JSON.parse(readFileSync(join(_projectRoot, 'package.json'), 'utf8'));
|
|
42
|
-
SELF_VERSION = String(selfPkg.version ?? 'unknown');
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
SELF_VERSION = 'unknown';
|
|
46
|
-
}
|
|
47
|
-
// ── Install-path candidates ──────────────────────────────────────────────────
|
|
48
|
-
const INSTALL_CANDIDATES = [
|
|
49
|
-
join(homedir(), '.npm-global/lib/node_modules/openclaw/dist/extensions/cc-openclaw'),
|
|
50
|
-
'/usr/local/lib/node_modules/openclaw/dist/extensions/cc-openclaw',
|
|
51
|
-
join(homedir(), '.openclaw/extensions/cc-openclaw'),
|
|
52
|
-
];
|
|
53
|
-
// ── Check 1: install path resolution ────────────────────────────────────────
|
|
54
|
-
export function checkInstallPath(selfVersion = SELF_VERSION) {
|
|
55
|
-
const id = 'check_install_path';
|
|
56
|
-
for (const candidate of INSTALL_CANDIDATES) {
|
|
57
|
-
const pkgPath = join(candidate, 'package.json');
|
|
58
|
-
if (!existsSync(pkgPath))
|
|
59
|
-
continue;
|
|
60
|
-
let installedVersion;
|
|
61
|
-
try {
|
|
62
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
63
|
-
const installedPkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
64
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
65
|
-
installedVersion = String(installedPkg.version ?? 'unknown');
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
return {
|
|
69
|
-
id,
|
|
70
|
-
status: 'fail',
|
|
71
|
-
detail: {
|
|
72
|
-
path: candidate,
|
|
73
|
-
candidatesSearched: INSTALL_CANDIDATES,
|
|
74
|
-
error: 'could not parse package.json at resolved path',
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
const mismatch = installedVersion !== selfVersion;
|
|
79
|
-
return {
|
|
80
|
-
id,
|
|
81
|
-
status: mismatch ? 'fail' : 'pass',
|
|
82
|
-
detail: {
|
|
83
|
-
path: candidate,
|
|
84
|
-
candidatesSearched: INSTALL_CANDIDATES,
|
|
85
|
-
version: installedVersion,
|
|
86
|
-
selfVersion: selfVersion,
|
|
87
|
-
mismatch,
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
return {
|
|
92
|
-
id,
|
|
93
|
-
status: 'fail',
|
|
94
|
-
detail: {
|
|
95
|
-
candidatesSearched: INSTALL_CANDIDATES,
|
|
96
|
-
error: 'cc-openclaw not found in any known openclaw extension path',
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
// ── Check 2: bridge wiring detection ────────────────────────────────────────
|
|
101
|
-
const EXPECTED_BRIDGE_MODES = ['Embedded', 'PerMessage', 'NativeStream', 'OpenClawNative'];
|
|
102
|
-
export async function checkBridgeWiring() {
|
|
103
|
-
const id = 'check_bridge_wiring';
|
|
104
|
-
let factory;
|
|
105
|
-
try {
|
|
106
|
-
// Dynamic import — soft-fail if the file doesn't exist yet.
|
|
107
|
-
// The bridge coder is working on this in parallel; pending is correct.
|
|
108
|
-
// The specifier is intentionally held in a variable so tsc does not
|
|
109
|
-
// attempt static resolution of the not-yet-created module.
|
|
110
|
-
factory = (await import('../openai-compat/bridges/factory.js'));
|
|
111
|
-
}
|
|
112
|
-
catch (err) {
|
|
113
|
-
const matchesNotFound = (e) => e instanceof Error &&
|
|
114
|
-
('code' in e
|
|
115
|
-
? e.code === 'ERR_MODULE_NOT_FOUND'
|
|
116
|
-
: e.message.includes('Cannot find module') ||
|
|
117
|
-
e.message.includes('ERR_MODULE_NOT_FOUND'));
|
|
118
|
-
const isNotFound = matchesNotFound(err) || matchesNotFound(err.cause);
|
|
119
|
-
if (isNotFound) {
|
|
120
|
-
return {
|
|
121
|
-
id,
|
|
122
|
-
status: 'pending',
|
|
123
|
-
detail: { reason: 'bridge module not yet shipped' },
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
return {
|
|
127
|
-
id,
|
|
128
|
-
status: 'fail',
|
|
129
|
-
detail: { error: err instanceof Error ? err.message : String(err) },
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
const missingBridges = EXPECTED_BRIDGE_MODES.filter((mode) => !(mode in factory));
|
|
133
|
-
return {
|
|
134
|
-
id,
|
|
135
|
-
status: missingBridges.length === 0 ? 'pass' : 'fail',
|
|
136
|
-
detail: {
|
|
137
|
-
bridges: EXPECTED_BRIDGE_MODES.filter((m) => m in factory),
|
|
138
|
-
missingBridges,
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
}
|
|
15
|
+
import { checkPatchScaffold as _checkPatchScaffoldImpl } from './checks/patch-scaffold.js';
|
|
16
|
+
import { checkCriticalOpenclawJsonKeys as _checkCriticalKeysImpl } from './checks/critical-openclaw-json-keys.js';
|
|
17
|
+
import { checkConfigSchema as _checkConfigSchemaImpl } from './checks/config-schema.js';
|
|
18
|
+
import { checkInstallPath as _checkInstallPathImpl } from './checks/install-path.js';
|
|
19
|
+
import { checkBridgeWiring as _checkBridgeWiringImpl } from './checks/bridge-wiring.js';
|
|
20
|
+
// `checkInstallPath` extracted to `./checks/install-path.ts` 2026-05-13
|
|
21
|
+
// along with findProjectRoot, SELF_VERSION, INSTALL_CANDIDATES helpers
|
|
22
|
+
// to keep doctor.ts under the 500-LOC ceiling.
|
|
23
|
+
export { checkInstallPath } from './checks/install-path.js';
|
|
24
|
+
// `checkBridgeWiring` extracted to `./checks/bridge-wiring.ts` 2026-05-13
|
|
25
|
+
// to keep doctor.ts under the 500-LOC ceiling.
|
|
26
|
+
export { checkBridgeWiring } from './checks/bridge-wiring.js';
|
|
27
|
+
// `checkConfigSchema` extracted to `./checks/config-schema.ts` 2026-05-13
|
|
28
|
+
// to keep doctor.ts under the 500-LOC ceiling.
|
|
29
|
+
export { checkConfigSchema } from './checks/config-schema.js';
|
|
30
|
+
// `checkCriticalOpenclawJsonKeys` extracted to `./checks/critical-openclaw-json-keys.ts`
|
|
31
|
+
// 2026-05-13 to keep doctor.ts under the 500-LOC ceiling.
|
|
32
|
+
export { checkCriticalOpenclawJsonKeys } from './checks/critical-openclaw-json-keys.js';
|
|
33
|
+
// ── Check 5: patch scaffold composition ─────────────────────────────────────
|
|
34
|
+
// `checkPatchScaffold` lives in `src/cli/checks/patch-scaffold.ts` (extracted
|
|
35
|
+
// 2026-05-13 to keep doctor.ts under the 500-LOC ceiling). Re-exported here
|
|
36
|
+
// for backward compatibility.
|
|
37
|
+
export { checkPatchScaffold } from './checks/patch-scaffold.js';
|
|
142
38
|
// ── Output helpers ───────────────────────────────────────────────────────────
|
|
143
39
|
function symbol(status) {
|
|
144
40
|
if (status === 'pass')
|
|
@@ -167,8 +63,11 @@ export function createDoctorCommand() {
|
|
|
167
63
|
.option('--json', 'emit results as a single JSON line')
|
|
168
64
|
.action(async (opts) => {
|
|
169
65
|
const results = [];
|
|
170
|
-
results.push(
|
|
171
|
-
results.push(await
|
|
66
|
+
results.push(_checkInstallPathImpl());
|
|
67
|
+
results.push(await _checkBridgeWiringImpl());
|
|
68
|
+
results.push(_checkConfigSchemaImpl());
|
|
69
|
+
results.push(_checkCriticalKeysImpl());
|
|
70
|
+
results.push(await _checkPatchScaffoldImpl());
|
|
172
71
|
const passed = results.filter((r) => r.status === 'pass').length;
|
|
173
72
|
const pending = results.filter((r) => r.status === 'pending').length;
|
|
174
73
|
const failed = results.filter((r) => r.status === 'fail').length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { Command } from 'commander';
|
|
9
9
|
import { createDoctorCommand } from './doctor.js';
|
|
10
|
+
import { createMigrateCommand } from './migrate.js';
|
|
10
11
|
import { existsSync, readFileSync } from 'fs';
|
|
11
12
|
import { dirname, join } from 'path';
|
|
12
13
|
import { fileURLToPath } from 'url';
|
|
@@ -23,15 +24,14 @@ function findProjectRoot(startDir) {
|
|
|
23
24
|
throw new Error('cc-openclaw: could not locate project root package.json');
|
|
24
25
|
}
|
|
25
26
|
const _root = findProjectRoot(dirname(fileURLToPath(import.meta.url)));
|
|
26
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
27
27
|
const pkg = JSON.parse(readFileSync(join(_root, 'package.json'), 'utf8'));
|
|
28
28
|
const program = new Command();
|
|
29
29
|
program
|
|
30
30
|
.name('cc-openclaw')
|
|
31
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
32
31
|
.version(String(pkg.version), '-v, --version', 'print version and exit')
|
|
33
32
|
.description('A1xAI cc-openclaw plugin diagnostics');
|
|
34
33
|
program.addCommand(createDoctorCommand());
|
|
34
|
+
program.addCommand(createMigrateCommand());
|
|
35
35
|
program.parseAsync(process.argv).catch((err) => {
|
|
36
36
|
console.error('cc-openclaw: fatal error', err);
|
|
37
37
|
process.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACtD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACtD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEvE,MAAM,GAAG,GAAyB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhG,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KAEnB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,wBAAwB,CAAC;KACvE,WAAW,CAAC,sCAAsC,CAAC,CAAC;AAEvD,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAE3C,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cc-openclaw migrate` — legacy-persistence migration command (Q5 resolution).
|
|
3
|
+
*
|
|
4
|
+
* Default mode (no flag): READ-ONLY. Loads the four legacy JSON files into
|
|
5
|
+
* the new SessionRegistry's in-memory map, reports counts, exits 0. Legacy
|
|
6
|
+
* files remain untouched. Idempotent — safe to run repeatedly.
|
|
7
|
+
*
|
|
8
|
+
* `--commit`: DESTRUCTIVE. After successful read, deletes the four legacy
|
|
9
|
+
* files. The v1.0.0 release blocks on A1 running `--commit` on both laptops.
|
|
10
|
+
*
|
|
11
|
+
* `--dry-run`: synonym for default (no-flag) — emitted for parity with
|
|
12
|
+
* `openclaw doctor --fix` UX expectations. No deletion, no writes, only counts.
|
|
13
|
+
*/
|
|
14
|
+
import { Command } from 'commander';
|
|
15
|
+
export interface MigrateOptions {
|
|
16
|
+
commit?: boolean;
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface MigrateResult {
|
|
20
|
+
readonly migratedCount: number;
|
|
21
|
+
readonly committed: boolean;
|
|
22
|
+
readonly deletedFiles: ReadonlyArray<string>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Pure function — runs the migration, returns counts. Splits the side-effects
|
|
26
|
+
* (file deletion + console output) from the read so the test surface stays clean.
|
|
27
|
+
*/
|
|
28
|
+
export declare function runMigrate(opts?: MigrateOptions): Promise<MigrateResult>;
|
|
29
|
+
export declare function createMigrateCommand(): Command;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cc-openclaw migrate` — legacy-persistence migration command (Q5 resolution).
|
|
3
|
+
*
|
|
4
|
+
* Default mode (no flag): READ-ONLY. Loads the four legacy JSON files into
|
|
5
|
+
* the new SessionRegistry's in-memory map, reports counts, exits 0. Legacy
|
|
6
|
+
* files remain untouched. Idempotent — safe to run repeatedly.
|
|
7
|
+
*
|
|
8
|
+
* `--commit`: DESTRUCTIVE. After successful read, deletes the four legacy
|
|
9
|
+
* files. The v1.0.0 release blocks on A1 running `--commit` on both laptops.
|
|
10
|
+
*
|
|
11
|
+
* `--dry-run`: synonym for default (no-flag) — emitted for parity with
|
|
12
|
+
* `openclaw doctor --fix` UX expectations. No deletion, no writes, only counts.
|
|
13
|
+
*/
|
|
14
|
+
import { Command } from 'commander';
|
|
15
|
+
import { existsSync, unlinkSync } from 'fs';
|
|
16
|
+
import { homedir } from 'os';
|
|
17
|
+
import { join } from 'path';
|
|
18
|
+
import { MigrationV0 } from '../persistence/migration-v0.js';
|
|
19
|
+
import { SessionRegistry } from '../persistence/session-registry.js';
|
|
20
|
+
const HOME = homedir();
|
|
21
|
+
const OPENCLAW_ROOT = join(HOME, '.openclaw');
|
|
22
|
+
const LEGACY_PATHS = [
|
|
23
|
+
join(OPENCLAW_ROOT, 'claude-sessions.json'),
|
|
24
|
+
join(OPENCLAW_ROOT, 'savvy-resume-registry.json'),
|
|
25
|
+
join(OPENCLAW_ROOT, 'session-pids.json'),
|
|
26
|
+
join(OPENCLAW_ROOT, 'openclaw-cache-parity-registry.json'),
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Pure function — runs the migration, returns counts. Splits the side-effects
|
|
30
|
+
* (file deletion + console output) from the read so the test surface stays clean.
|
|
31
|
+
*/
|
|
32
|
+
export async function runMigrate(opts = {}) {
|
|
33
|
+
const migration = new MigrationV0();
|
|
34
|
+
const registry = new SessionRegistry();
|
|
35
|
+
const states = await migration.readLegacy();
|
|
36
|
+
for (const state of states)
|
|
37
|
+
registry.set(state);
|
|
38
|
+
if (!opts.commit) {
|
|
39
|
+
return { migratedCount: states.length, committed: false, deletedFiles: [] };
|
|
40
|
+
}
|
|
41
|
+
const deleted = [];
|
|
42
|
+
for (const path of LEGACY_PATHS) {
|
|
43
|
+
if (existsSync(path)) {
|
|
44
|
+
try {
|
|
45
|
+
unlinkSync(path);
|
|
46
|
+
deleted.push(path);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// best-effort; surface in the result for caller transparency
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { migratedCount: states.length, committed: true, deletedFiles: deleted };
|
|
54
|
+
}
|
|
55
|
+
export function createMigrateCommand() {
|
|
56
|
+
const cmd = new Command('migrate');
|
|
57
|
+
cmd.description('Migrate legacy 4-file persistence into SessionRegistry. Default is read-only; ' +
|
|
58
|
+
'pass --commit to delete the legacy files after a successful read.');
|
|
59
|
+
cmd.option('--commit', 'delete legacy files after successful read (destructive)');
|
|
60
|
+
cmd.option('--dry-run', 'read-only (synonym for default)');
|
|
61
|
+
cmd.action(async (opts) => {
|
|
62
|
+
const result = await runMigrate({ commit: opts.commit === true });
|
|
63
|
+
if (result.committed) {
|
|
64
|
+
console.log(`migrated ${result.migratedCount} session(s); deleted ${result.deletedFiles.length} legacy file(s):`);
|
|
65
|
+
for (const f of result.deletedFiles)
|
|
66
|
+
console.log(` - ${f}`);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log(`migrated ${result.migratedCount} session(s) (read-only; legacy files preserved).`);
|
|
70
|
+
console.log(`Re-run with --commit on both laptops to delete legacy files.`);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
return cmd;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/cli/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* drift-detector — snapshots the parsed Config to disk on a healthy boot;
|
|
3
|
+
* compares on subsequent boots and returns a delta list.
|
|
4
|
+
*
|
|
5
|
+
* Primary purpose: detect keys pruned by `openclaw doctor --fix`
|
|
6
|
+
* (OF5 — feedback_cc_openclaw_provider_timeout.md).
|
|
7
|
+
*
|
|
8
|
+
* Snapshot path: ~/.openclaw/workspace/memory/cc-openclaw-config-snapshot.json
|
|
9
|
+
* The file is written atomically (write-then-rename is not available in pure
|
|
10
|
+
* Node ESM without extra deps; we write directly since the worst case is a
|
|
11
|
+
* corrupted snapshot — non-fatal; falls back to empty baseline).
|
|
12
|
+
*/
|
|
13
|
+
import type { Config } from './schema.js';
|
|
14
|
+
export interface ConfigDelta {
|
|
15
|
+
path: string;
|
|
16
|
+
previous: unknown;
|
|
17
|
+
current: unknown;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Compare current config against the on-disk snapshot.
|
|
21
|
+
* Returns an array of changed paths (empty = no drift).
|
|
22
|
+
*/
|
|
23
|
+
export declare function detectDrift(current: Config): ConfigDelta[];
|
|
24
|
+
/**
|
|
25
|
+
* Persist current config as the baseline snapshot for future drift detection.
|
|
26
|
+
* Called at the end of a successful boot (after phase 7 / ready state).
|
|
27
|
+
*/
|
|
28
|
+
export declare function saveSnapshot(current: Config): void;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* drift-detector — snapshots the parsed Config to disk on a healthy boot;
|
|
3
|
+
* compares on subsequent boots and returns a delta list.
|
|
4
|
+
*
|
|
5
|
+
* Primary purpose: detect keys pruned by `openclaw doctor --fix`
|
|
6
|
+
* (OF5 — feedback_cc_openclaw_provider_timeout.md).
|
|
7
|
+
*
|
|
8
|
+
* Snapshot path: ~/.openclaw/workspace/memory/cc-openclaw-config-snapshot.json
|
|
9
|
+
* The file is written atomically (write-then-rename is not available in pure
|
|
10
|
+
* Node ESM without extra deps; we write directly since the worst case is a
|
|
11
|
+
* corrupted snapshot — non-fatal; falls back to empty baseline).
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
14
|
+
import { homedir } from 'os';
|
|
15
|
+
import { join, dirname } from 'path';
|
|
16
|
+
const SNAPSHOT_PATH = join(homedir(), '.openclaw', 'workspace', 'memory', 'cc-openclaw-config-snapshot.json');
|
|
17
|
+
// ── Internal helpers ──────────────────────────────────────────────────────────
|
|
18
|
+
function flattenConfig(obj, prefix = '') {
|
|
19
|
+
if (obj === null || typeof obj !== 'object') {
|
|
20
|
+
return { [prefix]: obj };
|
|
21
|
+
}
|
|
22
|
+
const result = {};
|
|
23
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
24
|
+
const key = prefix ? `${prefix}.${k}` : k;
|
|
25
|
+
if (v !== null && typeof v === 'object' && !Array.isArray(v)) {
|
|
26
|
+
Object.assign(result, flattenConfig(v, key));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
result[key] = v;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
function readSnapshot() {
|
|
35
|
+
if (!existsSync(SNAPSHOT_PATH))
|
|
36
|
+
return {};
|
|
37
|
+
try {
|
|
38
|
+
const raw = readFileSync(SNAPSHOT_PATH, 'utf8');
|
|
39
|
+
return JSON.parse(raw);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// ── Public API ────────────────────────────────────────────────────────────────
|
|
46
|
+
/**
|
|
47
|
+
* Compare current config against the on-disk snapshot.
|
|
48
|
+
* Returns an array of changed paths (empty = no drift).
|
|
49
|
+
*/
|
|
50
|
+
export function detectDrift(current) {
|
|
51
|
+
const previous = readSnapshot();
|
|
52
|
+
const flat = flattenConfig(current);
|
|
53
|
+
const deltas = [];
|
|
54
|
+
for (const [path, value] of Object.entries(flat)) {
|
|
55
|
+
if (path in previous && JSON.stringify(previous[path]) !== JSON.stringify(value)) {
|
|
56
|
+
deltas.push({ path, previous: previous[path], current: value });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return deltas;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Persist current config as the baseline snapshot for future drift detection.
|
|
63
|
+
* Called at the end of a successful boot (after phase 7 / ready state).
|
|
64
|
+
*/
|
|
65
|
+
export function saveSnapshot(current) {
|
|
66
|
+
try {
|
|
67
|
+
mkdirSync(dirname(SNAPSHOT_PATH), { recursive: true });
|
|
68
|
+
const flat = flattenConfig(current);
|
|
69
|
+
writeFileSync(SNAPSHOT_PATH, JSON.stringify(flat, null, 2), 'utf8');
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Non-fatal: drift detection degrades to "no baseline" on next boot.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=drift-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift-detector.js","sourceRoot":"","sources":["../../../src/config/drift-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadConfigSources — reads env vars + ~/.openclaw/openclaw.json, returns a
|
|
3
|
+
* raw object for ConfigSchema.parse().
|
|
4
|
+
*
|
|
5
|
+
* Does NOT throw on missing files — caller receives defaults via zod.
|
|
6
|
+
* Throws ConfigInvalid only when ConfigSchema.parse() rejects (via boot phase 1).
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadConfigSources(): Record<string, unknown>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loadConfigSources — reads env vars + ~/.openclaw/openclaw.json, returns a
|
|
3
|
+
* raw object for ConfigSchema.parse().
|
|
4
|
+
*
|
|
5
|
+
* Does NOT throw on missing files — caller receives defaults via zod.
|
|
6
|
+
* Throws ConfigInvalid only when ConfigSchema.parse() rejects (via boot phase 1).
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync } from 'fs';
|
|
9
|
+
import { homedir } from 'os';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
const OPENCLAW_JSON_PATH = join(homedir(), '.openclaw', 'openclaw.json');
|
|
12
|
+
function readOpenClawJson() {
|
|
13
|
+
if (!existsSync(OPENCLAW_JSON_PATH))
|
|
14
|
+
return {};
|
|
15
|
+
try {
|
|
16
|
+
const raw = readFileSync(OPENCLAW_JSON_PATH, 'utf8');
|
|
17
|
+
return JSON.parse(raw);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function parseBoolEnv(key, fallback = false) {
|
|
24
|
+
const val = process.env[key];
|
|
25
|
+
if (val === undefined)
|
|
26
|
+
return fallback;
|
|
27
|
+
return val === '1' || val === 'true';
|
|
28
|
+
}
|
|
29
|
+
function parseIntEnv(key, fallback) {
|
|
30
|
+
const val = process.env[key];
|
|
31
|
+
if (val === undefined)
|
|
32
|
+
return fallback;
|
|
33
|
+
const n = parseInt(val, 10);
|
|
34
|
+
return isNaN(n) ? fallback : n;
|
|
35
|
+
}
|
|
36
|
+
// ── Main ──────────────────────────────────────────────────────────────────────
|
|
37
|
+
export function loadConfigSources() {
|
|
38
|
+
const oclJson = readOpenClawJson();
|
|
39
|
+
// Extract timeoutSeconds from models.providers["cc-openclaw"].timeoutSeconds
|
|
40
|
+
const ccProvider = oclJson.models?.providers?.['cc-openclaw'];
|
|
41
|
+
const timeoutSeconds = ccProvider?.timeoutSeconds ??
|
|
42
|
+
parseIntEnv('CC_OPENCLAW_TIMEOUT_SECONDS');
|
|
43
|
+
// Extract fallback chain from agents.defaults.model.fallbacks
|
|
44
|
+
const fallbackChain = oclJson.agents?.defaults?.model?.fallbacks ?? [];
|
|
45
|
+
return {
|
|
46
|
+
openclawCcOpenclawActive: parseBoolEnv('OPENCLAW_CC_OPENCLAW_ACTIVE'),
|
|
47
|
+
openclawCcOpenclawListeners: parseBoolEnv('OPENCLAW_CC_OPENCLAW_LISTENERS'),
|
|
48
|
+
ccOpenclaw: {
|
|
49
|
+
nativeTools: {
|
|
50
|
+
enabled: parseBoolEnv('CC_OPENCLAW_NATIVE_TOOLS', true),
|
|
51
|
+
// allowList not env-driven; comes from schema default (Q1)
|
|
52
|
+
},
|
|
53
|
+
stalledKillMs: parseIntEnv('CC_OPENCLAW_STALLED_KILL_MS'),
|
|
54
|
+
loopMaxSubprocs: parseIntEnv('CC_OPENCLAW_LOOP_MAX_SUBPROCS'),
|
|
55
|
+
cacheParity: parseBoolEnv('OPENCLAW_CACHE_PARITY', true),
|
|
56
|
+
ttsAutoMode: process.env['OPENCLAW_TTS_AUTO_MODE'],
|
|
57
|
+
},
|
|
58
|
+
openclawJson: {
|
|
59
|
+
timeoutSeconds,
|
|
60
|
+
messagesTts: {
|
|
61
|
+
timeoutMs: oclJson.messages?.tts?.timeoutMs,
|
|
62
|
+
maxTextLength: oclJson.messages?.tts?.maxTextLength,
|
|
63
|
+
},
|
|
64
|
+
fallbackChain,
|
|
65
|
+
pluginsAllow: oclJson.plugins?.allow ?? [],
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;AA0BzE,SAAS,gBAAgB;IACvB,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,QAAQ,GAAG,KAAK;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACvC,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,MAAM,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,QAAiB;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACvC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,6EAA6E;IAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,cAAc,GAClB,UAAU,EAAE,cAAc;QAC1B,WAAW,CAAC,6BAA6B,CAAC,CAAC;IAE7C,8DAA8D;IAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAEvE,OAAO;QACL,wBAAwB,EAAE,YAAY,CAAC,6BAA6B,CAAC;QACrE,2BAA2B,EAAE,YAAY,CAAC,gCAAgC,CAAC;QAC3E,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,OAAO,EAAE,YAAY,CAAC,0BAA0B,EAAE,IAAI,CAAC;gBACvD,2DAA2D;aAC5D;YACD,aAAa,EAAE,WAAW,CAAC,6BAA6B,CAAC;YACzD,eAAe,EAAE,WAAW,CAAC,+BAA+B,CAAC;YAC7D,WAAW,EAAE,YAAY,CAAC,uBAAuB,EAAE,IAAI,CAAC;YACxD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;SACnD;QACD,YAAY,EAAE;YACZ,cAAc;YACd,WAAW,EAAE;gBACX,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS;gBAC3C,aAAa,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,aAAa;aACpD;YACD,aAAa;YACb,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;SAC3C;KACF,CAAC;AACJ,CAAC"}
|