@a1hvdy/cc-openclaw 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/dist/src/channels/telegram/event-reducer.js +3 -15
  2. package/dist/src/channels/telegram/event-reducer.js.map +1 -1
  3. package/dist/src/channels/telegram/format-helpers.d.ts +20 -0
  4. package/dist/src/channels/telegram/format-helpers.js +34 -0
  5. package/dist/src/channels/telegram/format-helpers.js.map +1 -0
  6. package/dist/src/channels/telegram/live-card.js +3 -21
  7. package/dist/src/channels/telegram/live-card.js.map +1 -1
  8. package/dist/src/channels/telegram/result-preview.d.ts +12 -0
  9. package/dist/src/channels/telegram/result-preview.js +48 -0
  10. package/dist/src/channels/telegram/result-preview.js.map +1 -0
  11. package/dist/src/channels/telegram/tool-tracker.d.ts +1 -2
  12. package/dist/src/channels/telegram/tool-tracker.js +6 -37
  13. package/dist/src/channels/telegram/tool-tracker.js.map +1 -1
  14. package/dist/src/cli/checks/bridge-wiring.d.ts +14 -0
  15. package/dist/src/cli/checks/bridge-wiring.js +64 -0
  16. package/dist/src/cli/checks/bridge-wiring.js.map +1 -0
  17. package/dist/src/cli/checks/config-schema.d.ts +11 -0
  18. package/dist/src/cli/checks/config-schema.js +51 -0
  19. package/dist/src/cli/checks/config-schema.js.map +1 -0
  20. package/dist/src/cli/checks/critical-openclaw-json-keys.d.ts +21 -0
  21. package/dist/src/cli/checks/critical-openclaw-json-keys.js +106 -0
  22. package/dist/src/cli/checks/critical-openclaw-json-keys.js.map +1 -0
  23. package/dist/src/cli/checks/install-path.d.ts +11 -0
  24. package/dist/src/cli/checks/install-path.js +89 -0
  25. package/dist/src/cli/checks/install-path.js.map +1 -0
  26. package/dist/src/cli/checks/patch-scaffold.d.ts +17 -0
  27. package/dist/src/cli/checks/patch-scaffold.js +56 -0
  28. package/dist/src/cli/checks/patch-scaffold.js.map +1 -0
  29. package/dist/src/cli/doctor.d.ts +5 -9
  30. package/dist/src/cli/doctor.js +28 -129
  31. package/dist/src/cli/doctor.js.map +1 -1
  32. package/dist/src/cli/index.js +2 -2
  33. package/dist/src/cli/index.js.map +1 -1
  34. package/dist/src/cli/migrate.d.ts +29 -0
  35. package/dist/src/cli/migrate.js +75 -0
  36. package/dist/src/cli/migrate.js.map +1 -0
  37. package/dist/src/config/drift-detector.d.ts +28 -0
  38. package/dist/src/config/drift-detector.js +75 -0
  39. package/dist/src/config/drift-detector.js.map +1 -0
  40. package/dist/src/config/loader.d.ts +8 -0
  41. package/dist/src/config/loader.js +69 -0
  42. package/dist/src/config/loader.js.map +1 -0
  43. package/dist/src/config/schema.d.ts +188 -0
  44. package/dist/src/config/schema.js +98 -0
  45. package/dist/src/config/schema.js.map +1 -0
  46. package/dist/src/council/build-agent-prompt.d.ts +11 -0
  47. package/dist/src/council/build-agent-prompt.js +96 -0
  48. package/dist/src/council/build-agent-prompt.js.map +1 -0
  49. package/dist/src/council/cleanup-worktrees.d.ts +10 -0
  50. package/dist/src/council/cleanup-worktrees.js +22 -0
  51. package/dist/src/council/cleanup-worktrees.js.map +1 -0
  52. package/dist/src/council/council.js +15 -186
  53. package/dist/src/council/council.js.map +1 -1
  54. package/dist/src/council/system-prompt.d.ts +16 -0
  55. package/dist/src/council/system-prompt.js +40 -0
  56. package/dist/src/council/system-prompt.js.map +1 -0
  57. package/dist/src/council/write-worktree-claude-md.d.ts +10 -0
  58. package/dist/src/council/write-worktree-claude-md.js +41 -0
  59. package/dist/src/council/write-worktree-claude-md.js.map +1 -0
  60. package/dist/src/engines/persistent-custom-session.js +3 -8
  61. package/dist/src/engines/persistent-custom-session.js.map +1 -1
  62. package/dist/src/engines/resolve-bin.d.ts +14 -0
  63. package/dist/src/engines/resolve-bin.js +18 -0
  64. package/dist/src/engines/resolve-bin.js.map +1 -0
  65. package/dist/src/lib/config-service.js +8 -0
  66. package/dist/src/lib/config-service.js.map +1 -1
  67. package/dist/src/lib/debounce.d.ts +12 -0
  68. package/dist/src/lib/debounce.js +23 -0
  69. package/dist/src/lib/debounce.js.map +1 -0
  70. package/dist/src/lib/domain-error.d.ts +59 -0
  71. package/dist/src/lib/domain-error.js +79 -0
  72. package/dist/src/lib/domain-error.js.map +1 -0
  73. package/dist/src/lib/json-array.d.ts +10 -0
  74. package/dist/src/lib/json-array.js +23 -0
  75. package/dist/src/lib/json-array.js.map +1 -0
  76. package/dist/src/lib/safe-upstream-probes.d.ts +25 -0
  77. package/dist/src/lib/safe-upstream-probes.js +42 -0
  78. package/dist/src/lib/safe-upstream-probes.js.map +1 -0
  79. package/dist/src/lib/spawn-async.d.ts +18 -0
  80. package/dist/src/lib/spawn-async.js +47 -0
  81. package/dist/src/lib/spawn-async.js.map +1 -0
  82. package/dist/src/lib/stale-pid-files.d.ts +17 -0
  83. package/dist/src/lib/stale-pid-files.js +40 -0
  84. package/dist/src/lib/stale-pid-files.js.map +1 -0
  85. package/dist/src/lifecycle/boot.d.ts +59 -0
  86. package/dist/src/lifecycle/boot.js +132 -0
  87. package/dist/src/lifecycle/boot.js.map +1 -0
  88. package/dist/src/lifecycle/patch-manifest.d.ts +82 -0
  89. package/dist/src/lifecycle/patch-manifest.js +126 -0
  90. package/dist/src/lifecycle/patch-manifest.js.map +1 -0
  91. package/dist/src/lifecycle/phase-import-upstream.d.ts +12 -0
  92. package/dist/src/lifecycle/phase-import-upstream.js +18 -0
  93. package/dist/src/lifecycle/phase-import-upstream.js.map +1 -0
  94. package/dist/src/lifecycle/phase-install-patches.d.ts +12 -0
  95. package/dist/src/lifecycle/phase-install-patches.js +31 -0
  96. package/dist/src/lifecycle/phase-install-patches.js.map +1 -0
  97. package/dist/src/lifecycle/phase-schedule-jobs.d.ts +12 -0
  98. package/dist/src/lifecycle/phase-schedule-jobs.js +15 -0
  99. package/dist/src/lifecycle/phase-schedule-jobs.js.map +1 -0
  100. package/dist/src/lifecycle/phase-start-server.d.ts +11 -0
  101. package/dist/src/lifecycle/phase-start-server.js +11 -0
  102. package/dist/src/lifecycle/phase-start-server.js.map +1 -0
  103. package/dist/src/lifecycle/phase-validate-config.d.ts +9 -0
  104. package/dist/src/lifecycle/phase-validate-config.js +25 -0
  105. package/dist/src/lifecycle/phase-validate-config.js.map +1 -0
  106. package/dist/src/lifecycle/phase-validate-upstream.d.ts +11 -0
  107. package/dist/src/lifecycle/phase-validate-upstream.js +16 -0
  108. package/dist/src/lifecycle/phase-validate-upstream.js.map +1 -0
  109. package/dist/src/lifecycle/phase-wire-handlers.d.ts +12 -0
  110. package/dist/src/lifecycle/phase-wire-handlers.js +16 -0
  111. package/dist/src/lifecycle/phase-wire-handlers.js.map +1 -0
  112. package/dist/src/observability/event-bus.d.ts +65 -0
  113. package/dist/src/observability/event-bus.js +52 -0
  114. package/dist/src/observability/event-bus.js.map +1 -0
  115. package/dist/src/observability/get-event-bus.d.ts +25 -0
  116. package/dist/src/observability/get-event-bus.js +34 -0
  117. package/dist/src/observability/get-event-bus.js.map +1 -0
  118. package/dist/src/observability/observability-service.d.ts +19 -0
  119. package/dist/src/observability/observability-service.js +24 -0
  120. package/dist/src/observability/observability-service.js.map +1 -0
  121. package/dist/src/observability/subscribers/metrics.d.ts +11 -0
  122. package/dist/src/observability/subscribers/metrics.js +21 -0
  123. package/dist/src/observability/subscribers/metrics.js.map +1 -0
  124. package/dist/src/observability/subscribers/session-capture.d.ts +15 -0
  125. package/dist/src/observability/subscribers/session-capture.js +25 -0
  126. package/dist/src/observability/subscribers/session-capture.js.map +1 -0
  127. package/dist/src/openai-compat/bridges/allowlist.d.ts +14 -5
  128. package/dist/src/openai-compat/bridges/allowlist.js +18 -7
  129. package/dist/src/openai-compat/bridges/allowlist.js.map +1 -1
  130. package/dist/src/openai-compat/bridges/openclaw-api-shim.d.ts +54 -0
  131. package/dist/src/openai-compat/bridges/openclaw-api-shim.js +45 -0
  132. package/dist/src/openai-compat/bridges/openclaw-api-shim.js.map +1 -0
  133. package/dist/src/openai-compat/openai-chunk-types.d.ts +35 -0
  134. package/dist/src/openai-compat/openai-chunk-types.js +9 -0
  135. package/dist/src/openai-compat/openai-chunk-types.js.map +1 -0
  136. package/dist/src/openai-compat/openai-compat.d.ts +2 -90
  137. package/dist/src/openai-compat/openai-compat.js +68 -68
  138. package/dist/src/openai-compat/openai-compat.js.map +1 -1
  139. package/dist/src/openai-compat/openai-types.d.ts +71 -0
  140. package/dist/src/openai-compat/openai-types.js +11 -0
  141. package/dist/src/openai-compat/openai-types.js.map +1 -0
  142. package/dist/src/openai-compat/parse-route-body.d.ts +24 -0
  143. package/dist/src/openai-compat/parse-route-body.js +45 -0
  144. package/dist/src/openai-compat/parse-route-body.js.map +1 -0
  145. package/dist/src/openai-compat/tts-rule.d.ts +20 -0
  146. package/dist/src/openai-compat/tts-rule.js +58 -0
  147. package/dist/src/openai-compat/tts-rule.js.map +1 -0
  148. package/dist/src/openai-compat/voice-recovery.js +0 -1
  149. package/dist/src/openai-compat/voice-recovery.js.map +1 -1
  150. package/dist/src/patches/cache-parity-registry.d.ts +20 -0
  151. package/dist/src/patches/cache-parity-registry.js +64 -0
  152. package/dist/src/patches/cache-parity-registry.js.map +1 -0
  153. package/dist/src/patches/claude-md-injection.d.ts +10 -0
  154. package/dist/src/patches/claude-md-injection.js +46 -0
  155. package/dist/src/patches/claude-md-injection.js.map +1 -0
  156. package/dist/src/patches/cwd-redirect.d.ts +10 -0
  157. package/dist/src/patches/cwd-redirect.js +51 -0
  158. package/dist/src/patches/cwd-redirect.js.map +1 -0
  159. package/dist/src/patches/embedded-server-route.d.ts +23 -0
  160. package/dist/src/patches/embedded-server-route.js +64 -0
  161. package/dist/src/patches/embedded-server-route.js.map +1 -0
  162. package/dist/src/patches/pricing-overrides.d.ts +10 -0
  163. package/dist/src/patches/pricing-overrides.js +55 -0
  164. package/dist/src/patches/pricing-overrides.js.map +1 -0
  165. package/dist/src/patches/resume-registry-restore.d.ts +11 -0
  166. package/dist/src/patches/resume-registry-restore.js +48 -0
  167. package/dist/src/patches/resume-registry-restore.js.map +1 -0
  168. package/dist/src/patches/session-pid-tracking.d.ts +10 -0
  169. package/dist/src/patches/session-pid-tracking.js +45 -0
  170. package/dist/src/patches/session-pid-tracking.js.map +1 -0
  171. package/dist/src/patches/sysprompt-strip.d.ts +46 -0
  172. package/dist/src/patches/sysprompt-strip.js +78 -0
  173. package/dist/src/patches/sysprompt-strip.js.map +1 -0
  174. package/dist/src/patches/sysprompt-strip.spec.d.ts +33 -0
  175. package/dist/src/patches/sysprompt-strip.spec.js +53 -0
  176. package/dist/src/patches/sysprompt-strip.spec.js.map +1 -0
  177. package/dist/src/patches/tools-restoration.d.ts +12 -0
  178. package/dist/src/patches/tools-restoration.js +43 -0
  179. package/dist/src/patches/tools-restoration.js.map +1 -0
  180. package/dist/src/persistence/migration-v0.d.ts +24 -0
  181. package/dist/src/persistence/migration-v0.js +142 -0
  182. package/dist/src/persistence/migration-v0.js.map +1 -0
  183. package/dist/src/persistence/session-registry.d.ts +57 -0
  184. package/dist/src/persistence/session-registry.js +58 -0
  185. package/dist/src/persistence/session-registry.js.map +1 -0
  186. package/dist/src/persistence/snapshot.d.ts +18 -0
  187. package/dist/src/persistence/snapshot.js +32 -0
  188. package/dist/src/persistence/snapshot.js.map +1 -0
  189. package/dist/src/persistence/wal.d.ts +17 -0
  190. package/dist/src/persistence/wal.js +32 -0
  191. package/dist/src/persistence/wal.js.map +1 -0
  192. package/dist/src/session/persisted-sessions.d.ts +26 -0
  193. package/dist/src/session/persisted-sessions.js +70 -0
  194. package/dist/src/session/persisted-sessions.js.map +1 -0
  195. package/dist/src/session/session-manager.d.ts +2 -11
  196. package/dist/src/session/session-manager.js +22 -66
  197. package/dist/src/session/session-manager.js.map +1 -1
  198. package/dist/src/session-bootstrap/boot-self-heal.d.ts +32 -0
  199. package/dist/src/session-bootstrap/boot-self-heal.js +54 -0
  200. package/dist/src/session-bootstrap/boot-self-heal.js.map +1 -0
  201. package/dist/src/session-bootstrap/cwd-patch.js +11 -87
  202. package/dist/src/session-bootstrap/cwd-patch.js.map +1 -1
  203. package/dist/src/session-bootstrap/resume-registry.d.ts +29 -0
  204. package/dist/src/session-bootstrap/resume-registry.js +58 -0
  205. package/dist/src/session-bootstrap/resume-registry.js.map +1 -0
  206. package/dist/src/session-bootstrap/session-hygiene.d.ts +23 -0
  207. package/dist/src/session-bootstrap/session-hygiene.js +41 -0
  208. package/dist/src/session-bootstrap/session-hygiene.js.map +1 -0
  209. package/dist/src/types/runtime-config.d.ts +11 -0
  210. package/dist/src/types/runtime-config.js +9 -0
  211. package/dist/src/types/runtime-config.js.map +1 -1
  212. package/package.json +1 -1
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Stale PID-keyed file cleanup — for status/sentinel files named `<pid>.json`
3
+ * in a tee directory, removes entries whose PID is no longer alive.
4
+ *
5
+ * Extracted from `live-card.ts` 2026-05-14. Pure-function utility with a
6
+ * dir-parameter shape so future callers (other PID-keyed sentinel patterns)
7
+ * can reuse without duplicating the kill(pid, 0) liveness probe.
8
+ *
9
+ * The original file-extension was `.json`; expose it as a parameter so this
10
+ * is forward-compatible with `.sock`, `.lock`, etc.
11
+ */
12
+ import { readdirSync, unlinkSync } from 'node:fs';
13
+ /**
14
+ * Remove `<pid><ext>` files in `dir` whose PID no longer exists.
15
+ * Silent on missing directory. Per-file errors are swallowed — this is
16
+ * best-effort cleanup, not a correctness guarantee.
17
+ */
18
+ export function cleanStalePidFiles(dir, ext = '.json') {
19
+ try {
20
+ const files = readdirSync(dir);
21
+ for (const file of files) {
22
+ if (!file.endsWith(ext))
23
+ continue;
24
+ const pid = parseInt(file.replace(ext, ''), 10);
25
+ if (isNaN(pid))
26
+ continue;
27
+ try {
28
+ process.kill(pid, 0);
29
+ }
30
+ catch {
31
+ try {
32
+ unlinkSync(`${dir}/${file}`);
33
+ }
34
+ catch { /* ignore */ }
35
+ }
36
+ }
37
+ }
38
+ catch { /* directory doesn't exist — nothing to clean */ }
39
+ }
40
+ //# sourceMappingURL=stale-pid-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale-pid-files.js","sourceRoot":"","sources":["../../../src/lib/stale-pid-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,MAAc,OAAO;IACnE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,GAAG,CAAC;gBAAE,SAAS;YACzB,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC;oBAAC,UAAU,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,gDAAgD,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Boot — 7-phase lifecycle orchestrator.
3
+ *
4
+ * Phase order (PRP §3.2 G6):
5
+ * 1. validate-config → ConfigSchema.parse(env + openclaw.json)
6
+ * 2. import-upstream → dynamic import("openclaw")
7
+ * 3. validate-upstream → PatchManifest.validate() — ALL probes; fail-loud
8
+ * 4. install-patches → PatchManifest.install() — atomic after probes pass
9
+ * 5. wire-handlers → EventBus subscribers wired BEFORE traffic
10
+ * 6. start-server → openai-compat HTTP listener up
11
+ * 7. schedule-jobs → registry snapshot + watchdog timers
12
+ * → ready → emit "boot.ready" event
13
+ *
14
+ * Every phase fails loud — no silent skip.
15
+ * <300 LOC target; dependencies injected to allow dry-running phases 1-3
16
+ * from `cc-openclaw doctor`.
17
+ */
18
+ import { type Config } from '../config/schema.js';
19
+ import { type StartServerOptions } from './phase-start-server.js';
20
+ import { PatchManifest } from './patch-manifest.js';
21
+ import { EventBus } from '../observability/event-bus.js';
22
+ import { SessionRegistry } from '../persistence/session-registry.js';
23
+ export type BootPhase = 'validate-config' | 'import-upstream' | 'validate-upstream' | 'install-patches' | 'wire-handlers' | 'start-server' | 'schedule-jobs' | 'ready';
24
+ export interface BootOptions {
25
+ manifest?: PatchManifest;
26
+ bus?: EventBus;
27
+ registry?: SessionRegistry;
28
+ serverOptions?: StartServerOptions;
29
+ /**
30
+ * When true, stops after phase 3 (validate-upstream) without installing
31
+ * patches or starting the server. Used by `cc-openclaw doctor`.
32
+ */
33
+ dryRun?: boolean;
34
+ }
35
+ export declare class Boot {
36
+ private readonly manifest;
37
+ private readonly bus;
38
+ private readonly registry;
39
+ private readonly serverOptions;
40
+ private readonly dryRun;
41
+ constructor(opts?: BootOptions);
42
+ /**
43
+ * Run all 7 phases (or phases 1-3 in dry-run mode).
44
+ * Throws BootPhaseError wrapping the underlying error with a phase key.
45
+ */
46
+ run(): Promise<Config>;
47
+ private runPhase;
48
+ }
49
+ export declare class BootPhaseError extends Error {
50
+ readonly phase: BootPhase;
51
+ readonly cause: Error;
52
+ constructor(phase: BootPhase, cause: Error);
53
+ /** True when the underlying error is a DriftError (phase 3 failure). */
54
+ get isDrift(): boolean;
55
+ /** True when the underlying error is a ConfigInvalid (phase 1 failure). */
56
+ get isConfigInvalid(): boolean;
57
+ /** Remediation message suitable for `cc-openclaw doctor` output. */
58
+ remediation(): string;
59
+ }
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Boot — 7-phase lifecycle orchestrator.
3
+ *
4
+ * Phase order (PRP §3.2 G6):
5
+ * 1. validate-config → ConfigSchema.parse(env + openclaw.json)
6
+ * 2. import-upstream → dynamic import("openclaw")
7
+ * 3. validate-upstream → PatchManifest.validate() — ALL probes; fail-loud
8
+ * 4. install-patches → PatchManifest.install() — atomic after probes pass
9
+ * 5. wire-handlers → EventBus subscribers wired BEFORE traffic
10
+ * 6. start-server → openai-compat HTTP listener up
11
+ * 7. schedule-jobs → registry snapshot + watchdog timers
12
+ * → ready → emit "boot.ready" event
13
+ *
14
+ * Every phase fails loud — no silent skip.
15
+ * <300 LOC target; dependencies injected to allow dry-running phases 1-3
16
+ * from `cc-openclaw doctor`.
17
+ */
18
+ import { DriftError, ConfigInvalid } from '../lib/domain-error.js';
19
+ import { validateConfig } from './phase-validate-config.js';
20
+ import { importUpstream } from './phase-import-upstream.js';
21
+ import { validateUpstream } from './phase-validate-upstream.js';
22
+ import { installPatches } from './phase-install-patches.js';
23
+ import { wireHandlers } from './phase-wire-handlers.js';
24
+ import { startServer } from './phase-start-server.js';
25
+ import { scheduleJobs } from './phase-schedule-jobs.js';
26
+ import { PatchManifest } from './patch-manifest.js';
27
+ import { EventBus } from '../observability/event-bus.js';
28
+ import { SessionRegistry } from '../persistence/session-registry.js';
29
+ // ── Boot class ────────────────────────────────────────────────────────────────
30
+ export class Boot {
31
+ manifest;
32
+ bus;
33
+ registry;
34
+ serverOptions;
35
+ dryRun;
36
+ constructor(opts = {}) {
37
+ this.manifest = opts.manifest ?? new PatchManifest();
38
+ this.bus = opts.bus ?? new EventBus();
39
+ this.registry = opts.registry ?? new SessionRegistry();
40
+ this.serverOptions = opts.serverOptions ?? {};
41
+ this.dryRun = opts.dryRun ?? false;
42
+ }
43
+ /**
44
+ * Run all 7 phases (or phases 1-3 in dry-run mode).
45
+ * Throws BootPhaseError wrapping the underlying error with a phase key.
46
+ */
47
+ async run() {
48
+ // Phase 1 — validate-config
49
+ const config = await this.runPhase('validate-config', () => {
50
+ return validateConfig();
51
+ });
52
+ // Phase 2 — import-upstream
53
+ const upstreamNs = await this.runPhase('import-upstream', () => importUpstream());
54
+ // Phase 3 — validate-upstream
55
+ await this.runPhase('validate-upstream', () => validateUpstream(this.manifest, upstreamNs));
56
+ if (this.dryRun) {
57
+ return config;
58
+ }
59
+ // Phase 4 — install-patches
60
+ await this.runPhase('install-patches', () => {
61
+ installPatches(this.manifest, upstreamNs);
62
+ });
63
+ // Phase 5 — wire-handlers (BEFORE traffic)
64
+ await this.runPhase('wire-handlers', () => {
65
+ wireHandlers(this.bus);
66
+ });
67
+ // Phase 6 — start-server
68
+ await this.runPhase('start-server', () => startServer(this.serverOptions));
69
+ // Phase 7 — schedule-jobs
70
+ await this.runPhase('schedule-jobs', () => {
71
+ scheduleJobs(this.registry);
72
+ });
73
+ // Ready
74
+ this.bus.emit('boot.ready', { config });
75
+ return config;
76
+ }
77
+ // ── Internal ────────────────────────────────────────────────────────────────
78
+ async runPhase(phase, fn) {
79
+ try {
80
+ return await Promise.resolve(fn());
81
+ }
82
+ catch (err) {
83
+ const error = err instanceof Error ? err : new Error(String(err));
84
+ const phaseError = new BootPhaseError(phase, error);
85
+ throw phaseError;
86
+ }
87
+ }
88
+ }
89
+ // ── BootPhaseError ────────────────────────────────────────────────────────────
90
+ export class BootPhaseError extends Error {
91
+ phase;
92
+ cause;
93
+ constructor(phase, cause) {
94
+ super(`Boot failed at phase "${phase}": ${cause.message}`);
95
+ this.phase = phase;
96
+ this.cause = cause;
97
+ this.name = 'BootPhaseError';
98
+ Object.setPrototypeOf(this, new.target.prototype);
99
+ }
100
+ /** True when the underlying error is a DriftError (phase 3 failure). */
101
+ get isDrift() {
102
+ return this.cause instanceof DriftError;
103
+ }
104
+ /** True when the underlying error is a ConfigInvalid (phase 1 failure). */
105
+ get isConfigInvalid() {
106
+ return this.cause instanceof ConfigInvalid;
107
+ }
108
+ /** Remediation message suitable for `cc-openclaw doctor` output. */
109
+ remediation() {
110
+ if (this.isConfigInvalid) {
111
+ const ci = this.cause;
112
+ return [
113
+ `Phase "${this.phase}" failed: configuration invalid.`,
114
+ `Check env vars (OPENCLAW_CC_OPENCLAW_ACTIVE, CC_OPENCLAW_*) and`,
115
+ `~/.openclaw/openclaw.json.`,
116
+ `Issues:`,
117
+ ...ci.issues.map((i) => ` - ${i}`),
118
+ ].join('\n');
119
+ }
120
+ if (this.isDrift) {
121
+ const de = this.cause;
122
+ return [
123
+ `Phase "${this.phase}" failed: upstream Claude Code shape has drifted.`,
124
+ `Run "openclaw update" to refresh cc-openclaw, or pin the Claude Code version.`,
125
+ `Failing specs:`,
126
+ ...de.failedSpecs.map((s) => ` - [${s.id}] ${s.reason}`),
127
+ ].join('\n');
128
+ }
129
+ return `Phase "${this.phase}" failed: ${this.cause.message}`;
130
+ }
131
+ }
132
+ //# sourceMappingURL=boot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot.js","sourceRoot":"","sources":["../../../src/lifecycle/boot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * PatchManifest — declarative registry for prototype-patch specs.
3
+ *
4
+ * Each PatchSpec declares:
5
+ * - expectedShape: synchronous probe (signature / property existence)
6
+ * - expectedBehavior: async runtime probe (tiny smoke test)
7
+ * - install / uninstall: the actual mutation
8
+ *
9
+ * Boot phase 3 calls validate() — runs ALL probes.
10
+ * If ANY fail, throws DriftError listing every failing spec.
11
+ * Boot is refused; nothing is installed. No silent no-ops.
12
+ *
13
+ * Boot phase 4 calls install() — installs ALL specs atomically
14
+ * (i.e. only after validate() has passed).
15
+ */
16
+ export interface PatchSpec<T = unknown> {
17
+ /** Stable identifier used in drift reports and mutation tests. */
18
+ id: string;
19
+ /** e.g. "claude-code/dist/session/SessionManager" — informational */
20
+ targetModule: string;
21
+ /** e.g. "SessionManager.prototype.startSession" — informational */
22
+ targetSymbol: string;
23
+ /**
24
+ * Resolve the live target. Called once per probe + install operation.
25
+ * Each spec resolves its own target — different specs target different
26
+ * upstream symbols, so a single global target is the wrong abstraction.
27
+ *
28
+ * **Async-compatible** (since Phase E#3 architectural finding 2026-05-13):
29
+ * may return `T` directly OR a `Promise<T>`. ESM upstream packages with
30
+ * top-level await (e.g. `openclaw`) cannot be loaded via sync `require()`;
31
+ * they require `await import()`. PatchManifest awaits the return value
32
+ * uniformly. Per PRP §3.2 G1.
33
+ */
34
+ resolve: () => T | Promise<T>;
35
+ /**
36
+ * Synchronous shape probe. Returns true when the symbol exists with the
37
+ * expected signature (property count, method name, etc.).
38
+ * Must NOT mutate the target.
39
+ */
40
+ expectedShape: (target: T) => boolean;
41
+ /**
42
+ * Async behavior probe. Returns true when a minimal smoke invocation
43
+ * demonstrates the expected behavior contract.
44
+ * Must NOT mutate the target; must be fast (<100ms).
45
+ */
46
+ expectedBehavior: (target: T) => Promise<boolean>;
47
+ /**
48
+ * Apply the patch. Called only after validate() passes for all specs.
49
+ */
50
+ install: (target: T) => void;
51
+ /**
52
+ * Revert the patch. Called on emergency rollback or unload.
53
+ */
54
+ uninstall: (target: T) => void;
55
+ }
56
+ export declare class PatchManifest {
57
+ private readonly specs;
58
+ private installed;
59
+ /**
60
+ * Register a PatchSpec. Order of registration determines install order.
61
+ * Idempotent on same id — re-registering the same id is a no-op.
62
+ */
63
+ register<T = unknown>(spec: PatchSpec<T>): void;
64
+ /**
65
+ * Boot phase 3: run ALL expectedShape + expectedBehavior probes.
66
+ * If any fail, throws DriftError listing ALL failures.
67
+ * Never installs on probe failure.
68
+ */
69
+ validate(): Promise<void>;
70
+ /**
71
+ * Boot phase 4: install ALL specs.
72
+ * Must only be called after validate() passes (enforced by Boot orchestrator).
73
+ */
74
+ install(): Promise<void>;
75
+ /**
76
+ * Emergency rollback — uninstalls in reverse registration order.
77
+ */
78
+ uninstall(): Promise<void>;
79
+ get isInstalled(): boolean;
80
+ get size(): number;
81
+ ids(): string[];
82
+ }
@@ -0,0 +1,126 @@
1
+ /**
2
+ * PatchManifest — declarative registry for prototype-patch specs.
3
+ *
4
+ * Each PatchSpec declares:
5
+ * - expectedShape: synchronous probe (signature / property existence)
6
+ * - expectedBehavior: async runtime probe (tiny smoke test)
7
+ * - install / uninstall: the actual mutation
8
+ *
9
+ * Boot phase 3 calls validate() — runs ALL probes.
10
+ * If ANY fail, throws DriftError listing every failing spec.
11
+ * Boot is refused; nothing is installed. No silent no-ops.
12
+ *
13
+ * Boot phase 4 calls install() — installs ALL specs atomically
14
+ * (i.e. only after validate() has passed).
15
+ */
16
+ import { DriftError } from '../lib/domain-error.js';
17
+ // ── PatchManifest class ───────────────────────────────────────────────────────
18
+ export class PatchManifest {
19
+ specs = [];
20
+ installed = false;
21
+ /**
22
+ * Register a PatchSpec. Order of registration determines install order.
23
+ * Idempotent on same id — re-registering the same id is a no-op.
24
+ */
25
+ register(spec) {
26
+ const existing = this.specs.find((s) => s.id === spec.id);
27
+ if (existing)
28
+ return;
29
+ this.specs.push(spec);
30
+ }
31
+ /**
32
+ * Boot phase 3: run ALL expectedShape + expectedBehavior probes.
33
+ * If any fail, throws DriftError listing ALL failures.
34
+ * Never installs on probe failure.
35
+ */
36
+ async validate() {
37
+ const failures = [];
38
+ for (const spec of this.specs) {
39
+ // Resolve target — each spec resolves its own upstream symbol.
40
+ // Awaiting handles both sync (T) and async (Promise<T>) returns.
41
+ let target;
42
+ try {
43
+ target = await spec.resolve();
44
+ }
45
+ catch (err) {
46
+ failures.push({
47
+ id: spec.id,
48
+ reason: `resolve threw: ${err instanceof Error ? err.message : String(err)}`,
49
+ });
50
+ continue;
51
+ }
52
+ // Shape probe — synchronous
53
+ let shapeOk = false;
54
+ try {
55
+ shapeOk = spec.expectedShape(target);
56
+ }
57
+ catch (err) {
58
+ shapeOk = false;
59
+ failures.push({
60
+ id: spec.id,
61
+ reason: `expectedShape threw: ${err instanceof Error ? err.message : String(err)}`,
62
+ });
63
+ continue;
64
+ }
65
+ if (!shapeOk) {
66
+ failures.push({ id: spec.id, reason: 'expectedShape returned false' });
67
+ continue;
68
+ }
69
+ // Behavior probe — async
70
+ let behaviorOk = false;
71
+ try {
72
+ behaviorOk = await spec.expectedBehavior(target);
73
+ }
74
+ catch (err) {
75
+ failures.push({
76
+ id: spec.id,
77
+ reason: `expectedBehavior threw: ${err instanceof Error ? err.message : String(err)}`,
78
+ });
79
+ continue;
80
+ }
81
+ if (!behaviorOk) {
82
+ failures.push({ id: spec.id, reason: 'expectedBehavior returned false' });
83
+ }
84
+ }
85
+ if (failures.length > 0) {
86
+ throw new DriftError(failures);
87
+ }
88
+ }
89
+ /**
90
+ * Boot phase 4: install ALL specs.
91
+ * Must only be called after validate() passes (enforced by Boot orchestrator).
92
+ */
93
+ async install() {
94
+ for (const spec of this.specs) {
95
+ const target = await spec.resolve();
96
+ spec.install(target);
97
+ }
98
+ this.installed = true;
99
+ }
100
+ /**
101
+ * Emergency rollback — uninstalls in reverse registration order.
102
+ */
103
+ async uninstall() {
104
+ for (let i = this.specs.length - 1; i >= 0; i--) {
105
+ try {
106
+ const spec = this.specs[i];
107
+ const target = await spec.resolve();
108
+ spec.uninstall(target);
109
+ }
110
+ catch {
111
+ // Best-effort; continue uninstalling others.
112
+ }
113
+ }
114
+ this.installed = false;
115
+ }
116
+ get isInstalled() {
117
+ return this.installed;
118
+ }
119
+ get size() {
120
+ return this.specs.length;
121
+ }
122
+ ids() {
123
+ return this.specs.map((s) => s.id);
124
+ }
125
+ }
126
+ //# sourceMappingURL=patch-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-manifest.js","sourceRoot":"","sources":["../../../src/lifecycle/patch-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Phase 2 — import-upstream
3
+ *
4
+ * Dynamically imports the "openclaw" package and returns its namespace as
5
+ * `unknown`. Zero `any`. The caller (boot.ts / phase 3) is responsible for
6
+ * narrowing the shape via PatchManifest.validate().
7
+ *
8
+ * Using a variable-held specifier prevents tsc from attempting static
9
+ * resolution of the peer-dependency at build time (same pattern as doctor.ts
10
+ * check_bridge_wiring).
11
+ */
12
+ export declare function importUpstream(): Promise<unknown>;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Phase 2 — import-upstream
3
+ *
4
+ * Dynamically imports the "openclaw" package and returns its namespace as
5
+ * `unknown`. Zero `any`. The caller (boot.ts / phase 3) is responsible for
6
+ * narrowing the shape via PatchManifest.validate().
7
+ *
8
+ * Using a variable-held specifier prevents tsc from attempting static
9
+ * resolution of the peer-dependency at build time (same pattern as doctor.ts
10
+ * check_bridge_wiring).
11
+ */
12
+ export async function importUpstream() {
13
+ // Held in a variable to suppress tsc static-resolution attempt.
14
+ const specifier = 'openclaw';
15
+ const ns = await import(specifier);
16
+ return ns;
17
+ }
18
+ //# sourceMappingURL=phase-import-upstream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-import-upstream.js","sourceRoot":"","sources":["../../../src/lifecycle/phase-import-upstream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,gEAAgE;IAChE,MAAM,SAAS,GAAG,UAAU,CAAC;IAC7B,MAAM,EAAE,GAAY,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Phase 4 — install-patches
3
+ *
4
+ * Calls manifest.install() atomically — only reached after phase 3
5
+ * (validate-upstream) passes. All probes have already confirmed the
6
+ * expected shape; install proceeds without further checks.
7
+ *
8
+ * On any install error, attempts manifest.uninstall() as best-effort rollback
9
+ * before re-throwing so boot fails loud.
10
+ */
11
+ import type { PatchManifest } from './patch-manifest.js';
12
+ export declare function installPatches(manifest: PatchManifest, _upstreamNs: unknown): Promise<void>;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Phase 4 — install-patches
3
+ *
4
+ * Calls manifest.install() atomically — only reached after phase 3
5
+ * (validate-upstream) passes. All probes have already confirmed the
6
+ * expected shape; install proceeds without further checks.
7
+ *
8
+ * On any install error, attempts manifest.uninstall() as best-effort rollback
9
+ * before re-throwing so boot fails loud.
10
+ */
11
+ export async function installPatches(manifest, _upstreamNs) {
12
+ // Note: upstreamNs is unused — each PatchSpec resolves its own target via
13
+ // PatchSpec.resolve() (PRP §3.2 G1). The parameter is kept in the signature
14
+ // for boot.ts wiring symmetry; spec.resolve() implementations close over
15
+ // their own upstream symbol lookups. Async since v1.0.0-rc1 to support
16
+ // ESM upstream packages with top-level await.
17
+ try {
18
+ await manifest.install();
19
+ }
20
+ catch (err) {
21
+ // Best-effort rollback before propagating.
22
+ try {
23
+ await manifest.uninstall();
24
+ }
25
+ catch {
26
+ // Rollback failure is secondary; original error takes precedence.
27
+ }
28
+ throw err;
29
+ }
30
+ }
31
+ //# sourceMappingURL=phase-install-patches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-install-patches.js","sourceRoot":"","sources":["../../../src/lifecycle/phase-install-patches.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAuB,EAAE,WAAoB;IAChF,0EAA0E;IAC1E,4EAA4E;IAC5E,yEAAyE;IACzE,uEAAuE;IACvE,8CAA8C;IAC9C,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2CAA2C;QAC3C,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Phase 7 — schedule-jobs
3
+ *
4
+ * Sets up recurring background tasks (stub):
5
+ * - SessionRegistry.snapshot() on a configurable interval (default 5 min)
6
+ * - Stalled-session watchdog timer
7
+ * - Runaway-loop watchdog
8
+ *
9
+ * Phase E wires real timers here.
10
+ */
11
+ import type { SessionRegistry } from '../persistence/session-registry.js';
12
+ export declare function scheduleJobs(_registry: SessionRegistry): void;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Phase 7 — schedule-jobs
3
+ *
4
+ * Sets up recurring background tasks (stub):
5
+ * - SessionRegistry.snapshot() on a configurable interval (default 5 min)
6
+ * - Stalled-session watchdog timer
7
+ * - Runaway-loop watchdog
8
+ *
9
+ * Phase E wires real timers here.
10
+ */
11
+ export function scheduleJobs(_registry) {
12
+ // Phase E: wire setInterval for registry.snapshot() + watchdog timers.
13
+ // Stub — no-op in Phase D.
14
+ }
15
+ //# sourceMappingURL=phase-schedule-jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-schedule-jobs.js","sourceRoot":"","sources":["../../../src/lifecycle/phase-schedule-jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,UAAU,YAAY,CAAC,SAA0B;IACrD,uEAAuE;IACvE,2BAA2B;AAC7B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Phase 6 — start-server
3
+ *
4
+ * Starts the openai-compat HTTP server (stub).
5
+ * Phase E wires the real server instantiation here.
6
+ */
7
+ export interface StartServerOptions {
8
+ /** Port the openai-compat HTTP server listens on. Default: 18796. */
9
+ port?: number;
10
+ }
11
+ export declare function startServer(_opts?: StartServerOptions): Promise<void>;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Phase 6 — start-server
3
+ *
4
+ * Starts the openai-compat HTTP server (stub).
5
+ * Phase E wires the real server instantiation here.
6
+ */
7
+ export async function startServer(_opts = {}) {
8
+ // Phase E: instantiate EmbeddedServer / openai-compat HTTP listener here.
9
+ // Stub — no-op in Phase D.
10
+ }
11
+ //# sourceMappingURL=phase-start-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-start-server.js","sourceRoot":"","sources":["../../../src/lifecycle/phase-start-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAA4B,EAAE;IAC9D,0EAA0E;IAC1E,2BAA2B;AAC7B,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Phase 1 — validate-config
3
+ *
4
+ * Calls ConfigSchema.parse(loadConfigSources()).
5
+ * Throws ConfigInvalid (wrapping zod issues) on failure.
6
+ * Boot refuses with a phase-keyed message.
7
+ */
8
+ import { type Config } from '../config/schema.js';
9
+ export declare function validateConfig(): Config;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Phase 1 — validate-config
3
+ *
4
+ * Calls ConfigSchema.parse(loadConfigSources()).
5
+ * Throws ConfigInvalid (wrapping zod issues) on failure.
6
+ * Boot refuses with a phase-keyed message.
7
+ */
8
+ import { ZodError } from 'zod';
9
+ import { ConfigSchema } from '../config/schema.js';
10
+ import { loadConfigSources } from '../config/loader.js';
11
+ import { ConfigInvalid } from '../lib/domain-error.js';
12
+ export function validateConfig() {
13
+ const raw = loadConfigSources();
14
+ try {
15
+ return ConfigSchema.parse(raw);
16
+ }
17
+ catch (err) {
18
+ if (err instanceof ZodError) {
19
+ const issues = err.issues.map((i) => `${i.path.join('.')}: ${i.message}`);
20
+ throw new ConfigInvalid('configuration validation failed', issues);
21
+ }
22
+ throw new ConfigInvalid('configuration validation failed (unexpected error)', [String(err)]);
23
+ }
24
+ }
25
+ //# sourceMappingURL=phase-validate-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-validate-config.js","sourceRoot":"","sources":["../../../src/lifecycle/phase-validate-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1E,MAAM,IAAI,aAAa,CAAC,iCAAiC,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,IAAI,aAAa,CACrB,oDAAoD,EACpD,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CACd,CAAC;IACJ,CAAC;AACH,CAAC"}