@lmcl/ailo-mcp-sdk 0.0.1 → 0.0.2

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 CHANGED
@@ -10,6 +10,22 @@ npm install @lmcl/ailo-mcp-sdk
10
10
 
11
11
  ---
12
12
 
13
+ ## 日志与 stdout(重要)
14
+
15
+ MCP 使用 stdio 传输,**stdout 只能输出 JSON-RPC 消息**,任何 `console.log`、第三方库日志等都会破坏协议,导致 `invalid character 'i' looking for beginning of value` 等解析错误。
16
+
17
+ **本 SDK 在框架层已做保护**:自动拦截 stdout,仅 JSON-RPC 转发到 stdout,其余重定向到 stderr。你可以自由使用 `console.log`、`console.info`、`console.debug`,以及接入会打日志的第三方库(如飞书 SDK),无需额外处理。
18
+
19
+ **入口顺序**:请将 `import { runMcpChannel } from "@lmcl/ailo-mcp-sdk"` 作为入口文件的**首个 import**,确保保护在 dotenv、平台 SDK 等之前生效。若入口结构复杂,可显式第一行写:
20
+
21
+ ```typescript
22
+ import "@lmcl/ailo-mcp-sdk/stdio-guard";
23
+ import "dotenv/config";
24
+ import { runMcpChannel } from "@lmcl/ailo-mcp-sdk";
25
+ ```
26
+
27
+ ---
28
+
13
29
  ## 场景1:纯工具(AILO → MCP 客户端)
14
30
 
15
31
  AILO 调用你的工具,你返回结果。
@@ -1 +1 @@
1
- {"version":3,"file":"ailo-client.d.ts","sourceRoot":"","sources":["../src/ailo-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AActD;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,KAAK,CAAK;gBAEN,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,SAAK;IAO3E,OAAO,CAAC,OAAO;IAuBf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDxB,OAAO,CAAC,iBAAiB;IAUzB,WAAW,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAapE,8BAA8B;IACxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ5C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,KAAK,IAAI,IAAI;CAUd"}
1
+ {"version":3,"file":"ailo-client.d.ts","sourceRoot":"","sources":["../src/ailo-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AActD;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,KAAK,CAAK;gBAEN,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,SAAK;IAO3E,OAAO,CAAC,OAAO;IAuBf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDxB,OAAO,CAAC,iBAAiB;IAUzB,WAAW,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IASpE,8BAA8B;IACxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ5C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,KAAK,IAAI,IAAI;CAUd"}
@@ -105,16 +105,12 @@ export class AiloClient {
105
105
  }, 3000);
106
106
  }
107
107
  sendMessage(params) {
108
- const payload = {
108
+ return this.request("channel.accept", {
109
109
  chatId: params.chatId,
110
110
  text: params.text,
111
111
  contextTags: params.contextTags,
112
112
  attachments: params.attachments ?? [],
113
- };
114
- if (params.coreForSenseContext != null && params.coreForSenseContext.length > 0) {
115
- payload.coreForSenseContext = params.coreForSenseContext;
116
- }
117
- return this.request("channel.accept", payload);
113
+ });
118
114
  }
119
115
  /** 简单 KV,数据存 AILO 本体,自动持久化 */
