persona-core-opencode 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/client/index.d.ts +5 -0
  2. package/dist/client/index.d.ts.map +1 -0
  3. package/dist/client/index.js +6 -0
  4. package/dist/client/index.js.map +1 -0
  5. package/dist/client/personaCoreClient.d.ts +102 -0
  6. package/dist/client/personaCoreClient.d.ts.map +1 -0
  7. package/dist/client/personaCoreClient.js +166 -0
  8. package/dist/client/personaCoreClient.js.map +1 -0
  9. package/dist/client/workflowHandle.d.ts +62 -0
  10. package/dist/client/workflowHandle.d.ts.map +1 -0
  11. package/dist/client/workflowHandle.js +100 -0
  12. package/dist/client/workflowHandle.js.map +1 -0
  13. package/dist/generators/index.d.ts +5 -0
  14. package/dist/generators/index.d.ts.map +1 -0
  15. package/dist/generators/index.js +5 -0
  16. package/dist/generators/index.js.map +1 -0
  17. package/dist/generators/toolFileGenerator.d.ts +15 -0
  18. package/dist/generators/toolFileGenerator.d.ts.map +1 -0
  19. package/dist/generators/toolFileGenerator.js +385 -0
  20. package/dist/generators/toolFileGenerator.js.map +1 -0
  21. package/dist/index.d.ts +19 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +26 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/persona/index.d.ts +5 -0
  26. package/dist/persona/index.d.ts.map +1 -0
  27. package/dist/persona/index.js +5 -0
  28. package/dist/persona/index.js.map +1 -0
  29. package/dist/persona/personaRegistry.d.ts +79 -0
  30. package/dist/persona/personaRegistry.d.ts.map +1 -0
  31. package/dist/persona/personaRegistry.js +151 -0
  32. package/dist/persona/personaRegistry.js.map +1 -0
  33. package/dist/session/index.d.ts +6 -0
  34. package/dist/session/index.d.ts.map +1 -0
  35. package/dist/session/index.js +6 -0
  36. package/dist/session/index.js.map +1 -0
  37. package/dist/session/sessionHandle.d.ts +82 -0
  38. package/dist/session/sessionHandle.d.ts.map +1 -0
  39. package/dist/session/sessionHandle.js +82 -0
  40. package/dist/session/sessionHandle.js.map +1 -0
  41. package/dist/session/sessionManager.d.ts +72 -0
  42. package/dist/session/sessionManager.d.ts.map +1 -0
  43. package/dist/session/sessionManager.js +300 -0
  44. package/dist/session/sessionManager.js.map +1 -0
  45. package/dist/types/common.d.ts +94 -0
  46. package/dist/types/common.d.ts.map +1 -0
  47. package/dist/types/common.js +5 -0
  48. package/dist/types/common.js.map +1 -0
  49. package/dist/types/index.d.ts +7 -0
  50. package/dist/types/index.d.ts.map +1 -0
  51. package/dist/types/index.js +7 -0
  52. package/dist/types/index.js.map +1 -0
  53. package/dist/types/nodes.d.ts +313 -0
  54. package/dist/types/nodes.d.ts.map +1 -0
  55. package/dist/types/nodes.js +5 -0
  56. package/dist/types/nodes.js.map +1 -0
  57. package/dist/types/persona.d.ts +58 -0
  58. package/dist/types/persona.d.ts.map +1 -0
  59. package/dist/types/persona.js +35 -0
  60. package/dist/types/persona.js.map +1 -0
  61. package/package.json +60 -0
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Persona 注册器
3
+ * 负责注册 Persona、创建工作目录、生成 tool 文件
4
+ */
5
+ import * as fs from 'fs/promises';
6
+ import * as path from 'path';
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ import { generateToolFile, getToolFileName } from '../generators/toolFileGenerator.js';
9
+ /**
10
+ * Persona 注册器
11
+ */
12
+ export class PersonaRegistry {
13
+ workspaceRoot;
14
+ registeredPersonas = new Map();
15
+ constructor(config = {}) {
16
+ this.workspaceRoot = config.workspaceRoot || './persona-workspaces';
17
+ }
18
+ /**
19
+ * 注册 Persona
20
+ * 1. 生成唯一 ID
21
+ * 2. 创建工作目录
22
+ * 3. 生成 tool 文件
23
+ */
24
+ async registerPersona(input) {
25
+ // 创建 Persona 对象
26
+ const now = new Date();
27
+ const persona = {
28
+ id: input.id || this.generateId(input.name),
29
+ name: input.name,
30
+ description: input.description,
31
+ systemPrompt: input.systemPrompt,
32
+ actionTypes: input.actionTypes,
33
+ createdAt: now,
34
+ updatedAt: now,
35
+ };
36
+ const personaId = this.generatePersonaId(persona);
37
+ const workspacePath = path.resolve(this.workspaceRoot, personaId);
38
+ const toolsPath = path.join(workspacePath, '.opencode', 'tools');
39
+ // 创建目录结构
40
+ await fs.mkdir(toolsPath, { recursive: true });
41
+ await fs.mkdir(path.join(workspacePath, 'output'), { recursive: true });
42
+ // 生成 .opencode/rules/persona.md(用于 CLI 模式的 system prompt)
43
+ const rulesPath = path.join(workspacePath, '.opencode', 'rules');
44
+ await fs.mkdir(rulesPath, { recursive: true });
45
+ const rulesContent = `---
46
+ alwaysApply: true
47
+ ---
48
+
49
+ ${persona.systemPrompt}
50
+ `;
51
+ await fs.writeFile(path.join(rulesPath, 'persona.md'), rulesContent);
52
+ // 生成 tool 文件
53
+ for (const actionType of persona.actionTypes) {
54
+ const toolCode = generateToolFile(actionType, persona);
55
+ const toolFileName = getToolFileName(actionType);
56
+ const toolFilePath = path.join(toolsPath, `${toolFileName}.ts`);
57
+ await fs.writeFile(toolFilePath, toolCode);
58
+ }
59
+ // 生成 persona 配置文件(用于调试和追踪)
60
+ const personaConfigPath = path.join(workspacePath, 'persona.json');
61
+ await fs.writeFile(personaConfigPath, JSON.stringify(persona, null, 2));
62
+ // 注册
63
+ const registered = {
64
+ id: personaId,
65
+ persona,
66
+ workspacePath,
67
+ toolsPath,
68
+ createdAt: now,
69
+ };
70
+ this.registeredPersonas.set(personaId, registered);
71
+ return personaId;
72
+ }
73
+ /**
74
+ * 直接注册已有的 Persona 对象
75
+ */
76
+ async registerExistingPersona(persona) {
77
+ return this.registerPersona({
78
+ id: persona.id,
79
+ name: persona.name,
80
+ description: persona.description,
81
+ systemPrompt: persona.systemPrompt,
82
+ actionTypes: persona.actionTypes,
83
+ });
84
+ }
85
+ /**
86
+ * 获取已注册的 Persona
87
+ */
88
+ getPersona(personaId) {
89
+ return this.registeredPersonas.get(personaId);
90
+ }
91
+ /**
92
+ * 获取所有已注册的 Persona
93
+ */
94
+ getAllPersonas() {
95
+ return Array.from(this.registeredPersonas.values());
96
+ }
97
+ /**
98
+ * 检查 Persona 是否已注册
99
+ */
100
+ hasPersona(personaId) {
101
+ return this.registeredPersonas.has(personaId);
102
+ }
103
+ /**
104
+ * 删除已注册的 Persona(包括工作目录)
105
+ */
106
+ async unregisterPersona(personaId) {
107
+ const registered = this.registeredPersonas.get(personaId);
108
+ if (!registered) {
109
+ return false;
110
+ }
111
+ // 删除工作目录
112
+ try {
113
+ await fs.rm(registered.workspacePath, { recursive: true, force: true });
114
+ }
115
+ catch (error) {
116
+ // Ignore if directory doesn't exist
117
+ }
118
+ this.registeredPersonas.delete(personaId);
119
+ return true;
120
+ }
121
+ /**
122
+ * 清理所有工作目录
123
+ */
124
+ async cleanup() {
125
+ for (const personaId of this.registeredPersonas.keys()) {
126
+ await this.unregisterPersona(personaId);
127
+ }
128
+ }
129
+ /**
130
+ * 获取工作空间根目录
131
+ */
132
+ getWorkspaceRoot() {
133
+ return this.workspaceRoot;
134
+ }
135
+ /**
136
+ * 生成唯一 ID
137
+ */
138
+ generateId(name) {
139
+ const safeName = name.replace(/[^a-zA-Z0-9-]/g, '-').toLowerCase();
140
+ return safeName;
141
+ }
142
+ /**
143
+ * 生成 Persona 唯一 ID
144
+ */
145
+ generatePersonaId(persona) {
146
+ const shortUuid = uuidv4().slice(0, 8);
147
+ const safeName = persona.id.replace(/[^a-zA-Z0-9-]/g, '-');
148
+ return `${safeName}-${shortUuid}`;
149
+ }
150
+ }
151
+ //# sourceMappingURL=personaRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personaRegistry.js","sourceRoot":"","sources":["../../src/persona/personaRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Session module exports
3
+ */
4
+ export * from './sessionManager.js';
5
+ export * from './sessionHandle.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Session module exports
3
+ */
4
+ export * from './sessionManager.js';
5
+ export * from './sessionHandle.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Session Handle
3
+ * 封装 opencode session 的操作
4
+ */
5
+ /**
6
+ * 工具调用记录
7
+ */
8
+ export interface ToolCallRecord {
9
+ tool: string;
10
+ args: Record<string, unknown>;
11
+ result?: string;
12
+ error?: string;
13
+ }
14
+ /**
15
+ * Session 执行结果
16
+ */
17
+ export interface SessionExecutionResult {
18
+ /** Session ID */
19
+ sessionId: string;
20
+ /** 是否成功 */
21
+ success: boolean;
22
+ /** 最终响应文本 */
23
+ response?: string;
24
+ /** 工具调用记录 */
25
+ toolCalls: ToolCallRecord[];
26
+ /** 错误信息 */
27
+ error?: string;
28
+ /** 调试信息:原始 CLI 输出(仅在 DEBUG_OPENCODE_OUTPUT=1 时填充) */
29
+ _debug?: {
30
+ rawOutput?: string;
31
+ };
32
+ }
33
+ /**
34
+ * Session Handle
35
+ * CLI 模式下,sessionId 可能在首次执行后才获得
36
+ */
37
+ export declare class SessionHandle {
38
+ private _sessionId;
39
+ readonly personaId: string;
40
+ readonly workspacePath: string;
41
+ private systemPrompt;
42
+ private toolCalls;
43
+ private lastResponse?;
44
+ constructor(sessionId: string | null, personaId: string, workspacePath: string, systemPrompt: string);
45
+ /**
46
+ * 获取 Session ID
47
+ */
48
+ get sessionId(): string;
49
+ /**
50
+ * 设置 Session ID(首次执行后从响应中获取)
51
+ */
52
+ setSessionId(sessionId: string): void;
53
+ /**
54
+ * 检查是否已有 Session ID
55
+ */
56
+ hasSessionId(): boolean;
57
+ /**
58
+ * 获取 System Prompt
59
+ */
60
+ getSystemPrompt(): string;
61
+ /**
62
+ * 获取工具调用记录
63
+ */
64
+ getToolCalls(): ToolCallRecord[];
65
+ /**
66
+ * 添加工具调用记录
67
+ */
68
+ addToolCall(record: ToolCallRecord): void;
69
+ /**
70
+ * 设置最后响应
71
+ */
72
+ setLastResponse(response: string): void;
73
+ /**
74
+ * 获取最后响应
75
+ */
76
+ getLastResponse(): string | undefined;
77
+ /**
78
+ * 获取执行结果
79
+ */
80
+ getResult(): SessionExecutionResult;
81
+ }
82
+ //# sourceMappingURL=sessionHandle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionHandle.d.ts","sourceRoot":"","sources":["../../src/session/sessionHandle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAgB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,YAAY,CAAC,CAAS;gBAG5B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM;IAQtB;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,YAAY,IAAI,cAAc,EAAE;IAIhC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAIzC;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIvC;;OAEG;IACH,eAAe,IAAI,MAAM,GAAG,SAAS;IAIrC;;OAEG;IACH,SAAS,IAAI,sBAAsB;CAQpC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Session Handle
3
+ * 封装 opencode session 的操作
4
+ */
5
+ /**
6
+ * Session Handle
7
+ * CLI 模式下,sessionId 可能在首次执行后才获得
8
+ */
9
+ export class SessionHandle {
10
+ _sessionId;
11
+ personaId;
12
+ workspacePath;
13
+ systemPrompt;
14
+ toolCalls = [];
15
+ lastResponse;
16
+ constructor(sessionId, personaId, workspacePath, systemPrompt) {
17
+ this._sessionId = sessionId;
18
+ this.personaId = personaId;
19
+ this.workspacePath = workspacePath;
20
+ this.systemPrompt = systemPrompt;
21
+ }
22
+ /**
23
+ * 获取 Session ID
24
+ */
25
+ get sessionId() {
26
+ return this._sessionId ?? '';
27
+ }
28
+ /**
29
+ * 设置 Session ID(首次执行后从响应中获取)
30
+ */
31
+ setSessionId(sessionId) {
32
+ this._sessionId = sessionId;
33
+ }
34
+ /**
35
+ * 检查是否已有 Session ID
36
+ */
37
+ hasSessionId() {
38
+ return this._sessionId !== null;
39
+ }
40
+ /**
41
+ * 获取 System Prompt
42
+ */
43
+ getSystemPrompt() {
44
+ return this.systemPrompt;
45
+ }
46
+ /**
47
+ * 获取工具调用记录
48
+ */
49
+ getToolCalls() {
50
+ return [...this.toolCalls];
51
+ }
52
+ /**
53
+ * 添加工具调用记录
54
+ */
55
+ addToolCall(record) {
56
+ this.toolCalls.push(record);
57
+ }
58
+ /**
59
+ * 设置最后响应
60
+ */
61
+ setLastResponse(response) {
62
+ this.lastResponse = response;
63
+ }
64
+ /**
65
+ * 获取最后响应
66
+ */
67
+ getLastResponse() {
68
+ return this.lastResponse;
69
+ }
70
+ /**
71
+ * 获取执行结果
72
+ */
73
+ getResult() {
74
+ return {
75
+ sessionId: this.sessionId,
76
+ success: true,
77
+ response: this.lastResponse,
78
+ toolCalls: this.toolCalls,
79
+ };
80
+ }
81
+ }
82
+ //# sourceMappingURL=sessionHandle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionHandle.js","sourceRoot":"","sources":["../../src/session/sessionHandle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgCH;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,UAAU,CAAgB;IACzB,SAAS,CAAS;IAClB,aAAa,CAAS;IACvB,YAAY,CAAS;IACrB,SAAS,GAAqB,EAAE,CAAC;IACjC,YAAY,CAAU;IAE9B,YACE,SAAwB,EACxB,SAAiB,EACjB,aAAqB,EACrB,YAAoB;QAEpB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAsB;QAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAgB;QAC9B,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI,CAAC,YAAY;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Session 管理器
3
+ * 使用 opencode CLI (run 模式) 执行任务
4
+ */
5
+ import { PersonaRegistry } from '../persona/personaRegistry.js';
6
+ import { SessionHandle, SessionExecutionResult } from './sessionHandle.js';
7
+ /**
8
+ * SessionManager 配置
9
+ */
10
+ export interface SessionManagerConfig {
11
+ /** PersonaRegistry 实例 */
12
+ personaRegistry: PersonaRegistry;
13
+ /** opencode 命令路径(默认使用 PATH 中的 opencode) */
14
+ opencodePath?: string;
15
+ /** 执行超时时间(毫秒,默认 5 分钟) */
16
+ defaultTimeoutMs?: number;
17
+ }
18
+ /**
19
+ * 执行选项
20
+ */
21
+ export interface ExecuteOptions {
22
+ /** 超时时间(毫秒) */
23
+ timeoutMs?: number;
24
+ }
25
+ /**
26
+ * Session 管理器
27
+ */
28
+ export declare class SessionManager {
29
+ private personaRegistry;
30
+ private opencodePath;
31
+ private defaultTimeoutMs;
32
+ private activeSessions;
33
+ constructor(config: SessionManagerConfig);
34
+ /**
35
+ * 为已注册的 Persona 创建会话
36
+ * CLI 模式下,session 在首次执行 opencode run 时隐式创建
37
+ */
38
+ createSession(personaId: string): Promise<SessionHandle>;
39
+ /**
40
+ * 发送思考提示并执行
41
+ * 使用 opencode run CLI 模式执行
42
+ */
43
+ executeThinking(sessionHandle: SessionHandle, thinkingPrompt: string, options?: ExecuteOptions): Promise<SessionExecutionResult>;
44
+ /**
45
+ * 使用 spawn 执行 opencode run 命令
46
+ */
47
+ private runOpencode;
48
+ /**
49
+ * 解析 CLI JSON 输出
50
+ * opencode run --format json 输出的是 JSONL 格式(每行一个 JSON 事件)
51
+ *
52
+ * 输出格式示例:
53
+ * {"type":"step_start","sessionID":"ses_xxx","part":{...}}
54
+ * {"type":"text","sessionID":"ses_xxx","part":{"type":"text","text":"..."}}
55
+ * {"type":"tool_call","sessionID":"ses_xxx","part":{"type":"tool-invocation","toolName":"...","input":{...}}}
56
+ * {"type":"tool_result","sessionID":"ses_xxx","part":{"type":"tool-result","toolName":"...","result":"..."}}
57
+ */
58
+ private parseCliOutput;
59
+ /**
60
+ * 获取活跃的 Session
61
+ */
62
+ getSession(sessionId: string): SessionHandle | undefined;
63
+ /**
64
+ * 关闭 Session
65
+ */
66
+ closeSession(sessionId: string): Promise<void>;
67
+ /**
68
+ * 关闭所有 Session
69
+ */
70
+ closeAllSessions(): Promise<void>;
71
+ }
72
+ //# sourceMappingURL=sessionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionManager.d.ts","sourceRoot":"","sources":["../../src/session/sessionManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAkB,MAAM,oBAAoB,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yBAAyB;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,eAAe;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAAyC;gBAEnD,MAAM,EAAE,oBAAoB;IAMxC;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAiB9D;;;OAGG;IACG,eAAe,CACnB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,sBAAsB,CAAC;IA6BlC;;OAEG;IACH,OAAO,CAAC,WAAW;IA0EnB;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;IAuJtB;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIxD;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAGxC"}