loki-mode 10.5.25 → 10.5.27

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 (73) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/autonomy/run.sh +10 -10
  4. package/dashboard/__init__.py +1 -1
  5. package/docs/INSTALLATION.md +1 -1
  6. package/docs/v10/BOARD.md +7 -5
  7. package/docs/v10/PROGRESS.md +12 -0
  8. package/loki-ts/dist/loki.js +2 -2
  9. package/mcp/__init__.py +1 -1
  10. package/package.json +1 -1
  11. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  12. package/providers/aider.sh +1 -1
  13. package/providers/claude.sh +2 -2
  14. package/providers/cline.sh +1 -1
  15. package/providers/codex.sh +2 -2
  16. package/providers/opencode.sh +2 -2
  17. package/web-app/dist/assets/{AdminPage-CAv0-6cg.js → AdminPage-DcuNjtU2.js} +1 -1
  18. package/web-app/dist/assets/{Avatar-CaQtzthw.js → Avatar-DZrFNNs1.js} +1 -1
  19. package/web-app/dist/assets/{Badge-DtbHiuRY.js → Badge-CNdEpn2n.js} +1 -1
  20. package/web-app/dist/assets/{Button-fW3YlMPF.js → Button-2CyndOs-.js} +1 -1
  21. package/web-app/dist/assets/{CockpitPage-BNuhQ_fT.js → CockpitPage-BvyZqDMc.js} +1 -1
  22. package/web-app/dist/assets/{ComparePage-Crz5Q3ha.js → ComparePage-WFh9I-fv.js} +1 -1
  23. package/web-app/dist/assets/{ErrorBoundary-B5WNaTbp.js → ErrorBoundary-3cBCDGNQ.js} +1 -1
  24. package/web-app/dist/assets/{EvidenceReceiptPanel-CPGCtoP-.js → EvidenceReceiptPanel-DtcsUwWS.js} +1 -1
  25. package/web-app/dist/assets/{GitHubIssuesPanel-BsdRcYfU.js → GitHubIssuesPanel-DyGsGsl7.js} +1 -1
  26. package/web-app/dist/assets/{GitHubPRsPanel-CZxxcMfX.js → GitHubPRsPanel-DNQAlD2u.js} +1 -1
  27. package/web-app/dist/assets/{HomePage-2dHUxOiP.js → HomePage-BfUxFlmB.js} +2 -2
  28. package/web-app/dist/assets/{LoginPage-BQP3Rr-3.js → LoginPage-CYoe74zA.js} +1 -1
  29. package/web-app/dist/assets/{MagicPage-aOaQ63-F.js → MagicPage-BvBfdC6A.js} +1 -1
  30. package/web-app/dist/assets/{MetricsPage-BjEXEnBK.js → MetricsPage-LurLUnMP.js} +1 -1
  31. package/web-app/dist/assets/{NotFoundPage-po9T59mG.js → NotFoundPage-DRQFyKv6.js} +1 -1
  32. package/web-app/dist/assets/{ProjectPage-Chlxfsb1.js → ProjectPage-CgjjhiZJ.js} +3 -3
  33. package/web-app/dist/assets/{ProjectsPage-Co6qkF_I.js → ProjectsPage-C8pt9pX9.js} +1 -1
  34. package/web-app/dist/assets/{SettingsPage-DxV7zr-h.js → SettingsPage-jMlgNMOh.js} +1 -1
  35. package/web-app/dist/assets/{ShowcasePage-BtiucdEZ.js → ShowcasePage-BpGrbzzu.js} +1 -1
  36. package/web-app/dist/assets/{SystemSettingsPage-DBpjtHy8.js → SystemSettingsPage-Biuohl01.js} +1 -1
  37. package/web-app/dist/assets/{TeamsPage-HifOcK5-.js → TeamsPage-C86EmkhH.js} +1 -1
  38. package/web-app/dist/assets/{TemplatesPage-DtlUzFmx.js → TemplatesPage-CFAxEAoA.js} +1 -1
  39. package/web-app/dist/assets/{TerminalOutput-Dl7F0H0d.js → TerminalOutput-CzkoqeUF.js} +1 -1
  40. package/web-app/dist/assets/{activity-BwzYTinZ.js → activity-C6h86DPU.js} +1 -1
  41. package/web-app/dist/assets/{bell-DCUieZE9.js → bell-D-L0PZ6o.js} +1 -1
  42. package/web-app/dist/assets/{bot-D0QOEr2j.js → bot-BhQSd5JG.js} +1 -1
  43. package/web-app/dist/assets/{check-BkUbott-.js → check-DzLHbeXy.js} +1 -1
  44. package/web-app/dist/assets/{chevron-left-CJB72p7S.js → chevron-left-FQWSntqn.js} +1 -1
  45. package/web-app/dist/assets/{circle-alert-ZkCFp9P0.js → circle-alert-D0JjWKvh.js} +1 -1
  46. package/web-app/dist/assets/{clock-C7wfh0WZ.js → clock-06MLkRVl.js} +1 -1
  47. package/web-app/dist/assets/{cloud-BfSkCPAa.js → cloud-Ci4sOZc4.js} +1 -1
  48. package/web-app/dist/assets/{code-xml-D4Bknj7L.js → code-xml-B5VKlV99.js} +1 -1
  49. package/web-app/dist/assets/{database-6uWPD9SM.js → database-6E7lagq-.js} +1 -1
  50. package/web-app/dist/assets/{dollar-sign-C1GC_4Gf.js → dollar-sign-BNU6A7jW.js} +1 -1
  51. package/web-app/dist/assets/{file-code-corner-XiJnJDoy.js → file-code-corner-BAK-Pwza.js} +1 -1
  52. package/web-app/dist/assets/{file-plus-BaN2vTKi.js → file-plus-CbFPGeNa.js} +1 -1
  53. package/web-app/dist/assets/{globe-CQs61CBR.js → globe-B0kl7VhM.js} +1 -1
  54. package/web-app/dist/assets/{hammer-9VgifcL2.js → hammer-DlFwJHcr.js} +1 -1
  55. package/web-app/dist/assets/{index-Bf_yp-ka.js → index-BaYJTUS-.js} +3 -3
  56. package/web-app/dist/assets/{layers-D4Vw8Mbi.js → layers-OdYlYYru.js} +1 -1
  57. package/web-app/dist/assets/{loader-circle-BfVRhTkt.js → loader-circle-DbNBntUa.js} +1 -1
  58. package/web-app/dist/assets/{lock-CHVfJ2Ec.js → lock-B8t9Fr9B.js} +1 -1
  59. package/web-app/dist/assets/{package-DpVxPE51.js → package-KRaBLXTm.js} +1 -1
  60. package/web-app/dist/assets/{plus-BvPWfH2l.js → plus-BBbF97rg.js} +1 -1
  61. package/web-app/dist/assets/{refresh-cw-CiKOB-AH.js → refresh-cw-sHIiSn3J.js} +1 -1
  62. package/web-app/dist/assets/{rotate-ccw-BqyKlVyu.js → rotate-ccw-CuKMcQlw.js} +1 -1
  63. package/web-app/dist/assets/{scroll-text-BkVFxR9Q.js → scroll-text-Dmt3YJma.js} +1 -1
  64. package/web-app/dist/assets/{server-gXecxW5O.js → server-CeR3mHcb.js} +1 -1
  65. package/web-app/dist/assets/{shield-alert-DD6z7kMY.js → shield-alert-NjEOZ7rp.js} +1 -1
  66. package/web-app/dist/assets/{thumbs-up-pw5NDACS.js → thumbs-up-D--YuSwG.js} +1 -1
  67. package/web-app/dist/assets/{trash-2-BSh9aztG.js → trash-2-CdN_0YZm.js} +1 -1
  68. package/web-app/dist/assets/{trending-down-Cqo5izHb.js → trending-down-SEofhOe8.js} +1 -1
  69. package/web-app/dist/assets/{trending-up-CYNQ9vY-.js → trending-up-BoFNcyTk.js} +1 -1
  70. package/web-app/dist/assets/{upload-Blr76ubG.js → upload-tPtabajO.js} +1 -1
  71. package/web-app/dist/assets/{usePolling-Cuc9zvC4.js → usePolling-Bfa3IjxI.js} +1 -1
  72. package/web-app/dist/assets/{user-MOQxScJS.js → user-BDuP1Dzn.js} +1 -1
  73. 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 v10.5.25
6
+ # Loki Mode v10.5.27
7
7
 
8
8
  **You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
9
9
 
@@ -470,4 +470,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
470
470
 
471
471
  ---
472
472
 