120
116
  async getData(key) {
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iGAAiG;IACjG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,OAAO,EAAE,aAAa,CAAC;IACvB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC;IAClC,iCAAiC;IACjC,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CASjD;AAiBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAwI5D"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,YAAY,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iGAAiG;IACjG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,OAAO,EAAE,aAAa,CAAC;IACvB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAC;IAClC,iCAAiC;IACjC,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CASjD;AAiBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAmI5D"}
package/dist/bootstrap.js CHANGED
@@ -10,7 +10,7 @@ export function defaultBuildChannelPrompt() {
10
10
  * stdout 被 MCP stdio 占用,日志自动重定向到 stderr。
11
11
  */
12
12
  export function runMcp(mcpServer) {
13
- console.log = (...args) => console.error(...args);
13
+ // stdio-guard 需在入口 import,runMcp 使用者应 import 自 @lmcl/ailo-mcp-sdk
14
14
  const transport = new StdioServerTransport();
15
15
  mcpServer.connect(transport).then(() => {
16
16
  console.log("[mcp] MCP stdio server started");
@@ -23,7 +23,7 @@ export function runMcp(mcpServer) {
23
23
  * 启动 MCP 通道
24
24
  *
25
25
  * 通用流程:
26
- * 1. 重定向 console.log stderr(stdout 被 MCP stdio 占用)
26
+ * 1. stdio-guard 已在 index 入口加载,console.log 等自动重定向到 stderr
27
27
  * 2. 启动 MCP stdio server(暴露出站工具)
28
28
  * 3. 建立反向 WebSocket 连接(connect 时传入 channel + prompt,一步完成注册)
29
29
  * 4. 接线入站:handler.setOnMessage → 组装 contextTags → channel.accept
@@ -42,9 +42,7 @@ export function runMcpChannel(config) {
42
42
  console.error("Missing AIDO_WS_URL/AILO_WS_URL, AIDO_TOKEN/AILO_TOKEN or AIDO_MCP_NAME/AILO_MCP_NAME. Channel must be started by Ailo MCP.");
43
43
  process.exit(1);
44
44
  }
45
- // stdout MCP stdio 占用,日志全部走 stderr
46
- const _origLog = console.log;
47
- console.log = (...args) => console.error(...args);
45
+ // stdio-guard 已在 index 入口加载,console.log 等已重定向到 stderr
48
46
  const tag = `[${channelName}]`;
49
47
  const channelPrompt = config.buildChannelPrompt
50
48
  ? config.buildChannelPrompt()
@@ -62,16 +60,16 @@ export function runMcpChannel(config) {
62
60
  const isPrivate = msg.isPrivate ?? false;
63
61
  const groupLabel = !isPrivate &&
64
62
  (msg.chatName || (msg.chatId ? `群${msg.chatId.slice(-8)}` : ""));
65
- const contextTags = [
66
- { key: "chat_type", desc: "类型", value: msg.chatType },
67
- { key: "chat_id", desc: "会话", value: msg.chatId },
63
+ const tags = [
64
+ { desc: "类型", value: msg.chatType, core: true },
65
+ { desc: "会话", value: msg.chatId, core: true },
68
66
  ];
69
67
  if (groupLabel) {
70
- contextTags.push({ key: "chat_name", desc: "群名", value: groupLabel });
68
+ tags.push({ desc: "群名", value: groupLabel, core: true });
71
69
  }
72
- contextTags.push({ key: "sender_name", desc: "昵称", value: msg.senderName ?? "" }, { key: "sender_id", desc: "用户ID", value: msg.senderId ?? "" });
70
+ tags.push({ desc: "昵称", value: msg.senderName ?? "", core: isPrivate }, { desc: "用户", value: msg.senderId ?? "", core: isPrivate });
73
71
  if (msg.mentionsSelf) {
74
- contextTags.push({ key: "mentions_self", desc: "提及自己", value: "true" });
72
+ tags.push({ desc: "@我", value: "", core: isPrivate });
75
73
  }
76
74
  if (msg.timestamp != null) {
77
75
  let tsMs;
@@ -84,23 +82,17 @@ export function runMcpChannel(config) {
84
82
  if (!isNaN(tsMs) && tsMs > 0) {
85
83
  const d = new Date(tsMs);
86
84
  const pad = (n) => String(n).padStart(2, "0");
87
- const formatted = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
88
- contextTags.push({ key: "sent_at", desc: "发送时间", value: formatted });
85
+ tags.push({
86
+ desc: "时间",
87
+ value: `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`,
88
+ core: false,
89
+ });
89
90
  }
90
91
  }
91
- const coreForSenseContext = [];
92
- coreForSenseContext.push(true, true);
93
- if (groupLabel) {
94
- coreForSenseContext.push(true);
95
- }
96
- for (let i = coreForSenseContext.length; i < contextTags.length; i++) {
97
- coreForSenseContext.push(isPrivate);
98
- }
99
92
  await client.sendMessage({
100
93
  chatId: msg.chatId,
101
94
  text: msg.text ?? "",
102
- contextTags,
103
- coreForSenseContext,
95
+ contextTags: tags,
104
96
  attachments: msg.attachments ?? [],
105
97
  });
106
98
  }
@@ -131,7 +123,11 @@ export function runMcpChannel(config) {
131
123
  console.error(`${tag} reverse WebSocket connect failed:`, err);
132
124
  process.exit(1);
133
125
  }
134
- // 3. 启动平台 Handler
126
+ // 3. 注入持久化存储
127
+ if (handler.setDataProvider) {
128
+ handler.setDataProvider(client);
129
+ }
130
+ // 4. 启动平台 Handler
135
131
  console.log(`${tag} starting handler...`);
136
132
  const startResult = handler.start();
137
133
  if (startResult && typeof startResult.then === "function") {
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import "./stdio-guard.js";
1
2
  export { AiloClient } from "./ailo-client.js";
2
3
  export { runMcp, runMcpChannel, defaultBuildChannelPrompt } from "./bootstrap.js";
3
4
  export type { McpChannelConfig } from "./bootstrap.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAClF,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,UAAU,GACX,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAClF,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,UAAU,GACX,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
+ import "./stdio-guard.js"; // 必须最先:stdout 被 MCP stdio 占用,框架层统一拦截非 JSON-RPC 输出
1
2
  export { AiloClient } from "./ailo-client.js";
2
3
  export { runMcp, runMcpChannel, defaultBuildChannelPrompt } from "./bootstrap.js";
@@ -0,0 +1,17 @@
1
+ /**
2
+ * MCP stdio 保护层
3
+ *
4
+ * MCP 协议规定:stdout 只能输出 JSON-RPC 消息,任何其他输出都会导致客户端解析失败(如 invalid character 'i')。
5
+ * 本模块在框架层统一拦截 process.stdout.write,仅将以 `{` 开头的行(JSON-RPC)转发到真实 stdout,
6
+ * 其余全部转发到 stderr。
7
+ *
8
+ * 通道开发者可以自由使用 console.log、console.info、console.debug,以及第三方库的日志,
9
+ * 框架会自动重定向,无需担心污染 MCP 协议。
10
+ *
11
+ * 使用方式:入口文件将 `import { runMcpChannel } from "@lmcl/ailo-mcp-sdk"` 作为首个 import,
12
+ * 确保本保护在 dotenv、平台 SDK 等可能写 stdout 的模块之前生效。
13
+ *
14
+ * 若入口结构复杂,可显式:`import "@lmcl/ailo-mcp-sdk/stdio-guard"` 作为第一行。
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=stdio-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-guard.d.ts","sourceRoot":"","sources":["../src/stdio-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * MCP stdio 保护层
3
+ *
4
+ * MCP 协议规定:stdout 只能输出 JSON-RPC 消息,任何其他输出都会导致客户端解析失败(如 invalid character 'i')。
5
+ * 本模块在框架层统一拦截 process.stdout.write,仅将以 `{` 开头的行(JSON-RPC)转发到真实 stdout,
6
+ * 其余全部转发到 stderr。
7
+ *
8
+ * 通道开发者可以自由使用 console.log、console.info、console.debug,以及第三方库的日志,
9
+ * 框架会自动重定向,无需担心污染 MCP 协议。
10
+ *
11
+ * 使用方式:入口文件将 `import { runMcpChannel } from "@lmcl/ailo-mcp-sdk"` 作为首个 import,
12
+ * 确保本保护在 dotenv、平台 SDK 等可能写 stdout 的模块之前生效。
13
+ *
14
+ * 若入口结构复杂,可显式:`import "@lmcl/ailo-mcp-sdk/stdio-guard"` 作为第一行。
15
+ */
16
+ const realStdoutWrite = process.stdout.write.bind(process.stdout);
17
+ let lineBuffer = "";
18
+ const MAX_LINE_BUFFER = 64 * 1024; // 64KB,防止异常情况下无限增长
19
+ function routeLine(line) {
20
+ const trimmed = line.trim();
21
+ if (trimmed.length === 0)
22
+ return "stderr"; // 空行不输出,避免干扰
23
+ return trimmed.startsWith("{") ? "stdout" : "stderr";
24
+ }
25
+ process.stdout.write = function (chunk, encodingOrCallback, callback) {
26
+ const enc = typeof encodingOrCallback === "function" ? undefined : encodingOrCallback;
27
+ const cb = typeof encodingOrCallback === "function" ? encodingOrCallback : callback;
28
+ const str = typeof chunk === "string" ? chunk : chunk.toString();
29
+ lineBuffer += str;
30
+ if (lineBuffer.length > MAX_LINE_BUFFER) {
31
+ lineBuffer = lineBuffer.slice(-MAX_LINE_BUFFER);
32
+ }
33
+ const lines = lineBuffer.split(/\r?\n/);
34
+ lineBuffer = lines.pop() ?? "";
35
+ const toStdout = [];
36
+ const toStderr = [];
37
+ for (const line of lines) {
38
+ const dest = routeLine(line);
39
+ const withNewline = line + "\n";
40
+ if (dest === "stdout")
41
+ toStdout.push(withNewline);
42
+ else
43
+ toStderr.push(withNewline);
44
+ }
45
+ if (toStderr.length > 0) {
46
+ process.stderr.write(toStderr.join(""));
47
+ }
48
+ if (toStdout.length > 0) {
49
+ const wrappedCb = cb ? (err) => cb(err ?? undefined) : undefined;
50
+ return realStdoutWrite(toStdout.join(""), enc, wrappedCb);
51
+ }
52
+ if (cb)
53
+ cb();
54
+ return true;
55
+ };
56
+ process.on("beforeExit", () => {
57
+ if (lineBuffer.length > 0) {
58
+ const dest = routeLine(lineBuffer);
59
+ const out = lineBuffer + "\n";
60
+ if (dest === "stdout")
61
+ realStdoutWrite(out);
62
+ else
63
+ process.stderr.write("[stdio-guard] 未完成行: " + out);
64
+ }
65
+ });
66
+ // 重定向 console 到 stderr,开发者可自由使用
67
+ const toStderr = (...args) => console.error(...args);
68
+ console.log = toStderr;
69
+ console.info = toStderr;
70
+ console.debug = toStderr;
71
+ console.trace = toStderr;
72
+ export {};
package/dist/types.d.ts CHANGED
@@ -49,29 +49,17 @@ export interface BridgeHandler {
49
49
  setDataProvider?(storage: ChannelStorage): void;
50
50
  }
51
51
  /**
52
- * channel.accept 的 contextTags
53
- *
54
- * key: 框架内部路由用(英文标识)
55
- * desc: 给 LLM 看的人类可读标签(中文)
56
- * value: 标签值
52
+ * channel.accept 的 contextTags 项:desc+value+core,全中文。
57
53
  */
58
54
  export type ContextTag = {
59
- key: string;
60
55
  desc: string;
61
56
  value: string;
57
+ core: boolean;
62
58
  };
63
- /**
64
- * channel.accept 的消息参数
65
- *
66
- * coreForSenseContext: 与 contextTags 一一对应,true 表示该标签参与时空场键生成。
67
- * 最左匹配:遇 false 即停。私聊全 true;群聊 chat_type/chat_id/chat_name 为 true,sender_name 起为 false。
68
- * 未传时框架回退 Channel+ChatID。
69
- */
70
59
  export type ChannelAcceptParams = {
71
60
  chatId: string;
72
61
  text: string;
73
62
  contextTags: ContextTag[];
74
- coreForSenseContext?: boolean[];
75
63
  attachments?: Attachment[];
76
64
  };
77
65
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,yDAAyD;AACzD,KAAK,cAAc,GAAG;IACpB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1E,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,IAAI,CAAC;IACd,2CAA2C;IAC3C,eAAe,CAAC,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;CACjD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,yDAAyD;AACzD,KAAK,cAAc,GAAG;IACpB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1E,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,IAAI,CAAC;IACd,2CAA2C;IAC3C,eAAe,CAAC,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "name": "@lmcl/ailo-mcp-sdk",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Ailo MCP SDK - 通道通过 MCP 注册发送消息能力,用于开发感知通道",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
+ "exports": {
8
+ ".": "./dist/index.js",
9
+ "./stdio-guard": "./dist/stdio-guard.js"
10
+ },
7
11
  "types": "dist/index.d.ts",
8
12
  "files": [
9
13
  "dist",