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.
Files changed (69) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/dashboard/__init__.py +1 -1
  4. package/docs/CLI-REFERENCE.md +1 -1
  5. package/docs/INSTALLATION.md +1 -1
  6. package/docs/v10/FAILURE-CLASSES.md +7 -0
  7. package/docs/v10/PROGRESS.md +3 -0
  8. package/loki-ts/dist/loki.js +1080 -1080
  9. package/mcp/__init__.py +1 -1
  10. package/package.json +2 -2
  11. package/packages/control-plane/dist/server.js +78 -52
  12. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  13. package/web-app/dist/assets/{AdminPage-Dnrp8ziS.js → AdminPage-BytHjrWT.js} +1 -1
  14. package/web-app/dist/assets/{Avatar-BD77h_ON.js → Avatar-dNf3amMe.js} +1 -1
  15. package/web-app/dist/assets/{Badge-C2BWNFqW.js → Badge-CnvI2YSE.js} +1 -1
  16. package/web-app/dist/assets/{Button-BXpKuEtI.js → Button-Bh6HJSx6.js} +1 -1
  17. package/web-app/dist/assets/{CockpitPage-Cjkt15dz.js → CockpitPage-Cgb8AAHQ.js} +1 -1
  18. package/web-app/dist/assets/{ComparePage-qrqu-1oQ.js → ComparePage-CRiAPbds.js} +1 -1
  19. package/web-app/dist/assets/{ErrorBoundary-BwDcgPBV.js → ErrorBoundary-t-0AuXcR.js} +1 -1
  20. package/web-app/dist/assets/{EvidenceReceiptPanel-DmrC3mQE.js → EvidenceReceiptPanel-BQMuZ040.js} +1 -1
  21. package/web-app/dist/assets/{GitHubIssuesPanel-CGJQMAW7.js → GitHubIssuesPanel-243WSJem.js} +1 -1
  22. package/web-app/dist/assets/{GitHubPRsPanel-BxjZ-Fx4.js → GitHubPRsPanel-Bzen0ew8.js} +1 -1
  23. package/web-app/dist/assets/{HomePage-Cm2nq40C.js → HomePage-_V2-Ukxv.js} +2 -2
  24. package/web-app/dist/assets/{LoginPage-BiMQBCw6.js → LoginPage-DYKXRZEd.js} +1 -1
  25. package/web-app/dist/assets/{MagicPage-NgC4HJgz.js → MagicPage-BXo9VpH1.js} +1 -1
  26. package/web-app/dist/assets/{MetricsPage-CVEsvnrS.js → MetricsPage-BOHwqyBx.js} +1 -1
  27. package/web-app/dist/assets/{NotFoundPage-D2JCAqJu.js → NotFoundPage-m1C1pOjw.js} +1 -1
  28. package/web-app/dist/assets/{ProjectPage-qlLKSp71.js → ProjectPage-Don7b0uX.js} +3 -3
  29. package/web-app/dist/assets/{ProjectsPage-f8AT-G30.js → ProjectsPage-CT05Xbvx.js} +1 -1
  30. package/web-app/dist/assets/{SettingsPage-Wz5wMTEZ.js → SettingsPage-K1RdqdPo.js} +1 -1
  31. package/web-app/dist/assets/{ShowcasePage-xZoQGRKG.js → ShowcasePage-BNMXSbLn.js} +1 -1
  32. package/web-app/dist/assets/{SystemSettingsPage-0-I4dYGj.js → SystemSettingsPage-Cb5sPNHw.js} +1 -1
  33. package/web-app/dist/assets/{TeamsPage-D-cDH7vH.js → TeamsPage-DwIExIGI.js} +1 -1
  34. package/web-app/dist/assets/{TemplatesPage-N66vLiuE.js → TemplatesPage-Bbp0kGfr.js} +1 -1
  35. package/web-app/dist/assets/{TerminalOutput-D5-u-UqN.js → TerminalOutput-B7SAJSSx.js} +1 -1
  36. package/web-app/dist/assets/{activity-ITMDDsAx.js → activity-DLDtD-RP.js} +1 -1
  37. package/web-app/dist/assets/{bell-DKDoEbOg.js → bell-BhnIrwOh.js} +1 -1
  38. package/web-app/dist/assets/{bot-jljmqB_U.js → bot-Bi7rc3U-.js} +1 -1
  39. package/web-app/dist/assets/{check-Dt8EfSuQ.js → check-BOKbqsD5.js} +1 -1
  40. package/web-app/dist/assets/{chevron-left-CCR2wESF.js → chevron-left-CoVTOJ_R.js} +1 -1
  41. package/web-app/dist/assets/{circle-alert-BEk-GdAd.js → circle-alert-CKekYuWI.js} +1 -1
  42. package/web-app/dist/assets/{clock-CLYzZXuC.js → clock-aZ0Z-ePQ.js} +1 -1
  43. package/web-app/dist/assets/{cloud-BUU1JKG5.js → cloud-BxoicqtX.js} +1 -1
  44. package/web-app/dist/assets/{code-xml-C7qaS3yN.js → code-xml-C1Rs6VBh.js} +1 -1
  45. package/web-app/dist/assets/{database-Cmz52NyA.js → database-FZtGtKtF.js} +1 -1
  46. package/web-app/dist/assets/{dollar-sign-CZZIoKak.js → dollar-sign-DXLiAjF0.js} +1 -1
  47. package/web-app/dist/assets/{file-code-corner-DjPu6647.js → file-code-corner-Dd3V5YQW.js} +1 -1
  48. package/web-app/dist/assets/{file-plus--3joal_S.js → file-plus-CSYUdRrx.js} +1 -1
  49. package/web-app/dist/assets/{globe-Bw8BQlPB.js → globe-fdKGcy1_.js} +1 -1
  50. package/web-app/dist/assets/{hammer-B4NVGnxW.js → hammer-Def0UqNM.js} +1 -1
  51. package/web-app/dist/assets/{index-haS12znm.js → index-CNMmdSPA.js} +3 -3
  52. package/web-app/dist/assets/{layers-CHadYuxv.js → layers-Bgc7TP2t.js} +1 -1
  53. package/web-app/dist/assets/{loader-circle-DoepZDHN.js → loader-circle-jmPs0bD2.js} +1 -1
  54. package/web-app/dist/assets/{lock-CVuC-Asv.js → lock-BKIF1VmL.js} +1 -1
  55. package/web-app/dist/assets/{package-RE4sFnhR.js → package-DhhpGwnm.js} +1 -1
  56. package/web-app/dist/assets/{plus-1OIfUPbK.js → plus-BlNVdkl3.js} +1 -1
  57. package/web-app/dist/assets/{refresh-cw-maqNC4YR.js → refresh-cw-C20PCDgA.js} +1 -1
  58. package/web-app/dist/assets/{rotate-ccw-BEaz-jtK.js → rotate-ccw-C4PlFq8d.js} +1 -1
  59. package/web-app/dist/assets/{scroll-text-BaH8Ls9M.js → scroll-text-DAbCSrb9.js} +1 -1
  60. package/web-app/dist/assets/{server--SAyQsac.js → server-4AzyKwOe.js} +1 -1
  61. package/web-app/dist/assets/{shield-alert-DMvh30VS.js → shield-alert-DMZNCvUV.js} +1 -1
  62. package/web-app/dist/assets/{thumbs-up-Clpz9KnO.js → thumbs-up-D8m-2YKD.js} +1 -1
  63. package/web-app/dist/assets/{trash-2-htd-Z1-P.js → trash-2-D_bXC3JF.js} +1 -1
  64. package/web-app/dist/assets/{trending-down-Crkm1od2.js → trending-down-4BqvwC8V.js} +1 -1
  65. package/web-app/dist/assets/{trending-up-BY9SxYuD.js → trending-up-C8eCGVRi.js} +1 -1
  66. package/web-app/dist/assets/{upload-5w_GUOcy.js → upload-DtXbAChx.js} +1 -1
  67. package/web-app/dist/assets/{usePolling-DpkAwy1-.js → usePolling-BQG2Axwp.js} +1 -1
  68. package/web-app/dist/assets/{user-Bh4AVoPX.js → user-CIHTfrI5.js} +1 -1
  69. package/web-app/dist/index.html +1 -1
