commit 7cd664af3aabac40a49cf4e58df0911b7e41bd8e Author: JCAI Main Agent Date: Mon Jul 27 00:18:58 2026 +0800 M0: 工作区骨架 + 五道门禁 + 环境自举 - pnpm workspaces / tsconfig 双工程(node · web)/ 路径别名(§11.1) - eslint flat(§11.3 + §12.5 可机检项)/ dependency-cruiser 基线八条 + JCAI 增补(§11.4) - tools/module-tiers.json + gen-depcruise-tiers.ts 生成 tier-order 逐层规则 - tools/api-report.mjs 契约快照只留契约面(ADR-005) - docker-compose(PG16)+ db/init 四 schema;种子数据五岗位五员工冻结为常量 - docs/debt.md · docs/adr/ADR-005 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m diff --git a/.dependency-cruiser.cjs b/.dependency-cruiser.cjs new file mode 100644 index 0000000..2f45fc1 --- /dev/null +++ b/.dependency-cruiser.cjs @@ -0,0 +1,196 @@ +/* eslint-disable */ +/** + * JCAI 依赖门禁 —— 编码规范 §11.4。 + * + * 结构:基线八条(no-circular / no-cross-module-internal / app-not-into-internal / + * domain-is-pure / usecase-not-to-adapter / web-not-to-api / packages-are-leaves / + * no-orphans)+ JCAI 增补四条(framework-only-in-adapter / tier-order / + * activities-isolated / apps-not-into-activities)。 + * + * tier-order 的逐层展开由 tools/gen-depcruise-tiers.ts 从 tools/module-tiers.json 生成。 + * **约束报错时,改代码,不改约束(§11)。** + */ +const tierRules = require('./tools/depcruise-tiers.generated.cjs'); + +const MODULES = '^apps/api/src/modules'; + +/** domain 层的 npm 白名单(§5.3):zod / decimal.js / date-fns + 仓内纯包 */ +const DOMAIN_NPM_ALLOWLIST = 'node_modules/(zod|decimal\\.js|date-fns)(/|$)'; + +module.exports = { + forbidden: [ + // ── 基线八条 ──────────────────────────────────────────────────────────── + { + name: 'no-circular', + comment: '依赖方向单向无环(§0.1 第 3 条)', + severity: 'error', + from: {}, + to: { circular: true }, + }, + { + name: 'no-cross-module-internal', + comment: '任何文件不得 import modules/*/internal/**(同模块自己除外,§5.2)', + severity: 'error', + from: { pathNot: `${MODULES}/([^/]+)/` }, + to: { path: `${MODULES}/([^/]+)/internal/` }, + }, + { + name: 'no-cross-module-internal-peer', + comment: '模块之间只准 import 到对方的 index.ts,不得穿透 internal(§5.2)', + severity: 'error', + from: { path: `${MODULES}/([^/]+)/` }, + to: { + path: `${MODULES}/([^/]+)/internal/`, + pathNot: `${MODULES}/$1/internal/`, + }, + }, + { + name: 'app-not-into-internal', + comment: 'app/ 是组装层,只经模块出口认识模块(§5.2)', + severity: 'error', + from: { path: '^apps/(api|web)/src/app/' }, + to: { path: `${MODULES}/([^/]+)/internal/` }, + }, + { + name: 'domain-is-pure', + comment: + 'domain/ 零 IO、零框架:npm 只准 zod / decimal.js / date-fns,仓内只准 @contracts / @sfeel / @utils(§5.3)', + severity: 'error', + from: { path: `${MODULES}/([^/]+)/internal/domain/` }, + to: { + path: 'node_modules', + pathNot: DOMAIN_NPM_ALLOWLIST, + }, + }, + { + name: 'domain-is-pure-core', + comment: 'domain/ 不得触 Node 核心能力(fs / http / crypto / child_process …,§5.3)', + severity: 'error', + from: { path: `${MODULES}/([^/]+)/internal/domain/` }, + to: { dependencyTypes: ['core'] }, + }, + { + name: 'usecase-not-to-adapter', + comment: 'usecase/ 依赖 port.ts 声明的能力,不 import 任何 adapter(§5.3)', + severity: 'error', + from: { path: `${MODULES}/([^/]+)/internal/usecase/` }, + to: { path: `${MODULES}/([^/]+)/internal/adapter/` }, + }, + { + name: 'web-not-to-api', + comment: '前后端互不 import,跨端唯一通道是 @contracts(§5.1)', + severity: 'error', + from: { path: '^apps/web/' }, + to: { path: '^apps/api/' }, + }, + { + name: 'api-not-to-web', + comment: '前后端互不 import(§5.1)', + severity: 'error', + from: { path: '^apps/api/' }, + to: { path: '^apps/web/' }, + }, + { + name: 'packages-are-leaves', + comment: 'packages/* 不得反向 import apps/*(§5.1)', + severity: 'error', + from: { path: '^packages/' }, + to: { path: '^apps/' }, + }, + { + name: 'utils-is-leaf', + comment: 'packages/utils 是叶子,不依赖任何仓内包(§5.1)', + severity: 'error', + from: { path: '^packages/utils/' }, + to: { path: '^(apps|activities|packages/(?!utils))' }, + }, + { + name: 'no-orphans', + comment: + '无孤儿模块;契约面(index/contract/port)、入口与配置是合法的无入边文件,不计孤儿', + severity: 'error', + from: { + orphan: true, + pathNot: [ + '(^|/)(index|contract|port)\\.ts$', + '^apps/(api|web)/src/app/', + '^activities/', + '^tools/', + '\\.d\\.ts$', + '\\.(config|setup)\\.(js|cjs|mjs|ts)$', + '(^|/)__tests__/', + '\\.test\\.ts$', + ], + }, + to: {}, + }, + + // ── JCAI 增补 ────────────────────────────────────────────────────────── + { + name: 'framework-only-in-adapter', + comment: 'Mastra / AI SDK / Drizzle / pg / pg-boss / Hono 只准在 adapter 与 app(§6.2)', + severity: 'error', + from: { path: `${MODULES}/([^/]+)/internal/(domain|usecase)/` }, + to: { + path: 'node_modules/(@mastra|ai|@ai-sdk|drizzle-orm|drizzle-kit|pg|pg-boss|hono|@hono)(/|$)', + }, + }, + { + name: 'contracts-is-pure', + comment: '@contracts 只有 zod schema / 常量 / 类型,零实现、零框架(§8.1)', + severity: 'error', + from: { path: '^packages/contracts/' }, + to: { + path: 'node_modules', + pathNot: 'node_modules/zod(/|$)', + }, + }, + { + name: 'sfeel-is-pure', + comment: '@sfeel 是纯函数包,零 IO 零框架(§8.3)', + severity: 'error', + from: { path: '^packages/sfeel/' }, + to: { dependencyTypes: ['core'] }, + }, + { + name: 'activities-isolated', + comment: 'activities/* 只准 import @sdk / @contracts 与白名单纯库,不得 import apps/**(ADR-004)', + severity: 'error', + from: { path: '^activities/' }, + to: { path: '^apps/' }, + }, + { + name: 'apps-not-into-activities', + comment: '活动经安装装载,api 侧任何文件不得静态 import activities/**(§2.1 / ADR-004)', + severity: 'error', + from: { path: '^apps/' }, + to: { path: '^activities/' }, + }, + { + name: 'activity-no-environment-capability', + comment: '活动包零环境能力:不得触 node 核心模块(AM 12.1 无越权代码)', + severity: 'error', + from: { path: '^activities/' }, + to: { dependencyTypes: ['core'] }, + }, + ...tierRules, + ], + + options: { + doNotFollow: { path: 'node_modules' }, + exclude: { + path: ['(^|/)dist/', '(^|/)node_modules/', '(^|/)api-report/', '\\.d\\.ts$'], + }, + tsPreCompilationDeps: true, + tsConfig: { fileName: 'tsconfig.base.json' }, + enhancedResolveOptions: { + exportsFields: ['exports'], + conditionNames: ['import', 'require', 'node', 'default', 'types'], + extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'], + mainFields: ['module', 'main', 'types'], + }, + reporterOptions: { + text: { highlightFocused: true }, + }, + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..77e2b73 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +node_modules/ +dist/ +.api-tmp/ +*.tsbuildinfo +.DS_Store +.env +.env.local +coverage/ +.vite/ diff --git a/api-report/packages/activity-sdk/src/index.d.ts b/api-report/packages/activity-sdk/src/index.d.ts new file mode 100644 index 0000000..418b91d --- /dev/null +++ b/api-report/packages/activity-sdk/src/index.d.ts @@ -0,0 +1,5 @@ +/** + * @sdk —— 活动开发面(编码规范 §8.2):基座六件接口 + defineActivity() + 本地开发宿主 + 回放夹具。 + * 活动包 ABI 见 ADR-004。 + */ +export declare const SDK_VERSION = "0.0.0-m0"; diff --git a/api-report/packages/contracts/src/index.d.ts b/api-report/packages/contracts/src/index.d.ts new file mode 100644 index 0000000..8b7846c --- /dev/null +++ b/api-report/packages/contracts/src/index.d.ts @@ -0,0 +1,6 @@ +/** + * @contracts —— 前后端唯一共享点(编码规范 §8.1)。 + * 只有 zod schema、常量、品牌类型与推导类型,零实现。 + * 修改本包任何导出 = 契约变更(§12.4)。 + */ +export declare const CONTRACTS_VERSION = "0.0.0-m0"; diff --git a/api-report/packages/sfeel/src/index.d.ts b/api-report/packages/sfeel/src/index.d.ts new file mode 100644 index 0000000..4f6af0a --- /dev/null +++ b/api-report/packages/sfeel/src/index.d.ts @@ -0,0 +1,5 @@ +/** + * @sfeel —— S-FEEL 子集(OS 03 定义域)的解析与求值,纯函数(编码规范 §8.3)。 + * 被 process / flow-engine / trigger 与前端 gov-process 共用:求值语义一份代码,前后端同源。 + */ +export declare const SFEEL_VERSION = "0.0.0-m0"; diff --git a/api-report/packages/utils/src/index.d.ts b/api-report/packages/utils/src/index.d.ts new file mode 100644 index 0000000..e838780 --- /dev/null +++ b/api-report/packages/utils/src/index.d.ts @@ -0,0 +1,12 @@ +/** + * @utils —— 纯函数,零依赖(编码规范 §2 / §5.1:叶子包)。 + * 无业务语义;有业务语义的东西不属于这里。 + */ +/** 穷尽性检查:switch 漏分支时编译期报错 */ +export declare function assertNever(value: never, message?: string): never; +/** 类型守卫:滤掉 null / undefined */ +export declare function isDefined(value: T | null | undefined): value is T; +/** 按键分组 */ +export declare function groupBy(items: readonly T[], key: (item: T) => K): Record; +/** 稳定排序的键值对遍历(避免 Object.keys 顺序依赖) */ +export declare function sortedEntries(record: Readonly>): Array<[string, V]>; diff --git a/apps/api/package.json b/apps/api/package.json new file mode 100644 index 0000000..e4d2496 --- /dev/null +++ b/apps/api/package.json @@ -0,0 +1,12 @@ +{ + "name": "@app/api", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { ".": "./src/app/main.ts" }, + "scripts": { + "dev": "tsup --watch --onSuccess \"node dist/main.js\"", + "build": "tsup", + "seed": "node dist/seed.js" + } +} diff --git a/apps/api/src/app/config.ts b/apps/api/src/app/config.ts new file mode 100644 index 0000000..89f7613 --- /dev/null +++ b/apps/api/src/app/config.ts @@ -0,0 +1,19 @@ +/** + * 环境配置 —— 只在 app/ 层读环境变量;模块内一律经 port 注入(§5.3)。 + */ +export type AppConfig = { + readonly nodeEnv: 'development' | 'test' | 'production'; + readonly port: number; + readonly databaseUrl: string; +}; + +const DEFAULT_DATABASE_URL = 'postgres://jcai:jcai@localhost:54329/jcai'; + +export function loadConfig(env: NodeJS.ProcessEnv = process.env): AppConfig { + const nodeEnv = env['NODE_ENV']; + return { + nodeEnv: nodeEnv === 'production' || nodeEnv === 'test' ? nodeEnv : 'development', + port: Number(env['PORT'] ?? 8787), + databaseUrl: env['DATABASE_URL'] ?? DEFAULT_DATABASE_URL, + }; +} diff --git a/apps/api/src/app/main.ts b/apps/api/src/app/main.ts new file mode 100644 index 0000000..f3aee28 --- /dev/null +++ b/apps/api/src/app/main.ts @@ -0,0 +1,18 @@ +/** + * apps/api 唯一组装层入口(编码规范 §5.2)。 + * 只有 app/ 能同时认识多个模块:new adapter、注入 port、注册路由 / worker / Mastra 实例。 + * + * M0:骨架 —— 门禁跑通即可,业务装配自 M1 起逐层填入。 + */ +import { loadConfig } from './config.ts'; + +export async function boot(): Promise { + const config = loadConfig(); + process.stdout.write( + `JCAI api · M0 骨架 · env=${config.nodeEnv} · port=${config.port} · db=${config.databaseUrl.replace(/:[^:@]*@/, ':***@')}\n`, + ); +} + +if (import.meta.url === `file://${process.argv[1]}`) { + await boot(); +} diff --git a/apps/api/src/app/seed.ts b/apps/api/src/app/seed.ts new file mode 100644 index 0000000..9235c28 --- /dev/null +++ b/apps/api/src/app/seed.ts @@ -0,0 +1,49 @@ +/** + * 种子数据与播种入口(编码规范 §15 · M0)。 + * + * 数据是常量、写入是端口 —— M0 立骨架:数据在此冻结,写入实现随 M1 的 `org` 模块落地。 + * 部署边界:单次部署 ≤50 人、单组织、不做多租户(OS 0.3)。 + */ + +/** 岗位:编排层声明岗位,起单时按四策略解析出人(OS 03) */ +export const POSITION_SEED = [ + { code: 'PM', name: '项目经理', note: '定价审批、策略拍板' }, + { code: 'BD', name: '商务', note: 'RFQ 受理、成本定价、报价议价、情报归档' }, + { code: 'FAE', name: '现场应用', note: '替代选型' }, + { code: 'PRM', name: '采购/寻源', note: '渠道寻源' }, + { code: 'OP', name: '运营', note: '运营支持' }, +] as const; + +/** 员工五人;登录者 = 冯兵(BD) */ +export const STAFF_SEED = [ + { account: 'dingziqiao', name: '丁子乔', position: 'PM' }, + { account: 'fengbing', name: '冯兵', position: 'BD' }, + { account: 'wangziming', name: '王梓名', position: 'FAE' }, + { account: 'linpeixuan', name: '林佩萱', position: 'PRM' }, + { account: 'liyuanchu', name: '李元初', position: 'OP' }, +] as const; + +/** 默认登录者(MVP 单组织 cookie session,§4 鉴权定调) */ +export const DEFAULT_LOGIN_ACCOUNT = 'fengbing'; + +export type PositionSeed = (typeof POSITION_SEED)[number]; +export type StaffSeed = (typeof STAFF_SEED)[number]; + +/** 播种端口 —— 实现由 app/ 在 M1 注入(org 模块出口) */ +export type OrgSeeder = { + upsertPosition(position: PositionSeed): Promise; + upsertStaff(staff: StaffSeed): Promise; +}; + +export async function runSeed(seeder: OrgSeeder): Promise { + for (const position of POSITION_SEED) await seeder.upsertPosition(position); + for (const staff of STAFF_SEED) await seeder.upsertStaff(staff); +} + +if (import.meta.url === `file://${process.argv[1]}`) { + process.stdout.write( + `种子数据:${POSITION_SEED.length} 个岗位 / ${STAFF_SEED.length} 名员工;` + + `登录者=${DEFAULT_LOGIN_ACCOUNT}\n` + + '写入实现随 M1 `org` 模块落地(docs/debt.md · M0-1)。\n', + ); +} diff --git a/apps/api/tsup.config.ts b/apps/api/tsup.config.ts new file mode 100644 index 0000000..1071f38 --- /dev/null +++ b/apps/api/tsup.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: { main: 'src/app/main.ts', seed: 'src/app/seed.ts' }, + format: ['esm'], + target: 'node22', + platform: 'node', + outDir: 'dist', + clean: true, + sourcemap: true, + skipNodeModulesBundle: true, + tsconfig: '../../tsconfig.node.json', +}); diff --git a/apps/web/index.html b/apps/web/index.html new file mode 100644 index 0000000..32b7ff1 --- /dev/null +++ b/apps/web/index.html @@ -0,0 +1,12 @@ + + + + + + JCAI · 任务操作系统 + + +
+ + + diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..64b92c2 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,21 @@ +{ + "name": "@app/web", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.0", + "react-dom": "^19.2.0" + }, + "devDependencies": { + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.1", + "@vitejs/plugin-react": "^5.0.4", + "vite": "^7.1.12" + } +} diff --git a/apps/web/src/app/app-shell.tsx b/apps/web/src/app/app-shell.tsx new file mode 100644 index 0000000..9f3b327 --- /dev/null +++ b/apps/web/src/app/app-shell.tsx @@ -0,0 +1,10 @@ +/** + * 应用壳 —— M0 骨架。工作台五要素 / 治理台九功能的 features 自 M6 起挂入。 + */ +export function AppShell() { + return ( +
+
JCAI · 任务操作系统 —— M0 骨架
+
+ ); +} diff --git a/apps/web/src/app/main.tsx b/apps/web/src/app/main.tsx new file mode 100644 index 0000000..b0a999d --- /dev/null +++ b/apps/web/src/app/main.tsx @@ -0,0 +1,16 @@ +/** + * apps/web 唯一组装层(编码规范 §9):路由、Provider、鉴权壳、SSE 连接。 + * M0:骨架 —— 两台原型的 1:1 平移自 M6 起(README《前端 UI · 原型 1:1 平移》)。 + */ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { AppShell } from './app-shell.tsx'; + +const container = document.getElementById('root'); +if (!container) throw new Error('#root 缺失'); + +createRoot(container).render( + + + , +); diff --git a/apps/web/src/vite-env.d.ts b/apps/web/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/apps/web/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts new file mode 100644 index 0000000..fcb3673 --- /dev/null +++ b/apps/web/vite.config.ts @@ -0,0 +1,26 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import { fileURLToPath } from 'node:url'; + +const root = fileURLToPath(new URL('../..', import.meta.url)); +const p = (rel: string) => fileURLToPath(new URL(rel, import.meta.url)); + +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@contracts': `${root}packages/contracts/src/index.ts`, + '@sfeel': `${root}packages/sfeel/src/index.ts`, + '@ui': `${root}packages/ui-kit/src/index.ts`, + '@utils': `${root}packages/utils/src/index.ts`, + '@features': p('./src/features'), + '@web-shared': p('./src/shared'), + }, + }, + server: { + port: 5173, + proxy: { + '/api': { target: 'http://localhost:8787', changeOrigin: true }, + }, + }, +}); diff --git a/db/init/001-schemas.sql b/db/init/001-schemas.sql new file mode 100644 index 0000000..70873a2 --- /dev/null +++ b/db/init/001-schemas.sql @@ -0,0 +1,17 @@ +-- 编码规范 §7:单 PostgreSQL 实例,四个 schema,各自单写者。 +-- sys 系统自持 —— 各模块 adapter 经 Drizzle 写,drizzle-kit 迁移 +-- ledger 活动自生长 —— 仅 ledger adapter 写(动态 DDL/DML,raw pg) +-- mastra Mastra 存储 —— 仅 Mastra(@mastra/pg)写,自管迁移 +-- queue pg-boss —— 仅 pg-boss 写,自管迁移 + +CREATE SCHEMA IF NOT EXISTS sys; +CREATE SCHEMA IF NOT EXISTS ledger; +CREATE SCHEMA IF NOT EXISTS mastra; +CREATE SCHEMA IF NOT EXISTS queue; + +CREATE EXTENSION IF NOT EXISTS pgcrypto; + +COMMENT ON SCHEMA sys IS 'JCAI 系统自持:主数据/事件存储/记忆/活动库/流程包/触发器/运行时实例'; +COMMENT ON SCHEMA ledger IS 'JCAI 台账自生长:正式版 + 任务级草稿层 + 共享域'; +COMMENT ON SCHEMA mastra IS 'Mastra 单写:线程/消息/workflow 快照'; +COMMENT ON SCHEMA queue IS 'pg-boss 单写:作业与定时'; diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3dd967c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,24 @@ +services: + db: + image: postgres:16-alpine + container_name: jcai-pg + restart: unless-stopped + environment: + POSTGRES_USER: jcai + POSTGRES_PASSWORD: jcai + POSTGRES_DB: jcai + # pgcrypto / uuid 由 init 脚本按需启用 + TZ: Asia/Shanghai + ports: + - '54329:5432' + volumes: + - jcai-pgdata:/var/lib/postgresql/data + - ./db/init:/docker-entrypoint-initdb.d:ro + healthcheck: + test: ['CMD-SHELL', 'pg_isready -U jcai -d jcai'] + interval: 5s + timeout: 3s + retries: 20 + +volumes: + jcai-pgdata: diff --git a/docs/MVP示例工作流.html b/docs/MVP示例工作流.html new file mode 100644 index 0000000..9656cee --- /dev/null +++ b/docs/MVP示例工作流.html @@ -0,0 +1,1157 @@ + + + + + + +业务流程 · 统一报价 · 芯片业务 + + + +
+ +
+

业务流程 · 统一报价

+
+

会话「芯片业务」沉淀的业务流程「统一报价」单章报告:流程描述 · 流程图 · 动态数据 · 静态底座 · 规则 · 活动(SOP 节点 = 任务定义卡 · 作业指导书;Case 节点 = 案例·定义卡 · CMMN 案例图 · 案例说明书)。

+

EXPORTED 2026/7/26 19:46:36 · 1 条流程 · 5 个下钻节点 · 47 张单据 · MIND-TINKER

+ +
+ + +
+

§1统一报价

+
+
流程 · 描述
+ +
+
+
+
负责人
BD·商务
+
描述
统一报价流程覆盖客户 RFQ/BOM 受理到报价发出与闭环归档
+
+
触发器
客户RFQ询价
+
+
+
流程图 · 顺序
+
+
FIG. 1 — 统一报价流程从收到报价请求到发出标准报价书
+ TYPE-A通过成交TYPE-BTYPE-C不通过有异议拒绝/超时下钻小节:A1 · RFQ需求分析RFQ需求分析A1BD+下钻小节:A4 · 成本定价成本定价A4BD下钻小节:A5 · 定价审批定价审批A5PM×下钻小节:A6 · 报价议价报价议价A6BD×下钻小节:A3 · 渠道寻源渠道寻源A3PRM下钻小节:A2 · 替代选型替代选型A2FAE退回调整→A4下钻小节:A7 · 情报归档情报归档A7BD返回调整→A4客户RFQ询价料号分流审批结果议价结果转订单履约归档闭环 +
+
+ 图例 起始 结束 SOP 活动 Case 活动 判断网关 并行网关 卡点 顺序流 + | + 责任右上角标 责任人 +
+ +
动态数据 · 流转属流程的流转单据;位置签 输入/过程/输出,按此序排
+
+
+
RFQ/BOM文件输入
+

客户询价需求载体

+
+
载体数据表格
+
+
+ 字段 · 7 +
PN数量/EAU厂牌AnalogAEC认证目标价交期
+
+ +
+
+
统一受理记录过程
+

归一后的逐条需求台账

+
+
载体数据表格
+
+
+ 字段 · 7 +
客户码PN厂牌EAUType标目标价状态
+
+ +
+
+
料号分类表过程
+

A2 逐条分级的结果与依据

+
+
载体数据表格
+
+
+ 字段 · 5 +
PNType标分级依据历史价命中复核结论
+
+ +
+
+
供应商底价表过程
+

寻源汇总的底价与MOQ

+
+
载体数据表格
+
+
+ 字段 · 5 +
PN供应商底价MOQ交期
+
+ +
+
+
替代对标表过程
+

替代推荐报告·同芯片2页

+
+
载体PDF文件
+
+
+ 字段 · 7 +
原型号候选型号替代等级参数差异项差异风险改动评估验证建议
+
+ +
+
+
寻源比价表过程
+

多渠道横比定底表

+
+
载体数据表格
+
+
+ 字段 · 8 +
PN供应商报价MOQ交期渠道等级成色结论
+
+ +
+
+
报价草案过程
+

逐条定价的待审报价

+
+
载体数据表格
+
+
+ 字段 · 4 +
PN拟报单价毛利率偏离度
+
+ +
+
+
定价审批表过程
+

定价审批记录

+
+
载体审批流
+
+
+ 字段 · 4 +
报价单号批复审批人时间
+
+ +
+
+
正式报价单输出
+

对外发出的标准报价

+
+
载体PDF文件
+
+
+ 字段 · 7 +
PN单价CNY交期SPQMOQ贸易条款有效期
+
+ +
+
+
D+3/D+7跟进提醒输出
+

发出后的跟进任务

+
+
载体数据表格
+
+
+ 字段 · 5 +
客户报价单号D+3D+7回复状态
+
+ +
+
+
询价请求输出
+

委托PR寻源询价的请求单

+
+
载体数据表格
+
+
+ 字段 · 8 +
PNBrandERA项目阶段接受替代单机用量TP场景
+
+ +
+
+
替代评估请求输出
+

技术选型需求立案单

+
+
载体数据表格
+
+
+ 字段 · 5 +
初选物料芯片类型参数规格应用场景需求人
+
+ +
+
+
报价落地率统计输出
+

月度落地率与KPI分析

+
+
载体数据表格
+
+
+ 字段 · 4 +
落地率TypeA命中D+3回复率退回率
+
+ +
+ +
静态底座 · 引用本流程查/依赖的全局静态库表——维护在数据底座页
+
+
+
历史价格情报外部情报
+

历次报价与成交价情报

+
+
载体数据表格
+
来源内部沉淀
+
维护随单归档
+
+
+ 字段 · 7 +
PN厂牌单价CNY交期MOQ报价日期有效期
+
+ +
+
+
客户资料库主数据
+

客户等级与画像档案

+
+
载体数据表格
+
来源内部沉淀
+
维护随交易更新
+
+
+ 字段 · 7 +
客户码客户等级画像标签付款条款行业属性风险等级年采购额
+
+ +
+
+
供应商渠道目录主数据
+

原厂/代理/现货渠道册

+
+
载体—
+
来源内部沉淀
+
维护随合作更新
+
+
+ 字段 · 4 +
供应商渠道类型品牌线联系人
+
+ +
+
+
呆滞库存表事实台账
+

自有呆滞与现货库存

+
+
载体—
+
来源内部系统
+
维护实时
+
+
+ 字段 · 4 +
PN库存量库龄成本价
+
+ +
+
+
芯片规格书主数据
+

原厂官网一手规格书

+
+
载体PDF文件
+
来源原厂官网
+
维护随原厂发布
+
+
+ 字段 · 4 +
PN关键参数封装版本日期
+
+ +
+
+
公网选型库外部情报
+

AI与聚合平台初筛线索源

+
+
载体数据表格
+
来源外部公网
+
维护实时
+
+
+ 字段 · 5 +
替代关系参数对比规格书生命周期价格参考
+
+ +
+
规则 · 约束照着判的规则制度——判定表+经验在卡上
+
+
+
询价受理规范
+

受理与完整度检查规范

+
+
载体—
+
来源内部制度
+
维护年度评审
+
+
+ 字段 · 0 +
未登记字段
+
+
F受理字段完整度处置
1八字段齐受理转寻源
2缺PN/数量/交期退回补全
3缺次要字段受理并追问
经验

老客户口头急单可先受理后补单,但当天必须把字段补齐留痕;新客户一律字段齐才受理。

+
+
+
三分类规则P-03
+

TypeA/B/C判别标准

+
+
载体—
+
来源内部制度
+
维护季度评审
+
+
+ 字段 · 3 +
A:≤90天行情稳B:过期/波动C:EOL/替代
+
+
U物料状况类别打法
1历史价≤90天且行情稳A直接快答
2无历史/过期/波动B重估后报
3EOL/缺货/要替代C转案处理
+
+
+
利润模型P-01
+

品牌×类型×等级×量

+
+
载体—
+
来源内部制度
+
维护季度调优
+
+
+ 字段 · 0 +
未登记字段
+
+
F客户等级物料类型数量档目标毛利
1战略客户A类标准件大批量8%–10%
2普通客户A类标准件-12%–15%
3-B类波动件-15%–20%
4-C类替代/EOL-≥20%或一事一议
经验

四维定档只是起点:品牌溢价高的原厂料按下限走量,冷门料按上限试探;新客户首单宁可让毛利换成交,老客户返单守住等级价不轻降;拿不准的组合报 PM 定档。

+
+
+
底价门禁P-02
+

偏离底价±20%即止

+
+
载体—
+
来源内部制度
+
维护年度评审
+
+
+ 字段 · 0 +
未登记字段
+
+
F拟报价vs底价处置
1≥底价直接放行
2低于底价≤20%PM附理由放行
3低于底价>20%拦截·BOSS拍板
经验

底价超一周未更新先刷底价再判;行情剧烈波动日,低于底价的单先口头知会 PM 再走流程。

+
+
+
报价有效期P-04
+

报价默认7日历天有效

+
+
载体—
+
来源内部制度
+
维护年度评审
+
+
+ 字段 · 0 +
未登记字段
+
+
F报价情形有效期
1行情波动件3天并注明
2框架协议客户按合同约定
3-7日历天
+
+ + +
活动 · 节点(SOP / Case)
+ +
+ 1.1统一报价-A1 · RFQ需求分析 +
+
任务定义卡
+
+
统一报价 A1 · RFQ需求分析
+
执行
BD·商务
触发
收到客户RFQ/BOM文件(邮件、Excel、PDF)
目标
归一成 统一受理记录 并逐条打 A/B/C 标,B类出 询价请求、C类出 替代评估请求,定 直通/寻源/选型 车道
+
+
作业指导书
+
+
+
步骤流程 — RFQ需求分析RFQ需求分析
+ 不完整TYPE-A完整TYPE-BTYPE-C接收登记S1×追问补全信息S2逐条解析归一S3查历史价S4逐条打标S5分流复核与派单S6+接流程起点D1 · 判断完整度G2 · 料号分流下接 A4·成本定价转 A3·渠道寻源转 A2·替代选型 +
+
+

谁做、何时做:BD 受理<15分钟、打标<45分钟。真实 RFQ 五花八门(俄文BOM/内部码/字段常缺)——先归一成台账化的 统一受理记录,再逐条打标定车道:A 直通定价、B 出 询价请求 走寻源、C 出 替代评估请求 走选型;打错标快单变慢单。

+
● 接流程起点
+
  1. S1接收登记从邮件/IM 收取 RFQ/BOM文件,在 CRM 建 统一受理记录(状态:已受理);输入:RFQ/BOM文件;完成标准:客户与来源可追溯、原件已存档。
  2. D1判断完整度依 询价受理规范:PN+EAU+交期三要素齐全才放行;缺关键字段走追问补全
    ↳ 完整 → S3 逐条解析归一
    ↳ 不完整 → S2 追问补全信息
  3. S2追问补全信息按 缺口清单 向客户/BD 追问补全 PN/EAU/交期/厂牌等关键字段;补齐后进入逐条解析。
  4. S3逐条解析归一按 询价受理规范 拆解文件,逐条抄录 PN/数量/EAU/厂牌/目标价/交期进 统一受理记录。
  5. S4查历史价逐条查 历史价格情报:该PN有无 ≤90 天的报价/成交记录、行情是否平稳;输入:统一受理记录。
  6. S5逐条打标依 三分类规则P-03——A:历史价≤90天且行情稳;B:无历史/过期/波动;C:EOL/缺货/要求替代。逐条写 料号分类表,回写 统一受理记录(状态:打标)。
  7. S6分流复核与派单A类核实命中率>30%且行情稳;B类逐条生成 询价请求(含PN/数量/交期/目标价)传 A3·渠道寻源;C类逐条生成 替代评估请求(含原PN/替代要求)传 A2·替代选型;吃不准降B不许臆断A。
  8. G2料号分流并行 + · 出口固定依三分类规则P-03分流:A 历史价≤90天且行情稳→直通定价;B 无历史/过期/波动→寻源;C EOL/缺货/要求替代→选型
    ↳ TYPE-A → 转 A4·成本定价
    ↳ TYPE-B → 转 A3·渠道寻源
    ↳ TYPE-C → 转 A2·替代选型
+ +
+
留痕 · SLA留痕:统一受理记录(打标)、料号分类表、询价请求(B类)、替代评估请求(C类);系统:CRM/多维表格;SLA:受理<15min、打标<45min。
+
+
+ 1.2统一报价-A4 · 成本定价 +
+
任务定义卡
+
+
统一报价 A4 · 成本定价
+
执行
BD·商务
触发
供应商底价表 就绪(或 Type A 直通)
目标
逐条定价形成 报价草案,先过底价门禁再提审
+
+
作业指导书
+
+
+
步骤流程 — 成本定价成本定价
+ 取价基准S1逐条定价S2底价自检S3上接 A3·渠道寻源下接 A5·定价审批 +
+
+

谁做、何时做:BD 逐条定价:价格 = 底价 × 利润模型。提交审批前先自查底价门禁——超限的自己先调,不把问题留给 PM。

+
● 上接 A3·渠道寻源
+
  1. S1取价基准Type A 直接取 历史价格情报 的近期价;B/C 取 供应商底价表(C 类参考 替代对标表 的建议方案)。
  2. S2逐条定价依据 利润模型P-01(品牌×类型×客户等级×订单量;客户等级查 客户资料库)算目标价,逐条写入 报价草案(拟报单价/毛利率/偏离度)。
  3. S3底价自检依据 底价门禁P-02:偏离底价 ≤±20% 才提交;超限条目回调或注明理由;完成标准:报价草案 全条目带偏离度。
+
◎ 下接 A5·定价审批
+
+
留痕 · SLA留痕:报价草案;系统:多维表格;SLA <2h,底价校验通过目标 >85%。
+
+
+ 1.3统一报价-A5 · 定价审批 +
+
任务定义卡
+
+
统一报价 A5 · 定价审批
+
执行
PM·项目经理
触发
报价草案 提交审批
目标
定价策略拍板 + 终审放行,守住盈利底线
+
+
作业指导书
+
+
+
步骤流程 — 定价审批定价审批
+ 通过不通过策略决策S1终审放行S2×上接 A4·成本定价G3 · 审批结果下接 A6·报价议价退回调整→A4 +
+
+

谁做、何时做:PM 每单投入不超过 30 分钟:先定策略(S3),再终审(S5)。策略 C(战略性抢单)必须写明前提与止损线,不留口头约定。

+
● 上接 A4·成本定价
+
  1. S1策略决策依据 利润模型P-01 选定价策略:A 标准毛利 / B 竞争性 / C 战略性——选 C 必须在 报价草案 注明前提与止损线。
  2. S2终审放行核 报价草案 的偏离度与大额条目:批准→报价草案(已批准);驳回→退回 A4 调整并注明原因(G3 底价门禁命中即止)。
  3. G3审批结果判断 × · 出口固定报价偏离底价≤±20%?(底价门禁P-02)通过→A6报价议价;超限退回A5调整,命中即止(底价校验通过>85%,审批通过>90%)
    ↳ 通过 → 转 A6·报价议价
    ↳ 不通过 → 退回调整→A4
+ +
+
留痕 · SLA留痕:报价草案(已批准,含策略与批注);SLA 每单<30min,审批通过目标 >90%。
+
+
+ 1.4统一报价-A6 · 报价议价 +
+
任务定义卡
+
+
统一报价 A6 · 报价议价
+
执行
BD·商务
触发
报价草案(已批准)
目标
发出 正式报价单,同步留档并建立跟进
+
+
作业指导书
+
+
+
步骤流程 — 报价议价报价议价
+ 成交有异议拒绝/超时生成发出S1CRM留档S2建立跟进S3×上接 A5·定价审批G4 · 议价结果转订单履约返回调整→A4转 A7·情报归档 +
+
+

谁做、何时做:BD 在审批通过后 15 分钟内发出报价并留档。发出的同时必须建立 D+3/D+7 跟进——没有跟进的报价等于没报。

+
● 上接 A5·定价审批
+
  1. S1生成发出把 报价草案(已批准) 排版为 正式报价单(PDF·中英双语:单价CNY/交期/SPQ/MOQ/贸易条款);依据 报价有效期P-04 注明 7 日历天有效。
  2. S2CRM留档逐条录入 CRM,回写 历史价格情报(报价日期/单价/交期/MOQ/备注)——这是下次 Type A 直通的资本。
  3. S3建立跟进设 D+3/D+7跟进提醒;客户议价在授权范围内回旋,超出授权回 A5 重批,不私自破线。
  4. G4议价结果判断 × · 出口固定客户是否接受报价?成交→转订单履约(ORM);拒绝/无回复→情报库归档闭环(D+3/D+7跟进,落地率目标>25%,7天闭环)
    ↳ 成交 → 转订单履约
    ↳ 有异议 → 返回调整→A4
    ↳ 拒绝/超时 → 转 A7·情报归档
+ +
+
留痕 · SLA留痕:正式报价单、历史价格情报(记录)、D+3/D+7跟进提醒;系统:CRM;SLA <15min。
+
+
+ 1.5统一报价-A3 · 渠道寻源CASE +
+ +
案例 · 定义卡
+
+
统一报价 A3 · 渠道寻源
+
执行
PRM·采购
触发
PM提交询价需求(BOM早期/后期/现货/样品),需执行供应商询价
+
+ +
案例图 · 结构(CMMN)
+
+
CASE PLAN · 渠道寻源
+
● 上接 A1·RFQ需求分析(TYPE-B 进入) ─→ ◎ 办结转 A4·成本定价
+ 齐了即收(AutoComplete):必做项完成且无进行中项即结案寻源比价表寻源比价表供应商回价单供应商回价单正式报价单正式报价单询价请求询价请求S1接需核史◇何时进入 收到询价请求 ◆何时算完 历史核价完成,采用策…◇ 何时进入:收到询价请求◆ 何时算完:历史核价完成,采用策略已定怎么办:系统带出在供供应商及历史报价,逐PN核对有效期与历次价格。未达3次询价但有效期已过的,标记须重询。人工任务(Human Task)人工查历史报价!必做怎么办:BOM早期:有效期内直采;过期浮动≤10%直采、10-20%取均價、>20%重询。BOM后期:历史最低(≥3次)直采,否则降20%谈。现货/样品:一律重询。决策任务(Decision Task)拍板决策判定采用策略!必做◇ 达成标志:每PN明确直采或须询价策略已定达成:每PN明确直采或须询价S2选渠定策◇何时进入 须执行新询价 ◆何时算完 每料圈定渠道◇ 何时进入:须执行新询价◆ 何时算完:每料圈定渠道⊞ 规划表:本阶段含「看情况」裁量项怎么办:BOM早期/样品:系统带出即可圈入,可放宽。BOM后期:主→备选→贸易商顺序圈2~3家,贸易商尽量不用。现货:仅选有库存/实拍的供应商,无库存转单商不可选。人工任务(Human Task)人工按场景圈渠道!必做怎么办:核实授权代理资质与授权期限;贸易商核查货源链可靠性。人工任务(Human Task)人工渠道资质核实看情况◇ 何时能做:BOM后期场景◇ BOM后期场景◇ 达成标志:每料有2~3家渠道清单渠道圈定达成:每料有2~3家渠道清单S3发询比价◇何时进入 渠道已圈定 ◆何时算完 有效报价确认或时限到◇ 何时进入:渠道已圈定◆ 何时算完:有效报价确认或时限到⊞ 规划表:本阶段含「看情况」裁量项齐了即收(阶段级 AutoComplete):必做项齐即收束本阶段怎么办:同一料所有渠道一次发齐;PN/数量/目标价/回价时限写死在询价里。BOM后期默认两轮,首轮后内部review再发次轮。人工任务(Human Task)人工批量发询!必做 · #可反复怎么办:供应商回价单逐单登记:价格/MOQ/交期/有效期/批次DC/成色/渠道等级,一一对应不可缺项。人工任务(Human Task)人工登记回价!必做 · #可反复◇ 何时能做:收到回价◇ 收到回价怎么办:BOM早期:首个报价即用,品牌价差≤20%正常。BOM后期:按历史最低降20%谈,两轮review。现货:低于线上商城+比区域市场+比订货价(>20%可接受)。样品:低于线上商城即用,库内不足线上补。人工任务(Human Task)人工价格验证!必做 · #可反复◇ 何时能做:回价入册后◇ 回价入册后怎么办:电话催回未应答渠道;不实回价或远低行情则换渠道补询,每轮记录追价次数与结果。人工任务(Human Task)人工追价补询#可反复 · 看情况◇ 何时能做:回价异常或截止未应答◇ 回价异常或截止未应答◇ 达成标志:每料有有效报价或明确无货报价确认达成:每料有有效报价或明确无货S4反馈交付◇何时进入 报价已就绪(历史直采或新询完成) ◆何时算完 …◇ 何时进入:报价已就绪(历史直采或新询完成)◆ 何时算完:寻源比价表交付PM⊞ 规划表:本阶段含「看情况」裁量项怎么办:将确认报价/LT/SPQ/价格有效期等逐项填入寻源比价表,供PM直接查阅。人工任务(Human Task)人工填寻源比价表!必做怎么办:PM向客户反馈→确认下单出具正式报价单→填入采购申请表。采购接申请后向供应商下单,填写下单价格/交期/物流单号,跟踪到货。人工任务(Human Task)人工下单与跟踪看情况◇ 何时能做:现货或样品场景且PM确认下单◇ 现货或样品场景且PM确认下单◇ 达成标志:寻源比价表已提交,现货/样品下单已启动交付完成达成:寻源比价表已提交,现货/样品下单已启动怎么办:回价与成交沉淀历史价格情报;渠道表现与配合度回写供应商渠道目录与供应商档案库;新渠道收编。人工任务(Human Task)人工知识入库!必做◇ 何时能做:寻源比价表已交付◇ 寻源比价表已交付时限预警:按场景时限过半提醒:BOM早期/现货1~4日、样品1~3日、BOM后期3~9日。急料电话催办。⏱ 时限预警按场景时限过半提醒:BOM早期/现货1~4日、样品1~3日、BOM后期3~9日。急料电话催办。回价到期:回价临过期提醒复核确认,过期触发重询。⏱ 回价到期回价临过期提醒复核确认,过期触发重询。要留的材料(CASEFILE)全程随时可做(不属于任何阶段)要盯的事(EVENT LISTENER)
记号:图标井=任务四型(人工/按流程办/另立一案/拍板决策) · !必做 · #可反复 · ▶需拍板 · 虚线=看情况 · ◇何时能做/进入 · ◆何时算完 · ▣齐了即收 · ⊞含裁量项 · ⏱定时监听 · ✋人为触发
+
CMMN · CASE MANAGEMENT MODEL AND NOTATION
+
+ +
案例说明书
+
+
+

§0 开案:本案例覆盖四种询价场景——BOM早期、BOM后期、现货询价、样品询价。场景不同,供应商选择尺度与价格验证规则各异,但都遵循同一主线:PM提交询价请求→查历史报价判定可否直采→(须询价时)按场景圈渠道→发询验证→填入寻源比价表反馈。BOM早期/样品渠道可放宽、价格验证宽松;BOM后期必须靠谱渠道、两轮谈价、按历史最低降20%谈;现货仅选库存实拍供应商、多重价格校验。

+
  1. S1接需核史PM在需求库填写项目/PN/数量/场景类型/紧急度后,触发询价任务给采购。系统自动带出在供供应商与历史报价。先核历史:按场景规则逐PN判定是否可直接采用——可直接采用则跳过询价、直接进入反馈交付;须新询价则进入选渠阶段。
    ↳ 查历史报价:系统带出在供供应商及历史报价,逐PN核对有效期与历次价格。未达3次询价但有效期已过的,标记须重询。
    ↳ 判定采用策略:BOM早期:有效期内直采;过期浮动≤10%直采、10-20%取均價、>20%重询。BOM后期:历史最低(≥3次)直采,否则降20%谈。现货/样品:一律重询。
  2. S2选渠定策须新询价的料号,按场景确定渠道策略。BOM早期/样品:渠道可放宽,系统带出的供应商直接圈入。BOM后期:必须靠谱——按主供应商→备选供应商→贸易商顺序,圈2~3家,贸易商尽量不采用。现货:仅选有库存且可提供仓库实拍的供应商,不可选无库存转单商。
    ↳ 按场景圈渠道:BOM早期/样品:系统带出即可圈入,可放宽。BOM后期:主→备选→贸易商顺序圈2~3家,贸易商尽量不用。现货:仅选有库存/实拍的供应商,无库存转单商不可选。
    ↳ 渠道资质核实:核实授权代理资质与授权期限;贸易商核查货源链可靠性。
  3. S3发询比价按渠道批量发询,PN/数量/时限一次带足。回价逐单登记供应商回价单。验证规则因场景而异:BOM早期第一个报价即可;BOM后期两轮谈价、按历史最低降20%谈;现货多重校验(低于线上商城、比区域市场价、比订货价);样品低于线上商城即可。回价异常或未应答则追价补询。
    ↳ 批量发询:同一料所有渠道一次发齐;PN/数量/目标价/回价时限写死在询价里。BOM后期默认两轮,首轮后内部review再发次轮。
    ↳ 登记回价:供应商回价单逐单登记:价格/MOQ/交期/有效期/批次DC/成色/渠道等级,一一对应不可缺项。
    ↳ 价格验证:BOM早期:首个报价即用,品牌价差≤20%正常。BOM后期:按历史最低降20%谈,两轮review。现货:低于线上商城+比区域市场+比订货价(>20%可接受)。样品:低于线上商城即用,库内不足线上补。
    ↳ 追价补询:电话催回未应答渠道;不实回价或远低行情则换渠道补询,每轮记录追价次数与结果。
  4. S4反馈交付将确认报价/LT/SPQ/有效期填入寻源比价表,供PM查阅。现货/样品场景多一步:PM向客户反馈→确认下单出具正式报价单→填采购申请表→采购下单(填价格/交期/物流单号)→跟踪到货。
    ↳ 填寻源比价表:将确认报价/LT/SPQ/价格有效期等逐项填入寻源比价表,供PM直接查阅。
    ↳ 下单与跟踪:PM向客户反馈→确认下单出具正式报价单→填入采购申请表。采购接申请后向供应商下单,填写下单价格/交期/物流单号,跟踪到货。
+
全程随时可做:
↳ 知识入库:回价与成交沉淀历史价格情报;渠道表现与配合度回写供应商渠道目录与供应商档案库;新渠道收编。
+

§Z 结案:必做的事都办完、没有进行中的事,自动算结案(CMMN AutoComplete)。 寻源比价表交付PM即结案。现货/样品场景还需PM确认下单→出具正式报价单→采购下单→跟踪到货。回价与成交沉淀历史价格情报,渠道表现回写供应商渠道目录——每询一轮,行情底账厚一层。

+
+
+
动态数据 · 流转
+
+
+
询价请求输入
+

委托PR寻源询价的请求单

+
+
载体数据表格
+
+
+ 字段 · 8 +
PNBrandERA项目阶段接受替代单机用量TP场景
+
+ +
+
+
寻源比价表输出
+

多渠道横比定底表

+
+
载体数据表格
+
+
+ 字段 · 8 +
PN供应商报价MOQ交期渠道等级成色结论
+
+ +
+
+
正式报价单输出
+

对外发出的标准报价

+
+
载体PDF文件
+
+
+ 字段 · 7 +
PN单价CNY交期SPQMOQ贸易条款有效期
+
+ +
+
+
供应商回价单过程
+

供应商对询价的原始回复

+
+
载体邮件
+
+
+ 字段 · 8 +
PN供应商回价MOQ交期批次DC成色渠道等级
+
+ +
+
静态数据 · 底座
+
+
+
历史价格情报外部情报
+

历次报价与成交价情报

+
+
载体数据表格
+
来源内部沉淀
+
维护随单归档
+
+
+ 字段 · 7 +
PN厂牌单价CNY交期MOQ报价日期有效期
+
+ +
+
+
供应商渠道目录主数据
+

原厂/代理/现货渠道册

+
+
载体—
+
来源内部沉淀
+
维护随合作更新
+
+
+ 字段 · 4 +
供应商渠道类型品牌线联系人
+
+ +
+
+
供应商档案库主数据
+

供应商主数据与资质

+
+
载体数据表格
+
来源准入尽调
+
维护随时维护
+
+
+ 字段 · 8 +
供应商公司类型主营品类授权状态付款条件公司等级技术支持合作态度
+
+ +
+
+ 1.6统一报价-A2 · 替代选型CASE +
+ +
案例 · 定义卡
+
+
统一报价 A2 · 替代选型
+
执行
FAE·现场应用
触发
客户/PM 提供初选物料,或芯片类型与大致参数规格
输出
替代对标表(已签字)
+
+ +
案例图 · 结构(CMMN)
+
+
CASE PLAN · 替代选型
+
● 上接 A1·RFQ需求分析(TYPE-C 进入) ─→ ◎ 办结转 A4·成本定价
+ 齐了即收(AutoComplete):必做项完成且无进行中项即结案替代对标表替代对标表初筛清单初筛清单替代评估请求替代评估请求芯片规格书芯片规格书替代料库替代料库S1初选核险◇何时进入 收到技术选型需求 ◆何时算完 初选风险与主推定…◇ 何时进入:收到技术选型需求◆ 何时算完:初选风险与主推定性⊞ 规划表:本阶段含「看情况」裁量项怎么办:一手以原厂官网为准:产品页/规格书/PCN·EOL 公告;查 芯片规格书,生命周期对照 PN物料主库。人工任务(Human Task)人工查规格核险!必做◇ 何时能做:入案即可做◇ 入案即可做怎么办:对 品牌原厂字典 判初选品牌是否我司主推;无风险且主推→采信初选,直接办结交回。人工任务(Human Task)人工判主推品牌!必做怎么办:查 替代料库 有现成方案直接复用并注明来源;技术问题案例库 有坑先避。人工任务(Human Task)人工查沉淀避坑看情况◇ 何时能做:同类需求出现过◇ 同类需求出现过◇ 达成标志:风险与主推与否有结论初选定性达成:风险与主推与否有结论S2圈选替代◇何时进入 初选有风险/非主推,或只给类型参数 ◆何时算完 …◇ 何时进入:初选有风险/非主推,或只给类型参数◆ 何时算完:候选替代圈定并确认怎么办:AI 检索/选型聚合平台/芯片采购网拉 初筛清单:候选型号、品牌、替代关系、封装、生命周期、货态。人工任务(Human Task)人工撒网拉初筛!必做 · #可反复◇ 何时能做:入案即可做◇ 入案即可做怎么办:每颗先明确数据来源(以原厂官网 芯片规格书 为准,记版本),再仔细通读规格书做全面参数对比:封装/引脚/电气/温度/认证逐项过;定 替代等级,不合格剔除。人工任务(Human Task)人工逐条核验分级!必做 · #可反复◇ 何时能做:初筛清单到手◇ 初筛清单到手怎么办:过 客户技术画像 禁用清单;同原厂(查 原厂技术支持库)或我司采购确认候选为主推型号;供应顺带核(查 供应商渠道目录)。人工任务(Human Task)人工确认主推型号!必做◇ 达成标志:2~3颗分级候选经确认候选圈定达成:2~3颗分级候选经确认S3对比评估交付◇何时进入 候选替代确认 ◆何时算完 报告签字交回发起方◇ 何时进入:候选替代确认◆ 何时算完:报告签字交回发起方怎么办:收齐候选 芯片规格书(官网版),版本与日期记录在案。人工任务(Human Task)人工收集规格书!必做怎么办:关键参数逐项对比写进 替代对标表,标出差异项与 替代等级,写明差异带来的风险。人工任务(Human Task)人工参数对比表!必做怎么办:P2P 核确免改动;功能兼容/其他评软件开发/外围电路/layout 改动;关键差异给验证建议,对照 验证记录库。人工任务(Human Task)人工替代风险评估!必做怎么办:FAE 签字,替代对标表(已签字) 交回发起方——输入技术需求的客户/PM。人工任务(Human Task)人工签字交出!必做 · ▶需拍板◇ 达成标志:替代对标表带FAE签字签字放行达成:替代对标表带FAE签字怎么办:官网查到的规格书随手入 芯片规格书;确认的替代关系回填 替代料库 与 PN物料主库(内部推荐替代料);踩到的坑记 技术问题案例库。人工任务(Human Task)人工知识入库!必做时限过半:向 BD 与 PM 同步进度与风险,必要时协商只报有把握的部分。⏱ 时限过半向 BD 与 PM 同步进度与风险,必要时协商只报有把握的部分。客户改需求:应用条件/参数变更→回初选核险与圈选复核,必要时重圈候选。✋ 客户改需求应用条件/参数变更→回初选核险与圈选复核,必要时重圈候选。要留的材料(CASEFILE)全程随时可做(不属于任何阶段)要盯的事(EVENT LISTENER)
记号:图标井=任务四型(人工/按流程办/另立一案/拍板决策) · !必做 · #可反复 · ▶需拍板 · 虚线=看情况 · ◇何时能做/进入 · ◆何时算完 · ▣齐了即收 · ⊞含裁量项 · ⏱定时监听 · ✋人为触发
+
CMMN · CASE MANAGEMENT MODEL AND NOTATION
+
+ +
案例说明书
+
+
+

§0 开案:替代选型一事一议:收到 替代评估请求 即开案——客户/PM 给出初选物料,或芯片类型与大致参数;先核初选(EOL 等风险提示 + 是否我司主推品牌),无风险且主推直接采信初选办结;需要替代的,先撒网(AI 检索/聚合平台拉 初筛清单)后逐条人工核验,常要两三轮,存活候选按 替代等级 分级(P2P/功能兼容/其他)圈 2~3 颗,做参数对比与风险评估成报告交回。任何替代必须把差异与风险写清——差异没核清的不放行。

+
  1. S1初选核险接 替代评估请求 立案——客户/PM 给出初选物料,或只给芯片类型与大致参数;一手资料以原厂官网为准(产品页/规格书/PCN·EOL 公告):查 芯片规格书 确认初选料有无 EOL/停产等风险提示,生命周期对照 PN物料主库;对 品牌原厂字典 判初选品牌是否我司主推——无风险且主推,直接采信初选、免替代办结;顺手查 替代料库 与 技术问题案例库,有沉淀方案或已知坑先亮出来。
    ↳ 查规格核险:一手以原厂官网为准:产品页/规格书/PCN·EOL 公告;查 芯片规格书,生命周期对照 PN物料主库。
    ↳ 判主推品牌:对 品牌原厂字典 判初选品牌是否我司主推;无风险且主推→采信初选,直接办结交回。
    ↳ 查沉淀避坑:查 替代料库 有现成方案直接复用并注明来源;技术问题案例库 有坑先避。
  2. S2圈选替代先撒网后核验,常要两三轮:用 AI 检索、选型聚合平台与芯片采购网(线索归 公网选型库)拉 初筛清单——带替代关系标注的一堆候选,快而不可靠;再逐条人工核验做全面参数对比——先明确每项数据的来源(一律以原厂官网 芯片规格书 为准),再仔细通读规格书逐项对标(Pin-to-Pin),存活者按 替代等级 分级——P2P(同封装同引脚可直换)/功能兼容(需外围或 layout 调整)/其他(部分兼容须验证);候选过 客户技术画像 禁用清单、优先同品类我司主推品牌(对照 产品线能力档案),不足 2~3 颗就放宽参数或换角度重新撒网;定型前同原厂(按 原厂技术支持库 找窗口)或我司采购确认主推型号。
    ↳ 撒网拉初筛:AI 检索/选型聚合平台/芯片采购网拉 初筛清单:候选型号、品牌、替代关系、封装、生命周期、货态。
    ↳ 逐条核验分级:每颗先明确数据来源(以原厂官网 芯片规格书 为准,记版本),再仔细通读规格书做全面参数对比:封装/引脚/电气/温度/认证逐项过;定 替代等级,不合格剔除。
    ↳ 确认主推型号:过 客户技术画像 禁用清单;同原厂(查 原厂技术支持库)或我司采购确认候选为主推型号;供应顺带核(查 供应商渠道目录)。
  3. S3对比评估交付收齐候选 芯片规格书,整理关键参数对比表:逐项标出差异项并分析差异风险;按 替代等级 定评估深度——P2P 核确免改动即可,功能兼容/其他逐项评软件开发、外围电路与 layout 改动,认证差异对照 行业标准库,已有 验证记录库 结论直接采信;成稿 替代对标表(推荐报告,同颗芯片 2 页:等级+参数对比+风险评估),FAE 签字后交回发起方——输入技术需求的客户/PM。
    ↳ 收集规格书:收齐候选 芯片规格书(官网版),版本与日期记录在案。
    ↳ 参数对比表:关键参数逐项对比写进 替代对标表,标出差异项与 替代等级,写明差异带来的风险。
    ↳ 替代风险评估:P2P 核确免改动;功能兼容/其他评软件开发/外围电路/layout 改动;关键差异给验证建议,对照 验证记录库。
    ↳ 签字交出:FAE 签字,替代对标表(已签字) 交回发起方——输入技术需求的客户/PM。
+
全程随时可做:
↳ 知识入库:官网查到的规格书随手入 芯片规格书;确认的替代关系回填 替代料库 与 PN物料主库(内部推荐替代料);踩到的坑记 技术问题案例库。
+

§Z 结案:必做的事都办完、没有进行中的事,自动算结案(CMMN AutoComplete)。 无需替代的,确认初选可用即结案;需要替代的,推荐报告 替代对标表(已签字) 交回发起方——输入技术需求的客户/PM 即结案;替代关系回填 替代料库 与 PN物料主库,规格书与报告入库——每办一案,知识库厚一层。

+
+
+
动态数据 · 流转
+
+
+
替代评估请求输入
+

技术选型需求立案单

+
+
载体数据表格
+
+
+ 字段 · 5 +
初选物料芯片类型参数规格应用场景需求人
+
+ +
+
+
替代对标表输出
+

替代推荐报告·同芯片2页

+
+
载体PDF文件
+
+
+ 字段 · 7 +
原型号候选型号替代等级参数差异项差异风险改动评估验证建议
+
+ +
+
+
初筛清单过程
+

撒网初筛的候选线索单

+
+
载体数据表格
+
+
+ 字段 · 6 +
候选型号品牌替代关系封装生命周期货态
+
+ +
+
静态数据 · 底座
+
+
+
芯片规格书主数据
+

原厂官网一手规格书

+
+
载体PDF文件
+
来源原厂官网
+
维护随原厂发布
+
+
+ 字段 · 4 +
PN关键参数封装版本日期
+
+ +
+
+
替代料库知识资产
+

替代对标沉淀库

+
+
载体数据表格
+
来源内部沉淀
+
维护随评估更新
+
+
+ 字段 · 6 +
原PN替代PN等级替代类型候选品牌分析报告
+
+ +
+
+
PN物料主库主数据
+

内部物料主数据登记

+
+
载体数据表格
+
来源内部沉淀
+
维护随时维护
+
+
+ 字段 · 8 +
系统内码标准PN品类封装工艺生命周期晶圆厂封装厂
+
+ +
+
+
品牌原厂字典主数据
+

品牌与原厂名称主数据

+
+
载体数据表格
+
来源内部沉淀
+
维护随时维护
+
+
+ 字段 · 6 +
品牌简称中文简称全称官网代理商是否主推
+
+ +
+
+
技术问题案例库知识资产
+

问题根因与对外回复

+
+
载体数据表格
+
来源复盘沉淀
+
维护随时维护
+
+
+ 字段 · 6 +
案例号问题类型问题现象根因结论对外回复关联PN
+
+ +
+
+
公网选型库外部情报
+

AI与聚合平台初筛线索源

+
+
载体数据表格
+
来源外部公网
+
维护实时
+
+
+ 字段 · 5 +
替代关系参数对比规格书生命周期价格参考
+
+ +
+
+
客户技术画像主数据
+

客户技术路线与偏好

+
+
载体数据表格
+
来源整合更新
+
维护季度评审
+
+
+ 字段 · 7 +
客户技术路线产品线选型偏好禁用清单决策人经营策略
+
+ +
+
+
产品线能力档案主数据
+

原厂产品线能力边界

+
+
载体数据表格
+
来源能力建档
+
维护版本受控
+
+
+ 字段 · 6 +
品牌产品线参数边界能力评价竞品路线图
+
+ +
+
+
原厂技术支持库主数据
+

原厂对接窗口与响应

+
+
载体数据表格
+
来源关系经营
+
维护随时维护
+
+
+ 字段 · 5 +
品牌对接窗口联系方式配合程度响应时效
+
+ +
+
+
供应商渠道目录主数据
+

原厂/代理/现货渠道册

+
+
载体—
+
来源内部沉淀
+
维护随合作更新
+
+
+ 字段 · 4 +
供应商渠道类型品牌线联系人
+
+ +
+
+
行业标准库知识资产
+

适用标准与内部解读

+
+
载体数据表格
+
来源外部导入
+
维护版本受控
+
+
+ 字段 · 6 +
标准名称标准类型适用行业关键规则内部解读版本
+
+ +
+
+
验证记录库知识资产
+

样品验证条件与结论

+
+
载体数据表格
+
来源测试归集
+
维护随评估更新
+
+
+ 字段 · 7 +
验证号PN验证类型测试参数测试条件测试结果问题风险
+
+ +
+
+ 1.7统一报价-A7 · 情报归档 +
+
任务定义卡
+
+
统一报价 A7 · 情报归档
+
执行
BD·商务
触发
G4 判定 拒绝/无回复(D+7 跟进后)
目标
不成交也留资产:情报、客户画像、落地率
+
+
作业指导书
+
+
+
步骤流程 — 情报归档情报归档
+ 结果登记S1画像更新S2落地率统计S3上接 A6·报价议价归档闭环 +
+
+

谁做、何时做:拒绝或无回复的单子 7 天内闭环归档。每一单不成交的报价也是情报资产——沉淀下来,下一单更快更准。

+
● 上接 A6·报价议价
+
  1. S1结果登记按 D+3/D+7跟进提醒 的最终反馈,把拒绝原因/竞对价位写回 历史价格情报(归档)。
  2. S2画像更新把客户行为写进 客户资料库(价格敏感型/快速决策型等标签),供 P-01 的客户等级因子取用。
  3. S3落地率统计计入 报价落地率统计(落地率/TypeA命中/D+3回复率/退回率),月度交管理层复盘。
+
◎ 归档闭环
+
+
留痕 · SLA留痕:历史价格情报(归档)、报价落地率统计;系统:CRM;7 天闭环,落地率目标 >25%。
+
+
+
+ + + \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..4551972 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,177 @@ +# JCAI 任务操作系统 · MVP 规格包 + +这个目录是「企业级 AI Native 任务操作系统」的**完整规格包**:两卷语义规范 + 一份工程结构契约 + +一份业务验收样例。交给编码 Agent,即可从零实现 MVP。 + +> 一句话系统:组织的工作被定义为可编排的工作流,工作流由活动编排而成;一个活动是一个完成一项 +> 任务的 Agent 机制,像小程序一样在系统外开发、安装即用;人只在责任点与放行点上出现—— +> 确定交系统,临场交 AI,落地交人。 + +--- + +## 启动提示词(编码仓库的 Agent 从这里启动) + +```text +你是本仓库的开发 Agent,任务:从零实现「JCAI 任务操作系统」的 MVP。 + +【第 0 步 · 建立权威——写任何代码之前必须完成】 +1. 读 docs/编码规范.md 的前言与 §0–§5 —— 先知道代码长什么样、放在哪、谁能依赖谁; +2. 通读 docs/操作系统.html(V2.15,系统侧)—— 五层总图 / 工作台五要素与治理台九功能 / + 流程层(流程包·工作流·触发器·审批点·网关·边映射)/ 引擎(流程引擎 + 活动基座六件)/ + 人类工具 / 统一事件标准 / 调用层与工具箱 / 记忆与度量 / 运行拓扑与写三分 / 基座与治理 / + 系统不变量——最后的不变量清单要能默写要点; +3. 通读 docs/活动模型.html(V2.0,活动侧)—— 契约七件 / loop(CMMN+DMN·语义引擎×Agent 回路· + 双向驱动)/ flow(步序声明·四种步型)/ 人类工具的调用 / 交互内容 / 技能 / 记忆与迭代 / + Harness 与验收分级 L1–L5 / 活动包与开发 / 合规判据(通用 17 + loop 8 + flow 6); +4. 回头读完 docs/编码规范.md 全文(§6–§17); +5. 读 docs/MVP示例工作流.html —— MVP 要跑通的那单生意(统一报价), + 按本 README 的《归一化对照表》把业务素材映射成系统概念。 + +【权威分工——冲突时的裁决顺序】 +- 语义(系统做什么、什么语义):以两卷规范为准; +- 结构(代码长什么样、模块边界、依赖方向):以 编码规范.md 为准; +- 业务内容(MVP 做哪单生意、字段与规则):以 MVP示例工作流.html 为准; +- 前端 UI:**不是参照,是 1:1 平移**。两台高保真原型的前端代码就是 UI 的实现规格, + 原型仓库在本机(用户已授予读取权限):`~/coding/JCAI_PRD/workbench`(员工面工作台)与 + `~/coding/JCAI_PRD/governance`(管理面治理台)。按本 README《前端 UI · 原型 1:1 平移》 + 一节的清单与规则执行——CSS 与 DOM 结构原样搬、组件按编码规范 §9 重排、mock 数据层换成 + 真实 API;**只平移不 import**,编码仓与原型仓零依赖; +- 发现两类权威打架:停下来报告,不得自行仲裁(编码规范·前言)。 +- 谨记双层边界:范式(loop / flow / skill)是后端实现逻辑的模型,只存在于引擎层; + 交互模型(工单两模式 + 对话卡族)是前端呈现协议——两层不冲突,前端永远感知不到范式 + (编码规范 §9 注记)。UI 文案用两卷术语(标准活动 / 案例活动 / 审批点), + SOP / CMMN / BPMN 等字样只出现在代码与内部文档,不出现在界面上。 + +【实施纪律】 +- 严格按 编码规范.md §15 的里程碑序 M0→M6 推进;每个里程碑先立骨架 + (index / contract / port / CONTRACT.md + 空测试)再填实现; +- 机器门禁(tsc / eslint / depcruise / 契约快照 / test)从 M0 起全绿,红了先修门禁再前进; +- 遵守 §12 AI 协作协议(多 Agent 并行 · 主 Agent 编排制):**你即主 Agent(唯一集成人)**, + 按 §12.0 授权矩阵组织子 Agent 并行承包——分支即工单、合入唯经你(§12.7)、契约面由你单写; + §12.5 禁止清单按矩阵授权,三类保留项(破坏性契约 / 新依赖 / 改门禁规则)永远上升用户; +- 本 docs/ 即规格包原件,整包置于仓库 docs/ 下;另建 docs/debt.md 与 docs/adr/ + (ADR 编号从 005 续,001–004 已在编码规范 §14); +- 四个落地裁量点已由用户裁定(见本 README《已裁定的落地决策》),照此实现、不必再问; + 实现中出现**新的**裁量点仍照前言规矩停下报告。 + +【MVP 完成判据——统一报价全链路验收场景】 +以下场景在真实运行的系统上从头到尾走通(mock 只允许出现在外界:邮件通道与外部系统可用 +模拟通道 / 录制回放替身,系统内部机制不得 mock): + 1. 治理台:录入五名员工与岗位、绑定 LLM 实例(任一 OpenAI 兼容端点)、 + 编排「统一报价」流程包 v1 并发布(边映射闭合校验通过)、 + 配置「客户RFQ询价」事件触发器与邮件通道实例; + 2. 一封样例 RFQ 邮件入站 → 归属解析 → 触发器命中起单:生成一条工作流, + A1 任务落到 BD 冯兵的工作台任务清单; + 3. A1 受理归一(flow):步序推进,LLM 步抽取归一 → 台账「统一受理记录」(任务级草稿层), + 缺关键字段走补全卡,逐条打标走 DMN(三分类规则 P-03),放行通过 → 草稿合并正式版、 + 数据事件发射,G2 网关按 Type 分流; + 4. B 类条目 → A3 渠道寻源(loop,林佩萱):CMMN 装载、Agent 回路推进、发询后登记 + 数据监听 + 时限;供应商回价(模拟入站)→ 数据事件续跑;寻源比价表交付放行; + 5. C 类条目 → A2 替代选型(loop,王梓名):含一次跨人卡(向 BD 补全), + 替代对标表放行交回; + 6. A4 成本定价(flow):取价基准 → DMN 定价(利润模型 P-01)→ 底价自检(底价门禁 P-02) + → 报价草案; + 7. AP 定价审批(审批点):审批单卡到 PM 丁子乔工位——通过放行进 A6; + 驳回按声明走向回 A4 重开新实例; + 8. A6 报价议价(flow):生成正式报价单(写类动作登记为动作意向)→ 落地预检 → + 放行通过即落地(台账回写 + 出站发送)→ 输出口发射;建 D+3 跟进监听; + 9. 客户拒绝(模拟)→ A7 情报归档:历史价格情报回写、落地率统计落账,工作流「已完成」; +10. 全程可审计:任务记忆只追加、信封盖戳、归侧标注;工作台五要素齐活 + (任务 / 审批 / 消息 / 纪要 / 汇报聚合自任务日志);治理台·任务管理可在途监控、 + 叫停并恢复一单任务;终态封卷触发蒸馏钩子产出活动记忆候选条目(可为最小实现)。 + +【种子数据】 +- 员工五人:丁子乔(PM·项目经理)· 冯兵(BD·商务)· 王梓名(FAE·现场应用)· + 林佩萱(采购/寻源)· 李元初(OP·运营);登录者 = 冯兵; +- 单次部署 ≤50 人、单组织、不做多租户——一切机制复杂度以此为预算。 + +现在从【第 0 步】开始。读完四份文档后,先提交 M0 的变更申请,不要直接写代码。 +``` + +--- + +## 文件清单与权威分工 + +| 文件 | 版本 | 权威范围 | +| --- | --- | --- | +| `操作系统.html` | V2.15 · 2026-07-24 | **系统侧语义权威**:五层、交互两面、流程层、引擎与活动基座六件、人类工具、统一事件标准、调用层、记忆与度量、运行拓扑、边界四象限、基座与治理、系统不变量 | +| `活动模型.html` | V2.0 · 2026-07-25 | **活动侧语义权威**:契约七件、loop(CMMN+DMN)、flow(步序声明)、人类工具的调用、交互内容、技能、记忆与迭代、Harness 与 L1–L5、活动包与开发、合规判据 17+8+6 | +| `编码规范.md` | V0.1 · 2026-07-26 | **工程结构权威**:技术选型定案、monorepo 唯一形态、模块层级 L1–L8 与依赖门禁、Mastra 映射、持久层、前端 features、AI 协作协议、里程碑 M0–M6。服从两卷,只管「代码长什么样」 | +| `MVP示例工作流.html` | 2026-07-26 导出 | **业务验收样例**:统一报价流程全套素材——7 节点(SOP×5 + Case×2)、3 网关、13 张流转单据、16 张静态库表、5 条规则判定表 + 经验。是原始业务素材,需按下表归一化 | + +两卷互为关联卷(系统供给 vs 活动定义是镜像同表);编码规范前言载有仲裁规则: +**语义冲突以两卷为准,结构冲突以编码规范为准,两类权威打架停下来报告**。 + +## 归一化对照表(MVP 素材 → 系统概念) + +样例是业务分析会话的原始导出,术语与两卷未对齐;实现时按此表映射: + +| 样例里的物件 | 归一化为 | +| --- | --- | +| 流程「统一报价」 | **流程包** v1:治理台编排五要素、边映射闭合、发布;运行即工作流 | +| 触发器「客户RFQ询价」 | **事件触发器**:通道入站命中规则 → 字段映射 → 经调用接口起单 | +| SOP 节点(A1/A4/A6/A7) | **标准活动(flow)**:任务定义卡→契约七件;作业指导书 S1…Sn→步序声明(四种步型);步内判断(如 A1 的 D1 完整度)→条件谓词或人类工具步;SLA→Harness 时限与预算 | +| Case 节点(A2/A3) | **案例活动(loop)**:案例图→CMMN XML;案例说明书→同版本叙事面;`!必做`→entryCriterion 常项、`看情况`→discretionary、`#可反复`→repetitionRule、`▶需拍板`→manualActivation + 放行;`⏱时限/回价到期/✋客户改需求`→时间/数据/人监听(时限必配) | +| A5 定价审批 | **审批点**(流程层内置人裁节点,功能属性四件);G3「审批结果」网关并入审批点的驳回走向(回 A4 重开新实例)。见裁量点 ① | +| 规则五件(P-01 利润模型 / P-02 底价门禁 / P-03 三分类 / P-04 有效期 / 受理规范) | 判定表部分→ **DMN 决策表**(确定性求值、命中行留痕);「经验」段落→**技能 / 活动记忆种子**(载方法不载权力) | +| 动态数据(流转单据 13 张) | **台账对象**(活动自持域,schema 声明自生长)+ **输出口载荷 schema**(流转的事实经边映射拼接) | +| 静态底座(16 张库表) | **共享域对象 / 主数据**(客户资料库、PN物料主库、供应商渠道目录等);写授权按域.对象在契约申报 | +| 「转订单履约(ORM)」 | 流程包**显式终点**的输出声明;MVP 以回执与日志代真实 ORM 对接 | +| 角色 BD / PM / PRM / FAE | **岗位**;PRM=采购 → 林佩萱,FAE → 王梓名,负责人四策略解析起单 | + +## 已裁定的落地决策(2026-07-26 用户拍板,照此实现) + +1. **A5 定价审批 = 审批点**(流程层内置人裁节点,功能属性四件):样例里的「策略决策」落审批 + 意见与批注;G3「审批结果」网关并入审批点的驳回走向(驳回 → 回 A4 重开新实例)。 +2. **G2 料号分流 = 并行网关**:三道并行、每边载荷按 Type 过滤条目子集;某类条目为空的分支 + 按「容忍」处置,A4 汇合处的必填映射不得依赖可空分支。 +3. **A4 成本定价 = flow**(从样例):取价→查表定价→自检的判断全部装进 DMN 决策表确定性 + 求值;实现中一旦出现「由 AI 决定怎么办」,按活动模型 2.1 的上升规则改 loop 或上升为 + 流程层编排。 +4. **议价回环「有异议 → 返回调整 → A4」= 流程层回边**:人裁决后重开新任务实例 + (同节点、新任务 ID、留痕关联),不复活旧任务。 + +## 前端 UI · 原型 1:1 平移(强制) + +`apps/web` 的界面**不重新设计**:两台原型的前端代码就是实现规格,逐屏平移, +验收标准 = 与原型逐屏对照、视觉不可辨差异。平移清单: + +**员工面(workbench,浅色三栏工作面)** —— 源根 `~/coding/JCAI_PRD/workbench/src/app/(proto)/` + +| 源文件 | 是什么 | +| --- | --- | +| `page.tsx` | 外壳(左轨五要素 + 冯兵徽标)+ 任务四区骨架(任务列表 / 标题区 / 工作区 / 对话区、收展把手) | +| `_components/ViewRegion.tsx` | 标题区 + 工作区四页签:待处理(HTML 工单翻页,验收=可修订报告 / 执行=指导书+空表单)、工作成果、任务详情(KPI 带 + 流程链 + 模型扇形图 + 上下文档案)、工作日志 | +| `_components/TaskChat.tsx` | 对话区(任务助理):气泡二元制、对话卡族(决策/补全/评价/验收单)、composer 锁、跨栏定位 | +| `_components/ModuleWorkspace.tsx` | 审批 / 消息 / 纪要 / 汇报四要素(各配助理对话壳) | +| `_components/`(其余) | FileViewer / Ico / ChatAvatar / ScrollArea / Markdown / SettingsButton | +| `app.css` + `proto.vendor.css` | **整文件搬**:设计令牌(`.proto-root .app-shell`)+ 全部 `jc-*` 组件样式 + vendor 皮肤(布局骨架,类名被它占用,`jc-` 前缀因此必须保留) | +| `_data/model.ts` | 交互模型类型——`@contracts/card.ts` 的参照原型(正式版以 @contracts 为准) | +| `public/samples/` | 样例 PDF 报价单等资产(演示用,可选) | + +**管理面(governance,深轨浅面控制台)** —— 源根 `~/coding/JCAI_PRD/governance/src/app/` + +| 源文件 | 是什么 | +| --- | --- | +| `_components/Governance.tsx` | 九区全体:区头 + 区内页签 + 整页下钻 + 就地确认带(AskBand·影响预览三必答)+ 事件流 + 数据区记录管理器 | +| `_flow/`(六文件) | 编排画布:diagram-js 布局引擎(蛇形折行)+ 画笔(三色 skin + 琥珀审批点)+ 编辑器核 | +| `theme.css` + `console.css` | 设计令牌 + 治理台组件层(`g-*` + 色调字典 `t-*`),整文件搬 | +| `_components/Ico.tsx` · `_data/gov-data.ts` | 图标;mock 数据(字段口径与文案的参照,替换为真实 API) | + +**平移规则**: + +1. **DOM 结构与类名原样保留**(`jc-*` / `g-*` 前缀、vendor 皮肤一并搬);CSS 整文件搬,不重写不「优化」; +2. **代码组织按编码规范 §9 重排**(拆进 features、路由改 TanStack Router、数据改 typed-fetch + SSE)——重排只动模块边界与数据来源,**渲染输出保持 1:1**; +3. 原型是 Next.js、正式系统是 Vite SPA:去掉 `"use client"` 等 Next 专有件即可,组件均为纯 React 19; +4. 原型内嵌的 mock 数据与内存状态(`_data/*`、doneMap 等)全部换成服务端投影;「刷新即重置」的原型缺陷不得带入——正式系统零过程状态、刷新从投影重建(§9.2); +5. 平移中发现原型与两卷/编码规范冲突(如原型 `/api/chat` 直连 DeepSeek),以规范为准并报告,不照搬。 + +## MVP 之外(明确不做) + +多租户 / 移动端 / 真实 ERP·CRM 对接(用调用契约 + 录制回放替身)/ 活动市场与多组织分发 / +两卷中标注「可选」的高级项(如叙述性小结可后置)。治理台九功能在 MVP 里以支撑验收场景为度: +每区可用、不追求满配。 + +--- + +*规格包整理于 2026-07-26。四份文件的任何改动都应回到源头(PRD 工作区)同步,勿在编码仓单方改规格。* diff --git a/docs/adr/ADR-005-toolchain-and-gates.md b/docs/adr/ADR-005-toolchain-and-gates.md new file mode 100644 index 0000000..2256fef --- /dev/null +++ b/docs/adr/ADR-005-toolchain-and-gates.md @@ -0,0 +1,34 @@ +# ADR-005 · 工具链与门禁的落地形态 + +- 状态:已决(M0) +- 日期:2026-07-27 +- 上下文:编码规范 §11 规定五道门禁(tsc / eslint / depcruise / api-report / test)必须存在且可执行, + 但未规定 TypeScript 的运行与产出形态。§1 表内已定案的构建件只有 Vite(前端)与 tsup(§8.2 活动编译预设)。 + +## 决定 + +1. **后端不引新的 TS 运行器**。`apps/api` 以 **tsup**(§8.2 已定案的表内件,esbuild 内核,原生解析 tsconfig `paths`) + 打包为 ESM 后由 Node 22+ 直跑;开发期 `tsup --watch --onSuccess node dist/main.js`。 + 不引入 `tsx` / `ts-node` / `swc` 等表外依赖(§12.5#3)。 +2. **tsc 分两个工程**:`tsconfig.node.json`(api / packages / activities / tools,lib ES2023)与 + `tsconfig.web.json`(web / ui-kit,lib DOM + jsx)。二者共享 `tsconfig.base.json` 的严格开关与 + §11.1 规定的 `paths`。根 `tsconfig.json` 只做 solution 引用。 + 理由:一份 tsconfig 同时挂 DOM 与 Node 全局会让 §9.2「组件内禁裸 fetch」之类的门禁失去类型依据。 +3. **契约快照的范围**(`tools/api-report.mjs`):`tsc --emitDeclarationOnly` 出全量声明后, + **只保留契约面**落 `api-report/` —— `packages/contracts/**`、各 `packages//src/index.d.ts`、 + 各 `apps/api/src/modules//{index,contract,port}.d.ts`。 + 由此「改 `internal/` 时 api-report 纹丝不动」(§11.5)成立。 + 配套纪律:模块出口的公开签名必须由 `contract.ts` / `port.ts` 的显式类型承载, + 不得依赖 `internal/` 的推断类型泄漏(由 `explicit-module-boundary-types` 在 modules/ 下强制)。 +4. **§11.2 的解析层封装**采用双保险:每个后端模块带 workspace `package.json`(`exports` 只开 `index.ts`), + 同时保留 §11.1 的 `@modules/*` 路径别名;穿透 `internal/` 的拦截由 ESLint `no-restricted-imports` + 与 depcruise `no-cross-module-internal` 两道机检承担(§11.3 / §11.4)。 +5. **tier-order 生成物入库**:`tools/depcruise-tiers.generated.cjs` 由 `tools/gen-depcruise-tiers.ts` + 从 `tools/module-tiers.json` 生成并提交,`pnpm gates` 首步重新生成 —— 层级表与门禁的漂移在 diff 上可见。 + +## 后果 + +- 表外依赖为零;门禁全部可离线执行。 +- 后端产物是打好的 bundle,栈帧靠 sourcemap 还原。 +- `no-orphans` 对契约面(`index` / `contract` / `port`)、`app/`、`activities/`、`tools/` 与测试放行—— + 这些是合法的无入边文件;其余孤儿一律 error。 diff --git a/docs/debt.md b/docs/debt.md new file mode 100644 index 0000000..eaf60b8 --- /dev/null +++ b/docs/debt.md @@ -0,0 +1,9 @@ +# 技术债登记簿 + +> 编码规范 §17:历史违规集中登记于此——旧路径 `warn`、新代码 `error`,清零后升级。 +> 例外必须注明原因与预期清理时间;散落的 `eslint-disable` 不算例外,算违规。 + +| # | 债 | 原因 | 预期清理 | 状态 | +|---|---|---|---|---| +| M0-1 | `pnpm db:seed` 只打印种子计划,未真正写库 | 种子数据(五岗位 / 五员工)已在 `apps/api/src/app/seed.ts` 冻结为常量并定义 `OrgSeeder` 端口;写入实现依赖 `org` 模块的 Drizzle schema,属 M1 | M1 | 已清理(M1) | +| M0-2 | `packages/{contracts,sfeel,activity-sdk,ui-kit}` 仅有版本常量 | M0 只立骨架,内容按里程碑序填(§15) | M1–M5 | 进行中 | diff --git a/docs/操作系统.html b/docs/操作系统.html new file mode 100644 index 0000000..14ec803 --- /dev/null +++ b/docs/操作系统.html @@ -0,0 +1,904 @@ + + + + + +操作系统 · 系统侧规范 + + + +
+ +
+
JCAI · WORK OS · SYSTEM VOLUME
+

操作系统:五层、引擎与边界

+

本卷完整描述系统侧:交互 / 流程 / 引擎 / 调用 / 基座五层,工作流引擎 = 流程引擎 + 活动基座,人类工具四卡,统一事件标准,记忆系统,web + server 运行拓扑,活动与系统的边界,基座与治理。活动是像小程序一样在系统外开发、经活动库安装的 Agent 机制(Case = loop,SOP = flow),其活动侧规范见《活动模型》;本卷只写系统。

+
+
版本 V2.15 · 系统规范
+
日期 2026-07-24
+
读者 Coding Agent
+
关系 关联《活动模型》
+
+
+ +
+
00定位两本事实 · AI Native 三重结构 · 部署边界
+
01五层总图交互 / 流程 / 引擎 / 调用 / 基座 · 贯穿件与权力线 · 术语速览
+
02交互层工作台五要素 · 治理台九功能
+
03流程层流程包与工作流 · 编排五要素 · 触发器 · 构件来处
+
04引擎流程引擎 + 活动基座六件 · 两范式一套契约 · 调度权分层 · 终态名录
+
05人类工具四卡(决策 / 执行 / 补全 / 放行)· 三规矩 · 与审批点分层
+
06事件标准信封 · 四类事件 · 归属解析 · 监听声明 · 投递五诺 · 三级消费
+
07调用层四类能力 · 工具三来处 · 外部系统 · 工具包规范(契约 / 效应等级 / 注册两审)
+
08记忆系统任务记忆 · 活动记忆四层 · 记忆不载权力 · 度量
+
09运行拓扑web + server · 过程在后端 · 放行门
+
10活动与系统的边界四象限 · 两线一门 · 系统供给 vs 活动定义
+
11基座与治理六项存放 · 持久层两分 · 包清单 · 安装两审 · 进化治理
+
12不变量十四条
+
+ + +

00定位

+
+ +
一句话系统:组织的工作被定义为可编排的工作流,工作流由活动编排而成;一个活动是一个完成一项任务的 Agent 机制,像小程序一样基于系统内的活动基座在系统外开发、安装即用;人只在责任点与放行点上出现(调度权分层见 04)。活动是开发态,任务是运行态——同一件东西,开发者交付的叫活动,员工工作台上跑着的叫任务。
+ +

0.1两本事实:生意的事实 vs 工作的事实

+

ERP / CRM 记录生意的结果性事实:订单成了、款收了、货发了。但对「这件事是怎么被做成的」,它们一无所知。

+

本系统记录工作的过程性事实:哪个触发器起的单、每一步谁在场、AI 干了哪段、人修订了什么、在哪里监听了三天、驳回过几次、最终谁放的行——即任务记忆与事件流(08)。这份含人机分工与认账链的轨迹,是任何 ERP 都不持有、事后也补不出来的数据;它的首要用途是增强工作质量的确定性(0.2),其次才是合规与复盘。ERP 记生意的事实,本系统记工作的事实——互补不重叠,这也是本系统不与 ERP 争地盘的原因;护城河不在业务数据,而在工作轨迹。

+ +
+
FIG-01 · 两本事实:生意的事实 vs 工作的事实结果性记录 ↔ 过程性记录 · 互补不重叠
+ + + ERP / CRM · 生意的结果性事实 + + + + 订单 · 已成交 + RESULT + + + 回款 · 已入库 + RESULT + + + 发货 · 已签收 + RESULT + + 这件事是怎么被做成的? ——无记录 + 只记「做成了什么」,不持有过程 + 本系统 · 工作的过程性事实(任务记忆 + 事件流) + + + + 触发器起单 · 工作流调起09:12 + + AI 草拟产出 · 读取留快照09:13 + + 人驳回迭代 · 意见随卡留痕09:40 + + 监听客户回件 · 时限三天+2D + + 数据事件到 · 环续跑11:02 + + 放行通过 · 草稿落事实 · 可回放11:30 + 谁在场 · AI 干了哪段 · 依据什么 · 谁放行——逐条留痕 + + ERP 记生意的事实,本系统记工作的事实——互补不重叠;过程事实 = 任务记忆 + 事件流,是任何 ERP 都不持有、事后也补不出来的数据 + +
+ +

0.2AI Native 的意义:让 AI 的参与增强确定性

+

判断类工作的质量,传统上是一个随机变量:取决于谁在做、状态如何、经验是否在场。把 AI 以「加个聊天框」的方式引入,只会再放大它——产出不可复现、无法追因、责任模糊。

+

本系统对「AI Native」的定义与此相反:AI 参与的目标不是替人干活,而是增强工作质量的确定性;人机协作的可审计轨迹正是达成这一目标的机制。非确定性(人与 AI 的判断)被三重结构围住:事前有契约(契约七件,4.1)、事中有门(放行只属于人;流程层另有审批点)、事后有痕(任务记忆与事件流,可回放可归因)。围住之后,质量不取决于个体发挥,而取决于契约与业务模型——可版本化、可审计、可持续进化的组织资产。

+
两级确定性,判据可测:结构确定性——无论 AI 怎么走,同一契约、同一活动基座、同一事件标准、同构留痕、有限终点(临场自由,结构铁笼);质量确定性——由两指标检验:自主率(干了多少)与纠正率(干坏了多少),复合为有效自主率 = 自主率 ×(1 − 纠正率)(08)。「AI 越多越确定」不靠宣称,靠仪表。
+ +

0.3部署边界

+

本系统服务企业:协调员工与 AI 高效开展经营活动。按单次部署 ≤ 50 人、单组织设计:不做多租户,治理角色由组织内兼任,一切机制的复杂度预算以此为上限。系统只对两类主数据拥有事实源——员工与工作(任务、工作流、记忆);客户、物料、订单等业务对象,或在活动声明的台账里(数据可自生长,07),或在外部系统里(以外部系统调用接入,事实源在外)。

+ + +

01五层总图

+
+ +
+
WORK OS · 五层总图(交互 / 流程 / 引擎 / 调用 / 基座 + 贯穿件 + 权力线)
+
+
交互SURFACE
+
+
交互层员工的责任面;组织的管理与编排面;零业务逻辑
+
+
工作台(员工面)五要素:任务 · 审批 · 消息 · 纪要 · 汇报 —— 责任被动响应 · 五要素同源投影(02)
+
治理台(管理面)九功能:任务 · 员工 · 工作流 · 触发器 · 活动库 · 工具 · 数据 · 记忆 · 系统(含 LLM 实例与通道实例)(02)
+
+
+
+
+
流程PROCESS
+
+
流程层工作如何被发起、串联与裁决;编排五要素,流转零 LLM
+
+
触发器(平级)周期 / 事件 / 登记三类 —— 流程层的系统级事件监听,经调用接口起单(03 / 06)
+
流程包 / 工作流流程包 = 调用接口 + 两种活动(声明)+ 审批点 + 两种网关;工作流 = 其运行时实例(03)
+
+
+
+
+
引擎ENGINE
+
+
引擎层工作流引擎 = 流程引擎 + 活动基座
+
+
流程引擎确定性流转:起单 · 调度节点 · 审批点卡工位 · 网关分合 —— 零 LLM;审批与网关模式由它承载
+
活动基座六件:契约 · 交互 · 记忆 · 数据 · 工具(调用契约)· LLM 调用 —— Agent 机制的通用运行模式(04)
+
两范式Case = loop(临场演绎 · 调度归 AI)· SOP = flow(照谱执行 · 调度归系统)—— 统一套执行契约
+
+
+
+
+
调用CALL
+
+
调用层一切能力的注册、授权与内外交互
+
+
系统调用本系统服务与外部系统(ERP / CRM):读 = 快照留痕,写 = 过放行(07)
+
LLM 工具模型能力封装的工具,白名单授权 —— 与基座的 LLM 调用不同物(07)
+
人类工具四卡:决策 · 执行 · 补全 · 放行 —— 人在环是被调用的工具(05)
+
通道邮件 / IM 收发:入站经归属解析进统一事件流(06)
+
+
+
+
+
基座BASE
+
+
基座层事实、记录、能力与工件的存放;零业务逻辑
+
+
数据主数据:员工 · 岗位 · 权限 · 共享对象目录
+
台账活动声明的业务数据表:schema 声明 · 宿主物化 · 统一治理
+
记忆任务记忆归档库(单单封卷)· 活动记忆库(跨单持久)(08)
+
工具箱功能工具之库 —— 独立开发注册入口(07 / 11)
+
活动库已安装活动之库 —— 独立安装卸载入口(11)
+
流程包治理台编排的结构定义;工作流 = 其运行时实例(03 / 11)
+
+
+
+
贯穿 · 统一事件标准系统向活动只以统一信封抛四类事件(数据 / 时间 / 人 / 控制);一条事件流,三级消费:任务监听 → 触发器 → 消息(06)。
+
贯穿 · 外装件两类活动包 → 活动库,工具包 → 工具箱 —— 活动在系统外,模式在系统内;改业务 = 换外装件或改流程包,不改系统。
+
权力线 · 调度权分层工作流 → 系统 · flow 活动 → 系统 · loop 活动 → AI · 放行 → 人 —— 确定交系统,临场交 AI,落地交人(04)。
+
+ +

交互定呈现与责任,流程定结构与流转,引擎定执行,调用定能力,基座定事实。实现拓扑上,系统是 web + server 两侧(09)。

+ +
+ + + + + + + + + + + + + + + +
术语定义
流程包 / 工作流流程包 = 调用接口 + 两种活动 + 审批点 + 两种网关的编排定义:治理台在系统内编排,版本化存放于基座;工作流 = 流程包的运行时实例(03)。
活动一个完成一项任务的 Agent 机制的开发态:基于活动基座在系统外开发,经活动库安装,以声明入流;两种:案例活动(loop)与标准活动(flow)。
任务活动的运行态:活动被调起的一次运行;恰有一个负责人;工作台「任务」要素的单位。
Agent 机制活动完成任务的机制本体,范式两种:loop(临场演绎)与 flow(照谱执行);业务模型、交互内容、技能清单、Harness 与过程工作区皆随活动(《活动模型》)。
活动基座落在系统内的通用运行模式,六件:契约 · 交互 · 记忆 · 数据 · 工具(调用契约)· LLM 调用;内容归活动,笼子归系统(04)。
活动包 / 活动库活动的交付单元 / 已安装活动之库(独立的安装与卸载入口,11)。
工具包 / 工具箱功能工具的交付单元(独立开发的代码包)/ 其注册入口与库(07 / 11)。
人类工具调用层四种内置工具:决策 · 执行 · 补全 · 放行——与 LLM 工具同列;经对话流卡片到达人,回传异步(05)。
审批点流程层的通用人裁节点:卡到审批人工位,通过 / 驳回,附依据;与活动级的放行不同层(03 / 05)。
事件信封系统向活动抛事件的统一标准:ID · 类型 · 关联 · 载荷 · 时间与来源 · 留痕指针;四类:数据 / 时间 / 人 / 控制(06)。
任务记忆一单任务的会话历史 = 消息历史 + 引擎事件流,同轴按时间全序;只追加;续跑、审计、回放的依据与蒸馏源(08)。
活动记忆关于一个活动的跨实例持久事实,四层结构,为优化业务模型而设计;记忆不载权力(08)。
放行人对任务成果的落地裁决:放行通过 / 驳回重做 / 驳回迭代;完成只出自放行通过——落地预检过关才发卡,放行即落地,落地收敛终态方成(05 / 7.3 / 09)。
对话流 / 视图区工作台-任务的交互结构:对话流是唯一回环输入口;视图区是只读呈现容器,内容由后端流控推送(09)。
+ + +

02交互层:工作台与治理台

+
+ +

交互层只有两个面:工作台面向员工,治理台面向组织的管理者。面上零业务逻辑——呈现的一切都来自下层的事实与投影。

+ +

2.1工作台五要素

+

工作台是员工的责任面:它回答「现在哪些事等我、我裁过什么、与我相关的发生了什么、我们沉淀了什么、我干了什么」。员工不需要在系统里"找工作干"——责任被系统推到工作台上,员工被动响应;主动动作只有一类:维护纪要。

+
+ + + + + + +
要素性质内容
任务责任 · 被动响应一个活动(标准活动或案例活动)的一次运行,落到恰一名负责人的工作台
审批责任 · 被动响应工作流中的审批点,卡到审批人工位:通过 / 驳回,附依据
消息信息 · 被动响应系统通知与跨任务征答:通知(承载触发器的邮件和消息、一般公告、提醒与告警)+ 他人任务发来的人类工具卡(以系统消息送达,就地作答,2.1)
纪要团队主动维护上传会议纪要等团队沉淀;决议可经登记触发转为工作流的启动(3.1)——登记人即来源
汇报自动按日、周、月、年自动总结此员工的工作汇报——由本人各任务的任务日志聚合生成(8.1),确认即提交,零手工汇报
+
    +
  • 责任与信息分明——任务与审批是责任:有完成与裁决语义,恰有其主;负责人 / 审批人的变更只经治理台改派,改派留痕并通知双方;消息是信息,不产生责任;纪要是团队的主动沉淀;汇报是系统代劳的自动产出。
  • +
  • 活动内的人环不另立要素——活动执行中对人的调用(决策、执行、补全、放行四卡,05)按被调用人分两个到达面:发给负责人的卡出现在该任务自己的对话流里;发给其他人的卡以系统消息送达对方的消息要素,就地作答——任务要素永远只装"我负责的任务",跨人卡是一次性的解答请求,不是责任转移;作答权限只及卡面与决策包,不开放任务对话流。回传经统一入口写回任务,调用与回传全程在任务侧留痕。任务侧不满意可驳回重答:驳回即新发一条系统消息(新卡实例,附驳回理由与原答引用),原卡闭合——每次请求与回答都是独立消息,只增不改。工作台层面的「审批」专指工作流级的审批点。
  • +
  • 五要素同源——做事与留痕是同一个动作:五要素都是同一份过程事实(任务记忆与工作流事件)在员工视角下的投影——汇报是它的时间聚合,消息是它的相关性过滤,不存在"干完活再补记录"。
  • +
+ +

2.2治理台九功能

+

治理台功能清单九项——每一项对应架构中的一件,治理台由此覆盖全部五层:

+
+ + + + + + + + + + +
功能管什么对应
任务管理运行态:任务与工作流(两级运行时实例)的在途监控、干预与控制(叫停 / 暂停 / 终止,即控制事件,06);查看任意任务的任务日志(8.1);改派——在途任务与待答卡片的负责人 / 审批人变更,改派留痕并通知双方引擎 · 流程层
员工管理员工、岗位、权限——权限按岗位授予:客体三类(数据:域.对象[.字段] / 治理功能 / 任务),动作三种(读 / 写 / 治理);任务负责人与被征答人对所涉内容天然可见;停用前置检查——员工停用前,其在途任务与待答卡须先改派完毕基座 · 数据
工作流管理设计态:流程包的五要素编排(03)与版本;编排即定契约——画完工作流图可导出活动开发的依赖文件(11)流程层 · 基座 · 流程包
触发器配置触发器的创建、配置与启停——定义调用工作流的时机(周期规则与事件规则);触发器与工作流平级、不属于工作流,不随流程包版本;触发器 = 流程层的系统级事件监听(06),经调用接口调起流程包流程层 · 基座(系统自持)
活动库管理活动包的安装、卸载、版本并存与引用查询——独立入口(11);库内按业务分类(一级,组织自定)× 活动类型(标准 / 案例)两维管理,两维平级、相互独立基座 · 活动库
工具管理工具包注册、白名单与授权、账号 / 密钥 / endpoint 配置调用层 · 基座 · 工具箱
数据管理主数据、共享对象目录、台账治理(脱敏、保留期、权限)基座 · 数据与台账
记忆管理任务记忆归档与活动记忆库的治理基座 · 记忆
系统管理系统配置,含 LLM 实例(创建自定义名称模型:Provider(开发支持的厂商枚举)/ URL / API-Key / Model name;活动以名称声明引用)、通道实例(邮箱、IM 接入;归属键提取规则与默认认领岗位,6.2)与系统用途模型绑定(系统自身的 LLM 消耗点——叙述性小结、汇报生成、蒸馏钩子——绑定专用模型实例与预算,计量入系统账、不占活动预算)管理引擎 · 调用层
+

治理动作本身留痕入事件流——治理也被治理。

+ + +

03流程层:流程包、工作流与触发器

+
+ +

流程包 = 调用接口 + 两种活动 + 审批点 + 两种网关的流程编排;工作流 = 流程包的运行时实例。包与实例两级对称:流程包 → 工作流,活动 → 任务——包在库,实例在跑。

+

编排层的基础要素有五:活动(声明)、审批、网关、触发器、流程包——活动、审批、网关是流程包内的节点要素,触发器与流程包是平级的顶层要素;治理台的编排就在这五种要素上进行。其中活动以声明入流:编排引用的是活动库中已安装的活动,安装与卸载走活动库的独立入口(11),不在编排中发生。

+ +
+ + + + + +
构件职责要点
调用接口流程包的唯一出入口声明输入契约与输出声明;触发器与上游系统一律经此调起;流程包声明显式终点,工作流完成时末端输出载荷按输出声明交付、按来源回执——登记人收消息回执,上游系统收回调
活动(两种)责任单元标准活动(flow)与案例活动(loop);节点以声明引用活动库中已安装的活动,恰有一名负责人;任务 = 活动的运行时实例——活动被调起的一次运行即一单任务
审批点(通用)工作流级的人裁节点功能属性四件:审批岗位(复用负责人四策略解析)· 输入装配映射(审批人所见载荷,复用边机制)· 驳回走向(声明式:回指定节点重开新实例(带载荷映射)/ 终止,不由临场决定)· 催办阶梯(时限机制复用:提醒 → 升级)
网关(两种)路由并行(AND:分叉与汇合)与异或(XOR:条件路由,判定依据入事件记录);条件声明式、静态可检,不得内嵌自由逻辑
+ +

边与载荷映射:连线即映射,画图即校验,不闭合不得发布。流程包的每条边携带输入装配映射——上游输出口载荷字段 / 流程变量 / 起单载荷 / 常量 → 下游活动契约的 data 字段,允许 S-FEEL 表达式做转换;与触发器的字段映射同一形式(3.1)。编排画布强制契约前后约束:连一条边即须完成该边映射(编排器就地给出上游载荷与下游必填字段的对照,必填未映射 = 边未完成),类型兼容依两端契约 schema 当场校验;存在未完成边、未满足必填或类型冲突的流程包可存草稿、不得发布。两种连线情形同受此约束:引用已安装活动,对活动库中的契约校验;新活动(未开发),契约的输入输出在编排中就地定义、随边成形——依赖文件的输入输出声明由此生成(11.1)。AND 汇合后的同名字段必须显式指定来源分支,不做隐式合并;message 由编排声明模板(可插值载荷字段),缺省为空。

+ +

负责人与审批人解析:编排声明岗位,起单时确定性解析。活动节点与审批点声明岗位与解析策略,策略封闭四选:指定人(直接绑定员工,慎用)/ 岗位唯一人 / 轮值(岗内以在途任务数最少者优先)/ 来源跟随(复用同一工作流内该岗位已解析出的人,保持一单一人的连续)。默认:岗位唯一人;岗上多人时按轮值。解析发生在节点起单时,结果与依据留痕;岗位空缺按该节点的失败走向处置,或转治理台待指派;运行中变更走治理台改派(02)。

+ +

失败走向:每个活动节点可声明,封闭四选,默认终止流。节点以非完成终态结束(受阻、熔断、耗尽等)时,按其声明的失败走向处置:终止流(默认)——工作流转「异常」,通知治理台 · 任务管理,人工处置;改道——声明一条备选边(失败载荷 = 终态、原因码与说明,备选边同带载荷映射);升审批——失败落到指定审批点,由审批人裁决:重开新任务实例 / 改道 / 终止流;容忍(仅限 AND 分支)——显式声明该分支失败不阻汇合,静态校验其下游映射不得依赖该分支的必填字段。流程层不自动重试活动(过程内重试归 Harness);流级重做一律是人裁决后重开新任务实例——同一节点、新任务 ID、留痕关联,不复活旧任务。

+ +

3.1触发器

+

触发器 = 基于周期、事件或登记触发的工作流启动调用。在统一事件标准下,触发器就是流程层的系统级事件监听(06):消费同一条事件流,动作是起单。三类:周期触发——再分两型:日历型(纯日历规则:对账日、周报周期)与数据日历型(按台账日期字段 + 偏移 + 过滤条件逐行起单,如「合同到期前 N 天」;同一行同一日期只触发一次,字段值变更后可再触发);事件触发(通道入站命中规则、台账数据事件);登记触发——人工起单的统一形态:登记人选择流程包、按调用接口 schema 填写输入(表单由 schema 自动渲染)、提交即起单;纪要决议转起单即经登记触发。

+

触发器输入装配——事件触发的触发器配置含声明式字段映射:事件信封与载荷字段 → 调用接口的 data 字段;缺必填字段则起单失败、入死信。周期触发以规则求值结果装配;登记触发以登记表单为输入。

+

触发器与工作流是平级概念。触发器的配置定义的是调用工作流的时机——它不属于工作流:不入流程包结构,不随流程包版本,配置与启停在治理台独立进行(02),配置存于基座的系统自持存储(11)。触发器只负责「起单」,经调用接口调起流程包、生成一条工作流;流程包与活动内部不含任何触发逻辑。同一个流程包可以被多个触发器调起,同一个触发器也只知道调用接口、不知流程内部;触发器的增删启停不改流程包的任何版本。凡单必有来源:每条工作流的来源可追溯——触发器即来源;纪要登记起单的,登记人即来源。

+ +

3.2组合语义与构件来处

+
    +
  • 两级组合——流程包串活动(运行时即工作流串任务),是责任级组合:每个节点有负责人、有契约、有裁决;活动内 Agent 机制自治,是方法级执行:怎么做由活动自带的范式与业务模型决定(《活动模型》)。流程层的流转本身零 LLM:路由、汇合、审批点的推进全部确定。
  • +
  • 构件来处分两边——活动是经活动库安装进来的外部件;审批点、网关与触发器是系统内置的要素:落在系统内,声明 / 配置即用,零开发。一个流程包里,需要开发的只有活动。
  • +
  • 工作流状态是聚合投影——由流内各任务的状态按固定规则聚合推导,流程层不另设状态机。聚合的计量对象是节点实例(重开产生新实例,旧实例已终,不再入算)。聚合规则:任一节点实例运行中 → 运行中;无运行实例且存在待人 / 监听 → 等待中;全部已激活的节点实例收敛(完成或已消化)且无在途实例 → 已完成——XOR 未选分支从未激活、不入集合,容忍分支以"已消化"计;被控制事件终止 → 已终止;任一实例以非完成终态结束且其失败走向未消化(终止流待人工处置中)→ 异常;改道、容忍与升审批一经生效即为消化,不入异常(03 失败走向)。
  • +
+ +

声明条件的表达语言——系统侧一切声明式条件(XOR 网关条件、触发器事件规则、监听过滤条件)统一采用 FEEL 表达式子集(S-FEEL):比较、逻辑、算术、字符串与日期函数,无外部调用,静态可检。求值输入:网关处 = 流转载荷与流程变量;触发器处 = 事件信封与载荷字段;监听处 = 事件信封与载荷字段。周期规则 = 日历表达式 + 日历偏移(支持「日期字段 − N 天」式)。节点间的载荷映射与触发器字段映射同一形式(03 边与载荷映射)。

+ + +

04引擎:流程引擎 + 活动基座

+
+ +

工作流引擎 = 流程引擎 + 活动基座。

+
    +
  • 流程引擎——确定性流转:接收调用接口的起单、按结构调度节点、把审批点卡到人的工位、执行网关的分合、把每次流转记入事件。零 LLM、零临场;审批与网关的模式由它承载。
  • +
  • 活动基座——活动 Agent 机制的通用运行模式,落在操作系统内;引擎为每单任务在基座上运行该活动的 Agent 机制。
  • +
+ +

4.1活动基座六件

+

活动基座对所有活动同一份。活动在系统外开发时,面对的就是这六件的接口;安装进来,跑在同一副基座上:

+
+ + + + + + + +
构件内容职责
契约契约七件:输入(data + message)· 输出口(必发 / 选择)· 必交付物 · 验收判据(分级标注:L1 形式校验 / L2 机检 / L3 抽验 / L4 独立评审 / L5 人放行,不得谎报等级)· 禁区 · 授权边界 · 资源声明活动对外的全部承诺;两种范式同一契约格式——"统一套执行契约"的锚点;《活动模型》自开发视角展开同一份七件清单
交互工作台-任务的对话流 + 视图区容器交互的结构骨架:对话流是任务的人机时间线、一切回环输入的唯一入口;视图区是活动渲染的只读呈现容器——结构归基座,内容归活动。控制权共同持有、按态转交:活动激活时归活动(视图流控与对话输出由活动驱动),流程流转时归系统(流转、审批与终态呈现由系统驱动);输入侧不转交,永远走系统单入口
记忆任务记忆 + 活动记忆任务记忆 = 会话历史(消息历史 + 引擎事件流,同轴按时间全序),框架自动记录、只追加;活动侧唯一接口 = 窗口配置(每次 LLM 调用加载多少轮)。活动记忆 = 结构化记忆,基座只提供存与取,结构归活动侧,为优化业务模型而设计(08)
数据(台账)「数据域.数据对象.字段」三级寻址 + 通用事务性接口活动对数据与台账的一切操作按数据域.数据对象.字段声明寻址;数据库提供通用事务性接口(增删改查与事务,对所有活动同一套);安装时系统检查数据表,依活动声明自生长。声明语义:声明的是活动要用什么字段,不是对象该定义什么字段——对象的实际 schema = 全部使用声明的最大化合并(并集);定义只增不破坏:声明永不缩表、不删改已有字段,清理归档是数据管理的治理动作、不经声明发生(11)。同名字段类型不一致时,以能兼容双方的最宽类型落地(放宽即增,不破坏),静态审提示、不阻塞;语义互斥不可兼容的极端情形才拦下,交数据管理裁决。运行中的写入落任务级草稿层,放行时合并入正式版(09)
工具(调用契约)白名单工具的调用契约活动只经调用契约使用工具;系统调用、LLM 工具、人类工具与通道皆以工具形态自调用层供给(07),功能工具经工具箱注册;授权在白名单与契约,不在活动代码
LLM 调用(模型)声明自定义模型名称活动侧只声明自定义的模型名称(逻辑名);名称在系统侧创建与绑定——Provider(系统通过开发支持的厂商枚举)/ URL / API-Key / Model name 四元配置(治理台 · 系统管理,02);活动不触厂商与密钥;模型与版本记入留痕,行为可归因
+
基座即笼子:契约限承诺、工具限能力、交互限入口、记忆与留痕限事实、数据限归属、LLM 调用限模型——内容归活动,笼子归系统。活动代码无环境能力,一切能力经调用契约注入,越权在结构上不可能。
+
系统不提供统一沙箱:过程工作区(草稿箱)由活动按需自设、不与范式绑定;系统不管草稿怎么组织,只认放行门——放行前不落事实(09)。权力边界由调用契约与白名单承担,不依赖运行时隔离。
+

预算与熔断由活动基座在环外强制执行——活动仅在 Harness 配置中申报参数,不自查自守。计量口径:步 = loop 的一次决策循环 / flow 的一个声明步;token = LLM 调用出入 token 累计;时长 = 活跃时长(Agent 机制运行与工具执行的时间;挂起、监听等待、待卡回传不计入——熔断不误杀等待中的任务;时限阶梯另用日历时长,06);调人次数按卡计。任一项越限,基座抛控制事件并挂起任务,处置归治理台 · 任务管理(02)。

+ +

4.3任务终态名录(系统裁定)

+

完成由框架裁定,终态由系统命名——任务终态是封闭枚举,五名:

+
+ + + + + + +
终态语义触发者
放行完成唯一成功终态:放行通过且落地收敛,输出口已发射放行卡 + 落地执行(7.3)
受阻待人无法推进,封卷待治理处置——处置 = 改派 / 重开新实例 / 终止Agent 机制申报,或治理台判定
停滞熔断停滞检测触发:该动未动、超限仍无推进预算执行器(04)
预算耗尽步数 / token / 活跃时长 / 调人次数任一越限预算执行器(04)
被终止控制事件 · 终止,含工作流终止的级联(06)治理台 / 负责人
+

不是终态:驳回(重做 / 迭代)是环内回转,任务继续;叫停是控制事件,挂起待恢复;落地受阻是运行态(7.3)。非完成终态触发节点的失败走向(03);终态分布入度量(8.3)。

+ +

4.2两范式,一套契约;调度权分层

+

两种活动的 Agent 机制范式不同——Case 是 loop(装载 CMMN + DMN 临场演绎),SOP 是 flow(按声明步序照谱执行)——但统一套执行契约:活动基座的六件对两种范式完全一致。差异被压缩到唯一一处:Agent 机制的范式与业务模型的形态。对流程层与交互层而言,两种活动不可区分地是"一个节点、一单任务"。

+
+ + + + + +
对象调度权形态
工作流(流程层)系统流程引擎照结构流转:路由、汇合、审批点推进,零 LLM
flow 范式活动系统引擎照声明步序推进,零临场调度
loop 范式活动AIAgent 机制在业务模型的结构上临场决断下一步
放行(处处)人任务完成只出自放行通过(05);流程节点间裁决归审批人
+
确定交系统,临场交 AI,落地交人。一个活动选 flow 还是 loop,本质就是把这件事的调度权交给系统还是交给 AI——范式的边界即调度权的边界;无论谁调度,放行权都不移交。
+ + +

05人类工具:四种通用卡

+
+ +

活动过程中对人的调用,收敛为四种人类工具。定位上它们与 LLM 工具同列——都是调用层的内置工具(07):AI 在环内调用人,与调用任何工具同构,经调用契约、受白名单与授权约束;差别只在通道与时延——人类工具经对话流到达人(卡片),回传异步。这正是本系统的出发点:人在环是一种被调用的工具——何时调、调哪种,loop 里由 AI 临场判定,flow 里由步序声明给定;人不驱动过程,人被过程调用。卡片结构与回传协议归系统,内容由活动填充。

+ +
+ + + + + +
工具AI 输出(卡面)人回传
决策分支条件选择表:可选分支、各自条件与后果、依据快照、AI 建议选定分支,可附理由
执行作业指导书 + 结果回填表格:做什么、怎么做、完成标准按表回填结果,凭证随附
补全补全需求 + 回填表格:缺什么、为何需要、格式要求按表回填
放行成果清单 + 放行选择表:交付物、验收判据与依据三选一:放行通过 / 驳回重做 / 驳回迭代,驳回必附意见
+ +
+
FIG-02 · 人类工具四卡协议AI 组卡 → 对话流 → 人回传 → 人事件 → 环续跑
+ + + + + + + + + Agent 机制 · server(后端) + + 判定需要人 + loop:AI 临场判定 + flow:步序声明给定 + 组卡:上下文 + 依据快照 + 无上下文的裸调用不得发出 + 调用经调用契约 · 白名单授权 + + 对话流 · web(唯一回环输入口) + + 决策卡 —— 分支条件选择表 + + 执行卡 —— 作业指导书 + 结果回填 + + 补全卡 —— 补全需求 + 回填表格 + + 放行卡 —— 成果清单 + 放行选择表 + 放行通过 / 驳回重做 / 驳回迭代 —— 驳回必附意见 + + 人 · 工位(异步) + + 卡上作答 · schema 校验 + 选择 / 回填 / 三选一 + 回传随卡留痕 —— 学习信号: + 补全 = 缺口标注 + 决策 + 理由 = 偏好样本 + 驳回 + 意见 = 批评信号 + + + 调用 · 卡面 = AI 的结构化输出 + + 到达工位 + + 人回传 → 人事件(统一信封,06)→ 投递回任务 → 环续跑 + + + 三规矩:调用必附上下文 · 回传即留痕 · 完成只出自「放行通过」 —— 人不驱动过程,人被过程调用 + 放行卡是活动级的门;流程层的审批点是另一层裁决 —— 二者不可互相替代(03) + +
+ +
    +
  • 调用必附上下文(必须)——每张卡自带足够的依据与快照,人无需进系统翻找即可作答;无上下文的裸调用不得发出。
  • +
  • 回传即留痕(必须)——谁、何时、答了什么、依据什么,随卡入任务记忆;人的回传天然是学习信号:补全 = 缺口标注,决策 + 理由 = 偏好样本,驳回 + 意见 = 批评信号。
  • +
  • 完成只出自放行(必须)——任务的完成只能出自放行卡的「放行通过」,并在此刻触发草稿态 → 事实态的落地(09);驳回重做 = 按原要求重新执行,驳回迭代 = 带意见改进现稿后再提。
  • +
+
放行与审批点不可互相替代:放行卡是活动级的门——保证每份产出有人认账,撤了它,产出无主;审批点是流程层的裁决——保证跨任务的关键走向有第三方把关,把它塞进活动,活动就失去独立性。任务完成靠放行,节点间裁决靠审批点。
+ + +

06事件:系统向活动抛出的统一标准

+
+ +

活动以事件监听声明它对外界的一切依赖,系统按统一事件标准投递。监听是接口的契约:活动只声明"听什么、听到了怎么办";挂起、恢复、路由、去重全部归系统。

+ +

6.1事件信封与四类事件

+
+ + + + + + + +
信封字段内容
事件 ID全局唯一,幂等键——重复投递可去重
类型四类之一(下表)
关联消费目标:目标类型 + 目标 ID(任务 / 触发器 / 工作流 / 消息收件岗位);起因:数据对象 / 卡 ID / 定时器 ID
载荷schema 化内容,附原件指针(如邮件原文的存档地址)
时间与来源发生时刻 · 来源(通道 / 引擎 / 工位 / 治理台)
留痕指针事件存储位置(先持久后投递);投递入任务后另记任务记忆指针——事件流与记忆同轴;无任务目标的事件仅有存储位
+
+ + + + + +
类型内容例
数据事件任务相关数据对象的写入与变更;环外回音(邮件、人工代收)经归属解析归一为数据写入后,以数据事件抛出——活动认数据,不认通道;数据事件只由正式版写入产生(系统写与放行写,09),草稿写不抛事件客户回信已写入台账,附原件指针
时间事件定时器到点:监听时限、约定时点、周期检查等待第 3 天未回,时限事件
人事件人类工具卡的回传到达(05),与负责人的主动输入——对话流自由输入:写入任务记忆,loop 作为观察,不驱动 flow 步放行卡回传:驳回迭代 + 意见;负责人留言「客户来电改期」
控制事件治理台与负责人的指令,三种语义:暂停 = 可恢复冻结(监听与时限停摆)· 叫停 = 负责人紧急中断(挂起并记最重档纠正,恢复归负责人)· 终止 = 不可恢复关闭——工作流终止级联:在途任务终止、待答卡与征答消息作废、审批点撤卡负责人叫停
+ +

6.2归属解析:入站到事件的规则

+

通道入站(邮件、IM)到统一事件流之间,由归属解析完成路由。解析依据是通道实例配置中的归属键提取规则(声明式):会话 / 线程 ID、往来地址、正文模式(如单号正则)。匹配次序确定、逐级短路:

+
    +
  • ① 线程精确匹配——会话 / 线程 ID 精确匹配某在途任务的出站记录,即有主。
  • +
  • ② 关联键匹配监听——提取的关联键命中某任务监听的过滤条件,即有主。
  • +
  • ③ 地址 + 时间窗——往来地址在时间窗内匹配唯一在途任务,即有主;命中多个即无主。
  • +
+

提取失败或歧义一律降级为无主——宁交人,不错投;无主入站的"相关人" = 通道实例配置的默认认领岗位(治理台 · 系统管理)。有主入站归一为数据写入——写入目标由通道实例配置的载荷映射给定(提取字段 → 域.对象.字段,与边映射同一形式),原件存档为附件对象,以数据事件抛出。有主 ≠ 必须唤醒:归属解析命中的任务,事件一律写入其任务数据与任务记忆(记录);是否推进由监听命中决定——零命中时仅记录,不降级为无主、不入消息兜底(它有主,只是当下无人等它;loop 在后续观察窗口内自然可见)。消息兜底只针对无主事件。

+ +

6.3监听声明与投递语义

+

监听声明——活动声明监听,两种立法:静态(随业务模型:loop 的前提条件、flow 的步完成条件)与动态(运行中由 Agent 机制临场登记,如发出报价邮件后登记"等回信"监听)。每条监听 = 过滤条件(事件类型 + 关联键,条件用 S-FEEL,03)+ 处理语义(loop:事件即观察;flow:事件即步的完成条件)+ 时限(必配:到期抛时间事件——无死等,无来源又无时限的监听安装时拒绝)。

+ +
+
FIG-03 · 一条事件流,三级消费事件源 → 归属解析与信封 → 任务监听 / 触发器 / 消息
+ + + + + + + 事件源 + + 通道入站 + 邮件 · IM 回音 + + 定时器到点 + 监听时限 · 周期 + + 人类工具卡回传 + 四卡作答 + + 台账数据写入 + 含人工代收回填 + + 治理台指令 + 叫停 · 暂停 · 终止 + + + + + + + + 归属解析 → 事件信封:ID(幂等键) · 类型(数据 / 时间 / 人 / 控制) · 关联 · 载荷 + 原件指针 · 时间与来源 · 留痕指针 + 先持久后投递 —— 事件先落存储与任务记忆,再投消费方 · 同任务按序 · 至少一次 + 幂等(去重由基座代劳) + + 监听与触发独立判定 · 皆未命中 → 消息兜底 + + + + + + ① 任务监听 —— 推进旧单 + 过滤:类型 + 关联键 · 时限必配 + loop:事件即观察 + flow:事件即步的完成条件 + 投递到任务,环续跑 + + ② 触发器 —— 开新单 + 流程层的系统级事件监听 + 命中起单规则 → 经调用接口 + 调起一单工作流 + 同一事件流,不另设通路 + + ③ 消息 —— 无主交人 + 落相关人的消息要素(02) + 人工认领 / 代收回填 + 代收走同一数据写入口 + 回填即数据事件,再入流 + + + 一条事件流,三级消费 —— 活动认数据,不认通道:环外回音先归一为数据写入,再以数据事件抛给任务 + 处理有回执:失败重投,超限入死信 → 系统通知送达消息要素与治理台 · 悬空监听安装时拒绝 —— 无死等 + +
+ +

投递语义——系统侧五条承诺:

+
    +
  • 先持久后投递——事件落存储与任务记忆,再投活动;任务挂起不丢事件,恢复即补投。
  • +
  • 同任务按序——同一任务的事件按发生序投递。
  • +
  • 至少一次 + 幂等——投递保证至少一次;活动侧按事件 ID 去重由基座代劳,重复投递无副作用。
  • +
  • 处理有回执——处理完成落痕;失败重投,超限入死信——死信以系统通知送达相关人的消息要素(02)与治理台 · 任务管理。
  • +
  • 扇出与幂等——同一事件可命中多个任务监听:系统为每个命中任务生成一份独立投递(各带投递 ID,信封「关联 = 任务 ID」保持单目标);同一事件对同一触发器至多起一单,以事件 ID 为幂等键。
  • +
+

一条事件流,三级消费:任务监听(推进旧单)与触发器(起单规则,开新单)相互独立判定——同一事件可既推进旧单又起新单;消息是兜底:仅当既无监听命中亦无触发命中时,入站事件落相关人的消息要素(02,人工认领 / 代收)。触发器由此获得统一定义:流程层的系统级事件监听——监听同一条事件流,消费动作是"经调用接口调起流程包、生成新工作流"。

+ + +

07调用层与工具箱

+
+ +

系统调用、LLM 工具、人类工具以及通道在调用层。调用层是一切能力的注册与授权之地;能力以工具形态、经活动基座的「工具(调用契约)」供给活动(04):

+
    +
  • 系统调用——本系统服务与外部系统的调用。ERP / CRM 等企业系统一律以外部调用方式接入——读取即快照留痕;写入即触达外部世界,须过放行,动作集中在放行时点落到事实(09)。
  • +
  • LLM 工具——以模型能力封装的工具(抽取、翻译、生成等),与其他工具同列白名单、同受授权约束;与基座的「LLM 调用(模型)」不同物——后者驱动 Agent 机制自身的推理,LLM 工具是机制可调用的一种能力。
  • +
  • 人类工具——四种内置工具:决策、执行、补全、放行(05)。调用经卡片到达人(负责人 = 任务对话流;其他人 = 系统消息,2.1),回传异步回环;人是环内可调用的一种能力,同受授权约束——哪些活动能调人、调谁、调用预算(打扰上限),在契约与白名单;「调谁」按岗位声明,收件人以四策略解析(03),缺席走时限阶梯。
  • +
  • 通道——邮件、即时消息等收发通路。出站是触达世界的动作;入站经归属解析进入统一事件流(06)——有主的归一为数据事件抛给任务,无主的走触发器判定与消息兜底。
  • +
+ +

7.1工具三来处与工具箱

+

调用层四类是供给形态——皆以工具形态经调用契约供给活动;按开发与固化形态,工具分三来处:

+
+ + + + +
来处机制治理
功能工具系统调用类能力的交付形态:按需开发的业务能力,是独立开发的代码包——经基座的工具箱注册进系统(11),入白名单;账号、密钥与 endpoint 配置随工具归组织;工具包规范见 7.3先系统、后活动;活动只声明引用其调用契约
LLM 工具 · 人类工具固化在系统里,随系统迭代而更新;声明即用白名单授权;模型实例与工位由治理台配置
纯工具无外效应(计算、转换、操作自持台账),可随活动包自带安装时注册进工具表、经运行时调用而留痕,不得内联绕过
+
数据可以自生长,权力不可以自生长。台账凭 schema 声明由宿主物化,随活动进来即可"长"出来——安全,因为声明不带能力;功能工具承载权力(授权、密钥、触达世界),永远先系统、后活动。开发时序以契约先行解耦:缺什么工具先定调用契约,活动对着契约开发(本地 mock),平台照契约实现注册,安装静态审收口——缺口只阻塞上架,不阻塞开发。
+ +

7.2外部系统:事实源在外

+

ERP / CRM 等存量系统:事实源永远在外,以外部系统调用接入——注册在工具箱与白名单上的调用接口,读 = 快照留痕,写 = 过放行;不做库对库同步,不搬事实源。无存量系统承载的对象,以台账声明物化承载,数据资产随运行沉淀——混合是常态:按对象逐个选择「调用接入」或「声明物化」,活动只依赖调用契约与共享对象目录,不依赖任何具体事实源。

+

权力边界在此收拢:能力在调用层(注册、白名单、授权),方法在活动内(技能)。技能基于工具、在活动内定义,载方法不载权力——不能扩大任何授权,只沉淀"怎么用好"(《活动模型》)。

+ +

7.3工具包规范

+

一个功能工具以一个工具包交付:独立开发的代码包,经工具箱注册进系统。工具承载权力,约束严于活动包,三面分离:契约对活动,实现对系统,凭证对治理台。

+ +
+ + + + + +
构成内容
调用契约
(对活动的唯一暴露面)
工具名(全局唯一逻辑名)· 描述(面向 AI 的适用说明:何时用、语义、边界)· 入参 / 出参 schema · 效应等级(读 / 写) · 错误约定(结构化错误码 + 可重试标志)· 幂等性声明 · 超时与重试默认值
实现server 侧执行代码;运行时受限——只可访问注册申报的连接目标,无其他环境能力
连接配置声明endpoint / 账号 / 密钥的键(值不入包):注册时在治理台绑定值,可按环境绑定不同实例——与 LLM 实例的名称间接层同构
契约测试集样例入参 → 期望出参形状;注册试运行审与回归的依据
+

四件构成合成工具包的包清单(manifest),与活动包清单同构(11.1);注册两审:静态审读清单,试运行审验代码。

+ +

效应等级决定运行时待遇:

+
    +
  • 读类——无外部效应;过程中可自由调用(白名单内),读取即快照留痕。
  • +
  • 写类——触达外部系统与世界;过程中登记为动作意向(入参冻结,存入草稿态),放行后由系统执行落地,执行结果回填任务记忆;契约显式预授权的写类动作可在过程中即时执行,预授权必须逐项列举。
  • +
  • 落地预检(必须)——检查可落地,才允许放行:发放行卡前,系统对全部动作意向执行预检——入参 schema 校验、工具可用(未停用)与授权有效、连接可达、目标预校验(工具契约含 validate 能力时)、数据冲突检查(草稿层所改字段与正式版的并发冲突:他单已改同一字段即预检不过,打回环内基于新正式版重拟);预检全过才发放行卡,卡面呈现的即已验证的动作清单;预检不过的意向打回环内修正,不发卡。放行通过即刻执行(附幂等键);预检与执行之间世界突变导致的残余失败,按工具契约重试,超限转「落地受阻」——落地受阻是任务的运行态,不是终态:处置后仍收敛于契约的终态名录(重试成功 → 放行完成;放弃非必交付项后收敛;叫停走控制事件);失败动作生成落地失败卡送负责人(重试 / 线下完成后回填 / 放弃非必交付项 / 叫停)——落地失败卡是执行卡的系统预置形态(作业指导 = 失败动作与原因,回填 = 处置选择),不构成第五种卡;已成动作留存不回滚;输出口在落地收敛前不发射——下游只见落地完成的任务。
  • +
+ +
    +
  • 注册两审(必须)——静态审(签名、无动态执行、调用契约 schema 校验、效应等级核验、连接配置声明齐备)+ 试运行审(以 mock 绑定跑契约测试集,全过方可上架)。
  • +
  • 契约演进只增不破坏(必须)——出参只增字段;入参新增字段必为可选;破坏性变更 = 新工具名。版本并存,活动按声明的版本约束解析。
  • +
  • 凭证隔离(必须)——密钥与 endpoint 值只存治理台(工具管理),不入包、不入活动、不入留痕明文。
  • +
  • 停用与下线——有活动声明引用的工具不得删除;可停用——停用后调用返回结构化错误,活动按失败路径处理。
  • +
  • 调用运行时——一切调用经调用契约,入参快照、出参、时延与错误自动留痕入任务记忆;重试由系统按契约执行,写类动作执行时附幂等键;活动 Harness 对超时与重试只可收紧、不可放宽。
  • +
  • 纯工具的简化规格——随活动包交付,无连接配置、无外效应;注册进工具表(活动私有作用域)、经运行时调用留痕;安装静态审核其无环境能力。
  • +
+ + +

08记忆系统:任务记忆与活动记忆

+
+ +

一单任务的智能有两个来源:这一单里发生过什么(任务记忆),与这类事历来是什么样(活动记忆)。框架站在环内一切调用的必经之路上——记录不靠自觉,靠位置。

+ +

8.1任务记忆:一单一本

+

任务记忆 = 会话历史:消息历史 + 引擎事件流,同轴合流、按时间全序——Agent 机制的观察、思考、动作、结果逐条原生,引擎的流转、投递、门与卡裁决逐条结构化。四条性质(必须):

+
    +
  • 只追加——原始条目不得修改;信号可迟到,以后续条目回链原步(纠正、验收意见、客户回复都是迟到信号)。
  • +
  • 信封盖戳——每条盖版本信封:契约 / 业务模型 / 技能 / 模型版本 + 治理标记——行为可归因、历史可回放的前提。
  • +
  • 治理先行——脱敏、权限、保留期、可学习标记在留痕时刻打上;不合规的记录不得进入学习队列。
  • +
  • 归侧——每条按动作类型自动打四侧标签:机器产出 / 人产出 / 人裁决 / 世界等待——度量的口径来源,零埋点。
  • +
+

职能四:续跑(挂起恢复时由此重建上下文——记忆在,环可断可续)、审计(发生了什么)、回放(换个办法,这单会不会成)、蒸馏源(活动记忆的唯一原料)。生命周期:随单生、只追加长、终态封卷归档(基座 · 记忆,11)。

+

基座接口最小:任务记忆由框架自动记录,活动侧唯一可配置项是窗口大小——每次 LLM 调用加载多少轮会话历史;窗口之外的历史不进上下文,但完整在库——续跑、审计与回放永远对全量记录进行。

+ +

任务日志:任务记忆的两级投影。日志不是另一份记录——做事与留痕是同一个动作,不存在补写日志;任务日志由任务记忆按需生成:

+
    +
  • 结构化日志(零 LLM)——以引擎事件流为骨架(启动 · 工具调用 · 卡发出与回传 · 数据写入 · 动作意向 · 放行 · 终态),按事件类型筛选、模板措辞;每条自带谁 · 何时 · 依据 · 留痕指针;任何时刻可重算,口径与源恒一致;归侧标签使其天然分栏——机器做的 / 人做的 / 人裁的 / 在等谁。
  • +
  • 叙述性小结(LLM,可选)——阶段小结与终态封卷摘要;叙述是视图不是事实,每句可溯回原始条目,不入事实库。
  • +
+

消费方:工作台「汇报」按日 / 周 / 月 / 年聚合各任务日志(02);放行卡与审批点的过程摘要取自任务日志;治理台 · 任务管理可查看任意任务的任务日志(02);对话流时间线与日志同源、不同筛选。治理约束:投影不得比源暴露更多——日志继承任务记忆的治理标记,按读者权限裁剪生成。

+ +

8.2活动记忆:一类一本,为优化业务模型而设计

+

活动记忆是关于这个活动(事类)的持久事实,跨全部任务实例累积——结构化记忆:基座只提供存与取(条目的写入与检索),不解释语义;结构归活动侧,标准由《活动模型》规定。结构为迭代而设计——每类条目对准一个模型作用面:

+
+ + + + + +
层存什么优化谁
事实层环境与对手方的稳定事实:端点脾性、对手方节奏(客户均值 3 天回信)、术语与实体档案校准监听时限、判断阈值、DMN 输入项
模式层路径统计:动作启用频次与共现序列、阶段耗时分布、技能组合效果候选业务模型结构增量(阶段重组、新前提、新里程碑)
裁决层纠正沉淀:每次驳回(重做 / 迭代)、叫停与裁决理由,归纳为一般化陈述候选新前提条件、收紧验收判据、DMN 新规则行
例外层反例与禁忌:已知失败形态、边界案例、「此处留人」标记规则适用边界、负向条件、技能适用描述修正
+
    +
  • 条目三件套(必须)——归纳陈述 + 证据链(指回任务记忆的具体片段,可回放)+ 候选增量(可选:落到业务模型 / 技能的具体 diff,状态:候选 / 回放中 / 已放行 / 已否决);无证据链的条目不得入库。
  • +
  • 写入 = 蒸馏(必须)——只经蒸馏钩子(终态封卷、里程碑达成时)从任务记忆归纳;人可修剪;不设直写旁路。蒸馏钩子由封卷流水线(系统侧运行时)在任务终态后执行:模型用系统用途绑定实例(02),失败重试与死信同统一事件标准(06),产物默认候选。
  • +
  • 读出 = 装载——任务启动时按需选摘入 Agent 机制的上下文(渐进披露);流程引擎不读活动记忆(引擎零业务)。
  • +
+
记忆不载权力:活动记忆对行为只有参考力,没有强制力;强制力只有一条路——候选增量经回放与人放行进入业务模型本身(11 进化治理)。记住的影响裁量,放行的才约束行为——记忆的终点不是记住,是成为模型。
+ +

8.3度量:口径挂归侧与事件流

+
+ + + + + + + + + +
指标定义读法
自主率机器产出 ÷(机器产出 + 人产出);裁决与等待不进分母第一指标:AI 自主完成工作的比例
纠正率按提交批次计:每次放行提交 = 一个产出批次;驳回重做 / 驳回迭代 / 叫停 / 裁决推翻记该批纠正;纠正率 = 被纠正批次 ÷ 提交批次第二指标:自主的质;与自主率成对读——单看任一都会被优化坏
有效自主率自主率 ×(1 − 纠正率)「AI 越多越确定」的可测判据
打扰率每单任务调用人类工具的次数(四卡合计)应随资产成熟而下降;人环的带宽成本
断点率loop 中因"当下可为与目标所需交集为空"而调人或立监听的频次占比断点聚类是业务模型迭代的首要线索
DMN 覆盖率确定性求值(DMN 与机检)占判断次数的比例「临场搬进确定」的进度表
单位成本总消耗(token / 时长 / 调人)÷ 放行通过的任务数环是否真在产出
终态分布五个终态的占比(名录见 4.3)非完成终态偏高 = 契约或资产有缺陷
+

计量单位:归侧条目。产出以任务记忆的归侧条目计(机器产出 / 人产出各按其条目数);条目粒度随活动而异但活动内恒定——指标的主用途是同一活动的纵向趋势(口径自洽);跨活动横比仅在同业务分类内作参考,不作考核。口径全部挂在归侧标签与事件流上——零埋点,统计即查询;指标异动是进化的扳机:纠正聚类指向活动记忆的裁决层,断点聚类指向业务模型的结构层,蒸馏候选增量走治理管线(11)。

+ + +

09运行拓扑:web + server

+
+ +

系统是 web + server。分界原则一句话:过程在后端,呈现在 web;放行是草稿态与事实态之间的门。

+
+ + + +
侧承载
web 侧呈现与输入面:工作台五要素的呈现、对话流(卡片输入,唯一回环入口)、视图区(渲染后端推送的 HTML)、治理台界面。零活动代码、零过程逻辑
server 侧活动过程集中在后端——Agent 机制的推进、LLM 调用与 LLM 工具、过程草拟(活动自设的工作区)、视图流控(AI 以 HTML 模版组织视图、推送 web)· 流程引擎(工作流流转、审批点、网关)· 触发器与通道 · 系统调用的执行 · 基座存放
+

活动过程集中在后端,带来两条直接性质:环不依赖浏览器在线——负责人关掉页面,活动照常推进,任务挂起、事件补投与断点续跑天然成立(06);web 是纯呈现与输入面——视图由后端流控推送,输入经对话流卡片回传,浏览器端不落过程状态。

+

落后端系统的动作集中在活动放行时:过程产物无论在活动的工作区里怎么草拟都是草稿态,不碰台账与外部系统;放行前有落地预检(检查可落地才允许放行,7.3),放行一刻动作落到事实——写台账、调外部系统、提交交付物;落地收敛,输出口才发射。「箱内自由,出箱有门」的边界因此是逻辑的而非物理的:门立在草稿态与事实态之间(草稿 → 台账 / 外部系统),与草稿箱的具体形态无关。任务记忆与留痕随过程持续归档,不受门限。

+ +

写分三类。①系统写——入站归一、流转记录、留痕:登记的是世界已发生的事实,不过放行门,写入正式版并即时产生数据事件;②草稿写——任务运行中,活动对自持域台账的写入落在台账的任务级草稿层(读己之写:本任务可见、正式版不可见、不产生数据事件)——过程工作区的数据形态即此草稿层;③放行写——放行通过,草稿层合并入正式版、外部动作意向执行(7.3),此刻才产生数据事件;共享域写一律走放行,契约预授权的即时写是显式列举的例外。环内推进读任务视图 = 正式版 + 本任务草稿层,不依赖事件;跨任务监听只认正式版事件——别的任务只见你放行后的事实,这是「箱内自由,出箱有门」的数据语义。

+ +

草稿持久,断点可续。草稿层与动作意向持久于 server 的系统自持存储——关闭页面、断线、隔天再开都不丢;没有「保存」动作,写即持久。任务做一半的续跑由三份持久状态共同保证:任务记忆(会话历史,按窗口重建上下文,08)、草稿层(截至断点的全部过程产物与动作意向)、运行时实例状态(loop 的模型定位与就绪集 / flow 的步序位置,11)。过程在后端:「打开任务」只是打开呈现,不是启动过程——过程要么在跑,要么挂起在等(人 / 事件 / 恢复指令);事件到达或人回传即按投递续跑(06),人打开工作台看到的永远是当前状态的投影。

+ + +

10活动与系统的边界

+
+ +

两条轴把系统切成四象限:物理轴(web / server,09)与归属轴(系统 / 活动)。边界清楚,双方才能各自迭代:系统不为业务改一行,活动不越笼子半步。

+ +
+
FIG-04 · 边界四象限物理线 × 归属线 · 交汇处是放行门
+ + + + + + + 系统(平台本体) + 活动(外装件) + web 侧 + server 侧 + + + 界面本体 · 系统供给 + 工作台与治理台界面 · 五要素呈现 + 对话流卡片渲染 · 唯一回环输入口 + 视图区容器(净化渲染) + 零业务逻辑 + + 内容投影 · 无代码 + 视图 HTML —— 后端流控推送,容器渲染 + 卡片内容 —— schema 渲染 + 浏览器不装载活动代码 + 不落过程状态 + + 物理线 · web / server —— 跨线只有:视图与卡片下行 · 输入回传上行 + + + + 系统运行时 · 笼子 + 流程引擎(流转 · 审批点 · 网关) + 活动基座六件 · 统一事件标准与投递 + 调用层四类 · 基座六项存放 + 放行门(草稿态 → 事实态) + 治理台九功能的作用面 + + Agent 机制的内容物 · 跑在基座上 + 业务模型(CMMN + DMN / 步序声明) + 交互内容 · 技能清单 · Harness + 监听声明 · 过程工作区(自设) + 纯工具 · 台账 schema · 蒸馏钩子 + 活动代码无环境能力 + + + 放行门 + + + + + + 两线一门:物理线管过程与呈现,归属线管内容与笼子;交汇处是放行门 —— 下游与他任务只见过门的事实,不见半成品 + +
+ +
    +
  • 物理线(web / server)——跨线只有两种流量:下行的视图与卡片内容(HTML + schema 数据),上行的对话流输入回传。除此之外什么都不过线,前端零过程状态。
  • +
  • 归属线(系统 / 活动)——在后端,这条线就是活动基座六件的接口:活动只见六件,能力一律经调用契约注入;在前端,这条线是容器边界:系统渲染活动的内容,不装载活动的代码。
  • +
  • 交汇处 = 放行门——草稿态(活动过程)到事实态(台账与外部系统)的唯一通道;门归系统,启门归人。
  • +
+ +

10.1系统供给 vs 活动定义

+
+ + + + + + + + +
系统供给(笼子,本卷)活动定义(内容,《活动模型》)
活动基座六件:契约格式 · 交互结构(对话流 + 视图区容器)· 记忆系统 · 数据(「数据域.数据对象.字段」三级寻址 + 通用事务性接口,安装时依声明自生长)· 工具调用契约 · LLM 调用(04)契约内容(七件):输入(data + message)/ 输出口(必发 / 选择)/ 必交付物 / 验收判据(分级标注)/ 禁区 / 授权边界 / 资源声明(4.1)
人类工具四卡的模式与回传协议(05)范式选择:loop 或 flow(04)
统一事件标准:信封 · 四类事件 · 归属解析 · 投递五诺(06)业务模型:CMMN + DMN 或步序声明(04)
调用层四类:系统调用 · LLM 工具 · 人类工具 · 通道;白名单与授权;工具箱(07)交互内容:视图模版 · 卡内容 schema · 汇报组织(04 / 09)
放行门:草稿态 → 事实态的落地时机与协议(09)技能清单(基于工具,载方法不载权力)与监听声明(静态 + 动态,时限必配)(06 / 07)
流程层(流程包 / 工作流 · 审批点 · 网关 · 触发器)· 预算执行器(环外强制,04)Harness 参数申报:停止条件 · 预算 · 时限 · 恢复——执行归系统(04)
基座六项存放 · 治理台九功能 · web 呈现容器(11 / 02 / 09)过程工作区(自设)· 纯工具 · 台账 schema(声明物化)· 蒸馏钩子(04 / 08)
+

本表与《活动模型》0.2 镜像同表(行数、行序、措辞一一对应,括号内章号各随本卷)——左列是系统的承诺,右列是活动的申报;边界线即活动基座六件的接口。

+ + +

11基座与治理

+
+ +

基座 = 数据、台账、记忆、工具箱、活动库、流程包。基座是存放层,只存事实、记录、能力与工件,零业务逻辑——与活动基座(04)不同物:活动基座是运行时的通用模式(宿主),本章基座是存放(库房)。

+
+ + + + + + + +
构件内容
数据主数据:员工、岗位、权限、共享对象目录
台账活动声明的业务数据表与台账:schema 声明、宿主物化、统一治理(脱敏、保留期、权限)
记忆记忆系统的存放:任务记忆的归档库(单单封卷)与活动记忆库(跨单持久)(08)
工具箱功能工具之库,独立的开发与注册入口:工具是独立开发的代码包,由此注册进调用层、入白名单;账号、密钥与 endpoint 配置随工具管理,版本并存;活动以调用契约引用
活动库已安装活动之库,独立的安装与卸载入口:活动包(系统外开发,含业务模型与技能初始版)由此进出,版本并存;库内按业务分类(一级,组织自定)× 活动类型(标准 / 案例)两维管理,两维平级、相互独立;每活动两条版本序列:包版本 × 资产版本(11.3);编排层以声明引用库中活动
流程包治理台在系统内编排的结构定义,版本化存放;工作流 = 流程包的运行时实例
+

一切运行都能在基座找到出处:其事实在数据与台账,其记录在记忆,其能力在工具箱,其定义在活动库与流程包。

+ +

持久层两分:系统自持 × 活动自生长。基座的一切持久存储按归属分两类:

+
+ + + +
归属存什么schema 谁定 · 怎么变
系统自持主数据 · 共享对象目录 · 记忆存放(任务记忆归档库、活动记忆库)· 事件存储(统一事件流,"先持久后投递"的底座,06)· 运行时实例(工作流与任务的状态与投影)· 触发器配置(调用工作流的时机规则,独立于流程包)· 工具箱注册表(工具、白名单、密钥与 endpoint)· 活动库与流程包(定义与版本)系统 schema,随系统版本迭代、系统自带迁移;活动不可写结构,只经接口读写被允许的内容
活动自生长业务台账与数据表:活动以「数据域.数据对象.字段」声明使用声明的最大化合并,只增不破坏(版本升级声明多了就长、少了不缩,无迁移);数据随事类不随包版本,在途照旧
+

两条补充口径:共享对象 = 共享域的台账,不是第三类外装件——各活动声明各自要用的字段,对象 schema 按最大化合并自生长(首个声明创建、后续声明并入);目录只是数据管理的视图,写授权按域.对象在契约申报、白名单核准——箱只有两个(工具箱、活动库),数据不设箱、数据靠域;过程草稿(工作区,即台账的任务级草稿层与动作意向,09)是任务范围的暂存——持久于系统自持存储(断线不丢稿,写即持久)但非事实:放行前不落台账正式版与外部系统,放行时合并落地,随任务终态封卷处理。

+ +

11.1开发装配流:编排 → 声明 → 编译 → 导入 → 装配

+

工作流编排先于活动开发——编排工作流的过程,就是定义活动契约的过程。闭环五步:

+
    +
  • 1 · 编排定契约——治理台画工作流图(五要素编排,03):节点的输入输出、依赖的工具与模型随图确定,各活动契约随编排成形;边的载荷映射随图强制闭合——必填未齐、类型冲突不得发布(03)。
  • +
  • 2 · 导出依赖文件——图画完、契约定好,导出开发该工作流活动库的依赖文件(声明 + 编译选项):所有依赖的接口声明、模型声明、工具声明、输入输出声明。
  • +
  • 3 · 基于声明开发——系统外对着声明开发(本地 mock);按活动的编译选项编译出该工作流的多个活动库 .JS(每活动一个编译产物,即活动包)。
  • +
  • 4 · 导入与管理——活动库 .JS 可批量导入也可单独导入;入系统后在活动库中按业务分类(一级)× 活动类型(标准 / 案例)两维分类与版本管理,版本并存。
  • +
  • 5 · 流程包装配——流程包里按活动名装配:一键自动安装最新版本,或手动控制使用旧版本;安装两审照常收口(11.2)。
  • +
+

契约不是活动开发者单方申报,而是编排给定、开发实现、安装校核——工作流图是契约的母体,三方共读同一份声明。

+ +

包清单(manifest):包的自述文件。活动包 = 包清单 + 代码产物(.JS)+ 资产文件;清单机器可读,系统不执行代码即知包为何物——导入登记、安装静态审、编排装配读的都是清单。清单六区:

+
+ + + + + + + +
区内容
身份活动名(全局唯一)· 包版本 · 业务分类 · 活动类型(loop / flow)· SDK 版本 · 签名与校验和
契约契约七件,声明形式(4.1)
声明模型声明(自定义模型名)· 工具声明(调用契约引用 + 版本约束)· 台账与共享域使用声明(域.对象.字段)· 静态监听声明 · Harness 配置
资产初始版业务模型(CMMN + 说明书 / 步序声明)· DMN · 技能 · 视图模版 · 卡 schema
样例集样例输入 → 期望输出口与载荷形状;首装审与回归依据(11.2)
代码入口.JS 产物的入口与校验和
+

依赖文件即清单骨架——编排导出定其契约区与声明区,开发补代码与资产,编译合成完整清单;静态审审清单,试运行验代码。工具包同构:身份 + 调用契约 + 连接配置声明 + 契约测试集 + 代码入口(7.3)。

+ +

11.2安装治理:两个独立入口,一套两审

+

外装件两类、两个独立入口:活动包经活动库安装卸载,工具包经工具箱注册——都不在编排中发生。安装检查两道:静态审(签名、无动态执行、SDK 兼容、所需调用契约与角色齐备、schema 校验)与回放审。安装恒为新增、版本并存;在途任务按其启动时版本跑完,切换零丢单;生效 / 停用 / 卸载由治理台管理。

+

回放审 = 确定性断言重跑。新版本对历史任务记忆重演其中可确定判定的部分:契约 schema 校验、业务模型静态检查、DMN 决策表对历史输入重算、监听过滤与时限求值、纯工具重跑——比对新旧版结论。LLM 步不重推理:以历史出入参作录制回放,仅校验历史出参对新版 schema 的兼容;人的回传与外部世界的响应一律取历史录制值;写类动作只校验动作意向的构造,不执行。判定口径:「旧成不坏」是生效硬门——历史成功单在新版下断言全过,方可生效;「旧败能成」(历史失败单中新版断言可拦住者)为报告参考项,列入重演报告、不作门槛;无历史失败单天然通过。首次安装无历史:免回放审,以静态审 + 样例集替代(样例集为包清单一区,11.1)。

+

形态类比小程序:业务装在系统里,以活动包交付——装一个新业务 = 装一个小程序,底座不为它改一行;界面容器、身份权限、记忆与卡片全由系统供给,包内无越权代码;上架有审,上线下线随时可控,包与包互不干扰,在途的单照常办完。

+ +

11.3进化治理:候选 → 回放 → 人放行 → 可回退

+

资产与包分离版本化。活动库对每个活动维护两条版本序列,各有各的门、各自单写者:包版本管代码、契约、交互模版、Harness 声明——变更必须系统外重编,走安装两审(11.2);资产版本管业务模型、DMN 与技能——活动包只携初始版(安装时播种入库),此后的资产新版由本节的进化管线在系统内产生(回放 + 人放行),不重编包、不重签名。任务装载 = 包版本 + 各资产当前生效版,全部入信封,行为可归因;包新版携带的资产初始版不覆盖已有更高的资产版——覆盖只能是显式的资产回退治理动作。

+
    +
  • 候选从记忆来——指标异动是扳机(08):纠正聚类、模式收敛、例外累积指向活动记忆的对应层,蒸馏出候选增量(业务模型 / 技能的 diff,带证据链)。
  • +
  • 回放先行——新版本对历史任务记忆重演:旧成功单是否仍成、旧失败单是否恰被拦住;重演报告随增量入证据包。
  • +
  • 人放行——增量 diff + 重演报告过治理台;放行即生效为新版本,下一单装载即行为改变,系统零改动。
  • +
  • 可回退——版本谱系完整,行为回退 = 版本回退;每步行为可由版本信封完全归因(08)。
  • +
  • 治理也被治理——治理台的每个动作同样留痕入事件流。
  • +
+ + +

12系统不变量

+
+
    +
  • 调度分层,放行归人——工作流与 flow 活动的调度权归系统,loop 活动的调度权归 AI,放行权只归人:确定交系统,临场交 AI,落地交人。
  • +
  • 责任有主——任务恰一负责人,审批点恰有审批人;责任要素只在工作台出现。
  • +
  • 一个活动 = 一个完成一项任务的 Agent 机制——Case 是 loop,SOP 是 flow;业务模型、交互内容、技能清单、Harness 与过程工作区皆随活动。
  • +
  • 两种范式,一套执行契约——活动基座六件对 loop 与 flow 完全一致;差异只在范式与业务模型形态,对流程层与交互层不可区分。
  • +
  • 编排层五要素——活动(声明)、审批、网关、触发器、流程包;触发器与流程包平级,起单归触发器,结构归流程包,活动以声明入流、不含触发逻辑;流程包 → 工作流,活动 → 任务:包在库,实例在跑。
  • +
  • 做事与留痕同一动作——工作台五要素是同一份过程事实的五种投影。
  • +
  • 能力在系统,方法在活动——功能工具是独立开发的代码包,经工具箱注册、白名单授权;LLM 工具与人类工具固化在系统;活动只经调用契约用工具,技能基于工具在活动内定义,载方法不载权力。数据可以自生长,权力不可以自生长。
  • +
  • 活动在系统外,模式在系统内——外装件两类:活动包经活动库安装卸载,工具包经工具箱注册;活动基座与审批、网关、触发器的模式落在系统内;活动代码无环境能力,一切能力经调用契约注入。
  • +
  • 过程在后端,呈现在 web——活动过程(LLM 调用、LLM 工具、过程草拟、视图流控)集中在 server,web 是纯呈现与输入面;落台账与外部系统的动作集中在放行时(契约显式预授权的写类动作除外,7.3),门立在草稿态与事实态之间,记录的归档不受门限。
  • +
  • 人类工具与 LLM 工具同列——决策、执行、补全、放行四种调用层内置工具,经卡片到达人(负责人走任务对话流,其他人走系统消息);系统定卡模式,活动填内容;调用必附上下文,回传即留痕,完成只出自放行通过,驳回必附意见。
  • +
  • 事件驱动,标准统一——系统向活动只以统一信封抛四类事件(数据 / 时间 / 人 / 控制);活动以监听声明依赖,监听必配时限;投递先持久后送、同任务按序、至少一次且幂等;活动认数据,不认通道。
  • +
  • 系统恒定,业务在外装件——改业务 = 换活动包 / 工具包或改流程包,不改系统;交互、引擎与基座零业务逻辑。
  • +
  • 安装与发布恒新增——活动包、工具包与流程包皆版本并存;在途任务按其启动时版本跑完,切换零丢单。
  • +
  • 进化必过治理——候选增量必经回放先行与人放行,版本可回退;治理动作亦留痕——治理也被治理。
  • +
  • 预检放行,落地收敛——检查可落地,才允许放行:预检全过才发放行卡;放行即落地(幂等键),落地收敛输出口才发射——下游只见落地完成的任务。
  • +
  • 写分三类,草稿持久——系统写(登记世界已发生的事实,免门即抛事件)、草稿写(任务级草稿层,读己之写,不抛事件)、放行写(合并落地,此刻抛事件);草稿与动作意向写即持久,断点续跑由任务记忆、草稿层与运行时实例状态三份共同保证。
  • +
  • 包以清单自述——外装件以包清单(manifest)交付,静态审审清单、试运行验代码;资产与包分离版本化,各自单写者、各有各的门。
  • +
+ +
+ JCAI · 操作系统 · 系统侧规范 · V2.15 · 关联《活动模型》 + 2026-07-24 +
+ +
+ + diff --git a/docs/活动模型.html b/docs/活动模型.html new file mode 100644 index 0000000..cf2b9cd --- /dev/null +++ b/docs/活动模型.html @@ -0,0 +1,991 @@ + + + + + +活动模型 · 活动侧规范 + + + +
+ +
+
JCAI · ACTIVITY MODEL
+

活动模型:活动的定义与两范式运行

+

本卷完整描述活动侧:一个活动 = 一个完成一项任务的 Agent 机制——怎么定义(契约与业务模型)、怎么运行(loop / flow 两范式)、怎么交互(卡与视图)、怎么沉淀(技能与记忆)、怎么交付(活动包与安装)。系统侧机制(事件投递、流程层、治理台、度量、终态裁定)见《操作系统》;本卷只写活动。

+
+
版本 V2.0 · 活动规范
+
日期 2026-07-25
+
读者 活动开发者(Coding Agent)
+
关系 关联《操作系统》
+
+
+ +
+
00定位与边界Agent 机制 · 小程序类比 · 四象限 · 供给与定义两清单
+
01契约:活动的接口输入(data + message)· 输出口(必发 / 选择)· 终态五名 · 接口最小性
+
02范式:loop 与 flow规范名 · 范式边界即调度权边界 · 选型判据 · 活动内容物
+
03loop · 业务模型CMMN + DMN 运行结构 · 构件语义 · 三铁律 · DMN 四则 · 装载
+
04loop · 运行机制CMMN 生命周期 · Enabled ≠ Active · 语义引擎 × Agent 回路 · 双向驱动 · 监听映射
+
05flow · 步序声明四种步型 · 条件与上升规则 · 事件即步条件 · 失败声明给定
+
06人类工具的调用四卡 · 调用时机 · 跨人卡与驳回重答 · 预检放行,落地收敛
+
07交互内容视图流控(HTML 模版)· 卡内容 schema · 汇报组织 · web 零活动代码
+
08技能封装格式 · 三层软硬 · 装配语义 · 载方法不载权力
+
09记忆与迭代任务记忆 · 活动记忆四层 · 蒸馏与装载 · 迭代业务模型即迭代行为
+
10Harness · 验收分级 · 工作区预算熔断 · 停滞检测 · 控制三语义 · L1–L5 · 任务级草稿层
+
11活动包与开发内容物 · 工具三来处 · 编排先行与依赖文件 · 安装两审 · 暗耦合禁令
+
12合规判据通用 17 条 · loop 8 条 · flow 6 条
+
+ + +

00定位与边界

+
+ +

一个活动 = 一个完成一项任务的 Agent 机制。活动像小程序:基于系统内活动基座的六件接口(契约 · 交互 · 记忆 · 数据 · 工具调用契约 · LLM 调用)在系统外独立开发,经活动库的独立入口安装进系统,即可被流程层以声明引用;卸载同走此入口,系统内不写活动代码。活动是开发态,任务是运行态——活动被调起的一次运行,即落到恰一名负责人工作台上的一单任务。

+ +
边界声明:活动不含触发器。活动之上是流程层:流程包 = 调用接口 + 两种活动 + 审批点(通用)+ 网关(两种,并行 / 异或);工作流 = 流程包的运行时实例,任务 = 活动的运行时实例——包在库,实例在跑;触发器与流程包平级——触发器是流程层的系统级事件监听,经调用接口调起流程包、生成工作流。活动自输入始(由调用方给定)、至终态止(连同交付物交回调用方);工作流如何被触发、如何衔接,归《操作系统》。活动对调用方只暴露契约,对内完全自治。
+ +
行为公式:行为 = 引擎(契约, 业务模型, 技能, 记忆)。引擎与活动基座是不动点——通用、零业务、对所有活动同一份;一切业务行为差异,必须可归因于契约、业务模型、技能与记忆的版本差异。业务模型按范式取形:loop = CMMN + DMN 案例模型,flow = 步序声明。因此迭代业务模型,就是迭代这个活动的行为:改模型即改行为,零代码;模型增量可 diff、可回放、可放行、可回退(09)。
+ +

0.1活动与系统的边界:四象限

+

两条轴把全部职责分干净:物理轴(web 前端 / server 后端——过程在后端,呈现在 web)与归属轴(系统平台本体 / 活动外装件)。四个象限,边界各有判据:

+
+ + + +
系统(平台本体)活动(外装件)
web · 前端工作台与治理台的界面本体:五要素呈现、对话流时间线与卡片渲染、视图区容器、统一输入入口无代码,只有内容投影:后端推送的视图 HTML 与卡片内容,由系统容器渲染、净化,无脚本执行权
server · 后端流程引擎(流转 · 审批点 · 网关)· 活动基座六件 · 统一事件标准与投递 · 调用层四类工具 · 基座存放 · 放行门活动的内容物,跑在基座之上:业务模型 · 交互内容(模版)· 技能清单 · Harness · 监听声明 · 纯工具 · 台账 schema · 过程工作区
+
    +
  • 物理线(横)——跨线只有两种流量:下行的视图与卡片内容(HTML + schema 数据),上行的对话流输入回传;前端零过程状态。
  • +
  • 归属线(纵)——后端段是活动基座接口:活动只见六件,能力一律经调用契约注入;前端段是容器边界:系统渲染活动的内容,不装载活动的代码。
  • +
  • 两线交汇 = 放行门——草稿态(活动过程)到事实态(台账与外部系统)的唯一通道;放行前不落事实(10)。
  • +
+ +

0.2系统供给什么,活动定义什么

+
+ + + + + + + + +
系统供给(模式在系统内,零开发)活动定义(内容随活动,系统外开发)
活动基座六件:契约格式 · 交互结构(对话流 + 视图区容器)· 记忆系统 · 数据(「数据域.数据对象.字段」三级寻址 + 通用事务性接口,安装时依声明自生长)· 工具调用契约 · LLM 调用契约内容(七件):输入(data + message)/ 输出口(必发 / 选择)/ 必交付物 / 验收判据(分级标注)/ 禁区 / 授权边界 / 资源声明(01)
人类工具四卡的模式与回传协议(06)范式选择:loop 或 flow(02)
统一事件标准:信封 · 四类事件 · 归属解析 · 投递五诺(04 / 05)业务模型:CMMN + DMN 或步序声明(03 / 05)
调用层四类:系统调用 · LLM 工具 · 人类工具 · 通道;白名单与授权;工具箱交互内容:视图模版 · 卡内容 schema · 汇报组织(07)
放行门:草稿态 → 事实态的落地时机与协议技能清单(基于工具,载方法不载权力)与监听声明(静态 + 动态,时限必配)(08 · 04 / 05)
流程层(流程包 / 工作流 · 审批点 · 网关 · 触发器)· 预算执行器(环外强制)Harness 参数申报:停止条件 · 预算 · 时限 · 恢复——执行归系统(10)
基座六项存放 · 治理台九功能 · web 呈现容器过程工作区(自设)· 纯工具 · 台账 schema(声明物化)· 蒸馏钩子(10 / 11 / 09)
+

本表与《操作系统》10.1 镜像同表——行数、行序、措辞一一对应,括号内章号各随本卷。

+

统一套执行契约:上表左列对 loop 与 flow 完全一致——两范式的差异被压缩到唯一一处:Agent 机制的范式与业务模型的形态。对流程层与交互层而言,两种活动不可区分地是"一个节点、一单任务"。

+ +
+
FIG-01 · 活动与系统的边界 · 四象限物理线(web / server) × 归属线(系统 / 活动) · 交汇 = 放行门
+ + + + 系统 · 平台本体 + 活动 · 外装件 + web + 前端 · 呈现 + server + 后端 · 过程 + + + 工作台 · 治理台(界面本体) + 五要素呈现 · 对话流时间线与卡片渲染 + 视图区容器 · 统一输入入口 + 零活动代码 · 零过程状态 + + + 内容投影(无代码) + 后端推送的视图 HTML 与卡片内容 + 容器渲染 · 净化 · 无脚本执行权 + 活动到达前端的是投影,不是程序 + + + 系统机制(模式在系统内) + 流程引擎(流转 · 审批点 · 网关)· 活动基座六件 + 统一事件标准与投递 · 调用层四类 · 基座存放 + 放行门:草稿态 → 事实态的唯一通道 + + + 活动的内容物(跑在基座之上) + 业务模型(CMMN + DMN / 步序声明)· 交互内容(模版) + 技能清单 · Harness · 监听声明 · 纯工具 · 台账 schema + 能力一律经调用契约注入 —— 越权在结构上不可能 + + + + + 放行门(两线交汇) + + 物理线(横):跨线只有下行视图与卡片、上行对话流输入 + 归属线(纵):后端 = 基座接口 · 前端 = 容器边界 + + 过程在后端,呈现在 web · 内容归活动,笼子归系统 · 放行是草稿态与事实态之间的门 + +
+ + +

01契约:活动的接口

+
+ +

契约是活动对调用方暴露的全部真相,也是对 Agent 机制的全部授权;两种范式同一契约格式——这是「统一套执行契约」的锚点。契约必须在活动启动前冻结;运行中不得变更——变更即新版本。

+ +
+ + + + + + + + +
契约构成内容要求
输入口单一入口:data(结构化载荷,按 schema)+ message(委托消息,自然语言)(1.1)data 必须机器可校验,缺项不得启动;message 可为空
输出口必发口(完成必发,可多口 → 并行)+ 选择组(恰发一口 → 分支),每口各带交付物 schema(1.2)调用方仅凭口名与 schema 即可衔接下游
必交付物放行前必须齐备的产出清单——放行卡「成果清单」的来源(06)缺一不得提交放行
禁区不得做什么的负面清单应短而硬;负面清单优于正面枚举
验收判据什么算合格,逐条标注验证等级 L1–L5(10);loop 可引用业务模型的完成判据与 DMN 规则(03)两个陌生人对同一产出应给出相同判定
授权边界AI 可自决的范围(金额、折扣、措辞等);预授权动作清单;调人预算(打扰上限)超出边界必须调「人·决策」;预授权必须显式列举
资源声明工具调用契约引用、技能引用、业务模型引用、角色,与预算上限(步数 / token / 时长 / 调人次数)装配不齐不得启动;预算触顶即熔断(10)
+ +

1.1输入:单一入口,data + message

+

活动必须只声明一个输入口;一单任务恰接收一份输入。输入由两部分构成:

+
    +
  • data(结构化载荷)——按契约 input schema 校验,缺项不得启动。这是流程层能静态检查的拼接面:上游输出口的 schema 对得上,活动就接得住。
  • +
  • message(委托消息)——调用方附带的自然语言说明:意图、背景、特殊要求;可为空。message 计入 Agent 机制的初始观察、全程留痕;它往往承载「这一单的特殊性」。
  • +
+
message 是输入,不是改约:message 不得携带扩大授权的效力——与契约冲突时,契约优先。AI 依 message 调整的只能是路径与语境;禁区、授权边界与验收判据不因 message 而变。
+

设计依据:schema 承载可结构化的确定,message 承载不可结构化的语境;两者合一,活动才既可静态编排、又不失临场委托——如同工单之于表格与备注栏。

+ +

1.2输出口:必发(并行)与选择(分支)

+

活动的业务产出经输出口交回调用方。契约声明一组输出口,每口:口名 + 交付物 schema + 发射语义。发射语义两类:

+
+ + + +
发射语义规则流程层用途
必发口(AND)每次「放行完成」必发;可声明多口,同时发射,各携各的载荷并行衔接:多个下游各取所需
选择组(XOR)组内恰发一口;选择由环内决断,在放行卡上随放行一并确认(06)分支路由:调用方据口名分流
+

完成时的发射集合 = 全部必发口 + 每个选择组各一口;每口载荷各过其 schema 与验收判据;发射发生在放行通过且落地收敛之后(06)。非完成终态(受阻 / 熔断 / 耗尽 / 被终止)不发任何业务口,走异常出口(阻因 + 残局快照)。

+
业务分支走输出口,运行异常走终态。「审核拒绝」是业务结局,必须建模为选择组的一口、随放行发射——不得用「受阻」等异常终态编码业务分支;反之,预算耗尽不是业务结局,不得伪装成输出口。终态描述「这次运行怎么收场」,输出口描述「产出流向哪里」。
+ +

1.3终态

+

终态是契约层的收场名,封闭五名——终态由系统裁定,权威名录见《操作系统》4.3;范式内的状态映射见 04(loop)与 05(flow):

+
+ + + + + + +
终态语义交回调用方的载荷
放行完成唯一成功终态:放行通过且落地收敛,输出口已发射(06)发射集合(必发口 + 选中口)+ 各口载荷 + 放行记录
受阻待人无法推进(监听时限走完 / 断点无解),封卷待治理处置:改派后恢复 / 重开新实例 / 终止阻因 + 当前残局快照
停滞熔断连续无进展,Harness 强制止损;不可恢复停滞证据 + 残局快照
预算耗尽任一预算上限触顶;不可恢复消耗清单 + 残局快照
被终止控制事件 · 终止(负责人 / 治理台;含工作流终止的级联)终止原因 + 残局快照
+

不是终态:驳回(重做 / 迭代)是放行卡的环内回转——携意见回环,任务继续,不出活动;叫停是控制事件(10)——转挂起待纠偏,处置后恢复,或由负责人终止(→ 被终止),叫停必留痕为最重档纠正信号;落地受阻是运行态——落地失败卡(执行卡的系统预置形态)处置后仍收敛于本名录(06)。

+
接口最小性:调用方与活动之间只有三样东西过界——启动时的输入(data + message)、结束时的终态与输出口载荷、运行中的状态投影(只读)。调用方不得干预环内路径;环不得感知流程拓扑。活动之于流程包,如函数定义之于调用点;任务之于工作流,如一次调用之于一次执行。
+ + +

02范式:loop 与 flow

+
+ +

Agent 机制的范式,规范名两种:loop / flow。范式回答一个问题——这件事的下一步由谁定:

+
+ + + +
范式活动机制业务模型调度权
loop案例活动(Case)临场演绎:在业务模型给出的结构上感知、决断、行动,循环推进直到判据收敛CMMN + DMN 案例模型:事理、前提、判据与可计算判断(03)AI
flow标准活动照谱执行:按声明步序确定推进,零临场调度步序声明(05)系统
+ +
范式的边界即调度权的边界。一个活动选 flow 还是 loop,本质就是把这件事的调度权交给系统还是交给 AI——确定交系统,临场交 AI,落地交人;无论谁调度,放行权都不移交。放行、留痕、记忆、事件、卡片协议对两范式完全一致(00)。
+ +

2.1选型判据

+
+ + + +
选判据典型
flow路径可枚举且稳定:全部步骤能写成序列,条件能写成任务数据上的确定性谓词,无临场裁量点对账、开票、资料归集、例行巡检
loop路径须临场:判断、协作、创造类工作,对手方与信息不确定,每单走法不同——但事理可建模(前提、判据、量的推导)报价谈判、异常处理、方案撰写、客诉处置
+
    +
  • 两种都是合法终身形态——不设"必然结晶"论:标准活动不是案例活动的归宿,案例活动也不是标准活动的过渡;选哪种由事的性质决定,不由方法论偏好决定。
  • +
  • 一处装不下就用 loop——flow 里只要出现一处"由 AI 决定怎么办",这个活动就不该是 flow(05 的上升规则);反之,loop 中反复走出的确定子序列以技能的结晶片段脚本承载(08),不必改范式。
  • +
  • 改选范式即新版本——范式随活动包版本声明;改范式经活动库安装两审(11),在途任务按其启动版本跑完。
  • +
+

术语约定:flow 是活动内部的步序范式(方法级,中途无责任交接),与流程层的「工作流」(流程包的运行时实例,责任级编排:节点有负责人、有审批点)不同层。本卷以中文「流程包 / 工作流」专指流程层,以英文小写 loop / flow 专指活动范式。

+ +

2.2活动的内容物

+

无论哪种范式,活动的内容物同一清单——全部随活动定义与交付,跑在基座之上:

+
    +
  • 业务模型——这件事的结构,按范式取形(上表);业务模型是活动记忆优化的对象——迭代业务模型,就是迭代这个活动的行为(09)。
  • +
  • 交互内容——何时调人、卡里给什么、视图区呈现什么、汇报怎么组织(07)。
  • +
  • 技能清单——基于工具、在活动内定义的方法经验;载方法,不载权力(08)。
  • +
  • Harness——停止条件、预算与熔断、监听时限、中断与恢复(10);Harness 在活动内,每个活动的确定性边界随活动交付,不依赖外部编排兜底。
  • +
  • 过程工作区(可选)——台账的任务级草稿层,组织由活动自设,不绑范式;写即持久,放行前不落事实(10)。
  • +
+ + +

03loop · 业务模型:CMMN + DMN

+
+ +

技能承载「怎么做」(方法),业务模型承载「这件事是什么、什么决定什么」(事理)。loop 活动的业务模型是案例模型,格式为 CMMN(配套 DMN 承载量与推导)——选共识标准而非私有格式:LLM 天然读写,XML 可校验、可 diff、可版本。案例模型是运行时的权威结构:装载即结构——阶段怎么展开、前提何时满足、计划项处于何态,由语义引擎按 CMMN 规范对着这份 XML 忠实推进(04);AI 坐案例工作者的座位——感知、规划、汇报按任务数据 / 阶段 / 里程碑组织;人给这个座位建的模型,AI 继承。

+ +

3.1构件语义

+
+ + + + + + + + + +
CMMN 构件在本卷中承载
CaseFile / Items任务数据:自持台账与共享对象的映射——事的数据中心;运行中的写入落任务级草稿层(读己之写),放行时合并正式版;正式版写入(系统写与放行写)即数据事件,按统一事件标准抛回活动(04)。
Stage阶段:生命周期的分组结构(展开即 create 子项)与叙事骨架;多 onPart 汇合即回齐(04)。
Task + Discretionary合法动作空间:计划项对应工具 / 技能 / 调人;非裁量项由前提推到 Enabled,裁量项从 planning table 由 Agent 临场规划入场;触达世界与关键交付者必须 manualActivationRule = true(04)。
Milestone里程碑:业务阶段的命名达成——occur 即迁移事件留痕;既是视图与汇报的投影定义源(07),也可被其他前提监听、参与前推(04)。
EntryCriterion(前提)前提与因果:「先什么后什么」——onPart + ifPart,由语义引擎按规范求值:满足即 Enabled;语义性前提交 Agent 评估(04);L2 机检规则的来源之一(10)。
ExitCriterion(完成判据)计划项的 complete / exit 条件;接契约验收判据与放行卡的成果清单。
Role岗位绑定:调人时卡投递到哪个工位。
DecisionTask → DMN量与推导:决策需求图(DRD)即依赖图,决策表(FEEL)承载可计算推导与规则(3.3)。
+ +

双表示,同版本:CMMN XML 是机器面——语义引擎以它为运行结构:推进生命周期、求值前提、维护 Enabled 集;案例说明书是叙事面——Agent 读它理解业务、组织汇报、向人解释,渐进披露(常驻梗概,按事下钻)。两面同版本发布,不允许分叉:说明书是 XML 的叙事投影,迭代时一起放行。

+ +

3.2三铁律与约束力收缩

+
    +
  • 语义归引擎,裁量归 Agent,强制归门(必须)——CMMN 语义由引擎忠实执行:前提满足即 Enabled,这是规范而非越权;manual 项的启动永远归 Agent;强制力只在验收分级与放行处生效(门 = 放行卡与判据,06 / 10)。引擎只推规范、不代裁量、不代把关。
  • +
  • 载事理,不载权力(必须)——白名单、授权边界与禁区在契约;案例模型不得扩大它们。
  • +
  • 叙事框架(应)——AI 的规划与汇报、视图区的呈现结构,应以案例模型的阶段与里程碑组织(07)。
  • +
+

约束力收缩机制:纠正与驳回的理由,蒸馏入活动记忆 · 裁决层(09),归纳为候选前提条件 / 完成判据 / DMN 规则 → 回放检验(历史成功单皆满足、失败单恰被拦)→ 人放行 → 入案例模型新版本 → 从此由 L2 机检承担。每挨一次纠正,约束就有机会从人的判断收缩为机器的校验——纠正的减少因此有了因果机制,不只是统计现象。

+ +

3.3DMN:判断的确定性化

+

DMN 承担一件事:把装得下的判断从 LLM 手里拿走。DRD 声明「定什么需要知道什么」,决策表(FEEL)声明「知道了怎么定」——两者合起来,判断成为确定性求值:

+
    +
  • 能算的不问 LLM(必须)——输入齐备的决策表由语义引擎确定性求值;同输入必同结论,零方差、零 token。
  • +
  • DRD 即缺口演绎(应)——输入不齐时,DRD 指出缺什么:可查的调工具、可算的先算上游决策、只有人知道的调人、在世界侧的立监听——双向驱动的后拉遍历(04),主要就是走 DRD。
  • +
  • 决策留痕(必须)——每次求值留痕:输入快照 + 决策表版本 + 命中规则行;决策可回放、可归因。
  • +
  • 结论不可静默覆写(必须)——DMN 结论对 Agent 是约束性输入;认为结论不合理时只有两条路:超出授权的走「人·决策」,规则本身有病的提迭代提案(09)——不允许 LLM 悄悄绕开确定性结论。
  • +
+
智能的分工线:DMN 装得下的,是已经被组织想清楚的判断——确定性执行;LLM 负责的,是 DMN 还装不下的判断——临场推理。迭代的方向是把后者不断搬进前者:每一条从纠正中蒸馏出的决策规则,都是一块从「临场」搬进「确定」的判断。
+ +

3.4装载:一单任务开始时引擎读什么

+
+ + + + + + + + +
装载件来源进哪里
契约活动包(冻结)目标与授权:输入 / 输出口 / 禁区 / 验收判据 / 预算
案例模型 · XML活动库(版本)语义引擎:运行结构本体——生命周期 · 前提 · 判据 · 里程碑
案例模型 · 说明书活动库(同版本)Agent 上下文:叙事面,渐进披露
DMN(DRD + 决策表)活动库(版本)语义引擎(确定性求值)+ Agent(依赖演绎的参照)
技能目录活动库(技能引用)Agent:适用描述索引,按事装配正文与脚本(08)
活动记忆(选摘)基座 · 记忆库Agent 上下文:按模型定位选摘持久事实,渐进披露(09);语义引擎不读
任务数据映射契约数据声明CaseFileItem ↔ 台账与共享对象——模型的数据脚落到真实存储
+

版本全部记入信封——从此每一步的行为可完全归因(09 行为可归因公式)。

+ + +

04loop · 运行机制

+
+ +

loop 的运行 = CMMN 语义引擎(下层,零 LLM)× Agent 回路(上层,临场裁量)。状态的权威是 CMMN 规范的标准生命周期:活动不定义状态,模型不发明状态——装载哪个模型,状态空间就是规范为那类计划项规定的那一副;引擎按规范推进,守卫(时限 / 预算 / 预授权 / 监听)仅可参数化。

+ +

4.1生命周期:CMMN 标准

+
+ + + + + + +
案计划(整案)五态语义
Active运行中:创建即入,整案唯一的做功状态。
Completed完成:必要计划项全部收敛,放行通过且落地收敛——判据全绿不等于完成(06 / 10)。
Suspended挂起:受阻待组织处置(时限走完 / 断点无解),或叫停后待纠偏;可恢复——恢复由事件驱动(人事件 / 数据事件 / 时间事件 / 控制事件)。
Terminated终止:停滞熔断 / 预算耗尽 / 被终止(控制事件 · 终止,含工作流级联);携原因码交回调用方,不可恢复。
Failed失败:运行异常;由人恢复重跑或转终止。
+
+ + + + + + + + + +
计划项八态语义
Available已随阶段入场,entry 前提未满足。
Enabled前提满足、manualActivationRule = true:可启动而未启动——引擎推进的终点,Agent 裁量的起点。
DisabledAgent 规划裁量弃用(此单不走这条);可 reenable。
Active执行中:Agent 启动(manualStart),或纯机内项自动启动(start)。
Suspended挂起(Harness / 叫停 / 随父级);恢复由事件驱动。
Failed执行异常;是否重跑由人裁定。
Completed完成:exit 判据满足;关键交付项的完成经验收分级与放行(10 / 06)。
Terminated终止:exit 前提触发退出,或随父级级联终止。
+

里程碑与事件监听器只有一条主迁移:Available →(occur)→ Completed——前提满足 / 件到 / 到点即达成留痕;里程碑达成本身是迁移事件,可被其他前提监听——里程碑因此参与前推(4.3),不只是投影。契约终态(01)的映射:放行完成 = 案计划 Completed(放行通过且落地收敛);受阻待人 = Suspended + 阻因,封卷待治理处置(改派后恢复 / 重开新实例 / 终止);停滞熔断 · 预算耗尽 = Terminated + 原因码;被终止 = Terminated(控制事件 · 终止,含工作流级联);Failed 是规范补齐的运行异常格,与业务终态分开;驳回是迁移不是状态——相关计划项重新入场(repetitionRule 新实例),记为纠正信号。

+ +
    +
  • 原理一 · Enabled ≠ Active(必须)——「就绪 ≠ 执行」的 CMMN 原生形:引擎按规范推进到 Enabled(可启动)为止;凡触达世界或产出关键交付的计划项必须 manualActivationRule = true,进入 Active(执行)永远出自 Agent 的裁量启动(manualStart,留痕);automatic 仅限纯机内项(只读 / 纯计算)。规范推进不是执行,启动才是执行。
  • +
  • 语义忠实(必须)——生命周期与前提语义严格循 CMMN 规范;引擎不得私改迁移拓扑,活动与模型不得发明状态。
  • +
  • 迁移必留痕(必须)——每次生命周期迁移记入任务记忆:触发者 · 依据(前提 / 裁量 / 放行 / Harness)。
  • +
  • 终局唯放行与 Harness(必须)——案计划 Completed 必经放行卡;Terminated 只出自 Harness 与负责人;AI 不得产生终局迁移。
  • +
+
投影随语义走。调用方与流程层看到的任务状态 = 案计划状态 + 原因码的只读投影;业务进展(「报价已发」「等客户确认」)= 里程碑与任务数据的投影,由语义引擎按模型维护、经视图流控呈现(07)。并行支线即多个 Active 的阶段,各持各的计划项状态——聚合语义就是 CMMN 的父子级联本身,不另设规则。
+ +

4.2语义引擎 × Agent 回路

+

两层的耦合点是任务数据与记忆:任务数据是驱动耦合——Agent 写数据(落任务级草稿层,读己之写),引擎对本任务的前提求值读任务视图 = 正式版 + 本任务草稿层,不依赖事件;跨任务监听只认放行后的正式版事件;任务记忆是记录同轴——引擎的每次迁移与求值、Agent 的每个决断,同轴记入(09)。引擎向上发布 Enabled 集与红绿灯,Agent 向下启动计划项、写任务数据。每一步行动属于且仅属于三型之一:调工具(系统调用与 LLM 工具)、调人(四卡之一,06)、立监听(AI 不能调用世界,对世界只有两种合法姿势:触达它——动作,落在放行;等它——监听,4.4)。

+ +
+ + + + + + +
语义引擎(下层)内容
生命周期推进按 CMMN 规范维护案计划与全部计划项的迁移(4.1)——迁移即事件、事件必留痕;装载的 XML 就是运行结构,引擎不得私改。
前提求值onPart 听任务数据变化(环内 = 任务视图的写入;环外回音 = 归属解析后的正式版数据事件)与计划项迁移,ifPart 对任务视图确定性求值:entry 满足 → Enabled;exit 满足 → 完成 / 退出。语义性 ifPart(不可机算的前提)标记「待裁量评估」,交上层。
DMN 求值DecisionTask 与判据引用的决策表,输入齐备即确定性求值,结论与命中规则行留痕(03)。
判据预检完成判据与验收判据的 L1 / L2 部分持续预检,红绿灯挂在 Enabled 集旁——Agent 与视图区随时可见「还差什么」。
Enabled 集发布当下可启动的计划项(含 planning table 上可规划的裁量候选)· 目标缺口(未绿的判据 / 未达的里程碑)· 阶段位置;发布给 Agent 回路与视图流控(07)。
+ +
    +
  1. 定位——案计划走到哪里:Active 的阶段、Enabled 集、里程碑与判据的红绿灯。
  2. +
  3. 择向——判据后拉:目标还缺什么;前提前推:当下能启动什么;取交集(4.3)。
  4. +
  5. 决断——在交集中定夺:manualStart 某个 Enabled 项(启动留痕)/ 从 planning table 规划裁量项入场 / 评估语义性前提(评估留痕,可回放可归因)/ disable 弃用某项——或判定成果已齐,提交放行(06)。
  6. +
  7. 行动——执行 Active 的任务:装配技能、调工具、调人;一切能力经调用契约,触达外部世界的动作集中在放行时落地;预算由 Harness 扣减(10)。
  8. +
  9. 写数据——产出落为任务数据写入:任务级草稿层(读己之写,不抛事件,10),过程同轴入任务记忆;引擎对任务视图求值前提、按规范推进,回到定位。
  10. +
+ +
+
FIG-02 · loop 引擎总图装载 → 语义引擎(Enabled 集) × Agent 回路 → 能力与门 → 放行落地 · 事件驱动
+ + + + + + + + + 装载 · 版本入信封 + + + 契约(冻结) + + 案例模型 CMMN + XML + 说明书(同版本) + + DMN(DRD + 决策表) + + 技能目录 + + 活动记忆 · 选摘 + + 任务数据映射 + 七件之要:结构进引擎,叙事进上下文 + + + + Agent 回路(上层)· 调度权归 AI + 定位 + + 择向 + + 决断 + + 行动 + + 写数据 + manualStart · 语义前提评估 · 技能装配 · 调人 / 立监听 —— 决断留痕 + 上下文:说明书 + 活动记忆选摘 + 任务记忆窗口 + 循环推进,直到判据收敛 → 提交放行 + + + 发布 Enabled 集 + 红绿灯 + + manualStart · 写任务数据 + + + CMMN 语义引擎(下层)· 零 LLM + 生命周期推进 · 前提求值 · DMN 求值 · 判据预检 + 迁移即事件 · 求值留痕 —— 循规范,不代裁量、不代放行 + 数据 / 时间事件驱动推进;Enabled 集持续发布 + + 能力与门(经调用契约) + + 工具(调用契约) + 系统调用 · LLM 工具 · 通道出站 + + 人类工具四卡 + 决策 · 执行 · 补全 · 放行(06) + + 监听登记 + 静态(模型)+ 动态(临场)· 时限必配 + + + + + 放行卡 —— 成果清单 + 放行选择表 + 通过 / 驳回重做 / 驳回迭代(人) + + + 事实态:台账 · 外部系统 + 放行前不落事实 —— 动作集中在放行时 + + + 统一事件(系统投递) + 数据 / 时间 / 人 / 控制 + + + 两层耦合:任务数据 = 驱动耦合 · 任务记忆 = 记录同轴;Enabled ≠ Active —— 规范推进不是执行,启动才是执行 + + 行为 = 引擎(契约, 业务模型, 技能, 记忆) —— 引擎与基座不动,模型演进:迭代案例模型,就是迭代这个活动的行为 + +
+ +

4.3双向驱动:开展与完成

+

任务如何被结构驱动着开展、又被结构收束着完成——答案是两股方向相反的力:

+
    +
  • 前提前推(开展)——写任务数据留痕(草稿层),语义按规范传播:任务视图变化 → 前提满足 → 新计划项 Enabled(里程碑 occur 亦是迁移,可再触发前提):可为空间像漏斗一样随进展展开。前推回答「当下能启动什么」。
  • +
  • 判据后拉(完成)——完成判据与里程碑构成目标集;Agent 沿 DMN 依赖图(DRD)与前提依赖反向遍历:目标缺什么 → 缺口由什么推出 → 落到一个 Enabled 的计划项。后拉回答「该启动什么」。
  • +
+
导航即交集,断点即人环。下一步 = 当下可为(Enabled 集)∩ 目标所需——两集有交,择优启动(技能引路);交集为空即断点:目标所需的缺口无法由任何 Enabled 项补足——这正是调人(缺口只有人知道 → 补全卡)或立监听(缺口在世界侧 → 前提与时间监听,从模型给出)的判定时机。调人与监听的时机从「感觉」变成「依赖图上的断点」——可留痕、可回放、可归因。
+

完成的收束:判据逐项转绿(L1 / L2 由语义引擎预检,L3 实证、L4 评审按分级执行,10)→ 全绿即提交放行(发卡前过落地预检,06),成果清单 = 判据逐条核对 + 生命周期快照(阶段与里程碑达成)+ 关键步引用 → 放行通过、落地收敛,案计划 Completed,发射输出口。开展是 Enabled 空间的展开,完成是判据缺口的收敛——一开一收,任务被结构从两端夹着走完。

+ +
+
FIG-03 · 双向驱动前提前推(当下可为) × 判据后拉(目标所需) → 交集导航 · 断点即人环
+ + + + + + + + + + 目标集:判据 A ✓ · 判据 B ✗ · 判据 C ✗ ‖ 里程碑 M1 ✓ · M2 ○ —— 由完成判据与里程碑构成,语义引擎持续预检 + + 前提前推 · 当下可为 + + 数据事件传播,前提满足即 Enabled: + ✓ 成本已核 + + Enabled:拟报价 + ✓ 客户已识别 + + Enabled:查信用 + Available:发报价 + 可为空间随进展展开 —— 回答「当下能做什么」 + + 判据后拉 · 目标所需 + + 沿 DRD 与前提依赖,自目标反向遍历: + 判据 B:价格合规 + + 需:报价额(DMN 可算) + + 需:付款条件 ← 客户信用 + + 缺口:信用未知 + 任何可为动作补不了 + 目标缺什么、由什么推出 —— 回答「该做什么」 + + + Agent · 交集导航 + 当下可为 ∩ 目标所需 + → 下一步:查信用 + 交集为空 = 断点 → 调人 / 立监听 + + + + + 开展是就绪空间的展开,完成是判据缺口的收敛 —— 前推给能做,后拉给该做;断点给出调人与监听的时机,全程留痕 + 缺口只有人知道 → 补全卡;缺口在世界侧 → 立监听(前提 + 时间监听从模型给出);缺口可算 → DMN 求值;缺口可查 → 调工具 + +
+ +

4.4监听映射:CMMN 件 × 统一事件标准

+

loop 的监听全部落在 CMMN 原生件上,再由系统的统一事件标准(信封 · 四类事件 · 投递五诺,见《操作系统》)投递——前提 = 静态监听(随案例模型声明),临场立监听 = 动态监听(运行中由 Agent 登记,如发出报价邮件后登记"等回信");活动认数据,不认通道:

+
+ + + + + +
监听四问CMMN 件 × 事件标准
听什么前提 = onPart(监听哪个任务数据项的写入 / 变更,或哪个计划项的迁移)+ ifPart(内容条件,FEEL 求值)。「凭什么认出就是它」由模型给出——对应事件信封的关联键过滤。
从哪来数据事件:环外回音(邮件解析 / 人工代收)经系统归属解析归一为任务数据写入后抛出——通道对前提不可见;写入层去重,处理幂等(按事件 ID)。
听多久时间监听(TimerEventListener)= 时限,必配:到点抛时间事件,按声明走催办(契约预授权的模板催办)→ 换道 → 升级(案计划 Suspended · 受阻待人)。无死等。
怎么齐Stage 汇合:一个前提多 onPart = 全齐(AND);多个前提 = 任一(OR);定额与多次回件用 repetitionRule。
+
    +
  • 回音四来处,机制归一——工位的人(卡回传 → 人事件,写数据)、世界(客户 / 供应商回件经通道解析写数据)、时间(时限到点)、别的环(其结果由调用方写入任务数据)——全部以事件形态到达,监听只认事件。
  • +
  • 人工代收——环外的话经电话等非结构化途径到达时,相关岗位的人按数据项 schema 代为回填,走同一写入口;代收是转述,不是判断——原话与代收人意见分开留痕。
  • +
  • 监听中是健康态——有时限、有阶梯,与停滞(该动没动)分别对待(10);挂起期间事件不丢,恢复即补投(系统投递承诺)。
  • +
+
悬空监听禁止,安装时拒绝:凡 onPart 监听的数据项,必须存在至少一条可达的写入来源(通道映射 / 卡回传产出 / 环内动作产出 / 调用方回填);凡等环外处,必须配时间监听。无来源又无时限的监听即「幽灵等待」——永不苏醒的支线,安装静态审(11)必须拒绝。
+ + +

05flow · 步序声明

+
+ +

flow 是活动内的确定性范式:业务模型 = 步序声明——一条谱;引擎照谱执行,零临场调度,调度权归系统。flow 与 loop 共用同一副基座六件、同一契约格式、同一事件标准、同一记忆与留痕、同一放行——差异只有一处:下一步由声明给定,不由 AI 决断。LLM 在 flow 里可以出现,但只以「被调用的工具」出现,不是调度者。

+ +

5.1步序声明模型

+

一条步序 = 有序的步列表 + 简单条件。每步声明六件:步名 · 步型 · 入参映射(取自任务数据 / 上步出参)· 出参写入(落任务数据,草稿态)· 完成条件 · 失败策略。步型四种:

+
+ + + + + +
步型内容完成条件
工具步调一个白名单工具:系统调用(读取即快照留痕;触达外部世界者按契约预授权执行,或产出落草稿、集中在放行时落地)同步:调用返回即完成
LLM 步固定模板 + schema 出参的模型调用(抽取 / 生成 / 转换);模板与出参 schema 随声明版本冻结,出参过 schema 校验同步:出参校验通过即完成
人类工具步四卡之一,卡内容与出现时机由声明给定——如「步 4:人·执行,作业指导书 + 结果回填表」;末步通常是放行卡(06)异步:人事件(卡回传)即步完成条件
纯工具步包内纯计算 / 转换 / 对自持台账的操作(无外效应);注册进工具表、经运行时调用而留痕同步:返回即完成
+

异步步的完成条件 = 监听:等外部回件的步声明数据事件监听(如「发出对账单 → 听回执写入」),等人的步以人事件为完成条件,等时点的步以时间事件为完成条件——同一统一事件标准,时限必配:到点抛时间事件,按声明走催办或兜底;无死等。

+ +

5.2顺序、条件与上升规则

+
    +
  • 顺序——步按声明序执行;可声明确定的并行组(组内步无依赖、全完成再继续)。
  • +
  • 简单条件——允许条件跳步与条件执行,条件必须是任务数据上的确定性谓词(如「金额 < 1 万 → 跳过步 4」);由引擎求值,零 LLM。
  • +
  • 复杂路由上升(必须)——出现多路业务分支、临场判断的路由、不可谓词化的条件:不得在 flow 内表达。两条出路:上升为流程层的网关与多活动编排(责任级),或该活动改用 loop 范式(方法级临场)。flow 的谱必须全程可静态检查。
  • +
+ +

5.3失败与缺口:声明给定,不临场

+
    +
  • 重试策略(必须)——每步声明重试次数与间隔;重试仍败,按声明走下一步:转人兜底(改发人类工具卡:人·执行或人·决策,卡内容随声明)或受阻待人(挂起,携阻因)。
  • +
  • 无临场兜底(必须)——flow 内不得出现「由 AI 决定怎么办」的失败处理;需要临场,即说明该活动不该是 flow(2.1)。
  • +
  • 控制事件同权——叫停 / 暂停 / 终止对 flow 任务同样有效(10);挂起恢复后自当前步续跑,事件补投。
  • +
+

终态映射(01):放行完成 = 末步放行卡「放行通过」;受阻待人 = 声明的兜底转人或时限升级;停滞熔断 / 预算耗尽 = Harness 强制(10);驳回 = 放行卡驳回,按声明回到指定步重做或携意见迭代。

+ +

5.4flow 的留痕、记忆与迭代

+

每步的执行、入出参、重试与失败,同一任务记忆标准(09):只追加、信封盖戳、治理先行、归侧。flow 活动同样有活动记忆——事实层校准重试与时限参数,裁决层沉淀步序修订候选(步增删、条件阈值、卡内容修订);候选经回放与人放行进入步序声明新版本:修订步序,就是迭代这个活动的行为(09)。

+ +
+
FIG-04 · flow 步序执行四种步型 · 谓词跳步 · 异步步 = 监听 · 失败声明给定 · 末步放行
+ + + + + + + + + 步序声明 · 一条谱 + 引擎照谱推进 · 零临场调度 · 调度权归系统 + + + 1 · 工具步 + 读 ERP · 快照留痕 + + + 2 · LLM 步 + 抽取 · 模板 + schema + + + 3 · 条件(确定性谓词) + 金额 < 1 万 → 跳过步 4 + + + 4 · 人类工具步 · 执行卡 + 作业指导书 + 结果回填 + + + 5 · 纯工具步 + 汇总核对 + + 跳步(谓词为真) + + + + 异步步 · 完成条件 = 监听 + 人事件即步完成 · 时限必配 + 到点 → 催办 / 兜底(声明给定) + + + + 放行卡 —— 成果清单 + 放行选择表 + 通过 / 驳回重做 / 驳回迭代(人) + + + 事实态落地(放行时)· 发射输出口 + + + 失败策略 · 声明给定,不临场 + 每步:重试 N 次 → 超限 → 按声明兜底:转人类工具卡 / 受阻待人 + + + 复杂路由不入 flow:多路分支 · 并行汇合 · 临场判断 → 上升为流程层网关编排,或改用 loop 范式(2.1 / 5.2) + + + 步序即业务模型 —— 修订步序,即迭代此活动的行为;谱内确定,谱外过放行 + +
+ + +

06人类工具的调用

+
+ +

人在环是一种被调用的工具——四种人类工具与 LLM 工具同列,都是调用层的内置工具:AI 调用人与调用任何工具同构,经调用契约、受白名单与授权约束;差别只在通道与时延——卡经对话流(负责人)或系统消息(其他人)到达人,回传异步(人事件)。人是工具表里带宽最小、延迟最高、不可并发的工具,但携带两样机器没有的东西:环外的知识,与裁决的权力。卡片结构与回传协议归系统,内容由活动填充(schema 在契约与交互内容中给出,07)。

+ +
+ + + + + +
工具AI 输出(卡面)人回传
决策分支条件选择表:可选分支、各自条件与后果、依据快照、AI 建议选定分支,可附理由
执行作业指导书 + 结果回填表格:做什么、怎么做、完成标准按表回填结果,凭证随附
补全补全需求 + 回填表格:缺什么、为何需要、格式要求按表回填
放行成果清单 + 放行选择表:交付物、验收判据逐条核对与依据三选一:放行通过 / 驳回重做 / 驳回迭代,驳回必附意见
+ +
    +
  • 调用时机——loop 里由 AI 临场判定(断点即人环:缺口只有人知道 → 补全;超出授权 → 决策;数字化未及 → 执行;成果齐备 → 放行,04);flow 里由步序声明给定(05)。
  • +
  • 到达面两路——发给负责人的卡出现在该任务的对话流;发给其他人的卡以系统消息送达其消息要素、就地作答——跨人卡是一次性的解答请求,不是责任转移:作答权限只及卡面与决策包,不开放任务对话流;「调谁」按岗位声明,收件人由系统按解析策略确定(《操作系统》03),缺席走时限阶梯。回传经统一入口写回任务,调用与回传全程在任务侧留痕。驳回重答 = 新发一条系统消息(新卡实例,附驳回理由与原答引用,原卡闭合)——每次请求与回答都是独立消息,只增不改。
  • +
  • 调用必附上下文(必须)——每张卡自带足够的依据与快照,人无需进系统翻找即可作答;无上下文的裸调用,基座必须拒发。
  • +
  • 回传即留痕、即学习信号(必须)——谁、何时、答了什么、依据什么,随卡入任务记忆;补全 = 缺口标注,决策 + 理由 = 偏好样本,执行回填 = 结果确认,驳回 + 意见 = 批评信号——活动记忆 · 裁决层的原料(09)。
  • +
  • 回传按 schema 校验——经系统单入口协议回环,以人事件抛回活动:loop 中即观察 + 数据写入,flow 中即步完成条件。
  • +
  • 防打扰——调人预算(打扰上限)在契约授权边界;同一缺口攒批调用,能推进的先推进。
  • +
+ +
完成只出自放行,放行必先预检(必须)。任务的完成只能出自放行卡的「放行通过」——判据全绿只是可提交,认账永远是人的动作。发放行卡前,系统对全部待落地动作执行落地预检(schema · 工具可用与授权 · 连接可达 · 数据冲突)——检查可落地,才允许放行:预检全过才发卡,成果清单即已验证的动作清单,预检不过的项打回环内修正。放行通过即刻落地(写台账、调外部系统,附幂等键),落地收敛才发射输出口,终态方成「放行完成」;残余失败转落地失败卡——执行卡的系统预置形态,不构成第五种卡(《操作系统》7.3)。驳回重做 = 按原要求重新执行;驳回迭代 = 带意见改进现稿后再提。放行卡是活动级的门,与流程层的审批点不同层:任务完成靠放行,节点间裁决靠审批点(《操作系统》)。
+

loop 中的调人落为类型化的 HumanTask 计划项:调用即 Active(阻塞),回传写任务数据 + 抛人事件,完成驱动前提、下游随之解锁——调人与等回音在结构上是同一件事:立一个监听,听人。

+ + +

07交互内容

+
+ +

交互的结构归基座,内容归活动:基座供给对话流(任务的人机时间线、一切回环输入的唯一入口)与视图区容器(只读呈现);活动填充三样内容——视图模版、卡内容 schema、汇报组织。

+ +
+ + + + +
交互内容活动定义什么约束
视图模版视图区呈现的 HTML 模版:事态全景、进展、成果预览;流控由 AI 在后端执行——按局面选模版、填数据、决定下一屏呈现什么,推送 web模版是内容不是代码:web 零活动代码,容器渲染净化、无脚本执行权;视图区只读、零回环输入
卡内容 schema四卡的内容定义:决策卡的分支与条件怎么列、执行卡的指导书与回填表、补全卡的字段、放行卡的成果清单结构卡片骨架与回传协议归系统;无自定义内容的活动必须仍可运行——schema 自动渲染兜底
汇报组织过程汇报与汇报工件怎么组织:loop 按案例模型的阶段与里程碑,flow 按步序位置;日 / 周期汇报的素材由任务记忆聚合汇报是投影,不是另一份事实——一切汇报可溯回任务记忆与任务数据
+ +
    +
  • 控制权按态转交(必须)——视图区容器与对话区输出框的控制权由活动与系统共同持有:任务激活(Agent 机制运行)时归活动——视图流控与对话输出由活动驱动;流程流转(节点间、审批点、终态前后)时归系统——流转、审批与终态回执由系统呈现。转交随引擎的激活 / 完成事件自动发生,活动不感知交接。
  • +
  • 输入单入口(必须)——输入侧不参与转交:全部人类输入永远经系统的对话流卡片协议回传;视图区不得产生回环输入;浏览性交互(切换 / 筛选 / 展开)由前端容器本地处理,不回后端。
  • +
  • 负责人可主动输入——对话流的自由输入是人事件的第二形态(卡回传之外):写入任务记忆,loop 作为观察进入后续窗口;不驱动 flow 步。叫停等指令走控制事件,不经自由输入(10)。
  • +
  • 视图流控随范式——loop:AI 按定位与局面临场组织视图流;flow:按步序位置推送声明的模版;两者对 web 同构——web 只渲染推来的内容。
  • +
  • 时间线一致(应)——对话流时间线应与任务记忆一致:时间线即任务记忆的可读投影。
  • +
+ + +

08技能:方法经验的封装格式

+
+ +

工具用法的方法经验,以技能(Skill)为封装格式,基于工具、在活动内定义。一个技能 = 适用描述(何时适用)+ 方法正文(怎么判断、怎么编排工具)+ 结晶片段脚本(可选:反复出现的确定性子序列)+ 知识引用(可选:深层材料,按需下钻)。白名单回答「能用什么」(权力),技能回答「怎么用好」(方法)——棋子确定,棋谱是资产。

+ +
定位声明:技能不是独立范式。它没有自己的约束体系——留痕、治理、权力边界与生命周期全部继承本规范:内容软(方法正文自由,用不用由 AI 决断),边框硬(装配入信封 · 脚本注册留痕 · 不得扩权 · 版本过进化关口)。技能是活动内部的构件格式,不与活动并立。
+ +
+ + + + +
层性质语义
工具白名单硬约束(权力,契约定)不在名单调不动;越权在结构上不可能。
技能清单软资源(方法,包声明)每单任务可装配的技能集合确定、入信封;AI 可用可不用——可以越谱,不可越权;清单版本化,随进化演进。
临场路径自由(由事决定,loop)受上两层约束;走出的新路,经蒸馏可成新技能(09)。
+ +
    +
  • 装配语义——loop:AI 按适用描述临场装配(渐进披露:常驻上下文仅有技能目录,按事加载正文、按需下钻引用);flow:技能编入步序——结晶片段脚本即纯工具步照谱执行。技能被装配 / 调用,不称「触发」——触发器一词专属流程层。
  • +
  • 载方法,不载权力(必须)——技能不得扩大白名单、授权边界与禁区;技能提及的工具不在本活动白名单者,不可调。与 message 同一逻辑:方法不是改约。
  • +
  • 脚本按纯工具规矩(必须)——技能捆绑的脚本必须注册进工具表、经运行时调用而留痕、无环境能力;不得成为绕过留痕的暗道。
  • +
  • 装配入信封(必须)——每步装配了哪些技能及其版本,记入任务记忆的信封;回放与归因依赖之。
  • +
  • 两级组合不混——流程包串活动(责任级:节点有负责人、有审批点、有契约);环内装配技能(方法级:无门无责任)。需要独立负责人与放行的做活动,纯方法复用做技能;技能不能替代活动,活动不应退化为单技能空壳。
  • +
+ + +

09记忆与迭代

+
+ +

基座的记忆系统两分:任务记忆(会话历史——这一单里发生过什么)× 活动记忆(结构化记忆——这类事历来是什么样)。基座的接口最小:任务记忆只有窗口配置,活动记忆只有存与取;框架站在环内一切调用的必经之路上:记录不靠自觉,靠位置。本章讲活动侧怎么用它们:装载、蒸馏,以及记忆如何走向业务模型的迭代。

+ +

9.1任务记忆:当前任务的全过程

+

任务记忆是当前活动实例的会话历史,两股同轴合流、按时间全序:消息历史——Agent 机制的原生逐条记录(观察 · 思考 · 动作 · 结果;flow 中即每步的执行记录),回路跑过即存在;引擎事件流——结构化事件(生命周期迁移 · 前提与 DMN 求值 · 卡与放行裁决 · 步执行)。四条性质:

+
    +
  • 只追加(必须)——原始条目不得修改;信号可迟到(放行裁决 · 后续修订 · 客户回复),以后续条目回链原步累加,不改写因果。
  • +
  • 信封盖戳(必须)——每条盖版本信封:契约 / 业务模型 / 技能版本 + 定位(loop:阶段 · 目标项;flow:步序位置)+ 治理标记;行为可归因、历史可回放的前提。
  • +
  • 治理先行(必须)——脱敏、权限、保留期、可学习标记在留痕时刻打上;不合规的记录不得进入蒸馏队列。
  • +
  • 归侧(必须)——每条按动作类型自动推导执行侧标签(机器产出 / 人产出 / 人裁决 / 世界等待);度量口径归《操作系统》,零埋点。
  • +
+

四项职能:续跑——挂起恢复与事件补投时,由任务记忆重建上下文:记忆在,环可断可续;审计——发生了什么:谁 · 何时 · 依据什么;回放——换个办法,这单会不会成(反事实评估与模型增量的重演底盘,9.3);蒸馏源——活动记忆的唯一原料(9.2)。

+

活动侧唯一接口 = 窗口配置——每次 LLM 调用加载多少轮会话历史,由活动声明(随 Harness 配置);窗口之外的历史不进上下文,但完整在库——续跑、审计与回放永远对全量记录进行。

+

生命周期:随单生,只追加长,终态封卷归档。与任务数据之别:任务数据是事的数据(业务事实,引擎推进的依据);任务记忆是过程的记录(怎么走到这里)。数据写入本身作为事件同轴进入任务记忆——一次写,两处义。

+ +

9.2活动记忆:活动的持久事实

+

活动记忆是关于这个活动(事类)的持久事实,跨全部任务实例累积——活动的长期经验体。它的结构不是自由笔记:每类条目对准业务模型的一个作用面,使记忆天然是 CMMN / DMN 与步序声明优化的原料堆:

+
+ + + + + +
层存什么优化谁
事实层环境与对手方的稳定事实:系统端点脾性、对手方节奏(「该客户均值 3 天回信」)、术语与实体档案校准时间监听的时限 · 前提 ifPart 阈值 · DMN 输入项;flow 的重试与时限参数
模式层路径与组合的统计:裁量项启用频次与共现序列、阶段 / 步耗时分布、技能组合效果候选结构增量:裁量项转常项 · 新前提依赖 · 阶段重组 · 新里程碑;flow 的步序修订
裁决层纠正的沉淀:每次驳回 / 否决 / 叫停的理由,归纳为一般化陈述候选新前提条件 · 收紧完成判据 · DMN 新规则行——约束力收缩的原料堆(03)
例外层反例与禁忌:已知失败形态、边界案例、「此处留人」标记DMN 规则的适用边界 · 前提负向条件 · 技能适用描述修正——防泛化过度
+
    +
  • 条目三件套(必须)——每条活动记忆 = 归纳陈述 + 证据链(指回任务记忆的具体片段,可回放)+ 候选增量(可选:落到业务模型 / 技能的具体 diff,状态:候选 / 回放中 / 已放行 / 已否决)。无证据链的条目不得入库——记忆必须可追溯到经历。
  • +
  • 写入 = 蒸馏(必须)——活动记忆只经蒸馏写入:终态封卷与里程碑达成时,蒸馏钩子从任务记忆归纳;人可修剪。不设直写旁路。
  • +
  • 基座接口 = 存与取——活动记忆是结构化记忆,基座只提供条目的存入与检索、不解释语义;四层结构与条目三件套是本卷规定的活动侧结构标准,由活动经蒸馏与装载维护。
  • +
  • 读出 = 装载——按定位选摘相关条目入 Agent 上下文(渐进披露,3.4);语义引擎不读活动记忆——引擎零业务,记忆是 Agent 侧的输入。
  • +
  • 记忆不载权力(必须)——活动记忆对行为只有参考力,没有强制力;强制力的唯一路径是候选增量经回放与人放行进入业务模型本身(9.3)。记住的影响裁量,放行的才约束行为。
  • +
+ +
+
FIG-05 · 记忆双系:任务记忆 × 活动记忆一单一本 × 一类一本 · 蒸馏与装载 · 候选增量 → 回放 → 人放行 → 模型新版
+ + + + + + + + + + 任务记忆 · 一单一本(消息历史) + + 消息历史 + 引擎事件流 · 同轴合流 · 时间全序 + + 观察 —— 工具返回 · 人的回传 · 数据快照 + + 思考 —— 计划摘要 · 有界披露 + + 动作 / 结果 —— 启动 · 调人 · 写任务数据 + + 引擎事件 —— 迁移 · 求值 · 步执行 · 放行裁决 + + 迟到信号 —— 驳回 · 客户回复 ↩ 回链原步 + + 信封戳 + 版本 × 治理 + 归侧:机器产出 / 人产出 / 人裁决 / 世界等待 —— 口径归《操作系统》 + 治理先行:脱敏 · 权限 · 保留期 · 可学习标记 —— 留痕时刻打上 + 只追加 · 终态封卷归档 —— 摘要是视图,不是记忆本体 + + + 蒸馏钩子 + 终态封卷 / 里程碑达成 + + 装载(3.4) + 按定位选摘 · 渐进披露 + + 活动记忆 · 一类一本(持久事实) + + 跨单累积 —— 每层对准业务模型的一个作用面 + + 事实层 · 端点脾性 · 对手方节奏 · 术语档案 + → 校准时限 · ifPart 阈值 · DMN 输入项 · 重试参数 + + 模式层 · 裁量项频次 · 共现序列 · 阶段 / 步耗时 + → 候选结构增量:转常项 · 新前提 · 阶段重组 · 步序修订 + + 裁决层 · 驳回 / 否决 / 叫停的理由归纳 + → 候选前提条件 · 收紧判据 · DMN 规则行(03) + + 例外层 · 失败形态 · 边界案例 · 留人标记 + → 规则适用边界 · 负向条件 · 防泛化过度 + 条目 = 归纳陈述 + 证据链(指回任务记忆)+ 候选增量 + 写入唯蒸馏(人可修剪) · 语义引擎不读 —— Agent 侧输入 + + + + 候选增量(diff) + + + 回放重演(9.3) + + + 人放行 · 进化关口 + + + 模型新版:CMMN / DMN / 步序 / 技能 + + 下一单装载 + 行为改变(9.3) + + + 记忆不载权力 —— 记住的影响裁量,放行的才约束行为;记忆的终点不是记住,是成为模型 + +
+ +

9.3迭代业务模型,即迭代活动行为

+

引擎与基座是不动点,进化的全部作用面收敛到可版本工件:业务模型(结构与判据)与技能(方法)。迭代单位是模型增量——一份可 diff 的变更:

+
+ + + + + + + +
模型增量类型改变的行为
+ 前提条件(loop)动作解锁时机变化——某些步从此必须等前提;开展的漏斗收紧或放宽
+ 完成判据 / 收紧判据目标集变化——后拉方向改变;此前靠人裁的合格线沉为 L2 机检(约束力收缩)
+ DMN 规则行 / 新决策表(loop)一块判断从临场搬进确定
阶段重组 / 里程碑增删(loop)叙事与汇报结构变化;投影定义随之更新
裁量项转常项 / 动作空间调整(loop)裁量域增删(与技能清单、白名单联动核对)
步序修订(flow)步增删、条件阈值、重试与时限参数、卡内容修订——谱变了,照谱的行为随之变
+
    +
  1. 蒸馏——驳回、否决、叫停、断点的证据(活动记忆 · 裁决层与模式层),蒸馏为候选模型增量(diff)。
  2. +
  3. 回放重演——新模型对历史任务记忆重演:旧成功单在新模型下是否仍全绿?旧失败单是否恰被新条件拦住?断点是否减少?——回放先行。
  4. +
  5. 人放行——增量 diff + 重演报告作为证据包,过进化关口;XML 与步序声明可 diff 审查,说明书同步更新。
  6. +
  7. 生效——模型新版入活动库;下一单任务装载即行为改变,引擎零改动;在途任务按其信封版本跑完。
  8. +
  9. 可回退——版本谱系完整;行为回退 = 版本回退。
  10. +
+
行为可归因公式:任何一步的行为 = 引擎版本 × 契约版本 × 业务模型版本 × 技能版本 × 输入与任务记忆前缀。各项全部入信封——两单行为不同,必可归因到某一项的差异;模型 diff 完全解释行为 diff。这就是「迭代业务模型 = 迭代活动行为」的可审计形态。
+ + +

10Harness · 验收分级 · 过程工作区

+
+ +

10.1Harness:活动的运行框架

+

Harness 在活动内、随活动交付——每个活动的确定性边界不依赖外部编排兜底。四件:

+
+ + + + + +
件内容
停止条件什么算走完:loop = 判据收敛提交放行;flow = 谱走完(末步放行);加上五终态的收场判定(01)。
预算与熔断步数 / token / 时长 / 调人次数四类上限取自契约资源声明,由基座在环外强制——不得由活动代码自查自守;任一触顶即熔断(预算耗尽)。停滞检测:loop = Enabled 集与任务数据皆无变化、且无监听在等的空转;flow = 当前步长期无进展且无监听在等——转受阻或熔断;错误与耗尽不得计为成功。
监听时限一切监听必配时限(04 / 05);监听中是健康态,与停滞分开判定。
中断与恢复控制事件:叫停(转挂起待纠偏,留痕为最重档纠正信号)、暂停、终止(负责人 / 治理台);恢复由事件驱动——挂起期间事件不丢,恢复即补投、断点续跑(任务记忆重建上下文)。
+ +

10.2验收分级:L1–L5

+

契约的验收判据逐条标注验证等级——这是放行卡「成果清单」上每条核对的成色标记:

+
+ + + + + + +
级谁验什么
L1引擎 · 自动形式:schema 校验、必交付物齐备、格式完整
L2引擎 · 自动机检:规则与阈值——loop 的前提 ifPart 与 DMN 判据即 L2 的沉入处;约束力收缩的终点
L3环内 · 实证抽验:试算、干跑、交叉核对——用证据说话
L4独立评审LLM 评审者独立评审;生成者不得自评;等级不得谎报(L4 不得标注为 L1–L3)
L5人 · 放行责任关:放行卡三选一——质量关可全自动,责任关永远是人
+

loop 中 L1 / L2 由语义引擎持续预检(红绿灯);flow 中 L1 / L2 是步完成条件的一部分。L1–L4 是质量关,L5 是责任关——判据全绿只是可提交,完成只出自放行通过(06)。

+ +

10.3过程工作区

+

台账的任务级草稿层——可选、组织自设、不绑范式。任务过程产物落在台账的任务级草稿层:同一套「数据域.数据对象.字段」寻址与事务接口,读己之写——本任务可见、正式版不可见、不产生数据事件;引擎的前提求值读任务视图 = 正式版 + 本任务草稿层(04),跨任务监听只认放行后的正式版事件。要不要草稿、按什么 schema 草拟、怎么组织版本,由活动按需设计;系统只认放行门:放行前不落事实——草稿不碰台账正式版与外部系统,放行通过草稿合并入正式版、动作意向执行(06),此刻才产生数据事件。写即持久,断点可续:草稿层与动作意向持久于系统自持存储,没有「保存」动作;任务做一半的续跑由三份持久状态共同保证——任务记忆(按窗口重建上下文,09)、草稿层(截至断点的过程产物与动作意向)、运行时实例状态(loop 的模型定位与就绪集 / flow 的步序位置);打开任务只是打开呈现,过程在后端要么在跑、要么挂起在等。任务记忆与留痕随过程持续归档,不受门限。

+ + +

11活动包与开发

+
+ +

一个活动以一个活动包交付:系统外独立开发、独立测试、独立版本,经活动库的独立入口安装进系统。原则:内容可以有,权力不能有——包内不得持有任何环境能力,一切能力经活动基座的调用契约注入。

+ +

11.1包内容物

+
+ + + + + + + + + + + + +
内容物说明
契约声明输入 / 输出口 / 必交付物 / 禁区 / 验收判据(分级标注)/ 授权边界 / 资源声明(01)
范式与业务模型loop:CMMN XML + 案例说明书(同版本)+ DMN;flow:步序声明(02 / 03 / 05)
交互内容视图 HTML 模版 · 四卡内容 schema · 汇报组织(07)
技能技能初始版随包播种,以 ID 引用为主、不内嵌——内嵌会使技能升级被迫走发包流程(08)
监听声明(静态)loop 的前提与时间监听 / flow 的步完成条件;时限必配(04 / 05)
Harness 配置停止条件 · 预算参数 · 时限阶梯 · 失败策略(10)
纯工具无外效应的计算 / 转换 / 自持台账操作;安装时注册进工具表、经运行时调用而留痕,不得内联绕过
台账 schema活动数据的使用声明,按数据域.数据对象.字段三级寻址;声明的是要用什么字段,不是对象该定义什么字段——对象 schema = 全部使用声明的最大化合并,只增不破坏(版本升级声明多了就长、少了不缩,无迁移);同名字段类型不一致,以能兼容双方的最宽类型落地(放宽即增,静态审提示不阻塞;语义互斥才拦下,交数据管理裁决);共享域同理;操作走基座的通用事务性接口——数据可以自生长
模型声明活动使用的 LLM 以自定义模型名称(逻辑名)声明;名称背后的实例在系统侧创建绑定(Provider 枚举 / URL / API-Key / Model name,治理台 · 系统管理)——活动不触厂商与密钥;安装静态审核对名称已绑定
蒸馏钩子终态封卷 / 里程碑达成时,从任务记忆归纳活动记忆条目(09)
样例集样例输入 → 期望输出口与载荷形状;首次安装审(无历史任务记忆时替代回放审)与回归的依据——与工具包的契约测试集同构
+
功能工具不随包。按需开发的业务能力工具是独立开发的代码包,经基座的工具箱注册进系统(工具规范另定),账号 / 密钥 / endpoint 配置随工具归组织;活动只声明引用其调用契约。数据可以自生长(schema 声明、宿主物化),权力不可以自生长——功能工具永远先系统、后活动。LLM 工具与人类工具固化在系统里,随系统迭代而更新,声明即用;纯工具可随包。
+ +

11.2开发时序:编排先行,基于声明开发

+
    +
  • 编排定契约——工作流编排先于活动开发:治理台画工作流图(编排五要素),节点的输入输出、依赖的工具与模型随图确定——编排工作流的过程,就是定义活动契约的过程;契约是编排给定、开发实现、安装校核的,工作流图是契约的母体。边的载荷映射随图强制闭合——连一条边即须完成上游载荷 → 下游 data 字段的映射,必填未映射、类型冲突的流程包不得发布;新活动的输入输出声明在编排中就地定义、随边成形(《操作系统》03)。
  • +
  • 导出依赖文件——工作流图画完、契约定好,导出开发该工作流活动库的依赖文件(声明 + 编译选项):所有依赖的接口声明、模型声明、工具声明、输入输出声明。
  • +
  • 基于声明开发与编译——系统外对着声明开发(本地开发宿主:mock 工具表 + 模拟工位(四卡)+ 回放夹具);按活动的编译选项编译出该工作流的多个活动库 .JS——每活动一个编译产物,即活动包。
  • +
  • 导入与装配——活动库 .JS 可批量导入也可单独导入,在活动库中按业务分类(一级)× 活动类型(标准 / 案例)两维分类与版本管理;流程包里按活动名装配:一键自动安装最新版本,或手动控制使用旧版本。
  • +
  • 工具缺口仍契约先行——缺功能工具先定调用契约,活动对声明开发、平台照契约实现注册,两边并行;缺口只阻塞上架(静态审收口),不阻塞开发。
  • +
+ +

11.3安装:活动库入口与两审

+
    +
  • 静态审——声明齐备(契约 / 业务模型 / Harness)、工具调用契约核对(装不齐不上架)、schema 校验、无越权代码(无环境能力、无动态执行)、悬空监听拒绝(4.4)、模版无脚本。
  • +
  • 回放审——新版本先在历史任务记忆上重跑:旧败能成、旧成不坏,方可生效(09 同一重演底盘)。
  • +
  • 版本语义——安装恒为新增、版本并存;在途任务按其启动时版本跑完;生效 / 停用 / 卸载由治理台的活动库管理执行。
  • +
  • 资产与包分离版本化——每活动两条版本序列,各有各的门、各自单写者:包版本管代码 / 契约 / 交互模版 / Harness 声明,变更必系统外重编、走本节两审;资产版本管业务模型 / DMN / 技能——包只携初始版(安装时播种入库),此后资产新版由进化管线在系统内产生(回放 + 人放行,09),不重编包;任务装载 = 包版本 + 各资产当前生效版,全部入信封,行为可归因;包新版携带的资产初始版不覆盖已有更高资产版——覆盖只能是显式的资产回退治理动作。
  • +
+
暗耦合禁令:活动间不得共享自持域的数据表。甲活动写表、乙活动直读,输入 / 输出契约即成谎言——流程层的静态检查被表旁路架空。跨活动的事实只有两条路:经输出口载荷交付(流转的事实),或落共享域(沉淀的事实):`共享域.对象.字段`——各活动声明各自要用的字段,schema 最大化合并自生长;写授权按域.对象在契约申报、白名单核准;目录是治理台数据管理的视图。
+ + +

12合规判据

+
+ +

12.1通用判据(两范式同守,17 条)

+
    +
  • 契约冻结——必须携带机器可校验的输入 / 输出 schema 与验收判据;运行中不得变更契约,变更即新版本。
  • +
  • 无触发器——活动不得内含触发逻辑;启动只经调用方传入输入。
  • +
  • 输入唯一——恰一个输入口,一单任务恰接收一份输入;data 必过 schema 校验,message 不得扩大授权边界。
  • +
  • 业务分支走输出口——业务性的多路结局必须以输出口(必发 / 选择组)表达并随放行发射;不得用异常终态编码业务分支。
  • +
  • 恰一负责人——每单任务必须绑定恰一个负责人;无人环、多人环不得出现。
  • +
  • 完成只出自放行——完成必须且只能由放行卡「放行通过」产生;判据全绿不等于完成;不得存在其他产生「完成」的路径。
  • +
  • 放行前不落事实——过程产物皆为草稿态;写台账、调外部系统、发射输出口集中在放行时点;契约显式预授权的模板动作除外,预授权必须显式列举。
  • +
  • 预检先于放行,落地收敛方成完成——发放行卡前必须完成落地预检(schema · 工具可用与授权 · 连接可达 · 数据冲突),检查可落地才允许放行,预检不过打回环内、不发卡;放行通过即刻落地(附幂等键),落地收敛输出口才发射、终态方成「放行完成」;残余失败走落地失败卡,不得静默成功。
  • +
  • 调人必附上下文——四卡必须携带依据与快照;裸调用必须被基座拒发;调人预算由契约声明并由 Harness 强制。
  • +
  • 监听必配时限——一切监听必须声明时限;无来源又无时限的监听,安装静态审必须拒绝。
  • +
  • 事件幂等——活动对事件的处理必须按事件 ID 幂等;重复投递无副作用。
  • +
  • 留痕完整——任务记忆只追加、信封盖戳、治理先行、归侧标注;原始条目不得修改,信号以回链累加。
  • +
  • 记忆不载权力——活动记忆只有参考力;约束力只经候选增量 + 回放 + 人放行进入业务模型,不得以记忆条目直接拦截或强制。
  • +
  • 蒸馏唯一写入——活动记忆只经蒸馏钩子写入,条目必挂证据链;无证据链的条目不得入库。
  • +
  • 验收等级不得谎报——每条验收判据必须标注真实等级;L4 不得标注为 L1–L3;生成者不得自评。
  • +
  • 无越权代码——活动包不得持有环境能力;一切能力必须经活动基座的调用契约注入。
  • +
  • 活动数据私有——台账必须以 schema 声明、由宿主物化并施治理;活动间不得共享数据表,跨活动事实经输出口或共享对象。
  • +
+ +

12.2loop 判据(8 条)

+
    +
  • 生命周期循 CMMN 规范——案计划 / 计划项 / 里程碑三副标准生命周期;引擎与活动均不得私改迁移拓扑、不得发明状态;守卫仅可参数化。
  • +
  • Enabled ≠ Active——引擎推进到 Enabled 为止;触达世界与关键交付的计划项必须 manualActivationRule = true,启动必出自 Agent 且留痕。
  • +
  • 语义忠实——语义引擎零 LLM、循规范推进;每次迁移与前提求值留痕;语义性前提的裁量评估作为记录留痕。
  • +
  • 能算的不问 LLM——机算前提与 DMN 由语义引擎确定性求值;同输入必同结论。
  • +
  • 结论不可静默覆写——DMN 结论是约束性输入;异议只走「人·决策」或迭代提案。
  • +
  • 模型载事理不载权力——案例模型不得扩大白名单、授权边界与禁区。
  • +
  • 断点判定留痕——调人与立监听必须以「交集为空」的依赖断点为判定依据,判定过程可回放。
  • +
  • 双表示同版本——CMMN XML 与案例说明书同版本发布,不允许分叉;迭代一起放行。
  • +
+ +

12.3flow 判据(6 条)

+
    +
  • 步序声明完整——每步的步型 / 入参映射 / 出参写入 / 完成条件 / 失败策略必须齐备;缺项不得上架。
  • +
  • 零临场调度——运行中不得由 LLM 决定步序、跳步或兜底;LLM 只以被调用工具出现。
  • +
  • 条件必谓词——条件跳步与条件执行必须是任务数据上的确定性谓词,由引擎求值。
  • +
  • 复杂路由上升——多路业务分支、临场判断的路由不得在 flow 内表达;必须上升为流程层网关编排,或改用 loop 范式。
  • +
  • 失败路径声明给定——重试策略与兜底(转人 / 受阻)必须在声明中给定;不得临场发明失败处理。
  • +
  • LLM 步模板冻结——LLM 步的模板与出参 schema 随声明版本冻结;出参必过 schema 校验。
  • +
+ +
+ JCAI · 活动模型 · 活动侧规范 · V2.0 · 关联《操作系统》 + 2026-07-25 +
+ +
+ + diff --git a/docs/编码规范.md b/docs/编码规范.md new file mode 100644 index 0000000..7ffdd80 --- /dev/null +++ b/docs/编码规范.md @@ -0,0 +1,677 @@ +# JCAI 编码规范 + +> **版本 V0.1 · 结构契约 · 2026-07-26 · 读者:Coding Agent** +> +> 本文件是本仓库的**架构约束契约**:任何人或 AI 在本仓库写代码前必须先读完本文件。与本文件冲突的代码是 bug,不是风格问题。 +> +> 语义权威是两卷规范:**《操作系统.html》(V2.15,系统侧)与《活动模型.html》(V2.0,活动侧)**——系统"做什么、什么语义"以两卷为准,本文件不复述也不改写;本文件只规定"代码长什么样、放在哪、谁能依赖谁"。语义冲突以两卷为准,结构冲突以本文件为准;发现两类权威打架,停下来报告,不得自行仲裁。 + +--- + +## 0. 一句话改动原则 + +任何一次改动都必须能被一句话精确描述:**"只改 `<模块路径>` 的 `<层>`,公开契约不变。"** + +这句话成立的充要条件: + +1. 每个模块有**唯一物理边界**(一个目录) +2. 每个模块有**唯一对外出口**(`index.ts`) +3. 依赖方向**单向无环** +4. 以上三条**由工具强制**(§11),不靠自觉 + +--- + +## 1. 技术选型(定案) + +| 领域 | 选型 | 一句话理由 | +|---|---|---| +| 语言 | TypeScript(全栈,ESM only,`"type": "module"`) | 单语言全栈,契约可共享 | +| 运行时 | Node.js 22 LTS | — | +| 包管理 | pnpm workspaces | monorepo 原生,严格依赖隔离 | +| 前端 | React 19 + Vite + TanStack Router | SPA;类型安全路由(路由状态即应用状态,配零过程状态) | +| 前端样式 | 设计令牌 + 原生 CSS(飞书蓝体系,不引 Tailwind/CSS-in-JS) | 两台 PRD 原型的令牌与组件视觉直接平移,双主题(工作台浅色/治理台深轨浅面)已验证 | +| 前端服务端状态 | TanStack Query | 缓存/失效语义现成;SSE 事件按信封目标失效对应缓存(§9.2) | +| 编排画布 | diagram-js(PRD 画布件 1:1 平移) | 布局引擎与画笔(flow-layout/flow-node-paint)是框架无关纯 TS,治理台原型已验证「连线即映射、画图即校验」与蛇形正交布线;React Flow 的 DOM 节点模型需整套重写布局与视觉,弃 | +| 后端 HTTP | Hono(自建应用,**Mastra 以库形态嵌入**) | 鉴权、岗位权限、SSE 全归我们;不暴露 Mastra 默认端点(ADR-001) | +| Agent/编排框架 | **Mastra**(`@mastra/core` + `@mastra/memory` + `@mastra/pg`) | 图编排(挂起/恢复/快照持久)、Agent 回路、会话记忆、工具系统(§6) | +| 模型接入 | Vercel AI SDK provider 工厂(经 Mastra) | 四元绑定(Provider/URL/API-Key/Model)落 provider 工厂 | +| 数据库 | PostgreSQL 16(单库多 schema) | 事件存储、台账自生长、Mastra 存储、队列同库(§7) | +| 系统自持 ORM | Drizzle ORM(+ drizzle-kit 迁移) | 类型安全、迁移随系统版本 | +| 台账自生长 | node-postgres(`pg`)直写(ledger adapter 内) | 运行时 DDL/DML 由声明生成,ORM 静态 schema 不适用 | +| 队列/定时 | pg-boss | PG 原生,先持久后投递、至少一次天然契合 | +| 代码契约校验 | zod | 仓库内 API/DTO | +| 声明数据校验 | ajv(JSON Schema 2020-12 子集) | 活动声明是运行时数据,不是编译期代码(ADR-003) | +| 测试 | Vitest;集成测试用 Testcontainers(PG) | domain 层测试零 mock | +| 门禁 | tsc / ESLint(flat) / dependency-cruiser / 契约快照 | §11 | + +版本号以实现时最新稳定版为准;**新增任何表外依赖 = 契约变更,走 §12 申请**。 + +--- + +## 2. 仓库形态(唯一合法形态) + +``` +repo/ +├── docs/ 两卷规范 + 本文件 + debt.md + adr/ +├── apps/ +│ ├── web/ 前端:工作台 + 治理台 +│ │ └── src/ +│ │ ├── app/ 路由、Provider、鉴权壳、SSE 连接。唯一组装层 +│ │ ├── features/ 前端业务模块(§9 清单) +│ │ │ └── desk-task/ +│ │ │ ├── index.ts 唯一出口 +│ │ │ ├── contract.ts 对外类型 +│ │ │ ├── internal/ +│ │ │ └── __tests__/ +│ │ └── shared/ 无业务语义:typed-fetch、sse hook、format +│ └── api/ 后端:五层的系统侧全部 +│ └── src/ +│ ├── app/ 启动、Hono 路由注册、Mastra 实例、DI 装配、workers +│ ├── modules/ 后端业务模块(§4 清单) +│ │ └── ledger/ +│ │ ├── index.ts 唯一出口(纯 re-export) +│ │ ├── contract.ts 对外类型 +│ │ ├── port.ts 本模块需要外界提供的接口 +│ │ ├── CONTRACT.md 给 AI 读的地址簿 +│ │ ├── internal/ +│ │ │ ├── domain/ 纯逻辑,零 IO,零框架 +│ │ │ ├── usecase/ 编排 domain,依赖 port +│ │ │ └── adapter/ 实现 port(Drizzle/pg/pg-boss/Mastra 只准在这) +│ │ └── __tests__/ +│ └── shared/ +├── packages/ +│ ├── contracts/ 前后端唯一共享点:zod schema + 推导类型(§8.1) +│ ├── activity-sdk/ 活动开发面:基座六件接口 + mock 宿主 + 回放夹具(§8.2) +│ ├── sfeel/ S-FEEL 子集解析与求值,纯函数(§8.3) +│ ├── ui-kit/ 无业务语义展示组件(卡片原语/时间线/净化视图容器) +│ └── utils/ 纯函数,零依赖 +└── activities/ 第一方活动包(「系统外开发」的仓内形态,§8.2) + └── / 只准依赖 @sdk 与 @contracts;禁止 import apps/** +``` + +### 2.1 结构规则 + +- 一个模块 = 一个目录 = 一个能用一句话说清职责的业务概念,通常 5–20 个文件 +- 模块目录名**单数名词、kebab-case**;模块**不可嵌套**,子概念放 `internal/`,大到需要独立就升格为平级模块 +- 文件名 kebab-case,类型名 PascalCase,函数名 camelCase +- 禁止按技术类型分目录(`controllers/`、`services/` 各一坨),按业务概念聚拢 +- `activities/` 下的活动包**不是模块**:它们是活动库的安装物,编译为单文件 ESM 产物,经 `activity-registry` 安装进系统;api 侧任何文件**不得静态 import** `activities/**` + +--- + +## 3. 架构五层 → 代码落点 + +| 架构层(《操作系统》01) | 代码落点 | +|---|---| +| 交互层(工作台 + 治理台) | `apps/web`(features)+ `apps/api` 的 `interaction` / `message` / `human-tool` 模块(协议侧) | +| 流程层(触发器 + 流程包/工作流) | `process`、`trigger` 模块 | +| 引擎层(流程引擎 + 活动基座) | 流程引擎在 `process` 内;活动基座六件 = `ledger` / `memory` / `toolbox` / `llm` / `interaction` + 契约类型(@contracts);范式运行器 = `loop-engine` / `flow-engine` / `skill-engine`;任务运行时 = `task` | +| 调用层(系统调用 · LLM 工具 · 人类工具 · 通道) | `toolbox`(功能工具/纯工具)、`llm`、`human-tool`、`channel` | +| 基座层(数据 · 台账 · 记忆 · 工具箱 · 活动库 · 流程包 · 事件存储) | PostgreSQL 四 schema(§7)+ `event` / `ledger` / `memory` / `toolbox` / `activity-registry` / `process` 各自的 adapter | + +治理台九功能**不设**后端"governance 模块":每个功能是对应模块的管理用例 + `apps/api/src/app/routes/governance/*` 的路由组装;前端是 `gov-*` features。工作台五要素同理(`desk-*` features + 各模块用例)。 + +--- + +## 4. 后端模块清单 + +依赖层级 L1 最低;**import 只准指向更低层级模块的 `index.ts`;同层模块互不 import,协作走 port + app 装配**(§5)。 + +| 层 | 模块 | 职责(一句话) | 语义出处 | +|---|---|---|---| +| L1 | `event` | 统一事件标准:信封存储、归属解析、投递五诺(先持久后投递/同任务按序/至少一次+幂等/死信回执/无主兜底);监听注册表与出站关联记录存放于此——上层经出口写入,归属解析对表匹配,不反向依赖上层 | OS 06 | +| L1 | `org` | 员工与岗位:账号、岗位授权(客体三类×动作三种)、停用前置检查 | OS 02 | +| L1 | `llm` | LLM 实例:自定义模型名 → 四元绑定(Provider 枚举/URL/API-Key/Model),ModelGateway 含录制/回放缝 | OS 04/11 | +| L1 | `ledger` | 数据与台账:三级寻址、通用事务接口、schema 自生长(最大化合并/最宽类型/只增不破坏)、任务级草稿层与任务视图、写三分 | OS 04/09 | +| L2 | `memory` | 任务记忆(会话历史+窗口配置)、活动记忆四层存取、任务日志两级投影、蒸馏钩子执行 | OS 08 | +| L2 | `toolbox` | 功能工具注册与两审、调用契约、效应等级、连接配置声明与凭证绑定、调用留痕、纯工具作用域 | OS 07 | +| L2 | `channel` | 通道实例:入站归一(解析→系统写→数据事件)、出站发送 | OS 07 | +| L2 | `message` | 系统消息:通知、跨任务征答收件箱、死信与回执的人侧呈现 | OS 02/06 | +| L3 | `interaction` | 交互协议:对话流单入口、视图区推送、控制权按态转交、SSE 会话 | OS 02,AM 07 | +| L3 | `human-tool` | 人类工具:工单两模式(执行/验收)+ 对话卡族(决策/补全/评价)的卡协议与回传校验、到达面两路、跨人卡、驳回重答 | OS 05,AM 06 | +| L4 | `release` | 放行与落地:落地预检、放行写合并、幂等落地、落地失败卡、输出口发射 | OS 7.3/09,AM 06 | +| L4 | `activity-registry` | 活动库:包清单六区、安装两审(静态审+回放审)、包版本×资产版本、两维分类、.JS 装载、资产版本进化管线(候选增量状态机 → 回放重演 → 人放行生效 → 回退) | OS 11,AM 11 | +| L4 | `skill-engine` | skill 范式:技能脚本(结晶片段 = 确定性动作链)运行器——装配语义、三层软硬、**载方法不载权力**(脚本引用的工具仍过本活动白名单与调用契约);loop 临场装配 / flow 步引用 / 纯技能活动由 task 直跑 | AM 08 | +| L5 | `loop-engine` | loop 范式:CMMN+DMN 语义引擎(纯 domain)× Agent 回路(Mastra Agent 为 case worker)。**CMMN 子集封顶**:构件与生命周期以 AM 03 构件表 + AM 4.1 两副状态表为全集,不实现 CMMN 1.1 其余构件,扩构件 = 改本行 + ADR;**DMN 落点**:DRD 遍历、决策表求值与命中行留痕在本模块 domain,单元格谓词复用 `@sfeel` | AM 03/04 | +| L5 | `flow-engine` | flow 范式:步序声明运行器(四种步型、重试与兜底、事件即步条件) | AM 05 | +| L6 | `task` | 任务运行时:生命周期与终态五名裁定、Harness 预算执行器/停滞熔断、控制三语义、改派、断点续跑 | OS 04,AM 01/10 | +| L7 | `process` | 流程层:流程包定义与版本、边映射闭合校验、工作流实例(网关/审批点/失败走向/负责人四策略/聚合) | OS 03 | +| L7 | `trigger` | 触发器三类(周期两型/事件/登记),独立配置存放,判定与调用接口调起 | OS 03 | +| L8 | `minute` | 纪要:团队主动记录,可带触发器 | OS 02 | +| L8 | `report` | 汇报:日/周/月/年对任务日志的聚合投影 | OS 02/08 | + +约束: + +- 技能编排属于活动(AM:活动内容物含技能清单)——`skill-engine` 与 loop/flow 同列范式运行器;置于 L4 因两范式依赖它(临场装配/步引用),import 恒向下、免 port。 +- 找不到归属的代码,先怀疑模块拆分错了,再考虑 `shared/`;`shared/` 只收无业务语义的纯工具 +- 度量八指标(OS 8.3)是 `memory`(任务日志)与 `task`(终态/纠正信号)之上的**只读投影**,落 `report` 的用例,不设独立模块 +- 鉴权定调:单组织 cookie session——登录、会话与岗位权限校验中间件在 apps/api 的 app 层实现,权限判定读 `org` 出口;不引 OAuth/OIDC 与多租户机制 + +--- + +## 5. 依赖方向(硬规则) + +### 5.1 顶层 + +``` +apps/web ──┐ + ├─→ packages/contracts ─→ (无依赖) +apps/api ──┘ + ├─→ packages/sfeel, packages/utils +apps/web ──→ packages/ui-kit +activities/* ──→ packages/activity-sdk ──→ packages/contracts +``` + +- `apps/web` 与 `apps/api` 互不 import;跨端唯一通道是 `packages/contracts`(路由契约 zod schema + 推导类型)。**禁止 Hono RPC 客户端**——它要求前端 import 后端类型,违反本条 +- `packages/*` 不得反向 import `apps/*`;`packages/utils` 是叶子 +- `activities/*` 只准 import `@sdk`、`@contracts` 与白名单纯库;`apps/**` 与 `activities/**` 互不静态 import(活动经安装装载,ADR-004) + +### 5.2 应用内 + +``` +app/ ─→ modules/(只经 index.ts)─→ 更低层模块 index.ts ─→ shared/, packages/* +``` + +- `app/` 是唯一组装层:只有这里能同时认识多个模块,new 出 adapter、注入 port、注册路由/worker/Mastra 实例 +- 模块 import 模块:**只准指向 §4 表中层级更低者的 `index.ts`**;同层互需(如 `release` 落地时要发落地失败卡 vs `human-tool`)一律由需要方声明 port、app 层把对方的用例注入 +- 任何文件不得 import `modules/*/internal/**`(同模块自己除外) + +### 5.3 模块内 + +``` +adapter/ ──实现──→ port.ts ←──依赖── usecase/ ──→ domain/ +``` + +- `domain/`:纯函数、值对象、领域错误。**零 IO、零框架、零 Date.now/Math.random**(时钟与随机走 port)。npm 白名单:`zod`、`decimal.js`、`date-fns` + 仓内纯包 `@contracts`、`@sfeel`、`@utils` +- `usecase/`:编排 domain,依赖 `port.ts` 声明的能力(`EventPublisher`、`ModelGateway`、`Clock`…),不 import 任何 adapter +- `adapter/`:实现 port。**Drizzle / pg / pg-boss / @mastra/\* / AI SDK 只准出现在 adapter 与 app**(§11 机器强制) +- 优先导出工厂函数而非 class + +### 5.4 模块依赖图(权威在 §4 层级表,此图为速览) + +```mermaid +graph BT + subgraph L1 + event; org; llm; ledger + end + subgraph L2 + memory; toolbox; channel; message + end + subgraph L3 + interaction; human-tool + end + subgraph L4 + release; activity-registry; skill-engine + end + subgraph L5 + loop-engine; flow-engine + end + task --> loop-engine & flow-engine & activity-registry + loop-engine & flow-engine --> skill-engine + process --> task + trigger --> process + L5 --> L4 --> L3 --> L2 --> L1 +``` + +--- + +## 6. Mastra 能力映射 + +Mastra 承担四件事:**图编排(含挂起/恢复与快照持久)、Agent 回路、会话记忆、工具定义**。它是实现件,不是架构件——**架构语义以两卷为准,Mastra 的概念不得泄漏进 domain/usecase**。 + +### 6.1 映射表 + +| 系统概念 | Mastra 机制 | 落点(adapter) | +|---|---|---| +| 流程包 → 工作流实例(图编排) | 流程包版本(DB 中的 DSL)动态编译为 `createWorkflow`/`createStep` 图;XOR 网关 = `.branch()`,AND 网关 = `.parallel()`,条件求值调 `@sfeel` | `process/internal/adapter/workflow-compiler.ts` | +| 审批点 / 活动节点等终态 | `suspend()` 挂起,快照持久于存储;审批卡回传、任务终态事件到达后按 runId `resume(payload)` | `process` adapter | +| 崩溃后续跑 | Mastra 快照 + 启动时恢复活跃 run(`restartAllActiveWorkflowRuns`) | `app/boot.ts` | +| flow 活动步序 | 每活动版本的步序声明编译为一条 Mastra workflow:步→step(重试参数随声明),人类工具步/监听步 = `suspend()`,人事件/数据事件消费者 `resume` | `flow-engine` adapter | +| loop 活动 Agent 回路 | Mastra `Agent`,`instructions/tools/model` 全部走 `({ requestContext }) =>` 动态形态:按任务注入案例模型装载、白名单工具、活动声明的模型;**回合由 usecase 驱动,不放开自由 maxSteps,预算在环外由 Harness 强制** | `loop-engine/internal/adapter/agent-runner.ts` | +| 任务记忆 = 会话历史 + 窗口配置 | `@mastra/memory` `Memory`,thread = 任务 ID、resource = 活动 ID;**窗口配置 ↔ `options.lastMessages`**(活动唯一记忆接口,AM 09) | `memory` adapter | +| LLM 工具 / 功能工具呈现给 Agent | `createTool`(zod 入参);功能工具由调用契约(JSON Schema)在注册时转换生成,execute 内走 `toolbox` 调用留痕 | `toolbox` adapter | +| 模型四元绑定 | Provider 枚举 → AI SDK provider 工厂(`baseURL`/`apiKey`)→ 模型实例;活动只见自定义模型名,解析在 `llm` | `llm/internal/adapter/model-gateway.ts` | +| 活动记忆四层 / 蒸馏 | **不用** Mastra working memory(语义不合:活动记忆是结构化四层、只经蒸馏写入)——自研 sys 表;装载选摘可选 PgVector 语义召回 | `memory` adapter | + +### 6.2 边界三规则(机器强制,§11) + +1. `@mastra/*` 与 AI SDK 只准出现在 `internal/adapter/**` 与 `app/**` +2. port 与 contract 一律用自定义类型,不得出现 Mastra 类型(`Agent`、`Workflow`、`Memory` 等不出 adapter) +3. Mastra 存储表(`mastra` schema)由 Mastra 单写;业务代码不得直读直写,投影一律经 `memory` 模块出口 + +### 6.3 骨架示例 + +流程包编译(process adapter,示意): + +```ts +// process/internal/adapter/workflow-compiler.ts +import { createWorkflow, createStep } from '@mastra/core/workflows'; +import { evaluate } from '@sfeel'; +import type { ProcessPackage } from '@contracts'; + +export function compile(pkg: ProcessPackage, deps: CompilerDeps) { + const steps = pkg.nodes.map(node => createStep({ + id: node.id, + execute: async ({ inputData, suspend, resumeData }) => { + if (resumeData) return deps.mapOutcome(node, resumeData); // 任务终态/审批回传到达 + await deps.startNode(node, deps.assemble(node.inEdges, inputData)); // 起任务/发审批卡(边映射装配) + return suspend({}); // 等终态事件 resume + }, + })); + // XOR → .branch([[d => evaluate(edge.cond, d), step]...]);AND → .parallel(...) + return createWorkflow({ id: pkg.id + '@' + pkg.version, /* zod io */ }) + .then(/* 按 pkg.edges 组图 */).commit(); +} +``` + +loop 回合驱动(loop-engine usecase,示意——三型行动与断点判定是 domain,Agent 是 port): + +```ts +// loop-engine/internal/usecase/run-turn.ts +export function createTurnRunner(deps: { engine: CmmnEngine; agent: AgentPort; harness: HarnessPort }) { + return async function runTurn(taskId: TaskId) { + await deps.harness.assertBudget(taskId); // 预算环外强制 + const enabled = await deps.engine.evaluate(taskId); // 语义引擎:Enabled 集与红绿灯(零 LLM) + const action = await deps.agent.decide(taskId, enabled); // Agent 决断(Mastra 在 adapter) + switch (action.kind) { // 三型行动,AM 04 + case 'tool': return deps.engine.applyToolResult(taskId, await deps.agent.invoke(action)); + case 'human': return deps.engine.suspendOnCard(taskId, action.card); // 调人 = 立监听听人 + case 'listen': return deps.engine.registerListener(taskId, action.listener); + } + }; +} +``` + +--- + +## 7. 持久层 + +单 PostgreSQL 实例,四个 schema,**各自单写者**——这是「资产与包分离,各自单写者」原则(OS 11.3)在存储上的同构: + +| schema | 内容 | 写者 | 迁移方式 | +|---|---|---|---| +| `sys` | 系统自持:员工/岗位、LLM 实例、工具注册表、活动库(包×资产两序列)、流程包、触发器配置、事件存储、消息、任务与工作流台账、活动记忆四层、回放录制 | 各模块 adapter(经 Drizzle) | drizzle-kit,随系统版本 | +| `ledger` | 活动自生长台账:正式版、任务级草稿层、共享域 | 仅 `ledger` adapter(动态 DDL/DML,raw pg) | 声明合并自生长,无人工迁移 | +| `mastra` | Mastra 存储:线程/消息(任务记忆会话轴)、workflow 快照 | 仅 Mastra(`@mastra/pg` PostgresStore) | Mastra 自管 | +| `queue` | pg-boss 作业表 | 仅 pg-boss | pg-boss 自管 | + +### 7.1 事件存储与投递五诺(实现要点) + +| 承诺(OS 06) | 实现 | +|---|---| +| 先持久后投递 | 信封写 `sys.event` 与 pg-boss 入队在**同一事务** | +| 同任务按序 | 任务级串行消费:按目标 ID 取 advisory lock 的串行执行器 | +| 至少一次 + 幂等 | pg-boss 至少一次;消费侧幂等表(事件 ID × 消费者)唯一约束 | +| 回执与死信走系统通知 | 重试超限 → `message` 模块 port(app 装配) | +| 无主兜底 | 归属解析(`event` domain)无主 → `message` | + +### 7.2 台账自生长与草稿层 + +- 声明合并(最大化合并/最宽兼容类型/只增不破坏)是**纯算法**,落 `ledger/internal/domain/schema-merge.ts`,零 mock 全覆盖测试;DDL 生成与执行在 adapter +- 草稿层:推荐形态为 `ledger.__draft`(task_id × 对象 × 主键 × patch jsonb),读时叠加出**任务视图**;物理形态可换,**功能约束不可变**:读己之写、不产生数据事件、放行合并原子且过数据冲突检查(与 `release` 协作经 port) +- 写三分(系统写/草稿写/放行写)是 `ledger` 出口上的**三个不同方法**,不是一个带 flag 的方法——调用方拿不到"绕门"的形态 + +### 7.3 录制与回放(回放审的底盘) + +两条缝,一个开关:`llm` 的 `ModelGateway` 与 `toolbox` 的 `ToolInvoker` 都支持 `record | replay | live` 模式,录制落 `sys.replay_*`(按任务×步序号)。回放审(OS 11.2)= 用 replay 模式的 adapter 重跑引擎;样例集/契约测试集走同一夹具(@sdk 提供)。**新增任何外部 IO 必须过这两缝之一,否则回放审对它失明——这是新增 port 的验收条件。** + +--- + +## 8. packages 清单 + +### 8.1 `@contracts`(前后端唯一共享点) + +只有 zod schema、常量、品牌类型与推导类型,零实现。内容物按文件: + +``` +envelope.ts 信封六字段 + 四类事件(数据/时间/人/控制) +terminal.ts 终态五名:'released'|'blocked'|'stalled'|'exhausted'|'terminated' + 非终态注记 +card.ts 人类工具 schema:工单两模式(执行 = 空表单/验收 = 可修订报告)+ 对话卡族(决策/补全/评价)+ 落地失败卡(执行工单预置形态)+ 回传协议 +contract7.ts 契约七件(输入 data+message / 输出口 / 必交付物 / 验收判据 L1–L5 / 禁区 / 授权边界 / 资源声明) +process-package.ts 流程包 DSL:节点/边与载荷映射/审批点/两种网关/失败走向四选一/S-FEEL 表达式引用 +manifest.ts 活动包清单六区(身份/契约/声明/资产初始版/样例集/代码入口) +ledger.ts 三级寻址(域.对象.字段)、事务接口 DTO、任务视图 DTO +api/ 路由契约(按面分文件:workbench.ts / governance.ts / ingest.ts) +id.ts 品牌 ID(TaskId/WorkflowId/ActivityId/EventId/StaffId…) +``` + +修改本包任何导出 = 契约变更(§12.4)。 + +### 8.2 `@activity-sdk` 与 `activities/` + +- SDK = 活动开发者看到的世界:**基座六件接口**(`ContractSpec` / `InteractionHandle` / `MemoryHandle` / `LedgerHandle` / `ToolInvoker` / `LlmHandle`)+ `defineActivity()` 入口 + 本地开发宿主(mock 工具表、模拟人类工具(工单/卡)、回放夹具)+ 编译预设(tsup → 单文件 ESM) +- 活动包 ABI(ADR-004):默认导出 `defineActivity({...})` 的返回值;包内不得出现 SDK 与白名单纯库之外的 import,不得触任何环境能力(`process.env`/`fs`/`fetch`…)——**静态审扫描产物 import 与全局引用,不过不上架** +- `activities/` 是第一方活动的仓内工位,与 api 之间**只有安装通道**(registry 装载编译产物),没有代码通道 + +### 8.3 `@sfeel` + +S-FEEL 子集(OS 03 定义域)的解析与求值,纯函数。被 `process`(边条件/失败走向)、`flow-engine`(条件谓词)、`trigger`(判定)、前端 `gov-process`(画布即时校验预览)共用——**求值语义一份代码,前后端同源**;后端裁决为权威。 + +--- + +## 9. 前端(apps/web) + +> **范式 × 交互,双层边界(定调)**:**执行范式是后端实现逻辑的模型,交互模型是前端呈现协议——两层不冲突**(AM 本就规定两范式统一执行契约、对交互层不可区分)。范式 = loop / flow / skill,只存在于引擎层;前端**永远感知不到范式**,只感知统一交互模型——**任务面四区**(任务列表/标题区/工作区/对话区)、**工单两模式**(验收 = AI 拟好的报告可修改;执行 = 指导书 + 空表单)、**对话卡族**(决策/补全/任务评价,补全含「没法填」旁路,决策含自定义收尾项),以 2026-07-26 原型定稿为准。旧文「四卡」是交互层旧措辞,映射:执行卡→执行工单、放行卡→验收(工作区报告 + 对话区验收单)、决策/补全→对话卡;两卷交互章节措辞待同步,同步前**交互结构与视觉以原型为准**,语义打架的落点照前言规矩停下来报告。 + +### 9.1 features 清单 + +| 组 | feature | 职责 | +|---|---|---| +| 工作台 | `desk-task` | 任务要素四区:任务列表 / 标题区 / 工作区(工单两模式 + 驾驶舱)/ 对话区(卡族 + composer 锁);控制权按态转交的呈现 | +| | `desk-approval` | 审批点收件与裁决 | +| | `desk-message` | 消息:通知、跨任务征答就地作答、死信回执 | +| | `desk-minute` | 纪要(可带触发器) | +| | `desk-report` | 汇报:日/周/月/年聚合 | +| 治理台 | `gov-task` | 任务管理:监控、控制事件、改派、任务日志查看 | +| | `gov-staff` | 员工管理:账号、岗位授权、停用检查 | +| | `gov-process` | 流程包编排画布(diagram-js 画布件平移):**连线即映射、画图即校验、不闭合不得发布**;导出依赖文件 | +| | `gov-trigger` | 触发器配置(三类) | +| | `gov-activity` | 活动库:安装/两审结果/两维分类/包×资产版本 | +| | `gov-tool` | 工具管理:注册、白名单、凭证绑定 | +| | `gov-data` | 数据管理:域/对象目录、schema 视图、**记录浏览与管理**(检索/分页/记录详情;修订走草稿写、归档走确认带)、清理归档 | +| | `gov-memory` | 记忆管理:活动记忆四层、修剪 | +| | `gov-system` | 系统管理:LLM 实例四元绑定、通道实例、系统用途模型 | + +### 9.2 前端硬规则 + +- 服务端交互只经 `shared/typed-fetch` + `@contracts/api` 的路由契约;组件内禁止裸 `fetch` +- 对话流与视图区推送经单一 SSE 连接(`app/` 建连,feature 订阅);**前端零过程状态**(OS 10):刷新即从服务端投影重建 +- 视图区容器渲染活动推送的 HTML:**沙箱 iframe(`srcdoc` + `sandbox` 属性)或净化后注入,二选一由 `ui-kit` 的 `ViewContainer` 统一实现,feature 不得自行 `dangerouslySetInnerHTML`**;无脚本执行权(AM 07) +- 卡片表单由 `@contracts/card.ts` schema 驱动渲染与校验,与后端回传校验同 schema +- SSE 事件到达 → 按信封目标(任务/工作流/要素)**失效对应 TanStack Query 缓存**,由订阅层统一做;组件禁止自行轮询或手写缓存 +- 路由状态即应用状态:当前区/页签/下钻栈可从 URL 完整还原(TanStack Router 类型化 search params);内存路由栈只是原型期形态,正式系统必须可深链 + +--- + +## 10. 模块骨架与命名 + +### 10.1 固定骨架 + +新建模块严格照抄,不许发明变体(以 `ledger` 为例): + +```ts +// modules/ledger/contract.ts —— 对外类型,只有类型和常量,没有实现 +export type LedgerAddress = { domain: string; object: string; field?: string }; +export class DraftConflictError extends Error {} +``` + +```ts +// modules/ledger/port.ts —— 本模块要外界提供的能力 +export interface EventPublisher { publish(e: EnvelopeDraft): Promise } +export interface Clock { now(): Date } +``` + +```ts +// modules/ledger/index.ts —— 唯一出口。只做 re-export,不写逻辑 +export type { LedgerAddress } from './contract'; +export { DraftConflictError } from './contract'; +export type { EventPublisher, Clock } from './port'; +export { createLedgerService } from './internal/usecase/ledger-service'; +``` + +规则: + +- `index.ts` 只允许 `export` 语句,零逻辑零副作用 +- `contract.ts` 不得 import `internal/` +- `internal/` 内禁止 barrel 文件,直接引用具体文件 +- 每个模块根有 `CONTRACT.md`(模板见 §12.6) + +### 10.2 术语表(中文概念 → 代码标识符) + +命名以本表为准,禁止一概念多名: + +| 中文 | 代码 | 中文 | 代码 | +|---|---|---|---| +| 活动 / 任务 | activity / task | 放行 / 落地 / 预检 | release / landing / precheck | +| 流程包 / 工作流 | process package / workflow | 驳回(重做/迭代) | reject (redo / revise) | +| 触发器(周期/事件/登记) | trigger (periodic / event / registration) | 终态五名 | released / blocked / stalled / exhausted / terminated | +| 审批点 / 网关(并行/异或) | approval point / gateway (parallel / exclusive) | 叫停 / 暂停 / 终止 | halt / pause / terminate | +| 边与载荷映射 | edge mapping | 台账 / 草稿层 / 任务视图 | ledger / draft layer / task view | +| 负责人 / 岗位 | owner / position | 信封 / 留痕 / 归侧 | envelope / trace / attribution | +| 工单两模式(执行/验收) | work order (execution / acceptance) | 归属解析 / 无主兜底 / 死信 | ownership resolution / unowned fallback / dead letter | +| 对话卡族:决策/补全/评价 | decision / elicitation / rating card | 技能范式 / 结晶片段 | skill paradigm / crystallized fragment | +| 输出口(必发/选择) | output port (mandatory / selective) | 催办 / 时限 / 监听 | nudge / deadline / listener | +| 契约七件 | seven-part contract | 蒸馏 / 装载 / 技能 | distill / load / skill | +| 验收判据 L1–L5 | acceptance criteria | 白名单 / 禁区 / 授权边界 | allowlist / prohibition / authorization boundary | +| 活动记忆四层:事实/模式/裁决/例外 | fact / pattern / verdict / exception layer | 停滞 / 熔断 / 预算 | stall / circuit-break / budget | +| 工作台 / 治理台 | workbench / governance console | 改派 / 起单 | reassign / initiate | + +--- + +## 11. 机器强制配置 + +规范靠嘱咐是守不住的。以下配置必须存在且在 CI 执行;**约束报错时,改代码,不改约束**。 + +### 11.1 tsconfig(根) + +```jsonc +{ + "compilerOptions": { + "strict": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "noImplicitOverride": true, + "verbatimModuleSyntax": true, + "isolatedModules": true, + "moduleResolution": "bundler", + "paths": { + "@contracts": ["./packages/contracts/src/index.ts"], + "@sdk": ["./packages/activity-sdk/src/index.ts"], + "@sfeel": ["./packages/sfeel/src/index.ts"], + "@ui": ["./packages/ui-kit/src/index.ts"], + "@utils": ["./packages/utils/src/index.ts"], + "@modules/*": ["./apps/api/src/modules/*"], + "@features/*": ["./apps/web/src/features/*"] + } + } +} +``` + +### 11.2 更硬的封装(启用) + +每个模块加 workspace 包 `package.json`,用 `exports` 做解析层封装(穿透 internal 直接解析失败): + +```jsonc +{ "name": "@order", "private": true, "exports": { ".": "./index.ts" } } +``` + +### 11.3 ESLint(要点) + +```js +'no-restricted-imports': ['error', { patterns: [ + { group: ['**/internal/**'], message: '禁止穿透模块出口' }, + { group: ['@modules/*/*', '@features/*/*'], message: '只能 import 到模块根' }, + { group: ['../../../*'], message: '跨模块请用路径别名' }, +]}], +'@typescript-eslint/no-explicit-any': 'error', +'@typescript-eslint/consistent-type-imports': 'error', +'@typescript-eslint/ban-ts-comment': 'error', +``` + +### 11.4 dependency-cruiser(在基线规则之上,JCAI 增补) + +基线八条(no-circular / no-cross-module-internal / app-not-into-internal / domain-is-pure / usecase-not-to-adapter / web-not-to-api / packages-are-leaves / no-orphans)由 M0 依名实现(见本节末注),之上增补: + +```js +{ name: 'framework-only-in-adapter', + comment: 'Mastra/AI SDK/Drizzle/pg/pg-boss 只准在 adapter 与 app', + severity: 'error', + from: { path: 'src/modules/.+/internal/(domain|usecase)/' }, + to: { path: 'node_modules/(@mastra|ai|@ai-sdk|drizzle-orm|pg|pg-boss)' } }, +{ name: 'tier-order', + comment: '模块只准依赖 §4 表中更低层级;矩阵与本文件同步维护', + severity: 'error', + from: { path: '^apps/api/src/modules/(process|trigger|minute|report)/' }, + to: { path: '^apps/api/src/modules/$1/' , pathNot: '…按 §4 层级表展开为逐层规则…' } }, +{ name: 'activities-isolated', + severity: 'error', + from: { path: '^activities/' }, to: { path: '^apps/' } }, +{ name: 'apps-not-into-activities', + severity: 'error', + from: { path: '^apps/' }, to: { path: '^activities/' } }, +``` + +`tier-order` 的完整展开由 `tools/gen-depcruise-tiers.ts` 从 §4 层级表(以 JSON 形式维护在 `tools/module-tiers.json`)生成——**改层级 = 改 JSON + 改本文件 §4,一起提交**。 + +八条基线规则不随包携带定义——M0 依规则名实现(语义见其名与 §5 的依赖规则);**本文件自足,门禁配置不依赖任何外部基线文件**。 + +### 11.5 契约快照与 CI 门禁 + +```bash +pnpm tsc --noEmit +pnpm eslint . +pnpm depcruise apps packages activities +pnpm api:check # tsc --emitDeclarationOnly → api-report/ 与 git diff 比对 +pnpm test +``` + +改 `internal/` 时 `api-report/` 纹丝不动;碰了公开契约,diff 立刻可见。 + +--- + +## 12. AI 协作协议(多 Agent 并行 · 主 Agent 编排制) + +### 12.0 角色与授权矩阵 + +三层角色,授权自上而下收窄: + +| 角色 | 职责 | 权限要点 | +|---|---|---| +| 用户(终审) | 只审三类保留项 | ①破坏性契约变更(12.4) ②新增 npm 依赖(§1 表外,12.5#3) ③修改门禁与规则(§11 配置、本文件、module-tiers.json,12.5#8) | +| 主 Agent(唯一集成人) | 拆承包工单派活、仲裁跨模块契约、把关合入主干(12.7)、维护 docs/debt.md 与 ADR | **契约单写者**:`@contracts` 与全部模块契约面(index.ts / contract.ts / port.ts / CONTRACT.md)只经它变更或合入 | +| 子 Agent(模块承包者) | 在承包工单允许范围内自主实现与测试 | 工单范围内 `internal/**` 与 `__tests__/**` 自由改动,不逐次申请;触碰契约面即停,向主 Agent 提变更申请 | + +### 12.1 三段式工作流(承包工单级) + +三段式以**承包工单**为单位,不以单次改动为单位:①侦察(子 Agent 领单后只读摸底:相关模块 CONTRACT.md 摘要、文件清单、当前公开契约签名、改动落点判断)→ ②计划(变更申请单,交主 Agent 批)→ ③执行(严格按单,不增单外文件)。工单范围内的 internal 改动不再逐次申请;越界即停(12.3)。 + +### 12.2 变更申请单模板 + +``` +## 变更申请 +申请人: <子 Agent · 工单号> +审批人: 主 Agent(涉 12.0 用户保留三类的,由主 Agent 上升) +模块: apps/api/src/modules/ledger +变更层: internal/domain +允许修改: internal/domain/schema-merge.ts;__tests__/schema-merge.test.ts(新增) +禁止修改: index.ts, contract.ts, port.ts, 其他任何模块 +契约影响: 无——公开签名不变,api-report/ 预期无 diff +新增依赖: 无 +新增测试: 同名异型取最宽类型;互斥类型拦下报错 +风险: 安装静态审共用该函数,需回归 activity-registry 测试 +``` + +### 12.3 越界条款 + +判断必须改申请范围外的文件才能完成任务时:**立即停止编码**,输出「需要越界:原因 / 最小方案 / 替代方案」,等主 Agent 确认(涉用户保留三类的由主 Agent 上升)。不得先改再说明。 + +### 12.4 契约变更的额外要求 + +修改 `index.ts` / `contract.ts` / `port.ts` / `@contracts` 任何导出,除三段式外还需:①depcruise 反查列出全部下游受影响模块;②同步更新该模块 CONTRACT.md;③更新 api-report/ 快照并单独说明;④破坏性变更走「先加新的、旧的标 `@deprecated`、下个迭代删除」三步。契约变更的执行与合入只归主 Agent(子 Agent 以提案交单);破坏性变更须用户终审(12.0)。 + +### 12.5 禁止清单(未经授权一律禁止;授权主体按 12.0 矩阵——契约面归主 Agent,#3 / #8 与破坏性契约归用户) + +1. 修改任何 `index.ts` / `contract.ts` / `port.ts` / `@contracts` +2. 修改申请范围之外的任何文件;顺手重构、顺手改格式、顺手升级依赖 +3. 新增 npm 依赖(§1 表外) +4. `any`、`as unknown as`、`@ts-ignore`、`@ts-expect-error` +5. 在 `domain/` 写 IO(fetch、fs、db、`Date.now`、`Math.random`) +6. 全局可变状态、单例缓存、模块级 `let` +7. 删除或跳过已有测试 +8. 修改 `.dependency-cruiser.js` / `eslint.config.js` / `tsconfig.json` / `tools/module-tiers.json` 让报错消失 +9. **绕过写三分**:任何台账写入不经 `ledger` 出口的三个方法之一 +10. **绕过两缝**:任何模型调用不经 `ModelGateway`、任何工具执行不经 `ToolInvoker`(回放审会失明) + +### 12.6 提交前自检 + CONTRACT.md + +提交前自检清单,逐条打勾:diff 不超单 / tsc / eslint / depcruise / api-report / 有测试 / 无 any / 无单外重构 / 未动约束配置。每模块 CONTRACT.md 模板: + +```markdown +# module: ledger +职责: 台账:三级寻址、事务接口、schema 自生长、草稿层与任务视图、写三分 +不负责: 放行时机与预检(见 release)、数据事件投递(见 event) +公开出口: index.ts —— <逐项列出> +依赖: @contracts;port:EventPublisher(app 注入 event)、Clock +被依赖: channel, release, activity-registry, loop-engine, flow-engine, task, trigger +不变量: 正式版写入必产生数据事件;草稿写不产生事件;同名异型取最宽兼容类型;声明只增不破坏 +影响半径: index/contract/port 未变 → 对外零影响 +``` + +### 12.7 git 工作流(并行合入) + +- 主干受保护:**只有主 Agent 合入**;合入前五门禁全绿(§11.5),且 api-report/ 的 diff 与申请单「契约影响」声明一致 +- **分支即工单**:每张承包工单一条分支 `wo/<模块>-<短述>`;子 Agent 只在自己分支提交,不碰他人分支与主干 +- 合入 rebase 后快进(或 squash),保持线性历史;冲突回子 Agent 分支解决,主干上不解决冲突 +- 契约面变更单独成分支、单独合入,并**先于**依赖它的实现工单 +- 提交信息 `<模块>: <一句话>`,正文引用工单号 + +--- + +## 13. 对基线工程规范的调整清单 + +依据「不合理可调整」授权,差异全部登记于此。基线工程规范不随包——本表仅记录本文件的出身差异,**本文件自足生效,无需回查基线**: + +| # | 调整 | 理由 | +|---|---|---| +| 1 | `packages/` 增加 `activity-sdk`、`sfeel` 两个**带业务语义**的包(基线只允许 contracts/ui-kit/utils) | 活动 SDK 必须可独立发布给系统外开发者;S-FEEL 求值前后端同源。二者仍受「叶子不依赖 apps」约束 | +| 2 | 新增顶层 `activities/` 工作区 | 「系统外开发」的仓内形态;以 depcruise 双向隔离代偿物理分仓 | +| 3 | 模块互依从「可以互相依赖(经 index)」收紧为「**只准依赖更低层级;同层走 port + app 装配**」 | 20 个模块的自由互依无法靠"不得成环"事后拦截;分层表可生成 depcruise 规则,机器可证 | +| 4 | domain npm 白名单增补仓内纯包 `@contracts` / `@sfeel` / `@utils` | 纯类型与纯函数,不破坏零 IO | +| 5 | 禁止清单增补 #9 写三分、#10 两缝 | 本系统的安全根基在放行门与回放审,须与结构规则同级强制 | + +--- + +## 14. 决策记录(ADR) + +已决(全文为准,细节在 `docs/adr/` 逐条建档): + +- **ADR-001** 自建 Hono 应用,Mastra 以库形态嵌入;不用 Mastra server 对外暴露(鉴权/岗位权限/SSE 全归 app 层;开发期可另起 entry 用 mastra playground) +- **ADR-002** 持久分工:Drizzle(sys)/ raw pg(ledger 动态 DDL)/ pg-boss(队列定时)/ @mastra/pg(mastra schema),四写者互不越界 +- **ADR-003** schema 方言:**声明层 = JSON Schema 2020-12 子集**(活动声明是数据,可 diff 可版本),**代码层 = zod**;运行时校验用 ajv;声明→zod 仅在工具呈现给 LLM 时转换 +- **ADR-004** 活动 .JS 装载 ABI:单文件 ESM,默认导出 `defineActivity()`;能力全部注入(基座六件句柄),零环境能力;静态审扫描产物 import 与全局引用 +- **ADR-005** 工具 `validate` 能力位:调用契约 `capabilities.validate?: true`,预检存在即调(OS 7.3 落地预检第四项) +- **ADR-006** S-FEEL 自研于 `@sfeel`,子集文法冻结于 OS 03;不引第三方 FEEL 引擎 + +留白(实现期再定,各建 ADR 后方可动工):鉴权会话与凭证加密方案;JSON Schema→zod 转换库选型;活动装载的 worker 隔离硬化;活动记忆向量召回启停;e2e 框架。 + +--- + +## 15. 实施序(里程碑) + +每个里程碑必须先立骨架(index/contract/port/CONTRACT.md + 空测试)再填实现;门禁从 M0 起全绿。 + +| 里程碑 | 内容 | +|---|---| +| M0 | 工作区骨架 + 全部门禁跑通(tsc/eslint/depcruise/api:check/test 空转绿)+ 环境自举:docker-compose.yml(PG16,四 schema 初始化)、种子脚本(五名员工与岗位)、tools/module-tiers.json(从 §4 表生成)与 gen-depcruise-tiers.ts | +| M1 | 底座:`@contracts` 首版、`event`、`ledger`、`org`、`llm`(含录制回放缝)| +| M2 | 基座能力:`memory`、`toolbox`、`channel`、`message` | +| M3 | 执行面:`interaction`、`human-tool`、`release`、`activity-registry`、`@sfeel` | +| M4 | 范式引擎与任务:`skill-engine`、`loop-engine`、`flow-engine`、`task`(断点续跑三份持久贯通)| +| M5 | 流程层:`process`(编排校验 + 工作流实例)、`trigger`;`@activity-sdk` + 首个样例活动(`activities/`)| +| M6 | 前端:工作台五要素 → 治理台九功能;`minute`、`report` | + +并行纪律(主 Agent 编排,12.0):**里程碑内模块并行承包**——同层模块互不依赖,天然可并行;**跨里程碑骨架先行**——下一里程碑各模块的 contract.ts / port.ts 骨架由主 Agent 提前冻结,下游子 Agent 对 port 的 mock 开工,不等上游填完;合入顺序按层级自低向高(§4)。 + +--- + +## 16. 新建模块检查清单 + +``` +[ ] 目录名单数名词、kebab-case,且已登记 §4 层级表与 tools/module-tiers.json +[ ] 有 index.ts(纯 re-export)、contract.ts(纯类型)、port.ts(后端) +[ ] usecase 不 import adapter;domain 零 IO;Mastra/DB 只在 adapter +[ ] internal/ 无 barrel 文件 +[ ] 有 CONTRACT.md;有 __tests__/,domain 测试零 mock +[ ] depcruise 通过:无入边指向 internal,无同层依赖 +[ ] 若声明新 port:确认外部 IO 已过录制回放两缝之一(§7.3) +``` + +--- + +## 17. 例外与演进 + +- 本文件的任何例外必须写进本文件并注明原因与预期清理时间;散落的 `eslint-disable` 不算例外,算违规 +- 历史违规集中登记 `docs/debt.md`:旧路径 `warn`、新代码 `error`,清零后升级 +- 规则要改就改本文件并同步改配置(含 `tools/module-tiers.json`),一起提交。只改配置不改文档 = 规则失效 + + diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..9433326 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,160 @@ +// @ts-check +/** + * JCAI ESLint 门禁 —— 编码规范 §11.3 + §12.5 禁止清单的可机检部分。 + * **约束报错时,改代码,不改约束(§11)。** + */ +import js from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import globals from 'globals'; + +const MODULE_DOMAIN = 'apps/api/src/modules/*/internal/domain/**/*.ts'; + +export default tseslint.config( + { + ignores: [ + '**/dist/**', + '**/node_modules/**', + 'api-report/**', + 'tools/depcruise-tiers.generated.cjs', + 'docs/**', + ], + }, + + js.configs.recommended, + ...tseslint.configs.recommended, + + { + languageOptions: { + ecmaVersion: 2023, + sourceType: 'module', + globals: { ...globals.node }, + }, + linterOptions: { reportUnusedDisableDirectives: 'error' }, + rules: { + // §11.3 + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { group: ['**/internal/**'], message: '禁止穿透模块出口(编码规范 §5.2)' }, + { + group: ['@modules/*/*', '@features/*/*'], + message: '只能 import 到模块根(编码规范 §5.2)', + }, + { group: ['../../../*'], message: '跨模块请用路径别名(编码规范 §11.3)' }, + ], + }, + ], + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/ban-ts-comment': 'error', + + // §12.5#4:禁 as unknown as + 'no-restricted-syntax': [ + 'error', + { + selector: 'TSAsExpression > TSAsExpression > TSUnknownKeyword', + message: '禁止 as unknown as(编码规范 §12.5#4)—— 改类型,不改断言', + }, + ], + + // §12.5#6:禁模块级可变状态 + 'no-var': 'error', + 'prefer-const': 'error', + + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, + ], + }, + }, + + // 模块出口的公开签名必须显式(ADR-005 #3:契约快照才不被 internal 推断类型带偏) + { + files: ['apps/api/src/modules/**/*.ts'], + rules: { + '@typescript-eslint/explicit-module-boundary-types': 'error', + }, + }, + + // domain/ 零 IO、零 Date.now / Math.random(§5.3 / §12.5#5) + { + files: [MODULE_DOMAIN], + rules: { + 'no-restricted-properties': [ + 'error', + { object: 'Date', property: 'now', message: 'domain 零时钟:时钟走 port.Clock(§5.3)' }, + { + object: 'Math', + property: 'random', + message: 'domain 零随机:随机走 port(§5.3)', + }, + ], + 'no-restricted-globals': [ + 'error', + { name: 'fetch', message: 'domain 零 IO(§5.3)' }, + { name: 'process', message: 'domain 零环境能力(§5.3)' }, + ], + 'no-restricted-syntax': [ + 'error', + { + selector: 'TSAsExpression > TSAsExpression > TSUnknownKeyword', + message: '禁止 as unknown as(编码规范 §12.5#4)', + }, + { + selector: 'NewExpression[callee.name="Date"][arguments.length=0]', + message: 'domain 零时钟:new Date() 走 port.Clock(§5.3)', + }, + ], + }, + }, + + // 活动包:零环境能力(ADR-004 / AM 12.1) + { + files: ['activities/**/*.ts'], + rules: { + 'no-restricted-globals': [ + 'error', + { name: 'fetch', message: '活动包零环境能力:一切能力经基座六件注入(ADR-004)' }, + { name: 'process', message: '活动包零环境能力(ADR-004)' }, + ], + }, + }, + + // 前端 + { + files: ['apps/web/**/*.{ts,tsx}', 'packages/ui-kit/**/*.{ts,tsx}'], + languageOptions: { globals: { ...globals.browser } }, + rules: { + 'no-restricted-syntax': [ + 'error', + { + selector: 'TSAsExpression > TSAsExpression > TSUnknownKeyword', + message: '禁止 as unknown as(编码规范 §12.5#4)', + }, + { + selector: 'JSXAttribute[name.name="dangerouslySetInnerHTML"]', + message: + 'feature 不得自行 dangerouslySetInnerHTML:活动 HTML 一律经 @ui 的 ViewContainer(§9.2)', + }, + ], + }, + }, + + // 前端 feature 内禁裸 fetch(§9.2) + { + files: ['apps/web/src/features/**/*.{ts,tsx}'], + rules: { + 'no-restricted-globals': [ + 'error', + { name: 'fetch', message: '服务端交互只经 shared/typed-fetch + @contracts/api(§9.2)' }, + ], + }, + }, + + // 工具与配置脚本 + { + files: ['tools/**/*.{ts,mjs,js}', '*.config.{ts,js,mjs}', 'vite.config.ts'], + rules: { 'no-restricted-syntax': 'off' }, + }, +); diff --git a/package.json b/package.json new file mode 100644 index 0000000..ce047cb --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "jcai-wos", + "version": "0.0.0", + "private": true, + "type": "module", + "engines": { + "node": ">=22" + }, + "packageManager": "pnpm@10.33.0", + "scripts": { + "gen:tiers": "node --experimental-strip-types tools/gen-depcruise-tiers.ts", + "typecheck": "tsc --noEmit -p tsconfig.node.json && tsc --noEmit -p tsconfig.web.json", + "lint": "eslint .", + "depcruise": "depcruise apps packages activities", + "api:check": "node tools/api-report.mjs", + "test": "vitest run", + "gates": "pnpm gen:tiers && pnpm typecheck && pnpm lint && pnpm depcruise && pnpm api:check && pnpm test", + "db:up": "docker compose up -d", + "db:down": "docker compose down", + "db:seed": "pnpm --filter @app/api seed", + "dev:api": "pnpm --filter @app/api dev", + "dev:web": "pnpm --filter @app/web dev" + }, + "devDependencies": { + "@eslint/js": "^9.39.0", + "@types/node": "^22.10.2", + "dependency-cruiser": "^16.10.4", + "drizzle-kit": "^0.31.5", + "eslint": "^9.39.0", + "globals": "^16.5.0", + "tsup": "^8.5.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.0", + "vitest": "^3.2.4" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "esbuild" + ] + } +} diff --git a/packages/activity-sdk/package.json b/packages/activity-sdk/package.json new file mode 100644 index 0000000..10a8d84 --- /dev/null +++ b/packages/activity-sdk/package.json @@ -0,0 +1,7 @@ +{ + "name": "@sdk", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { ".": "./src/index.ts" } +} diff --git a/packages/activity-sdk/src/index.ts b/packages/activity-sdk/src/index.ts new file mode 100644 index 0000000..7f57827 --- /dev/null +++ b/packages/activity-sdk/src/index.ts @@ -0,0 +1,5 @@ +/** + * @sdk —— 活动开发面(编码规范 §8.2):基座六件接口 + defineActivity() + 本地开发宿主 + 回放夹具。 + * 活动包 ABI 见 ADR-004。 + */ +export const SDK_VERSION = '0.0.0-m0'; diff --git a/packages/contracts/package.json b/packages/contracts/package.json new file mode 100644 index 0000000..b821a25 --- /dev/null +++ b/packages/contracts/package.json @@ -0,0 +1,7 @@ +{ + "name": "@contracts", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { ".": "./src/index.ts" } +} diff --git a/packages/contracts/src/index.ts b/packages/contracts/src/index.ts new file mode 100644 index 0000000..7d0ba84 --- /dev/null +++ b/packages/contracts/src/index.ts @@ -0,0 +1,6 @@ +/** + * @contracts —— 前后端唯一共享点(编码规范 §8.1)。 + * 只有 zod schema、常量、品牌类型与推导类型,零实现。 + * 修改本包任何导出 = 契约变更(§12.4)。 + */ +export const CONTRACTS_VERSION = '0.0.0-m0'; diff --git a/packages/sfeel/package.json b/packages/sfeel/package.json new file mode 100644 index 0000000..71cc806 --- /dev/null +++ b/packages/sfeel/package.json @@ -0,0 +1,7 @@ +{ + "name": "@sfeel", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { ".": "./src/index.ts" } +} diff --git a/packages/sfeel/src/index.ts b/packages/sfeel/src/index.ts new file mode 100644 index 0000000..d30114c --- /dev/null +++ b/packages/sfeel/src/index.ts @@ -0,0 +1,5 @@ +/** + * @sfeel —— S-FEEL 子集(OS 03 定义域)的解析与求值,纯函数(编码规范 §8.3)。 + * 被 process / flow-engine / trigger 与前端 gov-process 共用:求值语义一份代码,前后端同源。 + */ +export const SFEEL_VERSION = '0.0.0-m0'; diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json new file mode 100644 index 0000000..25b0e48 --- /dev/null +++ b/packages/ui-kit/package.json @@ -0,0 +1,7 @@ +{ + "name": "@ui", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { ".": "./src/index.ts" } +} diff --git a/packages/ui-kit/src/index.ts b/packages/ui-kit/src/index.ts new file mode 100644 index 0000000..b348cb7 --- /dev/null +++ b/packages/ui-kit/src/index.ts @@ -0,0 +1,4 @@ +/** + * @ui —— 无业务语义展示组件(卡片原语 / 时间线 / 净化视图容器 ViewContainer)。 + */ +export const UI_KIT_VERSION = '0.0.0-m0'; diff --git a/packages/utils/__tests__/index.test.ts b/packages/utils/__tests__/index.test.ts new file mode 100644 index 0000000..987aa34 --- /dev/null +++ b/packages/utils/__tests__/index.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, it } from 'vitest'; +import { assertNever, groupBy, isDefined, sortedEntries } from '../src/index.ts'; + +describe('@utils', () => { + it('isDefined 滤掉 null 与 undefined', () => { + expect([1, null, 2, undefined].filter(isDefined)).toEqual([1, 2]); + }); + + it('groupBy 按键分组', () => { + const rows = [ + { pn: 'A', type: 'A' as const }, + { pn: 'B', type: 'B' as const }, + { pn: 'C', type: 'A' as const }, + ]; + expect(groupBy(rows, (r) => r.type)).toEqual({ + A: [rows[0], rows[2]], + B: [rows[1]], + }); + }); + + it('sortedEntries 稳定排序', () => { + expect(sortedEntries({ b: 2, a: 1 })).toEqual([ + ['a', 1], + ['b', 2], + ]); + }); + + it('assertNever 抛错', () => { + expect(() => assertNever('x' as never)).toThrow('未覆盖的分支'); + }); +}); diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 0000000..2773af6 --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,7 @@ +{ + "name": "@utils", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { ".": "./src/index.ts" } +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 0000000..e6d73d1 --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,29 @@ +/** + * @utils —— 纯函数,零依赖(编码规范 §2 / §5.1:叶子包)。 + * 无业务语义;有业务语义的东西不属于这里。 + */ + +/** 穷尽性检查:switch 漏分支时编译期报错 */ +export function assertNever(value: never, message = '未覆盖的分支'): never { + throw new Error(`${message}: ${JSON.stringify(value)}`); +} + +/** 类型守卫:滤掉 null / undefined */ +export function isDefined(value: T | null | undefined): value is T { + return value !== null && value !== undefined; +} + +/** 按键分组 */ +export function groupBy(items: readonly T[], key: (item: T) => K): Record { + const out = {} as Record; + for (const item of items) { + const k = key(item); + (out[k] ??= []).push(item); + } + return out; +} + +/** 稳定排序的键值对遍历(避免 Object.keys 顺序依赖) */ +export function sortedEntries(record: Readonly>): Array<[string, V]> { + return Object.entries(record).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..58081f0 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3752 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@eslint/js': + specifier: ^9.39.0 + version: 9.39.5 + '@types/node': + specifier: ^22.10.2 + version: 22.20.1 + dependency-cruiser: + specifier: ^16.10.4 + version: 16.10.4 + drizzle-kit: + specifier: ^0.31.5 + version: 0.31.10 + eslint: + specifier: ^9.39.0 + version: 9.39.5 + globals: + specifier: ^16.5.0 + version: 16.5.0 + tsup: + specifier: ^8.5.0 + version: 8.5.1(postcss@8.5.23)(tsx@4.23.1)(typescript@5.9.3) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.46.0 + version: 8.65.0(eslint@9.39.5)(typescript@5.9.3) + vitest: + specifier: ^3.2.4 + version: 3.2.7(@types/node@22.20.1)(tsx@4.23.1) + + apps/api: {} + + apps/web: + dependencies: + react: + specifier: ^19.2.0 + version: 19.2.8 + react-dom: + specifier: ^19.2.0 + version: 19.2.8(react@19.2.8) + devDependencies: + '@types/react': + specifier: ^19.2.2 + version: 19.2.17 + '@types/react-dom': + specifier: ^19.2.1 + version: 19.2.3(@types/react@19.2.17) + '@vitejs/plugin-react': + specifier: ^5.0.4 + version: 5.2.0(vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1)) + vite: + specifier: ^7.1.12 + version: 7.3.6(@types/node@22.20.1)(tsx@4.23.1) + + packages/activity-sdk: {} + + packages/contracts: {} + + packages/sfeel: {} + + packages/ui-kit: {} + + packages/utils: {} + +packages: + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.hirok.io' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.hirok.io' + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.6': + resolution: {integrity: sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.5': + resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@rolldown/pluginutils@1.0.0-rc.3': + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} + + '@rollup/rollup-android-arm-eabi@4.62.3': + resolution: {integrity: sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.3': + resolution: {integrity: sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.3': + resolution: {integrity: sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.3': + resolution: {integrity: sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.3': + resolution: {integrity: sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.3': + resolution: {integrity: sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.3': + resolution: {integrity: sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.62.3': + resolution: {integrity: sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.62.3': + resolution: {integrity: sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.62.3': + resolution: {integrity: sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.62.3': + resolution: {integrity: sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.62.3': + resolution: {integrity: sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.62.3': + resolution: {integrity: sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.62.3': + resolution: {integrity: sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.62.3': + resolution: {integrity: sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.62.3': + resolution: {integrity: sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.62.3': + resolution: {integrity: sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.3': + resolution: {integrity: sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.62.3': + resolution: {integrity: sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.62.3': + resolution: {integrity: sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.3': + resolution: {integrity: sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.3': + resolution: {integrity: sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.3': + resolution: {integrity: sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.3': + resolution: {integrity: sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.3': + resolution: {integrity: sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g==} + cpu: [x64] + os: [win32] + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@22.20.1': + resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.17': + resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + + '@typescript-eslint/eslint-plugin@8.65.0': + resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.65.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.65.0': + resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.65.0': + resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.65.0': + resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.65.0': + resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.65.0': + resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.65.0': + resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.65.0': + resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.65.0': + resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react@5.2.0': + resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@vitest/expect@3.2.7': + resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} + + '@vitest/mocker@3.2.7': + resolution: {integrity: sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.7': + resolution: {integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==} + + '@vitest/runner@3.2.7': + resolution: {integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==} + + '@vitest/snapshot@3.2.7': + resolution: {integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==} + + '@vitest/spy@3.2.7': + resolution: {integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==} + + '@vitest/utils@3.2.7': + resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + + acorn-jsx-walk@2.0.0: + resolution: {integrity: sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-loose@8.5.2: + resolution: {integrity: sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==} + engines: {node: '>=0.4.0'} + + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.11.4: + resolution: {integrity: sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + brace-expansion@1.1.16: + resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} + + brace-expansion@5.0.8: + resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + engines: {node: 20 || >=22} + + browserslist@4.28.7: + resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + dependency-cruiser@16.10.4: + resolution: {integrity: sha512-hrxVOjIm8idZ9ZVDGSyyG3SHiNcEUPhL6RTEmO/3wfQWLepH5pA3nuDMMrcJ1DkZztFA7xg3tk8OVO+MmwwH9w==} + engines: {node: ^18.17||>=20} + hasBin: true + + drizzle-kit@0.31.10: + resolution: {integrity: sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==} + hasBin: true + + electron-to-chromium@1.5.396: + resolution: {integrity: sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==} + + enhanced-resolve@5.24.3: + resolution: {integrity: sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==} + engines: {node: '>=10.13.0'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@9.39.5: + resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.4: + resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.3: + resolution: {integrity: sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + memoize@10.2.0: + resolution: {integrity: sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==} + engines: {node: '>=18'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + engines: {node: '>=18'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + peerDependencies: + react: ^19.2.8 + + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + engines: {node: '>=0.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + rollup@4.62.3: + resolution: {integrity: sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + teamcity-service-messages@0.1.14: + resolution: {integrity: sha512-29aQwaHqm8RMX74u2o/h1KbMLP89FjNiMxD9wbF2BbWOnbM+q+d1sCEC+MqCc4QW3NJykn77OMpTFw/xTHIc0w==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths-webpack-plugin@4.2.0: + resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==} + engines: {node: '>=10.13.0'} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsx@4.23.1: + resolution: {integrity: sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.65.0: + resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.3.6: + resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.7: + resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.7 + '@vitest/ui': 3.2.7 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + watskeburt@4.2.3: + resolution: {integrity: sha512-uG9qtQYoHqAsnT711nG5iZc/8M5inSmkGCOp7pFaytKG2aTfIca7p//CjiVzAE4P7hzaYuCozMjNNaLgmhbK5g==} + engines: {node: ^18||>=20} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.7 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@drizzle-team/brocli@0.10.2': {} + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.14.0 + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.28.1': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-arm@0.28.1': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/android-x64@0.28.1': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.28.1': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.28.1': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.28.1': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.28.1': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.28.1': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-arm@0.28.1': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.28.1': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.28.1': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.28.1': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.28.1': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.28.1': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.28.1': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/linux-x64@0.28.1': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.28.1': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.28.1': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.28.1': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.28.1': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.28.1': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.28.1': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.28.1': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@esbuild/win32-x64@0.28.1': + optional: true + + '@eslint-community/eslint-utils@4.10.1(eslint@9.39.5)': + dependencies: + eslint: 9.39.5 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.2': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.6': + dependencies: + ajv: 6.15.0 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.3.0 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.5': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@rolldown/pluginutils@1.0.0-rc.3': {} + + '@rollup/rollup-android-arm-eabi@4.62.3': + optional: true + + '@rollup/rollup-android-arm64@4.62.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.3': + optional: true + + '@rollup/rollup-darwin-x64@4.62.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.3': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.3': + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@22.20.1': + dependencies: + undici-types: 6.21.0 + + '@types/react-dom@19.2.3(@types/react@19.2.17)': + dependencies: + '@types/react': 19.2.17 + + '@types/react@19.2.17': + dependencies: + csstype: 3.2.3 + + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.65.0(eslint@9.39.5)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/type-utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.65.0 + eslint: 9.39.5 + ignore: 7.0.6 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + eslint: 9.39.5 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.65.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.65.0(eslint@9.39.5)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.5 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.65.0': {} + + '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.65.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.65.0(eslint@9.39.5)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + eslint: 9.39.5 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + eslint-visitor-keys: 5.0.1 + + '@vitejs/plugin-react@5.2.0(vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1))': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) + '@rolldown/pluginutils': 1.0.0-rc.3 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.3.6(@types/node@22.20.1)(tsx@4.23.1) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.2.7': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.7(vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1))': + dependencies: + '@vitest/spy': 3.2.7 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.6(@types/node@22.20.1)(tsx@4.23.1) + + '@vitest/pretty-format@3.2.7': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.7': + dependencies: + '@vitest/utils': 3.2.7 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.7': + dependencies: + '@vitest/pretty-format': 3.2.7 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@3.2.7': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.7': + dependencies: + '@vitest/pretty-format': 3.2.7 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + acorn-jsx-walk@2.0.0: {} + + acorn-jsx@5.3.2(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + + acorn-loose@8.5.2: + dependencies: + acorn: 8.17.0 + + acorn-walk@8.3.5: + dependencies: + acorn: 8.17.0 + + acorn@8.17.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.4 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + any-promise@1.3.0: {} + + argparse@2.0.1: {} + + assertion-error@2.0.1: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.11.4: {} + + brace-expansion@1.1.16: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@5.0.8: + dependencies: + balanced-match: 4.0.4 + + browserslist@4.28.7: + dependencies: + baseline-browser-mapping: 2.11.4 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.396 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.7) + + buffer-from@1.1.2: {} + + bundle-require@5.1.0(esbuild@0.27.7): + dependencies: + esbuild: 0.27.7 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001806: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@2.1.3: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@13.1.0: {} + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + consola@3.4.2: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + + deep-is@0.1.4: {} + + dependency-cruiser@16.10.4: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + acorn-jsx-walk: 2.0.0 + acorn-loose: 8.5.2 + acorn-walk: 8.3.5 + ajv: 8.20.0 + commander: 13.1.0 + enhanced-resolve: 5.24.3 + ignore: 7.0.6 + interpret: 3.1.1 + is-installed-globally: 1.0.0 + json5: 2.2.3 + memoize: 10.2.0 + picocolors: 1.1.1 + picomatch: 4.0.5 + prompts: 2.4.2 + rechoir: 0.8.0 + safe-regex: 2.1.1 + semver: 7.8.5 + teamcity-service-messages: 0.1.14 + tsconfig-paths-webpack-plugin: 4.2.0 + watskeburt: 4.2.3 + + drizzle-kit@0.31.10: + dependencies: + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.25.12 + tsx: 4.23.1 + + electron-to-chromium@1.5.396: {} + + enhanced-resolve@5.24.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@9.39.5: + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.5) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.6 + '@eslint/js': 9.39.5 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + esutils@2.0.3: {} + + expect-type@1.4.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.4: {} + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.2 + rollup: 4.62.3 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.3 + keyv: 4.5.4 + + flatted@3.4.3: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + globals@14.0.0: {} + + globals@16.5.0: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + ignore@5.3.2: {} + + ignore@7.0.6: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + ini@4.1.1: {} + + interpret@3.1.1: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + + is-path-inside@4.0.0: {} + + isexe@2.0.0: {} + + joycon@3.1.1: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@3.0.3: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + loupe@3.2.1: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + memoize@10.2.0: + dependencies: + mimic-function: 5.0.1 + + mimic-function@5.0.1: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.8 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.16 + + minimist@1.2.8: {} + + mlly@1.8.2: + dependencies: + acorn: 8.17.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.16: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.51: {} + + object-assign@4.1.1: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + picocolors@1.1.1: {} + + picomatch@4.0.5: {} + + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + postcss-load-config@6.0.1(postcss@8.5.23)(tsx@4.23.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.23 + tsx: 4.23.1 + + postcss@8.5.23: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + punycode@2.3.1: {} + + react-dom@19.2.8(react@19.2.8): + dependencies: + react: 19.2.8 + scheduler: 0.27.0 + + react-refresh@0.18.0: {} + + react@19.2.8: {} + + readdirp@4.1.2: {} + + rechoir@0.8.0: + dependencies: + resolve: 1.22.12 + + regexp-tree@0.1.27: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rollup@4.62.3: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.3 + '@rollup/rollup-android-arm64': 4.62.3 + '@rollup/rollup-darwin-arm64': 4.62.3 + '@rollup/rollup-darwin-x64': 4.62.3 + '@rollup/rollup-freebsd-arm64': 4.62.3 + '@rollup/rollup-freebsd-x64': 4.62.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.3 + '@rollup/rollup-linux-arm-musleabihf': 4.62.3 + '@rollup/rollup-linux-arm64-gnu': 4.62.3 + '@rollup/rollup-linux-arm64-musl': 4.62.3 + '@rollup/rollup-linux-loong64-gnu': 4.62.3 + '@rollup/rollup-linux-loong64-musl': 4.62.3 + '@rollup/rollup-linux-ppc64-gnu': 4.62.3 + '@rollup/rollup-linux-ppc64-musl': 4.62.3 + '@rollup/rollup-linux-riscv64-gnu': 4.62.3 + '@rollup/rollup-linux-riscv64-musl': 4.62.3 + '@rollup/rollup-linux-s390x-gnu': 4.62.3 + '@rollup/rollup-linux-x64-gnu': 4.62.3 + '@rollup/rollup-linux-x64-musl': 4.62.3 + '@rollup/rollup-openbsd-x64': 4.62.3 + '@rollup/rollup-openharmony-arm64': 4.62.3 + '@rollup/rollup-win32-arm64-msvc': 4.62.3 + '@rollup/rollup-win32-ia32-msvc': 4.62.3 + '@rollup/rollup-win32-x64-gnu': 4.62.3 + '@rollup/rollup-win32-x64-msvc': 4.62.3 + fsevents: 2.3.3 + + safe-regex@2.1.1: + dependencies: + regexp-tree: 0.1.27 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.8.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + sisteransi@1.0.5: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + strip-bom@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.17 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tapable@2.3.3: {} + + teamcity-service-messages@0.1.14: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + + tree-kill@1.2.2: {} + + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-interface-checker@0.1.13: {} + + tsconfig-paths-webpack-plugin@4.2.0: + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.24.3 + tapable: 2.3.3 + tsconfig-paths: 4.2.0 + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tsup@8.5.1(postcss@8.5.23)(tsx@4.23.1)(typescript@5.9.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.27.7) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.7 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.23)(tsx@4.23.1) + resolve-from: 5.0.0 + rollup: 4.62.3 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.23 + typescript: 5.9.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + tsx@4.23.1: + dependencies: + esbuild: 0.28.1 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.65.0(eslint@9.39.5)(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@9.39.5)(typescript@5.9.3))(eslint@9.39.5)(typescript@5.9.3) + '@typescript-eslint/parser': 8.65.0(eslint@9.39.5)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@9.39.5)(typescript@5.9.3) + eslint: 9.39.5 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + ufo@1.6.4: {} + + undici-types@6.21.0: {} + + update-browserslist-db@1.2.3(browserslist@4.28.7): + dependencies: + browserslist: 4.28.7 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vite-node@3.2.4(@types/node@22.20.1)(tsx@4.23.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.3.6(@types/node@22.20.1)(tsx@4.23.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1): + dependencies: + esbuild: 0.28.1 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + postcss: 8.5.23 + rollup: 4.62.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 22.20.1 + fsevents: 2.3.3 + tsx: 4.23.1 + + vitest@3.2.7(@types/node@22.20.1)(tsx@4.23.1): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.7 + '@vitest/mocker': 3.2.7(vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1)) + '@vitest/pretty-format': 3.2.7 + '@vitest/runner': 3.2.7 + '@vitest/snapshot': 3.2.7 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.4.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.5 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.6(@types/node@22.20.1)(tsx@4.23.1) + vite-node: 3.2.4(@types/node@22.20.1)(tsx@4.23.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.20.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + watskeburt@4.2.3: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..653ec46 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +packages: + - 'apps/*' + - 'packages/*' + - 'activities/*' + # §11.2 更硬的封装:每个后端模块是一个 workspace 包,exports 只开 index.ts + - 'apps/api/src/modules/*' diff --git a/tools/api-report.mjs b/tools/api-report.mjs new file mode 100644 index 0000000..70aba7d --- /dev/null +++ b/tools/api-report.mjs @@ -0,0 +1,107 @@ +#!/usr/bin/env node +/** + * 契约快照门禁 —— 编码规范 §11.5。 + * + * tsc --emitDeclarationOnly 出全量 .d.ts,只留**契约面**落 api-report/: + * - packages/contracts/** (前后端唯一共享点,§8.1) + * - packages//src/index.d.ts + * - apps/api/src/modules//{index,contract,port}.d.ts + * 然后与 git 比对:改 internal/ 时 api-report/ 纹丝不动;碰了公开契约,diff 立刻可见。 + */ +import { execFileSync } from 'node:child_process'; +import { cpSync, existsSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs'; +import { dirname, join, relative, sep } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = dirname(dirname(fileURLToPath(import.meta.url))); +const tmp = join(root, '.api-tmp'); +const out = join(root, 'api-report'); + +function run(cmd, args, opts = {}) { + return execFileSync(cmd, args, { cwd: root, encoding: 'utf8', stdio: 'pipe', ...opts }); +} + +rmSync(tmp, { recursive: true, force: true }); + +try { + run('node', [ + join(root, 'node_modules', 'typescript', 'bin', 'tsc'), + '-p', + 'tsconfig.node.json', + '--emitDeclarationOnly', + '--declaration', + '--noEmit', + 'false', + '--outDir', + '.api-tmp', + ]); +} catch (err) { + process.stderr.write((err.stdout ?? '') + (err.stderr ?? '')); + process.stderr.write('\napi:check —— 声明生成失败,先修 tsc。\n'); + process.exit(1); +} + +/** 契约面判据:相对 .api-tmp 的路径 */ +function isContractFace(rel) { + const p = rel.split(sep).join('/'); + if (p.startsWith('packages/contracts/')) return true; + if (/^packages\/[^/]+\/src\/index\.d\.ts$/.test(p)) return true; + if (/^apps\/api\/src\/modules\/[^/]+\/(index|contract|port)\.d\.ts$/.test(p)) return true; + return false; +} + +function walk(dir, acc = []) { + if (!existsSync(dir)) return acc; + for (const name of readdirSync(dir)) { + const full = join(dir, name); + if (statSync(full).isDirectory()) walk(full, acc); + else if (full.endsWith('.d.ts')) acc.push(full); + } + return acc; +} + +rmSync(out, { recursive: true, force: true }); +mkdirSync(out, { recursive: true }); + +let kept = 0; +for (const file of walk(tmp)) { + const rel = relative(tmp, file); + if (!isContractFace(rel)) continue; + const dest = join(out, rel); + mkdirSync(dirname(dest), { recursive: true }); + cpSync(file, dest); + kept += 1; +} +rmSync(tmp, { recursive: true, force: true }); + +process.stdout.write(`api:check —— 契约面 ${kept} 个声明文件 → api-report/\n`); + +if (process.argv.includes('--update')) { + process.stdout.write('api:check —— --update:已刷新快照,请连同变更申请一并提交。\n'); + process.exit(0); +} + +let status = ''; +try { + status = run('git', ['status', '--porcelain', '--', 'api-report']); +} catch { + process.stdout.write('api:check —— 非 git 仓库,跳过比对。\n'); + process.exit(0); +} + +if (status.trim() === '') { + process.stdout.write('api:check —— 公开契约无变化 ✔\n'); + process.exit(0); +} + +process.stderr.write('\napi:check —— 公开契约发生变化(§12.4):\n' + status + '\n'); +try { + process.stderr.write(run('git', ['diff', '--', 'api-report'])); +} catch { + /* 首次建立基线时无 diff 可打 */ +} +process.stderr.write( + '\n契约变更须:①depcruise 反查下游 ②同步 CONTRACT.md ③本快照单独说明 ④破坏性走三步弃用。\n' + + '确认无误后:pnpm api:check --update && git add api-report\n', +); +process.exit(1); diff --git a/tools/depcruise-tiers.generated.cjs b/tools/depcruise-tiers.generated.cjs new file mode 100644 index 0000000..5d5ab0c --- /dev/null +++ b/tools/depcruise-tiers.generated.cjs @@ -0,0 +1,237 @@ +/* eslint-disable */ +/** + * 本文件由 tools/gen-depcruise-tiers.ts 从 tools/module-tiers.json 生成。 + * 请勿手改 —— 改层级请改 module-tiers.json 与 编码规范.md §4,然后 pnpm gen:tiers。 + */ +module.exports = [ + { + "name": "tier-order-activity-registry", + "comment": "模块 activity-registry(L4)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/activity-registry/" + }, + "to": { + "path": "^apps/api/src/modules/(flow-engine|loop-engine|minute|process|release|report|skill-engine|task|trigger)/" + } + }, + { + "name": "tier-order-channel", + "comment": "模块 channel(L2)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/channel/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|flow-engine|human-tool|interaction|loop-engine|memory|message|minute|process|release|report|skill-engine|task|toolbox|trigger)/" + } + }, + { + "name": "tier-order-event", + "comment": "模块 event(L1)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/event/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|channel|flow-engine|human-tool|interaction|ledger|llm|loop-engine|memory|message|minute|org|process|release|report|skill-engine|task|toolbox|trigger)/" + } + }, + { + "name": "tier-order-flow-engine", + "comment": "模块 flow-engine(L5)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/flow-engine/" + }, + "to": { + "path": "^apps/api/src/modules/(loop-engine|minute|process|report|task|trigger)/" + } + }, + { + "name": "tier-order-human-tool", + "comment": "模块 human-tool(L3)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/human-tool/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|flow-engine|interaction|loop-engine|minute|process|release|report|skill-engine|task|trigger)/" + } + }, + { + "name": "tier-order-interaction", + "comment": "模块 interaction(L3)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/interaction/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|flow-engine|human-tool|loop-engine|minute|process|release|report|skill-engine|task|trigger)/" + } + }, + { + "name": "tier-order-ledger", + "comment": "模块 ledger(L1)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/ledger/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|channel|event|flow-engine|human-tool|interaction|llm|loop-engine|memory|message|minute|org|process|release|report|skill-engine|task|toolbox|trigger)/" + } + }, + { + "name": "tier-order-llm", + "comment": "模块 llm(L1)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/llm/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|channel|event|flow-engine|human-tool|interaction|ledger|loop-engine|memory|message|minute|org|process|release|report|skill-engine|task|toolbox|trigger)/" + } + }, + { + "name": "tier-order-loop-engine", + "comment": "模块 loop-engine(L5)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/loop-engine/" + }, + "to": { + "path": "^apps/api/src/modules/(flow-engine|minute|process|report|task|trigger)/" + } + }, + { + "name": "tier-order-memory", + "comment": "模块 memory(L2)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/memory/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|channel|flow-engine|human-tool|interaction|loop-engine|message|minute|process|release|report|skill-engine|task|toolbox|trigger)/" + } + }, + { + "name": "tier-order-message", + "comment": "模块 message(L2)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/message/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|channel|flow-engine|human-tool|interaction|loop-engine|memory|minute|process|release|report|skill-engine|task|toolbox|trigger)/" + } + }, + { + "name": "tier-order-minute", + "comment": "模块 minute(L8)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/minute/" + }, + "to": { + "path": "^apps/api/src/modules/(report)/" + } + }, + { + "name": "tier-order-org", + "comment": "模块 org(L1)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/org/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|channel|event|flow-engine|human-tool|interaction|ledger|llm|loop-engine|memory|message|minute|process|release|report|skill-engine|task|toolbox|trigger)/" + } + }, + { + "name": "tier-order-process", + "comment": "模块 process(L7)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/process/" + }, + "to": { + "path": "^apps/api/src/modules/(minute|report|trigger)/" + } + }, + { + "name": "tier-order-release", + "comment": "模块 release(L4)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/release/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|flow-engine|loop-engine|minute|process|report|skill-engine|task|trigger)/" + } + }, + { + "name": "tier-order-report", + "comment": "模块 report(L8)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/report/" + }, + "to": { + "path": "^apps/api/src/modules/(minute)/" + } + }, + { + "name": "tier-order-skill-engine", + "comment": "模块 skill-engine(L4)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/skill-engine/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|flow-engine|loop-engine|minute|process|release|report|task|trigger)/" + } + }, + { + "name": "tier-order-task", + "comment": "模块 task(L6)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/task/" + }, + "to": { + "path": "^apps/api/src/modules/(minute|process|report|trigger)/" + } + }, + { + "name": "tier-order-toolbox", + "comment": "模块 toolbox(L2)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/toolbox/" + }, + "to": { + "path": "^apps/api/src/modules/(activity-registry|channel|flow-engine|human-tool|interaction|loop-engine|memory|message|minute|process|release|report|skill-engine|task|trigger)/" + } + }, + { + "name": "tier-order-trigger", + "comment": "模块 trigger(L7)只准依赖更低层级模块;同层互需一律 port + app 装配(编码规范 §4 / §5.2)", + "severity": "error", + "from": { + "path": "^apps/api/src/modules/trigger/" + }, + "to": { + "path": "^apps/api/src/modules/(minute|process|report)/" + } + }, + { + "name": "module-registered-in-tiers", + "comment": "modules/ 下的每个模块必须登记在 tools/module-tiers.json(编码规范 §16)", + "severity": "error", + "from": {}, + "to": { + "path": "^apps/api/src/modules/([^/]+)/", + "pathNot": "^apps/api/src/modules/(activity-registry|channel|event|flow-engine|human-tool|interaction|ledger|llm|loop-engine|memory|message|minute|org|process|release|report|skill-engine|task|toolbox|trigger)/" + } + } +]; diff --git a/tools/gen-depcruise-tiers.ts b/tools/gen-depcruise-tiers.ts new file mode 100644 index 0000000..f3e95ae --- /dev/null +++ b/tools/gen-depcruise-tiers.ts @@ -0,0 +1,97 @@ +/** + * 从 tools/module-tiers.json(编码规范 §4 层级表的机器形式)生成 depcruise 的 + * tier-order 规则,写入 tools/depcruise-tiers.generated.cjs。 + * + * 规则语义(§5.2):模块只准 import §4 表中**层级更低**者的 index.ts; + * 同层互不 import(协作走 port + app 装配),更高层当然也不行。 + * + * 运行:pnpm gen:tiers(gates 的第一步,产物入库,diff 即规则变更) + */ +import { readFileSync, writeFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; + +const here = dirname(fileURLToPath(import.meta.url)); +const tiersPath = join(here, 'module-tiers.json'); +const outPath = join(here, 'depcruise-tiers.generated.cjs'); + +type TierTable = { tiers: Record }; + +const raw = readFileSync(tiersPath, 'utf8'); +const table = JSON.parse(raw) as TierTable; + +const modulesBase = '^apps/api/src/modules'; + +/** 模块名 → 层级 */ +const tierOf = new Map(); +for (const [tier, modules] of Object.entries(table.tiers)) { + for (const m of modules) { + if (tierOf.has(m)) throw new Error(`模块 ${m} 在层级表中重复出现`); + tierOf.set(m, Number(tier)); + } +} + +const allModules = [...tierOf.keys()].sort(); + +type Rule = { + name: string; + comment: string; + severity: 'error'; + from: { path: string }; + to: { path: string }; +}; + +const rules: Rule[] = []; + +for (const from of allModules) { + const fromTier = tierOf.get(from)!; + // 不得依赖的模块 = 同层其它模块 + 全部更高层模块 + const forbidden = allModules.filter((to) => to !== from && tierOf.get(to)! >= fromTier); + if (forbidden.length === 0) continue; + rules.push({ + name: `tier-order-${from}`, + comment: + `模块 ${from}(L${fromTier})只准依赖更低层级模块;` + + `同层互需一律 port + app 装配(编码规范 §4 / §5.2)`, + severity: 'error', + from: { path: `${modulesBase}/${from}/` }, + to: { path: `${modulesBase}/(${forbidden.join('|')})/` }, + }); +} + +// 未登记模块拦截:modules/ 下出现层级表里没有的目录即报错(§16 检查清单第一条) +const knownGroup = allModules.join('|'); + +const banner = `/* eslint-disable */ +/** + * 本文件由 tools/gen-depcruise-tiers.ts 从 tools/module-tiers.json 生成。 + * 请勿手改 —— 改层级请改 module-tiers.json 与 编码规范.md §4,然后 pnpm gen:tiers。 + */ +`; + +const body = + banner + + 'module.exports = ' + + JSON.stringify( + [ + ...rules, + { + name: 'module-registered-in-tiers', + comment: 'modules/ 下的每个模块必须登记在 tools/module-tiers.json(编码规范 §16)', + severity: 'error', + from: {}, + to: { + path: `${modulesBase}/([^/]+)/`, + pathNot: `${modulesBase}/(${knownGroup})/`, + }, + }, + ], + null, + 2, + ) + + ';\n'; + +writeFileSync(outPath, body, 'utf8'); +process.stdout.write( + `gen-depcruise-tiers: ${rules.length + 1} 条规则 → tools/depcruise-tiers.generated.cjs\n`, +); diff --git a/tools/module-tiers.json b/tools/module-tiers.json new file mode 100644 index 0000000..df44d80 --- /dev/null +++ b/tools/module-tiers.json @@ -0,0 +1,13 @@ +{ + "$comment": "编码规范 §4 后端模块层级表的机器形式。改层级 = 改本文件 + 改 编码规范.md §4,一起提交(§11.4)。", + "tiers": { + "1": ["event", "org", "llm", "ledger"], + "2": ["memory", "toolbox", "channel", "message"], + "3": ["interaction", "human-tool"], + "4": ["release", "activity-registry", "skill-engine"], + "5": ["loop-engine", "flow-engine"], + "6": ["task"], + "7": ["process", "trigger"], + "8": ["minute", "report"] + } +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..8c2d83e --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "target": "ES2023", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "verbatimModuleSyntax": true, + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "allowImportingTsExtensions": true, + "noEmit": true, + "baseUrl": ".", + "paths": { + "@contracts": ["./packages/contracts/src/index.ts"], + "@contracts/*": ["./packages/contracts/src/*"], + "@sdk": ["./packages/activity-sdk/src/index.ts"], + "@sfeel": ["./packages/sfeel/src/index.ts"], + "@ui": ["./packages/ui-kit/src/index.ts"], + "@utils": ["./packages/utils/src/index.ts"], + "@modules/*": ["./apps/api/src/modules/*"], + "@features/*": ["./apps/web/src/features/*"], + "@shared/*": ["./apps/api/src/shared/*"], + "@web-shared/*": ["./apps/web/src/shared/*"] + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..538f249 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.base.json", + "files": [], + "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.web.json" }] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..7c2d103 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "lib": ["ES2023"], + "types": ["node"] + }, + "include": [ + "apps/api/**/*.ts", + "packages/contracts/**/*.ts", + "packages/activity-sdk/**/*.ts", + "packages/sfeel/**/*.ts", + "packages/utils/**/*.ts", + "activities/**/*.ts", + "tools/**/*.ts" + ], + "exclude": ["**/dist/**", "**/node_modules/**"] +} diff --git a/tsconfig.web.json b/tsconfig.web.json new file mode 100644 index 0000000..3235818 --- /dev/null +++ b/tsconfig.web.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "lib": [ + "ES2023", + "DOM", + "DOM.Iterable" + ], + "jsx": "react-jsx" + }, + "include": [ + "apps/web/**/*.ts", + "apps/web/**/*.tsx", + "packages/ui-kit/**/*.ts", + "packages/ui-kit/**/*.tsx", + "apps/web/src/vite-env.d.ts" + ], + "exclude": [ + "**/dist/**", + "**/node_modules/**" + ] +} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..571095c --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from 'vitest/config'; +import { fileURLToPath } from 'node:url'; + +const p = (rel: string) => fileURLToPath(new URL(rel, import.meta.url)); + +export default defineConfig({ + resolve: { + alias: { + '@contracts': p('./packages/contracts/src/index.ts'), + '@sdk': p('./packages/activity-sdk/src/index.ts'), + '@sfeel': p('./packages/sfeel/src/index.ts'), + '@ui': p('./packages/ui-kit/src/index.ts'), + '@utils': p('./packages/utils/src/index.ts'), + '@modules': p('./apps/api/src/modules'), + '@shared': p('./apps/api/src/shared'), + }, + }, + test: { + include: ['{apps,packages,activities}/**/__tests__/**/*.test.ts', '{apps,packages}/**/*.test.ts'], + exclude: ['**/node_modules/**', '**/dist/**'], + passWithNoTests: true, + environment: 'node', + }, +});