@clinebot/core 0.0.36 → 0.0.37

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 (228) hide show
  1. package/dist/ClineCore.d.ts +312 -3
  2. package/dist/ClineCore.d.ts.map +1 -1
  3. package/dist/account/cline-account-service.d.ts.map +1 -1
  4. package/dist/cron/cron-event-ingress.d.ts +38 -0
  5. package/dist/cron/cron-event-ingress.d.ts.map +1 -0
  6. package/dist/cron/cron-materializer.d.ts +36 -0
  7. package/dist/cron/cron-materializer.d.ts.map +1 -0
  8. package/dist/cron/cron-reconciler.d.ts +62 -0
  9. package/dist/cron/cron-reconciler.d.ts.map +1 -0
  10. package/dist/cron/cron-report-writer.d.ts +41 -0
  11. package/dist/cron/cron-report-writer.d.ts.map +1 -0
  12. package/dist/cron/cron-runner.d.ts +43 -0
  13. package/dist/cron/cron-runner.d.ts.map +1 -0
  14. package/dist/cron/cron-schema.d.ts +3 -0
  15. package/dist/cron/cron-schema.d.ts.map +1 -0
  16. package/dist/cron/cron-service.d.ts +57 -0
  17. package/dist/cron/cron-service.d.ts.map +1 -0
  18. package/dist/cron/cron-spec-parser.d.ts +27 -0
  19. package/dist/cron/cron-spec-parser.d.ts.map +1 -0
  20. package/dist/cron/cron-watcher.d.ts +23 -0
  21. package/dist/cron/cron-watcher.d.ts.map +1 -0
  22. package/dist/cron/scheduler.d.ts +3 -1
  23. package/dist/cron/scheduler.d.ts.map +1 -1
  24. package/dist/cron/sqlite-cron-store.d.ts +230 -0
  25. package/dist/cron/sqlite-cron-store.d.ts.map +1 -0
  26. package/dist/extensions/plugin/plugin-config-loader.d.ts +7 -1
  27. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  28. package/dist/extensions/plugin/plugin-loader.d.ts +10 -6
  29. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  30. package/dist/extensions/plugin/plugin-sandbox.d.ts +7 -1
  31. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  32. package/dist/extensions/plugin-sandbox-bootstrap.js +236 -275
  33. package/dist/extensions/tools/constants.d.ts +1 -0
  34. package/dist/extensions/tools/constants.d.ts.map +1 -1
  35. package/dist/extensions/tools/definitions.d.ts +2 -3
  36. package/dist/extensions/tools/definitions.d.ts.map +1 -1
  37. package/dist/extensions/tools/executors/editor.d.ts.map +1 -1
  38. package/dist/extensions/tools/helpers.d.ts +1 -0
  39. package/dist/extensions/tools/helpers.d.ts.map +1 -1
  40. package/dist/extensions/tools/index.d.ts +1 -2
  41. package/dist/extensions/tools/index.d.ts.map +1 -1
  42. package/dist/extensions/tools/presets.d.ts +1 -1
  43. package/dist/extensions/tools/schemas.d.ts +25 -3
  44. package/dist/extensions/tools/schemas.d.ts.map +1 -1
  45. package/dist/extensions/tools/team/delegated-agent.d.ts +2 -2
  46. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -1
  47. package/dist/extensions/tools/team/multi-agent.d.ts +7 -3
  48. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -1
  49. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
  50. package/dist/extensions/tools/types.d.ts +0 -5
  51. package/dist/extensions/tools/types.d.ts.map +1 -1
  52. package/dist/hooks/hook-bridge.d.ts +118 -0
  53. package/dist/hooks/hook-bridge.d.ts.map +1 -0
  54. package/dist/hooks/hook-file-hooks.d.ts +2 -1
  55. package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
  56. package/dist/hooks/hook-registry.d.ts +16 -0
  57. package/dist/hooks/hook-registry.d.ts.map +1 -0
  58. package/dist/hub/browser-websocket.d.ts.map +1 -1
  59. package/dist/hub/client.d.ts +7 -1
  60. package/dist/hub/client.d.ts.map +1 -1
  61. package/dist/hub/daemon-entry.js +721 -461
  62. package/dist/hub/daemon.d.ts.map +1 -1
  63. package/dist/hub/defaults.d.ts +8 -4
  64. package/dist/hub/defaults.d.ts.map +1 -1
  65. package/dist/hub/index.js +665 -415
  66. package/dist/hub/runtime-handlers.d.ts.map +1 -1
  67. package/dist/hub/server.d.ts +18 -0
  68. package/dist/hub/server.d.ts.map +1 -1
  69. package/dist/hub/session-client.d.ts +3 -0
  70. package/dist/hub/session-client.d.ts.map +1 -1
  71. package/dist/hub/start-shared-server.d.ts.map +1 -1
  72. package/dist/hub/ui-client.d.ts +1 -0
  73. package/dist/hub/ui-client.d.ts.map +1 -1
  74. package/dist/index.d.ts +9 -7
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +756 -467
  77. package/dist/llms/cline-recommended-models.d.ts +20 -0
  78. package/dist/llms/cline-recommended-models.d.ts.map +1 -0
  79. package/dist/llms/handler-factory.d.ts +16 -0
  80. package/dist/llms/handler-factory.d.ts.map +1 -0
  81. package/dist/llms/provider-defaults.d.ts.map +1 -1
  82. package/dist/llms/provider-settings.d.ts +45 -2
  83. package/dist/llms/provider-settings.d.ts.map +1 -1
  84. package/dist/llms/runtime-registry.d.ts.map +1 -1
  85. package/dist/runtime/agent-config-adapter.d.ts +148 -0
  86. package/dist/runtime/agent-config-adapter.d.ts.map +1 -0
  87. package/dist/runtime/agent-runtime-config-builder.d.ts +96 -0
  88. package/dist/runtime/agent-runtime-config-builder.d.ts.map +1 -0
  89. package/dist/runtime/history.d.ts +6 -0
  90. package/dist/runtime/history.d.ts.map +1 -1
  91. package/dist/runtime/host.d.ts.map +1 -1
  92. package/dist/runtime/loop-detection.d.ts +59 -0
  93. package/dist/runtime/loop-detection.d.ts.map +1 -0
  94. package/dist/runtime/mistake-tracker.d.ts +69 -0
  95. package/dist/runtime/mistake-tracker.d.ts.map +1 -0
  96. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  97. package/dist/runtime/runtime-event-adapter.d.ts +102 -0
  98. package/dist/runtime/runtime-event-adapter.d.ts.map +1 -0
  99. package/dist/runtime/runtime-host.d.ts +28 -3
  100. package/dist/runtime/runtime-host.d.ts.map +1 -1
  101. package/dist/runtime/session-runtime-orchestrator.d.ts +261 -0
  102. package/dist/runtime/session-runtime-orchestrator.d.ts.map +1 -0
  103. package/dist/runtime/session-runtime.d.ts +16 -3
  104. package/dist/runtime/session-runtime.d.ts.map +1 -1
  105. package/dist/runtime/user-input-builder.d.ts +24 -0
  106. package/dist/runtime/user-input-builder.d.ts.map +1 -0
  107. package/dist/services/index.js +28 -0
  108. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
  109. package/dist/services/plugin-tools.d.ts.map +1 -1
  110. package/dist/services/providers/local-provider-registry.d.ts +197 -21
  111. package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
  112. package/dist/services/providers/local-provider-service.d.ts +3 -1
  113. package/dist/services/providers/local-provider-service.d.ts.map +1 -1
  114. package/dist/services/session-data.d.ts.map +1 -1
  115. package/dist/services/session-telemetry.d.ts +7 -2
  116. package/dist/services/session-telemetry.d.ts.map +1 -1
  117. package/dist/services/storage/file-team-store.d.ts.map +1 -1
  118. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
  119. package/dist/services/storage/provider-settings-manager.d.ts +1 -0
  120. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -1
  121. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -1
  122. package/dist/session/conversation-store.d.ts +30 -0
  123. package/dist/session/conversation-store.d.ts.map +1 -0
  124. package/dist/session/message-builder.d.ts +65 -0
  125. package/dist/session/message-builder.d.ts.map +1 -0
  126. package/dist/session/session-manifest.d.ts +1 -1
  127. package/dist/transports/hub.d.ts +14 -3
  128. package/dist/transports/hub.d.ts.map +1 -1
  129. package/dist/transports/local.d.ts +14 -4
  130. package/dist/transports/local.d.ts.map +1 -1
  131. package/dist/transports/remote.d.ts.map +1 -1
  132. package/dist/types/chat-schema.d.ts +5 -5
  133. package/dist/types/config.d.ts +9 -0
  134. package/dist/types/config.d.ts.map +1 -1
  135. package/dist/types/events.d.ts +7 -6
  136. package/dist/types/events.d.ts.map +1 -1
  137. package/dist/types/provider-settings.d.ts +2 -2
  138. package/dist/types/provider-settings.d.ts.map +1 -1
  139. package/dist/types/session.d.ts +5 -2
  140. package/dist/types/session.d.ts.map +1 -1
  141. package/dist/types.d.ts +4 -4
  142. package/dist/types.d.ts.map +1 -1
  143. package/package.json +4 -4
  144. package/src/ClineCore.ts +691 -6
  145. package/src/account/cline-account-service.ts +44 -6
  146. package/src/cron/cron-event-ingress.ts +357 -0
  147. package/src/cron/cron-materializer.ts +97 -0
  148. package/src/cron/cron-reconciler.ts +241 -0
  149. package/src/cron/cron-report-writer.ts +153 -0
  150. package/src/cron/cron-runner.ts +495 -0
  151. package/src/cron/cron-schema.ts +127 -0
  152. package/src/cron/cron-service.ts +163 -0
  153. package/src/cron/cron-spec-parser.ts +489 -0
  154. package/src/cron/cron-watcher.ts +102 -0
  155. package/src/cron/index.ts +10 -0
  156. package/src/cron/scheduler.ts +141 -6
  157. package/src/cron/sqlite-cron-store.ts +1286 -0
  158. package/src/extensions/plugin/plugin-config-loader.ts +21 -1
  159. package/src/extensions/plugin/plugin-loader.ts +25 -9
  160. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +151 -1
  161. package/src/extensions/plugin/plugin-sandbox.ts +131 -7
  162. package/src/extensions/tools/constants.ts +2 -0
  163. package/src/extensions/tools/definitions.ts +31 -22
  164. package/src/extensions/tools/executors/editor.ts +4 -3
  165. package/src/extensions/tools/helpers.ts +24 -0
  166. package/src/extensions/tools/index.ts +1 -2
  167. package/src/extensions/tools/presets.ts +1 -1
  168. package/src/extensions/tools/schemas.ts +13 -18
  169. package/src/extensions/tools/team/delegated-agent.ts +8 -3
  170. package/src/extensions/tools/team/multi-agent.ts +135 -19
  171. package/src/extensions/tools/team/team-tools.ts +151 -91
  172. package/src/extensions/tools/types.ts +0 -6
  173. package/src/hooks/hook-bridge.ts +489 -0
  174. package/src/hooks/hook-file-hooks.ts +58 -3
  175. package/src/hooks/hook-registry.ts +257 -0
  176. package/src/hub/browser-websocket.ts +26 -4
  177. package/src/hub/client.ts +72 -13
  178. package/src/hub/daemon-entry.ts +35 -0
  179. package/src/hub/daemon.ts +117 -14
  180. package/src/hub/defaults.ts +39 -12
  181. package/src/hub/runtime-handlers.ts +4 -3
  182. package/src/hub/server.ts +506 -77
  183. package/src/hub/session-client.ts +43 -1
  184. package/src/hub/start-shared-server.ts +3 -0
  185. package/src/hub/ui-client.ts +4 -0
  186. package/src/index.ts +46 -1
  187. package/src/llms/cline-recommended-models.ts +167 -0
  188. package/src/llms/handler-factory.ts +56 -0
  189. package/src/llms/provider-defaults.ts +17 -1
  190. package/src/llms/provider-settings.ts +48 -1
  191. package/src/llms/runtime-registry.ts +1 -0
  192. package/src/runtime/agent-config-adapter.ts +636 -0
  193. package/src/runtime/agent-runtime-config-builder.ts +205 -0
  194. package/src/runtime/error-feedback.ts +142 -0
  195. package/src/runtime/history.ts +137 -0
  196. package/src/runtime/host.ts +22 -0
  197. package/src/runtime/loop-detection.ts +162 -0
  198. package/src/runtime/mistake-tracker.ts +221 -0
  199. package/src/runtime/runtime-builder.ts +61 -5
  200. package/src/runtime/runtime-event-adapter.ts +412 -0
  201. package/src/runtime/runtime-host.ts +45 -1
  202. package/src/runtime/session-runtime-orchestrator.ts +1253 -0
  203. package/src/runtime/session-runtime.ts +16 -2
  204. package/src/runtime/user-input-builder.ts +167 -0
  205. package/src/services/local-runtime-bootstrap.ts +128 -22
  206. package/src/services/plugin-tools.ts +1 -0
  207. package/src/services/providers/local-provider-registry.ts +273 -57
  208. package/src/services/providers/local-provider-service.ts +67 -7
  209. package/src/services/session-data.ts +16 -14
  210. package/src/services/session-telemetry.ts +6 -15
  211. package/src/services/storage/file-team-store.ts +1 -5
  212. package/src/services/storage/provider-settings-legacy-migration.ts +8 -47
  213. package/src/services/storage/provider-settings-manager.ts +16 -1
  214. package/src/services/storage/sqlite-team-store.ts +1 -5
  215. package/src/session/conversation-store.ts +77 -0
  216. package/src/session/message-builder.ts +941 -0
  217. package/src/transports/hub.ts +458 -33
  218. package/src/transports/local.ts +296 -65
  219. package/src/transports/remote.ts +1 -0
  220. package/src/types/config.ts +9 -0
  221. package/src/types/events.ts +8 -6
  222. package/src/types/index.ts +3 -0
  223. package/src/types/provider-settings.ts +8 -1
  224. package/src/types/session.ts +5 -2
  225. package/src/types.ts +15 -1
  226. package/dist/cron/index.d.ts +0 -6
  227. package/dist/cron/index.d.ts.map +0 -1
  228. package/dist/services/telemetry/index.js +0 -28
