dsh-packycode-api 1.3.6 → 1.3.8
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/CHANGELOG.md +19 -0
- package/README.en.md +58 -8
- package/README.md +58 -8
- package/lib/client.js +225 -7
- package/lib/index.js +4576 -3593
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -157,6 +157,9 @@ window.__ModuleLoader__.load({
|
|
|
157
157
|
cliUpdating: "正在更新…(通常需要一两分钟,请勿关闭 DSH)",
|
|
158
158
|
cliUpdateCommand: "将在本机执行:{command}",
|
|
159
159
|
cliUpdateSucceeded: "已更新到 {version}。",
|
|
160
|
+
cliUpdateUnchanged: "更新命令已执行,版本仍是 {version}。",
|
|
161
|
+
cliUpdateAvailable: "有新版本 {latest},可以更新。当前版本仍可正常使用。",
|
|
162
|
+
cliUpdateNotUpdated: "更新命令已执行,但版本仍是 {version},最新版是 {latest}。请在终端执行 {command},看它给出的提示(例如用 Homebrew 安装的要执行 brew upgrade claude-code),然后点「重新检测」。当前版本仍可正常使用。",
|
|
160
163
|
cliUpdateFailed: "更新失败",
|
|
161
164
|
cliUpdateNotInstalled: "没有找到要更新的 CLI,请点「重新检测」。",
|
|
162
165
|
cliUpdateStillOutdated: "更新命令已执行,但版本仍低于 {minVersion}。请在终端执行 {command},看它给出的提示(例如用 Homebrew 安装的要执行 brew upgrade claude-code),然后点「重新检测」。",
|
|
@@ -237,7 +240,28 @@ window.__ModuleLoader__.load({
|
|
|
237
240
|
searchOverridden: "基础搜索现在是 {base},不是 PackyCode:可能还在热加载,或被其他插件的补丁覆盖。",
|
|
238
241
|
searchUnavailable: "当前运行环境没有 DSH 网页搜索服务,搜索路由暂不生效。",
|
|
239
242
|
searchNotWritable: "当前 profile 不允许写入设置。",
|
|
240
|
-
searchUnknown: "未知"
|
|
243
|
+
searchUnknown: "未知",
|
|
244
|
+
reviewTitle: "自动审查",
|
|
245
|
+
reviewIntro: "DSH 自带的「自动授权审查」插件会在输入框的权限菜单里加入「自动审查」:每次工具调用前先让模型审查,放行的直接执行,拒绝的改为请你批准。它默认用当前对话的模型审查;本插件可以让它改用下面选择的模型,审查内容、规则和结果处理都保持官方原样。",
|
|
246
|
+
reviewChecking: "正在读取自动审查设置…",
|
|
247
|
+
reviewLoadFailed: "自动审查设置读取或保存失败",
|
|
248
|
+
reviewOfficialOn: "官方自动审查已开启",
|
|
249
|
+
reviewOfficialOff: "官方自动审查未开启",
|
|
250
|
+
reviewEnableHint: "还没有开启:在 DSH 左侧「插件」页找到「自动授权审查」并开启,然后在输入框的权限菜单里选「自动审查」。",
|
|
251
|
+
reviewModelTitle: "审查模型",
|
|
252
|
+
reviewModelJev: "jev-latest",
|
|
253
|
+
reviewModelFlash: "DeepSeek Flash",
|
|
254
|
+
reviewModelSession: "跟随对话模型",
|
|
255
|
+
reviewModelJevHint: "TypeSafe 的决策分类模型,一次约 0.4 秒,只按输入计费;拒绝时只给出风险等级。需要 Key 的分组包含 typesafe-officially。",
|
|
256
|
+
reviewModelFlashHint: "一次约 2 秒,拒绝时写明原因。需要 Key 的分组包含 deepseek-officially。",
|
|
257
|
+
reviewModelSessionHint: "不接管,按官方默认由当前对话的模型审查。",
|
|
258
|
+
reviewUncovered: "已保存的 Key 都不在 {model} 所需的分组里:审查会失败,官方会因此拒绝每次工具调用。请换一个审查模型,或添加分组包含它的 Key。",
|
|
259
|
+
reviewCounts: "本次启动以来本插件处理了 {reviewed} 次审查:放行 {allowed},拒绝 {denied},失败 {failed}。",
|
|
260
|
+
reviewLast: "最近一次:{tool} · {outcome} · {model} · {seconds} 秒",
|
|
261
|
+
reviewOutcomeAllowed: "放行",
|
|
262
|
+
reviewOutcomeDenied: "拒绝",
|
|
263
|
+
reviewOutcomeFailed: "失败",
|
|
264
|
+
reviewMenuNote: "权限菜单里「自动审查」的说明写的是「由同一模型审查」,那是 DSH 的文字;选了 jev-latest 或 DeepSeek Flash 时,实际由所选模型审查。审查失败时,官方会拒绝这次调用,不会执行。"
|
|
241
265
|
};
|
|
242
266
|
const en = {
|
|
243
267
|
nav: "PackyCode",
|
|
@@ -369,6 +393,9 @@ window.__ModuleLoader__.load({
|
|
|
369
393
|
cliUpdating: "Updating… (usually a minute or two; keep DSH open)",
|
|
370
394
|
cliUpdateCommand: "Runs on this device: {command}",
|
|
371
395
|
cliUpdateSucceeded: "Updated to {version}.",
|
|
396
|
+
cliUpdateUnchanged: "The update ran; the version is still {version}.",
|
|
397
|
+
cliUpdateAvailable: "Version {latest} is available. The installed version keeps working until you update.",
|
|
398
|
+
cliUpdateNotUpdated: "The update ran, but the version is still {version} and the latest is {latest}. Run {command} in a terminal and follow what it says (for a Homebrew install, brew upgrade claude-code), then click Check again. The installed version keeps working.",
|
|
372
399
|
cliUpdateFailed: "Update failed",
|
|
373
400
|
cliUpdateNotInstalled: "No CLI was found to update. Click Check again.",
|
|
374
401
|
cliUpdateStillOutdated: "The update ran, but the version is still below {minVersion}. Run {command} in a terminal and follow what it says (for a Homebrew install, brew upgrade claude-code), then click Check again.",
|
|
@@ -441,7 +468,28 @@ window.__ModuleLoader__.load({
|
|
|
441
468
|
searchOverridden: "The base search is {base}, not PackyCode: the reload may still be running, or another plugin’s patch overrides it.",
|
|
442
469
|
searchUnavailable: "This runtime has no DSH web search service; search routing has no effect.",
|
|
443
470
|
searchNotWritable: "This profile does not allow settings writes.",
|
|
444
|
-
searchUnknown: "unknown"
|
|
471
|
+
searchUnknown: "unknown",
|
|
472
|
+
reviewTitle: "Auto review",
|
|
473
|
+
reviewIntro: "DSH’s built-in “Auto authorization review” plugin adds Auto review to the composer’s permission menu: before each tool call a model reviews it; calls it allows run at once, calls it denies ask for your approval. It reviews with the conversation’s own model by default; this plugin can make it use the model chosen below, while what is reviewed, the rules and the outcomes stay exactly the official ones.",
|
|
474
|
+
reviewChecking: "Reading the auto review preference…",
|
|
475
|
+
reviewLoadFailed: "Could not read or save the auto review preference",
|
|
476
|
+
reviewOfficialOn: "Official auto review is on",
|
|
477
|
+
reviewOfficialOff: "Official auto review is off",
|
|
478
|
+
reviewEnableHint: "Not on yet: open DSH’s Plugins page in the sidebar, switch on “Auto authorization review”, then pick Auto review in the composer’s permission menu.",
|
|
479
|
+
reviewModelTitle: "Reviewer",
|
|
480
|
+
reviewModelJev: "jev-latest",
|
|
481
|
+
reviewModelFlash: "DeepSeek Flash",
|
|
482
|
+
reviewModelSession: "Conversation model",
|
|
483
|
+
reviewModelJevHint: "TypeSafe’s decision classifier: about 0.4 s per review, billed by input only; a denial names only the risk level. Needs a key whose group includes typesafe-officially.",
|
|
484
|
+
reviewModelFlashHint: "About 2 s per review, and a denial says why. Needs a key whose group includes deepseek-officially.",
|
|
485
|
+
reviewModelSessionHint: "Leave the review alone: the conversation’s own model reviews, as DSH does by default.",
|
|
486
|
+
reviewUncovered: "No stored key is in a group that serves {model}: reviews will fail, and DSH then refuses every tool call. Pick another reviewer, or add a key whose group includes it.",
|
|
487
|
+
reviewCounts: "Since this start the plugin answered {reviewed} reviews: {allowed} allowed, {denied} denied, {failed} failed.",
|
|
488
|
+
reviewLast: "Last: {tool} · {outcome} · {model} · {seconds} s",
|
|
489
|
+
reviewOutcomeAllowed: "allowed",
|
|
490
|
+
reviewOutcomeDenied: "denied",
|
|
491
|
+
reviewOutcomeFailed: "failed",
|
|
492
|
+
reviewMenuNote: "The description under Auto review in the permission menu comes from DSH and says the same model reviews; with jev-latest or DeepSeek Flash chosen here, that model reviews. When a review fails, DSH refuses the call instead of running it."
|
|
445
493
|
};
|
|
446
494
|
//#endregion
|
|
447
495
|
//#region src/client-style.js
|
|
@@ -1876,6 +1924,8 @@ window.__ModuleLoader__.load({
|
|
|
1876
1924
|
const SEARCH_SETTLE_MS = 1500;
|
|
1877
1925
|
/** While the CLI installs, the panel polls its status this often. */
|
|
1878
1926
|
const INSTALL_POLL_MS = 2e3;
|
|
1927
|
+
/** The auto review counts are re-read this often while the page is open. */
|
|
1928
|
+
const REVIEW_POLL_MS = 5e3;
|
|
1879
1929
|
const CLAUDE_MODELS = [
|
|
1880
1930
|
"claude-opus-5-5",
|
|
1881
1931
|
"claude-sonnet-5-5",
|
|
@@ -1903,7 +1953,8 @@ window.__ModuleLoader__.load({
|
|
|
1903
1953
|
"claude-opus-5-5",
|
|
1904
1954
|
"claude-sonnet-5-5",
|
|
1905
1955
|
"claude-haiku-5-5"
|
|
1906
|
-
]]
|
|
1956
|
+
]],
|
|
1957
|
+
["Jev", ["jev-latest"]]
|
|
1907
1958
|
];
|
|
1908
1959
|
/**
|
|
1909
1960
|
* The one way this bundle talks to the host. The transport drops an
|
|
@@ -2583,6 +2634,145 @@ window.__ModuleLoader__.load({
|
|
|
2583
2634
|
]
|
|
2584
2635
|
});
|
|
2585
2636
|
}
|
|
2637
|
+
const REVIEW_OUTCOMES = {
|
|
2638
|
+
allowed: "reviewOutcomeAllowed",
|
|
2639
|
+
denied: "reviewOutcomeDenied",
|
|
2640
|
+
failed: "reviewOutcomeFailed"
|
|
2641
|
+
};
|
|
2642
|
+
const REVIEW_LABELS = {
|
|
2643
|
+
"jev-latest": "reviewModelJev",
|
|
2644
|
+
"deepseek-flash": "reviewModelFlash",
|
|
2645
|
+
session: "reviewModelSession"
|
|
2646
|
+
};
|
|
2647
|
+
const REVIEW_HINTS = {
|
|
2648
|
+
"jev-latest": "reviewModelJevHint",
|
|
2649
|
+
"deepseek-flash": "reviewModelFlashHint",
|
|
2650
|
+
session: "reviewModelSessionHint"
|
|
2651
|
+
};
|
|
2652
|
+
/** Which model DSH's official auto review uses; the official plugin owns the rest. */
|
|
2653
|
+
function AutoReviewCard({ call, t }) {
|
|
2654
|
+
const [state, setState] = react.useState();
|
|
2655
|
+
const [groups, setGroups] = react.useState();
|
|
2656
|
+
const [busy, setBusy] = react.useState(false);
|
|
2657
|
+
const [error, setError] = react.useState();
|
|
2658
|
+
const generation = react.useRef(0);
|
|
2659
|
+
const read = react.useCallback(() => {
|
|
2660
|
+
const current = ++generation.current;
|
|
2661
|
+
return call("auto-review/status").then((value) => {
|
|
2662
|
+
if (generation.current === current) setState(value);
|
|
2663
|
+
}).catch((failure) => {
|
|
2664
|
+
if (generation.current === current) setError(clearMessage(failure));
|
|
2665
|
+
});
|
|
2666
|
+
}, [call]);
|
|
2667
|
+
react.useEffect(() => {
|
|
2668
|
+
let live = true;
|
|
2669
|
+
read();
|
|
2670
|
+
call("groups").then((value) => {
|
|
2671
|
+
if (live) setGroups(value);
|
|
2672
|
+
}).catch(() => void 0);
|
|
2673
|
+
const timer = window.setInterval(read, REVIEW_POLL_MS);
|
|
2674
|
+
return () => {
|
|
2675
|
+
live = false;
|
|
2676
|
+
generation.current += 1;
|
|
2677
|
+
window.clearInterval(timer);
|
|
2678
|
+
};
|
|
2679
|
+
}, [call, read]);
|
|
2680
|
+
const update = (patch) => {
|
|
2681
|
+
if (busy || state?.writable !== true) return;
|
|
2682
|
+
setBusy(true);
|
|
2683
|
+
setError(void 0);
|
|
2684
|
+
generation.current += 1;
|
|
2685
|
+
call("auto-review/update", patch).then((value) => setState(value)).catch((failure) => setError(clearMessage(failure))).finally(() => setBusy(false));
|
|
2686
|
+
};
|
|
2687
|
+
const label = (id) => REVIEW_LABELS[id] === void 0 ? id : t(REVIEW_LABELS[id]);
|
|
2688
|
+
const model = state?.model;
|
|
2689
|
+
const enabled = state?.official?.enabled === true;
|
|
2690
|
+
const keys = groups?.keys ?? [];
|
|
2691
|
+
const uncovered = model !== void 0 && model !== "session" && keys.length > 0 && keys.every((entry) => entry.coverage?.[model] === false);
|
|
2692
|
+
const counts = state?.counts;
|
|
2693
|
+
const last = state?.last;
|
|
2694
|
+
const disabled = busy || state?.writable !== true;
|
|
2695
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Card, {
|
|
2696
|
+
title: t("reviewTitle"),
|
|
2697
|
+
aside: state !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
2698
|
+
className: "pkc-chip",
|
|
2699
|
+
"data-tone": enabled ? "success" : "neutral",
|
|
2700
|
+
children: enabled ? t("reviewOfficialOn") : t("reviewOfficialOff")
|
|
2701
|
+
}),
|
|
2702
|
+
children: [
|
|
2703
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2704
|
+
className: "pkc-note",
|
|
2705
|
+
children: t("reviewIntro")
|
|
2706
|
+
}),
|
|
2707
|
+
state === void 0 && error === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2708
|
+
className: "pkc-note",
|
|
2709
|
+
role: "status",
|
|
2710
|
+
children: t("reviewChecking")
|
|
2711
|
+
}),
|
|
2712
|
+
state !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
2713
|
+
!enabled && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2714
|
+
className: "pkc-warn",
|
|
2715
|
+
children: t("reviewEnableHint")
|
|
2716
|
+
}),
|
|
2717
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
2718
|
+
className: "pkc-setting",
|
|
2719
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
2720
|
+
className: "pkc-label",
|
|
2721
|
+
children: t("reviewModelTitle")
|
|
2722
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Segmented, {
|
|
2723
|
+
label: t("reviewModelTitle"),
|
|
2724
|
+
value: model,
|
|
2725
|
+
disabled,
|
|
2726
|
+
onChange: (value) => update({ autoReviewModel: value }),
|
|
2727
|
+
options: (state.models ?? []).map((entry) => ({
|
|
2728
|
+
value: entry.id,
|
|
2729
|
+
label: label(entry.id)
|
|
2730
|
+
}))
|
|
2731
|
+
}), REVIEW_HINTS[model] !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2732
|
+
className: "pkc-note",
|
|
2733
|
+
children: t(REVIEW_HINTS[model])
|
|
2734
|
+
})] })]
|
|
2735
|
+
}),
|
|
2736
|
+
uncovered && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2737
|
+
className: "pkc-warn",
|
|
2738
|
+
children: fill(t("reviewUncovered"), { model: label(model) })
|
|
2739
|
+
}),
|
|
2740
|
+
counts !== void 0 && counts.reviewed > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
2741
|
+
className: "pkc-status",
|
|
2742
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
2743
|
+
className: "pkc-dot",
|
|
2744
|
+
"data-tone": counts.failed > 0 ? "warn" : "success"
|
|
2745
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
2746
|
+
className: "pkc-meta",
|
|
2747
|
+
children: fill(t("reviewCounts"), counts)
|
|
2748
|
+
})]
|
|
2749
|
+
}),
|
|
2750
|
+
last !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2751
|
+
className: "pkc-meta",
|
|
2752
|
+
children: fill(t("reviewLast"), {
|
|
2753
|
+
tool: last.tool ?? "",
|
|
2754
|
+
outcome: t(REVIEW_OUTCOMES[last.outcome] ?? "reviewOutcomeFailed"),
|
|
2755
|
+
model: last.version ?? label(last.model),
|
|
2756
|
+
seconds: typeof last.ms === "number" ? (last.ms / 1e3).toFixed(1) : "?"
|
|
2757
|
+
})
|
|
2758
|
+
}),
|
|
2759
|
+
state.writable !== true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2760
|
+
className: "pkc-note",
|
|
2761
|
+
children: t("searchNotWritable")
|
|
2762
|
+
}),
|
|
2763
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2764
|
+
className: "pkc-note",
|
|
2765
|
+
children: t("reviewMenuNote")
|
|
2766
|
+
})
|
|
2767
|
+
] }),
|
|
2768
|
+
error !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2769
|
+
className: "pkc-error",
|
|
2770
|
+
role: "alert",
|
|
2771
|
+
children: `${t("reviewLoadFailed")}: ${error}`
|
|
2772
|
+
})
|
|
2773
|
+
]
|
|
2774
|
+
});
|
|
2775
|
+
}
|
|
2586
2776
|
const INSTALL_FAILURES = {
|
|
2587
2777
|
"npm-missing": () => "cliNpmMissing",
|
|
2588
2778
|
permission: (cli) => cli.platform === "win32" ? "cliPermissionWindows" : "cliPermission",
|
|
@@ -2591,6 +2781,7 @@ window.__ModuleLoader__.load({
|
|
|
2591
2781
|
"not-found-after-install": () => "cliNotFoundAfterInstall",
|
|
2592
2782
|
"not-installed": () => "cliUpdateNotInstalled",
|
|
2593
2783
|
"still-outdated": () => "cliUpdateStillOutdated",
|
|
2784
|
+
"not-updated": () => "cliUpdateNotUpdated",
|
|
2594
2785
|
"broken-after-update": () => "cliUpdateBroken"
|
|
2595
2786
|
};
|
|
2596
2787
|
/** The sentence explaining a failed install or update, by the code the host classified. */
|
|
@@ -2599,12 +2790,15 @@ window.__ModuleLoader__.load({
|
|
|
2599
2790
|
const command = cli.install?.action === "update" ? cli.updateCommand : cli.command;
|
|
2600
2791
|
return key === void 0 ? void 0 : fill(t(key), {
|
|
2601
2792
|
command: command ?? "",
|
|
2602
|
-
minVersion: cli.minVersion ?? ""
|
|
2793
|
+
minVersion: cli.minVersion ?? "",
|
|
2794
|
+
version: cli.version ?? "",
|
|
2795
|
+
latest: cli.install?.latest ?? cli.latest ?? ""
|
|
2603
2796
|
});
|
|
2604
2797
|
}
|
|
2605
2798
|
/**
|
|
2606
2799
|
* Whether this device has the Claude Code CLI that Claude requests on cc
|
|
2607
|
-
* keys go through: an installer without one, an updater for one too old
|
|
2800
|
+
* keys go through: an installer without one, an updater for one too old or
|
|
2801
|
+
* behind npm's latest.
|
|
2608
2802
|
*/
|
|
2609
2803
|
function ClaudeCliCard({ call, t }) {
|
|
2610
2804
|
const [cli, setCli] = react.useState();
|
|
@@ -2642,6 +2836,7 @@ window.__ModuleLoader__.load({
|
|
|
2642
2836
|
};
|
|
2643
2837
|
const usable = cli?.installed === true && cli.version !== void 0;
|
|
2644
2838
|
const outdated = usable && cli.outdated === true;
|
|
2839
|
+
const updateAvailable = usable && !outdated && cli.updateAvailable === true;
|
|
2645
2840
|
const action = cli?.install?.action ?? "install";
|
|
2646
2841
|
const failed = cli?.install?.state === "failed";
|
|
2647
2842
|
const failure = cli === void 0 ? void 0 : installFailure(cli, t);
|
|
@@ -2691,8 +2886,27 @@ window.__ModuleLoader__.load({
|
|
|
2691
2886
|
}),
|
|
2692
2887
|
cli.install?.state === "succeeded" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2693
2888
|
className: "pkc-note",
|
|
2694
|
-
children: action === "update" ? fill(t("cliUpdateSucceeded"), { version: cli.install.to ?? cli.version }) : t("cliInstallSucceeded")
|
|
2695
|
-
})
|
|
2889
|
+
children: action === "update" ? fill(t(cli.install.from !== void 0 && cli.install.from === cli.install.to ? "cliUpdateUnchanged" : "cliUpdateSucceeded"), { version: cli.install.to ?? cli.version }) : t("cliInstallSucceeded")
|
|
2890
|
+
}),
|
|
2891
|
+
updateAvailable && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
2892
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2893
|
+
className: "pkc-note",
|
|
2894
|
+
children: fill(t("cliUpdateAvailable"), { latest: cli.latest ?? "" })
|
|
2895
|
+
}),
|
|
2896
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
2897
|
+
className: "pkc-split",
|
|
2898
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Button, {
|
|
2899
|
+
size: "md",
|
|
2900
|
+
disabled: running || checking,
|
|
2901
|
+
onClick: update,
|
|
2902
|
+
children: running && action === "update" ? t("cliUpdating") : t("cliUpdate")
|
|
2903
|
+
})
|
|
2904
|
+
}),
|
|
2905
|
+
cli.updateCommand !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
2906
|
+
className: "pkc-note",
|
|
2907
|
+
children: fill(t("cliUpdateCommand"), { command: cli.updateCommand })
|
|
2908
|
+
})
|
|
2909
|
+
] })
|
|
2696
2910
|
] }),
|
|
2697
2911
|
outdated && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
2698
2912
|
className: "pkc-callout",
|
|
@@ -2999,6 +3213,10 @@ window.__ModuleLoader__.load({
|
|
|
2999
3213
|
call,
|
|
3000
3214
|
t
|
|
3001
3215
|
}),
|
|
3216
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(AutoReviewCard, {
|
|
3217
|
+
call,
|
|
3218
|
+
t
|
|
3219
|
+
}),
|
|
3002
3220
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(VersionCard, {
|
|
3003
3221
|
call,
|
|
3004
3222
|
t
|