larkway 0.3.54 → 0.3.55

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
@@ -8,7 +8,7 @@
8
8
 
9
9
  You @ the bot in a Feishu thread. It runs on your machine — reading your real codebase, executing commands, opening MRs — and posts the result back. You define what the agent knows and what it can do. Larkway just carries the messages.
10
10
 
11
- **Current release: v0.3.54**
11
+ **Current release: v0.3.55**
12
12
 
13
13
  ---
14
14
 
package/README.zh.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  你在飞书话题里 @ bot,它在你的机器上运行——读真实代码库、执行命令、开 MR——把结果贴回飞书。你定义 agent 知道什么、能做什么。Larkway 只负责传递消息。
10
10
 
11
- **当前版本:v0.3.54**
11
+ **当前版本:v0.3.55**
12
12
 
13
13
  ---
14
14
 
package/dist/cli/index.js CHANGED
@@ -20593,7 +20593,7 @@ var require_websocket = __commonJS({
20593
20593
  var http2 = __require("http");
20594
20594
  var net = __require("net");
20595
20595
  var tls = __require("tls");
20596
- var { randomBytes: randomBytes2, createHash: createHash2 } = __require("crypto");
20596
+ var { randomBytes: randomBytes2, createHash: createHash3 } = __require("crypto");
20597
20597
  var { Duplex, Readable } = __require("stream");
20598
20598
  var { URL: URL2 } = __require("url");
20599
20599
  var PerMessageDeflate = require_permessage_deflate();
@@ -21261,7 +21261,7 @@ var require_websocket = __commonJS({
21261
21261
  abortHandshake(websocket, socket, "Invalid Upgrade header");
21262
21262
  return;
21263
21263
  }
21264
- const digest = createHash2("sha1").update(key + GUID).digest("base64");
21264
+ const digest = createHash3("sha1").update(key + GUID).digest("base64");
21265
21265
  if (res.headers["sec-websocket-accept"] !== digest) {
21266
21266
  abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
21267
21267
  return;
@@ -21630,7 +21630,7 @@ var require_websocket_server = __commonJS({
21630
21630
  var EventEmitter = __require("events");
21631
21631
  var http2 = __require("http");
21632
21632
  var { Duplex } = __require("stream");
21633
- var { createHash: createHash2 } = __require("crypto");
21633
+ var { createHash: createHash3 } = __require("crypto");
21634
21634
  var extension = require_extension();
21635
21635
  var PerMessageDeflate = require_permessage_deflate();
21636
21636
  var subprotocol = require_subprotocol();
@@ -21937,7 +21937,7 @@ var require_websocket_server = __commonJS({
21937
21937
  );
21938
21938
  }
21939
21939
  if (this._state > RUNNING) return abortHandshake(socket, 503);
21940
- const digest = createHash2("sha1").update(key + GUID).digest("base64");
21940
+ const digest = createHash3("sha1").update(key + GUID).digest("base64");
21941
21941
  const headers = [
21942
21942
  "HTTP/1.1 101 Switching Protocols",
21943
21943
  "Upgrade: websocket",
@@ -107881,6 +107881,7 @@ var init_channelCardKitClient = __esm({
107881
107881
  });
107882
107882
 
107883
107883
  // src/lark/outboundPostClient.ts
107884
+ import { createHash as createHash2 } from "node:crypto";
107884
107885
  function numericStatus(err2) {
107885
107886
  if (!err2 || typeof err2 !== "object") return void 0;
107886
107887
  const rec = err2;
package/dist/main.js CHANGED
@@ -20145,7 +20145,7 @@ var require_websocket = __commonJS({
20145
20145
  var http = __require("http");
20146
20146
  var net = __require("net");
20147
20147
  var tls = __require("tls");
20148
- var { randomBytes, createHash: createHash3 } = __require("crypto");
20148
+ var { randomBytes, createHash: createHash4 } = __require("crypto");
20149
20149
  var { Duplex, Readable } = __require("stream");
20150
20150
  var { URL: URL2 } = __require("url");
20151
20151
  var PerMessageDeflate = require_permessage_deflate();
@@ -20813,7 +20813,7 @@ var require_websocket = __commonJS({
20813
20813
  abortHandshake(websocket, socket, "Invalid Upgrade header");
20814
20814
  return;
20815
20815
  }
20816
- const digest = createHash3("sha1").update(key + GUID).digest("base64");
20816
+ const digest = createHash4("sha1").update(key + GUID).digest("base64");
20817
20817
  if (res.headers["sec-websocket-accept"] !== digest) {
20818
20818
  abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
20819
20819
  return;
@@ -21182,7 +21182,7 @@ var require_websocket_server = __commonJS({
21182
21182
  var EventEmitter = __require("events");
21183
21183
  var http = __require("http");
21184
21184
  var { Duplex } = __require("stream");
21185
- var { createHash: createHash3 } = __require("crypto");
21185
+ var { createHash: createHash4 } = __require("crypto");
21186
21186
  var extension = require_extension();
21187
21187
  var PerMessageDeflate = require_permessage_deflate();
21188
21188
  var subprotocol = require_subprotocol();
@@ -21489,7 +21489,7 @@ var require_websocket_server = __commonJS({
21489
21489
  );
21490
21490
  }
21491
21491
  if (this._state > RUNNING) return abortHandshake(socket, 503);
21492
- const digest = createHash3("sha1").update(key + GUID).digest("base64");
21492
+ const digest = createHash4("sha1").update(key + GUID).digest("base64");
21493
21493
  const headers = [
21494
21494
  "HTTP/1.1 101 Switching Protocols",
21495
21495
  "Upgrade: websocket",
@@ -112048,6 +112048,10 @@ var ChannelCardKitClient = class {
112048
112048
  };
112049
112049
 
112050
112050
  // src/lark/outboundPostClient.ts
112051
+ import { createHash as createHash2 } from "node:crypto";
112052
+ function safeIdempotencyKey(raw) {
112053
+ return "lw-" + createHash2("sha256").update(raw).digest("hex").slice(0, 40);
112054
+ }
112051
112055
  function numericStatus(err) {
112052
112056
  if (!err || typeof err !== "object") return void 0;
112053
112057
  const rec = err;
@@ -117052,7 +117056,12 @@ async function processHandoffs(ctx) {
117052
117056
  });
117053
117057
  const sent = await ctx.postClient.createPostReply(ctx.replyAnchorId, content, {
117054
117058
  replyInThread: true,
117055
- idempotencyKey: `handoff:${ctx.triggerMessageId}:${i}:${rosterEntry?.botId ?? wanted}`
117059
+ // Hashed: raw `handoff:<om_ id>:<i>:<botId>` sits at ~50 chars — right
117060
+ // on Feishu's uuid validation cap (99992402). Same-input stability
117061
+ // keeps retry dedup working.
117062
+ idempotencyKey: safeIdempotencyKey(
117063
+ `handoff:${ctx.triggerMessageId}:${i}:${rosterEntry?.botId ?? wanted}`
117064
+ )
117056
117065
  });
117057
117066
  mirrorMessageId = sent.messageId;
117058
117067
  } catch (err) {
@@ -118415,12 +118424,12 @@ async function createCotProgressHandle(opts) {
118415
118424
  }
118416
118425
 
118417
118426
  // src/lark/idempotency.ts
118418
- import { createHash as createHash2 } from "node:crypto";
118427
+ import { createHash as createHash3 } from "node:crypto";
118419
118428
  var KEY_PREFIX = "lw-p-";
118420
118429
  var KEY_HASH_CHARS = 43;
118421
118430
  var MAX_POST_IDEMPOTENCY_KEY_LENGTH = 64;
118422
118431
  function sha256Base64Url(input) {
118423
- return createHash2("sha256").update(input).digest("base64url");
118432
+ return createHash3("sha256").update(input).digest("base64url");
118424
118433
  }
118425
118434
  function digestPostContent(content) {
118426
118435
  return sha256Base64Url(content).slice(0, 22);
@@ -130255,7 +130264,10 @@ async function runV2Mode({
130255
130264
  chatId,
130256
130265
  buildPostContent({ text: `${header}
130257
130266
  ${prompt}` }),
130258
- { idempotencyKey: `schedule:${bot.id}:${id}:${occurrence}` }
130267
+ // Hashed: Feishu's uuid field rejects long/odd-charset keys with
130268
+ // 99992402 (see safeIdempotencyKey) — raw cron keys contain
130269
+ // spaces/asterisks and overflow the cap.
130270
+ { idempotencyKey: safeIdempotencyKey(`schedule:${bot.id}:${id}:${occurrence}`) }
130259
130271
  );
130260
130272
  mirrorId = sent.messageId;
130261
130273
  } catch (err) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "larkway",
3
- "version": "0.3.54",
3
+ "version": "0.3.55",
4
4
  "description": "Thin bridge: Feishu thread to local Claude Code CLI",
5
5
  "license": "MIT",
6
6
  "author": "Chuck Wu (chuckwu0)",