@openclaw/line 2026.10.5-beta.4 → 2026.10.10-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.
@@ -1,4 +1,4 @@
1
- import { l as lineChannelPluginCommon } from "./channel-DVuSrT_i.mjs";
1
+ import { l as lineChannelPluginCommon } from "./channel-CybGPFDZ.mjs";
2
2
  import { r as lineSetupContract, t as lineSetupWizard } from "./setup-surface-CYd8oqzt.mjs";
3
3
  //#region extensions/line/src/channel.setup.ts
4
4
  const lineSetupPlugin = {
@@ -0,0 +1,3 @@
1
+ import { t as linePlugin } from "./channel-CybGPFDZ.mjs";
2
+ import { t as lineSetupPlugin } from "./api-CO1TnHKG.mjs";
3
+ export { linePlugin, lineSetupPlugin };
@@ -17,7 +17,7 @@ import { requireChannelOpenAllowFrom } from "openclaw/plugin-sdk/extension-share
17
17
  import { z } from "zod";
18
18
  import { parseAccessGroupAllowFromEntry } from "openclaw/plugin-sdk/access-groups";
19
19
  import { firstDefined } from "openclaw/plugin-sdk/allow-from";
20
- import { createAccountStatusSink, createMessageReceiptFromOutboundResults, defineChannelMessageAdapter, listMessageReceiptPlatformIds } from "openclaw/plugin-sdk/channel-outbound";
20
+ import { createAccountStatusSink, createChannelMessageAdapterFromOutbound, createMessageReceiptFromOutboundResults, listMessageReceiptPlatformIds } from "openclaw/plugin-sdk/channel-outbound";
21
21
  import { buildTokenChannelStatusSummary, collectIssuesForEnabledAccounts, createComputedAccountStatusAdapter, createDefaultChannelRuntimeState, createDependentCredentialStatusIssueCollector } from "openclaw/plugin-sdk/status-helpers";
22
22
  import { createChannelPartialDeliveryError, isChannelPartialDeliveryError } from "openclaw/plugin-sdk/channel-inbound";
23
23
  import { createAttachedChannelResultAdapter, createEmptyChannelResult } from "openclaw/plugin-sdk/channel-send-result";
@@ -362,7 +362,7 @@ const lineStatusAdapter = createComputedAccountStatusAdapter({
362
362
  defaultRuntime: createDefaultChannelRuntimeState(DEFAULT_ACCOUNT_ID),
363
363
  collectStatusIssues: (accounts) => [...collectLineCredentialIssues(accounts), ...collectLineWebhookIssues(accounts)],
364
364
  buildChannelSummary: ({ snapshot }) => buildTokenChannelStatusSummary(snapshot),
365
- probeAccount: async ({ account, timeoutMs }) => await (await import("./probe.runtime-D2MUF_B_.mjs")).probeLineBot(account.channelAccessToken, timeoutMs),
365
+ probeAccount: async ({ account, timeoutMs }) => await (await import("./probe.runtime-DaGwztSg.mjs")).probeLineBot(account.channelAccessToken, timeoutMs),
366
366
  resolveAccountSnapshot: ({ account, probe }) => ({
367
367
  accountId: account.accountId,
368
368
  name: account.name,
@@ -394,7 +394,7 @@ const lineGatewayAdapter = {
394
394
  statusSink({ lifecycle: "starting" });
395
395
  let lineBotLabel = "";
396
396
  try {
397
- const probe = await (await import("./probe.runtime-D2MUF_B_.mjs")).probeLineBot(token, 2500);
397
+ const probe = await (await import("./probe.runtime-DaGwztSg.mjs")).probeLineBot(token, 2500);
398
398
  const displayName = probe.ok ? probe.bot?.displayName?.trim() : null;
399
399
  if (displayName) lineBotLabel = ` (${displayName})`;
400
400
  const delivery = describeLineWebhookDelivery({ webhook: probe.ok ? probe.webhook : void 0 });
@@ -403,7 +403,7 @@ const lineGatewayAdapter = {
403
403
  if (getLineRuntime().logging.shouldLogVerbose()) ctx.log?.debug?.(`[${account.accountId}] bot check failed: ${String(err)}`);
404
404
  }
405
405
  ctx.log?.info(`[${account.accountId}] starting LINE provider${lineBotLabel}`);
406
- const { monitorLineProvider } = await import("./monitor.runtime-DKuc2SBe.mjs");
406
+ const { monitorLineProvider } = await import("./monitor.runtime-DaSymO_N.mjs");
407
407
  return await monitorLineProvider({
408
408
  channelAccessToken: token,
409
409
  channelSecret: secret,
@@ -1043,7 +1043,7 @@ function createLineQuickReply(items) {
1043
1043
  }
1044
1044
  //#endregion
1045
1045
  //#region extensions/line/src/outbound.ts
1046
- const loadLineOutboundRuntime = createLazyRuntimeModule(() => import("./outbound.runtime-DLyndDng.mjs"));
1046
+ const loadLineOutboundRuntime = createLazyRuntimeModule(() => import("./outbound.runtime-BJL2119X.mjs"));
1047
1047
  function quotedOption(quoteToken) {
1048
1048
  return quoteToken ? { quoteToken } : {};
1049
1049
  }
@@ -1267,44 +1267,26 @@ const lineOutboundAdapter = {
1267
1267
  })
1268
1268
  })
1269
1269
  };
1270
- function toLineMessageSendResult(result) {
1271
- const { receipt } = result;
1272
- if (!receipt) throw new Error("LINE message adapter send did not return a receipt");
1273
- return {
1274
- messageId: result.messageId || receipt.primaryPlatformMessageId,
1275
- receipt
1276
- };
1277
- }
1278
- const lineMessageAdapter = defineChannelMessageAdapter({
1270
+ const lineMessageAdapter = createChannelMessageAdapterFromOutbound({
1279
1271
  id: "line",
1280
- durableFinal: { capabilities: {
1272
+ capabilities: {
1281
1273
  text: true,
1282
1274
  media: true,
1283
1275
  replyTo: true,
1284
1276
  messageSendingHooks: true
1285
- } },
1286
- send: {
1287
- text: async ({ onDeliveryResult, ...ctx }) => {
1288
- return toLineMessageSendResult(await lineOutboundAdapter.sendPayload({
1289
- ...ctx,
1290
- payload: { text: ctx.text },
1291
- onDeliveryResult: async (deliveryResult) => {
1292
- await onDeliveryResult?.(toLineMessageSendResult(deliveryResult));
1293
- }
1294
- }));
1295
- },
1296
- media: async ({ onDeliveryResult, ...ctx }) => {
1297
- return toLineMessageSendResult(await lineOutboundAdapter.sendPayload({
1298
- ...ctx,
1299
- payload: {
1300
- text: ctx.text,
1301
- mediaUrl: ctx.mediaUrl
1302
- },
1303
- onDeliveryResult: async (deliveryResult) => {
1304
- await onDeliveryResult?.(toLineMessageSendResult(deliveryResult));
1305
- }
1306
- }));
1307
- }
1277
+ },
1278
+ outbound: {
1279
+ sendText: (ctx) => lineOutboundAdapter.sendPayload({
1280
+ ...ctx,
1281
+ payload: { text: ctx.text }
1282
+ }),
1283
+ sendMedia: (ctx) => lineOutboundAdapter.sendPayload({
1284
+ ...ctx,
1285
+ payload: {
1286
+ text: ctx.text,
1287
+ mediaUrl: ctx.mediaUrl
1288
+ }
1289
+ })
1308
1290
  },
1309
1291
  receive: {
1310
1292
  defaultAckPolicy: "after_receive_record",
@@ -1313,7 +1295,7 @@ const lineMessageAdapter = defineChannelMessageAdapter({
1313
1295
  });
1314
1296
  //#endregion
1315
1297
  //#region extensions/line/src/channel.ts
1316
- const loadLineChannelRuntime = createLazyRuntimeModule(() => import("./channel.runtime-IN_F95BO.mjs"));
1298
+ const loadLineChannelRuntime = createLazyRuntimeModule(() => import("./channel.runtime-IdkB6yvc.mjs"));
1317
1299
  const lineSecurityAdapter = createRestrictSendersChannelSecurity({
1318
1300
  channelKey: "line",
1319
1301
  resolveDmPolicy: (account) => account.config.dmPolicy,
@@ -1,4 +1,4 @@
1
1
  import { a as probeLineBot } from "./send-retry-Dzbkz5wG.mjs";
2
2
  import { l as pushMessageLine, m as showLoadingAnimation } from "./send-g4gFsc9W.mjs";
3
- import { t as monitorLineProvider } from "./monitor-BY32s5Um.mjs";
3
+ import { t as monitorLineProvider } from "./monitor-2NNRm8hi.mjs";
4
4
  export { monitorLineProvider, probeLineBot, pushMessageLine, showLoadingAnimation };
@@ -1,11 +1,11 @@
1
1
  import { n as resolveDefaultLineAccountId, r as resolveLineAccount } from "./accounts-DOiM8-y3.mjs";
2
- import { a as parseLineQuestionPostbackData, c as resolveLineGroupConfigEntry, i as isLineQuestionPostbackData, n as createLineQuickReply, o as resolveLineQuestionPostback, r as prepareLineReplyPayload, s as buildLineQuickReplyFallbackText } from "./channel-DVuSrT_i.mjs";
2
+ import { a as parseLineQuestionPostbackData, c as resolveLineGroupConfigEntry, i as isLineQuestionPostbackData, n as createLineQuickReply, o as resolveLineQuestionPostback, r as prepareLineReplyPayload, s as buildLineQuickReplyFallbackText } from "./channel-CybGPFDZ.mjs";
3
3
  import { a as normalizeLineAllowEntry } from "./setup-surface-CYd8oqzt.mjs";
4
4
  import { t as getLineRuntime } from "./runtime-V7yh9OeC.mjs";
5
5
  import { A as resolveLineQuoteToken, D as readLineQuoteToken, E as canCarryLineQuoteToken, M as buildLineMediaMessage, O as recordLineQuoteToken, T as applyLineQuoteToken, k as reportLineQuoteCarrierMissing, n as findLineHttpError, r as resolveLineNonDispatchRetryable, t as explainLineRefusal } from "./send-retry-Dzbkz5wG.mjs";
6
6
  import { a as laneKeyFor, i as eventIdFor, n as LINE_WEBHOOK_SPOOL_INVALID_PAYLOAD_MESSAGE, r as LineWebhookPayloadError, t as LINE_WEBHOOK_SPOOL_INVALID_EVENT_REASON } from "./webhook-spool-contract-msjTl60Q.mjs";
7
7
  import { a as getUserDisplayName, h as quotesLineBotMessage, i as getLineGroupName, l as pushMessageLine, m as showLoadingAnimation, n as createLocationMessage, o as getUserProfile, p as replyMessageLine, t as createFlexMessage, u as pushMessagesLine } from "./send-g4gFsc9W.mjs";
8
- import { n as processLineMessage, t as buildTemplateMessageFromPayload } from "./template-messages-CwPsGQjw.mjs";
8
+ import { n as processLineMessage, t as buildTemplateMessageFromPayload } from "./template-messages-COcdie6C.mjs";
9
9
  import { createChannelPairingChallengeIssuer } from "openclaw/plugin-sdk/channel-pairing";
10
10
  import { resolveChannelGroupsConfigPath } from "openclaw/plugin-sdk/channel-policy";
11
11
  import { normalizeOptionalString, normalizeStringEntries, readNonEmptyStringPreservingWhitespace } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -17,7 +17,7 @@ import { collectErrorGraphCandidates, extractErrorCode, formatErrorMessage, read
17
17
  import { resolveSendableOutboundReplyParts } from "openclaw/plugin-sdk/reply-payload";
18
18
  import { sanitizeAssistantVisibleText } from "openclaw/plugin-sdk/text-chunking";
19
19
  import { danger, logVerbose, shouldLogVerbose, waitForAbortSignal, warn } from "openclaw/plugin-sdk/runtime-env";
20
- import { safeParseJson, truncateUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
20
+ import { safeParseJson } from "openclaw/plugin-sdk/text-utility-runtime";
21
21
  import { classifyTransientNetworkErrorCode } from "openclaw/plugin-sdk/retry-runtime";
22
22
  import { fetchWithRuntimeDispatcherOrMockedGlobal } from "openclaw/plugin-sdk/runtime-fetch";
23
23
  import { expectDefined } from "openclaw/plugin-sdk/expect-runtime";
@@ -58,19 +58,11 @@ function canFallbackAfterLineReplyFailure(error) {
58
58
  }
59
59
  function markLineVisibleDeliveryError(error) {
60
60
  const deliveryError = toLineDeliveryError(error);
61
- if (Object.isExtensible(deliveryError)) {
62
- Object.assign(deliveryError, {
63
- sentBeforeError: true,
64
- visibleReplySent: true
65
- });
66
- return deliveryError;
67
- }
68
- const visibleError = new Error("LINE message send failed", { cause: deliveryError });
69
- Object.assign(visibleError, {
61
+ Object.assign(deliveryError, {
70
62
  sentBeforeError: true,
71
63
  visibleReplySent: true
72
64
  });
73
- return visibleError;
65
+ return deliveryError;
74
66
  }
75
67
  async function deliverLineAutoReply(params) {
76
68
  const { payload, lineData, replyToken, accountId, to, textLimit } = params;
@@ -290,16 +282,9 @@ function getLineSourceInfo(source) {
290
282
  isGroup: source.type === "group" || source.type === "room"
291
283
  };
292
284
  }
293
- function buildPeerId(source) {
294
- if (!source) return "unknown";
295
- const groupKey = normalizeOptionalString(source.type === "group" ? source.groupId : void 0) ?? normalizeOptionalString(source.type === "room" ? source.roomId : void 0);
296
- if (groupKey) return groupKey;
297
- if (source.type === "user" && source.userId) return source.userId;
298
- return "unknown";
299
- }
300
285
  async function prepareLineInboundRoute(params) {
301
286
  const { userId, groupId, roomId, isGroup } = getLineSourceInfo(params.source);
302
- const peerId = buildPeerId(params.source);
287
+ const peerId = normalizeOptionalString(groupId ?? roomId) ?? (!isGroup && userId ? userId : "unknown");
303
288
  const routeInput = {
304
289
  channel: "line",
305
290
  accountId: params.account.accountId,
@@ -509,10 +494,9 @@ async function finalizeLineInboundContext(params) {
509
494
  sessionKey: params.route.sessionKey
510
495
  });
511
496
  if (shouldLogVerbose()) {
512
- const preview = truncateUtf16Safe(body, 200).replace(/\n/g, "\\n");
513
497
  const mediaInfo = params.verboseLog.kind === "inbound" && (params.verboseLog.mediaCount ?? 0) > 1 ? ` mediaCount=${params.verboseLog.mediaCount}` : "";
514
498
  const label = params.verboseLog.kind === "inbound" ? "line inbound" : "line postback";
515
- logVerbose(`${label}: from=${ctxPayload.From} len=${body.length}${mediaInfo} preview="${preview}"`);
499
+ logVerbose(`${label}: from=${ctxPayload.From} len=${body.length}${mediaInfo}`);
516
500
  }
517
501
  return {
518
502
  ctxPayload,
@@ -1773,9 +1757,7 @@ function resolveLineWebhookPath(webhookPath) {
1773
1757
  const lineWebhookInFlightLimiter = createWebhookInFlightLimiter();
1774
1758
  const lineWebhookTargets = /* @__PURE__ */ new Map();
1775
1759
  function startLineLoadingKeepalive(params) {
1776
- let stopped = false;
1777
1760
  const trigger = () => {
1778
- if (stopped) return;
1779
1761
  showLoadingAnimation(params.userId, {
1780
1762
  cfg: params.cfg,
1781
1763
  accountId: params.accountId,
@@ -1784,11 +1766,7 @@ function startLineLoadingKeepalive(params) {
1784
1766
  };
1785
1767
  trigger();
1786
1768
  const timer = setInterval(trigger, 18e3);
1787
- return () => {
1788
- if (stopped) return;
1789
- stopped = true;
1790
- clearInterval(timer);
1791
- };
1769
+ return () => clearInterval(timer);
1792
1770
  }
1793
1771
  async function monitorLineProvider(opts) {
1794
1772
  const { channelAccessToken, channelSecret, accountId, config, runtime, buildContext, abortSignal, webhookPath, statusSink } = opts;
@@ -1958,12 +1936,9 @@ async function monitorLineProvider(opts) {
1958
1936
  }
1959
1937
  logVerbose(`line: registered webhook handler at ${normalizedPath}`);
1960
1938
  statusSink?.(channelReadyPatch());
1961
- let stopped = false;
1962
1939
  let stopPromise;
1963
1940
  const stopHandler = () => {
1964
1941
  if (stopPromise) return stopPromise;
1965
- if (stopped) return Promise.resolve();
1966
- stopped = true;
1967
1942
  logVerbose(`line: stopping provider for account ${resolvedAccountId}`);
1968
1943
  unregisterHttp();
1969
1944
  stopPromise = bot.stop().finally(() => {
@@ -0,0 +1 @@
1
+ export { t as monitorLineProvider } from "./monitor-2NNRm8hi.mjs";
@@ -1,3 +1,3 @@
1
1
  import { c as pushLocationMessage, d as pushTemplateMessage, f as pushTextMessageWithQuickReplies, l as pushMessageLine, n as createLocationMessage, r as createQuickReplyItems, s as pushFlexMessage, t as createFlexMessage, u as pushMessagesLine } from "./send-g4gFsc9W.mjs";
2
- import { n as processLineMessage, t as buildTemplateMessageFromPayload } from "./template-messages-CwPsGQjw.mjs";
2
+ import { n as processLineMessage, t as buildTemplateMessageFromPayload } from "./template-messages-COcdie6C.mjs";
3
3
  export { buildTemplateMessageFromPayload, createFlexMessage, createLocationMessage, createQuickReplyItems, processLineMessage, pushFlexMessage, pushLocationMessage, pushMessageLine, pushMessagesLine, pushTemplateMessage, pushTextMessageWithQuickReplies };
@@ -0,0 +1 @@
1
+ export { a as probeLineBot } from "./send-retry-Dzbkz5wG.mjs";
@@ -324,12 +324,6 @@ function getGraphemeSegmenter() {
324
324
  graphemeSegmenter ??= new Intl.Segmenter(void 0, { granularity: "grapheme" });
325
325
  return graphemeSegmenter;
326
326
  }
327
- /** Uses the same source text that created segments. */
328
- function containingSegment(segments, text, index) {
329
- const position = Number.isNaN(index) ? 0 : Math.trunc(index);
330
- const codePoint = text.codePointAt(position);
331
- return segments.containing(codePoint !== void 0 && codePoint > 65535 ? position + 1 : position);
332
- }
333
327
  /**
334
328
  * Chooses a whole-grapheme cut within the hard budget, honoring a usable preference.
335
329
  * If no whole grapheme fits, allowPartial permits a surrogate-safe progress cut;
@@ -344,8 +338,8 @@ function findGraphemeChunkEnd(text, start, maxEnd, preferredEnd = maxEnd, allowP
344
338
  const after = text.charCodeAt(preferred);
345
339
  if (Number.isInteger(preferred) && before <= 127 && after <= 127 && !(before === 13 && after === 10)) return preferred;
346
340
  const segments = getGraphemeSegmenter().segment(text);
347
- let end = containingSegment(segments, text, preferred)?.index ?? preferred;
348
- if (end <= start && preferred < hardEnd) end = hardEnd === text.length ? hardEnd : containingSegment(segments, text, hardEnd)?.index ?? hardEnd;
341
+ let end = segments.containing(preferred)?.index ?? preferred;
342
+ if (end <= start && preferred < hardEnd) end = hardEnd === text.length ? hardEnd : segments.containing(hardEnd)?.index ?? hardEnd;
349
343
  return end > start ? end : allowPartial ? avoidTrailingHighSurrogateBreak(text, start, hardEnd) : start;
350
344
  }
351
345
  //#endregion
package/dist/api.js CHANGED
@@ -1,3 +1,3 @@
1
- import { t as linePlugin } from "./.setup/channel-DVuSrT_i.mjs";
2
- import { t as lineSetupPlugin } from "./.setup/api-DPd9f0cI.mjs";
1
+ import { t as linePlugin } from "./.setup/channel-CybGPFDZ.mjs";
2
+ import { t as lineSetupPlugin } from "./.setup/api-CO1TnHKG.mjs";
3
3
  export { linePlugin, lineSetupPlugin };
@@ -1,2 +1 @@
1
- import { t as linePlugin } from "./.setup/channel-DVuSrT_i.mjs";
2
- export { linePlugin };
1
+ export { t as linePlugin } from "./.setup/channel-CybGPFDZ.mjs";
@@ -1,2 +1 @@
1
- import { n as resolveDefaultLineAccountId, r as resolveLineAccount, t as listLineAccountIds } from "./.setup/accounts-DOiM8-y3.mjs";
2
- export { listLineAccountIds, resolveDefaultLineAccountId, resolveLineAccount };
1
+ export { t as listLineAccountIds, n as resolveDefaultLineAccountId, r as resolveLineAccount } from "./.setup/accounts-DOiM8-y3.mjs";
@@ -110,7 +110,7 @@ const stateMigrations = [{
110
110
  const preview = [];
111
111
  for (const accountId of await spool.listChannelIngressQueueAccountIds()) {
112
112
  const count = await countLegacySpoolRows(spool.openChannelIngressQueueForInspection({ accountId }));
113
- if (count > 0) preview.push(`- LINE pre-drain spool rows (account "${accountId}"): ${count} row(s) -> canonical ingress contract`);
113
+ if (count > 0) preview.push(`- LINE pre-drain spool rows (account "${accountId}"): ${count} row(s) -> current ingress format`);
114
114
  }
115
115
  return preview.length > 0 ? { preview } : null;
116
116
  },
@@ -126,9 +126,9 @@ const stateMigrations = [{
126
126
  const result = await migrateLineLegacySpoolRows(openForMigration({ accountId }));
127
127
  if (result.migrated > 0 || result.reconciled > 0 || result.deadLettered > 0 || result.recovered > 0) {
128
128
  const recovered = result.recovered > 0 ? ` (${result.recovered} recovered from the dead-letter table)` : "";
129
- const reconciled = result.reconciled > 0 ? `, ${result.reconciled} already settled under the canonical id` : "";
129
+ const reconciled = result.reconciled > 0 ? `, ${result.reconciled} already settled under the current ID` : "";
130
130
  const dispatchNote = configuredAccountIds.has(accountId) ? "" : ` (account not currently configured, so these stay queued until it is restored)`;
131
- changes.push(`Migrated LINE pre-drain spool rows (account "${accountId}"): ${result.migrated} queued under the canonical contract, ${result.deadLettered} dead-lettered at the identity fence${reconciled}${recovered}${dispatchNote}`);
131
+ changes.push(`Migrated LINE pre-drain spool rows (account "${accountId}"): ${result.migrated} queued under the current format, ${result.deadLettered} dead-lettered at the identity fence${reconciled}${recovered}${dispatchNote}`);
132
132
  }
133
133
  for (const failure of result.failures) warnings.push(`Failed migrating a LINE pre-drain spool row (account "${accountId}", ${failure}); the row stays pending and the migration retries on the next run`);
134
134
  }
@@ -1,2 +1 @@
1
- import { n as setLineRuntime } from "./.setup/runtime-V7yh9OeC.mjs";
2
- export { setLineRuntime };
1
+ export { n as setLineRuntime } from "./.setup/runtime-V7yh9OeC.mjs";
package/dist/setup-api.js CHANGED
@@ -1,2 +1 @@
1
- import { n as lineSetupAdapter, t as lineSetupWizard } from "./.setup/setup-surface-CYd8oqzt.mjs";
2
- export { lineSetupAdapter, lineSetupWizard };
1
+ export { n as lineSetupAdapter, t as lineSetupWizard } from "./.setup/setup-surface-CYd8oqzt.mjs";
@@ -4,7 +4,7 @@ import { fileURLToPath } from "node:url";
4
4
  var setup_entry_default = defineBundledChannelSetupEntry({
5
5
  importMetaUrl: import.meta.url,
6
6
  plugin: {
7
- specifier: fileURLToPath(new URL(".setup/api-BxKwG8cd.mjs", import.meta.url).href),
7
+ specifier: fileURLToPath(new URL(".setup/api-DPxiB9eZ.mjs", import.meta.url).href),
8
8
  exportName: "lineSetupPlugin"
9
9
  }
10
10
  });
@@ -12,7 +12,7 @@ export function FromObject(context, type, value) {
12
12
  return value;
13
13
  const additionalProperties = GetAdditionalProperties(type);
14
14
  for (const key of Guard.Keys(value)) {
15
- if (Guard.HasPropertyKey(type.properties, key)) {
15
+ if (Guard.HasPropertyKey(type.properties, key) && IsSchema(type.properties[key])) {
16
16
  value[key] = FromType(context, type.properties[key], value[key]);
17
17
  continue;
18
18
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typebox",
3
3
  "description": "Json Schema Type Builder with Static Type Resolution for TypeScript",
4
- "version": "1.3.34",
4
+ "version": "1.3.35",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "jsonschema"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/line",
3
- "version": "2026.10.5-beta.4",
3
+ "version": "2026.10.10-beta.2",
4
4
  "description": "OpenClaw LINE channel plugin for LINE Bot API chats.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,11 +9,11 @@
9
9
  "type": "module",
10
10
  "dependencies": {
11
11
  "@line/bot-sdk": "11.3.0",
12
- "typebox": "1.3.34",
12
+ "typebox": "1.3.35",
13
13
  "zod": "4.6.5"
14
14
  },
15
15
  "peerDependencies": {
16
- "openclaw": ">=2026.10.5-beta.4"
16
+ "openclaw": ">=2026.10.10-beta.2"
17
17
  },
18
18
  "peerDependenciesMeta": {
19
19
  "openclaw": {
@@ -122,10 +122,10 @@
122
122
  "minHostVersion": ">=2026.4.10"
123
123
  },
124
124
  "compat": {
125
- "pluginApi": ">=2026.10.5-beta.4"
125
+ "pluginApi": ">=2026.10.10-beta.2"
126
126
  },
127
127
  "build": {
128
- "openclawVersion": "2026.10.5-beta.4"
128
+ "openclawVersion": "2026.10.10-beta.2"
129
129
  },
130
130
  "release": {
131
131
  "publishToClawHub": true,
@@ -1,3 +0,0 @@
1
- import { t as linePlugin } from "./channel-DVuSrT_i.mjs";
2
- import { t as lineSetupPlugin } from "./api-DPd9f0cI.mjs";
3
- export { linePlugin, lineSetupPlugin };
@@ -1,2 +0,0 @@
1
- import { t as monitorLineProvider } from "./monitor-BY32s5Um.mjs";
2
- export { monitorLineProvider };
@@ -1,2 +0,0 @@
1
- import { a as probeLineBot } from "./send-retry-Dzbkz5wG.mjs";
2
- export { probeLineBot };