loki-mode 11.17.96 → 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/dashboard/__init__.py +1 -1
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/FAILURE-CLASSES.md +7 -0
- package/docs/v10/PROGRESS.md +3 -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 +78 -52
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-Dnrp8ziS.js → AdminPage-BytHjrWT.js} +1 -1
- package/web-app/dist/assets/{Avatar-BD77h_ON.js → Avatar-dNf3amMe.js} +1 -1
- package/web-app/dist/assets/{Badge-C2BWNFqW.js → Badge-CnvI2YSE.js} +1 -1
- package/web-app/dist/assets/{Button-BXpKuEtI.js → Button-Bh6HJSx6.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-Cjkt15dz.js → CockpitPage-Cgb8AAHQ.js} +1 -1
- package/web-app/dist/assets/{ComparePage-qrqu-1oQ.js → ComparePage-CRiAPbds.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BwDcgPBV.js → ErrorBoundary-t-0AuXcR.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-DmrC3mQE.js → EvidenceReceiptPanel-BQMuZ040.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-CGJQMAW7.js → GitHubIssuesPanel-243WSJem.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-BxjZ-Fx4.js → GitHubPRsPanel-Bzen0ew8.js} +1 -1
- package/web-app/dist/assets/{HomePage-Cm2nq40C.js → HomePage-_V2-Ukxv.js} +2 -2
- package/web-app/dist/assets/{LoginPage-BiMQBCw6.js → LoginPage-DYKXRZEd.js} +1 -1
- package/web-app/dist/assets/{MagicPage-NgC4HJgz.js → MagicPage-BXo9VpH1.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-CVEsvnrS.js → MetricsPage-BOHwqyBx.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-D2JCAqJu.js → NotFoundPage-m1C1pOjw.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-qlLKSp71.js → ProjectPage-Don7b0uX.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-f8AT-G30.js → ProjectsPage-CT05Xbvx.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-Wz5wMTEZ.js → SettingsPage-K1RdqdPo.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-xZoQGRKG.js → ShowcasePage-BNMXSbLn.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-0-I4dYGj.js → SystemSettingsPage-Cb5sPNHw.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-D-cDH7vH.js → TeamsPage-DwIExIGI.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-N66vLiuE.js → TemplatesPage-Bbp0kGfr.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-D5-u-UqN.js → TerminalOutput-B7SAJSSx.js} +1 -1
- package/web-app/dist/assets/{activity-ITMDDsAx.js → activity-DLDtD-RP.js} +1 -1
- package/web-app/dist/assets/{bell-DKDoEbOg.js → bell-BhnIrwOh.js} +1 -1
- package/web-app/dist/assets/{bot-jljmqB_U.js → bot-Bi7rc3U-.js} +1 -1
- package/web-app/dist/assets/{check-Dt8EfSuQ.js → check-BOKbqsD5.js} +1 -1
- package/web-app/dist/assets/{chevron-left-CCR2wESF.js → chevron-left-CoVTOJ_R.js} +1 -1
- package/web-app/dist/assets/{circle-alert-BEk-GdAd.js → circle-alert-CKekYuWI.js} +1 -1
- package/web-app/dist/assets/{clock-CLYzZXuC.js → clock-aZ0Z-ePQ.js} +1 -1
- package/web-app/dist/assets/{cloud-BUU1JKG5.js → cloud-BxoicqtX.js} +1 -1
- package/web-app/dist/assets/{code-xml-C7qaS3yN.js → code-xml-C1Rs6VBh.js} +1 -1
- package/web-app/dist/assets/{database-Cmz52NyA.js → database-FZtGtKtF.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-CZZIoKak.js → dollar-sign-DXLiAjF0.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-DjPu6647.js → file-code-corner-Dd3V5YQW.js} +1 -1
- package/web-app/dist/assets/{file-plus--3joal_S.js → file-plus-CSYUdRrx.js} +1 -1
- package/web-app/dist/assets/{globe-Bw8BQlPB.js → globe-fdKGcy1_.js} +1 -1
- package/web-app/dist/assets/{hammer-B4NVGnxW.js → hammer-Def0UqNM.js} +1 -1
- package/web-app/dist/assets/{index-haS12znm.js → index-CNMmdSPA.js} +3 -3
- package/web-app/dist/assets/{layers-CHadYuxv.js → layers-Bgc7TP2t.js} +1 -1
- package/web-app/dist/assets/{loader-circle-DoepZDHN.js → loader-circle-jmPs0bD2.js} +1 -1
- package/web-app/dist/assets/{lock-CVuC-Asv.js → lock-BKIF1VmL.js} +1 -1
- package/web-app/dist/assets/{package-RE4sFnhR.js → package-DhhpGwnm.js} +1 -1
- package/web-app/dist/assets/{plus-1OIfUPbK.js → plus-BlNVdkl3.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-maqNC4YR.js → refresh-cw-C20PCDgA.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-BEaz-jtK.js → rotate-ccw-C4PlFq8d.js} +1 -1
- package/web-app/dist/assets/{scroll-text-BaH8Ls9M.js → scroll-text-DAbCSrb9.js} +1 -1
- package/web-app/dist/assets/{server--SAyQsac.js → server-4AzyKwOe.js} +1 -1
- package/web-app/dist/assets/{shield-alert-DMvh30VS.js → shield-alert-DMZNCvUV.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-Clpz9KnO.js → thumbs-up-D8m-2YKD.js} +1 -1
- package/web-app/dist/assets/{trash-2-htd-Z1-P.js → trash-2-D_bXC3JF.js} +1 -1
- package/web-app/dist/assets/{trending-down-Crkm1od2.js → trending-down-4BqvwC8V.js} +1 -1
- package/web-app/dist/assets/{trending-up-BY9SxYuD.js → trending-up-C8eCGVRi.js} +1 -1
- package/web-app/dist/assets/{upload-5w_GUOcy.js → upload-DtXbAChx.js} +1 -1
- package/web-app/dist/assets/{usePolling-DpkAwy1-.js → usePolling-BQG2Axwp.js} +1 -1
- package/web-app/dist/assets/{user-Bh4AVoPX.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;
|
|
@@ -14898,7 +14954,7 @@ function leanReviewerFlags(opts = {}) {
|
|
|
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"]
|
|
@@ -15149,7 +15205,7 @@ __export(exports_deep, {
|
|
|
15149
15205
|
});
|
|
15150
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";
|
|
15151
15207
|
import { tmpdir as tmpdir10 } from "os";
|
|
15152
|
-
import { dirname as
|
|
15208
|
+
import { dirname as dirname24, join as join58 } from "path";
|
|
15153
15209
|
function sessionCouncil(sessions) {
|
|
15154
15210
|
return { async run(input, signal) {
|
|
15155
15211
|
const cwd = mkdtempSync9(join58(tmpdir10(), "loki-deep-council-"));
|
|
@@ -15274,7 +15330,7 @@ async function secureScanChanged(repoDir, changed, opts) {
|
|
|
15274
15330
|
try {
|
|
15275
15331
|
for (const f of changed)
|
|
15276
15332
|
if (existsSync38(join58(repoDir, f)) && lstatSync14(join58(repoDir, f)).isFile()) {
|
|
15277
|
-
mkdirSync24(
|
|
15333
|
+
mkdirSync24(dirname24(join58(dir, f)), { recursive: true });
|
|
15278
15334
|
copyFileSync3(join58(repoDir, f), join58(dir, f));
|
|
15279
15335
|
}
|
|
15280
15336
|
return await runSecureScan(dir, { ...opts.secureScanPath ? { scriptPath: opts.secureScanPath } : {}, timeoutMs: 60000 });
|
|
@@ -15758,7 +15814,7 @@ ${x}` : c.cmd };
|
|
|
15758
15814
|
import { spawnSync as spawnSync7 } from "child_process";
|
|
15759
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";
|
|
15760
15816
|
import { tmpdir as tmpdir12 } from "os";
|
|
15761
|
-
import { dirname as
|
|
15817
|
+
import { dirname as dirname25, join as join60, relative as relative11 } from "path";
|
|
15762
15818
|
|
|
15763
15819
|
class RealBaseTestRunner {
|
|
15764
15820
|
api;
|
|
@@ -15838,7 +15894,7 @@ function loadTaskText(ctx, fromPrior) {
|
|
|
15838
15894
|
}
|
|
15839
15895
|
function wallTargetDir(repoDir, existingTests) {
|
|
15840
15896
|
const first = existingTests[0];
|
|
15841
|
-
return first ? join60(repoDir,
|
|
15897
|
+
return first ? join60(repoDir, dirname25(first.path)) : join60(repoDir, "tests");
|
|
15842
15898
|
}
|
|
15843
15899
|
function guessRunner(fileName, runners) {
|
|
15844
15900
|
if (fileName.endsWith(".py"))
|
|
@@ -16026,9 +16082,9 @@ var init_wall = __esm(() => {
|
|
|
16026
16082
|
|
|
16027
16083
|
// ../../loki-ts/src/e10ext/discard.ts
|
|
16028
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";
|
|
16029
|
-
import { dirname as
|
|
16085
|
+
import { dirname as dirname26, join as join61, relative as relative12, sep as sep14 } from "path";
|
|
16030
16086
|
function safeRestore(repoDir, f, want, mode) {
|
|
16031
|
-
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));
|
|
16032
16088
|
if (rel.startsWith(".."))
|
|
16033
16089
|
throw new Error("outside repo");
|
|
16034
16090
|
let cur = root;
|
|
@@ -16121,37 +16177,6 @@ var init_discard = __esm(() => {
|
|
|
16121
16177
|
init_safe_git();
|
|
16122
16178
|
});
|
|
16123
16179
|
|
|
16124
|
-
// ../../loki-ts/src/e10ext/preexisting_dirty.ts
|
|
16125
|
-
function untouchedSinceIntake(repoDir, recorded, env = process.env) {
|
|
16126
|
-
if (!recorded || typeof recorded !== "object")
|
|
16127
|
-
return [];
|
|
16128
|
-
return Object.entries(recorded).filter(([p, h]) => {
|
|
16129
|
-
try {
|
|
16130
|
-
return blob2(repoDir, p, env) === h;
|
|
16131
|
-
} catch {
|
|
16132
|
-
return false;
|
|
16133
|
-
}
|
|
16134
|
-
}).map(([p]) => p);
|
|
16135
|
-
}
|
|
16136
|
-
var blob2 = (repoDir, path, env = process.env) => safeGit(repoDir, ["hash-object", "-w", "--no-filters", "--", path], { env }).trim();
|
|
16137
|
-
var init_preexisting_dirty = __esm(() => {
|
|
16138
|
-
init_safe_git();
|
|
16139
|
-
});
|
|
16140
|
-
|
|
16141
|
-
// ../../loki-ts/src/e10ext/commit_filter.ts
|
|
16142
|
-
import { dirname as dirname26 } from "path";
|
|
16143
|
-
function dropSet(repoDir, staged, preexistingDirty, env = process.env, installCreated) {
|
|
16144
|
-
const owned = installOwned(repoDir, installCreated, env), made = installCreated?.files ?? {};
|
|
16145
|
-
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));
|
|
16146
|
-
}
|
|
16147
|
-
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));
|
|
16148
|
-
var init_commit_filter = __esm(() => {
|
|
16149
|
-
init_preexisting_dirty();
|
|
16150
|
-
init_install();
|
|
16151
|
-
init_repo_profile();
|
|
16152
|
-
init_safe_git();
|
|
16153
|
-
});
|
|
16154
|
-
|
|
16155
16180
|
// ../../loki-ts/src/e10ext/scope.ts
|
|
16156
16181
|
import { basename as basename24, dirname as dirname27 } from "path";
|
|
16157
16182
|
function contractText(o) {
|
|
@@ -16405,8 +16430,7 @@ function parseReview(p, out2) {
|
|
|
16405
16430
|
if (!m)
|
|
16406
16431
|
return { provider: p, level: "not_run", notes: [`cross-review not run: ${p} returned no VERDICT line`] };
|
|
16407
16432
|
const level = m[1].toLowerCase();
|
|
16408
|
-
const reasons = out2.slice(m.index + m[0].length).
|
|
16409
|
-
`).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);
|
|
16410
16434
|
const notes = level === "pass" ? [] : (reasons.length ? reasons : ["no reason given"]).map((r) => `cross-review ${level} (${p}): ${r}`);
|
|
16411
16435
|
return { provider: p, level, notes };
|
|
16412
16436
|
}
|
|
@@ -16457,7 +16481,7 @@ Review ONLY the diff below. Do not modify files.` : "You are an independent code
|
|
|
16457
16481
|
var RANK3, MAX_DIFF = 60000, MAX_NOTES = 5, asProvider = (v) => {
|
|
16458
16482
|
const s = v?.trim().toLowerCase();
|
|
16459
16483
|
return s === "codex" || s === "claude" ? s : null;
|
|
16460
|
-
}, 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) => 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) => {
|
|
16461
16485
|
const n3 = Number(env["LOKI_E10_REVIEW_BOX_S"]);
|
|
16462
16486
|
return n3 > 0 ? n3 : 300;
|
|
16463
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;
|
|
@@ -16469,6 +16493,7 @@ var init_xreview = __esm(() => {
|
|
|
16469
16493
|
init_safe_git();
|
|
16470
16494
|
init_intent_card();
|
|
16471
16495
|
init_run_summary();
|
|
16496
|
+
init_reviewer_brief();
|
|
16472
16497
|
init_types();
|
|
16473
16498
|
RANK3 = { FAILED: 0, SPEC_CONFLICT: 0, PARTIAL: 1, ALREADY_SATISFIED: 2, VERIFIED: 2 };
|
|
16474
16499
|
});
|
|
@@ -17090,7 +17115,7 @@ function targetProofOf(v) {
|
|
|
17090
17115
|
const names = new Set(strs2(v?.target_checks)), raw2 = Array.isArray(v?.checks) ? v.checks : [];
|
|
17091
17116
|
return raw2.some((c) => names.has(String(c.name)) && hasExecutedProof([c]));
|
|
17092
17117
|
}
|
|
17093
|
-
function checksOf(v, pc) {
|
|
17118
|
+
function checksOf(v, pc, preRed = []) {
|
|
17094
17119
|
if (!Array.isArray(v))
|
|
17095
17120
|
return [];
|
|
17096
17121
|
return v.filter((c) => !!c && typeof c === "object").map((c) => ({
|
|
@@ -17099,11 +17124,12 @@ function checksOf(v, pc) {
|
|
|
17099
17124
|
result: c.result === "pass" || c.result === "fail" ? c.result : "not_run",
|
|
17100
17125
|
duration_s: typeof c.duration_s === "number" ? c.duration_s : 0,
|
|
17101
17126
|
provenance: checkProvenance(String(c.name ?? ""), pc),
|
|
17102
|
-
...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 } : {}
|
|
17103
17129
|
}));
|
|
17104
17130
|
}
|
|
17105
17131
|
function renderReceiptMd(r) {
|
|
17106
|
-
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";
|
|
17107
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";
|
|
17108
17134
|
return [
|
|
17109
17135
|
`## Loki receipt: ${r.verdict}`,
|
|
@@ -17217,7 +17243,7 @@ var init_seal = __esm(() => {
|
|
|
17217
17243
|
const wallNotRun = typeof base.not_run === "number" ? base.not_run : 0;
|
|
17218
17244
|
const wallGreenOnBase = wallGreenOnBaseOf(o);
|
|
17219
17245
|
const preRedChecks = strs2(o.verify?.pre_red_checks);
|
|
17220
|
-
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);
|
|
17221
17247
|
const weakTests = [];
|
|
17222
17248
|
for (let i = 0;i + 1 < rawDiff.length; i += 2)
|
|
17223
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-haS12znm.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-DmrC3mQE.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.
|