473
- **v10.5.25 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
473
+ **v10.5.27 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 10.5.25
1
+ 10.5.27
package/autonomy/run.sh CHANGED
@@ -1066,7 +1066,7 @@ _loki_invoke_argv_provider() {
1066
1066
 
1067
1067
  LOKI_DEADLINE_IDLE_TIMEOUT="${LOKI_PROVIDER_IDLE_TIMEOUT:-0}" \
1068
1068
  _loki_with_deadline "${LOKI_PROVIDER_CALL_TIMEOUT:-0}" \
1069
- "${_LOKI_INVOKE_ARGV[@]}" 2>&1 \
1069
+ "${_LOKI_INVOKE_ARGV[@]}" < /dev/null 2>&1 \
1070
1070
  | tee -a "$log_file" "$agent_log" "$iter_output"
1071
1071
  _loki_argv_pipe_status=("${PIPESTATUS[@]}")
1072
1072
  return "$(_loki_provider_pipeline_exit_code \
@@ -6942,7 +6942,7 @@ Output ONLY the resolved file content with no conflict markers. No explanations.
6942
6942
  # the EXACT resolved file content (the shell writes it verbatim).
6943
6943
  # Compressing prose into the merged source would corrupt the file,
6944
6944
  # so disable caveman unconditionally here. No-op when absent.
6945
- resolution=$(CAVEMAN_DEFAULT_MODE=off claude "${_cr_argv[@]}" -p "$conflict_prompt" --output-format text 2>/dev/null)
6945
+ resolution=$(CAVEMAN_DEFAULT_MODE=off claude "${_cr_argv[@]}" -p "$conflict_prompt" --output-format text < /dev/null 2>/dev/null)
6946
6946
  ;;
6947
6947
  codex)
6948
6948
  resolution=$(codex exec --sandbox workspace-write --skip-git-repo-check "$conflict_prompt" 2>/dev/null)
@@ -7601,9 +7601,9 @@ invoke_cline() {
7601
7601
  shift
7602
7602
  local model="${LOKI_CLINE_MODEL:-}"
7603
7603
  if [[ -n "$model" ]]; then
7604
- cline -y -m "$model" "$prompt" "$@" 2>&1
7604
+ cline -y -m "$model" "$prompt" "$@" < /dev/null 2>&1
7605
7605
  else
7606
- cline -y "$prompt" "$@" 2>&1
7606
+ cline -y "$prompt" "$@" < /dev/null 2>&1
7607
7607
  fi
7608
7608
  }
7609
7609
 
@@ -7614,9 +7614,9 @@ invoke_cline_capture() {
7614
7614
  shift
7615
7615
  local model="${LOKI_CLINE_MODEL:-}"
7616
7616
  if [[ -n "$model" ]]; then
7617
- cline -y -m "$model" "$prompt" "$@" 2>&1
7617
+ cline -y -m "$model" "$prompt" "$@" < /dev/null 2>&1
7618
7618
  else
7619
- cline -y "$prompt" "$@" 2>&1
7619
+ cline -y "$prompt" "$@" < /dev/null 2>&1
7620
7620
  fi
7621
7621
  }
7622
7622
 
@@ -16449,7 +16449,7 @@ _dispatch_reviewer() {
16449
16449
  fi
16450
16450
  _loki_with_deadline "$_codex_cap" \
16451
16451
  codex exec --sandbox workspace-write --skip-git-repo-check "$prompt_text" \
16452
- > "$review_output"
16452
+ < /dev/null > "$review_output"
16453
16453
  ;;
16454
16454
  cline)
16455
16455
  local _cline_cap="$_review_budget"
@@ -16459,7 +16459,7 @@ _dispatch_reviewer() {
16459
16459
  local _cline_argv=(-y)
16460
16460
  [ -n "${LOKI_CLINE_MODEL:-}" ] && _cline_argv+=(-m "$LOKI_CLINE_MODEL")
16461
16461
  _loki_with_deadline "$_cline_cap" cline "${_cline_argv[@]}" "$prompt_text" \
16462
- > "$review_output"
16462
+ < /dev/null > "$review_output"
16463
16463
  ;;
16464
16464
  aider)
16465
16465
  local _aider_cap="$_review_budget"
@@ -25502,12 +25502,12 @@ except Exception as exc:
25502
25502
  LOKI_DEADLINE_IDLE_TIMEOUT="${LOKI_PROVIDER_IDLE_TIMEOUT:-0}" \
25503
25503
  _loki_with_deadline "${LOKI_PROVIDER_CALL_TIMEOUT:-0}" \
25504
25504
  claude "${_loki_claude_argv[@]}" -p "$prompt" \
25505
- --output-format stream-json --verbose 2>&1
25505
+ --output-format stream-json --verbose < /dev/null 2>&1
25506
25506
  else
25507
25507
  LOKI_DEADLINE_IDLE_TIMEOUT="${LOKI_PROVIDER_IDLE_TIMEOUT:-0}" \
25508
25508
  _loki_with_deadline "${LOKI_PROVIDER_CALL_TIMEOUT:-0}" \
25509
25509
  claude "${_loki_claude_argv[@]}" -p "$prompt" \
25510
- --output-format stream-json --verbose 2>&1
25510
+ --output-format stream-json --verbose < /dev/null 2>&1
25511
25511
  fi | \
25512
25512
  tee -a "$log_file" "$agent_log" "$iter_output" | \
25513
25513
  python3 -u -c '
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "10.5.25"
10
+ __version__ = "10.5.27"
11
11
 
12
12
  # Expose the control app for easy import
13
13
  try:
@@ -2,7 +2,7 @@
2
2
 
3
3
  The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
4
4
 
5
- **Version:** v10.5.25
5
+ **Version:** v10.5.27
6
6
 
7
7
  ---
8
8
 
package/docs/v10/BOARD.md CHANGED
@@ -479,7 +479,7 @@ set is declared to avoid overlap with those and with each other.
479
479
  | E-149 | loki-ts/tests/engine10/modernize/java_capture.test.ts "unitClassesFromGraph (M-04 integration)" times out at bun's 5s default under CI load (5169ms, Coverage run 36764748814 on train/5 1cd5feac; also failed on train/2 and in a local full run): measure, make it cheaper or set an explicit measured timeout; sweep modernize tests over 2.5s | loki-ts/tests/engine10/modernize/*.test.ts | LOW | before/after durations under 3x load; bun test tests/engine10/modernize 0 fail | released@2026-09-30T20:08Z | Source: D44 train/5 red (Coverage). Rerun of the failed job in flight. Released in v10.5.10 (merge 2394dc4a is an ancestor of v10.5.10). |
480
480
  | E-151 | Release blocker guard: v10.5.10 (69ebc03e) shipped loki-ts/dist/loki.js.map stale because the bump changed it (version literal 10.5.9 to 10.5.10 changed length, shifting mappings) and the release commit staged a fixed file list. scripts/release.sh --bump-only should print every file it changed (including dist maps), and a check (in release.sh or a pre-push rule for "release: v*" commits) should refuse a release commit that leaves a stamped tracked file modified in the worktree | scripts/release.sh, tests/test-release-dist-guard.sh | LOW | fixture: a bump that changes the map, commit without it, check refuses; with it, passes | released@2026-09-30T21:23Z | Source: v10.5.10 release; interim procedure: assert `git status --porcelain` is empty after the release commit before pushing. Map corrected on the next train. Released in v10.5.11 (merge bd5834a9 is an ancestor of v10.5.11). |
481
481
  | E-152 | release.sh --bump-only "stage these files:" list must print a copy-paste command that works: loki-ts/dist is gitignored, so `git add loki-ts/dist/loki.js` refuses (seen 19:58Z on train/7); print `git add -f` for paths under an ignored directory (git check-ignore) and plain `git add` otherwise | scripts/release.sh, tests/test-release-dist-guard.sh | LOW | fixture with an ignored-but-tracked dist file: the printed command stages it | released@2026-10-01T06:40Z | Source: first live use of E-151 --check-clean caught the unstaged dist (rc=1). |
