@makaio/framework 1.0.0-dev-1781354548379 → 1.0.0-dev-1781367632837

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 (82) hide show
  1. package/README.md +1 -1
  2. package/dist/.makaio-build.json +2 -2
  3. package/dist/adapter-subsystem/index.d.mts +493 -0
  4. package/dist/adapter-subsystem/index.mjs +1 -0
  5. package/dist/adapters/index.d.mts +1 -1
  6. package/dist/contracts/adapter/index.d.mts +1 -1
  7. package/dist/contracts/artifact/index.d.mts +1 -1
  8. package/dist/contracts/config/index.d.mts +6 -6
  9. package/dist/contracts/extension/index.d.mts +2 -2
  10. package/dist/contracts/index.d.mts +55 -55
  11. package/dist/contracts/provider/index.d.mts +1 -1
  12. package/dist/contracts/session/index.d.mts +2 -2
  13. package/dist/inbound-hooks/index.d.mts +174 -0
  14. package/dist/inbound-hooks/index.mjs +1 -0
  15. package/dist/{index-DrGLAuZc.d.mts → index-7EPRy0nT.d.mts} +16 -16
  16. package/dist/{index-BHzgDuRE.d.mts → index-B7uYo0C6.d.mts} +3 -3
  17. package/dist/{index-BHAOu6Hs.d.mts → index-BFuke0jw.d.mts} +14 -14
  18. package/dist/{index-CH5U3zSA2.d.mts → index-BfUq8fO52.d.mts} +1 -1
  19. package/dist/{index-Buo9H8RK.d.mts → index-COPhs8Ay.d.mts} +1 -1
  20. package/dist/{index-CTn_Xi-p.d.mts → index-CcBAFO-1.d.mts} +2 -2
  21. package/dist/{index-BpniJgxu.d.mts → index-CncH-7wf.d.mts} +16 -16
  22. package/dist/{index-Da4ABgRq.d.mts → index-DdZ9PDEE.d.mts} +12 -12
  23. package/dist/{index-BDRKAxIV.d.mts → index-dAjtejnc.d.mts} +2 -2
  24. package/dist/{index-DPIdX6kb.d.mts → index-qGJoNJon.d.mts} +113 -113
  25. package/dist/kernel/extension/index.d.mts +1 -1
  26. package/dist/kernel/index.d.mts +2 -2
  27. package/dist/kernel/observability/index.d.mts +1 -1
  28. package/dist/{namespace-CHMszppN.d.mts → namespace-6OzA9SwY.d.mts} +26 -26
  29. package/dist/{namespace-CqUGzG53.d.mts → namespace-Bx40zNgT.d.mts} +2 -2
  30. package/dist/{namespace-Boe6l5n9.d.mts → namespace-Cq8ScJGp.d.mts} +58 -58
  31. package/dist/{namespace-B73Sxj5L.d.mts → namespace-DI9_OYOU.d.mts} +6 -6
  32. package/dist/{namespace-BBVtD1gu.d.mts → namespace-Do0AUzwu.d.mts} +6 -6
  33. package/dist/package.json +1 -1
  34. package/dist/runtime-node/index.d.mts +8 -59
  35. package/dist/runtime-node/index.mjs +26 -26
  36. package/dist/runtime-node/workflow-worker/index.d.mts +1 -1
  37. package/dist/{schema-DGMLvVoQ.d.mts → schema-C-yfxlRI.d.mts} +2 -2
  38. package/dist/{schemas-B5ToLwIs.d.mts → schemas-CJYNpT6v.d.mts} +6 -6
  39. package/dist/{schemas-lqvZ6UpK.d.mts → schemas-CW0h1h6l.d.mts} +3 -3
  40. package/dist/{schemas-kVcJMjjn2.d.mts → schemas-DtJWNKZ_2.d.mts} +6 -6
  41. package/dist/services/adapter-subsystem/index.d.mts +2 -2
  42. package/dist/services/adapter-subsystem/namespace.d.mts +1 -1
  43. package/dist/services/context-rules/index.d.mts +3 -3
  44. package/dist/services/execution-target/index.d.mts +2 -2
  45. package/dist/services/execution-target/namespace.d.mts +1 -1
  46. package/dist/services/execution-target/schemas.d.mts +1 -1
  47. package/dist/services/filesystem/namespace.d.mts +6 -6
  48. package/dist/services/filesystem/schemas.d.mts +3 -3
  49. package/dist/services/index.d.mts +41 -41
  50. package/dist/services/session/index.d.mts +4 -4
  51. package/dist/services/session/messages/namespace.d.mts +1 -1
  52. package/dist/services/session/storage/namespace.d.mts +1 -1
  53. package/dist/services/session/storage/schema.d.mts +1 -1
  54. package/dist/services/settings/namespace.d.mts +6 -6
  55. package/dist/services/settings/storage/extension-configs/namespace.d.mts +3 -3
  56. package/dist/services/subagent-template/index.d.mts +1 -1
  57. package/dist/services/subagent-template/schemas.d.mts +1 -1
  58. package/dist/services/tray-menu/index.d.mts +2 -2
  59. package/dist/services/tray-menu/namespace.d.mts +1 -1
  60. package/dist/services/tray-menu/schemas.d.mts +1 -1
  61. package/dist/{types-BpuLMR2m.d.mts → types-BOuU-0Vs.d.mts} +36 -36
  62. package/dist/workflow-engine/index.d.mts +37 -37
  63. package/package.json +9 -1
  64. package/dist/drizzle/0001_messages_content_tsv.na.md +0 -18
  65. package/dist/drizzle/meta/0000_snapshot.json +0 -2813
  66. package/dist/drizzle/meta/0001_snapshot.json +0 -2820
  67. package/dist/drizzle/meta/0002_snapshot.json +0 -2827
  68. package/dist/drizzle/meta/0003_snapshot.json +0 -2834
  69. package/dist/drizzle/meta/0004_snapshot.json +0 -2842
  70. package/dist/drizzle/meta/0005_snapshot.json +0 -2849
  71. package/dist/drizzle/meta/0006_snapshot.json +0 -2865
  72. package/dist/drizzle/meta/0007_snapshot.json +0 -2879
  73. package/dist/drizzle/meta/0008_snapshot.json +0 -2886
  74. package/dist/drizzle/meta/0009_snapshot.json +0 -2901
  75. package/dist/drizzle/meta/0010_snapshot.json +0 -2908
  76. package/dist/drizzle/meta/0011_snapshot.json +0 -2915
  77. package/dist/drizzle/meta/0012_snapshot.json +0 -2934
  78. package/dist/drizzle/meta/0013_snapshot.json +0 -2954
  79. package/dist/drizzle/meta/0014_snapshot.json +0 -2959
  80. package/dist/drizzle/meta/0015_snapshot.json +0 -2966
  81. package/dist/drizzle/meta/0016_snapshot.json +0 -2973
  82. package/dist/drizzle/meta/0017_snapshot.json +0 -2980
package/README.md CHANGED
@@ -88,7 +88,7 @@ The node-postgres driver (`pg` ^8.x) is a regular dependency of `@makaio/storage
88
88
 
89
89
  A `postgres://` or `postgresql://` URL from the first two sources selects PostgreSQL — Node and Bun runtime hosts recognize the scheme and auto-register the installed `@makaio/storage-pg` engine before any database client is created (the `database.engines` boot option stays the explicit registration path). Any other URL scheme there is rejected with an error rather than falling through to SQLite. The connection pool defaults to 4 connections; tune it with the `database.poolMax` boot option.
90
90
 
91
- **Migrations.** The package bundles only the SQLite migration chain (`dist/drizzle/`); the Postgres chain ships inside `@makaio/storage-pg` and is resolved through its storage engine. Boot applies the chain matching the selected backend automatically. Concurrent boots against the same Postgres database are safe — migration runs are serialized with a transaction-scoped advisory lock.
91
+ **Migrations.** The package bundles a runtime-only SQLite migration chain at `dist/drizzle/`: root-level `.sql` files plus `meta/_journal.json`. Applications do not copy, generate, or reconstruct framework migrations; boot applies the packaged chain that matches the selected backend. Drizzle generator snapshots stay in the source repository for future migration generation and are intentionally omitted from published runtime artifacts. The Postgres chain ships inside `@makaio/storage-pg` and is resolved through its storage engine. Concurrent boots against the same Postgres database are safe — migration runs are serialized with a transaction-scoped advisory lock.
92
92
 
93
93
  **Full-text search** works on both backends through the same contracts: FTS5 on SQLite, `tsvector` on Postgres (web-search query syntax via `websearch_to_tsquery`). Relevance scores are positive on both backends but not comparable across them.
94
94
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "version": 1,
3
- "fingerprint": "00c7f9131f71c9d21fdf94dcf209e3da95bcc7e2a860520e0dd206e990ecc031",
4
- "builtAt": "2026-06-13T12:43:27.094Z"
3
+ "fingerprint": "a922474263022a8e1e0221a5f3cd2d631a1dc0ffe23664351705cbe246bdc4c0",
4
+ "builtAt": "2026-06-13T16:21:48.300Z"
5
5
  }