package/mcp/__init__.py CHANGED
@@ -75,4 +75,4 @@ try:
75
75
  except ImportError:
76
76
  __all__ = ['mcp']
77
77
 
78
- __version__ = '11.17.96'
78
+ __version__ = '11.17.97'
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.96",
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": "c08fc0dd1f798d0c6c56e72e5213959381a26b19"
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 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";
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 dirname20, isAbsolute as isAbsolute9, join as join54, normalize as normalize3, relative as relative9, sep as sep13 } from "path";
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(dirname20(receiptPath), receipt["evidence_screens"]);
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 dirname21, join as join56 } from "path";
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(dirname21(p), { recursive: true });
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 dirname22 } from "path";
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 = dirname22(fileURLToPath5(import.meta.url));
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 dirname23, join as join58 } from "path";
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(dirname23(join58(dir, f)), { recursive: true });
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 dirname24, join as join60, relative as relative11 } from "path";
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, dirname24(first.path)) : join60(repoDir, "tests");
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 dirname25, join as join61, relative as relative12, sep as sep14 } from "path";
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, dirname25(fp));
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).split(`
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, " ").trim().slice(0, 300), reviewBoxS = (env = process.env) => {
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.96",
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-haS12znm.js";import{B as C}from"./Button-BXpKuEtI.js";import{T as $e}from"./trending-up-BY9SxYuD.js";import{C as z}from"./clock-CLYzZXuC.js";import{A as Be,U as ue,M as De}from"./Avatar-BD77h_ON.js";import{A as J}from"./activity-ITMDDsAx.js";import{R as pe}from"./refresh-cw-maqNC4YR.js";import{G as ze}from"./globe-Bw8BQlPB.js";import{C as Le}from"./chevron-left-CCR2wESF.js";import{C as je}from"./check-Dt8EfSuQ.js";import{D as Y}from"./dollar-sign-CZZIoKak.js";import{U as Te}from"./user-Bh4AVoPX.js";import{D as Me}from"./database-Cmz52NyA.js";import{L as Ue}from"./lock-CVuC-Asv.js";import{S as Re}from"./scroll-text-BaH8Ls9M.js";import{S as Ie}from"./shield-alert-DMvh30VS.js";/**
1
+ import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-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,4 +1,4 @@
1
- import{c as l,j as s}from"./index-haS12znm.js";/**
1
+ import{c as l,j as s}from"./index-CNMmdSPA.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-haS12znm.js";import{C as r}from"./clock-CLYzZXuC.js";import{C as a}from"./circle-alert-BEk-GdAd.js";import{C as l}from"./check-Dt8EfSuQ.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
1
+ import{j as e}from"./index-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-haS12znm.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
1
+ import{r as p,j as t}from"./index-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-haS12znm.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-BwDcgPBV.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-Clpz9KnO.js";import{C as oe}from"./check-Dt8EfSuQ.js";import{C as Ye}from"./clock-CLYzZXuC.js";import{D as Xe}from"./dollar-sign-CZZIoKak.js";import{U as Ze}from"./upload-5w_GUOcy.js";import{L as V}from"./loader-circle-DoepZDHN.js";/**
1
+ import{c as $,r as l,j as e,G as we,Q as Se,F as Ce,h as Re,T as U,Z as Ee,a as S,V as Me,S as $e,Y as Te,X as Pe,P as ie,i as Ae,g as ze,C as Ie,l as Le,N as I,J as _e,K as De,O as Fe,u as Oe}from"./index-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};
@@ -1,4 +1,4 @@
1
- import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-haS12znm.js";/**
1
+ import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-CNMmdSPA.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as l,a as x,j as e}from"./index-haS12znm.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`${s.cost.cost_partial===!0?"at least ":""}$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
1
+ import{r as l,a as x,j as e}from"./index-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-haS12znm.js";import{B as N}from"./Button-BXpKuEtI.js";import{C as y}from"./thumbs-up-Clpz9KnO.js";import{R as S}from"./refresh-cw-maqNC4YR.js";import{C as z}from"./circle-alert-BEk-GdAd.js";import{U as D}from"./user-Bh4AVoPX.js";import{L as G}from"./loader-circle-DoepZDHN.js";import{R as T}from"./rotate-ccw-BEaz-jtK.js";/**
1
+ import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-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-haS12znm.js";import{B as y}from"./Button-BXpKuEtI.js";import{C as ge}from"./chevron-left-CCR2wESF.js";import{G as P}from"./thumbs-up-Clpz9KnO.js";import{R as $}from"./refresh-cw-maqNC4YR.js";import{C as Ne}from"./circle-alert-BEk-GdAd.js";import{L as Q,S as je}from"./ProjectPage-qlLKSp71.js";import{S as se}from"./shield-alert-DMvh30VS.js";import{F as ye}from"./file-code-corner-DjPu6647.js";import{C as V}from"./clock-CLYzZXuC.js";import{C as re}from"./check-Dt8EfSuQ.js";import"./ErrorBoundary-BwDcgPBV.js";import"./TerminalOutput-D5-u-UqN.js";import"./lock-CVuC-Asv.js";import"./package-RE4sFnhR.js";import"./file-plus--3joal_S.js";import"./activity-ITMDDsAx.js";import"./scroll-text-BaH8Ls9M.js";import"./bot-jljmqB_U.js";import"./loader-circle-DoepZDHN.js";import"./hammer-B4NVGnxW.js";import"./dollar-sign-CZZIoKak.js";import"./globe-Bw8BQlPB.js";import"./trash-2-htd-Z1-P.js";import"./upload-5w_GUOcy.js";import"./plus-1OIfUPbK.js";import"./rotate-ccw-BEaz-jtK.js";import"./code-xml-C7qaS3yN.js";import"./trending-up-BY9SxYuD.js";import"./layers-CHadYuxv.js";import"./trending-down-Crkm1od2.js";import"./server--SAyQsac.js";/**
1
+ import{c as I,r as c,a as b,j as e,G as me,A as ue,S as Z,k as ee,m as pe,h as he,p as fe,X as te,M as be}from"./index-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.