@sage-protocol/pi-adapter 0.1.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.
package/README.md ADDED
@@ -0,0 +1,184 @@
1
+ # @sage-protocol/pi-adapter
2
+
3
+ Sage integration for the pi coding agent runtime.
4
+
5
+ It gives you:
6
+ - Sage MCP tools in pi (`sage_search`, `sage_execute`, `sage_status`)
7
+ - Session hook integration (`sage skill context`, `sage suggest hook skill`)
8
+ - RLM capture hooks (`sage capture hook prompt/response`)
9
+ - Optional pre/post tool security scanning (`sage security scan-hook`)
10
+
11
+ For model-driven patching, see `packages/sage-pi-adapter/SKILL.md`.
12
+
13
+ ## Requirements
14
+
15
+ - Node project using `@mariozechner/pi-coding-agent`
16
+ - Sage CLI installed and on `PATH` (`sage`)
17
+
18
+ ## Install
19
+
20
+ ```bash
21
+ npm install @sage-protocol/pi-adapter
22
+ ```
23
+
24
+ For local development from this monorepo:
25
+
26
+ ```bash
27
+ npm link /path/to/sage-protocol/packages/sage-pi-adapter
28
+ ```
29
+
30
+ ## Harness Integration (Recommended)
31
+
32
+ ```typescript
33
+ import { createAgentSession, createCodingTools } from '@mariozechner/pi-coding-agent';
34
+ import { createSageSessionConfig } from '@sage-protocol/pi-adapter';
35
+
36
+ export async function createSessionWithSage(model: any, cwd = process.cwd()) {
37
+ const sage = await createSageSessionConfig({
38
+ sageBin: 'sage',
39
+ source: 'pi-agent-core',
40
+ suggestLimit: 3,
41
+ enableRlmFeedback: true,
42
+ enableSecurityHooks: true,
43
+ });
44
+
45
+ const { session } = await createAgentSession({
46
+ model,
47
+ tools: sage.wrapToolsWithSecurity(createCodingTools(cwd)),
48
+ customTools: sage.customTools,
49
+ });
50
+
51
+ const disposeSageHooks = sage.setupHooks(session);
52
+
53
+ return {
54
+ session,
55
+ dispose: async () => {
56
+ disposeSageHooks();
57
+ await sage.mcpBridge.stop();
58
+ },
59
+ };
60
+ }
61
+ ```
62
+
63
+ ## Integrate Into an Existing Harness (Model-Directed)
64
+
65
+ If this package is on npm, you can ask a coding model to patch your harness directly.
66
+
67
+ Use this instruction block as-is:
68
+
69
+ ```text
70
+ Install @sage-protocol/pi-adapter and patch the session bootstrap to:
71
+ 1) create const sage = await createSageSessionConfig(...)
72
+ 2) set customTools: sage.customTools
73
+ 3) wrap base tools with tools: sage.wrapToolsWithSecurity(existingTools)
74
+ 4) call const disposeSageHooks = sage.setupHooks(session) after createAgentSession
75
+ 5) call disposeSageHooks() during teardown
76
+ 6) keep existing model/provider/settings behavior unchanged
77
+ ```
78
+
79
+ Helpful search targets for the model:
80
+
81
+ ```bash
82
+ rg "createAgentSession|createCodingTools|customTools|tools:" src
83
+ rg "dispose|shutdown|teardown|cleanup" src
84
+ ```
85
+
86
+ Typical patch shape:
87
+
88
+ ```typescript
89
+ import { createSageSessionConfig } from '@sage-protocol/pi-adapter';
90
+
91
+ const sage = await createSageSessionConfig({
92
+ source: 'pi-agent-core',
93
+ enableSecurityHooks: true,
94
+ enableRlmFeedback: true,
95
+ });
96
+
97
+ const { session } = await createAgentSession({
98
+ ...existingConfig,
99
+ tools: sage.wrapToolsWithSecurity(existingTools),
100
+ customTools: sage.customTools,
101
+ });
102
+
103
+ const disposeSageHooks = sage.setupHooks(session);
104
+ // on shutdown: disposeSageHooks()
105
+ ```
106
+
107
+ ## Plugin Pattern
108
+
109
+ If your harness has a plugin/bootstrap layer, wire Sage there:
110
+
111
+ 1. Construct config with `createSageSessionConfig(...)`
112
+ 2. Add `customTools: sage.customTools`
113
+ 3. Wrap existing tools with `sage.wrapToolsWithSecurity(...)`
114
+ 4. Call `const dispose = sage.setupHooks(session)` after session creation
115
+ 5. Call `dispose()` during teardown (and optionally `sage.mcpBridge.stop()`)
116
+
117
+ If your harness uses a plugin registry, expose Sage as one plugin:
118
+
119
+ ```typescript
120
+ export async function setupSagePlugin(runtime: {
121
+ makeSession: (config: any) => Promise<{ session: any }>;
122
+ tools: any[];
123
+ model: any;
124
+ }) {
125
+ const sage = await createSageSessionConfig({ source: 'pi-agent-core' });
126
+
127
+ const { session } = await runtime.makeSession({
128
+ model: runtime.model,
129
+ tools: sage.wrapToolsWithSecurity(runtime.tools),
130
+ customTools: sage.customTools,
131
+ });
132
+
133
+ const disposeSageHooks = sage.setupHooks(session);
134
+
135
+ return {
136
+ session,
137
+ dispose: async () => {
138
+ disposeSageHooks();
139
+ await sage.mcpBridge.stop();
140
+ },
141
+ };
142
+ }
143
+ ```
144
+
145
+ ## API Summary
146
+
147
+ `createSageSessionConfig(config)` returns:
148
+
149
+ ```typescript
150
+ {
151
+ customTools: ToolDefinition[];
152
+ mcpBridge: SageMcpBridge;
153
+ setupHooks: (session: AgentSession) => () => void;
154
+ wrapToolsWithSecurity: (tools: ToolDefinition[]) => ToolDefinition[];
155
+ }
156
+ ```
157
+
158
+ Config shape:
159
+
160
+ ```typescript
161
+ interface SageP2Config {
162
+ sageBin?: string;
163
+ sageProfile?: string;
164
+ suggestLimit?: number;
165
+ suggestDebounceMs?: number;
166
+ timeoutMs?: number;
167
+ enableProvision?: boolean;
168
+ enableRlmFeedback?: boolean;
169
+ enableSecurityHooks?: boolean;
170
+ source?: string;
171
+ env?: Record<string, string>;
172
+ }
173
+ ```
174
+
175
+ ## Validate
176
+
177
+ ```bash
178
+ npm run build
179
+ npm test
180
+ ```
181
+
182
+ ## License
183
+
184
+ MIT
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Sage Protocol - Pi Adapter
3
+ *
4
+ * Provides Sage MCP integration for pi coding agent.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { createSageSessionConfig } from '@sage-protocol/pi-adapter'
9
+ *
10
+ * const { session } = await createAgentSession({
11
+ * ...(await createSageSessionConfig({
12
+ * sageBin: 'sage',
13
+ * suggestLimit: 3
14
+ * }))
15
+ * })
16
+ * ```
17
+ */
18
+ export * from './sage-pi-adapter.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Sage Protocol - Pi Adapter
3
+ *
4
+ * Provides Sage MCP integration for pi coding agent.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { createSageSessionConfig } from '@sage-protocol/pi-adapter'
9
+ *
10
+ * const { session } = await createAgentSession({
11
+ * ...(await createSageSessionConfig({
12
+ * sageBin: 'sage',
13
+ * suggestLimit: 3
14
+ * }))
15
+ * })
16
+ * ```
17
+ */
18
+ // Re-export everything from the main module
19
+ export * from './sage-pi-adapter.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,4CAA4C;AAC5C,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,147 @@
1
+ export type SageDomain = 'prompts' | 'skills' | 'builder' | 'governance' | 'chat' | 'social' | 'rlm' | 'library_sync' | 'security' | 'meta' | 'hub' | 'help' | 'external';
2
+ export interface ToolResult {
3
+ content?: Array<{
4
+ type: string;
5
+ text?: string;
6
+ }>;
7
+ details?: unknown;
8
+ isError?: boolean;
9
+ }
10
+ export interface ToolDefinition {
11
+ name: string;
12
+ label: string;
13
+ description: string;
14
+ parameters: unknown;
15
+ execute: (toolCallId: string, params: Record<string, unknown>, signal?: AbortSignal, onUpdate?: (update: ToolResult) => void, ctx?: unknown) => Promise<ToolResult>;
16
+ }
17
+ export interface HookMessage {
18
+ customType: string;
19
+ content: string;
20
+ display?: boolean;
21
+ details?: Record<string, unknown>;
22
+ }
23
+ export interface AgentSession {
24
+ sessionId?: string;
25
+ subscribe: (listener: (event: unknown) => void) => () => void;
26
+ sendHookMessage?: (message: HookMessage, triggerTurn?: boolean) => Promise<void>;
27
+ }
28
+ export interface SageP2Config {
29
+ sageBin?: string;
30
+ sageProfile?: string;
31
+ suggestLimit?: number;
32
+ suggestDebounceMs?: number;
33
+ timeoutMs?: number;
34
+ enableProvision?: boolean;
35
+ enableRlmFeedback?: boolean;
36
+ enableSecurityHooks?: boolean;
37
+ env?: Record<string, string>;
38
+ source?: string;
39
+ commandRunner?: SageCommandRunner;
40
+ }
41
+ export interface SageSkillSuggestion {
42
+ key: string;
43
+ name: string;
44
+ description?: string;
45
+ content?: string;
46
+ library?: string;
47
+ source?: string;
48
+ mcpServers?: string[];
49
+ }
50
+ export interface SageCommandRequest {
51
+ command: string;
52
+ args: string[];
53
+ env: Record<string, string>;
54
+ stdin?: string;
55
+ timeoutMs: number;
56
+ }
57
+ export interface SageCommandResult {
58
+ exitCode: number;
59
+ stdout: string;
60
+ stderr: string;
61
+ timedOut: boolean;
62
+ }
63
+ export type SageCommandRunner = (request: SageCommandRequest) => Promise<SageCommandResult>;
64
+ type SecurityDecision = {
65
+ decision: 'allow' | 'block' | 'warn';
66
+ reason?: string;
67
+ };
68
+ export declare class SageMcpBridge {
69
+ private command;
70
+ private args;
71
+ private env;
72
+ private requestTimeoutMs;
73
+ private proc;
74
+ private pending;
75
+ private ready;
76
+ private stopped;
77
+ private startPromise;
78
+ constructor(command: string, args: string[], env?: Record<string, string>, requestTimeoutMs?: number);
79
+ isReady(): boolean;
80
+ start(): Promise<void>;
81
+ stop(): Promise<void>;
82
+ listTools(): Promise<Array<{
83
+ name: string;
84
+ description?: string;
85
+ }>>;
86
+ callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
87
+ callCodeModeSearch(args: Record<string, unknown>): Promise<unknown>;
88
+ callCodeModeExecute(args: Record<string, unknown>): Promise<unknown>;
89
+ private callWithFallback;
90
+ private initialize;
91
+ private spawn;
92
+ private request;
93
+ private notify;
94
+ private handleLine;
95
+ private rejectAllPending;
96
+ }
97
+ export declare class SageHookRuntime {
98
+ private config;
99
+ private commandRunner;
100
+ constructor(config: Required<Pick<SageP2Config, 'sageBin' | 'timeoutMs'>> & SageP2Config);
101
+ getSessionContext(sessionId?: string): Promise<string>;
102
+ suggestSkill(prompt: string, sessionId?: string): Promise<string>;
103
+ capturePrompt(prompt: string, sessionId?: string): Promise<void>;
104
+ captureResponse(response: string, usage: {
105
+ input?: string;
106
+ output?: string;
107
+ }, sessionId?: string): Promise<void>;
108
+ scanPreTool(toolName: string, toolInput: Record<string, unknown>, sessionId?: string): Promise<SecurityDecision | null>;
109
+ scanPostTool(toolName: string, toolInput: Record<string, unknown>, toolResult: unknown, sessionId?: string): Promise<SecurityDecision | null>;
110
+ private run;
111
+ }
112
+ export declare function createSageSearchTool(mcpBridge: SageMcpBridge): ToolDefinition;
113
+ export declare function createSageExecuteTool(mcpBridge: SageMcpBridge): ToolDefinition;
114
+ export declare function createSageStatusTool(mcpBridge: SageMcpBridge): ToolDefinition;
115
+ export interface SageP2SessionOptions {
116
+ config: SageP2Config;
117
+ mcpBridge: SageMcpBridge;
118
+ hookRuntime?: SageHookRuntime;
119
+ getSessionId?: () => string | undefined;
120
+ debounceMs?: number;
121
+ }
122
+ export interface SageToolWrapOptions {
123
+ hookRuntime: SageHookRuntime;
124
+ getSessionId?: () => string | undefined;
125
+ }
126
+ export declare function wrapToolsWithSageSecurity(tools: ToolDefinition[], options: SageToolWrapOptions): ToolDefinition[];
127
+ export declare function createSageExtensions(options: SageP2SessionOptions): {
128
+ customTools: ToolDefinition[];
129
+ sageInjectSuggestion: (userPrompt: string, session?: AgentSession, sessionId?: string) => Promise<void>;
130
+ sageClearSuggestions: () => void;
131
+ sageGetSuggestions: () => string;
132
+ };
133
+ export declare function createSageSessionConfig(config?: SageP2Config): Promise<{
134
+ customTools: ToolDefinition[];
135
+ mcpBridge: SageMcpBridge;
136
+ setupHooks: (session: AgentSession) => () => void;
137
+ wrapToolsWithSecurity: (tools: ToolDefinition[]) => ToolDefinition[];
138
+ }>;
139
+ declare const _default: {
140
+ createSageExtensions: typeof createSageExtensions;
141
+ createSageSessionConfig: typeof createSageSessionConfig;
142
+ wrapToolsWithSageSecurity: typeof wrapToolsWithSageSecurity;
143
+ SageMcpBridge: typeof SageMcpBridge;
144
+ SageHookRuntime: typeof SageHookRuntime;
145
+ };
146
+ export default _default;
147
+ //# sourceMappingURL=sage-pi-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sage-pi-adapter.d.ts","sourceRoot":"","sources":["../src/sage-pi-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,857 @@
1
+ import { Type } from '@sinclair/typebox';
2
+ import { spawn } from 'node:child_process';
3
+ import { randomUUID } from 'node:crypto';
4
+ const CODE_MODE_SEARCH_TOOLS = ['sage_search', 'sage_code_sage_search'];
5
+ const CODE_MODE_EXECUTE_TOOLS = ['sage_execute', 'sage_code_sage_execute'];
6
+ async function defaultSageCommandRunner(request) {
7
+ return new Promise((resolve, reject) => {
8
+ const proc = spawn(request.command, request.args, {
9
+ env: { ...process.env, ...request.env },
10
+ stdio: ['pipe', 'pipe', 'pipe'],
11
+ });
12
+ let stdout = '';
13
+ let stderr = '';
14
+ let timedOut = false;
15
+ let settled = false;
16
+ const timeout = setTimeout(() => {
17
+ timedOut = true;
18
+ proc.kill('SIGTERM');
19
+ }, request.timeoutMs);
20
+ const finish = (result) => {
21
+ if (settled)
22
+ return;
23
+ settled = true;
24
+ clearTimeout(timeout);
25
+ resolve(result);
26
+ };
27
+ proc.on('error', (err) => {
28
+ if (settled)
29
+ return;
30
+ settled = true;
31
+ clearTimeout(timeout);
32
+ reject(err);
33
+ });
34
+ proc.stdout.setEncoding('utf8');
35
+ proc.stderr.setEncoding('utf8');
36
+ proc.stdout.on('data', (chunk) => {
37
+ stdout += chunk;
38
+ });
39
+ proc.stderr.on('data', (chunk) => {
40
+ stderr += chunk;
41
+ });
42
+ proc.on('close', (code) => {
43
+ finish({
44
+ exitCode: code ?? -1,
45
+ stdout,
46
+ stderr,
47
+ timedOut,
48
+ });
49
+ });
50
+ if (request.stdin && proc.stdin.writable) {
51
+ proc.stdin.write(request.stdin);
52
+ }
53
+ proc.stdin.end();
54
+ });
55
+ }
56
+ function extractText(input) {
57
+ if (typeof input === 'string')
58
+ return input;
59
+ if (!input || typeof input !== 'object')
60
+ return '';
61
+ const obj = input;
62
+ const direct = [obj.text, obj.content, obj.prompt, obj.message, obj.input];
63
+ for (const candidate of direct) {
64
+ if (typeof candidate === 'string' && candidate.trim())
65
+ return candidate.trim();
66
+ }
67
+ if (Array.isArray(obj.content)) {
68
+ const fromBlocks = obj.content
69
+ .map((block) => {
70
+ if (!block || typeof block !== 'object')
71
+ return '';
72
+ const blockText = block.text;
73
+ return typeof blockText === 'string' ? blockText : '';
74
+ })
75
+ .filter(Boolean)
76
+ .join('\n')
77
+ .trim();
78
+ if (fromBlocks)
79
+ return fromBlocks;
80
+ }
81
+ return '';
82
+ }
83
+ function extractUsage(input) {
84
+ if (!input || typeof input !== 'object')
85
+ return {};
86
+ const obj = input;
87
+ const usage = (obj.usage && typeof obj.usage === 'object'
88
+ ? obj.usage
89
+ : undefined) ?? obj;
90
+ const toStringOrUndefined = (value) => {
91
+ if (typeof value === 'string' && value.trim())
92
+ return value.trim();
93
+ if (typeof value === 'number' && Number.isFinite(value))
94
+ return String(value);
95
+ return undefined;
96
+ };
97
+ return {
98
+ input: toStringOrUndefined(usage.tokens_input) ??
99
+ toStringOrUndefined(usage.input_tokens) ??
100
+ toStringOrUndefined(usage.inputTokens),
101
+ output: toStringOrUndefined(usage.tokens_output) ??
102
+ toStringOrUndefined(usage.output_tokens) ??
103
+ toStringOrUndefined(usage.outputTokens),
104
+ };
105
+ }
106
+ function parseMessageEndEvent(event) {
107
+ if (!event || typeof event !== 'object')
108
+ return null;
109
+ const root = event;
110
+ if (root.type !== 'message_end')
111
+ return null;
112
+ const message = root.message;
113
+ if (!message || typeof message !== 'object')
114
+ return null;
115
+ const msg = message;
116
+ const role = typeof msg.role === 'string' ? msg.role : '';
117
+ if (!role)
118
+ return null;
119
+ const content = extractText(msg.content ?? msg);
120
+ return { role, content, usage: msg.usage };
121
+ }
122
+ function extractJsonFromMcpResult(result) {
123
+ if (!result || typeof result !== 'object')
124
+ return undefined;
125
+ const obj = result;
126
+ if (!Array.isArray(obj.content) || obj.content.length === 0)
127
+ return undefined;
128
+ const text = obj.content
129
+ .map((entry) => {
130
+ if (!entry || typeof entry !== 'object')
131
+ return '';
132
+ const raw = entry.text;
133
+ return typeof raw === 'string' ? raw : '';
134
+ })
135
+ .filter(Boolean)
136
+ .join('\n');
137
+ if (!text)
138
+ return undefined;
139
+ try {
140
+ return JSON.parse(text);
141
+ }
142
+ catch {
143
+ return undefined;
144
+ }
145
+ }
146
+ function toToolResultText(result) {
147
+ return {
148
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
149
+ details: result,
150
+ };
151
+ }
152
+ function appendText(result, text) {
153
+ const existing = Array.isArray(result.content) ? [...result.content] : [];
154
+ existing.push({ type: 'text', text });
155
+ return { ...result, content: existing };
156
+ }
157
+ function looksUnknownToolError(error) {
158
+ const msg = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();
159
+ return (msg.includes('unknown tool') ||
160
+ msg.includes('not found') ||
161
+ msg.includes('no such tool') ||
162
+ msg.includes('does not exist'));
163
+ }
164
+ function parseSecurityDecision(stdout) {
165
+ const lines = stdout
166
+ .split(/\r?\n/)
167
+ .map((line) => line.trim())
168
+ .filter(Boolean)
169
+ .reverse();
170
+ for (const line of lines) {
171
+ try {
172
+ const parsed = JSON.parse(line);
173
+ const rawDecision = typeof parsed.decision === 'string' ? parsed.decision : '';
174
+ if (!rawDecision)
175
+ continue;
176
+ const reason = typeof parsed.reason === 'string' ? parsed.reason : undefined;
177
+ if (rawDecision === 'block') {
178
+ const isWarn = typeof reason === 'string' && /security warning/i.test(reason);
179
+ return { decision: isWarn ? 'warn' : 'block', reason };
180
+ }
181
+ if (rawDecision === 'warn')
182
+ return { decision: 'warn', reason };
183
+ if (rawDecision === 'allow')
184
+ return { decision: 'allow', reason };
185
+ }
186
+ catch {
187
+ continue;
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+ export class SageMcpBridge {
193
+ command;
194
+ args;
195
+ env;
196
+ requestTimeoutMs;
197
+ proc = null;
198
+ pending = new Map();
199
+ ready = false;
200
+ stopped = false;
201
+ startPromise = null;
202
+ constructor(command, args, env = {}, requestTimeoutMs = 20_000) {
203
+ this.command = command;
204
+ this.args = args;
205
+ this.env = env;
206
+ this.requestTimeoutMs = requestTimeoutMs;
207
+ }
208
+ isReady() {
209
+ return this.ready && this.proc !== null && !this.stopped;
210
+ }
211
+ async start() {
212
+ if (this.isReady())
213
+ return;
214
+ if (this.startPromise)
215
+ return this.startPromise;
216
+ this.startPromise = (async () => {
217
+ this.stopped = false;
218
+ await this.spawn();
219
+ await this.initialize();
220
+ })();
221
+ try {
222
+ await this.startPromise;
223
+ }
224
+ finally {
225
+ this.startPromise = null;
226
+ }
227
+ }
228
+ async stop() {
229
+ this.stopped = true;
230
+ this.ready = false;
231
+ this.rejectAllPending('MCP bridge stopped');
232
+ if (this.proc) {
233
+ this.proc.kill('SIGTERM');
234
+ this.proc = null;
235
+ }
236
+ }
237
+ async listTools() {
238
+ const result = (await this.request('tools/list', {}));
239
+ return result.tools ?? [];
240
+ }
241
+ async callTool(name, args) {
242
+ const result = (await this.request('tools/call', {
243
+ name,
244
+ arguments: args,
245
+ }));
246
+ if (result.isError) {
247
+ const errorText = result.content
248
+ ?.map((entry) => entry.text ?? '')
249
+ .filter(Boolean)
250
+ .join('\n') || 'MCP tool error';
251
+ throw new Error(errorText);
252
+ }
253
+ return result;
254
+ }
255
+ async callCodeModeSearch(args) {
256
+ return this.callWithFallback(CODE_MODE_SEARCH_TOOLS, args);
257
+ }
258
+ async callCodeModeExecute(args) {
259
+ return this.callWithFallback(CODE_MODE_EXECUTE_TOOLS, args);
260
+ }
261
+ async callWithFallback(candidates, args) {
262
+ let lastUnknownError = null;
263
+ for (const toolName of candidates) {
264
+ try {
265
+ return await this.callTool(toolName, args);
266
+ }
267
+ catch (error) {
268
+ if (!looksUnknownToolError(error))
269
+ throw error;
270
+ lastUnknownError = error instanceof Error ? error : new Error(String(error));
271
+ }
272
+ }
273
+ if (lastUnknownError)
274
+ throw lastUnknownError;
275
+ throw new Error('Sage code-mode tools are unavailable');
276
+ }
277
+ async initialize() {
278
+ await this.request('initialize', {
279
+ protocolVersion: '2024-11-05',
280
+ capabilities: {},
281
+ clientInfo: { name: 'sage-pi-adapter', version: '0.2.0' },
282
+ });
283
+ this.notify('notifications/initialized', {});
284
+ this.ready = true;
285
+ }
286
+ async spawn() {
287
+ await new Promise((resolve, reject) => {
288
+ const proc = spawn(this.command, this.args, {
289
+ stdio: ['pipe', 'pipe', 'pipe'],
290
+ env: { ...process.env, ...this.env },
291
+ });
292
+ let settled = false;
293
+ const rejectOnce = (err) => {
294
+ if (settled)
295
+ return;
296
+ settled = true;
297
+ reject(err);
298
+ };
299
+ proc.on('error', (err) => {
300
+ if (!this.stopped)
301
+ rejectOnce(err);
302
+ });
303
+ proc.on('exit', (code) => {
304
+ if (this.stopped)
305
+ return;
306
+ if (!this.ready) {
307
+ rejectOnce(new Error(`MCP process exited before initialization (code ${code ?? -1})`));
308
+ return;
309
+ }
310
+ this.ready = false;
311
+ this.rejectAllPending(`MCP process exited (code ${code ?? -1})`);
312
+ });
313
+ proc.stdout.setEncoding('utf8');
314
+ let buffer = '';
315
+ proc.stdout.on('data', (chunk) => {
316
+ buffer += chunk;
317
+ const lines = buffer.split('\n');
318
+ buffer = lines.pop() ?? '';
319
+ for (const line of lines) {
320
+ if (line.trim())
321
+ this.handleLine(line);
322
+ }
323
+ });
324
+ this.proc = proc;
325
+ settled = true;
326
+ resolve();
327
+ });
328
+ }
329
+ request(method, params) {
330
+ return new Promise((resolve, reject) => {
331
+ if (!this.proc?.stdin?.writable) {
332
+ reject(new Error('MCP process not running'));
333
+ return;
334
+ }
335
+ const id = randomUUID();
336
+ const timeout = setTimeout(() => {
337
+ this.pending.delete(id);
338
+ reject(new Error(`MCP request timed out: ${method}`));
339
+ }, this.requestTimeoutMs);
340
+ this.pending.set(id, { resolve, reject, timeout });
341
+ const req = { jsonrpc: '2.0', id, method, params };
342
+ this.proc.stdin.write(JSON.stringify(req) + '\n');
343
+ });
344
+ }
345
+ notify(method, params) {
346
+ if (!this.proc?.stdin?.writable)
347
+ return;
348
+ const msg = { jsonrpc: '2.0', method, params };
349
+ this.proc.stdin.write(JSON.stringify(msg) + '\n');
350
+ }
351
+ handleLine(line) {
352
+ let msg;
353
+ try {
354
+ msg = JSON.parse(line);
355
+ }
356
+ catch {
357
+ return;
358
+ }
359
+ if (msg.id === undefined || msg.id === null)
360
+ return;
361
+ const id = String(msg.id);
362
+ const pending = this.pending.get(id);
363
+ if (!pending)
364
+ return;
365
+ this.pending.delete(id);
366
+ clearTimeout(pending.timeout);
367
+ if (msg.error) {
368
+ pending.reject(new Error(`MCP error: ${JSON.stringify(msg.error)}`));
369
+ return;
370
+ }
371
+ pending.resolve(msg.result);
372
+ }
373
+ rejectAllPending(reason) {
374
+ for (const pending of this.pending.values()) {
375
+ clearTimeout(pending.timeout);
376
+ pending.reject(new Error(reason));
377
+ }
378
+ this.pending.clear();
379
+ }
380
+ }
381
+ export class SageHookRuntime {
382
+ config;
383
+ commandRunner;
384
+ constructor(config) {
385
+ this.config = config;
386
+ this.commandRunner = config.commandRunner ?? defaultSageCommandRunner;
387
+ }
388
+ async getSessionContext(sessionId) {
389
+ const result = await this.run(['skill', 'context', '--format', 'opencode'], { SAGE_SESSION_ID: sessionId ?? '' }, undefined, true);
390
+ return result?.stdout.trim() ?? '';
391
+ }
392
+ async suggestSkill(prompt, sessionId) {
393
+ const trimmed = prompt.trim();
394
+ if (!trimmed)
395
+ return '';
396
+ const args = [
397
+ 'suggest',
398
+ 'hook',
399
+ 'skill',
400
+ '--limit',
401
+ String(this.config.suggestLimit ?? 3),
402
+ ];
403
+ if (this.config.enableProvision !== false)
404
+ args.push('--provision');
405
+ if (this.config.source) {
406
+ args.push('--source', this.config.source);
407
+ }
408
+ if (sessionId) {
409
+ args.push('--session', sessionId);
410
+ }
411
+ const result = await this.run(args, {
412
+ PROMPT: trimmed,
413
+ SAGE_PROMPT: trimmed,
414
+ SAGE_SESSION_ID: sessionId ?? '',
415
+ }, JSON.stringify({ prompt: trimmed }), true);
416
+ return result?.stdout.trim() ?? '';
417
+ }
418
+ async capturePrompt(prompt, sessionId) {
419
+ if (this.config.enableRlmFeedback === false)
420
+ return;
421
+ const trimmed = prompt.trim();
422
+ if (!trimmed)
423
+ return;
424
+ await this.run(['capture', 'hook', 'prompt'], {
425
+ PROMPT: trimmed,
426
+ SAGE_PROMPT: trimmed,
427
+ SAGE_SOURCE: this.config.source ?? 'pi',
428
+ SAGE_SESSION_ID: sessionId ?? '',
429
+ }, JSON.stringify({ prompt: trimmed }), true);
430
+ }
431
+ async captureResponse(response, usage, sessionId) {
432
+ if (this.config.enableRlmFeedback === false)
433
+ return;
434
+ const trimmed = response.trim();
435
+ if (!trimmed)
436
+ return;
437
+ await this.run(['capture', 'hook', 'response'], {
438
+ SAGE_RESPONSE: trimmed,
439
+ LAST_RESPONSE: trimmed,
440
+ SAGE_SOURCE: this.config.source ?? 'pi',
441
+ SAGE_SESSION_ID: sessionId ?? '',
442
+ TOKENS_INPUT: usage.input ?? '',
443
+ TOKENS_OUTPUT: usage.output ?? '',
444
+ }, JSON.stringify({ response: trimmed }), true);
445
+ }
446
+ async scanPreTool(toolName, toolInput, sessionId) {
447
+ if (this.config.enableSecurityHooks === false)
448
+ return null;
449
+ const payload = {
450
+ hook_event_name: 'PreToolUse',
451
+ tool_name: toolName,
452
+ tool_input: toolInput,
453
+ };
454
+ const result = await this.run(['security', 'scan-hook'], {
455
+ SAGE_SOURCE: this.config.source ?? 'pi',
456
+ SAGE_SESSION_ID: sessionId ?? '',
457
+ }, JSON.stringify(payload), true);
458
+ return result ? parseSecurityDecision(result.stdout) : null;
459
+ }
460
+ async scanPostTool(toolName, toolInput, toolResult, sessionId) {
461
+ if (this.config.enableSecurityHooks === false)
462
+ return null;
463
+ const payload = {
464
+ hook_event_name: 'PostToolUse',
465
+ tool_name: toolName,
466
+ tool_input: toolInput,
467
+ tool_response: toolResult,
468
+ };
469
+ const result = await this.run(['security', 'scan-hook'], {
470
+ SAGE_SOURCE: this.config.source ?? 'pi',
471
+ SAGE_SESSION_ID: sessionId ?? '',
472
+ }, JSON.stringify(payload), true);
473
+ return result ? parseSecurityDecision(result.stdout) : null;
474
+ }
475
+ async run(args, env, stdin, ignoreFailures = false) {
476
+ try {
477
+ const commandEnv = {
478
+ HOME: process.env.HOME ?? '',
479
+ PATH: process.env.PATH ?? '',
480
+ ...(this.config.env ?? {}),
481
+ ...env,
482
+ };
483
+ if (this.config.sageProfile) {
484
+ commandEnv.SAGE_PROFILE = this.config.sageProfile;
485
+ }
486
+ const result = await this.commandRunner({
487
+ command: this.config.sageBin,
488
+ args,
489
+ env: commandEnv,
490
+ stdin,
491
+ timeoutMs: this.config.timeoutMs,
492
+ });
493
+ if (!ignoreFailures && (result.timedOut || result.exitCode !== 0)) {
494
+ const reason = result.timedOut
495
+ ? `timed out: ${this.config.sageBin} ${args.join(' ')}`
496
+ : `failed (${result.exitCode}): ${result.stderr || result.stdout}`;
497
+ throw new Error(reason);
498
+ }
499
+ return result;
500
+ }
501
+ catch (error) {
502
+ if (!ignoreFailures)
503
+ throw error;
504
+ return null;
505
+ }
506
+ }
507
+ }
508
+ const SageDomainType = Type.Union([
509
+ Type.Literal('prompts'),
510
+ Type.Literal('skills'),
511
+ Type.Literal('builder'),
512
+ Type.Literal('governance'),
513
+ Type.Literal('chat'),
514
+ Type.Literal('social'),
515
+ Type.Literal('rlm'),
516
+ Type.Literal('library_sync'),
517
+ Type.Literal('security'),
518
+ Type.Literal('meta'),
519
+ Type.Literal('hub'),
520
+ Type.Literal('help'),
521
+ Type.Literal('external'),
522
+ ], { description: 'Sage domain namespace' });
523
+ export function createSageSearchTool(mcpBridge) {
524
+ return {
525
+ name: 'sage_search',
526
+ label: 'Sage: Search',
527
+ description: 'Sage code-mode search/discovery (domain/action routing)',
528
+ parameters: Type.Object({
529
+ domain: SageDomainType,
530
+ action: Type.String(),
531
+ params: Type.Optional(Type.Record(Type.String(), Type.Unknown())),
532
+ }),
533
+ execute: async (_toolCallId, params) => {
534
+ try {
535
+ const domain = String(params.domain ?? '');
536
+ const action = String(params.action ?? '');
537
+ const payload = params.params && typeof params.params === 'object'
538
+ ? params.params
539
+ : {};
540
+ if (domain === 'external' && !['list_servers', 'search'].includes(action)) {
541
+ return {
542
+ content: [
543
+ {
544
+ type: 'text',
545
+ text: 'For external domain, sage_search only supports actions: list_servers, search',
546
+ },
547
+ ],
548
+ isError: true,
549
+ };
550
+ }
551
+ const result = await mcpBridge.callCodeModeSearch({
552
+ domain,
553
+ action,
554
+ params: payload,
555
+ });
556
+ return toToolResultText(result);
557
+ }
558
+ catch (error) {
559
+ return {
560
+ content: [
561
+ {
562
+ type: 'text',
563
+ text: `sage_search failed: ${error instanceof Error ? error.message : String(error)}`,
564
+ },
565
+ ],
566
+ isError: true,
567
+ };
568
+ }
569
+ },
570
+ };
571
+ }
572
+ export function createSageExecuteTool(mcpBridge) {
573
+ return {
574
+ name: 'sage_execute',
575
+ label: 'Sage: Execute',
576
+ description: 'Sage code-mode execute/mutations (domain/action routing)',
577
+ parameters: Type.Object({
578
+ domain: SageDomainType,
579
+ action: Type.String(),
580
+ params: Type.Optional(Type.Record(Type.String(), Type.Unknown())),
581
+ }),
582
+ execute: async (_toolCallId, params) => {
583
+ try {
584
+ const domain = String(params.domain ?? '');
585
+ const action = String(params.action ?? '');
586
+ const payload = params.params && typeof params.params === 'object'
587
+ ? params.params
588
+ : {};
589
+ if (domain === 'external' && !['execute', 'call'].includes(action)) {
590
+ return {
591
+ content: [
592
+ {
593
+ type: 'text',
594
+ text: 'For external domain, sage_execute only supports actions: execute, call',
595
+ },
596
+ ],
597
+ isError: true,
598
+ };
599
+ }
600
+ const result = await mcpBridge.callCodeModeExecute({
601
+ domain,
602
+ action,
603
+ params: payload,
604
+ });
605
+ return toToolResultText(result);
606
+ }
607
+ catch (error) {
608
+ return {
609
+ content: [
610
+ {
611
+ type: 'text',
612
+ text: `sage_execute failed: ${error instanceof Error ? error.message : String(error)}`,
613
+ },
614
+ ],
615
+ isError: true,
616
+ };
617
+ }
618
+ },
619
+ };
620
+ }
621
+ export function createSageStatusTool(mcpBridge) {
622
+ return {
623
+ name: 'sage_status',
624
+ label: 'Sage: Status',
625
+ description: 'Check Sage adapter health and MCP bridge status',
626
+ parameters: Type.Object({}),
627
+ execute: async () => {
628
+ const bridgeConnected = mcpBridge.isReady();
629
+ if (bridgeConnected) {
630
+ try {
631
+ const context = await mcpBridge.callCodeModeSearch({
632
+ domain: 'meta',
633
+ action: 'get_project_context',
634
+ params: {},
635
+ });
636
+ return {
637
+ content: [
638
+ {
639
+ type: 'text',
640
+ text: JSON.stringify({
641
+ bridgeConnected,
642
+ sageAdapterVersion: '0.2.0',
643
+ context: extractJsonFromMcpResult(context) ?? context,
644
+ }, null, 2),
645
+ },
646
+ ],
647
+ };
648
+ }
649
+ catch {
650
+ // no-op, fallback below
651
+ }
652
+ }
653
+ return {
654
+ content: [
655
+ {
656
+ type: 'text',
657
+ text: JSON.stringify({
658
+ bridgeConnected,
659
+ sageAdapterVersion: '0.2.0',
660
+ }, null, 2),
661
+ },
662
+ ],
663
+ details: { bridgeConnected },
664
+ };
665
+ },
666
+ };
667
+ }
668
+ export function wrapToolsWithSageSecurity(tools, options) {
669
+ return tools.map((tool) => {
670
+ const originalExecute = tool.execute;
671
+ return {
672
+ ...tool,
673
+ execute: async (toolCallId, params, signal, onUpdate, ctx) => {
674
+ const sessionId = options.getSessionId?.();
675
+ const pre = await options.hookRuntime.scanPreTool(tool.name, params, sessionId);
676
+ if (pre?.decision === 'block') {
677
+ return {
678
+ content: [
679
+ {
680
+ type: 'text',
681
+ text: `Sage security blocked ${tool.name}: ${pre.reason ?? 'high-risk payload detected'}`,
682
+ },
683
+ ],
684
+ details: { blockedBySageSecurity: true, reason: pre.reason, tool: tool.name },
685
+ isError: true,
686
+ };
687
+ }
688
+ const result = await originalExecute(toolCallId, params, signal, onUpdate, ctx);
689
+ const post = await options.hookRuntime.scanPostTool(tool.name, params, result, sessionId);
690
+ if (post?.decision === 'warn' || post?.decision === 'block') {
691
+ return appendText(result, `Sage security ${post.decision}: ${post.reason ?? 'treat this output as untrusted content.'}`);
692
+ }
693
+ return result;
694
+ },
695
+ };
696
+ });
697
+ }
698
+ async function injectHookMessage(session, customType, content, display = false) {
699
+ const trimmed = content.trim();
700
+ if (!trimmed)
701
+ return;
702
+ if (typeof session.sendHookMessage === 'function') {
703
+ await session.sendHookMessage({
704
+ customType,
705
+ content: trimmed,
706
+ display,
707
+ }, false);
708
+ return;
709
+ }
710
+ console.log(`\n[${customType}]\n${trimmed}\n`);
711
+ }
712
+ export function createSageExtensions(options) {
713
+ const { mcpBridge, debounceMs = 800 } = options;
714
+ const hookRuntime = options.hookRuntime ??
715
+ new SageHookRuntime({
716
+ sageBin: options.config.sageBin ?? 'sage',
717
+ timeoutMs: options.config.timeoutMs ?? 20_000,
718
+ ...options.config,
719
+ });
720
+ mcpBridge.start().catch((error) => {
721
+ console.error('[sage-pi-adapter] failed to start MCP bridge:', error);
722
+ });
723
+ const sageTools = [
724
+ createSageSearchTool(mcpBridge),
725
+ createSageExecuteTool(mcpBridge),
726
+ createSageStatusTool(mcpBridge),
727
+ ];
728
+ const customTools = wrapToolsWithSageSecurity(sageTools, {
729
+ hookRuntime,
730
+ getSessionId: options.getSessionId,
731
+ });
732
+ let currentSuggestions = '';
733
+ let lastInjectionTimestamp = 0;
734
+ let lastSuggestionPrompt = '';
735
+ return {
736
+ customTools,
737
+ sageInjectSuggestion: async (userPrompt, session, sessionId) => {
738
+ const prompt = userPrompt.trim();
739
+ if (!prompt)
740
+ return;
741
+ const now = Date.now();
742
+ if (now - lastInjectionTimestamp < debounceMs)
743
+ return;
744
+ if (prompt === lastSuggestionPrompt)
745
+ return;
746
+ lastInjectionTimestamp = now;
747
+ lastSuggestionPrompt = prompt;
748
+ try {
749
+ const suggestions = await hookRuntime.suggestSkill(prompt, sessionId);
750
+ if (!suggestions.trim())
751
+ return;
752
+ currentSuggestions = suggestions;
753
+ if (session) {
754
+ await injectHookMessage(session, 'sage-suggested-skills', suggestions, false);
755
+ }
756
+ }
757
+ catch (error) {
758
+ console.error('[sage-pi-adapter] suggestion hook failed:', error);
759
+ }
760
+ },
761
+ sageClearSuggestions: () => {
762
+ currentSuggestions = '';
763
+ lastSuggestionPrompt = '';
764
+ },
765
+ sageGetSuggestions: () => currentSuggestions,
766
+ };
767
+ }
768
+ export async function createSageSessionConfig(config = {}) {
769
+ const normalized = {
770
+ sageBin: config.sageBin ?? 'sage',
771
+ timeoutMs: config.timeoutMs ?? 20_000,
772
+ suggestLimit: config.suggestLimit ?? 3,
773
+ suggestDebounceMs: config.suggestDebounceMs ?? 800,
774
+ enableProvision: config.enableProvision ?? true,
775
+ enableRlmFeedback: config.enableRlmFeedback ?? true,
776
+ enableSecurityHooks: config.enableSecurityHooks ?? true,
777
+ source: config.source ?? 'pi',
778
+ ...config,
779
+ };
780
+ const sageEnv = {
781
+ HOME: process.env.HOME ?? '',
782
+ PATH: process.env.PATH ?? '',
783
+ ...(normalized.env ?? {}),
784
+ };
785
+ if (normalized.sageProfile) {
786
+ sageEnv.SAGE_PROFILE = normalized.sageProfile;
787
+ }
788
+ const hookRuntime = new SageHookRuntime(normalized);
789
+ let activeSessionId;
790
+ const mcpBridge = new SageMcpBridge(normalized.sageBin, ['mcp', 'start'], sageEnv, normalized.timeoutMs);
791
+ const extension = createSageExtensions({
792
+ config: normalized,
793
+ mcpBridge,
794
+ hookRuntime,
795
+ getSessionId: () => activeSessionId,
796
+ debounceMs: normalized.suggestDebounceMs,
797
+ });
798
+ const wrapTools = (tools) => wrapToolsWithSageSecurity(tools, {
799
+ hookRuntime,
800
+ getSessionId: () => activeSessionId,
801
+ });
802
+ return {
803
+ customTools: extension.customTools,
804
+ mcpBridge,
805
+ wrapToolsWithSecurity: wrapTools,
806
+ setupHooks: (session) => {
807
+ activeSessionId = session.sessionId;
808
+ hookRuntime
809
+ .getSessionContext(activeSessionId)
810
+ .then(async (context) => {
811
+ if (!context)
812
+ return;
813
+ await injectHookMessage(session, 'sage-session-context', context, false);
814
+ })
815
+ .catch((error) => {
816
+ console.error('[sage-pi-adapter] failed to inject session context:', error);
817
+ });
818
+ const unsubscribe = session.subscribe((event) => {
819
+ const parsed = parseMessageEndEvent(event);
820
+ if (!parsed)
821
+ return;
822
+ if (parsed.role === 'user') {
823
+ const content = parsed.content.trim();
824
+ if (!content)
825
+ return;
826
+ void hookRuntime.capturePrompt(content, activeSessionId).catch((error) => {
827
+ console.error('[sage-pi-adapter] prompt capture failed:', error);
828
+ });
829
+ void extension.sageInjectSuggestion(content, session, activeSessionId);
830
+ return;
831
+ }
832
+ if (parsed.role === 'assistant') {
833
+ const response = parsed.content.trim();
834
+ if (!response)
835
+ return;
836
+ const usage = extractUsage(parsed.usage);
837
+ void hookRuntime
838
+ .captureResponse(response, usage, activeSessionId)
839
+ .catch((error) => {
840
+ console.error('[sage-pi-adapter] response capture failed:', error);
841
+ });
842
+ }
843
+ });
844
+ return () => {
845
+ unsubscribe();
846
+ };
847
+ },
848
+ };
849
+ }
850
+ export default {
851
+ createSageExtensions,
852
+ createSageSessionConfig,
853
+ wrapToolsWithSageSecurity,
854
+ SageMcpBridge,
855
+ SageHookRuntime,
856
+ };
857
+ //# sourceMappingURL=sage-pi-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sage-pi-adapter.js","sourceRoot":"","sources":["../src/sage-pi-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAuC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA8GzC,MAAM,sBAAsB,GAAG,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;AACxE,MAAM,uBAAuB,GAAG,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;AAE3E,KAAK,UAAU,wBAAwB,CACrC,OAA2B;IAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;YAChD,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;YACvC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAEtB,MAAM,MAAM,GAAG,CAAC,MAAyB,EAAQ,EAAE;YACjD,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,CAAC;gBACL,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;gBACpB,MAAM;gBACN,MAAM;gBACN,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEnD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAE3E,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;QAC/B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC;IACjF,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO;aAC3B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;YACnD,MAAM,SAAS,GAAI,KAAiC,CAAC,IAAI,CAAC;YAC1D,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC;aACV,IAAI,EAAE,CAAC;QAEV,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAE7C,MAAM,KAAK,GACT,CAAC,GAAG,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QACzC,CAAC,CAAE,GAAG,CAAC,KAAiC;QACxC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC;IAExB,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAsB,EAAE;QACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9E,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EACH,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC;YACvC,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC;YACvC,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC;QACxC,MAAM,EACJ,mBAAmB,CAAC,KAAK,CAAC,aAAa,CAAC;YACxC,mBAAmB,CAAC,KAAK,CAAC,aAAa,CAAC;YACxC,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAc;IAEd,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,IAAI,GAAG,KAAgC,CAAC;IAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,GAAG,GAAG,OAAkC,CAAC;IAE/C,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;IAChD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAe;IAC/C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9E,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO;SACrB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACnD,MAAM,GAAG,GAAI,KAAiC,CAAC,IAAI,CAAC;QACpD,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAe;IACvC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,MAAM;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAAkB,EAAE,IAAY;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/F,OAAO,CACL,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC5B,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;QACzB,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC5B,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM;SACjB,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;SACf,OAAO,EAAE,CAAC;IAEb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;YAC3D,MAAM,WAAW,GAAG,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,IAAI,CAAC,WAAW;gBAAE,SAAS;YAE3B,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7E,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACzD,CAAC;YACD,IAAI,WAAW,KAAK,MAAM;gBAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAChE,IAAI,WAAW,KAAK,OAAO;gBAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,aAAa;IAQd;IACA;IACA;IACA;IAVF,IAAI,GAA0C,IAAI,CAAC;IACnD,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,KAAK,GAAG,KAAK,CAAC;IACd,OAAO,GAAG,KAAK,CAAC;IAChB,YAAY,GAAyB,IAAI,CAAC;IAElD,YACU,OAAe,EACf,IAAc,EACd,MAA8B,EAAE,EAChC,mBAAmB,MAAM;QAHzB,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAU;QACd,QAAG,GAAH,GAAG,CAA6B;QAChC,qBAAgB,GAAhB,gBAAgB,CAAS;IAChC,CAAC;IAEJ,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO;QAC3B,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QAEhD,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;YAC9B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QAE5C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAEnD,CAAC;QACF,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAA6B;QACxD,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC/C,IAAI;YACJ,SAAS,EAAE,IAAI;SAChB,CAAC,CAGD,CAAC;QAEF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,SAAS,GACb,MAAM,CAAC,OAAO;gBACZ,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;iBACjC,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAA6B;QACpD,OAAO,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAA6B;QACrD,OAAO,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,UAAoB,EACpB,IAA6B;QAE7B,IAAI,gBAAgB,GAAiB,IAAI,CAAC;QAE1C,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC/C,gBAAgB,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAED,IAAI,gBAAgB;YAAE,MAAM,gBAAgB,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC/B,eAAe,EAAE,YAAY;YAC7B,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE;SAC1D,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;gBAC1C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;aACrC,CAAC,CAAC;YAEH,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,UAAU,GAAG,CAAC,GAAU,EAAQ,EAAE;gBACtC,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC;YAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE,UAAU,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvB,IAAI,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACzB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAChB,UAAU,CAAC,IAAI,KAAK,CAAC,kDAAkD,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACvF,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBACnB,IAAI,CAAC,gBAAgB,CAAC,4BAA4B,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACvC,MAAM,IAAI,KAAK,CAAC;gBAChB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,IAAI,EAAE;wBAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,OAAO,CAAC,MAAc,EAAE,MAA+B;QAC7D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAE1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACnD,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,MAAc,EAAE,MAA+B;QAC5D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ;YAAE,OAAO;QACxC,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACpD,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,IAAI,GAAoB,CAAC;QACzB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI;YAAE,OAAO;QACpD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE9B,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAEO,gBAAgB,CAAC,MAAc;QACrC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,eAAe;IAGN;IAFZ,aAAa,CAAoB;IAEzC,YAAoB,MAA4E;QAA5E,WAAM,GAAN,MAAM,CAAsE;QAC9F,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,wBAAwB,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,SAAkB;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAC3B,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,EAC5C,EAAE,eAAe,EAAE,SAAS,IAAI,EAAE,EAAE,EACpC,SAAS,EACT,IAAI,CACL,CAAC;QACF,OAAO,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,SAAkB;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAExB,MAAM,IAAI,GAAG;YACX,SAAS;YACT,MAAM;YACN,OAAO;YACP,SAAS;YACT,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;SACtC,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,KAAK,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAC3B,IAAI,EACJ;YACE,MAAM,EAAE,OAAO;YACf,WAAW,EAAE,OAAO;YACpB,eAAe,EAAE,SAAS,IAAI,EAAE;SACjC,EACD,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EACnC,IAAI,CACL,CAAC;QAEF,OAAO,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,SAAkB;QACpD,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,KAAK,KAAK;YAAE,OAAO;QACpD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,IAAI,CAAC,GAAG,CACZ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAC7B;YACE,MAAM,EAAE,OAAO;YACf,WAAW,EAAE,OAAO;YACpB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI;YACvC,eAAe,EAAE,SAAS,IAAI,EAAE;SACjC,EACD,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EACnC,IAAI,CACL,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,QAAgB,EAChB,KAA0C,EAC1C,SAAkB;QAElB,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,KAAK,KAAK;YAAE,OAAO;QACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,IAAI,CAAC,GAAG,CACZ,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAC/B;YACE,aAAa,EAAE,OAAO;YACtB,aAAa,EAAE,OAAO;YACtB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI;YACvC,eAAe,EAAE,SAAS,IAAI,EAAE;YAChC,YAAY,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;YAC/B,aAAa,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;SAClC,EACD,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EACrC,IAAI,CACL,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,QAAgB,EAChB,SAAkC,EAClC,SAAkB;QAElB,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAC3D,MAAM,OAAO,GAAG;YACd,eAAe,EAAE,YAAY;YAC7B,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,SAAS;SACtB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAC3B,CAAC,UAAU,EAAE,WAAW,CAAC,EACzB;YACE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI;YACvC,eAAe,EAAE,SAAS,IAAI,EAAE;SACjC,EACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACvB,IAAI,CACL,CAAC;QAEF,OAAO,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,QAAgB,EAChB,SAAkC,EAClC,UAAmB,EACnB,SAAkB;QAElB,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAC3D,MAAM,OAAO,GAAG;YACd,eAAe,EAAE,aAAa;YAC9B,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,SAAS;YACrB,aAAa,EAAE,UAAU;SAC1B,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAC3B,CAAC,UAAU,EAAE,WAAW,CAAC,EACzB;YACE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI;YACvC,eAAe,EAAE,SAAS,IAAI,EAAE;SACjC,EACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACvB,IAAI,CACL,CAAC;QAEF,OAAO,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAEO,KAAK,CAAC,GAAG,CACf,IAAc,EACd,GAA2B,EAC3B,KAAc,EACd,cAAc,GAAG,KAAK;QAEtB,IAAI,CAAC;YACH,MAAM,UAAU,GAA2B;gBACzC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;gBAC5B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;gBAC5B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;gBAC1B,GAAG,GAAG;aACP,CAAC;YAEF,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5B,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YACpD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC;gBACtC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,IAAI;gBACJ,GAAG,EAAE,UAAU;gBACf,KAAK;gBACL,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;aACjC,CAAC,CAAC;YAEH,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ;oBAC5B,CAAC,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;oBACvD,CAAC,CAAC,WAAW,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBACrE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,cAAc;gBAAE,MAAM,KAAK,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B;IACE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACtB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACpB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IACnB,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACpB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACpB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;CACzB,EACD,EAAE,WAAW,EAAE,uBAAuB,EAAE,CACzC,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,SAAwB;IAC3D,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,yDAAyD;QACtE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACrB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;SAClE,CAAC;QACF,OAAO,EAAE,KAAK,EACZ,WAAmB,EACnB,MAA+B,EACV,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC3C,MAAM,OAAO,GACX,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;oBAChD,CAAC,CAAE,MAAM,CAAC,MAAkC;oBAC5C,CAAC,CAAC,EAAE,CAAC;gBAET,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1E,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,8EAA8E;6BACrF;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC;oBAChD,MAAM;oBACN,MAAM;oBACN,MAAM,EAAE,OAAO;iBAChB,CAAC,CAAC;gBAEH,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;yBACtF;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAwB;IAC5D,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,0DAA0D;QACvE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;YACrB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;SAClE,CAAC;QACF,OAAO,EAAE,KAAK,EACZ,WAAmB,EACnB,MAA+B,EACV,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC3C,MAAM,OAAO,GACX,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;oBAChD,CAAC,CAAE,MAAM,CAAC,MAAkC;oBAC5C,CAAC,CAAC,EAAE,CAAC;gBAET,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACnE,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,wEAAwE;6BAC/E;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC;oBACjD,MAAM;oBACN,MAAM;oBACN,MAAM,EAAE,OAAO;iBAChB,CAAC,CAAC;gBAEH,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;yBACvF;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAwB;IAC3D,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,iDAAiD;QAC9D,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,IAAyB,EAAE;YACvC,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;YAE5C,IAAI,eAAe,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC;wBACjD,MAAM,EAAE,MAAM;wBACd,MAAM,EAAE,qBAAqB;wBAC7B,MAAM,EAAE,EAAE;qBACX,CAAC,CAAC;oBACH,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oCACE,eAAe;oCACf,kBAAkB,EAAE,OAAO;oCAC3B,OAAO,EAAE,wBAAwB,CAAC,OAAO,CAAC,IAAI,OAAO;iCACtD,EACD,IAAI,EACJ,CAAC,CACF;6BACF;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,eAAe;4BACf,kBAAkB,EAAE,OAAO;yBAC5B,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;gBACD,OAAO,EAAE,EAAE,eAAe,EAAE;aAC7B,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAeD,MAAM,UAAU,yBAAyB,CACvC,KAAuB,EACvB,OAA4B;IAE5B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC;QAErC,OAAO;YACL,GAAG,IAAI;YACP,OAAO,EAAE,KAAK,EACZ,UAAkB,EAClB,MAA+B,EAC/B,MAAoB,EACpB,QAAuC,EACvC,GAAa,EACQ,EAAE;gBACvB,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;gBAE3C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBAChF,IAAI,GAAG,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;oBAC9B,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,yBAAyB,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,4BAA4B,EAAE;6BAC1F;yBACF;wBACD,OAAO,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;wBAC7E,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAChF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBAE1F,IAAI,IAAI,EAAE,QAAQ,KAAK,MAAM,IAAI,IAAI,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;oBAC5D,OAAO,UAAU,CACf,MAAM,EACN,iBAAiB,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,IAAI,yCAAyC,EAAE,CAC9F,CAAC;gBACJ,CAAC;gBAED,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAAqB,EACrB,UAAkB,EAClB,OAAe,EACf,OAAO,GAAG,KAAK;IAEf,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;QAClD,MAAM,OAAO,CAAC,eAAe,CAC3B;YACE,UAAU;YACV,OAAO,EAAE,OAAO;YAChB,OAAO;SACR,EACD,KAAK,CACN,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,MAAM,UAAU,MAAM,OAAO,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA6B;IAUhE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAChD,MAAM,WAAW,GACf,OAAO,CAAC,WAAW;QACnB,IAAI,eAAe,CAAC;YAClB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM;YACzC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM;YAC7C,GAAG,OAAO,CAAC,MAAM;SAClB,CAAC,CAAC;IAEL,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAChC,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG;QAChB,oBAAoB,CAAC,SAAS,CAAC;QAC/B,qBAAqB,CAAC,SAAS,CAAC;QAChC,oBAAoB,CAAC,SAAS,CAAC;KAChC,CAAC;IAEF,MAAM,WAAW,GAAG,yBAAyB,CAAC,SAAS,EAAE;QACvD,WAAW;QACX,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;IAEH,IAAI,kBAAkB,GAAG,EAAE,CAAC;IAC5B,IAAI,sBAAsB,GAAG,CAAC,CAAC;IAC/B,IAAI,oBAAoB,GAAG,EAAE,CAAC;IAE9B,OAAO;QACL,WAAW;QACX,oBAAoB,EAAE,KAAK,EACzB,UAAkB,EAClB,OAAsB,EACtB,SAAkB,EACH,EAAE;YACjB,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG,GAAG,sBAAsB,GAAG,UAAU;gBAAE,OAAO;YACtD,IAAI,MAAM,KAAK,oBAAoB;gBAAE,OAAO;YAE5C,sBAAsB,GAAG,GAAG,CAAC;YAC7B,oBAAoB,GAAG,MAAM,CAAC;YAE9B,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACtE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;oBAAE,OAAO;gBAEhC,kBAAkB,GAAG,WAAW,CAAC;gBACjC,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QACD,oBAAoB,EAAE,GAAS,EAAE;YAC/B,kBAAkB,GAAG,EAAE,CAAC;YACxB,oBAAoB,GAAG,EAAE,CAAC;QAC5B,CAAC;QACD,kBAAkB,EAAE,GAAW,EAAE,CAAC,kBAAkB;KACrD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAuB,EAAE;IAOzB,MAAM,UAAU,GAAyE;QACvF,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM;QACrC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC;QACtC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,GAAG;QAClD,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI;QAC/C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,IAAI;QACnD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB,IAAI,IAAI;QACvD,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;QAC7B,GAAG,MAAM;KACV,CAAC;IAEF,MAAM,OAAO,GAA2B;QACtC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;QAC5B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;QAC5B,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC;KAC1B,CAAC;IAEF,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,OAAO,CAAC,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC;IAChD,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,eAAmC,CAAC;IAExC,MAAM,SAAS,GAAG,IAAI,aAAa,CACjC,UAAU,CAAC,OAAO,EAClB,CAAC,KAAK,EAAE,OAAO,CAAC,EAChB,OAAO,EACP,UAAU,CAAC,SAAS,CACrB,CAAC;IAEF,MAAM,SAAS,GAAG,oBAAoB,CAAC;QACrC,MAAM,EAAE,UAAU;QAClB,SAAS;QACT,WAAW;QACX,YAAY,EAAE,GAAG,EAAE,CAAC,eAAe;QACnC,UAAU,EAAE,UAAU,CAAC,iBAAiB;KACzC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,CAAC,KAAuB,EAAoB,EAAE,CAC9D,yBAAyB,CAAC,KAAK,EAAE;QAC/B,WAAW;QACX,YAAY,EAAE,GAAG,EAAE,CAAC,eAAe;KACpC,CAAC,CAAC;IAEL,OAAO;QACL,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,SAAS;QACT,qBAAqB,EAAE,SAAS;QAChC,UAAU,EAAE,CAAC,OAAqB,EAAgB,EAAE;YAClD,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;YAEpC,WAAW;iBACR,iBAAiB,CAAC,eAAe,CAAC;iBAClC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBACtB,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,MAAM,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3E,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,KAAK,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC;YAEL,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAc,EAAE,EAAE;gBACvD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAC3C,IAAI,CAAC,MAAM;oBAAE,OAAO;gBAEpB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACtC,IAAI,CAAC,OAAO;wBAAE,OAAO;oBAErB,KAAK,WAAW,CAAC,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;wBACvE,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;oBACnE,CAAC,CAAC,CAAC;oBAEH,KAAK,SAAS,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;oBACvE,OAAO;gBACT,CAAC;gBAED,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBACvC,IAAI,CAAC,QAAQ;wBAAE,OAAO;oBAEtB,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACzC,KAAK,WAAW;yBACb,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC;yBACjD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;wBACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;oBACrE,CAAC,CAAC,CAAC;gBACP,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,GAAS,EAAE;gBAChB,WAAW,EAAE,CAAC;YAChB,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,eAAe;IACb,oBAAoB;IACpB,uBAAuB;IACvB,yBAAyB;IACzB,aAAa;IACb,eAAe;CAChB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@sage-protocol/pi-adapter",
3
+ "version": "0.1.0",
4
+ "description": "Sage Protocol MCP integration for pi coding agent",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.build.json",
20
+ "dev": "tsc -p tsconfig.build.json --watch",
21
+ "clean": "rm -rf dist",
22
+ "test": "vitest --run",
23
+ "prepublishOnly": "npm run clean && npm run build"
24
+ },
25
+ "dependencies": {
26
+ "@sinclair/typebox": "^0.34.0"
27
+ },
28
+ "peerDependencies": {
29
+ "@mariozechner/pi-coding-agent": "^0.55.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^24.0.0",
33
+ "typescript": "^5.7.0",
34
+ "vitest": "^3.0.0"
35
+ },
36
+ "keywords": [
37
+ "sage-protocol",
38
+ "pi-agent",
39
+ "mcp",
40
+ "skills",
41
+ "prompts"
42
+ ],
43
+ "author": "Sage Protocol",
44
+ "license": "MIT",
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "https://github.com/sage-protocol/sage-protocol",
48
+ "directory": "packages/sage-pi-adapter"
49
+ }
50
+ }