@a1hvdy/cc-openclaw 0.10.4 → 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 (473) hide show
  1. package/dist/src/channels/telegram/card-renderer.d.ts +63 -0
  2. package/dist/src/channels/telegram/card-renderer.js +149 -0
  3. package/dist/src/channels/telegram/card-renderer.js.map +1 -0
  4. package/dist/src/channels/telegram/event-reducer.js +3 -15
  5. package/dist/src/channels/telegram/event-reducer.js.map +1 -1
  6. package/dist/src/channels/telegram/format-helpers.d.ts +20 -0
  7. package/dist/src/channels/telegram/format-helpers.js +34 -0
  8. package/dist/src/channels/telegram/format-helpers.js.map +1 -0
  9. package/dist/src/channels/telegram/insight-formatter.d.ts +36 -0
  10. package/dist/src/channels/telegram/insight-formatter.js +36 -0
  11. package/dist/src/channels/telegram/insight-formatter.js.map +1 -0
  12. package/dist/src/channels/telegram/live-card.d.ts +7 -90
  13. package/dist/src/channels/telegram/live-card.js +25 -286
  14. package/dist/src/channels/telegram/live-card.js.map +1 -1
  15. package/dist/src/channels/telegram/logger.d.ts +10 -0
  16. package/dist/src/channels/telegram/logger.js +13 -0
  17. package/dist/src/channels/telegram/logger.js.map +1 -0
  18. package/dist/src/channels/telegram/result-preview.d.ts +12 -0
  19. package/dist/src/channels/telegram/result-preview.js +48 -0
  20. package/dist/src/channels/telegram/result-preview.js.map +1 -0
  21. package/dist/src/channels/telegram/throttle-controller.d.ts +54 -0
  22. package/dist/src/channels/telegram/throttle-controller.js +132 -0
  23. package/dist/src/channels/telegram/throttle-controller.js.map +1 -0
  24. package/dist/src/channels/telegram/tool-tracker.d.ts +1 -2
  25. package/dist/src/channels/telegram/tool-tracker.js +9 -51
  26. package/dist/src/channels/telegram/tool-tracker.js.map +1 -1
  27. package/dist/src/cli/checks/bridge-wiring.d.ts +14 -0
  28. package/dist/src/cli/checks/bridge-wiring.js +64 -0
  29. package/dist/src/cli/checks/bridge-wiring.js.map +1 -0
  30. package/dist/src/cli/checks/config-schema.d.ts +11 -0
  31. package/dist/src/cli/checks/config-schema.js +51 -0
  32. package/dist/src/cli/checks/config-schema.js.map +1 -0
  33. package/dist/src/cli/checks/critical-openclaw-json-keys.d.ts +21 -0
  34. package/dist/src/cli/checks/critical-openclaw-json-keys.js +106 -0
  35. package/dist/src/cli/checks/critical-openclaw-json-keys.js.map +1 -0
  36. package/dist/src/cli/checks/install-path.d.ts +11 -0
  37. package/dist/src/cli/checks/install-path.js +89 -0
  38. package/dist/src/cli/checks/install-path.js.map +1 -0
  39. package/dist/src/cli/checks/patch-scaffold.d.ts +17 -0
  40. package/dist/src/cli/checks/patch-scaffold.js +56 -0
  41. package/dist/src/cli/checks/patch-scaffold.js.map +1 -0
  42. package/dist/src/cli/doctor.d.ts +20 -0
  43. package/dist/src/cli/doctor.js +93 -0
  44. package/dist/src/cli/doctor.js.map +1 -0
  45. package/dist/src/cli/index.d.ts +8 -0
  46. package/dist/src/cli/index.js +39 -0
  47. package/dist/src/cli/index.js.map +1 -0
  48. package/dist/src/cli/migrate.d.ts +29 -0
  49. package/dist/src/cli/migrate.js +75 -0
  50. package/dist/src/cli/migrate.js.map +1 -0
  51. package/dist/src/command-router/cc-handler.js +35 -709
  52. package/dist/src/command-router/cc-handler.js.map +1 -1
  53. package/dist/src/command-router/launch-policy.d.ts +93 -0
  54. package/dist/src/command-router/launch-policy.js +323 -0
  55. package/dist/src/command-router/launch-policy.js.map +1 -0
  56. package/dist/src/command-router/resume-policy.d.ts +18 -0
  57. package/dist/src/command-router/resume-policy.js +236 -0
  58. package/dist/src/command-router/resume-policy.js.map +1 -0
  59. package/dist/src/command-router/turn-formatter.d.ts +19 -0
  60. package/dist/src/command-router/turn-formatter.js +144 -0
  61. package/dist/src/command-router/turn-formatter.js.map +1 -0
  62. package/dist/src/config/drift-detector.d.ts +28 -0
  63. package/dist/src/config/drift-detector.js +75 -0
  64. package/dist/src/config/drift-detector.js.map +1 -0
  65. package/dist/src/config/loader.d.ts +8 -0
  66. package/dist/src/config/loader.js +69 -0
  67. package/dist/src/config/loader.js.map +1 -0
  68. package/dist/src/config/schema.d.ts +188 -0
  69. package/dist/src/config/schema.js +98 -0
  70. package/dist/src/config/schema.js.map +1 -0
  71. package/dist/src/council/build-agent-prompt.d.ts +11 -0
  72. package/dist/src/council/build-agent-prompt.js +96 -0
  73. package/dist/src/council/build-agent-prompt.js.map +1 -0
  74. package/dist/src/council/cleanup-worktrees.d.ts +10 -0
  75. package/dist/src/council/cleanup-worktrees.js +22 -0
  76. package/dist/src/council/cleanup-worktrees.js.map +1 -0
  77. package/dist/src/council/council.js +15 -186
  78. package/dist/src/council/council.js.map +1 -1
  79. package/dist/src/council/system-prompt.d.ts +16 -0
  80. package/dist/src/council/system-prompt.js +40 -0
  81. package/dist/src/council/system-prompt.js.map +1 -0
  82. package/dist/src/council/write-worktree-claude-md.d.ts +10 -0
  83. package/dist/src/council/write-worktree-claude-md.js +41 -0
  84. package/dist/src/council/write-worktree-claude-md.js.map +1 -0
  85. package/dist/src/engines/persistent-custom-session.js +3 -8
  86. package/dist/src/engines/persistent-custom-session.js.map +1 -1
  87. package/dist/src/engines/resolve-bin.d.ts +14 -0
  88. package/dist/src/engines/resolve-bin.js +18 -0
  89. package/dist/src/engines/resolve-bin.js.map +1 -0
  90. package/dist/src/lib/config-service.js +8 -0
  91. package/dist/src/lib/config-service.js.map +1 -1
  92. package/dist/src/lib/debounce.d.ts +12 -0
  93. package/dist/src/lib/debounce.js +23 -0
  94. package/dist/src/lib/debounce.js.map +1 -0
  95. package/dist/src/lib/domain-error.d.ts +59 -0
  96. package/dist/src/lib/domain-error.js +79 -0
  97. package/dist/src/lib/domain-error.js.map +1 -0
  98. package/dist/src/lib/json-array.d.ts +10 -0
  99. package/dist/src/lib/json-array.js +23 -0
  100. package/dist/src/lib/json-array.js.map +1 -0
  101. package/dist/src/lib/safe-upstream-probes.d.ts +25 -0
  102. package/dist/src/lib/safe-upstream-probes.js +42 -0
  103. package/dist/src/lib/safe-upstream-probes.js.map +1 -0
  104. package/dist/src/lib/spawn-async.d.ts +18 -0
  105. package/dist/src/lib/spawn-async.js +47 -0
  106. package/dist/src/lib/spawn-async.js.map +1 -0
  107. package/dist/src/lib/stale-pid-files.d.ts +17 -0
  108. package/dist/src/lib/stale-pid-files.js +40 -0
  109. package/dist/src/lib/stale-pid-files.js.map +1 -0
  110. package/dist/src/lifecycle/boot.d.ts +59 -0
  111. package/dist/src/lifecycle/boot.js +132 -0
  112. package/dist/src/lifecycle/boot.js.map +1 -0
  113. package/dist/src/lifecycle/patch-manifest.d.ts +82 -0
  114. package/dist/src/lifecycle/patch-manifest.js +126 -0
  115. package/dist/src/lifecycle/patch-manifest.js.map +1 -0
  116. package/dist/src/lifecycle/phase-import-upstream.d.ts +12 -0
  117. package/dist/src/lifecycle/phase-import-upstream.js +18 -0
  118. package/dist/src/lifecycle/phase-import-upstream.js.map +1 -0
  119. package/dist/src/lifecycle/phase-install-patches.d.ts +12 -0
  120. package/dist/src/lifecycle/phase-install-patches.js +31 -0
  121. package/dist/src/lifecycle/phase-install-patches.js.map +1 -0
  122. package/dist/src/lifecycle/phase-schedule-jobs.d.ts +12 -0
  123. package/dist/src/lifecycle/phase-schedule-jobs.js +15 -0
  124. package/dist/src/lifecycle/phase-schedule-jobs.js.map +1 -0
  125. package/dist/src/lifecycle/phase-start-server.d.ts +11 -0
  126. package/dist/src/lifecycle/phase-start-server.js +11 -0
  127. package/dist/src/lifecycle/phase-start-server.js.map +1 -0
  128. package/dist/src/lifecycle/phase-validate-config.d.ts +9 -0
  129. package/dist/src/lifecycle/phase-validate-config.js +25 -0
  130. package/dist/src/lifecycle/phase-validate-config.js.map +1 -0
  131. package/dist/src/lifecycle/phase-validate-upstream.d.ts +11 -0
  132. package/dist/src/lifecycle/phase-validate-upstream.js +16 -0
  133. package/dist/src/lifecycle/phase-validate-upstream.js.map +1 -0
  134. package/dist/src/lifecycle/phase-wire-handlers.d.ts +12 -0
  135. package/dist/src/lifecycle/phase-wire-handlers.js +16 -0
  136. package/dist/src/lifecycle/phase-wire-handlers.js.map +1 -0
  137. package/dist/src/observability/event-bus.d.ts +65 -0
  138. package/dist/src/observability/event-bus.js +52 -0
  139. package/dist/src/observability/event-bus.js.map +1 -0
  140. package/dist/src/observability/get-event-bus.d.ts +25 -0
  141. package/dist/src/observability/get-event-bus.js +34 -0
  142. package/dist/src/observability/get-event-bus.js.map +1 -0
  143. package/dist/src/observability/observability-service.d.ts +19 -0
  144. package/dist/src/observability/observability-service.js +24 -0
  145. package/dist/src/observability/observability-service.js.map +1 -0
  146. package/dist/src/observability/subscribers/metrics.d.ts +11 -0
  147. package/dist/src/observability/subscribers/metrics.js +21 -0
  148. package/dist/src/observability/subscribers/metrics.js.map +1 -0
  149. package/dist/src/observability/subscribers/session-capture.d.ts +15 -0
  150. package/dist/src/observability/subscribers/session-capture.js +25 -0
  151. package/dist/src/observability/subscribers/session-capture.js.map +1 -0
  152. package/dist/src/openai-compat/bridges/allowlist.d.ts +19 -0
  153. package/dist/src/openai-compat/bridges/allowlist.js +28 -0
  154. package/dist/src/openai-compat/bridges/allowlist.js.map +1 -0
  155. package/dist/src/openai-compat/bridges/factory.d.ts +30 -0
  156. package/dist/src/openai-compat/bridges/factory.js +84 -0
  157. package/dist/src/openai-compat/bridges/factory.js.map +1 -0
  158. package/dist/src/openai-compat/bridges/media-bridge.d.ts +34 -0
  159. package/dist/src/openai-compat/bridges/media-bridge.js +20 -0
  160. package/dist/src/openai-compat/bridges/media-bridge.js.map +1 -0
  161. package/dist/src/openai-compat/bridges/openclaw-api-shim.d.ts +54 -0
  162. package/dist/src/openai-compat/bridges/openclaw-api-shim.js +45 -0
  163. package/dist/src/openai-compat/bridges/openclaw-api-shim.js.map +1 -0
  164. package/dist/src/openai-compat/bridges/openclaw-native-tools.d.ts +61 -0
  165. package/dist/src/openai-compat/bridges/openclaw-native-tools.js +171 -0
  166. package/dist/src/openai-compat/bridges/openclaw-native-tools.js.map +1 -0
  167. package/dist/src/openai-compat/bridges/openclaw-tool-registry.d.ts +26 -0
  168. package/dist/src/openai-compat/bridges/openclaw-tool-registry.js +38 -0
  169. package/dist/src/openai-compat/bridges/openclaw-tool-registry.js.map +1 -0
  170. package/dist/src/openai-compat/bridges/tts-media-bridge.d.ts +19 -0
  171. package/dist/src/openai-compat/bridges/tts-media-bridge.js +59 -0
  172. package/dist/src/openai-compat/bridges/tts-media-bridge.js.map +1 -0
  173. package/dist/src/openai-compat/openai-chunk-types.d.ts +35 -0
  174. package/dist/src/openai-compat/openai-chunk-types.js +9 -0
  175. package/dist/src/openai-compat/openai-chunk-types.js.map +1 -0
  176. package/dist/src/openai-compat/openai-compat.d.ts +2 -90
  177. package/dist/src/openai-compat/openai-compat.js +68 -68
  178. package/dist/src/openai-compat/openai-compat.js.map +1 -1
  179. package/dist/src/openai-compat/openai-types.d.ts +71 -0
  180. package/dist/src/openai-compat/openai-types.js +11 -0
  181. package/dist/src/openai-compat/openai-types.js.map +1 -0
  182. package/dist/src/openai-compat/parse-route-body.d.ts +24 -0
  183. package/dist/src/openai-compat/parse-route-body.js +45 -0
  184. package/dist/src/openai-compat/parse-route-body.js.map +1 -0
  185. package/dist/src/openai-compat/tts-rule.d.ts +20 -0
  186. package/dist/src/openai-compat/tts-rule.js +58 -0
  187. package/dist/src/openai-compat/tts-rule.js.map +1 -0
  188. package/dist/src/openai-compat/voice-recovery.js +0 -1
  189. package/dist/src/openai-compat/voice-recovery.js.map +1 -1
  190. package/dist/src/patches/cache-parity-registry.d.ts +20 -0
  191. package/dist/src/patches/cache-parity-registry.js +64 -0
  192. package/dist/src/patches/cache-parity-registry.js.map +1 -0
  193. package/dist/src/patches/claude-md-injection.d.ts +10 -0
  194. package/dist/src/patches/claude-md-injection.js +46 -0
  195. package/dist/src/patches/claude-md-injection.js.map +1 -0
  196. package/dist/src/patches/cwd-redirect.d.ts +10 -0
  197. package/dist/src/patches/cwd-redirect.js +51 -0
  198. package/dist/src/patches/cwd-redirect.js.map +1 -0
  199. package/dist/src/patches/embedded-server-route.d.ts +23 -0
  200. package/dist/src/patches/embedded-server-route.js +64 -0
  201. package/dist/src/patches/embedded-server-route.js.map +1 -0
  202. package/dist/src/patches/pricing-overrides.d.ts +10 -0
  203. package/dist/src/patches/pricing-overrides.js +55 -0
  204. package/dist/src/patches/pricing-overrides.js.map +1 -0
  205. package/dist/src/patches/resume-registry-restore.d.ts +11 -0
  206. package/dist/src/patches/resume-registry-restore.js +48 -0
  207. package/dist/src/patches/resume-registry-restore.js.map +1 -0
  208. package/dist/src/patches/session-pid-tracking.d.ts +10 -0
  209. package/dist/src/patches/session-pid-tracking.js +45 -0
  210. package/dist/src/patches/session-pid-tracking.js.map +1 -0
  211. package/dist/src/patches/sysprompt-strip.d.ts +46 -0
  212. package/dist/src/patches/sysprompt-strip.js +78 -0
  213. package/dist/src/patches/sysprompt-strip.js.map +1 -0
  214. package/dist/src/patches/sysprompt-strip.spec.d.ts +33 -0
  215. package/dist/src/patches/sysprompt-strip.spec.js +53 -0
  216. package/dist/src/patches/sysprompt-strip.spec.js.map +1 -0
  217. package/dist/src/patches/tools-restoration.d.ts +12 -0
  218. package/dist/src/patches/tools-restoration.js +43 -0
  219. package/dist/src/patches/tools-restoration.js.map +1 -0
  220. package/dist/src/persistence/migration-v0.d.ts +24 -0
  221. package/dist/src/persistence/migration-v0.js +142 -0
  222. package/dist/src/persistence/migration-v0.js.map +1 -0
  223. package/dist/src/persistence/session-registry.d.ts +57 -0
  224. package/dist/src/persistence/session-registry.js +58 -0
  225. package/dist/src/persistence/session-registry.js.map +1 -0
  226. package/dist/src/persistence/snapshot.d.ts +18 -0
  227. package/dist/src/persistence/snapshot.js +32 -0
  228. package/dist/src/persistence/snapshot.js.map +1 -0
  229. package/dist/src/persistence/wal.d.ts +17 -0
  230. package/dist/src/persistence/wal.js +32 -0
  231. package/dist/src/persistence/wal.js.map +1 -0
  232. package/dist/src/session/persisted-sessions.d.ts +26 -0
  233. package/dist/src/session/persisted-sessions.js +70 -0
  234. package/dist/src/session/persisted-sessions.js.map +1 -0
  235. package/dist/src/session/session-manager.d.ts +2 -11
  236. package/dist/src/session/session-manager.js +22 -66
  237. package/dist/src/session/session-manager.js.map +1 -1
  238. package/dist/src/session-bootstrap/boot-self-heal.d.ts +32 -0
  239. package/dist/src/session-bootstrap/boot-self-heal.js +54 -0
  240. package/dist/src/session-bootstrap/boot-self-heal.js.map +1 -0
  241. package/dist/src/session-bootstrap/cwd-patch.js +11 -87
  242. package/dist/src/session-bootstrap/cwd-patch.js.map +1 -1
  243. package/dist/src/session-bootstrap/resume-registry.d.ts +29 -0
  244. package/dist/src/session-bootstrap/resume-registry.js +58 -0
  245. package/dist/src/session-bootstrap/resume-registry.js.map +1 -0
  246. package/dist/src/session-bootstrap/session-hygiene.d.ts +23 -0
  247. package/dist/src/session-bootstrap/session-hygiene.js +41 -0
  248. package/dist/src/session-bootstrap/session-hygiene.js.map +1 -0
  249. package/dist/src/types/runtime-config.d.ts +11 -0
  250. package/dist/src/types/runtime-config.js +9 -0
  251. package/dist/src/types/runtime-config.js.map +1 -1
  252. package/dist/src/types/tool-bridge.d.ts +2 -1
  253. package/dist/src/types/tool-bridge.js +1 -0
  254. package/dist/src/types/tool-bridge.js.map +1 -1
  255. package/package.json +1 -1
  256. package/dist/scripts/bench/ab-harness.d.ts +0 -58
  257. package/dist/scripts/bench/ab-harness.d.ts.map +0 -1
  258. package/dist/scripts/bench/ab-harness.js +0 -78
  259. package/dist/scripts/bench/ab-harness.js.map +0 -1
  260. package/dist/src/channels/adapter.d.ts.map +0 -1
  261. package/dist/src/channels/telegram/completion-summary.d.ts.map +0 -1
  262. package/dist/src/channels/telegram/error-renderer.d.ts.map +0 -1
  263. package/dist/src/channels/telegram/event-reducer.d.ts.map +0 -1
  264. package/dist/src/channels/telegram/index.d.ts.map +0 -1
  265. package/dist/src/channels/telegram/injector.d.ts.map +0 -1
  266. package/dist/src/channels/telegram/live-card.d.ts.map +0 -1
  267. package/dist/src/channels/telegram/state-machine.d.ts.map +0 -1
  268. package/dist/src/channels/telegram/tool-tracker.d.ts.map +0 -1
  269. package/dist/src/command-router/cc-handler.d.ts.map +0 -1
  270. package/dist/src/command-router/index.d.ts.map +0 -1
  271. package/dist/src/constants.d.ts.map +0 -1
  272. package/dist/src/council/consensus.d.ts.map +0 -1
  273. package/dist/src/council/council.d.ts.map +0 -1
  274. package/dist/src/council/index.d.ts.map +0 -1
  275. package/dist/src/engines/base-oneshot-session.d.ts.map +0 -1
  276. package/dist/src/engines/index.d.ts.map +0 -1
  277. package/dist/src/engines/persistent-codex-session.d.ts.map +0 -1
  278. package/dist/src/engines/persistent-cursor-session.d.ts.map +0 -1
  279. package/dist/src/engines/persistent-custom-session.d.ts.map +0 -1
  280. package/dist/src/engines/persistent-gemini-session.d.ts.map +0 -1
  281. package/dist/src/engines/persistent-session.d.ts.map +0 -1
  282. package/dist/src/health/handler.d.ts.map +0 -1
  283. package/dist/src/health/index.d.ts.map +0 -1
  284. package/dist/src/index.d.ts.map +0 -1
  285. package/dist/src/lib/auto-recovery.d.ts.map +0 -1
  286. package/dist/src/lib/cache-parity.d.ts.map +0 -1
  287. package/dist/src/lib/circuit-breaker.d.ts.map +0 -1
  288. package/dist/src/lib/config.d.ts.map +0 -1
  289. package/dist/src/lib/drift-detector.d.ts.map +0 -1
  290. package/dist/src/lib/error-formatter.d.ts.map +0 -1
  291. package/dist/src/lib/heartbeat-workaround.d.ts.map +0 -1
  292. package/dist/src/lib/index.d.ts.map +0 -1
  293. package/dist/src/lib/register-guard.d.ts.map +0 -1
  294. package/dist/src/lib/route-flag.d.ts +0 -49
  295. package/dist/src/lib/route-flag.d.ts.map +0 -1
  296. package/dist/src/lib/route-flag.js +0 -52
  297. package/dist/src/lib/route-flag.js.map +0 -1
  298. package/dist/src/lib/sysprompt-strip.d.ts.map +0 -1
  299. package/dist/src/lib/telemetry.d.ts.map +0 -1
  300. package/dist/src/lib/test-mode.d.ts.map +0 -1
  301. package/dist/src/lib/vendor-paths.d.ts.map +0 -1
  302. package/dist/src/logger.d.ts.map +0 -1
  303. package/dist/src/mcp/bridge.d.ts.map +0 -1
  304. package/dist/src/mcp/index.d.ts.map +0 -1
  305. package/dist/src/models.d.ts.map +0 -1
  306. package/dist/src/openai-compat/cli-stream-parser.d.ts.map +0 -1
  307. package/dist/src/openai-compat/index.d.ts.map +0 -1
  308. package/dist/src/openai-compat/openai-compat.d.ts.map +0 -1
  309. package/dist/src/openai-compat/skill-resolver.d.ts.map +0 -1
  310. package/dist/src/openai-compat/sse-translator.d.ts.map +0 -1
  311. package/dist/src/proxy/anthropic-adapter.d.ts.map +0 -1
  312. package/dist/src/proxy/handler.d.ts.map +0 -1
  313. package/dist/src/proxy/index.d.ts.map +0 -1
  314. package/dist/src/proxy/schema-cleaner.d.ts.map +0 -1
  315. package/dist/src/proxy/thought-cache.d.ts.map +0 -1
  316. package/dist/src/session/embedded-server.d.ts.map +0 -1
  317. package/dist/src/session/inbox-manager.d.ts.map +0 -1
  318. package/dist/src/session/index.d.ts.map +0 -1
  319. package/dist/src/session/session-manager.d.ts.map +0 -1
  320. package/dist/src/session-bootstrap/cwd-patch.d.ts.map +0 -1
  321. package/dist/src/session-bootstrap/index.d.ts.map +0 -1
  322. package/dist/src/session-bootstrap/sysprompt-strip.d.ts.map +0 -1
  323. package/dist/src/session-bootstrap/think-conflict-resolver.d.ts.map +0 -1
  324. package/dist/src/types.d.ts.map +0 -1
  325. package/dist/src/validation.d.ts.map +0 -1
  326. package/dist/tests/_helpers/subprocess-mock.d.ts +0 -35
  327. package/dist/tests/_helpers/subprocess-mock.d.ts.map +0 -1
  328. package/dist/tests/_helpers/subprocess-mock.js +0 -136
  329. package/dist/tests/_helpers/subprocess-mock.js.map +0 -1
  330. package/dist/tests/auto-recovery.test.d.ts +0 -2
  331. package/dist/tests/auto-recovery.test.d.ts.map +0 -1
  332. package/dist/tests/auto-recovery.test.js +0 -185
  333. package/dist/tests/auto-recovery.test.js.map +0 -1
  334. package/dist/tests/bench-harness.test.d.ts +0 -2
  335. package/dist/tests/bench-harness.test.d.ts.map +0 -1
  336. package/dist/tests/bench-harness.test.js +0 -21
  337. package/dist/tests/bench-harness.test.js.map +0 -1
  338. package/dist/tests/cache-parity.test.d.ts +0 -2
  339. package/dist/tests/cache-parity.test.d.ts.map +0 -1
  340. package/dist/tests/cache-parity.test.js +0 -401
  341. package/dist/tests/cache-parity.test.js.map +0 -1
  342. package/dist/tests/command-router.test.d.ts +0 -2
  343. package/dist/tests/command-router.test.d.ts.map +0 -1
  344. package/dist/tests/command-router.test.js +0 -60
  345. package/dist/tests/command-router.test.js.map +0 -1
  346. package/dist/tests/council.test.d.ts +0 -2
  347. package/dist/tests/council.test.d.ts.map +0 -1
  348. package/dist/tests/council.test.js +0 -20
  349. package/dist/tests/council.test.js.map +0 -1
  350. package/dist/tests/drift-detector.test.d.ts +0 -2
  351. package/dist/tests/drift-detector.test.d.ts.map +0 -1
  352. package/dist/tests/drift-detector.test.js +0 -268
  353. package/dist/tests/drift-detector.test.js.map +0 -1
  354. package/dist/tests/eager-bootstrap-gating.test.d.ts +0 -9
  355. package/dist/tests/eager-bootstrap-gating.test.d.ts.map +0 -1
  356. package/dist/tests/eager-bootstrap-gating.test.js +0 -97
  357. package/dist/tests/eager-bootstrap-gating.test.js.map +0 -1
  358. package/dist/tests/engines.test.d.ts +0 -2
  359. package/dist/tests/engines.test.d.ts.map +0 -1
  360. package/dist/tests/engines.test.js +0 -8
  361. package/dist/tests/engines.test.js.map +0 -1
  362. package/dist/tests/error-formatter.test.d.ts +0 -2
  363. package/dist/tests/error-formatter.test.d.ts.map +0 -1
  364. package/dist/tests/error-formatter.test.js +0 -220
  365. package/dist/tests/error-formatter.test.js.map +0 -1
  366. package/dist/tests/health.test.d.ts +0 -2
  367. package/dist/tests/health.test.d.ts.map +0 -1
  368. package/dist/tests/health.test.js +0 -110
  369. package/dist/tests/health.test.js.map +0 -1
  370. package/dist/tests/heartbeat-workaround.test.d.ts +0 -2
  371. package/dist/tests/heartbeat-workaround.test.d.ts.map +0 -1
  372. package/dist/tests/heartbeat-workaround.test.js +0 -90
  373. package/dist/tests/heartbeat-workaround.test.js.map +0 -1
  374. package/dist/tests/index.test.d.ts +0 -2
  375. package/dist/tests/index.test.d.ts.map +0 -1
  376. package/dist/tests/index.test.js +0 -7
  377. package/dist/tests/index.test.js.map +0 -1
  378. package/dist/tests/lib-sysprompt-strip.test.d.ts +0 -2
  379. package/dist/tests/lib-sysprompt-strip.test.d.ts.map +0 -1
  380. package/dist/tests/lib-sysprompt-strip.test.js +0 -145
  381. package/dist/tests/lib-sysprompt-strip.test.js.map +0 -1
  382. package/dist/tests/listener-activation.test.d.ts +0 -2
  383. package/dist/tests/listener-activation.test.d.ts.map +0 -1
  384. package/dist/tests/listener-activation.test.js +0 -87
  385. package/dist/tests/listener-activation.test.js.map +0 -1
  386. package/dist/tests/mcp-bridge.test.d.ts +0 -2
  387. package/dist/tests/mcp-bridge.test.d.ts.map +0 -1
  388. package/dist/tests/mcp-bridge.test.js +0 -137
  389. package/dist/tests/mcp-bridge.test.js.map +0 -1
  390. package/dist/tests/openai-compat.test.d.ts +0 -2
  391. package/dist/tests/openai-compat.test.d.ts.map +0 -1
  392. package/dist/tests/openai-compat.test.js +0 -8
  393. package/dist/tests/openai-compat.test.js.map +0 -1
  394. package/dist/tests/proxy-heartbeat-integration.test.d.ts +0 -15
  395. package/dist/tests/proxy-heartbeat-integration.test.d.ts.map +0 -1
  396. package/dist/tests/proxy-heartbeat-integration.test.js +0 -122
  397. package/dist/tests/proxy-heartbeat-integration.test.js.map +0 -1
  398. package/dist/tests/proxy.test.d.ts +0 -2
  399. package/dist/tests/proxy.test.d.ts.map +0 -1
  400. package/dist/tests/proxy.test.js +0 -8
  401. package/dist/tests/proxy.test.js.map +0 -1
  402. package/dist/tests/register-guard-stacking.test.d.ts +0 -2
  403. package/dist/tests/register-guard-stacking.test.d.ts.map +0 -1
  404. package/dist/tests/register-guard-stacking.test.js +0 -61
  405. package/dist/tests/register-guard-stacking.test.js.map +0 -1
  406. package/dist/tests/register-guard.test.d.ts +0 -2
  407. package/dist/tests/register-guard.test.d.ts.map +0 -1
  408. package/dist/tests/register-guard.test.js +0 -129
  409. package/dist/tests/register-guard.test.js.map +0 -1
  410. package/dist/tests/route-flag-rollback.test.d.ts +0 -2
  411. package/dist/tests/route-flag-rollback.test.d.ts.map +0 -1
  412. package/dist/tests/route-flag-rollback.test.js +0 -70
  413. package/dist/tests/route-flag-rollback.test.js.map +0 -1
  414. package/dist/tests/route-flag.test.d.ts +0 -2
  415. package/dist/tests/route-flag.test.d.ts.map +0 -1
  416. package/dist/tests/route-flag.test.js +0 -101
  417. package/dist/tests/route-flag.test.js.map +0 -1
  418. package/dist/tests/session-bootstrap.test.d.ts +0 -2
  419. package/dist/tests/session-bootstrap.test.d.ts.map +0 -1
  420. package/dist/tests/session-bootstrap.test.js +0 -183
  421. package/dist/tests/session-bootstrap.test.js.map +0 -1
  422. package/dist/tests/session.test.d.ts +0 -2
  423. package/dist/tests/session.test.d.ts.map +0 -1
  424. package/dist/tests/session.test.js +0 -17
  425. package/dist/tests/session.test.js.map +0 -1
  426. package/dist/tests/state-machine.test.d.ts +0 -2
  427. package/dist/tests/state-machine.test.d.ts.map +0 -1
  428. package/dist/tests/state-machine.test.js +0 -133
  429. package/dist/tests/state-machine.test.js.map +0 -1
  430. package/dist/tests/streaming/cli-stream-parser.test.d.ts +0 -2
  431. package/dist/tests/streaming/cli-stream-parser.test.d.ts.map +0 -1
  432. package/dist/tests/streaming/cli-stream-parser.test.js +0 -233
  433. package/dist/tests/streaming/cli-stream-parser.test.js.map +0 -1
  434. package/dist/tests/streaming/feature-flag.test.d.ts +0 -14
  435. package/dist/tests/streaming/feature-flag.test.d.ts.map +0 -1
  436. package/dist/tests/streaming/feature-flag.test.js +0 -163
  437. package/dist/tests/streaming/feature-flag.test.js.map +0 -1
  438. package/dist/tests/streaming/no-tools-prompt.test.d.ts +0 -17
  439. package/dist/tests/streaming/no-tools-prompt.test.d.ts.map +0 -1
  440. package/dist/tests/streaming/no-tools-prompt.test.js +0 -229
  441. package/dist/tests/streaming/no-tools-prompt.test.js.map +0 -1
  442. package/dist/tests/streaming/skill-plus-tools.test.d.ts +0 -14
  443. package/dist/tests/streaming/skill-plus-tools.test.d.ts.map +0 -1
  444. package/dist/tests/streaming/skill-plus-tools.test.js +0 -234
  445. package/dist/tests/streaming/skill-plus-tools.test.js.map +0 -1
  446. package/dist/tests/streaming/sse-translator.test.d.ts +0 -2
  447. package/dist/tests/streaming/sse-translator.test.d.ts.map +0 -1
  448. package/dist/tests/streaming/sse-translator.test.js +0 -227
  449. package/dist/tests/streaming/sse-translator.test.js.map +0 -1
  450. package/dist/tests/streaming/tool-result-roundtrip.test.d.ts +0 -11
  451. package/dist/tests/streaming/tool-result-roundtrip.test.d.ts.map +0 -1
  452. package/dist/tests/streaming/tool-result-roundtrip.test.js +0 -215
  453. package/dist/tests/streaming/tool-result-roundtrip.test.js.map +0 -1
  454. package/dist/tests/streaming/tool-use-translation.test.d.ts +0 -10
  455. package/dist/tests/streaming/tool-use-translation.test.d.ts.map +0 -1
  456. package/dist/tests/streaming/tool-use-translation.test.js +0 -251
  457. package/dist/tests/streaming/tool-use-translation.test.js.map +0 -1
  458. package/dist/tests/telegram-bridge.test.d.ts +0 -2
  459. package/dist/tests/telegram-bridge.test.d.ts.map +0 -1
  460. package/dist/tests/telegram-bridge.test.js +0 -17
  461. package/dist/tests/telegram-bridge.test.js.map +0 -1
  462. package/dist/tests/telegram-injector.test.d.ts +0 -2
  463. package/dist/tests/telegram-injector.test.d.ts.map +0 -1
  464. package/dist/tests/telegram-injector.test.js +0 -74
  465. package/dist/tests/telegram-injector.test.js.map +0 -1
  466. package/dist/tests/telemetry.test.d.ts +0 -2
  467. package/dist/tests/telemetry.test.d.ts.map +0 -1
  468. package/dist/tests/telemetry.test.js +0 -405
  469. package/dist/tests/telemetry.test.js.map +0 -1
  470. package/dist/tests/test-mode.test.d.ts +0 -2
  471. package/dist/tests/test-mode.test.d.ts.map +0 -1
  472. package/dist/tests/test-mode.test.js +0 -39
  473. package/dist/tests/test-mode.test.js.map +0 -1
