@makaio/framework 1.0.0-dev-1783940945655 → 1.0.0-dev-1783975608971
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.
- package/dist/.makaio-build.json +2 -2
- package/dist/{account-identity-BYfeWLe-.mjs → account-identity-CP4DC0DL.mjs} +1 -1
- package/dist/{adapter-nl_xz9dz.mjs → adapter-B9vVBwli.mjs} +1 -1
- package/dist/adapter-subsystem/index.d.mts +10 -0
- package/dist/adapter-subsystem/index.mjs +1 -1
- package/dist/adapters/node.mjs +1 -1
- package/dist/authority-state-bootstrap-CEuKScnL.mjs +1 -0
- package/dist/bus/index.d.mts +31 -31
- package/dist/bus/index.mjs +1 -1
- package/dist/{canonical-model-CVRCW9h7.mjs → canonical-model-C31NaBJs.mjs} +1 -1
- package/dist/{client-BkpLM8Fx.mjs → client-CzPCSeyE.mjs} +1 -1
- package/dist/clients/index.d.mts +5 -5
- package/dist/contracts/adapter/index.d.mts +1 -1
- package/dist/contracts/adapter/index.mjs +1 -1
- package/dist/contracts/canonical-model/index.d.mts +1 -1
- package/dist/contracts/canonical-model/index.mjs +1 -1
- package/dist/contracts/client/index.d.mts +1 -1
- package/dist/contracts/client/index.mjs +1 -1
- package/dist/contracts/extension/index.d.mts +2 -2
- package/dist/contracts/extension/index.mjs +1 -1
- package/dist/contracts/facet/index.d.mts +1 -1
- package/dist/contracts/harness/index.d.mts +1 -1
- package/dist/contracts/index.d.mts +221 -153
- package/dist/contracts/index.mjs +1 -1
- package/dist/contracts/materialization/index.d.mts +1 -1
- package/dist/contracts/native-session-supervisor/index.d.mts +2 -2
- package/dist/contracts/native-session-supervisor/index.mjs +1 -1
- package/dist/contracts/session/index.d.mts +3 -3
- package/dist/contracts/session/index.mjs +1 -1
- package/dist/contracts/shared/index.d.mts +1 -1
- package/dist/contracts/variant/index.d.mts +1 -1
- package/dist/contracts/workflow/index.d.mts +3 -3
- package/dist/contracts/workflow/index.mjs +1 -1
- package/dist/{detached-extension-handle-CTaQoolf.mjs → detached-extension-handle-vDK194QV.mjs} +1 -1
- package/dist/drizzle/0026_m_mrgvi7fq.sql +16 -0
- package/dist/drizzle/0027_m_mrgw0uzg.sql +1 -0
- package/dist/drizzle/0028_m_mrgx04i1.sql +1 -0
- package/dist/drizzle/0029_terminal-authority.sql +1 -0
- package/dist/drizzle/meta/_journal.json +28 -0
- package/dist/{extension-D4iKUUMG.mjs → extension-Cgg45Xk1.mjs} +1 -1
- package/dist/git/index.mjs +8 -8
- package/dist/{index-D5IEq4_E.d.mts → index-BH145jWk.d.mts} +9 -7
- package/dist/{index-BcejR1Jc.d.mts → index-BORQLrT7.d.mts} +1 -1
- package/dist/{index-CB2XTzvd.d.mts → index-Bbr5LEUc.d.mts} +1 -1
- package/dist/{index-5s_dN3cg2.d.mts → index-BmsPH78f2.d.mts} +33 -5
- package/dist/{index-BtL7ONuM.d.mts → index-C6LZOiDv.d.mts} +149 -1
- package/dist/{index-DlUPWOh4.d.mts → index-CCX4veeR.d.mts} +2859 -692
- package/dist/{index-DxatNFz7.d.mts → index-CMTNBuo6.d.mts} +16 -16
- package/dist/{index-CVs0Qxks.d.mts → index-CSxfU0tB.d.mts} +4 -4
- package/dist/{index-Cw3cjGAT.d.mts → index-ChSwb11f.d.mts} +7 -7
- package/dist/{index-Lp0T_V1W.d.mts → index-CidZvQ-c.d.mts} +3 -3
- package/dist/{index-p6dWV52m.d.mts → index-Cq6rXKae.d.mts} +379 -379
- package/dist/{index-DNc1yLQs.d.mts → index-DHGW7dFf.d.mts} +8 -8
- package/dist/{index-C9Q1E8Y-.d.mts → index-DMQlLz2W.d.mts} +34 -34
- package/dist/{index-iJP-l15K.d.mts → index-DXBiCH2y.d.mts} +27 -1
- package/dist/{index-CW6-0k3Z.d.mts → index-DlAfs3RD.d.mts} +105 -105
- package/dist/{index-sCOlgPyj.d.mts → index-DpZbaS7y.d.mts} +388 -388
- package/dist/{index-Do7Wgio_2.d.mts → index-MTvmxwiu2.d.mts} +1 -1
- package/dist/{index-BsEvzFey.d.mts → index-kqxUXYe7.d.mts} +6 -6
- package/dist/kernel/extension/index.d.mts +1 -1
- package/dist/kernel/index.d.mts +2 -2
- package/dist/kernel/observability/index.d.mts +1 -1
- package/dist/{lib-DymjnkAP.mjs → lib-DktBDEoY.mjs} +1 -1
- package/dist/{load-extensions-BtUrq2_t.mjs → load-extensions-nqL5WAKj.mjs} +1 -1
- package/dist/mcp-http-server/index.d.mts +27 -90
- package/dist/mcp-http-server/index.mjs +1 -1
- package/dist/{namespace-CfgtqUWS.d.mts → namespace-BoA6u44C.d.mts} +156 -156
- package/dist/{namespace-D3SQQgxa2.d.mts → namespace-CukqFYHf2.d.mts} +1 -1
- package/dist/{namespace-CQBSXm1U.d.mts → namespace-TLkZRkcU.d.mts} +20 -20
- package/dist/{namespace-CpyL93kW.d.mts → namespace-dgNmx9g3.d.mts} +27 -27
- package/dist/{namespace-CGgOLxiW2.d.mts → namespace-rO-C2Dgu2.d.mts} +2 -2
- package/dist/{native-session-supervisor-CdtVGWA9.mjs → native-session-supervisor-Bgz-Q1WH.mjs} +1 -1
- package/dist/package-BYpWkSuQ.mjs +1 -0
- package/dist/package-CsFFT9iR.mjs +7 -0
- package/dist/{package-CdBiknf3.d.mts → package-DG9GSY8M.d.mts} +52 -1
- package/dist/package.json +1 -1
- package/dist/{profile-D2m94ZYD.mjs → profile-BRi6K6am.mjs} +1 -1
- package/dist/rules/index.mjs +1 -1
- package/dist/runtime-node/extension-validation.mjs +1 -1
- package/dist/runtime-node/index.d.mts +4 -89
- package/dist/runtime-node/index.mjs +24 -24
- package/dist/runtime-node/makaio-config.mjs +1 -1
- package/dist/runtime-node/workflow-worker/index.d.mts +2 -2
- package/dist/runtime-node/workflow-worker/index.mjs +1 -1
- package/dist/runtime-node/workflow-worker/worker-entry.mjs +1 -1
- package/dist/{schema-BnTOFCdU.d.mts → schema-CxN7d_MU.d.mts} +1 -1
- package/dist/{schemas--uwN5dfK2.d.mts → schemas-CIO03KSD2.d.mts} +11 -11
- package/dist/{schemas-n9Ff6_RX.mjs → schemas-DyJHJ8Pm.mjs} +1 -1
- package/dist/{schemas-C17AifUQ.d.mts → schemas-OaBqeEUT.d.mts} +156 -156
- package/dist/schemas-th_nuC5t.mjs +1 -0
- package/dist/semver-D3Y7uMEb.mjs +1 -0
- package/dist/service-base/index.d.mts +4 -3
- package/dist/service-base/index.mjs +1 -1
- package/dist/services/agent-runtime/index.d.mts +2 -2
- package/dist/services/agent-runtime/namespace.d.mts +1 -1
- package/dist/services/agent-runtime/schemas.d.mts +1 -1
- package/dist/services/execution-target/index.d.mts +1 -1
- package/dist/services/filesystem/namespace.d.mts +6 -6
- package/dist/services/filesystem/schemas.d.mts +3 -3
- package/dist/services/harness/index.d.mts +3 -3
- package/dist/services/index.d.mts +100 -100
- package/dist/services/index.mjs +1 -1
- package/dist/services/session/index.d.mts +5 -5
- package/dist/services/session/messages/namespace.d.mts +1 -1
- package/dist/services/session/session-events/namespace.d.mts +1 -1
- package/dist/services/session/storage/namespace.d.mts +1 -1
- package/dist/services/session/storage/schema.d.mts +1 -1
- package/dist/services/settings/namespace.d.mts +8 -8
- package/dist/services/settings/storage/extension-configs/namespace.d.mts +3 -3
- package/dist/services/subagent/index.d.mts +2 -2
- package/dist/services/subagent/index.mjs +1 -1
- package/dist/services/subagent-template/index.d.mts +2 -2
- package/dist/services/subagent-template/namespace.d.mts +1 -1
- package/dist/services/subagent-template/schemas.d.mts +1 -1
- package/dist/services/tools/index.mjs +1 -1
- package/dist/{session-lRd8HZNZ.mjs → session-BxWogVkD.mjs} +1 -1
- package/dist/storage/drizzle/index.d.mts +8 -1
- package/dist/storage/drizzle/index.mjs +1 -1
- package/dist/tools/index.d.mts +1 -1
- package/dist/{tools-C8vqn1KY.mjs → tools-PC_L6g2m.mjs} +1 -1
- package/dist/{transition-Bfe8VVc1.d.mts → transition-CwUIm1hJ.d.mts} +8 -0
- package/dist/{types-q95p55BF.d.mts → types-DQsYUZwa.d.mts} +578 -267
- package/dist/ui-components/index.d.mts +4 -4
- package/dist/{version-C1-VD-XL.mjs → version-BbWrAPld.mjs} +1 -1
- package/dist/workflow-DFJYGjq_.mjs +1 -0
- package/dist/workflow-engine/index.d.mts +670 -67
- package/dist/workflow-engine/index.mjs +1 -1
- package/dist/workflow-engine/package.d.mts +1 -1
- package/dist/workflow-engine/package.mjs +1 -1
- package/dist/workflow-engine/workflow-orchestrator.mjs +1 -1
- package/dist/workflow-worker-BEFjCccX.mjs +1 -0
- package/package.json +10 -9
- package/dist/loop-gate-handlers-0a3dIY8O.mjs +0 -1
- package/dist/package-0gVhAVkO.mjs +0 -7
- package/dist/package-BwvGaKwn.mjs +0 -1
- package/dist/schemas-D6lj9NMg.mjs +0 -1
- package/dist/semver-BccS1s9R.mjs +0 -1
- package/dist/workflow-CvVAZ89A.mjs +0 -1
- package/dist/workflow-worker-CudfEstp.mjs +0 -1
- /package/dist/{await-trigger-D623tvig.mjs → await-trigger-DP-fTQc4.mjs} +0 -0
- /package/dist/{descriptor-to-package-D5SWf6TL.mjs → descriptor-to-package-Rs-OjOQU.mjs} +0 -0
- /package/dist/{esm-oHhRYTEn.mjs → esm-C_WW4-pP.mjs} +0 -0
package/dist/.makaio-build.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 1,
|
|
3
|
-
"fingerprint": "
|
|
4
|
-
"builtAt": "2026-07-
|
|
3
|
+
"fingerprint": "9a8092bb2345bd417ca630e7c8cf65b7675361f2ed449a690573bcf0031df23f",
|
|
4
|
+
"builtAt": "2026-07-13T20:47:44.652Z"
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./json-value-DmU8ibo_.mjs";import"./shared-RP_KARKF.mjs";import{g as t,h as n,m as r}from"./profile-
|
|
1
|
+
import{t as e}from"./json-value-DmU8ibo_.mjs";import"./shared-RP_KARKF.mjs";import{g as t,h as n,m as r}from"./profile-BRi6K6am.mjs";import{n as i}from"./version-BbWrAPld.mjs";import{z as a}from"zod";const o=a.enum([`strong`,`alias`]),s=a.object({scheme:t,value:t,strength:o}),c=a.object({key:t,label:a.string(),usedPercentage:a.number().finite().min(0).max(100),resetsAt:n.optional()}),l=a.object({windows:a.array(c)}),u=a.record(a.string(),a.unknown()).optional(),d=a.object({clientId:t,found:a.boolean(),binaryPath:r.optional(),version:a.string().optional(),warningMessage:a.string().optional()}),f=a.object({clientId:t,binaryName:t,supportedVersions:i.optional()}),p=a.object({clientAccountId:t,clientId:t,observedAt:n,source:t,displayLabel:a.string().optional(),usage:l,metadata:u}),m=a.discriminatedUnion(`kind`,[a.object({kind:a.literal(`session`),sessionId:t}),a.object({kind:a.literal(`adapter-session`),adapterSessionId:t}),a.object({kind:a.literal(`both`),sessionId:t,adapterSessionId:t})]),h=a.object({clientId:a.string(),source:a.string(),kind:a.string(),observedAt:n,payload:e}),g={request:a.object({clientId:t,observedAt:n.optional(),displayLabel:a.string().optional(),identifiers:a.array(s).min(1),metadata:u}),response:a.object({clientAccountId:t,displayLabel:a.string().optional()})},_={request:h.extend({locator:m}),response:a.object({handled:a.boolean(),sessionId:t.nullable(),clientAccountId:t.nullable(),changed:a.boolean()})},v={request:a.object({clientId:t,observedAt:n,source:t,account:a.object({displayLabel:a.string().optional(),identifiers:a.array(s).min(1)}),usage:l,metadata:u}),response:a.object({clientAccountId:t,snapshot:p})};export{u as a,_ as c,p as d,c as f,h as i,m as l,g as n,d as o,l as p,o as r,f as s,s as t,v as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,b as t,c as n,d as r,f as i,g as a,h as o,ht as s,l as c,m as l,o as u,p as d,s as f,t as p,u as m,v as h,y as g}from"./schemas-
|
|
1
|
+
import{_ as e,b as t,c as n,d as r,f as i,g as a,h as o,ht as s,l as c,m as l,o as u,p as d,s as f,t as p,u as m,v as h,y as g}from"./schemas-DyJHJ8Pm.mjs";import"./compression-CZ_6fYq8.mjs";import"./provider-context-DOsjOjiR.mjs";import"./contracts/adapter/schemas/session-lineage.mjs";import{createBusNamespace as _}from"@makaio/framework/core";const v={getCapabilities:s,startAgent:t,infer:g,listAgents:h,getAgent:e,stopAgent:a,rehydrateAgent:o,getConfigSchema:l,"agent.created":d,"session.created":i,"session.discovered":p,"session.usage":r,"session.closed":m,log:c,error:n,initialized:f,quota:u},y=_(`adapter`,v),b=y.subjects;export{b as n,v as r,y as t};
|
|
@@ -242,6 +242,10 @@ interface AdapterSubsystemServiceOptions {
|
|
|
242
242
|
readonly platformDefaults: PlatformDefaults;
|
|
243
243
|
/** Trusted host-layer auth preparer forwarded opaquely to adapter factories. */
|
|
244
244
|
readonly prepareAuthRuntime?: unknown;
|
|
245
|
+
/** Priority for runtime snapshot handlers that must win before remote control-plane peers. */
|
|
246
|
+
readonly runtimeSnapshotHandlerPriority?: number;
|
|
247
|
+
/** Priority for provider/client definition reads backing local runtime snapshots. */
|
|
248
|
+
readonly runtimeDefinitionHandlerPriority?: number;
|
|
245
249
|
}
|
|
246
250
|
/**
|
|
247
251
|
* File-backed adapter subsystem service.
|
|
@@ -269,6 +273,8 @@ declare class AdapterSubsystemService extends BaseService {
|
|
|
269
273
|
private readonly providerConfigService;
|
|
270
274
|
private readonly bindingService;
|
|
271
275
|
private readonly contributionProcessor;
|
|
276
|
+
private readonly runtimeSnapshotHandlerPriority;
|
|
277
|
+
private readonly runtimeDefinitionHandlerPriority;
|
|
272
278
|
/**
|
|
273
279
|
* Create a new adapter subsystem service.
|
|
274
280
|
* @param options - Service dependencies provided by the package factory.
|
|
@@ -600,6 +606,10 @@ interface CreateAdapterSubsystemPackageOptions {
|
|
|
600
606
|
readonly platformDefaults: PlatformDefaults;
|
|
601
607
|
/** Trusted host-layer auth preparer forwarded opaquely to adapter factories. */
|
|
602
608
|
readonly prepareAuthRuntime?: unknown;
|
|
609
|
+
/** Priority for runtime snapshot handlers that must win before remote control-plane peers. */
|
|
610
|
+
readonly runtimeSnapshotHandlerPriority?: number;
|
|
611
|
+
/** Priority for provider/client definition reads backing local runtime snapshots. */
|
|
612
|
+
readonly runtimeDefinitionHandlerPriority?: number;
|
|
603
613
|
}
|
|
604
614
|
/**
|
|
605
615
|
* Create the adapter subsystem extension package.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isDeepStrictEqual as e}from"node:util";import*as t from"node:fs/promises";import*as n from"node:path";import{randomUUID as r}from"node:crypto";import{MakaioBus as i}from"@makaio/framework/bus";import{AdapterProviderAuthSchema as a,AdapterSubjects as o,CapabilitySubjects as s,ClientDefinitionSchema as c,CredentialSubjects as l,ProviderDefinitionSchema as u,ResolvedProviderContextSchema as d,assertAdapterAuthBindingMatchesMethod as f,extensionToken as ee,isUniversalRange as te,versionSatisfies as ne}from"@makaio/framework/contracts";import{BaseService as re}from"@makaio/framework/service-base";import{ProviderConfigAuthSchema as p,assertAdapterAuthBindingMatchesMethod as ie}from"@makaio/framework/contracts/auth";import{ADAPTER_FILE_SCHEMA_VERSION as ae,AdapterFileSchema as oe,PROVIDER_CONFIG_SCHEMA_VERSION as m,ProviderConfigFileSchema as se,resolveCanonicalProviderConfigName as ce,slugifyProviderConfigName as h}from"@makaio/framework/contracts/config";import{resolveModelVisibility as le}from"@makaio/framework/contracts/provider";import{buildDeterministicAdapterId as g}from"@makaio/framework/services/adapter-runtime";import{ClientSubjects as ue}from"@makaio/framework/contracts/client";import{ClientStorageSubjects as _,ProviderStorageSubjects as v}from"@makaio/framework/services/settings/storage";import{ExtensionSubjects as y}from"@makaio/framework/kernel";import{AdapterSubsystemSubjects as b}from"@makaio/framework/services/adapter-subsystem";import{ModelRegistryProviderNotFoundError as de,ModelRegistrySubjects as fe}from"@makaio/framework/services/model-registry";function x(e){return e?{...e}:void 0}function S(e){return e?{...e}:void 0}function pe(e){return e?structuredClone(e):void 0}function me(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 he(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 ge(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 _e(e,t,n){let r=me(t,n);if(r.length===0)return;let i=[];try{for(let t of r)i.push(t),await he(e,t)}catch(t){try{await ve(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 ve(e,t){let n=[];for(let r of[...t].reverse())try{await ge(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 C(e,t){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,auth:ye(t),...t.managedBy?{managedBy:{...t.managedBy}}:{}}}function ye(e){switch(e.auth.mode){case`explicit`:return{mode:`explicit`,method:{...e.auth.method},hasCredentials:!0};case`inferred`:return{mode:`inferred`,method:{...e.auth.method},...e.auth.account?{account:{...e.auth.account}}:{},hasCredentials:!1};case`none`:return{mode:`none`,method:{...e.auth.method},hasCredentials:!1}}}function w(e,t){return(t??[]).map(t=>({adapterName:e,providerConfigId:t.providerConfigId,isDefault:t.isDefault??!1}))}function be(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 xe(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 Se(e){let t=new Map,n=new Map,r=new Map;for(let[i,a]of e.providerConfigs){let e=C(i,a);t.set(i,e),n.set(h(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=w(n,r.bindings),c=be(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 T(e,t){let n=e.get(t);return n!==void 0&&(n.enabled??!0)}function Ce(e,t){return e.some(e=>T(t,e.providerConfigId))}function E(e,t){let n=e.find(e=>T(t,e.providerConfigId));return{bindings:e.map(e=>({...e,isDefault:e.providerConfigId===n?.providerConfigId})),...n?{promoted:{...n,isDefault:!0}}:{}}}function we(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})=>T(n,e))?.id??null;for(let{id:e,config:t}of r)n.set(e,{...t,isDefault:i!==null&&e===i});return i}function D(e){if(!e.provider.enabled)throw new O(`provider-definition-disabled`,`Provider definition is disabled for auth selection: ${e.provider.id}`);if(e.client!==void 0&&!e.client.enabled)throw new O(`client-definition-disabled`,`Client definition is disabled for auth selection: ${e.client.id}`)}var O=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ProviderConfigAuthValidationError`}};async function k(e,t,n,r){let i=r??(await e.request(v.get,{id:t})).provider;if(!i||i.id!==t)throw new O(`provider-definition-not-found`,`Provider definition not found for auth selection: ${t}`);let a,o;if(n.method.owner===`provider`){if(n.method.providerDefinitionId!==t)throw new O(`auth-method-not-found`,`Provider auth method "${n.method.methodId}" does not belong to definition "${t}".`);a=i.authMethods.find(({id:e})=>e===n.method.methodId)}else{if({client:o}=await e.request(_.get,{id:n.method.clientId}),!o)throw new O(`client-definition-not-found`,`Client definition not found for auth selection: ${n.method.clientId}`);a=o.authMethods.find(({id:e})=>e===n.method.methodId)}if(!a){let e=n.method.owner===`provider`?n.method.providerDefinitionId:n.method.clientId;throw new O(`auth-method-not-found`,`Authentication method "${n.method.methodId}" is not declared by ${n.method.owner} "${e}".`)}if(a.mode!==n.mode)throw new O(`auth-mode-mismatch`,`Authentication method "${a.id}" declares mode "${a.mode}", not "${n.mode}".`);return a.mode===`explicit`&&n.mode===`explicit`&&Te(a,n),{method:a,provider:i,...o?{client:o}:{}}}function Te(e,t){let n=new Set(e.fields.map(({id:e})=>e)),r=e.fields.filter(({id:e,required:n})=>n&&t.credentialRefs[e]===void 0).map(({id:e})=>e),i=Object.keys(t.credentialRefs).filter(e=>!n.has(e));if(r.length===0&&i.length===0)return;let a=[...r.length>0?[`missing required fields [${r.join(`, `)}]`]:[],...i.length>0?[`unexpected fields [${i.join(`, `)}]`]:[]];throw new O(`auth-credential-fields-mismatch`,`Authentication method "${e.id}" has ${a.join(` and `)}.`)}var A=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ProviderRuntimeContextError`}};async function j(e,t,n){if(n.enabled===!1)throw new A(`provider-config-disabled`,`ProviderConfig '${t}' is disabled and cannot be used for adapter startup.`);let r=await k(e,n.definitionId,n.auth);D(r);let i=Ee(n.auth,r.method),a={...r.provider.endpoints??{},...n.endpointOverrides??{}};return{context:d.parse({state:`resolved`,providerConfigId:t,definitionId:r.provider.id,...Object.keys(a).length>0?{endpointOverrides:a}:{},auth:i,...r.provider.capabilities?{capabilities:r.provider.capabilities}:{}}),definition:structuredClone(r.provider)}}function Ee(e,t){switch(e.mode){case`explicit`:if(t.mode!==`explicit`)throw M(e.mode,t.mode);return{mode:e.mode,method:{...e.method},definition:structuredClone(t),credentialRefs:{...e.credentialRefs}};case`inferred`:if(t.mode!==`inferred`)throw M(e.mode,t.mode);return{mode:e.mode,method:{...e.method},definition:{...t},...e.account?{account:{...e.account}}:{}};case`none`:if(t.mode!==`none`)throw M(e.mode,t.mode);return{mode:e.mode,method:{...e.method},definition:{...t}}}}function M(e,t){return new O(`auth-mode-mismatch`,`Validated authentication mode changed during context assembly: selected "${e}", declared "${t}".`)}var De=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}},Oe=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 De;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(s.register,t,{filter:{capabilityId:`log-import`}})),e(this.bus.on(s.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 _e(this.configRepository,this.snapshot,e),this.replaceSnapshot(e)}applyDerivedState(){let e=Se(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}getProviderConfigIdsByDefinition(e){return[...this.providerConfigIdsByDefinition.get(e)??[]]}assertProviderConfigNameUnique(e,t){let n=h(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:ae,...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:pe(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??xe(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(s.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 resolveProviderRuntimeSnapshot(e){let t=this.snapshot.providerConfigs.get(e);if(!t)return null;let{context:n,definition:r}=await j(this.bus,e,t);return{config:C(e,t),context:n,definition:r}}async resolveBoundProviderRuntimeSnapshot(e,t){let n=this.snapshot,r=n.providerConfigs.get(t),i=n.adapters.get(e),a=r!==void 0&&w(e,i?.bindings).some(e=>e.providerConfigId===t);if(!r)return{snapshot:null,isBound:!1};let{context:o,definition:s}=await j(this.bus,t,r);return{isBound:a,snapshot:{config:C(t,r),context:o,definition:s}}}removeBindingsForConfig(e,t,n){let r=new Map,i=[],a=[];for(let[o,s]of t){let t=w(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=E(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 we(e,t,n)}};const N=process.env.MAKAIO_SKIP_CLIENT_VERSION_CHECK===`1`;function ke(e){if(!(e===void 0||e.length===0))return e.map(e=>({...e}))}function Ae(e,t){if(e===void 0||e.length===0)return;let n=new Map(t.map(e=>[e.definition.id,e.definition]));return e.map(e=>{let t=n.get(e.id);if(t===void 0)throw Error(`Adapter client definition "${e.id}" is missing from the active contribution catalog.`);return t})}function P(e,t){return e.clientId!==void 0&&t?.some(t=>t.id===e.clientId)?e.clientId:t?.[0]?.id}async function F(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}"`);je(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(te(t.binaryVersion))return;let n=await r.requestOptional(ue.resolveBinary,{clientId:t.id});if(!n.handled){if(N){console.warn(`[SKIP_VERSION_CHECK] Adapter "${e}" client "${t.id}" declares binaryVersion ${t.binaryVersion}, but no client.resolveBinary handler is registered — check bypassed`);return}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){if(N){console.warn(`[SKIP_VERSION_CHECK] Adapter "${e}" client "${t.id}" binary did not report a version; requires ${t.binaryVersion} — check bypassed`);return}throw Error(`Adapter "${e}" client "${t.id}" binary did not report a version; requires ${t.binaryVersion}`)}if(!ne(i,t.binaryVersion)){let n=`Adapter "${e}" client "${t.id}" binary version ${i}`;if(N){console.warn(`[SKIP_VERSION_CHECK] ${n} does not satisfy ${t.binaryVersion} — check bypassed`);return}throw Error(`${n} does not satisfy ${t.binaryVersion}`)}}))}function je(e,t,n){if(!ne(e,t))throw Error(`${n} does not satisfy ${t}`)}function Me(e){let t=e.split(`/`).pop()?.replace(/^ai-adapters-/,``)?.trim();return t&&t.length>0?t:e}function I(e){let t=P(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.providerDefinitionIds]}}async function L(e,t,n=5e3){let r=Fe(t);if(!r)return;let i;try{await Promise.race([Promise.resolve().then(r),new Promise((t,r)=>{i=setTimeout(()=>{r(Error(`Timed out closing adapter ${e} after ${n}ms`))},n)})])}finally{i&&clearTimeout(i)}}async function R(e){for(let[t,n]of e)try{await L(t,n)}catch(e){console.error(`[adapter-runtime] Error shutting down adapter ${t}:`,e)}e.clear()}async function Ne(e,t,n){try{await L(e,t)}finally{n.delete(e)}}async function Pe(e,t){let{config:n}=await e.request(b.getAdapterConfig,{name:t});return n?.enabled??!1}function z(e,t){return e.options.adapterId??g(t,e.name)}function Fe(e){let t=e;if(typeof t.shutdown==`function`)return t.shutdown.bind(e);if(typeof t.closeAsync==`function`)return t.closeAsync.bind(e);if(typeof t.close==`function`)return t.close.bind(e)}async function B(e,t,n,r,i){let a=[];for(let s of n)try{if(!await Pe(e,s.name)){console.info(`Skipping disabled adapter: ${s.name}`);continue}let n=z(s,t),a=P(s.options,s.clients),c=await s.factory({...s.options,adapterId:n,platformDefaults:i,definitionProviders:s.providers,clientId:a,globalBus:e});if(c.adapterId!==n){let e=Error(`Adapter '${s.name}' initialized with mismatched adapterId (expected '${n}', got '${c.adapterId}')`);try{await L(n,c)}catch(e){console.error(`[adapter-runtime] Error rolling back adapter ${s.name}:`,e)}throw e}r.set(n,c);let l=c;try{await e.emit(o.initialized,{adapterId:n,adapterName:s.name,capabilities:[...l.capabilities??[]],...l.nativeTools===void 0?{}:{nativeTools:[...l.nativeTools]}})}catch(e){try{await Ne(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){a.push({adapterName:s.name,error:e})}if(a.length>0){let e=a.map(({adapterName:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`).join(`; `);throw Error(`Failed to initialize enabled adapters: ${e}`)}}async function Ie(e,t){await t.request(b.ensureReady,{});let n=await Promise.all(e.map(async e=>({adapter:e,config:(await t.request(b.getAdapterConfig,{name:e.name})).config})));await Promise.all(n.filter(({config:e})=>!e).map(({adapter:e})=>t.request(b.setAdapterConfig,{name:e.name,patch:{displayName:e.displayName,description:e.description,helpLinks:e.helpLinks?.map(e=>({...e})),instructions:e.instructions,clientId:P(e.options,e.clients),protocol:e.protocol,providerDefinitionIds:[...e.providerDefinitionIds],enabled:!1}})))}var Le=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}hasAdapterInstance(e){return this.adapterInstances.has(this.resolveLoadedAdapterId(e))}resolveLoadedAdapterId(e){return z(e,this.machineId)}getSettingsAvailableAdapters(){return[...this.loadedAdapters.values()].map(I)}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])}updateAdapterProviders(e,t){let n=this.loadedAdapters.get(e);if(!n)return;let r={...n,providers:t};return this.loadedAdapters.set(e,r),r}async removeProviderPackage(e,t){let n=[];for(let r of this.loadedAdapters.values()){let i=r.providers.filter(t=>t.providerPackageName!==e);if(i.length===r.providers.length)continue;let a={...r,providers:i};if(this.loadedAdapters.set(r.name,a),n.push(a),this.hasAdapterInstance(a))try{await this.restartAdapterInstance(a,t)}catch(t){console.error(`[AdapterRuntimeRegistry] Error restarting adapter "${a.name}" after provider package "${e}" stopped:`,t)}}return n}async deregisterAdapter(e){let t=this.loadedAdapters.get(e);if(!t)return;let n=this.resolveLoadedAdapterId(t),r=this.adapterInstances.get(n);r&&(await L(n,r),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)return;let n=!1;for(let e of t)try{await this.deregisterAdapter(e)}catch(t){n=!0,console.error(`[AdapterRuntimeRegistry] Error shutting down adapter "${e}":`,t)}n||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(b.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 B(this.bus,this.machineId,[e],this.adapterInstances,t)}async restartAdapterInstance(e,t){let n=this.resolveLoadedAdapterId(e),r=this.adapterInstances.get(n);if(r){try{await L(n,r)}catch(t){throw console.error(`[AdapterRuntimeRegistry] Error shutting down adapter "${e.name}" before restart:`,t),t}this.adapterInstances.delete(n)}await this.initializeAdapter(e,t)}async shutdownAll(){await R(this.adapterInstances),this.loadedAdapters.clear(),this.packageAdapters.clear()}};function Re(e,t,n,r){let i=n.isDefault??!1;return r?i?!0:![...e.entries()].some(([e,r])=>e!==t&&r.definitionId===n.definitionId&&(r.enabled??!0)&&(r.isDefault??!1)):!1}var ze=class{configStore;bus;constructor(e){this.configStore=e.configStore,this.bus=e.bus}async createProviderConfig(e){let t=await this.getProviderDefinitionOrThrow(e.definitionId),n=p.parse(e.auth),r=e.enabled??!0,i=await k(this.bus,e.definitionId,n,t);r&&D(i);let a=this.resolveProviderConfigNameFromDefinition(e.definitionId,t.name,e.name),o=h(a),s=x(e.endpointOverrides),c=S(e.modelVisibility),l=await this.configStore.commitSnapshotMutation(t=>{if(this.configStore.assertProviderConfigNameUnique(a),t.providerConfigs.has(o))throw Error(`Provider config already exists: ${o}`);t.providerConfigs.set(o,{$schema:m,definitionId:e.definitionId,name:a,auth:structuredClone(n),...e.managedBy?{managedBy:{...e.managedBy}}:{},endpointOverrides:s,modelVisibility:c,modelFilterMode:e.modelFilterMode??`show-all`,isDefault:r&&![...t.providerConfigs.values()].some(t=>t.definitionId===e.definitionId&&(t.enabled??!0)&&(t.isDefault??!1)),enabled:r})},()=>this.configStore.requireProviderConfig(o,`creation`));return await this.bus.emit(b.providerConfig.created,l),{config:l}}async updateProviderConfig(e,t){let n,r=await this.configStore.commitSnapshotMutation(async r=>{n=await this.applyProviderConfigPatch(r,e,t)},()=>this.configStore.requireProviderConfig(e,`update`));return await this.bus.emit(b.providerConfig.updated,r),n&&await this.bus.emit(b.providerConfig.defaultChanged,n),{config:r}}async applyProviderConfigPatch(e,t,n){let r=e.providerConfigs.get(t);if(!r)throw Error(`Provider config not found: ${t}`);let i=n.name??r.name??r.definitionId;n.name!==void 0&&this.configStore.assertProviderConfigNameUnique(i,t);let a=n.enabled??r.enabled??!0;a&&!(r.enabled??!0)&&D(await k(this.bus,r.definitionId,r.auth));let o=Re(e.providerConfigs,t,r,a);return e.providerConfigs.set(t,{...r,name:i,endpointOverrides:n.endpointOverrides===null?void 0:n.endpointOverrides===void 0?r.endpointOverrides:x(n.endpointOverrides),modelVisibility:n.modelVisibility===void 0?r.modelVisibility:S(n.modelVisibility),enabled:a,isDefault:o}),(r.isDefault??!1)&&!o?{definitionId:r.definitionId,configId:this.configStore.promoteProviderConfigDefault(r.definitionId,t,e.providerConfigs)}:!(r.isDefault??!1)&&o?{definitionId:r.definitionId,configId:t}:void 0}async setProviderConfigAuth(e,t){let n=p.parse(t),r=await this.configStore.commitSnapshotMutation(async t=>{let r=t.providerConfigs.get(e);if(!r)throw Error(`Provider config not found: ${e}`);let i=await k(this.bus,r.definitionId,n);(r.enabled??!0)&&D(i),t.providerConfigs.set(e,{...r,auth:structuredClone(n)})},()=>this.configStore.requireProviderConfig(e,`auth update`));return await this.bus.emit(b.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.managedBy){(c.enabled??!0)&&(i=c.isDefault??!1,r=c.definitionId,s.providerConfigs.set(e,{...c,enabled:!1,isDefault:!1}),a=i?this.configStore.promoteProviderConfigDefault(c.definitionId,e,s.providerConfigs):null,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,`managed config disable`):null);if(!t)return n?(await this.bus.emit(b.providerConfig.updated,s),i&&await this.bus.emit(b.providerConfig.defaultChanged,{definitionId:r,configId:a}),{deleted:!1}):{deleted:!1};await this.cleanupDeletedProviderCredentials(e);for(let e of o.deletedBindings)await this.bus.emit(b.binding.deleted,e);for(let e of o.defaultChangedBindings)await this.bus.emit(b.binding.defaultChanged,e);return await this.bus.emit(b.providerConfig.deleted,{id:e}),i&&await this.bus.emit(b.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(b.providerConfig.updated,n),await this.bus.emit(b.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(b.providerConfig.updated,r),{config:r}}async cleanupDeletedProviderCredentials(e){try{await this.bus.requestOptional(l.delete,{configId:e})}catch(t){console.warn(`[AdapterProviderConfigService] Failed to delete credentials for removed provider config "${e}":`,t)}}async resolveProviderConfigName(e,t){let n=await this.getProviderDefinitionOrThrow(e);return this.resolveProviderConfigNameFromDefinition(e,n.name,t)}resolveProviderConfigNameFromDefinition(e,t,n){let r=ce({requestedName:n,providerName:t,definitionId:e});if(r)return r;throw Error(`Unable to derive a canonical provider config name for definition: ${e}`)}async getProviderDefinitionOrThrow(e){let{provider:t}=await this.bus.request(v.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(v.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=le(e,`allowlist`,t.modelVisibility);if(n===`enabled`||n===`visible`)return}return i[0]}},Be=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=w(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)&&!Ce(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(b.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=w(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=E(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(b.binding.deleted,{adapterName:e,providerConfigId:t}),n&&await this.bus.emit(b.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=w(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(!T(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(b.binding.defaultChanged,{adapterName:e,providerConfigId:t})}};function V(e){return e.map(e=>({...e}))}function H(e){if(e instanceof de)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:H(t.cause)}async function U(e,t,n,r={}){let i=r.providerDefinitionCache;if(!i){i=new Map;let t=await e.request(y.contributions.catalog,{});for(let e of t.providers)i.set(e.definition.id,e)}let a=[],o=[];for(let e of t){let t=i.get(e.definitionId);if(!t){o.push(e.definitionId);continue}a.push({definition:t.definition,providerPackageName:t.packageName,...e.protocol!==void 0&&{protocol:e.protocol},configSchema:e.configSchema??r.adapterConfigSchema,...e.auth!==void 0&&{auth:Ve(e.auth,t.definition,r.clientDefinitions??[],n)}})}return o.length>0&&console.warn(`[AdapterContributionProcessor] Adapter "${n}" declares providers [${o.join(`, `)}] but no active extension registers them. These providers will be unavailable until their extensions are loaded.`),a}function Ve(e,t,n,r){let i=a.parse(e),o=new Set(i.scrubEnvVars);W(t.authMethods??[],o);for(let e of n)W(e.authMethods,o);for(let e of i.bindings)f(e,He(e.method,t,n,r));return a.parse({bindings:i.bindings,scrubEnvVars:[...o]})}function He(e,t,n,r){if(e.owner===`provider`){if(e.providerDefinitionId!==t.id)throw Error(`Adapter "${r}" binds provider method "${e.methodId}" to definition "${e.providerDefinitionId}" while serving "${t.id}".`);let n=(t.authMethods??[]).find(({id:t})=>t===e.methodId);if(n===void 0)throw Error(`Adapter "${r}" binds undeclared provider auth method "${t.id}/${e.methodId}".`);return n}let i=n.find(({id:t})=>t===e.clientId);if(i===void 0)throw Error(`Adapter "${r}" binds authentication method "${e.clientId}/${e.methodId}" without declaring that client.`);let a=i.authMethods.find(({id:t})=>t===e.methodId);if(a===void 0)throw Error(`Adapter "${r}" binds undeclared client auth method "${e.clientId}/${e.methodId}".`);return a}function W(e,t){for(let n of e)if(n.mode===`explicit`)for(let e of n.fields)for(let n of e.sourceHints)t.add(n.variable)}async function G(e,t,n,r){return Promise.all(n.map(async n=>{let i=n.definition.id;try{let t=r.get(i);if(t===void 0){let a=await e.requestOptional(fe.getProviderModels,{providerId:i});t=a.handled?a.data.models:n.definition.availableModels??[],r.set(i,t)}return{...n,definition:{...n.definition,availableModels:V(t)}}}catch(e){return H(e)||console.warn(`[AdapterContributionProcessor] Failed to populate available models for provider "${i}" on adapter "${t}". Falling back to declared provider models.`,e),{...n,definition:{...n.definition,availableModels:V(n.definition.availableModels??[])}}}}))}async function Ue(e,t,n,r){let i=await U(t,e.providerRefs,e.name,{...e.providerConfigSchema!==void 0&&{adapterConfigSchema:e.providerConfigSchema},...e.clientDefinitions!==void 0&&{clientDefinitions:e.clientDefinitions},...r!==void 0&&{providerDefinitionCache:r}});return G(t,e.name,i,n)}function We(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 Ge(e,t,n){let r=We(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 Ke=class{configStore;registry;coordinator;machineId;platformDefaults;prepareAuthRuntime;constructor(e){this.configStore=e.configStore,this.registry=e.registry,this.coordinator=e.coordinator,this.machineId=e.machineId,this.platformDefaults=e.platformDefaults,this.prepareAuthRuntime=e.prepareAuthRuntime}register(e){e(this.coordinator.registerContributionProcessor({filter:e=>!!e.adapters?.length||!!e.providers?.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(y.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,u=this.coordinator.getLoadedProviderDefinitionIds();try{for(let t of r){let r=await this.activateAdapterContribution(e,t,n.bus,o,c,l,u);i.push(t.definition.name),a.push(r)}}catch(t){let n=!1;for(let e of i.reverse())try{await this.registry.deregisterAdapter(e)}catch(t){n=!0,console.error(`[AdapterContributionProcessor] Rollback error for adapter "${e}":`,t)}throw n||this.registry.removePackageTracking(e),t}await this.publishActivatedAdapters(a);let d=await this.initializeAdaptersWaitingForProviders(n.bus,o,c,u);await this.publishActivatedAdapters(d)}async processAdapterContribution(e,t,n=i){let r=this.coordinator.getLoadedProviderDefinitionIds(),a=await this.activateAdapterContribution(e,t,n,new Map,void 0,void 0,r);await this.publishActivatedAdapters([a])}async activateAdapterContribution(e,t,n,r,i,a,o){let s=await this.buildLoadedAdapter(e,t,n,r,i,a),c=!1;try{await this.ensureAdapterConfig(s);let t=this.configStore.isAdapterEnabled(s.name);t&&await this.validateEnabledAdapterClientRefs(s,n,a),this.registry.registerAdapter(s,e),c=!0,t&&(this.getMissingProviderDefinitionIds(s,o).length>0?console.info(`[AdapterContributionProcessor] Deferring adapter "${s.name}" initialization until declared providers are active.`):(await this.registry.initializeAdapter(s,this.platformDefaults),console.info(`[AdapterContributionProcessor] Initialized adapter: ${s.name} (${s.packageName})`)))}catch(e){if(c)try{await this.registry.deregisterAdapter(s.name)}catch(e){console.error(`[AdapterContributionProcessor] Rollback error for adapter "${s.name}":`,e)}throw e}return s}async initializeAdaptersWaitingForProviders(e,t,n,r){let i=[];for(let a of this.registry.getLoadedAdapters()){let o;try{if(!this.configStore.isAdapterEnabled(a.name))continue;let s=a;if(this.getMissingProviderDefinitionIds(a,r).length>0){let i=await Ue(a,e,t,n),c=this.registry.updateAdapterProviders(a.name,i);if(!c||this.getMissingProviderDefinitionIds(c,r).length>0)continue;s=c,o=c}if(this.registry.hasAdapterInstance(s)){if(s===a)continue;await this.registry.restartAdapterInstance(s,this.platformDefaults)}else await this.registry.initializeAdapter(s,this.platformDefaults);console.info(`[AdapterContributionProcessor] Initialized adapter: ${s.name} (${s.packageName}) after provider activation`),i.push(s)}catch(e){console.error(`[AdapterContributionProcessor] Deferred initialization failed for adapter "${a.name}".`,e),o&&i.push(o)}}return i}getMissingProviderDefinitionIds(e,t){let n=new Set(e.providers.map(e=>e.definition.id));return e.providerDefinitionIds.filter(e=>!n.has(e)&&t.has(e))}async validateEnabledAdapterClientRefs(e,t,n){if(e.clients===void 0||e.clients.length===0)return;let r=n??(await t.request(y.contributions.catalog,{})).clients;await F(e.name,e.clients,r,t)}async buildLoadedAdapter(e,t,n=i,r=new Map,a,o){let s=t.definition,c=t.manifest,l=s.name,u=o??(await n.request(y.contributions.catalog,{})).clients;await F(l,c.clients,u,n,{checkBinaryVersions:!1});let d=Ae(c.clients,u),f=await G(n,l,await U(n,s.providers,l,{...s.providerConfigSchema!==void 0&&{adapterConfigSchema:s.providerConfigSchema},...d!==void 0&&{clientDefinitions:d},...a!==void 0&&{providerDefinitionCache:a}}),r);return{name:l,displayName:s.displayName??c.displayName,description:s.description,packageName:e,factory:s.createAdapter,options:{adapterId:g(this.machineId,l),...this.prepareAuthRuntime!==void 0&&{prepareAuthRuntime:this.prepareAuthRuntime}},adapterConfigSchema:s.adapterConfigSchema,providerDefinitionIds:s.providers.map(e=>e.definitionId),providerRefs:[...s.providers],providers:f,providerConfigSchema:s.providerConfigSchema,helpLinks:s.helpLinks,instructions:s.instructions,defaultPresetId:s.defaultPresetId,clients:ke(c.clients),...d!==void 0&&{clientDefinitions:d},protocol:Ge(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:P(e.options,e.clients),protocol:e.protocol,providerDefinitionIds:[...e.providerDefinitionIds],enabled:!1})}async onPackageStopped(e){await this.registry.deregisterPackage(e);let t=await this.registry.removeProviderPackage(e,this.platformDefaults);await this.publishActivatedAdapters(t)}publishAdapterRegistered(e){let t=this.configStore.isAdapterEnabled(e.name),n=this.registry.resolveLoadedAdapterId(e);return this.registry.publishAdapterRegistered({adapterName:e.name,displayName:e.displayName,packageName:e.packageName,enabled:t,adapterId:n,providerDefinitionIds:e.providerDefinitionIds})}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)}}};async function qe(e,t,n){let r=new Map,i=new Map;for(let a of[...t].sort((e,t)=>e.name.localeCompare(t.name)))for(let t of a.providers.filter(({definition:e})=>e.id===n))for(let o of t.auth?.bindings??[]){let s=await Ye(e,a,t,o.method,i);ie(o,s);let c=$e(n,o.method),l=Ze(n,o.method,s),u=r.get(c);if(u){if(!Je(u.option,l))throw Error(`Authentication method ${c} has conflicting definitions across compatible adapters "${[...u.adapterNames].join(`, `)}" and "${a.name}".`);u.adapterNames.add(a.name);continue}r.set(c,{option:l,adapterNames:new Set([a.name])})}return[...r.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([,{option:e,adapterNames:t}])=>Qe(e,[...t].sort((e,t)=>e.localeCompare(t))))}function Je(t,n){return e(t,n)}async function Ye(e,t,n,r,i){if(r.owner===`provider`){if(r.providerDefinitionId!==n.definition.id)throw Error(`Adapter "${t.name}" binds provider method "${r.methodId}" to the wrong definition ("${r.providerDefinitionId}" instead of "${n.definition.id}").`);let e=(n.definition.authMethods??[]).find(({id:e})=>e===r.methodId);if(!e)throw Error(`Adapter "${t.name}" binds undeclared provider auth method "${n.definition.id}/${r.methodId}".`);return e}if(!(t.clients??[]).some(({id:e})=>e===r.clientId))throw Error(`Adapter "${t.name}" binds auth method "${r.clientId}/${r.methodId}" without declaring that client.`);let a=i.get(r.clientId);a||(a=Xe(e,r.clientId),i.set(r.clientId,a));let o=(await a).authMethods.find(({id:e})=>e===r.methodId);if(!o)throw Error(`Adapter "${t.name}" binds undeclared client auth method "${r.clientId}/${r.methodId}".`);return o}async function Xe(e,t){let{client:n}=await e.request(_.get,{id:t});if(!n)throw Error(`Authentication binding references missing client definition "${t}".`);return n}function Ze(e,t,n){let r={definitionId:e,method:{...t},label:n.label,...n.description?{description:n.description}:{}};switch(n.mode){case`explicit`:return{...r,mode:`explicit`,fields:n.fields.map(e=>({...e,sourceHints:e.sourceHints.map(e=>({...e}))})),portability:`portable`};case`inferred`:if(t.owner!==`client`)throw Error(`Inferred auth method "${n.id}" must be client-owned.`);return{...r,method:{...t},mode:`inferred`,fields:[],portability:`local-only`};case`none`:return{...r,mode:`none`,fields:[],portability:`portable`}}}function Qe(e,t){switch(e.mode){case`explicit`:return{...e,compatibleAdapterNames:t};case`inferred`:return{...e,compatibleAdapterNames:t};case`none`:return{...e,compatibleAdapterNames:t}}}function $e(e,t){return JSON.stringify(t.owner===`provider`?[e,t.owner,t.providerDefinitionId,t.methodId]:[e,t.owner,t.clientId,t.methodId])}const K=-100;function et(e,t){let n=e.on(v.get,async n=>{let r=(await q(e,t())).get(n.payload.id)??null;n.setResult({provider:r})},{priority:K}),r=e.on(v.list,async n=>{n.setResult({providers:[...(await q(e,t())).values()]})},{priority:K}),i=e.on(v.listByProtocol,async n=>{let r=[...(await q(e,t())).values()].filter(e=>e.endpoints!==void 0&&n.payload.protocol in e.endpoints);n.setResult({providers:r})},{priority:K});return()=>{n(),r(),i()}}async function q(e,t){let n=new Map,r=new Set;for(let e of t){for(let t of e.providerDefinitionIds)r.add(t);for(let t of e.providers)J(n,t.providerPackageName,t.definition)}let i=[...r].filter(e=>!n.has(e));if(i.length>0){let t=await e.request(y.contributions.catalog,{});for(let e of t.providers)i.includes(e.definition.id)&&J(n,e.packageName,e.definition)}return n}function J(e,t,n){let r=u.parse(n);e.has(r.id)||e.set(r.id,{id:r.id,packageName:t,name:r.name,...r.description===void 0?{}:{description:r.description},...r.endpoints===void 0?{}:{endpoints:r.endpoints},...r.defaultModel===void 0?{}:{defaultModel:r.defaultModel},...r.fastModel===void 0?{}:{fastModel:r.fastModel},availableModels:r.availableModels,defaultModelFilterMode:r.defaultModelFilterMode??`show-all`,authMethods:r.authMethods,...r.capabilities===void 0?{}:{capabilities:r.capabilities},enabled:!0,createdAt:0,updatedAt:0})}const Y=-100;function tt(e,t){let n=e.on(_.get,async n=>{let r=(await X(e,t())).get(n.payload.id)??null;n.setResult({client:r})},{priority:Y}),r=e.on(_.list,async n=>{n.setResult({clients:[...(await X(e,t())).values()]})},{priority:Y}),i=e.on(_.listByBinaryName,async n=>{let r=[...(await X(e,t())).values()].filter(e=>e.binary?.name===n.payload.binaryName);n.setResult({clients:r})},{priority:Y});return()=>{n(),r(),i()}}async function X(e,t){let n=new Set(t.flatMap(e=>e.clients?.map(({id:e})=>e)??[]));if(n.size===0)return new Map;let r=await e.request(y.contributions.catalog,{}),i=new Map;for(let e of r.clients){if(!n.has(e.definition.id))continue;let t=c.parse(e.definition);i.set(t.id,nt(e.packageName,t))}return i}function nt(e,t){return{id:t.id,packageName:e,name:t.name,...t.description===void 0?{}:{description:t.description},...t.binary===void 0?{}:{binary:structuredClone(t.binary)},nativeTools:structuredClone(t.nativeTools),defaultApprovalPolicy:t.defaultApprovalPolicy,...t.logSources===void 0?{}:{logSources:structuredClone(t.logSources)},authMethods:structuredClone(t.authMethods),...t.defaultAuth===void 0?{}:{defaultAuth:{...t.defaultAuth}},enabled:!0,createdAt:0,updatedAt:0}}function rt(e,t){let n=e.providerRefs.filter(e=>e.definitionId===t),r=e.providers.filter(e=>e.definition.id===t),i=n[0],a=r[0];return n.length===1&&r.length===1&&i!==void 0&&a!==void 0?{ref:i,provider:a}:null}function it(e,t){return t===void 0||e.clients?.some(e=>e.id===t)===!0}function at(e,t){return e?.bindings.some(e=>ct(e.method,t))===!0}function ot(e,t,n,r){return e.trim().length>0&&t.trim().length>0&&(n===void 0||(r?.trim().length??0)>0)}async function st(e){if(e.snapshot===null)return{status:`error`,code:`provider-config-not-found`};if(e.adapter===void 0)return{status:`error`,code:`adapter-not-loaded`};if(!e.isBound)return{status:`error`,code:`adapter-not-bound`};let t=e.snapshot.context.definitionId,n=rt(e.adapter,t);if(n===null)return{status:`error`,code:`provider-incompatible`};let{provider:r}=n,i=r.auth,a=e.snapshot.context.auth.method;if(!at(i,a))return{status:`error`,code:`auth-binding-missing`};let o=a.owner===`client`?a.clientId:P(e.adapter.options,e.adapter.clients);if(!it(e.adapter,o))return{status:`error`,code:`client-incompatible`};let s=await e.bus.request(y.contributions.catalog,{}),c=o===void 0?[]:s.clients.filter(e=>e.definition.id===o);if(o!==void 0&&c.length!==1)return{status:`error`,code:`client-incompatible`};let l=c[0]?.packageName;if(!ot(e.adapter.packageName,r.providerPackageName,o,l))return{status:`error`,code:`runtime-package-metadata-missing`};let u=e.adapter.providers.flatMap(e=>e.definition.id!==t&&e.auth!==void 0?[e.auth]:[]),d=o!==void 0&&l!==void 0?{packageName:l,clientId:o}:void 0;return{status:`resolved`,runtime:{snapshot:e.snapshot,adapterName:e.adapter.name,...o!==void 0&&{adapterClientId:o},...r.protocol!==void 0&&{providerProtocol:r.protocol},adapterProviderAuth:i,compatibleProviderAuths:u,runtimePackages:{adapter:{packageName:e.adapter.packageName},provider:{packageName:r.providerPackageName,definitionId:t},...d!==void 0&&{client:d}}}}}function ct(e,t){return e.owner!==t.owner||e.methodId!==t.methodId?!1:e.owner===`provider`?t.owner===`provider`&&e.providerDefinitionId===t.providerDefinitionId:t.owner===`client`&&e.clientId===t.clientId}var Z=class extends re{configStore;registry;providerConfigService;bindingService;contributionProcessor;constructor(e){super(e.bus),this.configStore=new Oe({configRepository:e.configRepository,bus:e.bus}),this.registry=new Le({bus:e.bus,machineId:e.machineId}),this.providerConfigService=new ze({configStore:this.configStore,bus:e.bus}),this.bindingService=new Be({configStore:this.configStore,bus:e.bus}),this.contributionProcessor=new Ke({configStore:this.configStore,registry:this.registry,coordinator:e.coordinator,machineId:e.machineId,platformDefaults:e.platformDefaults,...e.prepareAuthRuntime!==void 0&&{prepareAuthRuntime:e.prepareAuthRuntime}})}async onInit(){await this.configStore.loadSnapshot(),this.configStore.registerListeners(e=>this.addCleanup(e)),this.registerBusHandlers(),await this.bus.emit(b.ready,{})}registerBusHandlers(){this.addCleanup(et(this.bus,()=>this.registry.getLoadedAdapters())),this.addCleanup(tt(this.bus,()=>this.registry.getLoadedAdapters())),this.registerReadHandlers(),this.registerMutationHandlers()}registerReadHandlers(){this.registerConfigReadHandlers(),this.registerRuntimeReadHandlers()}registerConfigReadHandlers(){this.registerHandler(b.getAdapterConfig,e=>{e.setResult({config:this.configStore.getAdapterConfig(e.payload.name)})}),this.registerHandler(b.listAdapterConfigs,e=>{e.setResult({configs:this.configStore.listAdapterConfigs()})}),this.registerHandler(b.getProviderConfig,e=>{e.setResult({config:this.configStore.getProviderConfig(e.payload.id)})}),this.registerHandler(b.listProviderConfigs,e=>{e.setResult({configs:this.configStore.listProviderConfigs(e.payload.enabled)})}),this.registerHandler(b.listProviderConfigsByDefinition,e=>{e.setResult({configs:this.configStore.listProviderConfigsByDefinition(e.payload.definitionId)})}),this.registerHandler(b.listBindings,e=>{e.setResult({bindings:this.configStore.listBindings(e.payload.adapterName)})}),this.registerHandler(b.listBindingsByConfig,e=>{e.setResult({bindings:this.configStore.listBindingsByConfig(e.payload.providerConfigId)})}),this.registerHandler(b.getDefaultBinding,e=>{e.setResult({binding:this.configStore.getDefaultBinding(e.payload.adapterName)})}),this.registerHandler(b.findConfigForDefinitionAndAdapter,e=>{e.setResult({config:this.configStore.findConfigForDefinitionAndAdapter(e.payload.definitionId,e.payload.adapterName)})})}registerRuntimeReadHandlers(){this.registerHandler(b.resolveProviderRuntimeSnapshot,async e=>{e.setResult({snapshot:await this.configStore.resolveProviderRuntimeSnapshot(e.payload.providerConfigId)})}),this.registerHandler(b.resolveAdapterRuntimeSnapshot,async e=>{let t=this.registry.getLoadedAdapters().find(t=>t.name===e.payload.adapterName);try{let n=await this.configStore.resolveBoundProviderRuntimeSnapshot(e.payload.adapterName,e.payload.providerConfigId);e.setResult(await st({bus:this.bus,adapter:t,snapshot:n.snapshot,isBound:n.isBound}))}catch(t){if(t instanceof A&&t.code===`provider-config-disabled`){e.setResult({status:`error`,code:`provider-config-disabled`});return}throw t}}),this.registerHandler(b.listAdapters,async e=>{e.setResult({adapters:await this.configStore.buildEffectiveAdapters()})}),this.registerHandler(b.getProviderDefinitionsByAdapter,async e=>{let t=this.registry.getLoadedAdapters().find(t=>t.name===e.payload.adapterName),n=new Map((t?.providers??[]).map(e=>[e.definition.id,e.definition])),r=(t?.providerDefinitionIds??[]).filter(e=>!n.has(e));if(r.length>0){let e=await this.bus.request(y.contributions.catalog,{});for(let t of e.providers)r.includes(t.definition.id)&&n.set(t.definition.id,t.definition)}let i=(t?.providerDefinitionIds??[]).flatMap(e=>{let t=n.get(e);return t===void 0?[]:[u.parse(t)]});e.setResult({definitions:i})}),this.registerHandler(b.listCompatibleAuthOptions,async e=>{e.setResult({options:await qe(this.bus,this.registry.getLoadedAdapters(),e.payload.definitionId)})}),this.registerHandler(b.ensureReady,e=>{e.setResult({ready:!0})})}registerMutationHandlers(){this.registerHandler(b.createProviderConfig,async e=>{e.setResult(await this.providerConfigService.createProviderConfig(e.payload))}),this.registerHandler(b.updateProviderConfig,async e=>{e.setResult(await this.providerConfigService.updateProviderConfig(e.payload.id,e.payload.patch))}),this.registerHandler(b.setProviderConfigAuth,async e=>{e.setResult(await this.providerConfigService.setProviderConfigAuth(e.payload.id,e.payload.auth))}),this.registerHandler(b.deleteProviderConfig,async e=>{e.setResult(await this.providerConfigService.deleteProviderConfig(e.payload.id))}),this.registerHandler(b.setDefaultProviderConfig,async e=>{e.setResult(await this.providerConfigService.setDefaultProviderConfig(e.payload.id))}),this.registerHandler(b.setModelFilterMode,async e=>{e.setResult(await this.providerConfigService.setModelFilterMode(e.payload.id,e.payload.modelFilterMode,e.payload.preferredModel))}),this.registerHandler(b.setAdapterConfig,async e=>{e.setResult(await this.configStore.setAdapterConfig(e.payload.name,e.payload.patch))}),this.registerHandler(b.setAdapterEnabled,async e=>{await this.configStore.setAdapterEnabled(e.payload.name,e.payload.enabled),e.setResult({success:!0})}),this.registerHandler(b.bind,async e=>{e.setResult({binding:await this.bindingService.bind(e.payload.adapterName,e.payload.providerConfigId)})}),this.registerHandler(b.unbind,async e=>{await this.bindingService.unbind(e.payload.adapterName,e.payload.providerConfigId),e.setResult({})}),this.registerHandler(b.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)}},Q=class extends Error{code;source;constructor(e,t,n){super(`Provider config "${t}" cannot be loaded: ${n}`),this.name=`ProviderConfigDiagnosticError`,this.code=e,this.source=t}};const $=`.json`;var lt=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=oe.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`,`reject`);for(let n of t){let t=this.getCanonicalLoadedStem(n.stem,`provider config`,n.filePath);t&&e.set(t,this.parseProviderConfig(n.jsonData,t))}return{configs:e}}async writeProviderConfig(e,t){let r=this.assertCanonicalFileStem(e,`provider config id`),i=n.join(this.providerConfigsDir,`${r}${$}`),a=this.parseProviderConfig(t,r);await this.writeJsonFile(i,a)}async deleteProviderConfig(e){let t=this.assertCanonicalFileStem(e,`provider config id`);try{return await this.unlinkFile(n.join(this.providerConfigsDir,`${t}${$}`)),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async writeAdapterFile(e,t){let r=this.assertCanonicalFileStem(e,`adapter name`),i=oe.parse(t);await this.writeJsonFile(n.join(this.adaptersDir,`${r}${$}`),i)}async deleteAdapterFile(e){let t=this.assertCanonicalFileStem(e,`adapter name`);try{return await this.unlinkFile(n.join(this.adaptersDir,`${t}${$}`)),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async readJsonFiles(e,r,i=`skip`){try{let a=(await t.readdir(e,{withFileTypes:!0})).filter(e=>e.isFile()&&n.extname(e.name)===$).sort((e,t)=>e.name.localeCompare(t.name));return(await Promise.all(a.map(async a=>{let o=n.join(e,a.name);try{let e=await t.readFile(o,`utf-8`);return{filePath:o,stem:n.parse(a.name).name,jsonData:JSON.parse(e)}}catch(e){if(e instanceof SyntaxError){if(i===`reject`)throw new Q(`invalid-provider-config`,ut(a.name),`file does not contain valid JSON.`);return this.warnInvalidFile(r,o),null}if(e instanceof Error&&e.code===`ENOENT`)return this.warnInvalidFile(r,o),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)}parseProviderConfig(e,t){let n=typeof e==`object`&&e?e:void 0,r=n?.$schema,i=[`credentials`,`isSentinel`].filter(e=>Object.hasOwn(n??{},e));if(r===`makaio/provider-config/v1`||i.length>0)throw new Q(`legacy-provider-config`,t,`${[...r===`makaio/provider-config/v1`?[`schema v1`]:[],...i.length>0?[`legacy fields ${i.join(`, `)}`]:[]].join(` and `)} use retired authentication semantics. Recreate this config with an explicit normalized authentication method.`);if(r!==m)throw new Q(`unsupported-provider-config-version`,t,`expected $schema "${m}". Recreate the config with the current schema.`);let a=se.safeParse(e);if(!a.success)throw new Q(`invalid-provider-config`,t,a.error.issues.map(e=>`${e.path.length>0?e.path.join(`.`):`<root>`}: ${e.message}`).join(`; `));return a.data}getCanonicalLoadedStem(e,t,n){try{return this.assertCanonicalFileStem(e,`${t} file stem`)}catch{return this.warnInvalidFile(t,n),null}}async writeJsonFile(e,i){let a=n.dirname(e),o=n.join(a,`.${n.basename(e)}.${r()}.tmp`);await t.mkdir(a,{recursive:!0});try{await t.writeFile(o,`${JSON.stringify(i,null,2)}\n`,{encoding:`utf-8`,mode:384}),await this.replaceFile(o,e)}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 n=`${t}.${r()}.bak`,i=!1;try{await this.renameFile(t,n),i=!0}catch(e){if(e.code!==`ENOENT`)throw e}try{await this.renameFile(e,t)}catch(e){throw i&&await this.renameFile(n,t).catch(()=>void 0),e}i&&await this.removeFileIfPresent(n)}async renameFile(e,n){await t.rename(e,n)}async unlinkFile(e){await t.unlink(e)}async removeFileIfPresent(e){try{await t.unlink(e)}catch(t){t.code!==`ENOENT`&&console.warn(`[FileAdapterConfigRepository] Failed to remove temp file: %s`,e,t)}}assertCanonicalFileStem(e,t){let r=e.trim(),i=n.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 ${t}: ${e}`);return r}};function ut(e){return n.basename(e).replace(/[^A-Za-z0-9._-]/g,`_`)||`provider-config.json`}function dt(e){return{filter:e=>!!e.adapters?.length||!!e.providers?.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 ft=ee(`adapter-subsystem`);function pt(e){return{name:ft.name,displayName:`Adapter Subsystem`,version:`0.1.0`,provides:[`adapters`],critical:!0,create:t=>new Z({bus:t.bus,configRepository:e.configRepository,coordinator:e.coordinator,machineId:t.machineId,platformDefaults:e.platformDefaults,...e.prepareAuthRuntime!==void 0&&{prepareAuthRuntime:e.prepareAuthRuntime}})}}export{Z as AdapterSubsystemService,ft as AdapterSubsystemToken,lt as FileAdapterConfigRepository,O as ProviderConfigAuthValidationError,Q as ProviderConfigDiagnosticError,A as ProviderRuntimeContextError,D as assertProviderConfigAuthDefinitionsEnabled,dt as createAdapterSubsystemContributionProcessor,pt as createAdapterSubsystemPackage,Ie as ensureAdapterConfigs,Me as extractAdapterIdFromPackageName,B as initializeEnabledAdapters,R as shutdownAdapterInstances,I as toAvailableAdapter,k as validateProviderConfigAuth};
|
|
1
|
+
import{isDeepStrictEqual as e}from"node:util";import*as t from"node:fs/promises";import*as n from"node:path";import{randomUUID as r}from"node:crypto";import{MakaioBus as i}from"@makaio/framework/bus";import{AdapterProviderAuthSchema as a,AdapterSubjects as o,CapabilitySubjects as s,ClientDefinitionSchema as c,CredentialSubjects as l,ProviderDefinitionSchema as u,ResolvedProviderContextSchema as d,assertAdapterAuthBindingMatchesMethod as f,extensionToken as ee,isUniversalRange as te,versionSatisfies as p}from"@makaio/framework/contracts";import{BaseService as ne}from"@makaio/framework/service-base";import{ProviderConfigAuthSchema as m,assertAdapterAuthBindingMatchesMethod as re}from"@makaio/framework/contracts/auth";import{ADAPTER_FILE_SCHEMA_VERSION as ie,AdapterFileSchema as h,PROVIDER_CONFIG_SCHEMA_VERSION as g,ProviderConfigFileSchema as ae,resolveCanonicalProviderConfigName as oe,slugifyProviderConfigName as _}from"@makaio/framework/contracts/config";import{resolveModelVisibility as se}from"@makaio/framework/contracts/provider";import{buildDeterministicAdapterId as v}from"@makaio/framework/services/adapter-runtime";import{ClientSubjects as ce}from"@makaio/framework/contracts/client";import{ClientStorageSubjects as y,ProviderStorageSubjects as b}from"@makaio/framework/services/settings/storage";import{ExtensionSubjects as x}from"@makaio/framework/kernel";import{AdapterSubsystemSubjects as S}from"@makaio/framework/services/adapter-subsystem";import{ModelRegistryProviderNotFoundError as le,ModelRegistrySubjects as ue}from"@makaio/framework/services/model-registry";function C(e){return e?{...e}:void 0}function w(e){return e?{...e}:void 0}function de(e){return e?structuredClone(e):void 0}function fe(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 pe(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 me(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 he(e,t,n){let r=fe(t,n);if(r.length===0)return;let i=[];try{for(let t of r)i.push(t),await pe(e,t)}catch(t){try{await ge(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 ge(e,t){let n=[];for(let r of[...t].reverse())try{await me(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 T(e,t){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,auth:_e(t),...t.managedBy?{managedBy:{...t.managedBy}}:{}}}function _e(e){switch(e.auth.mode){case`explicit`:return{mode:`explicit`,method:{...e.auth.method},hasCredentials:!0};case`inferred`:return{mode:`inferred`,method:{...e.auth.method},...e.auth.account?{account:{...e.auth.account}}:{},hasCredentials:!1};case`none`:return{mode:`none`,method:{...e.auth.method},hasCredentials:!1}}}function E(e,t){return(t??[]).map(t=>({adapterName:e,providerConfigId:t.providerConfigId,isDefault:t.isDefault??!1}))}function ve(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 ye(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 be(e){let t=new Map,n=new Map,r=new Map;for(let[i,a]of e.providerConfigs){let e=T(i,a);t.set(i,e),n.set(_(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=E(n,r.bindings),c=ve(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 D(e,t){let n=e.get(t);return n!==void 0&&(n.enabled??!0)}function xe(e,t){return e.some(e=>D(t,e.providerConfigId))}function O(e,t){let n=e.find(e=>D(t,e.providerConfigId));return{bindings:e.map(e=>({...e,isDefault:e.providerConfigId===n?.providerConfigId})),...n?{promoted:{...n,isDefault:!0}}:{}}}function Se(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})=>D(n,e))?.id??null;for(let{id:e,config:t}of r)n.set(e,{...t,isDefault:i!==null&&e===i});return i}function k(e){if(!e.provider.enabled)throw new A(`provider-definition-disabled`,`Provider definition is disabled for auth selection: ${e.provider.id}`);if(e.client!==void 0&&!e.client.enabled)throw new A(`client-definition-disabled`,`Client definition is disabled for auth selection: ${e.client.id}`)}var A=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ProviderConfigAuthValidationError`}};async function j(e,t,n,r){let i=r??(await e.request(b.get,{id:t})).provider;if(!i||i.id!==t)throw new A(`provider-definition-not-found`,`Provider definition not found for auth selection: ${t}`);let a,o;if(n.method.owner===`provider`){if(n.method.providerDefinitionId!==t)throw new A(`auth-method-not-found`,`Provider auth method "${n.method.methodId}" does not belong to definition "${t}".`);a=i.authMethods.find(({id:e})=>e===n.method.methodId)}else{if({client:o}=await e.request(y.get,{id:n.method.clientId}),!o)throw new A(`client-definition-not-found`,`Client definition not found for auth selection: ${n.method.clientId}`);a=o.authMethods.find(({id:e})=>e===n.method.methodId)}if(!a){let e=n.method.owner===`provider`?n.method.providerDefinitionId:n.method.clientId;throw new A(`auth-method-not-found`,`Authentication method "${n.method.methodId}" is not declared by ${n.method.owner} "${e}".`)}if(a.mode!==n.mode)throw new A(`auth-mode-mismatch`,`Authentication method "${a.id}" declares mode "${a.mode}", not "${n.mode}".`);return a.mode===`explicit`&&n.mode===`explicit`&&Ce(a,n),{method:a,provider:i,...o?{client:o}:{}}}function Ce(e,t){let n=new Set(e.fields.map(({id:e})=>e)),r=e.fields.filter(({id:e,required:n})=>n&&t.credentialRefs[e]===void 0).map(({id:e})=>e),i=Object.keys(t.credentialRefs).filter(e=>!n.has(e));if(r.length===0&&i.length===0)return;let a=[...r.length>0?[`missing required fields [${r.join(`, `)}]`]:[],...i.length>0?[`unexpected fields [${i.join(`, `)}]`]:[]];throw new A(`auth-credential-fields-mismatch`,`Authentication method "${e.id}" has ${a.join(` and `)}.`)}var M=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ProviderRuntimeContextError`}};async function N(e,t,n){if(n.enabled===!1)throw new M(`provider-config-disabled`,`ProviderConfig '${t}' is disabled and cannot be used for adapter startup.`);let r=await j(e,n.definitionId,n.auth);k(r);let i=we(n.auth,r.method),a={...r.provider.endpoints??{},...n.endpointOverrides??{}};return{context:d.parse({state:`resolved`,providerConfigId:t,definitionId:r.provider.id,...Object.keys(a).length>0?{endpointOverrides:a}:{},auth:i,...r.provider.capabilities?{capabilities:r.provider.capabilities}:{}}),definition:structuredClone(r.provider)}}function we(e,t){switch(e.mode){case`explicit`:if(t.mode!==`explicit`)throw P(e.mode,t.mode);return{mode:e.mode,method:{...e.method},definition:structuredClone(t),credentialRefs:{...e.credentialRefs}};case`inferred`:if(t.mode!==`inferred`)throw P(e.mode,t.mode);return{mode:e.mode,method:{...e.method},definition:{...t},...e.account?{account:{...e.account}}:{}};case`none`:if(t.mode!==`none`)throw P(e.mode,t.mode);return{mode:e.mode,method:{...e.method},definition:{...t}}}}function P(e,t){return new A(`auth-mode-mismatch`,`Validated authentication mode changed during context assembly: selected "${e}", declared "${t}".`)}var Te=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}},Ee=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 Te;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(s.register,t,{filter:{capabilityId:`log-import`}})),e(this.bus.on(s.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 he(this.configRepository,this.snapshot,e),this.replaceSnapshot(e)}applyDerivedState(){let e=be(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}getProviderConfigIdsByDefinition(e){return[...this.providerConfigIdsByDefinition.get(e)??[]]}assertProviderConfigNameUnique(e,t){let n=_(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:ie,...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:de(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??ye(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(s.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 resolveProviderRuntimeSnapshot(e){let t=this.snapshot.providerConfigs.get(e);if(!t)return null;let{context:n,definition:r}=await N(this.bus,e,t);return{config:T(e,t),context:n,definition:r}}async resolveBoundProviderRuntimeSnapshot(e,t){let n=this.snapshot,r=n.providerConfigs.get(t),i=n.adapters.get(e),a=r!==void 0&&E(e,i?.bindings).some(e=>e.providerConfigId===t);if(!r)return{snapshot:null,isBound:!1};let{context:o,definition:s}=await N(this.bus,t,r);return{isBound:a,snapshot:{config:T(t,r),context:o,definition:s}}}removeBindingsForConfig(e,t,n){let r=new Map,i=[],a=[];for(let[o,s]of t){let t=E(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=O(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 Se(e,t,n)}};const F=process.env.MAKAIO_SKIP_CLIENT_VERSION_CHECK===`1`;function De(e){if(!(e===void 0||e.length===0))return e.map(e=>({...e}))}function Oe(e,t){if(e===void 0||e.length===0)return;let n=new Map(t.map(e=>[e.definition.id,e.definition]));return e.map(e=>{let t=n.get(e.id);if(t===void 0)throw Error(`Adapter client definition "${e.id}" is missing from the active contribution catalog.`);return t})}function I(e,t){return e.clientId!==void 0&&t?.some(t=>t.id===e.clientId)?e.clientId:t?.[0]?.id}async function L(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}"`);ke(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(te(t.binaryVersion))return;let n=await r.requestOptional(ce.resolveBinary,{clientId:t.id});if(!n.handled){if(F){console.warn(`[SKIP_VERSION_CHECK] Adapter "${e}" client "${t.id}" declares binaryVersion ${t.binaryVersion}, but no client.resolveBinary handler is registered — check bypassed`);return}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){if(F){console.warn(`[SKIP_VERSION_CHECK] Adapter "${e}" client "${t.id}" binary did not report a version; requires ${t.binaryVersion} — check bypassed`);return}throw Error(`Adapter "${e}" client "${t.id}" binary did not report a version; requires ${t.binaryVersion}`)}if(!p(i,t.binaryVersion)){let n=`Adapter "${e}" client "${t.id}" binary version ${i}`;if(F){console.warn(`[SKIP_VERSION_CHECK] ${n} does not satisfy ${t.binaryVersion} — check bypassed`);return}throw Error(`${n} does not satisfy ${t.binaryVersion}`)}}))}function ke(e,t,n){if(!p(e,t))throw Error(`${n} does not satisfy ${t}`)}function Ae(e){let t=e.split(`/`).pop()?.replace(/^ai-adapters-/,``)?.trim();return t&&t.length>0?t:e}function R(e){let t=I(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.providerDefinitionIds]}}async function z(e,t,n=5e3){let r=Ne(t);if(!r)return;let i;try{await Promise.race([Promise.resolve().then(r),new Promise((t,r)=>{i=setTimeout(()=>{r(Error(`Timed out closing adapter ${e} after ${n}ms`))},n)})])}finally{i&&clearTimeout(i)}}async function B(e){for(let[t,n]of e)try{await z(t,n)}catch(e){console.error(`[adapter-runtime] Error shutting down adapter ${t}:`,e)}e.clear()}async function je(e,t,n){try{await z(e,t)}finally{n.delete(e)}}async function Me(e,t){let{config:n}=await e.request(S.getAdapterConfig,{name:t});return n?.enabled??!1}function V(e,t){return e.options.adapterId??v(t,e.name)}function Ne(e){let t=e;if(typeof t.shutdown==`function`)return t.shutdown.bind(e);if(typeof t.closeAsync==`function`)return t.closeAsync.bind(e);if(typeof t.close==`function`)return t.close.bind(e)}async function H(e,t,n,r,i){let a=[];for(let s of n)try{if(!await Me(e,s.name)){console.info(`Skipping disabled adapter: ${s.name}`);continue}let n=V(s,t),a=I(s.options,s.clients),c=await s.factory({...s.options,adapterId:n,platformDefaults:i,definitionProviders:s.providers,clientId:a,globalBus:e});if(c.adapterId!==n){let e=Error(`Adapter '${s.name}' initialized with mismatched adapterId (expected '${n}', got '${c.adapterId}')`);try{await z(n,c)}catch(e){console.error(`[adapter-runtime] Error rolling back adapter ${s.name}:`,e)}throw e}r.set(n,c);let l=c;try{await e.emit(o.initialized,{adapterId:n,adapterName:s.name,capabilities:[...l.capabilities??[]],...l.nativeTools===void 0?{}:{nativeTools:[...l.nativeTools]}})}catch(e){try{await je(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){a.push({adapterName:s.name,error:e})}if(a.length>0){let e=a.map(({adapterName:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`).join(`; `);throw Error(`Failed to initialize enabled adapters: ${e}`)}}async function Pe(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:I(e.options,e.clients),protocol:e.protocol,providerDefinitionIds:[...e.providerDefinitionIds],enabled:!1}})))}var Fe=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}hasAdapterInstance(e){return this.adapterInstances.has(this.resolveLoadedAdapterId(e))}resolveLoadedAdapterId(e){return V(e,this.machineId)}getSettingsAvailableAdapters(){return[...this.loadedAdapters.values()].map(R)}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])}updateAdapterProviders(e,t){let n=this.loadedAdapters.get(e);if(!n)return;let r={...n,providers:t};return this.loadedAdapters.set(e,r),r}async removeProviderPackage(e,t){let n=[];for(let r of this.loadedAdapters.values()){let i=r.providers.filter(t=>t.providerPackageName!==e);if(i.length===r.providers.length)continue;let a={...r,providers:i};if(this.loadedAdapters.set(r.name,a),n.push(a),this.hasAdapterInstance(a))try{await this.restartAdapterInstance(a,t)}catch(t){console.error(`[AdapterRuntimeRegistry] Error restarting adapter "${a.name}" after provider package "${e}" stopped:`,t)}}return n}async deregisterAdapter(e){let t=this.loadedAdapters.get(e);if(!t)return;let n=this.resolveLoadedAdapterId(t),r=this.adapterInstances.get(n);r&&(await z(n,r),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)return;let n=!1;for(let e of t)try{await this.deregisterAdapter(e)}catch(t){n=!0,console.error(`[AdapterRuntimeRegistry] Error shutting down adapter "${e}":`,t)}n||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 H(this.bus,this.machineId,[e],this.adapterInstances,t)}async restartAdapterInstance(e,t){let n=this.resolveLoadedAdapterId(e),r=this.adapterInstances.get(n);if(r){try{await z(n,r)}catch(t){throw console.error(`[AdapterRuntimeRegistry] Error shutting down adapter "${e.name}" before restart:`,t),t}this.adapterInstances.delete(n)}await this.initializeAdapter(e,t)}async shutdownAll(){await B(this.adapterInstances),this.loadedAdapters.clear(),this.packageAdapters.clear()}};function Ie(e,t,n,r){let i=n.isDefault??!1;return r?i?!0:![...e.entries()].some(([e,r])=>e!==t&&r.definitionId===n.definitionId&&(r.enabled??!0)&&(r.isDefault??!1)):!1}var Le=class{configStore;bus;constructor(e){this.configStore=e.configStore,this.bus=e.bus}async createProviderConfig(e){let t=await this.getProviderDefinitionOrThrow(e.definitionId),n=m.parse(e.auth),r=e.enabled??!0,i=await j(this.bus,e.definitionId,n,t);r&&k(i);let a=this.resolveProviderConfigNameFromDefinition(e.definitionId,t.name,e.name),o=_(a),s=C(e.endpointOverrides),c=w(e.modelVisibility),l=await this.configStore.commitSnapshotMutation(t=>{if(this.configStore.assertProviderConfigNameUnique(a),t.providerConfigs.has(o))throw Error(`Provider config already exists: ${o}`);t.providerConfigs.set(o,{$schema:g,definitionId:e.definitionId,name:a,auth:structuredClone(n),...e.managedBy?{managedBy:{...e.managedBy}}:{},endpointOverrides:s,modelVisibility:c,modelFilterMode:e.modelFilterMode??`show-all`,isDefault:r&&![...t.providerConfigs.values()].some(t=>t.definitionId===e.definitionId&&(t.enabled??!0)&&(t.isDefault??!1)),enabled:r})},()=>this.configStore.requireProviderConfig(o,`creation`));return await this.bus.emit(S.providerConfig.created,l),{config:l}}async updateProviderConfig(e,t){let n,r=await this.configStore.commitSnapshotMutation(async r=>{n=await this.applyProviderConfigPatch(r,e,t)},()=>this.configStore.requireProviderConfig(e,`update`));return await this.bus.emit(S.providerConfig.updated,r),n&&await this.bus.emit(S.providerConfig.defaultChanged,n),{config:r}}async applyProviderConfigPatch(e,t,n){let r=e.providerConfigs.get(t);if(!r)throw Error(`Provider config not found: ${t}`);let i=n.name??r.name??r.definitionId;n.name!==void 0&&this.configStore.assertProviderConfigNameUnique(i,t);let a=n.enabled??r.enabled??!0;a&&!(r.enabled??!0)&&k(await j(this.bus,r.definitionId,r.auth));let o=Ie(e.providerConfigs,t,r,a);return e.providerConfigs.set(t,{...r,name:i,endpointOverrides:n.endpointOverrides===null?void 0:n.endpointOverrides===void 0?r.endpointOverrides:C(n.endpointOverrides),modelVisibility:n.modelVisibility===void 0?r.modelVisibility:w(n.modelVisibility),enabled:a,isDefault:o}),(r.isDefault??!1)&&!o?{definitionId:r.definitionId,configId:this.configStore.promoteProviderConfigDefault(r.definitionId,t,e.providerConfigs)}:!(r.isDefault??!1)&&o?{definitionId:r.definitionId,configId:t}:void 0}async setProviderConfigAuth(e,t){let n=m.parse(t),r=await this.configStore.commitSnapshotMutation(async t=>{let r=t.providerConfigs.get(e);if(!r)throw Error(`Provider config not found: ${e}`);let i=await j(this.bus,r.definitionId,n);(r.enabled??!0)&&k(i),t.providerConfigs.set(e,{...r,auth:structuredClone(n)})},()=>this.configStore.requireProviderConfig(e,`auth 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.managedBy){(c.enabled??!0)&&(i=c.isDefault??!1,r=c.definitionId,s.providerConfigs.set(e,{...c,enabled:!1,isDefault:!1}),a=i?this.configStore.promoteProviderConfigDefault(c.definitionId,e,s.providerConfigs):null,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,`managed config disable`):null);if(!t)return n?(await this.bus.emit(S.providerConfig.updated,s),i&&await this.bus.emit(S.providerConfig.defaultChanged,{definitionId:r,configId:a}),{deleted:!1}):{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}}async cleanupDeletedProviderCredentials(e){try{await this.bus.requestOptional(l.delete,{configId:e})}catch(t){console.warn(`[AdapterProviderConfigService] Failed to delete credentials for removed provider config "${e}":`,t)}}async resolveProviderConfigName(e,t){let n=await this.getProviderDefinitionOrThrow(e);return this.resolveProviderConfigNameFromDefinition(e,n.name,t)}resolveProviderConfigNameFromDefinition(e,t,n){let r=oe({requestedName:n,providerName:t,definitionId:e});if(r)return r;throw Error(`Unable to derive a canonical provider config name for definition: ${e}`)}async getProviderDefinitionOrThrow(e){let{provider:t}=await this.bus.request(b.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(b.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=se(e,`allowlist`,t.modelVisibility);if(n===`enabled`||n===`visible`)return}return i[0]}},Re=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=E(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)&&!xe(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=E(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=O(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=E(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(!D(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 U(e){return e.map(e=>({...e}))}function W(e){if(e instanceof le)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:W(t.cause)}async function G(e,t,n,r={}){let i=r.providerDefinitionCache;if(!i){i=new Map;let t=await e.request(x.contributions.catalog,{});for(let e of t.providers)i.set(e.definition.id,e)}let a=[],o=[];for(let e of t){let t=i.get(e.definitionId);if(!t){o.push(e.definitionId);continue}a.push({definition:t.definition,providerPackageName:t.packageName,...e.protocol!==void 0&&{protocol:e.protocol},configSchema:e.configSchema??r.adapterConfigSchema,...e.auth!==void 0&&{auth:ze(e.auth,t.definition,r.clientDefinitions??[],n)}})}return o.length>0&&console.warn(`[AdapterContributionProcessor] Adapter "${n}" declares providers [${o.join(`, `)}] but no active extension registers them. These providers will be unavailable until their extensions are loaded.`),a}function ze(e,t,n,r){let i=a.parse(e),o=new Set(i.scrubEnvVars);K(t.authMethods??[],o);for(let e of n)K(e.authMethods,o);for(let e of i.bindings)f(e,Be(e.method,t,n,r));return a.parse({bindings:i.bindings,scrubEnvVars:[...o]})}function Be(e,t,n,r){if(e.owner===`provider`){if(e.providerDefinitionId!==t.id)throw Error(`Adapter "${r}" binds provider method "${e.methodId}" to definition "${e.providerDefinitionId}" while serving "${t.id}".`);let n=(t.authMethods??[]).find(({id:t})=>t===e.methodId);if(n===void 0)throw Error(`Adapter "${r}" binds undeclared provider auth method "${t.id}/${e.methodId}".`);return n}let i=n.find(({id:t})=>t===e.clientId);if(i===void 0)throw Error(`Adapter "${r}" binds authentication method "${e.clientId}/${e.methodId}" without declaring that client.`);let a=i.authMethods.find(({id:t})=>t===e.methodId);if(a===void 0)throw Error(`Adapter "${r}" binds undeclared client auth method "${e.clientId}/${e.methodId}".`);return a}function K(e,t){for(let n of e)if(n.mode===`explicit`)for(let e of n.fields)for(let n of e.sourceHints)t.add(n.variable)}async function q(e,t,n,r){return Promise.all(n.map(async n=>{let i=n.definition.id;try{let t=r.get(i);if(t===void 0){let a=await e.requestOptional(ue.getProviderModels,{providerId:i});t=a.handled?a.data.models:n.definition.availableModels??[],r.set(i,t)}return{...n,definition:{...n.definition,availableModels:U(t)}}}catch(e){return W(e)||console.warn(`[AdapterContributionProcessor] Failed to populate available models for provider "${i}" on adapter "${t}". Falling back to declared provider models.`,e),{...n,definition:{...n.definition,availableModels:U(n.definition.availableModels??[])}}}}))}async function Ve(e,t,n,r){let i=await G(t,e.providerRefs,e.name,{...e.providerConfigSchema!==void 0&&{adapterConfigSchema:e.providerConfigSchema},...e.clientDefinitions!==void 0&&{clientDefinitions:e.clientDefinitions},...r!==void 0&&{providerDefinitionCache:r}});return q(t,e.name,i,n)}function He(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 Ue(e,t,n){let r=He(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 We=class{configStore;registry;coordinator;machineId;platformDefaults;prepareAuthRuntime;constructor(e){this.configStore=e.configStore,this.registry=e.registry,this.coordinator=e.coordinator,this.machineId=e.machineId,this.platformDefaults=e.platformDefaults,this.prepareAuthRuntime=e.prepareAuthRuntime}register(e){e(this.coordinator.registerContributionProcessor({filter:e=>!!e.adapters?.length||!!e.providers?.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(x.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,u=this.coordinator.getLoadedProviderDefinitionIds();try{for(let t of r){let r=await this.activateAdapterContribution(e,t,n.bus,o,c,l,u);i.push(t.definition.name),a.push(r)}}catch(t){let n=!1;for(let e of i.reverse())try{await this.registry.deregisterAdapter(e)}catch(t){n=!0,console.error(`[AdapterContributionProcessor] Rollback error for adapter "${e}":`,t)}throw n||this.registry.removePackageTracking(e),t}await this.publishActivatedAdapters(a);let d=await this.initializeAdaptersWaitingForProviders(n.bus,o,c,u);await this.publishActivatedAdapters(d)}async processAdapterContribution(e,t,n=i){let r=this.coordinator.getLoadedProviderDefinitionIds(),a=await this.activateAdapterContribution(e,t,n,new Map,void 0,void 0,r);await this.publishActivatedAdapters([a])}async activateAdapterContribution(e,t,n,r,i,a,o){let s=await this.buildLoadedAdapter(e,t,n,r,i,a),c=!1;try{await this.ensureAdapterConfig(s);let t=this.configStore.isAdapterEnabled(s.name);t&&await this.validateEnabledAdapterClientRefs(s,n,a),this.registry.registerAdapter(s,e),c=!0,t&&(this.getMissingProviderDefinitionIds(s,o).length>0?console.info(`[AdapterContributionProcessor] Deferring adapter "${s.name}" initialization until declared providers are active.`):(await this.registry.initializeAdapter(s,this.platformDefaults),console.info(`[AdapterContributionProcessor] Initialized adapter: ${s.name} (${s.packageName})`)))}catch(e){if(c)try{await this.registry.deregisterAdapter(s.name)}catch(e){console.error(`[AdapterContributionProcessor] Rollback error for adapter "${s.name}":`,e)}throw e}return s}async initializeAdaptersWaitingForProviders(e,t,n,r){let i=[];for(let a of this.registry.getLoadedAdapters()){let o;try{if(!this.configStore.isAdapterEnabled(a.name))continue;let s=a;if(this.getMissingProviderDefinitionIds(a,r).length>0){let i=await Ve(a,e,t,n),c=this.registry.updateAdapterProviders(a.name,i);if(!c||this.getMissingProviderDefinitionIds(c,r).length>0)continue;s=c,o=c}if(this.registry.hasAdapterInstance(s)){if(s===a)continue;await this.registry.restartAdapterInstance(s,this.platformDefaults)}else await this.registry.initializeAdapter(s,this.platformDefaults);console.info(`[AdapterContributionProcessor] Initialized adapter: ${s.name} (${s.packageName}) after provider activation`),i.push(s)}catch(e){console.error(`[AdapterContributionProcessor] Deferred initialization failed for adapter "${a.name}".`,e),o&&i.push(o)}}return i}getMissingProviderDefinitionIds(e,t){let n=new Set(e.providers.map(e=>e.definition.id));return e.providerDefinitionIds.filter(e=>!n.has(e)&&t.has(e))}async validateEnabledAdapterClientRefs(e,t,n){if(e.clients===void 0||e.clients.length===0)return;let r=n??(await t.request(x.contributions.catalog,{})).clients;await L(e.name,e.clients,r,t)}async buildLoadedAdapter(e,t,n=i,r=new Map,a,o){let s=t.definition,c=t.manifest,l=s.name,u=o??(await n.request(x.contributions.catalog,{})).clients;await L(l,c.clients,u,n,{checkBinaryVersions:!1});let d=Oe(c.clients,u),f=await q(n,l,await G(n,s.providers,l,{...s.providerConfigSchema!==void 0&&{adapterConfigSchema:s.providerConfigSchema},...d!==void 0&&{clientDefinitions:d},...a!==void 0&&{providerDefinitionCache:a}}),r);return{name:l,displayName:s.displayName??c.displayName,description:s.description,packageName:e,factory:s.createAdapter,options:{adapterId:v(this.machineId,l),...this.prepareAuthRuntime!==void 0&&{prepareAuthRuntime:this.prepareAuthRuntime}},adapterConfigSchema:s.adapterConfigSchema,providerDefinitionIds:s.providers.map(e=>e.definitionId),providerRefs:[...s.providers],providers:f,providerConfigSchema:s.providerConfigSchema,helpLinks:s.helpLinks,instructions:s.instructions,defaultPresetId:s.defaultPresetId,clients:De(c.clients),...d!==void 0&&{clientDefinitions:d},protocol:Ue(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:I(e.options,e.clients),protocol:e.protocol,providerDefinitionIds:[...e.providerDefinitionIds],enabled:!1})}async onPackageStopped(e){await this.registry.deregisterPackage(e);let t=await this.registry.removeProviderPackage(e,this.platformDefaults);await this.publishActivatedAdapters(t)}publishAdapterRegistered(e){let t=this.configStore.isAdapterEnabled(e.name),n=this.registry.resolveLoadedAdapterId(e);return this.registry.publishAdapterRegistered({adapterName:e.name,displayName:e.displayName,packageName:e.packageName,enabled:t,adapterId:n,providerDefinitionIds:e.providerDefinitionIds})}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)}}};async function Ge(e,t,n){let r=new Map,i=new Map;for(let a of[...t].sort((e,t)=>e.name.localeCompare(t.name)))for(let t of a.providers.filter(({definition:e})=>e.id===n))for(let o of t.auth?.bindings??[]){let s=await qe(e,a,t,o.method,i);re(o,s);let c=Ze(n,o.method),l=Ye(n,o.method,s),u=r.get(c);if(u){if(!Ke(u.option,l))throw Error(`Authentication method ${c} has conflicting definitions across compatible adapters "${[...u.adapterNames].join(`, `)}" and "${a.name}".`);u.adapterNames.add(a.name);continue}r.set(c,{option:l,adapterNames:new Set([a.name])})}return[...r.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([,{option:e,adapterNames:t}])=>Xe(e,[...t].sort((e,t)=>e.localeCompare(t))))}function Ke(t,n){return e(t,n)}async function qe(e,t,n,r,i){if(r.owner===`provider`){if(r.providerDefinitionId!==n.definition.id)throw Error(`Adapter "${t.name}" binds provider method "${r.methodId}" to the wrong definition ("${r.providerDefinitionId}" instead of "${n.definition.id}").`);let e=(n.definition.authMethods??[]).find(({id:e})=>e===r.methodId);if(!e)throw Error(`Adapter "${t.name}" binds undeclared provider auth method "${n.definition.id}/${r.methodId}".`);return e}if(!(t.clients??[]).some(({id:e})=>e===r.clientId))throw Error(`Adapter "${t.name}" binds auth method "${r.clientId}/${r.methodId}" without declaring that client.`);let a=i.get(r.clientId);a||(a=Je(e,r.clientId),i.set(r.clientId,a));let o=(await a).authMethods.find(({id:e})=>e===r.methodId);if(!o)throw Error(`Adapter "${t.name}" binds undeclared client auth method "${r.clientId}/${r.methodId}".`);return o}async function Je(e,t){let{client:n}=await e.request(y.get,{id:t});if(!n)throw Error(`Authentication binding references missing client definition "${t}".`);return n}function Ye(e,t,n){let r={definitionId:e,method:{...t},label:n.label,...n.description?{description:n.description}:{}};switch(n.mode){case`explicit`:return{...r,mode:`explicit`,fields:n.fields.map(e=>({...e,sourceHints:e.sourceHints.map(e=>({...e}))})),portability:`portable`};case`inferred`:if(t.owner!==`client`)throw Error(`Inferred auth method "${n.id}" must be client-owned.`);return{...r,method:{...t},mode:`inferred`,fields:[],portability:`local-only`};case`none`:return{...r,mode:`none`,fields:[],portability:`portable`}}}function Xe(e,t){switch(e.mode){case`explicit`:return{...e,compatibleAdapterNames:t};case`inferred`:return{...e,compatibleAdapterNames:t};case`none`:return{...e,compatibleAdapterNames:t}}}function Ze(e,t){return JSON.stringify(t.owner===`provider`?[e,t.owner,t.providerDefinitionId,t.methodId]:[e,t.owner,t.clientId,t.methodId])}function Qe(e,t,n=-100){let r=e.on(b.get,async n=>{let r=(await J(e,t())).get(n.payload.id)??null;n.setResult({provider:r})},{priority:n}),i=e.on(b.list,async n=>{n.setResult({providers:[...(await J(e,t())).values()]})},{priority:n}),a=e.on(b.listByProtocol,async n=>{let r=[...(await J(e,t())).values()].filter(e=>e.endpoints!==void 0&&n.payload.protocol in e.endpoints);n.setResult({providers:r})},{priority:n});return()=>{r(),i(),a()}}async function J(e,t){let n=new Map,r=new Set;for(let e of t){for(let t of e.providerDefinitionIds)r.add(t);for(let t of e.providers)Y(n,t.providerPackageName,t.definition)}let i=[...r].filter(e=>!n.has(e));if(i.length>0){let t=await e.request(x.contributions.catalog,{});for(let e of t.providers)i.includes(e.definition.id)&&Y(n,e.packageName,e.definition)}return n}function Y(e,t,n){let r=u.parse(n);e.has(r.id)||e.set(r.id,{id:r.id,packageName:t,name:r.name,...r.description===void 0?{}:{description:r.description},...r.endpoints===void 0?{}:{endpoints:r.endpoints},...r.defaultModel===void 0?{}:{defaultModel:r.defaultModel},...r.fastModel===void 0?{}:{fastModel:r.fastModel},availableModels:r.availableModels,defaultModelFilterMode:r.defaultModelFilterMode??`show-all`,authMethods:r.authMethods,...r.capabilities===void 0?{}:{capabilities:r.capabilities},enabled:!0,createdAt:0,updatedAt:0})}function $e(e,t,n=-100){let r=e.on(y.get,async n=>{let r=(await X(e,t())).get(n.payload.id)??null;n.setResult({client:r})},{priority:n}),i=e.on(y.list,async n=>{n.setResult({clients:[...(await X(e,t())).values()]})},{priority:n}),a=e.on(y.listByBinaryName,async n=>{let r=[...(await X(e,t())).values()].filter(e=>e.binary?.name===n.payload.binaryName);n.setResult({clients:r})},{priority:n});return()=>{r(),i(),a()}}async function X(e,t){let n=new Set(t.flatMap(e=>e.clients?.map(({id:e})=>e)??[]));if(n.size===0)return new Map;let r=await e.request(x.contributions.catalog,{}),i=new Map;for(let e of r.clients){if(!n.has(e.definition.id))continue;let t=c.parse(e.definition);i.set(t.id,et(e.packageName,t))}return i}function et(e,t){return{id:t.id,packageName:e,name:t.name,...t.description===void 0?{}:{description:t.description},...t.binary===void 0?{}:{binary:structuredClone(t.binary)},nativeTools:structuredClone(t.nativeTools),defaultApprovalPolicy:t.defaultApprovalPolicy,...t.logSources===void 0?{}:{logSources:structuredClone(t.logSources)},authMethods:structuredClone(t.authMethods),...t.defaultAuth===void 0?{}:{defaultAuth:{...t.defaultAuth}},enabled:!0,createdAt:0,updatedAt:0}}function tt(e,t){let n=e.providerRefs.filter(e=>e.definitionId===t),r=e.providers.filter(e=>e.definition.id===t),i=n[0],a=r[0];return n.length===1&&r.length===1&&i!==void 0&&a!==void 0?{ref:i,provider:a}:null}function nt(e,t){return t===void 0||e.clients?.some(e=>e.id===t)===!0}function rt(e,t){return e?.bindings.some(e=>ot(e.method,t))===!0}function it(e,t,n,r){return e.trim().length>0&&t.trim().length>0&&(n===void 0||(r?.trim().length??0)>0)}async function at(e){if(e.snapshot===null)return{status:`error`,code:`provider-config-not-found`};if(e.adapter===void 0)return{status:`error`,code:`adapter-not-loaded`};if(!e.isBound)return{status:`error`,code:`adapter-not-bound`};let t=e.snapshot.context.definitionId,n=tt(e.adapter,t);if(n===null)return{status:`error`,code:`provider-incompatible`};let{provider:r}=n,i=r.auth,a=e.snapshot.context.auth.method;if(!rt(i,a))return{status:`error`,code:`auth-binding-missing`};let o=a.owner===`client`?a.clientId:I(e.adapter.options,e.adapter.clients);if(!nt(e.adapter,o))return{status:`error`,code:`client-incompatible`};let s=await e.bus.request(x.contributions.catalog,{}),c=o===void 0?[]:s.clients.filter(e=>e.definition.id===o);if(o!==void 0&&c.length!==1)return{status:`error`,code:`client-incompatible`};let l=c[0]?.packageName;if(!it(e.adapter.packageName,r.providerPackageName,o,l))return{status:`error`,code:`runtime-package-metadata-missing`};let u=e.adapter.providers.flatMap(e=>e.definition.id!==t&&e.auth!==void 0?[e.auth]:[]),d=o!==void 0&&l!==void 0?{packageName:l,clientId:o}:void 0;return{status:`resolved`,runtime:{snapshot:e.snapshot,adapterName:e.adapter.name,...o!==void 0&&{adapterClientId:o},...r.protocol!==void 0&&{providerProtocol:r.protocol},adapterProviderAuth:i,compatibleProviderAuths:u,runtimePackages:{adapter:{packageName:e.adapter.packageName},provider:{packageName:r.providerPackageName,definitionId:t},...d!==void 0&&{client:d}}}}}function ot(e,t){return e.owner!==t.owner||e.methodId!==t.methodId?!1:e.owner===`provider`?t.owner===`provider`&&e.providerDefinitionId===t.providerDefinitionId:t.owner===`client`&&e.clientId===t.clientId}var Z=class extends ne{configStore;registry;providerConfigService;bindingService;contributionProcessor;runtimeSnapshotHandlerPriority;runtimeDefinitionHandlerPriority;constructor(e){super(e.bus),this.configStore=new Ee({configRepository:e.configRepository,bus:e.bus}),this.registry=new Fe({bus:e.bus,machineId:e.machineId}),this.providerConfigService=new Le({configStore:this.configStore,bus:e.bus}),this.bindingService=new Re({configStore:this.configStore,bus:e.bus}),this.contributionProcessor=new We({configStore:this.configStore,registry:this.registry,coordinator:e.coordinator,machineId:e.machineId,platformDefaults:e.platformDefaults,...e.prepareAuthRuntime!==void 0&&{prepareAuthRuntime:e.prepareAuthRuntime}}),this.runtimeSnapshotHandlerPriority=e.runtimeSnapshotHandlerPriority??0,this.runtimeDefinitionHandlerPriority=e.runtimeDefinitionHandlerPriority??-100}async onInit(){await this.configStore.loadSnapshot(),this.configStore.registerListeners(e=>this.addCleanup(e)),this.registerBusHandlers(),await this.bus.emit(S.ready,{})}registerBusHandlers(){this.addCleanup(Qe(this.bus,()=>this.registry.getLoadedAdapters(),this.runtimeDefinitionHandlerPriority)),this.addCleanup($e(this.bus,()=>this.registry.getLoadedAdapters(),this.runtimeDefinitionHandlerPriority)),this.registerReadHandlers(),this.registerMutationHandlers()}registerReadHandlers(){this.registerConfigReadHandlers(),this.registerRuntimeReadHandlers()}registerConfigReadHandlers(){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)})})}registerRuntimeReadHandlers(){this.registerHandler(S.resolveProviderRuntimeSnapshot,async e=>{e.setResult({snapshot:await this.configStore.resolveProviderRuntimeSnapshot(e.payload.providerConfigId)})},{priority:this.runtimeSnapshotHandlerPriority}),this.registerHandler(S.resolveAdapterRuntimeSnapshot,async e=>{let t=this.registry.getLoadedAdapters().find(t=>t.name===e.payload.adapterName);try{let n=await this.configStore.resolveBoundProviderRuntimeSnapshot(e.payload.adapterName,e.payload.providerConfigId);e.setResult(await at({bus:this.bus,adapter:t,snapshot:n.snapshot,isBound:n.isBound}))}catch(t){if(t instanceof M&&t.code===`provider-config-disabled`){e.setResult({status:`error`,code:`provider-config-disabled`});return}throw t}},{priority:this.runtimeSnapshotHandlerPriority}),this.registerHandler(S.listAdapters,async e=>{e.setResult({adapters:await this.configStore.buildEffectiveAdapters()})}),this.registerHandler(S.getProviderDefinitionsByAdapter,async e=>{let t=this.registry.getLoadedAdapters().find(t=>t.name===e.payload.adapterName),n=new Map((t?.providers??[]).map(e=>[e.definition.id,e.definition])),r=(t?.providerDefinitionIds??[]).filter(e=>!n.has(e));if(r.length>0){let e=await this.bus.request(x.contributions.catalog,{});for(let t of e.providers)r.includes(t.definition.id)&&n.set(t.definition.id,t.definition)}let i=(t?.providerDefinitionIds??[]).flatMap(e=>{let t=n.get(e);return t===void 0?[]:[u.parse(t)]});e.setResult({definitions:i})}),this.registerHandler(S.listCompatibleAuthOptions,async e=>{e.setResult({options:await Ge(this.bus,this.registry.getLoadedAdapters(),e.payload.definitionId)})}),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.setProviderConfigAuth,async e=>{e.setResult(await this.providerConfigService.setProviderConfigAuth(e.payload.id,e.payload.auth))}),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)}},Q=class extends Error{code;source;constructor(e,t,n){super(`Provider config "${t}" cannot be loaded: ${n}`),this.name=`ProviderConfigDiagnosticError`,this.code=e,this.source=t}};const $=`.json`;var st=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=h.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`,`reject`);for(let n of t){let t=this.getCanonicalLoadedStem(n.stem,`provider config`,n.filePath);t&&e.set(t,this.parseProviderConfig(n.jsonData,t))}return{configs:e}}async writeProviderConfig(e,t){let r=this.assertCanonicalFileStem(e,`provider config id`),i=n.join(this.providerConfigsDir,`${r}${$}`),a=this.parseProviderConfig(t,r);await this.writeJsonFile(i,a)}async deleteProviderConfig(e){let t=this.assertCanonicalFileStem(e,`provider config id`);try{return await this.unlinkFile(n.join(this.providerConfigsDir,`${t}${$}`)),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async writeAdapterFile(e,t){let r=this.assertCanonicalFileStem(e,`adapter name`),i=h.parse(t);await this.writeJsonFile(n.join(this.adaptersDir,`${r}${$}`),i)}async deleteAdapterFile(e){let t=this.assertCanonicalFileStem(e,`adapter name`);try{return await this.unlinkFile(n.join(this.adaptersDir,`${t}${$}`)),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}async readJsonFiles(e,r,i=`skip`){try{let a=(await t.readdir(e,{withFileTypes:!0})).filter(e=>e.isFile()&&n.extname(e.name)===$).sort((e,t)=>e.name.localeCompare(t.name));return(await Promise.all(a.map(async a=>{let o=n.join(e,a.name);try{let e=await t.readFile(o,`utf-8`);return{filePath:o,stem:n.parse(a.name).name,jsonData:JSON.parse(e)}}catch(e){if(e instanceof SyntaxError){if(i===`reject`)throw new Q(`invalid-provider-config`,ct(a.name),`file does not contain valid JSON.`);return this.warnInvalidFile(r,o),null}if(e instanceof Error&&e.code===`ENOENT`)return this.warnInvalidFile(r,o),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)}parseProviderConfig(e,t){let n=typeof e==`object`&&e?e:void 0,r=n?.$schema,i=[`credentials`,`isSentinel`].filter(e=>Object.hasOwn(n??{},e));if(r===`makaio/provider-config/v1`||i.length>0)throw new Q(`legacy-provider-config`,t,`${[...r===`makaio/provider-config/v1`?[`schema v1`]:[],...i.length>0?[`legacy fields ${i.join(`, `)}`]:[]].join(` and `)} use retired authentication semantics. Recreate this config with an explicit normalized authentication method.`);if(r!==g)throw new Q(`unsupported-provider-config-version`,t,`expected $schema "${g}". Recreate the config with the current schema.`);let a=ae.safeParse(e);if(!a.success)throw new Q(`invalid-provider-config`,t,a.error.issues.map(e=>`${e.path.length>0?e.path.join(`.`):`<root>`}: ${e.message}`).join(`; `));return a.data}getCanonicalLoadedStem(e,t,n){try{return this.assertCanonicalFileStem(e,`${t} file stem`)}catch{return this.warnInvalidFile(t,n),null}}async writeJsonFile(e,i){let a=n.dirname(e),o=n.join(a,`.${n.basename(e)}.${r()}.tmp`);await t.mkdir(a,{recursive:!0});try{await t.writeFile(o,`${JSON.stringify(i,null,2)}\n`,{encoding:`utf-8`,mode:384}),await this.replaceFile(o,e)}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 n=`${t}.${r()}.bak`,i=!1;try{await this.renameFile(t,n),i=!0}catch(e){if(e.code!==`ENOENT`)throw e}try{await this.renameFile(e,t)}catch(e){throw i&&await this.renameFile(n,t).catch(()=>void 0),e}i&&await this.removeFileIfPresent(n)}async renameFile(e,n){await t.rename(e,n)}async unlinkFile(e){await t.unlink(e)}async removeFileIfPresent(e){try{await t.unlink(e)}catch(t){t.code!==`ENOENT`&&console.warn(`[FileAdapterConfigRepository] Failed to remove temp file: %s`,e,t)}}assertCanonicalFileStem(e,t){let r=e.trim(),i=n.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 ${t}: ${e}`);return r}};function ct(e){return n.basename(e).replace(/[^A-Za-z0-9._-]/g,`_`)||`provider-config.json`}function lt(e){return{filter:e=>!!e.adapters?.length||!!e.providers?.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 ut=ee(`adapter-subsystem`);function dt(e){return{name:ut.name,displayName:`Adapter Subsystem`,version:`0.1.0`,provides:[`adapters`],critical:!0,create:t=>new Z({bus:t.bus,configRepository:e.configRepository,coordinator:e.coordinator,machineId:t.machineId,platformDefaults:e.platformDefaults,...e.prepareAuthRuntime!==void 0&&{prepareAuthRuntime:e.prepareAuthRuntime},...e.runtimeSnapshotHandlerPriority!==void 0&&{runtimeSnapshotHandlerPriority:e.runtimeSnapshotHandlerPriority},...e.runtimeDefinitionHandlerPriority!==void 0&&{runtimeDefinitionHandlerPriority:e.runtimeDefinitionHandlerPriority}})}}export{Z as AdapterSubsystemService,ut as AdapterSubsystemToken,st as FileAdapterConfigRepository,A as ProviderConfigAuthValidationError,Q as ProviderConfigDiagnosticError,M as ProviderRuntimeContextError,k as assertProviderConfigAuthDefinitionsEnabled,lt as createAdapterSubsystemContributionProcessor,dt as createAdapterSubsystemPackage,Pe as ensureAdapterConfigs,Ae as extractAdapterIdFromPackageName,H as initializeEnabledAdapters,B as shutdownAdapterInstances,R as toAvailableAdapter,j as validateProviderConfigAuth};
|
package/dist/adapters/node.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import{o as e,t}from"../chunk-DTipWd-i.mjs";import{i as n,r}from"../cursor-storage-Bw-7ROzx.mjs";import{t as i}from"../globby-CisClzat.mjs";import*as a from"node:fs/promises";import*as o from"node:path";import{MakaioBus as s}from"@makaio/framework/bus";import{AdapterSubjects as c,ClientSubjects as l,SessionStorageSubjects as u,SessionSubjects as d}from"@makaio/framework/contracts";const f=65536;async function p(e){let{filePath:t,startOffset:n=0}=e,r=[],i=[],o=n,s;try{s=await a.open(t,`r`);let e=await s.stat();if(n>=e.size)return{records:r,bytesRead:n,errors:i};let c=Buffer.alloc(f),l=``,u=n,d=0;for(n>0&&(d=await v(s,n));u<e.size;){let{bytesRead:e}=await s.read(c,0,f,u);if(e===0)break;l+=c.toString(`utf8`,0,e),u+=e;let t=l.split(`
|
|
2
2
|
`),n=t.pop();for(let e of t){if(d++,e.trim()===``){o+=Buffer.byteLength(e,`utf8`)+1;continue}let t=g(e,d);t.success?r.push(t.record):i.push(t.error),o+=Buffer.byteLength(e,`utf8`)+1}l=n??``}return{records:r,bytesRead:o,errors:i}}finally{s&&await s.close()}}async function m(e,t){let n=[],r;try{r=await a.open(e,`r`);let i=Buffer.alloc(f),o=``,s=0;for(;n.length<t;){let{bytesRead:e}=await r.read(i,0,f,s);if(e===0)break;o+=i.toString(`utf8`,0,e),s+=e;let a=o.split(`
|
|
3
3
|
`);o=a.pop()??``;for(let e of a){if(n.length>=t)break;let r=e.trim();if(r!==``)try{n.push(JSON.parse(r))}catch{}}}return n}finally{r&&await r.close()}}async function h(e,t){let n;try{n=await a.open(e,`r`);let r=Buffer.alloc(f),i=``,o=0;for(;;){let{bytesRead:e}=await n.read(r,0,f,o);if(e===0)break;i+=r.toString(`utf8`,0,e),o+=e;let a=i.split(`
|
|
4
|
-
`);i=a.pop()??``;for(let e of a){let n=e.trim();if(n!==``)try{if(t(JSON.parse(n)))return!0}catch{}}}return!1}finally{n&&await n.close()}}function g(e,t){try{return{success:!0,record:JSON.parse(e)}}catch(n){return{success:!1,error:{line:t,error:n instanceof Error?n.message:String(n),content:_(e)}}}}function _(e){return e.length<=200?e:e.slice(0,200)+`...`}async function v(e,t){let n=0,r=Buffer.alloc(f),i=0;for(;i<t;){let a=Math.min(f,t-i),{bytesRead:o}=await e.read(r,0,a,i);if(o===0)break;for(let e=0;e<o;e++)r[e]===10&&n++;i+=o}return n}var y=e(t(((e,t)=>{var n=Object.prototype.hasOwnProperty,r=`~`;function i(){}Object.create&&(i.prototype=Object.create(null),new i().__proto__||(r=!1));function a(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(e,t,n,i,o){if(typeof n!=`function`)throw TypeError(`The listener must be a function`);var s=new a(n,i||e,o),c=r?r+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],s]:e._events[c].push(s):(e._events[c]=s,e._eventsCount++),e}function s(e,t){--e._eventsCount===0?e._events=new i:delete e._events[t]}function c(){this._events=new i,this._eventsCount=0}c.prototype.eventNames=function(){var e=[],t,i;if(this._eventsCount===0)return e;for(i in t=this._events)n.call(t,i)&&e.push(r?i.slice(1):i);return Object.getOwnPropertySymbols?e.concat(Object.getOwnPropertySymbols(t)):e},c.prototype.listeners=function(e){var t=r?r+e:e,n=this._events[t];if(!n)return[];if(n.fn)return[n.fn];for(var i=0,a=n.length,o=Array(a);i<a;i++)o[i]=n[i].fn;return o},c.prototype.listenerCount=function(e){var t=r?r+e:e,n=this._events[t];return n?n.fn?1:n.length:0},c.prototype.emit=function(e,t,n,i,a,o){var s=r?r+e:e;if(!this._events[s])return!1;var c=this._events[s],l=arguments.length,u,d;if(c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),l){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,i),!0;case 5:return c.fn.call(c.context,t,n,i,a),!0;case 6:return c.fn.call(c.context,t,n,i,a,o),!0}for(d=1,u=Array(l-1);d<l;d++)u[d-1]=arguments[d];c.fn.apply(c.context,u)}else{var f=c.length,p;for(d=0;d<f;d++)switch(c[d].once&&this.removeListener(e,c[d].fn,void 0,!0),l){case 1:c[d].fn.call(c[d].context);break;case 2:c[d].fn.call(c[d].context,t);break;case 3:c[d].fn.call(c[d].context,t,n);break;case 4:c[d].fn.call(c[d].context,t,n,i);break;default:if(!u)for(p=1,u=Array(l-1);p<l;p++)u[p-1]=arguments[p];c[d].fn.apply(c[d].context,u)}}return!0},c.prototype.on=function(e,t,n){return o(this,e,t,n,!1)},c.prototype.once=function(e,t,n){return o(this,e,t,n,!0)},c.prototype.removeListener=function(e,t,n,i){var a=r?r+e:e;if(!this._events[a])return this;if(!t)return s(this,a),this;var o=this._events[a];if(o.fn)o.fn===t&&(!i||o.once)&&(!n||o.context===n)&&s(this,a);else{for(var c=0,l=[],u=o.length;c<u;c++)(o[c].fn!==t||i&&!o[c].once||n&&o[c].context!==n)&&l.push(o[c]);l.length?this._events[a]=l.length===1?l[0]:l:s(this,a)}return this},c.prototype.removeAllListeners=function(e){var t;return e?(t=r?r+e:e,this._events[t]&&s(this,t)):(this._events=new i,this._eventsCount=0),this},c.prototype.off=c.prototype.removeListener,c.prototype.addListener=c.prototype.on,c.prefixed=r,c.EventEmitter=c,t!==void 0&&(t.exports=c)}))(),1),b=class e extends Error{name=`TimeoutError`;constructor(t,n){super(t,n),Error.captureStackTrace?.(this,e)}};const x=e=>e.reason??new DOMException(`This operation was aborted.`,`AbortError`);function S(e,t){let{milliseconds:n,fallback:r,message:i,customTimers:a={setTimeout,clearTimeout},signal:o}=t,s,c,l=new Promise((t,l)=>{if(typeof n!=`number`||Math.sign(n)!==1)throw TypeError(`Expected \`milliseconds\` to be a positive number, got \`${n}\``);if(o?.aborted){l(x(o));return}if(o&&(c=()=>{l(x(o))},o.addEventListener(`abort`,c,{once:!0})),e.then(t,l),n===1/0)return;let u=new b;s=a.setTimeout.call(void 0,()=>{if(r){try{t(r())}catch(e){l(e)}return}typeof e.cancel==`function`&&e.cancel(),i===!1?t():i instanceof Error?l(i):(u.message=i??`Promise timed out after ${n} milliseconds`,l(u))},n)}).finally(()=>{l.clear(),c&&o&&o.removeEventListener(`abort`,c)});return l.clear=()=>{a.clearTimeout.call(void 0,s),s=void 0},l}function C(e,t,n){let r=0,i=e.length;for(;i>0;){let a=Math.trunc(i/2),o=r+a;n(e[o],t)<=0?(r=++o,i-=a+1):i=a}return r}var w=class{#e=[];#t=0;enqueue(e,t){let{priority:n=0,id:r}=t??{},{size:i}=this,a={priority:n,id:r,run:e};if(i===0){this.#e.length=0,this.#t=0,this.#e.push(a);return}if(this.#e.at(-1).priority>=n){this.#e.push(a);return}this.#n();let o=C(this.#e,a,(e,t)=>t.priority-e.priority);this.#e.splice(o,0,a)}setPriority(e,t){let n=this.#e.findIndex((t,n)=>n>=this.#t&&t.id===e);if(n===-1)throw ReferenceError(`No promise function with the id "${e}" exists in the queue.`);let[r]=this.#e.splice(n,1);this.enqueue(r.run,{priority:t,id:e})}remove(e){let t=this.#e.findIndex((t,n)=>n<this.#t?!1:typeof e==`string`?t.id===e:t.run===e);t!==-1&&this.#e.splice(t,1)}dequeue(){if(this.#t===this.#e.length)return;let e=this.#e[this.#t];return this.#t++,this.#t===this.#e.length?(this.#e.length=0,this.#t=0):this.#t>100&&this.#t>this.#e.length/2&&this.#n(),e?.run}filter(e){let t=[];for(let n=this.#t;n<this.#e.length;n++){let r=this.#e[n];r.priority===e.priority&&t.push(r.run)}return t}get size(){return this.#e.length-this.#t}#n(){this.#t!==0&&(this.#e.splice(0,this.#t),this.#t=0)}},T=class extends y.default{#e;#t;#n=0;#r;#i=!1;#a=!1;#o;#s=0;#c=0;#l;#u;#d;#f=[];#p=0;#m;#h;#g=0;#_;#v;#y=1n;#b=new Map;#x=new Set;timeout;constructor(e){if(super(),e={carryoverIntervalCount:!1,intervalCap:1/0,interval:0,concurrency:1/0,autoStart:!0,queueClass:w,strict:!1,...e},!(typeof e.intervalCap==`number`&&e.intervalCap>=1))throw TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${e.intervalCap?.toString()??``}\` (${typeof e.intervalCap})`);if(e.interval===void 0||!(Number.isFinite(e.interval)&&e.interval>=0))throw TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${e.interval?.toString()??``}\` (${typeof e.interval})`);if(e.strict&&e.interval===0)throw TypeError("The `strict` option requires a non-zero `interval`");if(e.strict&&e.intervalCap===1/0)throw TypeError("The `strict` option requires a finite `intervalCap`");if(this.#e=e.carryoverIntervalCount??e.carryoverConcurrencyCount??!1,this.#t=e.intervalCap===1/0||e.interval===0,this.#r=e.intervalCap,this.#o=e.interval,this.#d=e.strict,this.#m=new e.queueClass,this.#h=e.queueClass,this.concurrency=e.concurrency,e.timeout!==void 0&&!(Number.isFinite(e.timeout)&&e.timeout>0))throw TypeError(`Expected \`timeout\` to be a positive finite number, got \`${e.timeout}\` (${typeof e.timeout})`);this.timeout=e.timeout,this.#v=e.autoStart===!1,this.#z()}#S(e){for(;this.#p<this.#f.length;){let t=this.#f[this.#p];if(t!==void 0&&e-t>=this.#o)this.#p++;else break}(this.#p>100&&this.#p>this.#f.length/2||this.#p===this.#f.length)&&(this.#f=this.#f.slice(this.#p),this.#p=0)}#C(e){this.#d?this.#f.push(e):this.#n++}#w(){this.#d?this.#f.length>this.#p&&this.#f.pop():this.#n>0&&this.#n--}#T(){return this.#f.length-this.#p}get#E(){return this.#t?!0:this.#d?this.#T()<this.#r:this.#n<this.#r}get#D(){return this.#g<this.#_}#O(){this.#g--,this.#g===0&&this.emit(`pendingZero`),this.#P(),this.emit(`next`)}#k(){this.#u=void 0,this.#I(),this.#F()}#A(e){if(this.#d){if(this.#S(e),this.#T()>=this.#r){let t=this.#f[this.#p],n=this.#o-(e-t);return this.#j(n),!0}return!1}if(this.#l===void 0){let t=this.#s-e;if(t<0){if(this.#c>0){let t=e-this.#c;if(t<this.#o)return this.#j(this.#o-t),!0}this.#n=this.#e?this.#g:0}else return this.#j(t),!0}return!1}#j(e){this.#u===void 0&&(this.#u=setTimeout(()=>{this.#k()},e))}#M(){this.#l&&=(clearInterval(this.#l),void 0)}#N(){this.#u&&=(clearTimeout(this.#u),void 0)}#P(){if(this.#m.size===0){if(this.#M(),this.emit(`empty`),this.#g===0){if(this.#N(),this.#d&&this.#p>0){let e=Date.now();this.#S(e)}this.emit(`idle`)}return!1}let e=!1;if(!this.#v){let t=Date.now(),n=!this.#A(t);if(this.#E&&this.#D){let r=this.#m.dequeue();this.#t||(this.#C(t),this.#B()),this.emit(`active`),r(),n&&this.#F(),e=!0}}return e}#F(){this.#t||this.#l!==void 0||this.#d||(this.#l=setInterval(()=>{this.#I()},this.#o),this.#s=Date.now()+this.#o)}#I(){this.#d||(this.#n===0&&this.#g===0&&this.#l&&this.#M(),this.#n=this.#e?this.#g:0),this.#L(),this.#B()}#L(){for(;this.#P(););}get concurrency(){return this.#_}set concurrency(e){if(!(typeof e==`number`&&e>=1))throw TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${e}\` (${typeof e})`);this.#_=e,this.#L()}setPriority(e,t){if(typeof t!=`number`||!Number.isFinite(t))throw TypeError(`Expected \`priority\` to be a finite number, got \`${t}\` (${typeof t})`);this.#m.setPriority(e,t)}async add(e,t={}){return t={timeout:this.timeout,...t,id:t.id??(this.#y++).toString()},new Promise((n,r)=>{let i=Symbol(`task-${t.id}`),a=()=>void 0,o=async()=>{a(),this.#g++,this.#b.set(i,{id:t.id,priority:t.priority??0,startTime:Date.now(),timeout:t.timeout});let o;try{try{t.signal?.throwIfAborted()}catch(e){throw this.#V(),this.#b.delete(i),e}this.#c=Date.now();let r=e({signal:t.signal});if(t.timeout&&(r=S(Promise.resolve(r),{milliseconds:t.timeout,message:`Task timed out after ${t.timeout}ms (queue has ${this.#g} running, ${this.#m.size} waiting)`})),t.signal){let{signal:e}=t;r=Promise.race([r,new Promise((t,n)=>{o=()=>{n(e.reason)},e.addEventListener(`abort`,o,{once:!0})})])}let a=await r;n(a),this.emit(`completed`,a)}catch(e){r(e),this.emit(`error`,e)}finally{o&&t.signal?.removeEventListener(`abort`,o),this.#b.delete(i),queueMicrotask(()=>{this.#O()})}};this.#m.enqueue(o,t);let s=()=>{if(this.#m instanceof w){this.#m.remove(o);return}this.#m.remove?.(t.id)};if(t.signal){let{signal:e}=t,n=()=>{a(),s(),r(e.reason),this.#P(),this.emit(`next`)};if(a=()=>{e.removeEventListener(`abort`,n),this.#x.delete(a)},e.aborted){n();return}e.addEventListener(`abort`,n,{once:!0}),this.#x.add(a)}this.emit(`add`),this.#P()})}async addAll(e,t){return Promise.all(e.map(async e=>this.add(e,t)))}start(){return this.#v?(this.#v=!1,this.#L(),this):this}pause(){this.#v=!0}clear(){for(let e of this.#x)e();this.#m=new this.#h,this.#M(),this.#H(),this.emit(`empty`),this.#g===0&&(this.#N(),this.emit(`idle`)),this.emit(`next`)}async onEmpty(){this.#m.size!==0&&await this.#R(`empty`)}async onSizeLessThan(e){this.#m.size<e||await this.#R(`next`,()=>this.#m.size<e)}async onIdle(){this.#g===0&&this.#m.size===0||await this.#R(`idle`)}async onPendingZero(){this.#g!==0&&await this.#R(`pendingZero`)}async onRateLimit(){this.isRateLimited||await this.#R(`rateLimit`)}async onRateLimitCleared(){this.isRateLimited&&await this.#R(`rateLimitCleared`)}onError(){return new Promise((e,t)=>{let n=e=>{this.off(`error`,n),t(e)};this.on(`error`,n)})}async#R(e,t){return new Promise(n=>{let r=()=>{t&&!t()||(this.off(e,r),n())};this.on(e,r)})}get size(){return this.#m.size}sizeBy(e){return this.#m.filter(e).length}get pending(){return this.#g}get isPaused(){return this.#v}#z(){this.#t||(this.on(`add`,()=>{this.#m.size>0&&this.#B()}),this.on(`next`,()=>{this.#B()}))}#B(){this.#t||this.#a||(this.#a=!0,queueMicrotask(()=>{this.#a=!1,this.#H()}))}#V(){this.#t||(this.#w(),this.#B())}#H(){let e=this.#i;if(this.#t||this.#m.size===0){e&&(this.#i=!1,this.emit(`rateLimitCleared`));return}let t;if(this.#d){let e=Date.now();this.#S(e),t=this.#T()}else t=this.#n;let n=t>=this.#r;n!==e&&(this.#i=n,this.emit(n?`rateLimit`:`rateLimitCleared`))}get isRateLimited(){return this.#i}get isSaturated(){return this.#g===this.#_&&this.#m.size>0||this.isRateLimited&&this.#m.size>0}get runningTasks(){return[...this.#b.values()].map(e=>({...e,timeoutRemaining:e.timeout?Math.max(0,e.startTime+e.timeout-Date.now()):void 0}))}},E=class{eventQueue;cursorQueue;onEventEmitted;constructor(e){this.onEventEmitted=e.onEventEmitted,this.eventQueue=new T({concurrency:1,interval:1e3,intervalCap:e.eventsPerSecond}),this.cursorQueue=new T({concurrency:1})}queueEvent(e){return this.eventQueue.add(async()=>{await s.emit(e.subject,e.payload),this.onEventEmitted()})}queueAfterEvents(e,t=[]){let n=Promise.all(t);return n.catch(()=>void 0),this.cursorQueue.add(async()=>{await n,await e()})}async drain(){await Promise.all([this.eventQueue.onIdle(),this.cursorQueue.onIdle()])}async onIdle(){await this.drain()}},D=class{options;emittery=new n;trackedFiles=new Map;pollTimer;isPolling=!1;isDisposed=!1;inFlightChecks=new Map;constructor(e){if(!o.isAbsolute(e.directory))throw Error(`Directory must be an absolute path: ${e.directory}`);this.options={directory:e.directory,pattern:e.pattern,pollIntervalMs:e.pollIntervalMs??1e4}}on(e,t){return this.emittery.on(e,t)}once(e,t){return this.emittery.once(e,t)}async start(){this.isDisposed||this.pollTimer===void 0&&(await this.poll(),this.pollTimer=setInterval(()=>{this.poll()},this.options.pollIntervalMs))}stop(){this.pollTimer!==void 0&&(clearInterval(this.pollTimer),this.pollTimer=void 0)}dispose(){this.isDisposed=!0,this.stop(),this.emittery.clearListeners(),this.trackedFiles.clear(),this.inFlightChecks.clear()}isRunning(){return this.pollTimer!==void 0}getTrackedFiles(){return this.trackedFiles}seedFromCursors(e){for(let t of e)this.trackedFiles.set(t.filePath,{size:t.bytesRead,mtimeMs:new Date(t.lastModified).getTime()})}async poll(){if(!this.isDisposed&&!this.isPolling){this.isPolling=!0;try{let e=await this.discoverFiles(),t=new Set(e);for(let e of this.trackedFiles.keys())if(!t.has(e)){if(this.isDisposed)return;this.trackedFiles.delete(e),await this.emittery.emit(`deleted`,{filePath:e})}for(let t of e)try{await this.runFileCheck(t)}catch(e){await this.emitWatcherError(e,t)}if(this.isDisposed)return;await this.emittery.emit(`polled`,{trackedFilePaths:new Set(this.trackedFiles.keys())})}catch(e){await this.emitWatcherError(e)}finally{this.isPolling=!1}}}async discoverFiles(){return i(this.options.pattern,{cwd:this.options.directory,absolute:!0,onlyFiles:!0})}async checkFile(e){if(this.isDisposed)return;let t=await a.stat(e);if(this.isDisposed)return;let n={size:t.size,mtimeMs:t.mtimeMs},r=this.trackedFiles.get(e);if(!r){if(this.trackedFiles.set(e,n),this.isDisposed){this.trackedFiles.delete(e);return}await this.emittery.emit(`change`,{filePath:e,stat:{size:t.size,mtime:t.mtime},changeType:`created`});return}if(n.mtimeMs!==r.mtimeMs){let i=n.size<r.size?`rotated`:`modified`;if(this.trackedFiles.set(e,n),this.isDisposed)return;await this.emittery.emit(`change`,{filePath:e,stat:{size:t.size,mtime:t.mtime},changeType:i})}}clearTrackedFile(e){return this.trackedFiles.delete(e)}clearAllTrackedFiles(){this.trackedFiles.clear()}triggerImmediatePoll(e){this.runFileCheck(e).catch(t=>{this.emitWatcherError(t,e)})}async runFileCheck(e){if(this.isDisposed)return;let t=this.inFlightChecks.get(e);if(t){await t;return}let n=(async()=>{try{await this.checkFile(e)}finally{this.inFlightChecks.delete(e)}})();this.inFlightChecks.set(e,n),await n}async emitWatcherError(e,t){let n=e instanceof Error?e:Error(String(e));try{await this.emittery.emit(`error`,{error:n,filePath:t})}catch(e){console.error(`[LogFileWatcher] Error listener failed:`,e instanceof Error?e.message:String(e))}}},O=class{watcher;constructor(e){this.watcher=new D(e)}isRunning(){return this.watcher.isRunning()}async start(){await this.watcher.start()}stop(){this.watcher.stop()}dispose(){this.watcher.dispose()}onChange(e){return this.watcher.on(`change`,e)}onError(e){return this.watcher.on(`error`,e)}onDeleted(e){return this.watcher.on(`deleted`,e)}onPolled(e){return this.watcher.on(`polled`,({trackedFilePaths:t})=>e(t))}getTrackedFileMtimeMs(e){return this.watcher.getTrackedFiles().get(e)?.mtimeMs}triggerImmediatePoll(e){this.watcher.triggerImmediatePoll(e)}seedFromCursors(e){this.watcher.seedFromCursors(e)}},k=class{filesProcessed=0;eventsEmitted=0;sessionsImported=new Set;sessionsSkipped=new Set;lastLoggedEventCount=0;lastLoggedSnapshot=``;reset(){this.filesProcessed=0,this.eventsEmitted=0,this.sessionsImported.clear(),this.sessionsSkipped.clear(),this.lastLoggedEventCount=0,this.lastLoggedSnapshot=``}recordFileProcessed(){this.filesProcessed++}recordEventEmitted(e){this.eventsEmitted++,!(this.eventsEmitted-this.lastLoggedEventCount<1e3)&&(console.info(`${e} Imported ${this.eventsEmitted} events (${this.sessionsImported.size} sessions)...`),this.lastLoggedEventCount=this.eventsEmitted)}recordSessionImported(e){this.sessionsImported.add(e)}recordSessionSkipped(e){this.sessionsSkipped.add(e)}hasActivity(){return this.eventsEmitted>0||this.filesProcessed>0}stoppedMessage(e){return`${e} Stopped - ${this.eventsEmitted} events from ${this.sessionsImported.size} sessions (${this.sessionsSkipped.size} skipped)`}logProgress(e){if(!this.hasActivity())return;let t=JSON.stringify({eventsEmitted:this.eventsEmitted,filesProcessed:this.filesProcessed,sessionsImported:this.sessionsImported.size,sessionsSkipped:this.sessionsSkipped.size});t!==this.lastLoggedSnapshot&&(this.lastLoggedSnapshot=t,console.info(`${e} Progress: ${this.eventsEmitted} events, ${this.sessionsImported.size} sessions, ${this.filesProcessed} files, ${this.sessionsSkipped.size} skipped`))}};function A(e){return async t=>{try{if(e!==void 0)try{let n=await s.requestOptional(l.runtime.isAdapterManaged,{adapterSessionId:t,clientId:e});if(n.handled&&n.data.managed)return!0}catch{}let n=await s.request(d.getByAdapterSessionId,{adapterSessionId:t});return n.session!==null&&!n.session.isImported}catch{return!1}}}var j=class{checkedSessions=new Map;inFlight=new Map;generations=new Map;async isSkipped(e,t,n){for(;;){let r=this.checkedSessions.get(e);if(r!==void 0)return r;let i=this.generations.get(e)??0,a=this.inFlight.get(e),o;if(a&&a.generation===i?o=a.promise:(o=t(e).then(t=>((this.generations.get(e)??0)===i&&(this.checkedSessions.set(e,t),t&&n(e)),t)).finally(()=>{let t=this.inFlight.get(e);t&&t.generation===i&&this.inFlight.delete(e)}),this.inFlight.set(e,{generation:i,promise:o})),await o,(this.generations.get(e)??0)===i){let t=this.checkedSessions.get(e);if(t!==void 0)return t;continue}}}invalidate(e){this.checkedSessions.delete(e),this.inFlight.delete(e),this.generations.set(e,(this.generations.get(e)??0)+1)}clear(){this.checkedSessions.clear(),this.inFlight.clear(),this.generations.clear()}};function M(e,t,n,r){return!n||!e||r===`rotated`?!1:new Date(e)>=t}function N(e,t,n){for(let r of n??[]){let n=r.line===void 0?``:` at line ${r.line}`;console.warn(`${e} Parse error in ${t}${n}: ${r.error}`)}}async function P(e,t,n,i){let{cursor:a}=await s.request(r.get,{filePath:e});return a&&a.bytesRead>0&&!a.sessionContext&&!t?(await s.request(r.delete,{filePath:e}).catch(()=>{}),i(n),`retry`):a}async function F(e,t,n,r,i,a){let o=await a.parseFile(e,0);N(i,e,o.errors);let s=a.validateRecords(o.records);s.length>0&&await a.handleFirstRead(e,s,o.bytesRead??0,t,n,0,r)}function I(e,t,n,r,i){let a=[];n&&(a.push(i(t.sessionEvent)),a.push(i(t.startedEvent)));let o=r(e,t);for(let e of o)a.push(i(e));return a}function L(e,t){let n=[];for(let r of e)n.push(t(r));return n}function R(e){return typeof e==`object`&&!!e&&`compactionDetected`in e&&e.compactionDetected===!0}function z(e,t,n){return{...e,state:n(t)}}var B=class{tasks=new Set;track(e){this.tasks.add(e),e.finally(()=>{this.tasks.delete(e)})}async drain(){for(;this.tasks.size>0;)await Promise.allSettled([...this.tasks])}},V=class{config;watcher;eventQueue;importer;managedSessionCache=new j;unsubscribeChange;unsubscribeError;unsubscribeDeleted;unsubscribeRuntimeStarted;stats=new k;watcherTasks=new B;progressTimer;constructor(e,t){this.importer=t;let n=e.directory??t.getLogDirectory();this.config={enabled:e.enabled,directory:e.directory,pollIntervalMs:e.pollIntervalMs??1e4,eventsPerSecond:e.eventsPerSecond??100,adapterId:e.adapterId,adapterName:e.adapterName,checkMakaioManaged:e.checkMakaioManaged,clientId:e.clientId,machineId:e.machineId},this.watcher=new O({directory:n,pattern:this.getLogFilePattern(),pollIntervalMs:this.config.pollIntervalMs}),this.eventQueue=new E({eventsPerSecond:this.config.eventsPerSecond,onEventEmitted:()=>{this.stats.recordEventEmitted(this.logPrefix)}})}shouldSkipFile(e){return!1}validateRecords(e){return e}getMaxRecords(){}buildCursorSessionContext(e){let{adapterSessionId:t,sessionEvent:n,startedEvent:r,state:i,...a}=e;return{...a,adapterSessionId:t,sessionEvent:n,startedEvent:r,state:this.importer.serializeState(i)}}usesJsonFormat(){let e=this.getLogFilePattern();return e.includes(`.json`)&&!e.includes(`.jsonl`)}isEnabled(){return this.config.enabled}isRunning(){return this.watcher.isRunning()}async start(){if(!this.config.enabled||this.isRunning())return;let e=this.config.directory??this.importer.getLogDirectory();console.info(`${this.logPrefix} Starting - watching ${e}`),this.stats.reset(),this.managedSessionCache.clear(),this.progressTimer=setInterval(()=>this.stats.logProgress(this.logPrefix),1e4),this.unsubscribeChange=this.watcher.onChange(e=>{this.trackFileChange(e)}),this.unsubscribeError=this.watcher.onError(({error:e,filePath:t})=>{console.warn(`${this.logPrefix} Error${t?` for ${t}`:``}: ${e.message}`)}),this.unsubscribeDeleted=this.watcher.onDeleted(({filePath:e})=>{this.watcherTasks.track(s.request(r.delete,{filePath:e}).then(()=>void 0).catch(()=>{}))}),this.unsubscribeRuntimeStarted=s.on(l.runtime.started,e=>{e.payload.source.layer===`adapter`&&e.payload.adapterSessionId!==void 0&&this.managedSessionCache.invalidate(e.payload.adapterSessionId)}),await this.watcher.start()}async stop(){this.progressTimer&&=(clearInterval(this.progressTimer),void 0),this.unsubscribeChange?.(),this.unsubscribeError?.(),this.unsubscribeDeleted?.(),this.unsubscribeRuntimeStarted?.(),this.unsubscribeChange=void 0,this.unsubscribeError=void 0,this.unsubscribeDeleted=void 0,this.unsubscribeRuntimeStarted=void 0,this.watcher.stop(),await this.watcherTasks.drain(),await this.eventQueue.drain(),this.stats.hasActivity()&&console.info(this.stats.stoppedMessage(this.logPrefix))}async dispose(){await this.stop(),this.watcher.dispose(),this.managedSessionCache.clear()}static createDefaultCheckMakaioManaged(e){return A(e)}async updateCursor(e,t,n,i){await s.request(r.set,{filePath:e,bytesRead:t,lastModified:n.toISOString(),sessionContext:i})}async handleFileChange(e){let{filePath:t,changeType:n,stat:i}=e;if(this.shouldSkipFile(t))return;let a=this.usesJsonFormat();n===`rotated`&&await s.request(r.delete,{filePath:t}).catch(()=>{});let o=await P(t,a,e,e=>this.trackFileChange(e));if(o===`retry`)return;let c=o?.sessionContext!==void 0,l=c?o?.bytesRead??0:0;if(M(o?.lastModified,i.mtime,a,n))return;let u=await this.parseFile(t,a?0:l,this.getMaxRecords());N(this.logPrefix,t,u.errors),this.stats.recordFileProcessed();let d=this.validateRecords(u.records),f=u.bytesRead??0;if(d.length===0){await this.maybeUpdateCursor(t,f,l,i.mtime,a,o?.sessionContext);return}c&&o?.sessionContext?await this.handleIncrementalRead(t,d,o.sessionContext,f,i.mtime,a,l):await this.handleFirstRead(t,d,f,i.mtime,a,l)}trackFileChange(e){let t=this.handleFileChange(e).catch(e=>{console.error(`${this.logPrefix} Error handling file change:`,e instanceof Error?e.message:String(e))});this.watcherTasks.track(t)}async handleFirstRead(e,t,n,r,i,a,o=!0){let s=this.importer.extractSessionContext(t);if(await this.isSessionSkipped(s.adapterSessionId)){await this.maybeUpdateCursor(e,n,a,r,i,this.buildCursorSessionContext(s));return}let c=I(t,s,o,(e,t)=>this.importer.processRecords(e,t),e=>this.queueEvent(e));this.trackImportedSession(s.adapterSessionId),await this.queueCursorUpdate(e,n,a,r,i,this.buildCursorSessionContext(s),c)}trackImportedSession(e){this.stats.recordSessionImported(e)}async handleIncrementalRead(e,t,n,i,a,o,c){if(await this.isSessionSkipped(n.adapterSessionId)){await this.maybeUpdateCursor(e,i,c,a,o,n);return}let l;try{l=this.importer.deserializeState(n.state)}catch(t){console.warn(`${this.logPrefix} Corrupted cursor state for ${e}, deleting cursor and re-importing.`,t instanceof Error?t.message:String(t)),await s.request(r.delete,{filePath:e}).catch(t=>{console.warn(`${this.logPrefix} Failed to delete corrupted cursor for ${e}.`,t instanceof Error?t.message:String(t))}),await F(e,a,o,!0,this.logPrefix,{parseFile:(e,t)=>this.parseFile(e,t),validateRecords:e=>this.validateRecords(e),handleFirstRead:(e,t,n,r,i,a,o)=>this.handleFirstRead(e,t,n,r,i,a,o)});return}let u={adapterSessionId:n.adapterSessionId,model:n.model,cwd:n.cwd,sessionEvent:n.sessionEvent,startedEvent:n.startedEvent,state:l},d=this.importer.processRecords(t,u);if(R(u.state)){await F(e,a,o,!1,this.logPrefix,{parseFile:(e,t)=>this.parseFile(e,t),validateRecords:e=>this.validateRecords(e),handleFirstRead:(e,t,n,r,i,a,o)=>this.handleFirstRead(e,t,n,r,i,a,o)});return}let f=L(d,e=>this.queueEvent(e)),p=z(n,u.state,e=>this.importer.serializeState(e));await this.queueCursorUpdate(e,i,c,a,o,p,f)}async maybeUpdateCursor(e,t,n,r,i,a){(t>n||i)&&await this.updateCursor(e,t,r,a)}async isSessionSkipped(e){return this.managedSessionCache.isSkipped(e,e=>this.importer.isMakaioManaged(e),e=>this.stats.recordSessionSkipped(e))}queueEvent(e){return this.eventQueue.queueEvent(e)}queueCursorUpdate(e,t,n,r,i,a,o=[]){return this.eventQueue.queueAfterEvents(()=>this.maybeUpdateCursor(e,t,n,r,i,a),o)}},H=class extends V{trackingFilePaths=new Set;trackingInactiveCount=new Map;lastSeenMtimeMs=new Map;unsubscribePolled;constructor(e,t){super(e,t)}clearTrackingState(e){this.trackingFilePaths.delete(e),this.trackingInactiveCount.delete(e),this.lastSeenMtimeMs.delete(e)}async persistImportedStatus(e){let{session:t}=await s.request(u.getByLogFilePath,{logFilePath:e});return!t||t.importStatus!==`tracking`||(await s.request(u.updateImportStatus,{sessionId:t.sessionId,importStatus:`imported`})).success?!0:(console.warn(`${this.logPrefix} Failed to persist imported status for ${e}`),!1)}async start(){!this.isEnabled()||this.isRunning()||(await super.start(),this.unsubscribePolled=this.watcher.onPolled(e=>{this.onPollCycle(e).catch(e=>{console.error(`${this.logPrefix} Error handling poll cycle:`,e instanceof Error?e.message:String(e))})}),await this.restorePersistedTrackingState())}async stop(){this.unsubscribePolled?.(),this.unsubscribePolled=void 0,await super.stop()}async dispose(){this.trackingFilePaths.clear(),this.trackingInactiveCount.clear(),this.lastSeenMtimeMs.clear(),await super.dispose()}async handleFileChange(e){let{filePath:t,changeType:n,stat:i}=e;if(this.shouldSkipFile(t))return;let{cursor:a}=await s.request(r.get,{filePath:t});if(!a){await this.discoverNewFile(e);return}n===`modified`&&await this.handleModifiedImportedFile(t,e,i.mtime)}async restorePersistedTrackingState(){this.trackingFilePaths.clear(),this.trackingInactiveCount.clear(),this.lastSeenMtimeMs.clear();try{let{sessions:e}=await s.request(u.listImported,{source:this.config.adapterName,importStatus:`tracking`});for(let t of e){if(t.source!==this.config.adapterName)continue;if(!t.logFilePath){(await s.request(u.updateImportStatus,{sessionId:t.sessionId,importStatus:`imported`})).success||console.warn(`${this.logPrefix} Failed to reset tracking status for session ${t.sessionId}`);continue}let e=this.watcher.getTrackedFileMtimeMs(t.logFilePath);if(e===void 0){(await s.request(u.updateImportStatus,{sessionId:t.sessionId,importStatus:`imported`})).success||console.warn(`${this.logPrefix} Failed to reset tracking status for ${t.logFilePath}`);continue}this.trackingFilePaths.add(t.logFilePath),this.trackingInactiveCount.set(t.logFilePath,0),this.lastSeenMtimeMs.set(t.logFilePath,e)}}catch(e){console.warn(`[DiscoveryOrchestrator] Failed to restore persisted tracking state:`,e instanceof Error?e.message:String(e))}}async discoverNewFile(e){let{filePath:t,stat:n}=e,r=await this.importer.extractDiscoveryMetadata(t);if(!(r.hasMessages??!1)){await this.updateCursor(t,0,n.mtime);return}if(await this.isSessionSkipped(r.adapterSessionId)){await this.updateCursor(t,0,n.mtime);return}let i=this.queueEvent({subject:c.session.discovered,payload:{adapterId:this.config.adapterId,adapterName:this.config.adapterName,adapterSessionId:r.adapterSessionId,model:r.model??null,cwd:r.cwd??null,title:r.title,parentAdapterSessionId:r.parentAdapterSessionId??null,forkPointMessageId:r.forkPointMessageId??null,kind:r.kind??`root`,startedAt:r.startedAt,logFilePath:t}});await this.eventQueue.queueAfterEvents(()=>this.updateCursor(t,0,n.mtime),[i])}async handleModifiedImportedFile(e,t,n){let{session:r}=await s.request(u.getByLogFilePath,{logFilePath:e});if(!r){await this.discoverNewFile(t);return}if(r.source===this.config.adapterName&&!(r.importStatus!==`imported`&&r.importStatus!==`tracking`)){if(await super.handleFileChange(t),r.importStatus===`imported`&&!(await s.request(u.updateImportStatus,{sessionId:r.sessionId,importStatus:`tracking`})).success){console.warn(`${this.logPrefix} Failed to persist tracking status for ${e}`);return}this.trackingFilePaths.add(e),this.lastSeenMtimeMs.set(e,n.getTime()),this.trackingInactiveCount.delete(e),this.watcher.triggerImmediatePoll(e)}}async onPollCycle(e){for(let t of[...this.trackingFilePaths]){if(!e.has(t)){await this.persistImportedStatus(t)&&this.clearTrackingState(t);continue}let n=this.watcher.getTrackedFileMtimeMs(t),r=this.lastSeenMtimeMs.get(t);if(!(n===void 0||r===void 0))try{if(n===r){let e=(this.trackingInactiveCount.get(t)??0)+1;e>=3?await this.persistImportedStatus(t)&&this.clearTrackingState(t):this.trackingInactiveCount.set(t,e)}else this.lastSeenMtimeMs.set(t,n),this.trackingInactiveCount.delete(t)}catch(e){console.warn(`${this.logPrefix} Failed to process tracked file ${t}:`,e instanceof Error?e.message:String(e))}}}};export{V as BaseLogOrchestrator,H as DiscoveryOrchestrator,p as parseJsonlFile,m as readFirstJsonlRecords,h as someJsonlRecord};
|
|
4
|
+
`);i=a.pop()??``;for(let e of a){let n=e.trim();if(n!==``)try{if(t(JSON.parse(n)))return!0}catch{}}}return!1}finally{n&&await n.close()}}function g(e,t){try{return{success:!0,record:JSON.parse(e)}}catch(n){return{success:!1,error:{line:t,error:n instanceof Error?n.message:String(n),content:_(e)}}}}function _(e){return e.length<=200?e:e.slice(0,200)+`...`}async function v(e,t){let n=0,r=Buffer.alloc(f),i=0;for(;i<t;){let a=Math.min(f,t-i),{bytesRead:o}=await e.read(r,0,a,i);if(o===0)break;for(let e=0;e<o;e++)r[e]===10&&n++;i+=o}return n}var y=e(t(((e,t)=>{var n=Object.prototype.hasOwnProperty,r=`~`;function i(){}Object.create&&(i.prototype=Object.create(null),new i().__proto__||(r=!1));function a(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(e,t,n,i,o){if(typeof n!=`function`)throw TypeError(`The listener must be a function`);var s=new a(n,i||e,o),c=r?r+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],s]:e._events[c].push(s):(e._events[c]=s,e._eventsCount++),e}function s(e,t){--e._eventsCount===0?e._events=new i:delete e._events[t]}function c(){this._events=new i,this._eventsCount=0}c.prototype.eventNames=function(){var e=[],t,i;if(this._eventsCount===0)return e;for(i in t=this._events)n.call(t,i)&&e.push(r?i.slice(1):i);return Object.getOwnPropertySymbols?e.concat(Object.getOwnPropertySymbols(t)):e},c.prototype.listeners=function(e){var t=r?r+e:e,n=this._events[t];if(!n)return[];if(n.fn)return[n.fn];for(var i=0,a=n.length,o=Array(a);i<a;i++)o[i]=n[i].fn;return o},c.prototype.listenerCount=function(e){var t=r?r+e:e,n=this._events[t];return n?n.fn?1:n.length:0},c.prototype.emit=function(e,t,n,i,a,o){var s=r?r+e:e;if(!this._events[s])return!1;var c=this._events[s],l=arguments.length,u,d;if(c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),l){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,i),!0;case 5:return c.fn.call(c.context,t,n,i,a),!0;case 6:return c.fn.call(c.context,t,n,i,a,o),!0}for(d=1,u=Array(l-1);d<l;d++)u[d-1]=arguments[d];c.fn.apply(c.context,u)}else{var f=c.length,p;for(d=0;d<f;d++)switch(c[d].once&&this.removeListener(e,c[d].fn,void 0,!0),l){case 1:c[d].fn.call(c[d].context);break;case 2:c[d].fn.call(c[d].context,t);break;case 3:c[d].fn.call(c[d].context,t,n);break;case 4:c[d].fn.call(c[d].context,t,n,i);break;default:if(!u)for(p=1,u=Array(l-1);p<l;p++)u[p-1]=arguments[p];c[d].fn.apply(c[d].context,u)}}return!0},c.prototype.on=function(e,t,n){return o(this,e,t,n,!1)},c.prototype.once=function(e,t,n){return o(this,e,t,n,!0)},c.prototype.removeListener=function(e,t,n,i){var a=r?r+e:e;if(!this._events[a])return this;if(!t)return s(this,a),this;var o=this._events[a];if(o.fn)o.fn===t&&(!i||o.once)&&(!n||o.context===n)&&s(this,a);else{for(var c=0,l=[],u=o.length;c<u;c++)(o[c].fn!==t||i&&!o[c].once||n&&o[c].context!==n)&&l.push(o[c]);l.length?this._events[a]=l.length===1?l[0]:l:s(this,a)}return this},c.prototype.removeAllListeners=function(e){var t;return e?(t=r?r+e:e,this._events[t]&&s(this,t)):(this._events=new i,this._eventsCount=0),this},c.prototype.off=c.prototype.removeListener,c.prototype.addListener=c.prototype.on,c.prefixed=r,c.EventEmitter=c,t!==void 0&&(t.exports=c)}))(),1),b=class e extends Error{name=`TimeoutError`;constructor(t,n){super(t,n),Error.captureStackTrace?.(this,e)}};const x=e=>e.reason??new DOMException(`This operation was aborted.`,`AbortError`);function S(e,t){let{milliseconds:n,fallback:r,message:i,customTimers:a={setTimeout,clearTimeout},signal:o}=t,s,c,l=new Promise((t,l)=>{if(typeof n!=`number`||Math.sign(n)!==1)throw TypeError(`Expected \`milliseconds\` to be a positive number, got \`${n}\``);if(o?.aborted){l(x(o));return}if(o&&(c=()=>{l(x(o))},o.addEventListener(`abort`,c,{once:!0})),e.then(t,l),n===1/0)return;let u=new b;s=a.setTimeout.call(void 0,()=>{if(r){try{t(r())}catch(e){l(e)}return}typeof e.cancel==`function`&&e.cancel(),i===!1?t():i instanceof Error?l(i):(u.message=i??`Promise timed out after ${n} milliseconds`,l(u))},n)}).finally(()=>{l.clear(),c&&o&&o.removeEventListener(`abort`,c)});return l.clear=()=>{a.clearTimeout.call(void 0,s),s=void 0},l}function C(e,t,n){let r=0,i=e.length;for(;i>0;){let a=Math.trunc(i/2),o=r+a;n(e[o],t)<=0?(r=++o,i-=a+1):i=a}return r}var w=class{#e=[];#t=0;enqueue(e,t){let{priority:n=0,id:r}=t??{},{size:i}=this,a={priority:n,id:r,run:e};if(i===0){this.#e.length=0,this.#t=0,this.#e.push(a);return}if(this.#e.at(-1).priority>=n){this.#e.push(a);return}this.#n();let o=C(this.#e,a,(e,t)=>t.priority-e.priority);this.#e.splice(o,0,a)}setPriority(e,t){let n=this.#e.findIndex((t,n)=>n>=this.#t&&t.id===e);if(n===-1)throw ReferenceError(`No promise function with the id "${e}" exists in the queue.`);let[r]=this.#e.splice(n,1);this.enqueue(r.run,{priority:t,id:e})}remove(e){let t=this.#e.findIndex((t,n)=>n<this.#t?!1:typeof e==`string`?t.id===e:t.run===e);t!==-1&&this.#e.splice(t,1)}dequeue(){if(this.#t===this.#e.length)return;let e=this.#e[this.#t];return this.#t++,this.#t===this.#e.length?(this.#e.length=0,this.#t=0):this.#t>100&&this.#t>this.#e.length/2&&this.#n(),e?.run}filter(e){let t=[];for(let n=this.#t;n<this.#e.length;n++){let r=this.#e[n];r.priority===e.priority&&t.push(r.run)}return t}get size(){return this.#e.length-this.#t}#n(){this.#t!==0&&(this.#e.splice(0,this.#t),this.#t=0)}},T=class extends y.default{#e;#t;#n=0;#r;#i=!1;#a=!1;#o;#s=0;#c=0;#l;#u;#d;#f=[];#p=0;#m;#h;#g=0;#_;#v;#y=1n;#b=new Map;#x=new Set;timeout;constructor(e){if(super(),e={carryoverIntervalCount:!1,intervalCap:1/0,interval:0,concurrency:1/0,autoStart:!0,queueClass:w,strict:!1,...e},!(typeof e.intervalCap==`number`&&e.intervalCap>=1))throw TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${e.intervalCap?.toString()??``}\` (${typeof e.intervalCap})`);if(e.interval===void 0||!(Number.isFinite(e.interval)&&e.interval>=0))throw TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${e.interval?.toString()??``}\` (${typeof e.interval})`);if(e.strict&&e.interval===0)throw TypeError("The `strict` option requires a non-zero `interval`");if(e.strict&&e.intervalCap===1/0)throw TypeError("The `strict` option requires a finite `intervalCap`");if(this.#e=e.carryoverIntervalCount??e.carryoverConcurrencyCount??!1,this.#t=e.intervalCap===1/0||e.interval===0,this.#r=e.intervalCap,this.#o=e.interval,this.#d=e.strict,this.#m=new e.queueClass,this.#h=e.queueClass,this.concurrency=e.concurrency,e.timeout!==void 0&&!(Number.isFinite(e.timeout)&&e.timeout>0))throw TypeError(`Expected \`timeout\` to be a positive finite number, got \`${e.timeout}\` (${typeof e.timeout})`);this.timeout=e.timeout,this.#v=e.autoStart===!1,this.#z()}#S(e){for(;this.#p<this.#f.length;){let t=this.#f[this.#p];if(t!==void 0&&e-t>=this.#o)this.#p++;else break}(this.#p>100&&this.#p>this.#f.length/2||this.#p===this.#f.length)&&(this.#f=this.#f.slice(this.#p),this.#p=0)}#C(e){this.#d?this.#f.push(e):this.#n++}#w(){this.#d?this.#f.length>this.#p&&this.#f.pop():this.#n>0&&this.#n--}#T(){return this.#f.length-this.#p}get#E(){return this.#t?!0:this.#d?this.#T()<this.#r:this.#n<this.#r}get#D(){return this.#g<this.#_}#O(){this.#g--,this.#g===0&&this.emit(`pendingZero`),this.#P(),this.emit(`next`)}#k(){this.#u=void 0,this.#I(),this.#F()}#A(e){if(this.#d){if(this.#S(e),this.#T()>=this.#r){let t=this.#f[this.#p],n=this.#o-(e-t);return this.#j(n),!0}return!1}if(this.#l===void 0){let t=this.#s-e;if(t<0){if(this.#c>0){let t=e-this.#c;if(t<this.#o)return this.#j(this.#o-t),!0}this.#n=this.#e?this.#g:0}else return this.#j(t),!0}return!1}#j(e){this.#u===void 0&&(this.#u=setTimeout(()=>{this.#k()},e))}#M(){this.#l&&=(clearInterval(this.#l),void 0)}#N(){this.#u&&=(clearTimeout(this.#u),void 0)}#P(){if(this.#m.size===0){if(this.#M(),this.emit(`empty`),this.#g===0){if(this.#N(),this.#d&&this.#p>0){let e=Date.now();this.#S(e)}this.emit(`idle`)}return!1}let e=!1;if(!this.#v){let t=Date.now(),n=!this.#A(t);if(this.#E&&this.#D){let r=this.#m.dequeue();this.#t||(this.#C(t),this.#B()),this.emit(`active`),r(),n&&this.#F(),e=!0}}return e}#F(){this.#t||this.#l!==void 0||this.#d||(this.#l=setInterval(()=>{this.#I()},this.#o),this.#s=Date.now()+this.#o)}#I(){this.#d||(this.#n===0&&this.#g===0&&this.#l&&this.#M(),this.#n=this.#e?this.#g:0),this.#L(),this.#B()}#L(){for(;this.#P(););}get concurrency(){return this.#_}set concurrency(e){if(!(typeof e==`number`&&e>=1))throw TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${e}\` (${typeof e})`);this.#_=e,this.#L()}setPriority(e,t){if(typeof t!=`number`||!Number.isFinite(t))throw TypeError(`Expected \`priority\` to be a finite number, got \`${t}\` (${typeof t})`);this.#m.setPriority(e,t)}async add(e,t={}){return t={timeout:this.timeout,...t,id:t.id??(this.#y++).toString()},new Promise((n,r)=>{let i=Symbol(`task-${t.id}`),a=()=>void 0,o=async()=>{a(),this.#g++,this.#b.set(i,{id:t.id,priority:t.priority??0,startTime:Date.now(),timeout:t.timeout});let o;try{try{t.signal?.throwIfAborted()}catch(e){throw this.#V(),this.#b.delete(i),e}this.#c=Date.now();let r=e({signal:t.signal});if(t.timeout&&(r=S(Promise.resolve(r),{milliseconds:t.timeout,message:`Task timed out after ${t.timeout}ms (queue has ${this.#g} running, ${this.#m.size} waiting)`})),t.signal){let{signal:e}=t;r=Promise.race([r,new Promise((t,n)=>{o=()=>{n(e.reason)},e.addEventListener(`abort`,o,{once:!0})})])}let a=await r;n(a),this.emit(`completed`,a)}catch(e){r(e),this.emit(`error`,e)}finally{o&&t.signal?.removeEventListener(`abort`,o),this.#b.delete(i),queueMicrotask(()=>{this.#O()})}};this.#m.enqueue(o,t);let s=()=>{if(this.#m instanceof w){this.#m.remove(o);return}this.#m.remove?.(t.id)};if(t.signal){let{signal:e}=t,n=()=>{a(),s(),r(e.reason),this.#P(),this.emit(`next`)};if(a=()=>{e.removeEventListener(`abort`,n),this.#x.delete(a)},e.aborted){n();return}e.addEventListener(`abort`,n,{once:!0}),this.#x.add(a)}this.emit(`add`),this.#P()})}async addAll(e,t){return Promise.all(e.map(async e=>this.add(e,t)))}start(){return this.#v?(this.#v=!1,this.#L(),this):this}pause(){this.#v=!0}clear(){for(let e of this.#x)e();this.#m=new this.#h,this.#M(),this.#H(),this.emit(`empty`),this.#g===0&&(this.#N(),this.emit(`idle`)),this.emit(`next`)}async onEmpty(){this.#m.size!==0&&await this.#R(`empty`)}async onSizeLessThan(e){this.#m.size<e||await this.#R([`next`,`active`],()=>this.#m.size<e)}async onIdle(){this.#g===0&&this.#m.size===0||await this.#R(`idle`)}async onPendingZero(){this.#g!==0&&await this.#R(`pendingZero`)}async onRateLimit(){this.isRateLimited||await this.#R(`rateLimit`)}async onRateLimitCleared(){this.isRateLimited&&await this.#R(`rateLimitCleared`)}onError(){return new Promise((e,t)=>{let n=e=>{this.off(`error`,n),t(e)};this.on(`error`,n)})}async#R(e,t){let n=Array.isArray(e)?e:[e];return new Promise(e=>{let r=()=>{if(!(t&&!t())){for(let e of n)this.off(e,r);e()}};for(let e of n)this.on(e,r)})}get size(){return this.#m.size}sizeBy(e){return this.#m.filter(e).length}get pending(){return this.#g}get isPaused(){return this.#v}#z(){this.#t||(this.on(`add`,()=>{this.#m.size>0&&this.#B()}),this.on(`next`,()=>{this.#B()}))}#B(){this.#t||this.#a||(this.#a=!0,queueMicrotask(()=>{this.#a=!1,this.#H()}))}#V(){this.#t||(this.#w(),this.#B())}#H(){let e=this.#i;if(this.#t||this.#m.size===0){e&&(this.#i=!1,this.emit(`rateLimitCleared`));return}let t;if(this.#d){let e=Date.now();this.#S(e),t=this.#T()}else t=this.#n;let n=t>=this.#r;n!==e&&(this.#i=n,this.emit(n?`rateLimit`:`rateLimitCleared`))}get isRateLimited(){return this.#i}get isSaturated(){return this.#g===this.#_&&this.#m.size>0||this.isRateLimited&&this.#m.size>0}get runningTasks(){return[...this.#b.values()].map(e=>({...e,timeoutRemaining:e.timeout?Math.max(0,e.startTime+e.timeout-Date.now()):void 0}))}},E=class{eventQueue;cursorQueue;onEventEmitted;constructor(e){this.onEventEmitted=e.onEventEmitted,this.eventQueue=new T({concurrency:1,interval:1e3,intervalCap:e.eventsPerSecond}),this.cursorQueue=new T({concurrency:1})}queueEvent(e){return this.eventQueue.add(async()=>{await s.emit(e.subject,e.payload),this.onEventEmitted()})}queueAfterEvents(e,t=[]){let n=Promise.all(t);return n.catch(()=>void 0),this.cursorQueue.add(async()=>{await n,await e()})}async drain(){await Promise.all([this.eventQueue.onIdle(),this.cursorQueue.onIdle()])}async onIdle(){await this.drain()}},D=class{options;emittery=new n;trackedFiles=new Map;pollTimer;isPolling=!1;isDisposed=!1;inFlightChecks=new Map;constructor(e){if(!o.isAbsolute(e.directory))throw Error(`Directory must be an absolute path: ${e.directory}`);this.options={directory:e.directory,pattern:e.pattern,pollIntervalMs:e.pollIntervalMs??1e4}}on(e,t){return this.emittery.on(e,t)}once(e,t){return this.emittery.once(e,t)}async start(){this.isDisposed||this.pollTimer===void 0&&(await this.poll(),this.pollTimer=setInterval(()=>{this.poll()},this.options.pollIntervalMs))}stop(){this.pollTimer!==void 0&&(clearInterval(this.pollTimer),this.pollTimer=void 0)}dispose(){this.isDisposed=!0,this.stop(),this.emittery.clearListeners(),this.trackedFiles.clear(),this.inFlightChecks.clear()}isRunning(){return this.pollTimer!==void 0}getTrackedFiles(){return this.trackedFiles}seedFromCursors(e){for(let t of e)this.trackedFiles.set(t.filePath,{size:t.bytesRead,mtimeMs:new Date(t.lastModified).getTime()})}async poll(){if(!this.isDisposed&&!this.isPolling){this.isPolling=!0;try{let e=await this.discoverFiles(),t=new Set(e);for(let e of this.trackedFiles.keys())if(!t.has(e)){if(this.isDisposed)return;this.trackedFiles.delete(e),await this.emittery.emit(`deleted`,{filePath:e})}for(let t of e)try{await this.runFileCheck(t)}catch(e){await this.emitWatcherError(e,t)}if(this.isDisposed)return;await this.emittery.emit(`polled`,{trackedFilePaths:new Set(this.trackedFiles.keys())})}catch(e){await this.emitWatcherError(e)}finally{this.isPolling=!1}}}async discoverFiles(){return i(this.options.pattern,{cwd:this.options.directory,absolute:!0,onlyFiles:!0})}async checkFile(e){if(this.isDisposed)return;let t=await a.stat(e);if(this.isDisposed)return;let n={size:t.size,mtimeMs:t.mtimeMs},r=this.trackedFiles.get(e);if(!r){if(this.trackedFiles.set(e,n),this.isDisposed){this.trackedFiles.delete(e);return}await this.emittery.emit(`change`,{filePath:e,stat:{size:t.size,mtime:t.mtime},changeType:`created`});return}if(n.mtimeMs!==r.mtimeMs){let i=n.size<r.size?`rotated`:`modified`;if(this.trackedFiles.set(e,n),this.isDisposed)return;await this.emittery.emit(`change`,{filePath:e,stat:{size:t.size,mtime:t.mtime},changeType:i})}}clearTrackedFile(e){return this.trackedFiles.delete(e)}clearAllTrackedFiles(){this.trackedFiles.clear()}triggerImmediatePoll(e){this.runFileCheck(e).catch(t=>{this.emitWatcherError(t,e)})}async runFileCheck(e){if(this.isDisposed)return;let t=this.inFlightChecks.get(e);if(t){await t;return}let n=(async()=>{try{await this.checkFile(e)}finally{this.inFlightChecks.delete(e)}})();this.inFlightChecks.set(e,n),await n}async emitWatcherError(e,t){let n=e instanceof Error?e:Error(String(e));try{await this.emittery.emit(`error`,{error:n,filePath:t})}catch(e){console.error(`[LogFileWatcher] Error listener failed:`,e instanceof Error?e.message:String(e))}}},O=class{watcher;constructor(e){this.watcher=new D(e)}isRunning(){return this.watcher.isRunning()}async start(){await this.watcher.start()}stop(){this.watcher.stop()}dispose(){this.watcher.dispose()}onChange(e){return this.watcher.on(`change`,e)}onError(e){return this.watcher.on(`error`,e)}onDeleted(e){return this.watcher.on(`deleted`,e)}onPolled(e){return this.watcher.on(`polled`,({trackedFilePaths:t})=>e(t))}getTrackedFileMtimeMs(e){return this.watcher.getTrackedFiles().get(e)?.mtimeMs}triggerImmediatePoll(e){this.watcher.triggerImmediatePoll(e)}seedFromCursors(e){this.watcher.seedFromCursors(e)}},k=class{filesProcessed=0;eventsEmitted=0;sessionsImported=new Set;sessionsSkipped=new Set;lastLoggedEventCount=0;lastLoggedSnapshot=``;reset(){this.filesProcessed=0,this.eventsEmitted=0,this.sessionsImported.clear(),this.sessionsSkipped.clear(),this.lastLoggedEventCount=0,this.lastLoggedSnapshot=``}recordFileProcessed(){this.filesProcessed++}recordEventEmitted(e){this.eventsEmitted++,!(this.eventsEmitted-this.lastLoggedEventCount<1e3)&&(console.info(`${e} Imported ${this.eventsEmitted} events (${this.sessionsImported.size} sessions)...`),this.lastLoggedEventCount=this.eventsEmitted)}recordSessionImported(e){this.sessionsImported.add(e)}recordSessionSkipped(e){this.sessionsSkipped.add(e)}hasActivity(){return this.eventsEmitted>0||this.filesProcessed>0}stoppedMessage(e){return`${e} Stopped - ${this.eventsEmitted} events from ${this.sessionsImported.size} sessions (${this.sessionsSkipped.size} skipped)`}logProgress(e){if(!this.hasActivity())return;let t=JSON.stringify({eventsEmitted:this.eventsEmitted,filesProcessed:this.filesProcessed,sessionsImported:this.sessionsImported.size,sessionsSkipped:this.sessionsSkipped.size});t!==this.lastLoggedSnapshot&&(this.lastLoggedSnapshot=t,console.info(`${e} Progress: ${this.eventsEmitted} events, ${this.sessionsImported.size} sessions, ${this.filesProcessed} files, ${this.sessionsSkipped.size} skipped`))}};function A(e){return async t=>{try{if(e!==void 0)try{let n=await s.requestOptional(l.runtime.isAdapterManaged,{adapterSessionId:t,clientId:e});if(n.handled&&n.data.managed)return!0}catch{}let n=await s.request(d.getByAdapterSessionId,{adapterSessionId:t});return n.session!==null&&!n.session.isImported}catch{return!1}}}var j=class{checkedSessions=new Map;inFlight=new Map;generations=new Map;async isSkipped(e,t,n){for(;;){let r=this.checkedSessions.get(e);if(r!==void 0)return r;let i=this.generations.get(e)??0,a=this.inFlight.get(e),o;if(a&&a.generation===i?o=a.promise:(o=t(e).then(t=>((this.generations.get(e)??0)===i&&(this.checkedSessions.set(e,t),t&&n(e)),t)).finally(()=>{let t=this.inFlight.get(e);t&&t.generation===i&&this.inFlight.delete(e)}),this.inFlight.set(e,{generation:i,promise:o})),await o,(this.generations.get(e)??0)===i){let t=this.checkedSessions.get(e);if(t!==void 0)return t;continue}}}invalidate(e){this.checkedSessions.delete(e),this.inFlight.delete(e),this.generations.set(e,(this.generations.get(e)??0)+1)}clear(){this.checkedSessions.clear(),this.inFlight.clear(),this.generations.clear()}};function M(e,t,n,r){return!n||!e||r===`rotated`?!1:new Date(e)>=t}function N(e,t,n){for(let r of n??[]){let n=r.line===void 0?``:` at line ${r.line}`;console.warn(`${e} Parse error in ${t}${n}: ${r.error}`)}}async function P(e,t,n,i){let{cursor:a}=await s.request(r.get,{filePath:e});return a&&a.bytesRead>0&&!a.sessionContext&&!t?(await s.request(r.delete,{filePath:e}).catch(()=>{}),i(n),`retry`):a}async function F(e,t,n,r,i,a){let o=await a.parseFile(e,0);N(i,e,o.errors);let s=a.validateRecords(o.records);s.length>0&&await a.handleFirstRead(e,s,o.bytesRead??0,t,n,0,r)}function I(e,t,n,r,i){let a=[];n&&(a.push(i(t.sessionEvent)),a.push(i(t.startedEvent)));let o=r(e,t);for(let e of o)a.push(i(e));return a}function L(e,t){let n=[];for(let r of e)n.push(t(r));return n}function R(e){return typeof e==`object`&&!!e&&`compactionDetected`in e&&e.compactionDetected===!0}function z(e,t,n){return{...e,state:n(t)}}var B=class{tasks=new Set;track(e){this.tasks.add(e),e.finally(()=>{this.tasks.delete(e)})}async drain(){for(;this.tasks.size>0;)await Promise.allSettled([...this.tasks])}},V=class{config;watcher;eventQueue;importer;managedSessionCache=new j;unsubscribeChange;unsubscribeError;unsubscribeDeleted;unsubscribeRuntimeStarted;stats=new k;watcherTasks=new B;progressTimer;constructor(e,t){this.importer=t;let n=e.directory??t.getLogDirectory();this.config={enabled:e.enabled,directory:e.directory,pollIntervalMs:e.pollIntervalMs??1e4,eventsPerSecond:e.eventsPerSecond??100,adapterId:e.adapterId,adapterName:e.adapterName,checkMakaioManaged:e.checkMakaioManaged,clientId:e.clientId,machineId:e.machineId},this.watcher=new O({directory:n,pattern:this.getLogFilePattern(),pollIntervalMs:this.config.pollIntervalMs}),this.eventQueue=new E({eventsPerSecond:this.config.eventsPerSecond,onEventEmitted:()=>{this.stats.recordEventEmitted(this.logPrefix)}})}shouldSkipFile(e){return!1}validateRecords(e){return e}getMaxRecords(){}buildCursorSessionContext(e){let{adapterSessionId:t,sessionEvent:n,startedEvent:r,state:i,...a}=e;return{...a,adapterSessionId:t,sessionEvent:n,startedEvent:r,state:this.importer.serializeState(i)}}usesJsonFormat(){let e=this.getLogFilePattern();return e.includes(`.json`)&&!e.includes(`.jsonl`)}isEnabled(){return this.config.enabled}isRunning(){return this.watcher.isRunning()}async start(){if(!this.config.enabled||this.isRunning())return;let e=this.config.directory??this.importer.getLogDirectory();console.info(`${this.logPrefix} Starting - watching ${e}`),this.stats.reset(),this.managedSessionCache.clear(),this.progressTimer=setInterval(()=>this.stats.logProgress(this.logPrefix),1e4),this.unsubscribeChange=this.watcher.onChange(e=>{this.trackFileChange(e)}),this.unsubscribeError=this.watcher.onError(({error:e,filePath:t})=>{console.warn(`${this.logPrefix} Error${t?` for ${t}`:``}: ${e.message}`)}),this.unsubscribeDeleted=this.watcher.onDeleted(({filePath:e})=>{this.watcherTasks.track(s.request(r.delete,{filePath:e}).then(()=>void 0).catch(()=>{}))}),this.unsubscribeRuntimeStarted=s.on(l.runtime.started,e=>{e.payload.source.layer===`adapter`&&e.payload.adapterSessionId!==void 0&&this.managedSessionCache.invalidate(e.payload.adapterSessionId)}),await this.watcher.start()}async stop(){this.progressTimer&&=(clearInterval(this.progressTimer),void 0),this.unsubscribeChange?.(),this.unsubscribeError?.(),this.unsubscribeDeleted?.(),this.unsubscribeRuntimeStarted?.(),this.unsubscribeChange=void 0,this.unsubscribeError=void 0,this.unsubscribeDeleted=void 0,this.unsubscribeRuntimeStarted=void 0,this.watcher.stop(),await this.watcherTasks.drain(),await this.eventQueue.drain(),this.stats.hasActivity()&&console.info(this.stats.stoppedMessage(this.logPrefix))}async dispose(){await this.stop(),this.watcher.dispose(),this.managedSessionCache.clear()}static createDefaultCheckMakaioManaged(e){return A(e)}async updateCursor(e,t,n,i){await s.request(r.set,{filePath:e,bytesRead:t,lastModified:n.toISOString(),sessionContext:i})}async handleFileChange(e){let{filePath:t,changeType:n,stat:i}=e;if(this.shouldSkipFile(t))return;let a=this.usesJsonFormat();n===`rotated`&&await s.request(r.delete,{filePath:t}).catch(()=>{});let o=await P(t,a,e,e=>this.trackFileChange(e));if(o===`retry`)return;let c=o?.sessionContext!==void 0,l=c?o?.bytesRead??0:0;if(M(o?.lastModified,i.mtime,a,n))return;let u=await this.parseFile(t,a?0:l,this.getMaxRecords());N(this.logPrefix,t,u.errors),this.stats.recordFileProcessed();let d=this.validateRecords(u.records),f=u.bytesRead??0;if(d.length===0){await this.maybeUpdateCursor(t,f,l,i.mtime,a,o?.sessionContext);return}c&&o?.sessionContext?await this.handleIncrementalRead(t,d,o.sessionContext,f,i.mtime,a,l):await this.handleFirstRead(t,d,f,i.mtime,a,l)}trackFileChange(e){let t=this.handleFileChange(e).catch(e=>{console.error(`${this.logPrefix} Error handling file change:`,e instanceof Error?e.message:String(e))});this.watcherTasks.track(t)}async handleFirstRead(e,t,n,r,i,a,o=!0){let s=this.importer.extractSessionContext(t);if(await this.isSessionSkipped(s.adapterSessionId)){await this.maybeUpdateCursor(e,n,a,r,i,this.buildCursorSessionContext(s));return}let c=I(t,s,o,(e,t)=>this.importer.processRecords(e,t),e=>this.queueEvent(e));this.trackImportedSession(s.adapterSessionId),await this.queueCursorUpdate(e,n,a,r,i,this.buildCursorSessionContext(s),c)}trackImportedSession(e){this.stats.recordSessionImported(e)}async handleIncrementalRead(e,t,n,i,a,o,c){if(await this.isSessionSkipped(n.adapterSessionId)){await this.maybeUpdateCursor(e,i,c,a,o,n);return}let l;try{l=this.importer.deserializeState(n.state)}catch(t){console.warn(`${this.logPrefix} Corrupted cursor state for ${e}, deleting cursor and re-importing.`,t instanceof Error?t.message:String(t)),await s.request(r.delete,{filePath:e}).catch(t=>{console.warn(`${this.logPrefix} Failed to delete corrupted cursor for ${e}.`,t instanceof Error?t.message:String(t))}),await F(e,a,o,!0,this.logPrefix,{parseFile:(e,t)=>this.parseFile(e,t),validateRecords:e=>this.validateRecords(e),handleFirstRead:(e,t,n,r,i,a,o)=>this.handleFirstRead(e,t,n,r,i,a,o)});return}let u={adapterSessionId:n.adapterSessionId,model:n.model,cwd:n.cwd,sessionEvent:n.sessionEvent,startedEvent:n.startedEvent,state:l},d=this.importer.processRecords(t,u);if(R(u.state)){await F(e,a,o,!1,this.logPrefix,{parseFile:(e,t)=>this.parseFile(e,t),validateRecords:e=>this.validateRecords(e),handleFirstRead:(e,t,n,r,i,a,o)=>this.handleFirstRead(e,t,n,r,i,a,o)});return}let f=L(d,e=>this.queueEvent(e)),p=z(n,u.state,e=>this.importer.serializeState(e));await this.queueCursorUpdate(e,i,c,a,o,p,f)}async maybeUpdateCursor(e,t,n,r,i,a){(t>n||i)&&await this.updateCursor(e,t,r,a)}async isSessionSkipped(e){return this.managedSessionCache.isSkipped(e,e=>this.importer.isMakaioManaged(e),e=>this.stats.recordSessionSkipped(e))}queueEvent(e){return this.eventQueue.queueEvent(e)}queueCursorUpdate(e,t,n,r,i,a,o=[]){return this.eventQueue.queueAfterEvents(()=>this.maybeUpdateCursor(e,t,n,r,i,a),o)}},H=class extends V{trackingFilePaths=new Set;trackingInactiveCount=new Map;lastSeenMtimeMs=new Map;unsubscribePolled;constructor(e,t){super(e,t)}clearTrackingState(e){this.trackingFilePaths.delete(e),this.trackingInactiveCount.delete(e),this.lastSeenMtimeMs.delete(e)}async persistImportedStatus(e){let{session:t}=await s.request(u.getByLogFilePath,{logFilePath:e});return!t||t.importStatus!==`tracking`||(await s.request(u.updateImportStatus,{sessionId:t.sessionId,importStatus:`imported`})).success?!0:(console.warn(`${this.logPrefix} Failed to persist imported status for ${e}`),!1)}async start(){!this.isEnabled()||this.isRunning()||(await super.start(),this.unsubscribePolled=this.watcher.onPolled(e=>{this.onPollCycle(e).catch(e=>{console.error(`${this.logPrefix} Error handling poll cycle:`,e instanceof Error?e.message:String(e))})}),await this.restorePersistedTrackingState())}async stop(){this.unsubscribePolled?.(),this.unsubscribePolled=void 0,await super.stop()}async dispose(){this.trackingFilePaths.clear(),this.trackingInactiveCount.clear(),this.lastSeenMtimeMs.clear(),await super.dispose()}async handleFileChange(e){let{filePath:t,changeType:n,stat:i}=e;if(this.shouldSkipFile(t))return;let{cursor:a}=await s.request(r.get,{filePath:t});if(!a){await this.discoverNewFile(e);return}n===`modified`&&await this.handleModifiedImportedFile(t,e,i.mtime)}async restorePersistedTrackingState(){this.trackingFilePaths.clear(),this.trackingInactiveCount.clear(),this.lastSeenMtimeMs.clear();try{let{sessions:e}=await s.request(u.listImported,{source:this.config.adapterName,importStatus:`tracking`});for(let t of e){if(t.source!==this.config.adapterName)continue;if(!t.logFilePath){(await s.request(u.updateImportStatus,{sessionId:t.sessionId,importStatus:`imported`})).success||console.warn(`${this.logPrefix} Failed to reset tracking status for session ${t.sessionId}`);continue}let e=this.watcher.getTrackedFileMtimeMs(t.logFilePath);if(e===void 0){(await s.request(u.updateImportStatus,{sessionId:t.sessionId,importStatus:`imported`})).success||console.warn(`${this.logPrefix} Failed to reset tracking status for ${t.logFilePath}`);continue}this.trackingFilePaths.add(t.logFilePath),this.trackingInactiveCount.set(t.logFilePath,0),this.lastSeenMtimeMs.set(t.logFilePath,e)}}catch(e){console.warn(`[DiscoveryOrchestrator] Failed to restore persisted tracking state:`,e instanceof Error?e.message:String(e))}}async discoverNewFile(e){let{filePath:t,stat:n}=e,r=await this.importer.extractDiscoveryMetadata(t);if(!(r.hasMessages??!1)){await this.updateCursor(t,0,n.mtime);return}if(await this.isSessionSkipped(r.adapterSessionId)){await this.updateCursor(t,0,n.mtime);return}let i=this.queueEvent({subject:c.session.discovered,payload:{adapterId:this.config.adapterId,adapterName:this.config.adapterName,adapterSessionId:r.adapterSessionId,model:r.model??null,cwd:r.cwd??null,title:r.title,parentAdapterSessionId:r.parentAdapterSessionId??null,forkPointMessageId:r.forkPointMessageId??null,kind:r.kind??`root`,startedAt:r.startedAt,logFilePath:t}});await this.eventQueue.queueAfterEvents(()=>this.updateCursor(t,0,n.mtime),[i])}async handleModifiedImportedFile(e,t,n){let{session:r}=await s.request(u.getByLogFilePath,{logFilePath:e});if(!r){await this.discoverNewFile(t);return}if(r.source===this.config.adapterName&&!(r.importStatus!==`imported`&&r.importStatus!==`tracking`)){if(await super.handleFileChange(t),r.importStatus===`imported`&&!(await s.request(u.updateImportStatus,{sessionId:r.sessionId,importStatus:`tracking`})).success){console.warn(`${this.logPrefix} Failed to persist tracking status for ${e}`);return}this.trackingFilePaths.add(e),this.lastSeenMtimeMs.set(e,n.getTime()),this.trackingInactiveCount.delete(e),this.watcher.triggerImmediatePoll(e)}}async onPollCycle(e){for(let t of[...this.trackingFilePaths]){if(!e.has(t)){await this.persistImportedStatus(t)&&this.clearTrackingState(t);continue}let n=this.watcher.getTrackedFileMtimeMs(t),r=this.lastSeenMtimeMs.get(t);if(!(n===void 0||r===void 0))try{if(n===r){let e=(this.trackingInactiveCount.get(t)??0)+1;e>=3?await this.persistImportedStatus(t)&&this.clearTrackingState(t):this.trackingInactiveCount.set(t,e)}else this.lastSeenMtimeMs.set(t,n),this.trackingInactiveCount.delete(t)}catch(e){console.warn(`${this.logPrefix} Failed to process tracked file ${t}:`,e instanceof Error?e.message:String(e))}}}};export{V as BaseLogOrchestrator,H as DiscoveryOrchestrator,p as parseJsonlFile,m as readFirstJsonlRecords,h as someJsonlRecord};
|