@zhin.js/adapter-line 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +42 -21
  3. package/adapters/line.ts +26 -0
  4. package/agent/tools/get_group_members.ts +2 -2
  5. package/agent/tools/get_profile.ts +2 -2
  6. package/lib/endpoint.d.ts +46 -0
  7. package/lib/endpoint.js +144 -0
  8. package/lib/index.d.ts +4 -0
  9. package/lib/index.js +4 -0
  10. package/lib/line-agent-deps.d.ts +24 -0
  11. package/lib/line-agent-deps.js +33 -0
  12. package/lib/protocol.d.ts +151 -0
  13. package/lib/protocol.js +212 -0
  14. package/lib/webhook.d.ts +13 -0
  15. package/lib/webhook.js +50 -0
  16. package/package.json +42 -25
  17. package/plugin.ts +8 -0
  18. package/schema.json +22 -0
  19. package/src/endpoint.ts +148 -554
  20. package/src/index.ts +50 -41
  21. package/src/line-agent-deps.ts +32 -23
  22. package/src/protocol.ts +384 -0
  23. package/src/webhook.ts +79 -0
  24. package/lib/agent/tools/get_group_members.js +0 -24
  25. package/lib/agent/tools/get_group_members.js.map +0 -1
  26. package/lib/agent/tools/get_profile.js +0 -24
  27. package/lib/agent/tools/get_profile.js.map +0 -1
  28. package/lib/src/adapter.js +0 -22
  29. package/lib/src/adapter.js.map +0 -1
  30. package/lib/src/endpoint.js +0 -536
  31. package/lib/src/endpoint.js.map +0 -1
  32. package/lib/src/index.js +0 -30
  33. package/lib/src/index.js.map +0 -1
  34. package/lib/src/line-agent-deps.js +0 -26
  35. package/lib/src/line-agent-deps.js.map +0 -1
  36. package/lib/src/segment-mapper.js +0 -2
  37. package/lib/src/segment-mapper.js.map +0 -1
  38. package/lib/src/types.js +0 -5
  39. package/lib/src/types.js.map +0 -1
  40. package/plugin.yml +0 -3
  41. package/src/adapter.ts +0 -29
  42. package/src/segment-mapper.ts +0 -1
  43. package/src/types.ts +0 -130
