iterate 0.2.7 → 0.4.0
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/README.md +173 -81
- package/dist/api.d.ts +643 -0
- package/dist/api.mjs +0 -0
- package/dist/app-server.d.ts +51 -0
- package/dist/app-server.mjs +481 -0
- package/dist/app-server.mjs.map +1 -0
- package/dist/app-session.d.ts +49 -0
- package/dist/app-session.mjs +235 -0
- package/dist/app-session.mjs.map +1 -0
- package/dist/app.d.ts +29 -0
- package/dist/app.mjs +180 -0
- package/dist/app.mjs.map +1 -0
- package/dist/client/live-state.d.ts +63 -0
- package/dist/client/oauth.d.ts +17 -0
- package/dist/client/react.d.ts +77 -0
- package/dist/client/socket.d.ts +7 -0
- package/dist/client.mjs +156 -0
- package/dist/client.mjs.map +1 -0
- package/dist/expression.d.ts +88 -0
- package/dist/expression.mjs +301 -0
- package/dist/expression.mjs.map +1 -0
- package/dist/lib-BWr-5mFO.mjs +36 -0
- package/dist/lib-BWr-5mFO.mjs.map +1 -0
- package/dist/lib.d.ts +70 -0
- package/dist/lib.mjs +228 -0
- package/dist/lib.mjs.map +1 -0
- package/dist/node.d.ts +15 -0
- package/dist/node.mjs +47 -0
- package/dist/node.mjs.map +1 -0
- package/dist/oauth-scopes.d.ts +32 -0
- package/dist/oauth-scopes.mjs +40 -0
- package/dist/oauth-scopes.mjs.map +1 -0
- package/dist/oauth.mjs +41 -0
- package/dist/oauth.mjs.map +1 -0
- package/dist/principal.d.ts +8 -0
- package/dist/principal.mjs +8 -0
- package/dist/principal.mjs.map +1 -0
- package/dist/project-ingress.d.ts +58 -0
- package/dist/project-ingress.mjs +104 -0
- package/dist/project-ingress.mjs.map +1 -0
- package/dist/react.mjs +285 -0
- package/dist/react.mjs.map +1 -0
- package/dist/sdk/auth.d.ts +25 -0
- package/dist/sdk/index.d.ts +155 -0
- package/dist/sdk/record-pipelined-steps.d.ts +19 -0
- package/dist/sdk.mjs +245 -0
- package/dist/sdk.mjs.map +1 -0
- package/dist/stream/processor.d.ts +383 -0
- package/dist/stream/processor.mjs +605 -0
- package/dist/stream/processor.mjs.map +1 -0
- package/dist/stream/run.d.ts +61 -0
- package/dist/stream/run.mjs +45 -0
- package/dist/stream/run.mjs.map +1 -0
- package/dist/stream/test-support.d.ts +45 -0
- package/dist/stream/test-support.mjs +196 -0
- package/dist/stream/test-support.mjs.map +1 -0
- package/dist/usingCtx-inzbY1Qz.mjs +57 -0
- package/package.json +93 -30
- package/bin/iterate.js +0 -86
- package/dist/cli-DMS4kJph.mjs +0 -868
- package/dist/cli-DMS4kJph.mjs.map +0 -1
- package/dist/config-DtnR7Lv7.mjs +0 -170
- package/dist/config-DtnR7Lv7.mjs.map +0 -1
- package/dist/index.d.mts +0 -5
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -8
- package/dist/index.mjs.map +0 -1
- package/dist/stream-tui/agent-chat-terminal.d.mts +0 -1
- package/dist/stream-tui/agent-chat-terminal.mjs +0 -933
- package/dist/stream-tui/agent-chat-terminal.mjs.map +0 -1
- package/dist/worker.d.mts +0 -33
- package/dist/worker.mjs +0 -18
- package/dist/worker.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-DMS4kJph.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { dirname, join } from \"node:path\";\nimport process from \"node:process\";\n\nimport * as prompts from \"@clack/prompts\";\nimport type { RpcStub } from \"capnweb\";\nimport { createORPCClient } from \"@orpc/client\";\nimport { RPCLink } from \"@orpc/client/fetch\";\nimport { os } from \"@orpc/server\";\nimport { createCli, parseRouter, type AnyRouter, yamlTableConsoleLogger } from \"trpc-cli\";\nimport { z } from \"zod/v4\";\nimport type { StandardSchemaV1 } from \"trpc-cli/dist/standard-schema/contract.js\";\nimport type { AuthContractClient } from \"../../../apps/auth-contract/src/index.ts\";\nimport type {\n ItxAuthCredentials,\n ProjectListEntry,\n ProjectRpcTarget,\n Session,\n Stream,\n} from \"../../../apps/os/src/types.ts\";\nimport { connectItx } from \"../../../apps/os/src/itx-client.ts\";\nimport {\n CONFIG_PATH,\n Config,\n DEFAULT_CONFIG_NAME,\n readConfig,\n readConfigFile,\n removeConfigSession,\n updateConfigSession,\n writeConfigFile,\n type StoredSession,\n} from \"./config.ts\";\n\ntype ParsedRouter = ReturnType<typeof parseRouter>;\n\nconst OAUTH_REFRESH_SKEW_MS = 60_000;\nconst DEFAULT_CHAT_AGENT_PATH = \"/agents/onboarding\";\ntype OsAuthHeaders = { cookie?: string; authorization?: string };\ntype OsAuth = { credentials: ItxAuthCredentials; requestHeaders?: HeadersInit };\ntype CreateOsSession = (input: { auth: OsAuth; baseUrl: string }) => RpcStub<Session>;\n\nconst isAgent =\n process.env.AGENT === \"1\" ||\n process.env.OPENCODE === \"1\" ||\n Boolean(process.env.OPENCODE_SESSION) ||\n Boolean(process.env.CLAUDE_CODE);\n\n/** Global override set by --config flag before CLI commands run. */\nlet configFlagOverride: string | undefined;\n\n/**\n * We strip host-level flags before handing argv to `trpc-cli`,\n * That keeps router-local help/validation focused on the mounted\n * procedures instead of teaching every command about iterate-specific flags.\n *\n * Example: `iterate --config dev doctor`\n */\nconst consumeCliStringFlag = (flagName: string): string | undefined => {\n const args = process.argv.slice(2);\n const flagIndex = args.indexOf(flagName);\n if (flagIndex === -1) return undefined;\n const value = args[flagIndex + 1];\n if (!value || value.startsWith(\"-\")) {\n throw new Error(`${flagName} requires a value`);\n }\n process.argv.splice(flagIndex + 2, 2);\n return value;\n};\n\nconst firstNonFlagArgument = (args: string[]): string | undefined => {\n for (const arg of args) {\n if (arg === \"--\") return undefined;\n if (!arg.startsWith(\"-\")) return arg;\n }\n return undefined;\n};\n\nexport const defaultBareInvocationToChat = (args: string[]) =>\n args.length === 0 ? [\"chat\"] : args;\n\nconst applyDefaultBareInvocation = () => {\n const args = process.argv.slice(2);\n const nextArgs = defaultBareInvocationToChat(args);\n if (nextArgs !== args) process.argv.splice(2, args.length, ...nextArgs);\n};\n\nconst resolveStreamTuiEntrypointPath = () => {\n const moduleDir = import.meta.dirname;\n const candidates = [\n join(moduleDir, \"stream-tui/agent-chat-terminal.tsx\"),\n join(moduleDir, \"stream-tui/agent-chat-terminal.mjs\"),\n join(moduleDir, \"stream-tui/agent-chat-terminal.js\"),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n\n throw new Error(\"Could not find the Iterate stream TUI entrypoint.\");\n};\n\nexport const buildChatCommand = (input: {\n osBaseUrl: string;\n projectId: string;\n agentPath: string;\n entrypointPath: string;\n}) => ({\n command: \"bun\",\n args: [\n input.entrypointPath,\n \"--base-url\",\n input.osBaseUrl,\n \"--project-id\",\n input.projectId,\n \"--agent-path\",\n input.agentPath,\n ],\n});\n\nconst runInheritedProcess = async (input: {\n command: string;\n args: string[];\n env: Record<string, string | undefined>;\n}): Promise<void> => {\n const child = spawn(input.command, input.args, {\n stdio: \"inherit\",\n env: { ...process.env, ...input.env },\n });\n\n const result = await new Promise<{ code: number | null; signal: NodeJS.Signals | null }>(\n (resolve, reject) => {\n child.on(\"error\", reject);\n child.on(\"exit\", (code, signal) => resolve({ code, signal }));\n },\n );\n\n if (result.signal) {\n throw new Error(`${input.command} exited with signal ${result.signal}.`);\n }\n if (result.code !== 0) {\n throw new Error(`${input.command} exited with code ${result.code ?? \"unknown\"}.`);\n }\n};\n\nconst hasConfig = (configFile: ReturnType<typeof readConfigFile>, name: string) =>\n name === DEFAULT_CONFIG_NAME || Boolean(configFile.configs?.[name]);\n\n/**\n * Resolve which config name to use.\n * Priority: --config flag > workspace match (walk up from cwd) > default > single-config auto > built-in prd\n */\nconst resolveConfigName = (workspacePath: string): string | Error => {\n const configFile = readConfigFile();\n\n if (configFlagOverride) {\n if (!hasConfig(configFile, configFlagOverride)) {\n return new Error(\n `Config \"${configFlagOverride}\" not found. Available: ${Object.keys(configFile.configs || {}).join(\", \") || \"(none)\"}`,\n );\n }\n return configFlagOverride;\n }\n\n // Walk up directory tree for workspace match\n let dir = workspacePath;\n while (dir && dir !== \"/\") {\n const match = configFile.workspaces?.[dir];\n if (match) {\n if (!hasConfig(configFile, match)) {\n return new Error(`Workspace \"${dir}\" maps to config \"${match}\" which doesn't exist.`);\n }\n return match;\n }\n dir = dirname(dir);\n }\n\n if (configFile.default) {\n if (!hasConfig(configFile, configFile.default)) {\n return new Error(\n `Default config \"${configFile.default}\" doesn't exist. Available: ${Object.keys(configFile.configs || {}).join(\", \") || \"(none)\"}`,\n );\n }\n return configFile.default;\n }\n\n // If there's exactly one config, use it\n const configNames = Object.keys(configFile.configs || {});\n if (configNames.length === 1) return configNames[0];\n\n return DEFAULT_CONFIG_NAME;\n};\n\nfunction resolveConfig(workspacePath: string): { name: string; config: Config } | Error;\nfunction resolveConfig(\n workspacePath: string,\n options: { throw: true },\n): { name: string; config: Config };\nfunction resolveConfig(\n workspacePath: string,\n options?: { throw: true },\n): { name: string; config: Config } | Error {\n const result = ((): { name: string; config: Config } | Error => {\n const name = resolveConfigName(workspacePath);\n if (name instanceof Error) return name;\n const config = readConfig(name);\n if (config instanceof Error) return config;\n return { name, config };\n })();\n if (result instanceof Error && options?.throw) throw result;\n return result;\n}\n\nclass StoredOsSessionError extends Error {\n readonly reason: \"missing\" | \"expired\";\n\n constructor(reason: \"missing\" | \"expired\", message: string) {\n super(message);\n this.reason = reason;\n this.name = \"StoredOsSessionError\";\n }\n}\n\n/**\n * Get auth headers for OS API calls based on the resolved config's stored session.\n * OAuth sessions are refreshed when possible.\n */\nconst getOsAuthHeaders = async (config: Config, configName?: string): Promise<OsAuthHeaders> => {\n let session = config.session;\n if (!session) {\n throw new StoredOsSessionError(\n \"missing\",\n `Not logged in to ${config.osBaseUrl}. Run \\`iterate login\\` first.`,\n );\n }\n if (sessionNeedsRefresh(session)) {\n if (session.refreshToken && session.clientId) {\n session = await refreshOAuthSession({ config, configName, session });\n } else {\n throw new StoredOsSessionError(\n \"expired\",\n `Session expired for ${config.osBaseUrl}. Run \\`iterate login\\` again.`,\n );\n }\n }\n if (session.token) {\n return { authorization: `Bearer ${session.token}` };\n }\n if (session.cookie) {\n return { cookie: session.cookie };\n }\n throw new Error(`Stored session for ${config.osBaseUrl} has no token or cookie.`);\n};\n\nconst osAuthFromHeaders = (headers: OsAuthHeaders): OsAuth => {\n if (headers.authorization) {\n const match = /^Bearer\\s+(.+)$/i.exec(headers.authorization);\n if (!match) throw new Error(\"Stored OS authorization header is not a bearer token.\");\n return { credentials: { type: \"bearer\", token: match[1] } };\n }\n if (headers.cookie) {\n return {\n credentials: { type: \"from-server-cookie\" },\n requestHeaders: { cookie: headers.cookie },\n };\n }\n throw new Error(\"No OS auth credentials available.\");\n};\n\nconst osAuthFromEnvironment = (): OsAuth | undefined => {\n const adminSecret = process.env.APP_CONFIG_ADMIN_API_SECRET?.trim();\n if (adminSecret) return { credentials: { type: \"admin-secret\", secret: adminSecret } };\n\n const bearerToken = process.env.ITERATE_BEARER_TOKEN?.trim();\n if (bearerToken) return { credentials: { type: \"bearer\", token: bearerToken } };\n\n return undefined;\n};\n\nconst disposeRpc = (stub: { [Symbol.dispose]?: () => void } | undefined) => {\n try {\n stub?.[Symbol.dispose]?.();\n } catch {\n // Broken transports may already have disposed the remote side.\n }\n};\n\nconst errorMessage = (error: unknown) => (error instanceof Error ? error.message : String(error));\n\nconst headersRecord = (headers: HeadersInit | undefined): Record<string, string> | undefined => {\n if (headers === undefined) return undefined;\n return Object.fromEntries(new Headers(headers).entries());\n};\n\nconst withAuthenticatedOsSession = async <T>(input: {\n auth: OsAuth;\n baseUrl: string;\n createSession?: CreateOsSession;\n run: (session: RpcStub<Session>) => Promise<T>;\n}): Promise<T> => {\n const session =\n input.createSession?.({ auth: input.auth, baseUrl: input.baseUrl }) ??\n (connectItx({\n auth: input.auth.credentials,\n baseUrl: input.baseUrl,\n headers: headersRecord(input.auth.requestHeaders),\n }) as RpcStub<Session>);\n\n try {\n return await input.run(session);\n } finally {\n disposeRpc(session);\n }\n};\n\nexport const verifyOsSession = async (input: {\n authHeaders: OsAuthHeaders;\n baseUrl: string;\n createSession?: CreateOsSession;\n}) => {\n return await withAuthenticatedOsSession({\n auth: osAuthFromHeaders(input.authHeaders),\n baseUrl: input.baseUrl,\n createSession: input.createSession,\n run: async (session) => await session.__describe(),\n });\n};\n\nconst setupMissingProjectForChat = async (session: RpcStub<Session>, project: ProjectListEntry) => {\n let projectItx: RpcStub<ProjectRpcTarget> | undefined;\n let agentStream: RpcStub<Stream> | undefined;\n try {\n projectItx = (await session.projects.create({\n projectId: project.id,\n slug: project.slug,\n ...(project.organizationSlug ? { organizationSlug: project.organizationSlug } : {}),\n waitUntilCreated: false,\n })) as unknown as RpcStub<ProjectRpcTarget>;\n agentStream = projectItx.streams.get(DEFAULT_CHAT_AGENT_PATH) as RpcStub<Stream>;\n await agentStream.waitForEvent({\n afterOffset: 0,\n eventTypes: [\"events.iterate.com/agent/llm-provider-selected\"],\n timeoutMs: 15_000,\n });\n } catch (error) {\n throw new Error(\n `Project \"${project.slug}\" (${project.id}) exists in auth but is missing in OS. Failed to set it up for chat: ${errorMessage(error)}`,\n );\n } finally {\n disposeRpc(agentStream);\n disposeRpc(projectItx);\n }\n return project.id;\n};\n\nconst accessibleProjectsMessage = (projects: ProjectListEntry[]) =>\n projects.length === 0\n ? \"No accessible projects found.\"\n : `Accessible projects: ${projects\n .map((project) => `${project.slug} (${project.id}, ${project.deploymentStatus})`)\n .join(\", \")}.`;\n\nexport const resolveChatProject = async (input: {\n auth: OsAuth;\n baseUrl: string;\n configName: string;\n configPath: string;\n configuredDefaultProject?: string;\n createSession?: CreateOsSession;\n explicitProject?: string;\n}) => {\n const configured = input.explicitProject || input.configuredDefaultProject;\n\n return await withAuthenticatedOsSession({\n auth: input.auth,\n baseUrl: input.baseUrl,\n createSession: input.createSession,\n run: async (session) => {\n let projects: ProjectListEntry[];\n try {\n projects = await session.projects.list();\n } catch (error) {\n if (configured) {\n throw new Error(\n `Failed to resolve project \"${configured}\" for config \"${input.configName}\" in ${input.configPath}. The CLI could not list accessible projects, so it cannot resolve slugs or recover auth-known projects that are missing in OS: ${errorMessage(error)}`,\n );\n }\n throw new Error(\n `No project specified. Pass --project or set \"defaultProject\" on config \"${input.configName}\" in ${input.configPath}. Failed to list accessible projects: ${errorMessage(error)}`,\n );\n }\n\n if (configured) {\n const project = projects.find(\n (candidate) => candidate.id === configured || candidate.slug === configured,\n );\n if (!project) {\n if (configured.startsWith(\"prj_\")) return configured;\n throw new Error(\n `Project \"${configured}\" was not found among accessible projects for config \"${input.configName}\" in ${input.configPath}. ${accessibleProjectsMessage(projects)}`,\n );\n }\n if (project.deploymentStatus === \"missing\") {\n return await setupMissingProjectForChat(session, project);\n }\n return project.id;\n }\n\n const readyProjects = projects.filter((project) => project.deploymentStatus === \"ready\");\n const candidates = readyProjects.length > 0 ? readyProjects : projects;\n if (candidates.length === 1) {\n const project = candidates[0]!;\n if (project.deploymentStatus === \"missing\") {\n return await setupMissingProjectForChat(session, project);\n }\n return project.id;\n }\n\n throw new Error(\n `No project specified. Pass --project or set \"defaultProject\" on config \"${input.configName}\" in ${input.configPath}. ${accessibleProjectsMessage(projects)}`,\n );\n },\n });\n};\n\nconst sessionNeedsRefresh = (session: StoredSession) => {\n if (!session.expiresAt) return false;\n const expiresAt = Date.parse(session.expiresAt);\n return Number.isFinite(expiresAt) && expiresAt <= Date.now() + OAUTH_REFRESH_SKEW_MS;\n};\n\nconst getAuthWorkerHeaders = async (\n config: Config,\n): Promise<{ cookie?: string; authorization?: string }> => {\n const session = config.session;\n if (!session) {\n throw new Error(`Not logged in to ${config.authBaseUrl}. Run \\`iterate login\\` first.`);\n }\n if (session.expiresAt && new Date(session.expiresAt) < new Date()) {\n throw new Error(`Session expired for ${config.authBaseUrl}. Run \\`iterate login\\` again.`);\n }\n if (session.token) {\n return { authorization: `Bearer ${session.token}` };\n }\n if (session.cookie) {\n return { cookie: session.cookie };\n }\n throw new Error(`Stored session for ${config.authBaseUrl} has no token or cookie.`);\n};\n\nconst getAuthWorkerClient = async (config: Config): Promise<AuthContractClient> => {\n const baseURL = config.authBaseUrl;\n const headers = await getAuthWorkerHeaders(config);\n return createORPCClient(\n new RPCLink({\n url: `${baseURL}/api/orpc/`,\n fetch: async (request: URL | Request, init?: RequestInit) => {\n const reqHeaders = new Headers(\n request instanceof Request ? request.headers : init?.headers,\n );\n if (headers.cookie) reqHeaders.set(\"cookie\", headers.cookie);\n if (headers.authorization) reqHeaders.set(\"authorization\", headers.authorization);\n return fetch(request, { ...init, headers: reqHeaders });\n },\n }),\n );\n};\n\nconst OAUTH_SCOPE = \"openid profile email offline_access project\";\nconst LOOPBACK_HOST = \"localhost\";\nconst LOOPBACK_CALLBACK_PATH = \"/callback\";\nconst OAUTH_CALLBACK_TIMEOUT_MS = 5 * 60 * 1000;\n\ntype OAuthTokenResponse = {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n expires_at?: number;\n token_type?: string;\n scope?: string;\n id_token?: string;\n};\n\nconst base64Url = (buffer: Buffer) => buffer.toString(\"base64url\");\n\nconst randomBase64Url = (byteLength = 32) => base64Url(randomBytes(byteLength));\n\nexport const oauthResourceForOsBaseUrl = (osBaseUrl: string) => {\n const url = new URL(osBaseUrl);\n const loopbackHosts = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\", \"::1\"]);\n\n if (loopbackHosts.has(url.hostname)) {\n return `${url.protocol}//${url.hostname}`;\n }\n\n url.search = \"\";\n url.hash = \"\";\n url.pathname = url.pathname.replace(/\\/+$/, \"\") || \"/\";\n return url.toString().replace(/\\/$/, \"\");\n};\n\nconst openUrlInBrowser = async (url: string) => {\n try {\n const { execFile } = await import(\"node:child_process\");\n if (process.platform === \"darwin\") {\n execFile(\"open\", [url]);\n return;\n }\n if (process.platform === \"win32\") {\n execFile(\"cmd\", [\"/c\", \"start\", \"\", url]);\n return;\n }\n execFile(\"xdg-open\", [url]);\n } catch {\n // Ignore; the URL is printed for manual opening.\n }\n};\n\nconst readErrorBody = async (response: Response) => {\n const text = await response.text();\n return text.length > 300 ? `${text.slice(0, 300)}...` : text;\n};\n\nconst registerOAuthClient = async (input: { authBaseUrl: string; redirectUri: string }) => {\n const response = await fetch(`${input.authBaseUrl}/api/auth/oauth2/register`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", origin: input.authBaseUrl },\n body: JSON.stringify({\n client_name: \"Iterate CLI\",\n redirect_uris: [input.redirectUri],\n token_endpoint_auth_method: \"none\",\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n scope: OAUTH_SCOPE,\n type: \"native\",\n require_pkce: true,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `OAuth client registration failed (${response.status}): ${await readErrorBody(response)}`,\n );\n }\n\n const client = (await response.json()) as { client_id?: string };\n if (!client.client_id) throw new Error(\"OAuth client registration did not return client_id.\");\n return client.client_id;\n};\n\nconst startOAuthCallbackServer = async (): Promise<{\n redirectUri: string;\n wait: () => Promise<{ code: string; state: string; redirectUri: string }>;\n close: () => Promise<void>;\n}> => {\n let settled = false;\n let resolveCallback:\n | ((value: { code: string; state: string; redirectUri: string }) => void)\n | undefined;\n let rejectCallback: ((reason: unknown) => void) | undefined;\n\n const callbackPromise = new Promise<{\n code: string;\n state: string;\n redirectUri: string;\n }>((resolve, reject) => {\n resolveCallback = resolve;\n rejectCallback = reject;\n });\n\n const server = createServer((request: IncomingMessage, response: ServerResponse) => {\n if (settled) {\n response.writeHead(409, { \"content-type\": \"text/plain; charset=utf-8\" });\n response.end(\"OAuth callback already received.\");\n return;\n }\n\n const url = new URL(request.url ?? \"/\", `http://${LOOPBACK_HOST}`);\n if (url.pathname !== LOOPBACK_CALLBACK_PATH) {\n response.writeHead(404, { \"content-type\": \"text/plain; charset=utf-8\" });\n response.end(\"Not found.\");\n return;\n }\n\n const error = url.searchParams.get(\"error\");\n if (error) {\n settled = true;\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(\"<h1>Iterate login failed</h1><p>You can return to the terminal.</p>\");\n rejectCallback?.(\n new Error(\n `OAuth authorization failed: ${error}${\n url.searchParams.get(\"error_description\")\n ? ` (${url.searchParams.get(\"error_description\")})`\n : \"\"\n }`,\n ),\n );\n return;\n }\n\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n if (!code || !state) {\n settled = true;\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(\"<h1>Iterate login failed</h1><p>Missing code or state.</p>\");\n rejectCallback?.(new Error(\"OAuth callback was missing code or state.\"));\n return;\n }\n\n settled = true;\n response.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(\"<h1>Iterate login complete</h1><p>You can close this tab.</p>\");\n const address = server.address();\n const port = typeof address === \"object\" && address ? address.port : 0;\n resolveCallback?.({\n code,\n state,\n redirectUri: `http://${LOOPBACK_HOST}:${port}${LOOPBACK_CALLBACK_PATH}`,\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(0, LOOPBACK_HOST, () => resolve());\n });\n\n const timeout = setTimeout(() => {\n if (!settled) {\n settled = true;\n rejectCallback?.(new Error(\"Timed out waiting for OAuth callback.\"));\n }\n }, OAUTH_CALLBACK_TIMEOUT_MS);\n timeout.unref();\n\n const address = server.address();\n const port = typeof address === \"object\" && address ? address.port : 0;\n\n return {\n redirectUri: `http://${LOOPBACK_HOST}:${port}${LOOPBACK_CALLBACK_PATH}`,\n wait: () => callbackPromise.finally(() => clearTimeout(timeout)),\n close: () => new Promise<void>((resolve) => server.close(() => resolve())),\n };\n};\n\nconst exchangeOAuthCode = async (input: {\n authBaseUrl: string;\n clientId: string;\n code: string;\n codeVerifier: string;\n redirectUri: string;\n resource: string;\n}) => {\n const body = new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: input.clientId,\n code: input.code,\n redirect_uri: input.redirectUri,\n code_verifier: input.codeVerifier,\n resource: input.resource,\n });\n\n const response = await fetch(`${input.authBaseUrl}/api/auth/oauth2/token`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/x-www-form-urlencoded\",\n origin: input.authBaseUrl,\n },\n body,\n });\n\n if (!response.ok) {\n throw new Error(\n `OAuth token exchange failed (${response.status}): ${await readErrorBody(response)}`,\n );\n }\n\n const token = (await response.json()) as OAuthTokenResponse;\n if (!token.access_token) throw new Error(\"OAuth token exchange did not return access_token.\");\n return token;\n};\n\nconst oauthTokenToSession = (\n token: OAuthTokenResponse,\n existing: Pick<StoredSession, \"clientId\" | \"refreshToken\"> | undefined,\n): StoredSession => {\n const expiresAtMs = token.expires_at\n ? token.expires_at * 1000\n : token.expires_in\n ? Date.now() + token.expires_in * 1000\n : undefined;\n return {\n token: token.access_token,\n refreshToken: token.refresh_token ?? existing?.refreshToken,\n clientId: existing?.clientId,\n scope: token.scope,\n tokenType: token.token_type,\n expiresAt: expiresAtMs ? new Date(expiresAtMs).toISOString() : undefined,\n };\n};\n\nexport const refreshOAuthSession = async (input: {\n config: Config;\n configName?: string;\n session: StoredSession;\n}): Promise<StoredSession> => {\n if (!input.session.refreshToken || !input.session.clientId) {\n throw new Error(`Session expired for ${input.config.osBaseUrl}. Run \\`iterate login\\` again.`);\n }\n\n const authBaseUrl = input.config.authBaseUrl;\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: input.session.clientId,\n refresh_token: input.session.refreshToken,\n resource: oauthResourceForOsBaseUrl(input.config.osBaseUrl),\n });\n if (input.session.scope) body.set(\"scope\", input.session.scope);\n\n const response = await fetch(`${authBaseUrl}/api/auth/oauth2/token`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/x-www-form-urlencoded\",\n origin: authBaseUrl,\n },\n body,\n });\n\n if (!response.ok) {\n throw new Error(`OAuth refresh failed (${response.status}). Run \\`iterate login\\` again.`);\n }\n\n const token = (await response.json()) as OAuthTokenResponse;\n const refreshedSession = oauthTokenToSession(token, input.session);\n refreshedSession.clientId = input.session.clientId;\n input.config.session = refreshedSession;\n if (input.configName) updateConfigSession(input.configName, refreshedSession);\n return refreshedSession;\n};\n\nconst oauthLogin = async (config: Config): Promise<StoredSession> => {\n const authBaseUrl = config.authBaseUrl;\n const resource = oauthResourceForOsBaseUrl(config.osBaseUrl);\n const codeVerifier = randomBase64Url(48);\n const state = randomBase64Url(32);\n const callback = await startOAuthCallbackServer();\n const clientId = await registerOAuthClient({ authBaseUrl, redirectUri: callback.redirectUri });\n\n const authorizeUrl = new URL(`${authBaseUrl}/api/auth/oauth2/authorize`);\n authorizeUrl.searchParams.set(\"response_type\", \"code\");\n authorizeUrl.searchParams.set(\"client_id\", clientId);\n authorizeUrl.searchParams.set(\"redirect_uri\", callback.redirectUri);\n authorizeUrl.searchParams.set(\"scope\", OAUTH_SCOPE);\n authorizeUrl.searchParams.set(\"resource\", resource);\n authorizeUrl.searchParams.set(\"state\", state);\n authorizeUrl.searchParams.set(\n \"code_challenge\",\n base64Url(createHash(\"sha256\").update(codeVerifier).digest()),\n );\n authorizeUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\n console.error(`\\nOpening browser to authenticate with Iterate:\\n`);\n console.error(` ${authorizeUrl.href}\\n`);\n if (!isAgent && process.env.ITERATE_SKIP_BROWSER_OPEN !== \"1\") {\n await openUrlInBrowser(authorizeUrl.href);\n }\n\n let callbackResult: { code: string; state: string; redirectUri: string };\n try {\n callbackResult = await callback.wait();\n } finally {\n await callback.close().catch(() => {});\n }\n\n if (callbackResult.state !== state) {\n throw new Error(\"OAuth callback state did not match. Please try again.\");\n }\n\n const token = await exchangeOAuthCode({\n authBaseUrl,\n clientId,\n code: callbackResult.code,\n codeVerifier,\n redirectUri: callbackResult.redirectUri,\n resource,\n });\n const session = oauthTokenToSession(token, { clientId, refreshToken: undefined });\n session.clientId = clientId;\n return session;\n};\n\nconst loginToResolvedConfig = async (resolved: { name: string; config: Config }) => {\n const { config } = resolved;\n\n console.error(`Logging in to ${config.authBaseUrl}...`);\n const oauthResult = await oauthLogin(config);\n updateConfigSession(resolved.name, oauthResult);\n // Update in-memory config so subsequent verification and calls see the token.\n config.session = oauthResult;\n\n await verifyOsSession({\n authHeaders: await getOsAuthHeaders(config, resolved.name),\n baseUrl: config.osBaseUrl,\n }).catch((error: unknown) => {\n throw new Error(`Failed to verify OS session: ${errorMessage(error)}`);\n });\n\n return oauthResult;\n};\n\nconst shouldAutoLoginForChat = (error: unknown) =>\n error instanceof StoredOsSessionError &&\n (error.reason === \"missing\" || error.reason === \"expired\");\n\nexport const ensureBearerAuthHeadersForChat = async (input: {\n getAuthHeaders: () => Promise<OsAuthHeaders>;\n login: () => Promise<void>;\n osBaseUrl: string;\n}) => {\n let authHeaders = await input.getAuthHeaders();\n if (authHeaders.authorization) return authHeaders;\n\n console.error(\n `Stored session for ${input.osBaseUrl} cannot be used for chat. Starting browser login...`,\n );\n await input.login();\n authHeaders = await input.getAuthHeaders();\n if (authHeaders.authorization) return authHeaders;\n\n throw new Error(\n `Stored session for ${input.osBaseUrl} has no bearer token. Run \\`iterate login\\` again.`,\n );\n};\n\nconst loadRemoteProcedures = async (params: {\n baseUrl: string;\n}): Promise<{ procedures: ParsedRouter }> => {\n const url = `${params.baseUrl}/api/trpc-cli-procedures`;\n const response = await fetch(url);\n if (!response.ok) {\n let text = await response.text();\n if (text.includes(\"<title>\")) {\n text = \"HTML with title: \" + text.split(\"<title>\")[1].split(\"</title>\")[0];\n } else if ([\"<html>\", \"<body>\", \"<head>\", \"!DOCTYPE html\"].some((s) => text.includes(s))) {\n text = \"<html>...</html>\";\n } else {\n text = text.split(\"\\n\")[0];\n if (text.length > 50) text = text.slice(0, 50) + \"...\";\n }\n\n throw new Error(`${url} got ${response.status}: ${text}`);\n }\n\n let router: any;\n try {\n router = await response.json();\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n throw new Error(`${url} returned invalid router: ${message}`);\n }\n if (!Array.isArray(router?.procedures)) {\n throw new Error(`${url} returned invalid router: ${JSON.stringify(router)}`);\n }\n return router as { procedures: ParsedRouter };\n};\n\n/** Wraps an oRPC client so `wrapper[dotPath].query(input)` and `.mutate(input)` work (for trpc-cli proxify compat) */\nconst orpcToTrpcStyleClient = (orpcClient: unknown) => {\n return new Proxy(\n {},\n {\n get: (_target, prop: string) => {\n const parts = prop.split(\".\");\n let current: any = orpcClient;\n for (const part of parts) current = current[part];\n return {\n query: (input: any) => current(input),\n mutate: (input: any) => current(input),\n };\n },\n },\n );\n};\n\nconst getOsProcedures = async (params: {\n baseUrl: string;\n config: Config;\n configName?: string;\n}) => {\n const appRouter = await loadRemoteProcedures(params);\n const proxiedRouter = proxifyOrpc(appRouter.procedures, () => {\n const client = createORPCClient(\n new RPCLink({\n url: `${params.baseUrl}/api/orpc/`,\n fetch: async (request: URL | Request, init?: RequestInit) => {\n const authHeaders = await getOsAuthHeaders(params.config, params.configName);\n const headers = new Headers(request instanceof Request ? request.headers : init?.headers);\n if (authHeaders.cookie) headers.set(\"cookie\", authHeaders.cookie);\n if (authHeaders.authorization) headers.set(\"authorization\", authHeaders.authorization);\n return fetch(request, { ...init, headers });\n },\n }),\n );\n return orpcToTrpcStyleClient(client);\n });\n\n return proxiedRouter;\n};\n\nconst launcherProcedures = {\n ping: os.input(z.object({})).handler(async () => {\n const resolved = resolveConfig(process.cwd(), { throw: true });\n const { config } = resolved;\n const description = await verifyOsSession({\n authHeaders: await getOsAuthHeaders(config, resolved.name),\n baseUrl: config.osBaseUrl,\n }).catch((error: unknown) => {\n throw new Error(`Failed to verify OS session: ${errorMessage(error)}`);\n });\n return { message: \"OS session valid\", principal: description.principal };\n }),\n login: os\n .input(z.object({}))\n .meta({\n description: \"Authenticate with the OS server via browser-based OAuth\",\n })\n .handler(async () => {\n const resolved = resolveConfig(process.cwd(), { throw: true });\n const oauthResult = await loginToResolvedConfig(resolved);\n return {\n message: \"Logged in successfully\",\n expiresAt: oauthResult.expiresAt,\n scope: oauthResult.scope,\n };\n }),\n\n logout: os\n .input(z.object({}))\n .meta({ description: \"Remove stored session for the current config\" })\n .handler(async () => {\n const resolved = resolveConfig(process.cwd(), { throw: true });\n removeConfigSession(resolved.name);\n return { message: `Logged out from ${resolved.name} (${resolved.config.osBaseUrl})` };\n }),\n\n chat: os\n .input(\n z.object({\n project: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\n \"OS project id (prj_…) or slug. Defaults to the active config's defaultProject.\",\n ),\n agentPath: z\n .string()\n .trim()\n .min(1)\n .startsWith(\"/agents/\")\n .optional()\n .default(DEFAULT_CHAT_AGENT_PATH)\n .describe(\"Agent stream path to chat with (default: /agents/onboarding)\"),\n }),\n )\n .meta({\n description: \"Open the Iterate agent chat terminal UI\",\n })\n .handler(async ({ input }) => {\n // Resolved here, not in the input schema: the schema is built at module\n // load, before `--config` has been consumed.\n const resolved = resolveConfig(process.cwd(), { throw: true });\n const envAuth = osAuthFromEnvironment();\n let storedAuthHeaders: OsAuthHeaders | undefined;\n let didAutoLogin = false;\n const loginForChat = async () => {\n didAutoLogin = true;\n storedAuthHeaders = undefined;\n await loginToResolvedConfig(resolved);\n };\n const getStoredAuthHeaders = async () => {\n if (storedAuthHeaders) return storedAuthHeaders;\n try {\n storedAuthHeaders = await getOsAuthHeaders(resolved.config, resolved.name);\n } catch (error) {\n if (didAutoLogin || !shouldAutoLoginForChat(error)) throw error;\n console.error(\n `No active session for ${resolved.config.osBaseUrl}. Starting browser login...`,\n );\n await loginForChat();\n storedAuthHeaders = await getOsAuthHeaders(resolved.config, resolved.name);\n }\n return storedAuthHeaders;\n };\n const getStoredBearerAuthHeaders = () =>\n ensureBearerAuthHeadersForChat({\n getAuthHeaders: getStoredAuthHeaders,\n login: loginForChat,\n osBaseUrl: resolved.config.osBaseUrl,\n });\n const project = await resolveChatProject({\n auth: envAuth ?? osAuthFromHeaders(await getStoredBearerAuthHeaders()),\n baseUrl: resolved.config.osBaseUrl,\n configName: resolved.name,\n configPath: CONFIG_PATH,\n configuredDefaultProject: resolved.config.defaultProject,\n explicitProject: input.project,\n });\n const command = buildChatCommand({\n osBaseUrl: resolved.config.osBaseUrl,\n projectId: project,\n agentPath: input.agentPath,\n entrypointPath: resolveStreamTuiEntrypointPath(),\n });\n // Auth: admin/bearer secrets from the inherited environment win (doppler,\n // e2e). Otherwise refresh the stored `iterate login` session here — the\n // launcher owns the OAuth refresh machinery — and hand the TUI a plain\n // bearer token; the capnweb WebSocket authenticates once at connect.\n const env: Record<string, string | undefined> = { ITERATE_CONFIG_NAME: resolved.name };\n if (!envAuth) {\n const headers = await getStoredBearerAuthHeaders();\n const token = headers.authorization?.replace(/^Bearer /, \"\");\n if (!token) {\n throw new Error(\n `Stored session for ${resolved.config.osBaseUrl} has no bearer token. Run \\`iterate login\\` again.`,\n );\n }\n env.ITERATE_BEARER_TOKEN = token;\n }\n await runInheritedProcess({ ...command, env });\n }),\n\n orgs: {\n list: os\n .input(z.object({}))\n .meta({ description: \"List organizations from the auth worker\" })\n .handler(async () => {\n const resolved = resolveConfig(process.cwd(), { throw: true });\n const authClient = await getAuthWorkerClient(resolved.config);\n return await authClient.user.myOrganizations();\n }),\n },\n\n config: {\n get: os\n .input(z.object({}))\n .meta({ default: true, description: \"Show config, resolved target, and session status\" })\n .handler(async () => {\n const configFile = readConfigFile();\n const resolved = resolveConfig(process.cwd());\n\n const configs = configFile.configs || {};\n const sessions = Object.fromEntries(\n Object.entries(configs).map(([name, cfg]) => {\n if (!cfg.session) return [name, null];\n return [\n name,\n {\n hasToken: Boolean(cfg.session?.token),\n hasCookie: Boolean(cfg.session?.cookie),\n expiresAt: cfg.session?.expiresAt,\n expired: cfg.session?.expiresAt\n ? new Date(cfg.session.expiresAt) < new Date()\n : false,\n },\n ];\n }),\n );\n\n if (resolved instanceof Error) {\n return { configPath: CONFIG_PATH, error: resolved.message };\n }\n\n return {\n configPath: CONFIG_PATH,\n config: resolved.name,\n ...resolved.config,\n session: sessions[resolved.name],\n };\n }),\n list: os\n .input(z.object({}))\n .meta({ description: \"List all named configs\" })\n .handler(async () => {\n const configFile = readConfigFile();\n const currentName = resolveConfigName(process.cwd());\n const configs = { [DEFAULT_CONFIG_NAME]: {}, ...(configFile.configs || {}) };\n return {\n configs: Object.fromEntries(\n Object.entries(configs).map(([name, cfg]) => [\n name,\n {\n osBaseUrl: Config.parse(cfg).osBaseUrl,\n active: name === currentName ? true : undefined,\n },\n ]),\n ),\n default: configFile.default,\n };\n }),\n\n set: os\n .input(\n z.object({\n name: z.string().describe(\"Config name (e.g. dev, prd, preview)\"),\n osBaseUrl: z\n .string()\n .optional()\n .describe(\"Base URL for OS API (e.g. https://os.iterate.com)\"),\n authBaseUrl: z\n .string()\n .optional()\n .describe(\"Base URL for auth API (e.g. https://auth.iterate.com)\"),\n setDefault: z.boolean().optional().describe(\"Set as the default config\"),\n setWorkspace: z.boolean().optional().describe(\"Map current directory to this config\"),\n }),\n )\n .meta({ prompt: true, description: \"Create or update a named config\" })\n .handler(async ({ input }) => {\n const configFile = readConfigFile();\n configFile.configs ||= {};\n\n configFile.configs[input.name] ||= {} as never;\n if (input.osBaseUrl) configFile.configs[input.name].osBaseUrl = input.osBaseUrl;\n if (input.authBaseUrl) configFile.configs[input.name].authBaseUrl = input.authBaseUrl;\n\n if (input.setDefault) {\n configFile.default = input.name;\n }\n if (input.setWorkspace) {\n configFile.workspaces ||= {};\n configFile.workspaces[process.cwd()] = input.name;\n }\n\n writeConfigFile(configFile);\n return {\n configPath: CONFIG_PATH,\n config: configFile.configs[input.name],\n };\n }),\n\n use: os\n .input(\n z.object({\n name: z.string().meta({ positional: true }).describe(\"Config name to set as default\"),\n }),\n )\n .meta({ description: \"Set the default config\" })\n .handler(async ({ input }) => {\n const configFile = readConfigFile();\n if (input.name !== DEFAULT_CONFIG_NAME && !configFile.configs?.[input.name]) {\n throw new Error(\n `Config \"${input.name}\" not found. Available: ${Object.keys(configFile.configs || {}).join(\", \") || \"(none)\"}`,\n );\n }\n configFile.default = input.name;\n writeConfigFile(configFile);\n return { default: input.name };\n }),\n\n current: os\n .input(z.object({}))\n .meta({ description: \"Show which config is active and why\" })\n .handler(async () => {\n const resolved = resolveConfig(process.cwd(), { throw: true });\n return {\n name: resolved.name,\n config: resolved.config,\n resolvedAuthBaseUrl: resolved.config.authBaseUrl,\n resolvedVia: configFlagOverride ? \"--config flag\" : \"workspace mapping or default\",\n };\n }),\n },\n};\n\nexport const getCli = async () => {\n // Parse custom top-level flags early, before trpc-cli sees the args.\n configFlagOverride = consumeCliStringFlag(\"--config\");\n applyDefaultBareInvocation();\n const requestedRootCommand = firstNonFlagArgument(process.argv.slice(2));\n const shouldLoadRemoteRouters =\n !requestedRootCommand ||\n !Object.prototype.hasOwnProperty.call(launcherProcedures, requestedRootCommand);\n\n const errorProcedure = (problem: string) => (e: Error) => {\n const message = `${problem}: ${e.message}`;\n return os.meta({ description: message }).handler(() => {\n throw new Error(problem, { cause: e });\n });\n };\n\n const routers: Record<string, import(\"@orpc/server\").Router<any, any>>[] = [launcherProcedures];\n\n // Launcher commands are fully local and should not wait on remote discovery before\n // they can run or print command-specific help.\n if (shouldLoadRemoteRouters) {\n const resolved = resolveConfig(process.cwd());\n if (resolved instanceof Error) {\n const procedure = errorProcedure(`Invalid config`)(resolved);\n routers.push({ os: procedure, daemon: procedure });\n } else {\n const { config } = resolved;\n const settledResults = await Promise.allSettled([\n getOsProcedures({ baseUrl: config.osBaseUrl, config, configName: resolved.name }),\n ]);\n\n const [osProcedures] = settledResults;\n\n if (osProcedures.status === \"fulfilled\") {\n routers.push({ os: osProcedures.value });\n } else {\n const message = `Couldn't connect to os at ${config.osBaseUrl}`;\n routers.push({ os: errorProcedure(message)(osProcedures.reason) });\n }\n }\n }\n\n const router = Object.assign({}, ...routers);\n\n const cli = createCli({\n router,\n name: \"iterate\",\n version: \"0.0.1\",\n description: \"Iterate CLI\",\n });\n\n return { cli, prompts: isAgent ? undefined : prompts };\n};\n\nexport const runCli = async () => {\n const { cli, prompts: cliPrompts } = await getCli();\n await cli.run({ prompts: cliPrompts, logger: yamlTableConsoleLogger });\n};\n\n// todo: move this to trpc-cli\nexport const proxifyOrpc = <R extends AnyRouter>(\n router: R | ReturnType<typeof parseRouter>,\n getClient: (procedurePath: string) => unknown,\n) => {\n const parsed = Array.isArray(router) ? router : parseRouter({ router });\n const outputRouterRecord = {};\n for (const [procedurePath, info] of parsed) {\n const parts = procedurePath.split(\".\");\n let currentRouter: any = outputRouterRecord;\n for (const part of parts.slice(0, -1)) {\n currentRouter = currentRouter[part] ||= {};\n }\n const schemas = info.inputSchemas.success ? info.inputSchemas.value : [];\n const standardSchema: StandardSchemaV1 & { toJsonSchema: () => {} } = {\n \"~standard\": {\n vendor: \"trpc-cli\",\n version: 1,\n validate: (value: unknown) => ({ value }),\n },\n toJsonSchema: () => {\n if (schemas.length === 0) return {};\n if (schemas.length === 1) return schemas[0];\n return { allOf: schemas };\n },\n };\n currentRouter[parts[parts.length - 1]] = os\n .input(standardSchema)\n .handler(async ({ input }: any) => {\n const client: any = await getClient(procedurePath);\n return client[procedurePath].query(input);\n });\n }\n return outputRouterRecord;\n};\n"],"mappings":"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"}
|
package/dist/config-DtnR7Lv7.mjs
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import WebSocket from "ws";
|
|
2
|
-
import { newWebSocketRpcSession } from "capnweb";
|
|
3
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
-
import { homedir } from "node:os";
|
|
5
|
-
import { dirname, join } from "node:path";
|
|
6
|
-
import { z } from "zod/v4";
|
|
7
|
-
//#region ../../apps/os/src/domains/itx/utils.ts
|
|
8
|
-
/**
|
|
9
|
-
* Groups an authenticated child stub with the parent stubs that keep it alive.
|
|
10
|
-
*
|
|
11
|
-
* Cap'n Web callers often want `using project = connectItx({ projectId })`, but
|
|
12
|
-
* that project stub is reached through a root session and authentication stub.
|
|
13
|
-
* This proxy makes disposal and `dup()` preserve the whole ownership chain, so
|
|
14
|
-
* disposing the child also tells the server it can release the parent stubs.
|
|
15
|
-
*/
|
|
16
|
-
function withOwnedRpcSession(stub, ...owned) {
|
|
17
|
-
let disposed = false;
|
|
18
|
-
return new Proxy(stub, { get(target, key, receiver) {
|
|
19
|
-
if (key === Symbol.dispose) return () => {
|
|
20
|
-
if (disposed) return;
|
|
21
|
-
disposed = true;
|
|
22
|
-
disposeAll(target, ...owned);
|
|
23
|
-
};
|
|
24
|
-
if (key === "dup") return () => withOwnedRpcSession(dup(target), ...owned.map(dup));
|
|
25
|
-
return Reflect.get(target, key, receiver);
|
|
26
|
-
} });
|
|
27
|
-
}
|
|
28
|
-
function dup(disposable) {
|
|
29
|
-
if (disposable.dup === void 0) throw new Error("Cannot dup scoped RPC stub because an owned stub does not expose dup()");
|
|
30
|
-
return disposable.dup();
|
|
31
|
-
}
|
|
32
|
-
function disposeAll(...disposables) {
|
|
33
|
-
let firstError;
|
|
34
|
-
for (const disposable of disposables) try {
|
|
35
|
-
disposable[Symbol.dispose]?.();
|
|
36
|
-
} catch (error) {
|
|
37
|
-
firstError ??= error;
|
|
38
|
-
}
|
|
39
|
-
if (firstError !== void 0) throw firstError;
|
|
40
|
-
}
|
|
41
|
-
//#endregion
|
|
42
|
-
//#region ../../apps/os/src/itx-client.ts
|
|
43
|
-
function websocketUrl(pathname, input) {
|
|
44
|
-
const baseUrl = input.baseUrl?.trim();
|
|
45
|
-
if (!baseUrl) throw new Error("connectItx requires a baseUrl (the deployment's APP_CONFIG_BASE_URL).");
|
|
46
|
-
const url = new URL(pathname, baseUrl.replace(/\/+$/, ""));
|
|
47
|
-
url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
|
|
48
|
-
return url.toString();
|
|
49
|
-
}
|
|
50
|
-
/** Decode a raw ws frame (outbound string, inbound Buffer/ArrayBuffer) into its parsed JSON value. */
|
|
51
|
-
function parseFrame(data) {
|
|
52
|
-
const text = typeof data === "string" ? data : Buffer.isBuffer(data) ? data.toString("utf8") : ArrayBuffer.isView(data) ? Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString("utf8") : data instanceof ArrayBuffer ? Buffer.from(data).toString("utf8") : void 0;
|
|
53
|
-
return text === void 0 ? data : JSON.parse(text);
|
|
54
|
-
}
|
|
55
|
-
function connect(url, headers, onWebSocketMessage) {
|
|
56
|
-
const socket = new WebSocket(url, {
|
|
57
|
-
handshakeTimeout: 15e3,
|
|
58
|
-
headers
|
|
59
|
-
});
|
|
60
|
-
if (onWebSocketMessage) {
|
|
61
|
-
const start = Date.now();
|
|
62
|
-
const record = (direction, data) => {
|
|
63
|
-
onWebSocketMessage([
|
|
64
|
-
Date.now() - start,
|
|
65
|
-
direction,
|
|
66
|
-
parseFrame(data)
|
|
67
|
-
]);
|
|
68
|
-
};
|
|
69
|
-
const send = socket.send.bind(socket);
|
|
70
|
-
socket.send = ((data, ...args) => {
|
|
71
|
-
record("out", data);
|
|
72
|
-
return send(data, ...args);
|
|
73
|
-
});
|
|
74
|
-
socket.on("message", (data) => record("in", data));
|
|
75
|
-
}
|
|
76
|
-
return newWebSocketRpcSession(socket);
|
|
77
|
-
}
|
|
78
|
-
function connectItx(input) {
|
|
79
|
-
const session = connect(websocketUrl("/api", input), input.headers, input.onWebSocketMessage);
|
|
80
|
-
if (!("auth" in input)) return session;
|
|
81
|
-
const root = session.authenticate(input.auth);
|
|
82
|
-
if (!("projectId" in input)) return withOwnedRpcSession(root, session);
|
|
83
|
-
const project = root.projects.get(input.projectId);
|
|
84
|
-
if (!("agentPath" in input)) return withOwnedRpcSession(project, root, session);
|
|
85
|
-
return withOwnedRpcSession(project.agents.get(input.agentPath), project, root, session);
|
|
86
|
-
}
|
|
87
|
-
const CONFIG_PATH = join(join(process.env.XDG_CONFIG_HOME ? process.env.XDG_CONFIG_HOME : join(homedir(), ".config"), "iterate"), "config.json");
|
|
88
|
-
const DEFAULT_OS_BASE_URL = "https://os.iterate.com";
|
|
89
|
-
const DEFAULT_AUTH_BASE_URL = "https://auth.iterate.com";
|
|
90
|
-
/** Stored session (lives inside a config entry) */
|
|
91
|
-
const StoredSession = z.object({
|
|
92
|
-
token: z.string().optional(),
|
|
93
|
-
refreshToken: z.string().optional(),
|
|
94
|
-
clientId: z.string().optional(),
|
|
95
|
-
scope: z.string().optional(),
|
|
96
|
-
tokenType: z.string().optional(),
|
|
97
|
-
cookie: z.string().optional(),
|
|
98
|
-
expiresAt: z.string().optional()
|
|
99
|
-
});
|
|
100
|
-
/** A named config — describes which server to talk to and how to authenticate. */
|
|
101
|
-
const Config = z.object({
|
|
102
|
-
defaultProject: z.string().optional(),
|
|
103
|
-
osBaseUrl: z.string().optional().default(DEFAULT_OS_BASE_URL),
|
|
104
|
-
authBaseUrl: z.string().optional().default(DEFAULT_AUTH_BASE_URL),
|
|
105
|
-
session: StoredSession.optional()
|
|
106
|
-
});
|
|
107
|
-
/** The config file on disk (~/.config/iterate/config.json) */
|
|
108
|
-
const ConfigFile = z.object({
|
|
109
|
-
configs: z.record(z.string(), Config).optional(),
|
|
110
|
-
default: z.string().optional(),
|
|
111
|
-
/** Maps absolute directory path to a config name */
|
|
112
|
-
workspaces: z.record(z.string(), z.string()).optional()
|
|
113
|
-
});
|
|
114
|
-
const normalizeConfig = (config) => ({
|
|
115
|
-
...config,
|
|
116
|
-
osBaseUrl: config.osBaseUrl.replace(/\/+$/, ""),
|
|
117
|
-
authBaseUrl: config.authBaseUrl.replace(/\/+$/, "")
|
|
118
|
-
});
|
|
119
|
-
const readConfigFile = () => {
|
|
120
|
-
if (!existsSync(CONFIG_PATH)) return {};
|
|
121
|
-
const rawText = readFileSync(CONFIG_PATH, "utf8");
|
|
122
|
-
try {
|
|
123
|
-
return JSON.parse(rawText);
|
|
124
|
-
} catch (error) {
|
|
125
|
-
const detail = error instanceof Error ? error.message : String(error);
|
|
126
|
-
throw new Error(`Invalid JSON in ${CONFIG_PATH}: ${detail}`);
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
const writeConfigFile = (configFile) => {
|
|
130
|
-
const parsed = ConfigFile.safeParse(configFile);
|
|
131
|
-
if (!parsed.success) throw new Error(`Invalid config file: ${z.prettifyError(parsed.error)}`);
|
|
132
|
-
mkdirSync(dirname(CONFIG_PATH), { recursive: true });
|
|
133
|
-
writeFileSync(CONFIG_PATH, `${JSON.stringify(parsed.data, null, 2)}\n`);
|
|
134
|
-
};
|
|
135
|
-
function readConfig(name, options) {
|
|
136
|
-
const result = (() => {
|
|
137
|
-
const raw = readConfigFile().configs?.[name] ?? (name === "prd" ? {} : void 0);
|
|
138
|
-
if (!raw) return /* @__PURE__ */ new Error(`Config "${name}" not found in ${CONFIG_PATH}`);
|
|
139
|
-
const parsed = Config.safeParse(raw);
|
|
140
|
-
if (!parsed.success) return /* @__PURE__ */ new Error(`Invalid config "${name}" in ${CONFIG_PATH}:\n${z.prettifyError(parsed.error)}`);
|
|
141
|
-
return normalizeConfig(parsed.data);
|
|
142
|
-
})();
|
|
143
|
-
if (result instanceof Error && options?.throw) throw result;
|
|
144
|
-
return result;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Merge session fields into the named config's stored session. Extra
|
|
148
|
-
* runtime-only keys on `session` are stripped by the schema on write.
|
|
149
|
-
*/
|
|
150
|
-
const updateConfigSession = (configName, session) => {
|
|
151
|
-
const configFile = readConfigFile();
|
|
152
|
-
configFile.configs ||= {};
|
|
153
|
-
const entry = configFile.configs[configName] ||= normalizeConfig(Config.parse({}));
|
|
154
|
-
entry.session = {
|
|
155
|
-
...entry.session,
|
|
156
|
-
...session
|
|
157
|
-
};
|
|
158
|
-
writeConfigFile(configFile);
|
|
159
|
-
};
|
|
160
|
-
const removeConfigSession = (configName) => {
|
|
161
|
-
const configFile = readConfigFile();
|
|
162
|
-
const entry = configFile.configs?.[configName];
|
|
163
|
-
if (!entry?.session) return;
|
|
164
|
-
delete entry.session;
|
|
165
|
-
writeConfigFile(configFile);
|
|
166
|
-
};
|
|
167
|
-
//#endregion
|
|
168
|
-
export { removeConfigSession as a, connectItx as c, readConfigFile as i, Config as n, updateConfigSession as o, readConfig as r, writeConfigFile as s, CONFIG_PATH as t };
|
|
169
|
-
|
|
170
|
-
//# sourceMappingURL=config-DtnR7Lv7.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-DtnR7Lv7.mjs","names":[],"sources":["../../../apps/os/src/domains/itx/utils.ts","../../../apps/os/src/itx-client.ts","../src/config.ts"],"sourcesContent":["import { normalizePath } from \"../durable-object-names.ts\";\n\ntype DisposableLike = {\n [Symbol.dispose]?(): void;\n dup?(): DisposableLike;\n};\n\ntype InvokeCapabilityTarget = {\n invokeCapability(call: { args: unknown[]; path: string[] }): unknown;\n};\n\nconst RESERVED_DYNAMIC_PATH_SEGMENTS: ReadonlySet<string> = new Set([\n \"__defineGetter__\",\n \"__defineSetter__\",\n \"__lookupGetter__\",\n \"__lookupSetter__\",\n \"__proto__\",\n \"apply\",\n \"bind\",\n \"call\",\n \"catch\",\n \"constructor\",\n \"dup\",\n \"finally\",\n \"hasOwnProperty\",\n \"isPrototypeOf\",\n \"map\",\n \"onRpcBroken\",\n \"propertyIsEnumerable\",\n \"prototype\",\n \"then\",\n \"toLocaleString\",\n \"toString\",\n \"valueOf\",\n]);\n\nexport type ItxEntrypointScope = {\n path: string;\n projectId: string;\n};\n\nexport type ItxEntrypointProps = ItxEntrypointScope;\n\n/**\n * Normalizes the props passed into dynamic workers' `env.ITX` binding.\n *\n * Worker Loader cache keys, stateful worker Durable Object names, and\n * `env.ITX.get()` must all agree on the same project/path scope. Keeping this\n * normalization in one small helper prevents one call site from caching under\n * `\"agents/demo\"` while another resolves the runtime ITX target as\n * `\"/agents/demo\"`.\n */\nexport function itxEntrypointProps(input: ItxEntrypointScope): ItxEntrypointProps {\n return {\n path: normalizePath(input.path),\n projectId: input.projectId,\n };\n}\n\n/**\n * Validates the host-minted binding props before giving worker code an ITX\n * capability. This is the trust boundary for dynamic workers: callers do not\n * choose their own scope, the hosting object mints it.\n */\nexport function scopeFromItxEntrypointProps(\n props: ItxEntrypointProps | undefined,\n): ItxEntrypointScope {\n if (props === undefined) {\n throw new Error(\"env.ITX.get() requires ITX binding props with projectId and path\");\n }\n if (props.projectId.trim() === \"\") {\n throw new Error(\"env.ITX.get() requires a non-empty projectId\");\n }\n return {\n path: normalizePath(props.path),\n projectId: props.projectId,\n };\n}\n\n/**\n * Builds the Worker Loader cache key component for an ITX scope.\n *\n * The same module bytes can be loaded under different project/agent scopes, and\n * those scopes must not share Worker Loader instances because `env.ITX` would\n * point at the wrong capability tree.\n */\n\n/**\n * Narrow structural view of the `ItxEntrypoint` loopback export on\n * `ctx.exports`. `ctx.exports` is typed globally (src/lib/worker-env.d.ts);\n * this module keeps its own structural view so it never depends on the\n * ambient global Env (same pattern as `projectEgressFetcher`).\n */\ntype ItxEntrypointLoopbackExports = Record<\n \"ItxEntrypoint\",\n (options: { props: ItxEntrypointProps }) => Fetcher\n>;\n\nexport function itxEntrypointBinding(exports: unknown, props: ItxEntrypointProps): Fetcher {\n return (exports as ItxEntrypointLoopbackExports).ItxEntrypoint({ props });\n}\n\n/**\n * Shape helper for the `__describe()` convention (see `Description` in\n * types.ts): fills the always-present fields so every node returns\n * `{ instructions, types, children, ... }` even before it has real content.\n * Deliberately dumb — each node hand-writes its description; this is the\n * anchor the future transitive (parent-composes-children) mechanism hangs off.\n */\nexport function describeNode<Extras extends object>(\n input: {\n instructions: string;\n types?: string;\n children?: Record<string, string>;\n parent?: string;\n } & Extras,\n): { instructions: string; types: string; children: Record<string, string> } & Extras {\n return { children: {}, types: \"\", ...input };\n}\n\n/**\n * Groups an authenticated child stub with the parent stubs that keep it alive.\n *\n * Cap'n Web callers often want `using project = connectItx({ projectId })`, but\n * that project stub is reached through a root session and authentication stub.\n * This proxy makes disposal and `dup()` preserve the whole ownership chain, so\n * disposing the child also tells the server it can release the parent stubs.\n */\nexport function withOwnedRpcSession<T extends object>(stub: T, ...owned: DisposableLike[]): T {\n let disposed = false;\n return new Proxy(stub, {\n get(target, key, receiver) {\n if (key === Symbol.dispose) {\n return () => {\n if (disposed) return;\n disposed = true;\n disposeAll(target as DisposableLike, ...owned);\n };\n }\n if (key === \"dup\") {\n return () => withOwnedRpcSession(dup(target as DisposableLike), ...owned.map(dup));\n }\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\n/**\n * Guards `provideCapability` against shadowing the itx surface: a capability\n * path's root segment may not be a reserved RPC segment nor an existing member\n * name of the itx-facing surfaces (e.g. `streams`, `agents`). Runs in the\n * isolate because the member names come from RpcTarget prototypes, which the\n * capability-host Durable Object can't see (ITX_SURFACE_MEMBER_NAMES in\n * rpc-targets.ts).\n */\nexport function rejectBuiltinCollision(surfaceMembers: ReadonlySet<string>, path: string[]): void {\n const root = path[0];\n if (!root) return;\n if (isReservedDynamicPathSegment(root)) {\n throw new Error(`cannot provide capability \"${root}\": it is a reserved ITX path segment`);\n }\n if (surfaceMembers.has(root)) {\n throw new Error(`cannot provide capability \"${root}\": it is already on the ITX surface`);\n }\n}\n\n/**\n * Builds the dotted-path fallback used by dynamic ITX capabilities.\n *\n * Dynamic dotted fallback uses a function-backed proxy instead of a RpcTarget\n * instance: each missing property extends the path, and applying the function\n * performs one explicit invokeCapability({ path, args }) call.\n */\nexport function createInvokeCapabilityPathProxy(\n invoker: InvokeCapabilityTarget,\n path: string[] = [],\n isReserved = isReservedDynamicPathSegment,\n): unknown {\n const valueFor = (key: string) =>\n createInvokeCapabilityPathProxy(invoker, [...path, key], isReserved);\n\n return new Proxy(function () {}, {\n apply(_target, _thisArg, args) {\n return invoker.invokeCapability({ args: [...args], path });\n },\n get(target, key, receiver) {\n if (typeof key === \"symbol\") return Reflect.get(target, key, receiver);\n if (isReserved(key)) return undefined;\n // NOTE `__describe` is deliberately NOT reserved: it traverses like any\n // other segment, and the capability-host processor intercepts trailing\n // `__describe` and answers from the mount's durable metadata\n // (capability-host-processor-implementation.ts #describeMount). One\n // mechanism, no proxy special cases.\n return valueFor(key);\n },\n getOwnPropertyDescriptor(target, key) {\n const descriptor = Reflect.getOwnPropertyDescriptor(target, key);\n if (descriptor) return descriptor;\n if (typeof key === \"symbol\" || isReserved(key)) return undefined;\n // Cap'n Web's server-side path traversal probes own descriptors before\n // reading a segment. Dynamic roots need to look discoverable here so\n // calls like project.slack.chat.postMessage(...) reach the apply trap.\n return {\n configurable: true,\n enumerable: true,\n value: valueFor(key),\n writable: false,\n };\n },\n has(target, key) {\n if (typeof key === \"symbol\") return key in target;\n return !isReserved(key);\n },\n });\n}\n\n/**\n * Wraps a fixed RpcTarget with the dynamic capability fallback surface.\n *\n * Built-in methods still win through normal property lookup. Only missing roots\n * become dynamic capability paths, which lets the public API expose concrete\n * methods like `streams` while also supporting provided paths such as\n * `project.slack.chat.postMessage(...)`.\n *\n * KEY DESIGN IDEA: the RpcTarget with its known members sits *in front of* the ITX\n * Durable Object. Built-ins resolve here in the isolate; only unknown roots fall\n * through to `invokeCapability` (the ITX DO's dynamic table). So `itx.streams.get(...)`\n * never makes a round trip to the DO just to check whether `streams` was shadowed.\n * The deliberate trade-off: a dynamic capability can never shadow a built-in name —\n * the built-in always wins. If we find we need shadowable built-ins a lot, we'd move\n * resolution behind the DO and pay that round trip; for now this keeps the hot path free.\n */\nexport function withInvokeCapabilityFallback<T extends object>(\n target: T,\n options: {\n isReserved?: (segment: string) => boolean;\n /**\n * Where unknown dotted paths dispatch. Defaults to the target itself, which\n * must then have `invokeCapability`. The itx/agent surfaces pass their\n * capability host instead, so they need no pass-through method of their own.\n */\n invoker?: InvokeCapabilityTarget;\n } = {},\n): T {\n const isReserved = options.isReserved ?? isReservedDynamicPathSegment;\n const invoker = options.invoker ?? (target as unknown as InvokeCapabilityTarget);\n\n return new Proxy(target, {\n get(target, key) {\n if (key === \"then\") return undefined;\n if (typeof key === \"symbol\" || key in target) {\n const value = Reflect.get(target, key, target);\n if (typeof value === \"function\" && !isAccessor(target, key)) {\n return value.bind(target);\n }\n return value;\n }\n if (isReserved(key)) return undefined;\n return createInvokeCapabilityPathProxy(invoker, [key], isReserved);\n },\n getOwnPropertyDescriptor(target, key) {\n // Unknown dynamic roots must not look like instance fields to Cap'n Web.\n // That keeps Workers RPC's RpcTarget instance-property protection intact:\n // actual instance fields are still rejected by the transport, while\n // missing roots are discovered later as dynamic path proxies.\n return Reflect.getOwnPropertyDescriptor(target, key);\n },\n });\n}\n\nfunction isReservedDynamicPathSegment(segment: string): boolean {\n return RESERVED_DYNAMIC_PATH_SEGMENTS.has(segment);\n}\n\nfunction dup(disposable: DisposableLike): DisposableLike {\n if (disposable.dup === undefined) {\n throw new Error(\"Cannot dup scoped RPC stub because an owned stub does not expose dup()\");\n }\n return disposable.dup();\n}\n\nfunction disposeAll(...disposables: DisposableLike[]): void {\n let firstError: unknown;\n for (const disposable of disposables) {\n try {\n disposable[Symbol.dispose]?.();\n } catch (error) {\n firstError ??= error;\n }\n }\n if (firstError !== undefined) throw firstError;\n}\n\nfunction isAccessor(target: object, key: PropertyKey): boolean {\n for (let node: object | null = target; node; node = Object.getPrototypeOf(node)) {\n const descriptor = Object.getOwnPropertyDescriptor(node, key);\n if (descriptor) return descriptor.get !== undefined;\n }\n return false;\n}\n","import WebSocket from \"ws\";\nimport {\n newWebSocketRpcSession,\n type RpcCompatible as CapnRpcCompatible,\n type RpcStub as CapnRpcStub,\n} from \"capnweb\";\nimport { withOwnedRpcSession } from \"./domains/itx/utils.ts\";\nimport type {\n Agent,\n ItxAuthCredentials,\n ProjectRpcTarget,\n Session,\n UnauthenticatedOs,\n} from \"./types.ts\";\n\nexport type ItxWebSocketMessage = [timestamp: number, direction: \"in\" | \"out\", data: unknown];\n\ntype ConnectItxBaseInput = {\n /** OS deployment base URL, e.g. the config's APP_CONFIG_BASE_URL. */\n baseUrl: string;\n /** Node WebSocket handshake headers, used by CLI/server callers with cookies. */\n headers?: Record<string, string>;\n /** Observe every decoded ws frame (e.g. the e2e suite's frame recorder). */\n onWebSocketMessage?: (message: ItxWebSocketMessage) => void;\n};\n\ntype ConnectItxAuthenticatedInput = ConnectItxBaseInput & {\n auth: ItxAuthCredentials;\n};\n\ntype ConnectProjectItxInput = ConnectItxAuthenticatedInput & {\n projectId: string;\n};\n\ntype ConnectAgentItxInput = ConnectItxAuthenticatedInput & {\n agentPath: string;\n projectId: string;\n};\n\nfunction websocketUrl(pathname: string, input: { baseUrl: string }) {\n const baseUrl = input.baseUrl?.trim();\n if (!baseUrl) {\n throw new Error(\"connectItx requires a baseUrl (the deployment's APP_CONFIG_BASE_URL).\");\n }\n const url = new URL(pathname, baseUrl.replace(/\\/+$/, \"\"));\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return url.toString();\n}\n\n/** Decode a raw ws frame (outbound string, inbound Buffer/ArrayBuffer) into its parsed JSON value. */\nfunction parseFrame(data: unknown): unknown {\n const text =\n typeof data === \"string\"\n ? data\n : Buffer.isBuffer(data)\n ? data.toString(\"utf8\")\n : ArrayBuffer.isView(data)\n ? Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString(\"utf8\")\n : data instanceof ArrayBuffer\n ? Buffer.from(data).toString(\"utf8\")\n : undefined;\n return text === undefined ? data : JSON.parse(text);\n}\n\nfunction connect<T extends CapnRpcCompatible<T>>(\n url: string,\n headers?: Record<string, string>,\n onWebSocketMessage?: (message: ItxWebSocketMessage) => void,\n): CapnRpcStub<T> {\n // 15s: cold deployments answer the upgrade only after the worker chain has\n // loaded, but #1601's route-healing + the preview slot warmup mean the first\n // upgrade lands in a few seconds — 15s is headroom, not a hang budget.\n const socket = new WebSocket(url, { handshakeTimeout: 15_000, headers });\n\n if (onWebSocketMessage) {\n const start = Date.now();\n const record = (direction: \"in\" | \"out\", data: unknown) => {\n onWebSocketMessage([Date.now() - start, direction, parseFrame(data)]);\n };\n const send = socket.send.bind(socket);\n socket.send = ((data: Parameters<WebSocket[\"send\"]>[0], ...args: unknown[]) => {\n record(\"out\", data);\n return send(data, ...(args as []));\n }) as WebSocket[\"send\"];\n socket.on(\"message\", (data) => record(\"in\", data));\n }\n\n return newWebSocketRpcSession<T>(\n socket as unknown as Parameters<typeof newWebSocketRpcSession>[0],\n );\n}\n\ntype RpcSessionStub<T extends object> = CapnRpcStub<T> & {\n [Symbol.dispose]?(): void;\n dup(): RpcSessionStub<T>;\n};\n\nexport function connectItx(input: ConnectAgentItxInput): CapnRpcStub<Agent>;\nexport function connectItx(input: ConnectProjectItxInput): CapnRpcStub<ProjectRpcTarget>;\nexport function connectItx(input: ConnectItxAuthenticatedInput): CapnRpcStub<Session>;\nexport function connectItx(input: ConnectItxBaseInput): CapnRpcStub<UnauthenticatedOs>;\nexport function connectItx(\n input:\n | ConnectAgentItxInput\n | ConnectItxAuthenticatedInput\n | ConnectItxBaseInput\n | ConnectProjectItxInput,\n):\n | CapnRpcStub<Agent>\n | CapnRpcStub<ProjectRpcTarget>\n | CapnRpcStub<Session>\n | CapnRpcStub<UnauthenticatedOs> {\n const session = connect<UnauthenticatedOs>(\n websocketUrl(\"/api\", input),\n input.headers,\n input.onWebSocketMessage,\n );\n if (!(\"auth\" in input)) return session;\n\n const root = session.authenticate(input.auth) as CapnRpcStub<Session>;\n if (!(\"projectId\" in input)) return withOwnedRpcSession(root, session);\n\n const project = root.projects.get(input.projectId) as RpcSessionStub<ProjectRpcTarget>;\n if (!(\"agentPath\" in input)) return withOwnedRpcSession(project, root, session);\n\n // An \"agent itx\" reached from outside `/api` is just this agent's `Agent`\n // handle. It already carries the agent's own control surface plus the dynamic\n // capability scope chain (agent scope → project scope), so\n // `agent.someProvidedCapability()` resolves whether the capability was mounted\n // on the agent or on the project. Inside a Worker, `env.ITX.get()` returns the\n // richer full itx at the agent path; the external client keeps the narrower,\n // serialization-friendly Agent surface.\n const agent = project.agents.get(input.agentPath) as RpcSessionStub<Agent>;\n return withOwnedRpcSession(agent, project, root, session);\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { z } from \"zod/v4\";\n\nconst XDG_CONFIG_PARENT = join(\n process.env.XDG_CONFIG_HOME ? process.env.XDG_CONFIG_HOME : join(homedir(), \".config\"),\n \"iterate\",\n);\n\nexport const CONFIG_PATH = join(XDG_CONFIG_PARENT, \"config.json\");\nexport const DEFAULT_CONFIG_NAME = \"prd\";\nconst DEFAULT_OS_BASE_URL = \"https://os.iterate.com\";\nconst DEFAULT_AUTH_BASE_URL = \"https://auth.iterate.com\";\n\n/** Stored session (lives inside a config entry) */\nexport const StoredSession = z.object({\n token: z.string().optional(),\n refreshToken: z.string().optional(),\n clientId: z.string().optional(),\n scope: z.string().optional(),\n tokenType: z.string().optional(),\n cookie: z.string().optional(),\n expiresAt: z.string().optional(),\n});\n\nexport type StoredSession = z.infer<typeof StoredSession>;\n\n/** A named config — describes which server to talk to and how to authenticate. */\nexport const Config = z.object({\n defaultProject: z.string().optional(),\n osBaseUrl: z.string().optional().default(DEFAULT_OS_BASE_URL),\n authBaseUrl: z.string().optional().default(DEFAULT_AUTH_BASE_URL),\n session: StoredSession.optional(),\n});\n\nexport type Config = z.infer<typeof Config>;\n\n/** The config file on disk (~/.config/iterate/config.json) */\nconst ConfigFile = z.object({\n configs: z.record(z.string(), Config).optional(),\n default: z.string().optional(),\n /** Maps absolute directory path to a config name */\n workspaces: z.record(z.string(), z.string()).optional(),\n});\n\ntype ConfigFile = z.infer<typeof ConfigFile>;\n\nconst normalizeConfig = (config: Config): Config => ({\n ...config,\n // Strip trailing slashes to avoid double-slash URLs downstream.\n osBaseUrl: config.osBaseUrl.replace(/\\/+$/, \"\"),\n authBaseUrl: config.authBaseUrl.replace(/\\/+$/, \"\"),\n});\n\nexport const readConfigFile = (): ConfigFile => {\n if (!existsSync(CONFIG_PATH)) return {};\n const rawText = readFileSync(CONFIG_PATH, \"utf8\");\n try {\n return JSON.parse(rawText) as ConfigFile;\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid JSON in ${CONFIG_PATH}: ${detail}`);\n }\n};\n\nexport const writeConfigFile = (configFile: ConfigFile): void => {\n const parsed = ConfigFile.safeParse(configFile);\n if (!parsed.success) {\n throw new Error(`Invalid config file: ${z.prettifyError(parsed.error)}`);\n }\n mkdirSync(dirname(CONFIG_PATH), { recursive: true });\n writeFileSync(CONFIG_PATH, `${JSON.stringify(parsed.data, null, 2)}\\n`);\n};\n\n/**\n * Read and validate a single named config, applying schema defaults and\n * normalizing URLs. Missing or invalid configs are returned as an Error value\n * by default, or thrown when called with `{ throw: true }`.\n */\nexport function readConfig(name: string): Config | Error;\nexport function readConfig(name: string, options: { throw: true }): Config;\nexport function readConfig(name: string, options?: { throw: true }): Config | Error {\n const result = ((): Config | Error => {\n const raw = readConfigFile().configs?.[name] ?? (name === DEFAULT_CONFIG_NAME ? {} : undefined);\n if (!raw) return new Error(`Config \"${name}\" not found in ${CONFIG_PATH}`);\n const parsed = Config.safeParse(raw);\n if (!parsed.success) {\n return new Error(\n `Invalid config \"${name}\" in ${CONFIG_PATH}:\\n${z.prettifyError(parsed.error)}`,\n );\n }\n return normalizeConfig(parsed.data);\n })();\n if (result instanceof Error && options?.throw) throw result;\n return result;\n}\n\n/**\n * Merge session fields into the named config's stored session. Extra\n * runtime-only keys on `session` are stripped by the schema on write.\n */\nexport const updateConfigSession = (configName: string, session: StoredSession): void => {\n const configFile = readConfigFile();\n configFile.configs ||= {};\n const entry = (configFile.configs[configName] ||= normalizeConfig(Config.parse({})));\n entry.session = { ...entry.session, ...session };\n writeConfigFile(configFile);\n};\n\nexport const removeConfigSession = (configName: string): void => {\n const configFile = readConfigFile();\n const entry = configFile.configs?.[configName];\n if (!entry?.session) return;\n delete entry.session;\n writeConfigFile(configFile);\n};\n"],"mappings":"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"}
|
package/dist/index.d.mts
DELETED
package/dist/index.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";iBAAsB,MAAA,IAAM,OAAA"}
|
package/dist/index.mjs
DELETED
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["export async function runCli() {\n const cli = await import(\"./cli.ts\");\n await cli.runCli();\n}\n"],"mappings":";AAAA,eAAsB,SAAS;CAE7B,OAAM,MADY,OAAO,sBAAA,CACf,OAAO;AACnB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { };
|