kraken-code 1.3.1 → 1.3.2
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/dist/cli/index.js +2 -2
- package/dist/index.js +2 -2
- package/package.json +2 -1
package/dist/cli/index.js
CHANGED
|
@@ -26,7 +26,7 @@ ${r}`);return{name:n.name,status:"fail",message:i,duration:Math.round(performanc
|
|
|
26
26
|
}
|
|
27
27
|
`}async function se(){let n=jn(),t=ne(),e,i;if(t)try{e=Yt(t.path,"utf-8"),i=t.format}catch(r){return{success:!1,message:`Failed to read config: ${r instanceof Error?r.message:String(r)}`}}else{let r=D.dirname(n.configJson);if(!M(r))try{let{mkdirSync:a}=await import("fs");a(r,{recursive:!0})}catch(a){return{success:!1,message:`Failed to create config directory: ${a instanceof Error?a.message:String(a)}`}}e=ee(),i="json"}try{let r=te(e,i);Bt(t?.path??n.configJson,r,"utf-8");let a=t?.path??n.configJson;if(r===e)return{success:!0,message:`Plugin "${R}" is already registered`,configPath:a};return{success:!0,message:`Plugin "${R}" registered successfully`,configPath:a}}catch(r){return{success:!1,message:`Failed to register plugin: ${r instanceof Error?r.message:String(r)}`}}}function ie(n){if(n.success){if(console.log(q.green(`
|
|
28
28
|
${String.fromCodePoint(10003)} ${n.message}`)),n.configPath)console.log(q.dim(` Config: ${n.configPath}`))}else console.log(q.red(`
|
|
29
|
-
${String.fromCodePoint(10007)} ${n.message}`))}async function yn(){let n=await se();ie(n),process.exit(n.success?0:1)}import{writeFileSync as Nn,existsSync as v,mkdirSync as W,readFileSync as X}from"fs";import*as I from"path";import*as T from"os";import u from"picocolors";var __dirname="/home/runner/work/kraken/kraken/src/cli";async function wn(n){if(n.verbose)console.log(u.dim("\uD83D\uDC19 Initializing Kraken Code with verbose output..."));else console.log(u.cyan("\uD83D\uDC19 Initializing Kraken Code..."));let t=I.join(T.homedir(),".config","opencode"),e=I.join(t,"opencode.json"),i=I.join(t,"kraken-code.json");if(!v(t))try{if(W(t,{recursive:!0}),n.verbose)console.log(u.dim(`\u2139\uFE0F Created config directory: ${t}`));console.log(u.green(`\u2713 Created config directory: ${t}`))}catch(p){console.error(u.red(`\u274C Failed to create config directory: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("Try running with elevated permissions or check permissions for ~/.config/opencode")),process.exit(1)}else if(n.verbose)console.log(u.dim(`\u2139\uFE0F Config directory already exists: ${t}`));let{minimal:r,full:a}=n,l={default_agent:"Kraken",default_agents:["Kraken","Cartographer"],blitzkrieg:{enabled:!0,testPlan:{requiredBeforeImplementation:!0,minTestCases:3,requireCoverageThreshold:!0,coverageThresholdPercent:80},tddWorkflow:{enforceWriteTestFirst:!0,forbidCodeWithoutTest:!0,allowRefactorWithoutTest:!0},evidence:{requireTestExecutionEvidence:!0,requireAssertionEvidence:!0,requireEdgeCaseEvidence:!0},plannerConstraints:{requireTestStep:!0,requireVerificationStep:!0,maxImplementationStepComplexity:3}},kratos:{enabled:!0,autoSave:!0,storagePath:"~/.kratos"},modes:{blitzkrieg:{enabled:!0},ultrathink:{enabled:!0,thinkingBudget:32000,autoVariantSwitch:!0},ultrawork:{enabled:!0,parallelAgents:4},search:{enabled:!0,maxResults:50},analyze:{enabled:!0,consultationPhases:3}}},g={};if(v(i))try{if(g=JSON.parse(X(i,"utf-8")),n.verbose)console.log(u.dim(`\u2139\uFE0F Found existing Kraken configuration at ${i}, merging with new settings`))}catch(p){console.error(u.red(`\u274C Failed to read existing Kraken configuration: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("This might be a corrupted config file. Try removing it manually and re-running init.")),g={}}else if(n.verbose)console.log(u.dim(`\u2139\uFE0F No existing Kraken configuration found at ${i}`));let f={...l,...g};try{if(Nn(i,JSON.stringify(f,null,2)),n.verbose)console.log(u.dim(`\u2139\uFE0F Wrote configuration with ${Object.keys(f).length} keys`));console.log(u.green(`\u2713 Kraken Code configuration written to ${i}`))}catch(p){console.error(u.red(`\u274C Failed to write Kraken configuration: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("Check permissions for the config file and try again.")),process.exit(1)}let c={};if(v(e))try{if(c=JSON.parse(X(e,"utf-8")),n.verbose)console.log(u.dim(`\u2139\uFE0F Found existing OpenCode configuration at ${e}`))}catch(p){console.error(u.red(`\u274C Failed to read OpenCode configuration: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("This might be a corrupted opencode.json file. Try removing it manually and re-running init.")),c={}}else if(n.verbose)console.log(u.dim(`\u2139\uFE0F No existing OpenCode configuration found at ${e}`));let P={...c,plugin:Array.from(new Set([...c.plugin||[],"kraken-code"]))};if(n.verbose)console.log(u.dim(`\u2139\uFE0F Adding kraken-code to plugin list (current plugins: ${c.plugin||[]})`));try{if(Nn(e,JSON.stringify(P,null,2)),n.verbose)console.log(u.dim(`\u2139\uFE0F Updated OpenCode configuration with ${P.plugin.length} plugins`));console.log(u.green(`\u2713 OpenCode configuration updated at ${e}`))}catch(p){console.error(u.red(`\u274C Failed to update OpenCode configuration: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("Check permissions for the config file and try again.")),process.exit(1)}try{if(await re(),n.verbose)console.log(u.dim("\u2139\uFE0F Skill templates installation completed successfully"));console.log(u.green("\u2713 Skill templates installed successfully"))}catch(p){console.error(u.yellow(`\u26A0\uFE0F Failed to install skill templates: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("You can install them manually later by copying templates/skills to ~/.config/opencode/skill"))}if(console.log(u.green(`
|
|
29
|
+
${String.fromCodePoint(10007)} ${n.message}`))}async function yn(){let n=await se();ie(n),process.exit(n.success?0:1)}import{writeFileSync as Nn,existsSync as v,mkdirSync as W,readFileSync as X}from"fs";import*as I from"path";import*as T from"os";import u from"picocolors";var __dirname="/home/runner/work/kraken/kraken/src/cli";async function wn(n){if(n.verbose)console.log(u.dim("\uD83D\uDC19 Initializing Kraken Code with verbose output..."));else console.log(u.cyan("\uD83D\uDC19 Initializing Kraken Code..."));let t=I.join(T.homedir(),".config","opencode"),e=I.join(t,"opencode.json"),i=I.join(t,"kraken-code.json");if(!v(t))try{if(W(t,{recursive:!0}),n.verbose)console.log(u.dim(`\u2139\uFE0F Created config directory: ${t}`));console.log(u.green(`\u2713 Created config directory: ${t}`))}catch(p){console.error(u.red(`\u274C Failed to create config directory: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("Try running with elevated permissions or check permissions for ~/.config/opencode")),process.exit(1)}else if(n.verbose)console.log(u.dim(`\u2139\uFE0F Config directory already exists: ${t}`));let{minimal:r,full:a}=n,l={default_agent:"Kraken",default_agents:["Kraken","Cartographer"],blitzkrieg:{enabled:!0,testPlan:{requiredBeforeImplementation:!0,minTestCases:3,requireCoverageThreshold:!0,coverageThresholdPercent:80},tddWorkflow:{enforceWriteTestFirst:!0,forbidCodeWithoutTest:!0,allowRefactorWithoutTest:!0},evidence:{requireTestExecutionEvidence:!0,requireAssertionEvidence:!0,requireEdgeCaseEvidence:!0},plannerConstraints:{requireTestStep:!0,requireVerificationStep:!0,maxImplementationStepComplexity:3}},kratos:{enabled:!0,autoSave:!0,storagePath:"~/.kratos"},modes:{blitzkrieg:{enabled:!0},ultrathink:{enabled:!0,thinkingBudget:32000,autoVariantSwitch:!0},ultrawork:{enabled:!0,parallelAgents:4},search:{enabled:!0,maxResults:50},analyze:{enabled:!0,consultationPhases:3}}},g={};if(v(i))try{if(g=JSON.parse(X(i,"utf-8")),n.verbose)console.log(u.dim(`\u2139\uFE0F Found existing Kraken configuration at ${i}, merging with new settings`))}catch(p){console.error(u.red(`\u274C Failed to read existing Kraken configuration: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("This might be a corrupted config file. Try removing it manually and re-running init.")),g={}}else if(n.verbose)console.log(u.dim(`\u2139\uFE0F No existing Kraken configuration found at ${i}`));let f={...l,...g,default_agents:l.default_agents};try{if(Nn(i,JSON.stringify(f,null,2)),n.verbose)console.log(u.dim(`\u2139\uFE0F Wrote configuration with ${Object.keys(f).length} keys`));console.log(u.green(`\u2713 Kraken Code configuration written to ${i}`))}catch(p){console.error(u.red(`\u274C Failed to write Kraken configuration: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("Check permissions for the config file and try again.")),process.exit(1)}let c={};if(v(e))try{if(c=JSON.parse(X(e,"utf-8")),n.verbose)console.log(u.dim(`\u2139\uFE0F Found existing OpenCode configuration at ${e}`))}catch(p){console.error(u.red(`\u274C Failed to read OpenCode configuration: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("This might be a corrupted opencode.json file. Try removing it manually and re-running init.")),c={}}else if(n.verbose)console.log(u.dim(`\u2139\uFE0F No existing OpenCode configuration found at ${e}`));let P={...c,plugin:Array.from(new Set([...c.plugin||[],"kraken-code"]))};if(n.verbose)console.log(u.dim(`\u2139\uFE0F Adding kraken-code to plugin list (current plugins: ${c.plugin||[]})`));try{if(Nn(e,JSON.stringify(P,null,2)),n.verbose)console.log(u.dim(`\u2139\uFE0F Updated OpenCode configuration with ${P.plugin.length} plugins`));console.log(u.green(`\u2713 OpenCode configuration updated at ${e}`))}catch(p){console.error(u.red(`\u274C Failed to update OpenCode configuration: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("Check permissions for the config file and try again.")),process.exit(1)}try{if(await re(),n.verbose)console.log(u.dim("\u2139\uFE0F Skill templates installation completed successfully"));console.log(u.green("\u2713 Skill templates installed successfully"))}catch(p){console.error(u.yellow(`\u26A0\uFE0F Failed to install skill templates: ${p instanceof Error?p.message:String(p)}`)),console.error(u.dim("You can install them manually later by copying templates/skills to ~/.config/opencode/skill"))}if(console.log(u.green(`
|
|
30
30
|
\uD83C\uDF89 Kraken Code initialized successfully!`)),console.log(u.dim(`
|
|
31
31
|
Next steps:`)),console.log(u.dim(" 1. Run: opencode")),console.log(u.dim(" 2. Use 'blitz' or 'blz' to activate Blitzkrieg Mode")),n.verbose)console.log(u.dim(`
|
|
32
32
|
\uD83D\uDD0D Verifying installation with detailed output...`));else console.log(u.dim(`
|
|
@@ -43,4 +43,4 @@ Active Modes:`)),console.log(` ${l.join(", ")}`)}}import*as b from"path";import
|
|
|
43
43
|
\uD83D\uDDD1\uFE0F Removing files...`));if(l.forEach((c)=>{try{if(ae(c),n.verbose)console.log(m.dim(`\u2139\uFE0F Removed ${c}`));else console.log(m.green(`\u2713 Removed ${c}`))}catch(P){console.log(m.yellow(`\u26A0\uFE0F Could not remove ${c}: ${P instanceof Error?P.message:String(P)}`))}}),n.verbose)console.log(m.dim("\uD83D\uDDD1\uFE0F Removing directories..."));else console.log(m.yellow("\uD83D\uDDD1\uFE0F Removing directories..."));if(f.forEach((c)=>{try{if(oe(c,{recursive:!0,force:!0}),n.verbose)console.log(m.dim(`\u2139\uFE0F Removed ${c}`));else console.log(m.green(`\u2713 Removed ${c}`))}catch(P){console.log(m.yellow(`\u26A0\uFE0F Could not remove ${c}: ${P instanceof Error?P.message:String(P)}`))}}),$(i))try{let c=A(Ln(i,"utf-8"));if(c.plugin){let P=c.plugin.filter((p)=>p!=="kraken-code");if(P.length!==c.plugin.length){let p={...c,plugin:P};if(ce(i,JSON.stringify(p,null,2)),n.verbose)console.log(m.dim("\u2139\uFE0F Updated opencode.json plugin list (removed kraken-code)"));console.log(m.green("\u2713 Removed kraken-code from opencode.json plugin list"))}else if(n.verbose)console.log(m.dim("\u2139\uFE0F kraken-code was not in opencode.json plugin list"))}}catch(c){console.log(m.yellow(`\u26A0\uFE0F Could not update opencode.json: ${c instanceof Error?c.message:String(c)}`))}else if(n.verbose)console.log(m.dim("\u2139\uFE0F opencode.json not found, skipping plugin list update"));if(console.log(m.green(`
|
|
44
44
|
\uD83C\uDF89 Kraken Code uninstalled successfully!`)),n.verbose)console.log(m.dim(`
|
|
45
45
|
\uD83D\uDCCB Summary of changes:`)),console.log(m.dim(" - Configuration files removed")),console.log(m.dim(" - Skill templates removed")),console.log(m.dim(" - Plugin registration removed from opencode.json"));console.log(m.dim(`
|
|
46
|
-
To reinstall, run: kraken-code install`))}function Dn(n){n.command("uninstall").description("Uninstall and deregister Kraken Code plugin").option("--dry-run","Show what would be removed without actually removing").option("-v, --verbose","Show detailed output").action(async(t)=>{await ue(t)})}var $n="1.3.
|
|
46
|
+
To reinstall, run: kraken-code install`))}function Dn(n){n.command("uninstall").description("Uninstall and deregister Kraken Code plugin").option("--dry-run","Show what would be removed without actually removing").option("-v, --verbose","Show detailed output").action(async(t)=>{await ue(t)})}var $n="1.3.2";var E=new pe;E.name("kraken-code").description("Kraken Code CLI - Unified OpenCode Plugin Manager").version($n);E.command("install").description("Install and register Kraken Code plugin").action(async()=>{await yn()});E.command("init").description("Initialize Kraken Code with recommended configuration").option("--minimal","Minimal setup (agents only)").option("--full","Full setup (all features)").option("-v, --verbose","Show detailed output").action(async(n)=>{await wn(n)});E.command("status").description("Show Kraken Code installation status").action(async()=>{await bn()});Dn(E);E.command("doctor").description("Run system checks and diagnostics").option("-c, --category <category>","Run checks for a specific category").option("--json","Output results as JSON").option("-v, --verbose","Show detailed output").action(async(n)=>{await kn({category:n.category,json:n.json,verbose:n.verbose})});E.parse(process.argv);if(!process.argv.slice(2).length)E.outputHelp();
|
package/dist/index.js
CHANGED
|
@@ -1991,7 +1991,7 @@ Always provide structured, machine-parsable output:
|
|
|
1991
1991
|
|
|
1992
1992
|
Remember: Your value lies in creating plans that enable efficient execution. A Cartographer plan makes implementation straightforward, risks visible, and success verifiable. Great plans enable great code.`,thinking:{type:"enabled",budgetTokens:64000},tools:{write:!1,edit:!1,task:!1}}}var wt=Ea();import{tool as Ra}from"@opencode-ai/plugin";import{z as wr}from"zod";import{execFile as Ta}from"node:child_process";import{promisify as Ma}from"node:util";import vr from"node:path";var __dirname="/home/runner/work/kraken/kraken/src/tools",Da=Ma(Ta);function kr(){return process.platform==="win32"?["where"]:["which"]}async function Na(){try{let e=Bun.spawn([...kr(),"python3"],{stdout:"pipe",stderr:"pipe"}),t=await new Response(e.stdout).text();if(await e.exited,e.exitCode===0)return t.trim().split(`
|
|
1993
1993
|
`)[0]?.trim()??null}catch{}try{let e=Bun.spawn([...kr(),"python"],{stdout:"pipe",stderr:"pipe"}),t=await new Response(e.stdout).text();if(await e.exited,e.exitCode===0)return t.trim().split(`
|
|
1994
|
-
`)[0]?.trim()??null}catch{}return null}async function Oa(e){let t=vr.resolve(__dirname,"..","compression");try{let n=await Na();if(!n)return{success:!1,error:process.platform==="win32"?"Python not found. Install from https://www.python.org/downloads/windows/":"Python not found. Install from https://www.python.org/downloads/"};let{stdout:r,stderr:i}=await Da(n,[vr.join(t,"cli.py"),"compress",e],{cwd:t,maxBuffer:10485760,timeout:30000});if(i&&!r)throw Error(i);let o=JSON.parse(r);if(o.error)throw Error(o.error);return{success:!0,compressed:o.decompressed_text,metadata:{originalTokens:o.metadata.original_tokens,decompressedTokens:o.metadata.decompressed_tokens,tokenChangePercent:o.metadata.token_change_percent}}}catch(n){return{success:!1,error:n instanceof Error?n.message:"Unknown error"}}}var Sr=Ra({description:"Compress prompts using LLM-TLDR algorithm (5× compression, <2% quality loss). "+"Uses dictionary-based compression with CRC64 caching for repeated prompts. Optimized for cost reduction on API calls while maintaining output quality.",args:{text:wr.string().describe("Text to compress"),level:wr.enum(["cache_hit","partial","full"]).default("partial").describe("Compression level: cache_hit (return cached if available), partial (light compression), full (maximum compression)")},async execute(e){let{text:t,level:n}=e;if(!t||t.trim().length===0)return JSON.stringify({success:!1,error:"Empty text provided"});if(n==="cache_hit")return JSON.stringify({success:!0,note:"Cache lookup not implemented in TS wrapper, using full compression",compressed:t});let r=await Oa(t);return JSON.stringify(r,null,2)}});import{tool as $a}from"@opencode-ai/plugin";import{z as le}from"zod";import{readFile as Fa}from"fs/promises";import{join as La}from"path";import{readFile as ve,writeFile as vt}from"fs/promises";import{join as ae}from"path";var Ia=5;async function ce(e){let t=ae(e,".opencode","config.json"),n=await ve(t,"utf-8");return JSON.parse(n).agents||{}}async function ke(e,t){let n=ae(e,".opencode","config.json"),r=await ve(n,"utf-8"),i=JSON.parse(r);i.agents={...i.agents,...t},i.modelSwitcher=i.modelSwitcher||{},i.modelSwitcher.lastUpdated=Date.now(),await vt(n,JSON.stringify(i,null,2))}async function Oe(e){let t=ae(e,".opencode","model-switcher-history.json");try{let n=await ve(t,"utf-8");return JSON.parse(n)}catch{return[]}}async function Ie(e,t){let n=ae(e,".opencode","model-switcher-history.json"),r=await Oe(e);r=[{...t,timestamp:Date.now()},...r].slice(0,Ia),await vt(n,JSON.stringify(r,null,2))}async function $e(e){let t=ae(e,".opencode","config.json"),n=await ve(t,"utf-8"),r=JSON.parse(n),i={performance:{description:"Fastest available models for quick iterations",config:{},createdAt:Date.now()},quality:{description:"Best quality models for complex tasks",config:{},createdAt:Date.now()},balanced:{description:"Optimal mix based on agent roles",config:{},createdAt:Date.now()},economy:{description:"Most cost-effective models",config:{},createdAt:Date.now()}};if(r.modelSwitcher?.presets){for(let[a,s]of Object.entries(r.modelSwitcher.presets))if(i[a]&&typeof s==="object")i[a].config=s}let o=r.modelSwitcher?.customPresets||{};return{...i,...o}}async function Ar(e,t,n){let r=ae(e,".opencode","config.json"),i=await ve(r,"utf-8"),o=JSON.parse(i);o.modelSwitcher=o.modelSwitcher||{},o.modelSwitcher.customPresets=o.modelSwitcher.customPresets||{},o.modelSwitcher.customPresets[t]=n,await vt(r,JSON.stringify(o,null,2))}var Q={"anthropic/claude-opus-4-5":{id:"anthropic/claude-opus-4-5",provider:"anthropic",displayName:"Claude Opus 4.5",tier:"flagship",capabilities:["code","thinking","vision","multimodal"],costPer1kTokens:15,maxContext:200000,recommendedFor:["Kraken","Maelstrom","Leviathan","Poseidon","Scylla"]},"anthropic/claude-sonnet-4-5":{id:"anthropic/claude-sonnet-4-5",provider:"anthropic",displayName:"Claude Sonnet 4.5",tier:"balanced",capabilities:["code","thinking","vision","multimodal"],costPer1kTokens:3,maxContext:200000,recommendedFor:["Nautilus","Abyssal","Coral","Siren","Pearl"]},"anthropic/claude-haiku-4-5":{id:"anthropic/claude-haiku-4-5",provider:"anthropic",displayName:"Claude Haiku 4.5",tier:"fast",capabilities:["code","vision"],costPer1kTokens:0.25,maxContext:200000,recommendedFor:["Nautilus","Pearl"]},"openai/gpt-4o":{id:"openai/gpt-4o",provider:"openai",displayName:"GPT-4o",tier:"flagship",capabilities:["code","vision","multimodal"],costPer1kTokens:5,maxContext:128000,recommendedFor:["Abyssal","Coral"]},"openai/gpt-4o-mini":{id:"openai/gpt-4o-mini",provider:"openai",displayName:"GPT-4o Mini",tier:"fast",capabilities:["code","vision"],costPer1kTokens:0.15,maxContext:128000,recommendedFor:["Nautilus","Siren"]},"google/antigravity-gemini-3-flash":{id:"google/antigravity-gemini-3-flash",provider:"google",displayName:"Gemini 3 Flash",tier:"fast",capabilities:["code","vision","multimodal"],costPer1kTokens:0.075,maxContext:1048576,recommendedFor:["Nautilus","Pearl"]},"google/antigravity-gemini-3-pro":{id:"google/antigravity-gemini-3-pro",provider:"google",displayName:"Gemini 3 Pro",tier:"flagship",capabilities:["code","vision","multimodal"],costPer1kTokens:1.5,maxContext:1048576,recommendedFor:["Kraken","Maelstrom","Leviathan"]},"google/antigravity-claude-opus-4-5-thinking":{id:"google/antigravity-claude-opus-4-5-thinking",provider:"google",displayName:"Claude Opus 4.5 (Antigravity)",tier:"flagship",capabilities:["code","thinking","vision","multimodal"],costPer1kTokens:10,maxContext:200000,recommendedFor:["Kraken","Maelstrom","Leviathan","Poseidon","Scylla"]},"google/antigravity-claude-sonnet-4-5-thinking":{id:"google/antigravity-claude-sonnet-4-5-thinking",provider:"google",displayName:"Claude Sonnet 4.5 (Antigravity)",tier:"balanced",capabilities:["code","thinking","vision","multimodal"],costPer1kTokens:3,maxContext:200000,recommendedFor:["Nautilus","Abyssal","Coral","Siren","Pearl"]}};function Fe(e){return Object.values(Q).filter((t)=>t.provider===e).sort((t,n)=>{let r={flagship:0,balanced:1,fast:2};return r[t.tier]-r[n.tier]})}function Le(e){return Q[e]?.displayName||e}function kt(e){return e in Q}function _a(){return process.cwd()}var Cr=$a({description:"Intelligent agent and subagent model manager with presets and history",args:{action:le.enum(["set","set-all","preset","status","available","create-preset","list-presets","history","rollback","costs","validate"]),agent:le.string().optional(),model:le.string().optional(),preset:le.string().optional(),presetName:le.string().optional(),historyIndex:le.number().optional()},async execute(e){let t=_a();switch(e.action){case"set":return await ja(e.agent,e.model,t),JSON.stringify({success:!0,message:`${e.agent} updated`});case"set-all":return await Wa(e.model,t),JSON.stringify({success:!0,message:"All agents updated"});case"preset":return await Pr(e.preset,t),JSON.stringify({success:!0,message:`Preset '${e.preset}' applied`});case"status":return JSON.stringify(await Ua(t),null,2);case"available":return JSON.stringify(Ba(),null,2);case"create-preset":return await Ha(e.presetName,t),JSON.stringify({success:!0,message:`Preset '${e.presetName}' created`});case"list-presets":return JSON.stringify(await Ja(t),null,2);case"history":return JSON.stringify(await Ka(t),null,2);case"rollback":return await Va(e.historyIndex,t),JSON.stringify({success:!0,message:"Configuration restored"});case"costs":return JSON.stringify({message:"Cost tracking is disabled. Enable in config to use this feature.",enabled:!1},null,2);case"validate":return JSON.stringify(Ga(t),null,2)}}});async function ja(e,t,n){if(!kt(t))throw Error(`Model '${t}' not found. Use /models available to list options.`);let r=await ce(n);if(!r[e]){let i=Object.keys(r).join(", ");throw Error(`Agent '${e}' not found. Valid agents: ${i}`)}await ke(n,{[e]:{model:t}}),await Ie(n,{type:"agent",agent:e,model:t})}async function Wa(e,t){if(!kt(e))throw Error(`Model '${e}' not found. Use /models available to list options.`);let n=await ce(t),r={};for(let i of Object.keys(n))r[i]={model:e};await ke(t,r),await Ie(t,{type:"all",model:e})}async function Pr(e,t){let n=await $e(t),r=n[e];if(!r){let i=Object.keys(n).join(", ");throw Error(`Preset '${e}' not found. Available: ${i}`)}await ke(t,r.config),await Ie(t,{type:"preset",name:e})}async function Ha(e,t){let n=await ce(t);await Ar(t,e,{description:`Custom preset: ${e}`,config:n,createdAt:Date.now()})}async function Ua(e){let t=await ce(e),n=await $e(e),r=La(e,".opencode","config.json"),i=JSON.parse(await Fa(r,"utf-8")),o=Object.entries(t).map(([s,c])=>({agent:s,model:c.model,provider:Q[c.model]?.provider||"unknown",displayName:Le(c.model),enabled:c.enabled!==!1})),a=Object.keys(n).filter((s)=>["performance","quality","balanced","economy"].includes(s));return{agents:o,builtInPresets:a,customPresets:Object.keys(n).filter((s)=>!["performance","quality","balanced","economy"].includes(s)),setupComplete:i.modelSwitcher?.setupComplete||!1,totalAgents:o.length}}function Ba(){let e=Object.values(Q).map((n)=>({id:n.id,displayName:n.displayName,provider:n.provider,tier:n.tier,costPer1kTokens:n.costPer1kTokens,maxContext:n.maxContext,capabilities:n.capabilities})),t={anthropic:Fe("anthropic"),openai:Fe("openai"),google:Fe("google")};return{models:e,byProvider:t}}async function Ja(e){let t=await $e(e),n={};for(let[r,i]of Object.entries(t))n[r]={description:i.description,agentCount:Object.keys(i.config).length,createdAt:i.createdAt};return{presets:n}}async function Ka(e){let n=(await Oe(e)).map((r,i)=>({index:i,timestamp:new Date(r.timestamp).toISOString(),type:r.type,description:qa(r)}));return{history:n,total:n.length}}function qa(e){if(e.type==="preset")return`Preset: ${e.name}`;else if(e.type==="all")return`All → ${Le(e.model)}`;else return`${e.agent} → ${Le(e.model)}`}async function Va(e,t){let n=await Oe(t),r=n[e];if(!r||!r.model)throw Error(`History entry ${e} not found or invalid. Total entries: ${n.length}`);if(r.type==="preset"){if(typeof r.name==="string")await Pr(r.name,t)}else{let i=await ce(t),o=r.type==="all"?void 0:r.agent,a=r.model,s=o?{[o]:{model:a}}:Object.fromEntries(Object.keys(i).map((c)=>[c,{model:a}]));await ke(t,s)}}function Ga(e){return{valid:!0,message:"Configuration is valid",modelCount:Object.keys(Q).length}}import*as O from"fs";import*as je from"path";import*as Or from"os";import*as St from"path";import*as Er from"os";var za=St.join(Er.homedir(),".kraken"),Np=St.join(za,"todos");import*as At from"path";import*as Rr from"os";var Ya=At.join(Rr.homedir(),".kraken"),Ip=At.join(Ya,"transcripts");import{promises as Tr}from"fs";import{join as Ct,dirname as Xa}from"path";import*as Mr from"os";var Qa="utf-8";function Za(e,t){if(t)return Ct(t,`${e}.jsonl`);let n=Ct(Mr.homedir(),".claude","transcripts");return Ct(n,`${e}.jsonl`)}async function Pt(e,t,n){let r=Za(e,n);try{await Tr.mkdir(Xa(r),{recursive:!0});let i={...t,timestamp:t.timestamp||Date.now()},o=JSON.stringify(i)+`
|
|
1994
|
+
`)[0]?.trim()??null}catch{}return null}async function Oa(e){let t=vr.resolve(__dirname,"..","compression");try{let n=await Na();if(!n)return{success:!1,error:process.platform==="win32"?"Python not found. Install from https://www.python.org/downloads/windows/":"Python not found. Install from https://www.python.org/downloads/"};let{stdout:r,stderr:i}=await Da(n,[vr.join(t,"cli.py"),"compress",e],{cwd:t,maxBuffer:10485760,timeout:30000});if(i&&!r)throw Error(i);let o=JSON.parse(r);if(o.error)throw Error(o.error);return{success:!0,compressed:o.decompressed_text,metadata:{originalTokens:o.metadata.original_tokens,decompressedTokens:o.metadata.decompressed_tokens,tokenChangePercent:o.metadata.token_change_percent}}}catch(n){return{success:!1,error:n instanceof Error?n.message:"Unknown error"}}}var Sr=Ra({description:"Compress prompts using LLM-TLDR algorithm (5× compression, <2% quality loss). "+"Uses dictionary-based compression with CRC64 caching for repeated prompts. Optimized for cost reduction on API calls while maintaining output quality.",args:{text:wr.string().describe("Text to compress"),level:wr.enum(["cache_hit","partial","full"]).default("partial").describe("Compression level: cache_hit (return cached if available), partial (light compression), full (maximum compression)")},async execute(e){let{text:t,level:n}=e;if(!t||t.trim().length===0)return JSON.stringify({success:!1,error:"Empty text provided"});if(n==="cache_hit")return JSON.stringify({success:!0,note:"Cache lookup not implemented in TS wrapper, using full compression",compressed:t});let r=await Oa(t);return JSON.stringify(r,null,2)}});import{tool as $a}from"@opencode-ai/plugin";import{z as le}from"zod";import{readFile as Fa}from"fs/promises";import{join as La}from"path";import{readFile as ve,writeFile as vt}from"fs/promises";import{join as ae}from"path";var Ia=5;async function ce(e){let t=ae(e,".opencode","config.json"),n=await ve(t,"utf-8");return JSON.parse(n).agents||{}}async function ke(e,t){let n=ae(e,".opencode","config.json"),r=await ve(n,"utf-8"),i=JSON.parse(r);i.agents={...i.agents,...t},i.modelSwitcher=i.modelSwitcher||{},i.modelSwitcher.lastUpdated=Date.now(),await vt(n,JSON.stringify(i,null,2))}async function Oe(e){let t=ae(e,".opencode","model-switcher-history.json");try{let n=await ve(t,"utf-8");return JSON.parse(n)}catch{return[]}}async function Ie(e,t){let n=ae(e,".opencode","model-switcher-history.json"),r=await Oe(e);r=[{...t,timestamp:Date.now()},...r].slice(0,Ia),await vt(n,JSON.stringify(r,null,2))}async function $e(e){let t=ae(e,".opencode","config.json"),n=await ve(t,"utf-8"),r=JSON.parse(n),i={performance:{description:"Fastest available models for quick iterations",config:{},createdAt:Date.now()},quality:{description:"Best quality models for complex tasks",config:{},createdAt:Date.now()},balanced:{description:"Optimal mix based on agent roles",config:{},createdAt:Date.now()},economy:{description:"Most cost-effective models",config:{},createdAt:Date.now()}};if(r.modelSwitcher?.presets){for(let[a,s]of Object.entries(r.modelSwitcher.presets))if(i[a]&&typeof s==="object")i[a].config=s}let o=r.modelSwitcher?.customPresets||{};return{...i,...o}}async function Ar(e,t,n){let r=ae(e,".opencode","config.json"),i=await ve(r,"utf-8"),o=JSON.parse(i);o.modelSwitcher=o.modelSwitcher||{},o.modelSwitcher.customPresets=o.modelSwitcher.customPresets||{},o.modelSwitcher.customPresets[t]=n,await vt(r,JSON.stringify(o,null,2))}var Q={"anthropic/claude-opus-4-5":{id:"anthropic/claude-opus-4-5",provider:"anthropic",displayName:"Claude Opus 4.5",tier:"flagship",capabilities:["code","thinking","vision","multimodal"],costPer1kTokens:15,maxContext:200000,recommendedFor:["Kraken","Cartographer","Maelstrom","Leviathan","Poseidon","Scylla"]},"anthropic/claude-sonnet-4-5":{id:"anthropic/claude-sonnet-4-5",provider:"anthropic",displayName:"Claude Sonnet 4.5",tier:"balanced",capabilities:["code","thinking","vision","multimodal"],costPer1kTokens:3,maxContext:200000,recommendedFor:["Nautilus","Abyssal","Coral","Siren","Pearl"]},"anthropic/claude-haiku-4-5":{id:"anthropic/claude-haiku-4-5",provider:"anthropic",displayName:"Claude Haiku 4.5",tier:"fast",capabilities:["code","vision"],costPer1kTokens:0.25,maxContext:200000,recommendedFor:["Nautilus","Pearl"]},"openai/gpt-4o":{id:"openai/gpt-4o",provider:"openai",displayName:"GPT-4o",tier:"flagship",capabilities:["code","vision","multimodal"],costPer1kTokens:5,maxContext:128000,recommendedFor:["Abyssal","Coral"]},"openai/gpt-4o-mini":{id:"openai/gpt-4o-mini",provider:"openai",displayName:"GPT-4o Mini",tier:"fast",capabilities:["code","vision"],costPer1kTokens:0.15,maxContext:128000,recommendedFor:["Nautilus","Siren"]},"google/antigravity-gemini-3-flash":{id:"google/antigravity-gemini-3-flash",provider:"google",displayName:"Gemini 3 Flash",tier:"fast",capabilities:["code","vision","multimodal"],costPer1kTokens:0.075,maxContext:1048576,recommendedFor:["Nautilus","Pearl"]},"google/antigravity-gemini-3-pro":{id:"google/antigravity-gemini-3-pro",provider:"google",displayName:"Gemini 3 Pro",tier:"flagship",capabilities:["code","vision","multimodal"],costPer1kTokens:1.5,maxContext:1048576,recommendedFor:["Kraken","Cartographer","Maelstrom","Leviathan"]},"google/antigravity-claude-opus-4-5-thinking":{id:"google/antigravity-claude-opus-4-5-thinking",provider:"google",displayName:"Claude Opus 4.5 (Antigravity)",tier:"flagship",capabilities:["code","thinking","vision","multimodal"],costPer1kTokens:10,maxContext:200000,recommendedFor:["Kraken","Cartographer","Maelstrom","Leviathan","Poseidon","Scylla"]},"google/antigravity-claude-sonnet-4-5-thinking":{id:"google/antigravity-claude-sonnet-4-5-thinking",provider:"google",displayName:"Claude Sonnet 4.5 (Antigravity)",tier:"balanced",capabilities:["code","thinking","vision","multimodal"],costPer1kTokens:3,maxContext:200000,recommendedFor:["Nautilus","Abyssal","Coral","Siren","Pearl"]}};function Fe(e){return Object.values(Q).filter((t)=>t.provider===e).sort((t,n)=>{let r={flagship:0,balanced:1,fast:2};return r[t.tier]-r[n.tier]})}function Le(e){return Q[e]?.displayName||e}function kt(e){return e in Q}function _a(){return process.cwd()}var Cr=$a({description:"Intelligent agent and subagent model manager with presets and history",args:{action:le.enum(["set","set-all","preset","status","available","create-preset","list-presets","history","rollback","costs","validate"]),agent:le.string().optional(),model:le.string().optional(),preset:le.string().optional(),presetName:le.string().optional(),historyIndex:le.number().optional()},async execute(e){let t=_a();switch(e.action){case"set":return await ja(e.agent,e.model,t),JSON.stringify({success:!0,message:`${e.agent} updated`});case"set-all":return await Wa(e.model,t),JSON.stringify({success:!0,message:"All agents updated"});case"preset":return await Pr(e.preset,t),JSON.stringify({success:!0,message:`Preset '${e.preset}' applied`});case"status":return JSON.stringify(await Ua(t),null,2);case"available":return JSON.stringify(Ba(),null,2);case"create-preset":return await Ha(e.presetName,t),JSON.stringify({success:!0,message:`Preset '${e.presetName}' created`});case"list-presets":return JSON.stringify(await Ja(t),null,2);case"history":return JSON.stringify(await Ka(t),null,2);case"rollback":return await Va(e.historyIndex,t),JSON.stringify({success:!0,message:"Configuration restored"});case"costs":return JSON.stringify({message:"Cost tracking is disabled. Enable in config to use this feature.",enabled:!1},null,2);case"validate":return JSON.stringify(Ga(t),null,2)}}});async function ja(e,t,n){if(!kt(t))throw Error(`Model '${t}' not found. Use /models available to list options.`);let r=await ce(n);if(!r[e]){let i=Object.keys(r).join(", ");throw Error(`Agent '${e}' not found. Valid agents: ${i}`)}await ke(n,{[e]:{model:t}}),await Ie(n,{type:"agent",agent:e,model:t})}async function Wa(e,t){if(!kt(e))throw Error(`Model '${e}' not found. Use /models available to list options.`);let n=await ce(t),r={};for(let i of Object.keys(n))r[i]={model:e};await ke(t,r),await Ie(t,{type:"all",model:e})}async function Pr(e,t){let n=await $e(t),r=n[e];if(!r){let i=Object.keys(n).join(", ");throw Error(`Preset '${e}' not found. Available: ${i}`)}await ke(t,r.config),await Ie(t,{type:"preset",name:e})}async function Ha(e,t){let n=await ce(t);await Ar(t,e,{description:`Custom preset: ${e}`,config:n,createdAt:Date.now()})}async function Ua(e){let t=await ce(e),n=await $e(e),r=La(e,".opencode","config.json"),i=JSON.parse(await Fa(r,"utf-8")),o=Object.entries(t).map(([s,c])=>({agent:s,model:c.model,provider:Q[c.model]?.provider||"unknown",displayName:Le(c.model),enabled:c.enabled!==!1})),a=Object.keys(n).filter((s)=>["performance","quality","balanced","economy"].includes(s));return{agents:o,builtInPresets:a,customPresets:Object.keys(n).filter((s)=>!["performance","quality","balanced","economy"].includes(s)),setupComplete:i.modelSwitcher?.setupComplete||!1,totalAgents:o.length}}function Ba(){let e=Object.values(Q).map((n)=>({id:n.id,displayName:n.displayName,provider:n.provider,tier:n.tier,costPer1kTokens:n.costPer1kTokens,maxContext:n.maxContext,capabilities:n.capabilities})),t={anthropic:Fe("anthropic"),openai:Fe("openai"),google:Fe("google")};return{models:e,byProvider:t}}async function Ja(e){let t=await $e(e),n={};for(let[r,i]of Object.entries(t))n[r]={description:i.description,agentCount:Object.keys(i.config).length,createdAt:i.createdAt};return{presets:n}}async function Ka(e){let n=(await Oe(e)).map((r,i)=>({index:i,timestamp:new Date(r.timestamp).toISOString(),type:r.type,description:qa(r)}));return{history:n,total:n.length}}function qa(e){if(e.type==="preset")return`Preset: ${e.name}`;else if(e.type==="all")return`All → ${Le(e.model)}`;else return`${e.agent} → ${Le(e.model)}`}async function Va(e,t){let n=await Oe(t),r=n[e];if(!r||!r.model)throw Error(`History entry ${e} not found or invalid. Total entries: ${n.length}`);if(r.type==="preset"){if(typeof r.name==="string")await Pr(r.name,t)}else{let i=await ce(t),o=r.type==="all"?void 0:r.agent,a=r.model,s=o?{[o]:{model:a}}:Object.fromEntries(Object.keys(i).map((c)=>[c,{model:a}]));await ke(t,s)}}function Ga(e){return{valid:!0,message:"Configuration is valid",modelCount:Object.keys(Q).length}}import*as O from"fs";import*as je from"path";import*as Or from"os";import*as St from"path";import*as Er from"os";var za=St.join(Er.homedir(),".kraken"),Np=St.join(za,"todos");import*as At from"path";import*as Rr from"os";var Ya=At.join(Rr.homedir(),".kraken"),Ip=At.join(Ya,"transcripts");import{promises as Tr}from"fs";import{join as Ct,dirname as Xa}from"path";import*as Mr from"os";var Qa="utf-8";function Za(e,t){if(t)return Ct(t,`${e}.jsonl`);let n=Ct(Mr.homedir(),".claude","transcripts");return Ct(n,`${e}.jsonl`)}async function Pt(e,t,n){let r=Za(e,n);try{await Tr.mkdir(Xa(r),{recursive:!0});let i={...t,timestamp:t.timestamp||Date.now()},o=JSON.stringify(i)+`
|
|
1995
1995
|
`;await Tr.appendFile(r,o,Qa)}catch(i){console.error("[transcript-manager] Error appending transcript entry:",i)}}async function _e(e,t,n,r,i){let o={role:"assistant",content:"",timestamp:Date.now(),toolName:t,toolInput:n,toolOutput:r};await Pt(e,o,i)}async function Dr(e,t,n){let r={role:"user",content:t,timestamp:Date.now()};await Pt(e,r,n)}async function Nr(e,t,n){let r={role:"assistant",content:t,timestamp:Date.now()};await Pt(e,r,n)}var Et=je.join(Or.homedir(),".opencode","kraken-code"),Rt=je.join(Et,"sessions");function Ir(e){return je.join(Rt,`${e}.json`)}function $r(){if(!O.existsSync(Et))O.mkdirSync(Et,{recursive:!0});if(!O.existsSync(Rt))O.mkdirSync(Rt,{recursive:!0})}function Fr(e){try{$r();let t=Ir(e);if(!O.existsSync(t))return null;let n=O.readFileSync(t,"utf-8");return JSON.parse(n)}catch(t){return console.error(`[storage] Error reading state for session ${e}:`,t),null}}function Tt(e,t){try{$r();let n=Ir(e);O.writeFileSync(n,JSON.stringify(t,null,2))}catch(n){console.error(`[storage] Error writing state for session ${e}:`,n)}}var ec=`You are Ralph, a specialized iteration agent focused on achieving completion promises.
|
|
1996
1996
|
|
|
1997
1997
|
Your methodology:
|
|
@@ -2096,4 +2096,4 @@ ${g}`)}},"tool.execute.after":async(e,t)=>{if(e.tool==="todowrite"){let i=t?.tod
|
|
|
2096
2096
|
`);for(let o of i){let a=o.indexOf(":");if(a===-1)continue;let s=o.slice(0,a).trim(),c=o.slice(a+1).trim();if(s==="true")r[s]=!0;else if(s==="false")r[s]=!1;else if(!isNaN(Number(c)))r[s]=Number(c);else r[s]=c}return r}async function fe(e,t,n=new Set,r=""){let i=[];if(!Te.existsSync(e))return i;let o=X.resolve(e);if(n.has(o))return i;n.add(o);try{let a=await Te.promises.readdir(e,{withFileTypes:!0});for(let s of a){let c=X.join(e,s.name);if(s.isDirectory()){let l=r?`${r}:${s.name}`:s.name,u=await fe(c,t,n,l);i.push(...u)}else if(s.isFile()&&s.name.endsWith(".md"))try{let l=await Te.promises.readFile(c,"utf-8"),u=Gd(l),p=l.replace(ws,"").trim(),g=s.name.slice(0,-3),m=r?`${r}:${g}`:g;i.push({name:m,path:c,definition:{name:m,description:u.description||"",template:p,agent:u.agent,model:u.model,subtask:u.subtask,argumentHint:u.argumentHint},scope:t,prefix:r})}catch(l){console.error(`[command-loader] Error loading command from ${c}:`,l)}}}catch(a){console.error(`[command-loader] Error reading commands directory ${e}:`,a)}return i}function vs(){let e=xs.homedir();return{user:X.join(e,".config","opencode","commands"),project:X.join(process.cwd(),".claude","commands"),opencodeGlobal:X.join(e,".config","opencode","commands"),opencodeProject:X.join(process.cwd(),".opencode","commands")}}var ks=["builtin","user","opencode","opencode-project","project","skill"],Ss=process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1"||process.env.KRAKEN_LOG==="1",As=k("command-loader");class Nn{commands=new Map;options;constructor(e={}){this.options=e}async loadAll(){let e=vs(),t=[];if(!this.isScopeDisabled("user")){let i=this.options.userCommandsDir||e.user;t.push(fe(i,"user"))}if(!this.isScopeDisabled("project")){let i=this.options.projectCommandsDir||e.project;t.push(fe(i,"project"))}if(!this.isScopeDisabled("opencode")){let i=this.options.opencodeGlobalCommandsDir||e.opencodeGlobal;t.push(fe(i,"opencode"))}if(!this.isScopeDisabled("opencode-project")){let i=this.options.opencodeProjectCommandsDir||e.opencodeProject;t.push(fe(i,"opencode-project"))}let n=await Promise.all(t),r=n.flat();for(let i of r)this.registerCommand(i);if(Ss)As.debug(`Loaded ${this.commands.size} commands from ${n.length} sources`);return this.commands}registerCommand(e){let t=this.commands.get(e.name);if(t){let n=ks.indexOf(e.scope),r=ks.indexOf(t.scope);if(n>r){if(this.commands.set(e.name,e),Ss)As.debug(`Overriding ${e.name} from ${t.scope} with ${e.scope}`)}}else this.commands.set(e.name,e)}getCommand(e){return this.commands.get(e)}listCommands(){return Array.from(this.commands.values())}clear(){this.commands.clear()}isScopeDisabled(e){return this.options.disabledScopes?.includes(e)||!1}}var ot=null;async function Cs(){if(!ot)ot=new Nn,await ot.loadAll();return ot}import{spawn as Ps}from"child_process";import{existsSync as Es}from"node:fs";import zd from"node:path";var Yd=300000,st=3,j=process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1"||process.env.KRAKEN_LOG==="1",W=k("skill-mcp-manager");class On{clients=new Map;pendingConnections=new Map;idleTimeout;maxConnections;cleanupInterval=null;constructor(e={}){this.idleTimeout=e.idleTimeout||Yd,this.maxConnections=e.maxConnections||10,this.startCleanupInterval(),this.setupProcessCleanup()}async initialize(){if(j)W.debug("Manager initialized")}getClientKey(e){return`${e.skillName}:${e.mcpName}:${e.sessionID}`}processExists(e){try{return process.kill(e,0),!0}catch{return!1}}async getOrCreateClient(e,t){let n=this.getClientKey(e),r=this.pendingConnections.get(n);if(r)return r.promise;let i=this.clients.get(n);if(i&&this.isClientHealthy(i))return i.lastUsed=Date.now(),i.client;let o=new Promise((a,s)=>{this.createClientProcess(e,t).then((c)=>{this.clients.set(n,{client:c,process:c.process,lastUsed:Date.now(),pendingRequests:0}),a(c)}).catch((c)=>{s(c)})});this.pendingConnections.set(n,{promise:o,resolve:o,reject:o});try{return await o}finally{this.pendingConnections.delete(n)}}async createClientProcess(e,t){let{command:n,args:r,env:i={}}=t;if(j)W.debug(`Starting MCP process for ${e.skillName}:${e.mcpName}`);let o=await this.resolveCommand(n);if(!o)throw Error(`MCP command '${n}' not found. Install it and ensure it is on your PATH.`);return new Promise((a,s)=>{let c=0,l=null,u=()=>{l=Ps(o,r,{env:{...process.env,...i},stdio:["pipe","pipe","pipe"]});let p=null,g=0,m=new Map,f=(b,y)=>{let C=++g,D={jsonrpc:"2.0",id:C,method:b,params:y};if(l?.stdin)l.stdin.write(JSON.stringify(D)+`
|
|
2097
2097
|
`);return new Promise(($,N)=>{m.set(C,{resolve:$,reject:N}),setTimeout(()=>{m.delete(C),N(Error(`Request ${b} timeout`))},30000)})};if(p={listTools:async()=>{return(await f("tools/list",{})).result?.tools||[]},listResources:async()=>{return(await f("resources/list",{})).result?.resources||[]},listPrompts:async()=>{return(await f("prompts/list",{})).result?.prompts||[]},callTool:async(b,y)=>{return(await f("tools/call",{name:b,arguments:y})).result},readResource:async(b)=>{return(await f("resources/read",{uri:b})).result},getPrompt:async(b,y)=>{return(await f("prompts/get",{name:b,arguments:y||{}})).result},close:async()=>{if(l)l.kill()}},l.stdout){let b=(y)=>{let C=y.toString().split(`
|
|
2098
2098
|
`);for(let D of C){if(!D.trim())continue;try{let $=JSON.parse(D),{id:N,result:Me,error:he}=$;if(N!==void 0&&m.has(N)){let ye=m.get(N);if(m.delete(N),he)ye.reject(Error(he.message));else ye.resolve(Me)}}catch($){if(j)W.warn("Failed to parse response:",$)}}};l.stdout.on("data",b),l.on("error",(y)=>{if(j)W.warn(`MCP process error for ${e.skillName}:${e.mcpName}:`,y);if(y?.code==="ENOENT"){s(Error(`MCP command '${n}' not found.`));return}if(c<st){if(c++,j)W.debug(`Retrying connection (${c}/${st})`);setTimeout(u,1000*c)}else s(y)}),l.on("exit",(y,C)=>{if(j)W.debug(`MCP process exited for ${e.skillName}:${e.mcpName} with code ${y}, signal ${C}`);if(c<st&&y!==0){if(c++,j)W.debug(`Retrying connection (${c}/${st})`);setTimeout(u,1000*c)}else if(p&&y===0)a(p)}),setTimeout(async()=>{try{await f("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"kraken-code",version:"5.0.0"}}),await f("notifications/initialized",{}),a(p)}catch(y){s(y)}},500)}};u()})}async resolveCommand(e){if(zd.isAbsolute(e)&&Es(e))return e;if(e.includes("/")||e.includes("\\"))return Es(e)?e:null;let t=process.platform==="win32"?"where":"which";try{let n=Ps(t,[e],{stdio:["ignore","pipe","pipe"]}),r=await this.readStream(n.stdout);if(await new Promise((i)=>{n.on("close",()=>i())}),n.exitCode===0)return r.trim().split(`
|
|
2099
|
-
`)[0]?.trim()??null}catch{return null}return null}readStream(e){if(!e)return Promise.resolve("");return new Promise((t)=>{let n="";e.on("data",(r)=>{n+=r.toString()}),e.on("end",()=>t(n)),e.on("error",()=>t(n))})}isClientHealthy(e){let t=e.process;if(!t||!t.pid)return!1;return this.processExists(t.pid)}async listTools(e,t){return(await this.getOrCreateClient(e,t)).listTools()}async listResources(e,t){return(await this.getOrCreateClient(e,t)).listResources()}async listPrompts(e,t){return(await this.getOrCreateClient(e,t)).listPrompts()}async callTool(e,t,n,r){return(await this.getOrCreateClient(e,t)).callTool(n,r)}async readResource(e,t,n){return(await this.getOrCreateClient(e,t)).readResource(n)}async getPrompt(e,t,n,r){return(await this.getOrCreateClient(e,t)).getPrompt(n,r)}async disconnectSession(e){let t=[];for(let[n,r]of this.clients.entries())if(n.includes(`:${e}`))await r.client.close(),t.push(n);for(let n of t)this.clients.delete(n);if(j)W.debug(`Disconnected ${t.length} clients for session ${e}`)}async disconnectAll(){let e=[];for(let t of this.clients.values())e.push(t.client.close());if(await Promise.all(e),this.clients.clear(),j)W.debug("Disconnected all clients")}getConnectedServers(){let e=new Set;for(let t of this.clients.keys()){let n=t.split(":");if(n.length>=2)e.add(`${n[0]}:${n[1]}`)}return Array.from(e)}isConnected(e){let t=this.getClientKey(e),n=this.clients.get(t);if(!n)return!1;return this.isClientHealthy(n)}startCleanupInterval(){this.cleanupInterval=setInterval(()=>{this.cleanupIdleClients()},60000)}cleanupIdleClients(){let e=Date.now(),t=[];for(let[n,r]of this.clients.entries())if(e-r.lastUsed>this.idleTimeout)t.push(n);if(t.length>0){if(j)W.debug(`Cleaning up ${t.length} idle clients`);for(let n of t)this.clients.get(n).client.close(),this.clients.delete(n)}}setupProcessCleanup(){let e=async(t)=>{if(j)W.debug(`Received ${t}, cleaning up...`);if(await this.disconnectAll(),this.cleanupInterval)clearInterval(this.cleanupInterval);process.exit(0)};process.on("SIGINT",e),process.on("SIGTERM",e)}}var at=null;async function Rs(){if(!at)at=new On,await at.initialize();return at}function Xd(){return{Kraken:lt,Atlas:dt,Nautilus:ut,Abyssal:pt,Coral:gt,Siren:mt,Scylla:ft,Pearl:ht,Maelstrom:xt,Leviathan:bt,Poseidon:yt,Cartographer:wt}}function Qd(...e){let t={},n=[];for(let r of e){if(r.config)n.push(r.config);for(let[i,o]of Object.entries(r))if(i!=="config")if(i==="tool"&&typeof o==="object"&&o!==null)if(!t[i]||typeof t[i]!=="object")t[i]=o;else t[i]={...t[i],...o};else t[i]=o}if(n.length>0)t.config=async(r)=>{for(let i of n)await i(r)};return t}var Zd={ast_grep_search:Vr,ast_grep_replace:Gr,grep:Zr,session_list:$t,session_read:Ft,session_search:Lt,session_info:jt,"kraken-compress":Sr,"model-switcher":Cr,"ralph-loop":ei,lsp_hover:Wi,lsp_goto_definition:Hi,lsp_find_references:Ui,lsp_document_symbols:Bi,lsp_workspace_symbols:Ji,lsp_diagnostics:Ki,lsp_prepare_rename:qi,lsp_rename:Vi,lsp_code_actions:Gi,lsp_code_action_resolve:zi,lsp_servers:Yi,"call-kraken-agent":ni,websearch:Qe,webfetch:Ze,"context7-search":tt,"context7-get":nt,"grep-search":rt,"grep-get-file":it,learning_add_experience:wi,learning_search_experiences:vi,learning_add_knowledge_node:ki,learning_search_knowledge_nodes:Si,learning_link_knowledge_nodes:Ai,learning_record_pattern:Ci,learning_list_patterns:Pi,learning_get_review_queue:Ei,learning_review_node:Ri,learning_create_state_machine:Ti,learning_list_state_machines:Mi},eu=async(e)=>{let t=k("plugin-main"),n=[],r=eo(e,{autoActivate:!0});Object.assign(n,r);let i=Vn(),o=Qt(e,{config:{enabled:i?.enabled??!0,recordTodos:!0,recordTranscripts:!0}});Object.assign(n,o);let a=to(e,{config:i});Object.assign(n,a),n.push({tool:Zd}),n.push({config:async(s)=>{if(!s.agent)s.agent={};let c=Xd();for(let[
|
|
2099
|
+
`)[0]?.trim()??null}catch{return null}return null}readStream(e){if(!e)return Promise.resolve("");return new Promise((t)=>{let n="";e.on("data",(r)=>{n+=r.toString()}),e.on("end",()=>t(n)),e.on("error",()=>t(n))})}isClientHealthy(e){let t=e.process;if(!t||!t.pid)return!1;return this.processExists(t.pid)}async listTools(e,t){return(await this.getOrCreateClient(e,t)).listTools()}async listResources(e,t){return(await this.getOrCreateClient(e,t)).listResources()}async listPrompts(e,t){return(await this.getOrCreateClient(e,t)).listPrompts()}async callTool(e,t,n,r){return(await this.getOrCreateClient(e,t)).callTool(n,r)}async readResource(e,t,n){return(await this.getOrCreateClient(e,t)).readResource(n)}async getPrompt(e,t,n,r){return(await this.getOrCreateClient(e,t)).getPrompt(n,r)}async disconnectSession(e){let t=[];for(let[n,r]of this.clients.entries())if(n.includes(`:${e}`))await r.client.close(),t.push(n);for(let n of t)this.clients.delete(n);if(j)W.debug(`Disconnected ${t.length} clients for session ${e}`)}async disconnectAll(){let e=[];for(let t of this.clients.values())e.push(t.client.close());if(await Promise.all(e),this.clients.clear(),j)W.debug("Disconnected all clients")}getConnectedServers(){let e=new Set;for(let t of this.clients.keys()){let n=t.split(":");if(n.length>=2)e.add(`${n[0]}:${n[1]}`)}return Array.from(e)}isConnected(e){let t=this.getClientKey(e),n=this.clients.get(t);if(!n)return!1;return this.isClientHealthy(n)}startCleanupInterval(){this.cleanupInterval=setInterval(()=>{this.cleanupIdleClients()},60000)}cleanupIdleClients(){let e=Date.now(),t=[];for(let[n,r]of this.clients.entries())if(e-r.lastUsed>this.idleTimeout)t.push(n);if(t.length>0){if(j)W.debug(`Cleaning up ${t.length} idle clients`);for(let n of t)this.clients.get(n).client.close(),this.clients.delete(n)}}setupProcessCleanup(){let e=async(t)=>{if(j)W.debug(`Received ${t}, cleaning up...`);if(await this.disconnectAll(),this.cleanupInterval)clearInterval(this.cleanupInterval);process.exit(0)};process.on("SIGINT",e),process.on("SIGTERM",e)}}var at=null;async function Rs(){if(!at)at=new On,await at.initialize();return at}function Xd(){return{Kraken:lt,Atlas:dt,Nautilus:ut,Abyssal:pt,Coral:gt,Siren:mt,Scylla:ft,Pearl:ht,Maelstrom:xt,Leviathan:bt,Poseidon:yt,Cartographer:wt}}function Qd(...e){let t={},n=[];for(let r of e){if(r.config)n.push(r.config);for(let[i,o]of Object.entries(r))if(i!=="config")if(i==="tool"&&typeof o==="object"&&o!==null)if(!t[i]||typeof t[i]!=="object")t[i]=o;else t[i]={...t[i],...o};else t[i]=o}if(n.length>0)t.config=async(r)=>{for(let i of n)await i(r)};return t}var Zd={ast_grep_search:Vr,ast_grep_replace:Gr,grep:Zr,session_list:$t,session_read:Ft,session_search:Lt,session_info:jt,"kraken-compress":Sr,"model-switcher":Cr,"ralph-loop":ei,lsp_hover:Wi,lsp_goto_definition:Hi,lsp_find_references:Ui,lsp_document_symbols:Bi,lsp_workspace_symbols:Ji,lsp_diagnostics:Ki,lsp_prepare_rename:qi,lsp_rename:Vi,lsp_code_actions:Gi,lsp_code_action_resolve:zi,lsp_servers:Yi,"call-kraken-agent":ni,websearch:Qe,webfetch:Ze,"context7-search":tt,"context7-get":nt,"grep-search":rt,"grep-get-file":it,learning_add_experience:wi,learning_search_experiences:vi,learning_add_knowledge_node:ki,learning_search_knowledge_nodes:Si,learning_link_knowledge_nodes:Ai,learning_record_pattern:Ci,learning_list_patterns:Pi,learning_get_review_queue:Ei,learning_review_node:Ri,learning_create_state_machine:Ti,learning_list_state_machines:Mi},eu=async(e)=>{let t=k("plugin-main"),n=[],r=eo(e,{autoActivate:!0});Object.assign(n,r);let i=Vn(),o=Qt(e,{config:{enabled:i?.enabled??!0,recordTodos:!0,recordTranscripts:!0}});Object.assign(n,o);let a=to(e,{config:i});Object.assign(n,a),n.push({tool:Zd}),n.push({config:async(s)=>{if(!s.agent)s.agent={};let c=Xd();for(let[u,p]of Object.entries(c))if(!s.agent[u])s.agent[u]=p;if(!s.default_agent&&s.agent.Kraken)s.default_agent="Kraken";let l=["Kraken","Cartographer"];if(!s.default_agents)s.default_agents=l;else if(Array.isArray(s.default_agents)){for(let u of l)if(!s.default_agents.includes(u))s.default_agents.push(u)}await Promise.all([(async()=>{try{await Cs(),t.debug("Command loader initialized")}catch(u){if(process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1")t.error("Error initializing command loader:",u)}})(),(async()=>{try{await Rs(),t.debug("Skill MCP manager initialized")}catch(u){if(process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1")t.error("Error initializing skill MCP manager:",u)}})(),(async()=>{try{let u=s.mcp||{};await ys(u),t.debug("MCP servers initialized")}catch(u){if(process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1")t.error("Error initializing MCP servers:",u)}})(),(async()=>{try{await Bt(),t.debug("Learning system initialized")}catch(u){if(process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1")t.error("Error initializing learning system:",u)}})()])}});try{n.push(ro(e)),n.push({tool:lo(e).tools}),n.push(po(e)),n.push(_r(e)),n.push(go(e)),n.push(mo(e)),n.push(fo(e)),n.push(ho(e)),n.push(yo(e)),n.push(Jr(e)),n.push(bo(e)),n.push(xo(e)),n.push(wo(e)),n.push(ko(e)),n.push(So(e)),n.push(Po(e)),n.push(Eo(e)),n.push(Ro(e)),n.push($o(e)),n.push(_o(e)),n.push(Bo(e)),n.push(on(e)),n.push(sn(e)),n.push(an(e)),n.push(qo()),n.push(Go()),n.push(es()),n.push(as())}catch(s){if(process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1")t.error("Error initializing hooks:",s)}return n.push({"tool.execute.after":async(s,c)=>{if(!c.output)return;let{tool:l,sessionID:u}=s;if(c.output&&c.output.toolOutput)await _e(u,l,c.output.toolInput,c.output.toolOutput);if(u&&(process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1"))console.log(`[storage-hooks] Tool ${l} completed for session ${u}`)}}),process.on("exit",async()=>{try{await bs()}catch(s){console.error("Kraken Code: Error shutting down services",s)}}),Qd(...n)},_y=eu;export{_y as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kraken-code",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "Kraken Code - Transforms OpenCode into an autonomous, high-density development environment",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -91,6 +91,7 @@
|
|
|
91
91
|
"hono": "^4.10.4",
|
|
92
92
|
"js-yaml": "^4.1.1",
|
|
93
93
|
"jsonc-parser": "^3.3.1",
|
|
94
|
+
"kraken-code": "^1.3.1",
|
|
94
95
|
"open": "^11.0.0",
|
|
95
96
|
"picocolors": "^1.1.1",
|
|
96
97
|
"picomatch": "^4.0.2",
|