reportflow-mcp 1.1.2 → 1.2.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 +72 -173
- package/dist/auth-context.d.ts +10 -0
- package/dist/auth-context.d.ts.map +1 -0
- package/dist/auth-context.js +10 -0
- package/dist/auth-context.js.map +1 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +27 -3
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +43 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +30 -4
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +62 -0
- package/dist/config.js.map +1 -0
- package/dist/http-server.d.ts +16 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +267 -0
- package/dist/http-server.js.map +1 -0
- package/dist/http.d.ts +14 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +15 -1
- package/dist/http.js.map +1 -1
- package/dist/index-http.d.ts +2 -0
- package/dist/index-http.d.ts.map +1 -0
- package/dist/index-http.js +14 -0
- package/dist/index-http.js.map +1 -0
- package/dist/server.d.ts +41 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +110 -53
- package/dist/server.js.map +1 -1
- package/dist/telemetry/client.d.ts +30 -0
- package/dist/telemetry/client.d.ts.map +1 -0
- package/dist/telemetry/client.js +85 -0
- package/dist/telemetry/client.js.map +1 -0
- package/dist/telemetry/index.d.ts +4 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +11 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/interceptor.d.ts +9 -0
- package/dist/telemetry/interceptor.d.ts.map +1 -0
- package/dist/telemetry/interceptor.js +72 -0
- package/dist/telemetry/interceptor.js.map +1 -0
- package/dist/tools/generate-pdf-sync.d.ts +32 -8
- package/dist/tools/generate-pdf-sync.d.ts.map +1 -1
- package/dist/tools/generate-pdf-sync.js +118 -10
- package/dist/tools/generate-pdf-sync.js.map +1 -1
- package/package.json +11 -1
package/dist/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.startServer = void 0;
|
|
3
|
+
exports.startServer = exports.createMcpServer = exports.contentDtoSchema = void 0;
|
|
4
4
|
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
5
5
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
6
6
|
const zod_1 = require("zod");
|
|
@@ -17,17 +17,28 @@ const suggest_params_js_1 = require("./tools/suggest-params.js");
|
|
|
17
17
|
const index_js_1 = require("./prompts/index.js");
|
|
18
18
|
const index_js_2 = require("./resources/index.js");
|
|
19
19
|
const index_js_3 = require("./roots/index.js");
|
|
20
|
+
const index_js_4 = require("./telemetry/index.js");
|
|
20
21
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
21
22
|
const pkg = require('../package.json');
|
|
22
23
|
// ─── Common Zod Schemas ───────────────────────────────────
|
|
23
24
|
const designIdSchema = zod_1.z.string().describe('デザインID(UUID形式)');
|
|
24
25
|
const versionSchema = zod_1.z.number().int().describe('デザインバージョン番号');
|
|
25
|
-
|
|
26
|
+
exports.contentDtoSchema = zod_1.z.object({
|
|
26
27
|
fileName: zod_1.z.string().describe('出力ファイル名(例: invoice.pdf)'),
|
|
27
28
|
shareType: zod_1.z
|
|
28
|
-
.
|
|
29
|
-
.
|
|
30
|
-
|
|
29
|
+
.union([
|
|
30
|
+
zod_1.z
|
|
31
|
+
.literal('01')
|
|
32
|
+
.describe('ワークスペース内共有: 同一ワークスペースのメンバーのみアクセス可能(デフォルト)'),
|
|
33
|
+
zod_1.z
|
|
34
|
+
.literal('02')
|
|
35
|
+
.describe('招待者共有: 招待されたメールアドレスを持つユーザーのみアクセス可能'),
|
|
36
|
+
zod_1.z
|
|
37
|
+
.literal('03')
|
|
38
|
+
.describe('公開URL共有: URL を知る誰でもアクセス可能(オプションでパスコード保護)'),
|
|
39
|
+
])
|
|
40
|
+
.default('01')
|
|
41
|
+
.describe("共有タイプ(数値コード)。省略時は '01'。レスポンスの share.shareType は 'workspace'/'invited'/'public' で返る。"),
|
|
31
42
|
passcodeEnabled: zod_1.z.boolean().optional().describe('パスコード保護の有効化'),
|
|
32
43
|
params: zod_1.z
|
|
33
44
|
.record(zod_1.z.unknown())
|
|
@@ -37,22 +48,31 @@ const outputDirSchema = zod_1.z
|
|
|
37
48
|
.string()
|
|
38
49
|
.optional()
|
|
39
50
|
.describe('出力先ディレクトリ (相対/絶対)。未指定時はクライアントのワークスペース (Roots) または現在の作業ディレクトリに保存。ユーザーが場所を指定した場合のみセットすること。');
|
|
51
|
+
const includePreviewSchema = zod_1.z
|
|
52
|
+
.boolean()
|
|
53
|
+
.optional()
|
|
54
|
+
.describe('true 指定時のみ EmbeddedResource (application/pdf, base64 blob) を応答に含める。claude.ai は現状 PDF resource を inline 表示しないため、通常は省略 (false) で fileUrl のみを利用するのが効率的。');
|
|
40
55
|
const singlePdfSchema = {
|
|
41
56
|
designId: designIdSchema,
|
|
42
57
|
version: versionSchema,
|
|
43
|
-
content: contentDtoSchema.describe('PDF生成コンテンツ'),
|
|
58
|
+
content: exports.contentDtoSchema.describe('PDF生成コンテンツ'),
|
|
59
|
+
};
|
|
60
|
+
const singlePdfSyncHttpSchema = {
|
|
61
|
+
...singlePdfSchema,
|
|
62
|
+
includePreview: includePreviewSchema,
|
|
44
63
|
};
|
|
45
64
|
const multiplePdfSchema = {
|
|
46
65
|
designId: designIdSchema,
|
|
47
66
|
version: versionSchema,
|
|
48
67
|
contents: zod_1.z
|
|
49
|
-
.array(contentDtoSchema)
|
|
68
|
+
.array(exports.contentDtoSchema)
|
|
50
69
|
.min(1)
|
|
51
70
|
.describe('PDF生成コンテンツの配列(複数ファイル)'),
|
|
52
71
|
};
|
|
53
72
|
const singlePdfSyncSchema = {
|
|
54
73
|
...singlePdfSchema,
|
|
55
74
|
outputDir: outputDirSchema,
|
|
75
|
+
includePreview: includePreviewSchema,
|
|
56
76
|
};
|
|
57
77
|
const multiplePdfSyncSchema = {
|
|
58
78
|
...multiplePdfSchema,
|
|
@@ -62,62 +82,90 @@ const multiplePdfSyncSchema = {
|
|
|
62
82
|
.optional()
|
|
63
83
|
.describe('出力 ZIP のファイル名 (省略時は download.zip)'),
|
|
64
84
|
};
|
|
65
|
-
|
|
85
|
+
/**
|
|
86
|
+
* 全ツール / Prompts / Resources を登録した McpServer を生成して返す。
|
|
87
|
+
* Transport への接続は呼び出し側で行う(stdio: index.ts、HTTP: http-server.ts)。
|
|
88
|
+
*/
|
|
89
|
+
const createMcpServer = (opts = {}) => {
|
|
90
|
+
const mode = opts.mode ?? 'stdio';
|
|
91
|
+
const telemetry = opts.telemetry ?? (0, index_js_4.telemetryClientFromEnv)();
|
|
66
92
|
const server = new mcp_js_1.McpServer({
|
|
67
93
|
name: pkg.name,
|
|
68
94
|
version: pkg.version,
|
|
69
95
|
});
|
|
70
|
-
// authenticate (OAuth2 PKCE flow —
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
96
|
+
// authenticate (OAuth2 PKCE flow — stdio モードのみ提供)
|
|
97
|
+
if (mode === 'stdio') {
|
|
98
|
+
server.tool(authenticate_js_1.authenticateTool.name, authenticate_js_1.authenticateTool.description, {
|
|
99
|
+
force: zod_1.z
|
|
100
|
+
.boolean()
|
|
101
|
+
.optional()
|
|
102
|
+
.describe('既存トークンを破棄して再認証する場合 true'),
|
|
103
|
+
}, (0, index_js_4.withTelemetry)(telemetry, authenticate_js_1.authenticateTool.name, async (input) => (0, authenticate_js_1.handleAuthenticate)(input)));
|
|
104
|
+
}
|
|
77
105
|
// get_design_parameters
|
|
78
106
|
server.tool(get_design_parameters_js_1.getDesignParametersTool.name, get_design_parameters_js_1.getDesignParametersTool.description, {
|
|
79
107
|
designId: designIdSchema,
|
|
80
108
|
version: versionSchema
|
|
81
109
|
.optional()
|
|
82
110
|
.describe('バージョン番号(省略時は最新版)'),
|
|
83
|
-
}, async (input) => (0, get_design_parameters_js_1.handleGetDesignParameters)(input));
|
|
111
|
+
}, (0, index_js_4.withTelemetry)(telemetry, get_design_parameters_js_1.getDesignParametersTool.name, async (input) => (0, get_design_parameters_js_1.handleGetDesignParameters)(input)));
|
|
84
112
|
// list_templates
|
|
85
|
-
server.tool(list_templates_js_1.listTemplatesTool.name, list_templates_js_1.listTemplatesTool.description, {}, async (input) => (0, list_templates_js_1.handleListTemplates)(input));
|
|
86
|
-
// generate_pdf_sync (
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
.string()
|
|
114
|
-
.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
113
|
+
server.tool(list_templates_js_1.listTemplatesTool.name, list_templates_js_1.listTemplatesTool.description, {}, (0, index_js_4.withTelemetry)(telemetry, list_templates_js_1.listTemplatesTool.name, async (input) => (0, list_templates_js_1.handleListTemplates)(input)));
|
|
114
|
+
// ─── generate_pdf_sync (両モード共通) ──────────────────────────────────
|
|
115
|
+
// HTTP モードでは EmbeddedResource (application/pdf, base64 blob) のみを返し、
|
|
116
|
+
// サーバー側 filesystem には保存しない (コンテナ内パスはクライアント不可達)。
|
|
117
|
+
// stdio モードでは従来通り Roots/outputDir に保存 + EmbeddedResource も併せて返す。
|
|
118
|
+
if (mode === 'stdio') {
|
|
119
|
+
server.tool(generate_pdf_sync_js_1.generatePdfSyncTool.name, generate_pdf_sync_js_1.generatePdfSyncTool.description, singlePdfSyncSchema, (0, index_js_4.withTelemetry)(telemetry, generate_pdf_sync_js_1.generatePdfSyncTool.name, async (input) => (0, generate_pdf_sync_js_1.handleGeneratePdfSync)(input, {
|
|
120
|
+
mode: 'stdio',
|
|
121
|
+
resolveOutputDir: () => (0, index_js_3.resolveDefaultOutputDir)(server),
|
|
122
|
+
})));
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// HTTP モード: outputDir は除外、代わりに includePreview を受け付ける
|
|
126
|
+
server.tool(generate_pdf_sync_js_1.generatePdfSyncTool.name, generate_pdf_sync_js_1.generatePdfSyncTool.description, singlePdfSyncHttpSchema, (0, index_js_4.withTelemetry)(telemetry, generate_pdf_sync_js_1.generatePdfSyncTool.name, async (input) => (0, generate_pdf_sync_js_1.handleGeneratePdfSync)(input, { mode: 'http' })));
|
|
127
|
+
}
|
|
128
|
+
// ─── 他の filesystem-writing tools は stdio モード専用 ──────────────────
|
|
129
|
+
// generate_pdfs_sync (ZIP) と download_* は claude.ai 等のリモートクライアントから
|
|
130
|
+
// プレビュー対象にならないため、HTTP モードでは async 版のみ提供する。
|
|
131
|
+
if (mode === 'stdio') {
|
|
132
|
+
// generate_pdfs_sync (Roots-aware)
|
|
133
|
+
server.tool(generate_pdfs_sync_js_1.generatePdfsSyncTool.name, generate_pdfs_sync_js_1.generatePdfsSyncTool.description, multiplePdfSyncSchema, (0, index_js_4.withTelemetry)(telemetry, generate_pdfs_sync_js_1.generatePdfsSyncTool.name, async (input) => (0, generate_pdfs_sync_js_1.handleGeneratePdfsSync)(input, {
|
|
134
|
+
resolveOutputDir: () => (0, index_js_3.resolveDefaultOutputDir)(server),
|
|
135
|
+
})));
|
|
136
|
+
// download_file
|
|
137
|
+
server.tool(download_file_js_1.downloadFileTool.name, download_file_js_1.downloadFileTool.description, {
|
|
138
|
+
requestId: zod_1.z
|
|
139
|
+
.string()
|
|
140
|
+
.describe('generate_pdf_asyncで返されたrequestId(UUID)'),
|
|
141
|
+
fileId: zod_1.z.string().describe('generate_pdf_asyncのfiles[].fileId'),
|
|
142
|
+
fileName: zod_1.z
|
|
143
|
+
.string()
|
|
144
|
+
.optional()
|
|
145
|
+
.describe('保存ファイル名(省略時はfileId.pdf)'),
|
|
146
|
+
outputDir: outputDirSchema,
|
|
147
|
+
}, (0, index_js_4.withTelemetry)(telemetry, download_file_js_1.downloadFileTool.name, async (input) => (0, download_file_js_1.handleDownloadFile)(input)));
|
|
148
|
+
// download_zip
|
|
149
|
+
server.tool(download_zip_js_1.downloadZipTool.name, download_zip_js_1.downloadZipTool.description, {
|
|
150
|
+
requestId: zod_1.z
|
|
151
|
+
.string()
|
|
152
|
+
.describe('generate_pdfs_asyncで返されたrequestId(UUID)'),
|
|
153
|
+
fileName: zod_1.z
|
|
154
|
+
.string()
|
|
155
|
+
.optional()
|
|
156
|
+
.describe('保存ファイル名(省略時はrequestId.zip)'),
|
|
157
|
+
outputDir: outputDirSchema,
|
|
158
|
+
}, (0, index_js_4.withTelemetry)(telemetry, download_zip_js_1.downloadZipTool.name, async (input) => (0, download_zip_js_1.handleDownloadZip)(input)));
|
|
159
|
+
// generate_pdf_async は HTTP モードでは非公開化 (sync が data+fileUrl+fileId を
|
|
160
|
+
// 1 リクエストで返せるため、リモートクライアント側で async を呼び分ける合理性が
|
|
161
|
+
// 薄く、Claude がツール選択を誤る原因になる)。stdio モードでは Claude Desktop /
|
|
162
|
+
// Code 内のローカル開発で個別生成 → download_file の組み合わせを使うケースが
|
|
163
|
+
// あるため引き続き提供。
|
|
164
|
+
server.tool(generate_pdf_async_js_1.generatePdfAsyncTool.name, generate_pdf_async_js_1.generatePdfAsyncTool.description, singlePdfSchema, (0, index_js_4.withTelemetry)(telemetry, generate_pdf_async_js_1.generatePdfAsyncTool.name, async (input) => (0, generate_pdf_async_js_1.handleGeneratePdfAsync)(input)));
|
|
165
|
+
}
|
|
166
|
+
// generate_pdfs_async (両モード共通: 複数 PDF を非同期生成。
|
|
167
|
+
// 単数 sync では捌けない bulk 用途のため HTTP モードでも残す)
|
|
168
|
+
server.tool(generate_pdfs_async_js_1.generatePdfsAsyncTool.name, generate_pdfs_async_js_1.generatePdfsAsyncTool.description, multiplePdfSchema, (0, index_js_4.withTelemetry)(telemetry, generate_pdfs_async_js_1.generatePdfsAsyncTool.name, async (input) => (0, generate_pdfs_async_js_1.handleGeneratePdfsAsync)(input)));
|
|
121
169
|
// suggest_params (Sampling-backed)
|
|
122
170
|
server.tool(suggest_params_js_1.suggestParamsTool.name, suggest_params_js_1.suggestParamsTool.description, {
|
|
123
171
|
designId: designIdSchema,
|
|
@@ -127,11 +175,20 @@ const startServer = async () => {
|
|
|
127
175
|
description: zod_1.z
|
|
128
176
|
.string()
|
|
129
177
|
.describe('帳票の内容を自然文で記述(例: "請求書、宛先A社、合計1万円")'),
|
|
130
|
-
}, async (input) => (0, suggest_params_js_1.handleSuggestParams)(server, input));
|
|
178
|
+
}, (0, index_js_4.withTelemetry)(telemetry, suggest_params_js_1.suggestParamsTool.name, async (input) => (0, suggest_params_js_1.handleSuggestParams)(server, input)));
|
|
131
179
|
// Prompts (recipe cards) & Resources (read-only data) — 各 register 関数が
|
|
132
180
|
// 内部で server.prompt() / server.resource() を呼んで capability を自動登録します。
|
|
133
181
|
(0, index_js_1.registerPrompts)(server);
|
|
134
182
|
(0, index_js_2.registerResources)(server, pkg);
|
|
183
|
+
return server;
|
|
184
|
+
};
|
|
185
|
+
exports.createMcpServer = createMcpServer;
|
|
186
|
+
/**
|
|
187
|
+
* stdio エントリ用の従来 API。createMcpServer() で生成したインスタンスを
|
|
188
|
+
* StdioServerTransport に connect する。HTTP モードはこの関数を使わない。
|
|
189
|
+
*/
|
|
190
|
+
const startServer = async () => {
|
|
191
|
+
const server = (0, exports.createMcpServer)();
|
|
135
192
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
136
193
|
await server.connect(transport);
|
|
137
194
|
};
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;AAAA,oEAAoE;AACpE,wEAAiF;AACjF,6BAAwB;AACxB,+EAG0C;AAC1C,iEAGmC;AACnC,uEAGsC;AACtC,yEAGuC;AACvC,yEAGuC;AACvC,2EAGwC;AACxC,+DAAgF;AAChF,6DAA6E;AAC7E,6DAA+E;AAC/E,iEAGmC;AACnC,iDAAqD;AACrD,mDAAyD;AACzD,+CAA2D;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const TELEMETRY_SECRET_HEADER = "X-Telemetry-Secret";
|
|
2
|
+
export declare const TELEMETRY_DEFAULT_TIMEOUT_MS = 2000;
|
|
3
|
+
export type TelemetryPropertyValue = string | number | boolean | null | ReadonlyArray<string | number | boolean | null>;
|
|
4
|
+
export type TelemetryProperties = Record<string, TelemetryPropertyValue>;
|
|
5
|
+
export interface TelemetryEvent {
|
|
6
|
+
event: string;
|
|
7
|
+
userId?: string;
|
|
8
|
+
workspaceId?: string;
|
|
9
|
+
properties?: TelemetryProperties;
|
|
10
|
+
timestamp?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface TelemetryClientOptions {
|
|
13
|
+
endpointUrl: string;
|
|
14
|
+
sharedSecret?: string;
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
logger?: Pick<Console, 'warn'>;
|
|
17
|
+
}
|
|
18
|
+
export interface TelemetryClient {
|
|
19
|
+
track(event: TelemetryEvent): void;
|
|
20
|
+
/** Resolves once any spawned background sends settle (test-only). */
|
|
21
|
+
flush(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export declare const createTelemetryClient: (options: Partial<TelemetryClientOptions>) => TelemetryClient;
|
|
24
|
+
/**
|
|
25
|
+
* Build a client from environment variables. Returns a no-op client when
|
|
26
|
+
* `TELEMETRY_ENDPOINT_URL` is unset so MCP usage is never impacted by
|
|
27
|
+
* misconfiguration.
|
|
28
|
+
*/
|
|
29
|
+
export declare const telemetryClientFromEnv: () => TelemetryClient;
|
|
30
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/telemetry/client.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB,uBAAuB,CAAC;AAC5D,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,MAAM,MAAM,sBAAsB,GAC9B,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,aAAa,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAEpD,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IACnC,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAkED,eAAO,MAAM,qBAAqB,GAChC,SAAS,OAAO,CAAC,sBAAsB,CAAC,KACvC,eAMF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAO,eAItC,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Fire-and-forget HTTP client for the Report Flow event telemetry collector.
|
|
3
|
+
//
|
|
4
|
+
// Schema spec: developer-docs/docs/internals/event-telemetry-schema.md (PRJ-3-375).
|
|
5
|
+
// TODO(PRJ-3-379): replace the locally-defined types with imports from
|
|
6
|
+
// @monepla/report-flow-core/telemetry once that subpath is published.
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.telemetryClientFromEnv = exports.createTelemetryClient = exports.TELEMETRY_DEFAULT_TIMEOUT_MS = exports.TELEMETRY_SECRET_HEADER = void 0;
|
|
9
|
+
exports.TELEMETRY_SECRET_HEADER = 'X-Telemetry-Secret';
|
|
10
|
+
exports.TELEMETRY_DEFAULT_TIMEOUT_MS = 2000;
|
|
11
|
+
class NoopTelemetryClient {
|
|
12
|
+
track() { }
|
|
13
|
+
async flush() { }
|
|
14
|
+
}
|
|
15
|
+
class HttpTelemetryClient {
|
|
16
|
+
endpoint;
|
|
17
|
+
secret;
|
|
18
|
+
timeoutMs;
|
|
19
|
+
logger;
|
|
20
|
+
inflight = new Set();
|
|
21
|
+
constructor(opts) {
|
|
22
|
+
this.endpoint = opts.endpointUrl;
|
|
23
|
+
this.secret = opts.sharedSecret;
|
|
24
|
+
this.timeoutMs = opts.timeoutMs ?? exports.TELEMETRY_DEFAULT_TIMEOUT_MS;
|
|
25
|
+
this.logger = opts.logger ?? console;
|
|
26
|
+
}
|
|
27
|
+
track(event) {
|
|
28
|
+
const send = this.send(event);
|
|
29
|
+
this.inflight.add(send);
|
|
30
|
+
void send.finally(() => this.inflight.delete(send));
|
|
31
|
+
}
|
|
32
|
+
async flush() {
|
|
33
|
+
await Promise.allSettled(Array.from(this.inflight));
|
|
34
|
+
}
|
|
35
|
+
async send(event) {
|
|
36
|
+
const headers = {
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
};
|
|
39
|
+
if (this.secret)
|
|
40
|
+
headers[exports.TELEMETRY_SECRET_HEADER] = this.secret;
|
|
41
|
+
const controller = new AbortController();
|
|
42
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
43
|
+
try {
|
|
44
|
+
const res = await fetch(this.endpoint, {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
headers,
|
|
47
|
+
body: JSON.stringify(event),
|
|
48
|
+
signal: controller.signal,
|
|
49
|
+
});
|
|
50
|
+
if (!res.ok) {
|
|
51
|
+
this.logger.warn(`[telemetry] non-success response: status=${res.status} event=${event.event}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
// Captures synchronous throws from fetch (e.g., bad URL, fetch
|
|
56
|
+
// undefined in non-fetch environments) and async rejections in one
|
|
57
|
+
// place so the caller never sees a top-level Promise rejection.
|
|
58
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
59
|
+
this.logger.warn(`[telemetry] send failed: ${message} event=${event.event}`);
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
clearTimeout(timer);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const createTelemetryClient = (options) => {
|
|
67
|
+
const endpoint = options.endpointUrl?.trim();
|
|
68
|
+
if (!endpoint)
|
|
69
|
+
return new NoopTelemetryClient();
|
|
70
|
+
// Spread `options` first so the trimmed `endpointUrl` wins; an untrimmed
|
|
71
|
+
// copy in `options.endpointUrl` would otherwise clobber it.
|
|
72
|
+
return new HttpTelemetryClient({ ...options, endpointUrl: endpoint });
|
|
73
|
+
};
|
|
74
|
+
exports.createTelemetryClient = createTelemetryClient;
|
|
75
|
+
/**
|
|
76
|
+
* Build a client from environment variables. Returns a no-op client when
|
|
77
|
+
* `TELEMETRY_ENDPOINT_URL` is unset so MCP usage is never impacted by
|
|
78
|
+
* misconfiguration.
|
|
79
|
+
*/
|
|
80
|
+
const telemetryClientFromEnv = () => (0, exports.createTelemetryClient)({
|
|
81
|
+
endpointUrl: process.env.TELEMETRY_ENDPOINT_URL,
|
|
82
|
+
sharedSecret: process.env.TELEMETRY_SHARED_SECRET,
|
|
83
|
+
});
|
|
84
|
+
exports.telemetryClientFromEnv = telemetryClientFromEnv;
|
|
85
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/telemetry/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { TELEMETRY_SECRET_HEADER, TELEMETRY_DEFAULT_TIMEOUT_MS, createTelemetryClient, telemetryClientFromEnv, } from './client.js';
|
|
2
|
+
export type { TelemetryClient, TelemetryClientOptions, TelemetryEvent, TelemetryProperties, TelemetryPropertyValue, } from './client.js';
|
|
3
|
+
export { withTelemetry } from './interceptor.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withTelemetry = exports.telemetryClientFromEnv = exports.createTelemetryClient = exports.TELEMETRY_DEFAULT_TIMEOUT_MS = exports.TELEMETRY_SECRET_HEADER = void 0;
|
|
4
|
+
var client_js_1 = require("./client.js");
|
|
5
|
+
Object.defineProperty(exports, "TELEMETRY_SECRET_HEADER", { enumerable: true, get: function () { return client_js_1.TELEMETRY_SECRET_HEADER; } });
|
|
6
|
+
Object.defineProperty(exports, "TELEMETRY_DEFAULT_TIMEOUT_MS", { enumerable: true, get: function () { return client_js_1.TELEMETRY_DEFAULT_TIMEOUT_MS; } });
|
|
7
|
+
Object.defineProperty(exports, "createTelemetryClient", { enumerable: true, get: function () { return client_js_1.createTelemetryClient; } });
|
|
8
|
+
Object.defineProperty(exports, "telemetryClientFromEnv", { enumerable: true, get: function () { return client_js_1.telemetryClientFromEnv; } });
|
|
9
|
+
var interceptor_js_1 = require("./interceptor.js");
|
|
10
|
+
Object.defineProperty(exports, "withTelemetry", { enumerable: true, get: function () { return interceptor_js_1.withTelemetry; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":";;;AAAA,yCAKqB;AAJnB,oHAAA,uBAAuB,OAAA;AACvB,yHAAA,4BAA4B,OAAA;AAC5B,kHAAA,qBAAqB,OAAA;AACrB,mHAAA,sBAAsB,OAAA;AASxB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TelemetryClient } from './client.js';
|
|
2
|
+
type ToolHandler<I, R> = (input: I) => Promise<R>;
|
|
3
|
+
type ToolResultLike = {
|
|
4
|
+
isError?: boolean;
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
};
|
|
7
|
+
export declare const withTelemetry: <I, R extends ToolResultLike>(client: TelemetryClient, toolName: string, handler: ToolHandler<I, R>) => ToolHandler<I, R>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=interceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../../src/telemetry/interceptor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAElD,KAAK,cAAc,GAAG;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AA0BF,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,SAAS,cAAc,EACvD,QAAQ,eAAe,EACvB,UAAU,MAAM,EAChB,SAAS,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KACzB,WAAW,CAAC,CAAC,EAAE,CAAC,CAsClB,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Wraps MCP tool handlers with fire-and-forget telemetry.
|
|
3
|
+
//
|
|
4
|
+
// Emits `integration.mcp.invoked` with { tool, durationMs, success, errorClass? }
|
|
5
|
+
// after every tool call (success or failure). Never mutates the handler return
|
|
6
|
+
// value, so existing callers see identical behavior.
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.withTelemetry = void 0;
|
|
9
|
+
// None of today's tool schemas declare `workspaceId` (the workspace is
|
|
10
|
+
// implicit in the OAuth token / keychain entry), so this helper currently
|
|
11
|
+
// returns `undefined` for every production call. Kept defensively so a
|
|
12
|
+
// future tool that exposes `workspaceId` to the model surfaces it
|
|
13
|
+
// automatically — and so the field can be re-pointed at the OAuth /
|
|
14
|
+
// keychain auth context once that is threaded into createMcpServer
|
|
15
|
+
// (Codex P2 on PR #38).
|
|
16
|
+
const extractWorkspaceId = (input) => {
|
|
17
|
+
if (!input || typeof input !== 'object')
|
|
18
|
+
return undefined;
|
|
19
|
+
const value = input.workspaceId;
|
|
20
|
+
return typeof value === 'string' ? value : undefined;
|
|
21
|
+
};
|
|
22
|
+
const inferErrorClass = (result, error) => {
|
|
23
|
+
if (error instanceof Error)
|
|
24
|
+
return error.name || 'Error';
|
|
25
|
+
if (typeof error === 'string')
|
|
26
|
+
return 'Error';
|
|
27
|
+
const r = result;
|
|
28
|
+
if (r?.isError)
|
|
29
|
+
return 'ToolError';
|
|
30
|
+
return undefined;
|
|
31
|
+
};
|
|
32
|
+
const withTelemetry = (client, toolName, handler) => {
|
|
33
|
+
return async (input) => {
|
|
34
|
+
const startedAt = Date.now();
|
|
35
|
+
const workspaceId = extractWorkspaceId(input);
|
|
36
|
+
try {
|
|
37
|
+
const result = await handler(input);
|
|
38
|
+
client.track({
|
|
39
|
+
event: 'integration.mcp.invoked',
|
|
40
|
+
workspaceId,
|
|
41
|
+
// Stamp client-side ingest time so events from clock-skewed clients
|
|
42
|
+
// remain orderable in Analytics Engine (matches schema §6).
|
|
43
|
+
timestamp: Date.now(),
|
|
44
|
+
properties: {
|
|
45
|
+
tool: toolName,
|
|
46
|
+
durationMs: Date.now() - startedAt,
|
|
47
|
+
success: !result.isError,
|
|
48
|
+
...(result.isError
|
|
49
|
+
? { errorClass: inferErrorClass(result, undefined) ?? 'ToolError' }
|
|
50
|
+
: {}),
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
client.track({
|
|
57
|
+
event: 'integration.mcp.invoked',
|
|
58
|
+
workspaceId,
|
|
59
|
+
timestamp: Date.now(),
|
|
60
|
+
properties: {
|
|
61
|
+
tool: toolName,
|
|
62
|
+
durationMs: Date.now() - startedAt,
|
|
63
|
+
success: false,
|
|
64
|
+
errorClass: inferErrorClass(undefined, err) ?? 'Error',
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
exports.withTelemetry = withTelemetry;
|
|
72
|
+
//# sourceMappingURL=interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../src/telemetry/interceptor.ts"],"names":[],"mappings":";AAAA,0DAA0D;AAC1D,EAAE;AACF,kFAAkF;AAClF,+EAA+E;AAC/E,qDAAqD;;;AAWrD,uEAAuE;AACvE,0EAA0E;AAC1E,uEAAuE;AACvE,kEAAkE;AAClE,oEAAoE;AACpE,mEAAmE;AACnE,wBAAwB;AACxB,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAAsB,EAAE;IAChE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,KAAK,GAAI,KAAiC,CAAC,WAAW,CAAC;IAC7D,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACtB,MAAe,EACf,KAAc,EACM,EAAE;IACtB,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC9C,MAAM,CAAC,GAAG,MAAoC,CAAC;IAC/C,IAAI,CAAC,EAAE,OAAO;QAAE,OAAO,WAAW,CAAC;IACnC,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEK,MAAM,aAAa,GAAG,CAC3B,MAAuB,EACvB,QAAgB,EAChB,OAA0B,EACP,EAAE;IACrB,OAAO,KAAK,EAAE,KAAQ,EAAc,EAAE;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC;gBACX,KAAK,EAAE,yBAAyB;gBAChC,WAAW;gBACX,oEAAoE;gBACpE,4DAA4D;gBAC5D,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAClC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO;oBACxB,GAAG,CAAC,MAAM,CAAC,OAAO;wBAChB,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE;wBACnE,CAAC,CAAC,EAAE,CAAC;iBACR;aACF,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC;gBACX,KAAK,EAAE,yBAAyB;gBAChC,WAAW;gBACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAClC,OAAO,EAAE,KAAK;oBACd,UAAU,EAAE,eAAe,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,OAAO;iBACvD;aACF,CAAC,CAAC;YACH,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AA1CW,QAAA,aAAa,iBA0CxB"}
|
|
@@ -8,21 +8,45 @@ export type GeneratePdfSyncInput = {
|
|
|
8
8
|
version: number;
|
|
9
9
|
content: ContentDto;
|
|
10
10
|
outputDir?: string;
|
|
11
|
+
/**
|
|
12
|
+
* true を指定すると EmbeddedResource (application/pdf, base64 blob) も返却する。
|
|
13
|
+
* デフォルト false。claude.ai が PDF resource を inline 表示するように対応した
|
|
14
|
+
* 段階で true を推奨に変更する想定。
|
|
15
|
+
*/
|
|
16
|
+
includePreview?: boolean;
|
|
11
17
|
};
|
|
12
18
|
export type GeneratePdfSyncDeps = {
|
|
13
19
|
/**
|
|
14
|
-
*
|
|
20
|
+
* stdio: 'stdio' (デフォルト) — ローカルファイル保存 + 戻り値に filePath を含める
|
|
21
|
+
* http : 'http' — ローカル保存をスキップ
|
|
22
|
+
*/
|
|
23
|
+
mode?: 'stdio' | 'http';
|
|
24
|
+
/**
|
|
25
|
+
* outputDir 未指定時のフォールバック (stdio モード専用)。
|
|
15
26
|
* server.ts で Roots を見てデフォルトディレクトリを返すために使う。
|
|
16
|
-
* 未指定の場合は client 側が process.cwd() にフォールバックする。
|
|
17
27
|
*/
|
|
18
28
|
resolveOutputDir?: () => Promise<string | undefined>;
|
|
19
29
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
30
|
+
type TextContent = {
|
|
31
|
+
type: 'text';
|
|
32
|
+
text: string;
|
|
33
|
+
};
|
|
34
|
+
type EmbeddedResource = {
|
|
35
|
+
type: 'resource';
|
|
36
|
+
resource: {
|
|
37
|
+
uri: string;
|
|
38
|
+
mimeType: string;
|
|
39
|
+
blob: string;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Tool 層の戻り値型。`client.ts` の `GeneratePdfSyncResult`
|
|
44
|
+
* ({ data, filePath? }) と区別するため `Tool` を付ける。
|
|
45
|
+
*/
|
|
46
|
+
export type GeneratePdfSyncToolResult = {
|
|
47
|
+
content: Array<TextContent | EmbeddedResource>;
|
|
25
48
|
isError?: true;
|
|
26
49
|
};
|
|
27
|
-
export declare const handleGeneratePdfSync: (input: GeneratePdfSyncInput, deps?: GeneratePdfSyncDeps) => Promise<
|
|
50
|
+
export declare const handleGeneratePdfSync: (input: GeneratePdfSyncInput, deps?: GeneratePdfSyncDeps) => Promise<GeneratePdfSyncToolResult>;
|
|
51
|
+
export {};
|
|
28
52
|
//# sourceMappingURL=generate-pdf-sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-pdf-sync.d.ts","sourceRoot":"","sources":["../../src/tools/generate-pdf-sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate-pdf-sync.d.ts","sourceRoot":"","sources":["../../src/tools/generate-pdf-sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D,eAAO,MAAM,mBAAmB;;;CAI/B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACtD,CAAC;AAEF,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAClD,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,gBAAgB,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AA0CF,eAAO,MAAM,qBAAqB,GAChC,OAAO,oBAAoB,EAC3B,OAAM,mBAAwB,KAC7B,OAAO,CAAC,yBAAyB,CAgEnC,CAAC"}
|