@verentis/sdk 1.0.0 → 1.0.1
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 +31 -0
- package/dist/index.cjs +275 -48
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +413 -4
- package/dist/index.d.ts +413 -4
- package/dist/index.js +275 -49
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/api-key.auth.ts","../src/auth/bridge.auth.ts","../src/auth/token.auth.ts","../src/modules/context.ts","../src/modules/executions.ts","../src/modules/engines.ts","../src/modules/files.ts","../src/modules/installations.ts","../src/modules/resources.ts","../src/modules/settings.ts","../src/types.ts","../src/modules/notifications.ts","../src/modules/business.ts","../src/transport/app-commands.ts","../src/transport/header-actions.ts","../src/collaboration/native.ts","../src/transport/bridge.transport.ts","../src/transport/http.transport.ts","../src/client.ts","../src/utils/mime.ts","../src/collaboration/lifecycle.ts","../src/index.ts"],"names":["delay","SKEW_MS"],"mappings":"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","file":"index.js","sourcesContent":["import type { AuthStrategy } from '../types'\n\n/**\n * Authenticates with a Verentis API key (`vrt_` prefix).\n * The backend detects the `vrt_` prefix in the Bearer token and resolves it\n * as an API key rather than a JWT.\n */\nexport class ApiKeyAuth implements AuthStrategy {\n constructor(private readonly apiKey: string) {\n if (!apiKey.startsWith('vrt_')) {\n throw new Error('Invalid API key format: must start with \"vrt_\"')\n }\n }\n\n async getAuthHeader(): Promise<string> {\n return `Bearer ${this.apiKey}`\n }\n}\n","import type {\n AuthStrategy,\n TokenInfo,\n VerentisTokenRefreshMessage,\n VerentisTokenRefreshedMessage,\n} from '../types'\n\nconst SKEW_MS = 30_000\n\n/**\n * Authenticates via the PostMessage bridge in iframe mode.\n * The token is received from the host during initialization and refreshed\n * by requesting a new token from the host when nearing expiry.\n */\nexport class BridgeAuth implements AuthStrategy {\n private _token: string | null = null\n private _expiresAt = 0\n private _refreshTimer: ReturnType<typeof setTimeout> | null = null\n private _pendingRefresh: Promise<void> | null = null\n private _messageHandler: (event: MessageEvent) => void\n private _requestId: string | null = null\n private _refreshReject: ((error: Error) => void) | null = null\n private _requestTimer: ReturnType<typeof setTimeout> | null = null\n private _destroyed = false\n\n constructor(private hostOrigin: string) {\n this._messageHandler = this.handleMessage.bind(this)\n if (typeof window !== 'undefined') {\n window.addEventListener('message', this._messageHandler)\n }\n }\n\n setHostOrigin(origin: string): void {\n if (!origin || origin === '*' || origin === 'null') throw new Error('A trusted host origin is required.')\n this.hostOrigin = origin\n }\n\n /** Set the initial token received from the host's `verentis:init` message */\n setToken(info: TokenInfo): void {\n this._token = info.accessToken\n this._expiresAt = new Date(info.expiresAt).getTime()\n this.scheduleRefresh()\n }\n\n async getAuthHeader(): Promise<string | null> {\n if (!this._token) return null\n if (this.isExpired()) {\n await this.requestRefresh()\n }\n return `Bearer ${this._token}`\n }\n\n destroy(): void {\n this._destroyed = true\n if (this._refreshTimer) clearTimeout(this._refreshTimer)\n this.failRefresh('Authentication has been destroyed.')\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', this._messageHandler)\n }\n }\n\n private isExpired(): boolean {\n return Date.now() >= this._expiresAt - SKEW_MS\n }\n\n private _refreshResolve: (() => void) | null = null\n\n private requestRefresh(): Promise<void> {\n if (this._destroyed || this.hostOrigin === '*')\n return Promise.reject(new Error('Authentication is not initialized.'))\n if (this._pendingRefresh) return this._pendingRefresh\n\n const requestId = crypto.randomUUID()\n this._requestId = requestId\n\n this._pendingRefresh = new Promise<void>((resolve, reject) => {\n this._refreshResolve = resolve\n this._refreshReject = reject\n })\n this._requestTimer = setTimeout(() => this.failRefresh('Token refresh timed out.'), 20_000)\n\n const message: VerentisTokenRefreshMessage = {\n type: 'verentis:token:refresh',\n version: 1,\n requestId,\n }\n window.parent.postMessage(message, this.hostOrigin)\n\n return this._pendingRefresh\n }\n\n private handleMessage(event: MessageEvent): void {\n if (this._destroyed || event.origin !== this.hostOrigin || event.source !== window.parent) return\n\n const data = event.data as VerentisTokenRefreshedMessage\n if (data?.version !== 1 || data?.type !== 'verentis:token:refreshed' ||\n !this._requestId || data.requestId !== this._requestId ||\n typeof data.token?.accessToken !== 'string' ||\n !Number.isFinite(Date.parse(data.token.expiresAt)) ||\n Date.parse(data.token.expiresAt) <= Date.now() + SKEW_MS) return\n\n if (this._requestTimer) clearTimeout(this._requestTimer)\n this._requestTimer = null\n this._requestId = null\n this._token = data.token.accessToken\n this._expiresAt = new Date(data.token.expiresAt).getTime()\n this._pendingRefresh = null\n this._refreshResolve?.()\n this._refreshResolve = null\n this._refreshReject = null\n this.scheduleRefresh()\n }\n\n private scheduleRefresh(): void {\n if (this._refreshTimer) clearTimeout(this._refreshTimer)\n if (this._expiresAt === 0) return\n\n const delay = Math.max(0, this._expiresAt - Date.now() - SKEW_MS)\n this._refreshTimer = setTimeout(() => void this.requestRefresh().catch(() => {\n // Do not emit credentials or create an unhandled background rejection.\n // A subsequent API call may explicitly retry against the host.\n }), delay)\n }\n\n private failRefresh(message: string): void {\n if (this._requestTimer) clearTimeout(this._requestTimer)\n this._requestTimer = null\n this._requestId = null\n this._pendingRefresh = null\n this._refreshReject?.(new Error(message))\n this._refreshReject = null\n this._refreshResolve = null\n }\n}\n","import type { AuthStrategy, TokenInfo } from '../types'\n\nconst SKEW_MS = 30_000\n\n/**\n * Authenticates with a pre-existing bearer token.\n * Tracks expiry and invokes an optional refresh callback before the token expires.\n */\nexport class TokenAuth implements AuthStrategy {\n private _token: string\n private _expiresAt: number\n private _refreshTimer: ReturnType<typeof setTimeout> | null = null\n private _refreshFn?: () => Promise<TokenInfo>\n\n constructor(token: string, expiresAt?: string, refreshFn?: () => Promise<TokenInfo>) {\n this._token = token\n this._expiresAt = expiresAt ? new Date(expiresAt).getTime() : Infinity\n this._refreshFn = refreshFn\n this.scheduleRefresh()\n }\n\n async getAuthHeader(): Promise<string> {\n if (this.isExpired() && this._refreshFn) {\n await this.refresh()\n }\n return `Bearer ${this._token}`\n }\n\n /** Update the token (e.g. after a refresh) */\n update(info: TokenInfo): void {\n this._token = info.accessToken\n this._expiresAt = new Date(info.expiresAt).getTime()\n this.scheduleRefresh()\n }\n\n destroy(): void {\n if (this._refreshTimer) {\n clearTimeout(this._refreshTimer)\n this._refreshTimer = null\n }\n }\n\n private isExpired(): boolean {\n return Date.now() >= this._expiresAt - SKEW_MS\n }\n\n private async refresh(): Promise<void> {\n if (!this._refreshFn) return\n const info = await this._refreshFn()\n this.update(info)\n }\n\n private scheduleRefresh(): void {\n if (this._refreshTimer) clearTimeout(this._refreshTimer)\n if (!this._refreshFn || this._expiresAt === Infinity) return\n\n const delay = Math.max(0, this._expiresAt - Date.now() - SKEW_MS)\n this._refreshTimer = setTimeout(() => void this.refresh(), delay)\n }\n}\n","import type { AppApplicationContext, AppContext, AppSurface, EntryPointInfo, FileInfo, TokenGrant, WorkspaceInfo } from '../types'\n\n/**\n * Provides access to the current workspace and launch context.\n * In iframe mode, this is populated from the host's `verentis:init` message.\n * In standalone mode, the developer provides values via options.\n */\nexport class ContextModule {\n private _workspace: WorkspaceInfo | null = null\n private _surface: AppSurface | null = null\n private _file: FileInfo | null = null\n private _entryPoint: EntryPointInfo | null = null\n private _apiUrl: string | null = null\n private _application: AppApplicationContext | null = null\n private _installation: AppContext['installation'] | null = null\n private _grants: TokenGrant[] | null = null\n\n /** The current workspace */\n get workspace(): WorkspaceInfo {\n if (!this._workspace) {\n throw new Error('Workspace context not available. Ensure the client is initialized.')\n }\n return this._workspace\n }\n\n /** The host surface that launched the app */\n get surface(): AppSurface {\n if (!this._surface) {\n throw new Error('Launch surface not available. Ensure the client is initialized.')\n }\n return this._surface\n }\n\n /** The file that triggered the app to open on a file surface */\n get file(): FileInfo {\n if (!this._file) {\n throw new Error('File context not available. The app may be running on a workspace surface.')\n }\n return this._file\n }\n\n /** The API URL */\n get apiUrl(): string {\n if (!this._apiUrl) {\n throw new Error('API URL not available. Ensure the client is initialized.')\n }\n return this._apiUrl\n }\n\n /** Whether a file context is available */\n get hasFile(): boolean {\n return this._file !== null\n }\n\n /** The application entry point that matched the opened file */\n get entryPoint(): EntryPointInfo | null {\n return this._entryPoint\n }\n\n /** Whether an entry point context is available */\n get hasEntryPoint(): boolean {\n return this._entryPoint !== null\n }\n\n get application(): AppApplicationContext | null {\n return this._application ? { ...this._application } : null\n }\n\n get installation(): AppContext['installation'] | null {\n return this._installation ? { ...this._installation } : null\n }\n\n /**\n * The boundaries of a brokered token (canvas documents), as the host sent them with the token; `null` when the\n * token is not boundary-confined by a broker (or in standalone mode).\n */\n get grants(): TokenGrant[] | null {\n return this._grants ? this._grants.map(grant => ({ ...grant })) : null\n }\n\n /** Update the token's grants from the host's init or token refresh message */\n setGrants(grants: unknown): void {\n if (!Array.isArray(grants)) {\n this._grants = null\n return\n }\n this._grants = grants.filter((grant): grant is TokenGrant => typeof grant === 'object' && grant !== null\n && typeof grant.type === 'string' && typeof grant.identifier === 'string'\n && typeof grant.path === 'string' && grant.path.startsWith('/')\n && (grant.mode === 'read' || grant.mode === 'write') && typeof grant.source === 'string')\n .map(grant => ({ type: grant.type, identifier: grant.identifier, path: grant.path, mode: grant.mode, source: grant.source }))\n }\n\n /** Update context from the host's init message */\n setFromAppContext(ctx: AppContext): void {\n if (ctx.application !== undefined && (typeof ctx.application !== 'object' || ctx.application === null\n || typeof ctx.application.manifestPath !== 'string' || !ctx.application.manifestPath.startsWith('/')\n || typeof ctx.application.manifestNodeId !== 'string' || !ctx.application.manifestNodeId.trim()\n || typeof ctx.application.branch !== 'string' || !ctx.application.branch\n || ctx.application.branch !== ctx.application.branch.trim().toLowerCase()\n || /[\\u0000-\\u001f\\u007f]/.test(ctx.application.branch))) {\n throw new Error('Invalid application launch metadata')\n }\n this._workspace = ctx.workspace\n this._surface = ctx.surface ?? 'file'\n this._file = ctx.file ?? null\n this._entryPoint = ctx.entryPoint ?? null\n this._apiUrl = ctx.apiUrl\n this._application = ctx.application ? { ...ctx.application } : null\n this._installation = ctx.installation ? { ...ctx.installation } : null\n }\n\n /** Set workspace info directly (standalone mode) */\n setWorkspace(workspace: Partial<WorkspaceInfo> & { id: string }): void {\n this._workspace = {\n id: workspace.id,\n slug: workspace.slug ?? '',\n name: workspace.name ?? '',\n }\n }\n\n /** Set API URL directly */\n setApiUrl(url: string): void {\n this._apiUrl = url\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type {\n ExecuteEngineOptions,\n Execution,\n ExecutionLogs,\n ExecutionListOptions,\n PagedResult,\n ExecutionScopedOptions,\n ExecutionStatus,\n RunFileOptions,\n ScriptArgumentDescriptor,\n ScriptArgumentsOptions,\n WaitOptions,\n} from '../types'\n\n/** Schema of exported script argument descriptors. */\nexport const SCRIPT_ARGUMENTS_SCHEMA = 'verentis.io/script-arguments/v1'\n\nconst TERMINAL_STATUSES: ReadonlySet<ExecutionStatus> = new Set<ExecutionStatus>([\n 'Completed',\n 'Failed',\n 'Cancelled',\n 'TimedOut',\n])\n\n/** Returns true once an execution has reached a final state. */\nexport function isTerminalStatus(status: ExecutionStatus): boolean {\n return TERMINAL_STATUSES.has(status)\n}\n\n/**\n * Execution operations module. Triggers engine executions against files or a specific engine,\n * reads their status/result/logs, cancels them, and polls them to completion — all over the\n * Verentis execution API (`/v1/executions`).\n */\nexport class ExecutionsModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n /**\n * Run a file in the virtual file system. The platform resolves the appropriate engine from the\n * file's type (e.g. a `.py` file runs on the Python engine).\n */\n async run(filePath: string, options?: RunFileOptions): Promise<Execution> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<Execution>('POST', '/executions', {\n body: JSON.stringify({\n workspaceId,\n filePath,\n branch: options?.branch,\n tool: options?.tool,\n mode: options?.mode,\n arguments: options?.arguments ?? [],\n parameters: serializeParameters(options?.parameters),\n }),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /**\n * Execute a specific engine by id, optionally against a file and/or with structured parameters\n * (e.g. invoking an engine tool without a script).\n */\n async execute(engineId: string, options?: ExecuteEngineOptions): Promise<Execution> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<Execution>('POST', '/executions', {\n body: JSON.stringify({\n workspaceId,\n engineId,\n filePath: options?.filePath,\n branch: options?.branch,\n tool: options?.tool,\n mode: options?.mode,\n arguments: options?.arguments ?? [],\n parameters: serializeParameters(options?.parameters),\n }),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /**\n * Read the arguments a script declares (its exported `<script>.arguments.json`), e.g. to build a form\n * before {@link run}. Returns `null` for scripts that declare none. Reading never runs the script.\n */\n async getArguments(filePath: string, options?: ScriptArgumentsOptions): Promise<ScriptArgumentDescriptor | null> {\n const path = `${filePath}.arguments.json`.replace(/\\/+/g, '/').replace(/^\\//, '')\n const response = await this.http.requestRaw('GET', `/files/raw/${path}`, {\n params: { branch: options?.branch ?? 'main' },\n headers: { ...(this.workspaceId ? { 'X-Workspace-Id': this.workspaceId } : {}), Accept: 'application/json' },\n })\n if (response.status === 404) return null\n if (!response.ok) {\n throw new Error(`Failed to read script arguments: ${response.status} ${response.statusText}`)\n }\n const descriptor = (await response.json()) as ScriptArgumentDescriptor\n if (descriptor?.schema !== SCRIPT_ARGUMENTS_SCHEMA || !Array.isArray(descriptor.arguments)) {\n throw new Error(`Unsupported script argument descriptor for ${filePath}`)\n }\n return descriptor\n }\n\n /** Get an execution by id. */\n async get(id: string, options?: ExecutionScopedOptions): Promise<Execution> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<Execution>('GET', `/executions/${encodeURIComponent(id)}`, {\n params: { workspaceId },\n })\n }\n\n /** List workspace executions with optional engine, file, lifecycle, and time filters. */\n async list(options?: ExecutionListOptions): Promise<PagedResult<Execution>> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<PagedResult<Execution>>('GET', '/executions', {\n params: {\n workspaceId,\n filePath: options?.filePath,\n engineIds: options?.engineIds,\n filePaths: options?.filePaths,\n status: options?.status,\n trigger: options?.trigger,\n activeOnly: options?.activeOnly,\n requestedAfter: options?.requestedAfter,\n requestedBefore: options?.requestedBefore,\n pageNo: options?.pageNo ?? 1,\n pageSize: options?.pageSize ?? 20,\n orderBy: options?.orderBy,\n },\n })\n }\n\n /** Get the captured stdout/stderr of an execution. */\n async logs(id: string, options?: ExecutionScopedOptions): Promise<ExecutionLogs> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<ExecutionLogs>('GET', `/executions/${encodeURIComponent(id)}/logs`, {\n params: { workspaceId },\n })\n }\n\n /** Cancel a pending or running execution. */\n async cancel(id: string, options?: ExecutionScopedOptions): Promise<Execution> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<Execution>('POST', `/executions/${encodeURIComponent(id)}/cancel`, {\n body: JSON.stringify({ id, workspaceId }),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /**\n * Poll an execution until it reaches a terminal status. Returns immediately if it is already\n * terminal. Throws if `timeoutMs` elapses or the supplied signal aborts.\n */\n async wait(id: string, options?: WaitOptions): Promise<Execution> {\n const interval = options?.intervalMs ?? 1000\n const deadline = options?.timeoutMs ? Date.now() + options.timeoutMs : undefined\n\n for (;;) {\n const execution = await this.get(id, { workspaceId: options?.workspaceId })\n if (isTerminalStatus(execution.status)) {\n return execution\n }\n\n if (deadline !== undefined && Date.now() >= deadline) {\n throw new Error(`Timed out waiting for execution '${id}' to complete`)\n }\n\n await delay(interval, options?.signal)\n }\n }\n\n /**\n * Run a file and resolve once it has completed. For synchronous (request-response) executions the\n * initial response is already terminal; otherwise it polls via {@link wait}.\n */\n async runAndWait(filePath: string, options?: RunFileOptions & WaitOptions): Promise<Execution> {\n const execution = await this.run(filePath, options)\n if (isTerminalStatus(execution.status)) {\n return execution\n }\n return this.wait(execution.id, options)\n }\n\n private requireWorkspaceId(override?: string): string {\n const id = override ?? this.workspaceId\n if (!id) {\n throw new Error('workspaceId is required: provide it in options or when creating the client')\n }\n return id\n }\n}\n\n/** The platform expects `parameters` as a JSON string; serialize structured input for ergonomics. */\nfunction serializeParameters(parameters?: Record<string, unknown>): string | undefined {\n return parameters === undefined ? undefined : JSON.stringify(parameters)\n}\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'))\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(resolve, ms)\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer)\n reject(new DOMException('Aborted', 'AbortError'))\n },\n { once: true },\n )\n })\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type {\n ExecutionEngine,\n ExecutionEngineListOptions,\n ExecutionScopedOptions,\n PagedResult,\n} from '../types'\n\n/** Read-only access to execution engines registered in a workspace. */\nexport class EnginesModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n async list(options?: ExecutionEngineListOptions): Promise<PagedResult<ExecutionEngine>> {\n return this.http.request<PagedResult<ExecutionEngine>>('GET', '/engines', {\n params: {\n workspaceId: this.requireWorkspaceId(options?.workspaceId),\n pageNo: options?.pageNo ?? 1,\n pageSize: options?.pageSize ?? 20,\n orderBy: options?.orderBy,\n },\n })\n }\n\n async get(id: string, options?: ExecutionScopedOptions): Promise<ExecutionEngine> {\n return this.http.request<ExecutionEngine>('GET', `/engines/${encodeURIComponent(id)}`, {\n params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) },\n })\n }\n\n private requireWorkspaceId(override?: string): string {\n const workspaceId = override ?? this.workspaceId\n if (!workspaceId) {\n throw new Error('workspaceId is required: provide it in options or when creating the client')\n }\n return workspaceId\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type { DeleteFileOptions, ExtractUploadOptions, FileEntry, GetFileOptions, InstalledPackageDescriptor, MoveFileOptions, NodeFileContent, NodeFileMetadata, NodeFileOptions, ReadArchiveOptions, WriteFileOptions, WriteNodeFileOptions } from '../types'\n\n/**\n * File operations module. Provides read, write, list, move, and delete\n * against the Verentis Node file API.\n */\nexport class FilesModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n /**\n * Get file metadata or directory listing.\n * For files: returns metadata (path, name, mimeType, size, etc.).\n * For directories: returns metadata with children array populated.\n */\n async get(path: string, options?: GetFileOptions): Promise<FileEntry> {\n const normalizedPath = normalizePath(path)\n return this.http.request<FileEntry>('GET', `/files/${normalizedPath}`, {\n params: {\n branch: options?.branch ?? 'main',\n pageNo: options?.pageNo ?? 1,\n pageSize: options?.pageSize ?? 20,\n orderBy: options?.orderBy,\n },\n headers: this.workspaceHeaders(),\n })\n }\n\n /** Read metadata by stable node identity on an explicit branch. */\n async getNode(nodeId: string, options: NodeFileOptions): Promise<NodeFileMetadata> {\n requireNonBlank(nodeId, 'Node ID')\n requireNonBlank(options.branch, 'Branch')\n return this.http.request<NodeFileMetadata>('GET', `/nodes/${encodeURIComponent(nodeId)}/file`, {\n headers: { ...this.workspaceHeaders(), 'X-Branch': options.branch },\n })\n }\n\n /** Read bytes and their matching content revision in the same response. */\n async readNodeContent(nodeId: string, options: NodeFileOptions): Promise<NodeFileContent> {\n requireNonBlank(nodeId, 'Node ID')\n requireNonBlank(options.branch, 'Branch')\n const response = await this.http.requestRaw('GET', `/nodes/${encodeURIComponent(nodeId)}/content`, {\n headers: { ...this.workspaceHeaders(), 'X-Branch': options.branch, Accept: '*/*' },\n })\n await this.http.ensureSuccess(response)\n const revision = response.headers.get('ETag')\n if (!revision || !/^\"[a-fA-F0-9]{32}\"$/.test(revision)) {\n throw new Error('Node-content response did not include a valid strong revision ETag.')\n }\n return { content: await response.blob(), revision }\n }\n\n /** Replace existing node bytes conditionally; never creates or changes path/MIME. */\n async writeNodeContent(nodeId: string, options: WriteNodeFileOptions): Promise<NodeFileMetadata> {\n requireNonBlank(nodeId, 'Node ID')\n requireNonBlank(options.branch, 'Branch')\n requireNonBlank(options.idempotencyKey, 'Idempotency key')\n const revision = /^[a-fA-F0-9]{32}$/.test(options.revision)\n ? `\"${options.revision}\"`\n : options.revision\n if (!/^\"[a-fA-F0-9]{32}\"$/.test(revision)) {\n throw new Error('A single strong node-content revision is required.')\n }\n const content = typeof options.content === 'string'\n ? new Blob([options.content])\n : options.content instanceof ArrayBuffer ? new Blob([options.content]) : options.content\n return this.http.request<NodeFileMetadata>('PUT', `/nodes/${encodeURIComponent(nodeId)}/content`, {\n body: content,\n headers: {\n ...this.workspaceHeaders(),\n 'X-Branch': options.branch,\n 'If-Match': revision,\n 'Idempotency-Key': options.idempotencyKey,\n 'Content-Type': 'application/octet-stream',\n },\n })\n }\n\n /**\n * Read the raw content of a file as a Blob.\n */\n async readContent(path: string, branch?: string): Promise<Blob> {\n const normalizedPath = normalizePath(path)\n const response = await this.http.requestRaw('GET', `/files/raw/${normalizedPath}`, {\n params: { branch: branch ?? 'main' },\n headers: {\n ...this.workspaceHeaders(),\n Accept: '*/*',\n },\n })\n if (!response.ok) {\n throw new Error(`Failed to read file content: ${response.status} ${response.statusText}`)\n }\n return response.blob()\n }\n\n /** Read UTF-8 text content from a workspace file. */\n async readText(path: string, branch?: string): Promise<string> {\n return (await this.readContent(path, branch)).text()\n }\n\n /** Inspect an extracted or sealed package node without exposing sealed payload content. */\n async getPackageDescriptor(path: string, branch = 'main'): Promise<InstalledPackageDescriptor> {\n return this.http.request<InstalledPackageDescriptor>('GET', '/files/package-descriptor', {\n params: { branch, path },\n headers: this.workspaceHeaders(),\n })\n }\n\n /**\n * Download a file or directory as an archive (zip or tgz).\n * Only applicable when the target has children or you want a packaged download.\n */\n async readArchive(path: string, options?: ReadArchiveOptions): Promise<Blob> {\n const normalizedPath = normalizePath(path)\n const format = options?.format ?? 'zip'\n const response = await this.http.requestRaw('GET', `/files/raw/${normalizedPath}`, {\n params: {\n branch: options?.branch ?? 'main',\n format,\n },\n headers: {\n ...this.workspaceHeaders(),\n Accept: format === 'tgz' ? 'application/gzip' : 'application/zip',\n },\n })\n if (!response.ok) {\n throw new Error(`Failed to download archive: ${response.status} ${response.statusText}`)\n }\n return response.blob()\n }\n\n /**\n * Upload an archive (zip or tgz) and auto-extract its contents as individual nodes.\n * If the archive contains a `.verentis-manifest.json`, the original metadata\n * (display names, mime types, parent-content relationships) will be honoured.\n */\n async extractUpload(path: string, file: Blob, options?: ExtractUploadOptions): Promise<void> {\n const normalizedPath = normalizePath(path)\n const formData = new FormData()\n\n const filename = options?.filename ?? 'archive.zip'\n formData.append('file', file, filename)\n\n const metadata: Record<string, unknown> = {}\n if (options?.branch) metadata.branch = options.branch\n formData.append('metadata', JSON.stringify(metadata))\n\n await this.http.request('POST', `/files/${normalizedPath}`, {\n body: formData,\n headers: {\n ...this.workspaceHeaders(),\n 'X-Auto-Extract': 'true',\n },\n })\n }\n\n /**\n * Upload or create a file.\n */\n async write(path: string, options: WriteFileOptions): Promise<void> {\n const normalizedPath = normalizePath(path)\n const formData = new FormData()\n\n let blob: Blob\n if (typeof options.content === 'string') {\n blob = new Blob([options.content], { type: options.contentType ?? 'text/plain' })\n } else if (options.content instanceof ArrayBuffer) {\n blob = new Blob([options.content], { type: options.contentType ?? 'application/octet-stream' })\n } else {\n blob = options.content\n }\n\n const filename = options.filename ?? extractFilename(path)\n formData.append('file', blob, filename)\n\n const metadata: Record<string, unknown> = {}\n if (options.contentType) metadata.contentType = options.contentType\n if (options.branch) metadata.branch = options.branch\n formData.append('metadata', JSON.stringify(metadata))\n\n await this.http.request('POST', `/files/${normalizedPath.split('/').map(encodeURIComponent).join('/')}`, {\n body: formData,\n headers: {\n ...this.workspaceHeaders(),\n ...(options.createOnly ? { 'If-None-Match': '*' } : {}),\n },\n })\n }\n\n /** Create without a read-before-write race or overwrite of an existing live file. */\n async create(path: string, options: WriteFileOptions): Promise<void> {\n await this.write(path, { ...options, createOnly: true })\n }\n\n /**\n * Move or rename a file.\n */\n async move(options: MoveFileOptions): Promise<void> {\n await this.http.request('PUT', '/files', {\n body: JSON.stringify({\n from: normalizePath(options.from),\n to: normalizePath(options.to),\n branch: options.branch,\n }),\n headers: {\n ...this.workspaceHeaders(),\n 'Content-Type': 'application/json',\n },\n })\n }\n\n /**\n * Delete a file.\n */\n async remove(options: DeleteFileOptions): Promise<void> {\n const path = normalizePath(options.path)\n requireNonBlank(path, 'File path')\n const branch = options.branch ?? 'main'\n requireNonBlank(branch, 'Branch')\n if (options.headStamp !== undefined) requireNonBlank(options.headStamp, 'Path head stamp')\n if (options.idempotencyKey !== undefined) requireNonBlank(options.idempotencyKey, 'Idempotency key')\n await this.http.request('DELETE', `/files/${path.split('/').map(encodeURIComponent).join('/')}`, {\n params: { branch },\n headers: {\n ...this.workspaceHeaders(),\n ...(options.headStamp === undefined ? {} : { 'If-Match': options.headStamp }),\n ...(options.idempotencyKey === undefined ? {} : { 'Idempotency-Key': options.idempotencyKey }),\n ...(options.mode === undefined ? {} : { 'X-Delete-Mode': options.mode === 'deep' ? 'Deep' : 'Shallow' }),\n },\n })\n }\n\n private workspaceHeaders(): Record<string, string> {\n const headers: Record<string, string> = {}\n if (this.workspaceId) {\n headers['X-Workspace-Id'] = this.workspaceId\n }\n return headers\n }\n}\n\nfunction requireNonBlank(value: string, name: string): void {\n if (value.trim().length === 0) throw new Error(`${name} is required.`)\n}\n\n/** Normalize a file path: strip leading/trailing slashes, collapse doubles */\nfunction normalizePath(path: string): string {\n return path\n .replace(/\\/+/g, '/')\n .replace(/^\\//, '')\n .replace(/\\/$/, '')\n}\n\n/** Extract filename from a path */\nfunction extractFilename(path: string): string {\n const segments = path.split('/')\n return segments[segments.length - 1] || 'file'\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type {\n Installation,\n InstallationGraphPreview,\n InstallationGraphResult,\n InstallationDetail,\n InstallationLifecycleResult,\n InstallationListOptions,\n InstallationScopedOptions,\n PagedResult,\n PreviewInstallationOptions,\n ResolveInstallationOptions,\n UpdateInstallationOptions,\n} from '../types'\n\n/** Manage Marketplace installation ledger records for the current workspace. */\nexport class InstallationsModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n /** Resolve canonical publisher/package identity, never the installation's runtime display name. */\n async resolvePackageId(identity: string, options?: InstallationScopedOptions): Promise<string> {\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*\\/[a-z0-9]+(?:-[a-z0-9]+)*$/.test(identity)) {\n throw new Error('A canonical publisher/package identity is required')\n }\n const result = await this.http.request<{ id: string }>('GET', `/packages/by-package-id/${identity}`, {\n params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) },\n })\n if (!result || typeof result.id !== 'string' || !/^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/i.test(result.id)) {\n throw new Error('The catalog response omitted its stable package identity')\n }\n return result.id\n }\n\n /** Resolves the complete required graph without installing anything or granting capabilities. */\n async preview(packageId: string, options?: PreviewInstallationOptions): Promise<InstallationGraphPreview> {\n return this.http.request<InstallationGraphPreview>('POST', '/installations/graphs/preview', {\n body: JSON.stringify({\n workspaceId: this.requireWorkspaceId(options?.workspaceId),\n packageId,\n packageVersion: options?.packageVersion,\n installPath: options?.installPath,\n branch: options?.branch,\n installMode: options?.installMode,\n }),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /** Explicit, single-use consent to a displayed preview. Never automatically retries accepted installs. */\n async install(preview: InstallationGraphPreview, consent: true): Promise<InstallationGraphResult> {\n if (consent !== true) throw new Error('Explicit consent to the installation graph is required')\n return this.http.request<InstallationGraphResult>('POST', '/installations/graphs', {\n body: JSON.stringify({\n workspaceId: preview.workspaceId,\n operationId: preview.operationId,\n fingerprint: preview.fingerprint,\n consent,\n }),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /** Inspect durable outcomes after a failure or lost response instead of resubmitting consent. */\n async graphResult(operationId: string, options?: InstallationScopedOptions): Promise<InstallationGraphResult> {\n return this.http.request<InstallationGraphResult>('GET', `/installations/graphs/${encodeURIComponent(operationId)}`, {\n params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) },\n })\n }\n\n async list(options?: InstallationListOptions): Promise<PagedResult<Installation>> {\n return this.http.request<PagedResult<Installation>>('GET', '/installations', {\n params: {\n workspaceId: this.requireWorkspaceId(options?.workspaceId),\n pageNo: options?.pageNo ?? 1,\n pageSize: options?.pageSize ?? 20,\n orderBy: options?.orderBy,\n packageId: options?.packageId,\n branch: options?.branch,\n installPath: options?.installPath,\n status: options?.status,\n isSystem: options?.isSystem,\n },\n })\n }\n\n async resolve(\n installPath: string,\n options?: ResolveInstallationOptions,\n ): Promise<InstallationDetail> {\n return this.http.request<InstallationDetail>('GET', '/installations/resolve', {\n params: {\n workspaceId: this.requireWorkspaceId(options?.workspaceId),\n branch: options?.branch ?? 'main',\n installPath,\n },\n })\n }\n\n async update(\n id: string,\n options?: UpdateInstallationOptions,\n ): Promise<InstallationLifecycleResult> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<InstallationLifecycleResult>(\n 'PUT',\n `/installations/${encodeURIComponent(id)}`,\n {\n body: JSON.stringify({\n id,\n workspaceId,\n packageVersion: options?.packageVersion,\n installMode: options?.installMode,\n }),\n headers: { 'Content-Type': 'application/json' },\n },\n )\n }\n\n async uninstall(id: string, options?: InstallationScopedOptions): Promise<void> {\n await this.http.request<void>('DELETE', `/installations/${encodeURIComponent(id)}`, {\n params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) },\n })\n }\n\n private requireWorkspaceId(override?: string): string {\n const workspaceId = override ?? this.workspaceId\n if (!workspaceId) {\n throw new Error('workspaceId is required: provide it in options or when creating the client')\n }\n return workspaceId\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type { ResourceRegistration, ResourceScopedOptions } from '../types'\n\n/** Read-only access to workspace Resource registrations and resolved application handlers. */\nexport class ResourcesModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n async list(options?: ResourceScopedOptions): Promise<ResourceRegistration[]> {\n return this.http.request<ResourceRegistration[]>('GET', '/resources', {\n params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) },\n })\n }\n\n async get(id: string, options?: ResourceScopedOptions): Promise<ResourceRegistration> {\n return this.http.request<ResourceRegistration>(\n 'GET',\n `/resources/${encodeURIComponent(id)}`,\n { params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) } },\n )\n }\n\n private requireWorkspaceId(override?: string): string {\n const workspaceId = override ?? this.workspaceId\n if (!workspaceId) {\n throw new Error('workspaceId is required: provide it in options or when creating the client')\n }\n return workspaceId\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type {\n SettingGroup,\n SettingItem,\n SettingPresence,\n SettingsScopedOptions,\n} from '../types'\n\n/**\n * Workspace settings module. Reads (and where permitted, writes) workspace-scoped settings\n * over the Verentis settings API (`/v1/settings`).\n *\n * The app token must carry the matching scopes, declared in the manifest's `spec.permissions`:\n * `setting.read` (get, list), `setting.write` (set)\n * and `setting.delete` (reset).\n *\n * Secret values are server-only: for browser callers the platform always returns `value: null`\n * for secrets while `hasValue` reports whether one is configured. Manifest-declared settings\n * are stored namespaced as `{manifest-name}.{key}` — see {@link SettingsModule.namespaced}.\n */\nexport class SettingsModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n /** List every setting group visible to the workspace (definitions merged with values). */\n async list(options?: SettingsScopedOptions): Promise<SettingGroup[]> {\n return this.http.request<SettingGroup[]>('GET', '/settings', {\n params: this.scopeParams(options),\n })\n }\n\n /** Get a single setting by its full key (e.g. `graphite.api-key`). */\n async get(key: string, options?: SettingsScopedOptions): Promise<SettingItem> {\n return this.http.request<SettingItem>('GET', `/settings/${encodeURIComponent(key)}`, {\n params: this.scopeParams(options),\n })\n }\n\n /** Get a setting's value by its full key, or `defaultValue` when unset. */\n async getValue<T = unknown>(\n key: string,\n defaultValue?: T,\n options?: SettingsScopedOptions,\n ): Promise<T | undefined> {\n const item = await this.get(key, options)\n return (item.value ?? item.defaultValue ?? defaultValue) as T | undefined\n }\n\n /**\n * Check exact setting keys for retained stored values and effective defaults.\n * This never returns value content and also finds values retained after a definition is removed.\n */\n async presence(keys: string[], options?: SettingsScopedOptions): Promise<SettingPresence[]> {\n if (keys.length === 0) return []\n return this.http.request<SettingPresence[]>('GET', '/settings/presence', {\n params: {\n scopeKind: 'Workspace',\n parentId: this.requireWorkspaceId(options?.workspaceId),\n keys,\n },\n })\n }\n\n /** Upsert a setting value by its full key. Requires the `setting.write` scope. */\n async set(key: string, value: unknown, options?: SettingsScopedOptions): Promise<void> {\n await this.http.request<void>('PUT', `/settings/${encodeURIComponent(key)}`, {\n params: {\n scopeKind: 'Workspace',\n parentId: this.requireWorkspaceId(options?.workspaceId),\n },\n body: JSON.stringify(value ?? null),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /** Delete a stored value (reverting to the definition default). Requires `setting.delete`. */\n async reset(key: string, options?: SettingsScopedOptions): Promise<void> {\n await this.http.request<void>('DELETE', `/settings/${encodeURIComponent(key)}`, {\n params: {\n scopeKind: 'Workspace',\n parentId: this.requireWorkspaceId(options?.workspaceId),\n },\n })\n }\n\n /**\n * A view of this module where every key is auto-prefixed with `{namespace}.` — the platform's\n * manifest namespacing convention. An app named `graphite` declaring `key: api-key` reads it as:\n *\n * ```ts\n * const settings = client.settings.namespaced('graphite')\n * const apiKey = await settings.getValue<string>('api-key')\n * ```\n */\n namespaced(namespace: string): NamespacedSettings {\n const prefix = namespace.endsWith('.') ? namespace : `${namespace}.`\n return {\n get: (key, options) => this.get(prefix + key, options),\n getValue: (key, defaultValue, options) => this.getValue(prefix + key, defaultValue, options),\n set: (key, value, options) => this.set(prefix + key, value, options),\n reset: (key, options) => this.reset(prefix + key, options),\n }\n }\n\n private scopeParams(options?: SettingsScopedOptions): Record<string, string> {\n return {\n scopeKind: 'Workspace',\n parentId: this.requireWorkspaceId(options?.workspaceId),\n // Secret values never reach browser callers; the platform rejects `true` for\n // anything but trusted service-to-service identities.\n includeSecretValues: 'false',\n }\n }\n\n private requireWorkspaceId(override?: string): string {\n const workspaceId = override ?? this.workspaceId\n if (!workspaceId) {\n throw new Error(\n 'workspaceId is required: pass it in options or configure the client with one',\n )\n }\n return workspaceId\n }\n}\n\n/** Key-prefixed settings accessor returned by {@link SettingsModule.namespaced}. */\nexport interface NamespacedSettings {\n get(key: string, options?: SettingsScopedOptions): Promise<SettingItem>\n getValue<T = unknown>(\n key: string,\n defaultValue?: T,\n options?: SettingsScopedOptions,\n ): Promise<T | undefined>\n set(key: string, value: unknown, options?: SettingsScopedOptions): Promise<void>\n reset(key: string, options?: SettingsScopedOptions): Promise<void>\n}\n","// ---------------------------------------------------------------------------\n// PostMessage Protocol\n// ---------------------------------------------------------------------------\n\nexport interface VerentisMessage {\n type: `verentis:${string}`\n version: 1\n requestId?: string\n}\n\n// Host → App messages\nimport type { HeaderAction, HeaderActionResult } from './transport/header-actions'\nimport type { AppCommand } from './transport/app-commands'\nimport type { NativeCollaborationRequest, NativeCollaborationResponse } from './collaboration/native'\n\nexport interface VerentisInitMessage extends VerentisMessage {\n type: 'verentis:init'\n context: AppContext\n token: TokenInfo\n sessionId?: string\n /** Optional host features, e.g. `commands` for page command registration. */\n capabilities?: string[]\n}\n\nexport interface VerentisActionsSetMessage extends VerentisMessage {\n type: 'verentis:actions:set'\n sessionId: string\n actions: HeaderAction[]\n}\n\nexport interface VerentisActionInvokeMessage extends VerentisMessage {\n type: 'verentis:action:invoke'\n sessionId: string\n requestId: string\n actionId: string\n}\n\nexport interface VerentisActionResultMessage extends VerentisMessage {\n type: 'verentis:action:result'\n sessionId: string\n requestId: string\n actionId: string\n result?: HeaderActionResult\n error?: string\n}\n\n/** Incremental page-command registration. `reset` replaces everything the host holds for the session. */\nexport interface VerentisCommandsUpdateMessage extends VerentisMessage {\n type: 'verentis:commands:update'\n sessionId: string\n reset?: boolean\n upsert: AppCommand[]\n remove: string[]\n}\n\nexport interface VerentisCommandInvokeMessage extends VerentisMessage {\n type: 'verentis:command:invoke'\n sessionId: string\n requestId: string\n commandId: string\n}\n\nexport interface VerentisCommandResultMessage extends VerentisMessage {\n type: 'verentis:command:result'\n sessionId: string\n requestId: string\n commandId: string\n error?: string\n}\n\n/**\n * A message from the workspace (typically an agent acting for the user) on a channel the app declares in\n * its manifest `spec.messages`. Handled with `bridge.onHostMessage(channel, handler)`.\n */\nexport interface VerentisHostMessage extends VerentisMessage {\n type: 'verentis:host:message'\n sessionId: string\n requestId: string\n channel: string\n payload?: unknown\n}\n\nexport interface VerentisHostReplyMessage extends VerentisMessage {\n type: 'verentis:host:reply'\n sessionId: string\n requestId: string\n channel: string\n result?: unknown\n error?: string\n}\n\nexport interface VerentisTokenRefreshedMessage extends VerentisMessage {\n type: 'verentis:token:refreshed'\n requestId: string\n token: TokenInfo\n}\n\n/** Nonsecret active-document metadata. CODE already holds its own scoped credential. */\nexport interface WopiContinuation {\n sessionId: string\n workspaceId: string\n branch: string\n nodeId: string\n accessTokenTtl: number\n fileId: string\n format: string\n readOnly: boolean\n name: string\n}\n\n/** Initial document-scoped collaboration authority, never a platform OAuth credential. */\nexport interface WopiLaunch extends WopiContinuation {\n action: string\n accessToken: string\n editorOrigin: string\n wopiSource: string\n}\nexport interface WopiSaveCheckpoint {\n generation: number\n correlation: string\n revision?: string | null\n}\n\nexport interface WopiSaveStatus {\n state: string\n revision: string\n readOnly: boolean\n receipt: WopiSaveCheckpoint | null\n continuationAvailable?: boolean\n}\n\nexport interface VerentisWopiRequest extends VerentisMessage {\n type: 'verentis:wopi:request'\n requestId: string\n sessionId: string\n operation: 'launch' | 'status' | 'save' | 'close' | 'continue'\n generation?: number\n}\n\nexport interface VerentisWopiResponse extends VerentisMessage {\n type: 'verentis:wopi:response'\n requestId: string\n sessionId: string\n result?: WopiLaunch | WopiContinuation | WopiSaveCheckpoint | WopiSaveStatus | null\n error?: string\n}\n\nexport interface VerentisFileChangedMessage extends VerentisMessage {\n type: 'verentis:file:changed'\n path: string\n fileVersion?: string\n}\n\nexport interface VerentisThemeMessage extends VerentisMessage {\n type: 'verentis:theme'\n colorScheme: 'light' | 'dark'\n variables?: Record<string, string>\n}\n\n// App → Host messages\n\nexport interface VerentisReadyMessage extends VerentisMessage {\n type: 'verentis:ready'\n capabilities?: string[]\n}\n\nexport interface VerentisTokenRefreshMessage extends VerentisMessage {\n type: 'verentis:token:refresh'\n requestId: string\n}\n\nexport interface VerentisNavigateMessage extends VerentisMessage {\n type: 'verentis:navigate'\n /** Target of the navigation: a workspace file path or an absolute http(s) URL. */\n path: string\n /** When true, the host opens the target in a new browser tab instead of the current one. */\n newTab?: boolean\n}\n\nexport interface VerentisResizeMessage extends VerentisMessage {\n type: 'verentis:resize'\n height: number\n}\n\nexport interface VerentisTitleMessage extends VerentisMessage {\n type: 'verentis:title'\n title: string\n}\n\nexport interface VerentisDirtyMessage extends VerentisMessage {\n type: 'verentis:dirty'\n isDirty: boolean\n}\n\nexport type HostToAppMessage =\n | VerentisInitMessage\n | VerentisActionInvokeMessage\n | VerentisCommandInvokeMessage\n | VerentisHostMessage\n | VerentisTokenRefreshedMessage\n | VerentisFileChangedMessage\n | VerentisThemeMessage\n | VerentisWopiResponse\n | NativeCollaborationResponse\n\nexport type AppToHostMessage =\n | VerentisReadyMessage\n | VerentisActionsSetMessage\n | VerentisActionResultMessage\n | VerentisCommandsUpdateMessage\n | VerentisCommandResultMessage\n | VerentisHostReplyMessage\n | VerentisTokenRefreshMessage\n | VerentisNavigateMessage\n | VerentisResizeMessage\n | VerentisTitleMessage\n | VerentisDirtyMessage\n | VerentisWopiRequest\n | NativeCollaborationRequest\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport type AppSurface = 'file' | 'workspace'\n\ninterface AppContextBase {\n application?: AppApplicationContext\n workspace: WorkspaceInfo\n entryPoint?: EntryPointInfo\n apiUrl: string\n installation?: { id: string; backendClientId?: string; authorizationGeneration?: string; wopiEnabled?: boolean }\n}\n\nexport interface AppApplicationContext {\n manifestPath: string\n manifestNodeId: string\n branch: string\n}\n\n/** Context for an application opened against a workspace file. */\nexport interface FileAppContext extends AppContextBase {\n surface: 'file'\n file: FileInfo\n}\n\n/** Context for an application opened as a standalone workspace experience. */\nexport interface WorkspaceAppContext extends AppContextBase {\n surface: 'workspace'\n file?: never\n}\n\n/**\n * Legacy file-hosted contexts did not include a surface discriminator. They\n * remain accepted and are treated as `file` surfaces by the SDK.\n */\ninterface LegacyFileAppContext extends AppContextBase {\n surface?: undefined\n file: FileInfo\n}\n\n/**\n * Application context supplied by the workspace host.\n *\n * New hosts explicitly identify `file` or `workspace` surfaces. The legacy\n * file shape without `surface` remains supported for backwards compatibility.\n */\nexport type AppContext = FileAppContext | WorkspaceAppContext | LegacyFileAppContext\n\nexport interface WorkspaceInfo {\n id: string\n slug: string\n name: string\n}\n\nexport interface FileInfo {\n nodeId?: string\n branch?: string\n path: string\n name: string\n mimeType: string\n size: number\n version?: string\n etag?: string\n}\n\nexport interface EntryPointInfo {\n id: string\n displayName: string\n description?: string\n icon?: string\n route: string\n mode: 'view' | 'edit'\n matchedPattern: string\n priority: number\n}\n\n/**\n * One boundary of a brokered token (canvas documents): the platform-normalized workspace `path` it confines to and\n * the `mode` granted there. Informational for client-side UX; the platform enforces the token itself.\n */\nexport interface TokenGrant {\n type: string\n identifier: string\n path: string\n mode: 'read' | 'write'\n source: 'bound' | 'document' | 'declared'\n}\n\nexport interface TokenInfo {\n accessToken: string\n expiresAt: string\n scopes: string[]\n /** Brokered tokens only: the boundaries the token carries. */\n grants?: TokenGrant[]\n}\n\n// ---------------------------------------------------------------------------\n// Client Options\n// ---------------------------------------------------------------------------\n\nexport interface VerentisClientOptions {\n /** Base URL of the Verentis API gateway (e.g. 'https://api.verentis.com') */\n apiUrl?: string\n /** API version prefix (defaults to 'v1') */\n apiVersion?: string\n /** Authentication configuration */\n auth?: AuthOptions\n /** Workspace ID for standalone mode */\n workspaceId?: string\n}\n\nexport type AuthOptions =\n | { apiKey: string }\n | { token: string; expiresAt?: string; refreshToken?: () => Promise<TokenInfo> }\n\n/**\n * Options for {@link VerentisNavigateMessage}-based navigation requests.\n */\nexport interface NavigateOptions {\n /**\n * When true, the host opens the target in a new browser tab instead of\n * navigating the current tab. Defaults to false.\n *\n * The target may be a workspace file path or an absolute http(s) URL.\n * Opening an external URL requires the app to declare the\n * `navigation:external` capability in its manifest.\n */\n newTab?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// File API Types\n// ---------------------------------------------------------------------------\n\nexport interface FileEntry {\n path: string\n name: string\n size: number\n mimeType: string\n version?: string\n etag?: string\n children?: FileEntry[]\n /** Stable node identity, when supplied by the path metadata API. */\n nodeId?: string\n}\n\nexport interface NodeFileMetadata {\n nodeId: string\n path: string\n name: string\n mimeType: string\n size?: number | null\n /** Unquoted opaque content revision; distinct from a path delete head stamp. */\n etag: string\n version: string\n children?: PagedResult<FileEntry>\n}\n\nexport interface NodeFileOptions {\n branch: string\n}\n\nexport interface NodeFileContent {\n content: Blob\n /** Strong quoted ETag returned by the node-content API. */\n revision: string\n}\n\nexport interface WriteNodeFileOptions extends NodeFileOptions {\n content: Blob | string | ArrayBuffer\n /** Strong quoted revision, or the unquoted etag returned by getNode. */\n revision: string\n idempotencyKey: string\n}\n\nexport interface GetFileOptions {\n branch?: string\n pageNo?: number\n pageSize?: number\n orderBy?: string\n}\n\nexport interface WriteFileOptions {\n content: Blob | string | ArrayBuffer\n contentType?: string\n filename?: string\n branch?: string\n /** Atomically require no live file at this path; conflicts return HTTP 412. */\n createOnly?: boolean\n}\n\nexport interface MoveFileOptions {\n from: string\n to: string\n branch?: string\n}\n\nexport interface DeleteFileOptions {\n path: string\n branch?: string\n /** Path-binding head stamp, not a node-content revision. */\n headStamp?: string\n idempotencyKey?: string\n mode?: 'shallow' | 'deep'\n}\n\nexport type ArchiveFormat = 'zip' | 'tgz'\n\nexport interface ReadArchiveOptions {\n /** Archive format. Defaults to 'zip'. */\n format?: ArchiveFormat\n /** Target branch. Defaults to 'main'. */\n branch?: string\n}\n\nexport interface ExtractUploadOptions {\n /** Original filename of the archive (for format detection). */\n filename?: string\n /** Target branch. Defaults to 'main'. */\n branch?: string\n}\n\nexport interface InstalledPackagePayload {\n sourcePath: string\n destinationPath: string\n mode: string\n phase: number\n mimeType?: string | null\n}\n\nexport interface InstalledPackageDescriptor {\n packageIdentity: string\n publisher?: string | null\n name: string\n version: string\n kind: string\n manifestYaml: string\n installMode: string\n sealed: boolean\n mimeType: string\n payloads: InstalledPackagePayload[]\n}\n\n// ---------------------------------------------------------------------------\n// Installation API\n// ---------------------------------------------------------------------------\n\nexport type InstallationMode = 'Extracted' | 'Sealed'\n\n/** Required dependencies use immutable exact SemVer pins; optional packages are never implicit installs. */\nexport interface PackageDependency {\n package: string\n version: string\n installPath?: string | null\n optional?: boolean\n}\n\nexport interface InstallationGraphPackage {\n packageId: string\n packageVersionId: string\n publisherId: string\n identity: string\n publisher: string\n version: string\n treeDigest: string\n artifactFingerprint: string\n manifestYaml: string\n verifiedSigningKeyKid?: string | null\n branch: string\n installPath: string\n installMode: InstallationMode\n reuseInstallationId?: string | null\n /** Only a previously Failed exact target can be recovered, after a fresh explicit preview. */\n retryInstallationId?: string | null\n permissions: string[]\n dependencies: PackageDependency[]\n /** Conservative destination reservations, including external install-map/seed roots. */\n installPaths: string[]\n}\n\nexport interface InstallationGraphPreview {\n operationId: string\n workspaceId: string\n expiresAt: string\n fingerprint: string\n /** Topological installation order: required dependencies before their dependents. */\n packages: InstallationGraphPackage[]\n}\n\nexport type InstallationGraphOutcomeStatus =\n | 'Pending' | 'Installing' | 'Reused' | 'Installed' | 'InstalledWithError' | 'Failed' | 'NotAttempted'\n\nexport interface InstallationGraphResult {\n operationId: string\n status: 'Preview' | 'Accepted' | 'Completed' | 'Rejected' | 'Failed'\n succeeded: boolean\n /** The exact durable preview baseline, also available after a lost preview/install response. */\n packages: InstallationGraphPackage[]\n outcomes: {\n identity: string\n status: InstallationGraphOutcomeStatus\n installationId?: string | null\n error?: string | null\n }[]\n error?: string | null\n}\n\nexport interface PreviewInstallationOptions extends InstallationScopedOptions {\n packageVersion?: string\n installPath?: string\n branch?: string\n installMode?: InstallationMode\n}\n\nexport type InstallationStatus =\n | 'Pending'\n | 'Installing'\n | 'Installed'\n | 'Updating'\n | 'Uninstalling'\n | 'Failed'\n | 'Uninstalled'\n\nexport interface Installation {\n id: string\n accountId: string\n workspaceId: string\n packageId: string\n packageVersionId: string\n packageName: string\n publisherName: string\n version: string\n installPath: string\n branch: string\n installMode: InstallationMode\n status: InstallationStatus\n installedBy: string\n errorMessage?: string | null\n createdAt: string\n updatedAt?: string | null\n securityFlagged: boolean\n securityFlagReason?: string | null\n isSystem: boolean\n systemKey?: string | null\n protectionReason?: string | null\n}\n\nexport interface CatalogImage {\n assetId: string\n url: string\n alt: string\n caption?: string | null\n mediaType: string\n}\n\nexport interface InstallationDetail {\n installation: Installation\n installedVersionStatus: string\n installedReadmeMarkdown?: string | null\n installedChangelogMarkdown?: string | null\n installedDisplayName?: string | null\n installedDescription?: string | null\n installedLogoUrl?: string | null\n installedHeroUrl?: string | null\n installedImages: CatalogImage[]\n installedBadges: string[]\n installedIsDeprecated: boolean\n installedDeprecationMessage?: string | null\n installedIsMalicious: boolean\n installedIsDelisted: boolean\n publisherId: string\n publisherName: string\n publisherDisplayName: string\n publisherLogoUrl?: string | null\n publisherIsVerified: boolean\n publisherBadges: string[]\n publisherIsMalicious: boolean\n packageBadges: string[]\n packageIsMalicious: boolean\n packageIsDeprecated: boolean\n packageDeprecationMessage?: string | null\n latestVersion?: string | null\n latestVersionId?: string | null\n updateAvailable: boolean\n canUpdate: boolean\n canRetry: boolean\n canDelete: boolean\n allowedActions: string[]\n}\n\nexport interface InstallationLifecycleResult {\n installationId: string\n status: InstallationStatus\n succeeded: boolean\n error?: string | null\n}\n\nexport interface InstallationScopedOptions {\n workspaceId?: string\n}\n\nexport interface InstallationListOptions extends InstallationScopedOptions {\n pageNo?: number\n pageSize?: number\n orderBy?: string\n packageId?: string\n branch?: string\n installPath?: string\n status?: InstallationStatus\n isSystem?: boolean\n}\n\nexport interface ResolveInstallationOptions extends InstallationScopedOptions {\n branch?: string\n}\n\nexport interface UpdateInstallationOptions extends InstallationScopedOptions {\n packageVersion?: string\n installMode?: InstallationMode\n}\n\n// ---------------------------------------------------------------------------\n// Auth Strategy (internal)\n// ---------------------------------------------------------------------------\n\nexport interface AuthStrategy {\n getAuthHeader(): Promise<string | null>\n destroy?(): void\n}\n\n// ---------------------------------------------------------------------------\n// Application Manifest\n// ---------------------------------------------------------------------------\n\nexport interface MimeTypeBinding {\n pattern: string\n mode: 'view' | 'edit'\n priority: number\n icon?: string\n}\n\nexport interface ApplicationFileType {\n pattern: string\n extensions: string[]\n priority: number\n icon?: string\n}\n\nexport interface ApplicationManifest {\n apiVersion: string\n kind: 'Application'\n metadata: ManifestMetadata\n spec: ApplicationSpec\n}\n\nexport interface ManifestMetadata {\n /** Package identity (`metadata.id`). */\n id: string\n /** Optional human-friendly label (`metadata.name`); displays fall back to {@link id}. */\n name?: string\n description?: string\n icon?: string\n version?: string\n author?: string\n labels?: Record<string, string>\n annotations?: Record<string, string>\n}\n\nexport type InstallMode = 'seed' | 'managed'\n\nexport interface InstallDirective {\n /** Source path/glob relative to the package payload root. Must match at least one file. */\n from: string\n /**\n * Destination workspace-absolute VFS path. A trailing `/` denotes a directory (the source's\n * basename / relative subpath is preserved beneath it); otherwise an exact file path.\n */\n to: string\n /**\n * `seed` = install once, never overwrite an existing/user-edited file (never removed on upgrade);\n * `managed` = app-owned, created and replaced on upgrade, removed on uninstall. Default `managed`.\n */\n mode?: InstallMode\n /** Optional explicit MIME for placed nodes; else inferred / resolved by json-schema. */\n mime?: string\n /** Optional sequential install phase; omitted directives remain in the legacy single phase. */\n phase?: number\n}\n\nexport interface ApplicationLaunchConfig {\n /**\n * Enables standalone launch from the workspace. Defaults to `false`.\n *\n * When enabled, the platform requires `entryPoint` or `spec.entry` to\n * resolve an iframe entry.\n */\n enabled?: boolean\n /**\n * Optional entry-point ID to use as the standalone home. When omitted, the\n * platform falls back to `spec.entry`.\n */\n entryPoint?: string\n /**\n * Whether users may pin the launch surface. Defaults to `false` and does not\n * pin it automatically.\n */\n pinnable?: boolean\n}\n\nexport interface ApplicationDisplayOptions {\n fullscreen?: boolean\n}\n\nexport interface ApplicationEntryPoint {\n id: string\n displayName?: string\n description?: string\n icon?: string\n route?: string\n /** Optional per-entry-point iframe URL override. */\n entry?: string\n /** Optional splash URL override. Relative values resolve against this entry point's iframe URL. */\n splash?: string\n order?: number\n mimeTypes?: MimeTypeBinding[]\n display?: ApplicationDisplayOptions\n}\n\nexport interface ApplicationSpec {\n dependencies?: PackageDependency[]\n /** Publisher-qualified required engine dependency for script-bearing packages. */\n engine?: string\n /** Optional iframe UI surface URL. Omit for a headless / file-collection app. */\n entry?: string\n /** Optional application splash URL. Relative values resolve against the selected iframe entry URL. */\n splash?: string\n /** Named iframe surfaces; `launch.entryPoint` references one of these ids. */\n entryPoints?: ApplicationEntryPoint[]\n scope?: string\n mimeTypes?: MimeTypeBinding[]\n fileTypes?: ApplicationFileType[]\n capabilities?: string[]\n permissions?: string[]\n sandbox?: SandboxOptions\n oauth?: OAuthConfig\n scopes?: string[]\n /** Declarative install map: where packaged files land in the workspace VFS. */\n install?: InstallDirective[]\n /** Where the app-record (manifest node) is anchored. Default `/applications/{id}`. */\n installRoot?: string\n /** Default display behavior inherited by entry points. */\n display?: ApplicationDisplayOptions\n /**\n * Opt-in standalone workspace launch configuration. The platform defaults\n * `enabled` and `pinnable` to `false` when omitted.\n */\n launch?: ApplicationLaunchConfig\n /**\n * Workspace settings and secrets this app requires. Declared settings are auto-registered\n * in the workspace settings store under `{metadata.id}.{key}` and surfaced in the\n * settings UI. Secret values never reach browser contexts.\n */\n settings?: SettingDeclaration[]\n}\n\n/** Data type of a declared setting value. */\nexport type SettingDeclarationType = 'string' | 'number' | 'boolean' | 'select' | 'file'\n\n/**\n * A workspace setting or secret an application/engine manifest requires. The platform\n * auto-creates a matching setting definition (namespaced `{metadata.id}.{key}`) so\n * workspace admins can provide the value; engines receive values at run time.\n */\nexport interface SettingDeclaration {\n /** Short key; stored namespaced as `{metadata.id}.{key}` in the settings store. */\n key: string\n /** Optional environment variable name injected into engine runs (e.g. `MY_API_KEY`). */\n env?: string\n /**\n * Secret values are server-only: delivered to Docker engine runs, never to browser\n * contexts (wasm runs, iframe apps). Defaults to `false`.\n */\n secret?: boolean\n /**\n * Required settings prompt during marketplace install and fail an execution fast when\n * no value is configured. Defaults to `false`.\n */\n required?: boolean\n displayName?: string\n description?: string\n /**\n * Value input type. `file` prompts the installer to select a local file and stores its\n * bytes as a base64 string. Defaults to `string`.\n */\n type?: SettingDeclarationType\n /** Default value. Not allowed for secrets. */\n default?: string | number | boolean\n /** Allowed values when `type` is `select`. */\n options?: string[]\n}\n\nexport interface OAuthConfig {\n clientType: string\n redirectUris?: string[]\n}\n\nexport interface SandboxOptions {\n allowScripts?: boolean\n allowSameOrigin?: boolean\n allowPopups?: boolean\n allowForms?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Execution API\n// ---------------------------------------------------------------------------\n\n/** Lifecycle status of an execution. Mirrors the platform `ExecutionStatus` enum. */\nexport type ExecutionStatus =\n | 'Pending'\n | 'Queued'\n | 'Running'\n | 'Completed'\n | 'Failed'\n | 'Cancelled'\n | 'TimedOut'\n | 'AwaitingClient'\n\n/** How an execution is run. Mirrors the platform `ExecutionMode` enum. */\nexport type ExecutionMode = 'RequestResponse' | 'LongRunning' | 'Scheduled' | 'EventDriven'\n\n/** What triggered an execution. Mirrors the platform `ExecutionTrigger` enum. */\nexport type ExecutionTrigger = 'User' | 'Api' | 'Schedule' | 'Event'\n\n/** The structured outcome of an execution. */\nexport interface ExecutionResult {\n exitCode: number\n stdout?: string | null\n stderr?: string | null\n /** Raw JSON payload the engine reported in `result.json`, as a string. */\n data?: string | null\n artifacts: string[]\n durationMs: number\n error?: string | null\n}\n\n/** A single execution record. */\nexport interface Execution {\n id: string\n workspaceId: string\n engineId: string\n engineName: string\n filePath?: string | null\n mode: ExecutionMode\n trigger: ExecutionTrigger\n tool?: string | null\n status: ExecutionStatus\n requestedAt: string\n startedAt?: string | null\n completedAt?: string | null\n result?: ExecutionResult | null\n}\n\n/** Captured stdout/stderr of an execution. */\nexport interface ExecutionLogs {\n stdout?: string | null\n stderr?: string | null\n}\n\n/** Options for running a file (engine resolved by the file's type). */\nexport interface RunFileOptions {\n /** Workspace to run in. Defaults to the client's workspace. */\n workspaceId?: string\n branch?: string\n tool?: string\n mode?: string\n arguments?: string[]\n /** Structured parameters passed to the engine; serialized to JSON for the platform. */\n parameters?: Record<string, unknown>\n}\n\n/** Value type of a declared script argument. */\nexport type ScriptArgumentType = 'string' | 'integer' | 'number' | 'boolean' | 'date'\n\n/** One declared script argument (an option such as `--customer-id`, or a positional). */\nexport interface ScriptArgumentDefinition {\n /** Canonical name, e.g. `customer-id`. Structured parameters with this key become the option. */\n name: string\n kind: 'option' | 'positional'\n /** Option flags, e.g. `[\"--customer-id\", \"-c\"]`. */\n flags?: string[]\n type: ScriptArgumentType\n required: boolean\n repeatable: boolean\n default?: unknown\n choices?: Array<string | number>\n minimum?: number\n maximum?: number\n help?: string\n label?: string\n metavar?: string\n /** Option may appear without a value. */\n valueOptional?: boolean\n /** Flag that sets a boolean option to false, e.g. `--no-cache`. */\n negation?: string\n /** Value a boolean flag stores when present. */\n presentValue?: boolean\n}\n\n/**\n * A script's exported argument declaration (`<script>.arguments.json`, schema\n * `verentis.io/script-arguments/v1`). The platform validates runs against it and the workspace prompts\n * for missing required arguments.\n */\nexport interface ScriptArgumentDescriptor {\n schema: 'verentis.io/script-arguments/v1'\n script?: string\n /** SHA-256 of the script the descriptor was exported from. */\n sourceSha256?: string\n description?: string\n /** `options`: structured parameters named like an option are passed as that option. */\n parameters?: 'options'\n /** A parameter that selects a sibling script with its own descriptor. */\n variants?: { parameter: string; scripts: Record<string, string> }\n arguments: ScriptArgumentDefinition[]\n exclusiveGroups?: Array<{ required: boolean; arguments: string[] }>\n}\n\n/** Options for reading a script's argument declaration. */\nexport interface ScriptArgumentsOptions {\n branch?: string\n}\n\n/** Options for executing a specific engine (optionally against a file). */\nexport interface ExecuteEngineOptions {\n workspaceId?: string\n filePath?: string\n branch?: string\n tool?: string\n mode?: string\n arguments?: string[]\n parameters?: Record<string, unknown>\n}\n\n/** Options that only need to scope a request to a workspace. */\nexport interface ExecutionScopedOptions {\n workspaceId?: string\n}\n\nexport interface ExecutionListOptions extends ExecutionScopedOptions {\n filePath?: string\n engineIds?: string[]\n filePaths?: string[]\n status?: ExecutionStatus\n trigger?: ExecutionTrigger\n activeOnly?: boolean\n requestedAfter?: string\n requestedBefore?: string\n pageNo?: number\n pageSize?: number\n orderBy?: string\n}\n\nexport interface PagedResult<T> {\n totalCount: number\n pageCount: number\n pageSize: number\n pageNumber: number\n data: T[]\n}\n\nexport interface EngineRuntime {\n kind: 'Docker' | 'Wasm'\n image?: string | null\n pullPolicy?: string | null\n moduleUrl?: string | null\n runtimeHint?: string | null\n serverCompatible: boolean\n clientCompatible: boolean\n adapterUrl?: string | null\n}\n\nexport interface EngineFileType {\n pattern: string\n extensions: string[]\n priority: number\n icon?: string\n}\n\nexport interface EngineTool {\n name: string\n description?: string | null\n inputSchema?: string | null\n outputSchema?: string | null\n}\n\nexport interface ExecutionEngine {\n id: string\n workspaceId: string\n name: string\n displayName: string\n description?: string | null\n icon?: string | null\n version: string\n author?: string | null\n category?: string | null\n tier?: string | null\n sourcePath: string\n priority: number\n enabled: boolean\n capabilities: string[]\n permissions: string[]\n supportedModes: string[]\n runtimes: EngineRuntime[]\n fileTypes: EngineFileType[]\n tools: EngineTool[]\n resources?: {\n cpu?: string | null\n memory?: string | null\n timeoutSeconds: number\n maxConcurrent: number\n storage?: string | null\n } | null\n sandbox?: {\n network: string\n allowedHosts: string[]\n readOnlyRoot: boolean\n noNewPrivileges: boolean\n } | null\n firstParty: boolean\n}\n\nexport interface ExecutionEngineListOptions extends ExecutionScopedOptions {\n pageNo?: number\n pageSize?: number\n orderBy?: string\n}\n\n/** Options for polling an execution to completion. */\nexport interface WaitOptions extends ExecutionScopedOptions {\n /** Poll interval in milliseconds (default 1000). */\n intervalMs?: number\n /** Maximum time to wait in milliseconds before throwing. */\n timeoutMs?: number\n /** Abort signal to cancel waiting. */\n signal?: AbortSignal\n}\n\n// ---------------------------------------------------------------------------\n// Settings API\n// ---------------------------------------------------------------------------\n\n/** An allowed value for a `select` setting. */\nexport interface SettingOption {\n value: string\n label: string\n}\n\n/**\n * A single workspace setting merged from its definition and any stored value.\n * Secret values are always `null` for browser callers; `hasValue` still reports\n * whether a value (or default) is configured.\n */\nexport interface SettingItem {\n key: string\n group: string\n label: string\n description?: string | null\n dataType: string\n isSecret: boolean\n options?: SettingOption[] | null\n defaultValue?: unknown\n value?: unknown\n hasValue: boolean\n}\n\n/** A labeled group of settings (e.g. one group per application). */\nexport interface SettingGroup {\n key: string\n label: string\n items: SettingItem[]\n}\n\n/** Options that scope a settings request to a workspace. */\nexport interface SettingsScopedOptions {\n workspaceId?: string\n}\n\n/** Presence-only result. Stored secret and non-secret values are never included. */\nexport interface SettingPresence {\n key: string\n hasStoredValue: boolean\n hasEffectiveValue: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Resource API\n// ---------------------------------------------------------------------------\n\nexport interface ResourceMimeTypeBinding {\n id: string\n pattern: string\n mode: string\n priority: number\n}\n\nexport interface ResourceRegistration {\n id: string\n accountId: string\n workspaceId: string\n name: string\n displayName?: string | null\n description?: string | null\n icon?: string | null\n version?: string | null\n author?: string | null\n entryUrl?: string | null\n kind: string\n scope: string\n manifestPath: string\n manifestNodeId: string\n manifestHash: string\n branch: string\n spec?: string | null\n labels?: string | null\n capabilities?: string | null\n permissions?: string | null\n sandboxConfig?: string | null\n createdAt: string\n updatedAt?: string | null\n mimeTypeBindings: ResourceMimeTypeBinding[]\n entryPointId?: string | null\n entryPointDisplayName?: string | null\n entryPointDescription?: string | null\n entryPointIcon?: string | null\n entryPointRoute?: string | null\n entryPointEntryUrl?: string | null\n entryPointMode?: string | null\n entryPointMatchedPattern?: string | null\n entryPointPriority?: number | null\n entryPointFullscreen?: boolean | null\n entryPointSplashUrl?: string | null\n launchEnabled: boolean\n launchEntryPointId?: string | null\n launchPinnable: boolean\n}\n\nexport interface ResourceScopedOptions {\n workspaceId?: string\n}\n\n// ---------------------------------------------------------------------------\n// HTTP Transport Types (internal)\n// ---------------------------------------------------------------------------\n\nexport interface RequestOptions {\n headers?: Record<string, string>\n body?: BodyInit | null\n params?: Record<string, string | number | boolean | readonly (string | number)[] | undefined>\n}\n\nexport class ApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly detail: string,\n public readonly title?: string,\n public readonly code?: string,\n public readonly retryAfterMs?: number,\n ) {\n super(title ?? `API error ${status}: ${detail}`)\n this.name = 'ApiError'\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport { ApiError } from '../types'\nimport type {\n NotificationRequestOptions,\n NotificationRequestStatus,\n NotificationSendOptions,\n} from '../types/notifications'\n\n/** Send app notifications through the installed package's registered catalogue. */\nexport class NotificationsModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n async send(options: NotificationSendOptions): Promise<NotificationRequestStatus> {\n const request = {\n body: JSON.stringify({\n workspaceId: this.requireWorkspaceId(options.workspaceId),\n installationId: options.installationId,\n typeKey: options.typeKey,\n idempotencyKey: options.idempotencyKey,\n userIds: options.userIds,\n audienceScope: options.audienceScope,\n emailAddresses: options.emailAddresses,\n parameters: options.parameters,\n }),\n headers: { 'Content-Type': 'application/json' },\n }\n const deadline = Date.now() + 10_000\n for (;;) {\n try {\n return await this.http.request<NotificationRequestStatus>('POST', '/notifications/send', request)\n } catch (error) {\n if (!(error instanceof ApiError) || error.status !== 409 || error.code !== 'execution_not_ready') {\n throw error\n }\n const delay = Math.max(250, error.retryAfterMs ?? 1000)\n if (Date.now() + delay > deadline) throw error\n await new Promise(resolve => setTimeout(resolve, delay))\n }\n }\n }\n\n async request(id: string, options?: NotificationRequestOptions): Promise<NotificationRequestStatus> {\n return this.http.request<NotificationRequestStatus>(\n 'GET',\n `/notifications/requests/${encodeURIComponent(id)}`,\n {\n params: {\n workspaceId: this.requireWorkspaceId(options?.workspaceId),\n installationId: options?.installationId,\n },\n },\n )\n }\n\n private requireWorkspaceId(override?: string): string {\n const workspaceId = override ?? this.workspaceId\n if (!workspaceId) {\n throw new Error('workspaceId is required: provide it in options or when creating the client')\n }\n return workspaceId\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type {\n BusinessCommand, BusinessCommitResult, BusinessContext, BusinessOutcomeRequest,\n BusinessReport, BusinessReportName, BusinessSnapshot,\n} from '../types/business'\n\n/**\n * Trusted workspace business records, independent of app scripts or generic file writes.\n * Never automatically retries a command: resolve a lost response with outcome() or\n * resubmit the exact same command/key to obtain the original durable result.\n */\nexport class BusinessModule {\n constructor(private readonly http: HttpTransport, private readonly branch = 'main') {}\n\n withBranch(branch: string): BusinessModule {\n return new BusinessModule(this.http, branch)\n }\n\n async context(): Promise<BusinessContext> {\n return this.http.request('GET', '/business/context', { headers: this.headers() })\n }\n\n async command(command: BusinessCommand): Promise<BusinessCommitResult> {\n if (!command.idempotencyKey?.trim() || command.idempotencyKey.length > 200 || /[\\u0000-\\u001f\\u007f-\\u009f]/.test(command.idempotencyKey)) {\n throw new Error('A bounded printable idempotency key is required')\n }\n if (command.expectedRevision !== undefined && !/^\"[a-f0-9]{32}\"$/.test(command.expectedRevision)) {\n throw new Error('An exact strong quoted canonical revision is required')\n }\n return this.http.request('POST', '/business/commands', {\n headers: this.headers(), body: JSON.stringify(command),\n })\n }\n\n async read(id: string): Promise<BusinessSnapshot | null> {\n return this.http.request('GET', `/business/records/${encodeURIComponent(id)}`, { headers: this.headers() })\n }\n\n async list(kind?: string): Promise<BusinessSnapshot[]> {\n return this.http.request('GET', '/business/records', {\n headers: this.headers(), params: kind ? { kind } : {},\n })\n }\n\n /** null means unresolved, not success; do not invent a new operation key. */\n async outcome(request: BusinessOutcomeRequest): Promise<BusinessCommitResult | null> {\n return this.http.request('POST', '/business/outcomes', {\n headers: this.headers(), body: JSON.stringify(request),\n })\n }\n\n /** Recover using the exact original command, without reproducing server fingerprint encoding. */\n async outcomeFor(command: BusinessCommand): Promise<BusinessCommitResult | null> {\n return this.outcome({ operation: command.operation, idempotencyKey: command.idempotencyKey, command })\n }\n\n async report(report: BusinessReportName, range: { from?: string; to?: string } = {}): Promise<BusinessReport> {\n return this.http.request('GET', `/business/reports/${report}`, {\n headers: this.headers(), params: range,\n })\n }\n\n /** Retained historical expense receipt bytes, even after the original native file is removed. */\n async receipt(nodeId: string, revision: string): Promise<Blob> {\n const response = await this.http.requestRaw('GET', `/business/receipts/${encodeURIComponent(nodeId)}/content`, {\n headers: this.headers(), params: { revision },\n })\n await this.http.ensureSuccess(response)\n return response.blob()\n }\n\n private headers(): Record<string, string> {\n if (!this.branch || this.branch.length > 128 || this.branch !== this.branch.trim().toLowerCase() || /[\\u0000-\\u001f\\u007f-\\u009f]/.test(this.branch)) {\n throw new Error('Business operations require a canonical branch')\n }\n return { 'X-Branch': this.branch, 'Content-Type': 'application/json' }\n }\n}\n","/**\n * Page commands an app exports to the workspace command registry (⌘K palette) while they are active.\n *\n * Unlike header actions, page commands have no placement and no count limit: an app with 100 actionable\n * buttons registers all 100. Only display metadata crosses the bridge — never form data or handler code.\n * Registration changes are sent incrementally (`upsert` / `remove`) in batches of at most\n * {@link APP_COMMAND_BATCH_SIZE} entries per message, so large pages do not resend full snapshots.\n */\nexport interface AppCommand {\n /** Stable identifier, unique within the app session. */\n id: string\n label: string\n description?: string\n /** Palette group heading; the host defaults to the current page. */\n group?: string\n /** `lucide:<name>` icon. */\n icon?: string\n /** Extra search terms. */\n keywords?: string[]\n variant?: 'default' | 'outline' | 'destructive'\n enabled?: boolean\n busy?: boolean\n disabledReason?: string\n}\n\nexport type AppCommandHandler = () => void | Promise<void>\n\nexport interface AppCommandRegistration {\n update(command: AppCommand): void\n dispose(): void\n}\n\n/** Maximum entries (upserts + removals) in one `verentis:commands:update` message. Not a command-count cap. */\nexport const APP_COMMAND_BATCH_SIZE = 200\n\n/** Host capability announced in `verentis:init` when it accepts page commands. */\nexport const APP_COMMANDS_CAPABILITY = 'commands'\n\nexport const APP_COMMAND_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:/#@-]{0,255}$/\n\nexport function isAppCommand(value: unknown): value is AppCommand {\n if (!value || typeof value !== 'object') return false\n const c = value as Record<string, unknown>\n const optionalText = (key: string, max: number) =>\n c[key] === undefined || (typeof c[key] === 'string' && (c[key] as string).length <= max)\n return typeof c.id === 'string' && APP_COMMAND_ID_PATTERN.test(c.id)\n && typeof c.label === 'string' && c.label.trim().length > 0 && c.label.length <= 200\n && optionalText('description', 500)\n && optionalText('group', 100)\n && optionalText('disabledReason', 200)\n && (c.icon === undefined || (typeof c.icon === 'string' && /^lucide:[a-z0-9-]{1,64}$/.test(c.icon)))\n && (c.keywords === undefined || (Array.isArray(c.keywords) && c.keywords.length <= 16\n && c.keywords.every(k => typeof k === 'string' && k.length <= 64)))\n && (c.variant === undefined || ['default', 'outline', 'destructive'].includes(String(c.variant)))\n && ['enabled', 'busy'].every(key => c[key] === undefined || typeof c[key] === 'boolean')\n}\n","export interface HeaderAction {\n id: string\n label: string\n icon?: string\n variant?: 'default' | 'outline' | 'destructive'\n /** Empty for client-only actions; otherwise a subset of the delegated token scopes. */\n scopes: string[]\n enabled?: boolean\n visible?: boolean\n busy?: boolean\n disabledReason?: string\n /** Clipboard actions return text for the host to copy during its user gesture. */\n kind?: 'clipboard'\n}\n\nexport interface HeaderActionResult {\n clipboardText?: string\n navigate?: { path: string; newTab?: boolean }\n}\n\nexport interface HeaderActionRegistration {\n update(action: HeaderAction): void\n dispose(): void\n}\n\nexport type HeaderActionHandler = () => void | HeaderActionResult | Promise<void | HeaderActionResult>\n\nexport function isHeaderAction(value: unknown): value is HeaderAction {\n if (!value || typeof value !== 'object') return false\n const a = value as Record<string, unknown>\n return typeof a.id === 'string' && /^[a-z][a-z0-9.-]{0,63}$/.test(a.id)\n && typeof a.label === 'string' && a.label.trim().length > 0 && a.label.length <= 100\n && Array.isArray(a.scopes) && a.scopes.length <= 32\n && a.scopes.every(s => typeof s === 'string' && /^[a-zA-Z0-9._:-]{1,128}$/.test(s))\n && (a.icon === undefined || (typeof a.icon === 'string' && /^lucide:[a-z0-9-]{1,64}$/.test(a.icon)))\n && (a.variant === undefined || ['default', 'outline', 'destructive'].includes(String(a.variant)))\n && ['enabled', 'visible', 'busy'].every(key => a[key] === undefined || typeof a[key] === 'boolean')\n && (a.disabledReason === undefined || (typeof a.disabledReason === 'string' && a.disabledReason.length <= 200))\n && (a.kind === undefined || a.kind === 'clipboard')\n}\n","import type { Bridge } from '../transport/bridge.transport'\n\nexport interface NativeElement {\n id: string\n version: number\n versionNonce?: number\n isDeleted?: boolean\n [key: string]: unknown\n}\n\nexport interface NativeFile {\n id: string\n dataURL: string\n mimeType: string\n created: number\n lastRetrieved?: number\n}\n\nexport interface NativeScene {\n elements: NativeElement[]\n files: Record<string, NativeFile>\n appState: Record<string, unknown>\n}\n\nexport interface NativePointer {\n x: number\n y: number\n}\n\nexport interface NativeParticipant {\n id: string\n name: string\n readOnly: boolean\n pointer: NativePointer | null\n /** `agent` marks an agent acting on behalf of a user (same principal, separate connection). */\n kind?: 'user' | 'agent'\n}\n\nexport interface NativeSnapshot {\n sequence: number\n savedSequence: number\n revision: string\n readOnly: boolean\n scene: NativeScene\n participants: NativeParticipant[]\n}\n\nexport interface NativeSaveReceipt {\n generation: number\n correlation: string\n revision: string\n}\n\nexport interface NativeSaveResult extends NativeSnapshot {\n receipt: NativeSaveReceipt\n}\n\nexport interface NativeChangeSet {\n operationId: string\n changes: Array<{ id: string; expectedVersion: number | null; element: NativeElement | null }>\n files?: Record<string, NativeFile>\n appState?: Record<string, unknown>\n appStateExpectedSequence?: number\n}\n\nexport type NativeCollaborationCommand =\n | { operation: 'join' | 'snapshot' | 'close' }\n | { operation: 'apply'; changes: NativeChangeSet }\n | { operation: 'presence'; pointer: NativePointer | null }\n | { operation: 'save'; generation: number; correlation: string }\n\nexport interface NativeCollaborationRequest {\n type: 'verentis:collaboration:request'\n version: 1\n sessionId: string\n requestId: string\n command: NativeCollaborationCommand\n}\n\nexport interface NativeCollaborationResponse {\n type: 'verentis:collaboration:response'\n version: 1\n sessionId: string\n requestId: string\n result?: NativeSnapshot | NativeSaveResult | null\n error?: string\n code?: string\n}\n\nexport class NativeCollaborationError extends Error {\n constructor(message: string, readonly code: string) {\n super(message)\n this.name = 'NativeCollaborationError'\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction natural(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0\n}\n\nfunction identifier(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0 && value.length <= 256\n}\n\nfunction pointer(value: unknown): value is NativePointer {\n return record(value) && typeof value.x === 'number' && Number.isFinite(value.x)\n && typeof value.y === 'number' && Number.isFinite(value.y)\n}\n\nfunction element(value: unknown): value is NativeElement {\n return record(value) && identifier(value.id) && natural(value.version)\n && (value.versionNonce === undefined || natural(value.versionNonce))\n && (value.isDeleted === undefined || typeof value.isDeleted === 'boolean')\n}\n\nfunction files(value: unknown): value is Record<string, NativeFile> {\n return record(value) && Object.keys(value).length <= 10_000\n && Object.entries(value).every(([id, file]) => record(file) && identifier(id) && file.id === id\n && typeof file.dataURL === 'string' && file.dataURL.length <= 10 * 1024 * 1024\n && typeof file.mimeType === 'string' && file.mimeType.length > 0 && file.mimeType.length <= 128\n && natural(file.created) && (file.lastRetrieved === undefined || natural(file.lastRetrieved)))\n}\n\nexport function isNativeSnapshot(value: unknown): value is NativeSnapshot {\n if (!record(value) || !natural(value.sequence) || !natural(value.savedSequence)\n || value.savedSequence > value.sequence\n || typeof value.revision !== 'string' || !value.revision || value.revision.length > 1024\n || typeof value.readOnly !== 'boolean' || !record(value.scene)\n || !Array.isArray(value.scene.elements) || value.scene.elements.length > 10_000\n || !value.scene.elements.every(element) || !files(value.scene.files) || !record(value.scene.appState)\n || !Array.isArray(value.participants) || value.participants.length > 20)\n return false\n const ids = value.scene.elements.map(item => item.id)\n if (new Set(ids).size !== ids.length) return false\n const connectionIds = value.participants.map(item => record(item) ? item.id : undefined)\n if (new Set(connectionIds).size !== connectionIds.length) return false\n return value.participants.every(item => record(item) && identifier(item.id)\n && typeof item.name === 'string' && item.name.length <= 1024 && typeof item.readOnly === 'boolean'\n && (item.pointer === null || pointer(item.pointer))\n && (item.kind === undefined || item.kind === 'user' || item.kind === 'agent'))\n}\n\nexport function isNativeSaveResult(value: unknown): value is NativeSaveResult {\n return isNativeSnapshot(value) && record(value) && record(value.receipt)\n && natural(value.receipt.generation) && identifier(value.receipt.correlation)\n && typeof value.receipt.revision === 'string' && value.receipt.revision.length > 0\n && value.receipt.revision.length <= 1024\n}\n\nexport function validateNativeCommand(command: NativeCollaborationCommand): void {\n if (!record(command)) throw new Error('Invalid collaboration command.')\n switch (command.operation) {\n case 'join':\n case 'snapshot':\n case 'close':\n break\n case 'presence':\n if (command.pointer !== null && !pointer(command.pointer))\n throw new Error('Invalid collaboration pointer.')\n break\n case 'save':\n if (!natural(command.generation) || !identifier(command.correlation))\n throw new Error('Invalid collaboration save frontier.')\n break\n case 'apply': {\n const changes = command.changes\n if (!record(changes) || !identifier(changes.operationId) || !Array.isArray(changes.changes)\n || changes.changes.length > 10_000\n || !changes.changes.every(change => record(change) && identifier(change.id)\n && (change.expectedVersion === null || natural(change.expectedVersion))\n && (change.element === null || element(change.element) && change.element.id === change.id))\n || (changes.files !== undefined && !files(changes.files))\n || (changes.appState !== undefined\n ? !record(changes.appState) || !natural(changes.appStateExpectedSequence)\n : changes.appStateExpectedSequence !== undefined))\n throw new Error('Invalid collaboration changes.')\n const ids = changes.changes.map(change => change.id)\n if (new Set(ids).size !== ids.length) throw new Error('Duplicate collaboration element changes.')\n break\n }\n default:\n throw new Error('Unsupported collaboration command.')\n }\n if (new TextEncoder().encode(JSON.stringify(command)).byteLength > 10 * 1024 * 1024)\n throw new Error('Collaboration request exceeds the document limit.')\n}\n\n/** Native authority is always selected by the installed workspace host, never by the iframe. */\nexport class NativeCollaborationClient {\n constructor(private readonly bridge: Bridge | null) {}\n\n private async snapshotRequest(command: NativeCollaborationCommand): Promise<NativeSnapshot> {\n if (!this.bridge) throw new Error('Native collaboration requires an installed workspace host.')\n const result = await this.bridge.requestNativeCollaboration(command)\n if (!isNativeSnapshot(result)) throw new Error('Invalid native collaboration snapshot.')\n return result\n }\n\n join(): Promise<NativeSnapshot> { return this.snapshotRequest({ operation: 'join' }) }\n snapshot(): Promise<NativeSnapshot> { return this.snapshotRequest({ operation: 'snapshot' }) }\n apply(changes: NativeChangeSet): Promise<NativeSnapshot> {\n return this.snapshotRequest({ operation: 'apply', changes })\n }\n presence(value: NativePointer | null): Promise<NativeSnapshot> {\n return this.snapshotRequest({ operation: 'presence', pointer: value })\n }\n async save(generation: number, correlation: string): Promise<NativeSaveResult> {\n if (!this.bridge) throw new Error('Native collaboration requires an installed workspace host.')\n const result = await this.bridge.requestNativeCollaboration({ operation: 'save', generation, correlation })\n if (!isNativeSaveResult(result) || result.receipt.generation !== generation\n || result.receipt.correlation !== correlation)\n throw new Error('Invalid native collaboration save receipt.')\n return result\n }\n async close(): Promise<void> {\n if (!this.bridge) throw new Error('Native collaboration requires an installed workspace host.')\n const result = await this.bridge.requestNativeCollaboration({ operation: 'close' })\n if (result !== null) throw new Error('Invalid native collaboration close response.')\n }\n}\n","import type {\n AppContext,\n AppToHostMessage,\n HostToAppMessage,\n NavigateOptions,\n TokenInfo,\n VerentisInitMessage,\n VerentisReadyMessage,\n VerentisActionInvokeMessage,\n VerentisCommandInvokeMessage,\n VerentisHostMessage,\n WopiLaunch,\n WopiContinuation,\n WopiSaveCheckpoint,\n WopiSaveStatus,\n VerentisWopiRequest,\n} from '../types'\nimport {\n APP_COMMAND_BATCH_SIZE, APP_COMMANDS_CAPABILITY, isAppCommand,\n type AppCommand, type AppCommandHandler, type AppCommandRegistration,\n} from './app-commands'\nimport { isHeaderAction, type HeaderAction, type HeaderActionHandler, type HeaderActionRegistration } from './header-actions'\nimport { NativeCollaborationError, validateNativeCommand, type NativeCollaborationCommand } from '../collaboration/native'\n\ntype BridgeEventType = HostToAppMessage['type']\n\n/** Handles a host message; the resolved value (structured-cloneable, ideally JSON) is the reply. */\nexport type HostMessageHandler = (payload: unknown) => unknown | Promise<unknown>\n\n/** Channel names declared in the manifest `spec.messages`. */\nexport const HOST_MESSAGE_CHANNEL_PATTERN = /^[a-z0-9][a-z0-9._-]{0,63}$/\ntype BridgeListener = (data: HostToAppMessage) => void\n\n/**\n * PostMessage bridge for communication between an app (iframe) and the\n * workspace host. Handles the initialization handshake, token lifecycle,\n * and app-to-host events (navigate, resize, dirty, etc.).\n */\nexport class Bridge {\n private listeners = new Map<BridgeEventType, Set<BridgeListener>>()\n private _initResolve!: (value: { context: AppContext; token: TokenInfo }) => void\n private _initReject!: (error: Error) => void\n private _initTimer: ReturnType<typeof setTimeout> | undefined\n private _initPromise: Promise<{ context: AppContext; token: TokenInfo }>\n private _hostOrigin: string | null = null\n private _messageHandler: (event: MessageEvent) => void\n private _destroyed = false\n private sessionId: string | null = null\n private actions = new Map<string, { descriptor: HeaderAction; handler: HeaderActionHandler; busy: boolean }>()\n private requests = new Set<string>()\n private commands = new Map<string, { descriptor: AppCommand; handler: AppCommandHandler; busy: boolean }>()\n private commandUpserts = new Set<string>()\n private commandRemovals = new Set<string>()\n private commandReset = false\n private commandFlushScheduled = false\n private commandRequests = new Set<string>()\n private _hostCapabilities: string[] = []\n private hostMessageHandlers = new Map<string, HostMessageHandler>()\n private hostMessageRequests = new Set<string>()\n private wopiRequests = new Map<string, {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n timer: ReturnType<typeof setTimeout>\n }>()\n private collaborationRequests = new Map<string, {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n timer: ReturnType<typeof setTimeout>\n }>()\n\n constructor(private readonly expectedHostOrigin?: string) {\n this._initPromise = new Promise((resolve, reject) => {\n this._initResolve = resolve\n this._initReject = reject\n })\n // Destruction may precede the consumer's call to waitForInit.\n void this._initPromise.catch(() => {})\n\n this._messageHandler = this.handleMessage.bind(this)\n if (typeof window !== 'undefined') {\n window.addEventListener('message', this._messageHandler)\n }\n }\n\n /** Post `verentis:ready` to the host to start the handshake */\n sendReady(capabilities?: string[]): void {\n console.info('[Verentis SDK] Sending verentis:ready to host')\n const message: VerentisReadyMessage = {\n type: 'verentis:ready',\n version: 1,\n capabilities,\n }\n // Ready carries no authority; apps with server-authorized framing can pin even this first message.\n window.parent.postMessage(message, this.expectedHostOrigin ?? '*')\n }\n\n /** Wait for the host to send `verentis:init` with context and token */\n waitForInit(): Promise<{ context: AppContext; token: TokenInfo }> {\n if (!this._hostOrigin && !this._destroyed && !this._initTimer) {\n this._initTimer = setTimeout(() => {\n this._initReject(new Error('Workspace handshake timed out.'))\n this.destroy()\n }, 20_000)\n }\n return this._initPromise\n }\n\n /** Get the host origin (available after init) */\n get hostOrigin(): string | null {\n return this._hostOrigin\n }\n\n /** Capabilities the host announced in `verentis:init`. */\n get hostCapabilities(): readonly string[] {\n return this._hostCapabilities\n }\n\n /**\n * Whether the host exports page commands to its command registry. Older hosts ignore registrations;\n * commands still run locally, they are just not discoverable in the workspace palette.\n */\n get supportsCommands(): boolean {\n return this._hostCapabilities.includes(APP_COMMANDS_CAPABILITY)\n }\n\n /** Send a message to the host */\n postToHost(message: AppToHostMessage): void {\n if (this._destroyed) throw new Error('Bridge has been destroyed.')\n if (!this._hostOrigin) {\n throw new Error('Bridge not initialized: host origin unknown. Wait for init first.')\n }\n window.parent.postMessage(message, this._hostOrigin)\n }\n\n /**\n * Navigate to another location in the workspace.\n *\n * @param path A workspace file path (e.g. `/reports/q1.json`) or an absolute\n * http(s) URL. External URLs require the app to declare the\n * `navigation:external` capability in its manifest.\n * @param options Navigation options. Set `newTab: true` to open the target in\n * a new browser tab instead of the current one.\n */\n navigate(path: string, options?: NavigateOptions): void {\n this.postToHost({\n type: 'verentis:navigate',\n version: 1,\n path,\n ...(options?.newTab ? { newTab: true } : {}),\n })\n }\n\n /** Request iframe resize */\n resize(height: number): void {\n this.postToHost({ type: 'verentis:resize', version: 1, height })\n }\n\n /** Update the title displayed by the host */\n setTitle(title: string): void {\n this.postToHost({ type: 'verentis:title', version: 1, title })\n }\n\n /** Signal unsaved changes to the host */\n setDirty(isDirty: boolean): void {\n this.postToHost({ type: 'verentis:dirty', version: 1, isDirty })\n }\n\n /** The trusted parent selects the approved installation, document and action. */\n requestWopiLaunch(): Promise<WopiLaunch> {\n return this.requestWopi('launch') as Promise<WopiLaunch>\n }\n\n /** Recover only the target selected by a completed server-owned derived operation. */\n requestWopiContinuation(): Promise<WopiContinuation> {\n return this.requestWopi('continue') as Promise<WopiContinuation>\n }\n\n getWopiStatus(): Promise<WopiSaveStatus> {\n return this.requestWopi('status') as Promise<WopiSaveStatus>\n }\n\n requestWopiSave(generation: number): Promise<WopiSaveCheckpoint> {\n if (!Number.isSafeInteger(generation) || generation < 0)\n return Promise.reject(new Error('Invalid edit generation.'))\n return this.requestWopi('save', generation) as Promise<WopiSaveCheckpoint>\n }\n\n closeWopiSession(): Promise<void> {\n return this.requestWopi('close') as Promise<void>\n }\n\n private requestWopi(operation: VerentisWopiRequest['operation'], generation?: number): Promise<unknown> {\n if (this._destroyed || !this.sessionId || !this._hostOrigin)\n return Promise.reject(new Error('An initialized workspace host is required.'))\n if (this.wopiRequests.size >= 4)\n return Promise.reject(new Error('Too many collaboration requests.'))\n const requestId = crypto.randomUUID()\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.wopiRequests.delete(requestId)\n reject(new Error('Collaboration authorization timed out.'))\n }, 30_000)\n this.wopiRequests.set(requestId, { resolve, reject, timer })\n try {\n this.postToHost({\n type: 'verentis:wopi:request', version: 1, requestId,\n sessionId: this.sessionId!, operation, ...(generation === undefined ? {} : { generation }),\n })\n } catch {\n clearTimeout(timer)\n this.wopiRequests.delete(requestId)\n reject(new Error('The workspace host is unavailable.'))\n }\n })\n }\n\n requestNativeCollaboration(command: NativeCollaborationCommand): Promise<unknown> {\n if (this._destroyed || !this.sessionId || !this._hostOrigin)\n return Promise.reject(new Error('An initialized workspace host is required.'))\n if (this.collaborationRequests.size >= 4)\n return Promise.reject(new Error('Too many native collaboration requests.'))\n try { validateNativeCommand(command) }\n catch (error) { return Promise.reject(error) }\n const requestId = crypto.randomUUID()\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.collaborationRequests.delete(requestId)\n reject(new NativeCollaborationError('Native collaboration timed out.', 'unavailable'))\n }, 30_000)\n this.collaborationRequests.set(requestId, { resolve, reject, timer })\n try {\n this.postToHost({\n type: 'verentis:collaboration:request', version: 1, requestId,\n sessionId: this.sessionId!, command,\n })\n } catch (error) {\n clearTimeout(timer)\n this.collaborationRequests.delete(requestId)\n reject(error)\n }\n })\n }\n\n registerAction(descriptor: HeaderAction, handler: HeaderActionHandler): HeaderActionRegistration {\n if (!this.sessionId || this._destroyed) throw new Error('Header actions require an initialized workspace host.')\n if (!isHeaderAction(descriptor)) throw new Error('Invalid header action.')\n if (this.actions.has(descriptor.id)) throw new Error(`Action '${descriptor.id}' is already registered.`)\n if (this.actions.size >= 16) throw new Error('At most 16 header actions may be registered.')\n const action = { descriptor: { ...descriptor, scopes: [...descriptor.scopes] }, handler, busy: false }\n this.actions.set(descriptor.id, action)\n this.publishActions()\n return {\n update: next => {\n if (this.actions.get(descriptor.id) !== action) throw new Error('Action has been disposed.')\n if (!isHeaderAction(next) || next.id !== descriptor.id) throw new Error('Invalid header action update.')\n action.descriptor = { ...next, scopes: [...next.scopes] }\n this.publishActions()\n },\n dispose: () => {\n if (this.actions.get(descriptor.id) !== action) return\n this.actions.delete(descriptor.id)\n this.publishActions()\n },\n }\n }\n\n /**\n * Export a page command to the workspace command registry while it is active. There is no count limit;\n * dispose the registration when the control unmounts. May be called before the init handshake.\n */\n registerCommand(descriptor: AppCommand, handler: AppCommandHandler): AppCommandRegistration {\n if (this._destroyed) throw new Error('Bridge has been destroyed.')\n if (!isAppCommand(descriptor)) throw new Error('Invalid command.')\n if (this.commands.has(descriptor.id)) throw new Error(`Command '${descriptor.id}' is already registered.`)\n const command = { descriptor: cloneCommand(descriptor), handler, busy: false }\n this.commands.set(descriptor.id, command)\n this.queueCommand(descriptor.id, 'upsert')\n return {\n update: next => {\n if (this.commands.get(descriptor.id) !== command) throw new Error('Command has been disposed.')\n if (!isAppCommand(next) || next.id !== descriptor.id) throw new Error('Invalid command update.')\n if (sameCommand(command.descriptor, next)) return\n command.descriptor = cloneCommand(next)\n this.queueCommand(descriptor.id, 'upsert')\n },\n dispose: () => {\n if (this.commands.get(descriptor.id) !== command) return\n this.commands.delete(descriptor.id)\n this.queueCommand(descriptor.id, 'remove')\n },\n }\n }\n\n private queueCommand(id: string, change: 'upsert' | 'remove'): void {\n if (change === 'upsert') {\n this.commandRemovals.delete(id)\n this.commandUpserts.add(id)\n } else {\n this.commandUpserts.delete(id)\n this.commandRemovals.add(id)\n }\n this.scheduleCommandFlush()\n }\n\n private scheduleCommandFlush(): void {\n if (this.commandFlushScheduled) return\n this.commandFlushScheduled = true\n queueMicrotask(() => {\n this.commandFlushScheduled = false\n this.flushCommands()\n })\n }\n\n private commandSnapshot(id: string): AppCommand | null {\n const command = this.commands.get(id)\n if (!command) return null\n return command.busy ? { ...command.descriptor, busy: true } : command.descriptor\n }\n\n private flushCommands(): void {\n if (!this.sessionId || !this._hostOrigin || this._destroyed) return\n const upsert = [...this.commandUpserts].map(id => this.commandSnapshot(id)).filter((c): c is AppCommand => !!c)\n const remove = this.commandReset ? [] : [...this.commandRemovals]\n let reset = this.commandReset\n this.commandUpserts.clear()\n this.commandRemovals.clear()\n this.commandReset = false\n if (!reset && !upsert.length && !remove.length) return\n let offset = 0\n let removeOffset = 0\n do {\n const batchUpsert = upsert.slice(offset, offset + APP_COMMAND_BATCH_SIZE)\n offset += batchUpsert.length\n const room = APP_COMMAND_BATCH_SIZE - batchUpsert.length\n const batchRemove = remove.slice(removeOffset, removeOffset + room)\n removeOffset += batchRemove.length\n this.postToHost({\n type: 'verentis:commands:update', version: 1, sessionId: this.sessionId,\n ...(reset ? { reset: true } : {}), upsert: batchUpsert, remove: batchRemove,\n })\n reset = false\n } while (offset < upsert.length || removeOffset < remove.length)\n }\n\n private async invokeCommand(message: VerentisCommandInvokeMessage): Promise<void> {\n if (message.sessionId !== this.sessionId || typeof message.requestId !== 'string'\n || message.requestId.length > 128 || !message.requestId || this.commandRequests.has(message.requestId)\n || typeof message.commandId !== 'string') return\n this.commandRequests.add(message.requestId)\n if (this.commandRequests.size > 1000) this.commandRequests.delete(this.commandRequests.values().next().value!)\n const command = this.commands.get(message.commandId)\n const reply = { type: 'verentis:command:result' as const, version: 1 as const,\n sessionId: message.sessionId, requestId: message.requestId, commandId: message.commandId }\n if (!command || command.busy || command.descriptor.busy || command.descriptor.enabled === false) {\n this.postToHost({ ...reply, error: 'Command is unavailable.' })\n return\n }\n command.busy = true\n this.queueCommand(message.commandId, 'upsert')\n try {\n await command.handler()\n if (!this._destroyed && this.sessionId === message.sessionId) this.postToHost(reply)\n } catch (error) {\n if (!this._destroyed && this.sessionId === message.sessionId) {\n this.postToHost({ ...reply, error: (error instanceof Error ? error.message : 'Command failed.').slice(0, 500) || 'Command failed.' })\n }\n } finally {\n command.busy = false\n if (this.commands.get(message.commandId) === command) this.queueCommand(message.commandId, 'upsert')\n }\n }\n\n private publishActions(): void {\n if (!this.sessionId || this._destroyed) return\n this.postToHost({\n type: 'verentis:actions:set', version: 1, sessionId: this.sessionId,\n actions: [...this.actions.values()].map(a => ({ ...a.descriptor, busy: a.busy || a.descriptor.busy })),\n })\n }\n\n private async invokeAction(message: VerentisActionInvokeMessage): Promise<void> {\n if (message.sessionId !== this.sessionId || typeof message.requestId !== 'string'\n || message.requestId.length > 128 || !message.requestId || this.requests.has(message.requestId)) return\n this.requests.add(message.requestId)\n if (this.requests.size > 1000) this.requests.delete(this.requests.values().next().value!)\n const action = this.actions.get(message.actionId)\n const reply = { type: 'verentis:action:result' as const, version: 1 as const,\n sessionId: message.sessionId, requestId: message.requestId, actionId: message.actionId }\n if (!action || action.busy || action.descriptor.busy\n || action.descriptor.enabled === false || action.descriptor.visible === false) {\n this.postToHost({ ...reply, error: 'Action is unavailable.' })\n return\n }\n action.busy = true\n this.publishActions()\n try {\n const result = await action.handler()\n if (!this._destroyed && this.sessionId === message.sessionId) {\n this.postToHost({ ...reply, result: result || undefined })\n }\n } catch (error) {\n if (!this._destroyed && this.sessionId === message.sessionId) {\n this.postToHost({ ...reply, error: (error instanceof Error ? error.message : 'Action failed.').slice(0, 500) })\n }\n } finally {\n action.busy = false\n this.publishActions()\n }\n }\n\n /**\n * Handle messages the workspace sends on a channel declared in the manifest `spec.messages` — for\n * example an agent asking the open app to select a record. The handler's return value is the reply;\n * a thrown error is reported back as the failure. May be called before the init handshake.\n */\n onHostMessage(channel: string, handler: HostMessageHandler): () => void {\n if (this._destroyed) throw new Error('Bridge has been destroyed.')\n if (!HOST_MESSAGE_CHANNEL_PATTERN.test(channel)) throw new Error(`Invalid host message channel '${channel}'.`)\n if (this.hostMessageHandlers.has(channel)) throw new Error(`Channel '${channel}' already has a handler.`)\n this.hostMessageHandlers.set(channel, handler)\n return () => {\n if (this.hostMessageHandlers.get(channel) === handler) this.hostMessageHandlers.delete(channel)\n }\n }\n\n private async receiveHostMessage(message: VerentisHostMessage): Promise<void> {\n if (!this._hostOrigin || message.sessionId !== this.sessionId || typeof message.channel !== 'string'\n || typeof message.requestId !== 'string' || !message.requestId || message.requestId.length > 128\n || this.hostMessageRequests.has(message.requestId)) return\n this.hostMessageRequests.add(message.requestId)\n if (this.hostMessageRequests.size > 1000) this.hostMessageRequests.delete(this.hostMessageRequests.values().next().value!)\n const reply = { type: 'verentis:host:reply' as const, version: 1 as const,\n sessionId: message.sessionId, requestId: message.requestId, channel: message.channel }\n const handler = this.hostMessageHandlers.get(message.channel)\n if (!handler) {\n this.postToHost({ ...reply, error: `The application does not handle '${message.channel.slice(0, 64)}' messages.` })\n return\n }\n let response: { result?: unknown; error?: string }\n try {\n response = { result: await handler(message.payload) }\n } catch (error) {\n response = { error: (error instanceof Error ? error.message : 'Message failed.').slice(0, 500) || 'Message failed.' }\n }\n if (this._destroyed || this.sessionId !== message.sessionId) return\n try {\n this.postToHost({ ...reply, ...response })\n } catch {\n // A result that cannot be cloned is reported as a failure rather than leaving the host waiting.\n this.postToHost({ ...reply, error: 'The reply could not be sent to the workspace.' })\n }\n }\n\n /** Subscribe to a specific message type from the host */\n on(type: BridgeEventType, listener: BridgeListener): () => void {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, new Set())\n }\n this.listeners.get(type)!.add(listener)\n\n return () => {\n this.listeners.get(type)?.delete(listener)\n }\n }\n\n /** Clean up event listeners */\n destroy(): void {\n this._destroyed = true\n clearTimeout(this._initTimer)\n this._initTimer = undefined\n if (!this._hostOrigin) this._initReject(new Error('Bridge has been destroyed.'))\n this.actions.clear()\n this.requests.clear()\n this.commands.clear()\n this.commandUpserts.clear()\n this.commandRemovals.clear()\n this.commandRequests.clear()\n this.hostMessageHandlers.clear()\n this.hostMessageRequests.clear()\n this.listeners.clear()\n for (const pending of this.wopiRequests.values()) {\n clearTimeout(pending.timer)\n pending.reject(new Error('Bridge has been destroyed.'))\n }\n this.wopiRequests.clear()\n for (const pending of this.collaborationRequests.values()) {\n clearTimeout(pending.timer)\n pending.reject(new Error('Bridge has been destroyed.'))\n }\n this.collaborationRequests.clear()\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', this._messageHandler)\n }\n }\n\n private handleMessage(event: MessageEvent): void {\n if (this._destroyed) return\n\n const data = event.data as HostToAppMessage\n if (event.source !== window.parent || data?.version !== 1\n || typeof data?.type !== 'string' || !data.type.startsWith('verentis:')) return\n if (this._hostOrigin && event.origin !== this._hostOrigin) return\n if (this.expectedHostOrigin && event.origin !== this.expectedHostOrigin) return\n\n // Capture the host origin from the first valid message\n if (data.type === 'verentis:init') {\n if (this._hostOrigin) return\n if (!data.context?.workspace?.id || !data.token || event.origin === 'null') return\n clearTimeout(this._initTimer)\n this._initTimer = undefined\n this._hostOrigin = event.origin\n this.sessionId = typeof data.sessionId === 'string' ? data.sessionId : null\n this._hostCapabilities = Array.isArray(data.capabilities)\n ? data.capabilities.filter((c): c is string => typeof c === 'string').slice(0, 64)\n : []\n if (this.sessionId && this.commands.size > 0) {\n // Publish everything registered before the handshake as one authoritative snapshot. Hosts start\n // each session with an empty command set, so a bridge without commands sends nothing.\n this.commandReset = true\n this.commandRemovals.clear()\n for (const id of this.commands.keys()) this.commandUpserts.add(id)\n this.scheduleCommandFlush()\n }\n console.info('[Verentis SDK] Received verentis:init from host', {\n origin: event.origin,\n workspaceId: data.context.workspace.id,\n filePath: data.context.file?.path ?? null,\n })\n const initData = data as VerentisInitMessage\n this._initResolve({ context: initData.context, token: initData.token })\n }\n\n if (data.type === 'verentis:wopi:response') {\n if (!this._hostOrigin || data.sessionId !== this.sessionId) return\n const pending = this.wopiRequests.get(data.requestId)\n if (!pending) return\n clearTimeout(pending.timer)\n this.wopiRequests.delete(data.requestId)\n if (data.error || !Object.hasOwn(data, 'result'))\n pending.reject(new Error('Collaboration authorization is unavailable.'))\n else pending.resolve(data.result)\n return\n }\n\n if (data.type === 'verentis:collaboration:response') {\n if (!this._hostOrigin || data.sessionId !== this.sessionId) return\n const pending = this.collaborationRequests.get(data.requestId)\n if (!pending) return\n clearTimeout(pending.timer)\n this.collaborationRequests.delete(data.requestId)\n if (data.error || !Object.hasOwn(data, 'result'))\n pending.reject(new NativeCollaborationError(\n typeof data.error === 'string' ? data.error.slice(0, 500) : 'Native collaboration is unavailable.',\n typeof data.code === 'string' ? data.code.slice(0, 64) : 'unavailable',\n ))\n else pending.resolve(data.result)\n return\n }\n\n if (data.type === 'verentis:action:invoke') {\n void this.invokeAction(data)\n return\n }\n\n if (data.type === 'verentis:command:invoke') {\n void this.invokeCommand(data)\n return\n }\n\n if (data.type === 'verentis:host:message') {\n void this.receiveHostMessage(data)\n return\n }\n\n // Dispatch to listeners\n const typeListeners = this.listeners.get(data.type)\n if (typeListeners) {\n for (const listener of typeListeners) {\n listener(data)\n }\n }\n }\n}\n\nfunction cloneCommand(command: AppCommand): AppCommand {\n return { ...command, ...(command.keywords ? { keywords: [...command.keywords] } : {}) }\n}\n\nfunction sameCommand(a: AppCommand, b: AppCommand): boolean {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]) as Set<keyof AppCommand>\n for (const key of keys) {\n if (key === 'keywords') {\n if ((a.keywords ?? []).join('\\u0000') !== (b.keywords ?? []).join('\\u0000')) return false\n } else if (a[key] !== b[key]) return false\n }\n return true\n}\n","import { ApiError, type AuthStrategy, type RequestOptions } from '../types'\n\n/**\n * HTTP client for making direct API calls to the Verentis gateway.\n * Used in both standalone and iframe modes — the auth strategy determines\n * how the Authorization header is obtained.\n */\nexport class HttpTransport {\n constructor(\n private readonly baseUrl: string,\n private readonly auth: AuthStrategy,\n private readonly apiVersion: string = 'v1',\n ) {}\n\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n const url = this.buildUrl(path, options?.params)\n console.info('[Verentis SDK] Request started', { method, path, url })\n const headers: Record<string, string> = {}\n\n const authHeader = await this.auth.getAuthHeader()\n if (authHeader) {\n headers['Authorization'] = authHeader\n }\n\n if (options?.headers) {\n Object.assign(headers, options.headers)\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: options?.body,\n })\n\n await this.ensureSuccess(response)\n\n console.info('[Verentis SDK] Request succeeded', {\n method,\n path,\n status: response.status,\n contentType: response.headers.get('content-type') ?? '',\n })\n const contentType = response.headers.get('content-type') ?? ''\n if (contentType.includes('application/json')) {\n return response.json() as Promise<T>\n }\n\n // For non-JSON responses (e.g. binary file downloads), return the blob\n return response.blob() as unknown as T\n }\n\n async requestRaw(method: string, path: string, options?: RequestOptions): Promise<Response> {\n const url = this.buildUrl(path, options?.params)\n console.info('[Verentis SDK] Raw request started', { method, path, url })\n const headers: Record<string, string> = {}\n\n const authHeader = await this.auth.getAuthHeader()\n if (authHeader) {\n headers['Authorization'] = authHeader\n }\n\n if (options?.headers) {\n Object.assign(headers, options.headers)\n }\n\n const response = await fetch(url, { method, headers, body: options?.body })\n console.info('[Verentis SDK] Raw request completed', {\n method,\n path,\n status: response.status,\n ok: response.ok,\n contentType: response.headers.get('content-type') ?? '',\n })\n return response\n }\n\n async ensureSuccess(response: Response): Promise<void> {\n if (response.ok) return\n const raw = await response.text()\n let detail = raw || response.statusText\n let title: string | undefined\n let code: string | undefined\n try {\n const body: unknown = JSON.parse(raw)\n if (body !== null && typeof body === 'object') {\n if ('detail' in body && typeof body.detail === 'string') detail = body.detail\n else if ('message' in body && typeof body.message === 'string') detail = body.message\n if ('title' in body && typeof body.title === 'string') title = body.title\n if ('code' in body && typeof body.code === 'string') code = body.code\n }\n } catch (error) {\n if (!(error instanceof SyntaxError)) throw error\n }\n console.error('[Verentis SDK] Request failed', { status: response.status, code })\n const retryAfter = response.headers.get('Retry-After')\n const retryAfterMs = retryAfter === null\n ? undefined\n : /^\\d+$/.test(retryAfter)\n ? Number(retryAfter) * 1000\n : Date.parse(retryAfter) - Date.now()\n throw new ApiError(response.status, detail, title, code,\n retryAfterMs !== undefined && Number.isFinite(retryAfterMs) ? Math.max(0, retryAfterMs) : undefined)\n }\n\n private buildUrl(path: string, params?: RequestOptions['params']): string {\n const base = `${this.baseUrl}/${this.apiVersion}${path}`\n\n if (!params) return base\n\n const searchParams = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) {\n continue\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n searchParams.append(key, String(item))\n }\n } else {\n searchParams.set(key, String(value))\n }\n }\n\n const qs = searchParams.toString()\n return qs ? `${base}?${qs}` : base\n }\n}\n","import { ApiKeyAuth } from './auth/api-key.auth'\nimport { BridgeAuth } from './auth/bridge.auth'\nimport { TokenAuth } from './auth/token.auth'\nimport { ContextModule } from './modules/context'\nimport { ExecutionsModule } from './modules/executions'\nimport { EnginesModule } from './modules/engines'\nimport { FilesModule } from './modules/files'\nimport { InstallationsModule } from './modules/installations'\nimport { ResourcesModule } from './modules/resources'\nimport { SettingsModule } from './modules/settings'\nimport { NotificationsModule } from './modules/notifications'\nimport { BusinessModule } from './modules/business'\nimport { Bridge } from './transport/bridge.transport'\nimport { HttpTransport } from './transport/http.transport'\nimport { NativeCollaborationClient } from './collaboration/native'\nimport type { AuthStrategy, VerentisClientOptions } from './types'\n\n/**\n * The main Verentis SDK client.\n * Provides access to file operations, workspace context, and (in iframe mode)\n * the host communication bridge.\n */\nexport class VerentisClient {\n files!: FilesModule\n executions!: ExecutionsModule\n engines!: EnginesModule\n installations!: InstallationsModule\n resources!: ResourcesModule\n settings!: SettingsModule\n notifications!: NotificationsModule\n business!: BusinessModule\n readonly context: ContextModule\n readonly bridge: Bridge | null\n readonly collaboration: NativeCollaborationClient\n\n private readonly _auth: AuthStrategy\n private _http!: HttpTransport\n private _ready: Promise<void>\n\n constructor(options?: VerentisClientOptions) {\n this.context = new ContextModule()\n\n const environment = detectEnvironment()\n\n if (environment === 'iframe' && !options?.auth) {\n // --- iframe mode ---\n this.bridge = new Bridge()\n this.collaboration = new NativeCollaborationClient(this.bridge)\n const bridgeAuth = new BridgeAuth('*') // origin validated after init\n this._auth = bridgeAuth\n\n this._ready = this.initFromBridge(bridgeAuth)\n } else {\n // --- standalone mode ---\n this.bridge = null\n this.collaboration = new NativeCollaborationClient(null)\n this._auth = createAuthStrategy(options)\n\n const apiUrl = options?.apiUrl\n if (!apiUrl) {\n throw new Error('apiUrl is required in standalone mode')\n }\n\n this.context.setApiUrl(apiUrl)\n if (options?.workspaceId) {\n this.context.setWorkspace({ id: options.workspaceId })\n }\n\n this._http = new HttpTransport(apiUrl, this._auth, options?.apiVersion ?? 'v1')\n this.files = new FilesModule(this._http, options?.workspaceId)\n this.executions = new ExecutionsModule(this._http, options?.workspaceId)\n this.engines = new EnginesModule(this._http, options?.workspaceId)\n this.installations = new InstallationsModule(this._http, options?.workspaceId)\n this.resources = new ResourcesModule(this._http, options?.workspaceId)\n this.settings = new SettingsModule(this._http, options?.workspaceId)\n this.notifications = new NotificationsModule(this._http, options?.workspaceId)\n this.business = new BusinessModule(this._http)\n this._ready = Promise.resolve()\n return\n }\n\n // _http and files are set after bridge init via initFromBridge()\n }\n\n /**\n * Returns a promise that resolves when the client is fully initialized.\n * In standalone mode this resolves immediately.\n * In iframe mode this resolves after the host sends `verentis:init`.\n */\n whenReady(): Promise<void> {\n return this._ready\n }\n\n /**\n * The current `Authorization` header value, refreshed when near expiry.\n * Forward it to the app's own backend, which exchanges it at Security's\n * `/connect/token` (RFC 8693) as the installation's confidential client.\n */\n getAuthorizationHeader(): Promise<string | null> {\n return this._auth.getAuthHeader()\n }\n\n /** Clean up resources (timers, event listeners) */\n destroy(): void {\n this._auth.destroy?.()\n this.bridge?.destroy()\n }\n\n private async initFromBridge(bridgeAuth: BridgeAuth): Promise<void> {\n // Signal readiness to the host\n this.bridge!.sendReady()\n\n // Wait for host to send context + token\n const { context, token } = await this.bridge!.waitForInit()\n\n // Now we know the host origin — update the bridge auth\n const hostOrigin = this.bridge!.hostOrigin!\n // Keep one listener owner; copying a second instance leaks both listeners.\n bridgeAuth.setHostOrigin(hostOrigin)\n bridgeAuth.setToken(token)\n\n // Set context\n this.context.setFromAppContext(context)\n this.context.setGrants(token.grants)\n this.bridge!.on('verentis:token:refreshed', (message) => {\n if (message.type === 'verentis:token:refreshed') this.context.setGrants(message.token?.grants)\n })\n\n // Create transport and modules now that we have the API URL\n const http = new HttpTransport(\n context.apiUrl,\n bridgeAuth,\n 'v1',\n )\n\n this._http = http\n this.files = new FilesModule(http, context.workspace.id)\n this.executions = new ExecutionsModule(http, context.workspace.id)\n this.engines = new EnginesModule(http, context.workspace.id)\n this.installations = new InstallationsModule(http, context.workspace.id)\n this.resources = new ResourcesModule(http, context.workspace.id)\n this.settings = new SettingsModule(http, context.workspace.id)\n this.notifications = new NotificationsModule(http, context.workspace.id)\n this.business = new BusinessModule(http)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction detectEnvironment(): 'iframe' | 'standalone' {\n if (typeof window !== 'undefined' && window.parent !== window) {\n return 'iframe'\n }\n return 'standalone'\n}\n\nfunction createAuthStrategy(options?: VerentisClientOptions): AuthStrategy {\n if (!options?.auth) {\n throw new Error('auth is required in standalone mode: provide { apiKey } or { token }')\n }\n\n if ('apiKey' in options.auth) {\n return new ApiKeyAuth(options.auth.apiKey)\n }\n\n if ('token' in options.auth) {\n return new TokenAuth(\n options.auth.token,\n options.auth.expiresAt,\n options.auth.refreshToken,\n )\n }\n\n throw new Error('Invalid auth options: provide { apiKey } or { token }')\n}\n","import type { MimeTypeBinding } from '../types'\n\n/**\n * Tests whether a MIME type matches a pattern.\n * Supports wildcards: `image/*` matches `image/png`, `*/*` matches everything.\n * Comparison is case-insensitive and ignores parameters (e.g. `; charset=utf-8`).\n */\nexport function matchMimeType(pattern: string, mimeType: string): boolean {\n const normalizedPattern = stripParams(pattern).toLowerCase()\n const normalizedMime = stripParams(mimeType).toLowerCase()\n\n if (normalizedPattern === '*/*') return true\n\n const [patternType, patternSubtype] = normalizedPattern.split('/')\n const [mimeTypeType, mimeSubtype] = normalizedMime.split('/')\n\n if (!patternType || !mimeTypeType) return false\n if (patternType === '*') return true\n if (patternType !== mimeTypeType) return false\n if (!patternSubtype || patternSubtype === '*') return true\n\n return patternSubtype === mimeSubtype\n}\n\n/**\n * Finds the best matching binding for a given MIME type.\n * Exact matches beat wildcard matches at the same priority level.\n * Higher priority values are preferred.\n */\nexport function findBestMatch(\n mimeType: string,\n bindings: MimeTypeBinding[],\n): MimeTypeBinding | null {\n const matches = bindings\n .filter((b) => matchMimeType(b.pattern, mimeType))\n .sort((a, b) => {\n const aExact = !a.pattern.includes('*')\n const bExact = !b.pattern.includes('*')\n if (aExact !== bExact) return aExact ? -1 : 1\n return b.priority - a.priority\n })\n\n return matches[0] ?? null\n}\n\n/**\n * Strips parameters from a MIME type string.\n * `application/json; charset=utf-8` → `application/json`\n */\nfunction stripParams(mime: string): string {\n const idx = mime.indexOf(';')\n return idx === -1 ? mime.trim() : mime.slice(0, idx).trim()\n}\n","export interface CollaborationDocumentContext {\n workspace?: { id?: string }\n file?: { nodeId?: string; branch?: string }\n}\n\nexport interface CollaborationDocument {\n sessionId: string\n workspaceId: string\n branch: string\n nodeId: string\n fileId: string\n name: string\n readOnly: boolean\n accessTokenTtl: number\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** An exact origin, not a URL pattern or an authority grant. */\nexport function exactHttpsOrigin(value: unknown): string {\n if (typeof value !== 'string' || value.length > 256)\n throw new Error('Invalid framing origin.')\n const origin = new URL(value)\n if (origin.protocol !== 'https:' || origin.origin !== value || origin.href !== `${value}/`\n || !/^[a-z0-9-]+(?:\\.[a-z0-9-]+)*$/.test(origin.hostname))\n throw new Error('Invalid framing origin.')\n return value\n}\n\nexport function isTrustedMessage(\n event: { source: unknown; origin: string },\n source: unknown,\n origin: string,\n): boolean {\n return Boolean(source && origin && event.source === source && event.origin === origin)\n}\n\n/** Checks nonsecret launch metadata against the document selected by the trusted host. */\nexport function validateCollaborationDocument(\n value: unknown,\n context: CollaborationDocumentContext,\n now = Date.now(),\n): CollaborationDocument {\n const branch = context.file?.branch\n const node = context.file?.nodeId\n const workspace = context.workspace?.id\n if (!branch || !node || !workspace || !isRecord(value)\n || value.nodeId !== node || value.workspaceId !== workspace\n || value.branch !== branch.trim().toLowerCase()\n || typeof value.fileId !== 'string' || !/^[a-f0-9]{32}$/.test(value.fileId)\n || typeof value.sessionId !== 'string'\n || !/^(?:[a-f0-9]{32}|[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12})$/.test(value.sessionId)\n || typeof value.accessTokenTtl !== 'number' || !Number.isSafeInteger(value.accessTokenTtl)\n || value.accessTokenTtl <= now\n || typeof value.name !== 'string' || !value.name || value.name.length > 1024\n || typeof value.readOnly !== 'boolean')\n throw new Error('Invalid live launch.')\n return {\n sessionId: value.sessionId,\n workspaceId: value.workspaceId,\n branch: value.branch,\n nodeId: value.nodeId,\n fileId: value.fileId,\n name: value.name,\n readOnly: value.readOnly,\n accessTokenTtl: value.accessTokenTtl,\n }\n}\n\n/** An editor acknowledgement alone never proves a document was durably saved. */\nexport function isDurableSaveConfirmed(\n result: unknown,\n request: unknown,\n currentGeneration: number,\n editorModified: boolean,\n): boolean {\n if (!isRecord(request) || !isRecord(result) || !isRecord(result.receipt))\n return false\n return editorModified === false && result.state === 'ready'\n && result.continuationAvailable !== true\n && Number.isSafeInteger(currentGeneration) && currentGeneration >= 0\n && currentGeneration === request.generation\n && typeof request.correlation === 'string' && request.correlation.length > 0\n && result.receipt.generation === request.generation\n && result.receipt.correlation === request.correlation\n && typeof result.receipt.revision === 'string' && result.receipt.revision.length > 0\n}\n","import { VerentisClient } from './client'\nimport type { VerentisClientOptions } from './types'\n\n/**\n * Create a new Verentis SDK client.\n *\n * @example Standalone mode (local development)\n * ```ts\n * const client = createVerentisClient({\n * apiUrl: 'https://api.verentis.com',\n * auth: { apiKey: 'vrt_abc123_...' },\n * workspaceId: 'workspace-uuid',\n * })\n *\n * const file = await client.files.get('/documents/report.json')\n * ```\n *\n * @example iframe mode (auto-detected at runtime)\n * ```ts\n * const client = createVerentisClient()\n * await client.whenReady()\n *\n * const { surface, workspace } = client.context\n * if (surface === 'file') {\n * const content = await client.files.readContent(client.context.file.path)\n * }\n * ```\n */\nexport function createVerentisClient(options?: VerentisClientOptions): VerentisClient {\n return new VerentisClient(options)\n}\n\n// Re-export everything\nexport { VerentisClient } from './client'\nexport { matchMimeType, findBestMatch } from './utils/mime'\nexport { Bridge, HOST_MESSAGE_CHANNEL_PATTERN } from './transport/bridge.transport'\nexport type { HostMessageHandler } from './transport/bridge.transport'\nexport { isHeaderAction } from './transport/header-actions'\nexport { isAppCommand, APP_COMMAND_BATCH_SIZE, APP_COMMANDS_CAPABILITY, APP_COMMAND_ID_PATTERN } from './transport/app-commands'\nexport type { AppCommand, AppCommandHandler, AppCommandRegistration } from './transport/app-commands'\nexport { exactHttpsOrigin, isTrustedMessage, validateCollaborationDocument, isDurableSaveConfirmed } from './collaboration/lifecycle'\nexport type { CollaborationDocument, CollaborationDocumentContext } from './collaboration/lifecycle'\nexport {\n NativeCollaborationClient, NativeCollaborationError, isNativeSnapshot, isNativeSaveResult, validateNativeCommand,\n} from './collaboration/native'\nexport type {\n NativeElement, NativeFile, NativeScene, NativePointer, NativeParticipant, NativeSnapshot,\n NativeSaveReceipt, NativeSaveResult, NativeChangeSet, NativeCollaborationCommand,\n NativeCollaborationRequest, NativeCollaborationResponse,\n} from './collaboration/native'\nexport type { HeaderAction, HeaderActionResult, HeaderActionHandler, HeaderActionRegistration } from './transport/header-actions'\nexport { HttpTransport } from './transport/http.transport'\nexport { ApiError } from './types'\nexport { ApiKeyAuth } from './auth/api-key.auth'\nexport { TokenAuth } from './auth/token.auth'\nexport { BridgeAuth } from './auth/bridge.auth'\nexport { FilesModule } from './modules/files'\nexport { ContextModule } from './modules/context'\nexport { ExecutionsModule, isTerminalStatus, SCRIPT_ARGUMENTS_SCHEMA } from './modules/executions'\nexport { EnginesModule } from './modules/engines'\nexport { InstallationsModule } from './modules/installations'\nexport { ResourcesModule } from './modules/resources'\nexport { SettingsModule } from './modules/settings'\nexport { NotificationsModule } from './modules/notifications'\nexport type * from './types/notifications'\nexport { BusinessModule } from './modules/business'\nexport type * from './types/business'\nexport type { NamespacedSettings } from './modules/settings'\n\n// Re-export types\nexport type {\n // PostMessage protocol\n VerentisMessage,\n VerentisActionsSetMessage,\n VerentisActionInvokeMessage,\n VerentisActionResultMessage,\n VerentisCommandsUpdateMessage,\n VerentisCommandInvokeMessage,\n VerentisCommandResultMessage,\n VerentisHostMessage,\n VerentisHostReplyMessage,\n VerentisInitMessage,\n VerentisReadyMessage,\n VerentisTokenRefreshMessage,\n VerentisTokenRefreshedMessage,\n VerentisFileChangedMessage,\n VerentisThemeMessage,\n VerentisNavigateMessage,\n VerentisResizeMessage,\n VerentisTitleMessage,\n VerentisDirtyMessage,\n WopiLaunch,\n WopiContinuation,\n WopiSaveCheckpoint,\n WopiSaveStatus,\n VerentisWopiRequest,\n VerentisWopiResponse,\n HostToAppMessage,\n AppToHostMessage,\n // Context\n AppSurface,\n AppApplicationContext,\n AppContext,\n FileAppContext,\n WorkspaceAppContext,\n WorkspaceInfo,\n FileInfo,\n EntryPointInfo,\n TokenInfo,\n TokenGrant,\n // Client\n VerentisClientOptions,\n AuthOptions,\n NavigateOptions,\n // File API\n FileEntry,\n NodeFileMetadata,\n NodeFileOptions,\n NodeFileContent,\n WriteNodeFileOptions,\n GetFileOptions,\n WriteFileOptions,\n MoveFileOptions,\n DeleteFileOptions,\n ArchiveFormat,\n ReadArchiveOptions,\n ExtractUploadOptions,\n InstalledPackageDescriptor,\n InstalledPackagePayload,\n // Installation API\n PackageDependency,\n InstallationGraphPackage,\n InstallationGraphPreview,\n InstallationGraphResult,\n InstallationGraphOutcomeStatus,\n PreviewInstallationOptions,\n CatalogImage,\n Installation,\n InstallationDetail,\n InstallationLifecycleResult,\n InstallationListOptions,\n InstallationMode,\n InstallationScopedOptions,\n InstallationStatus,\n ResolveInstallationOptions,\n UpdateInstallationOptions,\n // Execution API\n Execution,\n ExecutionResult,\n ExecutionLogs,\n ExecutionStatus,\n ExecutionMode,\n ExecutionTrigger,\n RunFileOptions,\n ScriptArgumentDefinition,\n ScriptArgumentDescriptor,\n ScriptArgumentsOptions,\n ScriptArgumentType,\n ExecuteEngineOptions,\n ExecutionScopedOptions,\n ExecutionListOptions,\n ExecutionEngine,\n ExecutionEngineListOptions,\n EngineRuntime,\n EngineFileType,\n EngineTool,\n PagedResult,\n WaitOptions,\n // Settings API\n SettingGroup,\n SettingItem,\n SettingOption,\n SettingsScopedOptions,\n SettingPresence,\n // Resource API\n ResourceRegistration,\n ResourceMimeTypeBinding,\n ResourceScopedOptions,\n // Auth\n AuthStrategy,\n // Manifest\n ApplicationManifest,\n ManifestMetadata,\n ApplicationSpec,\n ApplicationLaunchConfig,\n ApplicationEntryPoint,\n ApplicationDisplayOptions,\n ApplicationFileType,\n MimeTypeBinding,\n SandboxOptions,\n OAuthConfig,\n SettingDeclaration,\n SettingDeclarationType,\n // HTTP\n RequestOptions,\n} from './types'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth/api-key.auth.ts","../src/auth/bridge.auth.ts","../src/auth/token.auth.ts","../src/modules/context.ts","../src/modules/executions.ts","../src/modules/engines.ts","../src/modules/files.ts","../src/modules/installations.ts","../src/modules/resources.ts","../src/modules/settings.ts","../src/types.ts","../src/modules/notifications.ts","../src/modules/business.ts","../src/modules/chat.ts","../src/transport/app-commands.ts","../src/transport/header-actions.ts","../src/collaboration/native.ts","../src/transport/bridge.transport.ts","../src/transport/http.transport.ts","../src/client.ts","../src/utils/mime.ts","../src/collaboration/lifecycle.ts","../src/index.ts"],"names":["delay","SKEW_MS","id","headers"],"mappings":"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","file":"index.js","sourcesContent":["import type { AuthStrategy } from '../types'\n\n/**\n * Authenticates with a Verentis API key (`vrt_` prefix).\n * The backend detects the `vrt_` prefix in the Bearer token and resolves it\n * as an API key rather than a JWT.\n */\nexport class ApiKeyAuth implements AuthStrategy {\n constructor(private readonly apiKey: string) {\n if (!apiKey.startsWith('vrt_')) {\n throw new Error('Invalid API key format: must start with \"vrt_\"')\n }\n }\n\n async getAuthHeader(): Promise<string> {\n return `Bearer ${this.apiKey}`\n }\n}\n","import type {\n AuthStrategy,\n TokenInfo,\n VerentisTokenRefreshMessage,\n VerentisTokenRefreshedMessage,\n} from '../types'\n\nconst SKEW_MS = 30_000\n\n/**\n * Authenticates via the PostMessage bridge in iframe mode.\n * The token is received from the host during initialization and refreshed\n * by requesting a new token from the host when nearing expiry.\n */\nexport class BridgeAuth implements AuthStrategy {\n private _token: string | null = null\n private _expiresAt = 0\n private _refreshTimer: ReturnType<typeof setTimeout> | null = null\n private _pendingRefresh: Promise<void> | null = null\n private _messageHandler: (event: MessageEvent) => void\n private _requestId: string | null = null\n private _refreshReject: ((error: Error) => void) | null = null\n private _requestTimer: ReturnType<typeof setTimeout> | null = null\n private _destroyed = false\n\n constructor(private hostOrigin: string) {\n this._messageHandler = this.handleMessage.bind(this)\n if (typeof window !== 'undefined') {\n window.addEventListener('message', this._messageHandler)\n }\n }\n\n setHostOrigin(origin: string): void {\n if (!origin || origin === '*' || origin === 'null') throw new Error('A trusted host origin is required.')\n this.hostOrigin = origin\n }\n\n /** Set the initial token received from the host's `verentis:init` message */\n setToken(info: TokenInfo): void {\n this._token = info.accessToken\n this._expiresAt = new Date(info.expiresAt).getTime()\n this.scheduleRefresh()\n }\n\n async getAuthHeader(): Promise<string | null> {\n if (!this._token) return null\n if (this.isExpired()) {\n await this.requestRefresh()\n }\n return `Bearer ${this._token}`\n }\n\n destroy(): void {\n this._destroyed = true\n if (this._refreshTimer) clearTimeout(this._refreshTimer)\n this.failRefresh('Authentication has been destroyed.')\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', this._messageHandler)\n }\n }\n\n private isExpired(): boolean {\n return Date.now() >= this._expiresAt - SKEW_MS\n }\n\n private _refreshResolve: (() => void) | null = null\n\n private requestRefresh(): Promise<void> {\n if (this._destroyed || this.hostOrigin === '*')\n return Promise.reject(new Error('Authentication is not initialized.'))\n if (this._pendingRefresh) return this._pendingRefresh\n\n const requestId = crypto.randomUUID()\n this._requestId = requestId\n\n this._pendingRefresh = new Promise<void>((resolve, reject) => {\n this._refreshResolve = resolve\n this._refreshReject = reject\n })\n this._requestTimer = setTimeout(() => this.failRefresh('Token refresh timed out.'), 20_000)\n\n const message: VerentisTokenRefreshMessage = {\n type: 'verentis:token:refresh',\n version: 1,\n requestId,\n }\n window.parent.postMessage(message, this.hostOrigin)\n\n return this._pendingRefresh\n }\n\n private handleMessage(event: MessageEvent): void {\n if (this._destroyed || event.origin !== this.hostOrigin || event.source !== window.parent) return\n\n const data = event.data as VerentisTokenRefreshedMessage\n if (data?.version !== 1 || data?.type !== 'verentis:token:refreshed' ||\n !this._requestId || data.requestId !== this._requestId ||\n typeof data.token?.accessToken !== 'string' ||\n !Number.isFinite(Date.parse(data.token.expiresAt)) ||\n Date.parse(data.token.expiresAt) <= Date.now() + SKEW_MS) return\n\n if (this._requestTimer) clearTimeout(this._requestTimer)\n this._requestTimer = null\n this._requestId = null\n this._token = data.token.accessToken\n this._expiresAt = new Date(data.token.expiresAt).getTime()\n this._pendingRefresh = null\n this._refreshResolve?.()\n this._refreshResolve = null\n this._refreshReject = null\n this.scheduleRefresh()\n }\n\n private scheduleRefresh(): void {\n if (this._refreshTimer) clearTimeout(this._refreshTimer)\n if (this._expiresAt === 0) return\n\n const delay = Math.max(0, this._expiresAt - Date.now() - SKEW_MS)\n this._refreshTimer = setTimeout(() => void this.requestRefresh().catch(() => {\n // Do not emit credentials or create an unhandled background rejection.\n // A subsequent API call may explicitly retry against the host.\n }), delay)\n }\n\n private failRefresh(message: string): void {\n if (this._requestTimer) clearTimeout(this._requestTimer)\n this._requestTimer = null\n this._requestId = null\n this._pendingRefresh = null\n this._refreshReject?.(new Error(message))\n this._refreshReject = null\n this._refreshResolve = null\n }\n}\n","import type { AuthStrategy, TokenInfo } from '../types'\n\nconst SKEW_MS = 30_000\n\n/**\n * Authenticates with a pre-existing bearer token.\n * Tracks expiry and invokes an optional refresh callback before the token expires.\n */\nexport class TokenAuth implements AuthStrategy {\n private _token: string\n private _expiresAt: number\n private _refreshTimer: ReturnType<typeof setTimeout> | null = null\n private _refreshFn?: () => Promise<TokenInfo>\n\n constructor(token: string, expiresAt?: string, refreshFn?: () => Promise<TokenInfo>) {\n this._token = token\n this._expiresAt = expiresAt ? new Date(expiresAt).getTime() : Infinity\n this._refreshFn = refreshFn\n this.scheduleRefresh()\n }\n\n async getAuthHeader(): Promise<string> {\n if (this.isExpired() && this._refreshFn) {\n await this.refresh()\n }\n return `Bearer ${this._token}`\n }\n\n /** Update the token (e.g. after a refresh) */\n update(info: TokenInfo): void {\n this._token = info.accessToken\n this._expiresAt = new Date(info.expiresAt).getTime()\n this.scheduleRefresh()\n }\n\n destroy(): void {\n if (this._refreshTimer) {\n clearTimeout(this._refreshTimer)\n this._refreshTimer = null\n }\n }\n\n private isExpired(): boolean {\n return Date.now() >= this._expiresAt - SKEW_MS\n }\n\n private async refresh(): Promise<void> {\n if (!this._refreshFn) return\n const info = await this._refreshFn()\n this.update(info)\n }\n\n private scheduleRefresh(): void {\n if (this._refreshTimer) clearTimeout(this._refreshTimer)\n if (!this._refreshFn || this._expiresAt === Infinity) return\n\n const delay = Math.max(0, this._expiresAt - Date.now() - SKEW_MS)\n this._refreshTimer = setTimeout(() => void this.refresh(), delay)\n }\n}\n","import type { AppApplicationContext, AppContext, AppSurface, EntryPointInfo, FileInfo, TokenGrant, WorkspaceInfo } from '../types'\n\n/**\n * Provides access to the current workspace and launch context.\n * In iframe mode, this is populated from the host's `verentis:init` message.\n * In standalone mode, the developer provides values via options.\n */\nexport class ContextModule {\n private _workspace: WorkspaceInfo | null = null\n private _surface: AppSurface | null = null\n private _file: FileInfo | null = null\n private _entryPoint: EntryPointInfo | null = null\n private _apiUrl: string | null = null\n private _application: AppApplicationContext | null = null\n private _installation: AppContext['installation'] | null = null\n private _grants: TokenGrant[] | null = null\n\n /** The current workspace */\n get workspace(): WorkspaceInfo {\n if (!this._workspace) {\n throw new Error('Workspace context not available. Ensure the client is initialized.')\n }\n return this._workspace\n }\n\n /** The host surface that launched the app */\n get surface(): AppSurface {\n if (!this._surface) {\n throw new Error('Launch surface not available. Ensure the client is initialized.')\n }\n return this._surface\n }\n\n /** The file that triggered the app to open on a file surface */\n get file(): FileInfo {\n if (!this._file) {\n throw new Error('File context not available. The app may be running on a workspace surface.')\n }\n return this._file\n }\n\n /** The API URL */\n get apiUrl(): string {\n if (!this._apiUrl) {\n throw new Error('API URL not available. Ensure the client is initialized.')\n }\n return this._apiUrl\n }\n\n /** Whether a file context is available */\n get hasFile(): boolean {\n return this._file !== null\n }\n\n /** The application entry point that matched the opened file */\n get entryPoint(): EntryPointInfo | null {\n return this._entryPoint\n }\n\n /** Whether an entry point context is available */\n get hasEntryPoint(): boolean {\n return this._entryPoint !== null\n }\n\n get application(): AppApplicationContext | null {\n return this._application ? { ...this._application } : null\n }\n\n get installation(): AppContext['installation'] | null {\n return this._installation ? { ...this._installation } : null\n }\n\n /**\n * The boundaries of a brokered token (canvas documents), as the host sent them with the token; `null` when the\n * token is not boundary-confined by a broker (or in standalone mode).\n */\n get grants(): TokenGrant[] | null {\n return this._grants ? this._grants.map(grant => ({ ...grant })) : null\n }\n\n /** Update the token's grants from the host's init or token refresh message */\n setGrants(grants: unknown): void {\n if (!Array.isArray(grants)) {\n this._grants = null\n return\n }\n this._grants = grants.filter((grant): grant is TokenGrant => typeof grant === 'object' && grant !== null\n && typeof grant.type === 'string' && typeof grant.identifier === 'string'\n && typeof grant.path === 'string' && grant.path.startsWith('/')\n && (grant.mode === 'read' || grant.mode === 'write') && typeof grant.source === 'string')\n .map(grant => ({ type: grant.type, identifier: grant.identifier, path: grant.path, mode: grant.mode, source: grant.source }))\n }\n\n /** Update context from the host's init message */\n setFromAppContext(ctx: AppContext): void {\n if (ctx.application !== undefined && (typeof ctx.application !== 'object' || ctx.application === null\n || typeof ctx.application.manifestPath !== 'string' || !ctx.application.manifestPath.startsWith('/')\n || typeof ctx.application.manifestNodeId !== 'string' || !ctx.application.manifestNodeId.trim()\n || typeof ctx.application.branch !== 'string' || !ctx.application.branch\n || ctx.application.branch !== ctx.application.branch.trim().toLowerCase()\n || /[\\u0000-\\u001f\\u007f]/.test(ctx.application.branch))) {\n throw new Error('Invalid application launch metadata')\n }\n this._workspace = ctx.workspace\n this._surface = ctx.surface ?? 'file'\n this._file = ctx.file ?? null\n this._entryPoint = ctx.entryPoint ?? null\n this._apiUrl = ctx.apiUrl\n this._application = ctx.application ? { ...ctx.application } : null\n this._installation = ctx.installation ? { ...ctx.installation } : null\n }\n\n /** Set workspace info directly (standalone mode) */\n setWorkspace(workspace: Partial<WorkspaceInfo> & { id: string }): void {\n this._workspace = {\n id: workspace.id,\n slug: workspace.slug ?? '',\n name: workspace.name ?? '',\n }\n }\n\n /** Set API URL directly */\n setApiUrl(url: string): void {\n this._apiUrl = url\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type {\n ExecuteEngineOptions,\n Execution,\n ExecutionLogs,\n ExecutionListOptions,\n PagedResult,\n ExecutionScopedOptions,\n ExecutionStatus,\n RunFileOptions,\n ScriptArgumentDescriptor,\n ScriptArgumentsOptions,\n WaitOptions,\n} from '../types'\n\n/** Schema of exported script argument descriptors. */\nexport const SCRIPT_ARGUMENTS_SCHEMA = 'verentis.io/script-arguments/v1'\n\nconst TERMINAL_STATUSES: ReadonlySet<ExecutionStatus> = new Set<ExecutionStatus>([\n 'Completed',\n 'Failed',\n 'Cancelled',\n 'TimedOut',\n])\n\n/** Returns true once an execution has reached a final state. */\nexport function isTerminalStatus(status: ExecutionStatus): boolean {\n return TERMINAL_STATUSES.has(status)\n}\n\n/**\n * Execution operations module. Triggers engine executions against files or a specific engine,\n * reads their status/result/logs, cancels them, and polls them to completion — all over the\n * Verentis execution API (`/v1/executions`).\n */\nexport class ExecutionsModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n /**\n * Run a file in the virtual file system. The platform resolves the appropriate engine from the\n * file's type (e.g. a `.py` file runs on the Python engine).\n */\n async run(filePath: string, options?: RunFileOptions): Promise<Execution> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<Execution>('POST', '/executions', {\n body: JSON.stringify({\n workspaceId,\n filePath,\n branch: options?.branch,\n tool: options?.tool,\n mode: options?.mode,\n arguments: options?.arguments ?? [],\n parameters: serializeParameters(options?.parameters),\n ...(options?.invocationKey ? { invocationKey: options.invocationKey } : {}),\n }),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /**\n * Execute a specific engine by id, optionally against a file and/or with structured parameters\n * (e.g. invoking an engine tool without a script).\n */\n async execute(engineId: string, options?: ExecuteEngineOptions): Promise<Execution> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<Execution>('POST', '/executions', {\n body: JSON.stringify({\n workspaceId,\n engineId,\n filePath: options?.filePath,\n branch: options?.branch,\n tool: options?.tool,\n mode: options?.mode,\n arguments: options?.arguments ?? [],\n parameters: serializeParameters(options?.parameters),\n }),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /**\n * Read the arguments a script declares (its exported `<script>.arguments.json`), e.g. to build a form\n * before {@link run}. Returns `null` for scripts that declare none. Reading never runs the script.\n */\n async getArguments(filePath: string, options?: ScriptArgumentsOptions): Promise<ScriptArgumentDescriptor | null> {\n const path = `${filePath}.arguments.json`.replace(/\\/+/g, '/').replace(/^\\//, '')\n const response = await this.http.requestRaw('GET', `/files/raw/${path}`, {\n params: { branch: options?.branch ?? 'main' },\n headers: { ...(this.workspaceId ? { 'X-Workspace-Id': this.workspaceId } : {}), Accept: 'application/json' },\n })\n if (response.status === 404) return null\n if (!response.ok) {\n throw new Error(`Failed to read script arguments: ${response.status} ${response.statusText}`)\n }\n const descriptor = (await response.json()) as ScriptArgumentDescriptor\n if (descriptor?.schema !== SCRIPT_ARGUMENTS_SCHEMA || !Array.isArray(descriptor.arguments)) {\n throw new Error(`Unsupported script argument descriptor for ${filePath}`)\n }\n return descriptor\n }\n\n /** Get an execution by id. */\n async get(id: string, options?: ExecutionScopedOptions): Promise<Execution> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<Execution>('GET', `/executions/${encodeURIComponent(id)}`, {\n params: { workspaceId },\n })\n }\n\n /** List workspace executions with optional engine, file, lifecycle, and time filters. */\n async list(options?: ExecutionListOptions): Promise<PagedResult<Execution>> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<PagedResult<Execution>>('GET', '/executions', {\n params: {\n workspaceId,\n filePath: options?.filePath,\n engineIds: options?.engineIds,\n filePaths: options?.filePaths,\n status: options?.status,\n trigger: options?.trigger,\n activeOnly: options?.activeOnly,\n requestedAfter: options?.requestedAfter,\n requestedBefore: options?.requestedBefore,\n pageNo: options?.pageNo ?? 1,\n pageSize: options?.pageSize ?? 20,\n orderBy: options?.orderBy,\n },\n })\n }\n\n /** Get the captured stdout/stderr of an execution. */\n async logs(id: string, options?: ExecutionScopedOptions): Promise<ExecutionLogs> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<ExecutionLogs>('GET', `/executions/${encodeURIComponent(id)}/logs`, {\n params: { workspaceId },\n })\n }\n\n /** Cancel a pending or running execution. */\n async cancel(id: string, options?: ExecutionScopedOptions): Promise<Execution> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<Execution>('POST', `/executions/${encodeURIComponent(id)}/cancel`, {\n body: JSON.stringify({ id, workspaceId }),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /**\n * Poll an execution until it reaches a terminal status. Returns immediately if it is already\n * terminal. Throws if `timeoutMs` elapses or the supplied signal aborts.\n */\n async wait(id: string, options?: WaitOptions): Promise<Execution> {\n const interval = options?.intervalMs ?? 1000\n const deadline = options?.timeoutMs ? Date.now() + options.timeoutMs : undefined\n\n for (;;) {\n const execution = await this.get(id, { workspaceId: options?.workspaceId })\n if (isTerminalStatus(execution.status)) {\n return execution\n }\n\n if (deadline !== undefined && Date.now() >= deadline) {\n throw new Error(`Timed out waiting for execution '${id}' to complete`)\n }\n\n await delay(interval, options?.signal)\n }\n }\n\n /**\n * Run a file and resolve once it has completed. For synchronous (request-response) executions the\n * initial response is already terminal; otherwise it polls via {@link wait}.\n */\n async runAndWait(filePath: string, options?: RunFileOptions & WaitOptions): Promise<Execution> {\n const execution = await this.run(filePath, options)\n if (isTerminalStatus(execution.status)) {\n return execution\n }\n return this.wait(execution.id, options)\n }\n\n private requireWorkspaceId(override?: string): string {\n const id = override ?? this.workspaceId\n if (!id) {\n throw new Error('workspaceId is required: provide it in options or when creating the client')\n }\n return id\n }\n}\n\n/** The platform expects `parameters` as a JSON string; serialize structured input for ergonomics. */\nfunction serializeParameters(parameters?: Record<string, unknown>): string | undefined {\n return parameters === undefined ? undefined : JSON.stringify(parameters)\n}\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'))\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(resolve, ms)\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer)\n reject(new DOMException('Aborted', 'AbortError'))\n },\n { once: true },\n )\n })\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type {\n ExecutionEngine,\n ExecutionEngineListOptions,\n ExecutionScopedOptions,\n PagedResult,\n} from '../types'\n\n/** Read-only access to execution engines registered in a workspace. */\nexport class EnginesModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n async list(options?: ExecutionEngineListOptions): Promise<PagedResult<ExecutionEngine>> {\n return this.http.request<PagedResult<ExecutionEngine>>('GET', '/engines', {\n params: {\n workspaceId: this.requireWorkspaceId(options?.workspaceId),\n pageNo: options?.pageNo ?? 1,\n pageSize: options?.pageSize ?? 20,\n orderBy: options?.orderBy,\n },\n })\n }\n\n async get(id: string, options?: ExecutionScopedOptions): Promise<ExecutionEngine> {\n return this.http.request<ExecutionEngine>('GET', `/engines/${encodeURIComponent(id)}`, {\n params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) },\n })\n }\n\n private requireWorkspaceId(override?: string): string {\n const workspaceId = override ?? this.workspaceId\n if (!workspaceId) {\n throw new Error('workspaceId is required: provide it in options or when creating the client')\n }\n return workspaceId\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type { DeleteFileOptions, ExtractUploadOptions, FileEntry, GetFileOptions, InstalledPackageDescriptor, MoveFileOptions, NodeFileContent, NodeFileMetadata, NodeFileOptions, ReadArchiveOptions, WriteFileOptions, WriteNodeFileOptions } from '../types'\n\n/**\n * File operations module. Provides read, write, list, move, and delete\n * against the Verentis Node file API.\n */\nexport class FilesModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n /**\n * Get file metadata or directory listing.\n * For files: returns metadata (path, name, mimeType, size, etc.).\n * For directories: returns metadata with children array populated.\n */\n async get(path: string, options?: GetFileOptions): Promise<FileEntry> {\n const normalizedPath = normalizePath(path)\n return this.http.request<FileEntry>('GET', `/files/${normalizedPath}`, {\n params: {\n branch: options?.branch ?? 'main',\n pageNo: options?.pageNo ?? 1,\n pageSize: options?.pageSize ?? 20,\n orderBy: options?.orderBy,\n },\n headers: this.workspaceHeaders(),\n })\n }\n\n /** Read metadata by stable node identity on an explicit branch. */\n async getNode(nodeId: string, options: NodeFileOptions): Promise<NodeFileMetadata> {\n requireNonBlank(nodeId, 'Node ID')\n requireNonBlank(options.branch, 'Branch')\n return this.http.request<NodeFileMetadata>('GET', `/nodes/${encodeURIComponent(nodeId)}/file`, {\n headers: { ...this.workspaceHeaders(), 'X-Branch': options.branch },\n })\n }\n\n /** Read bytes and their matching content revision in the same response. */\n async readNodeContent(nodeId: string, options: NodeFileOptions): Promise<NodeFileContent> {\n requireNonBlank(nodeId, 'Node ID')\n requireNonBlank(options.branch, 'Branch')\n const response = await this.http.requestRaw('GET', `/nodes/${encodeURIComponent(nodeId)}/content`, {\n headers: { ...this.workspaceHeaders(), 'X-Branch': options.branch, Accept: '*/*' },\n })\n await this.http.ensureSuccess(response)\n const revision = response.headers.get('ETag')\n if (!revision || !/^\"[a-fA-F0-9]{32}\"$/.test(revision)) {\n throw new Error('Node-content response did not include a valid strong revision ETag.')\n }\n return { content: await response.blob(), revision }\n }\n\n /** Replace existing node bytes conditionally; never creates or changes path/MIME. */\n async writeNodeContent(nodeId: string, options: WriteNodeFileOptions): Promise<NodeFileMetadata> {\n requireNonBlank(nodeId, 'Node ID')\n requireNonBlank(options.branch, 'Branch')\n requireNonBlank(options.idempotencyKey, 'Idempotency key')\n const revision = /^[a-fA-F0-9]{32}$/.test(options.revision)\n ? `\"${options.revision}\"`\n : options.revision\n if (!/^\"[a-fA-F0-9]{32}\"$/.test(revision)) {\n throw new Error('A single strong node-content revision is required.')\n }\n const content = typeof options.content === 'string'\n ? new Blob([options.content])\n : options.content instanceof ArrayBuffer ? new Blob([options.content]) : options.content\n return this.http.request<NodeFileMetadata>('PUT', `/nodes/${encodeURIComponent(nodeId)}/content`, {\n body: content,\n headers: {\n ...this.workspaceHeaders(),\n 'X-Branch': options.branch,\n 'If-Match': revision,\n 'Idempotency-Key': options.idempotencyKey,\n 'Content-Type': 'application/octet-stream',\n },\n })\n }\n\n /**\n * Read the raw content of a file as a Blob.\n */\n async readContent(path: string, branch?: string): Promise<Blob> {\n const normalizedPath = normalizePath(path)\n const response = await this.http.requestRaw('GET', `/files/raw/${normalizedPath}`, {\n params: { branch: branch ?? 'main' },\n headers: {\n ...this.workspaceHeaders(),\n Accept: '*/*',\n },\n })\n if (!response.ok) {\n throw new Error(`Failed to read file content: ${response.status} ${response.statusText}`)\n }\n return response.blob()\n }\n\n /** Read UTF-8 text content from a workspace file. */\n async readText(path: string, branch?: string): Promise<string> {\n return (await this.readContent(path, branch)).text()\n }\n\n /** Inspect an extracted or sealed package node without exposing sealed payload content. */\n async getPackageDescriptor(path: string, branch = 'main'): Promise<InstalledPackageDescriptor> {\n return this.http.request<InstalledPackageDescriptor>('GET', '/files/package-descriptor', {\n params: { branch, path },\n headers: this.workspaceHeaders(),\n })\n }\n\n /**\n * Download a file or directory as an archive (zip or tgz).\n * Only applicable when the target has children or you want a packaged download.\n */\n async readArchive(path: string, options?: ReadArchiveOptions): Promise<Blob> {\n const normalizedPath = normalizePath(path)\n const format = options?.format ?? 'zip'\n const response = await this.http.requestRaw('GET', `/files/raw/${normalizedPath}`, {\n params: {\n branch: options?.branch ?? 'main',\n format,\n },\n headers: {\n ...this.workspaceHeaders(),\n Accept: format === 'tgz' ? 'application/gzip' : 'application/zip',\n },\n })\n if (!response.ok) {\n throw new Error(`Failed to download archive: ${response.status} ${response.statusText}`)\n }\n return response.blob()\n }\n\n /**\n * Upload an archive (zip or tgz) and auto-extract its contents as individual nodes.\n * If the archive contains a `.verentis-manifest.json`, the original metadata\n * (display names, mime types, parent-content relationships) will be honoured.\n */\n async extractUpload(path: string, file: Blob, options?: ExtractUploadOptions): Promise<void> {\n const normalizedPath = normalizePath(path)\n const formData = new FormData()\n\n const filename = options?.filename ?? 'archive.zip'\n formData.append('file', file, filename)\n\n const metadata: Record<string, unknown> = {}\n if (options?.branch) metadata.branch = options.branch\n formData.append('metadata', JSON.stringify(metadata))\n\n await this.http.request('POST', `/files/${normalizedPath}`, {\n body: formData,\n headers: {\n ...this.workspaceHeaders(),\n 'X-Auto-Extract': 'true',\n },\n })\n }\n\n /**\n * Upload or create a file.\n */\n async write(path: string, options: WriteFileOptions): Promise<void> {\n const normalizedPath = normalizePath(path)\n const formData = new FormData()\n\n let blob: Blob\n if (typeof options.content === 'string') {\n blob = new Blob([options.content], { type: options.contentType ?? 'text/plain' })\n } else if (options.content instanceof ArrayBuffer) {\n blob = new Blob([options.content], { type: options.contentType ?? 'application/octet-stream' })\n } else {\n blob = options.content\n }\n\n const filename = options.filename ?? extractFilename(path)\n formData.append('file', blob, filename)\n\n const metadata: Record<string, unknown> = {}\n if (options.contentType) metadata.contentType = options.contentType\n if (options.branch) metadata.branch = options.branch\n formData.append('metadata', JSON.stringify(metadata))\n\n await this.http.request('POST', `/files/${normalizedPath.split('/').map(encodeURIComponent).join('/')}`, {\n body: formData,\n headers: {\n ...this.workspaceHeaders(),\n ...(options.createOnly ? { 'If-None-Match': '*' } : {}),\n },\n })\n }\n\n /** Create without a read-before-write race or overwrite of an existing live file. */\n async create(path: string, options: WriteFileOptions): Promise<void> {\n await this.write(path, { ...options, createOnly: true })\n }\n\n /**\n * Move or rename a file.\n */\n async move(options: MoveFileOptions): Promise<void> {\n await this.http.request('PUT', '/files', {\n body: JSON.stringify({\n from: normalizePath(options.from),\n to: normalizePath(options.to),\n branch: options.branch,\n }),\n headers: {\n ...this.workspaceHeaders(),\n 'Content-Type': 'application/json',\n },\n })\n }\n\n /**\n * Delete a file.\n */\n async remove(options: DeleteFileOptions): Promise<void> {\n const path = normalizePath(options.path)\n requireNonBlank(path, 'File path')\n const branch = options.branch ?? 'main'\n requireNonBlank(branch, 'Branch')\n if (options.headStamp !== undefined) requireNonBlank(options.headStamp, 'Path head stamp')\n if (options.idempotencyKey !== undefined) requireNonBlank(options.idempotencyKey, 'Idempotency key')\n await this.http.request('DELETE', `/files/${path.split('/').map(encodeURIComponent).join('/')}`, {\n params: { branch },\n headers: {\n ...this.workspaceHeaders(),\n ...(options.headStamp === undefined ? {} : { 'If-Match': options.headStamp }),\n ...(options.idempotencyKey === undefined ? {} : { 'Idempotency-Key': options.idempotencyKey }),\n ...(options.mode === undefined ? {} : { 'X-Delete-Mode': options.mode === 'deep' ? 'Deep' : 'Shallow' }),\n },\n })\n }\n\n private workspaceHeaders(): Record<string, string> {\n const headers: Record<string, string> = {}\n if (this.workspaceId) {\n headers['X-Workspace-Id'] = this.workspaceId\n }\n return headers\n }\n}\n\nfunction requireNonBlank(value: string, name: string): void {\n if (value.trim().length === 0) throw new Error(`${name} is required.`)\n}\n\n/** Normalize a file path: strip leading/trailing slashes, collapse doubles */\nfunction normalizePath(path: string): string {\n return path\n .replace(/\\/+/g, '/')\n .replace(/^\\//, '')\n .replace(/\\/$/, '')\n}\n\n/** Extract filename from a path */\nfunction extractFilename(path: string): string {\n const segments = path.split('/')\n return segments[segments.length - 1] || 'file'\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type {\n Installation,\n InstallationGraphPreview,\n InstallationGraphResult,\n InstallationDetail,\n InstallationLifecycleResult,\n InstallationListOptions,\n InstallationScopedOptions,\n PagedResult,\n PreviewInstallationOptions,\n ResolveInstallationOptions,\n UpdateInstallationOptions,\n} from '../types'\n\n/** Manage Marketplace installation ledger records for the current workspace. */\nexport class InstallationsModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n /** Resolve canonical publisher/package identity, never the installation's runtime display name. */\n async resolvePackageId(identity: string, options?: InstallationScopedOptions): Promise<string> {\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*\\/[a-z0-9]+(?:-[a-z0-9]+)*$/.test(identity)) {\n throw new Error('A canonical publisher/package identity is required')\n }\n const result = await this.http.request<{ id: string }>('GET', `/packages/by-package-id/${identity}`, {\n params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) },\n })\n if (!result || typeof result.id !== 'string' || !/^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/i.test(result.id)) {\n throw new Error('The catalog response omitted its stable package identity')\n }\n return result.id\n }\n\n /** Resolves the complete required graph without installing anything or granting capabilities. */\n async preview(packageId: string, options?: PreviewInstallationOptions): Promise<InstallationGraphPreview> {\n return this.http.request<InstallationGraphPreview>('POST', '/installations/graphs/preview', {\n body: JSON.stringify({\n workspaceId: this.requireWorkspaceId(options?.workspaceId),\n packageId,\n packageVersion: options?.packageVersion,\n installPath: options?.installPath,\n branch: options?.branch,\n installMode: options?.installMode,\n }),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /** Explicit, single-use consent to a displayed preview. Never automatically retries accepted installs. */\n async install(preview: InstallationGraphPreview, consent: true): Promise<InstallationGraphResult> {\n if (consent !== true) throw new Error('Explicit consent to the installation graph is required')\n return this.http.request<InstallationGraphResult>('POST', '/installations/graphs', {\n body: JSON.stringify({\n workspaceId: preview.workspaceId,\n operationId: preview.operationId,\n fingerprint: preview.fingerprint,\n consent,\n }),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /** Inspect durable outcomes after a failure or lost response instead of resubmitting consent. */\n async graphResult(operationId: string, options?: InstallationScopedOptions): Promise<InstallationGraphResult> {\n return this.http.request<InstallationGraphResult>('GET', `/installations/graphs/${encodeURIComponent(operationId)}`, {\n params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) },\n })\n }\n\n async list(options?: InstallationListOptions): Promise<PagedResult<Installation>> {\n return this.http.request<PagedResult<Installation>>('GET', '/installations', {\n params: {\n workspaceId: this.requireWorkspaceId(options?.workspaceId),\n pageNo: options?.pageNo ?? 1,\n pageSize: options?.pageSize ?? 20,\n orderBy: options?.orderBy,\n packageId: options?.packageId,\n branch: options?.branch,\n installPath: options?.installPath,\n status: options?.status,\n isSystem: options?.isSystem,\n },\n })\n }\n\n async resolve(\n installPath: string,\n options?: ResolveInstallationOptions,\n ): Promise<InstallationDetail> {\n return this.http.request<InstallationDetail>('GET', '/installations/resolve', {\n params: {\n workspaceId: this.requireWorkspaceId(options?.workspaceId),\n branch: options?.branch ?? 'main',\n installPath,\n },\n })\n }\n\n async update(\n id: string,\n options?: UpdateInstallationOptions,\n ): Promise<InstallationLifecycleResult> {\n const workspaceId = this.requireWorkspaceId(options?.workspaceId)\n return this.http.request<InstallationLifecycleResult>(\n 'PUT',\n `/installations/${encodeURIComponent(id)}`,\n {\n body: JSON.stringify({\n id,\n workspaceId,\n packageVersion: options?.packageVersion,\n installMode: options?.installMode,\n }),\n headers: { 'Content-Type': 'application/json' },\n },\n )\n }\n\n async uninstall(id: string, options?: InstallationScopedOptions): Promise<void> {\n await this.http.request<void>('DELETE', `/installations/${encodeURIComponent(id)}`, {\n params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) },\n })\n }\n\n private requireWorkspaceId(override?: string): string {\n const workspaceId = override ?? this.workspaceId\n if (!workspaceId) {\n throw new Error('workspaceId is required: provide it in options or when creating the client')\n }\n return workspaceId\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type { ResourceRegistration, ResourceScopedOptions } from '../types'\n\n/** Read-only access to workspace Resource registrations and resolved application handlers. */\nexport class ResourcesModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n async list(options?: ResourceScopedOptions): Promise<ResourceRegistration[]> {\n return this.http.request<ResourceRegistration[]>('GET', '/resources', {\n params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) },\n })\n }\n\n async get(id: string, options?: ResourceScopedOptions): Promise<ResourceRegistration> {\n return this.http.request<ResourceRegistration>(\n 'GET',\n `/resources/${encodeURIComponent(id)}`,\n { params: { workspaceId: this.requireWorkspaceId(options?.workspaceId) } },\n )\n }\n\n private requireWorkspaceId(override?: string): string {\n const workspaceId = override ?? this.workspaceId\n if (!workspaceId) {\n throw new Error('workspaceId is required: provide it in options or when creating the client')\n }\n return workspaceId\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type {\n SettingGroup,\n SettingItem,\n SettingPresence,\n SettingsScopedOptions,\n} from '../types'\n\n/**\n * Workspace settings module. Reads (and where permitted, writes) workspace-scoped settings\n * over the Verentis settings API (`/v1/settings`).\n *\n * The app token must carry the matching scopes, declared in the manifest's `spec.permissions`:\n * `setting.read` (get, list), `setting.write` (set)\n * and `setting.delete` (reset).\n *\n * Secret values are server-only: for browser callers the platform always returns `value: null`\n * for secrets while `hasValue` reports whether one is configured. Manifest-declared settings\n * are stored namespaced as `{manifest-name}.{key}` — see {@link SettingsModule.namespaced}.\n */\nexport class SettingsModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n /** List every setting group visible to the workspace (definitions merged with values). */\n async list(options?: SettingsScopedOptions): Promise<SettingGroup[]> {\n return this.http.request<SettingGroup[]>('GET', '/settings', {\n params: this.scopeParams(options),\n })\n }\n\n /** Get a single setting by its full key (e.g. `graphite.api-key`). */\n async get(key: string, options?: SettingsScopedOptions): Promise<SettingItem> {\n return this.http.request<SettingItem>('GET', `/settings/${encodeURIComponent(key)}`, {\n params: this.scopeParams(options),\n })\n }\n\n /** Get a setting's value by its full key, or `defaultValue` when unset. */\n async getValue<T = unknown>(\n key: string,\n defaultValue?: T,\n options?: SettingsScopedOptions,\n ): Promise<T | undefined> {\n const item = await this.get(key, options)\n return (item.value ?? item.defaultValue ?? defaultValue) as T | undefined\n }\n\n /**\n * Check exact setting keys for retained stored values and effective defaults.\n * This never returns value content and also finds values retained after a definition is removed.\n */\n async presence(keys: string[], options?: SettingsScopedOptions): Promise<SettingPresence[]> {\n if (keys.length === 0) return []\n return this.http.request<SettingPresence[]>('GET', '/settings/presence', {\n params: {\n scopeKind: 'Workspace',\n parentId: this.requireWorkspaceId(options?.workspaceId),\n keys,\n },\n })\n }\n\n /** Upsert a setting value by its full key. Requires the `setting.write` scope. */\n async set(key: string, value: unknown, options?: SettingsScopedOptions): Promise<void> {\n await this.http.request<void>('PUT', `/settings/${encodeURIComponent(key)}`, {\n params: {\n scopeKind: 'Workspace',\n parentId: this.requireWorkspaceId(options?.workspaceId),\n },\n body: JSON.stringify(value ?? null),\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n /** Delete a stored value (reverting to the definition default). Requires `setting.delete`. */\n async reset(key: string, options?: SettingsScopedOptions): Promise<void> {\n await this.http.request<void>('DELETE', `/settings/${encodeURIComponent(key)}`, {\n params: {\n scopeKind: 'Workspace',\n parentId: this.requireWorkspaceId(options?.workspaceId),\n },\n })\n }\n\n /**\n * A view of this module where every key is auto-prefixed with `{namespace}.` — the platform's\n * manifest namespacing convention. An app named `graphite` declaring `key: api-key` reads it as:\n *\n * ```ts\n * const settings = client.settings.namespaced('graphite')\n * const apiKey = await settings.getValue<string>('api-key')\n * ```\n */\n namespaced(namespace: string): NamespacedSettings {\n const prefix = namespace.endsWith('.') ? namespace : `${namespace}.`\n return {\n get: (key, options) => this.get(prefix + key, options),\n getValue: (key, defaultValue, options) => this.getValue(prefix + key, defaultValue, options),\n set: (key, value, options) => this.set(prefix + key, value, options),\n reset: (key, options) => this.reset(prefix + key, options),\n }\n }\n\n private scopeParams(options?: SettingsScopedOptions): Record<string, string> {\n return {\n scopeKind: 'Workspace',\n parentId: this.requireWorkspaceId(options?.workspaceId),\n // Secret values never reach browser callers; the platform rejects `true` for\n // anything but trusted service-to-service identities.\n includeSecretValues: 'false',\n }\n }\n\n private requireWorkspaceId(override?: string): string {\n const workspaceId = override ?? this.workspaceId\n if (!workspaceId) {\n throw new Error(\n 'workspaceId is required: pass it in options or configure the client with one',\n )\n }\n return workspaceId\n }\n}\n\n/** Key-prefixed settings accessor returned by {@link SettingsModule.namespaced}. */\nexport interface NamespacedSettings {\n get(key: string, options?: SettingsScopedOptions): Promise<SettingItem>\n getValue<T = unknown>(\n key: string,\n defaultValue?: T,\n options?: SettingsScopedOptions,\n ): Promise<T | undefined>\n set(key: string, value: unknown, options?: SettingsScopedOptions): Promise<void>\n reset(key: string, options?: SettingsScopedOptions): Promise<void>\n}\n","// ---------------------------------------------------------------------------\n// PostMessage Protocol\n// ---------------------------------------------------------------------------\n\nexport interface VerentisMessage {\n type: `verentis:${string}`\n version: 1\n requestId?: string\n}\n\n// Host → App messages\nimport type { HeaderAction, HeaderActionResult } from './transport/header-actions'\nimport type { AppCommand } from './transport/app-commands'\nimport type { NativeCollaborationRequest, NativeCollaborationResponse } from './collaboration/native'\n\nexport interface VerentisInitMessage extends VerentisMessage {\n type: 'verentis:init'\n context: AppContext\n token: TokenInfo\n sessionId?: string\n /** Optional host features, e.g. `commands` for page command registration. */\n capabilities?: string[]\n}\n\nexport interface VerentisActionsSetMessage extends VerentisMessage {\n type: 'verentis:actions:set'\n sessionId: string\n actions: HeaderAction[]\n}\n\nexport interface VerentisActionInvokeMessage extends VerentisMessage {\n type: 'verentis:action:invoke'\n sessionId: string\n requestId: string\n actionId: string\n}\n\nexport interface VerentisActionResultMessage extends VerentisMessage {\n type: 'verentis:action:result'\n sessionId: string\n requestId: string\n actionId: string\n result?: HeaderActionResult\n error?: string\n}\n\n/** Incremental page-command registration. `reset` replaces everything the host holds for the session. */\nexport interface VerentisCommandsUpdateMessage extends VerentisMessage {\n type: 'verentis:commands:update'\n sessionId: string\n reset?: boolean\n upsert: AppCommand[]\n remove: string[]\n}\n\nexport interface VerentisCommandInvokeMessage extends VerentisMessage {\n type: 'verentis:command:invoke'\n sessionId: string\n requestId: string\n commandId: string\n}\n\nexport interface VerentisCommandResultMessage extends VerentisMessage {\n type: 'verentis:command:result'\n sessionId: string\n requestId: string\n commandId: string\n error?: string\n}\n\n/**\n * A message from the workspace (typically an agent acting for the user) on a channel the app declares in\n * its manifest `spec.messages`. Handled with `bridge.onHostMessage(channel, handler)`.\n */\nexport interface VerentisHostMessage extends VerentisMessage {\n type: 'verentis:host:message'\n sessionId: string\n requestId: string\n channel: string\n payload?: unknown\n}\n\nexport interface VerentisHostReplyMessage extends VerentisMessage {\n type: 'verentis:host:reply'\n sessionId: string\n requestId: string\n channel: string\n result?: unknown\n error?: string\n}\n\nexport interface VerentisTokenRefreshedMessage extends VerentisMessage {\n type: 'verentis:token:refreshed'\n requestId: string\n token: TokenInfo\n}\n\n/** Nonsecret active-document metadata. CODE already holds its own scoped credential. */\nexport interface WopiContinuation {\n sessionId: string\n workspaceId: string\n branch: string\n nodeId: string\n accessTokenTtl: number\n fileId: string\n format: string\n readOnly: boolean\n name: string\n}\n\n/** Initial document-scoped collaboration authority, never a platform OAuth credential. */\nexport interface WopiLaunch extends WopiContinuation {\n action: string\n accessToken: string\n editorOrigin: string\n wopiSource: string\n}\nexport interface WopiSaveCheckpoint {\n generation: number\n correlation: string\n revision?: string | null\n}\n\nexport interface WopiSaveStatus {\n state: string\n revision: string\n readOnly: boolean\n receipt: WopiSaveCheckpoint | null\n continuationAvailable?: boolean\n}\n\nexport interface VerentisWopiRequest extends VerentisMessage {\n type: 'verentis:wopi:request'\n requestId: string\n sessionId: string\n operation: 'launch' | 'status' | 'save' | 'close' | 'continue'\n generation?: number\n}\n\nexport interface VerentisWopiResponse extends VerentisMessage {\n type: 'verentis:wopi:response'\n requestId: string\n sessionId: string\n result?: WopiLaunch | WopiContinuation | WopiSaveCheckpoint | WopiSaveStatus | null\n error?: string\n}\n\nexport interface VerentisFileChangedMessage extends VerentisMessage {\n type: 'verentis:file:changed'\n path: string\n fileVersion?: string\n}\n\nexport interface VerentisThemeMessage extends VerentisMessage {\n type: 'verentis:theme'\n colorScheme: 'light' | 'dark'\n variables?: Record<string, string>\n}\n\n/** Host → app chat live-hint relay messages (bound to the bridge session). */\nexport interface VerentisChatSubscribedMessage extends VerentisMessage {\n type: 'verentis:chat:subscribed'\n sessionId: string\n status: string\n}\n\nexport interface VerentisChatChangedMessage extends VerentisMessage {\n type: 'verentis:chat:changed'\n sessionId: string\n hint: { conversationId: string; highWatermark: number; kinds: string[] }\n}\n\nexport interface VerentisChatConnectionMessage extends VerentisMessage {\n type: 'verentis:chat:connection'\n sessionId: string\n status: string\n}\n\nexport interface VerentisChatErrorMessage extends VerentisMessage {\n type: 'verentis:chat:error'\n sessionId: string\n reason: string\n}\n\n/** App → host chat relay subscription messages. */\nexport interface VerentisChatSubscriptionMessage extends VerentisMessage {\n type: 'verentis:chat:subscribe' | 'verentis:chat:unsubscribe'\n sessionId: string\n}\n\n// App → Host messages\n\nexport interface VerentisReadyMessage extends VerentisMessage {\n type: 'verentis:ready'\n capabilities?: string[]\n}\n\nexport interface VerentisTokenRefreshMessage extends VerentisMessage {\n type: 'verentis:token:refresh'\n requestId: string\n}\n\nexport interface VerentisNavigateMessage extends VerentisMessage {\n type: 'verentis:navigate'\n /** Target of the navigation: a workspace file path or an absolute http(s) URL. */\n path: string\n /** When true, the host opens the target in a new browser tab instead of the current one. */\n newTab?: boolean\n}\n\nexport interface VerentisResizeMessage extends VerentisMessage {\n type: 'verentis:resize'\n height: number\n}\n\nexport interface VerentisTitleMessage extends VerentisMessage {\n type: 'verentis:title'\n title: string\n}\n\nexport interface VerentisDirtyMessage extends VerentisMessage {\n type: 'verentis:dirty'\n isDirty: boolean\n}\n\nexport type HostToAppMessage =\n | VerentisInitMessage\n | VerentisActionInvokeMessage\n | VerentisCommandInvokeMessage\n | VerentisHostMessage\n | VerentisTokenRefreshedMessage\n | VerentisFileChangedMessage\n | VerentisThemeMessage\n | VerentisWopiResponse\n | NativeCollaborationResponse\n | VerentisChatSubscribedMessage\n | VerentisChatChangedMessage\n | VerentisChatConnectionMessage\n | VerentisChatErrorMessage\n\nexport type AppToHostMessage =\n | VerentisReadyMessage\n | VerentisActionsSetMessage\n | VerentisActionResultMessage\n | VerentisCommandsUpdateMessage\n | VerentisCommandResultMessage\n | VerentisHostReplyMessage\n | VerentisTokenRefreshMessage\n | VerentisNavigateMessage\n | VerentisResizeMessage\n | VerentisTitleMessage\n | VerentisDirtyMessage\n | VerentisWopiRequest\n | NativeCollaborationRequest\n | VerentisChatSubscriptionMessage\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport type AppSurface = 'file' | 'workspace'\n\ninterface AppContextBase {\n application?: AppApplicationContext\n workspace: WorkspaceInfo\n entryPoint?: EntryPointInfo\n apiUrl: string\n installation?: { id: string; backendClientId?: string; authorizationGeneration?: string; wopiEnabled?: boolean }\n /** In-app location the host asks the app to open (for example `/conversations/<id>` from a notification). */\n location?: string\n}\n\nexport interface AppApplicationContext {\n manifestPath: string\n manifestNodeId: string\n branch: string\n}\n\n/** Context for an application opened against a workspace file. */\nexport interface FileAppContext extends AppContextBase {\n surface: 'file'\n file: FileInfo\n}\n\n/** Context for an application opened as a standalone workspace experience. */\nexport interface WorkspaceAppContext extends AppContextBase {\n surface: 'workspace'\n file?: never\n}\n\n/**\n * Legacy file-hosted contexts did not include a surface discriminator. They\n * remain accepted and are treated as `file` surfaces by the SDK.\n */\ninterface LegacyFileAppContext extends AppContextBase {\n surface?: undefined\n file: FileInfo\n}\n\n/**\n * Application context supplied by the workspace host.\n *\n * New hosts explicitly identify `file` or `workspace` surfaces. The legacy\n * file shape without `surface` remains supported for backwards compatibility.\n */\nexport type AppContext = FileAppContext | WorkspaceAppContext | LegacyFileAppContext\n\nexport interface WorkspaceInfo {\n id: string\n slug: string\n name: string\n}\n\nexport interface FileInfo {\n nodeId?: string\n branch?: string\n path: string\n name: string\n mimeType: string\n size: number\n version?: string\n etag?: string\n}\n\nexport interface EntryPointInfo {\n id: string\n displayName: string\n description?: string\n icon?: string\n route: string\n mode: 'view' | 'edit'\n matchedPattern: string\n priority: number\n}\n\n/**\n * One boundary of a brokered token (canvas documents): the platform-normalized workspace `path` it confines to and\n * the `mode` granted there. Informational for client-side UX; the platform enforces the token itself.\n */\nexport interface TokenGrant {\n type: string\n identifier: string\n path: string\n mode: 'read' | 'write'\n source: 'bound' | 'document' | 'declared'\n}\n\nexport interface TokenInfo {\n accessToken: string\n expiresAt: string\n scopes: string[]\n /** Brokered tokens only: the boundaries the token carries. */\n grants?: TokenGrant[]\n}\n\n// ---------------------------------------------------------------------------\n// Client Options\n// ---------------------------------------------------------------------------\n\nexport interface VerentisClientOptions {\n /** Base URL of the Verentis API gateway (e.g. 'https://api.verentis.com') */\n apiUrl?: string\n /** API version prefix (defaults to 'v1') */\n apiVersion?: string\n /** Authentication configuration */\n auth?: AuthOptions\n /** Workspace ID for standalone mode */\n workspaceId?: string\n}\n\nexport type AuthOptions =\n | { apiKey: string }\n | { token: string; expiresAt?: string; refreshToken?: () => Promise<TokenInfo> }\n\n/**\n * Options for {@link VerentisNavigateMessage}-based navigation requests.\n */\nexport interface NavigateOptions {\n /**\n * When true, the host opens the target in a new browser tab instead of\n * navigating the current tab. Defaults to false.\n *\n * The target may be a workspace file path or an absolute http(s) URL.\n * Opening an external URL requires the app to declare the\n * `navigation:external` capability in its manifest.\n */\n newTab?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// File API Types\n// ---------------------------------------------------------------------------\n\nexport interface FileEntry {\n path: string\n name: string\n size: number\n mimeType: string\n version?: string\n etag?: string\n children?: FileEntry[]\n /** Stable node identity, when supplied by the path metadata API. */\n nodeId?: string\n}\n\nexport interface NodeFileMetadata {\n nodeId: string\n path: string\n name: string\n mimeType: string\n size?: number | null\n /** Unquoted opaque content revision; distinct from a path delete head stamp. */\n etag: string\n version: string\n children?: PagedResult<FileEntry>\n}\n\nexport interface NodeFileOptions {\n branch: string\n}\n\nexport interface NodeFileContent {\n content: Blob\n /** Strong quoted ETag returned by the node-content API. */\n revision: string\n}\n\nexport interface WriteNodeFileOptions extends NodeFileOptions {\n content: Blob | string | ArrayBuffer\n /** Strong quoted revision, or the unquoted etag returned by getNode. */\n revision: string\n idempotencyKey: string\n}\n\nexport interface GetFileOptions {\n branch?: string\n pageNo?: number\n pageSize?: number\n orderBy?: string\n}\n\nexport interface WriteFileOptions {\n content: Blob | string | ArrayBuffer\n contentType?: string\n filename?: string\n branch?: string\n /** Atomically require no live file at this path; conflicts return HTTP 412. */\n createOnly?: boolean\n}\n\nexport interface MoveFileOptions {\n from: string\n to: string\n branch?: string\n}\n\nexport interface DeleteFileOptions {\n path: string\n branch?: string\n /** Path-binding head stamp, not a node-content revision. */\n headStamp?: string\n idempotencyKey?: string\n mode?: 'shallow' | 'deep'\n}\n\nexport type ArchiveFormat = 'zip' | 'tgz'\n\nexport interface ReadArchiveOptions {\n /** Archive format. Defaults to 'zip'. */\n format?: ArchiveFormat\n /** Target branch. Defaults to 'main'. */\n branch?: string\n}\n\nexport interface ExtractUploadOptions {\n /** Original filename of the archive (for format detection). */\n filename?: string\n /** Target branch. Defaults to 'main'. */\n branch?: string\n}\n\nexport interface InstalledPackagePayload {\n sourcePath: string\n destinationPath: string\n mode: string\n phase: number\n mimeType?: string | null\n}\n\nexport interface InstalledPackageDescriptor {\n packageIdentity: string\n publisher?: string | null\n name: string\n version: string\n kind: string\n manifestYaml: string\n installMode: string\n sealed: boolean\n mimeType: string\n payloads: InstalledPackagePayload[]\n}\n\n// ---------------------------------------------------------------------------\n// Installation API\n// ---------------------------------------------------------------------------\n\nexport type InstallationMode = 'Extracted' | 'Sealed'\n\n/** Required dependencies use immutable exact SemVer pins; optional packages are never implicit installs. */\nexport interface PackageDependency {\n package: string\n version: string\n installPath?: string | null\n optional?: boolean\n}\n\nexport interface InstallationGraphPackage {\n packageId: string\n packageVersionId: string\n publisherId: string\n identity: string\n publisher: string\n version: string\n treeDigest: string\n artifactFingerprint: string\n manifestYaml: string\n verifiedSigningKeyKid?: string | null\n branch: string\n installPath: string\n installMode: InstallationMode\n reuseInstallationId?: string | null\n /** Only a previously Failed exact target can be recovered, after a fresh explicit preview. */\n retryInstallationId?: string | null\n permissions: string[]\n dependencies: PackageDependency[]\n /** Conservative destination reservations, including external install-map/seed roots. */\n installPaths: string[]\n}\n\nexport interface InstallationGraphPreview {\n operationId: string\n workspaceId: string\n expiresAt: string\n fingerprint: string\n /** Topological installation order: required dependencies before their dependents. */\n packages: InstallationGraphPackage[]\n}\n\nexport type InstallationGraphOutcomeStatus =\n | 'Pending' | 'Installing' | 'Reused' | 'Installed' | 'InstalledWithError' | 'Failed' | 'NotAttempted'\n\nexport interface InstallationGraphResult {\n operationId: string\n status: 'Preview' | 'Accepted' | 'Completed' | 'Rejected' | 'Failed'\n succeeded: boolean\n /** The exact durable preview baseline, also available after a lost preview/install response. */\n packages: InstallationGraphPackage[]\n outcomes: {\n identity: string\n status: InstallationGraphOutcomeStatus\n installationId?: string | null\n error?: string | null\n }[]\n error?: string | null\n}\n\nexport interface PreviewInstallationOptions extends InstallationScopedOptions {\n packageVersion?: string\n installPath?: string\n branch?: string\n installMode?: InstallationMode\n}\n\nexport type InstallationStatus =\n | 'Pending'\n | 'Installing'\n | 'Installed'\n | 'Updating'\n | 'Uninstalling'\n | 'Failed'\n | 'Uninstalled'\n\nexport interface Installation {\n id: string\n accountId: string\n workspaceId: string\n packageId: string\n packageVersionId: string\n packageName: string\n publisherName: string\n version: string\n installPath: string\n branch: string\n installMode: InstallationMode\n status: InstallationStatus\n installedBy: string\n errorMessage?: string | null\n createdAt: string\n updatedAt?: string | null\n securityFlagged: boolean\n securityFlagReason?: string | null\n isSystem: boolean\n systemKey?: string | null\n protectionReason?: string | null\n}\n\nexport interface CatalogImage {\n assetId: string\n url: string\n alt: string\n caption?: string | null\n mediaType: string\n}\n\nexport interface InstallationDetail {\n installation: Installation\n installedVersionStatus: string\n installedReadmeMarkdown?: string | null\n installedChangelogMarkdown?: string | null\n installedDisplayName?: string | null\n installedDescription?: string | null\n installedLogoUrl?: string | null\n installedHeroUrl?: string | null\n installedImages: CatalogImage[]\n installedBadges: string[]\n installedIsDeprecated: boolean\n installedDeprecationMessage?: string | null\n installedIsMalicious: boolean\n installedIsDelisted: boolean\n publisherId: string\n publisherName: string\n publisherDisplayName: string\n publisherLogoUrl?: string | null\n publisherIsVerified: boolean\n publisherBadges: string[]\n publisherIsMalicious: boolean\n packageBadges: string[]\n packageIsMalicious: boolean\n packageIsDeprecated: boolean\n packageDeprecationMessage?: string | null\n latestVersion?: string | null\n latestVersionId?: string | null\n updateAvailable: boolean\n canUpdate: boolean\n canRetry: boolean\n canDelete: boolean\n allowedActions: string[]\n}\n\nexport interface InstallationLifecycleResult {\n installationId: string\n status: InstallationStatus\n succeeded: boolean\n error?: string | null\n}\n\nexport interface InstallationScopedOptions {\n workspaceId?: string\n}\n\nexport interface InstallationListOptions extends InstallationScopedOptions {\n pageNo?: number\n pageSize?: number\n orderBy?: string\n packageId?: string\n branch?: string\n installPath?: string\n status?: InstallationStatus\n isSystem?: boolean\n}\n\nexport interface ResolveInstallationOptions extends InstallationScopedOptions {\n branch?: string\n}\n\nexport interface UpdateInstallationOptions extends InstallationScopedOptions {\n packageVersion?: string\n installMode?: InstallationMode\n}\n\n// ---------------------------------------------------------------------------\n// Auth Strategy (internal)\n// ---------------------------------------------------------------------------\n\nexport interface AuthStrategy {\n getAuthHeader(): Promise<string | null>\n destroy?(): void\n}\n\n// ---------------------------------------------------------------------------\n// Application Manifest\n// ---------------------------------------------------------------------------\n\nexport interface MimeTypeBinding {\n pattern: string\n mode: 'view' | 'edit'\n priority: number\n icon?: string\n}\n\nexport interface ApplicationFileType {\n pattern: string\n extensions: string[]\n priority: number\n icon?: string\n}\n\nexport interface ApplicationManifest {\n apiVersion: string\n kind: 'Application'\n metadata: ManifestMetadata\n spec: ApplicationSpec\n}\n\nexport interface ManifestMetadata {\n /** Package identity (`metadata.id`). */\n id: string\n /** Optional human-friendly label (`metadata.name`); displays fall back to {@link id}. */\n name?: string\n description?: string\n icon?: string\n version?: string\n author?: string\n labels?: Record<string, string>\n annotations?: Record<string, string>\n}\n\nexport type InstallMode = 'seed' | 'managed'\n\nexport interface InstallDirective {\n /** Source path/glob relative to the package payload root. Must match at least one file. */\n from: string\n /**\n * Destination workspace-absolute VFS path. A trailing `/` denotes a directory (the source's\n * basename / relative subpath is preserved beneath it); otherwise an exact file path.\n */\n to: string\n /**\n * `seed` = install once, never overwrite an existing/user-edited file (never removed on upgrade);\n * `managed` = app-owned, created and replaced on upgrade, removed on uninstall. Default `managed`.\n */\n mode?: InstallMode\n /** Optional explicit MIME for placed nodes; else inferred / resolved by json-schema. */\n mime?: string\n /** Optional sequential install phase; omitted directives remain in the legacy single phase. */\n phase?: number\n}\n\nexport interface ApplicationLaunchConfig {\n /**\n * Enables standalone launch from the workspace. Defaults to `false`.\n *\n * When enabled, the platform requires `entryPoint` or `spec.entry` to\n * resolve an iframe entry.\n */\n enabled?: boolean\n /**\n * Optional entry-point ID to use as the standalone home. When omitted, the\n * platform falls back to `spec.entry`.\n */\n entryPoint?: string\n /**\n * Whether users may pin the launch surface. Defaults to `false` and does not\n * pin it automatically.\n */\n pinnable?: boolean\n}\n\nexport interface ApplicationDisplayOptions {\n fullscreen?: boolean\n}\n\nexport interface ApplicationEntryPoint {\n id: string\n displayName?: string\n description?: string\n icon?: string\n route?: string\n /** Optional per-entry-point iframe URL override. */\n entry?: string\n /** Optional splash URL override. Relative values resolve against this entry point's iframe URL. */\n splash?: string\n order?: number\n mimeTypes?: MimeTypeBinding[]\n display?: ApplicationDisplayOptions\n}\n\nexport interface ApplicationSpec {\n dependencies?: PackageDependency[]\n /** Publisher-qualified required engine dependency for script-bearing packages. */\n engine?: string\n /** Optional iframe UI surface URL. Omit for a headless / file-collection app. */\n entry?: string\n /** Optional application splash URL. Relative values resolve against the selected iframe entry URL. */\n splash?: string\n /** Named iframe surfaces; `launch.entryPoint` references one of these ids. */\n entryPoints?: ApplicationEntryPoint[]\n scope?: string\n mimeTypes?: MimeTypeBinding[]\n fileTypes?: ApplicationFileType[]\n capabilities?: string[]\n permissions?: string[]\n sandbox?: SandboxOptions\n oauth?: OAuthConfig\n scopes?: string[]\n /** Declarative install map: where packaged files land in the workspace VFS. */\n install?: InstallDirective[]\n /** Where the app-record (manifest node) is anchored. Default `/applications/{id}`. */\n installRoot?: string\n /** Default display behavior inherited by entry points. */\n display?: ApplicationDisplayOptions\n /**\n * Opt-in standalone workspace launch configuration. The platform defaults\n * `enabled` and `pinnable` to `false` when omitted.\n */\n launch?: ApplicationLaunchConfig\n /**\n * Workspace settings and secrets this app requires. Declared settings are auto-registered\n * in the workspace settings store under `{metadata.id}.{key}` and surfaced in the\n * settings UI. Secret values never reach browser contexts.\n */\n settings?: SettingDeclaration[]\n}\n\n/** Data type of a declared setting value. */\nexport type SettingDeclarationType = 'string' | 'number' | 'boolean' | 'select' | 'file'\n\n/**\n * A workspace setting or secret an application/engine manifest requires. The platform\n * auto-creates a matching setting definition (namespaced `{metadata.id}.{key}`) so\n * workspace admins can provide the value; engines receive values at run time.\n */\nexport interface SettingDeclaration {\n /** Short key; stored namespaced as `{metadata.id}.{key}` in the settings store. */\n key: string\n /** Optional environment variable name injected into engine runs (e.g. `MY_API_KEY`). */\n env?: string\n /**\n * Secret values are server-only: delivered to Docker engine runs, never to browser\n * contexts (wasm runs, iframe apps). Defaults to `false`.\n */\n secret?: boolean\n /**\n * Required settings prompt during marketplace install and fail an execution fast when\n * no value is configured. Defaults to `false`.\n */\n required?: boolean\n displayName?: string\n description?: string\n /**\n * Value input type. `file` prompts the installer to select a local file and stores its\n * bytes as a base64 string. Defaults to `string`.\n */\n type?: SettingDeclarationType\n /** Default value. Not allowed for secrets. */\n default?: string | number | boolean\n /** Allowed values when `type` is `select`. */\n options?: string[]\n}\n\nexport interface OAuthConfig {\n clientType: string\n redirectUris?: string[]\n}\n\nexport interface SandboxOptions {\n allowScripts?: boolean\n allowSameOrigin?: boolean\n allowPopups?: boolean\n allowForms?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Execution API\n// ---------------------------------------------------------------------------\n\n/** Lifecycle status of an execution. Mirrors the platform `ExecutionStatus` enum. */\nexport type ExecutionStatus =\n | 'Pending'\n | 'Queued'\n | 'Running'\n | 'Completed'\n | 'Failed'\n | 'Cancelled'\n | 'TimedOut'\n | 'AwaitingClient'\n\n/** How an execution is run. Mirrors the platform `ExecutionMode` enum. */\nexport type ExecutionMode = 'RequestResponse' | 'LongRunning' | 'Scheduled' | 'EventDriven'\n\n/** What triggered an execution. Mirrors the platform `ExecutionTrigger` enum. */\nexport type ExecutionTrigger = 'User' | 'Api' | 'Schedule' | 'Event'\n\n/** The structured outcome of an execution. */\nexport interface ExecutionResult {\n exitCode: number\n stdout?: string | null\n stderr?: string | null\n /** Raw JSON payload the engine reported in `result.json`, as a string. */\n data?: string | null\n artifacts: string[]\n durationMs: number\n error?: string | null\n}\n\n/** A single execution record. */\nexport interface Execution {\n id: string\n workspaceId: string\n engineId: string\n engineName: string\n filePath?: string | null\n mode: ExecutionMode\n trigger: ExecutionTrigger\n tool?: string | null\n status: ExecutionStatus\n requestedAt: string\n startedAt?: string | null\n completedAt?: string | null\n result?: ExecutionResult | null\n}\n\n/** Captured stdout/stderr of an execution. */\nexport interface ExecutionLogs {\n stdout?: string | null\n stderr?: string | null\n}\n\n/** Options for running a file (engine resolved by the file's type). */\nexport interface RunFileOptions {\n /** Workspace to run in. Defaults to the client's workspace. */\n workspaceId?: string\n branch?: string\n tool?: string\n mode?: string\n arguments?: string[]\n /** Structured parameters passed to the engine; serialized to JSON for the platform. */\n parameters?: Record<string, unknown>\n /** Idempotency key: requests with the same key from the same caller resolve to one execution. */\n invocationKey?: string\n}\n\n/** Value type of a declared script argument. */\nexport type ScriptArgumentType = 'string' | 'integer' | 'number' | 'boolean' | 'date'\n\n/** One declared script argument (an option such as `--customer-id`, or a positional). */\nexport interface ScriptArgumentDefinition {\n /** Canonical name, e.g. `customer-id`. Structured parameters with this key become the option. */\n name: string\n kind: 'option' | 'positional'\n /** Option flags, e.g. `[\"--customer-id\", \"-c\"]`. */\n flags?: string[]\n type: ScriptArgumentType\n required: boolean\n repeatable: boolean\n default?: unknown\n choices?: Array<string | number>\n minimum?: number\n maximum?: number\n help?: string\n label?: string\n metavar?: string\n /** Option may appear without a value. */\n valueOptional?: boolean\n /** Flag that sets a boolean option to false, e.g. `--no-cache`. */\n negation?: string\n /** Value a boolean flag stores when present. */\n presentValue?: boolean\n}\n\n/**\n * A script's exported argument declaration (`<script>.arguments.json`, schema\n * `verentis.io/script-arguments/v1`). The platform validates runs against it and the workspace prompts\n * for missing required arguments.\n */\nexport interface ScriptArgumentDescriptor {\n schema: 'verentis.io/script-arguments/v1'\n script?: string\n /** SHA-256 of the script the descriptor was exported from. */\n sourceSha256?: string\n description?: string\n /** `options`: structured parameters named like an option are passed as that option. */\n parameters?: 'options'\n /** A parameter that selects a sibling script with its own descriptor. */\n variants?: { parameter: string; scripts: Record<string, string> }\n arguments: ScriptArgumentDefinition[]\n exclusiveGroups?: Array<{ required: boolean; arguments: string[] }>\n}\n\n/** Options for reading a script's argument declaration. */\nexport interface ScriptArgumentsOptions {\n branch?: string\n}\n\n/** Options for executing a specific engine (optionally against a file). */\nexport interface ExecuteEngineOptions {\n workspaceId?: string\n filePath?: string\n branch?: string\n tool?: string\n mode?: string\n arguments?: string[]\n parameters?: Record<string, unknown>\n}\n\n/** Options that only need to scope a request to a workspace. */\nexport interface ExecutionScopedOptions {\n workspaceId?: string\n}\n\nexport interface ExecutionListOptions extends ExecutionScopedOptions {\n filePath?: string\n engineIds?: string[]\n filePaths?: string[]\n status?: ExecutionStatus\n trigger?: ExecutionTrigger\n activeOnly?: boolean\n requestedAfter?: string\n requestedBefore?: string\n pageNo?: number\n pageSize?: number\n orderBy?: string\n}\n\nexport interface PagedResult<T> {\n totalCount: number\n pageCount: number\n pageSize: number\n pageNumber: number\n data: T[]\n}\n\nexport interface EngineRuntime {\n kind: 'Docker' | 'Wasm'\n image?: string | null\n pullPolicy?: string | null\n moduleUrl?: string | null\n runtimeHint?: string | null\n serverCompatible: boolean\n clientCompatible: boolean\n adapterUrl?: string | null\n}\n\nexport interface EngineFileType {\n pattern: string\n extensions: string[]\n priority: number\n icon?: string\n}\n\nexport interface EngineTool {\n name: string\n description?: string | null\n inputSchema?: string | null\n outputSchema?: string | null\n}\n\nexport interface ExecutionEngine {\n id: string\n workspaceId: string\n name: string\n displayName: string\n description?: string | null\n icon?: string | null\n version: string\n author?: string | null\n category?: string | null\n tier?: string | null\n sourcePath: string\n priority: number\n enabled: boolean\n capabilities: string[]\n permissions: string[]\n supportedModes: string[]\n runtimes: EngineRuntime[]\n fileTypes: EngineFileType[]\n tools: EngineTool[]\n resources?: {\n cpu?: string | null\n memory?: string | null\n timeoutSeconds: number\n maxConcurrent: number\n storage?: string | null\n } | null\n sandbox?: {\n network: string\n allowedHosts: string[]\n readOnlyRoot: boolean\n noNewPrivileges: boolean\n } | null\n firstParty: boolean\n}\n\nexport interface ExecutionEngineListOptions extends ExecutionScopedOptions {\n pageNo?: number\n pageSize?: number\n orderBy?: string\n}\n\n/** Options for polling an execution to completion. */\nexport interface WaitOptions extends ExecutionScopedOptions {\n /** Poll interval in milliseconds (default 1000). */\n intervalMs?: number\n /** Maximum time to wait in milliseconds before throwing. */\n timeoutMs?: number\n /** Abort signal to cancel waiting. */\n signal?: AbortSignal\n}\n\n// ---------------------------------------------------------------------------\n// Settings API\n// ---------------------------------------------------------------------------\n\n/** An allowed value for a `select` setting. */\nexport interface SettingOption {\n value: string\n label: string\n}\n\n/**\n * A single workspace setting merged from its definition and any stored value.\n * Secret values are always `null` for browser callers; `hasValue` still reports\n * whether a value (or default) is configured.\n */\nexport interface SettingItem {\n key: string\n group: string\n label: string\n description?: string | null\n dataType: string\n isSecret: boolean\n options?: SettingOption[] | null\n defaultValue?: unknown\n value?: unknown\n hasValue: boolean\n}\n\n/** A labeled group of settings (e.g. one group per application). */\nexport interface SettingGroup {\n key: string\n label: string\n items: SettingItem[]\n}\n\n/** Options that scope a settings request to a workspace. */\nexport interface SettingsScopedOptions {\n workspaceId?: string\n}\n\n/** Presence-only result. Stored secret and non-secret values are never included. */\nexport interface SettingPresence {\n key: string\n hasStoredValue: boolean\n hasEffectiveValue: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Resource API\n// ---------------------------------------------------------------------------\n\nexport interface ResourceMimeTypeBinding {\n id: string\n pattern: string\n mode: string\n priority: number\n}\n\nexport interface ResourceRegistration {\n id: string\n accountId: string\n workspaceId: string\n name: string\n displayName?: string | null\n description?: string | null\n icon?: string | null\n version?: string | null\n author?: string | null\n entryUrl?: string | null\n kind: string\n scope: string\n manifestPath: string\n manifestNodeId: string\n manifestHash: string\n branch: string\n spec?: string | null\n labels?: string | null\n capabilities?: string | null\n permissions?: string | null\n sandboxConfig?: string | null\n createdAt: string\n updatedAt?: string | null\n mimeTypeBindings: ResourceMimeTypeBinding[]\n entryPointId?: string | null\n entryPointDisplayName?: string | null\n entryPointDescription?: string | null\n entryPointIcon?: string | null\n entryPointRoute?: string | null\n entryPointEntryUrl?: string | null\n entryPointMode?: string | null\n entryPointMatchedPattern?: string | null\n entryPointPriority?: number | null\n entryPointFullscreen?: boolean | null\n entryPointSplashUrl?: string | null\n launchEnabled: boolean\n launchEntryPointId?: string | null\n launchPinnable: boolean\n}\n\nexport interface ResourceScopedOptions {\n workspaceId?: string\n}\n\n// ---------------------------------------------------------------------------\n// HTTP Transport Types (internal)\n// ---------------------------------------------------------------------------\n\nexport interface RequestOptions {\n headers?: Record<string, string>\n body?: BodyInit | null\n params?: Record<string, string | number | boolean | readonly (string | number)[] | undefined>\n}\n\nexport class ApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly detail: string,\n public readonly title?: string,\n public readonly code?: string,\n public readonly retryAfterMs?: number,\n ) {\n super(title ?? `API error ${status}: ${detail}`)\n this.name = 'ApiError'\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport { ApiError } from '../types'\nimport type {\n NotificationRequestOptions,\n NotificationRequestStatus,\n NotificationSendOptions,\n} from '../types/notifications'\n\n/** Send app notifications through the installed package's registered catalogue. */\nexport class NotificationsModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly workspaceId?: string,\n ) {}\n\n async send(options: NotificationSendOptions): Promise<NotificationRequestStatus> {\n const request = {\n body: JSON.stringify({\n workspaceId: this.requireWorkspaceId(options.workspaceId),\n installationId: options.installationId,\n typeKey: options.typeKey,\n idempotencyKey: options.idempotencyKey,\n userIds: options.userIds,\n audienceScope: options.audienceScope,\n emailAddresses: options.emailAddresses,\n parameters: options.parameters,\n }),\n headers: { 'Content-Type': 'application/json' },\n }\n const deadline = Date.now() + 10_000\n for (;;) {\n try {\n return await this.http.request<NotificationRequestStatus>('POST', '/notifications/send', request)\n } catch (error) {\n if (!(error instanceof ApiError) || error.status !== 409 || error.code !== 'execution_not_ready') {\n throw error\n }\n const delay = Math.max(250, error.retryAfterMs ?? 1000)\n if (Date.now() + delay > deadline) throw error\n await new Promise(resolve => setTimeout(resolve, delay))\n }\n }\n }\n\n async request(id: string, options?: NotificationRequestOptions): Promise<NotificationRequestStatus> {\n return this.http.request<NotificationRequestStatus>(\n 'GET',\n `/notifications/requests/${encodeURIComponent(id)}`,\n {\n params: {\n workspaceId: this.requireWorkspaceId(options?.workspaceId),\n installationId: options?.installationId,\n },\n },\n )\n }\n\n private requireWorkspaceId(override?: string): string {\n const workspaceId = override ?? this.workspaceId\n if (!workspaceId) {\n throw new Error('workspaceId is required: provide it in options or when creating the client')\n }\n return workspaceId\n }\n}\n","import type { HttpTransport } from '../transport/http.transport'\nimport type {\n BusinessCommand, BusinessCommitResult, BusinessContext, BusinessOutcomeRequest,\n BusinessReport, BusinessReportName, BusinessSnapshot,\n} from '../types/business'\n\n/**\n * Trusted workspace business records, independent of app scripts or generic file writes.\n * Never automatically retries a command: resolve a lost response with outcome() or\n * resubmit the exact same command/key to obtain the original durable result.\n */\nexport class BusinessModule {\n constructor(private readonly http: HttpTransport, private readonly branch = 'main') {}\n\n withBranch(branch: string): BusinessModule {\n return new BusinessModule(this.http, branch)\n }\n\n async context(): Promise<BusinessContext> {\n return this.http.request('GET', '/business/context', { headers: this.headers() })\n }\n\n async command(command: BusinessCommand): Promise<BusinessCommitResult> {\n if (!command.idempotencyKey?.trim() || command.idempotencyKey.length > 200 || /[\\u0000-\\u001f\\u007f-\\u009f]/.test(command.idempotencyKey)) {\n throw new Error('A bounded printable idempotency key is required')\n }\n if (command.expectedRevision !== undefined && !/^\"[a-f0-9]{32}\"$/.test(command.expectedRevision)) {\n throw new Error('An exact strong quoted canonical revision is required')\n }\n return this.http.request('POST', '/business/commands', {\n headers: this.headers(), body: JSON.stringify(command),\n })\n }\n\n async read(id: string): Promise<BusinessSnapshot | null> {\n return this.http.request('GET', `/business/records/${encodeURIComponent(id)}`, { headers: this.headers() })\n }\n\n async list(kind?: string): Promise<BusinessSnapshot[]> {\n return this.http.request('GET', '/business/records', {\n headers: this.headers(), params: kind ? { kind } : {},\n })\n }\n\n /** null means unresolved, not success; do not invent a new operation key. */\n async outcome(request: BusinessOutcomeRequest): Promise<BusinessCommitResult | null> {\n return this.http.request('POST', '/business/outcomes', {\n headers: this.headers(), body: JSON.stringify(request),\n })\n }\n\n /** Recover using the exact original command, without reproducing server fingerprint encoding. */\n async outcomeFor(command: BusinessCommand): Promise<BusinessCommitResult | null> {\n return this.outcome({ operation: command.operation, idempotencyKey: command.idempotencyKey, command })\n }\n\n async report(report: BusinessReportName, range: { from?: string; to?: string } = {}): Promise<BusinessReport> {\n return this.http.request('GET', `/business/reports/${report}`, {\n headers: this.headers(), params: range,\n })\n }\n\n /** Retained historical expense receipt bytes, even after the original native file is removed. */\n async receipt(nodeId: string, revision: string): Promise<Blob> {\n const response = await this.http.requestRaw('GET', `/business/receipts/${encodeURIComponent(nodeId)}/content`, {\n headers: this.headers(), params: { revision },\n })\n await this.http.ensureSuccess(response)\n return response.blob()\n }\n\n private headers(): Record<string, string> {\n if (!this.branch || this.branch.length > 128 || this.branch !== this.branch.trim().toLowerCase() || /[\\u0000-\\u001f\\u007f-\\u009f]/.test(this.branch)) {\n throw new Error('Business operations require a canonical branch')\n }\n return { 'X-Branch': this.branch, 'Content-Type': 'application/json' }\n }\n}\n","import type { ExecutionsModule } from './executions'\nimport type { Bridge } from '../transport/bridge.transport'\nimport type { HttpTransport } from '../transport/http.transport'\nimport { ApiError, type Execution } from '../types'\nimport type {\n BotPostOptions,\n ChatBot,\n ChatCommand,\n ChatCommandInvocation,\n ChatMessage,\n ChatPage,\n ChatParticipant,\n ChatPerson,\n ChatSubscriptionHandlers,\n Conversation,\n ConversationPreferences,\n ConversationSummary,\n CreateConversationOptions,\n EventPage,\n Member,\n MemberRole,\n MessagePage,\n MessagePartInput,\n PublicChannel,\n ReadState,\n SendMessageOptions,\n AttentionLevel,\n} from '../types/chat'\n\nconst JSON_HEADERS = { 'Content-Type': 'application/json' }\n\n/**\n * Workspace chat (`/v1/chat`). Framework independent; the workspace and caller come from the token. In an installed\n * app, {@link subscribeChanges} relays identifier-only live hints over the host's existing realtime connection\n * (requires the approved `chat.read` permission); hints are best effort, so reconcile with {@link events} after\n * reconnecting and on resume.\n */\nexport class ChatModule {\n constructor(\n private readonly http: HttpTransport,\n private readonly bridge: Bridge | null = null,\n private readonly executions?: ExecutionsModule,\n ) {}\n\n // ── Conversations ─────────────────────────────────────────────────\n\n listConversations(options?: { cursor?: string; limit?: number }): Promise<ChatPage<ConversationSummary>> {\n return this.http.request('GET', '/chat/conversations', { params: page(options) })\n }\n\n createConversation(options: CreateConversationOptions): Promise<Conversation> {\n const { idempotencyKey, ...body } = options\n return this.http.request('POST', '/chat/conversations', { body: JSON.stringify(body), headers: headers(idempotencyKey) })\n }\n\n /** Opens (or returns the existing) direct conversation with one participant. */\n openDirect(participant: ChatParticipant): Promise<Conversation> {\n return this.createConversation({ kind: 'direct', participants: [participant] })\n }\n\n getConversation(conversationId: string): Promise<Conversation> {\n return this.http.request('GET', `/chat/conversations/${id(conversationId)}`)\n }\n\n updateConversation(conversationId: string, changes: { title?: string; topic?: string; archived?: boolean }): Promise<Conversation> {\n return this.http.request('PATCH', `/chat/conversations/${id(conversationId)}`, { body: JSON.stringify(changes), headers: JSON_HEADERS })\n }\n\n join(conversationId: string): Promise<Conversation> {\n return this.http.request('POST', `/chat/conversations/${id(conversationId)}/join`, { body: '{}', headers: JSON_HEADERS })\n }\n\n listPublicChannels(options?: { query?: string; cursor?: string; limit?: number }): Promise<ChatPage<PublicChannel>> {\n return this.http.request('GET', '/chat/channels', { params: { ...page(options), query: options?.query } })\n }\n\n // ── Members ───────────────────────────────────────────────────────\n\n listMembers(conversationId: string): Promise<ChatPage<Member>> {\n return this.http.request('GET', `/chat/conversations/${id(conversationId)}/members`)\n }\n\n addMembers(conversationId: string, participants: ChatParticipant[], role?: 'member' | 'admin'): Promise<Conversation> {\n return this.http.request('POST', `/chat/conversations/${id(conversationId)}/members`, {\n body: JSON.stringify({ participants, role }),\n headers: JSON_HEADERS,\n })\n }\n\n /** Removes a member; pass yourself to leave. */\n async removeMember(conversationId: string, participant: ChatParticipant): Promise<void> {\n await this.http.request('DELETE', `/chat/conversations/${id(conversationId)}/members/${participant.kind}/${id(participant.id)}`)\n }\n\n changeRole(conversationId: string, participant: ChatParticipant, role: MemberRole): Promise<ChatPage<Member>> {\n return this.http.request('PUT', `/chat/conversations/${id(conversationId)}/members/${participant.kind}/${id(participant.id)}/role`, {\n body: JSON.stringify({ role }),\n headers: JSON_HEADERS,\n })\n }\n\n // ── Messages ──────────────────────────────────────────────────────\n\n listMessages(conversationId: string, options?: { before?: string; limit?: number }): Promise<MessagePage> {\n return this.http.request('GET', `/chat/conversations/${id(conversationId)}/messages`, {\n params: { before: options?.before, limit: options?.limit },\n })\n }\n\n getMessage(conversationId: string, messageId: string): Promise<ChatMessage> {\n return this.http.request('GET', `/chat/conversations/${id(conversationId)}/messages/${id(messageId)}`)\n }\n\n send(conversationId: string, parts: MessagePartInput[], options?: SendMessageOptions): Promise<ChatMessage> {\n return this.http.request('POST', `/chat/conversations/${id(conversationId)}/messages`, {\n body: JSON.stringify({ parts, replyTo: options?.replyTo }),\n headers: headers(options?.idempotencyKey),\n })\n }\n\n /** Sends Markdown text (rendered without raw HTML by every reader). */\n sendText(conversationId: string, markdown: string, options?: SendMessageOptions): Promise<ChatMessage> {\n return this.send(conversationId, [{ type: 'text', data: { markdown } }], options)\n }\n\n /** Edits your own message; pass the revision you saw to reject a concurrent edit. */\n edit(conversationId: string, messageId: string, parts: MessagePartInput[], options?: { revision?: number }): Promise<ChatMessage> {\n return this.http.request('PATCH', `/chat/conversations/${id(conversationId)}/messages/${id(messageId)}`, {\n body: JSON.stringify({ parts }),\n headers: { ...JSON_HEADERS, ...(options?.revision ? { 'If-Match': `\"${options.revision}\"` } : {}) },\n })\n }\n\n delete(conversationId: string, messageId: string): Promise<ChatMessage> {\n return this.http.request('DELETE', `/chat/conversations/${id(conversationId)}/messages/${id(messageId)}`)\n }\n\n /**\n * Durable changes after a position: `afterSeq` is a snapshot's `highWatermark` (or the last sequence you applied);\n * `after` is the `next` cursor of a previous page.\n */\n events(conversationId: string, options?: { after?: string; afterSeq?: number; limit?: number }): Promise<EventPage> {\n return this.http.request('GET', `/chat/conversations/${id(conversationId)}/events`, {\n params: { after: options?.after, afterSeq: options?.afterSeq, limit: options?.limit },\n })\n }\n\n // ── Read state and preferences ────────────────────────────────────\n\n /** Marks messages read through a sequence; never moves back and never past what the server has. */\n markRead(conversationId: string, readThroughSeq: number): Promise<ReadState> {\n return this.http.request('PUT', `/chat/conversations/${id(conversationId)}/read-state`, {\n body: JSON.stringify({ readThroughSeq }),\n headers: JSON_HEADERS,\n })\n }\n\n setPreferences(conversationId: string, preferences: { muted?: boolean; attention?: AttentionLevel }): Promise<ConversationPreferences> {\n return this.http.request('PUT', `/chat/conversations/${id(conversationId)}/preferences`, {\n body: JSON.stringify(preferences),\n headers: JSON_HEADERS,\n })\n }\n\n // ── People, bots and commands ─────────────────────────────────────\n\n /** People in your workspace (name and avatar only). */\n searchPeople(options?: { query?: string; cursor?: string; limit?: number }): Promise<ChatPage<ChatPerson>> {\n return this.http.request('GET', '/chat/people', { params: { ...page(options), query: options?.query } })\n }\n\n listBots(): Promise<ChatPage<ChatBot>> {\n return this.http.request('GET', '/chat/bots')\n }\n\n /** Workspace managers (`chat.manage`) decide whether a bot may message people directly. */\n updateBotSettings(botId: string, settings: { directMessages: 'none' | 'workspace' }): Promise<ChatBot> {\n return this.http.request('PUT', `/chat/bots/${id(botId)}/settings`, { body: JSON.stringify(settings), headers: JSON_HEADERS })\n }\n\n listCommands(): Promise<ChatPage<ChatCommand>> {\n return this.http.request('GET', '/chat/commands')\n }\n\n /** Validates and records a command invocation, returning the Execution request to run as you. */\n invokeCommand(\n conversationId: string,\n command: string,\n args?: Record<string, unknown>,\n options?: { idempotencyKey?: string },\n ): Promise<ChatCommandInvocation> {\n return this.http.request('POST', `/chat/conversations/${id(conversationId)}/commands`, {\n body: JSON.stringify({ command, arguments: args ?? {} }),\n headers: headers(options?.idempotencyKey),\n })\n }\n\n /**\n * Invokes an installed app's command and runs its script with your own authorisation. Retrying with the same\n * idempotency key reuses the invocation key, so Execution never runs it twice.\n */\n async runCommand(\n conversationId: string,\n command: string,\n args?: Record<string, unknown>,\n options?: { idempotencyKey?: string },\n ): Promise<{ invocation: ChatCommandInvocation; execution: Execution }> {\n if (!this.executions) throw new Error('Running commands needs the executions module.')\n const invocation = await this.invokeCommand(conversationId, command, args, options)\n const execution = await this.executions.run(invocation.filePath, {\n workspaceId: invocation.workspaceId,\n branch: invocation.branch,\n parameters: JSON.parse(invocation.parameters) as Record<string, unknown>,\n invocationKey: invocation.invocationKey,\n })\n return { invocation, execution }\n }\n\n /**\n * Posts as the installed app's bot from a running script. The bot is derived from the script's execution; the\n * conversation must have added the bot (or, for `userId`, the workspace must allow it to message people).\n * Retries briefly while Execution's start event is still on its way.\n */\n async postAsBot(options: BotPostOptions): Promise<{ conversationId: string; message: ChatMessage }> {\n const { idempotencyKey, ...body } = options\n const request = { body: JSON.stringify(body), headers: headers(idempotencyKey ?? globalThis.crypto?.randomUUID?.()) }\n const deadline = Date.now() + 10_000\n for (;;) {\n try {\n return await this.http.request('POST', '/chat/bot-messages', request)\n } catch (error) {\n if (!(error instanceof ApiError) || error.status !== 409 || error.code !== 'execution_not_ready') throw error\n const delay = Math.max(250, error.retryAfterMs ?? 1000)\n if (Date.now() + delay > deadline) throw error\n await new Promise(resolve => setTimeout(resolve, delay))\n }\n }\n }\n\n // ── Live hints ────────────────────────────────────────────────────\n\n /**\n * Subscribes to live change hints through the host (installed apps only). Returns an unsubscribe function.\n * Hints carry ids only; duplicates and reordering are normal, and hints are lost while disconnected.\n */\n subscribeChanges(handlers: ChatSubscriptionHandlers): () => void {\n if (!this.bridge) throw new Error('Live chat hints are only available to apps running inside the workspace.')\n return this.bridge.subscribeChat(handlers)\n }\n}\n\nfunction id(value: string): string {\n return encodeURIComponent(value)\n}\n\nfunction page(options?: { cursor?: string; limit?: number }): Record<string, string | number | undefined> {\n return { cursor: options?.cursor, limit: options?.limit }\n}\n\nfunction headers(idempotencyKey?: string): Record<string, string> {\n return idempotencyKey ? { ...JSON_HEADERS, 'Idempotency-Key': idempotencyKey } : JSON_HEADERS\n}\n","/**\n * Page commands an app exports to the workspace command registry (⌘K palette) while they are active.\n *\n * Unlike header actions, page commands have no placement and no count limit: an app with 100 actionable\n * buttons registers all 100. Only display metadata crosses the bridge — never form data or handler code.\n * Registration changes are sent incrementally (`upsert` / `remove`) in batches of at most\n * {@link APP_COMMAND_BATCH_SIZE} entries per message, so large pages do not resend full snapshots.\n */\nexport interface AppCommand {\n /** Stable identifier, unique within the app session. */\n id: string\n label: string\n description?: string\n /** Palette group heading; the host defaults to the current page. */\n group?: string\n /** `lucide:<name>` icon. */\n icon?: string\n /** Extra search terms. */\n keywords?: string[]\n variant?: 'default' | 'outline' | 'destructive'\n enabled?: boolean\n busy?: boolean\n disabledReason?: string\n}\n\nexport type AppCommandHandler = () => void | Promise<void>\n\nexport interface AppCommandRegistration {\n update(command: AppCommand): void\n dispose(): void\n}\n\n/** Maximum entries (upserts + removals) in one `verentis:commands:update` message. Not a command-count cap. */\nexport const APP_COMMAND_BATCH_SIZE = 200\n\n/** Host capability announced in `verentis:init` when it accepts page commands. */\nexport const APP_COMMANDS_CAPABILITY = 'commands'\n\nexport const APP_COMMAND_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:/#@-]{0,255}$/\n\nexport function isAppCommand(value: unknown): value is AppCommand {\n if (!value || typeof value !== 'object') return false\n const c = value as Record<string, unknown>\n const optionalText = (key: string, max: number) =>\n c[key] === undefined || (typeof c[key] === 'string' && (c[key] as string).length <= max)\n return typeof c.id === 'string' && APP_COMMAND_ID_PATTERN.test(c.id)\n && typeof c.label === 'string' && c.label.trim().length > 0 && c.label.length <= 200\n && optionalText('description', 500)\n && optionalText('group', 100)\n && optionalText('disabledReason', 200)\n && (c.icon === undefined || (typeof c.icon === 'string' && /^lucide:[a-z0-9-]{1,64}$/.test(c.icon)))\n && (c.keywords === undefined || (Array.isArray(c.keywords) && c.keywords.length <= 16\n && c.keywords.every(k => typeof k === 'string' && k.length <= 64)))\n && (c.variant === undefined || ['default', 'outline', 'destructive'].includes(String(c.variant)))\n && ['enabled', 'busy'].every(key => c[key] === undefined || typeof c[key] === 'boolean')\n}\n","export interface HeaderAction {\n id: string\n label: string\n icon?: string\n variant?: 'default' | 'outline' | 'destructive'\n /** Empty for client-only actions; otherwise a subset of the delegated token scopes. */\n scopes: string[]\n enabled?: boolean\n visible?: boolean\n busy?: boolean\n disabledReason?: string\n /** Clipboard actions return text for the host to copy during its user gesture. */\n kind?: 'clipboard'\n}\n\nexport interface HeaderActionResult {\n clipboardText?: string\n navigate?: { path: string; newTab?: boolean }\n}\n\nexport interface HeaderActionRegistration {\n update(action: HeaderAction): void\n dispose(): void\n}\n\nexport type HeaderActionHandler = () => void | HeaderActionResult | Promise<void | HeaderActionResult>\n\nexport function isHeaderAction(value: unknown): value is HeaderAction {\n if (!value || typeof value !== 'object') return false\n const a = value as Record<string, unknown>\n return typeof a.id === 'string' && /^[a-z][a-z0-9.-]{0,63}$/.test(a.id)\n && typeof a.label === 'string' && a.label.trim().length > 0 && a.label.length <= 100\n && Array.isArray(a.scopes) && a.scopes.length <= 32\n && a.scopes.every(s => typeof s === 'string' && /^[a-zA-Z0-9._:-]{1,128}$/.test(s))\n && (a.icon === undefined || (typeof a.icon === 'string' && /^lucide:[a-z0-9-]{1,64}$/.test(a.icon)))\n && (a.variant === undefined || ['default', 'outline', 'destructive'].includes(String(a.variant)))\n && ['enabled', 'visible', 'busy'].every(key => a[key] === undefined || typeof a[key] === 'boolean')\n && (a.disabledReason === undefined || (typeof a.disabledReason === 'string' && a.disabledReason.length <= 200))\n && (a.kind === undefined || a.kind === 'clipboard')\n}\n","import type { Bridge } from '../transport/bridge.transport'\n\nexport interface NativeElement {\n id: string\n version: number\n versionNonce?: number\n isDeleted?: boolean\n [key: string]: unknown\n}\n\nexport interface NativeFile {\n id: string\n dataURL: string\n mimeType: string\n created: number\n lastRetrieved?: number\n}\n\nexport interface NativeScene {\n elements: NativeElement[]\n files: Record<string, NativeFile>\n appState: Record<string, unknown>\n}\n\nexport interface NativePointer {\n x: number\n y: number\n}\n\nexport interface NativeParticipant {\n id: string\n name: string\n readOnly: boolean\n pointer: NativePointer | null\n /** `agent` marks an agent acting on behalf of a user (same principal, separate connection). */\n kind?: 'user' | 'agent'\n}\n\nexport interface NativeSnapshot {\n sequence: number\n savedSequence: number\n revision: string\n readOnly: boolean\n scene: NativeScene\n participants: NativeParticipant[]\n}\n\nexport interface NativeSaveReceipt {\n generation: number\n correlation: string\n revision: string\n}\n\nexport interface NativeSaveResult extends NativeSnapshot {\n receipt: NativeSaveReceipt\n}\n\nexport interface NativeChangeSet {\n operationId: string\n changes: Array<{ id: string; expectedVersion: number | null; element: NativeElement | null }>\n files?: Record<string, NativeFile>\n appState?: Record<string, unknown>\n appStateExpectedSequence?: number\n}\n\nexport type NativeCollaborationCommand =\n | { operation: 'join' | 'snapshot' | 'close' }\n | { operation: 'apply'; changes: NativeChangeSet }\n | { operation: 'presence'; pointer: NativePointer | null }\n | { operation: 'save'; generation: number; correlation: string }\n\nexport interface NativeCollaborationRequest {\n type: 'verentis:collaboration:request'\n version: 1\n sessionId: string\n requestId: string\n command: NativeCollaborationCommand\n}\n\nexport interface NativeCollaborationResponse {\n type: 'verentis:collaboration:response'\n version: 1\n sessionId: string\n requestId: string\n result?: NativeSnapshot | NativeSaveResult | null\n error?: string\n code?: string\n}\n\nexport class NativeCollaborationError extends Error {\n constructor(message: string, readonly code: string) {\n super(message)\n this.name = 'NativeCollaborationError'\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction natural(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0\n}\n\nfunction identifier(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0 && value.length <= 256\n}\n\nfunction pointer(value: unknown): value is NativePointer {\n return record(value) && typeof value.x === 'number' && Number.isFinite(value.x)\n && typeof value.y === 'number' && Number.isFinite(value.y)\n}\n\nfunction element(value: unknown): value is NativeElement {\n return record(value) && identifier(value.id) && natural(value.version)\n && (value.versionNonce === undefined || natural(value.versionNonce))\n && (value.isDeleted === undefined || typeof value.isDeleted === 'boolean')\n}\n\nfunction files(value: unknown): value is Record<string, NativeFile> {\n return record(value) && Object.keys(value).length <= 10_000\n && Object.entries(value).every(([id, file]) => record(file) && identifier(id) && file.id === id\n && typeof file.dataURL === 'string' && file.dataURL.length <= 10 * 1024 * 1024\n && typeof file.mimeType === 'string' && file.mimeType.length > 0 && file.mimeType.length <= 128\n && natural(file.created) && (file.lastRetrieved === undefined || natural(file.lastRetrieved)))\n}\n\nexport function isNativeSnapshot(value: unknown): value is NativeSnapshot {\n if (!record(value) || !natural(value.sequence) || !natural(value.savedSequence)\n || value.savedSequence > value.sequence\n || typeof value.revision !== 'string' || !value.revision || value.revision.length > 1024\n || typeof value.readOnly !== 'boolean' || !record(value.scene)\n || !Array.isArray(value.scene.elements) || value.scene.elements.length > 10_000\n || !value.scene.elements.every(element) || !files(value.scene.files) || !record(value.scene.appState)\n || !Array.isArray(value.participants) || value.participants.length > 20)\n return false\n const ids = value.scene.elements.map(item => item.id)\n if (new Set(ids).size !== ids.length) return false\n const connectionIds = value.participants.map(item => record(item) ? item.id : undefined)\n if (new Set(connectionIds).size !== connectionIds.length) return false\n return value.participants.every(item => record(item) && identifier(item.id)\n && typeof item.name === 'string' && item.name.length <= 1024 && typeof item.readOnly === 'boolean'\n && (item.pointer === null || pointer(item.pointer))\n && (item.kind === undefined || item.kind === 'user' || item.kind === 'agent'))\n}\n\nexport function isNativeSaveResult(value: unknown): value is NativeSaveResult {\n return isNativeSnapshot(value) && record(value) && record(value.receipt)\n && natural(value.receipt.generation) && identifier(value.receipt.correlation)\n && typeof value.receipt.revision === 'string' && value.receipt.revision.length > 0\n && value.receipt.revision.length <= 1024\n}\n\nexport function validateNativeCommand(command: NativeCollaborationCommand): void {\n if (!record(command)) throw new Error('Invalid collaboration command.')\n switch (command.operation) {\n case 'join':\n case 'snapshot':\n case 'close':\n break\n case 'presence':\n if (command.pointer !== null && !pointer(command.pointer))\n throw new Error('Invalid collaboration pointer.')\n break\n case 'save':\n if (!natural(command.generation) || !identifier(command.correlation))\n throw new Error('Invalid collaboration save frontier.')\n break\n case 'apply': {\n const changes = command.changes\n if (!record(changes) || !identifier(changes.operationId) || !Array.isArray(changes.changes)\n || changes.changes.length > 10_000\n || !changes.changes.every(change => record(change) && identifier(change.id)\n && (change.expectedVersion === null || natural(change.expectedVersion))\n && (change.element === null || element(change.element) && change.element.id === change.id))\n || (changes.files !== undefined && !files(changes.files))\n || (changes.appState !== undefined\n ? !record(changes.appState) || !natural(changes.appStateExpectedSequence)\n : changes.appStateExpectedSequence !== undefined))\n throw new Error('Invalid collaboration changes.')\n const ids = changes.changes.map(change => change.id)\n if (new Set(ids).size !== ids.length) throw new Error('Duplicate collaboration element changes.')\n break\n }\n default:\n throw new Error('Unsupported collaboration command.')\n }\n if (new TextEncoder().encode(JSON.stringify(command)).byteLength > 10 * 1024 * 1024)\n throw new Error('Collaboration request exceeds the document limit.')\n}\n\n/** Native authority is always selected by the installed workspace host, never by the iframe. */\nexport class NativeCollaborationClient {\n constructor(private readonly bridge: Bridge | null) {}\n\n private async snapshotRequest(command: NativeCollaborationCommand): Promise<NativeSnapshot> {\n if (!this.bridge) throw new Error('Native collaboration requires an installed workspace host.')\n const result = await this.bridge.requestNativeCollaboration(command)\n if (!isNativeSnapshot(result)) throw new Error('Invalid native collaboration snapshot.')\n return result\n }\n\n join(): Promise<NativeSnapshot> { return this.snapshotRequest({ operation: 'join' }) }\n snapshot(): Promise<NativeSnapshot> { return this.snapshotRequest({ operation: 'snapshot' }) }\n apply(changes: NativeChangeSet): Promise<NativeSnapshot> {\n return this.snapshotRequest({ operation: 'apply', changes })\n }\n presence(value: NativePointer | null): Promise<NativeSnapshot> {\n return this.snapshotRequest({ operation: 'presence', pointer: value })\n }\n async save(generation: number, correlation: string): Promise<NativeSaveResult> {\n if (!this.bridge) throw new Error('Native collaboration requires an installed workspace host.')\n const result = await this.bridge.requestNativeCollaboration({ operation: 'save', generation, correlation })\n if (!isNativeSaveResult(result) || result.receipt.generation !== generation\n || result.receipt.correlation !== correlation)\n throw new Error('Invalid native collaboration save receipt.')\n return result\n }\n async close(): Promise<void> {\n if (!this.bridge) throw new Error('Native collaboration requires an installed workspace host.')\n const result = await this.bridge.requestNativeCollaboration({ operation: 'close' })\n if (result !== null) throw new Error('Invalid native collaboration close response.')\n }\n}\n","import type {\n AppContext,\n AppToHostMessage,\n HostToAppMessage,\n NavigateOptions,\n TokenInfo,\n VerentisInitMessage,\n VerentisReadyMessage,\n VerentisActionInvokeMessage,\n VerentisCommandInvokeMessage,\n VerentisHostMessage,\n WopiLaunch,\n WopiContinuation,\n WopiSaveCheckpoint,\n WopiSaveStatus,\n VerentisWopiRequest,\n} from '../types'\nimport {\n APP_COMMAND_BATCH_SIZE, APP_COMMANDS_CAPABILITY, isAppCommand,\n type AppCommand, type AppCommandHandler, type AppCommandRegistration,\n} from './app-commands'\nimport { isHeaderAction, type HeaderAction, type HeaderActionHandler, type HeaderActionRegistration } from './header-actions'\nimport { NativeCollaborationError, validateNativeCommand, type NativeCollaborationCommand } from '../collaboration/native'\nimport type { ChatChangeHint, ChatConnectionStatus, ChatSubscriptionHandlers } from '../types/chat'\n\ntype BridgeEventType = HostToAppMessage['type']\n\n/** Handles a host message; the resolved value (structured-cloneable, ideally JSON) is the reply. */\nexport type HostMessageHandler = (payload: unknown) => unknown | Promise<unknown>\n\n/** Channel names declared in the manifest `spec.messages`. */\nexport const HOST_MESSAGE_CHANNEL_PATTERN = /^[a-z0-9][a-z0-9._-]{0,63}$/\ntype BridgeListener = (data: HostToAppMessage) => void\n\n/**\n * PostMessage bridge for communication between an app (iframe) and the\n * workspace host. Handles the initialization handshake, token lifecycle,\n * and app-to-host events (navigate, resize, dirty, etc.).\n */\nexport class Bridge {\n private listeners = new Map<BridgeEventType, Set<BridgeListener>>()\n private _initResolve!: (value: { context: AppContext; token: TokenInfo }) => void\n private _initReject!: (error: Error) => void\n private _initTimer: ReturnType<typeof setTimeout> | undefined\n private _initPromise: Promise<{ context: AppContext; token: TokenInfo }>\n private _hostOrigin: string | null = null\n private _messageHandler: (event: MessageEvent) => void\n private _destroyed = false\n private sessionId: string | null = null\n private actions = new Map<string, { descriptor: HeaderAction; handler: HeaderActionHandler; busy: boolean }>()\n private requests = new Set<string>()\n private commands = new Map<string, { descriptor: AppCommand; handler: AppCommandHandler; busy: boolean }>()\n private commandUpserts = new Set<string>()\n private commandRemovals = new Set<string>()\n private commandReset = false\n private commandFlushScheduled = false\n private commandRequests = new Set<string>()\n private _hostCapabilities: string[] = []\n private chatSubscribers = new Set<ChatSubscriptionHandlers>()\n private hostMessageHandlers = new Map<string, HostMessageHandler>()\n private hostMessageRequests = new Set<string>()\n private wopiRequests = new Map<string, {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n timer: ReturnType<typeof setTimeout>\n }>()\n private collaborationRequests = new Map<string, {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n timer: ReturnType<typeof setTimeout>\n }>()\n\n constructor(private readonly expectedHostOrigin?: string) {\n this._initPromise = new Promise((resolve, reject) => {\n this._initResolve = resolve\n this._initReject = reject\n })\n // Destruction may precede the consumer's call to waitForInit.\n void this._initPromise.catch(() => {})\n\n this._messageHandler = this.handleMessage.bind(this)\n if (typeof window !== 'undefined') {\n window.addEventListener('message', this._messageHandler)\n }\n }\n\n /** Post `verentis:ready` to the host to start the handshake */\n sendReady(capabilities?: string[]): void {\n console.info('[Verentis SDK] Sending verentis:ready to host')\n const message: VerentisReadyMessage = {\n type: 'verentis:ready',\n version: 1,\n capabilities,\n }\n // Ready carries no authority; apps with server-authorized framing can pin even this first message.\n window.parent.postMessage(message, this.expectedHostOrigin ?? '*')\n }\n\n /** Wait for the host to send `verentis:init` with context and token */\n waitForInit(): Promise<{ context: AppContext; token: TokenInfo }> {\n if (!this._hostOrigin && !this._destroyed && !this._initTimer) {\n this._initTimer = setTimeout(() => {\n this._initReject(new Error('Workspace handshake timed out.'))\n this.destroy()\n }, 20_000)\n }\n return this._initPromise\n }\n\n /** Get the host origin (available after init) */\n get hostOrigin(): string | null {\n return this._hostOrigin\n }\n\n /** Capabilities the host announced in `verentis:init`. */\n get hostCapabilities(): readonly string[] {\n return this._hostCapabilities\n }\n\n /**\n * Whether the host exports page commands to its command registry. Older hosts ignore registrations;\n * commands still run locally, they are just not discoverable in the workspace palette.\n */\n get supportsCommands(): boolean {\n return this._hostCapabilities.includes(APP_COMMANDS_CAPABILITY)\n }\n\n /** Send a message to the host */\n postToHost(message: AppToHostMessage): void {\n if (this._destroyed) throw new Error('Bridge has been destroyed.')\n if (!this._hostOrigin) {\n throw new Error('Bridge not initialized: host origin unknown. Wait for init first.')\n }\n window.parent.postMessage(message, this._hostOrigin)\n }\n\n /**\n * Navigate to another location in the workspace.\n *\n * @param path A workspace file path (e.g. `/reports/q1.json`) or an absolute\n * http(s) URL. External URLs require the app to declare the\n * `navigation:external` capability in its manifest.\n * @param options Navigation options. Set `newTab: true` to open the target in\n * a new browser tab instead of the current one.\n */\n navigate(path: string, options?: NavigateOptions): void {\n this.postToHost({\n type: 'verentis:navigate',\n version: 1,\n path,\n ...(options?.newTab ? { newTab: true } : {}),\n })\n }\n\n /** Request iframe resize */\n resize(height: number): void {\n this.postToHost({ type: 'verentis:resize', version: 1, height })\n }\n\n /** Update the title displayed by the host */\n setTitle(title: string): void {\n this.postToHost({ type: 'verentis:title', version: 1, title })\n }\n\n /** Signal unsaved changes to the host */\n setDirty(isDirty: boolean): void {\n this.postToHost({ type: 'verentis:dirty', version: 1, isDirty })\n }\n\n /** The trusted parent selects the approved installation, document and action. */\n requestWopiLaunch(): Promise<WopiLaunch> {\n return this.requestWopi('launch') as Promise<WopiLaunch>\n }\n\n /** Recover only the target selected by a completed server-owned derived operation. */\n requestWopiContinuation(): Promise<WopiContinuation> {\n return this.requestWopi('continue') as Promise<WopiContinuation>\n }\n\n getWopiStatus(): Promise<WopiSaveStatus> {\n return this.requestWopi('status') as Promise<WopiSaveStatus>\n }\n\n requestWopiSave(generation: number): Promise<WopiSaveCheckpoint> {\n if (!Number.isSafeInteger(generation) || generation < 0)\n return Promise.reject(new Error('Invalid edit generation.'))\n return this.requestWopi('save', generation) as Promise<WopiSaveCheckpoint>\n }\n\n closeWopiSession(): Promise<void> {\n return this.requestWopi('close') as Promise<void>\n }\n\n private requestWopi(operation: VerentisWopiRequest['operation'], generation?: number): Promise<unknown> {\n if (this._destroyed || !this.sessionId || !this._hostOrigin)\n return Promise.reject(new Error('An initialized workspace host is required.'))\n if (this.wopiRequests.size >= 4)\n return Promise.reject(new Error('Too many collaboration requests.'))\n const requestId = crypto.randomUUID()\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.wopiRequests.delete(requestId)\n reject(new Error('Collaboration authorization timed out.'))\n }, 30_000)\n this.wopiRequests.set(requestId, { resolve, reject, timer })\n try {\n this.postToHost({\n type: 'verentis:wopi:request', version: 1, requestId,\n sessionId: this.sessionId!, operation, ...(generation === undefined ? {} : { generation }),\n })\n } catch {\n clearTimeout(timer)\n this.wopiRequests.delete(requestId)\n reject(new Error('The workspace host is unavailable.'))\n }\n })\n }\n\n requestNativeCollaboration(command: NativeCollaborationCommand): Promise<unknown> {\n if (this._destroyed || !this.sessionId || !this._hostOrigin)\n return Promise.reject(new Error('An initialized workspace host is required.'))\n if (this.collaborationRequests.size >= 4)\n return Promise.reject(new Error('Too many native collaboration requests.'))\n try { validateNativeCommand(command) }\n catch (error) { return Promise.reject(error) }\n const requestId = crypto.randomUUID()\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.collaborationRequests.delete(requestId)\n reject(new NativeCollaborationError('Native collaboration timed out.', 'unavailable'))\n }, 30_000)\n this.collaborationRequests.set(requestId, { resolve, reject, timer })\n try {\n this.postToHost({\n type: 'verentis:collaboration:request', version: 1, requestId,\n sessionId: this.sessionId!, command,\n })\n } catch (error) {\n clearTimeout(timer)\n this.collaborationRequests.delete(requestId)\n reject(error)\n }\n })\n }\n\n registerAction(descriptor: HeaderAction, handler: HeaderActionHandler): HeaderActionRegistration {\n if (!this.sessionId || this._destroyed) throw new Error('Header actions require an initialized workspace host.')\n if (!isHeaderAction(descriptor)) throw new Error('Invalid header action.')\n if (this.actions.has(descriptor.id)) throw new Error(`Action '${descriptor.id}' is already registered.`)\n if (this.actions.size >= 16) throw new Error('At most 16 header actions may be registered.')\n const action = { descriptor: { ...descriptor, scopes: [...descriptor.scopes] }, handler, busy: false }\n this.actions.set(descriptor.id, action)\n this.publishActions()\n return {\n update: next => {\n if (this.actions.get(descriptor.id) !== action) throw new Error('Action has been disposed.')\n if (!isHeaderAction(next) || next.id !== descriptor.id) throw new Error('Invalid header action update.')\n action.descriptor = { ...next, scopes: [...next.scopes] }\n this.publishActions()\n },\n dispose: () => {\n if (this.actions.get(descriptor.id) !== action) return\n this.actions.delete(descriptor.id)\n this.publishActions()\n },\n }\n }\n\n /**\n * Export a page command to the workspace command registry while it is active. There is no count limit;\n * dispose the registration when the control unmounts. May be called before the init handshake.\n */\n registerCommand(descriptor: AppCommand, handler: AppCommandHandler): AppCommandRegistration {\n if (this._destroyed) throw new Error('Bridge has been destroyed.')\n if (!isAppCommand(descriptor)) throw new Error('Invalid command.')\n if (this.commands.has(descriptor.id)) throw new Error(`Command '${descriptor.id}' is already registered.`)\n const command = { descriptor: cloneCommand(descriptor), handler, busy: false }\n this.commands.set(descriptor.id, command)\n this.queueCommand(descriptor.id, 'upsert')\n return {\n update: next => {\n if (this.commands.get(descriptor.id) !== command) throw new Error('Command has been disposed.')\n if (!isAppCommand(next) || next.id !== descriptor.id) throw new Error('Invalid command update.')\n if (sameCommand(command.descriptor, next)) return\n command.descriptor = cloneCommand(next)\n this.queueCommand(descriptor.id, 'upsert')\n },\n dispose: () => {\n if (this.commands.get(descriptor.id) !== command) return\n this.commands.delete(descriptor.id)\n this.queueCommand(descriptor.id, 'remove')\n },\n }\n }\n\n private queueCommand(id: string, change: 'upsert' | 'remove'): void {\n if (change === 'upsert') {\n this.commandRemovals.delete(id)\n this.commandUpserts.add(id)\n } else {\n this.commandUpserts.delete(id)\n this.commandRemovals.add(id)\n }\n this.scheduleCommandFlush()\n }\n\n private scheduleCommandFlush(): void {\n if (this.commandFlushScheduled) return\n this.commandFlushScheduled = true\n queueMicrotask(() => {\n this.commandFlushScheduled = false\n this.flushCommands()\n })\n }\n\n private commandSnapshot(id: string): AppCommand | null {\n const command = this.commands.get(id)\n if (!command) return null\n return command.busy ? { ...command.descriptor, busy: true } : command.descriptor\n }\n\n private flushCommands(): void {\n if (!this.sessionId || !this._hostOrigin || this._destroyed) return\n const upsert = [...this.commandUpserts].map(id => this.commandSnapshot(id)).filter((c): c is AppCommand => !!c)\n const remove = this.commandReset ? [] : [...this.commandRemovals]\n let reset = this.commandReset\n this.commandUpserts.clear()\n this.commandRemovals.clear()\n this.commandReset = false\n if (!reset && !upsert.length && !remove.length) return\n let offset = 0\n let removeOffset = 0\n do {\n const batchUpsert = upsert.slice(offset, offset + APP_COMMAND_BATCH_SIZE)\n offset += batchUpsert.length\n const room = APP_COMMAND_BATCH_SIZE - batchUpsert.length\n const batchRemove = remove.slice(removeOffset, removeOffset + room)\n removeOffset += batchRemove.length\n this.postToHost({\n type: 'verentis:commands:update', version: 1, sessionId: this.sessionId,\n ...(reset ? { reset: true } : {}), upsert: batchUpsert, remove: batchRemove,\n })\n reset = false\n } while (offset < upsert.length || removeOffset < remove.length)\n }\n\n private async invokeCommand(message: VerentisCommandInvokeMessage): Promise<void> {\n if (message.sessionId !== this.sessionId || typeof message.requestId !== 'string'\n || message.requestId.length > 128 || !message.requestId || this.commandRequests.has(message.requestId)\n || typeof message.commandId !== 'string') return\n this.commandRequests.add(message.requestId)\n if (this.commandRequests.size > 1000) this.commandRequests.delete(this.commandRequests.values().next().value!)\n const command = this.commands.get(message.commandId)\n const reply = { type: 'verentis:command:result' as const, version: 1 as const,\n sessionId: message.sessionId, requestId: message.requestId, commandId: message.commandId }\n if (!command || command.busy || command.descriptor.busy || command.descriptor.enabled === false) {\n this.postToHost({ ...reply, error: 'Command is unavailable.' })\n return\n }\n command.busy = true\n this.queueCommand(message.commandId, 'upsert')\n try {\n await command.handler()\n if (!this._destroyed && this.sessionId === message.sessionId) this.postToHost(reply)\n } catch (error) {\n if (!this._destroyed && this.sessionId === message.sessionId) {\n this.postToHost({ ...reply, error: (error instanceof Error ? error.message : 'Command failed.').slice(0, 500) || 'Command failed.' })\n }\n } finally {\n command.busy = false\n if (this.commands.get(message.commandId) === command) this.queueCommand(message.commandId, 'upsert')\n }\n }\n\n private publishActions(): void {\n if (!this.sessionId || this._destroyed) return\n this.postToHost({\n type: 'verentis:actions:set', version: 1, sessionId: this.sessionId,\n actions: [...this.actions.values()].map(a => ({ ...a.descriptor, busy: a.busy || a.descriptor.busy })),\n })\n }\n\n private async invokeAction(message: VerentisActionInvokeMessage): Promise<void> {\n if (message.sessionId !== this.sessionId || typeof message.requestId !== 'string'\n || message.requestId.length > 128 || !message.requestId || this.requests.has(message.requestId)) return\n this.requests.add(message.requestId)\n if (this.requests.size > 1000) this.requests.delete(this.requests.values().next().value!)\n const action = this.actions.get(message.actionId)\n const reply = { type: 'verentis:action:result' as const, version: 1 as const,\n sessionId: message.sessionId, requestId: message.requestId, actionId: message.actionId }\n if (!action || action.busy || action.descriptor.busy\n || action.descriptor.enabled === false || action.descriptor.visible === false) {\n this.postToHost({ ...reply, error: 'Action is unavailable.' })\n return\n }\n action.busy = true\n this.publishActions()\n try {\n const result = await action.handler()\n if (!this._destroyed && this.sessionId === message.sessionId) {\n this.postToHost({ ...reply, result: result || undefined })\n }\n } catch (error) {\n if (!this._destroyed && this.sessionId === message.sessionId) {\n this.postToHost({ ...reply, error: (error instanceof Error ? error.message : 'Action failed.').slice(0, 500) })\n }\n } finally {\n action.busy = false\n this.publishActions()\n }\n }\n\n /**\n * Handle messages the workspace sends on a channel declared in the manifest `spec.messages` — for\n * example an agent asking the open app to select a record. The handler's return value is the reply;\n * a thrown error is reported back as the failure. May be called before the init handshake.\n */\n onHostMessage(channel: string, handler: HostMessageHandler): () => void {\n if (this._destroyed) throw new Error('Bridge has been destroyed.')\n if (!HOST_MESSAGE_CHANNEL_PATTERN.test(channel)) throw new Error(`Invalid host message channel '${channel}'.`)\n if (this.hostMessageHandlers.has(channel)) throw new Error(`Channel '${channel}' already has a handler.`)\n this.hostMessageHandlers.set(channel, handler)\n return () => {\n if (this.hostMessageHandlers.get(channel) === handler) this.hostMessageHandlers.delete(channel)\n }\n }\n\n private async receiveHostMessage(message: VerentisHostMessage): Promise<void> {\n if (!this._hostOrigin || message.sessionId !== this.sessionId || typeof message.channel !== 'string'\n || typeof message.requestId !== 'string' || !message.requestId || message.requestId.length > 128\n || this.hostMessageRequests.has(message.requestId)) return\n this.hostMessageRequests.add(message.requestId)\n if (this.hostMessageRequests.size > 1000) this.hostMessageRequests.delete(this.hostMessageRequests.values().next().value!)\n const reply = { type: 'verentis:host:reply' as const, version: 1 as const,\n sessionId: message.sessionId, requestId: message.requestId, channel: message.channel }\n const handler = this.hostMessageHandlers.get(message.channel)\n if (!handler) {\n this.postToHost({ ...reply, error: `The application does not handle '${message.channel.slice(0, 64)}' messages.` })\n return\n }\n let response: { result?: unknown; error?: string }\n try {\n response = { result: await handler(message.payload) }\n } catch (error) {\n response = { error: (error instanceof Error ? error.message : 'Message failed.').slice(0, 500) || 'Message failed.' }\n }\n if (this._destroyed || this.sessionId !== message.sessionId) return\n try {\n this.postToHost({ ...reply, ...response })\n } catch {\n // A result that cannot be cloned is reported as a failure rather than leaving the host waiting.\n this.postToHost({ ...reply, error: 'The reply could not be sent to the workspace.' })\n }\n }\n\n /**\n * Subscribes to the host's chat live hints (see `ChatModule.subscribeChanges`). The first subscriber asks the host\n * to relay; the last one to leave stops it. Messages from another session are ignored.\n */\n subscribeChat(handlers: ChatSubscriptionHandlers): () => void {\n if (this._destroyed) throw new Error('Bridge has been destroyed.')\n this.chatSubscribers.add(handlers)\n const subscribe = () => {\n if (this.sessionId && this._hostOrigin && this.chatSubscribers.size > 0)\n this.postToHost({ type: 'verentis:chat:subscribe', version: 1, sessionId: this.sessionId })\n }\n if (this.chatSubscribers.size === 1) {\n if (this._hostOrigin) subscribe()\n else void this._initPromise.then(subscribe, () => undefined)\n }\n return () => {\n if (!this.chatSubscribers.delete(handlers) || this.chatSubscribers.size > 0) return\n if (!this._destroyed && this.sessionId && this._hostOrigin)\n this.postToHost({ type: 'verentis:chat:unsubscribe', version: 1, sessionId: this.sessionId })\n }\n }\n\n private receiveChat(data: HostToAppMessage): boolean {\n if (data.type !== 'verentis:chat:changed' && data.type !== 'verentis:chat:connection' &&\n data.type !== 'verentis:chat:subscribed' && data.type !== 'verentis:chat:error') return false\n if (!this._hostOrigin || data.sessionId !== this.sessionId) return true\n for (const subscriber of [...this.chatSubscribers]) {\n try {\n if (data.type === 'verentis:chat:changed') subscriber.onChange(data.hint as ChatChangeHint)\n else if (data.type === 'verentis:chat:error') subscriber.onError?.(String(data.reason).slice(0, 500))\n else subscriber.onConnection?.(data.status as ChatConnectionStatus)\n } catch (error) {\n console.error('[Verentis SDK] Chat subscriber failed', error)\n }\n }\n return true\n }\n\n /** Subscribe to a specific message type from the host */\n on(type: BridgeEventType, listener: BridgeListener): () => void {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, new Set())\n }\n this.listeners.get(type)!.add(listener)\n\n return () => {\n this.listeners.get(type)?.delete(listener)\n }\n }\n\n /** Clean up event listeners */\n destroy(): void {\n this._destroyed = true\n clearTimeout(this._initTimer)\n this._initTimer = undefined\n if (!this._hostOrigin) this._initReject(new Error('Bridge has been destroyed.'))\n this.actions.clear()\n this.requests.clear()\n this.commands.clear()\n this.commandUpserts.clear()\n this.commandRemovals.clear()\n this.commandRequests.clear()\n this.hostMessageHandlers.clear()\n this.hostMessageRequests.clear()\n this.chatSubscribers.clear()\n this.listeners.clear()\n for (const pending of this.wopiRequests.values()) {\n clearTimeout(pending.timer)\n pending.reject(new Error('Bridge has been destroyed.'))\n }\n this.wopiRequests.clear()\n for (const pending of this.collaborationRequests.values()) {\n clearTimeout(pending.timer)\n pending.reject(new Error('Bridge has been destroyed.'))\n }\n this.collaborationRequests.clear()\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', this._messageHandler)\n }\n }\n\n private handleMessage(event: MessageEvent): void {\n if (this._destroyed) return\n\n const data = event.data as HostToAppMessage\n if (event.source !== window.parent || data?.version !== 1\n || typeof data?.type !== 'string' || !data.type.startsWith('verentis:')) return\n if (this._hostOrigin && event.origin !== this._hostOrigin) return\n if (this.expectedHostOrigin && event.origin !== this.expectedHostOrigin) return\n\n // Capture the host origin from the first valid message\n if (data.type === 'verentis:init') {\n if (this._hostOrigin) return\n if (!data.context?.workspace?.id || !data.token || event.origin === 'null') return\n clearTimeout(this._initTimer)\n this._initTimer = undefined\n this._hostOrigin = event.origin\n this.sessionId = typeof data.sessionId === 'string' ? data.sessionId : null\n this._hostCapabilities = Array.isArray(data.capabilities)\n ? data.capabilities.filter((c): c is string => typeof c === 'string').slice(0, 64)\n : []\n if (this.sessionId && this.commands.size > 0) {\n // Publish everything registered before the handshake as one authoritative snapshot. Hosts start\n // each session with an empty command set, so a bridge without commands sends nothing.\n this.commandReset = true\n this.commandRemovals.clear()\n for (const id of this.commands.keys()) this.commandUpserts.add(id)\n this.scheduleCommandFlush()\n }\n console.info('[Verentis SDK] Received verentis:init from host', {\n origin: event.origin,\n workspaceId: data.context.workspace.id,\n filePath: data.context.file?.path ?? null,\n })\n const initData = data as VerentisInitMessage\n this._initResolve({ context: initData.context, token: initData.token })\n }\n\n if (data.type === 'verentis:wopi:response') {\n if (!this._hostOrigin || data.sessionId !== this.sessionId) return\n const pending = this.wopiRequests.get(data.requestId)\n if (!pending) return\n clearTimeout(pending.timer)\n this.wopiRequests.delete(data.requestId)\n if (data.error || !Object.hasOwn(data, 'result'))\n pending.reject(new Error('Collaboration authorization is unavailable.'))\n else pending.resolve(data.result)\n return\n }\n\n if (data.type === 'verentis:collaboration:response') {\n if (!this._hostOrigin || data.sessionId !== this.sessionId) return\n const pending = this.collaborationRequests.get(data.requestId)\n if (!pending) return\n clearTimeout(pending.timer)\n this.collaborationRequests.delete(data.requestId)\n if (data.error || !Object.hasOwn(data, 'result'))\n pending.reject(new NativeCollaborationError(\n typeof data.error === 'string' ? data.error.slice(0, 500) : 'Native collaboration is unavailable.',\n typeof data.code === 'string' ? data.code.slice(0, 64) : 'unavailable',\n ))\n else pending.resolve(data.result)\n return\n }\n\n if (data.type === 'verentis:action:invoke') {\n void this.invokeAction(data)\n return\n }\n\n if (data.type === 'verentis:command:invoke') {\n void this.invokeCommand(data)\n return\n }\n\n if (data.type === 'verentis:host:message') {\n void this.receiveHostMessage(data)\n return\n }\n\n if (this.receiveChat(data)) return\n\n // Dispatch to listeners\n const typeListeners = this.listeners.get(data.type)\n if (typeListeners) {\n for (const listener of typeListeners) {\n listener(data)\n }\n }\n }\n}\n\nfunction cloneCommand(command: AppCommand): AppCommand {\n return { ...command, ...(command.keywords ? { keywords: [...command.keywords] } : {}) }\n}\n\nfunction sameCommand(a: AppCommand, b: AppCommand): boolean {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]) as Set<keyof AppCommand>\n for (const key of keys) {\n if (key === 'keywords') {\n if ((a.keywords ?? []).join('\\u0000') !== (b.keywords ?? []).join('\\u0000')) return false\n } else if (a[key] !== b[key]) return false\n }\n return true\n}\n","import { ApiError, type AuthStrategy, type RequestOptions } from '../types'\n\n/**\n * HTTP client for making direct API calls to the Verentis gateway.\n * Used in both standalone and iframe modes — the auth strategy determines\n * how the Authorization header is obtained.\n */\nexport class HttpTransport {\n constructor(\n private readonly baseUrl: string,\n private readonly auth: AuthStrategy,\n private readonly apiVersion: string = 'v1',\n ) {}\n\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n const url = this.buildUrl(path, options?.params)\n console.info('[Verentis SDK] Request started', { method, path, url })\n const headers: Record<string, string> = {}\n\n const authHeader = await this.auth.getAuthHeader()\n if (authHeader) {\n headers['Authorization'] = authHeader\n }\n\n if (options?.headers) {\n Object.assign(headers, options.headers)\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: options?.body,\n })\n\n await this.ensureSuccess(response)\n\n console.info('[Verentis SDK] Request succeeded', {\n method,\n path,\n status: response.status,\n contentType: response.headers.get('content-type') ?? '',\n })\n const contentType = response.headers.get('content-type') ?? ''\n if (contentType.includes('application/json')) {\n return response.json() as Promise<T>\n }\n\n // For non-JSON responses (e.g. binary file downloads), return the blob\n return response.blob() as unknown as T\n }\n\n async requestRaw(method: string, path: string, options?: RequestOptions): Promise<Response> {\n const url = this.buildUrl(path, options?.params)\n console.info('[Verentis SDK] Raw request started', { method, path, url })\n const headers: Record<string, string> = {}\n\n const authHeader = await this.auth.getAuthHeader()\n if (authHeader) {\n headers['Authorization'] = authHeader\n }\n\n if (options?.headers) {\n Object.assign(headers, options.headers)\n }\n\n const response = await fetch(url, { method, headers, body: options?.body })\n console.info('[Verentis SDK] Raw request completed', {\n method,\n path,\n status: response.status,\n ok: response.ok,\n contentType: response.headers.get('content-type') ?? '',\n })\n return response\n }\n\n async ensureSuccess(response: Response): Promise<void> {\n if (response.ok) return\n const raw = await response.text()\n let detail = raw || response.statusText\n let title: string | undefined\n let code: string | undefined\n try {\n const body: unknown = JSON.parse(raw)\n if (body !== null && typeof body === 'object') {\n if ('detail' in body && typeof body.detail === 'string') detail = body.detail\n else if ('message' in body && typeof body.message === 'string') detail = body.message\n if ('title' in body && typeof body.title === 'string') title = body.title\n if ('code' in body && typeof body.code === 'string') code = body.code\n }\n } catch (error) {\n if (!(error instanceof SyntaxError)) throw error\n }\n console.error('[Verentis SDK] Request failed', { status: response.status, code })\n const retryAfter = response.headers.get('Retry-After')\n const retryAfterMs = retryAfter === null\n ? undefined\n : /^\\d+$/.test(retryAfter)\n ? Number(retryAfter) * 1000\n : Date.parse(retryAfter) - Date.now()\n throw new ApiError(response.status, detail, title, code,\n retryAfterMs !== undefined && Number.isFinite(retryAfterMs) ? Math.max(0, retryAfterMs) : undefined)\n }\n\n private buildUrl(path: string, params?: RequestOptions['params']): string {\n const base = `${this.baseUrl}/${this.apiVersion}${path}`\n\n if (!params) return base\n\n const searchParams = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) {\n continue\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n searchParams.append(key, String(item))\n }\n } else {\n searchParams.set(key, String(value))\n }\n }\n\n const qs = searchParams.toString()\n return qs ? `${base}?${qs}` : base\n }\n}\n","import { ApiKeyAuth } from './auth/api-key.auth'\nimport { BridgeAuth } from './auth/bridge.auth'\nimport { TokenAuth } from './auth/token.auth'\nimport { ContextModule } from './modules/context'\nimport { ExecutionsModule } from './modules/executions'\nimport { EnginesModule } from './modules/engines'\nimport { FilesModule } from './modules/files'\nimport { InstallationsModule } from './modules/installations'\nimport { ResourcesModule } from './modules/resources'\nimport { SettingsModule } from './modules/settings'\nimport { NotificationsModule } from './modules/notifications'\nimport { BusinessModule } from './modules/business'\nimport { ChatModule } from './modules/chat'\nimport { Bridge } from './transport/bridge.transport'\nimport { HttpTransport } from './transport/http.transport'\nimport { NativeCollaborationClient } from './collaboration/native'\nimport type { AuthStrategy, VerentisClientOptions } from './types'\n\n/**\n * The main Verentis SDK client.\n * Provides access to file operations, workspace context, and (in iframe mode)\n * the host communication bridge.\n */\nexport class VerentisClient {\n files!: FilesModule\n executions!: ExecutionsModule\n engines!: EnginesModule\n installations!: InstallationsModule\n resources!: ResourcesModule\n settings!: SettingsModule\n notifications!: NotificationsModule\n business!: BusinessModule\n chat!: ChatModule\n readonly context: ContextModule\n readonly bridge: Bridge | null\n readonly collaboration: NativeCollaborationClient\n\n private readonly _auth: AuthStrategy\n private _http!: HttpTransport\n private _ready: Promise<void>\n\n constructor(options?: VerentisClientOptions) {\n this.context = new ContextModule()\n\n const environment = detectEnvironment()\n\n if (environment === 'iframe' && !options?.auth) {\n // --- iframe mode ---\n this.bridge = new Bridge()\n this.collaboration = new NativeCollaborationClient(this.bridge)\n const bridgeAuth = new BridgeAuth('*') // origin validated after init\n this._auth = bridgeAuth\n\n this._ready = this.initFromBridge(bridgeAuth)\n } else {\n // --- standalone mode ---\n this.bridge = null\n this.collaboration = new NativeCollaborationClient(null)\n this._auth = createAuthStrategy(options)\n\n const apiUrl = options?.apiUrl\n if (!apiUrl) {\n throw new Error('apiUrl is required in standalone mode')\n }\n\n this.context.setApiUrl(apiUrl)\n if (options?.workspaceId) {\n this.context.setWorkspace({ id: options.workspaceId })\n }\n\n this._http = new HttpTransport(apiUrl, this._auth, options?.apiVersion ?? 'v1')\n this.files = new FilesModule(this._http, options?.workspaceId)\n this.executions = new ExecutionsModule(this._http, options?.workspaceId)\n this.engines = new EnginesModule(this._http, options?.workspaceId)\n this.installations = new InstallationsModule(this._http, options?.workspaceId)\n this.resources = new ResourcesModule(this._http, options?.workspaceId)\n this.settings = new SettingsModule(this._http, options?.workspaceId)\n this.notifications = new NotificationsModule(this._http, options?.workspaceId)\n this.business = new BusinessModule(this._http)\n this.chat = new ChatModule(this._http, null, this.executions)\n this._ready = Promise.resolve()\n return\n }\n\n // _http and files are set after bridge init via initFromBridge()\n }\n\n /**\n * Returns a promise that resolves when the client is fully initialized.\n * In standalone mode this resolves immediately.\n * In iframe mode this resolves after the host sends `verentis:init`.\n */\n whenReady(): Promise<void> {\n return this._ready\n }\n\n /**\n * The current `Authorization` header value, refreshed when near expiry.\n * Forward it to the app's own backend, which exchanges it at Security's\n * `/connect/token` (RFC 8693) as the installation's confidential client.\n */\n getAuthorizationHeader(): Promise<string | null> {\n return this._auth.getAuthHeader()\n }\n\n /** Clean up resources (timers, event listeners) */\n destroy(): void {\n this._auth.destroy?.()\n this.bridge?.destroy()\n }\n\n private async initFromBridge(bridgeAuth: BridgeAuth): Promise<void> {\n // Signal readiness to the host\n this.bridge!.sendReady()\n\n // Wait for host to send context + token\n const { context, token } = await this.bridge!.waitForInit()\n\n // Now we know the host origin — update the bridge auth\n const hostOrigin = this.bridge!.hostOrigin!\n // Keep one listener owner; copying a second instance leaks both listeners.\n bridgeAuth.setHostOrigin(hostOrigin)\n bridgeAuth.setToken(token)\n\n // Set context\n this.context.setFromAppContext(context)\n this.context.setGrants(token.grants)\n this.bridge!.on('verentis:token:refreshed', (message) => {\n if (message.type === 'verentis:token:refreshed') this.context.setGrants(message.token?.grants)\n })\n\n // Create transport and modules now that we have the API URL\n const http = new HttpTransport(\n context.apiUrl,\n bridgeAuth,\n 'v1',\n )\n\n this._http = http\n this.files = new FilesModule(http, context.workspace.id)\n this.executions = new ExecutionsModule(http, context.workspace.id)\n this.engines = new EnginesModule(http, context.workspace.id)\n this.installations = new InstallationsModule(http, context.workspace.id)\n this.resources = new ResourcesModule(http, context.workspace.id)\n this.settings = new SettingsModule(http, context.workspace.id)\n this.notifications = new NotificationsModule(http, context.workspace.id)\n this.business = new BusinessModule(http)\n this.chat = new ChatModule(http, this.bridge, this.executions)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction detectEnvironment(): 'iframe' | 'standalone' {\n if (typeof window !== 'undefined' && window.parent !== window) {\n return 'iframe'\n }\n return 'standalone'\n}\n\nfunction createAuthStrategy(options?: VerentisClientOptions): AuthStrategy {\n if (!options?.auth) {\n throw new Error('auth is required in standalone mode: provide { apiKey } or { token }')\n }\n\n if ('apiKey' in options.auth) {\n return new ApiKeyAuth(options.auth.apiKey)\n }\n\n if ('token' in options.auth) {\n return new TokenAuth(\n options.auth.token,\n options.auth.expiresAt,\n options.auth.refreshToken,\n )\n }\n\n throw new Error('Invalid auth options: provide { apiKey } or { token }')\n}\n","import type { MimeTypeBinding } from '../types'\n\n/**\n * Tests whether a MIME type matches a pattern.\n * Supports wildcards: `image/*` matches `image/png`, `*/*` matches everything.\n * Comparison is case-insensitive and ignores parameters (e.g. `; charset=utf-8`).\n */\nexport function matchMimeType(pattern: string, mimeType: string): boolean {\n const normalizedPattern = stripParams(pattern).toLowerCase()\n const normalizedMime = stripParams(mimeType).toLowerCase()\n\n if (normalizedPattern === '*/*') return true\n\n const [patternType, patternSubtype] = normalizedPattern.split('/')\n const [mimeTypeType, mimeSubtype] = normalizedMime.split('/')\n\n if (!patternType || !mimeTypeType) return false\n if (patternType === '*') return true\n if (patternType !== mimeTypeType) return false\n if (!patternSubtype || patternSubtype === '*') return true\n\n return patternSubtype === mimeSubtype\n}\n\n/**\n * Finds the best matching binding for a given MIME type.\n * Exact matches beat wildcard matches at the same priority level.\n * Higher priority values are preferred.\n */\nexport function findBestMatch(\n mimeType: string,\n bindings: MimeTypeBinding[],\n): MimeTypeBinding | null {\n const matches = bindings\n .filter((b) => matchMimeType(b.pattern, mimeType))\n .sort((a, b) => {\n const aExact = !a.pattern.includes('*')\n const bExact = !b.pattern.includes('*')\n if (aExact !== bExact) return aExact ? -1 : 1\n return b.priority - a.priority\n })\n\n return matches[0] ?? null\n}\n\n/**\n * Strips parameters from a MIME type string.\n * `application/json; charset=utf-8` → `application/json`\n */\nfunction stripParams(mime: string): string {\n const idx = mime.indexOf(';')\n return idx === -1 ? mime.trim() : mime.slice(0, idx).trim()\n}\n","export interface CollaborationDocumentContext {\n workspace?: { id?: string }\n file?: { nodeId?: string; branch?: string }\n}\n\nexport interface CollaborationDocument {\n sessionId: string\n workspaceId: string\n branch: string\n nodeId: string\n fileId: string\n name: string\n readOnly: boolean\n accessTokenTtl: number\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** An exact origin, not a URL pattern or an authority grant. */\nexport function exactHttpsOrigin(value: unknown): string {\n if (typeof value !== 'string' || value.length > 256)\n throw new Error('Invalid framing origin.')\n const origin = new URL(value)\n if (origin.protocol !== 'https:' || origin.origin !== value || origin.href !== `${value}/`\n || !/^[a-z0-9-]+(?:\\.[a-z0-9-]+)*$/.test(origin.hostname))\n throw new Error('Invalid framing origin.')\n return value\n}\n\nexport function isTrustedMessage(\n event: { source: unknown; origin: string },\n source: unknown,\n origin: string,\n): boolean {\n return Boolean(source && origin && event.source === source && event.origin === origin)\n}\n\n/** Checks nonsecret launch metadata against the document selected by the trusted host. */\nexport function validateCollaborationDocument(\n value: unknown,\n context: CollaborationDocumentContext,\n now = Date.now(),\n): CollaborationDocument {\n const branch = context.file?.branch\n const node = context.file?.nodeId\n const workspace = context.workspace?.id\n if (!branch || !node || !workspace || !isRecord(value)\n || value.nodeId !== node || value.workspaceId !== workspace\n || value.branch !== branch.trim().toLowerCase()\n || typeof value.fileId !== 'string' || !/^[a-f0-9]{32}$/.test(value.fileId)\n || typeof value.sessionId !== 'string'\n || !/^(?:[a-f0-9]{32}|[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12})$/.test(value.sessionId)\n || typeof value.accessTokenTtl !== 'number' || !Number.isSafeInteger(value.accessTokenTtl)\n || value.accessTokenTtl <= now\n || typeof value.name !== 'string' || !value.name || value.name.length > 1024\n || typeof value.readOnly !== 'boolean')\n throw new Error('Invalid live launch.')\n return {\n sessionId: value.sessionId,\n workspaceId: value.workspaceId,\n branch: value.branch,\n nodeId: value.nodeId,\n fileId: value.fileId,\n name: value.name,\n readOnly: value.readOnly,\n accessTokenTtl: value.accessTokenTtl,\n }\n}\n\n/** An editor acknowledgement alone never proves a document was durably saved. */\nexport function isDurableSaveConfirmed(\n result: unknown,\n request: unknown,\n currentGeneration: number,\n editorModified: boolean,\n): boolean {\n if (!isRecord(request) || !isRecord(result) || !isRecord(result.receipt))\n return false\n return editorModified === false && result.state === 'ready'\n && result.continuationAvailable !== true\n && Number.isSafeInteger(currentGeneration) && currentGeneration >= 0\n && currentGeneration === request.generation\n && typeof request.correlation === 'string' && request.correlation.length > 0\n && result.receipt.generation === request.generation\n && result.receipt.correlation === request.correlation\n && typeof result.receipt.revision === 'string' && result.receipt.revision.length > 0\n}\n","import { VerentisClient } from './client'\nimport type { VerentisClientOptions } from './types'\n\n/**\n * Create a new Verentis SDK client.\n *\n * @example Standalone mode (local development)\n * ```ts\n * const client = createVerentisClient({\n * apiUrl: 'https://api.verentis.com',\n * auth: { apiKey: 'vrt_abc123_...' },\n * workspaceId: 'workspace-uuid',\n * })\n *\n * const file = await client.files.get('/documents/report.json')\n * ```\n *\n * @example iframe mode (auto-detected at runtime)\n * ```ts\n * const client = createVerentisClient()\n * await client.whenReady()\n *\n * const { surface, workspace } = client.context\n * if (surface === 'file') {\n * const content = await client.files.readContent(client.context.file.path)\n * }\n * ```\n */\nexport function createVerentisClient(options?: VerentisClientOptions): VerentisClient {\n return new VerentisClient(options)\n}\n\n// Re-export everything\nexport { VerentisClient } from './client'\nexport { matchMimeType, findBestMatch } from './utils/mime'\nexport { Bridge, HOST_MESSAGE_CHANNEL_PATTERN } from './transport/bridge.transport'\nexport type { HostMessageHandler } from './transport/bridge.transport'\nexport { isHeaderAction } from './transport/header-actions'\nexport { isAppCommand, APP_COMMAND_BATCH_SIZE, APP_COMMANDS_CAPABILITY, APP_COMMAND_ID_PATTERN } from './transport/app-commands'\nexport type { AppCommand, AppCommandHandler, AppCommandRegistration } from './transport/app-commands'\nexport { exactHttpsOrigin, isTrustedMessage, validateCollaborationDocument, isDurableSaveConfirmed } from './collaboration/lifecycle'\nexport type { CollaborationDocument, CollaborationDocumentContext } from './collaboration/lifecycle'\nexport {\n NativeCollaborationClient, NativeCollaborationError, isNativeSnapshot, isNativeSaveResult, validateNativeCommand,\n} from './collaboration/native'\nexport type {\n NativeElement, NativeFile, NativeScene, NativePointer, NativeParticipant, NativeSnapshot,\n NativeSaveReceipt, NativeSaveResult, NativeChangeSet, NativeCollaborationCommand,\n NativeCollaborationRequest, NativeCollaborationResponse,\n} from './collaboration/native'\nexport type { HeaderAction, HeaderActionResult, HeaderActionHandler, HeaderActionRegistration } from './transport/header-actions'\nexport { HttpTransport } from './transport/http.transport'\nexport { ApiError } from './types'\nexport { ApiKeyAuth } from './auth/api-key.auth'\nexport { TokenAuth } from './auth/token.auth'\nexport { BridgeAuth } from './auth/bridge.auth'\nexport { FilesModule } from './modules/files'\nexport { ContextModule } from './modules/context'\nexport { ExecutionsModule, isTerminalStatus, SCRIPT_ARGUMENTS_SCHEMA } from './modules/executions'\nexport { EnginesModule } from './modules/engines'\nexport { InstallationsModule } from './modules/installations'\nexport { ResourcesModule } from './modules/resources'\nexport { SettingsModule } from './modules/settings'\nexport { NotificationsModule } from './modules/notifications'\nexport type * from './types/notifications'\nexport { BusinessModule } from './modules/business'\nexport type * from './types/business'\nexport { ChatModule } from './modules/chat'\nexport type * from './types/chat'\nexport type { NamespacedSettings } from './modules/settings'\n\n// Re-export types\nexport type {\n // PostMessage protocol\n VerentisMessage,\n VerentisActionsSetMessage,\n VerentisActionInvokeMessage,\n VerentisActionResultMessage,\n VerentisCommandsUpdateMessage,\n VerentisCommandInvokeMessage,\n VerentisCommandResultMessage,\n VerentisHostMessage,\n VerentisHostReplyMessage,\n VerentisInitMessage,\n VerentisReadyMessage,\n VerentisTokenRefreshMessage,\n VerentisTokenRefreshedMessage,\n VerentisFileChangedMessage,\n VerentisThemeMessage,\n VerentisNavigateMessage,\n VerentisResizeMessage,\n VerentisTitleMessage,\n VerentisDirtyMessage,\n WopiLaunch,\n WopiContinuation,\n WopiSaveCheckpoint,\n WopiSaveStatus,\n VerentisWopiRequest,\n VerentisWopiResponse,\n HostToAppMessage,\n AppToHostMessage,\n // Context\n AppSurface,\n AppApplicationContext,\n AppContext,\n FileAppContext,\n WorkspaceAppContext,\n WorkspaceInfo,\n FileInfo,\n EntryPointInfo,\n TokenInfo,\n TokenGrant,\n // Client\n VerentisClientOptions,\n AuthOptions,\n NavigateOptions,\n // File API\n FileEntry,\n NodeFileMetadata,\n NodeFileOptions,\n NodeFileContent,\n WriteNodeFileOptions,\n GetFileOptions,\n WriteFileOptions,\n MoveFileOptions,\n DeleteFileOptions,\n ArchiveFormat,\n ReadArchiveOptions,\n ExtractUploadOptions,\n InstalledPackageDescriptor,\n InstalledPackagePayload,\n // Installation API\n PackageDependency,\n InstallationGraphPackage,\n InstallationGraphPreview,\n InstallationGraphResult,\n InstallationGraphOutcomeStatus,\n PreviewInstallationOptions,\n CatalogImage,\n Installation,\n InstallationDetail,\n InstallationLifecycleResult,\n InstallationListOptions,\n InstallationMode,\n InstallationScopedOptions,\n InstallationStatus,\n ResolveInstallationOptions,\n UpdateInstallationOptions,\n // Execution API\n Execution,\n ExecutionResult,\n ExecutionLogs,\n ExecutionStatus,\n ExecutionMode,\n ExecutionTrigger,\n RunFileOptions,\n ScriptArgumentDefinition,\n ScriptArgumentDescriptor,\n ScriptArgumentsOptions,\n ScriptArgumentType,\n ExecuteEngineOptions,\n ExecutionScopedOptions,\n ExecutionListOptions,\n ExecutionEngine,\n ExecutionEngineListOptions,\n EngineRuntime,\n EngineFileType,\n EngineTool,\n PagedResult,\n WaitOptions,\n // Settings API\n SettingGroup,\n SettingItem,\n SettingOption,\n SettingsScopedOptions,\n SettingPresence,\n // Resource API\n ResourceRegistration,\n ResourceMimeTypeBinding,\n ResourceScopedOptions,\n // Auth\n AuthStrategy,\n // Manifest\n ApplicationManifest,\n ManifestMetadata,\n ApplicationSpec,\n ApplicationLaunchConfig,\n ApplicationEntryPoint,\n ApplicationDisplayOptions,\n ApplicationFileType,\n MimeTypeBinding,\n SandboxOptions,\n OAuthConfig,\n SettingDeclaration,\n SettingDeclarationType,\n // HTTP\n RequestOptions,\n} from './types'\n"]}
|