larkway 0.3.35 → 0.3.36

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.35**
11
+ **Current release: v0.3.36**
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.35**
11
+ **当前版本:v0.3.36**
12
12
 
13
13
  ---
14
14
 
package/dist/cli/index.js CHANGED
@@ -25413,13 +25413,13 @@ var require_lib2 = __commonJS({
25413
25413
  Domain[Domain["Lark"] = 1] = "Lark";
25414
25414
  })(exports.Domain || (exports.Domain = {}));
25415
25415
  exports.LoggerLevel = void 0;
25416
- (function(LoggerLevel) {
25417
- LoggerLevel[LoggerLevel["fatal"] = 0] = "fatal";
25418
- LoggerLevel[LoggerLevel["error"] = 1] = "error";
25419
- LoggerLevel[LoggerLevel["warn"] = 2] = "warn";
25420
- LoggerLevel[LoggerLevel["info"] = 3] = "info";
25421
- LoggerLevel[LoggerLevel["debug"] = 4] = "debug";
25422
- LoggerLevel[LoggerLevel["trace"] = 5] = "trace";
25416
+ (function(LoggerLevel2) {
25417
+ LoggerLevel2[LoggerLevel2["fatal"] = 0] = "fatal";
25418
+ LoggerLevel2[LoggerLevel2["error"] = 1] = "error";
25419
+ LoggerLevel2[LoggerLevel2["warn"] = 2] = "warn";
25420
+ LoggerLevel2[LoggerLevel2["info"] = 3] = "info";
25421
+ LoggerLevel2[LoggerLevel2["debug"] = 4] = "debug";
25422
+ LoggerLevel2[LoggerLevel2["trace"] = 5] = "trace";
25423
25423
  })(exports.LoggerLevel || (exports.LoggerLevel = {}));
25424
25424
  var CEventType = /* @__PURE__ */ Symbol("event-type");
25425
25425
  var CTenantKey = /* @__PURE__ */ Symbol("tenant-key");
@@ -128029,9 +128029,9 @@ async function checkWsConnectivity(ctx, opts) {
128029
128029
  }
128030
128030
  async function probeTaskScope(appId, appSecret, tasklistGuid) {
128031
128031
  try {
128032
- const { Client: LarkSdkClient2 } = await Promise.resolve().then(() => __toESM(require_lib2(), 1));
128032
+ const { Client: LarkSdkClient2, LoggerLevel: LoggerLevel2 } = await Promise.resolve().then(() => __toESM(require_lib2(), 1));
128033
128033
  const { TaskListClient: TaskListClient2 } = await Promise.resolve().then(() => (init_client(), client_exports));
128034
- const sdkClient = new LarkSdkClient2({ appId, appSecret });
128034
+ const sdkClient = new LarkSdkClient2({ appId, appSecret, loggerLevel: LoggerLevel2.fatal });
128035
128035
  const taskClient = new TaskListClient2({
128036
128036
  request: (config) => sdkClient.request(config)
128037
128037
  });
@@ -132862,27 +132862,50 @@ function runLarkCliJson(args, spawnSyncFn) {
132862
132862
  }
132863
132863
  return { ok: true, data: parsed };
132864
132864
  }
132865
- function listUserTasklists(profile, spawnSyncFn = spawnSync3) {
132865
+ function searchUserTasklists(profile, query, spawnSyncFn = spawnSync3) {
132866
132866
  const result = runLarkCliJson(
132867
- ["task", "tasklists", "list", "--as", "user", "--profile", profile, "--page-all", "--json"],
132867
+ ["task", "+tasklist-search", "--as", "user", "--profile", profile, "--query", query, "--page-all", "--json"],
132868
132868
  spawnSyncFn
132869
132869
  );
132870
132870
  if (!result.ok) return result;
132871
- const data = result.data;
132872
- const items = typeof data === "object" && data !== null ? data["items"] : void 0;
132873
- if (!Array.isArray(items)) {
132874
- return { ok: false, error: `lark-cli \u8FD4\u56DE\u7684\u6E05\u5355\u5217\u8868\u5F62\u72B6\u4E0D\u5BF9(\u7F3A\u5C11 items \u6570\u7EC4):${JSON.stringify(data).slice(0, 300)}` };
132871
+ return extractTasklistSummaries(result.data);
132872
+ }
132873
+ function extractTasklistSummaries(data) {
132874
+ const rec = typeof data === "object" && data !== null ? data : {};
132875
+ const nested = typeof rec["data"] === "object" && rec["data"] !== null ? rec["data"] : {};
132876
+ let arr;
132877
+ for (const candidate of [
132878
+ data,
132879
+ rec["items"],
132880
+ rec["tasklists"],
132881
+ rec["results"],
132882
+ nested["items"],
132883
+ nested["tasklists"],
132884
+ nested["results"]
132885
+ ]) {
132886
+ if (Array.isArray(candidate)) {
132887
+ arr = candidate;
132888
+ break;
132889
+ }
132875
132890
  }
132876
- const tasklists = [];
132877
- for (const raw of items) {
132891
+ if (!arr) {
132892
+ return {
132893
+ ok: false,
132894
+ error: `lark-cli +tasklist-search \u8FD4\u56DE\u7684\u5F62\u72B6\u65E0\u6CD5\u8BC6\u522B(\u627E\u4E0D\u5230\u6E05\u5355\u6570\u7EC4):${JSON.stringify(data).slice(0, 300)}`
132895
+ };
132896
+ }
132897
+ const out = [];
132898
+ const seen = /* @__PURE__ */ new Set();
132899
+ for (const raw of arr) {
132878
132900
  if (typeof raw !== "object" || raw === null) continue;
132879
132901
  const guid = raw["guid"];
132880
132902
  const name = raw["name"];
132881
- if (typeof guid === "string" && guid.length > 0) {
132882
- tasklists.push({ guid, name: typeof name === "string" ? name : "(\u65E0\u6807\u9898)" });
132903
+ if (typeof guid === "string" && guid.length > 0 && !seen.has(guid)) {
132904
+ seen.add(guid);
132905
+ out.push({ guid, name: typeof name === "string" ? name : "(\u65E0\u6807\u9898)" });
132883
132906
  }
132884
132907
  }
132885
- return { ok: true, data: tasklists };
132908
+ return { ok: true, data: out };
132886
132909
  }
132887
132910
  function addTasklistMembersAsUser(profile, tasklistGuid, members, spawnSyncFn = spawnSync3) {
132888
132911
  const dataJson = JSON.stringify({ members });
@@ -132969,33 +132992,41 @@ var USAGE2 = `larkway tasklist-init [--team <bot1,bot2,\u2026>] [--name <\u6E05\
132969
132992
  \u5E2E\u52A9\u7684 agent,\u7B2C\u4E00\u6B65\u5FC5\u7136\u4F1A\u8DD1 \`larkway tasklist-init --help\`(\u5C31\u662F\u4F60\u6B63\u5728\u770B\u7684\u8FD9\u6BB5),
132970
132993
  \u4ECE\u8FD9\u91CC\u5C31\u80FD\u5B66\u4F1A\u600E\u4E48\u628A\u672C\u673A\u6240\u6709\u5DF2\u914D\u7F6E\u7684 bot \u90FD\u914D\u6210\u6E05\u5355\u6210\u5458,\u4E0D\u9700\u8981\u4F60\u518D\u624B\u52A8\u4F20\u4EFB\u4F55\u53C2\u6570\u3002
132971
132994
 
132972
- \u96F6\u53C2\u6570\u4E09\u6B65 Quickstart:
132973
- 1. (\u53EF\u9009)\u5148\u5728\u98DE\u4E66\u4EFB\u52A1\u4E2D\u5FC3\u624B\u52A8\u5EFA\u4E00\u4E2A\u6E05\u5355,\u540D\u5B57\u968F\u4FBF\u53D6,\u6BD4\u5982 "Agent Team"\u3002
132974
- 2. \u8DD1:larkway tasklist-init
132995
+ \u96F6\u53C2\u6570 Quickstart:
132996
+ 1. \u8DD1:larkway tasklist-init
132975
132997
  \u2014\u2014 \u4F1A\u81EA\u52A8:--team = \u672C\u673A bots/ \u76EE\u5F55\u4E0B\u5168\u90E8\u5DF2\u914D\u7F6E bot;--name = "Agent Team";
132976
- \u7528\u4F60\u7684 lark-cli \u7528\u6237\u8EAB\u4EFD\u6309\u540D\u5B57\u67E5\u4E00\u904D\u80FD\u770B\u5230\u7684\u6E05\u5355 \u2014\u2014 \u67E5\u5230\u540C\u540D\u7684\u5C31 adopt(\u628A\u8FD9\u4E9B
132977
- bot \u52A0\u4E3A editor);\u67E5\u4E0D\u5230(\u6216\u6CA1\u767B\u5F55/\u7F3A scope)\u5C31\u9759\u9ED8\u56DE\u9000\u5230\u65E7\u7684\u521B\u5EFA\u8DEF\u5F84(\u7528\u7B2C\u4E00\u4E2A
132978
- bot \u7684 app \u8EAB\u4EFD\u65B0\u5EFA\u4E00\u4E2A\u6E05\u5355,\u5E76\u81EA\u52A8\u628A\u4F60\u52A0\u4E3A owner)\u3002
132979
- 3. \u53BB\u98DE\u4E66\u4EFB\u52A1\u4E2D\u5FC3\u786E\u8BA4\u8FD9\u4E2A\u6E05\u5355\u5728\u4F60\u7684\u5217\u8868\u91CC\u53EF\u89C1,\u4E4B\u540E\u53F3\u952E\u8BDD\u9898\u6D88\u606F\u9009"\u8F6C\u4EFB\u52A1"\u5373\u53EF\u3002
132998
+ \u7528\u7B2C\u4E00\u4E2A bot \u7684 app \u8EAB\u4EFD**\u65B0\u5EFA**\u4E00\u4E2A\u6E05\u5355(\u6E05\u5355 owner = \u8BE5 bot app),\u5E76\u628A\u4F60
132999
+ \u52A0\u4E3A editor \u6210\u5458(\u65B9\u4FBF\u5728\u4EFB\u52A1\u4E2D\u5FC3\u770B\u5230\u5E76\u7F16\u8F91)\u3002\u96F6\u53C2\u6570**\u4E0D\u4F1A**\u81EA\u52A8\u53BB\u8BA4\u9886\u540C\u540D\u6E05\u5355\u3002
133000
+ 2. \u53BB\u98DE\u4E66\u4EFB\u52A1\u4E2D\u5FC3\u786E\u8BA4\u8FD9\u4E2A\u6E05\u5355\u5728\u4F60\u7684\u5217\u8868\u91CC\u53EF\u89C1,\u4E4B\u540E\u53F3\u952E\u8BDD\u9898\u6D88\u606F\u9009"\u8F6C\u4EFB\u52A1"\u5373\u53EF\u3002
133001
+
133002
+ \u60F3\u8BA9\u6E05\u5355\u5F52**\u4F60\u81EA\u5DF1**\u6240\u6709(\u800C\u4E0D\u662F bot app)?\u5148\u5728\u4EFB\u52A1\u4E2D\u5FC3\u81EA\u5DF1\u5EFA\u4E00\u4E2A,\u518D\u7528
133003
+ \`--adopt "<\u6E05\u5355\u540D>"\` \u8BA4\u9886(\u89C1\u4E0B)\u3002\u591A\u5957 Larkway \u90E8\u7F72\u65F6,\u7ED9\u6BCF\u5957\u7528 --name \u6539\u4E2A\u4E0D\u540C
133004
+ \u540D\u5B57\u505A\u9694\u79BB,\u907F\u514D\u6DF7\u7528\u3002
132980
133005
 
132981
133006
  \u4EE5\u4E0A\u5168\u90E8\u662F\u7F3A\u7701\u884C\u4E3A,\u4EE5\u4E0B flag \u4EC5\u7528\u4E8E\u8986\u76D6:
132982
133007
 
132983
133008
  --team <bot1,bot2,\u2026> \u663E\u5F0F\u6307\u5B9A\u8981\u52A0\u5165\u6E05\u5355\u7684 bot(\u9ED8\u8BA4 = \u5168\u90E8\u5DF2\u914D\u7F6E bot)
132984
- --name <\u6E05\u5355\u540D> \u663E\u5F0F\u6307\u5B9A\u6E05\u5355\u540D(\u9ED8\u8BA4 "Agent Team"),\u4EC5\u5728\u81EA\u52A8/\u663E\u5F0F create
132985
- \u8DEF\u5F84\u91CC\u751F\u6548;--adopt/--adopt-guid \u4F1A\u5FFD\u7565\u5B83,\u6309\u540D\u5B57/guid \u67E5
132986
- --adopt "<\u6E05\u5355\u540D>" \u5F3A\u5236\u8D70 adopt \u6A21\u5F0F\u5E76\u7528\u8FD9\u4E2A\u540D\u5B57\u67E5\u627E\u2014\u2014\u67E5\u4E0D\u5230/\u67E5\u51FA\u591A\u4E2A\u90FD\u4F1A
132987
- \u76F4\u63A5\u62A5\u9519\u9000\u51FA,\u4E0D\u4F1A\u9759\u9ED8\u56DE\u9000\u5230\u521B\u5EFA\u8DEF\u5F84(\u4F60\u5DF2\u7ECF\u660E\u786E\u8981 adopt\u4E86)
132988
- --adopt-guid <guid> \u8DF3\u8FC7\u6309\u540D\u5B57\u67E5\u627E,\u76F4\u63A5 adopt \u8FD9\u4E2A guid \u7684\u6E05\u5355(\u5355\u72EC\u4F7F\u7528\u4E5F
132989
- \u7B49\u4EF7\u4E8E\u5F3A\u5236 adopt \u6A21\u5F0F);\u591A\u4E2A\u540C\u540D\u6E05\u5355\u65F6\u7528\u5B83\u6D88\u6B67
133009
+ --name <\u6E05\u5355\u540D> \u663E\u5F0F\u6307\u5B9A\u8981\u521B\u5EFA/\u590D\u7528\u7684\u6E05\u5355\u540D(\u9ED8\u8BA4 "Agent Team");\u591A\u56E2\u961F
133010
+ \u90E8\u7F72\u7528\u5B83\u9694\u79BB\u3002--adopt/--adopt-guid \u4F1A\u5FFD\u7565\u5B83,\u6309\u540D\u5B57/guid \u67E5
133011
+ --adopt "<\u6E05\u5355\u540D>" \u8BA4\u9886\u4F60\u81EA\u5DF1\u5728\u4EFB\u52A1\u4E2D\u5FC3\u5EFA\u597D\u7684\u540C\u540D\u6E05\u5355(\u628A\u8FD9\u4E9B bot \u52A0\u4E3A editor)\u2014\u2014
133012
+ \u67E5\u4E0D\u5230/\u67E5\u51FA\u591A\u4E2A\u90FD\u76F4\u63A5\u62A5\u9519\u9000\u51FA,\u7EDD\u4E0D\u9759\u9ED8\u56DE\u9000\u5230\u521B\u5EFA\u8DEF\u5F84
133013
+ --adopt-guid <guid> \u8DF3\u8FC7\u6309\u540D\u5B57\u67E5\u627E,\u76F4\u63A5\u8BA4\u9886\u8FD9\u4E2A guid \u7684\u6E05\u5355;\u591A\u4E2A\u540C\u540D\u6E05\u5355\u65F6\u6D88\u6B67
132990
133014
  --owner <open_id> \u663E\u5F0F\u6307\u5B9A\u4EBA\u7C7B owner(\u4EC5\u521B\u5EFA\u8DEF\u5F84\u7528\u5230,adopt \u6A21\u5F0F\u4E0B\u4F60\u672C\u6765\u5C31\u662F
132991
133015
  owner,\u4E0D\u9700\u8981\u8FD9\u4E2A)
132992
133016
  --force \u8986\u76D6\u5171\u4EAB\u6CE8\u518C\u6587\u4EF6\u91CC\u5DF2\u6709\u7684 guid(\u9ED8\u8BA4\u4E0D\u8986\u76D6,\u907F\u514D\u8BEF\u64CD\u4F5C\u628A
132993
133017
  \u6574\u4E2A\u56E2\u961F\u5207\u5230\u4E00\u4E2A\u65B0\u677F)
132994
133018
 
132995
- \u2500\u2500 adopt \u6A21\u5F0F\u5185\u90E8\u6B65\u9AA4(\u81EA\u52A8\u9009\u4E2D,\u6216\u663E\u5F0F --adopt/--adopt-guid \u89E6\u53D1)\u2500\u2500
133019
+ \u2500\u2500 \u5220\u9664/\u6E05\u7406(\u6682\u65E0\u81EA\u52A8\u5B50\u547D\u4EE4)\u2500\u2500
133020
+ \u96F6\u53C2\u6570\u521B\u5EFA\u7684\u6E05\u5355 owner \u662F bot app,\u4F60\u7684\u7528\u6237\u8EAB\u4EFD\u5220\u4E0D\u6389\u5B83\u3002\u8981\u5220\u9664\u672C\u673A\u6CE8\u518C\u7684\u6E05\u5355:
133021
+ \u7528\u521B\u5EFA\u5B83\u7684 bot \u7684 app \u51ED\u8BC1(bridge \u81EA\u5DF1\u7528\u7684\u90A3\u5957,tenant_access_token)\u8C03
133022
+ \`DELETE /open-apis/task/v2/tasklists/{guid}\`(guid \u89C1 <LARKWAY_HOME>/task-team.json),
133023
+ \u518D\u5220\u6389\u672C\u673A\u72B6\u6001\u6587\u4EF6:task-team.json\u3001candidate-alerts-<guid>.json\u3001\u5404 bot \u7684
133024
+ task-handles.json \u91CC\u5BF9\u5E94\u8BB0\u5F55\u3002(\u81EA\u52A8 --delete \u5B50\u547D\u4EE4\u6309\u9700\u518D\u52A0\u3002)
133025
+
133026
+ \u2500\u2500 adopt \u6A21\u5F0F\u5185\u90E8\u6B65\u9AA4(\u4EC5\u663E\u5F0F --adopt/--adopt-guid \u89E6\u53D1)\u2500\u2500
132996
133027
  1. \u4EE5\u4F60(\u64CD\u4F5C\u8005)\u7684\u7528\u6237\u8EAB\u4EFD\u6309\u540D\u5B57\u7CBE\u786E\u5339\u914D\u4F60\u80FD\u770B\u5230\u7684\u6E05\u5355(\u91CD\u540D \u2192 \u62A5\u9519\u5217\u51FA\u5168\u90E8
132997
- guid,\u8BA9\u4F60\u52A0 --adopt-guid <guid> \u6D88\u6B67\u91CD\u8DD1;\u4E00\u4E2A\u90FD\u627E\u4E0D\u5230 \u2192 \u81EA\u52A8\u6A21\u5F0F\u4E0B\u9759\u9ED8\u56DE\u9000
132998
- \u521B\u5EFA\u8DEF\u5F84,\u663E\u5F0F --adopt \u4E0B\u62A5\u9519\u63D0\u793A\u5148\u53BB\u4EFB\u52A1\u4E2D\u5FC3\u5EFA\u4E00\u4E2A)
133028
+ guid,\u8BA9\u4F60\u52A0 --adopt-guid <guid> \u6D88\u6B67\u91CD\u8DD1;\u4E00\u4E2A\u90FD\u627E\u4E0D\u5230 \u2192 \u62A5\u9519\u63D0\u793A\u5148\u53BB\u4EFB\u52A1
133029
+ \u4E2D\u5FC3\u5EFA\u4E00\u4E2A,\u7EDD\u4E0D\u9759\u9ED8\u521B\u5EFA)
132999
133030
  2. \u628A\u6BCF\u4E2A bot \u7684 app \u52A0\u4E3A\u6E05\u5355\u6210\u5458(role=editor,\u5E42\u7B49,\u5DF2\u662F\u6210\u5458\u7684\u8DF3\u8FC7/\u65E0\u5BB3\u91CD\u590D)
133000
133031
  3. \u5199\u5165\u5171\u4EAB\u6CE8\u518C\u6587\u4EF6 <LARKWAY_HOME>/task-team.json(\u4E0E\u521B\u5EFA\u8DEF\u5F84\u540C\u4E00\u5957
133001
133032
  first-writer-wins / --force \u8986\u76D6\u8BED\u4E49)
@@ -133105,25 +133136,12 @@ async function run10(ctx, args) {
133105
133136
  loginHint
133106
133137
  });
133107
133138
  }
133108
- const autoTarget = resolveAdoptTarget(creatorProfile, name, void 0, loginHint);
133109
- if (autoTarget.ok) {
133110
- return runAdoptWithGuid(ctx, {
133111
- guid: autoTarget.guid,
133112
- matchedName: autoTarget.matchedName,
133113
- bots,
133114
- force,
133115
- creatorProfile,
133116
- loginHint
133117
- });
133118
- }
133119
- if (autoTarget.reason === "ambiguous") {
133120
- if (ctx.flags.json) ctx.ui.emitJson({ ok: false, error: autoTarget.message });
133121
- else ctx.ui.failure(autoTarget.message);
133122
- return 1;
133123
- }
133124
133139
  if (!ctx.flags.json) {
133125
- const why = autoTarget.reason === "list-failed" ? "\u65E0\u6CD5\u4EE5\u4F60\u7684\u7528\u6237\u8EAB\u4EFD\u67E5\u8BE2\u6E05\u5355" : `\u6CA1\u627E\u5230\u540C\u540D\u6E05\u5355 "${name}"`;
133126
- ctx.ui.print(ctx.ui.dim(`(${why},\u56DE\u9000\u5230\u7528 bot app \u8EAB\u4EFD\u521B\u5EFA/\u590D\u7528\u6E05\u5355\u2014\u2014\u5982\u9700\u5F3A\u5236 adopt \u89C1 --adopt)`));
133140
+ ctx.ui.print(
133141
+ ctx.ui.dim(
133142
+ `(\u7528 bot app \u8EAB\u4EFD\u521B\u5EFA/\u590D\u7528\u6E05\u5355 "${name}"\u3002\u60F3\u8BA4\u9886\u4F60\u81EA\u5DF1\u5728\u4EFB\u52A1\u4E2D\u5FC3\u5EFA\u7684\u6E05\u5355\u8BF7\u7528 --adopt "<\u6E05\u5355\u540D>" / --adopt-guid <guid>;\u591A\u56E2\u961F\u90E8\u7F72\u5EFA\u8BAE\u7528 --name \u6539\u540D\u9694\u79BB\u3002)`
133143
+ )
133144
+ );
133127
133145
  }
133128
133146
  const ownerOpenId = explicitOwner ?? resolveOwnerOpenId(creatorProfile);
133129
133147
  if (!ownerOpenId) {
@@ -133135,7 +133153,11 @@ async function run10(ctx, args) {
133135
133153
  }
133136
133154
  return 1;
133137
133155
  }
133138
- const sdkClient = new import_node_sdk2.Client({ appId: creator.app_id, appSecret: creator.appSecret });
133156
+ const sdkClient = new import_node_sdk2.Client({
133157
+ appId: creator.app_id,
133158
+ appSecret: creator.appSecret,
133159
+ loggerLevel: import_node_sdk2.LoggerLevel.fatal
133160
+ });
133139
133161
  const requester = {
133140
133162
  request: (config) => sdkClient.request(config)
133141
133163
  };
@@ -133154,13 +133176,22 @@ async function run10(ctx, args) {
133154
133176
  try {
133155
133177
  await taskClient.addTasklistMembers(tasklistGuid, members);
133156
133178
  } catch (err2) {
133157
- const msg = `\u590D\u7528\u5DF2\u6709\u6E05\u5355 ${tasklistGuid} \u65F6\u8865\u5145\u6210\u5458\u5931\u8D25: ${err2 instanceof Error ? err2.message : String(err2)}`;
133158
- if (ctx.flags.json) ctx.ui.emitJson({ ok: false, error: msg });
133159
- else {
133160
- ctx.ui.failure(msg);
133161
- ctx.ui.print("\u5E38\u89C1\u539F\u56E0:app \u672A\u5728\u5F00\u653E\u5E73\u53F0\u540E\u53F0\u52FE\u9009 task:tasklist:write / task:task:write scope(\u89C1 docs/task-handle.md \xA77)\u3002");
133179
+ const errMsg = err2 instanceof Error ? err2.message : String(err2);
133180
+ if (isMembersEndpoint404(err2)) {
133181
+ if (!ctx.flags.json) {
133182
+ ctx.ui.warning(
133183
+ `\u590D\u7528\u6E05\u5355 ${tasklistGuid} \u65F6 add_members \u8FD4\u56DE 404(app \u7C7B\u578B\u6210\u5458\u7AEF\u70B9\u4E0D\u652F\u6301\u81EA\u52A9\u52A0\u5165,bot \u901A\u5E38\u5DF2\u7ECF\u662F\u6210\u5458)\u2014\u2014\u5DF2\u5FFD\u7565,\u4E0D\u5F71\u54CD\u4F7F\u7528(\u4E0E bridge \u542F\u52A8\u7684\u81EA\u52A9\u52A0\u5165\u540C\u6B3E\u964D\u7EA7)\u3002`
133184
+ );
133185
+ }
133186
+ } else {
133187
+ const msg = `\u590D\u7528\u5DF2\u6709\u6E05\u5355 ${tasklistGuid} \u65F6\u8865\u5145\u6210\u5458\u5931\u8D25: ${errMsg}`;
133188
+ if (ctx.flags.json) ctx.ui.emitJson({ ok: false, error: msg });
133189
+ else {
133190
+ ctx.ui.failure(msg);
133191
+ ctx.ui.print("\u5E38\u89C1\u539F\u56E0:app \u672A\u5728\u5F00\u653E\u5E73\u53F0\u540E\u53F0\u52FE\u9009 task:tasklist:write / task:task:write scope(\u89C1 docs/task-handle.md \xA77)\u3002");
133192
+ }
133193
+ return 1;
133162
133194
  }
133163
- return 1;
133164
133195
  }
133165
133196
  } else {
133166
133197
  reused = false;
@@ -133217,8 +133248,10 @@ async function run10(ctx, args) {
133217
133248
  } else {
133218
133249
  ctx.ui.success(`\u6E05\u5355 "${name}" \u5DF2\u521B\u5EFA: ${tasklistGuid}`);
133219
133250
  }
133220
- ctx.ui.print(`owner \u6210\u5458: ${ownerOpenId}${explicitOwner ? "" : "(\u4ECE lark-cli \u5F53\u524D\u767B\u5F55\u7528\u6237\u81EA\u52A8\u89E3\u6790)"}`);
133221
- ctx.ui.print(`\u5DF2\u52A0\u5165\u6210\u5458(editor): ${bots.map((b) => b.id).join(", ")}`);
133251
+ ctx.ui.print(
133252
+ `\u4F60(${ownerOpenId})\u5DF2\u4F5C\u4E3A editor \u52A0\u5165${explicitOwner ? "" : "(open_id \u4ECE lark-cli \u5F53\u524D\u767B\u5F55\u7528\u6237\u81EA\u52A8\u89E3\u6790)"} \u2014\u2014 \u6E05\u5355 owner \u662F\u521B\u5EFA\u5B83\u7684 bot app;\u4F60\u662F editor \u6210\u5458(\u53EF\u5728\u4EFB\u52A1\u4E2D\u5FC3\u770B\u5230\u5E76\u7F16\u8F91)\u3002`
133253
+ );
133254
+ ctx.ui.print(`\u5DF2\u52A0\u5165(editor)\u7684 bot: ${bots.map((b) => b.id).join(", ")}`);
133222
133255
  ctx.ui.print("");
133223
133256
  if (!reused) {
133224
133257
  ctx.ui.print(
@@ -133237,16 +133270,22 @@ async function run10(ctx, args) {
133237
133270
  );
133238
133271
  return 0;
133239
133272
  }
133273
+ function isMembersEndpoint404(err2) {
133274
+ if (err2 instanceof TaskApiError) {
133275
+ return err2.status === 404 && err2.code === void 0;
133276
+ }
133277
+ return /page not found/i.test(err2 instanceof Error ? err2.message : String(err2));
133278
+ }
133240
133279
  function resolveAdoptTarget(creatorProfile, name, explicitGuid, loginHint) {
133241
133280
  if (explicitGuid) {
133242
133281
  return { ok: true, guid: explicitGuid, matchedName: name };
133243
133282
  }
133244
- const listResult = listUserTasklists(creatorProfile);
133283
+ const listResult = searchUserTasklists(creatorProfile, name);
133245
133284
  if (!listResult.ok) {
133246
133285
  return {
133247
133286
  ok: false,
133248
133287
  reason: "list-failed",
133249
- message: `\u65E0\u6CD5\u4EE5\u4F60\u7684\u7528\u6237\u8EAB\u4EFD\u5217\u51FA\u6E05\u5355:${listResult.error}
133288
+ message: `\u65E0\u6CD5\u4EE5\u4F60\u7684\u7528\u6237\u8EAB\u4EFD\u67E5\u8BE2\u6E05\u5355:${listResult.error}
133250
133289
 
133251
133290
  \u8BF7\u5148\u786E\u8BA4\u5DF2\u7528\u8FD9\u4E2A profile \u767B\u5F55\u8FC7\u7528\u6237\u8EAB\u4EFD\u3001\u4E14\u7533\u8BF7\u4E86 task \u57DF\u6743\u9650:
133252
133291
  ${loginHint}
package/dist/main.js CHANGED
@@ -24969,13 +24969,13 @@ var require_lib2 = __commonJS({
24969
24969
  Domain[Domain["Lark"] = 1] = "Lark";
24970
24970
  })(exports.Domain || (exports.Domain = {}));
24971
24971
  exports.LoggerLevel = void 0;
24972
- (function(LoggerLevel) {
24973
- LoggerLevel[LoggerLevel["fatal"] = 0] = "fatal";
24974
- LoggerLevel[LoggerLevel["error"] = 1] = "error";
24975
- LoggerLevel[LoggerLevel["warn"] = 2] = "warn";
24976
- LoggerLevel[LoggerLevel["info"] = 3] = "info";
24977
- LoggerLevel[LoggerLevel["debug"] = 4] = "debug";
24978
- LoggerLevel[LoggerLevel["trace"] = 5] = "trace";
24972
+ (function(LoggerLevel2) {
24973
+ LoggerLevel2[LoggerLevel2["fatal"] = 0] = "fatal";
24974
+ LoggerLevel2[LoggerLevel2["error"] = 1] = "error";
24975
+ LoggerLevel2[LoggerLevel2["warn"] = 2] = "warn";
24976
+ LoggerLevel2[LoggerLevel2["info"] = 3] = "info";
24977
+ LoggerLevel2[LoggerLevel2["debug"] = 4] = "debug";
24978
+ LoggerLevel2[LoggerLevel2["trace"] = 5] = "trace";
24979
24979
  })(exports.LoggerLevel || (exports.LoggerLevel = {}));
24980
24980
  var CEventType = /* @__PURE__ */ Symbol("event-type");
24981
24981
  var CTenantKey = /* @__PURE__ */ Symbol("tenant-key");
@@ -131669,7 +131669,11 @@ async function runV2Mode({
131669
131669
  {
131670
131670
  const guid = bot.taskHandle?.tasklistGuid ?? await readTeamTasklistGuid(resolveTaskTeamRegistryPath());
131671
131671
  if (guid) {
131672
- const taskSdkClient = new import_node_sdk2.Client({ appId: bot.app_id, appSecret });
131672
+ const taskSdkClient = new import_node_sdk2.Client({
131673
+ appId: bot.app_id,
131674
+ appSecret,
131675
+ loggerLevel: import_node_sdk2.LoggerLevel.fatal
131676
+ });
131673
131677
  const taskRequester = {
131674
131678
  request: (config2) => taskSdkClient.request(config2)
131675
131679
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "larkway",
3
- "version": "0.3.35",
3
+ "version": "0.3.36",
4
4
  "description": "Thin bridge: Feishu thread to local Claude Code CLI",
5
5
  "license": "MIT",
6
6
  "author": "Chuck Wu (chuckwu0)",