loki-mode 11.17.95 → 11.17.97
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/autonomy/lib/claude-flags.sh +1 -1
- package/dashboard/__init__.py +1 -1
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/FAILURE-CLASSES.md +14 -0
- package/docs/v10/PROGRESS.md +6 -0
- package/loki-ts/dist/loki.js +1080 -1080
- package/mcp/__init__.py +1 -1
- package/package.json +2 -2
- package/packages/control-plane/dist/server.js +84 -56
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-Bq3GIhNB.js → AdminPage-BytHjrWT.js} +1 -1
- package/web-app/dist/assets/{Avatar-DaiPuWqr.js → Avatar-dNf3amMe.js} +1 -1
- package/web-app/dist/assets/{Badge-CItgRbkz.js → Badge-CnvI2YSE.js} +1 -1
- package/web-app/dist/assets/{Button-OrSdD_k0.js → Button-Bh6HJSx6.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-BVBakqUM.js → CockpitPage-Cgb8AAHQ.js} +1 -1
- package/web-app/dist/assets/{ComparePage-UMAcdD0g.js → ComparePage-CRiAPbds.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BVib-R__.js → ErrorBoundary-t-0AuXcR.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-CUT7gsPP.js → EvidenceReceiptPanel-BQMuZ040.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-ClRXNMyP.js → GitHubIssuesPanel-243WSJem.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-DZ6X6Hxh.js → GitHubPRsPanel-Bzen0ew8.js} +1 -1
- package/web-app/dist/assets/{HomePage-C7r6eTnG.js → HomePage-_V2-Ukxv.js} +2 -2
- package/web-app/dist/assets/{LoginPage-CoAU9hWW.js → LoginPage-DYKXRZEd.js} +1 -1
- package/web-app/dist/assets/{MagicPage-GPIuqNNU.js → MagicPage-BXo9VpH1.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-oC1QHoms.js → MetricsPage-BOHwqyBx.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-R1g_LL-N.js → NotFoundPage-m1C1pOjw.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-DD4w8s11.js → ProjectPage-Don7b0uX.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-BxcSql1s.js → ProjectsPage-CT05Xbvx.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-BQkI7SIf.js → SettingsPage-K1RdqdPo.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-BnmpNf9H.js → ShowcasePage-BNMXSbLn.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-D_CeUgOU.js → SystemSettingsPage-Cb5sPNHw.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-DI0twiAI.js → TeamsPage-DwIExIGI.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-CF4bJa2a.js → TemplatesPage-Bbp0kGfr.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-CJYp2Vm2.js → TerminalOutput-B7SAJSSx.js} +1 -1
- package/web-app/dist/assets/{activity-Dbw7uHdj.js → activity-DLDtD-RP.js} +1 -1
- package/web-app/dist/assets/{bell-B7Dwt2kM.js → bell-BhnIrwOh.js} +1 -1
- package/web-app/dist/assets/{bot-DySTe33O.js → bot-Bi7rc3U-.js} +1 -1
- package/web-app/dist/assets/{check-ttlvc1oX.js → check-BOKbqsD5.js} +1 -1
- package/web-app/dist/assets/{chevron-left-D58uO9_E.js → chevron-left-CoVTOJ_R.js} +1 -1
- package/web-app/dist/assets/{circle-alert-BukvG_5h.js → circle-alert-CKekYuWI.js} +1 -1
- package/web-app/dist/assets/{clock-BAI8rwxI.js → clock-aZ0Z-ePQ.js} +1 -1
- package/web-app/dist/assets/{cloud-C3_FFOHi.js → cloud-BxoicqtX.js} +1 -1
- package/web-app/dist/assets/{code-xml-BiZhCUId.js → code-xml-C1Rs6VBh.js} +1 -1
- package/web-app/dist/assets/{database-DxDnnkdS.js → database-FZtGtKtF.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-BK82Umxo.js → dollar-sign-DXLiAjF0.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-Cr5g9ekr.js → file-code-corner-Dd3V5YQW.js} +1 -1
- package/web-app/dist/assets/{file-plus-BNNpaLY2.js → file-plus-CSYUdRrx.js} +1 -1
- package/web-app/dist/assets/{globe-I-5yS74s.js → globe-fdKGcy1_.js} +1 -1
- package/web-app/dist/assets/{hammer-CJ52XJSY.js → hammer-Def0UqNM.js} +1 -1
- package/web-app/dist/assets/{index-8u9X9UkZ.js → index-CNMmdSPA.js} +3 -3
- package/web-app/dist/assets/{layers-t3L355U4.js → layers-Bgc7TP2t.js} +1 -1
- package/web-app/dist/assets/{loader-circle-YZKhI-zo.js → loader-circle-jmPs0bD2.js} +1 -1
- package/web-app/dist/assets/{lock-C-SdvJZG.js → lock-BKIF1VmL.js} +1 -1
- package/web-app/dist/assets/{package-D-PvM4OI.js → package-DhhpGwnm.js} +1 -1
- package/web-app/dist/assets/{plus-zusQn6fq.js → plus-BlNVdkl3.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-CycJ-WmB.js → refresh-cw-C20PCDgA.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-oTTB4oPx.js → rotate-ccw-C4PlFq8d.js} +1 -1
- package/web-app/dist/assets/{scroll-text-BsF3F1FM.js → scroll-text-DAbCSrb9.js} +1 -1
- package/web-app/dist/assets/{server-BejLzPI4.js → server-4AzyKwOe.js} +1 -1
- package/web-app/dist/assets/{shield-alert-DS86jyQ2.js → shield-alert-DMZNCvUV.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-DQ9-ANDq.js → thumbs-up-D8m-2YKD.js} +1 -1
- package/web-app/dist/assets/{trash-2-FSv2nvxY.js → trash-2-D_bXC3JF.js} +1 -1
- package/web-app/dist/assets/{trending-down-Bh20MLSt.js → trending-down-4BqvwC8V.js} +1 -1
- package/web-app/dist/assets/{trending-up-J7yIg6ew.js → trending-up-C8eCGVRi.js} +1 -1
- package/web-app/dist/assets/{upload-D0j0hS3h.js → upload-DtXbAChx.js} +1 -1
- package/web-app/dist/assets/{usePolling-C6HzHph-.js → usePolling-BQG2Axwp.js} +1 -1
- package/web-app/dist/assets/{user-fbR8rhOt.js → user-CIHTfrI5.js} +1 -1
- package/web-app/dist/index.html +1 -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": "11.17.
|
|
4
|
+
"version": "11.17.97",
|
|
5
5
|
"description": "An autonomous software factory that knows what it is supposed to deliver, and proves it did.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"agent",
|
|
@@ -160,5 +160,5 @@
|
|
|
160
160
|
"dependencies": {
|
|
161
161
|
"@resvg/resvg-wasm": "^2.6.2"
|
|
162
162
|
},
|
|
163
|
-
"gitHead": "
|
|
163
|
+
"gitHead": "4731f77df58ad537fec03db8a492649b93ac5bfa"
|
|
164
164
|
}
|
|
@@ -9735,7 +9735,7 @@ var NO_TESTS_REASON = "no tests executed", GO_EXIT0_REASON = "test count could n
|
|
|
9735
9735
|
}, EXCERPT_GROUP_CAP = 1500, EXCERPT_TOTAL_CAP = 6144, verifyJobs = () => {
|
|
9736
9736
|
const n2 = Number.parseInt(process.env["LOKI_E10_VERIFY_JOBS"] ?? "", 10);
|
|
9737
9737
|
return Number.isFinite(n2) && n2 >= 1 ? Math.min(n2, 8) : 1;
|
|
9738
|
-
}, FULL_SUITE_CMD;
|
|
9738
|
+
}, FULL_SUITE_CMD, ALREADY_FAILING_ON_BASE = "already failing on base, not caused by this change", checkResultLabel = (result, preRed) => result === "fail" && preRed ? `fail (${ALREADY_FAILING_ON_BASE})` : result;
|
|
9739
9739
|
var init_check_result = __esm(() => {
|
|
9740
9740
|
init_resolve();
|
|
9741
9741
|
init_testmap();
|
|
@@ -11853,16 +11853,37 @@ var init_spec_file = __esm(() => {
|
|
|
11853
11853
|
});
|
|
11854
11854
|
|
|
11855
11855
|
// ../../loki-ts/src/util/reviewer_brief.ts
|
|
11856
|
+
function reviewFlagLines(text2) {
|
|
11857
|
+
const out2 = [];
|
|
11858
|
+
for (const raw2 of text2.split(`
|
|
11859
|
+
`)) {
|
|
11860
|
+
if (raw2.trim() === "")
|
|
11861
|
+
continue;
|
|
11862
|
+
const indent = raw2.length - raw2.trimStart().length, t = raw2.replace(/^\s*[-*]\s*/, ""), last = out2[out2.length - 1];
|
|
11863
|
+
if (last && last.t.trimEnd().endsWith(":") && indent > last.indent)
|
|
11864
|
+
last.subs.push(t.trim());
|
|
11865
|
+
else
|
|
11866
|
+
out2.push({ t, indent, subs: [] });
|
|
11867
|
+
}
|
|
11868
|
+
return out2.filter((e) => e.subs.length > 0 || !e.t.trimEnd().endsWith(":")).map((e) => e.subs.length > 0 ? `${e.t.trim()} ${e.subs.join("; ")}` : e.t);
|
|
11869
|
+
}
|
|
11856
11870
|
function aiTrailers(i, env = process.env) {
|
|
11857
11871
|
if (!markingOn(env))
|
|
11858
11872
|
return [];
|
|
11859
11873
|
return ["AI-Generated: true", `AI-Provider: ${clean2(i.provider)}`, `AI-Model: ${clean2(i.model)}`, `Loki-Receipt: ${clean2(i.receiptRel)}`];
|
|
11860
11874
|
}
|
|
11861
|
-
var
|
|
11875
|
+
var capWhole = (t, n2) => {
|
|
11876
|
+
const s = t.replace(/\s+/g, " ").trim();
|
|
11877
|
+
if (s.length <= n2)
|
|
11878
|
+
return s;
|
|
11879
|
+
const cut = s.slice(0, n2 - 3), sp = cut.lastIndexOf(" ");
|
|
11880
|
+
return `${(sp > n2 / 2 ? cut.slice(0, sp) : cut).trimEnd()}...`;
|
|
11881
|
+
}, markingOn = (env) => /^(1|true|yes)$/i.test((env["LOKI_AI_MARKING"] ?? "").trim()), cleanFull = (v) => v.replace(/[\u0000-\u001f\u007f\u2028\u2029]+/g, " ").replace(/\s+/g, " ").trim(), clean2 = (v) => cleanFull(v).slice(0, 100) || "unknown";
|
|
11862
11882
|
var init_reviewer_brief = __esm(() => {
|
|
11863
11883
|
init_repomap();
|
|
11864
11884
|
init_testmap();
|
|
11865
11885
|
init_safe_git();
|
|
11886
|
+
init_check_result();
|
|
11866
11887
|
});
|
|
11867
11888
|
|
|
11868
11889
|
// ../../loki-ts/src/engine10/pr_body.ts
|
|
@@ -14307,10 +14328,45 @@ var init_version = __esm(() => {
|
|
|
14307
14328
|
init_paths();
|
|
14308
14329
|
});
|
|
14309
14330
|
|
|
14331
|
+
// ../../loki-ts/src/e10ext/preexisting_dirty.ts
|
|
14332
|
+
function untouchedSinceIntake(repoDir, recorded, env = process.env) {
|
|
14333
|
+
if (!recorded || typeof recorded !== "object")
|
|
14334
|
+
return [];
|
|
14335
|
+
return Object.entries(recorded).filter(([p, h]) => {
|
|
14336
|
+
try {
|
|
14337
|
+
return blob2(repoDir, p, env) === h;
|
|
14338
|
+
} catch {
|
|
14339
|
+
return false;
|
|
14340
|
+
}
|
|
14341
|
+
}).map(([p]) => p);
|
|
14342
|
+
}
|
|
14343
|
+
var blob2 = (repoDir, path, env = process.env) => safeGit(repoDir, ["hash-object", "-w", "--no-filters", "--", path], { env }).trim();
|
|
14344
|
+
var init_preexisting_dirty = __esm(() => {
|
|
14345
|
+
init_safe_git();
|
|
14346
|
+
});
|
|
14347
|
+
|
|
14348
|
+
// ../../loki-ts/src/e10ext/commit_filter.ts
|
|
14349
|
+
import { dirname as dirname20 } from "path";
|
|
14350
|
+
function dropSet(repoDir, staged, preexistingDirty, env = process.env, installCreated) {
|
|
14351
|
+
const owned = installOwned(repoDir, installCreated, env), made = installCreated?.files ?? {};
|
|
14352
|
+
return staged.concat(untouchedSinceIntake(repoDir, preexistingDirty, env).map((f) => ({ st: "L", f })), staged.filter(({ f }) => owned(f)).map(({ f }) => ({ st: "L", f }))).filter(({ st, f }) => f.startsWith(".loki/") || st === "L" || WALL_FILE.test(f) || st === "A" && !Object.hasOwn(made, f) && !staged.some(({ f: m }) => /(^|\/)(package\.json|pyproject\.toml|requirements\.txt|Cargo\.toml|go\.mod)$/.test(m) && dirname20(m) === dirname20(f)) && /(^|\/)(package-lock\.json|yarn\.lock|pnpm-lock\.yaml|bun\.lockb?|poetry\.lock|Cargo\.lock|go\.sum)$/.test(f));
|
|
14353
|
+
}
|
|
14354
|
+
var WALL_FILE, parseStaged = (out2) => out2.split("\x00").reduce((a, t, i, all) => i % 2 === 0 && t ? [...a, { st: t, f: all[i + 1] }] : a, []), formatChanged = (repoDir, staged, dropped2, env = process.env) => runFormatters(repoDir, staged.filter(({ st, f }) => (st === "A" || st === "M") && !dropped2.has(f) && !f.startsWith(".loki/")).map(({ f }) => f), tokenFreeEnv(env));
|
|
14355
|
+
var init_commit_filter = __esm(() => {
|
|
14356
|
+
init_preexisting_dirty();
|
|
14357
|
+
init_install();
|
|
14358
|
+
init_repo_profile();
|
|
14359
|
+
init_safe_git();
|
|
14360
|
+
WALL_FILE = /(^|\/)loki_wall_[^/]*$/;
|
|
14361
|
+
});
|
|
14362
|
+
|
|
14310
14363
|
// ../../loki-ts/src/e10ext/reviewer_body.ts
|
|
14311
14364
|
var init_reviewer_body = __esm(() => {
|
|
14312
14365
|
init_base_guard();
|
|
14313
14366
|
init_version();
|
|
14367
|
+
init_check_result();
|
|
14368
|
+
init_intent_card();
|
|
14369
|
+
init_commit_filter();
|
|
14314
14370
|
});
|
|
14315
14371
|
|
|
14316
14372
|
// ../../loki-ts/src/runner/router/route_block.ts
|
|
@@ -14400,7 +14456,7 @@ import { spawn as spawn8 } from "child_process";
|
|
|
14400
14456
|
import { createHash as createHash14, randomBytes as randomBytes6 } from "crypto";
|
|
14401
14457
|
import { existsSync as existsSync34, lstatSync as lstatSync12, mkdirSync as mkdirSync21, readdirSync as readdirSync20, readFileSync as readFileSync43, writeFileSync as writeFileSync24 } from "fs";
|
|
14402
14458
|
import { createServer } from "net";
|
|
14403
|
-
import { dirname as
|
|
14459
|
+
import { dirname as dirname21, isAbsolute as isAbsolute9, join as join54, normalize as normalize3, relative as relative9, sep as sep13 } from "path";
|
|
14404
14460
|
function routeFor(file) {
|
|
14405
14461
|
let r = file.replace(/^(?:.*?\/)?(?:app|pages|src|public)\//, "").replace(/^(?:routes|pages)\//, "");
|
|
14406
14462
|
r = r.replace(/\.(?:html|jsx|tsx|vue|svelte)$/, "").replace(/\/?(?:page|index|\+page)$/, "");
|
|
@@ -14696,7 +14752,7 @@ async function sealEvidence(repoDir, runDir, o, notProven, signal, emit) {
|
|
|
14696
14752
|
function receiptScreensProblem(receiptPath, receipt) {
|
|
14697
14753
|
if (visualGateEnabled() && typeof receipt["evidence_failed"] === "string")
|
|
14698
14754
|
return `visual evidence failed (LOKI_VISUAL_GATE=1): ${receipt["evidence_failed"]}`;
|
|
14699
|
-
return receipt["evidence_screens"] === undefined ? null : checkScreens(
|
|
14755
|
+
return receipt["evidence_screens"] === undefined ? null : checkScreens(dirname21(receiptPath), receipt["evidence_screens"]);
|
|
14700
14756
|
}
|
|
14701
14757
|
var visualEvidenceEnabled = (env = process.env) => env["LOKI_VISUAL_EVIDENCE"] !== "0", visualGateEnabled = (env = process.env) => env["LOKI_VISUAL_GATE"] === "1", PAGE_RE, isPageFile = (p) => PAGE_RE.test(p), screenName = (route) => (route === "/" ? "index" : route.slice(1).replace(/[^A-Za-z0-9._-]+/g, "_")) || "index", sha256File = (p) => createHash14("sha256").update(readFileSync43(p)).digest("hex"), playwrightBin = (repoDir) => {
|
|
14702
14758
|
const bin = join54(repoDir, "node_modules", ".bin", "playwright");
|
|
@@ -14775,7 +14831,7 @@ var init_pr = __esm(() => {
|
|
|
14775
14831
|
|
|
14776
14832
|
// ../../loki-ts/src/util/pr_lessons.ts
|
|
14777
14833
|
import { existsSync as existsSync35, mkdirSync as mkdirSync22, mkdtempSync as mkdtempSync8, readFileSync as readFileSync44, rmSync as rmSync16, writeFileSync as writeFileSync25 } from "fs";
|
|
14778
|
-
import { dirname as
|
|
14834
|
+
import { dirname as dirname22, join as join56 } from "path";
|
|
14779
14835
|
import { createHash as createHash15 } from "crypto";
|
|
14780
14836
|
function loadLessons(repoDir) {
|
|
14781
14837
|
const p = lessonsPath(repoDir);
|
|
@@ -14790,7 +14846,7 @@ function loadLessons(repoDir) {
|
|
|
14790
14846
|
}
|
|
14791
14847
|
function save(repoDir, lessons) {
|
|
14792
14848
|
const p = lessonsPath(repoDir);
|
|
14793
|
-
mkdirSync22(
|
|
14849
|
+
mkdirSync22(dirname22(p), { recursive: true });
|
|
14794
14850
|
atomicWriteJson(p, { version: 2, lessons });
|
|
14795
14851
|
}
|
|
14796
14852
|
function appendReceiptFact(repoDir, f, now2 = () => new Date) {
|
|
@@ -14851,7 +14907,7 @@ var init_mcp_config = () => {};
|
|
|
14851
14907
|
|
|
14852
14908
|
// ../../loki-ts/src/providers/claude_flags.ts
|
|
14853
14909
|
import { existsSync as existsSync36, readFileSync as readFileSync45 } from "fs";
|
|
14854
|
-
import { resolve as resolvePath, dirname as
|
|
14910
|
+
import { resolve as resolvePath, dirname as dirname23 } from "path";
|
|
14855
14911
|
import { fileURLToPath as fileURLToPath5 } from "url";
|
|
14856
14912
|
function claudeFlagSupported(flag, helpText) {
|
|
14857
14913
|
const txt = helpText ?? _claudeHelpCache;
|
|
@@ -14886,19 +14942,19 @@ function leanReviewerFlags(opts = {}) {
|
|
|
14886
14942
|
out2.push("--bare");
|
|
14887
14943
|
} else {
|
|
14888
14944
|
if (ok("--setting-sources"))
|
|
14889
|
-
out2.push("--setting-sources", "project");
|
|
14945
|
+
out2.push("--setting-sources", opts.settingSources ?? "project");
|
|
14890
14946
|
if (ok("--strict-mcp-config"))
|
|
14891
14947
|
out2.push("--strict-mcp-config", "--mcp-config", '{"mcpServers":{}}');
|
|
14892
14948
|
if (ok("--disable-slash-commands"))
|
|
14893
14949
|
out2.push("--disable-slash-commands");
|
|
14894
14950
|
}
|
|
14895
14951
|
if (ok("--tools"))
|
|
14896
|
-
out2.push(
|
|
14952
|
+
out2.push(`--tools=${opts.tools ?? ""}`);
|
|
14897
14953
|
return out2;
|
|
14898
14954
|
}
|
|
14899
14955
|
function designArchetypesText() {
|
|
14900
14956
|
try {
|
|
14901
|
-
const moduleDir =
|
|
14957
|
+
const moduleDir = dirname23(fileURLToPath5(import.meta.url));
|
|
14902
14958
|
for (const rel of [
|
|
14903
14959
|
["..", "..", "..", "references", "design-archetypes.md"],
|
|
14904
14960
|
["..", "..", "references", "design-archetypes.md"]
|
|
@@ -14910,7 +14966,7 @@ function designArchetypesText() {
|
|
|
14910
14966
|
} catch {}
|
|
14911
14967
|
return "";
|
|
14912
14968
|
}
|
|
14913
|
-
var REVIEW_GUARD_DENYLIST = "Edit,Write,NotebookEdit,Bash(git commit:*),Bash(git reset:*),Bash(git push:*),Bash(git checkout:*),Bash(git clean:*),Bash(git rm:*),Bash(git stash:*),Bash(git -C:*),Bash(git --git-dir:*),Bash(git -c:*)", _claudeHelpCache = null, AUTONOMY_OVERRIDE_TEXT, FIRST_PASS_EXCELLENCE_TEXT, CAVEMAN_PINNED_VERSION;
|
|
14969
|
+
var REVIEW_GUARD_DENYLIST = "Edit,Write,NotebookEdit,Bash(git commit:*),Bash(git reset:*),Bash(git push:*),Bash(git checkout:*),Bash(git clean:*),Bash(git rm:*),Bash(git stash:*),Bash(git -C:*),Bash(git --git-dir:*),Bash(git -c:*),Bash(git --exec-path:*),Bash(git diff --output:*),Bash(git diff --output=:*),Bash(git diff --ext-diff:*),Bash(git diff --no-index:*),Bash(git log --output:*),Bash(git log --output=:*),Bash(git log --ext-diff:*),Bash(git show --output:*),Bash(git show --output=:*),Bash(git show --ext-diff:*),Bash(git blame --output:*),Bash(git blame --output=:*),Bash(rg --pre:*),Bash(rg --pre=:*),Bash(rg --pre-glob:*),Bash(rg --pre-glob=:*),Bash(rg --hostname-bin:*),Bash(rg --hostname-bin=:*),Bash(find -delete:*),Bash(find -exec:*),Bash(find -execdir:*),Bash(find -ok:*),Bash(find -fprint:*),Bash(find -fprintf:*),Bash(find -fls:*),Bash(git * --output*),Bash(git * --ext-diff*),Bash(git * --no-index*),Bash(rg * --pre*),Bash(rg * --hostname-bin*),Bash(rg --pre*),Bash(rg --hostname-bin*),Bash(find * -delete*),Bash(find * -exec*),Bash(find * -execdir*),Bash(find * -fprint*),Bash(find * -fls*),Bash(find * -ok*)", _claudeHelpCache = null, AUTONOMY_OVERRIDE_TEXT, FIRST_PASS_EXCELLENCE_TEXT, REVIEW_ALLOWLIST_TOKEN = "Read,Grep,Glob,Bash(git diff:*),Bash(git log:*),Bash(git show:*),Bash(git status:*),Bash(git ls-files:*),Bash(git rev-parse:*),Bash(git blame:*),Bash(cat:*),Bash(ls:*),Bash(grep:*),Bash(rg:*),Bash(find:*),Bash(head:*),Bash(tail:*),Bash(wc:*)", REVIEW_ALLOWLIST_NO_GIT, CAVEMAN_PINNED_VERSION;
|
|
14914
14970
|
var init_claude_flags = __esm(() => {
|
|
14915
14971
|
init_mcp_config();
|
|
14916
14972
|
AUTONOMY_OVERRIDE_TEXT = `[LOKI-AUTONOMY-AGENT] This is a Loki Mode autonomous agent process.
|
|
@@ -14935,6 +14991,7 @@ var init_claude_flags = __esm(() => {
|
|
|
14935
14991
|
` + ` - CODE REVIEW: no scope creep beyond the stated task, no dead or commented-out code, no leftover debug output, and follow the conventions already in the surrounding files.
|
|
14936
14992
|
` + `Deliver the finished, self-verified, genuinely-designed result in THIS pass. Additional iterations should be the exception, not the plan.
|
|
14937
14993
|
` + designArchetypesText();
|
|
14994
|
+
REVIEW_ALLOWLIST_NO_GIT = REVIEW_ALLOWLIST_TOKEN.split(",").filter((t) => !t.startsWith("Bash(git ")).join(",");
|
|
14938
14995
|
CAVEMAN_PINNED_VERSION = process.env["LOKI_CAVEMAN_VERSION"] || "1.9.0";
|
|
14939
14996
|
});
|
|
14940
14997
|
|
|
@@ -15148,7 +15205,7 @@ __export(exports_deep, {
|
|
|
15148
15205
|
});
|
|
15149
15206
|
import { copyFileSync as copyFileSync3, existsSync as existsSync38, lstatSync as lstatSync14, mkdirSync as mkdirSync24, mkdtempSync as mkdtempSync9, rmSync as rmSync17, writeFileSync as writeFileSync27 } from "fs";
|
|
15150
15207
|
import { tmpdir as tmpdir10 } from "os";
|
|
15151
|
-
import { dirname as
|
|
15208
|
+
import { dirname as dirname24, join as join58 } from "path";
|
|
15152
15209
|
function sessionCouncil(sessions) {
|
|
15153
15210
|
return { async run(input, signal) {
|
|
15154
15211
|
const cwd = mkdtempSync9(join58(tmpdir10(), "loki-deep-council-"));
|
|
@@ -15273,7 +15330,7 @@ async function secureScanChanged(repoDir, changed, opts) {
|
|
|
15273
15330
|
try {
|
|
15274
15331
|
for (const f of changed)
|
|
15275
15332
|
if (existsSync38(join58(repoDir, f)) && lstatSync14(join58(repoDir, f)).isFile()) {
|
|
15276
|
-
mkdirSync24(
|
|
15333
|
+
mkdirSync24(dirname24(join58(dir, f)), { recursive: true });
|
|
15277
15334
|
copyFileSync3(join58(repoDir, f), join58(dir, f));
|
|
15278
15335
|
}
|
|
15279
15336
|
return await runSecureScan(dir, { ...opts.secureScanPath ? { scriptPath: opts.secureScanPath } : {}, timeoutMs: 60000 });
|
|
@@ -15757,7 +15814,7 @@ ${x}` : c.cmd };
|
|
|
15757
15814
|
import { spawnSync as spawnSync7 } from "child_process";
|
|
15758
15815
|
import { existsSync as existsSync40, mkdirSync as mkdirSync25, mkdtempSync as mkdtempSync11, readFileSync as readFileSync47, readdirSync as readdirSync21, rmSync as rmSync19, writeFileSync as writeFileSync28 } from "fs";
|
|
15759
15816
|
import { tmpdir as tmpdir12 } from "os";
|
|
15760
|
-
import { dirname as
|
|
15817
|
+
import { dirname as dirname25, join as join60, relative as relative11 } from "path";
|
|
15761
15818
|
|
|
15762
15819
|
class RealBaseTestRunner {
|
|
15763
15820
|
api;
|
|
@@ -15837,7 +15894,7 @@ function loadTaskText(ctx, fromPrior) {
|
|
|
15837
15894
|
}
|
|
15838
15895
|
function wallTargetDir(repoDir, existingTests) {
|
|
15839
15896
|
const first = existingTests[0];
|
|
15840
|
-
return first ? join60(repoDir,
|
|
15897
|
+
return first ? join60(repoDir, dirname25(first.path)) : join60(repoDir, "tests");
|
|
15841
15898
|
}
|
|
15842
15899
|
function guessRunner(fileName, runners) {
|
|
15843
15900
|
if (fileName.endsWith(".py"))
|
|
@@ -16025,9 +16082,9 @@ var init_wall = __esm(() => {
|
|
|
16025
16082
|
|
|
16026
16083
|
// ../../loki-ts/src/e10ext/discard.ts
|
|
16027
16084
|
import { chmodSync as chmodSync5, closeSync as closeSync9, lstatSync as lstatSync15, mkdirSync as mkdirSync26, openSync as openSync9, readFileSync as readFileSync48, realpathSync as realpathSync23, rmdirSync, unlinkSync as unlinkSync7, writeFileSync as writeFileSync29 } from "fs";
|
|
16028
|
-
import { dirname as
|
|
16085
|
+
import { dirname as dirname26, join as join61, relative as relative12, sep as sep14 } from "path";
|
|
16029
16086
|
function safeRestore(repoDir, f, want, mode) {
|
|
16030
|
-
const root = realpathSync23(repoDir), fp = join61(root, f), rel = relative12(root,
|
|
16087
|
+
const root = realpathSync23(repoDir), fp = join61(root, f), rel = relative12(root, dirname26(fp));
|
|
16031
16088
|
if (rel.startsWith(".."))
|
|
16032
16089
|
throw new Error("outside repo");
|
|
16033
16090
|
let cur = root;
|
|
@@ -16120,37 +16177,6 @@ var init_discard = __esm(() => {
|
|
|
16120
16177
|
init_safe_git();
|
|
16121
16178
|
});
|
|
16122
16179
|
|
|
16123
|
-
// ../../loki-ts/src/e10ext/preexisting_dirty.ts
|
|
16124
|
-
function untouchedSinceIntake(repoDir, recorded, env = process.env) {
|
|
16125
|
-
if (!recorded || typeof recorded !== "object")
|
|
16126
|
-
return [];
|
|
16127
|
-
return Object.entries(recorded).filter(([p, h]) => {
|
|
16128
|
-
try {
|
|
16129
|
-
return blob2(repoDir, p, env) === h;
|
|
16130
|
-
} catch {
|
|
16131
|
-
return false;
|
|
16132
|
-
}
|
|
16133
|
-
}).map(([p]) => p);
|
|
16134
|
-
}
|
|
16135
|
-
var blob2 = (repoDir, path, env = process.env) => safeGit(repoDir, ["hash-object", "-w", "--no-filters", "--", path], { env }).trim();
|
|
16136
|
-
var init_preexisting_dirty = __esm(() => {
|
|
16137
|
-
init_safe_git();
|
|
16138
|
-
});
|
|
16139
|
-
|
|
16140
|
-
// ../../loki-ts/src/e10ext/commit_filter.ts
|
|
16141
|
-
import { dirname as dirname26 } from "path";
|
|
16142
|
-
function dropSet(repoDir, staged, preexistingDirty, env = process.env, installCreated) {
|
|
16143
|
-
const owned = installOwned(repoDir, installCreated, env), made = installCreated?.files ?? {};
|
|
16144
|
-
return staged.concat(untouchedSinceIntake(repoDir, preexistingDirty, env).map((f) => ({ st: "L", f })), staged.filter(({ f }) => owned(f)).map(({ f }) => ({ st: "L", f }))).filter(({ st, f }) => f.startsWith(".loki/") || st === "L" || /(^|\/)loki_wall_[^/]*$/.test(f) || st === "A" && !Object.hasOwn(made, f) && !staged.some(({ f: m }) => /(^|\/)(package\.json|pyproject\.toml|requirements\.txt|Cargo\.toml|go\.mod)$/.test(m) && dirname26(m) === dirname26(f)) && /(^|\/)(package-lock\.json|yarn\.lock|pnpm-lock\.yaml|bun\.lockb?|poetry\.lock|Cargo\.lock|go\.sum)$/.test(f));
|
|
16145
|
-
}
|
|
16146
|
-
var parseStaged = (out2) => out2.split("\x00").reduce((a, t, i, all) => i % 2 === 0 && t ? [...a, { st: t, f: all[i + 1] }] : a, []), formatChanged = (repoDir, staged, dropped2, env = process.env) => runFormatters(repoDir, staged.filter(({ st, f }) => (st === "A" || st === "M") && !dropped2.has(f) && !f.startsWith(".loki/")).map(({ f }) => f), tokenFreeEnv(env));
|
|
16147
|
-
var init_commit_filter = __esm(() => {
|
|
16148
|
-
init_preexisting_dirty();
|
|
16149
|
-
init_install();
|
|
16150
|
-
init_repo_profile();
|
|
16151
|
-
init_safe_git();
|
|
16152
|
-
});
|
|
16153
|
-
|
|
16154
16180
|
// ../../loki-ts/src/e10ext/scope.ts
|
|
16155
16181
|
import { basename as basename24, dirname as dirname27 } from "path";
|
|
16156
16182
|
function contractText(o) {
|
|
@@ -16383,7 +16409,7 @@ function reviewReceipt(builder, xr, env = process.env) {
|
|
|
16383
16409
|
}
|
|
16384
16410
|
function reviewArgv(p, prompt, env = process.env, model, flagSupported = (f) => claudeFlagSupported(f)) {
|
|
16385
16411
|
const cli = reviewCli(p, env);
|
|
16386
|
-
return p === "codex" ? [cli, "exec", "--sandbox", "read-only", prompt] : [cli, "-p", prompt, ...model ? ["--model", model] : [], "--allowedTools",
|
|
16412
|
+
return p === "codex" ? [cli, "exec", "--sandbox", "read-only", prompt] : [cli, "-p", prompt, ...model ? ["--model", model] : [], "--allowedTools", REVIEW_ALLOWLIST_NO_GIT, "--disallowedTools", REVIEW_GUARD_DENYLIST, "--permission-mode", "dontAsk", ...leanReviewerFlags({ env, flagSupported, settingSources: "", tools: "Read,Grep,Glob,Bash" }), "--output-format", "json"];
|
|
16387
16413
|
}
|
|
16388
16414
|
function configuredReviewer(repoDir, env = process.env) {
|
|
16389
16415
|
const a = loadReviewStageAgent(repoDir, env);
|
|
@@ -16404,8 +16430,7 @@ function parseReview(p, out2) {
|
|
|
16404
16430
|
if (!m)
|
|
16405
16431
|
return { provider: p, level: "not_run", notes: [`cross-review not run: ${p} returned no VERDICT line`] };
|
|
16406
16432
|
const level = m[1].toLowerCase();
|
|
16407
|
-
const reasons = out2.slice(m.index + m[0].length).
|
|
16408
|
-
`).map((l) => l.replace(/^\s*[-*]\s*/, "")).filter((l) => l.trim() !== "").map(clean3).filter(Boolean).slice(0, MAX_NOTES);
|
|
16433
|
+
const reasons = reviewFlagLines(out2.slice(m.index + m[0].length)).map(clean3).filter(Boolean).slice(0, MAX_NOTES);
|
|
16409
16434
|
const notes = level === "pass" ? [] : (reasons.length ? reasons : ["no reason given"]).map((r) => `cross-review ${level} (${p}): ${r}`);
|
|
16410
16435
|
return { provider: p, level, notes };
|
|
16411
16436
|
}
|
|
@@ -16433,6 +16458,7 @@ async function crossReview(ctx, verdict, head, signal) {
|
|
|
16433
16458
|
const prompt = [
|
|
16434
16459
|
agent ? `${agent.prompt}
|
|
16435
16460
|
Review ONLY the diff below. Do not modify files.` : "You are an independent code reviewer. Review ONLY the diff below for correctness bugs, spec violations and missing tests. Do not modify files.",
|
|
16461
|
+
REVIEW_TOOLS_NOTE,
|
|
16436
16462
|
"Reply with a first line exactly `VERDICT: PASS`, `VERDICT: FLAG` (concerns) or `VERDICT: BLOCK` (a reproduced defect), then one `- reason` line per concern.",
|
|
16437
16463
|
...acceptancePromptBlock(acceptanceLines((ctx.outputs?.() ?? {}).plan)),
|
|
16438
16464
|
"",
|
|
@@ -16455,7 +16481,7 @@ Review ONLY the diff below. Do not modify files.` : "You are an independent code
|
|
|
16455
16481
|
var RANK3, MAX_DIFF = 60000, MAX_NOTES = 5, asProvider = (v) => {
|
|
16456
16482
|
const s = v?.trim().toLowerCase();
|
|
16457
16483
|
return s === "codex" || s === "claude" ? s : null;
|
|
16458
|
-
}, isOff = (v) => /^(off|none|false|0)$/i.test(v?.trim() ?? ""), xvendorDefault = (env = process.env) => /^(1|true|yes|on)$/i.test(env["LOKI_XVENDOR_DEFAULT"]?.trim() ?? ""), reviewCli = (p, env = process.env) => env[`LOKI_${p.toUpperCase()}_CLI`]?.trim() || p, clean3 = (s) => s.replace(/[\x00-\x1f\x7f`]+/g, " ")
|
|
16484
|
+
}, isOff = (v) => /^(off|none|false|0)$/i.test(v?.trim() ?? ""), xvendorDefault = (env = process.env) => /^(1|true|yes|on)$/i.test(env["LOKI_XVENDOR_DEFAULT"]?.trim() ?? ""), reviewCli = (p, env = process.env) => env[`LOKI_${p.toUpperCase()}_CLI`]?.trim() || p, REVIEW_TOOLS_NOTE = "Your tools are Read, Grep, Glob and a read-only shell (cat, ls, grep, rg, find, head, tail, wc). No git commands are available; the diff is in this prompt. You cannot edit files or run project code or tests, so trace behaviour by reading the code. If a tool fails or you could not inspect something, say so plainly in your reasons.", clean3 = (s) => capWhole(s.replace(/[\x00-\x1f\x7f`]+/g, " "), 600), reviewBoxS = (env = process.env) => {
|
|
16459
16485
|
const n3 = Number(env["LOKI_E10_REVIEW_BOX_S"]);
|
|
16460
16486
|
return n3 > 0 ? n3 : 300;
|
|
16461
16487
|
}, MIN_REVIEW_S = 30, roomS = (ctx) => backstopS(ctx.capS ?? Infinity) - (ctx.startedAtMs === undefined ? 0 : (ctx.clock?.now() ?? Date.now()) - ctx.startedAtMs) / 1000 - 55, boxFor = (ctx) => Math.min(reviewBoxS(), roomS(ctx)), reviewExtraLimitS = (ctx) => pickReviewer(ctx, configuredReviewer(ctx.repoDir)).p && roomS(ctx) >= MIN_REVIEW_S ? boxFor(ctx) + 30 : 0;
|
|
@@ -16467,6 +16493,7 @@ var init_xreview = __esm(() => {
|
|
|
16467
16493
|
init_safe_git();
|
|
16468
16494
|
init_intent_card();
|
|
16469
16495
|
init_run_summary();
|
|
16496
|
+
init_reviewer_brief();
|
|
16470
16497
|
init_types();
|
|
16471
16498
|
RANK3 = { FAILED: 0, SPEC_CONFLICT: 0, PARTIAL: 1, ALREADY_SATISFIED: 2, VERIFIED: 2 };
|
|
16472
16499
|
});
|
|
@@ -17088,7 +17115,7 @@ function targetProofOf(v) {
|
|
|
17088
17115
|
const names = new Set(strs2(v?.target_checks)), raw2 = Array.isArray(v?.checks) ? v.checks : [];
|
|
17089
17116
|
return raw2.some((c) => names.has(String(c.name)) && hasExecutedProof([c]));
|
|
17090
17117
|
}
|
|
17091
|
-
function checksOf(v, pc) {
|
|
17118
|
+
function checksOf(v, pc, preRed = []) {
|
|
17092
17119
|
if (!Array.isArray(v))
|
|
17093
17120
|
return [];
|
|
17094
17121
|
return v.filter((c) => !!c && typeof c === "object").map((c) => ({
|
|
@@ -17097,11 +17124,12 @@ function checksOf(v, pc) {
|
|
|
17097
17124
|
result: c.result === "pass" || c.result === "fail" ? c.result : "not_run",
|
|
17098
17125
|
duration_s: typeof c.duration_s === "number" ? c.duration_s : 0,
|
|
17099
17126
|
provenance: checkProvenance(String(c.name ?? ""), pc),
|
|
17100
|
-
...typeof c.n === "number" ? { n: c.n } : {}
|
|
17127
|
+
...typeof c.n === "number" ? { n: c.n } : {},
|
|
17128
|
+
...c.result === "fail" && preRed.includes(String(c.name ?? "")) ? { pre_red: true } : {}
|
|
17101
17129
|
}));
|
|
17102
17130
|
}
|
|
17103
17131
|
function renderReceiptMd(r) {
|
|
17104
|
-
const sig = r.verification.jwt ? `SIGNED (kid ${r.verification.kid})` : "UNSIGNED", ln = (c) => `- ${c.result}: ${c.name} (\`${c.cmd}\`, ${c.duration_s}s)`, sec = (h, cs) => [h, ...cs.length ? cs.map(ln) : ["- none"]], indep = (c) => c.provenance === "exogenous" || c.provenance === "independent";
|
|
17132
|
+
const sig = r.verification.jwt ? `SIGNED (kid ${r.verification.kid})` : "UNSIGNED", ln = (c) => `- ${checkResultLabel(c.result, c.pre_red === true)}: ${c.name} (\`${c.cmd}\`, ${c.duration_s}s)`, sec = (h, cs) => [h, ...cs.length ? cs.map(ln) : ["- none"]], indep = (c) => c.provenance === "exogenous" || c.provenance === "independent";
|
|
17105
17133
|
const usd = r.cost.usd !== null ? `$${r.cost.usd.toFixed(4)}` : r.cost.measured_sessions > 0 ? `partial: $${r.cost.partial_usd.toFixed(4)} for ${r.cost.measured_sessions} of ${r.cost.total_sessions} sessions` : "not measured";
|
|
17106
17134
|
return [
|
|
17107
17135
|
`## Loki receipt: ${r.verdict}`,
|
|
@@ -17215,7 +17243,7 @@ var init_seal = __esm(() => {
|
|
|
17215
17243
|
const wallNotRun = typeof base.not_run === "number" ? base.not_run : 0;
|
|
17216
17244
|
const wallGreenOnBase = wallGreenOnBaseOf(o);
|
|
17217
17245
|
const preRedChecks = strs2(o.verify?.pre_red_checks);
|
|
17218
|
-
const rawDiff = diffOk ? diff.stdout.split("\x00").filter(Boolean) : [], pctx = { addedFiles: rawDiff.flatMap((m, i) => i % 2 === 0 && m.trim().split(" ").pop() === "A" && rawDiff[i + 1] ? [rawDiff[i + 1]] : []), wallFiles: Array.isArray(o.wall?.files) ? o.wall.files.map((f) => String(f.path)) : [], modifiedFiles: rawDiff.flatMap((m, i) => i % 2 === 0 && m.trim().split(" ").pop() !== "A" && rawDiff[i + 1] && isTestFile(rawDiff[i + 1]) ? [rawDiff[i + 1]] : []) }, checks = checksOf(o.verify?.checks, pctx);
|
|
17246
|
+
const rawDiff = diffOk ? diff.stdout.split("\x00").filter(Boolean) : [], pctx = { addedFiles: rawDiff.flatMap((m, i) => i % 2 === 0 && m.trim().split(" ").pop() === "A" && rawDiff[i + 1] ? [rawDiff[i + 1]] : []), wallFiles: Array.isArray(o.wall?.files) ? o.wall.files.map((f) => String(f.path)) : [], modifiedFiles: rawDiff.flatMap((m, i) => i % 2 === 0 && m.trim().split(" ").pop() !== "A" && rawDiff[i + 1] && isTestFile(rawDiff[i + 1]) ? [rawDiff[i + 1]] : []) }, checks = checksOf(o.verify?.checks, pctx, preRedChecks);
|
|
17219
17247
|
const weakTests = [];
|
|
17220
17248
|
for (let i = 0;i + 1 < rawDiff.length; i += 2)
|
|
17221
17249
|
if ((rawDiff[i].trim().split(" ").pop() ?? "") !== "A" && isTestFile(rawDiff[i + 1]))
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "loki-mode",
|
|
4
4
|
"displayName": "Loki Mode",
|
|
5
|
-
"version": "11.17.
|
|
5
|
+
"version": "11.17.97",
|
|
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-CNMmdSPA.js";import{B as C}from"./Button-Bh6HJSx6.js";import{T as $e}from"./trending-up-C8eCGVRi.js";import{C as z}from"./clock-aZ0Z-ePQ.js";import{A as Be,U as ue,M as De}from"./Avatar-dNf3amMe.js";import{A as J}from"./activity-DLDtD-RP.js";import{R as pe}from"./refresh-cw-C20PCDgA.js";import{G as ze}from"./globe-fdKGcy1_.js";import{C as Le}from"./chevron-left-CoVTOJ_R.js";import{C as je}from"./check-BOKbqsD5.js";import{D as Y}from"./dollar-sign-DXLiAjF0.js";import{U as Te}from"./user-CIHTfrI5.js";import{D as Me}from"./database-FZtGtKtF.js";import{L as Ue}from"./lock-BKIF1VmL.js";import{S as Re}from"./scroll-text-DAbCSrb9.js";import{S as Ie}from"./shield-alert-DMZNCvUV.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-CNMmdSPA.js";import{C as r}from"./clock-aZ0Z-ePQ.js";import{C as a}from"./circle-alert-CKekYuWI.js";import{C as l}from"./check-BOKbqsD5.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-CNMmdSPA.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-CNMmdSPA.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-t-0AuXcR.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-D8m-2YKD.js";import{C as oe}from"./check-BOKbqsD5.js";import{C as Ye}from"./clock-aZ0Z-ePQ.js";import{D as Xe}from"./dollar-sign-DXLiAjF0.js";import{U as Ze}from"./upload-DtXbAChx.js";import{L as V}from"./loader-circle-jmPs0bD2.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-8u9X9UkZ.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-CNMmdSPA.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-CUT7gsPP.js → EvidenceReceiptPanel-BQMuZ040.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-CNMmdSPA.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`${s.cost.cost_partial===!0?"at least ":""}$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-
|
|
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-CNMmdSPA.js";import{B as N}from"./Button-Bh6HJSx6.js";import{C as y}from"./thumbs-up-D8m-2YKD.js";import{R as S}from"./refresh-cw-C20PCDgA.js";import{C as z}from"./circle-alert-CKekYuWI.js";import{U as D}from"./user-CIHTfrI5.js";import{L as G}from"./loader-circle-jmPs0bD2.js";import{R as T}from"./rotate-ccw-C4PlFq8d.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-CNMmdSPA.js";import{B as y}from"./Button-Bh6HJSx6.js";import{C as ge}from"./chevron-left-CoVTOJ_R.js";import{G as P}from"./thumbs-up-D8m-2YKD.js";import{R as $}from"./refresh-cw-C20PCDgA.js";import{C as Ne}from"./circle-alert-CKekYuWI.js";import{L as Q,S as je}from"./ProjectPage-Don7b0uX.js";import{S as se}from"./shield-alert-DMZNCvUV.js";import{F as ye}from"./file-code-corner-Dd3V5YQW.js";import{C as V}from"./clock-aZ0Z-ePQ.js";import{C as re}from"./check-BOKbqsD5.js";import"./ErrorBoundary-t-0AuXcR.js";import"./TerminalOutput-B7SAJSSx.js";import"./lock-BKIF1VmL.js";import"./package-DhhpGwnm.js";import"./file-plus-CSYUdRrx.js";import"./activity-DLDtD-RP.js";import"./scroll-text-DAbCSrb9.js";import"./bot-Bi7rc3U-.js";import"./loader-circle-jmPs0bD2.js";import"./hammer-Def0UqNM.js";import"./dollar-sign-DXLiAjF0.js";import"./globe-fdKGcy1_.js";import"./trash-2-D_bXC3JF.js";import"./upload-DtXbAChx.js";import"./plus-BlNVdkl3.js";import"./rotate-ccw-C4PlFq8d.js";import"./code-xml-C1Rs6VBh.js";import"./trending-up-C8eCGVRi.js";import"./layers-Bgc7TP2t.js";import"./trending-down-4BqvwC8V.js";import"./server-4AzyKwOe.js";/**
|
|
2
2
|
* @license lucide-react v0.577.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|