@@ -0,0 +1,493 @@
1
+ import { z } from "zod";
2
+ import { IMakaioBus } from "@makaio/framework/bus";
3
+ import * as _$_makaio_contracts0 from "@makaio/framework/contracts";
4
+ import { AdapterClientRef, AdapterProviderDefinitionContract, MakaioNodeExtension, ProtocolId } from "@makaio/framework/contracts";
5
+ import { BaseService } from "@makaio/framework/service-base";
6
+ import { AdapterFile, ProviderConfigFile } from "@makaio/framework/contracts/config";
7
+ import { AdapterFileConfigSet, IAdapterConfigRepository, IAdapterConfigRepository as IAdapterConfigRepository$1, ProviderConfigFileSet } from "@makaio/framework/services/adapter-subsystem";
8
+ import { ContributionProcessor, ExtensionCoordinator } from "@makaio/framework/kernel";
9
+ import { AvailableAdapter, HelpLink } from "@makaio/framework/services/settings";
10
+ import { KernelExtensionContext as KernelExtensionContext$1, KernelMakaioExtension as KernelMakaioExtension$1 } from "@makaio/framework/kernel/extension";
11
+
12
+ //#region subsystems/adapter/src/adapter-runtime-types.d.ts
13
+ /**
14
+ * Minimal log import configuration surface needed by adapter lifecycle utilities.
15
+ *
16
+ * Mirrors the shape of `LogImportConfig` from `@makaio/ai-adapters-core` without
17
+ * taking a dependency on the host-layer package.
18
+ */
19
+ interface AdapterLogImportConfig {
20
+ /** Whether log import is enabled. */
21
+ enabled: boolean;
22
+ /** Polling interval for the file watcher in milliseconds. */
23
+ pollIntervalMs?: number;
24
+ /** Maximum events to emit per second (rate limiting). */
25
+ eventsPerSecond?: number;
26
+ }
27
+ /**
28
+ * Initialization options surface needed by adapter lifecycle utilities.
29
+ *
30
+ * Captures the fields from `AIAdapterInitOptions` (host layer) that are
31
+ * required by the adapter lifecycle utilities in this package. Fields that
32
+ * carry host-layer types (e.g. `platformDefaults`) are represented as
33
+ * `unknown` so callers can pass the full host object without the core
34
+ * package depending on the host layer.
35
+ */
36
+ interface AdapterInitOptions {
37
+ /** Per-adapter unique identifier assigned by the runtime. */
38
+ adapterId?: string;
39
+ /**
40
+ * Platform-provided defaults (cwd, env, etc.).
41
+ * Typed as `unknown` to avoid importing from the host layer.
42
+ */
43
+ platformDefaults?: unknown;
44
+ /** Log import configuration for external session imports. */
45
+ logImport?: AdapterLogImportConfig;
46
+ /** Provider definitions from the adapter definition. */
47
+ definitionProviders?: AdapterProviderDefinitionContract[];
48
+ /** Default model when not specified per-message. */
49
+ defaultModel?: string;
50
+ /** Provider-specific config. */
51
+ providerOptions?: unknown;
52
+ /**
53
+ * Runtime-selected client identifier.
54
+ *
55
+ * This is an initialization override used by client-backed adapter factories.
56
+ * Adapter compatibility is declared separately on {@link LoadedAdapter.clients}.
57
+ * Omit for API-only adapters.
58
+ */
59
+ clientId?: string;
60
+ }
61
+ /**
62
+ * Minimal adapter instance surface returned by the adapter factory.
63
+ *
64
+ * Captures the `adapterId` field needed by the runtime to validate instance
65
+ * identity after initialization.
66
+ */
67
+ interface AdapterInstance {
68
+ /** Unique identifier assigned when the adapter instance is created. */
69
+ adapterId?: string;
70
+ }
71
+ /**
72
+ * Provider definition resolved for one loaded adapter.
73
+ */
74
+ interface LoadedAdapterProvider extends AdapterProviderDefinitionContract {
75
+ /** Extension package that contributed the provider definition. */
76
+ providerPackageName: string;
77
+ }
78
+ /**
79
+ * Loaded adapter entry produced by processing `MakaioPackage.adapters`.
80
+ *
81
+ * This is the canonical core-layer representation of a fully-loaded adapter
82
+ * definition, decoupled from the host-layer `AIAdapterDefinition` type.
83
+ * It carries everything the runtime needs to initialize, route, and manage
84
+ * adapter lifecycle.
85
+ */
86
+ interface LoadedAdapter {
87
+ /** Internal adapter driver name (e.g. `'claude-code'`). */
88
+ name: string;
89
+ /** Human-readable display name for UI. */
90
+ displayName?: string;
91
+ /** Short description for tooltips/selection UI. */
92
+ description?: string;
93
+ /** NPM package name the adapter was loaded from. */
94
+ packageName: string;
95
+ /**
96
+ * Factory function that creates a live adapter instance.
97
+ *
98
+ * The parameter is typed as `unknown` because the full option shape
99
+ * (`AIAdapterInitOptions`) lives in the host layer. The core layer
100
+ * forwards the options object without inspecting it, so the loose type
101
+ * avoids a contravariant incompatibility at the core/host boundary.
102
+ * @param options - Initialization options forwarded by the runtime
103
+ * @returns Promise resolving to a live adapter instance
104
+ */
105
+ factory: (options?: unknown) => Promise<AdapterInstance>;
106
+ /** Runtime initialization options merged from config and defaults. */
107
+ options: AdapterInitOptions;
108
+ /** Adapter-wide config schema (runtime-only, for adapter-level settings). */
109
+ adapterConfigSchema?: z.ZodObject<z.ZodRawShape>;
110
+ /**
111
+ * Provider definitions with presets and per-provider schemas.
112
+ *
113
+ * Uses `AdapterProviderDefinitionContract` from `@makaio/contracts` as the
114
+ * single-source provider definition wrapper. The host-layer
115
+ * `AdapterProviderDefinition` (from `ai-adapters-core`) extends this
116
+ * contract and is assignment-compatible.
117
+ */
118
+ providers: LoadedAdapterProvider[];
119
+ /** Help links for documentation. */
120
+ helpLinks?: readonly HelpLink[];
121
+ /** Setup instructions in Markdown format. */
122
+ instructions?: string;
123
+ /** Default preset to use when no provider is explicitly configured. */
124
+ defaultPresetId?: string;
125
+ /** Client extensions this adapter can delegate to, with compatible version ranges. */
126
+ clients?: readonly AdapterClientRef[];
127
+ /** Wire protocol this adapter speaks (e.g., `'anthropic'`, `'openai'`). */
128
+ protocol?: ProtocolId;
129
+ }
130
+ //#endregion
131
+ //#region subsystems/adapter/src/adapter-runtime-lifecycle.d.ts
132
+ /**
133
+ * Platform-provided defaults injected by the runtime host.
134
+ *
135
+ * Mirrors the shape of `PlatformDefaults` from `@makaio/ai-adapters-core`
136
+ * without taking a dependency on the host-layer package.
137
+ */
138
+ interface PlatformDefaults {
139
+ /** Default working directory for agent execution (e.g. `os.tmpdir()` on Node.js). */
140
+ cwd?: string;
141
+ /** Default environment variables. */
142
+ env?: Record<string, string>;
143
+ }
144
+ /**
145
+ * Derive a stable adapter short name from an NPM package name.
146
+ *
147
+ * Examples:
148
+ * - `@makaio/ai-adapters-claude-code` → `'claude-code'`
149
+ * - `@scope/ai-adapters-gemini` → `'gemini'`
150
+ * - `some-package` → `'some-package'` (fallback: full name)
151
+ * @param packageName - NPM package name for the adapter.
152
+ * @returns Non-empty stable identifier used for deterministic routing.
153
+ */
154
+ declare function extractAdapterIdFromPackageName(packageName: string): string;
155
+ /**
156
+ * Convert a loaded adapter definition to the settings-facing `AvailableAdapter` shape.
157
+ * @param adapter - Loaded adapter definition.
158
+ * @returns Adapter metadata safe to forward beyond bootstrap.
159
+ */
160
+ declare function toAvailableAdapter(adapter: LoadedAdapter): AvailableAdapter;
161
+ /**
162
+ * Best-effort shutdown of all adapter instances and clear the map.
163
+ * @param instances - Mutable map of adapter instances to shut down.
164
+ */
165
+ declare function shutdownAdapterInstances(instances: Map<string, AdapterInstance>): Promise<void>;
166
+ /**
167
+ * Initialize the subset of loaded adapters that are enabled in settings.
168
+ * @param bus - Bus instance used for adapter-subsystem requests.
169
+ * @param machineId - Current machine identifier.
170
+ * @param adapters - Loaded adapter definitions to initialize.
171
+ * @param adapterInstances - Mutable instance registry.
172
+ * @param platformDefaults - Platform-provided adapter defaults.
173
+ */
174
+ declare function initializeEnabledAdapters(bus: IMakaioBus, machineId: string, adapters: readonly LoadedAdapter[], adapterInstances: Map<string, AdapterInstance>, platformDefaults: PlatformDefaults): Promise<void>;
175
+ /**
176
+ * Ensure a file-backed adapter config exists for each loaded adapter.
177
+ *
178
+ * Missing configs are created with `enabled: false` so boot does not silently
179
+ * activate newly discovered adapters.
180
+ * @param adapters - Loaded adapter definitions to register or update.
181
+ * @param bus - Bus instance used for adapter-subsystem requests.
182
+ */
183
+ declare function ensureAdapterConfigs(adapters: LoadedAdapter[], bus: IMakaioBus): Promise<void>;
184
+ //#endregion
185
+ //#region subsystems/adapter/src/adapter-subsystem-service.d.ts
186
+ /**
187
+ * Constructor options for {@link AdapterSubsystemService}.
188
+ */
189
+ interface AdapterSubsystemServiceOptions {
190
+ /**
191
+ * Bus instance used for handler registration.
192
+ */
193
+ readonly bus: IMakaioBus;
194
+ /**
195
+ * Repository seam for the canonical file-backed config tree.
196
+ */
197
+ readonly configRepository: IAdapterConfigRepository$1;
198
+ /**
199
+ * Extension coordinator forwarded to {@link AdapterContributionProcessor}.
200
+ *
201
+ * The processor uses the coordinator to call `registerContributionProcessor`
202
+ * when its `register()` method is invoked. Registration itself is performed
203
+ * by the composition root before `coordinator.startAll()`.
204
+ */
205
+ readonly coordinator: ExtensionCoordinator;
206
+ /**
207
+ * Stable machine identifier used for deterministic adapter ID derivation.
208
+ */
209
+ readonly machineId: string;
210
+ /**
211
+ * Platform-provided defaults forwarded to adapter factories.
212
+ */
213
+ readonly platformDefaults: PlatformDefaults;
214
+ }
215
+ /**
216
+ * File-backed adapter subsystem service.
217
+ *
218
+ * Loads the canonical `.makaio/provider-configs` and `.makaio/adapters`
219
+ * trees into an in-memory snapshot during init, then serves all reads and
220
+ * writes from that snapshot while keeping raw file state separate from the
221
+ * bus-safe read models.
222
+ *
223
+ * Adapter packages are processed incrementally as they become `active` via
224
+ * an awaited {@link ContributionProcessor} registered with the
225
+ * {@link ExtensionCoordinator}. When a package declares adapters, each
226
+ * adapter contribution is processed synchronously within `startAll()` before
227
+ * the coordinator advances to the next package, ensuring post-coordinator boot
228
+ * phases run only after adapter contributions are registered and enabled
229
+ * adapters have been initialized:
230
+ * 1. Registered in the file-backed config (created with `enabled: false` when absent)
231
+ * 2. Stored in the in-memory loaded-adapter registry
232
+ * 3. Published via `adapterSubsystem.adapter.registered`
233
+ * 4. Initialized (factory call) when enabled in settings
234
+ */
235
+ declare class AdapterSubsystemService extends BaseService {
236
+ private readonly configStore;
237
+ private readonly registry;
238
+ private readonly providerConfigService;
239
+ private readonly bindingService;
240
+ private readonly contributionProcessor;
241
+ /**
242
+ * Create a new adapter subsystem service.
243
+ * @param options - Service dependencies provided by the package factory.
244
+ */
245
+ constructor(options: AdapterSubsystemServiceOptions);
246
+ /**
247
+ * Initialize the service by loading the canonical snapshot and registering
248
+ * adapter subsystem bus handlers.
249
+ *
250
+ * Contribution-processor registration is performed by the composition root
251
+ * (via {@link createAdapterSubsystemContributionProcessor}) before
252
+ * `coordinator.startAll()`, so the service does not self-register here.
253
+ */
254
+ protected onInit(): Promise<void>;
255
+ private registerBusHandlers;
256
+ private registerReadHandlers;
257
+ private registerMutationHandlers;
258
+ /**
259
+ * Shut down adapter instances and clear in-memory state on destroy.
260
+ */
261
+ protected onDestroy(): Promise<void>;
262
+ /**
263
+ * Return the live loaded-adapter list, keyed by adapter name.
264
+ *
265
+ * Callers must read at request time (lazy), not cache the result at
266
+ * registration time, because adapters are loaded incrementally.
267
+ * @returns Readonly array of all currently loaded adapter definitions.
268
+ */
269
+ getLoadedAdapters(): readonly LoadedAdapter[];
270
+ /**
271
+ * Return the live adapter-instance map.
272
+ *
273
+ * Callers must read at request time (lazy), not cache the result at
274
+ * registration time, because instances are created incrementally.
275
+ * @returns Readonly map of adapter ID to live adapter instance.
276
+ */
277
+ getAdapterInstances(): ReadonlyMap<string, AdapterInstance>;
278
+ /**
279
+ * Return settings-facing available-adapter list derived from loaded adapters.
280
+ * @returns Readonly list of adapter metadata for the settings UI.
281
+ */
282
+ getSettingsAvailableAdapters(): readonly AvailableAdapter[];
283
+ /**
284
+ * Process adapter contributions for one active extension package.
285
+ *
286
+ * Delegates to {@link AdapterContributionProcessor.onPackageActivated}.
287
+ * Called by the composition-root contribution processor registered before
288
+ * `coordinator.startAll()`.
289
+ * @param packageName - Package that transitioned to active.
290
+ * @param pkg - Extension manifest.
291
+ * @param ctx - Per-extension context.
292
+ */
293
+ processAdapterContributions(packageName: string, pkg: KernelMakaioExtension$1, ctx: KernelExtensionContext$1): Promise<void>;
294
+ /**
295
+ * Stop adapter contributions for one stopped extension package.
296
+ *
297
+ * Delegates to {@link AdapterContributionProcessor.onPackageStopped}.
298
+ * Called by the composition-root contribution processor registered before
299
+ * `coordinator.startAll()`.
300
+ * @param packageName - Package that stopped or was disabled.
301
+ */
302
+ stopAdapterContributions(packageName: string): Promise<void>;
303
+ }
304
+ //#endregion
305
+ //#region subsystems/adapter/src/config-repository.d.ts
306
+ /**
307
+ * Options for creating a file-backed adapter config repository.
308
+ */
309
+ interface FileAdapterConfigRepositoryOptions {
310
+ /**
311
+ * Absolute directory containing provider config JSON files.
312
+ */
313
+ readonly providerConfigsDir: string;
314
+ /**
315
+ * Absolute directory containing adapter config JSON files.
316
+ */
317
+ readonly adaptersDir: string;
318
+ }
319
+ /**
320
+ * File-backed repository for adapter subsystem config entities.
321
+ *
322
+ * Provider configs and adapter configs are stored in host-provided directories.
323
+ * The file stem is the canonical entity ID for both collections.
324
+ */
325
+ declare class FileAdapterConfigRepository implements IAdapterConfigRepository$1 {
326
+ private readonly providerConfigsDir;
327
+ private readonly adaptersDir;
328
+ /**
329
+ * Create a new file-backed adapter config repository.
330
+ * @param options - Repository options.
331
+ */
332
+ constructor(options: FileAdapterConfigRepositoryOptions);
333
+ /**
334
+ * Load all validated adapter config files from disk.
335
+ * Invalid JSON or schema mismatches are skipped.
336
+ * @returns Validated adapter config file set.
337
+ */
338
+ loadAdapterConfigs(): Promise<AdapterFileConfigSet>;
339
+ /**
340
+ * Load all validated provider config files from disk.
341
+ * Invalid JSON or schema mismatches are skipped.
342
+ * @returns Validated provider config file set.
343
+ */
344
+ loadProviderConfigs(): Promise<ProviderConfigFileSet>;
345
+ /**
346
+ * Persist a validated provider config file to disk.
347
+ * @param id - Canonical provider config ID, derived from the file stem.
348
+ * @param config - Provider config payload to persist.
349
+ */
350
+ writeProviderConfig(id: string, config: ProviderConfigFile): Promise<void>;
351
+ /**
352
+ * Delete a provider config file from disk.
353
+ * @param id - Canonical provider config ID, derived from the file stem.
354
+ * @returns `true` when a file was removed.
355
+ */
356
+ deleteProviderConfig(id: string): Promise<boolean>;
357
+ /**
358
+ * Persist a validated adapter config file to disk.
359
+ * @param name - Canonical adapter name, derived from the file stem.
360
+ * @param config - Adapter config payload to persist.
361
+ */
362
+ writeAdapterFile(name: string, config: AdapterFile): Promise<void>;
363
+ /**
364
+ * Delete an adapter config file from disk.
365
+ * @param name - Canonical adapter name, derived from the file stem.
366
+ * @returns `true` when a file was removed.
367
+ */
368
+ deleteAdapterFile(name: string): Promise<boolean>;
369
+ /**
370
+ * Read raw JSON files from a directory, returning an empty array when missing.
371
+ * @param directoryPath - Directory to scan.
372
+ * @param label - Human-readable file label for warnings.
373
+ * @returns JSON file entries sorted by file name.
374
+ */
375
+ private readJsonFiles;
376
+ /**
377
+ * Emit a warning for a skipped invalid file.
378
+ * @param label - Human-readable file label.
379
+ * @param filePath - Absolute path to the skipped file.
380
+ */
381
+ private warnInvalidFile;
382
+ /**
383
+ * Check a loaded JSON file stem before accepting it as a canonical ID.
384
+ * @param stem - File stem derived from the directory entry.
385
+ * @param label - Human-readable file label.
386
+ * @param filePath - Absolute file path for diagnostics.
387
+ * @returns Canonical file stem, or null when the filename is invalid.
388
+ */
389
+ private getCanonicalLoadedStem;
390
+ /**
391
+ * Write a JSON file, creating parent directories on demand.
392
+ * @param filePath - Absolute output file path.
393
+ * @param value - Validated JSON value to persist.
394
+ */
395
+ private writeJsonFile;
396
+ /**
397
+ * Atomically replace a visible config file with a prepared temp file.
398
+ * @param sourcePath - Fully written temp file path.
399
+ * @param targetPath - Visible config file path.
400
+ */
401
+ protected replaceFile(sourcePath: string, targetPath: string): Promise<void>;
402
+ /**
403
+ * Rename a file path.
404
+ * Extracted as a protected seam so repository tests can simulate platform-
405
+ * specific rename behavior without mocking the ESM fs namespace.
406
+ * @param sourcePath - Existing source path.
407
+ * @param targetPath - Desired target path.
408
+ */
409
+ protected renameFile(sourcePath: string, targetPath: string): Promise<void>;
410
+ /**
411
+ * Delete a file path.
412
+ * @param filePath - Path to delete.
413
+ */
414
+ protected unlinkFile(filePath: string): Promise<void>;
415
+ /**
416
+ * Remove a temp file without surfacing "already gone" noise.
417
+ * @param filePath - Temp file path.
418
+ */
419
+ protected removeFileIfPresent(filePath: string): Promise<void>;
420
+ /**
421
+ * Validate that an ID is already canonical and safe to use as a file stem.
422
+ * @param value - Caller-supplied ID or name.
423
+ * @param label - Human-readable label for the failing field.
424
+ * @returns Canonical file stem.
425
+ */
426
+ private assertCanonicalFileStem;
427
+ }
428
+ //#endregion
429
+ //#region subsystems/adapter/src/adapter-subsystem-contribution-factory.d.ts
430
+ /**
431
+ * Dependencies for the adapter subsystem contribution processor factory.
432
+ */
433
+ interface AdapterSubsystemContributionProcessorDeps {
434
+ /**
435
+ * Resolve the live adapter subsystem service at activation or teardown time.
436
+ *
437
+ * The service is resolved lazily because coordinator-managed services do not
438
+ * exist until their package has been started. The getter returns `undefined`
439
+ * when the service has not yet started or has already been destroyed.
440
+ */
441
+ readonly getAdapterSubsystemService: () => AdapterSubsystemService | undefined;
442
+ }
443
+ /**
444
+ * Create the adapter contribution processor registered by the composition root.
445
+ *
446
+ * The processor is registered before `coordinator.startAll()` so adapter
447
+ * contributions run before log-import/tool/host contribution processors.
448
+ * The service itself is resolved lazily because coordinator-managed services
449
+ * do not exist until their package has been started.
450
+ * @param deps - Lazy service resolver supplied by the composition root.
451
+ * @returns Awaited contribution processor for adapter packages.
452
+ */
453
+ declare function createAdapterSubsystemContributionProcessor(deps: AdapterSubsystemContributionProcessorDeps): ContributionProcessor;
454
+ //#endregion
455
+ //#region subsystems/adapter/src/index.d.ts
456
+ /** Extension token for the adapter subsystem service. */
457
+ declare const AdapterSubsystemToken: _$_makaio_contracts0.ExtensionToken<AdapterSubsystemService>;
458
+ /**
459
+ * Options for creating the adapter subsystem extension package.
460
+ */
461
+ interface CreateAdapterSubsystemPackageOptions {
462
+ /**
463
+ * Repository seam used by the subsystem service for file-backed config storage.
464
+ */
465
+ readonly configRepository: IAdapterConfigRepository$1;
466
+ /**
467
+ * Extension coordinator forwarded to {@link AdapterContributionProcessor}.
468
+ *
469
+ * The composition root registers the contribution processor (via
470
+ * {@link createAdapterSubsystemContributionProcessor}) with this coordinator
471
+ * before `coordinator.startAll()` so adapter contributions run in a stable
472
+ * order relative to other contribution processors.
473
+ */
474
+ readonly coordinator: ExtensionCoordinator;
475
+ /**
476
+ * Platform-provided defaults forwarded to adapter factories.
477
+ */
478
+ readonly platformDefaults: PlatformDefaults;
479
+ }
480
+ /**
481
+ * Create the adapter subsystem extension package.
482
+ *
483
+ * The returned package is critical and declares the `adapters` capability.
484
+ * The composition root must register the contribution processor via
485
+ * {@link createAdapterSubsystemContributionProcessor} before calling
486
+ * `coordinator.startAll()` to ensure adapter contributions are processed in a
487
+ * stable order.
488
+ * @param options - Package-scoped dependencies including the coordinator.
489
+ * @returns Critical Makaio extension for the adapter subsystem.
490
+ */
491
+ declare function createAdapterSubsystemPackage(options: CreateAdapterSubsystemPackageOptions): MakaioNodeExtension<IMakaioBus>;
492
+ //#endregion
493
+ export { type AdapterInitOptions, type AdapterInstance, type AdapterLogImportConfig, AdapterSubsystemService, AdapterSubsystemToken, CreateAdapterSubsystemPackageOptions, FileAdapterConfigRepository, type IAdapterConfigRepository, type LoadedAdapter, type PlatformDefaults, createAdapterSubsystemContributionProcessor, createAdapterSubsystemPackage, ensureAdapterConfigs, extractAdapterIdFromPackageName, initializeEnabledAdapters, shutdownAdapterInstances, toAvailableAdapter };
@@ -0,0 +1 @@
1
+ import*as e from"node:fs/promises";import*as t from"node:path";import{randomUUID as n}from"node:crypto";import{MakaioBus as r}from"@makaio/framework/bus";import{AdapterSubjects as i,CapabilitySubjects as a,CredentialSubjects as o,ProviderDefinitionSchema as s,extensionToken as c,isUniversalRange as l,versionSatisfies as u}from"@makaio/framework/contracts";import{BaseService as d}from"@makaio/framework/service-base";import{ADAPTER_FILE_SCHEMA_VERSION as f,AdapterFileSchema as p,PROVIDER_CONFIG_SCHEMA_VERSION as m,ProviderConfigFileSchema as h,brandCredentialRecord as g,isAccountManagerRef as _,resolveCanonicalProviderConfigName as ee,slugifyProviderConfigName as v}from"@makaio/framework/contracts/config";import{resolveModelVisibility as y}from"@makaio/framework/contracts/provider";import{buildDeterministicAdapterId as b}from"@makaio/framework/services/adapter-runtime";import{ClientSubjects as te}from"@makaio/framework/contracts/client";import{ProviderStorageSubjects as x}from"@makaio/framework/services/settings/storage";import{AdapterSubsystemSubjects as S}from"@makaio/framework/services/adapter-subsystem";import{ExtensionSubjects as C}from"@makaio/framework/kernel";import{ModelRegistryProviderNotFoundError as w,ModelRegistrySubjects as T}from"@makaio/framework/services/model-registry";function E(e){return e?{...e}:void 0}function D(e){return e?{...e}:void 0}function ne(e){return e?structuredClone(e):void 0}function re(e,t){let n=[];for(let[r,i]of t.providerConfigs){let t=e.providerConfigs.get(r);t!==i&&n.push({kind:`write-provider`,key:`provider:${r}`,id:r,next:i,previous:t})}for(let[r,i]of t.adapters){let t=e.adapters.get(r);t!==i&&n.push({kind:`write-adapter`,key:`adapter:${r}`,name:r,next:i,previous:t})}for(let[r,i]of e.providerConfigs)t.providerConfigs.has(r)||n.push({kind:`delete-provider`,key:`provider-delete:${r}`,id:r,previous:i});return n}async function ie(e,t){switch(t.kind){case`write-provider`:await e.writeProviderConfig(t.id,t.next);return;case`write-adapter`:await e.writeAdapterFile(t.name,t.next);return;case`delete-provider`:if(!await e.deleteProviderConfig(t.id))throw Error(`Provider config file missing during delete: ${t.id}`);return}}async function ae(e,t){switch(t.kind){case`write-provider`:if(t.previous){await e.writeProviderConfig(t.id,t.previous);return}await e.deleteProviderConfig(t.id);return;case`write-adapter`:if(t.previous){await e.writeAdapterFile(t.name,t.previous);return}await e.deleteAdapterFile(t.name);return;case`delete-provider`:await e.writeProviderConfig(t.id,t.previous);return}}async function oe(e,t,n){let r=re(t,n);if(r.length===0)return;let i=[];try{for(let t of r)i.push(t),await ie(e,t)}catch(t){try{await se(e,i)}catch(e){throw AggregateError([t,e],`Adapter subsystem snapshot commit failed and rollback could not restore the previous state.`,{cause:e})}throw t}}async function se(e,t){let n=[];for(let r of[...t].reverse())try{await ae(e,r)}catch(e){n.push(e instanceof Error?Error(`[${r.key}] ${e.message}`,{cause:e}):Error(`[${r.key}] ${String(e)}`))}if(n.length>0)throw AggregateError(n,`Snapshot rollback failed.`)}function ce(e,t){let n=t.credentials!==void 0&&Object.keys(t.credentials).length>0,r=ue(t.credentials);return{id:e,definitionId:t.definitionId,name:t.name??t.definitionId,...t.endpointOverrides?{endpointOverrides:{...t.endpointOverrides}}:{},...t.modelVisibility?{modelVisibility:{...t.modelVisibility}}:{},modelFilterMode:t.modelFilterMode??`show-all`,isDefault:t.isDefault??!1,enabled:t.enabled??!0,isSentinel:t.isSentinel??!1,hasCredentials:n,...r?{sourceRef:r}:{}}}function O(e,t){return(t??[]).map(t=>({adapterName:e,providerConfigId:t.providerConfigId,isDefault:t.isDefault??!1}))}function le(e,t,n){return{name:e,enabled:t.enabled??!0,...t.displayName===void 0?{}:{displayName:t.displayName},...t.description===void 0?{}:{description:t.description},...t.helpLinks===void 0?{}:{helpLinks:t.helpLinks.map(e=>({...e}))},...t.instructions===void 0?{}:{instructions:t.instructions},...t.clientId===void 0?{}:{clientId:t.clientId},...t.protocol===void 0?{}:{protocol:t.protocol},...t.providerDefinitionIds===void 0?{}:{providerDefinitionIds:[...t.providerDefinitionIds]},...t.settings?{settings:structuredClone(t.settings)}:{},bindings:n.map(e=>({...e}))}}function ue(e){if(e){for(let t of Object.values(e))if(_(t))return t}}function de(e,t){let n=[],r=new Set;for(let i of e){let e=t.get(i.providerConfigId);!e||r.has(e.definitionId)||(r.add(e.definitionId),n.push(e.definitionId))}return n}function k(e){let t=new Map,n=new Map,r=new Map;for(let[i,a]of e.providerConfigs){let e=ce(i,a);t.set(i,e),n.set(v(e.name),i);let o=r.get(e.definitionId)??[];o.push(i),r.set(e.definitionId,o)}let i=new Map,a=new Map,o=new Map,s=new Map;for(let[n,r]of e.adapters){let e=O(n,r.bindings),c=le(n,r,e),l=e.filter(e=>t.get(e.providerConfigId)?.enabled);i.set(n,c),a.set(n,e),s.set(n,l.find(e=>e.isDefault)??l[0]??null);for(let t of e){let e=o.get(t.providerConfigId)??[];e.push(t),o.set(t.providerConfigId,e)}}return{providerConfigRecords:t,providerConfigSlugToId:n,providerConfigIdsByDefinition:r,adapterRecords:i,bindingsByAdapter:a,bindingsByConfig:o,defaultBindingByAdapter:s,adapterNames:new Set(i.keys())}}function A(e,t){return e.get(t)?.enabled??!1}function j(e,t){return e.some(e=>A(t,e.providerConfigId))}function M(e,t){let n=e.find(e=>A(t,e.providerConfigId));return{bindings:e.map(e=>({...e,isDefault:e.providerConfigId===n?.providerConfigId})),...n?{promoted:{...n,isDefault:!0}}:{}}}function N(e,t,n){let r=[...n.entries()].filter(([n,r])=>n!==t&&r.definitionId===e).map(([e,t])=>({id:e,config:t})),i=r.find(({id:e})=>A(n,e))?.id??null;for(let{id:e,config:t}of r)n.set(e,{...t,isDefault:i!==null&&e===i});return i}async function P(e,t,n){let{provider:r}=await e.request(x.get,{id:n.definitionId});if(!r)throw Error(`ProviderDefinition '${n.definitionId}' not found for config '${t}'`);let i=await F(e,r),a={...r.endpoints??{},...n.endpointOverrides??{}},o=I(i);return{providerConfigId:t,definitionId:r.id,...Object.keys(a).length>0?{endpointOverrides:a}:{},credentialRefs:g(n.credentials)??{},...r.credentialEnvVars?{credentialEnvVars:{...r.credentialEnvVars}}:{},...o.length>0?{ambientCredentialEnvVars:o}:{}}}async function F(e,t){try{let n=await e.requestOptional(x.list,{});if(!n.handled)return[t];let r=n.data.providers;return r.some(e=>e.id===t.id)?r:[t,...r]}catch(e){return console.debug(`[AdapterSubsystem] Provider list unavailable for ambient credential discovery`,e),[t]}}function I(e){return[...new Set(e.flatMap(e=>e.credentialEnvVars?Object.values(e.credentialEnvVars):[]))]}var L=class{tail=Promise.resolve();async run(e){let t=this.tail.then(e,e);return this.tail=t.then(()=>void 0,()=>void 0),await t}},R=class{configRepository;bus;snapshot={providerConfigs:new Map,adapters:new Map};providerConfigRecords=new Map;providerConfigSlugToId=new Map;adapterRecords=new Map;bindingsByAdapter=new Map;bindingsByConfig=new Map;defaultBindingByAdapter=new Map;providerConfigIdsByDefinition=new Map;knownAdapterNames=new Set;logImportProviderKeysPromise=null;snapshotMutationQueue=new L;constructor(e){this.configRepository=e.configRepository,this.bus=e.bus}async loadSnapshot(){let[e,t]=await Promise.all([this.configRepository.loadProviderConfigs(),this.configRepository.loadAdapterConfigs()]);this.replaceSnapshot({providerConfigs:new Map(e.configs),adapters:new Map(t.configs)})}registerListeners(e){let t=()=>{this.logImportProviderKeysPromise=null};e(this.bus.on(a.register,t,{filter:{capabilityId:`log-import`}})),e(this.bus.on(a.unregister,t,{filter:{capabilityId:`log-import`}}))}clear(){this.snapshot={providerConfigs:new Map,adapters:new Map},this.providerConfigRecords.clear(),this.providerConfigSlugToId.clear(),this.adapterRecords.clear(),this.bindingsByAdapter.clear(),this.bindingsByConfig.clear(),this.defaultBindingByAdapter.clear(),this.providerConfigIdsByDefinition.clear(),this.knownAdapterNames.clear(),this.logImportProviderKeysPromise=null}replaceSnapshot(e){this.snapshot=e,this.applyDerivedState()}cloneSnapshot(){return{providerConfigs:new Map(this.snapshot.providerConfigs),adapters:new Map(this.snapshot.adapters)}}async commitSnapshotMutation(e,t){return await this.snapshotMutationQueue.run(async()=>{let n=this.cloneSnapshot();return await e(n),await this.commitSnapshot(n),await t?.()})}async commitSnapshot(e){await oe(this.configRepository,this.snapshot,e),this.replaceSnapshot(e)}applyDerivedState(){let e=k(this.snapshot);this.providerConfigRecords=e.providerConfigRecords,this.providerConfigSlugToId=e.providerConfigSlugToId,this.providerConfigIdsByDefinition=e.providerConfigIdsByDefinition,this.adapterRecords=e.adapterRecords,this.bindingsByAdapter=e.bindingsByAdapter,this.bindingsByConfig=e.bindingsByConfig,this.defaultBindingByAdapter=e.defaultBindingByAdapter,(e.adapterNames.size!==this.knownAdapterNames.size||[...e.adapterNames].some(e=>!this.knownAdapterNames.has(e)))&&(this.knownAdapterNames=e.adapterNames,this.logImportProviderKeysPromise=null)}getProviderConfig(e){let t=this.providerConfigRecords.get(e);return t?structuredClone(t):null}requireProviderConfig(e,t){let n=this.getProviderConfig(e);if(!n)throw Error(`Provider config could not be loaded after ${t}: ${e}`);return n}getAdapterConfig(e){let t=this.adapterRecords.get(e);return t?structuredClone(t):null}requireAdapterConfig(e,t){let n=this.getAdapterConfig(e);if(!n)throw Error(`Adapter config could not be loaded after ${t}: ${e}`);return n}isAdapterEnabled(e){return this.getAdapterConfig(e)?.enabled??!1}listProviderConfigs(e){let t=[...this.providerConfigRecords.values()].map(e=>structuredClone(e));return e===void 0?t:t.filter(t=>t.enabled===e)}listProviderConfigsByDefinition(e){return this.getProviderConfigIdsByDefinition(e).map(e=>this.getProviderConfig(e)).filter(e=>e!==null)}listAdapterConfigs(){return[...this.adapterRecords.values()].map(e=>structuredClone(e))}listBindings(e){return structuredClone(this.bindingsByAdapter.get(e)??[])}listBindingsByConfig(e){return structuredClone(this.bindingsByConfig.get(e)??[])}getDefaultBinding(e){let t=this.defaultBindingByAdapter.get(e)??null;return t?structuredClone(t):null}findConfigForDefinitionAndAdapter(e,t){let n=new Set((this.bindingsByAdapter.get(t)??[]).map(e=>e.providerConfigId)),r=this.getProviderConfigIdsByDefinition(e).map(e=>this.providerConfigRecords.get(e)).filter(e=>e!==void 0&&e.enabled&&n.has(e.id)),i=r.find(e=>e.isDefault)??r[0]??null;return i?structuredClone(i):null}getRawProviderConfig(e){return this.snapshot.providerConfigs.get(e)}getProviderConfigIdsByDefinition(e){return[...this.providerConfigIdsByDefinition.get(e)??[]]}assertProviderConfigNameUnique(e,t){let n=v(e),r=this.providerConfigSlugToId.get(n);if(r!==void 0&&r!==t){let t=this.providerConfigRecords.get(r)?.name??r;throw Error(`Provider config name "${e}" conflicts with existing config "${t}": both slugify to "${n}". Choose a different name.`)}}async setAdapterConfig(e,t){return{config:await this.commitSnapshotMutation(n=>{let r=n.adapters.get(e);n.adapters.set(e,this.buildNextAdapterFile(r,t))},()=>this.requireAdapterConfig(e,`update`))}}buildNextAdapterFile(e,t){return{...e??{},$schema:f,...this.applyAdapterPatch(e,t),bindings:e?.bindings}}applyAdapterPatch(e,t){let n=e??{},r=t.helpLinks?.map(e=>({...e}))??n.helpLinks,i=t.providerDefinitionIds?[...t.providerDefinitionIds]:n.providerDefinitionIds;return{enabled:t.enabled??n.enabled??!0,displayName:t.displayName??n.displayName,description:t.description??n.description,helpLinks:r,instructions:t.instructions??n.instructions,clientId:t.clientId??n.clientId,protocol:t.protocol??n.protocol,providerDefinitionIds:i,settings:t.settings===void 0?n.settings:ne(t.settings)}}async setAdapterEnabled(e,t){await this.setAdapterConfig(e,{enabled:t})}async buildEffectiveAdapters(){let e=await this.getLogImportProviderKeys();return[...this.adapterRecords.values()].map(t=>{let n=this.bindingsByAdapter.get(t.name)??[],r=n.filter(e=>this.providerConfigRecords.get(e.providerConfigId)?.enabled),i=[...t.providerDefinitionIds??de(n,this.providerConfigRecords)];return{name:t.name,displayName:t.displayName??t.name,...t.description===void 0?{}:{description:t.description},enabled:t.enabled,configCount:n.length,readiness:r.length>0?`ready`:`needs-setup`,supportsLogImport:e.has(t.name),...t.helpLinks===void 0?{}:{helpLinks:t.helpLinks.map(e=>({...e}))},...t.instructions===void 0?{}:{instructions:t.instructions},...t.clientId===void 0?{}:{clientId:t.clientId},...t.protocol===void 0?{}:{protocol:t.protocol},...t.providerDefinitionIds!==void 0||i.length>0?{providerDefinitionIds:i}:{}}})}async getLogImportProviderKeys(){if(!this.logImportProviderKeysPromise){let e=this.bus.requestOptional(a.listProviders,{capabilityId:`log-import`}).then(t=>t.handled?new Set(t.data.providers.map(e=>e.providerKey??e.id)):(this.logImportProviderKeysPromise===e&&(this.logImportProviderKeysPromise=null),new Set)).catch(e=>{throw this.logImportProviderKeysPromise=null,e});this.logImportProviderKeysPromise=e}return await this.logImportProviderKeysPromise}async buildProviderContext(e){let t=this.snapshot.providerConfigs.get(e);return t?P(this.bus,e,t):null}removeBindingsForConfig(e,t,n){let r=new Map,i=[],a=[];for(let[o,s]of t){let t=O(o,s.bindings),c=t.findIndex(t=>t.providerConfigId===e);if(c===-1)continue;let[l]=t.splice(c,1);if(l&&i.push(l),l?.isDefault&&t.length>0){let e=M(t,n);t.splice(0,t.length,...e.bindings),e.promoted&&a.push({adapterName:o,providerConfigId:e.promoted.providerConfigId})}r.set(o,{...s,bindings:t.map(({adapterName:e,...t})=>t)})}return{changedAdapters:r,deletedBindings:i,defaultChangedBindings:a}}promoteProviderConfigDefault(e,t,n){return N(e,t,n)}};function z(e){if(!(e===void 0||e.length===0))return e.map(e=>({...e}))}function B(e,t){return e.clientId!==void 0&&t?.some(t=>t.id===e.clientId)?e.clientId:t?.[0]?.id}async function V(e,t,n,r,i={}){if(t===void 0||t.length===0)return;let a=new Map(n.map(e=>[e.definition.id,e.definition]));for(let n of t){let t=a.get(n.id);if(t===void 0)throw Error(`Adapter "${e}" references missing client "${n.id}"`);H(t.version,n.version,`Adapter "${e}" client "${n.id}" definition version ${t.version}`)}if(i.checkBinaryVersions===!1)return;let o=t.filter(e=>e.binaryVersion!==void 0);await Promise.all(o.map(async t=>{if(l(t.binaryVersion))return;let n=await r.requestOptional(te.resolveBinary,{clientId:t.id});if(!n.handled)throw Error(`Adapter "${e}" client "${t.id}" declares binaryVersion ${t.binaryVersion}, but no client.resolveBinary handler is registered`);let i=n.data.version;if(i===null)throw Error(`Adapter "${e}" client "${t.id}" binary did not report a version; requires ${t.binaryVersion}`);H(i,t.binaryVersion,`Adapter "${e}" client "${t.id}" binary version ${i}`)}))}function H(e,t,n){if(!u(e,t))throw Error(`${n} does not satisfy ${t}`)}function fe(e){let t=e.split(`/`).pop()?.replace(/^ai-adapters-/,``)?.trim();return t&&t.length>0?t:e}function U(e){let t=B(e.options,e.clients);return{name:e.name,displayName:e.displayName??e.name,description:e.description,helpLinks:e.helpLinks?.map(e=>({...e})),instructions:e.instructions,clientId:t,protocol:e.protocol,providerDefinitionIds:e.providers.map(e=>e.definition.id)}}async function W(e){for(let[t,n]of e){let e=n;if(typeof e.shutdown==`function`)try{await e.shutdown()}catch(e){console.error(`[adapter-runtime] Error shutting down adapter ${t}:`,e)}}e.clear()}async function pe(e,t,n){try{let e=t;typeof e.shutdown==`function`&&await e.shutdown()}finally{n.delete(e)}}async function me(e,t){let{config:n}=await e.request(S.getAdapterConfig,{name:t});return n?.enabled??!1}function he(e,t){return e.options.adapterId??b(t,e.name)}async function G(e,t,n,r,a){let o=[];for(let s of n)try{if(!await me(e,s.name)){console.info(`Skipping disabled adapter: ${s.name}`);continue}let n=he(s,t),o=B(s.options,s.clients),c=await s.factory({...s.options,adapterId:n,platformDefaults:a,definitionProviders:s.providers,clientId:o});if(c.adapterId!==n)throw Error(`Adapter '${s.name}' initialized with mismatched adapterId (expected '${n}', got '${c.adapterId}')`);r.set(n,c);let l=c;try{await e.emit(i.initialized,{adapterId:n,adapterName:s.name,capabilities:[...l.capabilities??[]],...l.nativeTools===void 0?{}:{nativeTools:[...l.nativeTools]}})}catch(e){try{await pe(n,c,r)}catch(e){console.error(`[adapter-runtime] Error rolling back adapter ${s.name}:`,e)}throw e}console.info(`Initialized adapter: ${s.name} (${s.packageName})`)}catch(e){o.push({adapterName:s.name,error:e})}if(o.length>0){let e=o.map(({adapterName:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`).join(`; `);throw Error(`Failed to initialize enabled adapters: ${e}`)}}async function ge(e,t){await t.request(S.ensureReady,{});let n=await Promise.all(e.map(async e=>({adapter:e,config:(await t.request(S.getAdapterConfig,{name:e.name})).config})));await Promise.all(n.filter(({config:e})=>!e).map(({adapter:e})=>t.request(S.setAdapterConfig,{name:e.name,patch:{displayName:e.displayName,description:e.description,helpLinks:e.helpLinks?.map(e=>({...e})),instructions:e.instructions,clientId:B(e.options,e.clients),protocol:e.protocol,providerDefinitionIds:e.providers.map(e=>e.definition.id),enabled:!1}})))}var _e=class{bus;machineId;loadedAdapters=new Map;adapterInstances=new Map;packageAdapters=new Map;publicationChain=Promise.resolve();constructor(e){this.bus=e.bus,this.machineId=e.machineId}getLoadedAdapters(){return[...this.loadedAdapters.values()]}getAdapterInstances(){return this.adapterInstances}getSettingsAvailableAdapters(){return[...this.loadedAdapters.values()].map(U)}registerAdapter(e,t){let n=this.loadedAdapters.get(e.name);if(n)throw Error(`Duplicate adapter name '${e.name}' from owners '${n.packageName}' and '${t}'.`);this.loadedAdapters.set(e.name,e);let r=this.packageAdapters.get(t)??[];this.packageAdapters.set(t,[...r,e.name])}async deregisterAdapter(e){let t=this.loadedAdapters.get(e);if(t){let n=t.options.adapterId??b(this.machineId,e),r=this.adapterInstances.get(n);if(r){let e=r;typeof e.shutdown==`function`&&await e.shutdown(),this.adapterInstances.delete(n)}}this.loadedAdapters.delete(e)}removePackageTracking(e){this.packageAdapters.delete(e)}async deregisterPackage(e){let t=this.packageAdapters.get(e);if(t?.length){for(let e of t)try{await this.deregisterAdapter(e)}catch(t){console.error(`[AdapterRuntimeRegistry] Error shutting down adapter "${e}":`,t)}this.packageAdapters.delete(e)}}publishAdapterRegistered(e){let{adapterName:t,displayName:n,packageName:r,enabled:i,adapterId:a,providerDefinitionIds:o}=e,s=this.adapterInstances.has(a),c=this.publicationChain.catch(()=>void 0).then(()=>this.bus.emit(S.adapter.registered,{adapterName:t,displayName:n??t,packageName:r,enabled:i,initialized:s,providerDefinitionIds:[...o]}));return this.publicationChain=c.catch(()=>void 0),c}async initializeAdapter(e,t){await G(this.bus,this.machineId,[e],this.adapterInstances,t)}async shutdownAll(){await W(this.adapterInstances),this.loadedAdapters.clear(),this.packageAdapters.clear()}},ve=class{configStore;bus;constructor(e){this.configStore=e.configStore,this.bus=e.bus}async createProviderConfig(e){let t=await this.resolveProviderConfigName(e.definitionId,e.name),n=v(t),r=this.cloneCreateCredentialRefs(e),i=E(e.endpointOverrides),a=D(e.modelVisibility),o=await this.configStore.commitSnapshotMutation(o=>{if(this.configStore.assertProviderConfigNameUnique(t),o.providerConfigs.has(n))throw Error(`Provider config already exists: ${n}`);o.providerConfigs.set(n,{$schema:m,definitionId:e.definitionId,name:t,credentials:r,endpointOverrides:i,modelVisibility:a,modelFilterMode:e.modelFilterMode??`show-all`,isDefault:![...o.providerConfigs.values()].some(t=>t.definitionId===e.definitionId),enabled:!0,isSentinel:e.isSentinel??!1})},()=>this.configStore.requireProviderConfig(n,`creation`));return await this.bus.emit(S.providerConfig.created,o),{config:o}}async updateProviderConfig(e,t){let n=await this.configStore.commitSnapshotMutation(n=>{let r=n.providerConfigs.get(e);if(!r)throw Error(`Provider config not found: ${e}`);let i=t.name??r.name??r.definitionId;t.name!==void 0&&this.configStore.assertProviderConfigNameUnique(i,e),n.providerConfigs.set(e,{...r,name:i,endpointOverrides:t.endpointOverrides===null?void 0:t.endpointOverrides===void 0?r.endpointOverrides:E(t.endpointOverrides),modelVisibility:t.modelVisibility===void 0?r.modelVisibility:D(t.modelVisibility),enabled:t.enabled??r.enabled})},()=>this.configStore.requireProviderConfig(e,`update`));return await this.bus.emit(S.providerConfig.updated,n),{config:n}}async setProviderConfigCredentialRefs(e,t){let n=this.normalizeCredentialRefs(t),r=await this.configStore.commitSnapshotMutation(t=>{let r=t.providerConfigs.get(e);if(!r)throw Error(`Provider config not found: ${e}`);t.providerConfigs.set(e,{...r,credentials:n})},()=>this.configStore.requireProviderConfig(e,`credential update`));return await this.bus.emit(S.providerConfig.updated,r),{config:r}}async deleteProviderConfig(e){let t=!1,n,r=``,i=!1,a=null,o={changedAdapters:new Map,deletedBindings:[],defaultChangedBindings:[]},s=await this.configStore.commitSnapshotMutation(s=>{let c=s.providerConfigs.get(e);if(c){if(c.isSentinel){c.enabled&&(s.providerConfigs.set(e,{...c,enabled:!1}),n=e);return}o=this.configStore.removeBindingsForConfig(e,s.adapters,s.providerConfigs),i=c.isDefault??!1,r=c.definitionId,t=!0,s.providerConfigs.delete(e),a=i?this.configStore.promoteProviderConfigDefault(c.definitionId,e,s.providerConfigs):null;for(let[e,t]of o.changedAdapters)s.adapters.set(e,t)}},()=>n?this.configStore.requireProviderConfig(e,`sentinel disable`):null);if(!t)return n&&await this.bus.emit(S.providerConfig.updated,s),{deleted:!1};await this.cleanupDeletedProviderCredentials(e);for(let e of o.deletedBindings)await this.bus.emit(S.binding.deleted,e);for(let e of o.defaultChangedBindings)await this.bus.emit(S.binding.defaultChanged,e);return await this.bus.emit(S.providerConfig.deleted,{id:e}),i&&await this.bus.emit(S.providerConfig.defaultChanged,{definitionId:r,configId:a}),{deleted:!0}}async setDefaultProviderConfig(e){let t=``,n=await this.configStore.commitSnapshotMutation(n=>{let r=n.providerConfigs.get(e);if(!r)throw Error(`Provider config not found: ${e}`);if(!(r.enabled??!0))throw Error(`Disabled provider config cannot be default: ${e}`);t=r.definitionId;for(let[r,i]of n.providerConfigs)i.definitionId===t&&n.providerConfigs.set(r,{...i,isDefault:r===e})},()=>this.configStore.requireProviderConfig(e,`setDefault`));return await this.bus.emit(S.providerConfig.updated,n),await this.bus.emit(S.providerConfig.defaultChanged,{definitionId:t,configId:e}),{config:n}}async setModelFilterMode(e,t,n){let r=await this.configStore.commitSnapshotMutation(async r=>{let i=r.providerConfigs.get(e);if(!i)throw Error(`Provider config not found: ${e}`);let a=i.modelVisibility;if(t===`allowlist`){let e=await this.selectAllowlistKeeper(i.definitionId,i,n);e&&(a={...i.modelVisibility??{},[e]:`visible`})}r.providerConfigs.set(e,{...i,modelFilterMode:t,modelVisibility:a})},()=>this.configStore.requireProviderConfig(e,`setModelFilterMode`));return await this.bus.emit(S.providerConfig.updated,r),{config:r}}normalizeCredentialRefs(e){if(!(!e||Object.keys(e).length===0))return g(e)}cloneCreateCredentialRefs(e){return this.normalizeCredentialRefs(e.credentialRefs)}async cleanupDeletedProviderCredentials(e){try{await this.bus.requestOptional(o.delete,{configId:e})}catch(t){console.warn(`[AdapterProviderConfigService] Failed to delete credentials for removed provider config "${e}":`,t)}}async resolveProviderConfigName(e,t){let n=ee({requestedName:t,providerName:(await this.getProviderDefinitionOrThrow(e)).name,definitionId:e});if(n)return n;throw Error(`Unable to derive a canonical provider config name for definition: ${e}`)}async getProviderDefinitionOrThrow(e){let{provider:t}=await this.bus.request(x.get,{id:e});if(!t)throw Error(`Provider definition not found: ${e}`);return t}async selectAllowlistKeeper(e,t,n){let{provider:r}=await this.bus.request(x.get,{id:e}),i=[n,...r?.availableModels?.map(e=>e.name)??[],...Object.keys(t.modelVisibility??{})].filter(e=>typeof e==`string`&&e.length>0);for(let e of i){let n=y(e,`allowlist`,t.modelVisibility);if(n===`enabled`||n===`visible`)return}return i[0]}},ye=class{configStore;bus;constructor(e){this.configStore=e.configStore,this.bus=e.bus}async bind(e,t){let n,r=!1;if(await this.configStore.commitSnapshotMutation(i=>{let a=i.providerConfigs.get(t);if(!a)throw Error(`Provider config not found: ${t}`);let o=i.adapters.get(e);if(!o)throw Error(`Adapter config not found: ${e}`);let s=O(e,o.bindings),c=s.find(e=>e.providerConfigId===t);if(c){n={...c};return}r=!0,n={adapterName:e,providerConfigId:t,isDefault:(a.enabled??!0)&&!j(s,i.providerConfigs)};let l=[...s,n];i.adapters.set(e,{...o,bindings:l.map(({adapterName:e,...t})=>t)})}),!n)throw Error(`Binding could not be loaded after bind: ${e}/${t}`);return r&&await this.bus.emit(S.binding.created,n),n}async unbind(e,t){let n,r=!1;await this.configStore.commitSnapshotMutation(i=>{let a=i.adapters.get(e);if(!a)return;let o=O(e,a.bindings),s=o.findIndex(e=>e.providerConfigId===t);if(s===-1)return;let[c]=o.splice(s,1);if(r=!0,c?.isDefault&&o.length>0){let e=M(o,i.providerConfigs);n=e.promoted,o.splice(0,o.length,...e.bindings)}i.adapters.set(e,{...a,bindings:o.map(({adapterName:e,...t})=>t)})}),r&&(await this.bus.emit(S.binding.deleted,{adapterName:e,providerConfigId:t}),n&&await this.bus.emit(S.binding.defaultChanged,{adapterName:e,providerConfigId:n.providerConfigId}))}async setDefaultBinding(e,t){let n=!1;await this.configStore.commitSnapshotMutation(r=>{let i=r.adapters.get(e);if(!i)throw Error(`Adapter config not found: ${e}`);let a=O(e,i.bindings),o=a.find(e=>e.providerConfigId===t);if(!o)throw Error(`Binding not found for adapter ${e} and provider config ${t}`);if(!A(r.providerConfigs,o.providerConfigId))throw Error(`Disabled provider config cannot be default binding: ${t}`);o.isDefault||(n=!0,r.adapters.set(e,{...i,bindings:a.map(({adapterName:e,...n})=>({...n,isDefault:n.providerConfigId===t}))}))}),n&&await this.bus.emit(S.binding.defaultChanged,{adapterName:e,providerConfigId:t})}};function K(e){return e.map(e=>({...e}))}function q(e){if(e instanceof w)return!0;if(typeof e!=`object`||!e)return!1;let t=e;return t.name===`ModelRegistryProviderNotFoundError`&&typeof t.providerId==`string`||e instanceof Error&&/^Request to "getProviderModels" failed: Provider ".+" is not present in the model registry$/.test(e.message)||e instanceof Error&&/^Provider ".+" is not present in the model registry$/.test(e.message)?!0:q(t.cause)}function be(e){let t=new Set;for(let n of e){if(typeof n==`string`){(n===`anthropic`||n===`openai`)&&t.add(n);continue}n.anthropic!==void 0&&t.add(`anthropic`),n.openai!==void 0&&t.add(`openai`)}return[...t]}function xe(e,t,n){let r=be(n);if(t!==void 0){if(!r.includes(t))throw Error(`Adapter "${e}" definition protocol "${t}" must be declared in manifest.protocols [${r.join(`, `)}].`);return t}return r.length===1?r[0]:void 0}var Se=class{configStore;registry;coordinator;machineId;platformDefaults;constructor(e){this.configStore=e.configStore,this.registry=e.registry,this.coordinator=e.coordinator,this.machineId=e.machineId,this.platformDefaults=e.platformDefaults}register(e){e(this.coordinator.registerContributionProcessor({filter:e=>!!e.adapters?.length,processActivated:async(e,t,n)=>{await this.onPackageActivated(e,t,n)},processStopped:async e=>{await this.onPackageStopped(e)}}))}async onPackageActivated(e,t,n){let r=t.adapters??[],i=[],a=[],o=new Map,s=await n.bus.request(C.contributions.catalog,{}),c=new Map;for(let e of s.providers)c.set(e.definition.id,e);for(let n of t.providers??[])c.set(n.id,{packageName:e,definition:n});let l=s.clients;try{for(let t of r){let r=await this.activateAdapterContribution(e,t,n.bus,o,c,l);i.push(t.definition.name),a.push(r)}}catch(t){for(let e of i.reverse())try{await this.registry.deregisterAdapter(e)}catch(t){console.error(`[AdapterContributionProcessor] Rollback error for adapter "${e}":`,t)}throw this.registry.removePackageTracking(e),t}await this.publishActivatedAdapters(a)}async processAdapterContribution(e,t,n=r){let i=await this.activateAdapterContribution(e,t,n,new Map);await this.publishActivatedAdapters([i])}async activateAdapterContribution(e,t,n,r,i,a){let o=await this.buildLoadedAdapter(e,t,n,r,i,a),s=!1;try{await this.ensureAdapterConfig(o);let t=this.configStore.isAdapterEnabled(o.name);t&&await this.validateEnabledAdapterClientRefs(o,n,a),this.registry.registerAdapter(o,e),s=!0,t&&(await this.registry.initializeAdapter(o,this.platformDefaults),console.info(`[AdapterContributionProcessor] Initialized adapter: ${o.name} (${o.packageName})`))}catch(e){if(s)try{await this.registry.deregisterAdapter(o.name)}catch(e){console.error(`[AdapterContributionProcessor] Rollback error for adapter "${o.name}":`,e)}throw e}return o}async validateEnabledAdapterClientRefs(e,t,n){if(e.clients===void 0||e.clients.length===0)return;let r=n??(await t.request(C.contributions.catalog,{})).clients;await V(e.name,e.clients,r,t)}async resolveProviderDefinitions(e,t,n,r,i,a){let o=a;if(!o){o=new Map;let t=await e.request(C.contributions.catalog,{});for(let e of t.providers)o.set(e.definition.id,e)}let s=[],c=[];for(let e of t){let t=o.get(e.definitionId);if(!t){c.push(e.definitionId);continue}s.push({definition:t.definition,providerPackageName:t.packageName,configSchema:e.configSchema??r,credentialSchema:e.credentialSchema??i})}if(c.length>0)throw Error(`Adapter "${n}" declares providers [${c.join(`, `)}] but no active extension registers them. Ensure provider extensions are listed in the adapter's dependencies.`);return s}async buildLoadedAdapter(e,t,n=r,i=new Map,a,o){let s=t.definition,c=t.manifest,l=s.name,u=o??(await n.request(C.contributions.catalog,{})).clients;await V(l,c.clients,u,n,{checkBinaryVersions:!1});let d=await this.resolveProviderDefinitions(n,s.providers,l,s.providerConfigSchema,s.providerCredentialSchema,a),f=await Promise.all(d.map(async e=>{let t=e.definition.id;try{let r=i.get(t);if(r===void 0){let a=await n.requestOptional(T.getProviderModels,{providerId:t});r=a.handled?a.data.models:e.definition.availableModels??[],i.set(t,r)}return{...e,definition:{...e.definition,availableModels:K(r)}}}catch(n){if(q(n))return{...e,definition:{...e.definition,availableModels:K(e.definition.availableModels??[])}};throw Error(`[AdapterContributionProcessor] Failed to populate available models for provider "${t}" on adapter "${l}"`,{cause:n})}}));return{name:l,displayName:s.displayName??c.displayName,description:s.description,packageName:e,factory:s.createAdapter,options:{adapterId:b(this.machineId,l)},adapterConfigSchema:s.adapterConfigSchema,providers:f,helpLinks:s.helpLinks,instructions:s.instructions,defaultPresetId:s.defaultPresetId,clients:z(c.clients),protocol:xe(l,s.protocol,c.protocols)}}async ensureAdapterConfig(e){this.configStore.getAdapterConfig(e.name)||await this.configStore.setAdapterConfig(e.name,{displayName:e.displayName,description:e.description,helpLinks:e.helpLinks?.map(e=>({...e})),instructions:e.instructions,clientId:B(e.options,e.clients),protocol:e.protocol,providerDefinitionIds:e.providers.map(e=>e.definition.id),enabled:!1})}async onPackageStopped(e){await this.registry.deregisterPackage(e)}publishAdapterRegistered(e){let t=this.configStore.isAdapterEnabled(e.name),n=e.options.adapterId??b(this.machineId,e.name),r=e.providers.map(e=>e.definition.id);return this.registry.publishAdapterRegistered({adapterName:e.name,displayName:e.displayName,packageName:e.packageName,enabled:t,adapterId:n,providerDefinitionIds:r})}async publishActivatedAdapters(e){for(let t of e)try{await this.publishAdapterRegistered(t)}catch(e){console.error(`[AdapterContributionProcessor] Failed to publish adapter "${t.name}" registration:`,e)}}};const J=-100;function Ce(e,t){let n=e.on(x.get,e=>{let n=Y(t()).get(e.payload.id)??null;e.setResult({provider:n})},{priority:J}),r=e.on(x.list,e=>{e.setResult({providers:[...Y(t()).values()]})},{priority:J}),i=e.on(x.listByProtocol,e=>{let n=[...Y(t()).values()].filter(t=>t.endpoints!==void 0&&e.payload.protocol in t.endpoints);e.setResult({providers:n})},{priority:J});return()=>{n(),r(),i()}}function Y(e){let t=new Map;for(let n of e)for(let e of n.providers){let n=s.parse(e.definition);t.has(n.id)||t.set(n.id,{id:n.id,packageName:e.providerPackageName,name:n.name,...n.description===void 0?{}:{description:n.description},...n.endpoints===void 0?{}:{endpoints:n.endpoints},...n.defaultModel===void 0?{}:{defaultModel:n.defaultModel},...n.fastModel===void 0?{}:{fastModel:n.fastModel},availableModels:n.availableModels,defaultModelFilterMode:n.defaultModelFilterMode??`show-all`,...n.credentialEnvVars===void 0?{}:{credentialEnvVars:n.credentialEnvVars},enabled:!0,createdAt:0,updatedAt:0})}return t}var X=class extends d{configStore;registry;providerConfigService;bindingService;contributionProcessor;constructor(e){super(e.bus),this.configStore=new R({configRepository:e.configRepository,bus:e.bus}),this.registry=new _e({bus:e.bus,machineId:e.machineId}),this.providerConfigService=new ve({configStore:this.configStore,bus:e.bus}),this.bindingService=new ye({configStore:this.configStore,bus:e.bus}),this.contributionProcessor=new Se({configStore:this.configStore,registry:this.registry,coordinator:e.coordinator,machineId:e.machineId,platformDefaults:e.platformDefaults})}async onInit(){await this.configStore.loadSnapshot(),this.configStore.registerListeners(e=>this.addCleanup(e)),this.registerBusHandlers(),await this.bus.emit(S.ready,{})}registerBusHandlers(){this.addCleanup(Ce(this.bus,()=>this.registry.getLoadedAdapters())),this.registerReadHandlers(),this.registerMutationHandlers()}registerReadHandlers(){this.registerHandler(S.getAdapterConfig,e=>{e.setResult({config:this.configStore.getAdapterConfig(e.payload.name)})}),this.registerHandler(S.listAdapterConfigs,e=>{e.setResult({configs:this.configStore.listAdapterConfigs()})}),this.registerHandler(S.getProviderConfig,e=>{e.setResult({config:this.configStore.getProviderConfig(e.payload.id)})}),this.registerHandler(S.listProviderConfigs,e=>{e.setResult({configs:this.configStore.listProviderConfigs(e.payload.enabled)})}),this.registerHandler(S.listProviderConfigsByDefinition,e=>{e.setResult({configs:this.configStore.listProviderConfigsByDefinition(e.payload.definitionId)})}),this.registerHandler(S.listBindings,e=>{e.setResult({bindings:this.configStore.listBindings(e.payload.adapterName)})}),this.registerHandler(S.listBindingsByConfig,e=>{e.setResult({bindings:this.configStore.listBindingsByConfig(e.payload.providerConfigId)})}),this.registerHandler(S.getDefaultBinding,e=>{e.setResult({binding:this.configStore.getDefaultBinding(e.payload.adapterName)})}),this.registerHandler(S.findConfigForDefinitionAndAdapter,e=>{e.setResult({config:this.configStore.findConfigForDefinitionAndAdapter(e.payload.definitionId,e.payload.adapterName)})}),this.registerHandler(S.buildProviderContext,async e=>{e.setResult({context:await this.configStore.buildProviderContext(e.payload.providerConfigId)})}),this.registerHandler(S.listAdapters,async e=>{e.setResult({adapters:await this.configStore.buildEffectiveAdapters()})}),this.registerHandler(S.getProviderDefinitionsByAdapter,e=>{let t=(this.registry.getLoadedAdapters().find(t=>t.name===e.payload.adapterName)?.providers??[]).map(e=>s.parse(e.definition));e.setResult({definitions:t})}),this.registerHandler(S.ensureReady,e=>{e.setResult({ready:!0})})}registerMutationHandlers(){this.registerHandler(S.createProviderConfig,async e=>{e.setResult(await this.providerConfigService.createProviderConfig(e.payload))}),this.registerHandler(S.updateProviderConfig,async e=>{e.setResult(await this.providerConfigService.updateProviderConfig(e.payload.id,e.payload.patch))}),this.registerHandler(S.setProviderConfigCredentialRefs,async e=>{e.setResult(await this.providerConfigService.setProviderConfigCredentialRefs(e.payload.id,e.payload.credentialRefs))}),this.registerHandler(S.deleteProviderConfig,async e=>{e.setResult(await this.providerConfigService.deleteProviderConfig(e.payload.id))}),this.registerHandler(S.setDefaultProviderConfig,async e=>{e.setResult(await this.providerConfigService.setDefaultProviderConfig(e.payload.id))}),this.registerHandler(S.setModelFilterMode,async e=>{e.setResult(await this.providerConfigService.setModelFilterMode(e.payload.id,e.payload.modelFilterMode,e.payload.preferredModel))}),this.registerHandler(S.setAdapterConfig,async e=>{e.setResult(await this.configStore.setAdapterConfig(e.payload.name,e.payload.patch))}),this.registerHandler(S.setAdapterEnabled,async e=>{await this.configStore.setAdapterEnabled(e.payload.name,e.payload.enabled),e.setResult({success:!0})}),this.registerHandler(S.bind,async e=>{e.setResult({binding:await this.bindingService.bind(e.payload.adapterName,e.payload.providerConfigId)})}),this.registerHandler(S.unbind,async e=>{await this.bindingService.unbind(e.payload.adapterName,e.payload.providerConfigId),e.setResult({})}),this.registerHandler(S.setDefaultBinding,async e=>{await this.bindingService.setDefaultBinding(e.payload.adapterName,e.payload.providerConfigId),e.setResult({})})}async onDestroy(){await this.registry.shutdownAll(),this.configStore.clear()}getLoadedAdapters(){return this.registry.getLoadedAdapters()}getAdapterInstances(){return this.registry.getAdapterInstances()}getSettingsAvailableAdapters(){return this.registry.getSettingsAvailableAdapters()}async processAdapterContributions(e,t,n){await this.contributionProcessor.onPackageActivated(e,t,n)}async stopAdapterContributions(e){await this.contributionProcessor.onPackageStopped(e)}};const Z=`.json`;var we=class{providerConfigsDir;adaptersDir;constructor(e){this.providerConfigsDir=e.providerConfigsDir,this.adaptersDir=e.adaptersDir}async loadAdapterConfigs(){let e=new Map,t=await this.readJsonFiles(this.adaptersDir,`adapter`);for(let n of t){let t=this.getCanonicalLoadedStem(n.stem,`adapter`,n.filePath);if(!t)continue;let r=p.safeParse(n.jsonData);if(!r.success){this.warnInvalidFile(`adapter`,n.filePath);continue}e.set(t,r.data)}return{configs:e}}async loadProviderConfigs(){let e=new Map,t=await this.readJsonFiles(this.providerConfigsDir,`provider config`);for(let n of t){let t=this.getCanonicalLoadedStem(n.stem,`provider config`,n.filePath);if(!t)continue;let r=h.safeParse(n.jsonData);if(!r.success){this.warnInvalidFile(`provider config`,n.filePath);continue}e.set(t,r.data)}return{configs:e}}async writeProviderConfig(e,n){let r=this.assertCanonicalFileStem(e,`provider config id`),i=h.parse(n);await this.writeJsonFile(t.join(this.providerConfigsDir,`${r}${Z}`),i)}async deleteProviderConfig(e){let n=this.assertCanonicalFileStem(e,`provider config id`);try{return await this.unlinkFile(t.join(this.providerConfigsDir,`${n}${Z}`)),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async writeAdapterFile(e,n){let r=this.assertCanonicalFileStem(e,`adapter name`),i=p.parse(n);await this.writeJsonFile(t.join(this.adaptersDir,`${r}${Z}`),i)}async deleteAdapterFile(e){let n=this.assertCanonicalFileStem(e,`adapter name`);try{return await this.unlinkFile(t.join(this.adaptersDir,`${n}${Z}`)),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async readJsonFiles(n,r){try{let i=(await e.readdir(n,{withFileTypes:!0})).filter(e=>e.isFile()&&t.extname(e.name)===Z).sort((e,t)=>e.name.localeCompare(t.name));return(await Promise.all(i.map(async i=>{let a=t.join(n,i.name);try{let n=await e.readFile(a,`utf-8`);return{filePath:a,stem:t.parse(i.name).name,jsonData:JSON.parse(n)}}catch(e){if(e instanceof SyntaxError||e instanceof Error&&e.code===`ENOENT`)return this.warnInvalidFile(r,a),null;throw e}}))).filter(e=>e!==null)}catch(e){if(e.code===`ENOENT`)return[];throw e}}warnInvalidFile(e,t){console.warn(`[FileAdapterConfigRepository] Skipping invalid %s file: %s`,e,t)}getCanonicalLoadedStem(e,t,n){try{return this.assertCanonicalFileStem(e,`${t} file stem`)}catch{return this.warnInvalidFile(t,n),null}}async writeJsonFile(r,i){let a=t.dirname(r),o=t.join(a,`.${t.basename(r)}.${n()}.tmp`);await e.mkdir(a,{recursive:!0});try{await e.writeFile(o,`${JSON.stringify(i,null,2)}\n`,{encoding:`utf-8`,mode:384}),await this.replaceFile(o,r)}catch(e){throw await this.removeFileIfPresent(o),e}}async replaceFile(e,t){try{await this.renameFile(e,t);return}catch(e){let t=e;if(![`EEXIST`,`EPERM`,`EACCES`].includes(t.code??``))throw e}let r=`${t}.${n()}.bak`,i=!1;try{await this.renameFile(t,r),i=!0}catch(e){if(e.code!==`ENOENT`)throw e}try{await this.renameFile(e,t)}catch(e){throw i&&await this.renameFile(r,t).catch(()=>void 0),e}i&&await this.removeFileIfPresent(r)}async renameFile(t,n){await e.rename(t,n)}async unlinkFile(t){await e.unlink(t)}async removeFileIfPresent(t){try{await e.unlink(t)}catch(e){e.code!==`ENOENT`&&console.warn(`[FileAdapterConfigRepository] Failed to remove temp file: %s`,t,e)}}assertCanonicalFileStem(e,n){let r=e.trim(),i=t.basename(r);if(!r||e!==r||r!==i||!/^[a-z0-9._-]+$/.test(r)||r.includes(`/`)||r.includes(`\\`)||r.toLowerCase().endsWith(`.json`)||r===`.`||r===`..`)throw Error(`Invalid canonical ${n}: ${e}`);return r}};function Q(e){return{filter:e=>!!e.adapters?.length,async processActivated(t,n,r){let i=e.getAdapterSubsystemService();if(!i)throw Error(`AdapterSubsystemService is not available. Ensure the adapter subsystem package starts before adapter-contributing packages.`);await i.processAdapterContributions(t,n,r)},async processStopped(t){let n=e.getAdapterSubsystemService();n&&await n.stopAdapterContributions(t)}}}const $=c(`adapter-subsystem`);function Te(e){return{name:$.name,displayName:`Adapter Subsystem`,version:`0.1.0`,provides:[`adapters`],critical:!0,create:t=>new X({bus:t.bus,configRepository:e.configRepository,coordinator:e.coordinator,machineId:t.machineId,platformDefaults:e.platformDefaults})}}export{X as AdapterSubsystemService,$ as AdapterSubsystemToken,we as FileAdapterConfigRepository,Q as createAdapterSubsystemContributionProcessor,Te as createAdapterSubsystemPackage,ge as ensureAdapterConfigs,fe as extractAdapterIdFromPackageName,G as initializeEnabledAdapters,W as shutdownAdapterInstances,U as toAvailableAdapter};
@@ -4001,8 +4001,8 @@ interface TurnTrackerSerializedState {
4001
4001
  declare const TurnTrackerSerializedStateSchema: z.ZodDefault<z.ZodObject<{
4002
4002
  sessions: z.ZodRecord<z.ZodString, z.ZodObject<{
4003
4003
  state: z.ZodEnum<{
4004
- idle: "idle";
4005
4004
  active: "active";
4005
+ idle: "idle";
4006
4006
  }>;
4007
4007
  currentTurnId: z.ZodOptional<z.ZodString>;
4008
4008
  }, z.core.$strip>>;
@@ -1,3 +1,3 @@
1
- import { C as AdapterNamespace, S as AdapterSchemas, _ as StartAgentRequest, a as AgentSelection, b as AdapterRuntimeOptions, c as AgentSelectionKindMap, d as SessionDiscoveredSchema, f as SessionUsage, g as RehydrateAgentSchema, h as RehydrateAgentResponse, i as AdapterSelectionSchema, l as AgentSelectionSchema, m as RehydrateAgentRequest, n as ProviderContextSchema, o as AgentSelectionBase, p as SessionUsageSchema, r as AdapterSelection, s as AgentSelectionBaseSchema, t as ProviderContext, u as SessionDiscovered, v as StartAgentResponse, w as AdapterSubjects, x as AdapterRuntimeOptionsSchema, y as StartAgentSchema } from "../../index-BHzgDuRE.mjs";
1
+ import { C as AdapterNamespace, S as AdapterSchemas, _ as StartAgentRequest, a as AgentSelection, b as AdapterRuntimeOptions, c as AgentSelectionKindMap, d as SessionDiscoveredSchema, f as SessionUsage, g as RehydrateAgentSchema, h as RehydrateAgentResponse, i as AdapterSelectionSchema, l as AgentSelectionSchema, m as RehydrateAgentRequest, n as ProviderContextSchema, o as AgentSelectionBase, p as SessionUsageSchema, r as AdapterSelection, s as AgentSelectionBaseSchema, t as ProviderContext, u as SessionDiscovered, v as StartAgentResponse, w as AdapterSubjects, x as AdapterRuntimeOptionsSchema, y as StartAgentSchema } from "../../index-B7uYo0C6.mjs";
2
2
  import { a as ROOT_SESSION_LINEAGE_KIND, c as SUBAGENT_SESSION_LINEAGE_KIND, d as SessionLineageKindSchema, f as SessionLineageSchema, i as ForkSessionLineageSchema, l as SessionLineage, n as CompressSessionLineageSchema, o as RootSessionLineageSchema, p as SubagentSessionLineageSchema, r as FORK_SESSION_LINEAGE_KIND, s as SESSION_LINEAGE_KINDS, t as COMPRESS_SESSION_LINEAGE_KIND, u as SessionLineageKind } from "../../session-lineage-CKg6mErA.mjs";
3
3
  export { AdapterNamespace, AdapterRuntimeOptions, AdapterRuntimeOptionsSchema, AdapterSchemas, AdapterSelection, AdapterSelectionSchema, AdapterSubjects, AgentSelection, AgentSelectionBase, AgentSelectionBaseSchema, AgentSelectionKindMap, AgentSelectionSchema, COMPRESS_SESSION_LINEAGE_KIND, CompressSessionLineageSchema, FORK_SESSION_LINEAGE_KIND, ForkSessionLineageSchema, ProviderContext, ProviderContextSchema, ROOT_SESSION_LINEAGE_KIND, RehydrateAgentRequest, RehydrateAgentResponse, RehydrateAgentSchema, RootSessionLineageSchema, SESSION_LINEAGE_KINDS, SUBAGENT_SESSION_LINEAGE_KIND, SessionDiscovered, SessionDiscoveredSchema, SessionLineage, SessionLineageKind, SessionLineageKindSchema, SessionLineageSchema, SessionUsage, SessionUsageSchema, StartAgentRequest, StartAgentResponse, StartAgentSchema, SubagentSessionLineageSchema };
@@ -1,2 +1,2 @@
1
- import { $ as ArtifactObservationSchema, A as ArtifactDraft, B as BeforeArtifactHookRegistration, C as ArtifactStatusChangedPayload, Ct as ConfidenceMetadataSchema, D as ArtifactKindDefinition, Dt as LocalRefSchema, E as ArtifactDataOf, Et as LocalRef, F as ArtifactLifecycleHookRegistration, G as ArtifactCompareRequestSchema, H as ArtifactActor, I as ArtifactLifecycleSemanticEvent, J as ArtifactConflictPolicy, K as ArtifactCompareResponse, L as ArtifactReactionHookContext, M as ArtifactHookFilter, N as ArtifactLifecycleHookDefinition, O as ArtifactOf, Ot as RelationTypeRegistration, P as ArtifactLifecycleHookEvent, Q as ArtifactObservation, R as ArtifactReactionHookRegistration, S as ArtifactSchemas, St as ConfidenceMetadata, T as AnyArtifactKindDefinition, Tt as EvidenceRefSchema, U as ArtifactActorSchema, V as defineArtifactLifecycleHooks, W as ArtifactCompareRequest, X as ArtifactKindRegistration, Y as ArtifactConflictPolicySchema, Z as ArtifactKindRegistrationSchema, _ as ArtifactResolveRequest, _t as ArtifactScopeSchema, a as ArtifactKindListRequest, at as ArtifactRefSchema, b as ArtifactReviseResponse, bt as ConfidenceLevel, c as ArtifactKindRegisterResponse, ct as ArtifactRelationQueryTargetSchema, d as ArtifactQueryResponse, dt as ArtifactRelationTargetSchema, et as ArtifactQueryRequest, f as ArtifactRelationAddedPayload, ft as ArtifactRepresentations, g as ArtifactRelationTypeRegisterResponse, gt as ArtifactScope, h as ArtifactRelationTypeRegisterRequest, ht as ArtifactRevisionSchema, i as ArtifactKindChangedPayload, it as ArtifactRef, j as ArtifactDraftPatch, k as defineArtifactKind, kt as RelationTypeRegistrationSchema, l as ArtifactNamespace, lt as ArtifactRelationSchema, m as ArtifactRelationTypeListResponse, mt as ArtifactRevision, n as ArtifactCreateResponse, nt as ArtifactQueryScope, o as ArtifactKindListResponse, ot as ArtifactRelation, p as ArtifactRelationTypeListRequest, pt as ArtifactRepresentationsSchema, q as ArtifactCompareResponseSchema, r as ArtifactCreatedPayload, rt as ArtifactQueryScopeSchema, s as ArtifactKindRegisterRequest, st as ArtifactRelationQueryTarget, t as ArtifactCreateRequest, tt as ArtifactQueryRequestSchema, u as ArtifactObservationAddedPayload, ut as ArtifactRelationTarget, v as ArtifactResolveResponse, vt as ConfidenceBasis, w as ArtifactSubjects, wt as EvidenceRef, x as ArtifactRevisedPayload, xt as ConfidenceLevelSchema, y as ArtifactReviseRequest, yt as ConfidenceBasisSchema, z as BeforeArtifactHookContext } from "../../index-BHAOu6Hs.mjs";
1
+ import { $ as ArtifactObservationSchema, A as ArtifactDraft, B as BeforeArtifactHookRegistration, C as ArtifactStatusChangedPayload, Ct as ConfidenceMetadataSchema, D as ArtifactKindDefinition, Dt as LocalRefSchema, E as ArtifactDataOf, Et as LocalRef, F as ArtifactLifecycleHookRegistration, G as ArtifactCompareRequestSchema, H as ArtifactActor, I as ArtifactLifecycleSemanticEvent, J as ArtifactConflictPolicy, K as ArtifactCompareResponse, L as ArtifactReactionHookContext, M as ArtifactHookFilter, N as ArtifactLifecycleHookDefinition, O as ArtifactOf, Ot as RelationTypeRegistration, P as ArtifactLifecycleHookEvent, Q as ArtifactObservation, R as ArtifactReactionHookRegistration, S as ArtifactSchemas, St as ConfidenceMetadata, T as AnyArtifactKindDefinition, Tt as EvidenceRefSchema, U as ArtifactActorSchema, V as defineArtifactLifecycleHooks, W as ArtifactCompareRequest, X as ArtifactKindRegistration, Y as ArtifactConflictPolicySchema, Z as ArtifactKindRegistrationSchema, _ as ArtifactResolveRequest, _t as ArtifactScopeSchema, a as ArtifactKindListRequest, at as ArtifactRefSchema, b as ArtifactReviseResponse, bt as ConfidenceLevel, c as ArtifactKindRegisterResponse, ct as ArtifactRelationQueryTargetSchema, d as ArtifactQueryResponse, dt as ArtifactRelationTargetSchema, et as ArtifactQueryRequest, f as ArtifactRelationAddedPayload, ft as ArtifactRepresentations, g as ArtifactRelationTypeRegisterResponse, gt as ArtifactScope, h as ArtifactRelationTypeRegisterRequest, ht as ArtifactRevisionSchema, i as ArtifactKindChangedPayload, it as ArtifactRef, j as ArtifactDraftPatch, k as defineArtifactKind, kt as RelationTypeRegistrationSchema, l as ArtifactNamespace, lt as ArtifactRelationSchema, m as ArtifactRelationTypeListResponse, mt as ArtifactRevision, n as ArtifactCreateResponse, nt as ArtifactQueryScope, o as ArtifactKindListResponse, ot as ArtifactRelation, p as ArtifactRelationTypeListRequest, pt as ArtifactRepresentationsSchema, q as ArtifactCompareResponseSchema, r as ArtifactCreatedPayload, rt as ArtifactQueryScopeSchema, s as ArtifactKindRegisterRequest, st as ArtifactRelationQueryTarget, t as ArtifactCreateRequest, tt as ArtifactQueryRequestSchema, u as ArtifactObservationAddedPayload, ut as ArtifactRelationTarget, v as ArtifactResolveResponse, vt as ConfidenceBasis, w as ArtifactSubjects, wt as EvidenceRef, x as ArtifactRevisedPayload, xt as ConfidenceLevelSchema, y as ArtifactReviseRequest, yt as ConfidenceBasisSchema, z as BeforeArtifactHookContext } from "../../index-BFuke0jw.mjs";
2
2
  export { AnyArtifactKindDefinition, ArtifactActor, ArtifactActorSchema, ArtifactCompareRequest, ArtifactCompareRequestSchema, ArtifactCompareResponse, ArtifactCompareResponseSchema, ArtifactConflictPolicy, ArtifactConflictPolicySchema, ArtifactCreateRequest, ArtifactCreateResponse, ArtifactCreatedPayload, ArtifactDataOf, ArtifactDraft, ArtifactDraftPatch, ArtifactHookFilter, ArtifactKindChangedPayload, ArtifactKindDefinition, ArtifactKindListRequest, ArtifactKindListResponse, ArtifactKindRegisterRequest, ArtifactKindRegisterResponse, ArtifactKindRegistration, ArtifactKindRegistrationSchema, ArtifactLifecycleHookDefinition, ArtifactLifecycleHookEvent, ArtifactLifecycleHookRegistration, ArtifactLifecycleSemanticEvent, ArtifactNamespace, ArtifactObservation, ArtifactObservationAddedPayload, ArtifactObservationSchema, ArtifactOf, ArtifactQueryRequest, ArtifactQueryRequestSchema, ArtifactQueryResponse, ArtifactQueryScope, ArtifactQueryScopeSchema, ArtifactReactionHookContext, ArtifactReactionHookRegistration, ArtifactRef, ArtifactRefSchema, ArtifactRelation, ArtifactRelationAddedPayload, ArtifactRelationQueryTarget, ArtifactRelationQueryTargetSchema, ArtifactRelationSchema, ArtifactRelationTarget, ArtifactRelationTargetSchema, ArtifactRelationTypeListRequest, ArtifactRelationTypeListResponse, ArtifactRelationTypeRegisterRequest, ArtifactRelationTypeRegisterResponse, ArtifactRepresentations, ArtifactRepresentationsSchema, ArtifactResolveRequest, ArtifactResolveResponse, ArtifactReviseRequest, ArtifactReviseResponse, ArtifactRevisedPayload, ArtifactRevision, ArtifactRevisionSchema, ArtifactSchemas, ArtifactScope, ArtifactScopeSchema, ArtifactStatusChangedPayload, ArtifactSubjects, BeforeArtifactHookContext, BeforeArtifactHookRegistration, ConfidenceBasis, ConfidenceBasisSchema, ConfidenceLevel, ConfidenceLevelSchema, ConfidenceMetadata, ConfidenceMetadataSchema, EvidenceRef, EvidenceRefSchema, LocalRef, LocalRefSchema, RelationTypeRegistration, RelationTypeRegistrationSchema, defineArtifactKind, defineArtifactLifecycleHooks };