openmeld 0.3.76 → 0.3.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/README.md +7 -0
  2. package/dist/{add-me-membership-C_dCTz9h.js → add-me-membership-BP7P_X-r.js} +2 -2
  3. package/dist/{add-me-membership-C_dCTz9h.js.map → add-me-membership-BP7P_X-r.js.map} +1 -1
  4. package/dist/{api-client-foundation-CO_4tB8y.js → api-client-foundation-jjwUa25Q.js} +4 -4
  5. package/dist/{api-client-foundation-CO_4tB8y.js.map → api-client-foundation-jjwUa25Q.js.map} +1 -1
  6. package/dist/{auth-session-BZgsNHJA.js → auth-session-BOKcW_84.js} +3 -3
  7. package/dist/{auth-session-BZgsNHJA.js.map → auth-session-BOKcW_84.js.map} +1 -1
  8. package/dist/{base-url-KfrIdedc.js → base-url-Cv9x5Es9.js} +11 -3
  9. package/dist/base-url-Cv9x5Es9.js.map +1 -0
  10. package/dist/{command-Bn3Sm1p8.js → command-Pj7c1mH5.js} +21164 -18939
  11. package/dist/{command-Bn3Sm1p8.js.map → command-Pj7c1mH5.js.map} +1 -1
  12. package/dist/{daemon-runtime-lease-7AQYjp3h.js → daemon-runtime-lease-CKQef0lp.js} +2 -2
  13. package/dist/{daemon-runtime-lease-7AQYjp3h.js.map → daemon-runtime-lease-CKQef0lp.js.map} +1 -1
  14. package/dist/{dist-nJqZxjtc.js → dist-DtEdipqO.js} +4690 -3965
  15. package/dist/dist-DtEdipqO.js.map +1 -0
  16. package/dist/openmeld-dev.js +1 -1
  17. package/dist/openmeld.js +965 -65
  18. package/dist/openmeld.js.map +1 -1
  19. package/dist/{runtime-transport-Bs6YfTqj.js → runtime-transport-BLEvh9zX.js} +53 -4
  20. package/dist/runtime-transport-BLEvh9zX.js.map +1 -0
  21. package/package.json +5 -3
  22. package/skills/openmeld-cli/SKILL.md +150 -2
  23. package/skills/openmeld-cli/references/commands.md +72 -0
  24. package/dist/base-url-KfrIdedc.js.map +0 -1
  25. package/dist/dist-nJqZxjtc.js.map +0 -1
  26. package/dist/runtime-transport-Bs6YfTqj.js.map +0 -1
package/README.md CHANGED
@@ -103,11 +103,18 @@ openmeld profiles create --name "Build Agent" --kind agent
103
103
  openmeld profiles set <profile-id>
104
104
  openmeld profiles update <profile-id> --name "Build Agent v2"
105
105
  openmeld profiles delete <profile-id> --force
