@my-life-buddies/buddy-runtime 0.24.0-dev.4 → 0.24.0-dev.6

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 (52) hide show
  1. package/README.md +23 -107
  2. package/dist/conversation/agent.d.ts +1 -7
  3. package/dist/conversation/agent.d.ts.map +1 -1
  4. package/dist/conversation/agent.js +6 -64
  5. package/dist/conversation/agent.js.map +1 -1
  6. package/dist/conversation/index.d.ts +2 -6
  7. package/dist/conversation/index.d.ts.map +1 -1
  8. package/dist/conversation/index.js +3 -34
  9. package/dist/conversation/index.js.map +1 -1
  10. package/dist/conversation/mlbMessageAgentMessageConverter.js +1 -1
  11. package/dist/conversation/mlbMessageAgentMessageConverter.js.map +1 -1
  12. package/dist/index.d.ts +0 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/mlbClient.d.ts +36 -5
  16. package/dist/mlbClient.d.ts.map +1 -1
  17. package/dist/mlbClient.js +52 -33
  18. package/dist/mlbClient.js.map +1 -1
  19. package/dist/model.d.ts +3 -3
  20. package/dist/model.d.ts.map +1 -1
  21. package/dist/model.js +18 -6
  22. package/dist/model.js.map +1 -1
  23. package/dist/server.d.ts.map +1 -1
  24. package/dist/server.js +4 -78
  25. package/dist/server.js.map +1 -1
  26. package/dist/tools/hybridSearch.d.ts +14 -0
  27. package/dist/tools/hybridSearch.d.ts.map +1 -0
  28. package/dist/tools/hybridSearch.js +66 -0
  29. package/dist/tools/hybridSearch.js.map +1 -0
  30. package/dist/types.d.ts +6 -20
  31. package/dist/types.d.ts.map +1 -1
  32. package/package.json +2 -2
  33. package/dist/services/cache.d.ts +0 -15
  34. package/dist/services/cache.d.ts.map +0 -1
  35. package/dist/services/cache.js +0 -58
  36. package/dist/services/cache.js.map +0 -1
  37. package/dist/services/manifest.d.ts +0 -3
  38. package/dist/services/manifest.d.ts.map +0 -1
  39. package/dist/services/manifest.js +0 -19
  40. package/dist/services/manifest.js.map +0 -1
  41. package/dist/services/session.d.ts +0 -10
  42. package/dist/services/session.d.ts.map +0 -1
  43. package/dist/services/session.js +0 -57
  44. package/dist/services/session.js.map +0 -1
  45. package/dist/services/types.d.ts +0 -122
  46. package/dist/services/types.d.ts.map +0 -1
  47. package/dist/services/types.js +0 -2
  48. package/dist/services/types.js.map +0 -1
  49. package/dist/tools/service.d.ts +0 -18
  50. package/dist/tools/service.d.ts.map +0 -1
  51. package/dist/tools/service.js +0 -25
  52. package/dist/tools/service.js.map +0 -1
