@openclaw/line 2026.7.2-beta.5 → 2026.8.1-beta.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.
Files changed (146) hide show
  1. package/dist/{accounts-CSH5sk8U.js → accounts-BqEVsDoB.js} +24 -88
  2. package/dist/api.js +2 -3
  3. package/dist/{card-command-BEMIm8D8.js → card-command-DALdUSnc.js} +14 -22
  4. package/dist/{channel-CTaWrzfl.js → channel-CAdQJRw7.js} +75 -77
  5. package/dist/channel-plugin-api.js +1 -1
  6. package/dist/channel.runtime-CuKoy9xw.js +4 -0
  7. package/dist/contract-api.js +1 -1
  8. package/dist/{flex-templates-DVy_wog4.js → flex-templates-BBBlNqpV.js} +108 -83
  9. package/dist/index.js +1 -1
  10. package/dist/markdown-to-line-D4I-6lm6.js +499 -0
  11. package/dist/{monitor-DzFU5UPV.js → monitor-QEh_ZqyR.js} +114 -94
  12. package/dist/monitor.runtime-72isajCp.js +2 -0
  13. package/dist/outbound.runtime-CWQMIE7N.js +3 -0
  14. package/dist/{reply-payload-transform-BRM2fRvK.js → reply-payload-transform-BOPGHVPo.js} +4 -3
  15. package/dist/runtime-api.js +9 -7
  16. package/dist/send-CFFr0-rZ.js +366 -0
  17. package/dist/setup-api.js +1 -1
  18. package/dist/{setup-surface-BHQOSD8R.js → setup-surface-W0Dbgu58.js} +51 -68
  19. package/openclaw.plugin.json +7 -0
  20. package/package.json +9 -5
  21. package/dist/channel.runtime-D4Paci2y.js +0 -4
  22. package/dist/markdown-to-line-Dn00k1bq.js +0 -799
  23. package/dist/monitor.runtime-B8xjVqev.js +0 -2
  24. package/dist/outbound.runtime-eHl7NNHu.js +0 -2
  25. package/dist/send-receipt-CY2ey8XH.js +0 -107
  26. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/LICENSE +0 -0
  27. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/README.md +0 -0
  28. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/assert/strict.d.ts +0 -0
  29. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/assert.d.ts +0 -0
  30. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/async_hooks.d.ts +0 -0
  31. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/buffer.buffer.d.ts +0 -0
  32. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/buffer.d.ts +0 -0
  33. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/child_process.d.ts +0 -0
  34. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/cluster.d.ts +0 -0
  35. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/compatibility/iterators.d.ts +0 -0
  36. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/console.d.ts +0 -0
  37. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/constants.d.ts +0 -0
  38. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/crypto.d.ts +0 -0
  39. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/dgram.d.ts +0 -0
  40. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/diagnostics_channel.d.ts +0 -0
  41. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/dns/promises.d.ts +0 -0
  42. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/dns.d.ts +0 -0
  43. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/domain.d.ts +0 -0
  44. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/events.d.ts +0 -0
  45. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/fs/promises.d.ts +0 -0
  46. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/fs.d.ts +0 -0
  47. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/globals.d.ts +0 -0
  48. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/globals.typedarray.d.ts +0 -0
  49. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/http.d.ts +0 -0
  50. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/http2.d.ts +0 -0
  51. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/https.d.ts +0 -0
  52. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/index.d.ts +0 -0
  53. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/inspector.d.ts +0 -0
  54. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/inspector.generated.d.ts +0 -0
  55. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/module.d.ts +0 -0
  56. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/net.d.ts +0 -0
  57. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/os.d.ts +0 -0
  58. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/package.json +0 -0
  59. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/path.d.ts +0 -0
  60. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/perf_hooks.d.ts +0 -0
  61. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/process.d.ts +0 -0
  62. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/punycode.d.ts +0 -0
  63. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/querystring.d.ts +0 -0
  64. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/readline/promises.d.ts +0 -0
  65. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/readline.d.ts +0 -0
  66. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/repl.d.ts +0 -0
  67. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/sea.d.ts +0 -0
  68. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/sqlite.d.ts +0 -0
  69. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/stream/consumers.d.ts +0 -0
  70. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/stream/promises.d.ts +0 -0
  71. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/stream/web.d.ts +0 -0
  72. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/stream.d.ts +0 -0
  73. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/string_decoder.d.ts +0 -0
  74. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/test.d.ts +0 -0
  75. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/timers/promises.d.ts +0 -0
  76. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/timers.d.ts +0 -0
  77. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/tls.d.ts +0 -0
  78. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/trace_events.d.ts +0 -0
  79. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/ts5.6/buffer.buffer.d.ts +0 -0
  80. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/ts5.6/compatibility/float16array.d.ts +0 -0
  81. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/ts5.6/globals.typedarray.d.ts +0 -0
  82. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/ts5.6/index.d.ts +0 -0
  83. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/ts5.7/compatibility/float16array.d.ts +0 -0
  84. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/ts5.7/index.d.ts +0 -0
  85. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/tty.d.ts +0 -0
  86. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/url.d.ts +0 -0
  87. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/util.d.ts +0 -0
  88. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/v8.d.ts +0 -0
  89. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/vm.d.ts +0 -0
  90. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/wasi.d.ts +0 -0
  91. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/web-globals/abortcontroller.d.ts +0 -0
  92. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/web-globals/crypto.d.ts +0 -0
  93. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/web-globals/domexception.d.ts +0 -0
  94. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/web-globals/events.d.ts +0 -0
  95. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/web-globals/fetch.d.ts +0 -0
  96. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/web-globals/navigator.d.ts +0 -0
  97. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/web-globals/storage.d.ts +0 -0
  98. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/web-globals/streams.d.ts +0 -0
  99. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/worker_threads.d.ts +0 -0
  100. /package/node_modules/{@types → @line/bot-sdk/node_modules/@types}/node/zlib.d.ts +0 -0
  101. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/LICENSE +0 -0
  102. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/README.md +0 -0
  103. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/agent.d.ts +0 -0
  104. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/api.d.ts +0 -0
  105. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/balanced-pool.d.ts +0 -0
  106. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/cache-interceptor.d.ts +0 -0
  107. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/cache.d.ts +0 -0
  108. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/client-stats.d.ts +0 -0
  109. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/client.d.ts +0 -0
  110. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/connector.d.ts +0 -0
  111. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/content-type.d.ts +0 -0
  112. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/cookies.d.ts +0 -0
  113. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/diagnostics-channel.d.ts +0 -0
  114. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/dispatcher.d.ts +0 -0
  115. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/env-http-proxy-agent.d.ts +0 -0
  116. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/errors.d.ts +0 -0
  117. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/eventsource.d.ts +0 -0
  118. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/fetch.d.ts +0 -0
  119. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/formdata.d.ts +0 -0
  120. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/global-dispatcher.d.ts +0 -0
  121. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/global-origin.d.ts +0 -0
  122. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/h2c-client.d.ts +0 -0
  123. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/handlers.d.ts +0 -0
  124. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/header.d.ts +0 -0
  125. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/index.d.ts +0 -0
  126. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/interceptors.d.ts +0 -0
  127. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/mock-agent.d.ts +0 -0
  128. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/mock-call-history.d.ts +0 -0
  129. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/mock-client.d.ts +0 -0
  130. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/mock-errors.d.ts +0 -0
  131. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/mock-interceptor.d.ts +0 -0
  132. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/mock-pool.d.ts +0 -0
  133. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/package.json +0 -0
  134. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/patch.d.ts +0 -0
  135. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/pool-stats.d.ts +0 -0
  136. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/pool.d.ts +0 -0
  137. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/proxy-agent.d.ts +0 -0
  138. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/readable.d.ts +0 -0
  139. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/retry-agent.d.ts +0 -0
  140. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/retry-handler.d.ts +0 -0
  141. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/round-robin-pool.d.ts +0 -0
  142. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/snapshot-agent.d.ts +0 -0
  143. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/util.d.ts +0 -0
  144. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/utility.d.ts +0 -0
  145. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/webidl.d.ts +0 -0
  146. /package/node_modules/{undici-types → @line/bot-sdk/node_modules/undici-types}/websocket.d.ts +0 -0
