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 +1 -1
- package/README.zh.md +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/web/public/app.js +31 -3
- package/package.json +1 -1
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.
|
|
11
|
+
**Current release: v0.3.46**
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
package/README.zh.md
CHANGED
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" };
|
package/dist/web/public/app.js
CHANGED
|
@@ -821,9 +821,11 @@ function modelSuggestionsForBackend(backendId) {
|
|
|
821
821
|
];
|
|
822
822
|
}
|
|
823
823
|
return [
|
|
824
|
-
["
|
|
825
|
-
["opus", "opus"],
|
|
826
|
-
["
|
|
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 删除按钮
|