@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,236 @@
1
+ /**
2
+ * resume-policy — /cc+ continuation, /cc resume, rehydrate, and turn-extension logic.
3
+ *
4
+ * Extracted from cc-handler.ts (Step 4 of Phase 5 v0.11.0 decomposition).
5
+ * Each public function takes PolicyDeps as its first argument per PRP §7 Q3.
6
+ * cc-handler.ts retains ownership of the sessionManager/activeSessions/logger
7
+ * singletons and threads them in via `_deps()` on every call.
8
+ *
9
+ * Callers MUST verify `sessionManager !== null` before constructing deps:
10
+ * PolicyDeps.sessionManager is typed non-null and these handlers assume it.
11
+ * The "Claude Code handler not ready — try again in a few seconds." response
12
+ * is now produced at the dispatcher in cc-handler.ts.
13
+ */
14
+ import { DEFAULT_CWD, sessionMapKey, saveSession, loadSession, loadSessionById, scanAllSessions, IDLE_TIMEOUT_MS, ACK_TIMEOUT_MS, scheduleIdle, _postTurnContextCheck, } from './launch-policy.js';
15
+ import { sendDirectReply } from './turn-formatter.js';
16
+ const PLUGIN_TAG = '[cc-openclaw/resume-policy]';
17
+ // ── Continuation Handler ──────────────────────────────────────────────────
18
+ export function handleContinuation(deps, prompt, chatId, threadId) {
19
+ const { sessionManager, activeSessions, logger } = deps;
20
+ const key = sessionMapKey(chatId, threadId);
21
+ const active = activeSessions.get(key);
22
+ if (!active) {
23
+ return {
24
+ handled: true,
25
+ text: 'No active session to continue. Start one with /cc <prompt> or /cc resume',
26
+ };
27
+ }
28
+ if (active.needsRehydration) {
29
+ if (!active.meta.claudeSessionId) {
30
+ activeSessions.delete(key);
31
+ return {
32
+ handled: true,
33
+ text: 'Recovered session has no Claude ID — start fresh with /cc <prompt>',
34
+ };
35
+ }
36
+ logger.info(`${PLUGIN_TAG} /cc+ rehydrating recovered session: slug=${active.slug} chat=${chatId} thread=${threadId || 'none'}`);
37
+ let resolveAckId;
38
+ const ackIdPromise = new Promise((r) => {
39
+ resolveAckId = r;
40
+ });
41
+ (async () => {
42
+ try {
43
+ await rehydrateSession(deps, active.meta, chatId, threadId);
44
+ active.needsRehydration = false;
45
+ await continueTurn(deps, active, prompt, chatId, threadId, ackIdPromise);
46
+ }
47
+ catch (err) {
48
+ logger.error(`${PLUGIN_TAG} Rehydrate+continue ${active.slug} failed: ${err instanceof Error ? err.message : String(err)}`);
49
+ scheduleIdle(deps, key, active);
50
+ }
51
+ })();
52
+ return {
53
+ handled: true,
54
+ text: `⏳ [${active.meta.id || '?'}] Resuming & continuing ${active.slug}...`,
55
+ _resolveAckId: resolveAckId,
56
+ };
57
+ }
58
+ try {
59
+ sessionManager.getStatus(active.sessionName);
60
+ }
61
+ catch {
62
+ activeSessions.delete(key);
63
+ return {
64
+ handled: true,
65
+ text: 'Previous session expired. Use /cc resume or start fresh with /cc <prompt>',
66
+ };
67
+ }
68
+ if (active.idleTimer)
69
+ clearTimeout(active.idleTimer);
70
+ logger.info(`${PLUGIN_TAG} /cc+ continuation: slug=${active.slug} chat=${chatId} thread=${threadId || 'none'}`);
71
+ let resolveAckId;
72
+ const ackIdPromise = new Promise((r) => {
73
+ resolveAckId = r;
74
+ });
75
+ continueTurn(deps, active, prompt, chatId, threadId, ackIdPromise).catch((err) => {
76
+ logger.error(`${PLUGIN_TAG} Continuation ${active.slug} failed: ${err instanceof Error ? err.message : String(err)}`);
77
+ scheduleIdle(deps, key, active);
78
+ });
79
+ return {
80
+ handled: true,
81
+ text: `⏳ [${active.meta.id || '?'}] Continuing ${active.slug}...`,
82
+ _resolveAckId: resolveAckId,
83
+ };
84
+ }
85
+ // ── Resume Handler ────────────────────────────────────────────────────────
86
+ export function handleResume(deps, chatId, threadId, targetSlug) {
87
+ const { activeSessions, logger } = deps;
88
+ const key = sessionMapKey(chatId, threadId);
89
+ const currentActive = activeSessions.get(key);
90
+ if (currentActive) {
91
+ return {
92
+ handled: true,
93
+ text: `Already have active session: ${currentActive.slug}\nUse /cc stop first, or /cc+ to continue it.`,
94
+ };
95
+ }
96
+ let meta = null;
97
+ if (targetSlug) {
98
+ const isSessionId = /^[0-9a-f]{8}$/i.test(targetSlug);
99
+ if (isSessionId) {
100
+ meta = loadSessionById(targetSlug.toLowerCase());
101
+ }
102
+ if (!meta) {
103
+ meta = loadSession(targetSlug);
104
+ }
105
+ if (!meta) {
106
+ return { handled: true, text: `Session "${targetSlug}" not found.` };
107
+ }
108
+ if (meta.chatId !== chatId) {
109
+ return {
110
+ handled: true,
111
+ text: `Session "${targetSlug}" belongs to a different chat.`,
112
+ };
113
+ }
114
+ }
115
+ else {
116
+ const candidates = scanAllSessions()
117
+ .filter((s) => s.chatId === chatId &&
118
+ (s.threadId || undefined) === (threadId || undefined) &&
119
+ !!s.claudeSessionId)
120
+ .sort((a, b) => {
121
+ const timeA = new Date(a.lastContinuedAt || a.completedAt || a.startedAt).getTime();
122
+ const timeB = new Date(b.lastContinuedAt || b.completedAt || b.startedAt).getTime();
123
+ return timeB - timeA;
124
+ });
125
+ if (candidates.length === 0) {
126
+ return {
127
+ handled: true,
128
+ text: 'No resumable session found. Start fresh with /cc <prompt>',
129
+ };
130
+ }
131
+ meta = candidates[0];
132
+ }
133
+ if (!meta.claudeSessionId) {
134
+ return {
135
+ handled: true,
136
+ text: `Session ${meta.slug} has no Claude session ID — cannot resume.\nStart fresh with /cc <prompt>`,
137
+ };
138
+ }
139
+ const { slug, id: resumeId } = meta;
140
+ logger.info(`${PLUGIN_TAG} /cc resume: id=${resumeId} slug=${slug} claudeId=${meta.claudeSessionId} chat=${chatId} thread=${threadId || 'none'}`);
141
+ rehydrateSession(deps, meta, chatId, threadId).catch((err) => {
142
+ logger.error(`${PLUGIN_TAG} Resume ${slug} failed: ${err instanceof Error ? err.message : String(err)}`);
143
+ meta.state = 'failed';
144
+ meta.error = `Resume failed: ${err instanceof Error ? err.message : String(err)}`;
145
+ try {
146
+ saveSession(meta);
147
+ }
148
+ catch { /* best effort */ }
149
+ const active = activeSessions.get(key);
150
+ if (active?.slug === slug) {
151
+ if (active.idleTimer)
152
+ clearTimeout(active.idleTimer);
153
+ activeSessions.delete(key);
154
+ }
155
+ });
156
+ return { handled: true, text: `⏳ [${resumeId || '?'}] Resuming ${slug}...` };
157
+ }
158
+ // ── Rehydrate Session ─────────────────────────────────────────────────────
159
+ export async function rehydrateSession(deps, meta, chatId, threadId) {
160
+ const { sessionManager, activeSessions, logger } = deps;
161
+ const { slug, sessionName, claudeSessionId } = meta;
162
+ const key = sessionMapKey(chatId, threadId);
163
+ logger.info(`${PLUGIN_TAG} Rehydrating ${sessionName} with claudeSessionId=${claudeSessionId}...`);
164
+ await sessionManager.startSession({
165
+ name: sessionName,
166
+ cwd: meta.cwd || DEFAULT_CWD,
167
+ engine: 'claude',
168
+ permissionMode: 'bypassPermissions',
169
+ effort: 'high',
170
+ resumeSessionId: claudeSessionId,
171
+ });
172
+ const prevActive = activeSessions.get(key);
173
+ if (prevActive && prevActive.sessionName !== sessionName) {
174
+ if (prevActive.idleTimer)
175
+ clearTimeout(prevActive.idleTimer);
176
+ try {
177
+ await sessionManager.stopSession(prevActive.sessionName);
178
+ }
179
+ catch { /* ignore */ }
180
+ }
181
+ meta.state = 'idle';
182
+ meta.threadId = threadId;
183
+ meta.lastContinuedAt = new Date().toISOString();
184
+ try {
185
+ saveSession(meta);
186
+ }
187
+ catch { /* best effort */ }
188
+ const activeEntry = { sessionName, slug, meta, idleTimer: null };
189
+ activeSessions.set(key, activeEntry);
190
+ logger.info(`${PLUGIN_TAG} Session ${sessionName} resumed — idle for ${IDLE_TIMEOUT_MS / 1000}s`);
191
+ scheduleIdle(deps, key, activeEntry);
192
+ }
193
+ // ── Continuation Turn ─────────────────────────────────────────────────────
194
+ export async function continueTurn(deps, active, prompt, chatId, threadId, ackIdPromise) {
195
+ const { sessionManager, logger } = deps;
196
+ const { sessionName, meta } = active;
197
+ const key = sessionMapKey(chatId, threadId);
198
+ meta.state = 'running';
199
+ try {
200
+ saveSession(meta);
201
+ }
202
+ catch { /* best effort */ }
203
+ const opts = { telegramChatId: chatId };
204
+ if (threadId)
205
+ opts.telegramThreadId = threadId;
206
+ const ackMsgId = await Promise.race([
207
+ ackIdPromise,
208
+ new Promise((r) => setTimeout(() => r(null), ACK_TIMEOUT_MS)),
209
+ ]);
210
+ if (ackMsgId)
211
+ opts.telegramAckMessageId = ackMsgId;
212
+ const result = await sessionManager.sendMessage(sessionName, prompt, opts);
213
+ meta.state = 'idle';
214
+ meta.turns = (meta.turns || 1) + 1;
215
+ meta.lastContinuedAt = new Date().toISOString();
216
+ meta.output = (result?.output || '').slice(0, 2000);
217
+ meta.claudeSessionId = result?.sessionId ?? meta.claudeSessionId;
218
+ try {
219
+ saveSession(meta);
220
+ }
221
+ catch { /* best effort */ }
222
+ // v0.6.0: post-turn context-pressure check (continuation turn).
223
+ void _postTurnContextCheck(deps, sessionName, chatId, threadId);
224
+ // 2026-05-07 FIX — direct answer delivery (continuation turn).
225
+ if (result?.output && chatId) {
226
+ try {
227
+ await sendDirectReply(chatId, threadId, result.output, logger);
228
+ }
229
+ catch (e) {
230
+ logger.warn(`${PLUGIN_TAG} Direct answer delivery failed for ${sessionName} (continuation): ${e instanceof Error ? e.message : String(e)}`);
231
+ }
232
+ }
233
+ logger.info(`${PLUGIN_TAG} Session ${sessionName} turn ${meta.turns} complete`);
234
+ scheduleIdle(deps, key, active);
235
+ }
236
+ //# sourceMappingURL=resume-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-policy.js","sourceRoot":"","sources":["../../../src/command-router/resume-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * turn-formatter — Telegram direct-send + observability formatting helpers.
3
+ *
4
+ * Extracted from cc-handler.ts (Step 1 of Phase 5 v0.11.0 decomposition).
5
+ * Contains: loadBotToken, telegramApiDirect, sendDirectReply,
6
+ * buildPhase2FlagsLine, buildObservabilityLines.
7
+ */
8
+ export declare function loadBotToken(logger?: Console): void;
9
+ export declare function sendDirectReply(chatId: string, threadId: string | undefined, text: string, logger?: Console): Promise<number | null>;
10
+ /** Returns the current BOT_TOKEN (for callers that need to check if it's set). */
11
+ export declare function hasBotToken(): boolean;
12
+ export declare function buildPhase2FlagsLine(): string;
13
+ /**
14
+ * Pillar C v0.4.0 — compose observability lines for /cc status panel.
15
+ * Reads from Pillar A metrics, Pillar B trajectory tail, and status-tee
16
+ * quota snapshot. Each source is independently fault-tolerant: if one
17
+ * fails, the line shows "?" rather than crashing the panel.
18
+ */
19
+ export declare function buildObservabilityLines(): string;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * turn-formatter — Telegram direct-send + observability formatting helpers.
3
+ *
4
+ * Extracted from cc-handler.ts (Step 1 of Phase 5 v0.11.0 decomposition).
5
+ * Contains: loadBotToken, telegramApiDirect, sendDirectReply,
6
+ * buildPhase2FlagsLine, buildObservabilityLines.
7
+ */
8
+ import * as fs from 'node:fs';
9
+ import { request as httpsRequest } from 'node:https';
10
+ const PLUGIN_TAG = '[cc-openclaw/command-router]';
11
+ const OPENCLAW_CONFIG_PATH = '/home/a1xai/.openclaw/openclaw.json';
12
+ // ── Telegram Direct Send ──────────────────────────────────────────────────
13
+ let BOT_TOKEN = '';
14
+ export function loadBotToken(logger = console) {
15
+ if (BOT_TOKEN)
16
+ return;
17
+ try {
18
+ const raw = fs.readFileSync(OPENCLAW_CONFIG_PATH, 'utf8');
19
+ const cfg = JSON.parse(raw);
20
+ const tg = cfg.channels?.telegram;
21
+ if (tg?.accounts) {
22
+ const acctKey = tg.defaultAccount || 'default';
23
+ const acct = tg.accounts[acctKey] || {};
24
+ BOT_TOKEN = acct.botToken || '';
25
+ }
26
+ if (BOT_TOKEN)
27
+ logger.info(`${PLUGIN_TAG} Bot token loaded for direct replies`);
28
+ }
29
+ catch (err) {
30
+ logger.warn(`${PLUGIN_TAG} Failed to load bot token: ${err instanceof Error ? err.message : String(err)}`);
31
+ }
32
+ }
33
+ function telegramApiDirect(method, params) {
34
+ return new Promise((resolve, reject) => {
35
+ const body = JSON.stringify(params);
36
+ const options = {
37
+ hostname: 'api.telegram.org',
38
+ path: `/bot${BOT_TOKEN}/${method}`,
39
+ method: 'POST',
40
+ headers: {
41
+ 'Content-Type': 'application/json',
42
+ 'Content-Length': Buffer.byteLength(body),
43
+ },
44
+ };
45
+ const req = httpsRequest(options, (res) => {
46
+ let data = '';
47
+ res.on('data', (chunk) => (data += chunk));
48
+ res.on('end', () => {
49
+ try {
50
+ resolve(JSON.parse(data));
51
+ }
52
+ catch {
53
+ resolve({ ok: false });
54
+ }
55
+ });
56
+ });
57
+ req.on('error', reject);
58
+ req.setTimeout(10_000, () => req.destroy(new Error('Telegram API timeout')));
59
+ req.write(body);
60
+ req.end();
61
+ });
62
+ }
63
+ export async function sendDirectReply(chatId, threadId, text, logger = console) {
64
+ if (!BOT_TOKEN || !chatId)
65
+ return null;
66
+ try {
67
+ const params = {
68
+ chat_id: chatId,
69
+ text,
70
+ disable_web_page_preview: true,
71
+ };
72
+ if (threadId)
73
+ params.message_thread_id = Number(threadId);
74
+ const res = await telegramApiDirect('sendMessage', params);
75
+ if (!res.ok) {
76
+ logger.warn(`${PLUGIN_TAG} Direct reply failed: ${JSON.stringify(res.description || res)}`);
77
+ return null;
78
+ }
79
+ return res.result?.message_id ?? null;
80
+ }
81
+ catch (err) {
82
+ logger.warn(`${PLUGIN_TAG} Direct reply error: ${err instanceof Error ? err.message : String(err)}`);
83
+ return null;
84
+ }
85
+ }
86
+ /** Returns the current BOT_TOKEN (for callers that need to check if it's set). */
87
+ export function hasBotToken() {
88
+ return BOT_TOKEN !== '';
89
+ }
90
+ // ── Phase 2 Flags ─────────────────────────────────────────────────────────
91
+ export function buildPhase2FlagsLine() {
92
+ const allowBuiltins = process.env.CC_OPENCLAW_ALLOW_BUILTINS === '1';
93
+ const toolStream = process.env.CC_OPENCLAW_TOOL_STREAM === '1';
94
+ return `Flags: builtins=${allowBuiltins ? 'on' : 'off'} | toolstream=${toolStream ? 'on' : 'off'}`;
95
+ }
96
+ // ── Observability Lines ───────────────────────────────────────────────────
97
+ /**
98
+ * Pillar C v0.4.0 — compose observability lines for /cc status panel.
99
+ * Reads from Pillar A metrics, Pillar B trajectory tail, and status-tee
100
+ * quota snapshot. Each source is independently fault-tolerant: if one
101
+ * fails, the line shows "?" rather than crashing the panel.
102
+ */
103
+ export function buildObservabilityLines() {
104
+ const lines = [];
105
+ // Plan quota (status-tee)
106
+ try {
107
+ // Lazy require so this file remains testable without status-tee
108
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
109
+ const { readQuotaSnapshot, formatQuotaLine } = require('../lib/status-tee-reader.js');
110
+ lines.push(formatQuotaLine(readQuotaSnapshot()));
111
+ }
112
+ catch {
113
+ lines.push('Plan: ?%');
114
+ }
115
+ // Workers + uptime + last error (Pillar A metrics)
116
+ try {
117
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
118
+ const { metricsRegistry } = require('../health/metrics.js');
119
+ const out = metricsRegistry.serializePrometheus();
120
+ const workersMatch = /cc_openclaw_workers (\d+)/.exec(out);
121
+ const uptimeMatch = /cc_openclaw_uptime_seconds (\d+)/.exec(out);
122
+ const lastErrMatch = /cc_openclaw_last_error_seconds (\d+)/.exec(out);
123
+ const errorsMatch = /cc_openclaw_errors_total (\d+)/.exec(out);
124
+ const workers = workersMatch ? workersMatch[1] : '?';
125
+ const uptime = uptimeMatch ? Math.floor(parseInt(uptimeMatch[1], 10) / 60) : '?';
126
+ lines.push(`Workers: ${workers} | Uptime: ${uptime}m`);
127
+ const errCount = errorsMatch ? parseInt(errorsMatch[1], 10) : 0;
128
+ const lastErrTs = lastErrMatch ? parseInt(lastErrMatch[1], 10) : 0;
129
+ if (errCount === 0 || lastErrTs === 0) {
130
+ lines.push('Last error: none');
131
+ }
132
+ else {
133
+ const agoSec = Math.floor(Date.now() / 1000) - lastErrTs;
134
+ const agoLabel = agoSec < 60 ? `${agoSec}s` : agoSec < 3600 ? `${Math.floor(agoSec / 60)}m` : `${Math.floor(agoSec / 3600)}h`;
135
+ lines.push(`Last error: ${agoLabel} ago (${errCount} total)`);
136
+ }
137
+ }
138
+ catch {
139
+ lines.push('Workers: ? | Uptime: ?');
140
+ lines.push('Last error: ?');
141
+ }
142
+ return lines.join('\n');
143
+ }
144
+ //# sourceMappingURL=turn-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-formatter.js","sourceRoot":"","sources":["../../../src/command-router/turn-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * drift-detector — snapshots the parsed Config to disk on a healthy boot;
3
+ * compares on subsequent boots and returns a delta list.
4
+ *
5
+ * Primary purpose: detect keys pruned by `openclaw doctor --fix`
6
+ * (OF5 — feedback_cc_openclaw_provider_timeout.md).
7
+ *
8
+ * Snapshot path: ~/.openclaw/workspace/memory/cc-openclaw-config-snapshot.json
9
+ * The file is written atomically (write-then-rename is not available in pure
10
+ * Node ESM without extra deps; we write directly since the worst case is a
11
+ * corrupted snapshot — non-fatal; falls back to empty baseline).
12
+ */
13
+ import type { Config } from './schema.js';
14
+ export interface ConfigDelta {
15
+ path: string;
16
+ previous: unknown;
17
+ current: unknown;
18
+ }
19
+ /**
20
+ * Compare current config against the on-disk snapshot.
21
+ * Returns an array of changed paths (empty = no drift).
22
+ */
23
+ export declare function detectDrift(current: Config): ConfigDelta[];
24
+ /**
25
+ * Persist current config as the baseline snapshot for future drift detection.
26
+ * Called at the end of a successful boot (after phase 7 / ready state).
27
+ */
28
+ export declare function saveSnapshot(current: Config): void;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * drift-detector — snapshots the parsed Config to disk on a healthy boot;
3
+ * compares on subsequent boots and returns a delta list.
4
+ *
5
+ * Primary purpose: detect keys pruned by `openclaw doctor --fix`
6
+ * (OF5 — feedback_cc_openclaw_provider_timeout.md).
7
+ *
8
+ * Snapshot path: ~/.openclaw/workspace/memory/cc-openclaw-config-snapshot.json
9
+ * The file is written atomically (write-then-rename is not available in pure
10
+ * Node ESM without extra deps; we write directly since the worst case is a
11
+ * corrupted snapshot — non-fatal; falls back to empty baseline).
12
+ */
13
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
14
+ import { homedir } from 'os';
15
+ import { join, dirname } from 'path';
16
+ const SNAPSHOT_PATH = join(homedir(), '.openclaw', 'workspace', 'memory', 'cc-openclaw-config-snapshot.json');
17
+ // ── Internal helpers ──────────────────────────────────────────────────────────
18
+ function flattenConfig(obj, prefix = '') {
19
+ if (obj === null || typeof obj !== 'object') {
20
+ return { [prefix]: obj };
21
+ }
22
+ const result = {};
23
+ for (const [k, v] of Object.entries(obj)) {
24
+ const key = prefix ? `${prefix}.${k}` : k;
25
+ if (v !== null && typeof v === 'object' && !Array.isArray(v)) {
26
+ Object.assign(result, flattenConfig(v, key));
27
+ }
28
+ else {
29
+ result[key] = v;
30
+ }
31
+ }
32
+ return result;
33
+ }
34
+ function readSnapshot() {
35
+ if (!existsSync(SNAPSHOT_PATH))
36
+ return {};
37
+ try {
38
+ const raw = readFileSync(SNAPSHOT_PATH, 'utf8');
39
+ return JSON.parse(raw);
40
+ }
41
+ catch {
42
+ return {};
43
+ }
44
+ }
45
+ // ── Public API ────────────────────────────────────────────────────────────────
46
+ /**
47
+ * Compare current config against the on-disk snapshot.
48
+ * Returns an array of changed paths (empty = no drift).
49
+ */
50
+ export function detectDrift(current) {
51
+ const previous = readSnapshot();
52
+ const flat = flattenConfig(current);
53
+ const deltas = [];
54
+ for (const [path, value] of Object.entries(flat)) {
55
+ if (path in previous && JSON.stringify(previous[path]) !== JSON.stringify(value)) {
56
+ deltas.push({ path, previous: previous[path], current: value });
57
+ }
58
+ }
59
+ return deltas;
60
+ }
61
+ /**
62
+ * Persist current config as the baseline snapshot for future drift detection.
63
+ * Called at the end of a successful boot (after phase 7 / ready state).
64
+ */
65
+ export function saveSnapshot(current) {
66
+ try {
67
+ mkdirSync(dirname(SNAPSHOT_PATH), { recursive: true });
68
+ const flat = flattenConfig(current);
69
+ writeFileSync(SNAPSHOT_PATH, JSON.stringify(flat, null, 2), 'utf8');
70
+ }
71
+ catch {
72
+ // Non-fatal: drift detection degrades to "no baseline" on next boot.
73
+ }
74
+ }
75
+ //# sourceMappingURL=drift-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift-detector.js","sourceRoot":"","sources":["../../../src/config/drift-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * loadConfigSources — reads env vars + ~/.openclaw/openclaw.json, returns a
3
+ * raw object for ConfigSchema.parse().
4
+ *
5
+ * Does NOT throw on missing files — caller receives defaults via zod.
6
+ * Throws ConfigInvalid only when ConfigSchema.parse() rejects (via boot phase 1).
7
+ */
8
+ export declare function loadConfigSources(): Record<string, unknown>;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * loadConfigSources — reads env vars + ~/.openclaw/openclaw.json, returns a
3
+ * raw object for ConfigSchema.parse().
4
+ *
5
+ * Does NOT throw on missing files — caller receives defaults via zod.
6
+ * Throws ConfigInvalid only when ConfigSchema.parse() rejects (via boot phase 1).
7
+ */
8
+ import { existsSync, readFileSync } from 'fs';
9
+ import { homedir } from 'os';
10
+ import { join } from 'path';
11
+ const OPENCLAW_JSON_PATH = join(homedir(), '.openclaw', 'openclaw.json');
12
+ function readOpenClawJson() {
13
+ if (!existsSync(OPENCLAW_JSON_PATH))
14
+ return {};
15
+ try {
16
+ const raw = readFileSync(OPENCLAW_JSON_PATH, 'utf8');
17
+ return JSON.parse(raw);
18
+ }
19
+ catch {
20
+ return {};
21
+ }
22
+ }
23
+ function parseBoolEnv(key, fallback = false) {
24
+ const val = process.env[key];
25
+ if (val === undefined)
26
+ return fallback;
27
+ return val === '1' || val === 'true';
28
+ }
29
+ function parseIntEnv(key, fallback) {
30
+ const val = process.env[key];
31
+ if (val === undefined)
32
+ return fallback;
33
+ const n = parseInt(val, 10);
34
+ return isNaN(n) ? fallback : n;
35
+ }
36
+ // ── Main ──────────────────────────────────────────────────────────────────────
37
+ export function loadConfigSources() {
38
+ const oclJson = readOpenClawJson();
39
+ // Extract timeoutSeconds from models.providers["cc-openclaw"].timeoutSeconds
40
+ const ccProvider = oclJson.models?.providers?.['cc-openclaw'];
41
+ const timeoutSeconds = ccProvider?.timeoutSeconds ??
42
+ parseIntEnv('CC_OPENCLAW_TIMEOUT_SECONDS');
43
+ // Extract fallback chain from agents.defaults.model.fallbacks
44
+ const fallbackChain = oclJson.agents?.defaults?.model?.fallbacks ?? [];
45
+ return {
46
+ openclawCcOpenclawActive: parseBoolEnv('OPENCLAW_CC_OPENCLAW_ACTIVE'),
47
+ openclawCcOpenclawListeners: parseBoolEnv('OPENCLAW_CC_OPENCLAW_LISTENERS'),
48
+ ccOpenclaw: {
49
+ nativeTools: {
50
+ enabled: parseBoolEnv('CC_OPENCLAW_NATIVE_TOOLS', true),
51
+ // allowList not env-driven; comes from schema default (Q1)
52
+ },
53
+ stalledKillMs: parseIntEnv('CC_OPENCLAW_STALLED_KILL_MS'),
54
+ loopMaxSubprocs: parseIntEnv('CC_OPENCLAW_LOOP_MAX_SUBPROCS'),
55
+ cacheParity: parseBoolEnv('OPENCLAW_CACHE_PARITY', true),
56
+ ttsAutoMode: process.env['OPENCLAW_TTS_AUTO_MODE'],
57
+ },
58
+ openclawJson: {
59
+ timeoutSeconds,
60
+ messagesTts: {
61
+ timeoutMs: oclJson.messages?.tts?.timeoutMs,
62
+ maxTextLength: oclJson.messages?.tts?.maxTextLength,
63
+ },
64
+ fallbackChain,
65
+ pluginsAllow: oclJson.plugins?.allow ?? [],
66
+ },
67
+ };
68
+ }
69
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;AA0BzE,SAAS,gBAAgB;IACvB,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,QAAQ,GAAG,KAAK;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACvC,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,MAAM,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,QAAiB;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACvC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,6EAA6E;IAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,cAAc,GAClB,UAAU,EAAE,cAAc;QAC1B,WAAW,CAAC,6BAA6B,CAAC,CAAC;IAE7C,8DAA8D;IAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAEvE,OAAO;QACL,wBAAwB,EAAE,YAAY,CAAC,6BAA6B,CAAC;QACrE,2BAA2B,EAAE,YAAY,CAAC,gCAAgC,CAAC;QAC3E,UAAU,EAAE;YACV,WAAW,EAAE;gBACX,OAAO,EAAE,YAAY,CAAC,0BAA0B,EAAE,IAAI,CAAC;gBACvD,2DAA2D;aAC5D;YACD,aAAa,EAAE,WAAW,CAAC,6BAA6B,CAAC;YACzD,eAAe,EAAE,WAAW,CAAC,+BAA+B,CAAC;YAC7D,WAAW,EAAE,YAAY,CAAC,uBAAuB,EAAE,IAAI,CAAC;YACxD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;SACnD;QACD,YAAY,EAAE;YACZ,cAAc;YACd,WAAW,EAAE;gBACX,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS;gBAC3C,aAAa,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,aAAa;aACpD;YACD,aAAa;YACb,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;SAC3C;KACF,CAAC;AACJ,CAAC"}