@@ -1,3 +1,4 @@
1
+ import type * as LlmsProviders from "@clinebot/llms";
1
2
  import type {
2
3
  ChatRunTurnRequest,
3
4
  ChatStartSessionRequest,
@@ -75,12 +76,31 @@ function extractSessionRow(
75
76
  };
76
77
  }
77
78
 
79
+ function hubReplyErrorMessage(
80
+ reply: { error?: { message?: string } },
81
+ command: string,
82
+ ): string {
83
+ return reply.error?.message ?? `hub command failed: ${command}`;
84
+ }
85
+
78
86
  function mapHubEvent(event: HubEventEnvelope): HubStreamEvent | undefined {
79
87
  const sessionId = event.sessionId?.trim();
80
88
  if (!sessionId) {
81
89
  return undefined;
82
90
  }
83
91
  switch (event.event) {
92
+ case "iteration.started":
93
+ return {
94
+ sessionId,
95
+ eventType: "runtime.chat.iteration_start",
96
+ payload: cloneRecord(event.payload),
97
+ };
98
+ case "iteration.finished":
99
+ return {
100
+ sessionId,
101
+ eventType: "runtime.chat.iteration_end",
102
+ payload: cloneRecord(event.payload),
103
+ };
84
104
  case "assistant.delta":
85
105
  return {
86
106
  sessionId,
@@ -159,6 +179,10 @@ export class HubSessionClient {
159
179
  this.client.close();
160
180
  }
161
181
 
182
+ async dispose(): Promise<void> {
183
+ await this.client.dispose();
184
+ }
185
+
162
186
  async startRuntimeSession(
163
187
  request: ChatStartSessionRequest,
164
188
  ): Promise<ChatStartSessionResponse> {
@@ -201,6 +225,7 @@ export class HubSessionClient {
201
225
  enableSpawn: request.enableSpawn,
202
226
  enableTeams: request.enableTeams,
203
227
  autoApproveTools: request.autoApproveTools,
228
+ configExtensions: request.configExtensions,
204
229
  },
205
230
  modelSelection: {
206
231
  provider: request.provider,
@@ -208,7 +233,6 @@ export class HubSessionClient {
208
233
  apiKey: request.apiKey,
209
234
  },
210
235
  toolPolicies: request.toolPolicies,
211
- initialMessages: request.initialMessages,
212
236
  });
213
237
  const row = extractSessionRow(reply.payload);
214
238
  if (!row?.sessionId) {
@@ -281,6 +305,24 @@ export class HubSessionClient {
281
305
  return extractSessionRow(reply.payload);
282
306
  }
283
307
 
308
+ async readMessages(sessionId: string): Promise<LlmsProviders.Message[]> {
309
+ const target = sessionId.trim();
310
+ if (!target) {
311
+ return [];
312
+ }
313
+ await this.ensureMetadataApplied();
314
+ const reply = await this.client.command(
315
+ "session.messages",
316
+ { sessionId: target },
317
+ target,
318
+ );
319
+ if (!reply.ok) {
320
+ throw new Error(hubReplyErrorMessage(reply, "session.messages"));
321
+ }
322
+ const messages = reply.payload?.messages;
323
+ return Array.isArray(messages) ? (messages as LlmsProviders.Message[]) : [];
324
+ }
325
+
284
326
  async listSessions(input?: { limit?: number }): Promise<HubSessionRow[]> {
285
327
  await this.ensureMetadataApplied();
286
328
  const reply = await this.client.command("session.list", {
@@ -45,6 +45,8 @@ export async function startHubServer(
45
45
  export async function ensureHubServer(
46
46
  options: EnsureHubServerOptions,
47
47
  ): Promise<EnsureHubServerResult> {
48
+ const hasExplicitPort =
49
+ options.port !== undefined || !!process.env.CLINE_HUB_PORT?.trim();
48
50
  const endpoint = resolveHubEndpointOptions({
49
51
  host: options.host,
50
52
  port: options.port,
@@ -53,6 +55,7 @@ export async function ensureHubServer(
53
55
  return await ensureHubWebSocketServer({
54
56
  ...options,
55
57
  ...endpoint,
58
+ allowPortFallback: options.allowPortFallback ?? !hasExplicitPort,
56
59
  owner: resolveSharedHubOwnerContext(),
57
60
  });
58
61
  }
@@ -39,6 +39,10 @@ export class HubUIClient {
39
39
  this.client.close();
40
40
  }
41
41
 
42
+ async dispose(): Promise<void> {
43
+ await this.client.dispose();
44
+ }
45
+
42
46
  getClientId(): string {
43
47
  return this.client.getClientId();
44
48
  }
package/src/index.ts CHANGED
@@ -11,10 +11,15 @@ export type {
11
11
  AgentConfig,
12
12
  AgentEvent,
13
13
  AgentExtension,
14
+ AgentExtension as AgentPlugin, // Public-facing alias for extensions
14
15
  AgentExtensionCommand,
16
+ AgentExtensionCommand as AgentPluginCommand,
15
17
  AgentHooks,
16
18
  AgentMode,
17
19
  AgentResult,
20
+ AgentRunResult,
21
+ AgentRunStatus,
22
+ AutomationEventEnvelope,
18
23
  BasicLogger,
19
24
  ChatRunTurnRequest,
20
25
  ChatRuntimeConfig,
@@ -23,6 +28,7 @@ export type {
23
28
  ChatTurnResult,
24
29
  ClineAccountActionRequest,
25
30
  ConnectorHookEvent,
31
+ ContentBlock,
26
32
  EnterpriseAuthenticateRequest,
27
33
  EnterpriseAuthenticateResponse,
28
34
  EnterpriseStatusRequest,
@@ -30,10 +36,14 @@ export type {
30
36
  EnterpriseSyncRequest,
31
37
  EnterpriseSyncResponse,
32
38
  emptyWorkspaceManifest,
39
+ FileContent,
33
40
  GetProviderModelsActionRequest,
34
41
  HookSessionContext,
42
+ ImageContent,
35
43
  ITelemetryService,
36
44
  ListProvidersActionRequest,
45
+ Message,
46
+ MessageWithMetadata,
37
47
  OAuthProviderId,
38
48
  ProviderActionRequest,
39
49
  ProviderCatalogResponse,
@@ -52,11 +62,15 @@ export type {
52
62
  TelemetryPrimitive,
53
63
  TelemetryProperties,
54
64
  TelemetryValue,
65
+ TextContent,
66
+ ThinkingContent,
55
67
  Tool,
56
68
  ToolApprovalRequest,
57
69
  ToolApprovalResult,
58
70
  ToolContext,
59
71
  ToolPolicy,
72
+ ToolResultContent,
73
+ ToolUseContent,
60
74
  WorkspaceInfo,
61
75
  WorkspaceInfoSchema,
62
76
  WorkspaceManifest,
@@ -151,13 +165,24 @@ export type {
151
165
  OcaTokenResolution,
152
166
  } from "./auth/types";
153
167
  export {
168
+ type ClineAutomationEventIngressResult,
169
+ type ClineAutomationEventLog,
170
+ type ClineAutomationEventSuppression,
171
+ type ClineAutomationListEventsOptions,
172
+ type ClineAutomationListRunsOptions,
173
+ type ClineAutomationListSpecsOptions,
174
+ type ClineAutomationRun,
175
+ type ClineAutomationRunStatus,
176
+ type ClineAutomationSpec,
154
177
  ClineCore,
178
+ type ClineCoreAutomationApi,
179
+ type ClineCoreAutomationOptions,
180
+ type ClineCoreListHistoryOptions,
155
181
  type ClineCoreOptions,
156
182
  type ClineCoreStartInput,
157
183
  type HubOptions,
158
184
  type RemoteOptions,
159
185
  } from "./ClineCore";
160
- export * from "./cron";
161
186
  export type {
162
187
  LoadAgentPluginFromPathOptions,
163
188
  PluginInitializationFailure,
@@ -336,6 +361,11 @@ export {
336
361
  DefaultRuntimeBuilder,
337
362
  } from "./runtime/runtime-builder";
338
363
  export type {
364
+ PendingPromptMutationResult,
365
+ PendingPromptsAction,
366
+ PendingPromptsDeleteInput,
367
+ PendingPromptsListInput,
368
+ PendingPromptsUpdateInput,
339
369
  RuntimeHost,
340
370
  RuntimeHost as SessionHost,
341
371
  RuntimeHostMode,
@@ -504,6 +534,7 @@ export { CORE_BUILD_VERSION } from "./version";
504
534
  export async function loadOpenTelemetryAdapter() {
505
535
  return import("./services/telemetry/index.js");
506
536
  }
537
+ export { Agent, createAgentRuntime } from "@clinebot/agents";
507
538
  export { createContextCompactionPrepareTurn } from "./extensions/context/compaction";
508
539
  export {
509
540
  ALL_DEFAULT_TOOL_NAMES,
@@ -532,6 +563,13 @@ export {
532
563
  type ToolPresetName,
533
564
  ToolPresets,
534
565
  } from "./extensions/tools";
566
+ export {
567
+ type ClineRecommendedModel,
568
+ type ClineRecommendedModelsData,
569
+ FALLBACK_CLINE_RECOMMENDED_MODELS,
570
+ type FetchClineRecommendedModelsOptions,
571
+ fetchClineRecommendedModels,
572
+ } from "./llms/cline-recommended-models";
535
573
  export {
536
574
  clearLiveModelsCatalogCache,
537
575
  clearPrivateModelsCatalogCache,
@@ -551,9 +589,11 @@ export type {
551
589
  ModelCatalogSettings,
552
590
  OcaSettings,
553
591
  ProviderCapability,
592
+ ProviderClient,
554
593
  ProviderConfig,
555
594
  ProviderDefaultsConfig,
556
595
  ProviderId,
596
+ ProviderProtocol,
557
597
  ProviderSettings,
558
598
  ReasoningSettings,
559
599
  SapSettings,
@@ -570,7 +610,9 @@ export {
570
610
  ModelCatalogSettingsSchema,
571
611
  normalizeProviderId,
572
612
  OcaSettingsSchema,
613
+ ProviderClientSchema,
573
614
  ProviderIdSchema,
615
+ ProviderProtocolSchema,
574
616
  ProviderSettingsSchema,
575
617
  parseSettings,
576
618
  ReasoningSettingsSchema,
@@ -621,6 +663,9 @@ export type {
621
663
  CoreSessionEvent,
622
664
  SessionChunkEvent,
623
665
  SessionEndedEvent,
666
+ SessionPendingPrompt,
667
+ SessionPendingPromptSubmittedEvent,
668
+ SessionPendingPromptsEvent,
624
669
  SessionTeamProgressEvent,
625
670
  SessionToolEvent,
626
671
  } from "./types/events";
@@ -0,0 +1,167 @@
1
+ import { ProviderSettingsManager } from "../services/storage/provider-settings-manager";
2
+
3
+ export interface ClineRecommendedModel {
4
+ id: string;
5
+ name: string;
6
+ description: string;
7
+ tags: string[];
8
+ }
9
+
10
+ export interface ClineRecommendedModelsData {
11
+ recommended: ClineRecommendedModel[];
12
+ free: ClineRecommendedModel[];
13
+ }
14
+
15
+ export interface FetchClineRecommendedModelsOptions {
16
+ baseUrl?: string;
17
+ fetchImpl?: typeof fetch;
18
+ providerSettingsManager?: Pick<
19
+ ProviderSettingsManager,
20
+ "getProviderSettings"
21
+ >;
22
+ timeoutMs?: number;
23
+ }
24
+
25
+ const DEFAULT_API_BASE_URL = "https://api.cline.bot";
26
+ const DEFAULT_REQUEST_TIMEOUT_MS = 5_000;
27
+
28
+ export const FALLBACK_CLINE_RECOMMENDED_MODELS: ClineRecommendedModelsData = {
29
+ recommended: [
30
+ {
31
+ id: "anthropic/claude-opus-4.6",
32
+ name: "Claude Opus 4.6",
33
+ description: "Most intelligent model for agents and coding",
34
+ tags: ["BEST"],
35
+ },
36
+ {
37
+ id: "anthropic/claude-sonnet-4.6",
38
+ name: "Claude Sonnet 4.6",
39
+ description: "Strong coding and agent performance",
40
+ tags: ["NEW"],
41
+ },
42
+ {
43
+ id: "google/gemini-3.1-pro-preview",
44
+ name: "Gemini 3.1 Pro Preview",
45
+ description: "1M context window, strong coding performance",
46
+ tags: ["NEW"],
47
+ },
48
+ {
49
+ id: "openai/gpt-5.3-codex",
50
+ name: "GPT-5.3 Codex",
51
+ description: "OpenAI's latest with strong coding abilities",
52
+ tags: ["NEW"],
53
+ },
54
+ ],
55
+ free: [
56
+ {
57
+ id: "kwaipilot/kat-coder-pro",
58
+ name: "KwaiKAT Kat Coder Pro",
59
+ description: "Advanced agentic coding model",
60
+ tags: ["FREE"],
61
+ },
62
+ {
63
+ id: "arcee-ai/trinity-large-preview:free",
64
+ name: "Arcee AI Trinity Large Preview",
65
+ description: "Advanced large preview model",
66
+ tags: ["FREE"],
67
+ },
68
+ ],
69
+ };
70
+
71
+ function cloneRecommendedModels(
72
+ data: ClineRecommendedModelsData,
73
+ ): ClineRecommendedModelsData {
74
+ return {
75
+ recommended: data.recommended.map((model) => ({
76
+ ...model,
77
+ tags: [...model.tags],
78
+ })),
79
+ free: data.free.map((model) => ({ ...model, tags: [...model.tags] })),
80
+ };
81
+ }
82
+
83
+ function normalizeModel(raw: unknown): ClineRecommendedModel | null {
84
+ if (!raw || typeof raw !== "object") return null;
85
+ const data = raw as Record<string, unknown>;
86
+ if (typeof data.id !== "string" || data.id.length === 0) return null;
87
+ return {
88
+ id: data.id,
89
+ name:
90
+ typeof data.name === "string" && data.name.length > 0
91
+ ? data.name
92
+ : data.id,
93
+ description: typeof data.description === "string" ? data.description : "",
94
+ tags: Array.isArray(data.tags)
95
+ ? data.tags.filter((tag): tag is string => typeof tag === "string")
96
+ : [],
97
+ };
98
+ }
99
+
100
+ function normalizeResponse(raw: unknown): ClineRecommendedModelsData | null {
101
+ if (!raw || typeof raw !== "object") return null;
102
+ const data = raw as Record<string, unknown>;
103
+ const recommendedRaw = Array.isArray(data.recommended)
104
+ ? data.recommended
105
+ : [];
106
+ const freeRaw = Array.isArray(data.free) ? data.free : [];
107
+ const recommended = recommendedRaw
108
+ .map(normalizeModel)
109
+ .filter((model): model is ClineRecommendedModel => model !== null);
110
+ const free = freeRaw
111
+ .map(normalizeModel)
112
+ .filter((model): model is ClineRecommendedModel => model !== null);
113
+ if (recommended.length === 0 && free.length === 0) return null;
114
+ return { recommended, free };
115
+ }
116
+
117
+ function getConfiguredApiBaseUrl(
118
+ options: FetchClineRecommendedModelsOptions,
119
+ ): string {
120
+ const explicitBaseUrl = options.baseUrl?.trim();
121
+ if (explicitBaseUrl) return explicitBaseUrl;
122
+
123
+ try {
124
+ const manager =
125
+ options.providerSettingsManager ?? new ProviderSettingsManager();
126
+ const settings = manager.getProviderSettings("cline");
127
+ return settings?.baseUrl?.trim() || DEFAULT_API_BASE_URL;
128
+ } catch {
129
+ return DEFAULT_API_BASE_URL;
130
+ }
131
+ }
132
+
133
+ async function fetchWithTimeout(
134
+ fetchImpl: typeof fetch,
135
+ input: string,
136
+ timeoutMs: number,
137
+ ): Promise<Response> {
138
+ const controller = new AbortController();
139
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
140
+ try {
141
+ return await fetchImpl(input, { signal: controller.signal });
142
+ } finally {
143
+ clearTimeout(timer);
144
+ }
145
+ }
146
+
147
+ export async function fetchClineRecommendedModels(
148
+ options: FetchClineRecommendedModelsOptions = {},
149
+ ): Promise<ClineRecommendedModelsData> {
150
+ try {
151
+ const base = getConfiguredApiBaseUrl(options);
152
+ const fetchImpl = options.fetchImpl ?? fetch;
153
+ const resp = await fetchWithTimeout(
154
+ fetchImpl,
155
+ `${base}/api/v1/ai/cline/recommended-models`,
156
+ options.timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
157
+ );
158
+ if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
159
+ const json: unknown = await resp.json();
160
+ const data = normalizeResponse(json);
161
+ if (data) return data;
162
+ } catch {
163
+ // Fall back to the bundled list when the remote source is unavailable.
164
+ }
165
+
166
+ return cloneRecommendedModels(FALLBACK_CLINE_RECOMMENDED_MODELS);
167
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Build a concrete `LlmsProviders.ApiHandler` from an `AgentConfig`.
3
+ *
4
+ * @see PLAN.md §3.1 — moved from `packages/agents/src/utils/config-helpers.ts` lines 15–55.
5
+ * @see PLAN.md §3.2.1 — `AgentConfig → AgentRuntimeConfig` mapping for
6
+ * the `model` field.
7
+ *
8
+ * Pure port. Core calls this once per session (and again on
9
+ * `updateConnection`) to produce the `AgentModel` adapter handed to
10
+ * `new AgentRuntime({ model, ... })`.
11
+ */
12
+
13
+ import * as LlmsProviders from "@clinebot/llms";
14
+ import type { AgentConfig, BasicLogger } from "@clinebot/shared";
15
+
16
+ export function resolveKnownModelsFromConfig(
17
+ config: AgentConfig,
18
+ ): Record<string, LlmsProviders.ModelInfo> | undefined {
19
+ const pc = config.providerConfig as LlmsProviders.ProviderConfig | undefined;
20
+ if (pc?.knownModels) {
21
+ return pc.knownModels;
22
+ }
23
+ if (config.knownModels) {
24
+ return config.knownModels;
25
+ }
26
+ return (
27
+ LlmsProviders.MODEL_COLLECTIONS_BY_PROVIDER_ID[config.providerId]?.models ??
28
+ undefined
29
+ );
30
+ }
31
+
32
+ export function createHandlerFromConfig(
33
+ config: AgentConfig,
34
+ logger: BasicLogger | undefined,
35
+ ): LlmsProviders.ApiHandler {
36
+ const pc = config.providerConfig as LlmsProviders.ProviderConfig | undefined;
37
+ const baseProviderConfig =
38
+ pc?.providerId === config.providerId ? pc : undefined;
39
+ const normalizedProviderConfig: LlmsProviders.ProviderConfig = {
40
+ ...(baseProviderConfig ?? {}),
41
+ providerId: config.providerId,
42
+ modelId: config.modelId,
43
+ apiKey: config.apiKey ?? baseProviderConfig?.apiKey,
44
+ baseUrl: config.baseUrl ?? baseProviderConfig?.baseUrl,
45
+ headers: config.headers ?? baseProviderConfig?.headers,
46
+ knownModels: resolveKnownModelsFromConfig(config),
47
+ maxOutputTokens: config.maxTokensPerTurn,
48
+ reasoningEffort: config.reasoningEffort,
49
+ thinkingBudgetTokens: config.thinkingBudgetTokens,
50
+ thinking: config.thinking,
51
+ abortSignal: config.abortSignal,
52
+ logger,
53
+ extensionContext: config.extensionContext,
54
+ };
55
+ return LlmsProviders.createHandler(normalizedProviderConfig);
56
+ }
@@ -159,6 +159,20 @@ async function mergeKnownModels(
159
159
  });
160
160
  }
161
161
 
162
+ function resolveCatalogModels(
163
+ providerId: string,
164
+ modelsByProviderId: Record<string, Record<string, ModelInfo>>,
165
+ ): Record<string, ModelInfo> {
166
+ // Runtime provider ids do not always match catalog keys. For example,
167
+ // Cline uses OpenRouter-backed catalog models, so live catalog lookups must
168
+ // apply the same key mapping as generated catalog lookups.
169
+ const catalogKeys = Llms.resolveProviderModelCatalogKeys(providerId);
170
+ return Object.assign(
171
+ {},
172
+ ...catalogKeys.map((catalogKey) => modelsByProviderId[catalogKey] ?? {}),
173
+ );
174
+ }
175
+
162
176
  function normalizeBaseUrl(baseUrl: string | undefined): string {
163
177
  const value = baseUrl?.trim();
164
178
  return value && value.length > 0 ? value : "";
@@ -611,7 +625,9 @@ export async function resolveProviderConfig(
611
625
  const liveCatalog = modelCatalog?.loadLatestOnInit
612
626
  ? await getLiveModelsCatalog(modelCatalog)
613
627
  : undefined;
614
- const liveModels = liveCatalog?.[providerId] ?? {};
628
+ const liveModels = liveCatalog
629
+ ? resolveCatalogModels(providerId, liveCatalog)
630
+ : {};
615
631
  const privateModels =
616
632
  config && shouldLoadPrivateModels(providerId, modelCatalog, config)
617
633
  ? await getPrivateProviderModels(providerId, modelCatalog, config)
@@ -29,6 +29,29 @@ export const ProviderIdSchema = z
29
29
  .min(1)
30
30
  .regex(/^[a-z0-9][a-z0-9-]*$/i);
31
31
 
32
+ export const ProviderProtocolSchema = z.enum([
33
+ "anthropic",
34
+ "gemini",
35
+ "openai-chat",
36
+ "openai-responses",
37
+ "openai-r1",
38
+ "ai-sdk",
39
+ ]);
40
+
41
+ export const ProviderClientSchema = z.enum([
42
+ "anthropic",
43
+ "ai-sdk",
44
+ "ai-sdk-community",
45
+ "openai",
46
+ "openai-compatible",
47
+ "openai-r1",
48
+ "gemini",
49
+ "bedrock",
50
+ "custom",
51
+ "fetch",
52
+ "vertex",
53
+ ]);
54
+
32
55
  export const AuthSettingsSchema = z.object({
33
56
  apiKey: z.string().optional(),
34
57
  accessToken: z.string().optional(),
@@ -115,6 +138,9 @@ export const ProviderSettingsSchema = z.object({
115
138
  apiKey: z.string().optional(),
116
139
  auth: AuthSettingsSchema.optional(),
117
140
  model: z.string().optional(),
141
+ protocol: ProviderProtocolSchema.optional(),
142
+ client: ProviderClientSchema.optional(),
143
+ routingProviderId: ProviderIdSchema.optional(),
118
144
  maxTokens: z.number().int().positive().optional(),
119
145
  contextWindow: z.number().int().positive().optional(),
120
146
  baseUrl: z.string().url().optional(),
@@ -156,6 +182,14 @@ export function safeParseSettings(
156
182
  return ProviderSettingsSchema.safeParse(input);
157
183
  }
158
184
 
185
+ function shouldRouteThroughOpenAIResponses(
186
+ settings: ProviderSettings,
187
+ ): boolean {
188
+ return (
189
+ settings.protocol === "openai-responses" || settings.client === "openai"
190
+ );
191
+ }
192
+
159
193
  export function toProviderConfig(settings: ProviderSettings): ProviderConfig {
160
194
  const providerId = settings.provider as ProviderId;
161
195
  const normalizedProviderId = normalizeProviderId(providerId);
@@ -170,6 +204,7 @@ export function toProviderConfig(settings: ProviderSettings): ProviderConfig {
170
204
  (catalogKey) => Llms.getGeneratedModelsForProvider(catalogKey),
171
205
  ),
172
206
  );
207
+ const generatedDefaultModelId = Object.keys(generatedKnownModels)[0];
173
208
 
174
209
  const apiKey =
175
210
  settings.auth?.accessToken ?? settings.apiKey ?? settings.auth?.apiKey;
@@ -180,10 +215,22 @@ export function toProviderConfig(settings: ProviderSettings): ProviderConfig {
180
215
  ? DEFAULT_INTERNAL_OCA_BASE_URL
181
216
  : DEFAULT_EXTERNAL_OCA_BASE_URL
182
217
  : providerDefaults?.baseUrl);
218
+ const routingProviderId =
219
+ settings.routingProviderId ??
220
+ (shouldRouteThroughOpenAIResponses(settings) &&
221
+ normalizedProviderId !== BUILT_IN_PROVIDER.OPENAI_NATIVE
222
+ ? BUILT_IN_PROVIDER.OPENAI_NATIVE
223
+ : undefined);
183
224
 
184
225
  const config: ProviderConfig = {
185
226
  providerId,
186
- modelId: settings.model ?? providerDefaults?.modelId ?? "default",
227
+ clientType: settings.client,
228
+ routingProviderId,
229
+ modelId:
230
+ settings.model ??
231
+ providerDefaults?.modelId ??
232
+ generatedDefaultModelId ??
233
+ "default",
187
234
  knownModels:
188
235
  providerDefaults?.knownModels ??
189
236
  (Object.keys(generatedKnownModels).length > 0
@@ -86,6 +86,7 @@ export class DefaultLlmsSdk implements LlmsSdk {
86
86
  client: input.client ?? "openai-compatible",
87
87
  capabilities: input.capabilities,
88
88
  env: input.env,
89
+ source: "system",
89
90
  },
90
91
  models: input.models,
91
92
  });