@lunnoa/client 1.3.0 → 1.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 +4 -2
- package/dist/cli.js +43 -9
- package/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -7
- package/dist/index.d.ts +9 -7
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +4 -2
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +7 -5
- package/dist/react.d.ts +7 -5
- package/dist/react.js +4 -2
- package/dist/react.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/auth.ts","../src/core/errors.ts","../src/core/http.ts","../src/streaming/sse.ts","../src/streaming/agent-chat.ts","../src/resources/actions.ts","../src/define/index.ts","../src/resources/common.ts","../src/resources/agents.ts","../src/auth/types.ts","../src/resources/auth.ts","../src/resources/connections.ts","../src/resources/discovery.ts","../src/core/pagination.ts","../src/resources/entities.ts","../src/resources/entity-types.ts","../src/resources/approvals.ts","../src/streaming/execution-progress.ts","../src/resources/executions.ts","../src/resources/knowledge.ts","../src/resources/projects.ts","../src/resources/queue-items.ts","../src/resources/queues.ts","../src/resources/runs.ts","../src/resources/scorecards.ts","../src/resources/tasks.ts","../src/resources/variables.ts","../src/resources/workflow-apps.ts","../src/resources/workflows.ts","../src/client.ts","../src/auth/token-store.ts","../src/auth/create-client.ts"],"names":["generateMessageId"],"mappings":"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","file":"index.js","sourcesContent":["/** Prefix of Lunnoa Automate machine (service-account) API keys. */\nexport const API_KEY_PREFIX = 'lna_';\n\n/** Returns true when running inside a browser (or browser-like) environment. */\nexport function isBrowserEnvironment(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * API keys are server-to-server credentials. Shipping one to a browser exposes\n * the whole workspace the key is scoped to, so the SDK refuses outright.\n *\n * Browser apps must authenticate end users with a Lunnoa user JWT (Pattern B)\n * or proxy through their own backend which holds the key (Pattern A / BFF).\n */\nexport function assertApiKeyAllowedInEnvironment(apiKey: string): void {\n if (isBrowserEnvironment()) {\n throw new Error(\n 'Refusing to use a Lunnoa API key (lna_...) in a browser environment. ' +\n 'API keys are server-side credentials: anyone opening dev tools could read the key ' +\n 'and act as the service account across its whole workspace. ' +\n 'Either call the Lunnoa API from your own backend which holds the key (backend-for-frontend pattern), ' +\n 'or authenticate the end user with a Lunnoa user JWT and pass it as `accessToken`.',\n );\n }\n if (!apiKey.startsWith(API_KEY_PREFIX)) {\n throw new Error(\n `Invalid Lunnoa API key: expected it to start with \"${API_KEY_PREFIX}\". ` +\n 'If you are passing a user JWT, use the `accessToken` option instead of `apiKey`.',\n );\n }\n}\n","/** Error thrown for every non-2xx response from a Lunnoa Automate deployment. */\nexport class LunnoaApiError extends Error {\n /** HTTP status code of the failed response. */\n readonly status: number;\n /** Parsed JSON error body when the server returned one, otherwise the raw text. */\n readonly body: unknown;\n /** HTTP method of the failed request. */\n readonly method: string;\n /** Path of the failed request (without the base URL). */\n readonly path: string;\n\n constructor(args: {\n status: number;\n body: unknown;\n method: string;\n path: string;\n }) {\n const detail = extractMessage(args.body);\n super(\n `Lunnoa API request failed: ${args.method} ${args.path} → ${args.status}${detail ? ` (${detail})` : ''}`,\n );\n this.name = 'LunnoaApiError';\n this.status = args.status;\n this.body = args.body;\n this.method = args.method;\n this.path = args.path;\n }\n\n /** True for 401 responses (missing, revoked, or expired credential). */\n get isUnauthorized(): boolean {\n return this.status === 401;\n }\n\n /** True for 403 responses (missing permission or feature not licensed). */\n get isForbidden(): boolean {\n return this.status === 403;\n }\n\n /** True for 404 responses. */\n get isNotFound(): boolean {\n return this.status === 404;\n }\n\n /** True for 429 responses (rate limited). */\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === 'object') {\n const record = body as Record<string, unknown>;\n const candidate = record.message ?? record.error;\n if (typeof candidate === 'string') {\n return candidate;\n }\n if (Array.isArray(candidate)) {\n return candidate.filter((m) => typeof m === 'string').join('; ');\n }\n }\n if (typeof body === 'string' && body.length > 0 && body.length < 300) {\n return body;\n }\n return undefined;\n}\n","import { API_KEY_PREFIX, assertApiKeyAllowedInEnvironment } from './auth';\nimport { LunnoaApiError } from './errors';\nimport type { TokenStore } from '../auth/token-store';\n\nexport type FetchLike = (\n input: string | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface LunnoaClientOptions {\n /**\n * Base URL of the Lunnoa Automate deployment, e.g. `https://lunnoa.acme.example`.\n * Paths are appended under `/api/*`.\n */\n baseUrl: string;\n /**\n * Server-side machine credential (`lna_...`). Never usable in browsers —\n * the constructor throws if one is supplied while `window` exists.\n */\n apiKey?: string;\n /**\n * User JWT obtained from login / SSO. The supported credential for browser\n * applications. May be a function so refreshed tokens are picked up per request.\n *\n * Prefer {@link tokenStore} for Pattern B so login/refresh can persist tokens\n * and optionally auto-refresh on 401.\n */\n accessToken?: string | (() => string | Promise<string>);\n /**\n * Optional JWT store for Pattern B. When set, authenticated requests read\n * the access token from the store. Login / refresh helpers write back into it.\n */\n tokenStore?: TokenStore;\n /**\n * When true (default if `tokenStore` is set), a 401 triggers one\n * `POST /api/auth/refresh-token` attempt using the stored refresh token,\n * then retries the original request.\n */\n autoRefresh?: boolean;\n /** Custom fetch implementation (testing, polyfills, interceptors). */\n fetch?: FetchLike;\n /** Extra headers sent with every request. */\n headers?: Record<string, string>;\n}\n\nexport type QueryValue = string | number | boolean | undefined | null;\n\nexport interface RequestOptions {\n query?: Record<string, QueryValue>;\n body?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n /**\n * Return the raw Response instead of parsing JSON. Used by the streaming\n * module and endpoints that may legitimately return 204.\n */\n raw?: boolean;\n /**\n * Skip the Authorization header. Used for public auth endpoints\n * (login, refresh, SSO providers).\n */\n skipAuth?: boolean;\n /** Internal: set after an auto-refresh retry so we do not loop. */\n _retriedAfterRefresh?: boolean;\n}\n\n/**\n * Minimal typed HTTP layer shared by every resource namespace. Handles auth\n * header resolution, query serialisation, JSON parsing, and error mapping.\n */\nexport class HttpClient {\n readonly baseUrl: string;\n readonly tokenStore?: TokenStore;\n /** Underlying fetch (shared with AI SDK transports when needed). */\n readonly fetch: FetchLike;\n private readonly apiKey?: string;\n private readonly accessToken?: string | (() => string | Promise<string>);\n private readonly autoRefresh: boolean;\n private readonly defaultHeaders: Record<string, string>;\n private refreshInFlight: Promise<boolean> | null = null;\n\n constructor(options: LunnoaClientOptions) {\n if (!options.baseUrl) {\n throw new Error('LunnoaClient requires a baseUrl.');\n }\n if (!options.apiKey && !options.accessToken && !options.tokenStore) {\n throw new Error(\n 'LunnoaClient requires an apiKey (server-side), an accessToken (user JWT), or a tokenStore (Pattern B).',\n );\n }\n if (options.apiKey) {\n assertApiKeyAllowedInEnvironment(options.apiKey);\n }\n if (\n typeof options.accessToken === 'string' &&\n options.accessToken.startsWith(API_KEY_PREFIX)\n ) {\n throw new Error(\n 'The accessToken option received an lna_ API key. API keys must be passed as `apiKey` ' +\n '(and never in a browser); accessToken is for user JWTs only.',\n );\n }\n\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.accessToken = options.accessToken;\n this.tokenStore = options.tokenStore;\n this.autoRefresh =\n options.autoRefresh ?? Boolean(options.tokenStore && !options.apiKey);\n this.fetch =\n options.fetch ?? (globalThis.fetch.bind(globalThis) as FetchLike);\n this.defaultHeaders = options.headers ?? {};\n }\n\n async resolveAuthHeader(): Promise<string> {\n if (this.apiKey) {\n return `Bearer ${this.apiKey}`;\n }\n if (this.tokenStore) {\n const fromStore = await this.tokenStore.getAccessToken();\n if (!fromStore) {\n throw new Error(\n 'No access token in the token store. Call lunnoa.auth.login(...) first, ' +\n 'or seed the store with setTokens / createMemoryTokenStore({ accessToken }).',\n );\n }\n return `Bearer ${fromStore}`;\n }\n const token =\n typeof this.accessToken === 'function'\n ? await this.accessToken()\n : this.accessToken;\n if (!token) {\n throw new Error('accessToken resolved to an empty value.');\n }\n return `Bearer ${token}`;\n }\n\n buildUrl(path: string, query?: Record<string, QueryValue>): string {\n const url = new URL(this.baseUrl + path);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n async request<T>(\n method: string,\n path: string,\n options: RequestOptions & { raw: true },\n ): Promise<Response>;\n async request<T>(\n method: string,\n path: string,\n options?: RequestOptions,\n ): Promise<T>;\n async request<T>(\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T | Response> {\n const url = this.buildUrl(path, options.query);\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...options.headers,\n };\n\n if (!options.skipAuth) {\n headers.Authorization = await this.resolveAuthHeader();\n }\n\n const init: RequestInit = { method, headers, signal: options.signal };\n if (options.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(options.body);\n }\n\n const response = await this.fetch(url, init);\n\n if (\n !response.ok &&\n response.status === 401 &&\n !options.skipAuth &&\n !options._retriedAfterRefresh &&\n this.autoRefresh &&\n this.tokenStore &&\n !this.apiKey\n ) {\n const refreshed = await this.tryRefreshAccessToken();\n if (refreshed) {\n return this.request<T>(method, path, {\n ...options,\n _retriedAfterRefresh: true,\n });\n }\n }\n\n if (!response.ok) {\n const body = await parseBodySafely(response);\n throw new LunnoaApiError({\n status: response.status,\n body,\n method,\n path,\n });\n }\n\n if (options.raw) {\n return response;\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await parseBodySafely(response)) as T;\n }\n\n get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, options);\n }\n\n post<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, options);\n }\n\n patch<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, options);\n }\n\n put<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, options);\n }\n\n delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, options);\n }\n\n /**\n * Single-flight refresh using the token store. Returns false when refresh\n * is impossible or fails (store is cleared on failure).\n */\n async tryRefreshAccessToken(): Promise<boolean> {\n if (!this.tokenStore) {\n return false;\n }\n if (!this.refreshInFlight) {\n this.refreshInFlight = this.performRefresh().finally(() => {\n this.refreshInFlight = null;\n });\n }\n return this.refreshInFlight;\n }\n\n private async performRefresh(): Promise<boolean> {\n const refreshToken = await this.tokenStore!.getRefreshToken();\n if (!refreshToken) {\n return false;\n }\n\n try {\n const url = this.buildUrl('/api/auth/refresh-token');\n const response = await this.fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken }),\n });\n if (!response.ok) {\n await this.tokenStore!.clear();\n return false;\n }\n const body = (await parseBodySafely(response)) as {\n access_token?: string;\n };\n if (!body?.access_token) {\n await this.tokenStore!.clear();\n return false;\n }\n await this.tokenStore!.setTokens({ accessToken: body.access_token });\n return true;\n } catch {\n await this.tokenStore!.clear();\n return false;\n }\n }\n}\n\nasync function parseBodySafely(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) {\n return undefined;\n }\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","/**\n * Minimal Server-Sent Events parser.\n *\n * Takes the byte stream of a `text/event-stream` response and yields the\n * `data:` payload of each event. Comment lines (keep-alive `:` pings sent by\n * the Lunnoa server every 15s) and other fields are ignored. Multi-line\n * `data:` fields are joined with `\\n` per the SSE specification.\n */\nexport async function* parseSseStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<string, void, undefined> {\n for await (const event of parseSseEvents(stream)) {\n if (event.data !== null) {\n yield event.data;\n }\n }\n}\n\nexport interface SseEvent {\n /** SSE `event:` field, or `\"message\"` when omitted. */\n event: string;\n /** Joined `data:` payload, or null when the frame had no data lines. */\n data: string | null;\n}\n\n/**\n * Like {@link parseSseStream}, but preserves the SSE event name.\n * Used by execution progress streams (`execution.progress`, `loop.progress`, …).\n */\nexport async function* parseSseEvents(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseEvent, void, undefined> {\n const reader = stream.getReader();\n const decoder = new TextDecoder('utf-8', { fatal: false });\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n\n // Events are separated by a blank line. Normalise CRLF first.\n buffer = buffer.replace(/\\r\\n/g, '\\n');\n let boundary = buffer.indexOf('\\n\\n');\n while (boundary !== -1) {\n const rawEvent = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf('\\n\\n');\n\n const parsed = extractEvent(rawEvent);\n if (parsed.data !== null || parsed.event !== 'message') {\n yield parsed;\n }\n }\n }\n\n // Flush a trailing event without a final blank line (lenient).\n const remaining = buffer.trim();\n if (remaining) {\n const parsed = extractEvent(remaining);\n if (parsed.data !== null || parsed.event !== 'message') {\n yield parsed;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction extractEvent(rawEvent: string): SseEvent {\n const dataLines: string[] = [];\n let eventName = 'message';\n\n for (const line of rawEvent.split('\\n')) {\n if (line.startsWith(':')) {\n continue; // SSE comment (keep-alive)\n }\n if (line.startsWith('event:')) {\n let value = line.slice('event:'.length);\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n if (value) {\n eventName = value;\n }\n continue;\n }\n if (line.startsWith('data:')) {\n let value = line.slice('data:'.length);\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n dataLines.push(value);\n }\n }\n\n return {\n event: eventName,\n data: dataLines.length === 0 ? null : dataLines.join('\\n'),\n };\n}\n","import type { UIMessage, UIMessageChunk } from 'ai';\n\nimport type { HttpClient } from '../core/http';\nimport { parseSseStream } from './sse';\n\nexport type ChatMode = 'builder' | 'preview';\n\nexport interface StreamMessageOptions {\n /** Agent chat mode; defaults to the server default (`builder`). */\n chatMode?: ChatMode;\n /** Optional image attachment forwarded with this turn. */\n data?: { imageUrl?: string };\n /**\n * Answer to an ask-before-sending personal-data prompt.\n * Applies to this message only.\n */\n piiResolution?: 'anonymize' | 'fallback';\n /** Abort the stream (closes the HTTP connection; the run keeps going server-side — call `stop` to cancel it). */\n signal?: AbortSignal;\n}\n\nexport interface StopStreamOptions {\n /**\n * Partial assistant message (AI SDK UIMessage) received so far; the server\n * persists it so the partial turn is not lost.\n */\n assistantMessage?: UIMessage;\n}\n\n/**\n * An in-flight agent chat turn, exposed as an async iterable of AI SDK\n * `UIMessageChunk`s (`text-delta`, `tool-*`, `finish`, ...).\n *\n * ```ts\n * const stream = await client.agentChat.streamMessage(agentId, taskId, message);\n * for await (const chunk of stream) {\n * if (chunk.type === 'text-delta') process.stdout.write(chunk.delta);\n * }\n * ```\n *\n * Use {@link AgentChatStream.toUIMessageStream} with the AI SDK's\n * `readUIMessageStream` to consume assembled `UIMessage` snapshots instead of\n * raw chunks.\n */\nexport class AgentChatStream implements AsyncIterable<UIMessageChunk> {\n /**\n * Server run id of this turn (`X-Task-Run-Id` response header), when\n * provided. Useful for diagnostics.\n */\n readonly runId: string | null;\n\n private consumed = false;\n\n constructor(\n private readonly response: Response,\n private readonly options?: { signal?: AbortSignal },\n ) {\n this.runId = response.headers.get('X-Task-Run-Id');\n }\n\n [Symbol.asyncIterator](): AsyncGenerator<UIMessageChunk, void, undefined> {\n return this.chunks();\n }\n\n async *chunks(): AsyncGenerator<UIMessageChunk, void, undefined> {\n if (this.consumed) {\n throw new Error('This AgentChatStream has already been consumed.');\n }\n this.consumed = true;\n\n const body = this.response.body;\n if (!body) {\n return;\n }\n\n for await (const data of parseSseStream(body)) {\n if (this.options?.signal?.aborted) {\n return;\n }\n if (data === '[DONE]') {\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n continue; // Skip malformed events rather than killing the stream.\n }\n if (parsed && typeof parsed === 'object' && 'type' in parsed) {\n yield parsed as UIMessageChunk;\n }\n }\n }\n\n /**\n * The same chunks as a web `ReadableStream`, ready for the AI SDK's\n * `readUIMessageStream({ stream })` to assemble into `UIMessage` snapshots.\n */\n toUIMessageStream(): ReadableStream<UIMessageChunk> {\n const iterator = this.chunks();\n return new ReadableStream<UIMessageChunk>({\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n async cancel() {\n await iterator.return();\n },\n });\n }\n\n /** Collects the full text of the turn (concatenated `text-delta` chunks). */\n async text(): Promise<string> {\n let text = '';\n for await (const chunk of this.chunks()) {\n if (chunk.type === 'text-delta' && typeof chunk.delta === 'string') {\n text += chunk.delta;\n }\n }\n return text;\n }\n}\n\n/**\n * Hand-written client for the Agent Runtime SSE endpoints\n * (`POST/GET /api/agents/:agentId/tasks/:taskId/stream-message` and `/stop`).\n * Code generators handle SSE poorly, so this module wraps the wire protocol\n * the bundled UI uses (AI SDK UIMessage chunks, SSE-framed, resumable).\n */\nexport class AgentChatClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Sends a user message to an agent task and streams the assistant turn.\n * Creates the task row when `taskId` does not exist yet (client-generated\n * UUIDs are supported, mirroring the bundled UI).\n *\n * `message` may be a plain string (wrapped into a UIMessage) or a full AI\n * SDK `UIMessage`.\n */\n async streamMessage(\n agentId: string,\n taskId: string,\n message: string | UIMessage,\n options: StreamMessageOptions = {},\n ): Promise<AgentChatStream> {\n const uiMessage: UIMessage =\n typeof message === 'string'\n ? {\n id: generateMessageId(),\n role: 'user',\n parts: [{ type: 'text', text: message }],\n }\n : message;\n\n const response = await this.http.request<Response>(\n 'POST',\n `/api/agents/${agentId}/tasks/${taskId}/stream-message`,\n {\n raw: true,\n signal: options.signal,\n headers: { Accept: 'text/event-stream' },\n body: messageTaskBody(uiMessage, options),\n },\n );\n\n return new AgentChatStream(response, { signal: options.signal });\n }\n\n /**\n * Reattaches to an in-flight agent turn after a disconnect (the resumable\n * stream replays from the beginning of the turn). Returns `null` when\n * there is no active stream to resume (server responds 204).\n */\n async resumeStream(\n agentId: string,\n taskId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<AgentChatStream | null> {\n const response = await this.http.request<Response>(\n 'GET',\n `/api/agents/${agentId}/tasks/${taskId}/stream-message`,\n {\n raw: true,\n signal: options.signal,\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (response.status === 204) {\n return null;\n }\n return new AgentChatStream(response, { signal: options.signal });\n }\n\n /**\n * Requests cancellation of the active agent turn for a task. Idempotent:\n * succeeds even when no stream is active. Optionally persists the partial\n * assistant message received so far.\n */\n async stop(\n agentId: string,\n taskId: string,\n options: StopStreamOptions = {},\n ): Promise<{ ok: boolean }> {\n return this.http.post<{ ok: boolean }>(\n `/api/agents/${agentId}/tasks/${taskId}/stream-message/stop`,\n {\n body: options.assistantMessage\n ? { assistantMessage: options.assistantMessage }\n : {},\n },\n );\n }\n}\n\nexport function messageTaskBody(\n message: UIMessage,\n options: Omit<StreamMessageOptions, 'signal'> = {},\n) {\n return {\n messages: [message],\n ...(options.chatMode ? { chatMode: options.chatMode } : {}),\n ...(options.data ? { data: options.data } : {}),\n ...(options.piiResolution ? { piiResolution: options.piiResolution } : {}),\n };\n}\n\nfunction generateMessageId(): string {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n","import type { HttpClient } from '../core/http';\nimport type { Execution, RunActionResult } from '../types';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface RunActionOptions {\n /** Workflow app id (catalogue slug), e.g. `http`, `gmail`. */\n appId: string;\n /** Action id within the app, e.g. `http_action_send-request`. */\n actionId: string;\n /**\n * Connection instance UUID (`Connection.id`). Required when the action needs\n * a connection and the workspace has more than one for the app. When omitted\n * and exactly one connection exists, the platform uses that connection.\n */\n connectionId?: string;\n /**\n * Project UUID for variable/project scoping. Required when the workspace has\n * more than one project.\n */\n projectId?: string;\n /** Action input fields (keys from the action `inputConfig`). */\n input?: Record<string, unknown>;\n /** Optional display name for the ad-hoc Execution. */\n name?: string;\n}\n\nexport class ActionsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /**\n * Run a single catalogue action as a one-step ad-hoc Execution (`source: SDK`).\n *\n * The platform runs the action synchronously and returns the execution id\n * plus status/output/executionPath. You can also poll\n * {@link ExecutionsResource.get} / {@link ExecutionsResource.waitUntilFinished}\n * with the returned id.\n *\n * Discover `appId` / `actionId` / `inputConfig` via `workflowApps.list()`.\n */\n run(options: RunActionOptions): Promise<RunActionResult> {\n return this.http.post<RunActionResult>('/api/actions/run', {\n body: options,\n });\n }\n\n /**\n * Convenience: run the action and wait until the Execution reaches a\n * terminal status (or pauses in `NEEDS_INPUT`). Prefer {@link run} when the\n * synchronous response is enough.\n */\n async runAndWait(\n options: RunActionOptions,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.run(options);\n return this.executions.waitUntilFinished(id, {\n ...waitOptions,\n expansion: [\n 'executionPath',\n 'source',\n ...(waitOptions?.expansion ?? []),\n ],\n });\n }\n\n /**\n * Thin discovery helper: find one action definition from `workflowApps.list()`.\n * Prefer calling `workflowApps.list()` once and caching when looking up many\n * actions.\n */\n async get(\n appId: string,\n actionId: string,\n ): Promise<Record<string, unknown> | undefined> {\n const apps = await this.http.get<\n Array<{\n id?: string;\n actions?: Array<Record<string, unknown>>;\n }>\n >('/api/workflow-apps');\n const app = apps.find((a) => a.id === appId);\n return app?.actions?.find((action) => action.id === actionId);\n }\n}\n","/**\n * Pure typed definition factories for local workflow/agent authoring.\n * These do not call the network. Deploy with the CLI; run ad-hoc with `runs.start`.\n *\n * Not the same as `@lunnoa/toolkit` `createAction` / `createApp` (in-platform apps).\n */\n\nexport const DEFINE_KINDS = {\n connection: 'connection',\n aiConnection: 'aiConnection',\n action: 'action',\n workflow: 'workflow',\n agent: 'agent',\n entityType: 'entityType',\n} as const;\n\nexport type DefineKind = (typeof DEFINE_KINDS)[keyof typeof DEFINE_KINDS];\n\n/** Ref to an existing app Connection (credentials stay on Lunnoa). */\nexport interface ConnectionDefinition {\n kind: typeof DEFINE_KINDS.connection;\n /** Connection instance UUID. Optional when the platform can resolve sole/default. */\n id?: string;\n}\n\n/** Ref to an existing AiProviderConnection. */\nexport interface AiConnectionDefinition {\n kind: typeof DEFINE_KINDS.aiConnection;\n /** AiProviderConnection UUID. Optional when platform AI defaults apply. */\n id?: string;\n}\n\nexport interface ActionDefinition {\n kind: typeof DEFINE_KINDS.action;\n /**\n * Catalogue action id, e.g. `http_action_send-request`.\n * Optionally `appId.actionId` (first segment before `.` used as appId when\n * `appId` is omitted and the id contains a dot that is not part of the\n * usual `_action_` pattern).\n */\n id: string;\n /** Workflow app id. Inferred from `id` when it matches `{app}_action_…`. */\n appId?: string;\n /** Optional Connection ref. Omit to let the platform resolve. */\n connection?: ConnectionDefinition;\n /** Default input merged at run/deploy time. */\n input?: Record<string, unknown>;\n name?: string;\n description?: string;\n}\n\nexport interface WorkflowStepDefinition {\n /** Action definition (or inline action-shaped object). */\n use: ActionDefinition;\n /** Per-step input overrides. */\n input?: Record<string, unknown>;\n name?: string;\n}\n\nexport interface WorkflowDefinition {\n kind: typeof DEFINE_KINDS.workflow;\n /** Stable project-scoped slug (upsert key). */\n slug: string;\n name?: string;\n description?: string;\n isActive?: boolean;\n /** Linear steps (v1; no branches). */\n steps: WorkflowStepDefinition[];\n}\n\nexport type AgentToolDefinition =\n | ActionDefinition\n | WorkflowDefinition\n | { use: ActionDefinition | WorkflowDefinition };\n\nexport interface AgentDefinition {\n kind: typeof DEFINE_KINDS.agent;\n /** Stable project-scoped slug (upsert key). */\n slug: string;\n name?: string;\n description?: string;\n /** Selected model id on the AI provider connection. */\n model: string;\n instructions: string;\n aiConnection?: AiConnectionDefinition;\n /** App Connection refs the agent may use for tools. */\n connections?: ConnectionDefinition[];\n /** Action and/or workflow tool refs. */\n tools?: AgentToolDefinition[];\n}\n\nexport function defineConnection(\n config: Omit<ConnectionDefinition, 'kind'> = {},\n): ConnectionDefinition {\n return { kind: DEFINE_KINDS.connection, ...config };\n}\n\nexport function defineAiConnection(\n config: Omit<AiConnectionDefinition, 'kind'> = {},\n): AiConnectionDefinition {\n return { kind: DEFINE_KINDS.aiConnection, ...config };\n}\n\nexport function defineAction(\n config: Omit<ActionDefinition, 'kind'>,\n): ActionDefinition {\n if (!config.id?.trim()) {\n throw new Error('defineAction requires id (catalogue action id)');\n }\n return { kind: DEFINE_KINDS.action, ...config };\n}\n\nexport function defineWorkflow(\n config: Omit<WorkflowDefinition, 'kind'>,\n): WorkflowDefinition {\n if (!config.slug?.trim()) {\n throw new Error('defineWorkflow requires slug');\n }\n if (!config.steps?.length) {\n throw new Error('defineWorkflow requires at least one step');\n }\n return { kind: DEFINE_KINDS.workflow, ...config };\n}\n\nexport function defineAgent(\n config: Omit<AgentDefinition, 'kind'>,\n): AgentDefinition {\n if (!config.slug?.trim()) {\n throw new Error('defineAgent requires slug');\n }\n if (!config.model?.trim()) {\n throw new Error('defineAgent requires model');\n }\n if (config.instructions == null) {\n throw new Error('defineAgent requires instructions');\n }\n return { kind: DEFINE_KINDS.agent, ...config };\n}\n\nexport interface EntityTypeDefinition {\n kind: typeof DEFINE_KINDS.entityType;\n /** Stable workspace-scoped slug (upsert key). */\n slug: string;\n name?: string;\n namePlural?: string;\n description?: string;\n icon?: string;\n color?: string;\n /** Field definitions grouped into sections (same contract as Adminspace). */\n attributeSchema: Record<string, unknown>;\n stateSchema?: Record<string, unknown> | null;\n isEnabled?: boolean;\n /**\n * When false (default), entity writes reject undeclared attribute keys.\n * Reserved key `extensions` is always allowed as a JSON object.\n */\n allowUnknownAttributes?: boolean;\n}\n\nexport function defineEntityType(\n config: Omit<EntityTypeDefinition, 'kind'>,\n): EntityTypeDefinition {\n if (!config.slug?.trim()) {\n throw new Error('defineEntityType requires slug');\n }\n if (\n !config.attributeSchema ||\n typeof config.attributeSchema !== 'object' ||\n Array.isArray(config.attributeSchema)\n ) {\n throw new Error('defineEntityType requires attributeSchema object');\n }\n return {\n kind: DEFINE_KINDS.entityType,\n allowUnknownAttributes: false,\n ...config,\n };\n}\n\n/** Infer appId from catalogue action ids like `http_action_send-request`. */\nexport function resolveActionAppId(action: ActionDefinition): string {\n if (action.appId?.trim()) {\n return action.appId.trim();\n }\n const id = action.id.trim();\n const actionMarker = '_action_';\n const markerIndex = id.indexOf(actionMarker);\n if (markerIndex > 0) {\n return id.slice(0, markerIndex);\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(0, dot);\n }\n throw new Error(\n `Cannot infer appId for action \"${id}\". Pass appId explicitly.`,\n );\n}\n\nexport function resolveActionId(action: ActionDefinition): string {\n const id = action.id.trim();\n const appId = action.appId?.trim();\n if (appId && id.startsWith(`${appId}.`)) {\n return id.slice(appId.length + 1);\n }\n const marker = '_action_';\n if (id.includes(marker)) {\n return id;\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(dot + 1);\n }\n return id;\n}\n","import type { QueryValue } from '../core/http';\n\n/**\n * Standard list-query conventions shared by most Lunnoa list endpoints:\n *\n * - `expansion` — comma-separated field names to include beyond the defaults\n * - `filterBy` — comma-separated `key:value` pairs\n * - `includeType` — comma-separated inclusion flags (e.g. `all`, `internal`)\n */\nexport interface ListQueryOptions {\n expansion?: string | string[];\n filterBy?: string | Record<string, string>;\n includeType?: string | string[];\n}\n\nexport function serializeListQuery(\n options: ListQueryOptions = {},\n): Record<string, QueryValue> {\n return {\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy(options.filterBy),\n includeType: serializeCsv(options.includeType),\n };\n}\n\nexport function serializeCsv(\n value: string | string[] | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return Array.isArray(value) ? value.join(',') : value;\n}\n\nexport function serializeFilterBy(\n value: string | Record<string, string> | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === 'string') {\n return value;\n }\n return Object.entries(value)\n .map(([key, filterValue]) => `${key}:${filterValue}`)\n .join(',');\n}\n","import type { HttpClient } from '../core/http';\nimport type { Agent } from '../types';\nimport type {\n ActionDefinition,\n AgentDefinition,\n AgentToolDefinition,\n WorkflowDefinition,\n} from '../define';\nimport {\n DEFINE_KINDS,\n resolveActionAppId,\n resolveActionId,\n} from '../define';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport interface UpsertAgentToolInput {\n appId: string;\n actionId: string;\n connectionId?: string;\n name?: string;\n description?: string;\n input?: Record<string, unknown>;\n}\n\nexport interface UpsertAgentBySlugInput {\n slug: string;\n name?: string;\n description?: string;\n instructions: string;\n model: string;\n aiConnectionId?: string;\n connectionIds?: string[];\n workflowIds?: string[];\n tools?: UpsertAgentToolInput[];\n managedByCode?: boolean;\n}\n\nfunction unwrapTool(\n tool: AgentToolDefinition,\n): ActionDefinition | WorkflowDefinition {\n if ('use' in tool && tool.use) {\n return tool.use;\n }\n return tool as ActionDefinition | WorkflowDefinition;\n}\n\nexport function agentDefinitionToUpsert(\n def: AgentDefinition,\n options?: { workflowIds?: string[] },\n): UpsertAgentBySlugInput {\n const tools: UpsertAgentToolInput[] = [];\n const workflowIds = [...(options?.workflowIds ?? [])];\n\n for (const tool of def.tools ?? []) {\n const unwrapped = unwrapTool(tool);\n if (unwrapped.kind === DEFINE_KINDS.workflow) {\n // Workflow tools are linked via AgentWorkflow (workflowIds), not tools[].\n // Callers should deploy workflows first and pass resolved UUIDs.\n continue;\n }\n if (unwrapped.kind === DEFINE_KINDS.action) {\n tools.push({\n appId: resolveActionAppId(unwrapped),\n actionId: resolveActionId(unwrapped),\n connectionId: unwrapped.connection?.id,\n name: unwrapped.name,\n description: unwrapped.description,\n input: unwrapped.input,\n });\n }\n }\n\n return {\n slug: def.slug,\n name: def.name,\n description: def.description,\n instructions: def.instructions,\n model: def.model,\n aiConnectionId: def.aiConnection?.id,\n connectionIds: def.connections\n ?.map((c) => c.id)\n .filter((id): id is string => Boolean(id)),\n workflowIds: workflowIds.length ? workflowIds : undefined,\n tools,\n managedByCode: true,\n };\n}\n\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists agents visible to the caller in the current workspace. */\n list(options?: ListQueryOptions): Promise<Agent[]> {\n return this.http.get<Agent[]>('/api/agents', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single agent. */\n get(agentId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Agent> {\n return this.http.get<Agent>(`/api/agents/${agentId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Upsert an agent by project-scoped slug.\n * Prefer the CLI (`npx @lunnoa/client agents deploy`) for happy-path deploy.\n */\n upsertBySlug(\n projectId: string,\n body: UpsertAgentBySlugInput | AgentDefinition,\n options?: { workflowIds?: string[] },\n ): Promise<Agent> {\n const payload =\n 'kind' in body && body.kind === 'agent'\n ? agentDefinitionToUpsert(body, options)\n : body;\n return this.http.post<Agent>(`/api/projects/${projectId}/agents/upsert`, {\n body: payload,\n });\n }\n}\n","/**\n * Tokens returned by login / 2FA / login-with-token.\n * Mapped from the wire format (`access_token` / `refresh_token`).\n */\nexport interface AuthTokens {\n accessToken: string;\n refreshToken: string;\n}\n\n/** Successful password login without 2FA, or after 2FA / token exchange. */\nexport type LoginSuccess = AuthTokens;\n\n/**\n * Password login when the user has 2FA enabled.\n * Call {@link AuthResource.verify2faLogin} with the session token and TOTP/backup code.\n */\nexport interface LoginRequires2FA {\n requires2FA: true;\n sessionToken: string;\n}\n\nexport type LoginResult = LoginSuccess | LoginRequires2FA;\n\nexport function isLoginRequires2FA(\n result: LoginResult,\n): result is LoginRequires2FA {\n return 'requires2FA' in result && result.requires2FA === true;\n}\n\n/** Wire payload from `POST /api/auth/login` (and related). */\nexport type LoginWireResponse =\n | {\n access_token: string;\n refresh_token: string;\n }\n | {\n requires2FA: true;\n sessionToken: string;\n };\n\n/** Wire payload from `POST /api/auth/refresh-token`. */\nexport interface RefreshWireResponse {\n access_token: string;\n refresh_token?: string;\n}\n\n/** Public SSO discovery from `GET /api/auth/sso/providers`. */\nexport interface SsoProvidersResponse {\n providers: SsoProviderSummary[];\n passwordAuthDisabled: boolean;\n googleAuthDisabled: boolean;\n ssoEnforced: boolean;\n}\n\nexport interface SsoProviderSummary {\n id: string;\n name: string;\n buttonLabel: string | null;\n}\n\n/**\n * Current user from `GET /api/users/me`.\n * Password is never returned.\n */\nexport interface CurrentUser {\n id: string;\n email: string;\n name: string | null;\n createdAt?: string;\n updatedAt?: string;\n rootProfileImageUrl?: string | null;\n emailVerifiedAt?: string | null;\n toursCompleted?: unknown;\n hasPassword?: boolean;\n ssoProviders?: string[];\n}\n\nexport function mapWireTokens(wire: {\n access_token: string;\n refresh_token?: string;\n}): { accessToken: string; refreshToken?: string } {\n return {\n accessToken: wire.access_token,\n ...(wire.refresh_token !== undefined\n ? { refreshToken: wire.refresh_token }\n : {}),\n };\n}\n\nexport function mapLoginWire(wire: LoginWireResponse): LoginResult {\n if ('requires2FA' in wire && wire.requires2FA) {\n return {\n requires2FA: true,\n sessionToken: wire.sessionToken,\n };\n }\n const tokens = wire as { access_token: string; refresh_token: string };\n return {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n };\n}\n","import {\n isLoginRequires2FA,\n mapLoginWire,\n mapWireTokens,\n type AuthTokens,\n type CurrentUser,\n type LoginResult,\n type LoginWireResponse,\n type RefreshWireResponse,\n type SsoProvidersResponse,\n} from '../auth/types';\nimport type { TokenStore } from '../auth/token-store';\nimport type { HttpClient } from '../core/http';\n\n/**\n * Login, refresh, SSO discovery, and session helpers for Pattern B.\n *\n * Password login, token exchange, refresh, and SSO provider listing are\n * **public** endpoints (no Bearer). `me()` requires a user JWT.\n *\n * There is no server logout endpoint: {@link AuthResource.logout} only clears\n * the configured {@link TokenStore}.\n */\nexport class AuthResource {\n readonly sso: SsoAuthResource;\n\n constructor(\n private readonly http: HttpClient,\n private readonly tokenStore?: TokenStore,\n ) {\n this.sso = new SsoAuthResource(http);\n }\n\n /**\n * `POST /api/auth/login`\n *\n * On success without 2FA, tokens are written to the token store (when set).\n * When 2FA is required, returns `{ requires2FA, sessionToken }` and does not\n * store tokens until {@link verify2faLogin} succeeds.\n */\n async login(input: {\n email: string;\n password: string;\n }): Promise<LoginResult> {\n const wire = await this.http.post<LoginWireResponse>('/api/auth/login', {\n body: { email: input.email, password: input.password },\n skipAuth: true,\n });\n const result = mapLoginWire(wire);\n if (!isLoginRequires2FA(result)) {\n await this.persistTokens(result);\n }\n return result;\n }\n\n /**\n * `POST /api/auth/2fa/verify-login`\n *\n * Completes password login after TOTP or backup-code verification.\n */\n async verify2faLogin(input: {\n sessionToken: string;\n token: string;\n }): Promise<AuthTokens> {\n const wire = await this.http.post<LoginWireResponse>(\n '/api/auth/2fa/verify-login',\n {\n body: {\n sessionToken: input.sessionToken,\n token: input.token,\n },\n skipAuth: true,\n },\n );\n const result = mapLoginWire(wire);\n if (isLoginRequires2FA(result)) {\n throw new Error(\n 'Unexpected 2FA challenge after verify2faLogin; expected access and refresh tokens.',\n );\n }\n await this.persistTokens(result);\n return result;\n }\n\n /**\n * `POST /api/auth/login-with-token`\n *\n * Exchanges a short-lived hidden JWT (SSO callback or email verification)\n * for access and refresh tokens.\n */\n async loginWithToken(input: { token: string }): Promise<AuthTokens> {\n const wire = await this.http.post<{\n access_token: string;\n refresh_token: string;\n }>('/api/auth/login-with-token', {\n body: { token: input.token },\n skipAuth: true,\n });\n const tokens: AuthTokens = {\n accessToken: wire.access_token,\n refreshToken: wire.refresh_token,\n };\n await this.persistTokens(tokens);\n return tokens;\n }\n\n /**\n * `POST /api/auth/refresh-token`\n *\n * Returns a new access token. The refresh token itself is not rotated.\n * When a token store is configured and `refreshToken` is omitted, the\n * stored refresh token is used.\n */\n async refresh(input?: { refreshToken?: string }): Promise<{\n accessToken: string;\n }> {\n const refreshToken =\n input?.refreshToken ?? (await this.tokenStore?.getRefreshToken()) ?? null;\n if (!refreshToken) {\n throw new Error(\n 'auth.refresh requires a refreshToken argument or a token store that holds one.',\n );\n }\n\n const wire = await this.http.post<RefreshWireResponse>(\n '/api/auth/refresh-token',\n {\n body: { refreshToken },\n skipAuth: true,\n },\n );\n const mapped = mapWireTokens(wire);\n if (this.tokenStore) {\n await this.tokenStore.setTokens({\n accessToken: mapped.accessToken,\n // Keep existing refresh token; refresh responses omit it.\n refreshToken: mapped.refreshToken,\n });\n }\n return { accessToken: mapped.accessToken };\n }\n\n /**\n * `GET /api/users/me` — current user profile for the active JWT.\n */\n me(): Promise<CurrentUser> {\n return this.http.get<CurrentUser>('/api/users/me');\n }\n\n /**\n * Clears tokens from the token store.\n * There is no server-side logout endpoint; access tokens remain valid until expiry\n * (or until the user's `tokensValidFrom` watermark invalidates them).\n */\n async logout(): Promise<void> {\n await this.tokenStore?.clear();\n }\n\n /** True when the token store has an access token (sync stores only wait on Promise). */\n async hasSession(): Promise<boolean> {\n const token = await this.tokenStore?.getAccessToken();\n return Boolean(token);\n }\n\n private async persistTokens(tokens: AuthTokens): Promise<void> {\n if (!this.tokenStore) {\n return;\n }\n await this.tokenStore.setTokens({\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken,\n });\n }\n}\n\n/**\n * SSO discovery and login URL helpers.\n *\n * Browser SSO callbacks redirect to the deployment's `CLIENT_URL/verify-token`,\n * not to an arbitrary custom origin. Custom portals typically complete the\n * exchange with {@link AuthResource.loginWithToken} after receiving the hidden\n * token (for example via a BFF that can see the verify-token page, or by\n * setting `CLIENT_URL` to the custom app).\n */\nexport class SsoAuthResource {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/auth/sso/providers` (public). */\n listProviders(): Promise<SsoProvidersResponse> {\n return this.http.get<SsoProvidersResponse>('/api/auth/sso/providers', {\n skipAuth: true,\n });\n }\n\n /**\n * Absolute URL for `GET /api/auth/sso/:providerId/login`.\n * Navigate the browser here to start the OIDC redirect.\n */\n getLoginUrl(providerId: string): string {\n if (!providerId) {\n throw new Error('sso.getLoginUrl requires a providerId.');\n }\n return this.http.buildUrl(\n `/api/auth/sso/${encodeURIComponent(providerId)}/login`,\n );\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { Connection } from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class ConnectionsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists connections in the workspace. */\n list(options?: ListQueryOptions): Promise<Connection[]> {\n return this.http.get<Connection[]>('/api/connections', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single connection (secrets are never included). */\n get(\n connectionId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Connection> {\n return this.http.get<Connection>(`/api/connections/${connectionId}`, {\n query: serializeListQuery(options),\n });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { EnabledFeatures } from '../types';\n\nexport class DiscoveryResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Returns the deployment's feature flags (storage, vector database, email,\n * SSO, edition gating), letting a custom UI adapt to what is enabled.\n */\n enabledFeatures(): Promise<EnabledFeatures> {\n return this.http.get<EnabledFeatures>('/api/discovery/enabled-features');\n }\n}\n","/** Pagination block returned by page-based list endpoints (entities). */\nexport interface PagePagination {\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n}\n\n/** Pagination block returned by offset-based list endpoints (queue items). */\nexport interface OffsetPagination {\n total: number;\n limit: number;\n offset: number;\n hasMore?: boolean;\n}\n\n/**\n * Iterates every item of a page-based (`page`/`pageSize`) paginated endpoint,\n * fetching pages lazily as the consumer advances.\n */\nexport async function* iteratePages<T>(\n fetchPage: (page: number) => Promise<{ data: T[]; pagination: PagePagination }>,\n): AsyncGenerator<T, void, undefined> {\n let page = 1;\n while (true) {\n const { data, pagination } = await fetchPage(page);\n for (const item of data) {\n yield item;\n }\n if (page >= pagination.totalPages || data.length === 0) {\n return;\n }\n page += 1;\n }\n}\n\n/**\n * Iterates every item of an offset-based (`limit`/`offset`) paginated\n * endpoint, fetching batches lazily as the consumer advances.\n */\nexport async function* iterateOffset<T>(\n fetchBatch: (offset: number) => Promise<{ items: T[]; pagination: OffsetPagination }>,\n): AsyncGenerator<T, void, undefined> {\n let offset = 0;\n while (true) {\n const { items, pagination } = await fetchBatch(offset);\n for (const item of items) {\n yield item;\n }\n offset += items.length;\n const exhausted =\n items.length === 0 ||\n (pagination.hasMore !== undefined\n ? !pagination.hasMore\n : offset >= pagination.total);\n if (exhausted) {\n return;\n }\n }\n}\n","import type { HttpClient, QueryValue } from '../core/http';\nimport { iteratePages } from '../core/pagination';\nimport type {\n ChangeEntityStateInput,\n ChangeEntityStateResult,\n CreateEntityInput,\n Entity,\n EntityStateHistoryEntry,\n EntityStateTransitions,\n ImportEntitiesResult,\n ImportTemplate,\n PaginatedEntities,\n UpdateEntityInput,\n} from '../types';\nimport { serializeCsv } from './common';\n\nexport interface ListEntitiesOptions {\n /** Filter by entity type ID. */\n objectTypeId?: string;\n /** Filter by entity type slug (alternative to objectTypeId). */\n objectTypeSlug?: string;\n /** Filter by a single state. */\n state?: string;\n /** Filter by several states (comma-separated server-side). */\n states?: string[];\n /** Free-text search over entity names. */\n search?: string;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n /** 1-based page number. */\n page?: number;\n /** Items per page (max 100). */\n pageSize?: number;\n /** Fields to expand, e.g. `['attributes', 'objectType']`. */\n expansion?: string | string[];\n}\n\nexport interface ImportEntitiesInput {\n entityTypeId: string;\n columnMappings: Array<{\n sourceColumn: string;\n targetFieldId: string;\n transform?: 'none' | 'date' | 'number' | 'boolean';\n }>;\n rows: Array<Record<string, string>>;\n updateExisting?: boolean;\n matchField?: string;\n}\n\nexport interface ExportEntitiesInput {\n entityTypeId: string;\n fieldIds: string[];\n filters?: Array<{ fieldId: string; operator: string; value: unknown }>;\n format?: 'csv' | 'xlsx';\n}\n\n/**\n * Entities (the platform calls them Objects internally): the structured data\n * layer custom UIs query heavily. Attribute values are keyed by field ID as\n * defined on the entity type's `attributeSchema` — run\n * `npx @lunnoa/client codegen` against your deployment for fully typed,\n * per-entity-type accessors.\n */\nexport class EntitiesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Returns one page of entities matching the filter. */\n list(options: ListEntitiesOptions = {}): Promise<PaginatedEntities> {\n return this.http.get<PaginatedEntities>('/api/objects', {\n query: this.serializeListOptions(options),\n });\n }\n\n /**\n * Async-iterates every entity matching the filter, fetching pages lazily.\n *\n * ```ts\n * for await (const invoice of client.entities.iterate({ objectTypeSlug: 'invoice' })) { ... }\n * ```\n */\n iterate(\n options: Omit<ListEntitiesOptions, 'page'> = {},\n ): AsyncGenerator<Entity, void, undefined> {\n return iteratePages<Entity>(async (page) => {\n const result = await this.list({ ...options, page });\n return { data: result.data ?? [], pagination: result.pagination };\n });\n }\n\n /** Returns a single entity. Request `expansion: ['attributes']` for field values. */\n get(\n entityId: string,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.get<Entity>(`/api/objects/${entityId}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Creates an entity. `attributes` are keyed by field ID. */\n create(\n data: CreateEntityInput,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.post<Entity>('/api/objects', {\n body: data,\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Partially updates an entity; supplied attributes are merged. */\n update(\n entityId: string,\n data: UpdateEntityInput,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.patch<Entity>(`/api/objects/${entityId}`, {\n body: data,\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Soft-deletes an entity. */\n delete(entityId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/objects/${entityId}`);\n }\n\n /** Moves an entity to a new state (validated against the type's state machine). */\n changeState(\n entityId: string,\n data: ChangeEntityStateInput,\n ): Promise<ChangeEntityStateResult> {\n return this.http.post<ChangeEntityStateResult>(\n `/api/objects/${entityId}/state`,\n { body: data },\n );\n }\n\n /** Returns the entity's state changes, newest first. */\n getStateHistory(\n entityId: string,\n options: { limit?: number } = {},\n ): Promise<EntityStateHistoryEntry[]> {\n return this.http.get<EntityStateHistoryEntry[]>(\n `/api/objects/${entityId}/state/history`,\n { query: { limit: options.limit } },\n );\n }\n\n /** Returns the current state and the transitions allowed from it. */\n getStateTransitions(entityId: string): Promise<EntityStateTransitions> {\n return this.http.get<EntityStateTransitions>(\n `/api/objects/${entityId}/state/transitions`,\n );\n }\n\n /** Imports pre-parsed rows into an entity type (SuperAdmin only). */\n import(data: ImportEntitiesInput): Promise<ImportEntitiesResult> {\n return this.http.post<ImportEntitiesResult>('/api/objects/import', {\n body: data,\n });\n }\n\n /** Exports entities of a type as flat JSON rows. */\n export(data: ExportEntitiesInput): Promise<Array<Record<string, unknown>>> {\n return this.http.post<Array<Record<string, unknown>>>(\n '/api/objects/export',\n { body: data },\n );\n }\n\n /** Returns the column headers and a sample row for importing (SuperAdmin only). */\n getImportTemplate(entityTypeId: string): Promise<ImportTemplate> {\n return this.http.get<ImportTemplate>(\n `/api/objects/import/template/${entityTypeId}`,\n );\n }\n\n private serializeListOptions(\n options: ListEntitiesOptions,\n ): Record<string, QueryValue> {\n return {\n objectTypeId: options.objectTypeId,\n objectTypeSlug: options.objectTypeSlug,\n state: options.state,\n states: options.states?.join(','),\n search: options.search,\n sortBy: options.sortBy,\n sortOrder: options.sortOrder,\n page: options.page,\n pageSize: options.pageSize,\n expansion: serializeCsv(options.expansion),\n };\n }\n}\n","import type { EntityTypeDefinition as DefineEntityTypeDefinition } from '../define';\nimport type { HttpClient } from '../core/http';\nimport type { EntityType } from '../types';\nimport { serializeCsv } from './common';\n\nexport interface EntityTypeReadOptions {\n /** Fields to expand, e.g. `['attributeSchema', 'stateSchema', 'description']`. */\n expansion?: string | string[];\n}\n\n/** Payload for `POST /api/object-types/upsert`. */\nexport interface UpsertEntityTypeBySlugInput {\n slug: string;\n name?: string;\n namePlural?: string;\n description?: string;\n icon?: string;\n color?: string;\n attributeSchema: Record<string, unknown>;\n stateSchema?: Record<string, unknown> | null;\n isEnabled?: boolean;\n allowUnknownAttributes?: boolean;\n managedByCode?: boolean;\n}\n\nexport function entityTypeDefinitionToUpsert(\n def: DefineEntityTypeDefinition,\n): UpsertEntityTypeBySlugInput {\n return {\n slug: def.slug,\n name: def.name,\n namePlural: def.namePlural,\n description: def.description,\n icon: def.icon,\n color: def.color,\n attributeSchema: def.attributeSchema,\n stateSchema: def.stateSchema,\n isEnabled: def.isEnabled,\n allowUnknownAttributes: def.allowUnknownAttributes ?? false,\n managedByCode: true,\n };\n}\n\nexport class EntityTypesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Lists entity types in the workspace. Request\n * `expansion: ['attributeSchema', 'stateSchema']` for the field and state\n * machine definitions the codegen CLI builds types from.\n */\n list(\n options: EntityTypeReadOptions & { includeDisabled?: boolean } = {},\n ): Promise<EntityType[]> {\n return this.http.get<EntityType[]>('/api/object-types', {\n query: {\n includeDisabled: options.includeDisabled,\n expansion: serializeCsv(options.expansion),\n },\n });\n }\n\n /** Returns a single entity type by ID. */\n get(id: string, options: EntityTypeReadOptions = {}): Promise<EntityType> {\n return this.http.get<EntityType>(`/api/object-types/${id}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Returns a single entity type by its URL-safe slug. */\n getBySlug(\n slug: string,\n options: EntityTypeReadOptions = {},\n ): Promise<EntityType> {\n return this.http.get<EntityType>(`/api/object-types/slug/${slug}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /**\n * Creates or updates an entity type by workspace-scoped slug.\n * Prefer the CLI (`npx @lunnoa/client entity-types deploy`) for happy-path deploy.\n */\n upsertBySlug(\n definition: DefineEntityTypeDefinition | UpsertEntityTypeBySlugInput,\n ): Promise<EntityType> {\n const payload =\n 'kind' in definition && definition.kind === 'entityType'\n ? entityTypeDefinitionToUpsert(definition)\n : (definition as UpsertEntityTypeBySlugInput);\n\n return this.http.post<EntityType>('/api/object-types/upsert', {\n body: payload,\n query: {\n expansion: 'attributeSchema,stateSchema,description',\n },\n });\n }\n}\n","import type { HttpClient } from '../core/http';\n\nexport type EligibleApprover = {\n workspaceUserId: string;\n email: string;\n name?: string;\n};\n\nexport type ApprovalInboxItem = {\n approvalId: string;\n executionId: string;\n nodeId: string;\n title: string;\n status: string;\n requiredCount: number;\n receivedApprovals: number;\n expiresAt?: string;\n createdAt?: string;\n updatedAt?: string;\n canDecide?: boolean;\n executionNumber?: number;\n workflow?: { id: string; name: string };\n project?: { id: string; name: string };\n myDecision?: {\n decision: string;\n comment?: string;\n decidedAt?: string;\n };\n /** People who can still decide. */\n eligibleApprovers?: EligibleApprover[];\n approval?: Record<string, unknown>;\n};\n\n/**\n * Authenticated Approvals inbox helpers (workspace API; not Public API v1).\n */\nexport class ApprovalsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * @param options.status `pending` (default) for actionable items, or `done` for history.\n */\n async inbox(options?: {\n status?: 'pending' | 'done' | string;\n }): Promise<{ items: ApprovalInboxItem[] }> {\n return this.http.get('/api/approvals/inbox', {\n query: { status: options?.status ?? 'pending' },\n });\n }\n\n async decide(\n approvalId: string,\n body: {\n decision: 'approved' | 'rejected';\n comment?: string;\n },\n ): Promise<{\n executionId: string;\n nodeId: string;\n approvalId?: string;\n terminal: boolean;\n canDecide: boolean;\n approval: Record<string, unknown>;\n }> {\n return this.http.post(`/api/approvals/${approvalId}/decide`, { body });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { LunnoaApiError } from '../core/errors';\nimport { parseSseEvents } from './sse';\nimport type { ExecutionPathStep, ExecutionStatus } from '../types';\n\nexport type ExecutionStreamEventType =\n | 'connected'\n | 'heartbeat'\n | 'execution.progress'\n | 'execution.finished'\n | 'execution.error'\n | 'loop.progress'\n | string;\n\nexport interface ExecutionProgressPayload {\n executionId: string;\n status: ExecutionStatus | string | null;\n statusMessage: string | null;\n name: string | null;\n source: string | null;\n startedAt?: string;\n stoppedAt?: string | null;\n executionPath: ExecutionPathStep[];\n pendingInput?: unknown;\n output?: unknown;\n}\n\nexport interface ExecutionStreamEvent {\n event: ExecutionStreamEventType;\n data: Record<string, unknown>;\n}\n\nexport interface WatchProgressOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Opens `GET /api/executions/:id/stream` and yields typed SSE events.\n * Prefer {@link ExecutionsResource.watchProgress} for timeline UIs.\n */\nexport class ExecutionProgressStream implements AsyncIterable<ExecutionStreamEvent> {\n private consumed = false;\n\n constructor(\n private readonly response: Response,\n private readonly options?: WatchProgressOptions,\n ) {}\n\n [Symbol.asyncIterator](): AsyncGenerator<ExecutionStreamEvent, void, undefined> {\n return this.events();\n }\n\n async *events(): AsyncGenerator<ExecutionStreamEvent, void, undefined> {\n if (this.consumed) {\n throw new Error('This ExecutionProgressStream has already been consumed.');\n }\n this.consumed = true;\n\n const body = this.response.body;\n if (!body) {\n return;\n }\n\n for await (const frame of parseSseEvents(body)) {\n if (this.options?.signal?.aborted) {\n return;\n }\n if (frame.data === null) {\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(frame.data);\n } catch {\n continue;\n }\n if (!parsed || typeof parsed !== 'object') {\n continue;\n }\n yield {\n event: frame.event,\n data: parsed as Record<string, unknown>,\n };\n if (frame.event === 'execution.finished' || frame.event === 'execution.error') {\n return;\n }\n }\n }\n}\n\nexport async function openExecutionStream(\n http: HttpClient,\n executionId: string,\n options?: WatchProgressOptions,\n): Promise<ExecutionProgressStream> {\n const response = await http.request('GET', `/api/executions/${executionId}/stream`, {\n raw: true,\n signal: options?.signal,\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => undefined);\n let parsed: unknown = body;\n try {\n parsed = body ? JSON.parse(body) : undefined;\n } catch {\n // keep text\n }\n throw new LunnoaApiError({\n status: response.status,\n body: parsed,\n method: 'GET',\n path: `/api/executions/${executionId}/stream`,\n });\n }\n\n return new ExecutionProgressStream(response, options);\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n ExecuteWorkflowResult,\n Execution,\n ExecutionPathStep,\n ExecutionStatus,\n WorkflowApp,\n} from '../types';\nimport {\n openExecutionStream,\n type ExecutionProgressPayload,\n type ExecutionProgressStream,\n type WatchProgressOptions,\n} from '../streaming/execution-progress';\nimport { serializeListQuery, type ListQueryOptions } from './common';\nimport type { WorkflowAppsResource } from './workflow-apps';\n\n/** Execution statuses that end an execution. */\nconst TERMINAL_STATUSES: ReadonlySet<string> = new Set([\n 'SUCCESS',\n 'FAILED',\n 'CANCELLED',\n]);\n\nexport interface WaitUntilFinishedOptions {\n /** Give up after this long. Default: 10 minutes. */\n timeoutMs?: number;\n /** First delay between polls. Default: 500ms. */\n initialDelayMs?: number;\n /** Cap on the delay between polls. Default: 5s. */\n maxDelayMs?: number;\n /** Multiplier applied to the delay after each poll. Default: 1.5. */\n backoffFactor?: number;\n /**\n * Also stop waiting when the execution pauses in `NEEDS_INPUT` (so a form\n * can be shown). Default: true.\n */\n stopOnNeedsInput?: boolean;\n /** Extra expansion fields to request with each poll (always includes `status,statusMessage,output`). */\n expansion?: string[];\n signal?: AbortSignal;\n /** Injectable sleep, for tests. */\n sleep?: (ms: number) => Promise<void>;\n}\n\nexport class ExecutionTimeoutError extends Error {\n constructor(\n readonly executionId: string,\n readonly timeoutMs: number,\n ) {\n super(\n `Execution ${executionId} did not finish within ${timeoutMs}ms. It is still running server-side; keep polling executions.get() or increase timeoutMs.`,\n );\n this.name = 'ExecutionTimeoutError';\n }\n}\n\n/** One step in a timeline-ready progress snapshot. */\nexport interface ExecutionProgressStep extends ExecutionPathStep {\n /** App logo URL from the workflow-apps catalogue, when resolvable. */\n appLogoUrl?: string | null;\n /** Action/trigger icon URL from the catalogue, when resolvable. */\n iconUrl?: string | null;\n /** Duration in ms when both startTime and endTime are present. */\n durationMs?: number | null;\n}\n\n/** Timeline-ready progress for a custom UI (status bar / step list). */\nexport interface ExecutionProgress {\n executionId: string;\n status?: ExecutionStatus | string;\n statusMessage?: string | null;\n name?: string | null;\n source?: string | null;\n startedAt?: string;\n stoppedAt?: string | null;\n steps: ExecutionProgressStep[];\n pendingInput?: unknown;\n output?: unknown;\n /** Index of the first non-terminal step, or -1 when all done / unknown. */\n activeStepIndex: number;\n}\n\nexport class ExecutionsResource {\n private catalogCache: WorkflowApp[] | null = null;\n\n constructor(\n private readonly http: HttpClient,\n private readonly workflowApps?: WorkflowAppsResource,\n ) {}\n\n /**\n * Starts a new execution of a workflow. Only the execution ID is returned;\n * use {@link waitUntilFinished} or `get` to track progress.\n */\n execute(\n workflowId: string,\n inputData?: Record<string, unknown>,\n ): Promise<ExecuteWorkflowResult> {\n return this.http.post<ExecuteWorkflowResult>(\n `/api/executions/workflows/${workflowId}/execute`,\n { body: { inputData: inputData ?? {} } },\n );\n }\n\n /** Lists executions in the current workspace, most recently started first. */\n list(options?: ListQueryOptions): Promise<Execution[]> {\n return this.http.get<Execution[]>('/api/executions', {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Returns a single execution. Request `expansion: ['status', 'executionPath']`\n * for the business-readable step list custom UIs render progress from.\n */\n get(\n executionId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Execution> {\n return this.http.get<Execution>(`/api/executions/${executionId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Timeline-ready progress: `executionPath` plus catalogue icons/logos.\n * Use this for a custom status bar / step list (not raw nodes/edges).\n */\n async getProgress(executionId: string): Promise<ExecutionProgress> {\n const execution = await this.get(executionId, {\n expansion: [\n 'status',\n 'statusMessage',\n 'executionPath',\n 'pendingInput',\n 'source',\n 'name',\n 'startedAt',\n 'stoppedAt',\n 'output',\n ],\n });\n return this.#toProgress(execution);\n }\n\n /**\n * Opens the Public API SSE stream (`GET /executions/:id/stream`).\n * Yields `execution.progress`, `loop.progress`, `execution.finished`, etc.\n * For a simple timeline, prefer {@link watchProgress}.\n */\n stream(\n executionId: string,\n options?: WatchProgressOptions,\n ): Promise<ExecutionProgressStream> {\n return openExecutionStream(this.http, executionId, options);\n }\n\n /**\n * Live progress snapshots for a custom timeline UI.\n * Subscribes to SSE `execution.progress` events (and enriches steps with icons).\n * Completes when the execution reaches a terminal status or the signal aborts.\n */\n async *watchProgress(\n executionId: string,\n options?: WatchProgressOptions,\n ): AsyncGenerator<ExecutionProgress, void, undefined> {\n const stream = await this.stream(executionId, options);\n for await (const frame of stream) {\n if (frame.event === 'execution.progress') {\n const payload = frame.data as unknown as ExecutionProgressPayload;\n yield await this.#progressFromPayload(payload);\n } else if (frame.event === 'execution.finished') {\n // Ensure a final enriched snapshot even if the last progress was skipped.\n yield await this.getProgress(executionId);\n return;\n } else if (frame.event === 'execution.error') {\n throw new Error(\n typeof frame.data.message === 'string'\n ? frame.data.message\n : `Execution stream error for ${executionId}`,\n );\n }\n }\n }\n\n /**\n * Polls an execution with exponential backoff until it reaches a terminal\n * status (`SUCCESS`, `FAILED`, `CANCELLED`) — or pauses in `NEEDS_INPUT`\n * (unless `stopOnNeedsInput: false`). Resolves with the final execution\n * including `status`, `statusMessage`, and `output`.\n */\n async waitUntilFinished(\n executionId: string,\n options: WaitUntilFinishedOptions = {},\n ): Promise<Execution> {\n const {\n timeoutMs = 10 * 60 * 1000,\n initialDelayMs = 500,\n maxDelayMs = 5_000,\n backoffFactor = 1.5,\n stopOnNeedsInput = true,\n expansion = [],\n signal,\n sleep = defaultSleep,\n } = options;\n\n const pollExpansion = Array.from(\n new Set(['status', 'statusMessage', 'output', ...expansion]),\n );\n\n const startedAt = Date.now();\n // Accumulated requested sleep time; combined with wall-clock elapsed so the\n // budget holds both in real use and with an injected (instant) sleep.\n let waitedMs = 0;\n let delay = initialDelayMs;\n\n while (true) {\n signal?.throwIfAborted();\n\n const execution = await this.get(executionId, {\n expansion: pollExpansion,\n });\n const status = execution.status as ExecutionStatus | undefined;\n\n if (status && TERMINAL_STATUSES.has(status)) {\n return execution;\n }\n if (stopOnNeedsInput && status === 'NEEDS_INPUT') {\n return execution;\n }\n\n const elapsed = Math.max(Date.now() - startedAt, waitedMs);\n if (elapsed + delay > timeoutMs) {\n throw new ExecutionTimeoutError(executionId, timeoutMs);\n }\n\n await sleep(delay);\n waitedMs += delay;\n delay = Math.min(delay * backoffFactor, maxDelayMs);\n }\n }\n\n /**\n * Resumes an execution paused in `NEEDS_INPUT` by submitting values for the\n * waiting node. Identify the waiting node and its field schema via\n * `expansion: ['pendingInput', 'executionPath']` (prefer `pendingInput` for\n * the form contract; `executionPath` steps with status `NEEDS_INPUT` also\n * carry the `nodeId`). Required fields from the schema must be present.\n * The server acknowledges immediately and resumes asynchronously — follow\n * up with {@link waitUntilFinished}.\n */\n async submitInput(\n executionId: string,\n nodeId: string,\n values: Record<string, unknown>,\n ): Promise<void> {\n await this.http.post<unknown>(\n `/api/webhooks/executions/${executionId}/nodes/${nodeId}/input`,\n { body: values },\n );\n }\n\n /**\n * Submit an approve/reject decision for a Request Approval node.\n * Uses the authenticated Approvals API (not the public input webhook).\n * Partial approvals keep the execution paused; terminal decisions resume it.\n */\n async submitApproval(\n executionId: string,\n nodeId: string,\n body: {\n decision: 'approved' | 'rejected';\n comment?: string;\n },\n ): Promise<{\n executionId: string;\n nodeId: string;\n approvalId?: string;\n terminal: boolean;\n canDecide: boolean;\n approval: Record<string, unknown>;\n }> {\n return this.http.post(\n `/api/executions/${executionId}/nodes/${nodeId}/approvals`,\n { body },\n );\n }\n\n async #toProgress(execution: Execution): Promise<ExecutionProgress> {\n const path = (execution.executionPath ?? []) as ExecutionPathStep[];\n const steps = await this.#enrichSteps(path);\n return {\n executionId: execution.id,\n status: execution.status,\n statusMessage: execution.statusMessage ?? null,\n name: (execution as { name?: string | null }).name ?? null,\n source: (execution as { source?: string | null }).source ?? null,\n startedAt: execution.startedAt,\n stoppedAt: execution.stoppedAt ?? null,\n steps,\n pendingInput: (execution as { pendingInput?: unknown }).pendingInput,\n output: execution.output,\n activeStepIndex: findActiveStepIndex(steps),\n };\n }\n\n async #progressFromPayload(\n payload: ExecutionProgressPayload,\n ): Promise<ExecutionProgress> {\n const steps = await this.#enrichSteps(payload.executionPath ?? []);\n return {\n executionId: payload.executionId,\n status: payload.status ?? undefined,\n statusMessage: payload.statusMessage,\n name: payload.name,\n source: payload.source,\n startedAt: payload.startedAt,\n stoppedAt: payload.stoppedAt,\n steps,\n pendingInput: payload.pendingInput,\n output: payload.output,\n activeStepIndex: findActiveStepIndex(steps),\n };\n }\n\n async #enrichSteps(\n path: ExecutionPathStep[],\n ): Promise<ExecutionProgressStep[]> {\n const catalog = await this.#loadCatalog();\n return path.map((step) => {\n const app = catalog?.find((a) => a.id === step.appId);\n const action =\n step.actionId && Array.isArray(app?.actions)\n ? (app!.actions as Record<string, unknown>[]).find(\n (a) => a && typeof a === 'object' && a.id === step.actionId,\n )\n : undefined;\n const trigger =\n step.triggerId && Array.isArray(app?.triggers)\n ? (app!.triggers as Record<string, unknown>[]).find(\n (t) => t && typeof t === 'object' && t.id === step.triggerId,\n )\n : undefined;\n const iconUrl =\n (typeof action?.iconUrl === 'string' && action.iconUrl) ||\n (typeof trigger?.iconUrl === 'string' && trigger.iconUrl) ||\n null;\n const durationMs = computeDurationMs(step.startTime, step.endTime);\n return {\n ...step,\n appLogoUrl: app?.logoUrl ?? null,\n iconUrl,\n durationMs,\n };\n });\n }\n\n async #loadCatalog(): Promise<WorkflowApp[] | null> {\n if (!this.workflowApps) {\n return null;\n }\n if (!this.catalogCache) {\n try {\n this.catalogCache = await this.workflowApps.list();\n } catch {\n return null;\n }\n }\n return this.catalogCache;\n }\n}\n\nfunction findActiveStepIndex(steps: ExecutionProgressStep[]): number {\n const idx = steps.findIndex(\n (s) =>\n s.status === 'RUNNING' ||\n s.status === 'NEEDS_INPUT' ||\n s.status === 'RETRYING' ||\n s.status === 'WAITING' ||\n s.status === 'SCHEDULED',\n );\n return idx;\n}\n\nfunction computeDurationMs(\n start?: string,\n end?: string,\n): number | null {\n if (!start || !end) return null;\n const a = Date.parse(start);\n const b = Date.parse(end);\n if (Number.isNaN(a) || Number.isNaN(b) || b < a) return null;\n return b - a;\n}\n\nfunction defaultSleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateKnowledgeInput,\n Knowledge,\n KnowledgeDocument,\n KnowledgeDocumentGroup,\n SaveUploadedTextInput,\n UpdateKnowledgeInput,\n} from '../types';\nimport { serializeCsv } from './common';\n\nexport class KnowledgeResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists knowledge notebooks in the workspace. */\n list(options: { expansion?: string | string[] } = {}): Promise<Knowledge[]> {\n return this.http.get<Knowledge[]>('/api/knowledge', {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Returns a single knowledge notebook. */\n get(\n knowledgeId: string,\n options: { expansion?: string | string[] } = {},\n ): Promise<Knowledge> {\n return this.http.get<Knowledge>(`/api/knowledge/${knowledgeId}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Creates a knowledge notebook. Subject to the deployment's storage/vector infrastructure. */\n create(data: CreateKnowledgeInput): Promise<Knowledge> {\n return this.http.post<Knowledge>('/api/knowledge', { body: data });\n }\n\n /** Updates a knowledge notebook. */\n update(knowledgeId: string, data: UpdateKnowledgeInput): Promise<Knowledge> {\n return this.http.patch<Knowledge>(`/api/knowledge/${knowledgeId}`, {\n body: data,\n });\n }\n\n /** Deletes a knowledge notebook. */\n delete(knowledgeId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/knowledge/${knowledgeId}`);\n }\n\n /** Saves raw text into the notebook (chunked, embedded, and indexed server-side). */\n saveUploadedText(\n knowledgeId: string,\n data: SaveUploadedTextInput,\n ): Promise<unknown> {\n return this.http.post<unknown>(\n `/api/knowledge/${knowledgeId}/saveUploadedText`,\n { body: data },\n );\n }\n\n /** Lists the documents stored in a notebook. */\n listDocuments(knowledgeId: string): Promise<KnowledgeDocument[]> {\n return this.http.get<KnowledgeDocument[]>(\n `/api/knowledge/${knowledgeId}/documents`,\n );\n }\n\n /** Returns one document group (an uploaded document and its chunks). */\n getDocumentGroup(\n knowledgeId: string,\n groupId: string,\n ): Promise<KnowledgeDocumentGroup> {\n return this.http.get<KnowledgeDocumentGroup>(\n `/api/knowledge/${knowledgeId}/documents/${groupId}`,\n );\n }\n\n /** Deletes one document group from the notebook. */\n deleteDocumentGroup(knowledgeId: string, groupId: string): Promise<boolean> {\n return this.http.delete<boolean>(\n `/api/knowledge/${knowledgeId}/documents/${groupId}`,\n );\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { CreateProjectInput, Project } from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class ProjectsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists projects in the workspace, most recently updated first. */\n list(options?: ListQueryOptions): Promise<Project[]> {\n return this.http.get<Project[]>('/api/projects', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single project. */\n get(\n projectId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Project> {\n return this.http.get<Project>(`/api/projects/${projectId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a project. */\n create(data: CreateProjectInput): Promise<Project> {\n return this.http.post<Project>('/api/projects', { body: data });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { iterateOffset, type OffsetPagination } from '../core/pagination';\nimport type {\n BulkCreateQueueItemsInput,\n BulkCreateQueueItemsResult,\n CreateQueueItemInput,\n QueueItem,\n QueueItemCreated,\n QueueItemErrorEntry,\n QueueItemFull,\n QueueItemList,\n QueueItemStats,\n UpdateQueueItemInput,\n} from '../types';\n\nexport type QueueItemStatus =\n | 'PENDING'\n | 'PROCESSING'\n | 'SUCCESS'\n | 'FAILED'\n | 'RETRYING';\n\nexport interface AddQueueItemErrorInput {\n /** Error message recorded on the item. */\n error: string;\n /**\n * Extra details. An object is sent as a JSON string, which is what the\n * server validates.\n */\n errorDetails?: string | Record<string, unknown>;\n}\nimport { serializeCsv, serializeFilterBy } from './common';\n\nexport interface ListQueueItemsOptions {\n limit?: number;\n offset?: number;\n expansion?: string | string[];\n /** Supports keys including `status`, `externalId`, `objectId`, `priority`. */\n filterBy?: string | Record<string, string>;\n}\n\nexport interface ListQueueItemsByObjectOptions {\n status?: string;\n limit?: number;\n offset?: number;\n expansion?: string | string[];\n}\n\nexport class QueueItemsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Returns one page of items in a queue (offset-based pagination). */\n list(\n queueId: string,\n options: ListQueueItemsOptions = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(`/api/queues/${queueId}/items`, {\n query: {\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy(options.filterBy),\n },\n });\n }\n\n /** Async-iterates every item in a queue, fetching batches lazily. */\n iterate(\n queueId: string,\n options: Omit<ListQueueItemsOptions, 'offset'> = {},\n ): AsyncGenerator<QueueItem, void, undefined> {\n return iterateOffset<QueueItem>(async (offset) => {\n const result = await this.list(queueId, { ...options, offset });\n return {\n items: result.items ?? [],\n pagination: result.pagination as unknown as OffsetPagination,\n };\n });\n }\n\n /** Returns a single queue item. */\n get(queueId: string, itemId: string): Promise<QueueItemFull> {\n return this.http.get<QueueItemFull>(\n `/api/queues/${queueId}/items/${itemId}`,\n );\n }\n\n /** Adds an item to a queue. Pass `objectId` to link the item to an entity. */\n create(\n queueId: string,\n data: CreateQueueItemInput,\n ): Promise<QueueItemCreated> {\n return this.http.post<QueueItemCreated>(`/api/queues/${queueId}/items`, {\n body: data,\n });\n }\n\n /**\n * Lists queue items linked to an Object across all queues in the workspace.\n * Use for Object detail \"Work\" panels.\n */\n listByObject(\n objectId: string,\n options: ListQueueItemsByObjectOptions = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/objects/${objectId}/queue-items`,\n {\n query: {\n status: options.status,\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n },\n },\n );\n }\n\n /** Async-iterates every queue item linked to an Object. */\n iterateByObject(\n objectId: string,\n options: Omit<ListQueueItemsByObjectOptions, 'offset'> = {},\n ): AsyncGenerator<QueueItem, void, undefined> {\n return iterateOffset<QueueItem>(async (offset) => {\n const result = await this.listByObject(objectId, {\n ...options,\n offset,\n });\n return {\n items: result.items ?? [],\n pagination: result.pagination as unknown as OffsetPagination,\n };\n });\n }\n\n /** Adds many items to a queue in one call. */\n bulkCreate(\n queueId: string,\n data: BulkCreateQueueItemsInput,\n ): Promise<BulkCreateQueueItemsResult> {\n return this.http.post<BulkCreateQueueItemsResult>(\n `/api/queues/${queueId}/items/bulk`,\n { body: data },\n );\n }\n\n /** Updates a queue item. */\n update(\n queueId: string,\n itemId: string,\n data: UpdateQueueItemInput,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}`,\n { body: data },\n );\n }\n\n /** Deletes a queue item. */\n delete(queueId: string, itemId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(\n `/api/queues/${queueId}/items/${itemId}`,\n );\n }\n\n /** Returns items that are ready to be processed. */\n listReady(queueId: string, options: { limit?: number } = {}): Promise<QueueItem[]> {\n return this.http.get<QueueItem[]>(`/api/queues/${queueId}/items/ready`, {\n query: { limit: options.limit },\n });\n }\n\n /** Returns items eligible for retry. */\n listRetryable(queueId: string): Promise<QueueItem[]> {\n return this.http.get<QueueItem[]>(`/api/queues/${queueId}/items/retry`);\n }\n\n /** Returns a page of items with the given status. */\n listByStatus(\n queueId: string,\n status: QueueItemStatus,\n options: { limit?: number; offset?: number } = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/queues/${queueId}/items/status/${status}`,\n { query: { limit: options.limit, offset: options.offset } },\n );\n }\n\n /** Looks an item up by the external ID your system supplied. */\n getByExternalId(queueId: string, externalId: string): Promise<QueueItemFull> {\n return this.http.get<QueueItemFull>(\n `/api/queues/${queueId}/items/external/${externalId}`,\n );\n }\n\n /**\n * Searches items by external id, item data, and metadata.\n * Returns one page, same shape as `list`.\n */\n search(\n queueId: string,\n query: string,\n options: Omit<ListQueueItemsOptions, 'filterBy'> = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/queues/${queueId}/items/search`,\n {\n query: {\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy({ search: query }),\n },\n },\n );\n }\n\n /** Returns per-status and per-priority counts for the queue. */\n stats(queueId: string): Promise<QueueItemStats> {\n return this.http.get<QueueItemStats>(`/api/queues/${queueId}/items/stats`);\n }\n\n /** Returns the recorded processing errors of an item. */\n listErrors(queueId: string, itemId: string): Promise<QueueItemErrorEntry[]> {\n return this.http.get<QueueItemErrorEntry[]>(\n `/api/queues/${queueId}/items/${itemId}/errors`,\n );\n }\n\n /** Updates the processing status of an item. */\n updateStatus(\n queueId: string,\n itemId: string,\n status: string,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/status`,\n { body: { status } },\n );\n }\n\n /** Links an item to the workflow execution that processed it. */\n linkExecution(\n queueId: string,\n itemId: string,\n executionId: string,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/link-execution`,\n { body: { executionId } },\n );\n }\n\n /** Queues the item for another processing attempt. */\n retry(queueId: string, itemId: string): Promise<QueueItem> {\n return this.http.post<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/retry`,\n );\n }\n\n /** Records a processing error on the item. */\n addError(\n queueId: string,\n itemId: string,\n error: AddQueueItemErrorInput,\n ): Promise<QueueItem> {\n return this.http.post<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/error`,\n {\n body: {\n error: error.error,\n errorDetails: serializeErrorDetails(error.errorDetails),\n },\n },\n );\n }\n}\n\nfunction serializeErrorDetails(\n value: string | Record<string, unknown> | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return typeof value === 'string' ? value : JSON.stringify(value);\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateQueueInput,\n Queue,\n QueueStats,\n UpdateQueueInput,\n} from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class QueuesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists queues in the workspace, ordered by priority then creation date. */\n list(options?: ListQueryOptions): Promise<Queue[]> {\n return this.http.get<Queue[]>('/api/queues', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single queue. */\n get(queueId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Queue> {\n return this.http.get<Queue>(`/api/queues/${queueId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a queue. */\n create(data: CreateQueueInput): Promise<Queue> {\n return this.http.post<Queue>('/api/queues', { body: data });\n }\n\n /** Updates a queue. */\n update(queueId: string, data: UpdateQueueInput): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}`, { body: data });\n }\n\n /** Deletes a queue. */\n delete(queueId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/api/queues/${queueId}`);\n }\n\n /** Returns aggregate statistics for a queue. */\n stats(queueId: string): Promise<QueueStats> {\n return this.http.get<QueueStats>(`/api/queues/${queueId}/stats`);\n }\n\n /** Activates a queue. */\n activate(queueId: string): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}/activate`);\n }\n\n /** Deactivates a queue. */\n deactivate(queueId: string): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}/deactivate`);\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n ActionDefinition,\n WorkflowDefinition,\n WorkflowStepDefinition,\n} from '../define';\nimport {\n resolveActionAppId,\n resolveActionId,\n} from '../define';\nimport type { Execution, RunActionResult } from '../types';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface StartRunStep {\n appId: string;\n actionId: string;\n connectionId?: string;\n input?: Record<string, unknown>;\n name?: string;\n}\n\nexport interface StartRunOptions {\n steps: StartRunStep[];\n projectId?: string;\n name?: string;\n}\n\nexport type StartRunInput =\n | StartRunOptions\n | WorkflowDefinition\n | WorkflowStepDefinition[]\n | StartRunStep[];\n\nfunction isWorkflowDefinition(value: unknown): value is WorkflowDefinition {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as WorkflowDefinition).kind === 'workflow'\n );\n}\n\nfunction isActionDefinition(value: unknown): value is ActionDefinition {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as ActionDefinition).kind === 'action'\n );\n}\n\nfunction stepFromDefinition(\n step: WorkflowStepDefinition | StartRunStep | ActionDefinition,\n): StartRunStep {\n if ('appId' in step && 'actionId' in step && !('use' in step) && !('kind' in step)) {\n return step as StartRunStep;\n }\n if (isActionDefinition(step)) {\n return {\n appId: resolveActionAppId(step),\n actionId: resolveActionId(step),\n ...(step.connection?.id ? { connectionId: step.connection.id } : {}),\n ...(step.input ? { input: step.input } : {}),\n ...(step.name ? { name: step.name } : {}),\n };\n }\n const use = (step as WorkflowStepDefinition).use;\n const input = {\n ...(use.input ?? {}),\n ...((step as WorkflowStepDefinition).input ?? {}),\n };\n return {\n appId: resolveActionAppId(use),\n actionId: resolveActionId(use),\n ...(use.connection?.id ? { connectionId: use.connection.id } : {}),\n ...(Object.keys(input).length ? { input } : {}),\n ...(((step as WorkflowStepDefinition).name ?? use.name)\n ? { name: (step as WorkflowStepDefinition).name ?? use.name }\n : {}),\n };\n}\n\nfunction normalizeStartRunInput(input: StartRunInput): StartRunOptions {\n if (isWorkflowDefinition(input)) {\n return {\n steps: input.steps.map(stepFromDefinition),\n name: input.name ?? input.slug,\n };\n }\n if (Array.isArray(input)) {\n return { steps: input.map((s) => stepFromDefinition(s as any)) };\n }\n return input;\n}\n\n/**\n * Multi-step ad-hoc runs (`POST /api/runs`) → one Execution with `source: SDK`.\n */\nexport class RunsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /**\n * Start a linear multi-step ad-hoc Execution.\n *\n * Accepts a `defineWorkflow` result, a step array, or an explicit\n * `{ steps, projectId?, name? }` payload.\n */\n start(input: StartRunInput): Promise<RunActionResult> {\n const options = normalizeStartRunInput(input);\n if (!options.steps?.length) {\n throw new Error('runs.start requires at least one step');\n }\n return this.http.post<RunActionResult>('/api/runs', {\n body: options,\n });\n }\n\n /** Convenience: start and wait until terminal / NEEDS_INPUT. */\n async startAndWait(\n input: StartRunInput,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.start(input);\n return this.executions.waitUntilFinished(id, {\n ...waitOptions,\n expansion: [\n 'executionPath',\n 'source',\n ...(waitOptions?.expansion ?? []),\n ],\n });\n }\n}\n","import type { HttpClient } from '../core/http';\n\nexport type ScorecardMeasureStatus = 'ON_TRACK' | 'AT_RISK' | 'OFF_TRACK' | 'NO_DATA';\n\nexport type ScorecardSummary = {\n id: string;\n name: string;\n periodLabel: string | null;\n description: string | null;\n FK_ownerId: string | null;\n createdAt: string;\n _count: { objectives: number };\n};\n\nexport type ScorecardMeasure = {\n id: string;\n name: string;\n unit: string;\n currency: string | null;\n direction: 'HIGHER_IS_BETTER' | 'LOWER_IS_BETTER';\n kind: 'LEADING' | 'LAGGING';\n cadence: 'DAILY' | 'WEEKLY' | 'MONTHLY';\n sourceType: 'MANUAL' | 'API' | 'WORKFLOW' | 'BUILT_IN';\n builtInKey: string | null;\n target: number;\n atRiskThreshold: number | null;\n latest: { value: number; periodStart: string; createdAt: string } | null;\n previousValue: number | null;\n series: { periodStart: string; value: number }[];\n status: ScorecardMeasureStatus;\n stale: boolean;\n};\n\nexport type ScorecardObjective = {\n id: string;\n perspective: 'FINANCIAL' | 'CUSTOMER' | 'PROCESS' | 'LEARNING';\n name: string;\n description: string | null;\n ownerLabel: string | null;\n drivesIds: string[];\n position: number;\n status: ScorecardMeasureStatus;\n measures: ScorecardMeasure[];\n};\n\nexport type Scorecard = Omit<ScorecardSummary, '_count'> & {\n aiSpendUsdThisMonth: number;\n objectives: ScorecardObjective[];\n};\n\nexport type ScorecardMeasureValue = {\n id: string;\n FK_measureId: string;\n periodStart: string;\n value: number;\n note: string | null;\n sourceType: ScorecardMeasure['sourceType'];\n supersededAt: string | null;\n createdAt: string;\n};\n\nexport type RecordMeasureValueInput = {\n value: number;\n /** Any ISO date inside the target period; defaults to the current period. */\n period?: string;\n note?: string;\n};\n\n/**\n * Balanced Scorecard (workspace API). Pushing values needs `scorecard:record`.\n */\nexport class ScorecardsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists scorecards in the workspace. */\n list(): Promise<ScorecardSummary[]> {\n return this.http.get<ScorecardSummary[]>('/api/scorecards');\n }\n\n /** Returns a scorecard with objectives, measures, latest values and status. */\n get(scorecardId: string): Promise<Scorecard> {\n return this.http.get<Scorecard>(`/api/scorecards/${scorecardId}`);\n }\n\n /**\n * Records a measure value. A value for the same period replaces the current\n * one; the old value is kept as superseded history.\n */\n recordValue(\n measureId: string,\n data: RecordMeasureValueInput,\n ): Promise<ScorecardMeasureValue> {\n return this.http.post<ScorecardMeasureValue>(\n `/api/scorecards/measures/${measureId}/values`,\n { body: data },\n );\n }\n}\n","import type { UIMessage } from 'ai';\n\nimport type { HttpClient } from '../core/http';\nimport type {\n CreateTaskInput,\n DeletedTask,\n Task,\n TaskListItem,\n UpdateTaskInput,\n} from '../types';\nimport {\n messageTaskBody,\n type StreamMessageOptions,\n} from '../streaming/agent-chat';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class TasksResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists tasks (conversation threads) visible to the caller, most recently updated first. */\n list(options?: ListQueryOptions): Promise<TaskListItem[]> {\n return this.http.get<TaskListItem[]>('/api/tasks', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single task. Request `expansion: ['messages']` for the conversation history. */\n get(taskId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Task> {\n return this.http.get<Task>(`/api/tasks/${taskId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a task (conversation thread) for an agent. */\n create(\n agentId: string,\n data: CreateTaskInput,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Task> {\n return this.http.post<Task>(`/api/agents/${agentId}/tasks`, {\n body: data,\n query: serializeListQuery(options),\n });\n }\n\n /** Updates the task name or description. */\n update(\n taskId: string,\n data: UpdateTaskInput,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Task> {\n return this.http.patch<Task>(`/api/tasks/${taskId}`, {\n body: data,\n query: serializeListQuery(options),\n });\n }\n\n /** Permanently deletes a task and its messages. */\n delete(taskId: string): Promise<DeletedTask> {\n return this.http.delete<DeletedTask>(`/api/tasks/${taskId}`);\n }\n\n /**\n * Sends a message to an agent task and waits for the full agent turn to\n * finish (non-streaming). Returns either a plain string or the assistant\n * messages in AI SDK UIMessage format. For token-by-token output use\n * `client.agentChat.streamMessage` instead.\n */\n message(\n agentId: string,\n taskId: string,\n message: string | UIMessage,\n options: Omit<StreamMessageOptions, 'signal'> = {},\n ): Promise<string | UIMessage[]> {\n const uiMessage: UIMessage =\n typeof message === 'string'\n ? {\n id: generateMessageId(),\n role: 'user',\n parts: [{ type: 'text', text: message }],\n }\n : message;\n\n return this.http.post<string | UIMessage[]>(\n `/api/agents/${agentId}/tasks/${taskId}/message`,\n { body: messageTaskBody(uiMessage, options) },\n );\n }\n}\n\nfunction generateMessageId(): string {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateVariableInput,\n UpdateVariableInput,\n Variable,\n} from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class VariablesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists variables in the workspace. */\n list(options?: ListQueryOptions): Promise<Variable[]> {\n return this.http.get<Variable[]>('/api/variables', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single variable. */\n get(\n variableId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Variable> {\n return this.http.get<Variable>(`/api/variables/${variableId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a variable. */\n create(data: CreateVariableInput): Promise<Variable> {\n return this.http.post<Variable>('/api/variables', { body: data });\n }\n\n /** Updates a variable. */\n update(variableId: string, data: UpdateVariableInput): Promise<Variable> {\n return this.http.patch<Variable>(`/api/variables/${variableId}`, {\n body: data,\n });\n }\n\n /** Deletes a variable. */\n delete(variableId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/variables/${variableId}`);\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { WorkflowApp } from '../types';\n\n/**\n * Read-only catalog of workflow apps and their actions/triggers. Custom UIs\n * use it to resolve `executionPath` step `appId`/`actionId` pairs to\n * human-readable names and icons, and to read the declarative\n * `ActionUIDefinition` metadata for rendering rich action outputs.\n */\nexport class WorkflowAppsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists all workflow apps installed on the deployment. */\n list(): Promise<WorkflowApp[]> {\n return this.http.get<WorkflowApp[]>('/api/workflow-apps');\n }\n\n /**\n * Creates a connection for an app where the connection type is\n * non-interactive (API key, basic auth). OAuth connections require the\n * browser flow inside the bundled UI and cannot be created here.\n */\n connect(\n appId: string,\n connectionId: string,\n value: Record<string, unknown>,\n ): Promise<unknown> {\n return this.http.post<unknown>(\n `/api/workflow-apps/${appId}/connections/${connectionId}/connect`,\n { body: value },\n );\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { ExecuteWorkflowResult, Execution, Workflow } from '../types';\nimport type { WorkflowDefinition, WorkflowStepDefinition } from '../define';\nimport { resolveActionAppId, resolveActionId } from '../define';\nimport { serializeListQuery, type ListQueryOptions } from './common';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface UpsertWorkflowStepInput {\n appId: string;\n actionId: string;\n connectionId?: string;\n input?: Record<string, unknown>;\n name?: string;\n description?: string;\n}\n\nexport interface UpsertWorkflowBySlugInput {\n slug: string;\n name?: string;\n description?: string;\n isActive?: boolean;\n steps: UpsertWorkflowStepInput[];\n managedByCode?: boolean;\n}\n\nfunction stepToUpsertInput(\n step: WorkflowStepDefinition,\n): UpsertWorkflowStepInput {\n const use = step.use;\n return {\n appId: resolveActionAppId(use),\n actionId: resolveActionId(use),\n connectionId: use.connection?.id,\n input: {\n ...(use.input ?? {}),\n ...(step.input ?? {}),\n },\n name: step.name ?? use.name,\n description: use.description,\n };\n}\n\nexport function workflowDefinitionToUpsert(\n def: WorkflowDefinition,\n): UpsertWorkflowBySlugInput {\n return {\n slug: def.slug,\n name: def.name,\n description: def.description,\n isActive: def.isActive,\n managedByCode: true,\n steps: def.steps.map(stepToUpsertInput),\n };\n}\n\nexport class WorkflowsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /** Lists workflows in the current workspace. */\n list(options?: ListQueryOptions): Promise<Workflow[]> {\n return this.http.get<Workflow[]>('/api/workflows', {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Returns a single workflow. Request `expansion: ['triggerNode']` to read\n * the manual trigger's custom input field definitions.\n */\n get(\n workflowId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Workflow> {\n return this.http.get<Workflow>(`/api/workflows/${workflowId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Upsert a workflow by project-scoped slug from a linear step list.\n * Prefer the CLI (`npx @lunnoa/client workflows deploy`) for happy-path deploy.\n */\n upsertBySlug(\n projectId: string,\n body: UpsertWorkflowBySlugInput | WorkflowDefinition,\n ): Promise<Workflow> {\n const payload =\n 'kind' in body && body.kind === 'workflow'\n ? workflowDefinitionToUpsert(body)\n : body;\n return this.http.post<Workflow>(\n `/api/projects/${projectId}/workflows/upsert`,\n { body: payload },\n );\n }\n\n /**\n * Starts a new execution of the workflow with the given trigger inputs.\n * Returns immediately with the execution ID.\n */\n execute(\n workflowId: string,\n inputs?: Record<string, unknown>,\n ): Promise<ExecuteWorkflowResult> {\n return this.executions.execute(workflowId, inputs);\n }\n\n /**\n * Convenience: execute the workflow and wait (poll with backoff) until it\n * reaches a terminal status or pauses in `NEEDS_INPUT`.\n */\n async executeAndWait(\n workflowId: string,\n inputs?: Record<string, unknown>,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.executions.execute(workflowId, inputs);\n return this.executions.waitUntilFinished(id, waitOptions);\n }\n\n /**\n * Triggers a workflow through its unauthenticated custom webhook endpoint\n * (`POST /api/webhooks/workflows/:workflowId`). Only works for workflows\n * with a webhook trigger. Returns the synchronous trigger output when the\n * workflow responds synchronously.\n */\n triggerWebhook(\n workflowId: string,\n payload?: Record<string, unknown>,\n ): Promise<Record<string, unknown> | undefined> {\n return this.http.post<Record<string, unknown> | undefined>(\n `/api/webhooks/workflows/${workflowId}`,\n { body: payload ?? {} },\n );\n }\n}\n","import { HttpClient, type LunnoaClientOptions } from './core/http';\nimport { AgentChatClient } from './streaming/agent-chat';\nimport { ActionsResource } from './resources/actions';\nimport { AgentsResource } from './resources/agents';\nimport { AuthResource } from './resources/auth';\nimport { ConnectionsResource } from './resources/connections';\nimport { DiscoveryResource } from './resources/discovery';\nimport { EntitiesResource } from './resources/entities';\nimport { EntityTypesResource } from './resources/entity-types';\nimport { ApprovalsResource } from './resources/approvals';\nimport { ExecutionsResource } from './resources/executions';\nimport { KnowledgeResource } from './resources/knowledge';\nimport { ProjectsResource } from './resources/projects';\nimport { QueueItemsResource } from './resources/queue-items';\nimport { QueuesResource } from './resources/queues';\nimport { RunsResource } from './resources/runs';\nimport { ScorecardsResource } from './resources/scorecards';\nimport { TasksResource } from './resources/tasks';\nimport { VariablesResource } from './resources/variables';\nimport { WorkflowAppsResource } from './resources/workflow-apps';\nimport { WorkflowsResource } from './resources/workflows';\n\n/**\n * Typed client for the Lunnoa Automate Public API.\n *\n * Server-side (Pattern A — the backend holds the key):\n * ```ts\n * const lunnoa = new LunnoaClient({\n * baseUrl: 'https://lunnoa.acme.example',\n * apiKey: process.env.LUNNOA_API_KEY, // lna_...\n * });\n * ```\n *\n * Browser (Pattern B — the end user is a Lunnoa user):\n * ```ts\n * import { createBrowserClient } from '@lunnoa/client';\n * const lunnoa = createBrowserClient({ baseUrl: 'https://lunnoa.acme.example' });\n * await lunnoa.auth.login({ email, password });\n * ```\n *\n * Passing an `lna_` API key in a browser throws immediately: API keys are\n * workspace-wide server credentials and must never ship to browsers.\n */\nexport class LunnoaClient {\n /** The underlying HTTP layer, exposed for advanced/escape-hatch requests. */\n readonly http: HttpClient;\n\n /** Login, refresh, SSO discovery, and session helpers (Pattern B). */\n readonly auth: AuthResource;\n readonly agents: AgentsResource;\n readonly tasks: TasksResource;\n /** Hand-written SSE streaming client for agent chat (AI SDK UIMessage chunks). */\n readonly agentChat: AgentChatClient;\n readonly workflows: WorkflowsResource;\n readonly executions: ExecutionsResource;\n /** Run catalogue actions as one-step ad-hoc Executions (`source: SDK`). */\n readonly actions: ActionsResource;\n /**\n * Multi-step ad-hoc Executions (`source: SDK`) via `POST /api/runs`.\n * Prefer `defineWorkflow` + `runs.start` for local linear chains.\n */\n readonly runs: RunsResource;\n /** Authenticated Approvals inbox (workspace API). */\n readonly approvals: ApprovalsResource;\n readonly entities: EntitiesResource;\n readonly entityTypes: EntityTypesResource;\n readonly knowledge: KnowledgeResource;\n readonly queues: QueuesResource;\n readonly queueItems: QueueItemsResource;\n readonly variables: VariablesResource;\n readonly scorecards: ScorecardsResource;\n readonly connections: ConnectionsResource;\n readonly projects: ProjectsResource;\n readonly workflowApps: WorkflowAppsResource;\n readonly discovery: DiscoveryResource;\n\n constructor(options: LunnoaClientOptions) {\n this.http = new HttpClient(options);\n\n this.auth = new AuthResource(this.http, this.http.tokenStore);\n this.agents = new AgentsResource(this.http);\n this.tasks = new TasksResource(this.http);\n this.agentChat = new AgentChatClient(this.http);\n this.workflowApps = new WorkflowAppsResource(this.http);\n this.executions = new ExecutionsResource(this.http, this.workflowApps);\n this.actions = new ActionsResource(this.http, this.executions);\n this.runs = new RunsResource(this.http, this.executions);\n this.approvals = new ApprovalsResource(this.http);\n this.workflows = new WorkflowsResource(this.http, this.executions);\n this.entities = new EntitiesResource(this.http);\n this.entityTypes = new EntityTypesResource(this.http);\n this.knowledge = new KnowledgeResource(this.http);\n this.queues = new QueuesResource(this.http);\n this.queueItems = new QueueItemsResource(this.http);\n this.variables = new VariablesResource(this.http);\n this.scorecards = new ScorecardsResource(this.http);\n this.connections = new ConnectionsResource(this.http);\n this.projects = new ProjectsResource(this.http);\n this.discovery = new DiscoveryResource(this.http);\n }\n}\n","/**\n * Pluggable storage for Pattern B JWTs.\n * The SDK never uses httpOnly cookies: Automate auth is bearer JWT based.\n */\nexport interface TokenStore {\n getAccessToken(): string | null | Promise<string | null>;\n getRefreshToken(): string | null | Promise<string | null>;\n setTokens(tokens: {\n accessToken: string;\n refreshToken?: string;\n }): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\n/** In-memory store (SSR, tests, or short-lived server handlers). */\nexport function createMemoryTokenStore(\n initial?: { accessToken?: string; refreshToken?: string },\n): TokenStore {\n let accessToken: string | null = initial?.accessToken ?? null;\n let refreshToken: string | null = initial?.refreshToken ?? null;\n\n return {\n getAccessToken: () => accessToken,\n getRefreshToken: () => refreshToken,\n setTokens: (tokens) => {\n accessToken = tokens.accessToken;\n if (tokens.refreshToken !== undefined) {\n refreshToken = tokens.refreshToken;\n }\n },\n clear: () => {\n accessToken = null;\n refreshToken = null;\n },\n };\n}\n\nexport interface LocalStorageTokenStoreOptions {\n /**\n * Defaults match the built-in Automate UI (`accessToken` / `refreshToken`)\n * so a custom portal can share a session with the product UI when desired.\n */\n accessTokenKey?: string;\n refreshTokenKey?: string;\n /**\n * Storage backend. Defaults to `globalThis.localStorage`.\n * Pass a mock in tests.\n */\n storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n}\n\n/**\n * Browser `localStorage` token store.\n * Throws if neither `options.storage` nor `globalThis.localStorage` is available.\n */\nexport function createLocalStorageTokenStore(\n options: LocalStorageTokenStoreOptions = {},\n): TokenStore {\n const accessTokenKey = options.accessTokenKey ?? 'accessToken';\n const refreshTokenKey = options.refreshTokenKey ?? 'refreshToken';\n const storage =\n options.storage ??\n (typeof globalThis !== 'undefined'\n ? (globalThis as { localStorage?: Storage }).localStorage\n : undefined);\n\n if (!storage) {\n throw new Error(\n 'createLocalStorageTokenStore requires localStorage (or a custom storage option). ' +\n 'On the server, use createMemoryTokenStore or pass accessToken / apiKey instead.',\n );\n }\n\n return {\n getAccessToken: () => storage.getItem(accessTokenKey),\n getRefreshToken: () => storage.getItem(refreshTokenKey),\n setTokens: (tokens) => {\n storage.setItem(accessTokenKey, tokens.accessToken);\n if (tokens.refreshToken !== undefined) {\n storage.setItem(refreshTokenKey, tokens.refreshToken);\n }\n },\n clear: () => {\n storage.removeItem(accessTokenKey);\n storage.removeItem(refreshTokenKey);\n },\n };\n}\n","import {\n createLocalStorageTokenStore,\n createMemoryTokenStore,\n type TokenStore,\n} from './token-store';\nimport { LunnoaClient } from '../client';\nimport type { FetchLike } from '../core/http';\n\nexport interface CreateBrowserClientOptions {\n /** Base URL of the Lunnoa Automate deployment. */\n baseUrl: string;\n /**\n * JWT store. Defaults to `localStorage` keys `accessToken` / `refreshToken`\n * (same as the built-in Automate UI).\n */\n tokenStore?: TokenStore;\n /**\n * Retry once after `POST /api/auth/refresh-token` on 401.\n * Defaults to true.\n */\n autoRefresh?: boolean;\n fetch?: FetchLike;\n headers?: Record<string, string>;\n}\n\n/**\n * Pattern B helper: browser (or isomorphic) client with JWT storage,\n * `lunnoa.auth.login` / refresh, and optional auto-refresh on 401.\n *\n * Never pass an `lna_` API key here.\n */\nexport function createBrowserClient(\n options: CreateBrowserClientOptions,\n): LunnoaClient {\n const tokenStore =\n options.tokenStore ?? createLocalStorageTokenStore();\n return new LunnoaClient({\n baseUrl: options.baseUrl,\n tokenStore,\n autoRefresh: options.autoRefresh ?? true,\n fetch: options.fetch,\n headers: options.headers,\n });\n}\n\nexport interface CreateServerClientOptions {\n /** Base URL of the Lunnoa Automate deployment. */\n baseUrl: string;\n /**\n * Workspace API key (`lna_...`). Preferred for Pattern A backends / BFFs.\n * Mutually exclusive with `accessToken` / `tokenStore`.\n */\n apiKey?: string;\n /**\n * User JWT (or getter) when the server acts on behalf of a logged-in user.\n * Prefer this over embedding tokens in the browser when you own the session.\n */\n accessToken?: string | (() => string | Promise<string>);\n /** Optional store when the server holds both access and refresh tokens. */\n tokenStore?: TokenStore;\n autoRefresh?: boolean;\n fetch?: FetchLike;\n headers?: Record<string, string>;\n}\n\n/**\n * Pattern A (or server-side Pattern B) helper for Node / BFF / route handlers.\n *\n * Provide `apiKey` for a service account, or `accessToken` / `tokenStore` for a\n * user JWT held on the server. Throws if used with an API key in a browser.\n */\nexport function createServerClient(\n options: CreateServerClientOptions,\n): LunnoaClient {\n if (!options.apiKey && !options.accessToken && !options.tokenStore) {\n throw new Error(\n 'createServerClient requires apiKey, accessToken, or tokenStore.',\n );\n }\n return new LunnoaClient({\n baseUrl: options.baseUrl,\n apiKey: options.apiKey,\n accessToken: options.accessToken,\n tokenStore: options.tokenStore,\n autoRefresh: options.autoRefresh,\n fetch: options.fetch,\n headers: options.headers,\n });\n}\n\nexport { createLocalStorageTokenStore, createMemoryTokenStore };\nexport type { TokenStore };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/auth.ts","../src/core/errors.ts","../src/core/http.ts","../src/streaming/sse.ts","../src/streaming/agent-chat.ts","../src/resources/actions.ts","../src/define/index.ts","../src/resources/common.ts","../src/resources/agents.ts","../src/auth/types.ts","../src/resources/auth.ts","../src/resources/connections.ts","../src/resources/discovery.ts","../src/core/pagination.ts","../src/resources/entities.ts","../src/resources/entity-types.ts","../src/resources/approvals.ts","../src/streaming/execution-progress.ts","../src/resources/executions.ts","../src/resources/knowledge.ts","../src/resources/projects.ts","../src/resources/queue-items.ts","../src/resources/queues.ts","../src/resources/runs.ts","../src/resources/scorecards.ts","../src/resources/tasks.ts","../src/resources/variables.ts","../src/resources/workflow-apps.ts","../src/resources/workflows.ts","../src/client.ts","../src/auth/token-store.ts","../src/auth/create-client.ts"],"names":["generateMessageId"],"mappings":"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","file":"index.js","sourcesContent":["/** Prefix of Lunnoa Automate machine (service-account) API keys. */\nexport const API_KEY_PREFIX = 'lna_';\n\n/** Returns true when running inside a browser (or browser-like) environment. */\nexport function isBrowserEnvironment(): boolean {\n return typeof window !== 'undefined';\n}\n\n/**\n * API keys are server-to-server credentials. Shipping one to a browser exposes\n * the whole workspace the key is scoped to, so the SDK refuses outright.\n *\n * Browser apps must authenticate end users with a Lunnoa user JWT (Pattern B)\n * or proxy through their own backend which holds the key (Pattern A / BFF).\n */\nexport function assertApiKeyAllowedInEnvironment(apiKey: string): void {\n if (isBrowserEnvironment()) {\n throw new Error(\n 'Refusing to use a Lunnoa API key (lna_...) in a browser environment. ' +\n 'API keys are server-side credentials: anyone opening dev tools could read the key ' +\n 'and act as the service account across its whole workspace. ' +\n 'Either call the Lunnoa API from your own backend which holds the key (backend-for-frontend pattern), ' +\n 'or authenticate the end user with a Lunnoa user JWT and pass it as `accessToken`.',\n );\n }\n if (!apiKey.startsWith(API_KEY_PREFIX)) {\n throw new Error(\n `Invalid Lunnoa API key: expected it to start with \"${API_KEY_PREFIX}\". ` +\n 'If you are passing a user JWT, use the `accessToken` option instead of `apiKey`.',\n );\n }\n}\n","/** Error thrown for every non-2xx response from a Lunnoa Automate deployment. */\nexport class LunnoaApiError extends Error {\n /** HTTP status code of the failed response. */\n readonly status: number;\n /** Parsed JSON error body when the server returned one, otherwise the raw text. */\n readonly body: unknown;\n /** HTTP method of the failed request. */\n readonly method: string;\n /** Path of the failed request (without the base URL). */\n readonly path: string;\n\n constructor(args: {\n status: number;\n body: unknown;\n method: string;\n path: string;\n }) {\n const detail = extractMessage(args.body);\n super(\n `Lunnoa API request failed: ${args.method} ${args.path} → ${args.status}${detail ? ` (${detail})` : ''}`,\n );\n this.name = 'LunnoaApiError';\n this.status = args.status;\n this.body = args.body;\n this.method = args.method;\n this.path = args.path;\n }\n\n /** True for 401 responses (missing, revoked, or expired credential). */\n get isUnauthorized(): boolean {\n return this.status === 401;\n }\n\n /** True for 403 responses (missing permission or feature not licensed). */\n get isForbidden(): boolean {\n return this.status === 403;\n }\n\n /** True for 404 responses. */\n get isNotFound(): boolean {\n return this.status === 404;\n }\n\n /** True for 429 responses (rate limited). */\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === 'object') {\n const record = body as Record<string, unknown>;\n const candidate = record.message ?? record.error;\n if (typeof candidate === 'string') {\n return candidate;\n }\n if (Array.isArray(candidate)) {\n return candidate.filter((m) => typeof m === 'string').join('; ');\n }\n }\n if (typeof body === 'string' && body.length > 0 && body.length < 300) {\n return body;\n }\n return undefined;\n}\n","import { API_KEY_PREFIX, assertApiKeyAllowedInEnvironment } from './auth';\nimport { LunnoaApiError } from './errors';\nimport type { TokenStore } from '../auth/token-store';\n\nexport type FetchLike = (\n input: string | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface LunnoaClientOptions {\n /**\n * Base URL of the Lunnoa Automate deployment, e.g. `https://lunnoa.acme.example`.\n * Paths are appended under `/api/*`.\n */\n baseUrl: string;\n /**\n * Server-side machine credential (`lna_...`). Never usable in browsers —\n * the constructor throws if one is supplied while `window` exists.\n */\n apiKey?: string;\n /**\n * User JWT obtained from login / SSO. The supported credential for browser\n * applications. May be a function so refreshed tokens are picked up per request.\n *\n * Prefer {@link tokenStore} for Pattern B so login/refresh can persist tokens\n * and optionally auto-refresh on 401.\n */\n accessToken?: string | (() => string | Promise<string>);\n /**\n * Optional JWT store for Pattern B. When set, authenticated requests read\n * the access token from the store. Login / refresh helpers write back into it.\n */\n tokenStore?: TokenStore;\n /**\n * When true (default if `tokenStore` is set), a 401 triggers one\n * `POST /api/auth/refresh-token` attempt using the stored refresh token,\n * then retries the original request.\n */\n autoRefresh?: boolean;\n /** Custom fetch implementation (testing, polyfills, interceptors). */\n fetch?: FetchLike;\n /** Extra headers sent with every request. */\n headers?: Record<string, string>;\n}\n\nexport type QueryValue = string | number | boolean | undefined | null;\n\nexport interface RequestOptions {\n query?: Record<string, QueryValue>;\n body?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n /**\n * Return the raw Response instead of parsing JSON. Used by the streaming\n * module and endpoints that may legitimately return 204.\n */\n raw?: boolean;\n /**\n * Skip the Authorization header. Used for public auth endpoints\n * (login, refresh, SSO providers).\n */\n skipAuth?: boolean;\n /** Internal: set after an auto-refresh retry so we do not loop. */\n _retriedAfterRefresh?: boolean;\n}\n\n/**\n * Minimal typed HTTP layer shared by every resource namespace. Handles auth\n * header resolution, query serialisation, JSON parsing, and error mapping.\n */\nexport class HttpClient {\n readonly baseUrl: string;\n readonly tokenStore?: TokenStore;\n /** Underlying fetch (shared with AI SDK transports when needed). */\n readonly fetch: FetchLike;\n private readonly apiKey?: string;\n private readonly accessToken?: string | (() => string | Promise<string>);\n private readonly autoRefresh: boolean;\n private readonly defaultHeaders: Record<string, string>;\n private refreshInFlight: Promise<boolean> | null = null;\n\n constructor(options: LunnoaClientOptions) {\n if (!options.baseUrl) {\n throw new Error('LunnoaClient requires a baseUrl.');\n }\n if (!options.apiKey && !options.accessToken && !options.tokenStore) {\n throw new Error(\n 'LunnoaClient requires an apiKey (server-side), an accessToken (user JWT), or a tokenStore (Pattern B).',\n );\n }\n if (options.apiKey) {\n assertApiKeyAllowedInEnvironment(options.apiKey);\n }\n if (\n typeof options.accessToken === 'string' &&\n options.accessToken.startsWith(API_KEY_PREFIX)\n ) {\n throw new Error(\n 'The accessToken option received an lna_ API key. API keys must be passed as `apiKey` ' +\n '(and never in a browser); accessToken is for user JWTs only.',\n );\n }\n\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '');\n this.apiKey = options.apiKey;\n this.accessToken = options.accessToken;\n this.tokenStore = options.tokenStore;\n this.autoRefresh =\n options.autoRefresh ?? Boolean(options.tokenStore && !options.apiKey);\n this.fetch =\n options.fetch ?? (globalThis.fetch.bind(globalThis) as FetchLike);\n this.defaultHeaders = options.headers ?? {};\n }\n\n async resolveAuthHeader(): Promise<string> {\n if (this.apiKey) {\n return `Bearer ${this.apiKey}`;\n }\n if (this.tokenStore) {\n const fromStore = await this.tokenStore.getAccessToken();\n if (!fromStore) {\n throw new Error(\n 'No access token in the token store. Call lunnoa.auth.login(...) first, ' +\n 'or seed the store with setTokens / createMemoryTokenStore({ accessToken }).',\n );\n }\n return `Bearer ${fromStore}`;\n }\n const token =\n typeof this.accessToken === 'function'\n ? await this.accessToken()\n : this.accessToken;\n if (!token) {\n throw new Error('accessToken resolved to an empty value.');\n }\n return `Bearer ${token}`;\n }\n\n buildUrl(path: string, query?: Record<string, QueryValue>): string {\n const url = new URL(this.baseUrl + path);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n async request<T>(\n method: string,\n path: string,\n options: RequestOptions & { raw: true },\n ): Promise<Response>;\n async request<T>(\n method: string,\n path: string,\n options?: RequestOptions,\n ): Promise<T>;\n async request<T>(\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T | Response> {\n const url = this.buildUrl(path, options.query);\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...options.headers,\n };\n\n if (!options.skipAuth) {\n headers.Authorization = await this.resolveAuthHeader();\n }\n\n const init: RequestInit = { method, headers, signal: options.signal };\n if (options.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(options.body);\n }\n\n const response = await this.fetch(url, init);\n\n if (\n !response.ok &&\n response.status === 401 &&\n !options.skipAuth &&\n !options._retriedAfterRefresh &&\n this.autoRefresh &&\n this.tokenStore &&\n !this.apiKey\n ) {\n const refreshed = await this.tryRefreshAccessToken();\n if (refreshed) {\n return this.request<T>(method, path, {\n ...options,\n _retriedAfterRefresh: true,\n });\n }\n }\n\n if (!response.ok) {\n const body = await parseBodySafely(response);\n throw new LunnoaApiError({\n status: response.status,\n body,\n method,\n path,\n });\n }\n\n if (options.raw) {\n return response;\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await parseBodySafely(response)) as T;\n }\n\n get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, options);\n }\n\n post<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, options);\n }\n\n patch<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, options);\n }\n\n put<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, options);\n }\n\n delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, options);\n }\n\n /**\n * Single-flight refresh using the token store. Returns false when refresh\n * is impossible or fails (store is cleared on failure).\n */\n async tryRefreshAccessToken(): Promise<boolean> {\n if (!this.tokenStore) {\n return false;\n }\n if (!this.refreshInFlight) {\n this.refreshInFlight = this.performRefresh().finally(() => {\n this.refreshInFlight = null;\n });\n }\n return this.refreshInFlight;\n }\n\n private async performRefresh(): Promise<boolean> {\n const refreshToken = await this.tokenStore!.getRefreshToken();\n if (!refreshToken) {\n return false;\n }\n\n try {\n const url = this.buildUrl('/api/auth/refresh-token');\n const response = await this.fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refreshToken }),\n });\n if (!response.ok) {\n await this.tokenStore!.clear();\n return false;\n }\n const body = (await parseBodySafely(response)) as {\n access_token?: string;\n };\n if (!body?.access_token) {\n await this.tokenStore!.clear();\n return false;\n }\n await this.tokenStore!.setTokens({ accessToken: body.access_token });\n return true;\n } catch {\n await this.tokenStore!.clear();\n return false;\n }\n }\n}\n\nasync function parseBodySafely(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) {\n return undefined;\n }\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","/**\n * Minimal Server-Sent Events parser.\n *\n * Takes the byte stream of a `text/event-stream` response and yields the\n * `data:` payload of each event. Comment lines (keep-alive `:` pings sent by\n * the Lunnoa server every 15s) and other fields are ignored. Multi-line\n * `data:` fields are joined with `\\n` per the SSE specification.\n */\nexport async function* parseSseStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<string, void, undefined> {\n for await (const event of parseSseEvents(stream)) {\n if (event.data !== null) {\n yield event.data;\n }\n }\n}\n\nexport interface SseEvent {\n /** SSE `event:` field, or `\"message\"` when omitted. */\n event: string;\n /** Joined `data:` payload, or null when the frame had no data lines. */\n data: string | null;\n}\n\n/**\n * Like {@link parseSseStream}, but preserves the SSE event name.\n * Used by execution progress streams (`execution.progress`, `loop.progress`, …).\n */\nexport async function* parseSseEvents(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SseEvent, void, undefined> {\n const reader = stream.getReader();\n const decoder = new TextDecoder('utf-8', { fatal: false });\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n\n // Events are separated by a blank line. Normalise CRLF first.\n buffer = buffer.replace(/\\r\\n/g, '\\n');\n let boundary = buffer.indexOf('\\n\\n');\n while (boundary !== -1) {\n const rawEvent = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf('\\n\\n');\n\n const parsed = extractEvent(rawEvent);\n if (parsed.data !== null || parsed.event !== 'message') {\n yield parsed;\n }\n }\n }\n\n // Flush a trailing event without a final blank line (lenient).\n const remaining = buffer.trim();\n if (remaining) {\n const parsed = extractEvent(remaining);\n if (parsed.data !== null || parsed.event !== 'message') {\n yield parsed;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction extractEvent(rawEvent: string): SseEvent {\n const dataLines: string[] = [];\n let eventName = 'message';\n\n for (const line of rawEvent.split('\\n')) {\n if (line.startsWith(':')) {\n continue; // SSE comment (keep-alive)\n }\n if (line.startsWith('event:')) {\n let value = line.slice('event:'.length);\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n if (value) {\n eventName = value;\n }\n continue;\n }\n if (line.startsWith('data:')) {\n let value = line.slice('data:'.length);\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n dataLines.push(value);\n }\n }\n\n return {\n event: eventName,\n data: dataLines.length === 0 ? null : dataLines.join('\\n'),\n };\n}\n","import type { UIMessage, UIMessageChunk } from 'ai';\n\nimport type { HttpClient } from '../core/http';\nimport { parseSseStream } from './sse';\n\nexport type ChatMode = 'builder' | 'preview';\n\nexport interface StreamMessageOptions {\n /** Agent chat mode; defaults to the server default (`builder`). */\n chatMode?: ChatMode;\n /** Optional image attachment forwarded with this turn. */\n data?: { imageUrl?: string };\n /**\n * Answer to an ask-before-sending personal-data prompt.\n * Applies to this message only.\n */\n piiResolution?: 'anonymize' | 'fallback';\n /** Abort the stream (closes the HTTP connection; the run keeps going server-side — call `stop` to cancel it). */\n signal?: AbortSignal;\n}\n\nexport interface StopStreamOptions {\n /**\n * Partial assistant message (AI SDK UIMessage) received so far; the server\n * persists it so the partial turn is not lost.\n */\n assistantMessage?: UIMessage;\n}\n\n/**\n * An in-flight agent chat turn, exposed as an async iterable of AI SDK\n * `UIMessageChunk`s (`text-delta`, `tool-*`, `finish`, ...).\n *\n * ```ts\n * const stream = await client.agentChat.streamMessage(agentId, taskId, message);\n * for await (const chunk of stream) {\n * if (chunk.type === 'text-delta') process.stdout.write(chunk.delta);\n * }\n * ```\n *\n * Use {@link AgentChatStream.toUIMessageStream} with the AI SDK's\n * `readUIMessageStream` to consume assembled `UIMessage` snapshots instead of\n * raw chunks.\n */\nexport class AgentChatStream implements AsyncIterable<UIMessageChunk> {\n /**\n * Server run id of this turn (`X-Task-Run-Id` response header), when\n * provided. Useful for diagnostics.\n */\n readonly runId: string | null;\n\n private consumed = false;\n\n constructor(\n private readonly response: Response,\n private readonly options?: { signal?: AbortSignal },\n ) {\n this.runId = response.headers.get('X-Task-Run-Id');\n }\n\n [Symbol.asyncIterator](): AsyncGenerator<UIMessageChunk, void, undefined> {\n return this.chunks();\n }\n\n async *chunks(): AsyncGenerator<UIMessageChunk, void, undefined> {\n if (this.consumed) {\n throw new Error('This AgentChatStream has already been consumed.');\n }\n this.consumed = true;\n\n const body = this.response.body;\n if (!body) {\n return;\n }\n\n for await (const data of parseSseStream(body)) {\n if (this.options?.signal?.aborted) {\n return;\n }\n if (data === '[DONE]') {\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n continue; // Skip malformed events rather than killing the stream.\n }\n if (parsed && typeof parsed === 'object' && 'type' in parsed) {\n yield parsed as UIMessageChunk;\n }\n }\n }\n\n /**\n * The same chunks as a web `ReadableStream`, ready for the AI SDK's\n * `readUIMessageStream({ stream })` to assemble into `UIMessage` snapshots.\n */\n toUIMessageStream(): ReadableStream<UIMessageChunk> {\n const iterator = this.chunks();\n return new ReadableStream<UIMessageChunk>({\n async pull(controller) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n async cancel() {\n await iterator.return();\n },\n });\n }\n\n /** Collects the full text of the turn (concatenated `text-delta` chunks). */\n async text(): Promise<string> {\n let text = '';\n for await (const chunk of this.chunks()) {\n if (chunk.type === 'text-delta' && typeof chunk.delta === 'string') {\n text += chunk.delta;\n }\n }\n return text;\n }\n}\n\n/**\n * Hand-written client for the Agent Runtime SSE endpoints\n * (`POST/GET /api/agents/:agentId/tasks/:taskId/stream-message` and `/stop`).\n * Code generators handle SSE poorly, so this module wraps the wire protocol\n * the bundled UI uses (AI SDK UIMessage chunks, SSE-framed, resumable).\n */\nexport class AgentChatClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Sends a user message to an agent task and streams the assistant turn.\n * Creates the task row when `taskId` does not exist yet (client-generated\n * UUIDs are supported, mirroring the bundled UI).\n *\n * `message` may be a plain string (wrapped into a UIMessage) or a full AI\n * SDK `UIMessage`.\n */\n async streamMessage(\n agentId: string,\n taskId: string,\n message: string | UIMessage,\n options: StreamMessageOptions = {},\n ): Promise<AgentChatStream> {\n const uiMessage: UIMessage =\n typeof message === 'string'\n ? {\n id: generateMessageId(),\n role: 'user',\n parts: [{ type: 'text', text: message }],\n }\n : message;\n\n const response = await this.http.request<Response>(\n 'POST',\n `/api/agents/${agentId}/tasks/${taskId}/stream-message`,\n {\n raw: true,\n signal: options.signal,\n headers: { Accept: 'text/event-stream' },\n body: messageTaskBody(uiMessage, options),\n },\n );\n\n return new AgentChatStream(response, { signal: options.signal });\n }\n\n /**\n * Reattaches to an in-flight agent turn after a disconnect (the resumable\n * stream replays from the beginning of the turn). Returns `null` when\n * there is no active stream to resume (server responds 204).\n */\n async resumeStream(\n agentId: string,\n taskId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<AgentChatStream | null> {\n const response = await this.http.request<Response>(\n 'GET',\n `/api/agents/${agentId}/tasks/${taskId}/stream-message`,\n {\n raw: true,\n signal: options.signal,\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (response.status === 204) {\n return null;\n }\n return new AgentChatStream(response, { signal: options.signal });\n }\n\n /**\n * Requests cancellation of the active agent turn for a task. Idempotent:\n * succeeds even when no stream is active. Optionally persists the partial\n * assistant message received so far.\n */\n async stop(\n agentId: string,\n taskId: string,\n options: StopStreamOptions = {},\n ): Promise<{ ok: boolean }> {\n return this.http.post<{ ok: boolean }>(\n `/api/agents/${agentId}/tasks/${taskId}/stream-message/stop`,\n {\n body: options.assistantMessage\n ? { assistantMessage: options.assistantMessage }\n : {},\n },\n );\n }\n}\n\nexport function messageTaskBody(\n message: UIMessage,\n options: Omit<StreamMessageOptions, 'signal'> = {},\n) {\n return {\n messages: [message],\n ...(options.chatMode ? { chatMode: options.chatMode } : {}),\n ...(options.data ? { data: options.data } : {}),\n ...(options.piiResolution ? { piiResolution: options.piiResolution } : {}),\n };\n}\n\nfunction generateMessageId(): string {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n","import type { HttpClient } from '../core/http';\nimport type { Execution, RunActionResult } from '../types';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface RunActionOptions {\n /** Workflow app id (catalogue slug), e.g. `http`, `gmail`. */\n appId: string;\n /** Action id within the app, e.g. `http_action_send-request`. */\n actionId: string;\n /**\n * Connection instance UUID (`Connection.id`). Required when the action needs\n * a connection and the workspace has more than one for the app. When omitted\n * and exactly one connection exists, the platform uses that connection.\n */\n connectionId?: string;\n /**\n * Project UUID for variable/project scoping. Required when the workspace has\n * more than one project.\n */\n projectId?: string;\n /** Action input fields (keys from the action `inputConfig`). */\n input?: Record<string, unknown>;\n /** Optional display name for the ad-hoc Execution. */\n name?: string;\n}\n\nexport class ActionsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /**\n * Run a single catalogue action as a one-step ad-hoc Execution (`source: SDK`).\n *\n * The platform runs the action synchronously and returns the execution id\n * plus status/output/executionPath. You can also poll\n * {@link ExecutionsResource.get} / {@link ExecutionsResource.waitUntilFinished}\n * with the returned id.\n *\n * Discover `appId` / `actionId` / `inputConfig` via `workflowApps.list()`.\n */\n run(options: RunActionOptions): Promise<RunActionResult> {\n return this.http.post<RunActionResult>('/api/actions/run', {\n body: options,\n });\n }\n\n /**\n * Convenience: run the action and wait until the Execution reaches a\n * terminal status (or pauses in `NEEDS_INPUT`). Prefer {@link run} when the\n * synchronous response is enough.\n */\n async runAndWait(\n options: RunActionOptions,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.run(options);\n return this.executions.waitUntilFinished(id, {\n ...waitOptions,\n expansion: [\n 'executionPath',\n 'source',\n ...(waitOptions?.expansion ?? []),\n ],\n });\n }\n\n /**\n * Thin discovery helper: find one action definition from `workflowApps.list()`.\n * Prefer calling `workflowApps.list()` once and caching when looking up many\n * actions.\n */\n async get(\n appId: string,\n actionId: string,\n ): Promise<Record<string, unknown> | undefined> {\n const apps = await this.http.get<\n Array<{\n id?: string;\n actions?: Array<Record<string, unknown>>;\n }>\n >('/api/workflow-apps');\n const app = apps.find((a) => a.id === appId);\n return app?.actions?.find((action) => action.id === actionId);\n }\n}\n","/**\n * Pure typed definition factories for local workflow/agent authoring.\n * These do not call the network. Deploy with the CLI; run ad-hoc with `runs.start`.\n *\n * Not the same as `@lunnoa/toolkit` `createAction` / `createApp` (in-platform apps).\n */\n\nexport const DEFINE_KINDS = {\n connection: 'connection',\n aiConnection: 'aiConnection',\n action: 'action',\n workflow: 'workflow',\n agent: 'agent',\n entityType: 'entityType',\n} as const;\n\nexport type DefineKind = (typeof DEFINE_KINDS)[keyof typeof DEFINE_KINDS];\n\n/** Ref to an existing app Connection (credentials stay on Lunnoa). */\nexport interface ConnectionDefinition {\n kind: typeof DEFINE_KINDS.connection;\n /** Connection instance UUID. Optional when the platform can resolve sole/default. */\n id?: string;\n}\n\n/** Ref to an existing AiProviderConnection. */\nexport interface AiConnectionDefinition {\n kind: typeof DEFINE_KINDS.aiConnection;\n /** AiProviderConnection UUID. Optional when platform AI defaults apply. */\n id?: string;\n}\n\nexport interface ActionDefinition {\n kind: typeof DEFINE_KINDS.action;\n /**\n * Catalogue action id, e.g. `http_action_send-request`.\n * Optionally `appId.actionId` (first segment before `.` used as appId when\n * `appId` is omitted and the id contains a dot that is not part of the\n * usual `_action_` pattern).\n */\n id: string;\n /** Workflow app id. Inferred from `id` when it matches `{app}_action_…`. */\n appId?: string;\n /** Optional Connection ref. Omit to let the platform resolve. */\n connection?: ConnectionDefinition;\n /** Default input merged at run/deploy time. */\n input?: Record<string, unknown>;\n name?: string;\n description?: string;\n}\n\nexport interface WorkflowStepDefinition {\n /** Action definition (or inline action-shaped object). */\n use: ActionDefinition;\n /** Per-step input overrides. */\n input?: Record<string, unknown>;\n name?: string;\n}\n\nexport interface WorkflowDefinition {\n kind: typeof DEFINE_KINDS.workflow;\n /** Stable project-scoped slug (upsert key). */\n slug: string;\n name?: string;\n description?: string;\n isActive?: boolean;\n /** Linear steps (v1; no branches). */\n steps: WorkflowStepDefinition[];\n}\n\nexport type AgentToolDefinition =\n | ActionDefinition\n | WorkflowDefinition\n | { use: ActionDefinition | WorkflowDefinition };\n\nexport interface AgentDefinition {\n kind: typeof DEFINE_KINDS.agent;\n /** Stable project-scoped slug (upsert key). */\n slug: string;\n name?: string;\n description?: string;\n /** Selected model id on the AI provider connection. */\n model: string;\n instructions: string;\n aiConnection?: AiConnectionDefinition;\n /** App Connection refs the agent may use for tools. */\n connections?: ConnectionDefinition[];\n /** Action and/or workflow tool refs. */\n tools?: AgentToolDefinition[];\n}\n\nexport function defineConnection(\n config: Omit<ConnectionDefinition, 'kind'> = {},\n): ConnectionDefinition {\n return { kind: DEFINE_KINDS.connection, ...config };\n}\n\nexport function defineAiConnection(\n config: Omit<AiConnectionDefinition, 'kind'> = {},\n): AiConnectionDefinition {\n return { kind: DEFINE_KINDS.aiConnection, ...config };\n}\n\nexport function defineAction(\n config: Omit<ActionDefinition, 'kind'>,\n): ActionDefinition {\n if (!config.id?.trim()) {\n throw new Error('defineAction requires id (catalogue action id)');\n }\n return { kind: DEFINE_KINDS.action, ...config };\n}\n\nexport function defineWorkflow(\n config: Omit<WorkflowDefinition, 'kind'>,\n): WorkflowDefinition {\n if (!config.slug?.trim()) {\n throw new Error('defineWorkflow requires slug');\n }\n if (!config.steps?.length) {\n throw new Error('defineWorkflow requires at least one step');\n }\n return { kind: DEFINE_KINDS.workflow, ...config };\n}\n\nexport function defineAgent(\n config: Omit<AgentDefinition, 'kind'>,\n): AgentDefinition {\n if (!config.slug?.trim()) {\n throw new Error('defineAgent requires slug');\n }\n if (!config.model?.trim()) {\n throw new Error('defineAgent requires model');\n }\n if (config.instructions == null) {\n throw new Error('defineAgent requires instructions');\n }\n return { kind: DEFINE_KINDS.agent, ...config };\n}\n\nexport interface EntityTypeDefinition {\n kind: typeof DEFINE_KINDS.entityType;\n /** Stable deployment-wide slug (upsert key). Granted to the deployer's workspace when new. */\n slug: string;\n name?: string;\n namePlural?: string;\n description?: string;\n icon?: string;\n color?: string;\n /** Field definitions grouped into sections (same contract as Adminspace). */\n attributeSchema: Record<string, unknown>;\n stateSchema?: Record<string, unknown> | null;\n isEnabled?: boolean;\n /**\n * When false (default), entity writes reject undeclared attribute keys.\n * Reserved key `extensions` is always allowed as a JSON object.\n */\n allowUnknownAttributes?: boolean;\n}\n\nexport function defineEntityType(\n config: Omit<EntityTypeDefinition, 'kind'>,\n): EntityTypeDefinition {\n if (!config.slug?.trim()) {\n throw new Error('defineEntityType requires slug');\n }\n if (\n !config.attributeSchema ||\n typeof config.attributeSchema !== 'object' ||\n Array.isArray(config.attributeSchema)\n ) {\n throw new Error('defineEntityType requires attributeSchema object');\n }\n return {\n kind: DEFINE_KINDS.entityType,\n allowUnknownAttributes: false,\n ...config,\n };\n}\n\n/** Infer appId from catalogue action ids like `http_action_send-request`. */\nexport function resolveActionAppId(action: ActionDefinition): string {\n if (action.appId?.trim()) {\n return action.appId.trim();\n }\n const id = action.id.trim();\n const actionMarker = '_action_';\n const markerIndex = id.indexOf(actionMarker);\n if (markerIndex > 0) {\n return id.slice(0, markerIndex);\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(0, dot);\n }\n throw new Error(\n `Cannot infer appId for action \"${id}\". Pass appId explicitly.`,\n );\n}\n\nexport function resolveActionId(action: ActionDefinition): string {\n const id = action.id.trim();\n const appId = action.appId?.trim();\n if (appId && id.startsWith(`${appId}.`)) {\n return id.slice(appId.length + 1);\n }\n const marker = '_action_';\n if (id.includes(marker)) {\n return id;\n }\n const dot = id.indexOf('.');\n if (dot > 0) {\n return id.slice(dot + 1);\n }\n return id;\n}\n","import type { QueryValue } from '../core/http';\n\n/**\n * Standard list-query conventions shared by most Lunnoa list endpoints:\n *\n * - `expansion` — comma-separated field names to include beyond the defaults\n * - `filterBy` — comma-separated `key:value` pairs\n * - `includeType` — comma-separated inclusion flags (e.g. `all`, `internal`)\n */\nexport interface ListQueryOptions {\n expansion?: string | string[];\n filterBy?: string | Record<string, string>;\n includeType?: string | string[];\n}\n\nexport function serializeListQuery(\n options: ListQueryOptions = {},\n): Record<string, QueryValue> {\n return {\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy(options.filterBy),\n includeType: serializeCsv(options.includeType),\n };\n}\n\nexport function serializeCsv(\n value: string | string[] | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return Array.isArray(value) ? value.join(',') : value;\n}\n\nexport function serializeFilterBy(\n value: string | Record<string, string> | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value === 'string') {\n return value;\n }\n return Object.entries(value)\n .map(([key, filterValue]) => `${key}:${filterValue}`)\n .join(',');\n}\n","import type { HttpClient } from '../core/http';\nimport type { Agent } from '../types';\nimport type {\n ActionDefinition,\n AgentDefinition,\n AgentToolDefinition,\n WorkflowDefinition,\n} from '../define';\nimport {\n DEFINE_KINDS,\n resolveActionAppId,\n resolveActionId,\n} from '../define';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport interface UpsertAgentToolInput {\n appId: string;\n actionId: string;\n connectionId?: string;\n name?: string;\n description?: string;\n input?: Record<string, unknown>;\n}\n\nexport interface UpsertAgentBySlugInput {\n slug: string;\n name?: string;\n description?: string;\n instructions: string;\n model: string;\n aiConnectionId?: string;\n connectionIds?: string[];\n workflowIds?: string[];\n tools?: UpsertAgentToolInput[];\n managedByCode?: boolean;\n}\n\nfunction unwrapTool(\n tool: AgentToolDefinition,\n): ActionDefinition | WorkflowDefinition {\n if ('use' in tool && tool.use) {\n return tool.use;\n }\n return tool as ActionDefinition | WorkflowDefinition;\n}\n\nexport function agentDefinitionToUpsert(\n def: AgentDefinition,\n options?: { workflowIds?: string[] },\n): UpsertAgentBySlugInput {\n const tools: UpsertAgentToolInput[] = [];\n const workflowIds = [...(options?.workflowIds ?? [])];\n\n for (const tool of def.tools ?? []) {\n const unwrapped = unwrapTool(tool);\n if (unwrapped.kind === DEFINE_KINDS.workflow) {\n // Workflow tools are linked via AgentWorkflow (workflowIds), not tools[].\n // Callers should deploy workflows first and pass resolved UUIDs.\n continue;\n }\n if (unwrapped.kind === DEFINE_KINDS.action) {\n tools.push({\n appId: resolveActionAppId(unwrapped),\n actionId: resolveActionId(unwrapped),\n connectionId: unwrapped.connection?.id,\n name: unwrapped.name,\n description: unwrapped.description,\n input: unwrapped.input,\n });\n }\n }\n\n return {\n slug: def.slug,\n name: def.name,\n description: def.description,\n instructions: def.instructions,\n model: def.model,\n aiConnectionId: def.aiConnection?.id,\n connectionIds: def.connections\n ?.map((c) => c.id)\n .filter((id): id is string => Boolean(id)),\n workflowIds: workflowIds.length ? workflowIds : undefined,\n tools,\n managedByCode: true,\n };\n}\n\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists agents visible to the caller in the current workspace. */\n list(options?: ListQueryOptions): Promise<Agent[]> {\n return this.http.get<Agent[]>('/api/agents', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single agent. */\n get(agentId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Agent> {\n return this.http.get<Agent>(`/api/agents/${agentId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Upsert an agent by project-scoped slug.\n * Prefer the CLI (`npx @lunnoa/client agents deploy`) for happy-path deploy.\n */\n upsertBySlug(\n projectId: string,\n body: UpsertAgentBySlugInput | AgentDefinition,\n options?: { workflowIds?: string[] },\n ): Promise<Agent> {\n const payload =\n 'kind' in body && body.kind === 'agent'\n ? agentDefinitionToUpsert(body, options)\n : body;\n return this.http.post<Agent>(`/api/projects/${projectId}/agents/upsert`, {\n body: payload,\n });\n }\n}\n","/**\n * Tokens returned by login / 2FA / login-with-token.\n * Mapped from the wire format (`access_token` / `refresh_token`).\n */\nexport interface AuthTokens {\n accessToken: string;\n refreshToken: string;\n}\n\n/** Successful password login without 2FA, or after 2FA / token exchange. */\nexport type LoginSuccess = AuthTokens;\n\n/**\n * Password login when the user has 2FA enabled.\n * Call {@link AuthResource.verify2faLogin} with the session token and TOTP/backup code.\n */\nexport interface LoginRequires2FA {\n requires2FA: true;\n sessionToken: string;\n}\n\nexport type LoginResult = LoginSuccess | LoginRequires2FA;\n\nexport function isLoginRequires2FA(\n result: LoginResult,\n): result is LoginRequires2FA {\n return 'requires2FA' in result && result.requires2FA === true;\n}\n\n/** Wire payload from `POST /api/auth/login` (and related). */\nexport type LoginWireResponse =\n | {\n access_token: string;\n refresh_token: string;\n }\n | {\n requires2FA: true;\n sessionToken: string;\n };\n\n/** Wire payload from `POST /api/auth/refresh-token`. */\nexport interface RefreshWireResponse {\n access_token: string;\n refresh_token?: string;\n}\n\n/** Public SSO discovery from `GET /api/auth/sso/providers`. */\nexport interface SsoProvidersResponse {\n providers: SsoProviderSummary[];\n passwordAuthDisabled: boolean;\n googleAuthDisabled: boolean;\n ssoEnforced: boolean;\n}\n\nexport interface SsoProviderSummary {\n id: string;\n name: string;\n buttonLabel: string | null;\n}\n\n/**\n * Current user from `GET /api/users/me`.\n * Password is never returned.\n */\nexport interface CurrentUser {\n id: string;\n email: string;\n name: string | null;\n createdAt?: string;\n updatedAt?: string;\n rootProfileImageUrl?: string | null;\n emailVerifiedAt?: string | null;\n toursCompleted?: unknown;\n hasPassword?: boolean;\n ssoProviders?: string[];\n}\n\nexport function mapWireTokens(wire: {\n access_token: string;\n refresh_token?: string;\n}): { accessToken: string; refreshToken?: string } {\n return {\n accessToken: wire.access_token,\n ...(wire.refresh_token !== undefined\n ? { refreshToken: wire.refresh_token }\n : {}),\n };\n}\n\nexport function mapLoginWire(wire: LoginWireResponse): LoginResult {\n if ('requires2FA' in wire && wire.requires2FA) {\n return {\n requires2FA: true,\n sessionToken: wire.sessionToken,\n };\n }\n const tokens = wire as { access_token: string; refresh_token: string };\n return {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n };\n}\n","import {\n isLoginRequires2FA,\n mapLoginWire,\n mapWireTokens,\n type AuthTokens,\n type CurrentUser,\n type LoginResult,\n type LoginWireResponse,\n type RefreshWireResponse,\n type SsoProvidersResponse,\n} from '../auth/types';\nimport type { TokenStore } from '../auth/token-store';\nimport type { HttpClient } from '../core/http';\n\n/**\n * Login, refresh, SSO discovery, and session helpers for Pattern B.\n *\n * Password login, token exchange, refresh, and SSO provider listing are\n * **public** endpoints (no Bearer). `me()` requires a user JWT.\n *\n * There is no server logout endpoint: {@link AuthResource.logout} only clears\n * the configured {@link TokenStore}.\n */\nexport class AuthResource {\n readonly sso: SsoAuthResource;\n\n constructor(\n private readonly http: HttpClient,\n private readonly tokenStore?: TokenStore,\n ) {\n this.sso = new SsoAuthResource(http);\n }\n\n /**\n * `POST /api/auth/login`\n *\n * On success without 2FA, tokens are written to the token store (when set).\n * When 2FA is required, returns `{ requires2FA, sessionToken }` and does not\n * store tokens until {@link verify2faLogin} succeeds.\n */\n async login(input: {\n email: string;\n password: string;\n }): Promise<LoginResult> {\n const wire = await this.http.post<LoginWireResponse>('/api/auth/login', {\n body: { email: input.email, password: input.password },\n skipAuth: true,\n });\n const result = mapLoginWire(wire);\n if (!isLoginRequires2FA(result)) {\n await this.persistTokens(result);\n }\n return result;\n }\n\n /**\n * `POST /api/auth/2fa/verify-login`\n *\n * Completes password login after TOTP or backup-code verification.\n */\n async verify2faLogin(input: {\n sessionToken: string;\n token: string;\n }): Promise<AuthTokens> {\n const wire = await this.http.post<LoginWireResponse>(\n '/api/auth/2fa/verify-login',\n {\n body: {\n sessionToken: input.sessionToken,\n token: input.token,\n },\n skipAuth: true,\n },\n );\n const result = mapLoginWire(wire);\n if (isLoginRequires2FA(result)) {\n throw new Error(\n 'Unexpected 2FA challenge after verify2faLogin; expected access and refresh tokens.',\n );\n }\n await this.persistTokens(result);\n return result;\n }\n\n /**\n * `POST /api/auth/login-with-token`\n *\n * Exchanges a short-lived hidden JWT (SSO callback or email verification)\n * for access and refresh tokens.\n */\n async loginWithToken(input: { token: string }): Promise<AuthTokens> {\n const wire = await this.http.post<{\n access_token: string;\n refresh_token: string;\n }>('/api/auth/login-with-token', {\n body: { token: input.token },\n skipAuth: true,\n });\n const tokens: AuthTokens = {\n accessToken: wire.access_token,\n refreshToken: wire.refresh_token,\n };\n await this.persistTokens(tokens);\n return tokens;\n }\n\n /**\n * `POST /api/auth/refresh-token`\n *\n * Returns a new access token. The refresh token itself is not rotated.\n * When a token store is configured and `refreshToken` is omitted, the\n * stored refresh token is used.\n */\n async refresh(input?: { refreshToken?: string }): Promise<{\n accessToken: string;\n }> {\n const refreshToken =\n input?.refreshToken ?? (await this.tokenStore?.getRefreshToken()) ?? null;\n if (!refreshToken) {\n throw new Error(\n 'auth.refresh requires a refreshToken argument or a token store that holds one.',\n );\n }\n\n const wire = await this.http.post<RefreshWireResponse>(\n '/api/auth/refresh-token',\n {\n body: { refreshToken },\n skipAuth: true,\n },\n );\n const mapped = mapWireTokens(wire);\n if (this.tokenStore) {\n await this.tokenStore.setTokens({\n accessToken: mapped.accessToken,\n // Keep existing refresh token; refresh responses omit it.\n refreshToken: mapped.refreshToken,\n });\n }\n return { accessToken: mapped.accessToken };\n }\n\n /**\n * `GET /api/users/me` — current user profile for the active JWT.\n */\n me(): Promise<CurrentUser> {\n return this.http.get<CurrentUser>('/api/users/me');\n }\n\n /**\n * Clears tokens from the token store.\n * There is no server-side logout endpoint; access tokens remain valid until expiry\n * (or until the user's `tokensValidFrom` watermark invalidates them).\n */\n async logout(): Promise<void> {\n await this.tokenStore?.clear();\n }\n\n /** True when the token store has an access token (sync stores only wait on Promise). */\n async hasSession(): Promise<boolean> {\n const token = await this.tokenStore?.getAccessToken();\n return Boolean(token);\n }\n\n private async persistTokens(tokens: AuthTokens): Promise<void> {\n if (!this.tokenStore) {\n return;\n }\n await this.tokenStore.setTokens({\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken,\n });\n }\n}\n\n/**\n * SSO discovery and login URL helpers.\n *\n * Browser SSO callbacks redirect to the deployment's `CLIENT_URL/verify-token`,\n * not to an arbitrary custom origin. Custom portals typically complete the\n * exchange with {@link AuthResource.loginWithToken} after receiving the hidden\n * token (for example via a BFF that can see the verify-token page, or by\n * setting `CLIENT_URL` to the custom app).\n */\nexport class SsoAuthResource {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /api/auth/sso/providers` (public). */\n listProviders(): Promise<SsoProvidersResponse> {\n return this.http.get<SsoProvidersResponse>('/api/auth/sso/providers', {\n skipAuth: true,\n });\n }\n\n /**\n * Absolute URL for `GET /api/auth/sso/:providerId/login`.\n * Navigate the browser here to start the OIDC redirect.\n */\n getLoginUrl(providerId: string): string {\n if (!providerId) {\n throw new Error('sso.getLoginUrl requires a providerId.');\n }\n return this.http.buildUrl(\n `/api/auth/sso/${encodeURIComponent(providerId)}/login`,\n );\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { Connection } from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class ConnectionsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists connections in the workspace. */\n list(options?: ListQueryOptions): Promise<Connection[]> {\n return this.http.get<Connection[]>('/api/connections', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single connection (secrets are never included). */\n get(\n connectionId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Connection> {\n return this.http.get<Connection>(`/api/connections/${connectionId}`, {\n query: serializeListQuery(options),\n });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { EnabledFeatures } from '../types';\n\nexport class DiscoveryResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Returns the deployment's feature flags (storage, vector database, email,\n * SSO, edition gating), letting a custom UI adapt to what is enabled.\n */\n enabledFeatures(): Promise<EnabledFeatures> {\n return this.http.get<EnabledFeatures>('/api/discovery/enabled-features');\n }\n}\n","/** Pagination block returned by page-based list endpoints (entities). */\nexport interface PagePagination {\n page: number;\n pageSize: number;\n totalCount: number;\n totalPages: number;\n}\n\n/** Pagination block returned by offset-based list endpoints (queue items). */\nexport interface OffsetPagination {\n total: number;\n limit: number;\n offset: number;\n hasMore?: boolean;\n}\n\n/**\n * Iterates every item of a page-based (`page`/`pageSize`) paginated endpoint,\n * fetching pages lazily as the consumer advances.\n */\nexport async function* iteratePages<T>(\n fetchPage: (page: number) => Promise<{ data: T[]; pagination: PagePagination }>,\n): AsyncGenerator<T, void, undefined> {\n let page = 1;\n while (true) {\n const { data, pagination } = await fetchPage(page);\n for (const item of data) {\n yield item;\n }\n if (page >= pagination.totalPages || data.length === 0) {\n return;\n }\n page += 1;\n }\n}\n\n/**\n * Iterates every item of an offset-based (`limit`/`offset`) paginated\n * endpoint, fetching batches lazily as the consumer advances.\n */\nexport async function* iterateOffset<T>(\n fetchBatch: (offset: number) => Promise<{ items: T[]; pagination: OffsetPagination }>,\n): AsyncGenerator<T, void, undefined> {\n let offset = 0;\n while (true) {\n const { items, pagination } = await fetchBatch(offset);\n for (const item of items) {\n yield item;\n }\n offset += items.length;\n const exhausted =\n items.length === 0 ||\n (pagination.hasMore !== undefined\n ? !pagination.hasMore\n : offset >= pagination.total);\n if (exhausted) {\n return;\n }\n }\n}\n","import type { HttpClient, QueryValue } from '../core/http';\nimport { iteratePages } from '../core/pagination';\nimport type {\n ChangeEntityStateInput,\n ChangeEntityStateResult,\n CreateEntityInput,\n Entity,\n EntityStateHistoryEntry,\n EntityStateTransitions,\n ImportEntitiesResult,\n ImportTemplate,\n PaginatedEntities,\n UpdateEntityInput,\n} from '../types';\nimport { serializeCsv } from './common';\n\nexport interface ListEntitiesOptions {\n /** Filter by entity type ID. */\n objectTypeId?: string;\n /** Filter by entity type slug (alternative to objectTypeId). */\n objectTypeSlug?: string;\n /** Filter by a single state. */\n state?: string;\n /** Filter by several states (comma-separated server-side). */\n states?: string[];\n /** Free-text search over entity names. */\n search?: string;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n /** 1-based page number. */\n page?: number;\n /** Items per page (max 100). */\n pageSize?: number;\n /** Fields to expand, e.g. `['attributes', 'objectType']`. */\n expansion?: string | string[];\n}\n\nexport interface ImportEntitiesInput {\n entityTypeId: string;\n columnMappings: Array<{\n sourceColumn: string;\n targetFieldId: string;\n transform?: 'none' | 'date' | 'number' | 'boolean';\n }>;\n rows: Array<Record<string, string>>;\n updateExisting?: boolean;\n matchField?: string;\n}\n\nexport interface ExportEntitiesInput {\n entityTypeId: string;\n fieldIds: string[];\n filters?: Array<{ fieldId: string; operator: string; value: unknown }>;\n format?: 'csv' | 'xlsx';\n}\n\n/**\n * Entities (the platform calls them Objects internally): the structured data\n * layer custom UIs query heavily. Attribute values are keyed by field ID as\n * defined on the entity type's `attributeSchema` — run\n * `npx @lunnoa/client codegen` against your deployment for fully typed,\n * per-entity-type accessors.\n */\nexport class EntitiesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Returns one page of entities matching the filter. */\n list(options: ListEntitiesOptions = {}): Promise<PaginatedEntities> {\n return this.http.get<PaginatedEntities>('/api/objects', {\n query: this.serializeListOptions(options),\n });\n }\n\n /**\n * Async-iterates every entity matching the filter, fetching pages lazily.\n *\n * ```ts\n * for await (const invoice of client.entities.iterate({ objectTypeSlug: 'invoice' })) { ... }\n * ```\n */\n iterate(\n options: Omit<ListEntitiesOptions, 'page'> = {},\n ): AsyncGenerator<Entity, void, undefined> {\n return iteratePages<Entity>(async (page) => {\n const result = await this.list({ ...options, page });\n return { data: result.data ?? [], pagination: result.pagination };\n });\n }\n\n /** Returns a single entity. Request `expansion: ['attributes']` for field values. */\n get(\n entityId: string,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.get<Entity>(`/api/objects/${entityId}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Creates an entity. `attributes` are keyed by field ID. */\n create(\n data: CreateEntityInput,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.post<Entity>('/api/objects', {\n body: data,\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Partially updates an entity; supplied attributes are merged. */\n update(\n entityId: string,\n data: UpdateEntityInput,\n options: { expansion?: string | string[] } = {},\n ): Promise<Entity> {\n return this.http.patch<Entity>(`/api/objects/${entityId}`, {\n body: data,\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Soft-deletes an entity. */\n delete(entityId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/objects/${entityId}`);\n }\n\n /** Moves an entity to a new state (validated against the type's state machine). */\n changeState(\n entityId: string,\n data: ChangeEntityStateInput,\n ): Promise<ChangeEntityStateResult> {\n return this.http.post<ChangeEntityStateResult>(\n `/api/objects/${entityId}/state`,\n { body: data },\n );\n }\n\n /** Returns the entity's state changes, newest first. */\n getStateHistory(\n entityId: string,\n options: { limit?: number } = {},\n ): Promise<EntityStateHistoryEntry[]> {\n return this.http.get<EntityStateHistoryEntry[]>(\n `/api/objects/${entityId}/state/history`,\n { query: { limit: options.limit } },\n );\n }\n\n /** Returns the current state and the transitions allowed from it. */\n getStateTransitions(entityId: string): Promise<EntityStateTransitions> {\n return this.http.get<EntityStateTransitions>(\n `/api/objects/${entityId}/state/transitions`,\n );\n }\n\n /** Imports pre-parsed rows into an entity type (SuperAdmin only). */\n import(data: ImportEntitiesInput): Promise<ImportEntitiesResult> {\n return this.http.post<ImportEntitiesResult>('/api/objects/import', {\n body: data,\n });\n }\n\n /** Exports entities of a type as flat JSON rows. */\n export(data: ExportEntitiesInput): Promise<Array<Record<string, unknown>>> {\n return this.http.post<Array<Record<string, unknown>>>(\n '/api/objects/export',\n { body: data },\n );\n }\n\n /** Returns the column headers and a sample row for importing (SuperAdmin only). */\n getImportTemplate(entityTypeId: string): Promise<ImportTemplate> {\n return this.http.get<ImportTemplate>(\n `/api/objects/import/template/${entityTypeId}`,\n );\n }\n\n private serializeListOptions(\n options: ListEntitiesOptions,\n ): Record<string, QueryValue> {\n return {\n objectTypeId: options.objectTypeId,\n objectTypeSlug: options.objectTypeSlug,\n state: options.state,\n states: options.states?.join(','),\n search: options.search,\n sortBy: options.sortBy,\n sortOrder: options.sortOrder,\n page: options.page,\n pageSize: options.pageSize,\n expansion: serializeCsv(options.expansion),\n };\n }\n}\n","import type { EntityTypeDefinition as DefineEntityTypeDefinition } from '../define';\nimport type { HttpClient } from '../core/http';\nimport type { EntityType } from '../types';\nimport { serializeCsv } from './common';\n\nexport interface EntityTypeReadOptions {\n /** Fields to expand, e.g. `['attributeSchema', 'stateSchema', 'description']`. */\n expansion?: string | string[];\n}\n\n/** Payload for `POST /api/object-types/upsert`. */\nexport interface UpsertEntityTypeBySlugInput {\n slug: string;\n name?: string;\n namePlural?: string;\n description?: string;\n icon?: string;\n color?: string;\n attributeSchema: Record<string, unknown>;\n stateSchema?: Record<string, unknown> | null;\n isEnabled?: boolean;\n allowUnknownAttributes?: boolean;\n managedByCode?: boolean;\n}\n\nexport function entityTypeDefinitionToUpsert(\n def: DefineEntityTypeDefinition,\n): UpsertEntityTypeBySlugInput {\n return {\n slug: def.slug,\n name: def.name,\n namePlural: def.namePlural,\n description: def.description,\n icon: def.icon,\n color: def.color,\n attributeSchema: def.attributeSchema,\n stateSchema: def.stateSchema,\n isEnabled: def.isEnabled,\n allowUnknownAttributes: def.allowUnknownAttributes ?? false,\n managedByCode: true,\n };\n}\n\nexport class EntityTypesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Lists entity types granted to the API key's workspace. Request\n * `expansion: ['attributeSchema', 'stateSchema']` for the field and state\n * machine definitions the codegen CLI builds types from.\n */\n list(\n options: EntityTypeReadOptions & { includeDisabled?: boolean } = {},\n ): Promise<EntityType[]> {\n return this.http.get<EntityType[]>('/api/object-types', {\n query: {\n includeDisabled: options.includeDisabled,\n expansion: serializeCsv(options.expansion),\n },\n });\n }\n\n /** Returns a single entity type by ID. */\n get(id: string, options: EntityTypeReadOptions = {}): Promise<EntityType> {\n return this.http.get<EntityType>(`/api/object-types/${id}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Returns a single entity type by its URL-safe slug. */\n getBySlug(\n slug: string,\n options: EntityTypeReadOptions = {},\n ): Promise<EntityType> {\n return this.http.get<EntityType>(`/api/object-types/slug/${slug}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /**\n * Creates or updates an entity type by deployment-wide slug.\n * A new slug is granted to the API key's workspace. A slug already shared\n * with another workspace is rejected unless the key belongs to a platform admin.\n * Prefer the CLI (`npx @lunnoa/client entity-types deploy`) for happy-path deploy.\n */\n upsertBySlug(\n definition: DefineEntityTypeDefinition | UpsertEntityTypeBySlugInput,\n ): Promise<EntityType> {\n const payload =\n 'kind' in definition && definition.kind === 'entityType'\n ? entityTypeDefinitionToUpsert(definition)\n : (definition as UpsertEntityTypeBySlugInput);\n\n return this.http.post<EntityType>('/api/object-types/upsert', {\n body: payload,\n query: {\n expansion: 'attributeSchema,stateSchema,description',\n },\n });\n }\n}\n","import type { HttpClient } from '../core/http';\n\nexport type EligibleApprover = {\n workspaceUserId: string;\n email: string;\n name?: string;\n};\n\nexport type ApprovalInboxItem = {\n approvalId: string;\n executionId: string;\n nodeId: string;\n title: string;\n status: string;\n requiredCount: number;\n receivedApprovals: number;\n expiresAt?: string;\n createdAt?: string;\n updatedAt?: string;\n canDecide?: boolean;\n executionNumber?: number;\n workflow?: { id: string; name: string };\n project?: { id: string; name: string };\n myDecision?: {\n decision: string;\n comment?: string;\n decidedAt?: string;\n };\n /** People who can still decide. */\n eligibleApprovers?: EligibleApprover[];\n approval?: Record<string, unknown>;\n};\n\n/**\n * Authenticated Approvals inbox helpers (workspace API; not Public API v1).\n */\nexport class ApprovalsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * @param options.status `pending` (default) for actionable items, or `done` for history.\n */\n async inbox(options?: {\n status?: 'pending' | 'done' | string;\n }): Promise<{ items: ApprovalInboxItem[] }> {\n return this.http.get('/api/approvals/inbox', {\n query: { status: options?.status ?? 'pending' },\n });\n }\n\n async decide(\n approvalId: string,\n body: {\n decision: 'approved' | 'rejected';\n comment?: string;\n },\n ): Promise<{\n executionId: string;\n nodeId: string;\n approvalId?: string;\n terminal: boolean;\n canDecide: boolean;\n approval: Record<string, unknown>;\n }> {\n return this.http.post(`/api/approvals/${approvalId}/decide`, { body });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { LunnoaApiError } from '../core/errors';\nimport { parseSseEvents } from './sse';\nimport type { ExecutionPathStep, ExecutionStatus } from '../types';\n\nexport type ExecutionStreamEventType =\n | 'connected'\n | 'heartbeat'\n | 'execution.progress'\n | 'execution.finished'\n | 'execution.error'\n | 'loop.progress'\n | string;\n\nexport interface ExecutionProgressPayload {\n executionId: string;\n status: ExecutionStatus | string | null;\n statusMessage: string | null;\n name: string | null;\n source: string | null;\n startedAt?: string;\n stoppedAt?: string | null;\n executionPath: ExecutionPathStep[];\n pendingInput?: unknown;\n output?: unknown;\n}\n\nexport interface ExecutionStreamEvent {\n event: ExecutionStreamEventType;\n data: Record<string, unknown>;\n}\n\nexport interface WatchProgressOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Opens `GET /api/executions/:id/stream` and yields typed SSE events.\n * Prefer {@link ExecutionsResource.watchProgress} for timeline UIs.\n */\nexport class ExecutionProgressStream implements AsyncIterable<ExecutionStreamEvent> {\n private consumed = false;\n\n constructor(\n private readonly response: Response,\n private readonly options?: WatchProgressOptions,\n ) {}\n\n [Symbol.asyncIterator](): AsyncGenerator<ExecutionStreamEvent, void, undefined> {\n return this.events();\n }\n\n async *events(): AsyncGenerator<ExecutionStreamEvent, void, undefined> {\n if (this.consumed) {\n throw new Error('This ExecutionProgressStream has already been consumed.');\n }\n this.consumed = true;\n\n const body = this.response.body;\n if (!body) {\n return;\n }\n\n for await (const frame of parseSseEvents(body)) {\n if (this.options?.signal?.aborted) {\n return;\n }\n if (frame.data === null) {\n continue;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(frame.data);\n } catch {\n continue;\n }\n if (!parsed || typeof parsed !== 'object') {\n continue;\n }\n yield {\n event: frame.event,\n data: parsed as Record<string, unknown>,\n };\n if (frame.event === 'execution.finished' || frame.event === 'execution.error') {\n return;\n }\n }\n }\n}\n\nexport async function openExecutionStream(\n http: HttpClient,\n executionId: string,\n options?: WatchProgressOptions,\n): Promise<ExecutionProgressStream> {\n const response = await http.request('GET', `/api/executions/${executionId}/stream`, {\n raw: true,\n signal: options?.signal,\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => undefined);\n let parsed: unknown = body;\n try {\n parsed = body ? JSON.parse(body) : undefined;\n } catch {\n // keep text\n }\n throw new LunnoaApiError({\n status: response.status,\n body: parsed,\n method: 'GET',\n path: `/api/executions/${executionId}/stream`,\n });\n }\n\n return new ExecutionProgressStream(response, options);\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n ExecuteWorkflowResult,\n Execution,\n ExecutionPathStep,\n ExecutionStatus,\n WorkflowApp,\n} from '../types';\nimport {\n openExecutionStream,\n type ExecutionProgressPayload,\n type ExecutionProgressStream,\n type WatchProgressOptions,\n} from '../streaming/execution-progress';\nimport { serializeListQuery, type ListQueryOptions } from './common';\nimport type { WorkflowAppsResource } from './workflow-apps';\n\n/** Execution statuses that end an execution. */\nconst TERMINAL_STATUSES: ReadonlySet<string> = new Set([\n 'SUCCESS',\n 'FAILED',\n 'CANCELLED',\n]);\n\nexport interface WaitUntilFinishedOptions {\n /** Give up after this long. Default: 10 minutes. */\n timeoutMs?: number;\n /** First delay between polls. Default: 500ms. */\n initialDelayMs?: number;\n /** Cap on the delay between polls. Default: 5s. */\n maxDelayMs?: number;\n /** Multiplier applied to the delay after each poll. Default: 1.5. */\n backoffFactor?: number;\n /**\n * Also stop waiting when the execution pauses in `NEEDS_INPUT` (so a form\n * can be shown). Default: true.\n */\n stopOnNeedsInput?: boolean;\n /** Extra expansion fields to request with each poll (always includes `status,statusMessage,output`). */\n expansion?: string[];\n signal?: AbortSignal;\n /** Injectable sleep, for tests. */\n sleep?: (ms: number) => Promise<void>;\n}\n\nexport class ExecutionTimeoutError extends Error {\n constructor(\n readonly executionId: string,\n readonly timeoutMs: number,\n ) {\n super(\n `Execution ${executionId} did not finish within ${timeoutMs}ms. It is still running server-side; keep polling executions.get() or increase timeoutMs.`,\n );\n this.name = 'ExecutionTimeoutError';\n }\n}\n\n/** One step in a timeline-ready progress snapshot. */\nexport interface ExecutionProgressStep extends ExecutionPathStep {\n /** App logo URL from the workflow-apps catalogue, when resolvable. */\n appLogoUrl?: string | null;\n /** Action/trigger icon URL from the catalogue, when resolvable. */\n iconUrl?: string | null;\n /** Duration in ms when both startTime and endTime are present. */\n durationMs?: number | null;\n}\n\n/** Timeline-ready progress for a custom UI (status bar / step list). */\nexport interface ExecutionProgress {\n executionId: string;\n status?: ExecutionStatus | string;\n statusMessage?: string | null;\n name?: string | null;\n source?: string | null;\n startedAt?: string;\n stoppedAt?: string | null;\n steps: ExecutionProgressStep[];\n pendingInput?: unknown;\n output?: unknown;\n /** Index of the first non-terminal step, or -1 when all done / unknown. */\n activeStepIndex: number;\n}\n\nexport class ExecutionsResource {\n private catalogCache: WorkflowApp[] | null = null;\n\n constructor(\n private readonly http: HttpClient,\n private readonly workflowApps?: WorkflowAppsResource,\n ) {}\n\n /**\n * Starts a new execution of a workflow. Only the execution ID is returned;\n * use {@link waitUntilFinished} or `get` to track progress.\n */\n execute(\n workflowId: string,\n inputData?: Record<string, unknown>,\n ): Promise<ExecuteWorkflowResult> {\n return this.http.post<ExecuteWorkflowResult>(\n `/api/executions/workflows/${workflowId}/execute`,\n { body: { inputData: inputData ?? {} } },\n );\n }\n\n /** Lists executions in the current workspace, most recently started first. */\n list(options?: ListQueryOptions): Promise<Execution[]> {\n return this.http.get<Execution[]>('/api/executions', {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Returns a single execution. Request `expansion: ['status', 'executionPath']`\n * for the business-readable step list custom UIs render progress from.\n */\n get(\n executionId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Execution> {\n return this.http.get<Execution>(`/api/executions/${executionId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Timeline-ready progress: `executionPath` plus catalogue icons/logos.\n * Use this for a custom status bar / step list (not raw nodes/edges).\n */\n async getProgress(executionId: string): Promise<ExecutionProgress> {\n const execution = await this.get(executionId, {\n expansion: [\n 'status',\n 'statusMessage',\n 'executionPath',\n 'pendingInput',\n 'source',\n 'name',\n 'startedAt',\n 'stoppedAt',\n 'output',\n ],\n });\n return this.#toProgress(execution);\n }\n\n /**\n * Opens the Public API SSE stream (`GET /executions/:id/stream`).\n * Yields `execution.progress`, `loop.progress`, `execution.finished`, etc.\n * For a simple timeline, prefer {@link watchProgress}.\n */\n stream(\n executionId: string,\n options?: WatchProgressOptions,\n ): Promise<ExecutionProgressStream> {\n return openExecutionStream(this.http, executionId, options);\n }\n\n /**\n * Live progress snapshots for a custom timeline UI.\n * Subscribes to SSE `execution.progress` events (and enriches steps with icons).\n * Completes when the execution reaches a terminal status or the signal aborts.\n */\n async *watchProgress(\n executionId: string,\n options?: WatchProgressOptions,\n ): AsyncGenerator<ExecutionProgress, void, undefined> {\n const stream = await this.stream(executionId, options);\n for await (const frame of stream) {\n if (frame.event === 'execution.progress') {\n const payload = frame.data as unknown as ExecutionProgressPayload;\n yield await this.#progressFromPayload(payload);\n } else if (frame.event === 'execution.finished') {\n // Ensure a final enriched snapshot even if the last progress was skipped.\n yield await this.getProgress(executionId);\n return;\n } else if (frame.event === 'execution.error') {\n throw new Error(\n typeof frame.data.message === 'string'\n ? frame.data.message\n : `Execution stream error for ${executionId}`,\n );\n }\n }\n }\n\n /**\n * Polls an execution with exponential backoff until it reaches a terminal\n * status (`SUCCESS`, `FAILED`, `CANCELLED`) — or pauses in `NEEDS_INPUT`\n * (unless `stopOnNeedsInput: false`). Resolves with the final execution\n * including `status`, `statusMessage`, and `output`.\n */\n async waitUntilFinished(\n executionId: string,\n options: WaitUntilFinishedOptions = {},\n ): Promise<Execution> {\n const {\n timeoutMs = 10 * 60 * 1000,\n initialDelayMs = 500,\n maxDelayMs = 5_000,\n backoffFactor = 1.5,\n stopOnNeedsInput = true,\n expansion = [],\n signal,\n sleep = defaultSleep,\n } = options;\n\n const pollExpansion = Array.from(\n new Set(['status', 'statusMessage', 'output', ...expansion]),\n );\n\n const startedAt = Date.now();\n // Accumulated requested sleep time; combined with wall-clock elapsed so the\n // budget holds both in real use and with an injected (instant) sleep.\n let waitedMs = 0;\n let delay = initialDelayMs;\n\n while (true) {\n signal?.throwIfAborted();\n\n const execution = await this.get(executionId, {\n expansion: pollExpansion,\n });\n const status = execution.status as ExecutionStatus | undefined;\n\n if (status && TERMINAL_STATUSES.has(status)) {\n return execution;\n }\n if (stopOnNeedsInput && status === 'NEEDS_INPUT') {\n return execution;\n }\n\n const elapsed = Math.max(Date.now() - startedAt, waitedMs);\n if (elapsed + delay > timeoutMs) {\n throw new ExecutionTimeoutError(executionId, timeoutMs);\n }\n\n await sleep(delay);\n waitedMs += delay;\n delay = Math.min(delay * backoffFactor, maxDelayMs);\n }\n }\n\n /**\n * Resumes an execution paused in `NEEDS_INPUT` by submitting values for the\n * waiting node. Identify the waiting node and its field schema via\n * `expansion: ['pendingInput', 'executionPath']` (prefer `pendingInput` for\n * the form contract; `executionPath` steps with status `NEEDS_INPUT` also\n * carry the `nodeId`). Required fields from the schema must be present.\n * The server acknowledges immediately and resumes asynchronously — follow\n * up with {@link waitUntilFinished}.\n */\n async submitInput(\n executionId: string,\n nodeId: string,\n values: Record<string, unknown>,\n ): Promise<void> {\n await this.http.post<unknown>(\n `/api/webhooks/executions/${executionId}/nodes/${nodeId}/input`,\n { body: values },\n );\n }\n\n /**\n * Submit an approve/reject decision for a Request Approval node.\n * Uses the authenticated Approvals API (not the public input webhook).\n * Partial approvals keep the execution paused; terminal decisions resume it.\n */\n async submitApproval(\n executionId: string,\n nodeId: string,\n body: {\n decision: 'approved' | 'rejected';\n comment?: string;\n },\n ): Promise<{\n executionId: string;\n nodeId: string;\n approvalId?: string;\n terminal: boolean;\n canDecide: boolean;\n approval: Record<string, unknown>;\n }> {\n return this.http.post(\n `/api/executions/${executionId}/nodes/${nodeId}/approvals`,\n { body },\n );\n }\n\n async #toProgress(execution: Execution): Promise<ExecutionProgress> {\n const path = (execution.executionPath ?? []) as ExecutionPathStep[];\n const steps = await this.#enrichSteps(path);\n return {\n executionId: execution.id,\n status: execution.status,\n statusMessage: execution.statusMessage ?? null,\n name: (execution as { name?: string | null }).name ?? null,\n source: (execution as { source?: string | null }).source ?? null,\n startedAt: execution.startedAt,\n stoppedAt: execution.stoppedAt ?? null,\n steps,\n pendingInput: (execution as { pendingInput?: unknown }).pendingInput,\n output: execution.output,\n activeStepIndex: findActiveStepIndex(steps),\n };\n }\n\n async #progressFromPayload(\n payload: ExecutionProgressPayload,\n ): Promise<ExecutionProgress> {\n const steps = await this.#enrichSteps(payload.executionPath ?? []);\n return {\n executionId: payload.executionId,\n status: payload.status ?? undefined,\n statusMessage: payload.statusMessage,\n name: payload.name,\n source: payload.source,\n startedAt: payload.startedAt,\n stoppedAt: payload.stoppedAt,\n steps,\n pendingInput: payload.pendingInput,\n output: payload.output,\n activeStepIndex: findActiveStepIndex(steps),\n };\n }\n\n async #enrichSteps(\n path: ExecutionPathStep[],\n ): Promise<ExecutionProgressStep[]> {\n const catalog = await this.#loadCatalog();\n return path.map((step) => {\n const app = catalog?.find((a) => a.id === step.appId);\n const action =\n step.actionId && Array.isArray(app?.actions)\n ? (app!.actions as Record<string, unknown>[]).find(\n (a) => a && typeof a === 'object' && a.id === step.actionId,\n )\n : undefined;\n const trigger =\n step.triggerId && Array.isArray(app?.triggers)\n ? (app!.triggers as Record<string, unknown>[]).find(\n (t) => t && typeof t === 'object' && t.id === step.triggerId,\n )\n : undefined;\n const iconUrl =\n (typeof action?.iconUrl === 'string' && action.iconUrl) ||\n (typeof trigger?.iconUrl === 'string' && trigger.iconUrl) ||\n null;\n const durationMs = computeDurationMs(step.startTime, step.endTime);\n return {\n ...step,\n appLogoUrl: app?.logoUrl ?? null,\n iconUrl,\n durationMs,\n };\n });\n }\n\n async #loadCatalog(): Promise<WorkflowApp[] | null> {\n if (!this.workflowApps) {\n return null;\n }\n if (!this.catalogCache) {\n try {\n this.catalogCache = await this.workflowApps.list();\n } catch {\n return null;\n }\n }\n return this.catalogCache;\n }\n}\n\nfunction findActiveStepIndex(steps: ExecutionProgressStep[]): number {\n const idx = steps.findIndex(\n (s) =>\n s.status === 'RUNNING' ||\n s.status === 'NEEDS_INPUT' ||\n s.status === 'RETRYING' ||\n s.status === 'WAITING' ||\n s.status === 'SCHEDULED',\n );\n return idx;\n}\n\nfunction computeDurationMs(\n start?: string,\n end?: string,\n): number | null {\n if (!start || !end) return null;\n const a = Date.parse(start);\n const b = Date.parse(end);\n if (Number.isNaN(a) || Number.isNaN(b) || b < a) return null;\n return b - a;\n}\n\nfunction defaultSleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateKnowledgeInput,\n Knowledge,\n KnowledgeDocument,\n KnowledgeDocumentGroup,\n SaveUploadedTextInput,\n UpdateKnowledgeInput,\n} from '../types';\nimport { serializeCsv } from './common';\n\nexport class KnowledgeResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists knowledge notebooks in the workspace. */\n list(options: { expansion?: string | string[] } = {}): Promise<Knowledge[]> {\n return this.http.get<Knowledge[]>('/api/knowledge', {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Returns a single knowledge notebook. */\n get(\n knowledgeId: string,\n options: { expansion?: string | string[] } = {},\n ): Promise<Knowledge> {\n return this.http.get<Knowledge>(`/api/knowledge/${knowledgeId}`, {\n query: { expansion: serializeCsv(options.expansion) },\n });\n }\n\n /** Creates a knowledge notebook. Subject to the deployment's storage/vector infrastructure. */\n create(data: CreateKnowledgeInput): Promise<Knowledge> {\n return this.http.post<Knowledge>('/api/knowledge', { body: data });\n }\n\n /** Updates a knowledge notebook. */\n update(knowledgeId: string, data: UpdateKnowledgeInput): Promise<Knowledge> {\n return this.http.patch<Knowledge>(`/api/knowledge/${knowledgeId}`, {\n body: data,\n });\n }\n\n /** Deletes a knowledge notebook. */\n delete(knowledgeId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/knowledge/${knowledgeId}`);\n }\n\n /** Saves raw text into the notebook (chunked, embedded, and indexed server-side). */\n saveUploadedText(\n knowledgeId: string,\n data: SaveUploadedTextInput,\n ): Promise<unknown> {\n return this.http.post<unknown>(\n `/api/knowledge/${knowledgeId}/saveUploadedText`,\n { body: data },\n );\n }\n\n /** Lists the documents stored in a notebook. */\n listDocuments(knowledgeId: string): Promise<KnowledgeDocument[]> {\n return this.http.get<KnowledgeDocument[]>(\n `/api/knowledge/${knowledgeId}/documents`,\n );\n }\n\n /** Returns one document group (an uploaded document and its chunks). */\n getDocumentGroup(\n knowledgeId: string,\n groupId: string,\n ): Promise<KnowledgeDocumentGroup> {\n return this.http.get<KnowledgeDocumentGroup>(\n `/api/knowledge/${knowledgeId}/documents/${groupId}`,\n );\n }\n\n /** Deletes one document group from the notebook. */\n deleteDocumentGroup(knowledgeId: string, groupId: string): Promise<boolean> {\n return this.http.delete<boolean>(\n `/api/knowledge/${knowledgeId}/documents/${groupId}`,\n );\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { CreateProjectInput, Project } from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class ProjectsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists projects in the workspace, most recently updated first. */\n list(options?: ListQueryOptions): Promise<Project[]> {\n return this.http.get<Project[]>('/api/projects', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single project. */\n get(\n projectId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Project> {\n return this.http.get<Project>(`/api/projects/${projectId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a project. */\n create(data: CreateProjectInput): Promise<Project> {\n return this.http.post<Project>('/api/projects', { body: data });\n }\n}\n","import type { HttpClient } from '../core/http';\nimport { iterateOffset, type OffsetPagination } from '../core/pagination';\nimport type {\n BulkCreateQueueItemsInput,\n BulkCreateQueueItemsResult,\n CreateQueueItemInput,\n QueueItem,\n QueueItemCreated,\n QueueItemErrorEntry,\n QueueItemFull,\n QueueItemList,\n QueueItemStats,\n UpdateQueueItemInput,\n} from '../types';\n\nexport type QueueItemStatus =\n | 'PENDING'\n | 'PROCESSING'\n | 'SUCCESS'\n | 'FAILED'\n | 'RETRYING';\n\nexport interface AddQueueItemErrorInput {\n /** Error message recorded on the item. */\n error: string;\n /**\n * Extra details. An object is sent as a JSON string, which is what the\n * server validates.\n */\n errorDetails?: string | Record<string, unknown>;\n}\nimport { serializeCsv, serializeFilterBy } from './common';\n\nexport interface ListQueueItemsOptions {\n limit?: number;\n offset?: number;\n expansion?: string | string[];\n /** Supports keys including `status`, `externalId`, `objectId`, `priority`. */\n filterBy?: string | Record<string, string>;\n}\n\nexport interface ListQueueItemsByObjectOptions {\n status?: string;\n limit?: number;\n offset?: number;\n expansion?: string | string[];\n}\n\nexport class QueueItemsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Returns one page of items in a queue (offset-based pagination). */\n list(\n queueId: string,\n options: ListQueueItemsOptions = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(`/api/queues/${queueId}/items`, {\n query: {\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy(options.filterBy),\n },\n });\n }\n\n /** Async-iterates every item in a queue, fetching batches lazily. */\n iterate(\n queueId: string,\n options: Omit<ListQueueItemsOptions, 'offset'> = {},\n ): AsyncGenerator<QueueItem, void, undefined> {\n return iterateOffset<QueueItem>(async (offset) => {\n const result = await this.list(queueId, { ...options, offset });\n return {\n items: result.items ?? [],\n pagination: result.pagination as unknown as OffsetPagination,\n };\n });\n }\n\n /** Returns a single queue item. */\n get(queueId: string, itemId: string): Promise<QueueItemFull> {\n return this.http.get<QueueItemFull>(\n `/api/queues/${queueId}/items/${itemId}`,\n );\n }\n\n /** Adds an item to a queue. Pass `objectId` to link the item to an entity. */\n create(\n queueId: string,\n data: CreateQueueItemInput,\n ): Promise<QueueItemCreated> {\n return this.http.post<QueueItemCreated>(`/api/queues/${queueId}/items`, {\n body: data,\n });\n }\n\n /**\n * Lists queue items linked to an Object across all queues in the workspace.\n * Use for Object detail \"Work\" panels.\n */\n listByObject(\n objectId: string,\n options: ListQueueItemsByObjectOptions = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/objects/${objectId}/queue-items`,\n {\n query: {\n status: options.status,\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n },\n },\n );\n }\n\n /** Async-iterates every queue item linked to an Object. */\n iterateByObject(\n objectId: string,\n options: Omit<ListQueueItemsByObjectOptions, 'offset'> = {},\n ): AsyncGenerator<QueueItem, void, undefined> {\n return iterateOffset<QueueItem>(async (offset) => {\n const result = await this.listByObject(objectId, {\n ...options,\n offset,\n });\n return {\n items: result.items ?? [],\n pagination: result.pagination as unknown as OffsetPagination,\n };\n });\n }\n\n /** Adds many items to a queue in one call. */\n bulkCreate(\n queueId: string,\n data: BulkCreateQueueItemsInput,\n ): Promise<BulkCreateQueueItemsResult> {\n return this.http.post<BulkCreateQueueItemsResult>(\n `/api/queues/${queueId}/items/bulk`,\n { body: data },\n );\n }\n\n /** Updates a queue item. */\n update(\n queueId: string,\n itemId: string,\n data: UpdateQueueItemInput,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}`,\n { body: data },\n );\n }\n\n /** Deletes a queue item. */\n delete(queueId: string, itemId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(\n `/api/queues/${queueId}/items/${itemId}`,\n );\n }\n\n /** Returns items that are ready to be processed. */\n listReady(queueId: string, options: { limit?: number } = {}): Promise<QueueItem[]> {\n return this.http.get<QueueItem[]>(`/api/queues/${queueId}/items/ready`, {\n query: { limit: options.limit },\n });\n }\n\n /** Returns items eligible for retry. */\n listRetryable(queueId: string): Promise<QueueItem[]> {\n return this.http.get<QueueItem[]>(`/api/queues/${queueId}/items/retry`);\n }\n\n /** Returns a page of items with the given status. */\n listByStatus(\n queueId: string,\n status: QueueItemStatus,\n options: { limit?: number; offset?: number } = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/queues/${queueId}/items/status/${status}`,\n { query: { limit: options.limit, offset: options.offset } },\n );\n }\n\n /** Looks an item up by the external ID your system supplied. */\n getByExternalId(queueId: string, externalId: string): Promise<QueueItemFull> {\n return this.http.get<QueueItemFull>(\n `/api/queues/${queueId}/items/external/${externalId}`,\n );\n }\n\n /**\n * Searches items by external id, item data, and metadata.\n * Returns one page, same shape as `list`.\n */\n search(\n queueId: string,\n query: string,\n options: Omit<ListQueueItemsOptions, 'filterBy'> = {},\n ): Promise<QueueItemList> {\n return this.http.get<QueueItemList>(\n `/api/queues/${queueId}/items/search`,\n {\n query: {\n limit: options.limit,\n offset: options.offset,\n expansion: serializeCsv(options.expansion),\n filterBy: serializeFilterBy({ search: query }),\n },\n },\n );\n }\n\n /** Returns per-status and per-priority counts for the queue. */\n stats(queueId: string): Promise<QueueItemStats> {\n return this.http.get<QueueItemStats>(`/api/queues/${queueId}/items/stats`);\n }\n\n /** Returns the recorded processing errors of an item. */\n listErrors(queueId: string, itemId: string): Promise<QueueItemErrorEntry[]> {\n return this.http.get<QueueItemErrorEntry[]>(\n `/api/queues/${queueId}/items/${itemId}/errors`,\n );\n }\n\n /** Updates the processing status of an item. */\n updateStatus(\n queueId: string,\n itemId: string,\n status: string,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/status`,\n { body: { status } },\n );\n }\n\n /** Links an item to the workflow execution that processed it. */\n linkExecution(\n queueId: string,\n itemId: string,\n executionId: string,\n ): Promise<QueueItem> {\n return this.http.patch<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/link-execution`,\n { body: { executionId } },\n );\n }\n\n /** Queues the item for another processing attempt. */\n retry(queueId: string, itemId: string): Promise<QueueItem> {\n return this.http.post<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/retry`,\n );\n }\n\n /** Records a processing error on the item. */\n addError(\n queueId: string,\n itemId: string,\n error: AddQueueItemErrorInput,\n ): Promise<QueueItem> {\n return this.http.post<QueueItem>(\n `/api/queues/${queueId}/items/${itemId}/error`,\n {\n body: {\n error: error.error,\n errorDetails: serializeErrorDetails(error.errorDetails),\n },\n },\n );\n }\n}\n\nfunction serializeErrorDetails(\n value: string | Record<string, unknown> | undefined,\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return typeof value === 'string' ? value : JSON.stringify(value);\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateQueueInput,\n Queue,\n QueueStats,\n UpdateQueueInput,\n} from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class QueuesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists queues in the workspace, ordered by priority then creation date. */\n list(options?: ListQueryOptions): Promise<Queue[]> {\n return this.http.get<Queue[]>('/api/queues', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single queue. */\n get(queueId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Queue> {\n return this.http.get<Queue>(`/api/queues/${queueId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a queue. */\n create(data: CreateQueueInput): Promise<Queue> {\n return this.http.post<Queue>('/api/queues', { body: data });\n }\n\n /** Updates a queue. */\n update(queueId: string, data: UpdateQueueInput): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}`, { body: data });\n }\n\n /** Deletes a queue. */\n delete(queueId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/api/queues/${queueId}`);\n }\n\n /** Returns aggregate statistics for a queue. */\n stats(queueId: string): Promise<QueueStats> {\n return this.http.get<QueueStats>(`/api/queues/${queueId}/stats`);\n }\n\n /** Activates a queue. */\n activate(queueId: string): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}/activate`);\n }\n\n /** Deactivates a queue. */\n deactivate(queueId: string): Promise<Queue> {\n return this.http.patch<Queue>(`/api/queues/${queueId}/deactivate`);\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n ActionDefinition,\n WorkflowDefinition,\n WorkflowStepDefinition,\n} from '../define';\nimport {\n resolveActionAppId,\n resolveActionId,\n} from '../define';\nimport type { Execution, RunActionResult } from '../types';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface StartRunStep {\n appId: string;\n actionId: string;\n connectionId?: string;\n input?: Record<string, unknown>;\n name?: string;\n}\n\nexport interface StartRunOptions {\n steps: StartRunStep[];\n projectId?: string;\n name?: string;\n}\n\nexport type StartRunInput =\n | StartRunOptions\n | WorkflowDefinition\n | WorkflowStepDefinition[]\n | StartRunStep[];\n\nfunction isWorkflowDefinition(value: unknown): value is WorkflowDefinition {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as WorkflowDefinition).kind === 'workflow'\n );\n}\n\nfunction isActionDefinition(value: unknown): value is ActionDefinition {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as ActionDefinition).kind === 'action'\n );\n}\n\nfunction stepFromDefinition(\n step: WorkflowStepDefinition | StartRunStep | ActionDefinition,\n): StartRunStep {\n if ('appId' in step && 'actionId' in step && !('use' in step) && !('kind' in step)) {\n return step as StartRunStep;\n }\n if (isActionDefinition(step)) {\n return {\n appId: resolveActionAppId(step),\n actionId: resolveActionId(step),\n ...(step.connection?.id ? { connectionId: step.connection.id } : {}),\n ...(step.input ? { input: step.input } : {}),\n ...(step.name ? { name: step.name } : {}),\n };\n }\n const use = (step as WorkflowStepDefinition).use;\n const input = {\n ...(use.input ?? {}),\n ...((step as WorkflowStepDefinition).input ?? {}),\n };\n return {\n appId: resolveActionAppId(use),\n actionId: resolveActionId(use),\n ...(use.connection?.id ? { connectionId: use.connection.id } : {}),\n ...(Object.keys(input).length ? { input } : {}),\n ...(((step as WorkflowStepDefinition).name ?? use.name)\n ? { name: (step as WorkflowStepDefinition).name ?? use.name }\n : {}),\n };\n}\n\nfunction normalizeStartRunInput(input: StartRunInput): StartRunOptions {\n if (isWorkflowDefinition(input)) {\n return {\n steps: input.steps.map(stepFromDefinition),\n name: input.name ?? input.slug,\n };\n }\n if (Array.isArray(input)) {\n return { steps: input.map((s) => stepFromDefinition(s as any)) };\n }\n return input;\n}\n\n/**\n * Multi-step ad-hoc runs (`POST /api/runs`) → one Execution with `source: SDK`.\n */\nexport class RunsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /**\n * Start a linear multi-step ad-hoc Execution.\n *\n * Accepts a `defineWorkflow` result, a step array, or an explicit\n * `{ steps, projectId?, name? }` payload.\n */\n start(input: StartRunInput): Promise<RunActionResult> {\n const options = normalizeStartRunInput(input);\n if (!options.steps?.length) {\n throw new Error('runs.start requires at least one step');\n }\n return this.http.post<RunActionResult>('/api/runs', {\n body: options,\n });\n }\n\n /** Convenience: start and wait until terminal / NEEDS_INPUT. */\n async startAndWait(\n input: StartRunInput,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.start(input);\n return this.executions.waitUntilFinished(id, {\n ...waitOptions,\n expansion: [\n 'executionPath',\n 'source',\n ...(waitOptions?.expansion ?? []),\n ],\n });\n }\n}\n","import type { HttpClient } from '../core/http';\n\nexport type ScorecardMeasureStatus = 'ON_TRACK' | 'AT_RISK' | 'OFF_TRACK' | 'NO_DATA';\n\nexport type ScorecardSummary = {\n id: string;\n name: string;\n periodLabel: string | null;\n description: string | null;\n FK_ownerId: string | null;\n createdAt: string;\n _count: { objectives: number };\n};\n\nexport type ScorecardMeasure = {\n id: string;\n name: string;\n unit: string;\n currency: string | null;\n direction: 'HIGHER_IS_BETTER' | 'LOWER_IS_BETTER';\n kind: 'LEADING' | 'LAGGING';\n cadence: 'DAILY' | 'WEEKLY' | 'MONTHLY';\n sourceType: 'MANUAL' | 'API' | 'WORKFLOW' | 'BUILT_IN';\n builtInKey: string | null;\n target: number;\n atRiskThreshold: number | null;\n latest: { value: number; periodStart: string; createdAt: string } | null;\n previousValue: number | null;\n series: { periodStart: string; value: number }[];\n status: ScorecardMeasureStatus;\n stale: boolean;\n};\n\nexport type ScorecardObjective = {\n id: string;\n perspective: 'FINANCIAL' | 'CUSTOMER' | 'PROCESS' | 'LEARNING';\n name: string;\n description: string | null;\n ownerLabel: string | null;\n drivesIds: string[];\n position: number;\n status: ScorecardMeasureStatus;\n measures: ScorecardMeasure[];\n};\n\nexport type Scorecard = Omit<ScorecardSummary, '_count'> & {\n aiSpendUsdThisMonth: number;\n objectives: ScorecardObjective[];\n};\n\nexport type ScorecardMeasureValue = {\n id: string;\n FK_measureId: string;\n periodStart: string;\n value: number;\n note: string | null;\n sourceType: ScorecardMeasure['sourceType'];\n supersededAt: string | null;\n createdAt: string;\n};\n\nexport type RecordMeasureValueInput = {\n value: number;\n /** Any ISO date inside the target period; defaults to the current period. */\n period?: string;\n note?: string;\n};\n\n/**\n * Balanced Scorecard (workspace API). Pushing values needs `scorecard:record`.\n */\nexport class ScorecardsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists scorecards in the workspace. */\n list(): Promise<ScorecardSummary[]> {\n return this.http.get<ScorecardSummary[]>('/api/scorecards');\n }\n\n /** Returns a scorecard with objectives, measures, latest values and status. */\n get(scorecardId: string): Promise<Scorecard> {\n return this.http.get<Scorecard>(`/api/scorecards/${scorecardId}`);\n }\n\n /**\n * Records a measure value. A value for the same period replaces the current\n * one; the old value is kept as superseded history.\n */\n recordValue(\n measureId: string,\n data: RecordMeasureValueInput,\n ): Promise<ScorecardMeasureValue> {\n return this.http.post<ScorecardMeasureValue>(\n `/api/scorecards/measures/${measureId}/values`,\n { body: data },\n );\n }\n}\n","import type { UIMessage } from 'ai';\n\nimport type { HttpClient } from '../core/http';\nimport type {\n CreateTaskInput,\n DeletedTask,\n Task,\n TaskListItem,\n UpdateTaskInput,\n} from '../types';\nimport {\n messageTaskBody,\n type StreamMessageOptions,\n} from '../streaming/agent-chat';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class TasksResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists tasks (conversation threads) visible to the caller, most recently updated first. */\n list(options?: ListQueryOptions): Promise<TaskListItem[]> {\n return this.http.get<TaskListItem[]>('/api/tasks', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single task. Request `expansion: ['messages']` for the conversation history. */\n get(taskId: string, options?: Pick<ListQueryOptions, 'expansion'>): Promise<Task> {\n return this.http.get<Task>(`/api/tasks/${taskId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a task (conversation thread) for an agent. */\n create(\n agentId: string,\n data: CreateTaskInput,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Task> {\n return this.http.post<Task>(`/api/agents/${agentId}/tasks`, {\n body: data,\n query: serializeListQuery(options),\n });\n }\n\n /** Updates the task name or description. */\n update(\n taskId: string,\n data: UpdateTaskInput,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Task> {\n return this.http.patch<Task>(`/api/tasks/${taskId}`, {\n body: data,\n query: serializeListQuery(options),\n });\n }\n\n /** Permanently deletes a task and its messages. */\n delete(taskId: string): Promise<DeletedTask> {\n return this.http.delete<DeletedTask>(`/api/tasks/${taskId}`);\n }\n\n /**\n * Sends a message to an agent task and waits for the full agent turn to\n * finish (non-streaming). Returns either a plain string or the assistant\n * messages in AI SDK UIMessage format. For token-by-token output use\n * `client.agentChat.streamMessage` instead.\n */\n message(\n agentId: string,\n taskId: string,\n message: string | UIMessage,\n options: Omit<StreamMessageOptions, 'signal'> = {},\n ): Promise<string | UIMessage[]> {\n const uiMessage: UIMessage =\n typeof message === 'string'\n ? {\n id: generateMessageId(),\n role: 'user',\n parts: [{ type: 'text', text: message }],\n }\n : message;\n\n return this.http.post<string | UIMessage[]>(\n `/api/agents/${agentId}/tasks/${taskId}/message`,\n { body: messageTaskBody(uiMessage, options) },\n );\n }\n}\n\nfunction generateMessageId(): string {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (cryptoObj?.randomUUID) {\n return cryptoObj.randomUUID();\n }\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n","import type { HttpClient } from '../core/http';\nimport type {\n CreateVariableInput,\n UpdateVariableInput,\n Variable,\n} from '../types';\nimport { serializeListQuery, type ListQueryOptions } from './common';\n\nexport class VariablesResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists variables in the workspace. */\n list(options?: ListQueryOptions): Promise<Variable[]> {\n return this.http.get<Variable[]>('/api/variables', {\n query: serializeListQuery(options),\n });\n }\n\n /** Returns a single variable. */\n get(\n variableId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Variable> {\n return this.http.get<Variable>(`/api/variables/${variableId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /** Creates a variable. */\n create(data: CreateVariableInput): Promise<Variable> {\n return this.http.post<Variable>('/api/variables', { body: data });\n }\n\n /** Updates a variable. */\n update(variableId: string, data: UpdateVariableInput): Promise<Variable> {\n return this.http.patch<Variable>(`/api/variables/${variableId}`, {\n body: data,\n });\n }\n\n /** Deletes a variable. */\n delete(variableId: string): Promise<boolean> {\n return this.http.delete<boolean>(`/api/variables/${variableId}`);\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { WorkflowApp } from '../types';\n\n/**\n * Read-only catalog of workflow apps and their actions/triggers. Custom UIs\n * use it to resolve `executionPath` step `appId`/`actionId` pairs to\n * human-readable names and icons, and to read the declarative\n * `ActionUIDefinition` metadata for rendering rich action outputs.\n */\nexport class WorkflowAppsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Lists all workflow apps installed on the deployment. */\n list(): Promise<WorkflowApp[]> {\n return this.http.get<WorkflowApp[]>('/api/workflow-apps');\n }\n\n /**\n * Creates a connection for an app where the connection type is\n * non-interactive (API key, basic auth). OAuth connections require the\n * browser flow inside the bundled UI and cannot be created here.\n */\n connect(\n appId: string,\n connectionId: string,\n value: Record<string, unknown>,\n ): Promise<unknown> {\n return this.http.post<unknown>(\n `/api/workflow-apps/${appId}/connections/${connectionId}/connect`,\n { body: value },\n );\n }\n}\n","import type { HttpClient } from '../core/http';\nimport type { ExecuteWorkflowResult, Execution, Workflow } from '../types';\nimport type { WorkflowDefinition, WorkflowStepDefinition } from '../define';\nimport { resolveActionAppId, resolveActionId } from '../define';\nimport { serializeListQuery, type ListQueryOptions } from './common';\nimport type {\n ExecutionsResource,\n WaitUntilFinishedOptions,\n} from './executions';\n\nexport interface UpsertWorkflowStepInput {\n appId: string;\n actionId: string;\n connectionId?: string;\n input?: Record<string, unknown>;\n name?: string;\n description?: string;\n}\n\nexport interface UpsertWorkflowBySlugInput {\n slug: string;\n name?: string;\n description?: string;\n isActive?: boolean;\n steps: UpsertWorkflowStepInput[];\n managedByCode?: boolean;\n}\n\nfunction stepToUpsertInput(\n step: WorkflowStepDefinition,\n): UpsertWorkflowStepInput {\n const use = step.use;\n return {\n appId: resolveActionAppId(use),\n actionId: resolveActionId(use),\n connectionId: use.connection?.id,\n input: {\n ...(use.input ?? {}),\n ...(step.input ?? {}),\n },\n name: step.name ?? use.name,\n description: use.description,\n };\n}\n\nexport function workflowDefinitionToUpsert(\n def: WorkflowDefinition,\n): UpsertWorkflowBySlugInput {\n return {\n slug: def.slug,\n name: def.name,\n description: def.description,\n isActive: def.isActive,\n managedByCode: true,\n steps: def.steps.map(stepToUpsertInput),\n };\n}\n\nexport class WorkflowsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly executions: ExecutionsResource,\n ) {}\n\n /** Lists workflows in the current workspace. */\n list(options?: ListQueryOptions): Promise<Workflow[]> {\n return this.http.get<Workflow[]>('/api/workflows', {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Returns a single workflow. Request `expansion: ['triggerNode']` to read\n * the manual trigger's custom input field definitions.\n */\n get(\n workflowId: string,\n options?: Pick<ListQueryOptions, 'expansion'>,\n ): Promise<Workflow> {\n return this.http.get<Workflow>(`/api/workflows/${workflowId}`, {\n query: serializeListQuery(options),\n });\n }\n\n /**\n * Upsert a workflow by project-scoped slug from a linear step list.\n * Prefer the CLI (`npx @lunnoa/client workflows deploy`) for happy-path deploy.\n */\n upsertBySlug(\n projectId: string,\n body: UpsertWorkflowBySlugInput | WorkflowDefinition,\n ): Promise<Workflow> {\n const payload =\n 'kind' in body && body.kind === 'workflow'\n ? workflowDefinitionToUpsert(body)\n : body;\n return this.http.post<Workflow>(\n `/api/projects/${projectId}/workflows/upsert`,\n { body: payload },\n );\n }\n\n /**\n * Starts a new execution of the workflow with the given trigger inputs.\n * Returns immediately with the execution ID.\n */\n execute(\n workflowId: string,\n inputs?: Record<string, unknown>,\n ): Promise<ExecuteWorkflowResult> {\n return this.executions.execute(workflowId, inputs);\n }\n\n /**\n * Convenience: execute the workflow and wait (poll with backoff) until it\n * reaches a terminal status or pauses in `NEEDS_INPUT`.\n */\n async executeAndWait(\n workflowId: string,\n inputs?: Record<string, unknown>,\n waitOptions?: WaitUntilFinishedOptions,\n ): Promise<Execution> {\n const { id } = await this.executions.execute(workflowId, inputs);\n return this.executions.waitUntilFinished(id, waitOptions);\n }\n\n /**\n * Triggers a workflow through its unauthenticated custom webhook endpoint\n * (`POST /api/webhooks/workflows/:workflowId`). Only works for workflows\n * with a webhook trigger. Returns the synchronous trigger output when the\n * workflow responds synchronously.\n */\n triggerWebhook(\n workflowId: string,\n payload?: Record<string, unknown>,\n ): Promise<Record<string, unknown> | undefined> {\n return this.http.post<Record<string, unknown> | undefined>(\n `/api/webhooks/workflows/${workflowId}`,\n { body: payload ?? {} },\n );\n }\n}\n","import { HttpClient, type LunnoaClientOptions } from './core/http';\nimport { AgentChatClient } from './streaming/agent-chat';\nimport { ActionsResource } from './resources/actions';\nimport { AgentsResource } from './resources/agents';\nimport { AuthResource } from './resources/auth';\nimport { ConnectionsResource } from './resources/connections';\nimport { DiscoveryResource } from './resources/discovery';\nimport { EntitiesResource } from './resources/entities';\nimport { EntityTypesResource } from './resources/entity-types';\nimport { ApprovalsResource } from './resources/approvals';\nimport { ExecutionsResource } from './resources/executions';\nimport { KnowledgeResource } from './resources/knowledge';\nimport { ProjectsResource } from './resources/projects';\nimport { QueueItemsResource } from './resources/queue-items';\nimport { QueuesResource } from './resources/queues';\nimport { RunsResource } from './resources/runs';\nimport { ScorecardsResource } from './resources/scorecards';\nimport { TasksResource } from './resources/tasks';\nimport { VariablesResource } from './resources/variables';\nimport { WorkflowAppsResource } from './resources/workflow-apps';\nimport { WorkflowsResource } from './resources/workflows';\n\n/**\n * Typed client for the Lunnoa Automate Public API.\n *\n * Server-side (Pattern A — the backend holds the key):\n * ```ts\n * const lunnoa = new LunnoaClient({\n * baseUrl: 'https://lunnoa.acme.example',\n * apiKey: process.env.LUNNOA_API_KEY, // lna_...\n * });\n * ```\n *\n * Browser (Pattern B — the end user is a Lunnoa user):\n * ```ts\n * import { createBrowserClient } from '@lunnoa/client';\n * const lunnoa = createBrowserClient({ baseUrl: 'https://lunnoa.acme.example' });\n * await lunnoa.auth.login({ email, password });\n * ```\n *\n * Passing an `lna_` API key in a browser throws immediately: API keys are\n * workspace-wide server credentials and must never ship to browsers.\n */\nexport class LunnoaClient {\n /** The underlying HTTP layer, exposed for advanced/escape-hatch requests. */\n readonly http: HttpClient;\n\n /** Login, refresh, SSO discovery, and session helpers (Pattern B). */\n readonly auth: AuthResource;\n readonly agents: AgentsResource;\n readonly tasks: TasksResource;\n /** Hand-written SSE streaming client for agent chat (AI SDK UIMessage chunks). */\n readonly agentChat: AgentChatClient;\n readonly workflows: WorkflowsResource;\n readonly executions: ExecutionsResource;\n /** Run catalogue actions as one-step ad-hoc Executions (`source: SDK`). */\n readonly actions: ActionsResource;\n /**\n * Multi-step ad-hoc Executions (`source: SDK`) via `POST /api/runs`.\n * Prefer `defineWorkflow` + `runs.start` for local linear chains.\n */\n readonly runs: RunsResource;\n /** Authenticated Approvals inbox (workspace API). */\n readonly approvals: ApprovalsResource;\n readonly entities: EntitiesResource;\n readonly entityTypes: EntityTypesResource;\n readonly knowledge: KnowledgeResource;\n readonly queues: QueuesResource;\n readonly queueItems: QueueItemsResource;\n readonly variables: VariablesResource;\n readonly scorecards: ScorecardsResource;\n readonly connections: ConnectionsResource;\n readonly projects: ProjectsResource;\n readonly workflowApps: WorkflowAppsResource;\n readonly discovery: DiscoveryResource;\n\n constructor(options: LunnoaClientOptions) {\n this.http = new HttpClient(options);\n\n this.auth = new AuthResource(this.http, this.http.tokenStore);\n this.agents = new AgentsResource(this.http);\n this.tasks = new TasksResource(this.http);\n this.agentChat = new AgentChatClient(this.http);\n this.workflowApps = new WorkflowAppsResource(this.http);\n this.executions = new ExecutionsResource(this.http, this.workflowApps);\n this.actions = new ActionsResource(this.http, this.executions);\n this.runs = new RunsResource(this.http, this.executions);\n this.approvals = new ApprovalsResource(this.http);\n this.workflows = new WorkflowsResource(this.http, this.executions);\n this.entities = new EntitiesResource(this.http);\n this.entityTypes = new EntityTypesResource(this.http);\n this.knowledge = new KnowledgeResource(this.http);\n this.queues = new QueuesResource(this.http);\n this.queueItems = new QueueItemsResource(this.http);\n this.variables = new VariablesResource(this.http);\n this.scorecards = new ScorecardsResource(this.http);\n this.connections = new ConnectionsResource(this.http);\n this.projects = new ProjectsResource(this.http);\n this.discovery = new DiscoveryResource(this.http);\n }\n}\n","/**\n * Pluggable storage for Pattern B JWTs.\n * The SDK never uses httpOnly cookies: Automate auth is bearer JWT based.\n */\nexport interface TokenStore {\n getAccessToken(): string | null | Promise<string | null>;\n getRefreshToken(): string | null | Promise<string | null>;\n setTokens(tokens: {\n accessToken: string;\n refreshToken?: string;\n }): void | Promise<void>;\n clear(): void | Promise<void>;\n}\n\n/** In-memory store (SSR, tests, or short-lived server handlers). */\nexport function createMemoryTokenStore(\n initial?: { accessToken?: string; refreshToken?: string },\n): TokenStore {\n let accessToken: string | null = initial?.accessToken ?? null;\n let refreshToken: string | null = initial?.refreshToken ?? null;\n\n return {\n getAccessToken: () => accessToken,\n getRefreshToken: () => refreshToken,\n setTokens: (tokens) => {\n accessToken = tokens.accessToken;\n if (tokens.refreshToken !== undefined) {\n refreshToken = tokens.refreshToken;\n }\n },\n clear: () => {\n accessToken = null;\n refreshToken = null;\n },\n };\n}\n\nexport interface LocalStorageTokenStoreOptions {\n /**\n * Defaults match the built-in Automate UI (`accessToken` / `refreshToken`)\n * so a custom portal can share a session with the product UI when desired.\n */\n accessTokenKey?: string;\n refreshTokenKey?: string;\n /**\n * Storage backend. Defaults to `globalThis.localStorage`.\n * Pass a mock in tests.\n */\n storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n}\n\n/**\n * Browser `localStorage` token store.\n * Throws if neither `options.storage` nor `globalThis.localStorage` is available.\n */\nexport function createLocalStorageTokenStore(\n options: LocalStorageTokenStoreOptions = {},\n): TokenStore {\n const accessTokenKey = options.accessTokenKey ?? 'accessToken';\n const refreshTokenKey = options.refreshTokenKey ?? 'refreshToken';\n const storage =\n options.storage ??\n (typeof globalThis !== 'undefined'\n ? (globalThis as { localStorage?: Storage }).localStorage\n : undefined);\n\n if (!storage) {\n throw new Error(\n 'createLocalStorageTokenStore requires localStorage (or a custom storage option). ' +\n 'On the server, use createMemoryTokenStore or pass accessToken / apiKey instead.',\n );\n }\n\n return {\n getAccessToken: () => storage.getItem(accessTokenKey),\n getRefreshToken: () => storage.getItem(refreshTokenKey),\n setTokens: (tokens) => {\n storage.setItem(accessTokenKey, tokens.accessToken);\n if (tokens.refreshToken !== undefined) {\n storage.setItem(refreshTokenKey, tokens.refreshToken);\n }\n },\n clear: () => {\n storage.removeItem(accessTokenKey);\n storage.removeItem(refreshTokenKey);\n },\n };\n}\n","import {\n createLocalStorageTokenStore,\n createMemoryTokenStore,\n type TokenStore,\n} from './token-store';\nimport { LunnoaClient } from '../client';\nimport type { FetchLike } from '../core/http';\n\nexport interface CreateBrowserClientOptions {\n /** Base URL of the Lunnoa Automate deployment. */\n baseUrl: string;\n /**\n * JWT store. Defaults to `localStorage` keys `accessToken` / `refreshToken`\n * (same as the built-in Automate UI).\n */\n tokenStore?: TokenStore;\n /**\n * Retry once after `POST /api/auth/refresh-token` on 401.\n * Defaults to true.\n */\n autoRefresh?: boolean;\n fetch?: FetchLike;\n headers?: Record<string, string>;\n}\n\n/**\n * Pattern B helper: browser (or isomorphic) client with JWT storage,\n * `lunnoa.auth.login` / refresh, and optional auto-refresh on 401.\n *\n * Never pass an `lna_` API key here.\n */\nexport function createBrowserClient(\n options: CreateBrowserClientOptions,\n): LunnoaClient {\n const tokenStore =\n options.tokenStore ?? createLocalStorageTokenStore();\n return new LunnoaClient({\n baseUrl: options.baseUrl,\n tokenStore,\n autoRefresh: options.autoRefresh ?? true,\n fetch: options.fetch,\n headers: options.headers,\n });\n}\n\nexport interface CreateServerClientOptions {\n /** Base URL of the Lunnoa Automate deployment. */\n baseUrl: string;\n /**\n * Workspace API key (`lna_...`). Preferred for Pattern A backends / BFFs.\n * Mutually exclusive with `accessToken` / `tokenStore`.\n */\n apiKey?: string;\n /**\n * User JWT (or getter) when the server acts on behalf of a logged-in user.\n * Prefer this over embedding tokens in the browser when you own the session.\n */\n accessToken?: string | (() => string | Promise<string>);\n /** Optional store when the server holds both access and refresh tokens. */\n tokenStore?: TokenStore;\n autoRefresh?: boolean;\n fetch?: FetchLike;\n headers?: Record<string, string>;\n}\n\n/**\n * Pattern A (or server-side Pattern B) helper for Node / BFF / route handlers.\n *\n * Provide `apiKey` for a service account, or `accessToken` / `tokenStore` for a\n * user JWT held on the server. Throws if used with an API key in a browser.\n */\nexport function createServerClient(\n options: CreateServerClientOptions,\n): LunnoaClient {\n if (!options.apiKey && !options.accessToken && !options.tokenStore) {\n throw new Error(\n 'createServerClient requires apiKey, accessToken, or tokenStore.',\n );\n }\n return new LunnoaClient({\n baseUrl: options.baseUrl,\n apiKey: options.apiKey,\n accessToken: options.accessToken,\n tokenStore: options.tokenStore,\n autoRefresh: options.autoRefresh,\n fetch: options.fetch,\n headers: options.headers,\n });\n}\n\nexport { createLocalStorageTokenStore, createMemoryTokenStore };\nexport type { TokenStore };\n"]}
|