@@ -0,0 +1,12 @@
1
+ /**
2
+ * PatchSpec: tools-restoration — Phase E#3 scaffold.
3
+ *
4
+ * Target: removal of the legacy `body.tools=''` defensive block. Phase 2
5
+ * R5 — historically the proxy stripped tools; v0.5.x added Native streaming;
6
+ * Phase E#3 finalizes by ensuring no leftover `tools=''` write-paths exist.
7
+ * Drift-detection only today.
8
+ */
9
+ import type { PatchSpec } from '../lifecycle/patch-manifest.js';
10
+ type ToolsRestorationTarget = Record<string, unknown>;
11
+ export declare const toolsRestorationSpec: PatchSpec<ToolsRestorationTarget>;
12
+ export {};
@@ -0,0 +1,43 @@
1
+ /**
2
+ * PatchSpec: tools-restoration — Phase E#3 scaffold.
3
+ *
4
+ * Target: removal of the legacy `body.tools=''` defensive block. Phase 2
5
+ * R5 — historically the proxy stripped tools; v0.5.x added Native streaming;
6
+ * Phase E#3 finalizes by ensuring no leftover `tools=''` write-paths exist.
7
+ * Drift-detection only today.
8
+ */
9
+ export const toolsRestorationSpec = {
10
+ id: 'tools-restoration',
11
+ targetModule: 'openclaw',
12
+ targetSymbol: 'EmbeddedServer.route — tools=[] forwarding',
13
+ async resolve() {
14
+ const upstream = (await import('openclaw'));
15
+ if (typeof upstream !== 'object' || upstream === null) {
16
+ throw new Error('openclaw import did not return an object');
17
+ }
18
+ return upstream;
19
+ },
20
+ expectedShape(target) {
21
+ // Tools-forwarding integrity probe — verify the server-startup +
22
+ // CLI entry surface, since tools routing flows through runLegacyCliEntry.
23
+ if (typeof target !== 'object' || target === null)
24
+ return false;
25
+ return (typeof target.runLegacyCliEntry === 'function' &&
26
+ typeof target.loadConfig === 'function');
27
+ },
28
+ async expectedBehavior(_target) {
29
+ // Phase E#3 finding 4 workaround (2026-05-13): tools-forwarding depends
30
+ // on the active openclaw.json. Verify it's reachable via raw JSON.parse
31
+ // rather than going through loadConfig (which schema-rejects
32
+ // cc-openclaw-specific keys).
33
+ const { probeOpenclawJsonReachable } = await import('../lib/safe-upstream-probes.js');
34
+ return probeOpenclawJsonReachable();
35
+ },
36
+ install(_target) {
37
+ // Phase E#3 — ensure tools forwarding is preserved (no `tools=''` overwrite).
38
+ },
39
+ uninstall(_target) {
40
+ // Phase E#3 — restore original tools forwarding behavior.
41
+ },
42
+ };
43
+ //# sourceMappingURL=tools-restoration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-restoration.js","sourceRoot":"","sources":["../../../src/patches/tools-restoration.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,CAAC,MAAM,oBAAoB,GAAsC;IACrE,EAAE,EAAE,mBAAmB;IACvB,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,4CAA4C;IAE1D,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAY,CAAC;QACvD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,QAAkC,CAAC;IAC5C,CAAC;IAED,aAAa,CAAC,MAA8B;QAC1C,iEAAiE;QACjE,0EAA0E;QAC1E,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAChE,OAAO,CACL,OAAO,MAAM,CAAC,iBAAiB,KAAK,UAAU;YAC9C,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,CACxC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAA+B;QACpD,wEAAwE;QACxE,wEAAwE;QACxE,6DAA6D;QAC7D,8BAA8B;QAC9B,MAAM,EAAE,0BAA0B,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QACtF,OAAO,0BAA0B,EAAE,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,OAA+B;QACrC,8EAA8E;IAChF,CAAC;IAED,SAAS,CAAC,OAA+B;QACvC,0DAA0D;IAC5D,CAAC;CACF,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * MigrationV0 — reads the legacy 4-file persistence format READ-ONLY into
3
+ * SessionRegistry on first boot (Q5 resolution: auto-migrate read-only;
4
+ * explicit `cc-openclaw migrate --commit` required for deletion).
5
+ *
6
+ * Legacy files (NEVER deleted by this module):
7
+ * ~/.openclaw/claude-sessions.json
8
+ * ~/.openclaw/savvy-resume-registry.json
9
+ * ~/.openclaw/session-pids.json
10
+ * ~/.openclaw/openclaw-cache-parity-registry.json
11
+ *
12
+ * Shapes are parsed permissively (unknown → narrowed via type guards).
13
+ * Missing or malformed files are silently skipped — migration is best-effort.
14
+ */
15
+ import { type SessionState } from './session-registry.js';
16
+ export declare class MigrationV0 {
17
+ /**
18
+ * Read all legacy files and return SessionState[] for loading into
19
+ * SessionRegistry. NEVER modifies or deletes the source files.
20
+ */
21
+ readLegacy(): Promise<SessionState[]>;
22
+ private readPidMap;
23
+ private readCacheParityMap;
24
+ }
@@ -0,0 +1,142 @@
1
+ /**
2
+ * MigrationV0 — reads the legacy 4-file persistence format READ-ONLY into
3
+ * SessionRegistry on first boot (Q5 resolution: auto-migrate read-only;
4
+ * explicit `cc-openclaw migrate --commit` required for deletion).
5
+ *
6
+ * Legacy files (NEVER deleted by this module):
7
+ * ~/.openclaw/claude-sessions.json
8
+ * ~/.openclaw/savvy-resume-registry.json
9
+ * ~/.openclaw/session-pids.json
10
+ * ~/.openclaw/openclaw-cache-parity-registry.json
11
+ *
12
+ * Shapes are parsed permissively (unknown → narrowed via type guards).
13
+ * Missing or malformed files are silently skipped — migration is best-effort.
14
+ */
15
+ import { existsSync, readFileSync } from 'fs';
16
+ import { homedir } from 'os';
17
+ import { join } from 'path';
18
+ import { asSessionName } from './session-registry.js';
19
+ const HOME = homedir();
20
+ const OPENCLAW_ROOT = join(HOME, '.openclaw');
21
+ const LEGACY_PATHS = {
22
+ claudeSessions: join(OPENCLAW_ROOT, 'claude-sessions.json'),
23
+ savvyResume: join(OPENCLAW_ROOT, 'savvy-resume-registry.json'),
24
+ sessionPids: join(OPENCLAW_ROOT, 'session-pids.json'),
25
+ cacheParity: join(OPENCLAW_ROOT, 'openclaw-cache-parity-registry.json'),
26
+ };
27
+ // ── Internal type guards ──────────────────────────────────────────────────────
28
+ function isRecord(v) {
29
+ return v !== null && typeof v === 'object' && !Array.isArray(v);
30
+ }
31
+ function safeReadJson(path) {
32
+ if (!existsSync(path))
33
+ return null;
34
+ try {
35
+ return JSON.parse(readFileSync(path, 'utf8'));
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ // ── MigrationV0 ───────────────────────────────────────────────────────────────
42
+ export class MigrationV0 {
43
+ /**
44
+ * Read all legacy files and return SessionState[] for loading into
45
+ * SessionRegistry. NEVER modifies or deletes the source files.
46
+ */
47
+ async readLegacy() {
48
+ const results = [];
49
+ const pidMap = this.readPidMap();
50
+ const cacheMap = this.readCacheParityMap();
51
+ const seen = new Set();
52
+ const addEntry = (keyOrName, val, defaults = { skipPersistence: 'never' }) => {
53
+ let name;
54
+ try {
55
+ name = asSessionName(keyOrName);
56
+ }
57
+ catch {
58
+ return;
59
+ }
60
+ if (seen.has(name))
61
+ return;
62
+ seen.add(name);
63
+ const cwd = isRecord(val) && typeof val['cwd'] === 'string' ? val['cwd'] : process.cwd();
64
+ const skipRaw = isRecord(val) ? val['skipPersistence'] : undefined;
65
+ const skipPersistence = skipRaw === 'session-only' || skipRaw === 'never-persist'
66
+ ? skipRaw
67
+ : defaults.skipPersistence;
68
+ results.push({
69
+ name,
70
+ pid: pidMap.get(name),
71
+ cwd,
72
+ cacheRegistryEntry: cacheMap.get(name),
73
+ skipPersistence,
74
+ updatedAt: new Date().toISOString(),
75
+ });
76
+ };
77
+ // claude-sessions.json — production shape is an ARRAY of {name, cwd, ...}.
78
+ // Older builds may have written a record keyed by session name; handle both.
79
+ const sessions = safeReadJson(LEGACY_PATHS.claudeSessions);
80
+ if (Array.isArray(sessions)) {
81
+ for (const item of sessions) {
82
+ if (isRecord(item) && typeof item['name'] === 'string') {
83
+ addEntry(item['name'], item);
84
+ }
85
+ }
86
+ }
87
+ else if (isRecord(sessions)) {
88
+ for (const [key, val] of Object.entries(sessions))
89
+ addEntry(key, val);
90
+ }
91
+ // savvy-resume-registry.json — same dual-shape handling; supplies any
92
+ // sessions missing from claude-sessions.json.
93
+ const savvy = safeReadJson(LEGACY_PATHS.savvyResume);
94
+ if (Array.isArray(savvy)) {
95
+ for (const item of savvy) {
96
+ if (isRecord(item) && typeof item['name'] === 'string') {
97
+ addEntry(item['name'], item);
98
+ }
99
+ }
100
+ }
101
+ else if (isRecord(savvy)) {
102
+ for (const [key, val] of Object.entries(savvy))
103
+ addEntry(key, val);
104
+ }
105
+ return results;
106
+ }
107
+ readPidMap() {
108
+ const map = new Map();
109
+ const raw = safeReadJson(LEGACY_PATHS.sessionPids);
110
+ if (!isRecord(raw))
111
+ return map;
112
+ for (const [key, val] of Object.entries(raw)) {
113
+ try {
114
+ const name = asSessionName(key);
115
+ if (typeof val === 'number')
116
+ map.set(name, val);
117
+ }
118
+ catch {
119
+ // skip
120
+ }
121
+ }
122
+ return map;
123
+ }
124
+ readCacheParityMap() {
125
+ const map = new Map();
126
+ const raw = safeReadJson(LEGACY_PATHS.cacheParity);
127
+ if (!isRecord(raw))
128
+ return map;
129
+ for (const [key, val] of Object.entries(raw)) {
130
+ try {
131
+ const name = asSessionName(key);
132
+ if (typeof val === 'string')
133
+ map.set(name, val);
134
+ }
135
+ catch {
136
+ // skip
137
+ }
138
+ }
139
+ return map;
140
+ }
141
+ }
142
+ //# sourceMappingURL=migration-v0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-v0.js","sourceRoot":"","sources":["../../../src/persistence/migration-v0.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * SessionRegistry — typed, branded session state store.
3
+ *
4
+ * Closes the v0.6.0 namespace-bug class structurally:
5
+ * - Branded SessionName ensures "openai-" prefix at the type level.
6
+ * - asSessionName() throws DomainError.SessionPrefixMissing at runtime if
7
+ * the prefix is missing — converting a class of silent bugs to compile errors
8
+ * (branded type) + loud runtime errors (guard).
9
+ *
10
+ * skipPersistence is a typed enum, not a boolean cast (was AS4).
11
+ *
12
+ * WAL append and snapshot bodies are stubs; Phase E wires WalWriter/SnapshotWriter.
13
+ */
14
+ export type SessionName = string & {
15
+ readonly __brand: 'SessionName';
16
+ };
17
+ /**
18
+ * Runtime guard that enforces the "openai-" prefix.
19
+ * Returns a branded SessionName on success.
20
+ * Throws SessionPrefixMissing on failure.
21
+ */
22
+ export declare function asSessionName(s: string): SessionName;
23
+ /**
24
+ * skipPersistence enum mirrors the boolean-cast in legacy session-manager.ts
25
+ * but is explicitly typed (AS4 fix).
26
+ *
27
+ * - "never" → always persist (default)
28
+ * - "session-only" → persist during session, delete on completion
29
+ * - "never-persist" → never write to disk (e.g. ephemeral test sessions)
30
+ */
31
+ export type SkipPersistence = 'never' | 'session-only' | 'never-persist';
32
+ export interface SessionState {
33
+ name: SessionName;
34
+ pid?: number;
35
+ cwd: string;
36
+ /** Entry in the cache-parity registry (Track B). */
37
+ cacheRegistryEntry?: string;
38
+ skipPersistence: SkipPersistence;
39
+ /** ISO timestamp of last state transition. */
40
+ updatedAt: string;
41
+ }
42
+ export declare class SessionRegistry {
43
+ private readonly map;
44
+ /**
45
+ * Upsert a session state. Triggers a WAL append (stub in Phase D).
46
+ */
47
+ set(state: SessionState): void;
48
+ get(name: SessionName): SessionState | undefined;
49
+ delete(name: SessionName): void;
50
+ /**
51
+ * Write current Map state to snapshot file (stub in Phase D).
52
+ * Phase E: delegates to SnapshotWriter.
53
+ */
54
+ snapshot(): Promise<void>;
55
+ get size(): number;
56
+ values(): IterableIterator<SessionState>;
57
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * SessionRegistry — typed, branded session state store.
3
+ *
4
+ * Closes the v0.6.0 namespace-bug class structurally:
5
+ * - Branded SessionName ensures "openai-" prefix at the type level.
6
+ * - asSessionName() throws DomainError.SessionPrefixMissing at runtime if
7
+ * the prefix is missing — converting a class of silent bugs to compile errors
8
+ * (branded type) + loud runtime errors (guard).
9
+ *
10
+ * skipPersistence is a typed enum, not a boolean cast (was AS4).
11
+ *
12
+ * WAL append and snapshot bodies are stubs; Phase E wires WalWriter/SnapshotWriter.
13
+ */
14
+ import { SessionPrefixMissing } from '../lib/domain-error.js';
15
+ /**
16
+ * Runtime guard that enforces the "openai-" prefix.
17
+ * Returns a branded SessionName on success.
18
+ * Throws SessionPrefixMissing on failure.
19
+ */
20
+ export function asSessionName(s) {
21
+ if (!s.startsWith('openai-')) {
22
+ throw new SessionPrefixMissing(s);
23
+ }
24
+ return s;
25
+ }
26
+ // ── SessionRegistry class ─────────────────────────────────────────────────────
27
+ export class SessionRegistry {
28
+ map = new Map();
29
+ /**
30
+ * Upsert a session state. Triggers a WAL append (stub in Phase D).
31
+ */
32
+ set(state) {
33
+ const entry = { ...state, updatedAt: new Date().toISOString() };
34
+ this.map.set(state.name, entry);
35
+ // Phase E: this.wal.append(entry);
36
+ }
37
+ get(name) {
38
+ return this.map.get(name);
39
+ }
40
+ delete(name) {
41
+ this.map.delete(name);
42
+ // Phase E: this.wal.append({ name, deleted: true, updatedAt: ... });
43
+ }
44
+ /**
45
+ * Write current Map state to snapshot file (stub in Phase D).
46
+ * Phase E: delegates to SnapshotWriter.
47
+ */
48
+ async snapshot() {
49
+ // Phase E: await this.snapshotWriter.write([...this.map.values()]);
50
+ }
51
+ get size() {
52
+ return this.map.size;
53
+ }
54
+ values() {
55
+ return this.map.values();
56
+ }
57
+ }
58
+ //# sourceMappingURL=session-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../../src/persistence/session-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAM9D;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAgB,CAAC;AAC1B,CAAC;AAyBD,iFAAiF;AAEjF,MAAM,OAAO,eAAe;IACT,GAAG,GAAG,IAAI,GAAG,EAA6B,CAAC;IAE5D;;OAEG;IACH,GAAG,CAAC,KAAmB;QACrB,MAAM,KAAK,GAAiB,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9E,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,mCAAmC;IACrC,CAAC;IAED,GAAG,CAAC,IAAiB;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,IAAiB;QACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,qEAAqE;IACvE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,oEAAoE;IACtE,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * SnapshotWriter — periodic full-state snapshot of the SessionRegistry.
3
+ *
4
+ * Snapshot file: ~/.openclaw/workspace/memory/cc-openclaw-session-snapshot.json
5
+ * Written every N minutes from phase 7 (schedule-jobs).
6
+ * Phase E wires SessionRegistry.snapshot() → SnapshotWriter.write().
7
+ * Stub body in Phase D.
8
+ */
9
+ import type { SessionState } from './session-registry.js';
10
+ export declare class SnapshotWriter {
11
+ private readonly path;
12
+ constructor(path?: string);
13
+ /**
14
+ * Write the full session state array as a JSON file.
15
+ * Phase E: write to a temp file then rename for atomicity.
16
+ */
17
+ write(states: SessionState[]): Promise<void>;
18
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * SnapshotWriter — periodic full-state snapshot of the SessionRegistry.
3
+ *
4
+ * Snapshot file: ~/.openclaw/workspace/memory/cc-openclaw-session-snapshot.json
5
+ * Written every N minutes from phase 7 (schedule-jobs).
6
+ * Phase E wires SessionRegistry.snapshot() → SnapshotWriter.write().
7
+ * Stub body in Phase D.
8
+ */
9
+ import { mkdirSync, writeFileSync } from 'fs';
10
+ import { homedir } from 'os';
11
+ import { join, dirname } from 'path';
12
+ const SNAPSHOT_PATH = join(homedir(), '.openclaw', 'workspace', 'memory', 'cc-openclaw-session-snapshot.json');
13
+ export class SnapshotWriter {
14
+ path;
15
+ constructor(path = SNAPSHOT_PATH) {
16
+ this.path = path;
17
+ }
18
+ /**
19
+ * Write the full session state array as a JSON file.
20
+ * Phase E: write to a temp file then rename for atomicity.
21
+ */
22
+ async write(states) {
23
+ try {
24
+ mkdirSync(dirname(this.path), { recursive: true });
25
+ writeFileSync(this.path, JSON.stringify(states, null, 2), 'utf8');
26
+ }
27
+ catch {
28
+ // Non-fatal stub; Phase E promotes to logged error.
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/persistence/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGrC,MAAM,aAAa,GAAG,IAAI,CACxB,OAAO,EAAE,EACT,WAAW,EACX,WAAW,EACX,QAAQ,EACR,mCAAmC,CACpC,CAAC;AAEF,MAAM,OAAO,cAAc;IACR,IAAI,CAAS;IAE9B,YAAY,OAAe,aAAa;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,MAAsB;QAChC,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * WalWriter — append-only JSONL writer for the session registry WAL.
3
+ *
4
+ * WAL file location: ~/.openclaw/workspace/memory/cc-openclaw-session-wal.jsonl
5
+ * Phase E wires this into SessionRegistry.set() / delete().
6
+ * Stub body in Phase D — compiles and exports the class with the correct interface.
7
+ */
8
+ export declare class WalWriter {
9
+ private readonly path;
10
+ constructor(path?: string);
11
+ /**
12
+ * Append a JSON-serializable record as a single JSONL line.
13
+ * Creates parent directories if absent. Non-atomic in Phase D stub;
14
+ * Phase E adds write-then-rename for crash safety.
15
+ */
16
+ append(record: Record<string, unknown>): void;
17
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * WalWriter — append-only JSONL writer for the session registry WAL.
3
+ *
4
+ * WAL file location: ~/.openclaw/workspace/memory/cc-openclaw-session-wal.jsonl
5
+ * Phase E wires this into SessionRegistry.set() / delete().
6
+ * Stub body in Phase D — compiles and exports the class with the correct interface.
7
+ */
8
+ import { mkdirSync, appendFileSync } from 'fs';
9
+ import { homedir } from 'os';
10
+ import { join, dirname } from 'path';
11
+ const WAL_PATH = join(homedir(), '.openclaw', 'workspace', 'memory', 'cc-openclaw-session-wal.jsonl');
12
+ export class WalWriter {
13
+ path;
14
+ constructor(path = WAL_PATH) {
15
+ this.path = path;
16
+ }
17
+ /**
18
+ * Append a JSON-serializable record as a single JSONL line.
19
+ * Creates parent directories if absent. Non-atomic in Phase D stub;
20
+ * Phase E adds write-then-rename for crash safety.
21
+ */
22
+ append(record) {
23
+ try {
24
+ mkdirSync(dirname(this.path), { recursive: true });
25
+ appendFileSync(this.path, JSON.stringify(record) + '\n', 'utf8');
26
+ }
27
+ catch {
28
+ // Non-fatal in Phase D; Phase E promotes to logged error.
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=wal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wal.js","sourceRoot":"","sources":["../../../src/persistence/wal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,QAAQ,GAAG,IAAI,CACnB,OAAO,EAAE,EACT,WAAW,EACX,WAAW,EACX,QAAQ,EACR,+BAA+B,CAChC,CAAC;AAEF,MAAM,OAAO,SAAS;IACH,IAAI,CAAS;IAE9B,YAAY,OAAe,QAAQ;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAA+B;QACpC,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Persisted sessions disk I/O — load + atomic-write + async-write of the
3
+ * `claude-sessions.json` registry.
4
+ *
5
+ * Extracted from `session-manager.ts` 2026-05-13 to reduce that file's LOC.
6
+ * The 3 functions form a coherent persistence layer; moving them together
7
+ * is bounded and behavior-preserving (existing `tests/session.test.ts`
8
+ * + `tests/cache-parity.test.ts` exercise the round-trip).
9
+ */
10
+ import type { EngineType } from '../types.js';
11
+ import { type Logger } from '../logger.js';
12
+ export declare const PERSIST_DIR: string;
13
+ export declare const PERSIST_FILE: string;
14
+ export interface PersistedSession {
15
+ name: string;
16
+ claudeSessionId: string;
17
+ cwd: string;
18
+ model?: string;
19
+ engine?: EngineType;
20
+ originalCreated: string;
21
+ lastResumed: string;
22
+ lastActivity: number;
23
+ }
24
+ export declare function loadPersistedSessions(): Map<string, PersistedSession>;
25
+ export declare function savePersistedSessions(sessions: Map<string, PersistedSession>, logger?: Logger): void;
26
+ export declare function savePersistedSessionsAsync(sessions: Map<string, PersistedSession>, logger?: Logger): void;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Persisted sessions disk I/O — load + atomic-write + async-write of the
3
+ * `claude-sessions.json` registry.
4
+ *
5
+ * Extracted from `session-manager.ts` 2026-05-13 to reduce that file's LOC.
6
+ * The 3 functions form a coherent persistence layer; moving them together
7
+ * is bounded and behavior-preserving (existing `tests/session.test.ts`
8
+ * + `tests/cache-parity.test.ts` exercise the round-trip).
9
+ */
10
+ import * as fs from 'node:fs';
11
+ import * as os from 'node:os';
12
+ import * as path from 'node:path';
13
+ import { createConsoleLogger } from '../logger.js';
14
+ import { PERSIST_DISK_TTL_MS } from '../constants.js';
15
+ export const PERSIST_DIR = path.join(os.homedir(), '.openclaw');
16
+ export const PERSIST_FILE = path.join(PERSIST_DIR, 'claude-sessions.json');
17
+ export function loadPersistedSessions() {
18
+ try {
19
+ if (!fs.existsSync(PERSIST_FILE))
20
+ return new Map();
21
+ const raw = fs.readFileSync(PERSIST_FILE, 'utf8');
22
+ const arr = JSON.parse(raw);
23
+ const now = Date.now();
24
+ // Filter out entries older than disk TTL
25
+ const valid = arr.filter((s) => now - s.lastActivity < PERSIST_DISK_TTL_MS);
26
+ return new Map(valid.map((s) => [s.name, s]));
27
+ }
28
+ catch {
29
+ return new Map();
30
+ }
31
+ }
32
+ // Atomic write: write to .tmp then rename to avoid corrupt reads on crash
33
+ export function savePersistedSessions(sessions, logger) {
34
+ try {
35
+ fs.mkdirSync(PERSIST_DIR, { recursive: true });
36
+ const arr = Array.from(sessions.values());
37
+ const tmp = PERSIST_FILE + '.tmp';
38
+ fs.writeFileSync(tmp, JSON.stringify(arr, null, 2));
39
+ fs.renameSync(tmp, PERSIST_FILE);
40
+ }
41
+ catch (err) {
42
+ (logger || createConsoleLogger('SessionManager')).warn('Failed to persist sessions:', err.message);
43
+ }
44
+ }
45
+ // Async version for hot-path (sendMessage, TTL cleanup)
46
+ export function savePersistedSessionsAsync(sessions, logger) {
47
+ const log = logger || createConsoleLogger('SessionManager');
48
+ const arr = Array.from(sessions.values());
49
+ const tmp = PERSIST_FILE + '.tmp';
50
+ fs.mkdir(PERSIST_DIR, { recursive: true }, (mkdirErr) => {
51
+ if (mkdirErr) {
52
+ log.error('Failed to create persist dir:', mkdirErr.message);
53
+ return;
54
+ }
55
+ fs.writeFile(tmp, JSON.stringify(arr, null, 2), (writeErr) => {
56
+ if (writeErr) {
57
+ log.error('Failed to write session file:', writeErr.message);
58
+ return;
59
+ }
60
+ fs.rename(tmp, PERSIST_FILE, (renameErr) => {
61
+ if (renameErr) {
62
+ log.error('Failed to rename session file:', renameErr.message);
63
+ // Clean up orphan tmp file
64
+ fs.unlink(tmp, () => { });
65
+ }
66
+ });
67
+ });
68
+ });
69
+ }
70
+ //# sourceMappingURL=persisted-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persisted-sessions.js","sourceRoot":"","sources":["../../../src/session/persisted-sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAe,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;AAa3E,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,GAAG,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,GAAG,GAAuB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,yCAAyC;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,GAAG,mBAAmB,CAAC,CAAC;QAC5E,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,qBAAqB,CACnC,QAAuC,EACvC,MAAe;IAEf,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,YAAY,GAAG,MAAM,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,CAAC,MAAM,IAAI,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CACpD,6BAA6B,EAC5B,GAAa,CAAC,OAAO,CACvB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,0BAA0B,CACxC,QAAuC,EACvC,MAAe;IAEf,MAAM,GAAG,GAAG,MAAM,IAAI,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,GAAG,MAAM,CAAC;IAClC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE;QACtD,IAAI,QAAQ,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC3D,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YACD,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE;gBACzC,IAAI,SAAS,EAAE,CAAC;oBACd,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;oBAC/D,2BAA2B;oBAC3B,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -4,18 +4,9 @@
4
4
  * Replaces the Express server layer. Pure class with no HTTP dependency.
5
5
  * Can be used by Plugin tools, CLI, or any other consumer.
6
6
  */
7
- interface PersistedSession {
8
- name: string;
9
- claudeSessionId: string;
10
- cwd: string;
11
- model?: string;
12
- engine?: EngineType;
13
- originalCreated: string;
14
- lastResumed: string;
15
- lastActivity: number;
16
- }
7
+ import { type PersistedSession } from './persisted-sessions.js';
17
8
  import { type Logger } from '../logger.js';
18
- import { type SessionConfig, type SessionInfo, type SendResult, type PluginConfig, type EffortLevel, type EngineType, type AgentInfo, type SkillInfo, type RuleInfo, type StreamEvent, type ISession, type CouncilConfig, type CouncilSession, type CouncilReviewResult, type CouncilAcceptResult, type CouncilRejectResult, type InboxMessage, type UltraplanResult, type UltrareviewResult } from '../types.js';
9
+ import { type SessionConfig, type SessionInfo, type SendResult, type PluginConfig, type EffortLevel, type AgentInfo, type SkillInfo, type RuleInfo, type StreamEvent, type ISession, type CouncilConfig, type CouncilSession, type CouncilReviewResult, type CouncilAcceptResult, type CouncilRejectResult, type InboxMessage, type UltraplanResult, type UltrareviewResult } from '../types.js';
19
10
  interface SendOptions {
20
11
  effort?: EffortLevel;
21
12
  plan?: boolean;