@@ -4,37 +4,19 @@ import { resolveAccountEntry, resolveListedDefaultAccountId } from "openclaw/plu
4
4
  import { tryReadSecretFileSync } from "openclaw/plugin-sdk/secret-file-runtime";
5
5
  //#region extensions/line/src/accounts.ts
6
6
  const { resolveAccountConfig: resolveMergedLineAccountConfig } = createAccountListHelpers("line", { omitKeys: ["defaultAccount"] });
7
- function readCredentialFile(filePath, configPath) {
8
- return tryReadSecretFileSync(filePath, "LINE credential file", { rejectSymlink: true }, { configPath });
9
- }
10
- function resolveToken(params) {
11
- const { accountId, baseConfig, accountConfig } = params;
12
- if (accountConfig?.channelAccessToken?.trim()) return {
13
- value: accountConfig.channelAccessToken.trim(),
14
- source: "config",
15
- status: "available"
16
- };
17
- if (accountConfig?.tokenFile?.trim()) {
18
- const result = readCredentialFile(accountConfig.tokenFile, `channels.line.accounts.${accountId}.tokenFile`);
19
- return result.status === "available" ? {
20
- value: result.value,
21
- source: "file",
22
- status: "available"
23
- } : {
24
- value: "",
25
- source: "file",
26
- status: "configured_unavailable",
27
- diagnostic: result.diagnostic
28
- };
29
- }
30
- if (accountId === DEFAULT_ACCOUNT_ID) {
31
- if (baseConfig?.channelAccessToken?.trim()) return {
32
- value: baseConfig.channelAccessToken.trim(),
7
+ function resolveLineCredential(params) {
8
+ const { accountId, baseConfig, accountConfig, credentialKey, fileKey, envKey } = params;
9
+ const candidates = accountId === DEFAULT_ACCOUNT_ID ? [accountConfig, baseConfig] : [accountConfig];
10
+ for (const [index, config] of candidates.entries()) {
11
+ const credential = config?.[credentialKey]?.trim();
12
+ if (credential) return {
13
+ value: credential,
33
14
  source: "config",
34
15
  status: "available"
35
16
  };
36
- if (baseConfig?.tokenFile?.trim()) {
37
- const result = readCredentialFile(baseConfig.tokenFile, "channels.line.tokenFile");
17
+ const file = config?.[fileKey];
18
+ if (file?.trim()) {
19
+ const result = tryReadSecretFileSync(file, "LINE credential file", { rejectSymlink: true }, { configPath: `channels.line.${index === 0 ? `accounts.${accountId}.` : ""}${fileKey}` });
38
20
  return result.status === "available" ? {
39
21
  value: result.value,
40
22
  source: "file",
@@ -46,65 +28,13 @@ function resolveToken(params) {
46
28
  diagnostic: result.diagnostic
47
29
  };
48
30
  }
49
- const envToken = process.env.LINE_CHANNEL_ACCESS_TOKEN?.trim();
50
- if (envToken) return {
51
- value: envToken,
52
- source: "env",
53
- status: "available"
54
- };
55
31
  }
56
- return {
57
- value: "",
58
- source: "none",
59
- status: "missing"
60
- };
61
- }
62
- function resolveSecret(params) {
63
- const { accountId, baseConfig, accountConfig } = params;
64
- if (accountConfig?.channelSecret?.trim()) return {
65
- value: accountConfig.channelSecret.trim(),
66
- source: "config",
32
+ const envCredential = accountId === DEFAULT_ACCOUNT_ID ? process.env[envKey]?.trim() : void 0;
33
+ if (envCredential) return {
34
+ value: envCredential,
35
+ source: "env",
67
36
  status: "available"
68
37
  };
69
- if (accountConfig?.secretFile?.trim()) {
70
- const result = readCredentialFile(accountConfig.secretFile, `channels.line.accounts.${accountId}.secretFile`);
71
- return result.status === "available" ? {
72
- value: result.value,
73
- source: "file",
74
- status: "available"
75
- } : {
76
- value: "",
77
- source: "file",
78
- status: "configured_unavailable",
79
- diagnostic: result.diagnostic
80
- };
81
- }
82
- if (accountId === DEFAULT_ACCOUNT_ID) {
83
- if (baseConfig?.channelSecret?.trim()) return {
84
- value: baseConfig.channelSecret.trim(),
85
- source: "config",
86
- status: "available"
87
- };
88
- if (baseConfig?.secretFile?.trim()) {
89
- const result = readCredentialFile(baseConfig.secretFile, "channels.line.secretFile");
90
- return result.status === "available" ? {
91
- value: result.value,
92
- source: "file",
93
- status: "available"
94
- } : {
95
- value: "",
96
- source: "file",
97
- status: "configured_unavailable",
98
- diagnostic: result.diagnostic
99
- };
100
- }
101
- const envSecret = process.env.LINE_CHANNEL_SECRET?.trim();
102
- if (envSecret) return {
103
- value: envSecret,
104
- source: "env",
105
- status: "available"
106
- };
107
- }
108
38
  return {
109
39
  value: "",
110
40
  source: "none",
@@ -117,15 +47,21 @@ function resolveLineAccount(params) {
117
47
  const lineConfig = cfg.channels?.line;
118
48
  const accounts = lineConfig?.accounts;
119
49
  const accountConfig = resolveAccountEntry(accounts, accountId);
120
- const token = resolveToken({
50
+ const token = resolveLineCredential({
121
51
  accountId,
122
52
  baseConfig: lineConfig,
123
- accountConfig
53
+ accountConfig,
54
+ credentialKey: "channelAccessToken",
55
+ fileKey: "tokenFile",
56
+ envKey: "LINE_CHANNEL_ACCESS_TOKEN"
124
57
  });
125
- const secret = resolveSecret({
58
+ const secret = resolveLineCredential({
126
59
  accountId,
127
60
  baseConfig: lineConfig,
128
- accountConfig
61
+ accountConfig,
62
+ credentialKey: "channelSecret",
63
+ fileKey: "secretFile",
64
+ envKey: "LINE_CHANNEL_SECRET"
129
65
  });
130
66
  const mergedConfig = resolveMergedLineAccountConfig(cfg, accountId);
131
67
  const baseEnabled = lineConfig?.enabled !== false;
package/dist/api.js CHANGED
@@ -1,11 +1,10 @@
1
- import { n as lineChannelPluginCommon, t as linePlugin } from "./channel-CTaWrzfl.js";
2
- import { n as lineSetupAdapter, r as lineSetupContract, t as lineSetupWizard } from "./setup-surface-BHQOSD8R.js";
1
+ import { n as lineChannelPluginCommon, t as linePlugin } from "./channel-CAdQJRw7.js";
2
+ import { r as lineSetupContract, t as lineSetupWizard } from "./setup-surface-W0Dbgu58.js";
3
3
  //#region extensions/line/src/channel.setup.ts
4
4
  const lineSetupPlugin = {
5
5
  id: "line",
6
6
  ...lineChannelPluginCommon,
7
7
  setupWizard: lineSetupWizard,
8
- setup: lineSetupAdapter,
9
8
  setupContract: lineSetupContract
10
9
  };
11
10
  //#endregion
@@ -1,6 +1,6 @@
1
- import { _ as postbackAction, d as createListCard, l as createImageCard, m as messageAction, o as createReceiptCard, s as createActionCard, u as createInfoCard, v as uriAction } from "./flex-templates-DVy_wog4.js";
1
+ import { c as createImageCard, f as messageAction, g as uriAction, h as postbackAction, l as createInfoCard, o as createReceiptCard, s as createActionCard, u as createListCard } from "./flex-templates-BBBlNqpV.js";
2
+ import { n as createFlexMessage } from "./send-CFFr0-rZ.js";
2
3
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
3
- import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
4
4
  import { expectDefined } from "openclaw/plugin-sdk/expect-runtime";
5
5
  //#region extensions/line/src/card-command.ts
6
6
  const CARD_USAGE = `Usage: /card <type> "title" "body" [options]
@@ -21,6 +21,13 @@ Examples:
21
21
  function buildLineReply(lineData) {
22
22
  return { channelData: { line: lineData } };
23
23
  }
24
+ function buildLineFlexReply(altText, contents) {
25
+ const message = createFlexMessage(altText, contents);
26
+ return buildLineReply({ flexMessage: {
27
+ altText: message.altText,
28
+ contents: message.contents
29
+ } });
30
+ }
24
31
  /**
25
32
  * Parse action string format: "Label|data,Label2|data2"
26
33
  * Data can be a URL (uri action) or plain text (message action) or key=value (postback)
@@ -118,40 +125,28 @@ function registerLineCardCommand(api) {
118
125
  case "info": {
119
126
  const [title = "Info", body = "", footer] = args;
120
127
  const bubble = createInfoCard(title, body, footer);
121
- return buildLineReply({ flexMessage: {
122
- altText: truncateUtf16Safe(`${title}: ${body}`, 400),
123
- contents: bubble
124
- } });
128
+ return buildLineFlexReply(`${title}: ${body}`, bubble);
125
129
  }
126
130
  case "image": {
127
131
  const [title = "Image", caption = ""] = args;
128
132
  const imageUrl = flags.url || flags.image;
129
133
  if (!imageUrl) return { text: "Error: Image card requires --url <image-url>" };
130
134
  const bubble = createImageCard(imageUrl, title, caption);
131
- return buildLineReply({ flexMessage: {
132
- altText: truncateUtf16Safe(`${title}: ${caption}`, 400),
133
- contents: bubble
134
- } });
135
+ return buildLineFlexReply(`${title}: ${caption}`, bubble);
135
136
  }
136
137
  case "action": {
137
138
  const [title = "Actions", body = ""] = args;
138
139
  const actions = parseActions(flags.actions);
139
140
  if (actions.length === 0) return { text: "Error: Action card requires --actions \"Label1|data1,Label2|data2\"" };
140
141
  const bubble = createActionCard(title, body, actions, { imageUrl: flags.url || flags.image });
141
- return buildLineReply({ flexMessage: {
142
- altText: truncateUtf16Safe(`${title}: ${body}`, 400),
143
- contents: bubble
144
- } });
142
+ return buildLineFlexReply(`${title}: ${body}`, bubble);
145
143
  }
146
144
  case "list": {
147
145
  const [title = "List", itemsStr = ""] = args;
148
146
  const items = parseListItems(itemsStr || flags.items || "");
149
147
  if (items.length === 0) return { text: "Error: List card requires items. Usage: /card list \"Title\" \"Item1|Desc1,Item2|Desc2\"" };
150
148
  const bubble = createListCard(title, items);
151
- return buildLineReply({ flexMessage: {
152
- altText: truncateUtf16Safe(`${title}: ${items.map((i) => i.title).join(", ")}`, 400),
153
- contents: bubble
154
- } });
149
+ return buildLineFlexReply(`${title}: ${items.map((item) => item.title).join(", ")}`, bubble);
155
150
  }
156
151
  case "receipt": {
157
152
  const [title = "Receipt", itemsStr = ""] = args;
@@ -168,10 +163,7 @@ function registerLineCardCommand(api) {
168
163
  total,
169
164
  footer
170
165
  });
171
- return buildLineReply({ flexMessage: {
172
- altText: truncateUtf16Safe(`${title}: ${items.map((i) => `${i.name} ${i.value}`).join(", ")}`, 400),
173
- contents: bubble
174
- } });
166
+ return buildLineFlexReply(`${title}: ${items.map((item) => `${item.name} ${item.value}`).join(", ")}`, bubble);
175
167
  }
176
168
  case "confirm": {
177
169
  const [question = "Confirm?"] = args;
@@ -1,8 +1,8 @@
1
- import { i as resolveLineAccount, r as resolveDefaultLineAccountId, t as listLineAccountIds } from "./accounts-CSH5sk8U.js";
2
- import { i as hasLineCredentials, n as lineSetupAdapter, r as lineSetupContract, t as lineSetupWizard } from "./setup-surface-BHQOSD8R.js";
1
+ import { i as resolveLineAccount, r as resolveDefaultLineAccountId, t as listLineAccountIds } from "./accounts-BqEVsDoB.js";
2
+ import { i as hasLineCredentials, r as lineSetupContract, t as lineSetupWizard } from "./setup-surface-W0Dbgu58.js";
3
3
  import { i as resolveExactLineGroupConfigKey, n as getLineRuntime, t as buildLineQuickReplyFallbackText } from "./quick-reply-fallback-D86FwAfr.js";
4
- import { n as parseLineDirectives, r as LineChannelConfigSchema, t as hasLineDirectives } from "./reply-payload-transform-BRM2fRvK.js";
5
- import { i as resolveLineOutboundMedia, n as buildLineMediaMessage, r as hasLineSpecificMediaOptions, t as createLineSendReceipt } from "./send-receipt-CY2ey8XH.js";
4
+ import { n as parseLineDirectives, r as LineChannelConfigSchema, t as hasLineDirectives } from "./reply-payload-transform-BOPGHVPo.js";
5
+ import { _ as createLineSendReceipt, b as resolveLineOutboundMedia, v as buildLineMediaMessage, y as hasLineSpecificMediaOptions } from "./flex-templates-BBBlNqpV.js";
6
6
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
7
7
  import { buildDmGroupAccountAllowlistAdapter, createFlatAllowlistOverrideResolver } from "openclaw/plugin-sdk/allowlist-config-edit";
8
8
  import { buildChannelOutboundSessionRoute, createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core";
@@ -14,11 +14,11 @@ import { DEFAULT_ACCOUNT_ID as DEFAULT_ACCOUNT_ID$1 } from "openclaw/plugin-sdk/
14
14
  import { createScopedChannelConfigAdapter } from "openclaw/plugin-sdk/channel-config-helpers";
15
15
  import { normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
16
16
  import { clearAccountEntryFields } from "openclaw/plugin-sdk/core";
17
- import { defineChannelMessageAdapter } from "openclaw/plugin-sdk/channel-outbound";
17
+ import { createAccountStatusSink, defineChannelMessageAdapter, listMessageReceiptPlatformIds } from "openclaw/plugin-sdk/channel-outbound";
18
+ import { createChannelPartialDeliveryError } from "openclaw/plugin-sdk/channel-inbound";
18
19
  import { createAttachedChannelResultAdapter, createEmptyChannelResult } from "openclaw/plugin-sdk/channel-send-result";
19
20
  import { resolveOutboundMediaUrls } from "openclaw/plugin-sdk/reply-payload";
20
21
  import { sanitizeAssistantVisibleText } from "openclaw/plugin-sdk/text-chunking";
21
- import { truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
22
22
  import { buildTokenChannelStatusSummary, createComputedAccountStatusAdapter, createDefaultChannelRuntimeState, createDependentCredentialStatusIssueCollector } from "openclaw/plugin-sdk/status-helpers";
23
23
  //#region extensions/line/src/bindings.ts
24
24
  function normalizeLineConversationId(raw) {
@@ -71,9 +71,11 @@ const lineConfigAdapter = createScopedChannelConfigAdapter({
71
71
  }),
72
72
  defaultAccountId: resolveDefaultLineAccountId,
73
73
  clearBaseFields: [
74
+ "channelAccessToken",
74
75
  "channelSecret",
75
76
  "tokenFile",
76
- "secretFile"
77
+ "secretFile",
78
+ "name"
77
79
  ],
78
80
  resolveAllowFrom: (account) => account.config.allowFrom,
79
81
  formatAllowFrom: (allowFrom) => normalizeStringEntries(allowFrom).map(normalizeLineAllowFrom)
@@ -118,14 +120,19 @@ const lineChannelPluginCommon = {
118
120
  //#endregion
119
121
  //#region extensions/line/src/gateway.ts
120
122
  const loadLineProbeRuntime$1 = createLazyRuntimeModule(() => import("./probe.runtime-D13ZtXsd.js"));
121
- const loadLineMonitorRuntime = createLazyRuntimeModule(() => import("./monitor.runtime-B8xjVqev.js"));
123
+ const loadLineMonitorRuntime = createLazyRuntimeModule(() => import("./monitor.runtime-72isajCp.js"));
122
124
  const lineGatewayAdapter = {
123
125
  startAccount: async (ctx) => {
124
126
  const account = ctx.account;
127
+ const statusSink = createAccountStatusSink({
128
+ accountId: account.accountId,
129
+ setStatus: ctx.setStatus
130
+ });
125
131
  const token = account.channelAccessToken.trim();
126
132
  const secret = account.channelSecret.trim();
127
133
  if (!token) throw new Error(`LINE webhook mode requires a non-empty channel access token for account "${account.accountId}".`);
128
134
  if (!secret) throw new Error(`LINE webhook mode requires a non-empty channel secret for account "${account.accountId}".`);
135
+ statusSink({ lifecycle: "starting" });
129
136
  let lineBotLabel = "";
130
137
  try {
131
138
  const probe = await (await loadLineProbeRuntime$1()).probeLineBot(token, 2500);
@@ -141,8 +148,10 @@ const lineGatewayAdapter = {
141
148
  accountId: account.accountId,
142
149
  config: ctx.cfg,
143
150
  runtime: ctx.runtime,
151
+ buildContext: ctx.channelRuntime?.inbound.buildContext,
144
152
  abortSignal: ctx.abortSignal,
145
- webhookPath: account.config.webhookPath
153
+ webhookPath: account.config.webhookPath,
154
+ statusSink
146
155
  });
147
156
  },
148
157
  logoutAccount: async ({ accountId, cfg }) => {
@@ -233,8 +242,7 @@ function inferLineTargetChatType(target) {
233
242
  }
234
243
  //#endregion
235
244
  //#region extensions/line/src/outbound.ts
236
- const loadLineOutboundRuntime = createLazyRuntimeModule(() => import("./outbound.runtime-eHl7NNHu.js"));
237
- const LINE_FLEX_ALT_TEXT_LIMIT = 1500;
245
+ const loadLineOutboundRuntime = createLazyRuntimeModule(() => import("./outbound.runtime-CWQMIE7N.js"));
238
246
  const lineOutboundAdapter = {
239
247
  deliveryMode: "direct",
240
248
  chunker: (text, limit) => getLineRuntime().channel.text.chunkMarkdownText(text, limit),
@@ -245,6 +253,9 @@ const lineOutboundAdapter = {
245
253
  const outboundRuntime = await loadLineOutboundRuntime();
246
254
  const lineData = payload.channelData?.line ?? {};
247
255
  const lineRuntime = runtime.channel.line;
256
+ const location = lineData.location;
257
+ const locationMessage = location ? outboundRuntime.createLocationMessage(location) : null;
258
+ const validLocation = locationMessage ? location : void 0;
248
259
  const sendText = lineRuntime?.pushMessageLine ?? outboundRuntime.pushMessageLine;
249
260
  const sendBatch = lineRuntime?.pushMessagesLine ?? outboundRuntime.pushMessagesLine;
250
261
  const sendFlex = lineRuntime?.pushFlexMessage ?? outboundRuntime.pushFlexMessage;
@@ -256,7 +267,15 @@ const lineOutboundAdapter = {
256
267
  const recordResult = async (resultPromise) => {
257
268
  const result = await resultPromise;
258
269
  lastResult = result;
259
- await onDeliveryResult?.(createEmptyChannelResult("line", { ...result }));
270
+ try {
271
+ await onDeliveryResult?.(createEmptyChannelResult("line", { ...result }));
272
+ } catch (error) {
273
+ throw createChannelPartialDeliveryError(error, {
274
+ messageIds: listMessageReceiptPlatformIds(result.receipt),
275
+ receipt: result.receipt,
276
+ visibleReplySent: true
277
+ });
278
+ }
260
279
  return result;
261
280
  };
262
281
  const quickReplies = lineData.quickReplies ?? [];
@@ -278,7 +297,11 @@ const lineOutboundAdapter = {
278
297
  flexMessages: []
279
298
  };
280
299
  const chunkLimit = runtime.channel.text.resolveTextChunkLimit?.(cfg, "line", accountId ?? void 0, { fallbackLimit: 5e3 }) ?? 5e3;
281
- const chunks = processed.text ? runtime.channel.text.chunkMarkdownText(processed.text, chunkLimit) : [];
300
+ const orderedMessages = processed.segments?.flatMap((segment) => segment.type === "flex" ? [segment.message] : runtime.channel.text.chunkMarkdownText(segment.text, chunkLimit).map((text) => ({
301
+ type: "text",
302
+ text
303
+ })));
304
+ const chunks = orderedMessages ? orderedMessages.flatMap((message) => message.type === "text" ? [message.text] : []) : processed.text ? runtime.channel.text.chunkMarkdownText(processed.text, chunkLimit) : [];
282
305
  const mediaUrls = resolveOutboundMediaUrls(payload);
283
306
  const useLineSpecificMedia = hasLineSpecificMediaOptions(lineData);
284
307
  const mediaOptions = {
@@ -331,23 +354,42 @@ const lineOutboundAdapter = {
331
354
  accountId: accountId ?? void 0
332
355
  }));
333
356
  }
334
- if (lineData.location) await recordResult(sendLocation(to, lineData.location, {
357
+ if (validLocation) await recordResult(sendLocation(to, validLocation, {
358
+ verbose: false,
359
+ cfg,
360
+ accountId: accountId ?? void 0
361
+ }));
362
+ if (!orderedMessages) for (const flexMsg of processed.flexMessages) await recordResult(sendFlex(to, flexMsg.altText, flexMsg.contents, {
335
363
  verbose: false,
336
364
  cfg,
337
365
  accountId: accountId ?? void 0
338
366
  }));
339
- for (const flexMsg of processed.flexMessages) {
340
- const flexContents = flexMsg.contents;
341
- await recordResult(sendFlex(to, flexMsg.altText, flexContents, {
342
- verbose: false,
343
- cfg,
344
- accountId: accountId ?? void 0
345
- }));
346
- }
347
367
  }
348
368
  const sendMediaAfterText = !(hasQuickReplies && chunks.length > 0);
349
369
  if (mediaUrls.length > 0 && !shouldSendQuickRepliesInline && !sendMediaAfterText) await sendMediaMessages();
350
- if (chunks.length > 0) for (const [i, chunk] of chunks.entries()) if (i === chunks.length - 1 && hasQuickReplies) await recordResult(sendQuickReplies(to, chunk, quickReplies, {
370
+ if (orderedMessages) for (const [index, message] of orderedMessages.entries()) {
371
+ const isLast = index === orderedMessages.length - 1;
372
+ if (message.type === "flex") if (isLast && quickReply) await sendMessageBatch([{
373
+ ...message,
374
+ quickReply
375
+ }]);
376
+ else await recordResult(sendFlex(to, message.altText, message.contents, {
377
+ verbose: false,
378
+ cfg,
379
+ accountId: accountId ?? void 0
380
+ }));
381
+ else if (isLast && hasQuickReplies) await recordResult(sendQuickReplies(to, message.text, quickReplies, {
382
+ verbose: false,
383
+ cfg,
384
+ accountId: accountId ?? void 0
385
+ }));
386
+ else await recordResult(sendText(to, message.text, {
387
+ verbose: false,
388
+ cfg,
389
+ accountId: accountId ?? void 0
390
+ }));
391
+ }
392
+ else if (chunks.length > 0) for (const [i, chunk] of chunks.entries()) if (i === chunks.length - 1 && hasQuickReplies) await recordResult(sendQuickReplies(to, chunk, quickReplies, {
351
393
  verbose: false,
352
394
  cfg,
353
395
  accountId: accountId ?? void 0
@@ -359,27 +401,13 @@ const lineOutboundAdapter = {
359
401
  }));
360
402
  else if (shouldSendQuickRepliesInline) {
361
403
  const quickReplyMessages = [];
362
- if (lineData.flexMessage) quickReplyMessages.push({
363
- type: "flex",
364
- altText: truncateUtf16Safe(lineData.flexMessage.altText, LINE_FLEX_ALT_TEXT_LIMIT),
365
- contents: lineData.flexMessage.contents
366
- });
404
+ if (lineData.flexMessage) quickReplyMessages.push(outboundRuntime.createFlexMessage(lineData.flexMessage.altText, lineData.flexMessage.contents));
367
405
  if (lineData.templateMessage) {
368
406
  const template = buildTemplate(lineData.templateMessage);
369
407
  if (template) quickReplyMessages.push(template);
370
408
  }
371
- if (lineData.location) quickReplyMessages.push({
372
- type: "location",
373
- title: truncateUtf16Safe(lineData.location.title, 100),
374
- address: truncateUtf16Safe(lineData.location.address, 100),
375
- latitude: lineData.location.latitude,
376
- longitude: lineData.location.longitude
377
- });
378
- for (const flexMsg of processed.flexMessages) quickReplyMessages.push({
379
- type: "flex",
380
- altText: truncateUtf16Safe(flexMsg.altText, LINE_FLEX_ALT_TEXT_LIMIT),
381
- contents: flexMsg.contents
382
- });
409
+ if (locationMessage) quickReplyMessages.push(locationMessage);
410
+ for (const flexMsg of processed.flexMessages) quickReplyMessages.push(outboundRuntime.createFlexMessage(flexMsg.altText, flexMsg.contents));
383
411
  for (const url of mediaUrls) {
384
412
  const trimmed = url?.trim();
385
413
  if (!trimmed) continue;
@@ -400,44 +428,15 @@ const lineOutboundAdapter = {
400
428
  }
401
429
  if (mediaUrls.length > 0 && !shouldSendQuickRepliesInline && sendMediaAfterText) await sendMediaMessages();
402
430
  const completedResult = lastResult;
403
- if (completedResult) return createEmptyChannelResult("line", { ...completedResult });
404
- return createEmptyChannelResult("line", {
405
- messageId: "empty",
406
- chatId: to
407
- });
431
+ if (!completedResult) throw new Error("Message must be non-empty for LINE sends");
432
+ return createEmptyChannelResult("line", { ...completedResult });
408
433
  },
409
434
  ...createAttachedChannelResultAdapter({
410
435
  channel: "line",
411
- sendText: async ({ cfg, to, text, accountId }) => {
412
- const outboundRuntime = await loadLineOutboundRuntime();
413
- const sendText = outboundRuntime.pushMessageLine;
414
- const sendFlex = outboundRuntime.pushFlexMessage;
415
- const processed = outboundRuntime.processLineMessage(text);
416
- let result;
417
- if (processed.text.trim()) result = await sendText(to, processed.text, {
418
- verbose: false,
419
- cfg,
420
- accountId: accountId ?? void 0
421
- });
422
- else result = {
423
- messageId: "processed",
424
- chatId: to,
425
- receipt: createLineSendReceipt({
426
- messageId: "processed",
427
- chatId: to,
428
- kind: "card"
429
- })
430
- };
431
- for (const flexMsg of processed.flexMessages) {
432
- const flexContents = flexMsg.contents;
433
- await sendFlex(to, flexMsg.altText, flexContents, {
434
- verbose: false,
435
- cfg,
436
- accountId: accountId ?? void 0
437
- });
438
- }
439
- return result;
440
- },
436
+ sendText: async (ctx) => await lineOutboundAdapter.sendPayload({
437
+ ...ctx,
438
+ payload: { text: ctx.text }
439
+ }),
441
440
  sendMedia: async ({ cfg, to, text, mediaUrl, accountId }) => await (await loadLineOutboundRuntime()).sendMessageLine(to, text, {
442
441
  verbose: false,
443
442
  mediaUrl,
@@ -531,7 +530,7 @@ const lineStatusAdapter = createComputedAccountStatusAdapter({
531
530
  });
532
531
  //#endregion
533
532
  //#region extensions/line/src/channel.ts
534
- const loadLineChannelRuntime = createLazyRuntimeModule(() => import("./channel.runtime-D4Paci2y.js"));
533
+ const loadLineChannelRuntime = createLazyRuntimeModule(() => import("./channel.runtime-CuKoy9xw.js"));
535
534
  const lineSecurityAdapter = createRestrictSendersChannelSecurity({
536
535
  channelKey: "line",
537
536
  resolveDmPolicy: (account) => account.config.dmPolicy,
@@ -612,7 +611,6 @@ const linePlugin = createChatChannelPlugin({
612
611
  }
613
612
  },
614
613
  directory: createEmptyChannelDirectoryAdapter(),
615
- setup: lineSetupAdapter,
616
614
  setupContract: lineSetupContract,
617
615
  status: lineStatusAdapter,
618
616
  gateway: lineGatewayAdapter,
@@ -1,2 +1,2 @@
1
- import { t as linePlugin } from "./channel-CTaWrzfl.js";
1
+ import { t as linePlugin } from "./channel-CAdQJRw7.js";
2
2
  export { linePlugin };
@@ -0,0 +1,4 @@
1
+ import { t as monitorLineProvider } from "./monitor-QEh_ZqyR.js";
2
+ import { t as probeLineBot } from "./probe-CM03wo6r.js";
3
+ import { p as pushMessageLine } from "./send-CFFr0-rZ.js";
4
+ export { monitorLineProvider, probeLineBot, pushMessageLine };
@@ -1,2 +1,2 @@
1
- import { i as resolveLineAccount, r as resolveDefaultLineAccountId, t as listLineAccountIds } from "./accounts-CSH5sk8U.js";
1
+ import { i as resolveLineAccount, r as resolveDefaultLineAccountId, t as listLineAccountIds } from "./accounts-BqEVsDoB.js";
2
2
  export { listLineAccountIds, resolveDefaultLineAccountId, resolveLineAccount };