loki-mode 11.17.55 → 11.17.57
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/SKILL.md +2 -2
- package/VERSION +1 -1
- package/dashboard/__init__.py +1 -1
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/BOARD.md +1 -1
- package/docs/v10/PROGRESS.md +6 -0
- package/docs/v10/roadmap-10/01-measurement.md +113 -0
- package/docs/v10/roadmap-10/02-cost.md +76 -0
- package/docs/v10/roadmap-10/03-speed.md +65 -0
- package/docs/v10/roadmap-10/04-first-run.md +61 -0
- package/docs/v10/roadmap-10/05-deploy.md +61 -0
- package/docs/v10/roadmap-10/06-stability.md +64 -0
- package/docs/v10/roadmap-10/07-quality.md +57 -0
- package/docs/v10/roadmap-10/08-proof.md +48 -0
- package/docs/v10/roadmap-10/09-safety.md +74 -0
- package/docs/v10/roadmap-10/README.md +114 -0
- package/loki-ts/dist/cockpit.js +11 -11
- package/loki-ts/dist/loki.js +1135 -1135
- package/mcp/__init__.py +1 -1
- package/package.json +2 -2
- package/packages/control-plane/dist/server.js +124 -123
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-CEzsx-2B.js → AdminPage-D9vxsKmh.js} +1 -1
- package/web-app/dist/assets/{Avatar-CsAVQ-0g.js → Avatar-DfxBpPUo.js} +1 -1
- package/web-app/dist/assets/{Badge-BT5F2jnq.js → Badge-Jtp0w19_.js} +1 -1
- package/web-app/dist/assets/{Button-CQjmQOkX.js → Button-Cfl_Ygum.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-Cuo0FMGe.js → CockpitPage-t_xLPM1y.js} +1 -1
- package/web-app/dist/assets/{ComparePage-BcLSrBTG.js → ComparePage-00e9eUgR.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-DzSPrICj.js → ErrorBoundary-DfoBT_kK.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-DV5kdGO5.js → EvidenceReceiptPanel-Cm--Zldw.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-DWhH8uwF.js → GitHubIssuesPanel-CmZoYExK.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-DPZJL0Ad.js → GitHubPRsPanel-rehTMC_P.js} +1 -1
- package/web-app/dist/assets/{HomePage-CLVmK1C4.js → HomePage-CKgOAUqm.js} +2 -2
- package/web-app/dist/assets/{LoginPage-0qRTmghT.js → LoginPage-DWMk7D-V.js} +1 -1
- package/web-app/dist/assets/{MagicPage-jUDOyd8m.js → MagicPage-BdIzYkjN.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-Dm3PyXt8.js → MetricsPage-DdjN5LJL.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-Dyr5Iv-6.js → NotFoundPage-Cf4GHp9Z.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-CoX7FGHN.js → ProjectPage-BP8u2iFN.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-CQh9mPvU.js → ProjectsPage-CK7R-DIh.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-C1bbN9RT.js → SettingsPage-DNMqOUrM.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-P3Hw9Noe.js → ShowcasePage-RkPgacU3.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-DuClc6j2.js → SystemSettingsPage-COqYOPAP.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-DYWppMXo.js → TeamsPage-CyBIuYhv.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-D2cQ8z97.js → TemplatesPage-5cMJ3uaP.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-7SoZNJnN.js → TerminalOutput-D2as8CHU.js} +1 -1
- package/web-app/dist/assets/{activity-Btrwrman.js → activity-B0HWAVsH.js} +1 -1
- package/web-app/dist/assets/{bell-DyKvtIyq.js → bell-CeapvdDm.js} +1 -1
- package/web-app/dist/assets/{bot-CMCluK2w.js → bot-C9_qiFCl.js} +1 -1
- package/web-app/dist/assets/{check-6Ps0J2A0.js → check-ZLkbkjP8.js} +1 -1
- package/web-app/dist/assets/{chevron-left-UFVem1_Q.js → chevron-left-DzAOofqV.js} +1 -1
- package/web-app/dist/assets/{circle-alert-DN06PnoW.js → circle-alert-C_P6Sbnq.js} +1 -1
- package/web-app/dist/assets/{clock-ZDdNRPqc.js → clock-hlFBiyvc.js} +1 -1
- package/web-app/dist/assets/{cloud-BBQ_4PAO.js → cloud-gpl8_jQe.js} +1 -1
- package/web-app/dist/assets/{code-xml-CeMIOys1.js → code-xml-CJ7WRPDY.js} +1 -1
- package/web-app/dist/assets/{database-RPRkkycE.js → database-C0waxSTC.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-CzMhGRnY.js → dollar-sign-TFqYdT4P.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-Bjvy_1-6.js → file-code-corner-Cklb7xuW.js} +1 -1
- package/web-app/dist/assets/{file-plus-qfMa2QbU.js → file-plus-vY6Bgsjz.js} +1 -1
- package/web-app/dist/assets/{globe-TpJ3ospb.js → globe-4A2JXvUS.js} +1 -1
- package/web-app/dist/assets/{hammer-D_nw758T.js → hammer-ZHnY2Erh.js} +1 -1
- package/web-app/dist/assets/{index-CtQLnUKu.js → index-CgCOQR3S.js} +3 -3
- package/web-app/dist/assets/{layers-qtTx1or7.js → layers-By5ECd5H.js} +1 -1
- package/web-app/dist/assets/{loader-circle-B4ijaGyV.js → loader-circle-yM_E0C2Q.js} +1 -1
- package/web-app/dist/assets/{lock-_HeSCV0H.js → lock-lSNyrxDR.js} +1 -1
- package/web-app/dist/assets/{package-Dg6Qt1JC.js → package-BKFtRuCB.js} +1 -1
- package/web-app/dist/assets/{plus-D5fVALHH.js → plus-CjV1F6qp.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-CZHZmoHM.js → refresh-cw-DTSM4-_Q.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-BRNlH9dS.js → rotate-ccw-CiCkyt92.js} +1 -1
- package/web-app/dist/assets/{scroll-text-DylHv8rG.js → scroll-text-D1Ruxchx.js} +1 -1
- package/web-app/dist/assets/{server-C3UnfUWG.js → server-DhT2dH_l.js} +1 -1
- package/web-app/dist/assets/{shield-alert-B16YK1L7.js → shield-alert-CFFYVEiJ.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-9vfN_rsT.js → thumbs-up-Dl4lQ_rS.js} +1 -1
- package/web-app/dist/assets/{trash-2-BQ-nbCvC.js → trash-2-DMJUQZ_M.js} +1 -1
- package/web-app/dist/assets/{trending-down-BML7JtUD.js → trending-down-C4mhp6Ua.js} +1 -1
- package/web-app/dist/assets/{trending-up-CfYZeeTt.js → trending-up-D534cAuW.js} +1 -1
- package/web-app/dist/assets/{upload-Bx2AigKp.js → upload-nhP5uhIQ.js} +1 -1
- package/web-app/dist/assets/{usePolling-C3xP585q.js → usePolling-CWFsCezc.js} +1 -1
- package/web-app/dist/assets/{user-BAGG-wCv.js → user-5TMGZ6m7.js} +1 -1
- package/web-app/dist/index.html +1 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# 09 Safety and security
|
|
2
|
+
|
|
3
|
+
Now 8.5. Bar set by: Codex (offline agent phase, secrets stripped before the agent runs, domain allowlist), Claude Code (OS sandbox: Seatbelt on macOS, bubblewrap on Linux), Copilot (default security scans, restricted push branches).
|
|
4
|
+
|
|
5
|
+
Why we are not 10:
|
|
6
|
+
- `loki share` uploads a PUBLIC gist by default from `loki report` output with no redact call (`autonomy/loki` cmd_report / share). Live leak risk.
|
|
7
|
+
- `redact.ts` misses secret words mid-name: `AWS_SECRET_ACCESS_KEY`, `PGPASSWORD`, `MYSQL_PWD`, `DB_PASS`, `PRIVATE_KEY`, `SECRET_KEY_BASE`, `client_secret_value`; unterminated `password="...`; the `=>` form. Python `proof_redact.py` catches them (parity gap).
|
|
8
|
+
- URL userinfo ReDoS (2.8s on 100KB). SECURITY-26 fix `fb2408cfc` was BLOCKED: the added `\b` lets hash-glued URLs leak userinfo.
|
|
9
|
+
- Default agent mode is bypassPermissions; engine10 has no sandbox; the bash denylist is literal (`rm -r -f /`, `find / -delete`, `shutil.rmtree` pass).
|
|
10
|
+
- `policyGate` covers only the PR action and allows when no policy file exists.
|
|
11
|
+
- npm publish has no `--provenance`, uses a long-lived `NPM_TOKEN`; actions mostly tag-pinned.
|
|
12
|
+
- SARIF and `redact.ts` keep separate pattern lists; SARIF never gates.
|
|
13
|
+
|
|
14
|
+
Owns `loki-ts/src/util/redact.ts` for this program. All tests build secrets by string concatenation so gitleaks does not flag them. HIGH tier: opus adversarial reviewer on every item.
|
|
15
|
+
|
|
16
|
+
## SAFE-1 Share is private and redacted
|
|
17
|
+
|
|
18
|
+
Acceptance: `loki share` defaults to a secret gist, requires `--public` explicitly, and runs output through redaction; test with seeded secrets shows none uploaded.
|
|
19
|
+
|
|
20
|
+
Todo:
|
|
21
|
+
- [ ] Flip default, add redact call
|
|
22
|
+
- [ ] Test
|
|
23
|
+
|
|
24
|
+
## SAFE-2 Redaction parity and ReDoS
|
|
25
|
+
|
|
26
|
+
Todo:
|
|
27
|
+
- [ ] Rework SECURITY-26 on main: URL userinfo scheme `/([a-z][a-z0-9+.-]{0,63}:\/\/)[^\s/?#@]+@/gi` (no `\b`), regression tests for `"sha256:"+h+"https://admin:...@db"`, `h+"postgres://u:...@db"`, `"x".repeat(80)+"://u:p@h"`; ReDoS test limit 250ms
|
|
28
|
+
- [ ] N2: unterminated quoted values redacted
|
|
29
|
+
- [ ] N3: mid-name keywords (AWS_SECRET_ACCESS_KEY, PGPASSWORD, MYSQL_PWD, DB_PASS, PRIVATE_KEY, SECRET_KEY_BASE)
|
|
30
|
+
- [ ] N4: `=>` assignment form
|
|
31
|
+
- [ ] Parity test: the same corpus through `redact.ts` and `proof_redact.py` gives the same masked set
|
|
32
|
+
|
|
33
|
+
Acceptance: parity test green; adversarial 100KB and 1MB inputs linear; opus HIGH reviewer APPROVE.
|
|
34
|
+
|
|
35
|
+
## SAFE-3 Sandbox by default on engine10
|
|
36
|
+
|
|
37
|
+
Acceptance: engine10 agent runs inside the OS sandbox (Seatbelt / bubblewrap, or the provider's own sandbox) with write access limited to the worktree; `bypassPermissions` only inside the sandbox; denylist tests cover `rm -r -f /`, `find / -delete`, `python -c shutil.rmtree`.
|
|
38
|
+
|
|
39
|
+
Todo:
|
|
40
|
+
- [ ] Sandbox wrapper in runner
|
|
41
|
+
- [ ] Shape-based denylist (not literal strings)
|
|
42
|
+
- [ ] Escape tests
|
|
43
|
+
|
|
44
|
+
## SAFE-4 Egress allowlist and offline phase
|
|
45
|
+
|
|
46
|
+
Acceptance: optional offline agent phase after dependency install; domain allowlist enforced; secrets stripped from the agent env before the agent runs (spawn env guard extended).
|
|
47
|
+
|
|
48
|
+
Todo:
|
|
49
|
+
- [ ] Allowlist config plus enforcement
|
|
50
|
+
- [ ] Offline phase flag
|
|
51
|
+
- [ ] Env strip test
|
|
52
|
+
|
|
53
|
+
## SAFE-5 Policy gate everywhere
|
|
54
|
+
|
|
55
|
+
Acceptance: `policyGate` runs for commit, push, deploy and network actions; missing check.js fails closed; tests per action.
|
|
56
|
+
|
|
57
|
+
Todo:
|
|
58
|
+
- [ ] Extend `util/run_outputs.ts` call sites
|
|
59
|
+
|
|
60
|
+
## SAFE-6 Supply chain
|
|
61
|
+
|
|
62
|
+
Acceptance: `npm publish --provenance` via OIDC (`id-token: write`), no long-lived NPM_TOKEN; all actions SHA-pinned; SLSA provenance for the tarball; `npm view loki-mode` shows provenance.
|
|
63
|
+
|
|
64
|
+
Todo:
|
|
65
|
+
- [ ] release.yml publish job
|
|
66
|
+
- [ ] Pin actions by SHA (script plus guard)
|
|
67
|
+
|
|
68
|
+
## SAFE-7 One pattern list
|
|
69
|
+
|
|
70
|
+
Acceptance: SARIF export and `redact.ts` read one shared pattern source; SARIF can gate with `--fail-on`; drift test.
|
|
71
|
+
|
|
72
|
+
Todo:
|
|
73
|
+
- [ ] Shared module, delete the duplicate list
|
|
74
|
+
- [ ] Gate flag
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Roadmap to 10/10 in every category
|
|
2
|
+
|
|
3
|
+
Owner: Chief of Staff. Written 2026-10-17 at v11.17.56. No dates: every item ships as soon as it is green and reviewed (D96, D102).
|
|
4
|
+
|
|
5
|
+
Why this folder exists: no existing doc owns the 10/10-versus-all-competitors program. PLAN-V12.md is the P12 plan, ROADMAP-D63.md covers the D63 pillars, SCORECARD-PLAN.md covers D41 measurement. This folder is the one index; slices still go to BOARD.md and bugs still need a FAILURE-CLASSES.md row first (D86).
|
|
6
|
+
|
|
7
|
+
Trigger: when the founder says "work on roadmap", execute every unchecked item here autonomously with parallel agent teams, release each approved slice, and tick the box in the same release commit.
|
|
8
|
+
|
|
9
|
+
## Scoreboard
|
|
10
|
+
|
|
11
|
+
| Category | Loki now | Best competitor today | Why we are not 10 | Bar to beat (10/10) | File |
|
|
12
|
+
|---|---|---|---|---|---|
|
|
13
|
+
| Measurement (enabler) | 3 | SWE-bench / Terminal-Bench publishers | No PROVEN cost run, no catch rate, no public benchmark since 2026-01 | Every other score below is backed by a dated, reproducible number | [01-measurement.md](01-measurement.md) |
|
|
14
|
+
| Cost | 6 | Aider; Cursor Composer about $0.07/task | Run4: Loki 1.41x MORE than lean raw on 6 tasks; NOT PROVEN | PROVEN_AT(0.5) vs all 3 floors, n>=3, ledger-checked | [02-cost.md](02-cost.md) |
|
|
15
|
+
| Speed | 7 | Cursor Composer Fast (6.7 min avg), Codex | Medium p50 2.5-4x raw; small 1.31x raw; Wall killed at 90s in half of runs | Small paired time ratio CI lower bound >= 1.0; medium p50 <= raw | [03-speed.md](03-speed.md) |
|
|
16
|
+
| First run / adoption | 8 | Lovable (2-3 min, zero install), Cursor, Claude Code | Time to first sealed PR never measured; 5 host tools; MCP deeplink likely exits 2 | Clean machine to first sealed PR p50 <= 120s, measured nightly with a real provider | [04-first-run.md](04-first-run.md) |
|
|
17
|
+
| Deploy | 7.5 | Replit (code + DB rollback), Vercel + Neon (DB branch per preview) | No DB setup, no per-PR preview URL, no auto rollback on Netlify/Cloudflare, bash only | Preview URL in every PR, auto rollback on all 4 providers, DB hook, Bun route | [05-deploy.md](05-deploy.md) |
|
|
18
|
+
| Stability | 7.5 | No clear leader; bar is a public status page | Main Tests red about 10h; longest green streak 23; caps break after merge (FC-60) | 24h green streak, red-to-green under 1h, merged-train guards on every push | [06-stability.md](06-stability.md) |
|
|
19
|
+
| Delivered quality / autonomy | 7.5 | Claude Code, Codex (Terminal-Bench 2.0 about 82%) | No arm beats raw on medium; D50 sonnet loss; moat P3/P4 pending, P9 regressed | Medium completion >= 85.7% at <= $0.5085; moat 9 of 9; public Terminal-Bench and SWE-bench Pro | [07-quality.md](07-quality.md) |
|
|
20
|
+
| Proof / trust | 9 | Nobody signs spec + tests + result (Loki's opening) | Self-generated trust root, no transparency log, no published catch rate, closed verifier bundle | Third-party verifiable receipts (Rekor), published catch rate, independent audit | [08-proof.md](08-proof.md) |
|
|
21
|
+
| Safety / security | 8.5 | Codex (offline agent phase, secret strip, domain allowlist), Claude Code (Seatbelt/bubblewrap), Copilot (default scans, branch limits) | Default bypassPermissions, no sandbox on engine10, PUBLIC gist share, redact TS/Python parity gaps, no npm provenance | Sandboxed by default, egress allowlist, redaction parity, npm provenance, SHA-pinned actions | [09-safety.md](09-safety.md) |
|
|
22
|
+
|
|
23
|
+
Overall now: 7.5. Target: 10 in every row, each backed by a command plus its output.
|
|
24
|
+
|
|
25
|
+
## Execution order
|
|
26
|
+
|
|
27
|
+
1. Measurement first (01). Nothing in cost, speed or quality can be claimed without it. Run in parallel with step 2.
|
|
28
|
+
2. Stability P0s (06 epics STAB-1..STAB-3). Main must be green before the swarm scales up again; red main hides regressions.
|
|
29
|
+
3. Safety P0s (09 epics SAFE-1, SAFE-2): public gist default and redaction parity are live leak risks.
|
|
30
|
+
4. Cost and speed levers (02, 03), each gated by a measured arm from step 1.
|
|
31
|
+
5. First-run and deploy (04, 05) in parallel with step 4; different file sets.
|
|
32
|
+
6. Quality and moat (07), then proof trust root (08).
|
|
33
|
+
7. Re-score every row with evidence; publish the scoreboard.
|
|
34
|
+
|
|
35
|
+
Parallelism: categories own non-overlapping file sets except `loki-ts/src/util/redact.ts` (09 only) and `loki-ts/src/engine10/stages/wall.ts` (03 owns; 02 and 07 consume). Architects split each epic into slices per PLAN-V12 ground rules: engine10 core cap 5000, e10ext 1500, features 3000, contrib 1200; new logic goes in util/ or runner/; hot files are edited by the Captain only.
|
|
36
|
+
|
|
37
|
+
## Master checklist
|
|
38
|
+
|
|
39
|
+
Each line is an epic. Stories, acceptance criteria and todo boxes live in the category file.
|
|
40
|
+
|
|
41
|
+
### 01 Measurement
|
|
42
|
+
- [ ] MEAS-1 Bench rows carry loki_version, cost_profile and one cost truth
|
|
43
|
+
- [ ] MEAS-2 Bench Wall uses the task interpreter; Loki rows can reach VERIFIED
|
|
44
|
+
- [ ] MEAS-3 C-F1 run5: 5 arms, 3 floors, n=3, 20 tasks
|
|
45
|
+
- [ ] MEAS-4 Medium A/B on all 14 tasks, n=3, cost never null
|
|
46
|
+
- [ ] MEAS-5 Seeded-defect catch rate on real runs (wrong-pass.json)
|
|
47
|
+
- [ ] MEAS-6 Terminal-Bench 2.0 and SWE-bench Pro runs, side by side with raw
|
|
48
|
+
- [ ] MEAS-7 Real-provider time-to-first-sealed-PR, nightly
|
|
49
|
+
- [ ] MEAS-8 Public scoreboard page generated from result files
|
|
50
|
+
|
|
51
|
+
### 02 Cost
|
|
52
|
+
- [ ] COST-A Small-task lean path actually triggers (sizing)
|
|
53
|
+
- [ ] COST-B Focused implement brief (files + exact test command)
|
|
54
|
+
- [ ] COST-C Flip measured-OFF knobs (cost lean profile, TRIM, judge batch)
|
|
55
|
+
- [ ] COST-D Cost correctness followups (alias flags, run.sh .5 cap, negative price, TEN-COST-59 sibling)
|
|
56
|
+
- [ ] COST-E Publish PROVEN_AT(0.5)
|
|
57
|
+
|
|
58
|
+
### 03 Speed
|
|
59
|
+
- [ ] SPD-A Wall off the critical path (concurrent default, limit fix)
|
|
60
|
+
- [ ] SPD-B Pre-model overhead measured and under 2s warm
|
|
61
|
+
- [ ] SPD-C Parallel verify/base jobs default after A/B
|
|
62
|
+
- [ ] SPD-D Speed tier tasks and LOKI_SPEED A/B
|
|
63
|
+
- [ ] SPD-E Equal-parallelism scorecard rule
|
|
64
|
+
|
|
65
|
+
### 04 First run / adoption
|
|
66
|
+
- [ ] FR-A One command from clean machine to first sealed PR
|
|
67
|
+
- [ ] FR-B Fewer host requirements on the v10 path
|
|
68
|
+
- [ ] FR-C Every preflight fatal is telemetered and has a named fix
|
|
69
|
+
- [ ] FR-D IDE / MCP one-click actually works
|
|
70
|
+
- [ ] FR-E Zero-install web entry (hosted try)
|
|
71
|
+
|
|
72
|
+
### 05 Deploy
|
|
73
|
+
- [ ] DEP-A Per-PR preview URL with health in the PR body
|
|
74
|
+
- [ ] DEP-B Auto rollback on all 4 providers
|
|
75
|
+
- [ ] DEP-C Database provisioning hook
|
|
76
|
+
- [ ] DEP-D Continuous health watch with rollback suggestion
|
|
77
|
+
- [ ] DEP-E Deploy on the Bun route
|
|
78
|
+
- [ ] DEP-F Secrets never on argv
|
|
79
|
+
|
|
80
|
+
### 06 Stability
|
|
81
|
+
- [ ] STAB-1 Main green now and kept green (core budget, P9, FC-01, L2)
|
|
82
|
+
- [ ] STAB-2 Merged-train guard job on every main push
|
|
83
|
+
- [ ] STAB-3 Nightly cannot read green when it ran nothing
|
|
84
|
+
- [ ] STAB-4 Green-streak and time-to-fix metrics in pulse
|
|
85
|
+
- [ ] STAB-5 Public status page
|
|
86
|
+
- [ ] STAB-6 Repo hygiene (295 unmerged branches, BOARD unparsed rows, stale metrics)
|
|
87
|
+
|
|
88
|
+
### 07 Delivered quality / autonomy
|
|
89
|
+
- [ ] QUAL-A Beat raw on medium tier
|
|
90
|
+
- [ ] QUAL-B Close the D50 sonnet loss
|
|
91
|
+
- [ ] QUAL-C Moat 9 of 9 (P3 Wall, P4 model freedom, P9)
|
|
92
|
+
- [ ] QUAL-D Close A-119b weakening holes
|
|
93
|
+
- [ ] QUAL-E Public benchmark numbers
|
|
94
|
+
|
|
95
|
+
### 08 Proof / trust
|
|
96
|
+
- [ ] PRF-A Third-party verifiable trust root (transparency log, key directory)
|
|
97
|
+
- [ ] PRF-B Browser verifier and open verifier source
|
|
98
|
+
- [ ] PRF-C Receipts record every proof opt-out
|
|
99
|
+
- [ ] PRF-D Published catch rate and independent audit
|
|
100
|
+
|
|
101
|
+
### 09 Safety / security
|
|
102
|
+
- [ ] SAFE-1 `loki share` private by default and redacted
|
|
103
|
+
- [ ] SAFE-2 Redaction parity and ReDoS fix (SECURITY-26 rework, N2/N3/N4)
|
|
104
|
+
- [ ] SAFE-3 Sandbox by default on engine10
|
|
105
|
+
- [ ] SAFE-4 Network egress allowlist and offline agent phase
|
|
106
|
+
- [ ] SAFE-5 Policy gate covers commit, push, deploy and network
|
|
107
|
+
- [ ] SAFE-6 Supply chain: npm provenance, OIDC publish, SHA-pinned actions
|
|
108
|
+
- [ ] SAFE-7 One shared secret pattern list; SARIF can gate
|
|
109
|
+
|
|
110
|
+
## Done definition for the program
|
|
111
|
+
|
|
112
|
+
- Every row in the scoreboard reads 10 with a cited command, exit code and result file.
|
|
113
|
+
- METRICS.md, the public scoreboard and this README agree.
|
|
114
|
+
- No open P0 in FAILURE-CLASSES.md for any category.
|
package/loki-ts/dist/cockpit.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
2
|
+
var WJ=Object.defineProperty;var FJ=(J)=>J;function BJ(J,Q){this[J]=FJ.bind(null,Q)}var HJ=(J,Q)=>{for(var X in Q)WJ(J,X,{get:Q[X],enumerable:!0,configurable:!0,set:BJ.bind(Q,X)})};var RJ=(J,Q)=>()=>(J&&(Q=J(J=0)),Q);var F=import.meta.require;var qJ={};HJ(qJ,{initWasm:()=>pJ,Resvg:()=>gJ});function C(J){if(_===T.length)T.push(T.length+1);let Q=_;return _=T[Q],T[Q]=J,Q}function A(J){return T[J]}function xJ(J){if(J<132)return;T[J]=_,_=J}function W(J){let Q=A(J);return xJ(J),Q}function y(){if(j===null||j.byteLength===0)j=new Uint8Array(D.memory.buffer);return j}function g(J,Q,X){if(X===void 0){let K=b.encode(J),P=Q(K.length,1)>>>0;return y().subarray(P,P+K.length).set(K),h=K.length,P}let Z=J.length,$=Q(Z,1)>>>0,G=y(),q=0;for(;q<Z;q++){let K=J.charCodeAt(q);if(K>127)break;G[$+q]=K}if(q!==Z){if(q!==0)J=J.slice(q);$=X($,Z,Z=q+J.length*3,1)>>>0;let K=y().subarray($+q,$+Z),P=_J(J,K);q+=P.written,$=X($,Z,q,1)>>>0}return h=q,$}function i(J){return J===void 0||J===null}function N(){if(x===null||x.byteLength===0)x=new Int32Array(D.memory.buffer);return x}function w(J,Q){return J=J>>>0,DJ.decode(y().subarray(J,J+Q))}function hJ(J,Q){if(!(J instanceof Q))throw Error(`expected instance of ${Q.name}`);return J.ptr}function fJ(J,Q){try{return J.apply(this,Q)}catch(X){D.__wbindgen_exn_store(C(X))}}async function bJ(J,Q){if(typeof Response==="function"&&J instanceof Response){if(typeof WebAssembly.instantiateStreaming==="function")try{return await WebAssembly.instantiateStreaming(J,Q)}catch(Z){if(J.headers.get("Content-Type")!="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",Z);else throw Z}let X=await J.arrayBuffer();return await WebAssembly.instantiate(X,Q)}else{let X=await WebAssembly.instantiate(J,Q);if(X instanceof WebAssembly.Instance)return{instance:X,module:J};else return X}}function wJ(){let J={};return J.wbg={},J.wbg.__wbg_new_28c511d9baebfa89=function(Q,X){let Z=Error(w(Q,X));return C(Z)},J.wbg.__wbindgen_memory=function(){let Q=D.memory;return C(Q)},J.wbg.__wbg_buffer_12d079cc21e14bdb=function(Q){let X=A(Q).buffer;return C(X)},J.wbg.__wbg_newwithbyteoffsetandlength_aa4a17c33a06e5cb=function(Q,X,Z){let $=new Uint8Array(A(Q),X>>>0,Z>>>0);return C($)},J.wbg.__wbindgen_object_drop_ref=function(Q){W(Q)},J.wbg.__wbg_new_63b92bc8671ed464=function(Q){let X=new Uint8Array(A(Q));return C(X)},J.wbg.__wbg_values_839f3396d5aac002=function(Q){let X=A(Q).values();return C(X)},J.wbg.__wbg_next_196c84450b364254=function(){return fJ(function(Q){let X=A(Q).next();return C(X)},arguments)},J.wbg.__wbg_done_298b57d23c0fc80c=function(Q){return A(Q).done},J.wbg.__wbg_value_d93c65011f51a456=function(Q){let X=A(Q).value;return C(X)},J.wbg.__wbg_instanceof_Uint8Array_2b3bbecd033d19f6=function(Q){let X;try{X=A(Q)instanceof Uint8Array}catch($){X=!1}return X},J.wbg.__wbindgen_string_get=function(Q,X){let Z=A(X),$=typeof Z==="string"?Z:void 0;var G=i($)?0:g($,D.__wbindgen_malloc,D.__wbindgen_realloc),q=h;N()[Q/4+1]=q,N()[Q/4+0]=G},J.wbg.__wbg_new_16b304a2cfa7ff4a=function(){return C([])},J.wbg.__wbindgen_string_new=function(Q,X){let Z=w(Q,X);return C(Z)},J.wbg.__wbg_push_a5b05aedc7234f9f=function(Q,X){return A(Q).push(A(X))},J.wbg.__wbg_length_c20a40f15020d68a=function(Q){return A(Q).length},J.wbg.__wbg_set_a47bac70306a19a7=function(Q,X,Z){A(Q).set(A(X),Z>>>0)},J.wbg.__wbindgen_throw=function(Q,X){throw Error(w(Q,X))},J}function lJ(J,Q){}function mJ(J,Q){return D=J.exports,KJ.__wbindgen_wasm_module=Q,x=null,j=null,D}async function KJ(J){if(D!==void 0)return D;if(typeof J>"u")J=new URL("index_bg.wasm",void 0);let Q=wJ();if(typeof J==="string"||typeof Request==="function"&&J instanceof Request||typeof URL==="function"&&J instanceof URL)J=fetch(J);lJ(Q);let{instance:X,module:Z}=await bJ(await J,Q);return mJ(X,Z)}function iJ(J){return Object.prototype.hasOwnProperty.call(J,"fontBuffers")}var D,T,_,h=0,j=null,b,_J,x=null,DJ,$J,p=class J{static __wrap(Q){Q=Q>>>0;let X=Object.create(J.prototype);return X.__wbg_ptr=Q,$J.register(X,X.__wbg_ptr,X),X}__destroy_into_raw(){let Q=this.__wbg_ptr;return this.__wbg_ptr=0,$J.unregister(this),Q}free(){let Q=this.__destroy_into_raw();D.__wbg_bbox_free(Q)}get x(){return D.__wbg_get_bbox_x(this.__wbg_ptr)}set x(Q){D.__wbg_set_bbox_x(this.__wbg_ptr,Q)}get y(){return D.__wbg_get_bbox_y(this.__wbg_ptr)}set y(Q){D.__wbg_set_bbox_y(this.__wbg_ptr,Q)}get width(){return D.__wbg_get_bbox_width(this.__wbg_ptr)}set width(Q){D.__wbg_set_bbox_width(this.__wbg_ptr,Q)}get height(){return D.__wbg_get_bbox_height(this.__wbg_ptr)}set height(Q){D.__wbg_set_bbox_height(this.__wbg_ptr,Q)}},GJ,uJ=class J{static __wrap(Q){Q=Q>>>0;let X=Object.create(J.prototype);return X.__wbg_ptr=Q,GJ.register(X,X.__wbg_ptr,X),X}__destroy_into_raw(){let Q=this.__wbg_ptr;return this.__wbg_ptr=0,GJ.unregister(this),Q}free(){let Q=this.__destroy_into_raw();D.__wbg_renderedimage_free(Q)}get width(){return D.renderedimage_width(this.__wbg_ptr)>>>0}get height(){return D.renderedimage_height(this.__wbg_ptr)>>>0}asPng(){try{let $=D.__wbindgen_add_to_stack_pointer(-16);D.renderedimage_asPng($,this.__wbg_ptr);var Q=N()[$/4+0],X=N()[$/4+1],Z=N()[$/4+2];if(Z)throw W(X);return W(Q)}finally{D.__wbindgen_add_to_stack_pointer(16)}}get pixels(){let Q=D.renderedimage_pixels(this.__wbg_ptr);return W(Q)}},vJ,yJ=class{__destroy_into_raw(){let J=this.__wbg_ptr;return this.__wbg_ptr=0,vJ.unregister(this),J}free(){let J=this.__destroy_into_raw();D.__wbg_resvg_free(J)}constructor(J,Q,X){try{let P=D.__wbindgen_add_to_stack_pointer(-16);var Z=i(Q)?0:g(Q,D.__wbindgen_malloc,D.__wbindgen_realloc),$=h;D.resvg_new(P,C(J),Z,$,i(X)?0:C(X));var G=N()[P/4+0],q=N()[P/4+1],K=N()[P/4+2];if(K)throw W(q);return this.__wbg_ptr=G>>>0,this}finally{D.__wbindgen_add_to_stack_pointer(16)}}get width(){return D.resvg_width(this.__wbg_ptr)}get height(){return D.resvg_height(this.__wbg_ptr)}render(){try{let Z=D.__wbindgen_add_to_stack_pointer(-16);D.resvg_render(Z,this.__wbg_ptr);var J=N()[Z/4+0],Q=N()[Z/4+1],X=N()[Z/4+2];if(X)throw W(Q);return uJ.__wrap(J)}finally{D.__wbindgen_add_to_stack_pointer(16)}}toString(){let J,Q;try{let $=D.__wbindgen_add_to_stack_pointer(-16);D.resvg_toString($,this.__wbg_ptr);var X=N()[$/4+0],Z=N()[$/4+1];return J=X,Q=Z,w(X,Z)}finally{D.__wbindgen_add_to_stack_pointer(16),D.__wbindgen_free(J,Q,1)}}innerBBox(){let J=D.resvg_innerBBox(this.__wbg_ptr);return J===0?void 0:p.__wrap(J)}getBBox(){let J=D.resvg_getBBox(this.__wbg_ptr);return J===0?void 0:p.__wrap(J)}cropByBBox(J){hJ(J,p),D.resvg_cropByBBox(this.__wbg_ptr,J.__wbg_ptr)}imagesToResolve(){try{let Z=D.__wbindgen_add_to_stack_pointer(-16);D.resvg_imagesToResolve(Z,this.__wbg_ptr);var J=N()[Z/4+0],Q=N()[Z/4+1],X=N()[Z/4+2];if(X)throw W(Q);return W(J)}finally{D.__wbindgen_add_to_stack_pointer(16)}}resolveImage(J,Q){try{let $=D.__wbindgen_add_to_stack_pointer(-16),G=g(J,D.__wbindgen_malloc,D.__wbindgen_realloc),q=h;D.resvg_resolveImage($,this.__wbg_ptr,G,q,C(Q));var X=N()[$/4+0],Z=N()[$/4+1];if(Z)throw W(X)}finally{D.__wbindgen_add_to_stack_pointer(16)}}},dJ,c=!1,pJ=async(J)=>{if(c)throw Error("Already initialized. The `initWasm()` function can be used only once.");await dJ(await J),c=!0},gJ;var VJ=RJ(()=>{T=Array(128).fill(void 0);T.push(void 0,null,!0,!1);_=T.length;b=typeof TextEncoder<"u"?new TextEncoder("utf-8"):{encode:()=>{throw Error("TextEncoder not available")}},_J=typeof b.encodeInto==="function"?function(J,Q){return b.encodeInto(J,Q)}:function(J,Q){let X=b.encode(J);return Q.set(X),{read:J.length,written:X.length}};DJ=typeof TextDecoder<"u"?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};if(typeof TextDecoder<"u")DJ.decode();$J=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry((J)=>D.__wbg_bbox_free(J>>>0)),GJ=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry((J)=>D.__wbg_renderedimage_free(J>>>0)),vJ=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry((J)=>D.__wbg_resvg_free(J>>>0));dJ=KJ,gJ=class extends yJ{constructor(J,Q){if(!c)throw Error("Wasm has not been initialized. Call `initWasm()` function.");let X=Q?.font;if(!!X&&iJ(X)){let Z={...Q,font:{...X,fontBuffers:void 0}};super(J,JSON.stringify(Z),X.fontBuffers)}else super(J,JSON.stringify(Q))}}});function U(J){return String(J??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function IJ(J,Q,X){let Z=X/512;return`<g transform="translate(${J},${Q}) scale(${Z})">
|
|
3
3
|
<rect x="0" y="0" width="512" height="512" rx="118" fill="#553de9"/>
|
|
4
4
|
<path d="M152 405 L242 120" stroke="#FFFEFB" stroke-width="28" stroke-linecap="round" fill="none"/>
|
|
5
5
|
<path d="M360 405 L270 120" stroke="#FFFEFB" stroke-width="28" stroke-linecap="round" fill="none"/>
|
|
6
6
|
<path d="M242 120 Q256 86 270 120" stroke="#FFFEFB" stroke-width="28" stroke-linecap="round" fill="none"/>
|
|
7
7
|
<circle cx="256" cy="295" r="20" fill="#1FC5A8"/>
|
|
8
|
-
</g>`}function
|
|
9
|
-
<text x="${
|
|
8
|
+
</g>`}function SJ(J){switch(J){case"verified":return"#1f8a52";case"failed":return"#b23a3a";case"working":case"pending":return"#9a6a12";default:return"#6b6675"}}function kJ(J){switch(J){case"pass":return"#1f8a52";case"fail":return"#b23a3a";case"pending":return"#9a6a12";default:return"#6b6675"}}function MJ(J){switch(J){case"approve":return"#1f8a52";case"reject":return"#b23a3a";case"concern":return"#9a6a12";default:return"#6b6675"}}function v(J,Q,X,Z,$="#201515"){return`<text x="${J}" y="${Q}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="12" fill="#6b6675" letter-spacing="0.5">${U(X.toUpperCase())}</text>
|
|
9
|
+
<text x="${J}" y="${Q+24}" font-family="'JetBrains Mono','SF Mono',ui-monospace,monospace" font-size="20" font-weight="600" fill="${$}">${U(Z)}</text>`}var OJ=["Reason","Act","Reflect","Verify"];function jJ(J){let Q=(J||"").toLowerCase();if(/verif|complet|done|ship|deploy/.test(Q))return 3;if(/reflect|review|council|critique|assess/.test(Q))return 2;if(/reason|plan|design|architect|spec|analy/.test(Q))return 0;return 1}function ZJ(J){let Z={run:J?.run||"cockpit",iteration:typeof J?.iteration==="number"?J.iteration:0,phase:J?.phase||"idle",tier:J?.tier||"",provider:J?.provider||"",verdict:J?.verdict||"unknown",budgetUsd:typeof J?.budgetUsd==="number"?J.budgetUsd:0,budgetLimitUsd:J?.budgetLimitUsd,freshness:J?.freshness,gates:Array.isArray(J?.gates)?J.gates:[],council:Array.isArray(J?.council)?J.council:[],fleet:Array.isArray(J?.fleet)?J.fleet:[]},$=Z.budgetLimitUsd&&Z.budgetLimitUsd>0?`$${Z.budgetUsd.toFixed(2)} / $${Z.budgetLimitUsd.toFixed(2)}`:`$${Z.budgetUsd.toFixed(2)}`,G="";G+=IJ(32,32,44),G+=`<text x="92" y="54" font-family="'Fraunces','Georgia',serif" font-size="24" font-weight="600" fill="#201515">Autonomi</text>`,G+=`<text x="92" y="74" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="13" fill="#6b6675">Loki Cockpit</text>`;let q=Z.freshness?`updated ${Z.freshness}`:"live";G+=`<text x="868" y="54" text-anchor="end" font-family="'JetBrains Mono','SF Mono',ui-monospace,monospace" font-size="12" fill="#6b6675">${U(q)}</text>`,G+=`<text x="868" y="74" text-anchor="end" font-family="'JetBrains Mono','SF Mono',ui-monospace,monospace" font-size="13" fill="${SJ(Z.verdict)}" font-weight="600">${U(Z.verdict.toUpperCase())}</text>`;let K=96,P=168;G+=`<rect x="32" y="${K}" width="836" height="${P}" rx="16" fill="#ffffff" stroke="#e2e0e8"/>`,G+=`<text x="56" y="${K+34}" font-family="'Fraunces','Georgia',serif" font-size="20" font-weight="600" fill="#201515">${U(Z.run)}</text>`,G+=`<text x="56" y="${K+54}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="13" fill="#6b6675">phase ${U(Z.phase)}</text>`;let z=K+96,E=(V)=>56+V*168;G+=v(E(0),z,"iteration",String(Z.iteration)),G+=v(E(1),z,"tier",Z.tier),G+=v(E(2),z,"provider",Z.provider),G+=v(E(3),z,"budget",$);let n=K+P+40;G+=`<text x="32" y="${n}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="13" font-weight="600" fill="#6b6675" letter-spacing="0.5">RARV LOOP</text>`;let s=jJ(Z.phase),I=n+14,o=200;OJ.forEach((V,Y)=>{let L=32+Y*(o+12),O=Y<s,H=Y===s;G+=`<rect x="${L}" y="${I}" width="${o}" height="40" rx="10" fill="${H?"#553de9":"#ffffff"}" fill-opacity="${H?"0.10":"1"}" stroke="${H?"#553de9":O?"#1f8a52":"#6b6675"}" stroke-width="${H?2:1}"/>`;let XJ=O?"check":H?"dot":"wait";if(XJ==="check")G+=`<path d="M${L+16} ${I+20} l6 6 l10 -12" stroke="#1f8a52" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/>`;else if(XJ==="dot")G+=`<circle cx="${L+22}" cy="${I+20}" r="5" fill="#553de9"/>`;else G+=`<circle cx="${L+22}" cy="${I+20}" r="5" fill="none" stroke="#6b6675" stroke-width="1.5"/>`;G+=`<text x="${L+40}" y="${I+25}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="14" font-weight="${H?600:500}" fill="${H?"#553de9":O?"#201515":"#6b6675"}">${V}</text>`});let a=I+40+40;G+=`<text x="32" y="${a}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="13" font-weight="600" fill="#6b6675" letter-spacing="0.5">QUALITY GATES</text>`;let r=Z.gates.length?Z.gates:[{name:"no gates yet",status:"pending"}],S=30,k=a+12;G+=`<rect x="32" y="${k}" width="836" height="${r.slice(0,8).length*S+8}" rx="12" fill="#ffffff" stroke="#e2e0e8"/>`,k+=8;for(let V of r.slice(0,8)){let Y=kJ(V.status),L=k+S/2;if(G+=`<circle cx="50" cy="${L}" r="4" fill="${Y}"/>`,G+=`<text x="66" y="${L+4}" font-family="'JetBrains Mono','SF Mono',ui-monospace,monospace" font-size="12" fill="#201515">${U(V.name)}</text>`,V.runner)G+=`<text x="242" y="${L+4}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="11" fill="#6b6675">${U(V.runner)}</text>`;if(V.evidence){let O=V.evidence.length>52?`${V.evidence.slice(0,49)}...`:V.evidence;G+=`<text x="332" y="${L+4}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="11" fill="#6b6675">${U(O)}</text>`}G+=`<text x="852" y="${L+4}" text-anchor="end" font-family="'JetBrains Mono','SF Mono',ui-monospace,monospace" font-size="11" font-weight="700" fill="${Y}">${U(V.status.toUpperCase())}</text>`,k+=S}let t=k+40;G+=`<text x="32" y="${t}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="13" font-weight="600" fill="#6b6675" letter-spacing="0.5">COMPLETION COUNCIL</text>`;let e=Z.council.length?Z.council:[{reviewer:"pending",vote:"pending"}],M=t+12;G+=`<rect x="32" y="${M}" width="836" height="${e.slice(0,6).length*S+8}" rx="12" fill="#ffffff" stroke="#e2e0e8"/>`,M+=8;for(let V of e.slice(0,6)){let Y=MJ(V.vote),L=M+S/2;if(G+=`<circle cx="50" cy="${L}" r="4" fill="${Y}"/>`,G+=`<text x="66" y="${L+4}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="12.5" font-weight="500" fill="#201515">${U(V.reviewer)}</text>`,V.tier)G+=`<text x="292" y="${L+4}" font-family="'JetBrains Mono','SF Mono',ui-monospace,monospace" font-size="11" fill="#6b6675">${U(V.tier)}</text>`;G+=`<text x="852" y="${L+4}" text-anchor="end" font-family="'JetBrains Mono','SF Mono',ui-monospace,monospace" font-size="11" font-weight="700" fill="${Y}">${U(V.vote.toUpperCase())}</text>`,M+=S}let JJ=M+46,QJ=Z.fleet.filter((V)=>V.running).length,TJ=QJ>0?`FLEET (${QJ} active / ${Z.fleet.length})`:`FLEET (${Z.fleet.length}, none active)`;G+=`<text x="32" y="${JJ}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="13" font-weight="600" fill="#6b6675" letter-spacing="0.5">${TJ}</text>`;let B=JJ+20,m=Z.fleet.slice(0,4);for(let V of m){let Y=V.running?"#1f8a52":"#6b6675";G+=`<circle cx="38" cy="${B-4}" r="5" fill="${Y}"/>`,G+=`<text x="52" y="${B}" font-family="'JetBrains Mono','SF Mono',ui-monospace,monospace" font-size="13" fill="#201515">${U(V.name)}</text>`;let L=`iter ${V.iteration??0} ${U(V.phase||V.status||"")}`;G+=`<text x="868" y="${B}" text-anchor="end" font-family="'JetBrains Mono','SF Mono',ui-monospace,monospace" font-size="12" fill="#6b6675">${L}</text>`,B+=26}if(Z.fleet.length>m.length)G+=`<text x="52" y="${B}" font-family="'Inter','Helvetica Neue',Arial,sans-serif" font-size="12" fill="#6b6675">+ ${Z.fleet.length-m.length} more</text>`,B+=26;let d=Math.round(B+32);return`<svg xmlns="http://www.w3.org/2000/svg" width="900" height="${d}" viewBox="0 0 900 ${d}">
|
|
10
10
|
<rect x="0" y="0" width="900" height="${d}" fill="#f1f2f6"/>
|
|
11
|
-
${
|
|
12
|
-
</svg>`}var u
|
|
13
|
-
`),process.stdout.write(`resvg=${
|
|
14
|
-
`),process.stdout.write(`path=${
|
|
15
|
-
`),0}async function
|
|
16
|
-
`),3}let
|
|
17
|
-
`),3}if(import.meta.main)
|
|
11
|
+
${G}
|
|
12
|
+
</svg>`}var f,u;function PJ(){if(f!==void 0)return f;try{let J=globalThis.require??F;J.resolve("@resvg/resvg-js"),f=J("@resvg/resvg-js")}catch{f=null}return f}async function LJ(){if(u!==void 0)return u;try{let J=await Promise.resolve().then(() => (VJ(),qJ)),Q=globalThis.require??F,{readFileSync:X,existsSync:Z}=await import("fs"),{resolve:$,dirname:G}=await import("path"),{fileURLToPath:q}=await import("url"),K=null;try{let P=G(q(import.meta.url));for(let z of["../data/resvg.wasm","../../data/resvg.wasm"]){let E=$(P,z);if(Z(E)){K=X(E);break}}}catch{}if(!K){let P=Q.resolve("@resvg/resvg-wasm/index_bg.wasm");K=X(P)}await J.initWasm(K),u={Resvg:J.Resvg}}catch{u=null}return u}async function NJ(){if(PJ()?.Resvg)return!0;return(await LJ())?.Resvg!=null}var R;async function cJ(){if(R!==void 0)return R;try{let{readFileSync:J,existsSync:Q}=await import("fs"),X=["/System/Library/Fonts/Supplemental/Arial.ttf","/System/Library/Fonts/Helvetica.ttc","/Library/Fonts/Arial.ttf","/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf","/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf","/usr/share/fonts/dejavu/DejaVuSans.ttf","/usr/share/fonts/TTF/DejaVuSans.ttf","C:\\Windows\\Fonts\\arial.ttf","C:\\Windows\\Fonts\\segoeui.ttf"];for(let Z of X)if(Q(Z))return R=new Uint8Array(J(Z)),R;R=null}catch{R=null}return R}async function UJ(J,Q=900){let X=PJ();if(X?.Resvg)try{let $=new X.Resvg(J,{fitTo:{mode:"width",value:Q}});return{png:Uint8Array.from($.render().asPng()),available:!0}}catch{}let Z=await LJ();if(Z?.Resvg)try{let $=await cJ(),G={fitTo:{mode:"width",value:Q}};if($)G.font={fontBuffers:[$],defaultFontFamily:"Arial",loadSystemFonts:!1};else G.font={loadSystemFonts:!0};let q=new Z.Resvg(J,G);return{png:Uint8Array.from(q.render().asPng()),available:!0}}catch($){return{png:null,available:!1,reason:`raster failed: ${$.message}`}}return{png:null,available:!1,reason:"rasterizer unavailable (no resvg native or wasm)"}}function AJ(J){return Buffer.from(J).toString("base64")}function nJ(J,Q){let X=AJ(J),Z=Q&&Q>0?`${Q}`:"auto";return`\x1B]1337;File=${`inline=1;size=${J.length};width=${Z};height=auto;preserveAspectRatio=1`}:${X}\x07`}function sJ(J,Q=4096,X){let Z=AJ(J);if(Z.length===0)return"\x1B_Ga=T,f=100,m=0;\x1B\\";let $=[];for(let K=0;K<Z.length;K+=Q)$.push(Z.slice(K,K+Q));let G=X&&X>0?`,c=${X}`:"",q="";for(let K=0;K<$.length;K++){let z=K===$.length-1?0:1,E=K===0?`a=T,f=100${G},m=${z}`:`m=${z}`;q+=`\x1B_G${E};${$[K]}\x1B\\`}return q}function CJ(J,Q,X){return J==="kitty"?sJ(Q,4096,X):nJ(Q,X)}var oJ=new Set(["iterm.app","wezterm","ghostty"]);function l(J=process.env){let Q=(J.LOKI_COCKPIT_PROTOCOL||"").trim().toLowerCase();if(Q==="iterm2"||Q==="kitty"||Q==="none")return Q;let X=(J.KITTY_WINDOW_ID||"").trim(),Z=(J.TERM||"").trim().toLowerCase();if(X.length>0||Z==="xterm-kitty")return"kitty";let $=(J.TERM_PROGRAM||"").trim().toLowerCase();if(oJ.has($))return"iterm2";return"none"}async function YJ(J,Q={}){let X=ZJ(J);if(Q.forceText)return{kind:"fallback",protocol:"none",reason:"--no-image (text/browser fallback)",svg:X};let Z;if(Q.protocol&&Q.protocol!=="auto")Z=Q.protocol;else Z=l(Q.env);if(Z==="none")return{kind:"fallback",protocol:Z,reason:"no inline-image terminal detected",svg:X};let $=await UJ(X);if(!$.available||!$.png)return{kind:"fallback",protocol:Z,reason:$.reason||"rasterization unavailable",svg:X};let G=CJ(Z,$.png,Q.cols);return{kind:"image",protocol:Z,data:G,svg:X}}var zJ=(J)=>typeof J==="number"&&Number.isFinite(J)&&J>=40;function EJ(J=process.stdout,Q=process.env){let X=J?.columns;if(zJ(X))return Math.floor(X);let Z=Number(Q.COLUMNS);if(zJ(Z))return Math.floor(Z);return 80}async function aJ(){let J=[];for await(let Q of process.stdin)J.push(Q);return Buffer.concat(J).toString("utf-8")}function rJ(J){let Q="auto",X=!1,Z;for(let $=0;$<J.length;$++){let G=J[$];if(G==="--protocol"){let q=(J[++$]||"auto").toLowerCase();Q=q==="iterm2"||q==="kitty"||q==="none"?q:"auto"}else if(G==="--no-image")X=!0;else if(G==="--svg-out")Z=J[++$]}return{protocol:Q,noImage:X,svgOut:Z}}async function tJ(){let J=l(),Q=await NJ(),X=J!=="none"&&Q?"image":"text+dashboard";return process.stdout.write(`protocol=${J}
|
|
13
|
+
`),process.stdout.write(`resvg=${Q?"yes":"no"}
|
|
14
|
+
`),process.stdout.write(`path=${X}
|
|
15
|
+
`),0}async function eJ(J=process.argv.slice(2)){if(J.includes("--probe"))return await tJ();let{protocol:Q,noImage:X,svgOut:Z}=rJ(J),$;try{let K=await aJ();$=JSON.parse(K)}catch(K){return process.stderr.write(`FALLBACK could not parse cockpit state: ${K.message}
|
|
16
|
+
`),3}let G=EJ()-2,q=await YJ($,{protocol:Q,forceText:X,cols:G});if(Z)try{let{writeFileSync:K}=await import("fs");K(Z,q.svg)}catch{}if(q.kind==="image"&&q.data)return process.stdout.write(q.data),0;return process.stderr.write(`FALLBACK ${q.reason||"image unavailable"}
|
|
17
|
+
`),3}if(import.meta.main)eJ().then((J)=>process.exit(J));export{eJ as main};
|
|
18
18
|
|
|
19
|
-
//# debugId=
|
|
19
|
+
//# debugId=8D6BC88E3E25DA192460C5798D71C777
|