482
- | E-153 | Incident 20:16Z: a reviewer's fixture setup ran `git commit` with the MAIN CHECKOUT as cwd, committing author `t <t@t>` "init" that replaced the real package.json with a fixture and added sum.js/sum.test.js (local only, never pushed; undone with `git reset --keep 1c96ab16`). Guard: a pre-commit hook in .githooks refusing any commit in this repository whose author email is not the repo-local identity (git config user.email) unless LOKI_ALLOW_FOREIGN_AUTHOR=1, so fixture commits made in the wrong cwd fail loudly; fixture commits in real temp repos are unaffected | .githooks/pre-commit, tests/test-pre-commit-author-guard.sh | LOW | red first: in a scratch clone with the hook installed, `git -c user.email=t@t commit` is refused; the repo identity commits | ready@2026-09-30T20:17Z | Source: loki-seal r2 review fixture (agent stopped at 20:17Z). Reviewer prompts now require `git -C "$FIXTURE"` and a pwd check under LOKI_RUN_TMP. |
482
+ | E-153 | Incident 20:16Z: a reviewer's fixture setup ran `git commit` with the MAIN CHECKOUT as cwd, committing author `t <t@t>` "init" that replaced the real package.json with a fixture and added sum.js/sum.test.js (local only, never pushed; undone with `git reset --keep 1c96ab16`). Guard: a pre-commit hook in .githooks refusing any commit in this repository whose author email is not the repo-local identity (git config user.email) unless LOKI_ALLOW_FOREIGN_AUTHOR=1, so fixture commits made in the wrong cwd fail loudly; fixture commits in real temp repos are unaffected | .githooks/pre-commit, tests/test-pre-commit-author-guard.sh | LOW | red first: in a scratch clone with the hook installed, `git -c user.email=t@t commit` is refused; the repo identity commits | merged@2026-10-01T08:51Z | Source: loki-seal r2 review fixture (agent stopped at 20:17Z). Reviewer prompts now require `git -C "$FIXTURE"` and a pwd check under LOKI_RUN_TMP. |
483
483
  | S41-10b | Static-first fixed-rules block for the implement and fix briefs (S41-10 card remainder): a byte-identical rules block in the cache-stable prefix, per-task context after it; drive-letter and ~ plan paths filtered like absolute ones | loki-ts/src/engine10/stages/implement.ts, fix.ts (prefix only), loki-ts/src/e10ext/context.ts and tests | MEDIUM | red first: two different tasks produce byte-identical prefix bytes; core net-zero lines | merged@2026-09-30T19:19Z | Source: S41-10 reviews (APPROVE r2, remainder). |
484
484
  | S41-20h | Medium-task MINING pass (no task building): shortlist 12 candidate merged PRs whose shape survives the one-file probe (a semantic or signature change in file A that an independently tested caller in file B must match; not helper extraction, parameter threading, moved classes or typing-only files), each with a written one-file-fix attempt run against the upstream tests and its result | eval/loki10/tasks/CANDIDATES.md (new) | MEDIUM | every shortlisted PR has a failing one-file attempt recorded with command and rc | merged@2026-09-30T19:19Z | Source: S41-20b/c/d/e/f: 11 of 16 candidates fell to a reviewer one-file fix; S41-20f built 0. |
485
485
  | D44-A | Green main by construction: scripts/train-promote.sh fast-forwards main only to a train SHA with green Tests, Bun Parity and Coverage; pre-push refuses a push to main unless it is Tier B green, a VERSION-only bump on a green parent, or docs-only (LOKI_D44_EMERGENCY override logged) | scripts/train-promote.sh, .githooks/pre-push, tests/test-train-promote.sh, docs/v10/TRAINS.md | HIGH | bash tests/test-train-promote.sh | parked@2026-09-30T20:04Z | Source: D44 item 1. PARKED 20:05Z by the adoption directive (docs/v10/PROGRESS.md 20:05Z); resumes after Tier 0 is green. |