@@ -1,22 +0,0 @@
1
- /**
2
- * LINE 适配器
3
- */
4
- import { Adapter, OUTBOUND_RICH_SEGMENT_POLICY_IM_FULL } from 'zhin.js';
5
- import { LineEndpoint } from "./endpoint.js";
6
- export class LineAdapter extends Adapter {
7
- static capabilities = ['inbound', 'outbound'];
8
- static outboundRichSegmentPolicy = OUTBOUND_RICH_SEGMENT_POLICY_IM_FULL;
9
- static interactivePolicy = 'text';
10
- #router;
11
- constructor(plugin, router) {
12
- super(plugin, "line", []);
13
- this.#router = router;
14
- }
15
- createEndpoint(config) {
16
- return new LineEndpoint(this, this.#router, config);
17
- }
18
- async start() {
19
- await super.start();
20
- }
21
- }
22
- //# sourceMappingURL=adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EACN,oCAAoC,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,MAAM,OAAO,WAAY,SAAQ,OAAqB;IACpD,MAAM,CAAmB,YAAY,GAAG,CAAC,SAAS,EAAE,UAAU,CAAU,CAAC;IACzE,MAAM,CAAU,yBAAyB,GAAG,oCAAoC,CAAC;IACjF,MAAM,CAAU,iBAAiB,GAAG,MAAe,CAAC;IAEpD,OAAO,CAAS;IAEhB,YAAY,MAAc,EAAE,MAAc;QACxC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,cAAc,CAAC,MAA0B;QACvC,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC"}
@@ -1,536 +0,0 @@
1
- /**
2
- * LINE Endpoint 实现
3
- *
4
- * 使用 Webhook 模式接收消息,通过 LINE Messaging API 发送消息。
5
- * HMAC-SHA256 签名验证确保请求来自 LINE 平台。
6
- */
7
- import { createHmac, timingSafeEqual } from "node:crypto";
8
- import { Message, segment, formatCompact, expandInteractiveSegmentsInContent, } from 'zhin.js';
9
- import { registerFetchRoute } from "@zhin.js/host-router/router";
10
- import { fromCanonicalSegments, toCanonicalSegments } from './segment-mapper.js';
11
- /** Type guard: narrows a LineEvent to a message event */
12
- function isMessageEvent(e) {
13
- return e.type === "message" && "message" in e && e.message != null;
14
- }
15
- /** Type guard: narrows a LineEvent to a postback event */
16
- function isPostbackEvent(e) {
17
- return e.type === "postback" && "postback" in e;
18
- }
19
- export class LineEndpoint {
20
- adapter;
21
- router;
22
- $config;
23
- $connected = false;
24
- get pluginLogger() {
25
- return this.adapter.plugin.logger;
26
- }
27
- get $id() {
28
- return this.$config.name;
29
- }
30
- constructor(adapter, router, $config) {
31
- this.adapter = adapter;
32
- this.router = router;
33
- this.$config = $config;
34
- }
35
- async $connect() {
36
- try {
37
- const path = this.$config.webhookPath || "/line/webhook";
38
- const cleanPath = path.startsWith("/") ? path : `/${path}`;
39
- registerFetchRoute(this.router, "POST", cleanPath, async (ctx) => {
40
- await this.handleWebhook(ctx);
41
- });
42
- this.$connected = true;
43
- this.pluginLogger.info(formatCompact({ op: "webhook", path: cleanPath }));
44
- }
45
- catch (error) {
46
- this.pluginLogger.error("Failed to connect LINE endpoint:", error);
47
- this.$connected = false;
48
- throw error;
49
- }
50
- }
51
- async $disconnect() {
52
- try {
53
- this.$connected = false;
54
- this.replyTokenCache.clear();
55
- this.pluginLogger.info(`LINE endpoint ${this.$config.name} disconnected`);
56
- }
57
- catch (error) {
58
- this.pluginLogger.error("Error disconnecting LINE endpoint:", error);
59
- // L02: Log and swallow instead of re-throwing
60
- }
61
- }
62
- // ── Webhook 处理 ────────────────────────────────────────────────────
63
- async handleWebhook(ctx) {
64
- try {
65
- // 1. 签名验证
66
- const signature = ctx.get("x-line-signature");
67
- if (!signature) {
68
- ctx.status = 403;
69
- ctx.body = { message: "Missing signature" };
70
- return;
71
- }
72
- // L05: 获取原始请求体用于签名验证
73
- // Koa ctx.req 是 Node.js IncomingMessage,koa-body 可能已经消费了流
74
- // 因此优先使用已解析的 body 并序列化,记录警告说明可能不精确
75
- let rawBody;
76
- if (typeof ctx.request.body === "string") {
77
- rawBody = ctx.request.body;
78
- }
79
- else {
80
- rawBody = JSON.stringify(ctx.request.body);
81
- this.pluginLogger.debug("Signature verification using JSON.stringify(body) — may differ from original raw body");
82
- }
83
- if (!this.verifySignature(rawBody, signature)) {
84
- this.pluginLogger.warn(formatCompact({ op: "webhook", ok: false, error: "invalid signature" }));
85
- ctx.status = 403;
86
- ctx.body = { message: "Invalid signature" };
87
- return;
88
- }
89
- // 2. 解析事件
90
- const body = typeof ctx.request.body === "string"
91
- ? JSON.parse(ctx.request.body)
92
- : ctx.request.body;
93
- if (!body.events || !Array.isArray(body.events)) {
94
- ctx.status = 200;
95
- ctx.body = { message: "OK" };
96
- return;
97
- }
98
- // 3. 处理每个事件
99
- for (const event of body.events) {
100
- await this.handleEvent(event);
101
- }
102
- ctx.status = 200;
103
- ctx.body = { message: "OK" };
104
- }
105
- catch (error) {
106
- this.pluginLogger.error("LINE webhook error:", error);
107
- ctx.status = 200;
108
- ctx.body = { message: "OK" };
109
- }
110
- }
111
- // L07: Use timing-safe comparison for signature
112
- verifySignature(body, signature) {
113
- const channelSecret = this.$config.channelSecret;
114
- const hmac = createHmac("sha256", channelSecret);
115
- hmac.update(body, "utf-8");
116
- const computedSignature = hmac.digest("base64");
117
- const sigBuf = Buffer.from(signature);
118
- const computedBuf = Buffer.from(computedSignature);
119
- if (sigBuf.length !== computedBuf.length)
120
- return false;
121
- return timingSafeEqual(sigBuf, computedBuf);
122
- }
123
- // L04: Use type guards instead of "in" checks + `as any` casts
124
- async handleEvent(event) {
125
- switch (event.type) {
126
- case "message":
127
- if (isMessageEvent(event)) {
128
- await this.handleMessageEvent(event);
129
- }
130
- break;
131
- case "follow":
132
- await this.handleFollowEvent(event);
133
- break;
134
- case "unfollow":
135
- this.pluginLogger.debug(formatCompact({
136
- op: "unfollow",
137
- endpoint: this.$config.name,
138
- userId: event.source.userId,
139
- }));
140
- break;
141
- case "join":
142
- await this.handleJoinEvent(event);
143
- break;
144
- case "leave":
145
- this.pluginLogger.debug(formatCompact({
146
- op: "leave",
147
- endpoint: this.$config.name,
148
- sourceType: event.source.type,
149
- groupId: event.source.groupId,
150
- roomId: event.source.roomId,
151
- }));
152
- break;
153
- case "postback":
154
- if (isPostbackEvent(event)) {
155
- this.pluginLogger.debug(formatCompact({
156
- op: "postback",
157
- endpoint: this.$config.name,
158
- data: event.postback.data,
159
- }));
160
- }
161
- break;
162
- default:
163
- this.pluginLogger.debug(formatCompact({
164
- op: "unknown_event",
165
- endpoint: this.$config.name,
166
- type: event.type,
167
- }));
168
- }
169
- }
170
- // L01: Cache replyToken from webhook events before emitting
171
- async handleMessageEvent(event) {
172
- const { channelId } = this.resolveChannel(event.source);
173
- this.cacheReplyToken(channelId, event.replyToken);
174
- const message = this.$formatMessage(event);
175
- this.adapter.emit("message.receive", message);
176
- this.pluginLogger.debug(formatCompact({
177
- op: "recv",
178
- endpoint: this.$config.name,
179
- channel: message.$channel.type,
180
- id: message.$channel.id,
181
- len: segment.raw(message.$content).length,
182
- }));
183
- }
184
- async handleFollowEvent(event) {
185
- const { channelId } = this.resolveChannel(event.source);
186
- this.cacheReplyToken(channelId, event.replyToken);
187
- const message = this.$formatMessage(event);
188
- this.adapter.emit("message.receive", message);
189
- this.pluginLogger.debug(formatCompact({
190
- op: "follow",
191
- endpoint: this.$config.name,
192
- userId: event.source.userId,
193
- }));
194
- }
195
- async handleJoinEvent(event) {
196
- const { channelId } = this.resolveChannel(event.source);
197
- this.cacheReplyToken(channelId, event.replyToken);
198
- const message = this.$formatMessage(event);
199
- this.adapter.emit("message.receive", message);
200
- this.pluginLogger.debug(formatCompact({
201
- op: "join",
202
- endpoint: this.$config.name,
203
- sourceType: event.source.type,
204
- groupId: event.source.groupId,
205
- roomId: event.source.roomId,
206
- }));
207
- }
208
- // ── 消息格式化 ────────────────────────────────────────────────────
209
- $formatMessage(event) {
210
- const { channelType, channelId } = this.resolveChannel(event.source);
211
- const wire = this.parseMessageContent(event);
212
- const quoteId = Message.quoteIdFromContent(wire);
213
- Message.alignReplySegments(wire, quoteId);
214
- const content = toCanonicalSegments(wire);
215
- const userId = event.source.userId || "";
216
- const timestamp = event.timestamp || Date.now();
217
- const rawText = this.extractRawText(event);
218
- return Message.from(event, {
219
- $id: this.generateMessageId(event),
220
- $adapter: "line",
221
- $endpoint: this.$config.name,
222
- $sender: {
223
- id: userId,
224
- name: userId,
225
- },
226
- $channel: {
227
- id: channelId,
228
- type: channelType,
229
- },
230
- $content: content,
231
- $quote_id: quoteId,
232
- $raw: rawText,
233
- $timestamp: timestamp,
234
- $recall: async () => {
235
- // LINE 不支持消息撤回
236
- this.pluginLogger.warn("LINE does not support message recall");
237
- },
238
- $reply: async (content, quote) => {
239
- if (!Array.isArray(content))
240
- content = [content];
241
- if (quote) {
242
- const replyToMessageId = typeof quote === "boolean"
243
- ? (isMessageEvent(event) && event.message?.id) || ""
244
- : quote;
245
- content.unshift({ type: "reply", data: { id: replyToMessageId } });
246
- }
247
- return await this.adapter.sendMessage({
248
- context: "line",
249
- endpoint: this.$config.name,
250
- id: channelId,
251
- type: channelType,
252
- content: content,
253
- });
254
- },
255
- });
256
- }
257
- generateMessageId(event) {
258
- if (isMessageEvent(event) && event.message?.id) {
259
- return event.message.id;
260
- }
261
- return `${event.type}-${event.timestamp}`;
262
- }
263
- resolveChannel(source) {
264
- switch (source.type) {
265
- case "user":
266
- return { channelType: "private", channelId: source.userId || "" };
267
- case "group":
268
- return { channelType: "group", channelId: source.groupId || "" };
269
- case "room":
270
- return { channelType: "channel", channelId: source.roomId || "" };
271
- default:
272
- return { channelType: "private", channelId: "" };
273
- }
274
- }
275
- extractRawText(event) {
276
- if (isMessageEvent(event)) {
277
- const msg = event.message;
278
- if (msg.type === "text" && msg.text)
279
- return msg.text;
280
- if (msg.type === "location" && msg.address)
281
- return msg.address;
282
- return `[${msg.type}]`;
283
- }
284
- if (event.type === "follow")
285
- return "[follow]";
286
- if (event.type === "join")
287
- return "[join]";
288
- return "";
289
- }
290
- parseMessageContent(event) {
291
- const segments = [];
292
- if (isMessageEvent(event)) {
293
- const msg = event.message;
294
- switch (msg.type) {
295
- case "text":
296
- if (msg.text) {
297
- segments.push({ type: "text", data: { text: msg.text } });
298
- }
299
- break;
300
- case "image":
301
- segments.push({
302
- type: "image",
303
- data: {
304
- message_id: msg.id,
305
- platform: "line",
306
- },
307
- });
308
- break;
309
- case "video":
310
- segments.push({
311
- type: "video",
312
- data: {
313
- message_id: msg.id,
314
- platform: "line",
315
- },
316
- });
317
- break;
318
- case "audio":
319
- segments.push({
320
- type: "audio",
321
- data: {
322
- message_id: msg.id,
323
- duration: msg.duration || 0,
324
- platform: "line",
325
- },
326
- });
327
- break;
328
- case "file":
329
- segments.push({
330
- type: "file",
331
- data: {
332
- message_id: msg.id,
333
- file_name: msg.fileName,
334
- file_size: msg.fileSize,
335
- platform: "line",
336
- },
337
- });
338
- break;
339
- case "location":
340
- segments.push({
341
- type: "location",
342
- data: {
343
- title: msg.title,
344
- address: msg.address,
345
- latitude: msg.latitude,
346
- longitude: msg.longitude,
347
- },
348
- });
349
- break;
350
- case "sticker":
351
- segments.push({
352
- type: "sticker",
353
- data: {
354
- package_id: msg.packageId,
355
- sticker_id: msg.stickerId,
356
- resource_type: msg.stickerResourceType,
357
- },
358
- });
359
- break;
360
- default:
361
- segments.push({ type: "text", data: { text: `[unsupported message type]` } });
362
- }
363
- }
364
- else {
365
- // 系统事件(follow/unfollow/join/leave)
366
- const text = event.type === "follow" ? "[follow event]"
367
- : event.type === "join" ? "[join event]"
368
- : event.type === "unfollow" ? "[unfollow event]"
369
- : event.type === "leave" ? "[leave event]"
370
- : `[${event.type} event]`;
371
- segments.push({ type: "text", data: { text } });
372
- }
373
- return segments.length > 0 ? segments : [{ type: "text", data: { text: "" } }];
374
- }
375
- // ── 发送消息 ──────────────────────────────────────────────────────
376
- async $sendMessage(options) {
377
- try {
378
- const canonical = expandInteractiveSegmentsInContent(options.content);
379
- const wire = fromCanonicalSegments(canonical);
380
- const messages = this.buildLineMessages(wire);
381
- if (messages.length === 0) {
382
- throw new Error("No valid LINE messages to send");
383
- }
384
- // 优先使用 Reply API(如果存在 replyToken)
385
- const replyToken = this.replyTokenCache.get(options.id);
386
- if (replyToken) {
387
- this.replyTokenCache.delete(options.id);
388
- return await this.replyMessage(replyToken, messages);
389
- }
390
- // L06: Validate Push API `to` field
391
- if (!/^[UGR]/.test(options.id)) {
392
- throw new Error(`Invalid LINE recipient ID "${options.id}": must start with U (user), G (group), or R (room)`);
393
- }
394
- // 使用 Push API
395
- return await this.pushMessage(options.id, messages);
396
- }
397
- catch (error) {
398
- this.pluginLogger.error("Failed to send LINE message:", error);
399
- throw error;
400
- }
401
- }
402
- replyTokenCache = new Map();
403
- /**
404
- * 缓存 replyToken,用于后续发送回复消息
405
- */
406
- cacheReplyToken(channelId, replyToken) {
407
- this.replyTokenCache.set(channelId, replyToken);
408
- }
409
- // L15: Parse Reply API response for message ID
410
- async replyMessage(replyToken, messages) {
411
- const baseUrl = this.$config.apiBaseUrl || "https://api.line.me";
412
- const request = { replyToken, messages };
413
- const response = await fetch(`${baseUrl}/v2/bot/message/reply`, {
414
- method: "POST",
415
- headers: {
416
- "Content-Type": "application/json",
417
- "Authorization": `Bearer ${this.$config.channelAccessToken}`,
418
- },
419
- body: JSON.stringify(request),
420
- });
421
- if (!response.ok) {
422
- const errorText = await response.text();
423
- throw new Error(`LINE Reply API error ${response.status}: ${errorText}`);
424
- }
425
- // Reply API now returns sentMessages in the response body
426
- const result = await response.json();
427
- return result.sentMessages?.[0]?.id || `reply-${Date.now()}`;
428
- }
429
- async pushMessage(to, messages) {
430
- const baseUrl = this.$config.apiBaseUrl || "https://api.line.me";
431
- const request = { to, messages };
432
- const response = await fetch(`${baseUrl}/v2/bot/message/push`, {
433
- method: "POST",
434
- headers: {
435
- "Content-Type": "application/json",
436
- "Authorization": `Bearer ${this.$config.channelAccessToken}`,
437
- },
438
- body: JSON.stringify(request),
439
- });
440
- if (!response.ok) {
441
- const errorText = await response.text();
442
- throw new Error(`LINE Push API error ${response.status}: ${errorText}`);
443
- }
444
- const result = await response.json();
445
- return result.sentMessages?.[0]?.id || `push-${Date.now()}`;
446
- }
447
- buildLineMessages(content) {
448
- if (!Array.isArray(content))
449
- content = [content];
450
- const messages = [];
451
- for (const item of content) {
452
- if (typeof item === "string") {
453
- messages.push(this.buildTextMessage(item));
454
- continue;
455
- }
456
- const seg = item;
457
- switch (seg.type) {
458
- case "text":
459
- messages.push(this.buildTextMessage(seg.data.text || ""));
460
- break;
461
- case "at":
462
- // LINE 没有 @ 语法,转为文本
463
- if (seg.data.id) {
464
- messages.push(this.buildTextMessage(`@${seg.data.name || seg.data.id}`));
465
- }
466
- break;
467
- case "image":
468
- if (seg.data.url) {
469
- messages.push({
470
- type: "image",
471
- originalContentUrl: seg.data.url,
472
- previewImageUrl: seg.data.url,
473
- });
474
- }
475
- break;
476
- case "video":
477
- if (seg.data.url) {
478
- messages.push({
479
- type: "video",
480
- originalContentUrl: seg.data.url,
481
- previewImageUrl: seg.data.previewUrl || seg.data.url,
482
- });
483
- }
484
- break;
485
- case "audio":
486
- if (seg.data.url) {
487
- messages.push({
488
- type: "audio",
489
- originalContentUrl: seg.data.url,
490
- duration: seg.data.duration || 0,
491
- });
492
- }
493
- break;
494
- case "location":
495
- messages.push({
496
- type: "location",
497
- title: seg.data.title || "Location",
498
- address: seg.data.address || "",
499
- latitude: seg.data.latitude || 0,
500
- longitude: seg.data.longitude || 0,
501
- });
502
- break;
503
- case "sticker":
504
- messages.push({
505
- type: "sticker",
506
- packageId: seg.data.package_id || "1",
507
- stickerId: seg.data.sticker_id || "1",
508
- });
509
- break;
510
- default:
511
- messages.push(this.buildTextMessage(`[${seg.type}]`));
512
- }
513
- }
514
- // L14: Log warning when messages are sliced to 5 (LINE limit)
515
- if (messages.length > 5) {
516
- this.pluginLogger.warn(`LINE messages truncated from ${messages.length} to 5 (platform limit)`);
517
- }
518
- // LINE 单次最多发送 5 条消息
519
- return messages.slice(0, 5);
520
- }
521
- buildTextMessage(text) {
522
- // L13: Log warning on text truncation
523
- if (text.length > 5000) {
524
- this.pluginLogger.warn(`LINE text message truncated from ${text.length} to 5000 characters`);
525
- }
526
- // LINE 消息文本限制 5000 字符
527
- const truncated = text.length > 5000 ? text.slice(0, 4997) + "..." : text;
528
- return { type: "text", text: truncated };
529
- }
530
- // ── 消息撤回 ──────────────────────────────────────────────────────
531
- // L16: Log warning and return gracefully (matching WeCom/DingTalk pattern)
532
- async $recallMessage(_id) {
533
- this.pluginLogger.warn(formatCompact({ op: "recall", ok: false, error: "LINE Messaging API does not support message recall" }));
534
- }
535
- }
536
- //# sourceMappingURL=endpoint.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../src/endpoint.ts"],"names":[],"mappings":"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"}
package/lib/src/index.js DELETED
@@ -1,30 +0,0 @@
1
- /**
2
- * LINE Messaging API 适配器入口:类型扩展、导出、注册
3
- */
4
- import { usePlugin } from 'zhin.js';
5
- import { LineAdapter } from './adapter.js';
6
- import { setLineAgentDeps } from './line-agent-deps.js';
7
- export * from './types.js';
8
- export { LineEndpoint } from './endpoint.js';
9
- export { LineAdapter } from './adapter.js';
10
- const plugin = usePlugin();
11
- const { provide, useContext } = plugin;
12
- useContext('router', (router) => {
13
- provide({
14
- name: 'line',
15
- description: 'LINE Messaging API Endpoint Adapter',
16
- mounted: async (p) => {
17
- const adapter = new LineAdapter(p, router);
18
- await adapter.start();
19
- return adapter;
20
- },
21
- dispose: async (adapter) => {
22
- await adapter.stop();
23
- },
24
- });
25
- });
26
- useContext('tool', 'line', (_toolService, lineAdapter) => {
27
- setLineAgentDeps({ getAdapter: () => lineAdapter });
28
- return () => { };
29
- });
30
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAe,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAaxD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;AAEvC,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAW,EAAE,EAAE;IACnC,OAAO,CAAC;QACN,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,qCAAqC;QAClD,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;YAC3B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;YACtC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,WAAwB,EAAE,EAAE;IACpE,gBAAgB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,26 +0,0 @@
1
- let _deps = null;
2
- export function setLineAgentDeps(deps) {
3
- _deps = deps;
4
- }
5
- export function getLineAgentDeps() {
6
- if (!_deps)
7
- throw new Error('line agent deps not initialized');
8
- return _deps;
9
- }
10
- export function getAdapter() {
11
- return getLineAgentDeps().getAdapter();
12
- }
13
- export function getDefaultEndpoint() {
14
- return getAdapter().endpoints.values().next().value;
15
- }
16
- export function getLineApiConfig() {
17
- const endpoint = getDefaultEndpoint();
18
- const accessToken = endpoint?.$config?.channelAccessToken;
19
- if (!accessToken)
20
- throw new Error('LINE channel access token not configured');
21
- return {
22
- accessToken,
23
- apiBaseUrl: endpoint?.$config?.apiBaseUrl || 'https://api.line.me',
24
- };
25
- }
26
- //# sourceMappingURL=line-agent-deps.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"line-agent-deps.js","sourceRoot":"","sources":["../../src/line-agent-deps.ts"],"names":[],"mappings":"AAUA,IAAI,KAAK,GAAyB,IAAI,CAAC;AAEvC,MAAM,UAAU,gBAAgB,CAAC,IAAmB;IAClD,KAAK,GAAG,IAAI,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,gBAAgB,EAAE,CAAC,UAAU,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,UAAU,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,QAAQ,EAAE,OAAO,EAAE,kBAAkB,CAAC;IAC1D,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9E,OAAO;QACL,WAAW;QACX,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,IAAI,qBAAqB;KACnE,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- export { toCanonicalSegments, fromCanonicalSegments } from 'zhin.js';
2
- //# sourceMappingURL=segment-mapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"segment-mapper.js","sourceRoot":"","sources":["../../src/segment-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC"}