@@ -1,58 +0,0 @@
1
- export class ServiceCredentialCache {
2
- snapshot;
3
- freshUntil = 0;
4
- generation = 0;
5
- inFlight;
6
- fetchSnapshot;
7
- now;
8
- constructor(fetchSnapshot, now = Date.now) {
9
- this.fetchSnapshot = fetchSnapshot;
10
- this.now = now;
11
- }
12
- invalidate() { this.generation += 1; this.freshUntil = 0; }
13
- /** 仅允许网络客户端的确认结果进入;返回值均深拷贝,创作者不能改坏缓存。 */
14
- accept(value) {
15
- validate(value);
16
- if (this.snapshot && value.revision < this.snapshot.revision)
17
- return;
18
- this.generation += 1;
19
- this.snapshot = structuredClone(value);
20
- // 用平台给的 TTL 长度而非绝对时间比较,避免设备时钟偏差导致长期不刷新。
21
- this.freshUntil = this.now() + Math.max(0, value.nextRefreshAt - value.checkedAt);
22
- }
23
- async read(refresh = false) {
24
- if (refresh)
25
- this.invalidate();
26
- if (this.snapshot && this.freshUntil > this.now())
27
- return structuredClone(this.snapshot);
28
- const generation = this.generation;
29
- if (this.inFlight?.generation === generation)
30
- return structuredClone(await this.inFlight.promise);
31
- const promise = (async () => {
32
- const value = await this.fetchSnapshot();
33
- validate(value);
34
- // 拉取期间发生写入或事件:旧响应不能重新把已失效的凭证标为新鲜。
35
- if (generation !== this.generation)
36
- return this.read();
37
- if (this.snapshot && value.revision < this.snapshot.revision)
38
- throw new Error("平台凭证版本落后,请稍后重试");
39
- this.accept(value);
40
- return structuredClone(this.snapshot);
41
- })();
42
- this.inFlight = { generation, promise };
43
- try {
44
- return structuredClone(await promise);
45
- }
46
- finally {
47
- if (this.inFlight?.promise === promise)
48
- this.inFlight = undefined;
49
- }
50
- }
51
- }
52
- function validate(value) {
53
- if (!value || !Number.isSafeInteger(value.revision) || value.revision < 0 || !Number.isFinite(value.checkedAt) || !Number.isFinite(value.nextRefreshAt) || !("current" in value))
54
- throw new Error("平台凭证快照无效");
55
- if (value.current !== null && (!value.current || value.current.state !== "active" || typeof value.current.credentialId !== "string" || typeof value.current.serviceId !== "string"))
56
- throw new Error("平台返回了无效的生效凭证");
57
- }
58
- //# sourceMappingURL=cache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export declare const SERVICE_CONFIG_FILE = "services.json";
2
- export declare function loadServices(directory: string): unknown | undefined;
3
- //# sourceMappingURL=manifest.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/services/manifest.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAMnE"}
@@ -1,19 +0,0 @@
1
- // 管:读取有界 services.json,上传交由平台严格校验和审核。对应《搭子付费服务与支付唤起》。
2
- // 不管:把声明当作运行配置,不自动批准服务,不执行声明中的代码。
3
- import { existsSync, readFileSync, statSync } from "node:fs";
4
- import { join } from "node:path";
5
- export const SERVICE_CONFIG_FILE = "services.json";
6
- export function loadServices(directory) {
7
- const file = join(directory, SERVICE_CONFIG_FILE);
8
- if (!existsSync(file))
9
- return undefined;
10
- if (!statSync(file).isFile() || statSync(file).size > 256_000)
11
- throw new Error("services.json 需要为不超过 256 KB 的文件");
12
- try {
13
- return JSON.parse(readFileSync(file, "utf8"));
14
- }
15
- catch {
16
- throw new Error("services.json 不是合法 JSON");
17
- }
18
- }
19
- //# sourceMappingURL=manifest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/services/manifest.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,kCAAkC;AAClC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAC;AACnD,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAClH,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IACtD,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAAC,CAAC;AACtD,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { MLBClient } from "../mlbClient.ts";
2
- import type { MLBMessageToWrite } from "../types.ts";
3
- import type { ServiceAPI } from "./types.ts";
4
- export declare class ServiceSession {
5
- readonly api: ServiceAPI;
6
- private readonly cache;
7
- constructor(client: Pick<MLBClient, "serviceCall">, convoKey: string, sourceMessage: () => string | undefined, onCard: () => void, guardWrite?: () => void, enqueueMessage?: (message: MLBMessageToWrite) => void);
8
- invalidate(): void;
9
- }
10
- //# sourceMappingURL=session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/services/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAmJ,MAAM,YAAY,CAAC;AAE9L,qBAAa,cAAc;IAC1B,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;gBACnC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,UAAU,GAAE,MAAM,IAAe,EAAE,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI;IAuC3N,UAAU,IAAI,IAAI;CAClB"}
@@ -1,57 +0,0 @@
1
- import { ServiceCredentialCache } from "./cache.js";
2
- export class ServiceSession {
3
- api;
4
- cache;
5
- constructor(client, convoKey, sourceMessage, onCard, guardWrite = () => { }, enqueueMessage) {
6
- const query = new URLSearchParams({ convoKey }).toString();
7
- const requirePrivate = () => { if (!convoKey.startsWith("p_"))
8
- throw new Error("服务购买和凭证只支持私聊"); };
9
- this.cache = new ServiceCredentialCache(() => {
10
- requirePrivate();
11
- return client.serviceCall("GET", `/service-credentials/current?${query}`);
12
- });
13
- const write = async (operation, input) => {
14
- requirePrivate();
15
- guardWrite();
16
- if (!input.credentialId || [".", ".."].includes(input.credentialId))
17
- throw new Error("需要有效的服务凭证 id");
18
- const { credentialId, expectedRevision, idempotencyKey, reason } = input;
19
- try {
20
- const result = await client.serviceCall("POST", `/service-credentials/${encodeURIComponent(credentialId)}/${operation}`, { convoKey, expectedRevision, idempotencyKey, ...(operation === "terminate" ? { reason } : {}) });
21
- this.cache.accept(result.snapshot);
22
- return structuredClone(result);
23
- }
24
- catch (error) {
25
- this.cache.invalidate();
26
- throw error;
27
- }
28
- };
29
- this.api = {
30
- readCurrentCredential: options => this.cache.read(options?.refresh),
31
- listCredentials: async (input) => {
32
- requirePrivate();
33
- const params = new URLSearchParams({ convoKey, ...(input?.state ? { state: input.state } : {}), ...(input?.cursor ? { cursor: input.cursor } : {}) });
34
- return client.serviceCall("GET", `/service-credentials?${params}`);
35
- },
36
- showCard: async (input) => {
37
- requirePrivate();
38
- guardWrite();
39
- if (!enqueueMessage)
40
- throw new Error("服务卡需要使用会话消息发送队列");
41
- const sourceMessageId = sourceMessage();
42
- if (!sourceMessageId)
43
- throw new Error("仅能在当前用户对话回合展示服务卡");
44
- const result = await client.serviceCall("POST", "/service-offers", { convoKey, sourceMessageId, serviceId: input.serviceId, idempotencyKey: input.idempotencyKey, personalization: input.personalization });
45
- if (!result?.offerId)
46
- throw new Error("服务卡记录未被平台确认");
47
- enqueueMessage({ type: "paidservice", paidservice: { offerId: result.offerId }, idempotencyKey: `commerce:${result.offerId}` });
48
- onCard();
49
- return { offerId: result.offerId, reused: result.reused, queued: true };
50
- },
51
- activateCredential: input => write("activate", input),
52
- terminateCredential: input => write("terminate", input),
53
- };
54
- }
55
- invalidate() { this.cache.invalidate(); }
56
- }
57
- //# sourceMappingURL=session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/services/session.ts"],"names":[],"mappings":"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"}
@@ -1,122 +0,0 @@
1
- export interface ServiceDeclaration {
2
- serviceId: string;
3
- version: string;
4
- name: string;
5
- description?: string;
6
- audience: string;
7
- pricingUnitLabel: string;
8
- benefits: Array<{
9
- title: string;
10
- description: string;
11
- }>;
12
- serviceTerms: {
13
- startCondition: string;
14
- endCondition: string;
15
- };
16
- limitations: string[];
17
- requestedPrice: {
18
- amountMinor: number;
19
- currency: "CNY";
20
- };
21
- }
22
- export interface ServiceManifest {
23
- schemaVersion: 1;
24
- services: ServiceDeclaration[];
25
- }
26
- export interface ServiceVersion {
27
- id: string;
28
- declaration: ServiceDeclaration;
29
- contentHash: string;
30
- status: "draft" | "approved";
31
- createdAt: number;
32
- }
33
- export interface ServiceCredential {
34
- /** 平台为每次成功购买生成的唯一凭证 ID;复购产生新的 ID。 */
35
- credentialId: string;
36
- serviceId: string;
37
- serviceVersionId: string;
38
- declarationVersion: string;
39
- sourceType: "mock_purchase";
40
- sourceOrderId: string;
41
- state: "pending" | "active" | "ended" | "revoked";
42
- revision: number;
43
- createdAt: number;
44
- activatedAt: number | null;
45
- endedAt: number | null;
46
- }
47
- export interface ServiceCredentialSnapshot {
48
- revision: number;
49
- checkedAt: number;
50
- /** 平台缓存期限,不是服务到期时间。 */
51
- nextRefreshAt: number;
52
- current: ServiceCredential | null;
53
- }
54
- export interface ServicePersonalization {
55
- /** 搭子基于本次对话生成的卡片介绍,1–200 字符。 */
56
- cardSummary: string;
57
- /** 聊天卡片按钮文案,1–20 字符;省略时显示「查看方案」,不改变打开详情的行为。 */
58
- buttonText?: string;
59
- needSummary?: string;
60
- contextItems?: Array<{
61
- label: string;
62
- value: string;
63
- }>;
64
- }
65
- export interface ServiceCardInput {
66
- serviceId: string;
67
- idempotencyKey: string;
68
- personalization: ServicePersonalization;
69
- }
70
- export interface ServiceCardResult {
71
- offerId: string;
72
- reused: boolean;
73
- /** 已加入统一消息队列,不代表平台已确认消息送达。 */
74
- queued?: boolean;
75
- /** @deprecated 仅旧内测版本直接发卡时返回;新版本通过消息链路确认送达。 */
76
- messageId?: string;
77
- /** @deprecated 仅旧内测版本直接发卡时返回。 */
78
- timestamp?: number;
79
- }
80
- export interface ServiceCredentialOperation {
81
- credentialId: string;
82
- expectedRevision: number;
83
- idempotencyKey: string;
84
- }
85
- export interface ServiceCredentialWriteResult {
86
- credential: ServiceCredential;
87
- snapshot: ServiceCredentialSnapshot;
88
- reused: boolean;
89
- }
90
- export interface ServiceEvent {
91
- eventId: string;
92
- sequence: number;
93
- convoKey: string;
94
- type: "credential_created" | "credential_changed";
95
- credentialId: string;
96
- revision: number;
97
- createdAt: number;
98
- }
99
- export interface ServiceCredentialPage {
100
- items: ServiceCredential[];
101
- nextCursor?: string;
102
- }
103
- export interface ServiceAPI {
104
- /** 准备已审核服务并将引用加入消息队列;不代表已送达,不创建订单或服务凭证。 */
105
- showCard(input: ServiceCardInput): Promise<ServiceCardResult>;
106
- /** 返回当前生效凭证快照;current 为 null 表示无生效凭证。正常命中本地缓存。 */
107
- readCurrentCredential(options?: {
108
- refresh?: boolean;
109
- }): Promise<ServiceCredentialSnapshot>;
110
- /** 读取待启用、已生效或已结束的凭证列表,不会创建凭证。 */
111
- listCredentials(input?: {
112
- state?: ServiceCredential["state"];
113
- cursor?: string;
114
- }): Promise<ServiceCredentialPage>;
115
- /** 启用平台已生成的 pending 凭证,不支持自行授予。 */
116
- activateCredential(input: ServiceCredentialOperation): Promise<ServiceCredentialWriteResult>;
117
- /** 终止当前 active 凭证,保留凭证和订单历史,不代表退款。 */
118
- terminateCredential(input: ServiceCredentialOperation & {
119
- reason: string;
120
- }): Promise<ServiceCredentialWriteResult>;
121
- }
122
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/services/types.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/services/types.ts"],"names":[],"mappings":""}
@@ -1,18 +0,0 @@
1
- import { Type } from "typebox";
2
- import type { AgentTool } from "@earendil-works/pi-agent-core";
3
- import type { ServiceAPI } from "../services/types.ts";
4
- declare const parameters: Type.TObject<{
5
- serviceId: Type.TString;
6
- personalization: Type.TObject<{
7
- cardSummary: Type.TString;
8
- buttonText: Type.TOptional<Type.TString>;
9
- needSummary: Type.TOptional<Type.TString>;
10
- contextItems: Type.TOptional<Type.TArray<Type.TObject<{
11
- label: Type.TString;
12
- value: Type.TString;
13
- }>>>;
14
- }>;
15
- }>;
16
- export declare function serviceCardTool(service: ServiceAPI): AgentTool<typeof parameters, undefined>;
17
- export {};
18
- //# sourceMappingURL=service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/tools/service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,QAAA,MAAM,UAAU;;;;;;;;;;;EAQmB,CAAC;AAEpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC,OAAO,UAAU,EAAE,SAAS,CAAC,CAW5F"}
@@ -1,25 +0,0 @@
1
- // 管:展示服务卡的模型工具与有界个性化字段。对应《搭子付费服务与支付唤起》。
2
- // 不管:发起支付、服务凭证启停或修改审核承诺;实际内容与凭证由平台核实。
3
- import { Type } from "typebox";
4
- const parameters = Type.Object({
5
- serviceId: Type.String({ minLength: 1, maxLength: 80, description: "创作者声明并经平台审核的服务标识" }),
6
- personalization: Type.Object({
7
- cardSummary: Type.String({ minLength: 1, maxLength: 200, description: "基于本次真实对话生成聊天卡片介绍,只解释已审核服务的价值,不新增交付承诺" }),
8
- buttonText: Type.Optional(Type.String({ minLength: 1, maxLength: 20, description: "聊天卡片按钮文案,省略时显示「查看方案」。仅用于引导查看详情,不改变点击行为或表示已购买。" })),
9
- needSummary: Type.Optional(Type.String({ minLength: 1, maxLength: 600, description: "基于真实对话说明服务为何适用,不添加未声明的交付或结果承诺" })),
10
- contextItems: Type.Optional(Type.Array(Type.Object({ label: Type.String({ minLength: 1, maxLength: 40 }), value: Type.String({ minLength: 1, maxLength: 300 }) }, { additionalProperties: false }), { maxItems: 6 })),
11
- }, { additionalProperties: false }),
12
- }, { additionalProperties: false });
13
- export function serviceCardTool(service) {
14
- return {
15
- name: "show_service_card", label: "正在展示服务",
16
- description: "在当前私聊展示已审核的服务卡。用户点击后先看服务详情,自行决定是否购买;调用本工具不会创建订单、支付或启用服务凭证。仅在需求相关且用户未拒绝推荐时使用,同一次查看意图不重复展示。价格、服务名称、交付承诺和服务凭证不能在参数中修改。",
17
- dataAccessPolicy: { retention: "conversation", result: "independent", arguments: "user-visible" },
18
- parameters,
19
- execute: async (callId, input) => {
20
- const result = await service.showCard({ ...input, idempotencyKey: `service-card:${callId}` });
21
- return { content: [{ type: "text", text: `服务卡引用已加入发送队列(${result.offerId}),尚不代表平台确认送达;等待用户查看或购买。本次操作未创建或启用服务凭证。` }], details: undefined, terminate: true };
22
- },
23
- };
24
- }
25
- //# sourceMappingURL=service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/tools/service.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,sCAAsC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAI/B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IACxF,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC;QAC5B,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;QAC/G,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC,CAAC;QACrI,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC,CAAC;QACvH,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;KACrN,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;CACnC,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;AAEpC,MAAM,UAAU,eAAe,CAAC,OAAmB;IAClD,OAAO;QACN,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ;QAC1C,WAAW,EAAE,qHAAqH;QAClI,gBAAgB,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE;QACjG,UAAU;QACV,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,cAAc,EAAE,gBAAgB,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,MAAM,CAAC,OAAO,wCAAwC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC3J,CAAC;KACD,CAAC;AACH,CAAC"}