@@ -604,14 +604,14 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
604
604
  | A-02 | First-run gate: scripts/first-run-gate.sh (throwaway HOME, bugrepo from firstrun-repro/bugrepo-original, the README's default entry point, stub-provider mode for CI, real-provider mode for promotion) asserting: exit 0 only if npm test fully green; no new files outside the fix except .loki/; printed receipt digest equals what loki verify checks; loki verify OK exit 0; receipt signed; output 15 lines or fewer without --verbose; wall time recorded. Step 1: reproduce each defect from the directive on current main and classify code bug vs machine artifact | scripts/first-run-gate.sh, tests/test-first-run-gate.sh, docs/v10/FIRST-RUN-GATE.md (defect table) | HIGH | gate runs in stub mode in CI as a NON-required job; the defect table cites command and rc per defect | released@2026-09-30T21:23Z | Gates `latest` (via A-01 promote). Released in v10.5.11 (merge 8641dac4 is an ancestor of v10.5.11). |
605
605
  | A-03 | Tier 0 architecture split (opus Architect): slice items 1 Seal correctness, 2 clean first run, 3 signed by default, 5 honest outcomes into non-overlapping file sets with Wall checks, one writer per file, shrink-or-flat per D33; Seal correctness builds on slice-E-125 | docs/v10/ADOPTION-PLAN.md | HIGH | every slice card has a file set, a Wall check tied to a gate assertion, and a line budget | released@2026-09-30T21:23Z | Item 4 (one engine) waits until 1 to 3 pass the gate. Released in v10.5.11 (merge 26dd66b8 is an ancestor of v10.5.11). |
606
606
  | A-04 | loki-seal: a Claude Code skill plus hook that runs the repo's real test suite on the current diff, refuses done on red or on deleted, skipped, xfailed or weakened tests or CI config (diff scan plus a tree hash of existing tests), prints a 5-line receipt; zero model cost, no dangerous flags; self-contained, no LICENSE file; SUBMIT.md drafts only; a 20-second vhs or asciinema script | packages/loki-seal/** | HIGH | fixture repos: deleting a failing test is blocked; a real fix passes; each weakening class caught | released@2026-10-01T00:52Z | Tier 1 wedge; answers issue #42. Released in v10.5.13 (merge a61e1721 is an ancestor of v10.5.13). |
607
- | A-04b | loki-seal follow-ups from opus r5: reset the hook-error counter after a successful stop; fall back to stop_hook_active repetition when the tmpdir is read-only or full; tests must write loki-seal-err-* counter files under LOKI_RUN_TMP, not the real os.tmpdir() | packages/loki-seal/** | MEDIUM | package tests plus demo dry-run; no files left in the real tmpdir after the suite | ready@2026-09-30T20:56Z | Source: A-04 opus r5 APPROVE notes. |
607
+ | A-04b | loki-seal follow-ups from opus r5: reset the hook-error counter after a successful stop; fall back to stop_hook_active repetition when the tmpdir is read-only or full; tests must write loki-seal-err-* counter files under LOKI_RUN_TMP, not the real os.tmpdir() | packages/loki-seal/** | MEDIUM | package tests plus demo dry-run; no files left in the real tmpdir after the suite | merged@2026-10-01T08:56Z | Source: A-04 opus r5 APPROVE notes. |
608
608
  | A-09 | README under 150 lines (directive item 9): line 1 "Your agent says done. Loki proves it." (veto pending, founder queue 10); line 2 "An autonomous software factory that knows what it is supposed to deliver, and proves it did." (D45); then the loki-seal 20-second GIF (placeholder until recorded), then two install lines (loki-seal first, `npx loki-mode tour` second); flags, internal paths, version stamps and app-builder comparisons move to docs; remove the commercial-editions sentence from the top and the npm total-downloads and Docker pulls badges; define "Seal" in one sentence or stop using the word; package.json description and SKILL.md description use line 2 verbatim (SKILL.md header and footer version rules still apply) | README.md, docs/ (moved sections), package.json (description only), SKILL.md (description only) | MEDIUM | README <= 150 lines; no retracted claims (directive Never list); structural checks (SKILL.md sync, readme version) pass | released@2026-10-01T00:52Z | Source: directive item 9 plus D45. Released in v10.5.13 (merge 38ffd386 is an ancestor of v10.5.13). |
609
609
  | A-04c | loki-seal reads the delivery contract (D45): from the task or issue the user gave the session (prompt text, a linked issue, a spec file), derive the acceptance checks and refuse "done" until the checks tied to that request pass, not only "the suite is green"; when no contract can be derived, say so on the receipt (NOT VERIFIED: no contract) instead of passing on green alone. Design first (how the hook sees the user request: transcript_path from the hook input, first user message), then build; zero model cost stays a constraint | packages/loki-seal/** | HIGH | fixtures: a session asking for behavior X with a green suite that never tests X is NOT VERIFIED; with a test for X passing it PASSes | ready@2026-09-30T20:59Z | Source: D45. After A-04b. |
610
610
  | A-103b | Seal lists each discarded Wall test in not_proven as "wall test discarded: <path> (<class>)" (A-103 kept seal.ts out of its file set; today only a count appears via base_run not_run) | loki-ts/src/engine10/stages/seal.ts, its test | HIGH | fixture: a discarded Wall file appears by path in not_proven | ready@2026-09-30T20:56Z | Source: A-103 builder. seal.ts writer order: after A-121 and A-104b. |
611
611
  | A-101 | Receipt canonicalization and verify help (item 1) | see docs/v10/ADOPTION-PLAN.md A-101 | HIGH | first-run-gate assertion per plan card | released@2026-09-30T21:23Z | Wave per plan section 5; one writer per file. Released in v10.5.11 (merge 5ea92836 is an ancestor of v10.5.11). |
612
612
  | A-102 | Test-runner detection: node:test plus fixtures for all six runners (item 1) | see plan A-102 | HIGH | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 0990afb8 is an ancestor of v10.5.13). |
613
613
  | A-104 | Commit only the fix (items 1 and 2, v10) | see plan A-104 | HIGH | first-run-gate assertion per plan card | released@2026-09-30T21:23Z | Wave per plan section 5; one writer per file. Released in v10.5.11 (merge d86a5817 is an ancestor of v10.5.11). |
614
- | A-104b | A-104 opus follow-ups: run the unstage reset as `git --literal-pathspecs reset` and check its rc (a path starting with `:(top)` was read as a pathspec and committed); match "manifest changed" per directory in monorepos (a stray lockfile in packages/b rode along with a packages/a manifest change); judge new lockfiles and Wall files against the run base, not HEAD, so files the agent commits during implement are also excluded | loki-ts/src/engine10/stages/seal.ts, loki-ts/tests/engine10/seal.test.ts | HIGH | fixtures for each case red first; seal-then-verify still matches | ready@2026-09-30T20:39Z | Source: A-104 opus review (APPROVE with notes). seal.ts writer order: after A-121. |
614
+ | A-104b | A-104 opus follow-ups: run the unstage reset as `git --literal-pathspecs reset` and check its rc (a path starting with `:(top)` was read as a pathspec and committed); match "manifest changed" per directory in monorepos (a stray lockfile in packages/b rode along with a packages/a manifest change); judge new lockfiles and Wall files against the run base, not HEAD, so files the agent commits during implement are also excluded | loki-ts/src/engine10/stages/seal.ts, loki-ts/tests/engine10/seal.test.ts | HIGH | fixtures for each case red first; seal-then-verify still matches | building@2026-10-01T08:44Z | Source: A-104 opus review (APPROVE with notes). seal.ts writer order: after A-121. |
615
615
  | A-120 | One signing key, auto-generated (item 3) | see plan A-120 | HIGH | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 1e1417b9 is an ancestor of v10.5.13). |
616
616
  | A-132 | Legacy: no HANDOFF.md, USAGE.md or lockfile in a fix commit (item 2) | see plan A-132 | MEDIUM | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 297c2d1f is an ancestor of v10.5.13). |
617
617
  | A-133 | Legacy: skip Council evidence probes on a trivial diff (item 2) | see plan A-133 | HIGH | first-run-gate assertion per plan card | merged@2026-09-30T21:08Z | Wave per plan section 5; one writer per file. |
@@ -634,8 +634,10 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
634
634
  | E-166 | Jira auto-sync never starts: src/integrations/sync-subscriber.js builds JiraApiClient without the required email and apiToken, so LOKI_JIRA_URL plus LOKI_JIRA_TOKEN do nothing (DOC-02 added a known-issue note to the setup docs). Fix the wiring or remove the advertised auto-sync | src/integrations/sync-subscriber.js, tests | MEDIUM | with env set, the subscriber constructs a working client (mocked API) | merged@2026-10-01T06:43Z | none |
635
635
  | P0-promote-bun | Auto-promote of 10.5.22 failed: promote.yml ran the first-run gate without bun, the installed CLI fell back to legacy, 7 v10 checks failed and the cost check crashed (IndexError). Install bun before the gate; cost check fails closed; explicit engine-fallback check | .github/workflows/promote.yml, scripts/first-run-gate.sh, tests/test-first-run-gate.sh | test-first-run-gate 56/0 incl. fallback fixture; gate --stub 0 failed | HIGH | merged@2026-10-01T07:09Z | opus CTO APPROVE 5bdfe2f8 |
636
636
  | E-167 | Gate the no-bun path end to end (CTO follow-up to P0-promote-bun): run the default entry with bun absent from PATH and assert the legacy receipt, NOT VERIFIED on a skipped target and the documented exit codes, with the legacy 15-line budget and legacy verify (the v10 leg keeps 8 lines; scripts/first-run-gate.sh:123 forces LOKI_ENGINE=v10 for verify, which is why a bun-less run failed digest, verify and signed); the promote gate currently proves only the bun path | scripts/first-run-gate.sh, tests/test-first-run-gate.sh | no-bun stub run fails closed on a skipped test; clean no-bun run reads its legacy receipt | MEDIUM | merged@2026-10-01T07:52Z | none |
637
- | E-161b | E-161 false block: the hook judges a detaching checkout by the hook cwd (the main checkout) and ignores a preceding checked cd into a linked worktree; at 07:20Z a cd into the release worktree followed by git checkout --detach was blocked (RULE8), and the release only proceeded via git -C. Resolve the effective directory from a leading checked cd or from git -C before applying RULE8 | scripts/v10-guard.sh, tests/test-v10-guard.sh | checked cd into a linked worktree then detach: allowed; cwd main with no cd: blocked; git -C linked: allowed | HIGH | ready@2026-10-01T07:22Z | none |
637
+ | E-161b | E-161 false block: the hook judges a detaching checkout by the hook cwd (the main checkout) and ignores a preceding checked cd into a linked worktree; at 07:20Z a cd into the release worktree followed by git checkout --detach was blocked (RULE8), and the release only proceeded via git -C. Resolve the effective directory from a leading checked cd or from git -C before applying RULE8 | scripts/v10-guard.sh, tests/test-v10-guard.sh | checked cd into a linked worktree then detach: allowed; cwd main with no cd: blocked; git -C linked: allowed | HIGH | merged@2026-10-01T08:31Z | none |
638
638
  | P0-nobun | D48 flip does nothing on a bun-less npm install: bin/loki falls back to legacy without bun, and loki-ts/dist/loki.js is built for target bun (node gives ReferenceError: Bun is not defined). Make the Loki 10 engine run without a preinstalled bun (node-runnable build, or bun shipped as an npm dependency) and, when neither works, say so plainly on the start line. Architect plan first | bin/loki, loki-ts/scripts/build.ts, package.json (per plan) | bun-less host runs the v10 default or prints the plain cannot-run line; promote gate no-bun leg (E-167) passes | HIGH | merged@2026-10-01T07:52Z | opus architect plan in progress |
639
+ | E-169 | Docker image and Homebrew formula use the same bun resolver as bin/loki (peer condition 3 for founder queue 17): the Docker image must contain a working bun so the default runs Loki 10; the Homebrew formula must either depend on bun or let the resolver print the plain cannot-run line | Dockerfile, Dockerfile.sandbox, the Homebrew formula (find it) | docker run of the image prints the Loki 10 start line; brew-style layout resolves bun or prints the plain line | MEDIUM | merged@2026-10-01T08:31Z | none |
640
+ | E-170 | Verify what still works after npm install --omit=optional before documenting it as a slim install: it also drops the existing @anthropic-ai optional packages (about 247MB of the measured 370MB delta). List which commands break and either document the slim path with its limits or recommend against it | package.json, docs/INSTALLATION.md | a scripted --omit=optional install runs loki --version, loki quick on the stub provider and loki verify; results recorded | LOW | ready@2026-10-01T08:19Z | measured 08:33Z on 10.5.25 (haiku): slim 30,280 KB vs full 407,656 KB; omits @anthropic-ai/claude-agent-sdk, bun, @opentelemetry/*; --version, help, doctor and quick (stub claude) reported rc 0. NOT yet documented: the report omitted the stderr evidence of the plain cannot-run line on quick; re-check that before adding the slim path to docs/INSTALLATION.md |
639
641
  | D49-auto | Auto-promote to latest on Post-Release Smoke success (founder D49) | .github/workflows/promote.yml, tests/test_release_next_tag.py | HIGH | smoke-success from Release promotes; manual smoke never promotes; not-lower guard | merged@2026-10-01T03:03Z | opus APPROVE 5510b8c8. Follow-ups (D49-auto-b): not-lower guard fails OPEN on an npm error (make it fail closed); loki-mode-sdk latest has no not-lower guard; a newer queued promote can replace a pending one in a release burst |
640
642
  | D51-A3 | Headless `loki backlog owner/repo --all/--label/--issues` plus loki.yaml (schema, validator, env overrides) | autonomy/lib/backlog.py, autonomy/lib/loki_yaml.py, autonomy/loki, schemas/loki-yaml.schema.json, tests/test-backlog.sh | HIGH | backlog 47/0 | merged@2026-10-01T03:11Z | sonnet APPROVE 14ff9ae2; follow-up D51-A3b: `loki_yaml.py show` echoes a token pasted into git.token_env (redact x-secret-ref fields); no-parser test case; re-run of a failed issue discards its kept worktree |
641
643
  | D51-A4 | Slack on the v10 path (PR opened, BLOCKED, finished), webhook from the env var named by LOKI_SLACK_WEBHOOK_ENV, URL redacted, 5s bounded post | loki-ts/src/e10ext/slack_events.ts, engine10/supervisor.ts, tests | MEDIUM | slack tests 40/0 | merged@2026-10-01T03:11Z | sonnet APPROVE adb838b2; one labelled test message after it ships |
@@ -660,6 +662,6 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
660
662
  | A-123 | Doctor: only the selected provider blocks, one Ready line (item 3) | see plan A-123 | MEDIUM | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 275b4fc0 is an ancestor of v10.5.13). |
661
663
  | A-134 | Legacy: receipt after the final commit, chatter behind --verbose (item 2) | see plan A-134 | MEDIUM | first-run-gate assertion per plan card | released@2026-10-01T00:52Z | Wave per plan section 5; one writer per file. Released in v10.5.13 (merge 7d3edf96 is an ancestor of v10.5.13). |
662
664
  | A-134b | A-134 opus notes: (1) standalone autonomy/verify.sh prints no attestation line (only `loki verify` has _deploy_receipt_verdict); print `attestation: UNCHECKED (run via loki verify)` instead of silence; (2) the quiet failure tail grep `[Ff]ailed` matched the RALPH system-prompt line and printed ~1.5k chars; anchor to `^\[(ERROR|WARN)\]` or cap line length; (3) the quiet inner run starts as a background job so its stdin is /dev/null even from a TTY: pause-mode keypress resume changes for quiet runs; (4) `loki quick --verbose` is also the A-122 cmd_quick flag, done | autonomy/verify.sh, autonomy/run.sh | MEDIUM | each note has a test | merged@2026-10-01T05:22Z | |
663
- | A-134c | A-134b r1 review finding: provider call sites in autonomy/run.sh (mainline claude -p at about 25455/25460, provider_invoke_argv about 1050/1053) do not redirect stdin, so under LOKI_VERBOSE=1 (and any non-quiet path) a parent stdin pipe that never closes blocks `claude -p` reading stdin (pre-existing). Fix: `< /dev/null` at provider invocations that pass the prompt as an argument | autonomy/run.sh (provider call sites only), providers/*.sh, tests | MEDIUM | never-closing stdin pipe: verbose `loki quick` completes under timeout 60 | ready@2026-10-01T01:37Z | |
665
+ | A-134c | A-134b r1 review finding: provider call sites in autonomy/run.sh (mainline claude -p at about 25455/25460, provider_invoke_argv about 1050/1053) do not redirect stdin, so under LOKI_VERBOSE=1 (and any non-quiet path) a parent stdin pipe that never closes blocks `claude -p` reading stdin (pre-existing). Fix: `< /dev/null` at provider invocations that pass the prompt as an argument | autonomy/run.sh (provider call sites only), providers/*.sh, tests | MEDIUM | never-closing stdin pipe: verbose `loki quick` completes under timeout 60 | merged@2026-10-01T09:00Z | |
664
666
  | A-130 | v10 quiet by default (item 2) | see plan A-130 | MEDIUM | first-run-gate assertion per plan card | released@2026-10-01T01:19Z | Wave per plan section 5; one writer per file. Released in v10.5.14 (merge a518bfea is an ancestor of v10.5.14). |
665
667
  | A-130b | A-130 Reason line prints first_error from a failing check verbatim (capped at 200 chars, control chars stripped) but unredacted: a `ghp_` token in a test failure line reaches the terminal. No TS redactor is reachable from engine10 core (only autonomy/lib/proof_redact.py). Port the token patterns to a small TS helper outside core or redact first_error where it is captured in verify | loki-ts/src (util), verify.ts or output.ts, tests | MEDIUM | ghp_/sk- token in first_error prints redacted | released@2026-10-01T02:27Z | ; sonnet APPROVE be50510f (redaction before cap, parity with proof_redact.py) Released in v10.5.16 (merge f214a0fa is an ancestor of v10.5.16). |
@@ -1795,3 +1795,15 @@ The swarm is stopped: .loki/V10-STOP exists, the loop has no wake-ups, and the c
1795
1795
  - Measured: bun adds about 62MB on macOS arm64 (published 79.5MB linux-x64, 86.1MB windows-x64); baseline builds are no smaller, so option (i).
1796
1796
  - train/46 red on ShellCheck (SC1083 in the new E-168 test); fixed e9121a89, on train/47. train/48 c7ef4b66 = everything; local: 14 checks rc=0 incl. run-shellcheck, npm ci --dry-run, gate --stub.
1797
1797
  - Next: on a green train cut 10.5.24, then re-enable promote.yml so 10.5.24 goes through both gate legs.
1798
+
1799
+ ## 2026-10-01T08:19Z v10.5.24 published; v10.5.25 (bundled bun, two-leg gate) pushed; promote RE-ENABLED
1800
+ - v10.5.24 e3b1aa6d: npm gitHead e3b1aa6dff13 matches; next=10.5.24, latest=10.5.20 (promote disabled). Contents E-165, E-168.
1801
+ - train/48 red (shard 4/8, test-modernize-dispatch.sh: stub bun exited 2 on every call, so the new _loki_bun --version probe rejected it); fix f88dd9f8 (stub answers --version); all 11 tests that stub bun rc=0. train/50 f88dd9f8 green on Tests, Bun Parity, Coverage, Security Audit, Tier A; main fast-forwarded.
1802
+ - v10.5.25 6fe04649 pushed (--check-clean rc=0, npm ci --dry-run rc=0, parent == origin/main). Ships bun 1.4.2 optionalDependency (measured 62MB macOS arm64), the _loki_bun resolver with the plain cannot-run line, and the E-167 two-leg promote gate.
1803
+ - promote.yml re-enabled at 2026-10-01T08:19Z (gh workflow list: active); origin/main promote.yml contains the --engine legacy leg. 10.5.25's own promote runs both legs. Watcher bz9g1y2jr.
1804
+
1805
+ ## 2026-10-01T08:43Z v10.5.25 on next; first two-leg promote held latest (gate text drift)
1806
+ - v10.5.25 6fe04649: npm gitHead 6fe046496abc matches; next=10.5.25, latest=10.5.20; release body 9 lines; Post-Release Smoke success.
1807
+ - promote run 36837313500 (08:35Z) failed and held latest. Leg 1 (bun): all checks PASS on the installed 10.5.25 (Loki 10 start line, 7 lines, signed receipt, skip-bare-verify rc=4). Leg 2 (no bun): every legacy check PASS (verify ok, signed, digest, 13/15 lines, skipped target rc=3 NOT VERIFIED) except legacy-fallback-line: the gate matched the pre-S2 message text. Product behaviour on both machines is correct; the gate pattern was stale.
1808
+ - Fix 4b290f31: both fallback patterns match bin/loki's current line; the gate test asserts gate and bin/loki carry the same literal (mutation red). test-first-run-gate 78/0, gate --stub rc=0. train/52 in CI with E-161b and E-169; on green cut 10.5.26, whose promote runs the fixed gate.
1809
+ - E-170 measured (slim 30,280 KB vs full 407,656 KB); slim-path docs held for the plain-line evidence.
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- var Jr=Object.create;var{getPrototypeOf:Kr,defineProperty:cG,getOwnPropertyNames:Yr}=Object;var zr=Object.prototype.hasOwnProperty;function Vr($){return this[$]}var Wr,qr,Gr=($,Z,Q)=>{var X=$!=null&&typeof $==="object";if(X){var J=Z?Wr??=new WeakMap:qr??=new WeakMap,K=J.get($);if(K)return K}Q=$!=null?Jr(Kr($)):{};let Y=Z||!$||!$.__esModule?cG(Q,"default",{value:$,enumerable:!0}):Q;for(let z of Yr($))if(!zr.call(Y,z))cG(Y,z,{get:Vr.bind($,z),enumerable:!0});if(X)J.set($,Y);return Y};var AK=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var Hr=($)=>$;function Br($,Z){this[$]=Hr.bind(null,Z)}var R0=($,Z)=>{for(var Q in Z)cG($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:Br.bind(Z,Q)})};var v=($,Z)=>()=>($&&(Z=$($=0)),Z);var x4=import.meta.require;var aT={};R0(aT,{lokiDir:()=>T0,homeLokiDir:()=>m7,findRepoRootForVersion:()=>iG,REPO_ROOT:()=>i0});import{resolve as S4,dirname as lG}from"path";import{fileURLToPath as Ur}from"url";import{existsSync as CK}from"fs";import{homedir as Or}from"os";function Nr(){let $=iT;for(let Z=0;Z<6;Z++){if(CK(S4($,"VERSION"))&&CK(S4($,"autonomy/run.sh")))return $;let Q=lG($);if(Q===$)break;$=Q}return S4(iT,"..","..","..")}function iG($){let Z=$;for(let Q=0;Q<6;Q++){if(CK(S4(Z,"VERSION"))&&CK(S4(Z,"autonomy/run.sh")))return Z;let X=lG(Z);if(X===Z)break;Z=X}return S4($,"..","..","..")}function T0(){return process.env.LOKI_DIR??S4(process.cwd(),".loki")}function m7(){return S4(Or(),".loki")}var iT,i0;var J8=v(()=>{iT=lG(Ur(import.meta.url));i0=Nr()});import{readFileSync as Mr}from"fs";import{resolve as jr,dirname as Lr}from"path";import{fileURLToPath as Ar}from"url";function b4(){if(u7!==null)return u7;let $="10.5.25";if(typeof $==="string"&&$.length>0)return u7=$,u7;try{let Z=Lr(Ar(import.meta.url)),Q=iG(Z);u7=Mr(jr(Q,"VERSION"),"utf-8").trim()}catch{u7="unknown"}return u7}var u7=null;var h$=v(()=>{J8()});var $D={};R0($D,{runOrThrow:()=>fr,run:()=>D0,readStreamCapped:()=>TK,commandVersion:()=>hr,commandExists:()=>O9,ShellError:()=>oG,MAX_STDOUT_BYTES:()=>eT});async function TK($,Z=eT){let Q=$.getReader(),X=new TextDecoder,J="",K=0;try{while(K<Z){let{done:Y,value:z}=await Q.read();if(Y)break;if(!z)continue;if(K+=z.byteLength,K>Z){let V=z.byteLength-(K-Z);J+=X.decode(z.subarray(0,V),{stream:!0});break}J+=X.decode(z,{stream:!0})}J+=X.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return J}async function D0($,Z={}){let Q=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:Z.env?{...process.env,...Z.env}:process.env,cwd:Z.cwd}),X,J;if(Z.timeoutMs&&Z.timeoutMs>0)X=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}J=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},Z.timeoutMs);try{let[K,Y,z]=await Promise.all([TK(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:K,stderr:Y,exitCode:z}}finally{if(X)clearTimeout(X);if(J)clearTimeout(J)}}async function fr($,Z={}){let Q=await D0($,Z);if(Q.exitCode!==0)throw new oG(`command failed (${Q.exitCode}): ${$.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function O9($){let Z=vr($),Q=await D0(["sh","-c",`command -v ${Z}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function vr($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function hr($,Z="--version"){if(!await O9($))return null;let X=await D0([$,Z],{timeoutMs:5000});if(X.exitCode!==0)return null;return((X.stdout||X.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var eT=16777216,oG;var J9=v(()=>{oG=class oG extends Error{message;exitCode;stdout;stderr;constructor($,Z,Q,X){super($);this.message=$;this.exitCode=Z;this.stdout=Q;this.stderr=X;this.name="ShellError"}}});function y4($){return gr?"":$}var gr,k0,P8,p0,XZ8,K8,L8,K9,c;var o5=v(()=>{gr=(process.env.NO_COLOR??"").length>0;k0=y4("\x1B[0;31m"),P8=y4("\x1B[0;32m"),p0=y4("\x1B[1;33m"),XZ8=y4("\x1B[0;34m"),K8=y4("\x1B[0;36m"),L8=y4("\x1B[1m"),K9=y4("\x1B[2m"),c=y4("\x1B[0m")});import{accessSync as nr,constants as sr,existsSync as rr,statSync as tr}from"fs";async function n5(){if(g$!==void 0)return g$;let $="/opt/homebrew/bin/python3.12";if(rr($))return g$=$,$;let Z=await O9("python3.12");if(Z)return g$=Z,Z;let Q=await O9("python3");return g$=Q,Q}async function T6($,Z={}){let Q=await n5();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return D0([Q,"-c",$],Z)}async function XD(){let $=(process.env.PATH??"").split(":").filter((Z)=>Z.startsWith("/"));for(let Z of[...$t,...$.map((Q)=>`${Q}/python3`)])try{if(!tr(Z).isFile())continue;if(nr(Z,sr.X_OK),(await D0([Z,"-I","-S","-c",""],{timeoutMs:1e4})).exitCode===0)return Z}catch{}return null}var g$,er,$t;var D6=v(()=>{J9();er=["/usr/bin/python3","/bin/python3"],$t=er});var CD={};R0(CD,{runStatus:()=>Ft});import{existsSync as Y9,readFileSync as W2,readdirSync as BD,statSync as UD}from"fs";import{resolve as u8,basename as Nt}from"path";import{homedir as Mt}from"os";function OD($){let Z=Math.trunc($);if(Z>=1e6)return`${(Math.trunc(Z/1e6*10)/10).toFixed(1)}M`;if(Z>=1000)return`${(Math.trunc(Z/1000*10)/10).toFixed(1)}K`;return String(Z)}function ND($,Z,Q){if(Z===0)return null;let X=Math.trunc($*100/Z),J=Math.trunc($*IK/Z);if(J>IK)J=IK;let K=IK-J,Y=P8;if(X>=80)Y=k0;else if(X>=50)Y=p0;let z="=".repeat(Math.max(0,J))+" ".repeat(Math.max(0,K)),V=OD($),W=OD(Z);return` ${L8}${Q}${c} ${Y}[${z}]${c} ${X}% (${V} / ${W})`}async function Lt(){if(await O9("jq"))return!0;return process.stdout.write(`${k0}Error: jq is required but not installed.${c}
2
+ var Jr=Object.create;var{getPrototypeOf:Kr,defineProperty:cG,getOwnPropertyNames:Yr}=Object;var zr=Object.prototype.hasOwnProperty;function Vr($){return this[$]}var Wr,qr,Gr=($,Z,Q)=>{var X=$!=null&&typeof $==="object";if(X){var J=Z?Wr??=new WeakMap:qr??=new WeakMap,K=J.get($);if(K)return K}Q=$!=null?Jr(Kr($)):{};let Y=Z||!$||!$.__esModule?cG(Q,"default",{value:$,enumerable:!0}):Q;for(let z of Yr($))if(!zr.call(Y,z))cG(Y,z,{get:Vr.bind($,z),enumerable:!0});if(X)J.set($,Y);return Y};var AK=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var Hr=($)=>$;function Br($,Z){this[$]=Hr.bind(null,Z)}var R0=($,Z)=>{for(var Q in Z)cG($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:Br.bind(Z,Q)})};var v=($,Z)=>()=>($&&(Z=$($=0)),Z);var x4=import.meta.require;var aT={};R0(aT,{lokiDir:()=>T0,homeLokiDir:()=>m7,findRepoRootForVersion:()=>iG,REPO_ROOT:()=>i0});import{resolve as S4,dirname as lG}from"path";import{fileURLToPath as Ur}from"url";import{existsSync as CK}from"fs";import{homedir as Or}from"os";function Nr(){let $=iT;for(let Z=0;Z<6;Z++){if(CK(S4($,"VERSION"))&&CK(S4($,"autonomy/run.sh")))return $;let Q=lG($);if(Q===$)break;$=Q}return S4(iT,"..","..","..")}function iG($){let Z=$;for(let Q=0;Q<6;Q++){if(CK(S4(Z,"VERSION"))&&CK(S4(Z,"autonomy/run.sh")))return Z;let X=lG(Z);if(X===Z)break;Z=X}return S4($,"..","..","..")}function T0(){return process.env.LOKI_DIR??S4(process.cwd(),".loki")}function m7(){return S4(Or(),".loki")}var iT,i0;var J8=v(()=>{iT=lG(Ur(import.meta.url));i0=Nr()});import{readFileSync as Mr}from"fs";import{resolve as jr,dirname as Lr}from"path";import{fileURLToPath as Ar}from"url";function b4(){if(u7!==null)return u7;let $="10.5.27";if(typeof $==="string"&&$.length>0)return u7=$,u7;try{let Z=Lr(Ar(import.meta.url)),Q=iG(Z);u7=Mr(jr(Q,"VERSION"),"utf-8").trim()}catch{u7="unknown"}return u7}var u7=null;var h$=v(()=>{J8()});var $D={};R0($D,{runOrThrow:()=>fr,run:()=>D0,readStreamCapped:()=>TK,commandVersion:()=>hr,commandExists:()=>O9,ShellError:()=>oG,MAX_STDOUT_BYTES:()=>eT});async function TK($,Z=eT){let Q=$.getReader(),X=new TextDecoder,J="",K=0;try{while(K<Z){let{done:Y,value:z}=await Q.read();if(Y)break;if(!z)continue;if(K+=z.byteLength,K>Z){let V=z.byteLength-(K-Z);J+=X.decode(z.subarray(0,V),{stream:!0});break}J+=X.decode(z,{stream:!0})}J+=X.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return J}async function D0($,Z={}){let Q=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:Z.env?{...process.env,...Z.env}:process.env,cwd:Z.cwd}),X,J;if(Z.timeoutMs&&Z.timeoutMs>0)X=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}J=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},Z.timeoutMs);try{let[K,Y,z]=await Promise.all([TK(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:K,stderr:Y,exitCode:z}}finally{if(X)clearTimeout(X);if(J)clearTimeout(J)}}async function fr($,Z={}){let Q=await D0($,Z);if(Q.exitCode!==0)throw new oG(`command failed (${Q.exitCode}): ${$.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function O9($){let Z=vr($),Q=await D0(["sh","-c",`command -v ${Z}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function vr($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function hr($,Z="--version"){if(!await O9($))return null;let X=await D0([$,Z],{timeoutMs:5000});if(X.exitCode!==0)return null;return((X.stdout||X.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var eT=16777216,oG;var J9=v(()=>{oG=class oG extends Error{message;exitCode;stdout;stderr;constructor($,Z,Q,X){super($);this.message=$;this.exitCode=Z;this.stdout=Q;this.stderr=X;this.name="ShellError"}}});function y4($){return gr?"":$}var gr,k0,P8,p0,XZ8,K8,L8,K9,c;var o5=v(()=>{gr=(process.env.NO_COLOR??"").length>0;k0=y4("\x1B[0;31m"),P8=y4("\x1B[0;32m"),p0=y4("\x1B[1;33m"),XZ8=y4("\x1B[0;34m"),K8=y4("\x1B[0;36m"),L8=y4("\x1B[1m"),K9=y4("\x1B[2m"),c=y4("\x1B[0m")});import{accessSync as nr,constants as sr,existsSync as rr,statSync as tr}from"fs";async function n5(){if(g$!==void 0)return g$;let $="/opt/homebrew/bin/python3.12";if(rr($))return g$=$,$;let Z=await O9("python3.12");if(Z)return g$=Z,Z;let Q=await O9("python3");return g$=Q,Q}async function T6($,Z={}){let Q=await n5();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return D0([Q,"-c",$],Z)}async function XD(){let $=(process.env.PATH??"").split(":").filter((Z)=>Z.startsWith("/"));for(let Z of[...$t,...$.map((Q)=>`${Q}/python3`)])try{if(!tr(Z).isFile())continue;if(nr(Z,sr.X_OK),(await D0([Z,"-I","-S","-c",""],{timeoutMs:1e4})).exitCode===0)return Z}catch{}return null}var g$,er,$t;var D6=v(()=>{J9();er=["/usr/bin/python3","/bin/python3"],$t=er});var CD={};R0(CD,{runStatus:()=>Ft});import{existsSync as Y9,readFileSync as W2,readdirSync as BD,statSync as UD}from"fs";import{resolve as u8,basename as Nt}from"path";import{homedir as Mt}from"os";function OD($){let Z=Math.trunc($);if(Z>=1e6)return`${(Math.trunc(Z/1e6*10)/10).toFixed(1)}M`;if(Z>=1000)return`${(Math.trunc(Z/1000*10)/10).toFixed(1)}K`;return String(Z)}function ND($,Z,Q){if(Z===0)return null;let X=Math.trunc($*100/Z),J=Math.trunc($*IK/Z);if(J>IK)J=IK;let K=IK-J,Y=P8;if(X>=80)Y=k0;else if(X>=50)Y=p0;let z="=".repeat(Math.max(0,J))+" ".repeat(Math.max(0,K)),V=OD($),W=OD(Z);return` ${L8}${Q}${c} ${Y}[${z}]${c} ${X}% (${V} / ${W})`}async function Lt(){if(await O9("jq"))return!0;return process.stdout.write(`${k0}Error: jq is required but not installed.${c}
3
3
  `),process.stdout.write(`Install with:
4
4
  `),process.stdout.write(` brew install jq (macOS)
5
5
  `),process.stdout.write(` apt install jq (Debian/Ubuntu)
@@ -1568,4 +1568,4 @@ Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
1568
1568
  `),2}case"start":{let{runStart:X}=await Promise.resolve().then(() => (Va(),za));return X(Q)}case"engine10":{let{runEngine10:X}=await Promise.resolve().then(() => (Ga(),qa)),{registryLoader:J}=await Promise.resolve().then(() => (zG(),ns));return X(Q,J)}default:return process.stderr.write(`Unknown command: ${Z}
1569
1569
  `),process.stderr.write(ss),2}}GD();process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var g$8=await h$8(Bun.argv.slice(2));process.exit(g$8);
1570
1570
 
1571
- //# debugId=BE51968F5E852F218D55DDF00ACF1B5F
1571
+ //# debugId=079CFBD2C9F8B0003DA5E54079C66093
package/mcp/__init__.py CHANGED
@@ -75,4 +75,4 @@ try:
75
75
  except ImportError:
76
76
  __all__ = ['mcp']
77
77
 
78
- __version__ = '10.5.25'
78
+ __version__ = '10.5.27'
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": "10.5.25",
4
+ "version": "10.5.27",
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",
@@ -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": "10.5.25",
5
+ "version": "10.5.27",
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",
@@ -130,7 +130,7 @@ provider_invoke() {
130
130
  --yes-always \
131
131
  --no-auto-commits \
132
132
  --model "$model" \
133
- $extra_flags "$@" 2>&1
133
+ $extra_flags "$@" < /dev/null 2>&1
134
134
  }
135
135
 
136
136
  # Model tier to parameter (Aider uses single model, returns model name)
@@ -385,7 +385,7 @@ provider_invoke() {
385
385
  # array is empty, and a bare "${arr[@]}" under `set -u` aborts with "unbound
386
386
  # variable" on bash 3.2 (stock macOS /bin/bash). ${arr[@]+...} expands to
387
387
  # nothing when unset/empty and preserves spaced elements otherwise.
388
- claude --dangerously-skip-permissions "${_LOKI_CLAUDE_AUTO_FLAGS[@]+"${_LOKI_CLAUDE_AUTO_FLAGS[@]}"}" -p "$prompt" "$@"
388
+ claude --dangerously-skip-permissions "${_LOKI_CLAUDE_AUTO_FLAGS[@]+"${_LOKI_CLAUDE_AUTO_FLAGS[@]}"}" -p "$prompt" "$@" < /dev/null
389
389
  }
390
390
 
391
391
  # provider_invoke_argv <tier> <prompt> -- populate _LOKI_INVOKE_ARGV with the
@@ -656,5 +656,5 @@ provider_invoke_with_tier() {
656
656
  # Guard empty auto-flag array under `set -u` on bash 3.2 (stock macOS): a bare
657
657
  # "${arr[@]}" on an empty array aborts with "unbound variable". ${arr[@]+...}
658
658
  # expands to nothing when empty and preserves spaced elements otherwise.
659
- claude --dangerously-skip-permissions --model "$model" "${_LOKI_CLAUDE_AUTO_FLAGS[@]+"${_LOKI_CLAUDE_AUTO_FLAGS[@]}"}" -p "$prompt" "$@"
659
+ claude --dangerously-skip-permissions --model "$model" "${_LOKI_CLAUDE_AUTO_FLAGS[@]+"${_LOKI_CLAUDE_AUTO_FLAGS[@]}"}" -p "$prompt" "$@" < /dev/null
660
660
  }
@@ -128,7 +128,7 @@ provider_invoke() {
128
128
  # array is empty, and a bare "${arr[@]}" under `set -u` aborts with "unbound
129
129
  # variable" on bash 3.2 (stock macOS /bin/bash). ${arr[@]+...} expands to
130
130
  # nothing when empty and preserves spaced elements otherwise.
131
- cline -y "${model_args[@]+"${model_args[@]}"}" "$prompt" "$@" 2>&1
131
+ cline -y "${model_args[@]+"${model_args[@]}"}" "$prompt" "$@" < /dev/null 2>&1
132
132
  }
133
133
 
134
134
  # Model tier to parameter (Cline uses single model, returns model name)
@@ -225,7 +225,7 @@ provider_invoke() {
225
225
  done < <(_codex_model_flag "$PROVIDER_MODEL_DEVELOPMENT")
226
226
  codex exec --sandbox workspace-write --skip-git-repo-check \
227
227
  "${model_flag[@]+"${model_flag[@]}"}" \
228
- "$prompt" "$@"
228
+ "$prompt" "$@" < /dev/null
229
229
  }
230
230
 
231
231
  # Model tier to effort level parameter (Codex uses effort, not separate models)
@@ -359,7 +359,7 @@ provider_invoke_with_tier() {
359
359
  --skip-git-repo-check \
360
360
  "${model_flag[@]+"${model_flag[@]}"}" \
361
361
  "${extra_flags[@]+"${extra_flags[@]}"}" \
362
- "$prompt" "$@"
362
+ "$prompt" "$@" < /dev/null
363
363
  }
364
364
 
365
365
  # provider_invoke_argv <tier> <prompt> -- see providers/claude.sh for the full
@@ -138,7 +138,7 @@ provider_invoke() {
138
138
  [ -n "$prompt" ] || return 1
139
139
  prompt="$PROVIDER_COMMIT_HYGIENE"$'\n\n'"$prompt"
140
140
  command -v opencode >/dev/null 2>&1 || return 127
141
- opencode run --auto --model "$PROVIDER_MODEL_DEVELOPMENT" "$prompt" "$@"
141
+ opencode run --auto --model "$PROVIDER_MODEL_DEVELOPMENT" "$prompt" "$@" < /dev/null
142
142
  }
143
143
 
144
144
  # provider_invoke_with_tier <tier> <prompt>
@@ -154,7 +154,7 @@ provider_invoke_with_tier() {
154
154
  command -v opencode >/dev/null 2>&1 || return 127
155
155
  local model
156
156
  model="$(provider_get_tier_param "$tier")"
157
- opencode run --auto --model "$model" "$prompt" "$@"
157
+ opencode run --auto --model "$model" "$prompt" "$@" < /dev/null
158
158
  }
159
159
 
160
160
  # provider_invoke_argv <tier> <prompt> -- see providers/claude.sh for rationale.
@@ -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-Bf_yp-ka.js";import{B as C}from"./Button-fW3YlMPF.js";import{T as $e}from"./trending-up-CYNQ9vY-.js";import{C as z}from"./clock-C7wfh0WZ.js";import{A as Be,U as ue,M as De}from"./Avatar-CaQtzthw.js";import{A as J}from"./activity-BwzYTinZ.js";import{R as pe}from"./refresh-cw-CiKOB-AH.js";import{G as ze}from"./globe-CQs61CBR.js";import{C as Le}from"./chevron-left-CJB72p7S.js";import{C as je}from"./check-BkUbott-.js";import{D as Y}from"./dollar-sign-C1GC_4Gf.js";import{U as Te}from"./user-MOQxScJS.js";import{D as Me}from"./database-6uWPD9SM.js";import{L as Ue}from"./lock-CHVfJ2Ec.js";import{S as Re}from"./scroll-text-BkVFxR9Q.js";import{S as Ie}from"./shield-alert-DD6z7kMY.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-BaYJTUS-.js";import{B as C}from"./Button-2CyndOs-.js";import{T as $e}from"./trending-up-BoFNcyTk.js";import{C as z}from"./clock-06MLkRVl.js";import{A as Be,U as ue,M as De}from"./Avatar-DZrFNNs1.js";import{A as J}from"./activity-C6h86DPU.js";import{R as pe}from"./refresh-cw-sHIiSn3J.js";import{G as ze}from"./globe-B0kl7VhM.js";import{C as Le}from"./chevron-left-FQWSntqn.js";import{C as je}from"./check-DzLHbeXy.js";import{D as Y}from"./dollar-sign-BNU6A7jW.js";import{U as Te}from"./user-BDuP1Dzn.js";import{D as Me}from"./database-6E7lagq-.js";import{L as Ue}from"./lock-B8t9Fr9B.js";import{S as Re}from"./scroll-text-Dmt3YJma.js";import{S as Ie}from"./shield-alert-NjEOZ7rp.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-Bf_yp-ka.js";/**
1
+ import{c as l,j as s}from"./index-BaYJTUS-.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-Bf_yp-ka.js";import{C as r}from"./clock-C7wfh0WZ.js";import{C as a}from"./circle-alert-ZkCFp9P0.js";import{C as l}from"./check-BkUbott-.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-BaYJTUS-.js";import{C as r}from"./clock-06MLkRVl.js";import{C as a}from"./circle-alert-D0JjWKvh.js";import{C as l}from"./check-DzLHbeXy.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-Bf_yp-ka.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-BaYJTUS-.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-Bf_yp-ka.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-B5WNaTbp.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-pw5NDACS.js";import{C as oe}from"./check-BkUbott-.js";import{C as Ye}from"./clock-C7wfh0WZ.js";import{D as Xe}from"./dollar-sign-C1GC_4Gf.js";import{U as Ze}from"./upload-Blr76ubG.js";import{L as V}from"./loader-circle-BfVRhTkt.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-BaYJTUS-.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-3cBCDGNQ.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--YuSwG.js";import{C as oe}from"./check-DzLHbeXy.js";import{C as Ye}from"./clock-06MLkRVl.js";import{D as Xe}from"./dollar-sign-BNU6A7jW.js";import{U as Ze}from"./upload-tPtabajO.js";import{L as V}from"./loader-circle-DbNBntUa.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-Bf_yp-ka.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-BaYJTUS-.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-Bf_yp-ka.js";/**
1
+ import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-BaYJTUS-.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-Bf_yp-ka.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.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-BaYJTUS-.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.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-Bf_yp-ka.js";import{B as N}from"./Button-fW3YlMPF.js";import{C as y}from"./thumbs-up-pw5NDACS.js";import{R as S}from"./refresh-cw-CiKOB-AH.js";import{C as z}from"./circle-alert-ZkCFp9P0.js";import{U as D}from"./user-MOQxScJS.js";import{L as G}from"./loader-circle-BfVRhTkt.js";import{R as T}from"./rotate-ccw-BqyKlVyu.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-BaYJTUS-.js";import{B as N}from"./Button-2CyndOs-.js";import{C as y}from"./thumbs-up-D--YuSwG.js";import{R as S}from"./refresh-cw-sHIiSn3J.js";import{C as z}from"./circle-alert-D0JjWKvh.js";import{U as D}from"./user-BDuP1Dzn.js";import{L as G}from"./loader-circle-DbNBntUa.js";import{R as T}from"./rotate-ccw-CuKMcQlw.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-Bf_yp-ka.js";import{B as y}from"./Button-fW3YlMPF.js";import{C as ge}from"./chevron-left-CJB72p7S.js";import{G as P}from"./thumbs-up-pw5NDACS.js";import{R as $}from"./refresh-cw-CiKOB-AH.js";import{C as Ne}from"./circle-alert-ZkCFp9P0.js";import{L as Q,S as je}from"./ProjectPage-Chlxfsb1.js";import{S as se}from"./shield-alert-DD6z7kMY.js";import{F as ye}from"./file-code-corner-XiJnJDoy.js";import{C as V}from"./clock-C7wfh0WZ.js";import{C as re}from"./check-BkUbott-.js";import"./ErrorBoundary-B5WNaTbp.js";import"./TerminalOutput-Dl7F0H0d.js";import"./lock-CHVfJ2Ec.js";import"./package-DpVxPE51.js";import"./file-plus-BaN2vTKi.js";import"./activity-BwzYTinZ.js";import"./scroll-text-BkVFxR9Q.js";import"./bot-D0QOEr2j.js";import"./loader-circle-BfVRhTkt.js";import"./hammer-9VgifcL2.js";import"./dollar-sign-C1GC_4Gf.js";import"./globe-CQs61CBR.js";import"./trash-2-BSh9aztG.js";import"./upload-Blr76ubG.js";import"./plus-BvPWfH2l.js";import"./rotate-ccw-BqyKlVyu.js";import"./code-xml-D4Bknj7L.js";import"./trending-up-CYNQ9vY-.js";import"./layers-D4Vw8Mbi.js";import"./trending-down-Cqo5izHb.js";import"./server-gXecxW5O.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-BaYJTUS-.js";import{B as y}from"./Button-2CyndOs-.js";import{C as ge}from"./chevron-left-FQWSntqn.js";import{G as P}from"./thumbs-up-D--YuSwG.js";import{R as $}from"./refresh-cw-sHIiSn3J.js";import{C as Ne}from"./circle-alert-D0JjWKvh.js";import{L as Q,S as je}from"./ProjectPage-CgjjhiZJ.js";import{S as se}from"./shield-alert-NjEOZ7rp.js";import{F as ye}from"./file-code-corner-BAK-Pwza.js";import{C as V}from"./clock-06MLkRVl.js";import{C as re}from"./check-DzLHbeXy.js";import"./ErrorBoundary-3cBCDGNQ.js";import"./TerminalOutput-CzkoqeUF.js";import"./lock-B8t9Fr9B.js";import"./package-KRaBLXTm.js";import"./file-plus-CbFPGeNa.js";import"./activity-C6h86DPU.js";import"./scroll-text-Dmt3YJma.js";import"./bot-BhQSd5JG.js";import"./loader-circle-DbNBntUa.js";import"./hammer-DlFwJHcr.js";import"./dollar-sign-BNU6A7jW.js";import"./globe-B0kl7VhM.js";import"./trash-2-CdN_0YZm.js";import"./upload-tPtabajO.js";import"./plus-BBbF97rg.js";import"./rotate-ccw-CuKMcQlw.js";import"./code-xml-B5VKlV99.js";import"./trending-up-BoFNcyTk.js";import"./layers-OdYlYYru.js";import"./trending-down-SEofhOe8.js";import"./server-CeR3mHcb.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.