106
+ openmeld profiles create "Review Agent" --kind agent --owner self --session new
107
+ openmeld profiles requests list
108
+ openmeld profiles requests approve <request-id>
109
+ openmeld profiles requests cancel <request-id>
110
+ openmeld profiles requests preferences get
106
111
  ```
107
112
 
108
113
  Each account has one default Human Profile, reused across organizations.
109
114
  Creating additional Human Profiles is available only when OpenMeld explicitly
110
115
  enables that capability; Agent Profile creation remains available.
116
+ Organization requests provide an auditable path for creating an Agent Profile
117
+ for yourself or a teammate under that member's approval preference.
111
118
 
112
119
  ## Spaces
113
120
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { r as runSpaceAddMembers } from "./command-Bn3Sm1p8.js";
3
+ import { r as runSpaceAddMembers } from "./command-Pj7c1mH5.js";
4
4
  //#region src/space/add-me-membership.ts
5
5
  async function runSpaceAddMeMembership(input) {
6
6
  return await runSpaceAddMembers(input);
@@ -8,4 +8,4 @@ async function runSpaceAddMeMembership(input) {
8
8
  //#endregion
9
9
  export { runSpaceAddMeMembership };
10
10
 
11
- //# sourceMappingURL=add-me-membership-C_dCTz9h.js.map
11
+ //# sourceMappingURL=add-me-membership-BP7P_X-r.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-me-membership-C_dCTz9h.js","names":[],"sources":["../src/space/add-me-membership.ts"],"sourcesContent":["import { runSpaceAddMembers } from \"./command\";\nimport type { SpaceCommandNavigationStatus } from \"./navigation-status\";\n\nexport type SpaceAddMeMembershipInput = Parameters<\n typeof runSpaceAddMembers\n>[0];\nexport type SpaceAddMeMembershipRunner = (\n input: SpaceAddMeMembershipInput\n) => Promise<SpaceCommandNavigationStatus>;\n\nexport async function runSpaceAddMeMembership(\n input: SpaceAddMeMembershipInput\n): Promise<SpaceCommandNavigationStatus> {\n return await runSpaceAddMembers(input);\n}\n"],"mappings":";;;;AAUA,eAAsB,wBACpB,OACuC;CACvC,OAAO,MAAM,mBAAmB,KAAK;AACvC"}
1
+ {"version":3,"file":"add-me-membership-BP7P_X-r.js","names":[],"sources":["../src/space/add-me-membership.ts"],"sourcesContent":["import { runSpaceAddMembers } from \"./command\";\nimport type { SpaceCommandNavigationStatus } from \"./navigation-status\";\n\nexport type SpaceAddMeMembershipInput = Parameters<\n typeof runSpaceAddMembers\n>[0];\nexport type SpaceAddMeMembershipRunner = (\n input: SpaceAddMeMembershipInput\n) => Promise<SpaceCommandNavigationStatus>;\n\nexport async function runSpaceAddMeMembership(\n input: SpaceAddMeMembershipInput\n): Promise<SpaceCommandNavigationStatus> {\n return await runSpaceAddMembers(input);\n}\n"],"mappings":";;;;AAUA,eAAsB,wBACpB,OACuC;CACvC,OAAO,MAAM,mBAAmB,KAAK;AACvC"}
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { T as normalizeBaseUrl, hn as __exportAll } from "./base-url-KfrIdedc.js";
4
- import { I as OPENMELD_HEADER_REQUESTED_ORGANIZATION_ID, R as buildOpenMeldRequestContextHeaders, h as createOpenMeldApiClient } from "./dist-nJqZxjtc.js";
5
- import { C as MIN_SPACE_REQUEST_TIMEOUT_MS, a as getAuthSessionState, v as DEFAULT_SPACE_REQUEST_TIMEOUT_MS, x as MAX_SPACE_REQUEST_TIMEOUT_MS } from "./auth-session-BZgsNHJA.js";
3
+ import { T as normalizeBaseUrl, _n as __exportAll } from "./base-url-Cv9x5Es9.js";
4
+ import { I as OPENMELD_HEADER_REQUESTED_ORGANIZATION_ID, R as buildOpenMeldRequestContextHeaders, h as createOpenMeldApiClient } from "./dist-DtEdipqO.js";
5
+ import { C as MIN_SPACE_REQUEST_TIMEOUT_MS, a as getAuthSessionState, v as DEFAULT_SPACE_REQUEST_TIMEOUT_MS, x as MAX_SPACE_REQUEST_TIMEOUT_MS } from "./auth-session-BOKcW_84.js";
6
6
  import crypto from "node:crypto";
7
7
  //#region src/config/auth-request-compatibility.ts
8
8
  function resolveAuthRequestCompatibility(input) {
@@ -381,4 +381,4 @@ function createCliApiClientFoundation(baseUrl, options = {}) {
381
381
  //#endregion
382
382
  export { buildOpenMeldProfileIdentityRequestHeadersWithAuth as a, buildRequestAuthHeaders as c, buildOpenMeldRequestContextFromProfile as d, buildOpenMeldRequestContextFromProfileIdentity as f, resolveSpaceRequestTimeoutMsForDiagnostics as i, canAttachAuthTokenToRequest as l, resolveAuthRequestCompatibility as m, createCliApiClientFoundation as n, buildOpenMeldProfileRequestHeadersWithAuth as o, deriveAuthBaseUrlFromGatewayUrl as p, fetchSpaceRequestWithTimeout as r, buildOpenMeldRequestContextHeadersWithAuth as s, api_client_foundation_exports as t, resolveAuthTokenAttachment as u };
383
383
 
384
- //# sourceMappingURL=api-client-foundation-CO_4tB8y.js.map
384
+ //# sourceMappingURL=api-client-foundation-jjwUa25Q.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client-foundation-CO_4tB8y.js","names":["resolveSpaceRequestTimeoutMsForDiagnostics","resolveSpaceRequestTimeoutMsForCliDiagnostics"],"sources":["../src/config/auth-request-compatibility.ts","../src/config/openmeld-request-context.ts","../src/config/request-headers.ts","../src/space/request-timeout.ts","../src/space/fetch-with-timeout.ts","../src/space/api-client-foundation.ts"],"sourcesContent":["import { normalizeBaseUrl } from \"../protocol/urls\";\nimport type { StoredAuthSession } from \"./auth-session\";\n\nexport type AuthRequestCompatibilityReason =\n | \"invalid_request_url\"\n | \"invalid_auth_url\"\n | \"insecure_transport\"\n | \"host_mismatch\"\n | \"loopback\"\n | \"same_host\"\n | \"gateway_sibling\";\n\nexport type AuthRequestCompatibility = {\n compatible: boolean;\n reason: AuthRequestCompatibilityReason;\n requestHost: string | null;\n authHost: string | null;\n expectedGatewayHost: string | null;\n};\n\nexport function resolveAuthRequestCompatibility(input: {\n session: StoredAuthSession;\n requestUrl: string;\n}): AuthRequestCompatibility {\n const requestUrl = parseUrlOrNull(input.requestUrl);\n if (!requestUrl) {\n return {\n compatible: false,\n reason: \"invalid_request_url\",\n requestHost: null,\n authHost: null,\n expectedGatewayHost: null,\n };\n }\n\n const authBaseUrl = parseUrlOrNull(input.session.authBaseUrl);\n if (!authBaseUrl) {\n return {\n compatible: false,\n reason: \"invalid_auth_url\",\n requestHost: requestUrl.host,\n authHost: null,\n expectedGatewayHost: null,\n };\n }\n\n const expectedGatewayHost = deriveGatewayHost(authBaseUrl);\n const requestHost = requestUrl.host;\n const authHost = authBaseUrl.host;\n\n if (\n isLoopbackHostname(requestUrl.hostname) &&\n isLoopbackHostname(authBaseUrl.hostname)\n ) {\n return {\n compatible: true,\n reason: \"loopback\",\n requestHost,\n authHost,\n expectedGatewayHost,\n };\n }\n\n if (!isSecureTransportProtocol(requestUrl.protocol)) {\n return {\n compatible: false,\n reason: \"insecure_transport\",\n requestHost,\n authHost,\n expectedGatewayHost,\n };\n }\n\n if (requestHost === authHost) {\n return {\n compatible: true,\n reason: \"same_host\",\n requestHost,\n authHost,\n expectedGatewayHost,\n };\n }\n\n if (expectedGatewayHost && requestHost === expectedGatewayHost) {\n return {\n compatible: true,\n reason: \"gateway_sibling\",\n requestHost,\n authHost,\n expectedGatewayHost,\n };\n }\n\n return {\n compatible: false,\n reason: \"host_mismatch\",\n requestHost,\n authHost,\n expectedGatewayHost,\n };\n}\n\nexport function canUseAuthSessionForRequest(input: {\n session: StoredAuthSession;\n requestUrl: string;\n}): boolean {\n return resolveAuthRequestCompatibility(input).compatible;\n}\n\nexport function deriveAuthBaseUrlFromGatewayUrl(\n gatewayUrl: string\n): string | null {\n const parsed = parseUrlOrNull(gatewayUrl);\n if (!parsed) {\n return null;\n }\n if (!isHttpTransportProtocol(parsed.protocol)) {\n return null;\n }\n if (!parsed.hostname.startsWith(\"gateway.\")) {\n return null;\n }\n\n const authUrl = new URL(parsed.toString());\n authUrl.hostname = `auth.${parsed.hostname.slice(\"gateway.\".length)}`;\n authUrl.pathname = \"/\";\n authUrl.search = \"\";\n authUrl.hash = \"\";\n return normalizeBaseUrl(authUrl.toString());\n}\n\nfunction deriveGatewayHost(authBaseUrl: URL): string | null {\n if (!authBaseUrl.hostname.startsWith(\"auth.\")) {\n return null;\n }\n\n const gatewayUrl = new URL(authBaseUrl.toString());\n gatewayUrl.hostname = `gateway.${authBaseUrl.hostname.slice(\"auth.\".length)}`;\n return gatewayUrl.host;\n}\n\nfunction parseUrlOrNull(value: string): URL | null {\n try {\n return new URL(value);\n } catch {\n return null;\n }\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return (\n hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\"\n );\n}\n\nfunction isSecureTransportProtocol(protocol: string): boolean {\n return protocol === \"https:\" || protocol === \"wss:\";\n}\n\nfunction isHttpTransportProtocol(protocol: string): boolean {\n return protocol === \"http:\" || protocol === \"https:\";\n}\n","import crypto from \"node:crypto\";\nimport type { OpenMeldRequestContext } from \"@openmeld/schemas/types\";\nimport type { OpenMeldProfile } from \"./openmeld-profiles-api\";\n\nexport type OpenMeldRequestContextProfileIdentity = {\n openMeldProfileId: string;\n profileKind?: \"human\" | \"agent\" | \"system\";\n kind?: \"human\" | \"agent\";\n profileHandle?: string;\n profileName: string;\n ownerUserId?: string;\n ownerName?: string;\n agentControllerConversationId?: string;\n};\n\nexport function buildOpenMeldRequestContextFromProfile(input: {\n openMeldProfile: OpenMeldProfile;\n requestId?: string;\n agentControllerConversationId?: string;\n}): OpenMeldRequestContext {\n const requestId =\n normalizeOptionalText(input.requestId) ?? crypto.randomUUID();\n const agentControllerConversationId = normalizeOptionalText(\n input.agentControllerConversationId\n );\n const ownerName = normalizeOptionalText(input.openMeldProfile.ownerName);\n\n return {\n actorContext: {\n requestId,\n openMeldProfileId: input.openMeldProfile.openMeldProfileId,\n profileKind: input.openMeldProfile.profileKind,\n profileHandle: input.openMeldProfile.profileHandle,\n profileName: input.openMeldProfile.profileName,\n ownerUserId: input.openMeldProfile.ownerUserId,\n ...(ownerName ? { ownerName } : {}),\n },\n ...(agentControllerConversationId ? { agentControllerConversationId } : {}),\n };\n}\n\nexport function buildOpenMeldRequestContextFromProfileIdentity(input: {\n profileIdentity: OpenMeldRequestContextProfileIdentity;\n requestId?: string;\n}): OpenMeldRequestContext {\n const requestId =\n normalizeOptionalText(input.requestId) ?? crypto.randomUUID();\n const profileHandle = normalizeOptionalText(\n input.profileIdentity.profileHandle\n );\n const ownerUserId = normalizeOptionalText(input.profileIdentity.ownerUserId);\n const ownerName = normalizeOptionalText(input.profileIdentity.ownerName);\n const agentControllerConversationId = normalizeOptionalText(\n input.profileIdentity.agentControllerConversationId\n );\n const profileKind =\n input.profileIdentity.profileKind ??\n (input.profileIdentity.kind === \"human\" ||\n input.profileIdentity.kind === \"agent\"\n ? input.profileIdentity.kind\n : \"system\");\n\n return {\n actorContext: {\n requestId,\n openMeldProfileId: input.profileIdentity.openMeldProfileId,\n profileKind,\n ...(profileHandle ? { profileHandle } : {}),\n profileName: input.profileIdentity.profileName,\n ...(ownerUserId ? { ownerUserId } : {}),\n ...(ownerName ? { ownerName } : {}),\n },\n ...(agentControllerConversationId ? { agentControllerConversationId } : {}),\n };\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n","import {\n buildOpenMeldRequestContextHeaders,\n type OpenMeldRequestContextHeadersInput,\n} from \"@openmeld/gateway-contract\";\nimport type { OpenMeldRequestContext } from \"@openmeld/schemas/types\";\nimport {\n type AuthRequestCompatibilityReason,\n canUseAuthSessionForRequest,\n resolveAuthRequestCompatibility,\n} from \"./auth-request-compatibility\";\nimport { getAuthSessionState, type StoredAuthSession } from \"./auth-session\";\nimport type { OpenMeldProfile } from \"./openmeld-profiles-api\";\nimport {\n buildOpenMeldRequestContextFromProfile,\n buildOpenMeldRequestContextFromProfileIdentity,\n type OpenMeldRequestContextProfileIdentity,\n} from \"./openmeld-request-context\";\n\nconst DEFAULT_TOKEN_TYPE = \"Bearer\";\nconst AUTHORIZATION_HEADER = \"Authorization\";\n\ntype RequestAuthHeadersInput = {\n authSession?: StoredAuthSession | null;\n requestUrl: string;\n};\n\ntype OpenMeldRequestContextHeadersWithAuthInput =\n OpenMeldRequestContextHeadersInput & {\n authSession?: StoredAuthSession | null;\n requestUrl: string;\n };\n\nexport type AuthTokenAttachment =\n | {\n status: \"attachable\";\n token: string;\n tokenType: string;\n }\n | {\n status: \"dropped\";\n reason: \"empty_token\" | AuthRequestCompatibilityReason;\n requestHost: string | null;\n authHost: string | null;\n expectedGatewayHost: string | null;\n };\n\nexport type DroppedAuthTokenAttachment = Extract<\n AuthTokenAttachment,\n { status: \"dropped\" }\n>;\n\nexport async function buildRequestAuthHeaders(\n input: RequestAuthHeadersInput\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n await attachAuthHeader(headers, input);\n return headers;\n}\n\nexport async function buildOpenMeldRequestContextHeadersWithAuth(\n input: OpenMeldRequestContextHeadersWithAuthInput\n): Promise<Record<string, string>> {\n const headers = buildOpenMeldRequestContextHeaders(input);\n await attachAuthHeader(headers, input);\n return headers;\n}\n\nexport async function buildOpenMeldProfileRequestHeadersWithAuth(input: {\n openMeldProfile: OpenMeldProfile;\n requestUrl: string;\n authSession?: StoredAuthSession | null;\n agentControllerConversationId?: string;\n spacePassword?: string;\n}): Promise<Record<string, string>> {\n return await buildOpenMeldRequestContextHeadersWithAuth({\n requestContext: buildOpenMeldRequestContextFromProfile({\n openMeldProfile: input.openMeldProfile,\n agentControllerConversationId: input.agentControllerConversationId,\n }),\n requestUrl: input.requestUrl,\n ...(input.authSession === undefined\n ? {}\n : { authSession: input.authSession }),\n ...(input.spacePassword === undefined\n ? {}\n : { spacePassword: input.spacePassword }),\n });\n}\n\nexport async function buildOpenMeldProfileIdentityRequestHeadersWithAuth(input: {\n profileIdentity: OpenMeldRequestContextProfileIdentity;\n requestUrl: string;\n authSession?: StoredAuthSession | null;\n spacePassword?: string;\n}): Promise<Record<string, string>> {\n return await buildOpenMeldRequestContextHeadersWithAuth({\n requestContext: buildOpenMeldRequestContextFromProfileIdentity({\n profileIdentity: input.profileIdentity,\n }),\n requestUrl: input.requestUrl,\n ...(input.authSession === undefined\n ? {}\n : { authSession: input.authSession }),\n ...(input.spacePassword === undefined\n ? {}\n : { spacePassword: input.spacePassword }),\n });\n}\n\nexport function withSpacePassword(\n requestContext: OpenMeldRequestContext,\n spacePassword?: string\n): OpenMeldRequestContextHeadersInput {\n return {\n requestContext,\n ...(spacePassword === undefined ? {} : { spacePassword }),\n };\n}\n\n// One decision for \"can this stored session authenticate this request\", with\n// the drop reason preserved. Header building and the daemon stream connect\n// gate must share this so they cannot drift apart.\nexport function resolveAuthTokenAttachment(input: {\n session: StoredAuthSession;\n requestUrl: string;\n}): AuthTokenAttachment {\n const compatibility = resolveAuthRequestCompatibility({\n session: input.session,\n requestUrl: input.requestUrl,\n });\n const token = normalizeAccessToken(input.session);\n if (!token) {\n return {\n status: \"dropped\",\n reason: \"empty_token\",\n requestHost: compatibility.requestHost,\n authHost: compatibility.authHost,\n expectedGatewayHost: compatibility.expectedGatewayHost,\n };\n }\n if (!compatibility.compatible) {\n return {\n status: \"dropped\",\n reason: compatibility.reason,\n requestHost: compatibility.requestHost,\n authHost: compatibility.authHost,\n expectedGatewayHost: compatibility.expectedGatewayHost,\n };\n }\n return {\n status: \"attachable\",\n token,\n tokenType: normalizeTokenType(input.session.tokenType),\n };\n}\n\nasync function attachAuthHeader(\n headers: Record<string, string>,\n input: RequestAuthHeadersInput\n): Promise<void> {\n const session = await resolveAuthSessionForHeaders(input);\n if (session === null) {\n // No stored credentials exist, so there is nothing to strip: the caller\n // is knowingly sending an unauthenticated request.\n return;\n }\n\n const attachment = resolveAuthTokenAttachment({\n session,\n requestUrl: input.requestUrl,\n });\n if (attachment.status === \"dropped\") {\n // The caller holds a session it believes is usable. Dropping the token is\n // still the safe outcome (never leak credentials to an incompatible\n // host), but it must stay visible in diagnostics instead of silently\n // dialing bare and surfacing as a remote 401.\n warnDroppedAuthToken(attachment);\n return;\n }\n headers[AUTHORIZATION_HEADER] = `${attachment.tokenType} ${attachment.token}`;\n}\n\nfunction warnDroppedAuthToken(attachment: DroppedAuthTokenAttachment): void {\n console.warn(\"[openmeld.auth.request_token_dropped]\", {\n authHost: attachment.authHost,\n expectedGatewayHost: attachment.expectedGatewayHost,\n reason: attachment.reason,\n requestHost: attachment.requestHost,\n });\n}\n\nasync function resolveAuthSessionForHeaders(\n input: RequestAuthHeadersInput\n): Promise<StoredAuthSession | null> {\n if (input.authSession !== undefined) {\n return input.authSession;\n }\n\n const sessionState = await getAuthSessionState();\n if (sessionState.state !== \"valid\" || sessionState.session === null) {\n return null;\n }\n\n return sessionState.session;\n}\n\nfunction normalizeAccessToken(session: StoredAuthSession): string {\n return String(session.accessToken ?? \"\").trim();\n}\n\nfunction normalizeTokenType(tokenType: string | undefined): string {\n const normalized = String(tokenType ?? \"\").trim();\n return normalized.length > 0 ? normalized : DEFAULT_TOKEN_TYPE;\n}\n\nexport function canAttachAuthTokenToRequest(\n session: StoredAuthSession,\n requestUrl: string\n): boolean {\n return canUseAuthSessionForRequest({\n session,\n requestUrl,\n });\n}\n","import {\n DEFAULT_SPACE_CONVERSATION_VALIDATE_TIMEOUT_MS,\n DEFAULT_SPACE_REQUEST_TIMEOUT_MS,\n MAX_SPACE_REQUEST_TIMEOUT_MS,\n MIN_SPACE_REQUEST_TIMEOUT_MS,\n} from \"../strategy-constants\";\n\nconst SPACE_REQUEST_TIMEOUT_ENV_KEY = \"OPENMELD_SPACE_REQUEST_TIMEOUT_MS\";\n\nexport function resolveSpaceRequestTimeoutMs(override?: number): number {\n if (isFinitePositiveNumber(override)) {\n return clampSpaceRequestTimeoutMs(override);\n }\n\n const fromEnv = Number.parseInt(\n String(process.env[SPACE_REQUEST_TIMEOUT_ENV_KEY] ?? \"\"),\n 10\n );\n if (isFinitePositiveNumber(fromEnv)) {\n return clampSpaceRequestTimeoutMs(fromEnv);\n }\n\n return DEFAULT_SPACE_REQUEST_TIMEOUT_MS;\n}\n\nexport function resolveSpaceRequestTimeoutMsForDiagnostics(): number {\n return resolveSpaceRequestTimeoutMs(undefined);\n}\n\nexport function resolveSpaceConversationValidateTimeoutMs(): number {\n return Math.max(\n resolveSpaceRequestTimeoutMs(undefined),\n DEFAULT_SPACE_CONVERSATION_VALIDATE_TIMEOUT_MS\n );\n}\n\nfunction clampSpaceRequestTimeoutMs(value: number): number {\n const normalized = Math.trunc(value);\n return Math.max(\n MIN_SPACE_REQUEST_TIMEOUT_MS,\n Math.min(MAX_SPACE_REQUEST_TIMEOUT_MS, normalized)\n );\n}\n\nfunction isFinitePositiveNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0;\n}\n","import {\n resolveSpaceRequestTimeoutMs,\n resolveSpaceRequestTimeoutMsForDiagnostics as resolveSpaceRequestTimeoutMsForCliDiagnostics,\n} from \"./request-timeout\";\n\nexport async function fetchSpaceRequestWithTimeout(input: {\n url: string;\n operation: string;\n init?: RequestInit;\n timeoutMs?: number;\n}): Promise<Response> {\n const timeoutMs = resolveSpaceRequestTimeoutMs(input.timeoutMs);\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n const composed = composeAbortSignals(input.init?.signal, timeoutSignal);\n\n try {\n try {\n return await fetch(input.url, {\n ...input.init,\n signal: composed.signal,\n });\n } catch (error) {\n // A keep-alive connection that a proxy silently dropped fails exactly\n // once and undici evicts it; the retry rides a fresh connection. This\n // is what keeps a long-lived service working behind flaky proxies\n // without asking users to touch their network config.\n if (\n timeoutSignal.aborted ||\n composed.signal.aborted ||\n !shouldWrapNetworkRequestError(error)\n ) {\n throw error;\n }\n return await fetch(input.url, {\n ...input.init,\n signal: composed.signal,\n });\n }\n } catch (error) {\n if (timeoutSignal.aborted) {\n throw createSpaceRequestTimeoutError({\n operation: input.operation,\n timeoutMs,\n cause: error,\n });\n }\n if (shouldWrapNetworkRequestError(error)) {\n throw createSpaceRequestNetworkError({\n operation: input.operation,\n url: input.url,\n cause: error,\n });\n }\n throw error;\n } finally {\n composed.cleanup();\n }\n}\n\nexport function resolveSpaceRequestTimeoutMsForDiagnostics(): number {\n return resolveSpaceRequestTimeoutMsForCliDiagnostics();\n}\n\nfunction createSpaceRequestTimeoutError(input: {\n operation: string;\n timeoutMs: number;\n cause: unknown;\n}): Error {\n const error = new Error(\n `${input.operation} request timed out after ${input.timeoutMs}ms`,\n { cause: input.cause }\n ) as Error & { code?: string };\n error.code = \"network.timeout\";\n return error;\n}\n\nfunction createSpaceRequestNetworkError(input: {\n operation: string;\n url: string;\n cause: unknown;\n}): Error {\n const error = new Error(\n `${input.operation} request could not reach ${describeRequestTarget(input.url)} (${toErrorMessage(input.cause)})`,\n { cause: input.cause }\n ) as Error & { code?: string };\n error.code = \"network.request_failed\";\n return error;\n}\n\nfunction composeAbortSignals(\n parent: AbortSignal | null | undefined,\n timeout: AbortSignal\n): { signal: AbortSignal; cleanup: () => void } {\n if (!parent) {\n return {\n signal: timeout,\n cleanup: () => undefined,\n };\n }\n\n if (parent.aborted || timeout.aborted) {\n const controller = new AbortController();\n controller.abort();\n return {\n signal: controller.signal,\n cleanup: () => undefined,\n };\n }\n\n const controller = new AbortController();\n const abort = () => {\n controller.abort();\n };\n\n parent.addEventListener(\"abort\", abort, { once: true });\n timeout.addEventListener(\"abort\", abort, { once: true });\n\n return {\n signal: controller.signal,\n cleanup: () => {\n parent.removeEventListener(\"abort\", abort);\n timeout.removeEventListener(\"abort\", abort);\n },\n };\n}\n\nfunction describeRequestTarget(url: string): string {\n try {\n return new URL(url).origin;\n } catch {\n return url;\n }\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n const message = error.message.trim();\n return message.length > 0 ? message : \"request failed\";\n }\n const message = String(error ?? \"\").trim();\n return message.length > 0 ? message : \"request failed\";\n}\n\nfunction shouldWrapNetworkRequestError(error: unknown): boolean {\n if (error instanceof TypeError) {\n return true;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof error.code === \"string\" &&\n error.code.startsWith(\"ERR_SSL_\")\n ) {\n return true;\n }\n const message = toErrorMessage(error).toLowerCase();\n return (\n message.includes(\"fetch failed\") ||\n message.includes(\"failed to fetch\") ||\n message.includes(\"network request failed\") ||\n message.includes(\"ssl_decryption_failed_or_bad_record_mac\")\n );\n}\n","import {\n createOpenMeldApiClient,\n type OpenMeldApiClientFoundation,\n} from \"@openmeld/api-client\";\nimport {\n buildOpenMeldRequestContextHeaders,\n OPENMELD_HEADER_REQUESTED_ORGANIZATION_ID,\n} from \"@openmeld/gateway-contract\";\nimport { buildRequestAuthHeaders } from \"../config/request-headers\";\nimport { fetchSpaceRequestWithTimeout } from \"./fetch-with-timeout\";\n\nexport function createCliApiClientFoundation(\n baseUrl: string,\n options: {\n onAuthHeadersResolved?: (headers: Record<string, string>) => void;\n organizationId?: string;\n } = {}\n): OpenMeldApiClientFoundation {\n return createOpenMeldApiClient({\n baseUrl,\n transport: async (request) =>\n await fetchSpaceRequestWithTimeout({\n url: request.url,\n operation: request.operation,\n init: request.init,\n timeoutMs: request.timeoutMs,\n }),\n getAuthHeaders: async ({ requestUrl }) => {\n const headers = await buildRequestAuthHeaders({\n requestUrl,\n });\n if (options.organizationId) {\n headers[OPENMELD_HEADER_REQUESTED_ORGANIZATION_ID] =\n options.organizationId;\n }\n options.onAuthHeadersResolved?.(headers);\n return headers;\n },\n getRequestContextHeaders: async ({ requestContext, spacePassword }) =>\n buildOpenMeldRequestContextHeaders({\n requestContext,\n ...(spacePassword === undefined ? {} : { spacePassword }),\n }),\n });\n}\n"],"mappings":";;;;;;;AAoBA,SAAgB,gCAAgC,OAGnB;CAC3B,MAAM,aAAa,eAAe,MAAM,UAAU;CAClD,IAAI,CAAC,YACH,OAAO;EACL,YAAY;EACZ,QAAQ;EACR,aAAa;EACb,UAAU;EACV,qBAAqB;CACvB;CAGF,MAAM,cAAc,eAAe,MAAM,QAAQ,WAAW;CAC5D,IAAI,CAAC,aACH,OAAO;EACL,YAAY;EACZ,QAAQ;EACR,aAAa,WAAW;EACxB,UAAU;EACV,qBAAqB;CACvB;CAGF,MAAM,sBAAsB,kBAAkB,WAAW;CACzD,MAAM,cAAc,WAAW;CAC/B,MAAM,WAAW,YAAY;CAE7B,IACE,mBAAmB,WAAW,QAAQ,KACtC,mBAAmB,YAAY,QAAQ,GAEvC,OAAO;EACL,YAAY;EACZ,QAAQ;EACR;EACA;EACA;CACF;CAGF,IAAI,CAAC,0BAA0B,WAAW,QAAQ,GAChD,OAAO;EACL,YAAY;EACZ,QAAQ;EACR;EACA;EACA;CACF;CAGF,IAAI,gBAAgB,UAClB,OAAO;EACL,YAAY;EACZ,QAAQ;EACR;EACA;EACA;CACF;CAGF,IAAI,uBAAuB,gBAAgB,qBACzC,OAAO;EACL,YAAY;EACZ,QAAQ;EACR;EACA;EACA;CACF;CAGF,OAAO;EACL,YAAY;EACZ,QAAQ;EACR;EACA;EACA;CACF;AACF;AAEA,SAAgB,4BAA4B,OAGhC;CACV,OAAO,gCAAgC,KAAK,CAAC,CAAC;AAChD;AAEA,SAAgB,gCACd,YACe;CACf,MAAM,SAAS,eAAe,UAAU;CACxC,IAAI,CAAC,QACH,OAAO;CAET,IAAI,CAAC,wBAAwB,OAAO,QAAQ,GAC1C,OAAO;CAET,IAAI,CAAC,OAAO,SAAS,WAAW,UAAU,GACxC,OAAO;CAGT,MAAM,UAAU,IAAI,IAAI,OAAO,SAAS,CAAC;CACzC,QAAQ,WAAW,QAAQ,OAAO,SAAS,MAAM,CAAiB;CAClE,QAAQ,WAAW;CACnB,QAAQ,SAAS;CACjB,QAAQ,OAAO;CACf,OAAO,iBAAiB,QAAQ,SAAS,CAAC;AAC5C;AAEA,SAAS,kBAAkB,aAAiC;CAC1D,IAAI,CAAC,YAAY,SAAS,WAAW,OAAO,GAC1C,OAAO;CAGT,MAAM,aAAa,IAAI,IAAI,YAAY,SAAS,CAAC;CACjD,WAAW,WAAW,WAAW,YAAY,SAAS,MAAM,CAAc;CAC1E,OAAO,WAAW;AACpB;AAEA,SAAS,eAAe,OAA2B;CACjD,IAAI;EACF,OAAO,IAAI,IAAI,KAAK;CACtB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,mBAAmB,UAA2B;CACrD,OACE,aAAa,eAAe,aAAa,eAAe,aAAa;AAEzE;AAEA,SAAS,0BAA0B,UAA2B;CAC5D,OAAO,aAAa,YAAY,aAAa;AAC/C;AAEA,SAAS,wBAAwB,UAA2B;CAC1D,OAAO,aAAa,WAAW,aAAa;AAC9C;;;AClJA,SAAgB,uCAAuC,OAI5B;CACzB,MAAM,YACJ,sBAAsB,MAAM,SAAS,KAAK,OAAO,WAAW;CAC9D,MAAM,gCAAgC,sBACpC,MAAM,6BACR;CACA,MAAM,YAAY,sBAAsB,MAAM,gBAAgB,SAAS;CAEvE,OAAO;EACL,cAAc;GACZ;GACA,mBAAmB,MAAM,gBAAgB;GACzC,aAAa,MAAM,gBAAgB;GACnC,eAAe,MAAM,gBAAgB;GACrC,aAAa,MAAM,gBAAgB;GACnC,aAAa,MAAM,gBAAgB;GACnC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;EACnC;EACA,GAAI,gCAAgC,EAAE,8BAA8B,IAAI,CAAC;CAC3E;AACF;AAEA,SAAgB,+CAA+C,OAGpC;CACzB,MAAM,YACJ,sBAAsB,MAAM,SAAS,KAAK,OAAO,WAAW;CAC9D,MAAM,gBAAgB,sBACpB,MAAM,gBAAgB,aACxB;CACA,MAAM,cAAc,sBAAsB,MAAM,gBAAgB,WAAW;CAC3E,MAAM,YAAY,sBAAsB,MAAM,gBAAgB,SAAS;CACvE,MAAM,gCAAgC,sBACpC,MAAM,gBAAgB,6BACxB;CACA,MAAM,cACJ,MAAM,gBAAgB,gBACrB,MAAM,gBAAgB,SAAS,WAChC,MAAM,gBAAgB,SAAS,UAC3B,MAAM,gBAAgB,OACtB;CAEN,OAAO;EACL,cAAc;GACZ;GACA,mBAAmB,MAAM,gBAAgB;GACzC;GACA,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;GACzC,aAAa,MAAM,gBAAgB;GACnC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;GACrC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;EACnC;EACA,GAAI,gCAAgC,EAAE,8BAA8B,IAAI,CAAC;CAC3E;AACF;AAEA,SAAS,sBAAsB,OAA+B;CAC5D,MAAM,aAAa,OAAO,SAAS,EAAE,CAAC,CAAC,KAAK;CAC5C,OAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;;;AC7DA,MAAM,qBAAqB;AAC3B,MAAM,uBAAuB;AAgC7B,eAAsB,wBACpB,OACiC;CACjC,MAAM,UAAkC,CAAC;CACzC,MAAM,iBAAiB,SAAS,KAAK;CACrC,OAAO;AACT;AAEA,eAAsB,2CACpB,OACiC;CACjC,MAAM,UAAU,mCAAmC,KAAK;CACxD,MAAM,iBAAiB,SAAS,KAAK;CACrC,OAAO;AACT;AAEA,eAAsB,2CAA2C,OAM7B;CAClC,OAAO,MAAM,2CAA2C;EACtD,gBAAgB,uCAAuC;GACrD,iBAAiB,MAAM;GACvB,+BAA+B,MAAM;EACvC,CAAC;EACD,YAAY,MAAM;EAClB,GAAI,MAAM,gBAAgB,KAAA,IACtB,CAAC,IACD,EAAE,aAAa,MAAM,YAAY;EACrC,GAAI,MAAM,kBAAkB,KAAA,IACxB,CAAC,IACD,EAAE,eAAe,MAAM,cAAc;CAC3C,CAAC;AACH;AAEA,eAAsB,mDAAmD,OAKrC;CAClC,OAAO,MAAM,2CAA2C;EACtD,gBAAgB,+CAA+C,EAC7D,iBAAiB,MAAM,gBACzB,CAAC;EACD,YAAY,MAAM;EAClB,GAAI,MAAM,gBAAgB,KAAA,IACtB,CAAC,IACD,EAAE,aAAa,MAAM,YAAY;EACrC,GAAI,MAAM,kBAAkB,KAAA,IACxB,CAAC,IACD,EAAE,eAAe,MAAM,cAAc;CAC3C,CAAC;AACH;AAeA,SAAgB,2BAA2B,OAGnB;CACtB,MAAM,gBAAgB,gCAAgC;EACpD,SAAS,MAAM;EACf,YAAY,MAAM;CACpB,CAAC;CACD,MAAM,QAAQ,qBAAqB,MAAM,OAAO;CAChD,IAAI,CAAC,OACH,OAAO;EACL,QAAQ;EACR,QAAQ;EACR,aAAa,cAAc;EAC3B,UAAU,cAAc;EACxB,qBAAqB,cAAc;CACrC;CAEF,IAAI,CAAC,cAAc,YACjB,OAAO;EACL,QAAQ;EACR,QAAQ,cAAc;EACtB,aAAa,cAAc;EAC3B,UAAU,cAAc;EACxB,qBAAqB,cAAc;CACrC;CAEF,OAAO;EACL,QAAQ;EACR;EACA,WAAW,mBAAmB,MAAM,QAAQ,SAAS;CACvD;AACF;AAEA,eAAe,iBACb,SACA,OACe;CACf,MAAM,UAAU,MAAM,6BAA6B,KAAK;CACxD,IAAI,YAAY,MAGd;CAGF,MAAM,aAAa,2BAA2B;EAC5C;EACA,YAAY,MAAM;CACpB,CAAC;CACD,IAAI,WAAW,WAAW,WAAW;EAKnC,qBAAqB,UAAU;EAC/B;CACF;CACA,QAAQ,wBAAwB,GAAG,WAAW,UAAU,GAAG,WAAW;AACxE;AAEA,SAAS,qBAAqB,YAA8C;CAC1E,QAAQ,KAAK,yCAAyC;EACpD,UAAU,WAAW;EACrB,qBAAqB,WAAW;EAChC,QAAQ,WAAW;EACnB,aAAa,WAAW;CAC1B,CAAC;AACH;AAEA,eAAe,6BACb,OACmC;CACnC,IAAI,MAAM,gBAAgB,KAAA,GACxB,OAAO,MAAM;CAGf,MAAM,eAAe,MAAM,oBAAoB;CAC/C,IAAI,aAAa,UAAU,WAAW,aAAa,YAAY,MAC7D,OAAO;CAGT,OAAO,aAAa;AACtB;AAEA,SAAS,qBAAqB,SAAoC;CAChE,OAAO,OAAO,QAAQ,eAAe,EAAE,CAAC,CAAC,KAAK;AAChD;AAEA,SAAS,mBAAmB,WAAuC;CACjE,MAAM,aAAa,OAAO,aAAa,EAAE,CAAC,CAAC,KAAK;CAChD,OAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEA,SAAgB,4BACd,SACA,YACS;CACT,OAAO,4BAA4B;EACjC;EACA;CACF,CAAC;AACH;;;ACxNA,MAAM,gCAAgC;AAEtC,SAAgB,6BAA6B,UAA2B;CACtE,IAAI,uBAAuB,QAAQ,GACjC,OAAO,2BAA2B,QAAQ;CAG5C,MAAM,UAAU,OAAO,SACrB,OAAO,QAAQ,IAAI,kCAAkC,EAAE,GACvD,EACF;CACA,IAAI,uBAAuB,OAAO,GAChC,OAAO,2BAA2B,OAAO;CAG3C,OAAO;AACT;AAEA,SAAgBA,+CAAqD;CACnE,OAAO,6BAA6B,KAAA,CAAS;AAC/C;AASA,SAAS,2BAA2B,OAAuB;CAEzD,OAAO,KAAK,IACV,8BACA,KAAK,IAAI,8BAHQ,KAAK,MAAM,KAGoB,CAAC,CACnD;AACF;AAEA,SAAS,uBAAuB,OAAiC;CAC/D,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ;AACxE;;;ACzCA,eAAsB,6BAA6B,OAK7B;CACpB,MAAM,YAAY,6BAA6B,MAAM,SAAS;CAC9D,MAAM,gBAAgB,YAAY,QAAQ,SAAS;CACnD,MAAM,WAAW,oBAAoB,MAAM,MAAM,QAAQ,aAAa;CAEtE,IAAI;EACF,IAAI;GACF,OAAO,MAAM,MAAM,MAAM,KAAK;IAC5B,GAAG,MAAM;IACT,QAAQ,SAAS;GACnB,CAAC;EACH,SAAS,OAAO;GAKd,IACE,cAAc,WACd,SAAS,OAAO,WAChB,CAAC,8BAA8B,KAAK,GAEpC,MAAM;GAER,OAAO,MAAM,MAAM,MAAM,KAAK;IAC5B,GAAG,MAAM;IACT,QAAQ,SAAS;GACnB,CAAC;EACH;CACF,SAAS,OAAO;EACd,IAAI,cAAc,SAChB,MAAM,+BAA+B;GACnC,WAAW,MAAM;GACjB;GACA,OAAO;EACT,CAAC;EAEH,IAAI,8BAA8B,KAAK,GACrC,MAAM,+BAA+B;GACnC,WAAW,MAAM;GACjB,KAAK,MAAM;GACX,OAAO;EACT,CAAC;EAEH,MAAM;CACR,UAAU;EACR,SAAS,QAAQ;CACnB;AACF;AAEA,SAAgB,6CAAqD;CACnE,OAAOC,6CAA8C;AACvD;AAEA,SAAS,+BAA+B,OAI9B;CACR,MAAM,QAAQ,IAAI,MAChB,GAAG,MAAM,UAAU,2BAA2B,MAAM,UAAU,KAC9D,EAAE,OAAO,MAAM,MAAM,CACvB;CACA,MAAM,OAAO;CACb,OAAO;AACT;AAEA,SAAS,+BAA+B,OAI9B;CACR,MAAM,QAAQ,IAAI,MAChB,GAAG,MAAM,UAAU,2BAA2B,sBAAsB,MAAM,GAAG,EAAE,IAAI,eAAe,MAAM,KAAK,EAAE,IAC/G,EAAE,OAAO,MAAM,MAAM,CACvB;CACA,MAAM,OAAO;CACb,OAAO;AACT;AAEA,SAAS,oBACP,QACA,SAC8C;CAC9C,IAAI,CAAC,QACH,OAAO;EACL,QAAQ;EACR,eAAe,KAAA;CACjB;CAGF,IAAI,OAAO,WAAW,QAAQ,SAAS;EACrC,MAAM,aAAa,IAAI,gBAAgB;EACvC,WAAW,MAAM;EACjB,OAAO;GACL,QAAQ,WAAW;GACnB,eAAe,KAAA;EACjB;CACF;CAEA,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,cAAc;EAClB,WAAW,MAAM;CACnB;CAEA,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;CACtD,QAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;CAEvD,OAAO;EACL,QAAQ,WAAW;EACnB,eAAe;GACb,OAAO,oBAAoB,SAAS,KAAK;GACzC,QAAQ,oBAAoB,SAAS,KAAK;EAC5C;CACF;AACF;AAEA,SAAS,sBAAsB,KAAqB;CAClD,IAAI;EACF,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC;CACtB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,eAAe,OAAwB;CAC9C,IAAI,iBAAiB,OAAO;EAC1B,MAAM,UAAU,MAAM,QAAQ,KAAK;EACnC,OAAO,QAAQ,SAAS,IAAI,UAAU;CACxC;CACA,MAAM,UAAU,OAAO,SAAS,EAAE,CAAC,CAAC,KAAK;CACzC,OAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,SAAS,8BAA8B,OAAyB;CAC9D,IAAI,iBAAiB,WACnB,OAAO;CAET,IACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAO,MAAM,SAAS,YACtB,MAAM,KAAK,WAAW,UAAU,GAEhC,OAAO;CAET,MAAM,UAAU,eAAe,KAAK,CAAC,CAAC,YAAY;CAClD,OACE,QAAQ,SAAS,cAAc,KAC/B,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,wBAAwB,KACzC,QAAQ,SAAS,yCAAyC;AAE9D;;;;ACxJA,SAAgB,6BACd,SACA,UAGI,CAAC,GACwB;CAC7B,OAAO,wBAAwB;EAC7B;EACA,WAAW,OAAO,YAChB,MAAM,6BAA6B;GACjC,KAAK,QAAQ;GACb,WAAW,QAAQ;GACnB,MAAM,QAAQ;GACd,WAAW,QAAQ;EACrB,CAAC;EACH,gBAAgB,OAAO,EAAE,iBAAiB;GACxC,MAAM,UAAU,MAAM,wBAAwB,EAC5C,WACF,CAAC;GACD,IAAI,QAAQ,gBACV,QAAQ,6CACN,QAAQ;GAEZ,QAAQ,wBAAwB,OAAO;GACvC,OAAO;EACT;EACA,0BAA0B,OAAO,EAAE,gBAAgB,oBACjD,mCAAmC;GACjC;GACA,GAAI,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc;EACzD,CAAC;CACL,CAAC;AACH"}
1
+ {"version":3,"file":"api-client-foundation-jjwUa25Q.js","names":["resolveSpaceRequestTimeoutMsForDiagnostics","resolveSpaceRequestTimeoutMsForCliDiagnostics"],"sources":["../src/config/auth-request-compatibility.ts","../src/config/openmeld-request-context.ts","../src/config/request-headers.ts","../src/space/request-timeout.ts","../src/space/fetch-with-timeout.ts","../src/space/api-client-foundation.ts"],"sourcesContent":["import { normalizeBaseUrl } from \"../protocol/urls\";\nimport type { StoredAuthSession } from \"./auth-session\";\n\nexport type AuthRequestCompatibilityReason =\n | \"invalid_request_url\"\n | \"invalid_auth_url\"\n | \"insecure_transport\"\n | \"host_mismatch\"\n | \"loopback\"\n | \"same_host\"\n | \"gateway_sibling\";\n\nexport type AuthRequestCompatibility = {\n compatible: boolean;\n reason: AuthRequestCompatibilityReason;\n requestHost: string | null;\n authHost: string | null;\n expectedGatewayHost: string | null;\n};\n\nexport function resolveAuthRequestCompatibility(input: {\n session: StoredAuthSession;\n requestUrl: string;\n}): AuthRequestCompatibility {\n const requestUrl = parseUrlOrNull(input.requestUrl);\n if (!requestUrl) {\n return {\n compatible: false,\n reason: \"invalid_request_url\",\n requestHost: null,\n authHost: null,\n expectedGatewayHost: null,\n };\n }\n\n const authBaseUrl = parseUrlOrNull(input.session.authBaseUrl);\n if (!authBaseUrl) {\n return {\n compatible: false,\n reason: \"invalid_auth_url\",\n requestHost: requestUrl.host,\n authHost: null,\n expectedGatewayHost: null,\n };\n }\n\n const expectedGatewayHost = deriveGatewayHost(authBaseUrl);\n const requestHost = requestUrl.host;\n const authHost = authBaseUrl.host;\n\n if (\n isLoopbackHostname(requestUrl.hostname) &&\n isLoopbackHostname(authBaseUrl.hostname)\n ) {\n return {\n compatible: true,\n reason: \"loopback\",\n requestHost,\n authHost,\n expectedGatewayHost,\n };\n }\n\n if (!isSecureTransportProtocol(requestUrl.protocol)) {\n return {\n compatible: false,\n reason: \"insecure_transport\",\n requestHost,\n authHost,\n expectedGatewayHost,\n };\n }\n\n if (requestHost === authHost) {\n return {\n compatible: true,\n reason: \"same_host\",\n requestHost,\n authHost,\n expectedGatewayHost,\n };\n }\n\n if (expectedGatewayHost && requestHost === expectedGatewayHost) {\n return {\n compatible: true,\n reason: \"gateway_sibling\",\n requestHost,\n authHost,\n expectedGatewayHost,\n };\n }\n\n return {\n compatible: false,\n reason: \"host_mismatch\",\n requestHost,\n authHost,\n expectedGatewayHost,\n };\n}\n\nexport function canUseAuthSessionForRequest(input: {\n session: StoredAuthSession;\n requestUrl: string;\n}): boolean {\n return resolveAuthRequestCompatibility(input).compatible;\n}\n\nexport function deriveAuthBaseUrlFromGatewayUrl(\n gatewayUrl: string\n): string | null {\n const parsed = parseUrlOrNull(gatewayUrl);\n if (!parsed) {\n return null;\n }\n if (!isHttpTransportProtocol(parsed.protocol)) {\n return null;\n }\n if (!parsed.hostname.startsWith(\"gateway.\")) {\n return null;\n }\n\n const authUrl = new URL(parsed.toString());\n authUrl.hostname = `auth.${parsed.hostname.slice(\"gateway.\".length)}`;\n authUrl.pathname = \"/\";\n authUrl.search = \"\";\n authUrl.hash = \"\";\n return normalizeBaseUrl(authUrl.toString());\n}\n\nfunction deriveGatewayHost(authBaseUrl: URL): string | null {\n if (!authBaseUrl.hostname.startsWith(\"auth.\")) {\n return null;\n }\n\n const gatewayUrl = new URL(authBaseUrl.toString());\n gatewayUrl.hostname = `gateway.${authBaseUrl.hostname.slice(\"auth.\".length)}`;\n return gatewayUrl.host;\n}\n\nfunction parseUrlOrNull(value: string): URL | null {\n try {\n return new URL(value);\n } catch {\n return null;\n }\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return (\n hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\"\n );\n}\n\nfunction isSecureTransportProtocol(protocol: string): boolean {\n return protocol === \"https:\" || protocol === \"wss:\";\n}\n\nfunction isHttpTransportProtocol(protocol: string): boolean {\n return protocol === \"http:\" || protocol === \"https:\";\n}\n","import crypto from \"node:crypto\";\nimport type { OpenMeldRequestContext } from \"@openmeld/schemas/types\";\nimport type { OpenMeldProfile } from \"./openmeld-profiles-api\";\n\nexport type OpenMeldRequestContextProfileIdentity = {\n openMeldProfileId: string;\n profileKind?: \"human\" | \"agent\" | \"system\";\n kind?: \"human\" | \"agent\";\n profileHandle?: string;\n profileName: string;\n ownerUserId?: string;\n ownerName?: string;\n agentControllerConversationId?: string;\n};\n\nexport function buildOpenMeldRequestContextFromProfile(input: {\n openMeldProfile: OpenMeldProfile;\n requestId?: string;\n agentControllerConversationId?: string;\n}): OpenMeldRequestContext {\n const requestId =\n normalizeOptionalText(input.requestId) ?? crypto.randomUUID();\n const agentControllerConversationId = normalizeOptionalText(\n input.agentControllerConversationId\n );\n const ownerName = normalizeOptionalText(input.openMeldProfile.ownerName);\n\n return {\n actorContext: {\n requestId,\n openMeldProfileId: input.openMeldProfile.openMeldProfileId,\n profileKind: input.openMeldProfile.profileKind,\n profileHandle: input.openMeldProfile.profileHandle,\n profileName: input.openMeldProfile.profileName,\n ownerUserId: input.openMeldProfile.ownerUserId,\n ...(ownerName ? { ownerName } : {}),\n },\n ...(agentControllerConversationId ? { agentControllerConversationId } : {}),\n };\n}\n\nexport function buildOpenMeldRequestContextFromProfileIdentity(input: {\n profileIdentity: OpenMeldRequestContextProfileIdentity;\n requestId?: string;\n}): OpenMeldRequestContext {\n const requestId =\n normalizeOptionalText(input.requestId) ?? crypto.randomUUID();\n const profileHandle = normalizeOptionalText(\n input.profileIdentity.profileHandle\n );\n const ownerUserId = normalizeOptionalText(input.profileIdentity.ownerUserId);\n const ownerName = normalizeOptionalText(input.profileIdentity.ownerName);\n const agentControllerConversationId = normalizeOptionalText(\n input.profileIdentity.agentControllerConversationId\n );\n const profileKind =\n input.profileIdentity.profileKind ??\n (input.profileIdentity.kind === \"human\" ||\n input.profileIdentity.kind === \"agent\"\n ? input.profileIdentity.kind\n : \"system\");\n\n return {\n actorContext: {\n requestId,\n openMeldProfileId: input.profileIdentity.openMeldProfileId,\n profileKind,\n ...(profileHandle ? { profileHandle } : {}),\n profileName: input.profileIdentity.profileName,\n ...(ownerUserId ? { ownerUserId } : {}),\n ...(ownerName ? { ownerName } : {}),\n },\n ...(agentControllerConversationId ? { agentControllerConversationId } : {}),\n };\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n","import {\n buildOpenMeldRequestContextHeaders,\n type OpenMeldRequestContextHeadersInput,\n} from \"@openmeld/gateway-contract\";\nimport type { OpenMeldRequestContext } from \"@openmeld/schemas/types\";\nimport {\n type AuthRequestCompatibilityReason,\n canUseAuthSessionForRequest,\n resolveAuthRequestCompatibility,\n} from \"./auth-request-compatibility\";\nimport { getAuthSessionState, type StoredAuthSession } from \"./auth-session\";\nimport type { OpenMeldProfile } from \"./openmeld-profiles-api\";\nimport {\n buildOpenMeldRequestContextFromProfile,\n buildOpenMeldRequestContextFromProfileIdentity,\n type OpenMeldRequestContextProfileIdentity,\n} from \"./openmeld-request-context\";\n\nconst DEFAULT_TOKEN_TYPE = \"Bearer\";\nconst AUTHORIZATION_HEADER = \"Authorization\";\n\ntype RequestAuthHeadersInput = {\n authSession?: StoredAuthSession | null;\n requestUrl: string;\n};\n\ntype OpenMeldRequestContextHeadersWithAuthInput =\n OpenMeldRequestContextHeadersInput & {\n authSession?: StoredAuthSession | null;\n requestUrl: string;\n };\n\nexport type AuthTokenAttachment =\n | {\n status: \"attachable\";\n token: string;\n tokenType: string;\n }\n | {\n status: \"dropped\";\n reason: \"empty_token\" | AuthRequestCompatibilityReason;\n requestHost: string | null;\n authHost: string | null;\n expectedGatewayHost: string | null;\n };\n\nexport type DroppedAuthTokenAttachment = Extract<\n AuthTokenAttachment,\n { status: \"dropped\" }\n>;\n\nexport async function buildRequestAuthHeaders(\n input: RequestAuthHeadersInput\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n await attachAuthHeader(headers, input);\n return headers;\n}\n\nexport async function buildOpenMeldRequestContextHeadersWithAuth(\n input: OpenMeldRequestContextHeadersWithAuthInput\n): Promise<Record<string, string>> {\n const headers = buildOpenMeldRequestContextHeaders(input);\n await attachAuthHeader(headers, input);\n return headers;\n}\n\nexport async function buildOpenMeldProfileRequestHeadersWithAuth(input: {\n openMeldProfile: OpenMeldProfile;\n requestUrl: string;\n authSession?: StoredAuthSession | null;\n agentControllerConversationId?: string;\n spacePassword?: string;\n}): Promise<Record<string, string>> {\n return await buildOpenMeldRequestContextHeadersWithAuth({\n requestContext: buildOpenMeldRequestContextFromProfile({\n openMeldProfile: input.openMeldProfile,\n agentControllerConversationId: input.agentControllerConversationId,\n }),\n requestUrl: input.requestUrl,\n ...(input.authSession === undefined\n ? {}\n : { authSession: input.authSession }),\n ...(input.spacePassword === undefined\n ? {}\n : { spacePassword: input.spacePassword }),\n });\n}\n\nexport async function buildOpenMeldProfileIdentityRequestHeadersWithAuth(input: {\n profileIdentity: OpenMeldRequestContextProfileIdentity;\n requestUrl: string;\n authSession?: StoredAuthSession | null;\n spacePassword?: string;\n}): Promise<Record<string, string>> {\n return await buildOpenMeldRequestContextHeadersWithAuth({\n requestContext: buildOpenMeldRequestContextFromProfileIdentity({\n profileIdentity: input.profileIdentity,\n }),\n requestUrl: input.requestUrl,\n ...(input.authSession === undefined\n ? {}\n : { authSession: input.authSession }),\n ...(input.spacePassword === undefined\n ? {}\n : { spacePassword: input.spacePassword }),\n });\n}\n\nexport function withSpacePassword(\n requestContext: OpenMeldRequestContext,\n spacePassword?: string\n): OpenMeldRequestContextHeadersInput {\n return {\n requestContext,\n ...(spacePassword === undefined ? {} : { spacePassword }),\n };\n}\n\n// One decision for \"can this stored session authenticate this request\", with\n// the drop reason preserved. Header building and the daemon stream connect\n// gate must share this so they cannot drift apart.\nexport function resolveAuthTokenAttachment(input: {\n session: StoredAuthSession;\n requestUrl: string;\n}): AuthTokenAttachment {\n const compatibility = resolveAuthRequestCompatibility({\n session: input.session,\n requestUrl: input.requestUrl,\n });\n const token = normalizeAccessToken(input.session);\n if (!token) {\n return {\n status: \"dropped\",\n reason: \"empty_token\",\n requestHost: compatibility.requestHost,\n authHost: compatibility.authHost,\n expectedGatewayHost: compatibility.expectedGatewayHost,\n };\n }\n if (!compatibility.compatible) {\n return {\n status: \"dropped\",\n reason: compatibility.reason,\n requestHost: compatibility.requestHost,\n authHost: compatibility.authHost,\n expectedGatewayHost: compatibility.expectedGatewayHost,\n };\n }\n return {\n status: \"attachable\",\n token,\n tokenType: normalizeTokenType(input.session.tokenType),\n };\n}\n\nasync function attachAuthHeader(\n headers: Record<string, string>,\n input: RequestAuthHeadersInput\n): Promise<void> {\n const session = await resolveAuthSessionForHeaders(input);\n if (session === null) {\n // No stored credentials exist, so there is nothing to strip: the caller\n // is knowingly sending an unauthenticated request.\n return;\n }\n\n const attachment = resolveAuthTokenAttachment({\n session,\n requestUrl: input.requestUrl,\n });\n if (attachment.status === \"dropped\") {\n // The caller holds a session it believes is usable. Dropping the token is\n // still the safe outcome (never leak credentials to an incompatible\n // host), but it must stay visible in diagnostics instead of silently\n // dialing bare and surfacing as a remote 401.\n warnDroppedAuthToken(attachment);\n return;\n }\n headers[AUTHORIZATION_HEADER] = `${attachment.tokenType} ${attachment.token}`;\n}\n\nfunction warnDroppedAuthToken(attachment: DroppedAuthTokenAttachment): void {\n console.warn(\"[openmeld.auth.request_token_dropped]\", {\n authHost: attachment.authHost,\n expectedGatewayHost: attachment.expectedGatewayHost,\n reason: attachment.reason,\n requestHost: attachment.requestHost,\n });\n}\n\nasync function resolveAuthSessionForHeaders(\n input: RequestAuthHeadersInput\n): Promise<StoredAuthSession | null> {\n if (input.authSession !== undefined) {\n return input.authSession;\n }\n\n const sessionState = await getAuthSessionState();\n if (sessionState.state !== \"valid\" || sessionState.session === null) {\n return null;\n }\n\n return sessionState.session;\n}\n\nfunction normalizeAccessToken(session: StoredAuthSession): string {\n return String(session.accessToken ?? \"\").trim();\n}\n\nfunction normalizeTokenType(tokenType: string | undefined): string {\n const normalized = String(tokenType ?? \"\").trim();\n return normalized.length > 0 ? normalized : DEFAULT_TOKEN_TYPE;\n}\n\nexport function canAttachAuthTokenToRequest(\n session: StoredAuthSession,\n requestUrl: string\n): boolean {\n return canUseAuthSessionForRequest({\n session,\n requestUrl,\n });\n}\n","import {\n DEFAULT_SPACE_CONVERSATION_VALIDATE_TIMEOUT_MS,\n DEFAULT_SPACE_REQUEST_TIMEOUT_MS,\n MAX_SPACE_REQUEST_TIMEOUT_MS,\n MIN_SPACE_REQUEST_TIMEOUT_MS,\n} from \"../strategy-constants\";\n\nconst SPACE_REQUEST_TIMEOUT_ENV_KEY = \"OPENMELD_SPACE_REQUEST_TIMEOUT_MS\";\n\nexport function resolveSpaceRequestTimeoutMs(override?: number): number {\n if (isFinitePositiveNumber(override)) {\n return clampSpaceRequestTimeoutMs(override);\n }\n\n const fromEnv = Number.parseInt(\n String(process.env[SPACE_REQUEST_TIMEOUT_ENV_KEY] ?? \"\"),\n 10\n );\n if (isFinitePositiveNumber(fromEnv)) {\n return clampSpaceRequestTimeoutMs(fromEnv);\n }\n\n return DEFAULT_SPACE_REQUEST_TIMEOUT_MS;\n}\n\nexport function resolveSpaceRequestTimeoutMsForDiagnostics(): number {\n return resolveSpaceRequestTimeoutMs(undefined);\n}\n\nexport function resolveSpaceConversationValidateTimeoutMs(): number {\n return Math.max(\n resolveSpaceRequestTimeoutMs(undefined),\n DEFAULT_SPACE_CONVERSATION_VALIDATE_TIMEOUT_MS\n );\n}\n\nfunction clampSpaceRequestTimeoutMs(value: number): number {\n const normalized = Math.trunc(value);\n return Math.max(\n MIN_SPACE_REQUEST_TIMEOUT_MS,\n Math.min(MAX_SPACE_REQUEST_TIMEOUT_MS, normalized)\n );\n}\n\nfunction isFinitePositiveNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0;\n}\n","import {\n resolveSpaceRequestTimeoutMs,\n resolveSpaceRequestTimeoutMsForDiagnostics as resolveSpaceRequestTimeoutMsForCliDiagnostics,\n} from \"./request-timeout\";\n\nexport async function fetchSpaceRequestWithTimeout(input: {\n url: string;\n operation: string;\n init?: RequestInit;\n timeoutMs?: number;\n}): Promise<Response> {\n const timeoutMs = resolveSpaceRequestTimeoutMs(input.timeoutMs);\n const timeoutSignal = AbortSignal.timeout(timeoutMs);\n const composed = composeAbortSignals(input.init?.signal, timeoutSignal);\n\n try {\n try {\n return await fetch(input.url, {\n ...input.init,\n signal: composed.signal,\n });\n } catch (error) {\n // A keep-alive connection that a proxy silently dropped fails exactly\n // once and undici evicts it; the retry rides a fresh connection. This\n // is what keeps a long-lived service working behind flaky proxies\n // without asking users to touch their network config.\n if (\n timeoutSignal.aborted ||\n composed.signal.aborted ||\n !shouldWrapNetworkRequestError(error)\n ) {\n throw error;\n }\n return await fetch(input.url, {\n ...input.init,\n signal: composed.signal,\n });\n }\n } catch (error) {\n if (timeoutSignal.aborted) {\n throw createSpaceRequestTimeoutError({\n operation: input.operation,\n timeoutMs,\n cause: error,\n });\n }\n if (shouldWrapNetworkRequestError(error)) {\n throw createSpaceRequestNetworkError({\n operation: input.operation,\n url: input.url,\n cause: error,\n });\n }\n throw error;\n } finally {\n composed.cleanup();\n }\n}\n\nexport function resolveSpaceRequestTimeoutMsForDiagnostics(): number {\n return resolveSpaceRequestTimeoutMsForCliDiagnostics();\n}\n\nfunction createSpaceRequestTimeoutError(input: {\n operation: string;\n timeoutMs: number;\n cause: unknown;\n}): Error {\n const error = new Error(\n `${input.operation} request timed out after ${input.timeoutMs}ms`,\n { cause: input.cause }\n ) as Error & { code?: string };\n error.code = \"network.timeout\";\n return error;\n}\n\nfunction createSpaceRequestNetworkError(input: {\n operation: string;\n url: string;\n cause: unknown;\n}): Error {\n const error = new Error(\n `${input.operation} request could not reach ${describeRequestTarget(input.url)} (${toErrorMessage(input.cause)})`,\n { cause: input.cause }\n ) as Error & { code?: string };\n error.code = \"network.request_failed\";\n return error;\n}\n\nfunction composeAbortSignals(\n parent: AbortSignal | null | undefined,\n timeout: AbortSignal\n): { signal: AbortSignal; cleanup: () => void } {\n if (!parent) {\n return {\n signal: timeout,\n cleanup: () => undefined,\n };\n }\n\n if (parent.aborted || timeout.aborted) {\n const controller = new AbortController();\n controller.abort();\n return {\n signal: controller.signal,\n cleanup: () => undefined,\n };\n }\n\n const controller = new AbortController();\n const abort = () => {\n controller.abort();\n };\n\n parent.addEventListener(\"abort\", abort, { once: true });\n timeout.addEventListener(\"abort\", abort, { once: true });\n\n return {\n signal: controller.signal,\n cleanup: () => {\n parent.removeEventListener(\"abort\", abort);\n timeout.removeEventListener(\"abort\", abort);\n },\n };\n}\n\nfunction describeRequestTarget(url: string): string {\n try {\n return new URL(url).origin;\n } catch {\n return url;\n }\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n const message = error.message.trim();\n return message.length > 0 ? message : \"request failed\";\n }\n const message = String(error ?? \"\").trim();\n return message.length > 0 ? message : \"request failed\";\n}\n\nfunction shouldWrapNetworkRequestError(error: unknown): boolean {\n if (error instanceof TypeError) {\n return true;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof error.code === \"string\" &&\n error.code.startsWith(\"ERR_SSL_\")\n ) {\n return true;\n }\n const message = toErrorMessage(error).toLowerCase();\n return (\n message.includes(\"fetch failed\") ||\n message.includes(\"failed to fetch\") ||\n message.includes(\"network request failed\") ||\n message.includes(\"ssl_decryption_failed_or_bad_record_mac\")\n );\n}\n","import {\n createOpenMeldApiClient,\n type OpenMeldApiClientFoundation,\n} from \"@openmeld/api-client\";\nimport {\n buildOpenMeldRequestContextHeaders,\n OPENMELD_HEADER_REQUESTED_ORGANIZATION_ID,\n} from \"@openmeld/gateway-contract\";\nimport { buildRequestAuthHeaders } from \"../config/request-headers\";\nimport { fetchSpaceRequestWithTimeout } from \"./fetch-with-timeout\";\n\nexport function createCliApiClientFoundation(\n baseUrl: string,\n options: {\n onAuthHeadersResolved?: (headers: Record<string, string>) => void;\n organizationId?: string;\n } = {}\n): OpenMeldApiClientFoundation {\n return createOpenMeldApiClient({\n baseUrl,\n transport: async (request) =>\n await fetchSpaceRequestWithTimeout({\n url: request.url,\n operation: request.operation,\n init: request.init,\n timeoutMs: request.timeoutMs,\n }),\n getAuthHeaders: async ({ requestUrl }) => {\n const headers = await buildRequestAuthHeaders({\n requestUrl,\n });\n if (options.organizationId) {\n headers[OPENMELD_HEADER_REQUESTED_ORGANIZATION_ID] =\n options.organizationId;\n }\n options.onAuthHeadersResolved?.(headers);\n return headers;\n },\n getRequestContextHeaders: async ({ requestContext, spacePassword }) =>\n buildOpenMeldRequestContextHeaders({\n requestContext,\n ...(spacePassword === undefined ? {} : { spacePassword }),\n }),\n });\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { Nt as openMeldRootDir, hn as __exportAll } from "./base-url-KfrIdedc.js";
4
- import { t as CURRENT_DAEMON_EXECUTION_CONTRACT_EPOCH } from "./runtime-transport-Bs6YfTqj.js";
3
+ import { Nt as openMeldRootDir, _n as __exportAll } from "./base-url-Cv9x5Es9.js";
4
+ import { t as CURRENT_DAEMON_EXECUTION_CONTRACT_EPOCH } from "./runtime-transport-BLEvh9zX.js";
5
5
  import { join, resolve } from "node:path";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  import { mkdir, open, readFile, rename, rm, writeFile } from "node:fs/promises";
@@ -743,4 +743,4 @@ async function removeSessionFileBestEffort() {
743
743
  //#endregion
744
744
  export { RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_RETRY_INTERVAL_MS as A, MIN_SPACE_REQUEST_TIMEOUT_MS as C, REGISTER_RESPONSE_TIMEOUT_MS as D, PROVIDER_CONVERSATION_PROOF_SYNC_RETRY_INTERVAL_MS as E, ROUTE_CATALOG_LOAD_TIMEOUT_MS as O, MIN_HEARTBEAT_INTERVAL_MS as S, PROVIDER_CONVERSATION_PROOF_SYNC_INTERVAL_MS as T, DEFAULT_HEARTBEAT_INTERVAL_MS as _, getAuthSessionState as a, MAX_HEARTBEAT_INTERVAL_MS as b, setAuthSession as c, CATALOG_SYNC_SIGNAL_POLL_INTERVAL_MS as d, DAEMON_RUNTIME_CONTRACT_EPOCH as f, DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS as g, DAEMON_STREAM_KEEPALIVE_PONG_TIMEOUT_MS as h, getAuthSessionMetadata as i, RUNTIME_STATE_PERSIST_MIN_INTERVAL_MS as j, RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_INTERVAL_MS as k, updateAuthSessionActiveOrganization as l, DAEMON_STREAM_KEEPALIVE_INTERVAL_MS as m, clearAuthSession as n, getCurrentAuthOwnerUserId as o, DAEMON_STREAM_CONNECT_TIMEOUT_MS as p, getAuthSession as r, normalizeStoredActiveOrganization as s, auth_session_exports as t, CATALOG_SYNC_RETRY_INTERVAL_MS as u, DEFAULT_SPACE_REQUEST_TIMEOUT_MS as v, OPENCLAW_CLI_TIMEOUT_MS as w, MAX_SPACE_REQUEST_TIMEOUT_MS as x, HEARTBEAT_RESPONSE_TIMEOUT_MS as y };
745
745
 
746
- //# sourceMappingURL=auth-session-BZgsNHJA.js.map
746
+ //# sourceMappingURL=auth-session-BOKcW_84.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-session-BZgsNHJA.js","names":["exhaustiveState"],"sources":["../src/strategy-constants.ts","../src/config/token-store.ts","../src/config/auth-session.ts"],"sourcesContent":["import { CURRENT_DAEMON_EXECUTION_CONTRACT_EPOCH } from \"@openmeld/schemas\";\n\n// CLI and local daemon timing policy values. Keep this deployment-local; Core\n// and Web have their own constants files even when values intentionally match.\nexport const DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS = 30_000;\nexport const DEFAULT_REMOTE_SESSION_TIMEOUT_MS = 8000;\nexport const LOOPBACK_REMOTE_SESSION_TIMEOUT_MS = 1500;\nexport const DEFAULT_WEB_AGENT_SELECTION_TIMEOUT_MS = 30 * 60 * 1000;\nexport const DEFAULT_WEB_AGENT_SELECTION_POLL_INTERVAL_MS = 2000;\nexport const DEFAULT_SPACE_REQUEST_TIMEOUT_MS = 10_000;\nexport const DEFAULT_SPACE_CONVERSATION_VALIDATE_TIMEOUT_MS = 60_000;\nexport const MIN_SPACE_REQUEST_TIMEOUT_MS = 1000;\nexport const MAX_SPACE_REQUEST_TIMEOUT_MS = 120_000;\nexport const DEFAULT_HEARTBEAT_INTERVAL_MS = 25_000;\nexport const MIN_HEARTBEAT_INTERVAL_MS = 5000;\nexport const MAX_HEARTBEAT_INTERVAL_MS = 60_000;\n// Daemon stream keepalive PING cadence. Sub-idle (below the gateway/Cloudflare\n// idle-eviction window) and independent of the heartbeat, so a quiet daemon\n// socket stays warm even when no heartbeat is due. Carries no lease/readiness.\nexport const DAEMON_STREAM_KEEPALIVE_INTERVAL_MS = 20_000;\n// Each keepalive PING must see the hub's auto-answered PONG within this\n// window, or the socket is treated as half-open and terminated so the normal\n// reconnect path (which also redelivers in-flight dispatch pushes) can run.\n// Without this deadline a half-open socket is only detected by the heartbeat\n// failure path, which can take ~40s+ at the idle-grown heartbeat interval.\nexport const DAEMON_STREAM_KEEPALIVE_PONG_TIMEOUT_MS = 10_000;\nexport const CATALOG_SYNC_INTERVAL_MULTIPLIER = 3;\nexport const MIN_CATALOG_SYNC_INTERVAL_MS = 15_000;\nexport const MAX_CATALOG_SYNC_INTERVAL_MS = 45_000;\nexport const CATALOG_SYNC_RETRY_INTERVAL_MS = 5000;\nexport const CATALOG_SYNC_SIGNAL_POLL_INTERVAL_MS = 1000;\nexport const ROUTE_CATALOG_LOAD_TIMEOUT_MS = 15_000;\nexport const RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_INTERVAL_MS = 5 * 60_000;\nexport const RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_RETRY_INTERVAL_MS = 60_000;\nexport const PROVIDER_CONVERSATION_PROOF_SYNC_INTERVAL_MS = 5 * 60_000;\nexport const PROVIDER_CONVERSATION_PROOF_SYNC_RETRY_INTERVAL_MS = 60_000;\nexport const RUNTIME_STATE_PERSIST_MIN_INTERVAL_MS = 60_000;\nexport const DAEMON_STREAM_CONNECT_TIMEOUT_MS = 15_000;\nexport const REGISTER_RESPONSE_TIMEOUT_MS = 10_000;\nexport const HEARTBEAT_RESPONSE_TIMEOUT_MS = 15_000;\nexport const DAEMON_RUNTIME_CONTRACT_EPOCH =\n CURRENT_DAEMON_EXECUTION_CONTRACT_EPOCH;\nexport const OPENCLAW_CLI_TIMEOUT_MS = 30_000;\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { openMeldRootDir } from \"./paths\";\n\nconst TOKEN_STORE_KEYCHAIN_SERVICE = \"sh.openmeld.auth.token\";\nconst INSECURE_FALLBACK_ENV_KEY = \"OPENMELD_AUTH_ALLOW_INSECURE_FILE_TOKEN\";\nconst FORCE_INSECURE_STORE_ENV_KEY = \"OPENMELD_AUTH_FORCE_INSECURE_FILE_TOKEN\";\nconst COMMAND_MAX_BUFFER_BYTES = 1024 * 1024;\nconst COMMAND_TIMEOUT_MS = 30_000;\nconst TOKEN_FILE_KEY_PATTERN = /^[a-f0-9]{64}$/u;\nconst EXEC_FILE_BASE_OPTIONS = {\n windowsHide: true,\n maxBuffer: COMMAND_MAX_BUFFER_BYTES,\n timeout: COMMAND_TIMEOUT_MS,\n} as const;\nlet insecureFallbackWarningShown = false;\n\ntype MacOsTokenRef = {\n provider: \"macos-keychain\";\n service: string;\n account: string;\n};\n\ntype WindowsDpapiTokenRef = {\n provider: \"windows-dpapi\";\n key: string;\n};\n\ntype InsecureFileTokenRef = {\n provider: \"insecure-file\";\n key: string;\n};\n\nexport type StoredTokenRef =\n | MacOsTokenRef\n | WindowsDpapiTokenRef\n | InsecureFileTokenRef;\n\nexport type AccessTokenReadResult =\n | {\n accessToken: string;\n status: \"found\";\n }\n | {\n status: \"missing\";\n }\n | {\n errorMessage: string;\n status: \"unavailable\";\n };\n\ntype StoreTokenInput = {\n accessToken: string;\n authBaseUrl: string;\n clientId: string;\n};\n\nexport async function storeAccessToken(\n input: StoreTokenInput\n): Promise<StoredTokenRef> {\n const key = buildTokenKey({\n authBaseUrl: input.authBaseUrl,\n clientId: input.clientId,\n });\n\n if (shouldForceInsecureStore()) {\n await setInsecureFileToken({\n key,\n accessToken: input.accessToken,\n });\n return {\n provider: \"insecure-file\",\n key,\n };\n }\n\n if (process.platform === \"darwin\") {\n try {\n const account = buildMacOsAccount(key);\n await setMacOsKeychainToken({\n service: TOKEN_STORE_KEYCHAIN_SERVICE,\n account,\n accessToken: input.accessToken,\n });\n return {\n provider: \"macos-keychain\",\n service: TOKEN_STORE_KEYCHAIN_SERVICE,\n account,\n };\n } catch (error) {\n if (allowInsecureFallback()) {\n await setInsecureFileToken({\n key,\n accessToken: input.accessToken,\n });\n return {\n provider: \"insecure-file\",\n key,\n };\n }\n throw new Error(\n `failed to store access token in macOS Keychain: ${toErrorMessage(error)}`\n );\n }\n }\n\n if (process.platform === \"win32\") {\n try {\n await setWindowsDpapiToken({\n key,\n accessToken: input.accessToken,\n });\n return {\n provider: \"windows-dpapi\",\n key,\n };\n } catch (error) {\n if (allowInsecureFallback()) {\n await setInsecureFileToken({\n key,\n accessToken: input.accessToken,\n });\n return {\n provider: \"insecure-file\",\n key,\n };\n }\n throw new Error(\n `failed to store access token via Windows DPAPI: ${toErrorMessage(error)}`\n );\n }\n }\n\n if (allowInsecureFallback()) {\n await setInsecureFileToken({\n key,\n accessToken: input.accessToken,\n });\n return {\n provider: \"insecure-file\",\n key,\n };\n }\n\n throw new Error(\n `secure token storage is unavailable on platform \"${process.platform}\". ` +\n `Use ${INSECURE_FALLBACK_ENV_KEY}=1 only for local testing fallback.`\n );\n}\n\nexport async function readAccessToken(\n ref: StoredTokenRef\n): Promise<AccessTokenReadResult> {\n try {\n if (ref.provider === \"macos-keychain\") {\n return toAccessTokenReadResult(await getMacOsKeychainToken(ref));\n }\n if (ref.provider === \"windows-dpapi\") {\n return toAccessTokenReadResult(await getWindowsDpapiToken(ref));\n }\n if (ref.provider === \"insecure-file\") {\n return toAccessTokenReadResult(await getInsecureFileToken(ref));\n }\n return { status: \"missing\" };\n } catch (error) {\n return {\n errorMessage: toErrorMessage(error),\n status: \"unavailable\",\n };\n }\n}\n\nexport async function deleteAccessToken(ref: StoredTokenRef): Promise<void> {\n if (ref.provider === \"macos-keychain\") {\n await deleteMacOsKeychainToken(ref).catch(() => undefined);\n return;\n }\n if (ref.provider === \"windows-dpapi\") {\n await deleteWindowsDpapiToken(ref).catch(() => undefined);\n return;\n }\n if (ref.provider === \"insecure-file\") {\n await deleteInsecureFileToken(ref).catch(() => undefined);\n }\n}\n\nexport function isStoredTokenRef(value: unknown): value is StoredTokenRef {\n if (!(value && typeof value === \"object\")) {\n return false;\n }\n const record = value as Record<string, unknown>;\n const provider = normalizeString(record.provider);\n if (provider === \"macos-keychain\") {\n return Boolean(\n normalizeString(record.service) && normalizeString(record.account)\n );\n }\n if (provider === \"windows-dpapi\" || provider === \"insecure-file\") {\n return normalizeTokenFileKey(record.key) !== null;\n }\n return false;\n}\n\nfunction buildTokenKey(input: {\n authBaseUrl: string;\n clientId: string;\n}): string {\n const rootDir = resolve(openMeldRootDir());\n return createHash(\"sha256\")\n .update(`${input.clientId}\\n${input.authBaseUrl}\\n${rootDir}`)\n .digest(\"hex\");\n}\n\nfunction buildMacOsAccount(key: string): string {\n return `openmeld-auth-${key}`;\n}\n\nasync function setMacOsKeychainToken(input: {\n service: string;\n account: string;\n accessToken: string;\n}): Promise<void> {\n // Keep login non-interactive via the native `security` CLI integration.\n // This passes token via argv, which is a known exposure tradeoff.\n await runCommand(\"security\", [\n \"add-generic-password\",\n \"-U\",\n \"-a\",\n input.account,\n \"-s\",\n input.service,\n \"-w\",\n input.accessToken,\n ]);\n}\n\nasync function getMacOsKeychainToken(input: {\n service: string;\n account: string;\n}): Promise<string | null> {\n try {\n const result = await runCommand(\"security\", [\n \"find-generic-password\",\n \"-a\",\n input.account,\n \"-s\",\n input.service,\n \"-w\",\n ]);\n return result.stdout.trim();\n } catch (error) {\n if (isMacOsNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n}\n\nasync function deleteMacOsKeychainToken(input: {\n service: string;\n account: string;\n}): Promise<void> {\n try {\n await runCommand(\"security\", [\n \"delete-generic-password\",\n \"-a\",\n input.account,\n \"-s\",\n input.service,\n ]);\n } catch (error) {\n if (isMacOsNotFoundError(error)) {\n return;\n }\n throw error;\n }\n}\n\nasync function setWindowsDpapiToken(input: {\n key: string;\n accessToken: string;\n}): Promise<void> {\n const encrypted = await runPowerShellScript(\n WINDOWS_DPAPI_ENCRYPT_SCRIPT,\n input.accessToken,\n input.key\n );\n await mkdir(tokenDirectoryPath(), { recursive: true });\n // NOTE: `mode: 0o600` is POSIX-only and Windows ignores it.\n // For `tokenDirectoryPath()` + `windowsDpapiTokenPath()` we rely on DPAPI\n // and Windows ACLs for equivalent protection.\n await writeFile(windowsDpapiTokenPath(input.key), `${encrypted.trim()}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n}\n\nasync function getWindowsDpapiToken(input: {\n key: string;\n}): Promise<string | null> {\n const encrypted = await readFile(\n windowsDpapiTokenPath(input.key),\n \"utf8\"\n ).catch((error) => {\n if (isFileNotFoundError(error)) {\n return null;\n }\n throw error;\n });\n if (!encrypted) {\n return null;\n }\n return runPowerShellScript(\n WINDOWS_DPAPI_DECRYPT_SCRIPT,\n encrypted.trim(),\n input.key\n );\n}\n\nasync function deleteWindowsDpapiToken(input: { key: string }): Promise<void> {\n await rm(windowsDpapiTokenPath(input.key), { force: true });\n}\n\nasync function setInsecureFileToken(input: {\n key: string;\n accessToken: string;\n}): Promise<void> {\n await mkdir(tokenDirectoryPath(), { recursive: true });\n await writeFile(insecureTokenPath(input.key), `${input.accessToken}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n}\n\nasync function getInsecureFileToken(input: {\n key: string;\n}): Promise<string | null> {\n const raw = await readFile(insecureTokenPath(input.key), \"utf8\").catch(\n (error) => {\n if (isFileNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n );\n return raw ? raw.trim() : null;\n}\n\nasync function deleteInsecureFileToken(input: { key: string }): Promise<void> {\n await rm(insecureTokenPath(input.key), { force: true });\n}\n\nfunction tokenDirectoryPath(): string {\n return join(openMeldRootDir(), \"auth\", \"tokens\");\n}\n\nfunction windowsDpapiTokenPath(key: string): string {\n return join(tokenDirectoryPath(), `${requireValidTokenFileKey(key)}.dpapi`);\n}\n\nfunction insecureTokenPath(key: string): string {\n return join(tokenDirectoryPath(), `${requireValidTokenFileKey(key)}.token`);\n}\n\nfunction allowInsecureFallback(): boolean {\n if (process.env[INSECURE_FALLBACK_ENV_KEY] === \"1\") {\n warnInsecureFallback(\"env\");\n return true;\n }\n // Known downgrade behavior:\n // On platforms without native secure-store support, OpenMeld currently falls back\n // to local file token storage by default for compatibility.\n const fallbackEnabled = !isNativeSecureStorePlatform();\n if (fallbackEnabled) {\n warnInsecureFallback(\"platform\");\n }\n return fallbackEnabled;\n}\n\nfunction warnInsecureFallback(reason: \"env\" | \"platform\"): void {\n if (insecureFallbackWarningShown) {\n return;\n }\n insecureFallbackWarningShown = true;\n\n const reasonText =\n reason === \"env\"\n ? `enabled by ${INSECURE_FALLBACK_ENV_KEY}=1`\n : `enabled automatically on platform \"${process.platform}\"`;\n console.warn(\n `[openmeld auth] plaintext file token storage fallback is active (${reasonText}). ` +\n `Unset ${INSECURE_FALLBACK_ENV_KEY} to disable explicit opt-in, ` +\n \"and prefer macOS or Windows for native secure token storage.\"\n );\n}\n\nfunction shouldForceInsecureStore(): boolean {\n return process.env[FORCE_INSECURE_STORE_ENV_KEY] === \"1\";\n}\n\nfunction isNativeSecureStorePlatform(): boolean {\n return process.platform === \"darwin\" || process.platform === \"win32\";\n}\n\nasync function runPowerShellScript(\n script: string,\n token: string,\n entropy: string\n): Promise<string> {\n const payload = JSON.stringify({ token, entropy });\n const result = await runCommand(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-Command\",\n script,\n ],\n payload\n );\n return result.stdout.trim();\n}\n\nasync function runCommand(\n command: string,\n args: string[],\n stdinPayload?: string\n): Promise<{ stdout: string; stderr: string }> {\n try {\n if (stdinPayload === undefined) {\n const output = await runExecFile(command, args);\n return output;\n }\n\n const { execFile } = await import(\"node:child_process\");\n const output = await new Promise<{ stdout: string; stderr: string }>(\n (resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n\n const child = execFile(command, args, { ...EXEC_FILE_BASE_OPTIONS });\n\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: unknown) => {\n stdout += String(chunk);\n });\n child.stderr?.on(\"data\", (chunk: unknown) => {\n stderr += String(chunk);\n });\n\n child.on(\"error\", (error) => {\n reject(toCommandError(error, command));\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve({ stdout, stderr });\n return;\n }\n reject(\n toCommandError(\n {\n message: `command failed (${command}) with exit code ${code}`,\n },\n command\n )\n );\n });\n\n child.stdin?.write(stdinPayload);\n child.stdin?.end();\n }\n );\n return output;\n } catch (error) {\n throw toCommandError(error, command);\n }\n}\n\nasync function runExecFile(\n command: string,\n args: string[]\n): Promise<{ stdout: string; stderr: string }> {\n const { execFile } = await import(\"node:child_process\");\n const output = await new Promise<{ stdout: string; stderr: string }>(\n (resolve, reject) => {\n execFile(\n command,\n args,\n {\n ...EXEC_FILE_BASE_OPTIONS,\n encoding: \"utf8\",\n },\n (error, stdout, stderr) => {\n if (error) {\n reject(toCommandError(error, command));\n return;\n }\n resolve({\n stdout: String(stdout ?? \"\"),\n stderr: String(stderr ?? \"\"),\n });\n }\n );\n }\n );\n return output;\n}\n\nfunction toCommandError(\n error: unknown,\n command: string\n): Error & { code?: number | null; stdout?: string; stderr?: string } {\n if (!(error && typeof error === \"object\")) {\n return new Error(`command failed (${command}): ${String(error)}`);\n }\n const e = error as NodeJS.ErrnoException & {\n stdout?: string;\n stderr?: string;\n code?: number | null | string;\n };\n const code = typeof e.code === \"number\" ? e.code : null;\n const messageParts = [`command failed (${command})`];\n if (typeof e.stderr === \"string\" && e.stderr.trim()) {\n messageParts.push(`stderr: ${e.stderr.trim()}`);\n } else if (e.message) {\n messageParts.push(e.message);\n }\n const wrapped = new Error(messageParts.join(\"; \")) as Error & {\n code?: number | null;\n stdout?: string;\n stderr?: string;\n };\n wrapped.code = code;\n wrapped.stdout = e.stdout;\n wrapped.stderr = e.stderr;\n return wrapped;\n}\n\nfunction isMacOsNotFoundError(error: unknown): boolean {\n if (!(error && typeof error === \"object\")) {\n return false;\n }\n const record = error as { stderr?: string; message?: string; code?: number };\n const text = `${record.stderr ?? \"\"} ${record.message ?? \"\"}`.toLowerCase();\n return (\n record.code === 44 ||\n text.includes(\"could not be found in the keychain\") ||\n text.includes(\"the specified item could not be found\")\n );\n}\n\nfunction normalizeString(value: unknown): string {\n return String(value ?? \"\").trim();\n}\n\nfunction normalizeTokenFileKey(value: unknown): string | null {\n const normalized = normalizeString(value);\n if (!TOKEN_FILE_KEY_PATTERN.test(normalized)) {\n return null;\n }\n return normalized;\n}\n\nfunction requireValidTokenFileKey(value: unknown): string {\n const normalized = normalizeTokenFileKey(value);\n if (normalized === null) {\n throw new Error(\"stored token key is invalid\");\n }\n return normalized;\n}\n\nfunction normalizeToken(value: string | null): string | null {\n if (value === null) {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toAccessTokenReadResult(value: string | null): AccessTokenReadResult {\n const accessToken = normalizeToken(value);\n if (!accessToken) {\n return { status: \"missing\" };\n }\n return {\n accessToken,\n status: \"found\",\n };\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nconst WINDOWS_DPAPI_ENCRYPT_SCRIPT = [\n \"$ErrorActionPreference='Stop'\",\n \"$rawInput = [Console]::In.ReadToEnd()\",\n \"$payload = $rawInput | ConvertFrom-Json\",\n \"$plain=[System.Text.Encoding]::UTF8.GetBytes($payload.token)\",\n \"$entropy=[System.Text.Encoding]::UTF8.GetBytes($payload.entropy)\",\n \"$cipher=[System.Security.Cryptography.ProtectedData]::Protect($plain,$entropy,[System.Security.Cryptography.DataProtectionScope]::CurrentUser)\",\n \"[System.Convert]::ToBase64String($cipher)\",\n].join(\";\");\n\nconst WINDOWS_DPAPI_DECRYPT_SCRIPT = [\n \"$ErrorActionPreference='Stop'\",\n \"$rawInput = [Console]::In.ReadToEnd()\",\n \"$payload = $rawInput | ConvertFrom-Json\",\n \"$cipher=[System.Convert]::FromBase64String($payload.token)\",\n \"$entropy=[System.Text.Encoding]::UTF8.GetBytes($payload.entropy)\",\n \"$plain=[System.Security.Cryptography.ProtectedData]::Unprotect($cipher,$entropy,[System.Security.Cryptography.DataProtectionScope]::CurrentUser)\",\n \"[System.Text.Encoding]::UTF8.GetString($plain)\",\n].join(\";\");\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n DEFAULT_REMOTE_SESSION_TIMEOUT_MS,\n LOOPBACK_REMOTE_SESSION_TIMEOUT_MS,\n} from \"../strategy-constants\";\nimport { openMeldRootDir } from \"./paths\";\nimport {\n deleteAccessToken,\n isStoredTokenRef,\n readAccessToken,\n type StoredTokenRef,\n storeAccessToken,\n} from \"./token-store\";\n\ntype AuthSessionV1 = {\n v: 1;\n tokenRef: StoredTokenRef;\n tokenType: string;\n authBaseUrl: string;\n clientId: string;\n createdAt: string;\n expiresAt?: string;\n scope?: string;\n user?: {\n id?: string;\n email?: string;\n name?: string;\n };\n activeOrganization?: StoredActiveOrganization;\n};\n\nexport type StoredActiveOrganization = {\n id: string;\n slug: string;\n name: string;\n role?: string;\n personal?: boolean;\n};\n\nexport type StoredAuthSession = {\n v: 1;\n accessToken: string;\n tokenType: string;\n authBaseUrl: string;\n clientId: string;\n createdAt: string;\n expiresAt?: string;\n scope?: string;\n user?: {\n id?: string;\n email?: string;\n name?: string;\n };\n activeOrganization?: StoredActiveOrganization;\n};\n\nexport type AuthSessionState =\n | \"missing\"\n | \"valid\"\n | \"expired\"\n | \"invalid\"\n | \"revoked\";\n\nexport type AuthSessionStateReasonCode =\n | \"remote_session_invalid\"\n | \"remote_session_revoked\"\n | \"session_expired\"\n | \"session_metadata_invalid\"\n | \"session_missing\"\n | \"session_token_missing\"\n | \"session_token_ref_invalid\"\n | \"session_token_unavailable\";\n\nexport type AuthSessionStateResult = {\n errorMessage?: string;\n reasonCode?: AuthSessionStateReasonCode;\n state: AuthSessionState;\n session: StoredAuthSession | null;\n};\n\nexport type AuthSessionMetadata = {\n authBaseUrl: string;\n clientId: string;\n createdAt: string;\n expiresAt?: string;\n scope?: string;\n user?: {\n id?: string;\n email?: string;\n name?: string;\n };\n activeOrganization?: StoredActiveOrganization;\n};\n\ntype GetAuthSessionStateOptions = {\n validateRemote?: boolean;\n};\n\ntype LocalAuthSessionState =\n | {\n errorMessage?: string;\n reasonCode: Exclude<\n AuthSessionStateReasonCode,\n \"remote_session_invalid\" | \"remote_session_revoked\" | \"session_expired\"\n >;\n state: \"missing\" | \"invalid\";\n session: null;\n }\n | {\n reasonCode: \"session_expired\";\n state: \"expired\";\n session: StoredAuthSession;\n }\n | {\n state: \"valid\";\n session: StoredAuthSession;\n };\n\ntype RemoteAuthSessionState = \"valid\" | \"invalid\" | \"revoked\" | \"unknown\";\ntype RemoteAuthSessionValidation = {\n state: RemoteAuthSessionState;\n};\nconst TRAILING_SLASHES_RE = /\\/+$/u;\n\nexport async function getAuthSessionState(\n options: GetAuthSessionStateOptions = {}\n): Promise<AuthSessionStateResult> {\n const localState = await getLocalAuthSessionState();\n switch (localState.state) {\n case \"missing\":\n case \"invalid\":\n case \"expired\":\n return localState;\n case \"valid\":\n break;\n default:\n return localState;\n }\n if (!options.validateRemote) {\n return localState;\n }\n\n const remoteValidation = await getRemoteAuthSessionState(localState.session);\n if (remoteValidation.state === \"valid\") {\n return localState;\n }\n if (remoteValidation.state === \"unknown\") {\n return localState;\n }\n\n return {\n reasonCode: resolveRemoteAuthSessionReasonCode(remoteValidation.state),\n state: remoteValidation.state,\n session: null,\n };\n}\n\n// The signed-in owner user id from the local session, or null when signed\n// out. Callers use this as the expected owner for service account-alignment\n// checks; it never validates remotely.\nexport async function getCurrentAuthOwnerUserId(): Promise<string | null> {\n const authState = await getAuthSessionState({\n validateRemote: false,\n }).catch(() => null);\n const ownerUserId = authState?.session?.user?.id?.trim() ?? \"\";\n return ownerUserId.length > 0 ? ownerUserId : null;\n}\n\nexport async function setAuthSession(input: {\n accessToken: string;\n tokenType?: string;\n authBaseUrl: string;\n clientId: string;\n expiresAt?: string;\n scope?: string;\n user?: {\n id?: string;\n email?: string;\n name?: string;\n };\n activeOrganization?: StoredActiveOrganization | null;\n}): Promise<void> {\n const accessToken = String(input.accessToken ?? \"\").trim();\n if (!accessToken) {\n throw new Error(\"access token is required\");\n }\n\n const authBaseUrl = String(input.authBaseUrl ?? \"\").trim();\n if (!authBaseUrl) {\n throw new Error(\"auth base URL is required\");\n }\n\n const clientId = String(input.clientId ?? \"\").trim();\n if (!clientId) {\n throw new Error(\"client_id is required\");\n }\n\n const tokenRef = await storeAccessToken({\n accessToken,\n authBaseUrl,\n clientId,\n });\n\n const payload: AuthSessionV1 = {\n v: 1,\n tokenRef,\n tokenType: String(input.tokenType ?? \"Bearer\").trim() || \"Bearer\",\n authBaseUrl,\n clientId,\n createdAt: new Date().toISOString(),\n ...(input.expiresAt ? { expiresAt: input.expiresAt } : {}),\n ...(input.scope ? { scope: input.scope } : {}),\n ...buildAuthUserPayload(input.user),\n ...buildActiveOrganizationPayload(input.activeOrganization),\n };\n\n const path = authSessionPath();\n await mkdir(join(openMeldRootDir(), \"auth\"), { recursive: true });\n\n try {\n await writeSessionPayloadAtomically(path, payload);\n } catch (error) {\n await deleteAccessToken(tokenRef).catch(() => undefined);\n throw error;\n }\n}\n\nexport async function getAuthSession(): Promise<StoredAuthSession | null> {\n const localState = await getLocalAuthSessionState();\n if (localState.state === \"missing\" || localState.state === \"invalid\") {\n return null;\n }\n return localState.session;\n}\n\nexport async function getAuthSessionMetadata(): Promise<AuthSessionMetadata | null> {\n const payload = await readSessionPayload();\n if (payload?.v !== 1) {\n return null;\n }\n\n const authBaseUrl = normalizeOptionalString(payload.authBaseUrl);\n const clientId = normalizeOptionalString(payload.clientId);\n const createdAt = normalizeOptionalString(payload.createdAt);\n if (!(authBaseUrl && clientId && createdAt)) {\n return null;\n }\n\n return {\n authBaseUrl,\n clientId,\n createdAt,\n ...(typeof payload.expiresAt === \"string\" && payload.expiresAt.trim()\n ? { expiresAt: payload.expiresAt.trim() }\n : {}),\n ...(typeof payload.scope === \"string\" && payload.scope.trim()\n ? { scope: payload.scope.trim() }\n : {}),\n ...buildAuthUserPayload(payload.user),\n ...buildActiveOrganizationPayload(payload.activeOrganization),\n };\n}\n\nexport async function updateAuthSessionActiveOrganization(\n activeOrganization: StoredActiveOrganization | null\n): Promise<void> {\n const payload = await readSessionPayload();\n if (payload?.v !== 1) {\n throw new Error(\"cannot update active organization without auth session\");\n }\n\n const tokenRef = normalizeTokenRef(payload.tokenRef);\n const tokenType = normalizeOptionalString(payload.tokenType);\n const authBaseUrl = normalizeOptionalString(payload.authBaseUrl);\n const clientId = normalizeOptionalString(payload.clientId);\n const createdAt = normalizeOptionalString(payload.createdAt);\n if (!(tokenRef && tokenType && authBaseUrl && clientId && createdAt)) {\n throw new Error(\n \"cannot update active organization for invalid auth session\"\n );\n }\n\n const nextPayload: AuthSessionV1 = {\n v: 1,\n tokenRef,\n tokenType,\n authBaseUrl,\n clientId,\n createdAt,\n ...(typeof payload.expiresAt === \"string\" && payload.expiresAt.trim()\n ? { expiresAt: payload.expiresAt.trim() }\n : {}),\n ...(typeof payload.scope === \"string\" && payload.scope.trim()\n ? { scope: payload.scope.trim() }\n : {}),\n ...buildAuthUserPayload(payload.user),\n ...buildActiveOrganizationPayload(activeOrganization),\n };\n\n await writeSessionPayloadAtomically(authSessionPath(), nextPayload);\n}\n\nexport async function clearAuthSession(): Promise<void> {\n const payload = await readSessionPayload();\n if (payload?.v === 1 && isStoredTokenRef(payload.tokenRef)) {\n await deleteAccessToken(payload.tokenRef).catch(() => undefined);\n }\n await removeSessionFileBestEffort();\n}\n\nasync function getLocalAuthSessionState(): Promise<LocalAuthSessionState> {\n const payload = await readSessionPayload();\n if (payload?.v !== 1) {\n return {\n reasonCode: \"session_missing\",\n state: \"missing\",\n session: null,\n };\n }\n\n const tokenRef = normalizeTokenRef(payload.tokenRef);\n if (!tokenRef) {\n return {\n reasonCode: \"session_token_ref_invalid\",\n state: \"invalid\",\n session: null,\n };\n }\n\n const tokenType = normalizeOptionalString(payload.tokenType);\n const authBaseUrl = normalizeOptionalString(payload.authBaseUrl);\n const clientId = normalizeOptionalString(payload.clientId);\n const createdAt = normalizeOptionalString(payload.createdAt);\n if (!(tokenType && authBaseUrl && clientId && createdAt)) {\n return {\n reasonCode: \"session_metadata_invalid\",\n state: \"invalid\",\n session: null,\n };\n }\n\n const accessToken = await readAccessToken(tokenRef);\n if (accessToken.status === \"missing\") {\n return {\n reasonCode: \"session_token_missing\",\n state: \"invalid\",\n session: null,\n };\n }\n if (accessToken.status === \"unavailable\") {\n return {\n errorMessage: accessToken.errorMessage,\n reasonCode: \"session_token_unavailable\",\n state: \"invalid\",\n session: null,\n };\n }\n\n const session: StoredAuthSession = {\n v: 1,\n accessToken: accessToken.accessToken,\n tokenType,\n authBaseUrl,\n clientId,\n createdAt,\n ...(typeof payload.expiresAt === \"string\" && payload.expiresAt.trim()\n ? { expiresAt: payload.expiresAt.trim() }\n : {}),\n ...(typeof payload.scope === \"string\" && payload.scope.trim()\n ? { scope: payload.scope.trim() }\n : {}),\n ...buildAuthUserPayload(payload.user),\n ...buildActiveOrganizationPayload(payload.activeOrganization),\n };\n\n if (isExpired(session.expiresAt)) {\n return {\n reasonCode: \"session_expired\",\n state: \"expired\",\n session,\n };\n }\n\n return {\n state: \"valid\",\n session,\n };\n}\n\nfunction normalizeTokenRef(input: unknown): StoredTokenRef | null {\n if (!isStoredTokenRef(input)) {\n return null;\n }\n return input;\n}\n\nasync function getRemoteAuthSessionState(\n session: StoredAuthSession\n): Promise<RemoteAuthSessionValidation> {\n let endpoint = \"\";\n try {\n endpoint = toAuthEndpoint(session.authBaseUrl, \"/api/auth/get-session\");\n } catch {\n return { state: \"invalid\" };\n }\n try {\n const timeoutMs = resolveRemoteSessionTimeoutMs(endpoint);\n const response = await fetch(endpoint, {\n method: \"GET\",\n headers: {\n Authorization: `${normalizeTokenType(session.tokenType)} ${session.accessToken}`,\n },\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (response.status === 401 || response.status === 403) {\n return { state: \"revoked\" };\n }\n if (!response.ok) {\n // Preserve local credentials on upstream/transient failures.\n // Non-auth HTTP errors should be retried instead of treated as revocation.\n return { state: \"unknown\" };\n }\n\n const payload = await parseResponseJson(response);\n if (!hasActiveSessionPayload(payload)) {\n return { state: \"invalid\" };\n }\n return { state: \"valid\" };\n } catch {\n return { state: \"unknown\" };\n }\n}\n\nfunction resolveRemoteSessionTimeoutMs(endpoint: string): number {\n const url = parseUrlOrNull(endpoint);\n if (url && isLoopbackHostname(url.hostname)) {\n return LOOPBACK_REMOTE_SESSION_TIMEOUT_MS;\n }\n return DEFAULT_REMOTE_SESSION_TIMEOUT_MS;\n}\n\nfunction parseUrlOrNull(value: string): URL | null {\n try {\n return new URL(value);\n } catch {\n return null;\n }\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return (\n hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\"\n );\n}\n\nfunction hasActiveSessionPayload(payload: unknown): boolean {\n if (!isRecord(payload)) {\n return false;\n }\n\n return (\n isRecord((payload as Record<string, unknown>).session) &&\n isRecord((payload as Record<string, unknown>).user)\n );\n}\n\nfunction isExpired(expiresAt: string | undefined): boolean {\n if (!expiresAt) {\n return false;\n }\n const expiresAtMs = Date.parse(expiresAt);\n if (Number.isNaN(expiresAtMs)) {\n return false;\n }\n return expiresAtMs <= Date.now();\n}\n\nfunction resolveRemoteAuthSessionReasonCode(\n state: Exclude<RemoteAuthSessionState, \"valid\" | \"unknown\">\n): AuthSessionStateReasonCode {\n switch (state) {\n case \"invalid\":\n return \"remote_session_invalid\";\n case \"revoked\":\n return \"remote_session_revoked\";\n default: {\n const exhaustiveState: never = state;\n throw new Error(\n `unsupported remote auth session state: ${exhaustiveState}`\n );\n }\n }\n}\n\nasync function readSessionPayload(): Promise<Partial<AuthSessionV1> | null> {\n const raw = await readFile(authSessionPath(), \"utf8\").catch(() => null);\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as Partial<AuthSessionV1>;\n } catch {\n return null;\n }\n}\n\nfunction authSessionPath(): string {\n return join(openMeldRootDir(), \"auth\", \"session.json\");\n}\n\nasync function writeSessionPayloadAtomically(\n path: string,\n payload: AuthSessionV1\n): Promise<void> {\n const tempPath = `${path}.tmp-${process.pid}-${Date.now()}-${randomUUID()}`;\n try {\n const file = await open(tempPath, \"wx\");\n try {\n await file.writeFile(`${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n await file.sync();\n } finally {\n await file.close();\n }\n\n await rename(tempPath, path);\n } catch (error) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nfunction buildAuthUserPayload(value: unknown): {\n user?: {\n id?: string;\n email?: string;\n name?: string;\n };\n} {\n if (!(value && typeof value === \"object\")) {\n return {};\n }\n const record = value as Record<string, unknown>;\n const id = normalizeOptionalString(record.id);\n const email = normalizeOptionalString(record.email);\n const name = normalizeOptionalString(record.name);\n if (!(id || email || name)) {\n return {};\n }\n return {\n user: {\n ...(id ? { id } : {}),\n ...(email ? { email } : {}),\n ...(name ? { name } : {}),\n },\n };\n}\n\nfunction buildActiveOrganizationPayload(value: unknown): {\n activeOrganization?: StoredActiveOrganization;\n} {\n const activeOrganization = normalizeStoredActiveOrganization(value);\n return activeOrganization ? { activeOrganization } : {};\n}\n\nexport function normalizeStoredActiveOrganization(\n value: unknown\n): StoredActiveOrganization | null {\n if (!isRecord(value)) {\n return null;\n }\n const id = normalizeOptionalString(value.id);\n const slug = normalizeOptionalString(value.slug);\n const name = normalizeOptionalString(value.name);\n const role = normalizeOptionalString(value.role);\n const personal = readOrganizationIsPersonal(value);\n if (!(id && slug && name)) {\n return null;\n }\n return {\n id,\n slug,\n name,\n ...(role ? { role } : {}),\n ...(personal ? { personal } : {}),\n };\n}\n\nexport function readActiveOrganizationIdFromSessionPayload(\n payload: unknown\n): string | null {\n if (!isRecord(payload)) {\n return null;\n }\n return (\n (isRecord(payload.session)\n ? normalizeOptionalString(payload.session.activeOrganizationId)\n : null) ?? normalizeOptionalString(payload.activeOrganizationId)\n );\n}\n\nfunction normalizeTokenType(value: string): string {\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : \"Bearer\";\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction readOrganizationIsPersonal(value: Record<string, unknown>): boolean {\n if (value.personal === true || value.isPersonal === true) {\n return true;\n }\n\n const metadata = readOrganizationMetadata(value.metadata);\n return metadata?.personal === true;\n}\n\nfunction readOrganizationMetadata(\n metadata: unknown\n): Record<string, unknown> | null {\n if (metadata === null || metadata === undefined) {\n return null;\n }\n\n if (typeof metadata === \"string\") {\n try {\n const parsed = JSON.parse(metadata) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n }\n\n return isRecord(metadata) ? metadata : null;\n}\n\nfunction toAuthEndpoint(baseUrl: string, pathname: string): string {\n const url = new URL(baseUrl);\n const normalizedBasePath = url.pathname.replace(TRAILING_SLASHES_RE, \"\");\n const normalizedPathname = pathname.startsWith(\"/\")\n ? pathname\n : `/${pathname}`;\n url.pathname = `${normalizedBasePath}${normalizedPathname}` || \"/\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\");\n}\n\nasync function parseResponseJson(response: Response): Promise<unknown> {\n const raw = await response.text();\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw);\n } catch {\n return { message: raw };\n }\n}\n\nasync function removeSessionFileBestEffort(): Promise<void> {\n await rm(authSessionPath(), { force: true }).catch(() => undefined);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auth-session-BOKcW_84.js","names":["exhaustiveState"],"sources":["../src/strategy-constants.ts","../src/config/token-store.ts","../src/config/auth-session.ts"],"sourcesContent":["import { CURRENT_DAEMON_EXECUTION_CONTRACT_EPOCH } from \"@openmeld/schemas\";\n\n// CLI and local daemon timing policy values. Keep this deployment-local; Core\n// and Web have their own constants files even when values intentionally match.\nexport const DEFAULT_GATEWAY_CHAIN_TIMEOUT_MS = 30_000;\nexport const DEFAULT_REMOTE_SESSION_TIMEOUT_MS = 8000;\nexport const LOOPBACK_REMOTE_SESSION_TIMEOUT_MS = 1500;\nexport const DEFAULT_WEB_AGENT_SELECTION_TIMEOUT_MS = 30 * 60 * 1000;\nexport const DEFAULT_WEB_AGENT_SELECTION_POLL_INTERVAL_MS = 2000;\nexport const DEFAULT_SPACE_REQUEST_TIMEOUT_MS = 10_000;\nexport const DEFAULT_SPACE_CONVERSATION_VALIDATE_TIMEOUT_MS = 60_000;\nexport const MIN_SPACE_REQUEST_TIMEOUT_MS = 1000;\nexport const MAX_SPACE_REQUEST_TIMEOUT_MS = 120_000;\nexport const DEFAULT_HEARTBEAT_INTERVAL_MS = 25_000;\nexport const MIN_HEARTBEAT_INTERVAL_MS = 5000;\nexport const MAX_HEARTBEAT_INTERVAL_MS = 60_000;\n// Daemon stream keepalive PING cadence. Sub-idle (below the gateway/Cloudflare\n// idle-eviction window) and independent of the heartbeat, so a quiet daemon\n// socket stays warm even when no heartbeat is due. Carries no lease/readiness.\nexport const DAEMON_STREAM_KEEPALIVE_INTERVAL_MS = 20_000;\n// Each keepalive PING must see the hub's auto-answered PONG within this\n// window, or the socket is treated as half-open and terminated so the normal\n// reconnect path (which also redelivers in-flight dispatch pushes) can run.\n// Without this deadline a half-open socket is only detected by the heartbeat\n// failure path, which can take ~40s+ at the idle-grown heartbeat interval.\nexport const DAEMON_STREAM_KEEPALIVE_PONG_TIMEOUT_MS = 10_000;\nexport const CATALOG_SYNC_INTERVAL_MULTIPLIER = 3;\nexport const MIN_CATALOG_SYNC_INTERVAL_MS = 15_000;\nexport const MAX_CATALOG_SYNC_INTERVAL_MS = 45_000;\nexport const CATALOG_SYNC_RETRY_INTERVAL_MS = 5000;\nexport const CATALOG_SYNC_SIGNAL_POLL_INTERVAL_MS = 1000;\nexport const ROUTE_CATALOG_LOAD_TIMEOUT_MS = 15_000;\nexport const RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_INTERVAL_MS = 5 * 60_000;\nexport const RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_RETRY_INTERVAL_MS = 60_000;\nexport const PROVIDER_CONVERSATION_PROOF_SYNC_INTERVAL_MS = 5 * 60_000;\nexport const PROVIDER_CONVERSATION_PROOF_SYNC_RETRY_INTERVAL_MS = 60_000;\nexport const RUNTIME_STATE_PERSIST_MIN_INTERVAL_MS = 60_000;\nexport const DAEMON_STREAM_CONNECT_TIMEOUT_MS = 15_000;\nexport const REGISTER_RESPONSE_TIMEOUT_MS = 10_000;\nexport const HEARTBEAT_RESPONSE_TIMEOUT_MS = 15_000;\nexport const DAEMON_RUNTIME_CONTRACT_EPOCH =\n CURRENT_DAEMON_EXECUTION_CONTRACT_EPOCH;\nexport const OPENCLAW_CLI_TIMEOUT_MS = 30_000;\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { openMeldRootDir } from \"./paths\";\n\nconst TOKEN_STORE_KEYCHAIN_SERVICE = \"sh.openmeld.auth.token\";\nconst INSECURE_FALLBACK_ENV_KEY = \"OPENMELD_AUTH_ALLOW_INSECURE_FILE_TOKEN\";\nconst FORCE_INSECURE_STORE_ENV_KEY = \"OPENMELD_AUTH_FORCE_INSECURE_FILE_TOKEN\";\nconst COMMAND_MAX_BUFFER_BYTES = 1024 * 1024;\nconst COMMAND_TIMEOUT_MS = 30_000;\nconst TOKEN_FILE_KEY_PATTERN = /^[a-f0-9]{64}$/u;\nconst EXEC_FILE_BASE_OPTIONS = {\n windowsHide: true,\n maxBuffer: COMMAND_MAX_BUFFER_BYTES,\n timeout: COMMAND_TIMEOUT_MS,\n} as const;\nlet insecureFallbackWarningShown = false;\n\ntype MacOsTokenRef = {\n provider: \"macos-keychain\";\n service: string;\n account: string;\n};\n\ntype WindowsDpapiTokenRef = {\n provider: \"windows-dpapi\";\n key: string;\n};\n\ntype InsecureFileTokenRef = {\n provider: \"insecure-file\";\n key: string;\n};\n\nexport type StoredTokenRef =\n | MacOsTokenRef\n | WindowsDpapiTokenRef\n | InsecureFileTokenRef;\n\nexport type AccessTokenReadResult =\n | {\n accessToken: string;\n status: \"found\";\n }\n | {\n status: \"missing\";\n }\n | {\n errorMessage: string;\n status: \"unavailable\";\n };\n\ntype StoreTokenInput = {\n accessToken: string;\n authBaseUrl: string;\n clientId: string;\n};\n\nexport async function storeAccessToken(\n input: StoreTokenInput\n): Promise<StoredTokenRef> {\n const key = buildTokenKey({\n authBaseUrl: input.authBaseUrl,\n clientId: input.clientId,\n });\n\n if (shouldForceInsecureStore()) {\n await setInsecureFileToken({\n key,\n accessToken: input.accessToken,\n });\n return {\n provider: \"insecure-file\",\n key,\n };\n }\n\n if (process.platform === \"darwin\") {\n try {\n const account = buildMacOsAccount(key);\n await setMacOsKeychainToken({\n service: TOKEN_STORE_KEYCHAIN_SERVICE,\n account,\n accessToken: input.accessToken,\n });\n return {\n provider: \"macos-keychain\",\n service: TOKEN_STORE_KEYCHAIN_SERVICE,\n account,\n };\n } catch (error) {\n if (allowInsecureFallback()) {\n await setInsecureFileToken({\n key,\n accessToken: input.accessToken,\n });\n return {\n provider: \"insecure-file\",\n key,\n };\n }\n throw new Error(\n `failed to store access token in macOS Keychain: ${toErrorMessage(error)}`\n );\n }\n }\n\n if (process.platform === \"win32\") {\n try {\n await setWindowsDpapiToken({\n key,\n accessToken: input.accessToken,\n });\n return {\n provider: \"windows-dpapi\",\n key,\n };\n } catch (error) {\n if (allowInsecureFallback()) {\n await setInsecureFileToken({\n key,\n accessToken: input.accessToken,\n });\n return {\n provider: \"insecure-file\",\n key,\n };\n }\n throw new Error(\n `failed to store access token via Windows DPAPI: ${toErrorMessage(error)}`\n );\n }\n }\n\n if (allowInsecureFallback()) {\n await setInsecureFileToken({\n key,\n accessToken: input.accessToken,\n });\n return {\n provider: \"insecure-file\",\n key,\n };\n }\n\n throw new Error(\n `secure token storage is unavailable on platform \"${process.platform}\". ` +\n `Use ${INSECURE_FALLBACK_ENV_KEY}=1 only for local testing fallback.`\n );\n}\n\nexport async function readAccessToken(\n ref: StoredTokenRef\n): Promise<AccessTokenReadResult> {\n try {\n if (ref.provider === \"macos-keychain\") {\n return toAccessTokenReadResult(await getMacOsKeychainToken(ref));\n }\n if (ref.provider === \"windows-dpapi\") {\n return toAccessTokenReadResult(await getWindowsDpapiToken(ref));\n }\n if (ref.provider === \"insecure-file\") {\n return toAccessTokenReadResult(await getInsecureFileToken(ref));\n }\n return { status: \"missing\" };\n } catch (error) {\n return {\n errorMessage: toErrorMessage(error),\n status: \"unavailable\",\n };\n }\n}\n\nexport async function deleteAccessToken(ref: StoredTokenRef): Promise<void> {\n if (ref.provider === \"macos-keychain\") {\n await deleteMacOsKeychainToken(ref).catch(() => undefined);\n return;\n }\n if (ref.provider === \"windows-dpapi\") {\n await deleteWindowsDpapiToken(ref).catch(() => undefined);\n return;\n }\n if (ref.provider === \"insecure-file\") {\n await deleteInsecureFileToken(ref).catch(() => undefined);\n }\n}\n\nexport function isStoredTokenRef(value: unknown): value is StoredTokenRef {\n if (!(value && typeof value === \"object\")) {\n return false;\n }\n const record = value as Record<string, unknown>;\n const provider = normalizeString(record.provider);\n if (provider === \"macos-keychain\") {\n return Boolean(\n normalizeString(record.service) && normalizeString(record.account)\n );\n }\n if (provider === \"windows-dpapi\" || provider === \"insecure-file\") {\n return normalizeTokenFileKey(record.key) !== null;\n }\n return false;\n}\n\nfunction buildTokenKey(input: {\n authBaseUrl: string;\n clientId: string;\n}): string {\n const rootDir = resolve(openMeldRootDir());\n return createHash(\"sha256\")\n .update(`${input.clientId}\\n${input.authBaseUrl}\\n${rootDir}`)\n .digest(\"hex\");\n}\n\nfunction buildMacOsAccount(key: string): string {\n return `openmeld-auth-${key}`;\n}\n\nasync function setMacOsKeychainToken(input: {\n service: string;\n account: string;\n accessToken: string;\n}): Promise<void> {\n // Keep login non-interactive via the native `security` CLI integration.\n // This passes token via argv, which is a known exposure tradeoff.\n await runCommand(\"security\", [\n \"add-generic-password\",\n \"-U\",\n \"-a\",\n input.account,\n \"-s\",\n input.service,\n \"-w\",\n input.accessToken,\n ]);\n}\n\nasync function getMacOsKeychainToken(input: {\n service: string;\n account: string;\n}): Promise<string | null> {\n try {\n const result = await runCommand(\"security\", [\n \"find-generic-password\",\n \"-a\",\n input.account,\n \"-s\",\n input.service,\n \"-w\",\n ]);\n return result.stdout.trim();\n } catch (error) {\n if (isMacOsNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n}\n\nasync function deleteMacOsKeychainToken(input: {\n service: string;\n account: string;\n}): Promise<void> {\n try {\n await runCommand(\"security\", [\n \"delete-generic-password\",\n \"-a\",\n input.account,\n \"-s\",\n input.service,\n ]);\n } catch (error) {\n if (isMacOsNotFoundError(error)) {\n return;\n }\n throw error;\n }\n}\n\nasync function setWindowsDpapiToken(input: {\n key: string;\n accessToken: string;\n}): Promise<void> {\n const encrypted = await runPowerShellScript(\n WINDOWS_DPAPI_ENCRYPT_SCRIPT,\n input.accessToken,\n input.key\n );\n await mkdir(tokenDirectoryPath(), { recursive: true });\n // NOTE: `mode: 0o600` is POSIX-only and Windows ignores it.\n // For `tokenDirectoryPath()` + `windowsDpapiTokenPath()` we rely on DPAPI\n // and Windows ACLs for equivalent protection.\n await writeFile(windowsDpapiTokenPath(input.key), `${encrypted.trim()}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n}\n\nasync function getWindowsDpapiToken(input: {\n key: string;\n}): Promise<string | null> {\n const encrypted = await readFile(\n windowsDpapiTokenPath(input.key),\n \"utf8\"\n ).catch((error) => {\n if (isFileNotFoundError(error)) {\n return null;\n }\n throw error;\n });\n if (!encrypted) {\n return null;\n }\n return runPowerShellScript(\n WINDOWS_DPAPI_DECRYPT_SCRIPT,\n encrypted.trim(),\n input.key\n );\n}\n\nasync function deleteWindowsDpapiToken(input: { key: string }): Promise<void> {\n await rm(windowsDpapiTokenPath(input.key), { force: true });\n}\n\nasync function setInsecureFileToken(input: {\n key: string;\n accessToken: string;\n}): Promise<void> {\n await mkdir(tokenDirectoryPath(), { recursive: true });\n await writeFile(insecureTokenPath(input.key), `${input.accessToken}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n}\n\nasync function getInsecureFileToken(input: {\n key: string;\n}): Promise<string | null> {\n const raw = await readFile(insecureTokenPath(input.key), \"utf8\").catch(\n (error) => {\n if (isFileNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n );\n return raw ? raw.trim() : null;\n}\n\nasync function deleteInsecureFileToken(input: { key: string }): Promise<void> {\n await rm(insecureTokenPath(input.key), { force: true });\n}\n\nfunction tokenDirectoryPath(): string {\n return join(openMeldRootDir(), \"auth\", \"tokens\");\n}\n\nfunction windowsDpapiTokenPath(key: string): string {\n return join(tokenDirectoryPath(), `${requireValidTokenFileKey(key)}.dpapi`);\n}\n\nfunction insecureTokenPath(key: string): string {\n return join(tokenDirectoryPath(), `${requireValidTokenFileKey(key)}.token`);\n}\n\nfunction allowInsecureFallback(): boolean {\n if (process.env[INSECURE_FALLBACK_ENV_KEY] === \"1\") {\n warnInsecureFallback(\"env\");\n return true;\n }\n // Known downgrade behavior:\n // On platforms without native secure-store support, OpenMeld currently falls back\n // to local file token storage by default for compatibility.\n const fallbackEnabled = !isNativeSecureStorePlatform();\n if (fallbackEnabled) {\n warnInsecureFallback(\"platform\");\n }\n return fallbackEnabled;\n}\n\nfunction warnInsecureFallback(reason: \"env\" | \"platform\"): void {\n if (insecureFallbackWarningShown) {\n return;\n }\n insecureFallbackWarningShown = true;\n\n const reasonText =\n reason === \"env\"\n ? `enabled by ${INSECURE_FALLBACK_ENV_KEY}=1`\n : `enabled automatically on platform \"${process.platform}\"`;\n console.warn(\n `[openmeld auth] plaintext file token storage fallback is active (${reasonText}). ` +\n `Unset ${INSECURE_FALLBACK_ENV_KEY} to disable explicit opt-in, ` +\n \"and prefer macOS or Windows for native secure token storage.\"\n );\n}\n\nfunction shouldForceInsecureStore(): boolean {\n return process.env[FORCE_INSECURE_STORE_ENV_KEY] === \"1\";\n}\n\nfunction isNativeSecureStorePlatform(): boolean {\n return process.platform === \"darwin\" || process.platform === \"win32\";\n}\n\nasync function runPowerShellScript(\n script: string,\n token: string,\n entropy: string\n): Promise<string> {\n const payload = JSON.stringify({ token, entropy });\n const result = await runCommand(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-ExecutionPolicy\",\n \"Bypass\",\n \"-Command\",\n script,\n ],\n payload\n );\n return result.stdout.trim();\n}\n\nasync function runCommand(\n command: string,\n args: string[],\n stdinPayload?: string\n): Promise<{ stdout: string; stderr: string }> {\n try {\n if (stdinPayload === undefined) {\n const output = await runExecFile(command, args);\n return output;\n }\n\n const { execFile } = await import(\"node:child_process\");\n const output = await new Promise<{ stdout: string; stderr: string }>(\n (resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n\n const child = execFile(command, args, { ...EXEC_FILE_BASE_OPTIONS });\n\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: unknown) => {\n stdout += String(chunk);\n });\n child.stderr?.on(\"data\", (chunk: unknown) => {\n stderr += String(chunk);\n });\n\n child.on(\"error\", (error) => {\n reject(toCommandError(error, command));\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve({ stdout, stderr });\n return;\n }\n reject(\n toCommandError(\n {\n message: `command failed (${command}) with exit code ${code}`,\n },\n command\n )\n );\n });\n\n child.stdin?.write(stdinPayload);\n child.stdin?.end();\n }\n );\n return output;\n } catch (error) {\n throw toCommandError(error, command);\n }\n}\n\nasync function runExecFile(\n command: string,\n args: string[]\n): Promise<{ stdout: string; stderr: string }> {\n const { execFile } = await import(\"node:child_process\");\n const output = await new Promise<{ stdout: string; stderr: string }>(\n (resolve, reject) => {\n execFile(\n command,\n args,\n {\n ...EXEC_FILE_BASE_OPTIONS,\n encoding: \"utf8\",\n },\n (error, stdout, stderr) => {\n if (error) {\n reject(toCommandError(error, command));\n return;\n }\n resolve({\n stdout: String(stdout ?? \"\"),\n stderr: String(stderr ?? \"\"),\n });\n }\n );\n }\n );\n return output;\n}\n\nfunction toCommandError(\n error: unknown,\n command: string\n): Error & { code?: number | null; stdout?: string; stderr?: string } {\n if (!(error && typeof error === \"object\")) {\n return new Error(`command failed (${command}): ${String(error)}`);\n }\n const e = error as NodeJS.ErrnoException & {\n stdout?: string;\n stderr?: string;\n code?: number | null | string;\n };\n const code = typeof e.code === \"number\" ? e.code : null;\n const messageParts = [`command failed (${command})`];\n if (typeof e.stderr === \"string\" && e.stderr.trim()) {\n messageParts.push(`stderr: ${e.stderr.trim()}`);\n } else if (e.message) {\n messageParts.push(e.message);\n }\n const wrapped = new Error(messageParts.join(\"; \")) as Error & {\n code?: number | null;\n stdout?: string;\n stderr?: string;\n };\n wrapped.code = code;\n wrapped.stdout = e.stdout;\n wrapped.stderr = e.stderr;\n return wrapped;\n}\n\nfunction isMacOsNotFoundError(error: unknown): boolean {\n if (!(error && typeof error === \"object\")) {\n return false;\n }\n const record = error as { stderr?: string; message?: string; code?: number };\n const text = `${record.stderr ?? \"\"} ${record.message ?? \"\"}`.toLowerCase();\n return (\n record.code === 44 ||\n text.includes(\"could not be found in the keychain\") ||\n text.includes(\"the specified item could not be found\")\n );\n}\n\nfunction normalizeString(value: unknown): string {\n return String(value ?? \"\").trim();\n}\n\nfunction normalizeTokenFileKey(value: unknown): string | null {\n const normalized = normalizeString(value);\n if (!TOKEN_FILE_KEY_PATTERN.test(normalized)) {\n return null;\n }\n return normalized;\n}\n\nfunction requireValidTokenFileKey(value: unknown): string {\n const normalized = normalizeTokenFileKey(value);\n if (normalized === null) {\n throw new Error(\"stored token key is invalid\");\n }\n return normalized;\n}\n\nfunction normalizeToken(value: string | null): string | null {\n if (value === null) {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction toAccessTokenReadResult(value: string | null): AccessTokenReadResult {\n const accessToken = normalizeToken(value);\n if (!accessToken) {\n return { status: \"missing\" };\n }\n return {\n accessToken,\n status: \"found\",\n };\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nconst WINDOWS_DPAPI_ENCRYPT_SCRIPT = [\n \"$ErrorActionPreference='Stop'\",\n \"$rawInput = [Console]::In.ReadToEnd()\",\n \"$payload = $rawInput | ConvertFrom-Json\",\n \"$plain=[System.Text.Encoding]::UTF8.GetBytes($payload.token)\",\n \"$entropy=[System.Text.Encoding]::UTF8.GetBytes($payload.entropy)\",\n \"$cipher=[System.Security.Cryptography.ProtectedData]::Protect($plain,$entropy,[System.Security.Cryptography.DataProtectionScope]::CurrentUser)\",\n \"[System.Convert]::ToBase64String($cipher)\",\n].join(\";\");\n\nconst WINDOWS_DPAPI_DECRYPT_SCRIPT = [\n \"$ErrorActionPreference='Stop'\",\n \"$rawInput = [Console]::In.ReadToEnd()\",\n \"$payload = $rawInput | ConvertFrom-Json\",\n \"$cipher=[System.Convert]::FromBase64String($payload.token)\",\n \"$entropy=[System.Text.Encoding]::UTF8.GetBytes($payload.entropy)\",\n \"$plain=[System.Security.Cryptography.ProtectedData]::Unprotect($cipher,$entropy,[System.Security.Cryptography.DataProtectionScope]::CurrentUser)\",\n \"[System.Text.Encoding]::UTF8.GetString($plain)\",\n].join(\";\");\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n DEFAULT_REMOTE_SESSION_TIMEOUT_MS,\n LOOPBACK_REMOTE_SESSION_TIMEOUT_MS,\n} from \"../strategy-constants\";\nimport { openMeldRootDir } from \"./paths\";\nimport {\n deleteAccessToken,\n isStoredTokenRef,\n readAccessToken,\n type StoredTokenRef,\n storeAccessToken,\n} from \"./token-store\";\n\ntype AuthSessionV1 = {\n v: 1;\n tokenRef: StoredTokenRef;\n tokenType: string;\n authBaseUrl: string;\n clientId: string;\n createdAt: string;\n expiresAt?: string;\n scope?: string;\n user?: {\n id?: string;\n email?: string;\n name?: string;\n };\n activeOrganization?: StoredActiveOrganization;\n};\n\nexport type StoredActiveOrganization = {\n id: string;\n slug: string;\n name: string;\n role?: string;\n personal?: boolean;\n};\n\nexport type StoredAuthSession = {\n v: 1;\n accessToken: string;\n tokenType: string;\n authBaseUrl: string;\n clientId: string;\n createdAt: string;\n expiresAt?: string;\n scope?: string;\n user?: {\n id?: string;\n email?: string;\n name?: string;\n };\n activeOrganization?: StoredActiveOrganization;\n};\n\nexport type AuthSessionState =\n | \"missing\"\n | \"valid\"\n | \"expired\"\n | \"invalid\"\n | \"revoked\";\n\nexport type AuthSessionStateReasonCode =\n | \"remote_session_invalid\"\n | \"remote_session_revoked\"\n | \"session_expired\"\n | \"session_metadata_invalid\"\n | \"session_missing\"\n | \"session_token_missing\"\n | \"session_token_ref_invalid\"\n | \"session_token_unavailable\";\n\nexport type AuthSessionStateResult = {\n errorMessage?: string;\n reasonCode?: AuthSessionStateReasonCode;\n state: AuthSessionState;\n session: StoredAuthSession | null;\n};\n\nexport type AuthSessionMetadata = {\n authBaseUrl: string;\n clientId: string;\n createdAt: string;\n expiresAt?: string;\n scope?: string;\n user?: {\n id?: string;\n email?: string;\n name?: string;\n };\n activeOrganization?: StoredActiveOrganization;\n};\n\ntype GetAuthSessionStateOptions = {\n validateRemote?: boolean;\n};\n\ntype LocalAuthSessionState =\n | {\n errorMessage?: string;\n reasonCode: Exclude<\n AuthSessionStateReasonCode,\n \"remote_session_invalid\" | \"remote_session_revoked\" | \"session_expired\"\n >;\n state: \"missing\" | \"invalid\";\n session: null;\n }\n | {\n reasonCode: \"session_expired\";\n state: \"expired\";\n session: StoredAuthSession;\n }\n | {\n state: \"valid\";\n session: StoredAuthSession;\n };\n\ntype RemoteAuthSessionState = \"valid\" | \"invalid\" | \"revoked\" | \"unknown\";\ntype RemoteAuthSessionValidation = {\n state: RemoteAuthSessionState;\n};\nconst TRAILING_SLASHES_RE = /\\/+$/u;\n\nexport async function getAuthSessionState(\n options: GetAuthSessionStateOptions = {}\n): Promise<AuthSessionStateResult> {\n const localState = await getLocalAuthSessionState();\n switch (localState.state) {\n case \"missing\":\n case \"invalid\":\n case \"expired\":\n return localState;\n case \"valid\":\n break;\n default:\n return localState;\n }\n if (!options.validateRemote) {\n return localState;\n }\n\n const remoteValidation = await getRemoteAuthSessionState(localState.session);\n if (remoteValidation.state === \"valid\") {\n return localState;\n }\n if (remoteValidation.state === \"unknown\") {\n return localState;\n }\n\n return {\n reasonCode: resolveRemoteAuthSessionReasonCode(remoteValidation.state),\n state: remoteValidation.state,\n session: null,\n };\n}\n\n// The signed-in owner user id from the local session, or null when signed\n// out. Callers use this as the expected owner for service account-alignment\n// checks; it never validates remotely.\nexport async function getCurrentAuthOwnerUserId(): Promise<string | null> {\n const authState = await getAuthSessionState({\n validateRemote: false,\n }).catch(() => null);\n const ownerUserId = authState?.session?.user?.id?.trim() ?? \"\";\n return ownerUserId.length > 0 ? ownerUserId : null;\n}\n\nexport async function setAuthSession(input: {\n accessToken: string;\n tokenType?: string;\n authBaseUrl: string;\n clientId: string;\n expiresAt?: string;\n scope?: string;\n user?: {\n id?: string;\n email?: string;\n name?: string;\n };\n activeOrganization?: StoredActiveOrganization | null;\n}): Promise<void> {\n const accessToken = String(input.accessToken ?? \"\").trim();\n if (!accessToken) {\n throw new Error(\"access token is required\");\n }\n\n const authBaseUrl = String(input.authBaseUrl ?? \"\").trim();\n if (!authBaseUrl) {\n throw new Error(\"auth base URL is required\");\n }\n\n const clientId = String(input.clientId ?? \"\").trim();\n if (!clientId) {\n throw new Error(\"client_id is required\");\n }\n\n const tokenRef = await storeAccessToken({\n accessToken,\n authBaseUrl,\n clientId,\n });\n\n const payload: AuthSessionV1 = {\n v: 1,\n tokenRef,\n tokenType: String(input.tokenType ?? \"Bearer\").trim() || \"Bearer\",\n authBaseUrl,\n clientId,\n createdAt: new Date().toISOString(),\n ...(input.expiresAt ? { expiresAt: input.expiresAt } : {}),\n ...(input.scope ? { scope: input.scope } : {}),\n ...buildAuthUserPayload(input.user),\n ...buildActiveOrganizationPayload(input.activeOrganization),\n };\n\n const path = authSessionPath();\n await mkdir(join(openMeldRootDir(), \"auth\"), { recursive: true });\n\n try {\n await writeSessionPayloadAtomically(path, payload);\n } catch (error) {\n await deleteAccessToken(tokenRef).catch(() => undefined);\n throw error;\n }\n}\n\nexport async function getAuthSession(): Promise<StoredAuthSession | null> {\n const localState = await getLocalAuthSessionState();\n if (localState.state === \"missing\" || localState.state === \"invalid\") {\n return null;\n }\n return localState.session;\n}\n\nexport async function getAuthSessionMetadata(): Promise<AuthSessionMetadata | null> {\n const payload = await readSessionPayload();\n if (payload?.v !== 1) {\n return null;\n }\n\n const authBaseUrl = normalizeOptionalString(payload.authBaseUrl);\n const clientId = normalizeOptionalString(payload.clientId);\n const createdAt = normalizeOptionalString(payload.createdAt);\n if (!(authBaseUrl && clientId && createdAt)) {\n return null;\n }\n\n return {\n authBaseUrl,\n clientId,\n createdAt,\n ...(typeof payload.expiresAt === \"string\" && payload.expiresAt.trim()\n ? { expiresAt: payload.expiresAt.trim() }\n : {}),\n ...(typeof payload.scope === \"string\" && payload.scope.trim()\n ? { scope: payload.scope.trim() }\n : {}),\n ...buildAuthUserPayload(payload.user),\n ...buildActiveOrganizationPayload(payload.activeOrganization),\n };\n}\n\nexport async function updateAuthSessionActiveOrganization(\n activeOrganization: StoredActiveOrganization | null\n): Promise<void> {\n const payload = await readSessionPayload();\n if (payload?.v !== 1) {\n throw new Error(\"cannot update active organization without auth session\");\n }\n\n const tokenRef = normalizeTokenRef(payload.tokenRef);\n const tokenType = normalizeOptionalString(payload.tokenType);\n const authBaseUrl = normalizeOptionalString(payload.authBaseUrl);\n const clientId = normalizeOptionalString(payload.clientId);\n const createdAt = normalizeOptionalString(payload.createdAt);\n if (!(tokenRef && tokenType && authBaseUrl && clientId && createdAt)) {\n throw new Error(\n \"cannot update active organization for invalid auth session\"\n );\n }\n\n const nextPayload: AuthSessionV1 = {\n v: 1,\n tokenRef,\n tokenType,\n authBaseUrl,\n clientId,\n createdAt,\n ...(typeof payload.expiresAt === \"string\" && payload.expiresAt.trim()\n ? { expiresAt: payload.expiresAt.trim() }\n : {}),\n ...(typeof payload.scope === \"string\" && payload.scope.trim()\n ? { scope: payload.scope.trim() }\n : {}),\n ...buildAuthUserPayload(payload.user),\n ...buildActiveOrganizationPayload(activeOrganization),\n };\n\n await writeSessionPayloadAtomically(authSessionPath(), nextPayload);\n}\n\nexport async function clearAuthSession(): Promise<void> {\n const payload = await readSessionPayload();\n if (payload?.v === 1 && isStoredTokenRef(payload.tokenRef)) {\n await deleteAccessToken(payload.tokenRef).catch(() => undefined);\n }\n await removeSessionFileBestEffort();\n}\n\nasync function getLocalAuthSessionState(): Promise<LocalAuthSessionState> {\n const payload = await readSessionPayload();\n if (payload?.v !== 1) {\n return {\n reasonCode: \"session_missing\",\n state: \"missing\",\n session: null,\n };\n }\n\n const tokenRef = normalizeTokenRef(payload.tokenRef);\n if (!tokenRef) {\n return {\n reasonCode: \"session_token_ref_invalid\",\n state: \"invalid\",\n session: null,\n };\n }\n\n const tokenType = normalizeOptionalString(payload.tokenType);\n const authBaseUrl = normalizeOptionalString(payload.authBaseUrl);\n const clientId = normalizeOptionalString(payload.clientId);\n const createdAt = normalizeOptionalString(payload.createdAt);\n if (!(tokenType && authBaseUrl && clientId && createdAt)) {\n return {\n reasonCode: \"session_metadata_invalid\",\n state: \"invalid\",\n session: null,\n };\n }\n\n const accessToken = await readAccessToken(tokenRef);\n if (accessToken.status === \"missing\") {\n return {\n reasonCode: \"session_token_missing\",\n state: \"invalid\",\n session: null,\n };\n }\n if (accessToken.status === \"unavailable\") {\n return {\n errorMessage: accessToken.errorMessage,\n reasonCode: \"session_token_unavailable\",\n state: \"invalid\",\n session: null,\n };\n }\n\n const session: StoredAuthSession = {\n v: 1,\n accessToken: accessToken.accessToken,\n tokenType,\n authBaseUrl,\n clientId,\n createdAt,\n ...(typeof payload.expiresAt === \"string\" && payload.expiresAt.trim()\n ? { expiresAt: payload.expiresAt.trim() }\n : {}),\n ...(typeof payload.scope === \"string\" && payload.scope.trim()\n ? { scope: payload.scope.trim() }\n : {}),\n ...buildAuthUserPayload(payload.user),\n ...buildActiveOrganizationPayload(payload.activeOrganization),\n };\n\n if (isExpired(session.expiresAt)) {\n return {\n reasonCode: \"session_expired\",\n state: \"expired\",\n session,\n };\n }\n\n return {\n state: \"valid\",\n session,\n };\n}\n\nfunction normalizeTokenRef(input: unknown): StoredTokenRef | null {\n if (!isStoredTokenRef(input)) {\n return null;\n }\n return input;\n}\n\nasync function getRemoteAuthSessionState(\n session: StoredAuthSession\n): Promise<RemoteAuthSessionValidation> {\n let endpoint = \"\";\n try {\n endpoint = toAuthEndpoint(session.authBaseUrl, \"/api/auth/get-session\");\n } catch {\n return { state: \"invalid\" };\n }\n try {\n const timeoutMs = resolveRemoteSessionTimeoutMs(endpoint);\n const response = await fetch(endpoint, {\n method: \"GET\",\n headers: {\n Authorization: `${normalizeTokenType(session.tokenType)} ${session.accessToken}`,\n },\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (response.status === 401 || response.status === 403) {\n return { state: \"revoked\" };\n }\n if (!response.ok) {\n // Preserve local credentials on upstream/transient failures.\n // Non-auth HTTP errors should be retried instead of treated as revocation.\n return { state: \"unknown\" };\n }\n\n const payload = await parseResponseJson(response);\n if (!hasActiveSessionPayload(payload)) {\n return { state: \"invalid\" };\n }\n return { state: \"valid\" };\n } catch {\n return { state: \"unknown\" };\n }\n}\n\nfunction resolveRemoteSessionTimeoutMs(endpoint: string): number {\n const url = parseUrlOrNull(endpoint);\n if (url && isLoopbackHostname(url.hostname)) {\n return LOOPBACK_REMOTE_SESSION_TIMEOUT_MS;\n }\n return DEFAULT_REMOTE_SESSION_TIMEOUT_MS;\n}\n\nfunction parseUrlOrNull(value: string): URL | null {\n try {\n return new URL(value);\n } catch {\n return null;\n }\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return (\n hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"::1\"\n );\n}\n\nfunction hasActiveSessionPayload(payload: unknown): boolean {\n if (!isRecord(payload)) {\n return false;\n }\n\n return (\n isRecord((payload as Record<string, unknown>).session) &&\n isRecord((payload as Record<string, unknown>).user)\n );\n}\n\nfunction isExpired(expiresAt: string | undefined): boolean {\n if (!expiresAt) {\n return false;\n }\n const expiresAtMs = Date.parse(expiresAt);\n if (Number.isNaN(expiresAtMs)) {\n return false;\n }\n return expiresAtMs <= Date.now();\n}\n\nfunction resolveRemoteAuthSessionReasonCode(\n state: Exclude<RemoteAuthSessionState, \"valid\" | \"unknown\">\n): AuthSessionStateReasonCode {\n switch (state) {\n case \"invalid\":\n return \"remote_session_invalid\";\n case \"revoked\":\n return \"remote_session_revoked\";\n default: {\n const exhaustiveState: never = state;\n throw new Error(\n `unsupported remote auth session state: ${exhaustiveState}`\n );\n }\n }\n}\n\nasync function readSessionPayload(): Promise<Partial<AuthSessionV1> | null> {\n const raw = await readFile(authSessionPath(), \"utf8\").catch(() => null);\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as Partial<AuthSessionV1>;\n } catch {\n return null;\n }\n}\n\nfunction authSessionPath(): string {\n return join(openMeldRootDir(), \"auth\", \"session.json\");\n}\n\nasync function writeSessionPayloadAtomically(\n path: string,\n payload: AuthSessionV1\n): Promise<void> {\n const tempPath = `${path}.tmp-${process.pid}-${Date.now()}-${randomUUID()}`;\n try {\n const file = await open(tempPath, \"wx\");\n try {\n await file.writeFile(`${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n await file.sync();\n } finally {\n await file.close();\n }\n\n await rename(tempPath, path);\n } catch (error) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nfunction buildAuthUserPayload(value: unknown): {\n user?: {\n id?: string;\n email?: string;\n name?: string;\n };\n} {\n if (!(value && typeof value === \"object\")) {\n return {};\n }\n const record = value as Record<string, unknown>;\n const id = normalizeOptionalString(record.id);\n const email = normalizeOptionalString(record.email);\n const name = normalizeOptionalString(record.name);\n if (!(id || email || name)) {\n return {};\n }\n return {\n user: {\n ...(id ? { id } : {}),\n ...(email ? { email } : {}),\n ...(name ? { name } : {}),\n },\n };\n}\n\nfunction buildActiveOrganizationPayload(value: unknown): {\n activeOrganization?: StoredActiveOrganization;\n} {\n const activeOrganization = normalizeStoredActiveOrganization(value);\n return activeOrganization ? { activeOrganization } : {};\n}\n\nexport function normalizeStoredActiveOrganization(\n value: unknown\n): StoredActiveOrganization | null {\n if (!isRecord(value)) {\n return null;\n }\n const id = normalizeOptionalString(value.id);\n const slug = normalizeOptionalString(value.slug);\n const name = normalizeOptionalString(value.name);\n const role = normalizeOptionalString(value.role);\n const personal = readOrganizationIsPersonal(value);\n if (!(id && slug && name)) {\n return null;\n }\n return {\n id,\n slug,\n name,\n ...(role ? { role } : {}),\n ...(personal ? { personal } : {}),\n };\n}\n\nexport function readActiveOrganizationIdFromSessionPayload(\n payload: unknown\n): string | null {\n if (!isRecord(payload)) {\n return null;\n }\n return (\n (isRecord(payload.session)\n ? normalizeOptionalString(payload.session.activeOrganizationId)\n : null) ?? normalizeOptionalString(payload.activeOrganizationId)\n );\n}\n\nfunction normalizeTokenType(value: string): string {\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : \"Bearer\";\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction readOrganizationIsPersonal(value: Record<string, unknown>): boolean {\n if (value.personal === true || value.isPersonal === true) {\n return true;\n }\n\n const metadata = readOrganizationMetadata(value.metadata);\n return metadata?.personal === true;\n}\n\nfunction readOrganizationMetadata(\n metadata: unknown\n): Record<string, unknown> | null {\n if (metadata === null || metadata === undefined) {\n return null;\n }\n\n if (typeof metadata === \"string\") {\n try {\n const parsed = JSON.parse(metadata) as unknown;\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n }\n\n return isRecord(metadata) ? metadata : null;\n}\n\nfunction toAuthEndpoint(baseUrl: string, pathname: string): string {\n const url = new URL(baseUrl);\n const normalizedBasePath = url.pathname.replace(TRAILING_SLASHES_RE, \"\");\n const normalizedPathname = pathname.startsWith(\"/\")\n ? pathname\n : `/${pathname}`;\n url.pathname = `${normalizedBasePath}${normalizedPathname}` || \"/\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\");\n}\n\nasync function parseResponseJson(response: Response): Promise<unknown> {\n const raw = await response.text();\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw);\n } catch {\n return { message: raw };\n }\n}\n\nasync function removeSessionFileBestEffort(): Promise<void> {\n await rm(authSessionPath(), { force: true }).catch(() => undefined);\n}\n"],"mappings":"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"}
@@ -23,15 +23,17 @@ var __exportAll = (all, no_symbols) => {
23
23
  //#region ../../packages/schemas/dist/schemas/daemon/agent-controller-conversation-capability.js
24
24
  const agentControllerConversationExternalImportCapabilitySchema = z.enum(["unsupported", "by_ref_id"]);
25
25
  const agentControllerConversationResumeCapabilitySchema = z.enum(["unsupported", "by_ref_id"]);
26
+ const agentControllerConversationForkCapabilitySchema = z.enum(["unsupported", "by_ref_id"]);
26
27
  const agentControllerConversationDiscoverCapabilitySchema = z.literal("unsupported");
27
28
  const agentControllerConversationTurnOverrideCapabilitySchema = z.enum([
28
29
  "unsupported",
29
30
  "stateless",
30
31
  "persistent"
31
32
  ]);
32
- z.strictObject({
33
+ const agentControllerConversationCapabilitySchema = z.strictObject({
33
34
  discover: agentControllerConversationDiscoverCapabilitySchema,
34
35
  externalImport: agentControllerConversationExternalImportCapabilitySchema,
36
+ fork: agentControllerConversationForkCapabilitySchema,
35
37
  resume: agentControllerConversationResumeCapabilitySchema,
36
38
  turnOverride: agentControllerConversationTurnOverrideCapabilitySchema
37
39
  });
@@ -39,36 +41,42 @@ const BUILTIN_AGENT_CONTROLLER_CONVERSATION_CAPABILITY_BY_CONTROLLER_ID = {
39
41
  codex: {
40
42
  discover: "unsupported",
41
43
  externalImport: "by_ref_id",
44
+ fork: "by_ref_id",
42
45
  resume: "by_ref_id",
43
46
  turnOverride: "unsupported"
44
47
  },
45
48
  "claude-code": {
46
49
  discover: "unsupported",
47
50
  externalImport: "by_ref_id",
51
+ fork: "by_ref_id",
48
52
  resume: "by_ref_id",
49
53
  turnOverride: "unsupported"
50
54
  },
51
55
  cursor: {
52
56
  discover: "unsupported",
53
57
  externalImport: "by_ref_id",
58
+ fork: "unsupported",
54
59
  resume: "by_ref_id",
55
60
  turnOverride: "unsupported"
56
61
  },
57
62
  "grok-build": {
58
63
  discover: "unsupported",
59
64
  externalImport: "by_ref_id",
65
+ fork: "unsupported",
60
66
  resume: "by_ref_id",
61
67
  turnOverride: "unsupported"
62
68
  },
63
69
  opencode: {
64
70
  discover: "unsupported",
65
71
  externalImport: "unsupported",
72
+ fork: "by_ref_id",
66
73
  resume: "by_ref_id",
67
74
  turnOverride: "unsupported"
68
75
  },
69
76
  openclaw: {
70
77
  discover: "unsupported",
71
78
  externalImport: "unsupported",
79
+ fork: "unsupported",
72
80
  resume: "by_ref_id",
73
81
  turnOverride: "unsupported"
74
82
  }
@@ -2330,6 +2338,6 @@ function toErrorMessage(error) {
2330
2338
  return error instanceof Error ? error.message : String(error);
2331
2339
  }
2332
2340
  //#endregion
2333
- export { LEGACY_OPENMELD_AGENT_SESSION_ENV_KEY as $, runtimeDispatchPolicySchema as $t, toSpaceCursorUrl as A, openMeldManagedBinaryPath as At, toSpaceUpdatesUrl as B, resolveOpenMeldCliEntryNameFromArgv as Bt, updateConfiguredSkillsConfig as C, deviceOpenClawProfileWorkspaceDir as Ct, toSpaceBoardUrl as D, normalizeOpenMeldProfileId as Dt, toDaemonRouteObservationUrl as E, normalizeAccountKey as Et, toSpaceMembersUrl as F, organizationSkillReleaseDir as Ft, isOpenMeldOrphanedLockError as G, runtimeLogsDir as Gt, acquireLock as H, resolveOpenMeldPresetOwnedPathInput as Ht, toSpaceMetaUrl as I, profileDir as It, releaseLockSync as J, systemDir as Jt, readLockMeta as K, skillsDir as Kt, toSpacePasswordUrl as L, profileViewPath as Lt, toSpaceDispatchLookupUrl as M, openMeldManagedVersionDir as Mt, toSpaceDispatchTraceUrl as N, openMeldRootDir as Nt, toSpaceContractUrl as O, openMeldBackupsDir as Ot, toSpaceLeaveUrl as P, openMeldVersionsDir as Pt, tryCleanupStaleLock as Q, runtimeAgentControllerLaunchContractSchema as Qt, toSpaceRemoveMembersUrl as R, resolveDefaultOpenMeldHomeDirname as Rt, updateConfiguredOnboardingConfig as S, deviceOpenClawProfileDir as St, normalizeBaseUrl as T, legacyAccountProfileSpacesDir as Tt, buildOpenMeldOrphanedLockAction as U, resolveOpenMeldRootDir as Ut, toSpaceWsUrl as V, resolveOpenMeldEnvPreset as Vt, isOpenMeldLockError as W, runtimeDir as Wt, resolveOpenMeldOrphanedLockIssue as X, LEGACY_RUNTIME_DISPATCH_POLICY as Xt, repairOrphanedLegacyLocks as Y, formatLocalMachineIssueMessage as Yt, runWithHeldLock as Z, runtimeAgentControllerConversationIdMappingSpecSchema as Zt, getRuntimeConfigReadHealth as _, accountProfileSpaceCacheDir as _t, resolveBaseUrl as a, resolveBuiltinAgentControllerConversationKind as an, writeCliContextState as at, setConfiguredSkillsConfig as b, accountsDir as bt, resolveExplicitGatewayUrlOrThrow as c, agentControllerRefSchema as cn, LocalMachineFailureError as ct, createDefaultRuntimeAgentControllerSettings as d, canonicalizeBuiltinAgentControllerRef as dn, createBackgroundExecutionBlockedIssue as dt, runtimeStreamingModeSchema as en, OPENMELD_CLI_CONTEXT_ENV_KEY as et, getConfiguredDaemonDispatchLimits as f, normalizeBuiltinAgentControllerId as fn, createOrphanedSetupConcurrencyIssue as ft, getConfiguredViewCustomization as g, accountProfileLocalMetaPath as gt, getConfiguredSkillsConfig as h, __exportAll as hn, OPENMELD_HOME_ENV_KEY as ht, normalizeGatewayBaseUrlOrNull as i, conversationPolicySchema as in, resolveCliContextId as it, toSpaceDeleteUrl as j, openMeldManagedVersionBinaryPath as jt, toSpaceCreateUrl as k, openMeldBinDir as kt, DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE as l, buildAgentControllerRoutingKey as ln, assessLocalMachineFailure as lt, getConfiguredOnboardingDisclaimerAcceptedAt as m, parseAgentControllerRef as mn, toRecognizedLocalMachineFailureError as mt, base_url_exports as n, agentControllerConversationRefSchema as nn, readCliContextState as nt, resolveBaseUrlOrNull as o, HOSTED_CENTER_AGENT_CONTROLLER_REF as on, formatLaneScopeSentence as ot, getConfiguredDeviceRuntimeState as p, normalizeKnownBuiltinAgentControllerId as pn, isLocalMachineFailureError as pt, releaseLock as q, spacesDir as qt, normalizeGatewayBaseUrl as r, buildAgentControllerConversationRef as rn, resolveCliContext as rt, resolveDefaultGatewayBaseUrl as s, HOSTED_CENTER_AGENT_CONTROLLER_REF_ID as sn, resolveOpenMeldLaneDescriptor as st, DEV_LOCAL_GATEWAY_BASE_URL as t, runtimeTransportModeSchema as tn, listCliContextStates as tt, alignRuntimeConfigStorage as u, canonicalizeAgentControllerRef as un, createActiveSetupConcurrencyIssue as ut, resolveRuntimeSkillsCustomTargetId as v, accountProfileViewPath as vt, updateConfiguredStartV1OnboardingState as w, isPublishedOpenMeldHome as wt, updateConfiguredDeviceRuntimeState as x, deviceOpenClawProfileBootstrapPath as xt, setConfiguredBaseUrl as y, accountProfileWorkspacePath as yt, toSpaceResultUrl as z, resolveExplicitOpenMeldEnvPreset as zt };
2341
+ export { LEGACY_OPENMELD_AGENT_SESSION_ENV_KEY as $, runtimeDispatchPolicySchema as $t, toSpaceCursorUrl as A, openMeldManagedBinaryPath as At, toSpaceUpdatesUrl as B, resolveOpenMeldCliEntryNameFromArgv as Bt, updateConfiguredSkillsConfig as C, deviceOpenClawProfileWorkspaceDir as Ct, toSpaceBoardUrl as D, normalizeOpenMeldProfileId as Dt, toDaemonRouteObservationUrl as E, normalizeAccountKey as Et, toSpaceMembersUrl as F, organizationSkillReleaseDir as Ft, isOpenMeldOrphanedLockError as G, runtimeLogsDir as Gt, acquireLock as H, resolveOpenMeldPresetOwnedPathInput as Ht, toSpaceMetaUrl as I, profileDir as It, releaseLockSync as J, systemDir as Jt, readLockMeta as K, skillsDir as Kt, toSpacePasswordUrl as L, profileViewPath as Lt, toSpaceDispatchLookupUrl as M, openMeldManagedVersionDir as Mt, toSpaceDispatchTraceUrl as N, openMeldRootDir as Nt, toSpaceContractUrl as O, openMeldBackupsDir as Ot, toSpaceLeaveUrl as P, openMeldVersionsDir as Pt, tryCleanupStaleLock as Q, runtimeAgentControllerLaunchContractSchema as Qt, toSpaceRemoveMembersUrl as R, resolveDefaultOpenMeldHomeDirname as Rt, updateConfiguredOnboardingConfig as S, deviceOpenClawProfileDir as St, normalizeBaseUrl as T, legacyAccountProfileSpacesDir as Tt, buildOpenMeldOrphanedLockAction as U, resolveOpenMeldRootDir as Ut, toSpaceWsUrl as V, resolveOpenMeldEnvPreset as Vt, isOpenMeldLockError as W, runtimeDir as Wt, resolveOpenMeldOrphanedLockIssue as X, LEGACY_RUNTIME_DISPATCH_POLICY as Xt, repairOrphanedLegacyLocks as Y, formatLocalMachineIssueMessage as Yt, runWithHeldLock as Z, runtimeAgentControllerConversationIdMappingSpecSchema as Zt, getRuntimeConfigReadHealth as _, __exportAll as _n, accountProfileSpaceCacheDir as _t, resolveBaseUrl as a, resolveBuiltinAgentControllerConversationKind as an, writeCliContextState as at, setConfiguredSkillsConfig as b, accountsDir as bt, resolveExplicitGatewayUrlOrThrow as c, agentControllerRefSchema as cn, LocalMachineFailureError as ct, createDefaultRuntimeAgentControllerSettings as d, canonicalizeBuiltinAgentControllerRef as dn, createBackgroundExecutionBlockedIssue as dt, runtimeStreamingModeSchema as en, OPENMELD_CLI_CONTEXT_ENV_KEY as et, getConfiguredDaemonDispatchLimits as f, normalizeBuiltinAgentControllerId as fn, createOrphanedSetupConcurrencyIssue as ft, getConfiguredViewCustomization as g, resolveBuiltinAgentControllerConversationCapability as gn, accountProfileLocalMetaPath as gt, getConfiguredSkillsConfig as h, agentControllerConversationCapabilitySchema as hn, OPENMELD_HOME_ENV_KEY as ht, normalizeGatewayBaseUrlOrNull as i, conversationPolicySchema as in, resolveCliContextId as it, toSpaceDeleteUrl as j, openMeldManagedVersionBinaryPath as jt, toSpaceCreateUrl as k, openMeldBinDir as kt, DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE as l, buildAgentControllerRoutingKey as ln, assessLocalMachineFailure as lt, getConfiguredOnboardingDisclaimerAcceptedAt as m, parseAgentControllerRef as mn, toRecognizedLocalMachineFailureError as mt, base_url_exports as n, agentControllerConversationRefSchema as nn, readCliContextState as nt, resolveBaseUrlOrNull as o, HOSTED_CENTER_AGENT_CONTROLLER_REF as on, formatLaneScopeSentence as ot, getConfiguredDeviceRuntimeState as p, normalizeKnownBuiltinAgentControllerId as pn, isLocalMachineFailureError as pt, releaseLock as q, spacesDir as qt, normalizeGatewayBaseUrl as r, buildAgentControllerConversationRef as rn, resolveCliContext as rt, resolveDefaultGatewayBaseUrl as s, HOSTED_CENTER_AGENT_CONTROLLER_REF_ID as sn, resolveOpenMeldLaneDescriptor as st, DEV_LOCAL_GATEWAY_BASE_URL as t, runtimeTransportModeSchema as tn, listCliContextStates as tt, alignRuntimeConfigStorage as u, canonicalizeAgentControllerRef as un, createActiveSetupConcurrencyIssue as ut, resolveRuntimeSkillsCustomTargetId as v, accountProfileViewPath as vt, updateConfiguredStartV1OnboardingState as w, isPublishedOpenMeldHome as wt, updateConfiguredDeviceRuntimeState as x, deviceOpenClawProfileBootstrapPath as xt, setConfiguredBaseUrl as y, accountProfileWorkspacePath as yt, toSpaceResultUrl as z, resolveExplicitOpenMeldEnvPreset as zt };
2334
2342
 
2335
- //# sourceMappingURL=base-url-KfrIdedc.js.map
2343
+ //# sourceMappingURL=base-url-Cv9x5Es9.js.map