loki-mode 11.17.33 → 11.17.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/dashboard/__init__.py +1 -1
  4. package/docs/CLI-REFERENCE.md +1 -1
  5. package/docs/INSTALLATION.md +1 -1
  6. package/docs/v10/BOARD.md +25 -0
  7. package/docs/v10/PROGRESS.md +3 -0
  8. package/loki-ts/dist/loki.js +3 -3
  9. package/mcp/__init__.py +1 -1
  10. package/package.json +2 -2
  11. package/packages/control-plane/dist/server.js +2 -1
  12. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  13. package/web-app/dist/assets/{AdminPage-4ynuEkJ7.js → AdminPage-o3gtaCnU.js} +1 -1
  14. package/web-app/dist/assets/{Avatar-juKRXN3K.js → Avatar-C02t-Irl.js} +1 -1
  15. package/web-app/dist/assets/{Badge-ELiKdSrz.js → Badge-BuN80MKq.js} +1 -1
  16. package/web-app/dist/assets/{Button-DE9YSmx7.js → Button-lPXsKVcs.js} +1 -1
  17. package/web-app/dist/assets/{CockpitPage-CCqgPVyp.js → CockpitPage-8CNxkZSh.js} +1 -1
  18. package/web-app/dist/assets/{ComparePage-rRH4wJQm.js → ComparePage-j-XhFiwH.js} +1 -1
  19. package/web-app/dist/assets/{ErrorBoundary-CBrbj1HN.js → ErrorBoundary-D8nyc_y_.js} +1 -1
  20. package/web-app/dist/assets/{EvidenceReceiptPanel-Dkcrhywj.js → EvidenceReceiptPanel-DtTSMxZm.js} +1 -1
  21. package/web-app/dist/assets/{GitHubIssuesPanel-BSkqJ5nd.js → GitHubIssuesPanel-Bzmm3gBY.js} +1 -1
  22. package/web-app/dist/assets/{GitHubPRsPanel-DOaWPiNJ.js → GitHubPRsPanel-Dh6vSHLE.js} +1 -1
  23. package/web-app/dist/assets/{HomePage-BpPrilU-.js → HomePage-CKKPOMOg.js} +2 -2
  24. package/web-app/dist/assets/{LoginPage-fPzLFY40.js → LoginPage-49FrYkL9.js} +1 -1
  25. package/web-app/dist/assets/{MagicPage-Bh1sqG8h.js → MagicPage-D5psAu69.js} +1 -1
  26. package/web-app/dist/assets/{MetricsPage-gjVliC41.js → MetricsPage-oQXV5q4J.js} +1 -1
  27. package/web-app/dist/assets/{NotFoundPage-B5qyOg3n.js → NotFoundPage-C2hj6k1f.js} +1 -1
  28. package/web-app/dist/assets/{ProjectPage-C0FHZR1Y.js → ProjectPage-Bo8ocjwn.js} +3 -3
  29. package/web-app/dist/assets/{ProjectsPage-C_J3ibAg.js → ProjectsPage-QUhbz991.js} +1 -1
  30. package/web-app/dist/assets/{SettingsPage-bQ1Zb61E.js → SettingsPage-6XW8I3LO.js} +1 -1
  31. package/web-app/dist/assets/{ShowcasePage-DX0qD_vX.js → ShowcasePage-9CHGu9uW.js} +1 -1
  32. package/web-app/dist/assets/{SystemSettingsPage-Dncd-bIj.js → SystemSettingsPage-gZZK7T45.js} +1 -1
  33. package/web-app/dist/assets/{TeamsPage-K6BKsNpC.js → TeamsPage-DSlKvZhA.js} +1 -1
  34. package/web-app/dist/assets/{TemplatesPage-ZAUjMfXz.js → TemplatesPage-BVDR5mF2.js} +1 -1
  35. package/web-app/dist/assets/{TerminalOutput-Cj8n1UzX.js → TerminalOutput-DnOFdmTG.js} +1 -1
  36. package/web-app/dist/assets/{activity-ne5hNxSa.js → activity-D22UFJWA.js} +1 -1
  37. package/web-app/dist/assets/{bell-BdITCu0J.js → bell-B2Mfgp26.js} +1 -1
  38. package/web-app/dist/assets/{bot-CzmG61D-.js → bot-CTXo6aac.js} +1 -1
  39. package/web-app/dist/assets/{check-DAy71jvU.js → check-D9kJod1H.js} +1 -1
  40. package/web-app/dist/assets/{chevron-left-t7osreJx.js → chevron-left-XI4pnrlY.js} +1 -1
  41. package/web-app/dist/assets/{circle-alert-BStykHw8.js → circle-alert-CvS3mi0t.js} +1 -1
  42. package/web-app/dist/assets/{clock-nx62hSC-.js → clock-CCgwQ80p.js} +1 -1
  43. package/web-app/dist/assets/{cloud-CeGVr0g-.js → cloud-S-SuEsEp.js} +1 -1
  44. package/web-app/dist/assets/{code-xml-HAPTB7-9.js → code-xml-PRnhUKWP.js} +1 -1
  45. package/web-app/dist/assets/{database-BYgeRx98.js → database-C_a7H_3N.js} +1 -1
  46. package/web-app/dist/assets/{dollar-sign-DOIJQqTW.js → dollar-sign-FDCzdLrB.js} +1 -1
  47. package/web-app/dist/assets/{file-code-corner-CJHq-cpn.js → file-code-corner-28-hDPSO.js} +1 -1
  48. package/web-app/dist/assets/{file-plus-PE379Z5c.js → file-plus-c0yygSC8.js} +1 -1
  49. package/web-app/dist/assets/{globe-D181kc57.js → globe-DOA9Y_1n.js} +1 -1
  50. package/web-app/dist/assets/{hammer-BQk0g3Ab.js → hammer-Omzy4vB3.js} +1 -1
  51. package/web-app/dist/assets/{index-CLhSjoBh.js → index-Dp6emuTo.js} +3 -3
  52. package/web-app/dist/assets/{layers-hj0pkPL2.js → layers-D7ZjWXJQ.js} +1 -1
  53. package/web-app/dist/assets/{loader-circle-B7sx3o8C.js → loader-circle-CJ2SKm0h.js} +1 -1
  54. package/web-app/dist/assets/{lock-3nX2Pu9P.js → lock-HKmv1nIN.js} +1 -1
  55. package/web-app/dist/assets/{package-7HPfkZKJ.js → package-FQl71HNO.js} +1 -1
  56. package/web-app/dist/assets/{plus-C-MZSrv0.js → plus-DY8mlU6I.js} +1 -1
  57. package/web-app/dist/assets/{refresh-cw-DBxi9oLT.js → refresh-cw-CJ_pkRQQ.js} +1 -1
  58. package/web-app/dist/assets/{rotate-ccw-C7aSRLsF.js → rotate-ccw-rGU_udZ1.js} +1 -1
  59. package/web-app/dist/assets/{scroll-text-CjgmRj7v.js → scroll-text-CeVAfOXM.js} +1 -1
  60. package/web-app/dist/assets/{server-Dp1cfmIM.js → server-D-N_u9OT.js} +1 -1
  61. package/web-app/dist/assets/{shield-alert-OES4hyVW.js → shield-alert-CJfx3HCX.js} +1 -1
  62. package/web-app/dist/assets/{thumbs-up-BGzVyv37.js → thumbs-up-BrC-E9mS.js} +1 -1
  63. package/web-app/dist/assets/{trash-2-BQhaTD1Q.js → trash-2-Bb3mW1oq.js} +1 -1
  64. package/web-app/dist/assets/{trending-down-BBCWxu1B.js → trending-down-CrgUJZLA.js} +1 -1
  65. package/web-app/dist/assets/{trending-up-zbFMeMKJ.js → trending-up-Dk_GS57K.js} +1 -1
  66. package/web-app/dist/assets/{upload-DLMVf5KF.js → upload-BAxHyFqH.js} +1 -1
  67. package/web-app/dist/assets/{usePolling-oXUouV0R.js → usePolling-CkTdc2YU.js} +1 -1
  68. package/web-app/dist/assets/{user-CL_i_mfr.js → user-Dr6XCReg.js} +1 -1
  69. package/web-app/dist/index.html +1 -1
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: An autonomous software factory that knows what it is supposed to deliver, and proves it did. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
4
4
  ---
5
5
 
6
- # Loki Mode v11.17.33
6
+ # Loki Mode v11.17.34
7
7
 
8
8
  **Current entry points (Loki 10 engine):** `loki "<task>"`, `loki owner/repo#N` and `loki quick "<task>"` run the Loki 10 engine and end with a signed receipt (`loki verify`). `loki backlog owner/repo --all` runs many issues in parallel. Guide: `docs/v10/GUIDE.md`. The skill instructions below, and `loki start`, describe the previous bash loop. PRD-file starts (`loki start ./prd.md`) and the opencode provider still run on it until FC38-SWEEP ports them; the legacy-engine command and the LOKI_ENGINE switch remain removed. Prefer `loki owner/repo#N` for issues.
9
9
 
@@ -483,4 +483,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
483
483
 
484
484
  ---
485
485
 
486
- **v11.17.33 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
486
+ **v11.17.34 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.17.33
1
+ 11.17.34
@@ -7,6 +7,6 @@ Modules:
7
7
  control: Session control helpers (status, atomic writes, origin check)
