larkway 0.3.44 → 0.3.46

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.44**
11
+ **Current release: v0.3.46**
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.44**
11
+ **当前版本:v0.3.46**
12
12
 
13
13
  ---
14
14
 
package/dist/cli/index.js CHANGED
@@ -127910,6 +127910,9 @@ async function checkClaude(ctx) {
127910
127910
  };
127911
127911
  }
127912
127912
  async function checkLarkCli() {
127913
+ if (process.env.LARKWAY_SKIP_BINARY_PROBES === "1") {
127914
+ return { id: "lark-cli-binary", label: "lark-cli", status: "ok", message: "\u63A2\u6D4B\u5DF2\u8DF3\u8FC7(LARKWAY_SKIP_BINARY_PROBES=1)" };
127915
+ }
127913
127916
  try {
127914
127917
  await execFileAsync4("lark-cli", ["--version"], { timeout: 1e4 });
127915
127918
  return { id: "lark-cli-binary", label: "lark-cli", status: "ok" };
@@ -821,9 +821,11 @@ function modelSuggestionsForBackend(backendId) {
821
821
  ];
822
822
  }
823
823
  return [
824
- ["fable", "fable"],
825
- ["opus", "opus"],
826
- ["sonnet", "sonnet"],
824
+ ["claude-sonnet-5", "claude-sonnet-5 · Sonnet 5,快/省"],
825
+ ["claude-opus-4-8", "claude-opus-4-8 · Opus 4.8"],
826
+ ["claude-fable-5", "claude-fable-5 · Fable 5,最强"],
827
+ ["sonnet", "sonnet · 别名=最新 Sonnet"],
828
+ ["opus", "opus · 别名=最新 Opus"],
827
829
  ];
828
830
  }
829
831
 
@@ -875,10 +877,23 @@ function buildModelEffortHTML(bot) {
875
877
  `<select id="ac-effort" name="effort" class="ac-input" style="width:150px">${effortOptionsHTML(effortVal, backendId)}</select>` +
876
878
  `</span>` +
877
879
  `</div>` +
880
+ // 常驻快选 chips:datalist 会按当前输入值过滤建议(输入框已填某个模型时,
881
+ // 下拉只剩它自己,像"选项丢了"——2026-07-08 mini 实测用户困惑),chips 不受
882
+ // 输入值影响,永远列出全部建议;点一下=填入并触发 input(保存 dirty 检测)。
883
+ `<div id="ac-model-chips" style="margin-top:8px;display:flex;gap:6px;flex-wrap:wrap">${modelChipsHTML(backendId)}</div>` +
878
884
  `</div>`
879
885
  );
880
886
  }
881
887
 
888
+ /** 常驻模型快选 chips 的 HTML(见 buildModelEffortHTML 里的调用注释)。 */
889
+ function modelChipsHTML(backendId) {
890
+ return modelSuggestionsForBackend(backendId)
891
+ .map(([v, label]) =>
892
+ `<button type="button" class="ac-model-chip" data-model-value="${esc(v)}" title="${esc(label)}" ` +
893
+ `style="font-size:12px;padding:3px 10px;border:1px solid var(--border);border-radius:999px;background:var(--bg,transparent);cursor:pointer">${esc(v)}</button>`)
894
+ .join("");
895
+ }
896
+
882
897
  /**
883
898
  * 底座切换时实时刷新 model 建议项 + effort 选项的措辞。effort 两家底座都生效
884
899
  * (见 effortOptionsHTML 顶部注释),这里只换 label,不再隐藏控件。
@@ -892,6 +907,8 @@ function refreshModelEffortForBackend(panel, backendId) {
892
907
  .map(([v, label]) => `<option value="${esc(v)}">${esc(label)}</option>`)
893
908
  .join("");
894
909
  }
910
+ const chips = panel.querySelector("#ac-model-chips");
911
+ if (chips) chips.innerHTML = modelChipsHTML(backendId);
895
912
  const effortSelect = panel.querySelector("#ac-effort");
896
913
  if (effortSelect) {
897
914
  const currentVal = effortSelect.value;
@@ -3537,6 +3554,17 @@ function wireDetailEvents(panel, id, bot) {
3537
3554
  state.formDirty = acFormSnapshot(panel) !== panel._acBaseline;
3538
3555
  updateFormDirty(panel);
3539
3556
  });
3557
+
3558
+ // 模型快选 chips:点一下 = 填入 model 输入框(委托监听,chips 会随底座
3559
+ // 切换整体重渲染);dispatch input 让上面的脏检测同一条路生效。
3560
+ bkCard.addEventListener("click", (e) => {
3561
+ const chip = e.target instanceof Element ? e.target.closest(".ac-model-chip") : null;
3562
+ if (!chip) return;
3563
+ const input = panel.querySelector("#ac-model");
3564
+ if (!(input instanceof HTMLInputElement)) return;
3565
+ input.value = chip.getAttribute("data-model-value") ?? "";
3566
+ input.dispatchEvent(new Event("input", { bubbles: true }));
3567
+ });
3540
3568
  }
3541
3569
 
3542
3570
  // 详情 hero 删除按钮
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "larkway",
3
- "version": "0.3.44",
3
+ "version": "0.3.46",
4
4
  "description": "Thin bridge: Feishu thread to local Claude Code CLI",
5
5
  "license": "MIT",
6
6
  "author": "Chuck Wu (chuckwu0)",