loki-mode 7.5.5 → 7.5.6
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/INSTALLATION.md +1 -1
- package/loki-ts/dist/loki.js +15 -15
- package/mcp/__init__.py +1 -1
- package/package.json +2 -2
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: Multi-agent autonomous startup system. Triggers on "Loki Mode". Takes PRD to deployed product with minimal human intervention. Requires --dangerously-skip-permissions flag.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v7.5.
|
|
6
|
+
# Loki Mode v7.5.6
|
|
7
7
|
|
|
8
8
|
**You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
|
|
9
9
|
|
|
@@ -322,4 +322,4 @@ The following features are documented in skill modules but not yet fully automat
|
|
|
322
322
|
| Quality gates 3-reviewer system | Implemented (v5.35.0) | 5 specialist reviewers in `skills/quality-gates.md`; execution in run.sh |
|
|
323
323
|
| Benchmarks (HumanEval, SWE-bench) | Infrastructure only | Runner scripts and datasets exist in `benchmarks/`; no published results |
|
|
324
324
|
|
|
325
|
-
**v7.5.
|
|
325
|
+
**v7.5.6 | [Autonomi](https://www.autonomi.dev/) flagship product | ~260 lines core**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
7.5.
|
|
1
|
+
7.5.6
|
package/dashboard/__init__.py
CHANGED
package/docs/INSTALLATION.md
CHANGED
package/loki-ts/dist/loki.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var Q6=Object.defineProperty;var Z6=($)=>$;function X6($,Z){this[$]=Z6.bind(null,Z)}var b=($,Z)=>{for(var Q in Z)Q6($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:X6.bind(Z,Q)})};var E=($,Z)=>()=>($&&(Z=$($=0)),Z);var U1=import.meta.require;var n1={};b(n1,{lokiDir:()=>x,homeLokiDir:()=>L1,findRepoRootForVersion:()=>P1,REPO_ROOT:()=>g});import{resolve as f,dirname as I1}from"path";import{fileURLToPath as z6}from"url";import{existsSync as q1}from"fs";import{homedir as K6}from"os";function V6(){let $=o1;for(let Z=0;Z<6;Z++){if(q1(f($,"VERSION"))&&q1(f($,"autonomy/run.sh")))return $;let Q=I1($);if(Q===$)break;$=Q}return f(o1,"..","..","..")}function P1($){let Z=$;for(let Q=0;Q<6;Q++){if(q1(f(Z,"VERSION"))&&q1(f(Z,"autonomy/run.sh")))return Z;let X=I1(Z);if(X===Z)break;Z=X}return f($,"..","..","..")}function x(){return process.env.LOKI_DIR??f(process.cwd(),".loki")}function L1(){return f(K6(),".loki")}var o1,g;var h=E(()=>{o1=I1(z6(import.meta.url));g=V6()});var r1={};b(r1,{runOrThrow:()=>H6,run:()=>N,commandVersion:()=>B6,commandExists:()=>
|
|
2
|
+
var Q6=Object.defineProperty;var Z6=($)=>$;function X6($,Z){this[$]=Z6.bind(null,Z)}var b=($,Z)=>{for(var Q in Z)Q6($,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:X6.bind(Z,Q)})};var E=($,Z)=>()=>($&&(Z=$($=0)),Z);var U1=import.meta.require;var n1={};b(n1,{lokiDir:()=>x,homeLokiDir:()=>L1,findRepoRootForVersion:()=>P1,REPO_ROOT:()=>g});import{resolve as f,dirname as I1}from"path";import{fileURLToPath as z6}from"url";import{existsSync as q1}from"fs";import{homedir as K6}from"os";function V6(){let $=o1;for(let Z=0;Z<6;Z++){if(q1(f($,"VERSION"))&&q1(f($,"autonomy/run.sh")))return $;let Q=I1($);if(Q===$)break;$=Q}return f(o1,"..","..","..")}function P1($){let Z=$;for(let Q=0;Q<6;Q++){if(q1(f(Z,"VERSION"))&&q1(f(Z,"autonomy/run.sh")))return Z;let X=I1(Z);if(X===Z)break;Z=X}return f($,"..","..","..")}function x(){return process.env.LOKI_DIR??f(process.cwd(),".loki")}function L1(){return f(K6(),".loki")}var o1,g;var h=E(()=>{o1=I1(z6(import.meta.url));g=V6()});var r1={};b(r1,{runOrThrow:()=>H6,run:()=>N,commandVersion:()=>B6,commandExists:()=>v,ShellError:()=>x1});async function N($,Z={}){let Q=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:Z.env?{...process.env,...Z.env}:process.env,cwd:Z.cwd}),X,z;if(Z.timeoutMs&&Z.timeoutMs>0)X=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}z=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},Z.timeoutMs);try{let[K,V,q]=await Promise.all([new Response(Q.stdout).text(),new Response(Q.stderr).text(),Q.exited]);return{stdout:K,stderr:V,exitCode:q}}finally{if(X)clearTimeout(X);if(z)clearTimeout(z)}}async function H6($,Z={}){let Q=await N($,Z);if(Q.exitCode!==0)throw new x1(`command failed (${Q.exitCode}): ${$.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function v($){let Z=J6($),Q=await N(["sh","-c",`command -v ${Z}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function J6($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function B6($,Z="--version"){if(!await v($))return null;let X=await N([$,Z],{timeoutMs:5000});if(X.exitCode!==0)return null;return((X.stdout||X.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var x1;var m=E(()=>{x1=class x1 extends Error{message;exitCode;stdout;stderr;constructor($,Z,Q,X){super($);this.message=$;this.exitCode=Z;this.stdout=Q;this.stderr=X;this.name="ShellError"}}});function u($){return Y6?"":$}var Y6,P,k,w,F5,A,D,L,U;var d=E(()=>{Y6=(process.env.NO_COLOR??"").length>0;P=u("\x1B[0;31m"),k=u("\x1B[0;32m"),w=u("\x1B[1;33m"),F5=u("\x1B[0;34m"),A=u("\x1B[0;36m"),D=u("\x1B[1m"),L=u("\x1B[2m"),U=u("\x1B[0m")});import{existsSync as x6}from"fs";async function a(){if(e!==void 0)return e;let $="/opt/homebrew/bin/python3.12";if(x6($))return e=$,$;let Z=await v("python3.12");if(Z)return e=Z,Z;let Q=await v("python3");return e=Q,Q}async function o($,Z={}){let Q=await a();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return N([Q,"-c",$],Z)}var e;var $1=E(()=>{m()});var U0={};b(U0,{runStatus:()=>h6});import{existsSync as S,readFileSync as Z1,readdirSync as Q0,statSync as Z0}from"fs";import{resolve as R,basename as N6}from"path";async function D6(){if(await v("jq"))return!0;return process.stdout.write(`${P}Error: jq is required but not installed.${U}
|
|
3
3
|
`),process.stdout.write(`Install with:
|
|
4
4
|
`),process.stdout.write(` brew install jq (macOS)
|
|
5
5
|
`),process.stdout.write(` apt install jq (Debian/Ubuntu)
|
|
@@ -44,14 +44,14 @@ var Q6=Object.defineProperty;var Z6=($)=>$;function X6($,Z){this[$]=Z6.bind(null
|
|
|
44
44
|
`)}}return await b6($),process.stdout.write(`
|
|
45
45
|
`),process.stdout.write(`${L} Tip: loki context show - detailed token breakdown${U}
|
|
46
46
|
`),process.stdout.write(`${L} Tip: loki code overview - codebase intelligence${U}
|
|
47
|
-
`),0}async function b6($){let Z=R($,"state"),Q=
|
|
47
|
+
`),0}async function b6($){let Z=R($,"state"),Q=v6(Z),X=R(Z,"relevant-learnings.json"),z=R($,"escalations"),K=Q.length>0,V=S(X),q=S(z);if(!K&&!V&&!q)return;if(process.stdout.write(`
|
|
48
48
|
${A}Phase 1 artifacts:${U}
|
|
49
49
|
`),K){let W=Q[Q.length-1],G=V0(W);if(G&&Array.isArray(G.findings)){let H={Critical:0,High:0,Medium:0,Low:0};for(let J of G.findings){let M=String(J.severity??"");if(M in H)H[M]=(H[M]??0)+1}let B=Object.entries(H).filter(([,J])=>J>0).map(([J,M])=>`${M} ${J.toLowerCase()}`).join(", ");process.stdout.write(` Findings (iter ${G.iteration??"?"}): ${B||"none"} -- ${G.findings.length} total
|
|
50
50
|
`)}}if(V){let W=V0(X);if(W&&Array.isArray(W.learnings)&&W.learnings.length>0){let G=new Map;for(let B of W.learnings){let J=String(B.trigger??"unknown");G.set(J,(G.get(J)??0)+1)}let H=[...G.entries()].sort((B,J)=>J[1]-B[1]).slice(0,3).map(([B,J])=>`${J} ${B}`).join(", ");process.stdout.write(` Learnings: ${W.learnings.length} total (${H})
|
|
51
51
|
`)}}if(q){let W=0,G="";try{let B=(await import("fs")).readdirSync(z).filter((J)=>J.endsWith(".md"));if(W=B.length,B.length>0)B.sort(),G=B[B.length-1]??""}catch{}if(W>0)process.stdout.write(` Escalations: ${W} handoff doc${W===1?"":"s"} (latest: ${G})
|
|
52
|
-
`)}}function
|
|
52
|
+
`)}}function v6($){if(!S($))return[];try{return U1("fs").readdirSync($).filter((X)=>/^findings-\d+\.json$/.test(X)).sort((X,z)=>{let K=Number.parseInt(X.replace(/[^0-9]/g,""),10)||0,V=Number.parseInt(z.replace(/[^0-9]/g,""),10)||0;return K-V}).map((X)=>R($,X))}catch{return[]}}function V0($){try{let Z=U1("fs");return JSON.parse(Z.readFileSync($,"utf-8"))}catch{return null}}async function y6(){let $=await a();if(!$)return process.stderr.write(`{"error": "Failed to generate JSON status. Ensure python3 is available."}
|
|
53
53
|
`),1;let Z=g,Q=x(),X=process.env.LOKI_DASHBOARD_PORT||"57374",z=process.env.LOKI_PROVIDER||"claude",K=await N([$,"-c",S6,Z,Q,X,z],{timeoutMs:30000});if(K.exitCode!==0)return process.stderr.write(`{"error": "Failed to generate JSON status. Ensure python3 is available."}
|
|
54
|
-
`),1;return process.stdout.write(K.stdout),0}async function h6($){let Z=[...$];while(Z.length>0){let Q=Z[0];if(Q==="--json")return
|
|
54
|
+
`),1;return process.stdout.write(K.stdout),0}async function h6($){let Z=[...$];while(Z.length>0){let Q=Z[0];if(Q==="--json")return y6();if(Q==="--help"||Q==="-h")return process.stdout.write(`Usage: loki status [--json]
|
|
55
55
|
`),0;return process.stdout.write(`${P}Unknown flag: ${Q}${U}
|
|
56
56
|
`),process.stdout.write(`Usage: loki status [--json]
|
|
57
57
|
`),1}return k6()}var S6=`
|
|
@@ -261,9 +261,9 @@ if os.path.isfile(gate_count_file):
|
|
|
261
261
|
result['phase1'] = phase1
|
|
262
262
|
|
|
263
263
|
print(json.dumps(result, indent=2))
|
|
264
|
-
`;var q0=E(()=>{m();$1();d();h()});var J0={};b(J0,{runStats:()=>c6,computeStats:()=>H0});import{readdirSync as W0,readFileSync as f6,statSync as G0}from"fs";import{join as p}from"path";function r($){try{if(!G0($).isFile())return null;return JSON.parse(f6($,"utf-8"))}catch{return null}}function E1($){try{return G0($).isDirectory()}catch{return!1}}function g6($){if(!E1($))return[];try{let Z=W0($).filter((Q)=>Q.startsWith("iteration-")&&Q.endsWith(".json"));return Z.sort(),Z.map((Q)=>p($,Q))}catch{return[]}}function t($){return Math.trunc($).toLocaleString("en-US")}function R1($){let Z=Math.trunc($);if(Z<60)return`${Z}s`;let Q=Math.trunc(Z/3600),X=Math.trunc(Z%3600/60),z=Z%60;if(Q>0)return`${Q}h ${String(X).padStart(2,"0")}m`;return`${X}m ${String(z).padStart(2,"0")}s`}function c($,Z=0){let Q=Math.pow(10,Z);return Math.round($*Q)/Q}function i($,Z){return $.toFixed(Z)}function F1($,Z){return $.length>=Z?$:$+" ".repeat(Z-$.length)}function m6($){let Z="N/A",Q=0,X=r(p($,"state","orchestrator.json"));if(X&&typeof X==="object"){if(typeof X.currentPhase==="string")Z=X.currentPhase;if(typeof X.currentIteration==="number")Q=X.currentIteration}let z=p($,"metrics","efficiency"),K=g6(z),V=[];for(let T of K){let _=r(T);if(_&&typeof _==="object")V.push(_)}if(V.length>0)Q=Math.max(Q,V.length);let q=V.reduce((T,_)=>T+(_.input_tokens??0),0),W=V.reduce((T,_)=>T+(_.output_tokens??0),0),G=q+W,H=V.reduce((T,_)=>T+(_.cost_usd??0),0),B=V.reduce((T,_)=>T+(_.duration_seconds??0),0),J=0,M=0,j=r(p($,"metrics","budget.json"));if(j&&typeof j==="object"){if(typeof j.budget_limit==="number")J=j.budget_limit;if(typeof j.budget_used==="number")M=j.budget_used}let I=0,F=0,O=r(p($,"state","quality-gates.json"));if(O&&typeof O==="object"){if(Array.isArray(O)){for(let T of O)if(F+=1,T===!0)I+=1;else if(T&&typeof T==="object"){let _=T;if(_.passed===!0||_.status==="passed")I+=1}}else for(let T of Object.values(O))if(typeof T==="boolean"){if(F+=1,T)I+=1}else if(T&&typeof T==="object"){F+=1;let _=T;if(_.passed===!0||_.status==="passed")I+=1}}let C={},V1=r(p($,"quality","gate-failure-count.json"));if(V1&&typeof V1==="object"&&!Array.isArray(V1)){let T={};for(let[_,
|
|
264
|
+
`;var q0=E(()=>{m();$1();d();h()});var J0={};b(J0,{runStats:()=>c6,computeStats:()=>H0});import{readdirSync as W0,readFileSync as f6,statSync as G0}from"fs";import{join as p}from"path";function r($){try{if(!G0($).isFile())return null;return JSON.parse(f6($,"utf-8"))}catch{return null}}function E1($){try{return G0($).isDirectory()}catch{return!1}}function g6($){if(!E1($))return[];try{let Z=W0($).filter((Q)=>Q.startsWith("iteration-")&&Q.endsWith(".json"));return Z.sort(),Z.map((Q)=>p($,Q))}catch{return[]}}function t($){return Math.trunc($).toLocaleString("en-US")}function R1($){let Z=Math.trunc($);if(Z<60)return`${Z}s`;let Q=Math.trunc(Z/3600),X=Math.trunc(Z%3600/60),z=Z%60;if(Q>0)return`${Q}h ${String(X).padStart(2,"0")}m`;return`${X}m ${String(z).padStart(2,"0")}s`}function c($,Z=0){let Q=Math.pow(10,Z);return Math.round($*Q)/Q}function i($,Z){return $.toFixed(Z)}function F1($,Z){return $.length>=Z?$:$+" ".repeat(Z-$.length)}function m6($){let Z="N/A",Q=0,X=r(p($,"state","orchestrator.json"));if(X&&typeof X==="object"){if(typeof X.currentPhase==="string")Z=X.currentPhase;if(typeof X.currentIteration==="number")Q=X.currentIteration}let z=p($,"metrics","efficiency"),K=g6(z),V=[];for(let T of K){let _=r(T);if(_&&typeof _==="object")V.push(_)}if(V.length>0)Q=Math.max(Q,V.length);let q=V.reduce((T,_)=>T+(_.input_tokens??0),0),W=V.reduce((T,_)=>T+(_.output_tokens??0),0),G=q+W,H=V.reduce((T,_)=>T+(_.cost_usd??0),0),B=V.reduce((T,_)=>T+(_.duration_seconds??0),0),J=0,M=0,j=r(p($,"metrics","budget.json"));if(j&&typeof j==="object"){if(typeof j.budget_limit==="number")J=j.budget_limit;if(typeof j.budget_used==="number")M=j.budget_used}let I=0,F=0,O=r(p($,"state","quality-gates.json"));if(O&&typeof O==="object"){if(Array.isArray(O)){for(let T of O)if(F+=1,T===!0)I+=1;else if(T&&typeof T==="object"){let _=T;if(_.passed===!0||_.status==="passed")I+=1}}else for(let T of Object.values(O))if(typeof T==="boolean"){if(F+=1,T)I+=1}else if(T&&typeof T==="object"){F+=1;let _=T;if(_.passed===!0||_.status==="passed")I+=1}}let C={},V1=r(p($,"quality","gate-failure-count.json"));if(V1&&typeof V1==="object"&&!Array.isArray(V1)){let T={};for(let[_,y]of Object.entries(V1))if(typeof y==="number")T[_]=y;C=T}let p1=0,c1=0,l1=0,j1=p($,"quality");if(E1(j1)){let T=[];try{T=W0(j1)}catch{T=[]}for(let _ of T){if(!_.endsWith(".json")||_==="gate-failure-count.json")continue;let y=r(p(j1,_));if(!y||typeof y!=="object")continue;if(!(("verdict"in y)||("approved"in y)||("reviewers"in y)))continue;p1+=1;let d1=(y.verdict??"").toString().toLowerCase();if(y.approved===!0||["approved","approve","pass"].includes(d1))c1+=1;else if(["revision","revise","changes_requested","reject"].includes(d1))l1+=1}}return{phase:Z,iterationCount:Q,iterations:V,totalInput:q,totalOutput:W,totalTokens:G,totalCost:H,totalDuration:B,budgetLimit:J,budgetUsed:M,gatesPassed:I,gatesTotal:F,gateFailures:C,reviewsTotal:p1,reviewsApproved:c1,reviewsRevision:l1}}function u6($,Z){let Q=$.iterationCount,X={session:{iterations:Q,duration_seconds:$.totalDuration,phase:$.phase},tokens:{input:$.totalInput,output:$.totalOutput,total:$.totalTokens,cost_usd:c($.totalCost,2)},quality:{gates_passed:$.gatesPassed,gates_total:$.gatesTotal,reviews_total:$.reviewsTotal,reviews_approved:$.reviewsApproved,reviews_revision:$.reviewsRevision,gate_failures:$.gateFailures},efficiency:{avg_tokens_per_iteration:Q>0?c($.totalTokens/Q,0):0,avg_cost_per_iteration:Q>0?c($.totalCost/Q,2):0,avg_duration_per_iteration:Q>0?c($.totalDuration/Q,1):0},budget:{used:c($.budgetUsed,2),limit:$.budgetLimit,percent:$.budgetLimit>0?c($.budgetUsed/$.budgetLimit*100,1):0}};if(Z)X.iterations=$.iterations.map((V,q)=>({number:q+1,input_tokens:V.input_tokens??0,output_tokens:V.output_tokens??0,cost_usd:c(V.cost_usd??0,2),duration_seconds:V.duration_seconds??0}));let z=JSON.stringify(X,null,2);function K(V,q){if(!q)return;let W=new RegExp(`("${V}": )(-?\\d+)(,?)$`,"m");z=z.replace(W,(G,H,B,J)=>`${H}${B}.0${J}`)}if(K("avg_duration_per_iteration",Q>0&&Number.isInteger(X.efficiency.avg_duration_per_iteration)),K("percent",$.budgetLimit>0&&Number.isInteger(X.budget.percent)),K("cost_usd",Q>0&&Number.isInteger(X.tokens.cost_usd)),Z)z=z.replace(/("cost_usd": )(-?\d+)(,?)$/gm,(V,q,W,G)=>`${q}${W}.0${G}`);return z}function p6($,Z){let Q=[];if(Q.push("Loki Mode Session Statistics"),Q.push("============================"),Q.push(""),Q.push("Session"),Q.push(` Iterations completed: ${$.iterationCount}`),Q.push(` Duration: ${R1($.totalDuration)}`),Q.push(` Current phase: ${$.phase}`),Q.push(""),Q.push("Token Usage"),$.iterations.length>0)Q.push(` Input tokens: ${t($.totalInput)}`),Q.push(` Output tokens: ${t($.totalOutput)}`),Q.push(` Total tokens: ${t($.totalTokens)}`),Q.push(` Estimated cost: $${i($.totalCost,2)}`);else Q.push(" N/A (no iteration metrics found)");if(Q.push(""),Q.push("Quality Gates"),$.gatesTotal>0){let X=Math.round($.gatesPassed/$.gatesTotal*100);Q.push(` Gates passed: ${$.gatesPassed}/${$.gatesTotal} (${X}%)`)}else Q.push(" Gates passed: N/A");if($.reviewsTotal>0){let X=[];if($.reviewsApproved>0)X.push(`${$.reviewsApproved} approved`);if($.reviewsRevision>0)X.push(`${$.reviewsRevision} revision requested`);let z=X.length>0?X.join(", "):"N/A";Q.push(` Code reviews: ${$.reviewsTotal} (${z})`)}if(Object.keys($.gateFailures).length>0){let X=Object.entries($.gateFailures).filter(([,z])=>z>0).map(([z,K])=>`${z} (${K})`);if(X.length>0)Q.push(` Gate failures: ${X.join(", ")}`)}if(Q.push(""),Q.push("Efficiency"),$.iterationCount>0&&$.iterations.length>0){let X=Math.round($.totalTokens/$.iterationCount),z=$.totalCost/$.iterationCount,K=$.totalDuration/$.iterationCount;Q.push(` Avg tokens/iteration: ${t(X)}`),Q.push(` Avg cost/iteration: $${i(z,2)}`),Q.push(` Avg duration/iteration: ${R1(K)}`)}else Q.push(" N/A (no iteration metrics found)");if(Q.push(""),Q.push("Budget"),$.budgetLimit>0){let X=c($.budgetUsed/$.budgetLimit*100,1),z=Number.isInteger(X)?`${X}.0`:`${X}`;Q.push(` Used: $${i($.budgetUsed,2)} / $${i($.budgetLimit,2)} (${z}%)`)}else if($.budgetUsed>0)Q.push(` Used: $${i($.budgetUsed,2)} (no limit set)`);else Q.push(" N/A");if(Z&&$.iterations.length>0)Q.push(""),Q.push("Per-Iteration Breakdown"),$.iterations.forEach((X,z)=>{let K=z+1,V=F1(t(X.input_tokens??0),10),q=F1(t(X.output_tokens??0),10),W=X.cost_usd??0,G=R1(X.duration_seconds??0),H=F1(`${K}`,3);Q.push(` #${H} input: ${V} output: ${q} cost: $${i(W,2)} time: ${G}`)});return Q.join(`
|
|
265
265
|
`)}function H0($){let Z=!1,Q=!1;for(let V of $)if(V==="--json")Z=!0;else if(V==="--efficiency")Q=!0;let X=x();if(!E1(X)){if(Z)return{exitCode:0,stdout:'{"error": "No active session"}'};return{exitCode:0,stdout:`${w}No active session found.${U}
|
|
266
|
-
Start a session with: loki start <prd>`}}let z=m6(X);return{exitCode:0,stdout:Z?u6(z,Q):p6(z,Q)}}async function c6($){let Z=H0($);return console.log(Z.stdout),Z.exitCode}var B0=E(()=>{h();d()});var I0={};b(I0,{runDoctor:()=>Q3,httpReachable:()=>S1,checkTool:()=>T0,checkSkills:()=>O0,checkDisk:()=>D1,buildDoctorJson:()=>j0});import{existsSync as l6,lstatSync as d6,readlinkSync as o6,statfsSync as n6}from"fs";import{homedir as M0}from"os";import{resolve as Y0}from"path";function s6($){let Z=$.match(a6);return Z?Z[1]:null}async function r6($){try{let Z=await N([$,"--version"],{timeoutMs:5000}),Q=(Z.stdout||Z.stderr||"").trim();return s6(Q)}catch{return null}}function A0($,Z){let Q=$.split(".").map((z)=>parseInt(z,10)),X=Z.split(".").map((z)=>parseInt(z,10));while(Q.length<2)Q.push(0);while(X.length<2)X.push(0);for(let z=0;z<2;z++){let K=Q[z]??0,V=X[z]??0;if(Number.isNaN(K)||Number.isNaN(V))return 0;if(K!==V)return K-V}return 0}async function T0($,Z,Q,X=null){let z=await
|
|
266
|
+
Start a session with: loki start <prd>`}}let z=m6(X);return{exitCode:0,stdout:Z?u6(z,Q):p6(z,Q)}}async function c6($){let Z=H0($);return console.log(Z.stdout),Z.exitCode}var B0=E(()=>{h();d()});var I0={};b(I0,{runDoctor:()=>Q3,httpReachable:()=>S1,checkTool:()=>T0,checkSkills:()=>O0,checkDisk:()=>D1,buildDoctorJson:()=>j0});import{existsSync as l6,lstatSync as d6,readlinkSync as o6,statfsSync as n6}from"fs";import{homedir as M0}from"os";import{resolve as Y0}from"path";function s6($){let Z=$.match(a6);return Z?Z[1]:null}async function r6($){try{let Z=await N([$,"--version"],{timeoutMs:5000}),Q=(Z.stdout||Z.stderr||"").trim();return s6(Q)}catch{return null}}function A0($,Z){let Q=$.split(".").map((z)=>parseInt(z,10)),X=Z.split(".").map((z)=>parseInt(z,10));while(Q.length<2)Q.push(0);while(X.length<2)X.push(0);for(let z=0;z<2;z++){let K=Q[z]??0,V=X[z]??0;if(Number.isNaN(K)||Number.isNaN(V))return 0;if(K!==V)return K-V}return 0}async function T0($,Z,Q,X=null){let z=await v(Z),K=z!==null,V=K?await r6(Z):null,q="pass";if(!K)q=Q==="required"?"fail":"warn";else if(X&&V){if(A0(V,X)<0)q=Q==="required"?"fail":"warn"}return{name:$,command:Z,found:K,version:V,required:Q,min_version:X,status:q,path:z}}function D1(){let $=null;try{let Q=n6(M0()),X=Number(Q.bavail)*Number(Q.bsize);$=Math.round(X/1073741824*10)/10}catch{$=null}let Z="pass";if($!==null){if($<1)Z="fail";else if($<5)Z="warn"}return{available_gb:$,status:Z}}async function S1($,Z=2000){try{return(await fetch($,{signal:AbortSignal.timeout(Z)})).ok}catch{return!1}}async function N1($,Z=!1){let Q=`import ${$}`,X=Z?30000:5000;if(!Z)return(await o(Q,{timeoutMs:X})).exitCode===0;let z=await a();if(!z)return!1;return(await N([z,"-c",Q],{timeoutMs:X})).exitCode===0}function O0(){let $=M0();return t6.map(({name:Z,dir:Q})=>{let X=Y0($,Q),z=X,K=Y0(X,"SKILL.md");if(l6(K))return{name:Z,path:z,status:"pass",detail:""};try{if(d6(X).isSymbolicLink()){let q="unknown";try{q=o6(X)}catch{}return{name:Z,path:z,status:"fail",detail:`(broken symlink -> ${q})`}}}catch{}return{name:Z,path:z,status:"warn",detail:"(not found - run 'loki setup-skill')"}})}async function _0(){return Promise.all(i6.map(async($)=>{return{...await T0($.jsonName,$.cmd,$.required,$.min??null),displayName:$.displayName}}))}async function j0(){let Z=(await _0()).map(({displayName:V,...q})=>q),Q=D1(),X=0,z=0,K=0;for(let V of Z)if(V.status==="pass")X++;else if(V.status==="fail")z++;else K++;if(Q.status==="pass")X++;else if(Q.status==="fail")z++;else K++;return{checks:Z,disk:Q,summary:{passed:X,failed:z,warnings:K,ok:z===0}}}function Y($){switch($){case"pass":return`${k}PASS${U}`;case"fail":return`${P}FAIL${U}`;case"warn":return`${w}WARN${U}`}}function H1($){let Z=$.version?` (v${$.version})`:"",Q=$.displayName;if(!$.found){let X=$.required==="required"?"not found":$.required==="recommended"?"not found (recommended)":"not found (optional)";return` ${Y($.status)} ${Q} - ${X}`}if($.min_version&&$.version&&A0($.version,$.min_version)<0){let X=$.required==="required"?"requires":"recommended";return` ${Y($.status)} ${Q}${Z} - ${X} >= ${$.min_version}`}return` ${Y($.status)} ${Q}${Z}`}function J1($,Z){if(Z==="pass")$.pass++;else if(Z==="fail")$.fail++;else $.warn++}function e6(){process.stdout.write(`${D}loki doctor${U} - Check system prerequisites
|
|
267
267
|
|
|
268
268
|
`),process.stdout.write(`Usage: loki doctor [--json]
|
|
269
269
|
|
|
@@ -369,8 +369,8 @@ Restored files (matches autonomy/run.sh:7028 byte-for-byte):
|
|
|
369
369
|
Note: only state files are restored. Source code, git history, and the
|
|
370
370
|
session's autonomy-state.json are unchanged. Re-run \`loki start\` to
|
|
371
371
|
resume from the restored state.
|
|
372
|
-
`;var C0=E(()=>{E0();d()});import{closeSync as j7,mkdirSync as M3,openSync as
|
|
373
|
-
`),A3(Q,$)}async function k0($,Z){let Q=M1.get($)??Promise.resolve(),X=()=>{},z=new Promise((V)=>{X=V}),K=Q.catch(()=>{}).then(()=>z);M1.set($,K);try{return await Q.catch(()=>{}),await Z()}finally{if(X(),M1.get($)===K)M1.delete($)}}var _3=0,M1;var
|
|
372
|
+
`;var C0=E(()=>{E0();d()});import{closeSync as j7,fstatSync as I7,lstatSync as P7,mkdirSync as M3,openSync as L7,readSync as x7,renameSync as A3,rmSync as w7,statSync as R7,unlinkSync as F7,writeFileSync as T3,writeSync as E7}from"fs";import{dirname as O3}from"path";function X1($,Z){M3(O3($),{recursive:!0});let Q=`${$}.tmp.${process.pid}.${++_3}`;T3(Q,`${JSON.stringify(Z,null,2)}
|
|
373
|
+
`),A3(Q,$)}async function k0($,Z){let Q=M1.get($)??Promise.resolve(),X=()=>{},z=new Promise((V)=>{X=V}),K=Q.catch(()=>{}).then(()=>z);M1.set($,K);try{return await Q.catch(()=>{}),await Z()}finally{if(X(),M1.get($)===K)M1.delete($)}}var _3=0,M1;var v1=E(()=>{M1=new Map});var h1={};b(h1,{renderFindingsForPrompt:()=>x3,loadPreviousFindings:()=>y1,findLatestReviewDir:()=>f0,_parseReviewerOutputForTests:()=>w3});import{existsSync as v0,readFileSync as b0,readdirSync as y0,statSync as j3}from"fs";import{join as A1}from"path";function L3($){let Z=$.toLowerCase();if(Z==="critical")return"Critical";if(Z==="high")return"High";if(Z==="medium")return"Medium";return"Low"}function h0($,Z,Q,X){let z=[],K=$.split(/\r?\n/);for(let V of K){let q=V.trim();if(q.length===0)continue;let W=q.replace(/^[-*]\s*/,""),G=I3.exec(W);if(!G)continue;let H=L3(G[1]),B=G[2].trim(),J=P3.exec(B),M=J?J[1]:null,j=J?Number.parseInt(J[2],10):null;z.push({reviewId:Q,iteration:X,reviewer:Z,severity:H,description:B,file:M,line:Number.isFinite(j)?j:null,raw:q})}return z}function f0($,Z){let Q=A1($,"quality","reviews");if(!v0(Q))return null;let X;try{X=y0(Q)}catch{return null}let z=Z===void 0?X.filter((q)=>q.startsWith("review-")):X.filter((q)=>q.endsWith(`-${Z}`)&&q.startsWith("review-"));if(z.length===0)return null;z.sort();let K=z[z.length-1];if(!K)return null;let V=A1(Q,K);try{if(!j3(V).isDirectory())return null}catch{return null}return V}function y1($,Z){let Q=f0($,Z);if(Q===null)return{reviewDir:null,reviewId:null,iteration:null,findings:[]};let X=null,z=null,K=A1(Q,"aggregate.json");if(v0(K))try{let G=b0(K,"utf-8"),H=JSON.parse(G);if(typeof H.review_id==="string")X=H.review_id;if(typeof H.iteration==="number")z=H.iteration}catch{}let V;try{V=y0(Q)}catch{return{reviewDir:Q,reviewId:X,iteration:z,findings:[]}}let q=new Set(["diff.txt","files.txt","anti-sycophancy.txt"]),W=[];for(let G of V){if(!G.endsWith(".txt"))continue;if(q.has(G))continue;if(G.endsWith("-prompt.txt"))continue;let H=G.replace(/\.txt$/,""),B;try{B=b0(A1(Q,G),"utf-8")}catch{continue}W.push(...h0(B,H,X??"",z??-1))}return{reviewDir:Q,reviewId:X,iteration:z,findings:W}}function x3($){if($.length===0)return"";let Z=["Critical","High","Medium","Low"],Q=new Map;for(let z of Z)Q.set(z,[]);for(let z of $){let K=Q.get(z.severity);if(K)K.push(z)}let X=[];X.push("PREVIOUS REVIEWER FINDINGS (must address each, or supply counter-evidence in .loki/state/counter-evidence-<iter>.json):");for(let z of Z){let K=Q.get(z)??[];if(K.length===0)continue;X.push(` [${z}] (${K.length}):`);for(let V of K){let q=V.file?` (${V.file}${V.line!==null?":"+V.line:""})`:"";X.push(` - ${V.description}${q} -- via ${V.reviewer}`)}}return X.join(`
|
|
374
374
|
`)}function w3($,Z,Q="review-test",X=0){return h0($,Z,Q,X)}var I3,P3;var T1=E(()=>{I3=/\[(Critical|High|Medium|Low)\]\s*(.+)/i,P3=/([\w.\-/]+\.[a-zA-Z]+):(\d+)/});import{existsSync as R3}from"fs";import{join as F3}from"path";async function g0($,Z){let Q=F3($,"memory");if(!R3(Q))return{stored:!1,reason:"memory dir not initialized"};let X=Math.max(0,Math.floor(Z.durationSeconds??0)),z={_LOKI_PROJECT_DIR:g,_LOKI_TARGET_DIR:process.cwd(),_LOKI_TASK_ID:Z.taskId,_LOKI_OUTCOME:Z.outcome,_LOKI_PHASE:Z.phase,_LOKI_GOAL:Z.goal,_LOKI_DURATION:String(X),_LOKI_LOKI_DIR:$},V=await o(`
|
|
375
375
|
import os, sys
|
|
376
376
|
project = os.environ.get('_LOKI_PROJECT_DIR', '')
|
|
@@ -398,9 +398,9 @@ try:
|
|
|
398
398
|
print('OK')
|
|
399
399
|
except Exception as e:
|
|
400
400
|
print('ERR:' + str(e))
|
|
401
|
-
`,{env:z,timeoutMs:15000});if(V.exitCode===127)return{stored:!1,reason:"python3 not found"};let q=V.stdout.trim();if(q==="OK")return{stored:!0,reason:"stored"};if(q.startsWith("ERR:"))return{stored:!1,reason:q.replace(/^ERR:/,"")};return{stored:!1,reason:V.stderr.trim()||"unknown"}}var m0=E(()=>{$1();h()});var l0={};b(l0,{loadLearnings:()=>f1,appendLearning:()=>z1,appendFromGateFailure:()=>
|
|
402
|
-
`)}async function
|
|
403
|
-
`)}function e3($,Z){l3(s3($),{recursive:!0});let Q=`${$}.tmp.${process.pid}.${++s0}`;a3(Q,Z),n3(Q,$)}function $5($,Z,Q={}){let X=Q.findings??
|
|
401
|
+
`,{env:z,timeoutMs:15000});if(V.exitCode===127)return{stored:!1,reason:"python3 not found"};let q=V.stdout.trim();if(q==="OK")return{stored:!0,reason:"stored"};if(q.startsWith("ERR:"))return{stored:!1,reason:q.replace(/^ERR:/,"")};return{stored:!1,reason:V.stderr.trim()||"unknown"}}var m0=E(()=>{$1();h()});var l0={};b(l0,{loadLearnings:()=>f1,appendLearning:()=>z1,appendFromGateFailure:()=>v3});import{existsSync as E3,readFileSync as N3}from"fs";import{join as u0}from"path";import{createHash as S3}from"crypto";function p0($){return u0($,D3)}function C3($){if($===null||typeof $!=="object")return!1;let Z=$;return typeof Z.id==="string"&&typeof Z.timestamp==="string"&&typeof Z.iteration==="number"&&typeof Z.trigger==="string"&&typeof Z.rootCause==="string"&&typeof Z.fix==="string"&&typeof Z.preventInFuture==="string"&&typeof Z.evidence==="object"&&Z.evidence!==null}function c0($){if(!E3($))return{version:1,learnings:[]};try{let Z=N3($,"utf-8"),Q=JSON.parse(Z);if(Q.version===1&&Array.isArray(Q.learnings))return{version:1,learnings:Q.learnings.filter(C3)}}catch{}return{version:1,learnings:[]}}function k3($,Z){return S3("sha256").update(`${$}\x00${Z}`).digest("hex").slice(0,16)}async function z1($,Z,Q={}){let X=k3(Z.trigger,Z.rootCause),z=new Date().toISOString(),K={id:X,timestamp:z,...Z},V=p0($);if(await k0(V,()=>{let W=c0(V),G=W.learnings.findIndex((H)=>H.id===X);if(G>=0){let H=W.learnings[G];W.learnings[G]={...H,timestamp:z,iteration:K.iteration}}else W.learnings.push(K);X1(V,W)}),Q.episodeBridge!==null&&(Q.episodeBridge!==void 0||process.env.LOKI_AUTO_LEARNINGS_EPISODE==="1")){let W=Q.episodeBridge??g0,G=Q.bridgeFailureLog??b3;try{let H=await W($,{taskId:`learning-${X}`,outcome:"failure",phase:"VERIFY",goal:`${Z.trigger}: ${Z.rootCause}`});if(H&&!H.stored){if(!new Set(["memory dir not initialized","stub"]).has(H.reason))G(`episode_bridge skipped: ${H.reason}`)}}catch(H){G(`episode_bridge threw: ${H.message}`)}}return K}function b3($){process.stderr.write(`[learnings_writer] ${$}
|
|
402
|
+
`)}async function v3($,Z,Q,X={}){let z=`[${Q.severity}] ${Q.description}`;return z1($,{iteration:Z,trigger:"gate_failure",rootCause:z,fix:"pending: dev agent must address in next iteration or supply counter-evidence",preventInFuture:"if this finding recurs, lower its severity threshold or add a regression test",evidence:{reviewId:Q.reviewId,file:Q.file??void 0,line:Q.line??void 0,severity:Q.severity,reviewer:Q.reviewer}},X)}function f1($){return c0(p0($))}var D3;var O1=E(()=>{v1();m0();D3=u0("state","relevant-learnings.json")});var o0={};b(o0,{runOverrideCouncil:()=>u3,recordOverrideOutcome:()=>p3,loadCounterEvidence:()=>m3,canonicalFindingId:()=>g1,DEFAULT_OVERRIDE_JUDGES:()=>d0});import{existsSync as y3,readFileSync as h3}from"fs";import{join as f3}from"path";function m3($,Z){let Q=f3($,"state",`counter-evidence-${Z}.json`);if(!y3(Q))return null;try{let X=h3(Q,"utf-8"),z=JSON.parse(X);if(typeof z.iteration!=="number")return null;let K=Array.isArray(z.evidence)?z.evidence:[],V=[];for(let q of K){if(typeof q!=="object"||q===null)continue;let W=q;if(typeof W.findingId!=="string")continue;if(typeof W.claim!=="string")continue;if(typeof W.proofType!=="string")continue;let G=W.proofType;if(!g3.has(G))continue;let H=Array.isArray(W.artifacts)?W.artifacts:[];V.push({findingId:W.findingId,claim:W.claim,proofType:G,artifacts:H.filter((B)=>typeof B==="string")})}return{iteration:z.iteration,evidence:V}}catch{return null}}async function u3($,Z,Q,X={}){let z=X.judges??d0,K=new Set,V=new Set,q={},W=new Map;for(let G of Z.evidence)W.set(G.findingId,G);for(let G of $){let H=g1(G),B=W.get(H);if(!B){V.add(H);continue}let J=await Promise.all(z.map((j)=>Q({finding:G,evidence:B,judge:j})));if(q[H]=J,J.filter((j)=>j.verdict==="APPROVE_OVERRIDE").length>=2)K.add(H);else V.add(H)}return{approvedFindingIds:K,rejectedFindingIds:V,votes:q}}function g1($){let Z=$.raw.slice(0,80).replace(/\s+/g," ").trim();return`${$.reviewer}::${Z}`}async function p3($,Z,Q,X,z={}){let K={episodeBridge:z.episodeBridge===void 0?null:z.episodeBridge};for(let V of X){let q=g1(V);if(Q.approvedFindingIds.has(q))await z1($,{iteration:Z,trigger:"override_approved",rootCause:`[${V.severity}] ${V.description}`,fix:"override council approved counter-evidence; finding lifted",preventInFuture:"if this reviewer/file pair recurs, narrow the reviewer's selector OR add a baseline doc",evidence:{findingId:q,reviewId:V.reviewId,file:V.file??void 0,line:V.line??void 0,severity:V.severity,reviewer:V.reviewer}},K);else if(Q.rejectedFindingIds.has(q))await z1($,{iteration:Z,trigger:"override_rejected",rootCause:`[${V.severity}] ${V.description}`,fix:"override council rejected -- dev agent must fix the finding",preventInFuture:"address this finding in the next iteration",evidence:{findingId:q,reviewId:V.reviewId,file:V.file??void 0,line:V.line??void 0,severity:V.severity,reviewer:V.reviewer}},K)}}var g3,d0;var n0=E(()=>{O1();g3=new Set(["file-exists","test-passes","grep-miss","reviewer-misread","duplicate-code-path","out-of-scope"]);d0=["judge-primary","judge-secondary","judge-tertiary"]});var r0={};b(r0,{writeEscalationHandoff:()=>$5,renderHandoff:()=>a0,readLatestHandoff:()=>Q5});import{existsSync as c3,mkdirSync as l3,readdirSync as d3,readFileSync as o3,renameSync as n3,writeFileSync as a3}from"fs";import{dirname as s3,join as _1}from"path";function r3(){return new Date().toISOString()}function t3($){let Z=$.file?` (${$.file}${$.line!==null?":"+$.line:""})`:"";return` - [${$.severity}] ${$.description}${Z} -- ${$.reviewer}`}function i3($){let Z=$.evidence,Q=Z.file?` ${Z.file}${Z.line!==void 0?":"+Z.line:""}`:"";return` - **${$.trigger}** (iter ${$.iteration})${Q}: ${$.rootCause}`}function a0($,Z,Q){let X=[];if(X.push(`# Loki escalation handoff -- ${r3()}`),X.push(""),X.push(`Gate **${$.gateName}** has failed ${$.consecutiveFailures} consecutive times at iteration ${$.iteration}.`),X.push(""),X.push(`Reason: ${$.detail}`),X.push(""),Z.length>0){X.push(`## Outstanding findings (${Z.length})`),X.push("");for(let z of Z)X.push(t3(z));X.push("")}else X.push("## Outstanding findings"),X.push(""),X.push("(no per-finding records captured -- gate failed without populating reviewer outputs)"),X.push("");if(Q.length>0){X.push(`## Recent learnings (${Math.min(Q.length,10)})`),X.push("");for(let z of Q.slice(-10))X.push(i3(z));X.push("")}return X.push("## What the human must decide"),X.push(""),X.push("- Approve override? Write `.loki/state/counter-evidence-<iter>.json` with one entry per finding to dispute, then `rm .loki/PAUSE` to resume."),X.push("- Disable a gate? Set `LOKI_GATE_<NAME>=false` in env (see skills/quality-gates.md)."),X.push("- Tweak escalation? Set `LOKI_GATE_PAUSE_LIMIT` or `LOKI_GATE_ESCALATE_LIMIT`."),X.push("- Roll back? Switch to `LOKI_LEGACY_BASH=1` and re-run; the bash route does not consult this handoff doc."),X.push(""),X.push("To resume: address the findings (or supply counter-evidence) and `rm .loki/PAUSE`."),X.join(`
|
|
403
|
+
`)}function e3($,Z){l3(s3($),{recursive:!0});let Q=`${$}.tmp.${process.pid}.${++s0}`;a3(Q,Z),n3(Q,$)}function $5($,Z,Q={}){let X=Q.findings??y1($,Z.iteration).findings,z=Q.learnings??f1($).learnings,K=a0(Z,X,z),V=(Q.now?.()??new Date).toISOString().replace(/[-:.]/g,""),q=_1($,"escalations"),W=++s0,G=_1(q,`handoff-${V}-${process.pid}-${W}-${Z.gateName}.md`);return e3(G,K),{path:G,bytes:K.length}}function Q5($){let Z=_1($,"escalations");if(!c3(Z))return null;let Q;try{Q=d3(Z).filter((K)=>K.endsWith(".md"))}catch{return null}if(Q.length===0)return null;Q.sort();let X=Q[Q.length-1];if(!X)return null;let z=_1(Z,X);try{return{path:z,body:o3(z,"utf-8")}}catch{return null}}var s0=0;var t0=E(()=>{T1();O1()});var i0={};b(i0,{runInternalPhase1Hooks:()=>U5,_resolveForTests:()=>V5,_internalPhase1HooksHelp:()=>H5});import{existsSync as Z5,mkdirSync as X5,readdirSync as z5,statSync as K5}from"fs";import{join as K1,resolve as V5}from"path";async function U5($){let[Z,...Q]=$;switch(Z){case void 0:case"help":case"--help":case"-h":return process.stdout.write(m1),Z===void 0?1:0;case"reflect":return q5(Q);case"override":return W5(Q);case"handoff":return G5(Q);default:return process.stderr.write(`Unknown subcommand: ${Z}
|
|
404
404
|
`),process.stderr.write(m1),2}}async function q5($){let Z=u1($[0]);if(Z===null)return process.stderr.write(`reflect: missing or invalid <iter>
|
|
405
405
|
`),2;let Q=x();try{let z=(await Promise.resolve().then(() => (T1(),h1))).loadPreviousFindings(Q,Z);if(z.findings.length===0)return process.stdout.write(`reflect: no findings for iter ${Z} (nothing to do)
|
|
406
406
|
`),0;let K=K1(Q,"state");X5(K,{recursive:!0}),X1(K1(K,`findings-${Z}.json`),{review_id:z.reviewId,iteration:Z,findings:z.findings});let V=await Promise.resolve().then(() => (O1(),l0)),q=0;if(process.env.LOKI_AUTO_LEARNINGS!=="0"){for(let W of z.findings)if(W.severity==="Critical"||W.severity==="High")await V.appendFromGateFailure(Q,Z,W,{episodeBridge:null}),q+=1}return process.stdout.write(`reflect: persisted ${z.findings.length} findings + ${q} learnings (iter ${Z})
|
|
@@ -423,7 +423,7 @@ Subcommands:
|
|
|
423
423
|
|
|
424
424
|
This command is invoked by autonomy/run.sh between iterations. Users
|
|
425
425
|
should not run it directly -- run \`loki start\` instead.
|
|
426
|
-
`,H5;var e0=E(()=>{h();
|
|
426
|
+
`,H5;var e0=E(()=>{h();v1();H5=m1});h();import{readFileSync as U6}from"fs";import{resolve as q6,dirname as W6}from"path";import{fileURLToPath as G6}from"url";var l=null;function a1(){if(l!==null)return l;let $="7.5.6";if(typeof $==="string"&&$.length>0)return l=$,l;try{let Z=W6(G6(import.meta.url)),Q=P1(Z);l=U6(q6(Q,"VERSION"),"utf-8").trim()}catch{l="unknown"}return l}function s1(){return process.stdout.write(`Loki Mode v${a1()}
|
|
427
427
|
`),0}m();d();h();import{readFileSync as M6,existsSync as A6}from"fs";import{resolve as T6}from"path";var O6=["claude","codex","gemini","cline","aider"];function t1(){let $=T6(x(),"state","provider");if(!A6($))return"";try{return M6($,"utf-8").trim()}catch{return""}}function _6($,Z){return $||Z||process.env.LOKI_PROVIDER||"claude"}function j6($){let Z=t1(),Q=_6($,Z);switch(process.stdout.write(`${D}Current Provider${U}
|
|
428
428
|
`),process.stdout.write(`
|
|
429
429
|
`),process.stdout.write(`${A}Provider:${U} ${Q}
|
|
@@ -437,7 +437,7 @@ should not run it directly -- run \`loki start\` instead.
|
|
|
437
437
|
`),process.stdout.write(`Available: ${A}loki provider list${U}
|
|
438
438
|
`),0}async function I6(){let Z=t1()||process.env.LOKI_PROVIDER||"claude";process.stdout.write(`${D}Available Providers${U}
|
|
439
439
|
`),process.stdout.write(`
|
|
440
|
-
`);let Q=await Promise.all(O6.map(async(K)=>[K,await
|
|
440
|
+
`);let Q=await Promise.all(O6.map(async(K)=>[K,await v(K)!==null])),X=new Map;for(let[K,V]of Q)X.set(K,V?`${k}installed${U}`:`${P}not installed${U}`);let z=[["claude","claude - Claude Code (Anthropic) "],["codex","codex - Codex CLI (OpenAI) "],["gemini","gemini - Gemini CLI (Google) "],["cline","cline - Cline (multi-provider) "],["aider","aider - Aider (terminal pair prog) "]];for(let[K,V]of z){let q=Z===K?` ${A}(current)${U}`:"";process.stdout.write(` ${V} ${X.get(K)}${q}
|
|
441
441
|
`)}return process.stdout.write(`
|
|
442
442
|
`),process.stdout.write(`Set provider: ${A}loki provider set <name>${U}
|
|
443
443
|
`),0}function P6(){return process.stdout.write(`${D}Loki Mode Provider Management${U}
|
|
@@ -498,11 +498,11 @@ Phase 2 ported (Bun-native, fast):
|
|
|
498
498
|
|
|
499
499
|
All other commands fall through to the bash CLI (autonomy/loki).
|
|
500
500
|
Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
|
|
501
|
-
`;async function J5($){let Z=$[0],Q=$.slice(1);switch(Z){case void 0:case"help":case"--help":case"-h":return process.stdout.write($6),0;case"version":case"--version":case"-v":return s1();case"provider":return i1(Q);case"memory":return $0(Q);case"status":{let{runStatus:X}=await Promise.resolve().then(() => (q0(),U0));return X(Q)}case"stats":{let{runStats:X}=await Promise.resolve().then(() => (B0(),J0));return X(Q)}case"doctor":{let{runDoctor:X}=await Promise.resolve().then(() => (P0(),I0));return X(Q)}case"rollback":{let{runRollback:X}=await Promise.resolve().then(() => (C0(),D0));return X(Q)}case"internal":{let X=Q[0];if(!X||X==="--help"||X==="-h"||X==="help"){let K=["loki internal -- runtime hooks driven by autonomy/run.sh","","Subcommands:"," phase1-hooks Persist structured findings, run override council,"," append learnings, and write the escalation handoff"," doc once per iteration. Driven by run.sh; not"," intended for direct invocation.","","These commands are wired into the autonomous loop and may change","without notice. Do not script against them.",""].join(`
|
|
501
|
+
`;async function J5($){let Z=$[0],Q=$.slice(1);switch(Z){case void 0:case"help":case"--help":case"-h":return process.stdout.write($6),0;case"version":case"--version":case"-v":return s1();case"provider":return i1(Q);case"memory":return $0(Q);case"status":{let{runStatus:X}=await Promise.resolve().then(() => (q0(),U0));return X(Q)}case"stats":{let{runStats:X}=await Promise.resolve().then(() => (B0(),J0));return X(Q)}case"doctor":{let{runDoctor:X}=await Promise.resolve().then(() => (P0(),I0));return X(Q)}case"rollback":{let{runRollback:X}=await Promise.resolve().then(() => (C0(),D0));return X(Q)}case"internal":{let X=Q[0];if(!X||X==="--help"||X==="-h"||X==="help"){let K=["loki internal -- runtime hooks driven by autonomy/run.sh","","Subcommands:"," phase1-hooks Persist structured findings, run override council,"," append learnings, and write the escalation handoff"," doc once per iteration. Driven by run.sh; not"," intended for direct invocation.","","Phase 1 (RARV-C closure) env vars:"," LOKI_INJECT_FINDINGS=1 Persist structured reviewer findings to"," .loki/state/findings-<iter>.json so the"," next iteration can address them."," LOKI_OVERRIDE_COUNCIL=1 Allow a 3-LLM override panel to lift a"," BLOCK when counter-evidence is presented."," See LOKI_OVERRIDE_JUDGES (csv),"," LOKI_OVERRIDE_PANEL_SIZE,"," LOKI_OVERRIDE_REAL_JUDGE."," LOKI_AUTO_LEARNINGS=1 Append failure rootcauses to"," .loki/state/relevant-learnings.json via"," the episodic memory bridge."," LOKI_HANDOFF_MD=1 Write a structured human handoff doc to"," .loki/escalations/<ts>.md before PAUSE.","","All four are default-on as of v7.5.3. Set to 0 to disable.","Reference: CHANGELOG.md (search 'Phase 1') and skills/healing.md.","","These commands are wired into the autonomous loop and may change","without notice. Do not script against them.",""].join(`
|
|
502
502
|
`);return process.stdout.write(`${K}
|
|
503
503
|
`),0}if(X==="phase1-hooks"){let{runInternalPhase1Hooks:K}=await Promise.resolve().then(() => (e0(),i0));return K(Q.slice(1))}return process.stderr.write(`Unknown internal subcommand: ${X}
|
|
504
504
|
`),process.stderr.write(`Run 'loki internal --help' for the supported list.
|
|
505
505
|
`),2}default:return process.stderr.write(`Unknown command: ${Z}
|
|
506
506
|
`),process.stderr.write($6),2}}process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var B5=await J5(Bun.argv.slice(2));process.exit(B5);
|
|
507
507
|
|
|
508
|
-
//# debugId=
|
|
508
|
+
//# debugId=CF6E851AC270F6AD64756E2164756E21
|
package/mcp/__init__.py
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loki-mode",
|
|
3
|
-
"version": "7.5.
|
|
3
|
+
"version": "7.5.6",
|
|
4
4
|
"description": "Loki Mode by Autonomi - Multi-agent autonomous startup system for Claude Code, Codex CLI, and Gemini CLI",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
"@opentelemetry/exporter-trace-otlp-http": "^0.57.0"
|
|
125
125
|
},
|
|
126
126
|
"overrides": {
|
|
127
|
-
"protobufjs": ">=7.5.
|
|
127
|
+
"protobufjs": ">=7.5.6"
|
|
128
128
|
},
|
|
129
129
|
"devDependencies": {
|
|
130
130
|
"@types/node": "^25.2.0",
|