loki-mode 11.63.6 → 11.63.8

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 (68) 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 +32 -0
  7. package/loki-ts/dist/loki.js +1109 -1109
  8. package/mcp/__init__.py +1 -1
  9. package/package.json +2 -2
  10. package/packages/control-plane/dist/server.js +73 -53
  11. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  12. package/web-app/dist/assets/{AdminPage-BqrBhLrU.js → AdminPage-MRok4gpK.js} +1 -1
  13. package/web-app/dist/assets/{Avatar-c3dwr33S.js → Avatar-C5naIgXq.js} +1 -1
  14. package/web-app/dist/assets/{Badge-CzJjwVLx.js → Badge-zigD7yw6.js} +1 -1
  15. package/web-app/dist/assets/{Button-CTy2MQxg.js → Button-DcMIUy9q.js} +1 -1
  16. package/web-app/dist/assets/{CockpitPage-C3Vi3JeD.js → CockpitPage-D7Bunb6e.js} +1 -1
  17. package/web-app/dist/assets/{ComparePage-C4PjmUqx.js → ComparePage-r1MlVPTe.js} +1 -1
  18. package/web-app/dist/assets/{ErrorBoundary-61LXvXCB.js → ErrorBoundary-Dk4uHaS4.js} +1 -1
  19. package/web-app/dist/assets/{EvidenceReceiptPanel-CrZIM7TB.js → EvidenceReceiptPanel-C9ab9NGb.js} +1 -1
  20. package/web-app/dist/assets/{GitHubIssuesPanel-B8stqG2T.js → GitHubIssuesPanel-DXE21JW5.js} +1 -1
  21. package/web-app/dist/assets/{GitHubPRsPanel-sNXt96L_.js → GitHubPRsPanel-CEEJDQaF.js} +1 -1
  22. package/web-app/dist/assets/{HomePage-DIfpOJgC.js → HomePage-Cc1RJgQP.js} +2 -2
  23. package/web-app/dist/assets/{LoginPage-BTi4xnWh.js → LoginPage-BgK3Un7s.js} +1 -1
  24. package/web-app/dist/assets/{MagicPage-4yaraVT5.js → MagicPage-DracOHYk.js} +1 -1
  25. package/web-app/dist/assets/{MetricsPage-CQNvj08h.js → MetricsPage-dpzE7rHk.js} +1 -1
  26. package/web-app/dist/assets/{NotFoundPage-aSWTyLYN.js → NotFoundPage-CwR1prG_.js} +1 -1
  27. package/web-app/dist/assets/{ProjectPage-Ddccygvc.js → ProjectPage-DDeC9Cfy.js} +3 -3
  28. package/web-app/dist/assets/{ProjectsPage-DIQS0hgl.js → ProjectsPage-o3OfxJRf.js} +1 -1
  29. package/web-app/dist/assets/{SettingsPage-BWCOujjy.js → SettingsPage-PI85tG1v.js} +1 -1
  30. package/web-app/dist/assets/{ShowcasePage-DVijgj3R.js → ShowcasePage-iYe1cAHf.js} +1 -1
  31. package/web-app/dist/assets/{SystemSettingsPage-50CYulha.js → SystemSettingsPage-B-dy7aEZ.js} +1 -1
  32. package/web-app/dist/assets/{TeamsPage-CbM1fVl5.js → TeamsPage-CKN0wlJv.js} +1 -1
  33. package/web-app/dist/assets/{TemplatesPage-B6LkabW8.js → TemplatesPage-2Kkm5kRO.js} +1 -1
  34. package/web-app/dist/assets/{TerminalOutput-ZGEVkBjN.js → TerminalOutput-CsrWjt5Z.js} +1 -1
  35. package/web-app/dist/assets/{activity-DWg-a8HM.js → activity-DRUoEUMH.js} +1 -1
  36. package/web-app/dist/assets/{bell-BA8SO1BZ.js → bell-DVtpHIbp.js} +1 -1
  37. package/web-app/dist/assets/{bot-Dj1G2wPc.js → bot-DQR3Z51i.js} +1 -1
  38. package/web-app/dist/assets/{check-0MMKvH_b.js → check-Cuz-bgBo.js} +1 -1
  39. package/web-app/dist/assets/{chevron-left-D2tvNtha.js → chevron-left-D6t1u2bZ.js} +1 -1
  40. package/web-app/dist/assets/{circle-alert-ClLmCb9H.js → circle-alert-BrbRSY0L.js} +1 -1
  41. package/web-app/dist/assets/{clock-BcYg4CbF.js → clock-Ch7TiuRG.js} +1 -1
  42. package/web-app/dist/assets/{cloud-DScV2ym_.js → cloud-D9FgjItJ.js} +1 -1
  43. package/web-app/dist/assets/{code-xml-PzD_GHOV.js → code-xml-CTOxq-IZ.js} +1 -1
  44. package/web-app/dist/assets/{database-DkNvl_RN.js → database-BXiIVvsI.js} +1 -1
  45. package/web-app/dist/assets/{dollar-sign-DFw0wfF5.js → dollar-sign-DSOoLXMA.js} +1 -1
  46. package/web-app/dist/assets/{file-code-corner-4_gDdWfg.js → file-code-corner-BSZSLbUC.js} +1 -1
  47. package/web-app/dist/assets/{file-plus-DqJS01uJ.js → file-plus-wDq2a4vY.js} +1 -1
  48. package/web-app/dist/assets/{globe-BN3TgkGk.js → globe-DJKmdNYO.js} +1 -1
  49. package/web-app/dist/assets/{hammer-Da6c35qJ.js → hammer-DL5Cuz8k.js} +1 -1
  50. package/web-app/dist/assets/{index-DVqNa4d0.js → index-D7h5Efxx.js} +3 -3
  51. package/web-app/dist/assets/{layers-DlcSJZDL.js → layers-BMAnvaPd.js} +1 -1
  52. package/web-app/dist/assets/{loader-circle-CINTFm3f.js → loader-circle-21-GyiHr.js} +1 -1
  53. package/web-app/dist/assets/{lock-rAToqLiU.js → lock-D1n5V1WB.js} +1 -1
  54. package/web-app/dist/assets/{package-BYMwMiES.js → package-BZQKnof2.js} +1 -1
  55. package/web-app/dist/assets/{plus-Bh1HlHQv.js → plus-DcZZjvq4.js} +1 -1
  56. package/web-app/dist/assets/{refresh-cw-DaeK7Ods.js → refresh-cw-DhVQ14GV.js} +1 -1
  57. package/web-app/dist/assets/{rotate-ccw-Chk6Gdgc.js → rotate-ccw-B3FdQA22.js} +1 -1
  58. package/web-app/dist/assets/{scroll-text-B3u8BDIA.js → scroll-text-CeT_KqRE.js} +1 -1
  59. package/web-app/dist/assets/{server-DE3tbGzp.js → server-DqUuxOrt.js} +1 -1
  60. package/web-app/dist/assets/{shield-alert-C32hZ9Rc.js → shield-alert-BtatVxYq.js} +1 -1
  61. package/web-app/dist/assets/{thumbs-up-BIfkyGbJ.js → thumbs-up-D4fCUUuq.js} +1 -1
  62. package/web-app/dist/assets/{trash-2-CfdENJNz.js → trash-2-BHNJqbo6.js} +1 -1
  63. package/web-app/dist/assets/{trending-down-D3hsimI0.js → trending-down-CPggV6Fp.js} +1 -1
  64. package/web-app/dist/assets/{trending-up-BSa2-Sso.js → trending-up-CnR04ozf.js} +1 -1
  65. package/web-app/dist/assets/{upload-DuwEvjeQ.js → upload-DGc43kol.js} +1 -1
  66. package/web-app/dist/assets/{usePolling-oGWxrsCy.js → usePolling-CJr1dy5R.js} +1 -1
  67. package/web-app/dist/assets/{user-nAFrf6fv.js → user-45NLDfA3.js} +1 -1
  68. 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.63.6'
