@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,10 +1,10 @@
1
- import type { Agent } from "@clinebot/agents";
2
1
  import type {
3
2
  AgentConfig,
4
3
  AgentHooks,
5
4
  AgentResult,
6
5
  BasicLogger,
7
6
  ITelemetryService,
7
+ RuntimeConfigExtensionKind,
8
8
  Tool,
9
9
  } from "@clinebot/shared";
10
10
  import type { UserInstructionConfigWatcher } from "../extensions/config";
@@ -16,6 +16,19 @@ import type {
16
16
  } from "../extensions/tools/team";
17
17
  import type { CoreSessionConfig } from "../types/config";
18
18
 
19
+ /**
20
+ * Internal structural alias for the lead-agent handle that
21
+ * {@link BuiltRuntime.registerLeadAgent} hands off to
22
+ * `runtime-builder.ts`. Narrowed to only the `.addTools()` surface the
23
+ * callback exercises; avoids depending on `@clinebot/agents`' `Agent`
24
+ * class during the PLAN.md §3.6 Step 5 type-only migration. When
25
+ * SessionRuntime is rebuilt in Step 6, this field is expected to be
26
+ * dropped entirely per §3.5 row #2.
27
+ */
28
+ type LeadAgentHandle = {
29
+ addTools(tools: Tool[]): unknown;
30
+ };
31
+
19
32
  export interface BuiltRuntime {
20
33
  tools: Tool[];
21
34
  hooks?: AgentHooks;
@@ -25,7 +38,7 @@ export interface BuiltRuntime {
25
38
  teamRestoredFromPersistence?: boolean;
26
39
  delegatedAgentConfigProvider?: DelegatedAgentConfigProvider;
27
40
  completionGuard?: () => string | undefined;
28
- registerLeadAgent?: (agent: Agent) => void;
41
+ registerLeadAgent?: (agent: LeadAgentHandle) => void;
29
42
  shutdown: (reason: string) => Promise<void> | void;
30
43
  }
31
44
 
@@ -37,6 +50,7 @@ export interface RuntimeBuilderInput {
37
50
  createSpawnTool?: () => Tool;
38
51
  onTeamRestored?: () => void;
39
52
  userInstructionWatcher?: UserInstructionConfigWatcher;
53
+ configExtensions?: RuntimeConfigExtensionKind[];
40
54
  defaultToolExecutors?: Partial<ToolExecutors>;
41
55
  logger?: BasicLogger;
42
56
  telemetry?: ITelemetryService;
@@ -0,0 +1,167 @@
1
+ /**
2
+ * User-input / first-turn content assembler.
3
+ *
4
+ * @see PLAN.md §3.1 — moved from `packages/agents/src/utils/agent-input.ts`.
5
+ * @see PLAN.md §3.2.4 — called from the `Agent.run/continue` facade via
6
+ * the `buildInitialUserContent` helper.
7
+ *
8
+ * Pure port. Opens the first user ContentBlock[] for a turn, loading user
9
+ * file contents via the injected `userFileContentLoader` (already
10
+ * core-owned per §3.1 notes on `packages/core/src/transports/local.ts`).
11
+ */
12
+
13
+ import type * as LlmsProviders from "@clinebot/llms";
14
+
15
+ export async function buildInitialUserContent(
16
+ userMessage: string,
17
+ userImages?: string[],
18
+ userFiles?: string[],
19
+ userFileContentLoader?: (path: string) => Promise<string>,
20
+ ): Promise<string | LlmsProviders.ContentBlock[]> {
21
+ const imageBlocks = buildImageBlocks(userImages);
22
+ const fileTextBlocks = await buildUserFileContentBlock(
23
+ userFiles,
24
+ userFileContentLoader,
25
+ );
26
+
27
+ if (imageBlocks.length === 0 && !fileTextBlocks) {
28
+ return userMessage;
29
+ }
30
+
31
+ const content: LlmsProviders.ContentBlock[] = [
32
+ {
33
+ type: "text",
34
+ text: userMessage,
35
+ },
36
+ ...imageBlocks,
37
+ ];
38
+ if (fileTextBlocks) {
39
+ content.push(...fileTextBlocks);
40
+ }
41
+ return content;
42
+ }
43
+
44
+ /**
45
+ * Normalize a user message shape into a plain string when possible.
46
+ *
47
+ * @see PLAN.md §3.1 — exported from the user-input-builder module so
48
+ * SessionRuntime can use it to sanitise ad-hoc input.
49
+ *
50
+ * Accepts either a string or a LlmsProviders.Message; returns the best-effort
51
+ * concatenated plain-text body. Non-text content is ignored.
52
+ */
53
+ export function normalizeUserMessage(
54
+ input: string | LlmsProviders.Message | undefined,
55
+ ): string {
56
+ if (input == null) {
57
+ return "";
58
+ }
59
+ if (typeof input === "string") {
60
+ return input;
61
+ }
62
+ const content = input.content;
63
+ if (typeof content === "string") {
64
+ return content;
65
+ }
66
+ if (!Array.isArray(content)) {
67
+ return "";
68
+ }
69
+ const textParts: string[] = [];
70
+ for (const block of content) {
71
+ if (block && typeof block === "object" && block.type === "text") {
72
+ const text = (block as { text?: unknown }).text;
73
+ if (typeof text === "string") {
74
+ textParts.push(text);
75
+ }
76
+ }
77
+ }
78
+ return textParts.join("\n");
79
+ }
80
+
81
+ function buildImageBlocks(userImages?: string[]): LlmsProviders.ImageContent[] {
82
+ if (!userImages || userImages.length === 0) {
83
+ return [];
84
+ }
85
+
86
+ const blocks: LlmsProviders.ImageContent[] = [];
87
+ for (const image of userImages) {
88
+ const block = parseDataUrlImage(image);
89
+ if (block) {
90
+ blocks.push(block);
91
+ }
92
+ }
93
+ return blocks;
94
+ }
95
+
96
+ function parseDataUrlImage(
97
+ image: string,
98
+ ): LlmsProviders.ImageContent | undefined {
99
+ const value = image.trim();
100
+ if (!value) {
101
+ return undefined;
102
+ }
103
+
104
+ const dataUrlMatch = value.match(/^data:([^;,]+);base64,(.+)$/);
105
+ if (dataUrlMatch) {
106
+ const mediaType = dataUrlMatch[1];
107
+ const data = dataUrlMatch[2];
108
+ if (!mediaType || !data) {
109
+ return undefined;
110
+ }
111
+ return {
112
+ type: "image",
113
+ mediaType,
114
+ data,
115
+ };
116
+ }
117
+
118
+ // Fallback: treat as plain base64 payload.
119
+ return {
120
+ type: "image",
121
+ mediaType: "image/png",
122
+ data: value,
123
+ };
124
+ }
125
+
126
+ async function buildUserFileContentBlock(
127
+ userFiles?: string[],
128
+ userFileContentLoader?: (path: string) => Promise<string>,
129
+ ): Promise<LlmsProviders.FileContent[] | undefined> {
130
+ if (!userFiles || userFiles.length === 0) {
131
+ return undefined;
132
+ }
133
+
134
+ const loader =
135
+ userFileContentLoader ??
136
+ (async () => {
137
+ throw new Error(
138
+ "File loading is not configured in this runtime. Provide userFileContentLoader to enable userFiles support.",
139
+ );
140
+ });
141
+
142
+ const contents = await Promise.all(
143
+ userFiles.map(async (filePath) => {
144
+ const normalizedPath = filePath.replace(/\\/g, "/");
145
+ try {
146
+ const content = await loader(filePath);
147
+ return {
148
+ type: "file",
149
+ path: normalizedPath,
150
+ content,
151
+ } satisfies LlmsProviders.FileContent;
152
+ } catch (error) {
153
+ const message = error instanceof Error ? error.message : String(error);
154
+ return {
155
+ type: "file",
156
+ path: normalizedPath,
157
+ content: `Error fetching content: ${message}`,
158
+ } satisfies LlmsProviders.FileContent;
159
+ }
160
+ }),
161
+ );
162
+
163
+ if (contents.length === 0) {
164
+ return undefined;
165
+ }
166
+ return contents;
167
+ }
@@ -1,12 +1,15 @@
1
1
  import type {
2
2
  AgentConfig,
3
3
  AgentHooks,
4
+ ExtensionContext,
4
5
  ITelemetryService,
6
+ RuntimeConfigExtensionKind,
5
7
  Tool,
6
8
  ToolApprovalRequest,
7
9
  ToolApprovalResult,
8
10
  WorkspaceInfo,
9
11
  } from "@clinebot/shared";
12
+ import { decodeJwtPayload } from "../auth/utils";
10
13
  import { resolveAndLoadAgentPlugins } from "../extensions/plugin/plugin-config-loader";
11
14
  import type {
12
15
  PluginInitializationFailure,
@@ -89,8 +92,72 @@ function resolveReasoningSettings(
89
92
  };
90
93
  }
91
94
 
95
+ const ALL_CONFIG_EXTENSIONS: readonly RuntimeConfigExtensionKind[] = [
96
+ "rules",
97
+ "skills",
98
+ "plugins",
99
+ ];
100
+
101
+ function hasConfigExtension(
102
+ extensions: ReadonlyArray<RuntimeConfigExtensionKind> | undefined,
103
+ kind: RuntimeConfigExtensionKind,
104
+ ): boolean {
105
+ return new Set(extensions ?? ALL_CONFIG_EXTENSIONS).has(kind);
106
+ }
107
+
108
+ function buildOpenAICodexHeaders(input: {
109
+ sessionId: string;
110
+ configHeaders: CoreSessionConfig["headers"];
111
+ storedHeaders: ProviderSettings["headers"];
112
+ accountId?: string;
113
+ accessToken?: string;
114
+ }): Record<string, string> | undefined {
115
+ const headers: Record<string, string> = {
116
+ ...(input.storedHeaders ?? {}),
117
+ ...(input.configHeaders ?? {}),
118
+ };
119
+ const resolvedAccountId =
120
+ input.accountId?.trim() || deriveOpenAICodexAccountId(input.accessToken);
121
+ headers.originator = "cline";
122
+ headers.session_id = input.sessionId;
123
+ headers["User-Agent"] = `Cline/${process.env.npm_package_version || "1.0.0"}`;
124
+ if (resolvedAccountId) {
125
+ headers["ChatGPT-Account-Id"] = resolvedAccountId;
126
+ }
127
+ return headers;
128
+ }
129
+
130
+ function deriveOpenAICodexAccountId(
131
+ accessToken: string | undefined,
132
+ ): string | undefined {
133
+ const trimmed = accessToken?.trim();
134
+ if (!trimmed) {
135
+ return undefined;
136
+ }
137
+ const payload = decodeJwtPayload(trimmed) as {
138
+ "https://api.openai.com/auth"?: { chatgpt_account_id?: string };
139
+ organizations?: Array<{ id?: string }>;
140
+ chatgpt_account_id?: string;
141
+ } | null;
142
+ const authAccountId =
143
+ payload?.["https://api.openai.com/auth"]?.chatgpt_account_id;
144
+ if (typeof authAccountId === "string" && authAccountId.length > 0) {
145
+ return authAccountId;
146
+ }
147
+ const orgAccountId = payload?.organizations?.[0]?.id;
148
+ if (typeof orgAccountId === "string" && orgAccountId.length > 0) {
149
+ return orgAccountId;
150
+ }
151
+ const rootAccountId = payload?.chatgpt_account_id;
152
+ if (typeof rootAccountId === "string" && rootAccountId.length > 0) {
153
+ return rootAccountId;
154
+ }
155
+ return undefined;
156
+ }
157
+
92
158
  function buildProviderConfig(
93
159
  config: CoreSessionConfig,
160
+ sessionId: string,
94
161
  providerSettingsManager: ProviderSettingsManager,
95
162
  modelCatalogDefaults?: Partial<ProviderSettings["modelCatalog"]>,
96
163
  defaultFetch?: typeof fetch,
@@ -109,7 +176,17 @@ function buildProviderConfig(
109
176
  model: config.modelId,
110
177
  apiKey: config.apiKey ?? stored?.apiKey,
111
178
  baseUrl: config.baseUrl ?? stored?.baseUrl,
112
- headers: config.headers ?? stored?.headers,
179
+ headers:
180
+ config.providerId === "openai-codex"
181
+ ? buildOpenAICodexHeaders({
182
+ sessionId,
183
+ configHeaders: config.headers,
184
+ storedHeaders: stored?.headers,
185
+ accountId: stored?.auth?.accountId,
186
+ accessToken:
187
+ config.apiKey ?? stored?.auth?.accessToken ?? stored?.apiKey,
188
+ })
189
+ : (config.headers ?? stored?.headers),
113
190
  reasoning: resolveReasoningSettings(config, stored?.reasoning),
114
191
  modelCatalog,
115
192
  };
@@ -202,6 +279,23 @@ export async function prepareLocalRuntimeBootstrap(
202
279
  // as workspaceMetadata; the structured object is kept as workspaceInfo.
203
280
  const { workspaceInfo, workspaceMetadata } =
204
281
  await buildWorkspaceMetadataWithInfo(input.config.cwd);
282
+ const configuredExtensionContext = localConfig?.extensionContext;
283
+ const extensionContext: ExtensionContext = {
284
+ ...(configuredExtensionContext ?? {}),
285
+ workspace: {
286
+ ...workspaceInfo,
287
+ ...(configuredExtensionContext?.workspace ?? {}),
288
+ },
289
+ session: {
290
+ ...(configuredExtensionContext?.session ?? {}),
291
+ sessionId,
292
+ },
293
+ logger: configuredExtensionContext?.logger ?? configOverrides?.logger,
294
+ telemetry:
295
+ configuredExtensionContext?.telemetry ??
296
+ configOverrides?.telemetry ??
297
+ defaultTelemetry,
298
+ };
205
299
 
206
300
  const fileHooks = createHookConfigFileHooks({
207
301
  cwd: input.config.cwd,
@@ -226,26 +320,34 @@ export async function prepareLocalRuntimeBootstrap(
226
320
  let loadedPlugins:
227
321
  | Awaited<ReturnType<typeof resolveAndLoadAgentPlugins>>
228
322
  | undefined;
229
- try {
230
- loadedPlugins = await resolveAndLoadAgentPlugins({
231
- pluginPaths: localConfig?.pluginPaths,
232
- workspacePath,
233
- cwd: input.config.cwd,
234
- onEvent: onPluginEvent,
235
- providerId: input.config.providerId,
236
- modelId: input.config.modelId,
237
- workspaceInfo,
238
- });
239
- logPluginDiagnostics(
240
- loadedPlugins.failures,
241
- loadedPlugins.warnings,
242
- configOverrides?.logger,
243
- );
244
- } catch (error) {
245
- const message = error instanceof Error ? error.message : String(error);
246
- configOverrides?.logger?.log?.(
247
- `plugin loading failed; continuing without plugins (${message})`,
248
- );
323
+ if (hasConfigExtension(localRuntime?.configExtensions, "plugins")) {
324
+ try {
325
+ loadedPlugins = await resolveAndLoadAgentPlugins({
326
+ pluginPaths: localConfig?.pluginPaths,
327
+ workspacePath,
328
+ cwd: input.config.cwd,
329
+ onEvent: onPluginEvent,
330
+ providerId: input.config.providerId,
331
+ modelId: input.config.modelId,
332
+ workspaceInfo,
333
+ session: extensionContext.session,
334
+ client: extensionContext.client,
335
+ user: extensionContext.user,
336
+ logger: extensionContext.logger,
337
+ telemetry: extensionContext.telemetry,
338
+ automation: extensionContext.automation,
339
+ });
340
+ logPluginDiagnostics(
341
+ loadedPlugins.failures,
342
+ loadedPlugins.warnings,
343
+ configOverrides?.logger,
344
+ );
345
+ } catch (error) {
346
+ const message = error instanceof Error ? error.message : String(error);
347
+ configOverrides?.logger?.log?.(
348
+ `plugin loading failed; continuing without plugins (${message})`,
349
+ );
350
+ }
249
351
  }
250
352
 
251
353
  const extensions = mergeAgentExtensions(
@@ -255,12 +357,15 @@ export async function prepareLocalRuntimeBootstrap(
255
357
  const baseConfig: CoreSessionConfig = {
256
358
  ...input.config,
257
359
  ...(configOverrides ?? {}),
360
+ sessionId,
258
361
  hooks: baseHooks,
259
362
  extensions,
260
- telemetry: configOverrides?.telemetry ?? defaultTelemetry,
363
+ extensionContext,
364
+ telemetry: extensionContext.telemetry,
261
365
  };
262
366
  const providerConfig = buildProviderConfig(
263
367
  baseConfig,
368
+ sessionId,
264
369
  providerSettingsManager,
265
370
  localRuntime?.modelCatalogDefaults,
266
371
  defaultFetch,
@@ -310,6 +415,7 @@ export async function prepareLocalRuntimeBootstrap(
310
415
  createSpawnTool,
311
416
  onTeamRestored: localRuntime?.onTeamRestored,
312
417
  userInstructionWatcher: localRuntime?.userInstructionWatcher,
418
+ configExtensions: localRuntime?.configExtensions,
313
419
  defaultToolExecutors: effectiveToolExecutors,
314
420
  logger: config.logger,
315
421
  telemetry: config.telemetry,
@@ -29,6 +29,7 @@ function collectRegisteredTools(
29
29
  registerCommand: () => {},
30
30
  registerMessageBuilder: () => {},
31
31
  registerProvider: () => {},
32
+ registerAutomationEventType: () => {},
32
33
  };
33
34
  extension.setup(api, { workspaceInfo });
34
35
  return tools;