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.
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/dashboard/__init__.py +1 -1
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/FAILURE-CLASSES.md +32 -0
- package/loki-ts/dist/loki.js +1109 -1109
- package/mcp/__init__.py +1 -1
- package/package.json +2 -2
- package/packages/control-plane/dist/server.js +73 -53
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/web-app/dist/assets/{AdminPage-BqrBhLrU.js → AdminPage-MRok4gpK.js} +1 -1
- package/web-app/dist/assets/{Avatar-c3dwr33S.js → Avatar-C5naIgXq.js} +1 -1
- package/web-app/dist/assets/{Badge-CzJjwVLx.js → Badge-zigD7yw6.js} +1 -1
- package/web-app/dist/assets/{Button-CTy2MQxg.js → Button-DcMIUy9q.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-C3Vi3JeD.js → CockpitPage-D7Bunb6e.js} +1 -1
- package/web-app/dist/assets/{ComparePage-C4PjmUqx.js → ComparePage-r1MlVPTe.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-61LXvXCB.js → ErrorBoundary-Dk4uHaS4.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-CrZIM7TB.js → EvidenceReceiptPanel-C9ab9NGb.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-B8stqG2T.js → GitHubIssuesPanel-DXE21JW5.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-sNXt96L_.js → GitHubPRsPanel-CEEJDQaF.js} +1 -1
- package/web-app/dist/assets/{HomePage-DIfpOJgC.js → HomePage-Cc1RJgQP.js} +2 -2
- package/web-app/dist/assets/{LoginPage-BTi4xnWh.js → LoginPage-BgK3Un7s.js} +1 -1
- package/web-app/dist/assets/{MagicPage-4yaraVT5.js → MagicPage-DracOHYk.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-CQNvj08h.js → MetricsPage-dpzE7rHk.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-aSWTyLYN.js → NotFoundPage-CwR1prG_.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-Ddccygvc.js → ProjectPage-DDeC9Cfy.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-DIQS0hgl.js → ProjectsPage-o3OfxJRf.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-BWCOujjy.js → SettingsPage-PI85tG1v.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-DVijgj3R.js → ShowcasePage-iYe1cAHf.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-50CYulha.js → SystemSettingsPage-B-dy7aEZ.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-CbM1fVl5.js → TeamsPage-CKN0wlJv.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-B6LkabW8.js → TemplatesPage-2Kkm5kRO.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-ZGEVkBjN.js → TerminalOutput-CsrWjt5Z.js} +1 -1
- package/web-app/dist/assets/{activity-DWg-a8HM.js → activity-DRUoEUMH.js} +1 -1
- package/web-app/dist/assets/{bell-BA8SO1BZ.js → bell-DVtpHIbp.js} +1 -1
- package/web-app/dist/assets/{bot-Dj1G2wPc.js → bot-DQR3Z51i.js} +1 -1
- package/web-app/dist/assets/{check-0MMKvH_b.js → check-Cuz-bgBo.js} +1 -1
- package/web-app/dist/assets/{chevron-left-D2tvNtha.js → chevron-left-D6t1u2bZ.js} +1 -1
- package/web-app/dist/assets/{circle-alert-ClLmCb9H.js → circle-alert-BrbRSY0L.js} +1 -1
- package/web-app/dist/assets/{clock-BcYg4CbF.js → clock-Ch7TiuRG.js} +1 -1
- package/web-app/dist/assets/{cloud-DScV2ym_.js → cloud-D9FgjItJ.js} +1 -1
- package/web-app/dist/assets/{code-xml-PzD_GHOV.js → code-xml-CTOxq-IZ.js} +1 -1
- package/web-app/dist/assets/{database-DkNvl_RN.js → database-BXiIVvsI.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-DFw0wfF5.js → dollar-sign-DSOoLXMA.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-4_gDdWfg.js → file-code-corner-BSZSLbUC.js} +1 -1
- package/web-app/dist/assets/{file-plus-DqJS01uJ.js → file-plus-wDq2a4vY.js} +1 -1
- package/web-app/dist/assets/{globe-BN3TgkGk.js → globe-DJKmdNYO.js} +1 -1
- package/web-app/dist/assets/{hammer-Da6c35qJ.js → hammer-DL5Cuz8k.js} +1 -1
- package/web-app/dist/assets/{index-DVqNa4d0.js → index-D7h5Efxx.js} +3 -3
- package/web-app/dist/assets/{layers-DlcSJZDL.js → layers-BMAnvaPd.js} +1 -1
- package/web-app/dist/assets/{loader-circle-CINTFm3f.js → loader-circle-21-GyiHr.js} +1 -1
- package/web-app/dist/assets/{lock-rAToqLiU.js → lock-D1n5V1WB.js} +1 -1
- package/web-app/dist/assets/{package-BYMwMiES.js → package-BZQKnof2.js} +1 -1
- package/web-app/dist/assets/{plus-Bh1HlHQv.js → plus-DcZZjvq4.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-DaeK7Ods.js → refresh-cw-DhVQ14GV.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-Chk6Gdgc.js → rotate-ccw-B3FdQA22.js} +1 -1
- package/web-app/dist/assets/{scroll-text-B3u8BDIA.js → scroll-text-CeT_KqRE.js} +1 -1
- package/web-app/dist/assets/{server-DE3tbGzp.js → server-DqUuxOrt.js} +1 -1
- package/web-app/dist/assets/{shield-alert-C32hZ9Rc.js → shield-alert-BtatVxYq.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-BIfkyGbJ.js → thumbs-up-D4fCUUuq.js} +1 -1
- package/web-app/dist/assets/{trash-2-CfdENJNz.js → trash-2-BHNJqbo6.js} +1 -1
- package/web-app/dist/assets/{trending-down-D3hsimI0.js → trending-down-CPggV6Fp.js} +1 -1
- package/web-app/dist/assets/{trending-up-BSa2-Sso.js → trending-up-CnR04ozf.js} +1 -1
- package/web-app/dist/assets/{upload-DuwEvjeQ.js → upload-DGc43kol.js} +1 -1
- package/web-app/dist/assets/{usePolling-oGWxrsCy.js → usePolling-CJr1dy5R.js} +1 -1
- package/web-app/dist/assets/{user-nAFrf6fv.js → user-45NLDfA3.js} +1 -1
- package/web-app/dist/index.html +1 -1
package/mcp/__init__.py
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loki-mode",
|
|
3
3
|
"mcpName": "io.github.asklokesh/loki-mode",
|
|
4
|
-
"version": "11.63.
|
|
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": "
|
|
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
|
-
},
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
15978
|
-
|
|
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
|
|
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(
|
|
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 =
|
|
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,
|
|
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 =
|
|
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
|
|
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() &&
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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(
|
|
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 =
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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 ?
|
|
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
|
|
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) ?
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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(
|
|
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 =
|
|
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 =
|
|
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) =>
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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-
|
|
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 +1 @@
|
|
|
1
|
-
import{j as e}from"./index-
|
|
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-
|
|
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-
|
|
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.
|