@clinebot/core 0.0.37 → 0.0.38

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 (617) hide show
  1. package/README.md +11 -1
  2. package/dist/ClineCore.d.ts +18 -214
  3. package/dist/account/cline-account-service.d.ts +0 -1
  4. package/dist/account/index.d.ts +0 -1
  5. package/dist/account/rpc.d.ts +0 -1
  6. package/dist/account/types.d.ts +0 -1
  7. package/dist/auth/bounded-ttl-cache.d.ts +0 -1
  8. package/dist/auth/client.d.ts +0 -1
  9. package/dist/auth/cline.d.ts +0 -5
  10. package/dist/auth/codex.d.ts +0 -1
  11. package/dist/auth/oca.d.ts +0 -1
  12. package/dist/auth/server.d.ts +0 -1
  13. package/dist/auth/types.d.ts +0 -1
  14. package/dist/auth/utils.d.ts +0 -1
  15. package/dist/cline-core/automation.d.ts +34 -0
  16. package/dist/cline-core/runtime-services.d.ts +5 -0
  17. package/dist/cline-core/start-input.d.ts +10 -0
  18. package/dist/cline-core/telemetry.d.ts +10 -0
  19. package/dist/cline-core/types.d.ts +221 -0
  20. package/dist/cron/{cron-event-ingress.d.ts → events/cron-event-ingress.d.ts} +1 -2
  21. package/dist/cron/{cron-report-writer.d.ts → reports/cron-report-writer.d.ts} +1 -2
  22. package/dist/cron/{cron-materializer.d.ts → runner/cron-materializer.d.ts} +1 -2
  23. package/dist/cron/{cron-runner.d.ts → runner/cron-runner.d.ts} +6 -4
  24. package/dist/cron/{resource-limiter.d.ts → runner/resource-limiter.d.ts} +0 -1
  25. package/dist/cron/schedule/scheduler.d.ts +12 -0
  26. package/dist/cron/{cron-service.d.ts → service/cron-service.d.ts} +4 -5
  27. package/dist/cron/{schedule-command-service.d.ts → service/schedule-command-service.d.ts} +0 -1
  28. package/dist/cron/{schedule-service.d.ts → service/schedule-service.d.ts} +20 -22
  29. package/dist/cron/{cron-reconciler.d.ts → specs/cron-reconciler.d.ts} +1 -2
  30. package/dist/cron/{cron-spec-parser.d.ts → specs/cron-spec-parser.d.ts} +0 -1
  31. package/dist/cron/{cron-watcher.d.ts → specs/cron-watcher.d.ts} +0 -1
  32. package/dist/cron/{cron-schema.d.ts → store/cron-schema.d.ts} +0 -1
  33. package/dist/cron/{sqlite-cron-store.d.ts → store/sqlite-cron-store.d.ts} +12 -2
  34. package/dist/extensions/config/index.d.ts +4 -7
  35. package/dist/extensions/config/runtime-commands.d.ts +0 -1
  36. package/dist/extensions/config/skill-frontmatter-toggle.d.ts +11 -0
  37. package/dist/extensions/config/unified-config-file-watcher.d.ts +0 -1
  38. package/dist/extensions/config/user-instruction-config-loader.d.ts +0 -1
  39. package/dist/extensions/config/user-instruction-plugin.d.ts +25 -0
  40. package/dist/extensions/config/user-instruction-service.d.ts +23 -0
  41. package/dist/extensions/context/agentic-compaction.d.ts +0 -1
  42. package/dist/extensions/context/basic-compaction.d.ts +0 -1
  43. package/dist/extensions/context/compaction-shared.d.ts +0 -1
  44. package/dist/extensions/context/compaction.d.ts +0 -1
  45. package/dist/extensions/index.d.ts +0 -1
  46. package/dist/extensions/mcp/client.d.ts +0 -1
  47. package/dist/extensions/mcp/config-loader.d.ts +0 -1
  48. package/dist/extensions/mcp/index.d.ts +0 -1
  49. package/dist/extensions/mcp/manager.d.ts +0 -1
  50. package/dist/extensions/mcp/name-transform.d.ts +0 -1
  51. package/dist/extensions/mcp/policies.d.ts +0 -1
  52. package/dist/extensions/mcp/tools.d.ts +2 -3
  53. package/dist/extensions/mcp/types.d.ts +3 -4
  54. package/dist/extensions/plugin/plugin-config-loader.d.ts +0 -1
  55. package/dist/extensions/plugin/plugin-load-report.d.ts +0 -1
  56. package/dist/extensions/plugin/plugin-loader.d.ts +0 -1
  57. package/dist/extensions/plugin/plugin-module-import.d.ts +0 -1
  58. package/dist/extensions/plugin/plugin-sandbox.d.ts +0 -1
  59. package/dist/extensions/plugin/plugin-targeting.d.ts +0 -1
  60. package/dist/extensions/plugin-sandbox-bootstrap.js +1 -446
  61. package/dist/extensions/tools/constants.d.ts +0 -1
  62. package/dist/extensions/tools/definitions.d.ts +13 -14
  63. package/dist/extensions/tools/executors/apply-patch-parser.d.ts +0 -1
  64. package/dist/extensions/tools/executors/apply-patch.d.ts +0 -1
  65. package/dist/extensions/tools/executors/bash.d.ts +0 -1
  66. package/dist/extensions/tools/executors/editor.d.ts +0 -1
  67. package/dist/extensions/tools/executors/file-read.d.ts +0 -1
  68. package/dist/extensions/tools/executors/index.d.ts +0 -1
  69. package/dist/extensions/tools/executors/search.d.ts +0 -1
  70. package/dist/extensions/tools/executors/web-fetch.d.ts +0 -1
  71. package/dist/extensions/tools/helpers.d.ts +0 -1
  72. package/dist/extensions/tools/index.d.ts +2 -3
  73. package/dist/extensions/tools/model-tool-routing.d.ts +0 -1
  74. package/dist/extensions/tools/presets.d.ts +4 -5
  75. package/dist/extensions/tools/runtime.d.ts +0 -1
  76. package/dist/extensions/tools/schemas.d.ts +0 -1
  77. package/dist/extensions/tools/team/delegated-agent.d.ts +3 -4
  78. package/dist/extensions/tools/team/index.d.ts +0 -1
  79. package/dist/extensions/tools/team/multi-agent.d.ts +1 -2
  80. package/dist/extensions/tools/team/projections.d.ts +0 -1
  81. package/dist/extensions/tools/team/runtime.d.ts +0 -1
  82. package/dist/extensions/tools/team/spawn-agent-tool.d.ts +4 -5
  83. package/dist/extensions/tools/team/subagent-prompts.d.ts +0 -1
  84. package/dist/extensions/tools/team/team-tools.d.ts +7 -8
  85. package/dist/extensions/tools/types.d.ts +11 -12
  86. package/dist/hooks/checkpoint-hooks.d.ts +9 -2
  87. package/dist/hooks/hook-extension.d.ts +2 -0
  88. package/dist/{extensions/config/hooks-config-loader.d.ts → hooks/hook-file-config.d.ts} +1 -2
  89. package/dist/hooks/hook-file-hooks.d.ts +2 -2
  90. package/dist/hooks/index.d.ts +3 -1
  91. package/dist/hooks/subprocess-runner.d.ts +0 -1
  92. package/dist/hooks/subprocess.d.ts +0 -1
  93. package/dist/hub/{connect.d.ts → client/connect.d.ts} +1 -2
  94. package/dist/hub/{client.d.ts → client/index.d.ts} +41 -4
  95. package/dist/hub/{session-client.d.ts → client/session-client.d.ts} +41 -13
  96. package/dist/hub/{ui-client.d.ts → client/ui-client.d.ts} +1 -1
  97. package/dist/hub/daemon/entry.d.ts +1 -0
  98. package/dist/hub/daemon/entry.js +720 -0
  99. package/dist/hub/{daemon.d.ts → daemon/index.d.ts} +6 -3
  100. package/dist/hub/{runtime-handlers.d.ts → daemon/runtime-handlers.d.ts} +3 -2
  101. package/dist/hub/{start-shared-server.d.ts → daemon/start-shared-server.d.ts} +1 -2
  102. package/dist/hub/{defaults.d.ts → discovery/defaults.d.ts} +0 -1
  103. package/dist/hub/{discovery.d.ts → discovery/index.d.ts} +2 -1
  104. package/dist/hub/{workspace.d.ts → discovery/workspace.d.ts} +1 -2
  105. package/dist/hub/index.d.ts +28 -11
  106. package/dist/hub/index.js +484 -1061
  107. package/dist/hub/runtime-host/hub-runtime-host.d.ts +73 -0
  108. package/dist/{transports/remote.d.ts → hub/runtime-host/remote-runtime-host.d.ts} +1 -2
  109. package/dist/hub/{browser-websocket.d.ts → server/browser-websocket.d.ts} +1 -2
  110. package/dist/hub/{transport.d.ts → server/command-transport.d.ts} +0 -1
  111. package/dist/hub/server/handlers/approval-handlers.d.ts +17 -0
  112. package/dist/hub/server/handlers/capability-handlers.d.ts +12 -0
  113. package/dist/hub/server/handlers/client-handlers.d.ts +6 -0
  114. package/dist/hub/server/handlers/context.d.ts +56 -0
  115. package/dist/hub/server/handlers/run-handlers.d.ts +5 -0
  116. package/dist/hub/server/handlers/session-event-projector.d.ts +7 -0
  117. package/dist/hub/server/handlers/session-handlers.d.ts +20 -0
  118. package/dist/hub/server/hub-client-contributions.d.ts +19 -0
  119. package/dist/hub/server/hub-notifications.d.ts +7 -0
  120. package/dist/hub/server/hub-schedule-events.d.ts +2 -0
  121. package/dist/hub/server/hub-server-logging.d.ts +2 -0
  122. package/dist/hub/server/hub-server-options.d.ts +55 -0
  123. package/dist/hub/server/hub-server-transport.d.ts +34 -0
  124. package/dist/hub/server/hub-session-records.d.ts +8 -0
  125. package/dist/hub/server/hub-websocket-server.d.ts +6 -0
  126. package/dist/hub/server/index.d.ts +4 -0
  127. package/dist/hub/{native-transport.d.ts → server/native-transport.d.ts} +1 -2
  128. package/dist/index.d.ts +51 -41
  129. package/dist/index.js +214 -872
  130. package/dist/runtime/capabilities/index.d.ts +2 -0
  131. package/dist/runtime/capabilities/normalize-runtime-capabilities.d.ts +2 -0
  132. package/dist/runtime/capabilities/runtime-capabilities.d.ts +6 -0
  133. package/dist/runtime/config/agent-message-codec.d.ts +6 -0
  134. package/dist/runtime/{agent-runtime-config-builder.d.ts → config/agent-runtime-config-builder.d.ts} +12 -21
  135. package/dist/runtime/host/history.d.ts +18 -0
  136. package/dist/runtime/{host.d.ts → host/host.d.ts} +3 -4
  137. package/dist/runtime/host/local/agent-event-bridge.d.ts +29 -0
  138. package/dist/runtime/host/local/session-record.d.ts +6 -0
  139. package/dist/runtime/host/local/session-service-invoker.d.ts +4 -0
  140. package/dist/runtime/host/local/spawn-tool.d.ts +15 -0
  141. package/dist/runtime/host/local/user-files.d.ts +1 -0
  142. package/dist/runtime/host/local-runtime-host.d.ts +118 -0
  143. package/dist/{transports → runtime/host}/runtime-host-support.d.ts +3 -5
  144. package/dist/runtime/{runtime-host.d.ts → host/runtime-host.d.ts} +66 -31
  145. package/dist/runtime/{runtime-builder.d.ts → orchestration/runtime-builder.d.ts} +0 -1
  146. package/dist/runtime/{runtime-event-adapter.d.ts → orchestration/runtime-event-adapter.d.ts} +0 -1
  147. package/dist/runtime/{runtime-oauth-token-manager.d.ts → orchestration/runtime-oauth-token-manager.d.ts} +1 -2
  148. package/dist/runtime/{session-runtime-orchestrator.d.ts → orchestration/session-runtime-orchestrator.d.ts} +20 -63
  149. package/dist/runtime/{session-runtime.d.ts → orchestration/session-runtime.d.ts} +14 -12
  150. package/dist/runtime/{user-input-builder.d.ts → orchestration/user-input-builder.d.ts} +2 -11
  151. package/dist/runtime/{loop-detection.d.ts → safety/loop-detection.d.ts} +0 -1
  152. package/dist/runtime/{mistake-tracker.d.ts → safety/mistake-tracker.d.ts} +0 -1
  153. package/dist/runtime/{rules.d.ts → safety/rules.d.ts} +1 -2
  154. package/dist/runtime/{subprocess-sandbox.d.ts → tools/subprocess-sandbox.d.ts} +15 -1
  155. package/dist/runtime/{tool-approval.d.ts → tools/tool-approval.d.ts} +0 -1
  156. package/dist/runtime/turn-queue/pending-prompt-service.d.ts +64 -0
  157. package/dist/services/agent-events.d.ts +1 -2
  158. package/dist/services/config.d.ts +0 -1
  159. package/dist/services/global-settings.d.ts +27 -5
  160. package/dist/{llms → services/llms}/cline-recommended-models.d.ts +1 -2
  161. package/dist/{llms → services/llms}/configured-provider-registry.d.ts +0 -1
  162. package/dist/services/llms/handler-factory.d.ts +3 -0
  163. package/dist/{llms → services/llms}/provider-defaults.d.ts +2 -1
  164. package/dist/{llms → services/llms}/provider-settings.d.ts +5 -3
  165. package/dist/{llms → services/llms}/runtime-config.d.ts +0 -1
  166. package/dist/{llms → services/llms}/runtime-registry.d.ts +0 -1
  167. package/dist/{llms → services/llms}/runtime-types.d.ts +0 -1
  168. package/dist/services/local-runtime-bootstrap.d.ts +7 -9
  169. package/dist/services/plugin-tools.d.ts +0 -1
  170. package/dist/services/providers/local-provider-registry.d.ts +9 -10
  171. package/dist/services/providers/local-provider-service.d.ts +36 -3
  172. package/dist/services/providers/model-source.d.ts +3 -0
  173. package/dist/services/session-artifacts.d.ts +0 -1
  174. package/dist/services/session-data.d.ts +2 -3
  175. package/dist/services/session-telemetry.d.ts +0 -1
  176. package/dist/services/storage/file-team-store.d.ts +0 -1
  177. package/dist/services/storage/provider-settings-legacy-migration.d.ts +0 -1
  178. package/dist/services/storage/provider-settings-manager.d.ts +3 -4
  179. package/dist/services/storage/sqlite-session-store.d.ts +0 -1
  180. package/dist/services/storage/sqlite-team-store.d.ts +0 -1
  181. package/dist/services/storage/team-store.d.ts +0 -1
  182. package/dist/services/telemetry/ITelemetryAdapter.d.ts +0 -1
  183. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts +0 -1
  184. package/dist/services/telemetry/OpenTelemetryProvider.d.ts +32 -1
  185. package/dist/services/telemetry/TelemetryLoggerSink.d.ts +0 -1
  186. package/dist/services/telemetry/TelemetryService.d.ts +0 -1
  187. package/dist/services/telemetry/core-events.d.ts +46 -3
  188. package/dist/services/telemetry/distinct-id.d.ts +0 -1
  189. package/dist/services/telemetry/index.d.ts +1 -2
  190. package/dist/services/telemetry/index.js +1 -0
  191. package/dist/services/usage.d.ts +10 -2
  192. package/dist/services/workspace/file-indexer.d.ts +0 -1
  193. package/dist/services/workspace/index.d.ts +0 -1
  194. package/dist/services/workspace/mention-enricher.d.ts +0 -1
  195. package/dist/{session → services/workspace}/workspace-manager.d.ts +0 -1
  196. package/dist/services/{workspace-manifest.d.ts → workspace/workspace-manifest.d.ts} +20 -5
  197. package/dist/services/workspace/workspace-telemetry.d.ts +18 -0
  198. package/dist/session/checkpoint-restore.d.ts +20 -0
  199. package/dist/session/{session-graph.d.ts → models/session-graph.d.ts} +2 -3
  200. package/dist/session/{session-manifest.d.ts → models/session-manifest.d.ts} +0 -1
  201. package/dist/session/{session-row.d.ts → models/session-row.d.ts} +2 -3
  202. package/dist/session/{file-session-service.d.ts → services/file-session-service.d.ts} +1 -2
  203. package/dist/session/{message-builder.d.ts → services/message-builder.d.ts} +7 -16
  204. package/dist/session/{persistence-service.d.ts → services/persistence-service.d.ts} +10 -11
  205. package/dist/session/{session-service.d.ts → services/session-service.d.ts} +4 -5
  206. package/dist/session/session-snapshot.d.ts +57 -0
  207. package/dist/session/session-versioning-service.d.ts +48 -0
  208. package/dist/session/{conversation-store.d.ts → stores/conversation-store.d.ts} +0 -1
  209. package/dist/session/{session-manifest-store.d.ts → stores/session-manifest-store.d.ts} +3 -4
  210. package/dist/session/{team-persistence-store.d.ts → stores/team-persistence-store.d.ts} +2 -3
  211. package/dist/session/team/index.d.ts +2 -0
  212. package/dist/session/{subagent-session-manager.d.ts → team/team-child-session-manager.d.ts} +7 -8
  213. package/dist/session/{session-team-coordination.d.ts → team/team-session-coordinator.d.ts} +3 -4
  214. package/dist/settings/index.d.ts +2 -0
  215. package/dist/settings/settings-service.d.ts +6 -0
  216. package/dist/settings/types.d.ts +42 -0
  217. package/dist/types/chat-schema.d.ts +24 -7
  218. package/dist/types/common.d.ts +0 -1
  219. package/dist/types/config.d.ts +2 -3
  220. package/dist/types/events.d.ts +8 -1
  221. package/dist/types/provider-settings.d.ts +2 -3
  222. package/dist/types/session.d.ts +22 -6
  223. package/dist/types/sessions.d.ts +0 -1
  224. package/dist/types/storage.d.ts +0 -1
  225. package/dist/types.d.ts +17 -14
  226. package/dist/version.d.ts +0 -1
  227. package/package.json +16 -12
  228. package/dist/ClineCore.d.ts.map +0 -1
  229. package/dist/account/cline-account-service.d.ts.map +0 -1
  230. package/dist/account/index.d.ts.map +0 -1
  231. package/dist/account/rpc.d.ts.map +0 -1
  232. package/dist/account/types.d.ts.map +0 -1
  233. package/dist/auth/bounded-ttl-cache.d.ts.map +0 -1
  234. package/dist/auth/client.d.ts.map +0 -1
  235. package/dist/auth/cline.d.ts.map +0 -1
  236. package/dist/auth/codex.d.ts.map +0 -1
  237. package/dist/auth/oca.d.ts.map +0 -1
  238. package/dist/auth/server.d.ts.map +0 -1
  239. package/dist/auth/types.d.ts.map +0 -1
  240. package/dist/auth/utils.d.ts.map +0 -1
  241. package/dist/cron/cron-event-ingress.d.ts.map +0 -1
  242. package/dist/cron/cron-materializer.d.ts.map +0 -1
  243. package/dist/cron/cron-reconciler.d.ts.map +0 -1
  244. package/dist/cron/cron-report-writer.d.ts.map +0 -1
  245. package/dist/cron/cron-runner.d.ts.map +0 -1
  246. package/dist/cron/cron-schema.d.ts.map +0 -1
  247. package/dist/cron/cron-service.d.ts.map +0 -1
  248. package/dist/cron/cron-spec-parser.d.ts.map +0 -1
  249. package/dist/cron/cron-watcher.d.ts.map +0 -1
  250. package/dist/cron/resource-limiter.d.ts.map +0 -1
  251. package/dist/cron/schedule-command-service.d.ts.map +0 -1
  252. package/dist/cron/schedule-service.d.ts.map +0 -1
  253. package/dist/cron/scheduler.d.ts +0 -68
  254. package/dist/cron/scheduler.d.ts.map +0 -1
  255. package/dist/cron/sqlite-cron-store.d.ts.map +0 -1
  256. package/dist/cron/sqlite-schedule-store.d.ts +0 -52
  257. package/dist/cron/sqlite-schedule-store.d.ts.map +0 -1
  258. package/dist/extensions/config/agent-config-loader.d.ts +0 -20
  259. package/dist/extensions/config/agent-config-loader.d.ts.map +0 -1
  260. package/dist/extensions/config/agent-config-parser.d.ts +0 -29
  261. package/dist/extensions/config/agent-config-parser.d.ts.map +0 -1
  262. package/dist/extensions/config/hooks-config-loader.d.ts.map +0 -1
  263. package/dist/extensions/config/index.d.ts.map +0 -1
  264. package/dist/extensions/config/runtime-commands.d.ts.map +0 -1
  265. package/dist/extensions/config/unified-config-file-watcher.d.ts.map +0 -1
  266. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +0 -1
  267. package/dist/extensions/context/agentic-compaction.d.ts.map +0 -1
  268. package/dist/extensions/context/basic-compaction.d.ts.map +0 -1
  269. package/dist/extensions/context/compaction-shared.d.ts.map +0 -1
  270. package/dist/extensions/context/compaction.d.ts.map +0 -1
  271. package/dist/extensions/index.d.ts.map +0 -1
  272. package/dist/extensions/mcp/client.d.ts.map +0 -1
  273. package/dist/extensions/mcp/config-loader.d.ts.map +0 -1
  274. package/dist/extensions/mcp/index.d.ts.map +0 -1
  275. package/dist/extensions/mcp/manager.d.ts.map +0 -1
  276. package/dist/extensions/mcp/name-transform.d.ts.map +0 -1
  277. package/dist/extensions/mcp/policies.d.ts.map +0 -1
  278. package/dist/extensions/mcp/tools.d.ts.map +0 -1
  279. package/dist/extensions/mcp/types.d.ts.map +0 -1
  280. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +0 -1
  281. package/dist/extensions/plugin/plugin-load-report.d.ts.map +0 -1
  282. package/dist/extensions/plugin/plugin-loader.d.ts.map +0 -1
  283. package/dist/extensions/plugin/plugin-module-import.d.ts.map +0 -1
  284. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +0 -1
  285. package/dist/extensions/plugin/plugin-targeting.d.ts.map +0 -1
  286. package/dist/extensions/tools/constants.d.ts.map +0 -1
  287. package/dist/extensions/tools/definitions.d.ts.map +0 -1
  288. package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +0 -1
  289. package/dist/extensions/tools/executors/apply-patch.d.ts.map +0 -1
  290. package/dist/extensions/tools/executors/bash.d.ts.map +0 -1
  291. package/dist/extensions/tools/executors/editor.d.ts.map +0 -1
  292. package/dist/extensions/tools/executors/file-read.d.ts.map +0 -1
  293. package/dist/extensions/tools/executors/index.d.ts.map +0 -1
  294. package/dist/extensions/tools/executors/search.d.ts.map +0 -1
  295. package/dist/extensions/tools/executors/web-fetch.d.ts.map +0 -1
  296. package/dist/extensions/tools/helpers.d.ts.map +0 -1
  297. package/dist/extensions/tools/index.d.ts.map +0 -1
  298. package/dist/extensions/tools/model-tool-routing.d.ts.map +0 -1
  299. package/dist/extensions/tools/presets.d.ts.map +0 -1
  300. package/dist/extensions/tools/runtime.d.ts.map +0 -1
  301. package/dist/extensions/tools/schemas.d.ts.map +0 -1
  302. package/dist/extensions/tools/team/delegated-agent.d.ts.map +0 -1
  303. package/dist/extensions/tools/team/index.d.ts.map +0 -1
  304. package/dist/extensions/tools/team/multi-agent.d.ts.map +0 -1
  305. package/dist/extensions/tools/team/projections.d.ts.map +0 -1
  306. package/dist/extensions/tools/team/runtime.d.ts.map +0 -1
  307. package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +0 -1
  308. package/dist/extensions/tools/team/subagent-prompts.d.ts.map +0 -1
  309. package/dist/extensions/tools/team/team-tools.d.ts.map +0 -1
  310. package/dist/extensions/tools/types.d.ts.map +0 -1
  311. package/dist/hooks/checkpoint-hooks.d.ts.map +0 -1
  312. package/dist/hooks/hook-bridge.d.ts +0 -118
  313. package/dist/hooks/hook-bridge.d.ts.map +0 -1
  314. package/dist/hooks/hook-file-hooks.d.ts.map +0 -1
  315. package/dist/hooks/hook-registry.d.ts +0 -16
  316. package/dist/hooks/hook-registry.d.ts.map +0 -1
  317. package/dist/hooks/index.d.ts.map +0 -1
  318. package/dist/hooks/subprocess-runner.d.ts.map +0 -1
  319. package/dist/hooks/subprocess.d.ts.map +0 -1
  320. package/dist/hub/browser-websocket.d.ts.map +0 -1
  321. package/dist/hub/client.d.ts.map +0 -1
  322. package/dist/hub/connect.d.ts.map +0 -1
  323. package/dist/hub/daemon-entry.d.ts +0 -2
  324. package/dist/hub/daemon-entry.d.ts.map +0 -1
  325. package/dist/hub/daemon-entry.js +0 -1305
  326. package/dist/hub/daemon.d.ts.map +0 -1
  327. package/dist/hub/defaults.d.ts.map +0 -1
  328. package/dist/hub/discovery.d.ts.map +0 -1
  329. package/dist/hub/index.d.ts.map +0 -1
  330. package/dist/hub/native-transport.d.ts.map +0 -1
  331. package/dist/hub/runtime-handlers.d.ts.map +0 -1
  332. package/dist/hub/server.d.ts +0 -104
  333. package/dist/hub/server.d.ts.map +0 -1
  334. package/dist/hub/session-client.d.ts.map +0 -1
  335. package/dist/hub/start-shared-server.d.ts.map +0 -1
  336. package/dist/hub/transport.d.ts.map +0 -1
  337. package/dist/hub/ui-client.d.ts.map +0 -1
  338. package/dist/hub/workspace.d.ts.map +0 -1
  339. package/dist/index.d.ts.map +0 -1
  340. package/dist/llms/cline-recommended-models.d.ts.map +0 -1
  341. package/dist/llms/configured-provider-registry.d.ts.map +0 -1
  342. package/dist/llms/handler-factory.d.ts +0 -16
  343. package/dist/llms/handler-factory.d.ts.map +0 -1
  344. package/dist/llms/provider-defaults.d.ts.map +0 -1
  345. package/dist/llms/provider-settings.d.ts.map +0 -1
  346. package/dist/llms/runtime-config.d.ts.map +0 -1
  347. package/dist/llms/runtime-registry.d.ts.map +0 -1
  348. package/dist/llms/runtime-types.d.ts.map +0 -1
  349. package/dist/runtime/agent-config-adapter.d.ts +0 -148
  350. package/dist/runtime/agent-config-adapter.d.ts.map +0 -1
  351. package/dist/runtime/agent-runtime-config-builder.d.ts.map +0 -1
  352. package/dist/runtime/history.d.ts +0 -10
  353. package/dist/runtime/history.d.ts.map +0 -1
  354. package/dist/runtime/host.d.ts.map +0 -1
  355. package/dist/runtime/loop-detection.d.ts.map +0 -1
  356. package/dist/runtime/mistake-tracker.d.ts.map +0 -1
  357. package/dist/runtime/rules.d.ts.map +0 -1
  358. package/dist/runtime/runtime-builder.d.ts.map +0 -1
  359. package/dist/runtime/runtime-event-adapter.d.ts.map +0 -1
  360. package/dist/runtime/runtime-host.d.ts.map +0 -1
  361. package/dist/runtime/runtime-oauth-token-manager.d.ts.map +0 -1
  362. package/dist/runtime/session-runtime-orchestrator.d.ts.map +0 -1
  363. package/dist/runtime/session-runtime.d.ts.map +0 -1
  364. package/dist/runtime/subprocess-sandbox.d.ts.map +0 -1
  365. package/dist/runtime/tool-approval.d.ts.map +0 -1
  366. package/dist/runtime/user-input-builder.d.ts.map +0 -1
  367. package/dist/services/agent-events.d.ts.map +0 -1
  368. package/dist/services/config.d.ts.map +0 -1
  369. package/dist/services/global-settings.d.ts.map +0 -1
  370. package/dist/services/index.js +0 -28
  371. package/dist/services/local-runtime-bootstrap.d.ts.map +0 -1
  372. package/dist/services/plugin-tools.d.ts.map +0 -1
  373. package/dist/services/providers/local-provider-registry.d.ts.map +0 -1
  374. package/dist/services/providers/local-provider-service.d.ts.map +0 -1
  375. package/dist/services/session-artifacts.d.ts.map +0 -1
  376. package/dist/services/session-data.d.ts.map +0 -1
  377. package/dist/services/session-telemetry.d.ts.map +0 -1
  378. package/dist/services/storage/file-team-store.d.ts.map +0 -1
  379. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +0 -1
  380. package/dist/services/storage/provider-settings-manager.d.ts.map +0 -1
  381. package/dist/services/storage/sqlite-session-store.d.ts.map +0 -1
  382. package/dist/services/storage/sqlite-team-store.d.ts.map +0 -1
  383. package/dist/services/storage/team-store.d.ts.map +0 -1
  384. package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +0 -1
  385. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
  386. package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
  387. package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
  388. package/dist/services/telemetry/TelemetryService.d.ts.map +0 -1
  389. package/dist/services/telemetry/core-events.d.ts.map +0 -1
  390. package/dist/services/telemetry/distinct-id.d.ts.map +0 -1
  391. package/dist/services/telemetry/index.d.ts.map +0 -1
  392. package/dist/services/usage.d.ts.map +0 -1
  393. package/dist/services/workspace/file-indexer.d.ts.map +0 -1
  394. package/dist/services/workspace/index.d.ts.map +0 -1
  395. package/dist/services/workspace/mention-enricher.d.ts.map +0 -1
  396. package/dist/services/workspace-manifest.d.ts.map +0 -1
  397. package/dist/session/conversation-store.d.ts.map +0 -1
  398. package/dist/session/file-session-service.d.ts.map +0 -1
  399. package/dist/session/message-builder.d.ts.map +0 -1
  400. package/dist/session/persistence-service.d.ts.map +0 -1
  401. package/dist/session/session-graph.d.ts.map +0 -1
  402. package/dist/session/session-manifest-store.d.ts.map +0 -1
  403. package/dist/session/session-manifest.d.ts.map +0 -1
  404. package/dist/session/session-row.d.ts.map +0 -1
  405. package/dist/session/session-service.d.ts.map +0 -1
  406. package/dist/session/session-team-coordination.d.ts.map +0 -1
  407. package/dist/session/subagent-session-manager.d.ts.map +0 -1
  408. package/dist/session/team-persistence-store.d.ts.map +0 -1
  409. package/dist/session/workspace-manager.d.ts.map +0 -1
  410. package/dist/transports/hub.d.ts +0 -58
  411. package/dist/transports/hub.d.ts.map +0 -1
  412. package/dist/transports/local.d.ts +0 -119
  413. package/dist/transports/local.d.ts.map +0 -1
  414. package/dist/transports/remote.d.ts.map +0 -1
  415. package/dist/transports/runtime-host-support.d.ts.map +0 -1
  416. package/dist/types/chat-schema.d.ts.map +0 -1
  417. package/dist/types/common.d.ts.map +0 -1
  418. package/dist/types/config.d.ts.map +0 -1
  419. package/dist/types/events.d.ts.map +0 -1
  420. package/dist/types/provider-settings.d.ts.map +0 -1
  421. package/dist/types/session.d.ts.map +0 -1
  422. package/dist/types/sessions.d.ts.map +0 -1
  423. package/dist/types/storage.d.ts.map +0 -1
  424. package/dist/types.d.ts.map +0 -1
  425. package/dist/version.d.ts.map +0 -1
  426. package/src/ClineCore.ts +0 -1026
  427. package/src/account/cline-account-service.ts +0 -338
  428. package/src/account/index.ts +0 -24
  429. package/src/account/rpc.ts +0 -185
  430. package/src/account/types.ts +0 -108
  431. package/src/auth/bounded-ttl-cache.ts +0 -53
  432. package/src/auth/client.ts +0 -46
  433. package/src/auth/cline.ts +0 -724
  434. package/src/auth/codex.ts +0 -491
  435. package/src/auth/oca.ts +0 -588
  436. package/src/auth/server.ts +0 -265
  437. package/src/auth/types.ts +0 -110
  438. package/src/auth/utils.ts +0 -247
  439. package/src/cron/cron-event-ingress.ts +0 -357
  440. package/src/cron/cron-materializer.ts +0 -97
  441. package/src/cron/cron-reconciler.ts +0 -241
  442. package/src/cron/cron-report-writer.ts +0 -153
  443. package/src/cron/cron-runner.ts +0 -495
  444. package/src/cron/cron-schema.ts +0 -127
  445. package/src/cron/cron-service.ts +0 -163
  446. package/src/cron/cron-spec-parser.ts +0 -489
  447. package/src/cron/cron-watcher.ts +0 -102
  448. package/src/cron/index.ts +0 -15
  449. package/src/cron/resource-limiter.ts +0 -46
  450. package/src/cron/schedule-command-service.ts +0 -193
  451. package/src/cron/schedule-service.ts +0 -703
  452. package/src/cron/scheduler.ts +0 -772
  453. package/src/cron/sqlite-cron-store.ts +0 -1286
  454. package/src/cron/sqlite-schedule-store.ts +0 -708
  455. package/src/extensions/config/agent-config-loader.ts +0 -114
  456. package/src/extensions/config/agent-config-parser.ts +0 -198
  457. package/src/extensions/config/hooks-config-loader.ts +0 -117
  458. package/src/extensions/config/index.ts +0 -77
  459. package/src/extensions/config/runtime-commands.ts +0 -82
  460. package/src/extensions/config/unified-config-file-watcher.ts +0 -496
  461. package/src/extensions/config/user-instruction-config-loader.ts +0 -549
  462. package/src/extensions/context/agentic-compaction.ts +0 -131
  463. package/src/extensions/context/basic-compaction.ts +0 -300
  464. package/src/extensions/context/compaction-shared.ts +0 -459
  465. package/src/extensions/context/compaction.ts +0 -226
  466. package/src/extensions/index.ts +0 -18
  467. package/src/extensions/mcp/client.ts +0 -420
  468. package/src/extensions/mcp/config-loader.ts +0 -219
  469. package/src/extensions/mcp/index.ts +0 -42
  470. package/src/extensions/mcp/manager.ts +0 -260
  471. package/src/extensions/mcp/name-transform.ts +0 -33
  472. package/src/extensions/mcp/policies.ts +0 -47
  473. package/src/extensions/mcp/tools.ts +0 -47
  474. package/src/extensions/mcp/types.ts +0 -116
  475. package/src/extensions/plugin/plugin-config-loader.ts +0 -140
  476. package/src/extensions/plugin/plugin-load-report.ts +0 -20
  477. package/src/extensions/plugin/plugin-loader.ts +0 -220
  478. package/src/extensions/plugin/plugin-module-import.ts +0 -276
  479. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +0 -662
  480. package/src/extensions/plugin/plugin-sandbox.ts +0 -586
  481. package/src/extensions/plugin/plugin-targeting.ts +0 -32
  482. package/src/extensions/tools/constants.ts +0 -37
  483. package/src/extensions/tools/definitions.ts +0 -738
  484. package/src/extensions/tools/executors/apply-patch-parser.ts +0 -520
  485. package/src/extensions/tools/executors/apply-patch.ts +0 -348
  486. package/src/extensions/tools/executors/bash.ts +0 -207
  487. package/src/extensions/tools/executors/editor.ts +0 -220
  488. package/src/extensions/tools/executors/file-read.ts +0 -135
  489. package/src/extensions/tools/executors/index.ts +0 -87
  490. package/src/extensions/tools/executors/search.ts +0 -470
  491. package/src/extensions/tools/executors/web-fetch.ts +0 -259
  492. package/src/extensions/tools/helpers.ts +0 -154
  493. package/src/extensions/tools/index.ts +0 -183
  494. package/src/extensions/tools/model-tool-routing.ts +0 -134
  495. package/src/extensions/tools/presets.ts +0 -190
  496. package/src/extensions/tools/runtime.ts +0 -261
  497. package/src/extensions/tools/schemas.ts +0 -343
  498. package/src/extensions/tools/team/delegated-agent.ts +0 -136
  499. package/src/extensions/tools/team/index.ts +0 -5
  500. package/src/extensions/tools/team/multi-agent.ts +0 -1845
  501. package/src/extensions/tools/team/projections.ts +0 -283
  502. package/src/extensions/tools/team/runtime.ts +0 -54
  503. package/src/extensions/tools/team/spawn-agent-tool.ts +0 -201
  504. package/src/extensions/tools/team/subagent-prompts.ts +0 -41
  505. package/src/extensions/tools/team/team-tools.ts +0 -902
  506. package/src/extensions/tools/types.ts +0 -354
  507. package/src/hooks/checkpoint-hooks.ts +0 -238
  508. package/src/hooks/hook-bridge.ts +0 -489
  509. package/src/hooks/hook-file-hooks.ts +0 -934
  510. package/src/hooks/hook-registry.ts +0 -257
  511. package/src/hooks/index.ts +0 -18
  512. package/src/hooks/subprocess-runner.ts +0 -196
  513. package/src/hooks/subprocess.ts +0 -469
  514. package/src/hub/browser-websocket.ts +0 -159
  515. package/src/hub/client.ts +0 -633
  516. package/src/hub/connect.ts +0 -156
  517. package/src/hub/daemon-entry.ts +0 -122
  518. package/src/hub/daemon.ts +0 -284
  519. package/src/hub/defaults.ts +0 -70
  520. package/src/hub/discovery.ts +0 -247
  521. package/src/hub/index.ts +0 -14
  522. package/src/hub/native-transport.ts +0 -31
  523. package/src/hub/runtime-handlers.ts +0 -141
  524. package/src/hub/server.ts +0 -2317
  525. package/src/hub/session-client.ts +0 -502
  526. package/src/hub/start-shared-server.ts +0 -61
  527. package/src/hub/transport.ts +0 -14
  528. package/src/hub/ui-client.ts +0 -126
  529. package/src/hub/workspace.ts +0 -19
  530. package/src/index.ts +0 -688
  531. package/src/llms/cline-recommended-models.ts +0 -167
  532. package/src/llms/configured-provider-registry.ts +0 -193
  533. package/src/llms/handler-factory.ts +0 -56
  534. package/src/llms/provider-defaults.ts +0 -653
  535. package/src/llms/provider-settings.ts +0 -310
  536. package/src/llms/runtime-config.ts +0 -43
  537. package/src/llms/runtime-registry.ts +0 -172
  538. package/src/llms/runtime-types.ts +0 -121
  539. package/src/runtime/agent-config-adapter.ts +0 -636
  540. package/src/runtime/agent-runtime-config-builder.ts +0 -205
  541. package/src/runtime/error-feedback.ts +0 -142
  542. package/src/runtime/history.ts +0 -374
  543. package/src/runtime/host.ts +0 -222
  544. package/src/runtime/index.ts +0 -23
  545. package/src/runtime/loop-detection.ts +0 -162
  546. package/src/runtime/mistake-tracker.ts +0 -221
  547. package/src/runtime/rules.ts +0 -49
  548. package/src/runtime/runtime-builder.ts +0 -814
  549. package/src/runtime/runtime-event-adapter.ts +0 -412
  550. package/src/runtime/runtime-host.ts +0 -250
  551. package/src/runtime/runtime-oauth-token-manager.ts +0 -268
  552. package/src/runtime/session-runtime-orchestrator.ts +0 -1253
  553. package/src/runtime/session-runtime.ts +0 -69
  554. package/src/runtime/subprocess-sandbox.ts +0 -255
  555. package/src/runtime/tool-approval.ts +0 -102
  556. package/src/runtime/user-input-builder.ts +0 -167
  557. package/src/services/agent-events.ts +0 -256
  558. package/src/services/config.ts +0 -5
  559. package/src/services/global-settings.ts +0 -122
  560. package/src/services/local-runtime-bootstrap.ts +0 -424
  561. package/src/services/plugin-tools.ts +0 -86
  562. package/src/services/providers/local-provider-registry.ts +0 -456
  563. package/src/services/providers/local-provider-service.ts +0 -772
  564. package/src/services/session-artifacts.ts +0 -138
  565. package/src/services/session-data.ts +0 -398
  566. package/src/services/session-telemetry.ts +0 -89
  567. package/src/services/storage/artifact-store.ts +0 -1
  568. package/src/services/storage/file-team-store.ts +0 -250
  569. package/src/services/storage/index.ts +0 -11
  570. package/src/services/storage/provider-settings-legacy-migration.ts +0 -789
  571. package/src/services/storage/provider-settings-manager.ts +0 -167
  572. package/src/services/storage/session-store.ts +0 -1
  573. package/src/services/storage/sqlite-session-store.ts +0 -270
  574. package/src/services/storage/sqlite-team-store.ts +0 -537
  575. package/src/services/storage/team-store.ts +0 -36
  576. package/src/services/telemetry/ITelemetryAdapter.ts +0 -94
  577. package/src/services/telemetry/OpenTelemetryAdapter.ts +0 -348
  578. package/src/services/telemetry/OpenTelemetryProvider.ts +0 -415
  579. package/src/services/telemetry/TelemetryLoggerSink.ts +0 -121
  580. package/src/services/telemetry/TelemetryService.ts +0 -139
  581. package/src/services/telemetry/core-events.ts +0 -400
  582. package/src/services/telemetry/distinct-id.ts +0 -58
  583. package/src/services/telemetry/index.ts +0 -20
  584. package/src/services/usage.ts +0 -32
  585. package/src/services/workspace/file-indexer.ts +0 -351
  586. package/src/services/workspace/index.ts +0 -7
  587. package/src/services/workspace/mention-enricher.ts +0 -122
  588. package/src/services/workspace-manifest.ts +0 -72
  589. package/src/session/conversation-store.ts +0 -77
  590. package/src/session/file-session-service.ts +0 -282
  591. package/src/session/index.ts +0 -32
  592. package/src/session/message-builder.ts +0 -941
  593. package/src/session/persistence-service.ts +0 -559
  594. package/src/session/session-graph.ts +0 -92
  595. package/src/session/session-manifest-store.ts +0 -158
  596. package/src/session/session-manifest.ts +0 -29
  597. package/src/session/session-row.ts +0 -199
  598. package/src/session/session-service.ts +0 -324
  599. package/src/session/session-team-coordination.ts +0 -240
  600. package/src/session/subagent-session-manager.ts +0 -397
  601. package/src/session/team-persistence-store.ts +0 -176
  602. package/src/session/workspace-manager.ts +0 -100
  603. package/src/transports/hub.ts +0 -1081
  604. package/src/transports/local.ts +0 -1826
  605. package/src/transports/remote.ts +0 -27
  606. package/src/transports/runtime-host-support.ts +0 -140
  607. package/src/types/chat-schema.ts +0 -81
  608. package/src/types/common.ts +0 -26
  609. package/src/types/config.ts +0 -220
  610. package/src/types/events.ts +0 -80
  611. package/src/types/index.ts +0 -26
  612. package/src/types/provider-settings.ts +0 -54
  613. package/src/types/session.ts +0 -111
  614. package/src/types/sessions.ts +0 -37
  615. package/src/types/storage.ts +0 -56
  616. package/src/types.ts +0 -167
  617. package/src/version.ts +0 -3
@@ -0,0 +1,720 @@
1
+ import{createRequire as ZA}from"node:module";var{defineProperty:QJ,getOwnPropertyNames:JA}=Object;var X3=Object.prototype.hasOwnProperty;function A3(f){return this[f]}var C=(f,$,W)=>{var J=JA($);for(let H of J)if(!X3.call(f,H)&&H!=="default")QJ(f,H,{get:A3.bind($,H),enumerable:!0});if(W){for(let H of J)if(!X3.call(W,H)&&H!=="default")QJ(W,H,{get:A3.bind($,H),enumerable:!0});return W}};var HA=(f)=>f;function QA(f,$){this[f]=HA.bind(null,$)}var z=(f,$)=>{for(var W in $)QJ(f,W,{get:$[W],enumerable:!0,configurable:!0,set:QA.bind($,W)})};var $1=(f,$)=>()=>(f&&($=f(f=0)),$);var V3=ZA(import.meta.url);var y7={};z(y7,{normalizeUserMessage:()=>nV,buildInitialUserContent:()=>iV});async function iV(f,$,W,J){let H=aV($),Q=await sV(W,J);if(H.length===0&&!Q)return f;let Z=[{type:"text",text:f},...H];if(Q)Z.push(...Q);return Z}function nV(f){if(f==null)return"";if(typeof f==="string")return f;let $=f.content;if(typeof $==="string")return $;if(!Array.isArray($))return"";let W=[];for(let J of $)if(J&&typeof J==="object"&&J.type==="text"){let H=J.text;if(typeof H==="string")W.push(H)}return W.join(`
2
+ `)}function aV(f){if(!f||f.length===0)return[];let $=[];for(let W of f){let J=tV(W);if(J)$.push(J)}return $}function tV(f){let $=f.trim();if(!$)return;let W=$.match(/^data:([^;,]+);base64,(.+)$/);if(W){let J=W[1],H=W[2];if(!J||!H)return;return{type:"image",mediaType:J,data:H}}return{type:"image",mediaType:"image/png",data:$}}async function sV(f,$){if(!f||f.length===0)return;let W=$??(async()=>{throw Error("File loading is not configured in this runtime. Provide userFileContentLoader to enable userFiles support.")}),J=await Promise.all(f.map(async(H)=>{let Q=H.replace(/\\/g,"/");try{let Z=await W(H);return{type:"file",path:Q,content:Z}}catch(Z){let P=Z instanceof Error?Z.message:String(Z);return{type:"file",path:Q,content:`Error fetching content: ${P}`}}}));if(J.length===0)return;return J}function l(f,$,W){f?.capture({event:$,properties:W})}function I8(f){if(!f)return;return f.substring(0,500)}function uB(f){if(typeof f==="string")return"Error";return f.name?.trim()||f.constructor?.name||"Error"}function cB(f){return typeof f==="string"?f:f.message}function fQ(f,$){return f.some((W)=>$.has(W.trim().toLowerCase()))}function $Q(f){l(f,I.CLIENT.EXTENSION_ACTIVATED)}function v8(f,$){let W=[...$.vcs_types],J={root_count:$.root_count,vcs_types:W,is_multi_root:$.root_count>1,has_git:fQ(W,new Set(["git"])),has_mercurial:fQ(W,new Set(["mercurial","hg"]))};if($.init_duration_ms!==void 0)J.init_duration_ms=$.init_duration_ms;if($.feature_flag_enabled!==void 0)J.feature_flag_enabled=$.feature_flag_enabled;if($.is_remote_workspace!==void 0)J.is_remote_workspace=$.is_remote_workspace;l(f,I.WORKSPACE.INITIALIZED,J)}function u8(f,$,W){l(f,I.WORKSPACE.INIT_ERROR,{error_type:uB($),error_message:I8(cB($)),fallback_to_single_root:W.fallback_to_single_root,workspace_count:W.workspace_count??0})}function WQ(f,$){l(f,I.WORKSPACE.PATH_RESOLVED,{...$})}function T0(f,$){l(f,I.USER.AUTH_STARTED,{provider:$})}function Y0(f,$){l(f,I.USER.AUTH_SUCCEEDED,{provider:$})}function F0(f,$,W){l(f,I.USER.AUTH_FAILED,{provider:$,errorMessage:I8(W)})}function I0(f,$,W){l(f,I.USER.AUTH_LOGGED_OUT,{provider:$,reason:W})}function JQ(f,$){f?.captureRequired(I.USER.TELEMETRY_OPT_OUT,$)}function y0(f,$){let W=$.id?.trim();if(W)f?.setDistinctId(W);f?.updateCommonProperties({account_id:$.id,account_email:$.email,provider:$.provider,organization_id:$.organizationId,organization_name:$.organizationName,member_id:$.memberId})}function c8(f,$){l(f,I.TASK.CREATED,$)}function d8(f,$){l(f,I.TASK.RESTARTED,$)}function l2(f,$){l(f,I.TASK.COMPLETED,$)}function Y1(f,$){l(f,I.TASK.CONVERSATION_TURN,{...$,timestamp:new Date().toISOString()})}function r8(f,$){l(f,I.TASK.TOKEN_USAGE,$)}function l8(f,$,W){l(f,I.TASK.MODE_SWITCH,{ulid:$,mode:W})}function p8(f,$){l(f,I.TASK.TOOL_USED,$)}function i8(f,$){l(f,I.TASK.SKILL_USED,$)}function n8(f,$){l(f,I.TASK.DIFF_EDIT_FAILED,$)}function p2(f,$){l(f,I.TASK.PROVIDER_API_ERROR,{...$,errorMessage:I8($.errorMessage)??"unknown",timestamp:new Date().toISOString()})}function a8(f,$,W){l(f,I.TASK.MENTION_USED,{mentionType:$,contentLength:W,timestamp:new Date().toISOString()})}function t8(f,$,W,J){l(f,I.TASK.MENTION_FAILED,{mentionType:$,errorType:W,errorMessage:I8(J),timestamp:new Date().toISOString()})}function s8(f,$,W,J,H){l(f,I.TASK.MENTION_SEARCH_RESULTS,{queryLength:$.length,resultCount:W,searchType:J,isEmpty:H,timestamp:new Date().toISOString()})}function v0(f,$){l(f,I.TASK.AGENT_CREATED,{...$,timestamp:new Date().toISOString()})}function o8(f,$){l(f,I.TASK.AGENT_TEAM_CREATED,{...$,timestamp:new Date().toISOString()})}function i2(f,$){l(f,$.event==="ended"?I.TASK.SUBAGENT_COMPLETED:I.TASK.SUBAGENT_STARTED,{...$,timestamp:new Date().toISOString()})}function e8(f,$,W,J){l(f,I.HOOKS.DISCOVERY_COMPLETED,{hookName:$,globalCount:W,workspaceCount:J,totalCount:W+J,timestamp:new Date().toISOString()})}var I;var Kf=$1(()=>{I={CLIENT:{EXTENSION_ACTIVATED:"user.extension_activated"},SESSION:{STARTED:"session.started",ENDED:"session.ended"},USER:{AUTH_STARTED:"user.auth_started",AUTH_SUCCEEDED:"user.auth_succeeded",AUTH_FAILED:"user.auth_failed",AUTH_LOGGED_OUT:"user.auth_logged_out",TELEMETRY_OPT_OUT:"user.opt_out"},TASK:{CREATED:"task.created",RESTARTED:"task.restarted",COMPLETED:"task.completed",CONVERSATION_TURN:"task.conversation_turn",TOKEN_USAGE:"task.tokens",MODE_SWITCH:"task.mode",TOOL_USED:"task.tool_used",SKILL_USED:"task.skill_used",DIFF_EDIT_FAILED:"task.diff_edit_failed",PROVIDER_API_ERROR:"task.provider_api_error",MENTION_USED:"task.mention_used",MENTION_FAILED:"task.mention_failed",MENTION_SEARCH_RESULTS:"task.mention_search_results",AGENT_CREATED:"task.agent_created",AGENT_TEAM_CREATED:"task.agent_team_created",SUBAGENT_STARTED:"task.subagent_started",SUBAGENT_COMPLETED:"task.subagent_completed"},HOOKS:{DISCOVERY_COMPLETED:"hooks.discovery_completed"},WORKSPACE:{INITIALIZED:"workspace.initialized",INIT_ERROR:"workspace.init_error",PATH_RESOLVED:"workspace.path_resolved"}}});import{mkdirSync as iB,readFileSync as nB,writeFileSync as aB}from"node:fs";import{dirname as tB}from"node:path";import{resolveGlobalSettingsPath as jQ}from"@clinebot/shared/storage";import{z as a2}from"zod";function PQ(){return t2.parse({})}function sf(){let f=jQ(),$;try{$=JSON.parse(nB(f,"utf8"))}catch{return PQ()}let W=t2.safeParse($);return W.success?W.data:PQ()}function L$(f,$={}){let W=jQ(),J=sf();iB(tB(W),{recursive:!0});let H=t2.parse(f);if(!J.telemetryOptOut&&H.telemetryOptOut)JQ($.telemetry);aB(W,`${JSON.stringify(H,null,2)}
3
+ `,"utf8")}function W4(){return sf().telemetryOptOut}function RQ(f,$={}){L$({...sf(),telemetryOptOut:f},$)}function rf(f){return new Set(f??sf().disabledTools??[])}function s2(f){return new Set(f??sf().disabledPlugins??[])}function XQ(f){return rf().has(f)}function J4(f){let $=rf(),W=sf();if($.has(f))return $.delete(f),L$({...W,disabledTools:[...$]}),!1;return $.add(f),L$({...W,disabledTools:[...$]}),!0}function nJ(f,$){let W=[...new Set(f.map((Q)=>Q.trim()).filter(Boolean))];if(W.length===0)return;let J=sf(),H=rf(J.disabledTools);for(let Q of W)if($)H.add(Q);else H.delete(Q);L$({...J,disabledTools:[...H]})}function AQ(f,$){return nJ([f],$),$}function VQ(f){return s2().has(f)}function BQ(f,$){let W=f.trim();if(!W)return;let J=sf(),H=s2(J.disabledPlugins);if($)H.add(W);else H.delete(W);L$({...J,disabledPlugins:[...H]})}function H4(f,$){let W=s2($);if(W.size===0)return[...f];return f.filter((J)=>!W.has(J))}function O$(f,$){let W=rf($);if(W.size===0)return[...f];return f.filter((J)=>!W.has(J.name))}function Q4(f,$){if(!f||f.length===0)return f;let W=rf($);if(W.size===0)return f;return f.map((J)=>{if(!J.setup)return J;return{...J,setup:(H,Q)=>J.setup?.({...H,registerTool:(Z)=>{if(!W.has(Z.name))H.registerTool(Z)}},Q)}})}var ZQ,t2;var K0=$1(()=>{Kf();ZQ=a2.preprocess((f)=>Array.isArray(f)?f.filter(($)=>typeof $==="string").map(($)=>$.trim()).filter(Boolean):void 0,a2.array(a2.string()).optional()).transform((f)=>{if(!f)return;let $=[...new Set(f)].sort((W,J)=>W.localeCompare(J));return $.length>0?$:void 0}),t2=a2.object({telemetryOptOut:a2.boolean().default(!1).catch(!1),disabledTools:ZQ.optional(),disabledPlugins:ZQ.optional()}).strip().transform((f)=>{let $={telemetryOptOut:f.telemetryOptOut};if(f.disabledTools?.length)$.disabledTools=f.disabledTools;if(f.disabledPlugins?.length)$.disabledPlugins=f.disabledPlugins;return $})});import{existsSync as YU,mkdirSync as FU,readFileSync as yU,writeFileSync as hU}from"node:fs";import{resolve as KU}from"node:path";import{resolveSessionDataDir as UU}from"@clinebot/shared/storage";import{nanoid as MU}from"nanoid";import*as GU from"node-machine-id";function c$(f){let $=f?.trim();if($)return $;let W=LU();if(W)return W;return OU()}function _U(){let f=GU;return f.machineIdSync??f.default?.machineIdSync}function LU(){try{let f=_U();if(!f)return;return f().trim()||void 0}catch{return}}function OU(){let f=UU(),$=KU(f,DU);try{if(YU($)){let J=yU($,"utf8").trim();if(J.length>0)return J}}catch{}let W=`cl-${MU()}`;try{FU(f,{recursive:!0}),hU($,W,"utf8")}catch{}return W}var DU="machine-id";var U6=()=>{};class A8{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(f){this.name=f.name??"OpenTelemetryAdapter",this.metadata={...f.metadata},this.meterProvider=f.meterProvider,this.loggerProvider=f.loggerProvider,this.meter=f.meterProvider?.getMeter("cline")??null,this.logger=f.loggerProvider?.getLogger("cline")??null,this.enabled=f.enabled??!0,this.distinctId=f.distinctId,this.commonProperties=f.commonProperties?{...f.commonProperties}:{}}emit(f,$){if(!this.isEnabled())return;this.emitLog(f,$,!1)}emitRequired(f,$){this.emitLog(f,$,!0)}recordCounter(f,$,W,J,H=!1){if(!this.meter||!H&&!this.isEnabled())return;let Q=this.counters.get(f);if(!Q)Q=this.meter.createCounter(f,J?{description:J}:void 0),this.counters.set(f,Q);Q.add($,this.flattenProperties(this.buildAttributes(W)))}recordHistogram(f,$,W,J,H=!1){if(!this.meter||!H&&!this.isEnabled())return;let Q=this.histograms.get(f);if(!Q)Q=this.meter.createHistogram(f,J?{description:J}:void 0),this.histograms.set(f,Q);Q.record($,this.flattenProperties(this.buildAttributes(W)))}recordGauge(f,$,W,J,H=!1){if(!this.meter||!H&&!this.isEnabled())return;let Q=this.buildAttributes(W),Z=JSON.stringify(Q),P=this.gaugeValues.get(f);if($===null){if(P){if(P.delete(Z),P.size===0)this.gaugeValues.delete(f),this.gauges.delete(f)}return}let j=P;if(!j)j=new Map,this.gaugeValues.set(f,j);if(!this.gauges.has(f)){let R=this.meter.createObservableGauge(f,J?{description:J}:void 0);R.addCallback((X)=>{for(let A of this.snapshotGaugeSeries(f))X.observe(A.value,this.flattenProperties(A.attributes))}),this.gauges.set(f,R)}j.set(Z,{value:$,attributes:Q})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(f){this.distinctId=f}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(f,$,W){if(!this.logger)return;let J=this.flattenProperties(this.buildAttributes($,W));this.logger.emit({severityText:"INFO",body:f,attributes:J})}buildAttributes(f,$=!1){return{...this.commonProperties,...this.metadata,...f,...this.distinctId?{distinct_id:this.distinctId}:{},...$?{_required:!0}:{}}}snapshotGaugeSeries(f){let $=this.gaugeValues.get(f);if(!$)return[];return Array.from($.values(),(W)=>({value:W.value,attributes:W.attributes?{...W.attributes}:void 0}))}flattenProperties(f,$="",W=new WeakSet,J=0){if(!f)return{};let H={},Q=100,Z=10;for(let[P,j]of Object.entries(f)){if(P==="__proto__"||P==="constructor"||P==="prototype")continue;let R=$?`${$}.${P}`:P;if(j===null||j===void 0){H[R]=String(j);continue}if(Array.isArray(j)){let X=j.length>Q?j.slice(0,Q):j;try{H[R]=JSON.stringify(X)}catch{H[R]="[UnserializableArray]"}if(j.length>Q)H[`${R}_truncated`]=!0,H[`${R}_original_length`]=j.length;continue}if(typeof j==="object"){if(j instanceof Date){H[R]=j.toISOString();continue}if(j instanceof Error){H[R]=j.message;continue}if(W.has(j)){H[R]="[Circular]";continue}if(J>=Z){H[R]="[MaxDepthExceeded]";continue}W.add(j),Object.assign(H,this.flattenProperties(j,R,W,J+1));continue}if(pM(j)){H[R]=j;continue}try{H[R]=JSON.stringify(j)}catch{H[R]=String(j)}}return H}}function pM(f){return typeof f==="string"||typeof f==="number"||typeof f==="boolean"}class V8{name;logger;enabled;constructor(f={}){this.name=f.name??"TelemetryLoggerSink",this.logger=f.logger,this.enabled=f.enabled??!0}emit(f,$){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:f,properties:$})}emitRequired(f,$){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:f,properties:$})}recordCounter(f,$,W,J,H){if(!H&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:f,value:$,attributes:W,description:J,required:H===!0})}recordHistogram(f,$,W,J,H){if(!H&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:f,value:$,attributes:W,description:J,required:H===!0})}recordGauge(f,$,W,J,H){if(!H&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:f,value:$,attributes:W,description:J,required:H===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class Q2{adapters;metadata;distinctId;commonProperties;constructor(f={}){if(this.adapters=[...f.adapters??[]],f.logger)this.adapters.push(new V8({logger:f.logger}));this.metadata={...f.metadata??{}},this.distinctId=f.distinctId,this.commonProperties={...f.commonProperties??{}}}addAdapter(f){this.adapters.push(f)}setDistinctId(f){this.distinctId=f}setMetadata(f){this.metadata={...f}}updateMetadata(f){this.metadata={...this.metadata,...f}}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}isEnabled(){return this.adapters.some((f)=>f.isEnabled())}capture(f){let $=this.buildAttributes(f.properties);for(let W of this.adapters)W.emit(f.event,$)}captureRequired(f,$){let W=this.buildAttributes($);for(let J of this.adapters)J.emitRequired(f,W)}recordCounter(f,$,W,J,H=!1){let Q=this.buildAttributes(W);for(let Z of this.adapters)Z.recordCounter(f,$,Q,J,H)}recordHistogram(f,$,W,J,H=!1){let Q=this.buildAttributes(W);for(let Z of this.adapters)Z.recordHistogram(f,$,Q,J,H)}recordGauge(f,$,W,J,H=!1){let Q=this.buildAttributes(W);for(let Z of this.adapters)Z.recordGauge(f,$,Q,J,H)}async flush(){await Promise.all(this.adapters.map((f)=>f.flush()))}async dispose(){await Promise.all(this.adapters.map((f)=>f.dispose()))}buildAttributes(f){return{...this.commonProperties,...f,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}var e5=()=>{};import{metrics as iM,trace as nM}from"@opentelemetry/api";import{logs as aM}from"@opentelemetry/api-logs";import{OTLPLogExporter as tM}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as sM}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as oM}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as eM}from"@opentelemetry/resources";import{BatchLogRecordProcessor as fG,ConsoleLogRecordExporter as $G,LoggerProvider as WG}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as JG,MeterProvider as HG,PeriodicExportingMetricReader as oj}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as QG,ConsoleSpanExporter as ZG,SimpleSpanProcessor as PG}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as jG}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as RG,ATTR_SERVICE_VERSION as XG}from"@opentelemetry/semantic-conventions";class ej{distinctId;metadata;commonProperties;constructor(f={}){this.distinctId=f.distinctId,this.metadata={...f.metadata??{}},this.commonProperties={...f.commonProperties??{}}}setDistinctId(f){this.distinctId=f}setMetadata(f){this.metadata={...f}}updateMetadata(f){this.metadata={...this.metadata,...f}}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}isEnabled(){return!1}capture(f){this.resolveProperties(f.properties)}captureRequired(f,$){this.resolveProperties($)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(f){return{...this.commonProperties,...f,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class Z2{meterProvider;loggerProvider;tracerProvider;options;constructor(f={}){this.options=f;let $=eM({[RG]:f.serviceName??"cline",...f.serviceVersion?{[XG]:f.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider($),this.loggerProvider=this.createLoggerProvider($),this.tracerProvider=this.createTracerProvider($),this.meterProvider)iM.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)aM.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(f="cline",$){return nM.getTracer(f,$??this.options.serviceVersion)}createAdapter(f){return new A8({...f,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(f){let $=this.createAdapter({name:f.name,enabled:this.options.enabled,metadata:f.metadata});return new Q2({...f,adapters:[$],distinctId:c$(f.distinctId)})}async forceFlush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.(),this.tracerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.(),this.tracerProvider?.shutdown?.()])}createMeterProvider(f){let $=f9(this.options.metricsExporter);if($.length===0)return null;let W=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),J=Math.min(30000,Math.floor(W*0.8)),H=$.map((Q)=>BG(Q,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:W,timeout:J})).filter((Q)=>Q!==null);if(H.length===0)return null;return new HG({resource:f,readers:H})}createTracerProvider(f){let $=f9(this.options.tracesExporter);if($.length===0)return null;let W=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,J=this.options.otlpTracesHeaders??this.options.otlpHeaders,H=[];for(let Q of $){let Z=VG(Q,{endpoint:W,headers:J,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(Z)H.push(Z)}if(H.length===0)return null;return new jG({resource:f,spanProcessors:H})}createLoggerProvider(f){let $=f9(this.options.logsExporter);if($.length===0)return null;let W=$.map((J)=>{let H=AG(J,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!H)return null;return new fG(H,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((J)=>J!==null);if(W.length===0)return null;return new WG({resource:f,processors:W})}}function B8(f){let $=new Z2(f),W=$.createTelemetryService(f);return W.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:f.enabled??!0,logsExporter:Array.isArray(f.logsExporter)?f.logsExporter.join(","):f.logsExporter,metricsExporter:Array.isArray(f.metricsExporter)?f.metricsExporter.join(","):f.metricsExporter,tracesExporter:Array.isArray(f.tracesExporter)?f.tracesExporter.join(","):f.tracesExporter,otlpProtocol:f.otlpProtocol,hasOtlpEndpoint:Boolean(f.otlpEndpoint),serviceName:f.serviceName,serviceVersion:f.serviceVersion}),{provider:$,telemetry:W}}function i$(f){if(W4())return{telemetry:new ej(f)};if(f.enabled!==!0)return{telemetry:new Q2({...f,distinctId:c$(f.distinctId)})};return B8(f)}function P2(f){let{telemetry:$,provider:W}=i$(f);return{telemetry:$,provider:W,flush:async()=>{let Q=W;if(Q&&typeof Q.forceFlush==="function")try{await Q.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([$.dispose(),W?.dispose()])}}}function f9(f){if(!f)return[];return(Array.isArray(f)?f:f.split(",")).map((W)=>W.trim()).filter((W)=>W==="console"||W==="otlp")}function AG(f,$){if(f==="console")return new $G;if(!$.endpoint)return null;let W=$9($.endpoint,"/v1/logs");return new tM({url:W,headers:$.headers})}function VG(f,$){if(f==="console")return new PG(new ZG);if(!$.endpoint)return null;let W=$9($.endpoint,"/v1/traces");return new QG(new oM({url:W,headers:$.headers}))}function BG(f,$){if(f==="console")return new oj({exporter:new JG,exportIntervalMillis:$.interval,exportTimeoutMillis:$.timeout});if(!$.endpoint)return null;let W=$9($.endpoint,"/v1/metrics");return new oj({exporter:new sM({url:W,headers:$.headers}),exportIntervalMillis:$.interval,exportTimeoutMillis:$.timeout})}function $9(f,$){let W=new URL(f),J=W.pathname.endsWith("/")?W.pathname.slice(0,-1):W.pathname;return W.pathname=J.endsWith($)?J:`${J}${$}`,W.toString()}var q6=$1(()=>{K0();U6();e5()});var dX={};z(dX,{createOpenTelemetryTelemetryService:()=>B8,createConfiguredTelemetryService:()=>i$,createConfiguredTelemetryHandle:()=>P2,OpenTelemetryProvider:()=>Z2,OpenTelemetryAdapter:()=>A8});var rX=$1(()=>{q6()});import{initVcr as $O}from"@clinebot/shared";import{normalizeProviderId as oL}from"@clinebot/llms";var pX={};z(pX,{LocalRuntimeHost:()=>Q0});import{homedir as lL}from"node:os";import{isAbsolute as pL,join as P3,resolve as iL}from"node:path";import{createSessionId as nL,isLikelyAuthError as aL,normalizeUserInput as tL}from"@clinebot/shared";import{setHomeDirIfUnset as sL}from"@clinebot/shared/storage";var k3={};z(k3,{createContextCompactionPrepareTurn:()=>U2});import{createHandler as VA}from"@clinebot/llms";var B3=200000,T3=0.95;var Y3=20000;var F3=8;function PA(f){return Math.max(1,Math.ceil(f.length/4))}function R$(f,$){if(f.length<=$)return f;return`${f.slice(0,$)}
4
+ ...[truncated ${f.length-$} chars]`}function jA(f){if(typeof f==="string")return R$(f,2000);return f.map(($)=>{switch($.type){case"text":return $.text;case"file":return`<file path="${$.path}">
5
+ ${R$($.content,2000)}
6
+ </file>`;case"image":return`[image:${$.mediaType}]`;default:return""}}).join(`
7
+ `)}function RA(f){return Object.entries(f).map(([$,W])=>`${$}=${JSON.stringify(W)}`).join(", ")}function y3(f){if(typeof f.content==="string")return`[${f.role==="user"?"User":"Bot"}]: ${f.content}`;let $=[];for(let W of f.content)switch(W.type){case"text":$.push(`[${f.role==="user"?"User":"Bot"}]: ${W.text}`);break;case"thinking":$.push(`[Bot thinking]: ${R$(W.thinking,2000)}`);break;case"redacted_thinking":$.push("[Bot thinking]: [redacted]");break;case"tool_use":$.push(`[Bot tool calls]: ${W.name}(${RA(W.input)})`);break;case"tool_result":$.push(`[Tool result]: ${jA(W.content)}`);break;case"file":$.push(`[${f.role==="user"?"User":"Bot"} file ${W.path}]: ${R$(W.content,2000)}`);break;case"image":$.push(`[${f.role==="user"?"User":"Bot"} image]: ${W.mediaType}`);break}return $.join(`
8
+ `)}function h3(f){return f.map(y3).join(`
9
+
10
+ `).trim()}function K3(){let f=new WeakMap;return($)=>{let W=$,J=f.get(W);if(typeof J==="number")return J;let H=PA(y3($));return f.set(W,H),H}}function h2(f){return f.metadata?.kind==="compaction_summary"}function ZJ(f){if(!h2(f))return;let $=f.metadata;if(!$)return;let W=$.details;return{kind:"compaction_summary",summary:String($.summary??""),details:{readFiles:Array.isArray(W?.readFiles)?W.readFiles.filter((J)=>typeof J==="string").map((J)=>J.trim()).filter((J)=>J.length>0):[],modifiedFiles:Array.isArray(W?.modifiedFiles)?W.modifiedFiles.filter((J)=>typeof J==="string").map((J)=>J.trim()).filter((J)=>J.length>0):[]},tokensBefore:Number($.tokensBefore??0),generatedAt:Number($.generatedAt??0)}}function XA(f){if(f.role!=="user"||!Array.isArray(f.content))return!1;return f.content.length>0&&f.content.every(($)=>$.type==="tool_result")}function U3(f){return f.role==="user"&&!XA(f)&&!h2(f)}function M3(f){for(let $=0;$<f.length;$+=1)if(U3(f[$]))return $;return-1}function PJ(f){for(let $=f.length-1;$>=0;$-=1)if(U3(f[$]))return $;return 0}function G3(f){for(let $=f.length-1;$>=0;$-=1)if(f[$].role==="assistant")return $;return-1}function D3(f){for(let $=f.length-1;$>=0;$-=1)if(h2(f[$]))return $;return-1}function _3(f,$,W){let J=PJ(f);if(J<=0)return 0;let H=0,Q=f.length;for(let Z=f.length-1;Z>=0;Z-=1)if(H+=W(f[Z]),Q=Z,H>=$)break;if(Q<=0)return 0;return Math.min(Q,J)}function y2(f){if(typeof f==="string"&&f.trim().length>0)return[f];if(Array.isArray(f))return f.flatMap(($)=>y2($));if(f&&typeof f==="object"){let $=f,W=[];for(let J of["path","file_path","target_file","new_file_path","old_file_path"])W.push(...y2($[J]));if(Array.isArray($.files)){for(let J of $.files)if(J&&typeof J==="object")W.push(...y2(J.path))}if(Array.isArray($.file_paths))W.push(...y2($.file_paths));return W}return[]}function F2(f,$){let W=new Set(f);for(let J of $){let H=J.trim();if(!H)continue;W.add(H)}return[...W].sort((J,H)=>J.localeCompare(H))}function L3(f){let $=[],W=[];for(let J of f){let H=ZJ(J);if(H){$=F2($,H.details.readFiles),W=F2(W,H.details.modifiedFiles);continue}if(!Array.isArray(J.content))continue;for(let Q of J.content){if(Q.type==="file"){$=F2($,[Q.path]);continue}if(Q.type!=="tool_use")continue;let Z=y2(Q.input);if(Q.name==="read_files"){$=F2($,Z);continue}if(Q.name==="editor"||Q.name==="apply_patch")W=F2(W,Z)}}return{readFiles:$,modifiedFiles:W}}function AA(f){let $=f.readFiles.length>0?f.readFiles.map((J)=>`- ${J}`).join(`
11
+ `):"- none",W=f.modifiedFiles.length>0?f.modifiedFiles.map((J)=>`- ${J}`).join(`
12
+ `):"- none";return`## Files
13
+ Read:
14
+ ${$}
15
+ Modified:
16
+ ${W}`}function O3(f,$){if(/^## Files$/im.test(f))return f.trim();return`${f.trim()}
17
+
18
+ ${AA($)}`.trim()}function C3(f){let $=[`Summarize this session for continuation. Be concise and factual.
19
+
20
+ ## Goal
21
+ One sentence: what is being built or fixed.
22
+
23
+ ## State
24
+ - Done: completed steps
25
+ - In Progress: current work
26
+ - Blocked: blockers or open questions
27
+
28
+ ## Highlights
29
+ Key technical choices or notable findings (omit if none).
30
+
31
+ ## Next
32
+ Immediate next steps.
33
+
34
+ ## Files
35
+ Read: ${f.fileOps.readFiles.join(", ")||"none"}
36
+ Edited: ${f.fileOps.modifiedFiles.join(", ")||"none"}`];if(f.previousSummary?.trim())$.push(`Previous summary:
37
+ ${f.previousSummary.trim()}`);return $.push(`Conversation:
38
+ ${f.conversationText||"(empty)"}`),$.join(`
39
+
40
+ `)}function z3(f){let $=f.summarizer;if(!$)return{...f.activeProviderConfig,maxOutputTokens:1024,thinking:!1};let W=$.providerConfig?.providerId===$.providerId?$.providerConfig:void 0;return{...W??{},providerId:$.providerId,modelId:$.modelId,apiKey:$.apiKey??W?.apiKey,baseUrl:$.baseUrl??W?.baseUrl,headers:$.headers??W?.headers,knownModels:$.knownModels??W?.knownModels,maxOutputTokens:$.maxOutputTokens??1024,thinking:!1}}function N3(f){return{role:"user",content:`Context summary:
41
+
42
+ ${f.summary}`,metadata:{kind:"compaction_summary",summary:f.summary,details:f.fileOps,tokensBefore:f.tokensBefore,generatedAt:Date.now()}}}async function BA(f){let $=VA(f.providerConfig),W="";for await(let J of $.createMessage("Summarize the provided coding session into a concise continuation note with detailed next steps.",[{role:"user",content:f.request}])){if(J.type==="text"){W+=J.text;continue}if(J.type==="done"&&!J.success&&J.error)throw Error(J.error)}return f.logger?.debug("Generated compaction summary",{outputChars:W.length,modelId:f.providerConfig.modelId,providerId:f.providerConfig.providerId}),W.trim()}async function b3(f){let $=f.context.messages;if($.length<2)return;let W=_3($,f.preserveRecentTokens,f.estimateMessageTokens);if(W<=0||W>=$.length)return;let J=$.slice(0,W),H=D3(J),Q=H>=0?ZJ(J[H])?.summary:void 0,Z=H>=0?J.slice(H+1):J;if(Z.length===0)return;let P=L3(J),j=h3(Z),R=await BA({providerConfig:z3({activeProviderConfig:f.providerConfig,summarizer:f.summarizer}),request:C3({previousSummary:Q,conversationText:j,fileOps:P}),logger:f.logger});if(!R.trim())return;let X=O3(R,P),A=$.reduce((T,h)=>T+f.estimateMessageTokens(h),0),V=[N3({summary:X,fileOps:P,tokensBefore:A}),...$.slice(W)],B=V.reduce((T,h)=>T+f.estimateMessageTokens(h),0);return f.logger?.debug("Performed agentic compaction",{messagesBefore:$.length,messagesAfter:V.length,messagesSummarized:W,messagesPreserved:$.length-W,tokensBefore:A,tokensAfter:B,contextWindowTokens:f.context.contextWindowTokens}),{messages:V}}function E3(f){if(h2(f))return;if(typeof f.content==="string"){let W=f.content.trim();return W?{...f,content:W}:void 0}let $=f.content.filter((W)=>W.type!=="text"||W.text.trim());if($.length===0)return;return{...f,content:$.map((W)=>W.type==="text"?{...W,text:W.text.trim()}:W)}}function K2(f,$){return f.reduce((W,J)=>W+$(J),0)}function q3(f,$){let W=Math.max(1,$),J=Math.max(16,W*4);if(typeof f.content==="string"){let Z=R$(f.content,J).trim();return{...f,content:Z||"..."}}let H=J,Q=f.content.map((Z)=>{if(Z.type!=="text"||H<=0)return Z;let P=R$(Z.text,H).trim();return H-=P.length,{...Z,text:P||"..."}});return{...f,content:Q}}function TA(f,$){let W=M3(f),J=PJ(f),H=G3(f),Q=[];for(let Z=0;Z<f.length;Z+=1){let P=E3(f[Z]);if(!P)continue;Q.push({index:Z,message:P,estimatedTokens:$(P),isFirstUser:Z===W,isLastUser:Z===J,isLastAssistant:Z===H})}return Q}function w3(f,$,W,J){let H=f[$];H.message=W,H.estimatedTokens=J(W)}function _8(f,$,W,J){let H=K2(f.map((Q)=>Q.message),J);for(let Q=0;Q<f.length&&H>W;){if(!$(f[Q])){Q+=1;continue}H-=f[Q].estimatedTokens,f.splice(Q,1)}}function YA(f,$,W){let J=K2(f.map((Q)=>Q.message),W);if(J<=$)return;for(let Q=f.length-1;Q>=0&&J>$;Q-=1){let Z=f[Q];if(Z.isFirstUser)continue;let P=Math.max(F3,Z.estimatedTokens-(J-$));if(P>=Z.estimatedTokens)continue;w3(f,Q,q3(Z.message,P),W),J=K2(f.map((j)=>j.message),W)}if(J<=$)return;let H=f.findIndex((Q)=>Q.isFirstUser);if(H>=0){let Q=Math.max(1,f[H].estimatedTokens-(J-$));w3(f,H,q3(f[H].message,Q),W)}}function FA(f,$){return JSON.stringify(f)!==JSON.stringify($)}function S3(f){let $=Math.max(1,Math.min(f.context.triggerTokens,f.context.contextWindowTokens)),W=TA(f.context.messages,f.estimateMessageTokens);if(W.length===0)return;_8(W,(Z)=>Z.message.role==="assistant"&&!Z.isLastAssistant,$,f.estimateMessageTokens),_8(W,(Z)=>Z.message.role==="user"&&!Z.isFirstUser&&!Z.isLastUser,$,f.estimateMessageTokens),_8(W,(Z)=>Z.message.role==="assistant"&&Z.isLastAssistant,$,f.estimateMessageTokens),_8(W,(Z)=>Z.message.role==="user"&&Z.isLastUser&&!Z.isFirstUser,$,f.estimateMessageTokens),YA(W,$,f.estimateMessageTokens);let J=W.map((Z)=>Z.message);if(!FA(f.context.messages,J))return;let H=K2(f.context.messages.map((Z)=>E3(Z)??Z),f.estimateMessageTokens),Q=K2(J,f.estimateMessageTokens);return f.logger?.debug("Performed basic compaction",{messagesBefore:f.context.messages.length,messagesAfter:J.length,messagesRemoved:f.context.messages.length-J.length,tokensBefore:H,tokensAfter:Q,targetTokens:$,contextWindowTokens:f.context.contextWindowTokens}),{messages:J}}var yA={basic:({context:f,estimateMessageTokens:$,logger:W})=>S3({context:f,estimateMessageTokens:$,logger:W}),agentic:({context:f,providerConfig:$,compaction:W,estimateMessageTokens:J,logger:H})=>b3({context:f,providerConfig:$,summarizer:W?.summarizer,preserveRecentTokens:W?.preserveRecentTokens??Y3,estimateMessageTokens:J,logger:H})};function hA(f){if(typeof f.config.reserveTokens==="number"){let J=Math.max(0,f.config.reserveTokens),H=Math.max(0,f.contextWindowTokens-J);return{shouldCompact:f.inputTokens>H,triggerTokens:H,thresholdRatio:f.contextWindowTokens>0?H/f.contextWindowTokens:0}}let $=f.config.thresholdRatio??T3,W=f.contextWindowTokens*$;return{shouldCompact:f.inputTokens>W,triggerTokens:W,thresholdRatio:$}}function U2(f){let $=f.compaction;if($?.enabled!==!0)return;let W=f.providerConfig??{providerId:f.providerId,modelId:f.modelId},J=K3(),H=$?.strategy??"basic",Q=yA[H];return async(Z)=>{let P=Z.apiMessages.reduce((B,T)=>B+J(T),0),j=$?.contextWindowTokens??Z.model.info?.contextWindow??B3;if(typeof j!=="number"||!Number.isFinite(j)||j<=0)return;let R=hA({inputTokens:P,contextWindowTokens:j,config:{reserveTokens:$?.reserveTokens,thresholdRatio:$?.thresholdRatio}});if(!R.shouldCompact)return;let X={agentId:Z.agentId,conversationId:Z.conversationId,parentAgentId:Z.parentAgentId,iteration:Z.iteration,messages:Z.messages,model:Z.model,contextWindowTokens:j,triggerTokens:R.triggerTokens,thresholdRatio:R.thresholdRatio,utilizationRatio:j>0?P/j:0};Z.emitStatusNotice?.("auto-compacting",{kind:"auto_compaction",reason:"auto_compaction",iteration:Z.iteration,triggerTokens:R.triggerTokens,contextWindowTokens:j});let A=Z.messages.length,V=$?.compact?await $.compact(X):await Q({context:X,providerConfig:{...W,abortSignal:Z.abortSignal},compaction:$,estimateMessageTokens:J,logger:f.logger});if(V?.messages){let B=V.messages.reduce((T,h)=>T+J(h),0);f.logger?.log("Context compaction completed",{severity:"info",strategy:H,contextWindowTokens:j,inputTokens:P,afterTokens:B,tokensSaved:P-B,utilizationBefore:`${(P/j*100).toFixed(1)}%`,utilizationAfter:`${(B/j*100).toFixed(1)}%`,thresholdTrigger:`${(R.thresholdRatio*100).toFixed(1)}%`,messagesBefore:A,messagesAfter:V.messages.length,messagesRemoved:A-V.messages.length})}return V}}var p7={};z(p7,{zodToJsonSchema:()=>qB,validateWithZod:()=>bB,resolveToolRoutingConfig:()=>P1,resolveToolPresetName:()=>V0,resolveCoreSelectedToolIds:()=>k8,getCoreHeadlessToolNames:()=>x2,getCoreDefaultEnabledToolIds:()=>S8,getCoreBuiltinToolCatalog:()=>h$,getCoreAcpToolNames:()=>m8,createWindowsShellTool:()=>FJ,createWebFetchTool:()=>yJ,createWebFetchExecutor:()=>k2,createToolPoliciesWithPreset:()=>z8,createSubmitAndExitTool:()=>MJ,createSkillsTool:()=>A$,createSearchTool:()=>TJ,createSearchExecutor:()=>S2,createReadFilesTool:()=>BJ,createFileReadExecutor:()=>E2,createEditorTool:()=>KJ,createEditorExecutor:()=>q2,createDefaultToolsWithPreset:()=>N8,createDefaultTools:()=>S0,createDefaultExecutors:()=>Q1,createBuiltinTools:()=>K$,createBashTool:()=>YJ,createBashExecutor:()=>b2,createAskQuestionTool:()=>UJ,createApplyPatchTool:()=>hJ,createApplyPatchExecutor:()=>N2,WebFetchRequestSchema:()=>AJ,ToolPresets:()=>zf,TEAM_TOOL_NAMES:()=>A1,SubmitInputSchema:()=>z2,SkillsInputSchema:()=>O2,SearchCodebaseInputSchema:()=>G2,RunCommandsInputSchema:()=>W1,ReadFilesInputSchema:()=>M2,ReadFileRequestSchema:()=>b0,FetchWebContentInputSchema:()=>D2,EditFileInputSchema:()=>_2,DefaultToolNames:()=>Qf,DEFAULT_MODEL_TOOL_ROUTING_RULES:()=>Z1,AskQuestionInputSchema:()=>C2,ApplyPatchInputSchema:()=>L2,ALL_DEFAULT_TOOL_NAMES:()=>N0});import{validateWithZod as bB,zodToJsonSchema as qB}from"@clinebot/shared";var Qf={READ_FILES:"read_files",SEARCH_CODEBASE:"search_codebase",RUN_COMMANDS:"run_commands",FETCH_WEB_CONTENT:"fetch_web_content",APPLY_PATCH:"apply_patch",EDITOR:"editor",SKILLS:"skills",ASK:"ask_question",SUBMIT_AND_EXIT:"submit_and_exit"},N0=[Qf.READ_FILES,Qf.SEARCH_CODEBASE,Qf.RUN_COMMANDS,Qf.FETCH_WEB_CONTENT,Qf.APPLY_PATCH,Qf.EDITOR,Qf.SKILLS,Qf.ASK,Qf.SUBMIT_AND_EXIT];import{createTool as X0,validateWithZod as E0,zodToJsonSchema as tf}from"@clinebot/shared";import{validateWithZod as d3}from"@clinebot/shared";import{z as G}from"zod";var q0=6000,jJ=G.string().describe("The absolute file path of a text file to read content from"),m3=G.object({start_line:G.number().int().positive().nullable().optional().describe("Optional one-based starting line number to read from; use null or omit for the start of the file"),end_line:G.number().int().positive().nullable().optional().describe("Optional one-based ending line number to read through; use null or omit for the end of the file")}).describe("Optional inclusive one-based file line range"),b0=G.object({path:jJ,start_line:m3.shape.start_line,end_line:m3.shape.end_line}).describe("A file read request with optional inclusive one-based line bounds"),M2=G.object({files:G.array(b0).describe("Array of file read requests. Omit start_line/end_line or set them to null to return the full file content boundaries; provide integers to return only that inclusive one-based line range. Prefer this tool over running terminal command to get file content for better performance and reliability.")}),g3=G.union([M2,b0,G.array(b0),G.array(G.string()),G.string(),G.object({files:b0}),G.object({file_paths:G.array(jJ)}),G.object({file_paths:G.string()}),G.object({paths:G.array(G.union([jJ,b0]))}),G.object({paths:b0}),G.object({paths:G.string()})]),G2=G.object({queries:G.array(G.string()).describe("Array of regex search queries to execute")}),x3=G.union([G2,G.array(G.string()),G.string(),G.object({queries:G.string()})]),X$=G.string().describe(`The non-interactive shell command to execute - MUST keep input short and concise (within ${q0*2} characters) to avoid timeouts.`),W1=G.object({commands:G.array(X$).describe("Array of shell commands to execute")}),I3=G.union([W1,G.object({commands:X$}),G.object({command:X$}),G.object({cmd:X$}),G.array(G.string()),G.string()]),RJ=G.object({command:G.string().min(1).describe("The executable to run directly without shell parsing."),args:G.array(G.string()).optional().describe("Optional argv list passed directly to the executable.")}),v3=G.union([X$,RJ]),XJ=G.object({commands:G.array(v3).describe("Array of commands to execute. Prefer structured { command, args } entries for portability; plain strings are still supported and are interpreted by the active shell.")}),u3=G.union([W1,XJ,G.object({commands:v3}),G.array(RJ),RJ,G.object({command:X$}),G.object({cmd:X$}),G.array(G.string()),G.string()]),AJ=G.object({url:G.string().describe("The URL to fetch"),prompt:G.string().min(2).describe("Analysis prompt for the fetched content")}),D2=G.object({requests:G.array(AJ).describe("Array of the URLs for the web fetch requests")}),_2=G.object({path:G.string().min(1).describe("The absolute file path for the action to be performed on"),old_text:G.string().nullable().optional().describe(`Exact text to replace (must match exactly once). Omit this when creating a missing file or inserting via insert_line. Keep this at or below ${q0} characters when possible; larger payloads should be split across multiple tool calls to avoid timeouts.`),new_text:G.string().describe(`The new content to write when creating a missing file, the replacement text for edits, or the inserted text when insert_line is provided. Keep this at or below ${q0} characters when possible; for large edits, use multiple calls with small chunks of old_text and new_text to iteratively edit the file.`),insert_line:G.number().int().nullable().optional().describe("Optional positive one-based boundary line. When provided, the tool inserts new_text before that line instead of performing a replacement edit; use line_count + 1 to append at EOF.")}).describe("Edit a text file by replacing old_text with new_text, create the file with new_text if it does not exist, or insert new_text at insert_line when insert_line is provided. Prefer using this tool for file edits over shell commands. IMPORTANT: large edits can time out, so use small chunks and multiple calls when possible."),L2=G.object({input:G.string().min(1).describe("The freeform apply_patch payload in the canonical patch grammar (e.g *** Begin Patch, *** Update File:, @@, and *** End Patch).")}).describe("Modify or create a text file by applying patches using the canonical apply_patch diff grammar. Prefer sending the patch body directly rather than wrapping it in shell syntax. IMPORTANT: large patches can time out, so use small chunks and multiple calls when possible."),c3=G.union([L2,G.string()]),O2=G.object({skill:G.string().min(1).describe("Name of the skill to execute."),args:G.string().nullable().optional().describe("Arguments for the skill; use null when omitted")}),C2=G.object({question:G.string().min(1).describe('The single question to ask the user. E.g. "How can I help you?"'),options:G.array(G.string().min(1)).min(2).max(5).describe("Array of 2-5 user-selectable answer options for the single question")}),z2=G.object({summary:G.string().min(10).describe("Summarization of the investigation, steps taken, and resolution status to submit at the end of the session. Before submitting, read the problem again along with any provided test's assertions carefully and confirm your fix produces the expected output."),verified:G.boolean().describe(`Have you verified that the issue is resolved to the best of your knowledge, including updating and creating all the requested files and items? 'True' if you have completed the investigation and taken all necessary steps to resolve the issue.
43
+ 'False' if you have done all you can but cannot resolve the issue or if you are stuck and cannot proceed further. =
44
+ IMPORTANT: You must run the specific failing test(s) mentioned in the issue or test patch and include the test output in your reasoning. If the test still fails after your fix, you must revise. Do NOT submit with 'true' unless the test output shows the test passing.`)});function w0(f){if(f instanceof Error)return f.message;return String(f)}function r3(f){if(typeof f.old_text==="string"&&f.old_text.length>q0)return`Editor input too large: old_text was ${f.old_text.length} characters, exceeding the recommended limit of ${q0}. Split the edit into smaller tool calls so later tool calls are less likely to be truncated or time out.`;if(f.new_text.length>q0)return`Editor input too large: new_text was ${f.new_text.length} characters, exceeding the recommended limit of ${q0}. Split the edit into smaller tool calls so later tool calls are less likely to be truncated or time out.`;return null}function af(f,$,W){return Promise.race([f,new Promise((J,H)=>{setTimeout(()=>H(Error(W)),$)})])}function l3(f){let $=d3(g3,f);if(typeof $==="string")return[{path:$}];if(Array.isArray($))return $.map((W)=>typeof W==="string"?{path:W}:W);if("files"in $)return Array.isArray($.files)?$.files:[$.files];if("file_paths"in $)return(Array.isArray($.file_paths)?$.file_paths:[$.file_paths]).map((J)=>({path:J}));if("paths"in $)return(Array.isArray($.paths)?$.paths:[$.paths]).map((J)=>typeof J==="string"?{path:J}:J);return[$]}function L8(f){let{path:$,start_line:W,end_line:J}=f;if(W==null&&J==null)return $;return`${$}:${W??1}-${J??"EOF"}`}function p3(f){let{start_line:$,end_line:W}=f;if($==null||W==null||$<=W)return null;return`start_line must be less than or equal to end_line (received start_line: ${$}, end_line: ${W})`}function i3(f){let $=d3(u3,f);if(typeof $==="string")return[$];if(Array.isArray($))return $;if("commands"in $)return Array.isArray($.commands)?$.commands:[$.commands];if("command"in $)return"args"in $?[$]:[$.command];if("cmd"in $)return[$.cmd];return[$]}function VJ(f){if(typeof f==="string")return f;let $=f.args??[];if($.length===0)return f.command;let W=$.map((J)=>/[\s"]/u.test(J)?JSON.stringify(J):J);return`${f.command} ${W.join(" ")}`}function BJ(f,$={}){let W=$.fileReadTimeoutMs??1e4;return X0({name:"read_files",description:"Read the full content of text or image files at the provided absolute paths, or return only an inclusive one-based line range when start_line/end_line are provided. Returns file contents or error messages for each path.",inputSchema:tf(M2),timeoutMs:W*2,retryable:!0,maxRetries:1,execute:async(J,H)=>{let Q=l3(J);return Promise.all(Q.map(async(Z)=>{let P=p3(Z);if(P)return{query:L8(Z),result:"",error:`Invalid file range: ${P}`,success:!1};try{let j=await af(f(Z,H),W,`File read timed out after ${W}ms`);return{query:L8(Z),result:j,success:!0}}catch(j){let R=w0(j);return{query:L8(Z),result:"",error:`Error reading file: ${R}`,success:!1}}}))}})}function TJ(f,$={}){let W=$.searchTimeoutMs??30000,J=$.cwd??process.cwd();return X0({name:"search_codebase",description:"Perform regex pattern searches across the codebase. Supports multiple parallel searches. Use for finding code patterns, function definitions, class names, imports, etc.",inputSchema:tf(G2),timeoutMs:W*2,retryable:!0,maxRetries:1,execute:async(H,Q)=>{let Z=E0(x3,H),P=Array.isArray(Z)?Z:typeof Z==="object"?Array.isArray(Z.queries)?Z.queries:[Z.queries]:[Z];return Promise.all(P.map(async(j)=>{try{let R=await af(f(j,J,Q),W,`Search timed out after ${W}ms`),X=R.length>0&&!R.includes("No results found");return{query:j,result:R,success:X}}catch(R){let X=w0(R);return{query:j,result:"",error:`Search failed: ${X}`,success:!1}}}))}})}function YJ(f,$={}){let W=$.bashTimeoutMs??30000,J=$.cwd??process.cwd();return X0({name:"run_commands",description:"Run shell commands from the root of the workspace. Use for listing files, checking git status, running builds, executing tests, etc. Commands should be properly shell-escaped.",inputSchema:tf(W1),timeoutMs:W*2,retryable:!1,maxRetries:0,execute:async(H,Q)=>{let Z=E0(I3,H),P;if(typeof Z==="string")P=[Z];else if(Array.isArray(Z))P=Z;else if("commands"in Z)P=Array.isArray(Z.commands)?Z.commands:[Z.commands];else if("command"in Z)P=[Z.command];else P=[Z.cmd];return Promise.all(P.map(async(j)=>{try{let R=await af(f(j,J,Q),W,`Command timed out after ${W}ms`);return{query:j,result:R,success:!0}}catch(R){let X=w0(R);return{query:j,result:"",error:`Command failed: ${X}`,success:!1}}}))}})}function FJ(f,$={}){let W=$.bashTimeoutMs??30000,J=$.cwd??process.cwd();return X0({name:"run_commands",description:"Run shell commands from the root of the workspacein Windows environment. Use for listing files, checking git status, running builds, executing tests, etc. Prefer structured { command, args } entries for portability; plain string commands should be properly shell-escaped.",inputSchema:tf(XJ),timeoutMs:W*2,retryable:!1,maxRetries:0,execute:async(H,Q)=>{let Z=i3(H);return Promise.all(Z.map(async(P)=>{try{let j=await af(f(P,J,Q),W,`Command timed out after ${W}ms`);return{query:VJ(P),result:j,success:!0}}catch(j){let R=w0(j);return{query:VJ(P),result:"",error:`Command failed: ${R}`,success:!1}}}))}})}function yJ(f,$={}){let W=$.webFetchTimeoutMs??30000;return X0({name:"fetch_web_content",description:"Fetch content from URLs and analyze them using the provided prompts. Use for retrieving documentation, API references, or any web content. Each request includes a URL and a prompt describing what information to extract.",inputSchema:tf(D2),timeoutMs:W*2,retryable:!0,maxRetries:2,execute:async(J,H)=>{let Q=E0(D2,J);return Promise.all(Q.requests.map(async(Z)=>{try{let P=await af(f(Z.url,Z.prompt,H),W,`Web fetch timed out after ${W}ms`);return{query:Z.url,result:P,success:!0}}catch(P){let j=w0(P);return{query:Z.url,result:"",error:`Error fetching web content: ${j}`,success:!1}}}))}})}var KA=`Use \`apply_patch\` to edit files with the canonical freeform patch grammar. Pass the patch text directly as the \`input\` string. Prefer the exact format below:
45
+
46
+ *** Begin Patch
47
+ *** Update File: path/to/file.ts
48
+ @@ optional section marker
49
+ [context before]
50
+ -[old line]
51
+ +[new line]
52
+ [context after]
53
+ *** End Patch
54
+
55
+ Supported actions:
56
+ - \`*** Add File: <path>\`
57
+ - \`*** Update File: <path>\`
58
+ - \`*** Delete File: <path>\`
59
+ - optional \`*** Move to: <new path>\` immediately after an Update File header
60
+
61
+ Rules:
62
+ - In an Add File section, every file-content line must start with \`+\`.
63
+ - In an Update section, use context lines plus \`-\` and \`+\` lines to describe the change.
64
+ - Use \`@@\` markers when extra context is needed to disambiguate repeated code blocks.
65
+ - Do not use line numbers; this format is context-based.
66
+ - Prefer sending the patch body directly. Legacy shell wrappers such as \`%%bash\` and \`apply_patch <<"EOF"\` are accepted for compatibility but are not preferred.
67
+
68
+ Example:
69
+
70
+ *** Begin Patch
71
+ *** Update File: src/page.tsx
72
+ @@
73
+ return (
74
+ <div>
75
+ <button onClick={() => console.log("clicked")}>Click me</button>
76
+ + <button onClick={() => console.log("cancel clicked")}>Cancel</button>
77
+ </div>
78
+ );
79
+ }
80
+ *** End Patch`;function hJ(f,$={}){let W=$.applyPatchTimeoutMs??30000,J=$.cwd??process.cwd();return X0({name:"apply_patch",description:KA,inputSchema:tf(L2),timeoutMs:W,retryable:!1,maxRetries:0,execute:async(H,Q)=>{let Z=E0(c3,H),P=typeof Z==="string"?Z:Z.input;try{return{query:"apply_patch",result:await af(f({input:P},J,Q),W,`apply_patch timed out after ${W}ms`),success:!0}}catch(j){return{query:"apply_patch",result:"",error:`apply_patch failed: ${w0(j)}`,success:!1}}}})}function KJ(f,$={}){let W=$.editorTimeoutMs??30000,J=$.cwd??process.cwd();return X0({name:"editor",description:"An editor for controlled filesystem edits on the text file at the provided path. Provide `insert_line` to insert `new_text` at a specific line number. Otherwise, the tool replaces `old_text` with `new_text`, or creates the file with `new_text` if file does not exist. Use this tools for making small, precise edits to existing files or creating new files over shell commands.",inputSchema:tf(_2),timeoutMs:W,retryable:!1,maxRetries:0,execute:async(H,Q)=>{let Z=E0(_2,H),P=Z.insert_line==null?"edit":"insert",j=r3(Z);if(j)return{query:`${P}:${Z.path}`,result:"",error:j,success:!1};try{let R=await af(f(Z,J,Q),W,`Editor operation timed out after ${W}ms`);return{query:`${P}:${Z.path}`,result:R,success:!0}}catch(R){let X=w0(R);return{query:`${P}:${Z.path}`,result:"",error:`Editor operation failed: ${X}`,success:!1}}}})}function A$(f,$={}){let W=$.skillsTimeoutMs??15000,J='Execute a skill within the main conversation. When users ask you to perform tasks, check if any available skills match. When users reference a slash command, invoke it with this tool. Input: `skill` (required) and optional `args`. Example: `skill: "pdf"`, `skill: "commit", args: "-m \\"Fix bug\\""`, `skill: "review-pr", args: "123"`, `skill: "ms-office-suite:pdf"`. When a skill matches the user\'s request, invoking this tool is a blocking requirement before any other response. Never mention a skill without invoking this tool.',H=X0({name:"skills",description:J,inputSchema:tf(O2),timeoutMs:W,retryable:!1,maxRetries:0,execute:async(Q,Z)=>{let P=E0(O2,Q);return af(f(P.skill,P.args||void 0,Z),W,`Skills operation timed out after ${W}ms`)}});return Object.defineProperty(H,"description",{get(){let Q=f.configuredSkills?.filter((Z)=>!Z.disabled).map((Z)=>Z.name);if(Q&&Q.length>0)return`${J} Available skills: ${Q.join(", ")}.`;return J},enumerable:!0,configurable:!0}),H}function UJ(f){return{name:"ask_question",description:"Ask user a question for clarifying or gathering information needed to complete the task. For example, ask the user clarifying questions about a key implementation decision. You should only ask one question. Provide an array of 2-5 options for the user to choose from. Never include an option to toggle to Act mode.",inputSchema:tf(C2),retryable:!1,maxRetries:0,execute:async($,W)=>{let J=E0(C2,$);return f(J.question,J.options,W)}}}function MJ(f,$={}){let W=$.submitTimeoutMs??15000;return X0({name:"submit_and_exit",description:"Submit the final answer and exit the conversation. For example, submit a summary of the investigation and confirm the issue is resolved. You should only submit once all necessary steps are completed. Provide a summary of the investigation and confirm the issue is resolved.",inputSchema:tf(z2),lifecycle:{completesRun:!0},timeoutMs:W,retryable:!1,maxRetries:0,execute:async(J,H)=>{let Q=E0(z2,J);return af(f(Q.summary,Q.verified,H),W,`submit_and_exit timed out after ${W}ms`)}})}function S0(f){let{executors:$,enableReadFiles:W=!0,enableSearch:J=!0,enableBash:H=!0,enableWebFetch:Q=!0,enableApplyPatch:Z=!1,enableEditor:P=!0,enableSkills:j=!0,enableAskQuestion:R=!0,enableSubmitAndExit:X=!1,...A}=f,V=[];if(W&&$.readFile)V.push(BJ($.readFile,A));if(J&&$.search)V.push(TJ($.search,A));if(H&&$.bash)if(process.platform==="win32")V.push(FJ($.bash,A));else V.push(YJ($.bash,A));if(Q&&$.webFetch)V.push(yJ($.webFetch,A));if(P&&$.editor)V.push(KJ($.editor,A));else if(Z&&$.applyPatch)V.push(hJ($.applyPatch,A));if(j&&$.skills)V.push(A$($.skills,A));if(R&&$.askQuestion)V.push(UJ($.askQuestion));else if(X&&$.submit)V.push(MJ($.submit,A));return V}import*as Of from"node:fs/promises";import*as Cf from"node:path";var g={BEGIN:"*** Begin Patch",END:"*** End Patch",ADD:"*** Add File: ",UPDATE:"*** Update File: ",DELETE:"*** Delete File: ",MOVE:"*** Move to: ",SECTION:"@@",END_FILE:"*** End of File"},a3=["%%bash","apply_patch","EOF","```"];class $f extends Error{constructor(f){super(f);this.name="DiffError"}}function Lf(f){let $={"‐":"-","‑":"-","‒":"-","–":"-","—":"-","−":"-","“":'"',"”":'"',"„":'"',"«":'"',"»":'"',"‘":"'","’":"'","‛":"'"," ":" "," ":" "};return f.normalize("NFC").replace(/./gu,(W)=>$[W]??W).replace(/\\`/g,"`").replace(/\\'/g,"'").replace(/\\"/g,'"')}class GJ{lines;currentFiles;patch={actions:{},warnings:[]};index=0;fuzz=0;currentPath;constructor(f,$){this.lines=f;this.currentFiles=$}parse(){this.skipBeginSentinel();while(this.hasMoreLines()&&!this.isEndMarker())this.parseNextAction();if(this.patch.warnings?.length===0)delete this.patch.warnings;return{patch:this.patch,fuzz:this.fuzz}}addWarning(f){if(!this.patch.warnings)this.patch.warnings=[];this.patch.warnings.push(f)}skipBeginSentinel(){if(this.lines[this.index]?.startsWith(g.BEGIN))this.index++}hasMoreLines(){return this.index<this.lines.length}isEndMarker(){return this.lines[this.index]?.startsWith(g.END)??!1}parseNextAction(){let f=this.lines[this.index];if(f?.startsWith(g.UPDATE)){this.parseUpdate(f.substring(g.UPDATE.length).trim());return}if(f?.startsWith(g.DELETE)){this.parseDelete(f.substring(g.DELETE.length).trim());return}if(f?.startsWith(g.ADD)){this.parseAdd(f.substring(g.ADD.length).trim());return}throw new $f(`Unknown line while parsing: ${f}`)}checkDuplicate(f,$){if(f in this.patch.actions)throw new $f(`Duplicate ${$} for file: ${f}`)}parseUpdate(f){this.checkDuplicate(f,"update"),this.currentPath=f,this.index++;let $=this.lines[this.index]?.startsWith(g.MOVE)?(this.lines[this.index++]??"").substring(g.MOVE.length).trim():void 0;if(!(f in this.currentFiles))throw new $f(`Update File Error: Missing File: ${f}`);let W=this.currentFiles[f]??"",J=this.parseUpdateFile(W,f);J.movePath=$,this.patch.actions[f]=J,this.currentPath=void 0}parseUpdateFile(f,$){let W={type:"update",chunks:[]},J=f.split(`
81
+ `),H=0,Q=[g.END,g.UPDATE,g.DELETE,g.ADD,g.END_FILE];while(!Q.some((Z)=>this.lines[this.index]?.startsWith(Z.trim()))){let Z=this.lines[this.index],P=Z?.startsWith("@@ ")?Z.substring(3):void 0;if(P!==void 0||(Z==="@@"?Z:void 0)!==void 0)this.index++;else if(H!==0)throw new $f(`Invalid Line:
82
+ ${this.lines[this.index]}`);if(P?.trim()){let F=Lf(P.trim());for(let Y=H;Y<J.length;Y++){let y=J[Y];if(y&&(Lf(y)===F||Lf(y.trim())===F)){if(H=Y+1,Lf(y.trim())===F&&Lf(y)!==F)this.fuzz++;break}}}let[R,X,A,V]=GA(this.lines,this.index),[B,T,h]=MA(J,R,H,V);if(B===-1){let F=R.join(`
83
+ `);this.addWarning({path:this.currentPath||$,chunkIndex:W.chunks.length,message:`Could not find matching context (similarity: ${h.toFixed(2)}). Chunk skipped.`,context:F.length>200?`${F.substring(0,200)}...`:F}),this.index=A}else{this.fuzz+=T;for(let F of X)F.origIndex+=B,W.chunks.push(F);H=B+R.length,this.index=A}}return W}parseDelete(f){if(this.checkDuplicate(f,"delete"),!(f in this.currentFiles))throw new $f(`Delete File Error: Missing File: ${f}`);this.patch.actions[f]={type:"delete",chunks:[]},this.index++}parseAdd(f){if(this.checkDuplicate(f,"add"),f in this.currentFiles)throw new $f(`Add File Error: File already exists: ${f}`);this.index++;let $=[],W=[g.END,g.UPDATE,g.DELETE,g.ADD];while(this.hasMoreLines()&&!W.some((J)=>this.lines[this.index]?.startsWith(J.trim()))){let J=this.lines[this.index++];if(J===void 0)break;if(!J.startsWith("+"))throw new $f(`Invalid Add File line (missing '+'): ${J}`);$.push(J.substring(1))}this.patch.actions[f]={type:"add",newFile:$.join(`
84
+ `),chunks:[]}}}function n3(f,$){let W=f.length>$.length?f:$,J=f.length>$.length?$:f;if(W.length===0)return 1;let H=UA(J,W);return(W.length-H)/W.length}function UA(f,$){let W=$.length+1,J=f.length+1,H=Array(W*J).fill(0),Q=(P,j)=>H[P*J+j]??0,Z=(P,j,R)=>{H[P*J+j]=R};for(let P=0;P<=$.length;P++)Z(P,0,P);for(let P=0;P<=f.length;P++)Z(0,P,P);for(let P=1;P<=$.length;P++)for(let j=1;j<=f.length;j++)if($[P-1]===f[j-1])Z(P,j,Q(P-1,j-1));else Z(P,j,1+Math.min(Q(P-1,j-1),Q(P,j-1),Q(P-1,j)));return Q($.length,f.length)}function MA(f,$,W,J){if($.length===0)return[W,0,1];let H=0,Q=(Z)=>{let P=Lf($.join(`
85
+ `));for(let R=Z;R<f.length;R++){let X=Lf(f.slice(R,R+$.length).join(`
86
+ `));if(X===P)return[R,0,1];let A=n3(X,P);if(A>H)H=A}for(let R=Z;R<f.length;R++){let X=Lf(f.slice(R,R+$.length).map((V)=>V.trimEnd()).join(`
87
+ `)),A=Lf($.map((V)=>V.trimEnd()).join(`
88
+ `));if(X===A)return[R,1,1]}for(let R=Z;R<f.length;R++){let X=Lf(f.slice(R,R+$.length).map((V)=>V.trim()).join(`
89
+ `)),A=Lf($.map((V)=>V.trim()).join(`
90
+ `));if(X===A)return[R,100,1]}let j=0.66;for(let R=Z;R<f.length;R++){let X=Lf(f.slice(R,R+$.length).join(`
91
+ `)),A=n3(X,P);if(A>=j)return[R,1000,A];if(A>H)H=A}return[-1,0,H]};if(J){let[Z,P,j]=Q(f.length-$.length);if(Z!==-1)return[Z,P,j];return[Z,P,j]=Q(W),[Z,P+1e4,j]}return Q(W)}function GA(f,$){let W=$,J=[],H=[],Q=[],Z=[],P="keep",j=["@@",g.END,g.UPDATE,g.DELETE,g.ADD,g.END_FILE];while(W<f.length){let R=f[W];if(!R||j.some((V)=>R.startsWith(V.trim())))break;if(R==="***")break;if(R.startsWith("***"))throw new $f(`Invalid line: ${R}`);W++;let X=P,A=R;if(A[0]==="+")P="add";else if(A[0]==="-")P="delete";else if(A[0]===" ")P="keep";else P="keep",A=` ${A}`;if(A=A.slice(1),P==="keep"&&X!==P){if(Q.length||H.length)Z.push({origIndex:J.length-H.length,delLines:H,insLines:Q});H=[],Q=[]}if(P==="delete")H.push(A),J.push(A);else if(P==="add")Q.push(A);else J.push(A)}if(Q.length||H.length)Z.push({origIndex:J.length-H.length,delLines:H,insLines:Q});if(W<f.length&&f[W]===g.END_FILE)return W++,[J,Z,W,!0];return[J,Z,W,!1]}function DJ(f,$,W){let J=Cf.isAbsolute($),H=J?Cf.normalize($):Cf.resolve(f,$);if(!W||J)return H;let Q=Cf.relative(f,H);if(Q.startsWith("..")||Cf.isAbsolute(Q))throw new $f(`Path must stay within cwd: ${$}`);return H}function DA(f){return f.split(`
92
+ `).map(($)=>$.replace(/\r$/,""))}function t3(f){if(f.trim()==="")return!1;return a3.some(($)=>f.startsWith($))}function _A(f){let $=0,W=f.length;while($<W&&t3(f[$]??""))$++;while(W>$&&t3(f[W-1]??""))W--;return f.slice($,W)}function LA(f){let $=DA(f),W=$.findIndex((Z)=>Z.startsWith(g.BEGIN)),J=-1;for(let Z=$.length-1;Z>=0;Z--)if($[Z]?.startsWith(g.END)){J=Z;break}if(W!==-1||J!==-1){if(W===-1||J===-1||J<W)throw new $f("Invalid patch text - incomplete sentinels. Try breaking it into smaller patches.");return{lines:$.slice(W,J+1)}}let H=_A($);while(H.length>0&&H[0]==="")H.shift();while(H.length>0&&H[H.length-1]==="")H.pop();return{lines:[g.BEGIN,...H,g.END]}}function OA(f,$){let W=new Set;for(let J of f)for(let H of $)if(J.startsWith(H)){W.add(J.substring(H.length).trim());break}return[...W]}function CA(f,$,W){if($.length===0)return f;let J=f.split(`
93
+ `),H=[],Q=0;for(let Z of $){if(Z.origIndex>J.length)throw new $f(`${W}: chunk.origIndex ${Z.origIndex} > lines.length ${J.length}`);if(Q>Z.origIndex)throw new $f(`${W}: currentIndex ${Q} > chunk.origIndex ${Z.origIndex}`);H.push(...J.slice(Q,Z.origIndex)),H.push(...Z.insLines),Q=Z.origIndex+Z.delLines.length}return H.push(...J.slice(Q)),H.join(`
94
+ `)}async function zA(f,$,W,J){let H=OA(f,[g.UPDATE,g.DELETE]),Q={};for(let Z of H){let P=DJ($,Z,J),j;try{j=await Of.readFile(P,W)}catch{throw new $f(`File not found: ${Z}`)}Q[Z]=j.replace(/\r\n/g,`
95
+ `)}return Q}function NA(f,$){let W={};for(let[J,H]of Object.entries(f.actions))switch(H.type){case"delete":W[J]={type:"delete",oldContent:$[J]};break;case"add":if(H.newFile===void 0)throw new $f("ADD action without file content");W[J]={type:"add",newContent:H.newFile};break;case"update":W[J]={type:"update",oldContent:$[J],newContent:CA($[J]??"",H.chunks,J),movePath:H.movePath};break}return W}async function bA(f,$,W,J){let H=[];for(let[Q,Z]of Object.entries(f)){let P=DJ($,Q,J);switch(Z.type){case"delete":await Of.rm(P,{force:!0}),H.push(`${Q}: [deleted]`);break;case"add":if(Z.newContent===void 0)throw new $f(`Cannot create ${Q} with no content`);await Of.mkdir(Cf.dirname(P),{recursive:!0}),await Of.writeFile(P,Z.newContent,{encoding:W}),H.push(Q);break;case"update":{if(Z.newContent===void 0)throw new $f(`UPDATE change for ${Q} has no new content`);if(Z.movePath){let j=DJ($,Z.movePath,J);await Of.mkdir(Cf.dirname(j),{recursive:!0}),await Of.writeFile(j,Z.newContent,{encoding:W}),await Of.rm(P,{force:!0}),H.push(`${Q} -> ${Z.movePath}`)}else await Of.writeFile(P,Z.newContent,{encoding:W}),H.push(Q);break}}}return H}function N2(f={}){let{encoding:$="utf-8",restrictToCwd:W=!0}=f;return async(J,H,Q)=>{let Z=LA(J.input),P=await zA(Z.lines,H,$,W),j=new GJ(Z.lines,P),{patch:R,fuzz:X}=j.parse(),A=NA(R,P),V=await bA(A,H,$,W),B=["Successfully applied patch to the following files:"];for(let T of V)B.push(T);if(X>0)B.push(`Note: Patch applied with fuzz factor ${X}`);if(R.warnings&&R.warnings.length>0)for(let T of R.warnings)B.push(`Warning (${T.path}): ${T.message}`);return B.join(`
96
+ `)}}import{spawn as s3}from"node:child_process";import{getDefaultShell as qA,getShellArgs as wA}from"@clinebot/shared";function EA(f,$,W,J,H){return new Promise((Q,Z)=>{let P=process.platform==="win32",j=s3(f.executable,f.args,{cwd:f.cwd,env:{...process.env,...f.env},stdio:["pipe","pipe","pipe"],detached:!P}),R=j.pid,X="",A="",V=0,B=!1,T=!1,h=(K)=>{if(T)return;T=!0,K()},F=()=>{if(!R)return;if(P){s3("taskkill",["/pid",String(R),"/T","/F"],{stdio:"ignore",shell:!0,windowsHide:!0}).unref();return}try{process.kill(-R,"SIGKILL")}catch{j.kill("SIGKILL")}},Y=(K)=>{B=!0,F(),h(()=>Z(K))},y=setTimeout(()=>Y(Error(`Command timed out after ${W}ms`)),W),D=()=>Y(Error("Command was aborted"));if($.signal)$.signal.addEventListener("abort",D);let U=()=>{clearTimeout(y),$.signal?.removeEventListener("abort",D)};j.stdout?.on("data",(K)=>{if(V+=K.length,V<=J)X+=K.toString()}),j.stderr?.on("data",(K)=>{if(V+=K.length,V<=J)A+=K.toString()}),j.on("close",(K)=>{if(U(),B)return;let M=H?X+(A?`
97
+ [stderr]
98
+ ${A}`:""):X;if(V>J)M+=`
99
+
100
+ [Output truncated: ${V} bytes total, showing first ${J} bytes]`;if(K!==0)h(()=>Z(Error(A||`Command exited with code ${K}`)));else h(()=>Q(M))}),j.on("error",(K)=>{U(),h(()=>Z(Error(`Failed to execute command: ${K.message}`)))})})}function b2(f={}){let{shell:$=qA(process.platform),timeoutMs:W=30000,maxOutputBytes:J=1e6,env:H={},combineOutput:Q=!0}=f;return(Z,P,j)=>{let R=typeof Z!=="string";return EA({executable:R?Z.command:$,args:R?Z.args??[]:wA($,Z),cwd:P,env:H},j,W,J,Q)}}import*as df from"node:fs/promises";import*as cf from"node:path";function SA(f,$,W){let J=cf.isAbsolute($),H=J?cf.normalize($):cf.resolve(f,$);if(!W)return H;if(J)return H;let Q=cf.relative(f,H);if(Q.startsWith("..")||cf.isAbsolute(Q))throw Error(`Path must stay within cwd: ${$}`);return H}function kA(f,$){if($.length===0)return 0;return f.split($).length-1}function mA(f,$,W){let J=f.split(`
101
+ `),H=$.split(`
102
+ `),Q=Math.max(J.length,H.length),Z=["```diff"],P=0;for(let j=0;j<Q;j++){if(P>=W){Z.push("... diff truncated ...");break}let R=J[j],X=H[j];if(R===X)continue;let A=j+1;if(R!==void 0)Z.push(`-${A}: ${R}`),P++;if(X!==void 0&&P<W)Z.push(`+${A}: ${X}`),P++}return Z.push("```"),Z.join(`
103
+ `)}async function gA(f,$,W){return await df.mkdir(cf.dirname(f),{recursive:!0}),await df.writeFile(f,$,{encoding:W}),`File created successfully at: ${f}`}async function xA(f){try{return await df.access(f),!0}catch{return!1}}async function IA(f,$,W,J,H){let Q=await df.readFile(f,J),Z=kA(Q,$);if(Z===0)throw Error(`No replacement performed: text not found in ${f}.`);if(Z>1)throw Error(`No replacement performed: multiple occurrences of text found in ${f}.`);let P=Q.replace($,W??"");await df.writeFile(f,P,{encoding:J});let j=mA(Q,P,H);return`Edited ${f}
104
+ ${j}`}async function vA(f,$,W,J){let Q=(await df.readFile(f,J)).split(`
105
+ `),Z=Q.length+1;if($<1||$>Z)throw Error(`Invalid insert_line: ${$}. insert_line must be a positive one-based boundary line in the range 1-${Z}. Use ${Z} to append at EOF.`);let P=$-1;return Q.splice(P,0,...W.split(`
106
+ `)),await df.writeFile(f,Q.join(`
107
+ `),{encoding:J}),`Inserted content at line ${$} in ${f}.`}function q2(f={}){let{encoding:$="utf-8",restrictToCwd:W=!0,maxDiffLines:J=200}=f;return async(H,Q,Z)=>{let P=SA(Q,H.path,W);if(H.insert_line!=null)return vA(P,H.insert_line,H.new_text,$);if(!await xA(P))return gA(P,H.new_text,$);if(H.old_text==null)throw Error("Parameter `old_text` is required when editing an existing file without `insert_line`");return IA(P,H.old_text,H.new_text,$,J)}}import*as w2 from"node:fs/promises";import*as k0 from"node:path";var uA=new Map([[".gif","image/gif"],[".png","image/png"],[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".webp","image/webp"]]),cA={maxFileSizeBytes:1e7,encoding:"utf-8",includeLineNumbers:!0};function E2(f={}){let{maxFileSizeBytes:$,encoding:W,includeLineNumbers:J}={...cA,...f};return async(H,Q)=>{let{path:Z,start_line:P,end_line:j}=H,R=k0.isAbsolute(Z)?k0.normalize(Z):k0.resolve(process.cwd(),Z),X=k0.extname(R).toLowerCase(),A=uA.get(X),V=await w2.stat(R);if(!V.isFile())throw Error(`Path is not a file: ${R}`);if(V.size>$)throw Error(`File too large: ${V.size} bytes (max: ${$} bytes). Consider reading specific sections or using a different approach.`);if(A){if(Q.metadata?.modelSupportsImages!==!0)throw Error("Current model does not support image input");let y=await w2.readFile(R);return[{type:"text",text:"Successfully read image"},{type:"image",data:y.toString("base64"),mediaType:A}]}let T=(await w2.readFile(R,W)).split(`
108
+ `),h=Math.max((P??1)-1,0),F=Math.min(j??T.length,T.length),Y=T.slice(h,F);if(J){let y=String(T.length).length;return Y.map((D,U)=>`${String(h+U+1).padStart(y," ")} | ${D}`).join(`
109
+ `)}return Y.join(`
110
+ `)}}import{spawn as H7}from"node:child_process";import*as Q7 from"node:fs/promises";import*as C8 from"node:path";var J7={};z(J7,{prewarmFileIndex:()=>O8,getFileIndex:()=>A0,enrichPromptWithMentions:()=>H1});import{spawn as dA}from"node:child_process";import{readdir as rA}from"node:fs/promises";import LJ from"node:path";import{isMainThread as f7,parentPort as o3,Worker as lA}from"node:worker_threads";var pA=15000,iA=600000,nA=1000,aA=new Set([".git","node_modules","dist","build",".next","coverage",".turbo",".cache","target","out"]);function e3(f){let $=f&&typeof f==="object"&&"code"in f?String(f.code??""):"";return $==="EACCES"||$==="EPERM"||$==="ENOENT"}var J1=new Map;function tA(f){if(J1.size<=1)return;for(let[$,W]of J1.entries()){if(W.pending)continue;if(f-W.lastAccessedAt>iA)J1.delete($)}}function sA(f,$){return LJ.relative(f,$).split(LJ.sep).join("/")}async function oA(f){let W=(await new Promise((J,H)=>{let Q=dA("rg",["--files","--hidden","-g","!.git"],{cwd:f,stdio:["ignore","pipe","pipe"]}),Z="",P="";Q.stdout.on("data",(j)=>{Z+=j.toString()}),Q.stderr.on("data",(j)=>{P+=j.toString()}),Q.on("error",H),Q.on("close",(j)=>{if(j===0){J(Z);return}H(Error(P||`rg exited with code ${j}`))})})).split(/\r?\n/).map((J)=>J.trim()).filter((J)=>J.length>0).map((J)=>J.replace(/\\/g,"/"));return new Set(W)}async function $7(f,$,W){let J;try{J=await rA($,{withFileTypes:!0})}catch(H){if(e3(H))return;throw H}for(let H of J){let Q=LJ.join($,H.name);if(H.isDirectory()){if(aA.has(H.name))continue;try{await $7(f,Q,W)}catch(Z){if(e3(Z))continue;throw Z}continue}if(H.isFile())W.add(sA(f,Q))}}async function eA(f){let $=new Set;return await $7(f,f,$),$}async function OJ(f){try{return await oA(f)}catch{return eA(f)}}function fV(){if(f7||!o3)return;let f=o3;f.on("message",($)=>{if($.type!=="index")return;OJ($.cwd).then((W)=>{let J={type:"indexResult",requestId:$.requestId,files:Array.from(W)};f.postMessage(J)}).catch((W)=>{let J={type:"indexResult",requestId:$.requestId,error:W instanceof Error?W.message:"Failed to build file index"};f.postMessage(J)})})}class W7{worker=new lA(new URL(import.meta.url));nextRequestId=0;pending=new Map;constructor(){this.worker.unref(),this.worker.on("message",(f)=>{if(f.type!=="indexResult")return;let $=this.pending.get(f.requestId);if(!$)return;if(this.pending.delete(f.requestId),f.error){$.reject(Error(f.error));return}$.resolve(f.files??[])}),this.worker.on("error",(f)=>{this.flushPending(f)}),this.worker.on("exit",(f)=>{if(f!==0)this.flushPending(Error(`File index worker exited with code ${f}`))})}requestIndex(f){let $=++this.nextRequestId,W=new Promise((H,Q)=>{let Z=setTimeout(()=>{this.pending.delete($),Q(Error("Timed out waiting for file index worker response"))},nA);Z.unref(),this.pending.set($,{resolve:(P)=>{clearTimeout(Z),H(P)},reject:(P)=>{clearTimeout(Z),Q(P)}})}),J={type:"index",requestId:$,cwd:f};return this.worker.postMessage(J),W}flushPending(f){for(let[$,W]of this.pending.entries())W.reject(f),this.pending.delete($)}}fV();var _J;function $V(){if(!f7)return null;if(_J===void 0)_J=new W7;return _J}async function WV(f){let $=$V();if(!$)return OJ(f);try{let W=await $.requestIndex(f);return new Set(W)}catch{return OJ(f)}}async function A0(f,$={}){let W=$.ttlMs??pA,J=Date.now();tA(J);let H=J1.get(f);if(H&&W>0&&J-H.lastBuiltAt<=W&&H.files.size>0)return H.lastAccessedAt=J,H.files;if(H?.pending)return H.lastAccessedAt=J,H.pending;let Q=WV(f).then((Z)=>{return J1.set(f,{files:Z,lastBuiltAt:Date.now(),lastAccessedAt:Date.now(),pending:null}),Z});return J1.set(f,{files:H?.files??new Set,lastBuiltAt:H?.lastBuiltAt??0,lastAccessedAt:J,pending:Q}),Q}async function O8(f,$={}){await A0(f,{...$,ttlMs:0})}import{stat as JV}from"node:fs/promises";import V$ from"node:path";var HV=/[),.:;!?`'"]+$/,QV=/^[(`'"]+/;function ZV(f){let $=f.matchAll(/(^|[\s])@([^\s]+)/g),W=[];for(let J of $){let H=(J[2]??"").trim();if(H.length===0)continue;let Q=H.replace(QV,"").replace(HV,"");if(Q.length===0||Q.includes("@"))continue;W.push(Q)}return Array.from(new Set(W))}function PV(f,$){let W=f.replace(/\\/g,"/"),J=V$.isAbsolute(W)?V$.resolve(W):V$.resolve($,W),H=V$.relative($,J);if(H.startsWith("..")||V$.isAbsolute(H))return;return H.split(V$.sep).join("/")}async function H1(f,$,W={}){let J=ZV(f);if(J.length===0)return{prompt:f,mentions:[],matchedFiles:[],ignoredMentions:[]};let{maxFiles:H,maxFileBytes:Q,maxTotalBytes:Z}=W,P=await A0($,{ttlMs:W.ttlMs}),j=[],R=[],X=[],A=0;for(let V of J){if(H&&X.length>=H){R.push(V);continue}let B=PV(V,$);if(!B||!P.has(B)){R.push(V);continue}if(!Q||!Z){j.push(B);continue}let T=V$.join($,B);try{if(!(await JV(T)).isFile()){R.push(V);continue}let F=A+Q;if(F>Z){R.push(V);continue}A=F,j.push(B)}catch{R.push(V)}}return{prompt:f,mentions:J,matchedFiles:j,ignoredMentions:R}}var jV=["ts","tsx","js","jsx","mjs","cjs","json","md","mdx","txt","yaml","yml","toml","py","rb","go","rs","java","kt","swift","c","cpp","h","hpp","css","scss","less","html","vue","svelte","sql","sh","bash","zsh","fish","ps1","env","gitignore","dockerignore","editorconfig"],RV=["node_modules",".git","dist","build",".next","coverage","__pycache__",".venv","venv",".cache",".turbo",".output","out","target","bin","obj"],B$=null;function XV(){if(B$!==null)return Promise.resolve(B$);return new Promise((f)=>{let $=H7("rg",["--version"],{stdio:["ignore","pipe","pipe"]});$.on("close",(W)=>{B$=W===0,f(B$)}),$.on("error",()=>{B$=!1,f(!1)}),setTimeout(()=>{if(!$.killed)$.kill("SIGTERM");if(B$===null)B$=!1,f(!1)},1000)})}function AV(f,$,W,J,H=5000,Q){return new Promise((Z)=>{let P=H7("rg",["--json",`--context=${J}`,"--max-count=1","-i",f],{cwd:$,stdio:["ignore","pipe","pipe"]}),j="",R=!1,X=()=>{if(!P.killed)P.kill("SIGTERM")},A=setTimeout(()=>{if(!R)R=!0,X(),Z(null)},H),V=(B)=>{if(!R)R=!0,clearTimeout(A),X(),Z(B)};if(Q?.aborted){X(),Z(null);return}Q?.addEventListener("abort",()=>{V(null)}),P.stdout.on("data",(B)=>{j+=B.toString()}),P.stderr.on("data",()=>{}),P.on("close",(B)=>{if(B===0||B===1){try{let T=[],h=j.split(`
111
+ `).filter((F)=>F.trim());for(let F of h){if(T.length>=W)break;let Y=JSON.parse(F);if(Y.type==="match"){let y=Y.data,D=[];if(Y.data.submatches&&Y.data.submatches.length>0){let U=Y.data.submatches[0];T.push({file:y.path.text,line:y.line_number,column:(U?.start??0)+1,match:U?.match?.text??"",context:D})}}else if(Y.type==="context"&&T.length>0){let y=T[T.length-1],D=Y.data.line_number===y.line?">":" ";y.context.push(`${D} ${Y.data.line_number}: ${Y.data.lines?.text??Y.data.line?.text??""}`)}}V(T.length>0?T:null)}catch{V(null)}return}V(null)}),P.on("error",()=>{V(null)})})}function VV(f,$,W,J){let H=f.split("/"),Q=H[H.length-1]??"";if(H.length-1>J)return!1;for(let j=0;j<H.length-1;j++)if($.has(H[j]??""))return!1;let P=C8.posix.extname(Q).slice(1).toLowerCase();return W.has(P)||!P&&!Q.startsWith(".")}function S2(f={}){let{includeExtensions:$=jV,excludeDirs:W=RV,maxResults:J=100,contextLines:H=2,maxDepth:Q=20}=f,Z=new Set(W),P=new Set($.map((j)=>j.toLowerCase()));return async(j,R,X)=>{if(X.signal?.aborted)throw Error("Search operation aborted");let A=await XV(),V=null;if(A)V=await AV(j,R,J,H,5000,X.signal);if(V){let y=[`Found ${V.length} result${V.length===1?"":"s"} for pattern: ${j}`,""];for(let D of V)y.push(`${D.file}:${D.line}:${D.column}`),y.push(...D.context),y.push("");if(V.length>=J)y.push(`(Showing first ${J} results. Refine your search for more specific results.)`);return y.join(`
112
+ `)}let B;try{B=new RegExp(j,"gim")}catch(y){throw Error(`Invalid regex pattern: ${j}. ${y instanceof Error?y.message:""}`)}let T=[],h=0,F=await A0(R);for(let y of F){if(X.signal?.aborted)throw Error("Search operation aborted");if(!VV(y,Z,P,Q))continue;if(T.length>=J)break;h++;let D=C8.join(R,y);try{let K=(await Q7.readFile(D,"utf-8")).split(`
113
+ `);for(let M=0;M<K.length;M++){let O=K[M];B.lastIndex=0;let u=B.exec(O);while(u!==null){if(T.length>=J)break;let vf=Math.max(0,M-H),a=Math.min(K.length-1,M+H),c=[];for(let d=vf;d<=a;d++){let e=d===M?">":" ";c.push(`${e} ${d+1}: ${K[d]}`)}if(T.push({file:y,line:M+1,column:u.index+1,match:u[0],context:c}),u.index===B.lastIndex)B.lastIndex++;u=B.exec(O)}}}catch{}}if(T.length===0)return`No results found for pattern: ${j}
114
+ Searched ${h} files.`;let Y=[`Found ${T.length} result${T.length===1?"":"s"} for pattern: ${j}`,`Searched ${h} files.`,""];for(let y of T)Y.push(`${y.file}:${y.line}:${y.column}`),Y.push(...y.context),Y.push("");if(T.length>=J)Y.push(`(Showing first ${J} results. Refine your search for more specific results.)`);return Y.join(`
115
+ `)}}function BV(f){return f.replace(/<script[^>]*>[\s\S]*?<\/script>/gi,"").replace(/<style[^>]*>[\s\S]*?<\/style>/gi,"").replace(/<!--[\s\S]*?-->/g,"").replace(/<(p|div|br|hr|h[1-6]|li|tr)[^>]*>/gi,`
116
+ `).replace(/<[^>]+>/g," ").replace(/&nbsp;/g," ").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#(\d+);/g,($,W)=>String.fromCharCode(parseInt(W,10))).replace(/\s+/g," ").replace(/\n\s+/g,`
117
+ `).replace(/\n{3,}/g,`
118
+
119
+ `).trim()}function k2(f={}){let{timeoutMs:$=30000,maxResponseBytes:W=5000000,userAgent:J="Mozilla/5.0 (compatible; AgentBot/1.0)",headers:H={},followRedirects:Q=!0}=f;return async(Z,P,j)=>{let R;try{R=new URL(Z)}catch{throw Error(`Invalid URL: ${Z}`)}if(!["http:","https:"].includes(R.protocol))throw Error(`Invalid protocol: ${R.protocol}. Only http and https are supported.`);let X=new AbortController,A=setTimeout(()=>X.abort(),$),V;if(j.signal)V=()=>X.abort(),j.signal.addEventListener("abort",V);try{let B=await fetch(Z,{method:"GET",headers:{"User-Agent":J,Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.7","Accept-Language":"en-US,en;q=0.9",...H},redirect:Q?"follow":"manual",signal:X.signal});if(clearTimeout(A),!Q&&B.status>=300&&B.status<400)return`Redirect to: ${B.headers.get("location")}`;if(!B.ok)throw Error(`HTTP ${B.status}: ${B.statusText}`);let T=B.headers.get("content-type")||"",h=B.body?.getReader();if(!h)throw Error("Failed to read response body");let F=[],Y=0;while(!0){let{done:O,value:u}=await h.read();if(O)break;if(Y+=u.length,Y>W)throw h.cancel(),Error(`Response too large: exceeded ${W} bytes`);F.push(u)}let y=new Uint8Array(Y),D=0;for(let O of F)y.set(O,D),D+=O.length;let U=new TextDecoder("utf-8").decode(y),K;if(T.includes("text/html")||T.includes("application/xhtml"))K=BV(U);else if(T.includes("application/json"))try{let O=JSON.parse(U);K=JSON.stringify(O,null,2)}catch{K=U}else K=U;let M=[`URL: ${Z}`,`Content-Type: ${T}`,`Size: ${Y} bytes`,"","--- Content ---",K.slice(0,50000)];if(K.length>50000)M.push(`
120
+ [Content truncated: showing first 50000 of ${K.length} characters]`);return M.push("","--- Analysis Request ---",`Prompt: ${P}`),M.join(`
121
+ `)}catch(B){if(clearTimeout(A),B instanceof Error){if(B.name==="AbortError")throw Error(`Request timed out after ${$}ms`);throw B}throw Error(`Fetch failed: ${String(B)}`)}finally{if(j.signal&&V)j.signal.removeEventListener("abort",V)}}}function Q1(f={}){return{readFile:E2(f.fileRead),search:S2(f.search),bash:b2(f.bash),webFetch:k2(f.webFetch),applyPatch:N2(f.applyPatch),editor:q2(f.editor)}}var TV={read_files:"enableReadFiles",search_codebase:"enableSearch",run_commands:"enableBash",fetch_web_content:"enableWebFetch",apply_patch:"enableApplyPatch",editor:"enableEditor",skills:"enableSkills",ask_question:"enableAskQuestion",submit_and_exit:"enableSubmitAndExit"},Z1=[{name:"openai-native-use-apply-patch",mode:"act",providerIdIncludes:["openai-native"],enableTools:["apply_patch"],disableTools:["editor"]},{name:"codex-and-gpt-use-apply-patch",mode:"act",modelIdIncludes:["codex","gpt"],enableTools:["apply_patch"],disableTools:["editor"]}];function Z7(f,$){if(!$||$.length===0)return!0;let W=f.toLowerCase();return $.some((J)=>W.includes(J.toLowerCase()))}function YV(f,$,W,J){if(f.mode&&f.mode!=="any"&&f.mode!==J)return!1;return Z7($,f.providerIdIncludes)&&Z7(W,f.modelIdIncludes)}function P1(f,$,W,J){if(!J||J.length===0)return{};let H=new Map;for(let Z of J){if(!YV(Z,f,$,W))continue;for(let P of Z.disableTools??[])H.set(P,!1);for(let P of Z.enableTools??[])H.set(P,!0)}let Q={};for(let[Z,P]of H.entries())Q[TV[Z]]=P;return Q}var zf={act:{enableReadFiles:!0,enableSearch:!0,enableBash:!0,enableWebFetch:!0,enableApplyPatch:!1,enableEditor:!0,enableSkills:!0,enableAskQuestion:!0,enableSubmitAndExit:!1,enableSpawnAgent:!0,enableAgentTeams:!0},plan:{enableReadFiles:!0,enableSearch:!0,enableBash:!0,enableWebFetch:!0,enableApplyPatch:!1,enableEditor:!1,enableSkills:!0,enableAskQuestion:!0,enableSubmitAndExit:!1,enableSpawnAgent:!0,enableAgentTeams:!0},search:{enableReadFiles:!0,enableSearch:!0,enableBash:!1,enableWebFetch:!1,enableApplyPatch:!1,enableEditor:!1,enableSkills:!1,enableAskQuestion:!1,enableSubmitAndExit:!1,enableSpawnAgent:!0,enableAgentTeams:!0},minimal:{enableReadFiles:!1,enableSearch:!1,enableBash:!0,enableWebFetch:!1,enableApplyPatch:!1,enableEditor:!1,enableSkills:!1,enableAskQuestion:!1,enableSubmitAndExit:!1,enableSpawnAgent:!0,enableAgentTeams:!1},yolo:{enableReadFiles:!0,enableSearch:!0,enableBash:!0,enableWebFetch:!0,enableApplyPatch:!1,enableEditor:!0,enableSkills:!0,enableAskQuestion:!1,enableSubmitAndExit:!0,enableSpawnAgent:!1,enableAgentTeams:!1}};function V0(f){if(f.mode==="plan")return"plan";if(f.mode==="yolo")return"yolo";return"act"}function z8(f){if(f!=="yolo")return{};let $={enabled:!0,autoApprove:!0},W={"*":$};for(let J of N0)W[J]=$;return W}function N8(f,$){let W=zf[f],{enableSpawnAgent:J,enableAgentTeams:H,...Q}=W;return S0({...Q,...$})}import{createTool as PB,zodToJsonSchema as jB}from"@clinebot/shared";import{z as mJ}from"zod";import{createAgentRuntime as oV}from"@clinebot/agents";import{createContributionRegistry as eV}from"@clinebot/shared";import{createGateway as FV,MODEL_COLLECTIONS_BY_PROVIDER_ID as yV}from"@clinebot/llms";function CJ(f){let $=f.providerConfig;if($?.knownModels)return $.knownModels;if(f.knownModels)return f.knownModels;return yV[f.providerId]?.models??void 0}function P7(f,$){let W=f.providerConfig,J=W?.providerId===f.providerId?W:void 0,H={...J??{},providerId:f.providerId,modelId:f.modelId,apiKey:f.apiKey??J?.apiKey,baseUrl:f.baseUrl??J?.baseUrl,headers:f.headers??J?.headers,knownModels:CJ(f),maxOutputTokens:f.maxTokensPerTurn,reasoningEffort:f.reasoningEffort,thinkingBudgetTokens:f.thinkingBudgetTokens,thinking:f.thinking,logger:$,extensionContext:f.extensionContext};return FV({providerConfigs:[{providerId:H.providerId,apiKey:H.apiKey,baseUrl:H.baseUrl,headers:H.headers,models:H.knownModels?Object.entries(H.knownModels).map(([Q,Z])=>({id:Q,name:Z.name??Q,description:Z.description,contextWindow:Z.contextWindow,maxOutputTokens:Z.maxTokens})):void 0}],logger:$}).createAgentModel({providerId:H.providerId,modelId:H.modelId},{maxTokens:H.maxOutputTokens})}import{normalizeUserInput as j7}from"@clinebot/shared";var hV=50000,KV=6000000,R7=8000,UV=new Set(["read","read_files","search","search_codebase","bash","run_commands"]),MV=new Set(["read","read_files"]),T$="[outdated - see the latest file content]",GV=(f)=>`
122
+
123
+ ...[truncated ${f} chars]...
124
+
125
+ `,DV=(f)=>`
126
+
127
+ ...[truncated ${f} chars to fit provider request budget]...
128
+
129
+ `;class NJ{maxToolResultChars;targetToolNames;maxTotalTextBytes;indexedMessageCount=0;indexedTailRef;toolNameByIdCache=new Map;readLocatorsByToolUseIdCache=new Map;latestReadToolUseByLocatorCache=new Map;latestFullContentOwnerByPathCache=new Map;readResultLocatorCache=new WeakMap;constructor(f=hV,$=UV,W=KV){this.maxToolResultChars=f;this.targetToolNames=$;this.maxTotalTextBytes=W}buildForApi(f){this.reindex(f);let $=f.map((W)=>{if(!Array.isArray(W.content)){if(W.role==="user"&&typeof W.content==="string"){let Q=j7(W.content);if(Q!==W.content)return{...W,content:Q}}return W}let J=!1,H=W.content.map((Q)=>{let Z=this.transformBlock(Q,W.role);if(Z!==Q)J=!0;return Z});return J?{...W,content:H}:W});return this.truncateToTotalTextBudget($)}transformBlock(f,$){if($==="user"&&f.type==="text"&&typeof f.text==="string"){let H=j7(f.text);if(H!==f.text)return{...f,text:H};return f}if(f.type==="file"){let H=this.truncateMiddle(f.content);return H===f.content?f:{...f,content:H}}if(f.type!=="tool_result")return f;let W=this.toolNameByIdCache.get(f.tool_use_id),J=f.content;if(this.isReadTool(W)){let H=this.getReadLocators(f);if(H.length>0){let Q=H.filter((Z)=>this.isOutdatedReadLocator(Z,f.tool_use_id));if(Q.length>0)J=this.replaceOutdatedReadContent(J,Q)}}if(this.shouldTruncateTool(W))J=this.truncateToolResultContent(J);return J===f.content?f:{...f,content:J}}reindex(f){let $=this.indexedMessageCount===0||f.length>=this.indexedMessageCount&&f[this.indexedMessageCount-1]===this.indexedTailRef;if(f.length<this.indexedMessageCount||!$)this.resetIndexes();for(let W=this.indexedMessageCount;W<f.length;W++){let J=f[W];if(!Array.isArray(J.content))continue;for(let H=0;H<J.content.length;H++){let Q=J.content[H];if(Q.type==="file")this.latestFullContentOwnerByPathCache.set(Q.path,`file:${W}:${H}`);else if(Q.type==="tool_use"){let Z=Q.name.toLowerCase();if(this.toolNameByIdCache.set(Q.id,Z),this.isReadTool(Z)){let P=this.extractLocatorsFromReadToolInput(Q.input);if(P.length>0)this.readLocatorsByToolUseIdCache.set(Q.id,P)}}else if(Q.type==="tool_result"){let Z=this.toolNameByIdCache.get(Q.tool_use_id);if(!this.isReadTool(Z))continue;let P=this.getReadLocators(Q);for(let j of P)if(this.latestReadToolUseByLocatorCache.set(this.toReadLocatorKey(j),Q.tool_use_id),this.isFullFileRead(j))this.latestFullContentOwnerByPathCache.set(j.path,Q.tool_use_id)}}}this.indexedMessageCount=f.length,this.indexedTailRef=f.length>0?f[f.length-1]:void 0}resetIndexes(){this.indexedMessageCount=0,this.indexedTailRef=void 0,this.toolNameByIdCache.clear(),this.readLocatorsByToolUseIdCache.clear(),this.latestReadToolUseByLocatorCache.clear(),this.latestFullContentOwnerByPathCache.clear(),this.readResultLocatorCache=new WeakMap}getReadLocators(f){let $=f,W=this.readResultLocatorCache.get($);if(W===void 0)W=this.extractReadLocatorsFromToolResultContent(f.content),this.readResultLocatorCache.set($,W);if(W.length>0)return W;return this.readLocatorsByToolUseIdCache.get(f.tool_use_id)??[]}extractLocatorsFromReadToolInput(f){if(!f||typeof f!=="object")return[];let $=f,W=[],J=this.extractLocatorFromReadRequest($);if(J)W.push(J);if(Array.isArray($.files))for(let H of $.files){let Q=this.extractLocatorFromReadRequest(H);if(Q)W.push(Q)}if(Array.isArray($.file_paths)){for(let H of $.file_paths)if(typeof H==="string"&&H.length>0)W.push({path:H,startLine:null,endLine:null})}return this.dedupeReadLocators(W)}extractReadLocatorsFromToolResultContent(f){if(typeof f==="string")return this.tryParseReadLocators(f);for(let $ of f){if($.type!=="text")continue;let W=this.tryParseReadLocators($.text);if(W.length>0)return W}return[]}tryParseReadLocators(f){try{return this.extractLocatorsFromParsedReadResult(JSON.parse(f))}catch{return[]}}extractLocatorsFromParsedReadResult(f){if(Array.isArray(f)){let W=[];for(let J of f){let H=this.extractLocatorFromResultEntry(J);if(H)W.push(H)}return this.dedupeReadLocators(W)}let $=this.extractLocatorFromResultEntry(f);return $?[$]:[]}extractLocatorFromReadRequest(f){if(!f||typeof f!=="object")return;let $=f,W=this.extractPath($);if(!W)return;return{path:W,startLine:this.extractLineNumber($.start_line),endLine:this.extractLineNumber($.end_line)}}extractLocatorFromResultEntry(f){if(!f||typeof f!=="object")return;let $=f,W=this.extractPath($);if(W)return{path:W,startLine:this.extractLineNumber($.start_line),endLine:this.extractLineNumber($.end_line)};if(typeof $.query==="string"&&$.query.length>0)return this.parseReadQuery($.query);return}extractPath(f){let $=[f.path,f.file_path,f.filePath];for(let W of $)if(typeof W==="string"&&W.length>0)return W;return}extractLineNumber(f){return typeof f==="number"&&Number.isInteger(f)?f:null}parseReadQuery(f){let $=/^(.*):(\d+)-(EOF|\d+)$/.exec(f);if(!$)return{path:f,startLine:null,endLine:null};return{path:$[1],startLine:Number($[2]),endLine:$[3]==="EOF"?null:Number($[3])}}dedupeReadLocators(f){let $=new Map;for(let W of f)$.set(this.toReadLocatorKey(W),W);return Array.from($.values())}toReadLocatorKey(f){if(this.isFullFileRead(f))return f.path;return`${f.path}:${f.startLine??1}-${f.endLine??"EOF"}`}isFullFileRead(f){return f.startLine==null&&f.endLine==null}isOutdatedReadLocator(f,$){let W=this.latestFullContentOwnerByPathCache.get(f.path);if(W&&W!==$)return!0;return this.latestReadToolUseByLocatorCache.get(this.toReadLocatorKey(f))!==$}replaceOutdatedReadContent(f,$){let W=new Set($.map((Q)=>this.toReadLocatorKey(Q))),J=new Set($.map((Q)=>Q.path));if(typeof f==="string")return this.replaceOutdatedInString(f,W)??T$;let H=0;for(let Q of f)if(Q.type==="text")H+=this.countOutdatedImageEntries(Q.text,W);return f.map((Q)=>{if(Q.type==="file"){if(!J.has(Q.path))return Q;return{...Q,content:T$}}if(Q.type==="image"){if(H===0)return Q;return H-=1,{type:"text",text:T$}}if(Q.type!=="text")return Q;let Z=this.replaceOutdatedInString(Q.text,W);if(Z===null)return{...Q,text:T$};return Z===Q.text?Q:{...Q,text:Z}})}countOutdatedImageEntries(f,$){let W;try{W=JSON.parse(f)}catch{return 0}let J=Array.isArray(W)?W:[W],H=0;for(let Q of J){if(!Q||typeof Q!=="object")continue;let Z=Q,P=this.extractLocatorFromResultEntry(Z);if(!P)continue;if(!$.has(this.toReadLocatorKey(P)))continue;if(Z.result==="Successfully read image"||Z.content==="Successfully read image")H+=1}return H}replaceOutdatedInString(f,$){let W;try{W=JSON.parse(f)}catch{return null}let J=Array.isArray(W)?W.map((H)=>this.replaceOutdatedReadEntry(H,$)):this.replaceOutdatedReadEntry(W,$);return JSON.stringify(J)}replaceOutdatedReadEntry(f,$){if(!f||typeof f!=="object")return f;let W=this.extractLocatorFromResultEntry(f);if(!W||!$.has(this.toReadLocatorKey(W)))return f;let J={...f};if(typeof J.result==="string")J.result=T$;else if(typeof J.content==="string")J.content=T$;else J.result=T$;return J}isReadTool(f){return!!f&&MV.has(f)}shouldTruncateTool(f){return!!f&&this.targetToolNames.has(f)}truncateToolResultContent(f){if(typeof f==="string")return this.truncateMiddle(f);return f.map(($)=>{if($.type==="file"){let J=this.truncateMiddle($.content);return J===$.content?$:{...$,content:J}}if($.type!=="text")return $;let W=this.truncateMiddle($.text);return W===$.text?$:{...$,text:W}})}truncateMiddle(f){return zJ(f,this.maxToolResultChars,GV)}truncateToTotalTextBudget(f){if(this.maxTotalTextBytes<=0)return f;let $=this.countMessageTextBytes(f);if($<=this.maxTotalTextBytes)return f;let W=f.map((H)=>{if(!Array.isArray(H.content))return H;return{...H,content:H.content.map((Q)=>LV(Q))}}),J=this.collectTruncationCandidates(W);for(let H of J){if($<=this.maxTotalTextBytes)break;let Q=H.byteLength;if(Q<=R7)continue;let Z=$-this.maxTotalTextBytes,P=Math.max(R7,Q-Z),j=_V(H.get(),P,DV);H.set(j),$-=Q-yf(j)}return W}countMessageTextBytes(f){let $=0;for(let W of f){if(typeof W.content==="string"){$+=yf(W.content);continue}for(let J of W.content)if(J.type==="text")$+=yf(J.text);else if(J.type==="thinking")$+=yf(J.thinking);else if(J.type==="file")$+=yf(J.content);else if(J.type==="tool_result"){if(typeof J.content==="string")$+=yf(J.content);else for(let H of J.content)if(H.type==="text")$+=yf(H.text);else if(H.type==="file")$+=yf(H.content)}}return $}collectTruncationCandidates(f){let $=[];for(let W of f){if(!Array.isArray(W.content))continue;for(let J of W.content){if(J.type!=="tool_result")continue;let H=this.toolNameByIdCache.get(J.tool_use_id);if(!this.shouldTruncateTool(H))continue;if(typeof J.content==="string"){$.push({byteLength:yf(J.content),get:()=>J.content,set:(Q)=>{J.content=Q}});continue}for(let Q of J.content)if(Q.type==="text")$.push({byteLength:yf(Q.text),get:()=>Q.text,set:(Z)=>{Q.text=Z}});else if(Q.type==="file")$.push({byteLength:yf(Q.content),get:()=>Q.content,set:(Z)=>{Q.content=Z}})}}return $.sort((W,J)=>J.byteLength-W.byteLength)}}function yf(f){return Buffer.byteLength(f,"utf8")}function zJ(f,$,W){if(f.length<=$)return f;let J=W(f.length-$),H=Math.max(0,Math.floor(($-J.length)/2)),Q=Math.max(0,f.length-H*2),Z=W(Q),P=Math.max(0,Math.floor(($-Z.length)/2)),j=f.slice(0,P),R=P>0?f.slice(-P):"";return`${j}${Z}${R}`}function _V(f,$,W){if(yf(f)<=$)return f;let J=0,H=f.length,Q=zJ(f,0,W);while(J<=H){let Z=J+H>>>1,P=zJ(f,Z,W);if(yf(P)<=$)Q=P,J=Z+1;else H=Z-1}return Q}function LV(f){if(f.type!=="tool_result"||typeof f.content==="string")return{...f};return{...f,content:f.content.map(($)=>({...$}))}}function bJ(){return`conv_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}class qJ{messages=[];conversationId=bJ();sessionStarted=!1;constructor(f){if((f?.length??0)>0)this.restore(f??[])}getConversationId(){return this.conversationId}getMessages(){return[...this.messages]}appendMessage(f){this.messages.push(f)}appendMessages(f){if(f.length===0)return;this.messages.push(...f)}replaceMessages(f){this.messages=[...f]}resetForRun(){this.messages=[],this.conversationId=bJ(),this.sessionStarted=!1}clearHistory(){this.messages=[],this.conversationId=bJ(),this.sessionStarted=!1}restore(f){this.messages=[...f],this.sessionStarted=!1}isSessionStarted(){return this.sessionStarted}markSessionStarted(){this.sessionStarted=!0}}function OV(f){let $=zV(f.content),W=$.filter((Q)=>Q.type==="tool_result"),J=$.filter((Q)=>Q.type!=="tool_result"),H=[];if(J.length>0||W.length===0)H.push({id:f.id??A7(),role:f.role,content:J.map(NV),createdAt:f.ts??Date.now(),metadata:f.metadata,modelInfo:f.modelInfo,metrics:bV(f.metrics)});for(let Q of W)H.push({id:`${f.id??A7()}_tool_${Q.tool_use_id}`,role:"tool",content:[B7(Q)],createdAt:f.ts??Date.now(),metadata:f.metadata});return H}function b8(f){return f.flatMap(OV)}function CV(f){let $=f.content.map(T7).filter((W)=>W!==void 0);return{id:f.id,role:f.role==="tool"?"user":f.role,content:$,ts:f.createdAt,metadata:f.metadata,modelInfo:f.modelInfo,metrics:qV(f.metrics)}}function j1(f){return f.map(CV)}function V7(f){let $=[];for(let W of f){let J=W.content.map(T7).filter((Z)=>Z!==void 0),H=W.role==="tool"?"user":W.role,Q=$[$.length-1];if(H==="user"&&J.length>0&&J.every((Z)=>Z.type==="tool_result")&&Q?.role==="user"&&Array.isArray(Q.content)&&Q.content.every((Z)=>Z.type==="tool_result")){Q.content.push(...J);continue}$.push({role:H,content:J})}return $}function zV(f){if(typeof f==="string")return f.length>0?[{type:"text",text:f}]:[];return[...f]}function NV(f){switch(f.type){case"text":return{type:"text",text:f.text};case"thinking":return{type:"reasoning",text:f.thinking,metadata:f.signature?{signature:f.signature,details:f.details}:f.details?{details:f.details}:void 0};case"redacted_thinking":return{type:"reasoning",text:"",redacted:!0,metadata:{data:f.data}};case"image":return{type:"image",image:f.data,mediaType:f.mediaType};case"file":return{type:"file",path:f.path,content:f.content};case"tool_use":return{type:"tool-call",toolCallId:f.id,toolName:f.name,input:f.input,metadata:f.signature?{signature:f.signature}:void 0};case"tool_result":return B7(f)}}function B7(f){return{type:"tool-result",toolCallId:f.tool_use_id,toolName:"",output:f.content,isError:f.is_error}}function T7(f){switch(f.type){case"text":return{type:"text",text:f.text};case"reasoning":{if(f.redacted===!0)return{type:"redacted_thinking",data:f.metadata?.data??""};let $=f.metadata;return{type:"thinking",thinking:f.text,signature:$?.signature,details:$?.details}}case"image":return typeof f.image==="string"?{type:"image",data:f.image,mediaType:f.mediaType??"image/png"}:void 0;case"file":return{type:"file",path:f.path,content:f.content};case"tool-call":return{type:"tool_use",id:f.toolCallId,name:f.toolName,input:f.input??{},signature:f.metadata?.signature};case"tool-result":{let $=f.output,W=typeof $==="string"?$:Array.isArray($)?$:JSON.stringify($);return{type:"tool_result",tool_use_id:f.toolCallId,content:W,is_error:f.isError}}}}function bV(f){if(!f)return;return{inputTokens:f.inputTokens??0,outputTokens:f.outputTokens??0,cacheReadTokens:f.cacheReadTokens??0,cacheWriteTokens:f.cacheWriteTokens??0,cost:f.cost}}function qV(f){if(!f)return;return{inputTokens:f.inputTokens,outputTokens:f.outputTokens,cacheReadTokens:f.cacheReadTokens,cacheWriteTokens:f.cacheWriteTokens,cost:f.cost}}var X7=0;function A7(){return X7+=1,`msg_${Date.now().toString(36)}_${X7.toString(36)}`}function Y7(f){let{agentConfig:$}=f,W=wV($),J=EV($),H=f.hooks,Q=SV($.maxParallelToolCalls);return{sessionId:f.sessionId??$.sessionId,agentId:f.agentId,conversationId:f.conversationId,parentAgentId:f.parentAgentId,agentRole:f.agentRole,systemPrompt:f.systemPrompt??$.systemPrompt,messageModelInfo:J,model:f.model,modelOptions:W,tools:f.tools,hooks:H,prepareTurn:f.prepareTurn,plugins:f.plugins,logger:f.logger??$.logger,telemetry:f.telemetry??kV($.telemetry),initialMessages:f.initialMessages,completionPolicy:$.completionPolicy,maxIterations:$.maxIterations,toolExecution:Q,toolPolicies:$.toolPolicies,toolContextMetadata:f.toolContextMetadata,requestToolApproval:$.requestToolApproval}}function wV(f){let $={};if(f.thinking!==void 0)$.thinking=f.thinking;if(f.reasoningEffort!==void 0)$.reasoningEffort=f.reasoningEffort;if(f.thinkingBudgetTokens!==void 0)$.thinkingBudgetTokens=f.thinkingBudgetTokens;if(f.maxTokensPerTurn!==void 0)$.maxTokensPerTurn=f.maxTokensPerTurn;if(f.apiTimeoutMs!==void 0)$.apiTimeoutMs=f.apiTimeoutMs;return Object.keys($).length>0?$:void 0}function EV(f){let $=f.providerConfig?.family;return{id:f.modelId,provider:f.providerId,family:$}}function SV(f){if(f===void 0)return;return f>=2?"parallel":"sequential"}function kV(f){if(!f)return;return{capture:($,W)=>{f.capture({event:$,properties:W})}}}function mV(){return{lastToolName:"",lastToolSignature:"",consecutiveIdenticalCount:0}}function gV(f){f.lastToolName="",f.lastToolSignature="",f.consecutiveIdenticalCount=0}function wJ(f){if(f==null||typeof f!=="object")return f;if(Array.isArray(f))return f.map(wJ);let $={};for(let W of Object.keys(f).sort())$[W]=wJ(f[W]);return $}function xV(f){if(f==null)return"null";if(typeof f==="string")return f;if(typeof f!=="object")return String(f);try{return JSON.stringify(wJ(f))}catch{return String(f)}}function IV(f,$,W,J){if($===f.lastToolName&&W===f.lastToolSignature)f.consecutiveIdenticalCount++;else f.consecutiveIdenticalCount=1;return f.lastToolName=$,f.lastToolSignature=W,{softWarning:f.consecutiveIdenticalCount===J.softThreshold,hardEscalation:f.consecutiveIdenticalCount>=J.hardThreshold}}var F7={softThreshold:3,hardThreshold:5};class EJ{config;state=mV();constructor(f){this.config={softThreshold:f?.softThreshold??F7.softThreshold,hardThreshold:f?.hardThreshold??F7.hardThreshold}}inspect(f){let $=xV(f.input),W=IV(this.state,f.name,$,this.config);if(W.hardEscalation)return{kind:"hard",message:`Detected ${this.state.consecutiveIdenticalCount} consecutive identical calls to \`${f.name}\`; stopping to avoid a loop.`};if(W.softWarning)return{kind:"soft",message:`Detected ${this.state.consecutiveIdenticalCount} consecutive identical calls to \`${f.name}\`; consider trying a different approach.`};return{kind:"ok"}}reset(){gV(this.state)}}class SJ{consecutiveMistakes=0;options;constructor(f){this.options=f}async record(f){let $=this.options.maxConsecutiveMistakes,W=f.forceAtLimit&&$?$:this.consecutiveMistakes+1;this.consecutiveMistakes=W;let J=f.details?.trim()||`consecutive mistake (${f.reason})`;if(this.options.emit({type:"error",error:Error(J),recoverable:!0,iteration:f.iteration}),this.options.log("warn","Recorded consecutive mistake",{agentId:this.options.agentId,conversationId:this.options.getConversationId(),runId:this.options.getActiveRunId(),iteration:f.iteration,reason:f.reason,details:f.details,consecutiveMistakes:W,maxConsecutiveMistakes:this.options.maxConsecutiveMistakes}),!$||W<$)return{action:"continue"};let H=await uV({iteration:f.iteration,consecutiveMistakes:W,maxConsecutiveMistakes:$,reason:f.reason,details:f.details},this.options.onLimitReached);if(H.action==="continue"){let Q=H.guidance?.trim();if(Q)this.options.appendRecoveryNotice(Q,f.reason);return this.consecutiveMistakes=0,{action:"continue",guidance:Q}}return{action:"stop",reason:H.reason?.trim()||void 0,message:vV({iteration:f.iteration,consecutiveMistakes:W,maxConsecutiveMistakes:$,reason:f.reason,details:f.details,stopReason:H.reason})}}reset(){this.consecutiveMistakes=0}get value(){return this.consecutiveMistakes}}function vV(f){let $=[`Stopped after ${f.consecutiveMistakes}/${f.maxConsecutiveMistakes} consecutive mistakes (${f.reason}) at iteration ${f.iteration}.`],W=f.details?.trim();if(W)$.push(`Error: ${W}`);let J=f.stopReason?.trim();if(J)$.push(`Decision: ${J}`);return $.push("Session state was preserved. Send a new prompt to resume from the latest state."),$.join(" ")}async function uV(f,$){if(!$)return{action:"stop",reason:`maximum consecutive mistakes reached (${f.maxConsecutiveMistakes})`};try{return await $(f)}catch(W){return{action:"stop",reason:W instanceof Error?W.message:`maximum consecutive mistakes reached (${f.maxConsecutiveMistakes})`}}}function cV(f){let $=f.content.filter((W)=>W.type==="text");if($.length===0)return;return $.map((W)=>W.text).join("")}function dV(f){let $=f.content.filter((W)=>W.type==="reasoning");if($.length===0)return;return{reasoning:$.map((W)=>W.text).join(""),redacted:$.some((W)=>W.redacted===!0)}}function rV(f){return f.content.find(($)=>$.type==="tool-result")}function lV(f){switch(f){case"completed":return"completed";case"aborted":return"aborted";case"failed":return"error"}}function pV(f){if(!f||f.isError!==!0)return;if(typeof f.output==="string")return f.output;if(f.output instanceof Error)return f.output.message;try{return JSON.stringify(f.output)}catch{return String(f.output)}}class kJ{lastUsage={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0};toolStartedAt=new Map;translate(f){switch(f.type){case"run-started":return[];case"message-added":return[];case"turn-started":return[{type:"iteration_start",iteration:f.iteration}];case"turn-finished":return[{type:"iteration_end",iteration:f.iteration,hadToolCalls:f.toolCallCount>0,toolCallCount:f.toolCallCount}];case"assistant-text-delta":return[{type:"content_start",contentType:"text",text:f.text,accumulated:f.accumulatedText}];case"assistant-reasoning-delta":return[{type:"content_start",contentType:"reasoning",reasoning:f.text,redacted:f.redacted===!0}];case"assistant-message":return this.translateAssistantMessage(f.message);case"tool-started":return this.translateToolStarted(f);case"tool-updated":return[{type:"content_update",contentType:"tool",toolName:f.toolCall.toolName,toolCallId:f.toolCall.toolCallId,update:f.update}];case"tool-finished":return this.translateToolFinished(f);case"usage-updated":return this.translateUsage(f.usage);case"status-notice":return[{type:"notice",noticeType:"status",displayRole:"status",message:f.message,reason:f.metadata?.reason==="auto_compaction"?"auto_compaction":void 0,metadata:f.metadata}];case"run-finished":return this.translateRunFinished(f.result);case"run-failed":return[{type:"error",error:f.error,recoverable:!1,iteration:f.snapshot.iteration}];default:return f}}reset(){this.lastUsage={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0},this.toolStartedAt.clear()}translateAssistantMessage(f){let $=[],W=cV(f);if(W!==void 0)$.push({type:"content_end",contentType:"text",text:W});let J=dV(f);if(J!==void 0)$.push({type:"content_end",contentType:"reasoning",reasoning:J.reasoning});return $}translateToolStarted(f){return this.toolStartedAt.set(f.toolCall.toolCallId,Date.now()),[{type:"content_start",contentType:"tool",toolName:f.toolCall.toolName,toolCallId:f.toolCall.toolCallId,input:f.toolCall.input}]}translateToolFinished(f){let $=this.toolStartedAt.get(f.toolCall.toolCallId),W=$===void 0?void 0:Date.now()-$;this.toolStartedAt.delete(f.toolCall.toolCallId);let J=rV(f.message),H=J?.output,Q=pV(J);return[{type:"content_end",contentType:"tool",toolName:f.toolCall.toolName,toolCallId:f.toolCall.toolCallId,output:H,error:Q,durationMs:W}]}translateUsage(f){let $=f.inputTokens-this.lastUsage.inputTokens,W=f.outputTokens-this.lastUsage.outputTokens,J=f.cacheReadTokens-this.lastUsage.cacheReadTokens,H=f.cacheWriteTokens-this.lastUsage.cacheWriteTokens,Q=this.lastUsage.totalCost??0,P=(f.totalCost??0)-Q;return this.lastUsage={inputTokens:f.inputTokens,outputTokens:f.outputTokens,cacheReadTokens:f.cacheReadTokens,cacheWriteTokens:f.cacheWriteTokens,totalCost:f.totalCost},[{type:"usage",inputTokens:Math.max(0,$),outputTokens:Math.max(0,W),cacheReadTokens:J===0?void 0:Math.max(0,J),cacheWriteTokens:H===0?void 0:Math.max(0,H),cost:P===0?void 0:P,totalInputTokens:f.inputTokens,totalOutputTokens:f.outputTokens,totalCacheReadTokens:f.cacheReadTokens===0?void 0:f.cacheReadTokens,totalCacheWriteTokens:f.cacheWriteTokens===0?void 0:f.cacheWriteTokens,totalCost:f.totalCost}]}translateRunFinished(f){let $={inputTokens:f.usage.inputTokens,outputTokens:f.usage.outputTokens,cacheReadTokens:f.usage.cacheReadTokens===0?void 0:f.usage.cacheReadTokens,cacheWriteTokens:f.usage.cacheWriteTokens===0?void 0:f.usage.cacheWriteTokens,totalCost:f.usage.totalCost};return[{type:"done",reason:lV(f.status),text:f.outputText,iterations:f.iterations,usage:$}]}}function fB(f){if(typeof f==="string")return f;if(f instanceof Error)return f.message;try{return JSON.stringify(f)}catch{return String(f)}}async function $B(f){let W=(typeof f.content==="function"?await f.content():f.content).trim();return W.length>0?W:void 0}function WB(f,$){let W=f.trim(),J=$.map((H)=>H.trim()).filter(Boolean).join(`
130
+
131
+ `);if(W&&J)return`${W}
132
+
133
+ ${J}`;return W||J}function JB(f){let $=f.filter((W)=>W!==void 0);if($.length===0)return{};return{beforeRun:async(W)=>{for(let J of $){let H=await J.beforeRun?.(W);if(H?.stop)return H}return},afterRun:async(W)=>{for(let J of $)await J.afterRun?.(W)},beforeModel:async(W)=>{let J=W.request,H;for(let Q of $){let Z=await Q.beforeModel?.({...W,request:J});if(!Z)continue;if(Z.stop)return Z;H={...H,...Z,options:{...H?.options??{},...Z.options??{}}},J={...J,...Z.messages?{messages:Z.messages}:{},...Z.tools?{tools:Z.tools}:{},...Z.options?{options:{...J.options??{},...Z.options}}:{}}}return H},afterModel:async(W)=>{for(let J of $){let H=await J.afterModel?.(W);if(H?.stop)return H}return},beforeTool:async(W)=>{let J=W.input,H;for(let Q of $){let Z=await Q.beforeTool?.({...W,input:J});if(!Z)continue;if(Z.stop||Z.skip)return Z;if(H={...H,...Z},Object.hasOwn(Z,"input"))J=Z.input}return H},afterTool:async(W)=>{let J=W.result,H;for(let Q of $){let Z=await Q.afterTool?.({...W,result:J});if(!Z)continue;if(Z.stop)return Z;if(H={...H,...Z},Z.result)J=Z.result}return H},onEvent:async(W)=>{for(let J of $)await J.onEvent?.(W)}}}class m0{config;agentId;parentAgentId;logger;telemetry;conversation;mistakeTracker;loopTracker;loopDetectionDisabled;messageBuilder;contributionRegistry;extensionsInitialized=!1;listeners=new Set;createAgentRuntimeImpl;activeRunId=null;running=!1;abortRequested=!1;abortReason;activeRuntime=null;activeRunPromise=null;eventAdapter=new kJ;shutdownCalled=!1;currentRunToolCalls=[];currentRunUsage={inputTokens:0,outputTokens:0};toolStartedAt=new Map;toolInputs=new Map;currentTurnSuccessfulTools=0;currentTurnFailedTools=0;currentTurnFailureDetails=[];activeTrackerWork=Promise.resolve();trackerAbortInFlight=!1;constructor(f,$={}){this.config=f,this.agentId=`agent_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,this.parentAgentId=f.parentAgentId,this.logger=$.logger??f.logger,this.telemetry=$.telemetry??f.telemetry,this.createAgentRuntimeImpl=$.createAgentRuntimeImpl??oV,this.conversation=new qJ(f.initialMessages),this.messageBuilder=new NJ,this.contributionRegistry=eV({extensions:f.extensions?[...f.extensions]:[],setupContext:{session:f.extensionContext?.session,client:f.extensionContext?.client,user:f.extensionContext?.user,workspaceInfo:f.extensionContext?.workspace,automation:f.extensionContext?.automation,logger:f.extensionContext?.logger??this.logger,telemetry:f.extensionContext?.telemetry??this.telemetry}}),this.contributionRegistry.resolve(),this.contributionRegistry.validate();let W=f.execution?.maxConsecutiveMistakes??6;this.mistakeTracker=new SJ({maxConsecutiveMistakes:W,onLimitReached:f.onConsecutiveMistakeLimitReached,emit:(Q)=>this.emitLegacyEvent(Q),log:(Q,Z,P)=>HB(this.logger,Q,Z,P),agentId:this.agentId,getConversationId:()=>this.conversation.getConversationId(),getActiveRunId:()=>this.activeRunId??"",appendRecoveryNotice:(Q,Z)=>{this.conversation.appendMessage({role:"user",content:[{type:"text",text:Q}]})}});let J=f.execution?.loopDetection;this.loopDetectionDisabled=J===!1;let H=J===!1||J===void 0?void 0:J;this.loopTracker=new EJ(H)}getAgentId(){return this.agentId}getConversationId(){return this.conversation.getConversationId()}getMessages(){return this.conversation.getMessages()}canStartRun(){return!this.running&&!this.shutdownCalled}getExtensionRegistry(){return this.contributionRegistry.getRegistrySnapshot()}addTools(f){if(f.length===0)return;let $=new Set(this.config.tools.map((J)=>J.name)),W=[...this.config.tools];for(let J of f)if(!$.has(J.name))W.push(J),$.add(J.name);this.config={...this.config,tools:W}}updateConnection(f){let $={...this.config};if(f.providerId!==void 0)$.providerId=f.providerId;if(f.modelId!==void 0)$.modelId=f.modelId;if(f.apiKey!==void 0)$.apiKey=f.apiKey;if(f.baseUrl!==void 0)$.baseUrl=f.baseUrl;if(f.headers!==void 0)$.headers=f.headers;if(f.providerConfig!==void 0)$.providerConfig=f.providerConfig;if(f.reasoningEffort!==void 0)$.reasoningEffort=f.reasoningEffort;if(f.thinking!==void 0)$.thinking=f.thinking;if(f.thinkingBudgetTokens!==void 0)$.thinkingBudgetTokens=f.thinkingBudgetTokens;this.config=$}clearHistory(){this.conversation.clearHistory(),this.resetConversationBoundaryTrackers()}restore(f){this.conversation.restore(f),this.resetConversationBoundaryTrackers()}resetConversationBoundaryTrackers(){this.mistakeTracker.reset(),this.loopTracker.reset()}subscribeEvents(f){return this.listeners.add(f),()=>{this.listeners.delete(f)}}abort(f){let $=typeof f==="string"?f:f instanceof Error?f.message:f===void 0?void 0:String(f);if(this.abortRequested=!0,this.abortReason=$,this.activeRunPromise)this.activeRunPromise.catch(()=>{});this.activeRuntime?.abort($)}async shutdown(f,$){if(this.running){if(!this.abortRequested||!this.activeRunPromise)throw Error(`SessionRuntime.shutdown called while a run is in progress (agentId=${this.agentId})`);await this.activeRunPromise}if(this.shutdownCalled)return;this.shutdownCalled=!0}run(f,$,W){return this.conversation.resetForRun(),this.resetConversationBoundaryTrackers(),this.executeRun({userMessage:f,userImages:$,userFiles:W,isContinue:!1})}continue(f,$,W){return this.executeRun({userMessage:f,userImages:$,userFiles:W,isContinue:!0})}async composeSystemPrompt(){let f=[];for(let $ of this.contributionRegistry.getRegisteredRules()){let W=await $B($);if(W)f.push(W)}return WB(this.config.systemPrompt,f)}executeRun(f){let $;return $=this.executeRunInternal(f).finally(()=>{if(this.activeRunPromise===$)this.activeRunPromise=null}),this.activeRunPromise=$,$}async executeRunInternal(f){if(this.shutdownCalled)throw Error(`SessionRuntime.run called after shutdown (agentId=${this.agentId})`);if(this.running)throw Error(`SessionRuntime state is "running"; call canStartRun() first (agentId=${this.agentId})`);this.running=!0,this.abortRequested=!1,this.abortReason=void 0,this.activeRunId=`run_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,await this.ensureExtensionsInitialized(),this.eventAdapter.reset(),this.currentRunToolCalls=[],this.currentRunUsage={inputTokens:0,outputTokens:0},this.toolStartedAt.clear(),this.toolInputs.clear(),this.currentTurnSuccessfulTools=0,this.currentTurnFailedTools=0,this.currentTurnFailureDetails=[],this.activeTrackerWork=Promise.resolve(),this.trackerAbortInFlight=!1;let $=new Date,W=f.userMessage;if(W!==void 0){let Y=await ZB(W,f.userImages,f.userFiles,this.config.userFileContentLoader);this.conversation.appendMessage({role:"user",content:Y})}let J=await this.composeSystemPrompt(),H=P7(this.config,this.logger),Q=this.contributionRegistry.getRegisteredTools(),Z=new Map;for(let Y of Q)Z.set(Y.name,Y);for(let Y of this.config.tools)Z.set(Y.name,Y);let P=this.conversation.getConversationId(),j=h7(this.config),R=Array.from(Z.values()),X=b8(this.conversation.getMessages()),A=Y7({agentConfig:this.config,sessionId:this.config.sessionId,agentId:this.agentId,conversationId:P,parentAgentId:this.parentAgentId,model:H,logger:this.logger,tools:R,toolContextMetadata:{modelSupportsImages:j?.capabilities?.includes("images")??!0,...this.config.toolContextMetadata},hooks:this.createRuntimeHooks(),prepareTurn:this.createRuntimePrepareTurn(j,R),initialMessages:X,systemPrompt:J}),V=this.createAgentRuntimeImpl(A);if(this.activeRuntime=V,this.abortRequested)V.abort(this.abortReason);let B=V.subscribe((Y)=>{this.handleRuntimeEvent(Y)}),T,h;try{if(f.isContinue)T=await V.continue(void 0);else T=await V.run("")}catch(Y){h=Y instanceof Error?Y:Error(String(Y))}finally{B();try{await this.activeTrackerWork}catch(Y){this.logger?.error?.("SessionRuntime tracker work failed during drain",{agentId:this.agentId,error:Y})}this.activeRuntime=null,this.running=!1,this.abortRequested=!1,this.abortReason=void 0}if(T&&T.messages.length>0){let Y=j1(T.messages);this.conversation.replaceMessages(Y)}let F=new Date;try{return this.buildLegacyResult({runResult:T,thrownError:h,startedAt:$,endedAt:F})}finally{this.activeRunId=null}}async ensureExtensionsInitialized(){if(this.extensionsInitialized)return;try{await this.contributionRegistry.initialize()}catch(f){if(this.config.hookErrorMode==="throw")throw f;this.emitLegacyEvent({type:"error",error:f instanceof Error?f:Error(String(f)),recoverable:!0,iteration:0})}this.extensionsInitialized=!0}createRuntimeHooks(){let f=JB([this.config.hooks,...this.contributionRegistry.getValidatedExtensions().map(($)=>$.hooks)]);return{...f,beforeModel:async($)=>{let W=await f.beforeModel?.($);if(W?.stop)return W;let J=W?.messages??$.request.messages,H=await this.prepareMessagesForModelRequest(J);return{...W,messages:H}}}}createRuntimePrepareTurn(f,$){let W=this.config.prepareTurn;if(!W)return;return async(J)=>{let H=j1(J.messages),Q=await this.prepareProviderMessagesForApi(H),Z=await W({agentId:J.agentId,conversationId:J.conversationId??this.conversation.getConversationId(),parentAgentId:J.parentAgentId??null,iteration:J.iteration,messages:H,apiMessages:Q,abortSignal:J.signal??new AbortController().signal,systemPrompt:J.systemPrompt??"",tools:$,model:{id:this.config.modelId,provider:this.config.providerId,info:f},emitStatusNotice:J.emitStatusNotice});if(!Z)return;return{...Z.messages?{messages:b8(Z.messages)}:{},...Z.systemPrompt!==void 0?{systemPrompt:Z.systemPrompt}:{}}}}async prepareMessagesForModelRequest(f){let $=await this.prepareProviderMessagesForApi(V7(f));return b8($)}async prepareProviderMessagesForApi(f){let $=f,W=this.contributionRegistry.getRegistrySnapshot().messageBuilder;for(let J of W)$=await J.build($);return this.messageBuilder.buildForApi($)}handleRuntimeEvent(f){switch(f.type){case"message-added":case"assistant-message":{this.syncConversationFromRuntimeMessage(f.snapshot.messages,[f.message]);break}case"turn-started":{this.currentTurnSuccessfulTools=0,this.currentTurnFailedTools=0,this.currentTurnFailureDetails=[];break}case"tool-started":{this.toolStartedAt.set(f.toolCall.toolCallId,new Date),this.toolInputs.set(f.toolCall.toolCallId,f.toolCall.input),this.inspectLoopForToolCall(f.toolCall.toolName,f.toolCall.input,f.iteration);break}case"tool-finished":{let $=this.toolStartedAt.get(f.toolCall.toolCallId),W=new Date,J=this.toolInputs.get(f.toolCall.toolCallId);this.toolStartedAt.delete(f.toolCall.toolCallId),this.toolInputs.delete(f.toolCall.toolCallId);let H=f.message.content.find((j)=>j.type==="tool-result"),Q=H?.type==="tool-result"&&H.isError===!0,Z=Q?fB(H?.type==="tool-result"?H.output:void 0):void 0,P={id:f.toolCall.toolCallId,name:f.toolCall.toolName,input:J,output:H?.type==="tool-result"?H.output:void 0,error:Z,durationMs:$===void 0?0:W.getTime()-$.getTime(),startedAt:$??W,endedAt:W};if(this.currentRunToolCalls.push(P),Q){if(this.currentTurnFailedTools+=1,Z)this.currentTurnFailureDetails.push(`[${f.toolCall.toolName}] ${Z}`)}else this.currentTurnSuccessfulTools+=1;break}case"turn-finished":{let $=this.currentTurnFailedTools,W=this.currentTurnSuccessfulTools;if($>0&&W===0){let J=this.currentTurnFailureDetails.join("; ");this.enqueueMistakeRecord({iteration:f.iteration,reason:"tool_execution_failed",details:`${$} tool call(s) failed${J?`: ${J}`:""}`})}else if(W>0)this.mistakeTracker.reset();break}case"usage-updated":{this.currentRunUsage={inputTokens:f.usage.inputTokens,outputTokens:f.usage.outputTokens,cacheReadTokens:f.usage.cacheReadTokens>0?f.usage.cacheReadTokens:void 0,cacheWriteTokens:f.usage.cacheWriteTokens>0?f.usage.cacheWriteTokens:void 0,totalCost:f.usage.totalCost};break}default:break}for(let $ of this.eventAdapter.translate(f))this.emitLegacyEvent($)}syncConversationFromRuntimeMessage(f,$){if(f.length>0){this.conversation.replaceMessages(j1(f));return}if($.length===0)return;let W=new Set(this.conversation.getMessages().map((H)=>H.id).filter((H)=>typeof H==="string")),J=j1($).filter((H)=>!H.id||!W.has(H.id));if(J.length===0)return;this.conversation.replaceMessages([...this.conversation.getMessages(),...J])}emitLegacyEvent(f){for(let $ of this.listeners)try{$(f)}catch(W){this.logger?.error?.("SessionRuntime event listener threw",{agentId:this.agentId,error:W})}}inspectLoopForToolCall(f,$,W){if(this.trackerAbortInFlight||this.loopDetectionDisabled)return;let J=this.loopTracker.inspect({name:f,input:$});if(J.kind==="ok")return;if(J.kind==="soft"){if(J.message)this.conversation.appendMessage({role:"user",content:[{type:"text",text:J.message}]});return}this.enqueueMistakeRecord({iteration:W,reason:"tool_execution_failed",forceAtLimit:!0,details:J.message??`Detected repeated tool calls to \`${f}\`; stopping to avoid a loop.`})}enqueueMistakeRecord(f){if(this.trackerAbortInFlight)return;this.activeTrackerWork=this.activeTrackerWork.then(async()=>{if(this.trackerAbortInFlight)return;let $=await this.mistakeTracker.record(f);if($.action==="stop")this.trackerAbortInFlight=!0,this.conversation.appendMessage({role:"user",content:[{type:"text",text:$.message}]}),this.activeRuntime?.abort($.reason??$.message)})}buildLegacyResult(f){let{runResult:$,thrownError:W,startedAt:J,endedAt:H}=f,Q=H.getTime()-J.getTime(),Z=W?"error":QB($),P=$?.outputText||($?.status==="failed"?$.error?.message:void 0)||"",j=$?{inputTokens:$.usage.inputTokens,outputTokens:$.usage.outputTokens,cacheReadTokens:$.usage.cacheReadTokens>0?$.usage.cacheReadTokens:void 0,cacheWriteTokens:$.usage.cacheWriteTokens>0?$.usage.cacheWriteTokens:void 0,totalCost:$.usage.totalCost}:this.currentRunUsage,R=$?j1($.messages):this.conversation.getMessages(),X=h7(this.config);if(W)throw W;return{text:P,usage:j,messages:R,toolCalls:this.currentRunToolCalls,iterations:$?.iterations??0,finishReason:Z,model:{id:this.config.modelId,provider:this.config.providerId,info:X},startedAt:J,endedAt:H,durationMs:Q}}}function HB(f,$,W,J){if(!f)return;if($==="debug"){f.debug(W,J);return}if($==="error"&&f.error){f.error(W,J);return}let H=$==="warn"?"warn":$==="error"?"error":"info";f.log(W,{...J,severity:H})}function QB(f){if(!f)return"error";switch(f.status){case"completed":return"completed";case"aborted":return"aborted";case"failed":return"error"}}async function ZB(f,$,W,J){let{buildInitialUserContent:H}=await Promise.resolve().then(() => y7);return H(f,$,W,J)}function h7(f){if(f.knownModels?.[f.modelId])return f.knownModels[f.modelId];let $=CJ(f);if($?.[f.modelId])return $[f.modelId];return}import{buildClineSystemPrompt as K7}from"@clinebot/shared";function U7(f,$){let W=f.trim();if($.providerId.toLowerCase()!=="cline")return W;return K7({ide:$.clineIdeName?.trim()||"Terminal",workspaceRoot:$.cwd?.trim()||"/",providerId:$.providerId,rules:`# Team Teammate Role
134
+ ${W}`,platform:$.clinePlatform,metadata:$.workspaceMetadata})}function M7(f,$){let W=f.trim();if($.providerId.toLowerCase()!=="cline")return W;return K7({ide:$.clineIdeName||"Terminal",workspaceRoot:$.cwd?.trim()||"/",providerId:$.providerId,overridePrompt:W,metadata:$.workspaceMetadata,platform:$.clinePlatform})}function R1(f){let $={...f};return{getRuntimeConfig:()=>$,getConnectionConfig:()=>({providerId:$.providerId,modelId:$.modelId,apiKey:$.apiKey,baseUrl:$.baseUrl,headers:$.headers,providerConfig:$.providerConfig,knownModels:$.knownModels,thinking:$.thinking}),updateConnectionDefaults:(W)=>{$={...$,...W}}}}function Y$(f){let $=f.configProvider.getRuntimeConfig(),W=f.kind==="teammate"?U7(f.prompt,$):M7(f.prompt,$);return{...f.configProvider.getConnectionConfig(),systemPrompt:W,tools:f.tools,maxIterations:f.maxIterations??$.maxIterations,parentAgentId:f.parentAgentId,abortSignal:f.abortSignal,onEvent:f.onEvent,hooks:$.hooks,extensions:$.extensions,hookErrorMode:f.hookErrorMode,toolPolicies:f.toolPolicies,requestToolApproval:f.requestToolApproval,logger:$.logger,role:f.role}}function X1(f){let $=Y$(f),W=new m0($);if($.onEvent)W.subscribeEvents($.onEvent);return W}var RB=mJ.object({systemPrompt:mJ.string().describe("System prompt defining the sub-agent's behavior"),task:mJ.string().describe("Task for the sub-agent to complete")});function g0(f){return PB({name:"spawn_agent",description:"Spawn a sub-agent with a custom system prompt for specialized tasks. Use when delegating work that benefits from focused expertise.",inputSchema:jB(RB),execute:async($,W)=>{let J=f.createSubAgentTools?await f.createSubAgentTools($,W):f.subAgentTools??[],H=X1({kind:"subagent",prompt:$.systemPrompt,configProvider:f.configProvider,tools:J,maxIterations:f.defaultMaxIterations,parentAgentId:W.agentId,abortSignal:W.signal,onEvent:f.onSubAgentEvent,hookErrorMode:f.hookErrorMode,toolPolicies:f.toolPolicies,requestToolApproval:f.requestToolApproval}),Q=H.getAgentId(),Z=H.getConversationId(),P=W.agentId;if(f.onSubAgentStart)try{await f.onSubAgentStart({subAgentId:Q,conversationId:Z,parentAgentId:P,input:$})}catch{}try{let j=await H.run($.task),R={text:j.text,iterations:j.iterations,finishReason:j.finishReason,usage:{inputTokens:j.usage.inputTokens,outputTokens:j.usage.outputTokens}};if(f.onSubAgentEnd)try{await f.onSubAgentEnd({subAgentId:Q,conversationId:Z,parentAgentId:P,input:$,result:R})}catch{}return R}catch(j){if(f.onSubAgentEnd)try{await f.onSubAgentEnd({subAgentId:Q,conversationId:Z,parentAgentId:P,input:$,error:j instanceof Error?j:Error(String(j))})}catch{}throw j}},timeoutMs:300000,retryable:!1})}import{createTool as Wf,TEAM_AWAIT_TIMEOUT_MS as XB,TEAM_RUN_MESSAGE_PREVIEW_LIMIT as AB,TEAM_RUN_TEXT_PREVIEW_LIMIT as VB,TEAM_TASK_IGNORED_FIELDS_BY_ACTION as BB,TeamAttachOutcomeFragmentInputSchema as G7,TeamAwaitRunsInputSchema as D7,TeamBroadcastInputSchema as _7,TeamBroadcastToolResultSchema as TB,TeamCancelRunInputSchema as L7,TeamCancelRunToolResultSchema as YB,TeamCleanupInputSchema as O7,TeamCleanupToolResultSchema as FB,TeamCreateOutcomeInputSchema as C7,TeamCreateOutcomeToolResultSchema as yB,TeamFinalizeOutcomeInputSchema as z7,TeamFinalizeOutcomeToolResultSchema as hB,TeamListOutcomesInputSchema as N7,TeamListRunsInputSchema as b7,TeamMailboxMessageToolResultSchema as KB,TeamMissionLogInputSchema as q7,TeamMissionLogToolResultSchema as UB,TeamOutcomeFragmentToolResultSchema as w7,TeamOutcomeToolResultSchema as MB,TeamReadMailboxInputSchema as E7,TeamReviewOutcomeFragmentInputSchema as S7,TeamRunTaskInputSchema as k7,TeamRunTaskToolResultSchema as gJ,TeamRunToolSummarySchema as xJ,TeamSendMessageInputSchema as m7,TeamSendMessageToolResultSchema as GB,TeamShutdownTeammateInputSchema as g7,TeamSimpleAgentStatusToolResultSchema as x7,TeamSpawnTeammateInputSchema as I7,TeamStatusInputSchema as v7,TeamStatusToolResultSchema as DB,TeamTaskInputSchema as u7,TeamTaskToolResultSchema as g2,validateWithZod as b,zodToJsonSchema as Jf}from"@clinebot/shared";function c7(f,$){let W=f.replace(/\s+/g," ").trim();if(W.length<=$)return W;return`${W.slice(0,Math.max(0,$-3)).trimEnd()}...`}function F$(f,$){if(f===void 0)throw Error(`Missing required field: ${$}`);return f}function _B(f){let $=f.result;if(!$)return;return{textPreview:c7($.text,VB),iterations:$.iterations,finishReason:$.finishReason,durationMs:$.durationMs,usage:{inputTokens:$.usage.inputTokens,outputTokens:$.usage.outputTokens,cacheReadTokens:$.usage.cacheReadTokens,cacheWriteTokens:$.usage.cacheWriteTokens,totalCost:$.usage.totalCost}}}function q8(f){return f?.toISOString()}function IJ(f){return{id:f.id,agentId:f.agentId,taskId:f.taskId,status:f.status,messagePreview:c7(f.message,AB),priority:f.priority,retryCount:f.retryCount,maxRetries:f.maxRetries,nextAttemptAt:q8(f.nextAttemptAt),continueConversation:f.continueConversation,startedAt:f.startedAt.toISOString(),endedAt:q8(f.endedAt),leaseOwner:f.leaseOwner,heartbeatAt:q8(f.heartbeatAt),lastProgressAt:q8(f.lastProgressAt),lastProgressMessage:f.lastProgressMessage,currentActivity:f.currentActivity,error:f.error,resultSummary:_B(f)}}function LB(f){if(f.status==="failed")throw Error(`Run "${f.id}" failed${f.error?`: ${f.error}`:""}`);if(f.status==="cancelled")throw Error(`Run "${f.id}" was cancelled${f.error?`: ${f.error}`:""}`);if(f.status==="interrupted")throw Error(`Run "${f.id}" was interrupted${f.error?`: ${f.error}`:""}`)}var A1=["team_spawn_teammate","team_shutdown_teammate","team_status","team_task","team_run_task","team_cancel_run","team_list_runs","team_await_runs","team_send_message","team_broadcast","team_read_mailbox","team_mission_log","team_cleanup","team_create_outcome","team_attach_outcome_fragment","team_review_outcome_fragment","team_finalize_outcome","team_list_outcomes"];function d7(f){let $=[];if(f.createBaseTools)$.push(...f.createBaseTools());$.push(...y$({runtime:f.runtime,requesterId:f.spec.agentId,teammateConfigProvider:f.teammateConfigProvider,createBaseTools:f.createBaseTools,allowSpawn:!1})),f.runtime.spawnTeammate({agentId:f.spec.agentId,config:Y$({kind:"teammate",prompt:f.spec.rolePrompt,role:f.spec.rolePrompt,configProvider:f.teammateConfigProvider,tools:$,maxIterations:f.spec.maxIterations,cwd:f.teammateConfigProvider.getRuntimeConfig().cwd})})}function V1(f){let $=f.leadAgentId??"lead",W=f.restoredFromPersistence===!0,J=y$({runtime:f.runtime,requesterId:$,teammateConfigProvider:f.teammateConfigProvider,createBaseTools:f.createBaseTools,allowSpawn:!0,includeSpawnTool:f.includeLeadSpawnTool,includeManagementTools:f.includeLeadManagementTools,onLeadToolsUnlocked:f.onLeadToolsUnlocked}),H=[];for(let Q of f.restoredTeammates??[]){if(f.runtime.isTeammateActive(Q.agentId))continue;d7({runtime:f.runtime,requesterId:$,teammateConfigProvider:f.teammateConfigProvider,createBaseTools:f.createBaseTools,spec:Q}),H.push(Q.agentId)}return{tools:J,restoredFromPersistence:W,restoredTeammates:H}}function y$(f){let $=f.allowSpawn??!0,W=f.includeSpawnTool??!0,J=f.includeManagementTools??!0,H=[];if(W)H.push(Wf({name:"team_spawn_teammate",description:"Spawn a teammate with a required agentId and rolePrompt.",inputSchema:Jf(I7),execute:async(Z)=>{let P=b(I7,Z);if(f.runtime.getMemberRole(f.requesterId)!=="lead")throw Error("Only the lead agent can manage teammates.");if(!$)throw Error("Spawning teammates is disabled in this context.");let j={agentId:P.agentId,rolePrompt:P.rolePrompt};if(d7({runtime:f.runtime,requesterId:f.requesterId,teammateConfigProvider:f.teammateConfigProvider,createBaseTools:f.createBaseTools,spec:j}),!J)f.onLeadToolsUnlocked?.(y$({...f,includeSpawnTool:!1,includeManagementTools:!0,onLeadToolsUnlocked:void 0}));return b(x7,{agentId:P.agentId,status:"spawned"})}}));if(!J)return H;H.push(Wf({name:"team_shutdown_teammate",description:"Shutdown a teammate by agentId.",inputSchema:Jf(g7),execute:async(Z)=>{let P=b(g7,Z);if(f.runtime.getMemberRole(f.requesterId)!=="lead")throw Error("Only the lead agent can manage teammates.");return f.runtime.shutdownTeammate(P.agentId,P.reason),b(x7,{agentId:P.agentId,status:"stopped"})}})),H.push(Wf({name:"team_status",description:"Return a snapshot of team members, task counts, mailbox, and mission log stats.",inputSchema:Jf(v7),execute:async(Z)=>{return b(v7,Z),b(DB,f.runtime.getSnapshot())}})),H.push(Wf({name:"team_task",description:"Manage shared team tasks with action-specific payloads. create requires title and description, with optional dependsOn and assignee. list accepts optional status, assignee. claim requires taskId. complete requires taskId and summary. block requires taskId and reason. Do not include fields from other actions.",inputSchema:Jf(u7),execute:async(Z)=>{let P=b(u7,Z);switch(P.action){case"create":{let j=new Set(BB.create??[]),R=Object.entries(Z).filter(([A,V])=>j.has(A)&&V!=null).map(([A])=>A),X=f.runtime.createTask({title:F$(P.title,"title"),description:F$(P.description,"description"),dependsOn:P.dependsOn,assignee:P.assignee,createdBy:f.requesterId});return b(g2,{action:"create",taskId:X.id,status:X.status,...R.length>0?{ignoredFields:R,note:`Ignored fields for action=create: ${R.join(", ")}`}:{}})}case"list":return b(g2,{action:"list",tasks:f.runtime.listTaskItems({status:P.status,assignee:P.assignee})});case"claim":{let j=f.runtime.claimTask(F$(P.taskId,"taskId"),f.requesterId);return b(g2,{action:"claim",taskId:j.id,status:j.status,nextStep:"Task is now in_progress. Execute the work using team_run_task or your own tools, then call team_task with action=complete when done."})}case"complete":{let j=f.runtime.completeTask(F$(P.taskId,"taskId"),f.requesterId,F$(P.summary,"summary"));return b(g2,{action:"complete",taskId:j.id,status:j.status})}case"block":{let j=f.runtime.blockTask(F$(P.taskId,"taskId"),f.requesterId,F$(P.reason,"reason"));return b(g2,{action:"block",taskId:j.id,status:j.status})}}}}));let Q=new Map;return H.push(Wf({name:"team_run_task",description:"Route a delegated task to a teammate. Choose sync (wait) or async (run in background).",inputSchema:Jf(k7),execute:async(Z)=>{let P=b(k7,Z);if(P.runMode==="async"){let X=f.runtime.startTeammateRun(P.agentId,P.task,{taskId:P.taskId||void 0,fromAgentId:f.requesterId,continueConversation:P.continueConversation||void 0});return b(gJ,{agentId:P.agentId,mode:"async",status:"queued",dispatched:!0,message:`Task dispatched to ${P.agentId} and queued as ${X.id}.`,runId:X.id})}let j=Q.get(P.agentId);if(j){let X=await j;return b(gJ,{...X,status:"joined",deduped:!0,message:`Task for ${P.agentId} was already dispatched in this tool batch; joined the existing in-flight run.`})}let R=f.runtime.routeToTeammate(P.agentId,P.task,{taskId:P.taskId||void 0,fromAgentId:f.requesterId,continueConversation:P.continueConversation||void 0}).then((X)=>b(gJ,{agentId:P.agentId,mode:"sync",status:"running",dispatched:!0,message:`Task dispatched to ${P.agentId} and completed in sync mode.`,text:X.text,iterations:X.iterations})).finally(()=>{Q.delete(P.agentId)});return Q.set(P.agentId,R),await R}})),H.push(Wf({name:"team_cancel_run",description:"Cancel one async teammate run.",inputSchema:Jf(L7),execute:async(Z)=>{let P=b(L7,Z),j=f.runtime.cancelRun(P.runId,P.reason);return b(YB,{runId:j.id,status:j.status})}})),H.push(Wf({name:"team_list_runs",description:"List teammate runs started with team_run_task in async mode, including live activity/progress fields when available.",inputSchema:Jf(b7),execute:async(Z)=>b(xJ.array(),f.runtime.listRuns(b(b7,Z)).map(IJ))})),H.push(Wf({name:"team_await_runs",description:"Wait for async teammate runs. Provide runId to wait for one run, or omit it to wait for all active async runs. Uses a long timeout for legitimate teammate work.",inputSchema:Jf(D7),timeoutMs:XB,execute:async(Z)=>{let P=b(D7,Z);if(P.runId){let X=await f.runtime.awaitRun(P.runId);return LB(X),b(xJ,IJ(X))}let j=await f.runtime.awaitAllRuns(),R=j.filter((X)=>["failed","cancelled","interrupted"].includes(X.status));if(R.length>0){let X=R.map((A)=>`${A.id}:${A.status}${A.error?`(${A.error})`:""}`).join(", ");throw Error(`One or more runs did not complete successfully: ${X}`)}return b(xJ.array(),j.map(IJ))}})),H.push(Wf({name:"team_send_message",description:"Send a mailbox message to a specific teammate.",inputSchema:Jf(m7),execute:async(Z)=>{let P=b(m7,Z),j=f.runtime.sendMessage(f.requesterId,P.toAgentId,P.subject,P.body,P.taskId??void 0);return b(GB,{id:j.id,toAgentId:j.toAgentId})}})),H.push(Wf({name:"team_broadcast",description:"Broadcast a message to all teammates.",inputSchema:Jf(_7),execute:async(Z)=>{let P=b(_7,Z),j=f.runtime.broadcast(f.requesterId,P.subject,P.body,{taskId:P.taskId??void 0});return b(TB,{delivered:j.length})}})),H.push(Wf({name:"team_read_mailbox",description:"Read the current agent mailbox.",inputSchema:Jf(E7),execute:async(Z)=>{let P=b(E7,Z);return b(KB.array(),f.runtime.listMailbox(f.requesterId,{unreadOnly:P.unreadOnly,markRead:!0}))}})),H.push(Wf({name:"team_mission_log",description:"Append a mission log update for your team.",inputSchema:Jf(q7),execute:async(Z)=>{let P=b(q7,Z),j=f.runtime.appendMissionLog({agentId:f.requesterId,taskId:P.taskId||void 0,kind:P.kind,summary:P.summary,evidence:P.evidence?.length?P.evidence:void 0,nextAction:P.nextAction||void 0});return b(UB,{id:j.id})}})),H.push(Wf({name:"team_cleanup",description:"Clean up the team runtime. Fails if teammates are still running.",inputSchema:Jf(O7),execute:async(Z)=>{if(b(O7,Z),f.runtime.getMemberRole(f.requesterId)!=="lead")throw Error("Only the lead agent can run cleanup.");return f.runtime.cleanup(),b(FB,{status:"cleaned"})}})),H.push(Wf({name:"team_create_outcome",description:"Create a converged team outcome.",inputSchema:Jf(C7),execute:async(Z)=>{let P=b(C7,Z),j=f.runtime.createOutcome({title:P.title,requiredSections:P.requiredSections,createdBy:f.requesterId});return b(yB,{outcomeId:j.id,status:j.status,requiredSections:j.requiredSections})}})),H.push(Wf({name:"team_attach_outcome_fragment",description:"Attach a fragment to an outcome section.",inputSchema:Jf(G7),execute:async(Z)=>{let P=b(G7,Z),j=f.runtime.attachOutcomeFragment({outcomeId:P.outcomeId,section:P.section,sourceAgentId:f.requesterId,sourceRunId:P.sourceRunId||void 0,content:P.content});return b(w7,{fragmentId:j.id,status:j.status})}})),H.push(Wf({name:"team_review_outcome_fragment",description:"Review one outcome fragment.",inputSchema:Jf(S7),execute:async(Z)=>{let P=b(S7,Z),j=f.runtime.reviewOutcomeFragment({fragmentId:P.fragmentId,reviewedBy:f.requesterId,approved:P.approved});return b(w7,{fragmentId:j.id,status:j.status})}})),H.push(Wf({name:"team_finalize_outcome",description:"Finalize one outcome.",inputSchema:Jf(z7),execute:async(Z)=>{let P=b(z7,Z),j=f.runtime.finalizeOutcome(P.outcomeId);return b(hB,{outcomeId:j.id,status:j.status})}})),H.push(Wf({name:"team_list_outcomes",description:"List team outcomes.",inputSchema:Jf(N7),execute:async(Z)=>{return b(N7,Z),b(MB.array(),f.runtime.listOutcomes())}})),H}function w8(f){return{...f,tasks:f.tasks.map(($)=>({...$,createdAt:new Date($.createdAt),updatedAt:new Date($.updatedAt)})),mailbox:f.mailbox.map(($)=>({...$,sentAt:new Date($.sentAt),readAt:$.readAt?new Date($.readAt):void 0})),missionLog:f.missionLog.map(($)=>({...$,ts:new Date($.ts)})),runs:(f.runs??[]).map(($)=>({...$,startedAt:new Date($.startedAt),endedAt:$.endedAt?new Date($.endedAt):void 0,nextAttemptAt:$.nextAttemptAt?new Date($.nextAttemptAt):void 0,heartbeatAt:$.heartbeatAt?new Date($.heartbeatAt):void 0})),outcomes:(f.outcomes??[]).map(($)=>({...$,createdAt:new Date($.createdAt),finalizedAt:$.finalizedAt?new Date($.finalizedAt):void 0})),outcomeFragments:(f.outcomeFragments??[]).map(($)=>({...$,createdAt:new Date($.createdAt),reviewedAt:$.reviewedAt?new Date($.reviewedAt):void 0}))}}function E8(f){return f.toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")}var OB=[{id:"read_files",description:"Read the full content of text or image files at the provided absolute paths, or return only an inclusive one-based line range when start_line/end_line are provided.",headlessToolNames:["read_files"]},{id:"search_codebase",description:"Perform regex pattern searches across the codebase for code patterns, definitions, imports, and other text matches.",headlessToolNames:["search_codebase"]},{id:"run_commands",description:"Run shell commands from the root of the workspace for listing files, checking git status, builds, tests, and similar tasks.",headlessToolNames:["run_commands"]},{id:"editor",description:"Make controlled filesystem edits on text files with create, replace, and insert operations.",headlessToolNames:["editor"]},{id:"fetch_web_content",description:"Fetch URL content and analyze it with a prompt describing what to extract.",headlessToolNames:["fetch_web_content"]},{id:"skills",description:"Execute a configured skill within the main conversation when a matching skill exists for the task.",headlessToolNames:["skills"]},{id:"ask_question",description:"Ask the user a single clarifying question with 2-5 selectable options.",headlessToolNames:["ask_question"]},{id:"spawn_agent",description:g0({configProvider:{}}).description,headlessToolNames:["spawn_agent"]},{id:"teams",description:"Enable team collaboration tools for teammate management, task coordination, mailbox messaging, mission logs, and outcomes.",headlessToolNames:[...A1]}],CB={read_files:"enableReadFiles",search_codebase:"enableSearch",run_commands:"enableBash",fetch_web_content:"enableWebFetch",apply_patch:"enableApplyPatch",editor:"enableEditor",skills:"enableSkills",ask_question:"enableAskQuestion"};function zB(f){return f==="plan"||f==="yolo"?f:"act"}function l7(f){let $=zB(f.mode),W=zf[V0({mode:$})],J=P1(f.providerId??"",f.modelId??"",$,Z1);return{mode:$,flags:{...W,...J,...typeof f.enableSpawnAgent==="boolean"?{enableSpawnAgent:f.enableSpawnAgent}:{},...typeof f.enableAgentTeams==="boolean"?{enableAgentTeams:f.enableAgentTeams}:{}}}}function r7(f,$){if($.disabledToolIds?.has(f))return!1;let{flags:W}=l7($);if(f==="spawn_agent")return W.enableSpawnAgent===!0;if(f==="teams")return W.enableAgentTeams===!0;if(f==="editor")return W.enableEditor===!0||W.enableApplyPatch===!0;let J=CB[f];return J?W[J]===!0:!1}function NB(f,$){if(f.id==="editor"){let{flags:W}=l7($),J=W.enableApplyPatch===!0&&W.enableEditor!==!0;return{...f,defaultEnabled:r7(f.id,$),headlessToolNames:[J?"apply_patch":"editor"]}}return{...f,defaultEnabled:r7(f.id,$)}}function h$(f={}){return OB.map(($)=>NB($,f))}function S8(f={}){return h$(f).filter(($)=>$.defaultEnabled).map(($)=>$.id)}function k8(f){if(!f.enabled)return new Set;let $=h$(f.availabilityContext),W=new Set($.map((J)=>J.id));if(!f.allowlist||f.allowlist.length===0)return new Set($.filter((J)=>J.defaultEnabled).map((J)=>J.id));for(let J of f.allowlist)if(!W.has(J))throw Error(`Unknown tool "${J}". Available tools: ${$.map((H)=>H.id).join(", ")}`);return new Set(f.allowlist)}function x2(f,$={}){return h$($).filter((W)=>f.has(W.id)).flatMap((W)=>W.headlessToolNames)}function m8(f,$={}){return x2(f,$)}function K$(f={}){let{executorOptions:$={},executors:W,...J}=f,H={...Q1($),...W??{}};return S0({...J,executors:H})}import{mkdirSync as kB,writeFileSync as mB}from"node:fs";import{dirname as gB}from"node:path";import{normalizeUserInput as xB}from"@clinebot/shared";import{nanoid as IB}from"nanoid";var i7={};z(i7,{sanitizeSessionToken:()=>U$,parseTeamTaskSubSessionId:()=>T1,parseSubSessionId:()=>v2,makeTeamTaskSubSessionId:()=>I2,makeSubSessionId:()=>B1,deriveSubsessionStatus:()=>u2});import{nanoid as wB}from"nanoid";function U$(f){return f.replace(/[^a-zA-Z0-9._-]+/g,"_")}function B1(f,$){let W=U$(f),J=U$($),H=`${W}__${J}`;return H.length>180?H.slice(0,180):H}function I2(f,$){let W=U$(f),J=U$($);return`${W}__teamtask__${J}__${wB(6)}`}function T1(f){let W=f.indexOf("__teamtask__");if(W<=0)return null;let J=f.slice(0,W),H=f.slice(W+12),Q=H.lastIndexOf("__");if(Q<=0)return null;let Z=H.slice(0,Q),P=H.slice(Q+2);if(!J||!Z||!P)return null;return{rootSessionId:J,agentId:Z,teamTaskId:P}}function v2(f){if(T1(f))return null;let $="__",W=f.indexOf($);if(W<=0)return null;let J=f.slice(0,W),H=f.slice(W+$.length);if(!J||!H)return null;return{rootSessionId:J,agentId:H}}function u2(f){switch(f.hookName){case"agent_end":return"completed";case"agent_error":return"failed";case"session_shutdown":{let $=String(f.reason??"").toLowerCase();if($.includes("cancel")||$.includes("abort")||$.includes("interrupt"))return"cancelled";if($.includes("fail")||$.includes("error"))return"failed";return"completed"}default:return"running"}}import{z as i}from"zod";var n7={};z(n7,{SessionSource:()=>jf,SESSION_STATUSES:()=>c2});import{SESSION_STATUS_VALUES as EB}from"@clinebot/shared";var c2=EB,jf={CORE:"core",CLI:"cli",SUBAGENT:"subagent",DESKTOP:"desktop",KANBAN:"kanban",API:"api",WEB:"web",VSCODE:"vscode",ENTERPRISE:"enterprise",IDE:"ide",JETBRAINS:"jetbrains",NEOVIM:"neovim",UNKNOWN:"unknown"};var SB=i.enum(c2),hf=i.object({version:i.literal(1),session_id:i.string().min(1),source:i.string().min(1),pid:i.number().int(),started_at:i.string().min(1),ended_at:i.string().min(1).optional(),exit_code:i.number().int().nullable().optional(),status:SB,interactive:i.boolean(),provider:i.string().min(1),model:i.string().min(1),cwd:i.string().min(1),workspace_root:i.string().min(1),team_name:i.string().min(1).optional(),enable_tools:i.boolean(),enable_spawn:i.boolean(),enable_teams:i.boolean(),prompt:i.string().optional(),metadata:i.record(i.string(),i.unknown()).optional(),messages_path:i.string().min(1).optional()});function a7(f){if(!f)return!1;return Object.values(f).some(($)=>typeof $==="function")}function uJ(f,$){let W=[...f??[],...$??[]];if(W.length===0)return;let J=[],H=new Set;for(let Q of W){if(H.has(Q.name))continue;H.add(Q.name),J.push(Q)}return J}function t7(f){return JSON.stringify(f,($,W)=>{if(W instanceof Error)return{name:W.name,message:W.message,stack:W.stack};return W})}function B0(f){return typeof f==="string"&&f.trim()?f.trim():void 0}function vJ(f,$){let W={...f};W.id=B0(W.id)??IB();let J=W.modelInfo&&typeof W.modelInfo==="object"?{...W.modelInfo}:void 0,H={id:B0(J?.id)??B0(W.modelId)??B0($?.id),provider:B0(J?.provider)??B0(W.providerId)??B0($?.provider),family:B0(J?.family)??B0($?.family)};if(delete W.providerId,delete W.modelId,H.id&&H.provider)W.modelInfo={id:H.id,provider:H.provider,...H.family?{family:H.family}:{}};else delete W.modelInfo;return W}function g8(f){return f.map(($)=>vJ($))}function x8(f,$,W=[]){let J=f.map((P,j)=>{let R=W[j],A=R?.role===P.role&&JSON.stringify(R.content)===JSON.stringify(P.content)?{...R,...P}:{...P};return vJ(A)}),H=W.length,Q=[];for(let P=H;P<J.length;P+=1)if(J[P]?.role==="assistant")Q.push(P);if(Q.length===0){let P=[...J].reverse().findIndex((j)=>j.role==="assistant");if(P===-1)return J;Q.push(J.length-1-P)}let Z=Q[Q.length-1];for(let P of Q){let j=J[P],R=j.metrics;if(!R&&P===Z){let X=$.usage;R={inputTokens:X.inputTokens,outputTokens:X.outputTokens,cacheReadTokens:X.cacheReadTokens??0,cacheWriteTokens:X.cacheWriteTokens??0,cost:X.totalCost}}J[P]={...vJ(j,{id:$.model.id,provider:$.model.provider,family:$.model.info?.family}),...R?{metrics:R}:{},ts:j.ts??$.endedAt.getTime()}}return J}function d2(f){return{sessionId:f.sessionId,source:f.source,pid:f.pid,startedAt:f.startedAt,endedAt:f.endedAt??null,exitCode:f.exitCode??null,status:f.status,interactive:f.interactive,provider:f.provider,model:f.model,cwd:f.cwd,workspaceRoot:f.workspaceRoot,teamName:f.teamName??void 0,enableTools:f.enableTools,enableSpawn:f.enableSpawn,enableTeams:f.enableTeams,parentSessionId:f.parentSessionId??void 0,parentAgentId:f.parentAgentId??void 0,agentId:f.agentId??void 0,conversationId:f.conversationId??void 0,isSubagent:f.isSubagent,prompt:f.prompt??void 0,metadata:f.metadata??void 0,messagesPath:f.messagesPath??void 0,updatedAt:f.updatedAt}}var vB=120;function M$(f){let $=f?.trim();return $?$.slice(0,vB):void 0}function cJ(f){let $=xB(f??"").trim();if(!$)return;return M$($.split(`
135
+ `)[0]?.trim())}function x0(f){if(!f)return;let $={...f},W=M$(typeof $.title==="string"?$.title:void 0);if(W)$.title=W;else delete $.title;return Object.keys($).length>0?$:void 0}function r2(f){let $=x0(f.metadata)??{},W=f.title!==void 0?M$(f.title):cJ(f.prompt);if(W)$.title=W;return Object.keys($).length>0?$:void 0}function dJ(f){let $=T1(f);if($)return{agent:"teammate",sessionId:$.rootSessionId,taskType:"team"};let W=v2(f);if(W)return{agent:"subagent",sessionId:W.rootSessionId,taskType:"subagent_task"};return{agent:"lead",sessionId:f}}function rJ(f){return{version:1,updated_at:f.updatedAt,agent:f.context.agent,sessionId:f.context.sessionId,...f.context.taskType?{taskType:f.context.taskType}:{},messages:g8(f.messages),...f.systemPrompt?{system_prompt:f.systemPrompt}:{}}}function s7(f,$,W){kB(gB(f),{recursive:!0}),mB(f,`${JSON.stringify(rJ({updatedAt:$,context:W,messages:[]}),null,2)}
136
+ `,"utf8")}function o7(f,$){return hf.parse({version:1,session_id:f.sessionId,source:f.source,pid:f.pid,started_at:f.startedAt,ended_at:$?.endedAt??f.endedAt??void 0,exit_code:$?.exitCode??f.exitCode??void 0,status:$?.status??f.status,interactive:f.interactive,provider:f.provider,model:f.model,cwd:f.cwd,workspace_root:f.workspaceRoot,team_name:f.teamName??void 0,enable_tools:f.enableTools,enable_spawn:f.enableSpawn,enable_teams:f.enableTeams,prompt:f.prompt??void 0,metadata:$?.metadata??f.metadata??void 0,messages_path:f.messagesPath??void 0})}async function e7(f,$,W){let J=0;while(!0){let H=await f();if(H===void 0)return{updated:!1};let Q=await $(H);if(typeof Q==="object"&&Q!==null&&"updated"in Q&&Q.updated===!1){if(J+=1,J>=W)return Q;continue}return Q}}Kf();var HQ={};z(HQ,{summarizeUsageFromMessages:()=>n2,getCurrentContextSize:()=>lJ,createInitialAccumulatedUsage:()=>G$,accumulateUsageTotals:()=>u0});function G$(){return{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,totalCost:0}}function u0(f,$){return{inputTokens:f.inputTokens+Math.max(0,$.inputTokens??0),outputTokens:f.outputTokens+Math.max(0,$.outputTokens??0),cacheReadTokens:f.cacheReadTokens+Math.max(0,$.cacheReadTokens??0),cacheWriteTokens:f.cacheWriteTokens+Math.max(0,$.cacheWriteTokens??0),totalCost:f.totalCost+Math.max(0,$.totalCost??0)}}function F1(f){return typeof f==="number"&&Number.isFinite(f)?f:0}function n2(f){let $=G$();for(let W of f){let J=W.metrics;if(!J)continue;$=u0($,{inputTokens:F1(J.inputTokens),outputTokens:F1(J.outputTokens),cacheReadTokens:F1(J.cacheReadTokens),cacheWriteTokens:F1(J.cacheWriteTokens),totalCost:F1(J.cost)})}return $}function lJ(f){for(let $=f.length-1;$>=0;$-=1){let W=f[$];if(W?.role!=="assistant")continue;let J=F1(W.metrics?.inputTokens);return J>0?J:void 0}return}function dB(f){if(!f||typeof f!=="object")return;let $=f,W=$.skill??$.skill_name??$.skillName;if(typeof W!=="string")return;let J=W.trim();return J.length>0?J:void 0}function pJ(f){if(!f||typeof f!=="object")return{};let $=f;return{agentId:typeof $.agentId==="string"?$.agentId:void 0,conversationId:typeof $.conversationId==="string"?$.conversationId:void 0,parentAgentId:typeof $.parentAgentId==="string"?$.parentAgentId:void 0}}function h0(f){let $=f.agentId?.trim();if(!$)return;let W=f.parentAgentId?.trim()||void 0,J=f.teamRole,H="root";if(J==="teammate")H="team_teammate";else if(J==="lead")H="team_lead";else if(W)H="subagent";return{agentId:$,agentKind:H,conversationId:f.conversationId?.trim()||void 0,parentAgentId:W,createdByAgentId:f.createdByAgentId?.trim()||W||void 0,isSubagent:Boolean(W),teamId:f.teamId?.trim()||void 0,teamName:f.teamName?.trim()||void 0,teamRole:J,teamAgentId:f.teamAgentId?.trim()||void 0}}function iJ(f,$,W){let{sessionId:J,config:H,liveSession:Q,emit:Z}=f,P=H.telemetry,j=Q?.runtime.teamRuntime,R=W?.isPrimaryAgentEvent??!0,X=pJ($),A=h0({agentId:W?.agentId??X.agentId,conversationId:W?.conversationId??X.conversationId,parentAgentId:W?.parentAgentId??X.parentAgentId,createdByAgentId:W?.createdByAgentId,teamId:W?.teamId??j?.getTeamId(),teamName:W?.teamName??j?.getTeamName(),teamRole:W?.teamRole,teamAgentId:W?.teamAgentId});if($.type==="content_start"&&$.contentType==="tool"&&$.toolName==="skills"){let V=dB($.input);if(V)i8(P,{ulid:J,skillName:V,skillSource:"project",skillsAvailableGlobal:0,skillsAvailableProject:0,provider:H.providerId,modelId:H.modelId,...A})}if($.type==="content_end"&&$.contentType==="tool"){let V=$.toolName??"unknown",B=!$.error;if(p8(P,{ulid:J,tool:V,autoApproved:void 0,success:B,modelId:H.modelId,provider:H.providerId,...A}),!B&&(V==="editor"||V==="apply_patch"))n8(P,{ulid:J,modelId:H.modelId,provider:H.providerId,errorType:$.error,...A})}if($.type==="notice"&&$.reason==="api_error")p2(P,{ulid:J,model:H.modelId,provider:H.providerId,errorMessage:$.message,...A});if($.type==="error")p2(P,{ulid:J,model:H.modelId,provider:H.providerId,errorMessage:$.error?.message??"unknown error",...A});if($.type==="usage"&&R&&Q?.turnUsageBaseline)f.usageBySession.set(J,u0(Q.turnUsageBaseline,{inputTokens:$.inputTokens,outputTokens:$.outputTokens,cacheWriteTokens:$.cacheWriteTokens,cacheReadTokens:$.cacheReadTokens,totalCost:$.cost})),Y1(P,{ulid:J,provider:H.providerId,model:H.modelId,source:"assistant",mode:H.mode,...A}),r8(P,{ulid:J,tokensIn:$.inputTokens,tokensOut:$.outputTokens,cacheWriteTokens:$.cacheWriteTokens,cacheReadTokens:$.cacheReadTokens,totalCost:$.cost,model:H.modelId,...A});if($.type==="iteration_end"&&R)f.persistMessages(J,Q?.agent.getMessages()??[],Q?.config.systemPrompt);Z({type:"agent_event",payload:{sessionId:J,event:$,teamAgentId:W?.teamAgentId,teamRole:W!==void 0?W.teamRole??(R?"lead":void 0):void 0}}),Z({type:"chunk",payload:{sessionId:J,stream:"agent",chunk:t7($),ts:Date.now()}})}function c0(f){return f.workspaceRoot??f.cwd}import{hasRuntimeConfigExtension as fF}from"@clinebot/shared";function QQ(f){let $="";for(let W=0;W<f.length;W+=1)$+=String.fromCharCode(f[W]??0);return btoa($).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}async function rB(f){let W=new TextEncoder().encode(f),J=await crypto.subtle.digest("SHA-256",W);return new Uint8Array(J)}function lB(f=32){let $=new Uint8Array(f);return crypto.getRandomValues($),QQ($)}async function f4(){let f=lB(),$=QQ(await rB(f));return{verifier:f,challenge:$}}function $4(f){return f.endsWith("/")?f.slice(0,-1):f}function D$(f,$){return new URL($,`${$4(f)}/`).toString()}function y1(f,$={}){let W=f.trim();if(!W)return{};try{let J=new URL(W);return{code:J.searchParams.get("code")??void 0,state:J.searchParams.get("state")??void 0,provider:$.includeProvider?J.searchParams.get("provider")??void 0:void 0}}catch{}if($.allowHashCodeState&&W.includes("#")){let[J,H]=W.split("#",2);return{code:J||void 0,state:H||void 0}}if(W.includes("code=")){let J=new URLSearchParams(W);return{code:J.get("code")??void 0,state:J.get("state")??void 0,provider:$.includeProvider?J.get("provider")??void 0:void 0}}return{code:W}}function pB(f){if(typeof atob==="function")try{return atob(f)}catch{return null}if(typeof Buffer<"u")try{return Buffer.from(f,"base64").toString("utf8")}catch{return null}return null}function Tf(f){if(!f)return null;try{let $=f.split(".");if($.length!==3)return null;let W=$[1];if(!W)return null;let J=W.replace(/-/g,"+").replace(/_/g,"/"),H=J.padEnd(J.length+(4-J.length%4)%4,"="),Q=pB(H);if(!Q)return null;return JSON.parse(Q)}catch{return null}}function h1(f){try{let $=JSON.parse(f),W=$.error,J=typeof W==="string"?W:W&&typeof W==="object"&&typeof W.type==="string"?W.type:void 0,H=typeof $.error_description==="string"?$.error_description:typeof $.message==="string"?$.message:W&&typeof W==="object"&&typeof W.message==="string"?W.message:void 0;return{code:J,message:H}}catch{return{}}}function _$(f,$){return Date.now()>=f.expires-$}async function K1(f){if(!f.onManualCodeInput){let Q=await f.waitForCallback();return{code:Q?.code,state:Q?.state,provider:Q?.provider,error:Q?.error}}let $,W,J=f.onManualCodeInput().then((Q)=>{$=Q,f.cancelWait()}).catch((Q)=>{W=Q instanceof Error?Q:Error(String(Q)),f.cancelWait()}),H=await f.waitForCallback();if(W)throw W;if(H?.code||H?.error)return{code:H.code,state:H.state,provider:H.provider,error:H.error};if($)return y1($,f.parseOptions);if(await J,W)throw W;if($)return y1($,f.parseOptions);return{}}K0();import{existsSync as zT}from"node:fs";import{discoverPluginModulePaths as NT,resolveConfiguredPluginModulePaths as bT,resolvePluginConfigSearchPaths as qT}from"@clinebot/shared/storage";import{resolve as jT}from"node:path";import{normalizePluginManifest as RT}from"@clinebot/shared";import{existsSync as d0,readFileSync as sJ}from"node:fs";import{builtinModules as sB,createRequire as TQ}from"node:module";import{dirname as P4,extname as YQ,isAbsolute as oB,resolve as Yf}from"node:path";import{fileURLToPath as FQ}from"node:url";import{PLUGIN_FILE_EXTENSIONS as eB}from"@clinebot/shared";var fT=P4(FQ(import.meta.url)),yQ=TQ(import.meta.url),$T=Yf(fT,"..","..","..","..",".."),aJ=WT($T),oJ=new Set(sB.flatMap((f)=>[f,f.replace(/^node:/,"")])),Z4=new Set(eB);function WT(f){let $={},W={"@clinebot/agents":Yf(f,"packages/agents/src/index.ts"),"@clinebot/core":Yf(f,"packages/core/src/index.ts"),"@clinebot/llms":Yf(f,"packages/llms/src/index.ts"),"@clinebot/shared":Yf(f,"packages/shared/src/index.ts"),"@clinebot/shared/storage":Yf(f,"packages/shared/src/storage/index.ts"),"@clinebot/shared/db":Yf(f,"packages/shared/src/db/index.ts")};for(let[J,H]of Object.entries(W))if(d0(H))$[J]=H;return $}function hQ(f){return!(f.startsWith(".")||f.startsWith("/")||f.startsWith("file:")||f.startsWith("data:")||f.startsWith("http:")||f.startsWith("https:"))}function tJ(f){if(f.startsWith("@")){let[$,W]=f.split("/",3);return W?`${$}/${W}`:f}return f.split("/",1)[0]??f}function KQ(f,$){let W=tJ($),J=P4(f);while(!0){let H=Yf(J,"node_modules",W);if(d0(H)||d0(Yf(H,"package.json")))return!0;let Q=Yf(J,"..");if(Q===J)return!1;J=Q}}function JT(f){try{return yQ.resolve(f),!0}catch{return!1}}function HT(f){try{return yQ.resolve(f)}catch{return null}}function QT(f){let W=P4(f);for(let J=0;J<4;J++){let H=Yf(W,"package.json");if(d0(H))try{let Z=JSON.parse(sJ(H,"utf8"));return Z!=null&&typeof Z==="object"&&"cline"in Z}catch{return!1}let Q=Yf(W,"..");if(Q===W)return!1;W=Q}return!1}function ZT(f,$){let W=$.startsWith("file:")?FQ($):oB($)?$:Yf(P4(f),$);if(d0(W)&&Z4.has(YQ(W)))return W;for(let J of Z4){let H=`${W}${J}`;if(d0(H))return H}for(let J of Z4){let H=Yf(W,`index${J}`);if(d0(H))return H}return null}function UQ(f){let $=new Set,W=[/\bimport\s+(?:type\s+)?[^"'`]*?\bfrom\s*["'`]([^"'`]+)["'`]/g,/\bexport\s+[^"'`]*?\bfrom\s*["'`]([^"'`]+)["'`]/g,/\bimport\s*\(\s*["'`]([^"'`]+)["'`]\s*\)/g,/\brequire\s*\(\s*["'`]([^"'`]+)["'`]\s*\)/g];for(let J of W)for(let H of f.matchAll(J)){let Q=H[1];if(Q)$.add(Q)}return[...$]}function MQ(f,$,W=new Set){if(W.has(f)||!d0(f))return;if(W.add(f),!Z4.has(YQ(f)))return;let J=sJ(f,"utf8");for(let H of UQ(J)){if(H.startsWith("node:")||oJ.has(H))continue;if(hQ(H)){if(Object.hasOwn(aJ,H)||Object.hasOwn(aJ,tJ(H))||KQ(f,H)||$&&JT(H))continue;throw Error(`Cannot find module '${tJ(H)}'`)}let Q=ZT(f,H);if(Q)MQ(Q,$,W)}}function PT(f,$){let W=TQ(f),J={};for(let[H,Q]of Object.entries(aJ)){try{W.resolve(H);continue}catch{}J[H]=Q}if($){let H=sJ(f,"utf8");for(let Q of UQ(H)){if(!hQ(Q)||Q.startsWith("node:")||oJ.has(Q)||Object.hasOwn(J,Q)||KQ(f,Q))continue;let Z=HT(Q);if(Z)J[Q]=Z}}return J}async function GQ(f,$={}){let W=!QT(f);MQ(f,W);let J=PT(f,W),H=await import("jiti"),Q=typeof H==="function"?H:typeof H.default==="function"?H.default:void 0;if(!Q)throw Error("Unable to load jiti");return await Q(f,{alias:J,cache:$.useCache,requireCache:$.useCache,esmResolve:!0,interopDefault:!1,nativeModules:[...oJ],transformModules:Object.keys(J)}).import(f,{})}function DQ(f,$){if(!f)return!0;if(f.providerIds?.length){if(!$?.providerId||!f.providerIds.includes($.providerId))return!1}if(f.modelIds?.length){if(!$?.modelId||!f.modelIds.includes($.modelId))return!1}return!0}function _Q(f){return typeof f==="object"&&f!==null}function eJ(f){return Array.isArray(f)&&f.every(($)=>typeof $==="string")}function XT(f,$){if(!_Q(f.manifest))throw Error(`Invalid plugin module at ${$}: missing required "manifest"`);if(!eJ(f.manifest.capabilities))throw Error(`Invalid plugin module at ${$}: manifest.capabilities must be a string array`);if(f.manifest.capabilities.length===0)throw Error(`Invalid plugin module at ${$}: manifest.capabilities cannot be empty`);if(Object.hasOwn(f.manifest,"providerIds")&&!eJ(f.manifest.providerIds))throw Error(`Invalid plugin module at ${$}: manifest.providerIds must be a string array when provided`);if(Object.hasOwn(f.manifest,"modelIds")&&!eJ(f.manifest.modelIds))throw Error(`Invalid plugin module at ${$}: manifest.modelIds must be a string array when provided`)}function AT(f,$){if(!_Q(f))throw Error(`Invalid plugin module at ${$}: expected object export`);if(typeof f.name!=="string"||f.name.length===0)throw Error(`Invalid plugin module at ${$}: expected non-empty "name"`);if(!Object.hasOwn(f,"manifest"))throw Error(`Invalid plugin module at ${$}: missing required "manifest"`);XT(f,$)}async function o2(f,$={}){let W=jT($.cwd??process.cwd(),f),J=await GQ(W,{useCache:$.useCache}),H=$.exportName??"plugin",Q=J.default??J[H];AT(Q,W);let Z=Q,P=Z.setup,j=P?(R,X)=>{let A={...$.session,...X.session},V={...X,session:Object.keys(A).length>0?A:void 0,client:$.client??X.client,user:$.user??X.user,workspaceInfo:$.workspaceInfo??X.workspaceInfo,automation:$.automation??X.automation,logger:$.logger??X.logger,telemetry:$.telemetry??X.telemetry};return P(R,V)}:void 0;return{...Z,manifest:RT(Z.manifest),setup:j}}async function j4(f,$={}){return(await U0(f,$)).plugins}async function U0(f,$={}){let W=[],J=[],H=new Map,Q=0;for(let Z of f)try{let P=await o2(Z,$);if(!DQ(P.manifest,$))continue;let j=H.get(P.name);if(j)J.push({type:"duplicate_plugin_override",pluginName:P.name,pluginPath:Z,overriddenPluginPath:j.pluginPath,message:`Plugin "${P.name}" from ${Z} overrides ${j.pluginPath}`});H.set(P.name,{plugin:P,pluginPath:Z,order:Q++})}catch(P){let j=P instanceof Error?P.message:String(P);W.push({pluginPath:Z,phase:"load",message:j,stack:P instanceof Error?P.stack:void 0})}return{plugins:[...H.values()].sort((Z,P)=>Z.order-P.order).map((Z)=>Z.plugin),failures:W,warnings:J}}import{existsSync as FT}from"node:fs";import{createRequire as yT}from"node:module";import{dirname as hT,join as R4}from"node:path";import{fileURLToPath as KT}from"node:url";var NQ={};z(NQ,{resolveSubprocessRuntimeExecutable:()=>fH,buildSubprocessSandboxCommand:()=>zQ,SubprocessSandbox:()=>U1,CLINE_JS_RUNTIME_PATH_ENV:()=>CQ});import{spawn as VT}from"node:child_process";import{basename as BT}from"node:path";import{augmentNodeCommandForDebug as TT,withResolvedClineBuildEnv as YT}from"@clinebot/shared";function LQ(f){if(f instanceof Error)return f;return Error(String(f))}var CQ="CLINE_JS_RUNTIME_PATH";function OQ(f){let $=f?.trim();if(!$)return!1;let W=BT($).toLowerCase();return W==="node"||W==="node.exe"||W==="bun"||W==="bun.exe"}function fH(f={}){let $=f.env??process.env,W=f.runtimeExecutable?.trim()||$[CQ]?.trim();if(W)return W;let J=f.execPath?.trim()||process.execPath;if(OQ(J))return J;for(let H of[$.BUN_EXEC_PATH,$.npm_node_execpath,$.NODE]){let Q=H?.trim();if(Q&&OQ(Q))return Q}return"node"}function zQ(f,$={}){let W=fH({env:$.env,execPath:$.execPath,runtimeExecutable:$.runtimeExecutable});return TT([W,...f],{env:$.env,execArgv:$.execArgv,debugRole:$.name==="plugin-sandbox"?"plugin-sandbox":"sandbox"})}class U1{options;process=null;requestCounter=0;pending=new Map;constructor(f){this.options=f}get processLabel(){return this.options.name??"sandbox"}clearPendingRequest(f){let $=this.pending.get(f);if(!$)return;if(this.pending.delete(f),$.timeout)clearTimeout($.timeout);return $}start(){if(this.process&&this.process.exitCode===null)return;let f=this.options.bootstrapFile?[this.options.bootstrapFile]:["-e",this.options.bootstrapScript??""],$=zQ(f,{name:this.options.name,runtimeExecutable:this.options.runtimeExecutable}),W=VT($[0]??fH(this.options),$.slice(1),{stdio:["ignore","ignore","pipe","ipc"],env:YT(process.env)});this.process=W;let J="",H=(Q)=>{let Z=J+Q;J=Z.length>4000?Z.slice(-4000):Z};W.stderr?.setEncoding("utf8"),W.stderr?.on("data",(Q)=>{H(Q)}),W.on("message",(Q)=>{this.onMessage(Q)}),W.on("error",(Q)=>{this.failPending(Error(`${this.processLabel} process error: ${LQ(Q).message}`))}),W.on("exit",(Q,Z)=>{this.process=null;let P=J.trim();this.failPending(Error(`${this.options.name??"sandbox"} process exited (code=${String(Q)}, signal=${String(Z)})${P?`: ${P}`:""}`))})}async call(f,$,W={}){this.start();let J=this.process;if(!J||J.exitCode!==null)throw Error(`${this.processLabel} process is not available`);let H=`req_${++this.requestCounter}`,Q={type:"call",id:H,method:f,args:$};return await new Promise((Z,P)=>{let j={resolve:(R)=>Z(R),reject:P};if((W.timeoutMs??0)>0)j.timeout=setTimeout(()=>{this.clearPendingRequest(H),this.shutdown().catch(()=>{}),P(Error(`${this.processLabel} call timed out after ${W.timeoutMs}ms: ${f}`))},W.timeoutMs);this.pending.set(H,j),J.send(Q,(R)=>{if(!R)return;let X=this.clearPendingRequest(H);if(!X)return;X.reject(Error(`${this.processLabel} failed to send call "${f}": ${LQ(R).message}`))})})}async shutdown(){let f=this.process;if(this.process=null,!f||f.exitCode!==null){this.failPending(Error(`${this.processLabel} shutdown`));return}await new Promise(($)=>{let W=setTimeout(()=>{try{f.kill("SIGKILL")}catch{}$()},300);f.once("exit",()=>{clearTimeout(W),$()});try{f.kill("SIGTERM")}catch{clearTimeout(W),$()}}),this.failPending(Error(`${this.processLabel} shutdown`))}onMessage(f){if(!f)return;if(f.type==="event"){if(typeof f.name==="string"&&f.name.length>0)this.options.onEvent?.({name:f.name,payload:f.payload});return}if(f.type!=="response"||!f.id)return;let $=this.clearPendingRequest(f.id);if(!$)return;if(f.ok){$.resolve(f.result);return}$.reject(Error(f.error?.message||`${this.processLabel} call failed`))}failPending(f){for(let[$,W]of this.pending.entries()){if(this.pending.delete($),W.timeout)clearTimeout(W.timeout);W.reject(f)}}}function UT(f){return{...f,contributions:{tools:f.contributions?.tools??[],commands:f.contributions?.commands??[],messageBuilders:f.contributions?.messageBuilders??[],providers:f.contributions?.providers??[],automationEventTypes:f.contributions?.automationEventTypes??[],shortcuts:f.contributions?.shortcuts??[],flags:f.contributions?.flags??[]}}}function X4(f){return(f instanceof Error?f.message:String(f)).includes("Unknown sandbox plugin id:")}function MT(){let f=hT(KT(import.meta.url)),$=yT(import.meta.url),W=[R4(f,"plugin-sandbox-bootstrap.js"),R4(f,"extensions","plugin-sandbox-bootstrap.js"),R4(f,"agents","plugin-sandbox-bootstrap.js")];for(let Q of W)if(FT(Q))return{file:Q};let J=R4(f,"plugin-sandbox-bootstrap.ts"),H="jiti";try{H=$.resolve("jiti")}catch{}return{script:[`const createJiti = require(${JSON.stringify(H)});`,`const jiti = createJiti(${JSON.stringify(J)}, { cache: false, requireCache: false, esmResolve: true, interopDefault: false });`,`Promise.resolve(jiti.import(${JSON.stringify(J)}, {})).catch((error) => {`," console.error(error);"," process.exitCode = 1;","});"].join(`
137
+ `)}}var $H=MT();function WH(f,$){return typeof f==="number"&&f>0?f:$}async function qQ(f){let $=new U1({name:"plugin-sandbox",..."file"in $H?{bootstrapFile:$H.file}:{bootstrapScript:$H.script},onEvent:f.onEvent}),W=WH(f.importTimeoutMs,4000),J=WH(f.hookTimeoutMs,3000),H=WH(f.contributionTimeoutMs,60000),Q={pluginPaths:f.pluginPaths,exportName:f.exportName,providerId:f.providerId,modelId:f.modelId,cwd:f.cwd,session:f.session,client:f.client,user:f.user,workspaceInfo:f.workspaceInfo,loggerEnabled:Boolean(f.logger)},Z,P=()=>{return Z??=$.call("initialize",Q,{timeoutMs:W}).finally(()=>{Z=void 0}),Z},j;try{j=await $.call("initialize",Q,{timeoutMs:W})}catch(A){throw await $.shutdown().catch(()=>{}),A}return{extensions:j.plugins.map(UT).map((A)=>{let V={name:A.name,manifest:A.manifest,setup:(B)=>{GT(B,$,A,H,P),DT(B,$,A,H,P),LT(B,$,A,H,P),_T(B,A)}};return V.hooks=CT($,A,J,P),V}),failures:j.failures,shutdown:async()=>{await $.shutdown()},warnings:j.warnings}}function GT(f,$,W,J,H){for(let Q of W.contributions?.tools??[]){let Z={name:Q.name,description:Q.description??"",inputSchema:Q.inputSchema??{type:"object",properties:{}},timeoutMs:Q.timeoutMs,retryable:Q.retryable,execute:async(P,j)=>{try{return await $.call("executeTool",{pluginId:W.pluginId,contributionId:Q.id,input:P,context:j},{timeoutMs:J})}catch(R){if(!X4(R))throw R;return await H(),await $.call("executeTool",{pluginId:W.pluginId,contributionId:Q.id,input:P,context:j},{timeoutMs:J})}}};f.registerTool(Z)}}function DT(f,$,W,J,H){for(let Q of W.contributions?.commands??[])f.registerCommand({name:Q.name,description:Q.description,handler:async(Z)=>{try{return await $.call("executeCommand",{pluginId:W.pluginId,contributionId:Q.id,input:Z},{timeoutMs:J})}catch(P){if(!X4(P))throw P;return await H(),await $.call("executeCommand",{pluginId:W.pluginId,contributionId:Q.id,input:Z},{timeoutMs:J})}}})}function _T(f,$){for(let W of $.contributions?.providers??[])f.registerProvider({name:W.name,description:W.description,metadata:W.metadata});for(let W of $.contributions?.automationEventTypes??[])f.registerAutomationEventType({eventType:W.eventType,source:W.source,description:W.description,attributesSchema:W.attributesSchema,payloadSchema:W.payloadSchema,examples:W.examples,metadata:W.metadata})}function LT(f,$,W,J,H){for(let Q of W.contributions?.messageBuilders??[])f.registerMessageBuilder({name:Q.name,async build(Z){try{let P=await $.call("buildMessages",{pluginId:W.pluginId,contributionId:Q.id,messages:Z},{timeoutMs:J});return bQ(P)?P:Z}catch(P){if(!X4(P))throw P;await H();let j=await $.call("buildMessages",{pluginId:W.pluginId,contributionId:Q.id,messages:Z},{timeoutMs:J});return bQ(j)?j:Z}}})}function bQ(f){return Array.isArray(f)&&f.every(($)=>typeof $==="object"&&$!==null&&("role"in $)&&("content"in $))}function OT(f,$,W,J,H){return async(Q)=>{try{return await f.call("invokeHook",{pluginId:$,hookName:W,payload:Q},{timeoutMs:J})}catch(Z){if(!X4(Z))throw Z;return await H(),await f.call("invokeHook",{pluginId:$,hookName:W,payload:Q},{timeoutMs:J})}}}function CT(f,$,W,J){let H={};for(let Q of $.hooks??[])H[Q]=OT(f,$.pluginId,Q,W,J);return Object.keys(H).length>0?H:void 0}function e2(f){return qT(f)}function fW(f){return NT(f)}function C$(f={}){let $=f.cwd??process.cwd(),W=e2(f.workspacePath).flatMap((Z)=>fW(Z)).filter((Z)=>zT(Z)),J=bT(f.pluginPaths??[],$),H=[],Q=new Set;for(let Z of[...J,...W]){if(Q.has(Z))continue;Q.add(Z),H.push(Z)}return H4(H)}async function M1(f={}){let $=C$(f);if($.length===0)return{extensions:[],failures:[],warnings:[]};if(f.mode==="in_process"){let J=await U0($,{cwd:f.cwd,exportName:f.exportName,providerId:f.providerId,modelId:f.modelId,session:f.session,client:f.client,user:f.user,workspaceInfo:f.workspaceInfo,automation:f.automation,logger:f.logger,telemetry:f.telemetry});return{extensions:J.plugins,failures:J.failures,warnings:J.warnings}}let W=await qQ({pluginPaths:$,exportName:f.exportName,importTimeoutMs:f.importTimeoutMs,hookTimeoutMs:f.hookTimeoutMs,contributionTimeoutMs:f.contributionTimeoutMs,onEvent:f.onEvent,providerId:f.providerId,modelId:f.modelId,cwd:f.cwd,session:f.session,client:f.client,user:f.user,workspaceInfo:f.workspaceInfo,logger:f.logger});return{extensions:W.extensions??[],shutdown:W.shutdown,failures:W.failures,warnings:W.warnings}}import{execFile as wT}from"node:child_process";import{promisify as ET}from"node:util";var ST=ET(wT);function JH(f,$){f?.log($,{severity:"warn"})}function kT(f){let $=f?.checkpoint;if(!$||typeof $!=="object"||Array.isArray($))return;let W=$;if(!W.latest||!Array.isArray(W.history))return;let J=W.latest,H=W.history.filter((Q)=>!!Q&&typeof Q==="object"&&typeof Q.ref==="string"&&typeof Q.createdAt==="number"&&typeof Q.runCount==="number");if(typeof J.ref!=="string"||typeof J.createdAt!=="number"||typeof J.runCount!=="number")return;return{latest:J,history:H}}async function z$(f,$){let W=await ST("git",["-C",f,...$],{windowsHide:!0});return{stdout:W.stdout.trim(),stderr:W.stderr.trim()}}async function HH(f,$){if(!f)return;let W=`refs/cline/checkpoints/${$}/`;try{let{stdout:J}=await z$(f,["for-each-ref","--format=%(refname)",W]),H=J.trim().split(`
138
+ `).filter(Boolean);await Promise.allSettled(H.map((Q)=>z$(f,["update-ref","-d",Q])))}catch{}}async function wQ(f,$,W){if(!f||W.length===0)return;await Promise.allSettled(W.map((J)=>z$(f,["update-ref",`refs/cline/checkpoints/${$}/${J.runCount}`,J.ref])))}function mT(f,$){let W=f.findIndex((J)=>J.runCount===$.runCount);if(W<0)return[...f,$];return f.map((J,H)=>H===W?$:J)}function EQ(f){let $=f.initialRunCount??0,W,J=async()=>{if(W!==void 0)return W;try{W=(await z$(f.cwd,["rev-parse","--is-inside-work-tree"])).stdout==="true"}catch{W=!1}return W},H=async()=>{if(f.createCheckpoint)return await f.createCheckpoint({cwd:f.cwd,sessionId:f.sessionId,runCount:$});if(!await J())return;let Q=async(R)=>{try{let A=(await z$(f.cwd,["rev-parse","HEAD"])).stdout.trim();if(!A)return;return{ref:A,createdAt:Date.now(),runCount:$,kind:"commit"}}catch(X){JH(f.logger,`${R}: ${X instanceof Error?X.message:String(X)}`);return}},Z=`cline checkpoint session=${f.sessionId} run=${$}`,P="";try{P=(await z$(f.cwd,["stash","create",Z])).stdout.trim()}catch(R){return JH(f.logger,`Checkpoint snapshot failed: ${R instanceof Error?R.message:String(R)}`),Q("Checkpoint HEAD fallback failed")}if(!P)return Q("Checkpoint HEAD fallback failed");let j=`refs/cline/checkpoints/${f.sessionId}/${$}`;try{await z$(f.cwd,["update-ref",j,P])}catch(R){JH(f.logger,`Checkpoint store failed: ${R instanceof Error?R.message:String(R)}`);return}return{ref:P,createdAt:Date.now(),runCount:$,kind:"stash"}};return{beforeRun:async({snapshot:Q})=>{if(Q.parentAgentId!=null)return;$+=1;return},beforeModel:async({snapshot:Q})=>{if(Q.parentAgentId!=null||Q.iteration!==1||$<1)return;let Z=await H();if(!Z)return;let P=await f.readSessionMetadata(),j=kT(P);if(j?.latest.ref===Z.ref)return;let R=mT(j?.history??[],Z);await f.writeSessionMetadata({...P??{},checkpoint:{latest:Z,history:R}});return}}}import{spawn as lT}from"node:child_process";import{appendFileSync as pT,readFileSync as iT}from"node:fs";import{join as nT}from"node:path";import{augmentNodeCommandForDebug as mQ,withResolvedClineBuildEnv as PH}from"@clinebot/shared";import{ensureHookLogDir as SQ}from"@clinebot/shared/storage";function G1(f,$){if(!$)return;return{name:f,manifest:{capabilities:["hooks"]},hooks:$}}import{existsSync as gT,readdirSync as xT}from"node:fs";import{basename as IT,extname as vT,join as uT}from"node:path";import{HOOKS_CONFIG_DIRECTORY_NAME as A4,resolveHooksConfigSearchPaths as cT}from"@clinebot/shared/storage";function $W(f){return cT(f)}var D1;((X)=>{X.TaskStart="TaskStart";X.TaskResume="TaskResume";X.TaskCancel="TaskCancel";X.TaskComplete="TaskComplete";X.TaskError="TaskError";X.PreToolUse="PreToolUse";X.PostToolUse="PostToolUse";X.UserPromptSubmit="UserPromptSubmit";X.PreCompact="PreCompact";X.SessionShutdown="SessionShutdown"})(D1||={});var WW={["TaskStart"]:"agent_start",["TaskResume"]:"agent_resume",["TaskCancel"]:"agent_abort",["TaskComplete"]:"agent_end",["TaskError"]:"agent_error",["PreToolUse"]:"tool_call",["PostToolUse"]:"tool_result",["UserPromptSubmit"]:"prompt_submit",["PreCompact"]:void 0,["SessionShutdown"]:"session_shutdown"},dT=new Map(Object.values(D1).map((f)=>[f.toLowerCase(),f])),rT=new Set(["",".sh",".bash",".zsh",".js",".mjs",".cjs",".ts",".mts",".cts",".py",".ps1"]);function JW(f){let $=vT(f).toLowerCase();if(!rT.has($))return;let W=IT(f,$).trim().toLowerCase();return dT.get(W)}function r0(f){let $=[],W=new Set,J=$W(f).filter((H)=>gT(H));for(let H of J)try{for(let Q of xT(H,{withFileTypes:!0})){if(!Q.isFile())continue;let Z=JW(Q.name);if(!Z)continue;let P=uT(H,Q.name);if(W.has(P))continue;W.add(P),$.push({fileName:Z,hookEventName:WW[Z],path:P})}}catch{}return $.sort((H,Q)=>H.path.localeCompare(Q.path))}function B4(f){if(!f||typeof f!=="object")return{};let $={};for(let[W,J]of Object.entries(f))$[W]=typeof J==="string"?J:JSON.stringify(J);return $}function V4(f,$,W){let J=W instanceof Error?`: ${W.message}`:"",H=`${$}${J}`;if(f){try{f.log(H,{severity:"warn",...W!==void 0?{error:W}:{}})}catch{}return}console.warn(H)}function aT(f,$){if(!$)return f;if(!f)return{...$};let W=[f.context,$.context].filter((H)=>typeof H==="string"&&H.length>0).join(`
139
+ `),J=[...f.appendMessages??[],...$.appendMessages??[]];return{cancel:f.cancel===!0||$.cancel===!0?!0:void 0,review:f.review===!0||$.review===!0?!0:void 0,context:W||void 0,overrideInput:$.overrideInput!==void 0?$.overrideInput:f.overrideInput,systemPrompt:$.systemPrompt!==void 0?$.systemPrompt:f.systemPrompt,appendMessages:J.length>0?J:void 0}}function tT(f){if(!f||typeof f!=="object")return;let $=f,W=typeof $.context==="string"?$.context:typeof $.contextModification==="string"?$.contextModification:typeof $.errorMessage==="string"?$.errorMessage:void 0;return{cancel:typeof $.cancel==="boolean"?$.cancel:void 0,review:typeof $.review==="boolean"?$.review:void 0,context:W,overrideInput:Object.hasOwn($,"overrideInput")?$.overrideInput:void 0}}function QH(f){let $=String(f??"").toLowerCase();return $.includes("cancel")||$.includes("abort")||$.includes("interrupt")}function Rf(f,$){let W=process.env.CLINE_USER_ID?.trim()||process.env.USER?.trim()||"unknown",J={rootSessionId:$.rootSessionId||f.conversationId};return{clineVersion:process.env.CLINE_VERSION?.trim()||"",timestamp:new Date().toISOString(),taskId:f.conversationId,sessionContext:J,workspaceRoots:$.workspacePath?[$.workspacePath]:[],workspaceInfo:$.workspaceInfo,userId:W,agent_id:f.agentId,parent_agent_id:f.parentAgentId}}function sT(f){let $=f.trim();if(!$)return{};let J=$.split(`
140
+ `).map((Q)=>Q.trim()).filter(Boolean).filter((Q)=>Q.startsWith("HOOK_CONTROL\t")).map((Q)=>Q.slice(13)),H=J.length>0?J[J.length-1]:$;try{return{parsedJson:JSON.parse(H)}}catch(Q){return{parseError:Q instanceof Error?Q.message:"Failed to parse hook stdout JSON"}}}async function oT(f,$){let W=f.stdin;if(!W)throw Error("hook command failed to create stdin");await new Promise((J,H)=>{let Q=!1,Z=()=>{W.off("error",j),W.off("finish",R),f.off("close",X)},P=(A)=>{if(Q)return;if(Q=!0,Z(),A){let V=A.code;if(V==="EPIPE"||V==="ERR_STREAM_DESTROYED"){J();return}H(A);return}J()},j=(A)=>P(A),R=()=>P(),X=()=>P();W.on("error",j),W.once("finish",R),f.once("close",X);try{W.end($)}catch(A){P(A)}})}async function gQ(f,$){if($.command.length===0)throw Error("runHookCommand requires non-empty command");try{return await kQ(f,$)}catch(W){let J=$Y($.command,process.platform,W);if(!J)throw W;return await kQ(f,{...$,command:J})}}async function kQ(f,$){let W=mQ($.command,{env:$.env,debugRole:"hook"}),J=lT(W[0],W.slice(1),{cwd:$.cwd,env:PH($.env),stdio:$.detached?["pipe","ignore","ignore"]:["pipe","pipe","pipe"],detached:$.detached}),H=new Promise((V)=>{J.once("spawn",()=>V())}),Q=new Promise((V,B)=>{J.once("error",(T)=>B(T))}),Z=JSON.stringify(f);if(await Promise.race([H,Q]),await oT(J,Z),$.detached){J.unref();return}if(!J.stdout||!J.stderr)throw Error("hook command failed to create stdout/stderr");let P="",j="",R=!1,X;J.stdout.on("data",(V)=>{P+=V.toString()}),J.stderr.on("data",(V)=>{j+=V.toString()});let A=new Promise((V)=>{if(($.timeoutMs??0)>0)X=setTimeout(()=>{R=!0,J.kill("SIGKILL")},$.timeoutMs);J.once("close",(B)=>{if(X)clearTimeout(X);let{parsedJson:T,parseError:h}=sT(P);V({exitCode:B,stdout:P,stderr:j,parsedJson:T,parseError:h,timedOut:R})})});return await Promise.race([A,Q])}function eT(f){try{let W=iT(f,"utf8").split(/\r?\n/,1)[0]?.trim();if(!W?.startsWith("#!"))return;let J=W.slice(2).trim();if(!J)return;let H=J.split(/\s+/).filter(Boolean);return H.length>0?H:void 0}catch{return}}function fY(f){return!!(f&&typeof f==="object"&&("code"in f)&&f.code==="ENOENT")}function $Y(f,$=process.platform,W){if($!=="win32"||!fY(W))return;if(f[0]!=="py"||f[1]!=="-3")return;return["python",...f.slice(2)]}function xQ(f){if(f.length===0)return;let[$,...W]=f,J=$.replace(/\\/g,"/").toLowerCase(),H=J.split("/").at(-1)??J;if(H==="env")return xQ(W);if(H==="bash"||H==="sh"||H==="zsh")return[H,...W];if(H==="python3"||H==="python")return process.platform==="win32"?["py","-3",...W]:[H,...W];return f}function WY(f){let $=eT(f);if($&&$.length>0)return[...xQ($)??$,f];let W=f.toLowerCase();if(W.endsWith(".sh")||W.endsWith(".bash")||W.endsWith(".zsh"))return["bash",f];if(W.endsWith(".js")||W.endsWith(".mjs")||W.endsWith(".cjs"))return mQ(["node",f],{debugRole:"hook"});if(W.endsWith(".ts")||W.endsWith(".mts")||W.endsWith(".cts"))return["bun","run",f];if(W.endsWith(".py"))return process.platform==="win32"?["py","-3",f]:["python3",f];if(W.endsWith(".ps1"))return[process.platform==="win32"?"powershell":"pwsh","-File",f];return["bash",f]}function JY(f){let $={};for(let W of r0(f)){if(!W.hookEventName)continue;let J=W.hookEventName,H=$[J]??[];H.push(WY(W.path)),$[J]=H}return $}async function HY(f){let $;for(let W of f.commands){let J=W.join(" ");try{let H=await gQ(f.payload,{command:W,cwd:f.cwd,env:PH(process.env),detached:!1,timeoutMs:f.timeoutMs});if(H?.timedOut){V4(f.logger,`hook command timed out: ${J}`);continue}if(H?.parseError){V4(f.logger,`hook command returned invalid JSON control output: ${J} (${H.parseError})`);continue}$=aT($,tT(H?.parsedJson))}catch(H){V4(f.logger,`hook command failed: ${J}`,H)}}return $}function N$(f){for(let $ of f.commands){let W=$.join(" ");gQ(f.payload,{command:$,cwd:f.cwd,env:PH(process.env),detached:!0}).catch((J)=>{V4(f.logger,`hook command failed: ${W}`,J)})}}function l0(f){return{agentId:f.agentId,conversationId:f.conversationId??f.runId??f.agentId,parentAgentId:f.parentAgentId??null}}function ZH(f,$){return{...l0(f.snapshot),userMessage:$}}function IQ(f){return{...l0(f.snapshot),iteration:f.snapshot.iteration,call:{id:f.toolCall.toolCallId,name:f.toolCall.toolName,input:f.input}}}function vQ(f){return{...l0(f.snapshot),iteration:f.snapshot.iteration,record:{id:f.toolCall.toolCallId,name:f.toolCall.toolName,input:f.input,output:f.result.output,error:f.result.isError?String(f.result.output):void 0,durationMs:f.durationMs,startedAt:f.startedAt,endedAt:f.endedAt}}}function uQ(f){return f.filter(($)=>$.type==="text"&&typeof $.text==="string").map(($)=>$.text).join("")}function QY(f){if(!f)return;let $={};if(f.cancel===!0)$.stop=!0;if(f.overrideInput!==void 0)$.input=f.overrideInput;return Object.keys($).length>0?$:void 0}function _1(f){let $={cwd:f.workspacePath,workspacePath:f.workspacePath,rootSessionId:f.rootSessionId,workspaceInfo:f.workspaceInfo},W=(J)=>{let H=`${JSON.stringify({ts:new Date().toISOString(),...J})}
141
+ `,Z=(process.env.CLINE_HOOKS_LOG_PATH?.trim()||void 0)??nT(SQ(),"hooks.jsonl");SQ(Z),pT(Z,H,"utf8")};return{beforeRun:async(J)=>{let H=ZH(J,"");W({...Rf(H,$),hookName:"agent_start",taskStart:{taskMetadata:{}}});return},beforeTool:async(J)=>{let H=IQ(J);W({...Rf(H,$),hookName:"tool_call",iteration:H.iteration,tool_call:{id:H.call.id,name:H.call.name,input:H.call.input},preToolUse:{toolName:H.call.name,parameters:B4(H.call.input)}});return},afterTool:async(J)=>{let H=vQ(J);W({...Rf(H,$),hookName:"tool_result",iteration:H.iteration,tool_result:H.record,postToolUse:{toolName:H.record.name,parameters:B4(H.record.input),result:typeof H.record.output==="string"?H.record.output:JSON.stringify(H.record.output),success:!H.record.error,executionTimeMs:H.record.durationMs}});return},afterRun:async({snapshot:J,result:H})=>{let Q=l0(J);if(H.status==="completed"){W({...Rf(Q,$),hookName:"agent_end",iteration:H.iterations,turn:{outputText:H.outputText,status:H.status},taskComplete:{taskMetadata:{}}});return}if(H.status==="aborted"||QH(H.error?.message)){W({...Rf(Q,$),hookName:"agent_abort",reason:H.error?.message,taskCancel:{taskMetadata:{}}});return}if(H.error)W({...Rf(Q,$),hookName:"agent_error",iteration:H.iterations,error:{name:H.error.name,message:H.error.message,stack:H.error.stack}})},onEvent:async(J)=>{if(J.type!=="message-added"||J.message.role!=="user")return;let H=ZH({snapshot:J.snapshot},uQ(J.message.content));W({...Rf(H,$),hookName:"prompt_submit",userPromptSubmit:{prompt:H.userMessage,attachments:[]}})}}}function HW(f){let $=JY(f.workspacePath);if(!Object.values($).some((A)=>A.length>0))return;let J=async(A,V)=>{let B=$[V]??[];if(B.length===0)return;N$({commands:B,cwd:f.cwd,logger:f.logger,payload:V==="agent_resume"?{...Rf(A,f),hookName:V,taskResume:{taskMetadata:{},previousState:{}}}:{...Rf(A,f),hookName:V,taskStart:{taskMetadata:{}}}})},H=async(A)=>{let V=$.prompt_submit??[];if(V.length>0)N$({commands:V,cwd:f.cwd,logger:f.logger,payload:{...Rf(A,f),hookName:"prompt_submit",userPromptSubmit:{prompt:A.userMessage,attachments:[]}}})},Q=async(A)=>{let V=$.tool_call??[];if(V.length===0)return;return HY({commands:V,cwd:f.cwd,logger:f.logger,timeoutMs:f.toolCallTimeoutMs??120000,payload:{...Rf(A,f),hookName:"tool_call",iteration:A.iteration,tool_call:{id:A.call.id,name:A.call.name,input:A.call.input},preToolUse:{toolName:A.call.name,parameters:B4(A.call.input)}}})},Z=async(A)=>{let V=$.tool_result??[];if(V.length===0)return;N$({commands:V,cwd:f.cwd,logger:f.logger,payload:{...Rf(A,f),hookName:"tool_result",iteration:A.iteration,tool_result:A.record,postToolUse:{toolName:A.record.name,parameters:B4(A.record.input),result:typeof A.record.output==="string"?A.record.output:JSON.stringify(A.record.output),success:!A.record.error,executionTimeMs:A.record.durationMs}}})},P=async(A)=>{let V=$.agent_end??[];if(V.length===0)return;N$({commands:V,cwd:f.cwd,logger:f.logger,payload:{...Rf(A,f),hookName:"agent_end",iteration:A.iteration,turn:A.turn,taskComplete:{taskMetadata:{}}}})},j=async(A)=>{let V=$.agent_error??[];if(V.length===0)return;N$({commands:V,cwd:f.cwd,logger:f.logger,payload:{...Rf(A,f),hookName:"agent_error",iteration:A.iteration,error:{name:A.error.name,message:A.error.message,stack:A.error.stack}}})},R=async(A)=>{if(QH(A.reason)){let B=$.agent_abort??[];if(B.length>0)N$({commands:B,cwd:f.cwd,logger:f.logger,payload:{...Rf(A,f),hookName:"agent_abort",reason:A.reason,taskCancel:{taskMetadata:{}}}})}let V=$.session_shutdown??[];if(V.length===0)return;N$({commands:V,cwd:f.cwd,logger:f.logger,payload:{...Rf(A,f),hookName:"session_shutdown",reason:A.reason}})},X={};if(($.agent_start?.length??0)>0||($.agent_resume?.length??0)>0||($.prompt_submit?.length??0)>0){if(($.agent_start?.length??0)>0||($.agent_resume?.length??0)>0)X.beforeRun=async(A)=>{let V=process.env.CLINE_HOOK_AGENT_RESUME==="1"?"agent_resume":"agent_start";await J(l0(A.snapshot),V);return};if(($.prompt_submit?.length??0)>0)X.onEvent=async(A)=>{if(A.type!=="message-added"||A.message.role!=="user")return;await H(ZH({snapshot:A.snapshot},uQ(A.message.content)))}}if(($.tool_call?.length??0)>0)X.beforeTool=async(A)=>{let V=await Q(IQ(A));return QY(V)};if(($.tool_result?.length??0)>0)X.afterTool=async(A)=>{await Z(vQ(A));return};if(($.agent_end?.length??0)>0)X.afterRun=async({snapshot:A,result:V})=>{if(V.status!=="completed")return;await P({...l0(A),iteration:V.iterations,turn:{outputText:V.outputText,status:V.status}})};if(($.agent_error?.length??0)>0||($.agent_abort?.length??0)>0||($.session_shutdown?.length??0)>0){let A=X.afterRun;X.afterRun=async(V)=>{await A?.(V);let{snapshot:B,result:T}=V;if(T.status==="aborted"||QH(T.error?.message)){await R({...l0(B),reason:T.error?.message});return}if(T.error)await j({...l0(B),iteration:T.iterations,error:T.error})}}return X}function L1(f){return G1("core.hook_config_files",HW(f))}function b$(f,$){let W=f.map((J)=>J[$]).filter((J)=>typeof J==="function");if(W.length===0)return;return async(J)=>{let H;for(let Q of W){let Z=await Q(J);if(!Z||typeof Z!=="object")continue;let P=Z;H={...H??{},...P,stop:H?.stop===!0||P.stop===!0?!0:P.stop,options:H?.options||P.options?{...H?.options??{},...P.options??{}}:void 0}}return H}}function q$(f){let $=f.filter((W)=>W!==void 0);if($.length===0)return;return{beforeRun:b$($,"beforeRun"),afterRun:b$($,"afterRun"),beforeModel:b$($,"beforeModel"),afterModel:b$($,"afterModel"),beforeTool:b$($,"beforeTool"),afterTool:b$($,"afterTool"),onEvent:b$($,"onEvent")}}var cQ={};z(cQ,{normalizeRuntimeCapabilities:()=>Xf});function Xf(...f){let $,W;for(let H of f){if(!H)continue;if(H.toolExecutors)$={...$??{},...H.toolExecutors};if(H.requestToolApproval)W=H.requestToolApproval}let J=$&&Object.keys($).length>0;if(!J&&!W)return;return{...J?{toolExecutors:$}:{},...W?{requestToolApproval:W}:{}}}var QZ={};z(QZ,{toProviderConfig:()=>bf,emptyStoredProviderSettings:()=>a0,StoredProviderSettingsSchema:()=>q1,StoredProviderSettingsEntrySchema:()=>d4,ProviderSettingsSchemaTyped:()=>BW});import{z as n0}from"zod";var HZ={};z(HZ,{toProviderConfig:()=>bf,safeParseSettings:()=>c4,safeCreateProviderConfig:()=>_H,parseSettings:()=>u4,normalizeProviderId:()=>b1,isBuiltInProviderId:()=>GH,createProviderConfig:()=>DH,SapSettingsSchema:()=>x4,ReasoningSettingsSchema:()=>S4,ProviderSettingsSchema:()=>i0,ProviderProtocolSchema:()=>q4,ProviderIdSchema:()=>VW,ProviderClientSchema:()=>w4,OcaSettingsSchema:()=>I4,ModelCatalogSettingsSchema:()=>v4,GcpSettingsSchema:()=>m4,BUILT_IN_PROVIDER_IDS:()=>MH,BUILT_IN_PROVIDER:()=>AW,AzureSettingsSchema:()=>g4,AwsSettingsSchema:()=>k4,AuthSettingsSchema:()=>E4});import*as Nf from"@clinebot/llms";import{z as _}from"zod";Kf();var sQ={};z(sQ,{refreshOcaToken:()=>ZW,loginOcaOAuth:()=>z1,getValidOcaCredentials:()=>PW,generateOcaOpcRequestId:()=>G4,createOcaRequestHeaders:()=>AH,createOcaOAuthProvider:()=>XH,OCI_HEADER_OPC_REQUEST_ID:()=>U4,DEFAULT_INTERNAL_OCA_BASE_URL:()=>O1,DEFAULT_INTERNAL_IDCS_URL:()=>Y4,DEFAULT_INTERNAL_IDCS_SCOPES:()=>F4,DEFAULT_INTERNAL_IDCS_CLIENT_ID:()=>T4,DEFAULT_EXTERNAL_OCA_BASE_URL:()=>C1,DEFAULT_EXTERNAL_IDCS_URL:()=>h4,DEFAULT_EXTERNAL_IDCS_SCOPES:()=>K4,DEFAULT_EXTERNAL_IDCS_CLIENT_ID:()=>y4});import{nanoid as rQ}from"nanoid";class jH{ttlMs;maxEntries;entries=new Map;constructor(f,$){this.ttlMs=f;this.maxEntries=$}get(f,$=Date.now()){this.pruneExpired($);let W=this.entries.get(f);if(!W)return;return this.entries.delete(f),this.entries.set(f,W),W.value}set(f,$,W=Date.now(),J=this.ttlMs){this.pruneExpired(W),this.entries.delete(f);while(this.entries.size>=this.maxEntries){let H=this.entries.keys().next().value;if(H===void 0)break;this.entries.delete(H)}this.entries.set(f,{value:$,expiresAt:W+J})}pruneExpired(f){for(let[$,W]of this.entries)if(W.expiresAt<=f)this.entries.delete($)}}var dQ={};z(dQ,{startLocalOAuthServer:()=>M0});function ZY(){let f;return{promise:new Promise((W)=>{f=W}),resolve:f}}async function M0(f){let $=await import("node:http"),W=f.host??"127.0.0.1",J=f.timeoutMs??300000,H=f.successHtml??PY,Q=ZY(),Z=!1,P=null,j=null,R=null,X=(B)=>{if(Z)return;Z=!0,Q.resolve(B)},A=()=>{if(P)clearTimeout(P),P=null;let B=R;if(R=null,j)j.close(),j=null;if(B!==null&&f.onClose)Promise.resolve(f.onClose({host:W,port:B})).catch(()=>{})},V=async()=>{return P=setTimeout(()=>{A(),X(null)},J),Q.promise};for(let B of f.ports){let T=$.createServer((F,Y)=>{try{let y=new URL(F.url||"",`http://${W}:${B}`);if(y.pathname!==f.callbackPath){Y.statusCode=404,Y.end("Not found");return}let D={url:y,code:y.searchParams.get("code")??void 0,state:y.searchParams.get("state")??void 0,provider:y.searchParams.get("provider")??void 0,error:y.searchParams.get("error")??void 0};if(D.error){Y.statusCode=400,Y.end(`Authentication failed: ${D.error}`),A(),X(D);return}if(!D.code){Y.statusCode=400,Y.end("Missing authorization code");return}if(f.expectedState&&D.state!==f.expectedState){Y.statusCode=400,Y.end("State mismatch");return}Y.statusCode=200,Y.setHeader("Content-Type","text/html; charset=utf-8"),Y.end(H),A(),X(D)}catch{Y.statusCode=500,Y.end("Internal error")}}),h=await new Promise((F)=>{let Y=(y)=>{T.off("error",Y),F({bound:!1,error:y})};T.once("error",Y),T.listen(B,W,()=>{T.off("error",Y),j=T,F({bound:!0})})});if(h.error){if(h.error.code==="EADDRINUSE")continue;throw A(),h.error}if(h.bound){R=B;let F=`http://${W}:${B}${f.callbackPath}`;if(f.onListening)await Promise.resolve(f.onListening({host:W,port:B,callbackUrl:F})).catch(()=>{});return{callbackUrl:F,waitForCallback:V,cancelWait:()=>{A(),X(null)},close:()=>{A(),X(null)}}}}return{callbackUrl:"",waitForCallback:async()=>null,cancelWait:()=>{},close:()=>{}}}var PY=`<!DOCTYPE html>
142
+ <html lang="en">
143
+ <head>
144
+ <meta charset="utf-8">
145
+ <meta name="viewport" content="width=device-width, initial-scale=1">
146
+ <title>Authentication Successful</title>
147
+ <style>
148
+ * { margin: 0; padding: 0; box-sizing: border-box; }
149
+ body {
150
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
151
+ min-height: 100vh;
152
+ display: flex;
153
+ align-items: center;
154
+ justify-content: center;
155
+ background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
156
+ color: #fff;
157
+ }
158
+ .container { text-align: center; padding: 48px; max-width: 420px; }
159
+ .icon {
160
+ width: 72px; height: 72px; margin: 0 auto 24px;
161
+ background: linear-gradient(135deg, #10a37f 0%, #1a7f64 100%);
162
+ border-radius: 50%;
163
+ display: flex; align-items: center; justify-content: center;
164
+ }
165
+ .icon svg { width: 36px; height: 36px; stroke: #fff; stroke-width: 3; fill: none; }
166
+ h1 { font-size: 24px; font-weight: 600; margin-bottom: 12px; }
167
+ p { font-size: 15px; color: rgba(255,255,255,0.7); line-height: 1.5; }
168
+ .closing { margin-top: 32px; font-size: 13px; color: rgba(255,255,255,0.5); }
169
+ </style>
170
+ </head>
171
+ <body>
172
+ <div class="container">
173
+ <div class="icon">
174
+ <svg viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"></polyline></svg>
175
+ </div>
176
+ <h1>Authentication Successful</h1>
177
+ <p>You're now signed in. You can close this window.</p>
178
+ <p class="closing">This window will close automatically...</p>
179
+ </div>
180
+ <script>setTimeout(() => window.close(), 3000);</script>
181
+ </body>
182
+ </html>`;var T4="a8331954c0cf48ba99b5dd223a14c6ea",Y4="https://idcs-9dc693e80d9b469480d7afe00e743931.identity.oraclecloud.com",F4="openid offline_access",O1="https://code-internal.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm",y4="c1aba3deed5740659981a752714eba33",h4="https://login-ext.identity.oraclecloud.com",K4="openid offline_access",C1="https://code.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm",U4="opc-request-id",jY="/auth/oca",RY=Array.from({length:11},(f,$)=>48801+$),XY=300000,AY=30000,lQ=30000,VY=600000;class M4 extends Error{status;errorCode;constructor(f,$){super(f);this.name="OcaOAuthTokenError",this.status=$?.status,this.errorCode=$?.errorCode}isLikelyInvalidGrant(){if(this.errorCode&&/invalid_grant|invalid_token|unauthorized/i.test(this.errorCode))return!0;return this.status===400||this.status===401||this.status===403}}var p0={internal:{clientId:T4,idcsUrl:Y4,scopes:F4,baseUrl:O1},external:{clientId:y4,idcsUrl:h4,scopes:K4,baseUrl:C1}},QW=new Map,BY=86400000,TY=300000,YY=32,RH=new jH(BY,YY);function pQ(f){if(typeof f==="function")return f();return f??"internal"}function iQ(f){return{internal:{clientId:f?.internal?.clientId??p0.internal.clientId,idcsUrl:f?.internal?.idcsUrl??p0.internal.idcsUrl,scopes:f?.internal?.scopes??p0.internal.scopes,baseUrl:f?.internal?.baseUrl??p0.internal.baseUrl},external:{clientId:f?.external?.clientId??p0.external.clientId,idcsUrl:f?.external?.idcsUrl??p0.external.idcsUrl,scopes:f?.external?.scopes??p0.external.scopes,baseUrl:f?.external?.baseUrl??p0.external.baseUrl}}}function FY(f=Date.now()){let $=f-VY;for(let[W,J]of QW.entries())if(J.createdAt<$)QW.delete(W)}function yY(f,$,W){if(typeof f.expires_in==="number"&&f.expires_in>0)return Date.now()+f.expires_in*1000;let H=Tf($)?.exp;if(typeof H==="number"&&H>0)return H*1000;let Z=Tf(W)?.exp;if(typeof Z==="number"&&Z>0)return Z*1000;return Date.now()+3600000}function nQ(f,$,W){let J=f.access_token;if(!J)throw Error("Token response did not include an access token");let H=f.refresh_token??W?.refresh;if(!H)throw Error("Token response did not include a refresh token");let Q=Tf(f.id_token),Z=Tf(J),P=Q?.sub??Z?.sub,j=Q?.email??Z?.email;return{access:J,refresh:H,expires:yY(f,J,f.id_token),accountId:P??W?.accountId,email:j??W?.email,metadata:{...W?.metadata??{},provider:"oca",mode:$,subject:P,idToken:f.id_token}}}async function aQ(f,$){let W=$4(f),J=RH.get(W);if(J)return J;let H=`${W}/.well-known/openid-configuration`,Q=await fetch(H,{method:"GET",signal:AbortSignal.timeout($)});if(!Q.ok){let j=`${W}/oauth2/v1/token`;return RH.set(W,j,Date.now(),TY),j}let P=(await Q.json()).token_endpoint||`${W}/oauth2/v1/token`;return RH.set(W,P),P}function tQ(f){return{code:f.error,message:f.error_description}}async function hY(f){let $=QW.get(f.state);if(!$)throw Error("No PKCE verifier found for this state");QW.delete(f.state);let W=f.mode==="external"?f.config.external:f.config.internal,J=await aQ(W.idcsUrl,f.requestTimeoutMs),H=new URLSearchParams({grant_type:"authorization_code",code:f.code,redirect_uri:$.redirectUri,client_id:W.clientId,code_verifier:$.verifier}),Q=await fetch(J,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:H,signal:AbortSignal.timeout(f.requestTimeoutMs)}),Z=await Q.json();if(!Q.ok){let j=tQ(Z);throw new M4(`Token exchange failed: ${Q.status}${j.message?` - ${j.message}`:""}`,{status:Q.status,errorCode:j.code})}let P=Tf(Z.id_token);if(!Z.id_token||!P)throw Error("No ID token received from OCA");if(P.nonce!==$.nonce)throw Error("OIDC nonce verification failed");return nQ(Z,f.mode)}function KY(f){let $=f.mode==="external"?f.config.external:f.config.internal,W=new URL(`${$4($.idcsUrl)}/oauth2/v1/authorize`);return W.searchParams.set("client_id",$.clientId),W.searchParams.set("response_type","code"),W.searchParams.set("scope",$.scopes),W.searchParams.set("code_challenge",f.challenge),W.searchParams.set("code_challenge_method","S256"),W.searchParams.set("redirect_uri",f.callbackUrl),W.searchParams.set("state",f.state),W.searchParams.set("nonce",f.nonce),W.toString()}async function z1(f){T0(f.telemetry,"oca");let $=iQ(f.config),W=pQ(f.mode),J=f.callbackPorts?.length?f.callbackPorts:RY,H=f.callbackPath??jY,Q=f.requestTimeoutMs??lQ,Z=await M0({ports:J,callbackPath:H,onListening:f.callbacks.onServerListening,onClose:f.callbacks.onServerClose}),P=Z.callbackUrl;if(!P)throw Error("Unable to bind local OAuth callback server");let j=rQ(16),R=rQ(16),{verifier:X,challenge:A}=await f4();FY(),QW.set(j,{verifier:X,nonce:R,mode:W,redirectUri:P,createdAt:Date.now()});let V=KY({callbackUrl:P,mode:W,state:j,nonce:R,challenge:A,config:$});f.callbacks.onAuth({url:V,instructions:"Continue the authentication process in your browser."});try{let B=await K1({waitForCallback:Z.waitForCallback,cancelWait:Z.cancelWait,onManualCodeInput:f.callbacks.onManualCodeInput}),T=B.code,h=B.state;if(B.error)throw Error(`OAuth error: ${B.error}`);if(!T){if(!f.callbacks.onManualCodeInput)throw Error("Timed out waiting for OCA callback");throw Error("Missing authorization code")}if(!h||h!==j)throw Error("State mismatch");let F=await hY({code:T,state:h,mode:W,config:$,requestTimeoutMs:Q});return Y0(f.telemetry,"oca"),y0(f.telemetry,{id:F.accountId,email:F.email,provider:"oca"}),F}catch(B){throw F0(f.telemetry,"oca",B instanceof Error?B.message:String(B)),B}finally{Z.close()}}async function ZW(f,$={}){let W=iQ($.config),J=$.requestTimeoutMs??lQ,H=f.metadata?.mode,Q=H==="internal"||H==="external"?H:pQ($.mode),Z=Q==="external"?W.external:W.internal,P=await aQ(Z.idcsUrl,J),j=new URLSearchParams({grant_type:"refresh_token",refresh_token:f.refresh,client_id:Z.clientId}),R=await fetch(P,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:j,signal:AbortSignal.timeout(J)}),X=await R.json();if(!R.ok){let A=tQ(X);throw new M4(`Token refresh failed: ${R.status}${A.message?` - ${A.message}`:""}`,{status:R.status,errorCode:A.code})}return nQ(X,Q,f)}async function PW(f,$,W){if(!f)return null;let J=$?.refreshBufferMs??W?.refreshBufferMs??XY,H=$?.retryableTokenGraceMs??W?.retryableTokenGraceMs??AY;if($?.forceRefresh!==!0&&!_$(f,J))return f;try{return await ZW(f,W)}catch(Z){if(Z instanceof M4&&Z.isLikelyInvalidGrant())return I0(W?.telemetry,"oca","invalid_grant"),null;if(f.expires-Date.now()>H)return f;return null}}function XH(f={}){return{id:"oca",name:"Oracle Code Assist",usesCallbackServer:!0,async login($){return z1({...f,callbacks:$})},async refreshToken($){return ZW($,f)},getApiKey($){return $.access}}}async function G4(f,$){let W=new TextEncoder,J=async(R)=>{let X=await crypto.subtle.digest("SHA-256",W.encode(R));return Array.from(new Uint8Array(X).slice(0,4),(A)=>A.toString(16).padStart(2,"0")).join("")},[H,Q]=await Promise.all([J($),J(f)]),Z=Math.floor(Date.now()/1000).toString(16).padStart(8,"0"),P=new Uint32Array(1);crypto.getRandomValues(P);let j=(P[0]??0).toString(16).padStart(8,"0");return H+Q+Z+j}async function AH(f){let $=await G4(f.taskId,f.accessToken);return{Authorization:`Bearer ${f.accessToken}`,"Content-Type":"application/json",client:f.metadata?.client??"Cline","client-version":f.metadata?.clientVersion??"unknown","client-ide":f.metadata?.clientIde??"unknown","client-ide-version":f.metadata?.clientIdeVersion??"unknown",[U4]:$}}var JZ={};z(JZ,{resolveProviderConfig:()=>XW,getProviderConfig:()=>b4,getLiveModelsCatalog:()=>N1,clearPublicModelsCatalogCache:()=>IY,clearPrivateModelsCatalogCache:()=>UH,clearLiveModelsCatalogCache:()=>KH,OPENAI_COMPATIBLE_PROVIDERS:()=>RW,DEFAULT_MODELS_CATALOG_URL:()=>z4});import*as Bf from"@clinebot/llms";function VH(f){if(!Array.isArray(f))return[];return f.map(($)=>{if(typeof $==="string")return $.trim();if($&&typeof $==="object"){let W=$;for(let J of[W.id,W.name,W.model])if(typeof J==="string"&&J.trim())return J.trim()}return""}).filter(($)=>$.length>0)}function UY(f,$){let W=VH(f);if(W.length>0)return W;if(!f||typeof f!=="object")return[];let J=f,H=VH(J.data??J.models);if(H.length>0)return H;if(J.models&&typeof J.models==="object"&&!Array.isArray(J.models)){let Z=Object.keys(J.models).filter((P)=>P.trim().length>0);if(Z.length>0)return Z}let Q=J.providers?.[$];if(Q&&typeof Q==="object"){let P=VH(Q.models??Q);if(P.length>0)return P}return[]}async function D4(f,$){let W=await fetch(f,{method:"GET"});if(!W.ok)throw Error(`failed to fetch models from ${f}: HTTP ${W.status}`);return UY(await W.json(),$)}function oQ(f){return f.replace(/\/+$/,"")}function _4(f,$,W){let J=W?.trim();if(!J)return;let H=f?.trim();if(!H||!$?.trim())return J;try{let Q=new URL(J),Z=new URL($),P=new URL(H);if(Q.origin!==Z.origin)return J;let j=oQ(Z.pathname),R=oQ(P.pathname);if(j&&Q.pathname.startsWith(`${j}/`)){let X=Q.pathname.slice(j.length);P.pathname=`${R}${X}`}else P.pathname=Q.pathname;return P.search=Q.search,P.hash=Q.hash,P.toString()}catch{return J}}function MY(f){return Object.fromEntries(Object.entries(f).map(([$,W])=>[$,{...W}]))}function GY(f){if(f.baseUrl.length===0)return!1;switch(f.client){case"openai-compatible":case"openai":case"openai-r1":case"fetch":return!0;default:return f.protocol==="openai-chat"}}var DY=Object.values(Bf.MODEL_COLLECTIONS_BY_PROVIDER_ID).map((f)=>({id:f.provider.id,baseUrl:f.provider.baseUrl??"",modelsSourceUrl:f.provider.modelsSourceUrl,modelId:f.provider.defaultModelId,knownModels:MY(f.models),capabilities:f.provider.capabilities?[...f.provider.capabilities]:void 0,env:f.provider.env?[...f.provider.env]:void 0,client:f.provider.client,protocol:f.provider.protocol})),eQ=Object.fromEntries(DY.map((f)=>[f.id,f]));function _Y(f){return eQ[f]}function LY(){return Object.fromEntries(Object.entries(eQ).filter(([,f])=>GY(f)))}function fZ(f=[]){let $=f.flatMap((W)=>{switch(W){case"reasoning":case"prompt-cache":case"tools":case"oauth":return[W];default:return[]}});return $.length>0?$:void 0}var z4="https://models.dev/api.json",OY=600000,$Z=300000,CY=5000,C4=new Map,jW=new Map,TH=new Map,L4=new Map;async function zY(){return Bf.getGeneratedProviderModels()}async function NY(f,$={},W={},J={},H={},Q={}){let Z=await zY(),P=Bf.resolveProviderModelCatalogKeys(f),j=Object.assign({},...P.map((A)=>Z[A]??{})),R=Boolean(Bf.MODEL_COLLECTIONS_BY_PROVIDER_ID[f]?.provider.modelsSourceUrl),X=Object.keys(H).length>0;if(R&&X)return Bf.sortModelsByReleaseDate({...H,...Q});return Bf.sortModelsByReleaseDate({...j,...$,...W,...J,...H,...Q})}function bY(f,$){let W=Bf.resolveProviderModelCatalogKeys(f);return Object.assign({},...W.map((J)=>$[J]??{}))}function FH(f){let $=f?.trim();return $&&$.length>0?$:""}function yH(f){let $=f.apiKey?.trim()||f.accessToken?.trim();return $&&$.length>0?$:void 0}function qY(f){let $=2166136261;for(let W=0;W<f.length;W+=1)$^=f.charCodeAt(W),$+=($<<1)+($<<4)+($<<7)+($<<8)+($<<24);return($>>>0).toString(16)}function wY(f,$){return`${f}:${FH($.baseUrl)}:${qY(yH($)??"")}`}async function hH(f,$,W=CY){let J=new AbortController,H=setTimeout(()=>J.abort(),W);try{return await fetch(f,{...$,signal:J.signal})}finally{clearTimeout(H)}}function BH(f,$,W){if(W&&!f.includes($))f.push($)}function N4(f,$){let W=["streaming","tools"];return BH(W,"images",Boolean($.supportsImages)),BH(W,"prompt-cache",Boolean($.supportsPromptCache)),BH(W,"reasoning",Boolean($.supportsReasoning)),{id:f,name:$.name??f,contextWindow:$.contextWindow,maxTokens:$.maxTokens,capabilities:W,releaseDate:$.releaseDate,status:"active"}}async function EY(f,$){let W=await hH("https://inference.baseten.co/v1/models",{method:"GET",headers:{Authorization:`Bearer ${$}`,"Content-Type":"application/json"}});if(!W.ok)throw Error(`Baseten model refresh failed: HTTP ${W.status}`);let H=(await W.json())?.data??[],Q={};for(let Z of H){let P=Z.id?.trim();if(!P)continue;if(P.includes("whisper")||P.includes("tts")||P.includes("embedding"))continue;let j=Z.supported_features??[];Q[P]=N4(P,{name:P,contextWindow:Z.context_length,maxTokens:Z.max_completion_tokens,supportsReasoning:j.includes("reasoning")||j.includes("reasoning_effort"),supportsImages:!1})}return Q}async function SY(f,$){let W=await hH("https://api.hicap.ai/v2/openai/models",{method:"GET",headers:{"api-key":$}});if(!W.ok)throw Error(`Hicap model refresh failed: HTTP ${W.status}`);let H=(await W.json())?.data??[],Q={};for(let Z of H){let P=Z.id?.trim();if(!P)continue;Q[P]=N4(P,{name:P,contextWindow:128000,supportsImages:!0,supportsPromptCache:!0})}return Q}function kY(f){let $=FH(f);if(!$)return"http://localhost:4000";return $.endsWith("/v1")?$.slice(0,-3):$}async function mY(f,$){let J=`${kY(f.baseUrl)}/v1/model/info`,H=async(R)=>hH(J,{method:"GET",headers:{accept:"application/json",...R}}),Q=await H({"x-litellm-api-key":$});if(!Q.ok)Q=await H({Authorization:`Bearer ${$}`});if(!Q.ok)throw Error(`LiteLLM model refresh failed: HTTP ${Q.status}`);let P=(await Q.json())?.data??[],j={};for(let R of P){let X=R.model_name?.trim(),V=R.litellm_params?.model?.trim()||X;if(!V)continue;let B=R.model_info,T=N4(V,{name:X??V,maxTokens:B?.max_output_tokens??B?.max_tokens,contextWindow:B?.max_input_tokens??B?.max_tokens,supportsImages:B?.supports_vision,supportsPromptCache:B?.supports_prompt_caching,supportsReasoning:B?.supports_reasoning});if(j[V]=T,X)j[X]={...T,id:X,name:X}}return j}var WZ={baseten:EY,hicap:SY,litellm:mY},YH=new Map,O4=new Map;function gY(f,$){return`${f}:${FH($.baseUrl)}`}async function xY(f,$,W){let J=Bf.MODEL_COLLECTIONS_BY_PROVIDER_ID[f],H=_4(W.baseUrl,J?.provider.baseUrl,J?.provider.modelsSourceUrl);if(!H)return{};let Q=$?.cacheTtlMs??$Z,Z=gY(f,W),P=Date.now(),j=YH.get(Z);if(j&&j.expiresAt>P)return j.data;let R=O4.get(Z);if(R)return R;let X=D4(H,f).then((A)=>{let V=Object.fromEntries(A.map((B)=>[B,N4(B,{name:B})]));return YH.set(Z,{data:V,expiresAt:P+Q}),V}).finally(()=>{O4.delete(Z)});return O4.set(Z,X),X}function IY(){YH.clear(),O4.clear()}async function vY(f,$){let W=yH($);if(!W)return{};let J=WZ[f];if(!J)return{};return J($,W)}function uY(f,$,W){if(!W)return!1;if(!WZ[f])return!1;if($?.loadPrivateOnAuth===!1)return!1;return Boolean(yH(W))}async function cY(f,$,W){let J=$?.cacheTtlMs??$Z,H=wY(f,W),Q=Date.now(),Z=TH.get(H);if(Z&&Z.expiresAt>Q)return Z.data;let P=L4.get(H);if(P)return P;let j=vY(f,W).then((R)=>{return TH.set(H,{data:R,expiresAt:Q+J}),R}).finally(()=>{L4.delete(H)});return L4.set(H,j),j}async function dY(f){return Bf.fetchModelsDevProviderModels(f)}async function N1(f={}){let $=f.url??z4,W=f.cacheTtlMs??OY,J=Date.now(),H=C4.get($);if(H&&H.expiresAt>J)return H.data;let Q=jW.get($);if(Q)return Q;let Z=dY($).then((P)=>{return C4.set($,{data:P,expiresAt:J+W}),P}).finally(()=>{jW.delete($)});return jW.set($,Z),Z}function KH(f){if(f){C4.delete(f),jW.delete(f);return}C4.clear(),jW.clear()}function UH(){TH.clear(),L4.clear()}function rY(f){return Object.fromEntries(Object.entries(f).map(([$,W])=>[$,{baseUrl:W.baseUrl,modelId:W.modelId,capabilities:fZ(W.capabilities)}]))}var RW=rY(LY());function b4(f){let $=_Y(f);if(!$||!$.baseUrl)return;return{baseUrl:$.baseUrl,modelId:$.modelId,knownModels:$.knownModels,capabilities:fZ($.capabilities)}}async function XW(f,$,W){let J=b4(f);if(!J)return;try{let H=$?.loadLatestOnInit?await N1($):void 0,Q=H?bY(f,H):{},Z=W&&uY(f,$,W)?await cY(f,$,W):{},j=Boolean(Bf.MODEL_COLLECTIONS_BY_PROVIDER_ID[f]?.provider.modelsSourceUrl)?W??{providerId:f,modelId:J.modelId,baseUrl:J.baseUrl}:W,R=j?await xY(f,$,j).catch(()=>({})):{},X=await NY(f,J.knownModels,Q,Z,R,W?.knownModels);return{...J,knownModels:X}}catch(H){if($?.failOnError)throw H;return J}}var AW=Nf.BUILT_IN_PROVIDER,MH=Nf.BUILT_IN_PROVIDER_IDS,GH=Nf.isBuiltInProviderId,b1=Nf.normalizeProviderId,VW=_.string().min(1).regex(/^[a-z0-9][a-z0-9-]*$/i),q4=_.enum(["anthropic","gemini","openai-chat","openai-responses","openai-r1","ai-sdk"]),w4=_.enum(["anthropic","ai-sdk","ai-sdk-community","openai","openai-compatible","openai-r1","gemini","bedrock","custom","fetch","vertex"]),E4=_.object({apiKey:_.string().optional(),accessToken:_.string().optional(),refreshToken:_.string().optional(),expiresAt:_.number().int().positive().optional(),accountId:_.string().optional()}),lY=_.enum(["none","low","medium","high","xhigh"]),S4=_.object({enabled:_.boolean().optional(),effort:lY.optional(),budgetTokens:_.number().int().positive().optional()}),k4=_.object({accessKey:_.string().optional(),secretKey:_.string().optional(),sessionToken:_.string().optional(),region:_.string().optional(),profile:_.string().optional(),authentication:_.enum(["iam","api-key","profile"]).optional(),usePromptCache:_.boolean().optional(),useCrossRegionInference:_.boolean().optional(),useGlobalInference:_.boolean().optional(),endpoint:_.string().url().optional(),customModelBaseId:_.string().optional()}),m4=_.object({projectId:_.string().optional(),region:_.string().optional()}),g4=_.object({apiVersion:_.string().optional(),useIdentity:_.boolean().optional()}),x4=_.object({clientId:_.string().optional(),clientSecret:_.string().optional(),tokenUrl:_.string().url().optional(),resourceGroup:_.string().optional(),deploymentId:_.string().optional(),useOrchestrationMode:_.boolean().optional(),api:_.enum(["orchestration","foundation-models"]).optional(),defaultSettings:_.record(_.string(),_.unknown()).optional()}),I4=_.object({mode:_.enum(["internal","external"]).optional(),usePromptCache:_.boolean().optional()}),v4=_.object({loadLatestOnInit:_.boolean().optional(),loadPrivateOnAuth:_.boolean().optional(),url:_.string().url().optional(),cacheTtlMs:_.number().int().positive().optional(),failOnError:_.boolean().optional()}),i0=_.object({provider:VW,apiKey:_.string().optional(),auth:E4.optional(),model:_.string().optional(),protocol:q4.optional(),client:w4.optional(),routingProviderId:VW.optional(),maxTokens:_.number().int().positive().optional(),contextWindow:_.number().int().positive().optional(),baseUrl:_.string().url().optional(),headers:_.record(_.string(),_.string()).optional(),timeout:_.number().int().positive().optional(),reasoning:S4.optional(),aws:k4.optional(),gcp:m4.optional(),azure:g4.optional(),sap:x4.optional(),oca:I4.optional(),region:_.string().optional(),apiLine:_.enum(["china","international"]).optional(),capabilities:_.array(_.enum(["reasoning","prompt-cache","streaming","tools","vision","computer-use","oauth"])).optional(),modelCatalog:v4.optional()});function u4(f){return i0.parse(f)}function c4(f){return i0.safeParse(f)}function pY(f){return f.protocol==="openai-responses"||f.client==="openai"}function bf(f,$={}){let W=f.provider,J=b1(W),H=$.includeKnownModels!==!1,Q=f.reasoning?.effort||"none",Z=Q==="none"?void 0:Q,P=RW[J],j=Object.assign({},...Nf.resolveProviderModelCatalogKeys(J).map((h)=>Nf.getGeneratedModelsForProvider(h))),R=Object.keys(j)[0],X=f.auth?.accessToken??f.apiKey??f.auth?.apiKey,A=f.baseUrl??(J==="oca"?f.oca?.mode==="internal"?O1:C1:P?.baseUrl),V=f.routingProviderId??(pY(f)&&J!==AW.OPENAI_NATIVE?AW.OPENAI_NATIVE:void 0),B=H?P?.knownModels??(Object.keys(j).length>0?j:void 0):void 0,T={providerId:W,clientType:f.client,routingProviderId:V,modelId:f.model??P?.modelId??R??"default",...H?{knownModels:B}:{},apiKey:X,accessToken:f.auth?.accessToken,refreshToken:f.auth?.refreshToken,accountId:f.auth?.accountId,baseUrl:A,headers:f.headers,timeoutMs:f.timeout,maxOutputTokens:f.maxTokens,maxContextTokens:f.contextWindow,thinking:f.reasoning?.enabled,reasoningEffort:Z,thinkingBudgetTokens:f.reasoning?.budgetTokens,region:f.region??f.aws?.region??f.gcp?.region,apiLine:f.apiLine,useCrossRegionInference:f.aws?.useCrossRegionInference,useGlobalInference:f.aws?.useGlobalInference,aws:f.aws?{accessKey:f.aws.accessKey,secretKey:f.aws.secretKey,sessionToken:f.aws.sessionToken,authentication:f.aws.authentication,profile:f.aws.profile,usePromptCache:f.aws.usePromptCache,endpoint:f.aws.endpoint,customModelBaseId:f.aws.customModelBaseId}:void 0,gcp:f.gcp?{projectId:f.gcp.projectId,region:f.gcp.region}:void 0,azure:f.azure,sap:f.sap,oca:f.oca,capabilities:f.capabilities??P?.capabilities,modelCatalog:f.modelCatalog?{loadLatestOnInit:f.modelCatalog.loadLatestOnInit,loadPrivateOnAuth:f.modelCatalog.loadPrivateOnAuth,url:f.modelCatalog.url,cacheTtlMs:f.modelCatalog.cacheTtlMs,failOnError:f.modelCatalog.failOnError}:void 0};return Object.fromEntries(Object.entries(T).filter(([h,F])=>F!==void 0))}function DH(f){let $=u4(f);return bf($)}function _H(f){let $=c4(f);if($.success)return{success:!0,config:bf($.data)};return{success:!1,error:$.error}}var BW=i0;var d4=n0.object({settings:i0,updatedAt:n0.string().datetime(),tokenSource:n0.enum(["manual","oauth","migration"]).default("manual")}),q1=n0.object({version:n0.literal(1),lastUsedProvider:n0.string().min(1).optional(),providers:n0.record(n0.string(),d4)});function a0(){return{version:1,providers:{}}}K0();var RZ={};z(RZ,{InMemoryWorkspaceManager:()=>E1});import{upsertWorkspaceInfo as tY,WorkspaceManifestSchema as OH}from"@clinebot/shared";var jZ={};z(jZ,{normalizeWorkspacePath:()=>G0,generateWorkspaceInfoWithDiagnostics:()=>TW,generateWorkspaceInfo:()=>w1,buildWorkspaceMetadataWithInfo:()=>LH,buildWorkspaceMetadata:()=>YW});import{basename as iY,resolve as nY}from"node:path";import{performance as ZZ}from"node:perf_hooks";import{processWorkspaceInfo as PZ}from"@clinebot/shared";import aY from"simple-git";function G0(f){return nY(f)}async function w1(f){return(await TW(f)).info}function r4(f){if(f instanceof Error)return{errorType:f.name?.trim()||f.constructor.name||"Error",message:f.message};return{errorType:"Error",message:String(f)}}async function TW(f){let $=G0(f),W={rootPath:$,hint:iY($)},J;try{let H=aY({baseDir:$});if(!await H.checkIsRepo())return{info:W,vcsType:"none"};try{let Z=await H.getRemotes(!0);if(Z.length>0){let P=Z.map((j)=>{let R=j.refs.fetch||j.refs.push;return`${j.name}: ${R}`});W.associatedRemoteUrls=P}}catch(Z){J??=r4(Z)}try{let Z=(await H.revparse(["HEAD"])).trim();if(Z.length>0)W.latestGitCommitHash=Z}catch(Z){J??=r4(Z)}try{let Z=(await H.branch()).current.trim();if(Z.length>0)W.latestGitBranchName=Z}catch(Z){J??=r4(Z)}return{info:W,vcsType:"git",error:J}}catch(H){return{info:W,vcsType:"none",error:r4(H)}}}async function YW(f){let $=await w1(f);return PZ($)}async function LH(f){let $=ZZ.now(),W=await TW(f),J=ZZ.now()-$,H=W.info;return{workspaceInfo:H,workspaceMetadata:PZ(H),durationMs:J,vcsType:W.vcsType,initError:W.error}}class E1{manifest;listeners=new Set;constructor(f){this.manifest=OH.parse(f??{workspaces:{}})}async addWorkspacePath(f){let $=await w1(f);return this.manifest=tY(this.manifest,$),this.emit({type:"workspace_added",workspace:$}),$}async switchWorkspace(f){let $=G0(f),W=this.manifest.workspaces[$];if(W)return this.manifest=OH.parse({...this.manifest,currentWorkspacePath:$}),this.emit({type:"workspace_switched",workspace:W}),W;let J=await this.addWorkspacePath($);return this.manifest=OH.parse({...this.manifest,currentWorkspacePath:J.rootPath}),this.emit({type:"workspace_switched",workspace:J}),J}subscribe(f){return this.listeners.add(f),()=>{this.listeners.delete(f)}}getCurrentWorkspace(){let f=this.manifest.currentWorkspacePath;if(!f)return;return this.manifest.workspaces[f]}getWorkspace(f){let $=G0(f);return this.manifest.workspaces[$]}listWorkspaces(){return Object.values(this.manifest.workspaces)}getManifest(){return this.manifest}emit(f){for(let $ of this.listeners)$(f)}}Kf();import{createHash as sY}from"node:crypto";var XZ=new Set,AZ=new Set;function oY(f){return sY("sha256").update(f).digest("hex")}function eY(f){if(f.vcsTypes&&f.vcsTypes.length>0)return f.vcsTypes;return[f.vcsType==="git"?"git":"none"]}function VZ(f){if(!f.telemetry)return;let $=oY(f.rootPath),W=f.rootCount??1;if(!XZ.has($))XZ.add($),v8(f.telemetry,{root_count:W,vcs_types:eY(f),init_duration_ms:f.durationMs,feature_flag_enabled:f.featureFlagEnabled??!0,is_remote_workspace:f.isRemoteWorkspace});if(f.initError&&!AZ.has($)){AZ.add($);let J=Error(f.initError.message);J.name=f.initError.errorType||"Error",u8(f.telemetry,J,{fallback_to_single_root:!0,workspace_count:W})}}function $F(f){return`${f.pluginName??f.pluginPath}: ${f.message}`}function WF(f,$,W){if($.length>0)for(let Q of $)W?.log(Q.message,{severity:"warn"});if(f.length===0)return;let J=f.slice(0,3).map($F).join("; "),H=f.length>3?`; and ${f.length-3} more`:"";W?.log(`Some plugins failed to initialize. ${J}${H}. Use --verbose for more details.`,{severity:"warn"});for(let Q of f)W?.log(`Plugin initialization failed (${Q.phase}) for ${Q.pluginPath}`,{severity:"warn",stack:Q.stack,pluginPath:Q.pluginPath,pluginName:Q.pluginName})}function JF(f,$){let W=typeof f.thinking==="boolean",J=typeof f.reasoningEffort==="string";if(!W&&!J)return $;return{...$??{},...W?{enabled:f.thinking}:{},...J?{effort:f.reasoningEffort}:{}}}function HF(f,$){return fF(f,$)}function QF(f){let $=0;for(let W of f??[]){if(W.role!=="user")continue;if(("metadata"in W&&W.metadata&&typeof W.metadata==="object"&&!Array.isArray(W.metadata)?W.metadata:void 0)?.kind==="recovery_notice")continue;$+=1}return $}function ZF(f){let $={...f.storedHeaders??{},...f.configHeaders??{}},W=f.accountId?.trim()||PF(f.accessToken);if($.originator="cline",$.session_id=f.sessionId,$["User-Agent"]=`Cline/${process.env.npm_package_version||"1.0.0"}`,W)$["ChatGPT-Account-Id"]=W;return $}function PF(f){let $=f?.trim();if(!$)return;let W=Tf($),J=W?.["https://api.openai.com/auth"]?.chatgpt_account_id;if(typeof J==="string"&&J.length>0)return J;let H=W?.organizations?.[0]?.id;if(typeof H==="string"&&H.length>0)return H;let Q=W?.chatgpt_account_id;if(typeof Q==="string"&&Q.length>0)return Q;return}function jF(f,$,W,J,H){let Q=W.getProviderSettings(f.providerId),Z=J||Q?.modelCatalog?{...J??{},...Q?.modelCatalog??{}}:void 0,P={...Q??{},provider:f.providerId,model:f.modelId,apiKey:f.apiKey??Q?.apiKey,baseUrl:f.baseUrl??Q?.baseUrl,headers:f.providerId==="openai-codex"?ZF({sessionId:$,configHeaders:f.headers,storedHeaders:Q?.headers,accountId:Q?.auth?.accountId,accessToken:f.apiKey??Q?.auth?.accessToken??Q?.apiKey}):f.headers??Q?.headers,reasoning:JF(f,Q?.reasoning),modelCatalog:Z},j=bf(P);if(f.knownModels)j.knownModels=f.knownModels;if(f.extensionContext)j.extensionContext=f.extensionContext;let X=f.fetch??j.fetch??H;if(X)j.fetch=X;return j}async function BZ(f){let{input:$,sessionId:W,providerSettingsManager:J,defaultTelemetry:H,defaultCapabilities:Q,defaultToolPolicies:Z,defaultFetch:P,onPluginEvent:j,onTeamEvent:R,createSpawnTool:X,localRuntime:A,readSessionMetadata:V,writeSessionMetadata:B}=f,T=c0($.config),{modelCatalogDefaults:h,userInstructionService:F,configExtensions:Y,onTeamRestored:y,...D}=A??{},U=Object.keys(D).length>0?D:void 0,{workspaceInfo:K,workspaceMetadata:M,durationMs:O,vcsType:u,initError:vf}=await LH(T),a=U?.extensionContext,c={...a??{},workspace:{...K,...a?.workspace??{}},session:{...a?.session??{},sessionId:W},logger:a?.logger??U?.logger,telemetry:a?.telemetry??U?.telemetry??H};VZ({telemetry:c.telemetry,rootPath:K.rootPath,workspaceInfo:K,rootCount:1,vcsType:u,durationMs:O,initError:vf,featureFlagEnabled:!0});let d=L1({cwd:$.config.cwd,workspacePath:T,rootSessionId:W,logger:U?.logger,workspaceInfo:K}),e=a7(U?.hooks)?void 0:_1({rootSessionId:W,workspacePath:T,workspaceInfo:K}),j0=q$([U?.hooks,e]),E;if(HF(Y,"plugins"))try{E=await M1({pluginPaths:U?.pluginPaths,workspacePath:T,cwd:$.config.cwd,onEvent:j,providerId:$.config.providerId,modelId:$.config.modelId,workspaceInfo:K,session:c.session,client:c.client,user:c.user,logger:c.logger,telemetry:c.telemetry,automation:c.automation}),WF(E.failures,E.warnings,U?.logger)}catch(r){let s=r instanceof Error?r.message:String(r);U?.logger?.log?.(`plugin loading failed; continuing without plugins (${s})`)}let uf=uJ(d?[d]:void 0,uJ(U?.extensions,Q4(E?.extensions))),ff={...$.config,...U??{},sessionId:W,hooks:j0,extensions:uf,extensionContext:c,telemetry:c.telemetry},T2=jF(ff,W,J,h,P),P$=q$([ff.hooks,ff.checkpoint?.enabled===!0?EQ({cwd:ff.cwd,sessionId:W,logger:ff.logger,createCheckpoint:ff.checkpoint?.createCheckpoint,initialRunCount:QF($.initialMessages),readSessionMetadata:V,writeSessionMetadata:B}):void 0]),j$={...ff,providerConfig:T2,workspaceMetadata:M,hooks:P$},e$=$.toolPolicies??ff.toolPolicies??Z,Y2=Xf(Q,$.capabilities),WJ=Y2?.requestToolApproval,f1=Y2?.toolExecutors,JJ=new E1({currentWorkspacePath:K.rootPath,workspaces:{[K.rootPath]:K}});return{effectiveInput:$,config:j$,providerConfig:T2,workspaceMetadata:M,workspaceInfo:K,extensions:uf,hooks:P$,toolPolicies:e$,requestToolApproval:WJ,pluginSandboxShutdown:E?.shutdown,runtimeBuilderInput:{config:j$,hooks:P$,extensions:uf,onTeamEvent:R,createSpawnTool:X,onTeamRestored:y,userInstructionService:F,configExtensions:Y,toolExecutors:f1,workspaceManager:JJ,logger:j$.logger,telemetry:j$.telemetry}}}import{existsSync as p4,mkdirSync as RF,readdirSync as XF,rmdirSync as AF,rmSync as VF,unlinkSync as BF}from"node:fs";import{dirname as TZ,join as l4}from"node:path";function t(){return new Date().toISOString()}function FW(f){if(!f||!p4(f))return;try{BF(f)}catch{}}function TF(f){let $=T1(f);if($)return{rootSessionId:$.rootSessionId,fileStem:`${$.agentId}__${$.teamTaskId}`};let W=v2(f);if(W)return{rootSessionId:W.rootSessionId,fileStem:W.agentId};return{rootSessionId:f,fileStem:f}}class CH{ensureSessionsDir;constructor(f){this.ensureSessionsDir=f}sessionArtifactsDir(f){return l4(this.ensureSessionsDir(),f)}ensureSessionArtifactsDir(f){let $=this.sessionArtifactsDir(f);if(!p4($))RF($,{recursive:!0});return $}sessionMessagesPath(f){return l4(this.sessionArtifactsDir(f),`${f}.messages.json`)}sessionManifestPath(f,$=!1){let W=$?this.ensureSessionArtifactsDir(f):this.sessionArtifactsDir(f);return l4(W,`${f}.json`)}removeSessionDirIfEmpty(f){let $=this.sessionArtifactsDir(f),W=this.ensureSessionsDir();while($.startsWith(W)&&$!==W){if(!p4($)){$=TZ($);continue}try{if(XF($).length>0)break;AF($)}catch{break}$=TZ($)}}removeSessionDir(f){this.removeDir(this.sessionArtifactsDir(f))}removeDir(f){if(!p4(f))return;try{VF(f,{recursive:!0,force:!0})}catch{}}subagentArtifactPaths(f,$,W){let{rootSessionId:J,fileStem:H}=TF(f),Q=this.sessionArtifactsDir(J);return{messagesPath:l4(Q,`${H}.messages.json`)}}}import{resolveDocumentsExtensionPath as YF}from"@clinebot/shared/storage";Kf();function YZ(f,$,W,J,H){if(W)d8(f.telemetry,{ulid:$,apiProvider:f.providerId,...H});else c8(f.telemetry,{ulid:$,apiProvider:f.providerId,...H});FF(f.telemetry,{workspacePath:J})}function FF(f,$){let W=YF("Hooks"),J=r0($.workspacePath),H=new Map;for(let Q of J){let Z=Q.hookEventName??"unknown",P=H.get(Z)??{global:0,workspace:0};if(Q.path===W||Q.path.startsWith(`${W}/`))P.global+=1;else P.workspace+=1;H.set(Z,P)}for(let[Q,Z]of H.entries())e8(f,Q,Z.global,Z.workspace)}function FZ(f,$){for(let W of $.mentions)s8(f,W,$.matchedFiles.includes(W)?1:0,"file",!$.matchedFiles.includes(W));for(let W of $.matchedFiles)a8(f,"file",W.length);for(let W of $.ignoredMentions)t8(f,"file","not_found",W)}var lX={};z(lX,{ProviderSettingsManager:()=>P0});import{chmodSync as iX,existsSync as o9,mkdirSync as LL,readFileSync as OL,writeFileSync as CL}from"node:fs";import{basename as nX,dirname as e9}from"node:path";import{resolveProviderSettingsPath as zL}from"@clinebot/shared/storage";var L={};z(L,{writeHubDiscovery:()=>B6,writeGlobalSettings:()=>L$,withHubStartupLock:()=>T6,verifyHubConnection:()=>ef,updateLocalProvider:()=>l6,truncateNotificationBody:()=>T8,toggleDisabledTool:()=>J4,toTeamProgressLifecycleEvent:()=>p1,toProviderConfig:()=>bf,toHubHealthUrl:()=>K5,toHookConfigFileName:()=>JW,summarizeUsageFromMessages:()=>n2,stopLocalHubServerGracefully:()=>b5,startLocalOAuthServer:()=>M0,startHubWebSocketServer:()=>t$,startHubServer:()=>aR,startClineDeviceAuth:()=>EH,splitCoreSessionConfig:()=>IW,spawnDetachedHubServer:()=>u1,setTelemetryOptOutGlobally:()=>RQ,setDisabledTools:()=>nJ,setDisabledPlugin:()=>BQ,sendHubCommand:()=>$R,saveLocalProviderSettings:()=>S9,saveLocalProviderOAuthCredentials:()=>x9,sanitizeTeamName:()=>E8,sanitizeSessionToken:()=>U$,safeParseSettings:()=>c4,safeCreateProviderConfig:()=>_H,runSubprocessEvent:()=>f2,runHook:()=>W2,reviveTeamStateDates:()=>w8,restartLocalHubIfIdleAfterStartupTimeout:()=>y6,resolveWorkspaceHubOwnerContext:()=>pP,resolveWorkflowsConfigSearchPaths:()=>wW,resolveSkillsConfigSearchPaths:()=>bW,resolveSharedHubOwnerContext:()=>Hf,resolveSessionBackend:()=>a5,resolveRulesConfigSearchPaths:()=>qW,resolveProviderConfig:()=>XW,resolvePluginConfigSearchPaths:()=>e2,resolveMcpServerRegistrations:()=>R8,resolveLocalClineAuthToken:()=>I9,resolveHubUrl:()=>W9,resolveHubOwnerContext:()=>D0,resolveHubEndpointOptions:()=>Sf,resolveHubBuildId:()=>$$,resolveHooksConfigSearchPaths:()=>$W,resolveDisabledToolNames:()=>rf,resolveDisabledPluginPaths:()=>s2,resolveDefaultMcpSettingsPath:()=>H$,resolveDefaultHubPort:()=>v1,resolveDefaultHubPathname:()=>_5,resolveDefaultHubHost:()=>D5,resolveCoreSelectedToolIds:()=>k8,resolveCompatibleLocalHubUrl:()=>eW,resolveClineDir:()=>cP,resolveClineDataDir:()=>aW,resolveAndLoadAgentPlugins:()=>M1,resolveAgentPluginPaths:()=>C$,requestHubShutdown:()=>oW,requestDesktopToolApproval:()=>O9,rememberRecoverableLocalHubUrl:()=>W$,registerMcpServersFromSettingsFile:()=>o1,registerDisposable:()=>GL,refreshProviderModelsFromSource:()=>k9,refreshOpenAICodexToken:()=>GW,refreshOcaToken:()=>ZW,refreshClineToken:()=>UW,readSessionCheckpointHistory:()=>Y8,readHubDiscovery:()=>Zf,readGlobalSettings:()=>sf,probeHubServer:()=>Vf,probeHubConnection:()=>fR,prewarmFileIndex:()=>O8,prewarmDetachedHubServer:()=>Y6,parseWorkflowConfigFromMarkdown:()=>NW,parseUserCommandEnvelope:()=>ML,parseSkillConfigFromMarkdown:()=>CW,parseSettings:()=>u4,parseRuleConfigFromMarkdown:()=>zW,parseHookEventPayload:()=>$2,openaiCodexOAuthProvider:()=>xH,normalizeWorkspacePath:()=>G0,normalizeUserInput:()=>UL,normalizeRuntimeCapabilities:()=>Xf,normalizeProviderId:()=>b1,normalizeOpenAICodexCredentials:()=>gH,normalizeOAuthProvider:()=>m9,normalizeHubWebSocketUrl:()=>J$,noopBasicLogger:()=>KL,migrateLegacyProviderSettings:()=>G8,mergeRulesForSystemPrompt:()=>I1,mergeAgentHooks:()=>q$,makeTeamTaskSubSessionId:()=>I2,makeSubSessionId:()=>B1,loginOpenAICodex:()=>m1,loginOcaOAuth:()=>z1,loginLocalProvider:()=>g9,loginClineOAuth:()=>k1,loadOpenTelemetryAdapter:()=>RL,loadMcpSettingsFile:()=>j8,loadLlmsConfigFromFile:()=>a9,loadAgentPluginsFromPathsWithDiagnostics:()=>U0,loadAgentPluginsFromPaths:()=>j4,loadAgentPluginFromPath:()=>o2,listSessionHistoryFromBackend:()=>Y5,listPluginTools:()=>xW,listLocalProviders:()=>w9,listHookConfigFiles:()=>r0,isToolDisabledGlobally:()=>XQ,isTelemetryOptedOutGlobally:()=>W4,isRuleEnabled:()=>J6,isPluginDisabledGlobally:()=>VQ,isOpenAICodexTokenExpired:()=>mH,isHubReconnectableTransportError:()=>z5,isHubCommandTimeoutError:()=>F6,isDiscoveryFilePresent:()=>rP,isClineAccountActionRequest:()=>i4,isBuiltInProviderId:()=>GH,identifyAccount:()=>y0,hasMcpSettingsFile:()=>s1,getValidOpenAICodexCredentials:()=>DW,getValidOcaCredentials:()=>PW,getValidClineCredentials:()=>MW,getProviderConfigFields:()=>v9,getProviderConfig:()=>b4,getLocalProviderModels:()=>E9,getLiveModelsCatalog:()=>N1,getFileIndex:()=>A0,getCurrentContextSize:()=>lJ,getCoreHeadlessToolNames:()=>x2,getCoreDefaultEnabledToolIds:()=>S8,getCoreBuiltinToolCatalog:()=>h$,getCoreAcpToolNames:()=>m8,getClineDefaultSystemPrompt:()=>AL,generateWorkspaceInfoWithDiagnostics:()=>TW,generateWorkspaceInfo:()=>w1,generateOcaOpcRequestId:()=>G4,formatRulesForSystemPrompt:()=>x1,formatDisplayUserInput:()=>hL,filterExtensionToolRegistrations:()=>Q4,filterDisabledTools:()=>O$,filterDisabledPluginPaths:()=>H4,fetchClineRecommendedModels:()=>i9,executeClineAccountAction:()=>n4,ensureHubWebSocketServer:()=>g6,ensureHubServer:()=>tR,ensureDetachedHubServer:()=>nP,ensureCustomProvidersLoaded:()=>r6,ensureCompatibleLocalHubUrl:()=>I$,enrichPromptWithMentions:()=>H1,emptyWorkspaceManifest:()=>yL,emptyStoredProviderSettings:()=>a0,discoverPluginModulePaths:()=>fW,deriveSubsessionStatus:()=>u2,deleteLocalProvider:()=>p6,defineLlmsConfig:()=>n9,createWorkflowsConfigDefinition:()=>kW,createUserInstructionConfigService:()=>s0,createToolPoliciesWithPreset:()=>z8,createTool:()=>FL,createTeamName:()=>I6,createSubprocessHooks:()=>z6,createSpawnAgentTool:()=>g0,createSkillsConfigDefinition:()=>EW,createSessionHost:()=>a1,createRuntimeHost:()=>a1,createRulesConfigDefinition:()=>SW,createProviderConfig:()=>DH,createOpenTelemetryTelemetryService:()=>B8,createOcaRequestHeaders:()=>AH,createOcaOAuthProvider:()=>XH,createOAuthClientCallbacks:()=>KW,createMcpTools:()=>e1,createLocalHubScheduleRuntimeHandlers:()=>x6,createLlmsSdk:()=>s9,createInitialAccumulatedUsage:()=>G$,createInMemoryHubOwnerContext:()=>dP,createHubServerUrl:()=>lf,createHubAuthToken:()=>V6,createHookConfigFileHooks:()=>HW,createHookConfigFileExtension:()=>L1,createHookAuditHooks:()=>_1,createDisabledMcpToolPolicy:()=>X8,createDisabledMcpToolPolicies:()=>L6,createDelegatedAgentConfigProvider:()=>R1,createDelegatedAgent:()=>X1,createDefaultToolsWithPreset:()=>N8,createDefaultTools:()=>S0,createDefaultMcpServerClientFactory:()=>t1,createDefaultExecutors:()=>Q1,createCoreSettingsService:()=>S$,createCoreSessionSnapshot:()=>f0,createContributionRegistry:()=>YL,createContextCompactionPrepareTurn:()=>U2,createConfiguredTelemetryService:()=>i$,createConfiguredTelemetryHandle:()=>P2,createClineTelemetryServiceMetadata:()=>TL,createClineTelemetryServiceConfig:()=>BL,createClineOAuthProvider:()=>kH,createBuiltinTools:()=>K$,createAgentTeamsTools:()=>y$,createAgentRuntime:()=>_L,createAgentHooksExtension:()=>G1,connectToHub:()=>w6,completeClineDeviceAuth:()=>SH,clearPrivateModelsCatalogCache:()=>UH,clearLiveModelsCatalogCache:()=>KH,clearHubDiscovery:()=>Ef,captureWorkspacePathResolved:()=>WQ,captureWorkspaceInitialized:()=>v8,captureWorkspaceInitError:()=>u8,captureToolUsage:()=>p8,captureTokenUsage:()=>r8,captureTaskRestarted:()=>d8,captureTaskCreated:()=>c8,captureTaskCompleted:()=>l2,captureSubagentExecution:()=>i2,captureSkillUsed:()=>i8,captureProviderApiError:()=>p2,captureModeSwitch:()=>l8,captureMentionUsed:()=>a8,captureMentionSearchResults:()=>s8,captureMentionFailed:()=>t8,captureHookDiscovery:()=>e8,captureExtensionActivated:()=>$Q,captureDiffEditFailure:()=>n8,captureConversationTurnEvent:()=>Y1,captureAuthSucceeded:()=>Y0,captureAuthStarted:()=>T0,captureAuthLoggedOut:()=>I0,captureAuthFailed:()=>F0,captureAgentTeamCreated:()=>o8,captureAgentCreated:()=>v0,buildWorkspaceMetadata:()=>YW,buildTeamProgressSummary:()=>l1,buildDelegatedAgentConfig:()=>Y$,bootstrapAgentTeams:()=>V1,addLocalProvider:()=>q9,accumulateUsageTotals:()=>u0,WORKFLOWS_CONFIG_DIRECTORY_NAME:()=>OW,UnifiedConfigFileWatcher:()=>w$,ToolPresets:()=>zf,TelemetryService:()=>Q2,TelemetryLoggerSink:()=>V8,TEAM_TOOL_NAMES:()=>A1,SubprocessSandbox:()=>U1,StoredProviderSettingsSchema:()=>q1,StoredProviderSettingsEntrySchema:()=>d4,SqliteTeamStore:()=>s$,SqliteSessionStore:()=>W0,SessionVersioningService:()=>Z$,SessionVersioningError:()=>Gf,SessionSource:()=>jf,SapSettingsSchema:()=>x4,SKILLS_CONFIG_DIRECTORY_NAME:()=>LW,SESSION_STATUSES:()=>c2,RpcClineAccountService:()=>hW,RemoteRuntimeHost:()=>r1,ReasoningSettingsSchema:()=>S4,RULES_CONFIG_DIRECTORY_NAME:()=>W6,ProviderSettingsSchema:()=>i0,ProviderSettingsManager:()=>P0,ProviderProtocolSchema:()=>q4,ProviderIdSchema:()=>VW,ProviderClientSchema:()=>w4,OpenTelemetryProvider:()=>Z2,OcaSettingsSchema:()=>I4,OPENAI_COMPATIBLE_PROVIDERS:()=>RW,OCI_HEADER_OPC_REQUEST_ID:()=>U4,NodeHubClient:()=>pf,NativeHubTransportAdapter:()=>K8,ModelCatalogSettingsSchema:()=>v4,LocalRuntimeHost:()=>Q0,Llms:()=>XL,InMemoryWorkspaceManager:()=>E1,InMemoryMcpManager:()=>r$,HubUIClient:()=>H9,HubTransportError:()=>Ff,HubSessionClient:()=>J9,HubServerTransport:()=>R2,HubScheduleService:()=>H2,HubScheduleCommandService:()=>J2,HubRuntimeHost:()=>_0,HubCommandError:()=>c1,HookEventPayloadSchema:()=>C6,HookEventNameSchema:()=>O6,HookConfigFileName:()=>D1,HOOK_CONFIG_FILE_EVENT_MAP:()=>WW,HOOKS_CONFIG_DIRECTORY_NAME:()=>A4,GlobalSettingsSchema:()=>t2,GcpSettingsSchema:()=>m4,FileTeamPersistenceStore:()=>i6,FALLBACK_CLINE_RECOMMENDED_MODELS:()=>e6,DefaultToolNames:()=>Qf,DefaultRuntimeBuilder:()=>V2,DefaultLlmsSdk:()=>D8,DEFAULT_MODELS_CATALOG_URL:()=>z4,DEFAULT_INTERNAL_OCA_BASE_URL:()=>O1,DEFAULT_INTERNAL_IDCS_URL:()=>Y4,DEFAULT_INTERNAL_IDCS_SCOPES:()=>F4,DEFAULT_INTERNAL_IDCS_CLIENT_ID:()=>T4,DEFAULT_HUB_PORT:()=>M5,DEFAULT_HUB_PATHNAME:()=>G5,DEFAULT_HUB_HOST:()=>U5,DEFAULT_EXTERNAL_OCA_BASE_URL:()=>C1,DEFAULT_EXTERNAL_IDCS_URL:()=>h4,DEFAULT_EXTERNAL_IDCS_SCOPES:()=>K4,DEFAULT_EXTERNAL_IDCS_CLIENT_ID:()=>y4,CoreSettingsService:()=>o0,CoreSessionService:()=>H0,ContributionRegistry:()=>VL,ClineCore:()=>Z8,ClineAccountService:()=>yW,ChatViewStateSchema:()=>l9,ChatSummarySchema:()=>o6,ChatSessionStatusSchema:()=>a6,ChatSessionConfigSchema:()=>n6,ChatMessageSchema:()=>s6,ChatMessageRoleSchema:()=>t6,CORE_TELEMETRY_EVENTS:()=>I,CORE_BUILD_VERSION:()=>p9,BrowserWebSocketHubAdapter:()=>h8,BUILT_IN_PROVIDER_IDS:()=>MH,BUILT_IN_PROVIDER:()=>AW,AzureSettingsSchema:()=>g4,AwsSettingsSchema:()=>k4,AuthSettingsSchema:()=>E4,AgentTeamsRuntime:()=>d$,AgentTeam:()=>n1,Agent:()=>DL,ALL_DEFAULT_TOOL_NAMES:()=>N0});C(L,AI);import*as XL from"@clinebot/llms";import{buildClineSystemPrompt as AL,ContributionRegistry as VL,createClineTelemetryServiceConfig as BL,createClineTelemetryServiceMetadata as TL,createContributionRegistry as YL,createTool as FL,emptyWorkspaceManifest as yL,formatDisplayUserInput as hL,noopBasicLogger as KL,normalizeUserInput as UL,parseUserCommandEnvelope as ML,registerDisposable as GL}from"@clinebot/shared";import"@clinebot/shared/storage";var hZ={};z(hZ,{isClineAccountActionRequest:()=>i4,executeClineAccountAction:()=>n4,RpcClineAccountService:()=>hW,ClineAccountService:()=>yW});function yF(f){if(typeof f!=="object"||f===null||!("error"in f))return;let $=f.error;return typeof $==="string"&&$.trim()?$:void 0}function yZ(f,$,W){let J=yF(W);if(J)return J;let H=$.trim();if(H){let Q=H.length>200?`${H.slice(0,200)}...`:H;return`Cline account request failed with status ${f}: ${Q}`}return`Cline account request failed with status ${f}`}class yW{apiBaseUrl;getAuthTokenFn;getCurrentUserIdFn;getOrganizationMemberIdFn;getHeadersFn;requestTimeoutMs;fetchImpl;constructor(f){let $=f.apiBaseUrl.trim();if(!$)throw Error("apiBaseUrl is required");this.apiBaseUrl=$,this.getAuthTokenFn=f.getAuthToken,this.getCurrentUserIdFn=f.getCurrentUserId,this.getOrganizationMemberIdFn=f.getOrganizationMemberId,this.getHeadersFn=f.getHeaders,this.requestTimeoutMs=f.requestTimeoutMs??30000,this.fetchImpl=f.fetchImpl??fetch}async fetchMe(){return this.request("/api/v1/users/me")}async fetchRemoteConfig(){return this.request("/api/v1/users/me/remote-config")}async fetchFeaturebaseToken(){try{return await this.request("/api/v1/users/me/featurebase-token")}catch{return}}async fetchBalance(f){let $=await this.resolveUserId(f);return this.request(`/api/v1/users/${encodeURIComponent($)}/balance`)}async fetchUsageTransactions(f){let $=await this.resolveUserId(f);return(await this.request(`/api/v1/users/${encodeURIComponent($)}/usages`)).items??[]}async fetchPaymentTransactions(f){let $=await this.resolveUserId(f);return(await this.request(`/api/v1/users/${encodeURIComponent($)}/payments`)).paymentTransactions??[]}async fetchUserOrganizations(){return(await this.fetchMe()).organizations??[]}async fetchOrganization(f){let $=f.trim();if(!$)throw Error("organizationId is required");return this.request(`/api/v1/organizations/${encodeURIComponent($)}`)}async fetchOrganizationBalance(f){let $=f.trim();if(!$)throw Error("organizationId is required");return this.request(`/api/v1/organizations/${encodeURIComponent($)}/balance`)}async fetchOrganizationUsageTransactions(f){let $=f.organizationId.trim();if(!$)throw Error("organizationId is required");let W=await this.resolveOrganizationMemberId($,f.memberId);return(await this.request(`/api/v1/organizations/${encodeURIComponent($)}/members/${encodeURIComponent(W)}/usages`)).items??[]}async switchAccount(f){await this.request("/api/v1/users/active-account",{method:"PUT",body:{organizationId:f?.trim()||null},expectNoContent:!0})}async resolveUserId(f){let $=f?.trim();if($)return $;let J=(this.getCurrentUserIdFn?await this.getCurrentUserIdFn():void 0)?.trim();if(J)return J;let H=await this.fetchMe();if(!H.id?.trim())throw Error("Unable to resolve current user id");return H.id}async resolveOrganizationMemberId(f,$){let W=$?.trim();if(W)return W;let H=(this.getOrganizationMemberIdFn?await this.getOrganizationMemberIdFn(f):void 0)?.trim();if(H)return H;let Z=(await this.fetchUserOrganizations()).find((P)=>P.organizationId===f)?.memberId;if(!Z?.trim())throw Error(`Unable to resolve memberId for organization ${f}`);return Z}async request(f,$){let W=(await this.getAuthTokenFn())?.trim();if(!W)throw Error("No Cline account auth token found");let J=this.getHeadersFn?await this.getHeadersFn():{},H=new AbortController,Q=setTimeout(()=>H.abort(),this.requestTimeoutMs);try{let Z=await this.fetchImpl(new URL(f,this.apiBaseUrl),{method:$?.method??"GET",headers:{Authorization:`Bearer ${W}`,"Content-Type":"application/json",...J??{}},body:$?.body!==void 0?JSON.stringify($.body):void 0,signal:H.signal});if(Z.status===204||$?.expectNoContent){if(!Z.ok)throw Error(`Cline account request failed with status ${Z.status}`);return}let P=await Z.text(),j;if(P.trim())try{j=JSON.parse(P)}catch{if(!Z.ok)throw Error(yZ(Z.status,P,void 0));throw Error("Cline account response was not valid JSON")}if(!Z.ok)throw Error(yZ(Z.status,P,j));if(typeof j==="object"&&j!==null){let R=j;if(typeof R.success==="boolean"){if(!R.success)throw Error(R.error||"Cline account request failed");if(R.data!==void 0)return R.data}}if(j===void 0||j===null)throw Error("Cline account response payload was empty");return j}finally{clearTimeout(Q)}}}function i4(f){return f.action==="clineAccount"}async function n4(f,$){switch(f.operation){case"fetchMe":return $.fetchMe();case"fetchBalance":return $.fetchBalance(f.userId);case"fetchUsageTransactions":return $.fetchUsageTransactions(f.userId);case"fetchPaymentTransactions":return $.fetchPaymentTransactions(f.userId);case"fetchUserOrganizations":return $.fetchUserOrganizations();case"fetchOrganizationBalance":return $.fetchOrganizationBalance(f.organizationId);case"fetchOrganizationUsageTransactions":return $.fetchOrganizationUsageTransactions({organizationId:f.organizationId,memberId:f.memberId});case"switchAccount":return await $.switchAccount(f.organizationId),{updated:!0};case"fetchFeaturebaseToken":return $.fetchFeaturebaseToken?.();default:throw Error(`Unsupported Cline account operation: ${String(f)}`)}}class hW{executor;constructor(f){this.executor=f}async fetchMe(){return this.request({action:"clineAccount",operation:"fetchMe"})}async fetchBalance(f){return this.request({action:"clineAccount",operation:"fetchBalance",...f?.trim()?{userId:f.trim()}:{}})}async fetchUsageTransactions(f){return this.request({action:"clineAccount",operation:"fetchUsageTransactions",...f?.trim()?{userId:f.trim()}:{}})}async fetchPaymentTransactions(f){return this.request({action:"clineAccount",operation:"fetchPaymentTransactions",...f?.trim()?{userId:f.trim()}:{}})}async fetchUserOrganizations(){return this.request({action:"clineAccount",operation:"fetchUserOrganizations"})}async fetchOrganizationBalance(f){let $=f.trim();if(!$)throw Error("organizationId is required");return this.request({action:"clineAccount",operation:"fetchOrganizationBalance",organizationId:$})}async fetchOrganizationUsageTransactions(f){let $=f.organizationId.trim();if(!$)throw Error("organizationId is required");return this.request({action:"clineAccount",operation:"fetchOrganizationUsageTransactions",organizationId:$,...f.memberId?.trim()?{memberId:f.memberId.trim()}:{}})}async switchAccount(f){await this.request({action:"clineAccount",operation:"switchAccount",organizationId:f?.trim()||null})}async fetchFeaturebaseToken(){return this.request({action:"clineAccount",operation:"fetchFeaturebaseToken"})}async request(f){return(await this.executor.runProviderAction(f)).result}}var KZ={};z(KZ,{createOAuthClientCallbacks:()=>KW});function KW(f){return{onAuth:({url:$,instructions:W})=>{if(f.onOutput?.(W??"Complete sign-in in your browser."),f.openUrl)try{Promise.resolve(f.openUrl($)).catch((J)=>{f.onOpenUrlError?.({url:$,error:J})})}catch(J){f.onOpenUrlError?.({url:$,error:J})}f.onOutput?.($)},onPrompt:f.onPrompt,onServerListening:f.onServerListening,onServerClose:f.onServerClose}}Kf();var CZ={};z(CZ,{startClineDeviceAuth:()=>EH,refreshClineToken:()=>UW,loginClineOAuth:()=>k1,getValidClineCredentials:()=>MW,createClineOAuthProvider:()=>kH,completeClineDeviceAuth:()=>SH});var a4={authorize:"/api/v1/auth/authorize",token:"/api/v1/auth/token",register:"/api/v1/auth/register",refresh:"/api/v1/auth/refresh"},DZ={deviceAuthorization:"/user_management/authorize/device",authenticate:"/user_management/authenticate"},zH="https://api.workos.com",NH="client_01K3A541FN8TA3EPPHTD2325AR",hF="/auth",UZ=Array.from({length:11},(f,$)=>48801+$),KF=300000,UF=30000,S1=30000,MF=300,GF=5;class t0 extends Error{status;errorCode;constructor(f,$){super(f);this.name="ClineOAuthTokenError",this.status=$?.status,this.errorCode=$?.errorCode}isLikelyInvalidGrant(){if(this.errorCode&&/invalid_grant|invalid_token|unauthorized/i.test(this.errorCode))return!0;if(this.status===400||this.status===401||this.status===403)return/invalid|expired|revoked|unauthorized/i.test(this.message);return!1}}function DF(f){let $=Date.parse(f);if(Number.isNaN($))throw Error(`Invalid expiresAt value: ${f}`);return $}function bH(f,$,W={}){let J=f.userInfo.clineUserId??W.accountId,H=f.refreshToken??W.refresh;if(!H)throw Error("Token response did not include a refresh token");return{access:f.accessToken,refresh:H,expires:DF(f.expiresAt),accountId:J??void 0,email:f.userInfo.email||W.email,metadata:{provider:$,tokenType:f.tokenType,userInfo:f.userInfo}}}async function qH(f){if(!f)return{};return typeof f==="function"?await f():f}function MZ(f,$){if(typeof f!=="number"||!Number.isFinite(f)||f<=0)return $;return Math.floor(f)}async function GZ(f){await new Promise(($)=>setTimeout($,f))}function wH(f,$){if(!f.success||!f.data?.accessToken)throw Error($);return f.data}async function _Z(f,$){let W=await fetch(D$(zH,DZ.deviceAuthorization),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:f}),signal:AbortSignal.timeout($?.requestTimeoutMs??S1)}),J=await W.json().catch(()=>({}));if(!W.ok)throw new t0(`Device authorization failed: ${W.status}${J.error_description?` - ${J.error_description}`:""}`,{status:W.status,errorCode:J.error});if(!J.device_code||!J.user_code||!J.verification_uri)throw Error("Invalid WorkOS device authorization response");return{deviceCode:J.device_code,userCode:J.user_code,verificationUri:J.verification_uri,verificationUriComplete:J.verification_uri_complete,expiresInSeconds:MZ(J.expires_in,MF),pollIntervalSeconds:MZ(J.interval,GF)}}async function LZ(f){let $=Date.now()+f.expiresInSeconds*1000,W=Math.max(1,f.initialPollIntervalSeconds);while(Date.now()<=$){let J=await fetch(D$(f.workosApiBaseUrl,DZ.authenticate),{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:f.deviceCode,client_id:f.clientId}),signal:AbortSignal.timeout(f.requestTimeoutMs)}),H=await J.json().catch(()=>({}));if(J.ok){if(!H.access_token||!H.refresh_token)throw Error("Invalid WorkOS token response");return{accessToken:H.access_token,refreshToken:H.refresh_token,tokenType:H.token_type??"Bearer"}}switch(H.error){case"authorization_pending":{await GZ(W*1000);break}case"slow_down":{W+=1,await GZ(W*1000);break}case"access_denied":case"expired_token":case"invalid_grant":throw new t0(H.error_description||"WorkOS authorization failed",{status:J.status,errorCode:H.error});default:throw new t0(`WorkOS token polling failed: ${J.status}${H.error_description?` - ${H.error_description}`:""}`,{status:J.status,errorCode:H.error})}f.onProgress?.("Waiting for browser authentication confirmation...")}throw Error("WorkOS device authorization timed out")}async function OZ(f,$,W){let J={accessToken:f.accessToken,refreshToken:f.refreshToken},H=await fetch(D$($.apiBaseUrl,a4.register),{method:"POST",headers:{"Content-Type":"application/json",...await qH($.headers)},body:JSON.stringify(J),signal:AbortSignal.timeout($.requestTimeoutMs??S1)});if(!H.ok){let Z=await H.text().catch(()=>""),P=h1(Z);throw new t0(`Token registration failed: ${H.status}${P.message?` - ${P.message}`:""}`,{status:H.status,errorCode:P.code})}let Q=await H.json();return bH(wH(Q,"Invalid token exchange response"),W??$.provider)}async function _F(f,$,W,J){let H={grant_type:"authorization_code",code:f,client_type:"extension",redirect_uri:$,provider:J??W.provider},Q=await fetch(D$(W.apiBaseUrl,a4.token),{method:"POST",headers:{"Content-Type":"application/json",...await qH(W.headers)},body:JSON.stringify(H),signal:AbortSignal.timeout(W.requestTimeoutMs??S1)});if(!Q.ok){let P=await Q.text().catch(()=>""),j=h1(P);throw new t0(`Token exchange failed: ${Q.status}${j.message?` - ${j.message}`:""}`,{status:Q.status,errorCode:j.code})}let Z=await Q.json();return bH(wH(Z,"Invalid token exchange response"),J??W.provider)}async function k1(f){T0(f.telemetry,f.provider??"cline");let $=f.useWorkOSDeviceAuth??!0,W=f.callbackPorts?.length?f.callbackPorts:UZ,J=f.callbackPath??hF,H=$?null:await M0({ports:W,callbackPath:J,onListening:f.callbacks.onServerListening,onClose:f.callbacks.onServerClose}),Q=H?.callbackUrl||`http://127.0.0.1:${W[0]??UZ[0]}${J}`;try{let Z;if($){let P=NH,j=await _Z(P,f);f.callbacks.onAuth({url:j.verificationUriComplete??j.verificationUri,instructions:`Enter this code in your browser: ${j.userCode}`});let R=await LZ({clientId:P,deviceCode:j.deviceCode,expiresInSeconds:j.expiresInSeconds,initialPollIntervalSeconds:j.pollIntervalSeconds,requestTimeoutMs:f.requestTimeoutMs??S1,workosApiBaseUrl:zH,onProgress:f.callbacks.onProgress});Z=await OZ(R,f,f.provider)}else{let P=new URL(D$(f.apiBaseUrl,a4.authorize));P.searchParams.set("client_type","extension"),P.searchParams.set("callback_url",Q),P.searchParams.set("redirect_uri",Q),f.callbacks.onAuth({url:P.toString(),instructions:"Continue the authentication process in your browser."});let j,R=f.provider,X=await K1({waitForCallback:H?.waitForCallback??(async()=>null),cancelWait:H?.cancelWait??(()=>{}),onManualCodeInput:f.callbacks.onManualCodeInput,parseOptions:{includeProvider:!0}});if(X.error)throw Error(`OAuth error: ${X.error}`);if(j=X.code,R=X.provider??R,!j){let A=await f.callbacks.onPrompt({message:"Paste the authorization code (or full redirect URL):"}),V=y1(A,{includeProvider:!0});j=V.code,R=V.provider??R}if(!j)throw Error("Missing authorization code");Z=await _F(j,Q,f,R)}return Y0(f.telemetry,f.provider??"cline"),y0(f.telemetry,{id:Z.accountId,email:Z.email,provider:f.provider??"cline"}),Z}catch(Z){throw F0(f.telemetry,f.provider??"cline",Z instanceof Error?Z.message:String(Z)),Z}finally{H?.close()}}async function EH(f){return await _Z(NH,f)}async function SH(f){let $=f.provider??"cline";T0(f.telemetry,$);try{let W=await LZ({clientId:NH,deviceCode:f.deviceCode,expiresInSeconds:f.expiresInSeconds,initialPollIntervalSeconds:f.pollIntervalSeconds,requestTimeoutMs:f.requestTimeoutMs??S1,workosApiBaseUrl:zH}),J=await OZ(W,{apiBaseUrl:f.apiBaseUrl,headers:f.headers,requestTimeoutMs:f.requestTimeoutMs,provider:f.provider},f.provider);return Y0(f.telemetry,$),y0(f.telemetry,{id:J.accountId,email:J.email,provider:$}),J}catch(W){throw F0(f.telemetry,$,W instanceof Error?W.message:String(W)),W}}async function UW(f,$){let W=await fetch(D$($.apiBaseUrl,a4.refresh),{method:"POST",headers:{"Content-Type":"application/json",...await qH($.headers)},body:JSON.stringify({refreshToken:f.refresh,grantType:"refresh_token"}),signal:AbortSignal.timeout($.requestTimeoutMs??S1)});if(!W.ok){let Q=await W.text().catch(()=>""),Z=h1(Q);throw new t0(`Token refresh failed: ${W.status}${Z.message?` - ${Z.message}`:""}`,{status:W.status,errorCode:Z.code})}let J=await W.json(),H=f.metadata?.provider??$.provider;return bH(wH(J,"Invalid token refresh response"),H,f)}async function MW(f,$,W){if(!f)return null;let J=W?.refreshBufferMs??KF,H=W?.retryableTokenGraceMs??UF;if(W?.forceRefresh!==!0&&!_$(f,J))return f;try{return await UW(f,$)}catch(Z){if(Z instanceof t0&&Z.isLikelyInvalidGrant())return I0($.telemetry,$.provider??"cline","invalid_grant"),null;if(f.expires-Date.now()>H)return f;return null}}function kH(f){return{id:"cline",name:"Cline Account",usesCallbackServer:!(f.useWorkOSDeviceAuth??!0),async login($){return k1({...f,callbacks:$})},async refreshToken($){return UW($,f)},getApiKey($){return`workos:${$.access}`}}}Kf();var bZ={};z(bZ,{refreshOpenAICodexToken:()=>GW,openaiCodexOAuthProvider:()=>xH,normalizeOpenAICodexCredentials:()=>gH,loginOpenAICodex:()=>m1,isOpenAICodexTokenExpired:()=>mH,getValidOpenAICodexCredentials:()=>DW,OPENAI_CODEX_OAUTH_CONFIG:()=>o});import{nanoid as LF}from"nanoid";var o={authorizationEndpoint:"https://auth.openai.com/oauth/authorize",tokenEndpoint:"https://auth.openai.com/oauth/token",clientId:"app_EMoamEEZ73f0CkXaXp7hrann",redirectUri:"http://localhost:1455/auth/callback",scopes:"openid profile email offline_access",callbackPort:1455,jwtClaimPath:"https://api.openai.com/auth",refreshBufferMs:300000,retryableTokenGraceMs:30000,httpTimeoutMs:30000};class t4 extends Error{status;errorCode;constructor(f,$){super(f);this.name="OpenAICodexOAuthTokenError",this.status=$?.status,this.errorCode=$?.errorCode}isLikelyInvalidGrant(){if(this.errorCode&&/invalid_grant/i.test(this.errorCode))return!0;if(this.status===400||this.status===401||this.status===403)return/invalid_grant|revoked|expired|invalid refresh/i.test(this.message);return!1}}async function OF(f,$,W=o.redirectUri){let J=await fetch(o.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:o.clientId,code:f,code_verifier:$,redirect_uri:W}),signal:AbortSignal.timeout(o.httpTimeoutMs)});if(!J.ok)return{type:"failed"};let H=await J.json();if(!H.access_token||!H.refresh_token||typeof H.expires_in!=="number")return{type:"failed"};return{type:"success",access:H.access_token,refresh:H.refresh_token,expires:Date.now()+H.expires_in*1000,email:H.email,idToken:H.id_token}}async function CF(f){try{let $=await fetch(o.tokenEndpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:f,client_id:o.clientId}),signal:AbortSignal.timeout(o.httpTimeoutMs)});if(!$.ok){let J=await $.text().catch(()=>""),H=h1(J);throw new t4(`Token refresh failed: ${$.status}${H.message?` - ${H.message}`:""}`,{status:$.status,errorCode:H.code})}let W=await $.json();if(!W.access_token||!W.refresh_token||typeof W.expires_in!=="number")return{type:"failed"};return{type:"success",access:W.access_token,refresh:W.refresh_token,expires:Date.now()+W.expires_in*1000,email:W.email,idToken:W.id_token}}catch($){if($ instanceof t4)throw $;return{type:"failed"}}}async function zF(f="pi"){let{verifier:$,challenge:W}=await f4(),J=LF(32),H=new URL(o.authorizationEndpoint);return H.searchParams.set("response_type","code"),H.searchParams.set("client_id",o.clientId),H.searchParams.set("redirect_uri",o.redirectUri),H.searchParams.set("scope",o.scopes),H.searchParams.set("code_challenge",W),H.searchParams.set("code_challenge_method","S256"),H.searchParams.set("state",J),H.searchParams.set("id_token_add_organizations","true"),H.searchParams.set("codex_cli_simplified_flow","true"),H.searchParams.set("originator",f),{verifier:$,state:J,url:H.toString()}}function NF(){try{let f=new URL(o.redirectUri),$=f.port.length>0?Number.parseInt(f.port,10):o.callbackPort;return{host:f.hostname||"localhost",port:Number.isFinite($)?$:o.callbackPort,callbackPath:f.pathname||"/auth/callback",redirectUri:f.toString()}}catch{return{host:"localhost",port:o.callbackPort,callbackPath:"/auth/callback",redirectUri:o.redirectUri}}}function zZ(f,$){let W=$?Tf($):Tf(f),J=W?W:Tf(f),Q=J?.[o.jwtClaimPath]?.chatgpt_account_id;if(typeof Q==="string"&&Q.length>0)return Q;let Z=J?.organizations;if(Array.isArray(Z)&&Z.length>0){let j=Z[0];if(typeof j?.id==="string"&&j.id.length>0)return j.id}let P=J?.chatgpt_account_id;if(typeof P==="string"&&P.length>0)return P;return null}function NZ(f,$){let W=zZ(f.access,f.idToken)??$?.accountId;if(!W)throw Error("Failed to extract accountId from token");return{access:f.access,refresh:f.refresh||$?.refresh||"",expires:f.expires,accountId:W,email:f.email??$?.email,metadata:{...$?.metadata??{},provider:"openai-codex"}}}async function m1(f){T0(f.telemetry,"openai-codex");let $=NF(),{verifier:W,state:J,url:H}=await zF(f.originator),Q=await M0({host:$.host,ports:[$.port],callbackPath:$.callbackPath,expectedState:J});f.onAuth({url:H,instructions:"Continue the authentication process in your browser."});let Z;try{let P=await K1({waitForCallback:Q.waitForCallback,cancelWait:Q.cancelWait,onManualCodeInput:f.onManualCodeInput,parseOptions:{allowHashCodeState:!0}});if(P.state&&P.state!==J)throw Error("State mismatch");if(Z=P.code,!Z){let X=await f.onPrompt({message:"Paste the authorization code (or full redirect URL):"}),A=y1(X,{allowHashCodeState:!0});if(A.state&&A.state!==J)throw Error("State mismatch");Z=A.code}if(!Z)throw Error("Missing authorization code");let j=await OF(Z,W,$.redirectUri);if(j.type!=="success")throw Error("Token exchange failed");let R=NZ(j);return Y0(f.telemetry,"openai-codex"),y0(f.telemetry,{id:R.accountId,email:R.email,provider:"openai-codex"}),R}catch(P){throw F0(f.telemetry,"openai-codex",P instanceof Error?P.message:String(P)),P}finally{Q.close()}}async function GW(f,$){let W=await CF(f);if(W.type!=="success")throw Error("Failed to refresh OpenAI Codex token");let J=NZ(W,$);if(!J.refresh)throw Error("Failed to refresh OpenAI Codex token: missing refresh token");return J}async function DW(f,$){if(!f)return null;let W=$?.refreshBufferMs??o.refreshBufferMs,J=$?.retryableTokenGraceMs??o.retryableTokenGraceMs;if($?.forceRefresh!==!0&&!_$(f,W))return f;try{return await GW(f.refresh,f)}catch(Q){if(Q instanceof t4&&Q.isLikelyInvalidGrant())return I0($?.telemetry,"openai-codex","invalid_grant"),null;if(f.expires-Date.now()>J)return f;return null}}function mH(f,$=o.refreshBufferMs){return _$(f,$)}function gH(f){let $=f.accountId??zZ(f.access);if(!$)throw Error("Failed to extract accountId from token");return{...f,accountId:$,metadata:{...f.metadata??{},provider:"openai-codex"}}}var xH={id:"openai-codex",name:"ChatGPT Plus/Pro (ChatGPT Subscription)",usesCallbackServer:!0,async login(f){return m1({onAuth:f.onAuth,onPrompt:f.onPrompt,onProgress:f.onProgress,onManualCodeInput:f.onManualCodeInput})},async refreshToken(f){return GW(f.refresh,f)},getApiKey(f){return f.access}};var kj={};z(kj,{ClineCore:()=>Z8});function qZ(f){if(f===!0)return{};if(!f)return;return f}function wZ(f){if(f==="user")return"global";return f}class IH{getService;constructor(f){this.getService=f}async start(){await this.getService().start()}async stop(){await this.getService().stop()}async reconcileNow(){await this.getService().reconcileNow()}ingestEvent(f){let $=this.getService().ingestEvent(f);return{event:$.event,duplicate:$.duplicate,matchedSpecIds:$.matchedSpecs.map((W)=>W.specId),queuedRuns:$.queuedRuns,suppressions:$.suppressions}}listEvents(f){return this.getService().listEventLogs(f)}getEvent(f){return this.getService().getEventLog(f)}listSpecs(f){return this.getService().listSpecs(f)}listRuns(f){return this.getService().listRuns(f)}}function EZ(f){let{host:$}=f;return{async startSession(W){let J=(W.cwd?.trim()||W.workspaceRoot).trim(),H=await $.startSession({source:W.source?.trim()||jf.CLI,interactive:!1,config:{providerId:b1(W.provider),modelId:W.model,apiKey:W.apiKey?.trim()||void 0,cwd:J,workspaceRoot:W.workspaceRoot,systemPrompt:W.systemPrompt??"",mode:wF(W),maxIterations:W.maxIterations,enableTools:W.enableTools!==!1,enableSpawnAgent:W.enableSpawn!==!1,enableAgentTeams:W.enableTeams!==!1,disableMcpSettingsTools:W.disableMcpSettingsTools,missionLogIntervalSteps:W.missionStepInterval,missionLogIntervalMs:W.missionTimeIntervalMs},toolPolicies:W.toolPolicies??{"*":{autoApprove:W.autoApproveTools!==!1}},localRuntime:{extensionContext:f.getExtensionContext(),configExtensions:W.configExtensions}});return{sessionId:H.sessionId,startResult:{sessionId:H.sessionId,manifestPath:H.manifestPath,messagesPath:H.messagesPath}}},async sendSession(W,J){let H=await $.runTurn({sessionId:W,prompt:J.prompt,userImages:J.attachments?.userImages,userFiles:J.attachments?.userFiles?.map((Q)=>Q.content),delivery:J.delivery});if(!H)throw Error("ClineCore automation runtime returned no result");return{result:qF(H)}},async abortSession(W){return await $.abort(W,Error("ClineCore automation abort")),{applied:!0}},async stopSession(W){return await $.stopSession(W),{applied:!0}}}}function s4(f){let $=bF(f.automationService,f.automation),W=f.context?.client??(f.clientName?{name:f.clientName}:void 0),J=f.context?.user??(f.distinctId?{distinctId:f.distinctId}:void 0),H=f.context?.logger??f.logger,Q=f.context?.telemetry??f.telemetry;if(!$&&!W&&!J&&!H&&!Q)return f.context;return{...f.context??{},...W?{client:W}:{},...J?{user:J}:{},...H?{logger:H}:{},...Q?{telemetry:Q}:{},...$?{automation:$}:{}}}function bF(f,$){if(!f)return;return{ingestEvent:(W)=>{$.ingestEvent(W)}}}function qF(f){return{text:f.text,usage:{inputTokens:f.usage.inputTokens,outputTokens:f.usage.outputTokens,cacheReadTokens:f.usage.cacheReadTokens,cacheWriteTokens:f.usage.cacheWriteTokens,totalCost:f.usage.totalCost},inputTokens:f.usage.inputTokens,outputTokens:f.usage.outputTokens,iterations:f.iterations,finishReason:f.finishReason,toolCalls:f.toolCalls.map(($)=>({name:$.name,input:$.input,output:$.output,error:$.error,durationMs:$.durationMs}))}}function wF(f){return f.mode==="plan"?"plan":f.mode==="yolo"?"yolo":"act"}var fP={};z(fP,{createCoreSettingsService:()=>S$,CoreSettingsService:()=>o0});import{existsSync as pH}from"node:fs";import{basename as sZ,isAbsolute as Zy,relative as Py}from"node:path";var pZ={};z(pZ,{resolveWorkflowsConfigSearchPaths:()=>wW,resolveSkillsConfigSearchPaths:()=>bW,resolveRulesConfigSearchPaths:()=>qW,parseWorkflowConfigFromMarkdown:()=>NW,parseSkillConfigFromMarkdown:()=>CW,parseRuleConfigFromMarkdown:()=>zW,createWorkflowsConfigDefinition:()=>kW,createUserInstructionConfigService:()=>s0,createSkillsConfigDefinition:()=>EW,createRulesConfigDefinition:()=>SW,WORKFLOWS_CONFIG_DIRECTORY_NAME:()=>OW,UnifiedConfigFileWatcher:()=>w$,SKILLS_CONFIG_DIRECTORY_NAME:()=>LW,RULES_CONFIG_DIRECTORY_NAME:()=>W6});import{createHash as EF}from"node:crypto";import{watch as SF}from"node:fs";import{readdir as kF,readFile as mF}from"node:fs/promises";import{join as gF}from"node:path";function xF(f){return EF("sha1").update(f).digest("hex")}function mZ(f){return Boolean(f&&typeof f==="object"&&"code"in f)}function SZ(f){return mZ(f)&&f.code==="ENOENT"}function kZ(f){return mZ(f)&&(f.code==="EACCES"||f.code==="EPERM")}class w${definitions;debounceMs;emitParseErrors;listeners=new Set;recordsByType=new Map;watchersByDirectory=new Map;baseTypesByDirectory=new Map;watchedTypesByDirectory=new Map;discoveredDirectoriesByType=new Map;definitionsByType=new Map;pendingTypes=new Set;flushTimer;refreshQueue=Promise.resolve();started=!1;constructor(f,$){if(f.length===0)throw Error("UnifiedConfigFileWatcher requires at least one definition.");this.definitions=f,this.debounceMs=$?.debounceMs??75,this.emitParseErrors=$?.emitParseErrors??!1;for(let W of f){if(this.definitionsByType.has(W.type))throw Error(`Duplicate unified config definition type '${W.type}'.`);this.definitionsByType.set(W.type,W),this.recordsByType.set(W.type,new Map),this.discoveredDirectoriesByType.set(W.type,new Set);for(let J of W.directories){let H=this.baseTypesByDirectory.get(J);if(H)H.add(W.type);else this.baseTypesByDirectory.set(J,new Set([W.type]))}}}subscribe(f){return this.listeners.add(f),()=>{this.listeners.delete(f)}}async start(){if(this.started)return;this.started=!0,await this.refreshAll(),this.startDirectoryWatchers()}stop(){if(this.started=!1,this.flushTimer)clearTimeout(this.flushTimer),this.flushTimer=void 0;this.pendingTypes.clear();for(let f of this.watchersByDirectory.values())f.close();this.watchersByDirectory.clear(),this.watchedTypesByDirectory=new Map}async refreshAll(){await this.enqueueRefresh(async()=>{for(let f of this.definitions)await this.refreshTypeInternal(f)})}async refreshType(f){let $=this.definitionsByType.get(f);if(!$)throw Error(`Unknown unified config type '${f}'.`);await this.enqueueRefresh(async()=>{await this.refreshTypeInternal($)})}getSnapshot(f){let $=this.recordsByType.get(f);return new Map([...$?.entries()??[]].map(([W,J])=>[W,{...J}]))}getAllSnapshots(){let f=new Map;for(let[$,W]of this.recordsByType.entries())f.set($,new Map([...W.entries()].map(([J,H])=>[J,{...H}])));return f}emit(f){for(let $ of this.listeners)$(f)}enqueueRefresh(f){return this.refreshQueue=this.refreshQueue.then(f,f),this.refreshQueue}startDirectoryWatchers(){this.syncDirectoryWatchers()}syncDirectoryWatchers(){let f=this.buildDesiredTypesByDirectory();for(let[$,W]of this.watchersByDirectory.entries()){if(f.has($))continue;W.close(),this.watchersByDirectory.delete($)}this.watchedTypesByDirectory=f;for(let $ of f.keys()){if(this.watchersByDirectory.has($))continue;try{let W=SF($,()=>{let J=this.watchedTypesByDirectory.get($);if(!J)return;for(let H of J)this.pendingTypes.add(H);this.scheduleFlush()});this.watchersByDirectory.set($,W),W.on("error",(J)=>{let H=this.watchedTypesByDirectory.get($);if(!H)return;for(let Q of H)this.emit({kind:"error",type:Q,error:J,filePath:$})})}catch(W){if(!SZ(W)&&!kZ(W)){let J=f.get($);if(!J)continue;for(let H of J)this.emit({kind:"error",type:H,error:W,filePath:$})}}}}scheduleFlush(){if(this.flushTimer)clearTimeout(this.flushTimer);this.flushTimer=setTimeout(()=>{this.flushTimer=void 0;let f=[...this.pendingTypes];this.pendingTypes.clear(),this.enqueueRefresh(async()=>{for(let $ of f){let W=this.definitionsByType.get($);if(!W)continue;await this.refreshTypeInternal(W)}})},this.debounceMs)}async refreshTypeInternal(f){let{records:$,discoveredDirectories:W}=await this.loadDefinition(f),J=this.recordsByType.get(f.type)??new Map;for(let[H,Q]of J.entries()){if($.has(H))continue;this.emit({kind:"remove",type:f.type,id:H,filePath:Q.filePath})}for(let[H,Q]of $.entries()){let Z=J.get(H);if(Z&&Z.filePath===Q.filePath&&Z.fingerprint===Q.fingerprint)continue;this.emit({kind:"upsert",record:{type:Q.type,id:H,item:Q.item,filePath:Q.filePath}})}if(this.recordsByType.set(f.type,$),this.discoveredDirectoriesByType.set(f.type,W),this.started)this.syncDirectoryWatchers()}async loadDefinition(f){let $=new Map,W=new Set;for(let J of f.directories){W.add(J);let H=f.discoverFiles?await f.discoverFiles(J):await this.readDirectoryFileCandidates(J);for(let Q of H){let{fileName:Z,filePath:P}=Q;if(W.add(Q.directoryPath),f.includeFile&&!f.includeFile(Z,P))continue;try{let j=await mF(P,"utf8"),R={type:f.type,directoryPath:Q.directoryPath,fileName:Z,filePath:P,content:j},X=f.parseFile(R),A=f.resolveId(X,R).trim();if(!A)continue;$.set(A,{type:f.type,id:A,item:X,filePath:P,fingerprint:xF(j)})}catch(j){if(this.emitParseErrors)this.emit({kind:"error",type:f.type,error:j,filePath:P})}}}return{records:$,discoveredDirectories:W}}buildDesiredTypesByDirectory(){let f=new Map;for(let[$,W]of this.baseTypesByDirectory.entries())f.set($,new Set(W));for(let[$,W]of this.discoveredDirectoriesByType.entries())for(let J of W){let H=f.get(J);if(H)H.add($);else f.set(J,new Set([$]))}return f}async readDirectoryFileCandidates(f){try{return(await kF(f,{withFileTypes:!0})).filter((W)=>W.isFile()).map((W)=>({directoryPath:f,fileName:W.name,filePath:gF(f,W.name)})).sort((W,J)=>W.fileName.localeCompare(J.fileName))}catch($){if(SZ($)||kZ($))return[];throw $}}}import{readdir as vH,readFile as IF,stat as gZ}from"node:fs/promises";import{basename as E$,dirname as vF,extname as uH,join as Uf}from"node:path";import{RULES_CONFIG_DIRECTORY_NAME as W6,resolveRulesConfigSearchPaths as uF,resolveSkillsConfigSearchPaths as cF,resolveWorkflowsConfigSearchPaths as dF,SKILLS_CONFIG_DIRECTORY_NAME as LW,WORKFLOWS_CONFIG_DIRECTORY_NAME as OW}from"@clinebot/shared/storage";import rF from"yaml";var o4="SKILL.md",lF="managed.json",pF=new Set([".md",".markdown",".txt"]);function cH(f){return f.trim().toLowerCase()}function _W(f){let $=f;return $?.code==="ENOENT"||$?.code==="EACCES"||$?.code==="EPERM"}function e4(f){return pF.has(uH(f).toLowerCase())}async function dH(f){try{let $=await vH(f,{withFileTypes:!0}),W=[];for(let J of $){if(!J.isDirectory())continue;let H=Uf(f,J.name),Q=Uf(H,lF);try{let Z=await IF(Q,"utf8"),P=JSON.parse(Z);if(P&&typeof P==="object")W.push(H)}catch(Z){if(_W(Z))continue;if(Z?.name==="SyntaxError")continue;throw Z}}return W.sort((J,H)=>J.localeCompare(H))}catch($){if(_W($))return[];throw $}}function rH(f){let $=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,W=f.match($);if(!W)return{data:{},body:f,hadFrontmatter:!1};let[,J,H]=W;try{let Q=rF.parse(J);return{data:Q&&typeof Q==="object"&&!Array.isArray(Q)?Q:{},body:H,hadFrontmatter:!0}}catch(Q){let Z=Q instanceof Error?Q.message:String(Q);return{data:{},body:f,hadFrontmatter:!0,parseError:Z}}}function f6(f,$,W){if(f===void 0||f===null){if(W)throw Error(`Missing required frontmatter field '${$}'.`);return}if(typeof f!=="string")throw Error(`Frontmatter field '${$}' must be a string.`);let J=f.trim();if(!J&&W)throw Error(`Frontmatter field '${$}' cannot be empty.`);return J||void 0}function g1(f,$){if(f===void 0||f===null)return;if(typeof f!=="boolean")throw Error(`Frontmatter field '${$}' must be a boolean.`);return f}function CW(f,$){let{data:W,body:J,parseError:H}=rH(f);if(H)throw Error(`Failed to parse YAML frontmatter: ${H}`);let Q=J.trim();if(!Q)throw Error("Missing instructions body in skill file.");let P=f6(W.name,"name",!1)??$.trim();if(!P)throw Error("Missing skill name.");return{name:P,description:f6(W.description,"description",!1),disabled:g1(W.disabled,"disabled")??(g1(W.enabled,"enabled")===!1?!0:void 0),instructions:Q,frontmatter:W}}function zW(f,$){let{data:W,body:J,parseError:H}=rH(f);if(H)throw Error(`Failed to parse YAML frontmatter: ${H}`);let Q=J.trim();if(!Q)throw Error("Missing instructions body in rule file.");let Z=f6(W.name,"name",!1)??$.trim();if(!Z)throw Error("Missing rule name.");return{name:Z,disabled:g1(W.disabled,"disabled")??(g1(W.enabled,"enabled")===!1?!0:void 0),instructions:Q,frontmatter:W}}function NW(f,$){let{data:W,body:J,parseError:H}=rH(f);if(H)throw Error(`Failed to parse YAML frontmatter: ${H}`);let Q=J.trim();if(!Q)throw Error("Missing instructions body in workflow file.");let Z=f6(W.name,"name",!1)??$.trim();if(!Z)throw Error("Missing workflow name.");return{name:Z,disabled:g1(W.disabled,"disabled")??(g1(W.enabled,"enabled")===!1?!0:void 0),instructions:Q,frontmatter:W}}function bW(f){return cF(f)}function qW(f){return uF(f)}function wW(f){return dF(f)}async function xZ(f){if(E$(f)===".cline"){let $=await dH(f);return(await Promise.all($.map((J)=>xZ(Uf(J,LW))))).flat()}try{let $=await vH(f,{withFileTypes:!0}),W=[];for(let J of $){if(J.isFile()&&J.name===o4){W.push({directoryPath:f,fileName:J.name,filePath:Uf(f,J.name)});continue}if(J.isDirectory())W.push({directoryPath:Uf(f,J.name),fileName:o4,filePath:Uf(f,J.name,o4)})}return W}catch($){if(_W($))return[];throw $}}async function $6(f){if(E$(f)===".cline"){let $=await dH(f);return(await Promise.all($.map((J)=>$6(Uf(J,"rules.md"))))).flat()}try{if((await gZ(f)).isFile())return[{directoryPath:vF(f),fileName:E$(f),filePath:f}]}catch($){if(!_W($))throw $}try{let W=(await vH(f,{withFileTypes:!0})).filter((H)=>H.isFile()&&e4(H.name)).map((H)=>({directoryPath:f,fileName:H.name,filePath:Uf(f,H.name)})),J=Uf(f,"AGENTS.md");try{if((await gZ(J)).isFile()){if(!W.some((Z)=>Z.fileName==="AGENTS.md"))W.push({directoryPath:f,fileName:"AGENTS.md",filePath:J})}}catch{}return W}catch($){if(_W($))return[];throw $}}async function iF(f){if(E$(f)===".cline"){let $=await dH(f);return(await Promise.all($.map((J)=>$6(Uf(J,OW))))).flat()}return $6(f)}function EW(f){let $=f?.directories??bW(f?.workspacePath),W=f?.workspacePath?Uf(f.workspacePath,".cline"):void 0;return{type:"skill",directories:W?[...$,W]:$,discoverFiles:xZ,includeFile:(J)=>J===o4,parseFile:(J)=>CW(J.content,E$(J.directoryPath)),resolveId:(J)=>cH(J.name)}}function SW(f){let $=f?.directories??qW(f?.workspacePath),W=f?.workspacePath?Uf(f.workspacePath,".cline"):void 0;return{type:"rule",directories:W?[...$,W]:$,discoverFiles:$6,includeFile:(J,H)=>J===".clinerules"||e4(J)||e4(H),parseFile:(J)=>zW(J.content,E$(J.filePath,uH(J.filePath))),resolveId:(J)=>cH(J.name)}}function kW(f){let $=f?.directories??wW(f?.workspacePath),W=f?.workspacePath?Uf(f.workspacePath,".cline"):void 0;return{type:"workflow",directories:W?[...$,W]:$,discoverFiles:iF,includeFile:(J)=>e4(J),parseFile:(J)=>NW(J.content,E$(J.filePath,uH(J.filePath))),resolveId:(J)=>cH(J.name)}}function IZ(f){let $=[EW(f?.skills),SW(f?.rules),kW(f?.workflows)];return new w$($,{debounceMs:f?.debounceMs,emitParseErrors:f?.emitParseErrors})}import{truncateSplit as nF}from"@clinebot/shared";function aF(f){return f.disabled!==!0}function vZ(f,$){return[...f.getSnapshot($).entries()].map(([W,J])=>({id:W,record:J})).filter(({record:W})=>aF(W.item)).map(({id:W,record:J})=>({id:W,name:J.item.name,instructions:J.item.instructions,description:nF(J.item.description??J.item.instructions,"."),kind:$})).sort((W,J)=>W.name.localeCompare(J.name))}function mW(f){let $=new Map;for(let W of[...vZ(f,"workflow"),...vZ(f,"skill")])if(!$.has(W.name))$.set(W.name,W);return[...$.values()].sort((W,J)=>W.name.localeCompare(J.name))}function uZ(f,$){if(!f.startsWith("/")||f.length<2)return f;let W=f.match(/^\/(\S+)/);if(!W)return f;let J=W[1];if(!J)return f;let H=J.length+1,Q=f.slice(H),Z=mW($).find((P)=>P.name===J);return Z?`${Z.instructions}${Q}`:f}var dZ={};z(dZ,{mergeRulesForSystemPrompt:()=>I1,loadRulesForSystemPromptFromWatcher:()=>lH,listEnabledRulesFromWatcher:()=>cZ,isRuleEnabled:()=>J6,formatRulesForSystemPrompt:()=>x1});function J6(f){return f.disabled!==!0}function x1(f){if(f.length===0)return"";return`
183
+
184
+ # Rules
185
+ ${f.map((W)=>`## ${W.name}
186
+ ${W.instructions}`).join(`
187
+
188
+ `)}`}function I1(f,$){let W=f?.trim(),J=$?.trim();if(W&&J)return`${W}
189
+
190
+ ${J}`;return W||J||void 0}function cZ(f){return[...f.getSnapshot("rule").values()].map((W)=>W.item).filter(J6).sort((W,J)=>W.name.localeCompare(J.name))}function lH(f){return x1(cZ(f))}function H6(f){return f.trim().replace(/^\/+/,"").toLowerCase()}function tF(f){if(!f||f.length===0)return;let $=f.map(H6).filter((W)=>W.length>0);return $.length>0?new Set($):void 0}function sF(f,$,W){if(!W)return!0;let J=H6(f),H=H6($),Q=J.includes(":")?J.split(":").at(-1)??J:J,Z=H.includes(":")?H.split(":").at(-1)??H:H;return W.has(J)||W.has(H)||W.has(Q)||W.has(Z)}function gW(f,$){let W=tF($);return[...f.getSnapshot("skill").entries()].map(([H,Q])=>{let Z=Q.item;return{id:H,name:Z.name.trim(),description:Z.description?.trim(),disabled:Z.disabled===!0,skill:Z}}).filter((H)=>sF(H.id,H.name,W))}function oF(f,$){return gW(f,$).filter((W)=>!W.disabled).map((W)=>W.name.trim()).filter((W)=>W.length>0).sort((W,J)=>W.localeCompare(J))}function eF(f,$,W){let J=H6($);if(!J)return{error:"Missing skill name."};let H=gW(f,W),Q=H.find((X)=>X.id===J);if(Q){let{skill:X}=Q;if(X.disabled===!0)return{error:`Skill "${X.name}" is configured but disabled.`};return{id:Q.id,skill:X}}let Z=J.includes(":")?J.split(":").at(-1)??J:J,P=H.filter(({id:X})=>{if(X===Z)return!0;return X.endsWith(`:${Z}`)}),j=P.filter(({skill:X})=>X.disabled!==!0);if(j.length===1){let{id:X,skill:A}=j[0];return{id:X,skill:A}}if(j.length>1)return{error:`Skill "${$}" is ambiguous. Use one of: ${j.map(({id:X})=>X).join(", ")}`};if(P.length===1){let{skill:X}=P[0];return{error:`Skill "${X.name}" is configured but disabled.`}}if(P.length>1)return{error:`Skill "${$}" is ambiguous, and all matches are disabled: ${P.map(({id:X})=>X).join(", ")}`};let R=oF(f,W);return{error:R.length>0?`Skill "${$}" not found. Available skills: ${R.join(", ")}`:"No skills are currently available."}}function fy(f,$=Promise.resolve(),W){let J=new Set,H=async(Q,Z)=>{await $;let P=eF(f,Q,W);if("error"in P)return P.error;let{id:j,skill:R}=P;if(J.has(j))return`Skill "${R.name}" is already running.`;J.add(j);try{let X=Z?.trim(),A=X?`
191
+ <command-args>${X}</command-args>`:"",V=R.description?.trim()?`Description: ${R.description.trim()}
192
+
193
+ `:"";return`<command-name>${R.name}</command-name>${A}
194
+ <command-instructions>
195
+ ${V}${R.instructions}
196
+ </command-instructions>`}finally{J.delete(j)}};return Object.defineProperty(H,"configuredSkills",{get:()=>gW(f,W).map(({skill:Q,...Z})=>Z),enumerable:!0,configurable:!1}),H}function rZ(f){let $=f.watcherReady??Promise.resolve();return{name:"cline-user-instructions",manifest:{capabilities:[f.includeRules?"rules":void 0,f.registerSkillsTool?"tools":void 0,f.includeSkills||f.includeWorkflows?"commands":void 0].filter((J)=>Boolean(J))},async setup(J){if(await $,f.includeRules)J.registerRule({id:"cline-user-instructions:rules",source:"user-instruction-watcher",content:()=>lH(f.watcher)});if(f.registerSkillsTool)J.registerTool(A$(fy(f.watcher,$,f.allowedSkillNames)));for(let H of mW(f.watcher).filter((Q)=>Q.kind==="skill"&&f.includeSkills||Q.kind==="workflow"&&f.includeWorkflows))J.registerCommand({name:H.name,description:H.description,handler:(Q)=>{let Z=Q.trim();return Z?`${H.instructions}
197
+
198
+ ${Z}`:H.instructions}})}}}class lZ{watcher;ready;stopped=!1;constructor(f){this.watcher=IZ(f)}start(){if(!this.ready)this.stopped=!1,this.ready=this.watcher.start();return this.ready}stop(){if(this.stopped)return;this.stopped=!0,this.watcher.stop(),this.ready=void 0}async refreshType(f){await this.start(),await this.watcher.refreshType(f)}listRecords(f){return[...this.watcher.getSnapshot(f).entries()].map(([$,W])=>({type:f,id:$,filePath:W.filePath,item:W.item}))}listRuntimeCommands(){return mW(this.watcher)}resolveRuntimeSlashCommand(f){return uZ(f,this.watcher)}hasConfiguredSkills(f){return gW(this.watcher,f).length>0}createExtension(f){return rZ({...f,watcher:this.watcher,watcherReady:(this.ready??Promise.resolve()).catch(()=>{})})}}function s0(f){return new lZ(f)}import{readFile as $y,writeFile as Wy}from"node:fs/promises";import nZ from"yaml";function Jy(f){let $=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/,W=f.match($);if(!W)return{data:{},body:f,hadFrontmatter:!1};let[,J,H]=W,Q=nZ.parse(J);return{data:Q&&typeof Q==="object"&&!Array.isArray(Q)?Q:{},body:H,hadFrontmatter:!0}}function iZ(f,$){return`---
199
+ ${nZ.stringify(f).trimEnd()}
200
+ ---
201
+ ${$}`}function Hy(f,$){let{data:W,body:J,hadFrontmatter:H}=Jy(f);if(!H&&$)return f;if($){if(delete W.disabled,W.enabled===!1)delete W.enabled;if(Object.keys(W).length===0)return J;return iZ(W,J)}return W.disabled=!0,iZ(W,J)}async function aZ({filePath:f,enabled:$}){let W=await $y(f,"utf8"),J=Hy(W,$);return await Wy(f,J),{filePath:f,enabled:$,disabled:!$}}K0();var tZ={};z(tZ,{listPluginTools:()=>xW});K0();function Qy(f,$){if(!f.setup)return[];let W=[],J={registerTool:(H)=>W.push(H),registerCommand:()=>{},registerMessageBuilder:()=>{},registerRule:()=>{},registerProvider:()=>{},registerAutomationEventType:()=>{}};return f.setup(J,{workspaceInfo:$}),W}async function xW(f){let $=C$({workspacePath:f.workspacePath,cwd:f.cwd}),W=rf(f.disabledToolNames),J=[];for(let H of $){let Q=await U0([H],{cwd:f.cwd,providerId:f.providerId,modelId:f.modelId});for(let Z of Q.plugins)for(let P of Qy(Z,{rootPath:f.workspacePath}))J.push({name:P.name,pluginName:Z.name,path:H,source:H.startsWith(f.workspacePath)?"workspace-plugin":"global-plugin",enabled:!W.has(P.name),description:P.description?.trim()||void 0})}return J.sort((H,Q)=>{let Z=H.name.localeCompare(Q.name);if(Z!==0)return Z;return H.path.localeCompare(Q.path)})}function iH(f,$){if(!$)return"global";let W=Py($,f);return!W.startsWith("..")&&!Zy(W)?"workspace":"global"}function Q6(f){return[...f].sort(($,W)=>{let J=(H)=>{switch(H){case"workspace":case"workspace-plugin":return 0;case"global":case"global-plugin":return 1;case"builtin":return 2}};if($.source!==W.source)return J($.source)-J(W.source);return $.name.localeCompare(W.name)})}function eZ(f){return f.workspaceRoot?.trim()||f.cwd?.trim()||""}async function oZ(f,$){if(f.userInstructionService)return await $(f.userInstructionService);let W=eZ(f);if(!W)return await $(void 0);let J=s0({skills:{workspacePath:W},rules:{workspacePath:W},workflows:{workspacePath:W}});try{return await J.start(),await $(J)}finally{J.stop()}}function jy(f,$){if(!f)return;let W=f.listRecords("skill");if($.id){let J=W.find((H)=>H.id===$.id);if(J)return J}for(let J of W)if(J.filePath===$.path||J.item.name===$.name||J.id===$.name)return J;return}class o0{async list(f={}){return await oZ(f,async($)=>{let W=eZ(f),J=[],H=[],Q=[],Z=[];if($){for(let P of $.listRecords("workflow")){let j=P.item;J.push({id:P.id,name:j.name,path:P.filePath,enabled:j.disabled!==!0,kind:"workflow",source:iH(P.filePath,W),description:j.instructions,toggleable:!1})}for(let P of $.listRecords("rule")){let j=P.item;H.push({id:P.id,name:j.name,path:P.filePath,enabled:j.disabled!==!0,kind:"rule",source:iH(P.filePath,W),description:j.instructions,toggleable:!1})}for(let P of $.listRecords("skill")){let j=P.item;Q.push({id:P.id,name:j.name,path:P.filePath,enabled:j.disabled!==!0,kind:"skill",source:iH(P.filePath,W),description:j.description,toggleable:!0})}}if(W)try{for(let P of await xW({workspacePath:W,cwd:f.cwd,providerId:f.availabilityContext?.providerId,modelId:f.availabilityContext?.modelId}))Z.push({id:`${P.pluginName}:${P.name}:${P.path}`,name:P.name,path:P.path,enabled:P.enabled,kind:"tool",source:P.source,description:P.description,toggleable:!0})}catch{}return{workflows:Q6(J.filter((P)=>pH(P.path))),rules:Q6(H.filter((P)=>pH(P.path))),skills:Q6(Q.filter((P)=>pH(P.path))),tools:Q6(Z)}})}async toggle(f){if(f.type==="skills")return await oZ(f,async($)=>{let W=jy($,f),J=W?.filePath;if(!J)throw Error(`Unable to resolve skill setting '${f.id??f.name??sZ(f.path??"")}'.`);let H=W?.item&&"disabled"in W.item?W.item.disabled!==!0:void 0,Q=f.enabled??(H!==void 0?!H:void 0);if(Q===void 0)throw Error(`Cannot determine toggle state for skill '${f.id??f.name??sZ(f.path??"")}'; provide an explicit enabled value or a resolvable workspace context.`);return await aZ({filePath:J,enabled:Q}),await $?.refreshType("skill"),{snapshot:await this.list({...f,userInstructionService:$}),changedTypes:["skills"]}});if(f.type==="tools"){if(!f.name?.trim())throw Error("Tool settings toggle requires a tool name.");if(f.enabled===void 0)J4(f.name);else AQ(f.name,!f.enabled);return{snapshot:await this.list(f),changedTypes:["tools"]}}throw Error(`Settings type '${f.type}' does not support toggles.`)}}function S$(){return new o0}function $P(f){return{async list($){let W=f;if(W.listSettings)return await W.listSettings($);return await S$().list($)},async toggle($){let W=f;if(W.toggleSetting)return await W.toggleSetting($);return await S$().toggle($)}}}function WP(f){function $(){let W=f.pendingPrompts;if(!W)throw Error("Pending prompt service is not available.");return W}return{list(W){return $().list(W)},update(W){return $().update(W)},delete(W){return $().delete(W)}}}var JP={};z(JP,{splitCoreSessionConfig:()=>IW});function IW(f){let{hooks:$,logger:W,telemetry:J,extensionContext:H,extraTools:Q,extensions:Z,onTeamEvent:P,onConsecutiveMistakeLimitReached:j,checkpoint:R,compaction:X,...A}=f,V={};if($)V.hooks=$;if(W)V.logger=W;if(J)V.telemetry=J;if(H)V.extensionContext=H;if(Q)V.extraTools=Q;if(Z)V.extensions=Z;if(P)V.onTeamEvent=P;if(j)V.onConsecutiveMistakeLimitReached=j;if(R?.createCheckpoint)V.checkpoint=R;if(X?.compact)V.compaction=X;let B=Object.keys(V).length>0?V:void 0;return{config:{...A,...R?{checkpoint:{enabled:R.enabled}}:{},...X?{compaction:{enabled:X.enabled,strategy:X.strategy,thresholdRatio:X.thresholdRatio,reserveTokens:X.reserveTokens,preserveRecentTokens:X.preserveRecentTokens,contextWindowTokens:X.contextWindowTokens,summarizer:X.summarizer}}:{}},...B?{localRuntime:B}:{}}}function HP(f){let $=f.config;return"providerId"in $?{...f,config:{...$,...Ry(f.localRuntime)},localRuntime:f.localRuntime}:f}function nH(f,$={}){let W=IW(f.config),J=Xf($.defaultCapabilities,f.capabilities),H=Xy(W.localRuntime,f.localRuntime),Q=$.withExtensionContext?.(H?.extensionContext);if(Q)H={...H??{},extensionContext:Q};return{...f,...W,...H?{localRuntime:H}:{},...J?{capabilities:J}:{}}}function Ry(f){if(!f)return{};let{modelCatalogDefaults:$,userInstructionService:W,configExtensions:J,onTeamRestored:H,...Q}=f;return Q}function Xy(...f){let $={};for(let W of f)if(W)Object.assign($,W);return Object.keys($).length>0?$:void 0}Kf();function QP(f){let $=f.input.config.telemetry??f.telemetry;if(!$)return;$.capture({event:I.SESSION.STARTED,properties:{sessionId:f.sessionId,source:f.input.source??jf.CORE,providerId:f.input.config.providerId,modelId:f.input.config.modelId,enableTools:f.input.config.enableTools,enableSpawnAgent:f.input.config.enableSpawnAgent,enableAgentTeams:f.input.config.enableAgentTeams,clientName:f.clientName,runtimeAddress:f.runtimeAddress}})}function vW(f){return!!f&&typeof f==="object"&&!Array.isArray(f)}function aH(f){let $=f?.trim();return $?$:void 0}function Ay(f,$){let W=f?.trim();if(!W)return $;let J=Date.parse(W);if(!Number.isFinite(J))return $;return new Date(J).toISOString()}function ZP(f,$){return new Date(new Date(f).getTime()+Math.max(0,Math.floor($))*1000).toISOString()}function PP(f,$){return new Date(new Date(f).getTime()-Math.max(0,Math.floor($))*1000).toISOString()}function Vy(f,$){if(!f)return $;return new Date(f).getTime()>=new Date($).getTime()?f:$}function By(f,$){let W=f.eventId.trim(),J=f.eventType.trim(),H=f.source.trim(),Q=aH(f.subject),Z=aH(f.dedupeKey)??`${J}:${H}:${Q??W}`;return{eventId:W,eventType:J,source:H,subject:Q,occurredAt:Ay(f.occurredAt,$),workspaceRoot:aH(f.workspaceRoot),payload:vW(f.payload)?f.payload:void 0,attributes:vW(f.attributes)?f.attributes:void 0,dedupeKey:Z}}function tH(f,$){if(!$)return;let W=$.split("."),J=f;for(let H of W){if(!vW(J))return;J=J[H]}return J}function Ty(f,$){if(f.attributes&&Object.hasOwn(f.attributes,$))return f.attributes[$];if(f.payload&&Object.hasOwn(f.payload,$))return f.payload[$];let W={eventId:f.eventId,eventType:f.eventType,source:f.source,subject:f.subject,occurredAt:f.occurredAt,workspaceRoot:f.workspaceRoot,dedupeKey:f.dedupeKey,attributes:f.attributes,payload:f.payload},J=tH(W,$);if(J!==void 0)return J;if(f.attributes){let H=tH(f.attributes,$);if(H!==void 0)return H}if(f.payload)return tH(f.payload,$);return}function Z6(f,$){if(Array.isArray($))return $.some((W)=>Z6(f,W));if(Array.isArray(f))return f.some((W)=>Z6(W,$));if(vW($)){if(!vW(f))return!1;return Object.entries($).every(([W,J])=>Z6(f[W],J))}return Object.is(f,$)}function Yy(f,$){if(!$||Object.keys($).length===0)return!0;return Object.entries($).every(([W,J])=>Z6(Ty(f,W),J))}class sH{store;nowFn;logger;constructor(f){this.store=f.store,this.nowFn=f.now??(()=>Date.now()),this.logger=f.logger}ingestEvent(f){let $=new Date(this.nowFn()).toISOString(),W=By(f,$),J=this.store.insertEventLog(W,{receivedAtIso:$});if(!J.created)return this.logger?.debug("cron.event.duplicate",{eventId:J.record.eventId,eventType:J.record.eventType,source:J.record.source}),{event:J.record,duplicate:!0,matchedSpecs:[],queuedRuns:[],suppressions:[{reason:"duplicate_event",dedupeKey:J.record.dedupeKey}]};try{let H=this.store.listEventSpecsForType(W.eventType),Q=[],Z=[],P=[];for(let X of H){if(!Yy(W,X.filters)){Q.push({specId:X.specId,externalId:X.externalId,reason:"filter_mismatch",dedupeKey:W.dedupeKey});continue}Z.push(X);let A=this.materializeForSpec(X,W,J.record.receivedAt);if(A.run)P.push(A.run);else Q.push({specId:X.specId,externalId:X.externalId,reason:A.reason,dedupeKey:W.dedupeKey})}let j=Z.length===0?"unmatched":P.length>0?"queued":"suppressed";this.store.updateEventLogProcessing(J.record.eventId,{status:j,matchedSpecCount:Z.length,queuedRunCount:P.length,suppressedCount:Q.filter((X)=>X.reason!=="filter_mismatch").length});let R=this.store.getEventLog(J.record.eventId);return this.logger?.debug("cron.event.processed",{eventId:J.record.eventId,eventType:J.record.eventType,status:j,matchedSpecCount:Z.length,queuedRunCount:P.length}),{event:R??J.record,duplicate:!1,matchedSpecs:Z,queuedRuns:P,suppressions:Q}}catch(H){if(this.store.updateEventLogProcessing(J.record.eventId,{status:"failed",error:H instanceof Error?H.message:String(H)}),this.logger?.error)this.logger.error("cron.event.failed",{eventId:J.record.eventId,eventType:J.record.eventType,error:H});throw H}}materializeForSpec(f,$,W){let J=$.dedupeKey??$.eventId,H=f.debounceSeconds??0;if(H>0){let j=this.store.findQueuedEventRunForDedupe({specId:f.specId,dedupeKey:J});if(j){let R=Vy(j.scheduledFor,ZP(W,H)),X=this.store.updateQueuedEventRunForDebounce({runId:j.runId,triggerEventId:$.eventId,scheduledFor:R});if(X)return{run:X,reason:"dedupe_window"}}}let Q=f.dedupeWindowSeconds??0;if(Q>0&&this.store.hasRecentEventRunForDedupe({specId:f.specId,dedupeKey:J,sinceIso:PP(W,Q)}))return{reason:"dedupe_window"};let Z=f.cooldownSeconds??0;if(Z>0&&this.store.hasRecentEventRunForSpec({specId:f.specId,sinceIso:PP(W,Z)}))return{reason:"cooldown"};return{run:this.store.enqueueRun({specId:f.specId,specRevision:f.revision,triggerKind:"event",triggerEventId:$.eventId,scheduledFor:H>0?ZP(W,H):W}),reason:"dedupe_window"}}}class uW{store;nowFn;constructor(f){this.store=f.store,this.nowFn=f.now??(()=>Date.now())}materializeAll(){let f={oneOffQueued:0,scheduleQueued:0},$=this.store.listSpecs({triggerKind:"one_off",enabled:!0,parseStatus:"valid"});for(let J of $)if(this.materializeOneOff(J))f.oneOffQueued+=1;let W=this.store.listSpecs({triggerKind:"schedule",enabled:!0,parseStatus:"valid"});for(let J of W)try{if(this.materializeSchedule(J))f.scheduleQueued+=1}catch{}return f}materializeOneOff(f){if(f.triggerKind!=="one_off")return!1;if(!f.enabled||f.removed)return!1;if(this.store.hasOneOffRunForRevision(f.specId,f.revision))return!1;return this.store.enqueueRun({specId:f.specId,specRevision:f.revision,triggerKind:"one_off",scheduledFor:new Date(this.nowFn()).toISOString()}),!0}materializeSchedule(f){if(f.triggerKind!=="schedule")return!1;if(!f.enabled||f.removed)return!1;if(!f.scheduleExpr)return!1;return this.store.materializeDueScheduleRun({specId:f.specId,nowMs:this.nowFn()}).queued}}import{basename as Gy}from"node:path";import{buildClineSystemPrompt as Dy}from"@clinebot/shared";import{nowIso as jP}from"@clinebot/shared/db";import{mkdirSync as Fy,writeFileSync as yy}from"node:fs";import{join as hy}from"node:path";import{resolveCronReportsDir as Ky}from"@clinebot/shared/storage";function e0(f){if(/[:#\n]/.test(f)||f.includes('"'))return JSON.stringify(f);return f}function k$(f,$){if($===void 0||$===null)return;return`${f}: ${e0($)}`}function Uy(f,$,W){let J=[`runId: ${e0(f.runId)}`,`specId: ${e0($.specId)}`,`externalId: ${e0($.externalId)}`,`title: ${e0($.title)}`,`triggerKind: ${e0(f.triggerKind)}`,`status: ${e0(f.status)}`,`sourcePath: ${e0($.sourcePath)}`],H=[k$("sessionId",f.sessionId),k$("startedAt",f.startedAt),k$("completedAt",f.completedAt),k$("triggerEventId",f.triggerEventId),k$("triggerEventType",W?.eventType),k$("triggerEventSource",W?.source),k$("triggerEventSubject",W?.subject)];for(let Q of H)if(Q)J.push(Q);return`---
202
+ ${J.join(`
203
+ `)}
204
+ ---
205
+ `}function My(f){let $=[];if(f.triggerEvent){let W=f.triggerEvent,J=[`- eventId: ${W.eventId}`,`- eventType: ${W.eventType}`,`- source: ${W.source}`,W.subject?`- subject: ${W.subject}`:"",`- occurredAt: ${W.occurredAt}`,W.dedupeKey?`- dedupeKey: ${W.dedupeKey}`:"",W.attributes?`- attributes: ${JSON.stringify(W.attributes)}`:""].filter((H)=>H.length>0);$.push(`## Trigger Event
206
+
207
+ ${J.join(`
208
+ `)}
209
+ `)}if(f.error)$.push(`## Error
210
+
211
+ ${f.error}
212
+ `);if(f.finalText&&f.finalText.trim().length>0)$.push(`## Summary
213
+
214
+ ${f.finalText.trim()}
215
+ `);if(f.usage){let W=f.usage,J=[W.inputTokens!==void 0?`- inputTokens: ${W.inputTokens}`:"",W.outputTokens!==void 0?`- outputTokens: ${W.outputTokens}`:"",W.cacheReadTokens!==void 0?`- cacheReadTokens: ${W.cacheReadTokens}`:"",W.cacheWriteTokens!==void 0?`- cacheWriteTokens: ${W.cacheWriteTokens}`:"",W.totalCost!==void 0?`- totalCostUsd: ${W.totalCost}`:"",f.durationMs!==void 0?`- durationMs: ${f.durationMs}`:""].filter((H)=>H.length>0);if(J.length>0)$.push(`## Usage
216
+
217
+ ${J.join(`
218
+ `)}
219
+ `)}if(f.toolCalls&&f.toolCalls.length>0){let W=f.toolCalls.map((J)=>{let H=[`- ${J.name}`];if(J.durationMs!==void 0)H.push(`(${J.durationMs}ms)`);if(J.error)H.push(`error: ${J.error}`);return H.join(" ")});$.push(`## Tool Calls
220
+
221
+ ${W.join(`
222
+ `)}
223
+ `)}return $.join(`
224
+ `)}function oH(f){let $=Ky(f.specs);Fy($,{recursive:!0});let W=hy($,`${f.run.runId}.md`),J=`${Uy(f.run,f.spec,f.data.triggerEvent)}
225
+ ${My(f.data)}`;return yy(W,J,"utf8"),W}class eH{globalMaxConcurrency;activeExecutions=new Map;constructor(f){this.globalMaxConcurrency=Math.max(1,Math.floor(f))}acquire(f,$,W){if(this.getGlobalActiveCount()>=this.globalMaxConcurrency)return!1;let J=Math.max(1,Math.floor(W)),H=this.activeExecutions.get(f)??new Set;if(H.size>=J)return!1;return H.add($),this.activeExecutions.set(f,H),!0}release(f,$){let W=this.activeExecutions.get(f);if(!W)return;if(W.delete($),W.size===0)this.activeExecutions.delete(f)}getGlobalActiveCount(){let f=0;for(let $ of this.activeExecutions.values())f+=$.size;return f}}var _y=15000,Ly=90,RP=["rules","skills","plugins"];function Oy(f,$){return new Set(f.extensions??RP).has($)}function Cy(f,$){if(f.tools===void 0)return{"*":{autoApprove:!0}};let W={"*":{enabled:!1,autoApprove:!0}};for(let J of f.tools)W[J]={enabled:!0,autoApprove:!0};if($==="yolo")W[Qf.SUBMIT_AND_EXIT]={enabled:!0,autoApprove:!0};return W}function zy(f){let $=f?.trim();if(!$)return;return["# Notes Directory",`Use ${$} for durable notes related to this automation.`,"Before starting, inspect relevant existing notes there when useful. During or after the run, write concise notes there when they would help future runs continue with context."].join(`
226
+ `)}class f5 extends Error{constructor(f){super(f);this.name="TimeoutError"}}async function Ny(f,$){if($<=0)return f;let W,J=new Promise((H,Q)=>{W=setTimeout(()=>{Q(new f5("cron run timed out"))},$)});try{return await Promise.race([f,J])}finally{if(W)clearTimeout(W)}}class cW{store;materializer;options;limiter;claimLeaseMs;timer;started=!1;ticking=!1;disposed=!1;stopping=!1;activeRuns=new Map;constructor(f){this.store=f.store,this.materializer=f.materializer,this.options=f,this.limiter=new eH(f.globalMaxConcurrency??10),this.claimLeaseMs=Math.max(5000,(f.claimLeaseSeconds??Ly)*1000)}async start(){if(this.disposed)throw Error("CronRunner disposed");if(this.started)return;this.stopping=!1,this.started=!0;let f=Math.max(2000,this.options.pollIntervalMs??_y);await this.tick(),this.timer=setInterval(()=>void this.tick(),f)}async stop(){let f=this.started;if(this.started=!1,this.stopping=!0,this.timer)clearInterval(this.timer),this.timer=void 0;if(!f)return;let $=[...this.activeRuns.entries()];await Promise.all($.map(async([W,J])=>{if(J.sessionId)try{await this.options.runtimeHandlers.abortSession(J.sessionId)}catch{}try{this.store.requeueRun({runId:W,claimToken:J.claimToken,error:"runner stopped before completion"})}catch{}}))}async dispose(){if(this.disposed)return;this.disposed=!0,await this.stop()}async tick(){if(this.ticking)return;this.ticking=!0;try{this.materializer.materializeAll();let f=this.store.claimDueRuns({nowIso:jP(),leaseMs:this.claimLeaseMs});await Promise.allSettled(f.map(($)=>this.executeClaim($)))}catch(f){let $=this.options.logger;if($)if($.error)$.error("cron.runner.tick.failed",{error:f});else $.log("cron.runner.tick.failed",{error:f})}finally{this.ticking=!1}}getActiveRuns(){return[...this.activeRuns.entries()].flatMap(([f,$])=>{let W=this.store.getRun(f);return W?[{...W,...$}]:[]})}async executeClaim(f){let $=f.run,W=this.store.getSpec($.specId);if(!W){this.store.completeRun($.runId,{status:"failed",error:"spec not found",claimToken:f.claimToken});return}if(!W.enabled||W.removed){this.store.completeRun($.runId,{status:"cancelled",error:"spec disabled or removed",claimToken:f.claimToken});return}let J=W.maxParallel&&W.maxParallel>0?W.maxParallel:1;if(!this.limiter.acquire(W.specId,$.runId,J)){this.store.requeueRun({runId:$.runId,claimToken:f.claimToken,error:"concurrency limit reached"});return}if(this.stopping){this.limiter.release(W.specId,$.runId),this.store.requeueRun({runId:$.runId,claimToken:f.claimToken,error:"runner stopped before execution"});return}this.activeRuns.set($.runId,{claimToken:f.claimToken});let Q=$.triggerEventId?this.store.getEventLog($.triggerEventId):void 0,Z,P,j=Date.now(),R;if(W.timeoutSeconds&&W.timeoutSeconds>0)R=j+W.timeoutSeconds*1000;try{P=this.startClaimLeaseHeartbeat(f);let X=await this.buildStartRequest(W);if(Z=(await this.options.runtimeHandlers.startSession(X)).sessionId.trim(),!Z)throw Error("runtime returned empty sessionId");this.activeRuns.set($.runId,{claimToken:f.claimToken,sessionId:Z}),this.store.attachSessionIdToRun($.runId,Z);let V={config:X,prompt:this.buildPrompt(W,Q)},B=this.options.runtimeHandlers.sendSession(Z,V),T=R?Math.max(1,R-Date.now()):0,F=(await Ny(B,T)).result,Y=Date.now(),y=oH({specs:this.options.specs,workspaceRoot:this.options.workspaceRoot,run:{...$,sessionId:Z,status:"done"},spec:W,data:{finalText:F.text,usage:F.usage,toolCalls:F.toolCalls,durationMs:Y-j,triggerEvent:Q}});this.store.completeRun($.runId,{status:"done",sessionId:Z,reportPath:y,claimToken:f.claimToken}),this.store.updateSpecLastRunAt(W.specId,jP())}catch(X){let A=X instanceof f5;if(Z&&A)try{await this.options.runtimeHandlers.abortSession(Z)}catch{}let V=X instanceof Error?X.message:String(X),B=Date.now(),T=oH({specs:this.options.specs,workspaceRoot:this.options.workspaceRoot,run:{...$,sessionId:Z,status:"failed"},spec:W,data:{error:V,durationMs:B-j,triggerEvent:Q}});this.store.completeRun($.runId,{status:"failed",sessionId:Z,reportPath:T,error:V,claimToken:f.claimToken})}finally{if(P?.(),Z)try{await this.options.runtimeHandlers.stopSession(Z)}catch{}this.activeRuns.delete($.runId),this.limiter.release(W.specId,$.runId)}}buildPrompt(f,$){let W=f.prompt??"";if(!$)return W;let J={eventId:$.eventId,eventType:$.eventType,source:$.source,subject:$.subject,occurredAt:$.occurredAt,workspaceRoot:$.workspaceRoot,dedupeKey:$.dedupeKey,attributes:$.attributes,payload:$.payload};return`${W}
227
+
228
+ Trigger event:
229
+ ${JSON.stringify(J,null,2)}`}startClaimLeaseHeartbeat(f){let $=Math.max(1000,Math.floor(this.claimLeaseMs/2)),W=setInterval(()=>{let J=new Date(Date.now()+this.claimLeaseMs).toISOString();if(!this.store.renewClaim(f.run.runId,f.claimToken,J))clearInterval(W)},$);return()=>clearInterval(W)}async buildSystemPrompt(f,$,W,J){let H=zy(f.notesDirectory),Q=I1(void 0,H),Z=await YW($),P=Dy({ide:"Cline Cron",workspaceRoot:$,workspaceName:Gy($),metadata:Z,rules:f.systemPrompt?void 0:Q,mode:W,providerId:J,overridePrompt:f.systemPrompt,platform:typeof process<"u"&&process?.platform||"unknown"});return f.systemPrompt?I1(P,Q)??P:P}async buildStartRequest(f){let $=(f.workspaceRoot??"").trim(),W=(f.providerId??"").trim(),J=(f.modelId??"").trim(),H=f.metadata?.__hubRuntimeOptions&&typeof f.metadata.__hubRuntimeOptions==="object"&&!Array.isArray(f.metadata.__hubRuntimeOptions)?f.metadata.__hubRuntimeOptions:void 0,Q=typeof f.metadata?.__hubScheduleCwd==="string"&&f.metadata.__hubScheduleCwd.trim()?f.metadata.__hubScheduleCwd.trim():$;if(!$)throw Error("cron spec requires workspaceRoot");let Z=f.mode==="plan"?"plan":f.mode==="act"?"act":"yolo";return{workspaceRoot:$,cwd:Q,provider:W,model:J,mode:Z,source:f.source?.trim()||"user",systemPrompt:await this.buildSystemPrompt(f,$,Z,W),maxIterations:f.maxIterations,enableTools:H?.enableTools??!0,enableSpawn:H?.enableSpawn??!0,enableTeams:H?.enableTeams??!0,autoApproveTools:H?.autoApproveTools??!0,toolPolicies:Cy(f,Z),configExtensions:RP.filter((P)=>Oy(f,P))}}}import{existsSync as oy,readdirSync as ey,readFileSync as fh,statSync as $h}from"node:fs";import{relative as Wh}from"node:path";import{resolveCronSpecsDir as Jh}from"@clinebot/shared/storage";function dW(f,$,W,J){let H=new Set;function Q(Z){let P=Z.toLowerCase();if(J){let R=J.indexOf(P);if(R!==-1)return R+$}let j=Number(Z);if(!Number.isInteger(j)||j<$||j>W)throw Error(`Invalid cron value "${Z}" for range [${$}-${W}]`);return j}for(let Z of f.split(",")){if(Z==="*"){for(let R=$;R<=W;R+=1)H.add(R);continue}let P=Z.indexOf("/");if(P!==-1){let R=Z.slice(0,P),X=Number(Z.slice(P+1));if(!Number.isInteger(X)||X<1)throw Error(`Invalid step "${Z.slice(P+1)}"`);let A=$,V=W;if(R!=="*"){let B=R.indexOf("-");if(B!==-1)A=Q(R.slice(0,B)),V=Q(R.slice(B+1));else A=Q(R)}if(A>V)throw Error(`Invalid cron range "${R}"`);for(let B=A;B<=V;B+=X)H.add(B);continue}let j=Z.indexOf("-");if(j!==-1){let R=Q(Z.slice(0,j)),X=Q(Z.slice(j+1));if(R>X)throw Error(`Invalid cron range "${Z}"`);for(let A=R;A<=X;A+=1)H.add(A);continue}H.add(Q(Z))}return[...H].sort((Z,P)=>Z-P)}var by=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"],AP=["sun","mon","tue","wed","thu","fri","sat"];function rW(f,$,W){let J=f[$];if(typeof J!=="string")throw Error(`Invalid cron pattern "${W}": missing field ${$+1}`);return J}function $5(f,$){let W=f[0];if(typeof W!=="number")throw Error(`Invalid cron pattern: no values parsed for ${$}`);return W}function W5(f){let $=f.trim().split(/\s+/);if($.length!==5)throw Error(`Invalid cron pattern "${f}": expected 5 fields, got ${$.length}`);return{minutes:dW(rW($,0,f),0,59),hours:dW(rW($,1,f),0,23),daysOfMonth:dW(rW($,2,f),1,31),months:dW(rW($,3,f),1,12,by),daysOfWeek:dW(rW($,4,f),0,6,AP)}}function J5(f){W5(f)}function VP(f,$,W=Date.now()){m$(f,W,$)}var XP=new Map,qy=new Map(AP.map((f,$)=>[f,$]));function BP(f){let $=f?.trim();return $?$:void 0}function TP(f){let $=XP.get(f);if($)return $;let W=new Intl.DateTimeFormat("en-US",{timeZone:f,calendar:"gregory",numberingSystem:"latn",year:"numeric",month:"2-digit",day:"2-digit",weekday:"short",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});return XP.set(f,W),W}function wy(f){let $=BP(f);if(!$)return;TP($).format(new Date)}function Ey(f,$){let W=TP($).formatToParts(new Date(f)),J=new Map(W.map((Z)=>[Z.type,Z.value])),H=J.get("weekday")?.toLowerCase().slice(0,3)??"",Q=qy.get(H);if(Q===void 0)throw Error(`Unable to resolve weekday for timezone "${$}"`);return{month:Number(J.get("month")),dayOfMonth:Number(J.get("day")),dayOfWeek:Q,hour:Number(J.get("hour")),minute:Number(J.get("minute"))}}function Sy(f){let $=new Date(f);return{month:$.getMonth()+1,dayOfMonth:$.getDate(),dayOfWeek:$.getDay(),hour:$.getHours(),minute:$.getMinutes()}}function ky(f,$){return f.months.includes($.month)&&f.daysOfMonth.includes($.dayOfMonth)&&f.daysOfWeek.includes($.dayOfWeek)&&f.hours.includes($.hour)&&f.minutes.includes($.minute)}function my(f,$,W){let J=W5(f),H=new Date($);H.setSeconds(0,0);let Q=H.getTime()+60000,Z=new Date($);Z.setFullYear(Z.getFullYear()+4);let P=Z.getTime();while(Q<=P){if(ky(J,Ey(Q,W)))return Q;Q+=60000}throw Error(`No cron occurrence found within 4 years for pattern "${f}" in timezone "${W}"`)}function m$(f,$,W){let J=BP(W);if(J)return wy(J),my(f,$,J);let H=W5(f),Q=new Date($);Q.setSeconds(0,0),Q=new Date(Q.getTime()+60000);let Z=new Date($);Z.setFullYear(Z.getFullYear()+4);while(Q<=Z){let{month:P,dayOfMonth:j,dayOfWeek:R,hour:X,minute:A}=Sy(Q.getTime());if(!H.months.includes(P)){let V=H.months.find((T)=>T>P)??$5(H.months,"months"),B=V<=P?1:0;Q=new Date(Q.getFullYear()+B,V-1,1,0,0,0,0);continue}if(!H.daysOfMonth.includes(j)||!H.daysOfWeek.includes(R)){Q=new Date(Q.getFullYear(),Q.getMonth(),j+1,0,0,0,0);continue}if(!H.hours.includes(X)){let V=H.hours.find((T)=>T>X)??$5(H.hours,"hours"),B=V<=X?1:0;Q=new Date(Q.getFullYear(),Q.getMonth(),Q.getDate()+B,V,0,0,0);continue}if(!H.minutes.includes(A)){let V=H.minutes.find((T)=>T>A)??$5(H.minutes,"minutes"),B=V<=A?1:0;Q=new Date(Q.getFullYear(),Q.getMonth(),Q.getDate(),Q.getHours()+B,V,0,0);continue}return Q.getTime()}throw Error(`No cron occurrence found within 4 years for pattern "${f}"`)}import{createHash as gy}from"node:crypto";import xy from"yaml";function Iy(f){let $=f.replace(/\\/g,"/");if($.startsWith("events/")&&$.endsWith(".event.md"))return"event";if($.endsWith(".cron.md"))return"schedule";return"one_off"}function vy(f){let $=f.replace(/\r\n/g,`
230
+ `);if(!$.startsWith(`---
231
+ `))return{frontmatter:void 0,body:f};let W=$.slice(4),J=W.indexOf(`
232
+ ---`);if(J===-1)return{frontmatter:void 0,body:f};let H=W.slice(0,J),Q=W.slice(J+4);if(Q.startsWith(`
233
+ `))Q=Q.slice(1);return{frontmatter:H,body:Q}}function qf(f){if(typeof f!=="string")return;let $=f.trim();return $.length>0?$:void 0}function uy(f){if(!Array.isArray(f))return;let $=f.map((W)=>typeof W==="string"?W.trim():"").filter((W)=>W.length>0);return $.length>0?$:void 0}function Z5(f){if(!f||typeof f!=="object"||Array.isArray(f))return;return f}function cy(f){let $=Z5(f);if(!$)return;let W=qf($.providerId),J=qf($.modelId);if(W===void 0&&J===void 0)return;return{providerId:W,modelId:J}}function dy(f){if(typeof f!=="string")return;let $=f.trim().toLowerCase();if($==="act"||$==="plan"||$==="yolo")return $;return}function FP(f,$={}){let W=Array.isArray(f)?f:typeof f==="string"?f.split(","):void 0;if(!W)return;let J=[...new Set(W.map((H)=>typeof H==="string"?H.trim():"").filter((H)=>H.length>0))];if(Array.isArray(f)&&$.preserveEmptyArray)return J;return J.length>0?J:void 0}var ry=new Set(N0);function ly(f){let $=FP(f,{preserveEmptyArray:!0});if(!$)return;let W=$.filter((J)=>!ry.has(J));if(W.length>0)throw Error(`unknown tool(s): ${W.join(", ")}`);return $}var py=new Set(["rules","skills","plugins"]);function iy(f){let $=FP(f,{preserveEmptyArray:!0});if(!$)return;let W=$.filter((J)=>!py.has(J));if(W.length>0)throw Error(`unknown extension(s): ${W.join(", ")}`);return $}function H5(f){if(typeof f!=="number"||!Number.isFinite(f)||f<=0)return;return Math.floor(f)}function Q5(f){if(typeof f!=="number"||!Number.isFinite(f)||f<0)return;return Math.floor(f)}function P5(f){if(f===null||typeof f!=="object")return JSON.stringify(f??null);if(Array.isArray(f))return`[${f.map((W)=>P5(W)).join(",")}]`;let $=Object.entries(f).filter(([,W])=>W!==void 0);return $.sort(([W],[J])=>W<J?-1:W>J?1:0),`{${$.map(([W,J])=>`${JSON.stringify(W)}:${P5(J)}`).join(",")}}`}function yP(f,$){let W=gy("sha256");return W.update(P5(f)),W.update(`
234
+ `),W.update($),W.digest("hex")}function ny(f){return(f.split("/").pop()??f).replace(/\.event\.md$/,"").replace(/\.cron\.md$/,"").replace(/\.md$/,"")}var ay=["schedule","timezone"],ty=["event","filters","debounceSeconds","dedupeWindowSeconds","cooldownSeconds","maxParallel"],sy=["cwd"];function YP(f,$,W,J,H){return{externalId:f,relativePath:f,triggerKind:$,body:W,contentHash:yP(J,W),error:H}}function of(f,$,W,J,H,Q){return{externalId:f,relativePath:$,triggerKind:W,body:J,contentHash:H,error:Q}}function hP(f){let $=f.relativePath.replace(/\\/g,"/"),W=Iy($),{frontmatter:J,body:H}=vy(f.raw),Q={};if(J!==void 0&&J.trim().length>0)try{let y=xy.parse(J);if(y&&typeof y==="object"&&!Array.isArray(y))Q=y;else if(y!==null&&y!==void 0)return YP($,W,H,{},"frontmatter must be a YAML mapping")}catch(y){return YP($,W,H,{},y instanceof Error?`failed to parse frontmatter: ${y.message}`:"failed to parse frontmatter")}let Z=yP(Q,H),P=qf(Q.id),j=P??$;if(W!=="schedule"){for(let y of ay)if(Q[y]!==void 0)return of(j,$,W,H,Z,`field "${y}" is only allowed on *.cron.md specs`)}for(let y of sy)if(Q[y]!==void 0)return of(j,$,W,H,Z,`field "${y}" is no longer supported; cron specs use workspaceRoot as cwd`);if(W!=="event"){for(let y of ty)if(Q[y]!==void 0)return of(j,$,W,H,Z,`field "${y}" is only allowed on .event.md specs`)}let R=qf(Q.prompt),X=H.trim(),A=R??(X.length>0?X:void 0);if(!A)return of(j,$,W,H,Z,"prompt is required (frontmatter `prompt` or markdown body)");let V=qf(Q.workspaceRoot);if(!V)return of(j,$,W,H,Z,"workspaceRoot is required");let B,T;try{B=ly(Q.tools),T=iy(Q.extensions)}catch(y){return of(j,$,W,H,Z,y instanceof Error?y.message:String(y))}let h=dy(Q.mode);if(Q.mode!==void 0&&h===void 0)return of(j,$,W,H,Z,"mode must be one of: act, plan, yolo");let F={id:P,title:qf(Q.title)??P??ny($),prompt:A,workspaceRoot:V,mode:h??"yolo",systemPrompt:qf(Q.systemPrompt),modelSelection:cy(Q.modelSelection),maxIterations:H5(Q.maxIterations),timeoutSeconds:H5(Q.timeoutSeconds),tools:B,notesDirectory:qf(Q.notesDirectory),extensions:T,source:qf(Q.source)??"user",tags:uy(Q.tags),enabled:typeof Q.enabled==="boolean"?Q.enabled:!0,metadata:Z5(Q.metadata)},Y;if(W==="schedule"){let y=qf(Q.schedule);if(!y)return of(j,$,W,H,Z,"schedule is required for *.cron.md specs");let D=qf(Q.timezone);try{VP(y,D)}catch(K){return of(j,$,W,H,Z,K instanceof Error?K.message:String(K))}Y={...F,triggerKind:"schedule",schedule:y,timezone:D}}else if(W==="event"){let y=qf(Q.event);if(!y)return of(j,$,W,H,Z,"event is required for .event.md specs");Y={...F,triggerKind:"event",event:y,filters:Z5(Q.filters),debounceSeconds:Q5(Q.debounceSeconds),dedupeWindowSeconds:Q5(Q.dedupeWindowSeconds),cooldownSeconds:Q5(Q.cooldownSeconds),maxParallel:H5(Q.maxParallel)}}else Y={...F,triggerKind:"one_off"};return{externalId:j,relativePath:$,triggerKind:W,body:H,contentHash:Z,spec:Y}}function Hh(f,$){return Wh(f,$).replace(/\\/g,"/")}function Qh(f){if(!oy(f))return[];let $=[],W=[f];while(W.length>0){let J=W.pop();if(!J)continue;let H;try{H=ey(J,{withFileTypes:!0})}catch{continue}for(let Q of H){let Z=`${J}/${Q.name}`;if(Q.isDirectory()){if(Q.name==="reports")continue;W.push(Z);continue}if(!Q.isFile())continue;if(!Q.name.endsWith(".md"))continue;$.push(Z)}}return $}class j5{store;cronDir;constructor(f){this.store=f.store,this.cronDir=Jh(f.specs??(f.workspaceRoot?{scope:"workspace",workspaceRoot:f.workspaceRoot}:void 0))}getCronDir(){return this.cronDir}async reconcileAll(){let f={scanned:0,upserted:0,invalidParses:0,removed:0,changes:[]},$=Qh(this.cronDir),W=new Set;for(let H of $){let Q=Hh(this.cronDir,H);W.add(Q),f.scanned+=1;let Z=await this.reconcileFile(Q,H);if(Z){if(f.changes.push(Z),f.upserted+=1,Z.parse.error)f.invalidParses+=1}}let J=this.store.listSpecs({includeRemoved:!1,limit:1e4});for(let H of J)if(!W.has(H.sourcePath))this.handleFileDeleted(H),f.removed+=1;return this.refreshScheduleNextRunAt(),f}async reconcileFile(f,$){let W=this.store.getSpecBySourcePath(f),J,H;try{J=fh($,"utf8"),H=$h($).mtimeMs}catch{return}let Z=hP({relativePath:f,raw:J}),P=this.store.upsertSpec({externalId:Z.externalId,sourcePath:f,triggerKind:Z.triggerKind,sourceMtimeMs:H,sourceHash:Z.contentHash,parseStatus:Z.error?"invalid":"valid",parseError:Z.error,spec:Z.spec});if(!Z.error&&Z.triggerKind==="schedule"&&P.record.enabled)this.applyScheduleNextRunAt(P.record,{forceReset:!W||W.removed||!W.enabled||W.scheduleExpr!==P.record.scheduleExpr||W.timezone!==P.record.timezone});return{relativePath:f,result:P,parse:Z}}handleFileDeleted(f){this.store.markSpecRemoved(f.specId),this.store.cancelQueuedRunsForSpec(f.specId)}refreshScheduleNextRunAt(){let f=this.store.listSpecs({triggerKind:"schedule",enabled:!0,parseStatus:"valid"});for(let $ of f)this.applyScheduleNextRunAt($,{forceReset:!1})}applyScheduleNextRunAt(f,$){if(!f.scheduleExpr)return;if(!$.forceReset&&f.nextRunAt)return;try{let W=Date.now(),J=f.lastRunAt?Math.max(W,new Date(f.lastRunAt).getTime()):W,H=m$(f.scheduleExpr,J,f.timezone),Q=new Date(H).toISOString();if(f.nextRunAt!==Q)this.store.updateSpecNextRunAt(f.specId,Q)}catch{}}}import{existsSync as Zh,mkdirSync as Ph,watch as jh}from"node:fs";import{relative as Rh,resolve as Xh}from"node:path";var Ah=250;class R5{reconciler;debounceMs;onError;onReconciled;watcher;pending=new Map;disposed=!1;constructor(f){this.reconciler=f.reconciler,this.debounceMs=Math.max(0,f.debounceMs??Ah),this.onError=f.onError??(()=>{}),this.onReconciled=f.onReconciled??(()=>{})}start(){if(this.disposed)throw Error("CronWatcher disposed");if(this.watcher)return;let f=this.reconciler.getCronDir();try{Ph(f,{recursive:!0}),this.watcher=jh(f,{recursive:!0},($,W)=>{if(!W)return;let J=String(W).replace(/\\/g,"/");if(!J.endsWith(".md"))return;if(J.startsWith("reports/"))return;this.scheduleReconcile(J)}),this.watcher.on("error",this.onError)}catch($){this.onError($)}}stop(){for(let f of this.pending.values())clearTimeout(f);this.pending.clear(),this.watcher?.close(),this.watcher=void 0}dispose(){this.disposed=!0,this.stop()}scheduleReconcile(f){let $=this.pending.get(f);if($)clearTimeout($);let W=setTimeout(()=>{this.pending.delete(f),this.reconcileNow(f)},this.debounceMs);this.pending.set(f,W)}async reconcileNow(f){try{let $=Xh(this.reconciler.getCronDir(),f);if(!Zh($)){await this.reconciler.reconcileAll(),await this.onReconciled();return}let W=Rh(this.reconciler.getCronDir(),$).replace(/\\/g,"/");await this.reconciler.reconcileFile(W,$),await this.onReconciled()}catch($){this.onError($)}}}import{randomUUID as lW}from"node:crypto";import{asOptionalString as S,asString as n,loadSqliteDb as Bh,nowIso as Af}from"@clinebot/shared/db";import{resolveCronDbPath as Th}from"@clinebot/shared/storage";var Vh=[`CREATE TABLE IF NOT EXISTS cron_specs (
235
+ spec_id TEXT PRIMARY KEY,
236
+ external_id TEXT NOT NULL,
237
+ source_path TEXT NOT NULL UNIQUE,
238
+ trigger_kind TEXT NOT NULL CHECK (trigger_kind IN ('one_off', 'schedule', 'event')),
239
+ source_mtime_ms INTEGER,
240
+ source_hash TEXT,
241
+ parse_status TEXT NOT NULL CHECK (parse_status IN ('valid', 'invalid')),
242
+ parse_error TEXT,
243
+ enabled INTEGER NOT NULL DEFAULT 1,
244
+ removed INTEGER NOT NULL DEFAULT 0,
245
+ title TEXT NOT NULL,
246
+ prompt TEXT,
247
+ workspace_root TEXT,
248
+ schedule_expr TEXT,
249
+ timezone TEXT,
250
+ event_type TEXT,
251
+ filters_json TEXT,
252
+ debounce_seconds INTEGER,
253
+ dedupe_window_seconds INTEGER,
254
+ cooldown_seconds INTEGER,
255
+ mode TEXT,
256
+ system_prompt TEXT,
257
+ provider_id TEXT,
258
+ model_id TEXT,
259
+ max_iterations INTEGER,
260
+ timeout_seconds INTEGER,
261
+ max_parallel INTEGER,
262
+ tools_json TEXT,
263
+ notes_directory TEXT,
264
+ extensions_json TEXT,
265
+ source TEXT,
266
+ tags_json TEXT,
267
+ metadata_json TEXT,
268
+ revision INTEGER NOT NULL DEFAULT 1,
269
+ last_materialized_run_id TEXT,
270
+ last_run_at TEXT,
271
+ next_run_at TEXT,
272
+ created_at TEXT NOT NULL,
273
+ updated_at TEXT NOT NULL
274
+ );`,`CREATE TABLE IF NOT EXISTS cron_runs (
275
+ run_id TEXT PRIMARY KEY,
276
+ spec_id TEXT NOT NULL REFERENCES cron_specs(spec_id) ON DELETE CASCADE,
277
+ spec_revision INTEGER NOT NULL,
278
+ trigger_kind TEXT NOT NULL CHECK (trigger_kind IN ('one_off', 'schedule', 'event', 'manual', 'retry')),
279
+ status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'done', 'failed', 'cancelled')),
280
+ claim_token TEXT,
281
+ claim_started_at TEXT,
282
+ claim_until_at TEXT,
283
+ scheduled_for TEXT,
284
+ trigger_event_id TEXT,
285
+ started_at TEXT,
286
+ completed_at TEXT,
287
+ session_id TEXT,
288
+ report_path TEXT,
289
+ error TEXT,
290
+ attempt_count INTEGER NOT NULL DEFAULT 0,
291
+ created_at TEXT NOT NULL,
292
+ updated_at TEXT NOT NULL
293
+ );`,`CREATE TABLE IF NOT EXISTS cron_event_log (
294
+ event_id TEXT PRIMARY KEY,
295
+ event_type TEXT NOT NULL,
296
+ source TEXT NOT NULL,
297
+ subject TEXT,
298
+ occurred_at TEXT NOT NULL,
299
+ received_at TEXT NOT NULL,
300
+ workspace_root TEXT,
301
+ dedupe_key TEXT,
302
+ payload_json TEXT,
303
+ attributes_json TEXT,
304
+ processing_status TEXT NOT NULL DEFAULT 'received'
305
+ CHECK (processing_status IN ('received', 'unmatched', 'queued', 'suppressed', 'failed')),
306
+ matched_spec_count INTEGER NOT NULL DEFAULT 0,
307
+ queued_run_count INTEGER NOT NULL DEFAULT 0,
308
+ suppressed_count INTEGER NOT NULL DEFAULT 0,
309
+ error TEXT,
310
+ created_at TEXT NOT NULL,
311
+ updated_at TEXT NOT NULL
312
+ );`,"DROP INDEX IF EXISTS cron_runs_one_off_active_idx;",`CREATE UNIQUE INDEX IF NOT EXISTS cron_runs_one_off_active_idx
313
+ ON cron_runs(spec_id, spec_revision)
314
+ WHERE trigger_kind = 'one_off';`,`CREATE INDEX IF NOT EXISTS cron_runs_claimable_idx
315
+ ON cron_runs(status, scheduled_for, claim_until_at);`,`CREATE INDEX IF NOT EXISTS cron_runs_spec_idx
316
+ ON cron_runs(spec_id, created_at DESC);`,`CREATE INDEX IF NOT EXISTS cron_runs_trigger_event_idx
317
+ ON cron_runs(trigger_event_id);`,`CREATE INDEX IF NOT EXISTS cron_runs_event_spec_status_idx
318
+ ON cron_runs(spec_id, trigger_kind, status, scheduled_for);`,`CREATE INDEX IF NOT EXISTS cron_event_log_type_idx
319
+ ON cron_event_log(event_type, received_at DESC);`,`CREATE INDEX IF NOT EXISTS cron_event_log_received_idx
320
+ ON cron_event_log(received_at DESC);`,`CREATE INDEX IF NOT EXISTS cron_event_log_dedupe_idx
321
+ ON cron_event_log(event_type, source, dedupe_key, received_at DESC);`,`CREATE INDEX IF NOT EXISTS cron_specs_next_run_idx
322
+ ON cron_specs(trigger_kind, enabled, next_run_at);`,`CREATE INDEX IF NOT EXISTS cron_specs_event_match_idx
323
+ ON cron_specs(trigger_kind, event_type, enabled);`,`CREATE INDEX IF NOT EXISTS cron_specs_parse_status_idx
324
+ ON cron_specs(parse_status, updated_at DESC);`,`CREATE INDEX IF NOT EXISTS cron_specs_source_path_idx
325
+ ON cron_specs(source_path);`];function KP(f){f.exec("PRAGMA journal_mode = WAL;"),f.exec("PRAGMA busy_timeout = 5000;"),f.exec("PRAGMA foreign_keys = ON;");for(let $ of Vh)f.exec($)}function P6(f){if(!f)return;try{let $=JSON.parse(f);if($&&typeof $==="object"&&!Array.isArray($))return $}catch{}return}function X5(f,$={}){if(!f)return;try{let W=JSON.parse(f);if(!Array.isArray(W))return;let J=W.map((H)=>typeof H==="string"?H.trim():"").filter((H)=>H.length>0);if($.preserveEmpty)return J;return J.length>0?J:void 0}catch{return}}function g$(f){if(typeof f==="number"&&Number.isFinite(f))return f;if(typeof f==="bigint")return Number(f);return}function f$(f){return{specId:n(f.spec_id),externalId:n(f.external_id),sourcePath:n(f.source_path),triggerKind:n(f.trigger_kind),sourceMtimeMs:g$(f.source_mtime_ms),sourceHash:S(f.source_hash),parseStatus:n(f.parse_status)==="invalid"?"invalid":"valid",parseError:S(f.parse_error),enabled:Number(f.enabled??0)===1,removed:Number(f.removed??0)===1,title:n(f.title),prompt:S(f.prompt),workspaceRoot:S(f.workspace_root),scheduleExpr:S(f.schedule_expr),timezone:S(f.timezone),eventType:S(f.event_type),filters:P6(S(f.filters_json)),debounceSeconds:g$(f.debounce_seconds),dedupeWindowSeconds:g$(f.dedupe_window_seconds),cooldownSeconds:g$(f.cooldown_seconds),mode:S(f.mode),systemPrompt:S(f.system_prompt),providerId:S(f.provider_id),modelId:S(f.model_id),maxIterations:g$(f.max_iterations),timeoutSeconds:g$(f.timeout_seconds),maxParallel:g$(f.max_parallel),tools:X5(S(f.tools_json),{preserveEmpty:!0}),notesDirectory:S(f.notes_directory),extensions:X5(S(f.extensions_json),{preserveEmpty:!0}),source:S(f.source),tags:X5(S(f.tags_json)),metadata:P6(S(f.metadata_json)),revision:Number(f.revision??1),lastMaterializedRunId:S(f.last_materialized_run_id),lastRunAt:S(f.last_run_at),nextRunAt:S(f.next_run_at),createdAt:n(f.created_at),updatedAt:n(f.updated_at)}}function A5(f){return{runId:n(f.run_id),specId:n(f.spec_id),specRevision:Number(f.spec_revision??1),triggerKind:n(f.trigger_kind),status:n(f.status),claimToken:S(f.claim_token),claimStartedAt:S(f.claim_started_at),claimUntilAt:S(f.claim_until_at),scheduledFor:S(f.scheduled_for),triggerEventId:S(f.trigger_event_id),startedAt:S(f.started_at),completedAt:S(f.completed_at),sessionId:S(f.session_id),reportPath:S(f.report_path),error:S(f.error),attemptCount:Number(f.attempt_count??0),createdAt:n(f.created_at),updatedAt:n(f.updated_at)}}function UP(f){return{eventId:n(f.event_id),eventType:n(f.event_type),source:n(f.source),subject:S(f.subject),occurredAt:n(f.occurred_at),receivedAt:n(f.received_at),workspaceRoot:S(f.workspace_root),dedupeKey:S(f.dedupe_key),payload:P6(S(f.payload_json)),attributes:P6(S(f.attributes_json)),processingStatus:n(f.processing_status),matchedSpecCount:Number(f.matched_spec_count??0),queuedRunCount:Number(f.queued_run_count??0),suppressedCount:Number(f.suppressed_count??0),error:S(f.error),createdAt:n(f.created_at),updatedAt:n(f.updated_at)}}function MP(f){return f?JSON.stringify(f):null}var Yh=["prompt","workspaceRoot","mode","systemPrompt","providerId","modelId","maxIterations","timeoutSeconds","maxParallel","tools","notesDirectory","extensions","source","scheduleExpr","timezone","eventType","filters","debounceSeconds","dedupeWindowSeconds","cooldownSeconds"];function GP(f){if(f===void 0)return null;if(f&&typeof f==="object")return JSON.stringify(f);return f}function Fh(f,$,W,J){for(let H of Yh){let Q=f[H],Z=$[H];if(GP(Q)!==GP(Z))return!0}if(W===!1&&J===!0)return!0;return!1}function yh(f){return(f.split("/").pop()??f).replace(/\.event\.md$/,"").replace(/\.cron\.md$/,"").replace(/\.md$/,"")}function hh(f){return`hub/schedules/${f}.cron.md`}function Kh(f){let $={...f.metadata??{},...f.createdBy?{__hubScheduleCreatedBy:f.createdBy}:{},...f.cwd?{__hubScheduleCwd:f.cwd}:{},...f.runtimeOptions?{__hubRuntimeOptions:f.runtimeOptions}:{}};return Object.keys($).length>0?$:void 0}function V5(f){return{triggerKind:"schedule",title:f.name.trim(),prompt:f.prompt,workspaceRoot:f.workspaceRoot.trim(),schedule:f.cronPattern.trim(),mode:f.mode??"act",systemPrompt:f.systemPrompt,modelSelection:f.modelSelection?JSON.parse(JSON.stringify(f.modelSelection)):void 0,maxIterations:typeof f.maxIterations==="number"?Math.floor(f.maxIterations):void 0,timeoutSeconds:typeof f.timeoutSeconds==="number"?Math.floor(f.timeoutSeconds):void 0,maxParallel:typeof f.maxParallel==="number"?Math.max(1,Math.floor(f.maxParallel)):1,source:"hub-schedule",tags:f.tags?.filter(($)=>$.trim().length>0),enabled:f.enabled!==!1,metadata:Kh(f)}}function DP(f){return JSON.stringify(V5(f))}function Uh(f,$){let W=f.metadata?{...f.metadata}:{},J=$.createdBy===null?void 0:$.createdBy!==void 0?$.createdBy:typeof W.__hubScheduleCreatedBy==="string"?W.__hubScheduleCreatedBy:void 0,H=$.cwd!==void 0?$.cwd:typeof W.__hubScheduleCwd==="string"?W.__hubScheduleCwd:void 0,Q=$.runtimeOptions!==void 0?$.runtimeOptions:W.__hubRuntimeOptions&&typeof W.__hubRuntimeOptions==="object"&&!Array.isArray(W.__hubRuntimeOptions)?W.__hubRuntimeOptions:void 0;return delete W.__hubScheduleCreatedBy,delete W.__hubScheduleCwd,delete W.__hubRuntimeOptions,{name:$.name??f.title,cronPattern:$.cronPattern??f.scheduleExpr??"",prompt:$.prompt??f.prompt??"",workspaceRoot:$.workspaceRoot??f.workspaceRoot??"",cwd:H,modelSelection:$.modelSelection!==void 0?$.modelSelection:f.providerId||f.modelId?{providerId:f.providerId??"",modelId:f.modelId??""}:void 0,enabled:$.enabled??f.enabled,mode:$.mode??(f.mode==="plan"?"plan":f.mode==="yolo"?"yolo":"act"),systemPrompt:$.systemPrompt===null?void 0:$.systemPrompt!==void 0?$.systemPrompt:f.systemPrompt,maxIterations:$.maxIterations===null?void 0:$.maxIterations!==void 0?$.maxIterations:f.maxIterations,timeoutSeconds:$.timeoutSeconds===null?void 0:$.timeoutSeconds!==void 0?$.timeoutSeconds:f.timeoutSeconds,maxParallel:$.maxParallel??f.maxParallel??1,createdBy:J,tags:$.tags??f.tags,runtimeOptions:Q,metadata:$.metadata!==void 0?$.metadata:Object.keys(W).length>0?W:void 0}}class pW{db;constructor(f={}){let $=f.dbPath??Th();this.db=Bh($),KP(this.db)}close(){this.db.close?.()}getSpecBySourcePath(f){let $=this.db.prepare("SELECT * FROM cron_specs WHERE source_path = ?").get(f);return $?f$($):void 0}getSpec(f){let $=this.db.prepare("SELECT * FROM cron_specs WHERE spec_id = ?").get(f);return $?f$($):void 0}getSpecByExternalId(f){let $=this.db.prepare("SELECT * FROM cron_specs WHERE external_id = ? ORDER BY created_at ASC LIMIT 1").get(f);return $?f$($):void 0}listSpecs(f={}){let $=[],W=[];if(f.triggerKind)$.push("trigger_kind = ?"),W.push(f.triggerKind);if(typeof f.enabled==="boolean")$.push("enabled = ?"),W.push(f.enabled?1:0);if(f.parseStatus)$.push("parse_status = ?"),W.push(f.parseStatus);if(!f.includeRemoved)$.push("removed = 0");let J=$.length>0?`WHERE ${$.join(" AND ")}`:"",H=Math.max(1,Math.floor(f.limit??500));return this.db.prepare(`SELECT * FROM cron_specs ${J} ORDER BY created_at DESC LIMIT ?`).all(...W,H).map((Z)=>f$(Z))}createHubSchedule(f){let $=`sched_${lW()}`,W=this.upsertSpec({externalId:$,sourcePath:hh($),triggerKind:"schedule",sourceHash:DP(f),parseStatus:"valid",spec:V5(f)});this.initializeScheduleNextRun(W.record.specId);let J=this.getSpec(W.record.specId);if(!J)throw Error("failed to create hub schedule");return J}getHubSchedule(f){let $=this.db.prepare(`SELECT * FROM cron_specs
326
+ WHERE external_id = ? AND source = 'hub-schedule' AND removed = 0
327
+ ORDER BY created_at ASC LIMIT 1`).get(f);return $?f$($):void 0}listHubSchedules(f={}){let $=["source = 'hub-schedule'","trigger_kind = 'schedule'","removed = 0"],W=[];if(typeof f.enabled==="boolean")$.push("enabled = ?"),W.push(f.enabled?1:0);if(f.tags&&f.tags.length>0)for(let Q of f.tags)$.push("tags_json LIKE ?"),W.push(`%"${Q.trim()}"%`);let J=Math.max(1,Math.floor(f.limit??200));return this.db.prepare(`SELECT * FROM cron_specs
328
+ WHERE ${$.join(" AND ")}
329
+ ORDER BY created_at DESC LIMIT ?`).all(...W,J).map((Q)=>f$(Q))}updateHubSchedule(f,$){let W=this.getHubSchedule(f);if(!W)return;let J=Uh(W,$),H=this.upsertSpec({externalId:f,sourcePath:W.sourcePath,triggerKind:"schedule",sourceHash:DP(J),parseStatus:"valid",spec:V5(J)});if($.cronPattern!==void 0||$.enabled!==void 0)this.initializeScheduleNextRun(H.record.specId);return this.getSpec(H.record.specId)}deleteHubSchedule(f){let $=this.getHubSchedule(f);if(!$)return!1;return this.markSpecRemoved($.specId),this.cancelQueuedRunsForSpec($.specId),!0}enqueueHubScheduleRun(f,$="manual"){let W=this.getHubSchedule(f);if(!W||!W.enabled||W.removed||W.parseStatus!=="valid")return;return this.enqueueRun({specId:W.specId,specRevision:W.revision,triggerKind:$,scheduledFor:Af()})}listEventSpecsForType(f){return this.db.prepare(`SELECT * FROM cron_specs
330
+ WHERE trigger_kind = 'event'
331
+ AND event_type = ?
332
+ AND enabled = 1
333
+ AND removed = 0
334
+ AND parse_status = 'valid'
335
+ ORDER BY created_at ASC`).all(f).map((W)=>f$(W))}upsertSpec(f){let $=Af(),W=this.getSpecBySourcePath(f.sourcePath),J=f.spec,H={title:J?.title??W?.title??yh(f.sourcePath),prompt:J?.prompt,workspaceRoot:J?.workspaceRoot,scheduleExpr:J?.triggerKind==="schedule"?J.schedule:void 0,timezone:J?.triggerKind==="schedule"?J.timezone:void 0,eventType:J?.triggerKind==="event"?J.event:void 0,filters:J?.triggerKind==="event"?J.filters:void 0,debounceSeconds:J?.triggerKind==="event"?J.debounceSeconds:void 0,dedupeWindowSeconds:J?.triggerKind==="event"?J.dedupeWindowSeconds:void 0,cooldownSeconds:J?.triggerKind==="event"?J.cooldownSeconds:void 0,mode:J?.mode,systemPrompt:J?.systemPrompt,providerId:J?.modelSelection?.providerId,modelId:J?.modelSelection?.modelId,maxIterations:J?.maxIterations,timeoutSeconds:J?.timeoutSeconds,maxParallel:J&&"maxParallel"in J?J.maxParallel:void 0,tools:J?.tools,notesDirectory:J?.notesDirectory,extensions:J?.extensions,source:J?.source},Q=f.parseStatus==="valid"&&(J?.enabled??!0);if(!W){let X=`cspec_${lW()}`;this.insertSpecRow(X,f,H,Q,$);let A=this.getSpec(X);if(!A)throw Error("failed to insert cron_spec row");return{record:A,created:!0,revisionChanged:!0}}let P=W.sourceHash!==f.sourceHash&&Fh(W,H,W.enabled,Q),j=P?W.revision+1:W.revision;this.updateSpecRow(W.specId,f,H,Q,j,$);let R=this.getSpec(W.specId);if(!R)throw Error("failed to reload cron_spec after update");return{record:R,created:!1,revisionChanged:P}}insertSpecRow(f,$,W,J,H){let Q=$.spec;this.db.prepare(`INSERT INTO cron_specs (
336
+ spec_id, external_id, source_path, trigger_kind,
337
+ source_mtime_ms, source_hash, parse_status, parse_error,
338
+ enabled, removed, title, prompt, workspace_root,
339
+ schedule_expr, timezone, event_type, filters_json,
340
+ debounce_seconds, dedupe_window_seconds, cooldown_seconds,
341
+ mode, system_prompt, provider_id, model_id,
342
+ max_iterations, timeout_seconds, max_parallel,
343
+ tools_json, notes_directory, extensions_json, source,
344
+ tags_json, metadata_json, revision,
345
+ created_at, updated_at
346
+ ) VALUES (${Array.from({length:36},()=>"?").join(",")})`).run(f,$.externalId,$.sourcePath,$.triggerKind,$.sourceMtimeMs??null,$.sourceHash,$.parseStatus,$.parseError??null,J?1:0,0,W.title??"",W.prompt??null,W.workspaceRoot??null,W.scheduleExpr??null,W.timezone??null,W.eventType??null,W.filters?JSON.stringify(W.filters):null,W.debounceSeconds??null,W.dedupeWindowSeconds??null,W.cooldownSeconds??null,W.mode??null,W.systemPrompt??null,W.providerId??null,W.modelId??null,W.maxIterations??null,W.timeoutSeconds??null,W.maxParallel??null,W.tools?JSON.stringify(W.tools):null,W.notesDirectory??null,W.extensions?JSON.stringify(W.extensions):null,W.source??null,Q?.tags?JSON.stringify(Q.tags):null,Q?.metadata?JSON.stringify(Q.metadata):null,1,H,H)}updateSpecRow(f,$,W,J,H,Q){let Z=$.spec;this.db.prepare(`UPDATE cron_specs SET
347
+ external_id = ?, trigger_kind = ?,
348
+ source_mtime_ms = ?, source_hash = ?, parse_status = ?, parse_error = ?,
349
+ enabled = ?, removed = 0, title = ?, prompt = ?,
350
+ workspace_root = ?, schedule_expr = ?, timezone = ?,
351
+ event_type = ?, filters_json = ?,
352
+ debounce_seconds = ?, dedupe_window_seconds = ?, cooldown_seconds = ?,
353
+ mode = ?, system_prompt = ?, provider_id = ?, model_id = ?,
354
+ max_iterations = ?, timeout_seconds = ?, max_parallel = ?,
355
+ tools_json = ?, notes_directory = ?, extensions_json = ?, source = ?,
356
+ tags_json = ?, metadata_json = ?,
357
+ revision = ?, updated_at = ?
358
+ WHERE spec_id = ?`).run($.externalId,$.triggerKind,$.sourceMtimeMs??null,$.sourceHash,$.parseStatus,$.parseError??null,J?1:0,W.title??"",W.prompt??null,W.workspaceRoot??null,W.scheduleExpr??null,W.timezone??null,W.eventType??null,W.filters?JSON.stringify(W.filters):null,W.debounceSeconds??null,W.dedupeWindowSeconds??null,W.cooldownSeconds??null,W.mode??null,W.systemPrompt??null,W.providerId??null,W.modelId??null,W.maxIterations??null,W.timeoutSeconds??null,W.maxParallel??null,W.tools?JSON.stringify(W.tools):null,W.notesDirectory??null,W.extensions?JSON.stringify(W.extensions):null,W.source??null,Z?.tags?JSON.stringify(Z.tags):null,Z?.metadata?JSON.stringify(Z.metadata):null,H,Q,f)}markSpecRemoved(f){this.db.prepare("UPDATE cron_specs SET removed = 1, enabled = 0, updated_at = ? WHERE spec_id = ?").run(Af(),f)}updateSpecNextRunAt(f,$){this.db.prepare("UPDATE cron_specs SET next_run_at = ?, updated_at = ? WHERE spec_id = ?").run($??null,Af(),f)}updateSpecLastRunAt(f,$){this.db.prepare("UPDATE cron_specs SET last_run_at = ?, updated_at = ? WHERE spec_id = ?").run($,Af(),f)}updateLastMaterializedRunId(f,$){this.db.prepare("UPDATE cron_specs SET last_materialized_run_id = ?, updated_at = ? WHERE spec_id = ?").run($,Af(),f)}initializeScheduleNextRun(f){let $=this.getSpec(f);if(!$||$.triggerKind!=="schedule"||!$.enabled||!$.scheduleExpr){this.updateSpecNextRunAt(f,void 0);return}let W=new Date(m$($.scheduleExpr,Date.now(),$.timezone)).toISOString();this.updateSpecNextRunAt(f,W)}materializeDueScheduleRun(f){let $=f.nowMs,W=new Date($).toISOString();this.db.exec("BEGIN IMMEDIATE;");try{let J=this.db.prepare("SELECT * FROM cron_specs WHERE spec_id = ?").get(f.specId);if(!J)return this.db.exec("COMMIT;"),{queued:!1};let H=f$(J);if(H.triggerKind!=="schedule"||!H.enabled||H.removed||H.parseStatus!=="valid"||!H.scheduleExpr)return this.db.exec("COMMIT;"),{queued:!1};let Q=H.nextRunAt;if(!Q){let j=new Date(m$(H.scheduleExpr,$,H.timezone)).toISOString();return this.db.prepare("UPDATE cron_specs SET next_run_at = ?, updated_at = ? WHERE spec_id = ?").run(j,W,H.specId),this.db.exec("COMMIT;"),{queued:!1,nextRunAt:j}}if(new Date(Q).getTime()>$)return this.db.exec("COMMIT;"),{queued:!1,nextRunAt:Q};let Z=`crun_${lW()}`,P;try{P=new Date(m$(H.scheduleExpr,$,H.timezone)).toISOString()}catch{P=void 0}return this.db.prepare(`INSERT INTO cron_runs (
359
+ run_id, spec_id, spec_revision, trigger_kind, status,
360
+ scheduled_for, trigger_event_id, attempt_count,
361
+ created_at, updated_at
362
+ ) VALUES (?,?,?,?,?, ?,?,?, ?,?)`).run(Z,H.specId,H.revision,"schedule","queued",Q,null,0,W,W),this.db.prepare(`UPDATE cron_specs SET
363
+ last_materialized_run_id = ?,
364
+ last_run_at = ?,
365
+ next_run_at = ?,
366
+ updated_at = ?
367
+ WHERE spec_id = ?`).run(Z,W,P??null,W,H.specId),this.db.exec("COMMIT;"),{queued:!0,run:this.getRun(Z),nextRunAt:P}}catch(J){throw this.db.exec("ROLLBACK;"),J}}getRun(f){let $=this.db.prepare("SELECT * FROM cron_runs WHERE run_id = ?").get(f);return $?A5($):void 0}insertEventLog(f,$={}){let W=Af(),J=$.receivedAtIso??W,H=f.eventId.trim();if(!H)throw Error("automation event requires eventId");let Q=f.eventType.trim();if(!Q)throw Error("automation event requires eventType");let Z=f.source.trim();if(!Z)throw Error("automation event requires source");let P=f.occurredAt.trim()||J,j=this.db.prepare(`INSERT OR IGNORE INTO cron_event_log (
368
+ event_id, event_type, source, subject,
369
+ occurred_at, received_at, workspace_root, dedupe_key,
370
+ payload_json, attributes_json, processing_status,
371
+ matched_spec_count, queued_run_count, suppressed_count,
372
+ error, created_at, updated_at
373
+ ) VALUES (?,?,?,?, ?,?,?,?, ?,?,?, ?,?,?, ?,?,?)`).run(H,Q,Z,f.subject?.trim()||null,P,J,f.workspaceRoot?.trim()||null,f.dedupeKey?.trim()||null,MP(f.payload),MP(f.attributes),"received",0,0,0,null,W,W).changes??0,R=this.getEventLog(H);if(!R)throw Error("failed to insert cron_event_log row");return{record:R,created:j===1}}getEventLog(f){let $=this.db.prepare("SELECT * FROM cron_event_log WHERE event_id = ?").get(f);return $?UP($):void 0}listEventLogs(f={}){let $=[],W=[];if(f.eventType)$.push("event_type = ?"),W.push(f.eventType);if(f.source)$.push("source = ?"),W.push(f.source);if(f.processingStatus)$.push("processing_status = ?"),W.push(f.processingStatus);let J=$.length>0?`WHERE ${$.join(" AND ")}`:"",H=Math.max(1,Math.floor(f.limit??200));return this.db.prepare(`SELECT * FROM cron_event_log ${J}
374
+ ORDER BY received_at DESC, created_at DESC
375
+ LIMIT ?`).all(...W,H).map((Z)=>UP(Z))}updateEventLogProcessing(f,$){return(this.db.prepare(`UPDATE cron_event_log SET
376
+ processing_status = ?,
377
+ matched_spec_count = COALESCE(?, matched_spec_count),
378
+ queued_run_count = COALESCE(?, queued_run_count),
379
+ suppressed_count = COALESCE(?, suppressed_count),
380
+ error = ?,
381
+ updated_at = ?
382
+ WHERE event_id = ?`).run($.status,$.matchedSpecCount??null,$.queuedRunCount??null,$.suppressedCount??null,$.error??null,Af(),f).changes??0)===1}listRuns(f={}){let $=[],W=[];if(f.specId)$.push("spec_id = ?"),W.push(f.specId);if(f.status){let Z=Array.isArray(f.status)?f.status:[f.status];if(Z.length>0){let P=Z.map(()=>"?").join(",");$.push(`status IN (${P})`);for(let j of Z)W.push(j)}}let J=$.length>0?`WHERE ${$.join(" AND ")}`:"",H=Math.max(1,Math.floor(f.limit??200));return this.db.prepare(`SELECT * FROM cron_runs ${J} ORDER BY created_at DESC LIMIT ?`).all(...W,H).map((Z)=>A5(Z))}hasRecentEventRunForDedupe(f){return!!this.db.prepare(`SELECT r.run_id FROM cron_runs r
383
+ INNER JOIN cron_event_log e ON e.event_id = r.trigger_event_id
384
+ WHERE r.spec_id = ?
385
+ AND r.trigger_kind = 'event'
386
+ AND e.dedupe_key = ?
387
+ AND e.received_at >= ?
388
+ LIMIT 1`).get(f.specId,f.dedupeKey,f.sinceIso)}hasRecentEventRunForSpec(f){return!!this.db.prepare(`SELECT r.run_id FROM cron_runs r
389
+ INNER JOIN cron_event_log e ON e.event_id = r.trigger_event_id
390
+ WHERE r.spec_id = ?
391
+ AND r.trigger_kind = 'event'
392
+ AND e.received_at >= ?
393
+ LIMIT 1`).get(f.specId,f.sinceIso)}findQueuedEventRunForDedupe(f){let $=this.db.prepare(`SELECT r.* FROM cron_runs r
394
+ INNER JOIN cron_event_log e ON e.event_id = r.trigger_event_id
395
+ WHERE r.spec_id = ?
396
+ AND r.trigger_kind = 'event'
397
+ AND r.status = 'queued'
398
+ AND e.dedupe_key = ?
399
+ ORDER BY COALESCE(r.scheduled_for, r.created_at) DESC
400
+ LIMIT 1`).get(f.specId,f.dedupeKey);return $?A5($):void 0}updateQueuedEventRunForDebounce(f){let $=Af();if((this.db.prepare(`UPDATE cron_runs SET
401
+ trigger_event_id = ?,
402
+ scheduled_for = ?,
403
+ updated_at = ?
404
+ WHERE run_id = ?
405
+ AND trigger_kind = 'event'
406
+ AND status = 'queued'`).run(f.triggerEventId,f.scheduledFor,$,f.runId).changes??0)!==1)return;return this.getRun(f.runId)}hasOneOffRunForRevision(f,$){return!!this.db.prepare(`SELECT run_id FROM cron_runs
407
+ WHERE spec_id = ? AND spec_revision = ?
408
+ AND trigger_kind = 'one_off'
409
+ LIMIT 1`).get(f,$)}enqueueRun(f){let $=`crun_${lW()}`,W=Af();this.db.prepare(`INSERT INTO cron_runs (
410
+ run_id, spec_id, spec_revision, trigger_kind, status,
411
+ scheduled_for, trigger_event_id, attempt_count,
412
+ created_at, updated_at
413
+ ) VALUES (?,?,?,?,?, ?,?,?, ?,?)`).run($,f.specId,f.specRevision,f.triggerKind,"queued",f.scheduledFor??null,f.triggerEventId??null,0,W,W),this.updateLastMaterializedRunId(f.specId,$);let J=this.getRun($);if(!J)throw Error("failed to insert cron_run row");return J}cancelQueuedRunsForSpec(f){return this.db.prepare(`UPDATE cron_runs SET status = 'cancelled', updated_at = ?
414
+ WHERE spec_id = ? AND status = 'queued'`).run(Af(),f).changes??0}claimDueRuns(f){let $=f.nowIso,W=Math.max(1000,Math.floor(f.leaseMs)),J=new Date(new Date($).getTime()+W).toISOString(),H=Math.max(1,Math.floor(f.limit??25)),Q=[];this.db.exec("BEGIN IMMEDIATE;");try{let Z=this.db.prepare(`SELECT * FROM cron_runs
415
+ WHERE (
416
+ status = 'queued'
417
+ OR (
418
+ status = 'running'
419
+ AND claim_until_at IS NOT NULL
420
+ AND claim_until_at <= ?
421
+ AND completed_at IS NULL
422
+ )
423
+ )
424
+ AND (scheduled_for IS NULL OR scheduled_for <= ?)
425
+ ORDER BY COALESCE(scheduled_for, created_at) ASC
426
+ LIMIT ?`).all($,$,H);for(let P of Z){let j=n(P.run_id);if(!j)continue;let R=`cclaim_${lW()}`;if((this.db.prepare(`UPDATE cron_runs SET
427
+ status = 'running',
428
+ claim_token = ?,
429
+ claim_started_at = ?,
430
+ claim_until_at = ?,
431
+ started_at = ?,
432
+ completed_at = NULL,
433
+ session_id = NULL,
434
+ report_path = NULL,
435
+ error = NULL,
436
+ attempt_count = attempt_count + 1,
437
+ updated_at = ?
438
+ WHERE run_id = ?
439
+ AND (
440
+ status = 'queued'
441
+ OR (
442
+ status = 'running'
443
+ AND claim_until_at IS NOT NULL
444
+ AND claim_until_at <= ?
445
+ AND completed_at IS NULL
446
+ )
447
+ )`).run(R,$,J,$,$,j,$).changes??0)!==1)continue;let A=this.getRun(j);if(!A)continue;Q.push({run:A,claimToken:R,claimUntilAt:J})}this.db.exec("COMMIT;")}catch(Z){throw this.db.exec("ROLLBACK;"),Z}return Q}renewClaim(f,$,W){return(this.db.prepare(`UPDATE cron_runs SET claim_until_at = ?, updated_at = ?
448
+ WHERE run_id = ? AND claim_token = ?`).run(W,Af(),f,$).changes??0)===1}completeRun(f,$){let W=$.completedAtIso??Af(),J=$.claimToken?"WHERE run_id = ? AND claim_token = ?":"WHERE run_id = ?";return(this.db.prepare(`UPDATE cron_runs SET
449
+ status = ?,
450
+ session_id = COALESCE(?, session_id),
451
+ report_path = COALESCE(?, report_path),
452
+ error = ?,
453
+ completed_at = ?,
454
+ claim_started_at = NULL,
455
+ claim_token = NULL,
456
+ claim_until_at = NULL,
457
+ updated_at = ?
458
+ ${J}`).run($.status,$.sessionId??null,$.reportPath??null,$.error??null,W,W,f,...$.claimToken?[$.claimToken]:[]).changes??0)>0}requeueRun(f){let $=Af();return(this.db.prepare(`UPDATE cron_runs SET
459
+ status = 'queued',
460
+ claim_started_at = NULL,
461
+ claim_token = NULL,
462
+ claim_until_at = NULL,
463
+ started_at = NULL,
464
+ completed_at = NULL,
465
+ session_id = NULL,
466
+ report_path = NULL,
467
+ error = ?,
468
+ scheduled_for = COALESCE(?, scheduled_for),
469
+ updated_at = ?
470
+ WHERE run_id = ? AND claim_token = ?`).run(f.error??null,f.scheduledFor??null,$,f.runId,f.claimToken).changes??0)>0}attachSessionIdToRun(f,$){this.db.prepare("UPDATE cron_runs SET session_id = ?, updated_at = ? WHERE run_id = ?").run($,Af(),f)}attachReportPathToRun(f,$){this.db.prepare("UPDATE cron_runs SET report_path = ?, updated_at = ? WHERE run_id = ?").run($,Af(),f)}}class iW{store;reconciler;watcher;eventIngress;materializer;runner;started=!1;disposed=!1;constructor(f){this.store=new pW({dbPath:f.dbPath});let $=f.specs;this.reconciler=new j5({store:this.store,specs:$}),this.materializer=new uW({store:this.store}),this.eventIngress=new sH({store:this.store,logger:f.logger}),this.runner=new cW({store:this.store,materializer:this.materializer,runtimeHandlers:f.runtimeHandlers,workspaceRoot:f.workspaceRoot,specs:$,logger:f.logger,pollIntervalMs:f.pollIntervalMs,claimLeaseSeconds:f.claimLeaseSeconds,globalMaxConcurrency:f.globalMaxConcurrency}),this.watcher=new R5({reconciler:this.reconciler,debounceMs:f.watcherDebounceMs,onReconciled:()=>{this.materializer.materializeAll()},onError:(W)=>{let J=f.logger;if(J)if(J.error)J.error("cron.watcher.failed",{error:W});else J.log("cron.watcher.failed",{error:W})}})}async start(){if(this.disposed)throw Error("CronService disposed");if(this.started)return;this.started=!0,await this.reconciler.reconcileAll(),this.materializer.materializeAll(),this.watcher.start(),await this.runner.start()}async stop(){this.watcher.stop(),await this.runner.stop(),this.started=!1}async dispose(){if(this.disposed)return;this.disposed=!0,this.watcher.dispose(),await this.runner.dispose(),this.store.close()}listSpecs(f){return this.store.listSpecs(f)}getSpec(f){return this.store.getSpec(f)}listRuns(f){return this.store.listRuns(f)}getRun(f){return this.store.getRun(f)}listActiveRuns(){return this.store.listRuns({status:"running",limit:200})}listUpcomingRuns(f=20){return this.store.listRuns({status:"queued",limit:f})}async reconcileNow(){await this.reconciler.reconcileAll(),this.materializer.materializeAll()}ingestEvent(f){return this.eventIngress.ingestEvent(f)}listEventLogs(f){return this.store.listEventLogs(f)}getEventLog(f){return this.store.getEventLog(f)}}var EP={};z(EP,{manifestToSessionRecord:()=>X6,listSessionHistoryFromBackend:()=>Y5,listSessionHistory:()=>A6,hydrateSessionHistory:()=>wP});import{readdir as _h,readFile as NP}from"node:fs/promises";import{join as bP}from"node:path";import{formatDisplayUserInput as Lh,normalizeUserInput as Oh}from"@clinebot/shared";import{resolveSessionDataDir as qP}from"@clinebot/shared/storage";import{existsSync as Mh}from"node:fs";import{readFile as Gh}from"node:fs/promises";import{formatDisplayUserInput as _P}from"@clinebot/shared";class nW{listeners=new Set;subscribe(f,$){let W={listener:f,sessionId:$?.sessionId?.trim()||void 0};return this.listeners.add(W),()=>{this.listeners.delete(W)}}emit(f){let $=f.payload.sessionId?.trim();for(let W of this.listeners){if(W.sessionId&&W.sessionId!==$)continue;W.listener(f)}}get size(){return this.listeners.size}}async function x$(f){let $=f?.trim();if(!$||!Mh($))return[];try{let W=(await Gh($,"utf8")).trim();if(!W)return[];let J=JSON.parse(W);if(Array.isArray(J))return LP(J);if(J&&typeof J==="object"&&!Array.isArray(J)){let H=J.messages;if(Array.isArray(H))return LP(H)}return[]}catch{return[]}}function Dh(f){if(f.role!=="user")return f;if(typeof f.content==="string")return{...f,content:_P(f.content)};return{...f,content:f.content.map(($)=>{if($.type!=="text"||typeof $.text!=="string")return $;return{...$,text:_P($.text)}})}}function LP(f){return f.map(Dh)}function OP(f){return f?{...f}:void 0}async function CP(f,$){if(!(f.hookName==="tool_call"||!!f.parent_agent_id))return;await $.queueSpawnRequest(f);let J=await $.upsertSubagentSessionFromHook(f);if(!J)return;await $.appendSubagentHookAudit(J,f),await $.applySubagentStatus(J,f)}function j6(f){if(typeof f!=="string")return;let $=f.trim();return $.length>0?$:void 0}function wf(f){let $=j6(f);if(!$)return;return $.toLowerCase()==="unknown"?void 0:$}function R6(f){return typeof f==="number"&&Number.isFinite(f)?f:void 0}function Ch(f){if(!f||typeof f!=="object"||Array.isArray(f))return;return{...f}}function T5(f){let $=f??200;return Number.isFinite($)?Math.max(0,Math.floor($)):200}function zh(f){let $=f.match(/\d{13,}/g);if(!$||$.length===0)return 0;let W=0;for(let J of $){let H=Number.parseInt(J,10);if(Number.isFinite(H)&&H>W)W=H}return W}function X6(f){return{sessionId:f.session_id,source:f.source,pid:f.pid,startedAt:f.started_at,endedAt:f.ended_at??null,exitCode:f.exit_code??null,status:f.status,interactive:f.interactive,provider:f.provider,model:f.model,cwd:f.cwd,workspaceRoot:f.workspace_root,teamName:f.team_name,enableTools:f.enable_tools,enableSpawn:f.enable_spawn,enableTeams:f.enable_teams,isSubagent:!1,prompt:f.prompt,metadata:f.metadata,messagesPath:f.messages_path,updatedAt:f.ended_at??f.started_at}}async function Nh(f){let $=T5(f);if($===0)return[];let W=qP(),H=(await _h(W,{withFileTypes:!0}).catch(()=>[])).filter((Z)=>Z.isDirectory()).map((Z)=>({entry:Z,recency:zh(Z.name.trim())})).sort((Z,P)=>P.recency-Z.recency||P.entry.name.localeCompare(Z.entry.name));return(await Promise.all(H.map(async({entry:Z})=>{let P=Z.name.trim();if(!P)return;let j=bP(W,P,`${P}.json`),R=await NP(j,"utf8").catch(()=>{return});if(!R)return;let X;try{X=JSON.parse(R)}catch{return}let A=hf.safeParse(X);if(!A.success)return;return X6(A.data)}))).filter((Z)=>Boolean(Z)).sort((Z,P)=>P.startedAt.localeCompare(Z.startedAt)).slice(0,$)}async function bh(f,$){let W=T5($);if(W===0)return await f.listSessions(0),[];return(await f.listSessions(W)).slice(0,W)}function qh(f){if(typeof f==="string")return f.trim();let $=[];for(let W of f){if(!W||typeof W!=="object")continue;let J=W;if(J.type!=="text")continue;let H=J.text?.trim();if(H)$.push(H)}return $.join(`
471
+ `).trim()}function zP(f){return f.replace(/\s+/g," ").trim()}function wh(f,$){if(f.length<=$)return f;return`${f.slice(0,Math.max(0,$-3)).trimEnd()}...`}function Eh(f){for(let $ of["user","assistant"])for(let W of f){if(W.role!==$)continue;let J=zP(qh(W.content));if(!J)continue;let H=$==="user"?zP(Lh(J)):J,Q=Oh(H.split(`
472
+ `)[0]??H);return wh(Q,50)}return}function Sh(f){let $=0;for(let W of f)$+=R6(W.metrics?.cost)??0;return $}function kh(f){let $,W;for(let J=f.length-1;J>=0;J-=1){let H=f[J];if(!$)$=wf(H.modelInfo?.provider);if(!W)W=wf(H.modelInfo?.id);if($&&W)break}return{provider:$,model:W}}function mh(f){return wf(f?.provider)??wf(f?.provider&&typeof f.provider==="object"&&!Array.isArray(f.provider)?f.provider.id:void 0)}function gh(f){return wf(f?.model)??wf(f?.model&&typeof f.model==="object"&&!Array.isArray(f.model)?f.model.id:void 0)}function B5(f,$){let W=Ch(f.metadata),J=j6($?.title)??j6(W?.title),H=R6($?.totalCost)??R6(W?.totalCost),Q=W||J!==void 0||H!==void 0?{...W??{},...J!==void 0?{title:J}:{},...H!==void 0?{totalCost:H}:{}}:void 0;return{...f,provider:wf($?.provider)??wf(f.provider)??mh(W)??"",model:wf($?.model)??wf(f.model)??gh(W)??"",metadata:Q}}async function wP(f,$){return await Promise.all($.map(async(W)=>{let J=B5(W),H=Boolean(j6(J.metadata?.title)),Q=Boolean(wf(J.provider)),Z=Boolean(wf(J.model)),P=R6(J.metadata?.totalCost),j=P!==void 0&&P>0;if(H&&Q&&Z&&j)return J;let R=await f.readSessionMessages(W.sessionId);if(R.length===0)return J;let X=kh(R),A=Sh(R);return B5(W,{title:H?void 0:Eh(R),provider:Q?void 0:X.provider,model:Z?void 0:X.model,totalCost:j||A<=0?void 0:A})}))}async function A6(f,$={}){let W=T5($.limit),J=await bh(f,W),H=$.includeManifestFallback===!0&&J.length<W?await Nh(Math.min(Math.max(W*2,100),500)):[],Q=new Map;for(let P of[...J,...H]){if(Q.has(P.sessionId))continue;Q.set(P.sessionId,P)}let Z=H.length===0?J:Array.from(Q.values()).sort((P,j)=>j.startedAt.localeCompare(P.startedAt)).slice(0,W);if($.hydrate===!1)return Z.map((P)=>B5(P));return await wP(f,Z)}async function xh(f){let $=f.trim();if(!$)return;let W=bP(qP(),$,`${$}.json`),J=await NP(W,"utf8").catch(()=>{return});if(!J)return;try{let H=hf.safeParse(JSON.parse(J));return H.success?H.data.messages_path:void 0}catch{return}}async function Y5(f,$={}){let W=new Map;return await A6({listSessions:async(H)=>{let Q=await f.listSessions(H);W.clear();for(let Z of Q)W.set(Z.sessionId,Z);return Q.map(d2)},readSessionMessages:async(H)=>{let Q=W.get(H)?.messagesPath??await xh(H);return await x$(Q)}},$)}var Sj={};z(Sj,{resolveSessionBackend:()=>a5,createRuntimeHost:()=>a1});import{createSessionId as OK,resolveHubCommandTimeoutMs as CK}from"@clinebot/shared";import{spawn as ZK}from"node:child_process";import{closeSync as PK,mkdirSync as jK,openSync as RK}from"node:fs";import{basename as XK,dirname as AK,join as VK}from"node:path";import{fileURLToPath as BK}from"node:url";import{CLINE_RUN_AS_HUB_DAEMON_ENV as TK,isHubDaemonProcess as iP,withResolvedClineBuildEnv as YK}from"@clinebot/shared";import{createHash as Ih,randomBytes as vh}from"node:crypto";import{existsSync as uh}from"node:fs";import{chmod as ch,mkdir as F5,readFile as IP,rm as y5,writeFile as vP}from"node:fs/promises";import{dirname as uP,join as h5}from"node:path";import{resolveClineDataDir as aW,resolveClineDir as cP}from"@clinebot/shared/storage";var kP="0.0.38";var mP={name:"@clinebot/core",description:"Cline Core SDK for Node Runtime",version:kP,repository:{type:"git",url:"https://github.com/cline/sdk-wip",directory:"packages/core"},type:"module",types:"./dist/index.d.ts",main:"./dist/index.js",private:!1,publishConfig:{access:"public"},exports:{".":{development:"./src/index.ts",types:"./dist/index.d.ts",import:"./dist/index.js"},"./hub":{development:"./src/hub/index.ts",types:"./dist/hub/index.d.ts",import:"./dist/hub/index.js"},"./hub/daemon-entry":{development:"./src/hub/daemon/entry.ts",types:"./dist/hub/daemon/entry.d.ts",import:"./dist/hub/daemon/entry.js"},"./telemetry":{development:"./src/services/telemetry/index.ts",types:"./dist/services/telemetry/index.d.ts",import:"./dist/services/telemetry/index.js"}},scripts:{build:"rm -rf dist && bun run ./bun.mts && bun tsc -p tsconfig.build.json",clean:"rm -rf dist node_modules",typecheck:"bun tsc -p tsconfig.dev.json --noEmit && bun run typecheck:smoke","typecheck:smoke":"bun tsc -p tsconfig.smoke.json --noEmit",test:"bun run test:unit && bun run test:e2e","test:unit":"vitest run --config vitest.config.ts","test:e2e":"vitest run --config vitest.e2e.config.ts","verify:routines":"zsh -lc 'bunx vitest run src/cron/schedule-service.test.ts --config vitest.config.ts'","test:watch":"vitest --config vitest.config.ts"},dependencies:{"@clinebot/agents":"workspace:*","@clinebot/shared":"workspace:*","@clinebot/llms":"workspace:*","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.214.0","@opentelemetry/exporter-logs-otlp-http":"^0.214.0","@opentelemetry/exporter-metrics-otlp-http":"^0.214.0","@opentelemetry/exporter-trace-otlp-http":"^0.214.0","@opentelemetry/resources":"^2.6.1","@opentelemetry/sdk-logs":"^0.214.0","@opentelemetry/sdk-metrics":"^2.6.1","@opentelemetry/sdk-trace-base":"^2.6.1","@opentelemetry/sdk-trace-node":"^2.6.1","@opentelemetry/semantic-conventions":"^1.40.0",jiti:"^1.21.7","node-machine-id":"^1.1.12",nanoid:"^5.1.7","simple-git":"^3.32.3",ws:"^8.20.0",yaml:"^2.8.2",zod:"^4.3.6"},devDependencies:{"@types/ws":"^8.18.1"},engines:{node:">=22"},files:["dist","!dist/**/*.d.ts.map"]};var dh="CLINE_HUB_DISCOVERY_PATH",rh="CLINE_HUB_BUILD_ID",gP=30000,lh=15000,ph=100;function ih(f){return f.replace(/[^a-zA-Z0-9_.-]+/g,"_")}function nh(f){return Ih("sha256").update(f).digest("hex").slice(0,12)}function ah(f){if(!Number.isInteger(f)||!f||f<=0)return!1;try{return process.kill(f,0),!0}catch($){return $ instanceof Error&&"code"in $?String($.code)==="EPERM":!1}}function V6(){return vh(32).toString("hex")}function th(f){return new Promise(($)=>setTimeout($,f))}function sh(f){return`${f}.lock`}async function oh(f){try{let $=JSON.parse(await IP(h5(f,"owner.json"),"utf8"));if(typeof $.pid!=="number"||typeof $.acquiredAt!=="string")return;return{pid:$.pid,acquiredAt:$.acquiredAt}}catch{return}}async function xP(f){await y5(f,{recursive:!0,force:!0}).catch(()=>{return})}function $$(){return process.env[rh]?.trim()||String(mP.version)}function D0(f=process.argv[1]?.trim()||process.cwd()){let $=`hub-${nh(f)}`,W=process.env[dh]?.trim()||h5(aW(),"locks","hub","owners",`${ih($)}.json`);return{ownerId:$,discoveryPath:W}}function dP(f=`hub-${Date.now().toString(36)}`){return D0(f)}async function Zf(f){try{let $=JSON.parse(await IP(f,"utf8"));if(typeof $.hubId!=="string"||typeof $.protocolVersion!=="string"||typeof $.authToken!=="string"||typeof $.host!=="string"||typeof $.port!=="number"||typeof $.url!=="string"||typeof $.startedAt!=="string"||typeof $.updatedAt!=="string")return;return{hubId:$.hubId,protocolVersion:$.protocolVersion,buildId:typeof $.buildId==="string"?$.buildId:void 0,authToken:$.authToken,host:$.host,port:$.port,url:$.url,pid:typeof $.pid==="number"?$.pid:void 0,startedAt:$.startedAt,updatedAt:$.updatedAt}}catch{return}}async function B6(f,$){await F5(uP(f),{recursive:!0}),await y5(f,{force:!0}).catch(()=>{return}),await vP(f,`${JSON.stringify($,null,2)}
473
+ `,{encoding:"utf8",mode:384}),await ch(f,384)}async function Ef(f){await y5(f,{force:!0}).catch(()=>{return})}async function T6(f,$){let W=sh(f);await F5(uP(W),{recursive:!0});let J=Date.now()+lh;while(!0)try{await F5(W,{recursive:!1}),await vP(h5(W,"owner.json"),`${JSON.stringify({pid:process.pid,acquiredAt:new Date().toISOString()},null,2)}
474
+ `,"utf8");try{return await $()}finally{await xP(W)}}catch(H){if((H instanceof Error&&"code"in H?String(H.code):"")!=="EEXIST")throw H;let Z=await oh(W),P=Z?Date.now()-Date.parse(Z.acquiredAt):gP+1;if(!Z||!ah(Z.pid)||P>gP){await xP(W);continue}if(Date.now()>=J)throw Error(`Timed out waiting for hub startup lock ${W}`);await th(ph)}}async function Vf(f){try{let $=await fetch(K5(f));if(!$.ok)return;return await $.json()}catch{return}}function lf(f,$,W="/hub"){return new URL(`ws://${f}:${$}${W}`).toString()}function K5(f){let $=new URL(f);return $.protocol=$.protocol==="wss:"?"https:":"http:",$.pathname="/health",$.search="",$.toString()}function rP(f){return uh(f)}import{CLINE_HUB_DEV_PORT as eh,CLINE_HUB_PORT as fK,resolveClineBuildEnv as $K}from"@clinebot/shared";var WK="CLINE_HUB_HOST",JK="CLINE_HUB_PORT",HK="CLINE_HUB_PATHNAME",U5="127.0.0.1",M5=fK,G5="/hub";function lP(f){return $K(f)==="development"?eh:M5}function D5(f={}){return(f.env??process.env)[WK]?.trim()||U5}function v1(f={}){let W=(f.env??process.env)[JK]?.trim();if(!W)return lP(f);let J=Number.parseInt(W,10);if(!Number.isInteger(J)||J<1||J>65535)return lP(f);return J}function _5(f={}){return(f.env??process.env)[HK]?.trim()||G5}function Sf(f={},$={}){return{host:f.host??D5($),port:f.port??v1($),pathname:f.pathname??_5($)}}var QK="shared:cline";function pP(f){let $=G0(f.trim());return D0(`workspace:${$||f.trim()}`)}function Hf(f=QK){return D0(f)}var FK=8000,yK=200,hK=3000,KK=100,UK="--cline-hub-daemon";function MK(f){return[...f.host?["--host",f.host]:[],...typeof f.port==="number"?["--port",String(f.port)]:[],...f.pathname?["--pathname",f.pathname]:[]]}function GK(){try{let f=VK(aW(),"logs","hub-daemon.log");return jK(AK(f),{recursive:!0}),{fd:RK(f,"a"),logPath:f}}catch{return}}function tW(f){let $=f.buildId?.trim();return!!$&&$===$$()}async function DK(f,$){let W=Date.now()+$;while(Date.now()<W){if(!(await Vf(f).catch(()=>{return}))?.url)return!0;await new Promise((H)=>setTimeout(H,KK))}return!1}async function sW(f,$){if(tW(f))return;if(await oW(f.url,f.authToken).catch(()=>!1),f.pid)try{process.kill(f.pid,"SIGTERM")}catch{}await DK(f.url,hK),await Ef($).catch(()=>{return})}function _K(){let f=import.meta.url.endsWith(".ts")?"ts":"js";return BK(new URL(`./entry.${f}`,import.meta.url))}function LK(f,$){let W=_K(),J=process.execPath?.trim();if(!J)throw Error("unable to resolve runtime executable for hub daemon");let H=XK(J).toLowerCase().includes("bun"),Q=W.startsWith("/$bunfs/"),Z=H&&W.toLowerCase().endsWith(".ts"),P=Q?[UK]:[...Z?["--conditions=development"]:[],W];return{launcher:J,args:[...P,"--cwd",f,...MK($)],cwd:f,env:{...YK(process.env),CLINE_NO_INTERACTIVE:"1",[TK]:"1"}}}function u1(f,$={}){if(iP())return;let W=LK(f,$),J=GK();try{ZK(W.launcher,W.args,{detached:!0,stdio:J?["ignore",J.fd,J.fd]:"ignore",env:W.env,cwd:W.cwd}).unref()}finally{if(J)PK(J.fd)}}function Y6(f,$={}){if(iP())return;let W=Hf(),J=$.port!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),H=Sf($),Q=lf(H.host,H.port,H.pathname);Zf(W.discoveryPath).then(async(Z)=>{if(Z?.url){let X=await Vf(Z.url);if(X?.url&&tW(X)&&await ef(X.url,{authToken:Z.authToken}))return;if(X?.url)await sW({...X,authToken:Z.authToken},W.discoveryPath);else await Ef(W.discoveryPath).catch(()=>{return})}let P=await Vf(Q);if(P?.url)await sW(P,W.discoveryPath);let R=!J&&H.port!==0?{...H,port:0}:H;u1(f,R)}).catch(()=>{})}async function nP(f,$={}){let W=Hf(),J=$.host!==void 0||$.port!==void 0||$.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),H=$.port!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),Q=Sf($),Z=lf(Q.host,Q.port,Q.pathname),P=(B)=>{if(!J)W$(B.url,B.authToken);return B},j=await Zf(W.discoveryPath);if(j?.url){let B=await Vf(j.url);if(B?.url&&tW(B)&&await ef(B.url,{authToken:j.authToken}))return P({url:B.url,authToken:j.authToken});if(B?.url)await sW({...B,authToken:j.authToken},W.discoveryPath);else await Ef(W.discoveryPath).catch(()=>{return})}let R=await Vf(Z);if(R?.url)await sW(R,W.discoveryPath);let A=!H&&Q.port!==0?{...Q,port:0}:Q;u1(f,A);let V=Date.now()+FK;while(Date.now()<V){let B=await Zf(W.discoveryPath);if(B?.url){let h=await Vf(B.url);if(h?.url&&tW(h)&&await ef(h.url,{authToken:B.authToken}))return P({url:h.url,authToken:B.authToken})}let T=await Vf(Z);if(T?.url&&!tW(T))await sW(T,W.discoveryPath);await new Promise((h)=>setTimeout(h,yK))}throw Error("Timed out waiting for detached hub startup.")}function zK(){let f=globalThis.WebSocket;if(!f)throw Error("Global WebSocket is not available in this runtime. Node 22+ is required for hub mode.");return f}function eP(f){if(typeof f==="string")return f;if(f instanceof Uint8Array)return Buffer.from(f).toString();if(f instanceof ArrayBuffer)return Buffer.from(f).toString();if(Array.isArray(f))return Buffer.concat(f.map(($)=>Buffer.from($))).toString();if(f&&typeof f==="object"&&"data"in f&&typeof f.data<"u")return eP(f.data);return String(f)}function NK(f){if(typeof f==="string")return f;if(f instanceof Uint8Array)return Buffer.from(f).toString("utf8");if(f instanceof ArrayBuffer)return Buffer.from(f).toString("utf8");return""}function aP(f){let $=f,W=NK($.reason);return new Ff("hub_connection_closed",$.code||W?`Hub connection closed (code=${$.code??0}${W?`, reason=${W}`:""})`:L5,{closeCode:$.code,closeReason:W||void 0})}function bK(f,$){if(f instanceof Ff)return f;if(f instanceof Error)return new Ff("hub_connect_failed",f.message);if(f&&typeof f==="object"&&"error"in f&&f.error instanceof Error)return new Ff("hub_connect_failed",f.error.message);let W=f&&typeof f==="object"&&"message"in f&&typeof f.message==="string"?f.message.trim():"";if(W)return new Ff("hub_connect_failed",W);let J=f&&typeof f==="object"&&"type"in f&&typeof f.type==="string"?f.type.trim():"";return new Ff("hub_connect_failed",J?`Failed to connect to hub at ${$.toString()} (${J} event before socket open).`:`Failed to connect to hub at ${$.toString()}.`)}var qK=8000,wK=200,tP="*",sP=8000,EK="cline-hub-auth.",fj=new Map,$j=new Set,SK=3000,kK=3000,mK=100,L5="Hub connection closed",gK=250,xK=5000,oP=0.5;class Ff extends Error{code;details;constructor(f,$,W){super($);this.code=f;this.details=W;this.name="HubTransportError"}}function z5(f){return f instanceof Ff}class c1 extends Error{command;code;constructor(f,$,W){super(W);this.command=f;this.code=$;this.name="HubCommandError"}}function F6(f,$){return f instanceof c1&&f.code==="hub_command_timeout"&&($===void 0||f.command===$)}function Wj(f){let $=f.searchParams.get("authToken")?.trim();if(f.searchParams.delete("authToken"),$)return $;let W=N5(f.toString());return W?fj.get(W):void 0}function IK(f){try{let W=new URL(f).hostname.toLowerCase().replace(/^\[|\]$/g,"");return W==="localhost"||W==="127.0.0.1"||W==="::1"}catch{return!1}}function N5(f){if(!IK(f))return;let $=new URL(J$(f));return $.search="",$.hash="",$.toString()}function O5(f){let $=N5(f);return!!$&&$j.has($)}function W$(f,$){let W=N5(f);if(W){if($j.add(W),$?.trim())fj.set(W,$)}return f}class pf{options;socket;connectPromise;clientId;currentUrl;recoveryPromise;pendingReplies=new Map;listeners=new Set;subscriptionCounts=new Map;reconnectTimer;reconnectAttempt=0;closedByClient=!1;lastCloseError=new Ff("hub_connection_closed",L5);sawSocketClose=!1;registered=!1;constructor(f){this.options=f;this.clientId=f.clientId??`core-${Math.random().toString(36).slice(2,10)}-${Date.now().toString(36)}`,this.currentUrl=f.url}getClientId(){return this.clientId}getUrl(){return this.currentUrl}async connect(){if(this.socket&&(this.socket.readyState===1||this.socket.readyState===0))return this.connectPromise??Promise.resolve();this.closedByClient=!1,this.clearReconnectTimer();let f=new URL(this.currentUrl),$=this.options.authToken?.trim()||Wj(f);f.hash="";let J=new(zK())(f.toString(),$?[`${EK}${$}`]:void 0);this.socket=J;let H=!1;this.connectPromise=new Promise((Q,Z)=>{let P=!1,j=setTimeout(()=>{if(P)return;P=!0,H=!0,this.lastCloseError=new Ff("hub_connect_timeout",`Timed out connecting to hub after ${sP}ms`),this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0;try{J.close()}catch{}Z(this.lastCloseError)},sP);J.addEventListener("open",()=>{if(P)return;P=!0,clearTimeout(j),Q()}),J.addEventListener("error",(R)=>{if(P)return;P=!0,clearTimeout(j),this.lastCloseError=bK(R,f),this.sawSocketClose=!1,this.connectPromise=void 0,this.socket=void 0,Z(this.lastCloseError)}),J.addEventListener("close",(R)=>{if(P)return;if(P=!0,clearTimeout(j),!H)this.lastCloseError=aP(R),this.sawSocketClose=!0;this.connectPromise=void 0,this.socket=void 0,Z(this.lastCloseError)})}),J.addEventListener("message",(Q)=>{this.handleFrame(JSON.parse(eP(Q)))}),J.addEventListener("close",(Q)=>{if(this.socket!==J)return;if(!H)this.lastCloseError=aP(Q),this.sawSocketClose=!0;this.registered=!1;for(let Z of this.pendingReplies.values())Z.reject(this.lastCloseError);if(this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0,!this.closedByClient&&this.hasActiveSubscriptions())this.scheduleReconnect()}),await this.connectPromise,await this.command("client.register",{clientId:this.clientId,clientType:this.options.clientType??"core",displayName:this.options.displayName??"core",transport:"native",actorKind:"client",workspaceContext:{workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}}),this.registered=!0;for(let Q of this.subscriptionCounts.keys())this.sendSubscriptionFrame("stream.subscribe",this.subscriptionSessionIdFromKey(Q));this.reconnectAttempt=0}subscribe(f,$){let W=$?.sessionId?.trim()||void 0,J={listener:f,sessionId:W};return this.listeners.add(J),this.adjustSubscriptionCount(W,1),()=>{if(!this.listeners.delete(J))return;this.adjustSubscriptionCount(W,-1)}}async command(f,$,W,J){let H=0,Q=f!=="client.register"&&f!=="client.unregister";while(!0)try{return await this.commandOnce(f,$,W,J)}catch(Z){if(!Q||H>=1||!await this.recoverLocalHubTransport(Z))throw Z;H+=1}}async commandOnce(f,$,W,J){await this.connect();let H=OK("hubreq_"),Q=CK(f,J?.timeoutMs),Z=new Promise((j,R)=>{let X=Q===null?void 0:setTimeout(()=>{if(!this.pendingReplies.delete(H))return;R(new c1(f,"hub_command_timeout",`Hub command ${f} timed out after ${Q}ms (hub=${this.currentUrl}, requestId=${H}, clientId=${this.clientId}). Check hub-daemon.log for matching command.start/command.slow entries, or run 'cline doctor fix' to restart the hub.`))},Q);this.pendingReplies.set(H,{resolve:(A)=>{if(X)clearTimeout(X);j(A)},reject:(A)=>{if(X)clearTimeout(X);R(A)}})});try{this.sendFrame({kind:"command",envelope:{version:"v1",command:f,requestId:H,clientId:this.clientId,sessionId:W,timeoutMs:Q,payload:$}})}catch(j){throw this.pendingReplies.delete(H),j}let P=await Z;if(!P.ok)throw new c1(f,P.error?.code,P.error?.message??`Hub command ${f} failed`);return P}async recoverLocalHubTransport(f){if(!O5(this.currentUrl)||!z5(f))return!1;if(this.recoveryPromise)return await this.recoveryPromise;return this.recoveryPromise=(async()=>{let $=await I$({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd}).catch(()=>{return});if(!$)return!1;return this.currentUrl=$,this.close(),!0})().finally(()=>{this.recoveryPromise=void 0}),await this.recoveryPromise}hasActiveSubscriptions(){return this.subscriptionCounts.size>0}clearReconnectTimer(){if(!this.reconnectTimer)return;clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0}scheduleReconnect(){if(this.reconnectTimer||this.closedByClient||!this.hasActiveSubscriptions())return;let f=Math.min(gK*2**this.reconnectAttempt,xK),$=Math.round(f*(1-oP)+Math.random()*f*oP);this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.reconnectSubscribedTransport()},$)}async reconnectSubscribedTransport(){if(this.closedByClient||!this.hasActiveSubscriptions())return;try{await this.connect(),this.reconnectAttempt=0}catch{if(!O5(this.currentUrl)){this.reconnectAttempt+=1,this.scheduleReconnect();return}try{let f=await I$({workspaceRoot:this.options.workspaceRoot,cwd:this.options.cwd});if(f){this.currentUrl=f,await this.connect(),this.reconnectAttempt=0;return}}catch{}this.reconnectAttempt+=1,this.scheduleReconnect()}}close(){let f=this.socket;if(this.closedByClient=!0,this.clearReconnectTimer(),this.registered=!1,!f)return;this.lastCloseError=new Ff("hub_connection_closed",L5),this.sawSocketClose=!1;for(let $ of this.pendingReplies.values())$.reject(this.lastCloseError);this.pendingReplies.clear(),this.connectPromise=void 0,this.socket=void 0;try{f.close()}catch{}}async dispose(){if(this.socket?.readyState===1&&this.registered)try{await this.command("client.unregister",void 0,void 0,{timeoutMs:2000})}catch{}this.close()}sendFrame(f){if(!this.socket||this.socket.readyState!==1){if(this.lastCloseError.code==="hub_connection_closed"&&!this.sawSocketClose)throw new Ff("hub_connection_not_open","Hub connection is not open.");throw this.lastCloseError}this.socket.send(JSON.stringify(f))}sendSubscriptionFrame(f,$){this.sendFrame({kind:f,clientId:this.clientId,...$?{sessionId:$}:{}})}adjustSubscriptionCount(f,$){let W=this.subscriptionKeyForSessionId(f),J=(this.subscriptionCounts.get(W)??0)+$;if(J<=0){if(this.subscriptionCounts.delete(W),!this.hasActiveSubscriptions())this.clearReconnectTimer();if($<0&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.unsubscribe",f);return}if(this.subscriptionCounts.set(W,J),$>0&&J===1&&this.socket?.readyState===1)this.sendSubscriptionFrame("stream.subscribe",f)}subscriptionKeyForSessionId(f){return f??tP}subscriptionSessionIdFromKey(f){return f===tP?void 0:f}handleFrame(f){switch(f.kind){case"reply":{let $=f.envelope.requestId;if(!$)return;let W=this.pendingReplies.get($);if(!W)return;this.pendingReplies.delete($),W.resolve(f.envelope);return}case"event":for(let $ of this.listeners){if($.sessionId&&$.sessionId!==f.envelope.sessionId?.trim())continue;$.listener(f.envelope)}return;case"command":case"stream.subscribe":case"stream.unsubscribe":return}}}function J$(f){let $=new URL(f);if($.protocol==="http:")$.protocol="ws:";else if($.protocol==="https:")$.protocol="wss:";return $.toString()}async function ef(f,$){let W=new pf({url:f,authToken:$?.authToken,clientType:"hub-healthcheck",displayName:"hub healthcheck",workspaceRoot:$?.workspaceRoot,cwd:$?.cwd});try{return await W.connect(),!0}catch{return!1}finally{W.close()}}async function C5(f,$){let W=J$(f),J=await Vf(W);if(!J)return{status:"unreachable",url:W};let H=$$(),Q=J.buildId?.trim();if(!Q||Q!==H)return{status:"build_mismatch",url:W};if($?.verifyConnection===!0&&!await ef(W,{workspaceRoot:$.workspaceRoot,cwd:$.cwd,authToken:$.authToken}))return{status:"unreachable",url:W};return{status:"compatible",url:W}}async function vK(f){let $=Date.now()+qK;while(Date.now()<$){let W=await Zf(f.discoveryPath);if(W?.url){let J=await C5(W.url,{verifyConnection:!0,authToken:W.authToken});if(J.status==="compatible")return W$(J.url,W.authToken)}await new Promise((J)=>setTimeout(J,wK))}return}async function uK(f){let $=Date.now()+kK;while(Date.now()<$){if(!(await Vf(f).catch(()=>{return}))?.url)return!0;await new Promise((J)=>setTimeout(J,mK))}return!1}function cK(f,$){try{return J$(f)===J$($)}catch{return!1}}function dK(f){return(f&&typeof f==="object"&&Array.isArray(f.sessions)?f.sessions:[]).some((W)=>{if(!W||typeof W!=="object")return!1;let J=W;if(J.status==="running"||J.status==="idle")return!0;return Array.isArray(J.participants)&&J.participants.length>0})}async function rK(f,$,W){let J=new pf({url:f,authToken:$,clientType:"hub-recovery-check",displayName:"hub recovery check",workspaceRoot:W?.workspaceRoot,cwd:W?.cwd});try{let H=await J.command("session.list",{limit:500},void 0,{timeoutMs:SK});return!dK(H.payload)}catch{return!1}finally{await J.dispose().catch(()=>{return})}}async function eW(f={}){if(f.endpoint?.trim()){let H=await C5(f.endpoint);return H.status==="compatible"?H.url:void 0}let $=Hf(),W=await Zf($.discoveryPath);if(!W?.url)return;let J=await C5(W.url);if(J.status==="compatible")return W$(J.url,W.authToken);if(J.status==="build_mismatch")await Ef($.discoveryPath).catch(()=>{return});return}async function I$(f={}){let $=await eW(f);if($&&await ef($,{workspaceRoot:f.workspaceRoot,cwd:f.cwd}))return $;if(f.endpoint?.trim())return;let W=Hf();return u1(f.workspaceRoot??process.cwd()),await vK(W)}async function oW(f,$){let W=new URL(f),J=$?.trim()||Wj(W);if(W.protocol==="ws:")W.protocol="http:";else if(W.protocol==="wss:")W.protocol="https:";return W.pathname="/shutdown",W.hash="",(await fetch(W,{method:"POST",headers:J?{authorization:`Bearer ${J}`}:void 0})).ok}async function b5(){let f=Hf(),$=await Zf(f.discoveryPath);if(!$?.url)return!1;try{if(await oW($.url,$.authToken))return!0}catch{}return!1}async function y6(f){if(!O5(f.url))return;let $=Hf(),W=await Zf($.discoveryPath);if(!W?.url||!cK(W.url,f.url))return;if(!await rK(W.url,W.authToken,{workspaceRoot:f.workspaceRoot,cwd:f.cwd}))return;if(!await b5())return;if(!await uK(W.url))return;return await Ef($.discoveryPath).catch(()=>{return}),await I$({workspaceRoot:f.workspaceRoot,cwd:f.cwd})}var Vj={};z(Vj,{HubRuntimeHost:()=>_0});import{createSessionId as Hj,HUB_CHECKPOINT_CAPABILITY as nK,HUB_COMPACTION_CAPABILITY as aK,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as tK,HUB_HOOK_CAPABILITY_PREFIX as sK,HUB_MISTAKE_LIMIT_CAPABILITY as oK,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as eK,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as fU,isHubToolExecutorName as $U}from"@clinebot/shared";var Jj={};z(Jj,{createCoreSessionSnapshot:()=>f0,coreSessionSnapshotToRecord:()=>h6});function lK(f){return f?JSON.parse(JSON.stringify(f)):void 0}function pK(f){return f?JSON.parse(JSON.stringify(f)):void 0}function iK(f){let $=f?.checkpoint&&typeof f.checkpoint==="object"&&!Array.isArray(f.checkpoint)?f.checkpoint:void 0,J=(Array.isArray($?.history)?$.history:[]).filter((Z)=>!!Z&&typeof Z==="object"&&!Array.isArray(Z)).flatMap((Z)=>{let P=typeof Z.ref==="string"?Z.ref.trim():"",j=Number(Z.createdAt),R=Number(Z.runCount);if(!P||!Number.isFinite(j)||!Number.isInteger(R))return[];return[{ref:P,createdAt:j,runCount:R,...Z.kind==="stash"||Z.kind==="commit"?{kind:Z.kind}:{}}]}),H=J.at(-1),Q=f?.checkpointEnabled===!0?!0:void 0;if(!Q&&J.length===0)return;return{...Q?{enabled:Q}:{},...H?{latest:H}:{},history:J}}function f0(f){let{session:$}=f,W=lK($.metadata);return{version:1,sessionId:$.sessionId,source:$.source,status:$.status,createdAt:$.startedAt,updatedAt:$.updatedAt,endedAt:$.endedAt??null,exitCode:$.exitCode??null,interactive:$.interactive,workspace:{cwd:$.cwd,root:$.workspaceRoot},model:{providerId:$.provider,modelId:$.model},capabilities:{enableTools:$.enableTools,enableSpawn:$.enableSpawn,enableTeams:$.enableTeams},lineage:{...$.parentSessionId?{parentSessionId:$.parentSessionId}:{},...$.parentAgentId?{parentAgentId:$.parentAgentId}:{},...$.agentId?{agentId:$.agentId}:{},...$.conversationId?{conversationId:$.conversationId}:{},isSubagent:$.isSubagent},...$.teamName?{team:{name:$.teamName}}:{},...$.prompt?{prompt:$.prompt}:{},...W?{metadata:W}:{},...$.messagesPath?{artifacts:{messagesPath:$.messagesPath}}:{},...f.messages?{messages:pK(f.messages)}:{},...f.usage?{usage:{...f.usage}}:{},...(()=>{let J=iK(W);return J?{checkpoint:J}:{}})()}}function h6(f){return{sessionId:f.sessionId,parentSessionId:f.lineage.parentSessionId,agentId:f.lineage.agentId,parentAgentId:f.lineage.parentAgentId,conversationId:f.lineage.conversationId,isSubagent:f.lineage.isSubagent,source:f.source,startedAt:f.createdAt,endedAt:f.endedAt??void 0,exitCode:f.exitCode??void 0,status:f.status,interactive:f.interactive,provider:f.model.providerId,model:f.model.modelId,cwd:f.workspace.cwd,workspaceRoot:f.workspace.root,teamName:f.team?.name,enableTools:f.capabilities.enableTools,enableSpawn:f.capabilities.enableSpawn,enableTeams:f.capabilities.enableTeams,prompt:f.prompt,metadata:f.metadata,updatedAt:f.updatedAt,messagesPath:f.artifacts?.messagesPath}}function d1(f){if(!f)return;return JSON.parse(JSON.stringify(f))}var WU=["beforeRun","afterRun","beforeModel","afterModel","beforeTool","afterTool","onEvent"];function Qj(f){if(!f||typeof f!=="object"||Array.isArray(f))return;return JSON.parse(JSON.stringify(f))}function Zj(f){if(!f)return;let{userInstructionService:$,...W}=f;return JSON.parse(JSON.stringify(W))}function Pj(f){let $=f&&typeof f==="object"&&!Array.isArray(f)?f:{};return{agentId:typeof $.agentId==="string"?$.agentId:"",conversationId:typeof $.conversationId==="string"?$.conversationId:"",iteration:typeof $.iteration==="number"?$.iteration:0,metadata:$.metadata&&typeof $.metadata==="object"&&!Array.isArray($.metadata)?$.metadata:void 0}}function v$(f,$,W){f.manifest.push($),f.handlers.set($.capabilityName,W)}function jj(f,$){let W={manifest:[],handlers:new Map};for(let H of Object.keys($.toolExecutors??{}).filter($U)){let Q=$.toolExecutors?.[H];if(typeof Q!=="function")continue;v$(W,{kind:"toolExecutor",executor:H,capabilityName:`${eK}${H}`},async({payload:Z,abortSignal:P})=>{let j=Array.isArray(Z.args)?[...Z.args]:[],R={...Pj(Z.context),signal:P};return{result:await Q(...j,R)}})}for(let H of f?.extraTools??[])v$(W,{kind:"tool",name:H.name,description:H.description,inputSchema:d1(H.inputSchema)??{},...H.lifecycle?{lifecycle:d1(H.lifecycle)}:{},capabilityName:`${tK}${H.name}`},async({payload:Q,abortSignal:Z,progress:P})=>{let j={...Pj(Q.context),signal:Z};return{result:await H.execute(Q.input,{...j,emitUpdate:(X)=>{P({update:X})}})}});let J=f?.hooks;if(J)for(let H of WU){let Q=J[H];if(typeof Q!=="function")continue;v$(W,{kind:"hook",name:H,capabilityName:`${sK}${H}`},async({payload:Z})=>({control:await Q(Z.context)}))}if(f?.compaction?.compact){let H=f.compaction.compact;v$(W,{kind:"compaction",capabilityName:aK,config:Qj(f.compaction)},async({payload:Q})=>({result:await H(Q.context)}))}if(f?.checkpoint?.createCheckpoint){let H=f.checkpoint.createCheckpoint;v$(W,{kind:"checkpoint",capabilityName:nK,config:Qj(f.checkpoint)},async({payload:Q})=>({result:await H(Q.context)}))}if(f?.onConsecutiveMistakeLimitReached){let H=f.onConsecutiveMistakeLimitReached;v$(W,{kind:"mistakeLimit",capabilityName:oK},async({payload:Q})=>({result:await H(Q.context)}))}if(f?.userInstructionService){let H=f.userInstructionService;v$(W,{kind:"userInstructionService",capabilityName:fU},async()=>{return await H.start().catch(()=>{}),{snapshot:{records:{skill:H.listRecords("skill"),rule:H.listRecords("rule"),workflow:H.listRecords("workflow")},runtimeCommands:H.listRuntimeCommands()}}})}return W}function JU(f){if(typeof f==="string"&&f.trim())return f.trim();if(f instanceof Error)return f.message;if(f&&typeof f==="object"&&"message"in f){let $=f.message;if(typeof $==="string"&&$.trim())return $.trim()}return"Capability request was cancelled."}function HU(f){if(typeof f!=="string")return f;try{return JSON.parse(f)}catch{return f}}function QU(f){return f==="completed"||f==="max_iterations"||f==="aborted"||f==="mistake_limit"||f==="error"}function ZU(f){if(!f||typeof f!=="object"||Array.isArray(f))return;let $=f,W=typeof $.inputTokens==="number"?$.inputTokens:void 0,J=typeof $.outputTokens==="number"?$.outputTokens:void 0;if(W===void 0||J===void 0)return;return{inputTokens:W,outputTokens:J,cacheReadTokens:typeof $.cacheReadTokens==="number"?$.cacheReadTokens:0,cacheWriteTokens:typeof $.cacheWriteTokens==="number"?$.cacheWriteTokens:0,totalCost:typeof $.totalCost==="number"?$.totalCost:0}}function PU(f){let $=f?.result&&typeof f.result==="object"&&!Array.isArray(f.result)?f.result:void 0,W=f?.reason??$?.finishReason,J=QU(W)?W:W==="failed"?"error":"completed",H=ZU(f?.usage??$?.usage);return{type:"done",reason:J,text:typeof f?.text==="string"?f.text:typeof $?.text==="string"?$.text:"",iterations:typeof f?.iterations==="number"?f.iterations:typeof $?.iterations==="number"?$.iterations:0,usage:H}}function q5(f,$){return f.error?.message??`hub command failed: ${$}`}function f8(f){switch(f){case"idle":case"completed":return"completed";case"failed":return"failed";case"aborted":return"cancelled";default:return"running"}}function Aj(f){let $=f.metadata&&typeof f.metadata==="object"?JSON.parse(JSON.stringify(f.metadata)):void 0;return{sessionId:f.sessionId,parentSessionId:typeof $?.parentSessionId==="string"?$.parentSessionId:void 0,agentId:f.runtimeSession?.agentId||(typeof $?.agentId==="string"?$.agentId:void 0),parentAgentId:typeof $?.parentAgentId==="string"?$.parentAgentId:void 0,conversationId:typeof $?.conversationId==="string"?$.conversationId:void 0,isSubagent:typeof $?.isSubagent==="boolean"?$.isSubagent:!1,source:typeof $?.source==="string"?$.source:jf.CORE,pid:typeof $?.pid==="number"?$.pid:void 0,startedAt:new Date(f.createdAt).toISOString(),endedAt:f8(f.status)==="running"?void 0:new Date(f.updatedAt).toISOString(),exitCode:f8(f.status)==="completed"?0:f8(f.status)==="failed"?1:void 0,status:f8(f.status),interactive:$?.interactive===!0,provider:typeof $?.provider==="string"?$.provider:"hub",model:typeof $?.model==="string"?$.model:"hub",cwd:f.cwd?.trim()||f.workspaceRoot,workspaceRoot:f.workspaceRoot,teamName:typeof $?.teamName==="string"?$.teamName:void 0,enableTools:f.runtimeOptions?.enableTools??$?.enableTools===!0,enableSpawn:f.runtimeOptions?.enableSpawn??$?.enableSpawn===!0,enableTeams:f.runtimeOptions?.enableTeams??$?.enableTeams===!0,prompt:typeof $?.prompt==="string"?$.prompt:void 0,metadata:$,updatedAt:new Date(f.updatedAt).toISOString(),messagesPath:typeof $?.messagesPath==="string"?$.messagesPath:void 0,hookPath:typeof $?.hookPath==="string"?$.hookPath:void 0}}function u$(f){if(!f||typeof f!=="object"||Array.isArray(f))return;let $=f;return $.version===1&&typeof $.sessionId==="string"?JSON.parse(JSON.stringify($)):void 0}function jU(f){let $=u$(f?.snapshot);if($)return h6($);let W=f?.session;return W?Aj(W):void 0}function Rj(f,$,W){let J=W?.workspaceRoot?.trim()||$.config.workspaceRoot||$.config.cwd;return hf.parse({version:1,session_id:f,source:$.source??jf.CORE,pid:process.pid,started_at:new Date(W?.createdAt??Date.now()).toISOString(),status:f8(W?.status),interactive:$.interactive===!0,provider:$.config.providerId,model:$.config.modelId,cwd:W?.cwd?.trim()||$.config.cwd,workspace_root:J,team_name:$.config.teamName,enable_tools:$.config.enableTools,enable_spawn:$.config.enableSpawnAgent,enable_teams:$.config.enableAgentTeams,prompt:$.prompt?.trim()||void 0,metadata:$.sessionMetadata&&Object.keys($.sessionMetadata).length>0?$.sessionMetadata:void 0})}function Xj(f,$){return hf.parse({version:1,session_id:f.sessionId,source:f.source,pid:process.pid,started_at:f.createdAt,status:f.status,interactive:f.interactive,provider:f.model.providerId,model:f.model.modelId,cwd:f.workspace.cwd,workspace_root:f.workspace.root,team_name:f.team?.name,enable_tools:f.capabilities.enableTools,enable_spawn:f.capabilities.enableSpawn,enable_teams:f.capabilities.enableTeams,prompt:(f.prompt??$.prompt?.trim())||void 0,metadata:f.metadata,messages_path:f.artifacts?.messagesPath})}class _0{runtimeAddress;pendingPrompts;client;clientOptions;clientContext;events=new nW;sessionCapabilities=new Map;sessionClientContributionHandlers=new Map;sessionSubscriptions=new Map;pendingApprovalToolCallIds=new Set;agentDoneEmittedForCurrentRunBySession=new Set;activeCapabilityAbortControllers=new Map;defaultCapabilities;constructor(f,$){this.clientContext=$,this.clientOptions={authToken:f.authToken,clientType:f.clientType??"core-hub-runtime",displayName:f.displayName??"core hub runtime",workspaceRoot:$?.workspaceRoot,cwd:$?.cwd},this.defaultCapabilities=Xf(f.capabilities)??{},this.runtimeAddress=f.url,this.pendingPrompts={list:(W)=>this.requestPendingPromptsList(W),update:(W)=>this.requestPendingPromptUpdate(W),delete:(W)=>this.requestPendingPromptDelete(W)},this.client=this.createClient(f.url)}createClient(f){return new pf({...this.clientOptions,url:f})}async replaceClient(f){let $=this.client;this.client=this.createClient(f),this.runtimeAddress=f,await Promise.resolve($.dispose()).catch(()=>{return})}async recoverLocalHubStartupDeadlock(f){if(!F6(f,"session.create"))return!1;let $=await y6({url:this.client.getUrl(),workspaceRoot:this.clientContext?.workspaceRoot,cwd:this.clientContext?.cwd}).catch(()=>{return});if(!$)return!1;return await this.replaceClient($),!0}registerPlannedSession(f,$,W){if(this.sessionCapabilities.set(f,$),W.size>0)this.sessionClientContributionHandlers.set(f,W);this.ensureSessionSubscription(f)}cleanupPlannedSession(f){this.sessionCapabilities.delete(f),this.sessionClientContributionHandlers.delete(f),this.disposeSessionSubscription(f)}async connect(){await this.client.connect()}async startSession(f){let $=this.resolveCapabilities(f),W=jj(f.localRuntime,$),J=f.config.sessionId?.trim()||Hj(),H=()=>this.client.command("session.create",{workspaceRoot:f.config.workspaceRoot?.trim()||f.config.cwd,cwd:f.config.cwd,sessionConfig:d1({...f.config,sessionId:J}),metadata:{...f.sessionMetadata??{},source:f.source??jf.CORE,provider:f.config.providerId,model:f.config.modelId,enableTools:f.config.enableTools,enableSpawn:f.config.enableSpawnAgent,enableTeams:f.config.enableAgentTeams,teamName:f.config.teamName,prompt:f.prompt,interactive:f.interactive===!0},runtimeOptions:{...W.manifest.length>0?{clientContributions:W.manifest}:{},...f.localRuntime?.configExtensions?{configExtensions:f.localRuntime.configExtensions}:{}},toolPolicies:d1(f.toolPolicies),initialMessages:f.initialMessages});this.registerPlannedSession(J,$,W.handlers);let Q;try{Q=await H()}catch(R){if(this.cleanupPlannedSession(J),await this.recoverLocalHubStartupDeadlock(R)){this.registerPlannedSession(J,$,W.handlers);try{Q=await H()}catch(X){throw this.cleanupPlannedSession(J),X}}else throw R}let Z=u$(Q.payload?.snapshot),P=Q.payload?.session,j=(Z?.sessionId??P?.sessionId)?.trim();if(!j)throw this.cleanupPlannedSession(J),Error("Hub runtime did not return a session id.");if(j!==J)this.cleanupPlannedSession(J),this.registerPlannedSession(j,$,W.handlers);return{sessionId:j,manifest:Z?Xj(Z,f):Rj(j,f,P),manifestPath:"",messagesPath:"",result:void 0}}async restoreSession(f){let $=f.sessionId.trim();if(!$)throw Error("sessionId is required");let W=f.restore?.messages!==!1;if(W&&!f.start)throw Error("start is required when restore.messages is true");let J=f.start,H=J?this.resolveCapabilities(J):void 0,Q=J?jj(J.localRuntime,H??{}):{manifest:[],handlers:new Map},Z=J?J.config.sessionId?.trim()||Hj():void 0;if(Z&&H)this.sessionCapabilities.set(Z,H);if(Z&&Q.handlers.size>0)this.sessionClientContributionHandlers.set(Z,Q.handlers),this.ensureSessionSubscription(Z);let P;try{P=await this.client.command("session.restore",{sessionId:$,checkpointRunCount:f.checkpointRunCount,restore:f.restore,...J?{workspaceRoot:J.config.workspaceRoot?.trim()||J.config.cwd,cwd:J.config.cwd??f.cwd,sessionConfig:d1({...J.config,sessionId:Z}),metadata:{...J.sessionMetadata??{},source:J.source??jf.CORE,provider:J.config.providerId,model:J.config.modelId,enableTools:J.config.enableTools,enableSpawn:J.config.enableSpawnAgent,enableTeams:J.config.enableAgentTeams,teamName:J.config.teamName,prompt:J.prompt,interactive:J.interactive===!0},runtimeOptions:{...Q.manifest.length>0?{clientContributions:Q.manifest}:{},...J.localRuntime?.configExtensions?{configExtensions:J.localRuntime.configExtensions}:{}},toolPolicies:d1(J.toolPolicies)}:{}},$)}catch(B){if(Z)this.sessionCapabilities.delete(Z),this.sessionClientContributionHandlers.delete(Z),this.disposeSessionSubscription(Z);throw B}if(!P.ok){let B=typeof P.payload?.error==="string"?P.payload.error:"session.restore failed";if(Z)this.sessionCapabilities.delete(Z),this.sessionClientContributionHandlers.delete(Z),this.disposeSessionSubscription(Z);throw Error(B)}let j=u$(P.payload?.snapshot),R=P.payload?.session,X=(j?.sessionId??R?.sessionId)?.trim();if(W&&!X){if(Z)this.sessionCapabilities.delete(Z),this.sessionClientContributionHandlers.delete(Z),this.disposeSessionSubscription(Z);throw Error("Hub checkpoint restore returned no session id")}if(X&&Z&&X!==Z)this.sessionCapabilities.delete(Z),this.sessionClientContributionHandlers.delete(Z),this.disposeSessionSubscription(Z);if(X&&H)this.sessionCapabilities.set(X,H);if(X&&Q.handlers.size>0)this.sessionClientContributionHandlers.set(X,Q.handlers);if(X)this.ensureSessionSubscription(X);let A=Array.isArray(P.payload?.messages)?P.payload.messages:void 0,V=P.payload?.checkpoint;if(!V)throw Error("Hub checkpoint restore returned no checkpoint");return{sessionId:X,startResult:X?{sessionId:X,manifest:j?Xj(j,J??{}):Rj(X,J??{},R),manifestPath:"",messagesPath:"",result:void 0}:void 0,messages:A,checkpoint:V}}async runTurn(f){return this.ensureSessionSubscription(f.sessionId),(await this.client.command("run.start",{sessionId:f.sessionId,input:f.prompt,attachments:(f.userImages?.length??0)>0||(f.userFiles?.length??0)>0?{...f.userImages?.length?{userImages:f.userImages}:{},...f.userFiles?.length?{userFiles:f.userFiles}:{}}:void 0,delivery:f.delivery,timeoutMs:f.timeoutMs},f.sessionId,{timeoutMs:null})).payload?.result}async requestPendingPromptsList(f){this.ensureSessionSubscription(f.sessionId);let $=await this.client.command("session.pending_prompts",{sessionId:f.sessionId},f.sessionId);return Array.isArray($.payload?.prompts)?$.payload.prompts:[]}async requestPendingPromptUpdate(f){this.ensureSessionSubscription(f.sessionId);let $=await this.client.command("session.update_pending_prompt",{...f},f.sessionId);return{sessionId:f.sessionId,prompts:Array.isArray($.payload?.prompts)?$.payload.prompts:[],prompt:$.payload?.prompt,updated:$.payload?.updated===!0}}async requestPendingPromptDelete(f){this.ensureSessionSubscription(f.sessionId);let $=await this.client.command("session.remove_pending_prompt",{...f},f.sessionId);return{sessionId:f.sessionId,prompts:Array.isArray($.payload?.prompts)?$.payload.prompts:[],prompt:$.payload?.prompt,removed:$.payload?.removed===!0}}async getAccumulatedUsage(f){let $=await this.client.command("session.get",{includeSnapshot:!0},f),W=u$($.payload?.snapshot);if(W?.usage)return{...W.usage};let J=$.payload?.session;return J?.usage?{...J.usage}:void 0}async abort(f,$){await this.client.command("run.abort",{sessionId:f,reason:typeof $==="string"?$:void 0},f)}async stopSession(f){this.sessionCapabilities.delete(f),this.disposeSessionSubscription(f),await this.client.command("session.detach",{sessionId:f},f)}async dispose(){for(let[f,$]of this.sessionSubscriptions){$();try{await this.client.command("session.detach",{sessionId:f},f)}catch{}}this.sessionSubscriptions.clear(),this.sessionCapabilities.clear(),this.agentDoneEmittedForCurrentRunBySession.clear();for(let f of this.activeCapabilityAbortControllers.values())f.abort("Hub runtime host disposed.");this.activeCapabilityAbortControllers.clear(),await this.client.dispose()}async getSession(f){let $=await this.client.command("session.get",void 0,f);return jU($.payload)}async listSessions(f=100){let $=await this.client.command("session.list",{limit:f}),W=Array.isArray($.payload?.snapshots)?$.payload.snapshots.flatMap((H)=>{let Q=u$(H);return Q?[h6(Q)]:[]}):[];if(W.length>0)return W;return($.payload?.sessions??[]).map(Aj)}async listSettings(f){let $=await this.client.command("settings.list",Zj(f));if(!$.ok)throw Error(q5($,"settings.list"));return $.payload?.snapshot}async toggleSetting(f){let $=await this.client.command("settings.toggle",Zj(f));if(!$.ok)throw Error(q5($,"settings.toggle"));return{snapshot:$.payload?.snapshot,changedTypes:Array.isArray($.payload?.changedTypes)?$.payload.changedTypes:[]}}async deleteSession(f){return this.sessionCapabilities.delete(f),this.disposeSessionSubscription(f),(await this.client.command("session.delete",{sessionId:f})).payload?.deleted===!0}async updateSession(f,$){let W={...$.metadata??{}};if(typeof $.prompt==="string")W.prompt=$.prompt;if(typeof $.title==="string")W.title=$.title;return{updated:(await this.client.command("session.update",{sessionId:f,metadata:W})).ok}}async readSessionMessages(f){let $=f.trim();if(!$)return[];let W=await this.client.command("session.messages",{sessionId:$},$);if(!W.ok)throw Error(q5(W,"session.messages"));let J=W.payload?.messages;return Array.isArray(J)?J:[]}async dispatchHookEvent(f){await this.client.command("session.hook",{payload:f})}subscribe(f,$){return this.events.subscribe(f,$)}ensureSessionSubscription(f){let $=f.trim();if(!$||this.sessionSubscriptions.has($))return;let W=this.client.subscribe((J)=>{this.handleHubEvent(J)},{sessionId:$});this.sessionSubscriptions.set($,typeof W==="function"?W:()=>{})}disposeSessionSubscription(f){let $=f.trim();if(!$)return;this.sessionSubscriptions.get($)?.(),this.sessionSubscriptions.delete($),this.agentDoneEmittedForCurrentRunBySession.delete($)}resolveCapabilities(f){return Xf(this.defaultCapabilities,f.capabilities)??{}}emitToolCallContentStart(f){this.events.emit({type:"agent_event",payload:{sessionId:f.sessionId,event:{type:"content_start",contentType:"tool",toolCallId:f.toolCallId,toolName:f.toolName,input:f.toolInput}}})}emitAgentDoneIfNeeded(f){if(this.agentDoneEmittedForCurrentRunBySession.has(f.sessionId))return;this.agentDoneEmittedForCurrentRunBySession.add(f.sessionId),this.events.emit({type:"agent_event",payload:{sessionId:f.sessionId,event:PU(f.payload)}})}handleHubEvent(f){let $=f.sessionId?.trim();if(f.event==="capability.requested"){this.handleCapabilityRequest(f);return}if(f.event==="capability.resolved"){this.handleCapabilityResolved(f);return}if(f.event==="approval.requested"){this.handleApprovalRequested(f);return}if(!$)return;switch(f.event){case"run.started":{this.agentDoneEmittedForCurrentRunBySession.delete($);let W=u$(f.payload?.snapshot),J=f.payload?.session;if(W)this.events.emit({type:"session_snapshot",payload:{sessionId:$,snapshot:W}});this.events.emit({type:"status",payload:{sessionId:$,status:J?.status??"running"}});return}case"iteration.started":{this.events.emit({type:"agent_event",payload:{sessionId:$,event:{type:"iteration_start",iteration:typeof f.payload?.iteration==="number"?f.payload.iteration:0}}});return}case"iteration.finished":{this.events.emit({type:"agent_event",payload:{sessionId:$,event:{type:"iteration_end",iteration:typeof f.payload?.iteration==="number"?f.payload.iteration:0,hadToolCalls:f.payload?.hadToolCalls===!0,toolCallCount:typeof f.payload?.toolCallCount==="number"?f.payload.toolCallCount:0}}});return}case"assistant.delta":{let W=typeof f.payload?.text==="string"?f.payload.text:"";if(!W)return;this.events.emit({type:"agent_event",payload:{sessionId:$,event:{type:"content_start",contentType:"text",text:W}}});return}case"assistant.finished":{this.events.emit({type:"agent_event",payload:{sessionId:$,event:{type:"content_end",contentType:"text",text:typeof f.payload?.text==="string"?f.payload.text:void 0}}});return}case"reasoning.delta":{let W=typeof f.payload?.text==="string"?f.payload.text:"",J=f.payload?.redacted===!0;if(!W&&!J)return;this.events.emit({type:"agent_event",payload:{sessionId:$,event:{type:"content_start",contentType:"reasoning",reasoning:W,redacted:J}}});return}case"reasoning.finished":{this.events.emit({type:"agent_event",payload:{sessionId:$,event:{type:"content_end",contentType:"reasoning",reasoning:typeof f.payload?.reasoning==="string"?f.payload.reasoning:void 0}}});return}case"agent.done":{this.emitAgentDoneIfNeeded({sessionId:$,payload:f.payload});return}case"tool.started":{let W=typeof f.payload?.toolCallId==="string"?f.payload.toolCallId:void 0;if(W&&this.pendingApprovalToolCallIds.delete(W))return;this.emitToolCallContentStart({sessionId:$,toolCallId:W,toolName:typeof f.payload?.toolName==="string"?f.payload.toolName:void 0,toolInput:f.payload?.input});return}case"tool.finished":{let W=typeof f.payload?.toolCallId==="string"?f.payload.toolCallId:void 0;if(W)this.pendingApprovalToolCallIds.delete(W);this.events.emit({type:"agent_event",payload:{sessionId:$,event:{type:"content_end",contentType:"tool",toolCallId:W,toolName:typeof f.payload?.toolName==="string"?f.payload.toolName:void 0,output:f.payload?.output,error:typeof f.payload?.error==="string"?f.payload.error:void 0}}});return}case"session.created":case"session.updated":case"session.attached":case"session.detached":{let W=u$(f.payload?.snapshot),J=f.payload?.session;if(W)this.events.emit({type:"session_snapshot",payload:{sessionId:$,snapshot:W}});this.events.emit({type:"status",payload:{sessionId:$,status:J?.status??"running"}});return}case"session.pending_prompts":{this.events.emit({type:"pending_prompts",payload:{sessionId:$,prompts:Array.isArray(f.payload?.prompts)?f.payload.prompts:[]}});return}case"session.pending_prompt_submitted":{let W=f.payload?.prompt;if(!W)return;this.events.emit({type:"pending_prompt_submitted",payload:{sessionId:$,id:W.id,prompt:W.prompt,delivery:W.delivery,attachmentCount:W.attachmentCount}});return}case"run.completed":case"run.failed":case"run.aborted":{let W=typeof f.payload?.reason==="string"?f.payload.reason:f.event==="run.aborted"?"aborted":f.event==="run.failed"?"error":"completed";this.emitAgentDoneIfNeeded({sessionId:$,payload:{...f.payload,reason:W}}),this.events.emit({type:"ended",payload:{sessionId:$,reason:W,ts:f.timestamp??Date.now()}});return}default:return}}async handleCapabilityRequest(f){let $=f.sessionId?.trim();if(!$)return;let W=typeof f.payload?.targetClientId==="string"?f.payload.targetClientId:void 0;if(W&&W!==this.client.getClientId())return;let J=typeof f.payload?.requestId==="string"?f.payload.requestId:"",H=typeof f.payload?.capabilityName==="string"?f.payload.capabilityName:"";if(!J)return;let Q=this.sessionClientContributionHandlers.get($)?.get(H);if(!Q){await this.client.command("capability.respond",{requestId:J,ok:!1,error:`No client contribution handler registered for capability ${H} in session ${$}.`},$).catch(()=>{});return}let Z=f.payload?.payload&&typeof f.payload.payload==="object"&&!Array.isArray(f.payload.payload)?f.payload.payload:{},P=new AbortController;this.activeCapabilityAbortControllers.set(J,P);let j=(R)=>{this.client.command("capability.progress",{requestId:J,payload:R},$)};try{let R=await Q({payload:Z,abortSignal:P.signal,progress:j});if(P.signal.aborted)return;await this.client.command("capability.respond",{requestId:J,ok:!0,payload:R},$)}catch(R){if(P.signal.aborted)return;await this.client.command("capability.respond",{requestId:J,ok:!1,error:R instanceof Error?R.message:String(R)},$)}finally{this.activeCapabilityAbortControllers.delete(J)}}handleCapabilityResolved(f){if(f.payload?.cancelled!==!0)return;let $=typeof f.payload.requestId==="string"?f.payload.requestId.trim():"";if(!$)return;let W=this.activeCapabilityAbortControllers.get($);if(!W)return;W.abort(JU(f.payload.error))}async handleApprovalRequested(f){let $=f.sessionId?.trim();if(!$)return;let W=this.sessionCapabilities.get($)?.requestToolApproval??this.defaultCapabilities.requestToolApproval;if(!W)return;let J=typeof f.payload?.approvalId==="string"?f.payload.approvalId.trim():"",H=typeof f.payload?.toolCallId==="string"?f.payload.toolCallId:"",Q=typeof f.payload?.toolName==="string"?f.payload.toolName:"";if(!J||!H||!Q)return;let Z=f.payload?.policy&&typeof f.payload.policy==="object"&&!Array.isArray(f.payload.policy)?f.payload.policy:{autoApprove:!1},P=HU(f.payload?.inputJson);this.pendingApprovalToolCallIds.add(H),this.emitToolCallContentStart({sessionId:$,toolCallId:H,toolName:Q,toolInput:P});let j=await Promise.resolve(W({sessionId:$,agentId:typeof f.payload?.agentId==="string"?f.payload.agentId:"",conversationId:typeof f.payload?.conversationId==="string"?f.payload.conversationId:$,iteration:typeof f.payload?.iteration==="number"?f.payload.iteration:0,toolCallId:H,toolName:Q,input:P,policy:Z})).catch((R)=>({approved:!1,reason:R instanceof Error?R.message:`Tool approval request failed: ${String(R)}`}));await this.client.command("approval.respond",{approvalId:J,approved:j.approved,reason:j.reason},$).catch(()=>{})}}var Bj={};z(Bj,{RemoteRuntimeHost:()=>r1});class r1 extends _0{constructor(f){super({url:J$(f.endpoint),authToken:f.authToken,clientType:f.clientType??"core-remote-runtime",displayName:f.displayName??"core remote runtime",capabilities:f.capabilities},{workspaceRoot:f.workspaceRoot,cwd:f.cwd})}}var Tj={};z(Tj,{SqliteSessionStore:()=>W0});import{existsSync as RU,mkdirSync as XU}from"node:fs";import{join as AU}from"node:path";import{asBool as $8,asOptionalString as $0,asString as L0,ensureSessionSchema as VU,loadSqliteDb as BU,nowIso as K6,toBoolInt as W8}from"@clinebot/shared/db";import{resolveDbDataDir as TU}from"@clinebot/shared/storage";class W0{sessionsDirPath;db;constructor(f={}){this.sessionsDirPath=f.sessionsDir??TU()}init(){this.getRawDb()}ensureSessionsDir(){if(!RU(this.sessionsDirPath))XU(this.sessionsDirPath,{recursive:!0});return this.sessionsDirPath}sessionDbPath(){return AU(this.ensureSessionsDir(),"sessions.db")}getRawDb(){if(this.db)return this.db;let f=BU(this.sessionDbPath());return VU(f,{includeLegacyMigrations:!0}),this.db=f,f}close(){this.db?.close?.(),this.db=void 0}run(f,$=[]){return this.getRawDb().prepare(f).run(...$)}queryOne(f,$=[]){return this.getRawDb().prepare(f).get(...$)??void 0}queryAll(f,$=[]){return this.getRawDb().prepare(f).all(...$)}create(f){let $=K6();this.run(`INSERT OR REPLACE INTO sessions (
475
+ session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
476
+ provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
477
+ parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
478
+ metadata_json, transcript_path, hook_path, messages_path, updated_at
479
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[f.sessionId,f.source,f.pid,f.startedAt,f.endedAt??null,f.exitCode??null,f.status,0,W8(f.interactive),f.provider,f.model,f.cwd,f.workspaceRoot,f.teamName??null,W8(f.enableTools),W8(f.enableSpawn),W8(f.enableTeams),f.parentSessionId??null,f.parentAgentId??null,f.agentId??null,f.conversationId??null,W8(f.isSubagent),f.prompt??null,f.metadata?JSON.stringify(f.metadata):null,"",f.hookPath??"",f.messagesPath??null,$])}update(f){let $=[],W=[];if(f.endedAt!==void 0)$.push("ended_at = ?"),W.push(f.endedAt);if(f.exitCode!==void 0)$.push("exit_code = ?"),W.push(f.exitCode);if(f.status!==void 0)$.push("status = ?"),W.push(f.status);if(f.prompt!==void 0)$.push("prompt = ?"),W.push(f.prompt);if(f.metadata!==void 0)$.push("metadata_json = ?"),W.push(f.metadata?JSON.stringify(f.metadata):null);if(f.parentSessionId!==void 0)$.push("parent_session_id = ?"),W.push(f.parentSessionId);if(f.parentAgentId!==void 0)$.push("parent_agent_id = ?"),W.push(f.parentAgentId);if(f.agentId!==void 0)$.push("agent_id = ?"),W.push(f.agentId);if(f.conversationId!==void 0)$.push("conversation_id = ?"),W.push(f.conversationId);if($.length===0)return;$.push("updated_at = ?"),W.push(K6()),W.push(f.sessionId),this.run(`UPDATE sessions SET ${$.join(", ")} WHERE session_id = ?`,W)}updateStatus(f,$,W){this.update({sessionId:f,status:$,endedAt:$==="running"?null:K6(),exitCode:$==="running"?null:W??($==="failed"?1:0)})}get(f){let $=this.queryOne(`SELECT session_id, source, pid, started_at, ended_at, exit_code, status, interactive,
480
+ provider, model, cwd, workspace_root, team_name,
481
+ enable_tools, enable_spawn, enable_teams,
482
+ parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent,
483
+ prompt, metadata_json, hook_path, messages_path, updated_at
484
+ FROM sessions WHERE session_id = ?`,[f]);if(!$)return;return{sessionId:L0($.session_id),source:L0($.source),pid:Number($.pid??0),startedAt:L0($.started_at),endedAt:$.ended_at??null,exitCode:$.exit_code??null,status:L0($.status),interactive:$8($.interactive),provider:L0($.provider),model:L0($.model),cwd:L0($.cwd),workspaceRoot:L0($.workspace_root),teamName:$0($.team_name),enableTools:$8($.enable_tools),enableSpawn:$8($.enable_spawn),enableTeams:$8($.enable_teams),parentSessionId:$0($.parent_session_id),parentAgentId:$0($.parent_agent_id),agentId:$0($.agent_id),conversationId:$0($.conversation_id),isSubagent:$8($.is_subagent),prompt:$0($.prompt),metadata:(()=>{let W=$0($.metadata_json);if(!W)return;try{let J=JSON.parse(W);if(J&&typeof J==="object"&&!Array.isArray(J))return J}catch{}return})(),hookPath:$0($.hook_path),messagesPath:$0($.messages_path),updatedAt:$0($.updated_at)??K6()}}list(f=200){let $=this.queryAll("SELECT session_id FROM sessions ORDER BY started_at DESC LIMIT ?",[f]),W=[];for(let J of $){let H=this.get(L0(J.session_id));if(H)W.push(H)}return W}delete(f,$=!1){let W=this.run("DELETE FROM sessions WHERE session_id = ?",[f]).changes??0;if($)this.run("DELETE FROM sessions WHERE parent_session_id = ?",[f]);return W>0}}U6();import{existsSync as d5,mkdirSync as lU,readFileSync as Lj,renameSync as pU,writeFileSync as iU}from"node:fs";import{join as Oj}from"node:path";import{resolveSessionDataDir as nU}from"@clinebot/shared/storage";import{dirname as dU}from"node:path";import{nanoid as rU}from"nanoid";import{appendFileSync as CU,existsSync as zU,mkdirSync as Yj,readFileSync as NU,writeFileSync as Fj}from"node:fs";import{dirname as yj,join as bU}from"node:path";import{ensureHookLogDir as qU}from"@clinebot/shared/storage";class w5{adapter;messagesArtifactUploader;artifacts;constructor(f,$){this.adapter=f;this.messagesArtifactUploader=$;this.artifacts=new CH(()=>this.ensureSessionsDir())}ensureSessionsDir(){return this.adapter.ensureSessionsDir()}initializeMessagesFile(f,$,W){s7($,W,dJ(f))}writeSessionManifest(f,$){Yj(yj(f),{recursive:!0}),Fj(f,`${JSON.stringify(hf.parse($),null,2)}
485
+ `,"utf8")}readSessionManifest(f){return this.readManifestFile(f).manifest}readManifestFile(f){let $=this.artifacts.sessionManifestPath(f,!1);if(!zU($))return{path:$};try{return{path:$,manifest:hf.parse(JSON.parse(NU($,"utf8")))}}catch{return{path:$}}}async resolveArtifactPath(f,$,W){let H=(await this.adapter.getSession(f))?.[$];return typeof H==="string"&&H.trim().length>0?H:W(f)}async persistSessionMessages(f,$,W){let J=await this.resolveArtifactPath(f,"messagesPath",(Z)=>this.artifacts.sessionMessagesPath(Z)),H=rJ({updatedAt:t(),context:dJ(f),messages:$,systemPrompt:W}),Q=`${JSON.stringify(H,null,2)}
486
+ `;if(Yj(yj(J),{recursive:!0}),Fj(J,Q,"utf8"),!this.messagesArtifactUploader)return;try{let Z=await this.adapter.getSession(f);await this.messagesArtifactUploader.uploadMessagesFile({sessionId:f,path:J,contents:Q,row:Z})}catch(Z){console.warn(`Failed to upload persisted session messages for ${f}`,Z)}}appendStaleSessionHookLog(f,$,W,J,H){let Z=(process.env.CLINE_HOOKS_LOG_PATH?.trim()||void 0)??bU(qU(),"hooks.jsonl");CU(Z,`${JSON.stringify({ts:f,hookName:"session_shutdown",reason:J,sessionId:$,pid:W,source:H})}
487
+ `,"utf8")}}import{appendFileSync as wU}from"node:fs";import{join as EU}from"node:path";import{resolveRootSessionId as hj}from"@clinebot/shared";import{ensureHookLogDir as SU}from"@clinebot/shared/storage";import{z as E5}from"zod";var kU="subagent",mU=E5.looseObject({task:E5.string().optional(),systemPrompt:E5.string().optional()});class M6{adapter;manifestStore;toPersistedMessages;heartbeatLogIntervalMs;teamTaskSessionsByAgent=new Map;teamTaskLastHeartbeatBySession=new Map;teamTaskLastProgressLineBySession=new Map;constructor(f,$,W,J){this.adapter=f;this.manifestStore=$;this.toPersistedMessages=W;this.heartbeatLogIntervalMs=J}teamTaskQueueKey(f,$){return`${f}::${$}`}activeTeamTaskSessionId(f,$){return this.teamTaskSessionsByAgent.get(this.teamTaskQueueKey(f,$))?.at(-1)}buildSubsessionRow(f,$){return{sessionId:$.sessionId,source:kU,pid:process.ppid,startedAt:$.startedAt,endedAt:null,exitCode:null,status:"running",statusLock:0,interactive:!1,provider:f.provider,model:f.model,cwd:f.cwd,workspaceRoot:f.workspaceRoot,teamName:f.teamName??null,enableTools:f.enableTools,enableSpawn:f.enableSpawn,enableTeams:f.enableTeams,parentSessionId:$.parentSessionId,parentAgentId:$.parentAgentId,agentId:$.agentId,conversationId:$.conversationId??null,isSubagent:!0,prompt:$.prompt,metadata:r2({prompt:$.prompt}),hookPath:"",messagesPath:$.messagesPath,updatedAt:$.startedAt}}async queueSpawnRequest(f){if(f.hookName!=="tool_call"||f.parent_agent_id!==null)return;if(f.tool_call?.name!=="spawn_agent")return;let $=hj(f.sessionContext);if(!$)return;let W=mU.safeParse(f.tool_call.input);await this.adapter.enqueueSpawnRequest({rootSessionId:$,parentAgentId:f.agent_id,task:W.success?W.data.task:void 0,systemPrompt:W.success?W.data.systemPrompt:void 0})}async upsertSubagentSession(f){let $=f.rootSessionId;if(!$)return;let W=await this.adapter.getSession($);if(!W)return;let J=B1($,f.agentId),H=await this.adapter.getSession(J),Q=t(),Z=this.manifestStore.artifacts.subagentArtifactPaths(J,f.agentId,this.activeTeamTaskSessionId($,f.parentAgentId)),P=f.prompt??H?.prompt??void 0;if(!P)P=await this.adapter.claimSpawnRequest($,f.parentAgentId)??`Subagent run by ${f.parentAgentId}`;if(!H)return await this.adapter.upsertSession(this.buildSubsessionRow(W,{sessionId:J,parentSessionId:$,parentAgentId:f.parentAgentId,agentId:f.agentId,conversationId:f.conversationId,prompt:P,startedAt:Q,...Z})),this.manifestStore.initializeMessagesFile(J,Z.messagesPath,Q),J;return await this.adapter.updateSession({sessionId:J,setRunning:!0,parentSessionId:$,parentAgentId:f.parentAgentId,agentId:f.agentId,conversationId:f.conversationId,prompt:H.prompt??P??null,metadata:r2({metadata:H.metadata??void 0,prompt:H.prompt??P??null}),expectedStatusLock:H.statusLock}),J}async upsertSubagentSessionFromHook(f){if(!f.parent_agent_id)return;let $=hj(f.sessionContext);if(!$)return;if(f.hookName==="session_shutdown"){let W=B1($,f.agent_id);return await this.adapter.getSession(W)?W:void 0}return await this.upsertSubagentSession({agentId:f.agent_id,parentAgentId:f.parent_agent_id,conversationId:f.taskId,rootSessionId:$})}async applySubagentStatus(f,$){await this.applySubagentStatusBySessionId(f,u2($))}async applySubagentStatusBySessionId(f,$){let W=await this.adapter.getSession(f);if(!W)return;let J=$==="running"?null:t(),H=$==="running"?null:$==="failed"?1:0;await this.adapter.updateSession({sessionId:f,status:$,endedAt:J,exitCode:H,expectedStatusLock:W.statusLock})}async applyStatusToRunningChildSessions(f,$){if(!f)return;let W=await this.adapter.listSessions({limit:2000,parentSessionId:f,status:"running"});for(let J of W)await this.applySubagentStatusBySessionId(J.sessionId,$)}async onTeamTaskStart(f,$,W){let J=await this.adapter.getSession(f);if(!J)return;let H=I2(f,$),Q=t(),{messagesPath:Z}=this.manifestStore.artifacts.subagentArtifactPaths(H,$);await this.adapter.upsertSession(this.buildSubsessionRow(J,{sessionId:H,parentSessionId:f,parentAgentId:"lead",agentId:$,prompt:W||`Team task for ${$}`,startedAt:Q,messagesPath:Z})),this.manifestStore.initializeMessagesFile(H,Z,Q);let P=this.teamTaskQueueKey(f,$),j=this.teamTaskSessionsByAgent.get(P)??[];j.push(H),this.teamTaskSessionsByAgent.set(P,j)}async onTeamTaskEnd(f,$,W,J,H,Q){let Z=this.teamTaskQueueKey(f,$),P=this.teamTaskSessionsByAgent.get(Z);if(!P||P.length===0)return;let j=P.shift();if(P.length===0)this.teamTaskSessionsByAgent.delete(Z);if(!j)return;let R=H?.messages??Q,X=this.toPersistedMessages(R,H,Q);if(X)await this.manifestStore.persistSessionMessages(j,X);await this.applySubagentStatusBySessionId(j,W),this.teamTaskLastHeartbeatBySession.delete(j),this.teamTaskLastProgressLineBySession.delete(j)}async onTeamTaskProgress(f,$,W,J){let H=this.teamTaskQueueKey(f,$),Q=this.teamTaskSessionsByAgent.get(H)?.[0];if(!Q)return;let Z=W.trim();if(!Z)return;let P=J?.kind??"progress";if(P==="heartbeat"){let R=Date.now(),X=this.teamTaskLastHeartbeatBySession.get(Q)??0;if(R-X<this.heartbeatLogIntervalMs)return;this.teamTaskLastHeartbeatBySession.set(Q,R)}let j=P==="heartbeat"?"[progress] heartbeat":P==="text"?`[progress] text: ${Z}`:`[progress] ${Z}`;if(this.teamTaskLastProgressLineBySession.get(Q)===j)return;this.teamTaskLastProgressLineBySession.set(Q,j)}async handleSubAgentStart(f,$){let W=await this.upsertSubagentSession({agentId:$.subAgentId,parentAgentId:$.parentAgentId,conversationId:$.conversationId,prompt:$.input.task,rootSessionId:f});if(!W)return;await this.applySubagentStatusBySessionId(W,"running")}async handleSubAgentEnd(f,$){let W=await this.upsertSubagentSession({agentId:$.subAgentId,parentAgentId:$.parentAgentId,conversationId:$.conversationId,prompt:$.input.task,rootSessionId:f});if(!W)return;if($.error){await this.applySubagentStatusBySessionId(W,"failed");return}let J=$.result?.finishReason??"completed";await this.applySubagentStatusBySessionId(W,J==="aborted"?"cancelled":"completed")}appendSubagentHookAudit(f){let W=(process.env.CLINE_HOOKS_LOG_PATH?.trim()||void 0)??EU(SU(),"hooks.jsonl");wU(W,`${JSON.stringify({ts:t(),...f})}
488
+ `,"utf8")}}import{formatUserInputBlock as cU}from"@clinebot/shared";var _j={};z(_j,{toTeamProgressLifecycleEvent:()=>p1,sanitizeTeamName:()=>E8,reviveTeamStateDates:()=>w8,createWorkerReviewerTeam:()=>Dj,createSpawnAgentTool:()=>g0,createDelegatedAgentConfigProvider:()=>R1,createDelegatedAgent:()=>X1,createAgentTeamsTools:()=>y$,createAgentTeam:()=>k5,buildTeamProgressSummary:()=>l1,buildDelegatedAgentConfig:()=>Y$,bootstrapAgentTeams:()=>V1,AgentTeamsRuntime:()=>d$,AgentTeam:()=>n1});function J0(){return new Date().toISOString()}function Kj(f,$){if($<=0)return 0;return Math.round(f/$*100)}function gU(f,$){let W=new Set;for(let H of $)if(H.status==="reviewed")W.add(`${H.outcomeId}:${H.section}`);let J=new Set;for(let H of f){if(H.status==="finalized")continue;for(let Q of H.requiredSections)if(!W.has(`${H.id}:${Q}`))J.add(`${H.id}:${Q}`)}return[...J].sort((H,Q)=>H.localeCompare(Q))}function l1(f,$){let W={idle:0,running:0,stopped:0},J={pending:0,in_progress:0,blocked:0,completed:0},H={queued:0,running:0,completed:0,failed:0,cancelled:0,interrupted:0},Q={draft:0,in_review:0,finalized:0},Z={draft:0,reviewed:0,rejected:0},P=0,j=0;for(let F of $.members)if(W[F.status]+=1,F.role==="lead")P+=1;else j+=1;let R=[],X=[],A=$.tasks.filter((F)=>F.status==="completed").length,V=new Map($.tasks.map((F)=>[F.id,F]));for(let F of $.tasks){if(J[F.status]+=1,F.status==="blocked"){R.push(F.id);continue}if(F.status!=="pending")continue;if(F.dependsOn.every((y)=>{return V.get(y)?.status==="completed"}))X.push(F.id)}let B=[],T,h=0;for(let F of $.runs){if(H[F.status]+=1,F.status==="queued"||F.status==="running")B.push(F.id);let Y=F.startedAt.getTime();if(Y>=h)h=Y,T=F.id}for(let F of $.outcomes)Q[F.status]+=1;for(let F of $.outcomeFragments)Z[F.status]+=1;return{teamName:f,updatedAt:J0(),members:{total:$.members.length,byStatus:W,leadCount:P,teammateCount:j},tasks:{total:$.tasks.length,byStatus:J,blockedTaskIds:R,readyTaskIds:X,completionPct:Kj(A,$.tasks.length)},runs:{total:$.runs.length,byStatus:H,activeRunIds:B,latestRunId:T},outcomes:{total:$.outcomes.length,byStatus:Q,finalizedPct:Kj(Q.finalized,$.outcomes.length),missingRequiredSections:gU($.outcomes,$.outcomeFragments)},fragments:{total:$.outcomeFragments.length,byStatus:Z}}}function p1(f){let{event:$}=f;switch($.type){case"team_task_updated":return{teamName:f.teamName,sessionId:f.sessionId,eventType:$.type,ts:J0(),taskId:$.task.id,agentId:$.task.assignee??$.task.createdBy};case"run_queued":case"run_started":case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":return{teamName:f.teamName,sessionId:f.sessionId,eventType:$.type,ts:J0(),runId:$.run.id,taskId:$.run.taskId,agentId:$.run.agentId,message:$.run.error};case"run_progress":return{teamName:f.teamName,sessionId:f.sessionId,eventType:$.type,ts:J0(),runId:$.run.id,taskId:$.run.taskId,agentId:$.run.agentId,message:$.message};case"outcome_created":case"outcome_finalized":return{teamName:f.teamName,sessionId:f.sessionId,eventType:$.type,ts:J0(),outcomeId:$.outcome.id};case"outcome_fragment_attached":case"outcome_fragment_reviewed":return{teamName:f.teamName,sessionId:f.sessionId,eventType:$.type,ts:J0(),outcomeId:$.fragment.outcomeId,fragmentId:$.fragment.id,agentId:$.fragment.sourceAgentId};case"team_message":return{teamName:f.teamName,sessionId:f.sessionId,eventType:$.type,ts:J0(),taskId:$.message.taskId,agentId:$.message.fromAgentId,message:$.message.subject};case"team_mission_log":return{teamName:f.teamName,sessionId:f.sessionId,eventType:$.type,ts:J0(),taskId:$.entry.taskId,agentId:$.entry.agentId,message:$.entry.summary};case"teammate_spawned":case"teammate_shutdown":case"task_start":case"task_end":case"agent_event":return{teamName:f.teamName,sessionId:f.sessionId,eventType:$.type,ts:J0(),agentId:$.agentId}}return{teamName:f.teamName,sessionId:f.sessionId,eventType:$.type,ts:J0()}}import{sanitizeFileName as xU,TeamMessageType as q}from"@clinebot/shared";import{nanoid as IU}from"nanoid";import{TeamMessageType as kE}from"@clinebot/shared";function S5(f){if(typeof DOMException<"u"&&f instanceof DOMException&&f.name==="AbortError")return!0;if(!(f instanceof Error))return!1;return f.name==="AbortError"||f.message.toLowerCase().includes("aborted")}function Uj(f,$){return f?.status==="stopped"&&S5($)}var vU=600000,Mj="recovered_queued";function uU(f){return`This is an automatic recovery of interrupted team run ${f.id}. The previous process stopped before completion. Continue the task safely, inspect the current workspace state before making changes, and avoid duplicating completed work.
489
+
490
+ ${f.message}`}class n1{agents=new Map;configs=new Map;onTeamEvent;constructor(f,$){if(this.onTeamEvent=$,f)for(let[W,J]of Object.entries(f))this.addAgent(W,J)}addAgent(f,$){if(this.agents.has(f))throw Error(`Agent with id "${f}" already exists in the team`);let W={...$,onEvent:(H)=>{$.onEvent?.(H),this.emitEvent({type:q.AgentEvent,agentId:f,event:H})}},J=new m0(W);if(W.onEvent)J.subscribeEvents(W.onEvent);this.agents.set(f,J),this.configs.set(f,$)}removeAgent(f){return this.configs.delete(f),this.agents.delete(f)}getAgent(f){return this.agents.get(f)}getAgentIds(){return Array.from(this.agents.keys())}get size(){return this.agents.size}async routeTo(f,$){let W=this.agents.get(f);if(!W)throw Error(`Agent "${f}" not found in team`);this.emitEvent({type:q.TaskStart,agentId:f,message:$});try{let J=await W.run($);return this.emitEvent({type:q.TaskEnd,agentId:f,result:J}),J}catch(J){let H=J instanceof Error?J:Error(String(J));throw this.emitEvent({type:q.TaskEnd,agentId:f,error:H,messages:W.getMessages()}),J}}async continueTo(f,$){let W=this.agents.get(f);if(!W)throw Error(`Agent "${f}" not found in team`);this.emitEvent({type:q.TaskStart,agentId:f,message:$});try{let J=await W.continue($);return this.emitEvent({type:q.TaskEnd,agentId:f,result:J}),J}catch(J){let H=J instanceof Error?J:Error(String(J));throw this.emitEvent({type:q.TaskEnd,agentId:f,error:H,messages:W.getMessages()}),J}}async runParallel(f){let $=f.map(async(W)=>{let J=this.agents.get(W.agentId);if(!J)return{agentId:W.agentId,result:void 0,error:Error(`Agent "${W.agentId}" not found in team`),metadata:W.metadata};this.emitEvent({type:q.TaskStart,agentId:W.agentId,message:W.message});try{let H=await J.run(W.message);return this.emitEvent({type:q.TaskEnd,agentId:W.agentId,result:H}),{agentId:W.agentId,result:H,metadata:W.metadata}}catch(H){let Q=H instanceof Error?H:Error(String(H));return this.emitEvent({type:q.TaskEnd,agentId:W.agentId,error:Q,messages:J.getMessages()}),{agentId:W.agentId,result:void 0,error:Q,metadata:W.metadata}}});return Promise.all($)}async runSequential(f){let $=[];for(let W of f){let J=this.agents.get(W.agentId);if(!J){$.push({agentId:W.agentId,result:void 0,error:Error(`Agent "${W.agentId}" not found in team`),metadata:W.metadata});continue}this.emitEvent({type:q.TaskStart,agentId:W.agentId,message:W.message});try{let H=await J.run(W.message);this.emitEvent({type:q.TaskEnd,agentId:W.agentId,result:H}),$.push({agentId:W.agentId,result:H,metadata:W.metadata})}catch(H){let Q=H instanceof Error?H:Error(String(H));this.emitEvent({type:q.TaskEnd,agentId:W.agentId,error:Q,messages:J.getMessages()}),$.push({agentId:W.agentId,result:void 0,error:Q,metadata:W.metadata})}}return $}async runPipeline(f,$,W){let J=[],H=$;for(let Q of f){let Z=this.agents.get(Q);if(!Z){J.push({agentId:Q,result:void 0,error:Error(`Agent "${Q}" not found in team`)});break}this.emitEvent({type:q.TaskStart,agentId:Q,message:H});try{let P=await Z.run(H);this.emitEvent({type:q.TaskEnd,agentId:Q,result:P}),J.push({agentId:Q,result:P});let j=f.indexOf(Q)+1;if(j<f.length){let R=f[j];H=W?W(P,R):`Previous agent output:
491
+ ${P.text}
492
+
493
+ Please continue from here.`}}catch(P){let j=P instanceof Error?P:Error(String(P));this.emitEvent({type:q.TaskEnd,agentId:Q,error:j,messages:Z.getMessages()}),J.push({agentId:Q,result:void 0,error:j});break}}return J}abortAll(){for(let f of this.agents.values())f.abort(Error("Agent team abortAll requested"))}clear(){this.abortAll(),this.agents.clear(),this.configs.clear()}emitEvent(f){try{this.onTeamEvent?.(f)}catch{}}}function k5(f,$){return new n1(f,$)}function Dj(f){let $=k5({worker:f.worker,reviewer:f.reviewer}),W=$;return W.doAndReview=async(J)=>{let H=await $.routeTo("worker",J),Q=await $.routeTo("reviewer",`Please review this work:
494
+
495
+ ${H.text}`);return{workerResult:H,reviewResult:Q}},W}class d${teamId;teamName;onTeamEvent;members=new Map;tasks=new Map;missionLog=[];mailbox=[];missionStepCounter=0;taskCounter=0;messageCounter=0;missionCounter=0;runCounter=0;outcomeCounter=0;outcomeFragmentCounter=0;runs=new Map;runQueue=[];queuedRunDispatchTimer;outcomes=new Map;outcomeFragments=new Map;missionLogIntervalSteps;missionLogIntervalMs;maxConcurrentRuns;constructor(f){this.teamName=f.teamName,this.teamId=`t_${xU(IU(10))}`,this.onTeamEvent=f.onTeamEvent,this.missionLogIntervalSteps=Math.max(1,f.missionLogIntervalSteps??3),this.missionLogIntervalMs=Math.max(1000,f.missionLogIntervalMs??120000),this.maxConcurrentRuns=Math.max(1,f.maxConcurrentRuns??2);let $=f.leadAgentId??"lead";this.members.set($,{agentId:$,role:"lead",status:"idle",runningCount:0,lastMissionStep:0,lastMissionAt:Date.now()})}getTeamId(){return this.teamId}getTeamName(){return this.teamName}getMemberRole(f){return this.members.get(f)?.role}getMemberIds(){return Array.from(this.members.keys())}getTeammateIds(){return Array.from(this.members.values()).filter((f)=>f.role==="teammate").map((f)=>f.agentId)}getTask(f){return this.tasks.get(f)}listTasks(){return Array.from(this.tasks.values())}listTaskItems(f){return Array.from(this.tasks.values()).map(($)=>{let W=this.getUnresolvedDependencies($);return{...$,blockedBy:W,isReady:$.status==="pending"&&!$.assignee&&W.length===0}}).filter(($)=>{if(f?.status&&$.status!==f.status)return!1;if(f?.assignee&&$.assignee!==f.assignee)return!1;return!0})}listMissionLog(f){if(!f||f<=0)return[...this.missionLog];return this.missionLog.slice(Math.max(0,this.missionLog.length-f))}listMailbox(f,$){let W=$?.unreadOnly??!0,J=$?.markRead??!0,H=$?.limit,Q=this.mailbox.filter((P)=>P.toAgentId===f&&(!W||!P.readAt)),Z=typeof H==="number"&&H>0?Q.slice(Math.max(0,Q.length-H)):Q;if(J){let P=new Date;for(let j of Z)if(!j.readAt)j.readAt=P}return Z.map((P)=>({...P}))}getSnapshot(){let f={pending:0,in_progress:0,blocked:0,completed:0};for(let W of this.tasks.values())f[W.status]++;let $={draft:0,in_review:0,finalized:0};for(let W of this.outcomes.values())$[W.status]++;return{teamId:this.teamId,teamName:this.teamName,members:Array.from(this.members.values()).map((W)=>({agentId:W.agentId,role:W.role,description:W.description,status:W.status})),taskCounts:f,unreadMessages:this.mailbox.filter((W)=>!W.readAt).length,missionLogEntries:this.missionLog.length,activeRuns:Array.from(this.runs.values()).filter((W)=>W.status==="running").length,queuedRuns:Array.from(this.runs.values()).filter((W)=>W.status==="queued").length,outcomeCounts:$}}exportState(){return{teamId:this.teamId,teamName:this.teamName,members:Array.from(this.members.values()).map((f)=>({agentId:f.agentId,role:f.role,description:f.description,status:f.status})),tasks:Array.from(this.tasks.values()).map((f)=>({...f})),mailbox:this.mailbox.map((f)=>({...f})),missionLog:this.missionLog.map((f)=>({...f})),runs:Array.from(this.runs.values()).map((f)=>({...f})),outcomes:Array.from(this.outcomes.values()).map((f)=>({...f})),outcomeFragments:Array.from(this.outcomeFragments.values()).map((f)=>({...f}))}}hydrateState(f){this.clearQueuedRunDispatchTimer(),this.tasks.clear();for(let W of f.tasks)this.tasks.set(W.id,{...W});this.mailbox.length=0,this.mailbox.push(...f.mailbox.map((W)=>({...W}))),this.missionLog.length=0,this.missionLog.push(...f.missionLog.map((W)=>({...W}))),this.runs.clear();for(let W of f.runs??[])this.runs.set(W.id,{...W});this.runQueue.length=0,this.runQueue.push(...Array.from(this.runs.values()).filter((W)=>W.status==="queued").map((W)=>W.id)),this.outcomes.clear();for(let W of f.outcomes??[])this.outcomes.set(W.id,{...W});this.outcomeFragments.clear();for(let W of f.outcomeFragments??[])this.outcomeFragments.set(W.id,{...W});let $=Array.from(this.members.values()).filter((W)=>W.role==="lead");this.members.clear();for(let W of $)this.members.set(W.agentId,{...W,status:"idle",runningCount:0,lastMissionStep:this.missionStepCounter,lastMissionAt:Date.now()});for(let W of f.members){if(W.role!=="teammate")continue;this.members.set(W.agentId,{agentId:W.agentId,role:"teammate",description:W.description,status:"stopped",agent:void 0,runningCount:0,lastMissionStep:this.missionStepCounter,lastMissionAt:Date.now()})}this.taskCounter=Math.max(this.taskCounter,i1(f.tasks.map((W)=>W.id),"task_")),this.messageCounter=Math.max(this.messageCounter,i1(f.mailbox.map((W)=>W.id),"msg_")),this.missionCounter=Math.max(this.missionCounter,i1(f.missionLog.map((W)=>W.id),"log_")),this.runCounter=Math.max(this.runCounter,i1((f.runs??[]).map((W)=>W.id),"run_")),this.outcomeCounter=Math.max(this.outcomeCounter,i1((f.outcomes??[]).map((W)=>W.id),"out_")),this.outcomeFragmentCounter=Math.max(this.outcomeFragmentCounter,i1((f.outcomeFragments??[]).map((W)=>W.id),"frag_"))}isTeammateActive(f){let $=this.members.get(f);return!!$&&$.role==="teammate"&&!!$.agent}spawnTeammate({agentId:f,config:$}){let W=this.members.get(f);if(W&&W.role!=="teammate")throw Error(`Team member "${f}" already exists and is not a teammate`);if(W&&W.runningCount>0)throw Error(`Teammate "${f}" is currently running and cannot be respawned`);let J={...$,apiTimeoutMs:vU,consumePendingUserMessage:()=>{let Z=this.members.get(f);if(!Z||!Z.pendingSteerMessage)return;let P=Z.pendingSteerMessage;return Z.pendingSteerMessage=void 0,P},onEvent:(Z)=>{$.onEvent?.(Z),this.emitEvent({type:q.AgentEvent,agentId:f,event:Z}),this.trackMeaningfulEvent(f,Z)}},H=new m0(J);if(J.onEvent)H.subscribeEvents(J.onEvent);let Q={agentId:f,role:"teammate",description:$.role,status:"idle",agent:H,runningCount:0,lastMissionStep:0,lastMissionAt:Date.now()};return this.members.set(f,Q),this.emitEvent({type:q.TeammateSpawned,agentId:f,role:$.role,teammate:{rolePrompt:$.systemPrompt,modelId:$.modelId,maxIterations:$.maxIterations,runtimeAgentId:H.getAgentId(),conversationId:H.getConversationId(),parentAgentId:null}}),{agentId:Q.agentId,role:Q.role,description:Q.description,status:Q.status}}shutdownTeammate(f,$){let W=this.members.get(f);if(!W||W.role!=="teammate")throw Error(`Teammate "${f}" was not found`);try{W.agent?.abort()}catch(J){if(!S5(J))throw J}W.status="stopped",this.emitEvent({type:q.TeammateShutdown,agentId:f,reason:$})}updateTeammateConnections(f){for(let $ of this.members.values()){if($.role!=="teammate"||!$.agent)continue;$.agent.updateConnection(f)}}createTask(f){let $=`task_${String(++this.taskCounter).padStart(4,"0")}`,W=new Date,J={id:$,title:f.title,description:f.description,status:f.assignee?"in_progress":"pending",createdAt:W,updatedAt:W,createdBy:f.createdBy,assignee:f.assignee,dependsOn:f.dependsOn??[]};return this.tasks.set($,J),this.emitEvent({type:q.TeamTaskUpdated,task:{...J}}),{...J}}claimTask(f,$){let W=this.requireTask(f);return this.assertDependenciesResolved(W),W.status="in_progress",W.assignee=$,W.updatedAt=new Date,this.emitEvent({type:q.TeamTaskUpdated,task:{...W}}),this.appendMissionLog({agentId:$,taskId:f,kind:"progress",summary:`Claimed task "${W.title}"`}),{...W}}blockTask(f,$,W){let J=this.requireTask(f);return J.status="blocked",J.updatedAt=new Date,J.summary=W,this.emitEvent({type:q.TeamTaskUpdated,task:{...J}}),this.appendMissionLog({agentId:$,taskId:f,kind:"blocked",summary:W}),{...J}}completeTask(f,$,W){let J=this.requireTask(f);if(J.status="completed",J.updatedAt=new Date,J.summary=W,!J.assignee)J.assignee=$;return this.emitEvent({type:q.TeamTaskUpdated,task:{...J}}),this.appendMissionLog({agentId:$,taskId:f,kind:"done",summary:W}),{...J}}async routeToTeammate(f,$,W){let J=this.members.get(f);if(!J||J.role!=="teammate"||!J.agent)throw Error(`Teammate "${f}" was not found`);if(!J.agent.canStartRun())throw Error("Cannot start a new run while another run is already in progress");J.runningCount++,J.status="running",this.emitEvent({type:q.TaskStart,agentId:f,message:$});try{let H=this.listMailbox(f,{unreadOnly:!0,markRead:!0}),Q=H.length>0?`${this.buildMailboxNotification(H)}
496
+
497
+ ${$}`:$,Z=W?.continueConversation?await J.agent.continue(Q):await J.agent.run(Q);return this.emitEvent({type:q.TaskEnd,agentId:f,result:Z}),this.recordProgressStep(f,`Completed a delegated run (${Z.iterations} iterations)`,W?.taskId,!0),Z}catch(H){let Q=H instanceof Error?H:Error(String(H));if(this.emitEvent({type:q.TaskEnd,agentId:f,error:Q,messages:J.agent.getMessages()}),!Uj(J,Q))this.appendMissionLog({agentId:f,taskId:W?.taskId,kind:"error",summary:Q.message});throw Q}finally{if(J.runningCount--,J.runningCount<=0&&this.members.get(f)?.status!=="stopped")J.status="idle"}}startTeammateRun(f,$,W){let J=`run_${String(++this.runCounter).padStart(5,"0")}`,H={id:J,agentId:f,taskId:W?.taskId,status:"queued",message:$,priority:W?.priority??0,retryCount:0,maxRetries:Math.max(0,W?.maxRetries??0),continueConversation:W?.continueConversation,startedAt:new Date(0),leaseOwner:W?.leaseOwner,heartbeatAt:void 0,lastProgressAt:new Date,lastProgressMessage:"queued",currentActivity:"queued"};return this.runs.set(J,H),this.runQueue.push(J),this.emitEvent({type:q.RunQueued,run:{...H}}),this.dispatchQueuedRuns(),{...H}}dispatchQueuedRuns(){this.clearQueuedRunDispatchTimer();let f;while(this.countActiveRuns()<this.maxConcurrentRuns&&this.runQueue.length>0){let $=this.selectNextDispatchableQueuedRun();f=$.nextDelayedAttemptAt;let W=$.index;if(W<0){this.scheduleQueuedRunDispatch(f);return}let[J]=this.runQueue.splice(W,1),H=J?this.runs.get(J):void 0;if(!H||H.status!=="queued")continue;this.executeQueuedRun(H)}this.scheduleQueuedRunDispatch(f)}selectNextDispatchableQueuedRun(){let f=-1,$=Number.NEGATIVE_INFINITY,W,J=Date.now();for(let H=0;H<this.runQueue.length;H++){let Q=this.runs.get(this.runQueue[H]);if(!Q||Q.status!=="queued")continue;if(Q.nextAttemptAt&&Q.nextAttemptAt.getTime()>J){if(!W||Q.nextAttemptAt<W)W=Q.nextAttemptAt;continue}if(Q.priority>$)$=Q.priority,f=H}return{index:f,nextDelayedAttemptAt:W}}scheduleQueuedRunDispatch(f){if(!f)return;let $=Math.max(0,f.getTime()-Date.now());this.queuedRunDispatchTimer=setTimeout(()=>{this.queuedRunDispatchTimer=void 0,this.dispatchQueuedRuns()},$)}clearQueuedRunDispatchTimer(){if(!this.queuedRunDispatchTimer)return;clearTimeout(this.queuedRunDispatchTimer),this.queuedRunDispatchTimer=void 0}countActiveRuns(){let f=0;for(let $ of this.runs.values())if($.status==="running")f++;return f}async executeQueuedRun(f){let $=f.currentActivity===Mj;f.nextAttemptAt=void 0,f.status="running",f.startedAt=new Date,f.heartbeatAt=new Date,f.currentActivity="run_started",this.emitEvent({type:q.RunStarted,run:{...f}});let W=setInterval(()=>{if(f.status!=="running")return;this.recordRunProgress(f,"heartbeat")},2000);try{let J=$?uU(f):f.message,H=await this.routeToTeammate(f.agentId,J,{taskId:f.taskId,continueConversation:f.continueConversation});f.status="completed",f.result=H,f.endedAt=new Date,f.currentActivity="completed",this.emitEvent({type:q.RunCompleted,run:{...f}})}catch(J){let H=J instanceof Error?J.message:String(J??"Unknown error");f.error=H,f.endedAt=new Date;let Q=this.members.get(f.agentId);if(Uj(Q,J))f.status="cancelled",f.currentActivity="cancelled",this.emitEvent({type:q.RunCancelled,run:{...f},reason:H});else if(f.retryCount<f.maxRetries)f.retryCount++,f.status="queued",f.nextAttemptAt=new Date(Date.now()+Math.min(30000,1000*2**f.retryCount)),this.runQueue.push(f.id),this.recordRunProgress(f,`retry_scheduled_${f.retryCount}`);else f.status="failed",f.currentActivity="failed",this.emitEvent({type:q.RunFailed,run:{...f}})}finally{clearInterval(W),this.dispatchQueuedRuns()}}listRuns(f){let $=f?.includeCompleted??!0;return Array.from(this.runs.values()).filter((W)=>{if(!$&&!["running","queued"].includes(W.status))return!1;if(f?.status&&W.status!==f.status)return!1;if(f?.agentId&&W.agentId!==f.agentId)return!1;return!0}).map((W)=>({...W}))}getRun(f){let $=this.runs.get(f);return $?{...$}:void 0}async awaitRun(f,$=250){let W=this.runs.get(f);if(!W)throw Error(`Run "${f}" was not found`);while(W.status==="queued"||W.status==="running")await Gj($);return{...W}}async awaitAllRuns(f=250){while(Array.from(this.runs.values()).some(($)=>["queued","running"].includes($.status)))await Gj(f);return this.listRuns()}cancelRun(f,$){let W=this.runs.get(f);if(!W)throw Error(`Run "${f}" was not found`);if(W.status==="completed"||W.status==="failed")return{...W};W.status="cancelled",W.error=$,W.endedAt=new Date,W.currentActivity="cancelled";let J=this.runQueue.indexOf(f);if(J>=0)this.runQueue.splice(J,1);return this.emitEvent({type:q.RunCancelled,run:{...W},reason:$}),{...W}}recoverActiveRuns(f="runtime_recovered"){let $=[];for(let W of this.runs.values()){if(!["queued","running"].includes(W.status))continue;let J=this.members.get(W.agentId);if(!J||J.role!=="teammate"||!J.agent){W.status="interrupted",W.error="teammate_unavailable_after_recovery",W.endedAt=new Date,W.currentActivity="interrupted",this.emitEvent({type:q.RunInterrupted,run:{...W},reason:W.error});continue}let H=new Date;if(W.status="queued",W.error=void 0,W.endedAt=void 0,W.heartbeatAt=H,W.lastProgressAt=H,W.lastProgressMessage=f,W.currentActivity=Mj,!this.runQueue.includes(W.id))this.runQueue.push(W.id);$.push({...W}),this.emitEvent({type:q.RunQueued,run:{...W}})}return this.dispatchQueuedRuns(),$}markStaleRunsInterrupted(f="runtime_recovered"){let $=[];for(let W of this.runs.values()){if(!["queued","running"].includes(W.status))continue;W.status="interrupted",W.error=f,W.endedAt=new Date,W.currentActivity="interrupted",$.push({...W}),this.emitEvent({type:q.RunInterrupted,run:{...W},reason:f})}return this.runQueue.length=0,this.clearQueuedRunDispatchTimer(),$}sendMessage(f,$,W,J,H){if(!this.members.has(f))throw Error(`Unknown sender "${f}"`);let Q=this.members.get($);if(!Q)throw Error(`Unknown recipient "${$}"`);let Z={id:`msg_${String(++this.messageCounter).padStart(5,"0")}`,teamId:this.teamId,fromAgentId:f,toAgentId:$,subject:W,body:J,taskId:H,sentAt:new Date};if(this.mailbox.push(Z),this.emitEvent({type:q.TeamMessage,message:{...Z}}),Q.role==="teammate"&&Q.runningCount>0&&Q.agent)Q.pendingSteerMessage=`[MAILBOX] You got a message from ${f}. Subject: "${W}". Use the team_read_mailbox tool to read it at your convenience.`;return{...Z}}broadcast(f,$,W,J){let H=[];for(let Q of this.members.values()){if(Q.agentId===f)continue;if(Q.role==="lead")continue;H.push(this.sendMessage(f,Q.agentId,$,W,J?.taskId))}return H}appendMissionLog(f){if(!this.members.has(f.agentId))throw Error(`Unknown team member "${f.agentId}"`);let $={id:`log_${String(++this.missionCounter).padStart(6,"0")}`,ts:new Date,teamId:this.teamId,agentId:f.agentId,taskId:f.taskId,kind:f.kind,summary:f.summary,evidence:f.evidence,nextAction:f.nextAction};this.missionLog.push($);let W=this.members.get(f.agentId);if(W)W.lastMissionAt=Date.now(),W.lastMissionStep=this.missionStepCounter;return this.emitEvent({type:q.TeamMissionLog,entry:{...$}}),{...$}}createOutcome(f){let $={id:`out_${String(++this.outcomeCounter).padStart(4,"0")}`,teamId:this.teamId,title:f.title,status:"draft",requiredSections:[...new Set(f.requiredSections)],createdBy:f.createdBy,createdAt:new Date};return this.outcomes.set($.id,$),this.emitEvent({type:q.OutcomeCreated,outcome:{...$}}),{...$}}listOutcomes(){return Array.from(this.outcomes.values()).map((f)=>({...f}))}attachOutcomeFragment(f){let $=this.outcomes.get(f.outcomeId);if(!$)throw Error(`Outcome "${f.outcomeId}" was not found`);if(!$.requiredSections.includes(f.section))throw Error(`Section "${f.section}" is not part of outcome "${f.outcomeId}"`);let W={id:`frag_${String(++this.outcomeFragmentCounter).padStart(5,"0")}`,teamId:this.teamId,outcomeId:f.outcomeId,section:f.section,sourceAgentId:f.sourceAgentId,sourceRunId:f.sourceRunId,content:f.content,status:"draft",createdAt:new Date};if(this.outcomeFragments.set(W.id,W),$.status==="draft")$.status="in_review";return this.emitEvent({type:q.OutcomeFragmentAttached,fragment:{...W}}),{...W}}reviewOutcomeFragment(f){let $=this.outcomeFragments.get(f.fragmentId);if(!$)throw Error(`Fragment "${f.fragmentId}" was not found`);return $.status=f.approved?"reviewed":"rejected",$.reviewedBy=f.reviewedBy,$.reviewedAt=new Date,this.emitEvent({type:q.OutcomeFragmentReviewed,fragment:{...$}}),{...$}}listOutcomeFragments(f){return Array.from(this.outcomeFragments.values()).filter(($)=>$.outcomeId===f).map(($)=>({...$}))}finalizeOutcome(f){let $=this.outcomes.get(f);if(!$)throw Error(`Outcome "${f}" was not found`);let W=this.listOutcomeFragments(f);for(let J of $.requiredSections)if(!W.some((Q)=>Q.section===J&&Q.status==="reviewed"))throw Error(`Outcome "${f}" cannot be finalized. Section "${J}" is missing a reviewed fragment.`);return $.status="finalized",$.finalizedAt=new Date,this.emitEvent({type:q.OutcomeFinalized,outcome:{...$}}),{...$}}cleanup(){for(let f of this.members.values())if(f.role==="teammate"&&f.runningCount>0)throw Error(`Cannot cleanup team while teammate "${f.agentId}" is still running`);if(Array.from(this.runs.values()).some((f)=>["queued","running"].includes(f.status)))throw Error("Cannot cleanup team while async teammate runs are still active");for(let f of this.members.values())if(f.role==="teammate")try{f.agent?.abort()}catch($){if(!S5($))throw $}this.tasks.clear(),this.mailbox.length=0,this.missionLog.length=0,this.runs.clear(),this.runQueue.length=0,this.clearQueuedRunDispatchTimer(),this.outcomes.clear(),this.outcomeFragments.clear();for(let[f,$]of this.members.entries())if($.role==="teammate")this.members.delete(f)}requireTask(f){let $=this.tasks.get(f);if(!$)throw Error(`Task "${f}" was not found`);return $}assertDependenciesResolved(f){let $=this.getUnresolvedDependencies(f);if($.length>0)throw Error(`Task "${f.id}" is blocked by "${$[0]}"`)}getUnresolvedDependencies(f){return f.dependsOn.filter(($)=>{let W=this.tasks.get($);return!W||W.status!=="completed"})}trackMeaningfulEvent(f,$){if(this.recordRunActivityFromAgentEvent(f,$),$.type==="iteration_end"&&$.hadToolCalls){this.recordProgressStep(f,`Completed iteration ${$.iteration} with ${$.toolCallCount} tool call(s)`);return}if($.type==="content_end"&&$.contentType==="tool"&&!$.error){this.recordProgressStep(f,`Finished tool "${$.toolName??"unknown"}"`);return}if($.type==="done"){this.appendMissionLog({agentId:f,kind:"done",summary:`Completed a delegated run (${$.iterations} iterations)`});return}if($.type==="error")this.appendMissionLog({agentId:f,kind:"error",summary:$.error.message})}recordRunActivityFromAgentEvent(f,$){let W;switch($.type){case"iteration_start":W=`iteration_${$.iteration}_started`;break;case"content_start":if($.contentType==="tool")W=`running_tool_${$.toolName??"unknown"}`;break;case"content_end":if($.contentType==="tool")W=$.error?this.formatProgressErrorActivity(`tool_${$.toolName??"unknown"}_error`,$.error):`finished_tool_${$.toolName??"unknown"}`;break;case"done":W="finalizing_response";break;case"error":W=this.formatProgressErrorActivity("run_error",$.error.message);break;default:break}if(!W)return;for(let J of this.runs.values()){if(J.agentId!==f||J.status!=="running")continue;this.recordRunProgress(J,W)}}recordRunProgress(f,$){let W=new Date;f.heartbeatAt=W,f.lastProgressAt=W,f.lastProgressMessage=$,f.currentActivity=$,this.emitEvent({type:q.RunProgress,run:{...f},message:$})}formatProgressErrorActivity(f,$){let W=$.replace(/\s+/g," ").trim();if(W.length===0)return f;let J=W.length>240?`${W.slice(0,237).trimEnd()}...`:W;return`${f}: ${J}`}recordProgressStep(f,$,W,J=!1){this.missionStepCounter++;let H=this.members.get(f);if(!H)return;let Q=this.missionStepCounter-H.lastMissionStep,Z=Date.now()-H.lastMissionAt;if(!J&&Q<this.missionLogIntervalSteps&&Z<this.missionLogIntervalMs)return;this.appendMissionLog({agentId:f,taskId:W,kind:"progress",summary:$})}buildMailboxNotification(f){if(f.length===0)return"";let $=[`[MAILBOX] You have ${f.length} unread message(s):`];for(let W of f)$.push(`--- Message from ${W.fromAgentId} | subject: ${W.subject} ---`),$.push(W.body);return $.push("---"),$.join(`
498
+ `)}emitEvent(f){try{this.onTeamEvent?.(f)}catch{}}}function Gj(f){return new Promise(($)=>setTimeout($,f))}function i1(f,$){let W=0;for(let J of f){if(!J.startsWith($))continue;let H=Number.parseInt(J.slice($.length),10);if(Number.isFinite(H))W=Math.max(W,H)}return W}function m5(f,$){switch($.type){case"run_queued":case"run_started":f.activeTeamRunIds.add($.run.id);break;case"run_completed":case"run_failed":case"run_cancelled":case"run_interrupted":{let W;if($.type==="run_failed")W=$.run.error;else if($.type==="run_cancelled"||$.type==="run_interrupted")W=$.run.error??$.reason;f.activeTeamRunIds.delete($.run.id),f.pendingTeamRunUpdates.push({runId:$.run.id,agentId:$.run.agentId,taskId:$.run.taskId,status:$.type.replace("run_",""),error:W,iterations:$.run.result?.iterations}),G6(f);break}default:break}}async function g5(f,$,W){switch($.type){case"run_progress":await W("onTeamTaskProgress",f,$.run.agentId,$.message,{kind:$.message==="heartbeat"?"heartbeat":"progress"});break;case"agent_event":if($.event.type==="content_start"&&$.event.contentType==="text"&&typeof $.event.text==="string"){let J=$.event.text.replace(/\s+/g," ").trim().slice(0,120);if(J)await W("onTeamTaskProgress",f,$.agentId,J,{kind:"text"})}break;case"task_start":await W("onTeamTaskStart",f,$.agentId,$.message);break;case"task_end":{if($.error)await W("onTeamTaskEnd",f,$.agentId,"failed",`[error] ${$.error.message}`,void 0,$.messages);else if($.result?.finishReason==="aborted")await W("onTeamTaskEnd",f,$.agentId,"cancelled","[done] aborted",$.result,$.result.messages);else await W("onTeamTaskEnd",f,$.agentId,"completed",`[done] ${$.result?.finishReason??"completed"}`,$.result,$.result?.messages);break}default:break}}function x5(f,$,W,J){if(!f.runtime.teamRuntime)return;let H=f.runtime.teamRuntime.getTeamName();J({type:"team_progress",payload:{sessionId:$,teamName:H,lifecycle:p1({teamName:H,sessionId:$,event:W}),summary:l1(H,f.runtime.teamRuntime.exportState())}})}function J8(f){return f.activeTeamRunIds.size>0||f.pendingTeamRunUpdates.length>0}function I5(f,$){if(f.aborting)return!1;if(!($==="completed"||$==="max_iterations"))return!1;return f.config.enableAgentTeams===!0&&J8(f)}function G6(f){let $=f.teamRunWaiters.splice(0);for(let W of $)W()}async function v5(f){while(!0){if(f.aborting)return[];if(f.pendingTeamRunUpdates.length>0){let $=[...f.pendingTeamRunUpdates];return f.pendingTeamRunUpdates.length=0,$}if(f.activeTeamRunIds.size===0)return[];await new Promise(($)=>{f.teamRunWaiters.push($)})}}function u5(f,$){let W=$.map((Q)=>{let Z=[`- ${Q.runId} (${Q.agentId}) -> ${Q.status}`];if(Q.taskId)Z.push(` task=${Q.taskId}`);if(typeof Q.iterations==="number")Z.push(` iterations=${Q.iterations}`);if(Q.error)Z.push(` error=${Q.error}`);return Z.join("")}),J=f.activeTeamRunIds.size,H=J>0?`There are still ${J} teammate run(s) in progress. Continue coordination and decide whether to wait for more updates.`:"No teammate runs are currently in progress. Continue coordination using these updates.";return D6(`System-delivered teammate async run updates:
499
+ ${W.join(`
500
+ `)}
501
+
502
+ ${H}`,f.config.mode)}function D6(f,$){return cU(f,$==="plan"?"plan":$==="yolo"?"yolo":"act")}var c5=4;class O0{adapter;manifestStore;teamChildren;static STALE_REASON="failed_external_process_exit";static STALE_SOURCE="stale_session_reconciler";static TEAM_HEARTBEAT_LOG_INTERVAL_MS=30000;constructor(f,$={}){this.adapter=f;this.manifestStore=new w5(f,$.messagesArtifactUploader),this.teamChildren=new M6(f,this.manifestStore,(W,J,H)=>this.toPersistedMessages(W,J,H),O0.TEAM_HEARTBEAT_LOG_INTERVAL_MS)}toPersistedMessages(f,$,W){if(!f)return;return $?x8($.messages,$,W):g8(f)}ensureSessionsDir(){return this.manifestStore.ensureSessionsDir()}writeSessionManifest(f,$){this.manifestStore.writeSessionManifest(f,$)}readSessionManifest(f){return this.manifestStore.readSessionManifest(f)}async createRootSessionWithArtifacts(f){let $=f.startedAt??t(),W=f.sessionId.trim(),J=W.length>0?W:`${Date.now()}_${rU(5)}`,H=this.manifestStore.artifacts.sessionMessagesPath(J),Q=this.manifestStore.artifacts.sessionManifestPath(J),Z=r2({metadata:f.metadata,prompt:f.prompt}),P={version:1,session_id:J,source:f.source,pid:f.pid,started_at:$,status:"running",interactive:f.interactive,provider:f.provider,model:f.model,cwd:f.cwd,workspace_root:f.workspaceRoot,team_name:f.teamName,enable_tools:f.enableTools,enable_spawn:f.enableSpawn,enable_teams:f.enableTeams,prompt:f.prompt?.trim()||void 0,metadata:Z,messages_path:H};return await this.adapter.upsertSession({sessionId:J,source:f.source,pid:f.pid,startedAt:$,endedAt:null,exitCode:null,status:"running",statusLock:0,interactive:f.interactive,provider:f.provider,model:f.model,cwd:f.cwd,workspaceRoot:f.workspaceRoot,teamName:f.teamName??null,enableTools:f.enableTools,enableSpawn:f.enableSpawn,enableTeams:f.enableTeams,parentSessionId:null,parentAgentId:null,agentId:null,conversationId:null,isSubagent:!1,prompt:P.prompt??null,metadata:x0(P.metadata),hookPath:"",messagesPath:H,updatedAt:t()}),this.manifestStore.initializeMessagesFile(J,H,$),this.manifestStore.writeSessionManifest(Q,P),{manifestPath:Q,messagesPath:H,manifest:P}}async updateSessionStatus(f,$,W){let J;if((await e7(()=>this.adapter.getSession(f),async(Q)=>{return J=$==="running"?void 0:t(),this.adapter.updateSession({sessionId:f,status:$,endedAt:J??null,exitCode:$==="running"?null:typeof W==="number"?W:null,expectedStatusLock:Q.statusLock})},c5)).updated){if($==="cancelled")await this.teamChildren.applyStatusToRunningChildSessions(f,"cancelled");return{updated:!0,endedAt:J}}return{updated:!1}}async updateSession(f){for(let $=0;$<c5;$++){let W=await this.adapter.getSession(f.sessionId);if(!W)return{updated:!1};let J=W.metadata??void 0,H=f.metadata!==void 0?x0(f.metadata)??{}:x0(J)??{},Q=M$(typeof J?.title==="string"?J.title:void 0),Z=f.title!==void 0?M$(f.title):Q??cJ(f.prompt);if(Z)H.title=Z;else delete H.title;let P=f.metadata!==void 0||f.prompt!==void 0||f.title!==void 0;if(!(await this.adapter.updateSession({sessionId:f.sessionId,prompt:f.prompt,metadata:P?Object.keys(H).length>0?H:null:void 0,title:Z,expectedStatusLock:W.statusLock})).updated)continue;let{path:R,manifest:X}=this.manifestStore.readManifestFile(f.sessionId);if(X){if(f.prompt!==void 0)X.prompt=f.prompt??void 0;let A=f.metadata!==void 0?x0(f.metadata)??{}:x0(X.metadata)??{};if(Z)A.title=Z;X.metadata=Object.keys(A).length>0?A:void 0,this.manifestStore.writeSessionManifest(R,X)}return{updated:!0}}return{updated:!1}}queueSpawnRequest(f){return this.teamChildren.queueSpawnRequest(f)}upsertSubagentSession(f){return this.teamChildren.upsertSubagentSession(f)}upsertSubagentSessionFromHook(f){return this.teamChildren.upsertSubagentSessionFromHook(f)}appendSubagentHookAudit(f,$){return this.teamChildren.appendSubagentHookAudit($),Promise.resolve()}persistSessionMessages(f,$,W){let J=g8($);return this.manifestStore.persistSessionMessages(f,J,W)}applySubagentStatus(f,$){return this.teamChildren.applySubagentStatus(f,$)}applySubagentStatusBySessionId(f,$){return this.teamChildren.applySubagentStatusBySessionId(f,$)}applyStatusToRunningChildSessions(f,$){return this.teamChildren.applyStatusToRunningChildSessions(f,$)}onTeamTaskStart(f,$,W){return this.teamChildren.onTeamTaskStart(f,$,W)}onTeamTaskEnd(f,$,W,J,H,Q){return this.teamChildren.onTeamTaskEnd(f,$,W,J,H,Q)}onTeamTaskProgress(f,$,W,J){return this.teamChildren.onTeamTaskProgress(f,$,W,J)}handleSubAgentStart(f,$){return this.teamChildren.handleSubAgentStart(f,$)}handleSubAgentEnd(f,$){return this.teamChildren.handleSubAgentEnd(f,$)}isPidAlive(f){if(!Number.isFinite(f)||f<=0)return!1;try{return process.kill(Math.floor(f),0),!0}catch($){return typeof $==="object"&&$!==null&&"code"in $&&$.code==="EPERM"}}async reconcileDeadRunningSession(f){if(f.status!=="running"||this.isPidAlive(f.pid))return f;let $=t(),W=O0.STALE_REASON;for(let J=0;J<c5;J++){let H=await this.adapter.getSession(f.sessionId);if(!H)return;if(H.status!=="running")return H;let Q={...H.metadata??{},terminal_marker:W,terminal_marker_at:$,terminal_marker_pid:H.pid,terminal_marker_source:O0.STALE_SOURCE},Z=await this.adapter.updateSession({sessionId:H.sessionId,status:"failed",endedAt:$,exitCode:1,metadata:Q,expectedStatusLock:H.statusLock});if(!Z.updated)continue;await this.teamChildren.applyStatusToRunningChildSessions(H.sessionId,"failed");let P=o7(H,{status:"failed",endedAt:$,exitCode:1,metadata:Q}),{path:j}=this.manifestStore.readManifestFile(H.sessionId);return this.manifestStore.writeSessionManifest(j,P),this.manifestStore.appendStaleSessionHookLog($,H.sessionId,H.pid,W,O0.STALE_SOURCE),{...H,status:"failed",endedAt:$,exitCode:1,metadata:Q,statusLock:Z.statusLock,updatedAt:$}}return await this.adapter.getSession(f.sessionId)}async listSessions(f=200){let $=Math.max(1,Math.floor(f)),W=Math.min($*5,2000);return await this.reconcileDeadSessions(W),(await this.adapter.listSessions({limit:W})).slice(0,$).map((H)=>{let Q=x0(H.metadata??void 0),Z=this.manifestStore.readSessionManifest(H.sessionId),P=M$(typeof Z?.metadata?.title==="string"?Z.metadata.title:void 0),j=P?{...Q??{},title:P}:Q;return{...H,metadata:j}})}async reconcileDeadSessions(f=2000){let $=await this.adapter.listSessions({limit:Math.max(1,Math.floor(f)),status:"running"}),W=0;for(let J of $){let H=await this.reconcileDeadRunningSession(J);if(H&&H.status!==J.status)W++}return W}async deleteSession(f){let $=f.trim();if(!$)throw Error("session id is required");let W=await this.adapter.getSession($);if(!W)return{deleted:!1};if(await this.adapter.deleteSession($,!1),!W.isSubagent){let J=await this.adapter.listSessions({limit:2000,parentSessionId:$});await this.adapter.deleteSession($,!0),await Promise.allSettled(J.map(async(H)=>{await HH(H.cwd,H.sessionId),FW(H.messagesPath),FW(this.manifestStore.artifacts.sessionManifestPath(H.sessionId,!1)),this.manifestStore.artifacts.removeSessionDirIfEmpty(H.sessionId)}))}if(await HH(W.cwd,$),FW(W.messagesPath),FW(this.manifestStore.artifacts.sessionManifestPath($,!1)),W.isSubagent)this.manifestStore.artifacts.removeSessionDirIfEmpty($);else{let J=new Set([this.manifestStore.artifacts.sessionArtifactsDir($)]);for(let H of[W.messagesPath])if(typeof H==="string"&&H.trim().length>0)J.add(dU(H));for(let H of J)this.manifestStore.artifacts.removeDir(H)}return{deleted:!0}}}function r5(){return new Date().toISOString()}function Cj(f,$){let W=`${f}.tmp`;iU(W,`${JSON.stringify($,null,2)}
503
+ `,"utf8"),pU(W,f)}class zj{sessionsDirPath;constructor(f=nU()){this.sessionsDirPath=f}ensureSessionsDir(){if(!d5(this.sessionsDirPath))lU(this.sessionsDirPath,{recursive:!0});return this.sessionsDirPath}indexPath(){return Oj(this.ensureSessionsDir(),"sessions.index.json")}spawnQueuePath(){return Oj(this.ensureSessionsDir(),"subagent-spawn-queue.json")}readIndex(){let f=this.indexPath();if(!d5(f))return{version:1,sessions:{}};try{let $=JSON.parse(Lj(f,"utf8"));if($?.version===1&&$.sessions)return $}catch{}return{version:1,sessions:{}}}writeIndex(f){Cj(this.indexPath(),f)}readQueue(){let f=this.spawnQueuePath();if(!d5(f))return{version:1,nextId:1,requests:[]};try{let $=JSON.parse(Lj(f,"utf8"));if($?.version===1&&typeof $.nextId==="number"&&Array.isArray($.requests))return $}catch{}return{version:1,nextId:1,requests:[]}}writeQueue(f){Cj(this.spawnQueuePath(),f)}async upsertSession(f){let $=this.readIndex();$.sessions[f.sessionId]=f,this.writeIndex($)}async getSession(f){return this.readIndex().sessions[f]}async listSessions(f){return Object.values(this.readIndex().sessions).filter(($)=>f.parentSessionId!==void 0?$.parentSessionId===f.parentSessionId:!0).filter(($)=>f.status!==void 0?$.status===f.status:!0).sort(($,W)=>W.startedAt.localeCompare($.startedAt)).slice(0,f.limit)}async updateSession(f){let $=this.readIndex(),W=$.sessions[f.sessionId];if(!W)return{updated:!1,statusLock:0};if(f.expectedStatusLock!==void 0&&W.statusLock!==f.expectedStatusLock)return{updated:!1,statusLock:W.statusLock};let J=f.expectedStatusLock!==void 0?f.expectedStatusLock+1:W.statusLock,H={...W,status:f.status??W.status,endedAt:f.endedAt!==void 0?f.endedAt:W.endedAt??null,exitCode:f.exitCode!==void 0?f.exitCode:W.exitCode??null,prompt:f.prompt!==void 0?f.prompt:W.prompt??null,metadata:f.metadata!==void 0?f.metadata??null:W.metadata??null,parentSessionId:f.parentSessionId!==void 0?f.parentSessionId??null:W.parentSessionId??null,parentAgentId:f.parentAgentId!==void 0?f.parentAgentId??null:W.parentAgentId??null,agentId:f.agentId!==void 0?f.agentId??null:W.agentId??null,conversationId:f.conversationId!==void 0?f.conversationId??null:W.conversationId??null,statusLock:J,isSubagent:f.setRunning||f.parentSessionId!==void 0?!0:W.isSubagent,updatedAt:r5()};if(f.setRunning)H.status="running",H.endedAt=null,H.exitCode=null;return $.sessions[f.sessionId]=H,this.writeIndex($),{updated:!0,statusLock:H.statusLock}}async deleteSession(f,$){let W=this.readIndex();if(!W.sessions[f])return!1;if(delete W.sessions[f],$){for(let H of Object.values(W.sessions))if(H.parentSessionId===f)delete W.sessions[H.sessionId]}return this.writeIndex(W),!0}async enqueueSpawnRequest(f){let $=this.readQueue();$.requests.push({id:$.nextId,rootSessionId:f.rootSessionId,parentAgentId:f.parentAgentId,task:f.task,systemPrompt:f.systemPrompt,createdAt:r5()}),$.nextId+=1,this.writeQueue($)}async claimSpawnRequest(f,$){let W=this.readQueue(),J=W.requests.find((H)=>H.rootSessionId===f&&H.parentAgentId===$&&!H.consumedAt);if(!J)return;return J.consumedAt=r5(),this.writeQueue(W),J.task}}class l5 extends O0{constructor(f,$={}){super(new zj(f),$)}ensureSessionsDir(){return super.ensureSessionsDir()}}var qj={};z(qj,{CoreSessionService:()=>H0});import{existsSync as aU,mkdirSync as tU}from"node:fs";import{resolveSessionDataDir as sU}from"@clinebot/shared/storage";var p5=`
504
+ session_id AS sessionId,
505
+ source,
506
+ pid,
507
+ started_at AS startedAt,
508
+ ended_at AS endedAt,
509
+ exit_code AS exitCode,
510
+ status,
511
+ status_lock AS statusLock,
512
+ interactive,
513
+ provider,
514
+ model,
515
+ cwd,
516
+ workspace_root AS workspaceRoot,
517
+ team_name AS teamName,
518
+ enable_tools AS enableTools,
519
+ enable_spawn AS enableSpawn,
520
+ enable_teams AS enableTeams,
521
+ parent_session_id AS parentSessionId,
522
+ parent_agent_id AS parentAgentId,
523
+ agent_id AS agentId,
524
+ conversation_id AS conversationId,
525
+ is_subagent AS isSubagent,
526
+ prompt,
527
+ metadata_json AS metadata,
528
+ hook_path AS hookPath,
529
+ messages_path AS messagesPath,
530
+ updated_at AS updatedAt`;function i5(f){f.interactive=f.interactive===1,f.enableTools=f.enableTools===1,f.enableSpawn=f.enableSpawn===1,f.enableTeams=f.enableTeams===1,f.isSubagent=f.isSubagent===1;let $=f.metadata;if(typeof $==="string"&&$.trim())try{let W=JSON.parse($);f.metadata=W&&typeof W==="object"&&!Array.isArray(W)?W:null}catch{f.metadata=null}else f.metadata=null;return f}function n5(f){if(!f||Object.keys(f).length===0)return null;return JSON.stringify(f)}function Nj(f){return{...f,tasks:f.tasks.map(($)=>({...$,createdAt:new Date($.createdAt),updatedAt:new Date($.updatedAt)})),mailbox:f.mailbox.map(($)=>({...$,sentAt:new Date($.sentAt),readAt:$.readAt?new Date($.readAt):void 0})),missionLog:f.missionLog.map(($)=>({...$,ts:new Date($.ts)})),runs:(f.runs??[]).map(($)=>({...$,startedAt:new Date($.startedAt),endedAt:$.endedAt?new Date($.endedAt):void 0,nextAttemptAt:$.nextAttemptAt?new Date($.nextAttemptAt):void 0,heartbeatAt:$.heartbeatAt?new Date($.heartbeatAt):void 0})),outcomes:(f.outcomes??[]).map(($)=>({...$,createdAt:new Date($.createdAt),finalizedAt:$.finalizedAt?new Date($.finalizedAt):void 0})),outcomeFragments:(f.outcomeFragments??[]).map(($)=>({...$,createdAt:new Date($.createdAt),reviewedAt:$.reviewedAt?new Date($.reviewedAt):void 0}))}}class bj{store;sessionsDirPath;constructor(f,$=sU()){this.store=f;this.sessionsDirPath=$}ensureSessionsDir(){if(!aU(this.sessionsDirPath))tU(this.sessionsDirPath,{recursive:!0});return this.sessionsDirPath}async upsertSession(f){this.store.run(`INSERT OR REPLACE INTO sessions (
531
+ session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
532
+ provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
533
+ parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
534
+ metadata_json, transcript_path, hook_path, messages_path, updated_at
535
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[f.sessionId,f.source,f.pid,f.startedAt,f.endedAt??null,f.exitCode??null,f.status,f.statusLock,f.interactive?1:0,f.provider,f.model,f.cwd,f.workspaceRoot,f.teamName??null,f.enableTools?1:0,f.enableSpawn?1:0,f.enableTeams?1:0,f.parentSessionId??null,f.parentAgentId??null,f.agentId??null,f.conversationId??null,f.isSubagent?1:0,f.prompt??null,n5(f.metadata),"",f.hookPath??"",f.messagesPath??null,f.updatedAt])}async getSession(f){let $=this.store.queryOne(`SELECT ${p5} FROM sessions WHERE session_id = ?`,[f]);return $?i5($):void 0}async listSessions(f){let $=[],W=[];if(f.parentSessionId)$.push("parent_session_id = ?"),W.push(f.parentSessionId);if(f.status)$.push("status = ?"),W.push(f.status);let J=$.length>0?`WHERE ${$.join(" AND ")}`:"";return this.store.queryAll(`SELECT ${p5}
536
+ FROM sessions
537
+ ${J}
538
+ ORDER BY started_at DESC
539
+ LIMIT ?`,[...W,f.limit]).map(i5)}async updateSession(f){if(f.setRunning){if(f.expectedStatusLock===void 0)return{updated:!1,statusLock:0};return{updated:(this.store.run(`UPDATE sessions
540
+ SET status = 'running', ended_at = NULL, exit_code = NULL, updated_at = ?, status_lock = ?,
541
+ parent_session_id = ?, parent_agent_id = ?, agent_id = ?, conversation_id = ?, is_subagent = 1,
542
+ prompt = COALESCE(prompt, ?)
543
+ WHERE session_id = ? AND status_lock = ?`,[t(),f.expectedStatusLock+1,f.parentSessionId??null,f.parentAgentId??null,f.agentId??null,f.conversationId??null,f.prompt??null,f.sessionId,f.expectedStatusLock]).changes??0)>0,statusLock:f.expectedStatusLock+1}}let $=[],W=[];if(f.status!==void 0)$.push("status = ?"),W.push(f.status);if(f.endedAt!==void 0)$.push("ended_at = ?"),W.push(f.endedAt);if(f.exitCode!==void 0)$.push("exit_code = ?"),W.push(f.exitCode);if(f.prompt!==void 0)$.push("prompt = ?"),W.push(f.prompt??null);if(f.metadata!==void 0)$.push("metadata_json = ?"),W.push(n5(f.metadata));if(f.parentSessionId!==void 0)$.push("parent_session_id = ?"),W.push(f.parentSessionId??null);if(f.parentAgentId!==void 0)$.push("parent_agent_id = ?"),W.push(f.parentAgentId??null);if(f.agentId!==void 0)$.push("agent_id = ?"),W.push(f.agentId??null);if(f.conversationId!==void 0)$.push("conversation_id = ?"),W.push(f.conversationId??null);if($.length===0){let Z=await this.getSession(f.sessionId);return{updated:!!Z,statusLock:Z?.statusLock??0}}let J=0;if(f.expectedStatusLock!==void 0)J=f.expectedStatusLock+1,$.push("status_lock = ?"),W.push(J);$.push("updated_at = ?"),W.push(t());let H=`UPDATE sessions SET ${$.join(", ")} WHERE session_id = ?`;if(W.push(f.sessionId),f.expectedStatusLock!==void 0)H+=" AND status_lock = ?",W.push(f.expectedStatusLock);if((this.store.run(H,W).changes??0)===0)return{updated:!1,statusLock:0};if(f.expectedStatusLock===void 0)J=(await this.getSession(f.sessionId))?.statusLock??0;return{updated:!0,statusLock:J}}async deleteSession(f,$){let W=this.store.run("DELETE FROM sessions WHERE session_id = ?",[f]).changes??0;if($)this.store.run("DELETE FROM sessions WHERE parent_session_id = ?",[f]);return W>0}async enqueueSpawnRequest(f){this.store.run(`INSERT INTO subagent_spawn_queue (root_session_id, parent_agent_id, task, system_prompt, created_at, consumed_at)
544
+ VALUES (?, ?, ?, ?, ?, NULL)`,[f.rootSessionId,f.parentAgentId,f.task??null,f.systemPrompt??null,t()])}async claimSpawnRequest(f,$){let W=this.store.queryOne(`SELECT id, task FROM subagent_spawn_queue
545
+ WHERE root_session_id = ? AND parent_agent_id = ? AND consumed_at IS NULL
546
+ ORDER BY id ASC LIMIT 1`,[f,$]);if(!W||typeof W.id!=="number")return;return this.store.run("UPDATE subagent_spawn_queue SET consumed_at = ? WHERE id = ?",[t(),W.id]),W.task??void 0}}class H0 extends O0{store;constructor(f,$={}){super(new bj(f,$.sessionArtifactsDir),$);this.store=f}createRootSession(f){this.store.run(`INSERT OR REPLACE INTO sessions (
547
+ session_id, source, pid, started_at, ended_at, exit_code, status, status_lock, interactive,
548
+ provider, model, cwd, workspace_root, team_name, enable_tools, enable_spawn, enable_teams,
549
+ parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent, prompt,
550
+ metadata_json, transcript_path, hook_path, messages_path, updated_at
551
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[f.sessionId,f.source,f.pid,f.startedAt,null,null,"running",0,f.interactive?1:0,f.provider,f.model,f.cwd,f.workspaceRoot,f.teamName??null,f.enableTools?1:0,f.enableSpawn?1:0,f.enableTeams?1:0,null,null,null,null,0,f.prompt??null,f.metadata?JSON.stringify(f.metadata):null,"","",f.messagesPath,t()])}}function oU(f){if(f.backendMode)return f.backendMode;if(process.env.CLINE_VCR?.trim())return"local";let $=process.env.CLINE_SESSION_BACKEND_MODE?.trim().toLowerCase();if($==="local"||$==="hub"||$==="remote")return $;return"auto"}var H8,Q8;function eU(f,$){if(f!=="auto"&&f!=="hub")return;if($.hub?.endpoint?.trim())return;Y6($.hub?.workspaceRoot?.trim()||$.hub?.cwd?.trim()||process.cwd())}async function fM(f){await f.reconcileDeadSessions?.().catch(()=>{})}function Ej(f){try{let $=new W0;return $.init(),new H0($,{messagesArtifactUploader:f.messagesArtifactUploader})}catch{return f.telemetry?.capture({event:"session_backend_fallback",properties:{requestedBackend:"sqlite",fallbackBackend:"file"}}),new l5(void 0,{messagesArtifactUploader:f.messagesArtifactUploader})}}function wj(f,$,W){return new Q0({sessionService:W??f.sessionService??Ej(f),capabilities:f.capabilities,telemetry:f.telemetry,toolPolicies:f.toolPolicies,distinctId:$,fetch:f.fetch})}async function a5(f){if(H8)return H8;if(Q8)return await Q8;return Q8=(async()=>{return H8=Ej(f),await fM(H8),H8})().finally(()=>{Q8=void 0}),await Q8}async function a1(f){let $=c$(f.distinctId);f.telemetry?.setDistinctId($);let W=oU(f);if(eU(W,f),W==="remote"){let J=f.remote?.endpoint?.trim();if(!J)throw Error("Remote runtime mode requires `remote.endpoint` to be configured.");return f.logger?.log("Using remote runtime host",{endpoint:J}),new r1({endpoint:J,authToken:f.remote?.authToken,clientType:f.remote?.clientType,displayName:f.remote?.displayName,workspaceRoot:f.remote?.workspaceRoot,cwd:f.remote?.cwd,capabilities:f.capabilities})}if(W==="hub"){let J=f.hub?.endpoint?.trim(),H=J||await I$({strategy:f.hub?.strategy??"require-hub",workspaceRoot:f.hub?.workspaceRoot,cwd:f.hub?.cwd});if(!H)throw Error("No compatible hub runtime is available.");return f.logger?.log("Using hub runtime host",{url:H,explicitEndpoint:J||void 0}),new _0({url:H,authToken:f.hub?.authToken,clientType:f.hub?.clientType,displayName:f.hub?.displayName,capabilities:f.capabilities},{workspaceRoot:f.hub?.workspaceRoot,cwd:f.hub?.cwd})}if(W==="auto"){let J=await eW({endpoint:f.hub?.endpoint,strategy:f.hub?.strategy??"prefer-hub",workspaceRoot:f.hub?.workspaceRoot,cwd:f.hub?.cwd});if(J){f.logger?.log("Using discovered local hub runtime host",{url:J});let H=new _0({url:J,authToken:f.hub?.authToken,clientType:f.hub?.clientType,displayName:f.hub?.displayName,capabilities:f.capabilities},{workspaceRoot:f.hub?.workspaceRoot,cwd:f.hub?.cwd});try{return await H.connect(),H}catch(Q){f.logger?.log("Falling back to local runtime host",{reason:"hub_connect_failed",severity:"warn",error:Q})}}return f.logger?.log("Falling back to local runtime host",{reason:"compatible_hub_unavailable",severity:"warn"}),wj(f,$)}return wj(f,$)}class Z8{clientName;runtimeAddress;automation;settings;pendingPrompts;host;prepare;capabilities;logger;telemetry;distinctId;automationService;activeSessionBootstraps=new Map;unsubscribeBootstrapCleanup;constructor(f,$,W,J,H,Q,Z,P,j){this.clientName=$,this.runtimeAddress=W,this.host=f,this.prepare=J,this.capabilities=H,this.logger=Q,this.telemetry=Z,this.distinctId=P,this.settings=$P(f),this.pendingPrompts=WP(f),this.automation=new IH(()=>{if(!this.automationService)throw Error("ClineCore automation is not enabled. Pass `automation: true` or automation options to ClineCore.create().");return this.automationService}),this.automationService=j?new iW({workspaceRoot:j.workspaceRoot??process.cwd(),specs:{cronSpecsDir:j.cronSpecsDir??j.cronDir,scope:wZ(j.cronScope),workspaceRoot:j.workspaceRoot},runtimeHandlers:EZ({host:f,getExtensionContext:()=>s4({automationService:this.automationService,automation:this.automation,clientName:this.clientName,distinctId:this.distinctId,logger:this.logger,telemetry:this.telemetry})}),dbPath:j.dbPath,logger:j.logger,pollIntervalMs:j.pollIntervalMs,claimLeaseSeconds:j.claimLeaseSeconds,globalMaxConcurrency:j.globalMaxConcurrency,watcherDebounceMs:j.watcherDebounceMs}):void 0,this.unsubscribeBootstrapCleanup=this.host.subscribe((R)=>{if(R.type!=="ended")return;this.disposeSessionBootstrap(R.payload.sessionId)})}static async create(f={}){let $=Xf(f.capabilities),W=await a1({...f,capabilities:$}),J=qZ(f.automation),H=new Z8(W,f.clientName,W.runtimeAddress,f.prepare,$,f.logger,f.telemetry,f.distinctId,J?{...J,logger:f.logger}:void 0);if(J&&J.autoStart!==!1)await H.automation.start();return H}async disposeSessionBootstrap(f){let $=this.activeSessionBootstraps.get(f);if(!$)return;this.activeSessionBootstraps.delete(f),await Promise.resolve($.dispose?.())}async start(f){let $=HP(f),W=await this.prepare?.($);try{let J=W?await W.applyToStartSessionInput($):$,H=await this.host.startSession(nH(J,{defaultCapabilities:this.capabilities,withExtensionContext:(Q)=>s4({automationService:this.automationService,automation:this.automation,context:Q,clientName:this.clientName,distinctId:this.distinctId,logger:this.logger,telemetry:this.telemetry})}));if(W)if(await this.host.getSession(H.sessionId))this.activeSessionBootstraps.set(H.sessionId,W);else await Promise.resolve(W.dispose?.());return QP({input:J,sessionId:H.sessionId,telemetry:this.telemetry,clientName:this.clientName,runtimeAddress:this.runtimeAddress}),H}catch(J){throw await Promise.resolve(W?.dispose?.()),J}}send=(...f)=>this.host.runTurn(...f);getAccumulatedUsage=(...f)=>{return this.host.getAccumulatedUsage?.(...f)??Promise.resolve(void 0)};abort=(...f)=>this.host.abort(...f);stop=async(f)=>{await this.host.stopSession(f),await this.disposeSessionBootstrap(f)};dispose=async(...f)=>{try{await this.automationService?.dispose(),await this.host.dispose(...f)}finally{this.unsubscribeBootstrapCleanup();let $=[...this.activeSessionBootstraps.keys()];await Promise.allSettled($.map((W)=>this.disposeSessionBootstrap(W)))}};get=(...f)=>this.host.getSession(...f);listHistory=async(f={})=>await A6(this.host,f);list=async(f=200,$={})=>await this.listHistory({...$,limit:f});delete=async(f)=>{let $=await this.host.deleteSession(f);if($)await this.disposeSessionBootstrap(f);return $};update=(...f)=>this.host.updateSession(...f);readMessages=(...f)=>this.host.readSessionMessages(...f);async restore(f){let $=f.start?nH(f.start,{defaultCapabilities:this.capabilities,withExtensionContext:(W)=>s4({automationService:this.automationService,automation:this.automation,context:W,clientName:this.clientName,distinctId:this.distinctId,logger:this.logger,telemetry:this.telemetry})}):void 0;return this.host.restoreSession({sessionId:f.sessionId,checkpointRunCount:f.checkpointRunCount,cwd:f.cwd,restore:f.restore,start:$})}ingestHookEvent=(...f)=>this.host.dispatchHookEvent(...f);subscribe(f,$){return this.host.subscribe(f,$)}updateSessionModel=(...f)=>{return this.host.updateSessionModel?.(...f)??Promise.resolve()}}var mj={};z(mj,{resolvePluginConfigSearchPaths:()=>e2,resolveAndLoadAgentPlugins:()=>M1,resolveAgentPluginPaths:()=>C$,loadAgentPluginsFromPathsWithDiagnostics:()=>U0,loadAgentPluginsFromPaths:()=>j4,loadAgentPluginFromPath:()=>o2,discoverPluginModulePaths:()=>fW});var pj={};z(pj,{resolveMcpServerRegistrations:()=>R8,resolveDefaultMcpSettingsPath:()=>H$,registerMcpServersFromSettingsFile:()=>o1,loadMcpSettingsFile:()=>j8,hasMcpSettingsFile:()=>s1,createMcpTools:()=>e1,createDisabledMcpToolPolicy:()=>X8,createDisabledMcpToolPolicies:()=>L6,createDefaultMcpServerClientFactory:()=>t1,InMemoryMcpManager:()=>r$});import{spawn as $M}from"node:child_process";import{StringDecoder as vj}from"node:string_decoder";var WM="2024-11-05",JM=5000,HM=1500;function gj(f){return f instanceof Error?f.message:String(f)}function xj(f){let $=Buffer.from(JSON.stringify(f),"utf8"),W=Buffer.from(`Content-Length: ${$.byteLength}\r
552
+ \r
553
+ `,"utf8");return Buffer.concat([W,$])}function Ij(f){return Buffer.from(`${JSON.stringify(f)}
554
+ `,"utf8")}class t5{buffer="";decoder=new vj("utf8");push(f){this.buffer+=this.decoder.write(f);let $=[];while(!0){let W=this.buffer.indexOf(`\r
555
+ \r
556
+ `);if(W<0)break;let H=this.buffer.slice(0,W).match(/(?:^|\r\n)Content-Length:\s*(\d+)(?:\r\n|$)/i);if(!H)throw Error("Invalid MCP stdio frame: missing Content-Length header.");let Q=Number.parseInt(H[1],10),Z=W+4,P=Z+Q;if(this.buffer.length<P)break;$.push(this.buffer.slice(Z,P)),this.buffer=this.buffer.slice(P)}return $}}class s5{buffer="";decoder=new vj("utf8");push(f){this.buffer+=this.decoder.write(f);let $=[];while(!0){let W=this.buffer.indexOf(`
557
+ `);if(W<0)break;let J=this.buffer.slice(0,W).trim();if(this.buffer=this.buffer.slice(W+1),J.length>0)$.push(J)}return $}}class uj{registration;process;nextRequestId=1;pending=new Map;framedParser=new t5;newlineParser=new s5;stderrBuffer="";connected=!1;protocolMode="newline";constructor(f){this.registration=f}async connect(){if(this.connected)return;if(this.registration.transport.type!=="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${this.registration.transport.type}`);let f=["newline","framed"],$;for(let W of f){await this.disconnect().catch(()=>{}),this.spawnProcess(W);try{await this.request("initialize",{protocolVersion:WM,capabilities:{},clientInfo:{name:"@clinebot/core",version:"0.0.0"}},HM),this.notify("notifications/initialized"),this.connected=!0,this.protocolMode=W;return}catch(J){$=J instanceof Error?J:Error(String(J))}}throw $??Error(`Failed to connect to MCP server "${this.registration.name}".`)}async disconnect(){let f=this.process;if(this.connected=!1,this.process=void 0,this.failAllPending(Error(`Disconnected from MCP server "${this.registration.name}".`)),!f)return;f.kill()}async listTools(){return((await this.request("tools/list")).tools??[]).filter(($)=>typeof $?.name==="string"&&typeof $.inputSchema==="object"&&$.inputSchema!==null).map(($)=>({name:$.name,description:$.description,inputSchema:$.inputSchema}))}async callTool(f){return this.request("tools/call",{name:f.name,arguments:f.arguments??{}})}spawnProcess(f){let $=this.registration.transport;if($.type!=="stdio")throw Error(`Unsupported MCP transport for "${this.registration.name}": ${$.type}`);this.framedParser=new t5,this.newlineParser=new s5,this.stderrBuffer="",this.protocolMode=f;let W=process.platform==="win32"?{windowsHide:!0,shell:!0}:{},J=$M($.command,$.args??[],{cwd:$.cwd,env:{...process.env,...$.env??{}},stdio:["pipe","pipe","pipe"],...W});this.process=J,J.stdout.on("data",(H)=>this.handleStdout(H)),J.stderr.on("data",(H)=>{if(this.process!==J)return;if(this.stderrBuffer+=H.toString("utf8"),this.stderrBuffer.length>16384)this.stderrBuffer=this.stderrBuffer.slice(-16384)}),J.once("error",(H)=>{if(this.process!==J)return;this.failAllPending(Error(`MCP process error: ${gj(H)}`))}),J.once("exit",(H,Q)=>{if(this.process!==J)return;this.connected=!1,this.process=void 0;let Z=this.stderrBuffer.trim()?` stderr: ${this.stderrBuffer.trim()}`:"";this.failAllPending(Error(`MCP process exited for "${this.registration.name}" (code=${H??"null"}, signal=${Q??"null"}).${Z}`))})}handleStdout(f){try{let $=this.protocolMode==="framed"?this.framedParser.push(f):this.newlineParser.push(f);for(let W of $){let J=JSON.parse(W);if(typeof J.id!=="number")continue;let H=this.pending.get(J.id);if(!H)continue;if(this.pending.delete(J.id),clearTimeout(H.timeout),J.error){let Q=J.error.message||`MCP request failed with code ${J.error.code??"unknown"}`;H.reject(Error(Q));continue}H.resolve(J.result)}}catch($){this.handleProtocolFailure($)}}handleProtocolFailure(f){let $=this.process;if(!$)return;this.connected=!1,this.process=void 0;let W=this.stderrBuffer.trim()?` stderr: ${this.stderrBuffer.trim()}`:"";this.failAllPending(Error(`Invalid MCP response from "${this.registration.name}": ${gj(f)}.${W}`)),$.kill()}async request(f,$,W=JM){let J=this.process;if(!J?.stdin.writable)throw Error(`MCP server "${this.registration.name}" is not connected.`);let H=this.nextRequestId++,Q={jsonrpc:"2.0",id:H,method:f,...$?{params:$}:{}},Z=new Promise((P,j)=>{let R=setTimeout(()=>{this.pending.delete(H),j(Error(`MCP request timed out for "${this.registration.name}" (${f}).`))},W);this.pending.set(H,{resolve:P,reject:j,timeout:R})});try{J.stdin.write(this.protocolMode==="framed"?xj(Q):Ij(Q))}catch(P){let j=this.pending.get(H);if(j)clearTimeout(j.timeout),this.pending.delete(H);throw P}return Z}notify(f,$){let W=this.process;if(!W?.stdin.writable)return;let J={jsonrpc:"2.0",method:f,...$?{params:$}:{}};W.stdin.write(this.protocolMode==="framed"?xj(J):Ij(J))}failAllPending(f){for(let[$,W]of this.pending)clearTimeout(W.timeout),this.pending.delete($),W.reject(f)}}function t1(){return(f)=>new uj(f)}import{existsSync as QM,readFileSync as ZM}from"node:fs";import{resolveMcpSettingsPath as PM}from"@clinebot/shared/storage";import{z as k}from"zod";var P8=k.record(k.string(),k.string()),cj=k.record(k.string(),k.unknown()),jM=k.object({type:k.literal("stdio"),command:k.string().min(1),args:k.array(k.string()).optional(),cwd:k.string().min(1).optional(),env:P8.optional()}),RM=k.object({type:k.literal("sse"),url:k.string().url(),headers:P8.optional()}),XM=k.object({type:k.literal("streamableHttp"),url:k.string().url(),headers:P8.optional()}),AM=k.discriminatedUnion("type",[jM,RM,XM]),VM=k.object({transport:AM,disabled:k.boolean().optional(),metadata:cj.optional()}),BM=k.enum(["stdio","sse","http","streamableHttp"]).optional(),dj=k.object({type:k.enum(["stdio","sse","streamableHttp"]).optional(),transportType:BM,disabled:k.boolean().optional(),metadata:cj.optional()});function o5(f){if(!f)return;if(f==="http")return"streamableHttp";return f}var TM=dj.extend({command:k.string().min(1),args:k.array(k.string()).optional(),cwd:k.string().min(1).optional(),env:P8.optional()}).superRefine((f,$)=>{let W=f.type??o5(f.transportType);if(W&&W!=="stdio")$.addIssue({code:k.ZodIssueCode.custom,message:'Expected type "stdio" for command-based MCP server',path:["type"]})}).transform((f)=>({transport:{type:"stdio",command:f.command,args:f.args,cwd:f.cwd,env:f.env},disabled:f.disabled,metadata:f.metadata})),YM=dj.extend({url:k.string().url(),headers:P8.optional()}).superRefine((f,$)=>{let W=f.type??o5(f.transportType)??"sse";if(W!=="sse"&&W!=="streamableHttp")$.addIssue({code:k.ZodIssueCode.custom,message:'Expected type "sse" or "streamableHttp" for URL-based MCP server',path:["type"]})}).transform((f)=>{if((f.type??o5(f.transportType)??"sse")==="streamableHttp")return{transport:{type:"streamableHttp",url:f.url,headers:f.headers},disabled:f.disabled,metadata:f.metadata};return{transport:{type:"sse",url:f.url,headers:f.headers},disabled:f.disabled,metadata:f.metadata}}),FM=k.union([VM,TM,YM]),yM=k.object({mcpServers:k.record(k.string(),FM)}).strict();function H$(){return PM()}function j8(f={}){let $=f.filePath??H$(),W=ZM($,"utf8"),J;try{J=JSON.parse(W)}catch(Q){let Z=Q instanceof Error?Q.message:String(Q);throw Error(`Failed to parse MCP settings JSON at "${$}": ${Z}`)}let H=yM.safeParse(J);if(!H.success){let Q=H.error.issues.map((Z)=>{let P=Z.path.join(".");return P?`${P}: ${Z.message}`:Z.message}).join("; ");throw Error(`Invalid MCP settings at "${$}": ${Q}`)}return H.data}function s1(f={}){let $=f.filePath??H$();return QM($)}function R8(f={}){let $=j8(f);return Object.entries($.mcpServers).map(([W,J])=>({name:W,transport:J.transport,disabled:J.disabled,metadata:J.metadata}))}async function o1(f,$={}){let W=R8($);for(let J of W)await f.registerServer(J);return W}function kf(){return Date.now()}function hM(f){return f.map(($)=>({name:$.name,description:$.description,inputSchema:$.inputSchema}))}class r${toolsCacheTtlMs;clientFactory;servers=new Map;operationLocks=new Map;constructor(f){this.clientFactory=f.clientFactory,this.toolsCacheTtlMs=f.toolsCacheTtlMs??5000}async registerServer(f){await this.runExclusive(f.name,async()=>{let $=this.servers.get(f.name);if(!$){this.servers.set(f.name,{registration:{...f},status:"disconnected",updatedAt:kf()});return}let W=JSON.stringify($.registration.transport)!==JSON.stringify(f.transport);if($.registration={...f},$.updatedAt=kf(),W)await this.disconnectState($),$.client=void 0,$.toolCache=void 0,$.toolCacheUpdatedAt=void 0})}async unregisterServer(f){await this.runExclusive(f,async()=>{let $=this.requireServer(f);await this.disconnectState($),this.servers.delete(f)})}async connectServer(f){await this.runExclusive(f,async()=>{let $=this.requireServer(f);await this.connectState($)})}async disconnectServer(f){await this.runExclusive(f,async()=>{let $=this.requireServer(f);await this.disconnectState($)})}async setServerDisabled(f,$){await this.runExclusive(f,async()=>{let W=this.requireServer(f);if(W.registration={...W.registration,disabled:$},W.updatedAt=kf(),$)await this.disconnectState(W)})}listServers(){return[...this.servers.values()].map((f)=>({name:f.registration.name,status:f.status,disabled:f.registration.disabled===!0,lastError:f.lastError,toolCount:f.toolCache?.length??0,updatedAt:f.updatedAt,metadata:f.registration.metadata})).sort((f,$)=>f.name.localeCompare($.name))}async listTools(f){let $=this.requireServer(f),W=$.toolCacheUpdatedAt??0;if($.toolCache&&kf()-W<=this.toolsCacheTtlMs)return $.toolCache;return this.refreshTools(f)}async refreshTools(f){return this.runExclusive(f,async()=>{let $=this.requireServer(f),J=await(await this.ensureConnectedClient($)).listTools(),H=hM(J);return $.toolCache=H,$.toolCacheUpdatedAt=kf(),$.updatedAt=kf(),H})}async callTool(f){return this.runExclusive(f.serverName,async()=>{let $=this.requireServer(f.serverName),W=await this.ensureConnectedClient($);return $.updatedAt=kf(),W.callTool({name:f.toolName,arguments:f.arguments,context:f.context})})}async dispose(){let f=[...this.servers.keys()];for(let $ of f)await this.unregisterServer($)}async ensureConnectedClient(f){if(await this.connectState(f),!f.client)throw Error(`MCP server "${f.registration.name}" does not have an initialized client.`);return f.client}async connectState(f){if(f.registration.disabled)throw Error(`MCP server "${f.registration.name}" is disabled and cannot be connected.`);if(f.status==="connected"&&f.client)return;f.status="connecting",f.updatedAt=kf();try{let $=f.client??await this.clientFactory(f.registration);await $.connect(),f.client=$,f.status="connected",f.lastError=void 0,f.updatedAt=kf()}catch($){throw f.status="disconnected",f.lastError=$ instanceof Error?$.message:String($),f.updatedAt=kf(),$}}async disconnectState(f){if(!f.client){f.status="disconnected",f.updatedAt=kf();return}try{await f.client.disconnect()}finally{f.status="disconnected",f.updatedAt=kf()}}requireServer(f){let $=this.servers.get(f);if(!$)throw Error(`Unknown MCP server: ${f}`);return $}async runExclusive(f,$){let W=this.operationLocks.get(f)??Promise.resolve(),J,H=new Promise((Z)=>{J=Z}),Q=W.catch(()=>{return}).then(()=>H);this.operationLocks.set(f,Q),await W.catch(()=>{return});try{return await $()}finally{if(J?.(),this.operationLocks.get(f)===Q)this.operationLocks.delete(f)}}}import{createHash as KM}from"node:crypto";var rj=128,UM=/[^a-zA-Z0-9_-]+/g,lj=8,MM=1,GM="mcp_tool";function DM(f){return KM("sha1").update(f).digest("hex").slice(0,lj)}function _M(f){return f.replace(UM,"_")}var _6=({serverName:f,toolName:$})=>{let W=`${f}__${$}`,J=_M(W);if(J===W&&W.length<=rj)return W;let H=DM(W),Q=rj-MM-lj;return`${J.slice(0,Q)||GM}_${H}`};function X8(f){return{[(f.nameTransform??_6)({serverName:f.serverName,toolName:f.toolName})]:{enabled:!1}}}function L6(f){let $={};for(let W of f.toolNames)Object.assign($,X8({serverName:f.serverName,toolName:W,nameTransform:f.nameTransform}));return $}import{createTool as LM}from"@clinebot/shared";function OM(f,$){let W=$.description?.trim();if(W)return W;return`Execute MCP tool "${$.name}" from server "${f}".`}async function e1(f){let $=await f.provider.listTools(f.serverName),W=f.nameTransform??_6;return $.map((J)=>{let H=W({serverName:f.serverName,toolName:J.name});return LM({name:H,description:OM(f.serverName,J),inputSchema:J.inputSchema,timeoutMs:f.timeoutMs,retryable:f.retryable,maxRetries:f.maxRetries,execute:async(Q,Z)=>f.provider.callTool({serverName:f.serverName,toolName:J.name,arguments:Q&&typeof Q==="object"&&!Array.isArray(Q)?Q:void 0,context:Z})})})}var aj={};z(aj,{toHookConfigFileName:()=>JW,runSubprocessEvent:()=>f2,runHook:()=>W2,resolveHooksConfigSearchPaths:()=>$W,parseHookEventPayload:()=>$2,mergeAgentHooks:()=>q$,listHookConfigFiles:()=>r0,createSubprocessHooks:()=>z6,createHookConfigFileHooks:()=>HW,createHookConfigFileExtension:()=>L1,createHookAuditHooks:()=>_1,createAgentHooksExtension:()=>G1,HookEventPayloadSchema:()=>C6,HookEventNameSchema:()=>O6,HookConfigFileName:()=>D1,HOOK_CONFIG_FILE_EVENT_MAP:()=>WW,HOOKS_CONFIG_DIRECTORY_NAME:()=>A4});import{HookEventNameSchema as O6,HookEventPayloadSchema as C6,parseHookEventPayload as $2,resolveHookSessionContext as EM}from"@clinebot/shared";import{z as l$}from"zod";import{spawn as CM}from"node:child_process";import{augmentNodeCommandForDebug as zM,withResolvedClineBuildEnv as NM}from"@clinebot/shared";function bM(f){let $=f.trim();if(!$)return{};let J=$.split(`
558
+ `).map((Q)=>Q.trim()).filter(Boolean).filter((Q)=>Q.startsWith("HOOK_CONTROL\t")).map((Q)=>Q.slice(13)),H=J.length>0?J[J.length-1]:$;try{return{parsedJson:JSON.parse(H)}}catch(Q){return{parseError:Q instanceof Error?Q.message:"Failed to parse subprocess stdout JSON"}}}function qM(f,$){let W=f instanceof Error?f:Error(String(f)),J=W,H=$.join(" ");if(J.code==="EACCES")return Error(`Failed to execute hook command "${H}" (EACCES). Configure hooks with an explicit interpreter/command array (for example: ["bash", "/path/to/script"]) or make the script executable with a valid shebang.`);return Error(`Failed to execute hook command "${H}": ${W.message}`)}async function wM(f,$){let W=f.stdin;if(!W)throw Error("runSubprocessEvent failed to create stdin pipe");await new Promise((J,H)=>{let Q=(Z)=>{W.off("error",Q);let P=Z.code;if(P==="EPIPE"||P==="ERR_STREAM_DESTROYED"){J();return}H(Z)};W.once("error",Q),W.end($,(Z)=>{if(W.off("error",Q),Z){let P=Z.code;if(P==="EPIPE"||P==="ERR_STREAM_DESTROYED"){J();return}H(Z);return}J()})})}async function f2(f,$){let W=zM($.command,{env:$.env,debugRole:"hook"});if(!Array.isArray(W)||W.length===0)throw Error("runSubprocessEvent requires a non-empty command");let J=!!$.detached,H=CM(W[0],W.slice(1),{cwd:$.cwd,env:NM($.env),stdio:J?["pipe","ignore","ignore"]:["pipe","pipe","pipe"],detached:J}),Q=new Promise((V)=>{H.once("spawn",()=>{try{$.onSpawn?.({command:W,pid:H.pid??void 0,detached:J})}catch{}V()})}),Z=new Promise((V,B)=>{H.once("error",(T)=>{B(qM(T,W))})});if(await wM(H,JSON.stringify(f)),J){await Promise.race([Q,Z]),H.unref();return}if(!H.stdout||!H.stderr)throw Error("runSubprocessEvent failed to create stdout/stderr pipes");let P="",j="",R=!1,X;H.stdout.on("data",(V)=>{P+=V.toString()}),H.stderr.on("data",(V)=>{j+=V.toString()});let A=new Promise((V)=>{if(($.timeoutMs??0)>0)X=setTimeout(()=>{R=!0,H.kill("SIGKILL")},$.timeoutMs);H.once("close",(B)=>{if(X)clearTimeout(X);let{parsedJson:T,parseError:h}=bM(P);V({exitCode:B,stdout:P,stderr:j,parsedJson:T,parseError:h,timedOut:R})})});return await Promise.race([A,Z])}var SM=l$.object({contextModification:l$.string().optional(),cancel:l$.boolean().optional(),review:l$.boolean().optional(),errorMessage:l$.string().optional(),context:l$.string().optional(),overrideInput:l$.unknown().optional()}).passthrough();var kM=["agent","hook"];async function W2(f,$={}){let W=$.command??kM;return await f2(f,{command:W,cwd:$.cwd,env:$.env,detached:$.detached,timeoutMs:$.timeoutMs,onSpawn:$.onSpawn})}function nj(f){return f instanceof Error?f:Error(String(f))}function mM(f){if(!f||typeof f!=="object")return;let $=SM.safeParse(f);if(!$.success)return;let W=$.data;if(!(("cancel"in W)||("review"in W)||("context"in W)||("contextModification"in W)||("overrideInput"in W)||("errorMessage"in W)))return;let H=typeof W.context==="string"?W.context:typeof W.contextModification==="string"?W.contextModification:typeof W.errorMessage==="string"&&W.errorMessage.length>0?W.errorMessage:void 0;return{cancel:typeof W.cancel==="boolean"?W.cancel:void 0,review:typeof W.review==="boolean"?W.review:void 0,context:H,overrideInput:Object.hasOwn(W,"overrideInput")?W.overrideInput:void 0}}function ij(f){if(!f||typeof f!=="object")return{};let $={};for(let[W,J]of Object.entries(f))if(typeof J==="string")$[W]=J;else $[W]=JSON.stringify(J);return $}function C0(f,$,W){let J=W.env??process.env,H=J.CLINE_USER_ID?.trim()||J.USER?.trim()||"unknown",Q=W.cwd||process.cwd();return{clineVersion:J.CLINE_VERSION?.trim()||"",hookName:f,timestamp:new Date().toISOString(),taskId:$.conversationId,sessionContext:EM(W.sessionContext,{hookName:f,conversationId:$.conversationId,agentId:$.agentId,parentAgentId:$.parentAgentId}),workspaceRoots:Q?[Q]:[],workspaceInfo:W.workspaceInfo,userId:H,agent_id:$.agentId,parent_agent_id:$.parentAgentId}}function gM(f){return{name:f.name,message:f.message,stack:f.stack}}function xM(f){let $=String(f??"").toLowerCase();return $.includes("cancel")||$.includes("abort")||$.includes("interrupt")}function IM(f){return{agentId:f.snapshot.agentId,conversationId:f.snapshot.conversationId??f.snapshot.runId??f.snapshot.agentId,parentAgentId:f.snapshot.parentAgentId??null}}function vM(f){return f.filter(($)=>$.type==="text"&&typeof $.text==="string").map(($)=>$.text).join("")}function uM(f){return{id:f.toolCall.toolCallId,name:f.toolCall.toolName,input:f.input,output:f.result.output,error:f.result.isError?String(f.result.output):void 0,durationMs:f.durationMs,startedAt:f.startedAt,endedAt:f.endedAt}}function cM(f){if(!f)return;let $={};if(f.cancel===!0)$.stop=!0;if(f.overrideInput!==void 0)$.input=f.overrideInput;return Object.keys($).length>0?$:void 0}async function p$(f,$){try{let W=await W2(f,{command:$.command,cwd:$.cwd,env:$.env,detached:!0,onSpawn:$.onSpawn});$.onDispatch?.({payload:f,result:W,detached:!0})}catch(W){$.onDispatchError?.(nj(W),f)}}function z6(f={}){return{hooks:{beforeRun:async(P)=>{let j=IM(P);if((f.env??process.env).CLINE_HOOK_AGENT_RESUME==="1"){let X={...C0("agent_resume",j,f),hookName:"agent_resume",taskResume:{taskMetadata:{},previousState:{}}};await p$(X,f)}else{let X={...C0("agent_start",j,f),hookName:"agent_start",taskStart:{taskMetadata:{}}};await p$(X,f)}return},beforeTool:async(P)=>{let j={agentId:P.snapshot.agentId,conversationId:P.snapshot.conversationId??P.snapshot.runId??P.snapshot.agentId,parentAgentId:P.snapshot.parentAgentId??null},R={...C0("tool_call",j,f),hookName:"tool_call",iteration:P.snapshot.iteration,tool_call:{id:P.toolCall.toolCallId,name:P.toolCall.toolName,input:P.input},preToolUse:{toolName:P.toolCall.toolName,parameters:ij(P.input)}};try{let X=await W2(R,{command:f.command,cwd:f.cwd,env:f.env,detached:!1,timeoutMs:f.timeoutMs,onSpawn:f.onSpawn});if(f.onDispatch?.({payload:R,result:X,detached:!1}),X?.timedOut)throw Error("tool_call hook command timed out");if(X?.parseError)throw Error(`tool_call hook produced invalid control JSON: ${X.parseError}`);return cM(mM(X?.parsedJson))}catch(X){f.onDispatchError?.(nj(X),R);return}},afterTool:async(P)=>{let j=uM(P),R={agentId:P.snapshot.agentId,conversationId:P.snapshot.conversationId??P.snapshot.runId??P.snapshot.agentId,parentAgentId:P.snapshot.parentAgentId??null},X={...C0("tool_result",R,f),hookName:"tool_result",iteration:P.snapshot.iteration,tool_result:j,postToolUse:{toolName:j.name,parameters:ij(j.input),result:typeof j.output==="string"?j.output:JSON.stringify(j.output),success:!j.error,executionTimeMs:j.durationMs}};await p$(X,f);return},afterRun:async({snapshot:P,result:j})=>{let R={agentId:P.agentId,conversationId:P.conversationId??P.runId??P.agentId,parentAgentId:P.parentAgentId??null};if(j.status==="completed"){let V={...C0("agent_end",R,f),hookName:"agent_end",iteration:j.iterations,turn:{outputText:j.outputText,status:j.status},taskComplete:{taskMetadata:{}}};await p$(V,f);return}let X=j.status==="aborted"||xM(j.error?.message)?"agent_abort":"agent_error",A=X==="agent_error"?{...C0(X,R,f),hookName:X,iteration:j.iterations,error:gM(j.error??Error("Agent run failed")),taskCancel:{taskMetadata:{}}}:{...C0(X,R,f),hookName:X,reason:j.error?.message,taskCancel:{taskMetadata:{}}};await p$(A,f)},onEvent:async(P)=>{if(P.type!=="message-added"||P.message.role!=="user")return;let j={agentId:P.snapshot.agentId,conversationId:P.snapshot.conversationId??P.snapshot.runId??P.snapshot.agentId,parentAgentId:P.snapshot.parentAgentId??null},R={...C0("prompt_submit",j,f),hookName:"prompt_submit",userPromptSubmit:{prompt:vM(P.message.content),attachments:[]}};await p$(R,f)}},shutdown:async({agentId:P,conversationId:j,parentAgentId:R,reason:X})=>{let A={...C0("session_shutdown",{agentId:P,conversationId:j,parentAgentId:R},f),hookName:"session_shutdown",reason:X};await p$(A,f)}}}var sR={};z(sR,{writeHubDiscovery:()=>B6,withHubStartupLock:()=>T6,verifyHubConnection:()=>ef,truncateNotificationBody:()=>T8,toHubHealthUrl:()=>K5,stopLocalHubServerGracefully:()=>b5,startHubWebSocketServer:()=>t$,startHubServer:()=>aR,spawnDetachedHubServer:()=>u1,sendHubCommand:()=>$R,restartLocalHubIfIdleAfterStartupTimeout:()=>y6,resolveWorkspaceHubOwnerContext:()=>pP,resolveSharedHubOwnerContext:()=>Hf,resolveHubUrl:()=>W9,resolveHubOwnerContext:()=>D0,resolveHubEndpointOptions:()=>Sf,resolveHubBuildId:()=>$$,resolveDefaultHubPort:()=>v1,resolveDefaultHubPathname:()=>_5,resolveDefaultHubHost:()=>D5,resolveCompatibleLocalHubUrl:()=>eW,resolveClineDir:()=>cP,resolveClineDataDir:()=>aW,requestHubShutdown:()=>oW,rememberRecoverableLocalHubUrl:()=>W$,readHubDiscovery:()=>Zf,probeHubServer:()=>Vf,probeHubConnection:()=>fR,prewarmDetachedHubServer:()=>Y6,normalizeHubWebSocketUrl:()=>J$,isHubReconnectableTransportError:()=>z5,isHubCommandTimeoutError:()=>F6,isDiscoveryFilePresent:()=>rP,ensureHubWebSocketServer:()=>g6,ensureHubServer:()=>tR,ensureDetachedHubServer:()=>nP,ensureCompatibleLocalHubUrl:()=>I$,createLocalHubScheduleRuntimeHandlers:()=>x6,createInMemoryHubOwnerContext:()=>dP,createHubServerUrl:()=>lf,createHubAuthToken:()=>V6,createConfiguredTelemetryService:()=>i$,createConfiguredTelemetryHandle:()=>P2,connectToHub:()=>w6,clearHubDiscovery:()=>Ef,NodeHubClient:()=>pf,NativeHubTransportAdapter:()=>K8,HubUIClient:()=>H9,HubTransportError:()=>Ff,HubSessionClient:()=>J9,HubServerTransport:()=>R2,HubScheduleService:()=>H2,HubScheduleCommandService:()=>J2,HubCommandError:()=>c1,DEFAULT_HUB_PORT:()=>M5,DEFAULT_HUB_PATHNAME:()=>G5,DEFAULT_HUB_HOST:()=>U5,BrowserWebSocketHubAdapter:()=>h8});import{createSessionId as dM}from"@clinebot/shared";function mf(f,$){return{version:f.version,requestId:f.requestId,ok:!0,payload:$}}function tj(f,$,W){return{version:f.version,requestId:f.requestId??dM("hubreq_"),ok:!1,error:{code:$,message:W}}}class J2{schedules;constructor(f){this.schedules=f}async handleCommand(f){try{switch(f.command){case"schedule.create":return mf(f,{schedule:this.schedules.createSchedule(this.toCreateInput(f.payload??{}))});case"schedule.list":return mf(f,{schedules:this.schedules.listSchedules({enabled:typeof f.payload?.enabled==="boolean"?f.payload.enabled:void 0,limit:typeof f.payload?.limit==="number"?f.payload.limit:void 0,tags:Array.isArray(f.payload?.tags)?f.payload?.tags:void 0})});case"schedule.get":return mf(f,{schedule:this.schedules.getSchedule(String(f.payload?.scheduleId??""))});case"schedule.update":return mf(f,{schedule:this.schedules.updateSchedule(String(f.payload?.scheduleId??""),this.toUpdateInput(f.payload??{}))});case"schedule.delete":return mf(f,{deleted:this.schedules.deleteSchedule(String(f.payload?.scheduleId??""))});case"schedule.enable":return mf(f,{schedule:this.schedules.resumeSchedule(String(f.payload?.scheduleId??""))});case"schedule.disable":return mf(f,{schedule:this.schedules.pauseSchedule(String(f.payload?.scheduleId??""))});case"schedule.trigger":return mf(f,{execution:await this.schedules.triggerScheduleNow(String(f.payload?.scheduleId??""))});case"schedule.list_executions":return mf(f,{executions:this.schedules.listScheduleExecutions({scheduleId:typeof f.payload?.scheduleId==="string"?f.payload.scheduleId:void 0,status:typeof f.payload?.status==="string"?f.payload.status:void 0,limit:typeof f.payload?.limit==="number"?f.payload.limit:void 0})});case"schedule.stats":return mf(f,{stats:this.schedules.getScheduleStats(String(f.payload?.scheduleId??""))});case"schedule.active":return mf(f,{executions:this.schedules.getActiveExecutions()});case"schedule.upcoming":return mf(f,{runs:this.schedules.getUpcomingRuns(typeof f.payload?.limit==="number"?f.payload.limit:void 0)});default:return tj(f,"unsupported_command",`Unsupported hub schedule command: ${f.command}`)}}catch($){return tj(f,"schedule_command_failed",$ instanceof Error?$.message:String($))}}toCreateInput(f){let $=f.modelSelection&&typeof f.modelSelection==="object"&&!Array.isArray(f.modelSelection)?f.modelSelection:f.provider&&f.model?{providerId:String(f.provider),modelId:String(f.model)}:void 0;return{...f,modelSelection:$}}toUpdateInput(f){let $=f.modelSelection&&typeof f.modelSelection==="object"&&!Array.isArray(f.modelSelection)?f.modelSelection:f.provider||f.model?{providerId:typeof f.provider==="string"?f.provider:"",modelId:typeof f.model==="string"?f.model:""}:void 0;return{...f,modelSelection:$}}}function b6(f){return f?new Date(f).getTime():void 0}function rM(f){let $=f.metadata?{...f.metadata}:void 0;if($)delete $.__hubScheduleCreatedBy,delete $.__hubScheduleCwd,delete $.__hubRuntimeOptions;return $}function N6(f){let $=f.metadata;return{scheduleId:f.externalId,name:f.title,cronPattern:f.scheduleExpr??"",prompt:f.prompt??"",workspaceRoot:f.workspaceRoot??"",cwd:typeof $?.__hubScheduleCwd==="string"?$.__hubScheduleCwd:void 0,modelSelection:f.providerId||f.modelId?{providerId:f.providerId??"",modelId:f.modelId??""}:void 0,enabled:f.enabled&&!f.removed&&f.parseStatus==="valid",mode:f.mode==="plan"?"plan":f.mode==="yolo"?"yolo":"act",systemPrompt:f.systemPrompt,maxIterations:f.maxIterations,timeoutSeconds:f.timeoutSeconds,maxParallel:f.maxParallel??1,createdAt:new Date(f.createdAt).getTime(),updatedAt:new Date(f.updatedAt).getTime(),nextRunAt:b6(f.nextRunAt),lastRunAt:b6(f.lastRunAt),createdBy:typeof $?.__hubScheduleCreatedBy==="string"?$.__hubScheduleCreatedBy:void 0,tags:f.tags,runtimeOptions:$?.__hubRuntimeOptions&&typeof $.__hubRuntimeOptions==="object"&&!Array.isArray($.__hubRuntimeOptions)?$.__hubRuntimeOptions:void 0,metadata:rM(f)}}function lM(f){switch(f){case"done":return"success";case"cancelled":return"aborted";case"running":return"running";case"queued":return"pending";default:return"failed"}}function sj(f,$){return{executionId:f.runId,scheduleId:$,sessionId:f.sessionId,triggeredAt:new Date(f.scheduledFor??f.createdAt).getTime(),startedAt:b6(f.startedAt),endedAt:b6(f.completedAt),status:lM(f.status),errorMessage:f.error}}class H2{store;materializer;runner;started=!1;disposed=!1;constructor(f){this.store=new pW({dbPath:f.dbPath}),this.materializer=new uW({store:this.store}),this.runner=new cW({store:this.store,materializer:this.materializer,runtimeHandlers:f.runtimeHandlers,workspaceRoot:"",logger:f.logger,pollIntervalMs:f.pollIntervalMs,claimLeaseSeconds:f.claimLeaseSeconds,globalMaxConcurrency:f.globalMaxConcurrency})}async start(){if(this.disposed)throw Error("HubScheduleService has been disposed");if(this.started)return;this.started=!0,await this.runner.start()}async stop(){await this.runner.stop(),this.started=!1}async dispose(){if(this.disposed)return;this.disposed=!0,await this.runner.dispose(),this.store.close()}createSchedule(f){if(J5(f.cronPattern),!f.workspaceRoot?.trim())throw Error("workspaceRoot is required for schedules");return N6(this.store.createHubSchedule(f))}getSchedule(f){let $=this.store.getHubSchedule(f);return $?N6($):void 0}listSchedules(f={}){return this.store.listHubSchedules(f).map(($)=>N6($))}updateSchedule(f,$){if($.cronPattern!==void 0)J5($.cronPattern);let W=this.store.getHubSchedule(f);if(!W)return;let J=$.workspaceRoot!==void 0?$.workspaceRoot.trim():W.workspaceRoot;if(($.enabled??W.enabled)&&!J)throw Error("workspaceRoot is required for enabled schedules");let Q=this.store.updateHubSchedule(f,{...$,scheduleId:f});return Q?N6(Q):void 0}deleteSchedule(f){return this.store.deleteHubSchedule(f)}pauseSchedule(f){return this.updateSchedule(f,{scheduleId:f,enabled:!1})}resumeSchedule(f){return this.updateSchedule(f,{scheduleId:f,enabled:!0})}async triggerScheduleNow(f){let $=this.store.enqueueHubScheduleRun(f,"manual");if(!$)return;await this.runner.tick();let W=this.store.getRun($.runId)??$;return sj(W,f)}listScheduleExecutions(f){let $=f.scheduleId?this.store.getHubSchedule(f.scheduleId):void 0,W={specId:$?.specId,limit:f.limit};return this.store.listRuns(W).map((H)=>{let Q=$??this.store.getSpec(H.specId);if(!Q||Q.source!=="hub-schedule")return;return sj(H,Q.externalId)}).filter((H)=>{if(!H)return!1;return!f.status||H.status===f.status})}getScheduleStats(f){let $=this.listScheduleExecutions({scheduleId:f,limit:1e4});if($.length===0)return{totalRuns:0,successRate:0,avgDurationSeconds:0};let W=0,J=0,H=0,Q;for(let Z of $){if(Z.status==="success"||Z.status==="completed")W+=1;if(!Q&&Z.status!=="success"&&Z.status!=="completed")Q=Z;if(Z.startedAt&&Z.endedAt)H+=Z.endedAt-Z.startedAt,J+=1}return{totalRuns:$.length,successRate:W/$.length,avgDurationSeconds:J>0?H/J/1000:0,lastFailure:Q}}getActiveExecutions(){return this.runner.getActiveRuns().flatMap((f)=>{let $=this.store.getSpec(f.specId);if(!$||$.source!=="hub-schedule"||!f.sessionId)return[];return[{executionId:f.runId,scheduleId:$.externalId,sessionId:f.sessionId,startedAt:f.startedAt??new Date().toISOString(),timeoutAt:$.timeoutSeconds&&f.startedAt?new Date(new Date(f.startedAt).getTime()+$.timeoutSeconds*1000).toISOString():void 0}]})}getUpcomingRuns(f=20){let $={triggerKind:"schedule",enabled:!0,limit:f};return this.store.listSpecs($).flatMap((W)=>W.source==="hub-schedule"&&W.nextRunAt?[{spec:W,nextRunAt:W.nextRunAt}]:[]).sort((W,J)=>String(W.nextRunAt).localeCompare(String(J.nextRunAt))).slice(0,f).map(({spec:W,nextRunAt:J})=>({scheduleId:W.externalId,name:W.title,nextRunAt:J}))}}q6();function TG(f,$){if(f instanceof Error)return f;if(f&&typeof f==="object"&&"message"in f&&typeof f.message==="string"&&f.message.trim())return Error(f.message.trim());let W=f&&typeof f==="object"&&"type"in f&&typeof f.type==="string"?f.type.trim():"";return Error(W?`Failed to connect to hub at ${$} (${W} event before socket open).`:`Failed to connect to hub at ${$}.`)}var YG="cline-hub-auth.";function FG(f){return f.host!==void 0||f.port!==void 0||f.pathname!==void 0}function yG(f,$){let W=new URL(f),J=new URL($);return W.search="",W.hash="",J.search="",J.hash="",W.toString()===J.toString()}async function hG(f){let $=f.searchParams.get("authToken")?.trim();if(f.searchParams.delete("authToken"),$)return $;let W=Hf(),J=await Zf(W.discoveryPath);if(J?.url&&yG(f.toString(),J.url))return J.authToken;return}async function W9(f={}){let $=Sf(f);if(!FG(f)){let W=Hf(),J=await Zf(W.discoveryPath);if(J?.url)return J.url}return lf($.host,$.port,$.pathname)}async function w6(f){return await new Promise(($,W)=>{(async()=>{let J=new URL(f),H=await hG(J);J.hash="";let Q=new WebSocket(J.toString(),H?[`${YG}${H}`]:void 0),Z=new Map,P=0;Q.addEventListener("open",()=>{$({send(j){let R=j.requestId??`hub-client-${++P}`;return new Promise((X,A)=>{Z.set(R,{resolve:X,reject:A});let V={kind:"command",envelope:{...j,requestId:R}};Q.send(JSON.stringify(V))})},close(){Q.close()}})}),Q.addEventListener("message",(j)=>{let R=JSON.parse(String(j.data));if(R.kind==="reply"&&R.envelope.requestId){let X=Z.get(R.envelope.requestId);if(X)Z.delete(R.envelope.requestId),X.resolve(R.envelope)}}),Q.addEventListener("close",()=>{for(let j of Z.values())j.reject(Error("Hub connection closed"));Z.clear()}),Q.addEventListener("error",(j)=>{W(TG(j,f))})})().catch(W)})}async function fR(f){try{return(await w6(f)).close(),!0}catch{return!1}}async function $R(f,$){let W=await W9(f),J=await w6(W);try{return await J.send({version:$.version??"v1",clientId:$.clientId??"hub-client",...$})}finally{J.close()}}function Z0(f){return f?JSON.parse(JSON.stringify(f)):{}}function E6(f){let $=f?.session&&typeof f.session==="object"?f.session:void 0;if(!$)return;let W=$.metadata&&typeof $.metadata==="object"?Z0($.metadata):void 0;return{sessionId:typeof $.sessionId==="string"?$.sessionId:"",parentSessionId:typeof W?.parentSessionId==="string"?W.parentSessionId:void 0,messagesPath:typeof W?.messagesPath==="string"?W.messagesPath:void 0,metadata:W}}function WR(f,$){return f.error?.message??`hub command failed: ${$}`}function KG(f){let $=Z0(f);if(typeof $.error==="string"&&$.error.trim())return{...$,error:$.error.trim()};let W=$.result&&typeof $.result==="object"?$.result:void 0;if(typeof W?.text==="string"&&W.text.trim())return{...$,error:W.text.trim()};let J=W?.error&&typeof W.error==="object"?W.error:void 0;if(typeof J?.message==="string"&&J.message.trim())return{...$,error:J.message.trim()};return $}function UG(f){let $=f?.checkpoint;if(!$||typeof $!=="object"||Array.isArray($))throw Error("hub checkpoint restore returned no checkpoint");let W=$;if(typeof W.ref!=="string"||typeof W.createdAt!=="number"||typeof W.runCount!=="number")throw Error("hub checkpoint restore returned an invalid checkpoint");return W}function MG(f){let $=f.sessionId?.trim();if(!$)return;switch(f.event){case"iteration.started":return{sessionId:$,eventType:"runtime.chat.iteration_start",payload:Z0(f.payload)};case"iteration.finished":return{sessionId:$,eventType:"runtime.chat.iteration_end",payload:Z0(f.payload)};case"assistant.delta":return{sessionId:$,eventType:"runtime.chat.text_delta",payload:Z0(f.payload)};case"tool.started":return{sessionId:$,eventType:"runtime.chat.tool_call_start",payload:Z0(f.payload)};case"tool.finished":return{sessionId:$,eventType:"runtime.chat.tool_call_end",payload:Z0(f.payload)};case"approval.requested":return{sessionId:$,eventType:"approval.requested",payload:Z0(f.payload)};case"run.aborted":return{sessionId:$,eventType:"runtime.chat.aborted",payload:Z0(f.payload)};case"run.failed":return{sessionId:$,eventType:"runtime.chat.failed",payload:KG(f.payload)};case"run.completed":return{sessionId:$,eventType:"runtime.chat.completed",payload:Z0(f.payload)};default:return}}class J9{options;client;metadataApplied=!1;constructor(f){this.options=f;this.client=new pf({url:f.address,authToken:f.authToken,clientId:f.clientId,clientType:f.clientType??"hub-session-client",displayName:f.displayName??"hub session client",workspaceRoot:f.workspaceRoot,cwd:f.cwd})}async ensureMetadataApplied(){if(this.metadataApplied||!this.options.metadata){if(!this.options.metadata)await this.client.connect();return}await this.client.connect(),await this.client.command("client.update",{metadata:this.options.metadata}),this.metadataApplied=!0}async connect(){await this.ensureMetadataApplied()}close(){this.client.close()}async dispose(){await this.client.dispose()}async startRuntimeSession(f){await this.ensureMetadataApplied();let $=await this.client.command("session.create",{workspaceRoot:f.workspaceRoot,cwd:f.cwd,sessionConfig:{providerId:f.provider,modelId:f.model,apiKey:f.apiKey,cwd:f.cwd??f.workspaceRoot,workspaceRoot:f.workspaceRoot,systemPrompt:f.systemPrompt??"",mode:f.mode??"act",rules:f.rules,maxIterations:f.maxIterations,timeoutSeconds:f.timeoutSeconds,enableTools:f.enableTools,enableSpawnAgent:f.enableSpawn!==!1,enableAgentTeams:f.enableTeams!==!1,disableMcpSettingsTools:f.disableMcpSettingsTools,missionLogIntervalSteps:f.missionStepInterval,missionLogIntervalMs:f.missionTimeIntervalMs},metadata:{source:f.source??"cli",provider:f.provider,model:f.model,enableTools:f.enableTools,enableSpawn:f.enableSpawn,enableTeams:f.enableTeams,prompt:void 0,interactive:f.interactive!==!1},runtimeOptions:{mode:f.mode,systemPrompt:f.systemPrompt,maxIterations:f.maxIterations,timeoutSeconds:f.timeoutSeconds,enableTools:f.enableTools,enableSpawn:f.enableSpawn,enableTeams:f.enableTeams,autoApproveTools:f.autoApproveTools,toolExecutors:f.toolExecutors,configExtensions:f.configExtensions},modelSelection:{provider:f.provider,model:f.model,apiKey:f.apiKey},toolPolicies:f.toolPolicies}),W=E6($.payload);if(!W?.sessionId)throw Error("hub session create returned no session id");return{sessionId:W.sessionId,startResult:{sessionId:W.sessionId,manifestPath:"",messagesPath:W.messagesPath??""}}}async sendRuntimeSession(f,$,W){return await this.ensureMetadataApplied(),{result:(await this.client.command("session.send_input",{prompt:$.prompt,attachments:$.attachments,delivery:$.delivery,timeoutSeconds:$.config.timeoutSeconds},f,W)).payload?.result}}async stopRuntimeSession(f){return await this.ensureMetadataApplied(),await this.client.command("session.detach",{sessionId:f},f),{applied:!0}}async abortRuntimeSession(f){return await this.ensureMetadataApplied(),await this.client.command("run.abort",{sessionId:f},f),{applied:!0}}async updateSession(f){return await this.ensureMetadataApplied(),await this.client.command("session.update",{sessionId:f.sessionId,metadata:f.metadata},f.sessionId),{updated:!0}}async getSession(f){await this.ensureMetadataApplied();let $=await this.client.command("session.get",void 0,f);return E6($.payload)}async readMessages(f){let $=f.trim();if(!$)return[];await this.ensureMetadataApplied();let W=await this.client.command("session.messages",{sessionId:$},$);if(!W.ok)throw Error(WR(W,"session.messages"));let J=W.payload?.messages;return Array.isArray(J)?J:[]}async restore(f){let $=f.sessionId.trim();if(!$)throw Error("sessionId is required");let W=f.restore?.messages!==!1;if(W&&!f.config)throw Error("config is required when restore.messages is true");await this.ensureMetadataApplied();let J=f.config,H=await this.client.command("session.restore",{sessionId:$,checkpointRunCount:f.checkpointRunCount,restore:f.restore,...J?{workspaceRoot:J.workspaceRoot,cwd:J.cwd,sessionConfig:{providerId:J.provider,modelId:J.model,apiKey:J.apiKey,cwd:J.cwd??J.workspaceRoot,workspaceRoot:J.workspaceRoot,systemPrompt:J.systemPrompt??"",mode:J.mode??"act",rules:J.rules,maxIterations:J.maxIterations,enableTools:J.enableTools,enableSpawnAgent:J.enableSpawn!==!1,enableAgentTeams:J.enableTeams!==!1,disableMcpSettingsTools:J.disableMcpSettingsTools,missionLogIntervalSteps:J.missionStepInterval,missionLogIntervalMs:J.missionTimeIntervalMs},metadata:{source:J.source??"cli",provider:J.provider,model:J.model,enableTools:J.enableTools,enableSpawn:J.enableSpawn,enableTeams:J.enableTeams,prompt:void 0,interactive:J.interactive!==!1},runtimeOptions:{mode:J.mode,systemPrompt:J.systemPrompt,maxIterations:J.maxIterations,enableTools:J.enableTools,enableSpawn:J.enableSpawn,enableTeams:J.enableTeams,autoApproveTools:J.autoApproveTools,configExtensions:J.configExtensions},modelSelection:{provider:J.provider,model:J.model,apiKey:J.apiKey},toolPolicies:J.toolPolicies}:{}},$);if(!H.ok)throw Error(WR(H,"session.restore"));let Q=E6(H.payload);if(W&&!Q?.sessionId)throw Error("hub checkpoint restore returned no session id");let Z=Array.isArray(H.payload?.messages)?H.payload.messages:void 0,P=UG(H.payload);return{sessionId:Q?.sessionId,startResult:Q?.sessionId?{sessionId:Q.sessionId,manifestPath:"",messagesPath:Q.messagesPath??""}:void 0,...Z?{messages:Z}:{},checkpoint:P}}async listSessions(f){await this.ensureMetadataApplied();let $=await this.client.command("session.list",{limit:f?.limit??200});return(Array.isArray($.payload?.sessions)?$.payload?.sessions:[]).map((J)=>E6({session:J})).filter((J)=>Boolean(J?.sessionId))}async deleteSession(f,$=!0){return await this.ensureMetadataApplied(),(await this.client.command("session.delete",{sessionId:f,deleteCheckpointRefs:$})).payload?.deleted===!0}async respondToolApproval(f){await this.ensureMetadataApplied(),await this.client.command("approval.respond",{approvalId:f.approvalId,approved:f.approved,payload:f.reason?{reason:f.reason}:void 0,responderClientId:f.responderClientId})}streamEvents(f,$){let W=new Set((f.sessionIds??[]).map((H)=>H.trim()).filter(Boolean)),J=this.client.subscribe((H)=>{let Q=MG(H);if(!Q)return;if(W.size>0&&!W.has(Q.sessionId))return;$.onEvent?.(Q)});return this.ensureMetadataApplied().catch((H)=>{$.onError?.(H instanceof Error?H:Error(String(H)))}),J}streamTeamProgress(f,$){let W=this.client.subscribe((J)=>{if(J.event!=="team.progress"||!J.payload)return;$.onProjection?.(J.payload)});return this.ensureMetadataApplied().catch((J)=>{$.onError?.(J instanceof Error?J:Error(String(J)))}),W}async createSchedule(f){return await this.ensureMetadataApplied(),(await this.client.command("schedule.create",f)).payload?.schedule}async listSchedules(f){await this.ensureMetadataApplied();let $=await this.client.command("schedule.list");return Array.isArray($.payload?.schedules)?$.payload?.schedules:[]}async getSchedule(f){return await this.ensureMetadataApplied(),(await this.client.command("schedule.get",{scheduleId:f})).payload?.schedule}async updateSchedule(f,$){return await this.ensureMetadataApplied(),(await this.client.command("schedule.update",{scheduleId:f,...$})).payload?.schedule}async pauseSchedule(f){return await this.ensureMetadataApplied(),(await this.client.command("schedule.disable",{scheduleId:f})).payload?.schedule}async resumeSchedule(f){return await this.ensureMetadataApplied(),(await this.client.command("schedule.enable",{scheduleId:f})).payload?.schedule}async deleteSchedule(f){return await this.ensureMetadataApplied(),(await this.client.command("schedule.delete",{scheduleId:f})).payload?.deleted===!0}async triggerScheduleNow(f){return await this.ensureMetadataApplied(),(await this.client.command("schedule.trigger",{scheduleId:f})).payload?.execution}async listScheduleExecutions(f,$){await this.ensureMetadataApplied();let W=await this.client.command("schedule.list_executions",{scheduleId:f,limit:$});return Array.isArray(W.payload?.executions)?W.payload?.executions:[]}async getScheduleStats(){return await this.ensureMetadataApplied(),(await this.client.command("schedule.stats")).payload?.stats}async getActiveScheduledExecutions(){await this.ensureMetadataApplied();let f=await this.client.command("schedule.active");return Array.isArray(f.payload?.executions)?f.payload?.executions:[]}async getUpcomingScheduledRuns(f){await this.ensureMetadataApplied();let $=await this.client.command("schedule.upcoming",{limit:f});return Array.isArray($.payload?.upcoming)?$.payload?.upcoming:[]}}class H9{client;constructor(f){this.client=new pf({url:f.address,authToken:f.authToken,clientId:f.clientId,clientType:f.clientType??"hub-ui-client",displayName:f.displayName??"hub ui client"})}async connect(){await this.client.connect()}close(){this.client.close()}async dispose(){await this.client.dispose()}getClientId(){return this.client.getClientId()}async sendNotify(f){await this.client.command("ui.notify",f)}async sendShowWindow(f){await this.client.command("ui.show_window",f??{})}async listClients(){let f=await this.client.command("client.list");return Array.isArray(f.payload?.clients)?f.payload.clients:[]}async listSessions(f=200){let $=await this.client.command("session.list",{limit:f});return Array.isArray($.payload?.sessions)?$.payload.sessions:[]}subscribeUI(f){return this.client.subscribe(($)=>{switch($.event){case"ui.notify":f.onNotify?.($.payload);break;case"ui.show_window":f.onShowWindow?.($.payload);break;case"hub.client.registered":f.onClientRegistered?.($.payload??{});break;case"hub.client.disconnected":f.onClientDisconnected?.($.payload??{});break;case"session.created":f.onSessionCreated?.($.payload??{});break;case"session.updated":f.onSessionUpdated?.($.payload??{});break;case"session.detached":f.onSessionDetached?.($.payload??{});break}})}}function GG(f){if(typeof f==="string")return f.trim()||void 0;if(!Array.isArray(f))return;return f.map((W)=>{if(W&&typeof W==="object"&&"type"in W&&W.type==="text"&&"text"in W&&typeof W.text==="string")return W.text.trim();return""}).filter(Boolean).join(`
559
+ `).trim()||void 0}var JR=120,Q9="...";function T8(f){let $=f.trim();if(!$)return"";if(Buffer.byteLength($,"utf8")<=JR)return $;let W=JR-Buffer.byteLength(Q9,"utf8");if(W<=0)return Q9;let J="";for(let H of $){if(Buffer.byteLength(J+H,"utf8")>W)break;J+=H}return`${J}${Q9}`}async function HR(f){let $=f?.sessionId?.trim()||"unknown",W=typeof f?.metadata?.messagesPath==="string"?f.metadata.messagesPath:void 0,H=[...await x$(W)].reverse().find((j)=>j.role==="assistant"),Q=H?GG(H.content):void 0,Z=f?.workspaceRoot?.trim()||"workspace",P=typeof f?.metadata?.prompt==="string"?f.metadata.prompt.trim():Z;return{title:`Task completed (${$})`,body:T8(Q&&Q.length>0?Q:P.length>0?P:Z),severity:"info"}}import{createSessionId as fD}from"@clinebot/shared";import{createSessionId as OG}from"@clinebot/shared";import{createSessionId as LG}from"@clinebot/shared";function DG(f){switch(f){case"completed":return"completed";case"failed":return"failed";case"cancelled":return"aborted";default:return"running"}}function _G(f){let $=f.metadata&&typeof f.metadata==="object"?JSON.parse(JSON.stringify(f.metadata)):{};if(f.parentSessionId?.trim())$.parentSessionId=f.parentSessionId;if(f.parentAgentId?.trim())$.parentAgentId=f.parentAgentId;if(f.agentId?.trim())$.agentId=f.agentId;if(f.conversationId?.trim())$.conversationId=f.conversationId;if(f.messagesPath?.trim())$.messagesPath=f.messagesPath;if(f.prompt?.trim())$.prompt=f.prompt;if(f.provider?.trim())$.provider=f.provider;if(f.model?.trim())$.model=f.model;if(f.source?.trim())$.source=f.source;if(typeof f.pid==="number")$.pid=f.pid;return Object.keys($).length>0?$:void 0}function S6(f,$){return{sessionId:f.sessionId,workspaceRoot:f.workspaceRoot,cwd:f.cwd,createdAt:Date.parse(f.startedAt),updatedAt:Date.parse(f.updatedAt),createdByClientId:$?.createdByClientId??"hub",status:DG(f.status),participants:$?[...$.participants.values()]:[],metadata:_G(f),runtimeOptions:{enableTools:f.enableTools,enableSpawn:f.enableSpawn,enableTeams:f.enableTeams,mode:typeof f.metadata?.mode==="string"?f.metadata.mode:void 0,systemPrompt:typeof f.metadata?.systemPrompt==="string"?f.metadata.systemPrompt:void 0},runtimeSession:f.agentId?{agentId:f.agentId,team:f.teamName?{teamId:f.teamName}:void 0}:void 0}}function v(f,$){return{version:f.version,requestId:f.requestId,ok:!0,...$!==void 0?{payload:$}:{}}}function m(f,$,W){return{version:f.version,requestId:f.requestId,ok:!1,error:{code:$,message:W}}}function k6(f){return f&&typeof f==="object"&&!Array.isArray(f)?f:void 0}function Mf(f){if(typeof f.payload?.sessionId==="string")return f.payload.sessionId.trim();return f.sessionId?.trim()??""}function n$(f,$,W){return{version:"v1",event:f,eventId:LG("hevt_"),sessionId:W,timestamp:Date.now(),payload:$}}async function gf(f,$){let W=await f.sessionHost.getSession($);if(!W)return;return S6(W,f.sessionState.get($))}async function xf(f,$){let W=await f.sessionHost.getSession($);if(!W)return;let[J,H]=await Promise.all([typeof f.sessionHost.readSessionMessages==="function"?f.sessionHost.readSessionMessages($):[],f.sessionHost.getAccumulatedUsage?.($)]);return f0({session:W,messages:J,usage:H})}function m6(f,$,W,J,H={}){let Q=f.sessionState.get($);if(Q){if(H.interactive!==void 0)Q.interactive=H.interactive;if(!Q.participants.has(W))Q.participants.set(W,{clientId:W,attachedAt:Date.now(),role:J});return Q}let Z={createdByClientId:W,interactive:H.interactive??!0,participants:new Map([[W,{clientId:W,attachedAt:Date.now(),role:J}]])};return f.sessionState.set($,Z),Z}async function Z9(f,$){let W=OG("approval_"),J=$.sessionId;if(f.sessionState.get(J)?.interactive===!1)return{approved:!1,reason:"Tool approval requires an interactive session, but this session is non-interactive."};return await new Promise((Q)=>{f.pendingApprovals.set(W,{sessionId:J,resolve:Q}),f.publish(f.buildEvent("approval.requested",{approvalId:W,sessionId:$.sessionId,agentId:$.agentId,conversationId:$.conversationId,iteration:$.iteration,toolCallId:$.toolCallId,toolName:$.toolName,inputJson:JSON.stringify($.input??null),policy:$.policy},J))})}function P9(f,$,W){let J=f.pendingApprovals.get($);if(!J)return;return f.pendingApprovals.delete($),J.resolve(W),{sessionId:J.sessionId}}function j9(f,$,W){let J=0;for(let[H,Q]of[...f.pendingApprovals.entries()]){if(!$({approvalId:H,sessionId:Q.sessionId}))continue;f.pendingApprovals.delete(H),Q.resolve({approved:!1,reason:W}),f.publish(f.buildEvent("approval.resolved",{approvalId:H,approved:!1,cancelled:!0,reason:W},Q.sessionId)),J+=1}return J}async function QR(f,$){let W=typeof $.payload?.approvalId==="string"?$.payload.approvalId.trim():"";if(!f.pendingApprovals.get(W))return m($,"approval_not_found",`Unknown approval: ${W}`);let H=typeof $.payload?.reason==="string"?$.payload.reason:$.payload?.payload&&typeof $.payload.payload==="object"&&!Array.isArray($.payload.payload)&&typeof $.payload.payload.reason==="string"?$.payload.payload.reason:void 0,Q=$.payload?.approved===!0,Z=P9(f,W,{approved:Q,reason:H});if(!Z)return m($,"approval_not_found",`Unknown approval: ${W}`);return f.publish(f.buildEvent("approval.resolved",{approvalId:W,approved:Q,reason:H},Z.sessionId)),v($,{approvalId:W,approved:Q})}import{createSessionId as NG}from"@clinebot/shared";function CG(f){if(f instanceof Error)return{name:f.name,message:f.message,stack:f.stack};if(f===void 0)return;return f}var ZR={debug:10,info:20,warn:30,error:40,silent:50};function zG(){let f=process.env.CLINE_HUB_LOG_LEVEL?.trim().toLowerCase();if(f==="debug"||f==="info"||f==="warn"||f==="error"||f==="silent")return f;return process.env.VITEST?"error":"info"}function x(f,$,W={}){if(ZR[f]<ZR[zG()])return;let J=JSON.stringify({ts:new Date().toISOString(),level:f,component:"hub",message:$,...Object.fromEntries(Object.entries(W).map(([H,Q])=>[H,CG(Q)]).filter(([,H])=>H!==void 0))});if(f==="error"||f==="warn"){console.error(`[hub] ${J}`);return}console.log(`[hub] ${J}`)}function R9(f,$){let W=$ instanceof Error?$.stack||$.message:String($);x("error",f,{error:W})}async function PR(f,$,W,J,H,Q){let Z=NG("capreq_"),P=performance.now();return x("info","capability.request.start",{requestId:Z,sessionId:$,capabilityName:W,targetClientId:H}),await new Promise((j,R)=>{f.pendingCapabilityRequests.set(Z,{sessionId:$,targetClientId:H,capabilityName:W,onProgress:Q,resolve:(X)=>{if(x(X.ok?"info":"warn","capability.request.end",{requestId:Z,sessionId:$,capabilityName:W,targetClientId:H,ok:X.ok,error:X.error,durationMs:Math.round(performance.now()-P)}),!X.ok){R(Error(X.error||`Capability ${W} was rejected by ${H}.`));return}j(X.payload)}}),f.publish(f.buildEvent("capability.requested",{requestId:Z,targetClientId:H,capabilityName:W,payload:J},$)),x("info","capability.request.published",{requestId:Z,sessionId:$,capabilityName:W,targetClientId:H})})}function jR(f,$){let W=typeof $.payload?.requestId==="string"?$.payload.requestId.trim():"",J=f.pendingCapabilityRequests.get(W);if(!J)return m($,"capability_not_found",`Unknown capability request: ${W}`);if(($.clientId?.trim()||"")!==J.targetClientId)return m($,"capability_wrong_client",`Capability request ${W} is owned by ${J.targetClientId}`);if($.sessionId?.trim()&&$.sessionId.trim()!==J.sessionId)return m($,"capability_wrong_session",`Capability request ${W} belongs to session ${J.sessionId}`);let Q=$.payload?.payload&&typeof $.payload.payload==="object"&&!Array.isArray($.payload.payload)?$.payload.payload:{};return J.onProgress?.(Q),v($,{requestId:W})}function Q$(f,$,W){let J=0;for(let[H,Q]of[...f.pendingCapabilityRequests.entries()]){if(!$({requestId:H,...Q}))continue;f.pendingCapabilityRequests.delete(H),x("warn","capability.request.cancelled",{requestId:H,sessionId:Q.sessionId,capabilityName:Q.capabilityName,targetClientId:Q.targetClientId,reason:W}),Q.resolve({ok:!1,error:W}),f.publish(f.buildEvent("capability.resolved",{requestId:H,capabilityName:Q.capabilityName,targetClientId:Q.targetClientId,ok:!1,cancelled:!0,error:W},Q.sessionId)),J+=1}return J}async function RR(f,$){let W=typeof $.payload?.sessionId==="string"?$.payload.sessionId.trim():$.sessionId?.trim()||"",J=typeof $.payload?.capabilityName==="string"?$.payload.capabilityName.trim():"",H=typeof $.payload?.targetClientId==="string"?$.payload.targetClientId.trim():"";if(!W||!J||!H)return m($,"invalid_capability_request","capability.request requires sessionId, capabilityName, and targetClientId");try{let Q=$.payload?.payload&&typeof $.payload.payload==="object"&&!Array.isArray($.payload.payload)?$.payload.payload:{},Z=await f.requestCapability(W,J,Q,H);return v($,Z)}catch(Q){return m($,"capability_request_failed",Q instanceof Error?Q.message:String(Q))}}function XR(f,$){let W=typeof $.payload?.requestId==="string"?$.payload.requestId.trim():"",J=f.pendingCapabilityRequests.get(W);if(!J)return m($,"capability_not_found",`Unknown capability request: ${W}`);let H=$.clientId?.trim()||"";if(H!==J.targetClientId)return m($,"capability_wrong_client",`Capability request ${W} is owned by ${J.targetClientId}`);if($.sessionId?.trim()&&$.sessionId.trim()!==J.sessionId)return m($,"capability_wrong_session",`Capability request ${W} belongs to session ${J.sessionId}`);f.pendingCapabilityRequests.delete(W);let Q=$.payload?.payload&&typeof $.payload.payload==="object"&&!Array.isArray($.payload.payload)?$.payload.payload:void 0,Z=typeof $.payload?.error==="string"?$.payload.error:void 0,P=$.payload?.ok===!0;return x(P?"info":"warn","capability.respond",{requestId:W,sessionId:J.sessionId,capabilityName:J.capabilityName,targetClientId:J.targetClientId,respondedByClientId:H,ok:P,error:Z}),J.resolve({ok:P,payload:Q,error:Z}),f.publish(f.buildEvent("capability.resolved",{requestId:W,capabilityName:J.capabilityName,targetClientId:J.targetClientId,respondedByClientId:H,ok:P,payload:Q,error:Z},J.sessionId)),v($,{requestId:W,ok:P})}import{createSessionId as bG}from"@clinebot/shared";function AR(f,$){let W=$.payload,J=W?.clientId?.trim()||$.clientId?.trim()||bG("client_");return f.clients.set(J,{clientId:J,clientType:W?.clientType??"unknown",displayName:W?.displayName,actorKind:W?.actorKind??"client",connectedAt:Date.now(),lastSeenAt:Date.now(),transport:W?.transport??"native",capabilities:W?.capabilities??[],metadata:W?.metadata,workspaceContext:W?.workspaceContext}),f.publish(f.buildEvent("hub.client.registered",{clientId:J,clientType:W?.clientType??"unknown",displayName:W?.displayName,connectedAt:Date.now()})),v($,{clientId:J})}function VR(f,$){let W=$.clientId?.trim(),J=W?f.clients.get(W):void 0;if(!W||!J)return m($,"client_not_found","Client is not registered with this hub.");let H=k6($.payload?.metadata);if(J.lastSeenAt=Date.now(),H)J.metadata=JSON.parse(JSON.stringify(H));return v($)}function BR(f,$,W){let J=$.clientId?.trim();if(J)f.clients.delete(J),W(J),f.publish(f.buildEvent("hub.client.disconnected",{clientId:J}));return v($)}function TR(f,$){return v($,{clients:[...f.clients.values()]})}var qG=30000;function wG(f){if(f==="aborted")return"run.aborted";if(f==="error"||f==="failed")return"run.failed";return"run.completed"}function EG(f){if(f.finishReason!=="error")return;return f.text.trim()||void 0}function SG(f){let $=typeof f.timeoutMs==="number"?f.timeoutMs:typeof f.timeout_ms==="number"?f.timeout_ms:void 0;if($&&Number.isFinite($)&&$>0)return Math.floor($);let W=typeof f.timeoutSeconds==="number"?f.timeoutSeconds:typeof f.timeout_seconds==="number"?f.timeout_seconds:void 0;if(W&&Number.isFinite(W)&&W>0)return Math.floor(W*1000);return}async function kG(f,$,W,J){let H=performance.now(),Q=!1,Z={command:$.command,requestId:$.requestId,clientId:$.clientId,sessionId:W.sessionId,timeoutMs:J},P=setInterval(()=>{if(Q)return;let X=Math.round(performance.now()-H);x("warn","run.heartbeat",{...Z,elapsedMs:X}),f.publish(f.buildEvent("run.heartbeat",{requestId:$.requestId,elapsedMs:X,...J?{timeoutMs:J}:{}},W.sessionId))},qG),j=f.sessionHost.runTurn(W);j.then((X)=>{if(!Q)return;x("warn","run.late_end",{...Z,elapsedMs:Math.round(performance.now()-H),finishReason:X?.finishReason})},(X)=>{if(!Q)return;x("error","run.late_error",{...Z,elapsedMs:Math.round(performance.now()-H),error:X})});let R;try{if(!J)return await j;return await Promise.race([j,new Promise((X,A)=>{R=setTimeout(()=>{let V=`Hub run ${$.command} timed out after ${J}ms.`;Q=!0,clearInterval(P),A(Error(V)),x("error","run.timeout",{...Z,elapsedMs:Math.round(performance.now()-H)}),j9(f,(B)=>B.sessionId===W.sessionId,V),Q$(f,(B)=>B.sessionId===W.sessionId,V),f.sessionHost.abort(W.sessionId,V).catch((B)=>{x("error","run.timeout_abort_failed",{...Z,error:B})})},J)})])}finally{if(Q=!0,clearInterval(P),R)clearTimeout(R)}}async function YR(f,$){let W=Mf($),J=$.payload&&typeof $.payload==="object"?$.payload:{},H=typeof J.prompt==="string"?J.prompt:typeof J.input==="string"?J.input:"";if(!H.trim())return m($,"invalid_session_input","session input requires a prompt string");f.publish(f.buildEvent("run.started",void 0,W));let Q=J.attachments&&typeof J.attachments==="object"&&!Array.isArray(J.attachments)?J.attachments:void 0,Z=Array.isArray(Q?.userFiles)?Q.userFiles.filter((X)=>typeof X==="string"):void 0,P=SG(J);f.suppressNextTerminalEventBySession.set(W,"run.start.reply");let j;try{j=await kG(f,$,{sessionId:W,prompt:H,delivery:J.delivery==="queue"||J.delivery==="steer"?J.delivery:void 0,userImages:Array.isArray(Q?.userImages)?Q.userImages:void 0,userFiles:Z,timeoutMs:P},P)}catch(X){if(f.suppressNextTerminalEventBySession.get(W)==="run.start.reply")f.suppressNextTerminalEventBySession.delete(W);throw f.publish(f.buildEvent("run.failed",{reason:"error",error:X instanceof Error?X.message:String(X)},W)),X}if(j){let X=await xf(f,W),A=EG(j);if(f.publish(f.buildEvent(wG(j.finishReason),{reason:j.finishReason,...A?{error:A}:{},result:j,...X?{snapshot:X}:{}},W)),f.suppressNextTerminalEventBySession.get(W)==="run.start.reply")f.suppressNextTerminalEventBySession.delete(W)}else f.suppressNextTerminalEventBySession.delete(W);let R=await xf(f,W);return v($,j||R?{...j?{result:j}:{},...R?{snapshot:R}:{}}:void 0)}async function FR(f,$){let W=Mf($),J=typeof $.payload?.reason==="string"?$.payload.reason:"Run was aborted before pending approval or capability request was resolved.";return j9(f,(H)=>H.sessionId===W,J),await f.sessionHost.abort(W,$.payload?.reason),Q$(f,(H)=>H.sessionId===W,J),f.publish(f.buildEvent("run.aborted",{reason:J},W)),v($,{applied:!0})}async function yR(f,$){let W=$2($.payload?.payload);if(!W)return m($,"invalid_hook_payload","session.hook requires a valid hook event payload");return await f.sessionHost.dispatchHookEvent(W),v($,{applied:!0})}async function hR(f,$){switch($.type){case"chunk":return;case"agent_event":mG(f,$);return;case"hook":if($.payload.hookEventName==="tool_call")f.publish(f.buildEvent("tool.started",{toolName:$.payload.toolName},$.payload.sessionId));else if($.payload.hookEventName==="tool_result")f.publish(f.buildEvent("tool.finished",{toolName:$.payload.toolName},$.payload.sessionId));return;case"team_progress":{let W={type:"team_progress_projection",version:1,sessionId:$.payload.sessionId,summary:$.payload.summary,lastEvent:$.payload.lifecycle};f.publish(f.buildEvent("team.progress",W,$.payload.sessionId));return}case"pending_prompts":f.publish(f.buildEvent("session.pending_prompts",{sessionId:$.payload.sessionId,prompts:$.payload.prompts},$.payload.sessionId));return;case"pending_prompt_submitted":{let W={id:$.payload.id,prompt:$.payload.prompt,delivery:$.payload.delivery,attachmentCount:$.payload.attachmentCount};f.publish(f.buildEvent("session.pending_prompt_submitted",{sessionId:$.payload.sessionId,prompt:W},$.payload.sessionId));return}case"session_snapshot":f.publish(f.buildEvent("session.updated",{sessionId:$.payload.sessionId,snapshot:$.payload.snapshot},$.payload.sessionId));return;case"status":{let[W,J]=await Promise.all([gf(f,$.payload.sessionId),xf(f,$.payload.sessionId)]);if(W)f.publish(f.buildEvent("session.updated",{session:W,...J?{snapshot:J}:{}},$.payload.sessionId));return}case"ended":await gG(f,$);return;default:return}}function mG(f,$){let{sessionId:W,event:J}=$.payload;if(J.type==="iteration_start"){f.publish(f.buildEvent("iteration.started",{iteration:J.iteration},W));return}if(J.type==="iteration_end"){f.publish(f.buildEvent("iteration.finished",{iteration:J.iteration,hadToolCalls:J.hadToolCalls,toolCallCount:J.toolCallCount},W));return}if(J.type==="content_start"){if(J.contentType==="text"&&typeof J.text==="string"&&J.text.length>0){f.publish(f.buildEvent("assistant.delta",{text:J.text},W));return}if(J.contentType==="reasoning"){if(J.redacted&&!J.reasoning){f.publish(f.buildEvent("reasoning.delta",{text:"",redacted:!0},W));return}if(typeof J.reasoning==="string"&&J.reasoning.length>0)f.publish(f.buildEvent("reasoning.delta",{text:J.reasoning,redacted:J.redacted===!0},W));return}if(J.contentType==="tool"){f.publish(f.buildEvent("tool.started",{toolCallId:J.toolCallId,toolName:J.toolName,input:J.input},W));return}}if(J.type==="content_end"){switch(J.contentType){case"text":f.publish(f.buildEvent("assistant.finished",{text:J.text},W));break;case"reasoning":f.publish(f.buildEvent("reasoning.finished",{reasoning:J.reasoning},W));break;case"tool":f.publish(f.buildEvent("tool.finished",{toolCallId:J.toolCallId,toolName:J.toolName,output:J.output,error:J.error},W));break}return}if(J.type==="done")f.publish(f.buildEvent("agent.done",{reason:J.reason,text:J.text,iterations:J.iterations,usage:J.usage},W))}async function gG(f,$){let W=f.suppressNextTerminalEventBySession.get($.payload.sessionId),J=W===$.payload.reason||W==="run.start.reply";if(J)f.suppressNextTerminalEventBySession.delete($.payload.sessionId);let[H,Q]=await Promise.all([gf(f,$.payload.sessionId),xf(f,$.payload.sessionId)]);if($.payload.reason==="completed"){let Z=await HR(H);f.publish(f.buildEvent("ui.notify",Z,$.payload.sessionId))}if(J)return;f.publish(f.buildEvent($.payload.reason==="aborted"?"run.aborted":$.payload.reason==="error"||$.payload.reason==="failed"?"run.failed":"run.completed",{reason:$.payload.reason,...Q?{snapshot:Q}:{}},$.payload.sessionId))}import{createSessionId as _R,parseRuntimeConfigExtensions as LR}from"@clinebot/shared";var GR={};z(GR,{SessionVersioningService:()=>Z$,SessionVersioningError:()=>Gf});var MR={};z(MR,{trimMessagesToCheckpoint:()=>UR,trimMessagesBeforeCheckpoint:()=>A9,readSessionCheckpointHistory:()=>Y8,createRestoredCheckpointMetadata:()=>X9,createCheckpointRestorePlan:()=>V9,applyCheckpointToWorktree:()=>B9});import{execFile as xG}from"node:child_process";import{promisify as IG}from"node:util";var j2=IG(xG);function Y8(f){let $=f?.metadata?.checkpoint&&typeof f.metadata.checkpoint==="object"&&!Array.isArray(f.metadata.checkpoint)?f.metadata.checkpoint:void 0;return(Array.isArray($?.history)?$.history:[]).filter((J)=>!!J&&typeof J==="object"&&!Array.isArray(J)).flatMap((J)=>{let H=String(J.ref??"").trim(),Q=Number(J.createdAt??0),Z=Number(J.runCount??0);if(H.length===0||!Number.isFinite(Q)||!Number.isInteger(Z)||Z<1)return[];let P=J.kind==="stash"||J.kind==="commit"?J.kind:void 0;return[{ref:H,createdAt:Q,runCount:Z,...P?{kind:P}:{}}]})}function X9(f,$){let W=Y8(f).filter((H)=>H.runCount<=$),J=W.at(-1);return J?{latest:J,history:W}:void 0}function vG(f,$){return f.reduce((W,J)=>{if(J.runCount>$)return W;if(!W||J.runCount>W.runCount)return J;return W},void 0)}function KR(f,$){let W=0;for(let J=0;J<f.length;J+=1){let H=f[J];if(H?.role!=="user")continue;if(("metadata"in H&&H.metadata&&typeof H.metadata==="object"?H.metadata:void 0)?.kind==="recovery_notice")continue;if(W+=1,W===$)return J}throw Error(`Could not find user message for checkpoint run ${$}`)}function UR(f,$){let W=KR(f,$);return f.slice(0,W+1)}function A9(f,$){let W=KR(f,$);return f.slice(0,W)}function V9(f){let $=f.checkpointRunCount;if(!Number.isInteger($)||$<1)throw Error("checkpointRunCount must be a positive integer");let W=vG(Y8(f.session),$);if(!W)throw Error(`No checkpoint found at or before run ${$} in session ${f.session.sessionId}`);let J=(f.cwd?.trim()||f.session.cwd||f.session.workspaceRoot).trim();if(!J)throw Error("cwd or workspaceRoot is required to restore a checkpoint");return{checkpoint:W,cwd:J,...f.restoreMessages!==!1?{messages:UR(f.messages??[],$)}:{}}}async function B9(f,$){if((await j2("git",["-C",f,"rev-parse","--is-inside-work-tree"],{windowsHide:!0})).stdout.trim()!=="true")throw Error(`${f} is not a git repository`);if(await j2("git",["-C",f,"cat-file","-e",`${$.ref}^{commit}`],{windowsHide:!0}),await j2("git",["-C",f,"reset","--hard"],{windowsHide:!0}),await j2("git",["-C",f,"clean","-fd"],{windowsHide:!0}),$.kind==="commit"){await j2("git",["-C",f,"reset","--hard",$.ref],{windowsHide:!0});return}await j2("git",["-C",f,"stash","apply",$.ref],{windowsHide:!0})}class Gf extends Error{code;constructor(f,$){super($);this.code=f;this.name="SessionVersioningError"}}function uG(f){let $=f.sessionId.trim();if(!$)throw new Gf("invalid_restore","sessionId is required");if(!f.restoreMessages&&!f.restoreWorkspace)throw new Gf("invalid_restore","restore.messages or restore.workspace must be true");if(f.restoreMessages&&f.requiresStart)throw new Gf("invalid_restore","start is required when restore.messages is true");if(!Number.isInteger(f.checkpointRunCount)||f.checkpointRunCount<1)throw new Gf("invalid_restore","checkpointRunCount must be a positive integer");return $}class Z${async restoreCheckpoint(f){let $=f.restore?.messages!==!1,W=f.restore?.workspace!==!1,J=uG({sessionId:f.sessionId,restoreMessages:$,restoreWorkspace:W,requiresStart:f.start===void 0,checkpointRunCount:f.checkpointRunCount}),H=await f.getSession(J);if(!H)throw new Gf("session_not_found",`Session ${J} not found`);let Q=$?await f.readMessages(J):void 0;if($&&Q?.length===0)throw new Gf("session_messages_not_found",`No messages found for session ${J}`);let Z=V9({session:H,messages:Q,checkpointRunCount:f.checkpointRunCount,cwd:f.cwd,restoreMessages:$});if(W)await(f.applyWorkspaceCheckpoint??B9)(Z.cwd,Z.checkpoint);let P=f0({session:H,messages:Q});if(!$)return{checkpoint:Z.checkpoint,sourceSnapshot:P};let j=X9(H,f.checkpointRunCount),R=f.restore?.omitCheckpointMessageFromSession?A9(Q??[],f.checkpointRunCount):Z.messages??[],X={sourceSession:H,sourceMessages:Q,sourceSnapshot:P,plan:Z,restoredCheckpointMetadata:j,initialMessages:R,restoreMessages:$,restoreWorkspace:W,checkpointRunCount:f.checkpointRunCount};if(!f.start||!f.startSession)throw new Gf("invalid_restore","start is required when restore.messages is true");let A=f.buildStartInput?await f.buildStartInput(X,f.start):f.start,V=await f.startSession(A),B=f.getStartedSessionId?.(V);if(B)await(f.retainCheckpointRefs??wQ)(Z.cwd,B,j?.history??[]);let T=B&&f.readRestoredSession?await f.readRestoredSession(B):void 0;return{sessionId:B,startResult:V,messages:Z.messages,checkpoint:Z.checkpoint,sourceSnapshot:P,...T?{restoredSnapshot:f0({session:T,messages:R})}:{}}}}import{HUB_CHECKPOINT_CAPABILITY as Lm,HUB_COMPACTION_CAPABILITY as Om,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as Cm,HUB_HOOK_CAPABILITY_PREFIX as zm,HUB_MISTAKE_LIMIT_CAPABILITY as Nm,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as bm,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as qm,isHubToolExecutorName as cG}from"@clinebot/shared";import{HUB_CHECKPOINT_CAPABILITY as mm,HUB_COMPACTION_CAPABILITY as gm,HUB_CUSTOM_TOOL_CAPABILITY_PREFIX as xm,HUB_HOOK_CAPABILITY_PREFIX as Im,HUB_MISTAKE_LIMIT_CAPABILITY as vm,HUB_TOOL_EXECUTOR_CAPABILITY_PREFIX as um,HUB_USER_INSTRUCTIONS_SNAPSHOT_CAPABILITY as cm}from"@clinebot/shared";var dG=["beforeRun","afterRun","beforeModel","afterModel","beforeTool","afterTool","onEvent"];function a$(f){return f&&typeof f==="object"&&!Array.isArray(f)?JSON.parse(JSON.stringify(f)):void 0}function rG(f,$){let W=typeof f.name==="string"?f.name.trim():"",J=typeof f.description==="string"?f.description:"",H=typeof f.capabilityName==="string"?f.capabilityName.trim():"",Q=a$(f.inputSchema);if(!W||!J||!Q||!H||$.has(H))return;return $.add(H),{kind:"tool",capabilityName:H,name:W,description:J,inputSchema:Q,...a$(f.lifecycle)?{lifecycle:a$(f.lifecycle)}:{}}}function Y9(f){if(!Array.isArray(f))return[];let $=[],W=new Set;for(let J of f){if(!J||typeof J!=="object"||Array.isArray(J))continue;let H=J,Q=H.kind,Z=typeof H.capabilityName==="string"?H.capabilityName.trim():"";if(!Z||W.has(Z))continue;if(Q==="tool"){let P=rG(H,W);if(P)$.push(P);continue}if(Q==="toolExecutor"){let P=H.executor;if(!cG(P))continue;W.add(Z),$.push({kind:"toolExecutor",capabilityName:Z,executor:P});continue}if(Q==="hook"){let P=typeof H.name==="string"?H.name.trim():"";if(!P)continue;W.add(Z),$.push({kind:"hook",capabilityName:Z,name:P});continue}if(Q==="compaction"){W.add(Z),$.push({kind:"compaction",capabilityName:Z,...a$(H.config)?{config:a$(H.config)}:{}});continue}if(Q==="checkpoint"){W.add(Z),$.push({kind:"checkpoint",capabilityName:Z,...a$(H.config)?{config:a$(H.config)}:{}});continue}if(Q==="mistakeLimit"){W.add(Z),$.push({kind:"mistakeLimit",capabilityName:Z});continue}if(Q==="userInstructionService")W.add(Z),$.push({kind:"userInstructionService",capabilityName:Z})}return $}function DR(f){return{agentId:f.agentId,conversationId:f.conversationId,iteration:f.iteration,metadata:f.metadata}}function lG(f){return Object.hasOwn(f,"update")?f.update:f}function F8(f){return f.trim().replace(/^\/+/,"").toLowerCase()}function pG(f){let $=(f??[]).map(F8).filter(Boolean);return $.length>0?new Set($):void 0}function iG(f,$,W){if(!W)return!0;let J=F8(f),H=F8($),Q=J.includes(":")?J.split(":").at(-1)??J:J,Z=H.includes(":")?H.split(":").at(-1)??H:H;return W.has(J)||W.has(H)||W.has(Q)||W.has(Z)}function T9(f,$){let W=pG($);return f.records.skill.map((J)=>({id:J.id,name:J.item.name,description:"description"in J.item&&typeof J.item.description==="string"?J.item.description:void 0,disabled:J.item.disabled===!0,skill:J.item})).filter((J)=>iG(J.id,J.name,W))}function nG(f,$){let W=async(J,H)=>{let Q=F8(J),P=T9(f,$).filter((V)=>V.id===Q||F8(V.name)===Q||V.id.endsWith(`:${Q}`)).filter((V)=>!V.disabled);if(P.length!==1)return P.length>1?`Skill "${J}" is ambiguous. Use one of: ${P.map((V)=>V.id).join(", ")}`:`Skill "${J}" not found.`;let j=P[0].skill,R=H?.trim(),X=R?`
560
+ <command-args>${R}</command-args>`:"",A=j.description?.trim()?`Description: ${j.description.trim()}
561
+
562
+ `:"";return`<command-name>${j.name}</command-name>${X}
563
+ <command-instructions>
564
+ ${A}${j.instructions}
565
+ </command-instructions>`};return Object.defineProperty(W,"configuredSkills",{get:()=>T9(f,$).map(({skill:J,...H})=>H),enumerable:!0}),W}function aG(f,$,W,J){let H={records:{skill:[],rule:[],workflow:[]},runtimeCommands:[]},Q=async()=>{let Z=await J(f,W.capabilityName,{},$);if(Z?.snapshot)H=Z.snapshot};return{start:Q,stop:()=>{},refreshType:async()=>{await Q()},listRecords:(Z)=>[...H.records[Z]],listRuntimeCommands:()=>[...H.runtimeCommands],resolveRuntimeSlashCommand:(Z)=>{if(!Z.startsWith("/")||Z.length<2)return Z;let j=Z.match(/^\/(\S+)/)?.[1];if(!j)return Z;let R=H.runtimeCommands.find((X)=>X.name===j);return R?`${R.instructions}${Z.slice(j.length+1)}`:Z},hasConfiguredSkills:(Z)=>T9(H,Z).some((P)=>!P.disabled),createExtension:(Z)=>({name:"cline-hub-user-instructions",manifest:{capabilities:[Z.includeRules?"rules":void 0,Z.registerSkillsTool?"tools":void 0,Z.includeSkills||Z.includeWorkflows?"commands":void 0].filter((P)=>Boolean(P))},setup(P){if(Z.includeRules)P.registerRule({id:"cline-hub-user-instructions:rules",source:"hub-user-instructions",content:()=>x1(H.records.rule.map((j)=>j.item).filter((j)=>j.disabled!==!0))});if(Z.registerSkillsTool)P.registerTool(A$(nG(H,Z.allowedSkillNames)));for(let j of H.runtimeCommands.filter((R)=>R.kind==="skill"&&Z.includeSkills||R.kind==="workflow"&&Z.includeWorkflows))P.registerCommand({name:j.name,description:j.description,handler:(R)=>{let X=R.trim();return X?`${j.instructions}
566
+
567
+ ${X}`:j.instructions}})}})}}function tG(f,$,W,J){let H=W.map((Q)=>[Q.executor,async(...Z)=>{let P=Z.at(-1),j=Z.slice(0,-1);return(await J(f,Q.capabilityName,{executor:Q.executor,args:j,context:DR(P)},$))?.result}]);return H.length>0?Object.fromEntries(H):void 0}function sG(f,$,W,J){if(W.length===0)return;return W.map((H)=>({name:H.name,description:H.description,inputSchema:H.inputSchema,lifecycle:H.lifecycle,async execute(Q,Z){return(await J(f,H.capabilityName,{toolName:H.name,input:Q,context:DR(Z)},$,Z.emitUpdate?(j)=>{Z.emitUpdate?.(lG(j))}:void 0))?.result}}))}function oG(f,$,W,J){let H=new Map(W.map((Z)=>[Z.name,Z])),Q={};for(let Z of dG){let P=H.get(Z);if(!P)continue;Q[Z]=async(j)=>{return(await J(f,P.capabilityName,{context:j},$))?.control}}return Object.keys(Q).length>0?Q:void 0}function F9(f){let $=f.contributions.filter((j)=>j.kind==="toolExecutor"),W=f.contributions.filter((j)=>j.kind==="tool"),J=f.contributions.filter((j)=>j.kind==="hook"),H=f.contributions.find((j)=>j.kind==="compaction"),Q=f.contributions.find((j)=>j.kind==="checkpoint"),Z=f.contributions.find((j)=>j.kind==="mistakeLimit"),P=f.contributions.find((j)=>j.kind==="userInstructionService");return{hasClientContributions:f.contributions.length>0,toolExecutors:tG(f.sessionId,f.targetClientId,$,f.requestCapability),localRuntime:{...J.length>0?{hooks:oG(f.sessionId,f.targetClientId,J,f.requestCapability)}:{},...W.length>0?{extraTools:sG(f.sessionId,f.targetClientId,W,f.requestCapability)}:{},...H?{compaction:{...f.sessionConfig?.compaction??{},...H.config,compact:async(j)=>{return(await f.requestCapability(f.sessionId,H.capabilityName,{context:j},f.targetClientId))?.result}}}:{},...Q?{checkpoint:{...f.sessionConfig?.checkpoint??{},...Q.config,createCheckpoint:async(j)=>{return(await f.requestCapability(f.sessionId,Q.capabilityName,{context:j},f.targetClientId))?.result}}}:{},...Z?{onConsecutiveMistakeLimitReached:async(j)=>{return(await f.requestCapability(f.sessionId,Z.capabilityName,{context:j},f.targetClientId))?.result}}:{},...P?{userInstructionService:aG(f.sessionId,f.targetClientId,P,f.requestCapability)}:{}}}}var OR="hubCapabilityOwnerClientId";function CR(f,$){f[OR]=$}function eG(f){let $=f?.[OR];return typeof $==="string"&&$.trim()?$.trim():void 0}async function zR(f,$,W){let J=performance.now(),H={command:$.command,requestId:$.requestId,clientId:$.clientId,sessionId:$.sessionId};x("info","session.create.begin",H);let Q=$.payload&&typeof $.payload==="object"?$.payload:{},Z=Q.metadata&&typeof Q.metadata==="object"?JSON.parse(JSON.stringify(Q.metadata)):{},P=Q.sessionConfig&&typeof Q.sessionConfig==="object"?JSON.parse(JSON.stringify(Q.sessionConfig)):void 0,j=Q.runtimeOptions&&typeof Q.runtimeOptions==="object"?Q.runtimeOptions:{};if(typeof P?.mode==="string")Z.mode=P.mode;else if(typeof j.mode==="string")Z.mode=j.mode;if(typeof P?.systemPrompt==="string")Z.systemPrompt=P.systemPrompt;else if(typeof j.systemPrompt==="string")Z.systemPrompt=j.systemPrompt;if(P?.checkpoint?.enabled===!0)Z.checkpointEnabled=!0;else if(j.checkpointEnabled===!0)Z.checkpointEnabled=!0;let R=Q.modelSelection&&typeof Q.modelSelection==="object"?Q.modelSelection:{},X=typeof Q.workspaceRoot==="string"&&Q.workspaceRoot.trim()?Q.workspaceRoot.trim():typeof Q.cwd==="string"&&Q.cwd.trim()?Q.cwd.trim():"";if(!X)return x("warn","session.create.invalid",{...H,reason:"missing_workspace_root"}),m($,"invalid_session_create","session.create requires workspaceRoot or cwd");let A=$.clientId?.trim()||"hub-client",V=Y9(j.clientContributions);if(x("info","session.create.contributions_parsed",{...H,clientId:A,workspaceRoot:X,cwd:typeof Q.cwd==="string"?Q.cwd:void 0,contributionCount:V.length}),V.length>0)CR(Z,A);let T=(typeof P?.sessionId==="string"?P.sessionId.trim():"")||_R(),h=LR(j.configExtensions);x("info","session.create.runtime_build.begin",{...H,sessionId:T,configExtensionCount:h?.length??0});let F=F9({sessionId:T,targetClientId:A,contributions:V,sessionConfig:P,requestCapability:f.requestCapability});x("info","session.create.start_session.begin",{...H,sessionId:T,provider:P?.providerId??(typeof R.provider==="string"?R.provider:typeof Z.provider==="string"?Z.provider:"hub"),model:P?.modelId??(typeof R.model==="string"?R.model:typeof Z.model==="string"?Z.model:"hub")});let Y=await f.sessionHost.startSession({source:typeof Z.source==="string"?Z.source:void 0,interactive:Z.interactive!==!1,sessionMetadata:Object.keys(Z).length>0?Z:void 0,initialMessages:Array.isArray(Q.initialMessages)?Q.initialMessages:void 0,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:h,...F.localRuntime},capabilities:{toolExecutors:F.toolExecutors,requestToolApproval:W},config:{...P??{},sessionId:T,providerId:P?.providerId??(typeof R.provider==="string"?R.provider:typeof Z.provider==="string"?Z.provider:"hub"),modelId:P?.modelId??(typeof R.model==="string"?R.model:typeof Z.model==="string"?Z.model:"hub"),apiKey:P?.apiKey??(typeof R.apiKey==="string"?R.apiKey:void 0),cwd:P?.cwd??(typeof Q.cwd==="string"&&Q.cwd.trim()?Q.cwd.trim():X),workspaceRoot:P?.workspaceRoot??X,systemPrompt:P?.systemPrompt??(typeof j.systemPrompt==="string"?j.systemPrompt:""),mode:P?.mode??(j.mode==="plan"||j.mode==="yolo"?j.mode:"act"),maxIterations:P?.maxIterations??(typeof j.maxIterations==="number"?j.maxIterations:void 0),enableTools:P?.enableTools??j.enableTools!==!1,enableSpawnAgent:P?.enableSpawnAgent??j.enableSpawn!==!1,enableAgentTeams:P?.enableAgentTeams??j.enableTeams!==!1,checkpoint:P?.checkpoint??(j.checkpointEnabled===!0?{enabled:!0}:void 0),teamName:P?.teamName??(typeof Z.teamName==="string"?Z.teamName:void 0)},toolPolicies:Q.toolPolicies&&typeof Q.toolPolicies==="object"&&!Array.isArray(Q.toolPolicies)?JSON.parse(JSON.stringify(Q.toolPolicies)):j.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0});x("info","session.create.start_session.end",{...H,sessionId:Y.sessionId,elapsedMs:Math.round(performance.now()-J),hasImmediateResult:!!Y.result}),m6(f,Y.sessionId,A,"creator",{interactive:Z.interactive!==!1}),x("info","session.create.read_records.begin",{...H,sessionId:Y.sessionId});let[y,D]=await Promise.all([gf(f,Y.sessionId),xf(f,Y.sessionId)]);if(x("info","session.create.read_records.end",{...H,sessionId:Y.sessionId,hasSession:!!y,hasSnapshot:!!D,elapsedMs:Math.round(performance.now()-J)}),y)f.publish(f.buildEvent("session.created",{session:y,...D?{snapshot:D}:{}},Y.sessionId));return x("info","session.create.reply",{...H,sessionId:Y.sessionId,elapsedMs:Math.round(performance.now()-J)}),v($,{session:y,...D?{snapshot:D}:{}})}async function NR(f,$,W){let J=$.payload&&typeof $.payload==="object"?$.payload:{},H=typeof J.sessionId==="string"?J.sessionId.trim():$.sessionId?.trim()||"",Q=J.checkpointRunCount;if(!H)return m($,"invalid_restore","session.restore requires a session id");let Z=J.restore&&typeof J.restore==="object"?J.restore:{},P=Z.messages!==!1;if(typeof Q!=="number")return m($,"invalid_restore","checkpointRunCount must be a positive integer");try{let j=J.sessionConfig&&typeof J.sessionConfig==="object"?JSON.parse(JSON.stringify(J.sessionConfig)):void 0;if(P&&!j)return m($,"invalid_restore","sessionConfig is required when restore.messages is true");let R=J.runtimeOptions&&typeof J.runtimeOptions==="object"?J.runtimeOptions:{},X=J.metadata&&typeof J.metadata==="object"?JSON.parse(JSON.stringify(J.metadata)):{};if(typeof j?.mode==="string")X.mode=j.mode;else if(typeof R.mode==="string")X.mode=R.mode;if(typeof j?.systemPrompt==="string")X.systemPrompt=j.systemPrompt;else if(typeof R.systemPrompt==="string")X.systemPrompt=R.systemPrompt;if(j?.checkpoint?.enabled===!0)X.checkpointEnabled=!0;else if(R.checkpointEnabled===!0)X.checkpointEnabled=!0;let A=J.modelSelection&&typeof J.modelSelection==="object"?J.modelSelection:{},V=$.clientId?.trim()||"hub-client",B=Y9(R.clientContributions);if(B.length>0)CR(X,V);let h=(typeof j?.sessionId==="string"?j.sessionId.trim():"")||_R(),F=LR(R.configExtensions),Y=F9({sessionId:h,targetClientId:V,contributions:B,sessionConfig:j,requestCapability:f.requestCapability}),D=await new Z$().restoreCheckpoint({sessionId:H,checkpointRunCount:Q,restore:{messages:Z.messages,workspace:Z.workspace,omitCheckpointMessageFromSession:Z.omitCheckpointMessageFromSession===!0},start:j,cwd:typeof j?.cwd==="string"&&j.cwd.trim()||typeof j?.workspaceRoot==="string"&&j.workspaceRoot.trim()||void 0,getSession:(O)=>f.sessionHost.getSession(O),readMessages:(O)=>f.sessionHost.readSessionMessages(O),buildStartInput:(O)=>{if(O.restoredCheckpointMetadata)X.checkpoint=O.restoredCheckpointMetadata;let u=typeof J.workspaceRoot==="string"&&J.workspaceRoot.trim()?J.workspaceRoot.trim():typeof J.cwd==="string"&&J.cwd.trim()?J.cwd.trim():O.sourceSession.workspaceRoot||O.sourceSession.cwd;return{source:typeof X.source==="string"?X.source:void 0,interactive:X.interactive!==!1,sessionMetadata:{...X,restoredFromSessionId:H,restoredCheckpointRunCount:Q},initialMessages:O.initialMessages,localRuntime:{modelCatalogDefaults:{loadLatestOnInit:!0,loadPrivateOnAuth:!0},configExtensions:F,...Y.localRuntime},capabilities:{toolExecutors:Y.toolExecutors,requestToolApproval:W},config:{...j??{},sessionId:h,providerId:j?.providerId??(typeof A.provider==="string"?A.provider:O.sourceSession.provider),modelId:j?.modelId??(typeof A.model==="string"?A.model:O.sourceSession.model),apiKey:j?.apiKey??(typeof A.apiKey==="string"?A.apiKey:""),cwd:j?.cwd??O.plan.cwd,workspaceRoot:j?.workspaceRoot??u,systemPrompt:j?.systemPrompt??(typeof R.systemPrompt==="string"?R.systemPrompt:""),mode:j?.mode??(R.mode==="plan"||R.mode==="yolo"?R.mode:"act"),maxIterations:j?.maxIterations??(typeof R.maxIterations==="number"?R.maxIterations:void 0),enableTools:j?.enableTools??R.enableTools!==!1,enableSpawnAgent:j?.enableSpawnAgent??R.enableSpawn!==!1,enableAgentTeams:j?.enableAgentTeams??R.enableTeams!==!1,checkpoint:j?.checkpoint??(R.checkpointEnabled===!0?{enabled:!0}:void 0),teamName:j?.teamName??(typeof X.teamName==="string"?X.teamName:void 0)},toolPolicies:J.toolPolicies&&typeof J.toolPolicies==="object"&&!Array.isArray(J.toolPolicies)?JSON.parse(JSON.stringify(J.toolPolicies)):R.autoApproveTools===!0?{"*":{autoApprove:!0}}:void 0}},startSession:(O)=>f.sessionHost.startSession(O),getStartedSessionId:(O)=>O.sessionId,readRestoredSession:(O)=>f.sessionHost.getSession(O)});if(!P)return v($,{checkpoint:D.checkpoint});let U=D.startResult;if(!U)return m($,"restore_failed","Checkpoint restore did not start a session");m6(f,U.sessionId,V,"creator",{interactive:X.interactive!==!1});let[K,M]=await Promise.all([gf(f,U.sessionId),xf(f,U.sessionId)]);if(K)f.publish(f.buildEvent("session.created",{session:K,...M?{snapshot:M}:{}},U.sessionId));return v($,{session:K,...M?{snapshot:M}:{},messages:D.messages??[],checkpoint:D.checkpoint})}catch(j){if(j instanceof Gf)return m($,j.code,j.code==="session_not_found"?`Unknown session: ${H}`:j.message);return m($,"restore_failed",j instanceof Error?j.message:String(j))}}async function bR(f,$){let W=Mf($);if(!W)return m($,"invalid_session_attach","session.attach requires a session id");m6(f,W,$.clientId?.trim()||"hub-client","participant");let J=await gf(f,W);if(J)f.publish(f.buildEvent("session.attached",{session:J},W));return J?v($,{session:J}):m($,"session_not_found",`Unknown session: ${W}`)}async function qR(f,$){let W=Mf($);if(!W)return m($,"invalid_session_detach","session.detach requires a session id");let J=$.clientId?.trim()||"hub-client",[H]=await Promise.all([gf(f,W)]),Q=eG(H?.metadata)??J,Z=f.sessionState.get(W);if(Z){if(Z.participants.delete(J),Z.createdByClientId===J)Z.createdByClientId=Q;if(Z.participants.size===0)f.sessionState.delete(W)}Q$(f,(R)=>R.sessionId===W&&R.targetClientId===J,`Capability owner client ${J} detached before request was resolved.`);let[P,j]=await Promise.all([gf(f,W),xf(f,W)]);return f.publish(f.buildEvent("session.detached",P?{session:P,...j?{snapshot:j}:{},clientId:J}:{clientId:J},W)),v($)}async function wR(f,$){let W=Mf($),J=$.payload?.includeSnapshot===!0,[H,Q]=await Promise.all([gf(f,W),J?xf(f,W):Promise.resolve(void 0)]);return H?v($,{session:H,...Q?{snapshot:Q}:{}}):m($,"session_not_found",`Unknown session: ${W}`)}async function ER(f,$){let W=Mf($);if(!W)return m($,"invalid_session_id","session.messages requires a session id");if(!await gf(f,W))return m($,"session_not_found",`Unknown session: ${W}`);let H=await f.sessionHost.readSessionMessages(W);return v($,{sessionId:W,messages:H})}async function SR(f,$){let W=typeof $.payload?.limit==="number"?$.payload.limit:200,H=(await f.sessionHost.listSessions(W)).map((Q)=>S6(Q,f.sessionState.get(Q.sessionId)));return v($,{sessions:H})}async function kR(f,$){let W=Mf($),J=k6($.payload?.metadata),H=await f.sessionHost.updateSession(W,{metadata:J}),[Q,Z]=await Promise.all([gf(f,W),xf(f,W)]);if(Q)f.publish(f.buildEvent("session.updated",{session:Q,...Z?{snapshot:Z}:{}},W));return{version:$.version,requestId:$.requestId,ok:H.updated,payload:{updated:H.updated,session:Q,...Z?{snapshot:Z}:{}}}}async function mR(f,$){let W=Mf($),J=await f.sessionHost.deleteSession(W);return f.sessionState.delete(W),v($,{deleted:J})}async function gR(f,$){let W=Mf($),J=f.sessionHost.pendingPrompts;if(!J)return m($,"pending_prompts_unavailable","Pending prompt service is not available.");let H=await J.list({sessionId:W});return v($,{sessionId:W,prompts:H})}async function xR(f,$){let W=Mf($),J=typeof $.payload?.promptId==="string"?$.payload.promptId.trim():"",H=typeof $.payload?.prompt==="string"?$.payload.prompt:void 0,Q=$.payload?.delivery==="queue"||$.payload?.delivery==="steer"?$.payload.delivery:void 0,Z=f.sessionHost.pendingPrompts;if(!Z)return m($,"pending_prompts_unavailable","Pending prompt service is not available.");let P=await Z.update({sessionId:W,promptId:J,prompt:H,delivery:Q});return v($,P)}async function IR(f,$){let W=Mf($),J=typeof $.payload?.promptId==="string"?$.payload.promptId.trim():"",H=f.sessionHost.pendingPrompts;if(!H)return m($,"pending_prompts_unavailable","Pending prompt service is not available.");let Q=await H.delete({sessionId:W,promptId:J});return v($,Q)}function vR(f){switch(f){case"schedule.create":return"schedule.created";case"schedule.update":case"schedule.enable":case"schedule.disable":return"schedule.updated";case"schedule.delete":return"schedule.deleted";case"schedule.trigger":return"schedule.triggered";default:return}}var $D=new Set(["skills","workflows","rules","tools"]);function y9(f){return typeof f==="object"&&f!==null&&!Array.isArray(f)}function y8(f,$){let W=f[$];if(W===void 0)return;if(typeof W!=="string")throw Error(`settings payload '${$}' must be a string.`);return W}function WD(f,$){let W=f[$];if(W===void 0)return;if(typeof W!=="boolean")throw Error(`settings payload '${$}' must be a boolean.`);return W}function uR(f){if(f===void 0)return{};if(!y9(f))throw Error("settings.list payload must be an object.");return{cwd:y8(f,"cwd"),workspaceRoot:y8(f,"workspaceRoot"),availabilityContext:y9(f.availabilityContext)?f.availabilityContext:void 0}}function JD(f){if(!y9(f))throw Error("settings.toggle payload must be an object.");let{type:$}=f;if(typeof $!=="string"||!$D.has($))throw Error("settings.toggle payload 'type' must be one of: skills, workflows, rules, tools.");return{...uR(f),type:$,id:y8(f,"id"),path:y8(f,"path"),name:y8(f,"name"),enabled:WD(f,"enabled")}}class R2{options;clients=new Map;listeners=new Map;sessionState=new Map;pendingApprovals=new Map;pendingCapabilityRequests=new Map;suppressNextTerminalEventBySession=new Map;schedules;scheduleCommands;settings;cronService;sessionHost;hubId=fD("hub_");ctx;constructor(f){this.options=f;if(this.sessionHost=f.sessionHost??new Q0({sessionService:new H0(new W0),fetch:f.fetch,telemetry:f.telemetry}),this.ctx={clients:this.clients,sessionState:this.sessionState,pendingApprovals:this.pendingApprovals,pendingCapabilityRequests:this.pendingCapabilityRequests,suppressNextTerminalEventBySession:this.suppressNextTerminalEventBySession,sessionHost:this.sessionHost,publish:($)=>this.publish($),buildEvent:n$,requestCapability:($,W,J,H,Q)=>PR(this.ctx,$,W,J,H,Q)},this.schedules=new H2({...f.scheduleOptions,runtimeHandlers:f.runtimeHandlers,eventPublisher:($,W)=>{let J=$==="schedule.execution.completed"?"schedule.execution_completed":$==="schedule.execution.failed"?"schedule.execution_failed":void 0;if(!J)return;this.publish(n$(J,W&&typeof W==="object"?W:void 0))}}),this.scheduleCommands=new J2(this.schedules),this.settings=f.settingsService??new o0,f.cronOptions)this.cronService=new iW({runtimeHandlers:f.runtimeHandlers,...f.cronOptions});this.sessionHost.subscribe(($)=>{hR(this.ctx,$).catch((W)=>{R9("session event handling failed",W)})})}getCronService(){return this.cronService}getHubId(){return this.hubId}async start(){if(await this.schedules.start(),this.cronService)try{await this.cronService.start()}catch(f){console.error("[hub] cron service start failed",f)}}async stop(){for(let f of this.pendingApprovals.keys())P9(this.ctx,f,{approved:!1,reason:"Hub shutting down before approval was resolved."});if(Q$(this.ctx,()=>!0,"Hub shutting down before capability request was resolved."),await this.sessionHost.dispose("hub_server_stop"),await this.schedules.dispose(),this.cronService)try{await this.cronService.dispose()}catch(f){console.error("[hub] cron service stop failed",f)}}async handleCommand(f){switch(f.command){case"client.register":return AR(this.ctx,f);case"client.update":return VR(this.ctx,f);case"client.unregister":return BR(this.ctx,f,($)=>{this.listeners.delete($),this.detachClientFromSessions($)});case"client.list":return TR(this.ctx,f);case"session.create":return await zR(this.ctx,f,($)=>Z9(this.ctx,$));case"session.restore":return await NR(this.ctx,f,($)=>Z9(this.ctx,$));case"session.attach":return await bR(this.ctx,f);case"session.detach":return await qR(this.ctx,f);case"session.get":return await wR(this.ctx,f);case"session.messages":return await ER(this.ctx,f);case"session.list":return await SR(this.ctx,f);case"session.update":return await kR(this.ctx,f);case"session.pending_prompts":return await gR(this.ctx,f);case"session.update_pending_prompt":return await xR(this.ctx,f);case"session.remove_pending_prompt":return await IR(this.ctx,f);case"session.delete":return await mR(this.ctx,f);case"session.hook":return await yR(this.ctx,f);case"run.start":case"session.send_input":return await YR(this.ctx,f);case"run.abort":return await FR(this.ctx,f);case"capability.request":return await RR(this.ctx,f);case"approval.respond":return await QR(this.ctx,f);case"capability.respond":return XR(this.ctx,f);case"capability.progress":return jR(this.ctx,f);case"ui.notify":return this.publish(n$("ui.notify",f.payload??{})),v(f);case"ui.show_window":return this.publish(n$("ui.show_window",f.payload??{})),v(f);case"settings.list":return await this.handleSettingsList(f);case"settings.toggle":return await this.handleSettingsToggle(f);case"settings.get":case"settings.patch":return{version:f.version,requestId:f.requestId,ok:!1,error:{code:"not_implemented",message:`${f.command} is not implemented yet.`}};default:{let $=await this.scheduleCommands.handleCommand(f);if($.ok){let W=vR(f.command);if(W)this.publish(n$(W,$.payload))}return $}}}async handleSettingsList(f){try{let $=await this.settings.list(uR(f.payload));return{version:f.version,requestId:f.requestId,ok:!0,payload:{snapshot:$}}}catch($){return{version:f.version,requestId:f.requestId,ok:!1,error:{code:"settings_list_failed",message:$ instanceof Error?$.message:String($)}}}}async handleSettingsToggle(f){try{let $=await this.settings.toggle(JD(f.payload));return this.publish(n$("settings.changed",{types:$.changedTypes,snapshot:$.snapshot})),{version:f.version,requestId:f.requestId,ok:!0,payload:{snapshot:$.snapshot,changedTypes:$.changedTypes}}}catch($){return{version:f.version,requestId:f.requestId,ok:!1,error:{code:"settings_toggle_failed",message:$ instanceof Error?$.message:String($)}}}}subscribe(f,$,W){let J=this.listeners.get(f)??new Set,H={sessionId:W?.sessionId,listener:$};return J.add(H),this.listeners.set(f,J),()=>{let Q=this.listeners.get(f);if(!Q)return;if(Q.delete(H),Q.size===0)this.listeners.delete(f)}}detachClientFromSessions(f){for(let[$,W]of this.sessionState.entries())if(W.participants.delete(f),W.participants.size===0)this.sessionState.delete($);Q$(this.ctx,($)=>$.targetClientId===f,`Capability owner client ${f} disconnected before request was resolved.`)}publish(f){for(let $ of this.listeners.values())for(let W of $){if(W.sessionId&&W.sessionId!==f.sessionId)continue;try{W.listener(f)}catch(J){R9(`listener threw while publishing ${f.event}`,J)}}}}import{timingSafeEqual as PD}from"node:crypto";import jD from"node:http";import RD from"node:net";import{URL as rR}from"node:url";import{WebSocketServer as XD}from"ws";import{HUB_COMMAND_SLOW_LOG_MS as HD,resolveHubCommandTimeoutMs as QD,safeJsonParse as ZD}from"@clinebot/shared";function cR(f){return{command:f.envelope.command,requestId:f.envelope.requestId,clientId:f.envelope.clientId,sessionId:f.envelope.sessionId}}function dR(f,$,W){return{version:f.envelope.version,requestId:f.envelope.requestId,ok:!1,error:{code:$,message:W}}}class h8{transport;constructor(f){this.transport=f}attach(f){let $=new Map,W=new Set,J=!1,H=(j)=>{try{f.send(JSON.stringify(j))}catch(R){console.error(`[hub] failed to send websocket frame: ${R instanceof Error?R.stack||R.message:String(R)}`)}},Q=(j)=>{H({kind:"event",envelope:j})},Z=async(j)=>{try{let R=JSON.parse(j.data);switch(R.kind){case"command":{let X=performance.now(),A=!1,V=cR(R);x("info","command.start",V);let B=setTimeout(()=>{if(A)return;x("warn","command.slow",{...V,elapsedMs:Math.round(performance.now()-X)})},HD),T=this.transport.command(R.envelope);T.then((U)=>{if(!A)return;x(U.ok?"warn":"error","command.late_end",{...V,elapsedMs:Math.round(performance.now()-X),ok:U.ok,errorCode:U.error?.code,errorMessage:U.error?.message})},(U)=>{if(!A)return;x("error","command.late_error",{...V,elapsedMs:Math.round(performance.now()-X),error:U})});let h=!1,F,Y,y=QD(R.envelope.command,R.envelope.timeoutMs);try{Y=y===null?await T:await Promise.race([T,new Promise((U)=>{F=setTimeout(()=>{h=!0,U(dR(R,"hub_command_timeout",`Hub command ${R.envelope.command} did not complete within ${y}ms. Check hub-daemon.log for command.start/command.slow logs with requestId ${R.envelope.requestId}.`))},y)})])}catch(U){if(clearTimeout(B),F)clearTimeout(F);throw U}if(A=h,clearTimeout(B),F)clearTimeout(F);let D=Math.round(performance.now()-X);if(h)x("error","command.timeout",{...V,durationMs:D,timeoutMs:y});else x(Y.ok?"info":"warn","command.end",{...V,durationMs:D,ok:Y.ok,errorCode:Y.error?.code,errorMessage:Y.error?.message});if(R.envelope.command==="client.register"&&Y.ok){let K=(R.envelope.payload??{}).clientId?.trim()||R.envelope.clientId?.trim();if(K)W.add(K)}else if(R.envelope.command==="client.unregister"&&Y.ok){let U=R.envelope.clientId?.trim();if(U)W.delete(U)}H({kind:"reply",envelope:Y});break}case"stream.subscribe":{let X=`${R.clientId}:${R.sessionId??"*"}`;if($.has(X))break;let A=await this.transport.subscribe(R.clientId,Q,{sessionId:R.sessionId});$.set(X,A);break}case"stream.unsubscribe":{let X=`${R.clientId}:${R.sessionId??"*"}`;$.get(X)?.(),$.delete(X);break}case"reply":case"event":break}}catch(R){let X=typeof j.data==="string"?ZD(j.data):void 0;if(!X||X.kind!=="command"){x("error","rejected malformed websocket frame",{error:R});return}x("error","command.error",{...cR(X),error:R}),H({kind:"reply",envelope:dR(X,"command_failed",R instanceof Error?R.message:"Unknown hub error")})}},P=()=>{if(J)return;J=!0;for(let j of $.values())j();$.clear();for(let j of W)this.transport.command({version:"v1",command:"client.unregister",clientId:j});W.clear(),f.removeEventListener("message",Z),f.removeEventListener("close",P)};return f.addEventListener("message",Z),f.addEventListener("close",P),P}}class K8{transport;constructor(f){this.transport=f}command(f){return this.transport.handleCommand(f)}subscribe(f,$,W){return this.transport.subscribe(f,$,W)}}function AD(f){if(typeof f==="string")return f;if(f instanceof Uint8Array)return Buffer.from(f).toString();if(f instanceof ArrayBuffer)return Buffer.from(f).toString();if(Array.isArray(f))return Buffer.concat(f.map(($)=>Buffer.from($))).toString();return String(f)}function VD(f){return{send($){f.send($)},addEventListener($,W){if($==="message"){f.on("message",(J)=>{W({data:AD(J)})});return}f.on("close",W)},removeEventListener(){}}}function BD(f){try{f.write(`HTTP/1.1 400 Bad Request\r
568
+ Connection: close\r
569
+ Content-Length: 0\r
570
+ \r
571
+ `),f.end()}catch{f.destroy()}}function TD(f){try{f.write(`HTTP/1.1 401 Unauthorized\r
572
+ Connection: close\r
573
+ Content-Length: 0\r
574
+ \r
575
+ `),f.end()}catch{f.destroy()}}function lR(f,$){if(!f||!$)return!1;let W=Buffer.from(f,"utf8"),J=Buffer.from($,"utf8");return W.length===J.length&&PD(W,J)}function pR(f,$){let W=f&&typeof f==="object"&&"code"in f&&typeof f.code==="string"?f.code:void 0,J=f instanceof Error?f.message:typeof f==="string"?f:"Unknown startup error",H=`Failed to start hub server on ${$.host}:${$.port}${$.pathname}: ${J}`,Q=Error(W?`${H} (${W})`:H);if(W)f.code=W,Q.code=W;if(f instanceof Error&&f.stack)Q.stack=`${Q.name}: ${Q.message}
576
+ Caused by: ${f.stack}`;return Q}async function YD(f){return await new Promise(($,W)=>{let J=RD.createServer();J.once("error",W),J.listen(0,f,()=>{let H=J.address();if(!H||typeof H==="string"){J.close(()=>W(Error("Failed to resolve free port")));return}let Q=H.port;J.close((Z)=>{if(Z){W(Z);return}$(Q)})})})}function FD(f){return f instanceof Error&&"code"in f&&f.code==="EADDRINUSE"}var h9=new Map,iR="cline-hub-auth.",yD=30000;function nR(f){return Array.isArray(f)?f.join(","):f??""}function hD(f){let $=nR(f).trim();return/^Bearer\s+(.+)$/i.exec($)?.[1]?.trim()||null}function KD(f){for(let $ of nR(f).split(",")){let W=$.trim();if(W.startsWith(iR))return W.slice(iR.length).trim()||null}return null}async function t$(f){let $=f.owner??D0(),W=f.host??"127.0.0.1",J=f.pathname??"/hub",H=f.port??v1(),Q=H===0?await YD(W):H,Z=Q,P=lf(W,Q,J),j=$$(),R=V6(),X=new R2(f);await X.start();let A=new h8(new K8(X)),V=new Set,B=new Date().toISOString(),T={protocolVersion:"v1",buildId:j,pid:process.pid,startedAt:B},h=new Set,F,Y,y=async()=>{if(Y)return Y;return Y=(async()=>{if(F)clearInterval(F),F=void 0;for(let M of h)M.terminate?.();h.clear();for(let M of V)M();if(V.clear(),await new Promise((M,O)=>{U.close((u)=>{if(u){O(u);return}M()})}),await new Promise((M,O)=>{D.close((u)=>{if(u){O(u);return}M()})}),await X.stop(),(await Zf($.discoveryPath))?.url===P)await Ef($.discoveryPath)})(),Y},D=jD.createServer((K,M)=>{if((K.url??"/")==="/health"){let u=JSON.stringify({hubId:X.getHubId(),...T,authToken:"",host:W,port:Z,url:P,updatedAt:new Date().toISOString()});M.statusCode=200,M.setHeader("content-type","application/json"),M.end(u);return}if((K.url??"/")==="/version"){M.statusCode=200,M.setHeader("content-type","application/json"),M.end(JSON.stringify(T));return}if(new rR(K.url??"/",`http://${W}:${Z}`).pathname==="/shutdown"&&K.method==="POST"){if(!lR(hD(K.headers.authorization),R)){M.statusCode=401,M.end("Unauthorized");return}M.statusCode=202,M.setHeader("content-type","application/json"),M.end(JSON.stringify({ok:!0})),queueMicrotask(()=>{y()});return}M.statusCode=404,M.end("Not found")}),U=new XD({noServer:!0});F=setInterval(()=>{for(let K of h){if(K.isAlive===!1){try{K.terminate?.()}catch{}h.delete(K);continue}K.isAlive=!1;try{K.ping?.()}catch{try{K.terminate?.()}catch{}h.delete(K)}}},yD),D.on("upgrade",(K,M,O)=>{if(new rR(K.url??"/",`http://${W}:${Z}`).pathname!==J){M.destroy();return}if(!lR(KD(K.headers["sec-websocket-protocol"]),R)){TD(M);return}try{U.handleUpgrade(K,M,O,(vf)=>{let a=vf;a.isAlive=!0,a.on("pong",()=>{a.isAlive=!0}),h.add(a);let c=A.attach(VD(vf));V.add(c),vf.once("close",()=>{h.delete(a),c(),V.delete(c)})})}catch{BD(M)}});try{await new Promise((K,M)=>{D.once("error",(O)=>{M(pR(O,{host:W,port:Q,pathname:J}))}),D.listen(Q,W,()=>{let O=D.address();if(!O||typeof O==="string"){M(pR(Error("Failed to resolve hub port"),{host:W,port:Q,pathname:J}));return}Z=O.port,P=lf(W,Z,J),K()})})}catch(K){if(F)clearInterval(F),F=void 0;throw await X.stop().catch(()=>{return}),K}return await B6($.discoveryPath,{hubId:X.getHubId(),protocolVersion:"v1",buildId:j,authToken:R,host:W,port:Z,url:P,pid:process.pid,startedAt:B,updatedAt:B}),{host:W,port:Z,url:P,authToken:R,close:y}}async function g6(f){let $=f.owner??D0(),W=f.host!==void 0||f.port!==void 0||f.pathname!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),J=f.host??"127.0.0.1",H=f.port??v1(),Q=f.pathname??"/hub",Z=lf(J,H,Q),P=$.discoveryPath,j=(X)=>{if(!W)W$(X.url,X.authToken);return X},R=h9.get(P);if(R){let X=await R;if(X.url===Z)return j({server:X,url:X.url,authToken:X.authToken,action:"reuse"})}return await T6($.discoveryPath,async()=>{let X=await Zf($.discoveryPath);if(X?.url&&(X.url===Z||f.allowPortFallback===!0)){let T=await Vf(X.url);if(T?.url&&await ef(T.url,{authToken:X.authToken}))return j({url:T.url,authToken:X.authToken,action:"reuse"})}if((await Vf(Z))?.url||X?.url)await Ef($.discoveryPath);let B=async(T)=>{let h=t$({...T,owner:$});h9.set(P,h);try{let F=await h;return j({server:F,url:F.url,authToken:F.authToken,action:"started"})}catch(F){throw h9.delete(P),F}};try{return await B(f)}catch(T){if(!f.allowPortFallback||!FD(T))throw T;return await B({...f,port:0})}})}async function aR(f){let $=Sf({host:f.host,port:f.port,pathname:f.pathname});return await t$({...f,...$,owner:Hf()})}async function tR(f){let $=f.port!==void 0||!!process.env.CLINE_HUB_PORT?.trim(),W=Sf({host:f.host,port:f.port,pathname:f.pathname});return await g6({...f,...W,allowPortFallback:f.allowPortFallback??!$,owner:Hf()})}var QX={};z(QX,{createTeamName:()=>I6,DefaultRuntimeBuilder:()=>V2});import{hasRuntimeConfigExtension as ED}from"@clinebot/shared";import{nanoid as SD}from"nanoid";K0();var JX={};z(JX,{createLocalTeamStore:()=>G9,SqliteTeamStore:()=>s$,FileTeamStore:()=>U8});import{appendFileSync as UD,existsSync as X2,mkdirSync as oR,readdirSync as MD,readFileSync as eR,renameSync as GD,writeFileSync as DD}from"node:fs";import{join as K9}from"node:path";import{resolveTeamDataDir as _D}from"@clinebot/shared/storage";function fX(){return new Date().toISOString()}function U9(f){return f.toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")}function $X(f){return{...f,tasks:f.tasks.map(($)=>({...$,createdAt:new Date($.createdAt),updatedAt:new Date($.updatedAt)})),mailbox:f.mailbox.map(($)=>({...$,sentAt:new Date($.sentAt),readAt:$.readAt?new Date($.readAt):void 0})),missionLog:f.missionLog.map(($)=>({...$,ts:new Date($.ts)})),runs:(f.runs??[]).map(($)=>({...$,startedAt:new Date($.startedAt),endedAt:$.endedAt?new Date($.endedAt):void 0,nextAttemptAt:$.nextAttemptAt?new Date($.nextAttemptAt):void 0,heartbeatAt:$.heartbeatAt?new Date($.heartbeatAt):void 0})),outcomes:(f.outcomes??[]).map(($)=>({...$,createdAt:new Date($.createdAt),finalizedAt:$.finalizedAt?new Date($.finalizedAt):void 0})),outcomeFragments:(f.outcomeFragments??[]).map(($)=>({...$,createdAt:new Date($.createdAt),reviewedAt:$.reviewedAt?new Date($.reviewedAt):void 0}))}}class U8{teamDirPath;constructor(f={}){this.teamDirPath=f.teamDir??_D()}init(){this.ensureTeamDir()}listTeamNames(){if(!X2(this.teamDirPath))return[];return MD(this.teamDirPath,{withFileTypes:!0}).filter((f)=>f.isDirectory()).filter((f)=>X2(this.statePath(f.name))).map((f)=>f.name).sort()}readState(f){let $=this.readEnvelope(f);return $?.teamState?$X($.teamState):void 0}readHistory(f,$=200){let W=this.historyPath(f);if(!X2(W))return[];return eR(W,"utf8").split(`
577
+ `).map((J)=>J.trim()).filter(Boolean).map((J)=>{try{return JSON.parse(J)}catch{return}}).filter((J)=>J!==void 0).reverse().slice(0,$)}loadRuntime(f){let $=this.readEnvelope(f);return{state:$?.teamState?$X($.teamState):void 0,teammates:$?.teammates??[],interruptedRunIds:[]}}handleTeamEvent(f,$){this.ensureTeamSubdir(f),UD(this.historyPath(f),`${JSON.stringify({ts:fX(),eventType:$.type,payload:$})}
578
+ `,"utf8")}persistRuntime(f,$,W){this.ensureTeamSubdir(f);let J={version:1,updatedAt:fX(),teamState:$,teammates:W},H=this.statePath(f),Q=`${H}.tmp`;DD(Q,`${JSON.stringify(J,null,2)}
579
+ `,"utf8"),GD(Q,H)}markInProgressRunsInterrupted(f,$){let W=this.readEnvelope(f);if(!W?.teamState?.runs?.length)return[];let J=W.teamState.runs.filter((Q)=>Q.status==="queued"||Q.status==="running").map((Q)=>Q.id);if(J.length===0)return[];let H=new Date;return W.teamState={...W.teamState,runs:W.teamState.runs.map((Q)=>Q.status==="queued"||Q.status==="running"?{...Q,status:"interrupted",error:$,endedAt:H}:Q)},this.persistRuntime(f,W.teamState,W.teammates),J}ensureTeamDir(){if(!X2(this.teamDirPath))oR(this.teamDirPath,{recursive:!0});return this.teamDirPath}ensureTeamSubdir(f){let $=K9(this.ensureTeamDir(),U9(f));if(!X2($))oR($,{recursive:!0});return $}statePath(f){return K9(this.ensureTeamDir(),U9(f),"state.json")}historyPath(f){return K9(this.ensureTeamDir(),U9(f),"task-history.jsonl")}readEnvelope(f){let $=this.statePath(f);if(!X2($))return;try{let W=JSON.parse(eR($,"utf8"));if(W?.version===1&&W.teamState)return W}catch{}return}}import{existsSync as LD,mkdirSync as OD}from"node:fs";import{join as CD}from"node:path";import{safeJsonParse as WX}from"@clinebot/shared";import{loadSqliteDb as zD,nowIso as M9}from"@clinebot/shared/db";import{resolveDbDataDir as ND}from"@clinebot/shared/storage";function bD(){return ND()}function A2(f){return f.toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")}function qD(f){let $=WX(f);if(!Array.isArray($))return[];let W=[];for(let J of $){if(!J||typeof J!=="object")continue;let H=J,Q=H.agentId,Z=H.rolePrompt;if(typeof Q!=="string"||!Q.trim())continue;if(typeof Z!=="string"||!Z.trim())continue;let P={agentId:Q.trim(),rolePrompt:Z};if(typeof H.modelId==="string"&&H.modelId.trim())P.modelId=H.modelId.trim();if(typeof H.maxIterations==="number"&&Number.isFinite(H.maxIterations))P.maxIterations=Math.max(1,Math.floor(H.maxIterations));W.push(P)}return W}function wD(f){return{...f,tasks:f.tasks.map(($)=>({...$,createdAt:new Date($.createdAt),updatedAt:new Date($.updatedAt)})),mailbox:f.mailbox.map(($)=>({...$,sentAt:new Date($.sentAt),readAt:$.readAt?new Date($.readAt):void 0})),missionLog:f.missionLog.map(($)=>({...$,ts:new Date($.ts)})),runs:(f.runs??[]).map(($)=>({...$,startedAt:new Date($.startedAt),endedAt:$.endedAt?new Date($.endedAt):void 0,nextAttemptAt:$.nextAttemptAt?new Date($.nextAttemptAt):void 0,heartbeatAt:$.heartbeatAt?new Date($.heartbeatAt):void 0})),outcomes:(f.outcomes??[]).map(($)=>({...$,createdAt:new Date($.createdAt),finalizedAt:$.finalizedAt?new Date($.finalizedAt):void 0})),outcomeFragments:(f.outcomeFragments??[]).map(($)=>({...$,createdAt:new Date($.createdAt),reviewedAt:$.reviewedAt?new Date($.reviewedAt):void 0}))}}class s${teamDirPath;db;constructor(f={}){this.teamDirPath=f.teamDir??bD()}init(){this.getRawDb()}ensureTeamDir(){if(!LD(this.teamDirPath))OD(this.teamDirPath,{recursive:!0});return this.teamDirPath}dbPath(){return CD(this.ensureTeamDir(),"teams.db")}getRawDb(){if(this.db)return this.db;let f=zD(this.dbPath());return this.ensureSchema(f),this.db=f,f}ensureSchema(f){if(f.exec("PRAGMA journal_mode = WAL;"),f.exec("PRAGMA busy_timeout = 5000;"),f.exec(`
580
+ CREATE TABLE IF NOT EXISTS team_store_schema_version (
581
+ lock INTEGER PRIMARY KEY CHECK (lock = 1),
582
+ version INTEGER NOT NULL
583
+ );
584
+ `),!f.prepare("SELECT version FROM team_store_schema_version WHERE lock = 1").get())f.prepare("INSERT INTO team_store_schema_version (lock, version) VALUES (1, 1)").run();f.exec(`
585
+ CREATE TABLE IF NOT EXISTS team_events (
586
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
587
+ team_name TEXT NOT NULL,
588
+ ts TEXT NOT NULL,
589
+ event_type TEXT NOT NULL,
590
+ payload_json TEXT NOT NULL,
591
+ causation_id TEXT,
592
+ correlation_id TEXT
593
+ );
594
+ `),f.exec(`
595
+ CREATE INDEX IF NOT EXISTS idx_team_events_name_ts
596
+ ON team_events(team_name, ts DESC);
597
+ `),f.exec(`
598
+ CREATE TABLE IF NOT EXISTS team_runtime_snapshot (
599
+ team_name TEXT PRIMARY KEY,
600
+ state_json TEXT NOT NULL,
601
+ teammates_json TEXT NOT NULL,
602
+ updated_at TEXT NOT NULL
603
+ );
604
+ `),f.exec(`
605
+ CREATE TABLE IF NOT EXISTS team_tasks (
606
+ team_name TEXT NOT NULL,
607
+ task_id TEXT NOT NULL,
608
+ title TEXT NOT NULL,
609
+ description TEXT NOT NULL,
610
+ status TEXT NOT NULL,
611
+ assignee TEXT,
612
+ depends_on_json TEXT NOT NULL,
613
+ summary TEXT,
614
+ version INTEGER NOT NULL DEFAULT 1,
615
+ updated_at TEXT NOT NULL,
616
+ PRIMARY KEY(team_name, task_id)
617
+ );
618
+ `),f.exec(`
619
+ CREATE TABLE IF NOT EXISTS team_runs (
620
+ team_name TEXT NOT NULL,
621
+ run_id TEXT NOT NULL,
622
+ agent_id TEXT NOT NULL,
623
+ task_id TEXT,
624
+ status TEXT NOT NULL,
625
+ message TEXT NOT NULL,
626
+ started_at TEXT,
627
+ ended_at TEXT,
628
+ error TEXT,
629
+ lease_owner TEXT,
630
+ heartbeat_at TEXT,
631
+ version INTEGER NOT NULL DEFAULT 1,
632
+ PRIMARY KEY(team_name, run_id)
633
+ );
634
+ `),f.exec(`
635
+ CREATE INDEX IF NOT EXISTS idx_team_runs_status
636
+ ON team_runs(team_name, status);
637
+ `),f.exec(`
638
+ CREATE TABLE IF NOT EXISTS team_outcomes (
639
+ team_name TEXT NOT NULL,
640
+ outcome_id TEXT NOT NULL,
641
+ title TEXT NOT NULL,
642
+ status TEXT NOT NULL,
643
+ schema_json TEXT NOT NULL,
644
+ finalized_at TEXT,
645
+ version INTEGER NOT NULL DEFAULT 1,
646
+ PRIMARY KEY(team_name, outcome_id)
647
+ );
648
+ `),f.exec(`
649
+ CREATE TABLE IF NOT EXISTS team_outcome_fragments (
650
+ team_name TEXT NOT NULL,
651
+ outcome_id TEXT NOT NULL,
652
+ fragment_id TEXT NOT NULL,
653
+ section TEXT NOT NULL,
654
+ source_agent_id TEXT NOT NULL,
655
+ source_run_id TEXT,
656
+ content TEXT NOT NULL,
657
+ status TEXT NOT NULL,
658
+ reviewed_by TEXT,
659
+ reviewed_at TEXT,
660
+ version INTEGER NOT NULL DEFAULT 1,
661
+ PRIMARY KEY(team_name, fragment_id)
662
+ );
663
+ `)}run(f,$=[]){return this.getRawDb().prepare(f).run(...$)}queryOne(f,$=[]){return this.getRawDb().prepare(f).get(...$)??void 0}queryAll(f,$=[]){return this.getRawDb().prepare(f).all(...$)}withTransaction(f){let $=this.getRawDb();$.exec("BEGIN IMMEDIATE;");try{f(),$.exec("COMMIT;")}catch(W){try{$.exec("ROLLBACK;")}catch{}throw W}}listTeamNames(){return this.queryAll("SELECT team_name FROM team_runtime_snapshot ORDER BY team_name ASC").map((f)=>f.team_name)}readState(f){let $=this.queryOne("SELECT team_name, state_json, teammates_json, updated_at FROM team_runtime_snapshot WHERE team_name = ?",[A2(f)]);if(!$)return;let W=WX($.state_json);if(!W)return;try{return wD(W)}catch{return}}readHistory(f,$=200){return this.queryAll("SELECT event_type, payload_json, ts FROM team_events WHERE team_name = ? ORDER BY id DESC LIMIT ?",[A2(f),$]).flatMap((W)=>{try{return[{eventType:W.event_type,payload:JSON.parse(W.payload_json),ts:W.ts}]}catch{return[]}})}loadRuntime(f){let $=A2(f),W=this.readState($),J=this.queryOne("SELECT team_name, state_json, teammates_json, updated_at FROM team_runtime_snapshot WHERE team_name = ?",[$]),H=J?qD(J.teammates_json):[];return{state:W,teammates:H,interruptedRunIds:[]}}appendTeamEvent(f,$,W,J){this.run(`INSERT INTO team_events (team_name, ts, event_type, payload_json, causation_id, correlation_id)
664
+ VALUES (?, ?, ?, ?, NULL, ?)`,[A2(f),M9(),$,JSON.stringify(W),J??null])}persistRuntime(f,$,W){let J=A2(f),H=M9();this.withTransaction(()=>{this.run(`INSERT INTO team_runtime_snapshot (team_name, state_json, teammates_json, updated_at)
665
+ VALUES (?, ?, ?, ?)
666
+ ON CONFLICT(team_name) DO UPDATE SET
667
+ state_json = excluded.state_json,
668
+ teammates_json = excluded.teammates_json,
669
+ updated_at = excluded.updated_at`,[J,JSON.stringify($),JSON.stringify(W),H]);for(let Q of $.tasks)this.run(`INSERT INTO team_tasks (team_name, task_id, title, description, status, assignee, depends_on_json, summary, version, updated_at)
670
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, ?)
671
+ ON CONFLICT(team_name, task_id) DO UPDATE SET
672
+ title = excluded.title,
673
+ description = excluded.description,
674
+ status = excluded.status,
675
+ assignee = excluded.assignee,
676
+ depends_on_json = excluded.depends_on_json,
677
+ summary = excluded.summary,
678
+ version = team_tasks.version + 1,
679
+ updated_at = excluded.updated_at`,[J,Q.id,Q.title,Q.description,Q.status,Q.assignee??null,JSON.stringify(Q.dependsOn??[]),Q.summary??null,Q.updatedAt.toISOString()]);for(let Q of $.runs??[])this.run(`INSERT INTO team_runs (team_name, run_id, agent_id, task_id, status, message, started_at, ended_at, error, lease_owner, heartbeat_at, version)
680
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)
681
+ ON CONFLICT(team_name, run_id) DO UPDATE SET
682
+ agent_id = excluded.agent_id,
683
+ task_id = excluded.task_id,
684
+ status = excluded.status,
685
+ message = excluded.message,
686
+ started_at = excluded.started_at,
687
+ ended_at = excluded.ended_at,
688
+ error = excluded.error,
689
+ lease_owner = excluded.lease_owner,
690
+ heartbeat_at = excluded.heartbeat_at,
691
+ version = team_runs.version + 1`,[J,Q.id,Q.agentId,Q.taskId??null,Q.status,Q.message,Q.startedAt?Q.startedAt.toISOString():null,Q.endedAt?Q.endedAt.toISOString():null,Q.error??null,Q.leaseOwner??null,Q.heartbeatAt?Q.heartbeatAt.toISOString():null]);for(let Q of $.outcomes??[])this.run(`INSERT INTO team_outcomes (team_name, outcome_id, title, status, schema_json, finalized_at, version)
692
+ VALUES (?, ?, ?, ?, ?, ?, 1)
693
+ ON CONFLICT(team_name, outcome_id) DO UPDATE SET
694
+ title = excluded.title,
695
+ status = excluded.status,
696
+ schema_json = excluded.schema_json,
697
+ finalized_at = excluded.finalized_at,
698
+ version = team_outcomes.version + 1`,[J,Q.id,Q.title,Q.status,JSON.stringify({requiredSections:Q.requiredSections}),Q.finalizedAt?Q.finalizedAt.toISOString():null]);for(let Q of $.outcomeFragments??[])this.run(`INSERT INTO team_outcome_fragments (team_name, outcome_id, fragment_id, section, source_agent_id, source_run_id, content, status, reviewed_by, reviewed_at, version)
699
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)
700
+ ON CONFLICT(team_name, fragment_id) DO UPDATE SET
701
+ outcome_id = excluded.outcome_id,
702
+ section = excluded.section,
703
+ source_agent_id = excluded.source_agent_id,
704
+ source_run_id = excluded.source_run_id,
705
+ content = excluded.content,
706
+ status = excluded.status,
707
+ reviewed_by = excluded.reviewed_by,
708
+ reviewed_at = excluded.reviewed_at,
709
+ version = team_outcome_fragments.version + 1`,[J,Q.outcomeId,Q.id,Q.section,Q.sourceAgentId,Q.sourceRunId??null,Q.content,Q.status,Q.reviewedBy??null,Q.reviewedAt?Q.reviewedAt.toISOString():null])})}markInProgressRunsInterrupted(f,$){let W=A2(f),J=this.queryAll("SELECT run_id FROM team_runs WHERE team_name = ? AND status IN ('queued', 'running')",[W]);if(J.length===0)return[];let H=M9();return this.run(`UPDATE team_runs SET status = 'interrupted', error = ?, ended_at = ?, version = version + 1
710
+ WHERE team_name = ? AND status IN ('queued', 'running')`,[$,H,W]),J.map((Q)=>Q.run_id)}handleTeamEvent(f,$){this.appendTeamEvent(f,$.type,$)}}function G9(f={}){try{let $=new s$(f);return $.init(),$}catch{let $=new U8({teamDir:f.teamDir});return $.init(),$}}function D9(f,$){return ED(f,$)}function kD(f,$){let W=$?.["*"]??{},J=$?.[f]??{};return{...W,...J}.enabled!==!1}function mD(f,$){return f.filter((W)=>kD(W.name,$))}function HX(f,$){return O$(mD(f,$))}function I6(){return`team-${SD(5)}`}function _9(f,$,W,J,H,Q,Z,P){let j=zf[V0({mode:W})],R=P1($,J,W,H??Z1);return HX(K$({cwd:f,...j,enableSkills:!!Z,...R,executors:{...Z?{skills:Z}:{},...P??{}}}),Q)}function gD(f){return _9(f.cwd,f.providerId,f.mode,f.modelId,f.toolRoutingRules,f.toolPolicies,xD,f.toolExecutors).some(($)=>$.name==="skills")}var xD=async()=>"";async function ID(f){let $=H$();if(!s1({filePath:$}))return{tools:[]};let W=new r$({clientFactory:t1()}),J;try{J=await o1(W,{filePath:$})}catch(P){await W.dispose().catch(()=>{});let j=P instanceof Error?P.message:String(P);return f?.log(`[mcp] Failed to load MCP settings, skipping MCP tools: ${j}`),{tools:[]}}let H=J.filter((P)=>P.disabled!==!0),Q=await Promise.allSettled(H.map((P)=>e1({serverName:P.name,provider:W}))),Z=[];for(let[P,j]of Q.entries())if(j.status==="fulfilled")Z.push(...j.value);else{let R=j.reason instanceof Error?j.reason.message:String(j.reason);f?.log(`[mcp] Failed to load tools from MCP server "${H[P].name}", skipping: ${R}`)}return{tools:Z,shutdown:async()=>{await W.dispose()}}}function vD(f,$){if(!f)return;for(let W of f.getTeammateIds())try{f.shutdownTeammate(W,$)}catch{}}function uD(f){if(f===void 0)return!0;switch(f){case"session_stop":case"session_complete":case"session_error":case"session_manager_dispose":case"cli_run_shutdown":case"cli_interactive_shutdown":case"cli_interactive_startup_cancelled":case"provider_change":case"acp_shutdown":case"hub_server_stop":case"vscode_webview_dispose":return!0;default:return!1}}function cD(f){let $=zf[V0({mode:f.mode})];return{sessionId:f.sessionId||"",mode:f.mode==="plan"?"plan":f.mode==="yolo"?"yolo":"act",enableTools:f.enableTools!==!1,enableSpawnAgent:f.enableSpawnAgent??$.enableSpawnAgent??!0,enableAgentTeams:f.enableAgentTeams??$.enableAgentTeams??!0,disableMcpSettingsTools:f.disableMcpSettingsTools===!0,yolo:f.yolo===!0,missionLogIntervalSteps:typeof f.missionLogIntervalSteps==="number"&&Number.isFinite(f.missionLogIntervalSteps)?f.missionLogIntervalSteps:3,missionLogIntervalMs:typeof f.missionLogIntervalMs==="number"&&Number.isFinite(f.missionLogIntervalMs)?f.missionLogIntervalMs:120000}}class V2{teamRuntimeEntries=new Map;async build(f){let{config:$,hooks:W,extensions:J,logger:H,telemetry:Q,createSpawnTool:Z,onTeamRestored:P,userInstructionService:j,configExtensions:R,toolExecutors:X}=f,A=f.onTeamEvent??(()=>{}),V=cD($),B=rf(),T=[],h=$.teamName?.trim()||I6(),F=$.sessionId?.trim()||h,Y=D9(R,"rules"),y=D9(R,"skills"),D=D9(R,"workflows"),U=Y||y||D,K=!1,M=Boolean(j),O=j,u;if(!O&&U)O=s0({skills:{workspacePath:$.cwd},rules:{workspacePath:$.cwd},workflows:{workspacePath:$.cwd}});if(O)await O.start().catch(()=>{});let vf=V.enableTools&&y&&Boolean(O)&&(M||O?.hasConfiguredSkills($.skills)===!0)&&gD({cwd:$.cwd,providerId:$.providerId,mode:V.mode,modelId:$.modelId,toolRoutingRules:$.toolRoutingRules,toolPolicies:$.toolPolicies,toolExecutors:X}),a=O&&U?O.createExtension({includeRules:Y,includeSkills:y,includeWorkflows:D,registerSkillsTool:vf,allowedSkillNames:$.skills}):void 0,c=a?[...J??$.extensions??[],a]:J??$.extensions;if(V.enableTools){if(T.push(..._9($.cwd,$.providerId,V.mode,$.modelId,$.toolRoutingRules,$.toolPolicies,void 0,X)),!V.disableMcpSettingsTools){let r=await ID($.logger);T.push(...r.tools),u=r.shutdown}}let d,e=V.enableAgentTeams?G9():void 0,j0=e?.loadRuntime(F),E=j0?.state,nf=j0?.teammates??[],uf=new Map(nf.map((r)=>[r.agentId,r])),ff=$.sessionId||h,T2,P$=[],j$=!1,e$=R1({providerId:$.providerId,modelId:$.modelId,cwd:$.cwd,apiKey:$.apiKey??"",baseUrl:$.baseUrl,headers:$.headers,providerConfig:$.providerConfig,knownModels:$.knownModels,thinking:$.thinking,maxIterations:$.maxIterations,hooks:W,extensions:c,logger:H??$.logger,telemetry:f.telemetry??$.telemetry,workspaceMetadata:$.workspaceMetadata});if(!this.teamRuntimeEntries.has(ff))this.teamRuntimeEntries.set(ff,{delegatedAgentConfigProvider:e$});let Y2=()=>{if(!V.enableAgentTeams)return;let r=this.teamRuntimeEntries.get(ff)??{delegatedAgentConfigProvider:e$};if(this.teamRuntimeEntries.set(ff,r),d=r.runtime,!d){if(d=new d$({teamName:h,leadAgentId:$.sessionId||"lead",missionLogIntervalSteps:V.missionLogIntervalSteps,missionLogIntervalMs:V.missionLogIntervalMs,onTeamEvent:(s)=>{if(A(s),d&&e){if(s.type==="teammate_spawned"&&s.teammate?.rolePrompt){let R0={agentId:s.agentId,rolePrompt:s.teammate.rolePrompt,modelId:s.teammate.modelId,maxIterations:s.teammate.maxIterations};uf.set(R0.agentId,R0)}if(s.type==="teammate_shutdown"&&!uD(s.reason))uf.delete(s.agentId);e.handleTeamEvent(F,s),e.persistRuntime(F,d.exportState(),Array.from(uf.values()))}}}),E)d.hydrateState(E),j$=!0;r.runtime=d}if(!K){if(!d)return;K=!0;let s=V1({runtime:d,leadAgentId:$.sessionId||"lead",restoredFromPersistence:Boolean(E),restoredTeammates:nf,includeLeadSpawnTool:!0,includeLeadManagementTools:!0,onLeadToolsUnlocked:(R0)=>{P$=R0,T2?.addTools(R0)},createBaseTools:V.enableTools?()=>_9($.cwd,$.providerId,V.mode,$.modelId,$.toolRoutingRules,$.toolPolicies,void 0,X):void 0,teammateConfigProvider:e$});if(j$)d.recoverActiveRuns("runtime_recovered");if(s.restoredFromPersistence)P?.();T.push(...s.tools)}return d};if(V.enableSpawnAgent&&Z){let r=Z();T.push({...r,execute:async(s,R0)=>{return Y2(),r.execute(s,R0)}})}if(V.enableAgentTeams)Y2();let WJ=HX(T,$.toolPolicies),f1=V.enableAgentTeams?()=>{let r=this.teamRuntimeEntries.get(ff)?.runtime;if(!r)return;let s=r.listTasks(),R0=s.some((z0)=>z0.status==="in_progress"||z0.status==="pending"),j3=r.listRuns({}),WA=j3.some((z0)=>z0.status==="running"||z0.status==="queued");if(R0||WA){let z0=s.filter((_f)=>_f.status==="in_progress"||_f.status==="pending").map((_f)=>`${_f.id} (${_f.status}): ${_f.title}`).join(", "),R3=j3.filter((_f)=>_f.status==="running"||_f.status==="queued").map((_f)=>`${_f.id} (${_f.status})`).join(", "),HJ=[];if(z0)HJ.push(`Unfinished tasks: ${z0}`);if(R3)HJ.push(`Active runs: ${R3}`);return`[SYSTEM] You still have team obligations. ${HJ.join(". ")}. Use team_run_task to delegate work, or team_task with action=complete to mark tasks done, or team_await_runs to wait for active runs. Do NOT stop until all tasks are completed.`}return}:void 0,JJ=V.mode==="yolo"&&V.enableTools?{requireCompletionTool:!0,...f1?{completionGuard:f1}:{}}:f1?{completionGuard:f1}:void 0;return{tools:WJ,logger:H??$.logger,telemetry:Q??$.telemetry,teamRuntime:d,teamRestoredFromPersistence:Boolean(E),delegatedAgentConfigProvider:this.teamRuntimeEntries.get(ff)?.delegatedAgentConfigProvider??e$,extensions:c,completionPolicy:JJ,registerLeadAgent:(r)=>{if(T2=r,P$.length>0)r.addTools(O$(P$,[...B]))},shutdown:async(r)=>{if(vD(d,r),this.teamRuntimeEntries.delete(ff),await u?.(),!M)O?.stop()}}}}var PX={};z(PX,{requestDesktopToolApproval:()=>O9});import{mkdir as dD,readFile as rD,unlink as lD,writeFile as pD}from"node:fs/promises";import{join as ZX}from"node:path";function iD(f){return f.replace(/[^a-zA-Z0-9._-]+/g,"_")}function nD(f){return new Promise(($)=>setTimeout($,f))}async function L9(f){try{await lD(f)}catch{}}async function O9(f,$={}){let W=$.approvalDir?.trim(),J=$.sessionId?.trim();if(!W||!J)return{approved:!1,reason:"Desktop tool approval IPC is not configured"};await dD(W,{recursive:!0});let H=iD(`${f.toolCallId}`),Q=ZX(W,`${J}.request.${H}.json`),Z=ZX(W,`${J}.decision.${H}.json`),P=$.nowIso??(()=>new Date().toISOString());await pD(Q,`${JSON.stringify({requestId:H,sessionId:J,createdAt:P(),toolCallId:f.toolCallId,toolName:f.toolName,input:f.input,iteration:f.iteration,agentId:f.agentId,conversationId:f.conversationId},null,2)}
711
+ `,"utf8");let j=$.timeoutMs??300000,R=$.pollIntervalMs??200,X=Date.now();while(Date.now()-X<j){try{let A=await rD(Z,"utf8"),V=JSON.parse(A),B={approved:V.approved===!0,reason:typeof V.reason==="string"?V.reason:void 0};return await Promise.all([L9(Z),L9(Q)]),B}catch{}await nD(R)}return await L9(Q),{approved:!1,reason:"Tool approval request timed out"}}K0();var _X={};z(_X,{updateLocalProvider:()=>l6,saveLocalProviderSettings:()=>S9,saveLocalProviderOAuthCredentials:()=>x9,resolveLocalClineAuthToken:()=>I9,refreshProviderModelsFromSource:()=>k9,normalizeOAuthProvider:()=>m9,loginLocalProvider:()=>g9,listLocalProviders:()=>w9,getProviderConfigFields:()=>v9,getLocalProviderModels:()=>E9,ensureCustomProvidersLoaded:()=>r6,deleteLocalProvider:()=>p6,addLocalProvider:()=>q9});import*as Pf from"@clinebot/llms";import{isOAuthProviderId as F_}from"@clinebot/shared";import{existsSync as aD,mkdirSync as tD,readFileSync as sD,writeFileSync as oD}from"node:fs";import{mkdir as eD,readFile as f_,writeFile as $_}from"node:fs/promises";import{dirname as C9,join as W_}from"node:path";import*as Df from"@clinebot/llms";import{ModelCapabilitySchema as J_,ProviderCapabilitySchema as H_,ProviderClientSchema as Q_,ProviderProtocolSchema as Z_}from"@clinebot/shared";import{z as p}from"zod";var P_=p.object({id:p.string().optional(),name:p.string().optional(),capabilities:p.array(J_).optional(),supportsVision:p.boolean().optional(),supportsAttachments:p.boolean().optional(),supportsReasoning:p.boolean().optional()}).passthrough(),j_=p.object({name:p.string(),baseUrl:p.string(),defaultModelId:p.string().optional(),protocol:Z_.optional(),client:Q_.optional(),capabilities:p.array(H_).optional(),modelsSourceUrl:p.string().optional()}).passthrough(),jX=p.object({provider:j_.optional(),models:p.record(p.string(),P_).optional()}).passthrough(),RX=p.object({version:p.literal(1),providers:p.record(p.string(),jX)}),R_=p.object({version:p.literal(1),providers:p.record(p.string(),p.unknown())}),v6=new Set;function XX(f){return f.split(/[-_]/).filter(Boolean).map(($)=>$.charAt(0).toUpperCase()+$.slice(1)).join(" ")}function o$(f){return W_(C9(f.getFilePath()),"models.json")}function u6(){return{version:1,providers:{}}}function AX(f){let $=R_.safeParse(f);if(!$.success)return u6();let W={};for(let[J,H]of Object.entries($.data.providers)){let Q=jX.safeParse(H);if(Q.success)W[J]=Q.data}return{version:1,providers:W}}function z9(f){if(!aD(f))return u6();try{let $=sD(f,"utf8");return AX(JSON.parse($))}catch{}return u6()}async function B2(f){try{let $=await f_(f,"utf8");return AX(JSON.parse($))}catch{}return u6()}function VX(f,$){tD(C9(f),{recursive:!0});let W=RX.parse($);oD(f,`${JSON.stringify(W,null,2)}
712
+ `,"utf8")}async function c6(f,$){await eD(C9(f),{recursive:!0});let W=RX.parse($);await $_(f,`${JSON.stringify(W,null,2)}
713
+ `,"utf8")}function BX(f,$){return{id:f,name:$.name??f,supportsAttachments:$.capabilities?.includes("files"),supportsVision:$.capabilities?.includes("images"),supportsReasoning:$.capabilities?.includes("reasoning")||$.thinkingConfig!=null}}function TX(f){if(!f||f.length===0)return;let $=new Set;if(f.includes("reasoning"))$.add("reasoning");if(f.includes("prompt-cache"))$.add("prompt-cache");if(f.includes("tools"))$.add("tools");return $.size>0?[...$]:void 0}function YX(f){let $=new Set;if(!f||f.length===0)return[...$];if(f.includes("streaming"))$.add("streaming");if(f.includes("tools"))$.add("tools");if(f.includes("reasoning"))$.add("reasoning");if(f.includes("prompt-cache"))$.add("prompt-cache");if(f.includes("vision"))$.add("images"),$.add("files");return[...$]}function X_(f){return f!=null&&typeof f.name==="string"&&typeof f.baseUrl==="string"}function FX(f,$){return f??$??"openai-chat"}function yX(f,$,W){return f??W??($==="openai-responses"?"openai":"openai-compatible")}function A_(f,$){let W=new Set($?.capabilities??[]);if($?.supportsVision)W.add("images");if($?.supportsAttachments)W.add("files");if($?.supportsReasoning)W.add("reasoning");return{id:f,name:$?.name??f,capabilities:W.size>0?[...W]:void 0}}function V_(f,$){for(let[W,J]of Object.entries($??{})){let H=J.id?.trim()||W.trim();if(!H)continue;Df.registerModel(f,H,A_(H,J))}}function B_(f,$,W){return{...$??{},id:f,name:$?.name??f,capabilities:$?.capabilities??W}}function T_(f){return Object.assign({},...Df.resolveProviderModelCatalogKeys(f).map((W)=>Df.getGeneratedModelsForProvider(W)))}function Y_(f){let $=f.provider.trim();if(!$||Df.isBuiltInProviderId($))return;let W=f.baseUrl?.trim();if(!W)return;let J=Df.MODEL_COLLECTIONS_BY_PROVIDER_ID[$],H=T_($),Q=YX(f.capabilities),Z=Q.length>0?Q:void 0,P=f.model?.trim(),j={...H,...J?.models??{}};if(P)j[P]=B_(P,j[P],Z);let R=Object.keys(j).filter(Boolean),X=P||R[0];if(!X)return;let A=FX(f.protocol,J?.provider.protocol),V=yX(f.client,A,J?.provider.client);Df.registerProvider({provider:{id:$,name:J?.provider.name??XX($),description:J?.provider.description,protocol:A,client:V,baseUrl:W,modelsSourceUrl:J?.provider.modelsSourceUrl,defaultModelId:X,capabilities:TX(f.capabilities)??J?.provider.capabilities,source:"file"},models:j})}function d6(f){for(let $ of Object.values(f.providers))Y_($.settings)}function M8(f,$){let W=$.models??{};if(!X_($.provider)){V_(f,W);return}let J=YX($.provider.capabilities),H=Object.entries(W).map(([R,X])=>({id:X.id?.trim()||R.trim(),model:X})).filter(({id:R})=>R.length>0),Q=$.provider.defaultModelId?.trim()||H[0]?.id||"default",Z=FX($.provider.protocol,void 0),P=yX($.provider.client,Z,void 0),j=Object.fromEntries(H.map(({id:R,model:X})=>[R,{id:R,name:X.name??R,capabilities:J.length>0?J:void 0,status:"active"}]));Df.registerProvider({provider:{id:f,name:$.provider.name.trim()||XX(f),protocol:Z,client:P,baseUrl:$.provider.baseUrl,modelsSourceUrl:$.provider.modelsSourceUrl,defaultModelId:Q,capabilities:TX($.provider.capabilities),source:"file"},models:j})}function hX(f){let $=o$(f);if(v6.has($))return;let W=z9($);for(let[J,H]of Object.entries(W.providers))M8(J,H);v6.add($)}async function r6(f){let $=o$(f);if(v6.has($))return;let W=await B2($);for(let[J,H]of Object.entries(W.providers))M8(J,H);v6.add($)}function y_(f){return f.apiKey??f.auth?.apiKey}function h_(f){return(f.auth?.accessToken?.trim()??"").length>0}function KX(f){return f.split(/[-_]/).filter(Boolean).map(($)=>$.charAt(0).toUpperCase()+$.slice(1)).join(" ")}function K_(f){let $=f.split(/\s+/).filter(Boolean);if($.length===0)return"?";if($.length===1)return $[0].slice(0,2).toUpperCase();return`${$[0][0]}${$[1][0]}`.toUpperCase()}function U_(f){let $=["#c4956a","#6b8aad","#e8963a","#5b9bd5","#6bbd7b","#9b7dd4","#d07f68","#57a6a1"],W=0;for(let J of f)W=W*31+J.charCodeAt(0)>>>0;return $[W%$.length]}function UX(f){return Object.entries(f).sort(([$],[W])=>$.localeCompare(W)).map(([$,W])=>BX($,W))}async function M_(f,$){let W=await Pf.getModelsForProvider(f);if(!$)return W;let J=await XW(f,{loadPrivateOnAuth:!0,failOnError:!1},$);return J?.knownModels?{...W,...J.knownModels}:W}function N9(f){return[...new Set((f??[]).map(($)=>$.trim()).filter(Boolean))]}function MX(f){let $=Object.entries(f??{}).filter(([W])=>W.trim().length>0);return $.length>0?Object.fromEntries($):void 0}function b9(f,$){let W=$?.includes("vision")??!1,J=$?.includes("reasoning")??!1;return Object.fromEntries(f.map((H)=>[H,{id:H,name:H,supportsVision:W,supportsAttachments:W,supportsReasoning:J}]))}async function GX(f){if(!f.shouldRecompute)return f.fallbackModelIds??[];let $=f.modelsSourceUrl?await D4(f.modelsSourceUrl,f.providerId):[];return[...new Set([...f.explicitModels??[],...$])]}function DX(f,$){let W=f.read(),J=!1;if(W.providers[$])delete W.providers[$],J=!0;if(W.lastUsedProvider===$)delete W.lastUsedProvider,J=!0;if(J)f.write(W);Pf.unregisterProvider($)}async function q9(f,$){let W=$.providerId.trim().toLowerCase();if(!W)throw Error("providerId is required");let J=$.baseUrl.trim(),H=$.apiKey?.trim()??"";if(!J&&!H){let T=o$(f);if((await B2(T)).providers[W]){let F=await p6(f,{providerId:W});return{providerId:W,settingsPath:F.settingsPath,modelsPath:F.modelsPath,modelsCount:0}}return DX(f,W),{providerId:W,settingsPath:f.getFilePath(),modelsPath:T,modelsCount:0}}if(Pf.hasProvider(W))throw Error(`provider "${W}" already exists`);let Q=$.name.trim();if(!Q)throw Error("name is required");if(!J)throw Error("baseUrl is required");let Z=N9($.models),P=$.modelsSourceUrl?.trim(),j=await GX({providerId:W,explicitModels:Z,modelsSourceUrl:P,shouldRecompute:!0});if(j.length===0)throw Error("at least one model is required (manual or via modelsSourceUrl)");let R=$.defaultModelId?.trim()&&j.includes($.defaultModelId.trim())?$.defaultModelId.trim():j[0],X=$.capabilities?.length?[...new Set($.capabilities)]:void 0,A=MX($.headers);f.saveProviderSettings({provider:W,apiKey:H||void 0,baseUrl:J,headers:A,timeout:$.timeoutMs,model:R,protocol:$.protocol,client:$.client},{setLastUsed:!1});let V=o$(f),B=await B2(V);return B.providers[W]={provider:{name:Q,baseUrl:J,defaultModelId:R,protocol:$.protocol,client:$.client,capabilities:X,modelsSourceUrl:P},models:b9(j,X)},await c6(V,B),M8(W,B.providers[W]),{providerId:W,settingsPath:f.getFilePath(),modelsPath:V,modelsCount:j.length}}async function l6(f,$){let W=$.providerId.trim().toLowerCase();if(!W)throw Error("providerId is required");let J=o$(f),H=await B2(J),Q=H.providers[W];if(!Q){let U=f.getProviderSettings(W);if(!U)throw Error(`provider "${W}" does not exist`);let K=$.modelsSourceUrl?.trim(),M=N9($.models)[0]??U.model?.trim();if(!M&&!K)throw Error(`provider "${W}" cannot be updated because no model is configured`);Q={provider:{name:$.name?.trim()||KX(W),baseUrl:$.baseUrl?.trim()??U.baseUrl?.trim()??"",defaultModelId:M,protocol:U.protocol,client:U.client,capabilities:U.capabilities},models:M?b9([M],U.capabilities):{}}}if(!Q.provider)throw Error(`provider "${W}" cannot be updated because it is a model overlay (no provider metadata)`);let Z=$.name?.trim()??Q.provider.name.trim();if(!Z)throw Error("name is required");let P=$.baseUrl?.trim()??Q.provider.baseUrl.trim();if(!P)throw Error("baseUrl is required");let j=$.capabilities===void 0?Q.provider.capabilities:$.capabilities===null?void 0:[...new Set($.capabilities)],R=$.protocol===void 0?Q.provider.protocol:$.protocol??void 0,X=$.client===void 0?Q.provider.client:$.client??void 0,A=N9($.models),V=$.modelsSourceUrl===void 0?Q.provider.modelsSourceUrl:$.modelsSourceUrl?.trim()||void 0,B=$.models!==void 0||$.modelsSourceUrl!==void 0&&!!V,T=Object.keys(Q.models??{}).map((U)=>U.trim()).filter(Boolean),h=await GX({providerId:W,explicitModels:A,modelsSourceUrl:V,fallbackModelIds:T,shouldRecompute:B});if(h.length===0)throw Error("at least one model is required (manual or via modelsSourceUrl)");let F=$.defaultModelId===void 0?Q.provider.defaultModelId?.trim():$.defaultModelId?.trim(),Y=F&&h.includes(F)?F:h[0],D={...f.getProviderSettings(W)??{},provider:W,baseUrl:P,model:Y};if(R)D.protocol=R;else delete D.protocol;if(X)D.client=X;else delete D.client;if($.apiKey!==void 0){let U=$.apiKey?.trim()??"";if(U)D.apiKey=U;else delete D.apiKey}if($.headers!==void 0){let U=MX($.headers);if(U)D.headers=U;else delete D.headers}if($.timeoutMs!==void 0)if(typeof $.timeoutMs==="number")D.timeout=$.timeoutMs;else delete D.timeout;return f.saveProviderSettings(D,{setLastUsed:!1}),H.providers[W]={provider:{name:Z,baseUrl:P,defaultModelId:Y,protocol:R,client:X,capabilities:j,modelsSourceUrl:V},models:b9(h,j)},await c6(J,H),M8(W,H.providers[W]),{providerId:W,settingsPath:f.getFilePath(),modelsPath:J,modelsCount:h.length}}async function p6(f,$){let W=$.providerId.trim().toLowerCase();if(!W)throw Error("providerId is required");let J=o$(f),H=await B2(J);if(!H.providers[W])throw Error(`provider "${W}" does not exist`);return delete H.providers[W],await c6(J,H),Pf.unregisterProvider(W),DX(f,W),{providerId:W,settingsPath:f.getFilePath(),modelsPath:J}}async function w9(f){let $=f.read(),W=Pf.getProviderIds().sort((H,Q)=>H.localeCompare(Q));return{providers:await Promise.all(W.map(async(H)=>{let[Q,Z]=await Promise.all([Pf.getProvider(H),Pf.getModelsForProvider(H)]),P=UX(Z),j=$.providers[H]?.settings,R=Q?.name??KX(H);return{id:H,name:R,models:P.length,color:U_(H),letter:K_(R),enabled:Boolean(j),apiKey:j?y_(j):void 0,oauthAccessTokenPresent:j?h_(j):void 0,baseUrl:j?.baseUrl??Q?.baseUrl,defaultModelId:Q?.defaultModelId,protocol:j?.protocol??Q?.protocol,client:j?.client??Q?.client,authDescription:"This provider uses API keys for authentication.",baseUrlDescription:"The base endpoint to use for provider requests.",modelList:P}})),settingsPath:f.getFilePath()}}async function E9(f,$){let W=f.trim(),J=await M_(W,$),H=UX(J);return{providerId:W,models:H}}function S9(f,$){let W=$.providerId.trim();if($.enabled===!1){let Q=f.read();if(delete Q.providers[W],Q.lastUsedProvider===W)delete Q.lastUsedProvider;return f.write(Q),{providerId:W,enabled:!1,settingsPath:f.getFilePath()}}let H={...f.getProviderSettings(W)??{},provider:W};for(let Q of["apiKey","baseUrl","model","region"])if(Object.hasOwn($,Q)&&typeof $[Q]==="string")if($[Q].trim().length===0)delete H[Q];else H[Q]=$[Q];for(let Q of["maxTokens","contextWindow","timeout","apiLine","protocol","client","routingProviderId","capabilities"])if(Object.hasOwn($,Q))H[Q]=$[Q];for(let Q of["auth","headers","reasoning","aws","gcp","azure","sap","oca"])if(Object.hasOwn($,Q)&&$[Q]!=null)H[Q]={...typeof H[Q]==="object"&&H[Q]!=null?H[Q]:{},...$[Q]};return f.saveProviderSettings(H,{setLastUsed:!1}),{providerId:W,enabled:!0,settingsPath:f.getFilePath()}}async function k9(f,$){let W=$.trim(),J=f.getProviderSettings(W),Q=Pf.MODEL_COLLECTIONS_BY_PROVIDER_ID[W]?.provider,Z=J?.baseUrl?.trim()||Q?.baseUrl?.trim(),P=_4(Z,Q?.baseUrl,Q?.modelsSourceUrl);if(!J||!Q||!Z||!P)return{providerId:W,refreshed:!1};let j=await l6(f,{providerId:W,name:Q.name,baseUrl:Z,apiKey:J.apiKey,headers:J.headers??null,timeoutMs:J.timeout??null,modelsSourceUrl:P,protocol:J.protocol??Q.protocol??null,client:J.client??Q.client??null,capabilities:J.capabilities??null});return{providerId:W,refreshed:!0,modelsCount:j.modelsCount}}function m9(f){let $=f.trim().toLowerCase();if($==="codex"||$==="openai-codex")return"openai-codex";if($==="cline"||$==="oca")return $;throw Error(`provider "${f}" does not support OAuth login (supported: cline, oca, openai-codex)`)}function G_(f,$){if(f==="cline")return $.access.startsWith("workos:")?$.access:`workos:${$.access}`;return $.access}async function g9(f,$,W){let J=KW({onPrompt:async(H)=>H.defaultValue??"",openUrl:W,onOpenUrlError:({error:H})=>{throw H instanceof Error?H:Error(String(H))}});if(f==="cline")return k1({apiBaseUrl:$?.baseUrl?.trim()||"https://api.cline.bot",useWorkOSDeviceAuth:!0,callbacks:J});if(f==="oca")return z1({mode:$?.oca?.mode,callbacks:J});return m1(J)}function x9(f,$,W,J){let H={...W?.auth??{},accessToken:G_($,J),refreshToken:J.refresh,accountId:J.accountId,expiresAt:J.expires},Q={...W??{provider:$},provider:$,auth:H};return f.saveProviderSettings(Q,{tokenSource:"oauth"}),Q}function I9(f){let $=f?.auth?.accessToken?.trim()||f?.apiKey?.trim();return $&&$.length>0?$:void 0}var D_=new Set(["ollama","lmstudio","litellm"]);function __(f,$){if(!$?.provider.baseUrl)return!1;if($.provider.source!=="system")return!0;return D_.has(f)}function v9(f){let $=Pf.normalizeProviderId(f);if(F_($))return{providerId:$,authMethod:"oauth",fields:{}};let W=Pf.MODEL_COLLECTIONS_BY_PROVIDER_ID[$],J=W?.provider.baseUrl,H={apiKey:{}};if(__($,W))H.baseUrl={defaultValue:J};return{providerId:$,authMethod:"api-key",fields:H}}var NX={};z(NX,{resolveLegacyClineAuth:()=>zX,migrateLegacyProviderSettings:()=>G8});import{existsSync as L_,readFileSync as O_}from"node:fs";import{dirname as C_,join as u9}from"node:path";import*as OX from"@clinebot/llms";import{resolveClineDataDir as z_}from"@clinebot/shared/storage";var CX="openai";function zX(f){let $=f?.trim();if(!$)return;try{let W=JSON.parse($);if(!W)return;return{accessToken:W.idToken,refreshToken:W.refreshToken,expiresAt:W.expiresAt,accountId:W.userInfo?.id}}catch{return}}function w(f){let $=f?.trim();return $?$:void 0}function LX(f){if(!L_(f))return;try{let $=O_(f,"utf8"),W=JSON.parse($);if(W&&typeof W==="object"&&!Array.isArray(W))return W}catch{}return}function N_(f){let $=f.dataDir??z_(),W=f.globalStatePath??u9($,"globalState.json"),J=f.secretsPath??u9($,"secrets.json"),H=LX(W),Q=LX(J);if(!H&&!Q)return;return{globalState:H??{},secrets:Q??{}}}function b_(f){try{let W=new URL(f).hostname.toLowerCase();return W==="api.openai.com"||W.endsWith(".openai.azure.com")||W.endsWith(".services.ai.azure.com")}catch{return!1}}function q_(f){let $=w(f.openAiBaseUrl);if(!$)return!1;if(f.azureApiVersion||f.azureIdentity)return!1;return!b_($)}function c9(f,$){if(f==="openai"&&q_($))return CX;return f}function w_(f,$,W,J){let H=W==="plan"?"planMode":"actMode",Q=$===J?w(W==="plan"?f.planModeApiModelId:f.actModeApiModelId):void 0,P={openrouter:`${H}OpenRouterModelId`,cline:`${H}ClineModelId`,openai:`${H}OpenAiModelId`,ollama:`${H}OllamaModelId`,lmstudio:`${H}LmStudioModelId`,litellm:`${H}LiteLlmModelId`,requesty:`${H}RequestyModelId`,together:`${H}TogetherModelId`,fireworks:`${H}FireworksModelId`,sapaicore:`${H}SapAiCoreModelId`,groq:`${H}GroqModelId`,baseten:`${H}BasetenModelId`,huggingface:`${H}HuggingFaceModelId`,"huawei-cloud-maas":`${H}HuaweiCloudMaasModelId`,oca:`${H}OcaModelId`,aihubmix:`${H}AihubmixModelId`,hicap:`${H}HicapModelId`,nousResearch:`${H}NousResearchModelId`,"vercel-ai-gateway":`${H}VercelAiGatewayModelId`}[$];return(P?w(typeof f[P]==="string"?f[P]:void 0):void 0)??Q}function E_(f,$,W){let J=W==="plan"?f.planModeReasoningEffort:f.actModeReasoningEffort,H=W==="plan"?f.geminiPlanModeThinkingLevel:f.geminiActModeThinkingLevel,Q=W==="plan"?f.planModeThinkingBudgetTokens:f.actModeThinkingBudgetTokens,Z=($==="gemini"?H:void 0)??J,P=Z==="none"||Z==="low"||Z==="medium"||Z==="high"?Z:void 0,j=typeof Q==="number"&&Number.isInteger(Q)&&Q>0?Q:void 0;if(!P&&j===void 0)return;return{...P?{effort:P}:{},...j!==void 0?{budgetTokens:j}:{}}}function S_(f){let $=f["openai-codex-oauth-credentials"];if(!$)return;try{let W=JSON.parse($),J=w(W.access_token),H=w(W.refresh_token),Q=w(W.accountId);if(!J&&!H&&!Q)return;return{...J?{apiKey:J}:{},auth:{...J?{accessToken:J}:{},...H?{refreshToken:H}:{},...Q?{accountId:Q}:{}}}}catch{return}}function k_(f){let $=OX.getGeneratedModelsForProvider(f);return Object.keys($)[0]??void 0}function m_(f,$,W,J){let H=c9(f,$),Q=w(J==="plan"?$.planModeApiProvider:$.actModeApiProvider),Z=w_($,f,J,Q)??k_(H),P=E_($,H,J),j=typeof $.requestTimeoutMs==="number"&&Number.isInteger($.requestTimeoutMs)&&$.requestTimeoutMs>0?$.requestTimeoutMs:void 0,R={anthropic:W.apiKey,cline:W.clineApiKey,openai:W.openAiApiKey,"openai-native":W.openAiNativeApiKey,openrouter:W.openRouterApiKey,bedrock:W.awsBedrockApiKey,gemini:W.geminiApiKey,ollama:W.ollamaApiKey,deepseek:W.deepSeekApiKey,requesty:W.requestyApiKey,together:W.togetherApiKey,fireworks:W.fireworksApiKey,qwen:W.qwenApiKey,doubao:W.doubaoApiKey,mistral:W.mistralApiKey,litellm:W.liteLlmApiKey,asksage:W.asksageApiKey,xai:W.xaiApiKey,moonshot:W.moonshotApiKey,zai:W.zaiApiKey,huggingface:W.huggingFaceApiKey,nebius:W.nebiusApiKey,sambanova:W.sambanovaApiKey,cerebras:W.cerebrasApiKey,groq:W.groqApiKey,"huawei-cloud-maas":W.huaweiCloudMaasApiKey,baseten:W.basetenApiKey,"vercel-ai-gateway":W.vercelAiGatewayApiKey,dify:W.difyApiKey,minimax:W.minimaxApiKey,hicap:W.hicapApiKey,aihubmix:W.aihubmixApiKey,nousResearch:W.nousResearchApiKey,oca:W.ocaApiKey,sapaicore:W.sapAiCoreClientId},X={};if(f==="openai-codex")Object.assign(X,S_(W));if(f==="cline")try{let Y=w(W["cline:clineAccountId"]);if(Y)X.auth={...X.auth??{},...zX(Y)}}catch{}if(f==="openai"&&$.openAiHeaders)X.headers=$.openAiHeaders;if(f==="bedrock")X.aws={accessKey:w(W.awsAccessKey),secretKey:w(W.awsSecretKey),sessionToken:w(W.awsSessionToken),region:w($.awsRegion),authentication:$.awsAuthentication,profile:$.awsUseProfile?w($.awsProfile):void 0,usePromptCache:$.awsBedrockUsePromptCache,useCrossRegionInference:$.awsUseCrossRegionInference,useGlobalInference:$.awsUseGlobalInference,endpoint:w($.awsBedrockEndpoint),customModelBaseId:w(J==="plan"?$.planModeAwsBedrockCustomModelBaseId:$.actModeAwsBedrockCustomModelBaseId)};if(f==="vertex")X.gcp={projectId:w($.vertexProjectId),region:w($.vertexRegion)};if(f==="openai"&&($.azureApiVersion||$.azureIdentity!==void 0))X.azure={apiVersion:w($.azureApiVersion),useIdentity:$.azureIdentity};if(f==="sapaicore")X.sap={clientId:w(W.sapAiCoreClientId),clientSecret:w(W.sapAiCoreClientSecret),tokenUrl:w($.sapAiCoreTokenUrl),resourceGroup:w($.sapAiResourceGroup),deploymentId:w(J==="plan"?$.planModeSapAiCoreDeploymentId:$.actModeSapAiCoreDeploymentId),useOrchestrationMode:$.sapAiCoreUseOrchestrationMode};if(f==="oca"){X.oca={mode:$.ocaMode};let Y=w(W.ocaRefreshToken);if(Y)X.auth={...X.auth??{},refreshToken:Y}}if(f==="qwen")X.apiLine=$.qwenApiLine;if(f==="moonshot")X.apiLine=$.moonshotApiLine;if(f==="zai")X.apiLine=$.zaiApiLine;if(f==="minimax")X.apiLine=$.minimaxApiLine;let A={anthropic:$.anthropicBaseUrl,openai:$.openAiBaseUrl,ollama:$.ollamaBaseUrl,lmstudio:$.lmStudioBaseUrl,litellm:$.liteLlmBaseUrl,gemini:$.geminiBaseUrl,requesty:$.requestyBaseUrl,asksage:$.asksageApiUrl,dify:$.difyBaseUrl,oca:$.ocaBaseUrl,aihubmix:$.aihubmixBaseUrl,sapaicore:$.sapAiCoreBaseUrl},V=w(R[f]),B=w(A[f]),T={provider:H,...V?{apiKey:V}:{},...Z?{model:Z}:{},...B?{baseUrl:B}:{},...P?{reasoning:P}:{},...j?{timeout:j}:{},...X},h=BW.safeParse(T);if(!h.success)return;return Object.keys(T).filter((Y)=>Y!=="provider").length>0?h.data:void 0}function g_(f,$){if(f!==CX)return;if(!$.baseUrl||!$.model)return;return{provider:{name:"OpenAI Compatible",baseUrl:$.baseUrl,defaultModelId:$.model},models:{[$.model]:{id:$.model,name:$.model}}}}function x_(f,$){let W=new Set;for(let J of[f.actModeApiProvider,f.planModeApiProvider]){let H=w(J);if(H)W.add(H)}if(w($.apiKey))W.add("anthropic");if(w($.openRouterApiKey))W.add("openrouter");if(w($.openAiApiKey))W.add("openai");if(w($.openAiNativeApiKey))W.add("openai-native");if(w($["openai-codex-oauth-credentials"]))W.add("openai-codex");if(w($.geminiApiKey))W.add("gemini");if(w($.ollamaApiKey))W.add("ollama");if(w($.awsAccessKey)||w($.awsBedrockApiKey))W.add("bedrock");if(w(f.vertexProjectId)||w(f.vertexRegion))W.add("vertex");if(w($.clineApiKey))W.add("cline");if(w($.ocaApiKey))W.add("oca");return W}function G8(f){let $=f.providerSettingsManager.read(),W=N_(f);if(!W)return{migrated:!1,providerCount:Object.keys($.providers).length,lastUsedProvider:$.lastUsedProvider};let{globalState:J,secrets:H}=W,Q=J.mode==="plan"?"plan":"act",Z=x_(J,H),P=a0();P.providers={...$.providers},P.lastUsedProvider=$.lastUsedProvider;let j=new Date().toISOString(),R=0,X=u9(C_(f.providerSettingsManager.getFilePath()),"models.json"),A=z9(X),V=0;for(let h of Z){let F=c9(h,J);if(P.providers[F])continue;let Y=m_(h,J,H,Q);if(!Y)continue;P.providers[F]={settings:Y,updatedAt:j,tokenSource:"migration"},R+=1;let y=g_(F,Y);if(y&&!A.providers[F])A.providers[F]=y,V+=1}if(R===0&&V===0)return{migrated:!1,providerCount:Object.keys($.providers).length,lastUsedProvider:$.lastUsedProvider};let B=w(Q==="plan"?J.planModeApiProvider:J.actModeApiProvider),T=B?c9(B,J):void 0;if(P.lastUsedProvider=$.lastUsedProvider??(T&&P.providers[T]?T:Object.keys(P.providers)[0]),f.providerSettingsManager.write(P),V>0)VX(X,A);return{migrated:R>0||V>0,providerCount:Object.keys(P.providers).length,lastUsedProvider:P.lastUsedProvider}}Kf();q6();var bX={};z(bX,{FileTeamPersistenceStore:()=>i6});import{appendFileSync as I_,existsSync as d9,mkdirSync as v_,readFileSync as u_,renameSync as c_,unlinkSync as d_,writeFileSync as r_}from"node:fs";import{join as r9}from"node:path";import{resolveTeamDataDir as l_}from"@clinebot/shared/storage";function p_(f){return f.toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")}class i6{dirPath;statePath;taskHistoryPath;teammateSpecs=new Map;constructor(f){let $=p_(f.teamName),W=f.baseDir?.trim()||l_();this.dirPath=r9(W,$),this.statePath=r9(this.dirPath,"state.json"),this.taskHistoryPath=r9(this.dirPath,"task-history.jsonl")}loadState(){if(!d9(this.statePath))return;try{let f=u_(this.statePath,"utf8"),$=JSON.parse(f);if($.version!==1||!$.teamState)return;for(let W of $.teammates??[])this.teammateSpecs.set(W.agentId,W);return Nj($.teamState)}catch{return}}getTeammateSpecs(){return Array.from(this.teammateSpecs.values())}upsertTeammateSpec(f){this.teammateSpecs.set(f.agentId,f)}removeTeammateSpec(f){this.teammateSpecs.delete(f)}persist(f){if(!this.hasPersistableState(f)){this.clearPersistedState();return}this.ensureDir();let $={version:1,updatedAt:new Date().toISOString(),teamState:f.exportState(),teammates:Array.from(this.teammateSpecs.values())},W=`${this.statePath}.tmp`;r_(W,`${JSON.stringify($,null,2)}
714
+ `,"utf8"),c_(W,this.statePath)}appendTaskHistory(f){let $={};switch(f.type){case"team_task_updated":$=f.task;break;case"team_message":$={agentId:f.message.fromAgentId,toAgentId:f.message.toAgentId,subject:f.message.subject,taskId:f.message.taskId};break;case"team_mission_log":$={agentId:f.entry.agentId,kind:f.entry.kind,summary:f.entry.summary,taskId:f.entry.taskId};break;case"teammate_spawned":case"teammate_shutdown":case"task_start":$={agentId:f.agentId,message:"message"in f?f.message:void 0};break;case"task_end":$={agentId:f.agentId,finishReason:f.result?.finishReason,error:f.error?.message};break;case"agent_event":$={agentId:f.agentId,eventType:f.event.type};break}this.ensureDir(),I_(this.taskHistoryPath,`${JSON.stringify({ts:new Date().toISOString(),type:f.type,task:$})}
715
+ `,"utf8")}ensureDir(){if(!d9(this.dirPath))v_(this.dirPath,{recursive:!0})}hasPersistableState(f){let $=f.exportState();if(this.teammateSpecs.size>0)return!0;if($.members.some((W)=>W.role==="teammate"))return!0;return $.tasks.length>0||$.mailbox.length>0||$.missionLog.length>0}clearPersistedState(){if(d9(this.statePath))d_(this.statePath)}}var qX={};z(qX,{ChatViewStateSchema:()=>l9,ChatSummarySchema:()=>o6,ChatSessionStatusSchema:()=>a6,ChatSessionConfigSchema:()=>n6,ChatMessageSchema:()=>s6,ChatMessageRoleSchema:()=>t6});import{z as N}from"zod";var n6=N.object({workspaceRoot:N.string().min(1),cwd:N.string().optional(),provider:N.string().min(1),model:N.string().min(1),mode:N.enum(["act","plan"]).default("act"),apiKey:N.string(),systemPrompt:N.string().optional(),rules:N.string().optional(),maxIterations:N.number().int().positive().optional(),enableTools:N.boolean(),enableSpawn:N.boolean().optional(),enableTeams:N.boolean().optional(),autoApproveTools:N.boolean().optional(),missionStepInterval:N.number().int().positive().optional(),missionTimeIntervalMs:N.number().int().positive().optional()}),a6=N.enum(["idle","starting","running","stopping","completed","cancelled","failed","error"]),t6=N.enum(["user","assistant","tool","system","status","error"]),s6=N.object({id:N.string().min(1),sessionId:N.string().nullable(),role:t6,content:N.string(),createdAt:N.number().int().nonnegative(),meta:N.object({stream:N.enum(["stdout","stderr"]).optional(),toolName:N.string().optional(),iteration:N.number().int().nonnegative().optional(),agentId:N.string().optional(),conversationId:N.string().optional(),hookEventName:N.string().optional(),inputTokens:N.number().int().nonnegative().optional(),outputTokens:N.number().int().nonnegative().optional(),checkpoint:N.object({ref:N.string(),createdAt:N.number().int().nonnegative(),runCount:N.number().int().positive(),kind:N.enum(["stash","commit"]).optional()}).optional()}).optional()}),o6=N.object({toolCalls:N.number().int().nonnegative(),tokensIn:N.number().int().nonnegative(),tokensOut:N.number().int().nonnegative()}),l9=N.object({sessionId:N.string().nullable(),status:a6,config:n6,messages:N.array(s6),rawTranscript:N.string(),error:N.string().nullable(),summary:o6});var wX={};z(wX,{CORE_BUILD_VERSION:()=>p9});var p9=kP;import{Agent as DL,createAgentRuntime as _L}from"@clinebot/agents";var kX={};z(kX,{fetchClineRecommendedModels:()=>i9,FALLBACK_CLINE_RECOMMENDED_MODELS:()=>e6});var EX="https://api.cline.bot",i_=5000,e6={recommended:[{id:"anthropic/claude-opus-4.6",name:"Claude Opus 4.6",description:"Most intelligent model for agents and coding",tags:["BEST"]},{id:"anthropic/claude-sonnet-4.6",name:"Claude Sonnet 4.6",description:"Strong coding and agent performance",tags:["NEW"]},{id:"google/gemini-3.1-pro-preview",name:"Gemini 3.1 Pro Preview",description:"1M context window, strong coding performance",tags:["NEW"]},{id:"openai/gpt-5.3-codex",name:"GPT-5.3 Codex",description:"OpenAI's latest with strong coding abilities",tags:["NEW"]}],free:[{id:"kwaipilot/kat-coder-pro",name:"KwaiKAT Kat Coder Pro",description:"Advanced agentic coding model",tags:["FREE"]},{id:"arcee-ai/trinity-large-preview:free",name:"Arcee AI Trinity Large Preview",description:"Advanced large preview model",tags:["FREE"]}]};function n_(f){return{recommended:f.recommended.map(($)=>({...$,tags:[...$.tags]})),free:f.free.map(($)=>({...$,tags:[...$.tags]}))}}function SX(f){if(!f||typeof f!=="object")return null;let $=f;if(typeof $.id!=="string"||$.id.length===0)return null;return{id:$.id,name:typeof $.name==="string"&&$.name.length>0?$.name:$.id,description:typeof $.description==="string"?$.description:"",tags:Array.isArray($.tags)?$.tags.filter((W)=>typeof W==="string"):[]}}function a_(f){if(!f||typeof f!=="object")return null;let $=f,W=Array.isArray($.recommended)?$.recommended:[],J=Array.isArray($.free)?$.free:[],H=W.map(SX).filter((Z)=>Z!==null),Q=J.map(SX).filter((Z)=>Z!==null);if(H.length===0&&Q.length===0)return null;return{recommended:H,free:Q}}function t_(f){let $=f.baseUrl?.trim();if($)return $;try{return(f.providerSettingsManager??new P0).getProviderSettings("cline")?.baseUrl?.trim()||EX}catch{return EX}}async function s_(f,$,W){let J=new AbortController,H=setTimeout(()=>J.abort(),W);try{return await f($,{signal:J.signal})}finally{clearTimeout(H)}}async function i9(f={}){try{let $=t_(f),W=f.fetchImpl??fetch,J=await s_(W,`${$}/api/v1/ai/cline/recommended-models`,f.timeoutMs??i_);if(!J.ok)throw Error(`HTTP ${J.status}`);let H=await J.json(),Q=a_(H);if(Q)return Q}catch{}return n_(e6)}var mX={};z(mX,{loadLlmsConfigFromFile:()=>a9,defineLlmsConfig:()=>n9});import{readFile as o_}from"node:fs/promises";import e_ from"node:path";function n9(f){return f}async function a9(f){let $=e_.resolve(f),W=await o_($,"utf8"),J;try{J=JSON.parse(W)}catch(H){let Q=H instanceof Error?H.message:String(H);throw Error(`Failed to parse JSON config at "${$}": ${Q}`)}return fL(J,$)}function fL(f,$){if(!f||typeof f!=="object")throw Error(`Invalid llms config in "${$}": expected an object.`);let J=f.providers;if(!Array.isArray(J))throw Error(`Invalid llms config in "${$}": "providers" must be an array.`);if(!J.length)throw Error(`Invalid llms config in "${$}": "providers" cannot be empty.`);return f}var cX={};z(cX,{createLlmsSdk:()=>s9,DefaultLlmsSdk:()=>D8});import{BUILT_IN_PROVIDER_IDS as IX,createHandler as JL,createHandlerAsync as HL,getProviderCollection as QL,hasProvider as vX,registerAsyncHandler as ZL,registerHandler as PL,registerModel as jL,registerProvider as uX}from"@clinebot/llms";function gX(f){return f?{...f}:{}}function $L(f,$){if(f)return f;if(!$)return;let W=globalThis.process;if(!W?.env)return;return W.env[$]}function WL(f,$){if(!$.length)throw Error(`Provider "${f}" must include at least one model.`)}function xX(f){let $=Object.keys(f.collection.models);return{id:f.collection.provider.id,name:f.collection.provider.name,description:f.collection.provider.description,protocol:f.collection.provider.protocol,baseUrl:f.collection.provider.baseUrl,capabilities:f.collection.provider.capabilities,env:f.collection.provider.env,models:$,defaultModel:f.collection.provider.defaultModelId,modelCount:$.length}}class t9{providers=new Map;register(f){WL(f.id,f.models);let $=f.defaultModel??f.models[0];if(!$)throw Error(`Provider "${f.id}" must define a default model.`);if(!f.models.includes($))throw Error(`Default model "${$}" is not included in configured models for "${f.id}".`);let W=this.providers.get(f.id);this.providers.set(f.id,{id:f.id,models:new Set([...W?.models??[],...f.models]),defaultModel:$,defaults:{...W?.defaults??{},...gX(f.defaults)}})}registerSelectionConfig(f){this.register({id:f.id,models:f.models,defaultModel:f.defaultModel,defaults:{apiKey:$L(f.apiKey,f.apiKeyEnv),routingProviderId:f.builtinProviderId,baseUrl:f.baseUrl,headers:f.headers,timeoutMs:f.timeoutMs,capabilities:f.capabilities,...gX(f.settings)}})}registerModel(f,$){let W=this.providers.get(f);if(!W){this.providers.set(f,{id:f,models:new Set([$]),defaultModel:$,defaults:{}});return}W.models.add($)}createHandlerConfig(f){let $=this.require(f.providerId),W=f.modelId??$.defaultModel;if(!$.models.has(W))throw Error(`Model "${W}" is not configured for provider "${f.providerId}".`);return{providerId:f.providerId,modelId:W,...$.defaults,...f.overrides}}list(){return Array.from(this.providers.values()).map((f)=>({id:f.id,models:Array.from(f.models),defaultModel:f.defaultModel}))}getModels(f){return Array.from(this.require(f).models)}hasProvider(f){return this.providers.has(f)}hasModel(f,$){return this.providers.get(f)?.models.has($)??!1}require(f){let $=this.providers.get(f);if(!$)throw Error(`Provider "${f}" is not configured in this SDK instance.`);return $}}class D8{configuredProviders=new t9;constructor(f){this.applyConfig(f)}createHandler(f){return JL(this.configuredProviders.createHandlerConfig(f))}async createHandlerAsync(f){return HL(this.configuredProviders.createHandlerConfig(f))}registerProvider(f){if(uX(f.collection),f.handlerFactory&&f.asyncHandlerFactory)throw Error(`Provider "${f.collection.provider.id}" cannot register both sync and async handlers.`);if(f.handlerFactory)PL(f.collection.provider.id,f.handlerFactory);if(f.asyncHandlerFactory)ZL(f.collection.provider.id,f.asyncHandlerFactory);this.configuredProviders.register({id:f.collection.provider.id,models:f.exposeModels??Object.keys(f.collection.models),defaultModel:f.defaultModel??f.collection.provider.defaultModelId,defaults:f.defaults})}registerBuiltinProvider(f){let $=f.exposeModels??Object.keys(f.models),W=f.defaultModel??$[0];if(!W)throw Error(`Provider "${f.id}" must define a default model.`);uX({provider:{id:f.id,name:f.name??f.id,description:f.description,protocol:f.protocol,baseUrl:f.baseUrl,defaultModelId:W,client:f.client??"openai-compatible",capabilities:f.capabilities,env:f.env,source:"system"},models:f.models}),this.configuredProviders.register({id:f.id,models:$,defaultModel:W,defaults:{routingProviderId:f.builtinProviderId,...f.defaults??{}}})}registerModel(f){jL(f.providerId,f.modelId,f.info),this.configuredProviders.registerModel(f.providerId,f.modelId)}getProviders(){return this.configuredProviders.list()}getBuiltInProviderIds(){return[...IX]}async getBuiltInProviders(){return(await Promise.all(IX.map(($)=>QL($)))).filter(($)=>$!==void 0).map(($)=>xX({collection:$}))}getModels(f){return this.configuredProviders.getModels(f)}isProviderConfigured(f){return this.configuredProviders.hasProvider(f)}isModelConfigured(f,$){return this.configuredProviders.hasModel(f,$)}applyConfig(f){for(let $ of f.providers)this.configuredProviders.registerSelectionConfig($);for(let $ of f.models??[])this.registerModel($);for(let $ of f.customProviders??[])this.registerProvider($);for(let $ of this.configuredProviders.list()){let W=vX($.id),J=this.configuredProviders.createHandlerConfig({providerId:$.id,modelId:$.defaultModel}).routingProviderId,H=typeof J==="string"&&vX(J);if(!W&&!H)throw Error(`Provider "${$.id}" is not known. Register it through customProviders/registerProvider, registerBuiltinProvider, or use a built-in provider ID.`)}}}function s9(f){return new D8(f)}e5();async function RL(){return Promise.resolve().then(() => (rX(),dX))}function NL(){return new Date().toISOString()}function bL(f){if(nX(f)!=="providers.json")return;let $=e9(f);if(nX($)!=="settings")return;return e9($)}class P0{filePath;dataDir;constructor(f={}){if(this.filePath=f.filePath??zL(),this.dataDir=f.dataDir??bL(this.filePath),this.dataDir||!f.filePath)G8({providerSettingsManager:this,dataDir:this.dataDir});if(hX(this),d6(this.read()),o9(this.filePath))try{iX(this.filePath,384)}catch{}}getFilePath(){return this.filePath}read(){if(!o9(this.filePath))return a0();try{let f=OL(this.filePath,"utf8"),$=JSON.parse(f),W=q1.safeParse($);if(W.success)return d6(W.data),W.data}catch{}return a0()}write(f){let $=q1.parse(f),W=e9(this.filePath);if(!o9(W))LL(W,{recursive:!0,mode:448});CL(this.filePath,`${JSON.stringify($,null,2)}
716
+ `,"utf8");try{iX(this.filePath,384)}catch{}d6($)}saveProviderSettings(f,$={}){let W=BW.parse(f),J=this.read(),H=W.provider,Q=$.setLastUsed!==!1,Z=J.providers[H],P=$.tokenSource??Z?.tokenSource??"manual",j={...J,providers:{...J.providers,[H]:{settings:W,updatedAt:NL(),tokenSource:P}},lastUsedProvider:Q?H:J.lastUsedProvider};return this.write(j),j}getProviderSettings(f){return this.read().providers[f]?.settings}getLastUsedProviderSettings(){let f=this.read(),$=f.lastUsedProvider;if(!$)return;return f.providers[$]?.settings}getProviderConfig(f,$){let W=this.getProviderSettings(f);if(!W)return;return bf(W,$)}getLastUsedProviderConfig(f){let $=this.getLastUsedProviderSettings();if(!$)return;return bf($,f)}async refreshCatalog(){try{await N1({})}catch{}}}Kf();U6();import{isOAuthProviderId as qL}from"@clinebot/shared";var wL="https://api.cline.bot",f3="workos:";function EL(f,$){if(f==="cline")return`${f3}${$}`;return $}function SL(f,$){if(f==="cline"&&$.toLowerCase().startsWith(f3))return $.slice(f3.length);return $}function kL(f){let W=Tf(f)?.exp;if(typeof W==="number"&&W>0)return W*1000;return null}function mL(f,$){let W=f.auth?.expiresAt;if(typeof W==="number"&&Number.isFinite(W)&&W>0)return W;let J=kL($);if(J)return J;return Date.now()-1}function gL(f,$){let W=$.auth?.accessToken?.trim(),J=$.auth?.refreshToken?.trim();if(!W||!J)return null;let H=SL(f,W);if(!H)return null;return{access:H,refresh:J,expires:mL($,H),accountId:$.auth?.accountId}}function xL(f,$){let W=f?.expiresAt,J=$?.expiresAt;return f?.accessToken===$?.accessToken&&f?.refreshToken===$?.refreshToken&&f?.accountId===$?.accountId&&W===J}class fJ extends Error{providerId;constructor(f){super(`OAuth credentials for provider "${f}" are no longer valid. Re-run authentication for this provider.`);this.name="OAuthReauthRequiredError",this.providerId=f}}class $3{providerSettingsManager;telemetry;refreshInFlight=new Map;constructor(f){this.providerSettingsManager=f?.providerSettingsManager??new P0,this.telemetry=f?.telemetry}async resolveProviderApiKey(f){if(!qL(f.providerId))return null;return this.resolveWithSingleFlight(f.providerId,f.forceRefresh)}async resolveWithSingleFlight(f,$=!1){let W=this.refreshInFlight.get(f);if(W)return W;let J=this.resolveProviderApiKeyInternal(f,$).catch((H)=>{throw H}).finally(()=>{this.refreshInFlight.delete(f)});return this.refreshInFlight.set(f,J),J}async resolveProviderApiKeyInternal(f,$){let W=this.providerSettingsManager.getProviderSettings(f);if(!W)return null;let J=gL(f,W);if(!J)return null;let H=await this.resolveCredentials(f,W,J,$);if(!H)throw new fJ(f);let Q=EL(f,H.access),Z={...W.auth??{},accessToken:Q,refreshToken:H.refresh,accountId:H.accountId};Z.expiresAt=H.expires;let P={...W,auth:Z},j=!xL(W.auth,P.auth);if(j)this.providerSettingsManager.saveProviderSettings(P,{setLastUsed:!1,tokenSource:"oauth"});return{providerId:f,apiKey:Q,accountId:H.accountId,refreshed:j}}async resolveCredentials(f,$,W,J){if(f==="cline")return MW(W,{apiBaseUrl:$.baseUrl?.trim()||wL,telemetry:this.telemetry},{forceRefresh:J});if(f==="oca")return PW(W,{forceRefresh:J,telemetry:this.telemetry},{mode:$.oca?.mode,telemetry:this.telemetry});return DW(W,{forceRefresh:J,telemetry:this.telemetry})}}import{normalizeUserInput as IL}from"@clinebot/shared";import{nanoid as vL}from"nanoid";class aX{list(f){return f?If(f):[]}update(f,$){if(!f)return{sessionId:$.sessionId,prompts:[],updated:!1};let W=$.promptId.trim(),J=f.pendingPrompts.findIndex((j)=>j.id===W);if(J<0)return{sessionId:$.sessionId,prompts:If(f),updated:!1};let H=f.pendingPrompts[J];if(!H)return{sessionId:$.sessionId,prompts:If(f),updated:!1};let Q=$.prompt===void 0?H.prompt:IL($.prompt).trim();if(!Q)throw Error("prompt cannot be empty");let Z=$.delivery??H.delivery,P={...H,prompt:Q,delivery:Z};return f.pendingPrompts.splice(J,1),uL(f,P,J,H.delivery),{sessionId:$.sessionId,prompts:If(f),prompt:$J(P),updated:!0}}delete(f,$){if(!f)return{sessionId:$.sessionId,prompts:[],removed:!1};let W=$.promptId.trim(),J=f.pendingPrompts.findIndex((Q)=>Q.id===W);if(J<0)return{sessionId:$.sessionId,prompts:If(f),removed:!1};let[H]=f.pendingPrompts.splice(J,1);return{sessionId:$.sessionId,prompts:If(f),prompt:H?$J(H):void 0,removed:!0}}enqueue(f,$){let{prompt:W,delivery:J,userImages:H,userFiles:Q}=$,Z=f.pendingPrompts.findIndex((P)=>P.prompt===W);if(Z>=0){let[P]=f.pendingPrompts.splice(Z,1),j={...P,prompt:W,userImages:H??P.userImages,userFiles:Q??P.userFiles};if(J==="steer"||P.delivery==="steer")f.pendingPrompts.unshift({...j,delivery:"steer"});else f.pendingPrompts.push(j)}else{let P={id:`pending_${Date.now()}_${vL(5)}`,prompt:W,delivery:J,userImages:H,userFiles:Q};if(J==="steer")f.pendingPrompts.unshift(P);else f.pendingPrompts.push(P)}return If(f)}consumeSteer(f){let $=f.pendingPrompts.findIndex((J)=>J.delivery==="steer");if($<0)return{prompts:If(f)};let[W]=f.pendingPrompts.splice($,1);return{entry:W,prompts:If(f)}}shiftNext(f){return{entry:f.pendingPrompts.shift(),prompts:If(f)}}requeueFront(f,$){return f.pendingPrompts.unshift($),If(f)}clear(f){return f.pendingPrompts.length=0,[]}}class W3{deps;service=new aX;constructor(f){this.deps=f}list(f){return this.service.list(this.deps.getSession(f))}update(f){let $=this.deps.getSession(f.sessionId);if(!$||$.aborting)return{sessionId:f.sessionId,prompts:[],updated:!1};let W=this.service.update($,f);return this.emitPrompts($),this.scheduleDrain(f.sessionId,$),W}delete(f){let $=this.deps.getSession(f.sessionId);if(!$||$.aborting)return{sessionId:f.sessionId,prompts:[],removed:!1};let W=this.service.delete($,f);return this.emitPrompts($),this.scheduleDrain(f.sessionId,$),W}enqueue(f,$){let W=this.deps.getSession(f);if(!W||W.aborting)return;this.service.enqueue(W,$),this.emitPrompts(W),this.scheduleDrain(f,W)}consumeSteer(f){let $=this.deps.getSession(f);if(!$)return;let{entry:W}=this.service.consumeSteer($);if(!W)return;return this.emitPrompts($),this.emitSubmitted($,W),W.prompt}clearAborted(f){if(f.pendingPrompts.length===0)return;this.service.clear(f),this.emitPrompts(f)}emitPrompts(f){this.deps.emit({type:"pending_prompts",payload:{sessionId:f.sessionId,prompts:If(f)}})}scheduleDrain(f,$){if($.pendingPrompts.length===0||$.aborting||$.drainingPendingPrompts||!$.agent.canStartRun())return;queueMicrotask(()=>{this.drain(f)})}async drain(f){let $=this.deps.getSession(f);if(!$||$.aborting||$.drainingPendingPrompts)return;if(!$.agent.canStartRun())return;let{entry:W}=this.service.shiftNext($);if(!W)return;this.emitPrompts($),this.emitSubmitted($,W),$.drainingPendingPrompts=!0;try{await this.deps.send({sessionId:f,prompt:W.prompt,userImages:W.userImages,userFiles:W.userFiles})}catch(J){if((J instanceof Error?J.message:String(J)).includes("already in progress"))this.service.requeueFront($,W),this.emitPrompts($);else throw J}finally{if($.drainingPendingPrompts=!1,$.pendingPrompts.length>0)queueMicrotask(()=>{this.drain(f)})}}emitSubmitted(f,$){let W=$J($);this.deps.emit({type:"pending_prompt_submitted",payload:{sessionId:f.sessionId,id:W.id,prompt:W.prompt,delivery:W.delivery,attachmentCount:W.attachmentCount}})}}function $J(f){return{id:f.id,prompt:f.prompt,delivery:f.delivery,attachmentCount:(f.userImages?.length??0)+(f.userFiles?.length??0)}}function If(f){return f.pendingPrompts.map($J)}function uL(f,$,W,J){if($.delivery==="steer")f.pendingPrompts.unshift($);else if(J==="steer")f.pendingPrompts.push($);else f.pendingPrompts.splice(W,0,$)}Kf();class J3{deps;constructor(f){this.deps=f}dispatchAgentEvent(f,$,W){let J=this.deps.getSession(f),H={sessionId:f,config:$,liveSession:J,usageBySession:this.deps.usageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit},Q=pJ(W),Z=J&&Q.agentId===tX(J.agent);iJ(H,W,Z?{isPrimaryAgentEvent:!0,...J?.runtime.teamRuntime?{teamRole:"lead"}:{}}:{isPrimaryAgentEvent:!1})}async handleTeamEvent(f,$){let W=this.deps.getSession(f);if(W){if(m5(W,$),$.type==="agent_event"){let J={sessionId:f,config:W.config,liveSession:W,usageBySession:this.deps.usageBySession,persistMessages:this.deps.persistMessages,emit:this.deps.emit};iJ(J,$.event,{teamRole:"teammate",teamAgentId:$.agentId,isPrimaryAgentEvent:!1})}if($.type==="teammate_spawned"){let J=h0({agentId:$.teammate.runtimeAgentId??$.agentId,conversationId:$.teammate.conversationId,parentAgentId:$.teammate.parentAgentId,createdByAgentId:tX(W.agent),teamId:W.runtime.teamRuntime?.getTeamId(),teamName:W.runtime.teamRuntime?.getTeamName(),teamRole:"teammate",teamAgentId:$.agentId});if(J)v0(W.config.telemetry,{ulid:f,modelId:$.teammate.modelId??W.config.modelId,provider:W.config.providerId,...J})}}if(await g5(f,$,this.deps.invokeBackendOptional),W)x5(W,f,$,this.deps.emit)}async handlePluginEvent(f,$,W){if($.name==="plugin_log"){this.handlePluginLog(f,$.payload);return}if($.name==="automation_event"){let j=this.deps.getSession(f)?.config.extensionContext?.automation??W;if(!j)return;let R=$.payload&&typeof $.payload==="object"?$.payload:void 0;if(!R)return;await j.ingestEvent(R);return}if($.name!=="steer_message"&&$.name!=="queue_message"&&$.name!=="pending_prompt")return;let J=$.payload&&typeof $.payload==="object"?$.payload:void 0,H=typeof J?.sessionId==="string"&&J.sessionId.trim().length>0?J.sessionId.trim():f,Q=typeof J?.prompt==="string"?J.prompt.trim():"";if(!Q)return;let Z=$.name==="steer_message"?"steer":$.name==="queue_message"?"queue":J?.delivery==="steer"?"steer":"queue";this.deps.enqueuePendingPrompt(H,{prompt:Q,delivery:Z})}handlePluginLog(f,$,W){let J=this.deps.getSession(f),H=W??J?.config.extensionContext?.logger??J?.config.logger;if(!H||!$||typeof $!=="object")return;let Q=$,Z=typeof Q.message==="string"?Q.message:"";if(!Z)return;let P=Q.metadata&&typeof Q.metadata==="object"?{...Q.metadata}:{};if(P.sessionId??=f,typeof Q.pluginName==="string"&&Q.pluginName)P.pluginName=Q.pluginName;if(Q.level==="debug"){H.debug(Z,P);return}if(Q.level==="error"){if(H.error)H.error(Z,P);else H.log(Z,{...P,severity:"error"});return}H.log(Z,P)}}function tX(f){return f.getAgentId()}function H3(f){return{sessionId:f.sessionId,source:f.source,pid:process.pid,startedAt:f.startedAt,endedAt:f.endedAt??null,exitCode:f.exitCode??null,status:f.status,interactive:f.interactive,provider:f.config.providerId,model:f.config.modelId,cwd:f.config.cwd,workspaceRoot:c0(f.config),teamName:f.config.teamName?.trim()||void 0,enableTools:f.config.enableTools,enableSpawn:f.config.enableSpawnAgent,enableTeams:f.config.enableAgentTeams,parentSessionId:typeof f.sessionMetadata?.parentSessionId==="string"?f.sessionMetadata.parentSessionId:void 0,parentAgentId:typeof f.sessionMetadata?.parentAgentId==="string"?f.sessionMetadata.parentAgentId:void 0,agentId:typeof f.sessionMetadata?.agentId==="string"?f.sessionMetadata.agentId:void 0,conversationId:typeof f.sessionMetadata?.conversationId==="string"?f.sessionMetadata.conversationId:void 0,isSubagent:typeof f.sessionMetadata?.isSubagent==="boolean"?f.sessionMetadata.isSubagent:!1,prompt:f.pendingPrompt,metadata:f.sessionMetadata,messagesPath:f.artifacts?.messagesPath,updatedAt:f.updatedAt??f.endedAt??f.startedAt}}function Q3(f,$){let W=f[$];return typeof W==="function"?W:null}async function sX(f,$,...W){let J=Q3(f,$);if(!J)throw Error(`session service method not available: ${$}`);return Promise.resolve(J.apply(f,W))}async function oX(f,$,...W){let J=Q3(f,$);if(!J)return;await Promise.resolve(J.apply(f,W))}async function eX(f,$,...W){let J=Q3(f,$);if(!J)return;return await Promise.resolve(J.apply(f,W))}K0();Kf();function Z3(f,$,W,J){return g0({configProvider:{getRuntimeConfig:()=>f.getSession(W)?.runtime.delegatedAgentConfigProvider?.getRuntimeConfig()??{providerId:$.providerId,modelId:$.modelId,cwd:$.cwd,apiKey:$.apiKey,baseUrl:$.baseUrl,headers:$.headers,providerConfig:$.providerConfig,knownModels:$.knownModels,thinking:$.thinking,maxIterations:$.maxIterations,hooks:$.hooks,extensions:$.extensions,logger:$.logger,telemetry:$.telemetry},getConnectionConfig:()=>f.getSession(W)?.runtime.delegatedAgentConfigProvider?.getConnectionConfig()??{providerId:$.providerId,modelId:$.modelId,apiKey:$.apiKey,baseUrl:$.baseUrl,headers:$.headers,providerConfig:$.providerConfig,knownModels:$.knownModels,thinking:$.thinking},updateConnectionDefaults:()=>{}},createSubAgentTools:()=>{let Q=$.enableTools?K$({cwd:$.cwd,...zf[V0({mode:$.mode})],executors:J}):[];if($.enableSpawnAgent)Q.push(Z3(f,$,W,J));return O$(Q)},onSubAgentEvent:(Q)=>f.onAgentEvent(W,$,Q),onSubAgentStart:(Q)=>{let Z=f.getSession(W)?.runtime.teamRuntime;f.subAgentStarts.set(Q.subAgentId,{startedAt:Date.now(),rootSessionId:W});let P=h0({agentId:Q.subAgentId,conversationId:Q.conversationId,parentAgentId:Q.parentAgentId,teamId:Z?.getTeamId(),teamName:Z?.getTeamName(),createdByAgentId:Q.parentAgentId});if(P)v0($.telemetry,{ulid:W,modelId:$.modelId,provider:$.providerId,...P});i2($.telemetry,{event:"started",ulid:W,durationMs:0,parentId:Q.parentAgentId,agentId:Q.subAgentId,...P}),f.invokeBackendOptional("handleSubAgentStart",W,Q)},onSubAgentEnd:(Q)=>{let Z=f.getSession(W)?.runtime.teamRuntime,P=f.subAgentStarts.get(Q.subAgentId),j=P?Date.now()-P.startedAt:0,R=Q.result?.text?Q.result.text.split(`
717
+ `).length:0;i2($.telemetry,{event:"ended",ulid:W,durationMs:j,outputLines:R,errorMessage:Q.error?String(Q.error):void 0,agentId:Q.subAgentId,parentId:Q.parentAgentId,...h0({agentId:Q.subAgentId,conversationId:Q.conversationId,parentAgentId:Q.parentAgentId,teamId:Z?.getTeamId(),teamName:Z?.getTeamName(),createdByAgentId:Q.parentAgentId})}),f.subAgentStarts.delete(Q.subAgentId),f.invokeBackendOptional("handleSubAgentEnd",W,Q)}})}import{readFile as cL,stat as dL}from"node:fs/promises";var rL=20480000;async function fA(f){let $=await dL(f);if(!$.isFile())throw Error("Path is not a file");if($.size>rL)throw Error("File is too large to read into context.");let W=await cL(f,"utf8");if(W.includes("\x00"))throw Error("Cannot read binary file into context.");return W}var $A=5000;class Q0{runtimeAddress=void 0;pendingPrompts;sessionService;runtimeBuilder;createAgentInstance;toolExecutors;defaultCapabilities;defaultToolPolicies;providerSettingsManager;oauthTokenManager;defaultTelemetry;defaultFetch;events=new nW;sessions=new Map;usageBySession=new Map;subAgentStarts=new Map;pendingPromptsController;eventBridge;sessionVersioning=new Z$;constructor(f){let $=lL();if($)sL($);let W=c$(f.distinctId);this.sessionService=f.sessionService,this.runtimeBuilder=f.runtimeBuilder??new V2,this.createAgentInstance=f.createAgent??((J)=>new m0(J)),this.defaultCapabilities=Xf(f.capabilities),this.toolExecutors=this.defaultCapabilities?.toolExecutors,this.defaultToolPolicies=f.toolPolicies,this.providerSettingsManager=f.providerSettingsManager??new P0,this.oauthTokenManager=f.oauthTokenManager??new $3({providerSettingsManager:this.providerSettingsManager,telemetry:f.telemetry}),this.defaultTelemetry=f.telemetry,this.defaultTelemetry?.setDistinctId(W),this.defaultFetch=f.fetch,this.pendingPromptsController=new W3({getSession:(J)=>this.sessions.get(J),emit:(J)=>this.emit(J),send:(J)=>this.runTurn(J)}),this.pendingPrompts={list:async(J)=>this.pendingPromptsController.list(J.sessionId),update:async(J)=>this.pendingPromptsController.update(J),delete:async(J)=>this.pendingPromptsController.delete(J)},this.eventBridge=new J3({getSession:(J)=>this.sessions.get(J),usageBySession:this.usageBySession,emit:(J)=>this.emit(J),persistMessages:(J,H,Q)=>{this.invoke("persistSessionMessages",J,H,Q)},enqueuePendingPrompt:(J,H)=>this.pendingPromptsController.enqueue(J,H),invokeBackendOptional:(J,...H)=>this.invokeOptional(J,...H)})}async startSession(f){let $=f.source??jf.CLI,W=t(),J=f.config.sessionId?.trim()??"",H=J||nL(),Q=f,Z=Q.initialMessages??[];this.usageBySession.set(H,Z.length>0?n2(Z):G$());let P=await this.invokeOptionalValue("ensureSessionsDir")??"";if(!P)throw Error("session service method not available: ensureSessionsDir");let j=P3(P,H),R=P3(j,`${H}.messages.json`),X=P3(j,`${H}.json`),A=c0(f.config),V=hf.parse({version:1,session_id:H,source:$,pid:process.pid,started_at:W,status:"running",interactive:f.interactive===!0,provider:Q.config.providerId,model:Q.config.modelId,cwd:Q.config.cwd,workspace_root:A,team_name:Q.config.teamName,enable_tools:Q.config.enableTools,enable_spawn:Q.config.enableSpawnAgent,enable_teams:Q.config.enableAgentTeams,prompt:Q.prompt?.trim()||void 0,messages_path:R}),B;if(J.length>0&&Z.length>0&&!Q.prompt?.trim()){let E=await this.invokeOptionalValue("readSessionManifest",H);if(E)V=E,B={manifestPath:X,messagesPath:E.messages_path||R,manifest:E}}let h=Xf(this.defaultCapabilities,f.capabilities),F=h?.toolExecutors??this.toolExecutors,Y=f.localRuntime,y=Y?.extensionContext?.logger??Y?.logger,D=Y?.extensionContext?.automation,U;U=await BZ({input:Q,localRuntime:f.localRuntime,sessionId:H,providerSettingsManager:this.providerSettingsManager,defaultTelemetry:this.defaultTelemetry,defaultCapabilities:h,defaultToolPolicies:this.defaultToolPolicies,defaultFetch:this.defaultFetch,onPluginEvent:(E)=>{if(E.name==="plugin_log"){this.eventBridge.handlePluginLog(H,E.payload,y);return}this.eventBridge.handlePluginEvent(H,E,D)},onTeamEvent:(E)=>{this.eventBridge.handleTeamEvent(H,E),U.config.onTeamEvent?.(E)},createSpawnTool:()=>Z3({getSession:(E)=>this.sessions.get(E),subAgentStarts:this.subAgentStarts,onAgentEvent:(E,nf,uf)=>this.eventBridge.dispatchAgentEvent(E,nf,uf),invokeBackendOptional:(E,...nf)=>this.invokeOptional(E,...nf)},U.config,H,F),readSessionMetadata:async()=>(await this.getSession(H))?.metadata,writeSessionMetadata:async(E)=>{await this.persistSessionMetadata(H,()=>E)}});let K=await this.runtimeBuilder.build(U.runtimeBuilderInput),M=U.config,O=U.providerConfig;if(K.teamRuntime&&!M.teamName?.trim())M.teamName=K.teamRuntime.getTeamName();let u=[...K.tools,...M.extraTools??[]],vf=K.extensions??U.extensions,a={sessionId:H,providerId:O.providerId,modelId:O.modelId,apiKey:O.apiKey,baseUrl:O.baseUrl,headers:O.headers,knownModels:O.knownModels,providerConfig:O,thinking:M.thinking,reasoningEffort:M.reasoningEffort??O.reasoningEffort,systemPrompt:M.systemPrompt,maxIterations:M.maxIterations,execution:M.execution,prepareTurn:U2(M),tools:u,hooks:U.hooks,extensions:vf,hookErrorMode:M.hookErrorMode,initialMessages:U.effectiveInput.initialMessages,userFileContentLoader:fA,toolPolicies:U.toolPolicies,requestToolApproval:U.requestToolApproval,onConsecutiveMistakeLimitReached:M.onConsecutiveMistakeLimitReached,completionPolicy:K.completionPolicy,consumePendingUserMessage:()=>this.pendingPromptsController.consumeSteer(H),logger:K.logger??M.logger,extensionContext:M.extensionContext,onEvent:(E)=>this.eventBridge.dispatchAgentEvent(H,M,E)};a.hooks={...a.hooks,onEvent:async(E)=>{if(await U.hooks?.onEvent?.(E),E.type!=="assistant-message")return;let nf=this.sessions.get(H);if(!nf)return;let uf=nf.agent.getMessages();try{await this.invoke("persistSessionMessages",H,uf,M.systemPrompt)}catch(ff){M.logger?.error?.("Failed to persist session messages after assistant response",{sessionId:H,error:ff})}}};let c=this.createAgentInstance(a);if(a.onEvent)c.subscribeEvents(a.onEvent);K.registerLeadAgent?.(c);let d=h0({agentId:c.getAgentId(),conversationId:c.getConversationId(),teamId:K.teamRuntime?.getTeamId(),teamName:K.teamRuntime?.getTeamName(),teamRole:K.teamRuntime?"lead":void 0});if(YZ(M,H,J.length>0,A,d),d)v0(M.telemetry,{ulid:H,modelId:M.modelId,provider:M.providerId,...d});if(K.teamRuntime)o8(M.telemetry,{ulid:H,teamId:K.teamRuntime.getTeamId(),teamName:K.teamRuntime.getTeamName(),leadAgentId:c.getAgentId(),restoredFromPersistence:K.teamRestoredFromPersistence===!0});let e={sessionId:H,config:M,sessionMetadata:Q.sessionMetadata,...B?{artifacts:B}:{},source:$,startedAt:B?.manifest.started_at??W,updatedAt:B?.manifest.ended_at??B?.manifest.started_at??W,pendingPrompt:V.prompt,runtime:K,agent:c,started:!1,status:B?.manifest.status??"running",aborting:!1,interactive:f.interactive===!0,persistedMessages:Z,activeTeamRunIds:new Set,pendingTeamRunUpdates:[],teamRunWaiters:[],pendingPrompts:[],drainingPendingPrompts:!1,pluginSandboxShutdown:U.pluginSandboxShutdown,submitAndExitObserved:!1};if(this.sessions.set(H,e),this.emitStatus(H,"running"),Z.length>0&&!B){if(await this.ensureSessionPersisted(e),await this.invoke("persistSessionMessages",e.sessionId,Z,e.config.systemPrompt),!Q.prompt?.trim())await this.updateStatus(e,"completed",0)}let j0;try{if(Q.prompt?.trim())if(j0=await this.executeTurn(e,{prompt:Q.prompt,userImages:Q.userImages,userFiles:Q.userFiles}),!e.interactive)await this.finalizeSingleRun(e,j0.finishReason);else await this.completeInteractiveTurn(e,j0.finishReason)}catch(E){throw await this.failSession(e),E}return{sessionId:H,manifest:V,manifestPath:X,messagesPath:R,result:j0}}async restoreSession(f){return this.sessionVersioning.restoreCheckpoint({...f,getSession:($)=>this.getSession($),readMessages:($)=>this.readSessionMessages($),buildStartInput:($,W)=>{let J=$.restoredCheckpointMetadata?{...W.sessionMetadata??{},checkpoint:$.restoredCheckpointMetadata}:W.sessionMetadata;return{...W,...J?{sessionMetadata:J}:{},initialMessages:$.initialMessages}},startSession:($)=>this.startSession($),getStartedSessionId:($)=>$.sessionId,readRestoredSession:($)=>this.getSession($)})}async runTurn(f){let $=this.getSessionOrThrow(f.sessionId),W=$.agent.canStartRun(),J=f.delivery??($.interactive&&!W?"queue":void 0);if($.config.telemetry?.capture({event:"session.input_sent",properties:{sessionId:f.sessionId,promptLength:f.prompt.length,userImageCount:f.userImages?.length??0,userFileCount:f.userFiles?.length??0,delivery:J??"immediate"}}),J==="queue"||J==="steer"){this.pendingPromptsController.enqueue(f.sessionId,{prompt:f.prompt,delivery:J,userImages:f.userImages,userFiles:f.userFiles});return}try{let H=await this.executeTurn($,{prompt:f.prompt,userImages:f.userImages,userFiles:f.userFiles});if(!$.interactive)await this.finalizeSingleRun($,H.finishReason);else await this.completeInteractiveTurn($,H.finishReason);return queueMicrotask(()=>{this.pendingPromptsController.drain(f.sessionId)}),H}catch(H){throw await this.failSession($),H}}async getAccumulatedUsage(f){return OP(this.usageBySession.get(f))}async abort(f,$){let W=this.sessions.get(f);if(!W)return;W.config.telemetry?.capture({event:"session.aborted",properties:{sessionId:f}}),W.aborting=!0,this.pendingPromptsController.clearAborted(W),W.agent.abort($)}async stopSession(f){let $=this.sessions.get(f);if(!$)return;if($.config.telemetry?.capture({event:"session.stopped",properties:{sessionId:f}}),$.interactive&&$.status!=="running"){await this.releaseSessionRuntime($,"session_stop");return}$.aborting=!0,$.agent.abort(Error("session_stop")),await this.shutdownSession($,{status:"cancelled",exitCode:0,shutdownReason:"session_stop",endReason:"stopped"})}async dispose(f="session_manager_dispose"){let $=[...this.sessions.values()];if($.length===0)return;await Promise.allSettled($.map((W)=>W.interactive&&W.status!=="running"?this.releaseSessionRuntime(W,f):this.shutdownSession(W,{status:"cancelled",exitCode:0,shutdownReason:f,endReason:"disposed"}))),this.usageBySession.clear()}async getSession(f){let $=this.sessions.get(f);if($)return H3($);let W=f.trim();if(!W)return;let J=await this.getRow(W);if(J)return d2(J);let H=await this.readManifest(W);return H?X6(H):void 0}async listSessions(f=200){let W=(await this.listRows(f)).map(d2),J=new Set(W.map((H)=>H.sessionId));for(let H of this.sessions.values()){if(J.has(H.sessionId))continue;W.unshift(H3(H))}return W.slice(0,f)}async deleteSession(f){if(this.sessions.has(f))await this.stopSession(f);let $=await this.invoke("deleteSession",f);if($.deleted)this.usageBySession.delete(f);return $.deleted}async updateSession(f,$){return{updated:(await this.invokeOptionalValue("updateSession",{sessionId:f,prompt:$.prompt,metadata:$.metadata,title:$.title}))?.updated===!0}}async readSessionMessages(f){let $=f.trim();if(!$)return[];let W=await this.getRow($);if(W?.messagesPath)return x$(W.messagesPath);let J=await this.readManifest($);return x$(J?.messages_path)}async dispatchHookEvent(f){await CP(f,{queueSpawnRequest:($)=>this.invokeOptional("queueSpawnRequest",$),upsertSubagentSessionFromHook:($)=>this.invokeOptionalValue("upsertSubagentSessionFromHook",$),appendSubagentHookAudit:($,W)=>this.invokeOptional("appendSubagentHookAudit",$,W),applySubagentStatus:($,W)=>this.invokeOptional("applySubagentStatus",$,W)})}subscribe(f,$){return this.events.subscribe(f,$)}async updateSessionModel(f,$){let W=this.getSessionOrThrow(f);W.config.modelId=$,W.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults({modelId:$}),W.agent.updateConnection({modelId:$})}handlePluginEvent(f,$,W){return this.eventBridge.handlePluginEvent(f,$,W)}async executeTurn(f,$){let W=await this.prepareTurnInput(f,$),J=W.prompt.trim();if(!J)throw Error("prompt cannot be empty");if(!f.artifacts&&!f.pendingPrompt)f.pendingPrompt=J;await this.ensureSessionPersisted(f),await this.syncOAuthCredentials(f),await this.markTurnRunning(f);let H=await this.executeAgentTurn(f,J,W.userImages,W.userFiles);while(I5(f,H.finishReason)){let Q=await v5(f);if(Q.length===0)break;let Z=u5(f,Q);H=await this.executeAgentTurn(f,Z)}return H}async completeInteractiveTurn(f,$){if(J8(f))return;let W=$==="aborted"||f.aborting,J=$==="error";await this.updateStatus(f,W?"cancelled":J?"failed":"completed",J?1:0),this.emit({type:"ended",payload:{sessionId:f.sessionId,reason:$,ts:Date.now()}}),f.aborting=!1}async executeAgentTurn(f,$,W,J){let H=f.started||f.agent.getMessages().length>0,Q=f.persistedMessages??f.agent.getMessages(),Z=this.usageBySession.get(f.sessionId)??G$();f.turnUsageBaseline=Z,l8(f.config.telemetry,f.sessionId,f.config.mode),Y1(f.config.telemetry,{ulid:f.sessionId,provider:f.config.providerId,model:f.config.modelId,source:"user",mode:f.config.mode,...this.getSessionAgentTelemetryIdentity(f)});try{let P=H?()=>f.agent.continue($,W,J):()=>f.agent.run($,W,J),j=await this.runWithAuthRetry(f,P,Q);f.started=!0;let R=x8(j.messages,j,Q);f.persistedMessages=R;let X=u0(Z,j.usage);return this.usageBySession.set(f.sessionId,X),await this.persistSessionMetadata(f.sessionId,(A)=>({...A??{},totalCost:X.totalCost})),await this.invoke("persistSessionMessages",f.sessionId,R,f.config.systemPrompt),this.observeTaskCompletionTool(f,j),j}catch(P){throw await this.invoke("persistSessionMessages",f.sessionId,f.agent.getMessages(),f.config.systemPrompt),P}finally{f.turnUsageBaseline=void 0}}observeTaskCompletionTool(f,$){if(f.submitAndExitObserved)return;if(!$.toolCalls.some((J)=>J.name===Qf.SUBMIT_AND_EXIT&&J.error===void 0))return;f.submitAndExitObserved=!0,l2(f.config.telemetry,{ulid:f.sessionId,provider:f.config.providerId,modelId:f.config.modelId,mode:f.config.mode,durationMs:Date.now()-Date.parse(f.startedAt),source:"submit_and_exit",...this.getSessionAgentTelemetryIdentity(f)})}async prepareTurnInput(f,$){let W=c0(f.config),J=tL($.prompt).trim();if(!J)return{prompt:"",userImages:$.userImages,userFiles:this.resolveAbsoluteFilePaths(f.config.cwd,$.userFiles)};let H=await H1(J,W);FZ(f.config.telemetry,H);let Q=D6(H.prompt,f.config.mode),Z=this.resolveAbsoluteFilePaths(f.config.cwd,$.userFiles),P=this.resolveAbsoluteFilePaths(W,H.matchedFiles),j=Array.from(new Set([...Z,...P]));return{prompt:Q,userImages:$.userImages,userFiles:j.length>0?j:void 0}}async ensureSessionPersisted(f){if(f.artifacts)return;let $=c0(f.config);f.artifacts=await this.invoke("createRootSessionWithArtifacts",{sessionId:f.sessionId,source:f.source,pid:process.pid,interactive:f.interactive,provider:f.config.providerId,model:f.config.modelId,cwd:f.config.cwd,workspaceRoot:$,teamName:f.config.teamName,enableTools:f.config.enableTools,enableSpawn:f.config.enableSpawnAgent,enableTeams:f.config.enableAgentTeams,prompt:f.pendingPrompt,metadata:f.sessionMetadata,startedAt:f.startedAt})}async markTurnRunning(f){if(f.status==="running")return;await this.updateStatus(f,"running",null)}async persistSessionMetadata(f,$){let W=this.sessions.get(f),J=await this.invokeOptionalValue("readSessionManifest",f)??W?.artifacts?.manifest,H=$(J?.metadata);if(!W?.artifacts)return;if((await this.invokeOptionalValue("updateSession",{sessionId:f,metadata:H}))?.updated===!1)return;W.sessionMetadata=H,W.artifacts.manifest.metadata=H}async finalizeSingleRun(f,$){if(J8(f))return;let W=$==="aborted"||f.aborting,J=$==="error";await this.shutdownSession(f,{status:W?"cancelled":J?"failed":"completed",exitCode:J?1:0,shutdownReason:J?"session_error":"session_complete",endReason:$})}async failSession(f){await this.shutdownSession(f,{status:"failed",exitCode:1,shutdownReason:"session_error",endReason:"error"})}async shutdownSession(f,$){if($.status==="completed"&&!f.submitAndExitObserved)l2(f.config.telemetry,{ulid:f.sessionId,provider:f.config.providerId,modelId:f.config.modelId,mode:f.config.mode,durationMs:Date.now()-Date.parse(f.startedAt),source:"shutdown",...this.getSessionAgentTelemetryIdentity(f)});G6(f);let W=[],J=(H,Q)=>{W.push(Q),f.config.logger?.log("Session shutdown cleanup failed",{sessionId:f.sessionId,stage:H,error:Q,severity:"warn"})};if(f.artifacts){try{await this.updateStatus(f,$.status,$.exitCode)}catch(H){J("update_status",H)}try{await f.agent.shutdown($.shutdownReason)}catch(H){J("agent_shutdown",H)}}try{await Promise.resolve(f.runtime.shutdown($.shutdownReason))}catch(H){J("runtime_shutdown",H)}try{await f.pluginSandboxShutdown?.()}catch(H){J("plugin_sandbox_shutdown",H)}if(this.sessions.delete(f.sessionId),this.emit({type:"ended",payload:{sessionId:f.sessionId,reason:$.endReason,ts:Date.now()}}),W.length>0&&$.status==="failed")throw W[0]}async releaseSessionRuntime(f,$){let W=[],J=(H,Q)=>{W.push(Q),f.config.logger?.log("Session runtime cleanup failed",{sessionId:f.sessionId,stage:H,error:Q,severity:"warn"})};try{await f.agent.shutdown($)}catch(H){J("agent_shutdown",H)}try{await Promise.resolve(f.runtime.shutdown($))}catch(H){J("runtime_shutdown",H)}try{await f.pluginSandboxShutdown?.()}catch(H){J("plugin_sandbox_shutdown",H)}if(this.sessions.delete(f.sessionId),W.length>0)throw W[0]}async updateStatus(f,$,W){if(!f.artifacts)return;let J=await this.invoke("updateSessionStatus",f.sessionId,$,W);if(!J.updated)return;let H=await this.invokeOptionalValue("readSessionManifest",f.sessionId)??f.artifacts.manifest;if(H.status=$,$==="running")delete H.ended_at,H.exit_code=null;else H.ended_at=J.endedAt??t(),H.exit_code=typeof W==="number"?W:null;f.artifacts.manifest=H,f.status=$,f.updatedAt=J.endedAt??t(),f.endedAt=$==="running"?null:H.ended_at,f.exitCode=H.exit_code,await this.invoke("writeSessionManifest",f.artifacts.manifestPath,H),this.emitStatus(f.sessionId,$)}async runWithAuthRetry(f,$,W){try{return await $()}catch(J){if(!aL(J,f.config.providerId))throw J;return await this.syncOAuthCredentials(f,{forceRefresh:!0}),f.agent.restore(W),$()}}async syncOAuthCredentials(f,$){let W=null;try{W=await this.oauthTokenManager.resolveProviderApiKey({providerId:f.config.providerId,forceRefresh:$?.forceRefresh})}catch(J){if(J instanceof fJ)throw Error(`${J.providerId} requires re-authentication.`);throw J}if(!W?.apiKey||f.config.apiKey===W.apiKey)return;f.config.apiKey=W.apiKey,f.agent.updateConnection({apiKey:W.apiKey}),f.runtime.delegatedAgentConfigProvider?.updateConnectionDefaults({apiKey:W.apiKey}),f.runtime.teamRuntime?.updateTeammateConnections({apiKey:W.apiKey})}getSessionOrThrow(f){let $=this.sessions.get(f);if(!$)throw Error(`session not found: ${f}`);return $}resolveAbsoluteFilePaths(f,$){if(!$||$.length===0)return[];let W=$.map((J)=>J.trim()).filter((J)=>J.length>0).map((J)=>pL(J)?J:iL(f,J));return Array.from(new Set(W))}getSessionAgentTelemetryIdentity(f){return h0({agentId:f.agent.getAgentId(),conversationId:f.agent.getConversationId(),teamId:f.runtime.teamRuntime?.getTeamId(),teamName:f.runtime.teamRuntime?.getTeamName(),teamRole:f.runtime.teamRuntime?"lead":void 0})}emitStatus(f,$){this.emitSessionSnapshot(f),this.emit({type:"status",payload:{sessionId:f,status:$}})}async emitSessionSnapshot(f){let $=await this.getSession(f);if(!$)return;this.emit({type:"session_snapshot",payload:{sessionId:f,snapshot:f0({session:$,messages:await this.readSessionMessages(f),usage:this.usageBySession.get(f)})}})}emit(f){this.events.emit(f)}async listRows(f){return this.invoke("listSessions",Math.min(Math.max(1,Math.floor(f)),$A))}async getRow(f){let $=f.trim();if(!$)return;return(await this.listRows($A)).find((J)=>J.sessionId===$)}async readManifest(f){let $=f.trim();if(!$)return;return await this.invokeOptionalValue("readSessionManifest",$)}invoke(f,...$){return sX(this.sessionService,f,...$)}invokeOptional(f,...$){return oX(this.sessionService,f,...$)}invokeOptionalValue(f,...$){return eX(this.sessionService,f,...$)}}function eL(f){return{text:f.text,usage:f.usage,inputTokens:f.usage.inputTokens,outputTokens:f.usage.outputTokens,iterations:f.iterations,finishReason:f.finishReason,toolCalls:f.toolCalls.map(($)=>({name:$.name,input:$.input,output:$.output,error:$.error,durationMs:$.durationMs}))}}function fO(f){return f.mode==="plan"?"plan":f.mode==="yolo"?"yolo":"act"}function x6(f={}){let $=new Q0({sessionService:new H0(new W0),fetch:f.fetch,telemetry:f.telemetry});return{async startSession(W){let J=(W.cwd?.trim()||W.workspaceRoot).trim(),H=await $.startSession({source:W.source?.trim()||jf.CLI,interactive:!1,config:{providerId:oL(W.provider),modelId:W.model,apiKey:W.apiKey?.trim()||void 0,cwd:J,workspaceRoot:W.workspaceRoot,systemPrompt:W.systemPrompt??"",mode:fO(W),maxIterations:W.maxIterations,enableTools:W.enableTools!==!1,enableSpawnAgent:W.enableSpawn!==!1,enableAgentTeams:W.enableTeams!==!1,disableMcpSettingsTools:W.disableMcpSettingsTools,missionLogIntervalSteps:W.missionStepInterval,missionLogIntervalMs:W.missionTimeIntervalMs},toolPolicies:W.toolPolicies??{"*":{autoApprove:W.autoApproveTools!==!1}},localRuntime:{configExtensions:W.configExtensions}});return{sessionId:H.sessionId,startResult:{sessionId:H.sessionId,manifestPath:H.manifestPath,messagesPath:H.messagesPath}}},async sendSession(W,J){let H=await $.runTurn({sessionId:W,prompt:J.prompt,userImages:J.attachments?.userImages,userFiles:J.attachments?.userFiles?.map((Q)=>Q.content)});if(!H)throw Error("local hub schedule runtime returned no turn result");return{result:eL(H)}},async abortSession(W){return await $.abort(W,Error("hub schedule abort")),{applied:!0}},async stopSession(W){return await $.stopSession(W),{applied:!0}}}}$O(process.env.CLINE_VCR);function WO(f){let $=process.cwd(),W,J,H;for(let Q=0;Q<f.length;Q+=1){let Z=f[Q],P=f[Q+1];if(Z==="--cwd"&&P){$=P,Q+=1;continue}if(Z==="--host"&&P){W=P,Q+=1;continue}if(Z==="--port"&&P){let j=Number(P);if(Number.isFinite(j))J=j;Q+=1;continue}if(Z==="--pathname"&&P)H=P,Q+=1}return{cwd:$,host:W,port:J,pathname:H}}async function JO(){let f=WO(process.argv.slice(2));process.chdir(f.cwd);let $=Sf({host:f.host,port:f.port,pathname:f.pathname}),W=await t$({host:$.host,port:$.port,pathname:$.pathname,owner:Hf(),runtimeHandlers:x6(),cronOptions:{workspaceRoot:f.cwd}}),J=async()=>{await W.close(),process.exit(0)},H=!1,Q=(Z,P)=>{if(H)return;H=!0;let j=P instanceof Error?P.stack||P.message:String(P);process.stderr.write(`[hub-daemon] ${Z}: ${j}
718
+ `),W.close().catch((R)=>{let X=R instanceof Error?R.stack||R.message:String(R);process.stderr.write(`[hub-daemon] shutdown after ${Z} failed: ${X}
719
+ `)}).finally(()=>{process.exit(1)})};process.on("SIGINT",()=>{J()}),process.on("SIGTERM",()=>{J()}),process.on("uncaughtException",(Z)=>{Q("uncaughtException",Z)}),process.on("unhandledRejection",(Z)=>{Q("unhandledRejection",Z)}),await new Promise(()=>{})}JO().catch((f)=>{let $=f instanceof Error?f.stack||f.message:String(f);process.stderr.write(`[hub-daemon] fatal: ${$}
720
+ `),process.exit(1)});