@h-ai/runner 0.0.0-stage → 1.0.0-beta.24
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/LICENSE +202 -0
- package/README.en.md +79 -0
- package/README.ja.md +79 -0
- package/README.md +78 -2
- package/dist/index.d.ts +409 -0
- package/dist/index.js +1727 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runner-config.ts","../messages/en-US.json","../messages/ja-JP.json","../messages/zh-CN.json","../src/runner-i18n.ts","../src/runner-types.ts","../src/runner-container.ts","../src/runner-store.ts","../src/runner-main.ts"],"names":["core","z","id","resources","environment","key","process","launch","parsed","createHash","unavailable","err","ok","invalid","Buffer","uncertain","execute","randomUUID"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod'\n\nconst id = z.string().min(1).max(100).regex(/^[\\w.-]+$/u)\nconst timeout = z.number().int().min(1).max(86_400_000)\nconst resources = z.strictObject({\n cpu: z.number().finite().positive().max(1024),\n memoryMiB: z.number().int().min(16).max(2_097_152),\n pids: z.number().int().min(1).max(1_048_576),\n scratchMiB: z.number().int().min(3).max(2_097_152),\n})\n\n/**\n * 容器资源限制;CPU 为核心数,内存和临时盘使用 MiB。\n * @example\n * ```ts\n * import type { RunnerResources } from '@h-ai/runner'\n * const resources: RunnerResources = { cpu: 1, memoryMiB: 256, pids: 32, scratchMiB: 64 }\n * ```\n */\nexport type RunnerResources = z.infer<typeof resources>\n\n/**\n * 已登记且固定镜像的执行环境。\n * @example\n * ```ts\n * import type { RunnerEnvironment } from '@h-ai/runner'\n * function resolveImage(environment: RunnerEnvironment) { return environment.image }\n * ```\n */\nexport type RunnerEnvironment = z.infer<typeof environment>\n\nconst environment = z.strictObject({\n id,\n image: z.string().max(255).regex(/^(?:[\\w.:/-]+@)?sha256:[a-f\\d]{64}$/u),\n backend: z.literal('container').default('container'),\n architecture: z.enum(['x64', 'arm64']).optional(),\n capabilities: z.array(id).max(64).default([]),\n resources,\n networkPolicy: z.enum(['offline', 'internal']).default('offline'),\n network: id.optional(),\n}).refine(value => value.networkPolicy === 'offline'\n ? !value.network\n : !!value.network && ![\n 'host',\n 'bridge',\n 'none',\n 'default',\n 'podman',\n ].includes(value.network))\n\n/**\n * Runner 启动配置 Schema。执行节点 ID 在部署中保持唯一。\n * @example\n * ```ts\n * import { RunnerConfigSchema } from '@h-ai/runner'\n * const result = RunnerConfigSchema.safeParse({ nodeId: 'api', executor: false })\n * ```\n */\nexport const RunnerConfigSchema = z.strictObject({\n nodeId: id,\n executor: z.boolean().default(true),\n engine: z.enum(['podman', 'docker']).default('podman'),\n capacity: resources.default({\n cpu: 4,\n memoryMiB: 4096,\n pids: 512,\n scratchMiB: 2048,\n }),\n /** 每个执行节点独立预留给工具作业的资源;宿主总预算须同时覆盖 capacity 和本项。 */\n toolCapacity: resources.default({\n cpu: 1,\n memoryMiB: 1024,\n pids: 128,\n scratchMiB: 512,\n }),\n /** 每个执行节点的工具作业总并发,包括等待清理及未核验的作业,默认 4。 */\n toolMaxRunning: z.number().int().min(1).max(1000).default(4),\n leaseMs: z.number().int().min(1000).max(120_000).default(10_000),\n pollMs: z.number().int().min(10).max(1000).default(50),\n maxRunning: z.number().int().min(1).max(1000).default(8),\n maxRunningPerScope: z.number().int().min(1).max(1000).default(4),\n maxControlRunning: z.number().int().min(1).max(1000).default(8),\n maxQueued: z.number().int().min(1).max(100_000).default(5000),\n maxEvents: z.number().int().min(1).max(100_000).default(10_000),\n closeTimeoutMs: z.number().int().min(100).max(120_000).default(20_000),\n environments: z.array(environment).max(1000).default([]),\n}).refine(value => value.pollMs * 3 < value.leaseMs\n && new Set(value.environments.map(entry => entry.id)).size === value.environments.length)\n\n/**\n * 启动参数;默认执行角色,API 节点可单独关闭执行。\n * @example\n * ```ts\n * import type { RunnerConfigInput } from '@h-ai/runner'\n * const config: RunnerConfigInput = { nodeId: 'api-east', executor: false }\n * ```\n */\nexport type RunnerConfigInput = z.input<typeof RunnerConfigSchema>\n\n/**\n * 配置解析后的默认值。\n * @example 模块内部上下文\n * ```ts\n * function interval(config: RunnerConfig) { return config.pollMs }\n * ```\n */\nexport type RunnerConfig = z.infer<typeof RunnerConfigSchema>\n\n/**\n * 持久 JSON 字段的校验,包括有限数值。\n * @example 模块内部上下文\n * ```ts\n * const value = json.safeParse({ message: 'ready' })\n * ```\n */\nexport const json = z.json()\n\n/**\n * 持久提交及主体校验。\n * @example 模块内部上下文\n * ```ts\n * const value = submitSchema.safeParse({ scope: { tenantId: 'work', userId: 'alice' }, kind: 'report', input: null })\n * ```\n */\nexport const submitSchema = z.strictObject({\n scope: z.strictObject({\n tenantId: z.string().min(1).max(200),\n userId: z.string().min(1).max(200),\n }),\n kind: id,\n input: json,\n idempotencyKey: z.string().min(1).max(200).optional(),\n environmentId: id.optional(),\n resources: resources.partial().optional(),\n nodeId: id.optional(),\n parentId: z.string().regex(/^[\\da-f]{64}$/u).optional(),\n /** 仅可信服务提交工具类别;其节点资源与普通 Worker 分开核算。 */\n capacityClass: z.enum(['default', 'tool']).default('default'),\n /** 使用已登记服务的单次预热池。 */\n warmPool: z.literal(true).optional(),\n /** 同一 kind + key 的跨节点上限,部署变更期间采用最小活动值。 */\n concurrency: z.strictObject({\n key: id,\n limit: z.number().int().min(1).max(1000),\n }).optional(),\n reuseKey: z.string().min(1).max(200).optional(),\n queueTimeoutMs: timeout.default(300_000),\n runTimeoutMs: timeout.default(300_000),\n}).refine(value => !value.parentId || (!value.nodeId && !value.environmentId && !value.resources && !value.reuseKey && value.capacityClass === 'default' && !value.concurrency)).refine(value => !value.warmPool || (value.capacityClass === 'tool' && value.environmentId && value.concurrency && !value.resources))\n\n/**\n * 验证仅由部署方登记的预热池。\n * @example 模块内部上下文\n * ```ts\n * const pool = warmPoolSchema.parse({ key: 'docs', kind: 'docs.v1', environmentId: 'docs', minReady: 1, maxRunning: 2, maxTotal: 3 })\n * ```\n */\nexport const warmPoolSchema = z.strictObject({\n key: id,\n kind: id,\n environmentId: id,\n minReady: z.number().int().min(0).max(1000),\n maxRunning: z.number().int().min(1).max(1000),\n maxTotal: z.number().int().min(1).max(1000),\n}).refine(value => value.minReady <= value.maxTotal && value.maxRunning <= value.maxTotal)\n\n/**\n * 可信执行器注册名称校验。\n * @example 模块内部上下文\n * ```ts\n * const valid = runnerKind.safeParse('reports.v1').success\n * ```\n */\nexport const runnerKind = id\n","{\n \"runner_notInitialized\": \"Runner is not initialized\",\n \"runner_alreadyInitialized\": \"Runner is already initialized or starting\",\n \"runner_invalid\": \"Invalid execution options\",\n \"runner_notFound\": \"Execution or environment not found\",\n \"runner_conflict\": \"The execution key has different options or execution state changed\",\n \"runner_unavailable\": \"Managed execution is unavailable\",\n \"runner_capacity\": \"Execution queue or resource limit reached\",\n \"runner_leaseLost\": \"The execution lease expired\",\n \"runner_cleanupUnconfirmed\": \"Unable to verify release of all execution resources\"\n}\n","{\n \"runner_notInitialized\": \"Runner は初期化されていません\",\n \"runner_alreadyInitialized\": \"Runner は起動中または初期化済みです\",\n \"runner_invalid\": \"実行オプションが無効です\",\n \"runner_notFound\": \"実行タスクまたは実行環境が見つかりません\",\n \"runner_conflict\": \"実行キーのオプションが異なるか、実行状態が変更されました\",\n \"runner_unavailable\": \"実行サービスを利用できません\",\n \"runner_capacity\": \"実行キューまたはリソースの上限に達しました\",\n \"runner_leaseLost\": \"実行のリースが期限切れです\",\n \"runner_cleanupUnconfirmed\": \"実行リソースの解放を確認できません\"\n}\n","{\n \"runner_notInitialized\": \"Runner 尚未初始化\",\n \"runner_alreadyInitialized\": \"Runner 正在初始化或已经启动\",\n \"runner_invalid\": \"运行参数无效\",\n \"runner_notFound\": \"未找到执行任务或运行环境\",\n \"runner_conflict\": \"相同执行标识已绑定不同请求,或运行状态发生变化\",\n \"runner_unavailable\": \"执行服务暂时不可用\",\n \"runner_capacity\": \"运行队列或资源上限已达到\",\n \"runner_leaseLost\": \"当前执行租约已失效\",\n \"runner_cleanupUnconfirmed\": \"无法确认所有运行资源均已释放\"\n}\n","import { core } from '@h-ai/core'\nimport en from '../messages/en-US.json'\nimport ja from '../messages/ja-JP.json'\nimport zh from '../messages/zh-CN.json'\n\n/**\n * 模块文案。\n * @example 模块内部上下文\n * ```ts\n * const text = runnerM('runner_invalid')\n * ```\n */\nexport const runnerM = core.i18n.createMessageGetter<keyof typeof zh>({ 'zh-CN': zh, 'en-US': en, 'ja-JP': ja })\n","import type { HaiResult } from '@h-ai/core'\nimport type { Readable, Writable } from 'node:stream'\nimport type { z } from 'zod'\nimport type { json, RunnerConfigInput, RunnerEnvironment, submitSchema } from './runner-config.js'\nimport { core } from '@h-ai/core'\n\n/**\n * 持久执行错误定义。业务处理失败另记录为执行终态。\n * @example\n * ```ts\n * import { HaiRunnerError } from '@h-ai/runner'\n * const key = HaiRunnerError.CONFLICT\n * ```\n */\nexport const HaiRunnerError = core.error.buildHaiErrorsDef('runner', {\n NOT_INITIALIZED: '010:503',\n ALREADY_INITIALIZED: '011:409',\n INVALID: '020:400',\n NOT_FOUND: '021:404',\n CONFLICT: '022:409',\n UNAVAILABLE: '023:503',\n CAPACITY: '024:429',\n LEASE_LOST: '025:409',\n CLEANUP_UNCONFIRMED: '026:503',\n})\n\n/**\n * 可持久化的输入、事件和输出。\n * @example\n * ```ts\n * import type { RunnerJson } from '@h-ai/runner'\n * const event: RunnerJson = { step: 'ready', parts: [1, 2] }\n * ```\n */\nexport type RunnerJson = z.infer<typeof json>\n\n/**\n * 由可信应用确定的任务主体。\n * @example\n * ```ts\n * import type { RunnerScope } from '@h-ai/runner'\n * const scope: RunnerScope = { tenantId: 'engineering', userId: 'alice' }\n * ```\n */\nexport type RunnerScope = RunnerSubmit['scope']\n\n/**\n * 不含密钥或本机文件路径的持久提交参数。\n * @example\n * ```ts\n * import type { RunnerSubmit } from '@h-ai/runner'\n * const task: RunnerSubmit = { scope: { tenantId: 'team', userId: 'alice' }, kind: 'reports.v1', input: { page: 1 } }\n * ```\n */\nexport type RunnerSubmit = z.input<typeof submitSchema>\n\n/**\n * 当前执行者的启动代次;节点重启后代次会变化。\n * @example\n * ```ts\n * import type { RunnerOwner } from '@h-ai/runner'\n * function node(owner: RunnerOwner) { return owner.nodeId }\n * ```\n */\nexport interface RunnerOwner {\n nodeId: string\n generation: string\n}\n\n/**\n * 跨实例可读取的执行状态和结果。\n * @example\n * ```ts\n * import type { RunnerExecution } from '@h-ai/runner'\n * function isDone(execution: RunnerExecution) { return execution.status === 'succeeded' }\n * ```\n */\nexport interface RunnerExecution {\n id: string\n status: 'queued' | 'running' | 'cancelling' | 'cancelled' | 'succeeded' | 'failed' | 'unknown'\n owner?: RunnerOwner\n environmentId?: string\n output?: RunnerJson\n failure?: 'queue-timeout' | 'run-timeout' | 'handler-failed' | 'owner-lost' | 'parent-ended' | 'cleanup-unconfirmed'\n createdAt: number\n updatedAt: number\n /** 运维核验容器和本地暂存已清理的时间;未知业务副作用仍保留。 */\n reconciledAt?: number\n}\n\n/**\n * 由可信管理入口取得的核验责任人及工单原因。\n * @example\n * ```ts\n * import type { RunnerReconciliation } from '@h-ai/runner'\n * const review: RunnerReconciliation = { operatorId: 'ops-1', reason: 'INC-47: verified engine cleanup' }\n * ```\n */\nexport interface RunnerReconciliation {\n operatorId: string\n reason: string\n}\n\n/**\n * 已登记离线固定工具的集群预热目标及容量边界。\n * @example\n * ```ts\n * import type { RunnerWarmPool } from '@h-ai/runner'\n * const pool: RunnerWarmPool = { key: 'docs', kind: 'docs.v1', environmentId: 'docs', minReady: 1, maxRunning: 2, maxTotal: 3 }\n * ```\n */\nexport interface RunnerWarmPool {\n key: string\n kind: string\n environmentId: string\n minReady: number\n maxRunning: number\n maxTotal: number\n}\n\n/**\n * 持久事件游标从 1 开始,按执行内递增。\n * @example\n * ```ts\n * import type { RunnerEvent } from '@h-ai/runner'\n * function nextCursor(event: RunnerEvent) { return event.sequence }\n * ```\n */\nexport interface RunnerEvent {\n sequence: number\n data: RunnerJson\n createdAt: number\n}\n\n/**\n * 仅限可信已注册处理器调用。工作目录默认 /workspace,配置文件置于 /state。\n * @example\n * ```ts\n * import type { RunnerLaunch } from '@h-ai/runner'\n * const launch: RunnerLaunch = { command: 'cat', args: ['/state/manifest.json'], files: { 'manifest.json': '{}' } }\n * ```\n */\nexport interface RunnerLaunch {\n command: string\n args?: string[]\n env?: Record<string, string>\n files?: Record<string, string>\n /** 规范 Base64 输入文件;提供空对象时也会分配 /input 与 /output。 */\n inputs?: Record<string, string>\n cwd?: string\n}\n\n/**\n * 容器标准流与经过核验的停止操作。\n * @example\n * ```ts\n * import type { RunnerProcess } from '@h-ai/runner'\n * async function stop(process: RunnerProcess) { return process.close() }\n * ```\n */\nexport interface RunnerProcess {\n stdin: Writable\n stdout: Readable\n stderr: Readable\n wait: () => Promise<{ code: number | null, signal: NodeJS.Signals | null }>\n /** 从仍运行的工具容器读取一个受限普通文件,返回规范 Base64。 */\n artifact: (name: string, maxBytes: number) => Promise<HaiResult<string>>\n close: () => Promise<HaiResult<void>>\n}\n\n/**\n * 处理器只在当前租约拥有者内执行,启动和事件都经过持久代次检查。\n * @example\n * ```ts\n * import type { RunnerContext } from '@h-ai/runner'\n * async function accepted(context: RunnerContext) { return context.emit({ id: context.id }) }\n * ```\n */\nexport interface RunnerContext {\n id: string\n scope: RunnerScope\n owner: RunnerOwner\n parentId?: string\n signal: AbortSignal\n emit: (data: RunnerJson) => Promise<HaiResult<void>>\n start: (launch: RunnerLaunch) => Promise<HaiResult<RunnerProcess>>\n}\n\n/**\n * 可信服务器代码注册的处理器;输入需要由业务再次校验。\n * @example\n * ```ts\n * import type { RunnerHandler } from '@h-ai/runner'\n * const handler: RunnerHandler = async (input) => ({ echoed: input })\n * ```\n */\nexport type RunnerHandler = (input: RunnerJson, context: RunnerContext) => Promise<RunnerJson>\n\n/**\n * 注入 ACP 或工具服务的受管执行对象。\n * @example\n * ```ts\n * import type { RunnerFunctions } from '@h-ai/runner'\n * async function ready(instance: RunnerFunctions) { return instance.init({ nodeId: 'east' }) }\n * ```\n */\nexport interface RunnerFunctions {\n /** 当前实例已启动并承担执行角色。 */\n readonly isExecutor: boolean\n /** 启动前应先初始化 reldb。 */\n init: (config: RunnerConfigInput) => Promise<HaiResult<void>>\n /** 停止领取,取消本节点执行并核验清理。 */\n close: () => Promise<HaiResult<void>>\n /** 当前环境快照。 */\n environment: (id: string) => HaiResult<RunnerEnvironment>\n /** 注册处理器并返回仅移除该处理器的回调。 */\n register: (kind: string, handler: RunnerHandler) => HaiResult<() => void>\n /** 在 API 和执行节点登记同一部署快照。只在执行节点创建实例。 */\n registerWarmPool: (pool: RunnerWarmPool) => HaiResult<() => void>\n /** 持久化接收,在可用节点领取。 */\n submit: (request: RunnerSubmit) => Promise<HaiResult<RunnerExecution>>\n /** 按业务幂等键定位既有执行。 */\n find: (scope: RunnerScope, kind: string, key: string) => Promise<HaiResult<RunnerExecution | undefined>>\n /** 根据可信主体读取任务。 */\n get: (scope: RunnerScope, id: string) => Promise<HaiResult<RunnerExecution>>\n /** 持久记录取消请求。 */\n cancel: (scope: RunnerScope, id: string) => Promise<HaiResult<RunnerExecution>>\n /** 原执行节点管理入口;核验环境已释放并审计,仍保留未知业务结果。 */\n reconcileUnknown: (scope: RunnerScope, id: string, review: RunnerReconciliation) => Promise<HaiResult<RunnerExecution>>\n /** 分页读取保序事件。 */\n events: (scope: RunnerScope, id: string, after?: number, limit?: number) => Promise<HaiResult<RunnerEvent[]>>\n}\n","import type { HaiResult } from '@h-ai/core'\nimport type { RunnerConfig, RunnerEnvironment, RunnerResources } from './runner-config.js'\nimport type { RunnerLaunch, RunnerProcess } from './runner-types.js'\nimport { Buffer } from 'node:buffer'\nimport { execFile, spawn } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { once } from 'node:events'\nimport { chmod, lstat, mkdir, mkdtemp, readFile, realpath, rm, stat, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { basename, join, posix } from 'node:path'\nimport { promisify } from 'node:util'\nimport { err, ok } from '@h-ai/core'\nimport { z } from 'zod'\nimport { runnerM } from './runner-i18n.js'\nimport { HaiRunnerError } from './runner-types.js'\n\nconst execute = promisify(execFile)\nconst containerId = /^[\\da-f]{64}$/u\nconst envKey = /^[A-Z_]\\w*$/iu\nconst MAX_FILE_BYTES = 50 * 1024 * 1024\nconst artifactName = /^[\\da-z][\\w.-]{0,127}$/iu\nconst fileName = /^[\\w.][\\w.-]{0,95}$/u\nconst argument = z.string().max(8192).refine(value => !value.includes('\\0'))\nconst launchSchema = z.strictObject({\n command: argument.refine(value => value.length > 0 && !value.startsWith('-')),\n args: z.array(argument).max(128).default([]),\n env: z.record(z.string().regex(envKey), z.string().max(64_000).refine(value => !/[\\r\\n\\0]/u.test(value))).default({}),\n files: z.record(z.string().regex(fileName).refine(value => value !== '.' && value !== '..'), z.string().max(128_000)).default({}),\n inputs: z.record(z.string().regex(artifactName), z.string().max(4 * Math.ceil(MAX_FILE_BYTES / 3))).optional(),\n cwd: z.string().max(1024).default('/workspace'),\n})\n\n// 使用打开的文件描述符核对类型与大小,读取在容器内完成;不会解包归档或读取宿主路径。\nconst READ_ARTIFACT = `\nimport os, stat, sys\nroot = os.open('/output', os.O_DIRECTORY | os.O_NOFOLLOW)\nfd = os.open(sys.argv[1], os.O_RDONLY | os.O_NOFOLLOW | os.O_NONBLOCK, dir_fd=root)\nlimit = int(sys.argv[2])\nmeta = os.fstat(fd)\nif not stat.S_ISREG(meta.st_mode) or meta.st_size > limit:\n raise SystemExit(2)\nwith os.fdopen(fd, 'rb') as item:\n remaining = limit + 1\n while remaining > 0:\n data = item.read(min(65536, remaining))\n if not data:\n break\n remaining -= len(data)\n if remaining == 0:\n raise SystemExit(2)\n sys.stdout.buffer.write(data)\n`\n\nasync function cli(engine: RunnerConfig['engine'], args: string[]) {\n const result = await execute(engine, args, { timeout: 15_000, maxBuffer: 65_536, windowsHide: true })\n return result.stdout.trim()\n}\n\nfunction invalid() {\n return err(HaiRunnerError.INVALID, runnerM('runner_invalid'))\n}\n\nfunction unavailable() {\n return err(HaiRunnerError.UNAVAILABLE, runnerM('runner_unavailable'))\n}\n\nfunction uncertain() {\n return err(HaiRunnerError.CLEANUP_UNCONFIRMED, runnerM('runner_cleanupUnconfirmed'))\n}\n\n/**\n * 持久化的实际容器及暂存身份,用于原节点核验资源。\n * @example 模块内部上下文\n * ```ts\n * function engineName(record: RunnerContainerIdentity) { return record.engine }\n * ```\n */\nexport interface RunnerContainerIdentity {\n id: string\n engine: RunnerConfig['engine']\n engineKey: string\n stageName: string\n stageKey: string\n}\n\nconst stageName = /^hai-runner-[a-z\\d]{6}$/iu\n\nasync function stagingRoot() {\n const path = await realpath(tmpdir())\n const info = await stat(path, { bigint: true })\n return { path, key: `${path}:${info.dev}:${info.ino}` }\n}\n\nasync function engineKey(engine: RunnerConfig['engine']) {\n const root = await stagingRoot()\n const host = (await readFile('/etc/machine-id', 'utf8')).trim()\n if (!/^[\\da-f]{32}$/u.test(host))\n throw new Error('Host identity unavailable')\n const value = engine === 'podman'\n ? await cli(engine, ['info', '--format', '{{.Host.ServiceIsRemote}} {{.Store.GraphRoot}}'])\n : await cli(engine, ['info', '--format', '{{.ID}}'])\n if (engine === 'podman') {\n if (!value.startsWith('false '))\n throw new Error('Podman identity unavailable')\n const storage = await stat(value.slice(6), { bigint: true })\n return createHash('sha256').update(JSON.stringify([\n host,\n engine,\n root.key,\n value,\n String(storage.dev),\n String(storage.ino),\n ])).digest('hex')\n }\n if (!value || value === '<no value>')\n throw new Error('Docker identity unavailable')\n return createHash('sha256').update(JSON.stringify([host, engine, root.key, value])).digest('hex')\n}\n\nasync function containerAbsent(engine: RunnerConfig['engine'], id: string) {\n return !(await cli(engine, [\n 'container',\n 'ls',\n '--all',\n '--no-trunc',\n '--filter',\n `id=${id}`,\n '--format',\n '{{.ID}}',\n ]))\n}\n\nasync function identityOf(path: string) {\n const info = await lstat(path, { bigint: true })\n if (!info.isDirectory())\n throw new Error('Runner staging path is invalid')\n return `${info.dev}:${info.ino}`\n}\n\n/**\n * 仅在相同的真实引擎与暂存根上确认已停止,并清理已登记的专属暂存目录。\n * @example 模块内部上下文\n * ```ts\n * async function verify(record: RunnerContainerIdentity) { return confirmContainerReleased(record) }\n * ```\n */\nexport async function confirmContainerReleased(record: RunnerContainerIdentity): Promise<HaiResult<void>> {\n if (!containerId.test(record.id) || !stageName.test(record.stageName))\n return uncertain()\n try {\n if (record.engineKey !== await engineKey(record.engine) || !await containerAbsent(record.engine, record.id))\n return uncertain()\n const path = join((await stagingRoot()).path, record.stageName)\n let actual: string | undefined\n try {\n actual = await identityOf(path)\n }\n catch (error) {\n if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT'))\n return uncertain()\n }\n if (actual) {\n if (actual !== record.stageKey)\n return uncertain()\n for (const name of ['input', 'configuration']) {\n const directory = join(path, name)\n try {\n if (!(await lstat(directory)).isDirectory())\n return uncertain()\n await chmod(directory, 0o700)\n }\n catch (error) {\n if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT'))\n return uncertain()\n }\n }\n await rm(path, { recursive: true, force: true })\n }\n return record.engineKey === await engineKey(record.engine) && await containerAbsent(record.engine, record.id)\n ? ok(undefined)\n : uncertain()\n }\n catch {\n return uncertain()\n }\n}\n\n/**\n * 单次预热的容器句柄只留在原执行节点。\n * @example 模块内部上下文\n * ```ts\n * function staged(handle: WarmContainer) { return handle.activate({ command: 'true', inputs: {} }, new AbortController().signal, async () => true) }\n * ```\n */\nexport interface WarmContainer extends RunnerProcess {\n activate: (launch: RunnerLaunch, signal: AbortSignal, authorize: () => Promise<boolean>) => Promise<HaiResult<RunnerProcess>>\n}\n\nconst STANDBY = `\nimport json, os, sys\nif os.listdir('/input') or os.listdir('/output'):\n raise SystemExit(2)\nos.write(1, b'+')\nif os.read(0, 1) != b'+':\n raise SystemExit(2)\nwith open('/run/hai-config/warm-launch.json', 'rb') as configuration:\n data = configuration.read(524289)\nif len(data) > 524288:\n raise SystemExit(2)\ncommand, *args = json.loads(data)\nos.execvp(command, [command, *args])\n`\n\nfunction decodeInputs(inputs: Record<string, string>, resources: RunnerResources) {\n const budget = Math.min(MAX_FILE_BYTES, resources.scratchMiB * 1024 * 1024)\n const entries = Object.entries(inputs)\n if (entries.length > 8 || entries.reduce((total, [, value]) => total + value.length, 0) > 4 * Math.ceil(budget / 3) + 24)\n return undefined\n const decoded = entries.map(([name, value]) => ({\n name,\n value,\n bytes: Buffer.from(value, 'base64'),\n }))\n return decoded.some(item => item.bytes.toString('base64') !== item.value)\n || decoded.reduce((total, item) => total + item.bytes.length, 0) > budget\n ? undefined\n : decoded\n}\n\n/**\n * 运行已登记镜像中的单一进程,私有挂载和标准流由执行节点持有。\n * @example 模块内部上下文\n * ```ts\n * async function shell(config: RunnerConfig, environment: RunnerEnvironment) {\n * return startContainer(config.engine, environment, environment.resources, { command: 'true' }, new AbortController().signal, async () => ok(undefined))\n * }\n * ```\n */\nexport async function startContainer(\n engine: RunnerConfig['engine'],\n environment: RunnerEnvironment,\n resources: RunnerResources,\n launch: RunnerLaunch,\n signal: AbortSignal,\n record: (identity: RunnerContainerIdentity) => Promise<HaiResult<void>>,\n warm = false,\n): Promise<HaiResult<WarmContainer>> {\n const parsed = launchSchema.safeParse(launch)\n if (!parsed.success || signal.aborted)\n return invalid()\n const options = parsed.data\n const cwd = posix.normalize(options.cwd)\n if (cwd !== options.cwd || (cwd !== '/workspace' && !cwd.startsWith('/workspace/')) || cwd.includes('\\0')\n || Object.keys(options.env).length > 128 || Object.keys(options.files).length > 32) {\n return invalid()\n }\n\n const decoded = options.inputs === undefined\n ? undefined\n : decodeInputs(options.inputs, resources)\n if (options.inputs && !decoded)\n return invalid()\n\n let temporary: string | undefined\n let id: string | undefined\n let envFile: string | undefined\n const readOnlyDirs: string[] = []\n let creationStarted = false\n\n async function removeContainer(container: string) {\n try {\n await cli(engine, [\n 'container',\n 'rm',\n '--force',\n '--volumes',\n ...(engine === 'podman'\n ? ['--time', '1']\n : []),\n container,\n ])\n }\n catch {\n // 查询引擎确认容器确实不在;单独收到 rm 失败不能推断已经停止。\n }\n try {\n return await containerAbsent(engine, container)\n }\n catch {\n return false\n }\n }\n\n async function removeFiles() {\n await Promise.all(readOnlyDirs.map(dir => chmod(dir, 0o700)))\n if (temporary)\n await rm(temporary, { recursive: true, force: true })\n }\n\n try {\n // 仅 Linux cgroup v2 上启用资源受管容器。\n const mode = engine === 'podman'\n ? await cli(engine, ['info', '--format', '{{.Host.CgroupsVersion}} {{join .Host.CgroupControllers \",\"}}'])\n : await cli(engine, ['info', '--format', '{{.OSType}} {{.CgroupVersion}} {{.CPUCfsQuota}} {{.MemoryLimit}} {{.PidsLimit}}'])\n if (engine === 'podman'\n ? !mode.startsWith('v2 ') || !['cpu', 'memory', 'pids'].every(name => mode.slice(3).split(',').includes(name))\n : mode !== 'linux 2 true true true') {\n return unavailable()\n }\n const imageVolumes = await cli(engine, [\n 'image',\n 'inspect',\n '--format',\n '{{json .Config.Volumes}}',\n environment.image,\n ])\n if (imageVolumes !== 'null' && imageVolumes !== '{}')\n return unavailable()\n\n if (environment.networkPolicy === 'internal') {\n const isolated = await cli(engine, [\n 'network',\n 'inspect',\n '--format',\n '{{.Internal}}',\n environment.network!,\n ])\n if (isolated !== 'true')\n return unavailable()\n }\n\n const key = await engineKey(engine)\n temporary = await mkdtemp(join((await stagingRoot()).path, 'hai-runner-'))\n envFile = join(temporary, 'environment')\n const files = join(temporary, 'configuration')\n await writeFile(envFile, Object.entries({\n HOME: '/state',\n XDG_CACHE_HOME: '/state/cache',\n XDG_CONFIG_HOME: '/state/config',\n TMPDIR: '/tmp',\n ...options.env,\n }).map(([key, value]) => `${key}=${value}`).join('\\n'), { mode: 0o600, flag: 'wx' })\n await mkdir(files)\n readOnlyDirs.push(files)\n await Promise.all(Object.entries(options.files).map(([name, content]) =>\n writeFile(join(files, name), content, { mode: 0o444, flag: 'wx' })))\n // 外层目录由节点账户私有持有;容器内 UID 可读挂入的目录。\n await chmod(files, 0o555)\n const inputDir = join(temporary, 'input')\n if (decoded) {\n await mkdir(inputDir)\n readOnlyDirs.push(inputDir)\n await Promise.all(decoded.map(item => writeFile(join(inputDir, item.name), item.bytes, { mode: 0o444, flag: 'wx' })))\n await chmod(inputDir, 0o555)\n }\n if (signal.aborted) {\n await removeFiles()\n return invalid()\n }\n\n const state = Math.max(1, Math.floor(resources.scratchMiB / 8))\n const workspace = Math.max(1, Math.floor(resources.scratchMiB / (decoded ? 8 : 2)))\n const output = decoded\n ? Math.max(1, Math.floor(resources.scratchMiB / 2))\n : 0\n const scratch = resources.scratchMiB - state - workspace - output\n if (scratch < 1) {\n await removeFiles()\n return invalid()\n }\n const mounts = [\n ['state', state],\n ['workspace', workspace],\n ['tmp', scratch],\n ...(decoded\n ? [\n ['output', output],\n ]\n : []),\n ].flatMap(([name, size]) => ['--tmpfs', `/${name}:rw,nosuid,nodev,mode=1777,size=${size}m`])\n\n creationStarted = true\n const created = await cli(engine, [\n 'container',\n 'create',\n '--pull=never',\n '--interactive',\n '--user=1000:1000',\n '--read-only',\n '--cap-drop=ALL',\n '--security-opt=no-new-privileges',\n '--cgroupns=private',\n '--ipc=private',\n '--shm-size=1m',\n `--cpus=${resources.cpu}`,\n `--memory=${resources.memoryMiB}m`,\n `--memory-swap=${resources.memoryMiB}m`,\n `--pids-limit=${resources.pids}`,\n `--network=${environment.network ?? 'none'}`,\n ...(engine === 'podman'\n ? ['--read-only-tmpfs=false', '--http-proxy=false']\n : []),\n '--env-file',\n envFile,\n '--mount',\n `type=bind,source=${files},target=/run/hai-config,readonly`,\n ...mounts,\n ...(decoded\n ? ['--mount', `type=bind,source=${inputDir},target=/input,readonly`]\n : []),\n '--entrypoint=/bin/sh',\n environment.image,\n '-c',\n 'cp -R /run/hai-config/. /state/ && cd \"$1\" && shift && exec \"$@\"',\n 'hai-runner',\n cwd,\n options.command,\n ...options.args,\n ])\n if (!containerId.test(created))\n return uncertain()\n id = created\n await rm(envFile, { force: true })\n const receipt = await record({\n id,\n engine,\n engineKey: key,\n stageName: basename(temporary),\n stageKey: await identityOf(temporary),\n })\n if (signal.aborted || !receipt.success) {\n const stopped = await removeContainer(id)\n if (stopped)\n await removeFiles()\n if (!stopped)\n return uncertain()\n return receipt.success\n ? invalid()\n : receipt\n }\n\n const child = spawn(engine, [\n 'container',\n 'start',\n '--attach',\n '--interactive',\n id,\n ], { stdio: 'pipe', windowsHide: true })\n // 流可能在节点取消、收尾和用户观察之间关闭。错误由退出状态或 close 返回值呈现。\n child.stdin.on('error', () => {})\n const completion = new Promise<{ code: number | null, signal: NodeJS.Signals | null }>((resolve) => {\n child.once('error', () => resolve({ code: null, signal: null }))\n child.once('close', (code, exited) => resolve({ code, signal: exited }))\n })\n let closing: Promise<HaiResult<void>> | undefined\n const stop = () => {\n closing ??= (async () => {\n if (!await removeContainer(created))\n return uncertain()\n child.kill()\n try {\n await removeFiles()\n return ok(undefined)\n }\n catch {\n return uncertain()\n }\n })()\n return closing\n }\n let activated = false\n const process: WarmContainer = {\n stdin: child.stdin,\n stdout: child.stdout,\n stderr: child.stderr,\n wait: () => completion,\n async activate(launch, activationSignal, authorize) {\n if (!warm || activated || closing || activationSignal.aborted)\n return invalid()\n activated = true\n const parsed = launchSchema.safeParse(launch)\n if (!parsed.success || parsed.data.cwd !== '/workspace' || Object.keys(parsed.data.env).length\n || Object.keys(parsed.data.files).length || !parsed.data.inputs) {\n return invalid()\n }\n const staged = decodeInputs(parsed.data.inputs, resources)\n const request = JSON.stringify([parsed.data.command, ...parsed.data.args])\n if (!staged || Buffer.byteLength(request) > 524288)\n return invalid()\n try {\n await chmod(inputDir, 0o755)\n await chmod(files, 0o755)\n // 所有写入结算后才允许移除容器或暂存;失败也不会重新分配给另一主体。\n const writes = await Promise.allSettled([\n ...staged.map(item => writeFile(join(inputDir, item.name), item.bytes, { mode: 0o444, flag: 'wx' })),\n writeFile(join(files, 'warm-launch.json'), request, { mode: 0o444, flag: 'wx' }),\n ])\n await chmod(inputDir, 0o555)\n await chmod(files, 0o555)\n if (writes.some(item => item.status === 'rejected') || !await authorize() || activationSignal.aborted || closing)\n return invalid()\n await new Promise<void>((resolve, reject) => {\n child.stdin.write('+', error => error\n ? reject(error)\n : resolve())\n })\n return ok(process)\n }\n catch {\n return unavailable()\n }\n },\n async artifact(name, maxBytes) {\n if (!decoded || closing || signal.aborted || !artifactName.test(name)\n || !Number.isSafeInteger(maxBytes) || maxBytes < 1 || maxBytes > MAX_FILE_BYTES) {\n return invalid()\n }\n try {\n const { stdout } = await execute(engine, [\n 'container',\n 'exec',\n '--user=1000:1000',\n created,\n '/usr/bin/python3',\n '-I',\n '-S',\n '-c',\n READ_ARTIFACT,\n name,\n String(maxBytes),\n ], {\n encoding: 'buffer',\n timeout: 15_000,\n maxBuffer: maxBytes,\n windowsHide: true,\n signal,\n })\n return stdout.length <= maxBytes\n ? ok(stdout.toString('base64'))\n : invalid()\n }\n catch {\n return invalid()\n }\n },\n close: stop,\n }\n if (warm) {\n const readySignal = AbortSignal.any([\n signal,\n AbortSignal.timeout(15_000),\n ])\n try {\n const [chunk] = await once(child.stdout, 'data', { signal: readySignal })\n child.stdout.pause()\n if (!Buffer.isBuffer(chunk) || chunk.length !== 1 || chunk[0] !== 43)\n throw new Error('Invalid warm readiness')\n }\n catch {\n return (await stop()).success\n ? unavailable()\n : uncertain()\n }\n }\n return ok(process)\n }\n catch {\n if (envFile) {\n try {\n await rm(envFile, { force: true })\n }\n catch {\n // 继续清理容器,随后再核对临时目录。\n }\n }\n if (id && await removeContainer(id))\n creationStarted = false\n if (!creationStarted) {\n try {\n await removeFiles()\n }\n catch {\n return uncertain()\n }\n }\n return creationStarted\n ? uncertain()\n : unavailable()\n }\n}\n\n/**\n * 启动完全无用户输入的单次候选容器,等待固定协议就绪。\n * @example 模块内部上下文\n * ```ts\n * function prepare(settings: RunnerConfig, environment: RunnerEnvironment) {\n * return prepareWarmContainer(settings.engine, environment, new AbortController().signal, async () => ok(undefined))\n * }\n * ```\n */\nexport async function prepareWarmContainer(\n engine: RunnerConfig['engine'],\n environment: RunnerEnvironment,\n signal: AbortSignal,\n record: (identity: RunnerContainerIdentity) => Promise<HaiResult<void>>,\n) {\n if (environment.networkPolicy !== 'offline')\n return invalid()\n return startContainer(engine, environment, environment.resources, {\n command: '/usr/bin/python3',\n args: ['-I', '-S', '-c', STANDBY],\n inputs: {},\n }, signal, record, true)\n}\n","import type { HaiResult } from '@h-ai/core'\nimport type { DmlOperations, ReldbTableDef } from '@h-ai/reldb'\nimport type { RunnerConfig, RunnerEnvironment, RunnerResources, submitSchema } from './runner-config.js'\nimport type { RunnerContainerIdentity } from './runner-container.js'\nimport type { RunnerEvent, RunnerExecution, RunnerJson, RunnerOwner, RunnerReconciliation, RunnerScope, RunnerWarmPool } from './runner-types.js'\nimport { createHash, randomUUID } from 'node:crypto'\nimport process from 'node:process'\nimport { err, ok } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { runnerM } from './runner-i18n.js'\nimport { HaiRunnerError } from './runner-types.js'\n\nconst EXECUTIONS = 'hai_runner_executions'\nconst EVENTS = 'hai_runner_events'\nconst GATE = 'hai_runner_gate'\nconst ACTIVE = '(state IN (\\'running\\', \\'cancelling\\') OR (state = \\'unknown\\' AND reconciled_at IS NULL))'\nconst text = { type: 'TEXT', notNull: true } as const\nconst nullableText = { type: 'TEXT' } as const\nconst integer = { type: 'BIGINT', notNull: true } as const\nconst payload = { type: 'JSON' } as const\n\nconst executions: ReldbTableDef = {\n id: { ...text, primaryKey: true },\n scope_key: text,\n reuse_key: { ...nullableText, unique: true },\n request_key: text,\n kind: text,\n request_json: payload,\n environment_key: nullableText,\n state: text,\n reason: nullableText,\n owner_node: nullableText,\n owner_generation: nullableText,\n pinned_node: nullableText,\n pinned_generation: nullableText,\n parent_id: nullableText,\n leased_until: integer,\n queue_until: integer,\n run_until: integer,\n event_sequence: integer,\n cpu_milli: integer,\n memory_mib: integer,\n pids: integer,\n scratch_mib: integer,\n result_json: payload,\n created_at: integer,\n updated_at: integer,\n container_json: payload,\n reconciliation_json: payload,\n reconciled_at: { type: 'BIGINT' },\n capacity_class: text,\n concurrency_key: nullableText,\n concurrency_limit: integer,\n pool_fingerprint: nullableText,\n pool_limit: { type: 'BIGINT' },\n warm_state: nullableText,\n}\n\n/**\n * 持久执行仅保存受信提交的业务输入、环境快照和已检查限额。\n * @example 模块内部上下文\n * ```ts\n * function maxMillis(plan: StoredRequest) { return plan.runTimeoutMs }\n * ```\n */\ninterface StoredRequest {\n scope: RunnerScope\n input: RunnerJson\n environment?: RunnerEnvironment\n resources?: RunnerResources\n runTimeoutMs: number\n}\n\n/**\n * 事务使用的执行记录;时钟字段从 SQL 返回并在公开投影时转换。\n * @example 模块内部上下文\n * ```ts\n * function publicView(row: ExecutionRow) { return project(row) }\n * ```\n */\ninterface ExecutionRow {\n id: string\n scope_key: string\n request_key: string\n kind: string\n request_json: StoredRequest | string\n state: RunnerExecution['status']\n reason: RunnerExecution['failure'] | null\n owner_node: string | null\n owner_generation: string | null\n parent_id: string | null\n leased_until: string | number\n run_until: string | number\n result_json: { value: RunnerJson } | string | null\n created_at: string | number\n updated_at: string | number\n container_json: RunnerContainerIdentity | string | null\n reconciled_at: string | number | null\n pool_fingerprint: string | null\n}\n\n/**\n * 当前领取只供本节点调用其注册的处理器。\n * @example 模块内部上下文\n * ```ts\n * function input(claimed: RunnerClaim) { return claimed.request.input }\n * ```\n */\nexport interface RunnerClaim {\n id: string\n kind: string\n parentId?: string\n warmId?: string\n request: StoredRequest\n}\n\n/**\n * 执行生命周期的存储操作,无进程级锁替代数据库原子提交。\n * @example 模块内部上下文\n * ```ts\n * async function read(store: RunnerStore) { return store.get({ tenantId: 'work', userId: 'alice' }, '123') }\n * ```\n */\nexport type RunnerStore = ReturnType<typeof makeStore>\n\nfunction clock() {\n if (reldb.config?.type === 'postgresql')\n return 'CAST(FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) AS BIGINT)'\n if (reldb.config?.type === 'mysql')\n return 'CAST(UNIX_TIMESTAMP(SYSDATE(3)) * 1000 AS UNSIGNED)'\n return 'CAST((julianday(\\'now\\') - 2440587.5) * 86400000 AS INTEGER)'\n}\n\n/** 对已校验 JSON 排序,重传对象的属性顺序不改变幂等身份。 */\nfunction canonical(value: RunnerJson): string {\n if (Array.isArray(value))\n return `[${value.map(canonical).join(',')}]`\n if (value !== null && typeof value === 'object')\n return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${canonical(value[key])}`).join(',')}}`\n return JSON.stringify(value)\n}\n\nfunction hash(value: RunnerJson) {\n return createHash('sha256').update(canonical(value)).digest('hex')\n}\n\nfunction databaseValue<T>(value: T | string): T {\n return typeof value === 'string'\n ? JSON.parse(value) as T\n : value\n}\n\nfunction project(row: ExecutionRow): RunnerExecution {\n const request = databaseValue<StoredRequest>(row.request_json)\n return {\n id: row.id,\n status: row.state,\n owner: row.owner_node && row.owner_generation\n ? { nodeId: row.owner_node, generation: row.owner_generation }\n : undefined,\n environmentId: request.environment?.id,\n output: row.result_json === null\n ? undefined\n : databaseValue<{ value: RunnerJson }>(row.result_json).value,\n failure: row.reason ?? undefined,\n createdAt: Number(row.created_at),\n updatedAt: Number(row.updated_at),\n reconciledAt: row.reconciled_at === null\n ? undefined\n : Number(row.reconciled_at),\n }\n}\n\nfunction unavailable() {\n return err(HaiRunnerError.UNAVAILABLE, runnerM('runner_unavailable'))\n}\n\nfunction lost() {\n return err(HaiRunnerError.LEASE_LOST, runnerM('runner_leaseLost'))\n}\n\nfunction missing() {\n return err(HaiRunnerError.NOT_FOUND, runnerM('runner_notFound'))\n}\n\nfunction conflict() {\n return err(HaiRunnerError.CONFLICT, runnerM('runner_conflict'))\n}\n\nfunction overflow() {\n return err(HaiRunnerError.CAPACITY, runnerM('runner_capacity'))\n}\n\n/** 数据库失败抛给事务包装以触发回滚。 */\nfunction data<T>(result: HaiResult<T>): T {\n if (!result.success)\n throw new Error('Runner database operation failed', { cause: result.error })\n return result.data\n}\n\nasync function serialized<T>(action: (sql: DmlOperations) => Promise<HaiResult<T>>): Promise<HaiResult<T>> {\n const response = await reldb.tx.wrap(async (tx) => {\n data(await tx.execute(`UPDATE ${GATE} SET revision = revision + 1 WHERE id = 1`))\n return action(tx)\n })\n return response.success\n ? response.data\n : unavailable()\n}\n\nasync function find(sql: DmlOperations, id: string, scopeKey: string) {\n return data(await sql.get<ExecutionRow>(`SELECT * FROM ${EXECUTIONS} WHERE id = ? AND scope_key = ?`, [id, scopeKey]))\n}\n\nfunction columns(resources: RunnerResources | undefined): [number, number, number, number] {\n return resources\n ? [\n Math.ceil(resources.cpu * 1000),\n resources.memoryMiB,\n resources.pids,\n resources.scratchMiB,\n ]\n : [0, 0, 0, 0]\n}\n\nfunction within(actual: RunnerResources, ceiling: RunnerResources) {\n return actual.cpu <= ceiling.cpu && actual.memoryMiB <= ceiling.memoryMiB\n && actual.pids <= ceiling.pids && actual.scratchMiB <= ceiling.scratchMiB\n}\n\n/**\n * 初始化可重复执行;SQLite 用于单机,所有后端都使用同一套事务门闩。\n * @example 模块内部上下文\n * ```ts\n * async function buildTables() { return readyStore() }\n * ```\n */\nexport async function readyStore(): Promise<HaiResult<void>> {\n if (!reldb.isInitialized)\n return unavailable()\n for (const [name, def] of [\n [\n GATE,\n {\n id: { ...integer, primaryKey: true },\n revision: integer,\n },\n ],\n [EXECUTIONS, executions],\n [\n EVENTS,\n {\n id: { ...text, primaryKey: true },\n execution_id: text,\n sequence_number: integer,\n event_json: payload,\n created_at: integer,\n },\n ],\n ] satisfies [string, ReldbTableDef][]) {\n const result = await reldb.ddl.createTable(name, def)\n if (!result.success) {\n const existing = await reldb.schemaColumns(name)\n if (!existing.success || Object.keys(def).some(column => !existing.data.includes(column)))\n return unavailable()\n }\n }\n\n for (const [table, name, fields] of [\n [\n EXECUTIONS,\n 'hai_runner_queue_idx',\n ['state', 'kind', 'created_at'],\n ],\n [\n EXECUTIONS,\n 'hai_runner_owner_idx',\n ['owner_node', 'state', 'leased_until'],\n ],\n [\n EXECUTIONS,\n 'hai_runner_scope_idx',\n ['scope_key', 'capacity_class', 'state'],\n ],\n [\n EXECUTIONS,\n 'hai_runner_concurrency_idx',\n ['concurrency_key', 'state'],\n ],\n [\n EVENTS,\n 'hai_runner_event_cursor_idx',\n ['execution_id', 'sequence_number'],\n ],\n ] satisfies [string, string, string[]][]) {\n const result = await reldb.ddl.createIndex(table, name, { columns: fields })\n if (!result.success) {\n // MySQL 缺少 CREATE INDEX IF NOT EXISTS;并发初始化后核对索引实际列。\n if (reldb.config?.type !== 'mysql')\n return unavailable()\n const existing = await reldb.sql.query<{ column_name: string }>(\n 'SELECT COLUMN_NAME AS column_name FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND INDEX_NAME = ? ORDER BY SEQ_IN_INDEX',\n [table, name],\n )\n if (!existing.success || JSON.stringify(existing.data.map(row => row.column_name)) !== JSON.stringify(fields))\n return unavailable()\n }\n }\n\n const syntax = reldb.config?.type === 'mysql'\n ? ' ON DUPLICATE KEY UPDATE id = id'\n : ' ON CONFLICT (id) DO NOTHING'\n const seed = await reldb.sql.execute(`INSERT INTO ${GATE} (id, revision) VALUES (1, 0)${syntax}`)\n return seed.success\n ? ok(undefined)\n : unavailable()\n}\n\n/**\n * 管理任务持久化、资源预留和条件提交。\n * @example 模块内部上下文\n * ```ts\n * function controller(config: RunnerConfig, owner: RunnerOwner) { return makeStore(config, owner) }\n * ```\n */\nexport function makeStore(config: RunnerConfig, owner: RunnerOwner) {\n const envById = new Map(config.environments.map(item => [item.id, item]))\n const envKeys = config.environments.filter(item => !item.architecture || item.architecture === process.arch).map(item => hash(item))\n const now = clock()\n const resultValue = reldb.config?.type === 'postgresql'\n ? 'CAST(? AS JSONB)'\n : reldb.config?.type === 'mysql'\n ? 'CAST(CONVERT(? USING utf8mb4) AS JSON)'\n : '?'\n\n /** 排队超时和旧租约都由数据库时钟判断。未知副作用保留原资源预留。 */\n async function sweep(sql: DmlOperations) {\n data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'failed', reason = 'queue-timeout', reuse_key = NULL, updated_at = ${now}\n WHERE state = 'queued' AND queue_until <= ${now}`))\n data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'unknown', reason = 'owner-lost', updated_at = ${now}\n WHERE state IN ('running', 'cancelling') AND leased_until <= ${now}`))\n data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'cancelling', reason = 'run-timeout', updated_at = ${now}\n WHERE state = 'running' AND run_until <= ${now} AND leased_until > ${now}`))\n }\n\n return {\n async sweep(): Promise<HaiResult<void>> {\n return serialized(async (sql) => {\n await sweep(sql)\n return ok(undefined)\n })\n },\n\n async submit(request: ReturnType<typeof submitSchema.parse>, pool?: RunnerWarmPool): Promise<HaiResult<RunnerExecution>> {\n const scopeKey = hash([request.scope.tenantId, request.scope.userId])\n const id = hash([scopeKey, request.kind, request.idempotencyKey ?? randomUUID()])\n const reuse = request.reuseKey === undefined\n ? null\n : hash([scopeKey, request.kind, request.reuseKey])\n const requestKey = hash({\n kind: request.kind,\n input: request.input,\n environmentId: request.environmentId ?? null,\n resources: request.resources ?? null,\n parentId: request.parentId ?? null,\n nodeId: request.nodeId ?? null,\n queueTimeoutMs: request.queueTimeoutMs,\n capacityClass: request.capacityClass,\n concurrency: request.concurrency ?? null,\n warmPool: pool\n ? { ...pool }\n : null,\n runTimeoutMs: request.runTimeoutMs,\n })\n return serialized(async (sql) => {\n const existing = await find(sql, id, scopeKey)\n ?? (reuse\n ? data(await sql.get<ExecutionRow>(`SELECT * FROM ${EXECUTIONS} WHERE reuse_key = ?`, [reuse]))\n : null)\n if (existing) {\n return existing.request_key === requestKey\n ? ok(project(existing))\n : conflict()\n }\n\n const environment = request.environmentId\n ? envById.get(request.environmentId)\n : undefined\n if (request.warmPool && (!pool || !environment))\n return missing()\n if (request.environmentId && !environment)\n return missing()\n const resources = environment\n ? {\n ...environment.resources,\n ...request.resources,\n }\n : request.resources\n ? {\n cpu: 1,\n memoryMiB: 64,\n pids: 16,\n scratchMiB: 16,\n ...request.resources,\n }\n : undefined\n if (environment && resources && !within(resources, environment.resources))\n return overflow()\n\n const parent = request.parentId\n ? await find(sql, request.parentId, scopeKey)\n : null\n if (request.parentId && (!parent || parent.state !== 'running'))\n return conflict()\n const parentFilter = request.parentId ? 'IS NOT NULL' : 'IS NULL'\n const queued = data(await sql.get<{ total: number | string }>(`SELECT COUNT(*) AS total FROM ${EXECUTIONS} WHERE state = 'queued' AND parent_id ${parentFilter}`))\n if (Number(queued?.total) >= config.maxQueued)\n return overflow()\n\n const saved: StoredRequest = {\n scope: request.scope,\n input: request.input,\n environment,\n resources,\n runTimeoutMs: request.runTimeoutMs,\n }\n data(await sql.execute(`INSERT INTO ${EXECUTIONS}\n (id, scope_key, reuse_key, request_key, kind, request_json, environment_key, state, pinned_node, pinned_generation, parent_id,\n leased_until, queue_until, run_until, event_sequence, cpu_milli, memory_mib, pids, scratch_mib, created_at, updated_at, capacity_class, concurrency_key, concurrency_limit, pool_fingerprint, pool_limit)\n VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?, ?, 0, ${now} + ?, 0, 0, ?, ?, ?, ?, ${now}, ${now}, ?, ?, ?, ?, ?)`, [\n id,\n scopeKey,\n reuse,\n requestKey,\n request.kind,\n JSON.stringify(saved),\n environment\n ? hash(environment)\n : null,\n parent?.owner_node ?? request.nodeId ?? null,\n parent?.owner_generation ?? null,\n request.parentId ?? null,\n request.queueTimeoutMs,\n ...columns(resources),\n request.capacityClass,\n request.concurrency\n ? hash([request.kind, request.concurrency.key])\n : null,\n request.concurrency?.limit ?? 0,\n pool && environment\n ? hash({\n pool: { ...pool },\n environment,\n })\n : null,\n pool?.maxTotal ?? null,\n ]))\n const row = await find(sql, id, scopeKey)\n if (!row)\n throw new Error('Newly inserted execution could not be read')\n return ok(project(row))\n })\n },\n\n async find(scope: RunnerScope, kind: string, key: string): Promise<HaiResult<RunnerExecution | undefined>> {\n try {\n const scopeKey = hash([scope.tenantId, scope.userId])\n const row = await find(reldb.sql, hash([scopeKey, kind, key]), scopeKey)\n return ok(row\n ? project(row)\n : undefined)\n }\n catch {\n return unavailable()\n }\n },\n\n async get(scope: RunnerScope, id: string): Promise<HaiResult<RunnerExecution>> {\n try {\n const row = await find(reldb.sql, id, hash([scope.tenantId, scope.userId]))\n return row\n ? ok(project(row))\n : missing()\n }\n catch {\n return unavailable()\n }\n },\n\n async cancel(scope: RunnerScope, id: string): Promise<HaiResult<RunnerExecution>> {\n return serialized(async (sql) => {\n const row = await find(sql, id, hash([scope.tenantId, scope.userId]))\n if (!row)\n return missing()\n data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'cancelled', reuse_key = NULL, updated_at = ${now} WHERE id = ? AND state = 'queued'`, [id]))\n data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'cancelling', updated_at = ${now} WHERE id = ? AND state = 'running'`, [id]))\n data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'cancelled', reason = 'parent-ended', updated_at = ${now} WHERE parent_id = ? AND state = 'queued'`, [id]))\n data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'cancelling', reason = 'parent-ended', updated_at = ${now} WHERE parent_id = ? AND state = 'running'`, [id]))\n const changed = await find(sql, id, row.scope_key)\n return changed\n ? ok(project(changed))\n : missing()\n })\n },\n\n async reserveWarm(pool: RunnerWarmPool): Promise<HaiResult<RunnerClaim | null>> {\n const environment = envById.get(pool.environmentId)\n if (!environment || !pool.minReady || !envKeys.includes(hash(environment)))\n return ok(null)\n const fingerprint = hash({\n pool: { ...pool },\n environment,\n })\n const key = hash([pool.kind, pool.key])\n return serialized(async (sql) => {\n const [totalsResult, reservedResult] = await Promise.all([\n sql.get<{ total: string | number, warm: string | number, ceiling: string | number }>(`\n SELECT COUNT(*) AS total, COALESCE(SUM(CASE WHEN state = 'running' AND pool_fingerprint = ?\n AND warm_state IN ('starting','ready') THEN 1 ELSE 0 END),0) AS warm,\n COALESCE(MIN(pool_limit), ?) AS ceiling\n FROM ${EXECUTIONS} WHERE concurrency_key = ? AND ${ACTIVE}`, [fingerprint, pool.maxTotal, key]),\n sql.get<{ active: string | number, cpu: string | number, memory: string | number, pids: string | number, scratch: string | number }>(`\n SELECT COUNT(*) AS active, COALESCE(SUM(cpu_milli),0) AS cpu, COALESCE(SUM(memory_mib),0) AS memory,\n COALESCE(SUM(pids),0) AS pids, COALESCE(SUM(scratch_mib),0) AS scratch\n FROM ${EXECUTIONS} WHERE owner_node = ? AND capacity_class = 'tool' AND ${ACTIVE}`, [owner.nodeId]),\n ])\n const totals = data(totalsResult)\n const reserved = data(reservedResult)\n if (!totals || !reserved || Number(totals.warm) >= pool.minReady\n || Number(totals.total) >= Math.min(pool.maxTotal, Number(totals.ceiling))\n || Number(reserved.active) >= config.toolMaxRunning) {\n return ok(null)\n }\n const usage = columns(environment.resources)\n const capacity = columns(config.toolCapacity)\n const occupied = [\n Number(reserved.cpu),\n Number(reserved.memory),\n Number(reserved.pids),\n Number(reserved.scratch),\n ]\n if (usage.some((amount, index) => amount + occupied[index] > capacity[index]))\n return ok(null)\n const id = hash([\n owner.generation,\n randomUUID(),\n ])\n const request: StoredRequest = {\n scope: { tenantId: '@runner', userId: '@warm' },\n input: null,\n environment,\n resources: environment.resources,\n runTimeoutMs: 86_400_000,\n }\n data(await sql.execute(`INSERT INTO ${EXECUTIONS}\n (id, scope_key, request_key, kind, request_json, environment_key, state, owner_node, owner_generation,\n leased_until, queue_until, run_until, event_sequence, cpu_milli, memory_mib, pids, scratch_mib,\n created_at, updated_at, capacity_class, concurrency_key, concurrency_limit, pool_fingerprint, pool_limit, warm_state)\n VALUES (?, ?, ?, ?, ?, ?, 'running', ?, ?, ${now} + ?, 0, ${now} + ?, 0, ?, ?, ?, ?,\n ${now}, ${now}, 'tool', ?, ?, ?, ?, 'starting')`, [\n id,\n hash(['@runner', '@warm']),\n id,\n pool.kind,\n JSON.stringify(request),\n hash(environment),\n owner.nodeId,\n owner.generation,\n config.leaseMs,\n request.runTimeoutMs,\n ...usage,\n key,\n pool.maxRunning,\n fingerprint,\n pool.maxTotal,\n ]))\n return ok({ id, kind: pool.kind, request })\n })\n },\n\n async markWarmReady(id: string): Promise<HaiResult<void>> {\n const result = await reldb.sql.execute(`UPDATE ${EXECUTIONS} SET warm_state = 'ready', updated_at = ${now}\n WHERE id = ? AND owner_generation = ? AND state = 'running' AND warm_state = 'starting'\n AND leased_until > ${now} AND container_json IS NOT NULL`, [id, owner.generation])\n return result.success && result.data.changes === 1\n ? ok(undefined)\n : lost()\n },\n\n async claim(kinds: string[], category: 'control' | 'default' | 'tool', pools: RunnerWarmPool[] = [], warmIds: string[] = []): Promise<HaiResult<RunnerClaim | null>> {\n return serialized(async (sql) => {\n if (!kinds.length)\n return ok(null)\n const maxRunning = category === 'tool'\n ? config.toolMaxRunning\n : category === 'control'\n ? config.maxControlRunning\n : config.maxRunning\n const capacityClass = category === 'tool'\n ? 'tool'\n : 'default'\n const parentFilter = category === 'control'\n ? 'IS NOT NULL'\n : 'IS NULL'\n const reserved = data(await sql.get<{ active: number | string, cpu: number | string, memory: number | string, pids: number | string, scratch: number | string }>(\n `SELECT COUNT(*) AS active, COALESCE(SUM(cpu_milli),0) AS cpu, COALESCE(SUM(memory_mib),0) AS memory,\n COALESCE(SUM(pids),0) AS pids, COALESCE(SUM(scratch_mib),0) AS scratch\n FROM ${EXECUTIONS} WHERE owner_node = ? AND capacity_class = ? AND ${ACTIVE} AND parent_id ${parentFilter}`,\n [owner.nodeId, capacityClass],\n ))\n if (!reserved)\n return ok(null)\n\n const fingerprints = category === 'tool'\n ? pools.flatMap((pool) => {\n const environment = envById.get(pool.environmentId)\n return environment\n ? [\n hash({\n pool: { ...pool },\n environment,\n }),\n ]\n : []\n })\n : []\n const eligiblePool = fingerprints.length\n ? ` OR q.pool_fingerprint IN (${fingerprints.map(() => '?').join(',')})`\n : ''\n const ready = category === 'tool' && warmIds.length\n ? `EXISTS (SELECT 1 FROM ${EXECUTIONS} w WHERE w.id IN (${warmIds.map(() => '?').join(',')})\n AND w.pool_fingerprint = q.pool_fingerprint AND w.state = 'running' AND w.warm_state = 'ready' AND w.leased_until > ${now})`\n : '1 = 0'\n const canStartCold = Number(reserved.active) < maxRunning\n const eligibleEnvironment = envKeys.length\n ? ` OR q.environment_key IN (${envKeys.map(() => '?').join(',')})`\n : ''\n const [cpu, memory, pids, scratch] = columns(category === 'tool'\n ? config.toolCapacity\n : config.capacity)\n const row = data(await sql.get<ExecutionRow>(`\n SELECT q.* FROM ${EXECUTIONS} q\n WHERE q.state = 'queued' AND q.capacity_class = ? AND q.queue_until > ${now} AND q.parent_id ${parentFilter}\n AND (q.pinned_node IS NULL OR q.pinned_node = ?) AND (q.pinned_generation IS NULL OR q.pinned_generation = ?)\n AND q.kind IN (${kinds.map(() => '?').join(',')}) AND (q.environment_key IS NULL${eligibleEnvironment})\n AND (q.pool_fingerprint IS NULL${eligiblePool})\n AND ((${ready}) OR (? = 1 AND q.cpu_milli <= ? AND q.memory_mib <= ? AND q.pids <= ? AND q.scratch_mib <= ?\n AND (q.pool_fingerprint IS NULL OR (\n NOT EXISTS (SELECT 1 FROM ${EXECUTIONS} w WHERE w.pool_fingerprint = q.pool_fingerprint\n AND w.state = 'running' AND w.warm_state IN ('starting','ready') AND w.leased_until > ${now}\n AND (q.pinned_node IS NULL OR q.pinned_node = w.owner_node))\n AND (SELECT COUNT(*) FROM ${EXECUTIONS} a WHERE a.concurrency_key = q.concurrency_key AND ${ACTIVE})\n < ${reldb.config?.type === 'sqlite'\n ? 'MIN'\n : 'LEAST'}(q.pool_limit, COALESCE((SELECT MIN(a.pool_limit) FROM ${EXECUTIONS} a\n WHERE a.concurrency_key = q.concurrency_key AND ${ACTIVE}), q.pool_limit))))))\n AND (q.parent_id IS NULL OR EXISTS (SELECT 1 FROM ${EXECUTIONS} p\n WHERE p.id = q.parent_id AND p.state = 'running' AND p.leased_until > ${now} AND p.run_until > ${now}))\n AND (SELECT COUNT(*) FROM ${EXECUTIONS} a WHERE a.scope_key = q.scope_key AND a.warm_state IS NULL AND ${ACTIVE}\n AND a.capacity_class = q.capacity_class AND a.parent_id ${parentFilter}) < ?\n AND (q.concurrency_key IS NULL OR (\n (SELECT COUNT(*) FROM ${EXECUTIONS} a WHERE a.concurrency_key = q.concurrency_key AND a.warm_state IS NULL AND ${ACTIVE}) < q.concurrency_limit\n AND (SELECT COUNT(*) FROM ${EXECUTIONS} a WHERE a.concurrency_key = q.concurrency_key AND a.warm_state IS NULL AND ${ACTIVE})\n < COALESCE((SELECT MIN(a.concurrency_limit) FROM ${EXECUTIONS} a WHERE a.concurrency_key = q.concurrency_key AND ${ACTIVE}), q.concurrency_limit)))\n ORDER BY (SELECT COUNT(*) FROM ${EXECUTIONS} a WHERE a.scope_key = q.scope_key\n AND ${ACTIVE} AND a.capacity_class = q.capacity_class AND a.parent_id ${parentFilter}) ASC, q.created_at ASC, q.id ASC\n LIMIT 1\n `, [\n capacityClass,\n owner.nodeId,\n owner.generation,\n ...kinds,\n ...envKeys,\n ...fingerprints,\n ...(category === 'tool'\n ? warmIds\n : []),\n Number(canStartCold),\n cpu - Number(reserved.cpu),\n memory - Number(reserved.memory),\n pids - Number(reserved.pids),\n scratch - Number(reserved.scratch),\n config.maxRunningPerScope,\n ]))\n if (!row)\n return ok(null)\n const request = databaseValue<StoredRequest>(row.request_json)\n const standby = row.pool_fingerprint && warmIds.length\n ? data(await sql.get<ExecutionRow>(`\n SELECT * FROM ${EXECUTIONS} WHERE id IN (${warmIds.map(() => '?').join(',')}) AND pool_fingerprint = ?\n AND state = 'running' AND warm_state = 'ready' AND leased_until > ${now} ORDER BY created_at, id LIMIT 1`, [...warmIds, row.pool_fingerprint]))\n : null\n const changed = data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'running', owner_node = ?, owner_generation = ?,\n container_json = ${resultValue}, leased_until = ${now} + ?, run_until = ${now} + ?, updated_at = ${now}\n WHERE id = ? AND state = 'queued' AND queue_until > ${now}`, [\n owner.nodeId,\n owner.generation,\n standby?.container_json\n ? JSON.stringify(databaseValue<RunnerContainerIdentity>(standby.container_json))\n : null,\n config.leaseMs,\n request.runTimeoutMs,\n row.id,\n ]))\n if (changed.changes === 1 && standby) {\n const transferred = data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'succeeded', warm_state = 'transferred', updated_at = ${now}\n WHERE id = ? AND owner_generation = ? AND state = 'running' AND warm_state = 'ready' AND leased_until > ${now}`, [standby.id, owner.generation]))\n if (transferred.changes !== 1)\n throw new Error('Warm container reservation expired')\n }\n return ok(changed.changes === 1\n ? {\n id: row.id,\n kind: row.kind,\n parentId: row.parent_id ?? undefined,\n warmId: standby?.id,\n request,\n }\n : null)\n })\n },\n\n async cancelOwned(id: string): Promise<HaiResult<void>> {\n const result = await reldb.sql.execute(`UPDATE ${EXECUTIONS} SET state = 'cancelling', updated_at = ${now}\n WHERE id = ? AND owner_generation = ? AND state = 'running' AND leased_until > ${now}`, [id, owner.generation])\n return result.success\n ? ok(undefined)\n : unavailable()\n },\n\n async recordContainer(id: string, container: RunnerContainerIdentity): Promise<HaiResult<void>> {\n const result = await reldb.sql.execute(`UPDATE ${EXECUTIONS} SET container_json = ${resultValue}\n WHERE id = ? AND owner_generation = ? AND state = 'running' AND container_json IS NULL\n AND leased_until > ${now} AND run_until > ${now}`, [\n JSON.stringify(container),\n id,\n owner.generation,\n ])\n return result.success && result.data.changes === 1\n ? ok(undefined)\n : lost()\n },\n\n async reconciliation(scope: RunnerScope, id: string) {\n try {\n const row = await find(reldb.sql, id, hash([scope.tenantId, scope.userId]))\n if (!row)\n return missing()\n if (row.state !== 'unknown' || row.owner_node !== owner.nodeId || row.reconciled_at !== null\n || !row.owner_generation || !row.container_json) {\n return conflict()\n }\n const container = databaseValue<RunnerContainerIdentity>(row.container_json)\n return container.engine === config.engine\n ? ok({ container, generation: row.owner_generation })\n : conflict()\n }\n catch {\n return unavailable()\n }\n },\n\n async reconcile(scope: RunnerScope, id: string, generation: string, review: RunnerReconciliation): Promise<HaiResult<RunnerExecution>> {\n return serialized(async (sql) => {\n const scopeKey = hash([scope.tenantId, scope.userId])\n const result = data(await sql.execute(`UPDATE ${EXECUTIONS}\n SET reconciled_at = ${now}, reconciliation_json = ${resultValue}, reuse_key = NULL, updated_at = ${now}\n WHERE id = ? AND scope_key = ? AND owner_node = ? AND owner_generation = ? AND state = 'unknown'\n AND reconciled_at IS NULL AND container_json IS NOT NULL`, [\n JSON.stringify(review),\n id,\n scopeKey,\n owner.nodeId,\n generation,\n ]))\n if (result.changes !== 1)\n return conflict()\n const row = await find(sql, id, scopeKey)\n return row\n ? ok(project(row))\n : missing()\n })\n },\n\n async renew(id: string): Promise<HaiResult<'running' | 'cancelling'>> {\n const renewed = await reldb.sql.execute(`UPDATE ${EXECUTIONS} SET leased_until = ${now} + ?, updated_at = ${now}\n WHERE id = ? AND owner_generation = ? AND state IN ('running', 'cancelling') AND leased_until > ${now}`, [config.leaseMs, id, owner.generation])\n if (!renewed.success)\n return unavailable()\n if (renewed.data.changes !== 1)\n return lost()\n const row = await reldb.sql.get<{ state: 'running' | 'cancelling', parent_id: string | null }>(\n `SELECT state, parent_id FROM ${EXECUTIONS} WHERE id = ? AND owner_generation = ? AND leased_until > ${now}`,\n [id, owner.generation],\n )\n if (!row.success)\n return unavailable()\n if (!row.data)\n return lost()\n if (row.data.parent_id) {\n const parent = await reldb.sql.get<{ id: string }>(`SELECT id FROM ${EXECUTIONS} WHERE id = ?\n AND owner_generation = ? AND state = 'running' AND leased_until > ${now} AND run_until > ${now}`, [row.data.parent_id, owner.generation])\n if (!parent.success)\n return unavailable()\n if (!parent.data) {\n const cancelled = await this.cancelOwned(id)\n return cancelled.success\n ? ok('cancelling')\n : cancelled\n }\n }\n return ok(row.data.state)\n },\n\n async emit(id: string, value: RunnerJson): Promise<HaiResult<void>> {\n const result = await reldb.tx.wrap(async (sql) => {\n const changed = data(await sql.execute(`UPDATE ${EXECUTIONS} SET event_sequence = event_sequence + 1\n WHERE id = ? AND owner_generation = ? AND state = 'running' AND leased_until > ${now}\n AND run_until > ${now} AND event_sequence < ?`, [id, owner.generation, config.maxEvents]))\n if (changed.changes !== 1)\n return lost()\n const row = data(await sql.get<{ event_sequence: number | string }>(`SELECT event_sequence FROM ${EXECUTIONS} WHERE id = ?`, [id]))\n const sequence = Number(row?.event_sequence)\n const published = data(await sql.execute(`INSERT INTO ${EVENTS} (id, execution_id, sequence_number, event_json, created_at)\n SELECT ?, ?, ?, ${resultValue}, ${now} FROM ${EXECUTIONS} q LEFT JOIN ${EXECUTIONS} p ON p.id = q.parent_id\n WHERE q.id = ? AND q.leased_until > ${now} AND q.run_until > ${now}\n AND (q.parent_id IS NULL OR (p.state = 'running' AND p.owner_generation = q.owner_generation\n AND p.leased_until > ${now} AND p.run_until > ${now}))`, [\n hash([id, sequence]),\n id,\n sequence,\n JSON.stringify({ value }),\n id,\n ]))\n if (published.changes !== 1)\n throw new Error('Event owner lost')\n return ok(undefined)\n })\n return result.success\n ? result.data\n : unavailable()\n },\n\n async events(scope: RunnerScope, id: string, after: number, limit: number): Promise<HaiResult<RunnerEvent[]>> {\n const result = await this.get(scope, id)\n if (!result.success)\n return result\n const page = await reldb.sql.query<{ sequence_number: number | string, event_json: { value: RunnerJson } | string, created_at: number | string }>(\n `SELECT sequence_number, event_json, created_at FROM ${EVENTS}\n WHERE execution_id = ? AND sequence_number > ? ORDER BY sequence_number ASC LIMIT ?`,\n [id, after, limit],\n )\n if (!page.success)\n return unavailable()\n try {\n return ok(page.data.map(row => ({\n sequence: Number(row.sequence_number),\n data: databaseValue<{ value: RunnerJson }>(row.event_json).value,\n createdAt: Number(row.created_at),\n })))\n }\n catch {\n return unavailable()\n }\n },\n\n async finish(id: string, output: RunnerJson | undefined, stopped: boolean): Promise<HaiResult<void>> {\n return serialized(async (sql) => {\n if (!stopped) {\n data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'unknown', reason = 'cleanup-unconfirmed', updated_at = ${now}\n WHERE id = ? AND owner_generation = ? AND state IN ('running', 'cancelling') AND leased_until > ${now}`, [id, owner.generation]))\n return lost()\n }\n const child = data(await sql.get<{ parent_id: string | null }>(\n `SELECT parent_id FROM ${EXECUTIONS} WHERE id = ? AND owner_generation = ?`,\n [id, owner.generation],\n ))\n if (!child)\n return lost()\n const parentLock = reldb.config?.type === 'sqlite'\n ? ''\n : ' FOR UPDATE'\n const parent = child.parent_id\n ? data(await sql.get<ExecutionRow>(\n `SELECT * FROM ${EXECUTIONS} WHERE id = ?${parentLock}`,\n [child.parent_id],\n ))\n : null\n const parentUntil = child.parent_id\n ? parent?.state === 'running' && parent.owner_generation === owner.generation\n ? Math.min(Number(parent.leased_until), Number(parent.run_until))\n : 0\n : Number.MAX_SAFE_INTEGER\n const changed = data(await sql.execute(`UPDATE ${EXECUTIONS}\n SET result_json = CASE WHEN state = 'running' AND run_until > ${now} AND ? > ${now} THEN ${resultValue} ELSE NULL END,\n reason = CASE WHEN reason = 'run-timeout' OR run_until <= ${now} THEN 'run-timeout'\n WHEN ? <= ${now} THEN 'parent-ended' WHEN state = 'cancelling' THEN reason ELSE ? END,\n state = CASE WHEN reason = 'run-timeout' OR run_until <= ${now} THEN 'failed'\n WHEN state = 'cancelling' OR ? <= ${now} THEN 'cancelled' ELSE ? END,\n reuse_key = NULL, updated_at = ${now}\n WHERE id = ? AND owner_generation = ? AND state IN ('running', 'cancelling') AND leased_until > ${now}`, [\n parentUntil,\n output === undefined\n ? null\n : JSON.stringify({ value: output }),\n parentUntil,\n output === undefined\n ? 'handler-failed'\n : null,\n parentUntil,\n output === undefined\n ? 'failed'\n : 'succeeded',\n id,\n owner.generation,\n ]))\n if (changed.changes !== 1)\n return lost()\n data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'cancelled', reason = 'parent-ended', updated_at = ${now} WHERE parent_id = ? AND state = 'queued'`, [id]))\n data(await sql.execute(`UPDATE ${EXECUTIONS} SET state = 'cancelling', reason = 'parent-ended', updated_at = ${now} WHERE parent_id = ? AND state = 'running'`, [id]))\n return ok(undefined)\n })\n },\n }\n}\n","import type { HaiResult } from '@h-ai/core'\nimport type { RunnerConfig, RunnerConfigInput } from './runner-config.js'\nimport type { WarmContainer } from './runner-container.js'\nimport type { RunnerClaim, RunnerStore } from './runner-store.js'\nimport type { RunnerContext, RunnerFunctions, RunnerHandler, RunnerJson, RunnerLaunch, RunnerOwner, RunnerProcess, RunnerScope, RunnerSubmit, RunnerWarmPool } from './runner-types.js'\nimport { Buffer } from 'node:buffer'\nimport { randomUUID } from 'node:crypto'\nimport { core, err, ok } from '@h-ai/core'\nimport { json, RunnerConfigSchema, runnerKind, submitSchema, warmPoolSchema } from './runner-config.js'\nimport { confirmContainerReleased, prepareWarmContainer, startContainer } from './runner-container.js'\nimport { runnerM } from './runner-i18n.js'\nimport { makeStore, readyStore } from './runner-store.js'\nimport { HaiRunnerError } from './runner-types.js'\n\nconst logger = core.logger.child({ module: 'runner' })\nconst inactive = core.module.createNotInitializedKit(HaiRunnerError.NOT_INITIALIZED, () => runnerM('runner_notInitialized')).result\n\n/**\n * 本地任务控制不作为持久归属凭据;只用于停止当前节点实际持有的资源。\n * @example 模块内部上下文\n * ```ts\n * function abort(execution: LocalExecution) { execution.abort.abort() }\n * ```\n */\ninterface LocalExecution {\n abort: AbortController\n done: Promise<boolean>\n renewAt: number\n}\n\nconst MAX_PAYLOAD_BYTES = 512 * 1024\n\nfunction invalid() {\n return err(HaiRunnerError.INVALID, runnerM('runner_invalid'))\n}\n\nfunction cleanupUnconfirmed() {\n return err(HaiRunnerError.CLEANUP_UNCONFIRMED, runnerM('runner_cleanupUnconfirmed'))\n}\n\nfunction notFound() {\n return err(HaiRunnerError.NOT_FOUND, runnerM('runner_notFound'))\n}\n\nfunction validAddress(scope: RunnerScope, id: string) {\n return !!scope && typeof scope.tenantId === 'string' && typeof scope.userId === 'string'\n && scope.tenantId.length > 0 && scope.tenantId.length <= 200\n && scope.userId.length > 0 && scope.userId.length <= 200 && /^[a-f\\d]{64}$/u.test(id)\n}\n\nfunction bounded(input: unknown) {\n try {\n return Buffer.byteLength(JSON.stringify(input)) <= MAX_PAYLOAD_BYTES\n }\n catch {\n return false\n }\n}\n\n/**\n * 创建独立 runner,可在同一进程分别承接不同节点角色或用于隔离测试。\n * @example\n * ```ts\n * import { reldb } from '@h-ai/reldb'\n * import { createRunner } from '@h-ai/runner'\n * const database = await reldb.init({ type: 'sqlite', database: ':memory:' })\n * if (!database.success) throw new Error(database.error.message)\n * const runner = createRunner()\n * const initialized = await runner.init({ nodeId: 'tools' })\n * if (!initialized.success) throw new Error(initialized.error.message)\n * await runner.close()\n * await reldb.close()\n * ```\n */\nexport function createRunner(): RunnerFunctions {\n let config: RunnerConfig | undefined\n let store: RunnerStore | undefined\n let owner: RunnerOwner | undefined\n let initializing = false\n let closing: Promise<HaiResult<void>> | undefined\n let closingRequested = false\n let timer: NodeJS.Timeout | undefined\n let tick: Promise<void> | undefined\n let sweepAt = 0\n let unconfirmedCleanup = false\n const running = new Map<string, LocalExecution>()\n const handlers = new Map<string, RunnerHandler>()\n const pools = new Map<string, RunnerWarmPool>()\n const warmReservations = new Map<string, RunnerWarmPool>()\n const standby = new Map<string, { handle: WarmContainer, pool: RunnerWarmPool, transferred: () => void }>()\n let warmAt = 0\n const poolKey = (kind: string, key: string) => `${kind}:${key}`\n\n function prewarm(claim: RunnerClaim, pool: RunnerWarmPool, current: RunnerStore, settings: RunnerConfig) {\n const abort = new AbortController()\n const environment = claim.request.environment!\n warmReservations.set(claim.id, pool)\n const done = (async () => {\n const launched = await prepareWarmContainer(settings.engine, environment, abort.signal, identity =>\n current.recordContainer(claim.id, identity))\n if (!launched.success) {\n const stopped = launched.error.code !== HaiRunnerError.CLEANUP_UNCONFIRMED.code\n await current.finish(claim.id, undefined, stopped)\n if (!stopped)\n unconfirmedCleanup = true\n return stopped\n }\n const handle = launched.data\n handle.stderr.resume()\n let transferred = false\n const released = new Promise<void>((resolve) => {\n standby.set(claim.id, {\n handle,\n pool,\n transferred: () => {\n transferred = true\n resolve()\n },\n })\n abort.signal.addEventListener('abort', () => resolve(), { once: true })\n if (abort.signal.aborted)\n resolve()\n })\n const ready = await current.markWarmReady(claim.id)\n if (ready.success && !abort.signal.aborted) {\n await Promise.race([\n released,\n handle.wait(),\n ])\n }\n standby.delete(claim.id)\n if (transferred)\n return true\n const closed = await handle.close()\n await current.finish(claim.id, undefined, closed.success)\n if (!closed.success)\n unconfirmedCleanup = true\n return closed.success\n })().catch(() => {\n unconfirmedCleanup = true\n logger.warn('Warm container cleanup could not be confirmed', { executionId: claim.id })\n return false\n }).finally(() => {\n running.delete(claim.id)\n warmReservations.delete(claim.id)\n })\n running.set(claim.id, { abort, done, renewAt: performance.now() + settings.pollMs })\n }\n\n function launch(claim: RunnerClaim, handler: RunnerHandler, current: RunnerStore, settings: RunnerConfig, holder: RunnerOwner, warmed?: WarmContainer) {\n const abort = new AbortController()\n let process: Promise<HaiResult<RunnerProcess>> | undefined\n let uncertain = false\n\n const closeProcess = async () => {\n const started = await process\n if (started?.success)\n return (await started.data.close()).success\n return warmed\n ? (await warmed.close()).success\n : !uncertain\n }\n\n async function start(options: RunnerLaunch): Promise<HaiResult<RunnerProcess>> {\n const { environment, resources } = claim.request\n if (abort.signal.aborted || process || !environment || !resources)\n return invalid()\n process = (async () => {\n const renewed = await current.renew(claim.id)\n if (!renewed.success)\n return renewed\n if (renewed.data !== 'running' || abort.signal.aborted)\n return err(HaiRunnerError.LEASE_LOST, runnerM('runner_leaseLost'))\n const started = warmed\n ? await warmed.activate(options, abort.signal, async () => {\n const lease = await current.renew(claim.id)\n return lease.success && lease.data === 'running'\n })\n : await startContainer(settings.engine, environment, resources, options, abort.signal, identity =>\n current.recordContainer(claim.id, identity))\n if (!started.success && started.error.code === HaiRunnerError.CLEANUP_UNCONFIRMED.code)\n uncertain = true\n return started\n })()\n return process\n }\n\n async function execute(): Promise<boolean> {\n const context: RunnerContext = {\n id: claim.id,\n parentId: claim.parentId,\n scope: claim.request.scope,\n owner: holder,\n signal: abort.signal,\n start,\n emit: async (value) => {\n if (abort.signal.aborted || !bounded(value))\n return invalid()\n try {\n const parsed = json.safeParse(value)\n return parsed.success\n ? await current.emit(claim.id, parsed.data)\n : invalid()\n }\n catch {\n return invalid()\n }\n },\n }\n const stop = () => {\n void closeProcess()\n }\n abort.signal.addEventListener('abort', stop, { once: true })\n let output: RunnerJson | undefined\n try {\n const lease = await current.renew(claim.id)\n if (lease.success && lease.data === 'running' && !abort.signal.aborted) {\n const value = await handler(claim.request.input, context)\n if (!bounded(value))\n throw new Error('Runner handler output exceeded its bound')\n const parsed = json.safeParse(value)\n if (parsed.success)\n output = parsed.data\n }\n }\n catch {\n logger.warn('Managed execution handler failed', { executionId: claim.id, kind: claim.kind })\n }\n finally {\n abort.signal.removeEventListener('abort', stop)\n }\n const stopped = await closeProcess()\n if (!stopped)\n unconfirmedCleanup = true\n const result = await current.finish(claim.id, output, stopped)\n if (!result.success)\n logger.warn('Managed execution final state could not be committed', { executionId: claim.id, code: result.error.code })\n return stopped\n }\n\n const done = Promise.resolve().then(execute).catch(() => {\n unconfirmedCleanup = true\n logger.warn('Managed execution failed to finish', { executionId: claim.id })\n return false\n }).finally(() => running.delete(claim.id))\n running.set(claim.id, { abort, done, renewAt: performance.now() + settings.pollMs })\n }\n\n function poll() {\n if (tick || !store || !config || !owner)\n return\n const current = store\n const settings = config\n const holder = owner\n tick = (async () => {\n await Promise.all([...running].map(async ([id, execution]) => {\n // 已取消的处理器继续续租,直到实际清理和结算结束。\n if (execution.renewAt > performance.now())\n return\n const result = await current.renew(id)\n execution.renewAt = performance.now() + (result.success && result.data === 'running'\n ? Math.min(250, settings.leaseMs / 4)\n : settings.pollMs)\n if (!result.success || result.data !== 'running')\n execution.abort.abort()\n }))\n if (!closingRequested && sweepAt <= performance.now()) {\n const maintenance = await current.sweep()\n if (!maintenance.success)\n logger.warn('Managed execution maintenance failed', { code: maintenance.error.code })\n sweepAt = performance.now() + Math.min(250, settings.leaseMs / 4)\n }\n if (closingRequested)\n return\n const kinds = [\n ...handlers.keys(),\n ]\n if (!kinds.length)\n return\n const configuredPools = [\n ...pools.values(),\n ].filter(pool => handlers.has(pool.kind))\n for (const category of ['control', 'tool', 'default'] as const) {\n const available = [...standby].filter(([, candidate]) => pools.get(poolKey(candidate.pool.kind, candidate.pool.key)) === candidate.pool).map(([id]) => id)\n const claimed = await current.claim(kinds, category, configuredPools, available)\n if (!claimed.success) {\n logger.warn('Managed execution claim failed', { code: claimed.error.code })\n continue\n }\n if (!claimed.data)\n continue\n const handler = handlers.get(claimed.data.kind)\n const warmed = claimed.data.warmId\n ? standby.get(claimed.data.warmId)\n : undefined\n warmed?.transferred()\n if (handler && !closingRequested && (!claimed.data.warmId || warmed)) {\n launch(claimed.data, handler, current, settings, holder, warmed?.handle)\n }\n else {\n const stopped = warmed\n ? (await warmed.handle.close()).success\n : !claimed.data.warmId\n await current.finish(claimed.data.id, undefined, stopped)\n }\n }\n if (!closingRequested && performance.now() >= warmAt) {\n warmAt = performance.now() + Math.max(250, settings.pollMs)\n for (const pool of configuredPools) {\n const reserved = await current.reserveWarm(pool)\n if (reserved.success && reserved.data)\n prewarm(reserved.data, pool, current, settings)\n }\n }\n })().catch(() => {\n for (const execution of running.values())\n execution.abort.abort()\n logger.warn('Managed execution polling failed')\n }).finally(() => { tick = undefined })\n }\n\n async function init(input: RunnerConfigInput): Promise<HaiResult<void>> {\n if (initializing || config || closing)\n return err(HaiRunnerError.ALREADY_INITIALIZED, runnerM('runner_alreadyInitialized'))\n const parsed = RunnerConfigSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n initializing = true\n try {\n const ready = await readyStore()\n if (!ready.success)\n return ready\n owner = {\n nodeId: parsed.data.nodeId,\n generation: randomUUID(),\n }\n config = parsed.data\n store = makeStore(config, owner)\n unconfirmedCleanup = false\n sweepAt = 0\n warmAt = 0\n if (config.executor) {\n timer = setInterval(poll, config.pollMs)\n timer.unref()\n }\n return ok(undefined)\n }\n finally {\n initializing = false\n }\n }\n\n function close(): Promise<HaiResult<void>> {\n if (closing)\n return closing\n if (initializing)\n return Promise.resolve(err(HaiRunnerError.ALREADY_INITIALIZED, runnerM('runner_alreadyInitialized')))\n if (!config)\n return Promise.resolve(ok(undefined))\n closingRequested = true\n closing = (async () => {\n await tick\n await Promise.all([...running].map(async ([id, execution]) => {\n const requested = await store?.cancelOwned(id)\n if (!requested?.success)\n unconfirmedCleanup = true\n execution.abort.abort()\n }))\n let deadline: NodeJS.Timeout | undefined\n try {\n const drained = await Promise.race([\n Promise.all([\n ...running.values(),\n ].map(execution => execution.done)).then(() => true),\n new Promise<false>((resolve) => { deadline = setTimeout(resolve, config!.closeTimeoutMs, false) }),\n ])\n if (!drained)\n return cleanupUnconfirmed()\n clearInterval(timer)\n handlers.clear()\n pools.clear()\n config = undefined\n owner = undefined\n store = undefined\n closingRequested = false\n return unconfirmedCleanup\n ? cleanupUnconfirmed()\n : ok(undefined)\n }\n finally {\n clearTimeout(deadline)\n }\n })().finally(() => { closing = undefined })\n return closing\n }\n\n return {\n init,\n close,\n get isExecutor() {\n return config?.executor === true && !closingRequested\n },\n environment(id) {\n if (!config || closingRequested)\n return inactive()\n const found = config.environments.find(item => item.id === id)\n return found\n ? ok(structuredClone(found))\n : notFound()\n },\n register(kind, handler) {\n if (!config || closingRequested)\n return inactive()\n if (!runnerKind.safeParse(kind).success || typeof handler !== 'function')\n return invalid()\n if (!config.executor)\n return ok(() => {})\n if (handlers.has(kind) || handlers.size >= 100)\n return err(HaiRunnerError.CONFLICT, runnerM('runner_conflict'))\n handlers.set(kind, handler)\n return ok(() => {\n if (handlers.get(kind) === handler)\n handlers.delete(kind)\n })\n },\n registerWarmPool(input) {\n if (!config || closingRequested)\n return inactive()\n const parsed = warmPoolSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const pool = parsed.data\n const environment = config.environments.find(item => item.id === pool.environmentId)\n if (!environment || environment.networkPolicy !== 'offline' || (config.executor && !handlers.has(pool.kind)))\n return invalid()\n const key = poolKey(pool.kind, pool.key)\n if (pools.has(key) || pools.size >= 100)\n return err(HaiRunnerError.CONFLICT, runnerM('runner_conflict'))\n pools.set(key, pool)\n return ok(() => {\n if (pools.get(key) !== pool)\n return\n pools.delete(key)\n for (const [id, candidate] of warmReservations) {\n if (candidate === pool)\n running.get(id)?.abort.abort()\n }\n })\n },\n async submit(input: RunnerSubmit) {\n if (!store || closingRequested)\n return inactive()\n if (!bounded(input))\n return invalid()\n try {\n const parsed = submitSchema.safeParse(input)\n if (!parsed.success)\n return invalid()\n const request = parsed.data\n const pool = request.concurrency && pools.get(poolKey(request.kind, request.concurrency.key))\n if (request.warmPool && (!pool || pool.environmentId !== request.environmentId\n || pool.maxRunning !== request.concurrency?.limit)) {\n return invalid()\n }\n if (pool && !request.warmPool)\n return invalid()\n return await store.submit(request, pool)\n }\n catch {\n return invalid()\n }\n },\n async find(scope, kind, key) {\n if (!store)\n return inactive()\n return validAddress(scope, '0'.repeat(64)) && runnerKind.safeParse(kind).success && typeof key === 'string' && key.length > 0 && key.length <= 200\n ? store.find(scope, kind, key)\n : invalid()\n },\n async get(scope, id) {\n if (!store)\n return inactive()\n return validAddress(scope, id)\n ? store.get(scope, id)\n : invalid()\n },\n async cancel(scope, id) {\n if (!store)\n return inactive()\n return validAddress(scope, id)\n ? store.cancel(scope, id)\n : invalid()\n },\n async reconcileUnknown(scope, id, review) {\n const current = store\n if (!current || !config?.executor || closingRequested)\n return inactive()\n if (!validAddress(scope, id) || !review || typeof review.operatorId !== 'string'\n || !runnerKind.safeParse(review.operatorId).success || typeof review.reason !== 'string'\n || !review.reason.trim() || review.reason.length > 300 || /[\\r\\n\\0]/u.test(review.reason)) {\n return invalid()\n }\n if (running.has(id))\n return cleanupUnconfirmed()\n const evidence = await current.reconciliation(scope, id)\n if (!evidence.success)\n return evidence\n const verified = await confirmContainerReleased(evidence.data.container)\n if (!verified.success)\n return verified\n if (current !== store || closingRequested)\n return inactive()\n const reconciled = await current.reconcile(scope, id, evidence.data.generation, {\n operatorId: review.operatorId,\n reason: review.reason.trim(),\n })\n if (reconciled.success)\n logger.info('Unknown execution resources reconciled', { executionId: id, operatorId: review.operatorId })\n return reconciled\n },\n async events(scope, id, after = 0, limit = 100) {\n if (!store)\n return inactive()\n return validAddress(scope, id) && Number.isSafeInteger(after) && after >= 0 && Number.isSafeInteger(limit) && limit >= 1 && limit <= 100\n ? store.events(scope, id, after, limit)\n : invalid()\n },\n }\n}\n\n/**\n * 共享执行入口;应用负责初始化数据库、启动并在关闭前等待结果。\n * @example\n * ```ts\n * import { runner } from '@h-ai/runner'\n * const status = await runner.get({ tenantId: 'team', userId: 'alice' }, '0'.repeat(64))\n * if (!status.success) throw new Error(status.error.message)\n * ```\n */\nexport const runner: RunnerFunctions = createRunner()\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h-ai/runner",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "1.0.0-beta.24",
|
|
5
|
+
"description": "Hai Framework managed execution, resource admission, and worker ownership.",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": "^22.23.4 || ^24.22.1 || ^26.12.1"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@h-ai/core": "1.0.0-beta.24",
|
|
27
|
+
"@h-ai/reldb": "1.0.0-beta.24",
|
|
28
|
+
"zod": "^4.6.7"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^26.6.6",
|
|
32
|
+
"rimraf": "^6.1.4",
|
|
33
|
+
"testcontainers": "^12.2.1",
|
|
34
|
+
"tsup": "^9.0.0",
|
|
35
|
+
"typescript": "^6.0.3",
|
|
36
|
+
"vitest": "^5.1.0"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsup",
|
|
40
|
+
"dev": "tsup --watch",
|
|
41
|
+
"test": "vitest run",
|
|
42
|
+
"test:watch": "vitest",
|
|
43
|
+
"typecheck": "node ../../scripts/typecheck.mjs --noEmit",
|
|
44
|
+
"lint": "eslint .",
|
|
45
|
+
"lint:fix": "eslint . --fix",
|
|
46
|
+
"clean": "rimraf dist .turbo",
|
|
47
|
+
"build:clean": "rimraf dist"
|
|
48
|
+
}
|
|
6
49
|
}
|