@humanlayer/fold-xai 0.1.16 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +22 -10
- package/dist/index.js.map +5 -5
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -26,13 +26,17 @@ class XaiAuthStoreError extends Schema.TaggedError()("XaiAuthStoreError", {
|
|
|
26
26
|
var AuthDocument = Schema.Record(Schema.String, Schema.Unknown);
|
|
27
27
|
var decodeDocument = Schema.decodeUnknownOption(Schema.fromJsonString(AuthDocument));
|
|
28
28
|
var decodeToken = Schema.decodeUnknownOption(XaiTokenData);
|
|
29
|
-
var encodeToken = (token) =>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
29
|
+
var encodeToken = (token) => {
|
|
30
|
+
const encoded = {
|
|
31
|
+
type: token.type,
|
|
32
|
+
access: token.access,
|
|
33
|
+
refresh: token.refresh,
|
|
34
|
+
expires: token.expires
|
|
35
|
+
};
|
|
36
|
+
if (token.accountId !== undefined)
|
|
37
|
+
encoded["accountId"] = token.accountId;
|
|
38
|
+
return encoded;
|
|
39
|
+
};
|
|
36
40
|
var makeXaiAuthStore = (options) => Effect.map(FileSystem.FileSystem, (fs) => {
|
|
37
41
|
const path = options?.path ?? defaultAuthStorePath();
|
|
38
42
|
const providerId = options?.providerId ?? "xai";
|
|
@@ -122,7 +126,12 @@ var DeviceError = Schema2.Struct({
|
|
|
122
126
|
error: Schema2.optional(Schema2.String),
|
|
123
127
|
error_description: Schema2.optional(Schema2.String)
|
|
124
128
|
});
|
|
125
|
-
var failure = (reason, message, cause) =>
|
|
129
|
+
var failure = (reason, message, cause) => {
|
|
130
|
+
const options = { reason, message };
|
|
131
|
+
if (cause !== undefined)
|
|
132
|
+
options.cause = cause;
|
|
133
|
+
return new XaiAuthError(options);
|
|
134
|
+
};
|
|
126
135
|
var tokenData = (payload, fallbackRefresh) => Effect2.map(Clock.currentTimeMillis, (now) => new XaiTokenData({
|
|
127
136
|
type: "oauth",
|
|
128
137
|
access: payload.access_token,
|
|
@@ -356,7 +365,10 @@ var decorateXaiClient = (inner) => ({
|
|
|
356
365
|
var makeXaiLanguageModel = (options) => Effect4.gen(function* () {
|
|
357
366
|
const httpContext = yield* Layer.build(FetchHttpClient.layer);
|
|
358
367
|
const base = Context2.get(httpContext, HttpClient3.HttpClient);
|
|
359
|
-
const
|
|
368
|
+
const authOptions = {};
|
|
369
|
+
if (options.store !== undefined)
|
|
370
|
+
authOptions.store = options.store;
|
|
371
|
+
const auth = yield* makeXaiAuth(authOptions).pipe(Effect4.provideService(HttpClient3.HttpClient, base));
|
|
360
372
|
const clientContext = yield* Layer.build(OpenAiClient.layer({ apiUrl: options.apiUrl ?? XAI_API_URL })).pipe(Effect4.provideService(HttpClient3.HttpClient, withXaiAuth(base, auth)));
|
|
361
373
|
const client = decorateXaiClient(Context2.get(clientContext, OpenAiClient.OpenAiClient));
|
|
362
374
|
return yield* OpenAiLanguageModel.make({ model: options.model ?? DEFAULT_XAI_MODEL_ID }).pipe(Effect4.provideService(OpenAiClient.OpenAiClient, client));
|
|
@@ -407,4 +419,4 @@ export {
|
|
|
407
419
|
DEFAULT_XAI_MODEL_ID
|
|
408
420
|
};
|
|
409
421
|
|
|
410
|
-
//# debugId=
|
|
422
|
+
//# debugId=461F34C3E0E8E0DA64756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/AuthStore.ts", "../src/OAuthFlows.ts", "../src/XaiAuth.ts", "../src/XaiModel.ts", "../src/XaiModelCatalog.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * File-backed Xai credential store: one provider-keyed JSON document (default `~/.fold/auth.json`)\n * holding OAuth tokens only (D23). Field names are agentlayer-compatible (`access`/`refresh`/`expires`/\n * `accountId`), so existing entries copy across verbatim. Reads degrade to \"no credentials\" on missing\n * or malformed data - the document may hold other providers' entries, so a bad xai entry is skipped,\n * never clobbered; writes merge over the existing document and force `0600` permissions. The FileSystem\n * is a default-or-override seam like fold-agent tools: tests pass an implementation, everyone else gets\n * the Node platform filesystem.\n */\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\n\nimport { Effect, FileSystem, Option, Schema } from 'effect'\n\n/** Milliseconds before nominal expiry a token is already treated as expired (clanka parity). */\nexport const TOKEN_EXPIRY_BUFFER_MS = 30_000\n\n/** Default location of the fold auth store. */\nexport const defaultAuthStorePath = (): string => join(homedir(), '.fold', 'auth.json')\n\n/** One stored Xai OAuth credential. `expires` is epoch milliseconds for the access token. */\nexport class XaiTokenData extends Schema.Class<XaiTokenData>('fold/XaiTokenData')({\n\ttype: Schema.Literal('oauth'),\n\taccess: Schema.String,\n\trefresh: Schema.String,\n\texpires: Schema.Number,\n\taccountId: Schema.optional(Schema.String),\n}) {\n\t/** True when the token is expired - or within the safety buffer of expiring - at `nowMs`. */\n\tisExpired(nowMs: number): boolean {\n\t\treturn this.expires < nowMs + TOKEN_EXPIRY_BUFFER_MS\n\t}\n}\n\n/** Auth store persistence failure (reads never fail - they degrade to absent credentials). */\nexport class XaiAuthStoreError extends Schema.TaggedError<XaiAuthStoreError>()('XaiAuthStoreError', {\n\treason: Schema.Literals(['WriteFailed']),\n\tmessage: Schema.String,\n\tcause: Schema.optional(Schema.Defect()),\n}) {}\n\n/** The credential store one XaiAuth instance persists through. */\nexport type XaiAuthStore = {\n\t/** Absolute path of the backing JSON document (used in error messages and guidance). */\n\treadonly path: string\n\treadonly load: Effect.Effect<Option.Option<XaiTokenData>>\n\treadonly save: (token: XaiTokenData) => Effect.Effect<XaiTokenData, XaiAuthStoreError>\n\treadonly clear: Effect.Effect<void, XaiAuthStoreError>\n}\n\n/** Options for {@link makeXaiAuthStore}. */\nexport type MakeXaiAuthStoreOptions = {\n\t/** Path of the auth document. Defaults to `~/.fold/auth.json`. */\n\treadonly path?: string\n\t/** Key of this provider's entry in the document. Defaults to `xai`. */\n\treadonly providerId?: string\n}\n\n/** The auth document is provider-keyed; entries other than ours are opaque and preserved verbatim. */\nconst AuthDocument = Schema.Record(Schema.String, Schema.Unknown)\n\nconst decodeDocument = Schema.decodeUnknownOption(Schema.fromJsonString(AuthDocument))\n\nconst decodeToken = Schema.decodeUnknownOption(XaiTokenData)\n\nconst encodeToken = (token: XaiTokenData): Record<string, unknown> =>
|
|
6
|
-
"/** xAI OAuth wire protocol, adapted from opencode's xAI plugin (MIT; see LICENSE-opencode). */\nimport { createServer } from 'node:http'\nimport type { Server } from 'node:http'\n\nimport { Clock, Crypto, Deferred, Duration, Effect, Result, Schedule, Schema } from 'effect'\nimport { HttpClient, HttpClientRequest, HttpClientResponse } from 'effect/unstable/http'\n\nimport { XaiTokenData } from './AuthStore'\n\nexport const XAI_CLIENT_ID = 'b1a00492-073a-47ea-816f-4c329264a828'\nexport const XAI_ISSUER = 'https://auth.x.ai'\nexport const XAI_SCOPE = 'openid profile email offline_access grok-cli:access api:access'\nexport const XAI_BROWSER_PORT = 56121\nexport const XAI_BROWSER_REDIRECT_URI = `http://127.0.0.1:${XAI_BROWSER_PORT}/callback`\n\nconst TOKEN_PATH = '/oauth2/token'\nconst DEVICE_PATH = '/oauth2/device/code'\nconst DEVICE_GRANT = 'urn:ietf:params:oauth:grant-type:device_code'\nconst DEFAULT_EXPIRY_SECONDS = 3600\nconst DEFAULT_DEVICE_EXPIRY_SECONDS = 300\nconst DEFAULT_POLL_SECONDS = 5\nconst POLL_MARGIN_MS = 3000\n\nexport class XaiAuthError extends Schema.TaggedError<XaiAuthError>()('XaiAuthError', {\n\treason: Schema.Literals([\n\t\t'NotAuthenticated',\n\t\t'RefreshFailed',\n\t\t'TokenExchangeFailed',\n\t\t'DeviceFlowFailed',\n\t\t'BrowserFlowFailed',\n\t\t'StoreFailed',\n\t]),\n\tmessage: Schema.String,\n\tcause: Schema.optional(Schema.Defect()),\n}) {}\n\nconst TokenResponse = Schema.Struct({\n\taccess_token: Schema.String,\n\trefresh_token: Schema.optional(Schema.String),\n\texpires_in: Schema.optional(Schema.Number),\n})\n\nconst DeviceResponse = Schema.Struct({\n\tdevice_code: Schema.String,\n\tuser_code: Schema.String,\n\tverification_uri: Schema.String,\n\tverification_uri_complete: Schema.optional(Schema.String),\n\texpires_in: Schema.optional(Schema.Number),\n\tinterval: Schema.optional(Schema.Number),\n})\n\nconst DeviceError = Schema.Struct({\n\terror: Schema.optional(Schema.String),\n\terror_description: Schema.optional(Schema.String),\n})\n\nconst failure = (reason: XaiAuthError['reason'], message: string, cause?: unknown) =>\n\tnew XaiAuthError({ reason, message, ...(cause === undefined ? {} : { cause }) })\n\nconst tokenData = (payload: typeof TokenResponse.Type, fallbackRefresh?: string) =>\n\tEffect.map(\n\t\tClock.currentTimeMillis,\n\t\t(now) =>\n\t\t\tnew XaiTokenData({\n\t\t\t\ttype: 'oauth',\n\t\t\t\taccess: payload.access_token,\n\t\t\t\trefresh: payload.refresh_token ?? fallbackRefresh ?? '',\n\t\t\t\texpires: now + (payload.expires_in ?? DEFAULT_EXPIRY_SECONDS) * 1000,\n\t\t\t}),\n\t)\n\n/** Scope and harden an HttpClient for xAI's OAuth issuer. */\nexport const makeXaiIssuerClient = (client: HttpClient.HttpClient): HttpClient.HttpClient =>\n\tclient.pipe(\n\t\tHttpClient.mapRequest(HttpClientRequest.prependUrl(XAI_ISSUER)),\n\t\tHttpClient.filterStatusOk,\n\t\tHttpClient.retryTransient({\n\t\t\ttimes: 5,\n\t\t\t// `min` preserves the removed `either` behavior: use whichever infinite schedule wakes sooner.\n\t\t\tschedule: Schedule.min([Schedule.exponential(150), Schedule.spaced(5000)]),\n\t\t}),\n\t)\n\nconst decodeToken = (\n\tresponse: HttpClientResponse.HttpClientResponse,\n\treason: XaiAuthError['reason'],\n\tmessage: string,\n\tfallback?: string,\n) =>\n\tHttpClientResponse.schemaBodyJson(TokenResponse)(response).pipe(\n\t\tEffect.mapError((cause) => failure(reason, message, cause)),\n\t\tEffect.flatMap((payload) => tokenData(payload, fallback)),\n\t)\n\n/** Refresh a stored xAI OAuth credential, preserving rotating or omitted refresh tokens. */\nexport const refreshXaiAccessToken = Effect.fn('fold.xaiAuth.refresh')(function* (\n\tclient: HttpClient.HttpClient,\n\trefresh: string,\n) {\n\tconst response = yield* HttpClientRequest.post(TOKEN_PATH).pipe(\n\t\tHttpClientRequest.bodyUrlParams({\n\t\t\tgrant_type: 'refresh_token',\n\t\t\trefresh_token: refresh,\n\t\t\tclient_id: XAI_CLIENT_ID,\n\t\t}),\n\t\tclient.execute,\n\t\tEffect.mapError((cause) => failure('RefreshFailed', 'Failed to refresh the xAI access token', cause)),\n\t)\n\treturn yield* decodeToken(response, 'RefreshFailed', 'Failed to decode the xAI refresh response', refresh)\n})\n\nconst exchangeCode = Effect.fn('fold.xaiAuth.exchange')(function* (\n\tclient: HttpClient.HttpClient,\n\tcode: string,\n\tverifier: string,\n) {\n\tconst response = yield* HttpClientRequest.post(TOKEN_PATH).pipe(\n\t\tHttpClientRequest.bodyUrlParams({\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tcode,\n\t\t\tredirect_uri: XAI_BROWSER_REDIRECT_URI,\n\t\t\tclient_id: XAI_CLIENT_ID,\n\t\t\tcode_verifier: verifier,\n\t\t}),\n\t\tclient.execute,\n\t\tEffect.mapError((cause) =>\n\t\t\tfailure('TokenExchangeFailed', 'Failed to exchange the xAI authorization code', cause),\n\t\t),\n\t)\n\treturn yield* decodeToken(response, 'TokenExchangeFailed', 'Failed to decode the xAI token response')\n})\n\nexport type XaiDevicePrompt = {\n\treadonly verificationUri: string\n\treadonly userCode: string\n\treadonly browserUrl: string\n}\nexport type XaiDeviceFlowOptions = {\n\treadonly client: HttpClient.HttpClient\n\treadonly onCode: (prompt: XaiDevicePrompt) => Effect.Effect<void>\n}\n\n/** Run RFC 8628 device authorization, including pending/slow_down backoff and expiry. */\nexport const runXaiDeviceFlow = Effect.fn('fold.xaiAuth.deviceFlow')(function* (options: XaiDeviceFlowOptions) {\n\tconst response = yield* HttpClientRequest.post(DEVICE_PATH).pipe(\n\t\tHttpClientRequest.bodyUrlParams({ client_id: XAI_CLIENT_ID, scope: XAI_SCOPE }),\n\t\toptions.client.execute,\n\t\tEffect.mapError((cause) => failure('DeviceFlowFailed', 'Failed to request an xAI device code', cause)),\n\t)\n\tconst device = yield* HttpClientResponse.schemaBodyJson(DeviceResponse)(response).pipe(\n\t\tEffect.mapError((cause) => failure('DeviceFlowFailed', 'Failed to decode the xAI device response', cause)),\n\t)\n\tyield* options.onCode({\n\t\tverificationUri: device.verification_uri,\n\t\tuserCode: device.user_code,\n\t\tbrowserUrl: device.verification_uri_complete ?? device.verification_uri,\n\t})\n\n\tconst started = yield* Clock.currentTimeMillis\n\tconst deadline = started + (device.expires_in ?? DEFAULT_DEVICE_EXPIRY_SECONDS) * 1000\n\tlet delayMs = Math.max(device.interval ?? DEFAULT_POLL_SECONDS, 1) * 1000\n\twhile ((yield* Clock.currentTimeMillis) < deadline) {\n\t\tconst poll = HttpClientRequest.post(TOKEN_PATH).pipe(\n\t\t\tHttpClientRequest.bodyUrlParams({\n\t\t\t\tgrant_type: DEVICE_GRANT,\n\t\t\t\tclient_id: XAI_CLIENT_ID,\n\t\t\t\tdevice_code: device.device_code,\n\t\t\t}),\n\t\t\toptions.client.execute,\n\t\t\tEffect.result,\n\t\t)\n\t\tconst result = yield* poll\n\t\tif (Result.isSuccess(result))\n\t\t\treturn yield* decodeToken(result.success, 'DeviceFlowFailed', 'Failed to decode the xAI device token')\n\t\tconst body: typeof DeviceError.Type =\n\t\t\tresult.failure.response === undefined\n\t\t\t\t? {}\n\t\t\t\t: yield* HttpClientResponse.schemaBodyJson(DeviceError)(result.failure.response).pipe(\n\t\t\t\t\t\tEffect.orElseSucceed((): typeof DeviceError.Type => ({})),\n\t\t\t\t\t)\n\t\tif (body.error === 'access_denied' || body.error === 'authorization_denied')\n\t\t\treturn yield* failure('DeviceFlowFailed', 'xAI device authorization was denied')\n\t\tif (body.error === 'expired_token') return yield* failure('DeviceFlowFailed', 'xAI device code expired')\n\t\tif (body.error !== 'authorization_pending' && body.error !== 'slow_down') {\n\t\t\treturn yield* failure(\n\t\t\t\t'DeviceFlowFailed',\n\t\t\t\tbody.error_description ?? body.error ?? 'xAI device token exchange failed',\n\t\t\t)\n\t\t}\n\t\tif (body.error === 'slow_down') delayMs += 5000\n\t\tyield* Effect.sleep(Duration.millis(delayMs + POLL_MARGIN_MS))\n\t}\n\treturn yield* failure('DeviceFlowFailed', 'xAI device authorization timed out')\n})\n\nconst CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'\nconst pkceString = (bytes: Uint8Array): string =>\n\tArray.from(bytes)\n\t\t.map((byte) => CHARS[byte % CHARS.length])\n\t\t.join('')\nconst base64Url = (bytes: Uint8Array): string => Buffer.from(bytes).toString('base64url')\n\nexport type XaiPkce = { readonly verifier: string; readonly challenge: string }\nexport const generateXaiPkce: Effect.Effect<XaiPkce, never, Crypto.Crypto> = Effect.gen(function* () {\n\tconst crypto = yield* Crypto.Crypto\n\tconst verifier = pkceString(yield* crypto.randomBytes(64).pipe(Effect.orDie))\n\tconst challenge = base64Url(yield* crypto.digest('SHA-256', new TextEncoder().encode(verifier)).pipe(Effect.orDie))\n\treturn { verifier, challenge }\n})\n\n/** Build xAI's registered Grok CLI authorization URL. */\nexport const buildXaiAuthorizeUrl = (pkce: XaiPkce, state: string, nonce: string): string => {\n\tconst query = new URLSearchParams({\n\t\tresponse_type: 'code',\n\t\tclient_id: XAI_CLIENT_ID,\n\t\tredirect_uri: XAI_BROWSER_REDIRECT_URI,\n\t\tscope: XAI_SCOPE,\n\t\tcode_challenge: pkce.challenge,\n\t\tcode_challenge_method: 'S256',\n\t\tstate,\n\t\tnonce,\n\t\tplan: 'generic',\n\t\treferrer: 'fold',\n\t})\n\treturn `${XAI_ISSUER}/oauth2/authorize?${query.toString()}`\n}\n\nexport type XaiBrowserFlowOptions = {\n\treadonly client: HttpClient.HttpClient\n\treadonly onUrl: (url: string) => Effect.Effect<void>\n\treadonly timeoutMs?: number\n}\n\n/** Run browser PKCE on xAI's fixed registered 127.0.0.1:56121 callback. */\nexport const runXaiBrowserFlow = Effect.fn('fold.xaiAuth.browserFlow')(function* (options: XaiBrowserFlowOptions) {\n\tconst crypto = yield* Crypto.Crypto\n\tconst pkce = yield* generateXaiPkce\n\tconst state = base64Url(yield* crypto.randomBytes(32).pipe(Effect.orDie))\n\tconst nonce = base64Url(yield* crypto.randomBytes(32).pipe(Effect.orDie))\n\tconst code = yield* Effect.scoped(\n\t\tEffect.gen(function* () {\n\t\t\tconst callback = yield* Deferred.make<string, XaiAuthError>()\n\t\t\tyield* Effect.acquireRelease(\n\t\t\t\tEffect.tryPromise({\n\t\t\t\t\ttry: () =>\n\t\t\t\t\t\tnew Promise<Server>((resolve, reject) => {\n\t\t\t\t\t\t\tconst server = createServer((request, response) => {\n\t\t\t\t\t\t\t\tconst url = new URL(request.url ?? '/', XAI_BROWSER_REDIRECT_URI)\n\t\t\t\t\t\t\t\tconst fail = (message: string, status = 400) => {\n\t\t\t\t\t\t\t\t\tEffect.runSync(Deferred.fail(callback, failure('BrowserFlowFailed', message)))\n\t\t\t\t\t\t\t\t\tresponse.writeHead(status, { 'Content-Type': 'text/plain' })\n\t\t\t\t\t\t\t\t\tresponse.end(message)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (url.pathname !== '/callback') return fail('Not found', 404)\n\t\t\t\t\t\t\t\tconst oauthError = url.searchParams.get('error')\n\t\t\t\t\t\t\t\tif (oauthError !== null)\n\t\t\t\t\t\t\t\t\treturn fail(url.searchParams.get('error_description') ?? oauthError, 200)\n\t\t\t\t\t\t\t\tif (url.searchParams.get('state') !== state)\n\t\t\t\t\t\t\t\t\treturn fail('Invalid state - potential CSRF attack')\n\t\t\t\t\t\t\t\tconst received = url.searchParams.get('code')\n\t\t\t\t\t\t\t\tif (received === null) return fail('Missing authorization code')\n\t\t\t\t\t\t\t\tEffect.runSync(Deferred.succeed(callback, received))\n\t\t\t\t\t\t\t\tresponse.writeHead(200, { 'Content-Type': 'text/plain' })\n\t\t\t\t\t\t\t\tresponse.end('xAI authorization successful. Return to fold.')\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tserver.once('error', reject)\n\t\t\t\t\t\t\tserver.listen(XAI_BROWSER_PORT, '127.0.0.1', () => resolve(server))\n\t\t\t\t\t\t}),\n\t\t\t\t\tcatch: (cause) =>\n\t\t\t\t\t\tfailure(\n\t\t\t\t\t\t\t'BrowserFlowFailed',\n\t\t\t\t\t\t\t`Failed to start callback server on port ${XAI_BROWSER_PORT}`,\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t\t(server) => Effect.promise(() => new Promise<void>((resolve) => server.close(() => resolve()))),\n\t\t\t)\n\t\t\tyield* options.onUrl(buildXaiAuthorizeUrl(pkce, state, nonce))\n\t\t\treturn yield* Deferred.await(callback).pipe(\n\t\t\t\tEffect.timeoutOrElse({\n\t\t\t\t\tduration: Duration.millis(options.timeoutMs ?? 300_000),\n\t\t\t\t\torElse: () => Effect.fail(failure('BrowserFlowFailed', 'OAuth callback timed out')),\n\t\t\t\t}),\n\t\t\t)\n\t\t}),\n\t)\n\treturn yield* exchangeCode(options.client, code, pkce.verifier)\n})\n",
|
|
5
|
+
"/**\n * File-backed Xai credential store: one provider-keyed JSON document (default `~/.fold/auth.json`)\n * holding OAuth tokens only (D23). Field names are agentlayer-compatible (`access`/`refresh`/`expires`/\n * `accountId`), so existing entries copy across verbatim. Reads degrade to \"no credentials\" on missing\n * or malformed data - the document may hold other providers' entries, so a bad xai entry is skipped,\n * never clobbered; writes merge over the existing document and force `0600` permissions. The FileSystem\n * is a default-or-override seam like fold-agent tools: tests pass an implementation, everyone else gets\n * the Node platform filesystem.\n */\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\n\nimport { Effect, FileSystem, Option, Schema } from 'effect'\n\n/** Milliseconds before nominal expiry a token is already treated as expired (clanka parity). */\nexport const TOKEN_EXPIRY_BUFFER_MS = 30_000\n\n/** Default location of the fold auth store. */\nexport const defaultAuthStorePath = (): string => join(homedir(), '.fold', 'auth.json')\n\n/** One stored Xai OAuth credential. `expires` is epoch milliseconds for the access token. */\nexport class XaiTokenData extends Schema.Class<XaiTokenData>('fold/XaiTokenData')({\n\ttype: Schema.Literal('oauth'),\n\taccess: Schema.String,\n\trefresh: Schema.String,\n\texpires: Schema.Number,\n\taccountId: Schema.optional(Schema.String),\n}) {\n\t/** True when the token is expired - or within the safety buffer of expiring - at `nowMs`. */\n\tisExpired(nowMs: number): boolean {\n\t\treturn this.expires < nowMs + TOKEN_EXPIRY_BUFFER_MS\n\t}\n}\n\n/** Auth store persistence failure (reads never fail - they degrade to absent credentials). */\nexport class XaiAuthStoreError extends Schema.TaggedError<XaiAuthStoreError>()('XaiAuthStoreError', {\n\treason: Schema.Literals(['WriteFailed']),\n\tmessage: Schema.String,\n\tcause: Schema.optional(Schema.Defect()),\n}) {}\n\n/** The credential store one XaiAuth instance persists through. */\nexport type XaiAuthStore = {\n\t/** Absolute path of the backing JSON document (used in error messages and guidance). */\n\treadonly path: string\n\treadonly load: Effect.Effect<Option.Option<XaiTokenData>>\n\treadonly save: (token: XaiTokenData) => Effect.Effect<XaiTokenData, XaiAuthStoreError>\n\treadonly clear: Effect.Effect<void, XaiAuthStoreError>\n}\n\n/** Options for {@link makeXaiAuthStore}. */\nexport type MakeXaiAuthStoreOptions = {\n\t/** Path of the auth document. Defaults to `~/.fold/auth.json`. */\n\treadonly path?: string\n\t/** Key of this provider's entry in the document. Defaults to `xai`. */\n\treadonly providerId?: string\n}\n\n/** The auth document is provider-keyed; entries other than ours are opaque and preserved verbatim. */\nconst AuthDocument = Schema.Record(Schema.String, Schema.Unknown)\n\nconst decodeDocument = Schema.decodeUnknownOption(Schema.fromJsonString(AuthDocument))\n\nconst decodeToken = Schema.decodeUnknownOption(XaiTokenData)\n\nconst encodeToken = (token: XaiTokenData): Record<string, unknown> => {\n\tconst encoded: Record<string, unknown> = {\n\t\ttype: token.type,\n\t\taccess: token.access,\n\t\trefresh: token.refresh,\n\t\texpires: token.expires,\n\t}\n\tif (token.accountId !== undefined) encoded['accountId'] = token.accountId\n\treturn encoded\n}\n\n/** Build a file-backed Xai credential store. */\nexport const makeXaiAuthStore = (\n\toptions?: MakeXaiAuthStoreOptions,\n): Effect.Effect<XaiAuthStore, never, FileSystem.FileSystem> =>\n\tEffect.map(FileSystem.FileSystem, (fs) => {\n\t\tconst path = options?.path ?? defaultAuthStorePath()\n\t\tconst providerId = options?.providerId ?? 'xai'\n\n\t\tconst readDocument: Effect.Effect<Record<string, unknown>> = fs.readFileString(path).pipe(\n\t\t\tEffect.flatMap((content) => {\n\t\t\t\tconst document = decodeDocument(content)\n\t\t\t\treturn Option.isSome(document)\n\t\t\t\t\t? Effect.succeed(document.value)\n\t\t\t\t\t: Effect.logWarning(`Auth store ${path} is not a JSON object; treating it as empty`).pipe(\n\t\t\t\t\t\t\tEffect.as<Record<string, unknown>>({}),\n\t\t\t\t\t\t)\n\t\t\t}),\n\t\t\t// A missing (or unreadable) document is simply \"no credentials stored yet\".\n\t\t\tEffect.catch(() => Effect.succeed<Record<string, unknown>>({})),\n\t\t)\n\n\t\tconst writeDocument = (document: Record<string, unknown>): Effect.Effect<void, XaiAuthStoreError> =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tyield* fs.makeDirectory(dirname(path), { recursive: true })\n\t\t\t\tyield* fs.writeFileString(path, `${JSON.stringify(document, null, 2)}\\n`, { mode: 0o600 })\n\t\t\t\t// writeFileString's mode only applies on creation; force 0600 on pre-existing documents too.\n\t\t\t\tyield* fs.chmod(path, 0o600)\n\t\t\t}).pipe(\n\t\t\t\tEffect.mapError(\n\t\t\t\t\t(cause) =>\n\t\t\t\t\t\tnew XaiAuthStoreError({\n\t\t\t\t\t\t\treason: 'WriteFailed',\n\t\t\t\t\t\t\tmessage: `Failed to write the auth store at ${path}`,\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)\n\n\t\tconst load = Effect.gen(function* () {\n\t\t\tconst document = yield* readDocument\n\t\t\tconst entry = document[providerId]\n\t\t\tif (entry === undefined) return Option.none<XaiTokenData>()\n\n\t\t\tconst token = decodeToken(entry)\n\t\t\tif (Option.isNone(token)) {\n\t\t\t\tyield* Effect.logWarning(`Ignoring invalid \"${providerId}\" entry in ${path}`)\n\t\t\t}\n\n\t\t\treturn token\n\t\t}).pipe(Effect.withSpan('fold.xaiAuthStore.load'))\n\n\t\tconst save = (token: XaiTokenData) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst document = yield* readDocument\n\t\t\t\tyield* writeDocument({ ...document, [providerId]: encodeToken(token) })\n\t\t\t\treturn token\n\t\t\t}).pipe(Effect.withSpan('fold.xaiAuthStore.save'))\n\n\t\tconst clear = Effect.gen(function* () {\n\t\t\tconst document = yield* readDocument\n\t\t\tif (document[providerId] === undefined) return\n\t\t\tconst { [providerId]: _removed, ...rest } = document\n\t\t\tyield* writeDocument(rest)\n\t\t}).pipe(Effect.withSpan('fold.xaiAuthStore.clear'))\n\n\t\treturn { path, load, save, clear }\n\t})\n",
|
|
6
|
+
"/** xAI OAuth wire protocol, adapted from opencode's xAI plugin (MIT; see LICENSE-opencode). */\nimport { createServer } from 'node:http'\nimport type { Server } from 'node:http'\n\nimport { Clock, Crypto, Deferred, Duration, Effect, Result, Schedule, Schema } from 'effect'\nimport { HttpClient, HttpClientRequest, HttpClientResponse } from 'effect/unstable/http'\n\nimport { XaiTokenData } from './AuthStore'\n\nexport const XAI_CLIENT_ID = 'b1a00492-073a-47ea-816f-4c329264a828'\nexport const XAI_ISSUER = 'https://auth.x.ai'\nexport const XAI_SCOPE = 'openid profile email offline_access grok-cli:access api:access'\nexport const XAI_BROWSER_PORT = 56121\nexport const XAI_BROWSER_REDIRECT_URI = `http://127.0.0.1:${XAI_BROWSER_PORT}/callback`\n\nconst TOKEN_PATH = '/oauth2/token'\nconst DEVICE_PATH = '/oauth2/device/code'\nconst DEVICE_GRANT = 'urn:ietf:params:oauth:grant-type:device_code'\nconst DEFAULT_EXPIRY_SECONDS = 3600\nconst DEFAULT_DEVICE_EXPIRY_SECONDS = 300\nconst DEFAULT_POLL_SECONDS = 5\nconst POLL_MARGIN_MS = 3000\n\nexport class XaiAuthError extends Schema.TaggedError<XaiAuthError>()('XaiAuthError', {\n\treason: Schema.Literals([\n\t\t'NotAuthenticated',\n\t\t'RefreshFailed',\n\t\t'TokenExchangeFailed',\n\t\t'DeviceFlowFailed',\n\t\t'BrowserFlowFailed',\n\t\t'StoreFailed',\n\t]),\n\tmessage: Schema.String,\n\tcause: Schema.optional(Schema.Defect()),\n}) {}\n\nconst TokenResponse = Schema.Struct({\n\taccess_token: Schema.String,\n\trefresh_token: Schema.optional(Schema.String),\n\texpires_in: Schema.optional(Schema.Number),\n})\n\nconst DeviceResponse = Schema.Struct({\n\tdevice_code: Schema.String,\n\tuser_code: Schema.String,\n\tverification_uri: Schema.String,\n\tverification_uri_complete: Schema.optional(Schema.String),\n\texpires_in: Schema.optional(Schema.Number),\n\tinterval: Schema.optional(Schema.Number),\n})\n\nconst DeviceError = Schema.Struct({\n\terror: Schema.optional(Schema.String),\n\terror_description: Schema.optional(Schema.String),\n})\n\nconst failure = (reason: XaiAuthError['reason'], message: string, cause?: unknown): XaiAuthError => {\n\tconst options: { reason: XaiAuthError['reason']; message: string; cause?: unknown } = { reason, message }\n\tif (cause !== undefined) options.cause = cause\n\treturn new XaiAuthError(options)\n}\n\nconst tokenData = (payload: typeof TokenResponse.Type, fallbackRefresh?: string) =>\n\tEffect.map(\n\t\tClock.currentTimeMillis,\n\t\t(now) =>\n\t\t\tnew XaiTokenData({\n\t\t\t\ttype: 'oauth',\n\t\t\t\taccess: payload.access_token,\n\t\t\t\trefresh: payload.refresh_token ?? fallbackRefresh ?? '',\n\t\t\t\texpires: now + (payload.expires_in ?? DEFAULT_EXPIRY_SECONDS) * 1000,\n\t\t\t}),\n\t)\n\n/** Scope and harden an HttpClient for xAI's OAuth issuer. */\nexport const makeXaiIssuerClient = (client: HttpClient.HttpClient): HttpClient.HttpClient =>\n\tclient.pipe(\n\t\tHttpClient.mapRequest(HttpClientRequest.prependUrl(XAI_ISSUER)),\n\t\tHttpClient.filterStatusOk,\n\t\tHttpClient.retryTransient({\n\t\t\ttimes: 5,\n\t\t\t// `min` preserves the removed `either` behavior: use whichever infinite schedule wakes sooner.\n\t\t\tschedule: Schedule.min([Schedule.exponential(150), Schedule.spaced(5000)]),\n\t\t}),\n\t)\n\nconst decodeToken = (\n\tresponse: HttpClientResponse.HttpClientResponse,\n\treason: XaiAuthError['reason'],\n\tmessage: string,\n\tfallback?: string,\n) =>\n\tHttpClientResponse.schemaBodyJson(TokenResponse)(response).pipe(\n\t\tEffect.mapError((cause) => failure(reason, message, cause)),\n\t\tEffect.flatMap((payload) => tokenData(payload, fallback)),\n\t)\n\n/** Refresh a stored xAI OAuth credential, preserving rotating or omitted refresh tokens. */\nexport const refreshXaiAccessToken = Effect.fn('fold.xaiAuth.refresh')(function* (\n\tclient: HttpClient.HttpClient,\n\trefresh: string,\n) {\n\tconst response = yield* HttpClientRequest.post(TOKEN_PATH).pipe(\n\t\tHttpClientRequest.bodyUrlParams({\n\t\t\tgrant_type: 'refresh_token',\n\t\t\trefresh_token: refresh,\n\t\t\tclient_id: XAI_CLIENT_ID,\n\t\t}),\n\t\tclient.execute,\n\t\tEffect.mapError((cause) => failure('RefreshFailed', 'Failed to refresh the xAI access token', cause)),\n\t)\n\treturn yield* decodeToken(response, 'RefreshFailed', 'Failed to decode the xAI refresh response', refresh)\n})\n\nconst exchangeCode = Effect.fn('fold.xaiAuth.exchange')(function* (\n\tclient: HttpClient.HttpClient,\n\tcode: string,\n\tverifier: string,\n) {\n\tconst response = yield* HttpClientRequest.post(TOKEN_PATH).pipe(\n\t\tHttpClientRequest.bodyUrlParams({\n\t\t\tgrant_type: 'authorization_code',\n\t\t\tcode,\n\t\t\tredirect_uri: XAI_BROWSER_REDIRECT_URI,\n\t\t\tclient_id: XAI_CLIENT_ID,\n\t\t\tcode_verifier: verifier,\n\t\t}),\n\t\tclient.execute,\n\t\tEffect.mapError((cause) =>\n\t\t\tfailure('TokenExchangeFailed', 'Failed to exchange the xAI authorization code', cause),\n\t\t),\n\t)\n\treturn yield* decodeToken(response, 'TokenExchangeFailed', 'Failed to decode the xAI token response')\n})\n\nexport type XaiDevicePrompt = {\n\treadonly verificationUri: string\n\treadonly userCode: string\n\treadonly browserUrl: string\n}\nexport type XaiDeviceFlowOptions = {\n\treadonly client: HttpClient.HttpClient\n\treadonly onCode: (prompt: XaiDevicePrompt) => Effect.Effect<void>\n}\n\n/** Run RFC 8628 device authorization, including pending/slow_down backoff and expiry. */\nexport const runXaiDeviceFlow = Effect.fn('fold.xaiAuth.deviceFlow')(function* (options: XaiDeviceFlowOptions) {\n\tconst response = yield* HttpClientRequest.post(DEVICE_PATH).pipe(\n\t\tHttpClientRequest.bodyUrlParams({ client_id: XAI_CLIENT_ID, scope: XAI_SCOPE }),\n\t\toptions.client.execute,\n\t\tEffect.mapError((cause) => failure('DeviceFlowFailed', 'Failed to request an xAI device code', cause)),\n\t)\n\tconst device = yield* HttpClientResponse.schemaBodyJson(DeviceResponse)(response).pipe(\n\t\tEffect.mapError((cause) => failure('DeviceFlowFailed', 'Failed to decode the xAI device response', cause)),\n\t)\n\tyield* options.onCode({\n\t\tverificationUri: device.verification_uri,\n\t\tuserCode: device.user_code,\n\t\tbrowserUrl: device.verification_uri_complete ?? device.verification_uri,\n\t})\n\n\tconst started = yield* Clock.currentTimeMillis\n\tconst deadline = started + (device.expires_in ?? DEFAULT_DEVICE_EXPIRY_SECONDS) * 1000\n\tlet delayMs = Math.max(device.interval ?? DEFAULT_POLL_SECONDS, 1) * 1000\n\twhile ((yield* Clock.currentTimeMillis) < deadline) {\n\t\tconst poll = HttpClientRequest.post(TOKEN_PATH).pipe(\n\t\t\tHttpClientRequest.bodyUrlParams({\n\t\t\t\tgrant_type: DEVICE_GRANT,\n\t\t\t\tclient_id: XAI_CLIENT_ID,\n\t\t\t\tdevice_code: device.device_code,\n\t\t\t}),\n\t\t\toptions.client.execute,\n\t\t\tEffect.result,\n\t\t)\n\t\tconst result = yield* poll\n\t\tif (Result.isSuccess(result))\n\t\t\treturn yield* decodeToken(result.success, 'DeviceFlowFailed', 'Failed to decode the xAI device token')\n\t\tconst body: typeof DeviceError.Type =\n\t\t\tresult.failure.response === undefined\n\t\t\t\t? {}\n\t\t\t\t: yield* HttpClientResponse.schemaBodyJson(DeviceError)(result.failure.response).pipe(\n\t\t\t\t\t\tEffect.orElseSucceed((): typeof DeviceError.Type => ({})),\n\t\t\t\t\t)\n\t\tif (body.error === 'access_denied' || body.error === 'authorization_denied')\n\t\t\treturn yield* failure('DeviceFlowFailed', 'xAI device authorization was denied')\n\t\tif (body.error === 'expired_token') return yield* failure('DeviceFlowFailed', 'xAI device code expired')\n\t\tif (body.error !== 'authorization_pending' && body.error !== 'slow_down') {\n\t\t\treturn yield* failure(\n\t\t\t\t'DeviceFlowFailed',\n\t\t\t\tbody.error_description ?? body.error ?? 'xAI device token exchange failed',\n\t\t\t)\n\t\t}\n\t\tif (body.error === 'slow_down') delayMs += 5000\n\t\tyield* Effect.sleep(Duration.millis(delayMs + POLL_MARGIN_MS))\n\t}\n\treturn yield* failure('DeviceFlowFailed', 'xAI device authorization timed out')\n})\n\nconst CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'\nconst pkceString = (bytes: Uint8Array): string =>\n\tArray.from(bytes)\n\t\t.map((byte) => CHARS[byte % CHARS.length])\n\t\t.join('')\nconst base64Url = (bytes: Uint8Array): string => Buffer.from(bytes).toString('base64url')\n\nexport type XaiPkce = { readonly verifier: string; readonly challenge: string }\nexport const generateXaiPkce: Effect.Effect<XaiPkce, never, Crypto.Crypto> = Effect.gen(function* () {\n\tconst crypto = yield* Crypto.Crypto\n\tconst verifier = pkceString(yield* crypto.randomBytes(64).pipe(Effect.orDie))\n\tconst challenge = base64Url(yield* crypto.digest('SHA-256', new TextEncoder().encode(verifier)).pipe(Effect.orDie))\n\treturn { verifier, challenge }\n})\n\n/** Build xAI's registered Grok CLI authorization URL. */\nexport const buildXaiAuthorizeUrl = (pkce: XaiPkce, state: string, nonce: string): string => {\n\tconst query = new URLSearchParams({\n\t\tresponse_type: 'code',\n\t\tclient_id: XAI_CLIENT_ID,\n\t\tredirect_uri: XAI_BROWSER_REDIRECT_URI,\n\t\tscope: XAI_SCOPE,\n\t\tcode_challenge: pkce.challenge,\n\t\tcode_challenge_method: 'S256',\n\t\tstate,\n\t\tnonce,\n\t\tplan: 'generic',\n\t\treferrer: 'fold',\n\t})\n\treturn `${XAI_ISSUER}/oauth2/authorize?${query.toString()}`\n}\n\nexport type XaiBrowserFlowOptions = {\n\treadonly client: HttpClient.HttpClient\n\treadonly onUrl: (url: string) => Effect.Effect<void>\n\treadonly timeoutMs?: number\n}\n\n/** Run browser PKCE on xAI's fixed registered 127.0.0.1:56121 callback. */\nexport const runXaiBrowserFlow = Effect.fn('fold.xaiAuth.browserFlow')(function* (options: XaiBrowserFlowOptions) {\n\tconst crypto = yield* Crypto.Crypto\n\tconst pkce = yield* generateXaiPkce\n\tconst state = base64Url(yield* crypto.randomBytes(32).pipe(Effect.orDie))\n\tconst nonce = base64Url(yield* crypto.randomBytes(32).pipe(Effect.orDie))\n\tconst code = yield* Effect.scoped(\n\t\tEffect.gen(function* () {\n\t\t\tconst callback = yield* Deferred.make<string, XaiAuthError>()\n\t\t\tyield* Effect.acquireRelease(\n\t\t\t\tEffect.tryPromise({\n\t\t\t\t\ttry: () =>\n\t\t\t\t\t\tnew Promise<Server>((resolve, reject) => {\n\t\t\t\t\t\t\tconst server = createServer((request, response) => {\n\t\t\t\t\t\t\t\tconst url = new URL(request.url ?? '/', XAI_BROWSER_REDIRECT_URI)\n\t\t\t\t\t\t\t\tconst fail = (message: string, status = 400) => {\n\t\t\t\t\t\t\t\t\tEffect.runSync(Deferred.fail(callback, failure('BrowserFlowFailed', message)))\n\t\t\t\t\t\t\t\t\tresponse.writeHead(status, { 'Content-Type': 'text/plain' })\n\t\t\t\t\t\t\t\t\tresponse.end(message)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (url.pathname !== '/callback') return fail('Not found', 404)\n\t\t\t\t\t\t\t\tconst oauthError = url.searchParams.get('error')\n\t\t\t\t\t\t\t\tif (oauthError !== null)\n\t\t\t\t\t\t\t\t\treturn fail(url.searchParams.get('error_description') ?? oauthError, 200)\n\t\t\t\t\t\t\t\tif (url.searchParams.get('state') !== state)\n\t\t\t\t\t\t\t\t\treturn fail('Invalid state - potential CSRF attack')\n\t\t\t\t\t\t\t\tconst received = url.searchParams.get('code')\n\t\t\t\t\t\t\t\tif (received === null) return fail('Missing authorization code')\n\t\t\t\t\t\t\t\tEffect.runSync(Deferred.succeed(callback, received))\n\t\t\t\t\t\t\t\tresponse.writeHead(200, { 'Content-Type': 'text/plain' })\n\t\t\t\t\t\t\t\tresponse.end('xAI authorization successful. Return to fold.')\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tserver.once('error', reject)\n\t\t\t\t\t\t\tserver.listen(XAI_BROWSER_PORT, '127.0.0.1', () => resolve(server))\n\t\t\t\t\t\t}),\n\t\t\t\t\tcatch: (cause) =>\n\t\t\t\t\t\tfailure(\n\t\t\t\t\t\t\t'BrowserFlowFailed',\n\t\t\t\t\t\t\t`Failed to start callback server on port ${XAI_BROWSER_PORT}`,\n\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t\t(server) => Effect.promise(() => new Promise<void>((resolve) => server.close(() => resolve()))),\n\t\t\t)\n\t\t\tyield* options.onUrl(buildXaiAuthorizeUrl(pkce, state, nonce))\n\t\t\treturn yield* Deferred.await(callback).pipe(\n\t\t\t\tEffect.timeoutOrElse({\n\t\t\t\t\tduration: Duration.millis(options.timeoutMs ?? 300_000),\n\t\t\t\t\torElse: () => Effect.fail(failure('BrowserFlowFailed', 'OAuth callback timed out')),\n\t\t\t\t}),\n\t\t\t)\n\t\t}),\n\t)\n\treturn yield* exchangeCode(options.client, code, pkce.verifier)\n})\n",
|
|
7
7
|
"/** Persistent, single-flight xAI OAuth credential service and authenticated HTTP decorator. */\nimport * as NodeCrypto from '@effect/platform-node/NodeCrypto'\nimport { Clock, Context, Effect, Option, Semaphore } from 'effect'\nimport { HttpClient, HttpClientError, HttpClientRequest } from 'effect/unstable/http'\n\nimport { makeXaiAuthStore, type XaiAuthStore, type XaiTokenData } from './AuthStore'\nimport type { XaiBrowserFlowOptions, XaiDevicePrompt } from './OAuthFlows'\nimport {\n\tmakeXaiIssuerClient,\n\trefreshXaiAccessToken,\n\trunXaiBrowserFlow,\n\trunXaiDeviceFlow,\n\tXaiAuthError,\n} from './OAuthFlows'\n\nexport type XaiAuthService = {\n\treadonly get: Effect.Effect<XaiTokenData, XaiAuthError>\n\treadonly authenticateDevice: Effect.Effect<XaiTokenData, XaiAuthError>\n\treadonly authenticateBrowser: Effect.Effect<XaiTokenData, XaiAuthError>\n\treadonly logout: Effect.Effect<void, XaiAuthError>\n}\n\nexport class XaiAuth extends Context.Service<XaiAuth, XaiAuthService>()('fold/XaiAuth') {}\n\nexport type MakeXaiAuthOptions = {\n\treadonly store?: XaiAuthStore\n\treadonly onDeviceCode?: (prompt: XaiDevicePrompt) => Effect.Effect<void>\n\treadonly onBrowserUrl?: (url: string) => Effect.Effect<void>\n\treadonly browser?: Pick<XaiBrowserFlowOptions, 'timeoutMs'>\n}\n\nconst devicePrompt = (prompt: XaiDevicePrompt) =>\n\tEffect.log(`Open ${prompt.verificationUri} and enter code: ${prompt.userCode}`)\nconst browserPrompt = (url: string) => Effect.log(`Open this URL to authenticate xAI:\\n${url}`)\n\n/** Construct xAI auth over the ambient HttpClient. Interactive flows are explicit methods. */\nexport const makeXaiAuth = Effect.fnUntraced(function* (options?: MakeXaiAuthOptions) {\n\tconst store = options?.store ?? (yield* makeXaiAuthStore())\n\tconst client = makeXaiIssuerClient(yield* HttpClient.HttpClient)\n\tconst semaphore = Semaphore.makeUnsafe(1)\n\tlet current = yield* store.load\n\tconst storeError = (cause: unknown) =>\n\t\tnew XaiAuthError({\n\t\t\treason: 'StoreFailed',\n\t\t\tmessage: `Failed to persist xAI credentials to ${store.path}`,\n\t\t\tcause,\n\t\t})\n\tconst save = (token: XaiTokenData) =>\n\t\tstore.save(token).pipe(\n\t\t\tEffect.mapError(storeError),\n\t\t\tEffect.tap(() =>\n\t\t\t\tEffect.sync(() => {\n\t\t\t\t\tcurrent = Option.some(token)\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\tconst get = Effect.uninterruptibleMask(\n\t\tEffect.fnUntraced(function* (restore) {\n\t\t\tconst now = yield* Clock.currentTimeMillis\n\t\t\tif (Option.isSome(current) && !current.value.isExpired(now)) return current.value\n\t\t\tif (Option.isNone(current))\n\t\t\t\treturn yield* new XaiAuthError({\n\t\t\t\t\treason: 'NotAuthenticated',\n\t\t\t\t\tmessage: `No xAI OAuth credentials found in ${store.path}`,\n\t\t\t\t})\n\t\t\treturn yield* restore(refreshXaiAccessToken(client, current.value.refresh)).pipe(Effect.flatMap(save))\n\t\t}),\n\t)\n\tconst run = (flow: Effect.Effect<XaiTokenData, XaiAuthError>) =>\n\t\tEffect.uninterruptibleMask((restore) => restore(flow).pipe(Effect.flatMap(save)))\n\treturn {\n\t\tget: semaphore.withPermit(get).pipe(Effect.withSpan('fold.xaiAuth.get')),\n\t\tauthenticateDevice: semaphore\n\t\t\t.withPermit(run(runXaiDeviceFlow({ client, onCode: options?.onDeviceCode ?? devicePrompt })))\n\t\t\t.pipe(Effect.withSpan('fold.xaiAuth.authenticateDevice')),\n\t\tauthenticateBrowser: semaphore\n\t\t\t.withPermit(\n\t\t\t\trun(\n\t\t\t\t\trunXaiBrowserFlow({\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\tonUrl: options?.onBrowserUrl ?? browserPrompt,\n\t\t\t\t\t\t...options?.browser,\n\t\t\t\t\t}).pipe(Effect.provide(NodeCrypto.layer)),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.pipe(Effect.withSpan('fold.xaiAuth.authenticateBrowser')),\n\t\tlogout: semaphore\n\t\t\t.withPermit(\n\t\t\t\tstore.clear.pipe(\n\t\t\t\t\tEffect.mapError(storeError),\n\t\t\t\t\tEffect.tap(() =>\n\t\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\t\tcurrent = Option.none()\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.pipe(Effect.withSpan('fold.xaiAuth.logout')),\n\t} satisfies XaiAuthService\n})\n\n/** Inject the current OAuth bearer token into every request without mutating caller headers. */\nexport const withXaiAuth = (client: HttpClient.HttpClient, auth: XaiAuthService): HttpClient.HttpClient =>\n\tclient.pipe(\n\t\tHttpClient.mapRequestEffect((request) =>\n\t\t\tauth.get.pipe(\n\t\t\t\tEffect.map((token) =>\n\t\t\t\t\trequest.pipe(\n\t\t\t\t\t\tHttpClientRequest.bearerToken(token.access),\n\t\t\t\t\t\tHttpClientRequest.setHeader('User-Agent', 'fold/xai-oauth'),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tEffect.mapError(\n\t\t\t\t\t(cause) =>\n\t\t\t\t\t\tnew HttpClientError.HttpClientError({\n\t\t\t\t\t\t\treason: new HttpClientError.TransportError({\n\t\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t\t\tcause,\n\t\t\t\t\t\t\t\tdescription: `xAI authentication failed: ${cause.message}`,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t)\n",
|
|
8
|
-
"/** FoldModel factory for xAI's OpenAI-compatible inference API authenticated with OAuth. */\nimport { OpenAiClient, OpenAiLanguageModel } from '@effect/ai-openai-compat'\nimport type {\n\tChatCompletionChunk,\n\tCreateResponse200,\n\tCreateResponse200Sse,\n} from '@effect/ai-openai-compat/OpenAiClient'\nimport * as NodeFileSystem from '@effect/platform-node/NodeFileSystem'\nimport { customModel, resolveOpenAiReasoning } from '@humanlayer/fold-core'\nimport type { FoldModel, ReasoningLevel } from '@humanlayer/fold-core'\nimport { Context, Effect, Layer, Option, Predicate, Schema, Stream } from 'effect'\nimport type { Scope } from 'effect'\nimport type { LanguageModel } from 'effect/unstable/ai'\nimport { FetchHttpClient, HttpClient } from 'effect/unstable/http'\n\nimport type { XaiAuthStore } from './AuthStore'\nimport { makeXaiAuth, withXaiAuth } from './XaiAuth'\nimport { DEFAULT_XAI_MODEL_ID } from './XaiModelCatalog'\n\nexport const XAI_API_URL = 'https://api.x.ai/v1'\n\nconst TokenCount = Schema.Finite.check(Schema.isInt(), Schema.isGreaterThanOrEqualTo(0))\nconst XaiCompletionTokenDetails = Schema.Struct({ reasoning_tokens: TokenCount })\nconst decodeXaiCompletionTokenDetails = Schema.decodeUnknownOption(XaiCompletionTokenDetails)\n\ntype XaiUsage = NonNullable<CreateResponse200['usage']>\n\n/**\n * xAI reports `completion_tokens` as text-only while putting reasoning tokens in\n * `completion_tokens_details`. OpenAI-compatible clients expect `completion_tokens` to include both.\n */\nexport const normalizeXaiChatCompletionUsage = (usage: XaiUsage): XaiUsage => {\n\tconst details = decodeXaiCompletionTokenDetails(usage.completion_tokens_details)\n\treturn Option.match(details, {\n\t\tonNone: () => usage,\n\t\tonSome: ({ reasoning_tokens: reasoningTokens }) => ({\n\t\t\t...usage,\n\t\t\tcompletion_tokens: usage.completion_tokens + reasoningTokens,\n\t\t}),\n\t})\n}\n\nconst normalizeXaiResponse = <Response extends CreateResponse200 | ChatCompletionChunk>(\n\tresponse: Response,\n): Response => {\n\tif (Predicate.isNullish(response.usage)) return response\n\treturn { ...response, usage: normalizeXaiChatCompletionUsage(response.usage) }\n}\n\nconst normalizeXaiStreamResponse = (response: CreateResponse200Sse): CreateResponse200Sse =>\n\ttypeof response === 'string' || '_tag' in response ? response : normalizeXaiResponse(response)\n\n/** Normalize xAI's token semantics before the stock OpenAI-compatible model derives usage details. */\nexport const decorateXaiClient = (inner: OpenAiClient.Service): OpenAiClient.Service => ({\n\t...inner,\n\tcreateResponse: (options) =>\n\t\tinner.createResponse(options).pipe(Effect.map(([body, response]) => [normalizeXaiResponse(body), response])),\n\tcreateResponseStream: (options) =>\n\t\tinner\n\t\t\t.createResponseStream(options)\n\t\t\t.pipe(Effect.map(([response, stream]) => [response, stream.pipe(Stream.map(normalizeXaiStreamResponse))])),\n})\n\nexport type XaiModelOptions = {\n\treadonly model?: string\n\treadonly reasoning?: ReasoningLevel\n\treadonly providerId?: string\n\treadonly apiUrl?: string\n\treadonly store?: XaiAuthStore\n}\n\n/** Build xAI's stock OpenAI-compatible LanguageModel over the OAuth transport. */\nexport const makeXaiLanguageModel = (\n\toptions: XaiModelOptions,\n): Effect.Effect<LanguageModel.Service, never, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst httpContext = yield* Layer.build(FetchHttpClient.layer)\n\t\tconst base = Context.get(httpContext, HttpClient.HttpClient)\n\t\tconst
|
|
8
|
+
"/** FoldModel factory for xAI's OpenAI-compatible inference API authenticated with OAuth. */\nimport { OpenAiClient, OpenAiLanguageModel } from '@effect/ai-openai-compat'\nimport type {\n\tChatCompletionChunk,\n\tCreateResponse200,\n\tCreateResponse200Sse,\n} from '@effect/ai-openai-compat/OpenAiClient'\nimport * as NodeFileSystem from '@effect/platform-node/NodeFileSystem'\nimport { customModel, resolveOpenAiReasoning } from '@humanlayer/fold-core'\nimport type { FoldModel, ReasoningLevel } from '@humanlayer/fold-core'\nimport { Context, Effect, Layer, Option, Predicate, Schema, Stream } from 'effect'\nimport type { Scope } from 'effect'\nimport type { LanguageModel } from 'effect/unstable/ai'\nimport { FetchHttpClient, HttpClient } from 'effect/unstable/http'\n\nimport type { XaiAuthStore } from './AuthStore'\nimport { makeXaiAuth, withXaiAuth } from './XaiAuth'\nimport { DEFAULT_XAI_MODEL_ID } from './XaiModelCatalog'\n\nexport const XAI_API_URL = 'https://api.x.ai/v1'\n\nconst TokenCount = Schema.Finite.check(Schema.isInt(), Schema.isGreaterThanOrEqualTo(0))\nconst XaiCompletionTokenDetails = Schema.Struct({ reasoning_tokens: TokenCount })\nconst decodeXaiCompletionTokenDetails = Schema.decodeUnknownOption(XaiCompletionTokenDetails)\n\ntype XaiUsage = NonNullable<CreateResponse200['usage']>\n\n/**\n * xAI reports `completion_tokens` as text-only while putting reasoning tokens in\n * `completion_tokens_details`. OpenAI-compatible clients expect `completion_tokens` to include both.\n */\nexport const normalizeXaiChatCompletionUsage = (usage: XaiUsage): XaiUsage => {\n\tconst details = decodeXaiCompletionTokenDetails(usage.completion_tokens_details)\n\treturn Option.match(details, {\n\t\tonNone: () => usage,\n\t\tonSome: ({ reasoning_tokens: reasoningTokens }) => ({\n\t\t\t...usage,\n\t\t\tcompletion_tokens: usage.completion_tokens + reasoningTokens,\n\t\t}),\n\t})\n}\n\nconst normalizeXaiResponse = <Response extends CreateResponse200 | ChatCompletionChunk>(\n\tresponse: Response,\n): Response => {\n\tif (Predicate.isNullish(response.usage)) return response\n\treturn { ...response, usage: normalizeXaiChatCompletionUsage(response.usage) }\n}\n\nconst normalizeXaiStreamResponse = (response: CreateResponse200Sse): CreateResponse200Sse =>\n\ttypeof response === 'string' || '_tag' in response ? response : normalizeXaiResponse(response)\n\n/** Normalize xAI's token semantics before the stock OpenAI-compatible model derives usage details. */\nexport const decorateXaiClient = (inner: OpenAiClient.Service): OpenAiClient.Service => ({\n\t...inner,\n\tcreateResponse: (options) =>\n\t\tinner.createResponse(options).pipe(Effect.map(([body, response]) => [normalizeXaiResponse(body), response])),\n\tcreateResponseStream: (options) =>\n\t\tinner\n\t\t\t.createResponseStream(options)\n\t\t\t.pipe(Effect.map(([response, stream]) => [response, stream.pipe(Stream.map(normalizeXaiStreamResponse))])),\n})\n\nexport type XaiModelOptions = {\n\treadonly model?: string\n\treadonly reasoning?: ReasoningLevel\n\treadonly providerId?: string\n\treadonly apiUrl?: string\n\treadonly store?: XaiAuthStore\n}\n\n/** Build xAI's stock OpenAI-compatible LanguageModel over the OAuth transport. */\nexport const makeXaiLanguageModel = (\n\toptions: XaiModelOptions,\n): Effect.Effect<LanguageModel.Service, never, Scope.Scope> =>\n\tEffect.gen(function* () {\n\t\tconst httpContext = yield* Layer.build(FetchHttpClient.layer)\n\t\tconst base = Context.get(httpContext, HttpClient.HttpClient)\n\t\tconst authOptions: { store?: XaiAuthStore } = {}\n\t\tif (options.store !== undefined) authOptions.store = options.store\n\t\tconst auth = yield* makeXaiAuth(authOptions).pipe(Effect.provideService(HttpClient.HttpClient, base))\n\t\tconst clientContext = yield* Layer.build(OpenAiClient.layer({ apiUrl: options.apiUrl ?? XAI_API_URL })).pipe(\n\t\t\tEffect.provideService(HttpClient.HttpClient, withXaiAuth(base, auth)),\n\t\t)\n\t\tconst client = decorateXaiClient(Context.get(clientContext, OpenAiClient.OpenAiClient))\n\t\treturn yield* OpenAiLanguageModel.make({ model: options.model ?? DEFAULT_XAI_MODEL_ID }).pipe(\n\t\t\tEffect.provideService(OpenAiClient.OpenAiClient, client),\n\t\t)\n\t}).pipe(Effect.provide(NodeFileSystem.layer))\n\n/** Describe an xAI OAuth-backed model compatible with Fold sessions and switching. */\nexport const xaiModel = (options: XaiModelOptions = {}): FoldModel => {\n\tconst level = options.reasoning ?? 'off'\n\treturn customModel({\n\t\tactiveModel: {\n\t\t\tproviderId: options.providerId ?? 'xai',\n\t\t\tproviderKind: 'openai-compatible',\n\t\t\tmodelId: options.model ?? DEFAULT_XAI_MODEL_ID,\n\t\t\trole: null,\n\t\t\trequestedReasoningLevel: level,\n\t\t\treasoning: resolveOpenAiReasoning(level),\n\t\t},\n\t\tmake: makeXaiLanguageModel(options),\n\t})\n}\n",
|
|
9
9
|
"import { Schema } from 'effect'\n\n/** Model IDs verified for xAI subscription-backed OAuth sessions. */\nexport const XaiFrontierModelId = Schema.Literals(['grok-4.5', 'grok-4.6'])\nexport type XaiFrontierModelId = typeof XaiFrontierModelId.Type\n\n/** One model exposed to embedding hosts for validation and selection controls. */\nexport const XaiFrontierModel = Schema.Struct({\n\tmodelId: XaiFrontierModelId,\n\tlabel: Schema.NonEmptyString,\n})\nexport type XaiFrontierModel = typeof XaiFrontierModel.Type\n\n/** Frontier Grok models supported by Fold's xAI OAuth transport. */\nexport const XAI_FRONTIER_MODELS = [\n\t{ modelId: 'grok-4.5', label: 'Grok 4.5' },\n\t{ modelId: 'grok-4.6', label: 'Grok 4.6' },\n] as const satisfies ReadonlyArray<XaiFrontierModel>\n\n/** The model selected when an embedding host does not provide one. */\nexport const DEFAULT_XAI_MODEL_ID: XaiFrontierModelId = 'grok-4.6'\n"
|
|
10
10
|
],
|
|
11
|
-
"mappings": "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",
|
|
12
|
-
"debugId": "
|
|
11
|
+
"mappings": "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",
|
|
12
|
+
"debugId": "461F34C3E0E8E0DA64756E2164756E21",
|
|
13
13
|
"names": []
|
|
14
14
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@humanlayer/fold-xai",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.18",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"test:watch": "bun vitest"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@humanlayer/fold-core": "0.1.
|
|
22
|
+
"@humanlayer/fold-core": "0.1.18"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"@effect/ai-openai-compat": "4.0.0-rc.109",
|