loki-mode 11.17.5 → 11.17.6

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.
Files changed (69) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/dashboard/__init__.py +1 -1
  4. package/docs/CLI-REFERENCE.md +1 -1
  5. package/docs/INSTALLATION.md +1 -1
  6. package/docs/v10/BOARD.md +5 -3
  7. package/docs/v10/DECISIONS.md +15 -0
  8. package/docs/v10/PROGRESS.md +3 -0
  9. package/loki-ts/dist/loki.js +2 -2
  10. package/mcp/__init__.py +1 -1
  11. package/package.json +2 -2
  12. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  13. package/web-app/dist/assets/{AdminPage-C0v2p3jN.js → AdminPage-CCedYmn3.js} +1 -1
  14. package/web-app/dist/assets/{Avatar-Cgc0QepK.js → Avatar-DMrDsuGe.js} +1 -1
  15. package/web-app/dist/assets/{Badge-1X4wQ0sU.js → Badge-K4Ui2tJz.js} +1 -1
  16. package/web-app/dist/assets/{Button-CG79n6-I.js → Button-Bhjts5QZ.js} +1 -1
  17. package/web-app/dist/assets/{CockpitPage-rSw2BTKk.js → CockpitPage-Be7sEVqh.js} +1 -1
  18. package/web-app/dist/assets/{ComparePage-B9EVp__S.js → ComparePage-D4ty3jiF.js} +1 -1
  19. package/web-app/dist/assets/{ErrorBoundary-DLQKY8LF.js → ErrorBoundary-Cmt2x_mL.js} +1 -1
  20. package/web-app/dist/assets/{EvidenceReceiptPanel-DE0L1L2Q.js → EvidenceReceiptPanel-D2IXLnp9.js} +1 -1
  21. package/web-app/dist/assets/{GitHubIssuesPanel-DlKtYrtk.js → GitHubIssuesPanel-CyXitr6h.js} +1 -1
  22. package/web-app/dist/assets/{GitHubPRsPanel-C5c5tY3x.js → GitHubPRsPanel-RRM3H-xd.js} +1 -1
  23. package/web-app/dist/assets/{HomePage-ob1natMp.js → HomePage-CMtrrgfs.js} +2 -2
  24. package/web-app/dist/assets/{LoginPage-CCQBgvzB.js → LoginPage-BrzNhnMJ.js} +1 -1
  25. package/web-app/dist/assets/{MagicPage-CKSuC0Pp.js → MagicPage-D7VynOKM.js} +1 -1
  26. package/web-app/dist/assets/{MetricsPage-nq_ygAuG.js → MetricsPage-DJ-gDbfP.js} +1 -1
  27. package/web-app/dist/assets/{NotFoundPage-B6gVLTAn.js → NotFoundPage-BJh0XVTj.js} +1 -1
  28. package/web-app/dist/assets/{ProjectPage-pUnvGriO.js → ProjectPage-CAodVUpE.js} +3 -3
  29. package/web-app/dist/assets/{ProjectsPage-DMFPGLkE.js → ProjectsPage-m3siS0Rf.js} +1 -1
  30. package/web-app/dist/assets/{SettingsPage-DAB_cp87.js → SettingsPage-CFGgjOvy.js} +1 -1
  31. package/web-app/dist/assets/{ShowcasePage-DTsx_XxI.js → ShowcasePage-Dd9tpSKJ.js} +1 -1
  32. package/web-app/dist/assets/{SystemSettingsPage-C2UUqWhW.js → SystemSettingsPage-DXd0PtTI.js} +1 -1
  33. package/web-app/dist/assets/{TeamsPage-C4Sws9U7.js → TeamsPage-C5KaLIGW.js} +1 -1
  34. package/web-app/dist/assets/{TemplatesPage-B1-79O4n.js → TemplatesPage-CDbzE0ZZ.js} +1 -1
  35. package/web-app/dist/assets/{TerminalOutput-CDSVt5TB.js → TerminalOutput-CKG79r_-.js} +1 -1
  36. package/web-app/dist/assets/{activity-CBEULbio.js → activity-BaQQRhDp.js} +1 -1
  37. package/web-app/dist/assets/{bell-Dp-j77Qo.js → bell-OeFqvU4e.js} +1 -1
  38. package/web-app/dist/assets/{bot-Dh1FlTEJ.js → bot-CSxaA0KU.js} +1 -1
  39. package/web-app/dist/assets/{check-C_7N7W4q.js → check-DJml2Xdn.js} +1 -1
  40. package/web-app/dist/assets/{chevron-left-DtZJiu3T.js → chevron-left-DGnt-DtK.js} +1 -1
  41. package/web-app/dist/assets/{circle-alert-CJK4sNof.js → circle-alert-BV5rVL7K.js} +1 -1
  42. package/web-app/dist/assets/{clock--0bfAUkP.js → clock-CZ7SvULz.js} +1 -1
  43. package/web-app/dist/assets/{cloud-CRa9nwiN.js → cloud-lkIzrZps.js} +1 -1
  44. package/web-app/dist/assets/{code-xml-4gRrVGxx.js → code-xml-DzA2wL8F.js} +1 -1
  45. package/web-app/dist/assets/{database-C-A2USGl.js → database-CLFG5upC.js} +1 -1
  46. package/web-app/dist/assets/{dollar-sign-BshJt4ML.js → dollar-sign-DgWePGsv.js} +1 -1
  47. package/web-app/dist/assets/{file-code-corner-Bd--i_IM.js → file-code-corner-DGQX2bmv.js} +1 -1
  48. package/web-app/dist/assets/{file-plus-YiNg-aWn.js → file-plus-LkaXeYd6.js} +1 -1
  49. package/web-app/dist/assets/{globe-CfyHbAbI.js → globe-rSsEzPYv.js} +1 -1
  50. package/web-app/dist/assets/{hammer-BlGC-yqz.js → hammer-CPogONt9.js} +1 -1
  51. package/web-app/dist/assets/{index-BlCg8mla.js → index-DpBLuMuz.js} +3 -3
  52. package/web-app/dist/assets/{layers-DLiA0AcW.js → layers-CwFaqidn.js} +1 -1
  53. package/web-app/dist/assets/{loader-circle-CkOfS_Q6.js → loader-circle-C43izEm5.js} +1 -1
  54. package/web-app/dist/assets/{lock-C5vRE8HM.js → lock-Bc_Uqxpp.js} +1 -1
  55. package/web-app/dist/assets/{package-BPzp43h4.js → package-BM25lcR-.js} +1 -1
  56. package/web-app/dist/assets/{plus-C4x6sD5J.js → plus-D0xoiY6N.js} +1 -1
  57. package/web-app/dist/assets/{refresh-cw-DZn-gB9J.js → refresh-cw-COI1R5Oo.js} +1 -1
  58. package/web-app/dist/assets/{rotate-ccw-rH63YhnY.js → rotate-ccw-BoNZx4xe.js} +1 -1
  59. package/web-app/dist/assets/{scroll-text-DTvZMQuh.js → scroll-text-Cakp8XHd.js} +1 -1
  60. package/web-app/dist/assets/{server-DmwCdhKT.js → server-CjfIlPmE.js} +1 -1
  61. package/web-app/dist/assets/{shield-alert-Dn5Rtkhx.js → shield-alert-BilhziJF.js} +1 -1
  62. package/web-app/dist/assets/{thumbs-up-D_lHdH-1.js → thumbs-up-CglMrtrt.js} +1 -1
  63. package/web-app/dist/assets/{trash-2-CVfeP0Fb.js → trash-2-B6zVvnoG.js} +1 -1
  64. package/web-app/dist/assets/{trending-down-ouPrjBEm.js → trending-down-BVhwD9bt.js} +1 -1
  65. package/web-app/dist/assets/{trending-up-7H96_KlR.js → trending-up-CVJ1ox6c.js} +1 -1
  66. package/web-app/dist/assets/{upload-kTTgyfD6.js → upload-DmuR09WL.js} +1 -1
  67. package/web-app/dist/assets/{usePolling-BFIMPvNM.js → usePolling-BTALfO91.js} +1 -1
  68. package/web-app/dist/assets/{user-UDo6EQfn.js → user-CRdHMZNH.js} +1 -1
  69. package/web-app/dist/index.html +1 -1
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: An autonomous software factory that knows what it is supposed to deliver, and proves it did. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
4
4
  ---
