@pickaxe/harnesslayer 1.1.0 → 1.1.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/dist/index.d.ts +618 -0
- package/dist/index.js +1528 -0
- package/dist/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/internal/constants.ts","../src/internal/driftstone.ts","../src/internal/transport.ts","../src/internal/config.ts","../src/internal/utils.ts","../src/models.ts","../src/internal/validation.ts","../src/resources/base.ts","../src/resources/access-group.ts","../src/resources/channel.ts","../src/resources/conflict.ts","../src/resources/instance.ts","../src/internal/zip.ts","../src/resources/state.ts","../src/resources/profile.ts","../src/resources/session.ts","../src/resources/version.ts","../src/resources/app.ts","../src/resources/organization.ts","../src/resources/response.ts","../src/client.ts"],"sourcesContent":["export class HarnesslayerError extends Error {\r\n override name = \"HarnesslayerError\";\r\n}\r\n\r\nexport class HarnesslayerHTTPError extends HarnesslayerError {\r\n override name = \"HarnesslayerHTTPError\";\r\n}\r\n\r\nexport class HarnesslayerResponseError extends HarnesslayerError {\r\n override name = \"HarnesslayerResponseError\";\r\n}\r\n\r\nexport class HarnesslayerAPIError extends HarnesslayerError {\r\n override name = \"HarnesslayerAPIError\";\r\n}\r\n\r\nexport class DriftstoneError extends Error {\r\n override name = \"DriftstoneError\";\r\n}\r\n\r\nexport class DriftstoneHTTPError extends DriftstoneError {\r\n override name = \"DriftstoneHTTPError\";\r\n}\r\n\r\nexport class DriftstoneResponseError extends DriftstoneError {\r\n override name = \"DriftstoneResponseError\";\r\n}\r\n\r\nexport class DriftstoneAPIError extends DriftstoneError {\r\n override name = \"DriftstoneAPIError\";\r\n}\r\n","export const DEFAULT_API_BASE_URL =\r\n \"https://api.harnesslayer.ai\";\r\n\r\nexport const DEFAULT_DRIFTSTONE_API_BASE_URL = \"https://api.driftstone.ai\";\r\n\r\nexport const AVAILABLE_APP_TYPES = [\"claude\", \"openclaw\"] as const;\r\nexport const AVAILABLE_CHANNEL_TYPES = [\"api\", \"imessage\"] as const;\r\n","import { readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport {\r\n DriftstoneAPIError,\r\n DriftstoneError,\r\n DriftstoneHTTPError,\r\n DriftstoneResponseError,\r\n} from \"../errors.js\";\r\nimport { DEFAULT_DRIFTSTONE_API_BASE_URL } from \"./constants.js\";\r\nimport type { FetchLike, Method } from \"./transport.js\";\r\n\r\ninterface DriftstoneClientOptions {\r\n apiKey: string;\r\n version: \"v1\";\r\n timeoutMs: number;\r\n fetch?: FetchLike;\r\n baseUrl?: string;\r\n}\r\n\r\nexport interface DriftstoneRepository {\r\n id: string;\r\n orgId: string;\r\n name: string;\r\n slug: string;\r\n branch: string;\r\n}\r\n\r\nexport interface DriftstoneBranch {\r\n id: string;\r\n repoId: string;\r\n name: string;\r\n storagePath: string | null;\r\n runId: string | null;\r\n status: string | null;\r\n}\r\n\r\nexport interface DriftstoneCopy {\r\n repoId: string;\r\n runId: string;\r\n status: string;\r\n sourceDir: string | null;\r\n destDir: string | null;\r\n}\r\n\r\nexport interface DriftstoneCopyStatus {\r\n repoId: string;\r\n runId: string;\r\n status: string;\r\n result?: Record<string, unknown> | null;\r\n}\r\n\r\nexport interface DriftstoneUpload {\r\n repoId: string;\r\n uploadId: string;\r\n uploadUrls: Array<{ name: string; url: string }>;\r\n}\r\n\r\nexport interface UploadFilePayload {\r\n name: string;\r\n hash: string;\r\n}\r\n\r\nexport class DriftstoneClient {\r\n readonly repos: DriftstoneRepositories;\r\n\r\n private readonly baseUrl: string;\r\n private readonly headers: Record<string, string>;\r\n private readonly timeoutMs: number;\r\n private readonly fetchImpl: FetchLike;\r\n\r\n constructor(options: DriftstoneClientOptions) {\r\n const apiKey = options.apiKey.trim();\r\n if (!apiKey) throw new DriftstoneError(\"apiKey must be provided\");\r\n if (!apiKey.startsWith(\"dk-\")) throw new DriftstoneError(\"Invalid Driftstone API key\");\r\n\r\n this.baseUrl = `${(options.baseUrl ?? DEFAULT_DRIFTSTONE_API_BASE_URL).replace(/\\/+$/, \"\")}/${options.version}`;\r\n this.timeoutMs = options.timeoutMs;\r\n this.fetchImpl = options.fetch ?? fetch;\r\n this.headers = {\r\n Authorization: `Bearer ${apiKey}`,\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"User-Agent\": \"Harnesslayer-typescript/0.1.0\",\r\n };\r\n this.repos = new DriftstoneRepositories(this);\r\n }\r\n\r\n async request<T extends Record<string, unknown> = Record<string, unknown>>(\r\n method: Method,\r\n requestPath: string,\r\n payload: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\r\n\r\n try {\r\n const url = new URL(requestPath.replace(/^\\/+/, \"\"), `${this.baseUrl}/`);\r\n const init: RequestInit = {\r\n method,\r\n headers: this.headers,\r\n signal: controller.signal,\r\n };\r\n\r\n if (method === \"GET\") {\r\n for (const [key, value] of Object.entries(payload)) {\r\n if (value != null) url.searchParams.set(key, String(value));\r\n }\r\n } else if (Object.keys(payload).length) {\r\n init.body = JSON.stringify(payload);\r\n }\r\n\r\n const response = await this.fetchImpl(url, init);\r\n const data = await this.parseResponse(response);\r\n\r\n if (response.status >= 400) {\r\n throw new DriftstoneAPIError(\r\n `Driftstone API returned error status ${response.status}: ${JSON.stringify(data)}`,\r\n );\r\n }\r\n if (data.success === false) {\r\n throw new DriftstoneAPIError(\r\n `Driftstone API error: ${String(data.error ?? data.message ?? \"Request failed\")}`,\r\n );\r\n }\r\n\r\n return data as T;\r\n } catch (error) {\r\n if (error instanceof DriftstoneAPIError || error instanceof DriftstoneResponseError) {\r\n throw error;\r\n }\r\n throw new DriftstoneHTTPError(\r\n `HTTP request failed: ${error instanceof Error ? error.message : String(error)}`,\r\n );\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n\r\n async uploadFile(url: string, filePath: string): Promise<boolean> {\r\n const trimmedUrl = url.trim();\r\n if (!trimmedUrl) throw new DriftstoneError(\"url must be a non-empty string\");\r\n\r\n const response = await this.fetchImpl(trimmedUrl, {\r\n method: \"PUT\",\r\n headers: { \"Content-Type\": \"application/octet-stream\" },\r\n body: await readFile(filePath),\r\n });\r\n\r\n if (response.status >= 400) {\r\n throw new DriftstoneHTTPError(`File upload failed with status ${response.status}`);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n async uploadFiles(\r\n upload: DriftstoneUpload,\r\n files: UploadFilePayload[],\r\n root: string,\r\n ): Promise<boolean> {\r\n const uploadUrls = new Map(upload.uploadUrls.map((item) => [item.name, item.url]));\r\n const rootPath = path.resolve(root);\r\n\r\n for (const file of files) {\r\n const url = uploadUrls.get(file.name);\r\n if (!url) throw new DriftstoneError(`Missing upload URL for file '${file.name}'`);\r\n\r\n const filePath = path.resolve(rootPath, file.name);\r\n if (filePath !== rootPath && !filePath.startsWith(`${rootPath}${path.sep}`)) {\r\n throw new DriftstoneError(`file path must stay within root: ${file.name}`);\r\n }\r\n await this.uploadFile(url, filePath);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private async parseResponse(response: Response): Promise<Record<string, unknown>> {\r\n let decoded: unknown;\r\n try {\r\n decoded = await response.json();\r\n } catch {\r\n throw new DriftstoneResponseError(\r\n `Driftstone API returned non-JSON response (status=${response.status})`,\r\n );\r\n }\r\n\r\n if (!decoded || typeof decoded !== \"object\" || Array.isArray(decoded)) {\r\n throw new DriftstoneResponseError(\"Driftstone API returned an unexpected response payload\");\r\n }\r\n return decoded as Record<string, unknown>;\r\n }\r\n}\r\n\r\nexport class DriftstoneRepositories {\r\n constructor(private readonly client: DriftstoneClient) {}\r\n\r\n async create(name: string): Promise<DriftstoneRepository> {\r\n const response = await this.client.request(\"POST\", \"/repos\", { name: requireDriftstoneString(name, \"name\") });\r\n return repositoryFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async get(repo: string): Promise<DriftstoneRepository> {\r\n const response = await this.client.request(\"GET\", `/repos/${encodeRepo(repo)}`);\r\n return repositoryFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async createBranch(\r\n repo: string,\r\n name: string,\r\n options: {\r\n storageDir: string;\r\n message?: string;\r\n transforms?: Record<string, unknown>;\r\n archive?: boolean;\r\n },\r\n ): Promise<DriftstoneBranch> {\r\n const payload: Record<string, unknown> = {\r\n name: requireRouteSegment(name, \"name\"),\r\n storageDir: requireRouteSegment(options.storageDir, \"storageDir\"),\r\n archive: options.archive ?? true,\r\n };\r\n if (options.message != null) payload.message = requireDriftstoneString(options.message, \"message\");\r\n if (options.transforms != null) payload.transforms = options.transforms;\r\n\r\n const response = await this.client.request(\"POST\", `/repos/${encodeRepo(repo)}/branches`, payload);\r\n return branchFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async createUpload(\r\n repo: string,\r\n options: { files: UploadFilePayload[]; storageDir: string; branch?: string },\r\n ): Promise<DriftstoneUpload> {\r\n const response = await this.client.request(\"POST\", `/repos/${encodeRepo(repo)}/uploads`, {\r\n branch: requireRouteSegment(options.branch ?? \"main\", \"branch\"),\r\n storageDir: requireRouteSegment(options.storageDir, \"storageDir\"),\r\n files: options.files,\r\n });\r\n return uploadFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async completeUpload(repo: string, uploadId: string): Promise<boolean> {\r\n await this.client.request(\r\n \"POST\",\r\n `/repos/${encodeRepo(repo)}/uploads/${requireRouteSegment(uploadId, \"uploadId\")}/complete`,\r\n );\r\n return true;\r\n }\r\n\r\n async copyDirectory(\r\n repo: string,\r\n options: {\r\n sourceDir: string;\r\n destDir: string;\r\n sourceBranch?: string;\r\n destBranch?: string;\r\n transforms?: Record<string, unknown>;\r\n archive?: boolean;\r\n },\r\n ): Promise<DriftstoneCopy> {\r\n const response = await this.client.request(\"POST\", `/repos/${encodeRepo(repo)}/copies`, {\r\n sourceDir: requireRouteSegment(options.sourceDir, \"sourceDir\"),\r\n destDir: requireRouteSegment(options.destDir, \"destDir\"),\r\n sourceBranch: requireRouteSegment(options.sourceBranch ?? \"main\", \"sourceBranch\"),\r\n destBranch: requireRouteSegment(options.destBranch ?? \"main\", \"destBranch\"),\r\n transforms: options.transforms ?? {},\r\n archive: options.archive ?? true,\r\n });\r\n return copyFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async getCopyStatus(repo: string, runId: string): Promise<DriftstoneCopyStatus> {\r\n const response = await this.client.request(\r\n \"GET\",\r\n `/repos/${encodeRepo(repo)}/copies/${requireRouteSegment(runId, \"runId\")}`,\r\n );\r\n return copyStatusFromApi(response.data as Record<string, unknown>);\r\n }\r\n}\r\n\r\nfunction requireDriftstoneString(value: string, name: string): string {\r\n if (typeof value !== \"string\" || !value.trim()) {\r\n throw new DriftstoneError(`${name} must be a non-empty string`);\r\n }\r\n return value.trim();\r\n}\r\n\r\nfunction requireRouteSegment(value: string, name: string): string {\r\n const normalized = requireDriftstoneString(value, name);\r\n if (normalized.includes(\"/\") || normalized.includes(\"\\\\\")) {\r\n throw new DriftstoneError(`${name} cannot contain / or \\\\`);\r\n }\r\n return normalized;\r\n}\r\n\r\nfunction encodeRepo(repo: string): string {\r\n return encodeURIComponent(requireDriftstoneString(repo, \"repo\").replace(/^\\/+|\\/+$/g, \"\"));\r\n}\r\n\r\nfunction repositoryFromApi(payload: Record<string, unknown>): DriftstoneRepository {\r\n return {\r\n id: String(payload.id),\r\n orgId: String(payload.orgId),\r\n name: String(payload.name),\r\n slug: String(payload.slug),\r\n branch: String(payload.branch),\r\n };\r\n}\r\n\r\nfunction branchFromApi(payload: Record<string, unknown>): DriftstoneBranch {\r\n return {\r\n id: String(payload.id),\r\n repoId: String(payload.repoId),\r\n name: String(payload.name),\r\n storagePath: (payload.storagePath as string | null | undefined) ?? null,\r\n runId: (payload.runId as string | null | undefined) ?? null,\r\n status: (payload.status as string | null | undefined) ?? null,\r\n };\r\n}\r\n\r\nfunction copyFromApi(payload: Record<string, unknown>): DriftstoneCopy {\r\n return {\r\n repoId: String(payload.repoId),\r\n runId: String(payload.runId),\r\n status: String(payload.status),\r\n sourceDir: (payload.sourceDir as string | null | undefined) ?? null,\r\n destDir: (payload.destDir as string | null | undefined) ?? null,\r\n };\r\n}\r\n\r\nfunction copyStatusFromApi(payload: Record<string, unknown>): DriftstoneCopyStatus {\r\n return {\r\n repoId: String(payload.repoId),\r\n runId: String(payload.runId),\r\n status: String(payload.status),\r\n result:\r\n payload.result && typeof payload.result === \"object\" && !Array.isArray(payload.result)\r\n ? (payload.result as Record<string, unknown>)\r\n : null,\r\n };\r\n}\r\n\r\nfunction uploadFromApi(payload: Record<string, unknown>): DriftstoneUpload {\r\n const urls = Array.isArray(payload.uploadUrls) ? payload.uploadUrls : [];\r\n return {\r\n repoId: String(payload.repoId),\r\n uploadId: String(payload.uploadId),\r\n uploadUrls: urls\r\n .filter((item): item is Record<string, unknown> => Boolean(item) && typeof item === \"object\")\r\n .map((item) => ({ name: String(item.name), url: String(item.url) })),\r\n };\r\n}\r\n","import {\r\n HarnesslayerAPIError,\r\n HarnesslayerHTTPError,\r\n HarnesslayerResponseError,\r\n} from \"../errors.js\";\r\n\r\nexport type Method = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\r\nexport type FetchLike = typeof fetch;\r\n\r\nexport interface TransportOptions {\r\n baseUrl: string;\r\n apiKey: string;\r\n timeoutMs: number;\r\n userAgent: string;\r\n fetch?: FetchLike;\r\n}\r\n\r\nexport class Transport {\r\n readonly headers: Record<string, string>;\r\n readonly timeoutMs: number;\r\n\r\n private readonly baseUrl: string;\r\n private readonly fetchImpl: FetchLike;\r\n\r\n constructor(options: TransportOptions) {\r\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\r\n this.timeoutMs = options.timeoutMs;\r\n this.fetchImpl = options.fetch ?? fetch;\r\n this.headers = {\r\n Authorization: `Bearer ${options.apiKey}`,\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"User-Agent\": options.userAgent,\r\n };\r\n }\r\n\r\n async request<T extends Record<string, unknown> = Record<string, unknown>>(\r\n method: Method,\r\n path: string,\r\n payload: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const controller = new AbortController();\r\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\r\n\r\n try {\r\n const url = new URL(path.replace(/^\\/+/, \"\"), `${this.baseUrl}/`);\r\n const init: RequestInit = {\r\n method,\r\n headers: this.headers,\r\n signal: controller.signal,\r\n };\r\n\r\n if (method === \"GET\") {\r\n for (const [key, value] of Object.entries(payload)) {\r\n if (value != null) url.searchParams.set(key, String(value));\r\n }\r\n } else {\r\n init.body = JSON.stringify(payload);\r\n }\r\n\r\n const response = await this.fetchImpl(url, init);\r\n const data = await this.parseResponse(response);\r\n\r\n if (response.status >= 400) {\r\n throw new HarnesslayerAPIError(\r\n `Harnesslayer API returned error status ${response.status}: ${JSON.stringify(data)}`,\r\n );\r\n }\r\n\r\n if (data.success === false) {\r\n const message = String(data.error ?? data.message ?? \"Request failed\");\r\n throw new HarnesslayerAPIError(`Harnesslayer API error: ${message}`);\r\n }\r\n\r\n return data as T;\r\n } catch (error) {\r\n if (error instanceof HarnesslayerAPIError || error instanceof HarnesslayerResponseError) {\r\n throw error;\r\n }\r\n const message = error instanceof Error ? error.message : String(error);\r\n throw new HarnesslayerHTTPError(`HTTP request failed: ${message}`);\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n\r\n private async parseResponse(response: Response): Promise<Record<string, unknown>> {\r\n let decoded: unknown;\r\n try {\r\n decoded = await response.json();\r\n } catch (error) {\r\n throw new HarnesslayerResponseError(\r\n `Harnesslayer API returned non-JSON response (status=${response.status})`,\r\n );\r\n }\r\n\r\n if (!decoded || typeof decoded !== \"object\" || Array.isArray(decoded)) {\r\n throw new HarnesslayerResponseError(\r\n \"Harnesslayer API returned an unexpected response payload\",\r\n );\r\n }\r\n\r\n return decoded as Record<string, unknown>;\r\n }\r\n}\r\n","import { createHash, randomUUID } from \"node:crypto\";\r\nimport { readdir, readFile, stat } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { HarnesslayerError } from \"../errors.js\";\r\nimport type { ApplicationType, CloneTransform, CloneTransformValue } from \"../types.js\";\r\nimport { safeParseJson } from \"./utils.js\";\r\n\r\nconst IGNORED_PARTS = new Set([\"__MACOSX\"]);\r\n\r\nexport interface ConfigPathData {\r\n type: ApplicationType;\r\n path: string;\r\n}\r\n\r\nexport interface UploadFilePayload {\r\n name: string;\r\n hash: string;\r\n}\r\n\r\nexport function newVersionId(): string {\r\n return `ver-${randomUUID()}`;\r\n}\r\n\r\nexport function newStateId(): string {\r\n return `state-${randomUUID()}`;\r\n}\r\n\r\nexport function validateCloneTransform(transform?: CloneTransform | null): CloneTransform {\r\n if (transform == null) return {};\r\n if (!transform || typeof transform !== \"object\" || Array.isArray(transform)) {\r\n throw new HarnesslayerError(\"transform must be an object\");\r\n }\r\n\r\n const normalized: CloneTransform = {};\r\n for (const [filePath, patch] of Object.entries(transform)) {\r\n if (!filePath.trim()) {\r\n throw new HarnesslayerError(\"transform keys must be non-empty strings\");\r\n }\r\n\r\n const normalizedPath = filePath.trim().replace(/\\\\/g, \"/\");\r\n if (normalizedPath.startsWith(\"/\") || normalizedPath.split(\"/\").includes(\"..\")) {\r\n throw new HarnesslayerError(`Invalid transform file path: ${filePath}`);\r\n }\r\n\r\n const lower = normalizedPath.toLowerCase();\r\n if (lower.endsWith(\".json\")) {\r\n if (!patch || typeof patch !== \"object\" || Array.isArray(patch)) {\r\n throw new HarnesslayerError(`transform['${filePath}'] must be a JSON object patch`);\r\n }\r\n } else if (lower.endsWith(\".md\")) {\r\n if (typeof patch !== \"string\") {\r\n throw new HarnesslayerError(`transform['${filePath}'] must be Markdown string content`);\r\n }\r\n } else {\r\n throw new HarnesslayerError(`transform target must be a .json or .md file: ${filePath}`);\r\n }\r\n\r\n normalized[normalizedPath] = patch as CloneTransformValue;\r\n }\r\n\r\n return normalized;\r\n}\r\n\r\nexport async function validateConfigPath(configPath: string): Promise<ConfigPathData> {\r\n const root = path.resolve(configPath);\r\n const rootStat = await stat(root).catch(() => null);\r\n if (!rootStat) throw new HarnesslayerError(`Config path does not exist: ${root}`);\r\n if (!rootStat.isDirectory()) throw new HarnesslayerError(`Config path must be a directory: ${root}`);\r\n\r\n const basename = path.basename(configPath);\r\n if (basename.endsWith(\".claude\")) {\r\n await validateClaudeConfigPath(root);\r\n return { type: \"claude\", path: root };\r\n }\r\n\r\n if (basename.endsWith(\".openclaw\")) {\r\n await validateOpenClawConfigPath(root);\r\n return { type: \"openclaw\", path: root };\r\n }\r\n\r\n throw new HarnesslayerError(`Config path must end with .claude or .openclaw: ${configPath}`);\r\n}\r\n\r\nexport async function createUploadFilesPayload(root: string): Promise<UploadFilePayload[]> {\r\n const files: UploadFilePayload[] = [];\r\n const rootPath = path.resolve(root);\r\n\r\n async function walk(directory: string): Promise<void> {\r\n const entries = await readdir(directory, { withFileTypes: true });\r\n entries.sort((a, b) => a.name.localeCompare(b.name));\r\n\r\n for (const entry of entries) {\r\n if (IGNORED_PARTS.has(entry.name)) continue;\r\n const absolute = path.join(directory, entry.name);\r\n const relative = path.relative(rootPath, absolute).split(path.sep).join(\"/\");\r\n if (relative.split(\"/\").some((part) => IGNORED_PARTS.has(part))) continue;\r\n\r\n if (entry.isDirectory()) {\r\n await walk(absolute);\r\n } else if (entry.isFile()) {\r\n const bytes = await readFile(absolute);\r\n files.push({\r\n name: relative,\r\n hash: createHash(\"sha256\").update(bytes).digest(\"hex\"),\r\n });\r\n }\r\n }\r\n }\r\n\r\n await walk(rootPath);\r\n\r\n if (!files.length) {\r\n throw new HarnesslayerError(`Config path contains no files to upload: ${rootPath}`);\r\n }\r\n\r\n return files;\r\n}\r\n\r\nasync function validateClaudeConfigPath(root: string): Promise<void> {\r\n await requireFile(path.join(root, \"agent.json\"), `Invalid Agent config path: missing agent.json in '${root}'`);\r\n await requireFile(\r\n path.join(root, \"environment.json\"),\r\n `Invalid Agent config path: missing environment.json in '${root}'`,\r\n );\r\n\r\n const agentJson = safeParseJson(await readFile(path.join(root, \"agent.json\"), \"utf8\"));\r\n if (!agentJson || typeof agentJson !== \"object\" || Array.isArray(agentJson)) {\r\n throw new HarnesslayerError(\"agent.json is not a valid JSON object\");\r\n }\r\n\r\n const skills = (agentJson as { skills?: unknown }).skills;\r\n if (Array.isArray(skills)) {\r\n for (const skill of skills) {\r\n if (!skill || typeof skill !== \"object\" || !(\"type\" in skill)) {\r\n throw new HarnesslayerError(\"Each skill in agent.json must be an object with a 'name' field\");\r\n }\r\n if ((skill as { type?: unknown }).type !== \"anthropic\") {\r\n throw new HarnesslayerError(\r\n \"Only skills of type 'anthropic' are supported in agent.json, if you want custom skills you must add them as a folder under 'skills' directory\",\r\n );\r\n }\r\n }\r\n }\r\n\r\n const entries = await readdir(root, { withFileTypes: true });\r\n for (const entry of entries) {\r\n if (IGNORED_PARTS.has(entry.name)) continue;\r\n if (entry.isDirectory() && entry.name !== \"skills\") {\r\n throw new HarnesslayerError(`Invalid Agent config path: unexpected subdirectory '${entry.name}' in '${root}'`);\r\n }\r\n if (entry.isFile() && ![\"agent.json\", \"environment.json\"].includes(entry.name)) {\r\n throw new HarnesslayerError(`Invalid Agent config path: unexpected file '${entry.name}' in '${root}'`);\r\n }\r\n }\r\n\r\n const skillsDir = path.join(root, \"skills\");\r\n const skillsStat = await stat(skillsDir).catch(() => null);\r\n if (!skillsStat?.isDirectory()) return;\r\n\r\n const skillEntries = await readdir(skillsDir, { withFileTypes: true });\r\n for (const skillEntry of skillEntries) {\r\n if (IGNORED_PARTS.has(skillEntry.name)) continue;\r\n if (!skillEntry.isDirectory()) {\r\n throw new HarnesslayerError(`Invalid Agent config path: skill '${skillEntry.name}' is not a directory in '${root}'`);\r\n }\r\n await requireFile(\r\n path.join(skillsDir, skillEntry.name, \"SKILL.md\"),\r\n `Invalid Agent config path: missing SKILL.md in skill '${skillEntry.name}' in '${root}'`,\r\n );\r\n }\r\n}\r\n\r\nasync function validateOpenClawConfigPath(root: string): Promise<void> {\r\n await requireFile(\r\n path.join(root, \"openclaw.json\"),\r\n `Invalid OpenClaw config path: missing openclaw.json in '${root}'`,\r\n );\r\n}\r\n\r\nasync function requireFile(filePath: string, message: string): Promise<void> {\r\n const fileStat = await stat(filePath).catch(() => null);\r\n if (!fileStat?.isFile()) throw new HarnesslayerError(message);\r\n}\r\n","export function safeParseJson(value: unknown): unknown {\r\n if (typeof value !== \"string\") return value;\r\n\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport function parseDate(value: unknown, field: string): Date {\r\n if (value instanceof Date) return value;\r\n if (typeof value === \"string\" || typeof value === \"number\") {\r\n const date = new Date(value);\r\n if (!Number.isNaN(date.getTime())) return date;\r\n }\r\n throw new TypeError(`Expected ${field} to be a date-compatible value`);\r\n}\r\n\r\nexport function parseOptionalDate(value: unknown, field: string): Date | null {\r\n if (value == null) return null;\r\n return parseDate(value, field);\r\n}\r\n\r\nexport function requireRecord(value: unknown, label: string): Record<string, unknown> {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\r\n throw new TypeError(`Expected ${label} to be an object`);\r\n }\r\n return value as Record<string, unknown>;\r\n}\r\n\r\nexport function sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function isRecord(value: unknown): value is Record<string, unknown> {\r\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n","import type {\r\n HarnesslayerAccessGroupModel,\r\n HarnesslayerAppModel,\r\n HarnesslayerChannelModel,\r\n HarnesslayerConflictModel,\r\n HarnesslayerInstanceModel,\r\n HarnesslayerMessageModel,\r\n HarnesslayerOrganizationModel,\r\n HarnesslayerProfileModel,\r\n HarnesslayerSessionModel,\r\n HarnesslayerStateModel,\r\n HarnesslayerSyncModel,\r\n HarnesslayerVersionModel,\r\n ResponseRunStreamEvent,\r\n} from \"./types.js\";\r\nimport { parseDate, parseOptionalDate } from \"./internal/utils.js\";\r\nimport type { HarnesslayerAccessGroup } from \"./resources/access-group.js\";\r\nimport type { HarnesslayerChannel } from \"./resources/channel.js\";\r\nimport type { HarnesslayerConflict } from \"./resources/conflict.js\";\r\nimport type { HarnesslayerInstance } from \"./resources/instance.js\";\r\nimport type { HarnesslayerProfile } from \"./resources/profile.js\";\r\nimport type { HarnesslayerSession } from \"./resources/session.js\";\r\nimport type { HarnesslayerState } from \"./resources/state.js\";\r\nimport type { HarnesslayerVersion } from \"./resources/version.js\";\r\n\r\ntype ApiPayload = Record<string, any>;\r\n\r\nexport function accessGroupFromApi(payload: ApiPayload): HarnesslayerAccessGroupModel {\r\n return {\r\n id: String(payload.id),\r\n appId: String(payload.appId),\r\n name: String(payload.name),\r\n limit: Number(payload.limit),\r\n limitReset: payload.limitReset,\r\n limitMessage: String(payload.limitMessage),\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n };\r\n}\r\n\r\nexport function appFromApi(\r\n payload: ApiPayload,\r\n resources: {\r\n version: HarnesslayerVersion;\r\n channel: HarnesslayerChannel;\r\n session: HarnesslayerSession;\r\n accessGroup: HarnesslayerAccessGroup;\r\n profile: HarnesslayerProfile;\r\n instance: HarnesslayerInstance;\r\n conflict: HarnesslayerConflict;\r\n },\r\n): HarnesslayerAppModel {\r\n return {\r\n id: String(payload.id),\r\n orgId: String(payload.orgId),\r\n type: payload.type,\r\n name: String(payload.name),\r\n slug: String(payload.slug),\r\n vaultId: payload.vaultId ?? null,\r\n defaultAccessGroupId: payload.defaultAccessGroupId ?? null,\r\n headVersionId: payload.headVersionId ?? null,\r\n metadata: payload.metadata ?? null,\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n ...resources,\r\n access_group: resources.accessGroup,\r\n };\r\n}\r\n\r\nexport function channelFromApi(\r\n payload: ApiPayload,\r\n run: (channelId: string, options: Omit<ResponseRunStreamEvent, \"instanceId\" | \"index\" | \"data\"> & any) => AsyncIterable<ResponseRunStreamEvent>,\r\n): HarnesslayerChannelModel {\r\n const channelId = String(payload.id);\r\n return {\r\n id: channelId,\r\n appId: String(payload.appId),\r\n type: payload.type,\r\n slug: String(payload.slug),\r\n name: String(payload.name),\r\n webhook: payload.webhook ?? null,\r\n data: payload.data ?? null,\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n run: (options) => run(channelId, options),\r\n };\r\n}\r\n\r\nexport function organizationFromApi(payload: ApiPayload): HarnesslayerOrganizationModel {\r\n return {\r\n id: String(payload.id),\r\n name: String(payload.name),\r\n slug: String(payload.slug),\r\n createdBy: String(payload.createdBy),\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n };\r\n}\r\n\r\nexport function profileFromApi(\r\n payload: ApiPayload,\r\n state: HarnesslayerState,\r\n): HarnesslayerProfileModel {\r\n return {\r\n id: String(payload.id),\r\n appId: String(payload.appId),\r\n identifier: String(payload.identifier),\r\n currentSpending: Number(payload.currentSpending),\r\n totalSpending: Number(payload.totalSpending),\r\n metadata: payload.metadata ?? null,\r\n headStateId: payload.headStateId ?? null,\r\n initialChannelId: payload.initialChannelId ?? null,\r\n accessGroupId: payload.accessGroupId ?? null,\r\n lastResetAt: parseOptionalDate(payload.lastResetAt, \"lastResetAt\"),\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n state,\r\n };\r\n}\r\n\r\nexport function sessionFromApi(payload: ApiPayload): HarnesslayerSessionModel {\r\n return {\r\n id: String(payload.id),\r\n appId: String(payload.appId),\r\n type: payload.type,\r\n userIds: Array.isArray(payload.userIds) ? payload.userIds.map(String) : [],\r\n profileIds: Array.isArray(payload.profileIds) ? payload.profileIds.map(String) : [],\r\n metadata: payload.metadata ?? null,\r\n externalId: payload.externalId ?? null,\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n };\r\n}\r\n\r\nexport function instanceFromApi(payload: ApiPayload): HarnesslayerInstanceModel {\r\n return {\r\n id: String(payload.id),\r\n appId: String(payload.appId),\r\n versionId: String(payload.versionId),\r\n channelId: String(payload.channelId),\r\n sessionId: String(payload.sessionId),\r\n profileId: String(payload.profileId),\r\n accessGroupId: String(payload.accessGroupId),\r\n stateId: payload.stateId ?? null,\r\n identifier: String(payload.identifier),\r\n timeout: Number(payload.timeout),\r\n totalCost: Number(payload.totalCost),\r\n costBreakdown: payload.costBreakdown ?? {},\r\n tokenBreakdown: payload.tokenBreakdown ?? {},\r\n metadata: payload.metadata ?? null,\r\n status: payload.status,\r\n error: payload.error ?? null,\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n };\r\n}\r\n\r\nexport function conflictFromApi(payload: ApiPayload): HarnesslayerConflictModel {\r\n return {\r\n id: String(payload.id),\r\n appId: String(payload.appId),\r\n syncId: String(payload.syncId),\r\n profileId: String(payload.profileId),\r\n versionId: String(payload.versionId),\r\n stateId: String(payload.stateId),\r\n stateBranch: String(payload.stateBranch),\r\n reason: payload.reason,\r\n error: payload.error ?? null,\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n };\r\n}\r\n\r\nexport function messageFromApi(payload: ApiPayload): HarnesslayerMessageModel {\r\n return {\r\n id: String(payload.id),\r\n appId: String(payload.appId),\r\n sessionId: String(payload.sessionId),\r\n historyId: payload.historyId ?? null,\r\n type: payload.type,\r\n parts: Array.isArray(payload.parts) ? payload.parts : [],\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n };\r\n}\r\n\r\nexport function stateFromApi(payload: ApiPayload): HarnesslayerStateModel {\r\n return {\r\n id: String(payload.id),\r\n appId: String(payload.appId),\r\n profileId: String(payload.profileId),\r\n version: Number(payload.version),\r\n baseVersionId: payload.baseVersionId ?? null,\r\n baseStateId: payload.baseStateId ?? null,\r\n storageUrl: String(payload.storageUrl),\r\n downloadUrl: String(payload.downloadUrl),\r\n map: payload.map ?? null,\r\n metadata: payload.metadata ?? null,\r\n status: payload.status ?? null,\r\n snapshotStorageUrl: payload.snapshotStorageUrl ?? null,\r\n sandboxId: payload.sandboxId ?? null,\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n };\r\n}\r\n\r\nexport function versionFromApi(payload: ApiPayload): HarnesslayerVersionModel {\r\n return {\r\n id: String(payload.id),\r\n appId: String(payload.appId),\r\n version: Number(payload.version),\r\n storageUrl: String(payload.storageUrl),\r\n downloadUrl: String(payload.downloadUrl),\r\n map: payload.map ?? null,\r\n metadata: payload.metadata ?? null,\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n };\r\n}\r\n\r\nexport function syncFromApi(payload: ApiPayload): HarnesslayerSyncModel {\r\n return {\r\n id: String(payload.id),\r\n appId: String(payload.appId),\r\n versionId: String(payload.versionId),\r\n status: payload.status,\r\n dispatchingChunks: Boolean(payload.dispatchingChunks),\r\n totalChunks: Number(payload.totalChunks ?? 0),\r\n pendingChunks: Number(payload.pendingChunks ?? 0),\r\n failedChunks: Number(payload.failedChunks ?? 0),\r\n profilesExpected: Number(payload.profilesExpected ?? 0),\r\n profilesTotal: Number(payload.profilesTotal ?? 0),\r\n profilesMerged: Number(payload.profilesMerged ?? 0),\r\n profilesSkipped: Number(payload.profilesSkipped ?? 0),\r\n profilesConflicted: Number(payload.profilesConflicted ?? 0),\r\n error: payload.error ?? null,\r\n createdAt: parseDate(payload.createdAt, \"createdAt\"),\r\n updatedAt: parseDate(payload.updatedAt, \"updatedAt\"),\r\n };\r\n}\r\n","import { HarnesslayerError } from \"../errors.js\";\r\n\r\nexport function requireNonEmptyString(value: unknown, name: string): string {\r\n if (typeof value !== \"string\" || !value.trim()) {\r\n throw new HarnesslayerError(`${name} must be a non-empty string`);\r\n }\r\n return value.trim();\r\n}\r\n\r\nexport function optionalNonEmptyString(\r\n value: unknown,\r\n name: string,\r\n): string | undefined {\r\n if (value == null) return undefined;\r\n return requireNonEmptyString(value, name);\r\n}\r\n\r\nexport function validateSlug(slug: unknown): string {\r\n const trimmedSlug = requireNonEmptyString(slug, \"slug\");\r\n\r\n if (![...trimmedSlug].every((char) => /[A-Za-z0-9_-]/.test(char))) {\r\n throw new HarnesslayerError(\r\n \"slug must be URL-safe (only contain letters, numbers, hyphens, and underscores)\",\r\n );\r\n }\r\n\r\n if (/^[-_]|[-_]$/.test(trimmedSlug)) {\r\n throw new HarnesslayerError(\"slug cannot start or end with a hyphen or underscore\");\r\n }\r\n\r\n return trimmedSlug;\r\n}\r\n\r\nexport function validatePositiveInteger(value: unknown, name: string): number {\r\n if (!Number.isInteger(value) || (value as number) < 1) {\r\n throw new HarnesslayerError(`${name} must be a positive integer`);\r\n }\r\n return value as number;\r\n}\r\n\r\nexport function ensureObject(value: unknown, name: string): Record<string, unknown> {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\r\n throw new HarnesslayerError(`${name} must be an object`);\r\n }\r\n return value as Record<string, unknown>;\r\n}\r\n\r\nexport function ensureStringMap(\r\n value: unknown,\r\n name: string,\r\n): Record<string, string> {\r\n const object = ensureObject(value, name);\r\n for (const [key, item] of Object.entries(object)) {\r\n if (typeof key !== \"string\" || typeof item !== \"string\") {\r\n throw new HarnesslayerError(`${name} must be an object of string keys and values`);\r\n }\r\n }\r\n return object as Record<string, string>;\r\n}\r\n","import type { Harnesslayer } from \"../client.js\";\r\nimport type { DriftstoneClient } from \"../internal/driftstone.js\";\r\n\r\nexport class ResourceBase {\r\n protected readonly client: Harnesslayer;\r\n protected readonly driftstone: DriftstoneClient;\r\n\r\n constructor(client: Harnesslayer) {\r\n this.client = client;\r\n this.driftstone = client.driftstone;\r\n }\r\n}\r\n\r\nexport class AppBase extends ResourceBase {\r\n protected readonly appId: string;\r\n\r\n constructor(client: Harnesslayer, appId: string) {\r\n super(client);\r\n this.appId = appId;\r\n }\r\n}\r\n\r\nexport class ProfileBase extends AppBase {\r\n protected readonly profileId: string;\r\n\r\n constructor(client: Harnesslayer, appId: string, profileId: string) {\r\n super(client, appId);\r\n this.profileId = profileId;\r\n }\r\n}\r\n","import {\r\n HarnesslayerAPIError,\r\n HarnesslayerError,\r\n HarnesslayerHTTPError,\r\n HarnesslayerResponseError,\r\n} from \"../errors.js\";\r\nimport { accessGroupFromApi } from \"../models.js\";\r\nimport type { AccessGroupLimitReset, HarnesslayerAccessGroupModel } from \"../types.js\";\r\nimport { requireNonEmptyString, validatePositiveInteger } from \"../internal/validation.js\";\r\nimport { AppBase } from \"./base.js\";\r\n\r\nexport class HarnesslayerAccessGroup extends AppBase {\r\n async create(\r\n name: string,\r\n limit: number,\r\n options: { limitReset: AccessGroupLimitReset; limitMessage?: string } = {} as any,\r\n ): Promise<HarnesslayerAccessGroupModel> {\r\n const limitReset = options.limitReset;\r\n if (![\"daily\", \"monthly\", \"yearly\"].includes(limitReset)) {\r\n throw new HarnesslayerError(\"limitReset must be one of 'daily', 'monthly', or 'yearly'\");\r\n }\r\n if (options.limitMessage != null && typeof options.limitMessage !== \"string\") {\r\n throw new HarnesslayerError(\"limitMessage must be a string\");\r\n }\r\n\r\n const payload: Record<string, unknown> = {\r\n appId: this.appId,\r\n name: requireNonEmptyString(name, \"name\"),\r\n limit: validatePositiveInteger(limit, \"limit\"),\r\n limitReset,\r\n };\r\n if (options.limitMessage != null) payload.limitMessage = options.limitMessage;\r\n\r\n const response = await this.client.request(\"POST\", \"/access_group/create\", payload);\r\n return accessGroupFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async retrieve(accessGroupId: string): Promise<HarnesslayerAccessGroupModel | null> {\r\n try {\r\n const id = requireNonEmptyString(accessGroupId, \"accessGroupId\");\r\n const response = await this.client.request(\"GET\", `/access_group/${id}`);\r\n return accessGroupFromApi(response.data as Record<string, unknown>);\r\n } catch (error) {\r\n if (\r\n error instanceof HarnesslayerAPIError ||\r\n error instanceof HarnesslayerHTTPError ||\r\n error instanceof HarnesslayerResponseError\r\n ) {\r\n throw error;\r\n }\r\n if (error instanceof HarnesslayerError) return null;\r\n throw error;\r\n }\r\n }\r\n\r\n async update(\r\n accessGroupId: string,\r\n options: {\r\n name?: string;\r\n limit?: number;\r\n limitReset?: AccessGroupLimitReset;\r\n limitMessage?: string;\r\n },\r\n ): Promise<HarnesslayerAccessGroupModel> {\r\n const id = requireNonEmptyString(accessGroupId, \"accessGroupId\");\r\n const payload: Record<string, unknown> = {};\r\n\r\n if (options.name != null) payload.name = requireNonEmptyString(options.name, \"name\");\r\n if (options.limit != null) payload.limit = validatePositiveInteger(options.limit, \"limit\");\r\n if (options.limitReset != null) {\r\n if (![\"daily\", \"monthly\", \"yearly\"].includes(options.limitReset)) {\r\n throw new HarnesslayerError(\"limitReset must be one of 'daily', 'monthly', or 'yearly'\");\r\n }\r\n payload.limitReset = options.limitReset;\r\n }\r\n if (options.limitMessage != null) {\r\n if (typeof options.limitMessage !== \"string\") throw new HarnesslayerError(\"limitMessage must be a string\");\r\n payload.limitMessage = options.limitMessage;\r\n }\r\n if (!Object.keys(payload).length) throw new HarnesslayerError(\"At least one field must be provided to update\");\r\n\r\n const response = await this.client.request(\"PATCH\", `/access_group/${id}`, payload);\r\n return accessGroupFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async list(options: { page?: number; pageSize?: number } = {}): Promise<HarnesslayerAccessGroupModel[]> {\r\n const response = await this.client.request(\"GET\", \"/access_group/list\", {\r\n appId: this.appId,\r\n page: validatePositiveInteger(options.page ?? 1, \"page\"),\r\n pageSize: validatePositiveInteger(options.pageSize ?? 10, \"pageSize\"),\r\n });\r\n if (!Array.isArray(response.data)) {\r\n throw new HarnesslayerError(\"Expected 'data' to be a list in access group list response\");\r\n }\r\n return response.data.map((item) => accessGroupFromApi(item as Record<string, unknown>));\r\n }\r\n\r\n async delete(accessGroupId: string): Promise<boolean> {\r\n const id = requireNonEmptyString(accessGroupId, \"accessGroupId\");\r\n await this.client.request(\"DELETE\", `/access_group/${id}`);\r\n return true;\r\n }\r\n}\r\n","import { HarnesslayerError } from \"../errors.js\";\r\nimport { channelFromApi } from \"../models.js\";\r\nimport { safeParseJson, sleep } from \"../internal/utils.js\";\r\nimport { ensureStringMap, requireNonEmptyString, validateSlug } from \"../internal/validation.js\";\r\nimport type {\r\n ChannelAPIWebhook,\r\n ChannelIMessageData,\r\n ChannelRunOptions,\r\n ChannelType,\r\n HarnesslayerChannelModel,\r\n JsonObject,\r\n ResponseRunStreamEvent,\r\n} from \"../types.js\";\r\nimport { AppBase } from \"./base.js\";\r\n\r\nexport class HarnesslayerChannel extends AppBase {\r\n async init(\r\n slug: string,\r\n options:\r\n | { type: \"api\"; name?: string; webhook?: ChannelAPIWebhook; data?: never }\r\n | { type: \"imessage\"; name?: string; webhook?: never; data: ChannelIMessageData },\r\n ): Promise<HarnesslayerChannelModel> {\r\n const payload: Record<string, unknown> = {\r\n appId: this.appId,\r\n type: options.type,\r\n slug: validateSlug(slug),\r\n returnIfExist: true,\r\n };\r\n\r\n if (![\"api\", \"imessage\"].includes(options.type)) {\r\n throw new HarnesslayerError(\"type must be either 'api' or 'imessage'\");\r\n }\r\n if (options.name != null) payload.name = requireNonEmptyString(options.name, \"name\");\r\n\r\n if (options.type === \"api\") {\r\n if (options.webhook != null) {\r\n this.validateWebhook(options.webhook);\r\n payload.webhook = options.webhook;\r\n }\r\n } else {\r\n this.validateIMessageData(options.data);\r\n payload.data = options.data;\r\n }\r\n\r\n const response = await this.client.request(\"POST\", \"/channel/create\", payload);\r\n return channelFromApi(response.data as Record<string, unknown>, (channelId, runOptions) =>\r\n this.run(channelId, runOptions),\r\n );\r\n }\r\n\r\n async *run(\r\n channelId: string,\r\n options: ChannelRunOptions,\r\n ): AsyncIterable<ResponseRunStreamEvent> {\r\n const id = requireNonEmptyString(channelId, \"channelId\");\r\n const userId = requireNonEmptyString(options.userId, \"userId\");\r\n const input = options.input ?? \"\";\r\n if (typeof input !== \"string\") throw new HarnesslayerError(\"input must be a string\");\r\n if (options.images != null && !Array.isArray(options.images)) throw new HarnesslayerError(\"images must be a list\");\r\n\r\n const channel = await this.client.request(\"GET\", `/channel/${id}`);\r\n const data = channel.data as { type?: ChannelType };\r\n if (data.type === \"imessage\") {\r\n throw new HarnesslayerError(\"You must text the iMessage number directly to trigger the channel\");\r\n }\r\n\r\n const payload: Record<string, unknown> = {\r\n appId: this.appId,\r\n channelId: id,\r\n sessionId: options.sessionId ?? null,\r\n userId,\r\n input,\r\n };\r\n if (options.images?.length) payload.images = options.images;\r\n\r\n const runResponse = await this.client.request(\"POST\", \"/response/run\", payload);\r\n const instanceId = String((runResponse.data as { instanceId: string }).instanceId);\r\n\r\n let nextIndex = 0;\r\n let backoff = 150;\r\n while (true) {\r\n const poll = await this.client.request(\"GET\", `/response/poll/${instanceId}`, {\r\n after: nextIndex,\r\n timeoutMs: 25000,\r\n });\r\n const pollData = poll.data as { status?: string; events?: Array<Record<string, unknown>> };\r\n const status = pollData.status ?? \"running\";\r\n const events = Array.isArray(pollData.events) ? pollData.events : [];\r\n\r\n for (const event of events) {\r\n const index = Number(event.index);\r\n if (index < nextIndex) continue;\r\n nextIndex = index + 1;\r\n yield {\r\n instanceId,\r\n index,\r\n data: safeParseJson(event.data) ?? { type: \"unknown\" },\r\n done: status !== \"running\",\r\n error: (event.error as string | null | undefined) ?? null,\r\n };\r\n }\r\n\r\n if (status !== \"running\") return;\r\n if (events.length) {\r\n backoff = 150;\r\n } else {\r\n await sleep(backoff);\r\n backoff = Math.min(backoff * 1.5, 1500);\r\n }\r\n }\r\n }\r\n\r\n private validateWebhook(webhook: ChannelAPIWebhook): void {\r\n if (!webhook || typeof webhook !== \"object\" || Array.isArray(webhook)) {\r\n throw new HarnesslayerError(\"webhook must be an object with 'name', 'url', and optional 'headers'\");\r\n }\r\n requireNonEmptyString(webhook.name, \"webhook.name\");\r\n requireNonEmptyString(webhook.url, \"webhook.url\");\r\n if (webhook.headers != null) ensureStringMap(webhook.headers, \"webhook.headers\");\r\n }\r\n\r\n private validateIMessageData(data: ChannelIMessageData): void {\r\n if (!data || typeof data !== \"object\" || Array.isArray(data)) {\r\n throw new HarnesslayerError(\"data must be an object with iMessage credentials\");\r\n }\r\n for (const field of [\"sendBlueAPIKey\", \"sendBlueSecretKey\", \"fromNumber\"] as const) {\r\n requireNonEmptyString(data[field], `data.${field}`);\r\n }\r\n }\r\n}\r\n","import {\r\n HarnesslayerAPIError,\r\n HarnesslayerError,\r\n HarnesslayerHTTPError,\r\n HarnesslayerResponseError,\r\n} from \"../errors.js\";\r\nimport { conflictFromApi } from \"../models.js\";\r\nimport type { HarnesslayerConflictModel } from \"../types.js\";\r\nimport { requireNonEmptyString, validatePositiveInteger } from \"../internal/validation.js\";\r\nimport { AppBase } from \"./base.js\";\r\n\r\nexport class HarnesslayerConflict extends AppBase {\r\n async retrieve(conflictId: string): Promise<HarnesslayerConflictModel | null> {\r\n try {\r\n const response = await this.client.request(\"GET\", `/conflict/${requireNonEmptyString(conflictId, \"conflictId\")}`);\r\n return conflictFromApi(response.data as Record<string, unknown>);\r\n } catch (error) {\r\n if (\r\n error instanceof HarnesslayerAPIError ||\r\n error instanceof HarnesslayerHTTPError ||\r\n error instanceof HarnesslayerResponseError\r\n ) {\r\n throw error;\r\n }\r\n if (error instanceof HarnesslayerError) return null;\r\n throw error;\r\n }\r\n }\r\n\r\n async list(options: { page?: number; pageSize?: number } = {}): Promise<HarnesslayerConflictModel[]> {\r\n const response = await this.client.request(\"GET\", \"/conflict/list\", {\r\n appId: this.appId,\r\n page: validatePositiveInteger(options.page ?? 1, \"page\"),\r\n pageSize: validatePositiveInteger(options.pageSize ?? 10, \"pageSize\"),\r\n });\r\n if (!Array.isArray(response.data)) throw new HarnesslayerError(\"Expected 'data' to be a list in conflict list response\");\r\n return response.data.map((item) => conflictFromApi(item as Record<string, unknown>));\r\n }\r\n}\r\n","import {\r\n HarnesslayerAPIError,\r\n HarnesslayerError,\r\n HarnesslayerHTTPError,\r\n HarnesslayerResponseError,\r\n} from \"../errors.js\";\r\nimport { instanceFromApi } from \"../models.js\";\r\nimport type { HarnesslayerInstanceModel } from \"../types.js\";\r\nimport { requireNonEmptyString, validatePositiveInteger } from \"../internal/validation.js\";\r\nimport { AppBase } from \"./base.js\";\r\n\r\nexport class HarnesslayerInstance extends AppBase {\r\n async retrieve(instanceId: string): Promise<HarnesslayerInstanceModel | null> {\r\n try {\r\n const response = await this.client.request(\"GET\", `/instance/${requireNonEmptyString(instanceId, \"instanceId\")}`);\r\n return instanceFromApi(response.data as Record<string, unknown>);\r\n } catch (error) {\r\n if (\r\n error instanceof HarnesslayerAPIError ||\r\n error instanceof HarnesslayerHTTPError ||\r\n error instanceof HarnesslayerResponseError\r\n ) {\r\n throw error;\r\n }\r\n if (error instanceof HarnesslayerError) return null;\r\n throw error;\r\n }\r\n }\r\n\r\n async list(options: { page?: number; pageSize?: number } = {}): Promise<HarnesslayerInstanceModel[]> {\r\n const response = await this.client.request(\"GET\", \"/instance/list\", {\r\n appId: this.appId,\r\n page: validatePositiveInteger(options.page ?? 1, \"page\"),\r\n pageSize: validatePositiveInteger(options.pageSize ?? 10, \"pageSize\"),\r\n });\r\n if (!Array.isArray(response.data)) throw new HarnesslayerError(\"Expected 'data' to be a list in instance list response\");\r\n return response.data.map((item) => instanceFromApi(item as Record<string, unknown>));\r\n }\r\n}\r\n","import { mkdir, writeFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { unzipSync } from \"fflate\";\r\nimport { HarnesslayerError } from \"../errors.js\";\r\n\r\nexport async function extractZip(bytes: Uint8Array, outPath: string): Promise<void> {\r\n const outDir = path.resolve(outPath);\r\n const entries = unzipSync(bytes);\r\n\r\n for (const [entryName, data] of Object.entries(entries)) {\r\n const target = path.resolve(outDir, entryName);\r\n if (target !== outDir && !target.startsWith(`${outDir}${path.sep}`)) {\r\n throw new HarnesslayerError(`Archive entry escapes output directory: ${entryName}`);\r\n }\r\n if (entryName.endsWith(\"/\")) {\r\n await mkdir(target, { recursive: true });\r\n continue;\r\n }\r\n await mkdir(path.dirname(target), { recursive: true });\r\n await writeFile(target, data);\r\n }\r\n}\r\n","import { HarnesslayerAPIError, HarnesslayerError, HarnesslayerResponseError } from \"../errors.js\";\r\nimport {\r\n createUploadFilesPayload,\r\n newStateId,\r\n validateCloneTransform,\r\n validateConfigPath,\r\n} from \"../internal/config.js\";\r\nimport { extractZip } from \"../internal/zip.js\";\r\nimport { sleep } from \"../internal/utils.js\";\r\nimport type { CloneTransform } from \"../types.js\";\r\nimport { ProfileBase } from \"./base.js\";\r\n\r\nexport class HarnesslayerState extends ProfileBase {\r\n async create(options: { stateId?: string; statePath?: string }): Promise<boolean> {\r\n if (!options.stateId && !options.statePath) {\r\n throw new HarnesslayerError(\"Either stateId or statePath must be provided\");\r\n }\r\n\r\n const payload: Record<string, unknown> = { profileId: this.profileId };\r\n if (options.stateId) {\r\n if (!options.stateId.startsWith(\"state-\")) throw new HarnesslayerError(\"stateId is invalid\");\r\n payload.stateId = options.stateId;\r\n } else if (options.statePath) {\r\n const stateId = newStateId();\r\n const pathData = await validateConfigPath(options.statePath);\r\n const files = await createUploadFilesPayload(pathData.path);\r\n const repo = await this.driftstone.repos.get(this.appId);\r\n const upload = await this.driftstone.repos.createUpload(repo.id, {\r\n branch: this.profileId,\r\n storageDir: stateId,\r\n files,\r\n });\r\n await this.driftstone.uploadFiles(upload, files, pathData.path);\r\n await this.driftstone.repos.completeUpload(repo.id, upload.uploadId);\r\n payload.stateId = stateId;\r\n }\r\n\r\n await this.client.request(\"POST\", \"/state/create\", payload);\r\n return true;\r\n }\r\n\r\n async download(outPath: string, stateId?: string): Promise<boolean> {\r\n const targetStateId = await this.resolveStateId(stateId);\r\n const response = await this.client.request(\"POST\", `/state/download/${targetStateId}`);\r\n const url = (response.data as { url?: unknown }).url;\r\n if (typeof url !== \"string\" || !url.trim()) throw new HarnesslayerResponseError(\"Missing download URL for state\");\r\n\r\n const archive = await fetch(url, { redirect: \"follow\" });\r\n if (archive.status >= 400) throw new HarnesslayerAPIError(\"Failed to download state archive\");\r\n await extractZip(new Uint8Array(await archive.arrayBuffer()), outPath);\r\n return true;\r\n }\r\n\r\n async clone(options: { stateId?: string; transform?: CloneTransform } = {}): Promise<boolean> {\r\n try {\r\n const transforms = validateCloneTransform(options.transform);\r\n const newId = newStateId();\r\n const targetStateId = await this.tryResolveStateId(options.stateId);\r\n\r\n if (targetStateId) {\r\n if (!targetStateId.startsWith(\"state-\")) throw new HarnesslayerError(\"stateId is invalid\");\r\n const copyJob = await this.driftstone.repos.copyDirectory(this.appId, {\r\n sourceDir: targetStateId,\r\n destDir: newId,\r\n sourceBranch: this.profileId,\r\n destBranch: this.profileId,\r\n transforms,\r\n archive: true,\r\n });\r\n const status = await this.waitForCopyRun(copyJob.runId, \"state clone\");\r\n if (status?.result?.noChanges === true) return false;\r\n } else {\r\n const app = await this.client.request(\"GET\", `/app/${this.appId}`);\r\n const headVersionId = (app.data as { headVersionId?: unknown }).headVersionId;\r\n if (typeof headVersionId !== \"string\" || !headVersionId.trim()) {\r\n throw new HarnesslayerResponseError(\"Missing headVersionId for app\");\r\n }\r\n\r\n try {\r\n const branch = await this.driftstone.repos.createBranch(this.appId, this.profileId, {\r\n storageDir: newId,\r\n transforms,\r\n archive: true,\r\n });\r\n await this.waitForCopyRun(branch.runId ?? null, \"state clone\");\r\n } catch (error) {\r\n if (!(error instanceof Error) || !error.message.toLowerCase().includes(\"same name already exists\")) {\r\n throw error;\r\n }\r\n const copyJob = await this.driftstone.repos.copyDirectory(this.appId, {\r\n sourceDir: headVersionId.trim(),\r\n destDir: newId,\r\n sourceBranch: \"main\",\r\n destBranch: this.profileId,\r\n transforms,\r\n archive: true,\r\n });\r\n const status = await this.waitForCopyRun(copyJob.runId, \"state clone\");\r\n if (status?.result?.noChanges === true) return false;\r\n }\r\n }\r\n\r\n await this.client.request(\"POST\", \"/state/create\", { profileId: this.profileId, stateId: newId });\r\n return true;\r\n } catch (error) {\r\n if (error instanceof HarnesslayerError) return false;\r\n throw error;\r\n }\r\n }\r\n\r\n async waitForCopyRun(\r\n runId: string | null | undefined,\r\n operation: string,\r\n ): Promise<{ status: string; result?: Record<string, unknown> | null } | null> {\r\n if (!runId) return null;\r\n const deadline = Date.now() + Math.max(this.client.timeoutMs, 1000);\r\n\r\n while (true) {\r\n const status = await this.driftstone.repos.getCopyStatus(this.appId, runId);\r\n if (status.status === \"completed\") return status;\r\n if (status.status === \"failed\") {\r\n throw new HarnesslayerAPIError(String(status.result?.error ?? `${operation} failed`));\r\n }\r\n if (status.status !== \"running\") {\r\n throw new HarnesslayerResponseError(`Unexpected ${operation} status: ${status.status}`);\r\n }\r\n if (Date.now() >= deadline) {\r\n throw new HarnesslayerAPIError(`Timed out waiting for ${operation} run ${runId}`);\r\n }\r\n await sleep(1000);\r\n }\r\n }\r\n\r\n private async resolveStateId(stateId?: string): Promise<string> {\r\n const target = await this.tryResolveStateId(stateId);\r\n if (!target) throw new HarnesslayerError(\"stateId must be provided or profile must have a head state\");\r\n if (!target.startsWith(\"state-\")) throw new HarnesslayerError(\"stateId is invalid\");\r\n return target;\r\n }\r\n\r\n private async tryResolveStateId(stateId?: string): Promise<string | null> {\r\n let target = typeof stateId === \"string\" ? stateId.trim() : \"\";\r\n if (!target) {\r\n const profile = await this.client.request(\"GET\", `/profile/${this.profileId}`);\r\n const headStateId = (profile.data as { headStateId?: unknown }).headStateId;\r\n if (typeof headStateId === \"string\" && headStateId.trim()) target = headStateId.trim();\r\n }\r\n return target || null;\r\n }\r\n}\r\n","import { HarnesslayerError } from \"../errors.js\";\r\nimport { newStateId, createUploadFilesPayload, validateConfigPath } from \"../internal/config.js\";\r\nimport { profileFromApi } from \"../models.js\";\r\nimport type { HarnesslayerProfileModel, JsonObject } from \"../types.js\";\r\nimport { requireNonEmptyString } from \"../internal/validation.js\";\r\nimport { AppBase } from \"./base.js\";\r\nimport { HarnesslayerState } from \"./state.js\";\r\n\r\nexport class HarnesslayerProfile extends AppBase {\r\n async init(\r\n identifier: string,\r\n options: {\r\n statePath?: string;\r\n accessGroupId?: string;\r\n metadata?: JsonObject;\r\n } = {},\r\n ): Promise<HarnesslayerProfileModel> {\r\n const payload: Record<string, unknown> = {\r\n appId: this.appId,\r\n identifier: requireNonEmptyString(identifier, \"identifier\"),\r\n returnIfExist: true,\r\n };\r\n\r\n if (options.accessGroupId != null) payload.accessGroupId = requireNonEmptyString(options.accessGroupId, \"accessGroupId\");\r\n if (options.metadata != null) {\r\n if (typeof options.metadata !== \"object\" || Array.isArray(options.metadata)) {\r\n throw new HarnesslayerError(\"metadata must be an object\");\r\n }\r\n payload.metadata = options.metadata;\r\n }\r\n\r\n let pathData: Awaited<ReturnType<typeof validateConfigPath>> | null = null;\r\n if (options.statePath != null) {\r\n pathData = await validateConfigPath(requireNonEmptyString(options.statePath, \"statePath\"));\r\n const app = await this.client.request(\"GET\", `/app/${this.appId}`);\r\n const appType = (app.data as { type?: unknown }).type;\r\n if (pathData.type !== appType) {\r\n throw new HarnesslayerError(`app type '${String(appType)}' does not match statePath type '${pathData.type}'`);\r\n }\r\n }\r\n\r\n const response = await this.client.request(\"POST\", \"/profile/create\", payload);\r\n const data = response.data as Record<string, unknown>;\r\n const state = new HarnesslayerState(this.client, this.appId, String(data.id));\r\n const profile = profileFromApi(data, state);\r\n\r\n if (!response.exists) {\r\n const stateId = newStateId();\r\n if (!pathData) {\r\n const branch = await this.driftstone.repos.createBranch(this.appId, String(data.id), {\r\n storageDir: stateId,\r\n archive: true,\r\n });\r\n await state.waitForCopyRun(branch.runId ?? null, \"profile init\");\r\n await state.create({ stateId });\r\n } else {\r\n await this.driftstone.repos.createBranch(this.appId, String(data.id), {\r\n storageDir: newStateId(),\r\n });\r\n const files = await createUploadFilesPayload(pathData.path);\r\n const repo = await this.driftstone.repos.get(this.appId);\r\n const upload = await this.driftstone.repos.createUpload(repo.id, {\r\n branch: String(data.id),\r\n storageDir: stateId,\r\n files,\r\n });\r\n await this.driftstone.uploadFiles(upload, files, pathData.path);\r\n await this.driftstone.repos.completeUpload(repo.id, upload.uploadId);\r\n await state.create({ stateId });\r\n }\r\n }\r\n\r\n return profile;\r\n }\r\n\r\n async retrieve(profileId: string): Promise<HarnesslayerProfileModel | null> {\r\n try {\r\n const id = requireNonEmptyString(profileId, \"profileId\");\r\n const response = await this.client.request(\"GET\", `/profile/${id}`);\r\n const state = new HarnesslayerState(this.client, this.appId, id);\r\n return profileFromApi(response.data as Record<string, unknown>, state);\r\n } catch (error) {\r\n if (error instanceof HarnesslayerError) return null;\r\n throw error;\r\n }\r\n }\r\n\r\n async update(\r\n profileId: string,\r\n options: { identifier?: string; accessGroupId?: string; metadata?: JsonObject },\r\n ): Promise<HarnesslayerProfileModel> {\r\n const id = requireNonEmptyString(profileId, \"profileId\");\r\n const payload: Record<string, unknown> = {};\r\n if (options.identifier != null) payload.identifier = requireNonEmptyString(options.identifier, \"identifier\");\r\n if (options.accessGroupId != null) payload.accessGroupId = requireNonEmptyString(options.accessGroupId, \"accessGroupId\");\r\n if (options.metadata != null) {\r\n if (typeof options.metadata !== \"object\" || Array.isArray(options.metadata)) throw new HarnesslayerError(\"metadata must be an object\");\r\n payload.metadata = options.metadata;\r\n }\r\n if (!Object.keys(payload).length) throw new HarnesslayerError(\"At least one field must be provided to update\");\r\n\r\n const response = await this.client.request(\"PATCH\", `/profile/${id}`, payload);\r\n const state = new HarnesslayerState(this.client, this.appId, String((response.data as { id: string }).id));\r\n return profileFromApi(response.data as Record<string, unknown>, state);\r\n }\r\n\r\n state(profileId: string): HarnesslayerState {\r\n return new HarnesslayerState(this.client, this.appId, requireNonEmptyString(profileId, \"profileId\"));\r\n }\r\n\r\n async delete(profileId: string): Promise<boolean> {\r\n await this.client.request(\"DELETE\", `/profile/${requireNonEmptyString(profileId, \"profileId\")}`);\r\n return true;\r\n }\r\n}\r\n","import {\r\n HarnesslayerAPIError,\r\n HarnesslayerError,\r\n HarnesslayerHTTPError,\r\n HarnesslayerResponseError,\r\n} from \"../errors.js\";\r\nimport { sessionFromApi } from \"../models.js\";\r\nimport type { ChannelType, HarnesslayerSessionModel, SessionType } from \"../types.js\";\r\nimport { requireNonEmptyString, validatePositiveInteger } from \"../internal/validation.js\";\r\nimport { AppBase } from \"./base.js\";\r\n\r\nexport class HarnesslayerSession extends AppBase {\r\n async create(type: ChannelType): Promise<HarnesslayerSessionModel> {\r\n if (![\"api\", \"imessage\"].includes(type)) throw new HarnesslayerError(\"type must be either 'api' or 'imessage'\");\r\n const response = await this.client.request(\"POST\", \"/session/create\", { appId: this.appId, type });\r\n return sessionFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async retrieve(sessionId: string): Promise<HarnesslayerSessionModel | null> {\r\n try {\r\n const response = await this.client.request(\"GET\", `/session/${requireNonEmptyString(sessionId, \"sessionId\")}`);\r\n return sessionFromApi(response.data as Record<string, unknown>);\r\n } catch (error) {\r\n if (\r\n error instanceof HarnesslayerAPIError ||\r\n error instanceof HarnesslayerHTTPError ||\r\n error instanceof HarnesslayerResponseError\r\n ) {\r\n throw error;\r\n }\r\n if (error instanceof HarnesslayerError) return null;\r\n throw error;\r\n }\r\n }\r\n\r\n async update(\r\n sessionId: string,\r\n options: { type?: SessionType; userIds?: string[] },\r\n ): Promise<HarnesslayerSessionModel> {\r\n const payload: Record<string, unknown> = {};\r\n if (options.type != null) {\r\n if (![\"single\", \"multiple\"].includes(options.type)) throw new HarnesslayerError(\"type must be either 'single' or 'multiple'\");\r\n payload.type = options.type;\r\n }\r\n if (options.userIds != null) {\r\n if (!Array.isArray(options.userIds) || !options.userIds.every((id) => typeof id === \"string\" && id.trim())) {\r\n throw new HarnesslayerError(\"userIds must be a list of non-empty strings\");\r\n }\r\n payload.userIds = options.userIds;\r\n }\r\n if (!Object.keys(payload).length) throw new HarnesslayerError(\"At least one of 'type' or 'userIds' must be provided\");\r\n\r\n const response = await this.client.request(\"PATCH\", `/session/${requireNonEmptyString(sessionId, \"sessionId\")}`, payload);\r\n return sessionFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async list(options: { page?: number; pageSize?: number } = {}): Promise<HarnesslayerSessionModel[]> {\r\n const response = await this.client.request(\"GET\", \"/session/list\", {\r\n appId: this.appId,\r\n page: validatePositiveInteger(options.page ?? 1, \"page\"),\r\n pageSize: validatePositiveInteger(options.pageSize ?? 10, \"pageSize\"),\r\n });\r\n if (!Array.isArray(response.data)) throw new HarnesslayerError(\"Expected 'data' to be a list in session list response\");\r\n return response.data.map((item) => sessionFromApi(item as Record<string, unknown>));\r\n }\r\n\r\n async delete(sessionId: string): Promise<boolean> {\r\n await this.client.request(\"DELETE\", `/session/${requireNonEmptyString(sessionId, \"sessionId\")}`);\r\n return true;\r\n }\r\n}\r\n","import { HarnesslayerAPIError, HarnesslayerError, HarnesslayerResponseError } from \"../errors.js\";\r\nimport {\r\n createUploadFilesPayload,\r\n newVersionId,\r\n validateCloneTransform,\r\n validateConfigPath,\r\n} from \"../internal/config.js\";\r\nimport { extractZip } from \"../internal/zip.js\";\r\nimport { sleep } from \"../internal/utils.js\";\r\nimport type { CloneTransform, HarnesslayerVersionCompareModel, SyncStrategy } from \"../types.js\";\r\nimport { AppBase } from \"./base.js\";\r\n\r\nexport interface VersionCompareOptions {\r\n versionId: string;\r\n stateId: string;\r\n contextLines?: number;\r\n maxFileBytes?: number;\r\n}\r\n\r\nexport class HarnesslayerVersion extends AppBase {\r\n async create(options: { versionId?: string; versionPath?: string }): Promise<boolean> {\r\n if (!options.versionId && !options.versionPath) {\r\n throw new HarnesslayerError(\"Either versionId or versionPath must be provided\");\r\n }\r\n\r\n const payload: Record<string, unknown> = { appId: this.appId };\r\n if (options.versionId) {\r\n if (!options.versionId.startsWith(\"ver-\")) throw new HarnesslayerError(\"versionId is invalid\");\r\n payload.versionId = options.versionId;\r\n } else if (options.versionPath) {\r\n const versionId = newVersionId();\r\n const pathData = await validateConfigPath(options.versionPath);\r\n const files = await createUploadFilesPayload(pathData.path);\r\n const repo = await this.driftstone.repos.get(this.appId);\r\n const upload = await this.driftstone.repos.createUpload(repo.id, {\r\n branch: \"main\",\r\n storageDir: versionId,\r\n files,\r\n });\r\n await this.driftstone.uploadFiles(upload, files, pathData.path);\r\n await this.driftstone.repos.completeUpload(repo.id, upload.uploadId);\r\n payload.versionId = versionId;\r\n }\r\n\r\n await this.client.request(\"POST\", \"/version/create\", payload);\r\n return true;\r\n }\r\n\r\n async download(outPath: string, versionId?: string): Promise<boolean> {\r\n const targetVersionId = await this.resolveVersionId(versionId);\r\n const response = await this.client.request(\"GET\", `/version/download/${targetVersionId}`);\r\n const url = (response.data as { url?: unknown }).url;\r\n if (typeof url !== \"string\" || !url.trim()) {\r\n throw new HarnesslayerResponseError(\"Missing download URL for version\");\r\n }\r\n\r\n const archive = await fetch(url, { redirect: \"follow\" });\r\n if (archive.status >= 400) throw new HarnesslayerAPIError(\"Failed to download version archive\");\r\n await extractZip(new Uint8Array(await archive.arrayBuffer()), outPath);\r\n return true;\r\n }\r\n\r\n async clone(options: { versionId?: string; transform?: CloneTransform } = {}): Promise<boolean> {\r\n try {\r\n const targetVersionId = await this.resolveVersionId(options.versionId);\r\n const newId = newVersionId();\r\n const copyJob = await this.driftstone.repos.copyDirectory(this.appId, {\r\n sourceDir: targetVersionId,\r\n destDir: newId,\r\n transforms: validateCloneTransform(options.transform),\r\n archive: true,\r\n });\r\n\r\n const deadline = Date.now() + Math.max(this.client.timeoutMs, 1000);\r\n while (true) {\r\n const status = await this.driftstone.repos.getCopyStatus(this.appId, copyJob.runId);\r\n if (status.status === \"completed\") {\r\n if (status.result?.noChanges === true) return false;\r\n break;\r\n }\r\n if (status.status === \"failed\") {\r\n throw new HarnesslayerAPIError(String(status.result?.error ?? \"Version clone failed\"));\r\n }\r\n if (status.status !== \"running\") {\r\n throw new HarnesslayerResponseError(`Unexpected version clone status: ${status.status}`);\r\n }\r\n if (Date.now() >= deadline) {\r\n throw new HarnesslayerAPIError(`Timed out waiting for version clone run ${copyJob.runId}`);\r\n }\r\n await sleep(1000);\r\n }\r\n\r\n await this.client.request(\"POST\", \"/version/create\", { appId: this.appId, versionId: newId });\r\n return true;\r\n } catch (error) {\r\n if (error instanceof HarnesslayerError) return false;\r\n throw error;\r\n }\r\n }\r\n\r\n async sync(strategy: SyncStrategy = \"manual\"): Promise<boolean> {\r\n if (![\"manual\", \"current\", \"incoming\", \"smart\"].includes(strategy)) {\r\n throw new HarnesslayerError(\"Invalid sync strategy\");\r\n }\r\n\r\n const response = await this.client.request(\"POST\", \"/version/sync\", {\r\n appId: this.appId,\r\n strategy,\r\n });\r\n if (response.error) throw new HarnesslayerAPIError(`Failed to sync version: ${String(response.error)}`);\r\n return true;\r\n }\r\n\r\n async compare(options: VersionCompareOptions): Promise<HarnesslayerVersionCompareModel> {\r\n const versionId = options.versionId?.trim();\r\n if (!versionId) throw new HarnesslayerError(\"versionId must be provided\");\r\n if (!versionId.startsWith(\"ver-\")) throw new HarnesslayerError(\"versionId is invalid\");\r\n\r\n const stateId = options.stateId?.trim();\r\n if (!stateId) throw new HarnesslayerError(\"stateId must be provided\");\r\n if (!stateId.startsWith(\"state-\")) throw new HarnesslayerError(\"stateId is invalid\");\r\n\r\n const contextLines = options.contextLines ?? 3;\r\n if (!Number.isInteger(contextLines) || contextLines < 0 || contextLines > 20) {\r\n throw new HarnesslayerError(\"contextLines must be an integer between 0 and 20\");\r\n }\r\n\r\n const maxFileBytes = options.maxFileBytes ?? 512 * 1024;\r\n if (!Number.isInteger(maxFileBytes) || maxFileBytes < 0) {\r\n throw new HarnesslayerError(\"maxFileBytes must be a non-negative integer\");\r\n }\r\n\r\n const response = await this.client.request(\"POST\", \"/version/compare\", {\r\n versionId,\r\n stateId,\r\n contextLines,\r\n maxFileBytes,\r\n });\r\n const data = response.data as HarnesslayerVersionCompareModel | undefined;\r\n if (!data || typeof data !== \"object\") {\r\n throw new HarnesslayerResponseError(\"Missing compare data\");\r\n }\r\n return data;\r\n }\r\n\r\n private async resolveVersionId(versionId?: string): Promise<string> {\r\n let target = typeof versionId === \"string\" ? versionId.trim() : \"\";\r\n if (!target) {\r\n const app = await this.client.request(\"GET\", `/app/${this.appId}`);\r\n const headVersionId = (app.data as { headVersionId?: unknown }).headVersionId;\r\n if (typeof headVersionId !== \"string\" || !headVersionId.trim()) {\r\n throw new HarnesslayerResponseError(\"Missing headVersionId for app\");\r\n }\r\n target = headVersionId.trim();\r\n }\r\n if (!target.startsWith(\"ver-\")) throw new HarnesslayerError(\"versionId is invalid\");\r\n return target;\r\n }\r\n}\r\n","import { HarnesslayerError } from \"../errors.js\";\r\nimport {\r\n createUploadFilesPayload,\r\n newVersionId,\r\n validateConfigPath,\r\n} from \"../internal/config.js\";\r\nimport { appFromApi } from \"../models.js\";\r\nimport type {\r\n AppInitCredential,\r\n AppInitLimit,\r\n ApplicationType,\r\n HarnesslayerAppModel,\r\n} from \"../types.js\";\r\nimport { requireNonEmptyString, validateSlug } from \"../internal/validation.js\";\r\nimport { ResourceBase } from \"./base.js\";\r\nimport { HarnesslayerAccessGroup } from \"./access-group.js\";\r\nimport { HarnesslayerChannel } from \"./channel.js\";\r\nimport { HarnesslayerConflict } from \"./conflict.js\";\r\nimport { HarnesslayerInstance } from \"./instance.js\";\r\nimport { HarnesslayerProfile } from \"./profile.js\";\r\nimport { HarnesslayerSession } from \"./session.js\";\r\nimport { HarnesslayerVersion } from \"./version.js\";\r\n\r\nexport class HarnesslayerApp extends ResourceBase {\r\n async init(\r\n slug: string,\r\n options: {\r\n type: ApplicationType;\r\n versionPath: string;\r\n name?: string;\r\n limit?: AppInitLimit;\r\n credentials?: AppInitCredential[];\r\n },\r\n ): Promise<HarnesslayerAppModel> {\r\n if (![\"claude\", \"openclaw\"].includes(options.type)) {\r\n throw new HarnesslayerError(\"type must be one of 'claude', 'openclaw'\");\r\n }\r\n const payload: Record<string, unknown> = {\r\n slug: validateSlug(slug),\r\n type: options.type,\r\n returnIfExist: true,\r\n };\r\n\r\n if (options.name != null) payload.name = requireNonEmptyString(options.name, \"name\");\r\n if (options.limit != null) {\r\n if (typeof options.limit !== \"object\" || Array.isArray(options.limit) || options.limit.amount == null || options.limit.interval == null) {\r\n throw new HarnesslayerError(\"limit must be an object with 'amount' and 'interval' keys\");\r\n }\r\n payload.limit = options.limit;\r\n }\r\n if (options.credentials != null) {\r\n if (!Array.isArray(options.credentials) || !options.credentials.every((item) => item && typeof item === \"object\")) {\r\n throw new HarnesslayerError(\"credentials must be a list of objects\");\r\n }\r\n payload.credentials = options.credentials;\r\n }\r\n\r\n const createResponse = await this.client.request(\"POST\", \"/app/create\", payload);\r\n const app = this.buildAppModel(createResponse.data as Record<string, unknown>);\r\n\r\n if (!createResponse.exists) {\r\n const pathData = await validateConfigPath(requireNonEmptyString(options.versionPath, \"versionPath\"));\r\n if (pathData.type !== options.type) {\r\n throw new HarnesslayerError(`type '${options.type}' does not match versionPath type '${pathData.type}'`);\r\n }\r\n\r\n const versionId = newVersionId();\r\n const files = await createUploadFilesPayload(pathData.path);\r\n const repo = await this.driftstone.repos.create(String((createResponse.data as { id: string }).id));\r\n const upload = await this.driftstone.repos.createUpload(repo.id, {\r\n branch: \"main\",\r\n storageDir: versionId,\r\n files,\r\n });\r\n await this.driftstone.uploadFiles(upload, files, pathData.path);\r\n await this.driftstone.repos.completeUpload(repo.id, upload.uploadId);\r\n await app.version.create({ versionId });\r\n }\r\n\r\n return app;\r\n }\r\n\r\n async retrieve(options: { appId?: string; slug?: string }): Promise<HarnesslayerAppModel | null> {\r\n try {\r\n const appId = options.appId?.trim();\r\n const slug = options.slug?.trim();\r\n if (!appId && !slug) throw new HarnesslayerError(\"Either appId or slug must be provided\");\r\n if (appId && slug) throw new HarnesslayerError(\"Only one of appId or slug can be provided, not both\");\r\n const response = await this.client.request(\"GET\", `/app/${appId ?? slug}`);\r\n return this.buildAppModel(response.data as Record<string, unknown>);\r\n } catch (error) {\r\n if (error instanceof HarnesslayerError) return null;\r\n throw error;\r\n }\r\n }\r\n\r\n async delete(appId: string): Promise<boolean> {\r\n await this.client.request(\"DELETE\", `/app/${requireNonEmptyString(appId, \"appId\")}`);\r\n return true;\r\n }\r\n\r\n channel(appId: string): HarnesslayerChannel {\r\n return new HarnesslayerChannel(this.client, requireNonEmptyString(appId, \"appId\"));\r\n }\r\n\r\n instance(appId: string): HarnesslayerInstance {\r\n return new HarnesslayerInstance(this.client, requireNonEmptyString(appId, \"appId\"));\r\n }\r\n\r\n accessGroup(appId: string): HarnesslayerAccessGroup {\r\n return new HarnesslayerAccessGroup(this.client, requireNonEmptyString(appId, \"appId\"));\r\n }\r\n\r\n profile(appId: string): HarnesslayerProfile {\r\n return new HarnesslayerProfile(this.client, requireNonEmptyString(appId, \"appId\"));\r\n }\r\n\r\n conflict(appId: string): HarnesslayerConflict {\r\n return new HarnesslayerConflict(this.client, requireNonEmptyString(appId, \"appId\"));\r\n }\r\n\r\n private buildAppModel(appData: Record<string, unknown>): HarnesslayerAppModel {\r\n const appId = String(appData.id);\r\n return appFromApi(appData, {\r\n version: new HarnesslayerVersion(this.client, appId),\r\n channel: new HarnesslayerChannel(this.client, appId),\r\n session: new HarnesslayerSession(this.client, appId),\r\n accessGroup: new HarnesslayerAccessGroup(this.client, appId),\r\n profile: new HarnesslayerProfile(this.client, appId),\r\n instance: new HarnesslayerInstance(this.client, appId),\r\n conflict: new HarnesslayerConflict(this.client, appId),\r\n });\r\n }\r\n}\r\n","import { HarnesslayerError } from \"../errors.js\";\r\nimport { organizationFromApi } from \"../models.js\";\r\nimport type { HarnesslayerOrganizationModel } from \"../types.js\";\r\nimport { validateSlug, requireNonEmptyString } from \"../internal/validation.js\";\r\nimport { ResourceBase } from \"./base.js\";\r\n\r\nexport class HarnesslayerOrganization extends ResourceBase {\r\n async create(name: string, options: { slug: string }): Promise<HarnesslayerOrganizationModel> {\r\n const response = await this.client.request(\"POST\", \"/organization/create\", {\r\n name: requireNonEmptyString(name, \"name\"),\r\n slug: validateSlug(options.slug),\r\n });\r\n return organizationFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async init(\r\n name: string,\r\n options: { slug: string; returnIfExist?: boolean; return_if_exist?: boolean },\r\n ): Promise<HarnesslayerOrganizationModel> {\r\n if (options.returnIfExist != null && options.return_if_exist != null) {\r\n throw new HarnesslayerError(\"Only one of returnIfExist or return_if_exist may be provided\");\r\n }\r\n const response = await this.client.request(\"POST\", \"/organization/create\", {\r\n name: requireNonEmptyString(name, \"name\"),\r\n slug: validateSlug(options.slug),\r\n returnIfExist: options.returnIfExist ?? options.return_if_exist ?? false,\r\n });\r\n return organizationFromApi(response.data as Record<string, unknown>);\r\n }\r\n\r\n async update(\r\n organizationId: string,\r\n options: { name?: string; slug?: string },\r\n ): Promise<HarnesslayerOrganizationModel> {\r\n const payload: Record<string, unknown> = {};\r\n if (options.name != null) payload.name = requireNonEmptyString(options.name, \"name\");\r\n if (options.slug != null) payload.slug = validateSlug(options.slug);\r\n if (!Object.keys(payload).length) throw new HarnesslayerError(\"At least one field must be provided to update\");\r\n\r\n const response = await this.client.request(\r\n \"PATCH\",\r\n `/organization/${requireNonEmptyString(organizationId, \"organizationId\")}`,\r\n payload,\r\n );\r\n return organizationFromApi(response.data as Record<string, unknown>);\r\n }\r\n}\r\n","import { HarnesslayerError } from \"../errors.js\";\r\nimport { requireNonEmptyString } from \"../internal/validation.js\";\r\nimport { ResourceBase } from \"./base.js\";\r\n\r\nexport class HarnesslayerResponse extends ResourceBase {\r\n async stop(instanceId: string): Promise<Record<string, unknown>> {\r\n const response = await this.client.request(\"POST\", \"/response/stop\", {\r\n instanceId: requireNonEmptyString(instanceId, \"instanceId\"),\r\n });\r\n if (!response.data || typeof response.data !== \"object\" || Array.isArray(response.data)) {\r\n throw new HarnesslayerError(\"Expected 'data' to be an object in response stop response\");\r\n }\r\n return response.data as Record<string, unknown>;\r\n }\r\n}\r\n","import { HarnesslayerError } from \"./errors.js\";\r\nimport { DEFAULT_API_BASE_URL } from \"./internal/constants.js\";\r\nimport { DriftstoneClient } from \"./internal/driftstone.js\";\r\nimport { Transport, type FetchLike, type Method } from \"./internal/transport.js\";\r\nimport type { ApiVersion } from \"./types.js\";\r\nimport { HarnesslayerApp } from \"./resources/app.js\";\r\nimport { HarnesslayerOrganization } from \"./resources/organization.js\";\r\nimport { HarnesslayerResponse } from \"./resources/response.js\";\r\n\r\nexport interface HarnesslayerOptions {\r\n apiKey: string;\r\n version?: ApiVersion;\r\n timeoutMs?: number;\r\n timeout?: number;\r\n fetch?: FetchLike;\r\n baseUrl?: string;\r\n driftstoneBaseUrl?: string;\r\n}\r\n\r\nexport class Harnesslayer {\r\n readonly apiKey: string;\r\n readonly apiVersion: ApiVersion;\r\n readonly timeoutMs: number;\r\n readonly baseUrl: string;\r\n readonly driftstone: DriftstoneClient;\r\n\r\n private readonly transport: Transport;\r\n\r\n constructor(options: HarnesslayerOptions);\r\n constructor(apiKey: string, options?: Omit<HarnesslayerOptions, \"apiKey\">);\r\n constructor(\r\n apiKeyOrOptions: string | HarnesslayerOptions,\r\n maybeOptions: Omit<HarnesslayerOptions, \"apiKey\"> = {},\r\n ) {\r\n const options =\r\n typeof apiKeyOrOptions === \"string\"\r\n ? { ...maybeOptions, apiKey: apiKeyOrOptions }\r\n : apiKeyOrOptions;\r\n\r\n const apiKey = options.apiKey.trim();\r\n if (!apiKey) throw new HarnesslayerError(\"apiKey must be provided\");\r\n if (!apiKey.startsWith(\"dk-\")) throw new HarnesslayerError(\"Invalid Harnesslayer API key\");\r\n\r\n this.apiKey = apiKey;\r\n this.apiVersion = options.version ?? \"v1\";\r\n this.timeoutMs = options.timeoutMs ?? (options.timeout != null ? options.timeout * 1000 : 600_000);\r\n this.baseUrl = `${(options.baseUrl ?? DEFAULT_API_BASE_URL).replace(/\\/+$/, \"\")}/${this.apiVersion}`;\r\n const transportOptions = {\r\n baseUrl: this.baseUrl,\r\n apiKey: this.apiKey,\r\n timeoutMs: this.timeoutMs,\r\n userAgent: \"Harnesslayer-typescript/0.1.0\",\r\n ...(options.fetch ? { fetch: options.fetch } : {}),\r\n };\r\n this.transport = new Transport(transportOptions);\r\n\r\n const driftstoneOptions = {\r\n apiKey: this.apiKey,\r\n version: this.apiVersion,\r\n timeoutMs: this.timeoutMs,\r\n ...(options.fetch ? { fetch: options.fetch } : {}),\r\n ...(options.driftstoneBaseUrl ? { baseUrl: options.driftstoneBaseUrl } : {}),\r\n };\r\n this.driftstone = new DriftstoneClient(driftstoneOptions);\r\n }\r\n\r\n request<T extends Record<string, unknown> = Record<string, unknown>>(\r\n method: Method,\r\n path: string,\r\n payload?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.transport.request<T>(method, path, payload);\r\n }\r\n\r\n get app(): HarnesslayerApp {\r\n return new HarnesslayerApp(this);\r\n }\r\n\r\n get organization(): HarnesslayerOrganization {\r\n return new HarnesslayerOrganization(this);\r\n }\r\n\r\n get response(): HarnesslayerResponse {\r\n return new HarnesslayerResponse(this);\r\n }\r\n}\r\n\r\nexport default Harnesslayer;\r\n"],"mappings":"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","names":["path","readFile","path","path","readFile","path","path","path"]}
|