8
8
  """
9
9
 
10
- __version__ = "11.17.33"
10
+ __version__ = "11.17.34"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -1,6 +1,6 @@
1
1
  # CLI reference
2
2
 
3
- Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.33. Do not edit by hand.
3
+ Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.17.34. Do not edit by hand.
4
4
  Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for the full inventory.
5
5
 
6
6
  | Command | Description |
@@ -2,7 +2,7 @@
2
2
 
3
3
  Loki Mode, by [Autonomi](https://www.autonomi.dev/), turns a spec or an issue into a verified pull request with a receipt you can check. This page covers installing it, a first run, and the options around it.
4
4
 
5
- **Version:** v11.17.33
5
+ **Version:** v11.17.34
6
6
 
7
7
  **Engine note:** `loki start` is the primary command. `loki start`, `loki "<task>"`, `loki owner/repo#N` and `loki quick` all run the Loki 10 engine, whatever the flag order or input form (PRD file, issue ref, task or one-word brief). The previous loop runs only on `--engine legacy`, `LOKI_ENGINE=legacy`, or for one call when a flag Loki 10 cannot honor is present. See the [user guide](v10/GUIDE.md) and the [5-minute quickstart](QUICKSTART.md).
8
8
 
package/docs/v10/BOARD.md CHANGED
@@ -1125,3 +1125,28 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
1125
1125
  | TEN-QUALITY-11 | enhancement: a Python repo with uv.lock and no .venv runs tests and lint through uv run as the project interpreter | loki-ts/src/engine10/stages/verify.ts (resolveTool only, at most 3 core lines), loki-ts/tests/engine10/verify.test.ts | MEDIUM | red: uv.lock repo without .venv gets interpreter system and 'tests ran on the system interpreter' NOT PROVEN (verify.ts:43,339); green: interpreter project via uv run; no uv on PATH keeps today's system result | ready@2026-10-17T05:54Z | goal: avoid a false PARTIAL for uv projects; verify.ts has no uv handling today |
1126
1126
  | TEN-QUALITY-12 | enhancement: repo map cap configurable (LOKI_E10_REPOMAP_MAX_FILES) and truncation drops vendored or generated dirs before source | loki-ts/src/engine10/repomap.ts (at most 3 core lines), loki-ts/tests/engine10/repomap.test.ts | LOW | red: 2500-file repo with 1500 vendor/ files maps mostly vendor and ignores the env knob; green: knob honored, vendor/ node_modules dist dropped first, default 2000 unchanged | ready@2026-10-17T05:54Z | goal: plan context quality on large repos; complements TEN-QUALITY-10 with no shared file |
1127
1127
  | TEN-DEPLOY-04-F1 | register --badge in dispatcher route, help, registry and completions | loki-ts/src/commands/run_status.ts, registry.ts, cli.ts, autonomy/loki, help-core.sh, completions | LOW | help-changelog drift and completions coverage pass; removing the route line turns the status test red | released@2026-10-17T05:34Z v11.17.24 | TL APPROVE 50579a177 |
1128
+ | TEN-COST-11-F1 | enhancement: direct test for the machine.ts wall-stage distrust call (TEN-COST-11 review follow-up) | loki-ts/tests/engine10/machine.test.ts | LOW | wall base run green while implement changed files must yield already_satisfied false and base_run unproven; red mutation: delete the distrustGreenBase call at machine.ts:221 turns the test red; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/machine.test.ts | ready@2026-10-17T07:00Z | goal: pin the fail-closed branch (machine.ts:221) that has no direct test; test only, no src change |
1129
+ | TEN-COST-28 | feature: per-stage share of spend printed in the cost summary (plan, wall, implement, fix, xreview) with the top stage named | loki-ts/src/engine10/cost.ts, loki-ts/tests/engine10/cost.test.ts | MEDIUM | red: summary shows only a total; green: stage shares sum to 100 percent, unmetered stages say unmetered not 0; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/cost.test.ts | ready@2026-10-17T07:00Z | goal: make the 2x cost proof attributable; grep cost.ts for an existing by-stage field first |
1130
+ | TEN-COST-29 | enhancement: flag a cache-cold stage (cache read under 30 percent of input) with one line in the cost breakdown | loki-ts/src/util/cost_breakdown.ts, loki-ts/tests/engine10/cost_unmetered.test.ts | LOW | red: a stage with 5 percent cache reads prints no hint; green: one 'cache cold: <stage>' line, none when all stages are warm or unmetered; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/cost_unmetered.test.ts | ready@2026-10-17T07:00Z | goal: surface the biggest cost lever (prefix cache hit) per run |
1131
+ | TEN-COST-30 | fix: an unknown cost.profile value in loki.yaml or --cost (for example 'leen') warns once and names the valid profiles instead of silently using default | loki-ts/src/util/cost_profile.ts, loki-ts/tests/util/cost_profile.test.ts | MEDIUM | red: 'leen' resolves to default with no message; green: one stderr warning naming lean and default, valid values unchanged and quiet mode keeps stdout clean; cd loki-ts && bunx tsc --noEmit && bun test tests/util/cost_profile.test.ts | ready@2026-10-17T07:00Z | goal: a typo must not forfeit the cost win silently; follows TEN-COST-27 |
1132
+ | TEN-SPEED-03 | feature: run summary Time line names the slowest stage and its share of wall time | loki-ts/src/util/run_summary.ts, loki-ts/tests/util/run_summary.test.ts | LOW | red: Time line has total only; green: 'slowest: <stage> NN%' appended, omitted when stage durations are missing; cd loki-ts && bunx tsc --noEmit && bun test tests/util/run_summary.test.ts | ready@2026-10-17T07:00Z | goal: speed work needs a visible per-run bottleneck |
1133
+ | TEN-SPEED-04 | enhancement: repo map and test map reused across fix rounds when the git tree hash is unchanged | loki-ts/src/engine10/cache.ts, loki-ts/tests/engine10/cache.test.ts | MEDIUM | red: second fix round rebuilds the map with identical tree; green: cache hit counted, miss when tree hash differs; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/cache.test.ts | ready@2026-10-17T07:00Z | goal: cut seconds per fix round; read cache.ts key first and skip if the tree hash is already in the key |
1134
+ | TEN-SPEED-05 | fix: back-to-back loki start runs reuse a successful claude login probe for 10 minutes instead of re-spawning the CLI every time | loki-ts/src/engine10/preflight.ts, loki-ts/tests/engine10/preflight.test.ts | MEDIUM | red: two starts inside 10 min spawn the probe twice; green: second reuses the result, a failed probe is never cached, TTL expiry re-probes; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/preflight.test.ts | ready@2026-10-17T07:00Z | goal: shave start latency without hiding a logged-out state |
1135
+ | TEN-QUALITY-13 | feature: cross-review (xreview) prompt carries the intent card Acceptance lines and the verdict names any line left unmet | loki-ts/src/engine10/stages/xreview.ts, loki-ts/tests/engine10/xreview.test.ts | MEDIUM | red: reviewer prompt omits acceptance lines; green: prompt includes them, verdict lists unmet lines, absent card keeps today's prompt byte-identical; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/xreview.test.ts | ready@2026-10-17T07:00Z | goal: review checks what the user asked, not only the diff |
1136
+ | TEN-QUALITY-14 | enhancement: Wall authoring prompt requires one negative-case assertion (rejects bad input or fails before the fix) per acceptance line | loki-ts/src/engine10/stages/wall.ts, loki-ts/tests/engine10/wall.test.ts | MEDIUM | red: prompt has no negative-case rule; green: rule present, prompt size growth under 400 chars, existing wall tests green; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/wall.test.ts | ready@2026-10-17T07:00Z | goal: stronger Wall checks reject wrong implementations; wall.ts line budget applies (shrink-or-flat) |
1137
+ | TEN-QUALITY-15 | fix: fix rounds stop retrying the same model when the failing test set is identical two rounds in a row and escalate once | loki-ts/src/engine10/stages/fix.ts, loki-ts/tests/engine10/fix.test.ts | MEDIUM | red: identical failure signature loops on the same model to the round cap; green: escalates once then stops with a stalled reason; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/fix.test.ts | ready@2026-10-17T07:00Z | goal: stop wasted fix spend; grep stallClimb in unit_model.ts and reuse it, do not duplicate |
1138
+ | TEN-GATES-14 | feature: loki verify --explain lists each gate with exogenous or agent-influenced and the evidence it read | loki-ts/src/engine10/verify_cmd.ts, loki-ts/tests/engine10/verify_cmd.test.ts | HIGH | red: --explain is an unknown flag; green: one line per gate, exit code unchanged, --json carries the same fields; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/verify_cmd.test.ts | ready@2026-10-17T07:00Z | goal: make the moat legible to buyers; read-only output, no verdict change |
1139
+ | TEN-GATES-15 | enhancement: Seal receipt records the seeded-defect corpus version and catch rate used for the ablation gate | loki-ts/src/engine10/stages/seal.ts, loki-ts/tests/engine10/seal_verify_roundtrip.test.ts | HIGH | red: receipt lacks corpus id; green: corpus version and rate in the signed payload and loki verify rejects a tampered value; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/seal_verify_roundtrip.test.ts | ready@2026-10-17T07:00Z | goal: tie the load-bearing claim to evidence; builds on TEN-GATES-12/13 (released) |
1140
+ | TEN-GATES-16 | fix: loki verify reports DRIFT, not OK, when HEAD moved after the seal and the changed paths overlap the sealed diff | loki-ts/src/util/seal_drift.ts, loki-ts/tests/engine10/log_seal.test.ts | HIGH | red: sealed run then an amend on a sealed path still verifies OK; green: DRIFT with the path named, unrelated commits keep OK; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/log_seal.test.ts | ready@2026-10-17T07:00Z | goal: a seal must not vouch for code it did not see; read seal_drift.ts first and extend it |
1141
+ | TEN-UX-13 | feature: loki undo --dry-run prints the diffstat it would revert and changes nothing | loki-ts/src/commands/undo.ts, loki-ts/tests/commands/undo.test.ts | LOW | red: --dry-run unknown or applies the revert; green: diffstat printed, tree and HEAD unchanged, exit 0; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/undo.test.ts | ready@2026-10-17T07:00Z | goal: safe undo; new test file because no existing test owns undo.ts (rollback.test.ts covers rollback.ts only) |
1142
+ | TEN-UX-14 | enhancement: loki queue list shows age and status columns and a count footer | loki-ts/src/commands/queue.ts, loki-ts/tests/commands/queue.test.ts | LOW | red: list prints ids only; green: id, age, status columns and 'N queued' footer, empty queue prints a next step; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/queue.test.ts | ready@2026-10-17T07:00Z | goal: queue is inspectable at a glance |
1143
+ | TEN-UX-15 | fix: shell completions list flags added after the completion table was written (--probe, --badge, --cost) from the registry | loki-ts/src/commands/completion.ts, loki-ts/tests/commands/cli_help_routes.test.ts | LOW | red: completion output lacks a registered flag; green: every flag in registry.ts appears for its command; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/cli_help_routes.test.ts | ready@2026-10-17T07:00Z | goal: no hand-maintained drift; derive from registry |
1144
+ | TEN-ADOPTION-11 | feature: loki trust prints a copyable README badge snippet for the last sealed run | loki-ts/src/commands/trust.ts, loki-ts/tests/commands/trust.test.ts | MEDIUM | red: no snippet; green: markdown snippet pointing at the verified badge, absent when no sealed run (prints the next step); cd loki-ts && bunx tsc --noEmit && bun test tests/commands/trust.test.ts | ready@2026-10-17T07:00Z | goal: every sealed repo advertises Loki; reuse the TEN-DEPLOY-04 badge output |
1145
+ | TEN-ADOPTION-12 | enhancement: after an upgrade the next loki start prints a one-line what-is-new once | loki-ts/src/util/update_check.ts, loki-ts/tests/util/update_check.test.ts | LOW | red: no notice after version change; green: one line once per version, none in quiet or CI mode; cd loki-ts && bunx tsc --noEmit && bun test tests/util/update_check.test.ts | ready@2026-10-17T07:00Z | goal: retention; no network call added |
1146
+ | TEN-DEPLOY-11 | feature: loki rollback prints the provider rollback command (names only, no secrets) for the last deploy record | loki-ts/src/commands/rollback.ts, loki-ts/tests/commands/rollback.test.ts | MEDIUM | red: rollback ignores deploy records; green: prints provider command from the record, nothing when no record, no env values; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/rollback.test.ts | ready@2026-10-17T07:00Z | goal: complete the deploy loop; read-only, never executes the provider command |
1147
+ | TEN-DEPLOY-12 | fix: loki status --probe retries once after 5 seconds before reporting a regression, so a cold start is not a false alarm | loki-ts/src/commands/status.ts, loki-ts/tests/commands/status.test.ts | MEDIUM | red: first 503 then 200 exits non-zero; green: retry passes exit 0, two failures exit non-zero, retry visible in output; cd loki-ts && bunx tsc --noEmit && bun test tests/commands/status.test.ts | ready@2026-10-17T07:00Z | goal: stop false regressions; depends on TEN-DEPLOY-10 (released v11.17.33) |
1148
+ | TEN-STABILITY-11 | enhancement: run_pid detects a reused PID by comparing process start time and treats it as dead | loki-ts/src/util/run_pid.ts, loki-ts/tests/engine10/run_pid.test.ts | MEDIUM | red: unrelated live process with the recorded PID blocks a new run; green: start-time mismatch treated as stale; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/run_pid.test.ts | ready@2026-10-17T07:00Z | goal: no phantom lock after reboot; never kill by name or pattern |
1149
+ | TEN-STABILITY-12 | fix: a truncated outbox entry left by a crash is quarantined and skipped, not fatal to the next start | loki-ts/src/util/outbox.ts, loki-ts/tests/util/outbox.test.ts | MEDIUM | red: half-written JSON entry throws on drain; green: entry moved to a quarantine name, the rest drain, one warning printed; cd loki-ts && bunx tsc --noEmit && bun test tests/util/outbox.test.ts | ready@2026-10-17T07:00Z | goal: crash-safe delivery |
1150
+ | TEN-SECURITY-01 | feature: the pre-PR secure scan also matches provider keys (sk-ant, AIza, xox[bp]-, ghp_) in added lines and blocks with the file and line | loki-ts/src/util/secure_scan.ts, loki-ts/tests/util/secure_scan.test.ts | HIGH | red: fixture with a runtime-built sk-ant key passes the scan; green: blocked naming file:line without echoing the secret, clean diff passes; cd loki-ts && bunx tsc --noEmit && bun test tests/util/secure_scan.test.ts | ready@2026-10-17T07:00Z | goal: no leaked key in a Loki PR; fixtures build keys at runtime (gitleaks rule); grep first, extend patterns only |
1151
+ | TEN-SECURITY-02 | fix: redact() strips URL userinfo (https://user:pass@host) and Authorization headers from logged and receipted output | loki-ts/src/util/redact.ts, loki-ts/tests/util/redact.test.ts | HIGH | red: https://u:p@host survives redact; green: userinfo replaced, plain URLs and existing redactions unchanged; cd loki-ts && bunx tsc --noEmit && bun test tests/util/redact.test.ts | ready@2026-10-17T07:00Z | goal: close a credential-in-log path; new test file because no existing test owns redact.ts |
1152
+ | TEN-GATES-17 | fix: a pre-existing test file the run edited must not count as agent-independent proof for loki verify --require-exogenous (reviewer finding on the n-key fix: status M edits keep provenance exogenous) | loki-ts/src/util/check_result.ts, loki-ts/tests/engine10/seal.test.ts | HIGH | red: a sealed run whose only passing check is a test file the run modified (status M, assertions weakened or replaced) passes --require-exogenous with rc 0; green: that check is advisory and --require-exogenous exits 4 while an untouched exogenous test still counts; cd loki-ts && bunx tsc --noEmit && bun test tests/engine10/seal.test.ts tests/engine10/verify_cmd.test.ts tests/engine10/budget.test.ts | ready@2026-10-17T06:55Z | Source: HIGH review of c958f563c. Grep checkProvenance and the A-119 edit rule first; decide whether to reuse the weakened-test detector instead of a blanket M rule, so legit test fixes stay exogenous. Record the call in DECISIONS.md if it changes D104. |
@@ -2479,3 +2479,6 @@ v11.17.21 published (Release success on 462fbc40a; npm latest 11.17.21, next 11.
2479
2479
 
2480
2480
  ## 2026-10-17T06:42Z (CoS) v11.17.33
2481
2481
  - Wave W 9 of 9 and wave AB 7 of 7 approved. 16 merged; GATES-02 needed a hand-merge of a DECISIONS.md append conflict. Smoke on combined main (bun test seal, implement, doctor, spawn_env_guard, budget): 213 pass, 2 fail (seal e2e verifyMain rc 4, doctor UX-04 shim e2e). P0 fix-forward agent dispatched under D96.
2482
+
2483
+ ## 2026-10-17T06:50Z (CoS) v11.17.34
2484
+ - P0 fix-forward: seal.test roundtrip red root-caused to checksOf dropping n (TEN-GATES-03-F1 interaction); HIGH reviewer APPROVE c958f563c with revert-red 90/2 and 226 pass 0 fail across seal, roundtrip, verify_cmd, budget, spawn_env_guard. Cherry-picked (parent was the pre-amend release commit). Doctor red was stale dist. PO refill e9d9b63c8 added 24 rows; TEN-GATES-17 added from the review's remaining forgery path.
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- var Jw0=Object.create;var{getPrototypeOf:Xw0,defineProperty:YW,getOwnPropertyNames:Vd,getOwnPropertyDescriptor:Yw0}=Object,Gd=Object.prototype.hasOwnProperty;function Hd(Z){return this[Z]}var Qw0,zw0,Ww0=(Z,$,J)=>{var X=Z!=null&&typeof Z==="object";if(X){var Y=$?Qw0??=new WeakMap:zw0??=new WeakMap,Q=Y.get(Z);if(Q)return Q}J=Z!=null?Jw0(Xw0(Z)):{};let z=$||!Z||!Z.__esModule?YW(J,"default",{value:Z,enumerable:!0}):J;for(let W of Vd(Z))if(!Gd.call(z,W))YW(z,W,{get:Hd.bind(Z,W),enumerable:!0});if(X)Y.set(Z,z);return z},Kw0=(Z)=>{var $=(Kd??=new WeakMap).get(Z),J;if($)return $;if($=YW({},"__esModule",{value:!0}),Z&&typeof Z==="object"||typeof Z==="function"){for(var X of Vd(Z))if(!Gd.call($,X))YW($,X,{get:Hd.bind(Z,X),enumerable:!(J=Yw0(Z,X))||J.enumerable})}return Kd.set(Z,$),$},Kd,qB=(Z,$)=>()=>($||Z(($={exports:{}}).exports,$),$.exports);var Vw0=(Z)=>Z;function Gw0(Z,$){this[Z]=Vw0.bind(null,$)}var O0=(Z,$)=>{for(var J in $)YW(Z,J,{get:$[J],enumerable:!0,configurable:!0,set:Gw0.bind($,J)})};var S=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var g9=import.meta.require;var Ud={};O0(Ud,{lokiDir:()=>E0,homeLokiDir:()=>l2,findRepoRootForVersion:()=>ST,REPO_ROOT:()=>j0});import{resolve as o3,dirname as xT}from"path";import{fileURLToPath as Hw0}from"url";import{existsSync as UB}from"fs";import{homedir as qw0}from"os";function Uw0(){let Z=qd;for(let $=0;$<6;$++){if(UB(o3(Z,"VERSION"))&&UB(o3(Z,"autonomy/run.sh")))return Z;let J=xT(Z);if(J===Z)break;Z=J}return o3(qd,"..","..","..")}function ST(Z){let $=Z;for(let J=0;J<6;J++){if(UB(o3($,"VERSION"))&&UB(o3($,"autonomy/run.sh")))return $;let X=xT($);if(X===$)break;$=X}return o3(Z,"..","..","..")}function E0(){return process.env.LOKI_DIR??o3(process.cwd(),".loki")}function l2(){return o3(qw0(),".loki")}var qd,j0;var n0=S(()=>{qd=xT(Hw0(import.meta.url));j0=Uw0()});import{readFileSync as Bw0}from"fs";import{resolve as Nw0,dirname as Mw0}from"path";import{fileURLToPath as Ow0}from"url";function X6(){if(n$!==null)return n$;let Z="11.17.33";if(typeof Z==="string"&&Z.length>0)return n$=Z,n$;try{let $=Mw0(Ow0(import.meta.url)),J=ST($);n$=Bw0(Nw0(J,"VERSION"),"utf-8").trim()}catch{n$="unknown"}return n$}var n$=null;var n3=S(()=>{n0()});import{mkdirSync as Aw0,readFileSync as Nd,realpathSync as Lw0,statSync as jw0,writeFileSync as Fw0}from"fs";import{dirname as bT,join as Bd,resolve as Cw0}from"path";function Rw0(){return Cw0(l2(),"cache","update-check.json")}function jX(Z){let $=/^(\d+)\.(\d+)\.(\d+)$/.exec(Z.trim());if(!$)return null;return[Number($[1]),Number($[2]),Number($[3])]}function BB(Z,$){let J=jX(Z),X=jX($);if(!J||!X)return!1;let[Y,Q,z]=J,[W,K,V]=X;if(Y!==W)return Y>W;if(Q!==K)return Q>K;return z>V}function Ew0(){if(process.env.LOKI_NO_UPDATE_CHECK==="1")return!0;if(process.env.CI)return!0;if(!process.stdout.isTTY)return!0;return!1}function Dw0(Z){try{let $=Nd(Z,"utf-8"),J=JSON.parse($);if(typeof J.checkedAt==="number"&&typeof J.latest==="string"&&jX(J.latest)!==null)return{checkedAt:J.checkedAt,latest:J.latest}}catch{}return null}function ww0(Z,$){try{Aw0(bT(Z),{recursive:!0}),Fw0(Z,JSON.stringify($),"utf-8")}catch{}}async function _w0(){try{let Z=await fetch(Iw0,{signal:AbortSignal.timeout(Pw0),headers:{accept:"application/json"}});if(!Z.ok)return null;let $=await Z.json();if(typeof $.version==="string"&&jX($.version)!==null)return $.version}catch{}return null}async function kw0(Z=Date.now(),$=_w0,J=Rw0()){let X=Dw0(J);if(X&&Z-X.checkedAt<Tw0)return X.latest;let Y=await $();if(Y===null)return null;return ww0(J,{checkedAt:Z,latest:Y}),Y}function xw0(Z,$=process.env){if(jX(Z)===null)return null;let X=$.PATH;if(!X)return null;let Y=new Set;for(let Q of X.split(":")){if(!Q)continue;let z=Bd(Q,"loki"),W;try{jw0(z),W=Lw0(z)}catch{continue}if(Y.has(W))continue;Y.add(W);try{let K=Bd(bT(bT(W)),"package.json"),V=JSON.parse(Nd(K,"utf8")).version;if(typeof V!=="string")continue;if(BB(V,Z))return{path:z,version:V}}catch{continue}}return null}async function Md(Z,$={}){try{if(Ew0())return;if(jX(Z)===null)return;let J=$.write??((Q)=>process.stderr.write(Q)),X=xw0(Z,$.env??process.env);if(X!==null){J(`Loki Mode ${X.version} is installed but not the one running (you are running ${Z}).
2
+ var Jw0=Object.create;var{getPrototypeOf:Xw0,defineProperty:YW,getOwnPropertyNames:Vd,getOwnPropertyDescriptor:Yw0}=Object,Gd=Object.prototype.hasOwnProperty;function Hd(Z){return this[Z]}var Qw0,zw0,Ww0=(Z,$,J)=>{var X=Z!=null&&typeof Z==="object";if(X){var Y=$?Qw0??=new WeakMap:zw0??=new WeakMap,Q=Y.get(Z);if(Q)return Q}J=Z!=null?Jw0(Xw0(Z)):{};let z=$||!Z||!Z.__esModule?YW(J,"default",{value:Z,enumerable:!0}):J;for(let W of Vd(Z))if(!Gd.call(z,W))YW(z,W,{get:Hd.bind(Z,W),enumerable:!0});if(X)Y.set(Z,z);return z},Kw0=(Z)=>{var $=(Kd??=new WeakMap).get(Z),J;if($)return $;if($=YW({},"__esModule",{value:!0}),Z&&typeof Z==="object"||typeof Z==="function"){for(var X of Vd(Z))if(!Gd.call($,X))YW($,X,{get:Hd.bind(Z,X),enumerable:!(J=Yw0(Z,X))||J.enumerable})}return Kd.set(Z,$),$},Kd,qB=(Z,$)=>()=>($||Z(($={exports:{}}).exports,$),$.exports);var Vw0=(Z)=>Z;function Gw0(Z,$){this[Z]=Vw0.bind(null,$)}var O0=(Z,$)=>{for(var J in $)YW(Z,J,{get:$[J],enumerable:!0,configurable:!0,set:Gw0.bind($,J)})};var S=(Z,$)=>()=>(Z&&($=Z(Z=0)),$);var g9=import.meta.require;var Ud={};O0(Ud,{lokiDir:()=>E0,homeLokiDir:()=>l2,findRepoRootForVersion:()=>ST,REPO_ROOT:()=>j0});import{resolve as o3,dirname as xT}from"path";import{fileURLToPath as Hw0}from"url";import{existsSync as UB}from"fs";import{homedir as qw0}from"os";function Uw0(){let Z=qd;for(let $=0;$<6;$++){if(UB(o3(Z,"VERSION"))&&UB(o3(Z,"autonomy/run.sh")))return Z;let J=xT(Z);if(J===Z)break;Z=J}return o3(qd,"..","..","..")}function ST(Z){let $=Z;for(let J=0;J<6;J++){if(UB(o3($,"VERSION"))&&UB(o3($,"autonomy/run.sh")))return $;let X=xT($);if(X===$)break;$=X}return o3(Z,"..","..","..")}function E0(){return process.env.LOKI_DIR??o3(process.cwd(),".loki")}function l2(){return o3(qw0(),".loki")}var qd,j0;var n0=S(()=>{qd=xT(Hw0(import.meta.url));j0=Uw0()});import{readFileSync as Bw0}from"fs";import{resolve as Nw0,dirname as Mw0}from"path";import{fileURLToPath as Ow0}from"url";function X6(){if(n$!==null)return n$;let Z="11.17.34";if(typeof Z==="string"&&Z.length>0)return n$=Z,n$;try{let $=Mw0(Ow0(import.meta.url)),J=ST($);n$=Bw0(Nw0(J,"VERSION"),"utf-8").trim()}catch{n$="unknown"}return n$}var n$=null;var n3=S(()=>{n0()});import{mkdirSync as Aw0,readFileSync as Nd,realpathSync as Lw0,statSync as jw0,writeFileSync as Fw0}from"fs";import{dirname as bT,join as Bd,resolve as Cw0}from"path";function Rw0(){return Cw0(l2(),"cache","update-check.json")}function jX(Z){let $=/^(\d+)\.(\d+)\.(\d+)$/.exec(Z.trim());if(!$)return null;return[Number($[1]),Number($[2]),Number($[3])]}function BB(Z,$){let J=jX(Z),X=jX($);if(!J||!X)return!1;let[Y,Q,z]=J,[W,K,V]=X;if(Y!==W)return Y>W;if(Q!==K)return Q>K;return z>V}function Ew0(){if(process.env.LOKI_NO_UPDATE_CHECK==="1")return!0;if(process.env.CI)return!0;if(!process.stdout.isTTY)return!0;return!1}function Dw0(Z){try{let $=Nd(Z,"utf-8"),J=JSON.parse($);if(typeof J.checkedAt==="number"&&typeof J.latest==="string"&&jX(J.latest)!==null)return{checkedAt:J.checkedAt,latest:J.latest}}catch{}return null}function ww0(Z,$){try{Aw0(bT(Z),{recursive:!0}),Fw0(Z,JSON.stringify($),"utf-8")}catch{}}async function _w0(){try{let Z=await fetch(Iw0,{signal:AbortSignal.timeout(Pw0),headers:{accept:"application/json"}});if(!Z.ok)return null;let $=await Z.json();if(typeof $.version==="string"&&jX($.version)!==null)return $.version}catch{}return null}async function kw0(Z=Date.now(),$=_w0,J=Rw0()){let X=Dw0(J);if(X&&Z-X.checkedAt<Tw0)return X.latest;let Y=await $();if(Y===null)return null;return ww0(J,{checkedAt:Z,latest:Y}),Y}function xw0(Z,$=process.env){if(jX(Z)===null)return null;let X=$.PATH;if(!X)return null;let Y=new Set;for(let Q of X.split(":")){if(!Q)continue;let z=Bd(Q,"loki"),W;try{jw0(z),W=Lw0(z)}catch{continue}if(Y.has(W))continue;Y.add(W);try{let K=Bd(bT(bT(W)),"package.json"),V=JSON.parse(Nd(K,"utf8")).version;if(typeof V!=="string")continue;if(BB(V,Z))return{path:z,version:V}}catch{continue}}return null}async function Md(Z,$={}){try{if(Ew0())return;if(jX(Z)===null)return;let J=$.write??((Q)=>process.stderr.write(Q)),X=xw0(Z,$.env??process.env);if(X!==null){J(`Loki Mode ${X.version} is installed but not the one running (you are running ${Z}).
3
3
  Another loki earlier on PATH is winning. Newer copy: ${X.path}
4
4
  Run \`which -a loki\` to see the order, then remove or re-point the earlier entry.
5
5
  `);return}let Y=await kw0($.now,$.fetcher,$.cacheFile);if(Y===null)return;if(!BB(Y,Z))return;J(`A newer Loki Mode is available: ${Y} (you have ${Z}). Update: bun install -g loki-mode (or npm i -g loki-mode)
@@ -816,7 +816,7 @@ print(json.dumps(m.extract_bound_requirement_units(sys.stdin.read())))`,J],{inpu
816
816
  ${X}`;if(Z==="npm"){if(J===0){let z=/"?(\d{4}-\d\d-\d\dT[\d:.]+Z)"?/.exec(X);return z?{status:"exists",firstPublish:Date.parse(z[1])}:{status:"exists"}}return/E404|404 Not Found|is not in this registry/i.test(Q)?{status:"missing"}:{status:"unproven"}}if(Z==="pypi"){if(J===0)return/Available versions/i.test(X)?{status:"exists"}:{status:"unproven"};return/No matching distribution|from versions: none/i.test(Q)?{status:"missing"}:{status:"unproven"}}if(Z==="cargo"){if(J!==0)return{status:"unproven"};let z=(W)=>W.toLowerCase().replace(/_/g,"-");return X.split(`
817
817
  `).some((W)=>z(W).startsWith(`${z($)} = `))?{status:"exists"}:{status:"missing"}}if(Z==="go"){if(J===0)return{status:"exists"};return/no matching versions|not found|404|410/i.test(Q)&&!/dial tcp|timeout|no such host|connection/i.test(Q)?{status:"missing"}:{status:"unproven"}}return{status:"unproven"}}function cd8(Z,$,J,X={},Y=""){let Q=J.HOME??"",z=(...W)=>W.filter((K)=>K!=="").map((K)=>pd8(K));if(Z==="npm"){if(CK0([J.npm_config_registry??"",J.NPM_CONFIG_REGISTRY??""]))return!0;return z(h4($,".npmrc"),Q?h4(Q,".npmrc"):"").some((W)=>W.split(`
818
818
  `).some((K)=>{let V=/^\s*(?:(@[^:\s]+):)?registry\s*=\s*(\S+)/.exec(K);return!!V&&Cj(V[2])&&(V[1]===void 0||Y.startsWith(`${V[1]}/`))}))}if(Z==="pypi"){if(CK0([J.PIP_INDEX_URL??"",J.PIP_EXTRA_INDEX_URL??""]))return!0;let W=[J.PIP_CONFIG_FILE??"",Q?h4(Q,".config","pip","pip.conf"):"",Q?h4(Q,".pip","pip.conf"):"",h4($,"pip.conf")];return z(...W).some((K)=>K.split(`
819
- `).some((V)=>{let G=/^\s*(?:extra-)?index-url\s*[=:]\s*(.+)$/.exec(V);return!!G&&G[1].split(/\s+/).some(Cj)}))}if(Z==="cargo"){if(Object.keys(J).some((W)=>/^CARGO_REGISTRIES_.+_INDEX$/.test(W)||/^CARGO_SOURCE_/.test(W)))return!0;return z(h4($,".cargo","config.toml"),h4($,".cargo","config"),Q?h4(Q,".cargo","config.toml"):"",Q?h4(Q,".cargo","config"):"").some((W)=>/^\s*\[(registries\.|source\.)/m.test(W)||/replace-with\s*=/.test(W))}if(Z==="go")return(X.GOPROXY??J.GOPROXY??"").split(/[,|]/).map((K)=>K.trim()).filter((K)=>K&&K!=="direct"&&K!=="off").some(Cj);return!1}function dd8(Z,$){if(Z.ecosystem!=="go")return!1;let J=`${$.GOPRIVATE??""},${$.GONOPROXY??""}`.split(",").map((Y)=>Y.trim()).filter(Boolean),X=Z.name.split("/");return J.some((Y)=>{let Q=Y.split("/").length;return new RegExp(`^${Y.split("/").map((W)=>W.replace(/[.+^${}()|\\[\]]/g,"\\$&").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")).join("/")}$`).test(X.slice(0,Q).join("/"))})}async function ld8(Z){try{let $=await y0(["go","env","-json","GOPRIVATE","GONOPROXY","GOPROXY"],{cwd:Z,timeoutMs:1e4}),J=JSON.parse($.stdout);return Object.fromEntries(Object.entries(J).map(([X,Y])=>[X,String(Y)]))}catch{return{}}}async function wK0(Z,$,J,X,Y={}){let Q={block:null,notProven:[],blocked:!1};if(!xd8(X))return Q;let z=$.filter(bd8);if(z.length===0)return Q;let W=Y.resolver??IK0??gd8,K=Y.now??Date.now(),V=Sd8(X),G=Y.goEnv??(J.deps.some((M)=>M.ecosystem==="go")&&!Y.resolver&&!IK0?await ld8(Z):{}),H=[],q=!1;if(J.problem)H.push(`supply guard NOT PROVEN: ${J.problem}`);if(J.deps.length===0){if(!J.problem)H.push(`supply guard WARNING: dependencies changed (${[...new Set(z)].slice(0,5).join(", ")}) but none declared; not checked`);return{block:{guard:"v2",warn_age_days:Fj,fail_age_days:V,declared:0,entries:[]},notProven:H,blocked:!1}}let U=fd8(Z),B=new Map,N=0,O=[];for(let M of J.deps){let L={ecosystem:M.ecosystem,name:M.name,version_spec:M.version_spec,registry:M.registry};if(!["npm","pypi","cargo","go"].includes(M.ecosystem)){O.push({...L,status:"unsupported"});continue}if(U.has(M.name)){O.push({...L,status:"allowlisted"});continue}if(++N>FK0){O.push({...L,status:"capped"});continue}let j=`${M.ecosystem}:${M.name}`,F=B.get(j);if(!F)F=W(M,Z,X).catch(()=>({status:"unproven"})),B.set(j,F);let I=await F;if(I.status==="missing"&&(cd8(M.ecosystem,Z,X,G,M.name)||dd8(M,{...X,...G})))I={status:"unproven"};if(I.status==="missing")O.push({...L,status:"nonexistent"});else if(I.status==="unproven")O.push({...L,status:"unreachable"});else if(I.firstPublish===void 0||!Number.isFinite(I.firstPublish))O.push({...L,status:"ok"});else{let T=Math.floor((K-I.firstPublish)/_d8);O.push({...L,status:T<Fj||V!==null&&T<V?"too_new":"ok",age_days:T})}}for(let M of O){let L=`${M.ecosystem}:${M.name}`;if(M.status==="nonexistent")q=!0,H.push(`supply guard FAILED: declared dependency ${L} does not resolve in the registry (possible hallucinated package)`);else if(M.status==="too_new")if(V!==null&&(M.age_days??0)<V)q=!0,H.push(`supply guard FAILED: ${L} first published ${M.age_days} days ago (LOKI_SUPPLY_MIN_AGE_DAYS=${V}); allowlist in .loki/supply-allowlist to accept`);else H.push(`supply guard WARNING: ${L} first published ${M.age_days} days ago (under ${Fj}); verdict unchanged`);else if(M.status==="unreachable")H.push(`supply guard NOT PROVEN: resolver could not answer for ${L}`);else if(M.status==="capped")H.push(`supply guard: not checked: cap ${FK0} exceeded: ${L}`);else if(M.status==="unsupported")H.push(`supply guard: not checked (ecosystem unsupported in v1): ${L}`);else if(M.status==="allowlisted")H.push(`supply guard: allowlisted, not checked: ${L}`)}return{block:{guard:"v2",warn_age_days:Fj,fail_age_days:V,declared:J.deps.length,entries:O},notProven:H,blocked:q}}var Fj=7,Dd8="supply-declared.json",FK0=50,wd8=200,RK0=65536,_d8=86400000,kd8,yd8,vd8,gd8=async(Z,$)=>{let X={npm:["npm","view",Z.name,"time.created","--json"],pypi:["pip","index","versions","--pre","--ignore-requires-python",Z.name],cargo:["cargo","search",Z.name,"--limit","5"],go:["go","list","-m","-json",`${Z.name}@latest`]}[Z.ecosystem];if(!X||Z.name.startsWith("-"))return{status:"unproven"};try{let Y=await y0(X,{cwd:$,timeoutMs:1e4});return hd8(Z.ecosystem,Z.name,Y.exitCode,Y.stdout,Y.stderr)}catch{return{status:"unproven"}}},md8,ud8=(Z)=>Z.trim().toLowerCase().replace(/^[a-z][a-z0-9+.-]*:\/\//,"").replace(/^www\./,"").split(/[/?#\s]/)[0].replace(/^[^@]*@/,"").replace(/:\d+$/,""),Cj=(Z)=>/[a-z0-9]/i.test(Z)&&!md8.has(ud8(Z)),pd8=(Z)=>{try{return PK0(Z).size<=RK0?Gy(Z,"utf8"):""}catch{return""}},CK0=(Z)=>Z.some(($)=>$.split(/\s+/).some((J)=>J!==""&&Cj(J))),IK0=null;var _K0=S(()=>{N9();kd8=/^(package\.json|package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|pnpm-lock\.yaml|bun\.lockb?|requirements.*\.txt|pyproject\.toml|poetry\.lock|uv\.lock|Pipfile|Pipfile\.lock|go\.mod|go\.sum|Cargo\.toml|Cargo\.lock|Gemfile|Gemfile\.lock|composer\.json|composer\.lock|pom\.xml|build\.gradle(\.kts)?)$/;yd8={npm:"npm",node:"npm",pypi:"pypi",pip:"pypi",python:"pypi",cargo:"cargo",crates:"cargo",go:"go",golang:"go"},vd8=/^[A-Za-z0-9@][A-Za-z0-9@._/~+-]{0,213}$/;md8=new Set(["registry.npmjs.org","registry.npmjs.com","registry.yarnpkg.com","npmjs.com","npmjs.org","pypi.org","pypi.python.org","files.pythonhosted.org","crates.io","index.crates.io","static.crates.io","proxy.golang.org","golang.org","pkg.go.dev"])});var qy={};O0(qy,{wallGreenOnBaseOf:()=>tL,verdictOf:()=>vK0,targetProofOf:()=>fK0,stage:()=>Xl8,signReceipt:()=>y4,sha256:()=>A7,sealStage:()=>gK0,renderReceiptMd:()=>hK0,receiptSha256:()=>xQ,loadSigningKey:()=>u6,kidOf:()=>O6,commitStage:()=>Hy,canonicalJson:()=>i5,SIGNING_UNAVAILABLE:()=>SK0,DEEP_NOT_PROVEN:()=>xK0,AGENT_ONLY_REASON:()=>bK0});import{createHash as ad8}from"crypto";import{existsSync as id8,readdirSync as od8,mkdirSync as nd8,readFileSync as sd8,writeFileSync as kK0}from"fs";import{basename as rd8,isAbsolute as td8,join as X$,relative as ed8}from"path";function yK0(Z){let $=Z.replace(/[\x00-\x1f\x7f]+/g," ").trim();return($.length>500?`${$.slice(0,500)}...`:$).replace(/`/g,"'")}function xQ(Z){let{verification:$,receipt_sha256:J,...X}=Z;return A7(i5(X))}async function C2(Z,$,J={}){let X=await K9(Z.repoDir,$,{timeoutMs:20000,...J});return{out:X.stdout,code:X.exitCode}}function vK0(Z,$,J,X,Y,Q,z=!1,W=[]){let K=Z.implement?.exit;if(Z.commit?.failed!==!0&&n5(Z.commit?.not_proven).length===0&&(Z.intake?.already_satisfied===!0||Y||K==="already_done"))return Q?"ALREADY_SATISFIED":"PARTIAL";if(K==="spec_conflict")return"SPEC_CONFLICT";if(Z.commit?.failed===!0||n5(Z.commit?.not_proven).length>0)return"FAILED";if(J)return"FAILED";if(K==="killed")return typeof Z.implement?.limit_s==="number"&&z&&W.length===0&&Q&&!X&&$.length>0&&$.every((V)=>V.result==="pass")?"VERIFIED":"PARTIAL";if(typeof Z.implement?.limit_s==="number")return"PARTIAL";if($.some((V)=>V.result==="fail"))return"FAILED";if(K==="killed"||$.length===0||$.some((V)=>V.result!=="pass")||X||!Q)return"PARTIAL";return"VERIFIED"}function fK0(Z){let $=new Set(n5(Z?.target_checks));return(Array.isArray(Z?.checks)?Z.checks:[]).some((X)=>$.has(String(X.name))&&tV([X]))}function Jl8(Z,$){if(!Array.isArray(Z))return[];return Z.filter((J)=>!!J&&typeof J==="object").map((J)=>({name:String(J.name??""),cmd:String(J.cmd??""),result:J.result==="pass"||J.result==="fail"?J.result:"not_run",duration_s:typeof J.duration_s==="number"?J.duration_s:0,provenance:ix(String(J.name??""),$)}))}function hK0(Z){let $=Z.verification.jwt?`SIGNED (kid ${Z.verification.kid})`:"UNSIGNED",J=(z)=>`- ${z.result}: ${z.name} (\`${z.cmd}\`, ${z.duration_s}s)`,X=(z,W)=>[z,...W.length?W.map(J):["- none"]],Y=(z)=>z.provenance==="exogenous"||z.provenance==="independent",Q=Z.cost.usd!==null?`$${Z.cost.usd.toFixed(4)}`:Z.cost.measured_sessions>0?`partial: $${Z.cost.partial_usd.toFixed(4)} for ${Z.cost.measured_sessions} of ${Z.cost.total_sessions} sessions`:"not measured";return[`## Loki receipt: ${Z.verdict}`,"",...Z.verdict==="SPEC_CONFLICT"&&Z.spec_conflict_reason?[`- Reason: \`${Z.spec_conflict_reason}\``]:[],`- Run: ${Z.run_id}`,`- Base: ${Z.base_sha} Head: ${Z.head_sha}`,`- receipt_sha256: ${Z.receipt_sha256}`,`- Signature: ${$}`,`- Provider: ${Z.provider} (${Z.model}) Cost: ${Q} Wall: ${Z.time.wall_s}s (stages) Total to seal: ${o8.time?.reconciled(Z.time)??"NOT RECORDED"}${(o8.time?.reconciled(Z.time)??null)===null?"":"s"}`,...Z.cost.tokens_measured?[`- Tokens: partial: ${Z.cost.input_tokens} input / ${Z.cost.output_tokens} output for ${Z.cost.tokens_measured.k} of ${Z.cost.tokens_measured.n} sessions`]:[],...Z.mutation_proof?[`- ${Z.mutation_proof}`]:[],...Z.route?T10(Z.route):[],"",...Z.checks.some((z)=>z.provenance!==void 0)?[...X("### Agent-independent checks",Z.checks.filter(Y)),"",...X("### Agent-authored / advisory checks",Z.checks.filter((z)=>!Y(z)))]:X("### Checks",Z.checks),"",...Z.evidence.length?["### Evidence (already-satisfied)",...Z.evidence.map((z)=>`- ${z}`),""]:[],"### NOT PROVEN",...Z.not_proven.map((z)=>`- ${yK0(z)}`),""].join(`
819
+ `).some((V)=>{let G=/^\s*(?:extra-)?index-url\s*[=:]\s*(.+)$/.exec(V);return!!G&&G[1].split(/\s+/).some(Cj)}))}if(Z==="cargo"){if(Object.keys(J).some((W)=>/^CARGO_REGISTRIES_.+_INDEX$/.test(W)||/^CARGO_SOURCE_/.test(W)))return!0;return z(h4($,".cargo","config.toml"),h4($,".cargo","config"),Q?h4(Q,".cargo","config.toml"):"",Q?h4(Q,".cargo","config"):"").some((W)=>/^\s*\[(registries\.|source\.)/m.test(W)||/replace-with\s*=/.test(W))}if(Z==="go")return(X.GOPROXY??J.GOPROXY??"").split(/[,|]/).map((K)=>K.trim()).filter((K)=>K&&K!=="direct"&&K!=="off").some(Cj);return!1}function dd8(Z,$){if(Z.ecosystem!=="go")return!1;let J=`${$.GOPRIVATE??""},${$.GONOPROXY??""}`.split(",").map((Y)=>Y.trim()).filter(Boolean),X=Z.name.split("/");return J.some((Y)=>{let Q=Y.split("/").length;return new RegExp(`^${Y.split("/").map((W)=>W.replace(/[.+^${}()|\\[\]]/g,"\\$&").replace(/\*/g,"[^/]*").replace(/\?/g,"[^/]")).join("/")}$`).test(X.slice(0,Q).join("/"))})}async function ld8(Z){try{let $=await y0(["go","env","-json","GOPRIVATE","GONOPROXY","GOPROXY"],{cwd:Z,timeoutMs:1e4}),J=JSON.parse($.stdout);return Object.fromEntries(Object.entries(J).map(([X,Y])=>[X,String(Y)]))}catch{return{}}}async function wK0(Z,$,J,X,Y={}){let Q={block:null,notProven:[],blocked:!1};if(!xd8(X))return Q;let z=$.filter(bd8);if(z.length===0)return Q;let W=Y.resolver??IK0??gd8,K=Y.now??Date.now(),V=Sd8(X),G=Y.goEnv??(J.deps.some((M)=>M.ecosystem==="go")&&!Y.resolver&&!IK0?await ld8(Z):{}),H=[],q=!1;if(J.problem)H.push(`supply guard NOT PROVEN: ${J.problem}`);if(J.deps.length===0){if(!J.problem)H.push(`supply guard WARNING: dependencies changed (${[...new Set(z)].slice(0,5).join(", ")}) but none declared; not checked`);return{block:{guard:"v2",warn_age_days:Fj,fail_age_days:V,declared:0,entries:[]},notProven:H,blocked:!1}}let U=fd8(Z),B=new Map,N=0,O=[];for(let M of J.deps){let L={ecosystem:M.ecosystem,name:M.name,version_spec:M.version_spec,registry:M.registry};if(!["npm","pypi","cargo","go"].includes(M.ecosystem)){O.push({...L,status:"unsupported"});continue}if(U.has(M.name)){O.push({...L,status:"allowlisted"});continue}if(++N>FK0){O.push({...L,status:"capped"});continue}let j=`${M.ecosystem}:${M.name}`,F=B.get(j);if(!F)F=W(M,Z,X).catch(()=>({status:"unproven"})),B.set(j,F);let I=await F;if(I.status==="missing"&&(cd8(M.ecosystem,Z,X,G,M.name)||dd8(M,{...X,...G})))I={status:"unproven"};if(I.status==="missing")O.push({...L,status:"nonexistent"});else if(I.status==="unproven")O.push({...L,status:"unreachable"});else if(I.firstPublish===void 0||!Number.isFinite(I.firstPublish))O.push({...L,status:"ok"});else{let T=Math.floor((K-I.firstPublish)/_d8);O.push({...L,status:T<Fj||V!==null&&T<V?"too_new":"ok",age_days:T})}}for(let M of O){let L=`${M.ecosystem}:${M.name}`;if(M.status==="nonexistent")q=!0,H.push(`supply guard FAILED: declared dependency ${L} does not resolve in the registry (possible hallucinated package)`);else if(M.status==="too_new")if(V!==null&&(M.age_days??0)<V)q=!0,H.push(`supply guard FAILED: ${L} first published ${M.age_days} days ago (LOKI_SUPPLY_MIN_AGE_DAYS=${V}); allowlist in .loki/supply-allowlist to accept`);else H.push(`supply guard WARNING: ${L} first published ${M.age_days} days ago (under ${Fj}); verdict unchanged`);else if(M.status==="unreachable")H.push(`supply guard NOT PROVEN: resolver could not answer for ${L}`);else if(M.status==="capped")H.push(`supply guard: not checked: cap ${FK0} exceeded: ${L}`);else if(M.status==="unsupported")H.push(`supply guard: not checked (ecosystem unsupported in v1): ${L}`);else if(M.status==="allowlisted")H.push(`supply guard: allowlisted, not checked: ${L}`)}return{block:{guard:"v2",warn_age_days:Fj,fail_age_days:V,declared:J.deps.length,entries:O},notProven:H,blocked:q}}var Fj=7,Dd8="supply-declared.json",FK0=50,wd8=200,RK0=65536,_d8=86400000,kd8,yd8,vd8,gd8=async(Z,$)=>{let X={npm:["npm","view",Z.name,"time.created","--json"],pypi:["pip","index","versions","--pre","--ignore-requires-python",Z.name],cargo:["cargo","search",Z.name,"--limit","5"],go:["go","list","-m","-json",`${Z.name}@latest`]}[Z.ecosystem];if(!X||Z.name.startsWith("-"))return{status:"unproven"};try{let Y=await y0(X,{cwd:$,timeoutMs:1e4});return hd8(Z.ecosystem,Z.name,Y.exitCode,Y.stdout,Y.stderr)}catch{return{status:"unproven"}}},md8,ud8=(Z)=>Z.trim().toLowerCase().replace(/^[a-z][a-z0-9+.-]*:\/\//,"").replace(/^www\./,"").split(/[/?#\s]/)[0].replace(/^[^@]*@/,"").replace(/:\d+$/,""),Cj=(Z)=>/[a-z0-9]/i.test(Z)&&!md8.has(ud8(Z)),pd8=(Z)=>{try{return PK0(Z).size<=RK0?Gy(Z,"utf8"):""}catch{return""}},CK0=(Z)=>Z.some(($)=>$.split(/\s+/).some((J)=>J!==""&&Cj(J))),IK0=null;var _K0=S(()=>{N9();kd8=/^(package\.json|package-lock\.json|npm-shrinkwrap\.json|yarn\.lock|pnpm-lock\.yaml|bun\.lockb?|requirements.*\.txt|pyproject\.toml|poetry\.lock|uv\.lock|Pipfile|Pipfile\.lock|go\.mod|go\.sum|Cargo\.toml|Cargo\.lock|Gemfile|Gemfile\.lock|composer\.json|composer\.lock|pom\.xml|build\.gradle(\.kts)?)$/;yd8={npm:"npm",node:"npm",pypi:"pypi",pip:"pypi",python:"pypi",cargo:"cargo",crates:"cargo",go:"go",golang:"go"},vd8=/^[A-Za-z0-9@][A-Za-z0-9@._/~+-]{0,213}$/;md8=new Set(["registry.npmjs.org","registry.npmjs.com","registry.yarnpkg.com","npmjs.com","npmjs.org","pypi.org","pypi.python.org","files.pythonhosted.org","crates.io","index.crates.io","static.crates.io","proxy.golang.org","golang.org","pkg.go.dev"])});var qy={};O0(qy,{wallGreenOnBaseOf:()=>tL,verdictOf:()=>vK0,targetProofOf:()=>fK0,stage:()=>Xl8,signReceipt:()=>y4,sha256:()=>A7,sealStage:()=>gK0,renderReceiptMd:()=>hK0,receiptSha256:()=>xQ,loadSigningKey:()=>u6,kidOf:()=>O6,commitStage:()=>Hy,canonicalJson:()=>i5,SIGNING_UNAVAILABLE:()=>SK0,DEEP_NOT_PROVEN:()=>xK0,AGENT_ONLY_REASON:()=>bK0});import{createHash as ad8}from"crypto";import{existsSync as id8,readdirSync as od8,mkdirSync as nd8,readFileSync as sd8,writeFileSync as kK0}from"fs";import{basename as rd8,isAbsolute as td8,join as X$,relative as ed8}from"path";function yK0(Z){let $=Z.replace(/[\x00-\x1f\x7f]+/g," ").trim();return($.length>500?`${$.slice(0,500)}...`:$).replace(/`/g,"'")}function xQ(Z){let{verification:$,receipt_sha256:J,...X}=Z;return A7(i5(X))}async function C2(Z,$,J={}){let X=await K9(Z.repoDir,$,{timeoutMs:20000,...J});return{out:X.stdout,code:X.exitCode}}function vK0(Z,$,J,X,Y,Q,z=!1,W=[]){let K=Z.implement?.exit;if(Z.commit?.failed!==!0&&n5(Z.commit?.not_proven).length===0&&(Z.intake?.already_satisfied===!0||Y||K==="already_done"))return Q?"ALREADY_SATISFIED":"PARTIAL";if(K==="spec_conflict")return"SPEC_CONFLICT";if(Z.commit?.failed===!0||n5(Z.commit?.not_proven).length>0)return"FAILED";if(J)return"FAILED";if(K==="killed")return typeof Z.implement?.limit_s==="number"&&z&&W.length===0&&Q&&!X&&$.length>0&&$.every((V)=>V.result==="pass")?"VERIFIED":"PARTIAL";if(typeof Z.implement?.limit_s==="number")return"PARTIAL";if($.some((V)=>V.result==="fail"))return"FAILED";if(K==="killed"||$.length===0||$.some((V)=>V.result!=="pass")||X||!Q)return"PARTIAL";return"VERIFIED"}function fK0(Z){let $=new Set(n5(Z?.target_checks));return(Array.isArray(Z?.checks)?Z.checks:[]).some((X)=>$.has(String(X.name))&&tV([X]))}function Jl8(Z,$){if(!Array.isArray(Z))return[];return Z.filter((J)=>!!J&&typeof J==="object").map((J)=>({name:String(J.name??""),cmd:String(J.cmd??""),result:J.result==="pass"||J.result==="fail"?J.result:"not_run",duration_s:typeof J.duration_s==="number"?J.duration_s:0,provenance:ix(String(J.name??""),$),...typeof J.n==="number"?{n:J.n}:{}}))}function hK0(Z){let $=Z.verification.jwt?`SIGNED (kid ${Z.verification.kid})`:"UNSIGNED",J=(z)=>`- ${z.result}: ${z.name} (\`${z.cmd}\`, ${z.duration_s}s)`,X=(z,W)=>[z,...W.length?W.map(J):["- none"]],Y=(z)=>z.provenance==="exogenous"||z.provenance==="independent",Q=Z.cost.usd!==null?`$${Z.cost.usd.toFixed(4)}`:Z.cost.measured_sessions>0?`partial: $${Z.cost.partial_usd.toFixed(4)} for ${Z.cost.measured_sessions} of ${Z.cost.total_sessions} sessions`:"not measured";return[`## Loki receipt: ${Z.verdict}`,"",...Z.verdict==="SPEC_CONFLICT"&&Z.spec_conflict_reason?[`- Reason: \`${Z.spec_conflict_reason}\``]:[],`- Run: ${Z.run_id}`,`- Base: ${Z.base_sha} Head: ${Z.head_sha}`,`- receipt_sha256: ${Z.receipt_sha256}`,`- Signature: ${$}`,`- Provider: ${Z.provider} (${Z.model}) Cost: ${Q} Wall: ${Z.time.wall_s}s (stages) Total to seal: ${o8.time?.reconciled(Z.time)??"NOT RECORDED"}${(o8.time?.reconciled(Z.time)??null)===null?"":"s"}`,...Z.cost.tokens_measured?[`- Tokens: partial: ${Z.cost.input_tokens} input / ${Z.cost.output_tokens} output for ${Z.cost.tokens_measured.k} of ${Z.cost.tokens_measured.n} sessions`]:[],...Z.mutation_proof?[`- ${Z.mutation_proof}`]:[],...Z.route?T10(Z.route):[],"",...Z.checks.some((z)=>z.provenance!==void 0)?[...X("### Agent-independent checks",Z.checks.filter(Y)),"",...X("### Agent-authored / advisory checks",Z.checks.filter((z)=>!Y(z)))]:X("### Checks",Z.checks),"",...Z.evidence.length?["### Evidence (already-satisfied)",...Z.evidence.map((z)=>`- ${z}`),""]:[],"### NOT PROVEN",...Z.not_proven.map((z)=>`- ${yK0(z)}`),""].join(`
820
820
  `)}var xK0,SK0="receipt signing unavailable (no usable signing key: invalid key or unwritable ~/.loki/keys)",bK0="only agent-authored tests executed (no agent-independent proof)",Zl8=":(exclude).loki",A7=(Z)=>ad8("sha256").update(Z).digest("hex"),HJ=(Z)=>typeof Z==="string"&&Z!==""?Z:null,n5=(Z)=>Array.isArray(Z)?Z.filter(($)=>typeof $==="string"&&$!==""):[],$l8=(Z)=>{let $=ed8(Z.repoDir,X$(Z.runDir,"receipt.json"));return $.startsWith("..")||td8($)?`.loki/runs/${Z.runId}/receipt.json`:$},Hy,tL=(Z)=>{let $=Z.wall?.base_run??{};return typeof $.pass==="number"&&$.pass>0&&$.fail===0&&(typeof $.not_run==="number"?$.not_run:0)===0},gK0,Xl8;var v4=S(()=>{QJ();oA();O7();gS();CQ();$b();jL();sz0();SS();$W0();GJ();kG();fG();A2();pW0();r9();kA();Nb();cG();DX();M7();E3();iG();_K0();XZ();S0();xK0=["full suite","app boot","council","security scan"];Hy={name:"commit",...S9.commit,async run(Z){if(!Z.baseSha||(await C2(Z,["rev-parse","--verify","-q",`${Z.baseSha}^{commit}`])).code!==0)return{status:"failed",data:{},reason:"base commit not resolvable"};if((await C2(Z,["add","-A","--","."],{repoDrivers:!0})).code!==0)return{status:"failed",data:{},reason:"git add failed"};let $=await C2(Z,["diff","--cached","--name-status","--no-renames","-z",Z.baseSha]);if($.code!==0)return{status:"failed",data:{},reason:"git diff against base failed"};let J=_S($.out),X=kS(Z.repoDir,J,Z.outputs().intake?.preexisting_dirty),Y=await nz0((V)=>C2(Z,V),Z.baseSha,Z.outputs(),J,new Set(X.filter(({st:V})=>V==="L").map(({f:V})=>V)),Z.repoDir);if(Y)return Y;if(X.length>0&&(await C2(Z,["--literal-pathspecs","reset","-q",Z.baseSha,"--",...X.map(({f:V})=>V)])).code!==0)return{status:"failed",data:{},reason:"git reset failed"};let Q=new Set(X.map(({f:V})=>V)),z=ZW0(Z.outputs(),J.filter(({f:V})=>!Q.has(V)));if((await C2(Z,["diff","--cached","--quiet"])).code===0)return{status:"completed",data:{committed:!1,scope_notes:z}};let W=(HJ(Z.outputs().intake?.title)??`run ${Z.runId}`).split(`
821
821
  `)[0].slice(0,72);if((await C2(Z,["commit","-q","-m",`loki: ${W}`,"-m",[`Loki-Run: ${Z.runId}`,...tX0({runId:Z.runId,provider:Z.provider,model:Z.model,receiptRel:$l8(Z)})].join(`
822
822
  `)],{repoDrivers:!0,userHooks:!0})).code!==0)return{status:"failed",data:{},reason:"git commit failed"};return{status:"completed",data:{committed:!0,head_sha:(await C2(Z,["rev-parse","HEAD"])).out.trim(),scope_notes:z}}}};gK0={name:"seal",...S9.seal,async run(Z,$){let J=Z.outputs(),X=VX0(Z.repoDir,Z);if(X.length)return{status:"failed",data:{stale_wall_revisions:X.map((Q0)=>Q0.rev)},reason:KX0(X)};let Y=(await C2(Z,["rev-parse","HEAD"])).out.trim(),Q=(await C2(Z,["rev-parse","HEAD^{tree}"])).out.trim(),z=await K9(Z.repoDir,["diff-tree","-r","-z","--raw","--no-renames","--no-abbrev","-O/dev/null",Z.baseSha,Y,"--",".",Zl8],{timeoutMs:20000}),W=z.exitCode===0&&/^[0-9a-f]{40,64}$/.test(Y),K=n5(J.verify?.not_proven),V=J.wall?.base_run??{},G=typeof V.not_run==="number"?V.not_run:0,H=tL(J),q=n5(J.verify?.pre_red_checks),U=W?z.stdout.split("\x00").filter(Boolean):[],B={addedFiles:U.flatMap((Q0,P0)=>P0%2===0&&Q0.trim().split(" ").pop()==="A"&&U[P0+1]?[U[P0+1]]:[]),wallFiles:Array.isArray(J.wall?.files)?J.wall.files.map((Q0)=>String(Q0.path)):[]},N=Jl8(J.verify?.checks,B),O=[];for(let Q0=0;Q0+1<U.length;Q0+=2)if((U[Q0].trim().split(" ").pop()??"")!=="A"&&S4(U[Q0+1]))O.push(U[Q0+1]);let M=W?EY0(Z.repoDir,Z.baseSha,Y,U.filter((Q0,P0)=>P0%2===1),$):[],L=Vy(Z.runDir,xQ),j=Array.isArray(J.verify?.checks)?J.verify.checks:[],F=tV(j),I=H||(process.env.LOKI_EXOGENOUS_PROOF==="0"?F:qJ0(j,B)),T=J.implement?.exit==="killed"?n5(J.verify?.uncovered_changed):[],C=Lj(vK0(J,N.filter((Q0)=>!(Q0.result==="fail"&&q.includes(Q0.name))),!W||z.stdout==="",K.length>0||O.length>0||M.length>0,H,I,fK0(J.verify),T),L),R=await wK0(Z.repoDir,U.filter((Q0,P0)=>P0%2===1),DK0(Z.repoDir),process.env),D=EK0(C,R),P=await uW0(Z,D,Y),E=gW0(D,P),x=E==="VERIFIED"&&XY0()?YY0({repoDir:Z.repoDir,baseSha:Z.baseSha,runDir:Z.runDir,wallFiles:Array.isArray(J.wall?.files)?J.wall.files:[],checks:Array.isArray(J.verify?.checks)?J.verify.checks:[],runner:(Q0)=>new yG(void 0,Q0)}):null,w=x?.outcome==="no"&&UG()&&J.plan?.behavior_change===!0?"PARTIAL":E,y=new Set([...xK0,...R.notProven,...L.notProven,...P?.notes??[],...Kj(Z.provider,P).notProven]);if(!I&&(w==="PARTIAL"||w==="VERIFIED"||w==="ALREADY_SATISFIED")){let Q0=j;y.add(F?bK0:Q0.length>0&&Q0.every((P0)=>P0.n!==0&&String(P0.reason??"").startsWith(fA))?fA:Q0.length>0&&Q0.every((P0)=>P0.n!==0&&String(P0.reason??"").startsWith(nV))?nV:t1)}if(G>0)y.add(`wall base run not_run: ${G}`);for(let Q0 of n5(J.wall?.not_proven))y.add(Q0);for(let Q0 of Array.isArray(J.wall?.discarded)?J.wall.discarded:[])y.add(`wall test discarded: ${String(Q0.file)} (${String(Q0.reason)})`);for(let Q0 of Array.isArray(J.wall?.not_run_files)?J.wall.not_run_files:[])y.add(`Wall test not executed: ${String(Q0.file)}: ${String(Q0.reason)}`);if(G>0&&![...y].some((Q0)=>Q0.startsWith("Wall test not executed:")||Q0.startsWith("wall test discarded:"))&&!(Array.isArray(J.wall?.discarded)&&J.wall.discarded.length>0))y.add(`Wall test not executed: ${G} file(s), no reason recorded`);if(G>0)try{let Q0=new Set((Array.isArray(J.wall?.files)?J.wall.files:[]).map((P0)=>rd8(String(P0.path))));for(let P0 of od8(X$(Z.runDir,"wall")).sort())if(!Q0.has(P0))y.add(`wall test discarded: ${P0} (not_run)`)}catch{}if(!W)y.add("diff not computed (git diff-tree failed)");let v=new Set,d=J.verify?.test_counts,o=(Q0)=>{let P0=Q0;return P0&&typeof P0.run==="number"&&typeof P0.skipped==="number"?{run:P0.run,skipped:P0.skipped}:void 0};for(let Q0 of O){y.add(`weakened test: ${Q0}`);let P0=K.filter((R8)=>R8.startsWith(`assertion value changed (not shown to be required by the task): ${Q0}:`));if(!P0.length)continue;let t8=d?.[Q0],D8=FL(Z.repoDir,Z.baseSha,Y,Q0,HJ(J.intake?.task)??"",o(t8?.b),o(t8?.h));if(!D8||D8.length!==P0.length||D8.some((R8)=>!P0.includes(R8)))for(let R8 of P0)v.add(R8)}if(w!=="VERIFIED")for(let Q0 of T)y.add(`changed, untested after limit: ${Q0}`);for(let Q0 of N)if(Q0.result==="not_run")y.add(`not run: ${Q0.name}`);for(let Q0 of n5(J.verify?.flaky))y.add(`flaky test: ${Q0}`);for(let Q0 of K)if(!v.has(Q0))y.add(Q0);for(let Q0 of M)y.add(Q0);for(let Q0 of[...n5(J.commit?.not_proven),...n5(J.commit?.scope_notes)])y.add(Q0);for(let Q0 of n5(J.verify?.pre_red))y.add(`pre red: ${Q0}`);if(typeof J.verify?.baseline_line==="string"&&n5(J.verify?.pre_red).length)y.add(J.verify.baseline_line);for(let Q0 of n5(J.implement?.tests_reverted))y.add(`reverted test edit: ${Q0}`);if(Z.provider!=="claude")y.add("kill blocking not enforced");if(process.env.LOKI_MODEL_OVERRIDE?.trim()&&Z.provider!=="claude")y.add("model override not applied");let g=J.intake?.source;if(g!=="text"&&g!=="issue")y.add("task source not recorded by intake");let i=HJ(J.intake?.repo);if(x?.outcome==="no")y.add(`Wall tests passed without the fix (mutation proof)${w!==E?"; verdict downgraded to PARTIAL (LOKI_MUTATION_STRICT=1, declared behavior change)":""}`);if(i===null)y.add("repo not recorded by intake");if(typeof J.intake?.resumed!=="boolean")y.add("resume state not recorded by intake");let f={};for(let[Q0,P0]of Object.entries(J))if(typeof P0?.duration_s==="number")f[Q0]=P0.duration_s;let m=o8.time,s=m?m.build(Z,f,m.firstEventMs(X$(Z.runDir,"events.jsonl"))):{wall_s:Object.values(f).reduce((Q0,P0)=>Q0+(P0??0),0),stages:f},b=m?.reconciled(s)??null,h=[...new Set([...Object.values(J).flatMap((Q0)=>[...n5(Q0?.iteration_ids),...n5([Q0?.iteration_id])]),...Z.sessionIds?.()??[]])];if(h.length===0)y.add("cost not measured (no iteration ids recorded)");let u=Z.cost.read(Z.repoDir,h);if(u.unmetered)y.add("cost unmetered (CLI invoker; recorded as 0)");let Y0=X$(Z.runDir,"events.jsonl"),W0=Array.isArray(J.wall?.files)?J.wall.files:[],F0=typeof J.verify?.wall_passed==="boolean"?J.verify.wall_passed:null;if(W0.length>0&&F0===null)y.add("wall result not recorded by verify");let G0=C10(process.env,Z.provider,J.implement?.route??J.plan?.route_record??(Z9(process.env)?MQ0(Z.runDir):void 0),u.router??(Z9(process.env)?LW(X$(Z.repoDir,".loki"),MW(X$(Z.repoDir,".loki"),h,n2)).router:void 0),Z.model);if(G0)for(let Q0 of P10(G0))y.add(Q0);let D0={schema:"loki.v10.receipt/1",run_id:Z.runId,task:{source:g==="issue"?"issue":"text",sha256:HJ(J.intake?.task_sha256)??""},repo:i??"",base_sha:Z.baseSha,head_sha:Y,tree:Q,diff_sha256:A7(W?z.stdout:""),wall:{files:W0.map((Q0)=>({path:String(Q0.path),sha256:String(Q0.sha256)})),passed:F0},checks:N,not_proven:[],verdict:w,...typeof J.implement?.limit_s==="number"?{implement_limit:{limit_s:J.implement.limit_s,elapsed_s:typeof J.implement.elapsed_s==="number"?J.implement.elapsed_s:0}}:{},...L.section?{group:L.section}:{},...Z.failovers&&Z.failovers().length>0?{failover:Z.failovers()}:{},...HJ(J.implement?.spec_conflict_reason)!==null?{spec_conflict_reason:yK0(HJ(J.implement?.spec_conflict_reason))}:{},evidence:n5(J.intake?.evidence),...J.intake?.preexisting_dirty?{pre_existing_dirty:Object.keys(J.intake.preexisting_dirty)}:{},cost:{usd:u.usd,input_tokens:u.inputTokens,output_tokens:u.outputTokens,...u.tokensMeasured&&u.tokensMeasured.k<u.tokensMeasured.n?{tokens_measured:u.tokensMeasured}:{},...typeof u.cacheReadTokens==="number"&&u.cacheReadSeen!==!1?{cache_read_tokens:u.cacheReadTokens}:{},...typeof u.cacheCreationTokens==="number"&&u.cacheCreationSeen!==!1?{cache_creation_tokens:u.cacheCreationTokens}:{},...typeof u.durationMs==="number"?{sdk_duration_ms:u.durationMs}:{},...u.records??{},measured_sessions:u.measuredCount??0,total_sessions:u.totalCount??0,partial_usd:u.partialUsd??0,...u.unmetered?{source:"cli-invoker-unmetered"}:{},...Array.isArray(J.fix?.fix_rounds)?{fix_rounds:J.fix.fix_rounds}:{}},time:s,provider:Z.provider,model:Z.model,resumed:J.intake?.resumed===!0,events_sha256:A7(id8(Y0)?sd8(Y0):""),...await DW0(Z.repoDir,Z.runDir,J,y,$,Z.emit),log_seal:!0,...Jy(process.env,u.usd,u.unmetered===!0,b),...Kj(Z.provider,P).review?{review:Kj(Z.provider,P).review}:{},...x?{mutation_proof:x.line,mutation_outcome:x.outcome}:{},...G0?{route:G0}:{},...R.block?{supply:R.block}:{},...fS(process.env),...qS(Z.intentRevisions)};for(let Q0 of Wy(Z.repoDir,D0,U,N,process.env,J.intake?.contract_snapshot))y.add(Q0);D0.not_proven=[...y];let K8=xQ(D0),p=y4(Z.runId,K8);if(!p.jwt)D0.not_proven=[...y,SK0],K8=xQ(D0);let c={...D0,receipt_sha256:K8,verification:{jwt:p.jwt,kid:p.kid}};nd8(Z.runDir,{recursive:!0});let t=X$(Z.runDir,"receipt.json");kK0(t,JSON.stringify(c,null,2)+`
@@ -3003,4 +3003,4 @@ Unknown commands exit 2 with a suggestion; run 'loki help' for the full list.
3003
3003
  `);{let{suggestCommand:X}=await Promise.resolve().then(() => (ac(),TD0)),Y=$===void 0?void 0:X($);if(Y)process.stderr.write(`Did you mean 'loki ${Y}'?
3004
3004
  `)}return process.stderr.write(oD0),2}}SN0();var nD0=()=>globalThis[Symbol.for("loki.ownsStopSignals")]===!0;process.on("SIGINT",()=>{if(!nD0())process.exit(130)});process.on("SIGTERM",()=>{if(!nD0())process.exit(143)});var QY9=await YY9(Bun.argv.slice(2));process.exit(QY9);
3005
3005
 
3006
- //# debugId=EBB3296686E5150EF46FBA529B5C1707
3006
+ //# debugId=6664357C88DC895C44C7EF6F4D09E6B3
package/mcp/__init__.py CHANGED
@@ -75,4 +75,4 @@ try:
75
75
  except ImportError:
76
76
  __all__ = ['mcp']
77
77
 
78
- __version__ = '11.17.33'
78
+ __version__ = '11.17.34'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "loki-mode",
3
3
  "mcpName": "io.github.asklokesh/loki-mode",
4
- "version": "11.17.33",
4
+ "version": "11.17.34",
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",
@@ -158,5 +158,5 @@
158
158
  "dependencies": {
159
159
  "@resvg/resvg-wasm": "^2.6.2"
160
160
  },
161
- "gitHead": "b8a6b8de2263035bd86813ef59bca8757e7709e8"
161
+ "gitHead": "20640f6fb1c7022de3d5a36ca07e3878d3af6627"
162
162
  }
@@ -15368,7 +15368,8 @@ function checksOf(v, pc) {
15368
15368
  cmd: String(c.cmd ?? ""),
15369
15369
  result: c.result === "pass" || c.result === "fail" ? c.result : "not_run",
15370
15370
  duration_s: typeof c.duration_s === "number" ? c.duration_s : 0,
15371
- provenance: checkProvenance(String(c.name ?? ""), pc)
15371
+ provenance: checkProvenance(String(c.name ?? ""), pc),
15372
+ ...typeof c.n === "number" ? { n: c.n } : {}
15372
15373
  }));
15373
15374
  }
15374
15375
  function renderReceiptMd(r) {
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "loki-mode",
4
4
  "displayName": "Loki Mode",
5
- "version": "11.17.33",
5
+ "version": "11.17.34",
6
6
  "description": "Autonomous spec-to-product build system with a built-in trust layer (RARV-C closure loop, 8 quality gates, completion council). Ships Loki's spec-hardening, drift-detection, and deterministic PR verification commands plus the Loki MCP server.",
7
7
  "author": {
8
8
  "name": "Autonomi",
@@ -1,4 +1,4 @@
1
- import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-CLhSjoBh.js";import{B as C}from"./Button-DE9YSmx7.js";import{T as $e}from"./trending-up-zbFMeMKJ.js";import{C as z}from"./clock-nx62hSC-.js";import{A as Be,U as ue,M as De}from"./Avatar-juKRXN3K.js";import{A as J}from"./activity-ne5hNxSa.js";import{R as pe}from"./refresh-cw-DBxi9oLT.js";import{G as ze}from"./globe-D181kc57.js";import{C as Le}from"./chevron-left-t7osreJx.js";import{C as je}from"./check-DAy71jvU.js";import{D as Y}from"./dollar-sign-DOIJQqTW.js";import{U as Te}from"./user-CL_i_mfr.js";import{D as Me}from"./database-BYgeRx98.js";import{L as Ue}from"./lock-3nX2Pu9P.js";import{S as Re}from"./scroll-text-CjgmRj7v.js";import{S as Ie}from"./shield-alert-OES4hyVW.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-Dp6emuTo.js";import{B as C}from"./Button-lPXsKVcs.js";import{T as $e}from"./trending-up-Dk_GS57K.js";import{C as z}from"./clock-CCgwQ80p.js";import{A as Be,U as ue,M as De}from"./Avatar-C02t-Irl.js";import{A as J}from"./activity-D22UFJWA.js";import{R as pe}from"./refresh-cw-CJ_pkRQQ.js";import{G as ze}from"./globe-DOA9Y_1n.js";import{C as Le}from"./chevron-left-XI4pnrlY.js";import{C as je}from"./check-D9kJod1H.js";import{D as Y}from"./dollar-sign-FDCzdLrB.js";import{U as Te}from"./user-Dr6XCReg.js";import{D as Me}from"./database-C_a7H_3N.js";import{L as Ue}from"./lock-HKmv1nIN.js";import{S as Re}from"./scroll-text-CeVAfOXM.js";import{S as Ie}from"./shield-alert-CJfx3HCX.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-CLhSjoBh.js";/**
1
+ import{c as l,j as s}from"./index-Dp6emuTo.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-CLhSjoBh.js";import{C as r}from"./clock-nx62hSC-.js";import{C as a}from"./circle-alert-BStykHw8.js";import{C as l}from"./check-DAy71jvU.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-Dp6emuTo.js";import{C as r}from"./clock-CCgwQ80p.js";import{C as a}from"./circle-alert-CvS3mi0t.js";import{C as l}from"./check-D9kJod1H.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-CLhSjoBh.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-Dp6emuTo.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-CLhSjoBh.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-CBrbj1HN.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-BGzVyv37.js";import{C as oe}from"./check-DAy71jvU.js";import{C as Ye}from"./clock-nx62hSC-.js";import{D as Xe}from"./dollar-sign-DOIJQqTW.js";import{U as Ze}from"./upload-DLMVf5KF.js";import{L as V}from"./loader-circle-B7sx3o8C.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-Dp6emuTo.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-D8nyc_y_.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-BrC-E9mS.js";import{C as oe}from"./check-D9kJod1H.js";import{C as Ye}from"./clock-CCgwQ80p.js";import{D as Xe}from"./dollar-sign-FDCzdLrB.js";import{U as Ze}from"./upload-BAxHyFqH.js";import{L as V}from"./loader-circle-CJ2SKm0h.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-CLhSjoBh.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-Dp6emuTo.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-CLhSjoBh.js";/**
1
+ import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-Dp6emuTo.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-CLhSjoBh.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`${s.cost.cost_partial===!0?"at least ":""}$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
1
+ import{r as l,a as x,j as e}from"./index-Dp6emuTo.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`${s.cost.cost_partial===!0?"at least ":""}$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
@@ -1,4 +1,4 @@
1
- import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-CLhSjoBh.js";import{B as N}from"./Button-DE9YSmx7.js";import{C as y}from"./thumbs-up-BGzVyv37.js";import{R as S}from"./refresh-cw-DBxi9oLT.js";import{C as z}from"./circle-alert-BStykHw8.js";import{U as D}from"./user-CL_i_mfr.js";import{L as G}from"./loader-circle-B7sx3o8C.js";import{R as T}from"./rotate-ccw-C7aSRLsF.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-Dp6emuTo.js";import{B as N}from"./Button-lPXsKVcs.js";import{C as y}from"./thumbs-up-BrC-E9mS.js";import{R as S}from"./refresh-cw-CJ_pkRQQ.js";import{C as z}from"./circle-alert-CvS3mi0t.js";import{U as D}from"./user-Dr6XCReg.js";import{L as G}from"./loader-circle-CJ2SKm0h.js";import{R as T}from"./rotate-ccw-rGU_udZ1.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-CLhSjoBh.js";import{B as y}from"./Button-DE9YSmx7.js";import{C as ge}from"./chevron-left-t7osreJx.js";import{G as P}from"./thumbs-up-BGzVyv37.js";import{R as $}from"./refresh-cw-DBxi9oLT.js";import{C as Ne}from"./circle-alert-BStykHw8.js";import{L as Q,S as je}from"./ProjectPage-C0FHZR1Y.js";import{S as se}from"./shield-alert-OES4hyVW.js";import{F as ye}from"./file-code-corner-CJHq-cpn.js";import{C as V}from"./clock-nx62hSC-.js";import{C as re}from"./check-DAy71jvU.js";import"./ErrorBoundary-CBrbj1HN.js";import"./TerminalOutput-Cj8n1UzX.js";import"./lock-3nX2Pu9P.js";import"./package-7HPfkZKJ.js";import"./file-plus-PE379Z5c.js";import"./activity-ne5hNxSa.js";import"./scroll-text-CjgmRj7v.js";import"./bot-CzmG61D-.js";import"./loader-circle-B7sx3o8C.js";import"./hammer-BQk0g3Ab.js";import"./dollar-sign-DOIJQqTW.js";import"./globe-D181kc57.js";import"./trash-2-BQhaTD1Q.js";import"./upload-DLMVf5KF.js";import"./plus-C-MZSrv0.js";import"./rotate-ccw-C7aSRLsF.js";import"./code-xml-HAPTB7-9.js";import"./trending-up-zbFMeMKJ.js";import"./layers-hj0pkPL2.js";import"./trending-down-BBCWxu1B.js";import"./server-Dp1cfmIM.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-Dp6emuTo.js";import{B as y}from"./Button-lPXsKVcs.js";import{C as ge}from"./chevron-left-XI4pnrlY.js";import{G as P}from"./thumbs-up-BrC-E9mS.js";import{R as $}from"./refresh-cw-CJ_pkRQQ.js";import{C as Ne}from"./circle-alert-CvS3mi0t.js";import{L as Q,S as je}from"./ProjectPage-Bo8ocjwn.js";import{S as se}from"./shield-alert-CJfx3HCX.js";import{F as ye}from"./file-code-corner-28-hDPSO.js";import{C as V}from"./clock-CCgwQ80p.js";import{C as re}from"./check-D9kJod1H.js";import"./ErrorBoundary-D8nyc_y_.js";import"./TerminalOutput-DnOFdmTG.js";import"./lock-HKmv1nIN.js";import"./package-FQl71HNO.js";import"./file-plus-c0yygSC8.js";import"./activity-D22UFJWA.js";import"./scroll-text-CeVAfOXM.js";import"./bot-CTXo6aac.js";import"./loader-circle-CJ2SKm0h.js";import"./hammer-Omzy4vB3.js";import"./dollar-sign-FDCzdLrB.js";import"./globe-DOA9Y_1n.js";import"./trash-2-Bb3mW1oq.js";import"./upload-BAxHyFqH.js";import"./plus-DY8mlU6I.js";import"./rotate-ccw-rGU_udZ1.js";import"./code-xml-PRnhUKWP.js";import"./trending-up-Dk_GS57K.js";import"./layers-D7ZjWXJQ.js";import"./trending-down-CrgUJZLA.js";import"./server-D-N_u9OT.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.