@azure-id/orc 2.0.2 → 2.1.1
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 +455 -0
- package/README-id.md +52 -23
- package/README.md +36 -20
- package/bin/build-agents.js +205 -206
- package/bin/clear-logs.js +620 -0
- package/bin/cli.js +47417 -46420
- package/bin/fix.js +459 -0
- package/bin/gotcha.js +288 -8
- package/bin/habit.js +1538 -1453
- package/bin/mockrun-catalog.js +3 -0
- package/bin/onboarding-content.js +2 -1
- package/bin/pricing.json +28 -21
- package/bin/trace-write.js +869 -657
- package/bin/verify-contracts.js +5552 -5471
- package/bin/verify-package.js +716 -705
- package/bin/webui/api.js +125 -6
- package/bin/webui/css/panels/hookui.css +79 -0
- package/bin/webui/fixtures/behaviour.js +30 -0
- package/bin/webui/fixtures/extra.js +2036 -2036
- package/bin/webui/fixtures/flow.js +81 -81
- package/bin/webui/fixtures/hookui.js +506 -431
- package/bin/webui/fixtures/index.js +32 -3
- package/bin/webui/fixtures/knowledge.js +2 -2
- package/bin/webui/fixtures/maintenance.js +123 -42
- package/bin/webui/fixtures/rules.js +1007 -1002
- package/bin/webui/fixtures/settings.js +6 -7
- package/bin/webui/fixtures/stats.js +9 -6
- package/bin/webui/fixtures/wait.js +98 -97
- package/bin/webui/i18n/en/behaviour.json +13 -0
- package/bin/webui/i18n/en/hookui.json +290 -194
- package/bin/webui/i18n/en/maintenance.json +71 -52
- package/bin/webui/i18n/en/settings.json +60 -60
- package/bin/webui/i18n/id/behaviour.json +13 -0
- package/bin/webui/i18n/id/hookui.json +290 -194
- package/bin/webui/i18n/id/maintenance.json +71 -52
- package/bin/webui/i18n/id/settings.json +60 -60
- package/bin/webui/js/05-banners.js +181 -172
- package/bin/webui/js/06-edit.js +193 -183
- package/bin/webui/js/panels/behaviour.js +77 -12
- package/bin/webui/js/panels/hookui.js +2196 -1691
- package/bin/webui/js/panels/maintenance.js +336 -235
- package/bin/webui/js/panels/settings.js +726 -719
- package/mock-run/INDEX.md +1 -0
- package/mock-run/a-normal-day.md +2 -2
- package/mock-run/extra-slots.md +177 -177
- package/mock-run/habits.md +1 -1
- package/mock-run/orc-aftermath.md +392 -392
- package/mock-run/orc-budget.md +29 -33
- package/mock-run/orc-cli.md +200 -200
- package/mock-run/orc-explain.md +86 -86
- package/mock-run/orc-extra.md +389 -392
- package/mock-run/orc-fast.md +2 -2
- package/mock-run/orc-fix.md +87 -0
- package/mock-run/orc-pattern.md +112 -112
- package/mock-run/orc-quick.md +146 -146
- package/mock-run/orc.md +4 -4
- package/package.json +1 -1
- package/templates/agents/MODEL-MAPPING.md +176 -173
- package/templates/agents/orc-analyze-mini-sonnet-5-high.md +2 -2
- package/templates/agents/{orc-claude-writer-opus-5-med.md → orc-claude-writer-opus-5-low.md} +4 -4
- package/templates/agents/orc-executor-haiku-4-5.md +1 -1
- package/templates/agents/orc-executor-opus-5-low.md +1 -1
- package/templates/agents/orc-executor-sonnet-4-6-high.md +1 -1
- package/templates/agents/orc-executor-sonnet-4-6-med.md +1 -1
- package/templates/agents/orc-executor-sonnet-5-high.md +2 -2
- package/templates/agents/orc-executor-sonnet-5-low.md +155 -0
- package/templates/agents/orc-executor-sonnet-5-med.md +155 -0
- package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +2 -2
- package/templates/agents/orc-planner-mini-sonnet-5-high.md +2 -2
- package/templates/agents/{orc-recon-sonnet-4-6-med.md → orc-recon-sonnet-5-med.md} +4 -4
- package/templates/agents/orc-retro-sonnet-5-high.md +2 -2
- package/templates/agents/{orc-reviewer-opus-5-med.md → orc-reviewer-opus-5-low.md} +4 -4
- package/templates/agents/{orc-wiki-scanner-opus-5-med.md → orc-wiki-scanner-opus-5-low.md} +3 -3
- package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +2 -2
- package/templates/commands/orc-fast.md +10 -10
- package/templates/commands/orc-fix.md +18 -0
- package/templates/commands/orc-wiki.md +64 -64
- package/templates/hooks/README.md +75 -7
- package/templates/hooks/orc-session-hook.js +78 -3
- package/templates/hooks/orc-statusline-render.js +317 -23
- package/templates/hooks/orc-statusline.js +162 -49
- package/templates/hooks/orc-subagent-line.js +23 -5
- package/templates/hooks/orc-weather-fetch.js +123 -0
- package/templates/skills/_shared/extra-dispatch.md +1331 -1331
- package/templates/skills/_shared/gotchas.md +27 -7
- package/templates/skills/_shared/habits.md +2 -2
- package/templates/skills/_shared/opus5-only.md +137 -137
- package/templates/skills/_shared/phases/review.md +2 -2
- package/templates/skills/_shared/phases/trace-verbs.md +17 -3
- package/templates/skills/_shared/phases/trace.md +136 -136
- package/templates/skills/_shared/review-slice.md +28 -1
- package/templates/skills/_shared/wait.md +1 -0
- package/templates/skills/orc/README.md +2 -2
- package/templates/skills/orc/SKILL.md +227 -227
- package/templates/skills/orc/config.md +25 -27
- package/templates/skills/orc/examples/full-run-mock.md +74 -73
- package/templates/skills/orc/references/effort-and-mode.md +222 -222
- package/templates/skills/orc/references/preflight-report.md +3 -3
- package/templates/skills/orc/references/ultra-mode.md +1 -1
- package/templates/skills/orc/schemas/checkpoint.md +122 -122
- package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +3 -3
- package/templates/skills/orc/subskills/orc-review-verify/core.md +1 -1
- package/templates/skills/orc-analyze/SKILL.md +4 -2
- package/templates/skills/orc-claude/SKILL.md +14 -14
- package/templates/skills/orc-claude/examples/claude-run-mock.md +65 -65
- package/templates/skills/orc-diy/SKILL.md +5 -5
- package/templates/skills/orc-fast/SKILL.md +210 -208
- package/templates/skills/orc-fix/SKILL.md +110 -0
- package/templates/skills/orc-grill/SKILL.md +232 -232
- package/templates/skills/orc-grill/references/grill-doc.md +1 -1
- package/templates/skills/orc-mini/SKILL.md +4 -4
- package/templates/skills/orc-mini/examples/mini-run-mock.md +4 -2
- package/templates/skills/orc-quick/README.md +536 -536
- package/templates/skills/orc-quick/SKILL.md +2 -2
- package/templates/skills/orc-quick/references/context-doc.md +145 -145
- package/templates/skills/orc-quick/references/dispatch-gate.md +220 -219
- package/templates/skills/orc-quick/references/gh-mode.md +4 -2
- package/templates/skills/orc-retro/SKILL.md +1 -1
- package/templates/skills/orc-retro/examples/retro-mock.md +16 -16
- package/templates/skills/orc-wiki/README.md +325 -325
- package/templates/skills/orc-wiki/SKILL.md +195 -195
- package/templates/skills/orc-wiki/examples/wiki-run-mock.md +37 -37
- package/templates/skills/orc-wiki/references/extra.md +2 -2
- package/templates/skills/orc-wiki/references/partial-refresh.md +276 -271
- package/templates/skills/orc-wiki/references/phases/phase-0.md +1 -1
- package/templates/skills/orc-wiki/references/phases/phase-2.md +3 -3
- package/templates/skills/orc-wiki/references/phases/phase-3c.md +3 -2
- package/templates/agents/orc-claude-writer-opus-4-8-high.md +0 -48
- package/templates/agents/orc-wiki-scanner-opus-4-8-high.md +0 -74
|
@@ -1,52 +1,71 @@
|
|
|
1
|
-
{
|
|
2
|
-
"maintenance.title": "Pemeliharaan",
|
|
3
|
-
"maintenance.sub": "update · upgrade · doctor --fix. Pratinjau dulu, setujui, baru jalan — tidak pernah otomatis.",
|
|
4
|
-
"maintenance.banner": "Tidak ada di panel ini yang jalan sendiri. Setiap aksi menampilkan pratinjau hanya-baca milik CLI lebih dulu, beserta perintah persis yang akan dijalankan.",
|
|
5
|
-
"maintenance.network": "Menjangkau jaringan dan mengganti paket yang terpasang.",
|
|
6
|
-
"maintenance.advanced": "Lanjutan",
|
|
7
|
-
"maintenance.advancedNote": "Semua di atas menyasar proyek INI. Yang di bawah menjangkau di luar proyek, jadi dipisahkan dan tetap dipratinjau dengan cara yang sama.",
|
|
8
|
-
"maintenance.globalNote": "Menyasar instalasi GLOBAL di ~/.claude, bukan proyek ini.",
|
|
9
|
-
"maintenance.globalWarn": "Ini menulis ke instalasi GLOBAL di ~/.claude — semua proyek di mesin ini akan melihat hasilnya. Pratinjau di bawah dibaca dari instalasi global yang sama, bukan dari proyek ini.",
|
|
10
|
-
"maintenance.checking": "memeriksa rilis yang lebih baru…",
|
|
11
|
-
"maintenance.checkAgain": "Periksa lagi",
|
|
12
|
-
"maintenance.checkFailed": "pemeriksaan gagal.",
|
|
13
|
-
"maintenance.couldNotCheck": "Tidak bisa memeriksa.",
|
|
14
|
-
"maintenance.preview": "Pratinjau…",
|
|
15
|
-
"maintenance.lastRun": "Jalan terakhir",
|
|
16
|
-
"maintenance.nothingRun": "Belum ada yang dijalankan dari panel ini.",
|
|
17
|
-
"maintenance.noOutput": "(belum ada keluaran)",
|
|
18
|
-
"maintenance.running": "berjalan",
|
|
19
|
-
"maintenance.failed": "gagal",
|
|
20
|
-
"maintenance.previewTitle": "Pratinjau — {command}",
|
|
21
|
-
"maintenance.previewFrom": "Pratinjau berasal dari: {command} (hanya baca).",
|
|
22
|
-
"maintenance.waitingRuns": "{n} run masih menunggu.",
|
|
23
|
-
"maintenance.waitingBody": "Update mengubah skill yang akan dipakai run itu saat dilanjutkan: {slugs}",
|
|
24
|
-
"maintenance.waitingAck": "Saya paham — lanjutkan saja",
|
|
25
|
-
"maintenance.dirtyTree": "Working tree punya perubahan yang belum di-commit. `orc upgrade` mengganti paket selagi perubahan itu masih ada.",
|
|
26
|
-
"maintenance.installed": "terpasang",
|
|
27
|
-
"maintenance.available": "tersedia",
|
|
28
|
-
"maintenance.availableUnknown": "tidak bisa diperiksa (luring?)",
|
|
29
|
-
"maintenance.source": "sumber",
|
|
30
|
-
"maintenance.checkedAt": "versi dibaca dari",
|
|
31
|
-
"maintenance.updateAvailable": "pembaruan tersedia",
|
|
32
|
-
"maintenance.yes": "ya",
|
|
33
|
-
"maintenance.no": "tidak",
|
|
34
|
-
"maintenance.upgradeNote": "Ini yang akan dipasang. `Periksa saja` hanya membaca ulang versinya tanpa mengubah apa pun.",
|
|
35
|
-
"maintenance.installedPayload": "payload terpasang",
|
|
36
|
-
"maintenance.thisCli": "cli ini",
|
|
37
|
-
"maintenance.findings": "temuan",
|
|
38
|
-
"maintenance.healthy": "orc doctor melaporkan instalasi sehat — ini akan jadi salin ulang tanpa efek.",
|
|
39
|
-
"maintenance.wouldDelete": "{n} berkas berikut akan DIHAPUS:",
|
|
40
|
-
"maintenance.wouldDeleteNone": "Tidak ada berkas yatim terdeteksi — tidak ada yang akan dihapus.",
|
|
41
|
-
"maintenance.checkOnly": "Periksa saja",
|
|
42
|
-
"maintenance.checkOnlyDone": "Pemeriksaan versi selesai — lihat panel di atas. Tidak ada yang diubah.",
|
|
43
|
-
"maintenance.applyPrune": "Hapus dan update",
|
|
44
|
-
"maintenance.applyUpgrade": "Upgrade sekarang",
|
|
45
|
-
"maintenance.apply": "Terapkan",
|
|
46
|
-
"maintenance.started": "Menjalankan: {command}",
|
|
47
|
-
"maintenance.willRestart": "Ini mengubah kode yang dijalankan panel. Setelah selesai, panel dijalankan lagi pada alamat yang sama dan halaman ini dimuat ulang.",
|
|
48
|
-
"maintenance.restarting": "Selesai. Menjalankan panel lagi pada alamat yang sama, lalu memuat ulang halaman ini.",
|
|
49
|
-
"maintenance.restartFailed": "Panel tidak dapat dijalankan lagi sendiri. Panel masih bekerja, tetapi masih memakai kode lama. Jalankan dua perintah ini:",
|
|
50
|
-
"maintenance.restartTimeout": "Panel tidak menjawab lagi tepat waktu.",
|
|
51
|
-
"maintenance.startFail": "Tidak bisa memulainya."
|
|
52
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"maintenance.title": "Pemeliharaan",
|
|
3
|
+
"maintenance.sub": "update · upgrade · doctor --fix. Pratinjau dulu, setujui, baru jalan — tidak pernah otomatis.",
|
|
4
|
+
"maintenance.banner": "Tidak ada di panel ini yang jalan sendiri. Setiap aksi menampilkan pratinjau hanya-baca milik CLI lebih dulu, beserta perintah persis yang akan dijalankan.",
|
|
5
|
+
"maintenance.network": "Menjangkau jaringan dan mengganti paket yang terpasang.",
|
|
6
|
+
"maintenance.advanced": "Lanjutan",
|
|
7
|
+
"maintenance.advancedNote": "Semua di atas menyasar proyek INI. Yang di bawah menjangkau di luar proyek, jadi dipisahkan dan tetap dipratinjau dengan cara yang sama.",
|
|
8
|
+
"maintenance.globalNote": "Menyasar instalasi GLOBAL di ~/.claude, bukan proyek ini.",
|
|
9
|
+
"maintenance.globalWarn": "Ini menulis ke instalasi GLOBAL di ~/.claude — semua proyek di mesin ini akan melihat hasilnya. Pratinjau di bawah dibaca dari instalasi global yang sama, bukan dari proyek ini.",
|
|
10
|
+
"maintenance.checking": "memeriksa rilis yang lebih baru…",
|
|
11
|
+
"maintenance.checkAgain": "Periksa lagi",
|
|
12
|
+
"maintenance.checkFailed": "pemeriksaan gagal.",
|
|
13
|
+
"maintenance.couldNotCheck": "Tidak bisa memeriksa.",
|
|
14
|
+
"maintenance.preview": "Pratinjau…",
|
|
15
|
+
"maintenance.lastRun": "Jalan terakhir",
|
|
16
|
+
"maintenance.nothingRun": "Belum ada yang dijalankan dari panel ini.",
|
|
17
|
+
"maintenance.noOutput": "(belum ada keluaran)",
|
|
18
|
+
"maintenance.running": "berjalan",
|
|
19
|
+
"maintenance.failed": "gagal",
|
|
20
|
+
"maintenance.previewTitle": "Pratinjau — {command}",
|
|
21
|
+
"maintenance.previewFrom": "Pratinjau berasal dari: {command} (hanya baca).",
|
|
22
|
+
"maintenance.waitingRuns": "{n} run masih menunggu.",
|
|
23
|
+
"maintenance.waitingBody": "Update mengubah skill yang akan dipakai run itu saat dilanjutkan: {slugs}",
|
|
24
|
+
"maintenance.waitingAck": "Saya paham — lanjutkan saja",
|
|
25
|
+
"maintenance.dirtyTree": "Working tree punya perubahan yang belum di-commit. `orc upgrade` mengganti paket selagi perubahan itu masih ada.",
|
|
26
|
+
"maintenance.installed": "terpasang",
|
|
27
|
+
"maintenance.available": "tersedia",
|
|
28
|
+
"maintenance.availableUnknown": "tidak bisa diperiksa (luring?)",
|
|
29
|
+
"maintenance.source": "sumber",
|
|
30
|
+
"maintenance.checkedAt": "versi dibaca dari",
|
|
31
|
+
"maintenance.updateAvailable": "pembaruan tersedia",
|
|
32
|
+
"maintenance.yes": "ya",
|
|
33
|
+
"maintenance.no": "tidak",
|
|
34
|
+
"maintenance.upgradeNote": "Ini yang akan dipasang. `Periksa saja` hanya membaca ulang versinya tanpa mengubah apa pun.",
|
|
35
|
+
"maintenance.installedPayload": "payload terpasang",
|
|
36
|
+
"maintenance.thisCli": "cli ini",
|
|
37
|
+
"maintenance.findings": "temuan",
|
|
38
|
+
"maintenance.healthy": "orc doctor melaporkan instalasi sehat — ini akan jadi salin ulang tanpa efek.",
|
|
39
|
+
"maintenance.wouldDelete": "{n} berkas berikut akan DIHAPUS:",
|
|
40
|
+
"maintenance.wouldDeleteNone": "Tidak ada berkas yatim terdeteksi — tidak ada yang akan dihapus.",
|
|
41
|
+
"maintenance.checkOnly": "Periksa saja",
|
|
42
|
+
"maintenance.checkOnlyDone": "Pemeriksaan versi selesai — lihat panel di atas. Tidak ada yang diubah.",
|
|
43
|
+
"maintenance.applyPrune": "Hapus dan update",
|
|
44
|
+
"maintenance.applyUpgrade": "Upgrade sekarang",
|
|
45
|
+
"maintenance.apply": "Terapkan",
|
|
46
|
+
"maintenance.started": "Menjalankan: {command}",
|
|
47
|
+
"maintenance.willRestart": "Ini mengubah kode yang dijalankan panel. Setelah selesai, panel dijalankan lagi pada alamat yang sama dan halaman ini dimuat ulang.",
|
|
48
|
+
"maintenance.restarting": "Selesai. Menjalankan panel lagi pada alamat yang sama, lalu memuat ulang halaman ini.",
|
|
49
|
+
"maintenance.restartFailed": "Panel tidak dapat dijalankan lagi sendiri. Panel masih bekerja, tetapi masih memakai kode lama. Jalankan dua perintah ini:",
|
|
50
|
+
"maintenance.restartTimeout": "Panel tidak menjawab lagi tepat waktu.",
|
|
51
|
+
"maintenance.startFail": "Tidak bisa memulainya.",
|
|
52
|
+
"maintenance.clearLogs.olderThan": "Lebih lama dari {days} (Settings ▸ retensi log).",
|
|
53
|
+
"maintenance.clearLogs.days": "{n} hari",
|
|
54
|
+
"maintenance.clearLogs.lastSweep": "Pembersihan otomatis terakhir: {date}, {files} file.",
|
|
55
|
+
"maintenance.clearLogs.noSweepYet": "Pembersihan otomatis aktif. Belum pernah berjalan.",
|
|
56
|
+
"maintenance.clearLogs.autoOff": "Pembersihan otomatis mati (log_retention_auto).",
|
|
57
|
+
"maintenance.clearLogs.pruned": "orc stats masih menghitung {n} run yang sudah dihapus.",
|
|
58
|
+
"maintenance.clearLogs.cutoff": "batas",
|
|
59
|
+
"maintenance.clearLogs.totals": "akan dihapus",
|
|
60
|
+
"maintenance.clearLogs.totalsValue": "{units} unit · {files} file · {bytes} byte",
|
|
61
|
+
"maintenance.clearLogs.none": "Tidak ada yang cukup lama untuk dihapus.",
|
|
62
|
+
"maintenance.clearLogs.colPath": "file",
|
|
63
|
+
"maintenance.clearLogs.colKind": "jenis",
|
|
64
|
+
"maintenance.clearLogs.colLast": "aktivitas terakhir",
|
|
65
|
+
"maintenance.clearLogs.colBytes": "byte",
|
|
66
|
+
"maintenance.clearLogs.kept": "Disimpan: {n} — buka untuk melihat alasannya",
|
|
67
|
+
"maintenance.clearLogs.defaultDir": "Folder default lama {path} masih berisi {files} file ({bytes} byte). Tidak ada pembaca yang melihatnya. Untuk membersihkannya dengan aturan yang sama, jalankan `orc clear logs --include-default-dir` di terminal.",
|
|
68
|
+
"maintenance.clearLogs.defaultIncluded": "Folder default lama {path} ikut diproses ({files} file, {bytes} byte).",
|
|
69
|
+
"maintenance.clearLogs.apply": "Hapus log lama",
|
|
70
|
+
"maintenance.clearLogs.waitingBody": "Run yang sedang menunggu tidak pernah dihapus. Run ini tetap ada: {slugs}"
|
|
71
|
+
}
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
{
|
|
2
|
-
"settings.title": "Pengaturan",
|
|
3
|
-
"settings.sub": "Semua kunci yang dikenal `orc config`. Setiap perubahan menjalankan perintah CLI aslinya, jadi validator CLI yang memutuskan.",
|
|
4
|
-
"settings.profiles": "Profil",
|
|
5
|
-
"settings.recommend": "Sarankan profil",
|
|
6
|
-
"settings.filter": "Saring kunci… (tekan / )",
|
|
7
|
-
"settings.filterAria": "Saring pengaturan berdasarkan kunci atau deskripsi",
|
|
8
|
-
"settings.changedOnly": "Hanya yang diubah ({n})",
|
|
9
|
-
"settings.changedTitle": "Tampilkan hanya kunci yang nilainya beda dari default.",
|
|
10
|
-
"settings.changedNone": "Belum ada yang di-override — semua kunci masih default.",
|
|
11
|
-
"settings.collapseAll": "Tutup semua",
|
|
12
|
-
"settings.expandAll": "Buka semua",
|
|
13
|
-
"settings.matches": "{n} cocok",
|
|
14
|
-
"settings.matchesPlural": "{n} cocok",
|
|
15
|
-
"settings.keys": "{n} kunci",
|
|
16
|
-
"settings.keysPlural": "{n} kunci",
|
|
17
|
-
"settings.ofTotal": "{n} dari {total}",
|
|
18
|
-
"settings.readFail": "Config gagal dibaca.",
|
|
19
|
-
"settings.file.title": "Berkas override",
|
|
20
|
-
"settings.file.file": "berkas",
|
|
21
|
-
"settings.file.state": "kondisi",
|
|
22
|
-
"settings.file.exists": "ada — hanya kunci yang diubah yang ditulis di sini",
|
|
23
|
-
"settings.file.absent": "belum dibuat (semua kunci masih default)",
|
|
24
|
-
"settings.file.traceNote": "Pencatatan behavior-trace
|
|
25
|
-
"settings.tier.common": "Umum",
|
|
26
|
-
"settings.tier.advanced": "Lanjutan",
|
|
27
|
-
"settings.tierDesc.common": "Kunci yang paling sering disentuh. Kalau Anda hanya mengubah satu hal, kemungkinan besar ada di sini.",
|
|
28
|
-
"settings.tierDesc.advanced": "Sisa dari semua yang dikenal ORC. Default-nya disengaja; ubah kalau Anda punya alasan.",
|
|
29
|
-
"settings.inert": "mati",
|
|
30
|
-
"settings.shadowed": "tertutup",
|
|
31
|
-
"settings.handEdited.title": "Kunci yang diedit manual",
|
|
32
|
-
"settings.handEdited.note": "Kunci ini tidak ada di registry config, jadi `orc config set` menolaknya dan panel ini tidak akan menulisnya. rubric_bands_override memang dirancang begitu: ditulis tangan dengan sengaja. Edit langsung berkas YAML-nya.",
|
|
33
|
-
"settings.handEdited.readonly": "hanya baca di sini — edit manual orc.config.yaml",
|
|
34
|
-
"settings.ladder.title": "Tangga skor → model",
|
|
35
|
-
"settings.ladder.opus5": "opus5_only AKTIF — executor memakai tangga effort
|
|
36
|
-
"settings.ladder.override": "Ada rubric_bands_override tulisan tangan di berkas. Itu menggantikan tabel default (dan sendirinya dikalahkan oleh opus5_only).",
|
|
37
|
-
"settings.ladder.default": "Tabel default
|
|
38
|
-
"settings.ladder.note": "Hanya baca — ini diagram, bukan editor. Datanya dari tabel milik CLI, jadi panel tidak menyimpan salinan kedua.",
|
|
39
|
-
"profiles.title": "Profil config",
|
|
40
|
-
"profiles.note": "Profil hanya menulis kunci yang sudah ada dan tervalidasi — tidak ada yang diatur di luar yang bisa Anda atur sendiri.",
|
|
41
|
-
"profiles.apply": "Terapkan",
|
|
42
|
-
"profiles.wouldChange": "akan mengubah: {list}",
|
|
43
|
-
"profiles.noChange": "repo ini sudah memakai profil itu — tidak ada yang berubah",
|
|
44
|
-
"recommend.title": "Profil yang disarankan",
|
|
45
|
-
"recommend.note": "Hanya baca: ini melihat repo Anda dan menyarankan satu profil. Tidak ada yang diubah.",
|
|
46
|
-
"recommend.applyIt": "Terapkan {name}",
|
|
47
|
-
"settings.retired.title": "Setelan yang sudah ditarik",
|
|
48
|
-
"settings.retired.note": "Kunci ini sudah dihapus dari ORC. Barisnya masih ada di berkas konfigurasi Anda. ORC tidak membacanya dan tidak mengubahnya. Anda boleh menghapus barisnya kapan saja.",
|
|
49
|
-
"settings.retired.badge": "tidak dibaca",
|
|
50
|
-
"settings.retired.readonly": "Sudah dihapus. ORC tidak lagi membaca kunci ini.",
|
|
51
|
-
"settings.retired.removedIn": "Dihapus di v",
|
|
52
|
-
"settings.ranks.title": "Apa yang menentukan",
|
|
53
|
-
"settings.ranks.note": "Beberapa pengaturan menjawab pertanyaan yang sama. Baca satu keluarga dari atas ke bawah dan berhenti di peringkat pertama yang menjawab. Ini yang dilakukan berkas konfigurasi Anda, bukan yang bisa dilakukannya.",
|
|
54
|
-
"settings.ranks.none": "Tidak ada keluarga yang bersaing — setiap pengaturan di sini menjawab pertanyaannya sendiri.",
|
|
55
|
-
"settings.ranks.answeredBy": "Dijawab di {prio} oleh {key}.",
|
|
56
|
-
"settings.ranks.answeredByDefault": "Dijawab di {prio} oleh bawaan bawaan paket — tidak ada peringkat di atasnya yang menjawab.",
|
|
57
|
-
"settings.ranks.legend": "Status:",
|
|
58
|
-
"settings.lanes.label": "Dibaca oleh:",
|
|
59
|
-
"settings.lanes.none": "tidak ada lane — jembatan orc extra yang membacanya"
|
|
60
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"settings.title": "Pengaturan",
|
|
3
|
+
"settings.sub": "Semua kunci yang dikenal `orc config`. Setiap perubahan menjalankan perintah CLI aslinya, jadi validator CLI yang memutuskan.",
|
|
4
|
+
"settings.profiles": "Profil",
|
|
5
|
+
"settings.recommend": "Sarankan profil",
|
|
6
|
+
"settings.filter": "Saring kunci… (tekan / )",
|
|
7
|
+
"settings.filterAria": "Saring pengaturan berdasarkan kunci atau deskripsi",
|
|
8
|
+
"settings.changedOnly": "Hanya yang diubah ({n})",
|
|
9
|
+
"settings.changedTitle": "Tampilkan hanya kunci yang nilainya beda dari default.",
|
|
10
|
+
"settings.changedNone": "Belum ada yang di-override — semua kunci masih default.",
|
|
11
|
+
"settings.collapseAll": "Tutup semua",
|
|
12
|
+
"settings.expandAll": "Buka semua",
|
|
13
|
+
"settings.matches": "{n} cocok",
|
|
14
|
+
"settings.matchesPlural": "{n} cocok",
|
|
15
|
+
"settings.keys": "{n} kunci",
|
|
16
|
+
"settings.keysPlural": "{n} kunci",
|
|
17
|
+
"settings.ofTotal": "{n} dari {total}",
|
|
18
|
+
"settings.readFail": "Config gagal dibaca.",
|
|
19
|
+
"settings.file.title": "Berkas override",
|
|
20
|
+
"settings.file.file": "berkas",
|
|
21
|
+
"settings.file.state": "kondisi",
|
|
22
|
+
"settings.file.exists": "ada — hanya kunci yang diubah yang ditulis di sini",
|
|
23
|
+
"settings.file.absent": "belum dibuat (semua kunci masih default)",
|
|
24
|
+
"settings.file.traceNote": "Pencatatan behavior-trace selalu AKTIF dan tidak bisa diubah. Setiap run menulis satu trace. Foldernya (log_dir) dan lama penyimpanannya (log_retention_days, log_retention_auto) adalah setting. Tidak ada yang dihapus sampai Anda menjalankan `orc clear logs --apply` atau menyalakan pembersihan otomatis.",
|
|
25
|
+
"settings.tier.common": "Umum",
|
|
26
|
+
"settings.tier.advanced": "Lanjutan",
|
|
27
|
+
"settings.tierDesc.common": "Kunci yang paling sering disentuh. Kalau Anda hanya mengubah satu hal, kemungkinan besar ada di sini.",
|
|
28
|
+
"settings.tierDesc.advanced": "Sisa dari semua yang dikenal ORC. Default-nya disengaja; ubah kalau Anda punya alasan.",
|
|
29
|
+
"settings.inert": "mati",
|
|
30
|
+
"settings.shadowed": "tertutup",
|
|
31
|
+
"settings.handEdited.title": "Kunci yang diedit manual",
|
|
32
|
+
"settings.handEdited.note": "Kunci ini tidak ada di registry config, jadi `orc config set` menolaknya dan panel ini tidak akan menulisnya. rubric_bands_override memang dirancang begitu: ditulis tangan dengan sengaja. Edit langsung berkas YAML-nya.",
|
|
33
|
+
"settings.handEdited.readonly": "hanya baca di sini — edit manual orc.config.yaml",
|
|
34
|
+
"settings.ladder.title": "Tangga skor → model",
|
|
35
|
+
"settings.ladder.opus5": "opus5_only AKTIF — executor memakai tangga effort 2 pita yang tetap. Ini mengalahkan tabel default dan rubric_bands_override.",
|
|
36
|
+
"settings.ladder.override": "Ada rubric_bands_override tulisan tangan di berkas. Itu menggantikan tabel default (dan sendirinya dikalahkan oleh opus5_only).",
|
|
37
|
+
"settings.ladder.default": "Tabel default 5 pita. Tabel diselesaikan dengan yang tertinggi menang: opus5_only > rubric_bands_override > yang ini.",
|
|
38
|
+
"settings.ladder.note": "Hanya baca — ini diagram, bukan editor. Datanya dari tabel milik CLI, jadi panel tidak menyimpan salinan kedua.",
|
|
39
|
+
"profiles.title": "Profil config",
|
|
40
|
+
"profiles.note": "Profil hanya menulis kunci yang sudah ada dan tervalidasi — tidak ada yang diatur di luar yang bisa Anda atur sendiri.",
|
|
41
|
+
"profiles.apply": "Terapkan",
|
|
42
|
+
"profiles.wouldChange": "akan mengubah: {list}",
|
|
43
|
+
"profiles.noChange": "repo ini sudah memakai profil itu — tidak ada yang berubah",
|
|
44
|
+
"recommend.title": "Profil yang disarankan",
|
|
45
|
+
"recommend.note": "Hanya baca: ini melihat repo Anda dan menyarankan satu profil. Tidak ada yang diubah.",
|
|
46
|
+
"recommend.applyIt": "Terapkan {name}",
|
|
47
|
+
"settings.retired.title": "Setelan yang sudah ditarik",
|
|
48
|
+
"settings.retired.note": "Kunci ini sudah dihapus dari ORC. Barisnya masih ada di berkas konfigurasi Anda. ORC tidak membacanya dan tidak mengubahnya. Anda boleh menghapus barisnya kapan saja.",
|
|
49
|
+
"settings.retired.badge": "tidak dibaca",
|
|
50
|
+
"settings.retired.readonly": "Sudah dihapus. ORC tidak lagi membaca kunci ini.",
|
|
51
|
+
"settings.retired.removedIn": "Dihapus di v",
|
|
52
|
+
"settings.ranks.title": "Apa yang menentukan",
|
|
53
|
+
"settings.ranks.note": "Beberapa pengaturan menjawab pertanyaan yang sama. Baca satu keluarga dari atas ke bawah dan berhenti di peringkat pertama yang menjawab. Ini yang dilakukan berkas konfigurasi Anda, bukan yang bisa dilakukannya.",
|
|
54
|
+
"settings.ranks.none": "Tidak ada keluarga yang bersaing — setiap pengaturan di sini menjawab pertanyaannya sendiri.",
|
|
55
|
+
"settings.ranks.answeredBy": "Dijawab di {prio} oleh {key}.",
|
|
56
|
+
"settings.ranks.answeredByDefault": "Dijawab di {prio} oleh bawaan bawaan paket — tidak ada peringkat di atasnya yang menjawab.",
|
|
57
|
+
"settings.ranks.legend": "Status:",
|
|
58
|
+
"settings.lanes.label": "Dibaca oleh:",
|
|
59
|
+
"settings.lanes.none": "tidak ada lane — jembatan orc extra yang membacanya"
|
|
60
|
+
}
|
|
@@ -1,172 +1,181 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/* 05-banners.js — orc ui client
|
|
3
|
-
The shared version promise, the update banner, the changelog modal, and
|
|
4
|
-
renderBanners — including the global-install warning that must be visible on
|
|
5
|
-
EVERY panel (config does not merge, so a global install can win skill
|
|
6
|
-
resolution while this panel edits a project file nothing reads).
|
|
7
|
-
|
|
8
|
-
Loaded by app.html in the order its numeric prefix names. Classic
|
|
9
|
-
script, no import/export: an ES module import carries no query string,
|
|
10
|
-
and every static request here needs the per-launch session token. */
|
|
11
|
-
|
|
12
|
-
/* --------------------------------------------------------------- version -- */
|
|
13
|
-
// `orc version --json` performs a REAL bounded network check against the
|
|
14
|
-
// install source and reports {version, latest, update_available}. Three places
|
|
15
|
-
// want that answer — the Overview tile, the rail badge and the Maintenance
|
|
16
|
-
// upgrade row — so the promise is shared: one check per page load, not three.
|
|
17
|
-
// `refresh()` is the only way to force a second one, and it is a button the
|
|
18
|
-
// user presses; nothing here polls for a new release on its own.
|
|
19
|
-
let versionPromise = null;
|
|
20
|
-
const versionInfo = () => (versionPromise = versionPromise || read("/api/version").then((r) => r.data));
|
|
21
|
-
function refreshVersion() {
|
|
22
|
-
versionPromise = null;
|
|
23
|
-
return versionInfo();
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// The one place that decides what a version payload MEANS, so the tile, the rail
|
|
27
|
-
// and the upgrade row can never disagree about it. `latest: null` is not "up to
|
|
28
|
-
// date" — it is "we could not tell", which is a different thing to show.
|
|
29
|
-
function versionState(v) {
|
|
30
|
-
if (!v) return { kind: "", label: t("version.unknown.label"), note: t("version.unknown.note") };
|
|
31
|
-
if (v.check_disabled) return { kind: "", label: t("version.off.label"), note: t("version.off.note") };
|
|
32
|
-
if (!v.latest) return { kind: "warn", label: t("version.offline.label"), note: t("version.offline.note") };
|
|
33
|
-
if (v.update_available)
|
|
34
|
-
return {
|
|
35
|
-
kind: "warn",
|
|
36
|
-
label: t("version.available.label", { latest: v.latest }),
|
|
37
|
-
note: t("version.available.note", { version: v.version }),
|
|
38
|
-
};
|
|
39
|
-
return {
|
|
40
|
-
kind: "ok",
|
|
41
|
-
label: t("version.current.label"),
|
|
42
|
-
// `install_spec` is CLI data (a package spec), so it is interpolated, never
|
|
43
|
-
// translated — only the sentence around it is ours.
|
|
44
|
-
note: t("version.current.note", { version: v.version, source: v.install_spec || "the install source" }),
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/* ---------------------------------------------------------------- banners -- */
|
|
49
|
-
|
|
50
|
-
// The ONE thing that must be visible on every panel: config does NOT merge, so
|
|
51
|
-
// a global install can win skill resolution while this panel edits a project
|
|
52
|
-
// file nothing reads. Reported here, never fixed here — this UI never edits
|
|
53
|
-
// global config, by design.
|
|
54
|
-
// The update banner. It is a BUTTON, not a notice: the useful question is
|
|
55
|
-
// "what changed", and the answer is one click away rather than on GitHub.
|
|
56
|
-
async function renderUpdateBanner(host) {
|
|
57
|
-
let v;
|
|
58
|
-
try {
|
|
59
|
-
v = await versionInfo();
|
|
60
|
-
} catch (_) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
inner
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
slot.append(el("div", "note", t("changelog.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
slot.append(el("div", "note", t("changelog.
|
|
112
|
-
} else {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (e.
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
/* 05-banners.js — orc ui client
|
|
3
|
+
The shared version promise, the update banner, the changelog modal, and
|
|
4
|
+
renderBanners — including the global-install warning that must be visible on
|
|
5
|
+
EVERY panel (config does not merge, so a global install can win skill
|
|
6
|
+
resolution while this panel edits a project file nothing reads).
|
|
7
|
+
|
|
8
|
+
Loaded by app.html in the order its numeric prefix names. Classic
|
|
9
|
+
script, no import/export: an ES module import carries no query string,
|
|
10
|
+
and every static request here needs the per-launch session token. */
|
|
11
|
+
|
|
12
|
+
/* --------------------------------------------------------------- version -- */
|
|
13
|
+
// `orc version --json` performs a REAL bounded network check against the
|
|
14
|
+
// install source and reports {version, latest, update_available}. Three places
|
|
15
|
+
// want that answer — the Overview tile, the rail badge and the Maintenance
|
|
16
|
+
// upgrade row — so the promise is shared: one check per page load, not three.
|
|
17
|
+
// `refresh()` is the only way to force a second one, and it is a button the
|
|
18
|
+
// user presses; nothing here polls for a new release on its own.
|
|
19
|
+
let versionPromise = null;
|
|
20
|
+
const versionInfo = () => (versionPromise = versionPromise || read("/api/version").then((r) => r.data));
|
|
21
|
+
function refreshVersion() {
|
|
22
|
+
versionPromise = null;
|
|
23
|
+
return versionInfo();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// The one place that decides what a version payload MEANS, so the tile, the rail
|
|
27
|
+
// and the upgrade row can never disagree about it. `latest: null` is not "up to
|
|
28
|
+
// date" — it is "we could not tell", which is a different thing to show.
|
|
29
|
+
function versionState(v) {
|
|
30
|
+
if (!v) return { kind: "", label: t("version.unknown.label"), note: t("version.unknown.note") };
|
|
31
|
+
if (v.check_disabled) return { kind: "", label: t("version.off.label"), note: t("version.off.note") };
|
|
32
|
+
if (!v.latest) return { kind: "warn", label: t("version.offline.label"), note: t("version.offline.note") };
|
|
33
|
+
if (v.update_available)
|
|
34
|
+
return {
|
|
35
|
+
kind: "warn",
|
|
36
|
+
label: t("version.available.label", { latest: v.latest }),
|
|
37
|
+
note: t("version.available.note", { version: v.version }),
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
kind: "ok",
|
|
41
|
+
label: t("version.current.label"),
|
|
42
|
+
// `install_spec` is CLI data (a package spec), so it is interpolated, never
|
|
43
|
+
// translated — only the sentence around it is ours.
|
|
44
|
+
note: t("version.current.note", { version: v.version, source: v.install_spec || "the install source" }),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* ---------------------------------------------------------------- banners -- */
|
|
49
|
+
|
|
50
|
+
// The ONE thing that must be visible on every panel: config does NOT merge, so
|
|
51
|
+
// a global install can win skill resolution while this panel edits a project
|
|
52
|
+
// file nothing reads. Reported here, never fixed here — this UI never edits
|
|
53
|
+
// global config, by design.
|
|
54
|
+
// The update banner. It is a BUTTON, not a notice: the useful question is
|
|
55
|
+
// "what changed", and the answer is one click away rather than on GitHub.
|
|
56
|
+
async function renderUpdateBanner(host, gen) {
|
|
57
|
+
let v;
|
|
58
|
+
try {
|
|
59
|
+
v = await versionInfo();
|
|
60
|
+
} catch (_) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// A newer renderBanners call has cleared the host: do not add a second copy.
|
|
64
|
+
if (gen !== bannerGen) return;
|
|
65
|
+
if (!v || !v.update_available) return;
|
|
66
|
+
|
|
67
|
+
const b = el("button", "banner banner-update");
|
|
68
|
+
b.type = "button";
|
|
69
|
+
const inner = el("div");
|
|
70
|
+
inner.append(el("strong", null, t("banner.update.title", { latest: v.latest, version: v.version })));
|
|
71
|
+
inner.append(el("div", "note", t("banner.update.note")));
|
|
72
|
+
b.append(el("span", "banner-badge", "NEW"), inner, el("span", "banner-more", t("banner.update.cta")));
|
|
73
|
+
b.addEventListener("click", () => showChangelog(v));
|
|
74
|
+
host.append(b);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Fetched lazily — the modal is what needs the changelog, and paying for that
|
|
78
|
+
// request on every page load to fill a box nobody opened is waste.
|
|
79
|
+
async function showChangelog(v) {
|
|
80
|
+
const body = el("div", "stack stack-sm");
|
|
81
|
+
const slot = el("div", "stack stack-sm");
|
|
82
|
+
slot.append(skeleton(4));
|
|
83
|
+
body.append(slot);
|
|
84
|
+
|
|
85
|
+
const close = modal({
|
|
86
|
+
title: t("changelog.title", { version: v.latest }),
|
|
87
|
+
body,
|
|
88
|
+
actions: [
|
|
89
|
+
{ label: t("common.later"), onClick: (c) => c() },
|
|
90
|
+
{
|
|
91
|
+
label: t("changelog.goUpgrade"),
|
|
92
|
+
cls: "btn-primary",
|
|
93
|
+
onClick: (c) => {
|
|
94
|
+
c();
|
|
95
|
+
location.hash = "#/maintenance";
|
|
96
|
+
// The spotlight is armed here and lands after the panel renders — a
|
|
97
|
+
// highlight fired now would point at a node that does not exist yet.
|
|
98
|
+
startUpgradeSpotlight();
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
const d = (await read("/api/changelog")).data;
|
|
106
|
+
slot.replaceChildren();
|
|
107
|
+
if (d.check_disabled) {
|
|
108
|
+
slot.append(el("div", "note", t("changelog.disabled")));
|
|
109
|
+
} else if (!d.fetched) {
|
|
110
|
+
slot.append(el("div", "note", t("changelog.offline")));
|
|
111
|
+
slot.append(el("div", "note", t("changelog.offlineNote")));
|
|
112
|
+
} else if (!d.entries.length) {
|
|
113
|
+
slot.append(el("div", "note", t("changelog.empty")));
|
|
114
|
+
} else {
|
|
115
|
+
for (const e of d.entries) {
|
|
116
|
+
const sec = el("div", "cl-entry");
|
|
117
|
+
const h = el("div", "cl-head");
|
|
118
|
+
h.append(el("span", "cl-version", "v" + e.version));
|
|
119
|
+
if (e.date) h.append(el("span", "cl-date", e.date));
|
|
120
|
+
sec.append(h);
|
|
121
|
+
if (e.title) sec.append(el("div", "cl-title", stripMd(e.title)));
|
|
122
|
+
if (e.body) sec.append(el("div", "cl-body", reflowMd(stripMd(e.body))));
|
|
123
|
+
slot.append(sec);
|
|
124
|
+
}
|
|
125
|
+
slot.append(el("div", "note", t("changelog.source", { src: d.source })));
|
|
126
|
+
}
|
|
127
|
+
} catch (e) {
|
|
128
|
+
slot.replaceChildren(el("div", "note", t("changelog.loadFail", { err: e.message })));
|
|
129
|
+
}
|
|
130
|
+
return close;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// The router calls this on every route, so two calls can overlap. Both banners
|
|
134
|
+
// are appended after an await, so only the NEWEST call may append (here and in
|
|
135
|
+
// renderUpdateBanner), or a banner shows twice.
|
|
136
|
+
let bannerGen = 0;
|
|
137
|
+
async function renderBanners() {
|
|
138
|
+
const gen = ++bannerGen;
|
|
139
|
+
const host = $("#banners");
|
|
140
|
+
host.replaceChildren();
|
|
141
|
+
renderUpdateBanner(host, gen);
|
|
142
|
+
let doctor;
|
|
143
|
+
try {
|
|
144
|
+
doctor = (await read("/api/doctor")).data;
|
|
145
|
+
} catch (_) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (gen !== bannerGen) return;
|
|
149
|
+
if (!doctor) return;
|
|
150
|
+
const g = doctor.global_install || {};
|
|
151
|
+
if (g.present && g.shadows) {
|
|
152
|
+
const finding = (doctor.findings || []).find((f) => f.id === "global-skew" || f.id === "global-retired-agents");
|
|
153
|
+
const b = el("div", "banner");
|
|
154
|
+
// Prose inside the banner flex row, not a panel container: its lines are
|
|
155
|
+
// meant to read tight, so it is deliberately not a `stack`.
|
|
156
|
+
const bannerBody = el("div");
|
|
157
|
+
bannerBody.append(el("strong", null, t("banner.global.title")));
|
|
158
|
+
bannerBody.append(el("div", null, t("banner.global.body")));
|
|
159
|
+
// The finding's own text is the CLI speaking. It is shown verbatim in every
|
|
160
|
+
// language — a doctor message names files and commands.
|
|
161
|
+
if (finding) bannerBody.append(el("div", "note", finding.message));
|
|
162
|
+
// The command that actually clears the finding, copyable. This panel is
|
|
163
|
+
// project-scoped and never writes global config, so handing over the exact
|
|
164
|
+
// line to paste is the whole of what it can do — and a wrong line here is
|
|
165
|
+
// why the warning felt permanent.
|
|
166
|
+
// The global finding's OWN command — not the first fix of any finding.
|
|
167
|
+
const fixCmd = finding && finding.fix_command;
|
|
168
|
+
if (fixCmd) {
|
|
169
|
+
const row = el("div", "banner-fix");
|
|
170
|
+
row.append(el("code", "action-cmd", fixCmd));
|
|
171
|
+
const cp = el("button", "btn btn-ghost btn-sm", t("common.copy"));
|
|
172
|
+
cp.type = "button";
|
|
173
|
+
cp.addEventListener("click", () => copy(fixCmd, t("common.copied")));
|
|
174
|
+
row.append(cp);
|
|
175
|
+
bannerBody.append(row);
|
|
176
|
+
}
|
|
177
|
+
bannerBody.append(el("div", "note", t("banner.global.check")));
|
|
178
|
+
b.append(bannerBody);
|
|
179
|
+
host.append(b);
|
|
180
|
+
}
|
|
181
|
+
}
|