@morehao/dsh-github-trending 0.4.4 → 0.5.0
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 +13 -0
- package/README.md +27 -2
- package/client.js +465 -7
- package/lib/{chunk-XLIFTAVL.js → chunk-R7BK7SJK.js} +5 -1
- package/lib/{chunk-GBXP2NGW.js → chunk-WFCULY72.js} +290 -9
- package/lib/{exec-33EQXGUA.js → exec-VMDINNX5.js} +1 -1
- package/lib/index.js +2 -2
- package/lib/internal.d.ts +195 -8
- package/lib/internal.js +4 -2
- package/package.json +3 -3
package/client.js
CHANGED
|
@@ -55,6 +55,8 @@ var DICT = {
|
|
|
55
55
|
"st.repo": "仓库",
|
|
56
56
|
"st.auth": "认证",
|
|
57
57
|
"st.scope": "榜单",
|
|
58
|
+
"st.summarize": "摘要与用量",
|
|
59
|
+
"st.releases": "发版订阅",
|
|
58
60
|
"st.schedule": "调度",
|
|
59
61
|
"card.source.title": "内容来源",
|
|
60
62
|
"card.source.hint": "唯一来源是本地二进制",
|
|
@@ -231,6 +233,7 @@ var DICT = {
|
|
|
231
233
|
"nav.overview": "概览",
|
|
232
234
|
"nav.digest": "榜单",
|
|
233
235
|
"nav.runs": "运行记录",
|
|
236
|
+
"nav.subscriptions": "订阅",
|
|
234
237
|
"nav.settings": "设置",
|
|
235
238
|
"period.daily": "日榜",
|
|
236
239
|
"period.weekly": "周榜",
|
|
@@ -240,6 +243,7 @@ var DICT = {
|
|
|
240
243
|
"shell.digest.dek": "按周期回看日榜 / 周榜 / 月榜;只有保留过预览副本的期数能读。",
|
|
241
244
|
"shell.runs.dek": "最近 30 次运行;展开看交付物、错误与日志。",
|
|
242
245
|
"shell.settings.dek": "沿用现有设置页;每个分区独立保存。",
|
|
246
|
+
"shell.subscriptions.dek": "仓库发版订阅列表,随数据仓版本化;经核心 subscribe 命令增删。",
|
|
243
247
|
"shell.nextRun": "下次运行",
|
|
244
248
|
"shell.scheduleOff": "定时未开启",
|
|
245
249
|
"shell.ready": "就绪 {ready} / {total}",
|
|
@@ -361,6 +365,82 @@ var DICT = {
|
|
|
361
365
|
"log.copy": "复制日志",
|
|
362
366
|
"log.copied": "已复制",
|
|
363
367
|
"log.close": "关闭",
|
|
368
|
+
"run.usage.tokens": "本次任务 tokens",
|
|
369
|
+
"run.usage.tokensTotal": "累计全部用量",
|
|
370
|
+
"run.usage.tokensNote": "只展示总用量,不拆 prompt/completion 等维度;本次任务总量 = 榜单摘要 + 发版订阅阶段(含订阅)。旧核心无数据时显示「—」。",
|
|
371
|
+
"run.usage.breakdown": "榜单摘要 {summary} · 发版订阅 {releases} · 合计 {total}",
|
|
372
|
+
"run.usage.breakdownSimple": "榜单摘要 {summary} · 合计 {total}",
|
|
373
|
+
"run.usage.releasesOnly": "发版订阅 {releases} · 合计 {total}",
|
|
374
|
+
"releases.card.title": "发版订阅(releases 阶段)",
|
|
375
|
+
"releases.card.on": "已开启",
|
|
376
|
+
"releases.card.off": "未开启",
|
|
377
|
+
"releases.stat.repos": "仓库",
|
|
378
|
+
"releases.stat.new": "新发版",
|
|
379
|
+
"releases.stat.summarized": "已摘要",
|
|
380
|
+
"releases.stat.degraded": "降级",
|
|
381
|
+
"releases.stat.failed": "失败",
|
|
382
|
+
"releases.stat.skipped": "跳过",
|
|
383
|
+
"releases.stat.tokens": "本阶段 tokens",
|
|
384
|
+
"releases.card.hint": "订阅仓库的新 Release 写成中文摘要,与榜单同分支同 PR。",
|
|
385
|
+
"releases.badge.summarized": "已摘要",
|
|
386
|
+
"releases.badge.degraded": "降级为原文",
|
|
387
|
+
"releases.badge.off": "未启用",
|
|
388
|
+
"releases.empty": "本次未启用发版订阅",
|
|
389
|
+
"runs.detail.tokens": "本次任务 tokens",
|
|
390
|
+
"runs.detail.releases": "发版订阅",
|
|
391
|
+
"runs.detail.tokensNone": "—",
|
|
392
|
+
"runs.footer.total": "历史累计 tokens:{total}",
|
|
393
|
+
"card.summarize.title": "摘要与用量",
|
|
394
|
+
"card.summarize.hint": "对应核心 summarize.*(core 0.4.1+)",
|
|
395
|
+
"summarize.batchSize": "批量大小",
|
|
396
|
+
"summarize.maxRetries": "失败重试",
|
|
397
|
+
"summarize.enrich": "外部增强",
|
|
398
|
+
"summarize.enrich.none": "不增强",
|
|
399
|
+
"summarize.enrich.repo": "仓库(含 GitHub topics)",
|
|
400
|
+
"summarize.enrich.readme": "仓库(含 README 摘录)",
|
|
401
|
+
"summarize.readmeChars": "README 摘录长度",
|
|
402
|
+
"summarize.enrichNote": "外部增强需要只读 token:enrich=repo/readme 建议配置 GITHUB_READ_TOKEN(独立只读);readme 模式在网络慢时可能因预算耗尽跳过部分仓库(自动降级,不影响运行)。",
|
|
403
|
+
"summarize.usageNote": "用量展示在「运行记录 + 历史」,本页只放摘要生成参数。插件不做费用估算、不内置定价表(价格随 provider/区域变动):Usage 的 token 真值直接展示在运行结果与历史。",
|
|
404
|
+
"card.releases.title": "发版订阅",
|
|
405
|
+
"card.releases.hint": "对应核心 releases.*(core 0.5.0+)",
|
|
406
|
+
"releases.enabled": "启用发版订阅",
|
|
407
|
+
"releases.enabled.hint": "保存后与 trending 合并进同一分支/PR",
|
|
408
|
+
"releases.includePrerelease": "含预发布",
|
|
409
|
+
"releases.includeDrafts": "含草稿",
|
|
410
|
+
"releases.notesChars": "notes 截断",
|
|
411
|
+
"releases.manage": "管理订阅列表 →",
|
|
412
|
+
"releases.note": "订阅列表不在此卡片编辑,跳到「订阅」页管理;列表在数据仓 <output.dir>/subscriptions.yaml,随产物版本化。",
|
|
413
|
+
"subs.title": "仓库发版订阅",
|
|
414
|
+
"subs.desc": "订阅后,每次运行会把每个仓库「新增的 Release(无 Release 时回退 Tag)」写成中文 changelog,渲染到 <output.dir>/releases/,与榜单同分支同 PR。默认 enabled=false 旁路,不改变既有榜单产物。",
|
|
415
|
+
"subs.enabled": "订阅开关:{state}",
|
|
416
|
+
"subs.on": "已开启",
|
|
417
|
+
"subs.off": "未开启",
|
|
418
|
+
"subs.disabled.title": "发版订阅当前关闭",
|
|
419
|
+
"subs.disabled.hint": "在设置页「发版订阅」分区打开后,订阅列表才会在运行中生效。",
|
|
420
|
+
"subs.add": "添加仓库",
|
|
421
|
+
"subs.add.hint": "添加订阅(owner/repo,一个或多个,逗号/空格分隔)",
|
|
422
|
+
"subs.add.placeholder": "denoland/deno",
|
|
423
|
+
"subs.add.confirm": "添加",
|
|
424
|
+
"subs.adding": "添加中…",
|
|
425
|
+
"subs.cancel": "取消",
|
|
426
|
+
"subs.add.note": "写入前校验 owner/repo 形态、去重;只写 .git/pending,随下次运行落盘并提交。",
|
|
427
|
+
"subs.add.queued": "已加入待提交队列,下次运行随产物提交。",
|
|
428
|
+
"subs.remove.queued": "已标记移除,下次运行随产物提交。",
|
|
429
|
+
"subs.remove": "移除",
|
|
430
|
+
"subs.removing": "移除中…",
|
|
431
|
+
"subs.empty": "还没有订阅任何仓库",
|
|
432
|
+
"subs.loading": "加载订阅列表…",
|
|
433
|
+
"subs.input.invalid": "请输入 owner/repo 形态,例如 vercel/next.js",
|
|
434
|
+
"subs.col.repo": "仓库(owner/repo)",
|
|
435
|
+
"subs.param.hint": "阶段行为参数(每仓上限、回退 Tag、周期等)在设置页「发版订阅」分区调整。",
|
|
436
|
+
"subs.param.link": "前往设置 → 发版订阅",
|
|
437
|
+
"overview.tokens.title": "Token 用量",
|
|
438
|
+
"overview.tokens.thisRun": "本次任务",
|
|
439
|
+
"overview.tokens.total": "累计全部",
|
|
440
|
+
"overview.releases.title": "发版订阅",
|
|
441
|
+
"overview.releases.new": "新发版",
|
|
442
|
+
"overview.releases.repos": "仓库",
|
|
443
|
+
"overview.tokens.note": "概览一屏带出「这次任务共花了多少 token / 历史上累计多少 / 订阅仓库有几个新版本」;只给总用量,不拆维度;本次任务总量已含订阅阶段消耗。旧核心无数据时对应小块整体隐藏,不留 0。",
|
|
364
444
|
"about.title": "关于",
|
|
365
445
|
"about.copy": "复制完整包名",
|
|
366
446
|
"about.copied": "已复制",
|
|
@@ -383,6 +463,8 @@ var DICT = {
|
|
|
383
463
|
"st.repo": "Repository",
|
|
384
464
|
"st.auth": "Auth",
|
|
385
465
|
"st.scope": "Scope",
|
|
466
|
+
"st.summarize": "Summary & usage",
|
|
467
|
+
"st.releases": "Releases",
|
|
386
468
|
"st.schedule": "Schedule",
|
|
387
469
|
"card.source.title": "Content source",
|
|
388
470
|
"card.source.hint": "one source: the local binary",
|
|
@@ -559,6 +641,7 @@ var DICT = {
|
|
|
559
641
|
"nav.overview": "Overview",
|
|
560
642
|
"nav.digest": "Board",
|
|
561
643
|
"nav.runs": "Runs",
|
|
644
|
+
"nav.subscriptions": "Subscriptions",
|
|
562
645
|
"nav.settings": "Settings",
|
|
563
646
|
"period.daily": "Daily",
|
|
564
647
|
"period.weekly": "Weekly",
|
|
@@ -568,6 +651,7 @@ var DICT = {
|
|
|
568
651
|
"shell.digest.dek": "Look back per period — daily / weekly / monthly; only issues with a saved preview copy can be read.",
|
|
569
652
|
"shell.runs.dek": "The last 30 runs; expand one for artifacts, errors and logs.",
|
|
570
653
|
"shell.settings.dek": "The existing settings page; each section saves on its own.",
|
|
654
|
+
"shell.subscriptions.dek": "Repo release subscription list, versioned in the data repo; add or remove via the core subscribe command.",
|
|
571
655
|
"shell.nextRun": "Next run",
|
|
572
656
|
"shell.scheduleOff": "Schedule off",
|
|
573
657
|
"shell.ready": "Ready {ready} / {total}",
|
|
@@ -689,6 +773,82 @@ var DICT = {
|
|
|
689
773
|
"log.copy": "Copy log",
|
|
690
774
|
"log.copied": "Copied",
|
|
691
775
|
"log.close": "Close",
|
|
776
|
+
"run.usage.tokens": "This run tokens",
|
|
777
|
+
"run.usage.tokensTotal": "All-time total",
|
|
778
|
+
"run.usage.tokensNote": 'Only total usage is shown, not split into prompt/completion; this run total = board summary + releases stage (subscriptions included). Old core with no data shows "—".',
|
|
779
|
+
"run.usage.breakdown": "Board {summary} · Releases {releases} · Total {total}",
|
|
780
|
+
"run.usage.breakdownSimple": "Board {summary} · Total {total}",
|
|
781
|
+
"run.usage.releasesOnly": "Releases {releases} · Total {total}",
|
|
782
|
+
"releases.card.title": "Releases stage",
|
|
783
|
+
"releases.card.on": "On",
|
|
784
|
+
"releases.card.off": "Off",
|
|
785
|
+
"releases.stat.repos": "Repos",
|
|
786
|
+
"releases.stat.new": "New",
|
|
787
|
+
"releases.stat.summarized": "Summarized",
|
|
788
|
+
"releases.stat.degraded": "Degraded",
|
|
789
|
+
"releases.stat.failed": "Failed",
|
|
790
|
+
"releases.stat.skipped": "Skipped",
|
|
791
|
+
"releases.stat.tokens": "Stage tokens",
|
|
792
|
+
"releases.card.hint": "New releases of subscribed repos become Chinese summaries, committed to the same branch/PR as the board.",
|
|
793
|
+
"releases.badge.summarized": "Summarized",
|
|
794
|
+
"releases.badge.degraded": "Degraded to original",
|
|
795
|
+
"releases.badge.off": "Disabled",
|
|
796
|
+
"releases.empty": "Releases were not enabled for this run",
|
|
797
|
+
"runs.detail.tokens": "This run tokens",
|
|
798
|
+
"runs.detail.releases": "Releases",
|
|
799
|
+
"runs.detail.tokensNone": "—",
|
|
800
|
+
"runs.footer.total": "All-time tokens: {total}",
|
|
801
|
+
"card.summarize.title": "Summary & usage",
|
|
802
|
+
"card.summarize.hint": "Maps to core summarize.* (core 0.4.1+)",
|
|
803
|
+
"summarize.batchSize": "Batch size",
|
|
804
|
+
"summarize.maxRetries": "Retries",
|
|
805
|
+
"summarize.enrich": "Enrich",
|
|
806
|
+
"summarize.enrich.none": "None",
|
|
807
|
+
"summarize.enrich.repo": "Repo (+GitHub topics)",
|
|
808
|
+
"summarize.enrich.readme": "Repo (+README excerpt)",
|
|
809
|
+
"summarize.readmeChars": "README excerpt chars",
|
|
810
|
+
"summarize.enrichNote": "Enrich needs a read-only token: enrich=repo/readme is best paired with GITHUB_READ_TOKEN (separate, read-only). In readme mode slow networks may skip some repos when the budget runs out (auto-degrades; the run is unaffected).",
|
|
811
|
+
"summarize.usageNote": "Usage is shown on Runs + History; this page only holds summary-generation parameters. The plugin does no cost estimation and ships no price list (prices vary by provider/region): the Usage token truth is shown directly in run results and history.",
|
|
812
|
+
"card.releases.title": "Releases",
|
|
813
|
+
"card.releases.hint": "Maps to core releases.* (core 0.5.0+)",
|
|
814
|
+
"releases.enabled": "Enable releases",
|
|
815
|
+
"releases.enabled.hint": "Saved alongside trending into the same branch/PR",
|
|
816
|
+
"releases.includePrerelease": "Include pre-releases",
|
|
817
|
+
"releases.includeDrafts": "Include drafts",
|
|
818
|
+
"releases.notesChars": "Notes truncate",
|
|
819
|
+
"releases.manage": "Manage subscriptions →",
|
|
820
|
+
"releases.note": "The subscription list is not edited on this card; manage it on the Subscriptions page. The list lives in the data repo at <output.dir>/subscriptions.yaml, versioned with artifacts.",
|
|
821
|
+
"subs.title": "Repo release subscriptions",
|
|
822
|
+
"subs.desc": "Once subscribed, each run writes every repo's new releases (falling back to tags) as a Chinese changelog rendered under <output.dir>/releases/, in the same branch/PR as the board. enabled=false bypasses it by default and leaves existing board artifacts unchanged.",
|
|
823
|
+
"subs.enabled": "Subscriptions: {state}",
|
|
824
|
+
"subs.on": "On",
|
|
825
|
+
"subs.off": "Off",
|
|
826
|
+
"subs.disabled.title": "Releases are currently off",
|
|
827
|
+
"subs.disabled.hint": "Turn on Releases in the settings page; the subscription list only takes effect during a run after that.",
|
|
828
|
+
"subs.add": "Add repo",
|
|
829
|
+
"subs.add.hint": "Add subscriptions (owner/repo, one or more, comma/space separated)",
|
|
830
|
+
"subs.add.placeholder": "denoland/deno",
|
|
831
|
+
"subs.add.confirm": "Add",
|
|
832
|
+
"subs.adding": "Adding…",
|
|
833
|
+
"subs.cancel": "Cancel",
|
|
834
|
+
"subs.add.note": "Validates owner/repo form and dedupes before writing; only writes .git/pending, landed with artifacts on the next run.",
|
|
835
|
+
"subs.add.queued": "Queued; committed with artifacts on the next run.",
|
|
836
|
+
"subs.remove.queued": "Marked for removal; committed with artifacts on the next run.",
|
|
837
|
+
"subs.remove": "Remove",
|
|
838
|
+
"subs.removing": "Removing…",
|
|
839
|
+
"subs.empty": "No repos subscribed yet",
|
|
840
|
+
"subs.loading": "Loading subscriptions…",
|
|
841
|
+
"subs.input.invalid": "Enter owner/repo form, e.g. vercel/next.js",
|
|
842
|
+
"subs.col.repo": "Repo (owner/repo)",
|
|
843
|
+
"subs.param.hint": "Stage behaviour parameters (per-repo limit, tag fallback, period, etc.) are adjusted in the settings page Releases section.",
|
|
844
|
+
"subs.param.link": "Go to Settings → Releases",
|
|
845
|
+
"overview.tokens.title": "Token usage",
|
|
846
|
+
"overview.tokens.thisRun": "This run",
|
|
847
|
+
"overview.tokens.total": "All-time",
|
|
848
|
+
"overview.releases.title": "Releases",
|
|
849
|
+
"overview.releases.new": "New",
|
|
850
|
+
"overview.releases.repos": "Repos",
|
|
851
|
+
"overview.tokens.note": 'The overview surfaces "how many tokens this run spent / all-time accumulated / how many new versions across subscribed repos"; total only, not split by dimension; this run total already includes the subscriptions stage. With an old core that has no data, the corresponding tile is hidden entirely, never shown as 0.',
|
|
692
852
|
"about.title": "About",
|
|
693
853
|
"about.copy": "Copy full package name",
|
|
694
854
|
"about.copied": "Copied",
|
|
@@ -973,7 +1133,7 @@ var CSS = `
|
|
|
973
1133
|
|
|
974
1134
|
/* ——— 周期标签 / 分段 ——— */
|
|
975
1135
|
.dshgt-pchip{display:inline-flex;align-items:center;justify-content:center;height:20px;padding:0 8px;border-radius:999px;font-size:11px;font-weight:600;line-height:18px;white-space:nowrap;border:1px solid var(--gt-border);color:var(--gt-muted);background:var(--gt-bg);}
|
|
976
|
-
.dshgt-pchip.daily{color
|
|
1136
|
+
.dshgt-pchip.daily{color:#2563eb;border-color:#dbeafe;background:#eff6ff;}
|
|
977
1137
|
.dshgt-pchip.weekly{color:#7c3aed;border-color:#ddd6fe;background:#f5f3ff;}
|
|
978
1138
|
.dshgt-pchip.monthly{color:#0f766e;border-color:#99f6e4;background:#f0fdfa;}
|
|
979
1139
|
.dshgt-period-seg{display:inline-flex;border:1px solid var(--gt-border);border-radius:9px;padding:3px;background:var(--gt-card);gap:3px;}
|
|
@@ -1202,6 +1362,12 @@ function duration(ms) {
|
|
|
1202
1362
|
function shortHash(hash) {
|
|
1203
1363
|
return typeof hash === "string" && hash !== "" ? hash.slice(0, 10) : "—";
|
|
1204
1364
|
}
|
|
1365
|
+
function formatTokens(value) {
|
|
1366
|
+
if (value === void 0 || !Number.isFinite(value)) return "—";
|
|
1367
|
+
if (value < 1e4) return value.toLocaleString("en-US");
|
|
1368
|
+
if (value < 1e6) return `${(value / 1e3).toFixed(1)}k`.replace(".0k", "k");
|
|
1369
|
+
return `${(value / 1e6).toFixed(1)}M`.replace(".0M", "M");
|
|
1370
|
+
}
|
|
1205
1371
|
function localTime(iso) {
|
|
1206
1372
|
if (iso === null || iso === void 0) return "—";
|
|
1207
1373
|
const date = new Date(iso);
|
|
@@ -1279,6 +1445,14 @@ async function applyPluginUpdate() {
|
|
|
1279
1445
|
const payload = await apiCall("POST", "/update", {});
|
|
1280
1446
|
return payload.result;
|
|
1281
1447
|
}
|
|
1448
|
+
async function getSubscriptions(signal) {
|
|
1449
|
+
const payload = await apiCall("GET", "/subscriptions", void 0, signal === void 0 ? {} : { signal });
|
|
1450
|
+
return Array.isArray(payload.repos) ? payload.repos : [];
|
|
1451
|
+
}
|
|
1452
|
+
async function postSubscriptions(action, repos) {
|
|
1453
|
+
const payload = await apiCall("POST", "/subscriptions", { action, repos });
|
|
1454
|
+
return Array.isArray(payload.repos) ? payload.repos : [];
|
|
1455
|
+
}
|
|
1282
1456
|
|
|
1283
1457
|
// client/store.ts
|
|
1284
1458
|
var POLL_MS = 5e3;
|
|
@@ -1338,8 +1512,8 @@ function credentialView(model, t) {
|
|
|
1338
1512
|
|
|
1339
1513
|
// client/settings.ts
|
|
1340
1514
|
var LANGUAGES = ["all", "typescript", "python", "go", "rust", "java", "c", "cpp", "javascript", "csharp"];
|
|
1341
|
-
var SECTIONS = ["source", "model", "repo", "auth", "scope", "schedule"];
|
|
1342
|
-
var EMPTY_DIRTY = { source: false, model: false, repo: false, auth: false, scope: false, schedule: false };
|
|
1515
|
+
var SECTIONS = ["source", "model", "repo", "auth", "scope", "summarize", "releases", "schedule"];
|
|
1516
|
+
var EMPTY_DIRTY = { source: false, model: false, repo: false, auth: false, scope: false, summarize: false, releases: false, schedule: false };
|
|
1343
1517
|
function cloneSettings(settings) {
|
|
1344
1518
|
return JSON.parse(JSON.stringify(settings));
|
|
1345
1519
|
}
|
|
@@ -1355,6 +1529,10 @@ function sectionSlice(settings, section) {
|
|
|
1355
1529
|
return { github: settings.github };
|
|
1356
1530
|
case "scope":
|
|
1357
1531
|
return { trending: settings.trending };
|
|
1532
|
+
case "summarize":
|
|
1533
|
+
return { summarize: settings.summarize };
|
|
1534
|
+
case "releases":
|
|
1535
|
+
return { releases: settings.releases };
|
|
1358
1536
|
case "schedule":
|
|
1359
1537
|
return { schedule: settings.schedule };
|
|
1360
1538
|
}
|
|
@@ -1381,7 +1559,7 @@ function SettingsView(props) {
|
|
|
1381
1559
|
const [rechecking, setRechecking] = import_react.default.useState(false);
|
|
1382
1560
|
const [downloading, setDownloading] = import_react.default.useState(false);
|
|
1383
1561
|
const [quickOpen, setQuickOpen] = import_react.default.useState(false);
|
|
1384
|
-
const [section, setSection] = import_react.default.useState("source");
|
|
1562
|
+
const [section, setSection] = import_react.default.useState(props.initialSection ?? "source");
|
|
1385
1563
|
const [branchInfo, setBranchInfo] = import_react.default.useState(null);
|
|
1386
1564
|
const [branchLoading, setBranchLoading] = import_react.default.useState(false);
|
|
1387
1565
|
const [testing, setTesting] = import_react.default.useState(false);
|
|
@@ -1549,6 +1727,8 @@ function SettingsView(props) {
|
|
|
1549
1727
|
{ id: "repo", label: t("st.repo") },
|
|
1550
1728
|
{ id: "auth", label: t("st.auth") },
|
|
1551
1729
|
{ id: "scope", label: t("st.scope") },
|
|
1730
|
+
{ id: "summarize", label: t("st.summarize") },
|
|
1731
|
+
{ id: "releases", label: t("st.releases") },
|
|
1552
1732
|
{ id: "schedule", label: t("st.schedule") }
|
|
1553
1733
|
];
|
|
1554
1734
|
const sourceCard = h(
|
|
@@ -1809,7 +1989,87 @@ function SettingsView(props) {
|
|
|
1809
1989
|
),
|
|
1810
1990
|
h("p", { className: "dshgt-hint" }, t("schedule.source"))
|
|
1811
1991
|
);
|
|
1812
|
-
const
|
|
1992
|
+
const summarizeCard = h(
|
|
1993
|
+
Card,
|
|
1994
|
+
{ title: t("card.summarize.title"), hint: t("card.summarize.hint") },
|
|
1995
|
+
h(
|
|
1996
|
+
Row,
|
|
1997
|
+
{ label: t("summarize.batchSize") },
|
|
1998
|
+
h(Input, { mono: true, width: 90, value: String(draft.summarize.batchSize), onInput: (value) => update((next) => {
|
|
1999
|
+
next.summarize.batchSize = Math.round(Number(value) || 0);
|
|
2000
|
+
}) })
|
|
2001
|
+
),
|
|
2002
|
+
h(
|
|
2003
|
+
Row,
|
|
2004
|
+
{ label: t("summarize.maxRetries") },
|
|
2005
|
+
h(Input, { mono: true, width: 90, value: String(draft.summarize.maxRetries), onInput: (value) => update((next) => {
|
|
2006
|
+
next.summarize.maxRetries = Math.round(Number(value) || 0);
|
|
2007
|
+
}) })
|
|
2008
|
+
),
|
|
2009
|
+
h(
|
|
2010
|
+
Row,
|
|
2011
|
+
{ label: t("summarize.enrich") },
|
|
2012
|
+
h(Select, {
|
|
2013
|
+
value: draft.summarize.enrich,
|
|
2014
|
+
options: [
|
|
2015
|
+
{ value: "none", label: t("summarize.enrich.none") },
|
|
2016
|
+
{ value: "repo", label: t("summarize.enrich.repo") },
|
|
2017
|
+
{ value: "readme", label: t("summarize.enrich.readme") }
|
|
2018
|
+
],
|
|
2019
|
+
onChange: (value) => update((next) => {
|
|
2020
|
+
next.summarize.enrich = value === "repo" ? "repo" : value === "readme" ? "readme" : "none";
|
|
2021
|
+
})
|
|
2022
|
+
})
|
|
2023
|
+
),
|
|
2024
|
+
h(
|
|
2025
|
+
Row,
|
|
2026
|
+
{ label: t("summarize.readmeChars") },
|
|
2027
|
+
h(Input, { mono: true, width: 90, value: String(draft.summarize.readmeChars), onInput: (value) => update((next) => {
|
|
2028
|
+
next.summarize.readmeChars = Math.round(Number(value) || 0);
|
|
2029
|
+
}) })
|
|
2030
|
+
),
|
|
2031
|
+
draft.summarize.enrich === "none" ? null : h(Alert, { kind: "warn" }, h("div", null, t("summarize.enrichNote"))),
|
|
2032
|
+
h("p", { className: "dshgt-hint" }, t("summarize.usageNote"))
|
|
2033
|
+
);
|
|
2034
|
+
const releasesCard = h(
|
|
2035
|
+
Card,
|
|
2036
|
+
{
|
|
2037
|
+
title: t("card.releases.title"),
|
|
2038
|
+
hint: t("card.releases.hint"),
|
|
2039
|
+
extra: props.onOpenSubscriptions === void 0 ? void 0 : h(Btn, { small: true, onClick: () => props.onOpenSubscriptions?.() }, t("releases.manage"))
|
|
2040
|
+
},
|
|
2041
|
+
h(
|
|
2042
|
+
Row,
|
|
2043
|
+
{ label: t("releases.enabled") },
|
|
2044
|
+
h(Toggle, { checked: draft.releases.enabled, onChange: (value) => update((next) => {
|
|
2045
|
+
next.releases.enabled = value;
|
|
2046
|
+
}) }),
|
|
2047
|
+
h("span", { className: "dshgt-hint" }, t("releases.enabled.hint"))
|
|
2048
|
+
),
|
|
2049
|
+
h(
|
|
2050
|
+
Row,
|
|
2051
|
+
{ label: t("releases.includePrerelease") },
|
|
2052
|
+
h(Toggle, { checked: draft.releases.includePrerelease, onChange: (value) => update((next) => {
|
|
2053
|
+
next.releases.includePrerelease = value;
|
|
2054
|
+
}) })
|
|
2055
|
+
),
|
|
2056
|
+
h(
|
|
2057
|
+
Row,
|
|
2058
|
+
{ label: t("releases.includeDrafts") },
|
|
2059
|
+
h(Toggle, { checked: draft.releases.includeDrafts, onChange: (value) => update((next) => {
|
|
2060
|
+
next.releases.includeDrafts = value;
|
|
2061
|
+
}) })
|
|
2062
|
+
),
|
|
2063
|
+
h(
|
|
2064
|
+
Row,
|
|
2065
|
+
{ label: t("releases.notesChars") },
|
|
2066
|
+
h(Input, { mono: true, width: 90, value: String(draft.releases.maxNotesChars), onInput: (value) => update((next) => {
|
|
2067
|
+
next.releases.maxNotesChars = Math.round(Number(value) || 0);
|
|
2068
|
+
}) })
|
|
2069
|
+
),
|
|
2070
|
+
h("p", { className: "dshgt-hint" }, t("releases.note"))
|
|
2071
|
+
);
|
|
2072
|
+
const currentCard = section === "source" ? sourceCard : section === "model" ? modelCard : section === "repo" ? repoCard : section === "auth" ? authCard : section === "scope" ? scopeCard : section === "summarize" ? summarizeCard : section === "releases" ? releasesCard : scheduleCard;
|
|
1813
2073
|
return h(
|
|
1814
2074
|
"div",
|
|
1815
2075
|
{ className: "dshgt-settings" },
|
|
@@ -2442,6 +2702,37 @@ function OverviewView(props) {
|
|
|
2442
2702
|
h("div", { className: "dshgt-fact" }, h("div", { className: "dshgt-fact-k" }, t("overview.model")), h("div", { className: "dshgt-fact-v" }, last.model?.model ?? "—"))
|
|
2443
2703
|
)
|
|
2444
2704
|
),
|
|
2705
|
+
h(
|
|
2706
|
+
"section",
|
|
2707
|
+
{ className: "dshgt-block dshgt-usage-glance" },
|
|
2708
|
+
h(
|
|
2709
|
+
"div",
|
|
2710
|
+
{ className: "dshgt-glance-grid" },
|
|
2711
|
+
h(
|
|
2712
|
+
"div",
|
|
2713
|
+
{ className: "dshgt-glance" },
|
|
2714
|
+
h("div", { className: "dshgt-glance-k" }, t("overview.tokens.title")),
|
|
2715
|
+
h(
|
|
2716
|
+
"div",
|
|
2717
|
+
{ className: "dshgt-glance-vs" },
|
|
2718
|
+
h("div", { className: "dshgt-glance-cell" }, h("span", { className: "dshgt-hint" }, t("overview.tokens.thisRun")), h("span", { className: "dshgt-glance-num dshgt-mono" }, last?.tokens === void 0 ? "—" : formatTokens(last.tokens)), h("span", { className: "dshgt-hint" }, "tokens")),
|
|
2719
|
+
h("div", { className: "dshgt-glance-cell" }, h("span", { className: "dshgt-hint" }, t("overview.tokens.total")), h("span", { className: "dshgt-glance-num dshgt-mono" }, state.status.totalTokens === void 0 ? "—" : formatTokens(state.status.totalTokens)), h("span", { className: "dshgt-hint" }, "tokens"))
|
|
2720
|
+
)
|
|
2721
|
+
),
|
|
2722
|
+
h(
|
|
2723
|
+
"div",
|
|
2724
|
+
{ className: "dshgt-glance" },
|
|
2725
|
+
h("div", { className: "dshgt-glance-k" }, t("overview.releases.title")),
|
|
2726
|
+
h(
|
|
2727
|
+
"div",
|
|
2728
|
+
{ className: "dshgt-glance-vs" },
|
|
2729
|
+
h("div", { className: "dshgt-glance-cell" }, h("span", { className: "dshgt-hint" }, t("overview.releases.new")), h("span", { className: "dshgt-glance-num dshgt-mono" }, last?.releases === void 0 ? "—" : String(last.releases.newReleases))),
|
|
2730
|
+
h("div", { className: "dshgt-glance-cell" }, h("span", { className: "dshgt-hint" }, t("overview.releases.repos")), h("span", { className: "dshgt-glance-num dshgt-mono" }, last?.releases === void 0 ? "—" : String(last.releases.repos)))
|
|
2731
|
+
)
|
|
2732
|
+
)
|
|
2733
|
+
),
|
|
2734
|
+
h("p", { className: "dshgt-hint dshgt-glance-note" }, t("overview.tokens.note"))
|
|
2735
|
+
),
|
|
2445
2736
|
h(
|
|
2446
2737
|
"section",
|
|
2447
2738
|
{ className: "dshgt-block" },
|
|
@@ -2703,6 +2994,7 @@ function RunsView(props) {
|
|
|
2703
2994
|
record.legacy === true ? h("span", { className: "dshgt-tag dshgt-inline-tag" }, t("runs.legacy")) : null
|
|
2704
2995
|
),
|
|
2705
2996
|
h("span", { className: "dshgt-run-files" }, t("runs.files", { count: record.files })),
|
|
2997
|
+
record.tokens === void 0 ? null : h("span", { className: "dshgt-run-tokens dshgt-mono", title: t("run.usage.tokens") }, `${formatTokens(record.tokens)} tok`),
|
|
2706
2998
|
h("span", { className: "dshgt-run-duration" }, duration(record.durationMs)),
|
|
2707
2999
|
h("span", { className: "dshgt-run-chev" }, "›")
|
|
2708
3000
|
),
|
|
@@ -2735,8 +3027,10 @@ function RunsView(props) {
|
|
|
2735
3027
|
)
|
|
2736
3028
|
),
|
|
2737
3029
|
detailItem(t, "runs.detail.warnings", record.warnings.length === 0 ? t("runs.detail.none") : record.warnings.join(";")),
|
|
2738
|
-
detailItem(t, "runs.detail.files", `${record.files} · ${duration(record.durationMs)}`)
|
|
3030
|
+
detailItem(t, "runs.detail.files", `${record.files} · ${duration(record.durationMs)}`),
|
|
3031
|
+
detailItem(t, "runs.detail.tokens", record.tokens === void 0 ? t("runs.detail.tokensNone") : h("span", { className: "dshgt-mono" }, `${formatTokens(record.tokens)} tokens`))
|
|
2739
3032
|
),
|
|
3033
|
+
record.releases === void 0 ? null : ReleasesDetail({ t, record }),
|
|
2740
3034
|
record.legacy === true ? h("div", { className: "dshgt-hint" }, t("runs.legacyHint")) : null,
|
|
2741
3035
|
h(
|
|
2742
3036
|
"div",
|
|
@@ -2759,9 +3053,34 @@ function RunsView(props) {
|
|
|
2759
3053
|
);
|
|
2760
3054
|
})
|
|
2761
3055
|
),
|
|
3056
|
+
state.status.totalTokens === void 0 ? null : h("div", { className: "dshgt-runs-foot dshgt-hint" }, t("runs.footer.total", { total: formatTokens(state.status.totalTokens) })),
|
|
2762
3057
|
logId === null ? null : h(LogDrawer, { t, runId: logId, onClose: () => setLogId(null) })
|
|
2763
3058
|
);
|
|
2764
3059
|
}
|
|
3060
|
+
function ReleasesDetail(props) {
|
|
3061
|
+
const { t, record } = props;
|
|
3062
|
+
const r = record.releases;
|
|
3063
|
+
if (r === void 0 || !r.enabled) {
|
|
3064
|
+
return h("div", { className: "dshgt-releases-detail" }, h("span", { className: "dshgt-hint" }, t("releases.empty")));
|
|
3065
|
+
}
|
|
3066
|
+
const stats = [
|
|
3067
|
+
[t("releases.stat.repos"), r.repos],
|
|
3068
|
+
[t("releases.stat.new"), r.newReleases],
|
|
3069
|
+
[t("releases.stat.summarized"), r.summarized],
|
|
3070
|
+
[t("releases.stat.degraded"), r.degraded],
|
|
3071
|
+
[t("releases.stat.failed"), r.failed],
|
|
3072
|
+
[t("releases.stat.skipped"), r.skipped]
|
|
3073
|
+
];
|
|
3074
|
+
return h(
|
|
3075
|
+
"div",
|
|
3076
|
+
{ className: "dshgt-releases-detail" },
|
|
3077
|
+
h(
|
|
3078
|
+
"div",
|
|
3079
|
+
{ className: "dshgt-releases-stats" },
|
|
3080
|
+
stats.filter(([, value]) => value !== void 0).map(([label, value]) => h("span", { className: "dshgt-releases-stat", key: label }, h("span", { className: "dshgt-hint" }, label), h("span", { className: "dshgt-mono" }, String(value))))
|
|
3081
|
+
)
|
|
3082
|
+
);
|
|
3083
|
+
}
|
|
2765
3084
|
function detailItem(t, label, value) {
|
|
2766
3085
|
return h(
|
|
2767
3086
|
"div",
|
|
@@ -3442,6 +3761,134 @@ function metaLine(rendered) {
|
|
|
3442
3761
|
);
|
|
3443
3762
|
}
|
|
3444
3763
|
|
|
3764
|
+
// client/subscriptions.ts
|
|
3765
|
+
var REPO_PATTERN = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
3766
|
+
function SubscriptionsView(props) {
|
|
3767
|
+
const { t, store } = props;
|
|
3768
|
+
const [repos, setRepos] = import_react.default.useState(null);
|
|
3769
|
+
const [error, setError] = import_react.default.useState(null);
|
|
3770
|
+
const [busy, setBusy] = import_react.default.useState(null);
|
|
3771
|
+
const [adding, setAdding] = import_react.default.useState(false);
|
|
3772
|
+
const [input, setInput] = import_react.default.useState("");
|
|
3773
|
+
const [note, setNote] = import_react.default.useState(null);
|
|
3774
|
+
const enabled = store.state?.settings.releases.enabled ?? false;
|
|
3775
|
+
const load = import_react.default.useCallback(() => {
|
|
3776
|
+
setError(null);
|
|
3777
|
+
getSubscriptions().then((list2) => setRepos(list2)).catch((failure) => {
|
|
3778
|
+
setError(failure instanceof Error ? failure.message : String(failure));
|
|
3779
|
+
setRepos([]);
|
|
3780
|
+
});
|
|
3781
|
+
}, []);
|
|
3782
|
+
import_react.default.useEffect(() => {
|
|
3783
|
+
load();
|
|
3784
|
+
}, [load]);
|
|
3785
|
+
const doAdd = () => {
|
|
3786
|
+
const candidates = input.split(/[\s,]+/).map((item) => item.trim()).filter((item) => item !== "");
|
|
3787
|
+
const valid = candidates.filter((item) => REPO_PATTERN.test(item));
|
|
3788
|
+
if (valid.length === 0) {
|
|
3789
|
+
setError(t("subs.input.invalid"));
|
|
3790
|
+
return;
|
|
3791
|
+
}
|
|
3792
|
+
setBusy("add");
|
|
3793
|
+
setError(null);
|
|
3794
|
+
setNote(null);
|
|
3795
|
+
postSubscriptions("add", valid).then((list2) => {
|
|
3796
|
+
setRepos(list2);
|
|
3797
|
+
setInput("");
|
|
3798
|
+
setAdding(false);
|
|
3799
|
+
setNote(t("subs.add.queued"));
|
|
3800
|
+
}).catch((failure) => setError(failure instanceof Error ? failure.message : String(failure))).finally(() => setBusy(null));
|
|
3801
|
+
};
|
|
3802
|
+
const doRemove = (repo) => {
|
|
3803
|
+
setBusy(`remove:${repo}`);
|
|
3804
|
+
setError(null);
|
|
3805
|
+
setNote(null);
|
|
3806
|
+
postSubscriptions("remove", [repo]).then((list2) => {
|
|
3807
|
+
setRepos(list2);
|
|
3808
|
+
setNote(t("subs.remove.queued"));
|
|
3809
|
+
}).catch((failure) => setError(failure instanceof Error ? failure.message : String(failure))).finally(() => setBusy(null));
|
|
3810
|
+
};
|
|
3811
|
+
const list = repos ?? [];
|
|
3812
|
+
return h(
|
|
3813
|
+
"div",
|
|
3814
|
+
{ className: "dshgt-view dshgt-subs" },
|
|
3815
|
+
h(
|
|
3816
|
+
"section",
|
|
3817
|
+
{ className: "dshgt-block dshgt-subs-card" },
|
|
3818
|
+
h(
|
|
3819
|
+
"div",
|
|
3820
|
+
{ className: "dshgt-subs-head" },
|
|
3821
|
+
h("h2", null, t("subs.title")),
|
|
3822
|
+
h(
|
|
3823
|
+
"div",
|
|
3824
|
+
{ className: "dshgt-subs-head-actions" },
|
|
3825
|
+
h("span", { className: "dshgt-hint" }, t("subs.enabled", { state: enabled ? t("subs.on") : t("subs.off") })),
|
|
3826
|
+
h(Btn, { small: true, variant: "primary", onClick: () => setAdding(true), disabled: busy !== null || adding }, t("subs.add"))
|
|
3827
|
+
)
|
|
3828
|
+
),
|
|
3829
|
+
h("p", { className: "dshgt-desc" }, t("subs.desc")),
|
|
3830
|
+
enabled ? null : h(Alert, { kind: "warn", title: t("subs.disabled.title") }, h("div", null, t("subs.disabled.hint"))),
|
|
3831
|
+
error === null ? null : h(Alert, { kind: "err" }, error),
|
|
3832
|
+
note === null ? null : h(Alert, { kind: "ok" }, note),
|
|
3833
|
+
repos === null ? h("p", { className: "dshgt-hint" }, t("subs.loading")) : list.length === 0 ? h("div", { className: "dshgt-empty" }, t("subs.empty")) : h(
|
|
3834
|
+
"div",
|
|
3835
|
+
{ className: "dshgt-subs-list" },
|
|
3836
|
+
h(
|
|
3837
|
+
"div",
|
|
3838
|
+
{ className: "dshgt-subs-row dshgt-subs-row-head" },
|
|
3839
|
+
h("span", null, t("subs.col.repo")),
|
|
3840
|
+
h("span", null, "")
|
|
3841
|
+
),
|
|
3842
|
+
list.map(
|
|
3843
|
+
(repo) => h(
|
|
3844
|
+
"div",
|
|
3845
|
+
{ className: "dshgt-subs-row", key: repo },
|
|
3846
|
+
h("span", { className: "dshgt-mono dshgt-subs-repo" }, repo),
|
|
3847
|
+
h(
|
|
3848
|
+
"span",
|
|
3849
|
+
{ className: "dshgt-subs-actions" },
|
|
3850
|
+
h(
|
|
3851
|
+
Btn,
|
|
3852
|
+
{ small: true, variant: "danger", onClick: () => doRemove(repo), disabled: busy !== null },
|
|
3853
|
+
busy === `remove:${repo}` ? t("subs.removing") : t("subs.remove")
|
|
3854
|
+
)
|
|
3855
|
+
)
|
|
3856
|
+
)
|
|
3857
|
+
)
|
|
3858
|
+
),
|
|
3859
|
+
adding ? h(
|
|
3860
|
+
"div",
|
|
3861
|
+
{ className: "dshgt-subs-add" },
|
|
3862
|
+
h("div", { className: "dshgt-hint" }, t("subs.add.hint")),
|
|
3863
|
+
h(
|
|
3864
|
+
"div",
|
|
3865
|
+
{ className: "dshgt-subs-add-row" },
|
|
3866
|
+
h(Input, {
|
|
3867
|
+
mono: true,
|
|
3868
|
+
width: 320,
|
|
3869
|
+
value: input,
|
|
3870
|
+
placeholder: t("subs.add.placeholder"),
|
|
3871
|
+
onInput: (value) => setInput(value)
|
|
3872
|
+
}),
|
|
3873
|
+
h(Btn, { small: true, variant: "primary", onClick: doAdd, disabled: busy !== null }, busy === "add" ? t("subs.adding") : t("subs.add.confirm")),
|
|
3874
|
+
h(Btn, { small: true, onClick: () => {
|
|
3875
|
+
setAdding(false);
|
|
3876
|
+
setInput("");
|
|
3877
|
+
setError(null);
|
|
3878
|
+
} }, t("subs.cancel"))
|
|
3879
|
+
),
|
|
3880
|
+
h("p", { className: "dshgt-hint" }, t("subs.add.note"))
|
|
3881
|
+
) : null
|
|
3882
|
+
),
|
|
3883
|
+
h(
|
|
3884
|
+
"section",
|
|
3885
|
+
{ className: "dshgt-block" },
|
|
3886
|
+
h("p", { className: "dshgt-hint" }, t("subs.param.hint")),
|
|
3887
|
+
h(Btn, { small: true, onClick: props.onOpenSettings }, t("subs.param.link"))
|
|
3888
|
+
)
|
|
3889
|
+
);
|
|
3890
|
+
}
|
|
3891
|
+
|
|
3445
3892
|
// node_modules/@morehao/dsh-plugin-kit/dist/update-client.js
|
|
3446
3893
|
var IDLE = { status: "idle", view: null, error: null };
|
|
3447
3894
|
function errorOf(error) {
|
|
@@ -3832,6 +4279,7 @@ var NAV = [
|
|
|
3832
4279
|
{ id: "overview", label: "nav.overview", icon: "grid" },
|
|
3833
4280
|
{ id: "digest", label: "nav.digest", icon: "doc" },
|
|
3834
4281
|
{ id: "runs", label: "nav.runs", icon: "list" },
|
|
4282
|
+
{ id: "subscriptions", label: "nav.subscriptions", icon: "rss" },
|
|
3835
4283
|
{ id: "settings", label: "nav.settings", icon: "sliders" }
|
|
3836
4284
|
];
|
|
3837
4285
|
function navIcon(name, size = 16) {
|
|
@@ -3873,6 +4321,15 @@ function navIcon(name, size = 16) {
|
|
|
3873
4321
|
h("path", { d: "M4 6h.01M4 12h.01M4 18h.01" })
|
|
3874
4322
|
);
|
|
3875
4323
|
}
|
|
4324
|
+
if (name === "rss") {
|
|
4325
|
+
return h(
|
|
4326
|
+
"svg",
|
|
4327
|
+
common,
|
|
4328
|
+
h("path", { d: "M5 5a14 14 0 0 1 14 14" }),
|
|
4329
|
+
h("path", { d: "M5 11a8 8 0 0 1 8 8" }),
|
|
4330
|
+
h("circle", { cx: 6, cy: 18, r: 1.6 })
|
|
4331
|
+
);
|
|
4332
|
+
}
|
|
3876
4333
|
return h(
|
|
3877
4334
|
"svg",
|
|
3878
4335
|
common,
|
|
@@ -3932,6 +4389,7 @@ function apply(ctx) {
|
|
|
3932
4389
|
}, []);
|
|
3933
4390
|
const openRuns = import_react.default.useCallback(() => setView("runs"), []);
|
|
3934
4391
|
const openSettings = import_react.default.useCallback(() => setView("settings"), []);
|
|
4392
|
+
const openSubscriptions = import_react.default.useCallback(() => setView("subscriptions"), []);
|
|
3935
4393
|
const openAbout = import_react.default.useCallback(() => setAboutOpen(true), []);
|
|
3936
4394
|
const state = value.state;
|
|
3937
4395
|
const plugin = state?.plugin;
|
|
@@ -3962,7 +4420,7 @@ function apply(ctx) {
|
|
|
3962
4420
|
...digestTarget2 === void 0 ? {} : { selected: digestTarget2 },
|
|
3963
4421
|
onSelect: setDigestTarget,
|
|
3964
4422
|
onOpenRuns: openRuns
|
|
3965
|
-
}) : view === "runs" ? h(RunsView, { t, store: value, controller, onOpenDigest: openDigest }) : h(SettingsView, { t, store: value, pickDirectory });
|
|
4423
|
+
}) : view === "runs" ? h(RunsView, { t, store: value, controller, onOpenDigest: openDigest }) : view === "subscriptions" ? h(SubscriptionsView, { t, store: value, onOpenSettings: openSettings }) : h(SettingsView, { t, store: value, pickDirectory, onOpenSubscriptions: openSubscriptions });
|
|
3966
4424
|
return h(
|
|
3967
4425
|
"div",
|
|
3968
4426
|
{ className: "dshgt-root dshgt-shell" },
|
|
@@ -67,9 +67,13 @@ async function execCapture(file, args, options = {}) {
|
|
|
67
67
|
const child = spawn(file, args, {
|
|
68
68
|
cwd: options.cwd,
|
|
69
69
|
env: options.env ?? process.env,
|
|
70
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
70
|
+
stdio: [options.input === void 0 ? "ignore" : "pipe", "pipe", "pipe"],
|
|
71
71
|
windowsHide: true
|
|
72
72
|
});
|
|
73
|
+
if (options.input !== void 0) {
|
|
74
|
+
child.stdin?.on("error", () => void 0);
|
|
75
|
+
child.stdin?.end(options.input);
|
|
76
|
+
}
|
|
73
77
|
let stdout = "";
|
|
74
78
|
let stderr = "";
|
|
75
79
|
let timedOut = false;
|