@yss123/cage-ai 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -2
  3. package/dist/budget.d.ts +64 -0
  4. package/dist/budget.js +54 -0
  5. package/dist/budget.js.map +1 -0
  6. package/dist/context-read.d.ts +38 -0
  7. package/dist/context-read.js +124 -0
  8. package/dist/context-read.js.map +1 -0
  9. package/dist/context-schema.d.ts +9 -0
  10. package/dist/context-schema.js +16 -0
  11. package/dist/context-schema.js.map +1 -0
  12. package/dist/context.d.ts +27 -0
  13. package/dist/context.js +83 -0
  14. package/dist/context.js.map +1 -0
  15. package/dist/execution-schema.d.ts +9 -0
  16. package/dist/execution-schema.js +20 -0
  17. package/dist/execution-schema.js.map +1 -0
  18. package/dist/history.d.ts +43 -0
  19. package/dist/history.js +139 -0
  20. package/dist/history.js.map +1 -0
  21. package/dist/http.d.ts +15 -0
  22. package/dist/http.js +197 -0
  23. package/dist/http.js.map +1 -0
  24. package/dist/index.d.ts +33 -0
  25. package/dist/index.js +100 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/model-failure.d.ts +66 -0
  28. package/dist/model-failure.js +85 -0
  29. package/dist/model-failure.js.map +1 -0
  30. package/dist/model.d.ts +50 -0
  31. package/dist/model.js +93 -0
  32. package/dist/model.js.map +1 -0
  33. package/dist/models.d.ts +75 -0
  34. package/dist/models.js +241 -0
  35. package/dist/models.js.map +1 -0
  36. package/dist/personalities.d.ts +87 -0
  37. package/dist/personalities.js +191 -0
  38. package/dist/personalities.js.map +1 -0
  39. package/dist/personality-presets.d.ts +14 -0
  40. package/dist/personality-presets.js +24 -0
  41. package/dist/personality-presets.js.map +1 -0
  42. package/dist/prompt.d.ts +67 -0
  43. package/dist/prompt.js +148 -0
  44. package/dist/prompt.js.map +1 -0
  45. package/dist/query.d.ts +13 -0
  46. package/dist/query.js +82 -0
  47. package/dist/query.js.map +1 -0
  48. package/dist/request-plan.d.ts +59 -0
  49. package/dist/request-plan.js +168 -0
  50. package/dist/request-plan.js.map +1 -0
  51. package/dist/responses.d.ts +29 -0
  52. package/dist/responses.js +134 -0
  53. package/dist/responses.js.map +1 -0
  54. package/dist/runtime.d.ts +172 -0
  55. package/dist/runtime.js +1189 -0
  56. package/dist/runtime.js.map +1 -0
  57. package/dist/schema.d.ts +11 -0
  58. package/dist/schema.js +51 -0
  59. package/dist/schema.js.map +1 -0
  60. package/dist/security.d.ts +23 -0
  61. package/dist/security.js +73 -0
  62. package/dist/security.js.map +1 -0
  63. package/dist/state.d.ts +238 -0
  64. package/dist/state.js +11 -0
  65. package/dist/state.js.map +1 -0
  66. package/dist/store.d.ts +113 -0
  67. package/dist/store.js +456 -0
  68. package/dist/store.js.map +1 -0
  69. package/dist/text-stream.d.ts +62 -0
  70. package/dist/text-stream.js +99 -0
  71. package/dist/text-stream.js.map +1 -0
  72. package/dist/tool-catalog.d.ts +23 -0
  73. package/dist/tool-catalog.js +53 -0
  74. package/dist/tool-catalog.js.map +1 -0
  75. package/dist/tools.d.ts +54 -0
  76. package/dist/tools.js +259 -0
  77. package/dist/tools.js.map +1 -0
  78. package/dist/types.d.ts +283 -0
  79. package/dist/types.js +16 -0
  80. package/dist/types.js.map +1 -0
  81. package/package.json +41 -3