5
5
 
6
- # Loki Mode v11.17.5
6
+ # Loki Mode v11.17.6
7
7
 
8
8
  **Current entry points (Loki 10 engine):** `loki "<task>"`, `loki owner/repo#N` and `loki quick "<task>"` run the Loki 10 engine and end with a signed receipt (`loki verify`). `loki backlog owner/repo --all` runs many issues in parallel. Guide: `docs/v10/GUIDE.md`. The skill instructions below, and `loki start`, describe the previous bash loop. PRD-file starts (`loki start ./prd.md`) and the opencode provider still run on it until FC38-SWEEP ports them; the legacy-engine command and the LOKI_ENGINE switch remain removed. Prefer `loki owner/repo#N` for issues.
9
9
 
@@ -483,4 +483,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
483
483
 
484
484
  ---
485
485
 
486
- **v11.17.5 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v11.17.6 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.17.5
1
+ 11.17.6
@@ -7,6 +7,6 @@ Modules:
7
7
  control: Session control helpers (status, atomic writes, origin check)
8
8
  """
9
9
 
10
- __version__ = "11.17.5"
10
+ __version__ = "11.17.6"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -1,6 +1,6 @@
1
1
  # CLI reference
2
2
 
3
- Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.5. Do not edit by hand.
3
+ Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.6. Do not edit by hand.
4
4
  Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for the full inventory.
5
5
 
6
6
  | Command | Description |
@@ -2,7 +2,7 @@
2
2
 
3
3
  Loki Mode, by [Autonomi](https://www.autonomi.dev/), turns a spec or an issue into a verified pull request with a receipt you can check. This page covers installing it, a first run, and the options around it.
4
4
 
5
- **Version:** v11.17.5
5
+ **Version:** v11.17.6
6
6
 
7
7
  **Engine note:** `loki start` is the primary command. `loki start`, `loki "<task>"`, `loki owner/repo#N` and `loki quick` all run the Loki 10 engine, whatever the flag order or input form (PRD file, issue ref, task or one-word brief). The previous loop runs only on `--engine legacy`, `LOKI_ENGINE=legacy`, or for one call when a flag Loki 10 cannot honor is present. See the [user guide](v10/GUIDE.md) and the [5-minute quickstart](QUICKSTART.md).
8
8
 
package/docs/v10/BOARD.md CHANGED
@@ -403,8 +403,9 @@ set is declared to avoid overlap with those and with each other.
403
403
  | M-24 | Dashboard /modernize view | loki-ts/src/engine10/dashboard/modernize.ts, loki-ts/src/engine10/dashboard/server.ts (one route), loki-ts/tests/engine10/modernize/dashboard.test.ts | LOW | cd loki-ts && bun test tests/engine10/modernize/dashboard.test.ts | released@2026-09-28T16:03Z | Source: MODERNIZE.md (D30). Depends on M-01. Built fe3dd87a (branch slice-M-24-dashboard); TL review died on the 04:48Z access outage. Wave E21 (wf_39ab3f7d-8f3). TL review. TL APPROVE of fe3dd87a; merged into train E22 (9042e964): `bun test tests/engine10/` 547 pass 0 fail, tsc 0, `bash tests/test-v10-pulse.sh` 107 passed, `bash eval/loki10/test-harness.sh` 108 passed. Released in v10.2.1 (npm publish 2026-09-28T16:03Z; every cited commit is an ancestor of the v10.2.1 tag; `git merge-base --is-ancestor`). |
404
404
  | M-25 | Final report and verdict (COMPLETE only if all proven), sealed | loki-ts/src/engine10/modernize/report.ts, loki-ts/tests/engine10/modernize/report.test.ts | HIGH | cd loki-ts && bun test tests/engine10/modernize/report.test.ts | released@2026-10-16T02:40Z | Source: MODERNIZE.md (D30). Depends on M-13, M-21. |
405
405
  | M-26 | End-to-end: py2 fixture repo modernized with stub provider | loki-ts/tests/engine10/modernize/e2e.test.ts, loki-ts/tests/engine10/modernize/fixtures/e2e_py2/ | MEDIUM | cd loki-ts && bun test tests/engine10/modernize/e2e.test.ts | released@2026-10-16T22:45Z | Source: MODERNIZE.md (D30). Depends on M-08, M-22, M-25. Reconciled 2026-10-16: shipped as ea6d2eef8 (ancestor of main c89555bce). |
406
- | M-27 | Legacy-Bench pilot harness; confirm public set; calibrate cap | eval/modernize/pilot.py, eval/modernize/test-pilot.sh | HIGH | bash eval/modernize/test-pilot.sh | ready@2026-09-28T02:45Z | Source: MODERNIZE.md (D30). Depends on M-26. D34: absorbs the D30 large-tier legacy coverage. |
407
- | M-28 | 200K scale run (Mercurial 4.x, measured first, fallback Calibre) | eval/modernize/scale.py, eval/modernize/SCALE.md | HIGH | python3 eval/modernize/scale.py --target hg --dry-run-first | ready@2026-09-28T02:45Z | Source: MODERNIZE.md (D30). Depends on M-27. |
406
+ | M-27 | Legacy-Bench pilot harness; confirm public set; calibrate cap | eval/modernize/pilot.py, eval/modernize/test-pilot.sh | HIGH | bash eval/modernize/test-pilot.sh | parked@2026-10-16T23:05Z | Source: MODERNIZE.md (D30). Depends on M-26. D34: absorbs the D30 large-tier legacy coverage. D98 park after round 2: round 2 opus BLOCK on fc2a7e90 (F1, budget-skipped units vanish, partial run counts ok). Carried forward as M-27b on top of fc2a7e90. |
407
+ | M-27b | M-27 carry-forward: pilot counts planned units from wave.started/estimate.printed, unrun units are not proven, missing modernize.completed or non-zero exit is not ok, cost per 1K lines labelled lower bound | eval/modernize/pilot.py, eval/modernize/test-pilot.sh | HIGH | bash eval/modernize/test-pilot.sh | building@2026-10-16T23:05Z | Base fc2a7e90 (M-27 round 1 fixes). Source: M-27 round 2 HIGH review F1. Unblocks M-28. Round 1 BLOCK (no producer for modernize.completed, spend undercount, planned units); round 2 fix 7fc7c886 (test-pilot 32/0) in HIGH round 2 review. |
408
+ | M-28 | 200K scale run (Mercurial 4.x, measured first, fallback Calibre) | eval/modernize/scale.py, eval/modernize/SCALE.md | HIGH | python3 eval/modernize/scale.py --target hg --dry-run-first | ready@2026-09-28T02:45Z | Source: MODERNIZE.md (D30). Depends on M-27b (M-27 parked). |
408
409
  | M-29 | 1M scale run (Hadoop 2.x Java 8 to 21, measured first) | eval/modernize/scale_1m.py, eval/modernize/SCALE-1M.md | HIGH | python3 eval/modernize/scale_1m.py --dry-run-first | ready@2026-09-28T02:45Z | Source: MODERNIZE.md (D30). Depends on M-28, M-11. |
409
410
  | M-25w | Modernize report and reslice event wired in production (FC-M25W): coordinator calls writeReport at run end, reslice.ts emits unit.resliced, and a guard asserts every declared modernize event has a producer | loki-ts/src/util/modernize_coordinator.ts, loki-ts/src/engine10/modernize/reslice.ts, loki-ts/tests/engine10/modernize/e2e.test.ts | HIGH | cd loki-ts && bun test tests/engine10/modernize/ | ready@2026-10-16T22:55Z | Source: M-27 HIGH review B2/B3 (FAILURE-CLASSES FC-M25W). Engine10 core is at 4999 of 5000 lines; the coordinator lives in src/util, keep engine10 edits net zero. |
410
411
  | M-30 | User docs for loki modernize, no dashes, commands match USAGE | docs/v10/GUIDE-MODERNIZE.md, tests/test-modernize-docs.sh | LOW | bash tests/test-modernize-docs.sh | released@2026-09-28T21:01Z | Source: MODERNIZE.md (D30). Depends on M-07. Dispatched 18:58Z, sonnet engineer. Tech Lead REJECT r1 (--resume id failed MID_RE), APPROVE r2 5035984d; merged 8d568c66; test-modernize-docs.sh 25/0, shard coverage 19/0, durations drift 6/0. Released in v10.5.0 (merge 8d568c66 is an ancestor of v10.5.0). |
@@ -945,7 +946,8 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
945
946
  | COST-4 | Gate xreview and any reviewer on risk tier (medium/high only) | loki-ts/src/engine10/stages/xreview.ts | LOW | xreview test | released@2026-10-16T01:20Z | Cost audit 2026-10-16: no measured run reaches 0.5x raw yet (best 0.68x lean config). |
946
947
  | COST-5 | Merge plan into implement via the plan chain resume (one fewer cold prefix) | loki-ts/src/engine10/stages/implement.ts | MEDIUM | conflict_resume tests | released@2026-10-16T01:20Z | Cost audit 2026-10-16: no measured run reaches 0.5x raw yet (best 0.68x lean config). |
947
948
  | COST-6 | Measure cost per accepted task vs raw Claude Code: attribution.py --execute, 8 tasks, n=3, Sonnet 5.5, receipt cost.usd vs total_cost_usd; target ratio 0.5 | benchmarks/bench/attribution.py, docs/v10/METRICS.md | MEDIUM | attribution dry-run | parked@2026-10-16T00:12Z | paid eval, needs founder go on spend. Cost audit 2026-10-16: no measured run reaches 0.5x raw yet (best 0.68x lean config). |
948
- | FC-09u | FC-09 siblings: pnpm-workspace.yaml overrides/packageExtensions and .yarnrc.yml packageExtensions join RUNNER_CONFIGS | loki-ts/src/features/runner_config.ts, loki-ts/tests/engine10/runner_config.test.ts | HIGH | each probe caps | ready@2026-10-16T00:12Z | After FC-09t review. |
949
+ | FC-09u | FC-09 siblings: pnpm-workspace.yaml overrides/packageExtensions and .yarnrc.yml packageExtensions join RUNNER_CONFIGS | loki-ts/src/features/runner_config.ts, loki-ts/tests/engine10/runner_config.test.ts | HIGH | each probe caps | parked@2026-10-16T23:12Z | After FC-09t review. Built as 12a4c80a: runner_config.test.ts 135 pass 0 fail; typecheck clean. D98 park after round 2: opus BLOCK e07885d5, real pnpm 11.1.3 applied a link: override through a double BOM and a `? [foo]` explicit key while the check reported UNCAPPED (Bun.YAML vs js-yaml 4 divergence). Carried as FC-09v. |
950
+ | FC-09v | FC-09u carry-forward: trust parsed YAML key comparison only when both sides are in a strict plain subset (no BOM, explicit ? keys, merge keys, anchors, aliases, tags, directives, doc markers, CR, tabs); any other byte change caps | loki-ts/src/features/runner_config.ts, loki-ts/tests/engine10/runner_config.test.ts | HIGH | both FC-09u reviewer probes print CAPPED for every bypass; plain unrelated-key edit does not cap | building@2026-10-16T23:12Z | Base e07885d5. Source: FC-09u round 2 HIGH review. Round 1 BLOCK cebe5641 (block-scalar parser differential reproduced with pnpm 11.1.3); round 2 per D101 caps on any byte change, building. |
949
951
  | CPE24-P2a | Checkpoint rollback restores only an allowlist (session.json, dashboard-state.json, CONTINUITY.md, autonomy-state.json, state, queue) and refuses nested symlinks | packages/control-plane/src/server/routes/checkpoints.ts plus test | MEDIUM | planted audit/ in a checkpoint does not overwrite .loki/audit | released@2026-10-15T23:55Z | rv-trust3 advisory on P2. |
950
952
  | CPE24-P4a | Legacy /api/control/* callers require ctx.local (or isLoopbackHost) like /v1 | packages/control-plane/src/server/legacy/routes-control.ts plus test | MEDIUM | non-loopback Host refused on legacy control | released@2026-10-15T23:55Z | rv-trust3 advisory on P4. |
951
953
  | CP-NITS1 | CP run page nits from the 10.10.2 smoke: Wall row describes the Wall ("Wrote acceptance checks (n files)" or "skipped: no checks written"); local repo with no remote shows the folder name, not REPO UNMEASURED; receipt text read from receipt.json on disk like the derived diff; diffstat failures cached (F1); leading-dash sha fixture | packages/control-plane/src/server plus ui run page plus tests | MEDIUM | CP suite green; a signed receipt on disk renders its text; a no-remote repo shows its folder name | released@2026-10-15T23:55Z | Peer smoke 21:27Z plus CP follow-up review F1. |
@@ -814,3 +814,18 @@ Standing: from this grant on, the CoS decides founder-queue items without waitin
814
814
  10. M-27 Legacy-Bench pilot: use the public set named in MODERNIZE.md; calibrate the cap from the first 3 pilot runs inside the C-F1 cap.
815
815
  11. M-27E defaults: D1 (multi-file units NOT_PROVEN), D2 (a wave with no detected integration tests verifies with a warning; build and original suite still block) and D3 (overflow goes to util/, the modernize/ cap stays 4,000) are adopted as built.
816
816
  12. P12-13b journeys: the U1-U8 list is confirmed as the journey set; add the gh pr edit and comment stubs.
817
+
818
+ ## D100 (2026-10-16, CTO call under D99, CoS records): features cap raised from 3,000 to 3,300 lines
819
+ - FC-09u round 1 HIGH review reproduced 7 bypasses of a hand-rolled YAML key reader in runner_config.ts. The builder had folded that code onto a single line of about 600 characters to stay under the D66 features cap, and the folded code hid the bypasses.
820
+ - The parser-based round 2 fix, unfolded, takes src/features to 3,012 lines.
821
+ - Rejected: folding again, which hurts review. Also rejected: moving the helper into src/util only to dodge the cap, which games the gate.
822
+ - Rule: never fold code to fit a cap. When a correct, readable change crosses a cap, the cap owner raises it in the same slice and records why.
823
+ - Unchanged: the engine10 core cap (D29, D33), the e10ext cap (D42) and the contrib cap.
824
+ - Reverse: lower the cap back once A-150 or a features split frees lines.
825
+
826
+ ## D101 (2026-10-16, CTO call under D99, CoS records): runner config files cap trust on any byte change
827
+ - FC-09v round 1 HIGH review reproduced a bypass with real pnpm 11.1.3: a block scalar indicator on its own line made Bun.YAML swallow `overrides` into a string while js-yaml 4 installed a malicious `link:` override. A fuzz found more parser disagreements (`1_000`, timestamps, block indentation indicators).
828
+ - Rule: never trust a second parser's view of a file another tool will load. For YAML runner config, byte-identical means unchanged; any other byte change caps trust. Changed `*.patch` files and paths under `patches/` cap as well.
829
+ - Cost: an unrelated edit to pnpm-workspace.yaml now caps. Accepted: such edits are rare and moat beats convenience.
830
+ - Rejected: more regexes on a strict subset (round 1 showed the class is open); bundling js-yaml (pnpm can change parsers between versions).
831
+ - Reverse: only by comparing with the exact parser the installed package manager uses, proven by a differential fuzz against it.
@@ -2397,3 +2397,6 @@ The swarm is stopped: .loki/V10-STOP exists, the loop has no wake-ups, and the c
2397
2397
  - 2026-10-16T22:20Z v11.17.3 cut at local main after v11.17.2 failed to publish (help drift, fixed f08f3107a). Sibling bash 3.2 parse fault fixed in scripts/v10-guard.sh (a8cecdc5e, tests/test-v10-guard.sh 194 pass 0 fail). Merged since 21:35Z: C-C2, P12-26g-d, cost S1, S2, S3, S6, S9, S10, M-27D-b, C-C4b-c-b, ROUTES-LOOPBACK, C-F8; P12-13c-b closed as already done (test exists at loki-ts/tests/engine10/wall_split.test.ts:108). Sigpipe ceiling restored (test-sigpipe-guard.sh 4 pass 0 fail); help drift 8 pass 0 fail. Cost S4 and S5 merged after HIGH round 2 approve (S4 real-spawn repro of both blockers fixed; S5 build-profile 72 pass 0 fail). CI reds on a7c5fb309 (run 38972105522: hardcoded HOME, tmp-sweep fixture globs, L0 allowlist, sigpipe ceiling) fixed in 1f23af1dc, 140aae65b, b8b4092d6. Cost goal still failing: true ledger cost about 12.3x raw against a 0.5x target; S11 paid rerun follows the levers.
2398
2398
  - 2026-10-16T22:40Z v11.17.4: v11.17.3 never published (Tests run 38974434374 red: engine10 core 5000 >= 5000, run.sh process substitution from S5, SC1078 in tests/test-hooks.sh). Fixed in 94f94c4d1; budget.test.ts and l0_guard.test.ts 36 pass 0 fail, test-hooks Failed: 0, confinement/structural/help-drift/sigpipe/tmp-sweep/hardcoded-paths rc=0. Ships 11.17.3 content plus cost S7 (council lean haiku children) and S8 (grill and PRD enrich lean flags). Next: S11 paid C-F1 rerun.
2399
2399
  - 2026-10-16T23:00Z v11.17.5: v11.17.4 never published (Tests red on c89555bce: loki grill success path failed, S8 JSON unwrap emptied plain-text provider output; Release failed only at required-ci). Fixed in ddbc80261 (grill.sh and prd-enrich.sh fall back to raw text); test-cli-commands rc=0, test-sdk-text-bridge rc=0, test-sigpipe-guard rc=0. Also ships BOARD M-26 reconcile and FC-M25W/M-25w row.
2400
+ - 2026-10-16T23:05Z M-27 parked per D98: round 2 opus HIGH review BLOCK on fc2a7e90 (test-pilot.sh 26 passed 0 failed, but repro of a 10-unit plan with 1 PROVEN unit then budget.hit gave status ok, equivalence 1.0, calibrate_cap action raise). Carried as M-27b (building). FC-09u built as 12a4c80a (runner_config.test.ts 135 pass 0 fail, typecheck no error TS), in opus HIGH review. v11.17.5 (99b96ffcc) Tests and Release running.
2401
+ - 2026-10-16T23:15Z drift audit (last 6h vs CONTROL.md): 299 commits, 6 release cuts (v11.17.0-v11.17.5), but `npm view loki-mode dist-tags` shows next=11.17.1 only; 11.17.2, 11.17.3 and 11.17.4 never published, each red on a CI-only guard that release.sh skips under LOKI_RELEASE_ALLOW_RED=1. Drift: cut cadence met, publish cadence 1 of 6. Fix dispatched as REL-GUARD (release.sh runs the select-tests.sh --guards-only rows even under ALLOW_RED). Also: S11 run2 measured stale global v11.3.9; stopped, rerun as run3 on repo bin (v11.17.5); COST-BIN merged a05462951.
2402
+ - 2026-10-16T23:25Z v11.17.6: v11.17.5 published (npm next 11.17.5, gh release v11.17.5 draft=false, Tests and Release completed success on 99b96ffcc). Ships COST-BIN (bench tests 79 pass) and D101. Drift audit vs CONTROL.md: M-27b round 1 BLOCK (F1 no modernize.completed producer), round 2 fix 7fc7c886 test-pilot 32/0 in HIGH review; FC-09v round 1 BLOCK cebe5641 (block-scalar bypass reproduced with pnpm install), round 2 fail-closed per D101 building; REL-GUARD and M-25w in flight; S11 run3 on repo v11.17.5 in progress. Cost goal still unproven.
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- var TP0=Object.create;var{getPrototypeOf:PP0,defineProperty:kW,getOwnPropertyNames:Gp,getOwnPropertyDescriptor:EP0}=Object,Hp=Object.prototype.hasOwnProperty;function Up(Z){return this[Z]}var RP0,DP0,wP0=(Z,$,J)=>{var X=Z!=null&&typeof Z==="object";if(X){var Y=$?RP0??=new WeakMap:DP0??=new WeakMap,z=Y.get(Z);if(z)return z}J=Z!=null?TP0(PP0(Z)):{};let W=$||!Z||!Z.__esModule?kW(J,"default",{value:Z,enumerable:!0}):J;for(let Q of Gp(Z))if(!Hp.call(W,Q))kW(W,Q,{get:Up.bind(Z,Q),enumerable:!0});if(X)Y.set(Z,W);return W},_P0=(Z)=>{var $=(Vp??=new WeakMap).get(Z),J;if($)return $;if($=kW({},"__esModule",{value:!0}),Z&&typeof Z==="object"||typeof Z==="function"){for(var X of Gp(Z))if(!Hp.call($,X))kW($,X,{get:Up.bind(Z,X),enumerable:!(J=EP0(Z,X))||J.enumerable})}return Vp.set(Z,$),$},Vp,Tq=(Z,$)=>()=>($||Z(($={exports:{}}).exports,$),$.exports);var kP0=(Z)=>Z;function xP0(Z,$){this[Z]=kP0.bind(null,$)}var L0=(Z,$)=>{for(var J in $)kW(Z,J,{get:$[J],enumerable:!0,configurable:!0,set:xP0.bind($,J)})};var S=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var B5=import.meta.require;var Bp={};L0(Bp,{lokiDir:()=>b0,homeLokiDir:()=>S2,findRepoRootForVersion:()=>PI,REPO_ROOT:()=>I0});import{resolve as v3,dirname as TI}from"path";import{fileURLToPath as SP0}from"url";import{existsSync as Pq}from"fs";import{homedir as bP0}from"os";function yP0(){let Z=qp;for(let $=0;$<6;$++){if(Pq(v3(Z,"VERSION"))&&Pq(v3(Z,"autonomy/run.sh")))return Z;let J=TI(Z);if(J===Z)break;Z=J}return v3(qp,"..","..","..")}function PI(Z){let $=Z;for(let J=0;J<6;J++){if(Pq(v3($,"VERSION"))&&Pq(v3($,"autonomy/run.sh")))return $;let X=TI($);if(X===$)break;$=X}return v3(Z,"..","..","..")}function b0(){return process.env.LOKI_DIR??v3(process.cwd(),".loki")}function S2(){return v3(bP0(),".loki")}var qp,I0;var X8=S(()=>{qp=TI(SP0(import.meta.url));I0=yP0()});import{readFileSync as vP0}from"fs";import{resolve as fP0,dirname as hP0}from"path";import{fileURLToPath as gP0}from"url";function X4(){if(P$!==null)return P$;let Z="11.17.5";if(typeof Z==="string"&&Z.length>0)return P$=Z,P$;try{let $=hP0(gP0(import.meta.url)),J=PI($);P$=vP0(fP0(J,"VERSION"),"utf-8").trim()}catch{P$="unknown"}return P$}var P$=null;var mJ=S(()=>{X8()});import{mkdirSync as mP0,readFileSync as Mp,realpathSync as uP0,statSync as pP0,writeFileSync as dP0}from"fs";import{dirname as EI,join as Np,resolve as cP0}from"path";function oP0(){return cP0(S2(),"cache","update-check.json")}function uJ(Z){let $=/^(\d+)\.(\d+)\.(\d+)$/.exec(Z.trim());if(!$)return null;return[Number($[1]),Number($[2]),Number($[3])]}function Eq(Z,$){let J=uJ(Z),X=uJ($);if(!J||!X)return!1;let[Y,z,W]=J,[Q,K,V]=X;if(Y!==Q)return Y>Q;if(z!==K)return z>K;return W>V}function nP0(){if(process.env.LOKI_NO_UPDATE_CHECK==="1")return!0;if(process.env.CI)return!0;if(!process.stdout.isTTY)return!0;return!1}function sP0(Z){try{let $=Mp(Z,"utf-8"),J=JSON.parse($);if(typeof J.checkedAt==="number"&&typeof J.latest==="string"&&uJ(J.latest)!==null)return{checkedAt:J.checkedAt,latest:J.latest}}catch{}return null}function rP0(Z,$){try{mP0(EI(Z),{recursive:!0}),dP0(Z,JSON.stringify($),"utf-8")}catch{}}async function tP0(){try{let Z=await fetch(lP0,{signal:AbortSignal.timeout(aP0),headers:{accept:"application/json"}});if(!Z.ok)return null;let $=await Z.json();if(typeof $.version==="string"&&uJ($.version)!==null)return $.version}catch{}return null}async function eP0(Z=Date.now(),$=tP0,J=oP0()){let X=sP0(J);if(X&&Z-X.checkedAt<iP0)return X.latest;let Y=await $();if(Y===null)return null;return rP0(J,{checkedAt:Z,latest:Y}),Y}function ZE0(Z,$=process.env){if(uJ(Z)===null)return null;let X=$.PATH;if(!X)return null;let Y=new Set;for(let z of X.split(":")){if(!z)continue;let W=Np(z,"loki"),Q;try{pP0(W),Q=uP0(W)}catch{continue}if(Y.has(Q))continue;Y.add(Q);try{let K=Np(EI(EI(Q)),"package.json"),V=JSON.parse(Mp(K,"utf8")).version;if(typeof V!=="string")continue;if(Eq(V,Z))return{path:W,version:V}}catch{continue}}return null}async function Op(Z,$={}){try{if(nP0())return;if(uJ(Z)===null)return;let J=$.write??((z)=>process.stderr.write(z)),X=ZE0(Z,$.env??process.env);if(X!==null){J(`Loki Mode ${X.version} is installed but not the one running (you are running ${Z}).
2
+ var TP0=Object.create;var{getPrototypeOf:PP0,defineProperty:kW,getOwnPropertyNames:Gp,getOwnPropertyDescriptor:EP0}=Object,Hp=Object.prototype.hasOwnProperty;function Up(Z){return this[Z]}var RP0,DP0,wP0=(Z,$,J)=>{var X=Z!=null&&typeof Z==="object";if(X){var Y=$?RP0??=new WeakMap:DP0??=new WeakMap,z=Y.get(Z);if(z)return z}J=Z!=null?TP0(PP0(Z)):{};let W=$||!Z||!Z.__esModule?kW(J,"default",{value:Z,enumerable:!0}):J;for(let Q of Gp(Z))if(!Hp.call(W,Q))kW(W,Q,{get:Up.bind(Z,Q),enumerable:!0});if(X)Y.set(Z,W);return W},_P0=(Z)=>{var $=(Vp??=new WeakMap).get(Z),J;if($)return $;if($=kW({},"__esModule",{value:!0}),Z&&typeof Z==="object"||typeof Z==="function"){for(var X of Gp(Z))if(!Hp.call($,X))kW($,X,{get:Up.bind(Z,X),enumerable:!(J=EP0(Z,X))||J.enumerable})}return Vp.set(Z,$),$},Vp,Tq=(Z,$)=>()=>($||Z(($={exports:{}}).exports,$),$.exports);var kP0=(Z)=>Z;function xP0(Z,$){this[Z]=kP0.bind(null,$)}var L0=(Z,$)=>{for(var J in $)kW(Z,J,{get:$[J],enumerable:!0,configurable:!0,set:xP0.bind($,J)})};var S=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var B5=import.meta.require;var Bp={};L0(Bp,{lokiDir:()=>b0,homeLokiDir:()=>S2,findRepoRootForVersion:()=>PI,REPO_ROOT:()=>I0});import{resolve as v3,dirname as TI}from"path";import{fileURLToPath as SP0}from"url";import{existsSync as Pq}from"fs";import{homedir as bP0}from"os";function yP0(){let Z=qp;for(let $=0;$<6;$++){if(Pq(v3(Z,"VERSION"))&&Pq(v3(Z,"autonomy/run.sh")))return Z;let J=TI(Z);if(J===Z)break;Z=J}return v3(qp,"..","..","..")}function PI(Z){let $=Z;for(let J=0;J<6;J++){if(Pq(v3($,"VERSION"))&&Pq(v3($,"autonomy/run.sh")))return $;let X=TI($);if(X===$)break;$=X}return v3(Z,"..","..","..")}function b0(){return process.env.LOKI_DIR??v3(process.cwd(),".loki")}function S2(){return v3(bP0(),".loki")}var qp,I0;var X8=S(()=>{qp=TI(SP0(import.meta.url));I0=yP0()});import{readFileSync as vP0}from"fs";import{resolve as fP0,dirname as hP0}from"path";import{fileURLToPath as gP0}from"url";function X4(){if(P$!==null)return P$;let Z="11.17.6";if(typeof Z==="string"&&Z.length>0)return P$=Z,P$;try{let $=hP0(gP0(import.meta.url)),J=PI($);P$=vP0(fP0(J,"VERSION"),"utf-8").trim()}catch{P$="unknown"}return P$}var P$=null;var mJ=S(()=>{X8()});import{mkdirSync as mP0,readFileSync as Mp,realpathSync as uP0,statSync as pP0,writeFileSync as dP0}from"fs";import{dirname as EI,join as Np,resolve as cP0}from"path";function oP0(){return cP0(S2(),"cache","update-check.json")}function uJ(Z){let $=/^(\d+)\.(\d+)\.(\d+)$/.exec(Z.trim());if(!$)return null;return[Number($[1]),Number($[2]),Number($[3])]}function Eq(Z,$){let J=uJ(Z),X=uJ($);if(!J||!X)return!1;let[Y,z,W]=J,[Q,K,V]=X;if(Y!==Q)return Y>Q;if(z!==K)return z>K;return W>V}function nP0(){if(process.env.LOKI_NO_UPDATE_CHECK==="1")return!0;if(process.env.CI)return!0;if(!process.stdout.isTTY)return!0;return!1}function sP0(Z){try{let $=Mp(Z,"utf-8"),J=JSON.parse($);if(typeof J.checkedAt==="number"&&typeof J.latest==="string"&&uJ(J.latest)!==null)return{checkedAt:J.checkedAt,latest:J.latest}}catch{}return null}function rP0(Z,$){try{mP0(EI(Z),{recursive:!0}),dP0(Z,JSON.stringify($),"utf-8")}catch{}}async function tP0(){try{let Z=await fetch(lP0,{signal:AbortSignal.timeout(aP0),headers:{accept:"application/json"}});if(!Z.ok)return null;let $=await Z.json();if(typeof $.version==="string"&&uJ($.version)!==null)return $.version}catch{}return null}async function eP0(Z=Date.now(),$=tP0,J=oP0()){let X=sP0(J);if(X&&Z-X.checkedAt<iP0)return X.latest;let Y=await $();if(Y===null)return null;return rP0(J,{checkedAt:Z,latest:Y}),Y}function ZE0(Z,$=process.env){if(uJ(Z)===null)return null;let X=$.PATH;if(!X)return null;let Y=new Set;for(let z of X.split(":")){if(!z)continue;let W=Np(z,"loki"),Q;try{pP0(W),Q=uP0(W)}catch{continue}if(Y.has(Q))continue;Y.add(Q);try{let K=Np(EI(EI(Q)),"package.json"),V=JSON.parse(Mp(K,"utf8")).version;if(typeof V!=="string")continue;if(Eq(V,Z))return{path:W,version:V}}catch{continue}}return null}async function Op(Z,$={}){try{if(nP0())return;if(uJ(Z)===null)return;let J=$.write??((z)=>process.stderr.write(z)),X=ZE0(Z,$.env??process.env);if(X!==null){J(`Loki Mode ${X.version} is installed but not the one running (you are running ${Z}).
3
3
  Another loki earlier on PATH is winning. Newer copy: ${X.path}
4
4
  Run \`which -a loki\` to see the order, then remove or re-point the earlier entry.
5
5
  `);return}let Y=await eP0($.now,$.fetcher,$.cacheFile);if(Y===null)return;if(!Eq(Y,Z))return;J(`A newer Loki Mode is available: ${Y} (you have ${Z}). Update: bun install -g loki-mode (or npm i -g loki-mode)
@@ -2428,4 +2428,4 @@ Unknown commands exit 2 with a suggestion; run 'loki help' for the full list.
2428
2428
  `);{let{suggestCommand:X}=await Promise.resolve().then(() => (au(),iT0)),Y=$===void 0?void 0:X($);if(Y)process.stderr.write(`Did you mean 'loki ${Y}'?
2429
2429
  `)}return process.stderr.write(MP0),2}}DU0();var OP0=()=>globalThis[Symbol.for("loki.ownsStopSignals")]===!0;process.on("SIGINT",()=>{if(!OP0())process.exit(130)});process.on("SIGTERM",()=>{if(!OP0())process.exit(143)});var x39=await k39(Bun.argv.slice(2));process.exit(x39);
2430
2430
 
2431
- //# debugId=4F3F94BD7EEBE9C8A7D3CEA9B4CFA40D
2431
+ //# debugId=3DC7D38D09F563FA10EAF5EFD17B7BED
package/mcp/__init__.py CHANGED
@@ -75,4 +75,4 @@ try:
75
75
  except ImportError:
76
76
  __all__ = ['mcp']
77
77
 
78
- __version__ = '11.17.5'
78
+ __version__ = '11.17.6'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "loki-mode",
3
3
  "mcpName": "io.github.asklokesh/loki-mode",
4
- "version": "11.17.5",
4
+ "version": "11.17.6",
5
5
  "description": "An autonomous software factory that knows what it is supposed to deliver, and proves it did.",
6
6
  "keywords": [
7
7
  "agent",
@@ -160,5 +160,5 @@
160
160
  "dependencies": {
161
161
  "@resvg/resvg-wasm": "^2.6.2"
162
162
  },
163
- "gitHead": "99b96ffcc01947503bf9baf439856fd6ece21eeb"
163
+ "gitHead": "d84ef95684aa4aaf504f382d61688ec4868dbf11"
164
164
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "loki-mode",
4
4
  "displayName": "Loki Mode",
5
- "version": "11.17.5",
5
+ "version": "11.17.6",
6
6
  "description": "Autonomous spec-to-product build system with a built-in trust layer (RARV-C closure loop, 8 quality gates, completion council). Ships Loki's spec-hardening, drift-detection, and deterministic PR verification commands plus the Loki MCP server.",
7
7
  "author": {
8
8
  "name": "Autonomi",
@@ -1,4 +1,4 @@
1
- import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-BlCg8mla.js";import{B as C}from"./Button-CG79n6-I.js";import{T as $e}from"./trending-up-7H96_KlR.js";import{C as z}from"./clock--0bfAUkP.js";import{A as Be,U as ue,M as De}from"./Avatar-Cgc0QepK.js";import{A as J}from"./activity-CBEULbio.js";import{R as pe}from"./refresh-cw-DZn-gB9J.js";import{G as ze}from"./globe-CfyHbAbI.js";import{C as Le}from"./chevron-left-DtZJiu3T.js";import{C as je}from"./check-C_7N7W4q.js";import{D as Y}from"./dollar-sign-BshJt4ML.js";import{U as Te}from"./user-UDo6EQfn.js";import{D as Me}from"./database-C-A2USGl.js";import{L as Ue}from"./lock-C5vRE8HM.js";import{S as Re}from"./scroll-text-DTvZMQuh.js";import{S as Ie}from"./shield-alert-Dn5Rtkhx.js";/**
1
+ import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-DpBLuMuz.js";import{B as C}from"./Button-Bhjts5QZ.js";import{T as $e}from"./trending-up-CVJ1ox6c.js";import{C as z}from"./clock-CZ7SvULz.js";import{A as Be,U as ue,M as De}from"./Avatar-DMrDsuGe.js";import{A as J}from"./activity-BaQQRhDp.js";import{R as pe}from"./refresh-cw-COI1R5Oo.js";import{G as ze}from"./globe-rSsEzPYv.js";import{C as Le}from"./chevron-left-DGnt-DtK.js";import{C as je}from"./check-DJml2Xdn.js";import{D as Y}from"./dollar-sign-DgWePGsv.js";import{U as Te}from"./user-CRdHMZNH.js";import{D as Me}from"./database-CLFG5upC.js";import{L as Ue}from"./lock-Bc_Uqxpp.js";import{S as Re}from"./scroll-text-Cakp8XHd.js";import{S as Ie}from"./shield-alert-BilhziJF.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as l,j as s}from"./index-BlCg8mla.js";/**
1
+ import{c as l,j as s}from"./index-DpBLuMuz.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{j as e}from"./index-BlCg8mla.js";import{C as r}from"./clock--0bfAUkP.js";import{C as a}from"./circle-alert-CJK4sNof.js";import{C as l}from"./check-C_7N7W4q.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
1
+ import{j as e}from"./index-DpBLuMuz.js";import{C as r}from"./clock-CZ7SvULz.js";import{C as a}from"./circle-alert-BV5rVL7K.js";import{C as l}from"./check-DJml2Xdn.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
@@ -1 +1 @@
1
- import{r as p,j as t}from"./index-BlCg8mla.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
1
+ import{r as p,j as t}from"./index-DpBLuMuz.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
@@ -1,4 +1,4 @@
1
- import{c as $,r as l,j as e,G as we,Q as Se,F as Ce,h as Re,T as U,Z as Ee,a as S,V as Me,S as $e,Y as Te,X as Pe,P as ie,i as Ae,g as ze,C as Ie,l as Le,N as I,J as _e,K as De,O as Fe,u as Oe}from"./index-BlCg8mla.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-DLQKY8LF.js";import{C as qe,F as Ge,M as Ue,H as Ke,a as We,G as Ve,T as Qe}from"./thumbs-up-D_lHdH-1.js";import{C as oe}from"./check-C_7N7W4q.js";import{C as Ye}from"./clock--0bfAUkP.js";import{D as Xe}from"./dollar-sign-BshJt4ML.js";import{U as Ze}from"./upload-kTTgyfD6.js";import{L as V}from"./loader-circle-CkOfS_Q6.js";/**
1
+ import{c as $,r as l,j as e,G as we,Q as Se,F as Ce,h as Re,T as U,Z as Ee,a as S,V as Me,S as $e,Y as Te,X as Pe,P as ie,i as Ae,g as ze,C as Ie,l as Le,N as I,J as _e,K as De,O as Fe,u as Oe}from"./index-DpBLuMuz.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-Cmt2x_mL.js";import{C as qe,F as Ge,M as Ue,H as Ke,a as We,G as Ve,T as Qe}from"./thumbs-up-CglMrtrt.js";import{C as oe}from"./check-DJml2Xdn.js";import{C as Ye}from"./clock-CZ7SvULz.js";import{D as Xe}from"./dollar-sign-DgWePGsv.js";import{U as Ze}from"./upload-DmuR09WL.js";import{L as V}from"./loader-circle-C43izEm5.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as o,j as e}from"./index-BlCg8mla.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
1
+ import{r as o,j as e}from"./index-DpBLuMuz.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
@@ -1,4 +1,4 @@
1
- import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-BlCg8mla.js";/**
1
+ import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-DpBLuMuz.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as l,a as x,j as e}from"./index-BlCg8mla.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`${s.cost.cost_partial===!0?"at least ":""}$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
1
+ import{r as l,a as x,j as e}from"./index-DpBLuMuz.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`${s.cost.cost_partial===!0?"at least ":""}$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
@@ -1,4 +1,4 @@
1
- import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-BlCg8mla.js";import{B as N}from"./Button-CG79n6-I.js";import{C as y}from"./thumbs-up-D_lHdH-1.js";import{R as S}from"./refresh-cw-DZn-gB9J.js";import{C as z}from"./circle-alert-CJK4sNof.js";import{U as D}from"./user-UDo6EQfn.js";import{L as G}from"./loader-circle-CkOfS_Q6.js";import{R as T}from"./rotate-ccw-rH63YhnY.js";/**
1
+ import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-DpBLuMuz.js";import{B as N}from"./Button-Bhjts5QZ.js";import{C as y}from"./thumbs-up-CglMrtrt.js";import{R as S}from"./refresh-cw-COI1R5Oo.js";import{C as z}from"./circle-alert-BV5rVL7K.js";import{U as D}from"./user-CRdHMZNH.js";import{L as G}from"./loader-circle-C43izEm5.js";import{R as T}from"./rotate-ccw-BoNZx4xe.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as I,r as c,a as b,j as e,G as me,A as ue,S as Z,k as ee,m as pe,h as he,p as fe,X as te,M as be}from"./index-BlCg8mla.js";import{B as y}from"./Button-CG79n6-I.js";import{C as ge}from"./chevron-left-DtZJiu3T.js";import{G as P}from"./thumbs-up-D_lHdH-1.js";import{R as $}from"./refresh-cw-DZn-gB9J.js";import{C as Ne}from"./circle-alert-CJK4sNof.js";import{L as Q,S as je}from"./ProjectPage-pUnvGriO.js";import{S as se}from"./shield-alert-Dn5Rtkhx.js";import{F as ye}from"./file-code-corner-Bd--i_IM.js";import{C as V}from"./clock--0bfAUkP.js";import{C as re}from"./check-C_7N7W4q.js";import"./ErrorBoundary-DLQKY8LF.js";import"./TerminalOutput-CDSVt5TB.js";import"./lock-C5vRE8HM.js";import"./package-BPzp43h4.js";import"./file-plus-YiNg-aWn.js";import"./activity-CBEULbio.js";import"./scroll-text-DTvZMQuh.js";import"./bot-Dh1FlTEJ.js";import"./loader-circle-CkOfS_Q6.js";import"./hammer-BlGC-yqz.js";import"./dollar-sign-BshJt4ML.js";import"./globe-CfyHbAbI.js";import"./trash-2-CVfeP0Fb.js";import"./upload-kTTgyfD6.js";import"./plus-C4x6sD5J.js";import"./rotate-ccw-rH63YhnY.js";import"./code-xml-4gRrVGxx.js";import"./trending-up-7H96_KlR.js";import"./layers-DLiA0AcW.js";import"./trending-down-ouPrjBEm.js";import"./server-DmwCdhKT.js";/**
1
+ import{c as I,r as c,a as b,j as e,G as me,A as ue,S as Z,k as ee,m as pe,h as he,p as fe,X as te,M as be}from"./index-DpBLuMuz.js";import{B as y}from"./Button-Bhjts5QZ.js";import{C as ge}from"./chevron-left-DGnt-DtK.js";import{G as P}from"./thumbs-up-CglMrtrt.js";import{R as $}from"./refresh-cw-COI1R5Oo.js";import{C as Ne}from"./circle-alert-BV5rVL7K.js";import{L as Q,S as je}from"./ProjectPage-CAodVUpE.js";import{S as se}from"./shield-alert-BilhziJF.js";import{F as ye}from"./file-code-corner-DGQX2bmv.js";import{C as V}from"./clock-CZ7SvULz.js";import{C as re}from"./check-DJml2Xdn.js";import"./ErrorBoundary-Cmt2x_mL.js";import"./TerminalOutput-CKG79r_-.js";import"./lock-Bc_Uqxpp.js";import"./package-BM25lcR-.js";import"./file-plus-LkaXeYd6.js";import"./activity-BaQQRhDp.js";import"./scroll-text-Cakp8XHd.js";import"./bot-CSxaA0KU.js";import"./loader-circle-C43izEm5.js";import"./hammer-CPogONt9.js";import"./dollar-sign-DgWePGsv.js";import"./globe-rSsEzPYv.js";import"./trash-2-B6zVvnoG.js";import"./upload-DmuR09WL.js";import"./plus-D0xoiY6N.js";import"./rotate-ccw-BoNZx4xe.js";import"./code-xml-DzA2wL8F.js";import"./trending-up-CVJ1ox6c.js";import"./layers-CwFaqidn.js";import"./trending-down-BVhwD9bt.js";import"./server-CjfIlPmE.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.