loki-mode 9.22.10 → 9.22.11

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 CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: Autonomous spec-driven build system with a built-in trust layer. It does not call work done until it is verified (RARV-C closure loop, 8 quality gates, completion council, verified-completion evidence gate). Triggers on "Loki Mode". Takes a spec (PRD, GitHub issue, OpenAPI doc, etc.) to deployed product with minimal human intervention. Provider-agnostic. Requires --dangerously-skip-permissions flag.
4
4
  ---
5
5
 
6
- # Loki Mode v9.22.10
6
+ # Loki Mode v9.22.11
7
7
 
8
8
  **You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
9
9
 
@@ -470,4 +470,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
470
470
 
471
471
  ---
472
472
 
473
- **v9.22.10 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
473
+ **v9.22.11 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 9.22.10
1
+ 9.22.11
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "9.22.10"
10
+ __version__ = "9.22.11"
11
11
 
12
12
  # Expose the control app for easy import
13
13
  try:
@@ -2,7 +2,7 @@
2
2
 
3
3
  The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
4
4
 
5
- **Version:** v9.22.10
5
+ **Version:** v9.22.11
6
6
 
7
7
  ---
8
8
 
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- var Mf=Object.create;var{getPrototypeOf:Tf,defineProperty:Q$,getOwnPropertyNames:wf}=Object;var Cf=Object.prototype.hasOwnProperty;function Ff(Z){return this[Z]}var Df,Ef,Pf=(Z,X,Q)=>{var Y=Z!=null&&typeof Z==="object";if(Y){var J=X?Df??=new WeakMap:Ef??=new WeakMap,z=J.get(Z);if(z)return z}Q=Z!=null?Mf(Tf(Z)):{};let K=X||!Z||!Z.__esModule?Q$(Q,"default",{value:Z,enumerable:!0}):Q;for(let $ of wf(Z))if(!Cf.call(K,$))Q$(K,$,{get:Ff.bind(Z,$),enumerable:!0});if(Y)J.set(Z,K);return K};var LQ=(Z,X)=>()=>(X||Z((X={exports:{}}).exports,X),X.exports);var kf=(Z)=>Z;function xf(Z,X){this[Z]=kf.bind(null,X)}var l0=(Z,X)=>{for(var Q in X)Q$(Z,Q,{get:X[Q],enumerable:!0,configurable:!0,set:xf.bind(X,Q)})};var u=(Z,X)=>()=>(Z&&(X=Z(Z=0)),X);var Z8=import.meta.require;var fO={};l0(fO,{lokiDir:()=>U0,homeLokiDir:()=>S4,findRepoRootForVersion:()=>J$,REPO_ROOT:()=>n0});import{resolve as s7,dirname as Y$}from"path";import{fileURLToPath as Sf}from"url";import{existsSync as AQ}from"fs";import{homedir as yf}from"os";function bf(){let Z=_O;for(let X=0;X<6;X++){if(AQ(s7(Z,"VERSION"))&&AQ(s7(Z,"autonomy/run.sh")))return Z;let Q=Y$(Z);if(Q===Z)break;Z=Q}return s7(_O,"..","..","..")}function J$(Z){let X=Z;for(let Q=0;Q<6;Q++){if(AQ(s7(X,"VERSION"))&&AQ(s7(X,"autonomy/run.sh")))return X;let Y=Y$(X);if(Y===X)break;X=Y}return s7(Z,"..","..","..")}function U0(){return process.env.LOKI_DIR??s7(process.cwd(),".loki")}function S4(){return s7(yf(),".loki")}var _O,n0;var z8=u(()=>{_O=Y$(Sf(import.meta.url));n0=bf()});import{readFileSync as _f}from"fs";import{resolve as ff,dirname as hf}from"path";import{fileURLToPath as vf}from"url";function v3(){if(v5!==null)return v5;let Z="9.22.10";if(typeof Z==="string"&&Z.length>0)return v5=Z,v5;try{let X=hf(vf(import.meta.url)),Q=J$(X);v5=_f(ff(Q,"VERSION"),"utf-8").trim()}catch{v5="unknown"}return v5}var v5=null;var jQ=u(()=>{z8()});var mO={};l0(mO,{runOrThrow:()=>Xh,run:()=>P0,readStreamCapped:()=>MQ,commandVersion:()=>Yh,commandExists:()=>X9,ShellError:()=>z$,MAX_STDOUT_BYTES:()=>gO});async function MQ(Z,X=gO){let Q=Z.getReader(),Y=new TextDecoder,J="",z=0;try{while(z<X){let{done:K,value:$}=await Q.read();if(K)break;if(!$)continue;if(z+=$.byteLength,z>X){let V=$.byteLength-(z-X);J+=Y.decode($.subarray(0,V),{stream:!0});break}J+=Y.decode($,{stream:!0})}J+=Y.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return J}async function P0(Z,X={}){let Q=Bun.spawn({cmd:[...Z],stdout:"pipe",stderr:"pipe",env:X.env?{...process.env,...X.env}:process.env,cwd:X.cwd}),Y,J;if(X.timeoutMs&&X.timeoutMs>0)Y=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}J=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},X.timeoutMs);try{let[z,K,$]=await Promise.all([MQ(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:z,stderr:K,exitCode:$}}finally{if(Y)clearTimeout(Y);if(J)clearTimeout(J)}}async function Xh(Z,X={}){let Q=await P0(Z,X);if(Q.exitCode!==0)throw new z$(`command failed (${Q.exitCode}): ${Z.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function X9(Z){let X=Qh(Z),Q=await P0(["sh","-c",`command -v ${X}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function Qh(Z){if(!/^[A-Za-z0-9._/-]+$/.test(Z))throw Error(`refused to shell-escape suspect token: ${Z}`);return Z}async function Yh(Z,X="--version"){if(!await X9(Z))return null;let Y=await P0([Z,X],{timeoutMs:5000});if(Y.exitCode!==0)return null;return((Y.stdout||Y.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var gO=16777216,z$;var x9=u(()=>{z$=class z$ extends Error{message;exitCode;stdout;stderr;constructor(Z,X,Q,Y){super(Z);this.message=Z;this.exitCode=X;this.stdout=Q;this.stderr=Y;this.name="ShellError"}}});function o7(Z){return Jh?"":Z}var Jh,j0,F8,h0,wq0,s0,W8,Q9,h;var _6=u(()=>{Jh=(process.env.NO_COLOR??"").length>0;j0=o7("\x1B[0;31m"),F8=o7("\x1B[0;32m"),h0=o7("\x1B[1;33m"),wq0=o7("\x1B[0;34m"),s0=o7("\x1B[0;36m"),W8=o7("\x1B[1m"),Q9=o7("\x1B[2m"),h=o7("\x1B[0m")});import{existsSync as Bh}from"fs";async function P7(){if(b4!==void 0)return b4;let Z="/opt/homebrew/bin/python3.12";if(Bh(Z))return b4=Z,Z;let X=await X9("python3.12");if(X)return b4=X,X;let Q=await X9("python3");return b4=Q,Q}async function K7(Z,X={}){let Q=await P7();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return P0([Q,"-c",Z],X)}var b4;var r7=u(()=>{x9()});var KL={};l0(KL,{runStatus:()=>gh});import{existsSync as Y9,readFileSync as m3,readdirSync as tO,statSync as eO}from"fs";import{resolve as h8,basename as kh}from"path";import{homedir as xh}from"os";function ZL(Z){let X=Math.trunc(Z);if(X>=1e6)return`${(Math.trunc(X/1e6*10)/10).toFixed(1)}M`;if(X>=1000)return`${(Math.trunc(X/1000*10)/10).toFixed(1)}K`;return String(X)}function XL(Z,X,Q){if(X===0)return null;let Y=Math.trunc(Z*100/X),J=Math.trunc(Z*wQ/X);if(J>wQ)J=wQ;let z=wQ-J,K=F8;if(Y>=80)K=j0;else if(Y>=50)K=h0;let $="=".repeat(Math.max(0,J))+" ".repeat(Math.max(0,z)),V=ZL(Z),W=ZL(X);return` ${W8}${Q}${h} ${K}[${$}]${h} ${Y}% (${V} / ${W})`}async function yh(){if(await X9("jq"))return!0;return process.stdout.write(`${j0}Error: jq is required but not installed.${h}
2
+ var Mf=Object.create;var{getPrototypeOf:Tf,defineProperty:Q$,getOwnPropertyNames:wf}=Object;var Cf=Object.prototype.hasOwnProperty;function Ff(Z){return this[Z]}var Df,Ef,Pf=(Z,X,Q)=>{var Y=Z!=null&&typeof Z==="object";if(Y){var J=X?Df??=new WeakMap:Ef??=new WeakMap,z=J.get(Z);if(z)return z}Q=Z!=null?Mf(Tf(Z)):{};let K=X||!Z||!Z.__esModule?Q$(Q,"default",{value:Z,enumerable:!0}):Q;for(let $ of wf(Z))if(!Cf.call(K,$))Q$(K,$,{get:Ff.bind(Z,$),enumerable:!0});if(Y)J.set(Z,K);return K};var LQ=(Z,X)=>()=>(X||Z((X={exports:{}}).exports,X),X.exports);var kf=(Z)=>Z;function xf(Z,X){this[Z]=kf.bind(null,X)}var l0=(Z,X)=>{for(var Q in X)Q$(Z,Q,{get:X[Q],enumerable:!0,configurable:!0,set:xf.bind(X,Q)})};var u=(Z,X)=>()=>(Z&&(X=Z(Z=0)),X);var Z8=import.meta.require;var fO={};l0(fO,{lokiDir:()=>U0,homeLokiDir:()=>S4,findRepoRootForVersion:()=>J$,REPO_ROOT:()=>n0});import{resolve as s7,dirname as Y$}from"path";import{fileURLToPath as Sf}from"url";import{existsSync as AQ}from"fs";import{homedir as yf}from"os";function bf(){let Z=_O;for(let X=0;X<6;X++){if(AQ(s7(Z,"VERSION"))&&AQ(s7(Z,"autonomy/run.sh")))return Z;let Q=Y$(Z);if(Q===Z)break;Z=Q}return s7(_O,"..","..","..")}function J$(Z){let X=Z;for(let Q=0;Q<6;Q++){if(AQ(s7(X,"VERSION"))&&AQ(s7(X,"autonomy/run.sh")))return X;let Y=Y$(X);if(Y===X)break;X=Y}return s7(Z,"..","..","..")}function U0(){return process.env.LOKI_DIR??s7(process.cwd(),".loki")}function S4(){return s7(yf(),".loki")}var _O,n0;var z8=u(()=>{_O=Y$(Sf(import.meta.url));n0=bf()});import{readFileSync as _f}from"fs";import{resolve as ff,dirname as hf}from"path";import{fileURLToPath as vf}from"url";function v3(){if(v5!==null)return v5;let Z="9.22.11";if(typeof Z==="string"&&Z.length>0)return v5=Z,v5;try{let X=hf(vf(import.meta.url)),Q=J$(X);v5=_f(ff(Q,"VERSION"),"utf-8").trim()}catch{v5="unknown"}return v5}var v5=null;var jQ=u(()=>{z8()});var mO={};l0(mO,{runOrThrow:()=>Xh,run:()=>P0,readStreamCapped:()=>MQ,commandVersion:()=>Yh,commandExists:()=>X9,ShellError:()=>z$,MAX_STDOUT_BYTES:()=>gO});async function MQ(Z,X=gO){let Q=Z.getReader(),Y=new TextDecoder,J="",z=0;try{while(z<X){let{done:K,value:$}=await Q.read();if(K)break;if(!$)continue;if(z+=$.byteLength,z>X){let V=$.byteLength-(z-X);J+=Y.decode($.subarray(0,V),{stream:!0});break}J+=Y.decode($,{stream:!0})}J+=Y.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return J}async function P0(Z,X={}){let Q=Bun.spawn({cmd:[...Z],stdout:"pipe",stderr:"pipe",env:X.env?{...process.env,...X.env}:process.env,cwd:X.cwd}),Y,J;if(X.timeoutMs&&X.timeoutMs>0)Y=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}J=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},X.timeoutMs);try{let[z,K,$]=await Promise.all([MQ(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:z,stderr:K,exitCode:$}}finally{if(Y)clearTimeout(Y);if(J)clearTimeout(J)}}async function Xh(Z,X={}){let Q=await P0(Z,X);if(Q.exitCode!==0)throw new z$(`command failed (${Q.exitCode}): ${Z.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function X9(Z){let X=Qh(Z),Q=await P0(["sh","-c",`command -v ${X}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function Qh(Z){if(!/^[A-Za-z0-9._/-]+$/.test(Z))throw Error(`refused to shell-escape suspect token: ${Z}`);return Z}async function Yh(Z,X="--version"){if(!await X9(Z))return null;let Y=await P0([Z,X],{timeoutMs:5000});if(Y.exitCode!==0)return null;return((Y.stdout||Y.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var gO=16777216,z$;var x9=u(()=>{z$=class z$ extends Error{message;exitCode;stdout;stderr;constructor(Z,X,Q,Y){super(Z);this.message=Z;this.exitCode=X;this.stdout=Q;this.stderr=Y;this.name="ShellError"}}});function o7(Z){return Jh?"":Z}var Jh,j0,F8,h0,wq0,s0,W8,Q9,h;var _6=u(()=>{Jh=(process.env.NO_COLOR??"").length>0;j0=o7("\x1B[0;31m"),F8=o7("\x1B[0;32m"),h0=o7("\x1B[1;33m"),wq0=o7("\x1B[0;34m"),s0=o7("\x1B[0;36m"),W8=o7("\x1B[1m"),Q9=o7("\x1B[2m"),h=o7("\x1B[0m")});import{existsSync as Bh}from"fs";async function P7(){if(b4!==void 0)return b4;let Z="/opt/homebrew/bin/python3.12";if(Bh(Z))return b4=Z,Z;let X=await X9("python3.12");if(X)return b4=X,X;let Q=await X9("python3");return b4=Q,Q}async function K7(Z,X={}){let Q=await P7();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return P0([Q,"-c",Z],X)}var b4;var r7=u(()=>{x9()});var KL={};l0(KL,{runStatus:()=>gh});import{existsSync as Y9,readFileSync as m3,readdirSync as tO,statSync as eO}from"fs";import{resolve as h8,basename as kh}from"path";import{homedir as xh}from"os";function ZL(Z){let X=Math.trunc(Z);if(X>=1e6)return`${(Math.trunc(X/1e6*10)/10).toFixed(1)}M`;if(X>=1000)return`${(Math.trunc(X/1000*10)/10).toFixed(1)}K`;return String(X)}function XL(Z,X,Q){if(X===0)return null;let Y=Math.trunc(Z*100/X),J=Math.trunc(Z*wQ/X);if(J>wQ)J=wQ;let z=wQ-J,K=F8;if(Y>=80)K=j0;else if(Y>=50)K=h0;let $="=".repeat(Math.max(0,J))+" ".repeat(Math.max(0,z)),V=ZL(Z),W=ZL(X);return` ${W8}${Q}${h} ${K}[${$}]${h} ${Y}% (${V} / ${W})`}async function yh(){if(await X9("jq"))return!0;return process.stdout.write(`${j0}Error: jq is required but not installed.${h}
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)
@@ -1249,4 +1249,4 @@ Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
1249
1249
  `),2}case"start":{let{runStart:Y}=await Promise.resolve().then(() => (Lf(),Of));return Y(Q)}default:return process.stderr.write(`Unknown command: ${X}
1250
1250
  `),process.stderr.write(Af),2}}oO();process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var Jq0=await Yq0(Bun.argv.slice(2));process.exit(Jq0);
1251
1251
 
1252
- //# debugId=A5DB46EC78F6E1E664756E2164756E21
1252
+ //# debugId=1EE364CCA359D5C764756E2164756E21
package/mcp/__init__.py CHANGED
@@ -75,4 +75,4 @@ try:
75
75
  except ImportError:
76
76
  __all__ = ['mcp']
77
77
 
78
- __version__ = '9.22.10'
78
+ __version__ = '9.22.11'
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": "9.22.10",
4
+ "version": "9.22.11",
5
5
  "description": "Loki Mode by Autonomi. Autonomous spec-to-product system: takes a PRD, GitHub issue, OpenAPI/JSON/YAML, or one-line brief to a deployed app via the RARV-C closure loop with 8 quality gates. Provider-agnostic (Claude Code, OpenAI Codex, Cline, Aider).",
6
6
  "keywords": [
7
7
  "agent",
@@ -2,7 +2,7 @@
2
2
  "_comment": "Canonical model catalog. Update this single file when a provider ships a new model. Providers/web-app/docs read from here.",
3
3
  "_source_of_truth": "models[] is authoritative. Each entry's `tier` decides what that tier resolves to, first match wins, so order within models[] is load-bearing. The top-level latest_<tier> keys are DERIVED mirrors kept only for existing readers (dashboard/server.py, tools/probe-model-catalog.py, tests); never hand-edit them out of step with models[] -- tests/test-model-catalog-single-source.sh fails when they disagree. A provider whose models[] has no entry for a tier must declare `tier_fallback` saying which tier substitutes; there is no implicit fallback.",
4
4
  "schema_version": 1,
5
- "updated": "2026-08-01",
5
+ "updated": "2026-08-18",
6
6
  "providers": {
7
7
  "claude": {
8
8
  "latest_planning": "claude-opus-5",
@@ -198,6 +198,91 @@
198
198
  "open_weights": true
199
199
  }
200
200
  ]
201
+ },
202
+ "minimax": {
203
+ "_comment": "Catalog-only compatibility metadata. MiniMax is not a fifth --provider value; select these models through the existing Claude or Aider adapters with the matching endpoint variables.",
204
+ "latest_planning": "MiniMax-M3",
205
+ "latest_development": "MiniMax-M2.7",
206
+ "latest_fast": "MiniMax-M2.7",
207
+ "tier_fallback": {
208
+ "fast": "development"
209
+ },
210
+ "endpoints": [
211
+ {
212
+ "region": "global_en",
213
+ "openai_base_url": "https://api.minimax.io/v1",
214
+ "anthropic_base_url": "https://api.minimax.io/anthropic",
215
+ "docs_root": "https://platform.minimax.io/docs"
216
+ },
217
+ {
218
+ "region": "cn_zh",
219
+ "openai_base_url": "https://api.minimaxi.com/v1",
220
+ "anthropic_base_url": "https://api.minimaxi.com/anthropic",
221
+ "docs_root": "https://platform.minimaxi.com/docs"
222
+ }
223
+ ],
224
+ "models": [
225
+ {
226
+ "id": "MiniMax-M3",
227
+ "tier": "planning",
228
+ "context_window": 1000000,
229
+ "input_modalities": ["text", "image", "video"],
230
+ "thinking": ["adaptive", "disabled"],
231
+ "pricing_usd_per_million_tokens": {
232
+ "input": 0.3,
233
+ "output": 1.2,
234
+ "cache_read": 0.06,
235
+ "cache_write": null
236
+ },
237
+ "pricing_tiers_usd_per_million_tokens": [
238
+ {
239
+ "service_tier": "standard",
240
+ "input_tokens_lte": 512000,
241
+ "input": 0.3,
242
+ "output": 1.2,
243
+ "cache_read": 0.06,
244
+ "cache_write": null
245
+ },
246
+ {
247
+ "service_tier": "standard",
248
+ "input_tokens_gt": 512000,
249
+ "input": 0.6,
250
+ "output": 2.4,
251
+ "cache_read": 0.12,
252
+ "cache_write": null
253
+ },
254
+ {
255
+ "service_tier": "priority",
256
+ "input_tokens_lte": 512000,
257
+ "input": 0.45,
258
+ "output": 1.8,
259
+ "cache_read": 0.09,
260
+ "cache_write": null
261
+ },
262
+ {
263
+ "service_tier": "priority",
264
+ "input_tokens_gt": 512000,
265
+ "input": 0.9,
266
+ "output": 3.6,
267
+ "cache_read": 0.18,
268
+ "cache_write": null
269
+ }
270
+ ]
271
+ },
272
+ {
273
+ "id": "MiniMax-M2.7",
274
+ "tier": "development",
275
+ "context_window": 204800,
276
+ "input_modalities": ["text"],
277
+ "thinking": ["always_on"],
278
+ "pricing_usd_per_million_tokens": {
279
+ "input": 0.3,
280
+ "output": 1.2,
281
+ "cache_read": 0.06,
282
+ "cache_write": 0.375
283
+ }
284
+ }
285
+ ]
201
286
  }
202
287
  }
203
288
  }