@@ -0,0 +1,23 @@
1
+ import { type RuntimeNode } from '@yss123/cage-ontology';
2
+ import type { Execution } from './types.js';
3
+ /**
4
+ * 判断节点能否作为助理业务工具:允许命名查询及 invokedBy 含 user 的命令。
5
+ * 可见性和能力过滤由目录调用方负责;内部 process/job/external 命令不会因名称被模型发现而获得用户入口。
6
+ */
7
+ export declare function callable(node: RuntimeNode): boolean;
8
+ /**
9
+ * 返回当前 ctx 在本体目录中可见且用户可调用的全部业务 key。
10
+ * 这是能力候选集合,目标对象范围和具体约束仍在工具执行时复核。
11
+ */
12
+ export declare function authorizedToolKeys(execution: Pick<Execution, 'ontology' | 'ctx'>): string[];
13
+ /** 仅排序候选,不在这里决定数量。完整定义的成本由请求规划器统一计算。 */
14
+ /**
15
+ * 按已加载工具、当前草稿命令、任务关键词和页面聚合依次收集候选并去重。
16
+ * 页面仅提供排序线索,不限制整个业务目录;此处不按数量截断,完整定义成本由请求规划器统一计算。
17
+ */
18
+ export declare function candidateToolKeys(execution: Pick<Execution, 'ontology' | 'ctx' | 'run'>): string[];
19
+ /**
20
+ * 验证显式加载列表并返回去重 key,数量必须为 1 至 128。
21
+ * 逐项经过当前主体的目录访问与用户可调用检查,未知、不可见或内部命令立即拒绝;本函数不保证这些 schema 最终能装入预算。
22
+ */
23
+ export declare function loadToolKeys(execution: Execution, requested: string[]): string[];
@@ -0,0 +1,53 @@
1
+ /**
2
+ * 从运行时本体目录选择用户可调用的业务工具。
3
+ * 请求规划器用候选顺序决定优先装载哪些完整 schema;本模块只处理可见性、调用身份和 key,不执行业务,也不自行决定 Token 容量。
4
+ */
5
+ import { cageError } from '@yss123/cage-kernel';
6
+ import { ontologyCatalog } from '@yss123/cage-ontology';
7
+ /**
8
+ * 判断节点能否作为助理业务工具:允许命名查询及 invokedBy 含 user 的命令。
9
+ * 可见性和能力过滤由目录调用方负责;内部 process/job/external 命令不会因名称被模型发现而获得用户入口。
10
+ */
11
+ export function callable(node) {
12
+ return node.kind === 'query' || (node.kind === 'command' && node.data.invokedBy.includes('user'));
13
+ }
14
+ /**
15
+ * 返回当前 ctx 在本体目录中可见且用户可调用的全部业务 key。
16
+ * 这是能力候选集合,目标对象范围和具体约束仍在工具执行时复核。
17
+ */
18
+ export function authorizedToolKeys(execution) {
19
+ return ontologyCatalog(execution.ontology).keys(execution.ctx, {}, callable);
20
+ }
21
+ /** 仅排序候选,不在这里决定数量。完整定义的成本由请求规划器统一计算。 */
22
+ /**
23
+ * 按已加载工具、当前草稿命令、任务关键词和页面聚合依次收集候选并去重。
24
+ * 页面仅提供排序线索,不限制整个业务目录;此处不按数量截断,完整定义成本由请求规划器统一计算。
25
+ */
26
+ export function candidateToolKeys(execution) {
27
+ const { ontology, ctx, run } = execution, catalog = ontologyCatalog(ontology);
28
+ const keys = new Set(run.tool_keys ?? []);
29
+ const draft = run.page_context?.draft?.command;
30
+ if (draft && ctx.capabilities.has(draft))
31
+ keys.add(`command:${draft}`);
32
+ for (const key of catalog.keys(ctx, { query: run.input }, callable))
33
+ keys.add(key);
34
+ const aggregate = run.page_context?.subject?.aggregate ?? run.page_context?.view?.aggregate ?? run.page_context?.selection?.aggregate;
35
+ if (aggregate)
36
+ for (const key of catalog.keys(ctx, { aggregate }, callable))
37
+ keys.add(key);
38
+ return [...keys];
39
+ }
40
+ /**
41
+ * 验证显式加载列表并返回去重 key,数量必须为 1 至 128。
42
+ * 逐项经过当前主体的目录访问与用户可调用检查,未知、不可见或内部命令立即拒绝;本函数不保证这些 schema 最终能装入预算。
43
+ */
44
+ export function loadToolKeys(execution, requested) {
45
+ const catalog = ontologyCatalog(execution.ontology), unique = [...new Set(requested)];
46
+ if (!unique.length || unique.length > 128)
47
+ throw cageError('INVALID_INPUT', '工具加载数量必须在 1 至 128 之间');
48
+ for (const key of unique)
49
+ if (!callable(catalog.node(execution.ctx, key)))
50
+ throw cageError('INVALID_INPUT', '只能加载用户可调用的命令或查询');
51
+ return unique;
52
+ }
53
+ //# sourceMappingURL=tool-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-catalog.js","sourceRoot":"","sources":["../src/tool-catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAoB,MAAM,uBAAuB,CAAC;AAG1E;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAiB;IACxC,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAK,IAAI,CAAC,IAAI,CAAC,SAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAClH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAA8C;IAC/E,OAAO,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC/E,CAAC;AAED,wCAAwC;AACxC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAsD;IACtF,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,SAAS,EACtC,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC;IAC/C,IAAI,KAAK,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;IACvE,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnF,MAAM,SAAS,GACb,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,IAAI,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,SAAS,IAAI,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC;IACtH,IAAI,SAAS;QAAE,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,QAAQ,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,CAAC;AACD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,SAAoB,EAAE,SAAmB;IACpE,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,EACjD,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,SAAS,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;IACpG,KAAK,MAAM,GAAG,IAAI,MAAM;QACtB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAAE,MAAM,SAAS,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;IACvG,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { type InCodeEngine } from '@yss123/cage-approval';
2
+ import { z } from 'zod';
3
+ import { type Transaction } from 'kysely';
4
+ import type { Execution, ModelTool } from './types.js';
5
+ /**
6
+ * 模型工具的服务端可执行定义;公开 JSON Schema 与真实 Zod 校验同时保留。
7
+ * effect 决定运行时是否确认、暂停或在事务内完成;模型只看到名称、说明和 input,不获得 execute 函数或数据库连接。
8
+ */
9
+ export interface Tool extends ModelTool {
10
+ /**
11
+ * 可选业务本体 key,供发现和预算选择;基础工具没有 key。
12
+ */
13
+ key?: string;
14
+ /**
15
+ * 真实执行前的输入 schema,与发送给模型的 JSON Schema 对应。
16
+ */
17
+ schema: z.ZodType;
18
+ /**
19
+ * 副作用分类:读、写、用户互动、审批裁决或工具发现/加载。
20
+ */
21
+ effect: 'read' | 'write' | 'interaction' | 'decision' | 'load' | 'discover';
22
+ /**
23
+ * 执行已解析参数;写工具要求运行时传入动作事务,读取工具通常不使用该事务。
24
+ */
25
+ execute(execution: Execution, args: any, tx?: Transaction<any>): Promise<unknown>;
26
+ /**
27
+ * 可选写入确认预览;应重新取当前可见事实并掩码,不在预览阶段提交业务变化。
28
+ */
29
+ preview?(execution: Execution, args: any): Promise<unknown>;
30
+ }
31
+ /**
32
+ * 从已注册 ROUTE 扩展解析进程内审批引擎,供待办、历史与审核工具复用。
33
+ * 只发现框架已注册引擎,不创建外部审批权限,也不按模型任意字符串动态加载实现。
34
+ */
35
+ export declare function engines(execution: Pick<Execution, 'kernel'>): InCodeEngine[];
36
+ /** 注册声明编译成工具;应用无需为每个业务对象重新实现工具。当前权限决定每轮可见目录。 */
37
+ /**
38
+ * 按当前运行模式、主体权限和持久工具选择生成工具集合。
39
+ * 助理可取本体、安全读、已加载业务命令/查询、本人审批及交互/偏好工具;审批仅有上下文读取、策略白名单查询和 review_decide,不获得通用业务写入口。
40
+ * 命名查询要求所有 reads 能力并最多交付 200 行;业务写必须同动作回执事务执行,更新已有对象必须带 expectedVersion,确认预览重新读取并掩码。
41
+ * 发现/加载只产出候选,容量由请求规划器决定;工具名校验、当前授权和内核约束仍在每次实际动作中执行。
42
+ */
43
+ export declare function toolsFor(execution: Execution, selection?: {
44
+ keys: string[];
45
+ discovery: boolean;
46
+ }): Tool[];
47
+ /**
48
+ * 按本轮实际工具列表精确匹配模型名称,再用工具的 Zod schema 解析参数。
49
+ * 未知或当前无权工具返回 FORBIDDEN,参数错误返回稳定输入错误;不允许模型直接指向任意导出函数。
50
+ */
51
+ export declare function checkedTool(tools: Tool[], name: string, input: unknown): {
52
+ tool: Tool;
53
+ args: any;
54
+ };
package/dist/tools.js ADDED
@@ -0,0 +1,259 @@
1
+ /**
2
+ * 把注册表与运行时本体编译为当前主体可见、可校验的模型工具。
3
+ * 请求规划器选择完整定义,运行时按 effect 执行读、写、交互、发现或裁决;工具调用不会绕过内核安全读、领域命令、审批身份或动作回执事务。
4
+ */
5
+ import { cageError, present } from '@yss123/cage-kernel';
6
+ import { ontologyCatalog } from '@yss123/cage-ontology';
7
+ import { aiDecisionSchema, queryPlanSchema } from '@yss123/cage-ai-protocol';
8
+ import { z } from 'zod';
9
+ import { sql } from 'kysely';
10
+ import { randomUUID } from 'node:crypto';
11
+ import { queryPlan } from './query.js';
12
+ import { digest, parse } from './security.js';
13
+ import { authorizedToolKeys, callable, loadToolKeys } from './tool-catalog.js';
14
+ import { readContext } from './context-read.js';
15
+ /**
16
+ * 工具参数通用标识符校验,与 params 共同构成基础输入片段。
17
+ * 名称长度为 1 至 160 字符;params 是默认空对象的参数字典,具体字段合法性由被调用内核读接口继续校验。
18
+ */
19
+ const name = z.string().min(1).max(160), params = z.record(z.string(), z.unknown()).default({});
20
+ /**
21
+ * 本体与证据目录的分页输入,offset 为零基,单页默认 10 项、最多 20 项。
22
+ * 这是目录/证据页限制,不替代业务列表和命名查询各自的行数边界。
23
+ */
24
+ const paging = {
25
+ offset: z.number().int().nonnegative().default(0),
26
+ limit: z.number().int().min(1).max(20).default(10),
27
+ };
28
+ /**
29
+ * 严格的本体搜索输入:允许最长 500 字符关键词、可选聚合筛选和有界分页;空关键词用于浏览目录。
30
+ */
31
+ const searchSchema = z
32
+ .object({ query: z.string().max(500).default(''), aggregate: name.optional(), ...paging })
33
+ .strict();
34
+ /**
35
+ * 从已注册 ROUTE 扩展解析进程内审批引擎,供待办、历史与审核工具复用。
36
+ * 只发现框架已注册引擎,不创建外部审批权限,也不按模型任意字符串动态加载实现。
37
+ */
38
+ export function engines(execution) {
39
+ return execution.kernel.registry.extensions
40
+ .filter((e) => e.kind === 'ROUTE')
41
+ .map((e) => e.value.engine(execution.kernel));
42
+ }
43
+ /**
44
+ * 按 Zod 实例缓存 JSON Schema,避免每轮重复转换完整参数定义;弱引用不会永久保留已废弃声明。
45
+ */
46
+ const inputDefinitions = new WeakMap();
47
+ /**
48
+ * 按命令声明对象缓存 input/expectedVersion 包装 schema;真实执行仍校验当前命令状态、权限与版本。
49
+ */
50
+ const commandSchemas = new WeakMap();
51
+ /**
52
+ * 把名称、说明、Zod schema 和服务端执行/预览函数组合为 Tool。
53
+ * JSON Schema 用于模型理解输入,真实 Zod schema 继续在执行前校验;转换缓存不等于校验缓存或授权缓存。
54
+ */
55
+ function define(name, description, schema, effect, execute, preview) {
56
+ let input = inputDefinitions.get(schema);
57
+ if (!input) {
58
+ input = z.toJSONSchema(schema, { io: 'input', unrepresentable: 'any' });
59
+ inputDefinitions.set(schema, input);
60
+ }
61
+ return { name, description, schema, effect, execute, preview, input };
62
+ }
63
+ /** 注册声明编译成工具;应用无需为每个业务对象重新实现工具。当前权限决定每轮可见目录。 */
64
+ /**
65
+ * 按当前运行模式、主体权限和持久工具选择生成工具集合。
66
+ * 助理可取本体、安全读、已加载业务命令/查询、本人审批及交互/偏好工具;审批仅有上下文读取、策略白名单查询和 review_decide,不获得通用业务写入口。
67
+ * 命名查询要求所有 reads 能力并最多交付 200 行;业务写必须同动作回执事务执行,更新已有对象必须带 expectedVersion,确认预览重新读取并掩码。
68
+ * 发现/加载只产出候选,容量由请求规划器决定;工具名校验、当前授权和内核约束仍在每次实际动作中执行。
69
+ */
70
+ export function toolsFor(execution, selection) {
71
+ const { kernel, ctx, run, ontology } = execution, review = run.mode === 'approval';
72
+ const selected = new Set(selection?.keys ?? run.tool_keys ?? []);
73
+ // 动作执行使用模型调用前持久化的选择,不能在执行中重算并意外撤掉已提供的工具。
74
+ const needsDiscovery = !review &&
75
+ (selection?.discovery ??
76
+ (run.tool_plan ? run.tool_plan.mode === 'discovery' : selected.size < authorizedToolKeys(execution).length));
77
+ const tools = [];
78
+ tools.push(define('context_read', '按引用取回已收起的完整页面、工具回执或会话。先列目录,再用 runId/ref/path 和分页展开;不重新执行业务操作。', z
79
+ .object({
80
+ source: z.enum(['context', 'action', 'conversation']),
81
+ runId: z.uuid().optional(),
82
+ ref: z.uuid().optional(),
83
+ path: z
84
+ .array(z.union([name, z.number().int().nonnegative()]))
85
+ .max(16)
86
+ .default([]),
87
+ ...paging,
88
+ })
89
+ .strict(), 'read', readContext));
90
+ if (!review) {
91
+ tools.push(define('ontology_search', '检索当前权限内的本体摘要,空 query 分页浏览目录。未命中可缩短关键词;详细规则用 ontology_describe 展开。', searchSchema, 'read', async (_e, a) => ontologyCatalog(ontology).search(ctx, a)));
92
+ tools.push(define('ontology_describe', '按本体 key 查看完整规则、字段、参数或关联节点。字段与关系可分页;不会把未返回的部分当作不存在。', z
93
+ .object({
94
+ key: name,
95
+ section: z.enum(['overview', 'fields', 'input', 'related']).default('overview'),
96
+ ...paging,
97
+ })
98
+ .strict(), 'read', async (_e, a) => ontologyCatalog(ontology).describe(ctx, a.key, a.section, a.offset, a.limit)));
99
+ if (needsDiscovery) {
100
+ tools.push(define('tool_search', '检索可用业务命令和查询,支持分页。命中的候选会在预算内自动加载完整参数,下一轮即可调用;以回执 loaded 为准,未命中可缩短关键词或分页浏览。', searchSchema, 'discover', async (_e, a) => ontologyCatalog(ontology).search(ctx, a, callable)));
101
+ tools.push(define('tool_load', '已知本体 key 时显式加载完整业务工具定义。搜索已自动加载的工具无需再次加载;完整参数超出预算时需减少 keys。', z.object({ keys: z.array(name).min(1).max(128) }).strict(), 'load', async (e, a) => loadToolKeys(e, a.keys)));
102
+ }
103
+ tools.push(define('data_get', '按聚合名和 ID 读取当前权限内的对象。', z.object({ aggregate: name, id: z.uuid() }).strict(), 'read', (e, a) => kernel.read.get(a.aggregate, a.id, e.ctx)));
104
+ tools.push(define('data_list', '按声明字段过滤并分页读取;默认 20 条,最多 200 条。', z.object({ aggregate: name, params }).strict(), 'read', (e, a) => kernel.read.list(a.aggregate, a.params, e.ctx)));
105
+ tools.push(define('data_related', '按字段声明分页读取关联对象。', z.object({ aggregate: name, id: z.uuid(), field: name, params }).strict(), 'read', (e, a) => kernel.read.related(a.aggregate, a.id, a.field, a.params, e.ctx)));
106
+ tools.push(define('data_query', '执行有限查询计划,支持范围过滤和统计,不接受 SQL。', queryPlanSchema, 'read', (e, a) => queryPlan(kernel, e.ctx, a)));
107
+ }
108
+ // 查询同时受 reads 能力与审批策略白名单限制;助理还要求完整 schema 已装载,搜索命中不等于当前已可执行。
109
+ for (const query of kernel.registry.queries) {
110
+ if (!query.reads.every((agg) => ctx.capabilities.has(`${agg.name}.read`)) ||
111
+ (review && !run.policy.context.queries?.includes(query.name)))
112
+ continue;
113
+ if (!review && !selected.has(`query:${query.name}`))
114
+ continue;
115
+ tools.push(define(`query_${digest(query.name).slice(0, 16)}`, `${query.name}: ${query.description ?? '已声明查询'}`, query.input, 'read', async (e, a) => {
116
+ const rows = await kernel.read.run(query, a, e.ctx);
117
+ return { source: `query:${query.name}`, rows: rows.slice(0, 200), truncated: rows.length > 200, limit: 200 };
118
+ }));
119
+ tools[tools.length - 1].key = `query:${query.name}`;
120
+ }
121
+ if (review) {
122
+ tools.push(define('review_decide', '完成本审批节点:pass 通过,return 退回修改,manual 转人工。须说明理由并引用 subject 或已执行的 query:名称。', aiDecisionSchema, 'decision', async (_e, a) => a));
123
+ return tools;
124
+ }
125
+ // 只暴露用户身份入口。命令 schema 加 expectedVersion 包装,真实写入复用内核流水线并与持久动作回执同事务。
126
+ for (const command of kernel.registry.commands) {
127
+ if (!command.cmd.invokedBy.includes('user') || !ctx.capabilities.has(command.capability))
128
+ continue;
129
+ if (!selected.has(`command:${command.capability}`))
130
+ continue;
131
+ let schema = commandSchemas.get(command.cmd);
132
+ if (!schema) {
133
+ schema = z.object({ input: command.cmd.input, expectedVersion: z.number().int().positive().optional() }).strict();
134
+ commandSchemas.set(command.cmd, schema);
135
+ }
136
+ tools.push(define(`command_${digest(command.capability).slice(0, 16)}`, `${command.capability}: ${command.cmd.description ?? '领域命令'}。修改现有对象必须提供读取到的 expectedVersion。`, schema, 'write', async (e, a, tx) => {
137
+ if (!tx)
138
+ throw new Error('命令必须与动作回执在同一事务执行');
139
+ if (command.cmd.from !== 'new' && !a.expectedVersion)
140
+ throw cageError('INVALID_INPUT', '修改需要 expectedVersion');
141
+ return kernel.executePresentedIn(tx, command.cmd, { ...a.input, expectedVersion: a.expectedVersion }, { ...e.ctx, idempotencyKey: undefined });
142
+ }, async (e, a) => {
143
+ if (command.cmd.from !== 'new' && !a.expectedVersion)
144
+ throw cageError('INVALID_INPUT', '修改需要 expectedVersion');
145
+ const subject = command.cmd.from !== 'new' ? await kernel.read.get(command.cmd.agg, a.input.id, e.ctx) : null;
146
+ if (subject && subject.version !== a.expectedVersion)
147
+ throw cageError('CONFLICT');
148
+ return {
149
+ command: command.capability,
150
+ input: present(command.cmd.agg, a.input, e.ctx),
151
+ expectedVersion: a.expectedVersion,
152
+ subject,
153
+ };
154
+ }));
155
+ tools[tools.length - 1].key = `command:${command.capability}`;
156
+ }
157
+ // 进度查询面向可读单据,不能拿“本人待办为空”推断流程已结束或尚未开始。
158
+ tools.push(define('approval_history', '查询可读业务对象的审批进度、当前步骤、历史轮次及可见审核理由。询问单据到哪一步时使用;本人没有待办也能查看有权读取的单据进度。', z.object({ aggregate: name, id: z.uuid() }).strict(), 'read', async (e, a) => {
159
+ await kernel.read.get(a.aggregate, a.id, e.ctx);
160
+ return (await Promise.all(engines(e).map((engine) => engine.history(a.aggregate, a.id, e.ctx))))
161
+ .flat()
162
+ .sort((a, b) => b.createdAt.localeCompare(a.createdAt));
163
+ }));
164
+ // 本人待办仍需逐个确认业务对象可读;不可读项被省略,不能用空列表推断整个审批流程不存在。
165
+ tools.push(define('approval_tasks', '读取当前用户的待办;决定必须通过 approval_decide。', z.object({}).strict(), 'read', async (e) => {
166
+ const result = [];
167
+ for (const engine of engines(e))
168
+ for (const task of await engine.tasksOf(e.ctx.userId, e.ctx.tenantId)) {
169
+ try {
170
+ const record = await kernel.read.get(task.aggregate, task.businessKey, e.ctx);
171
+ result.push({ ...task, vars: undefined, record });
172
+ }
173
+ catch (error) {
174
+ if (!['FORBIDDEN', 'NOT_FOUND'].includes(error.code))
175
+ throw error;
176
+ }
177
+ }
178
+ return result;
179
+ }));
180
+ const taskSchema = z
181
+ .object({
182
+ process: name,
183
+ taskId: z.uuid(),
184
+ outcome: z.enum(['approved', 'rejected', 'returned']),
185
+ comment: z.string().max(1000).optional(),
186
+ // 将用户确认绑定到待办版本;不能在执行时自动换成最新版本而让旧确认批准转回来的新任务。
187
+ expectedRevision: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),
188
+ })
189
+ .strict();
190
+ tools.push(define('approval_decide', '对本人待办通过、拒绝或退回修改;携带 approval_tasks 返回的 revision 作为 expectedRevision,委派未归还时不能决定。', taskSchema, 'write', async (e, a, tx) => {
191
+ const engine = engines(e).find((v) => v.route.process === a.process);
192
+ if (!engine || !tx)
193
+ throw cageError('NOT_FOUND');
194
+ return engine.decideIn(tx, a.taskId, e.ctx.userId, e.ctx.tenantId, a.outcome, a.comment, a.expectedRevision);
195
+ }, async (e, a) => {
196
+ const engine = engines(e).find((v) => v.route.process === a.process);
197
+ const task = (await engine?.tasksOf(e.ctx.userId, e.ctx.tenantId))?.find((t) => t.id === a.taskId);
198
+ if (!task)
199
+ throw cageError('NOT_FOUND');
200
+ if (task.delegation === 'pending')
201
+ throw cageError('INVALID_TRANSITION');
202
+ if ((task.assignment === 'candidate' || Object.values(task.actions).some(Boolean)) && a.expectedRevision === undefined)
203
+ throw cageError('INVALID_INPUT');
204
+ if (a.expectedRevision !== undefined && a.expectedRevision !== task.revision)
205
+ throw cageError('CONFLICT');
206
+ return {
207
+ process: a.process,
208
+ taskId: a.taskId,
209
+ outcome: a.outcome,
210
+ comment: a.comment,
211
+ expectedRevision: a.expectedRevision,
212
+ subject: await kernel.read.get(task.aggregate, task.businessKey, e.ctx),
213
+ };
214
+ }));
215
+ tools.push(define('request_input', '缺少操作参数或意图不明确时向用户提问并暂停。', z.object({ prompt: z.string().min(1).max(2000) }).strict(), 'interaction', async (_e, a) => a));
216
+ tools.push(define('request_page_context', '请当前发起页面提供新快照并暂停;跨标签页快照不可替换。', z.object({ prompt: z.string().min(1).max(2000) }).strict(), 'interaction', async (_e, a) => a));
217
+ // 偏好按当前用户隔离并始终要求运行时确认。内容用途由工具说明约束,schema 只限制长度,不声称具有敏感语义识别能力。
218
+ tools.push(define('memory_remember', '经用户确认保存表达偏好;不能保存密码、授权或业务查询结果。', z.object({ key: z.string().min(1).max(100), value: z.string().min(1).max(1000) }).strict(), 'write', async (e, a, tx) => {
219
+ if (!tx)
220
+ throw new Error('记忆写入需要动作事务');
221
+ // 多个会话可以并发执行,偏好配额按用户串行核验,避免同时通过最后一个名额。
222
+ await sql `select pg_advisory_xact_lock(hashtext(${e.ctx.tenantId}), hashtext(${e.ctx.userId}))`.execute(tx);
223
+ const existing = await tx
224
+ .selectFrom('sys.ai_memory')
225
+ .select('id')
226
+ .where('tenant_id', '=', e.ctx.tenantId)
227
+ .where('user_id', '=', e.ctx.userId)
228
+ .where('key', '=', a.key)
229
+ .executeTakeFirst();
230
+ if (!existing) {
231
+ const count = await tx
232
+ .selectFrom('sys.ai_memory')
233
+ .select('id')
234
+ .where('tenant_id', '=', e.ctx.tenantId)
235
+ .where('user_id', '=', e.ctx.userId)
236
+ .execute();
237
+ if (count.length >= 50)
238
+ throw cageError('RATE_LIMITED', '最多保存 50 条偏好');
239
+ }
240
+ await tx
241
+ .insertInto('sys.ai_memory')
242
+ .values({ id: randomUUID(), tenant_id: e.ctx.tenantId, user_id: e.ctx.userId, ...a })
243
+ .onConflict((oc) => oc.columns(['tenant_id', 'user_id', 'key']).doUpdateSet({ value: a.value, updated_at: new Date() }))
244
+ .execute();
245
+ return { remembered: true, key: a.key };
246
+ }, async (_e, a) => a));
247
+ return tools;
248
+ }
249
+ /**
250
+ * 按本轮实际工具列表精确匹配模型名称,再用工具的 Zod schema 解析参数。
251
+ * 未知或当前无权工具返回 FORBIDDEN,参数错误返回稳定输入错误;不允许模型直接指向任意导出函数。
252
+ */
253
+ export function checkedTool(tools, name, input) {
254
+ const tool = tools.find((t) => t.name === name);
255
+ if (!tool)
256
+ throw cageError('FORBIDDEN', '工具未注册或当前主体无权调用');
257
+ return { tool, args: parse(tool.schema, input) };
258
+ }
259
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAY,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAoB,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA4BhD;;;GAGG;AACH,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EACrC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACzD;;;GAGG;AACH,MAAM,MAAM,GAAG;IACb,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACnD,CAAC;AACF;;GAEG;AACH,MAAM,YAAY,GAAG,CAAC;KACnB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;KACzF,MAAM,EAAE,CAAC;AACZ;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,SAAoC;IAC1D,OAAO,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU;SACxC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAClD,CAAC;AACD;;GAEG;AACH,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAAsC,CAAC;AAC3E;;GAEG;AACH,MAAM,cAAc,GAAG,IAAI,OAAO,EAAqB,CAAC;AACxD;;;GAGG;AACH,SAAS,MAAM,CACb,IAAY,EACZ,WAAmB,EACnB,MAAiB,EACjB,MAAsB,EACtB,OAAwB,EACxB,OAAyB;IAEzB,IAAI,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACxE,CAAC;AAED,gDAAgD;AAChD;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,SAAoB,EAAE,SAAkD;IAC/F,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,SAAS,EAC9C,MAAM,GAAG,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACjE,yCAAyC;IACzC,MAAM,cAAc,GAClB,CAAC,MAAM;QACP,CAAC,SAAS,EAAE,SAAS;YACnB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACjH,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,cAAc,EACd,+DAA+D,EAC/D,CAAC;SACE,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QACrD,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;QAC1B,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;QACxB,IAAI,EAAE,CAAC;aACJ,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;aACtD,GAAG,CAAC,EAAE,CAAC;aACP,OAAO,CAAC,EAAE,CAAC;QACd,GAAG,MAAM;KACV,CAAC;SACD,MAAM,EAAE,EACX,MAAM,EACN,WAAW,CACZ,CACF,CAAC;IACF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,iBAAiB,EACjB,mEAAmE,EACnE,YAAY,EACZ,MAAM,EACN,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAC1D,CACF,CAAC;QACF,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,mBAAmB,EACnB,oDAAoD,EACpD,CAAC;aACE,MAAM,CAAC;YACN,GAAG,EAAE,IAAI;YACT,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;YAC/E,GAAG,MAAM;SACV,CAAC;aACD,MAAM,EAAE,EACX,MAAM,EACN,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAC9F,CACF,CAAC;QACF,IAAI,cAAc,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,aAAa,EACb,2EAA2E,EAC3E,YAAY,EACZ,UAAU,EACV,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,CACpE,CACF,CAAC;YACF,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,WAAW,EACX,4DAA4D,EAC5D,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAC1D,MAAM,EACN,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CACxC,CACF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,UAAU,EACV,sBAAsB,EACtB,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EACpD,MAAM,EACN,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CACpD,CACF,CAAC;QACF,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,WAAW,EACX,gCAAgC,EAChC,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAC9C,MAAM,EACN,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CACzD,CACF,CAAC;QACF,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,cAAc,EACd,gBAAgB,EAChB,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EACzE,MAAM,EACN,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAC3E,CACF,CAAC;QACF,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,YAAY,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpF,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAC5B,CACF,CAAC;IACJ,CAAC;IACD,6DAA6D;IAC7D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC5C,IACE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC;YACrE,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE7D,SAAS;QACX,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC;YAAE,SAAS;QAC9D,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,SAAS,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAC1C,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,IAAI,OAAO,EAAE,EAChD,KAAK,CAAC,KAAK,EACX,MAAM,EACN,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;YACpD,OAAO,EAAE,MAAM,EAAE,SAAS,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC/G,CAAC,CACF,CACF,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,eAAe,EACf,yEAAyE,EACzE,gBAAgB,EAChB,UAAU,EACV,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CACnB,CACF,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,mEAAmE;IACnE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE,SAAS;QACnG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,UAAU,EAAE,CAAC;YAAE,SAAS;QAC7D,IAAI,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;YAClH,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,WAAW,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EACpD,GAAG,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,kCAAkC,EAC7F,MAAM,EACN,OAAO,EACP,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE;YACjB,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe;gBAClD,MAAM,SAAS,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;YAC3D,OAAO,MAAM,CAAC,kBAAkB,CAC9B,EAAE,EACF,OAAO,CAAC,GAAG,EACX,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,EAClD,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,CACxC,CAAC;QACJ,CAAC,EACD,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe;gBAClD,MAAM,SAAS,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9G,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,eAAe;gBAAE,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;YAClF,OAAO;gBACL,OAAO,EAAE,OAAO,CAAC,UAAU;gBAC3B,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC;gBAC/C,eAAe,EAAE,CAAC,CAAC,eAAe;gBAClC,OAAO;aACR,CAAC;QACJ,CAAC,CACF,CACF,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,UAAU,EAAE,CAAC;IAChE,CAAC;IACD,sCAAsC;IACtC,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,kBAAkB,EAClB,iEAAiE,EACjE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EACpD,MAAM,EACN,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC7F,IAAI,EAAE;aACN,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5D,CAAC,CACF,CACF,CAAC;IACF,8CAA8C;IAC9C,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,gBAAgB,EAChB,mCAAmC,EACnC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EACrB,MAAM,EACN,KAAK,EAAE,CAAC,EAAE,EAAE;QACV,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC;YAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAO,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvE,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC9E,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpD,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;wBAAE,MAAM,KAAK,CAAC;gBACpE,CAAC;YACH,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC,CACF,CACF,CAAC;IACF,MAAM,UAAU,GAAG,CAAC;SACjB,MAAM,CAAC;QACN,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE;QAChB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACrD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACxC,6CAA6C;QAC7C,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;KAClF,CAAC;SACD,MAAM,EAAE,CAAC;IACZ,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,iBAAiB,EACjB,gFAAgF,EAChF,UAAU,EACV,OAAO,EACP,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;YAAE,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAO,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAChH,CAAC,EACD,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAO,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;QACpG,IAAI,CAAC,IAAI;YAAE,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,MAAM,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,gBAAgB,KAAK,SAAS;YAAE,MAAM,SAAS,CAAC,eAAe,CAAC,CAAC;QACzJ,IAAI,CAAC,CAAC,gBAAgB,KAAK,SAAS,IAAI,CAAC,CAAC,gBAAgB,KAAK,IAAI,CAAC,QAAQ;YAAE,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;QAC1G,OAAO;YACL,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;YACpC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC;SACxE,CAAC;IACJ,CAAC,CACF,CACF,CAAC;IACF,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,eAAe,EACf,wBAAwB,EACxB,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAC1D,aAAa,EACb,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CACnB,CACF,CAAC;IACF,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,sBAAsB,EACtB,6BAA6B,EAC7B,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAC1D,aAAa,EACb,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CACnB,CACF,CAAC;IACF,8DAA8D;IAC9D,KAAK,CAAC,IAAI,CACR,MAAM,CACJ,iBAAiB,EACjB,+BAA+B,EAC/B,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAC1F,OAAO,EACP,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QACvC,uCAAuC;QACvC,MAAM,GAAG,CAAA,yCAAyC,CAAC,CAAC,GAAG,CAAC,QAAQ,eAAe,CAAC,CAAC,GAAG,CAAC,MAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7G,MAAM,QAAQ,GAAG,MAAM,EAAE;aACtB,UAAU,CAAC,eAAe,CAAC;aAC3B,MAAM,CAAC,IAAI,CAAC;aACZ,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;aACvC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,MAAO,CAAC;aACpC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;aACxB,gBAAgB,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,EAAE;iBACnB,UAAU,CAAC,eAAe,CAAC;iBAC3B,MAAM,CAAC,IAAI,CAAC;iBACZ,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;iBACvC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,MAAO,CAAC;iBACpC,OAAO,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE;gBAAE,MAAM,SAAS,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,EAAE;aACL,UAAU,CAAC,eAAe,CAAC;aAC3B,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,MAAO,EAAE,GAAG,CAAC,EAAE,CAAC;aACrF,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CACjB,EAAE,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CACpG;aACA,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IAC1C,CAAC,EACD,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CACnB,CACF,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,IAAY,EAAE,KAAc;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI;QAAE,MAAM,SAAS,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;AACnD,CAAC"}