loki-mode 9.49.3 → 9.50.0
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/.github/workflows/loki-issue-to-pr.yml +1 -1
- package/README.md +2 -2
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/lib/proof-verify.py +4 -2
- package/dashboard/__init__.py +1 -1
- package/dashboard/server.py +21 -8
- package/docs/INSTALLATION.md +1 -1
- package/docs/P0-SWEEP-PLAN.md +1 -1
- package/docs/cursor-comparison.md +1 -1
- package/loki-ts/dist/loki.js +240 -240
- package/mcp/__init__.py +1 -1
- package/package.json +1 -1
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/references/memory-system.md +6 -1
- package/references/tool-orchestration.md +6 -1
- package/skills/quality-gates.md +1 -1
- package/skills/troubleshooting.md +25 -6
- package/tests/detect-mock-problems.sh +17 -1
- package/web-app/dist/assets/{AdminPage-BA6etdwL.js → AdminPage-y6_b2Xo4.js} +1 -1
- package/web-app/dist/assets/{Avatar-CAtbcD23.js → Avatar-BFPkXhIJ.js} +1 -1
- package/web-app/dist/assets/{Badge-sb_JbKl0.js → Badge-BF3mhT57.js} +1 -1
- package/web-app/dist/assets/{Button-BamXbIWa.js → Button-BDp9aJ9q.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-CUYizBtG.js → CockpitPage-5TKICCoA.js} +1 -1
- package/web-app/dist/assets/{ComparePage-BnmNTggM.js → ComparePage-BSuNsUHy.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BjX4_KOW.js → ErrorBoundary-ut3wrUmu.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-Bq6pmNUw.js → EvidenceReceiptPanel-CcaBwEI-.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-DD8c6RVj.js → GitHubIssuesPanel-DJeYgzAa.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-4NawTXRl.js → GitHubPRsPanel-DurZgSaj.js} +1 -1
- package/web-app/dist/assets/{HomePage-DTREi8OE.js → HomePage-Bs451LAy.js} +1 -1
- package/web-app/dist/assets/{LoginPage-DavfeQxC.js → LoginPage-HeRGJeZy.js} +1 -1
- package/web-app/dist/assets/{MagicPage-BIbTFlwh.js → MagicPage-CUKrqsZs.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-Cn3UPKpU.js → MetricsPage-DvY1csgz.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-BVs_nuBv.js → NotFoundPage-BZDZ-B77.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-CLplvOHe.js → ProjectPage-CqHkEZkl.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-BBFzBBG_.js → ProjectsPage-CLvCK1Y8.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-WPsJ_K9r.js → SettingsPage-DP7OmdwP.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-ZaLaJl5J.js → ShowcasePage-BGS2jTGH.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-CCORP-uG.js → SystemSettingsPage-P_rlLh0x.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-B6IGT_K2.js → TeamsPage-DxtBDcBC.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-RrYYC3CM.js → TemplatesPage-5e-faH3W.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-CeTvKnkl.js → TerminalOutput-togzv9Zl.js} +1 -1
- package/web-app/dist/assets/{activity-CySdOdDP.js → activity-Dreyb_Kr.js} +1 -1
- package/web-app/dist/assets/{bell-BHdr5yat.js → bell-DWH0drES.js} +1 -1
- package/web-app/dist/assets/{bot-BaB4q_4m.js → bot-78MoCuDl.js} +1 -1
- package/web-app/dist/assets/{check-BAgbzVrK.js → check-ikfylPst.js} +1 -1
- package/web-app/dist/assets/{chevron-left-CrVUY29C.js → chevron-left-DXUqkd8J.js} +1 -1
- package/web-app/dist/assets/{circle-alert-YrWgH49w.js → circle-alert-Da74VO8P.js} +1 -1
- package/web-app/dist/assets/{clock-DN8LAN-0.js → clock-mlGCFq8l.js} +1 -1
- package/web-app/dist/assets/{cloud-D6C4b1KY.js → cloud-B_Y5ZrIO.js} +1 -1
- package/web-app/dist/assets/{code-xml-xBWyKfux.js → code-xml-Bbom7YWV.js} +1 -1
- package/web-app/dist/assets/{database-BYqcS6kn.js → database-CLcofiVp.js} +1 -1
- package/web-app/dist/assets/{dollar-sign--WOh4k_m.js → dollar-sign-C5mkjXIM.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-B0rLPjW1.js → file-code-corner-CVrkaOQP.js} +1 -1
- package/web-app/dist/assets/{file-plus-BNhUQ1TQ.js → file-plus-BV9240gX.js} +1 -1
- package/web-app/dist/assets/{folder-open-DliiOgFl.js → folder-open-D_6yV78G.js} +1 -1
- package/web-app/dist/assets/{globe-BV-hx0u_.js → globe-aZ0Zso4I.js} +1 -1
- package/web-app/dist/assets/{hammer-DhmP4GLw.js → hammer-EgOQNukG.js} +1 -1
- package/web-app/dist/assets/index-BSgmPwC0.css +1 -0
- package/web-app/dist/assets/{index-x0TESFYr.js → index-DvZ0Kk2x.js} +2 -2
- package/web-app/dist/assets/{layers-DXWDMSYj.js → layers-BOVKmepE.js} +1 -1
- package/web-app/dist/assets/{lightbulb-PBw6hhLS.js → lightbulb-DdASgqOG.js} +1 -1
- package/web-app/dist/assets/{loader-circle-B7KiGAVU.js → loader-circle-0K8yLgHl.js} +1 -1
- package/web-app/dist/assets/{lock-BUTRYdDQ.js → lock-XzlDMy8M.js} +1 -1
- package/web-app/dist/assets/{mail-DaLiNrPb.js → mail-COu670_W.js} +1 -1
- package/web-app/dist/assets/{minus-DB_hlGEk.js → minus-bQpUt9ff.js} +1 -1
- package/web-app/dist/assets/{package-CymmXoiQ.js → package-BtXTKusI.js} +1 -1
- package/web-app/dist/assets/{plus-Cp4AO4I2.js → plus-PxeiD8ju.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-ygYTmZTE.js → refresh-cw-CjqzYczt.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-Ba3QxM9K.js → rotate-ccw-CY0os4DH.js} +1 -1
- package/web-app/dist/assets/{save-DPm96BnR.js → save-v8qep5cY.js} +1 -1
- package/web-app/dist/assets/{server-BapOz_vf.js → server-pIIs9vNp.js} +1 -1
- package/web-app/dist/assets/{shield-alert-DYzfVqWS.js → shield-alert-CsDqKXwA.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-DxOTplej.js → thumbs-up-CAh3HVzH.js} +1 -1
- package/web-app/dist/assets/{trash-2-Br8dh_6B.js → trash-2-Dt6urTyY.js} +1 -1
- package/web-app/dist/assets/{trending-down-CxSP6MU3.js → trending-down-DrtBd_C9.js} +1 -1
- package/web-app/dist/assets/{trending-up-CXx0ywZb.js → trending-up-D-DbCHXm.js} +1 -1
- package/web-app/dist/assets/{upload-CpEO3qNc.js → upload-D4l6DCOt.js} +1 -1
- package/web-app/dist/assets/{usePolling-BuzXwjmC.js → usePolling-D0aoTX80.js} +1 -1
- package/web-app/dist/assets/{user-DUUYT47B.js → user-BQf_XJO_.js} +1 -1
- package/web-app/dist/index.html +2 -2
- package/web-app/dist/assets/index-D98GzaW8.css +0 -1
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": "9.
|
|
4
|
+
"version": "9.50.0",
|
|
5
5
|
"description": "Loki Mode by Autonomi. Autonomous spec-to-product system: takes a PRD, GitHub issue, OpenAPI/JSON/YAML, or one-line brief to a deployed app via the RARV-C closure loop with 8 quality gates. Provider-agnostic (Claude Code, OpenAI Codex, Cline, Aider, opencode).",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"agent",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "loki-mode",
|
|
4
4
|
"displayName": "Loki Mode",
|
|
5
|
-
"version": "9.
|
|
5
|
+
"version": "9.50.0",
|
|
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",
|
|
@@ -1255,7 +1255,12 @@ MemEvolve analyzes how memories are located and retrieved at inference time.
|
|
|
1255
1255
|
```
|
|
1256
1256
|
|
|
1257
1257
|
2. **Temporal Index:** Date-based episodic retrieval
|
|
1258
|
-
- `.loki/memory/episodic
|
|
1258
|
+
- Episodes are stored as `.loki/memory/episodic/<YYYY-MM-DD>/task-<id>.json`
|
|
1259
|
+
(`memory/storage.py:477,521`), so the DATE DIRECTORY is what provides
|
|
1260
|
+
temporal navigation
|
|
1261
|
+
- The index layer itself is `index.json` at the memory ROOT, not under
|
|
1262
|
+
`episodic/` (`memory/engine.py:151`). `memory/cross_project.py:67` walks
|
|
1263
|
+
the store recursively and explicitly SKIPS `index.json` sidecars
|
|
1259
1264
|
- Enables queries like "what happened last week"
|
|
1260
1265
|
|
|
1261
1266
|
3. **Keyword Search:** Skill matching by keywords
|
|
@@ -601,7 +601,12 @@ VERIFY:
|
|
|
601
601
|
|
|
602
602
|
## Key Metrics Dashboard
|
|
603
603
|
|
|
604
|
-
Track these metrics
|
|
604
|
+
Track these metrics using the shape below. NOTE: this is the reference schema
|
|
605
|
+
for the pattern, NOT a file Loki writes -- nothing in this repository produces
|
|
606
|
+
`.loki/metrics/dashboard.json`. The metrics that ARE written per run are
|
|
607
|
+
`.loki/metrics/efficiency/iteration-<N>.json` (`autonomy/run.sh:8303`),
|
|
608
|
+
`.loki/metrics/budget.json`, and `.loki/metrics/trust-events.jsonl`
|
|
609
|
+
(`autonomy/run.sh:2620`).
|
|
605
610
|
|
|
606
611
|
```json
|
|
607
612
|
{
|
package/skills/quality-gates.md
CHANGED
|
@@ -37,7 +37,7 @@ recompute it.
|
|
|
37
37
|
| 5 | Mock Integrity Detector | Tautological assertions, internal-mock ratio, tests that do not import source (`tests/detect-mock-problems.sh`); HIGH blocks | Semantic correctness of mocks (whether a mock faithfully models the real dependency) | Yes (HIGH blocks) | `LOKI_GATE_MOCK=false` |
|
|
38
38
|
| 6 | Test Mutation Detector | Assertion-value churn alongside implementation changes (test-fitting), low assertion density (`tests/detect-test-mutations.sh`); HIGH blocks | Logically-correct-but-weak assertions | Yes (HIGH blocks) | `LOKI_GATE_MUTATION=false` |
|
|
39
39
|
| 7 | Documentation Coverage | README presence, docs freshness within 10 commits, API docs for exported symbols in packages | Whether the docs are accurate or useful | Yes | `LOKI_GATE_DOC_COVERAGE=false` |
|
|
40
|
-
| 8 | Magic Modules Debate | Spec-vs-implementation debate findings on generated Magic Modules
|
|
40
|
+
| 8 | Magic Modules Debate | Spec-vs-implementation debate findings on generated Magic Modules | Issues outside the Magic Modules debate scope | **No, advisory by default on both routes.** bash blocks only with `LOKI_GATE_MAGIC_DEBATE_BLOCKING=true` (`autonomy/run.sh:12925`); Bun self-skips unless `LOKI_GATE_MAGIC_DEBATE="true"` (`loki-ts/src/runner/quality_gates.ts:2520`). Measured before this was flipped advisory: 3 of 4 personas returned block on a deliberately thorough spec, so enforcing it would have blocked nearly every build. | `LOKI_GATE_MAGIC_DEBATE=false` |
|
|
41
41
|
|
|
42
42
|
The three advisory default-on gates (LSP diagnostics, semantic
|
|
43
43
|
test-authenticity, invariant/property) are documented in their own table under
|
|
@@ -150,14 +150,27 @@ rate_limit_handling:
|
|
|
150
150
|
circuit_breaker:
|
|
151
151
|
threshold: 3 failures in 60s
|
|
152
152
|
cooldown: 300s
|
|
153
|
-
state_file: ".loki/state/circuit-breakers.json"
|
|
154
153
|
```
|
|
155
154
|
|
|
156
155
|
### Circuit Breaker System
|
|
157
156
|
|
|
158
157
|
The circuit breaker prevents cascading failures by temporarily disabling operations that are repeatedly failing.
|
|
159
158
|
|
|
160
|
-
|
|
159
|
+
Loki ships three circuit breakers, and all of them hold state IN MEMORY for the
|
|
160
|
+
life of the run. None persists to a state file:
|
|
161
|
+
|
|
162
|
+
- `council_circuit_breaker_triggered()` (`autonomy/completion-council.sh:397`) --
|
|
163
|
+
stagnation and repeated done-signals
|
|
164
|
+
- the repeated-signature breaker (`loki-ts/src/runner/recovery_policy.ts:91`)
|
|
165
|
+
- the budget breaker (`loki-ts/src/runner/budget.ts:296`,
|
|
166
|
+
`check_budget_limit()` in `autonomy/run.sh`), which writes
|
|
167
|
+
`.loki/metrics/budget.json` and `.loki/signals/BUDGET_EXCEEDED`
|
|
168
|
+
|
|
169
|
+
#### Reference schema (DESIGN PATTERN -- not an artifact Loki writes)
|
|
170
|
+
|
|
171
|
+
The shape below describes the pattern for an implementer. No code in this
|
|
172
|
+
repository reads or writes `.loki/state/circuit-breakers.json`; do not expect
|
|
173
|
+
the file to exist at runtime.
|
|
161
174
|
|
|
162
175
|
```json
|
|
163
176
|
{
|
|
@@ -310,8 +323,12 @@ The circuit breaker prevents cascading failures by temporarily disabling operati
|
|
|
310
323
|
When a circuit breaker is OPEN:
|
|
311
324
|
|
|
312
325
|
1. **Check State**
|
|
326
|
+
|
|
327
|
+
Breaker state is in memory, so read it from the run's own output rather than
|
|
328
|
+
a file. The budget breaker is the one with durable artifacts:
|
|
313
329
|
```bash
|
|
314
|
-
cat .loki/
|
|
330
|
+
cat .loki/metrics/budget.json # budget_used vs the cap
|
|
331
|
+
ls .loki/signals/BUDGET_EXCEEDED # present once the cap is breached
|
|
315
332
|
```
|
|
316
333
|
|
|
317
334
|
2. **Calculate Wait Time**
|
|
@@ -461,7 +478,9 @@ A task should be permanently abandoned when:
|
|
|
461
478
|
| Scope no longer relevant | Project direction changed |
|
|
462
479
|
| Human explicitly abandons | Documented decision to deprioritize |
|
|
463
480
|
|
|
464
|
-
When abandoning, move task to `.loki/queue/
|
|
481
|
+
When abandoning, move the task to `.loki/queue/dead-letter.json` with the reason
|
|
482
|
+
documented. That is the real terminal queue (`autonomy/run.sh:6536`,
|
|
483
|
+
`dashboard/server.py:2348`); there is no `abandoned.json`.
|
|
465
484
|
|
|
466
485
|
### Recovery Strategies
|
|
467
486
|
|
|
@@ -470,7 +489,7 @@ When abandoning, move task to `.loki/queue/abandoned.json` with reason documente
|
|
|
470
489
|
| `retry_with_simpler_approach` | Complex implementation failed multiple times | Break into smaller subtasks, reduce scope, use simpler patterns |
|
|
471
490
|
| `dependency_blocked` | Task needs output from another task that failed | Wait for dependency resolution, check daily |
|
|
472
491
|
| `requires_human_review` | Security decision, unclear spec, or irreversible action | Log to `.loki/escalations/` and notify, do not retry |
|
|
473
|
-
| `permanent_abandon` | Met abandon criteria above | Move to `
|
|
492
|
+
| `permanent_abandon` | Met abandon criteria above | Move to `dead-letter.json`, document reason, move on |
|
|
474
493
|
|
|
475
494
|
### Human Escalation Triggers
|
|
476
495
|
|
|
@@ -523,7 +542,7 @@ Human decision on recovery path.
|
|
|
523
542
|
- Document recovery reason
|
|
524
543
|
- Reset failure_count if new approach
|
|
525
544
|
d. ELSE IF meets abandon criteria:
|
|
526
|
-
- Move to
|
|
545
|
+
- Move to dead-letter.json
|
|
527
546
|
- Document reason
|
|
528
547
|
e. ELSE IF needs human:
|
|
529
548
|
- Create escalation file
|
|
@@ -87,7 +87,16 @@ local_import_is_source() {
|
|
|
87
87
|
import_base="$test_dir/$spec"
|
|
88
88
|
|
|
89
89
|
case "$leaf" in
|
|
90
|
-
|
|
90
|
+
# TS NodeNext resolution: a spec written "./foo.js" (or .jsx/.mjs/.cjs)
|
|
91
|
+
# commonly names a real ".ts"/".tsx"/".mts"/".cts" source file -- the
|
|
92
|
+
# extension in the specifier is the post-build one, not the on-disk one.
|
|
93
|
+
# Try the literal path first, then its TS sibling, before falling
|
|
94
|
+
# through to "not a source import".
|
|
95
|
+
*.js) [ -f "$import_base" ] && return 0; [ -f "${import_base%.js}.ts" ] && return 0 ;;
|
|
96
|
+
*.jsx) [ -f "$import_base" ] && return 0; [ -f "${import_base%.jsx}.tsx" ] && return 0 ;;
|
|
97
|
+
*.mjs) [ -f "$import_base" ] && return 0; [ -f "${import_base%.mjs}.mts" ] && return 0 ;;
|
|
98
|
+
*.cjs) [ -f "$import_base" ] && return 0; [ -f "${import_base%.cjs}.cts" ] && return 0 ;;
|
|
99
|
+
*.ts|*.tsx|*.mts|*.cts|*.vue|*.svelte)
|
|
91
100
|
[ -f "$import_base" ] && return 0
|
|
92
101
|
;;
|
|
93
102
|
*.*) ;;
|
|
@@ -119,6 +128,11 @@ test_has_source_import() {
|
|
|
119
128
|
# does -- it is how a subprocess/E2E test points at the source it runs.
|
|
120
129
|
# Separate pattern (not an alternation) so the path stays BASH_REMATCH[1].
|
|
121
130
|
local cjs_resolve_re="require\.resolve[[:space:]]*\([[:space:]]*['\"](\.{1,2}/[^'\"]+)['\"]"
|
|
131
|
+
# `await import('./x.ts')` / `import('./x.ts')` -- the dynamic-import form,
|
|
132
|
+
# used to load the module under test after mock.module() has been set up
|
|
133
|
+
# (bun:test's documented pattern for stubbing an import before it resolves).
|
|
134
|
+
# Same relative-path capture as the static forms above.
|
|
135
|
+
local dynamic_import_re="import[[:space:]]*\([[:space:]]*['\"](\.{1,2}/[^'\"]+)['\"]"
|
|
122
136
|
# A test that hands a literal source path to a child process exercises the
|
|
123
137
|
# real code end-to-end without ever naming it in an import. Gated on the
|
|
124
138
|
# file importing child_process, because this flag unlocks a deliberately
|
|
@@ -212,6 +226,8 @@ test_has_source_import() {
|
|
|
212
226
|
spec="${BASH_REMATCH[1]}"
|
|
213
227
|
elif [[ "$line" =~ $cjs_re ]]; then
|
|
214
228
|
spec="${BASH_REMATCH[1]}"
|
|
229
|
+
elif [[ "$line" =~ $dynamic_import_re ]]; then
|
|
230
|
+
spec="${BASH_REMATCH[1]}"
|
|
215
231
|
elif [ "$has_subprocess" = true ] && [[ "$line" =~ $subproc_re ]]; then
|
|
216
232
|
spec="${BASH_REMATCH[1]}"
|
|
217
233
|
elif [ "$has_spawn_call" = true ] && [[ "$line" =~ $subproc_bare_re ]]; then
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as L,j as e,r as m,w as _,Z as X,n as Q,i as ee,b as R,F as ge,U as z,X as te,L as se,x as je,M as fe,T as G,S as be,m as ae,l as ne,y as ve,E as Ee,a0 as Ne,a2 as re}from"./index-
|
|
1
|
+
import{c as L,j as e,r as m,w as _,Z as X,n as Q,i as ee,b as R,F as ge,U as z,X as te,L as se,x as je,M as fe,T as G,S as be,m as ae,l as ne,y as ve,E as Ee,a0 as Ne,a2 as re}from"./index-DvZ0Kk2x.js";import{B as w}from"./Button-BDp9aJ9q.js";import{T as ye}from"./trending-up-D-DbCHXm.js";import{C as I}from"./clock-mlGCFq8l.js";import{A as ke,U as ie}from"./Avatar-BFPkXhIJ.js";import{A as H}from"./activity-Dreyb_Kr.js";import{R as le}from"./refresh-cw-CjqzYczt.js";import{G as Ae}from"./globe-aZ0Zso4I.js";import{C as we}from"./chevron-left-DXUqkd8J.js";import{M as Ce}from"./mail-COu670_W.js";import{C as ce}from"./check-ikfylPst.js";import{D as W}from"./dollar-sign-C5mkjXIM.js";import{U as Se}from"./user-BQf_XJO_.js";import{D as De}from"./database-CLcofiVp.js";import{L as Fe}from"./lock-XzlDMy8M.js";import{H as Me}from"./hammer-EgOQNukG.js";import{S as Be}from"./shield-alert-CsDqKXwA.js";import{S as $e}from"./server-pIIs9vNp.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-DvZ0Kk2x.js";import{C as r}from"./clock-mlGCFq8l.js";import{C as a}from"./circle-alert-Da74VO8P.js";import{C as l}from"./check-ikfylPst.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-DvZ0Kk2x.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 i,j as e,G as fe,Q as ge,F as be,i as ke,T as G,Z as ve,a as j,S as ye,V as je,X as Ne,P as ae,k as we,h as Se,m as Ce,Y as Re,N as I,J as Me,K as Te,O as $e,u as Ee}from"./index-
|
|
1
|
+
import{c as $,r as i,j as e,G as fe,Q as ge,F as be,i as ke,T as G,Z as ve,a as j,S as ye,V as je,X as Ne,P as ae,k as we,h as Se,m as Ce,Y as Re,N as I,J as Me,K as Te,O as $e,u as Ee}from"./index-DvZ0Kk2x.js";import{P as K,S as Pe,E as Ae}from"./ErrorBoundary-ut3wrUmu.js";import{C as ze,F as Ie,H as _e,a as De,G as Fe,T as Le}from"./thumbs-up-CAh3HVzH.js";import{C as re}from"./check-ikfylPst.js";import{C as Oe}from"./clock-mlGCFq8l.js";import{D as He}from"./dollar-sign-C5mkjXIM.js";import{M as Be}from"./minus-bQpUt9ff.js";import{U as qe}from"./upload-D4l6DCOt.js";import{L as W}from"./loader-circle-0K8yLgHl.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 i,j as e}from"./index-x0TESFYr.js";function p({value:r,prefix:t="",suffix:s=""}){const[n,a]=i.useState(0),o=i.useRef(0);return i.useEffect(()=>{const c=o.current,d=r-c;if(d===0)return;const x=600,h=performance.now();function u(l){const b=l-h,f=Math.min(b/x,1),g=1-Math.pow(1-f,3),j=Math.round(c+d*g);a(j),o.current=j,f<1&&requestAnimationFrame(u)}requestAnimationFrame(u)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,n.toLocaleString(),s]})}function N(){const[r,t]=i.useState(5),[s,n]=i.useState(30),[a,o]=i.useState(75),x=Math.round(r*s*.4*4.33),h=Math.round(x*a),u=1/0;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=>n(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:["$",a,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:a,onChange:l=>o(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-3 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(p,{value:x,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(p,{value:h,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Cost saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#36342E]",children:u===1/0?"Free":e.jsx(p,{value:u,suffix:"%"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"ROI (self-hosted)"})]})]}),e.jsx("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:["With Loki Mode, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[x.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",h.toLocaleString()]})," ","per month."]})})]})]})}function y({count:r=5}){return e.jsx("div",{className:"flex gap-0.5",children:Array.from({length:r}).map((t,s)=>e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"#553DE9",xmlns:"http://www.w3.org/2000/svg",children:e.jsx("path",{d:"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"})},s))})}function w(){return e.jsx("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"text-[#553DE9]/15",children:e.jsx("path",{d:"M3 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1zm12 0c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z",fill:"currentColor"})})}function k({quote:r,name:t,role:s,company:n,avatar:a,rating:o=5}){const c=t.split(" ").map(d=>d[0]).join("").toUpperCase().slice(0,2);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 flex flex-col gap-4 shadow-sm hover:shadow-md transition-shadow",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsx(w,{}),e.jsx(y,{count:o})]}),e.jsxs("p",{className:"text-[#36342E] text-sm leading-relaxed flex-1",children:['"',r,'"']}),e.jsxs("div",{className:"flex items-center gap-3 pt-2 border-t border-[#ECEAE3]",children:[a?e.jsx("img",{src:a,alt:"",className:"w-10 h-10 rounded-full object-cover"}):e.jsx("div",{className:"w-10 h-10 rounded-full bg-gradient-to-br from-[#553DE9] to-[#7B6BEF] flex items-center justify-center text-white text-sm font-bold flex-shrink-0",children:c}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-semibold text-[#36342E]",children:t}),e.jsxs("p",{className:"text-xs text-[#6B6960]",children:[s,", ",n]})]})]})]})}const E=[{quote:"Loki Mode turned a weekend project into a production app in 45 minutes. The RARV cycle caught bugs I would have shipped. Easily 10x faster than writing everything by hand.",name:"Sarah Chen",role:"Full-Stack Developer",company:"Nimbus Labs"},{quote:"The quality gates are what sold me. Three blind reviewers, anti-sycophancy checks, severity blocking -- it catches issues that even our senior engineers miss in code review.",name:"Marcus Rivera",role:"CTO",company:"Forgepoint Systems"},{quote:"As a solo founder, Loki Mode is like having a senior engineering team on demand. I shipped our MVP in a day instead of two weeks. The autonomous iteration is the real game changer.",name:"Priya Sharma",role:"Founder",company:"Seedcraft"},{quote:"Self-hosted, no data leaves our network, and the multi-provider failover means we never hit rate limits. Exactly what our compliance team needed. Enterprise-ready out of the box.",name:"Daniel Okafor",role:"DevOps Lead",company:"Vaultline Security"}],v=[{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:"Gemini",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"9 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 C(){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 M(){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 m({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(C,{}):e.jsx(M,{})}const A=[{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:"9 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 S(){const r=[...new Set(v.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}`),v.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(m,{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(m,{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(m,{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(m,{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:A.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.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"What developers are saying"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:E.map(t=>e.jsx(k,{...t},t.name))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(N,{})})]})})}export{S as default};
|
|
1
|
+
import{r as i,j as e}from"./index-DvZ0Kk2x.js";function p({value:r,prefix:t="",suffix:s=""}){const[n,a]=i.useState(0),o=i.useRef(0);return i.useEffect(()=>{const c=o.current,d=r-c;if(d===0)return;const x=600,h=performance.now();function u(l){const b=l-h,f=Math.min(b/x,1),g=1-Math.pow(1-f,3),j=Math.round(c+d*g);a(j),o.current=j,f<1&&requestAnimationFrame(u)}requestAnimationFrame(u)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,n.toLocaleString(),s]})}function N(){const[r,t]=i.useState(5),[s,n]=i.useState(30),[a,o]=i.useState(75),x=Math.round(r*s*.4*4.33),h=Math.round(x*a),u=1/0;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=>n(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:["$",a,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:a,onChange:l=>o(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-3 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(p,{value:x,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(p,{value:h,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Cost saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#36342E]",children:u===1/0?"Free":e.jsx(p,{value:u,suffix:"%"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"ROI (self-hosted)"})]})]}),e.jsx("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:["With Loki Mode, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[x.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",h.toLocaleString()]})," ","per month."]})})]})]})}function y({count:r=5}){return e.jsx("div",{className:"flex gap-0.5",children:Array.from({length:r}).map((t,s)=>e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"#553DE9",xmlns:"http://www.w3.org/2000/svg",children:e.jsx("path",{d:"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"})},s))})}function w(){return e.jsx("svg",{width:"32",height:"32",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"text-[#553DE9]/15",children:e.jsx("path",{d:"M3 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1zm12 0c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z",fill:"currentColor"})})}function k({quote:r,name:t,role:s,company:n,avatar:a,rating:o=5}){const c=t.split(" ").map(d=>d[0]).join("").toUpperCase().slice(0,2);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 flex flex-col gap-4 shadow-sm hover:shadow-md transition-shadow",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsx(w,{}),e.jsx(y,{count:o})]}),e.jsxs("p",{className:"text-[#36342E] text-sm leading-relaxed flex-1",children:['"',r,'"']}),e.jsxs("div",{className:"flex items-center gap-3 pt-2 border-t border-[#ECEAE3]",children:[a?e.jsx("img",{src:a,alt:"",className:"w-10 h-10 rounded-full object-cover"}):e.jsx("div",{className:"w-10 h-10 rounded-full bg-gradient-to-br from-[#553DE9] to-[#7B6BEF] flex items-center justify-center text-white text-sm font-bold flex-shrink-0",children:c}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-semibold text-[#36342E]",children:t}),e.jsxs("p",{className:"text-xs text-[#6B6960]",children:[s,", ",n]})]})]})]})}const E=[{quote:"Loki Mode turned a weekend project into a production app in 45 minutes. The RARV cycle caught bugs I would have shipped. Easily 10x faster than writing everything by hand.",name:"Sarah Chen",role:"Full-Stack Developer",company:"Nimbus Labs"},{quote:"The quality gates are what sold me. Three blind reviewers, anti-sycophancy checks, severity blocking -- it catches issues that even our senior engineers miss in code review.",name:"Marcus Rivera",role:"CTO",company:"Forgepoint Systems"},{quote:"As a solo founder, Loki Mode is like having a senior engineering team on demand. I shipped our MVP in a day instead of two weeks. The autonomous iteration is the real game changer.",name:"Priya Sharma",role:"Founder",company:"Seedcraft"},{quote:"Self-hosted, no data leaves our network, and the multi-provider failover means we never hit rate limits. Exactly what our compliance team needed. Enterprise-ready out of the box.",name:"Daniel Okafor",role:"DevOps Lead",company:"Vaultline Security"}],v=[{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:"Gemini",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"9 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 C(){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 M(){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 m({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(C,{}):e.jsx(M,{})}const A=[{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:"9 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 S(){const r=[...new Set(v.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}`),v.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(m,{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(m,{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(m,{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(m,{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:A.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.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"What developers are saying"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:E.map(t=>e.jsx(k,{...t},t.name))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(N,{})})]})})}export{S as default};
|
package/web-app/dist/assets/{EvidenceReceiptPanel-Bq6pmNUw.js → EvidenceReceiptPanel-CcaBwEI-.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as d,a as x,j as e}from"./index-
|
|
1
|
+
import{r as d,a as x,j as e}from"./index-DvZ0Kk2x.js";const j={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"These receipt bytes are unaltered, and they were signed by the holder of the signing key.",notProven:"That the code is correct. 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 receipt is internally consistent with its own integrity hash.",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 integrity hash matches, so nothing is wrong with the contents.",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 recorded hash does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."}};function w(t){const n=t==null?void 0:t.verification;return!n||!n.hash?"unsigned":n.attestation||n.gpg_signature?"unchecked":"unsigned"}const b=[{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 N({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:b.map(({key:a,bar:s})=>{const i=t[a];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${a}`},a):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:b.map(({key:a,label:s,text:i})=>{const l=t[a];return l?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:l})," ",s.toLowerCase()]},a):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function o({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 y({proof:t}){var m,p,g,f;const[n,a]=d.useState(!1),[s,i]=d.useState(null),[l,c]=d.useState(null);d.useEffect(()=>{if(!n||s||l)return;let h=!1;return x.getProof(t.run_id).then(u=>{h||i(u)}).catch(u=>{h||c((u==null?void 0:u.message)||"could not load this receipt")}),()=>{h=!0}},[n,t.run_id,s,l]);const r=j[w(s)],v=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?r.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:()=>a(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?r.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline||t.run_id}),t.final_verdict&&e.jsx("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children: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:[l&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",l]}),!l&&!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(o,{label:"Run",value:s.run_id}),e.jsx(o,{label:"Generated",value:v}),e.jsx(o,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(o,{label:"Cost",value:typeof s.cost_usd=="number"?`$${s.cost_usd.toFixed(2)}`:"unknown"}),e.jsx(o,{label:"Files changed",value:typeof s.files_changed=="number"?String(s.files_changed):"unknown"}),((m=s.verification)==null?void 0:m.hash)&&e.jsx(o,{label:"Integrity hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${r.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:r.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),r.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),r.notProven]})]}),(((p=s.verification)==null?void 0:p.attestation)||((g=s.verification)==null?void 0:g.gpg_signature))&&e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself:"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(f=s.verification)!=null&&f.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 _(){const[t,n]=d.useState(null),[a,s]=d.useState(null),[i,l]=d.useState(null);return d.useEffect(()=>{let c=!1;return x.listProofs().then(r=>{c||n(r.proofs||[])}).catch(r=>{c||l((r==null?void 0:r.message)||"could not load receipts")}),x.proofsSummary().then(r=>{c||s(r)}).catch(()=>{}),()=>{c=!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…"}),a&&e.jsx(N,{summary:a}),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(c=>e.jsx(y,{proof:c},c.run_id))})]})}export{_ as E};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as M,r as o,a as C,j as e,n as P,J as w,N as f,a5 as B,M as R,m as A,E as H}from"./index-
|
|
1
|
+
import{c as M,r as o,a as C,j as e,n as P,J as w,N as f,a5 as B,M as R,m as A,E as H}from"./index-DvZ0Kk2x.js";import{B as v}from"./Button-BDp9aJ9q.js";import{C as k,G as q}from"./thumbs-up-CAh3HVzH.js";import{R as F}from"./refresh-cw-CjqzYczt.js";import{C as S}from"./circle-alert-Da74VO8P.js";import{U as D}from"./user-BQf_XJO_.js";import{R as T}from"./rotate-ccw-CY0os4DH.js";import{L as U}from"./loader-circle-0K8yLgHl.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 o,a as b,j as e,G as xe,A as me,S as Z,l as ee,n as ue,i as pe,b as he,X as te,M as fe}from"./index-
|
|
1
|
+
import{c as I,r as o,a as b,j as e,G as xe,A as me,S as Z,l as ee,n as ue,i as pe,b as he,X as te,M as fe}from"./index-DvZ0Kk2x.js";import{B as y}from"./Button-BDp9aJ9q.js";import{C as be}from"./chevron-left-DXUqkd8J.js";import{G as P}from"./thumbs-up-CAh3HVzH.js";import{R as L}from"./refresh-cw-CjqzYczt.js";import{C as ge}from"./circle-alert-Da74VO8P.js";import{L as V,S as Ne}from"./ProjectPage-CqHkEZkl.js";import{S as se}from"./shield-alert-CsDqKXwA.js";import{F as je}from"./file-code-corner-CVrkaOQP.js";import{C as H}from"./clock-mlGCFq8l.js";import{C as re}from"./check-ikfylPst.js";import"./ErrorBoundary-ut3wrUmu.js";import"./TerminalOutput-togzv9Zl.js";import"./lock-XzlDMy8M.js";import"./package-BtXTKusI.js";import"./file-plus-BV9240gX.js";import"./activity-Dreyb_Kr.js";import"./bot-78MoCuDl.js";import"./loader-circle-0K8yLgHl.js";import"./hammer-EgOQNukG.js";import"./dollar-sign-C5mkjXIM.js";import"./globe-aZ0Zso4I.js";import"./folder-open-D_6yV78G.js";import"./upload-D4l6DCOt.js";import"./plus-PxeiD8ju.js";import"./trash-2-Dt6urTyY.js";import"./rotate-ccw-CY0os4DH.js";import"./minus-bQpUt9ff.js";import"./save-v8qep5cY.js";import"./code-xml-Bbom7YWV.js";import"./trending-up-D-DbCHXm.js";import"./layers-BOVKmepE.js";import"./trending-down-DrtBd_C9.js";import"./server-pIIs9vNp.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 he,j as e,P as We,r as n,a as j,C as Ue,M as fe,R as re,u as ae,b as Ve,A as Qe,S as Ye,d as Ke,U as Ze,e as Je}from"./index-
|
|
1
|
+
import{c as he,j as e,P as We,r as n,a as j,C as Ue,M as fe,R as re,u as ae,b as Ve,A as Qe,S as Ye,d as Ke,U as Ze,e as Je}from"./index-DvZ0Kk2x.js";import{u as R}from"./usePolling-D0aoTX80.js";import{P as Xe,S as et,E as C}from"./ErrorBoundary-ut3wrUmu.js";import{F as tt,T as st}from"./TerminalOutput-togzv9Zl.js";import{E as rt}from"./EvidenceReceiptPanel-CcaBwEI-.js";import{B as at}from"./Badge-BF3mhT57.js";import{P as nt}from"./package-BtXTKusI.js";import{C as it}from"./cloud-B_Y5ZrIO.js";import{C as be}from"./code-xml-Bbom7YWV.js";import{H as lt}from"./hammer-EgOQNukG.js";import{C as ot}from"./chevron-left-DXUqkd8J.js";import{L as ct}from"./layers-BOVKmepE.js";import{C as dt}from"./check-ikfylPst.js";import{M as mt}from"./mail-COu670_W.js";import{B as xt}from"./bell-DWH0drES.js";import{F as ut}from"./file-code-corner-CVrkaOQP.js";import"./lock-XzlDMy8M.js";import"./clock-mlGCFq8l.js";import"./circle-alert-Da74VO8P.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{a0 as r,u as o,r as c,j as e}from"./index-
|
|
1
|
+
import{a0 as r,u as o,r as c,j as e}from"./index-DvZ0Kk2x.js";function x(){const{user:l,loading:t,login:i,isLocalMode:n}=r(),s=o();return c.useEffect(()=>{!t&&(l||n)&&s("/",{replace:!0})},[l,t,n,s]),t?e.jsx("div",{className:"h-screen bg-[#FAF9F6] flex items-center justify-center text-[#6B6960] text-sm",children:"Loading..."}):e.jsx("div",{className:"h-screen bg-[#FAF9F6] flex items-center justify-center",children:e.jsxs("div",{className:"w-full max-w-sm mx-auto px-6",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("h1",{className:"font-heading text-3xl font-bold text-[#36342E] mb-1",children:"Purple Lab"}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:"Autonomous agent workspace powered by Loki"})]}),e.jsxs("div",{className:"bg-white rounded-lg border border-[#ECEAE3] shadow-sm p-6 space-y-4",children:[e.jsx("h2",{className:"text-base font-medium text-[#36342E] text-center",children:"Sign in to continue"}),e.jsxs("button",{type:"button",onClick:()=>i("github"),className:"w-full flex items-center justify-center gap-2 px-4 py-2.5 rounded-[5px] border border-[#ECEAE3] bg-[#24292f] text-white text-sm font-medium hover:bg-[#1b1f23] transition-colors",children:[e.jsx("svg",{className:"w-5 h-5",fill:"currentColor",viewBox:"0 0 24 24",children:e.jsx("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"})}),"Sign in with GitHub"]}),e.jsxs("button",{type:"button",onClick:()=>i("google"),className:"w-full flex items-center justify-center gap-2 px-4 py-2.5 rounded-[5px] border border-[#ECEAE3] bg-white text-[#36342E] text-sm font-medium hover:bg-[#F8F4F0] transition-colors",children:[e.jsxs("svg",{className:"w-5 h-5",viewBox:"0 0 24 24",children:[e.jsx("path",{fill:"#4285F4",d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z"}),e.jsx("path",{fill:"#34A853",d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"}),e.jsx("path",{fill:"#FBBC05",d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"}),e.jsx("path",{fill:"#EA4335",d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"})]}),"Sign in with Google"]}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-0 flex items-center",children:e.jsx("div",{className:"w-full border-t border-[#ECEAE3]"})}),e.jsx("div",{className:"relative flex justify-center text-xs",children:e.jsx("span",{className:"bg-white px-2 text-[#939084]",children:"or"})})]}),e.jsx("button",{type:"button",onClick:()=>s("/"),className:"w-full text-center text-sm text-[#6B6960] hover:text-[#553DE9] transition-colors py-1",children:"Continue without account (local mode)"})]}),e.jsx("p",{className:"text-xs text-[#939084] text-center mt-4",children:"Local mode stores everything on your machine. Sign in for cloud sync and collaboration."})]})})}export{x as default};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as C,r as s,j as e,v as _,X as H,m as Q,f as I,T as K,F as Y,n as ee}from"./index-
|
|
1
|
+
import{c as C,r as s,j as e,v as _,X as H,m as Q,f as I,T as K,F as Y,n as ee}from"./index-DvZ0Kk2x.js";import{U as te}from"./upload-D4l6DCOt.js";import{C as se}from"./circle-alert-Da74VO8P.js";import{L as R}from"./loader-circle-0K8yLgHl.js";import{C as ae}from"./code-xml-Bbom7YWV.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 U,r as u,j as t,a as P}from"./index-
|
|
1
|
+
import{c as U,r as u,j as t,a as P}from"./index-DvZ0Kk2x.js";import{E as K}from"./EvidenceReceiptPanel-CcaBwEI-.js";import{D as q}from"./dollar-sign-C5mkjXIM.js";import{L as Z}from"./layers-BOVKmepE.js";import{T as O}from"./trending-up-D-DbCHXm.js";import{T as J}from"./trending-down-DrtBd_C9.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,J as t,a3 as s,a4 as o}from"./index-
|
|
1
|
+
import{j as e,J as t,a3 as s,a4 as o}from"./index-DvZ0Kk2x.js";function r(){return e.jsxs("div",{className:"flex flex-col items-center justify-center h-full min-h-[60vh] p-8 text-center",children:[e.jsx("div",{className:"text-6xl font-heading font-bold text-primary/20 mb-4",children:"404"}),e.jsx("h1",{className:"text-h3 font-heading font-bold text-ink mb-2",children:"Page not found"}),e.jsx("p",{className:"text-sm text-muted-accessible mb-6 max-w-xs",children:"The page you are looking for does not exist or has been moved."}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("button",{onClick:()=>window.history.back(),className:"inline-flex items-center gap-1.5 px-4 py-2 text-xs font-medium rounded-btn border border-border text-secondary hover:bg-hover transition-colors",children:[e.jsx(t,{size:14}),"Go Back"]}),e.jsxs(s,{to:"/",className:"inline-flex items-center gap-1.5 px-4 py-2 text-xs font-medium rounded-btn bg-primary text-white hover:bg-[#4432c4] transition-colors shadow-button",children:[e.jsx(o,{size:14}),"Home"]})]})]})}export{r as default};
|