loki-mode 10.5.23 → 10.5.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/bin/loki +61 -8
- package/dashboard/__init__.py +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/BOARD.md +3 -1
- package/docs/v10/FOUNDER-QUEUE.md +1 -0
- package/docs/v10/PROGRESS.md +24 -0
- package/loki-ts/dist/loki.js +2 -2
- package/mcp/__init__.py +1 -1
- package/package.json +2 -1
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-d3ZLc0Tl.js → AdminPage-CAv0-6cg.js} +1 -1
- package/web-app/dist/assets/{Avatar-CGHT_M4V.js → Avatar-CaQtzthw.js} +1 -1
- package/web-app/dist/assets/{Badge-BpS5M2it.js → Badge-DtbHiuRY.js} +1 -1
- package/web-app/dist/assets/{Button-CCMn0nm5.js → Button-fW3YlMPF.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-DoMtDXzu.js → CockpitPage-BNuhQ_fT.js} +1 -1
- package/web-app/dist/assets/{ComparePage-Cz6TyKKO.js → ComparePage-Crz5Q3ha.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-Bp1h5DLV.js → ErrorBoundary-B5WNaTbp.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-pd499gha.js → EvidenceReceiptPanel-CPGCtoP-.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-BUo-iqwK.js → GitHubIssuesPanel-BsdRcYfU.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-BOPE7_nD.js → GitHubPRsPanel-CZxxcMfX.js} +1 -1
- package/web-app/dist/assets/{HomePage-9t7S6TXu.js → HomePage-2dHUxOiP.js} +2 -2
- package/web-app/dist/assets/{LoginPage-CMcdbSSk.js → LoginPage-BQP3Rr-3.js} +1 -1
- package/web-app/dist/assets/{MagicPage-GLxvn0g8.js → MagicPage-aOaQ63-F.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-B9W-6UdL.js → MetricsPage-BjEXEnBK.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-MC-jWzoM.js → NotFoundPage-po9T59mG.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-2KpaMSFP.js → ProjectPage-Chlxfsb1.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-DJS11cL0.js → ProjectsPage-Co6qkF_I.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-BfPM6_z-.js → SettingsPage-DxV7zr-h.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-GyglRuEI.js → ShowcasePage-BtiucdEZ.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-CSKCUbJ1.js → SystemSettingsPage-DBpjtHy8.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-CoDhZujG.js → TeamsPage-HifOcK5-.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-fKK76P9Q.js → TemplatesPage-DtlUzFmx.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-DsXECPhC.js → TerminalOutput-Dl7F0H0d.js} +1 -1
- package/web-app/dist/assets/{activity-BwDl_Q_K.js → activity-BwzYTinZ.js} +1 -1
- package/web-app/dist/assets/{bell--8hyo_jC.js → bell-DCUieZE9.js} +1 -1
- package/web-app/dist/assets/{bot-hPGKMvTk.js → bot-D0QOEr2j.js} +1 -1
- package/web-app/dist/assets/{check-B4ZqF56K.js → check-BkUbott-.js} +1 -1
- package/web-app/dist/assets/{chevron-left-xA4SyYir.js → chevron-left-CJB72p7S.js} +1 -1
- package/web-app/dist/assets/{circle-alert-C3UhYgmz.js → circle-alert-ZkCFp9P0.js} +1 -1
- package/web-app/dist/assets/{clock-D6xXQU0l.js → clock-C7wfh0WZ.js} +1 -1
- package/web-app/dist/assets/{cloud-BVk8faZy.js → cloud-BfSkCPAa.js} +1 -1
- package/web-app/dist/assets/{code-xml-C0OlIR2z.js → code-xml-D4Bknj7L.js} +1 -1
- package/web-app/dist/assets/{database-C4c3W0Km.js → database-6uWPD9SM.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-DDnUM3_j.js → dollar-sign-C1GC_4Gf.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-OsCs14OL.js → file-code-corner-XiJnJDoy.js} +1 -1
- package/web-app/dist/assets/{file-plus-d4XtHwBc.js → file-plus-BaN2vTKi.js} +1 -1
- package/web-app/dist/assets/{globe-CwNeqLUu.js → globe-CQs61CBR.js} +1 -1
- package/web-app/dist/assets/{hammer-CN4bs4-3.js → hammer-9VgifcL2.js} +1 -1
- package/web-app/dist/assets/{index-DtLzMLmc.js → index-Bf_yp-ka.js} +3 -3
- package/web-app/dist/assets/{layers-BRYYE6CG.js → layers-D4Vw8Mbi.js} +1 -1
- package/web-app/dist/assets/{loader-circle-D90eq7gm.js → loader-circle-BfVRhTkt.js} +1 -1
- package/web-app/dist/assets/{lock-BeRwCbex.js → lock-CHVfJ2Ec.js} +1 -1
- package/web-app/dist/assets/{package-XOV5thdu.js → package-DpVxPE51.js} +1 -1
- package/web-app/dist/assets/{plus-CK2Uaks7.js → plus-BvPWfH2l.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-DghJ663b.js → refresh-cw-CiKOB-AH.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-BDPsaXZ4.js → rotate-ccw-BqyKlVyu.js} +1 -1
- package/web-app/dist/assets/{scroll-text-B3TH5Vpl.js → scroll-text-BkVFxR9Q.js} +1 -1
- package/web-app/dist/assets/{server-CstqZqRH.js → server-gXecxW5O.js} +1 -1
- package/web-app/dist/assets/{shield-alert-CzJK0DC6.js → shield-alert-DD6z7kMY.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-B7loUo5h.js → thumbs-up-pw5NDACS.js} +1 -1
- package/web-app/dist/assets/{trash-2-D9bAmqG1.js → trash-2-BSh9aztG.js} +1 -1
- package/web-app/dist/assets/{trending-down-DShy2Lhi.js → trending-down-Cqo5izHb.js} +1 -1
- package/web-app/dist/assets/{trending-up-D3VOAwuk.js → trending-up-CYNQ9vY-.js} +1 -1
- package/web-app/dist/assets/{upload-DjJQpUPc.js → upload-Blr76ubG.js} +1 -1
- package/web-app/dist/assets/{usePolling-BG1VuJza.js → usePolling-Cuc9zvC4.js} +1 -1
- package/web-app/dist/assets/{user-BW8cZn07.js → user-MOQxScJS.js} +1 -1
- package/web-app/dist/index.html +1 -1
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: An autonomous software factory that knows what it is supposed to deliver, and proves it did. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v10.5.
|
|
6
|
+
# Loki Mode v10.5.25
|
|
7
7
|
|
|
8
8
|
**You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
|
|
9
9
|
|
|
@@ -470,4 +470,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
|
|
|
470
470
|
|
|
471
471
|
---
|
|
472
472
|
|
|
473
|
-
**v10.5.
|
|
473
|
+
**v10.5.25 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
10.5.
|
|
1
|
+
10.5.25
|
package/bin/loki
CHANGED
|
@@ -243,6 +243,42 @@ if [ "${LOKI_LEGACY_BASH:-0}" = "1" ] || [ "${LOKI_LEGACY_BASH:-}" = "true" ]; t
|
|
|
243
243
|
exec "$BASH_CLI" "$@"
|
|
244
244
|
fi
|
|
245
245
|
|
|
246
|
+
# Loki 10 bun resolver: bun on PATH, then an npm-installed @oven/bun-* optional
|
|
247
|
+
# dependency under REPO_ROOT (postinstall moves it to node_modules/bun/bin/bun.exe;
|
|
248
|
+
# under --ignore-scripts it stays in @oven/bun-<os>-<arch>). A candidate counts only if `--version` exits 0
|
|
249
|
+
# within 2s. Prints the path, or nothing.
|
|
250
|
+
_loki_bun_probe() {
|
|
251
|
+
local c="$1" t p w rc
|
|
252
|
+
t=$(command -v timeout || command -v gtimeout || true)
|
|
253
|
+
if [ -n "$t" ]; then "$t" -k 1 2 "$c" --version >/dev/null 2>&1; return $?; fi
|
|
254
|
+
"$c" --version >/dev/null 2>&1 &
|
|
255
|
+
p=$!
|
|
256
|
+
( sleep 2; kill -9 "$p" 2>/dev/null ) >/dev/null 2>&1 &
|
|
257
|
+
w=$!
|
|
258
|
+
{ wait "$p"; } 2>/dev/null; rc=$?
|
|
259
|
+
kill "$w" 2>/dev/null
|
|
260
|
+
return $rc
|
|
261
|
+
}
|
|
262
|
+
_loki_bun() {
|
|
263
|
+
local c
|
|
264
|
+
c=$(command -v bun 2>/dev/null || true)
|
|
265
|
+
if [ -n "$c" ] && _loki_bun_probe "$c"; then printf '%s\n' "$c"; return 0; fi
|
|
266
|
+
for c in "$REPO_ROOT/node_modules/bun/bin/bun.exe" "$REPO_ROOT"/node_modules/@oven/bun-*/bin/bun; do
|
|
267
|
+
[ -x "$c" ] && _loki_bun_probe "$c" && { printf '%s\n' "$c"; return 0; }
|
|
268
|
+
done
|
|
269
|
+
return 0
|
|
270
|
+
}
|
|
271
|
+
# Reason text for the fallback notice: missing, or failed to start, exit N.
|
|
272
|
+
_loki_bun_why() {
|
|
273
|
+
local c rc
|
|
274
|
+
for c in "$REPO_ROOT/node_modules/bun/bin/bun.exe" "$REPO_ROOT"/node_modules/@oven/bun-*/bin/bun; do
|
|
275
|
+
[ -x "$c" ] || continue
|
|
276
|
+
_loki_bun_probe "$c"; rc=$?
|
|
277
|
+
echo "failed to start, exit $rc"; return 0
|
|
278
|
+
done
|
|
279
|
+
echo missing
|
|
280
|
+
}
|
|
281
|
+
|
|
246
282
|
# M-08 (docs/v10/MODERNIZE.md section 2): the NEW `loki modernize <repo> --to
|
|
247
283
|
# <target>` form always reaches the Loki 10 (Bun) modernize CLI, regardless of
|
|
248
284
|
# LOKI_ENGINE or the default engine flip. Ahead of the v10 block below so
|
|
@@ -264,8 +300,9 @@ fi
|
|
|
264
300
|
if [ "${1:-}" = "modernize" ]; then
|
|
265
301
|
for _loki_mod_a in "$@"; do
|
|
266
302
|
if [ "$_loki_mod_a" = "--to" ]; then
|
|
267
|
-
|
|
268
|
-
|
|
303
|
+
_lb=$(_loki_bun)
|
|
304
|
+
[ -n "$_lb" ] || { echo "Error: loki modernize needs bun." >&2; exit 1; }
|
|
305
|
+
exec "$_lb" "$BUN_CLI" engine10 "$@"
|
|
269
306
|
fi
|
|
270
307
|
done
|
|
271
308
|
unset _loki_mod_a
|
|
@@ -325,15 +362,31 @@ case "${LOKI_ENGINE:-$_loki_engine_default}" in
|
|
|
325
362
|
# Default (unset) mode never breaks a host: no bun, or a provider engine10 has no
|
|
326
363
|
# invoker for, falls through to the legacy engine. Explicit v10 keeps its hard error.
|
|
327
364
|
if [ "$_e10" = "1" ] && [ "${LOKI_ENGINE:-}" != "v10" ]; then
|
|
328
|
-
case "${LOKI_PROVIDER:-claude}" in
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
365
|
+
case "${LOKI_PROVIDER:-claude}" in
|
|
366
|
+
claude|codex|cline|aider) ;;
|
|
367
|
+
*)
|
|
368
|
+
_e10=0
|
|
369
|
+
echo "loki: using the legacy engine (the Loki 10 engine does not support LOKI_PROVIDER=${LOKI_PROVIDER:-}; use claude, codex, cline or aider)." >&2
|
|
370
|
+
;;
|
|
371
|
+
esac
|
|
372
|
+
if [ "$_e10" = "1" ]; then
|
|
373
|
+
_lb=$(_loki_bun)
|
|
374
|
+
if [ -z "$_lb" ]; then
|
|
375
|
+
_e10=0
|
|
376
|
+
case "$(uname -s 2>/dev/null)" in
|
|
377
|
+
Darwin) _os=darwin ;; Linux) _os=linux ;; MINGW*|MSYS*|CYGWIN*) _os=win32 ;; *) _os=$(uname -s 2>/dev/null | tr '[:upper:]' '[:lower:]') ;;
|
|
378
|
+
esac
|
|
379
|
+
case "$(uname -m 2>/dev/null)" in
|
|
380
|
+
arm64|aarch64) _arch=aarch64 ;; x86_64|amd64) _arch=x64 ;; *) _arch=$(uname -m 2>/dev/null) ;;
|
|
381
|
+
esac
|
|
382
|
+
echo "loki: the Loki 10 engine cannot run on this machine: no working bun (none on PATH, and the bundled bun for ${_os}-${_arch} is $(_loki_bun_why)). Running the legacy engine instead. To fix: install bun from https://bun.sh, or reinstall loki-mode without --omit=optional." >&2
|
|
383
|
+
fi
|
|
332
384
|
fi
|
|
333
385
|
fi
|
|
334
386
|
if [ "$_e10" = "1" ]; then
|
|
335
|
-
|
|
336
|
-
|
|
387
|
+
_lb=$(_loki_bun)
|
|
388
|
+
[ -n "$_lb" ] || { echo "Error: LOKI_ENGINE=v10 needs bun. Install bun from https://bun.sh, or set LOKI_ENGINE=legacy to use the previous engine." >&2; exit 1; }
|
|
389
|
+
exec "$_lb" "$BUN_CLI" engine10 "${_e10_args[@]}"
|
|
337
390
|
fi
|
|
338
391
|
unset _e10 _e10_args
|
|
339
392
|
;;
|
package/dashboard/__init__.py
CHANGED
package/docs/INSTALLATION.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
|
|
4
4
|
|
|
5
|
-
**Version:** v10.5.
|
|
5
|
+
**Version:** v10.5.25
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
package/docs/v10/BOARD.md
CHANGED
|
@@ -633,7 +633,9 @@ Source: ~/git/autonomi-dev/research/2026-09-30-adoption/SWARM-PROMPT-ADOPTION.md
|
|
|
633
633
|
| E-165 | tests/test-mirofish-integration.sh line 413 runs `autonomy/loki start --no-mirofish` in the repo root: a live autonomous build that ran about 45 min, switched a worktree branch to loki/session-* and committed a docs change (found by DOC-02). Guard: the test must run against a run-owned fixture repo with a stub provider and LOKI_NO_BROWSER=1, never the repo root; add a structural guard that no test launches start/run against REPO_ROOT | tests/test-mirofish-integration.sh, a structural guard | HIGH | the test never runs loki start in the repo root; guard catches a planted case | merged@2026-10-01T06:52Z | P0 guard (D26) |
|
|
634
634
|
| E-166 | Jira auto-sync never starts: src/integrations/sync-subscriber.js builds JiraApiClient without the required email and apiToken, so LOKI_JIRA_URL plus LOKI_JIRA_TOKEN do nothing (DOC-02 added a known-issue note to the setup docs). Fix the wiring or remove the advertised auto-sync | src/integrations/sync-subscriber.js, tests | MEDIUM | with env set, the subscriber constructs a working client (mocked API) | merged@2026-10-01T06:43Z | none |
|
|
635
635
|
| P0-promote-bun | Auto-promote of 10.5.22 failed: promote.yml ran the first-run gate without bun, the installed CLI fell back to legacy, 7 v10 checks failed and the cost check crashed (IndexError). Install bun before the gate; cost check fails closed; explicit engine-fallback check | .github/workflows/promote.yml, scripts/first-run-gate.sh, tests/test-first-run-gate.sh | test-first-run-gate 56/0 incl. fallback fixture; gate --stub 0 failed | HIGH | merged@2026-10-01T07:09Z | opus CTO APPROVE 5bdfe2f8 |
|
|
636
|
-
| E-167 | Gate the no-bun path end to end (CTO follow-up to P0-promote-bun): run the default entry with bun absent from PATH and assert the legacy receipt, NOT VERIFIED on a skipped target and the documented exit codes; the promote gate currently proves only the bun path | scripts/first-run-gate.sh, tests/test-first-run-gate.sh | no-bun stub run fails closed on a skipped test; clean no-bun run reads its legacy receipt | MEDIUM |
|
|
636
|
+
| E-167 | Gate the no-bun path end to end (CTO follow-up to P0-promote-bun): run the default entry with bun absent from PATH and assert the legacy receipt, NOT VERIFIED on a skipped target and the documented exit codes, with the legacy 15-line budget and legacy verify (the v10 leg keeps 8 lines; scripts/first-run-gate.sh:123 forces LOKI_ENGINE=v10 for verify, which is why a bun-less run failed digest, verify and signed); the promote gate currently proves only the bun path | scripts/first-run-gate.sh, tests/test-first-run-gate.sh | no-bun stub run fails closed on a skipped test; clean no-bun run reads its legacy receipt | MEDIUM | merged@2026-10-01T07:52Z | none |
|
|
637
|
+
| E-161b | E-161 false block: the hook judges a detaching checkout by the hook cwd (the main checkout) and ignores a preceding checked cd into a linked worktree; at 07:20Z a cd into the release worktree followed by git checkout --detach was blocked (RULE8), and the release only proceeded via git -C. Resolve the effective directory from a leading checked cd or from git -C before applying RULE8 | scripts/v10-guard.sh, tests/test-v10-guard.sh | checked cd into a linked worktree then detach: allowed; cwd main with no cd: blocked; git -C linked: allowed | HIGH | ready@2026-10-01T07:22Z | none |
|
|
638
|
+
| P0-nobun | D48 flip does nothing on a bun-less npm install: bin/loki falls back to legacy without bun, and loki-ts/dist/loki.js is built for target bun (node gives ReferenceError: Bun is not defined). Make the Loki 10 engine run without a preinstalled bun (node-runnable build, or bun shipped as an npm dependency) and, when neither works, say so plainly on the start line. Architect plan first | bin/loki, loki-ts/scripts/build.ts, package.json (per plan) | bun-less host runs the v10 default or prints the plain cannot-run line; promote gate no-bun leg (E-167) passes | HIGH | merged@2026-10-01T07:52Z | opus architect plan in progress |
|
|
637
639
|
| D49-auto | Auto-promote to latest on Post-Release Smoke success (founder D49) | .github/workflows/promote.yml, tests/test_release_next_tag.py | HIGH | smoke-success from Release promotes; manual smoke never promotes; not-lower guard | merged@2026-10-01T03:03Z | opus APPROVE 5510b8c8. Follow-ups (D49-auto-b): not-lower guard fails OPEN on an npm error (make it fail closed); loki-mode-sdk latest has no not-lower guard; a newer queued promote can replace a pending one in a release burst |
|
|
638
640
|
| D51-A3 | Headless `loki backlog owner/repo --all/--label/--issues` plus loki.yaml (schema, validator, env overrides) | autonomy/lib/backlog.py, autonomy/lib/loki_yaml.py, autonomy/loki, schemas/loki-yaml.schema.json, tests/test-backlog.sh | HIGH | backlog 47/0 | merged@2026-10-01T03:11Z | sonnet APPROVE 14ff9ae2; follow-up D51-A3b: `loki_yaml.py show` echoes a token pasted into git.token_env (redact x-secret-ref fields); no-parser test case; re-run of a failed issue discards its kept worktree |
|
|
639
641
|
| D51-A4 | Slack on the v10 path (PR opened, BLOCKED, finished), webhook from the env var named by LOKI_SLACK_WEBHOOK_ENV, URL redacted, 5s bounded post | loki-ts/src/e10ext/slack_events.ts, engine10/supervisor.ts, tests | MEDIUM | slack tests 40/0 | merged@2026-10-01T03:11Z | sonnet APPROVE adb838b2; one labelled test message after it ships |
|
|
@@ -21,3 +21,4 @@ this file; each item says what the loop does meanwhile.
|
|
|
21
21
|
| 14 | 2026-10-01 | Move the full-history `gitleaks --all` scan out of the Release path (to nightly plus every push to main, still blocking there), keeping a base-tag-to-tip range scan in Release. Relayed by the steering session as part of D46. | Weakens a release-blocking security gate; needs the founder directly, not a relay. | Release keeps the `--all` scan; E-156 removes the recurring false positive at the source. | SUPERSEDED 2026-10-01T00:30Z: Security Audit verdict reuse for VERSION-only bumps keeps the full --all scan scope (steering session 00:28Z); filed for the CI-health engineer. |
|
|
22
22
|
| 15 | 2026-10-01 | Run the REAL-provider first-run gate on the published `next` build: `CLAUDE_CODE_OAUTH_TOKEN=<token from "claude setup-token"> bash scripts/first-run-gate.sh --real --installed loki-mode@10.5.13` (or ANTHROPIC_API_KEY). The swarm has no provider credential in its environment and does not read stored secrets; the gate's throwaway HOME cannot use the keychain login. Stub mode on the installed npm package runs meanwhile. | Credential only the founder holds. | The promote milestone (real gate pass on a `next` version) stays blocked; stub-mode evidence only. |
|
|
23
23
|
| 16 | 2026-10-01 | A Slack incoming-webhook URL for testing D51 item 4 (notify.sh on the v10 path: PR opened, BLOCKED, backlog finished). Provide it as an env var (for example `LOKI_SLACK_WEBHOOK_URL`) in the Release Manager session, never in a file or chat. | Needs a credential only the founder holds. | Until then notify.sh is tested against a local mock webhook; the real end-to-end check runs once the env var is set. | open |
|
|
24
|
+
| 17 | 2026-10-01 | Ship bun with the npm package so `npm install -g loki-mode` runs the Loki 10 default without a separate bun install (P0-nobun, architect option B): add `"bun": "1.4.2"` as an optionalDependency. Cost: each install grows from 26.6MB to about 90-110MB (platform binary 62MB darwin-arm64, 80MB linux-x64, 86MB win-x64); `--omit=optional` and unsupported platforms keep the legacy engine with a plain message. The alternative (rewrite engine10 to run under node) is about 14 files and 300-450 lines, breaks the engine10 line budget and needs a third Bun Parity runtime. | Install size and dependency policy. | Builds only the resolver and the plain cannot-run message (both useful either way); npm users without bun keep getting legacy, and promote stays paused until the two-leg gate (E-167) lands. DECIDED B 07:35Z by peer relay (autonomi-dev-dc, citing the founder's 03:30Z delegation): the Loki 10 default is the product; a bigger install costs less than an inert default for most npm users; same pattern as esbuild and biome. Conditions: per-platform optional packages only; measured delta reported and held if above about 60MB per platform (architect figures 62-86MB exceed it; 07:35Z follow-up relay: decided (i) accept about 62-86MB, or (iii) bun's baseline build if smaller and Bun Parity passes; not (ii), since a first-run consent step breaks the one-command bar; record measured deltas in the CHANGELOG; document --omit=optional as the slim legacy path); --version probe plus plain start line when bun cannot run; Docker and Homebrew use the same resolver; E-167 two-leg gate stays. Founder may reverse. |
|
package/docs/v10/PROGRESS.md
CHANGED
|
@@ -1771,3 +1771,27 @@ The swarm is stopped: .loki/V10-STOP exists, the loop has no wake-ups, and the c
|
|
|
1771
1771
|
- promote.yml run at 07:00Z: completed failure, correctly refused to move latest. first-run-gate.sh --installed loki-mode@10.5.22 ran on ubuntu-latest WITHOUT bun; the installed CLI fell back to the legacy engine ("the Loki 10 engine needs bun"), so 7 v10 checks failed (digest-matches, verify-ok, receipt-signed, output-lines 13>8, engine-start-line, cost-non-null, skip-bare-verify) and the cost check crashed with IndexError (no v10 run dir).
|
|
1772
1772
|
- P0 fix slice-P0-promote-bun building: setup-bun in promote (and any other gate job on an installed package), cost check fails closed instead of crashing, explicit "engine fell back to legacy" check. CTO (opus) review before merge; release-gate change.
|
|
1773
1773
|
- train/42 73dbe61b (E-166, E-161, E-132 test, E-165) in CI.
|
|
1774
|
+
|
|
1775
|
+
## 2026-10-01T07:21Z v10.5.23 cut (E-166, E-161, P0-promote-bun, E-132 test); E-165 on train/45
|
|
1776
|
+
- train/44 a3dd76e6 green on Tests, Bun Parity, Coverage, Security Audit, Tier A; main fast-forwarded; v10.5.23 0b27f4a1 pushed (--check-clean rc=0, parent == origin/main, map sources clean, version embedded once). Watcher b120po3q0 covers the Release run, npm and the promote run, which is the first promote with the bun fix; if its gate passes, latest moves to 10.5.23 and the manual 10.5.22 promote is moot.
|
|
1777
|
+
- E-161 false block found during the cut: a cd into the release worktree then git checkout --detach was blocked as if in the main checkout; git -C worked. Row E-161b (HIGH) added.
|
|
1778
|
+
- train/45 33bbdb75 (adds E-165 r3: funnel-privacy counts only off-machine egress; caller was run.sh:24659 POST to 127.0.0.1/api/focus) in CI.
|
|
1779
|
+
- E-168 r2 (Tier A selects only runnable test files; train/43 range replay) finishing; E-168 r1 2a83f272 rejected by me: helpers fell through to bash execution.
|
|
1780
|
+
|
|
1781
|
+
## 2026-10-01T07:31Z P0-nobun: the D48 flip does nothing without bun (peer relay)
|
|
1782
|
+
- Evidence: bin/loki:329-331 falls back to legacy when bun is absent; loki-ts/scripts/build.ts:162,206 build target "bun"; node loki-ts/dist/loki.js --version gives "ReferenceError: Bun is not defined" (dist line 1569). Most npm users have no bun.
|
|
1783
|
+
- The bun-less gate failures on 10.5.22 (digest, verify, signed) come from scripts/first-run-gate.sh:123 forcing LOKI_ENGINE=v10 for verify, not from a legacy regression since 10.5.16; output-lines 13 is legacy quick against the new 8-line cap (legacy budget is 15). E-167 extended to a no-bun leg with legacy expectations.
|
|
1784
|
+
- Opus architect comparing a node-runnable engine10 with shipping bun as an npm dependency; slices follow. The flip is not described as done for npm users until this lands.
|
|
1785
|
+
|
|
1786
|
+
## 2026-10-01T07:34Z Promote PAUSED until the two-leg gate lands
|
|
1787
|
+
- gh workflow disable promote.yml at 07:33Z (state disabled_manually), while 10.5.23's Post-Release Smoke ran. Reason: the promote gate now proves only the bun path; a plain npm install has no bun and gets legacy, which no gate leg checks. latest stays 10.5.20 (gate working); next 10.5.22, 10.5.23 Release success. Re-enable after E-167 (two legs, both must pass) is merged and on main.
|
|
1788
|
+
- Architect (opus): option B (bun@1.4.2 optionalDependency, resolver to node_modules/@oven/bun-*/bin/bun with a --version probe) over A (node build: about 14 files, 300-450 lines, breaks the engine10 budget). Install size 26.6MB to about 90-110MB: FOUNDER-QUEUE 17.
|
|
1789
|
+
- Building: E-167 (two-leg promote gate), P0-nobun-S2 (resolver plus plain cannot-run start line; no dependency added).
|
|
1790
|
+
- train/46 bb82c599 (E-165 r3, E-168 r2) in CI; train/45 was green.
|
|
1791
|
+
|
|
1792
|
+
## 2026-10-01T07:52Z v10.5.23 on next (latest held at 10.5.20); P0-nobun and E-167 on train/48
|
|
1793
|
+
- v10.5.23 0b27f4a1: Release success, dist-tags next=10.5.23 latest=10.5.20, release body 10 lines. Promote did not run (workflow disabled 07:33Z).
|
|
1794
|
+
- Merged on main: E-167 r2 (two-leg promote gate: v10 leg with bun; legacy leg installs --omit=optional, filters bun off PATH, fails closed if bun is present, 15-line legacy budget; CTO APPROVE c494d7d2), P0-nobun S1 r2 (bun 1.4.2 optionalDependency plus regenerated lockfile; npm ci --dry-run rc 0; license audit PASS, MIT), P0-nobun S2 (_loki_bun resolver: PATH, node_modules/bun/bin/bun.exe, @oven/bun-*/bin/bun with a 2s --version probe; plain cannot-run start line; review: about 10ms per routed command, stdout clean).
|
|
1795
|
+
- Measured: bun adds about 62MB on macOS arm64 (published 79.5MB linux-x64, 86.1MB windows-x64); baseline builds are no smaller, so option (i).
|
|
1796
|
+
- train/46 red on ShellCheck (SC1083 in the new E-168 test); fixed e9121a89, on train/47. train/48 c7ef4b66 = everything; local: 14 checks rc=0 incl. run-shellcheck, npm ci --dry-run, gate --stub.
|
|
1797
|
+
- Next: on a green train cut 10.5.24, then re-enable promote.yml so 10.5.24 goes through both gate legs.
|
package/loki-ts/dist/loki.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var Jr=Object.create;var{getPrototypeOf:Kr,defineProperty:cG,getOwnPropertyNames:Yr}=Object;var zr=Object.prototype.hasOwnProperty;function Vr($){return this[$]}var Wr,qr,Gr=($,Z,Q)=>{var X=$!=null&&typeof $==="object";if(X){var J=Z?Wr??=new WeakMap:qr??=new WeakMap,K=J.get($);if(K)return K}Q=$!=null?Jr(Kr($)):{};let Y=Z||!$||!$.__esModule?cG(Q,"default",{value:$,enumerable:!0}):Q;for(let z of Yr($))if(!zr.call(Y,z))cG(Y,z,{get:Vr.bind($,z),enumerable:!0});if(X)J.set($,Y);return Y};var AK=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var Hr=($)=>$;function Br($,Z){this[$]=Hr.bind(null,Z)}var R0=($,Z)=>{for(var Q in Z)cG($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:Br.bind(Z,Q)})};var v=($,Z)=>()=>($&&(Z=$($=0)),Z);var x4=import.meta.require;var aT={};R0(aT,{lokiDir:()=>T0,homeLokiDir:()=>m7,findRepoRootForVersion:()=>iG,REPO_ROOT:()=>i0});import{resolve as S4,dirname as lG}from"path";import{fileURLToPath as Ur}from"url";import{existsSync as CK}from"fs";import{homedir as Or}from"os";function Nr(){let $=iT;for(let Z=0;Z<6;Z++){if(CK(S4($,"VERSION"))&&CK(S4($,"autonomy/run.sh")))return $;let Q=lG($);if(Q===$)break;$=Q}return S4(iT,"..","..","..")}function iG($){let Z=$;for(let Q=0;Q<6;Q++){if(CK(S4(Z,"VERSION"))&&CK(S4(Z,"autonomy/run.sh")))return Z;let X=lG(Z);if(X===Z)break;Z=X}return S4($,"..","..","..")}function T0(){return process.env.LOKI_DIR??S4(process.cwd(),".loki")}function m7(){return S4(Or(),".loki")}var iT,i0;var J8=v(()=>{iT=lG(Ur(import.meta.url));i0=Nr()});import{readFileSync as Mr}from"fs";import{resolve as jr,dirname as Lr}from"path";import{fileURLToPath as Ar}from"url";function b4(){if(u7!==null)return u7;let $="10.5.
|
|
2
|
+
var Jr=Object.create;var{getPrototypeOf:Kr,defineProperty:cG,getOwnPropertyNames:Yr}=Object;var zr=Object.prototype.hasOwnProperty;function Vr($){return this[$]}var Wr,qr,Gr=($,Z,Q)=>{var X=$!=null&&typeof $==="object";if(X){var J=Z?Wr??=new WeakMap:qr??=new WeakMap,K=J.get($);if(K)return K}Q=$!=null?Jr(Kr($)):{};let Y=Z||!$||!$.__esModule?cG(Q,"default",{value:$,enumerable:!0}):Q;for(let z of Yr($))if(!zr.call(Y,z))cG(Y,z,{get:Vr.bind($,z),enumerable:!0});if(X)J.set($,Y);return Y};var AK=($,Z)=>()=>(Z||$((Z={exports:{}}).exports,Z),Z.exports);var Hr=($)=>$;function Br($,Z){this[$]=Hr.bind(null,Z)}var R0=($,Z)=>{for(var Q in Z)cG($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:Br.bind(Z,Q)})};var v=($,Z)=>()=>($&&(Z=$($=0)),Z);var x4=import.meta.require;var aT={};R0(aT,{lokiDir:()=>T0,homeLokiDir:()=>m7,findRepoRootForVersion:()=>iG,REPO_ROOT:()=>i0});import{resolve as S4,dirname as lG}from"path";import{fileURLToPath as Ur}from"url";import{existsSync as CK}from"fs";import{homedir as Or}from"os";function Nr(){let $=iT;for(let Z=0;Z<6;Z++){if(CK(S4($,"VERSION"))&&CK(S4($,"autonomy/run.sh")))return $;let Q=lG($);if(Q===$)break;$=Q}return S4(iT,"..","..","..")}function iG($){let Z=$;for(let Q=0;Q<6;Q++){if(CK(S4(Z,"VERSION"))&&CK(S4(Z,"autonomy/run.sh")))return Z;let X=lG(Z);if(X===Z)break;Z=X}return S4($,"..","..","..")}function T0(){return process.env.LOKI_DIR??S4(process.cwd(),".loki")}function m7(){return S4(Or(),".loki")}var iT,i0;var J8=v(()=>{iT=lG(Ur(import.meta.url));i0=Nr()});import{readFileSync as Mr}from"fs";import{resolve as jr,dirname as Lr}from"path";import{fileURLToPath as Ar}from"url";function b4(){if(u7!==null)return u7;let $="10.5.25";if(typeof $==="string"&&$.length>0)return u7=$,u7;try{let Z=Lr(Ar(import.meta.url)),Q=iG(Z);u7=Mr(jr(Q,"VERSION"),"utf-8").trim()}catch{u7="unknown"}return u7}var u7=null;var h$=v(()=>{J8()});var $D={};R0($D,{runOrThrow:()=>fr,run:()=>D0,readStreamCapped:()=>TK,commandVersion:()=>hr,commandExists:()=>O9,ShellError:()=>oG,MAX_STDOUT_BYTES:()=>eT});async function TK($,Z=eT){let Q=$.getReader(),X=new TextDecoder,J="",K=0;try{while(K<Z){let{done:Y,value:z}=await Q.read();if(Y)break;if(!z)continue;if(K+=z.byteLength,K>Z){let V=z.byteLength-(K-Z);J+=X.decode(z.subarray(0,V),{stream:!0});break}J+=X.decode(z,{stream:!0})}J+=X.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return J}async function D0($,Z={}){let Q=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:Z.env?{...process.env,...Z.env}:process.env,cwd:Z.cwd}),X,J;if(Z.timeoutMs&&Z.timeoutMs>0)X=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}J=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},Z.timeoutMs);try{let[K,Y,z]=await Promise.all([TK(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:K,stderr:Y,exitCode:z}}finally{if(X)clearTimeout(X);if(J)clearTimeout(J)}}async function fr($,Z={}){let Q=await D0($,Z);if(Q.exitCode!==0)throw new oG(`command failed (${Q.exitCode}): ${$.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function O9($){let Z=vr($),Q=await D0(["sh","-c",`command -v ${Z}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function vr($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function hr($,Z="--version"){if(!await O9($))return null;let X=await D0([$,Z],{timeoutMs:5000});if(X.exitCode!==0)return null;return((X.stdout||X.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var eT=16777216,oG;var J9=v(()=>{oG=class oG extends Error{message;exitCode;stdout;stderr;constructor($,Z,Q,X){super($);this.message=$;this.exitCode=Z;this.stdout=Q;this.stderr=X;this.name="ShellError"}}});function y4($){return gr?"":$}var gr,k0,P8,p0,XZ8,K8,L8,K9,c;var o5=v(()=>{gr=(process.env.NO_COLOR??"").length>0;k0=y4("\x1B[0;31m"),P8=y4("\x1B[0;32m"),p0=y4("\x1B[1;33m"),XZ8=y4("\x1B[0;34m"),K8=y4("\x1B[0;36m"),L8=y4("\x1B[1m"),K9=y4("\x1B[2m"),c=y4("\x1B[0m")});import{accessSync as nr,constants as sr,existsSync as rr,statSync as tr}from"fs";async function n5(){if(g$!==void 0)return g$;let $="/opt/homebrew/bin/python3.12";if(rr($))return g$=$,$;let Z=await O9("python3.12");if(Z)return g$=Z,Z;let Q=await O9("python3");return g$=Q,Q}async function T6($,Z={}){let Q=await n5();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return D0([Q,"-c",$],Z)}async function XD(){let $=(process.env.PATH??"").split(":").filter((Z)=>Z.startsWith("/"));for(let Z of[...$t,...$.map((Q)=>`${Q}/python3`)])try{if(!tr(Z).isFile())continue;if(nr(Z,sr.X_OK),(await D0([Z,"-I","-S","-c",""],{timeoutMs:1e4})).exitCode===0)return Z}catch{}return null}var g$,er,$t;var D6=v(()=>{J9();er=["/usr/bin/python3","/bin/python3"],$t=er});var CD={};R0(CD,{runStatus:()=>Ft});import{existsSync as Y9,readFileSync as W2,readdirSync as BD,statSync as UD}from"fs";import{resolve as u8,basename as Nt}from"path";import{homedir as Mt}from"os";function OD($){let Z=Math.trunc($);if(Z>=1e6)return`${(Math.trunc(Z/1e6*10)/10).toFixed(1)}M`;if(Z>=1000)return`${(Math.trunc(Z/1000*10)/10).toFixed(1)}K`;return String(Z)}function ND($,Z,Q){if(Z===0)return null;let X=Math.trunc($*100/Z),J=Math.trunc($*IK/Z);if(J>IK)J=IK;let K=IK-J,Y=P8;if(X>=80)Y=k0;else if(X>=50)Y=p0;let z="=".repeat(Math.max(0,J))+" ".repeat(Math.max(0,K)),V=OD($),W=OD(Z);return` ${L8}${Q}${c} ${Y}[${z}]${c} ${X}% (${V} / ${W})`}async function Lt(){if(await O9("jq"))return!0;return process.stdout.write(`${k0}Error: jq is required but not installed.${c}
|
|
3
3
|
`),process.stdout.write(`Install with:
|
|
4
4
|
`),process.stdout.write(` brew install jq (macOS)
|
|
5
5
|
`),process.stdout.write(` apt install jq (Debian/Ubuntu)
|
|
@@ -1568,4 +1568,4 @@ Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
|
|
|
1568
1568
|
`),2}case"start":{let{runStart:X}=await Promise.resolve().then(() => (Va(),za));return X(Q)}case"engine10":{let{runEngine10:X}=await Promise.resolve().then(() => (Ga(),qa)),{registryLoader:J}=await Promise.resolve().then(() => (zG(),ns));return X(Q,J)}default:return process.stderr.write(`Unknown command: ${Z}
|
|
1569
1569
|
`),process.stderr.write(ss),2}}GD();process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var g$8=await h$8(Bun.argv.slice(2));process.exit(g$8);
|
|
1570
1570
|
|
|
1571
|
-
//# debugId=
|
|
1571
|
+
//# debugId=BE51968F5E852F218D55DDF00ACF1B5F
|
package/mcp/__init__.py
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loki-mode",
|
|
3
3
|
"mcpName": "io.github.asklokesh/loki-mode",
|
|
4
|
-
"version": "10.5.
|
|
4
|
+
"version": "10.5.25",
|
|
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",
|
|
@@ -135,6 +135,7 @@
|
|
|
135
135
|
],
|
|
136
136
|
"optionalDependencies": {
|
|
137
137
|
"@anthropic-ai/claude-agent-sdk": "0.3.283",
|
|
138
|
+
"bun": "1.4.2",
|
|
138
139
|
"@opentelemetry/api": "^1.9.1",
|
|
139
140
|
"@opentelemetry/exporter-trace-otlp-http": "^0.221.0",
|
|
140
141
|
"@opentelemetry/sdk-trace-base": "^2.10.0",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "loki-mode",
|
|
4
4
|
"displayName": "Loki Mode",
|
|
5
|
-
"version": "10.5.
|
|
5
|
+
"version": "10.5.25",
|
|
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-
|
|
1
|
+
import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-Bf_yp-ka.js";import{B as C}from"./Button-fW3YlMPF.js";import{T as $e}from"./trending-up-CYNQ9vY-.js";import{C as z}from"./clock-C7wfh0WZ.js";import{A as Be,U as ue,M as De}from"./Avatar-CaQtzthw.js";import{A as J}from"./activity-BwzYTinZ.js";import{R as pe}from"./refresh-cw-CiKOB-AH.js";import{G as ze}from"./globe-CQs61CBR.js";import{C as Le}from"./chevron-left-CJB72p7S.js";import{C as je}from"./check-BkUbott-.js";import{D as Y}from"./dollar-sign-C1GC_4Gf.js";import{U as Te}from"./user-MOQxScJS.js";import{D as Me}from"./database-6uWPD9SM.js";import{L as Ue}from"./lock-CHVfJ2Ec.js";import{S as Re}from"./scroll-text-BkVFxR9Q.js";import{S as Ie}from"./shield-alert-DD6z7kMY.js";/**
|
|
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-
|
|
1
|
+
import{j as e}from"./index-Bf_yp-ka.js";import{C as r}from"./clock-C7wfh0WZ.js";import{C as a}from"./circle-alert-ZkCFp9P0.js";import{C as l}from"./check-BkUbott-.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as p,j as t}from"./index-
|
|
1
|
+
import{r as p,j as t}from"./index-Bf_yp-ka.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
|
|
@@ -1,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-
|
|
1
|
+
import{c as $,r as l,j as e,G as we,Q as Se,F as Ce,h as Re,T as U,Z as Ee,a as S,V as Me,S as $e,Y as Te,X as Pe,P as ie,i as Ae,g as ze,C as Ie,l as Le,N as I,J as _e,K as De,O as Fe,u as Oe}from"./index-Bf_yp-ka.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-B5WNaTbp.js";import{C as qe,F as Ge,M as Ue,H as Ke,a as We,G as Ve,T as Qe}from"./thumbs-up-pw5NDACS.js";import{C as oe}from"./check-BkUbott-.js";import{C as Ye}from"./clock-C7wfh0WZ.js";import{D as Xe}from"./dollar-sign-C1GC_4Gf.js";import{U as Ze}from"./upload-Blr76ubG.js";import{L as V}from"./loader-circle-BfVRhTkt.js";/**
|
|
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-DtLzMLmc.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-Bf_yp-ka.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
|
package/web-app/dist/assets/{EvidenceReceiptPanel-pd499gha.js → EvidenceReceiptPanel-CPGCtoP-.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as l,a as x,j as e}from"./index-
|
|
1
|
+
import{r as l,a as x,j as e}from"./index-Bf_yp-ka.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
|
|
@@ -1,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-
|
|
1
|
+
import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-Bf_yp-ka.js";import{B as N}from"./Button-fW3YlMPF.js";import{C as y}from"./thumbs-up-pw5NDACS.js";import{R as S}from"./refresh-cw-CiKOB-AH.js";import{C as z}from"./circle-alert-ZkCFp9P0.js";import{U as D}from"./user-MOQxScJS.js";import{L as G}from"./loader-circle-BfVRhTkt.js";import{R as T}from"./rotate-ccw-BqyKlVyu.js";/**
|
|
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-
|
|
1
|
+
import{c as I,r as c,a as b,j as e,G as me,A as ue,S as Z,k as ee,m as pe,h as he,p as fe,X as te,M as be}from"./index-Bf_yp-ka.js";import{B as y}from"./Button-fW3YlMPF.js";import{C as ge}from"./chevron-left-CJB72p7S.js";import{G as P}from"./thumbs-up-pw5NDACS.js";import{R as $}from"./refresh-cw-CiKOB-AH.js";import{C as Ne}from"./circle-alert-ZkCFp9P0.js";import{L as Q,S as je}from"./ProjectPage-Chlxfsb1.js";import{S as se}from"./shield-alert-DD6z7kMY.js";import{F as ye}from"./file-code-corner-XiJnJDoy.js";import{C as V}from"./clock-C7wfh0WZ.js";import{C as re}from"./check-BkUbott-.js";import"./ErrorBoundary-B5WNaTbp.js";import"./TerminalOutput-Dl7F0H0d.js";import"./lock-CHVfJ2Ec.js";import"./package-DpVxPE51.js";import"./file-plus-BaN2vTKi.js";import"./activity-BwzYTinZ.js";import"./scroll-text-BkVFxR9Q.js";import"./bot-D0QOEr2j.js";import"./loader-circle-BfVRhTkt.js";import"./hammer-9VgifcL2.js";import"./dollar-sign-C1GC_4Gf.js";import"./globe-CQs61CBR.js";import"./trash-2-BSh9aztG.js";import"./upload-Blr76ubG.js";import"./plus-BvPWfH2l.js";import"./rotate-ccw-BqyKlVyu.js";import"./code-xml-D4Bknj7L.js";import"./trending-up-CYNQ9vY-.js";import"./layers-D4Vw8Mbi.js";import"./trending-down-Cqo5izHb.js";import"./server-gXecxW5O.js";/**
|
|
2
2
|
* @license lucide-react v0.577.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|