78
+ __version__ = '11.63.8'
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.63.6",
4
+ "version": "11.63.8",
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": "5bc5f4dd02a66e80fd4b3fa425a8c87d908d04ad"
163
+ "gitHead": "8eac2523ffe4553e7685a7b8e248b313f3f9d6c9"
164
164
  }
@@ -7828,10 +7828,11 @@ function resolveClaudeModel(want) {
7828
7828
  return want;
7829
7829
  }
7830
7830
  }
7831
- var FAMILY_ALIASES;
7831
+ var FAMILY_ALIASES, VALID_TIERS;
7832
7832
  var init_claude_model = __esm(() => {
7833
7833
  init_paths();
7834
7834
  FAMILY_ALIASES = new Set(["haiku", "sonnet", "opus", "fable"]);
7835
+ VALID_TIERS = new Set(["planning", "development", "fast", "opus", "sonnet", "haiku", "fable"]);
7835
7836
  });
7836
7837
 
7837
7838
  // ../../loki-ts/src/runner/watchdog.ts
@@ -9179,6 +9180,7 @@ var init_session = __esm(() => {
9179
9180
  init_session_resume();
9180
9181
  init_session_route();
9181
9182
  init_safe_git();
9183
+ init_providers();
9182
9184
  init_cost_breakdown();
9183
9185
  init_providers();
9184
9186
  init_provider_guard();
@@ -10226,6 +10228,12 @@ function runnerCmd(t, repoDir) {
10226
10228
  return CARGO_TEST_FILE_RE.test(t.path) ? ["cargo", ["test", "--test", basename12(t.path, ".rs")]] : ["cargo", ["test"]];
10227
10229
  }
10228
10230
  }
10231
+ function fullSuiteCmd(runner, repoDir) {
10232
+ if (runner !== "pytest")
10233
+ return FULL_SUITE_STATIC[runner];
10234
+ const [cmd, interpreter, pre] = resolveTool(repoDir, "python", "python3", "python");
10235
+ return { cmd, args: [...pre, "-m", "pytest", "-q"], interpreter };
10236
+ }
10229
10237
  function commandFor(t, repoDir, api) {
10230
10238
  const site = siteFor(api, repoDir, t.path);
10231
10239
  const [cmd, args, interpreter] = runnerCmd(site ? { runner: t.runner, path: site.file } : t, repoDir);
@@ -10310,7 +10318,7 @@ var NO_TESTS_REASON = "no tests executed", NO_RUNNER_REASON = "no runner of this
10310
10318
  }, EXCERPT_GROUP_CAP = 1500, EXCERPT_TOTAL_CAP = 6144, verifyJobs = () => {
10311
10319
  const n2 = Number.parseInt(process.env["LOKI_E10_VERIFY_JOBS"] ?? "", 10);
10312
10320
  return Number.isFinite(n2) && n2 >= 1 ? Math.min(n2, 8) : 1;
10313
- }, FULL_SUITE_CMD, ALREADY_FAILING_ON_BASE = "already failing on base, not caused by this change", SKIPPED_BY_REPO = "skipped by the repo on base and head", checkResultLabel = (result, preRed, repoSkipped = false) => result === "fail" && preRed ? `fail (${ALREADY_FAILING_ON_BASE})` : result === "not_run" && repoSkipped ? `not_run (${SKIPPED_BY_REPO})` : result, blobSha = (b, hex) => createHash8(hex === 64 ? "sha256" : "sha1").update(Buffer.concat([Buffer.from(`blob ${b.length}\x00`), b])).digest("hex");
10321
+ }, FULL_SUITE_STATIC, ALREADY_FAILING_ON_BASE = "already failing on base, not caused by this change", SKIPPED_BY_REPO = "skipped by the repo on base and head", checkResultLabel = (result, preRed, repoSkipped = false) => result === "fail" && preRed ? `fail (${ALREADY_FAILING_ON_BASE})` : result === "not_run" && repoSkipped ? `not_run (${SKIPPED_BY_REPO})` : result, blobSha = (b, hex) => createHash8(hex === 64 ? "sha256" : "sha1").update(Buffer.concat([Buffer.from(`blob ${b.length}\x00`), b])).digest("hex");
10314
10322
  var init_check_result = __esm(() => {
10315
10323
  init_resolve();
10316
10324
  init_testmap();
@@ -10360,8 +10368,7 @@ var init_check_result = __esm(() => {
10360
10368
  DOC_FILE = /\.(md|mdx|txt|rst|adoc)$/i;
10361
10369
  OWNER_FILES = [".github/CODEOWNERS", "CODEOWNERS", "docs/CODEOWNERS"];
10362
10370
  CRITICAL_TOKENS = /^(release|publish|sign|signing|signer|auth|security|seal|verif\w*)$/i;
10363
- FULL_SUITE_CMD = {
10364
- pytest: { cmd: "python", args: ["-m", "pytest", "-q"] },
10371
+ FULL_SUITE_STATIC = {
10365
10372
  vitest: { cmd: "npx", args: ["vitest", "run"] },
10366
10373
  jest: { cmd: "npx", args: ["jest"] },
10367
10374
  bun: { cmd: "bun", args: ["test"] },
@@ -15262,11 +15269,12 @@ async function sealEvidence(repoDir, runDir, o, notProven, signal, emit) {
15262
15269
  const ev = await captureVisualEvidence(repoDir, runDir, cf, { signal, onServer: (pgid) => emit?.("session.started", "seal", { session_id: "visual-evidence", provider: "visual-evidence", model: null, pgid }) });
15263
15270
  if (signal?.aborted)
15264
15271
  throw new Error("seal aborted: visual evidence discarded");
15265
- if (ev.skipped)
15272
+ const noUi = ev.skipped !== null && ev.skipped !== undefined && /^no package\.json$|^no dev, preview or start script$/.test(ev.skipped) && process.env["LOKI_VISUAL_EVIDENCE"] !== "1" && !cf.some(isPageFile);
15273
+ if (ev.skipped && !noUi)
15266
15274
  notProven.add(`visual evidence skipped: ${ev.skipped}`);
15267
15275
  if (ev.e2eSkipped)
15268
15276
  notProven.add(ev.e2eSkipped);
15269
- if (visualGateEnabled() && ev.skipped && !/^no changed page files/.test(ev.skipped))
15277
+ if (visualGateEnabled() && ev.skipped && !noUi && !/^no changed page files/.test(ev.skipped))
15270
15278
  return { evidence_failed: ev.skipped };
15271
15279
  return ev.screens.length > 0 ? { evidence_screens: ev.screens } : {};
15272
15280
  }
@@ -15618,7 +15626,7 @@ async function runFullSuite(ctx, signal, opts, checks, notProven) {
15618
15626
  return;
15619
15627
  }
15620
15628
  for (const runner of map.runners) {
15621
- const spec = FULL_SUITE_CMD[runner];
15629
+ const spec = fullSuiteCmd(runner, ctx.repoDir);
15622
15630
  const name = `full suite: ${runner}`;
15623
15631
  if (!Bun.which(spec.cmd, opts.path ? { PATH: opts.path } : undefined)) {
15624
15632
  checks.push({ name, cmd: [spec.cmd, ...spec.args].join(" "), result: "not_run", duration_s: 0 });
@@ -15852,7 +15860,7 @@ var init_deep = __esm(() => {
15852
15860
  });
15853
15861
 
15854
15862
  // ../../loki-ts/src/engine10/stages/verify.ts
15855
- import { existsSync as existsSync39, mkdtempSync as mkdtempSync10, rmSync as rmSync19 } from "fs";
15863
+ import { existsSync as existsSync39, mkdtempSync as mkdtempSync10, readFileSync as readFileSync48, rmSync as rmSync19 } from "fs";
15856
15864
  import { tmpdir as tmpdir11 } from "os";
15857
15865
  import { basename as basename23, isAbsolute as isAbsolute11, join as join60, relative as relative12 } from "path";
15858
15866
  async function runOnce2(cmd2, args, cwd, signal, opts) {
@@ -15969,13 +15977,25 @@ async function subtractBase(ctx, api, checks, tests, changed, wall, rel, signal,
15969
15977
  function isLokiModeRepo(repoDir) {
15970
15978
  return existsSync39(join60(repoDir, "scripts", "select-tests.sh"));
15971
15979
  }
15980
+ function projectDeclaresRuff(repoDir) {
15981
+ if (["ruff.toml", ".ruff.toml"].some((f) => existsSync39(join60(repoDir, f))))
15982
+ return true;
15983
+ const files = ["pyproject.toml", "setup.cfg", "tox.ini", ".pre-commit-config.yaml", "Pipfile", "requirements.txt", "requirements-dev.txt", "dev-requirements.txt"];
15984
+ return files.some((f) => {
15985
+ try {
15986
+ return /\bruff\b/i.test(readFileSync48(join60(repoDir, f), "utf8"));
15987
+ } catch {
15988
+ return false;
15989
+ }
15990
+ });
15991
+ }
15972
15992
  async function runLintChecks(ctx, changed, signal, checks, opts = {}) {
15973
15993
  const { api, ...runOpts } = opts;
15974
15994
  opts = runOpts;
15975
15995
  const pre = [];
15976
15996
  const py = changed.filter((f) => f.endsWith(".py"));
15977
- if (py.length) {
15978
- const [ruffCmd, interpreter, uvPre] = resolveTool(ctx.repoDir, "ruff", "ruff");
15997
+ const [ruffCmd, interpreter, uvPre] = py.length ? resolveTool(ctx.repoDir, "ruff", "ruff") : ["ruff", "system", []];
15998
+ if (py.length && (interpreter !== "system" || Bun.which("ruff", { PATH: process.env["PATH"] ?? "" }) || projectDeclaresRuff(ctx.repoDir))) {
15979
15999
  const c = await runCheck(ctx, "lint:ruff", ruffCmd, [...uvPre, "check", "--output-format=concise", ...py], signal, checks, { ...opts, interpreter, kind: "static" });
15980
16000
  if (await excuseLint(ctx, signal, c, "ruff", ruffCmd, [...uvPre, "check"], ctx.repoDir, py, opts))
15981
16001
  pre.push(c.name);
@@ -16190,7 +16210,7 @@ ${x}` : c.cmd };
16190
16210
 
16191
16211
  // ../../loki-ts/src/engine10/stages/wall.ts
16192
16212
  import { spawnSync as spawnSync7 } from "child_process";
16193
- import { existsSync as existsSync40, mkdirSync as mkdirSync25, mkdtempSync as mkdtempSync11, readFileSync as readFileSync48, readdirSync as readdirSync21, rmSync as rmSync20, writeFileSync as writeFileSync28 } from "fs";
16213
+ import { existsSync as existsSync40, mkdirSync as mkdirSync25, mkdtempSync as mkdtempSync11, readFileSync as readFileSync49, readdirSync as readdirSync21, rmSync as rmSync20, writeFileSync as writeFileSync28 } from "fs";
16194
16214
  import { tmpdir as tmpdir12 } from "os";
16195
16215
  import { dirname as dirname26, join as join61, relative as relative13 } from "path";
16196
16216
 
@@ -16260,7 +16280,7 @@ function loadTaskText(ctx, fromPrior) {
16260
16280
  const issueJsonPath = process.env.LOKI_E10_ISSUE_JSON ?? join61(ctx.runDir, "issue.json");
16261
16281
  if (existsSync40(issueJsonPath)) {
16262
16282
  try {
16263
- const issue = JSON.parse(readFileSync48(issueJsonPath, "utf8"));
16283
+ const issue = JSON.parse(readFileSync49(issueJsonPath, "utf8"));
16264
16284
  const text2 = [issue.title, issue.body].filter((s) => typeof s === "string" && s.length > 0).join(`
16265
16285
 
16266
16286
  `);
@@ -16320,20 +16340,20 @@ async function wallAuthor(ctx, signal, retry) {
16320
16340
  }
16321
16341
  const planText = typeof prior.plan?.plan === "string" ? prior.plan.plan : null, repoFiles = repoMap?.files ?? [];
16322
16342
  const oor = () => readdirSync21(cwd).filter((f) => f.startsWith(WALL_PREFIX)).flatMap((name) => {
16323
- const text2 = readFileSync48(join61(cwd, name), "utf8"), why = outOfRepoTarget(text2) ?? phantomReason(phantomRepoPaths(text2, name, targetDir, ctx.repoDir, planText), repoFiles, relative13(ctx.repoDir, targetDir), pkg?.root ?? "");
16343
+ const text2 = readFileSync49(join61(cwd, name), "utf8"), why = outOfRepoTarget(text2) ?? phantomReason(phantomRepoPaths(text2, name, targetDir, ctx.repoDir, planText), repoFiles, relative13(ctx.repoDir, targetDir), pkg?.root ?? "");
16324
16344
  return why ? [{ name, why }] : [];
16325
16345
  });
16326
16346
  const bad1 = oor();
16327
16347
  if (bad1.length > 0 && !signal.aborted && !ctx.overCap?.())
16328
16348
  await ctx.sessions.run({ stage: "wall", brief: withStagePrefix(outOfRepoReask("Rewrite these Wall files in place, keeping the same names and acceptance coverage.", bad1)), tier: "development", model, iterationId: `${iterationId}-oor`, limitS: wallLimitS(sz.size), signal, cwd });
16329
- const oorBad = new Map(oor().map((b) => [b.name, b.why])), all = readdirSync21(cwd).filter((f) => f.startsWith(WALL_PREFIX)), held = stashHoldout({ runId: ctx.runId, repoDir: ctx.repoDir, srcDir: cwd, targetDir, names: all.filter((n2) => !oorBad.has(n2) && !conventionViolation(conv2, n2, readFileSync48(join61(cwd, n2), "utf8"))), runnerOf: (n2) => guessRunner(n2, runners) }), generated = all.filter((n2) => !held?.names.has(n2));
16349
+ const oorBad = new Map(oor().map((b) => [b.name, b.why])), all = readdirSync21(cwd).filter((f) => f.startsWith(WALL_PREFIX)), held = stashHoldout({ runId: ctx.runId, repoDir: ctx.repoDir, srcDir: cwd, targetDir, names: all.filter((n2) => !oorBad.has(n2) && !conventionViolation(conv2, n2, readFileSync49(join61(cwd, n2), "utf8"))), runnerOf: (n2) => guessRunner(n2, runners) }), generated = all.filter((n2) => !held?.names.has(n2));
16330
16350
  const sealedDir = join61(ctx.runDir, "wall");
16331
16351
  if (generated.length > 0)
16332
16352
  mkdirSync25(sealedDir, { recursive: true });
16333
16353
  const contents = new Map;
16334
16354
  const discarded = [];
16335
16355
  for (const name of generated) {
16336
- const content = readFileSync48(join61(cwd, name), "utf8"), oorWhy = oorBad.get(name), bad = oorWhy ?? conventionViolation(conv2, name, content);
16356
+ const content = readFileSync49(join61(cwd, name), "utf8"), oorWhy = oorBad.get(name), bad = oorWhy ?? conventionViolation(conv2, name, content);
16337
16357
  writeFileSync28(join61(sealedDir, name), content, "utf8");
16338
16358
  if (oorWhy)
16339
16359
  discarded.push({ file: name, reason: `${oorWhy}; wall test discarded after one rewrite request` });
@@ -16457,7 +16477,7 @@ var init_wall = __esm(() => {
16457
16477
  });
16458
16478
 
16459
16479
  // ../../loki-ts/src/e10ext/discard.ts
16460
- import { chmodSync as chmodSync6, closeSync as closeSync9, lstatSync as lstatSync16, mkdirSync as mkdirSync26, openSync as openSync9, readFileSync as readFileSync49, realpathSync as realpathSync23, rmdirSync, unlinkSync as unlinkSync7, writeFileSync as writeFileSync29 } from "fs";
16480
+ import { chmodSync as chmodSync6, closeSync as closeSync9, lstatSync as lstatSync16, mkdirSync as mkdirSync26, openSync as openSync9, readFileSync as readFileSync50, realpathSync as realpathSync23, rmdirSync, unlinkSync as unlinkSync7, writeFileSync as writeFileSync29 } from "fs";
16461
16481
  import { dirname as dirname27, join as join62, relative as relative14, sep as sep14 } from "path";
16462
16482
  function safeRestore(repoDir, f, want, mode) {
16463
16483
  const root = realpathSync23(repoDir), fp = join62(root, f), rel = relative14(root, dirname27(fp));
@@ -16482,7 +16502,7 @@ function safeRestore(repoDir, f, want, mode) {
16482
16502
  } catch {
16483
16503
  st = null;
16484
16504
  }
16485
- if (st?.isFile() && readFileSync49(fp).equals(want)) {
16505
+ if (st?.isFile() && readFileSync50(fp).equals(want)) {
16486
16506
  chmodSync6(fp, mode);
16487
16507
  return;
16488
16508
  }
@@ -16584,14 +16604,14 @@ var init_scope2 = __esm(() => {
16584
16604
  });
16585
16605
 
16586
16606
  // ../../loki-ts/src/council/role_agents.ts
16587
- import { existsSync as existsSync41, readdirSync as readdirSync22, readFileSync as readFileSync50 } from "fs";
16607
+ import { existsSync as existsSync41, readdirSync as readdirSync22, readFileSync as readFileSync51 } from "fs";
16588
16608
  import { homedir as homedir9 } from "os";
16589
16609
  import { join as join63 } from "path";
16590
16610
  function agentDirs(repoDir, env = process.env) {
16591
16611
  return [env["LOKI_AGENTS_PROJECT_DIR"] || join63(repoDir, ".loki", "agents"), env["LOKI_AGENTS_USER_DIR"] || join63(env["XDG_CONFIG_HOME"] || join63(homedir9(), ".config"), "loki", "agents")];
16592
16612
  }
16593
16613
  function parseAgent(file, stem2) {
16594
- const m = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/.exec(readFileSync50(file, "utf8"));
16614
+ const m = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/.exec(readFileSync51(file, "utf8"));
16595
16615
  if (!m)
16596
16616
  return null;
16597
16617
  const body = m[2].trim();
@@ -16711,14 +16731,14 @@ var init_colors = __esm(() => {
16711
16731
  });
16712
16732
 
16713
16733
  // ../../loki-ts/src/util/run_summary.ts
16714
- import { existsSync as existsSync42, mkdirSync as mkdirSync28, readFileSync as readFileSync51, renameSync as renameSync13, statSync as statSync20, writeFileSync as writeFileSync30 } from "fs";
16734
+ import { existsSync as existsSync42, mkdirSync as mkdirSync28, readFileSync as readFileSync52, renameSync as renameSync13, statSync as statSync20, writeFileSync as writeFileSync30 } from "fs";
16715
16735
  import { join as join65 } from "path";
16716
16736
  function readRiskRecord(repoDir, sinceMs = 0) {
16717
16737
  try {
16718
16738
  const p = join65(repoDir, ".loki", "state", "risk-tier.json");
16719
16739
  if (statSync20(p).mtimeMs < sinceMs)
16720
16740
  return null;
16721
- const r = JSON.parse(readFileSync51(p, "utf8"));
16741
+ const r = JSON.parse(readFileSync52(p, "utf8"));
16722
16742
  return r && typeof r === "object" ? r : null;
16723
16743
  } catch {
16724
16744
  return null;
@@ -16734,7 +16754,7 @@ var init_run_summary = __esm(() => {
16734
16754
  });
16735
16755
 
16736
16756
  // ../../loki-ts/src/engine10/stages/xreview.ts
16737
- import { existsSync as existsSync43, readFileSync as readFileSync52 } from "fs";
16757
+ import { existsSync as existsSync43, readFileSync as readFileSync53 } from "fs";
16738
16758
  import { join as join66 } from "path";
16739
16759
  function minVerdict(verdict, review) {
16740
16760
  const ceiling = review?.level === "block" ? "PARTIAL" : verdict;
@@ -16752,7 +16772,7 @@ function explicitReview(repoDir, env) {
16752
16772
  if (!existsSync43(p))
16753
16773
  continue;
16754
16774
  try {
16755
- const m = /^review:[ \t]*["']?([A-Za-z]+)["']?[ \t]*(?:#.*)?$/m.exec(readFileSync52(p, "utf8"));
16775
+ const m = /^review:[ \t]*["']?([A-Za-z]+)["']?[ \t]*(?:#.*)?$/m.exec(readFileSync53(p, "utf8"));
16756
16776
  const v = asProvider(m?.[1]);
16757
16777
  if (v)
16758
16778
  return v;
@@ -16947,7 +16967,7 @@ See also: loki cost --detail (what a run ALREADY spent)
16947
16967
  });
16948
16968
 
16949
16969
  // ../../loki-ts/src/features/contract.ts
16950
- import { existsSync as existsSync44, lstatSync as lstatSync17, mkdirSync as mkdirSync29, readFileSync as readFileSync53, rmSync as rmSync21, writeFileSync as writeFileSync31 } from "fs";
16970
+ import { existsSync as existsSync44, lstatSync as lstatSync17, mkdirSync as mkdirSync29, readFileSync as readFileSync54, rmSync as rmSync21, writeFileSync as writeFileSync31 } from "fs";
16951
16971
  import { dirname as dirname29, join as join67 } from "path";
16952
16972
  import { createHash as createHash18 } from "crypto";
16953
16973
  function contractEnabled(env = process.env) {
@@ -16996,7 +17016,7 @@ function readContract(repoDir) {
16996
17016
  return { contract: null, notes: ["contract unreadable: too large"], sha256: null };
16997
17017
  let raw2;
16998
17018
  try {
16999
- raw2 = readFileSync53(p);
17019
+ raw2 = readFileSync54(p);
17000
17020
  } catch {
17001
17021
  return { contract: null, notes: ["contract unreadable: read failed"], sha256: null };
17002
17022
  }
@@ -17071,7 +17091,7 @@ var init_contract = __esm(() => {
17071
17091
 
17072
17092
  // ../../loki-ts/src/features/speed/seal_group.ts
17073
17093
  import { createHash as createHash19 } from "crypto";
17074
- import { existsSync as existsSync45, mkdirSync as mkdirSync30, readdirSync as readdirSync23, readFileSync as readFileSync54, renameSync as renameSync14, statSync as statSync21, writeFileSync as writeFileSync32 } from "fs";
17094
+ import { existsSync as existsSync45, mkdirSync as mkdirSync30, readdirSync as readdirSync23, readFileSync as readFileSync55, renameSync as renameSync14, statSync as statSync21, writeFileSync as writeFileSync32 } from "fs";
17075
17095
  import { dirname as dirname30, join as join68 } from "path";
17076
17096
  function sealGroup(runDir, rh) {
17077
17097
  const manifestPath = join68(runDir, "group", "manifest.json");
@@ -17102,7 +17122,7 @@ function sealGroup(runDir, rh) {
17102
17122
  const dir = join68(unitsDir(runDir), id), rp = join68(dir, "receipt.json"), ep = join68(dir, "events.jsonl");
17103
17123
  let bytes;
17104
17124
  try {
17105
- bytes = readFileSync54(rp);
17125
+ bytes = readFileSync55(rp);
17106
17126
  } catch {
17107
17127
  return fail2(`unit ${id} sub-receipt missing`);
17108
17128
  }
@@ -17119,7 +17139,7 @@ function sealGroup(runDir, rh) {
17119
17139
  unit_id: id,
17120
17140
  sub_receipt_sha256: sha3(bytes),
17121
17141
  receipt_sha256: sub2["receipt_sha256"],
17122
- events_file_sha256: existsSync45(ep) ? sha3(readFileSync54(ep)) : null,
17142
+ events_file_sha256: existsSync45(ep) ? sha3(readFileSync55(ep)) : null,
17123
17143
  verdict,
17124
17144
  goal: text2(u["goal"], 200),
17125
17145
  files: (Array.isArray(u["files"]) ? u["files"] : []).map((f) => text2(f, 200)).filter(Boolean).slice(0, 50),
@@ -17163,13 +17183,13 @@ async function verifyGroup(receiptPath, receipt, rh, verifyOne, deps = {}) {
17163
17183
  try {
17164
17184
  if (!statSync21(dir).isDirectory())
17165
17185
  return bad(`unit ${id} is not a directory`);
17166
- bytes = readFileSync54(rp);
17186
+ bytes = readFileSync55(rp);
17167
17187
  } catch {
17168
17188
  return bad(`unit ${id} sub-receipt missing`);
17169
17189
  }
17170
17190
  if (sha3(bytes) !== e["sub_receipt_sha256"])
17171
17191
  return bad(`unit ${id} sub-receipt does not match its recorded hash`);
17172
- const evSha = existsSync45(ep) ? sha3(readFileSync54(ep)) : null;
17192
+ const evSha = existsSync45(ep) ? sha3(readFileSync55(ep)) : null;
17173
17193
  if (evSha !== (e["events_file_sha256"] ?? null))
17174
17194
  return bad(`unit ${id} events.jsonl does not match its recorded hash`);
17175
17195
  const sub2 = readJson6(rp);
@@ -17194,7 +17214,7 @@ function compositeVerdict(childVerdicts) {
17194
17214
  }
17195
17215
  var ID_RE, PASSING, sha3 = (b) => createHash19("sha256").update(b).digest("hex"), isObj10 = (v) => v !== null && typeof v === "object" && !Array.isArray(v), text2 = (v, cap) => typeof v === "string" ? v.replace(/[\x00-\x1f\x7f]+/g, " ").trim().slice(0, cap) : "", num4 = (v) => typeof v === "number" && Number.isFinite(v) && v >= 0 ? v : 0, unitsDir = (runDir) => join68(runDir, "group", "units"), readJson6 = (p) => {
17196
17216
  try {
17197
- return JSON.parse(readFileSync54(p, "utf8"));
17217
+ return JSON.parse(readFileSync55(p, "utf8"));
17198
17218
  } catch {
17199
17219
  return;
17200
17220
  }
@@ -17212,7 +17232,7 @@ var init_seal_group = __esm(() => {
17212
17232
  });
17213
17233
 
17214
17234
  // ../../loki-ts/src/supply/supply_guard.ts
17215
- import { existsSync as existsSync46, readFileSync as readFileSync55, statSync as statSync22 } from "fs";
17235
+ import { existsSync as existsSync46, readFileSync as readFileSync56, statSync as statSync22 } from "fs";
17216
17236
  import { basename as basename25, join as join69 } from "path";
17217
17237
  function supplyEnabled(env) {
17218
17238
  return env["LOKI_SUPPLY_GUARD"] !== "0";
@@ -17234,7 +17254,7 @@ function readDeclared(repoDir) {
17234
17254
  try {
17235
17255
  if (statSync22(p).size > MAX_FILE_BYTES)
17236
17256
  return { deps: [], problem: "declaration file too large" };
17237
- const j = JSON.parse(readFileSync55(p, "utf8"));
17257
+ const j = JSON.parse(readFileSync56(p, "utf8"));
17238
17258
  if (!Array.isArray(j))
17239
17259
  return { deps: [], problem: "declaration is not a JSON array" };
17240
17260
  const deps = [];
@@ -17258,7 +17278,7 @@ function readAllowlist(repoDir) {
17258
17278
  if (!existsSync46(p))
17259
17279
  return new Set;
17260
17280
  try {
17261
- return new Set(readFileSync55(p, "utf8").split(`
17281
+ return new Set(readFileSync56(p, "utf8").split(`
17262
17282
  `).map((l) => l.replace(/#.*$/, "").trim()).filter(Boolean));
17263
17283
  } catch {
17264
17284
  return new Set;
@@ -17441,7 +17461,7 @@ var MIN_AGE_DAYS = 7, DECLARED_FILE = "supply-declared.json", MAX_CHECKED = 50,
17441
17461
  }
17442
17462
  }, PUBLIC_HOSTS, hostOf = (u) => u.trim().toLowerCase().replace(/^[a-z][a-z0-9+.-]*:\/\//, "").replace(/^www\./, "").split(/[/?#\s]/)[0].replace(/^[^@]*@/, "").replace(/:\d+$/, ""), privateUrl = (u) => /[a-z0-9]/i.test(u) && !PUBLIC_HOSTS.has(hostOf(u)), readSmall = (p) => {
17443
17463
  try {
17444
- return statSync22(p).size <= MAX_FILE_BYTES ? readFileSync55(p, "utf8") : "";
17464
+ return statSync22(p).size <= MAX_FILE_BYTES ? readFileSync56(p, "utf8") : "";
17445
17465
  } catch {
17446
17466
  return "";
17447
17467
  }
@@ -17457,7 +17477,7 @@ var init_supply_guard = __esm(() => {
17457
17477
 
17458
17478
  // ../../loki-ts/src/engine10/stages/seal.ts
17459
17479
  import { createHash as createHash20 } from "crypto";
17460
- import { existsSync as existsSync47, readdirSync as readdirSync24, mkdirSync as mkdirSync31, readFileSync as readFileSync56 } from "fs";
17480
+ import { existsSync as existsSync47, readdirSync as readdirSync24, mkdirSync as mkdirSync31, readFileSync as readFileSync57 } from "fs";
17461
17481
  import { basename as basename26, isAbsolute as isAbsolute13, join as join70, relative as relative15 } from "path";
17462
17482
  function receiptSha256(r) {
17463
17483
  const { verification: _v, receipt_sha256: _h, ...body } = r;
@@ -17723,7 +17743,7 @@ var init_seal = __esm(() => {
17723
17743
  if (mp?.outcome === "no")
17724
17744
  notProven.add(`Wall tests passed without the fix (mutation proof)${verdict !== verdict2 ? "; verdict downgraded to PARTIAL (LOKI_MUTATION_STRICT=1, declared behavior change)" : ""}`);
17725
17745
  if (repo === null)
17726
- notProven.add("repo not recorded by intake");
17746
+ notProven.add(o.intake && "repo" in o.intake ? "repo identity unknown: the repo has no origin remote (run: git remote add origin <url>)" : "repo not recorded by intake");
17727
17747
  if (typeof o.intake?.resumed !== "boolean")
17728
17748
  notProven.add("resume state not recorded by intake");
17729
17749
  const stages = {};
@@ -17784,7 +17804,7 @@ var init_seal = __esm(() => {
17784
17804
  provider: ctx.provider,
17785
17805
  model: ctx.model,
17786
17806
  resumed: o.intake?.resumed === true,
17787
- events_sha256: sha2562(existsSync47(eventsPath) ? readFileSync56(eventsPath) : ""),
17807
+ events_sha256: sha2562(existsSync47(eventsPath) ? readFileSync57(eventsPath) : ""),
17788
17808
  ...await sealEvidence(ctx.repoDir, ctx.runDir, o, notProven, signal, ctx.emit),
17789
17809
  log_seal: true,
17790
17810
  toolchain: collectToolchain(),
@@ -17840,14 +17860,14 @@ var init_seal = __esm(() => {
17840
17860
  });
17841
17861
 
17842
17862
  // ../../loki-ts/src/util/composite_seal.ts
17843
- import { existsSync as existsSync48, readFileSync as readFileSync57 } from "fs";
17863
+ import { existsSync as existsSync48, readFileSync as readFileSync58 } from "fs";
17844
17864
  import { basename as basename27, dirname as dirname32, join as join71 } from "path";
17845
17865
  function logProblem(runDir, integ) {
17846
17866
  if (typeof integ["log_sha256"] !== "string")
17847
17867
  return null;
17848
17868
  let b;
17849
17869
  try {
17850
- b = readFileSync57(join71(runDir, "integration.log"));
17870
+ b = readFileSync58(join71(runDir, "integration.log"));
17851
17871
  } catch {
17852
17872
  return "integration.log is missing but integration.json records its hash";
17853
17873
  }
@@ -17870,7 +17890,7 @@ async function verifyComposite(receiptPath, receipt, rh, verifyOne, deps = {}) {
17870
17890
  return bad("body malformed");
17871
17891
  let ibytes;
17872
17892
  try {
17873
- ibytes = readFileSync57(join71(runDir, "integration.json"));
17893
+ ibytes = readFileSync58(join71(runDir, "integration.json"));
17874
17894
  } catch {
17875
17895
  return bad("integration.json missing");
17876
17896
  }
@@ -17914,7 +17934,7 @@ async function verifyComposite(receiptPath, receipt, rh, verifyOne, deps = {}) {
17914
17934
  const rp = join71(runDir, rel);
17915
17935
  let bytes;
17916
17936
  try {
17917
- bytes = readFileSync57(rp);
17937
+ bytes = readFileSync58(rp);
17918
17938
  } catch {
17919
17939
  return bad(`child ${repo} receipt missing`);
17920
17940
  }
@@ -17963,7 +17983,7 @@ var init_keys_cmd = __esm(() => {
17963
17983
  });
17964
17984
 
17965
17985
  // ../../loki-ts/src/engine10/verify_cmd.ts
17966
- import { existsSync as existsSync49, readFileSync as readFileSync58, renameSync as renameSync15, statSync as statSync24, writeFileSync as writeFileSync34 } from "fs";
17986
+ import { existsSync as existsSync49, readFileSync as readFileSync59, renameSync as renameSync15, statSync as statSync24, writeFileSync as writeFileSync34 } from "fs";
17967
17987
  import { basename as basename28, dirname as dirname33, join as join72 } from "path";
17968
17988
  import { createHash as createHash21, createPublicKey as createPublicKey4, verify as verify4 } from "crypto";
17969
17989
  function pubFor(kid, given) {
@@ -17972,7 +17992,7 @@ function pubFor(kid, given) {
17972
17992
  const active = loadSigningKey(false);
17973
17993
  const pubs = (process.env["LOKI_RECEIPT_RETIRED_PUBKEYS"] ?? "").split(":").map((f) => f.trim()).filter(Boolean).flatMap((f) => {
17974
17994
  try {
17975
- return [createPublicKey4(readFileSync58(f))];
17995
+ return [createPublicKey4(readFileSync59(f))];
17976
17996
  } catch {
17977
17997
  return [];
17978
17998
  }
@@ -18019,7 +18039,7 @@ function checkEventLog(receiptPath, receipt) {
18019
18039
  const path = join72(dirname33(receiptPath), "events.jsonl");
18020
18040
  if (!existsSync49(path))
18021
18041
  return "events.jsonl is missing";
18022
- const raw2 = readFileSync58(path, "utf8"), events2 = readEvents(path), lines2 = raw2.split(`
18042
+ const raw2 = readFileSync59(path, "utf8"), events2 = readEvents(path), lines2 = raw2.split(`
18023
18043
  `).filter((l) => l.trim() !== "");
18024
18044
  if (events2.length !== lines2.length || events2.some((e, i) => e.seq !== i))
18025
18045
  return "events.jsonl has a forged, edited or missing line";
@@ -18043,7 +18063,7 @@ function checkLogSeal(receiptPath, hash, kid, given) {
18043
18063
  const seal = events2[done + 1], d = seal?.type === "log.sealed" ? seal.data : null;
18044
18064
  if (!d)
18045
18065
  return { verdict: "TAMPERED", reason: "events.jsonl has no signed log.sealed line after run.completed" };
18046
- const lines2 = readFileSync58(path, "utf8").split(`
18066
+ const lines2 = readFileSync59(path, "utf8").split(`
18047
18067
  `).filter((l) => l.trim() !== ""), sha4 = createHash21("sha256").update(lines2.slice(0, done + 1).join(`
18048
18068
  `) + `
18049
18069
  `).digest("hex");
@@ -18057,7 +18077,7 @@ async function verifyReceipt(receiptPath, deps = {}) {
18057
18077
  return { verdict: "UNCHECKED", reasons: [`receipt not found: ${receiptPath}`] };
18058
18078
  let receipt;
18059
18079
  try {
18060
- receipt = JSON.parse((deps.read ?? ((p) => readFileSync58(p, "utf8")))(receiptPath));
18080
+ receipt = JSON.parse((deps.read ?? ((p) => readFileSync59(p, "utf8")))(receiptPath));
18061
18081
  } catch {
18062
18082
  return { verdict: "UNCHECKED", reasons: ["receipt.json is not valid JSON"] };
18063
18083
  }
@@ -18146,7 +18166,7 @@ var init_verify_cmd = __esm(() => {
18146
18166
  });
18147
18167
 
18148
18168
  // src/server/app.ts
18149
- import { existsSync as existsSync51, readFileSync as readFileSync61, statSync as statSync25 } from "fs";
18169
+ import { existsSync as existsSync51, readFileSync as readFileSync62, statSync as statSync25 } from "fs";
18150
18170
  import { join as join75, resolve as resolve19, sep as sep16 } from "path";
18151
18171
 
18152
18172
  // node_modules/hono/dist/request/constants.js
@@ -28458,7 +28478,7 @@ function mount20(ctx) {
28458
28478
  }
28459
28479
 
28460
28480
  // src/server/routes/verify.ts
28461
- import { readFileSync as readFileSync59, realpathSync as realpathSync25 } from "fs";
28481
+ import { readFileSync as readFileSync60, realpathSync as realpathSync25 } from "fs";
28462
28482
  import { createPublicKey as createPublicKey5 } from "crypto";
28463
28483
  import { join as join73, sep as sep15 } from "path";
28464
28484
  init_verify_cmd();
@@ -28510,7 +28530,7 @@ function mount21(ctx) {
28510
28530
  sha4 = r.receiptSha256 ?? null;
28511
28531
  }
28512
28532
  try {
28513
- outcome = outcomeOf(JSON.parse(readFileSync59(file, "utf8")));
28533
+ outcome = outcomeOf(JSON.parse(readFileSync60(file, "utf8")));
28514
28534
  } catch {
28515
28535
  outcome = "UNREADABLE";
28516
28536
  }
@@ -28572,7 +28592,7 @@ function ttlCache(ttlMs = PROBE_CACHE_MS, now2 = Date.now) {
28572
28592
  }
28573
28593
 
28574
28594
  // src/server/legacy/shim.ts
28575
- import { existsSync as existsSync50, readFileSync as readFileSync60 } from "fs";
28595
+ import { existsSync as existsSync50, readFileSync as readFileSync61 } from "fs";
28576
28596
  import { join as join74 } from "path";
28577
28597
 
28578
28598
  // src/server/legacy/routes.ts
@@ -28954,7 +28974,7 @@ var repoVersion = () => {
28954
28974
  for (const f of [join74(import.meta.dir, "../../../../../VERSION")]) {
28955
28975
  try {
28956
28976
  if (existsSync50(f))
28957
- return readFileSync60(f, "utf8").trim();
28977
+ return readFileSync61(f, "utf8").trim();
28958
28978
  } catch {}
28959
28979
  }
28960
28980
  return "unknown";
@@ -29168,7 +29188,7 @@ function createApp(opts) {
29168
29188
  for (const f of [process.env.LOKI_VERSION_FILE, join75(import.meta.dir, "../../../../VERSION")]) {
29169
29189
  try {
29170
29190
  if (f)
29171
- return readFileSync61(f, "utf8").trim() || "unknown";
29191
+ return readFileSync62(f, "utf8").trim() || "unknown";
29172
29192
  } catch {}
29173
29193
  }
29174
29194
  return "unknown";
@@ -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.63.6",
5
+ "version": "11.63.8",
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-DVqNa4d0.js";import{B as C}from"./Button-CTy2MQxg.js";import{T as $e}from"./trending-up-BSa2-Sso.js";import{C as z}from"./clock-BcYg4CbF.js";import{A as Be,U as ue,M as De}from"./Avatar-c3dwr33S.js";import{A as J}from"./activity-DWg-a8HM.js";import{R as pe}from"./refresh-cw-DaeK7Ods.js";import{G as ze}from"./globe-BN3TgkGk.js";import{C as Le}from"./chevron-left-D2tvNtha.js";import{C as je}from"./check-0MMKvH_b.js";import{D as Y}from"./dollar-sign-DFw0wfF5.js";import{U as Te}from"./user-nAFrf6fv.js";import{D as Me}from"./database-DkNvl_RN.js";import{L as Ue}from"./lock-rAToqLiU.js";import{S as Re}from"./scroll-text-B3u8BDIA.js";import{S as Ie}from"./shield-alert-C32hZ9Rc.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-D7h5Efxx.js";import{B as C}from"./Button-DcMIUy9q.js";import{T as $e}from"./trending-up-CnR04ozf.js";import{C as z}from"./clock-Ch7TiuRG.js";import{A as Be,U as ue,M as De}from"./Avatar-C5naIgXq.js";import{A as J}from"./activity-DRUoEUMH.js";import{R as pe}from"./refresh-cw-DhVQ14GV.js";import{G as ze}from"./globe-DJKmdNYO.js";import{C as Le}from"./chevron-left-D6t1u2bZ.js";import{C as je}from"./check-Cuz-bgBo.js";import{D as Y}from"./dollar-sign-DSOoLXMA.js";import{U as Te}from"./user-45NLDfA3.js";import{D as Me}from"./database-BXiIVvsI.js";import{L as Ue}from"./lock-D1n5V1WB.js";import{S as Re}from"./scroll-text-CeT_KqRE.js";import{S as Ie}from"./shield-alert-BtatVxYq.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-DVqNa4d0.js";/**
1
+ import{c as l,j as s}from"./index-D7h5Efxx.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-DVqNa4d0.js";import{C as r}from"./clock-BcYg4CbF.js";import{C as a}from"./circle-alert-ClLmCb9H.js";import{C as l}from"./check-0MMKvH_b.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-D7h5Efxx.js";import{C as r}from"./clock-Ch7TiuRG.js";import{C as a}from"./circle-alert-BrbRSY0L.js";import{C as l}from"./check-Cuz-bgBo.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-DVqNa4d0.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-D7h5Efxx.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-DVqNa4d0.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-61LXvXCB.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-BIfkyGbJ.js";import{C as oe}from"./check-0MMKvH_b.js";import{C as Ye}from"./clock-BcYg4CbF.js";import{D as Xe}from"./dollar-sign-DFw0wfF5.js";import{U as Ze}from"./upload-DuwEvjeQ.js";import{L as V}from"./loader-circle-CINTFm3f.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-D7h5Efxx.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-Dk4uHaS4.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-D4fCUUuq.js";import{C as oe}from"./check-Cuz-bgBo.js";import{C as Ye}from"./clock-Ch7TiuRG.js";import{D as Xe}from"./dollar-sign-DSOoLXMA.js";import{U as Ze}from"./upload-DGc43kol.js";import{L as V}from"./loader-circle-21-GyiHr.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.