@convilyn/sdk-author 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/README.md +1 -1
- package/dist/{chunk-ZNZXT5ZP.js → chunk-RUBSAKX7.js} +10 -4
- package/dist/chunk-RUBSAKX7.js.map +1 -0
- package/dist/cli.cjs +4 -1
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +22 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -2
- package/dist/index.d.ts +21 -2
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-ZNZXT5ZP.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/errors.ts","../src/auth.ts","../src/types.ts","../src/manifest.ts","../src/datastore.ts","../src/context.ts","../src/config.ts","../src/workflow.ts","../src/jsonrpc.ts","../src/tool-result-wire.ts","../src/tool-server.ts","../src/http-runtime.ts","../src/compliance.ts","../src/client.ts"],"names":["writeFile","readFile","isRecord","summary"],"mappings":"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","file":"chunk-ZNZXT5ZP.js","sourcesContent":["/** The SDK release version (independent of the manifest schema version). */\nexport const VERSION = '0.7.0'\n\n/**\n * The schema version stamped into a compiled manifest's `sdk_version` field —\n * kept in lockstep with the Python / Go author SDKs' manifest format.\n */\nexport const MANIFEST_SDK_VERSION = '1.0.0'\n","/**\n * Typed errors raised by the Author SDK — a faithful port of the Python / Go\n * author SDKs.\n *\n * ConvilynAuthorError base; everything the SDK throws\n * ├── InvalidSignatureError inbound HMAC verification failed\n * ├── ConvilynStartupError server cannot safely start (fail-closed gate)\n * └── ConfirmationInvalidError confirmation-handshake token rejected\n */\n\n/** Base class for every error the Author SDK throws. */\nexport class ConvilynAuthorError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ConvilynAuthorError'\n }\n}\n\n/** Stable machine-readable reason for an {@link InvalidSignatureError}. */\nexport type InvalidSignatureReason =\n | 'missing_secret'\n | 'missing_header'\n | 'invalid_timestamp'\n | 'timestamp_out_of_range'\n | 'signature_mismatch'\n\n/**\n * Raised when an inbound HMAC signature fails verification. `reason` is a stable\n * machine-readable code; `message` is human-readable and safe to log. Reasons\n * are intentionally coarse to avoid leaking signing details to attackers.\n */\nexport class InvalidSignatureError extends ConvilynAuthorError {\n readonly reason: InvalidSignatureReason\n\n constructor(reason: InvalidSignatureReason, message: string) {\n super(message)\n this.name = 'InvalidSignatureError'\n this.reason = reason\n }\n}\n\n/**\n * Raised when the server cannot safely start — e.g. `serve()` without\n * `CONVILYN_HMAC_SECRET` and without the explicit insecure-local-dev opt-in.\n * Port of the Python / Go `ConvilynStartupError` (fail-closed startup\n * contract).\n */\nexport class ConvilynStartupError extends ConvilynAuthorError {\n constructor(message: string) {\n super(message)\n this.name = 'ConvilynStartupError'\n }\n}\n\n/**\n * Raised when a platform API call (via {@link ConvilynClient}) returns a non-2xx\n * response. `status` is the HTTP status; `body` is the parsed JSON (or text) the\n * server returned.\n */\nexport class ConvilynApiError extends ConvilynAuthorError {\n readonly status: number\n readonly body: unknown\n\n constructor(status: number, message: string, body: unknown) {\n super(message)\n this.name = 'ConvilynApiError'\n this.status = status\n this.body = body\n }\n}\n\n/** Stable machine-readable reason for a {@link ConfirmationInvalidError}. */\nexport type ConfirmationInvalidReason =\n 'malformed' | 'expired' | 'digest_mismatch' | 'signature_mismatch'\n\n/**\n * Raised when a confirmation-handshake token fails verification. `reason` is a\n * stable machine-readable code (maps to the framework's `CONFIRMATION_INVALID`).\n */\nexport class ConfirmationInvalidError extends ConvilynAuthorError {\n readonly reason: ConfirmationInvalidReason\n\n constructor(reason: ConfirmationInvalidReason, message: string) {\n super(message)\n this.name = 'ConfirmationInvalidError'\n this.reason = reason\n }\n}\n","/**\n * Inbound HMAC verification for calls from the Convilyn gateway, plus the\n * matching signer. Mirrors the gateway's `mcp_gateway/hmac_signer.py` and the\n * Python / Go author SDKs **byte-for-byte**, so a TS-authored server is\n * interchangeable behind the same gateway.\n *\n * Wire format:\n * - `x-convilyn-signature` — HMAC-SHA256 hex digest\n * - `x-convilyn-timestamp` — Unix seconds (integer string)\n * - `x-convilyn-server-id` — server name, audit-only (NOT in the signed payload)\n *\n * Signed payload = `<timestamp>` bytes + `.` + raw body bytes. Comparison is\n * constant-time; a timestamp tolerance window defends against replay.\n *\n * This is a public author capability: a server using its own HTTP framework\n * (instead of the SDK's runtime) calls {@link verifySignature} to reject forged\n * requests.\n */\n\nimport { createHmac, timingSafeEqual } from 'node:crypto'\nimport { InvalidSignatureError } from './errors'\n\n/** HMAC header names (lowercase; match the gateway's signer). */\nexport const SIGNATURE_HEADER = 'x-convilyn-signature'\nexport const TIMESTAMP_HEADER = 'x-convilyn-timestamp'\nexport const SERVER_ID_HEADER = 'x-convilyn-server-id'\n\n/** Default replay window (seconds) vs the gateway clock. */\nexport const DEFAULT_HMAC_TOLERANCE_SECONDS = 300\n\n/**\n * Body accepted by the signer / verifier. The gateway signs the **raw body\n * bytes**, so a binary or non-UTF-8 body MUST be passed as `Uint8Array` — a\n * lossy-decoded `string` re-encodes as UTF-8 and will not reproduce the digest\n * (the request is rejected, never falsely accepted).\n */\nexport type RequestBody = string | Uint8Array\n\nfunction expectedSignature(secret: string, timestamp: string, body: RequestBody): string {\n return createHmac('sha256', secret).update(timestamp).update('.').update(body).digest('hex')\n}\n\n/**\n * Produce the `{ signature, timestamp }` pair for an outbound request, mirroring\n * the gateway's signer. Useful for tests and for clients calling a\n * developer-hosted server directly. `unixSeconds` is truncated to an integer.\n */\nexport function signRequest(\n secret: string,\n body: RequestBody,\n unixSeconds: number\n): { signature: string; timestamp: string } {\n const timestamp = String(Math.trunc(unixSeconds))\n return { signature: expectedSignature(secret, timestamp, body), timestamp }\n}\n\n/** Tunables for {@link verifySignature}. */\nexport interface VerifyOptions {\n /** Max clock skew (seconds) vs the gateway; `<= 0` uses the default 300. */\n toleranceSeconds?: number\n /** Override \"now\" (Unix seconds) for tests; defaults to the real clock. */\n now?: () => number\n}\n\nfunction constantTimeEqual(a: string, b: string): boolean {\n const aBuf = Buffer.from(a)\n const bBuf = Buffer.from(b)\n // timingSafeEqual throws on unequal length; a wrong-length digest is simply\n // not equal. The expected digest is a fixed 64-hex string, so the length\n // check leaks nothing useful.\n if (aBuf.length !== bBuf.length) {\n return false\n }\n return timingSafeEqual(aBuf, bBuf)\n}\n\n/**\n * Verify an inbound HMAC signature; throw {@link InvalidSignatureError} on any\n * failure (missing secret/headers, malformed or out-of-tolerance timestamp, or\n * digest mismatch). Header keys must be lowercased.\n */\nexport function verifySignature(\n secret: string,\n body: RequestBody,\n headers: Record<string, string | undefined>,\n options: VerifyOptions = {}\n): void {\n const tolerance =\n options.toleranceSeconds != null && options.toleranceSeconds > 0\n ? options.toleranceSeconds\n : DEFAULT_HMAC_TOLERANCE_SECONDS\n const now = options.now ?? (() => Math.floor(Date.now() / 1000))\n\n if (!secret) {\n throw new InvalidSignatureError('missing_secret', 'HMAC secret is not configured on the server')\n }\n\n const signature = headers[SIGNATURE_HEADER]\n const timestamp = headers[TIMESTAMP_HEADER]\n if (!signature || !timestamp) {\n throw new InvalidSignatureError(\n 'missing_header',\n 'Missing X-Convilyn-Signature or X-Convilyn-Timestamp'\n )\n }\n\n if (!/^[+-]?\\d+$/.test(timestamp)) {\n throw new InvalidSignatureError(\n 'invalid_timestamp',\n 'X-Convilyn-Timestamp must be an integer Unix-seconds value'\n )\n }\n const tsValue = Number(timestamp)\n\n if (Math.abs(now() - tsValue) > tolerance) {\n throw new InvalidSignatureError(\n 'timestamp_out_of_range',\n 'Request timestamp outside acceptable tolerance window'\n )\n }\n\n const expected = expectedSignature(secret, timestamp, body)\n if (!constantTimeEqual(expected, signature)) {\n throw new InvalidSignatureError(\n 'signature_mismatch',\n 'Signature did not match expected HMAC-SHA256 digest'\n )\n }\n}\n","/**\n * Core value types shared across the Author SDK — tool results, error details,\n * data references, and the manifest schema rows. Mirrors the Go SDK's `types.go`\n * and the Python `types.py`. Domain fields are camelCase; the snake_case wire\n * mapping lives in `manifest.ts` (and, later, the JSON-RPC runtime).\n */\n\n/** Reference to data stored in the ToolDataStore (the LLM sees only the summary). */\nexport interface ToolDataRef {\n refId: string\n summary: string\n}\n\n/** Structured error detail for a failed tool execution. */\nexport interface ToolError {\n code: string\n message: string\n details?: Record<string, unknown>\n}\n\n/** Result returned from a tool execution. Build via {@link ToolResult.ok} / `.fail`. */\nexport interface ToolResult {\n success: boolean\n data?: Record<string, unknown>\n error?: ToolError\n executionTimeMs?: number\n /**\n * Optional LLM-facing one-line summary. When set it becomes the wire\n * envelope's required `summary`; otherwise the JSON-RPC runtime derives one.\n * (Added in A3; omitting it preserves the A1 `ok` / `fail` shapes exactly.)\n */\n summary?: string\n}\n\n/** Constructors for {@link ToolResult} (mirrors Python `ToolResult.ok` / `.fail`). */\nexport const ToolResult = {\n ok(data: Record<string, unknown>, summary?: string): ToolResult {\n return summary !== undefined ? { success: true, data, summary } : { success: true, data }\n },\n fail(\n code: string,\n message: string,\n details?: Record<string, unknown>,\n summary?: string\n ): ToolResult {\n const error: ToolError = details ? { code, message, details } : { code, message }\n return summary !== undefined ? { success: false, error, summary } : { success: false, error }\n },\n}\n\n/** Manifest schema for a single tool. */\nexport interface ToolSpec {\n name: string\n description: string\n inputSchema: Record<string, unknown>\n idempotent: boolean\n outputSchema?: Record<string, unknown>\n}\n\n/** Manifest schema for the server section. */\nexport interface ServerSpec {\n name: string\n version: string\n description: string\n mcpServerName?: string\n}\n\n/** One line of a compliance report. */\nexport interface ComplianceResult {\n passed: boolean\n checkName: string\n message: string\n details?: Record<string, unknown>\n}\n\n/** Full report from a local compliance run. */\nexport interface ComplianceReport {\n results: ComplianceResult[]\n}\n\n/** True when every check in the report passed. */\nexport function allChecksPassed(report: ComplianceReport): boolean {\n return report.results.every((result) => result.passed)\n}\n\n/** Just the failing checks of a report. */\nexport function failedChecks(report: ComplianceReport): ComplianceResult[] {\n return report.results.filter((result) => !result.passed)\n}\n","/**\n * The compiled blueprint of a ToolServer — its tools and capabilities described\n * without running any code. The gateway consumes this to configure routing and\n * agent tool binding. Port of the Python / Go `ConvilynManifest`.\n *\n * Serialisation maps the camelCase domain to the snake_case wire shape and keeps\n * empty lists as `[]` (never omitted), matching the Python/Go output byte-exactly.\n */\n\nimport { readFile, writeFile } from 'node:fs/promises'\nimport type { ServerSpec, ToolSpec } from './types'\nimport { MANIFEST_SDK_VERSION } from './version'\n\nconst DEFAULT_MANIFEST_PATH = 'convilyn.manifest.json'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction serverToWire(server: ServerSpec): Record<string, unknown> {\n const wire: Record<string, unknown> = {\n name: server.name,\n version: server.version,\n description: server.description,\n }\n if (server.mcpServerName != null && server.mcpServerName !== '') {\n wire.mcp_server_name = server.mcpServerName\n }\n return wire\n}\n\nfunction toolToWire(tool: ToolSpec): Record<string, unknown> {\n const wire: Record<string, unknown> = {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n idempotent: tool.idempotent,\n }\n if (tool.outputSchema != null) {\n wire.output_schema = tool.outputSchema\n }\n return wire\n}\n\nfunction serverFromWire(wire: Record<string, unknown>): ServerSpec {\n const server: ServerSpec = {\n name: String(wire.name ?? ''),\n version: String(wire.version ?? ''),\n description: String(wire.description ?? ''),\n }\n if (typeof wire.mcp_server_name === 'string') {\n server.mcpServerName = wire.mcp_server_name\n }\n return server\n}\n\nfunction toolFromWire(wire: Record<string, unknown>): ToolSpec {\n const tool: ToolSpec = {\n name: String(wire.name ?? ''),\n description: String(wire.description ?? ''),\n inputSchema: isRecord(wire.input_schema) ? wire.input_schema : {},\n idempotent: Boolean(wire.idempotent),\n }\n if (isRecord(wire.output_schema)) {\n tool.outputSchema = wire.output_schema\n }\n return tool\n}\n\n/** Options for constructing a {@link ConvilynManifest}. */\nexport interface ConvilynManifestOptions {\n tools?: ToolSpec[]\n capabilities?: string[]\n sdkVersion?: string\n}\n\n/** The compiled blueprint of a ToolServer. */\nexport class ConvilynManifest {\n readonly sdkVersion: string\n readonly server: ServerSpec\n readonly tools: ToolSpec[]\n readonly capabilities: string[]\n\n constructor(server: ServerSpec, options: ConvilynManifestOptions = {}) {\n this.sdkVersion = options.sdkVersion ?? MANIFEST_SDK_VERSION\n this.server = server\n this.tools = options.tools ?? []\n this.capabilities = options.capabilities ?? []\n }\n\n /** The platform wire object (snake_case; empty lists kept as `[]`). */\n toWire(): Record<string, unknown> {\n return {\n sdk_version: this.sdkVersion,\n server: serverToWire(this.server),\n tools: this.tools.map(toolToWire),\n capabilities: [...this.capabilities],\n }\n }\n\n /** The manifest serialised as 2-space-indented JSON. */\n toJson(): string {\n return JSON.stringify(this.toWire(), null, 2)\n }\n\n /** Write the manifest to a JSON file (default `convilyn.manifest.json`). */\n async save(path: string = DEFAULT_MANIFEST_PATH): Promise<string> {\n await writeFile(path, this.toJson(), 'utf8')\n return path\n }\n\n /** Parse a manifest from its wire object. */\n static fromWire(wire: Record<string, unknown>): ConvilynManifest {\n const server = serverFromWire(isRecord(wire.server) ? wire.server : {})\n const tools = Array.isArray(wire.tools) ? wire.tools.filter(isRecord).map(toolFromWire) : []\n const capabilities = Array.isArray(wire.capabilities)\n ? wire.capabilities.filter((cap): cap is string => typeof cap === 'string')\n : []\n const sdkVersion =\n typeof wire.sdk_version === 'string' ? wire.sdk_version : MANIFEST_SDK_VERSION\n return new ConvilynManifest(server, { tools, capabilities, sdkVersion })\n }\n\n /** Parse a manifest from a JSON string. */\n static fromJson(data: string): ConvilynManifest {\n const parsed: unknown = JSON.parse(data)\n if (!isRecord(parsed)) {\n throw new Error('manifest JSON must be an object')\n }\n return ConvilynManifest.fromWire(parsed)\n }\n\n /** Read a manifest from a JSON file (default `convilyn.manifest.json`). */\n static async load(path: string = DEFAULT_MANIFEST_PATH): Promise<ConvilynManifest> {\n const raw = await readFile(path, 'utf8')\n return ConvilynManifest.fromJson(raw)\n }\n}\n","/**\n * Pluggable store for large tool outputs — tools return `{ ref_id, summary }` so\n * the LLM context stays small, then the agent retrieves the full data later by\n * `ref_id`. Port of the Python `DataStoreProtocol` / Go `DataStore`.\n */\n\nimport { randomBytes } from 'node:crypto'\nimport type { SDKConfig } from './config'\n\n/**\n * Stores and retrieves large tool outputs by `ref_id`. `get` resolves to `null`\n * for an unknown id — a miss is not an error.\n */\nexport interface DataStore {\n store(data: Record<string, unknown>): Promise<string>\n get(refId: string): Promise<Record<string, unknown> | null>\n}\n\n/** Generate a `ref_id` in the mcp-shared format `td_<12-hex>`. */\nexport function generateRefId(): string {\n return `td_${randomBytes(6).toString('hex')}`\n}\n\n/**\n * Zero-dependency {@link DataStore} for local development and testing. Data is\n * lost when the process exits.\n */\nexport class InMemoryDataStore implements DataStore {\n readonly #store = new Map<string, Record<string, unknown>>()\n\n async store(data: Record<string, unknown>): Promise<string> {\n const refId = generateRefId()\n this.#store.set(refId, data)\n return refId\n }\n\n async get(refId: string): Promise<Record<string, unknown> | null> {\n return this.#store.get(refId) ?? null\n }\n\n /** Number of stored entries. */\n get size(): number {\n return this.#store.size\n }\n}\n\n/**\n * Build the appropriate {@link DataStore} for the config. A1 ships the in-memory\n * store; the DynamoDB-backed production store lands in a later increment, keyed\n * off `config.isLambda`.\n */\nexport function createDataStore(_config?: SDKConfig): DataStore {\n return new InMemoryDataStore()\n}\n","/**\n * Execution context injected into tools that opt in (by accepting it). Exposes\n * the request id, the shared {@link DataStore}, and a progress channel. Port of\n * the Python / Go `ToolContext`.\n */\n\nimport type { DataStore } from './datastore'\n\n/** Receives progress reports emitted via {@link ToolContext.reportProgress}. */\nexport interface ProgressBackend {\n report(requestId: string, percent: number, message: string): void\n}\n\n/**\n * Dev-mode {@link ProgressBackend} that writes each report to a sink (defaults\n * to `process.stderr`). Inject `write` for tests or to silence it.\n */\nexport class ConsoleProgressBackend implements ProgressBackend {\n readonly #write: (line: string) => void\n\n constructor(write?: (line: string) => void) {\n this.#write =\n write ??\n ((line) => {\n if (typeof process !== 'undefined' && process.stderr) {\n process.stderr.write(`${line}\\n`)\n }\n })\n }\n\n report(requestId: string, percent: number, message: string): void {\n this.#write(`[progress ${percent}%] ${requestId}: ${message}`)\n }\n}\n\n/**\n * Execution context passed to a tool. Holds the request id, the shared\n * {@link DataStore}, and an optional {@link ProgressBackend}.\n */\nexport class ToolContext {\n readonly requestId: string\n readonly dataStore: DataStore\n readonly #progress: ProgressBackend | null\n\n constructor(requestId: string, dataStore: DataStore, progress: ProgressBackend | null = null) {\n this.requestId = requestId\n this.dataStore = dataStore\n this.#progress = progress\n }\n\n /**\n * Emit a progress update (0–100). Throws {@link RangeError} when `percent` is\n * out of range; a no-op when no {@link ProgressBackend} is wired.\n */\n reportProgress(percent: number, message: string): void {\n if (percent < 0 || percent > 100) {\n throw new RangeError(`progress percent must be in [0, 100], got ${percent}`)\n }\n this.#progress?.report(this.requestId, percent, message)\n }\n}\n\n/**\n * Build a {@link ToolContext} from a request payload, reading `request_id`\n * (defaulting to `\"unknown\"`).\n */\nexport function createToolContext(\n dataStore: DataStore,\n payload: Record<string, unknown>\n): ToolContext {\n const requestId =\n typeof payload.request_id === 'string' && payload.request_id !== ''\n ? payload.request_id\n : 'unknown'\n return new ToolContext(requestId, dataStore, null)\n}\n","/**\n * Environment-driven SDK configuration for a tool server. Port of the Go\n * `SDKConfig` / Python frozen `SDKConfig`. Read it with {@link SDKConfig.fromEnv};\n * construct directly (with explicit options) in tests.\n */\n\nimport { DEFAULT_HMAC_TOLERANCE_SECONDS } from './auth'\n\n/** Construction options for {@link SDKConfig}; each falls back to a default. */\nexport interface SDKConfigOptions {\n serverHost?: string\n serverPort?: number\n logLevel?: string\n awsRegion?: string\n dynamodbEndpoint?: string\n toolDataTable?: string\n environment?: string\n apiKey?: string\n platformUrl?: string\n hmacSecret?: string\n hmacToleranceSeconds?: number\n /** Secret for minting / verifying confirmation-handshake tokens. */\n toolConfirmationSecret?: string\n /** Whether the process runs in AWS Lambda (set by {@link SDKConfig.fromEnv}). */\n lambda?: boolean\n}\n\ntype EnvLike = Record<string, string | undefined>\n\nfunction envOr(env: EnvLike, key: string, fallback: string): string {\n const value = env[key]\n return value !== undefined && value !== '' ? value : fallback\n}\n\nfunction envIntOr(env: EnvLike, key: string, fallback: number): number {\n const value = env[key]\n if (value !== undefined && value !== '') {\n const parsed = Number(value)\n if (Number.isInteger(parsed)) {\n return parsed\n }\n }\n return fallback\n}\n\n/** Immutable SDK configuration. */\nexport class SDKConfig {\n readonly serverHost: string\n readonly serverPort: number\n readonly logLevel: string\n readonly awsRegion: string\n readonly dynamodbEndpoint: string\n readonly toolDataTable: string\n readonly environment: string\n readonly apiKey: string\n readonly platformUrl: string\n readonly hmacSecret: string\n readonly hmacToleranceSeconds: number\n readonly toolConfirmationSecret: string\n readonly #lambda: boolean\n\n constructor(options: SDKConfigOptions = {}) {\n this.serverHost = options.serverHost ?? '127.0.0.1'\n this.serverPort = options.serverPort ?? 8080\n this.logLevel = options.logLevel ?? 'INFO'\n this.awsRegion = options.awsRegion ?? 'ap-northeast-1'\n this.dynamodbEndpoint = options.dynamodbEndpoint ?? ''\n this.toolDataTable = options.toolDataTable ?? 'tool-data'\n this.environment = options.environment ?? 'local'\n this.apiKey = options.apiKey ?? ''\n this.platformUrl = options.platformUrl ?? 'https://api.convilyn.corenovus.com'\n this.hmacSecret = options.hmacSecret ?? ''\n this.hmacToleranceSeconds = options.hmacToleranceSeconds ?? DEFAULT_HMAC_TOLERANCE_SECONDS\n this.toolConfirmationSecret = options.toolConfirmationSecret ?? ''\n this.#lambda = options.lambda ?? false\n }\n\n /** True when running in AWS Lambda. */\n get isLambda(): boolean {\n return this.#lambda\n }\n\n /** True for a local/dev environment (relaxes HMAC). */\n get isLocal(): boolean {\n if (this.environment === 'local') {\n return true\n }\n return !this.#lambda && (this.serverHost === '127.0.0.1' || this.serverHost === 'localhost')\n }\n\n /** Load configuration from environment variables, falling back to defaults. */\n static fromEnv(env: EnvLike = typeof process !== 'undefined' ? process.env : {}): SDKConfig {\n return new SDKConfig({\n serverHost: envOr(env, 'CONVILYN_HOST', '127.0.0.1'),\n serverPort: envIntOr(env, 'CONVILYN_PORT', 8080),\n logLevel: envOr(env, 'CONVILYN_LOG_LEVEL', 'INFO'),\n awsRegion: envOr(env, 'AWS_REGION', 'ap-northeast-1'),\n dynamodbEndpoint: envOr(env, 'DYNAMODB_ENDPOINT', ''),\n toolDataTable: envOr(env, 'TOOL_DATA_TABLE', 'tool-data'),\n environment: envOr(env, 'CONVILYN_ENVIRONMENT', 'local'),\n apiKey: envOr(env, 'CONVILYN_API_KEY', ''),\n platformUrl: envOr(env, 'CONVILYN_PLATFORM_URL', 'https://api.convilyn.corenovus.com'),\n hmacSecret: envOr(env, 'CONVILYN_HMAC_SECRET', ''),\n hmacToleranceSeconds: envIntOr(\n env,\n 'CONVILYN_HMAC_TOLERANCE_SECONDS',\n DEFAULT_HMAC_TOLERANCE_SECONDS\n ),\n toolConfirmationSecret: envOr(env, 'CONVILYN_TOOL_CONFIRMATION_SECRET', ''),\n lambda: Boolean(env['AWS_LAMBDA_FUNCTION_NAME']),\n })\n }\n}\n","/**\n * `WorkflowSpec` — an immutable fluent builder for the portable workflow\n * authoring artifact the platform consumes.\n *\n * Two wire shapes, one method each (single responsibility per contract):\n *\n * - `compile()` emits the snake_case {@link WorkflowBlueprint} — the PUBLIC\n * publish artifact the Developer Portal's `submit_workflow` accepts, in\n * cross-SDK parity with the Python author SDK's `compile()`.\n * - `toExportPayload()` emits the camelCase {@link ExportPayload} — the\n * user_workflows authoring/canvas contract\n * (`docs/contracts/user_workflows/user_workflows_openapi.yaml`), which\n * carries UI-only metadata (positions, notes, canvasLayout) the blueprint\n * deliberately omits.\n *\n * Every `with*` / `add*` / `use*` method returns a NEW `WorkflowSpec` (the\n * receiver is never mutated), matching the project's immutability rule. Contract\n * constraints are enforced client-side so a bad spec fails fast with a clear\n * {@link ConvilynAuthorError} instead of a server 422.\n */\n\nimport { readFile, writeFile } from 'node:fs/promises'\nimport { ConvilynAuthorError } from './errors'\n\n/** Lifecycle visibility of a persisted workflow (set via the platform, not here). */\nexport type Visibility = 'private' | 'public' | 'archived'\n\n/** Provenance of a workflow's fork source. */\nexport type SourceType = 'curated' | 'user' | 'blank'\n\n/** 2D position on the Builder canvas — pure UI metadata, ignored by the agent. */\nexport interface Position {\n x: number\n y: number\n}\n\n/**\n * One tool the agent may call. `toolName` is the\n * `\"server-name:tool_name\"` form (e.g. `\"doc-parser-mcp:extract_text\"`).\n * `position` is UI-only and does not affect execution order.\n */\nexport interface ToolPaletteItem {\n toolName: string\n position: Position\n note?: string\n}\n\n/** Optional Builder-only canvas state. Ignored by the compiler and the agent. */\nexport interface CanvasLayout {\n edges?: Array<{ from: string; to: string }>\n viewport?: { zoom?: number; pan?: Position }\n}\n\n/** The camelCase user_workflows authoring/canvas artifact (`ExportPayload`). */\nexport interface ExportPayload {\n schemaVersion: string\n name: string\n description?: string\n systemPrompt: string\n toolPalette: ToolPaletteItem[]\n canvasLayout?: CanvasLayout\n tags: string[]\n}\n\n/**\n * Public blueprint schema version. The platform's translator is keyed on\n * this so its internal workflow contract can evolve without breaking an\n * already-published author SDK. Mirrors the Python SDK's `PUBLIC_SCHEMA_VERSION`.\n */\nexport const PUBLIC_SCHEMA_VERSION = '1'\n\n/** Public agent-mode knobs an author may set on a blueprint. */\nexport interface BlueprintAgentConfig {\n system_prompt?: string\n max_iterations?: number\n temperature?: number\n}\n\n/** MCP server and tool configuration (\"server:tool\" refs). */\nexport interface BlueprintMcpConfig {\n mcp_servers: string[]\n tools: string[]\n}\n\n/**\n * The compiled PUBLIC publish artifact — snake_case, in cross-SDK parity with\n * the Python author SDK's `WorkflowBlueprint`. This is what the Developer\n * Portal's `submit_workflow` accepts; platform-internal fields (category,\n * platform, prompt-template ids) are injected by the server-side translator.\n */\nexport interface WorkflowBlueprint {\n public_schema_version: string\n spec_id: string\n version: string\n name: string\n description?: string\n keywords?: string[]\n agent_config?: BlueprintAgentConfig\n mcp_config?: BlueprintMcpConfig\n}\n\n/** Cross-SDK alias — the Python SDK names its `compile()` output the same way. */\nexport type CompiledWorkflowSpec = WorkflowBlueprint\n\n// ── contract constraints (user_workflows_openapi.yaml) ───────────────────────\nconst DEFAULT_SCHEMA_VERSION = '1.0'\nconst MAX_NAME = 80\nconst MAX_DESCRIPTION = 500\nconst MAX_SYSTEM_PROMPT = 8000\nconst MAX_TOOLS = 20\nconst MAX_TOOL_NAME = 128\nconst MAX_NOTE = 200\nconst MAX_TAGS = 8\nconst MAX_TAG_LEN = 24\nconst ORIGIN: Position = { x: 0, y: 0 }\n/** Invariant I3: the pause-for-input tool is never allowed in a workflow palette. */\nconst FORBIDDEN_TOOL = 'request_user_input'\n\nconst DEFAULT_VERSION = '1.0.0'\nconst MAX_SPEC_ID = 128\nconst SEMVER_RE = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/\n\ninterface WorkflowSpecState {\n name: string\n description?: string\n systemPrompt: string\n schemaVersion: string\n specId?: string\n version: string\n tags: string[]\n toolPalette: ToolPaletteItem[]\n canvasLayout?: CanvasLayout\n}\n\nfunction validateName(name: string): void {\n if (name.length < 1 || name.length > MAX_NAME) {\n throw new ConvilynAuthorError(`name must be 1–${MAX_NAME} characters (got ${name.length})`)\n }\n}\n\nfunction validateSpecId(specId: string): void {\n if (specId.length < 1 || specId.length > MAX_SPEC_ID || /\\s/.test(specId)) {\n throw new ConvilynAuthorError(\n `specId must be 1–${MAX_SPEC_ID} characters with no whitespace ` +\n `(the portal expects the \"dev_<developer-id>.<name>\" namespace)`\n )\n }\n}\n\nfunction validateVersion(version: string): void {\n if (!SEMVER_RE.test(version)) {\n throw new ConvilynAuthorError(`version must be valid semver (e.g. \"1.0.0\"; got \"${version}\")`)\n }\n}\n\nfunction validateDescription(description: string): void {\n if (description.length > MAX_DESCRIPTION) {\n throw new ConvilynAuthorError(`description must be ≤ ${MAX_DESCRIPTION} characters`)\n }\n}\n\nfunction validateSystemPrompt(systemPrompt: string): void {\n if (systemPrompt.length > MAX_SYSTEM_PROMPT) {\n throw new ConvilynAuthorError(`systemPrompt must be ≤ ${MAX_SYSTEM_PROMPT} characters`)\n }\n}\n\nfunction validateTag(tag: string): void {\n if (tag.length < 1 || tag.length > MAX_TAG_LEN) {\n throw new ConvilynAuthorError(`tag \"${tag}\" must be 1–${MAX_TAG_LEN} characters`)\n }\n}\n\nfunction validateTags(tags: string[]): void {\n if (tags.length > MAX_TAGS) {\n throw new ConvilynAuthorError(`at most ${MAX_TAGS} tags are allowed (got ${tags.length})`)\n }\n tags.forEach(validateTag)\n}\n\nfunction toolKey(toolName: string): string {\n // The forbidden tool may arrive bare or fully-qualified (\"server:request_user_input\").\n const parts = toolName.split(':')\n return parts[parts.length - 1] ?? toolName\n}\n\nfunction validateToolName(toolName: string): void {\n if (toolName.length < 1 || toolName.length > MAX_TOOL_NAME) {\n throw new ConvilynAuthorError(`toolName must be 1–${MAX_TOOL_NAME} characters`)\n }\n if (toolKey(toolName) === FORBIDDEN_TOOL) {\n throw new ConvilynAuthorError(\n `tool \"${FORBIDDEN_TOOL}\" is not permitted in a workflow palette ` +\n `(the agent cannot pause mid-execution)`\n )\n }\n}\n\n/** Immutable builder for a portable workflow spec. */\nexport class WorkflowSpec {\n #state: WorkflowSpecState\n\n constructor(name: string, options: { specId?: string; version?: string } = {}) {\n validateName(name)\n if (options.specId != null) {\n validateSpecId(options.specId)\n }\n const version = options.version ?? DEFAULT_VERSION\n validateVersion(version)\n this.#state = {\n name,\n systemPrompt: '',\n schemaVersion: DEFAULT_SCHEMA_VERSION,\n specId: options.specId,\n version,\n tags: [],\n toolPalette: [],\n }\n }\n\n #cloneWith(patch: Partial<WorkflowSpecState>): WorkflowSpec {\n const next = new WorkflowSpec(this.#state.name)\n next.#state = {\n ...this.#state,\n ...patch,\n tags: [...(patch.tags ?? this.#state.tags)],\n toolPalette: [...(patch.toolPalette ?? this.#state.toolPalette)],\n }\n return next\n }\n\n // ── read-only accessors (return copies to preserve immutability) ──────────\n get name(): string {\n return this.#state.name\n }\n get description(): string | undefined {\n return this.#state.description\n }\n get systemPrompt(): string {\n return this.#state.systemPrompt\n }\n get schemaVersion(): string {\n return this.#state.schemaVersion\n }\n get specId(): string | undefined {\n return this.#state.specId\n }\n get version(): string {\n return this.#state.version\n }\n get tags(): readonly string[] {\n return [...this.#state.tags]\n }\n get toolPalette(): readonly ToolPaletteItem[] {\n return this.#state.toolPalette.map((item) => ({ ...item, position: { ...item.position } }))\n }\n get canvasLayout(): CanvasLayout | undefined {\n return this.#state.canvasLayout\n }\n\n // ── builder methods ───────────────────────────────────────────────────────\n withName(name: string): WorkflowSpec {\n validateName(name)\n return this.#cloneWith({ name })\n }\n\n withDescription(description: string): WorkflowSpec {\n validateDescription(description)\n return this.#cloneWith({ description })\n }\n\n withSystemPrompt(systemPrompt: string): WorkflowSpec {\n validateSystemPrompt(systemPrompt)\n return this.#cloneWith({ systemPrompt })\n }\n\n withSchemaVersion(schemaVersion: string): WorkflowSpec {\n return this.#cloneWith({ schemaVersion })\n }\n\n /** Set the portal spec id (`dev_<developer-id>.<name>` namespace). */\n withSpecId(specId: string): WorkflowSpec {\n validateSpecId(specId)\n return this.#cloneWith({ specId })\n }\n\n /** Set the blueprint semver version (default `1.0.0`). */\n withVersion(version: string): WorkflowSpec {\n validateVersion(version)\n return this.#cloneWith({ version })\n }\n\n /** Replace the tag set. */\n withTags(tags: string[]): WorkflowSpec {\n validateTags(tags)\n return this.#cloneWith({ tags: [...tags] })\n }\n\n /** Append a tag (no-op if already present). */\n addTag(tag: string): WorkflowSpec {\n validateTag(tag)\n if (this.#state.tags.includes(tag)) {\n return this.#cloneWith({})\n }\n const tags = [...this.#state.tags, tag]\n validateTags(tags)\n return this.#cloneWith({ tags })\n }\n\n /**\n * Add (or replace, by `toolName`) one tool on the palette. Rejects the\n * `request_user_input` tool (invariant I3) and palettes larger than\n * {@link MAX_TOOLS}.\n */\n addTool(toolName: string, options: { position?: Position; note?: string } = {}): WorkflowSpec {\n validateToolName(toolName)\n if (options.note != null && options.note.length > MAX_NOTE) {\n throw new ConvilynAuthorError(`tool note must be ≤ ${MAX_NOTE} characters`)\n }\n const item: ToolPaletteItem = {\n toolName,\n position: options.position ? { ...options.position } : { ...ORIGIN },\n ...(options.note != null ? { note: options.note } : {}),\n }\n const existing = this.#state.toolPalette.findIndex((entry) => entry.toolName === toolName)\n const toolPalette =\n existing >= 0\n ? this.#state.toolPalette.map((entry, index) => (index === existing ? item : entry))\n : [...this.#state.toolPalette, item]\n if (toolPalette.length > MAX_TOOLS) {\n throw new ConvilynAuthorError(`at most ${MAX_TOOLS} tools are allowed`)\n }\n return this.#cloneWith({ toolPalette })\n }\n\n /** Add several tools by name (default canvas position), de-duplicated. */\n useTools(...toolNames: string[]): WorkflowSpec {\n return toolNames.reduce<WorkflowSpec>((spec, toolName) => spec.addTool(toolName), this)\n }\n\n withCanvasLayout(canvasLayout: CanvasLayout): WorkflowSpec {\n return this.#cloneWith({ canvasLayout })\n }\n\n // ── compile / serialize ───────────────────────────────────────────────────\n /**\n * The PUBLIC publish blueprint (snake_case; Python-SDK parity). This is the\n * shape `submitWorkflow` / `convilyn-author push` send to the Developer\n * Portal. Requires a `specId` (constructor option or {@link withSpecId}).\n *\n * Mirrors the Python SDK's `exclude_none` semantics: `agent_config` is\n * emitted only when a systemPrompt is set, `mcp_config` only when the\n * palette is non-empty. UI-only metadata (positions, notes, canvasLayout)\n * is deliberately NOT emitted — the portal's blueprint schema rejects\n * unknown fields; that data belongs to {@link toExportPayload}.\n */\n compile(): WorkflowBlueprint {\n const specId = this.#state.specId\n if (specId == null) {\n throw new ConvilynAuthorError(\n 'compile() requires a specId — pass it to the constructor ' +\n '(new WorkflowSpec(name, { specId })) or call withSpecId(). ' +\n 'The Developer Portal expects the \"dev_<developer-id>.<name>\" namespace.'\n )\n }\n const blueprint: WorkflowBlueprint = {\n public_schema_version: PUBLIC_SCHEMA_VERSION,\n spec_id: specId,\n version: this.#state.version,\n name: this.#state.name,\n keywords: [...this.#state.tags],\n }\n if (this.#state.description != null) {\n blueprint.description = this.#state.description\n }\n if (this.#state.systemPrompt !== '') {\n blueprint.agent_config = { system_prompt: this.#state.systemPrompt }\n }\n if (this.#state.toolPalette.length > 0) {\n const tools = this.#state.toolPalette.map((item) => item.toolName)\n const servers = [\n ...new Set(\n tools\n .filter((toolName) => toolName.includes(':'))\n .map((toolName) => toolName.split(':')[0] as string)\n ),\n ]\n blueprint.mcp_config = { mcp_servers: servers, tools }\n }\n return blueprint\n }\n\n /** The compiled blueprint serialised as 2-space-indented JSON. */\n compileJson(): string {\n return JSON.stringify(this.compile(), null, 2)\n }\n\n /** Write the compiled blueprint to a JSON file (default `workflow.spec.json`). */\n async save(path = 'workflow.spec.json'): Promise<string> {\n await writeFile(path, this.compileJson(), 'utf8')\n return path\n }\n\n /**\n * The camelCase user_workflows `ExportPayload` (canvas/authoring contract).\n * Carries the UI-only metadata (positions, notes, canvasLayout) that the\n * publish blueprint omits.\n */\n toExportPayload(): ExportPayload {\n const payload: ExportPayload = {\n schemaVersion: this.#state.schemaVersion,\n name: this.#state.name,\n systemPrompt: this.#state.systemPrompt,\n toolPalette: this.#state.toolPalette.map((item) => ({\n toolName: item.toolName,\n position: { ...item.position },\n ...(item.note != null ? { note: item.note } : {}),\n })),\n tags: [...this.#state.tags],\n }\n if (this.#state.description != null) {\n payload.description = this.#state.description\n }\n if (this.#state.canvasLayout != null) {\n payload.canvasLayout = this.#state.canvasLayout\n }\n return payload\n }\n\n /** Rebuild a {@link WorkflowSpec} from a user_workflows `ExportPayload`. */\n static fromExportPayload(payload: ExportPayload): WorkflowSpec {\n let spec = new WorkflowSpec(payload.name)\n .withSystemPrompt(payload.systemPrompt ?? '')\n .withSchemaVersion(payload.schemaVersion ?? DEFAULT_SCHEMA_VERSION)\n .withTags(payload.tags ?? [])\n if (payload.description != null) {\n spec = spec.withDescription(payload.description)\n }\n if (payload.canvasLayout != null) {\n spec = spec.withCanvasLayout(payload.canvasLayout)\n }\n for (const item of payload.toolPalette ?? []) {\n spec = spec.addTool(item.toolName, {\n position: item.position,\n ...(item.note != null ? { note: item.note } : {}),\n })\n }\n return spec\n }\n\n /**\n * Rebuild a {@link WorkflowSpec} from a publish blueprint. Lossy for canvas\n * metadata by design — that data lives in the `ExportPayload` contract.\n */\n static fromBlueprint(blueprint: WorkflowBlueprint): WorkflowSpec {\n let spec = new WorkflowSpec(blueprint.name, {\n specId: blueprint.spec_id,\n ...(blueprint.version != null ? { version: blueprint.version } : {}),\n })\n .withSystemPrompt(blueprint.agent_config?.system_prompt ?? '')\n .withTags(blueprint.keywords ?? [])\n if (blueprint.description != null) {\n spec = spec.withDescription(blueprint.description)\n }\n for (const toolName of blueprint.mcp_config?.tools ?? []) {\n spec = spec.addTool(toolName)\n }\n return spec\n }\n\n /**\n * Parse a spec from a JSON string. Shape-sniffs: objects carrying `spec_id`\n * or `public_schema_version` parse as a blueprint; anything else as an\n * `ExportPayload` — so `push --workflow-file` accepts both file formats.\n */\n static fromJson(data: string): WorkflowSpec {\n const parsed: unknown = JSON.parse(data)\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new ConvilynAuthorError('workflow spec JSON must be an object')\n }\n if ('spec_id' in parsed || 'public_schema_version' in parsed) {\n return WorkflowSpec.fromBlueprint(parsed as WorkflowBlueprint)\n }\n return WorkflowSpec.fromExportPayload(parsed as ExportPayload)\n }\n\n /** Read a saved spec from a JSON file (default `workflow.spec.json`). */\n static async load(path = 'workflow.spec.json'): Promise<WorkflowSpec> {\n return WorkflowSpec.fromJson(await readFile(path, 'utf8'))\n }\n}\n","/**\n * JSON-RPC 2.0 envelope types + constructors for the `/mcp` runtime. The wire\n * shape matches the `mcp-shared` framework and the Python / Go author SDKs so a\n * TS-authored server is interchangeable behind the same gateway:\n *\n * request { jsonrpc:\"2.0\", method:\"tools/call\", params:{ name, arguments, context? }, id }\n * response { jsonrpc:\"2.0\", result?, error?:{ code, message, data? }, id }\n *\n * Tool-level outcomes (validation failures, tool errors) ride inside `result`\n * as a ToolResult envelope — only protocol-level faults use the `error` member.\n */\n\n/** JSON-RPC protocol version string. */\nexport const JSONRPC_VERSION = '2.0'\n\n/** Standard JSON-RPC 2.0 error codes (the only ones the `/mcp` runtime emits). */\nexport const PARSE_ERROR = -32700\nexport const INVALID_REQUEST = -32600\nexport const METHOD_NOT_FOUND = -32601\nexport const INVALID_PARAMS = -32602\nexport const INTERNAL_ERROR = -32603\n\n/** The single method the runtime dispatches. */\nexport const TOOLS_CALL = 'tools/call'\n\n/** An inbound JSON-RPC request. */\nexport interface JSONRPCRequest {\n jsonrpc: string\n method: string\n params?: Record<string, unknown>\n id?: string | number | null\n}\n\n/** The `error` member of a JSON-RPC response. */\nexport interface JSONRPCErrorObject {\n code: number\n message: string\n data?: Record<string, unknown>\n}\n\n/** An outbound JSON-RPC response (exactly one of `result` / `error`). */\nexport interface JSONRPCResponse {\n jsonrpc: typeof JSONRPC_VERSION\n result?: unknown\n error?: JSONRPCErrorObject\n id: string | number | null\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/**\n * Coerce parsed JSON into a {@link JSONRPCRequest}, or `null` when it is not a\n * well-formed request object (missing/`non-string method). The `id` defaults to\n * `null` so a response can always echo it.\n */\nexport function asRpcRequest(parsed: unknown): JSONRPCRequest | null {\n if (!isRecord(parsed) || typeof parsed.method !== 'string') {\n return null\n }\n const id = typeof parsed.id === 'string' || typeof parsed.id === 'number' ? parsed.id : null\n return {\n jsonrpc: typeof parsed.jsonrpc === 'string' ? parsed.jsonrpc : JSONRPC_VERSION,\n method: parsed.method,\n params: isRecord(parsed.params) ? parsed.params : {},\n id,\n }\n}\n\n/** Build a success response echoing `id`. */\nexport function rpcResult(id: string | number | null, result: unknown): JSONRPCResponse {\n return { jsonrpc: JSONRPC_VERSION, result, id }\n}\n\n/** Build an error response echoing `id`. */\nexport function rpcError(\n id: string | number | null,\n code: number,\n message: string,\n data?: Record<string, unknown>\n): JSONRPCResponse {\n const error: JSONRPCErrorObject = data !== undefined ? { code, message, data } : { code, message }\n return { jsonrpc: JSONRPC_VERSION, error, id }\n}\n","/**\n * Serialises an author-facing {@link ToolResult} into the snake_case ToolResult\n * **wire envelope** the gateway expects. The author SDK keeps the result ergonomic\n * (`ToolResult.ok` / `.fail`); this module bridges it to the richer wire shape:\n *\n * { summary, status, data?, ref_id?, validation_errors?, error?,\n * success, error_code, error_message }\n *\n * `summary` is required on the wire (1–2000 chars); it is taken from\n * {@link ToolResult.summary} when the author set one, otherwise derived here.\n *\n * Scope: statuses `ok` / `tool_error` / `validation_error`. The\n * `needs_confirmation` handshake and `cost_micro_u` / `cost_breakdown` land in a\n * follow-up.\n */\n\nimport type { DataStore } from './datastore'\nimport type { ToolResult } from './types'\n\n/** Tool execution status carried on the wire (A3 subset). */\nexport type ToolStatus = 'ok' | 'tool_error' | 'validation_error'\n\n/** One field-level validation failure (status `validation_error`). */\nexport interface ValidationIssueWire {\n field: string\n issue: string\n expected?: string\n}\n\n/** The snake_case ToolResult envelope as published on the wire. */\nexport interface ToolResultWire {\n summary: string\n status: ToolStatus\n data?: Record<string, unknown>\n ref_id?: string\n validation_errors?: ValidationIssueWire[]\n error?: { code: string; message: string; details?: Record<string, unknown> }\n // Legacy mirror fields (the gateway reads these for back-compat).\n success: boolean\n error_code: string | null\n error_message: string | null\n}\n\n/** Inline payloads larger than this (bytes, UTF-8) are offloaded to the DataStore. */\nexport const OUTPUT_INLINE_THRESHOLD_BYTES = 16384\n\nconst SUMMARY_MAX = 2000\n\n/** Clamp a summary to the wire bounds (1–2000 chars), never empty. */\nfunction clampSummary(summary: string): string {\n const trimmed = summary.length > SUMMARY_MAX ? summary.slice(0, SUMMARY_MAX) : summary\n return trimmed.length > 0 ? trimmed : 'Tool executed.'\n}\n\n/** Build the `ok` envelope, offloading oversized `data` to the store. */\nasync function okEnvelope(\n data: Record<string, unknown>,\n summary: string,\n dataStore: DataStore\n): Promise<ToolResultWire> {\n const base: ToolResultWire = {\n summary: clampSummary(summary),\n status: 'ok',\n success: true,\n error_code: null,\n error_message: null,\n }\n const serialised = JSON.stringify(data)\n if (Buffer.byteLength(serialised, 'utf8') > OUTPUT_INLINE_THRESHOLD_BYTES) {\n base.ref_id = await dataStore.store(data)\n } else {\n base.data = data\n }\n return base\n}\n\n/** Build a `tool_error` envelope. */\nfunction toolErrorEnvelope(\n code: string,\n message: string,\n summary: string,\n details?: Record<string, unknown>\n): ToolResultWire {\n return {\n summary: clampSummary(summary),\n status: 'tool_error',\n error: details ? { code, message, details } : { code, message },\n success: false,\n error_code: code,\n error_message: message,\n }\n}\n\n/** Build a `validation_error` envelope from a list of field issues. */\nexport function validationErrorEnvelope(issues: ValidationIssueWire[]): ToolResultWire {\n const first = issues[0]\n const summary = first ? `Invalid input: ${first.field} — ${first.issue}` : 'Invalid input'\n return {\n summary: clampSummary(summary),\n status: 'validation_error',\n validation_errors: issues,\n error: { code: 'INPUT_VALIDATION_ERROR', message: summary },\n success: false,\n error_code: 'INPUT_VALIDATION_ERROR',\n error_message: summary,\n }\n}\n\n/**\n * Map an author {@link ToolResult} to the wire envelope. Uses the author's\n * `summary` when present, else derives one. Async because oversized `ok` data is\n * offloaded to the {@link DataStore} (returning `ref_id` instead of inline `data`).\n */\nexport async function toWireEnvelope(\n result: ToolResult,\n dataStore: DataStore\n): Promise<ToolResultWire> {\n if (result.success) {\n const data = result.data ?? {}\n const summary = result.summary ?? 'Tool executed successfully.'\n return okEnvelope(data, summary, dataStore)\n }\n const code = result.error?.code ?? 'TOOL_INTERNAL_ERROR'\n const message = result.error?.message ?? 'Tool execution failed'\n const summary = result.summary ?? message\n return toolErrorEnvelope(code, message, summary, result.error?.details)\n}\n\n/** Build an `ok` envelope directly (used by the built-in `get_tool_data`). */\nexport function rawOkEnvelope(data: Record<string, unknown>, summary: string): ToolResultWire {\n return {\n summary: clampSummary(summary),\n status: 'ok',\n data,\n success: true,\n error_code: null,\n error_message: null,\n }\n}\n\n/** Build a `tool_error` envelope directly (used by the built-in `get_tool_data`). */\nexport function rawToolErrorEnvelope(\n code: string,\n message: string,\n summary: string\n): ToolResultWire {\n return toolErrorEnvelope(code, message, summary)\n}\n","/**\n * `ToolServer` — the registry of an author's tools and the transport-free\n * JSON-RPC dispatcher behind the `/mcp` endpoint. {@link ToolServer.dispatch} is\n * pure (request in, response out), so it is unit-testable without sockets; the\n * Node `http` wiring lives in `http-runtime.ts`.\n *\n * Dispatch contract (matches the `mcp-shared` framework):\n * - only `tools/call` is supported; any other method → `-32601`.\n * - missing `params.name` → `-32602`; unknown tool → `-32601`.\n * - input that fails the tool's Zod schema → a `validation_error` ToolResult\n * envelope inside `result` (NOT a JSON-RPC error).\n * - a handler that throws → `-32603`.\n * - the built-in `get_tool_data` resolves a `ref_id` from the DataStore; it is\n * not listed in the manifest (the platform injects it globally).\n */\n\nimport { ConvilynManifest } from './manifest'\nimport { InMemoryDataStore, type DataStore } from './datastore'\nimport { createToolContext } from './context'\nimport {\n rpcError,\n rpcResult,\n INTERNAL_ERROR,\n INVALID_PARAMS,\n METHOD_NOT_FOUND,\n TOOLS_CALL,\n type JSONRPCRequest,\n type JSONRPCResponse,\n} from './jsonrpc'\nimport {\n rawOkEnvelope,\n rawToolErrorEnvelope,\n toWireEnvelope,\n validationErrorEnvelope,\n type ValidationIssueWire,\n} from './tool-result-wire'\nimport type { ServerSpec } from './types'\nimport type { ToolDefinition } from './tool'\nimport { ConvilynAuthorError } from './errors'\n\n/** The built-in tool that resolves an offloaded `ref_id` to its full payload. */\nexport const GET_TOOL_DATA = 'get_tool_data'\n\n/** Options for constructing a {@link ToolServer}. */\nexport interface ToolServerOptions {\n tools?: ToolDefinition[]\n capabilities?: string[]\n /** Backing store for `ref_id` offload + retrieval; defaults to in-memory. */\n dataStore?: DataStore\n sdkVersion?: string\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n/** A minimal view of a Zod issue (avoids importing zod at runtime). */\ninterface ZodIssueLike {\n path: ReadonlyArray<string | number>\n message: string\n code?: string\n}\n\nfunction toValidationIssues(issues: ReadonlyArray<ZodIssueLike>): ValidationIssueWire[] {\n return issues.map((issue) => {\n const field = issue.path.length > 0 ? issue.path.join('.') : '.'\n const wire: ValidationIssueWire = { field, issue: issue.message }\n if (issue.code) {\n wire.expected = issue.code\n }\n return wire\n })\n}\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\n/** The registry of an author's tools plus the JSON-RPC dispatcher. */\nexport class ToolServer {\n readonly server: ServerSpec\n readonly dataStore: DataStore\n readonly #tools = new Map<string, ToolDefinition>()\n readonly #capabilities: string[]\n readonly #sdkVersion?: string\n\n constructor(server: ServerSpec, options: ToolServerOptions = {}) {\n this.server = server\n this.dataStore = options.dataStore ?? new InMemoryDataStore()\n this.#capabilities = [...(options.capabilities ?? [])]\n this.#sdkVersion = options.sdkVersion\n for (const tool of options.tools ?? []) {\n this.register(tool)\n }\n }\n\n /** Register a tool. Throws on a duplicate name. Chainable. */\n register(tool: ToolDefinition): this {\n if (tool.name === GET_TOOL_DATA) {\n throw new ConvilynAuthorError(`tool name \"${GET_TOOL_DATA}\" is reserved`)\n }\n if (this.#tools.has(tool.name)) {\n throw new ConvilynAuthorError(`duplicate tool name: ${tool.name}`)\n }\n this.#tools.set(tool.name, tool)\n return this\n }\n\n /** Names of the registered (author) tools. */\n get toolNames(): string[] {\n return [...this.#tools.keys()]\n }\n\n /** Number of registered (author) tools — the `/health` `tool_count`. */\n get toolCount(): number {\n return this.#tools.size\n }\n\n /** The compiled manifest blueprint for this server. */\n manifest(): ConvilynManifest {\n const tools = [...this.#tools.values()].map((tool) => tool.toSpec())\n return new ConvilynManifest(this.server, {\n tools,\n capabilities: this.#capabilities,\n sdkVersion: this.#sdkVersion,\n })\n }\n\n /**\n * Dispatch one JSON-RPC request. Pure and transport-free: never throws for a\n * tool fault — protocol faults become a JSON-RPC `error`, tool/validation\n * faults become a ToolResult envelope inside `result`.\n */\n async dispatch(request: JSONRPCRequest): Promise<JSONRPCResponse> {\n const id = request.id ?? null\n\n if (request.method !== TOOLS_CALL) {\n return rpcError(id, METHOD_NOT_FOUND, `unsupported method: ${request.method}`)\n }\n\n const params = request.params ?? {}\n const name = params.name\n if (typeof name !== 'string' || name === '') {\n return rpcError(id, INVALID_PARAMS, 'params.name is required')\n }\n\n const args = isRecord(params.arguments) ? params.arguments : {}\n const ctx = createToolContext(this.dataStore, isRecord(params.context) ? params.context : {})\n\n if (name === GET_TOOL_DATA) {\n return this.#dispatchGetToolData(id, args)\n }\n\n const tool = this.#tools.get(name)\n if (!tool) {\n return rpcError(id, METHOD_NOT_FOUND, `unknown tool: ${name}`)\n }\n\n const parsed = tool.inputSchema.safeParse(args)\n if (!parsed.success) {\n const issues = toValidationIssues(parsed.error.issues as ReadonlyArray<ZodIssueLike>)\n return rpcResult(id, validationErrorEnvelope(issues))\n }\n\n try {\n const result = await tool.handler(parsed.data, ctx)\n const envelope = await toWireEnvelope(result, this.dataStore)\n return rpcResult(id, envelope)\n } catch (err) {\n return rpcError(id, INTERNAL_ERROR, errorMessage(err))\n }\n }\n\n async #dispatchGetToolData(\n id: string | number | null,\n args: Record<string, unknown>\n ): Promise<JSONRPCResponse> {\n const refId = args.ref_id\n if (typeof refId !== 'string' || refId === '') {\n return rpcResult(\n id,\n rawToolErrorEnvelope(\n 'INPUT_VALIDATION_ERROR',\n 'get_tool_data requires a string ref_id',\n 'Invalid input: ref_id is required'\n )\n )\n }\n const stored = await this.dataStore.get(refId)\n if (stored === null) {\n return rpcResult(\n id,\n rawToolErrorEnvelope(\n 'DEPENDENCY_NOT_FOUND',\n `no data stored for ref_id ${refId}`,\n `No data for ${refId}`\n )\n )\n }\n return rpcResult(id, rawOkEnvelope(stored, `Retrieved data for ${refId}`))\n }\n}\n","/**\n * Node `http` runtime for a {@link ToolServer}. Exposes the three endpoints the\n * gateway expects:\n *\n * GET /health → { status, server, version, tool_count }\n * GET /manifest → the server manifest (snake_case wire object)\n * POST /mcp → HMAC-verified JSON-RPC `tools/call` dispatch\n *\n * The HMAC signature covers the **raw request body bytes**, so the body buffer is\n * captured before any `JSON.parse`. Verification reuses {@link verifySignature}\n * (byte-for-byte parity with the gateway signer). No external dependencies.\n */\n\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http'\nimport { verifySignature } from './auth'\nimport { ConvilynStartupError, InvalidSignatureError } from './errors'\nimport { SDKConfig } from './config'\nimport { VERSION } from './version'\nimport { asRpcRequest } from './jsonrpc'\nimport type { ToolServer } from './tool-server'\n\n/** Options for {@link serve}; unset fields fall back to {@link SDKConfig}. */\nexport interface ServeOptions {\n port?: number\n host?: string\n /** HMAC secret for `/mcp` verification. Required to accept signed requests. */\n hmacSecret?: string\n toleranceSeconds?: number\n /**\n * Explicit INSECURE local-development opt-in: with no secret configured,\n * `serve` refuses to start unless this is `true` (set by `convilyn-author\n * dev`) or `CONVILYN_DEV_INSECURE=1` is in the environment. A configured\n * secret always wins — the opt-in never bypasses verification.\n */\n allowInsecure?: boolean\n /** Pre-built config; defaults to {@link SDKConfig.fromEnv}. */\n config?: SDKConfig\n}\n\n/**\n * Environment variable that explicitly opts a bare `serve()` process into\n * INSECURE local development (no inbound signature verification). Port of the\n * Python `ENV_DEV_INSECURE` / Go `EnvDevInsecure`.\n */\nexport const ENV_DEV_INSECURE = 'CONVILYN_DEV_INSECURE'\n\nconst DEV_INSECURE_TRUTHY = new Set(['1', 'true', 'yes', 'on'])\n\n/**\n * True iff the operator explicitly opted into insecure local dev. Any other\n * value (including unset) is \"not opted in\" — the secure default is\n * fail-closed.\n */\nexport function devInsecureRequested(env: NodeJS.ProcessEnv = process.env): boolean {\n return DEV_INSECURE_TRUTHY.has((env[ENV_DEV_INSECURE] ?? '').trim().toLowerCase())\n}\n\nconst JSON_HEADERS = { 'content-type': 'application/json' } as const\n\nfunction sendJson(res: ServerResponse, statusCode: number, body: unknown): void {\n res.writeHead(statusCode, JSON_HEADERS)\n res.end(JSON.stringify(body))\n}\n\n/**\n * Inbound `/mcp` body cap (10 MB) — cross-SDK invariant shared with the\n * Python / Go author runtimes. Enforced while streaming, BEFORE signature\n * verification, so an unauthenticated caller cannot buffer unbounded bytes.\n */\nexport const MAX_BODY_BYTES = 10 * 1024 * 1024\n\n/** Thrown by {@link readBody} when the inbound body exceeds the cap. */\nclass BodyTooLargeError extends Error {\n constructor() {\n super(`Request body exceeds ${MAX_BODY_BYTES} bytes`)\n this.name = 'BodyTooLargeError'\n }\n}\n\n/** Collect the full request body as a Buffer (the bytes the HMAC signs). */\nfunction readBody(req: IncomingMessage, maxBytes: number = MAX_BODY_BYTES): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n let total = 0\n req.on('data', (chunk: Buffer) => {\n total += chunk.length\n if (total > maxBytes) {\n // Stop buffering (later chunks are ignored) but keep the socket alive\n // so the caller can still answer 413 on the shared connection.\n chunks.length = 0\n reject(new BodyTooLargeError())\n return\n }\n chunks.push(chunk)\n })\n req.on('end', () => resolve(Buffer.concat(chunks)))\n req.on('error', reject)\n })\n}\n\nasync function handleMcp(\n server: ToolServer,\n req: IncomingMessage,\n res: ServerResponse,\n secret: string,\n toleranceSeconds: number,\n allowInsecure: boolean\n): Promise<void> {\n let body: Buffer\n try {\n body = await readBody(req)\n } catch (err) {\n if (err instanceof BodyTooLargeError) {\n // Answer first, then cut the connection once the response has flushed —\n // an endless streamer must not keep the socket (and kernel buffers) open.\n res.once('finish', () => req.destroy())\n sendJson(res, 413, {\n code: 'PAYLOAD_TOO_LARGE',\n message: 'Request body too large',\n })\n return\n }\n throw err\n }\n\n // Fail-closed: with no secret, only the explicit insecure-local opt-in\n // skips verification (serve() already warned loudly at startup). With a\n // secret configured the opt-in is ignored — verification always runs.\n if (secret === '' && allowInsecure) {\n await dispatchParsed(server, res, body)\n return\n }\n\n try {\n verifySignature(secret, body, req.headers as Record<string, string | undefined>, {\n toleranceSeconds,\n })\n } catch (err) {\n if (err instanceof InvalidSignatureError) {\n sendJson(res, 401, {\n code: 'INVALID_SIGNATURE',\n message: 'Request signature could not be verified',\n })\n return\n }\n throw err\n }\n\n await dispatchParsed(server, res, body)\n}\n\n/** Parse the (already-authorized) body and dispatch the JSON-RPC request. */\nasync function dispatchParsed(\n server: ToolServer,\n res: ServerResponse,\n body: Buffer\n): Promise<void> {\n let parsed: unknown\n try {\n parsed = JSON.parse(body.toString('utf8'))\n } catch {\n sendJson(res, 400, { error: 'Invalid JSON' })\n return\n }\n\n const request = asRpcRequest(parsed)\n if (request === null) {\n sendJson(res, 400, { error: 'Invalid JSON' })\n return\n }\n\n const response = await server.dispatch(request)\n sendJson(res, 200, response)\n}\n\n/**\n * Build and start an HTTP server for `toolServer`. Returns the listening\n * {@link Server}; await its `listening` event (and read `.address()`) for the\n * bound port when `port` is `0`.\n *\n * **Fail-closed:** unless an HMAC secret is configured, `serve` throws\n * {@link ConvilynStartupError} — independent of `CONVILYN_ENVIRONMENT` or the\n * bind host. Insecure local development must be opted into explicitly, either\n * via `allowInsecure: true` (passed by `convilyn-author dev`) or by setting\n * `CONVILYN_DEV_INSECURE=1`. Port of the Python `start_server`.\n */\nexport function serve(toolServer: ToolServer, options: ServeOptions = {}): Server {\n const config = options.config ?? SDKConfig.fromEnv()\n const host = options.host ?? config.serverHost\n const port = options.port ?? config.serverPort\n const secret = options.hmacSecret ?? config.hmacSecret\n const toleranceSeconds = options.toleranceSeconds ?? config.hmacToleranceSeconds\n const allowInsecure = options.allowInsecure ?? devInsecureRequested()\n\n if (secret === '' && !allowInsecure) {\n throw new ConvilynStartupError(\n 'CONVILYN_HMAC_SECRET is required to serve inbound /mcp traffic. ' +\n 'Refusing to start without signature verification. For local ' +\n `development use \\`convilyn-author dev\\` or set ${ENV_DEV_INSECURE}=1 ` +\n '(INSECURE — local only).'\n )\n }\n if (secret === '') {\n console.warn(\n 'convilyn-author: CONVILYN_HMAC_SECRET not set; serving /mcp WITHOUT ' +\n 'signature verification (insecure local dev only — do NOT deploy this configuration)'\n )\n }\n\n const httpServer = createServer((req, res) => {\n void route(toolServer, req, res, secret, toleranceSeconds, allowInsecure).catch(() => {\n if (!res.headersSent) {\n sendJson(res, 500, { error: 'Internal server error' })\n }\n })\n })\n\n httpServer.listen(port, host)\n return httpServer\n}\n\nasync function route(\n toolServer: ToolServer,\n req: IncomingMessage,\n res: ServerResponse,\n secret: string,\n toleranceSeconds: number,\n allowInsecure: boolean\n): Promise<void> {\n const path = (req.url ?? '').split('?')[0]\n const method = req.method ?? 'GET'\n\n if (method === 'GET' && path === '/health') {\n sendJson(res, 200, {\n status: 'healthy',\n server: toolServer.server.name,\n version: VERSION,\n tool_count: toolServer.toolCount,\n })\n return\n }\n\n if (method === 'GET' && path === '/manifest') {\n sendJson(res, 200, toolServer.manifest().toWire())\n return\n }\n\n if (method === 'POST' && path === '/mcp') {\n await handleMcp(toolServer, req, res, secret, toleranceSeconds, allowInsecure)\n return\n }\n\n sendJson(res, 404, { error: 'Not found' })\n}\n","/**\n * Local, offline compliance checks for a {@link ToolServer} — the producer of\n * the {@link ComplianceReport} the `convilyn-author test` command (and the A5\n * local harness) report. No platform calls; nothing leaves the process.\n *\n * Checks are deliberately non-invasive: schemas and the runtime plumbing are\n * exercised, but author tool handlers are NOT blindly invoked (they may have\n * real side effects / external calls). `get_tool_data` is exercised against a\n * value the harness stores itself.\n */\n\nimport type { ToolServer } from './tool-server'\nimport { GET_TOOL_DATA } from './tool-server'\nimport { TOOLS_CALL } from './jsonrpc'\nimport type { ComplianceReport, ComplianceResult } from './types'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction pass(checkName: string, message: string): ComplianceResult {\n return { passed: true, checkName, message }\n}\n\nfunction fail(checkName: string, message: string): ComplianceResult {\n return { passed: false, checkName, message }\n}\n\nfunction checkServerMetadata(server: ToolServer): ComplianceResult {\n const { name, version, description } = server.server\n if (!name || !version || !description) {\n return fail('server_metadata', 'server name, version, and description must all be non-empty')\n }\n return pass('server_metadata', 'server metadata is complete')\n}\n\nfunction checkToolsExist(server: ToolServer): ComplianceResult {\n return server.toolCount > 0\n ? pass('tools_exist', `server has ${server.toolCount} tool(s)`)\n : fail('tools_exist', 'server has no registered tools')\n}\n\nfunction checkToolSchemas(server: ToolServer): ComplianceResult {\n for (const tool of server.manifest().tools) {\n if (!tool.name || !tool.description) {\n return fail('tool_schemas', `tool \"${tool.name}\" is missing a name or description`)\n }\n if (!isRecord(tool.inputSchema) || tool.inputSchema.type !== 'object') {\n return fail('tool_schemas', `tool \"${tool.name}\" input_schema is not a JSON-Schema object`)\n }\n }\n return pass('tool_schemas', 'all tool schemas are valid')\n}\n\nfunction checkManifestSynth(server: ToolServer): ComplianceResult {\n try {\n const wire = server.manifest().toWire()\n return isRecord(wire)\n ? pass('manifest_synth', 'manifest compiles to a wire object')\n : fail('manifest_synth', 'manifest did not compile to an object')\n } catch (err) {\n return fail('manifest_synth', `manifest synth threw: ${(err as Error).message}`)\n }\n}\n\nasync function checkRefIdPattern(server: ToolServer): Promise<ComplianceResult> {\n const refId = await server.dataStore.store({ __compliance_probe__: true })\n return /^td_[0-9a-f]{12}$/.test(refId)\n ? pass('ref_id_pattern', 'data store returns a td_<12-hex> ref_id')\n : fail('ref_id_pattern', `ref_id \"${refId}\" does not match td_<12-hex>`)\n}\n\nasync function checkGetToolData(server: ToolServer): Promise<ComplianceResult> {\n const refId = await server.dataStore.store({ probe: 1 })\n const response = await server.dispatch({\n jsonrpc: '2.0',\n method: TOOLS_CALL,\n params: { name: GET_TOOL_DATA, arguments: { ref_id: refId } },\n id: 'compliance',\n })\n const result = response.result\n if (isRecord(result) && result.status === 'ok') {\n return pass('get_tool_data', 'built-in get_tool_data resolves a stored ref_id')\n }\n return fail('get_tool_data', 'built-in get_tool_data did not resolve a stored ref_id')\n}\n\n/**\n * Run the local compliance suite against a server, returning a\n * {@link ComplianceReport}. Use {@link allChecksPassed} / {@link failedChecks}\n * (from `./types`) to interpret it.\n */\nexport async function runComplianceChecks(server: ToolServer): Promise<ComplianceReport> {\n const results: ComplianceResult[] = [\n checkServerMetadata(server),\n checkToolsExist(server),\n checkToolSchemas(server),\n checkManifestSynth(server),\n await checkRefIdPattern(server),\n await checkGetToolData(server),\n ]\n return { results }\n}\n","/**\n * `ConvilynClient` — a fetch-based client for the **Developer Portal**\n * (`/api/v1/developers/*`), the platform's third-party author/publish surface.\n *\n * This is the TypeScript counterpart of the Python `convilyn_sdk.ConvilynClient`\n * (`sdk/author-python/src/convilyn_sdk/client.py`): the author BUILDS a tool\n * server + workflow spec locally (`ToolServer`, `WorkflowSpec`,\n * `runComplianceChecks`), then INTEGRATES its own artifacts by registering them\n * through the portal:\n *\n * POST /developers/register — mint a `cvl_` developer key (no auth)\n * POST /developers/servers — submit a tool-server manifest\n * GET /developers/servers — list\n * GET /developers/servers/{id}/status — verification status\n * POST /developers/servers/{id}/test — sandbox test\n * DELETE /developers/servers/{id} — deactivate\n * POST /developers/workflows — submit a compiled workflow spec\n * GET /developers/workflows — list\n * GET /developers/workflows/{id}/status — status\n * POST /developers/workflows/{id}/test — sandbox test\n * DELETE /developers/workflows/{id} — deactivate\n * POST /developers/runtimes/hosted — deploy to the hosted author runtime\n * POST /developers/runtimes/{id}/rollback — flip to the previous version\n * GET /developers/runtimes/{id}/logs — recent runtime log lines\n *\n * Auth: `Authorization: Bearer <cvl_ developer key>`, read from\n * `CONVILYN_API_KEY` (`config.ts`). This SDK deliberately does NOT call the\n * first-party console surfaces (`/user_workflows/*`, `/mcp/tools/catalog`) — those\n * are JWT/session endpoints owned by the web UI, not an author-publishing API.\n * Response bodies are snake_case, matching the platform's Developer Portal\n * API.\n */\n\nimport { SDKConfig } from './config'\nimport { ConvilynApiError, ConvilynAuthorError } from './errors'\nimport type {\n DeployHostedResponse,\n DeveloperRegisterRequest,\n DeveloperRegisterResponse,\n DeveloperServer,\n RollbackResponse,\n RuntimeLogEntry,\n ServerStatusResponse,\n ServerSubmitRequest,\n ServerSubmitResponse,\n TestRunResponse,\n WorkflowListItem,\n WorkflowStatusResponse,\n WorkflowSubmitRequest,\n WorkflowSubmitResponse,\n WorkflowTestResponse,\n} from './platform-types'\n\n/** The subset of `fetch` the client uses (so a fake can be injected in tests). */\nexport type FetchLike = (\n url: string,\n init?: { method?: string; headers?: Record<string, string>; body?: string }\n) => Promise<{\n ok: boolean\n status: number\n json(): Promise<unknown>\n text(): Promise<string>\n}>\n\n/** Options for {@link ConvilynClient}; unset fields fall back to {@link SDKConfig}. */\nexport interface ConvilynClientOptions {\n /** Full API base incl. `/api/v1`; defaults to `${platformUrl}/api/v1`. */\n baseUrl?: string\n /** `cvl_` developer key; defaults to `CONVILYN_API_KEY`. */\n apiKey?: string\n /** Injected `fetch` (defaults to the global). */\n fetch?: FetchLike\n config?: SDKConfig\n}\n\nfunction withApiV1(platformUrl: string): string {\n const trimmed = platformUrl.replace(/\\/+$/, '')\n return trimmed.endsWith('/api/v1') ? trimmed : `${trimmed}/api/v1`\n}\n\n/** The consumer data-plane key prefix — NOT an author/developer-portal token. */\nconst CONSUMER_KEY_PREFIX = 'ck_' // pragma: allowlist secret\n\n/** True when `key` is a consumer data-plane key pasted in by mistake. */\nfunction isConsumerKey(key: string): boolean {\n return key.startsWith(CONSUMER_KEY_PREFIX)\n}\n\n/** Mask a secret for safe display: `ck_a…9f` (or `***` when too short). */\nfunction maskKey(key: string): string {\n return key.length <= 8 ? '***' : `${key.slice(0, 4)}…${key.slice(-2)}`\n}\n\n/** Fetch-based client for the Developer Portal author/publish endpoints. */\nexport class ConvilynClient {\n readonly baseUrl: string\n #apiKey: string\n readonly #fetch: FetchLike\n\n constructor(options: ConvilynClientOptions = {}) {\n const config = options.config ?? SDKConfig.fromEnv()\n this.baseUrl = options.baseUrl ?? withApiV1(config.platformUrl)\n this.#apiKey = options.apiKey ?? config.apiKey\n // Reject a consumer ck_ key pasted into the Author SDK up front with a\n // precise error, instead of the developer portal answering with an opaque\n // 401 later. An empty key is fine — register() mints a cvl_ one. Any other\n // prefix is accepted (forward-compat). Mirror of the consumer SDKs' inverse\n // guard (see consumer-ts auth.ts).\n if (this.#apiKey && isConsumerKey(this.#apiKey)) {\n throw new ConvilynAuthorError(\n `${maskKey(this.#apiKey)} looks like a Convilyn consumer API key (\"${CONSUMER_KEY_PREFIX}\"), ` +\n `not an Author SDK / developer-portal token. The Author SDK authenticates with a ` +\n `cvl_ developer key — call register() to mint one, or set CONVILYN_API_KEY to your ` +\n `cvl_ key. (Consumer keys call the data-plane API; they do not publish workflows / tools.)`\n )\n }\n this.#fetch = options.fetch ?? (globalThis.fetch as unknown as FetchLike)\n }\n\n /** The `cvl_` developer key currently in use (empty until set or registered). */\n get apiKey(): string {\n return this.#apiKey\n }\n\n #headers(auth: boolean): Record<string, string> {\n const headers: Record<string, string> = { 'content-type': 'application/json' }\n if (auth) {\n if (!this.#apiKey) {\n throw new ConvilynAuthorError(\n 'No developer API key set. Provide `apiKey`, set CONVILYN_API_KEY to a ' +\n 'cvl_ developer key, or call register() first.'\n )\n }\n headers.authorization = `Bearer ${this.#apiKey}`\n }\n return headers\n }\n\n async #request<T>(method: string, path: string, body?: unknown, auth = true): Promise<T> {\n const res = await this.#fetch(`${this.baseUrl}${path}`, {\n method,\n headers: this.#headers(auth),\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n if (!res.ok) {\n let parsed: unknown\n try {\n parsed = await res.json()\n } catch {\n parsed = undefined\n }\n throw new ConvilynApiError(\n res.status,\n `${method} ${path} failed (HTTP ${res.status})`,\n parsed\n )\n }\n if (res.status === 204) {\n return undefined as T\n }\n return (await res.json()) as T\n }\n\n // ── Developer registration ──────────────────────────────────────\n\n /**\n * `POST /developers/register` — create a developer account and mint a `cvl_`\n * key. No auth required. The returned key is captured on this client for\n * subsequent calls (and returned so the caller can persist it — it is shown\n * only once).\n */\n async register(request: DeveloperRegisterRequest): Promise<DeveloperRegisterResponse> {\n const result = await this.#request<DeveloperRegisterResponse>(\n 'POST',\n '/developers/register',\n request,\n false\n )\n if (result.api_key && !this.#apiKey) {\n this.#apiKey = result.api_key\n }\n return result\n }\n\n // ── Server operations ───────────────────────────────────────────\n\n /** `POST /developers/servers` — submit a tool-server manifest for verification. */\n async submitServer(request: ServerSubmitRequest): Promise<ServerSubmitResponse> {\n return this.#request<ServerSubmitResponse>('POST', '/developers/servers', request)\n }\n\n /** `GET /developers/servers` — list this developer's servers. */\n async listServers(): Promise<DeveloperServer[]> {\n return this.#request<DeveloperServer[]>('GET', '/developers/servers')\n }\n\n /** `GET /developers/servers/{id}/status` — verification status of a server. */\n async serverStatus(serverId: string): Promise<ServerStatusResponse> {\n return this.#request<ServerStatusResponse>(\n 'GET',\n `/developers/servers/${encodeURIComponent(serverId)}/status`\n )\n }\n\n /** `POST /developers/servers/{id}/test` — trigger a sandbox test run. */\n async testServer(\n serverId: string,\n slots: Record<string, unknown> = {}\n ): Promise<TestRunResponse> {\n return this.#request<TestRunResponse>(\n 'POST',\n `/developers/servers/${encodeURIComponent(serverId)}/test`,\n { slots }\n )\n }\n\n /** `DELETE /developers/servers/{id}` — deactivate a server. */\n async deactivateServer(serverId: string): Promise<void> {\n await this.#request<void>('DELETE', `/developers/servers/${encodeURIComponent(serverId)}`)\n }\n\n // ── Workflow operations ─────────────────────────────────────────\n\n /** `POST /developers/workflows` — submit a compiled workflow spec + its server ids. */\n async submitWorkflow(request: WorkflowSubmitRequest): Promise<WorkflowSubmitResponse> {\n return this.#request<WorkflowSubmitResponse>('POST', '/developers/workflows', request)\n }\n\n /** `GET /developers/workflows` — list this developer's workflows. */\n async listWorkflows(): Promise<WorkflowListItem[]> {\n return this.#request<WorkflowListItem[]>('GET', '/developers/workflows')\n }\n\n /** `GET /developers/workflows/{id}/status` — verification status of a workflow. */\n async workflowStatus(workflowId: string): Promise<WorkflowStatusResponse> {\n return this.#request<WorkflowStatusResponse>(\n 'GET',\n `/developers/workflows/${encodeURIComponent(workflowId)}/status`\n )\n }\n\n /** `POST /developers/workflows/{id}/test` — sandbox-test a submitted workflow. */\n async testWorkflow(\n workflowId: string,\n testInput: Record<string, unknown> = {}\n ): Promise<WorkflowTestResponse> {\n return this.#request<WorkflowTestResponse>(\n 'POST',\n `/developers/workflows/${encodeURIComponent(workflowId)}/test`,\n { test_input: testInput }\n )\n }\n\n /** `DELETE /developers/workflows/{id}` — deactivate a workflow. */\n async deactivateWorkflow(workflowId: string): Promise<void> {\n await this.#request<void>('DELETE', `/developers/workflows/${encodeURIComponent(workflowId)}`)\n }\n\n // ── Convilyn-Hosted Author Runtime (port of the Python client) ─────────────\n\n /**\n * `POST /developers/runtimes/hosted` — deploy a tool server into the\n * Convilyn-Hosted Author Runtime. Counterpart to {@link submitServer}:\n * instead of registering a caller-deployed endpoint, the platform\n * provisions a sandboxed Lambda and returns its public endpoint URL.\n *\n * Backends without the hosted stack answer 503 `HOSTED_NOT_AVAILABLE`\n * (older builds: 501); environments with the router unmounted answer 404.\n * All surface as {@link ConvilynApiError} — catch and fall back to\n * `push --endpoint-url` (BYO) when a hard guarantee is needed.\n */\n async deployHostedRuntime(\n manifest: Record<string, unknown>,\n options: { region: string; workflowSpec?: Record<string, unknown> }\n ): Promise<DeployHostedResponse> {\n const body: Record<string, unknown> = { manifest, region: options.region }\n if (options.workflowSpec !== undefined) {\n body.workflow_spec = options.workflowSpec\n }\n return this.#request<DeployHostedResponse>('POST', '/developers/runtimes/hosted', body)\n }\n\n /**\n * `POST /developers/runtimes/{id}/rollback` — atomically flip the runtime\n * back to its previous active version.\n */\n async rollbackHostedRuntime(runtimeId: string): Promise<RollbackResponse> {\n return this.#request<RollbackResponse>(\n 'POST',\n `/developers/runtimes/${encodeURIComponent(runtimeId)}/rollback`\n )\n }\n\n /**\n * `GET /developers/runtimes/{id}/logs` — recent runtime log lines.\n * `since` is an ISO-8601 timestamp or relative shorthand (`\"5m\"`, `\"1h\"`)\n * interpreted server-side; `limit` defaults to 100 (server caps ~1000).\n * Accepts either a bare list or an `{entries: [...]}` envelope (mirror of\n * the Python client) so the SDK survives the wire shape stabilising.\n */\n async getHostedRuntimeLogs(\n runtimeId: string,\n options: { since?: string; limit?: number } = {}\n ): Promise<RuntimeLogEntry[]> {\n const limit = Math.trunc(options.limit ?? 100)\n let path = `/developers/runtimes/${encodeURIComponent(runtimeId)}/logs?limit=${limit}`\n if (options.since) {\n path = `${path}&since=${encodeURIComponent(options.since)}`\n }\n const result = await this.#request<unknown>('GET', path)\n if (Array.isArray(result)) {\n return result as RuntimeLogEntry[]\n }\n if (\n typeof result === 'object' &&\n result !== null &&\n Array.isArray((result as Record<string, unknown>).entries)\n ) {\n return (result as { entries: RuntimeLogEntry[] }).entries\n }\n return []\n }\n}\n"]}
|