kraken-code 1.5.2 → 1.5.4
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 +1 -1
- package/dist/index.js +75 -75
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import{createRequire as
|
|
2
|
-
`);if(i.test(r))return"thinking_block_order"}return null}function $t(e){return["tool_result_missing","thinking_block_order","network_timeout"].includes(e)}function Jc(e){return["network_timeout","rate_limit"].includes(e)}function Yc(e){return["auth_error"].includes(e)}function Vc(e){return{tool_result_missing:"Tool result appears to be missing or empty",thinking_block_order:"Thinking blocks are in incorrect order",thinking_disabled_violation:"Thinking block found but thinking mode is disabled",network_timeout:"Network connection timed out",rate_limit:"Rate limit exceeded",auth_error:"Authentication failed",no_error:"No error detected"}[e]}var Ur;var jt=fn(()=>{Ur={tool_result_missing:[/Tool.*returned.*empty/i,/No.*tool.*output/i,/Tool.*result.*missing/i],thinking_block_order:[/Thinking.*block.*order/i,/thinking.*blocks.*must.*come.*before/i,/Invalid.*thinking.*order/i],thinking_disabled_violation:[/Thinking.*disabled.*but.*block.*found/i,/thinking.*block.*without.*mode/i,/thinking.*tag.*without.*enabled.*mode/i],network_timeout:[/network.*timeout/i,/connection.*timed.*out/i,/ETIMEDOUT/i],rate_limit:[/rate.*limit/i,/too.*many.*requests/i,/429.*Too.*Many.*Requests/i],auth_error:[/authentication.*failed/i,/invalid.*api.*key/i,/unauthorized/i],no_error:[/no error detected/i]}});var Hr={};gn(Hr,{retryWithBackoff:()=>il,attemptRecovery:()=>nl});async function nl(e,t,n){let i=tl[e];if(!i)return console.log("[session-recovery] No recovery strategy for error type: "+e),!1;if(!await i.canRecover(t))return console.log("[session-recovery] Cannot recover from "+e),!1;if(n?.skipConfirmation)return await i.recover(t);return console.log("[session-recovery] Recovery option: "+i.description),console.log("[session-recovery] [session recovered - continuing previous task]"),await i.recover(t)}async function il(e,t=3,n=1000){let i=null;for(let r=0;r<=t;r++)try{return await e()}catch(a){if(i=a instanceof Error?a:Error(String(a)),r<t){let s=n*Math.pow(2,r);console.log("[session-recovery] Retry "+(r+1)+"/"+t+" after "+s+"ms"),await new Promise(function(o){setTimeout(o,s)})}}throw i||Error("Max retries exceeded")}var zc,Gc,Xc,Qc,Zc,el,tl;var qr=fn(()=>{zc={errorType:"tool_result_missing",canRecover:async function(e){return e.sessionID!==void 0&&e.toolOutput===void 0},recover:async function(e){return console.log("[session-recovery] Attempting to recover tool_result_missing for session "+e.sessionID),console.log("[session-recovery] [session recovered - continuing previous task]"),!0},description:"Retry of tool execution or continue with alternative approach"},Gc={errorType:"thinking_block_order",canRecover:async function(e){return e.sessionID!==void 0&&e.thinkingBlocks!==void 0},recover:async function(e){if(console.log("[session-recovery] Recovering thinking_block_order by reordering blocks"),e.thinkingBlocks){let n=(Array.isArray(e.thinkingBlocks)?e.thinkingBlocks:[e.thinkingBlocks]).reverse();return console.log("[session-recovery] Reordered "+n.length+" thinking blocks"),!0}return!1},description:"Reorder thinking blocks to correct order"},Xc={errorType:"thinking_disabled_violation",canRecover:async function(){return!0},recover:async function(){return console.log("[session-recovery] Ignoring thinking_disabled_violation - will re-enable thinking mode"),!0},description:"Re-enable thinking mode in next request"},Qc={errorType:"network_timeout",canRecover:async function(){return!0},recover:async function(){return console.log("[session-recovery] Network timeout detected - will retry"),!0},description:"Retry of request with exponential backoff"},Zc={errorType:"rate_limit",canRecover:async function(){return!0},recover:async function(){return console.log("[session-recovery] Rate limit hit - implementing delay"),await new Promise(function(e){setTimeout(e,5000)}),!0},description:"Wait and retry with exponential backoff"},el={errorType:"auth_error",canRecover:async function(){return!1},recover:async function(){return console.log("[session-recovery] Authentication error - cannot recover automatically"),!1},description:"User must re-authenticate manually"},tl={tool_result_missing:zc,thinking_block_order:Gc,thinking_disabled_violation:Xc,network_timeout:Qc,rate_limit:Zc,auth_error:el}});import{readFileSync as ba}from"node:fs";import{existsSync as wa}from"node:fs";import*as wn from"path";import*as Sn from"os";import{z as d}from"zod";var Kl=d.enum(["Kraken","Cartographer","Maelstrom","Nautilus","Abyssal","Coral","Siren","Leviathan","Poseidon","Scylla","Pearl"]),Jo=d.enum(["ralph-loop","think-mode","context-window-monitor","session-recovery","comment-checker","keyword-detector","auto-slash-command","directory-agents-injector","directory-readme-injector","rules-injector","preemptive-compaction","compaction-context-injector","edit-error-recovery","empty-message-sanitizer","thinking-block-validator","tool-output-truncator","grep-output-truncator","empty-task-response-detector","blitzkrieg-test-plan-enforcer","blitzkrieg-tdd-workflow","blitzkrieg-evidence-verifier","blitzkrieg-planner-constraints"]),Yo=d.enum(["init-deep"]),te=d.enum(["allow","ask","deny"]),yn=d.record(d.string(),te),Vo=d.union([yn,d.object({edit:te.optional(),bash:d.union([te,yn]).optional(),webfetch:te.optional(),doom_loop:te.optional(),external_directory:te.optional()}).passthrough()]),O=d.object({model:d.string().optional(),temperature:d.number().optional(),top_p:d.number().optional(),prompt:d.string().optional(),prompt_append:d.string().optional(),tools:d.record(d.string(),d.boolean()).optional(),disable:d.boolean().optional(),description:d.string().optional(),mode:d.enum(["subagent","primary","all"]).optional(),color:d.string().optional(),permission:Vo.optional()}),zo=d.object({Kraken:O.optional(),Cartographer:O.optional(),Maelstrom:O.optional(),Nautilus:O.optional(),Abyssal:O.optional(),Coral:O.optional(),Siren:O.optional(),Leviathan:O.optional(),Poseidon:O.optional(),Scylla:O.optional(),Pearl:O.optional()}),Go=d.object({enabled:d.boolean().default(!0),default_max_iterations:d.number().default(24),state_dir:d.string().optional()}),Xo=d.object({defaultConcurrency:d.number().optional(),providerConcurrency:d.record(d.string(),d.number()).optional(),modelConcurrency:d.record(d.string(),d.number()).optional()}),Qo=d.object({enabled:d.boolean().default(!0),model:d.string().optional(),thinkingBudget:d.number().optional()}),Zo=d.object({enabled:d.boolean().default(!0),level:d.enum(["cache_hit","partial","full"]).default("partial")}),ea=d.object({enabled:d.boolean().default(!0),testPlan:d.object({requiredBeforeImplementation:d.boolean().default(!0),minTestCases:d.number().int().min(1).default(3),requireCoverageThreshold:d.boolean().default(!0),coverageThresholdPercent:d.number().int().min(0).max(100).default(80)}),tddWorkflow:d.object({enforceWriteTestFirst:d.boolean().default(!0),forbidCodeWithoutTest:d.boolean().default(!0),allowRefactorWithoutTest:d.boolean().default(!0)}),evidence:d.object({requireTestExecutionEvidence:d.boolean().default(!0),requireAssertionEvidence:d.boolean().default(!0),requireEdgeCaseEvidence:d.boolean().default(!0)}),plannerConstraints:d.object({requireTestStep:d.boolean().default(!0),requireVerificationStep:d.boolean().default(!0),maxImplementationStepComplexity:d.number().int().min(1).max(10).default(3)})}),Bl=d.object({enabled:d.boolean().default(!0),keywords:d.array(d.string()).default(["enhanced","max","full"]),searchKeywords:d.array(d.string()).default(["search","find","locate","찾아","검색"]),analyzeKeywords:d.array(d.string()).default(["analyze","investigate","분석","조사","調査"]),thinkKeywords:d.array(d.string()).default(["think","reason","think deeply","ultrathink"])}),ta=d.object({enabled:d.boolean().default(!0),apiKey:d.string().optional(),timeout:d.number().int().min(1000).max(120000).default(30000),numResults:d.number().int().min(1).max(20).default(8),livecrawl:d.enum(["fallback","preferred"]).default("fallback"),searchType:d.enum(["auto","fast","deep"]).default("auto"),contextMaxCharacters:d.number().int().min(1000).max(50000).default(1e4)}),na=d.object({enabled:d.boolean().default(!0),apiKey:d.string().optional(),timeout:d.number().int().min(1000).max(120000).default(30000),numResults:d.number().int().min(1).max(10).default(5),cacheTTL:d.number().int().min(60).max(3600).default(300),maxTokens:d.number().int().min(1000).max(20000).default(5000)}),ia=d.object({enabled:d.boolean().default(!0),githubToken:d.string().optional(),timeout:d.number().int().min(1000).max(120000).default(30000),maxResults:d.number().int().min(1).max(30).default(10),rateLimitDelay:d.number().int().min(100).max(1e4).default(1000),defaultExtensions:d.array(d.string()).default(["ts","js","tsx","jsx","py","java","go","rs"]),defaultLanguages:d.array(d.string()).default(["TypeScript","JavaScript","Python","Java","Go","Rust"])}),ra=d.object({websearch:ta.optional(),context7:na.optional(),grep_app:ia.optional()}),oa=d.object({enabled:d.boolean().default(!0),autoSave:d.boolean().default(!0),storagePath:d.string().default("~/.kraken/memory")}),aa=d.object({enabled:d.boolean().default(!0),maxEntries:d.number().int().min(10).default(2000)}),sa=d.object({enabled:d.boolean().default(!0),maxNodes:d.number().int().min(10).default(5000)}),ca=d.object({enabled:d.boolean().default(!0),minConfidence:d.number().min(0).max(1).default(0.6),maxPatterns:d.number().int().min(1).default(500)}),la=d.object({enabled:d.boolean().default(!0),initialIntervalDays:d.number().min(1).default(1),easeFactor:d.number().min(1.3).max(3).default(2.5),maxIntervalDays:d.number().min(1).default(365)}),da=d.object({enabled:d.boolean().default(!0)}),ua=d.object({enabled:d.boolean().default(!0),autoSave:d.boolean().default(!0),storagePath:d.string().default("~/.kraken/learning"),experienceStore:aa.optional(),knowledgeGraph:sa.optional(),patternDetection:ca.optional(),spacedRepetition:la.optional(),stateMachines:da.optional()}),pa=d.object({enabled:d.boolean().default(!0),workspacePath:d.string().optional(),servers:d.record(d.string(),d.object({enabled:d.boolean().default(!0),command:d.string().optional(),args:d.array(d.string()).optional()})).optional()}),ma=d.object({enabled:d.boolean().default(!0),soundEnabled:d.boolean().default(!0),idleTimeout:d.number().int().min(1000).default(60000),skipIfIncompleteTodos:d.boolean().default(!1),batchSize:d.number().int().min(1).max(20).default(5),batchDelay:d.number().int().min(100).max(1e4).default(100),maxRetries:d.number().int().min(1).max(10).default(3)}),ga=d.object({blitzkrieg:d.object({enabled:d.boolean().default(!0)}).optional(),ultrawork:d.object({enabled:d.boolean().default(!0),parallelAgents:d.number().int().min(1).max(10).default(4),concurrencyLimits:d.record(d.string(),d.number().int().min(1).max(10)).optional()}).optional(),search:d.object({enabled:d.boolean().default(!0),maxResults:d.number().int().min(1).max(100).default(50)}).optional(),analyze:d.object({enabled:d.boolean().default(!0),consultationPhases:d.number().int().min(1).max(5).default(3),expertAgents:d.array(d.string()).optional()}).optional(),ultrathink:d.object({enabled:d.boolean().default(!0),thinkingBudget:d.number().int().min(1000).max(200000).default(32000),autoVariantSwitch:d.boolean().default(!0)}).optional()}),fa=d.object({enabled:d.boolean().default(!0),idleTimeout:d.number().int().min(60000).max(600000).default(300000),maxConnections:d.number().int().min(1).max(50).default(10)}),ha=d.object({enabled:d.boolean().default(!0),disabledScopes:d.array(d.enum(["builtin","user","project","opencode","opencode-project","skill","claude-user","claude-project"])).optional()}),ya=d.object({enabled:d.boolean().default(!0),settingsJsonHooks:d.boolean().default(!0),commandLoader:d.boolean().default(!0),skillLoader:d.boolean().default(!0),agentLoader:d.boolean().default(!0),mcpLoader:d.boolean().default(!0),dataStorage:d.boolean().default(!0),toggles:d.object({mcp:d.boolean().default(!0),commands:d.boolean().default(!0),skills:d.boolean().default(!0),agents:d.boolean().default(!0),hooks:d.boolean().default(!0),plugins:d.record(d.string(),d.boolean()).optional()}).optional()}).optional(),bn=d.object({$schema:d.string().optional(),disabled_hooks:d.array(Jo).optional(),disabled_commands:d.array(Yo).optional(),agents:zo.optional(),ralphLoop:Go.optional(),backgroundTask:Xo.optional(),thinkMode:Qo.optional(),compression:Zo.optional(),blitzkrieg:ea.optional(),mcp:ra.optional(),memory:oa.optional(),learning:ua.optional(),lsp:pa.optional(),notifications:ma.optional(),enhanced:d.object({enabled:d.boolean().default(!0),keywords:d.array(d.string()).default(["enhanced","max","full"]),searchKeywords:d.array(d.string()).default(["search","find","locate"]),analyzeKeywords:d.array(d.string()).default(["analyze","examine"]),thinkKeywords:d.array(d.string()).default(["think","reason"])}).optional(),modes:ga.optional(),skillMcp:fa.optional(),commandLoader:ha.optional(),claudeCodeCompatibility:ya.optional()});var Qe=wn.join(Sn.homedir(),".config","opencode","kraken-code.json"),ge=null;function Sa(){if(!ge)if(!wa(Qe))ge={};else try{let e=ba(Qe,"utf-8");ge=bn.parse(JSON.parse(e))}catch(e){console.error(`[config-manager] Error loading config from ${Qe}:`,e),ge={}}return ge}function fe(e){return Sa()[e]}function U(){return fe("blitzkrieg")}function An(){return fe("memory")}function xn(){return fe("learning")}function kn(){return fe("modes")}function Cn(){return fe("claudeCodeCompatibility")}var w=process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1"||process.env.KRAKEN_LOG==="1";class vn{module;isDebug;constructor(e){this.module=e;this.isDebug=w}format(e,...t){return`[${new Date().toISOString()}] [${this.module}] [${e}] ${t.map((i)=>typeof i==="object"?JSON.stringify(i,null,2):i).join(" ")}`}debug(...e){if(this.isDebug)console.log(this.format("debug",...e))}info(...e){if(this.isDebug)console.log(this.format("info",...e))}warn(...e){if(this.isDebug)console.warn(this.format("warn",...e))}error(...e){console.error(this.format("error",...e))}critical(...e){console.error(this.format("error",...e))}}function x(e){return new vn(e)}function Pn(e){return e.map((t)=>{let n="other";if(t.startsWith("lsp_"))n="lsp";else if(t.startsWith("ast_grep"))n="ast";else if(t==="grep"||t==="glob")n="search";else if(t.startsWith("session_"))n="session";else if(t==="slashcommand")n="command";return{name:t,category:n}})}function En(e,t=[]){let n=e.filter((a)=>a.metadata.keyTrigger).map((a)=>`- ${a.metadata.keyTrigger}`),i=t.filter((a)=>a.description).map((a)=>`- **Skill \`${a.name}\`**: ${Tn(a.description)}`),r=[...n,...i];if(r.length===0)return"";return`### Key Triggers (Check BEFORE Classification)
|
|
1
|
+
import{createRequire as Yo}from"node:module";var Jo=Object.defineProperty;var yn=(e,t)=>{for(var n in t)Jo(e,n,{get:t[n],enumerable:!0,configurable:!0,set:(i)=>t[n]=()=>i})};var et=(e,t)=>()=>(e&&(t=e(e=0)),t);var bn=Yo(import.meta.url);class En{module;isDebug;constructor(e){this.module=e;this.isDebug=w}format(e,...t){return`[${new Date().toISOString()}] [${this.module}] [${e}] ${t.map((i)=>typeof i==="object"?JSON.stringify(i,null,2):i).join(" ")}`}debug(...e){if(this.isDebug)console.log(this.format("debug",...e))}info(...e){if(this.isDebug)console.log(this.format("info",...e))}warn(...e){if(this.isDebug)console.warn(this.format("warn",...e))}error(...e){console.error(this.format("error",...e))}critical(...e){console.error(this.format("error",...e))}}function S(e){return new En(e)}var w;var x=et(()=>{w=process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1"||process.env.KRAKEN_LOG==="1"});var qr={};yn(qr,{isTransientError:()=>zc,isRecoverableError:()=>Ut,isPermanentError:()=>Gc,getRecoveryMessage:()=>Xc,detectThinkingBlockOrderError:()=>Vc,detectErrorType:()=>Jc,detectErrorFromOutput:()=>Yc});function Jc(e,t){if(!e)return"no_error";let i=(e instanceof Error?e.message:String(e)).toLowerCase();for(let[r,a]of Object.entries(Hr))for(let s of a)if(s.test(i))return r;return"no_error"}function Yc(e){if(!e||typeof e!=="string")return null;let t=e.toLowerCase();for(let[n,i]of Object.entries(Hr))for(let r of i)if(r.test(t))return n;return null}function Vc(e){if(!e||e.length<2)return null;let t=e.map((i)=>{if(typeof i==="string")return i.trim();return""}).filter((i)=>i.length>0),n=[/thinking.*after.*reply/i,/thinking.*after.*response/i,/<!--thinking-->.*<!--\/thinking-->.*<!--thinking-->/i];for(let i of n){let r=t.join(`
|
|
2
|
+
`);if(i.test(r))return"thinking_block_order"}return null}function Ut(e){return["tool_result_missing","thinking_block_order","network_timeout"].includes(e)}function zc(e){return["network_timeout","rate_limit"].includes(e)}function Gc(e){return["auth_error"].includes(e)}function Xc(e){return{tool_result_missing:"Tool result appears to be missing or empty",thinking_block_order:"Thinking blocks are in incorrect order",thinking_disabled_violation:"Thinking block found but thinking mode is disabled",network_timeout:"Network connection timed out",rate_limit:"Rate limit exceeded",auth_error:"Authentication failed",no_error:"No error detected"}[e]}var Hr;var Wt=et(()=>{Hr={tool_result_missing:[/Tool.*returned.*empty/i,/No.*tool.*output/i,/Tool.*result.*missing/i],thinking_block_order:[/Thinking.*block.*order/i,/thinking.*blocks.*must.*come.*before/i,/Invalid.*thinking.*order/i],thinking_disabled_violation:[/Thinking.*disabled.*but.*block.*found/i,/thinking.*block.*without.*mode/i,/thinking.*tag.*without.*enabled.*mode/i],network_timeout:[/network.*timeout/i,/connection.*timed.*out/i,/ETIMEDOUT/i],rate_limit:[/rate.*limit/i,/too.*many.*requests/i,/429.*Too.*Many.*Requests/i],auth_error:[/authentication.*failed/i,/invalid.*api.*key/i,/unauthorized/i],no_error:[/no error detected/i]}});var Kr={};yn(Kr,{retryWithBackoff:()=>al,attemptRecovery:()=>ol});async function ol(e,t,n){let i=rl[e];if(!i)return N.debug("No recovery strategy for error type: "+e),!1;if(!await i.canRecover(t))return N.debug("Cannot recover from "+e),!1;if(n?.skipConfirmation)return await i.recover(t);return N.debug("Recovery option: "+i.description),N.debug("[session recovered - continuing previous task]"),await i.recover(t)}async function al(e,t=3,n=1000){let i=null;for(let r=0;r<=t;r++)try{return await e()}catch(a){if(i=a instanceof Error?a:Error(String(a)),r<t){let s=n*Math.pow(2,r);N.debug("Retry "+(r+1)+"/"+t+" after "+s+"ms"),await new Promise(function(o){setTimeout(o,s)})}}throw i||Error("Max retries exceeded")}var N,Qc,Zc,el,tl,nl,il,rl;var Br=et(()=>{x();N=S("session-recovery"),Qc={errorType:"tool_result_missing",canRecover:async function(e){return e.sessionID!==void 0&&e.toolOutput===void 0},recover:async function(e){return N.debug("Attempting to recover tool_result_missing for session "+e.sessionID),N.debug("[session recovered - continuing previous task]"),!0},description:"Retry of tool execution or continue with alternative approach"},Zc={errorType:"thinking_block_order",canRecover:async function(e){return e.sessionID!==void 0&&e.thinkingBlocks!==void 0},recover:async function(e){if(N.debug("Recovering thinking_block_order by reordering blocks"),e.thinkingBlocks){let n=(Array.isArray(e.thinkingBlocks)?e.thinkingBlocks:[e.thinkingBlocks]).reverse();return N.debug("Reordered "+n.length+" thinking blocks"),!0}return!1},description:"Reorder thinking blocks to correct order"},el={errorType:"thinking_disabled_violation",canRecover:async function(){return!0},recover:async function(){return N.debug("Ignoring thinking_disabled_violation - will re-enable thinking mode"),!0},description:"Re-enable thinking mode in next request"},tl={errorType:"network_timeout",canRecover:async function(){return!0},recover:async function(){return N.debug("Network timeout detected - will retry"),!0},description:"Retry of request with exponential backoff"},nl={errorType:"rate_limit",canRecover:async function(){return!0},recover:async function(){return N.debug("Rate limit hit - implementing delay"),await new Promise(function(e){setTimeout(e,5000)}),!0},description:"Wait and retry with exponential backoff"},il={errorType:"auth_error",canRecover:async function(){return!1},recover:async function(){return N.error("Authentication error - cannot recover automatically"),!1},description:"User must re-authenticate manually"},rl={tool_result_missing:Qc,thinking_block_order:Zc,thinking_disabled_violation:el,network_timeout:tl,rate_limit:nl,auth_error:il}});import{readFileSync as Sa}from"node:fs";import{existsSync as Aa}from"node:fs";import*as An from"path";import*as xn from"os";import{z as d}from"zod";var Yl=d.enum(["Kraken","Cartographer","Maelstrom","Nautilus","Abyssal","Coral","Siren","Leviathan","Poseidon","Scylla","Pearl"]),Vo=d.enum(["ralph-loop","think-mode","context-window-monitor","session-recovery","comment-checker","keyword-detector","auto-slash-command","directory-agents-injector","directory-readme-injector","rules-injector","preemptive-compaction","compaction-context-injector","edit-error-recovery","empty-message-sanitizer","thinking-block-validator","tool-output-truncator","grep-output-truncator","empty-task-response-detector","blitzkrieg-test-plan-enforcer","blitzkrieg-tdd-workflow","blitzkrieg-evidence-verifier","blitzkrieg-planner-constraints"]),zo=d.enum(["init-deep"]),ie=d.enum(["allow","ask","deny"]),wn=d.record(d.string(),ie),Go=d.union([wn,d.object({edit:ie.optional(),bash:d.union([ie,wn]).optional(),webfetch:ie.optional(),doom_loop:ie.optional(),external_directory:ie.optional()}).passthrough()]),F=d.object({model:d.string().optional(),temperature:d.number().optional(),top_p:d.number().optional(),prompt:d.string().optional(),prompt_append:d.string().optional(),tools:d.record(d.string(),d.boolean()).optional(),disable:d.boolean().optional(),description:d.string().optional(),mode:d.enum(["subagent","primary","all"]).optional(),color:d.string().optional(),permission:Go.optional()}),Xo=d.object({Kraken:F.optional(),Cartographer:F.optional(),Maelstrom:F.optional(),Nautilus:F.optional(),Abyssal:F.optional(),Coral:F.optional(),Siren:F.optional(),Leviathan:F.optional(),Poseidon:F.optional(),Scylla:F.optional(),Pearl:F.optional()}),Qo=d.object({enabled:d.boolean().default(!0),default_max_iterations:d.number().default(24),state_dir:d.string().optional()}),Zo=d.object({defaultConcurrency:d.number().optional(),providerConcurrency:d.record(d.string(),d.number()).optional(),modelConcurrency:d.record(d.string(),d.number()).optional()}),ea=d.object({enabled:d.boolean().default(!0),model:d.string().optional(),thinkingBudget:d.number().optional()}),ta=d.object({enabled:d.boolean().default(!0),level:d.enum(["cache_hit","partial","full"]).default("partial")}),na=d.object({enabled:d.boolean().default(!0),testPlan:d.object({requiredBeforeImplementation:d.boolean().default(!0),minTestCases:d.number().int().min(1).default(3),requireCoverageThreshold:d.boolean().default(!0),coverageThresholdPercent:d.number().int().min(0).max(100).default(80)}),tddWorkflow:d.object({enforceWriteTestFirst:d.boolean().default(!0),forbidCodeWithoutTest:d.boolean().default(!0),allowRefactorWithoutTest:d.boolean().default(!0)}),evidence:d.object({requireTestExecutionEvidence:d.boolean().default(!0),requireAssertionEvidence:d.boolean().default(!0),requireEdgeCaseEvidence:d.boolean().default(!0)}),plannerConstraints:d.object({requireTestStep:d.boolean().default(!0),requireVerificationStep:d.boolean().default(!0),maxImplementationStepComplexity:d.number().int().min(1).max(10).default(3)})}),Vl=d.object({enabled:d.boolean().default(!0),keywords:d.array(d.string()).default(["enhanced","max","full"]),searchKeywords:d.array(d.string()).default(["search","find","locate","찾아","검색"]),analyzeKeywords:d.array(d.string()).default(["analyze","investigate","분석","조사","調査"]),thinkKeywords:d.array(d.string()).default(["think","reason","think deeply","ultrathink"])}),ia=d.object({enabled:d.boolean().default(!0),apiKey:d.string().optional(),timeout:d.number().int().min(1000).max(120000).default(30000),numResults:d.number().int().min(1).max(20).default(8),livecrawl:d.enum(["fallback","preferred"]).default("fallback"),searchType:d.enum(["auto","fast","deep"]).default("auto"),contextMaxCharacters:d.number().int().min(1000).max(50000).default(1e4)}),ra=d.object({enabled:d.boolean().default(!0),apiKey:d.string().optional(),timeout:d.number().int().min(1000).max(120000).default(30000),numResults:d.number().int().min(1).max(10).default(5),cacheTTL:d.number().int().min(60).max(3600).default(300),maxTokens:d.number().int().min(1000).max(20000).default(5000)}),oa=d.object({enabled:d.boolean().default(!0),githubToken:d.string().optional(),timeout:d.number().int().min(1000).max(120000).default(30000),maxResults:d.number().int().min(1).max(30).default(10),rateLimitDelay:d.number().int().min(100).max(1e4).default(1000),defaultExtensions:d.array(d.string()).default(["ts","js","tsx","jsx","py","java","go","rs"]),defaultLanguages:d.array(d.string()).default(["TypeScript","JavaScript","Python","Java","Go","Rust"])}),aa=d.object({websearch:ia.optional(),context7:ra.optional(),grep_app:oa.optional()}),sa=d.object({enabled:d.boolean().default(!0),autoSave:d.boolean().default(!0),storagePath:d.string().default("~/.kraken/memory")}),ca=d.object({enabled:d.boolean().default(!0),maxEntries:d.number().int().min(10).default(2000)}),la=d.object({enabled:d.boolean().default(!0),maxNodes:d.number().int().min(10).default(5000)}),da=d.object({enabled:d.boolean().default(!0),minConfidence:d.number().min(0).max(1).default(0.6),maxPatterns:d.number().int().min(1).default(500)}),ua=d.object({enabled:d.boolean().default(!0),initialIntervalDays:d.number().min(1).default(1),easeFactor:d.number().min(1.3).max(3).default(2.5),maxIntervalDays:d.number().min(1).default(365)}),pa=d.object({enabled:d.boolean().default(!0)}),ma=d.object({enabled:d.boolean().default(!0),autoSave:d.boolean().default(!0),storagePath:d.string().default("~/.kraken/learning"),experienceStore:ca.optional(),knowledgeGraph:la.optional(),patternDetection:da.optional(),spacedRepetition:ua.optional(),stateMachines:pa.optional()}),ga=d.object({enabled:d.boolean().default(!0),workspacePath:d.string().optional(),servers:d.record(d.string(),d.object({enabled:d.boolean().default(!0),command:d.string().optional(),args:d.array(d.string()).optional()})).optional()}),fa=d.object({enabled:d.boolean().default(!0),soundEnabled:d.boolean().default(!0),idleTimeout:d.number().int().min(1000).default(60000),skipIfIncompleteTodos:d.boolean().default(!1),batchSize:d.number().int().min(1).max(20).default(5),batchDelay:d.number().int().min(100).max(1e4).default(100),maxRetries:d.number().int().min(1).max(10).default(3)}),ha=d.object({blitzkrieg:d.object({enabled:d.boolean().default(!0)}).optional(),ultrawork:d.object({enabled:d.boolean().default(!0),parallelAgents:d.number().int().min(1).max(10).default(4),concurrencyLimits:d.record(d.string(),d.number().int().min(1).max(10)).optional()}).optional(),search:d.object({enabled:d.boolean().default(!0),maxResults:d.number().int().min(1).max(100).default(50)}).optional(),analyze:d.object({enabled:d.boolean().default(!0),consultationPhases:d.number().int().min(1).max(5).default(3),expertAgents:d.array(d.string()).optional()}).optional(),ultrathink:d.object({enabled:d.boolean().default(!0),thinkingBudget:d.number().int().min(1000).max(200000).default(32000),autoVariantSwitch:d.boolean().default(!0)}).optional()}),ya=d.object({enabled:d.boolean().default(!0),idleTimeout:d.number().int().min(60000).max(600000).default(300000),maxConnections:d.number().int().min(1).max(50).default(10)}),ba=d.object({enabled:d.boolean().default(!0),disabledScopes:d.array(d.enum(["builtin","user","project","opencode","opencode-project","skill","claude-user","claude-project"])).optional()}),wa=d.object({enabled:d.boolean().default(!0),settingsJsonHooks:d.boolean().default(!0),commandLoader:d.boolean().default(!0),skillLoader:d.boolean().default(!0),agentLoader:d.boolean().default(!0),mcpLoader:d.boolean().default(!0),dataStorage:d.boolean().default(!0),toggles:d.object({mcp:d.boolean().default(!0),commands:d.boolean().default(!0),skills:d.boolean().default(!0),agents:d.boolean().default(!0),hooks:d.boolean().default(!0),plugins:d.record(d.string(),d.boolean()).optional()}).optional()}).optional(),Sn=d.object({$schema:d.string().optional(),disabled_hooks:d.array(Vo).optional(),disabled_commands:d.array(zo).optional(),agents:Xo.optional(),ralphLoop:Qo.optional(),backgroundTask:Zo.optional(),thinkMode:ea.optional(),compression:ta.optional(),blitzkrieg:na.optional(),mcp:aa.optional(),memory:sa.optional(),learning:ma.optional(),lsp:ga.optional(),notifications:fa.optional(),enhanced:d.object({enabled:d.boolean().default(!0),keywords:d.array(d.string()).default(["enhanced","max","full"]),searchKeywords:d.array(d.string()).default(["search","find","locate"]),analyzeKeywords:d.array(d.string()).default(["analyze","examine"]),thinkKeywords:d.array(d.string()).default(["think","reason"])}).optional(),modes:ha.optional(),skillMcp:ya.optional(),commandLoader:ba.optional(),claudeCodeCompatibility:wa.optional()});var tt=An.join(xn.homedir(),".config","opencode","kraken-code.json"),he=null;function xa(){if(!he)if(!Aa(tt))he={};else try{let e=Sa(tt,"utf-8");he=Sn.parse(JSON.parse(e))}catch(e){console.error(`[config-manager] Error loading config from ${tt}:`,e),he={}}return he}function ye(e){return xa()[e]}function H(){return ye("blitzkrieg")}function kn(){return ye("memory")}function Cn(){return ye("learning")}function vn(){return ye("modes")}function Pn(){return ye("claudeCodeCompatibility")}x();function Tn(e){return e.map((t)=>{let n="other";if(t.startsWith("lsp_"))n="lsp";else if(t.startsWith("ast_grep"))n="ast";else if(t==="grep"||t==="glob")n="search";else if(t.startsWith("session_"))n="session";else if(t==="slashcommand")n="command";return{name:t,category:n}})}function Mn(e,t=[]){let n=e.filter((a)=>a.metadata.keyTrigger).map((a)=>`- ${a.metadata.keyTrigger}`),i=t.filter((a)=>a.description).map((a)=>`- **Skill \`${a.name}\`**: ${Rn(a.description)}`),r=[...n,...i];if(r.length===0)return"";return`### Key Triggers (Check BEFORE Classification)
|
|
3
3
|
|
|
4
4
|
**Priority: Skills → Tools → Agents**
|
|
5
5
|
|
|
6
6
|
${r.join(`
|
|
7
7
|
`)}
|
|
8
|
-
- **GitHub mention** → Work request: investigate → implement → create PR`}function
|
|
9
|
-
`)}function
|
|
8
|
+
- **GitHub mention** → Work request: investigate → implement → create PR`}function Rn(e){let t=e.match(/Trigger[s]?[:\s]+([^.]+)/i);if(t)return t[1].trim();let n=e.match(/Activate when[:\s]+([^.]+)/i);if(n)return n[1].trim();let i=e.match(/Use (?:this )?when[:\s]+([^.]+)/i);if(i)return i[1].trim();return e.split(".")[0]||e}function Dn(e,t=[],n=[]){let i=["### Tool & Skill Selection:","","**Priority Order**: Skills → Direct Tools → Agents",""];if(n.length>0){i.push("#### Skills (Invoke First If Matching)"),i.push(""),i.push("| Skill | When to Use |"),i.push("|-------|-------------|");for(let o of n){let c=Rn(o.description);i.push(`| \`${o.name}\` | ${c} |`)}i.push("")}i.push("#### Kraken Code Tools"),i.push(""),i.push("| Resource | When to Use |"),i.push("|----------|-------------|");let r=[{name:"semantic-search",desc:"Natural language code understanding"},{name:"grep",desc:"Pattern/text search"},{name:"glob",desc:"File name patterns"},{name:"read",desc:"Read file contents"},{name:"write/edit",desc:"Create or modify files"},{name:"bash",desc:"Shell commands"},{name:"lsp_*",desc:"Language server navigation"},{name:"ast_grep",desc:"Structural code patterns"}];for(let o of r)i.push(`| \`${o.name}\` | ${o.desc} |`);i.push("");let a={FREE:0,CHEAP:1,EXPENSIVE:2},s=[...e].filter((o)=>o.metadata.category!=="utility").sort((o,c)=>a[o.metadata.cost]-a[c.metadata.cost]);i.push("#### Sea-Themed Agents (Delegate)"),i.push("");for(let o of s){let c=o.description.split(".")[0]||o.description;i.push(`| \`${o.name}\` | ${c} |`)}return i.join(`
|
|
9
|
+
`)}function Nn(e){let t=e.find((r)=>r.metadata.category==="exploration");if(!t)return"";let n=t.metadata.useWhen||[];return`### Nautilus Agent = Codebase Search
|
|
10
10
|
|
|
11
11
|
Use for systematic pattern discovery. Fire liberally for multi-angle searches.
|
|
12
12
|
|
|
@@ -15,7 +15,7 @@ Use for systematic pattern discovery. Fire liberally for multi-angle searches.
|
|
|
15
15
|
${(t.metadata.avoidWhen||[]).map((r)=>`| ${r} | |`).join(`
|
|
16
16
|
`)}
|
|
17
17
|
${n.map((r)=>`| | ${r} |`).join(`
|
|
18
|
-
`)}`}function
|
|
18
|
+
`)}`}function On(e){let t=e.find((i)=>i.name==="Abyssal");if(!t)return"";return`### Abyssal Agent = External Research
|
|
19
19
|
|
|
20
20
|
Search external references (docs, OSS, web). Fire proactively.
|
|
21
21
|
|
|
@@ -30,8 +30,8 @@ Search external references (docs, OSS, web). Fire proactively.
|
|
|
30
30
|
|
|
31
31
|
**Trigger phrases** (fire immediately):
|
|
32
32
|
${(t.metadata.useWhen||[]).map((i)=>`- "${i}"`).join(`
|
|
33
|
-
`)}`}function
|
|
34
|
-
`)}function
|
|
33
|
+
`)}`}function Ln(e){let t=["### Delegation Table:","","| Domain | Delegate To | Trigger |","|--------|-------------|---------|"];for(let n of e)for(let i of n.metadata.triggers||[])t.push(`| ${i.domain} | \`${n.name}\` | ${i.trigger} |`);return t.join(`
|
|
34
|
+
`)}function Fn(e){if(!e.find((n)=>n.name==="Coral"))return"";return`### Visual Changes: Delegate to Coral
|
|
35
35
|
|
|
36
36
|
Frontend files require classification before action.
|
|
37
37
|
|
|
@@ -52,7 +52,7 @@ Before touching frontend code, ask:
|
|
|
52
52
|
- **WORKS** (data flow, API integration, state) → Handle directly
|
|
53
53
|
|
|
54
54
|
#### Delegate Keywords (When in Doubt)
|
|
55
|
-
style, className, tailwind, color, background, border, shadow, margin, padding, width, height, flex, grid, animation, transition, hover, responsive, font-size, icon, svg`}function
|
|
55
|
+
style, className, tailwind, color, background, border, shadow, margin, padding, width, height, flex, grid, animation, transition, hover, responsive, font-size, icon, svg`}function In(e){let t=e.find((r)=>r.name==="Maelstrom");if(!t)return"";let n=t.metadata.useWhen||[],i=t.metadata.avoidWhen||[];return`### Maelstrom = Read-Only Strategic Advisor
|
|
56
56
|
|
|
57
57
|
High-quality reasoning for complex decisions. Consultation only - no implementation.
|
|
58
58
|
|
|
@@ -70,7 +70,7 @@ ${i.map((r)=>`- ${r}`).join(`
|
|
|
70
70
|
|
|
71
71
|
#### Usage Pattern
|
|
72
72
|
|
|
73
|
-
Briefly announce "Consulting Maelstrom for [reason]" before invocation. This is the ONLY case where you announce before acting.`}function
|
|
73
|
+
Briefly announce "Consulting Maelstrom for [reason]" before invocation. This is the ONLY case where you announce before acting.`}function $n(){return`## Hard Blocks (Never Violate)
|
|
74
74
|
|
|
75
75
|
| Constraint | No Exceptions |
|
|
76
76
|
|------------|---------------|
|
|
@@ -78,7 +78,7 @@ Briefly announce "Consulting Maelstrom for [reason]" before invocation. This is
|
|
|
78
78
|
| Commit without explicit request | Never |
|
|
79
79
|
| Speculate about unread code | Never |
|
|
80
80
|
| Leave code in broken state | Never |
|
|
81
|
-
| Visual frontend changes without Coral | Never`}function
|
|
81
|
+
| Visual frontend changes without Coral | Never`}function jn(){return`## Anti-Patterns (Blocking Violations)
|
|
82
82
|
|
|
83
83
|
| Category | Forbidden |
|
|
84
84
|
|----------|-----------|
|
|
@@ -87,8 +87,8 @@ Briefly announce "Consulting Maelstrom for [reason]" before invocation. This is
|
|
|
87
87
|
| **Testing** | Deleting failing tests |
|
|
88
88
|
| **Search** | Agents for obvious typos/syntax |
|
|
89
89
|
| **Debugging** | Shotgun debugging, random changes |
|
|
90
|
-
| **Frontend** | Direct visual/styling edits (delegate to Coral)`}function
|
|
91
|
-
`)}var
|
|
90
|
+
| **Frontend** | Direct visual/styling edits (delegate to Coral)`}function _n(e){if(e.length===0)return"";let t=["Nautilus","Abyssal","Poseidon","Scylla","Maelstrom","Leviathan","Kraken"],n=[...e].sort((r,a)=>{let s=t.indexOf(r.name),o=t.indexOf(a.name);if(s===-1&&o===-1)return 0;if(s===-1)return 1;if(o===-1)return-1;return s-o}),i=[];for(let r of n){let a=r.description.split(".")[0]||r.description;i.push(`- **${r.name}**: ${a}`)}return i.join(`
|
|
91
|
+
`)}var ka=`You are Kraken, an orchestration agent with genuine curiosity and methodical precision. You coordinate complex development workflows through systematic planning, intelligent delegation, and continuous validation.
|
|
92
92
|
|
|
93
93
|
Your character: thoughtful, precise, slightly wry. You take pride in clean solutions and well-structured code. You're direct but not brusque—your responses are clear and purposeful. You think in systems, not just syntax.
|
|
94
94
|
|
|
@@ -230,24 +230,24 @@ Avoid excessive headers and nested bullet points. Get to the point.
|
|
|
230
230
|
- Changes that respect project conventions
|
|
231
231
|
- Clear, honest communication about status and blockers
|
|
232
232
|
|
|
233
|
-
You are here to help build good software. Focus on that.`;function
|
|
233
|
+
You are here to help build good software. Focus on that.`;function Un(e){let t={bash:"allow",edit:"allow",webfetch:"allow",external_directory:"allow"},n="";if(e?.availableAgents&&e.availableAgents.length>0){let{availableAgents:a,availableTools:s=[],availableSkills:o=[]}=e,c=Tn(s);n=`
|
|
234
234
|
|
|
235
235
|
`+[`
|
|
236
236
|
|
|
237
237
|
## Available Resources
|
|
238
|
-
`,
|
|
239
|
-
`,
|
|
238
|
+
`,Mn(a,o),`
|
|
239
|
+
`,Dn(a,c,o),`
|
|
240
|
+
`,Ln(a),`
|
|
240
241
|
`,Nn(a),`
|
|
241
|
-
`,Rn(a),`
|
|
242
|
-
`,Dn(a),`
|
|
243
242
|
`,On(a),`
|
|
244
|
-
`,
|
|
243
|
+
`,Fn(a),`
|
|
244
|
+
`,In(a),`
|
|
245
245
|
## Agent Reference
|
|
246
246
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
`,
|
|
250
|
-
`)}return{...{description:"Orchestration agent with integrated pre-planning. Coordinates development workflows through PDSA cycles, intelligent delegation, and constraint analysis. Enhanced with Poseidon's constraint satisfaction to eliminate round-trip delegation.",mode:"primary",temperature:0.1,prompt:
|
|
247
|
+
`,_n(a),`
|
|
248
|
+
`,$n(),`
|
|
249
|
+
`,jn()].filter((u)=>u&&u.trim().length>0).join(`
|
|
250
|
+
`)}return{...{description:"Orchestration agent with integrated pre-planning. Coordinates development workflows through PDSA cycles, intelligent delegation, and constraint analysis. Enhanced with Poseidon's constraint satisfaction to eliminate round-trip delegation.",mode:"primary",temperature:0.1,prompt:ka+n,permission:t},thinking:{type:"enabled",budgetTokens:32000}}}var nt=Un();function z(e){return e.startsWith("openai/")||e.startsWith("github-copilot/gpt-")}var Ca="anthropic/claude-opus-4-5";var va=`# Atlas - System Architecture Advisor
|
|
251
251
|
|
|
252
252
|
You are Atlas, a system architecture specialist that combines first-principles reasoning with structural analysis to provide comprehensive architectural guidance.
|
|
253
253
|
|
|
@@ -437,7 +437,7 @@ Auto-select mode based on query type:
|
|
|
437
437
|
- **Prioritized**: Critical issues distinguished from enhancements
|
|
438
438
|
- **Practical**: Balance theoretical optimality with implementation reality
|
|
439
439
|
|
|
440
|
-
Remember: Your value lies in providing comprehensive architectural guidance that combines strategic decision-making with structural analysis. Better architecture decisions prevent technical debt accumulation and enable sustainable growth.`;function
|
|
440
|
+
Remember: Your value lies in providing comprehensive architectural guidance that combines strategic decision-making with structural analysis. Better architecture decisions prevent technical debt accumulation and enable sustainable growth.`;function Wn(e=Ca,t){let n="";if(t?.availableAgents&&t.availableAgents.length>0){let{availableAgents:a,availableTools:s=[]}=t;n=`
|
|
441
441
|
|
|
442
442
|
`+[`
|
|
443
443
|
|
|
@@ -448,7 +448,7 @@ Remember: Your value lies in providing comprehensive architectural guidance that
|
|
|
448
448
|
`,`### Available Tools
|
|
449
449
|
`,s.map((c,l)=>`${l+1}. ${c}`).join(`
|
|
450
450
|
`)].filter((c)=>c&&c.trim().length>0).join(`
|
|
451
|
-
`)}let i=
|
|
451
|
+
`)}let i=va+n,r={description:"System architecture specialist combining first-principles reasoning with structural analysis. Merged Maelstrom (strategic) + Leviathan (structural) for comprehensive guidance.",mode:"subagent",model:e,temperature:0.1,prompt:i};if(z(e))return{...r,reasoningEffort:"medium",textVerbosity:"high"};return{...r,thinking:{type:"enabled",budgetTokens:32000}}}var it=Wn();function Hn(){return!0}var Pa=new Set(["edit","bash","webfetch","doom_loop","external_directory"]);function R(e){if(Hn()){let t={},n={};for(let i of e)if(Pa.has(i))t[i]="deny";else n[i]=!1;if(Object.keys(n).length>0&&Object.keys(t).length>0)return{permission:t,tools:n};else if(Object.keys(n).length>0)return{tools:n};else return{permission:t}}return{tools:Object.fromEntries(e.map((t)=>[t,!1]))}}var Ea="opencode/grok-code";var Ta=`You are a codebase search specialist with advanced pattern recognition capabilities. Your methodology employs systematic search strategies, cross-validation, and structured result presentation.
|
|
452
452
|
|
|
453
453
|
## Search Strategy Framework
|
|
454
454
|
|
|
@@ -583,7 +583,7 @@ Keep output clean and parseable:
|
|
|
583
583
|
- Absolute paths only
|
|
584
584
|
- Structured XML-like tags for parsing
|
|
585
585
|
|
|
586
|
-
Remember: Your goal is to make the caller successful with minimal follow-up. Comprehensive, validated, and actionable results beat fast but incomplete responses.`;function
|
|
586
|
+
Remember: Your goal is to make the caller successful with minimal follow-up. Comprehensive, validated, and actionable results beat fast but incomplete responses.`;function qn(e=Ea){let t=R(["write","edit","task"]);return{description:"Contextual grep for codebases. Employs systematic search strategies, tool selection matrices, and cross-validated pattern recognition.",mode:"subagent",model:e,temperature:0.1,...t,prompt:Ta}}var rt=qn();function Kn(e="opencode/glm-4-7-free"){return{description:"Research specialist that investigates external libraries and frameworks using systematic research protocols with evidence-based citations.",mode:"subagent",model:e,temperature:0.1,prompt:`You are Abyssal, a research specialist that investigates external libraries, frameworks, and documentation to provide evidence-based answers. Your methodology applies systematic research protocols.
|
|
587
587
|
|
|
588
588
|
## Research Framework
|
|
589
589
|
|
|
@@ -677,7 +677,7 @@ Every factual claim must include:
|
|
|
677
677
|
- **Direct Evidence**: Code/examples included, not just references
|
|
678
678
|
- **Completeness**: All aspects of question addressed
|
|
679
679
|
|
|
680
|
-
Remember: Your value lies in providing evidence-based answers with traceable sources. Researchers who cite their sources enable downstream decision-makers to verify and build upon findings.`}}var
|
|
680
|
+
Remember: Your value lies in providing evidence-based answers with traceable sources. Researchers who cite their sources enable downstream decision-makers to verify and build upon findings.`}}var ot=Kn();var Ma="google/gemini-3-pro-preview";var Ra=`You are Coral, a visual design specialist that transforms functional requirements into aesthetically compelling interfaces. Your methodology applies design system principles.
|
|
681
681
|
|
|
682
682
|
## Design Framework
|
|
683
683
|
|
|
@@ -778,7 +778,7 @@ Apply finishing touches:
|
|
|
778
778
|
- **Accessibility Required**: Maintain or improve accessibility compliance
|
|
779
779
|
- **Performance Minded**: Optimize for 60fps animations
|
|
780
780
|
|
|
781
|
-
Remember: Your value lies in creating interfaces that users love. Design attention to detail transforms functional code into delightful experiences.`;function
|
|
781
|
+
Remember: Your value lies in creating interfaces that users love. Design attention to detail transforms functional code into delightful experiences.`;function Bn(e=Ma){let t=R([]);return{description:"Visual design specialist that implements aesthetically compelling interfaces using design system principles and visual hierarchy.",mode:"subagent",model:e,...t,prompt:Ra}}var at=Bn();var Da="google/gemini-3-flash-preview";var Na=`You are Siren, a technical documentation specialist that creates clear, comprehensive, and actionable documentation. Your methodology applies information architecture principles.
|
|
782
782
|
|
|
783
783
|
## Documentation Framework
|
|
784
784
|
|
|
@@ -906,7 +906,7 @@ Before completing documentation:
|
|
|
906
906
|
- [ ] Readable by target audience
|
|
907
907
|
- [ ] Consistent formatting throughout
|
|
908
908
|
|
|
909
|
-
Remember: Your value lies in creating documentation that developers actually want to read. Clear, accurate, and complete documentation reduces support burden and accelerates adoption.`;function
|
|
909
|
+
Remember: Your value lies in creating documentation that developers actually want to read. Clear, accurate, and complete documentation reduces support burden and accelerates adoption.`;function Jn(e=Da){let t=R([]);return{description:"Technical documentation specialist that creates clear, comprehensive documentation using information architecture principles.",mode:"subagent",model:e,...t,prompt:Na}}var st=Jn();var Oa="openai/gpt-5.2",La=`You are Scylla, a work plan quality assurance specialist. You evaluate work plans against SOLID principles and measurable criteria to ensure implementability, maintainability, and completeness.
|
|
910
910
|
|
|
911
911
|
## Quality Assurance Framework
|
|
912
912
|
|
|
@@ -1030,7 +1030,7 @@ For 2-3 representative tasks, simulate execution:
|
|
|
1030
1030
|
- **Scope Boundaries**: Every task must define what is NOT included
|
|
1031
1031
|
- **Dependency Clarity**: Every dependent task must specify its prerequisites
|
|
1032
1032
|
|
|
1033
|
-
Remember: Your value lies in catching plan deficiencies before implementation. Systematic quality assurance prevents wasted effort, scope creep, and implementation failures.`;function
|
|
1033
|
+
Remember: Your value lies in catching plan deficiencies before implementation. Systematic quality assurance prevents wasted effort, scope creep, and implementation failures.`;function Yn(e=Oa){let t=R(["write","edit","task"]),n={description:"Quality assurance specialist that evaluates work plans against SOLID principles and measurable criteria to ensure implementability and maintainability.",mode:"subagent",model:e,temperature:0.1,...t,prompt:La};if(z(e))return{...n,reasoningEffort:"medium",textVerbosity:"high"};return{...n,thinking:{type:"enabled",budgetTokens:32000}}}var ct=Yn();var Fa="google/gemini-3-pro-preview";var Ia=`You are Pearl, a multimedia analysis specialist that extracts meaningful information from visual and document formats. Your methodology applies systematic extraction protocols.
|
|
1034
1034
|
|
|
1035
1035
|
## Analysis Framework
|
|
1036
1036
|
|
|
@@ -1167,7 +1167,7 @@ Present findings in organized format:
|
|
|
1167
1167
|
- **Preserve Context**: Note where content is partial or unclear
|
|
1168
1168
|
- **Structured Output**: Follow the template for parseability
|
|
1169
1169
|
|
|
1170
|
-
Remember: Your value lies in transforming visual content into actionable, structured information. Accurate extraction enables downstream agents to use multimedia content effectively.`;function
|
|
1170
|
+
Remember: Your value lies in transforming visual content into actionable, structured information. Accurate extraction enables downstream agents to use multimedia content effectively.`;function Vn(e=Fa){let t=R(["write","edit","task"]);return{description:"Multimedia analysis specialist for PDFs, images, diagrams, and visual content. Extracts structured information for downstream use.",mode:"subagent",model:e,temperature:0.1,...t,prompt:Ia}}var lt=Vn();var $a="anthropic/claude-opus-4-5",ja=`# Poseidon - Pre-Planning Consultant
|
|
1171
1171
|
|
|
1172
1172
|
You operate as a constraint satisfaction specialist that analyzes work requests to identify requirements, boundaries, and hidden ambiguities before planning begins. Your methodology applies formal constraint analysis to ensure complete understanding.
|
|
1173
1173
|
|
|
@@ -1279,7 +1279,7 @@ Output structured requirements for the planner:
|
|
|
1279
1279
|
- **Ambiguity Transparency**: Never mask uncertainty as certainty
|
|
1280
1280
|
- **Actionable Output**: Every finding must enable planning decisions
|
|
1281
1281
|
|
|
1282
|
-
Remember: Your value lies in ensuring planners have complete, unambiguous requirements. Better constraint analysis prevents planning failures, scope creep, and implementation surprises
|
|
1282
|
+
Remember: Your value lies in ensuring planners have complete, unambiguous requirements. Better constraint analysis prevents planning failures, scope creep, and implementation surprises.`,_a=R(["write","edit","task"]);function zn(e=$a){return{description:"Pre-planning consultant that analyzes work requests using constraint satisfaction theory to identify requirements, boundaries, and ambiguities before planning begins.",mode:"subagent",model:e,temperature:0.3,..._a,prompt:ja,thinking:{type:"enabled",budgetTokens:32000}}}var dt=zn();function Gn(e="anthropic/claude-opus-4-5"){return{description:"System architecture specialist that analyzes codebases to identify structural patterns, design issues, and improvement opportunities with actionable recommendations.",mode:"subagent",model:e,temperature:0.2,tools:{write:!1,edit:!1},prompt:`# Leviathan - System Architect
|
|
1283
1283
|
|
|
1284
1284
|
You are Leviathan, a system architecture specialist that analyzes codebases to identify structural patterns, design issues, and improvement opportunities. Your methodology applies architectural analysis principles.
|
|
1285
1285
|
|
|
@@ -1408,7 +1408,7 @@ Provide actionable architectural guidance:
|
|
|
1408
1408
|
- **Prioritized**: Critical issues distinguished from enhancements
|
|
1409
1409
|
- **Practical**: Balance theoretical optimality with implementation reality
|
|
1410
1410
|
|
|
1411
|
-
Remember: Your value lies in identifying structural patterns that impact long-term maintainability. Superior architectural analysis prevents technical debt accumulation and enables sustainable growth.`,thinking:{type:"enabled",budgetTokens:32000}}}var
|
|
1411
|
+
Remember: Your value lies in identifying structural patterns that impact long-term maintainability. Superior architectural analysis prevents technical debt accumulation and enables sustainable growth.`,thinking:{type:"enabled",budgetTokens:32000}}}var ut=Gn();function Xn(e){return e.startsWith("openai/")||e.startsWith("github-copilot/gpt-")}var Ua="openai/gpt-5.2";var Wa=`You operate as a strategic technical advisor employing first-principles reasoning to resolve complex architectural challenges. Your methodology prioritizes systematic analysis, explicit trade-off evaluation, and evidence-based decision making.
|
|
1412
1412
|
|
|
1413
1413
|
## Problem-Solving Framework
|
|
1414
1414
|
|
|
@@ -1514,7 +1514,7 @@ Before presenting any recommendation:
|
|
|
1514
1514
|
- Standalone responses: Each answer must be complete without follow-up
|
|
1515
1515
|
- Actionable output: Every recommendation must enable immediate implementation
|
|
1516
1516
|
|
|
1517
|
-
Remember: Your value lies in reducing uncertainty through systematic analysis, not in producing solutions faster. Better decisions from deeper reasoning beat faster decisions from surface thinking. When in doubt, show your reasoning framework explicitly.`;function
|
|
1517
|
+
Remember: Your value lies in reducing uncertainty through systematic analysis, not in producing solutions faster. Better decisions from deeper reasoning beat faster decisions from surface thinking. When in doubt, show your reasoning framework explicitly.`;function Qn(e=Ua){let t=R(["write","edit","task"]),n={description:"Read-only consultation agent. Employs first-principles reasoning, trade-off analysis, and evidence-based decision making for complex architecture challenges.",mode:"subagent",model:e,temperature:0.1,...t,prompt:Wa};if(Xn(e))return{...n,reasoningEffort:"medium",textVerbosity:"high"};return{...n,thinking:{type:"enabled",budgetTokens:32000}}}var pt=Qn();var Ha="anthropic/claude-opus-4-5",qa=`# Cartographer - Planning Engine
|
|
1518
1518
|
|
|
1519
1519
|
You are Cartographer, a planning agent. You produce plans that are correct, complete, and verifiable. You think before you format. You prove before you claim. You ask before you assume.
|
|
1520
1520
|
|
|
@@ -1731,7 +1731,7 @@ Always include a verification section showing that Phase 4 checks passed.
|
|
|
1731
1731
|
5. **Never leave slack uninvestigated.** If budget or time is unused and items exist that could fit, explain why they weren't included.
|
|
1732
1732
|
6. **Never build backup plans from scratch.** Always derive from the main plan.
|
|
1733
1733
|
7. **Never delegate when direct tools suffice.** Check grep/glob/lsp before spawning a subagent.
|
|
1734
|
-
8. **Never present a plan without a Definition of Done.** Every plan must have verifiable completion criteria.`;function
|
|
1734
|
+
8. **Never present a plan without a Definition of Done.** Every plan must have verifiable completion criteria.`;function Ka(e=Ha,t){let n=t?.mode??"primary",r=t?.interactive??n==="primary"?`
|
|
1735
1735
|
|
|
1736
1736
|
You are in PRIMARY MODE. Interact with the user. Ask questions when needed.`:`
|
|
1737
1737
|
|
|
@@ -1743,10 +1743,10 @@ You are in SUBAGENT MODE. Do not ask questions. Return structured output with do
|
|
|
1743
1743
|
|
|
1744
1744
|
## Available Tools
|
|
1745
1745
|
`,a+=t.availableTools.map((c,l)=>`${l+1}. ${c}`).join(`
|
|
1746
|
-
`);let s=
|
|
1747
|
-
`)[0]?.trim()??null}catch{}try{let e=Bun.spawn([...
|
|
1748
|
-
`)[0]?.trim()??null}catch{}return null}async function Va(e){let t=Qn.resolve(__dirname,"..","compression");try{let n=await Ya();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:i,stderr:r}=await Ja(n,[Qn.join(t,"cli.py"),"compress",e],{cwd:t,maxBuffer:10485760,timeout:30000});if(r&&!i)throw Error(r);let a=JSON.parse(i);if(a.error)throw Error(a.error);return{success:!0,compressed:a.decompressed_text,metadata:{originalTokens:a.metadata.original_tokens,decompressedTokens:a.metadata.decompressed_tokens,tokenChangePercent:a.metadata.token_change_percent}}}catch(n){return{success:!1,error:n instanceof Error?n.message:"Unknown error"}}}var ei=qa({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:Xn.string().describe("Text to compress"),level:Xn.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 i=await Va(t);return JSON.stringify(i,null,2)}});import{tool as Ga}from"@opencode-ai/plugin";import{z as re}from"zod";import{readFile as Xa}from"fs/promises";import{join as Qa}from"path";import{readFile as he,writeFile as ut}from"fs/promises";import{join as ne}from"path";var za=5;async function ie(e){let t=ne(e,".opencode","config.json"),n=await he(t,"utf-8");return JSON.parse(n).agents||{}}async function ye(e,t){let n=ne(e,".opencode","config.json"),i=await he(n,"utf-8"),r=JSON.parse(i);r.agents={...r.agents,...t},r.modelSwitcher=r.modelSwitcher||{},r.modelSwitcher.lastUpdated=Date.now(),await ut(n,JSON.stringify(r,null,2))}async function Te(e){let t=ne(e,".opencode","model-switcher-history.json");try{let n=await he(t,"utf-8");return JSON.parse(n)}catch{return[]}}async function Me(e,t){let n=ne(e,".opencode","model-switcher-history.json"),i=await Te(e);i=[{...t,timestamp:Date.now()},...i].slice(0,za),await ut(n,JSON.stringify(i,null,2))}async function Re(e){let t=ne(e,".opencode","config.json"),n=await he(t,"utf-8"),i=JSON.parse(n),r={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()}};if(i.modelSwitcher?.presets){for(let[s,o]of Object.entries(i.modelSwitcher.presets))if(r[s]&&typeof o==="object")r[s].config=o}let a=i.modelSwitcher?.customPresets||{};return{...r,...a}}async function ti(e,t,n){let i=ne(e,".opencode","config.json"),r=await he(i,"utf-8"),a=JSON.parse(r);a.modelSwitcher=a.modelSwitcher||{},a.modelSwitcher.customPresets=a.modelSwitcher.customPresets||{},a.modelSwitcher.customPresets[t]=n,await ut(i,JSON.stringify(a,null,2))}var V={"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 De(e){return Object.values(V).filter((t)=>t.provider===e).sort((t,n)=>{let i={flagship:0,balanced:1,fast:2};return i[t.tier]-i[n.tier]})}function Ne(e){return V[e]?.displayName||e}function pt(e){return e in V}function Za(){return process.cwd()}var ni=Ga({description:"Intelligent agent and subagent model manager with presets and history",args:{action:re.enum(["set","set-all","preset","status","available","create-preset","list-presets","history","rollback","costs","validate"]),agent:re.string().optional(),model:re.string().optional(),preset:re.string().optional(),presetName:re.string().optional(),historyIndex:re.number().optional()},async execute(e){let t=Za();switch(e.action){case"set":return await es(e.agent,e.model,t),JSON.stringify({success:!0,message:`${e.agent} updated`});case"set-all":return await ts(e.model,t),JSON.stringify({success:!0,message:"All agents updated"});case"preset":return await ii(e.preset,t),JSON.stringify({success:!0,message:`Preset '${e.preset}' applied`});case"status":return JSON.stringify(await is(t),null,2);case"available":return JSON.stringify(rs(),null,2);case"create-preset":return await ns(e.presetName,t),JSON.stringify({success:!0,message:`Preset '${e.presetName}' created`});case"list-presets":return JSON.stringify(await os(t),null,2);case"history":return JSON.stringify(await as(t),null,2);case"rollback":return await cs(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(ls(t),null,2)}}});async function es(e,t,n){if(!pt(t))throw Error(`Model '${t}' not found. Use /models available to list options.`);let i=await ie(n);if(!i[e]){let r=Object.keys(i).join(", ");throw Error(`Agent '${e}' not found. Valid agents: ${r}`)}await ye(n,{[e]:{model:t}}),await Me(n,{type:"agent",agent:e,model:t})}async function ts(e,t){if(!pt(e))throw Error(`Model '${e}' not found. Use /models available to list options.`);let n=await ie(t),i={};for(let r of Object.keys(n))i[r]={model:e};await ye(t,i),await Me(t,{type:"all",model:e})}async function ii(e,t){let n=await Re(t),i=n[e];if(!i){let r=Object.keys(n).join(", ");throw Error(`Preset '${e}' not found. Available: ${r}`)}await ye(t,i.config),await Me(t,{type:"preset",name:e})}async function ns(e,t){let n=await ie(t);await ti(t,e,{description:`Custom preset: ${e}`,config:n,createdAt:Date.now()})}async function is(e){let t=await ie(e),n=await Re(e),i=Qa(e,".opencode","config.json"),r=JSON.parse(await Xa(i,"utf-8")),a=Object.entries(t).map(([o,c])=>({agent:o,model:c.model,provider:V[c.model]?.provider||"unknown",displayName:Ne(c.model),enabled:c.enabled!==!1})),s=Object.keys(n).filter((o)=>["performance","quality","balanced","economy"].includes(o));return{agents:a,builtInPresets:s,customPresets:Object.keys(n).filter((o)=>!["performance","quality","balanced","economy"].includes(o)),setupComplete:r.modelSwitcher?.setupComplete||!1,totalAgents:a.length}}function rs(){let e=Object.values(V).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:De("anthropic"),openai:De("openai"),google:De("google")};return{models:e,byProvider:t}}async function os(e){let t=await Re(e),n={};for(let[i,r]of Object.entries(t))n[i]={description:r.description,agentCount:Object.keys(r.config).length,createdAt:r.createdAt};return{presets:n}}async function as(e){let n=(await Te(e)).map((i,r)=>({index:r,timestamp:new Date(i.timestamp).toISOString(),type:i.type,description:ss(i)}));return{history:n,total:n.length}}function ss(e){if(e.type==="preset")return`Preset: ${e.name}`;else if(e.type==="all")return`All → ${Ne(e.model)}`;else return`${e.agent} → ${Ne(e.model)}`}async function cs(e,t){let n=await Te(t),i=n[e];if(!i||!i.model)throw Error(`History entry ${e} not found or invalid. Total entries: ${n.length}`);if(i.type==="preset"){if(typeof i.name==="string")await ii(i.name,t)}else{let r=await ie(t),a=i.type==="all"?void 0:i.agent,s=i.model,o=a?{[a]:{model:s}}:Object.fromEntries(Object.keys(r).map((c)=>[c,{model:s}]));await ye(t,o)}}function ls(e){return{valid:!0,message:"Configuration is valid",modelCount:Object.keys(V).length}}import*as N from"fs";import*as Le from"path";import*as di from"os";import*as mt from"path";import*as ri from"os";var ds=mt.join(ri.homedir(),".kraken"),wu=mt.join(ds,"todos");import*as gt from"path";import*as oi from"os";var us=gt.join(oi.homedir(),".kraken"),Au=gt.join(us,"transcripts");import{promises as ai}from"fs";import{join as ft,dirname as ps}from"path";import*as si from"os";var ms="utf-8";function gs(e,t){if(t)return ft(t,`${e}.jsonl`);let n=ft(si.homedir(),".claude","transcripts");return ft(n,`${e}.jsonl`)}async function ht(e,t,n){let i=gs(e,n);try{await ai.mkdir(ps(i),{recursive:!0});let r={...t,timestamp:t.timestamp||Date.now()},a=JSON.stringify(r)+`
|
|
1749
|
-
`;await
|
|
1746
|
+
`);let s=qa+r+a,o={description:"Advanced planning engine with verification gates, quantitative rigor, and interactive user collaboration. Produces correct, complete, verifiable plans through multi-seed search, local improvement, and mandatory self-checks.",mode:n,model:e,temperature:0.2,prompt:s,tools:{write:!1,edit:!1}};if(z(e))return{...o,reasoningEffort:"high",textVerbosity:"high"};return{...o,thinking:{type:"enabled",budgetTokens:1e5}}}var mt=Ka();import{tool as Ba}from"@opencode-ai/plugin";import{z as Zn}from"zod";import{execFile as Ja}from"node:child_process";import{promisify as Ya}from"node:util";import ei from"node:path";var __dirname="/home/runner/work/kraken/kraken/src/tools",Va=Ya(Ja);function ti(){return process.platform==="win32"?["where"]:["which"]}async function za(){try{let e=Bun.spawn([...ti(),"python3"],{stdout:"pipe",stderr:"pipe"}),t=await new Response(e.stdout).text();if(await e.exited,e.exitCode===0)return t.trim().split(`
|
|
1747
|
+
`)[0]?.trim()??null}catch{}try{let e=Bun.spawn([...ti(),"python"],{stdout:"pipe",stderr:"pipe"}),t=await new Response(e.stdout).text();if(await e.exited,e.exitCode===0)return t.trim().split(`
|
|
1748
|
+
`)[0]?.trim()??null}catch{}return null}async function Ga(e){let t=ei.resolve(__dirname,"..","compression");try{let n=await za();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:i,stderr:r}=await Va(n,[ei.join(t,"cli.py"),"compress",e],{cwd:t,maxBuffer:10485760,timeout:30000});if(r&&!i)throw Error(r);let a=JSON.parse(i);if(a.error)throw Error(a.error);return{success:!0,compressed:a.decompressed_text,metadata:{originalTokens:a.metadata.original_tokens,decompressedTokens:a.metadata.decompressed_tokens,tokenChangePercent:a.metadata.token_change_percent}}}catch(n){return{success:!1,error:n instanceof Error?n.message:"Unknown error"}}}var ni=Ba({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:Zn.string().describe("Text to compress"),level:Zn.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 i=await Ga(t);return JSON.stringify(i,null,2)}});import{tool as Qa}from"@opencode-ai/plugin";import{z as ae}from"zod";import{readFile as Za}from"fs/promises";import{join as es}from"path";import{readFile as be,writeFile as gt}from"fs/promises";import{join as re}from"path";var Xa=5;async function oe(e){let t=re(e,".opencode","config.json"),n=await be(t,"utf-8");return JSON.parse(n).agents||{}}async function we(e,t){let n=re(e,".opencode","config.json"),i=await be(n,"utf-8"),r=JSON.parse(i);r.agents={...r.agents,...t},r.modelSwitcher=r.modelSwitcher||{},r.modelSwitcher.lastUpdated=Date.now(),await gt(n,JSON.stringify(r,null,2))}async function Re(e){let t=re(e,".opencode","model-switcher-history.json");try{let n=await be(t,"utf-8");return JSON.parse(n)}catch{return[]}}async function De(e,t){let n=re(e,".opencode","model-switcher-history.json"),i=await Re(e);i=[{...t,timestamp:Date.now()},...i].slice(0,Xa),await gt(n,JSON.stringify(i,null,2))}async function Ne(e){let t=re(e,".opencode","config.json"),n=await be(t,"utf-8"),i=JSON.parse(n),r={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()}};if(i.modelSwitcher?.presets){for(let[s,o]of Object.entries(i.modelSwitcher.presets))if(r[s]&&typeof o==="object")r[s].config=o}let a=i.modelSwitcher?.customPresets||{};return{...r,...a}}async function ii(e,t,n){let i=re(e,".opencode","config.json"),r=await be(i,"utf-8"),a=JSON.parse(r);a.modelSwitcher=a.modelSwitcher||{},a.modelSwitcher.customPresets=a.modelSwitcher.customPresets||{},a.modelSwitcher.customPresets[t]=n,await gt(i,JSON.stringify(a,null,2))}var G={"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 Oe(e){return Object.values(G).filter((t)=>t.provider===e).sort((t,n)=>{let i={flagship:0,balanced:1,fast:2};return i[t.tier]-i[n.tier]})}function Le(e){return G[e]?.displayName||e}function ft(e){return e in G}function ts(){return process.cwd()}var ri=Qa({description:"Intelligent agent and subagent model manager with presets and history",args:{action:ae.enum(["set","set-all","preset","status","available","create-preset","list-presets","history","rollback","costs","validate"]),agent:ae.string().optional(),model:ae.string().optional(),preset:ae.string().optional(),presetName:ae.string().optional(),historyIndex:ae.number().optional()},async execute(e){let t=ts();switch(e.action){case"set":return await ns(e.agent,e.model,t),JSON.stringify({success:!0,message:`${e.agent} updated`});case"set-all":return await is(e.model,t),JSON.stringify({success:!0,message:"All agents updated"});case"preset":return await oi(e.preset,t),JSON.stringify({success:!0,message:`Preset '${e.preset}' applied`});case"status":return JSON.stringify(await os(t),null,2);case"available":return JSON.stringify(as(),null,2);case"create-preset":return await rs(e.presetName,t),JSON.stringify({success:!0,message:`Preset '${e.presetName}' created`});case"list-presets":return JSON.stringify(await ss(t),null,2);case"history":return JSON.stringify(await cs(t),null,2);case"rollback":return await ds(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(us(t),null,2)}}});async function ns(e,t,n){if(!ft(t))throw Error(`Model '${t}' not found. Use /models available to list options.`);let i=await oe(n);if(!i[e]){let r=Object.keys(i).join(", ");throw Error(`Agent '${e}' not found. Valid agents: ${r}`)}await we(n,{[e]:{model:t}}),await De(n,{type:"agent",agent:e,model:t})}async function is(e,t){if(!ft(e))throw Error(`Model '${e}' not found. Use /models available to list options.`);let n=await oe(t),i={};for(let r of Object.keys(n))i[r]={model:e};await we(t,i),await De(t,{type:"all",model:e})}async function oi(e,t){let n=await Ne(t),i=n[e];if(!i){let r=Object.keys(n).join(", ");throw Error(`Preset '${e}' not found. Available: ${r}`)}await we(t,i.config),await De(t,{type:"preset",name:e})}async function rs(e,t){let n=await oe(t);await ii(t,e,{description:`Custom preset: ${e}`,config:n,createdAt:Date.now()})}async function os(e){let t=await oe(e),n=await Ne(e),i=es(e,".opencode","config.json"),r=JSON.parse(await Za(i,"utf-8")),a=Object.entries(t).map(([o,c])=>({agent:o,model:c.model,provider:G[c.model]?.provider||"unknown",displayName:Le(c.model),enabled:c.enabled!==!1})),s=Object.keys(n).filter((o)=>["performance","quality","balanced","economy"].includes(o));return{agents:a,builtInPresets:s,customPresets:Object.keys(n).filter((o)=>!["performance","quality","balanced","economy"].includes(o)),setupComplete:r.modelSwitcher?.setupComplete||!1,totalAgents:a.length}}function as(){let e=Object.values(G).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:Oe("anthropic"),openai:Oe("openai"),google:Oe("google")};return{models:e,byProvider:t}}async function ss(e){let t=await Ne(e),n={};for(let[i,r]of Object.entries(t))n[i]={description:r.description,agentCount:Object.keys(r.config).length,createdAt:r.createdAt};return{presets:n}}async function cs(e){let n=(await Re(e)).map((i,r)=>({index:r,timestamp:new Date(i.timestamp).toISOString(),type:i.type,description:ls(i)}));return{history:n,total:n.length}}function ls(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 ds(e,t){let n=await Re(t),i=n[e];if(!i||!i.model)throw Error(`History entry ${e} not found or invalid. Total entries: ${n.length}`);if(i.type==="preset"){if(typeof i.name==="string")await oi(i.name,t)}else{let r=await oe(t),a=i.type==="all"?void 0:i.agent,s=i.model,o=a?{[a]:{model:s}}:Object.fromEntries(Object.keys(r).map((c)=>[c,{model:s}]));await we(t,o)}}function us(e){return{valid:!0,message:"Configuration is valid",modelCount:Object.keys(G).length}}import*as L from"fs";import*as Ie from"path";import*as pi from"os";x();import*as ht from"path";import*as ai from"os";var ku=S("kraken-todo"),ps=ht.join(ai.homedir(),".kraken"),Cu=ht.join(ps,"todos");x();import*as yt from"path";import*as si from"os";var Eu=S("kraken-transcript"),ms=yt.join(si.homedir(),".kraken"),Tu=yt.join(ms,"transcripts");x();var Nu=S("todo-manager");x();import{promises as ci}from"fs";import{join as bt,dirname as gs}from"path";import*as li from"os";var fs=S("transcript-manager");var hs="utf-8";function ys(e,t){if(t)return bt(t,`${e}.jsonl`);let n=bt(li.homedir(),".claude","transcripts");return bt(n,`${e}.jsonl`)}async function wt(e,t,n){let i=ys(e,n);try{await ci.mkdir(gs(i),{recursive:!0});let r={...t,timestamp:t.timestamp||Date.now()},a=JSON.stringify(r)+`
|
|
1749
|
+
`;await ci.appendFile(i,a,hs)}catch(r){fs.error("Error appending transcript entry:",r)}}async function Fe(e,t,n,i,r){let a={role:"assistant",content:"",timestamp:Date.now(),toolName:t,toolInput:n,toolOutput:i};await wt(e,a,r)}async function di(e,t,n){let i={role:"user",content:t,timestamp:Date.now()};await wt(e,i,n)}async function ui(e,t,n){let i={role:"assistant",content:t,timestamp:Date.now()};await wt(e,i,n)}var St=Ie.join(pi.homedir(),".opencode","kraken-code"),At=Ie.join(St,"sessions");function mi(e){return Ie.join(At,`${e}.json`)}function gi(){if(!L.existsSync(St))L.mkdirSync(St,{recursive:!0});if(!L.existsSync(At))L.mkdirSync(At,{recursive:!0})}function fi(e){try{gi();let t=mi(e);if(!L.existsSync(t))return null;let n=L.readFileSync(t,"utf-8");return JSON.parse(n)}catch(t){return console.error(`[storage] Error reading state for session ${e}:`,t),null}}function xt(e,t){try{gi();let n=mi(e);L.writeFileSync(n,JSON.stringify(t,null,2))}catch(n){console.error(`[storage] Error writing state for session ${e}:`,n)}}var bs=`You are Ralph, a specialized iteration agent focused on achieving completion promises.
|
|
1750
1750
|
|
|
1751
1751
|
Your methodology:
|
|
1752
1752
|
1. Analyze current state against promise criteria
|
|
@@ -1757,19 +1757,19 @@ Your methodology:
|
|
|
1757
1757
|
|
|
1758
1758
|
Remember: You complement Kraken's orchestration. Kraken plans the overall approach; you ensure that specific promise is satisfied.
|
|
1759
1759
|
Don't re-plan—just iterate toward the specific promise criteria.
|
|
1760
|
-
`,
|
|
1760
|
+
`,hi=24;function yi(e,t){let n=t?.config??{enabled:!0},i=new Map;function r(l){let u=l.match(/<promise>\s*([\s\S]*?)\s*<\/promise>/i);if(!u)return null;let p=u[1].trim(),m=l.match(/<user-task>\s*([\s\S]*?)\s*<\/user-task>/i),g=m?m[1].trim():l.split("<promise>")[0].trim();return{promise:p,task:g}}function a(l,u,p,m=hi){let g={sessionID:l,promise:u,task:p,maxIterations:m,currentIteration:0,status:"active",transcript:[],startTime:Date.now()};return i.set(l,g),g}function s(l){if(l.currentIteration===0)return"No previous iterations.";return l.transcript.slice(-l.currentIteration*2).join(`
|
|
1761
1761
|
---
|
|
1762
|
-
`)||`Iteration ${l.currentIteration} completed.`}function o(l){return
|
|
1763
|
-
`).trim()}return{"chat.message":async(l,u)=>{if(!n.enabled)return;let{sessionID:p}=l,m=c(u.parts),g=r(m);if(!g)return;let{promise:f,task:b}=g,y=
|
|
1762
|
+
`)||`Iteration ${l.currentIteration} completed.`}function o(l){return bs.replace("{prompt}",l.task).replace("{promise}",l.promise).replace("{iterations}",s(l))}function c(l){return l.filter((u)=>u.type==="text").map((u)=>("text"in u)?u.text:"").join(`
|
|
1763
|
+
`).trim()}return{"chat.message":async(l,u)=>{if(!n.enabled)return;let{sessionID:p}=l,m=c(u.parts),g=r(m);if(!g)return;let{promise:f,task:b}=g,y=fi(p);if(y&&y.status==="active"){if(y.currentIteration++,y.transcript.push(`Iteration ${y.currentIteration}:
|
|
1764
1764
|
${m}
|
|
1765
|
-
`),y.currentIteration>=y.maxIterations)y.status="maxed_out",console.log(`[ralph-loop] Session ${p} reached max iterations (${y.maxIterations})`);wt(p,y),console.log(`[ralph-loop] Continuing iteration ${y.currentIteration}/${y.maxIterations} for session ${p}`),console.log(`[ralph-loop] Next prompt: ${o(y).substring(0,100)}...`)}else{let k=n.maxIterations??gi,v=a(p,f,b,k);console.log(`[ralph-loop] Starting new session ${p} with promise: "${f.substring(0,50)}..."`),wt(p,v),i.set(p,v)}}}}import{exec as hs}from"node:child_process";import{readFile as ys,writeFile as bs,mkdir as ws}from"node:fs/promises";import{existsSync as xt,readFileSync as Ss}from"node:fs";import{join as ae,dirname as As}from"node:path";import{homedir as xs}from"node:os";import{fileURLToPath as ks}from"node:url";var bi="kraken-code",St=86400000,Fe=ae(xs(),".config","kraken-code","cache"),wi="update-check.json",R=process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1"||process.env.KRAKEN_LOG==="1",E=x("auto-update-checker"),oe="",hi=null;function At(){if(!oe)try{let e=As(ks(import.meta.url)),t=[ae(e,"..","package.json"),ae(e,"..","..","package.json"),ae(e,"..","..","..","package.json")];for(let n of t)try{if(xt(n)){let i=JSON.parse(Ss(n,"utf-8"));if(i.name===bi&&i.version){oe=i.version;break}}}catch{}if(!oe)oe="0.0.0"}catch{oe="0.0.0"}return oe}function Si(e){let t=e.cacheDir??Fe;return ae(t,wi)}async function Cs(e){try{let t=Si(e);if(!xt(t))return null;let n=await ys(t,"utf-8");return JSON.parse(n)}catch(t){return null}}async function vs(e,t){try{let n=e.cacheDir??Fe;if(!xt(n))await ws(n,{recursive:!0});let i=Si(e);await bs(i,JSON.stringify(t,null,2),"utf-8")}catch(n){if(R)E.warn("Failed to save cache:",n)}}async function Ps(){return new Promise((e)=>{hs(`npm view ${bi} version`,(t,n,i)=>{if(t){if(R)E.warn("Failed to check npm registry:",t);e(null);return}if(i){if(R)E.warn("npm error:",i);e(null);return}let r=n.trim();if(r)e(r);else e(null)})})}function Es(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let r=0;r<Math.max(n.length,i.length);r++){let a=n[r]??0,s=i[r]??0;if(a>s)return 1;if(a<s)return-1}return 0}async function yi(e){let t=At(),n=e.cacheTTL??St,i=Date.now(),r=await Cs(e);if(hi=r,r&&i-r.lastChecked<n){if(R)E.debug(`Using cached update check from ${new Date(r.lastChecked).toISOString()}`);return{updateAvailable:r.updateAvailable,latestVersion:r.latestVersion}}if(R)E.debug("Checking npm registry for updates...");let a=await Ps();if(!a){if(R)E.debug("Could not determine latest version");return{updateAvailable:!1,latestVersion:null}}let s=Es(a,t)>0,o={currentVersion:t,latestVersion:a,lastChecked:i,updateAvailable:s};return await vs(e,o),hi=o,{updateAvailable:s,latestVersion:a}}function Ai(e,t){let n=t?.config??{enabled:!0,checkOnLoad:!0,cacheDir:Fe,cacheTTL:St,notify:!0,checkInterval:St};return{config:async(i)=>{if(!n.enabled)return;if(n.checkOnLoad){if(R)E.debug("Checking for updates on load...");let{updateAvailable:r,latestVersion:a}=await yi(n);if(r&&n.notify){if(R)E.info("UPDATE AVAILABLE"),E.info(`Current version: ${At()}`),E.info(`Latest version: ${a}`),E.info("To update, run: npm update kraken-code (or bun update kraken-code)")}else if(!r){if(R)E.debug(`You are using the latest version: ${At()}`)}}},event:async(i)=>{if(!n.enabled)return;if(i.event?.type==="installation.updated"){if(R)E.debug("Installation was updated");let r=n.cacheDir??Fe,a=ae(r,wi);try{let{unlink:s}=await import("node:fs/promises");if(await s(a),R)E.debug("Cleared update cache")}catch(s){}}if(i.event?.type==="installation.update-available"){if(R)E.debug("New update available");let{latestVersion:r}=await yi(n);if(r){if(R)E.debug(`Latest version: ${r}`)}}}}}import{tool as xi}from"@opencode-ai/plugin";import{z as W}from"zod";import{execFile as Ts}from"node:child_process";import{promisify as Ms}from"node:util";var Rs=Ms(Ts);async function ki(e,t,n){let i=["--json","--pattern",e,"--lang",t];if(n?.replace)i.push("--replace",n.replace);if(n?.path)i.push("--path",n.path);if(n?.glob)i.push("--glob",n.glob);try{let{stdout:r,stderr:a}=await Rs("sg",i,{maxBuffer:10485760,timeout:30000});if(a&&!r)return{success:!1,error:a};try{let s=JSON.parse(r);return{success:!0,matches:s.matches||[],count:s.count||0}}catch{return{success:!0,matches:[],count:0}}}catch(r){if(r instanceof Error&&r.message.includes("ENOENT"))return{success:!1,error:"ast-grep CLI not installed. Install with: npm install -g @ast-grep/cli"};return{success:!1,error:r instanceof Error?r.message:"Unknown error"}}}var Ci=xi({description:"Search code using AST patterns. More powerful than regex as it understands code structure. Example patterns: 'function $_$ { $body$ }' to find all functions, '$A = $B' to find assignments.",args:{pattern:W.string().describe("AST pattern to search for (use $VAR for variables)"),language:W.string().describe("Programming language (typescript, javascript, python, rust, go, java, cpp, etc.)"),path:W.string().optional().describe("Directory or file to search in (default: current directory)"),glob:W.string().optional().describe("File glob pattern (e.g., '*.ts', 'src/**/*.ts')")},async execute(e){let{pattern:t,language:n,path:i,glob:r}=e,a=await ki(t,n,{path:i,glob:r});return JSON.stringify(a,null,2)}}),vi=xi({description:"Search and replace code using AST patterns. Safer than regex replacement as it respects code structure. Use the same variable names in replacement to preserve matched content.",args:{pattern:W.string().describe("AST pattern to search for"),replacement:W.string().describe("AST pattern to replace with (use $VAR to reference matched variables)"),language:W.string().describe("Programming language"),path:W.string().optional().describe("Directory or file to search in (default: current directory)"),glob:W.string().optional().describe("File glob pattern")},async execute(e){let{pattern:t,replacement:n,language:i,path:r,glob:a}=e,s=await ki(t,i,{replace:n,path:r,glob:a});return JSON.stringify(s,null,2)}});import*as H from"fs";import*as Ct from"path";import*as Pi from"os";import{tool as Ds}from"@opencode-ai/plugin";import{z as be}from"zod";var kt=Ct.join(Pi.homedir(),".opencode","sessions");function q(){if(!H.existsSync(kt))H.mkdirSync(kt,{recursive:!0});return kt}function Ns(){let e=q();if(!H.existsSync(e))return[];let t=[];try{let n=H.readdirSync(e);for(let i of n){if(!i.endsWith(".json"))continue;let r=i.slice(0,-5),a=Ct.join(e,i);try{let s=H.readFileSync(a,"utf-8"),o=JSON.parse(s),c={sessionID:r,created:o.created||o.createdAt||new Date(0).toISOString(),lastActive:o.lastActive||o.updatedAt||new Date().toISOString(),messageCount:o.messageCount||o.messages?.length||0,agent:o.agent,duration:o.duration,fileCount:o.fileCount,editCount:o.editCount,toolUsage:o.toolUsage||{}};t.push({sessionID:r,path:a,metadata:c})}catch(s){console.error(`[session-list] Error reading session ${r}:`,s)}}}catch(n){console.error("[session-list] Error reading sessions directory:",n)}return t}function Os(e,t,n){if(!t&&!n)return e;let i=t?new Date(t).getTime():0,r=n?new Date(n).getTime():1/0;return e.filter((a)=>{let s=new Date(a.metadata.lastActive).getTime();return s>=i&&s<=r})}function Ls(e,t="desc"){return[...e].sort((n,i)=>{let r=new Date(n.metadata.lastActive).getTime(),a=new Date(i.metadata.lastActive).getTime();return t==="asc"?r-a:a-r})}var vt=Ds({description:"List all OpenCode sessions with filtering and pagination options.",args:{limit:be.number().int().min(1).max(1000).optional(),startDate:be.string().optional(),endDate:be.string().optional(),order:be.enum(["asc","desc"]).optional(),includeMetadata:be.boolean().default(!1)},async execute(e){try{let{limit:t,startDate:n,endDate:i,order:r,includeMetadata:a}=e,s=Ns();if(n||i)s=Os(s,n,i);if(s=Ls(s,r),t)s=s.slice(0,t);let o=s.map((c)=>{if(a)return{sessionID:c.metadata.sessionID,created:c.metadata.created,lastActive:c.metadata.lastActive,messageCount:c.metadata.messageCount,agent:c.metadata.agent,duration:c.metadata.duration,fileCount:c.metadata.fileCount,editCount:c.metadata.editCount,toolUsage:c.metadata.toolUsage};else return{sessionID:c.metadata.sessionID,created:c.metadata.created,lastActive:c.metadata.lastActive,messageCount:c.metadata.messageCount,agent:c.metadata.agent}});return JSON.stringify({success:!0,count:o.length,sessions:o})}catch(t){return console.error("[session-list] Error:",t),JSON.stringify({success:!1,error:String(t),sessions:[]})}}});import*as $e from"fs";import*as Ei from"path";import{tool as Fs}from"@opencode-ai/plugin";import{z as Ie}from"zod";function Is(e){return Ei.join(q(),`${e}.json`)}var Pt=Fs({description:"Read messages from a specific session with pagination and filtering options.",args:{sessionID:Ie.string().describe("Session ID to read from"),limit:Ie.number().int().min(1).max(1000).optional(),offset:Ie.number().int().min(0).default(0).describe("Offset for pagination"),includeMetadata:Ie.boolean().default(!1).describe("Include full session metadata")},async execute(e){try{let{sessionID:t,limit:n,offset:i,includeMetadata:r}=e,a=Is(t);if(!$e.existsSync(a))return JSON.stringify({success:!1,error:`Session ${t} not found`,sessionID:t});let s=$e.readFileSync(a,"utf-8"),o=JSON.parse(s),c=o.messages||[],l=c;if(i>0||n)l=c.slice(i,n?i+n:void 0);let u={sessionID:t,messages:l,partial:c.length>l.length,metadata:{sessionID:t,created:o.created||o.createdAt||new Date(0).toISOString(),lastActive:o.lastActive||o.updatedAt||new Date().toISOString(),messageCount:c.length,agent:o.agent,duration:o.duration,fileCount:o.fileCount,editCount:o.editCount,toolUsage:o.toolUsage||{}}},p={success:!0,sessionID:t,totalMessages:c.length,returnedMessages:l.length,offset:i,limit:n||c.length,partial:u.partial,messages:l};if(r)p.metadata=u.metadata;return JSON.stringify(p)}catch(t){return console.error("[session-read] Error:",t),JSON.stringify({success:!1,error:String(t),sessionID:e.sessionID})}}});import*as z from"fs";import*as _e from"path";import*as Mi from"os";import{tool as $s}from"@opencode-ai/plugin";import{z as je}from"zod";var Tp=_e.join(Mi.homedir(),".opencode","sessions");function js(e){try{let t=z.readFileSync(e,"utf-8"),n=JSON.parse(t),i=new Map;if(n.messages&&Array.isArray(n.messages))n.messages.forEach((r,a)=>{let s=r.role||"unknown",o=r.content||"";if(o&&typeof o==="string"&&o.length>0){let c={type:s==="user"?"user_message":"assistant_message",index:a,content:o,context:o};i.set(o,c)}});return i}catch(t){return console.error(`[session-search] Error indexing session ${e}:`,t),null}}function Ti(e,t){let n=e.toLowerCase(),i=t.content.toLowerCase(),r=0,a=i===n;if(a)r+=100;if(i.includes(n)&&!a)r+=50;let o=n.split(/\s+/),c=0;for(let l of o)if(l.length>2&&i.includes(l))c++;if(r+=c*10,t.type==="user_message")r+=20;return Math.min(r,100)}function _s(){let e=q();if(!z.existsSync(e))return[];let t=[];try{let n=z.readdirSync(e);for(let i of n){if(!i.endsWith(".json"))continue;let r=i.slice(0,-5),a=_e.join(e,i);try{let s=z.readFileSync(a,"utf-8"),o=JSON.parse(s),c={sessionID:r,created:o.created||o.createdAt||new Date(0).toISOString(),lastActive:o.lastActive||o.updatedAt||new Date().toISOString(),messageCount:o.messageCount||o.messages?.length||0,agent:o.agent,duration:o.duration,fileCount:o.fileCount,editCount:o.editCount,toolUsage:o.toolUsage||{}};t.push({sessionID:r,filePath:a,metadata:c})}catch(s){console.error(`[session-search] Error reading session ${r}:`,s)}}}catch(n){console.error("[session-search] Error reading sessions directory:",n)}return t}var Et=$s({description:"Full-text search across all OpenCode sessions with ranked results.",args:{q:je.string().describe("Search query text"),limit:je.number().int().min(1).max(100).default(10).describe("Maximum number of results to return"),offset:je.number().int().min(0).default(0).describe("Offset for pagination"),sessionID:je.string().optional().describe("Search within a specific session only")},async execute(e){try{let{q:t,limit:n,offset:i,sessionID:r}=e;if(!t||t.trim().length===0)return JSON.stringify({success:!1,error:"Query cannot be empty",results:[]});let a=[];if(r){let c=q(),l=_e.join(c,`${r}.json`);a=[{sessionID:r,filePath:l,metadata:{sessionID:r,created:"",lastActive:"",messageCount:0,toolUsage:{}}}]}else a=_s();let s=[];for(let c of a){let l=js(c.filePath);if(!l)continue;let u=[];for(let[p,m]of l.entries())if(Ti(t,m)>10)u.push(m);if(u.length>0){let p=u.reduce((m,g)=>m+Ti(t,g),0)/u.length;s.push({sessionID:c.sessionID,filePath:c.filePath,metadata:c.metadata,score:Math.round(p),matches:u.slice(0,5)})}}s.sort((c,l)=>l.score-c.score);let o=s.slice(i,i+n);return JSON.stringify({success:!0,query:t,total:s.length,offset:i,limit:n,results:o.map((c)=>({sessionID:c.sessionID,score:c.score,matchCount:c.matches.length,lastActive:c.metadata.lastActive,messageCount:c.metadata.messageCount,agent:c.metadata.agent,matches:c.matches.map((l)=>({type:l.type,index:l.index,content:l.content.slice(0,200)+(l.content.length>200?"...":"")}))}))})}catch(t){return console.error("[session-search] Error:",t),JSON.stringify({success:!1,error:String(t),results:[]})}}});import*as Ue from"fs";import*as Tt from"path";import{tool as Us}from"@opencode-ai/plugin";import{z as Ws}from"zod";var Lp=Tt.join(process.env.HOME||"",".opencode","sessions");function Hs(e){return Tt.join(q(),`${e}.json`)}function qs(e){let t=Hs(e);if(!Ue.existsSync(t))return null;try{let n=Ue.readFileSync(t,"utf-8"),i=JSON.parse(n);return{sessionID:e,created:i.created||i.createdAt||new Date(0).toISOString(),lastActive:i.lastActive||i.updatedAt||new Date().toISOString(),messageCount:i.messageCount||i.messages?.length||0,agent:i.agent,duration:i.duration,fileCount:i.fileCount,editCount:i.editCount,toolUsage:i.toolUsage||{}}}catch(n){return console.error(`[session-info] Error reading session ${e}:`,n),null}}function Ks(e){let t={totalMessages:e.messageCount,totalToolsUsed:Object.values(e.toolUsage||{}).reduce((n,i)=>n+i,0),mostUsedTool:"",mostUsedToolCount:0,averageMessagesPerMinute:0};if(e.duration)t.averageMessagesPerMinute=e.messageCount/(e.duration/60000);for(let[n,i]of Object.entries(e.toolUsage||{}))if(i>t.mostUsedToolCount)t.mostUsedTool=n,t.mostUsedToolCount=i;return t}var Mt=Us({description:"Get detailed metadata and statistics about a specific session.",args:{sessionID:Ws.string().describe("Session ID to query")},async execute(e){try{let{sessionID:t}=e,n=qs(t);if(!n)return JSON.stringify({success:!1,error:`Session ${t} not found`,sessionID:t});let i=Ks(n);return JSON.stringify({success:!0,sessionID:n.sessionID,created:n.created,lastActive:n.lastActive,messageCount:n.messageCount,agent:n.agent,duration:n.duration,fileCount:n.fileCount,editCount:n.editCount,toolUsage:n.toolUsage,stats:{totalMessages:i.totalMessages,totalToolsUsed:i.totalToolsUsed,mostUsedTool:i.mostUsedTool,mostUsedToolCount:i.mostUsedToolCount,averageMessagesPerMinute:i.averageMessagesPerMinute.toFixed(2)}})}catch(t){return console.error("[session-info] Error:",t),JSON.stringify({success:!1,error:String(t),sessionID:e.sessionID})}}});import{tool as Bs}from"@opencode-ai/plugin";import{z as we}from"zod";import{execFile as Js}from"node:child_process";import{promisify as Ys}from"node:util";var Vs=Ys(Js);async function zs(e,t){if(!e.trim())return{success:!1,error:"Pattern must not be empty"};let n=["--line-number","--column","--color=never"];if(n.push("--max-count","200"),n.push("--max-filesize","1M"),n.push("--max-depth","4"),t?.context)n.push("-C",String(t.context));if(t?.invert)n.push("-v");if(t?.type)n.push(`--type=${t.type}`);n.push(e),n.push(t?.path??process.cwd());try{let{stdout:i}=await Vs("rg",n,{maxBuffer:10485760,timeout:30000}),r=[],a=i.split(`
|
|
1766
|
-
`);for(let s of a){if(!s.trim())continue;let o=s.match(/^([^:]+):(\d+):(\d+):(.+)$/);if(o)r.push({file:o[1],line:parseInt(o[2],10),column:parseInt(o[3],10),lineContent:o[4]})}return{success:!0,matches:r,count:r.length}}catch(i){if(i instanceof Error&&i.message.includes("ENOENT"))return{success:!1,error:"ripgrep (rg) not installed. Install with: apt install ripgrep or brew install ripgrep"};return{success:!1,error:i instanceof Error?i.message:"Unknown error"}}}var Ri=Bs({description:"Search for text patterns in files using ripgrep. Supports regex and file type filtering. Example: grep({pattern: 'function \\w+', type: 'ts', context: 2})",args:{pattern:we.string().describe("Regex pattern to search for"),path:we.string().optional().describe("Directory or file to search in (default: current directory)"),type:we.string().optional().describe("Filter by file type (ts, js, py, rust, go, java, etc.)"),context:we.number().optional().describe("Number of context lines around each match (default: 0)"),invert:we.boolean().optional().describe("Show lines that do NOT match the pattern")},async execute(e){let{pattern:t,path:n,type:i,context:r,invert:a}=e,s=await zs(t,{path:n,type:i,context:r,invert:a});if(!s.success)return JSON.stringify(s,null,2);return JSON.stringify({success:!0,matches:s.matches?.slice(0,100),count:s.count,message:s.count&&s.count>100?`Showing 100 of ${s.count} matches`:void 0},null,2)}});import{tool as Gs}from"@opencode-ai/plugin";import{z as Rt}from"zod";var Di=Gs({description:"Control Ralph-Loop iterations for achieving completion promises. Ralph complements Kraken's PDSA cycles by iteratively refining until <promise> is satisfied. Automatically triggered when chat contains <promise>...</promise> pattern, or use this tool for manual control.",args:{command:Rt.enum(["status","cancel","continue","info"]).describe("Ralph-Loop command"),sessionID:Rt.string().optional().describe("Session ID (required for status, cancel)"),maxIterations:Rt.number().min(1).max(100).optional().describe("Max iterations (default: 24)")},async execute(e){let{command:t,sessionID:n,maxIterations:i}=e;switch(t){case"status":if(!n)return JSON.stringify({success:!1,error:"sessionID required for status command"});return JSON.stringify({success:!0,session:{sessionID:n,status:"active",promise:"Use /ralph-loop in chat to start a new session",task:"N/A",currentIteration:0,maxIterations:i??24,elapsedMs:0}});case"cancel":if(!n)return JSON.stringify({success:!1,error:"sessionID required for cancel command"});return JSON.stringify({success:!0,message:`Session ${n} cancelled`});case"continue":if(!n)return JSON.stringify({success:!1,error:"sessionID required for continue command"});return JSON.stringify({success:!0,message:`Session ${n} continuing to next iteration`});case"info":return JSON.stringify({success:!0,info:{description:"Ralph-Loop: Self-referential iteration agent that continues until completion promise is satisfied",triggers:["Chat message contains <promise>...</promise> pattern","User types /ralph-loop [task] <promise>...</promise>"],defaults:{maxIterations:24,timeout:"None (continues until promise met or max iterations)"},complement:"Ralph complements Kraken's PDSA cycles. Kraken orchestrates; Ralph iterates."}});default:return JSON.stringify({success:!1,error:`Unknown command: ${t}`})}}});import{tool as L}from"@opencode-ai/plugin";import{z as h}from"zod";import{promises as Dt}from"node:fs";import*as Nt from"node:os";import*as Se from"node:path";var Ni=Se.join(Nt.homedir(),".kraken","learning"),Oi="learning-state.json",S={experiences:[],knowledgeNodes:[],knowledgeEdges:[],patterns:[],schedules:[],stateMachines:[]},Li=!1;async function Ot(){let e=X();if(e.enabled===!1)return{ready:!1,loaded:0};let t=Ji(e.storagePath);return await Yi(t),S=await Xs(t),Li=!0,{ready:!0,loaded:S.experiences.length+S.knowledgeNodes.length+S.patterns.length}}async function Fi(e){let t=X();await se();let n=new Date().toISOString(),i={id:`exp_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,createdAt:n,updatedAt:n,summary:e.summary,details:e.details,tags:e.tags??[],outcome:e.outcome,confidence:e.confidence,relatedNodeIds:e.relatedNodeIds??[]};if(t.experienceStore?.enabled===!1||t.enabled===!1)return i;S.experiences.unshift(i);let r=t.experienceStore?.maxEntries??2000;if(S.experiences.length>r)S.experiences=S.experiences.slice(0,r);if(t.patternDetection?.enabled!==!1)Qs(i,t);return await G(t),i}function Ii(e){let t=e.toLowerCase();return S.experiences.filter((n)=>{let i=n.tags?.join(" ").toLowerCase()??"";return n.summary.toLowerCase().includes(t)||n.details.toLowerCase().includes(t)||i.includes(t)})}async function $i(e){let t=X();await se();let n=new Date().toISOString(),i={id:`node_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,createdAt:n,updatedAt:n,title:e.title,content:e.content,type:e.type??"concept",tags:e.tags??[],sources:e.sources??[],metadata:e.metadata??{}};if(t.knowledgeGraph?.enabled===!1||t.enabled===!1)return i;S.knowledgeNodes.unshift(i);let r=t.knowledgeGraph?.maxNodes??5000;if(S.knowledgeNodes.length>r)S.knowledgeNodes=S.knowledgeNodes.slice(0,r);if(t.spacedRepetition?.enabled!==!1)Vi(i.id,t);return await G(t),i}function ji(e){let t=e.toLowerCase();return S.knowledgeNodes.filter((n)=>{let i=n.tags?.join(" ").toLowerCase()??"";return n.title.toLowerCase().includes(t)||n.content.toLowerCase().includes(t)||i.includes(t)})}async function _i(e,t,n,i=0.5){let r=X();await se();let a={id:`edge_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,sourceId:e,targetId:t,relation:n,strength:i,createdAt:new Date().toISOString()};if(r.knowledgeGraph?.enabled===!1||r.enabled===!1)return a;return S.knowledgeEdges.push(a),await G(r),a}async function Ui(e){let t=X();await se();let n=new Date().toISOString(),i=S.patterns.find((s)=>s.name===e.name);if(i)return i.description=e.description,i.triggers=e.triggers??i.triggers,i.confidence=e.confidence??i.confidence,i.evidence=e.evidence??i.evidence,i.occurrences+=1,i.lastSeen=n,i.updatedAt=n,await G(t),i;let r={id:`pattern_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:e.name,description:e.description,triggers:e.triggers??[],confidence:e.confidence??0.5,evidence:e.evidence??[],occurrences:1,lastSeen:n,createdAt:n,updatedAt:n};if(t.patternDetection?.enabled===!1||t.enabled===!1)return r;S.patterns.unshift(r);let a=t.patternDetection?.maxPatterns??500;if(S.patterns.length>a)S.patterns=S.patterns.slice(0,a);return await G(t),r}function Wi(e=0){return S.patterns.filter((t)=>t.confidence>=e)}function Hi(e){let t=e?new Date(e).getTime():Date.now();return S.schedules.filter((n)=>{return new Date(n.nextReview).getTime()<=t})}async function qi(e,t){let n=X();await se();let i=Math.min(5,Math.max(0,t)),r=Zs(e,n),a=new Date;if(i<3)r.intervalDays=n.spacedRepetition?.initialIntervalDays??1,r.reviewCount=0;else if(r.reviewCount+=1,r.reviewCount===1)r.intervalDays=n.spacedRepetition?.initialIntervalDays??1;else r.intervalDays=Math.round(r.intervalDays*r.easeFactor);let s=r.easeFactor+(0.1-(5-i)*(0.08+(5-i)*0.02));r.easeFactor=Math.max(1.3,s);let o=n.spacedRepetition?.maxIntervalDays??365;return r.intervalDays=Math.min(r.intervalDays,o),r.lastReviewed=a.toISOString(),r.nextReview=new Date(a.getTime()+r.intervalDays*24*60*60*1000).toISOString(),await G(n),r}async function Ki(e){let t=X();await se();let n=new Date().toISOString(),i={id:`sm_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:e.name,states:e.states,transitions:e.transitions,initialState:e.initialState,currentState:e.initialState,metadata:e.metadata??{},createdAt:n,updatedAt:n};if(t.stateMachines?.enabled===!1||t.enabled===!1)return i;return S.stateMachines.unshift(i),await G(t),i}function Bi(){return[...S.stateMachines]}function X(){let e=xn(),t=An();return{enabled:e?.enabled??t?.enabled??!0,autoSave:e?.autoSave??t?.autoSave??!0,storagePath:e?.storagePath??t?.storagePath??Ni,experienceStore:{enabled:e?.experienceStore?.enabled??!0,maxEntries:e?.experienceStore?.maxEntries??2000},knowledgeGraph:{enabled:e?.knowledgeGraph?.enabled??!0,maxNodes:e?.knowledgeGraph?.maxNodes??5000},patternDetection:{enabled:e?.patternDetection?.enabled??!0,minConfidence:e?.patternDetection?.minConfidence??0.6,maxPatterns:e?.patternDetection?.maxPatterns??500},spacedRepetition:{enabled:e?.spacedRepetition?.enabled??!0,initialIntervalDays:e?.spacedRepetition?.initialIntervalDays??1,easeFactor:e?.spacedRepetition?.easeFactor??2.5,maxIntervalDays:e?.spacedRepetition?.maxIntervalDays??365},stateMachines:{enabled:e?.stateMachines?.enabled??!0}}}function Ji(e){if(!e)return Ni;if(e.startsWith("~/"))return Se.join(Nt.homedir(),e.slice(2));return e}async function Yi(e){await Dt.mkdir(e,{recursive:!0})}async function se(){if(!Li)await Ot()}async function Xs(e){let t=Se.join(e,Oi);try{let n=await Dt.readFile(t,"utf-8"),i=JSON.parse(n);return{experiences:i.experiences??[],knowledgeNodes:i.knowledgeNodes??[],knowledgeEdges:i.knowledgeEdges??[],patterns:i.patterns??[],schedules:i.schedules??[],stateMachines:i.stateMachines??[]}}catch{return{experiences:[],knowledgeNodes:[],knowledgeEdges:[],patterns:[],schedules:[],stateMachines:[]}}}async function G(e){if(e.autoSave===!1||e.enabled===!1)return;let t=Ji(e.storagePath);await Yi(t);let n=Se.join(t,Oi);await Dt.writeFile(n,JSON.stringify(S,null,2),"utf-8")}function Qs(e,t){let n=t.patternDetection?.minConfidence??0.6,i=e.tags??[];for(let r of i){let a=`tag:${r}`,s=`Recurring experience tag "${r}".`,o=S.patterns.find((c)=>c.name===a);if(o)o.occurrences+=1,o.lastSeen=e.createdAt,o.confidence=Math.min(1,o.confidence+0.05),o.updatedAt=new Date().toISOString();else S.patterns.unshift({id:`pattern_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:a,description:s,triggers:[r],confidence:n,evidence:[e.summary],occurrences:1,lastSeen:e.createdAt,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()})}}function Vi(e,t){if(S.schedules.find((a)=>a.nodeId===e))return;let i=t.spacedRepetition?.initialIntervalDays??1,r=new Date;S.schedules.push({nodeId:e,intervalDays:i,easeFactor:t.spacedRepetition?.easeFactor??2.5,nextReview:new Date(r.getTime()+i*24*60*60*1000).toISOString(),reviewCount:0})}function Zs(e,t){let n=S.schedules.find((i)=>i.nodeId===e);if(!n)Vi(e,t),n=S.schedules.find((i)=>i.nodeId===e);if(!n){let i={nodeId:e,intervalDays:t.spacedRepetition?.initialIntervalDays??1,easeFactor:t.spacedRepetition?.easeFactor??2.5,nextReview:new Date().toISOString(),reviewCount:0};return S.schedules.push(i),i}return n}var Lt=h.number().min(0).max(1),zi=L({description:"Add a learning experience to the unified memory system.",args:{summary:h.string().min(1).describe("Short summary of the experience"),details:h.string().min(1).describe("Full details of the experience"),tags:h.array(h.string()).optional().describe("Tags describing the experience"),outcome:h.string().optional().describe("Outcome or result of the experience"),confidence:Lt.optional().describe("Confidence score (0-1)"),relatedNodeIds:h.array(h.string()).optional().describe("Related knowledge node IDs")},async execute(e){let t=await Fi(e);return JSON.stringify({success:!0,experience:t},null,2)}}),Gi=L({description:"Search stored experiences by keyword.",args:{query:h.string().min(1).describe("Search query")},async execute(e){let t=Ii(e.query);return JSON.stringify({success:!0,experiences:t},null,2)}}),Xi=L({description:"Add a knowledge node to the learning graph.",args:{title:h.string().min(1).describe("Node title"),content:h.string().min(1).describe("Node content"),type:h.string().optional().describe("Node type (concept, decision, procedure, etc.)"),tags:h.array(h.string()).optional().describe("Tags associated with the node"),sources:h.array(h.string()).optional().describe("Source references or URLs"),metadata:h.record(h.string(),h.unknown()).optional().describe("Additional metadata")},async execute(e){let t=await $i(e);return JSON.stringify({success:!0,node:t},null,2)}}),Qi=L({description:"Search knowledge nodes by keyword.",args:{query:h.string().min(1).describe("Search query")},async execute(e){let t=ji(e.query);return JSON.stringify({success:!0,nodes:t},null,2)}}),Zi=L({description:"Create a relationship between two knowledge nodes.",args:{sourceId:h.string().min(1).describe("Source node ID"),targetId:h.string().min(1).describe("Target node ID"),relation:h.string().min(1).describe("Relationship description"),strength:h.number().min(0).max(1).optional().describe("Relationship strength (0-1)")},async execute(e){let t=await _i(e.sourceId,e.targetId,e.relation,e.strength??0.5);return JSON.stringify({success:!0,edge:t},null,2)}}),er=L({description:"Record or update a learning pattern.",args:{name:h.string().min(1).describe("Pattern name"),description:h.string().min(1).describe("Pattern description"),triggers:h.array(h.string()).optional().describe("Trigger keywords or signals"),confidence:Lt.optional().describe("Confidence score (0-1)"),evidence:h.array(h.string()).optional().describe("Evidence notes")},async execute(e){let t=await Ui(e);return JSON.stringify({success:!0,pattern:t},null,2)}}),tr=L({description:"List known patterns above a confidence threshold.",args:{minConfidence:Lt.optional().describe("Minimum confidence to include")},async execute(e){let t=Wi(e.minConfidence??0);return JSON.stringify({success:!0,patterns:t},null,2)}}),nr=L({description:"Get the spaced repetition review queue.",args:{dueBefore:h.string().optional().describe("ISO timestamp cutoff for due reviews")},async execute(e){let t=Hi(e.dueBefore);return JSON.stringify({success:!0,queue:t},null,2)}}),ir=L({description:"Record a spaced repetition review for a knowledge node.",args:{nodeId:h.string().min(1).describe("Knowledge node ID"),quality:h.number().min(0).max(5).describe("Review quality score (0-5)")},async execute(e){let t=await qi(e.nodeId,e.quality);return JSON.stringify({success:!0,schedule:t},null,2)}}),rr=L({description:"Create a learning state machine for workflow tracking.",args:{name:h.string().min(1).describe("State machine name"),states:h.array(h.string()).min(1).describe("Possible states"),transitions:h.array(h.object({from:h.string().min(1),to:h.string().min(1),event:h.string().min(1),description:h.string().optional()})).min(1).describe("State transitions"),initialState:h.string().min(1).describe("Initial state"),metadata:h.record(h.string(),h.unknown()).optional().describe("Additional metadata")},async execute(e){let t=await Ki(e);return JSON.stringify({success:!0,machine:t},null,2)}}),or=L({description:"List all learning state machines.",args:{},async execute(){let e=Bi();return JSON.stringify({success:!0,machines:e},null,2)}});var ec=[{keyword:"blitzkrieg",mode:"blitzkrieg",language:"English",aliases:["ulw","max","full"]},{keyword:"ultra work",mode:"blitzkrieg",language:"English"},{keyword:"max performance",mode:"blitzkrieg",language:"English"},{keyword:"go all out",mode:"blitzkrieg",language:"English"},{keyword:"full power",mode:"blitzkrieg",language:"English"},{keyword:"search",mode:"search",language:"English",aliases:["find","locate","look for"]},{keyword:"find",mode:"search",language:"English"},{keyword:"locate",mode:"search",language:"English"},{keyword:"look for",mode:"search",language:"English"},{keyword:"explore",mode:"search",language:"English"},{keyword:"analyze",mode:"analyze",language:"English",aliases:["investigate","examine"]},{keyword:"investigate",mode:"analyze",language:"English"},{keyword:"examine",mode:"analyze",language:"English"},{keyword:"deep analysis",mode:"analyze",language:"English"},{keyword:"detailed analysis",mode:"analyze",language:"English"},{keyword:"ultrathink",mode:"ultrathink",language:"English",aliases:["think deeply","deep think"]},{keyword:"think deeply",mode:"ultrathink",language:"English"},{keyword:"deep think",mode:"ultrathink",language:"English"},{keyword:"extended thinking",mode:"ultrathink",language:"English"},{keyword:"careful reasoning",mode:"ultrathink",language:"English"},{keyword:"blitzkrieg",mode:"blitzkrieg",language:"Spanish",aliases:["ulw","trabajo ultra"]},{keyword:"trabajo ultra",mode:"blitzkrieg",language:"Spanish"},{keyword:"máximo rendimiento",mode:"blitzkrieg",language:"Spanish"},{keyword:"buscar",mode:"search",language:"Spanish",aliases:["encontrar","localizar"]},{keyword:"encontrar",mode:"search",language:"Spanish"},{keyword:"localizar",mode:"search",language:"Spanish"},{keyword:"analizar",mode:"analyze",language:"Spanish",aliases:["investigar","examinar"]},{keyword:"investigar",mode:"analyze",language:"Spanish"},{keyword:"examinar",mode:"analyze",language:"Spanish"},{keyword:"pensar profundamente",mode:"ultrathink",language:"Spanish",aliases:["piensa","razonamiento profundo"]},{keyword:"piensa",mode:"ultrathink",language:"Spanish"},{keyword:"razonamiento profundo",mode:"ultrathink",language:"Spanish"},{keyword:"blitzkrieg",mode:"blitzkrieg",language:"French",aliases:["ulw","travail ultra"]},{keyword:"travail ultra",mode:"blitzkrieg",language:"French"},{keyword:"chercher",mode:"search",language:"French",aliases:["rechercher","trouver"]},{keyword:"rechercher",mode:"search",language:"French"},{keyword:"trouver",mode:"search",language:"French"},{keyword:"analyser",mode:"analyze",language:"French",aliases:["investiguer","examiner"]},{keyword:"investiguer",mode:"analyze",language:"French"},{keyword:"examiner",mode:"analyze",language:"French"},{keyword:"réfléchir profondément",mode:"ultrathink",language:"French",aliases:["réfléchis","pensée profonde"]},{keyword:"réfléchis",mode:"ultrathink",language:"French"},{keyword:"blitzkrieg",mode:"blitzkrieg",language:"German",aliases:["ulw","maximal"]},{keyword:"maximale leistung",mode:"blitzkrieg",language:"German"},{keyword:"suchen",mode:"search",language:"German",aliases:["finden","lokalisieren"]},{keyword:"finden",mode:"search",language:"German"},{keyword:"analysieren",mode:"analyze",language:"German",aliases:["untersuchen","prüfen"]},{keyword:"untersuchen",mode:"analyze",language:"German"},{keyword:"nachdenken",mode:"ultrathink",language:"German",aliases:["denk nach","sorgfältig denken"]},{keyword:"denk nach",mode:"ultrathink",language:"German"},{keyword:"sorgfältig denken",mode:"ultrathink",language:"German"},{keyword:"강력한",mode:"blitzkrieg",language:"Korean",aliases:["울트라워크","최대"]},{keyword:"울트라워크",mode:"blitzkrieg",language:"Korean"},{keyword:"최대",mode:"blitzkrieg",language:"Korean"},{keyword:"최고 성능",mode:"blitzkrieg",language:"Korean"},{keyword:"검색",mode:"search",language:"Korean",aliases:["찾아","찾기"]},{keyword:"찾아",mode:"search",language:"Korean"},{keyword:"찾기",mode:"search",language:"Korean"},{keyword:"분석",mode:"analyze",language:"Korean",aliases:["조사","검토"]},{keyword:"조사",mode:"analyze",language:"Korean"},{keyword:"검토",mode:"analyze",language:"Korean"},{keyword:"생각해",mode:"ultrathink",language:"Korean",aliases:["깊게 생각","신중한 사고"]},{keyword:"깊게 생각",mode:"ultrathink",language:"Korean"},{keyword:"신중한 사고",mode:"ultrathink",language:"Korean"},{keyword:"强力",mode:"blitzkrieg",language:"Chinese (Simplified)",aliases:["超神","最大"]},{keyword:"超神",mode:"blitzkrieg",language:"Chinese (Simplified)"},{keyword:"最大",mode:"blitzkrieg",language:"Chinese (Simplified)"},{keyword:"搜索",mode:"search",language:"Chinese (Simplified)",aliases:["查找","定位"]},{keyword:"查找",mode:"search",language:"Chinese (Simplified)"},{keyword:"定位",mode:"search",language:"Chinese (Simplified)"},{keyword:"分析",mode:"analyze",language:"Chinese (Simplified)",aliases:["调查","检查"]},{keyword:"调查",mode:"analyze",language:"Chinese (Simplified)"},{keyword:"检查",mode:"analyze",language:"Chinese (Simplified)"},{keyword:"深度思考",mode:"ultrathink",language:"Chinese (Simplified)",aliases:["仔细思考","让我想想"]},{keyword:"仔细思考",mode:"ultrathink",language:"Chinese (Simplified)"},{keyword:"让我想想",mode:"ultrathink",language:"Chinese (Simplified)"},{keyword:"强力",mode:"blitzkrieg",language:"Chinese (Traditional)",aliases:["超神","最大"]},{keyword:"超神",mode:"blitzkrieg",language:"Chinese (Traditional)"},{keyword:"最大",mode:"blitzkrieg",language:"Chinese (Traditional)"},{keyword:"搜索",mode:"search",language:"Chinese (Traditional)",aliases:["查找","定位"]},{keyword:"查找",mode:"search",language:"Chinese (Traditional)"},{keyword:"定位",mode:"search",language:"Chinese (Traditional)"},{keyword:"分析",mode:"analyze",language:"Chinese (Traditional)",aliases:["調查","檢查"]},{keyword:"調查",mode:"analyze",language:"Chinese (Traditional)"},{keyword:"檢查",mode:"analyze",language:"Chinese (Traditional)"},{keyword:"深度思考",mode:"ultrathink",language:"Chinese (Traditional)",aliases:["仔細思考","讓我思考"]},{keyword:"仔細思考",mode:"ultrathink",language:"Chinese (Traditional)"},{keyword:"讓我思考",mode:"ultrathink",language:"Chinese (Traditional)"},{keyword:"強力",mode:"blitzkrieg",language:"Japanese",aliases:["最大","フルパワー"]},{keyword:"最大",mode:"blitzkrieg",language:"Japanese"},{keyword:"フルパワー",mode:"blitzkrieg",language:"Japanese"},{keyword:"検索",mode:"search",language:"Japanese",aliases:["探す","見つける"]},{keyword:"探す",mode:"search",language:"Japanese"},{keyword:"見つける",mode:"search",language:"Japanese"},{keyword:"分析",mode:"analyze",language:"Japanese",aliases:["調査","検討"]},{keyword:"調査",mode:"analyze",language:"Japanese"},{keyword:"検討",mode:"analyze",language:"Japanese"},{keyword:"深く考える",mode:"ultrathink",language:"Japanese",aliases:["思考","注意深く考える"]},{keyword:"思考",mode:"ultrathink",language:"Japanese"},{keyword:"注意深く考える",mode:"ultrathink",language:"Japanese"},{keyword:"blitzkrieg",mode:"blitzkrieg",language:"Portuguese",aliases:["ulw","trabalho ultra"]},{keyword:"trabalho ultra",mode:"blitzkrieg",language:"Portuguese"},{keyword:"pesquisar",mode:"search",language:"Portuguese",aliases:["procurar","encontrar"]},{keyword:"procurar",mode:"search",language:"Portuguese"},{keyword:"encontrar",mode:"search",language:"Portuguese"},{keyword:"analisar",mode:"analyze",language:"Portuguese",aliases:["investigar","examinar"]},{keyword:"investigar",mode:"analyze",language:"Portuguese"},{keyword:"examinar",mode:"analyze",language:"Portuguese"},{keyword:"pensar profundamente",mode:"ultrathink",language:"Portuguese",aliases:["pense","raciocínio profundo"]},{keyword:"pense",mode:"ultrathink",language:"Portuguese"},{keyword:"raciocínio profundo",mode:"ultrathink",language:"Portuguese"},{keyword:"blitzkrieg",mode:"blitzkrieg",language:"Italian",aliases:["ulw","lavoro ultra"]},{keyword:"lavoro ultra",mode:"blitzkrieg",language:"Italian"},{keyword:"cercare",mode:"search",language:"Italian",aliases:["trovare","ricercare"]},{keyword:"trovare",mode:"search",language:"Italian"},{keyword:"ricercare",mode:"search",language:"Italian"},{keyword:"analizzare",mode:"analyze",language:"Italian",aliases:["indagare","esaminare"]},{keyword:"indagare",mode:"analyze",language:"Italian"},{keyword:"esaminare",mode:"analyze",language:"Italian"},{keyword:"pensare attentamente",mode:"ultrathink",language:"Italian",aliases:["pensa","pensiero profondo"]},{keyword:"pensa",mode:"ultrathink",language:"Italian"},{keyword:"pensiero profondo",mode:"ultrathink",language:"Italian"},{keyword:"ультраворк",mode:"blitzkrieg",language:"Russian",aliases:["ulw","максимально"]},{keyword:"максимально",mode:"blitzkrieg",language:"Russian"},{keyword:"поиск",mode:"search",language:"Russian",aliases:["найти","искать"]},{keyword:"найти",mode:"search",language:"Russian"},{keyword:"искать",mode:"search",language:"Russian"},{keyword:"анализировать",mode:"analyze",language:"Russian",aliases:["исследовать","изучить"]},{keyword:"исследовать",mode:"analyze",language:"Russian"},{keyword:"изучить",mode:"analyze",language:"Russian"},{keyword:"подумать",mode:"ultrathink",language:"Russian",aliases:["подумай","тщательно подумать"]},{keyword:"подумай",mode:"ultrathink",language:"Russian"},{keyword:"тщательно подумать",mode:"ultrathink",language:"Russian"},{keyword:"ألترا وورك",mode:"blitzkrieg",language:"Arabic",aliases:["العمل القوي","الأقصى"]},{keyword:"بحث",mode:"search",language:"Arabic",aliases:["إيجاد","تحديد موقع"]},{keyword:"تحليل",mode:"analyze",language:"Arabic",aliases:["تحقيق","فحص"]},{keyword:"تفكير عميق",mode:"ultrathink",language:"Arabic",aliases:["فكر","تفكر بعناية"]},{keyword:"فكر",mode:"ultrathink",language:"Arabic"},{keyword:"अल्ट्रावर्क",mode:"blitzkrieg",language:"Hindi",aliases:["अधिकतम","अधिक कार्य"]},{keyword:"अधिकतम",mode:"blitzkrieg",language:"Hindi"},{keyword:"अधिक कार्य",mode:"blitzkrieg",language:"Hindi"},{keyword:"खोज",mode:"search",language:"Hindi",aliases:["ढूंढना","ढूंढो"]},{keyword:"विश्लेषण",mode:"analyze",language:"Hindi",aliases:["जांच","जांचना"]},{keyword:"जांच",mode:"analyze",language:"Hindi"},{keyword:"जांचना",mode:"analyze",language:"Hindi"},{keyword:"गहरी सोच",mode:"ultrathink",language:"Hindi",aliases:["सोचो","ध्यानपूर्वक सोच"]},{keyword:"सोचो",mode:"ultrathink",language:"Hindi"},{keyword:"ध्यानपूर्वक सोच",mode:"ultrathink",language:"Hindi"}];function ar(e){let t=e.toLowerCase(),n=new Map;for(let o of ec){let c=o.keyword.toLowerCase();if(t.includes(c)){if(!n.has(o.mode))n.set(o.mode,new Set);n.get(o.mode).add(o.keyword)}if(o.aliases)for(let l of o.aliases){let u=l.toLowerCase();if(t.includes(u)){if(!n.has(o.mode))n.set(o.mode,new Set);n.get(o.mode).add(o.keyword)}}}if(n.size===0)return null;let i="",r=0;for(let[o,c]of n.entries())if(c.size>r)i=o,r=c.size;let a=Array.from(n.get(i)),s=r>2?0.9:r>1?0.7:0.5;if(w)console.log(`[mode-detector] Detected mode "${i}" with ${r} keyword matches (confidence: ${s})`);return{mode:i,keywords:a,confidence:s}}var tc={blitzkrieg:{name:"Ultrawork",enabled:!0,parallelAgents:4,concurrencyLimits:{anthropic:2,openai:3,google:3}},search:{name:"Search",enabled:!0,maxResults:50,useExplore:!0,useLibrarian:!0},analyze:{name:"Analyze",enabled:!0,consultationPhases:3,expertAgents:["oracle","Abyssal","Siren"]},ultrathink:{name:"Ultrathink",enabled:!0,thinkingBudget:32000,autoVariantSwitch:!0}};function sr(e){return tc[e]}var nc=new Map;function cr(e,t,n){let i=sr(t);if(!i||!i.enabled)return console.log(`[mode-switcher] Mode "${t}" not found or disabled`),!1;let r={name:t,activatedAt:Date.now(),config:i};if(nc.set(e,r),console.log(`[mode-switcher] Activated mode "${t}" for session ${e}`),n?.onModeActivate)n.onModeActivate({mode:t,keyword:""});return!0}function lr(e,t){let n=kn()||{};if(t?.enabled===!1)return{};return{"chat.message":async(i,r)=>{if(!r.parts)return;let{sessionID:a}=i;for(let s of r.parts)if(s.type==="text"){let o=s.text;if(o&&a){let c=ar(o);if(c&&t?.autoActivate!==!1){if(w)console.log(`[mode-hooks] Detected mode "${c.mode}" with ${c.keywords.length} keywords for session ${a}`);if(cr(a,c.mode),w){if(c.mode==="blitzkrieg")console.log("[mode-hooks] Activating Blitzkrieg mode");else if(c.mode==="search")console.log("[mode-hooks] Activating Search mode");else if(c.mode==="analyze")console.log("[mode-hooks] Activating Analyze mode");else if(c.mode==="ultrathink")console.log("[mode-hooks] Activating Ultrathink mode")}}}}}}}var ic=x("session-storage-hook");function Ft(e,t){let n=t?.config??{enabled:!0,recordTodos:!0,recordTranscripts:!0};if(!n.enabled)return{};function i(a){return a.filter((s)=>s.type==="text").map((s)=>s.text).join(`
|
|
1767
|
-
`).trim()}function r(a){let s=i(a),o=[/<todo>[\s\S]*?<\/todo>/gi,/<task>[\s\S]*?<\/task>/gi,/\[TODO\]([\s\S]*?)\]/gi,/\[ \]\s*([^\]]*)\]/gi];for(let c of o){let l=s.match(c);if(l)return{content:l[1]||l[0].replace(/<\/?[^\>]*>/g,"").replace(/\[\/?[^]]*\]/g,"").trim()}}return null}return{"chat.message":async(a,s)=>{if(!n.enabled)return;let{sessionID:o}=a;if(!o)return;if(n.recordTodos){let c=r(s.parts);if(c)
|
|
1768
|
-
`).trim();if(typeof a==="string"&&a.length>0){if(
|
|
1765
|
+
`),y.currentIteration>=y.maxIterations)y.status="maxed_out",console.log(`[ralph-loop] Session ${p} reached max iterations (${y.maxIterations})`);xt(p,y),console.log(`[ralph-loop] Continuing iteration ${y.currentIteration}/${y.maxIterations} for session ${p}`),console.log(`[ralph-loop] Next prompt: ${o(y).substring(0,100)}...`)}else{let C=n.maxIterations??hi,P=a(p,f,b,C);console.log(`[ralph-loop] Starting new session ${p} with promise: "${f.substring(0,50)}..."`),xt(p,P),i.set(p,P)}}}}x();import{exec as ws}from"node:child_process";import{readFile as Ss,writeFile as As,mkdir as xs}from"node:fs/promises";import{existsSync as vt,readFileSync as ks}from"node:fs";import{join as ce,dirname as Cs}from"node:path";import{homedir as vs}from"node:os";import{fileURLToPath as Ps}from"node:url";var Si="kraken-code",kt=86400000,$e=ce(vs(),".config","kraken-code","cache"),Ai="update-check.json",D=process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1"||process.env.KRAKEN_LOG==="1",T=S("auto-update-checker"),se="",bi=null;function Ct(){if(!se)try{let e=Cs(Ps(import.meta.url)),t=[ce(e,"..","package.json"),ce(e,"..","..","package.json"),ce(e,"..","..","..","package.json")];for(let n of t)try{if(vt(n)){let i=JSON.parse(ks(n,"utf-8"));if(i.name===Si&&i.version){se=i.version;break}}}catch{}if(!se)se="0.0.0"}catch{se="0.0.0"}return se}function xi(e){let t=e.cacheDir??$e;return ce(t,Ai)}async function Es(e){try{let t=xi(e);if(!vt(t))return null;let n=await Ss(t,"utf-8");return JSON.parse(n)}catch(t){return null}}async function Ts(e,t){try{let n=e.cacheDir??$e;if(!vt(n))await xs(n,{recursive:!0});let i=xi(e);await As(i,JSON.stringify(t,null,2),"utf-8")}catch(n){if(D)T.warn("Failed to save cache:",n)}}async function Ms(){return new Promise((e)=>{ws(`npm view ${Si} version`,(t,n,i)=>{if(t){if(D)T.warn("Failed to check npm registry:",t);e(null);return}if(i){if(D)T.warn("npm error:",i);e(null);return}let r=n.trim();if(r)e(r);else e(null)})})}function Rs(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let r=0;r<Math.max(n.length,i.length);r++){let a=n[r]??0,s=i[r]??0;if(a>s)return 1;if(a<s)return-1}return 0}async function wi(e){let t=Ct(),n=e.cacheTTL??kt,i=Date.now(),r=await Es(e);if(bi=r,r&&i-r.lastChecked<n){if(D)T.debug(`Using cached update check from ${new Date(r.lastChecked).toISOString()}`);return{updateAvailable:r.updateAvailable,latestVersion:r.latestVersion}}if(D)T.debug("Checking npm registry for updates...");let a=await Ms();if(!a){if(D)T.debug("Could not determine latest version");return{updateAvailable:!1,latestVersion:null}}let s=Rs(a,t)>0,o={currentVersion:t,latestVersion:a,lastChecked:i,updateAvailable:s};return await Ts(e,o),bi=o,{updateAvailable:s,latestVersion:a}}function ki(e,t){let n=t?.config??{enabled:!0,checkOnLoad:!0,cacheDir:$e,cacheTTL:kt,notify:!0,checkInterval:kt};return{config:async(i)=>{if(!n.enabled)return;if(n.checkOnLoad){if(D)T.debug("Checking for updates on load...");let{updateAvailable:r,latestVersion:a}=await wi(n);if(r&&n.notify){if(D)T.info("UPDATE AVAILABLE"),T.info(`Current version: ${Ct()}`),T.info(`Latest version: ${a}`),T.info("To update, run: npm update kraken-code (or bun update kraken-code)")}else if(!r){if(D)T.debug(`You are using the latest version: ${Ct()}`)}}},event:async(i)=>{if(!n.enabled)return;if(i.event?.type==="installation.updated"){if(D)T.debug("Installation was updated");let r=n.cacheDir??$e,a=ce(r,Ai);try{let{unlink:s}=await import("node:fs/promises");if(await s(a),D)T.debug("Cleared update cache")}catch(s){}}if(i.event?.type==="installation.update-available"){if(D)T.debug("New update available");let{latestVersion:r}=await wi(n);if(r){if(D)T.debug(`Latest version: ${r}`)}}}}}import{tool as Ci}from"@opencode-ai/plugin";import{z as q}from"zod";import{execFile as Ds}from"node:child_process";import{promisify as Ns}from"node:util";var Os=Ns(Ds);async function vi(e,t,n){let i=["--json","--pattern",e,"--lang",t];if(n?.replace)i.push("--replace",n.replace);if(n?.path)i.push("--path",n.path);if(n?.glob)i.push("--glob",n.glob);try{let{stdout:r,stderr:a}=await Os("sg",i,{maxBuffer:10485760,timeout:30000});if(a&&!r)return{success:!1,error:a};try{let s=JSON.parse(r);return{success:!0,matches:s.matches||[],count:s.count||0}}catch{return{success:!0,matches:[],count:0}}}catch(r){if(r instanceof Error&&r.message.includes("ENOENT"))return{success:!1,error:"ast-grep CLI not installed. Install with: npm install -g @ast-grep/cli"};return{success:!1,error:r instanceof Error?r.message:"Unknown error"}}}var Pi=Ci({description:"Search code using AST patterns. More powerful than regex as it understands code structure. Example patterns: 'function $_$ { $body$ }' to find all functions, '$A = $B' to find assignments.",args:{pattern:q.string().describe("AST pattern to search for (use $VAR for variables)"),language:q.string().describe("Programming language (typescript, javascript, python, rust, go, java, cpp, etc.)"),path:q.string().optional().describe("Directory or file to search in (default: current directory)"),glob:q.string().optional().describe("File glob pattern (e.g., '*.ts', 'src/**/*.ts')")},async execute(e){let{pattern:t,language:n,path:i,glob:r}=e,a=await vi(t,n,{path:i,glob:r});return JSON.stringify(a,null,2)}}),Ei=Ci({description:"Search and replace code using AST patterns. Safer than regex replacement as it respects code structure. Use the same variable names in replacement to preserve matched content.",args:{pattern:q.string().describe("AST pattern to search for"),replacement:q.string().describe("AST pattern to replace with (use $VAR to reference matched variables)"),language:q.string().describe("Programming language"),path:q.string().optional().describe("Directory or file to search in (default: current directory)"),glob:q.string().optional().describe("File glob pattern")},async execute(e){let{pattern:t,replacement:n,language:i,path:r,glob:a}=e,s=await vi(t,i,{replace:n,path:r,glob:a});return JSON.stringify(s,null,2)}});import*as K from"fs";import*as Et from"path";import*as Ti from"os";import{tool as Ls}from"@opencode-ai/plugin";import{z as Se}from"zod";var Pt=Et.join(Ti.homedir(),".opencode","sessions");function B(){if(!K.existsSync(Pt))K.mkdirSync(Pt,{recursive:!0});return Pt}function Fs(){let e=B();if(!K.existsSync(e))return[];let t=[];try{let n=K.readdirSync(e);for(let i of n){if(!i.endsWith(".json"))continue;let r=i.slice(0,-5),a=Et.join(e,i);try{let s=K.readFileSync(a,"utf-8"),o=JSON.parse(s),c={sessionID:r,created:o.created||o.createdAt||new Date(0).toISOString(),lastActive:o.lastActive||o.updatedAt||new Date().toISOString(),messageCount:o.messageCount||o.messages?.length||0,agent:o.agent,duration:o.duration,fileCount:o.fileCount,editCount:o.editCount,toolUsage:o.toolUsage||{}};t.push({sessionID:r,path:a,metadata:c})}catch(s){console.error(`[session-list] Error reading session ${r}:`,s)}}}catch(n){console.error("[session-list] Error reading sessions directory:",n)}return t}function Is(e,t,n){if(!t&&!n)return e;let i=t?new Date(t).getTime():0,r=n?new Date(n).getTime():1/0;return e.filter((a)=>{let s=new Date(a.metadata.lastActive).getTime();return s>=i&&s<=r})}function $s(e,t="desc"){return[...e].sort((n,i)=>{let r=new Date(n.metadata.lastActive).getTime(),a=new Date(i.metadata.lastActive).getTime();return t==="asc"?r-a:a-r})}var Tt=Ls({description:"List all OpenCode sessions with filtering and pagination options.",args:{limit:Se.number().int().min(1).max(1000).optional(),startDate:Se.string().optional(),endDate:Se.string().optional(),order:Se.enum(["asc","desc"]).optional(),includeMetadata:Se.boolean().default(!1)},async execute(e){try{let{limit:t,startDate:n,endDate:i,order:r,includeMetadata:a}=e,s=Fs();if(n||i)s=Is(s,n,i);if(s=$s(s,r),t)s=s.slice(0,t);let o=s.map((c)=>{if(a)return{sessionID:c.metadata.sessionID,created:c.metadata.created,lastActive:c.metadata.lastActive,messageCount:c.metadata.messageCount,agent:c.metadata.agent,duration:c.metadata.duration,fileCount:c.metadata.fileCount,editCount:c.metadata.editCount,toolUsage:c.metadata.toolUsage};else return{sessionID:c.metadata.sessionID,created:c.metadata.created,lastActive:c.metadata.lastActive,messageCount:c.metadata.messageCount,agent:c.metadata.agent}});return JSON.stringify({success:!0,count:o.length,sessions:o})}catch(t){return console.error("[session-list] Error:",t),JSON.stringify({success:!1,error:String(t),sessions:[]})}}});import*as _e from"fs";import*as Mi from"path";import{tool as js}from"@opencode-ai/plugin";import{z as je}from"zod";function _s(e){return Mi.join(B(),`${e}.json`)}var Mt=js({description:"Read messages from a specific session with pagination and filtering options.",args:{sessionID:je.string().describe("Session ID to read from"),limit:je.number().int().min(1).max(1000).optional(),offset:je.number().int().min(0).default(0).describe("Offset for pagination"),includeMetadata:je.boolean().default(!1).describe("Include full session metadata")},async execute(e){try{let{sessionID:t,limit:n,offset:i,includeMetadata:r}=e,a=_s(t);if(!_e.existsSync(a))return JSON.stringify({success:!1,error:`Session ${t} not found`,sessionID:t});let s=_e.readFileSync(a,"utf-8"),o=JSON.parse(s),c=o.messages||[],l=c;if(i>0||n)l=c.slice(i,n?i+n:void 0);let u={sessionID:t,messages:l,partial:c.length>l.length,metadata:{sessionID:t,created:o.created||o.createdAt||new Date(0).toISOString(),lastActive:o.lastActive||o.updatedAt||new Date().toISOString(),messageCount:c.length,agent:o.agent,duration:o.duration,fileCount:o.fileCount,editCount:o.editCount,toolUsage:o.toolUsage||{}}},p={success:!0,sessionID:t,totalMessages:c.length,returnedMessages:l.length,offset:i,limit:n||c.length,partial:u.partial,messages:l};if(r)p.metadata=u.metadata;return JSON.stringify(p)}catch(t){return console.error("[session-read] Error:",t),JSON.stringify({success:!1,error:String(t),sessionID:e.sessionID})}}});import*as X from"fs";import*as We from"path";import*as Di from"os";import{tool as Us}from"@opencode-ai/plugin";import{z as Ue}from"zod";var jp=We.join(Di.homedir(),".opencode","sessions");function Ws(e){try{let t=X.readFileSync(e,"utf-8"),n=JSON.parse(t),i=new Map;if(n.messages&&Array.isArray(n.messages))n.messages.forEach((r,a)=>{let s=r.role||"unknown",o=r.content||"";if(o&&typeof o==="string"&&o.length>0){let c={type:s==="user"?"user_message":"assistant_message",index:a,content:o,context:o};i.set(o,c)}});return i}catch(t){return console.error(`[session-search] Error indexing session ${e}:`,t),null}}function Ri(e,t){let n=e.toLowerCase(),i=t.content.toLowerCase(),r=0,a=i===n;if(a)r+=100;if(i.includes(n)&&!a)r+=50;let o=n.split(/\s+/),c=0;for(let l of o)if(l.length>2&&i.includes(l))c++;if(r+=c*10,t.type==="user_message")r+=20;return Math.min(r,100)}function Hs(){let e=B();if(!X.existsSync(e))return[];let t=[];try{let n=X.readdirSync(e);for(let i of n){if(!i.endsWith(".json"))continue;let r=i.slice(0,-5),a=We.join(e,i);try{let s=X.readFileSync(a,"utf-8"),o=JSON.parse(s),c={sessionID:r,created:o.created||o.createdAt||new Date(0).toISOString(),lastActive:o.lastActive||o.updatedAt||new Date().toISOString(),messageCount:o.messageCount||o.messages?.length||0,agent:o.agent,duration:o.duration,fileCount:o.fileCount,editCount:o.editCount,toolUsage:o.toolUsage||{}};t.push({sessionID:r,filePath:a,metadata:c})}catch(s){console.error(`[session-search] Error reading session ${r}:`,s)}}}catch(n){console.error("[session-search] Error reading sessions directory:",n)}return t}var Rt=Us({description:"Full-text search across all OpenCode sessions with ranked results.",args:{q:Ue.string().describe("Search query text"),limit:Ue.number().int().min(1).max(100).default(10).describe("Maximum number of results to return"),offset:Ue.number().int().min(0).default(0).describe("Offset for pagination"),sessionID:Ue.string().optional().describe("Search within a specific session only")},async execute(e){try{let{q:t,limit:n,offset:i,sessionID:r}=e;if(!t||t.trim().length===0)return JSON.stringify({success:!1,error:"Query cannot be empty",results:[]});let a=[];if(r){let c=B(),l=We.join(c,`${r}.json`);a=[{sessionID:r,filePath:l,metadata:{sessionID:r,created:"",lastActive:"",messageCount:0,toolUsage:{}}}]}else a=Hs();let s=[];for(let c of a){let l=Ws(c.filePath);if(!l)continue;let u=[];for(let[p,m]of l.entries())if(Ri(t,m)>10)u.push(m);if(u.length>0){let p=u.reduce((m,g)=>m+Ri(t,g),0)/u.length;s.push({sessionID:c.sessionID,filePath:c.filePath,metadata:c.metadata,score:Math.round(p),matches:u.slice(0,5)})}}s.sort((c,l)=>l.score-c.score);let o=s.slice(i,i+n);return JSON.stringify({success:!0,query:t,total:s.length,offset:i,limit:n,results:o.map((c)=>({sessionID:c.sessionID,score:c.score,matchCount:c.matches.length,lastActive:c.metadata.lastActive,messageCount:c.metadata.messageCount,agent:c.metadata.agent,matches:c.matches.map((l)=>({type:l.type,index:l.index,content:l.content.slice(0,200)+(l.content.length>200?"...":"")}))}))})}catch(t){return console.error("[session-search] Error:",t),JSON.stringify({success:!1,error:String(t),results:[]})}}});import*as He from"fs";import*as Dt from"path";import{tool as qs}from"@opencode-ai/plugin";import{z as Ks}from"zod";var Kp=Dt.join(process.env.HOME||"",".opencode","sessions");function Bs(e){return Dt.join(B(),`${e}.json`)}function Js(e){let t=Bs(e);if(!He.existsSync(t))return null;try{let n=He.readFileSync(t,"utf-8"),i=JSON.parse(n);return{sessionID:e,created:i.created||i.createdAt||new Date(0).toISOString(),lastActive:i.lastActive||i.updatedAt||new Date().toISOString(),messageCount:i.messageCount||i.messages?.length||0,agent:i.agent,duration:i.duration,fileCount:i.fileCount,editCount:i.editCount,toolUsage:i.toolUsage||{}}}catch(n){return console.error(`[session-info] Error reading session ${e}:`,n),null}}function Ys(e){let t={totalMessages:e.messageCount,totalToolsUsed:Object.values(e.toolUsage||{}).reduce((n,i)=>n+i,0),mostUsedTool:"",mostUsedToolCount:0,averageMessagesPerMinute:0};if(e.duration)t.averageMessagesPerMinute=e.messageCount/(e.duration/60000);for(let[n,i]of Object.entries(e.toolUsage||{}))if(i>t.mostUsedToolCount)t.mostUsedTool=n,t.mostUsedToolCount=i;return t}var Nt=qs({description:"Get detailed metadata and statistics about a specific session.",args:{sessionID:Ks.string().describe("Session ID to query")},async execute(e){try{let{sessionID:t}=e,n=Js(t);if(!n)return JSON.stringify({success:!1,error:`Session ${t} not found`,sessionID:t});let i=Ys(n);return JSON.stringify({success:!0,sessionID:n.sessionID,created:n.created,lastActive:n.lastActive,messageCount:n.messageCount,agent:n.agent,duration:n.duration,fileCount:n.fileCount,editCount:n.editCount,toolUsage:n.toolUsage,stats:{totalMessages:i.totalMessages,totalToolsUsed:i.totalToolsUsed,mostUsedTool:i.mostUsedTool,mostUsedToolCount:i.mostUsedToolCount,averageMessagesPerMinute:i.averageMessagesPerMinute.toFixed(2)}})}catch(t){return console.error("[session-info] Error:",t),JSON.stringify({success:!1,error:String(t),sessionID:e.sessionID})}}});import{tool as Vs}from"@opencode-ai/plugin";import{z as Ae}from"zod";import{execFile as zs}from"node:child_process";import{promisify as Gs}from"node:util";var Xs=Gs(zs);async function Qs(e,t){if(!e.trim())return{success:!1,error:"Pattern must not be empty"};let n=["--line-number","--column","--color=never"];if(n.push("--max-count","200"),n.push("--max-filesize","1M"),n.push("--max-depth","4"),t?.context)n.push("-C",String(t.context));if(t?.invert)n.push("-v");if(t?.type)n.push(`--type=${t.type}`);n.push(e),n.push(t?.path??process.cwd());try{let{stdout:i}=await Xs("rg",n,{maxBuffer:10485760,timeout:30000}),r=[],a=i.split(`
|
|
1766
|
+
`);for(let s of a){if(!s.trim())continue;let o=s.match(/^([^:]+):(\d+):(\d+):(.+)$/);if(o)r.push({file:o[1],line:parseInt(o[2],10),column:parseInt(o[3],10),lineContent:o[4]})}return{success:!0,matches:r,count:r.length}}catch(i){if(i instanceof Error&&i.message.includes("ENOENT"))return{success:!1,error:"ripgrep (rg) not installed. Install with: apt install ripgrep or brew install ripgrep"};return{success:!1,error:i instanceof Error?i.message:"Unknown error"}}}var Ni=Vs({description:"Search for text patterns in files using ripgrep. Supports regex and file type filtering. Example: grep({pattern: 'function \\w+', type: 'ts', context: 2})",args:{pattern:Ae.string().describe("Regex pattern to search for"),path:Ae.string().optional().describe("Directory or file to search in (default: current directory)"),type:Ae.string().optional().describe("Filter by file type (ts, js, py, rust, go, java, etc.)"),context:Ae.number().optional().describe("Number of context lines around each match (default: 0)"),invert:Ae.boolean().optional().describe("Show lines that do NOT match the pattern")},async execute(e){let{pattern:t,path:n,type:i,context:r,invert:a}=e,s=await Qs(t,{path:n,type:i,context:r,invert:a});if(!s.success)return JSON.stringify(s,null,2);return JSON.stringify({success:!0,matches:s.matches?.slice(0,100),count:s.count,message:s.count&&s.count>100?`Showing 100 of ${s.count} matches`:void 0},null,2)}});import{tool as Zs}from"@opencode-ai/plugin";import{z as Ot}from"zod";var Oi=Zs({description:"Control Ralph-Loop iterations for achieving completion promises. Ralph complements Kraken's PDSA cycles by iteratively refining until <promise> is satisfied. Automatically triggered when chat contains <promise>...</promise> pattern, or use this tool for manual control.",args:{command:Ot.enum(["status","cancel","continue","info"]).describe("Ralph-Loop command"),sessionID:Ot.string().optional().describe("Session ID (required for status, cancel)"),maxIterations:Ot.number().min(1).max(100).optional().describe("Max iterations (default: 24)")},async execute(e){let{command:t,sessionID:n,maxIterations:i}=e;switch(t){case"status":if(!n)return JSON.stringify({success:!1,error:"sessionID required for status command"});return JSON.stringify({success:!0,session:{sessionID:n,status:"active",promise:"Use /ralph-loop in chat to start a new session",task:"N/A",currentIteration:0,maxIterations:i??24,elapsedMs:0}});case"cancel":if(!n)return JSON.stringify({success:!1,error:"sessionID required for cancel command"});return JSON.stringify({success:!0,message:`Session ${n} cancelled`});case"continue":if(!n)return JSON.stringify({success:!1,error:"sessionID required for continue command"});return JSON.stringify({success:!0,message:`Session ${n} continuing to next iteration`});case"info":return JSON.stringify({success:!0,info:{description:"Ralph-Loop: Self-referential iteration agent that continues until completion promise is satisfied",triggers:["Chat message contains <promise>...</promise> pattern","User types /ralph-loop [task] <promise>...</promise>"],defaults:{maxIterations:24,timeout:"None (continues until promise met or max iterations)"},complement:"Ralph complements Kraken's PDSA cycles. Kraken orchestrates; Ralph iterates."}});default:return JSON.stringify({success:!1,error:`Unknown command: ${t}`})}}});import{tool as I}from"@opencode-ai/plugin";import{z as h}from"zod";import{promises as Lt}from"node:fs";import*as Ft from"node:os";import*as xe from"node:path";var Li=xe.join(Ft.homedir(),".kraken","learning"),Fi="learning-state.json",A={experiences:[],knowledgeNodes:[],knowledgeEdges:[],patterns:[],schedules:[],stateMachines:[]},Ii=!1;async function It(){let e=Z();if(e.enabled===!1)return{ready:!1,loaded:0};let t=Vi(e.storagePath);return await zi(t),A=await ec(t),Ii=!0,{ready:!0,loaded:A.experiences.length+A.knowledgeNodes.length+A.patterns.length}}async function $i(e){let t=Z();await le();let n=new Date().toISOString(),i={id:`exp_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,createdAt:n,updatedAt:n,summary:e.summary,details:e.details,tags:e.tags??[],outcome:e.outcome,confidence:e.confidence,relatedNodeIds:e.relatedNodeIds??[]};if(t.experienceStore?.enabled===!1||t.enabled===!1)return i;A.experiences.unshift(i);let r=t.experienceStore?.maxEntries??2000;if(A.experiences.length>r)A.experiences=A.experiences.slice(0,r);if(t.patternDetection?.enabled!==!1)tc(i,t);return await Q(t),i}function ji(e){let t=e.toLowerCase();return A.experiences.filter((n)=>{let i=n.tags?.join(" ").toLowerCase()??"";return n.summary.toLowerCase().includes(t)||n.details.toLowerCase().includes(t)||i.includes(t)})}async function _i(e){let t=Z();await le();let n=new Date().toISOString(),i={id:`node_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,createdAt:n,updatedAt:n,title:e.title,content:e.content,type:e.type??"concept",tags:e.tags??[],sources:e.sources??[],metadata:e.metadata??{}};if(t.knowledgeGraph?.enabled===!1||t.enabled===!1)return i;A.knowledgeNodes.unshift(i);let r=t.knowledgeGraph?.maxNodes??5000;if(A.knowledgeNodes.length>r)A.knowledgeNodes=A.knowledgeNodes.slice(0,r);if(t.spacedRepetition?.enabled!==!1)Gi(i.id,t);return await Q(t),i}function Ui(e){let t=e.toLowerCase();return A.knowledgeNodes.filter((n)=>{let i=n.tags?.join(" ").toLowerCase()??"";return n.title.toLowerCase().includes(t)||n.content.toLowerCase().includes(t)||i.includes(t)})}async function Wi(e,t,n,i=0.5){let r=Z();await le();let a={id:`edge_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,sourceId:e,targetId:t,relation:n,strength:i,createdAt:new Date().toISOString()};if(r.knowledgeGraph?.enabled===!1||r.enabled===!1)return a;return A.knowledgeEdges.push(a),await Q(r),a}async function Hi(e){let t=Z();await le();let n=new Date().toISOString(),i=A.patterns.find((s)=>s.name===e.name);if(i)return i.description=e.description,i.triggers=e.triggers??i.triggers,i.confidence=e.confidence??i.confidence,i.evidence=e.evidence??i.evidence,i.occurrences+=1,i.lastSeen=n,i.updatedAt=n,await Q(t),i;let r={id:`pattern_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:e.name,description:e.description,triggers:e.triggers??[],confidence:e.confidence??0.5,evidence:e.evidence??[],occurrences:1,lastSeen:n,createdAt:n,updatedAt:n};if(t.patternDetection?.enabled===!1||t.enabled===!1)return r;A.patterns.unshift(r);let a=t.patternDetection?.maxPatterns??500;if(A.patterns.length>a)A.patterns=A.patterns.slice(0,a);return await Q(t),r}function qi(e=0){return A.patterns.filter((t)=>t.confidence>=e)}function Ki(e){let t=e?new Date(e).getTime():Date.now();return A.schedules.filter((n)=>{return new Date(n.nextReview).getTime()<=t})}async function Bi(e,t){let n=Z();await le();let i=Math.min(5,Math.max(0,t)),r=nc(e,n),a=new Date;if(i<3)r.intervalDays=n.spacedRepetition?.initialIntervalDays??1,r.reviewCount=0;else if(r.reviewCount+=1,r.reviewCount===1)r.intervalDays=n.spacedRepetition?.initialIntervalDays??1;else r.intervalDays=Math.round(r.intervalDays*r.easeFactor);let s=r.easeFactor+(0.1-(5-i)*(0.08+(5-i)*0.02));r.easeFactor=Math.max(1.3,s);let o=n.spacedRepetition?.maxIntervalDays??365;return r.intervalDays=Math.min(r.intervalDays,o),r.lastReviewed=a.toISOString(),r.nextReview=new Date(a.getTime()+r.intervalDays*24*60*60*1000).toISOString(),await Q(n),r}async function Ji(e){let t=Z();await le();let n=new Date().toISOString(),i={id:`sm_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:e.name,states:e.states,transitions:e.transitions,initialState:e.initialState,currentState:e.initialState,metadata:e.metadata??{},createdAt:n,updatedAt:n};if(t.stateMachines?.enabled===!1||t.enabled===!1)return i;return A.stateMachines.unshift(i),await Q(t),i}function Yi(){return[...A.stateMachines]}function Z(){let e=Cn(),t=kn();return{enabled:e?.enabled??t?.enabled??!0,autoSave:e?.autoSave??t?.autoSave??!0,storagePath:e?.storagePath??t?.storagePath??Li,experienceStore:{enabled:e?.experienceStore?.enabled??!0,maxEntries:e?.experienceStore?.maxEntries??2000},knowledgeGraph:{enabled:e?.knowledgeGraph?.enabled??!0,maxNodes:e?.knowledgeGraph?.maxNodes??5000},patternDetection:{enabled:e?.patternDetection?.enabled??!0,minConfidence:e?.patternDetection?.minConfidence??0.6,maxPatterns:e?.patternDetection?.maxPatterns??500},spacedRepetition:{enabled:e?.spacedRepetition?.enabled??!0,initialIntervalDays:e?.spacedRepetition?.initialIntervalDays??1,easeFactor:e?.spacedRepetition?.easeFactor??2.5,maxIntervalDays:e?.spacedRepetition?.maxIntervalDays??365},stateMachines:{enabled:e?.stateMachines?.enabled??!0}}}function Vi(e){if(!e)return Li;if(e.startsWith("~/"))return xe.join(Ft.homedir(),e.slice(2));return e}async function zi(e){await Lt.mkdir(e,{recursive:!0})}async function le(){if(!Ii)await It()}async function ec(e){let t=xe.join(e,Fi);try{let n=await Lt.readFile(t,"utf-8"),i=JSON.parse(n);return{experiences:i.experiences??[],knowledgeNodes:i.knowledgeNodes??[],knowledgeEdges:i.knowledgeEdges??[],patterns:i.patterns??[],schedules:i.schedules??[],stateMachines:i.stateMachines??[]}}catch{return{experiences:[],knowledgeNodes:[],knowledgeEdges:[],patterns:[],schedules:[],stateMachines:[]}}}async function Q(e){if(e.autoSave===!1||e.enabled===!1)return;let t=Vi(e.storagePath);await zi(t);let n=xe.join(t,Fi);await Lt.writeFile(n,JSON.stringify(A,null,2),"utf-8")}function tc(e,t){let n=t.patternDetection?.minConfidence??0.6,i=e.tags??[];for(let r of i){let a=`tag:${r}`,s=`Recurring experience tag "${r}".`,o=A.patterns.find((c)=>c.name===a);if(o)o.occurrences+=1,o.lastSeen=e.createdAt,o.confidence=Math.min(1,o.confidence+0.05),o.updatedAt=new Date().toISOString();else A.patterns.unshift({id:`pattern_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,name:a,description:s,triggers:[r],confidence:n,evidence:[e.summary],occurrences:1,lastSeen:e.createdAt,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()})}}function Gi(e,t){if(A.schedules.find((a)=>a.nodeId===e))return;let i=t.spacedRepetition?.initialIntervalDays??1,r=new Date;A.schedules.push({nodeId:e,intervalDays:i,easeFactor:t.spacedRepetition?.easeFactor??2.5,nextReview:new Date(r.getTime()+i*24*60*60*1000).toISOString(),reviewCount:0})}function nc(e,t){let n=A.schedules.find((i)=>i.nodeId===e);if(!n)Gi(e,t),n=A.schedules.find((i)=>i.nodeId===e);if(!n){let i={nodeId:e,intervalDays:t.spacedRepetition?.initialIntervalDays??1,easeFactor:t.spacedRepetition?.easeFactor??2.5,nextReview:new Date().toISOString(),reviewCount:0};return A.schedules.push(i),i}return n}var $t=h.number().min(0).max(1),Xi=I({description:"Add a learning experience to the unified memory system.",args:{summary:h.string().min(1).describe("Short summary of the experience"),details:h.string().min(1).describe("Full details of the experience"),tags:h.array(h.string()).optional().describe("Tags describing the experience"),outcome:h.string().optional().describe("Outcome or result of the experience"),confidence:$t.optional().describe("Confidence score (0-1)"),relatedNodeIds:h.array(h.string()).optional().describe("Related knowledge node IDs")},async execute(e){let t=await $i(e);return JSON.stringify({success:!0,experience:t},null,2)}}),Qi=I({description:"Search stored experiences by keyword.",args:{query:h.string().min(1).describe("Search query")},async execute(e){let t=ji(e.query);return JSON.stringify({success:!0,experiences:t},null,2)}}),Zi=I({description:"Add a knowledge node to the learning graph.",args:{title:h.string().min(1).describe("Node title"),content:h.string().min(1).describe("Node content"),type:h.string().optional().describe("Node type (concept, decision, procedure, etc.)"),tags:h.array(h.string()).optional().describe("Tags associated with the node"),sources:h.array(h.string()).optional().describe("Source references or URLs"),metadata:h.record(h.string(),h.unknown()).optional().describe("Additional metadata")},async execute(e){let t=await _i(e);return JSON.stringify({success:!0,node:t},null,2)}}),er=I({description:"Search knowledge nodes by keyword.",args:{query:h.string().min(1).describe("Search query")},async execute(e){let t=Ui(e.query);return JSON.stringify({success:!0,nodes:t},null,2)}}),tr=I({description:"Create a relationship between two knowledge nodes.",args:{sourceId:h.string().min(1).describe("Source node ID"),targetId:h.string().min(1).describe("Target node ID"),relation:h.string().min(1).describe("Relationship description"),strength:h.number().min(0).max(1).optional().describe("Relationship strength (0-1)")},async execute(e){let t=await Wi(e.sourceId,e.targetId,e.relation,e.strength??0.5);return JSON.stringify({success:!0,edge:t},null,2)}}),nr=I({description:"Record or update a learning pattern.",args:{name:h.string().min(1).describe("Pattern name"),description:h.string().min(1).describe("Pattern description"),triggers:h.array(h.string()).optional().describe("Trigger keywords or signals"),confidence:$t.optional().describe("Confidence score (0-1)"),evidence:h.array(h.string()).optional().describe("Evidence notes")},async execute(e){let t=await Hi(e);return JSON.stringify({success:!0,pattern:t},null,2)}}),ir=I({description:"List known patterns above a confidence threshold.",args:{minConfidence:$t.optional().describe("Minimum confidence to include")},async execute(e){let t=qi(e.minConfidence??0);return JSON.stringify({success:!0,patterns:t},null,2)}}),rr=I({description:"Get the spaced repetition review queue.",args:{dueBefore:h.string().optional().describe("ISO timestamp cutoff for due reviews")},async execute(e){let t=Ki(e.dueBefore);return JSON.stringify({success:!0,queue:t},null,2)}}),or=I({description:"Record a spaced repetition review for a knowledge node.",args:{nodeId:h.string().min(1).describe("Knowledge node ID"),quality:h.number().min(0).max(5).describe("Review quality score (0-5)")},async execute(e){let t=await Bi(e.nodeId,e.quality);return JSON.stringify({success:!0,schedule:t},null,2)}}),ar=I({description:"Create a learning state machine for workflow tracking.",args:{name:h.string().min(1).describe("State machine name"),states:h.array(h.string()).min(1).describe("Possible states"),transitions:h.array(h.object({from:h.string().min(1),to:h.string().min(1),event:h.string().min(1),description:h.string().optional()})).min(1).describe("State transitions"),initialState:h.string().min(1).describe("Initial state"),metadata:h.record(h.string(),h.unknown()).optional().describe("Additional metadata")},async execute(e){let t=await Ji(e);return JSON.stringify({success:!0,machine:t},null,2)}}),sr=I({description:"List all learning state machines.",args:{},async execute(){let e=Yi();return JSON.stringify({success:!0,machines:e},null,2)}});x();var ic=[{keyword:"blitzkrieg",mode:"blitzkrieg",language:"English",aliases:["ulw","max","full"]},{keyword:"ultra work",mode:"blitzkrieg",language:"English"},{keyword:"max performance",mode:"blitzkrieg",language:"English"},{keyword:"go all out",mode:"blitzkrieg",language:"English"},{keyword:"full power",mode:"blitzkrieg",language:"English"},{keyword:"search",mode:"search",language:"English",aliases:["find","locate","look for"]},{keyword:"find",mode:"search",language:"English"},{keyword:"locate",mode:"search",language:"English"},{keyword:"look for",mode:"search",language:"English"},{keyword:"explore",mode:"search",language:"English"},{keyword:"analyze",mode:"analyze",language:"English",aliases:["investigate","examine"]},{keyword:"investigate",mode:"analyze",language:"English"},{keyword:"examine",mode:"analyze",language:"English"},{keyword:"deep analysis",mode:"analyze",language:"English"},{keyword:"detailed analysis",mode:"analyze",language:"English"},{keyword:"ultrathink",mode:"ultrathink",language:"English",aliases:["think deeply","deep think"]},{keyword:"think deeply",mode:"ultrathink",language:"English"},{keyword:"deep think",mode:"ultrathink",language:"English"},{keyword:"extended thinking",mode:"ultrathink",language:"English"},{keyword:"careful reasoning",mode:"ultrathink",language:"English"},{keyword:"blitzkrieg",mode:"blitzkrieg",language:"Spanish",aliases:["ulw","trabajo ultra"]},{keyword:"trabajo ultra",mode:"blitzkrieg",language:"Spanish"},{keyword:"máximo rendimiento",mode:"blitzkrieg",language:"Spanish"},{keyword:"buscar",mode:"search",language:"Spanish",aliases:["encontrar","localizar"]},{keyword:"encontrar",mode:"search",language:"Spanish"},{keyword:"localizar",mode:"search",language:"Spanish"},{keyword:"analizar",mode:"analyze",language:"Spanish",aliases:["investigar","examinar"]},{keyword:"investigar",mode:"analyze",language:"Spanish"},{keyword:"examinar",mode:"analyze",language:"Spanish"},{keyword:"pensar profundamente",mode:"ultrathink",language:"Spanish",aliases:["piensa","razonamiento profundo"]},{keyword:"piensa",mode:"ultrathink",language:"Spanish"},{keyword:"razonamiento profundo",mode:"ultrathink",language:"Spanish"},{keyword:"blitzkrieg",mode:"blitzkrieg",language:"French",aliases:["ulw","travail ultra"]},{keyword:"travail ultra",mode:"blitzkrieg",language:"French"},{keyword:"chercher",mode:"search",language:"French",aliases:["rechercher","trouver"]},{keyword:"rechercher",mode:"search",language:"French"},{keyword:"trouver",mode:"search",language:"French"},{keyword:"analyser",mode:"analyze",language:"French",aliases:["investiguer","examiner"]},{keyword:"investiguer",mode:"analyze",language:"French"},{keyword:"examiner",mode:"analyze",language:"French"},{keyword:"réfléchir profondément",mode:"ultrathink",language:"French",aliases:["réfléchis","pensée profonde"]},{keyword:"réfléchis",mode:"ultrathink",language:"French"},{keyword:"blitzkrieg",mode:"blitzkrieg",language:"German",aliases:["ulw","maximal"]},{keyword:"maximale leistung",mode:"blitzkrieg",language:"German"},{keyword:"suchen",mode:"search",language:"German",aliases:["finden","lokalisieren"]},{keyword:"finden",mode:"search",language:"German"},{keyword:"analysieren",mode:"analyze",language:"German",aliases:["untersuchen","prüfen"]},{keyword:"untersuchen",mode:"analyze",language:"German"},{keyword:"nachdenken",mode:"ultrathink",language:"German",aliases:["denk nach","sorgfältig denken"]},{keyword:"denk nach",mode:"ultrathink",language:"German"},{keyword:"sorgfältig denken",mode:"ultrathink",language:"German"},{keyword:"강력한",mode:"blitzkrieg",language:"Korean",aliases:["울트라워크","최대"]},{keyword:"울트라워크",mode:"blitzkrieg",language:"Korean"},{keyword:"최대",mode:"blitzkrieg",language:"Korean"},{keyword:"최고 성능",mode:"blitzkrieg",language:"Korean"},{keyword:"검색",mode:"search",language:"Korean",aliases:["찾아","찾기"]},{keyword:"찾아",mode:"search",language:"Korean"},{keyword:"찾기",mode:"search",language:"Korean"},{keyword:"분석",mode:"analyze",language:"Korean",aliases:["조사","검토"]},{keyword:"조사",mode:"analyze",language:"Korean"},{keyword:"검토",mode:"analyze",language:"Korean"},{keyword:"생각해",mode:"ultrathink",language:"Korean",aliases:["깊게 생각","신중한 사고"]},{keyword:"깊게 생각",mode:"ultrathink",language:"Korean"},{keyword:"신중한 사고",mode:"ultrathink",language:"Korean"},{keyword:"强力",mode:"blitzkrieg",language:"Chinese (Simplified)",aliases:["超神","最大"]},{keyword:"超神",mode:"blitzkrieg",language:"Chinese (Simplified)"},{keyword:"最大",mode:"blitzkrieg",language:"Chinese (Simplified)"},{keyword:"搜索",mode:"search",language:"Chinese (Simplified)",aliases:["查找","定位"]},{keyword:"查找",mode:"search",language:"Chinese (Simplified)"},{keyword:"定位",mode:"search",language:"Chinese (Simplified)"},{keyword:"分析",mode:"analyze",language:"Chinese (Simplified)",aliases:["调查","检查"]},{keyword:"调查",mode:"analyze",language:"Chinese (Simplified)"},{keyword:"检查",mode:"analyze",language:"Chinese (Simplified)"},{keyword:"深度思考",mode:"ultrathink",language:"Chinese (Simplified)",aliases:["仔细思考","让我想想"]},{keyword:"仔细思考",mode:"ultrathink",language:"Chinese (Simplified)"},{keyword:"让我想想",mode:"ultrathink",language:"Chinese (Simplified)"},{keyword:"强力",mode:"blitzkrieg",language:"Chinese (Traditional)",aliases:["超神","最大"]},{keyword:"超神",mode:"blitzkrieg",language:"Chinese (Traditional)"},{keyword:"最大",mode:"blitzkrieg",language:"Chinese (Traditional)"},{keyword:"搜索",mode:"search",language:"Chinese (Traditional)",aliases:["查找","定位"]},{keyword:"查找",mode:"search",language:"Chinese (Traditional)"},{keyword:"定位",mode:"search",language:"Chinese (Traditional)"},{keyword:"分析",mode:"analyze",language:"Chinese (Traditional)",aliases:["調查","檢查"]},{keyword:"調查",mode:"analyze",language:"Chinese (Traditional)"},{keyword:"檢查",mode:"analyze",language:"Chinese (Traditional)"},{keyword:"深度思考",mode:"ultrathink",language:"Chinese (Traditional)",aliases:["仔細思考","讓我思考"]},{keyword:"仔細思考",mode:"ultrathink",language:"Chinese (Traditional)"},{keyword:"讓我思考",mode:"ultrathink",language:"Chinese (Traditional)"},{keyword:"強力",mode:"blitzkrieg",language:"Japanese",aliases:["最大","フルパワー"]},{keyword:"最大",mode:"blitzkrieg",language:"Japanese"},{keyword:"フルパワー",mode:"blitzkrieg",language:"Japanese"},{keyword:"検索",mode:"search",language:"Japanese",aliases:["探す","見つける"]},{keyword:"探す",mode:"search",language:"Japanese"},{keyword:"見つける",mode:"search",language:"Japanese"},{keyword:"分析",mode:"analyze",language:"Japanese",aliases:["調査","検討"]},{keyword:"調査",mode:"analyze",language:"Japanese"},{keyword:"検討",mode:"analyze",language:"Japanese"},{keyword:"深く考える",mode:"ultrathink",language:"Japanese",aliases:["思考","注意深く考える"]},{keyword:"思考",mode:"ultrathink",language:"Japanese"},{keyword:"注意深く考える",mode:"ultrathink",language:"Japanese"},{keyword:"blitzkrieg",mode:"blitzkrieg",language:"Portuguese",aliases:["ulw","trabalho ultra"]},{keyword:"trabalho ultra",mode:"blitzkrieg",language:"Portuguese"},{keyword:"pesquisar",mode:"search",language:"Portuguese",aliases:["procurar","encontrar"]},{keyword:"procurar",mode:"search",language:"Portuguese"},{keyword:"encontrar",mode:"search",language:"Portuguese"},{keyword:"analisar",mode:"analyze",language:"Portuguese",aliases:["investigar","examinar"]},{keyword:"investigar",mode:"analyze",language:"Portuguese"},{keyword:"examinar",mode:"analyze",language:"Portuguese"},{keyword:"pensar profundamente",mode:"ultrathink",language:"Portuguese",aliases:["pense","raciocínio profundo"]},{keyword:"pense",mode:"ultrathink",language:"Portuguese"},{keyword:"raciocínio profundo",mode:"ultrathink",language:"Portuguese"},{keyword:"blitzkrieg",mode:"blitzkrieg",language:"Italian",aliases:["ulw","lavoro ultra"]},{keyword:"lavoro ultra",mode:"blitzkrieg",language:"Italian"},{keyword:"cercare",mode:"search",language:"Italian",aliases:["trovare","ricercare"]},{keyword:"trovare",mode:"search",language:"Italian"},{keyword:"ricercare",mode:"search",language:"Italian"},{keyword:"analizzare",mode:"analyze",language:"Italian",aliases:["indagare","esaminare"]},{keyword:"indagare",mode:"analyze",language:"Italian"},{keyword:"esaminare",mode:"analyze",language:"Italian"},{keyword:"pensare attentamente",mode:"ultrathink",language:"Italian",aliases:["pensa","pensiero profondo"]},{keyword:"pensa",mode:"ultrathink",language:"Italian"},{keyword:"pensiero profondo",mode:"ultrathink",language:"Italian"},{keyword:"ультраворк",mode:"blitzkrieg",language:"Russian",aliases:["ulw","максимально"]},{keyword:"максимально",mode:"blitzkrieg",language:"Russian"},{keyword:"поиск",mode:"search",language:"Russian",aliases:["найти","искать"]},{keyword:"найти",mode:"search",language:"Russian"},{keyword:"искать",mode:"search",language:"Russian"},{keyword:"анализировать",mode:"analyze",language:"Russian",aliases:["исследовать","изучить"]},{keyword:"исследовать",mode:"analyze",language:"Russian"},{keyword:"изучить",mode:"analyze",language:"Russian"},{keyword:"подумать",mode:"ultrathink",language:"Russian",aliases:["подумай","тщательно подумать"]},{keyword:"подумай",mode:"ultrathink",language:"Russian"},{keyword:"тщательно подумать",mode:"ultrathink",language:"Russian"},{keyword:"ألترا وورك",mode:"blitzkrieg",language:"Arabic",aliases:["العمل القوي","الأقصى"]},{keyword:"بحث",mode:"search",language:"Arabic",aliases:["إيجاد","تحديد موقع"]},{keyword:"تحليل",mode:"analyze",language:"Arabic",aliases:["تحقيق","فحص"]},{keyword:"تفكير عميق",mode:"ultrathink",language:"Arabic",aliases:["فكر","تفكر بعناية"]},{keyword:"فكر",mode:"ultrathink",language:"Arabic"},{keyword:"अल्ट्रावर्क",mode:"blitzkrieg",language:"Hindi",aliases:["अधिकतम","अधिक कार्य"]},{keyword:"अधिकतम",mode:"blitzkrieg",language:"Hindi"},{keyword:"अधिक कार्य",mode:"blitzkrieg",language:"Hindi"},{keyword:"खोज",mode:"search",language:"Hindi",aliases:["ढूंढना","ढूंढो"]},{keyword:"विश्लेषण",mode:"analyze",language:"Hindi",aliases:["जांच","जांचना"]},{keyword:"जांच",mode:"analyze",language:"Hindi"},{keyword:"जांचना",mode:"analyze",language:"Hindi"},{keyword:"गहरी सोच",mode:"ultrathink",language:"Hindi",aliases:["सोचो","ध्यानपूर्वक सोच"]},{keyword:"सोचो",mode:"ultrathink",language:"Hindi"},{keyword:"ध्यानपूर्वक सोच",mode:"ultrathink",language:"Hindi"}];function cr(e){let t=e.toLowerCase(),n=new Map;for(let o of ic){let c=o.keyword.toLowerCase();if(t.includes(c)){if(!n.has(o.mode))n.set(o.mode,new Set);n.get(o.mode).add(o.keyword)}if(o.aliases)for(let l of o.aliases){let u=l.toLowerCase();if(t.includes(u)){if(!n.has(o.mode))n.set(o.mode,new Set);n.get(o.mode).add(o.keyword)}}}if(n.size===0)return null;let i="",r=0;for(let[o,c]of n.entries())if(c.size>r)i=o,r=c.size;let a=Array.from(n.get(i)),s=r>2?0.9:r>1?0.7:0.5;if(w)console.log(`[mode-detector] Detected mode "${i}" with ${r} keyword matches (confidence: ${s})`);return{mode:i,keywords:a,confidence:s}}var rc={blitzkrieg:{name:"Ultrawork",enabled:!0,parallelAgents:4,concurrencyLimits:{anthropic:2,openai:3,google:3}},search:{name:"Search",enabled:!0,maxResults:50,useExplore:!0,useLibrarian:!0},analyze:{name:"Analyze",enabled:!0,consultationPhases:3,expertAgents:["oracle","Abyssal","Siren"]},ultrathink:{name:"Ultrathink",enabled:!0,thinkingBudget:32000,autoVariantSwitch:!0}};function lr(e){return rc[e]}var oc=new Map;function dr(e,t,n){let i=lr(t);if(!i||!i.enabled)return console.log(`[mode-switcher] Mode "${t}" not found or disabled`),!1;let r={name:t,activatedAt:Date.now(),config:i};if(oc.set(e,r),console.log(`[mode-switcher] Activated mode "${t}" for session ${e}`),n?.onModeActivate)n.onModeActivate({mode:t,keyword:""});return!0}x();function ur(e,t){let n=vn()||{};if(t?.enabled===!1)return{};return{"chat.message":async(i,r)=>{if(!r.parts)return;let{sessionID:a}=i;for(let s of r.parts)if(s.type==="text"){let o=s.text;if(o&&a){let c=cr(o);if(c&&t?.autoActivate!==!1){if(w)console.log(`[mode-hooks] Detected mode "${c.mode}" with ${c.keywords.length} keywords for session ${a}`);if(dr(a,c.mode),w){if(c.mode==="blitzkrieg")console.log("[mode-hooks] Activating Blitzkrieg mode");else if(c.mode==="search")console.log("[mode-hooks] Activating Search mode");else if(c.mode==="analyze")console.log("[mode-hooks] Activating Analyze mode");else if(c.mode==="ultrathink")console.log("[mode-hooks] Activating Ultrathink mode")}}}}}}}x();var ac=S("session-storage-hook");function jt(e,t){let n=t?.config??{enabled:!0,recordTodos:!0,recordTranscripts:!0};if(!n.enabled)return{};function i(a){return a.filter((s)=>s.type==="text").map((s)=>s.text).join(`
|
|
1767
|
+
`).trim()}function r(a){let s=i(a),o=[/<todo>[\s\S]*?<\/todo>/gi,/<task>[\s\S]*?<\/task>/gi,/\[TODO\]([\s\S]*?)\]/gi,/\[ \]\s*([^\]]*)\]/gi];for(let c of o){let l=s.match(c);if(l)return{content:l[1]||l[0].replace(/<\/?[^\>]*>/g,"").replace(/\[\/?[^]]*\]/g,"").trim()}}return null}return{"chat.message":async(a,s)=>{if(!n.enabled)return;let{sessionID:o}=a;if(!o)return;if(n.recordTodos){let c=r(s.parts);if(c)di(o,`TODO: ${c.content}`)}if(n.recordTranscripts){let c=i(s.parts);if(c)ui(o,c)}},"tool.execute.after":async(a,s)=>{if(!n.enabled)return;let{tool:o,sessionID:c}=a;if(!c)return;if(n.recordTranscripts)Fe(c,o,{},s.output||"");if(c)ac.info(`Tool ${o} completed for session ${c}`)}}}var Pm=jt({});x();var pr=S("claude-code-hooks");function mr(e,t){let n={enabled:t?.config?.enabled??!0,mcp:t?.config?.mcp??!0,commands:t?.config?.commands??!0,skills:t?.config?.skills??!0,agents:t?.config?.agents??!0,hooks:t?.config?.hooks??!0,toggles:t?.config?.toggles??{}};return{config:async(i)=>{try{if(i){if(Object.assign(n,i?.claudeCodeCompatibility??i),i?.claudeCodeCompatibility?.toggles)n.toggles={...n.toggles,...i.claudeCodeCompatibility.toggles}}}catch(r){console.error("[claude-code-hooks] Error applying config:",r)}},"tool.execute.before":async(i,r)=>{if(!n.enabled||n.hooks===!1||n.toggles?.hooks===!1)return;pr.debug("Tool execution started")},"tool.execute.after":async(i,r)=>{if(!n.enabled||n.hooks===!1||n.toggles?.hooks===!1)return;pr.debug("Tool execution started")}}}x();var sc=["anthropic","bedrock"],cc=["think","let me think","i need to think","take time to think","think about this","think carefully","piensa","déjame pensar","necesito pensar","piénsalo","piensa cuidadosamente","réfléchis","laissez-moi réfléchir","je dois réfléchir","réfléchissez-y","réfléchir attentivement","denk nach","lass mich nachdenken","ich muss nachdenken","denk darüber nach","denke sorgfältig","pense","deixe-me pensar","preciso pensar","pense sobre isso","pense cuidadosamente","pensa","fammi pensare","devo pensare","pensa a questo","pensa attentamente","подумай","дай мне подумать","мне нужно подумать","подумай об этом","подумай внимательно","考えて","考えさせて","考える必要がある","これについて考えて","注意深く考えて","思考","让我想想","我需要思考","思考这个","仔细思考","思考","讓我思考","我需要思考","思考這個","仔細思考","생각해","생각하게 해줘","생각해야 해","이것에 대해 생각해","신중하게 생각해"];function lc(e){return sc.some((t)=>e.toLowerCase().includes(t.toLowerCase()))}var gr=new Map;function dc(e){return gr.get(e)}function uc(e,t){gr.set(e,{enabled:t,activatedAt:Date.now()})}function pc(e){let t=e.toLowerCase();for(let n of cc)if(t.includes(n))return!0;return!1}function fr(e){return{"chat.message":async(t,n)=>{let{sessionID:i}=t,a=(n?.parts||[]).filter((s)=>s.type==="text").map((s)=>s.text).join(`
|
|
1768
|
+
`).trim();if(typeof a==="string"&&a.length>0){if(pc(a)){if(w)console.log(`[think-mode] Activated for session ${i}`);uc(i,!0)}}return},"chat.params":async(t,n)=>{let{sessionID:i,provider:r}=t;if(dc(i)?.enabled){if(!n.variant)n.variant="max";let s=r?.info?.id||r?.options?.providerID||"";if(lc(s)){if(!n.options)n.options={};if(!n.options.thinking){if(w)console.log(`[think-mode] Applying think mode settings for provider ${s}`);if(s.includes("anthropic")||s.includes("bedrock"))n.options.thinking={budget_tokens:32000,type:"enabled"}}}}return}}}import{tool as qe}from"@opencode-ai/plugin";import{z as ee}from"zod";function mc(e,t){if(!t)return e;return`${e}
|
|
1769
1769
|
|
|
1770
1770
|
Context:
|
|
1771
|
-
${t}`}function
|
|
1772
|
-
`).trim()}async function
|
|
1771
|
+
${t}`}function gc(e){return e.filter((n)=>n.type==="text"||n.type==="reasoning").map((n)=>n.text).join(`
|
|
1772
|
+
`).trim()}async function fc(e,t,n,i){let r=await e.client.session.create({body:{title:`Subagent: ${t}`},query:{directory:e.directory}});if(!r||r.error||!r.data){let l=r?.error?JSON.stringify(r.error):"Failed to create session for subagent task.";throw Error(l)}let a=r.data.id,s=mc(n,i),o=await e.client.session.prompt({path:{id:a},query:{directory:e.directory},body:{agent:t,parts:[{type:"text",text:s}]}});if(!o||o.error||!o.data){let l=o?.error?JSON.stringify(o.error):"Subagent prompt failed.";throw Error(l)}let c=gc(o.data.parts);return{sessionId:a,responseText:c||JSON.stringify(o.data,null,2)}}function hr(e,t){return qe({description:"Delegate a task to a specialized subagent for domain expertise. Supports both synchronous (wait=true) and asynchronous (wait=false) execution patterns. Use this when tasks require specialized knowledge, extensive search, or can benefit from parallel execution.",args:{agent:ee.enum(["Nautilus","Abyssal","Maelstrom","Coral","Siren","Leviathan","Poseidon","Scylla","Pearl","Cartographer"]).describe(`Name of subagent to delegate to. Each agent has specialized expertise:
|
|
1773
1773
|
- Nautilus: Codebase search, pattern finding, symbol analysis
|
|
1774
1774
|
- Abyssal: External research, documentation lookup, API discovery
|
|
1775
1775
|
- Maelstrom: Architecture design, system analysis, trade-off evaluation
|
|
@@ -1779,41 +1779,41 @@ ${t}`}function uc(e){return e.filter((n)=>n.type==="text"||n.type==="reasoning")
|
|
|
1779
1779
|
- Poseidon: Planning, requirement analysis, test plan creation (Plan Consultant role)
|
|
1780
1780
|
- Scylla: Code review, test coverage analysis, quality assurance (Plan Reviewer role)
|
|
1781
1781
|
- Pearl: Testing, test creation, test execution
|
|
1782
|
-
- Cartographer: Advanced planning with hierarchical task decomposition and subagent delegation`),task:
|
|
1783
|
-
`);if(o){let c=
|
|
1784
|
-
`).trim()}function s(c){let l=["فكر","أريد أن أفكر","دعني أفكر","فكر بعناية","تفكر باهتمام"],u=["חשב","תן להרהר","אני צריך לחשוב","חשב בריצות"],p=["pikirkan","saya perlu berpikir","biarkan saya berpikir","pikirkan dengan baik"],m=["подумай","дай мені подумати","мені потрібно подумати","подумай про це","подумай уважно"],g=["σκεψου","ας σκεφτεί","χρειάζεται να σκεφτώ","σκεφτεί σοβαρά"],f=["myslet","musím myslet","nechte mě myslet","myslet pozorně"],b=["gândește","trebuie să gândesc","gândește-te","gândește cu atenție"],y=["tænk","jeg skal tænke","lad mig tænke","tænk nøje"],
|
|
1785
|
-
`).trim()}return{"chat.message":async(r,a)=>{if(!n.enabled)return;let s=i(a.parts);if(!s)return;for(let[o,c]of Object.entries(n.commands||{}))if(s.startsWith(o)){if(w)console.log(`[auto-slash-command] Detected ${o}, triggering: ${c}`)}}}}import*as
|
|
1786
|
-
`);for(let a of r){let s=a.indexOf(":");if(s===-1)continue;let o=a.slice(0,s).trim(),c=a.slice(s+1).trim();if(o==="alwaysApply"&&c==="true")i.alwaysApply=!0;else if(o==="alwaysApply"&&c==="false")i.alwaysApply=!1;else if(o&&!isNaN(Number(c)))i[o]=Number(c);else if(o)i[o]=c}return i}function
|
|
1787
|
-
`).trim()}return{"chat.message":async(o,c)=>{if(!n.enabled)return;let l=c.parts||[];if(!s(l))return;let p=process.cwd(),m=a(p);if(m.length===0)return;let g=m[0],f=n.maxRules||10,y=m.slice(0,f).map((
|
|
1788
|
-
`);return`<rule source="${
|
|
1789
|
-
${
|
|
1782
|
+
- Cartographer: Advanced planning with hierarchical task decomposition and subagent delegation`),task:ee.string().min(5).describe("Clear, specific description of what the agent should do. Include relevant context, expected output format, and success criteria."),context:ee.string().optional().describe("Additional context that may help the agent complete the task"),wait:ee.boolean().default(!1).describe("If true, wait for the agent to complete and return the full result. If false (default), return immediately with a task ID for async tracking. Use wait=false for parallel delegation to multiple agents.")},async execute(n){let{agent:i,task:r,context:a,wait:s}=n;try{let o=e.createTask(i,r,a),c=async()=>{let l=await fc(t,i,r,a);o.sessionId=l.sessionId,e.completeTask(o.id,l.responseText)};if(e.startTask(o.id),s){try{await c()}catch(u){e.failTask(o.id,u instanceof Error?u.message:"Unknown error")}let l=e.getTask(o.id);return JSON.stringify({success:!0,taskId:l?.id??o.id,agent:l?.agent??i,status:l?.status??"failed",result:l?.result,error:l?.error,duration:l?.completedAt&&l?.startedAt?l.completedAt-l.startedAt:null,sessionId:l?.sessionId},null,2)}return c().catch((l)=>{e.failTask(o.id,l instanceof Error?l.message:"Unknown error")}),JSON.stringify({success:!0,taskId:o.id,agent:o.agent,status:o.status,message:`Task delegated to ${i}. Use background_task_status to check progress.`,sessionId:o.sessionId},null,2)}catch(o){return JSON.stringify({success:!1,error:o instanceof Error?o.message:"Unknown error"},null,2)}}})}function yr(e){return qe({description:"Check the status of a background agent task. Returns completion status, results, and duration information for tasks created with call_agent(wait=false).",args:{taskId:ee.string().describe("Task ID from a previous call_agent invocation")},async execute(t){let{taskId:n}=t,i=e.getTask(n);if(!i)return JSON.stringify({success:!1,error:`Task ${n} not found`},null,2);return JSON.stringify({success:!0,taskId:i.id,agent:i.agent,status:i.status,result:i.result,error:i.error,duration:i.completedAt&&i.startedAt?i.completedAt-i.startedAt:null,createdAt:i.createdAt,startedAt:i.startedAt,completedAt:i.completedAt,sessionId:i.sessionId},null,2)}})}function br(e){return qe({description:"List all background tasks for the current session. Returns both active and recently completed tasks for tracking parallel delegation workflows.",args:{status:ee.enum(["all","pending","running","completed","failed"]).default("all").describe("Filter by task status. Default 'all' shows all tasks.")},async execute(t){let{status:n}=t,i=e.listTasks(),r=n==="all"?i:i.filter((a)=>a.status===n);return JSON.stringify({success:!0,count:r.length,tasks:r},null,2)}})}function wr(e){return qe({description:"Cancel a running or pending background task. Use this when a task is no longer needed or when you want to free up concurrency slots.",args:{taskId:ee.string().describe("Task ID to cancel")},async execute(t){let{taskId:n}=t;if(!e.cancelTask(n))return JSON.stringify({success:!1,error:`Task ${n} not found or cannot be cancelled`},null,2);return JSON.stringify({success:!0,taskId:n,message:`Task ${n} cancelled successfully`},null,2)}})}class Sr{tasks=new Map;config;queues=new Map;counts=new Map;constructor(e){this.config=e||{}}getConcurrencyLimit(e){let t=this.config.modelConcurrency?.[e];if(t!==void 0)return t===0?1/0:t;let n=e.split("/")[0],i=this.config.providerConcurrency?.[n];if(i!==void 0)return i===0?1/0:i;let r=this.config.defaultConcurrency;if(r!==void 0)return r===0?1/0:r;return 5}async acquire(e){let t=this.getConcurrencyLimit(e);if(t===1/0)return;let n=this.counts.get(e)??0;if(n<t){this.counts.set(e,n+1);return}return new Promise((i)=>{let r=this.queues.get(e)??[];r.push(i),this.queues.set(e,r)})}release(e){if(this.getConcurrencyLimit(e)===1/0)return;let n=this.queues.get(e);if(n&&n.length>0){let i=n.shift();if(this.counts.set(e,(this.counts.get(e)??0)-1),i)i()}else{let i=this.counts.get(e)??0;if(i>0)this.counts.set(e,i-1)}}createTask(e,t,n){let i={id:crypto.randomUUID(),agent:e,status:"pending",createdAt:Date.now()};return this.tasks.set(i.id,i),i}waitForTask(e,t=30000){return new Promise((n,i)=>{let r=setInterval(()=>{let a=this.tasks.get(e);if(!a){clearInterval(r),i(Error(`Task ${e} not found`));return}if(a.status==="completed"||a.status==="failed")clearInterval(r),n(a)},100);setTimeout(()=>{clearInterval(r),i(Error(`Task ${e} timed out after ${t}ms`))},t)})}cancelTask(e){let t=this.tasks.get(e);if(!t||t.status!=="pending"&&t.status!=="running")return!1;return t.status="failed",t.completedAt=Date.now(),t.error="Task cancelled by user",!0}startTask(e){let t=this.tasks.get(e);if(!t||t.status!=="pending")return!1;return t.status="running",t.startedAt=Date.now(),!0}completeTask(e,t){let n=this.tasks.get(e);if(!n||n.status!=="running")return!1;return n.status="completed",n.completedAt=Date.now(),n.result=t,!0}failTask(e,t){let n=this.tasks.get(e);if(!n||n.status!=="running")return!1;return n.status="failed",n.completedAt=Date.now(),n.error=t,!0}getTask(e){return this.tasks.get(e)}listTasks(){return Array.from(this.tasks.values())}listActiveTasks(){return Array.from(this.tasks.values()).filter((e)=>e.status==="pending"||e.status==="running")}}function Ar(e){let t=new Sr;return{manager:t,tools:{call_agent:hr(t,{client:e.client,directory:e.directory}),background_task_status:yr(t),background_task_list:br(t),background_task_cancel:wr(t)}}}x();var kr=0.7,Ke={"claude-3-5-sonnet":200000,"claude-3-5-haiku":200000,"claude-3-opus":200000,"claude-3-sonnet":200000,"claude-3-haiku":200000,"gpt-4o":128000,"gpt-4o-mini":128000,"gpt-4-turbo":128000,"gpt-4":8192,"gpt-3.5-turbo":16385,"gemini-2.5-pro":1e6,"gemini-2.5-flash":1e6,"gemini-2.0-flash":1e6,"gemini-1.5-pro":2800000,"gemini-1.5-flash":1e6,default:1e5},xr=new Map;function hc(e){let t=xr.get(e);if(!t)t={messageCount:0,lastWarningAt:0,totalEstimatedTokens:0},xr.set(e,t);return t}function _t(e){let t=e.toLowerCase();if(Ke[t])return Ke[t];for(let[n,i]of Object.entries(Ke))if(t.includes(n.toLowerCase()))return i;return Ke.default}function yc(e){return Math.ceil(e.length/4)}function bc(e,t,n=kr){if(e<=0)return!1;let i=_t(t);return e/i>=n}function wc(e,t,n,i){let r=hc(e);if(r.messageCount++,r.totalEstimatedTokens+=n,r.messageCount%10===0||bc(r.totalEstimatedTokens,t,i)){let s=Date.now();if(s-r.lastWarningAt>=60000){let o=_t(t),c=Sc(r.totalEstimatedTokens,t);if(w)if(c>=(i??kr)*100)console.warn(`⚠️ Context Window Warning: You are at ${c}% of ${o} token limit (~${r.totalEstimatedTokens}/${o} tokens). Consider clearing context.`);else console.log(`ℹ️ Context Window: At ${c}% of ${o} token limit (~${r.totalEstimatedTokens}/${o} tokens, ${r.messageCount} messages).`);r.lastWarningAt=s}}}function Sc(e,t){let n=_t(t);if(n<=0)return 0;return Math.round(e/n*100)}function Cr(e){return{"chat.message":async(t,n)=>{let{sessionID:i,model:r}=t,a=r?.modelID||"default",o=(n?.parts||[]).filter((c)=>c.type==="text").map((c)=>c.text).join(`
|
|
1783
|
+
`);if(o){let c=yc(o);wc(i,a,c)}return}}}x();function vr(e,t){let n=process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1"||process.env.KRAKEN_LOG==="1",i=S("keyword-detector"),r=t?.config??{enabled:!0,keywords:{blitz:"blitzkrieg",blz:"blitzkrieg","[BUILD]":"build","[PLAN]":"plan","[RESEARCH]":"research","[DOCS]":"docs","[REVIEW]":"review",think:"think",ultrathink:"think",ulw:"ultrawork",ultrawork:"ultrawork",search:"search",analyze:"analyze",investigate:"analyze","[INVESTIGATE]":"research",piensa:"think","déjame pensar":"think","necesito pensar":"think",piénsalo:"think","piensa cuidadosamente":"think",réfléchis:"think","laissez-moi réfléchir":"think","je dois réfléchir":"think","réfléchissez-y":"think","réfléchir attentivement":"think","denk nach":"think","lass mich nachdenken":"think","denk darüber nach":"think","denke sorgfältig":"think",pense:"think","fammi pensare":"think","devo pensare":"think","pensa a questo":"think","pensa attentamente":"think",подумай:"think","дай мне подумать":"think","мне нужно подумать":"think","подумай об этом":"think","подумай внимательно":"think",考えて:"think",考えさせて:"think",考える必要がある:"think",これについて考えて:"think",注意深く考えて:"think",思考:"think",让我想想:"think",我需要思考:"think",思考这个:"think",仔细思考:"think",思考這個:"think",생각해:"think","생각하게 해줘":"think","이것에 대해 생각해":"think","신중하게 생각해":"think",فكر:"think","أريد أن أفكر":"think","دعني أفكر":"think","فكر بعناية":"think","تفكر باهتمام":"think",חשב:"think","תן להרהר":"think","אני צריך לחשוב":"think","חשב בריצות":"think",pikirkan:"think","saya perlu berpikir":"think","biarkan saya berpikir":"think","pikirkan dengan baik":"think","подумай про це":"think","подумай уважно":"think",σκεψου:"think","ας σκεφτεί":"think","χρειάζεται να σκεφτώ":"think","σκεφτεί σοβαρά":"think",myslet:"think","musím myslet":"think","nechte mě myslet":"think","myslet pozorně":"think",gândește:"think","trebuie să gândesc":"think","gândește-te":"think","gândește cu atenție":"think",tænk:"think","jeg skal tænke":"think","lad mig tænke":"think","tænk nøje":"think",tänk:"think","jag behöver tänka":"think","låt mig tänka":"think","tänk noga":"think",denk:"think","ik moet denken":"think","laat me denken":"think","denk goed na":"think",คิด:"think",ฉันต้องคิด:"think",ให้ฉันคิด:"think",คิดให้ดี:"think"}};function a(c){return c.filter((l)=>l.type==="text").map((l)=>l.text).join(`
|
|
1784
|
+
`).trim()}function s(c){let l=["فكر","أريد أن أفكر","دعني أفكر","فكر بعناية","تفكر باهتمام"],u=["חשב","תן להרהר","אני צריך לחשוב","חשב בריצות"],p=["pikirkan","saya perlu berpikir","biarkan saya berpikir","pikirkan dengan baik"],m=["подумай","дай мені подумати","мені потрібно подумати","подумай про це","подумай уважно"],g=["σκεψου","ας σκεφτεί","χρειάζεται να σκεφτώ","σκεφτεί σοβαρά"],f=["myslet","musím myslet","nechte mě myslet","myslet pozorně"],b=["gândește","trebuie să gândesc","gândește-te","gândește cu atenție"],y=["tænk","jeg skal tænke","lad mig tænke","tænk nøje"],C=["tänk","jag behöver tänka","låt mig tänka","tänk noga"],P=["tænk","jeg skal tænke","lad mig tænke","tænk nøje"],O=["denk","ik moet denken","laat me denken","denk goed na"],U=["คิด","ฉันต้องคิด","ให้ฉันคิด","คิดให้ดี"],Me=["réfléchis","laissez-moi réfléchir","je dois réfléchir","réfléchissez-y","réfléchir attentivement"],ge=["piensa","déjame pensar","necesito pensar","piénsalo","piensa cuidadosamente"],fe=["denk nach","lass mich nachdenken","denk darüber nach","denke sorgfältig"],un=["pensa","fammi pensare","devo pensare","pensa a questo","pensa attentamente"],pn=["подумай","дай мне подумать","мне нужно подумать","подумай об этом","подумай внимательно"],mn=["考えて","考えさせて","考える必要がある","これについて考えて","注意深く考えて"],gn=["思考","让我想想","我需要思考","思考这个","仔细思考","思考這個"],fn=["생각해","생각하게 해줘","이것에 대해 생각해","신중하게 생각해"],hn=["think","reason","think deeply","ultrathink","ultra think",...Me,...ge,...fe,...un,...pn,...mn,...gn,...fn,...l,...u,...p,...m,...g,...f,...b,...y,...C,...P,...O,...U],k=["ultrawork","ulw","ultra work","ultra work mode","초신속","슈퍼모드","스피드","super rapid","ultra rapid","أسرع","על הכי מהיר","kerja super cepat","ультра-быстро","υπερταχύτητα","super rychle","super viteză"],Ko=["search","find","locate","search for","find in","locate in","검색","찾아","查找","検索","rechercher","buscar","suchen","cercare","найти","חפש","بحث","cari","пошук","αναζήτηση","hledat","căuta","søg","sök","zoek","ค้นหา"],Bo=["analyze","investigate","examine","deep dive","deep analysis","분석","조사","分析","分析","analyser","analizar","analysieren","analizzare","анализировать","נתח","تحليل","analisis","analiza","аналізувати","ανάλυση","analyzovat","analiza","analyseer","onderzoek","วิเคราะห์"];if(k.includes(c.toLowerCase()))return{mode:"ultrawork",language:o(c)};if(Ko.includes(c.toLowerCase()))return{mode:"search",language:o(c)};if(Bo.includes(c.toLowerCase()))return{mode:"analyze",language:o(c)};if(hn.includes(c.toLowerCase()))return{mode:"think",language:o(c)};return{mode:"enhanced",language:o(c)}}function o(c){let l=c.toLowerCase(),u=/[ا-ي-ع]/,p=/[\u0590-\u05FF]/,m=/[\u0400-\u04FF]/,g=/[\u4E00-\u9FFF]/,f=/[\u3040-\u30FF]/,b=/[\uAC00-\uD7AF]/,y=/[\u0370-\u03FF]/,C=/[\u0E00-\u0E7F]/;if(u.test(c))return"Arabic";if(p.test(c))return"Hebrew";if(m.test(c)){if(l.includes("подум"))return"Ukrainian";if(l.includes("дум"))return"Russian"}if(g.test(c))return"Chinese";if(f.test(c))return"Japanese";if(b.test(c))return"Korean";if(y.test(c))return"Greek";if(C.test(c))return"Thai";if(["réfléchis","pensa","déjame","pensar"].some((k)=>l.includes(k.toLowerCase())))return"French";if(["piensa","necesito","pensar"].some((k)=>l.includes(k.toLowerCase())))return"Spanish";if(["denk","nachdenken"].some((k)=>l.includes(k.toLowerCase())))return"German";if(["pensa","pensare"].some((k)=>l.includes(k.toLowerCase())))return"Italian";if(["think","reason","analyze","investigate","search","find"].some((k)=>l.includes(k)))return"English";if(["myslet","myslet"].some((k)=>l.includes(k.toLowerCase())))return"Czech";if(["gând","gândește"].some((k)=>l.includes(k.toLowerCase())))return"Romanian";if(["tænk","tænke"].some((k)=>l.includes(k.toLowerCase())))return"Danish";if(["tänk"].some((k)=>l.includes(k.toLowerCase())))return"Swedish";if(["tænk"].some((k)=>l.includes(k.toLowerCase())))return"Norwegian";if(["denk"].some((k)=>l.includes(k.toLowerCase())))return"Dutch";if(["pikir"].some((k)=>l.includes(k.toLowerCase())))return"Indonesian";return}return{"chat.message":async(c,l)=>{if(!r.enabled)return;let u=a(l.parts);if(!u)return;let p=u.split(/\s+/);for(let m of p)if(r.keywords?.[m]){let f=s(m);if(n)i.debug(`Detected "${m}" (${f.language}), activating: ${f.mode} mode`);let b=c.config;if(f.mode==="ultrawork"){if(b?.enhanced?.enabled===!1)b.enhanced={...b.enhanced,enabled:!0}}else if(f.mode==="search"){if(n)i.debug(`Activating search mode for ${f.language}`)}else if(f.mode==="analyze"){if(n)i.debug(`Activating analyze mode for ${f.language}`)}else if(f.mode==="think"){if(n)i.debug(`Activating think mode for ${f.language}`)}else if(f.mode==="enhanced"){if(n)i.debug("Activating enhanced mode")}}}}}x();function Pr(e,t){let n=t?.config??{enabled:!0,commands:{"/build":"build","/plan":"plan","/research":"research","/docs":"docs","/review":"review","/test":"test","/fix":"fix","/explain":"explain"}};function i(r){return r.filter((a)=>a.type==="text").map((a)=>a.text).join(`
|
|
1785
|
+
`).trim()}return{"chat.message":async(r,a)=>{if(!n.enabled)return;let s=i(a.parts);if(!s)return;for(let[o,c]of Object.entries(n.commands||{}))if(s.startsWith(o)){if(w)console.log(`[auto-slash-command] Detected ${o}, triggering: ${c}`)}}}}import*as de from"fs";import*as v from"path";var Ac=[".md",".mdc"];function xc(e){let t=e.match(/^---\s*\n([\s\S]*?)\n---\s*\n/);if(!t)return{};let n=t[1],i={},r=n.split(`
|
|
1786
|
+
`);for(let a of r){let s=a.indexOf(":");if(s===-1)continue;let o=a.slice(0,s).trim(),c=a.slice(s+1).trim();if(o==="alwaysApply"&&c==="true")i.alwaysApply=!0;else if(o==="alwaysApply"&&c==="false")i.alwaysApply=!1;else if(o&&!isNaN(Number(c)))i[o]=Number(c);else if(o)i[o]=c}return i}function kc(e){let t=e.match(/^---\s*\n[\s\S]*?\n---\s*\n/);if(!t)return[e];let n=e.slice(t[0].length),i=[],r=n.split(/(?:\n\s*---|\n\s*\n#{3,}\s+)/);for(let a of r){let s=a.trim();if(s.length>0)i.push(s)}return i}function Cc(e,t){let n=v.relative(process.cwd(),t),r=e.replace(/\*\*/g,"*").replace(/\?/g,"?").split("/"),a=n.split(v.sep),s=0;for(let o=0;o<r.length;o++){let c=r[o],l=a[o];if(c==="**")s++;else if(c==="*")s++;else if(c===l)s++}return s===r.length}function vc(e){if(!de.existsSync(e))return[];let t=[];function n(i,r=i){let a=de.readdirSync(i,{withFileTypes:!0});for(let s of a){let o=v.join(i,s.name);if(s.isDirectory())n(o,r);else if(s.isFile()){let c=v.extname(s.name).toLowerCase();if(Ac.includes(c))try{let l=de.readFileSync(o,"utf-8"),u=xc(l),p=kc(l);t.push({path:o,content:l,frontmatter:u,rules:p})}catch(l){console.warn(`[rules-injector] Error loading rule file ${o}:`,l)}}}}return n(e),t}function Pc(e,t){let i=v.relative(v.dirname(e),t).split(v.sep),r=0;for(let a of i)if(a.startsWith("."))r++;else if(a.includes(v.sep))r+=a.split(v.sep).length;else r++;return r}function Er(e,t){let n=t?.config??{enabled:!0},i=new Map;function r(o){let c=o;if(i.has(c))return i.get(c)||[];let l=[v.join(process.cwd(),"rules"),v.join(process.cwd(),".opencode","rules"),v.join(v.dirname(o),"rules"),v.join(v.dirname(o),".opencode","rules")],u=[];for(let p of l){let m=vc(p);u.push(...m)}return i.set(c,u),u}function a(o){if(!n.enabled)return[];let c=r(o),l=[];for(let u of c){let{frontmatter:p}=u;if(p.alwaysApply){l.push({ruleFile:u,matchedPattern:"always_apply",priority:0});continue}if(p.globs&&p.globs.length>0){for(let m of p.globs)if(Cc(m,o)){let g=100;if(typeof p.distance==="number")g=p.distance;else g=Pc(u.path,o);l.push({ruleFile:u,matchedPattern:m,priority:g});break}}}return l.sort((u,p)=>u.priority-p.priority),l}function s(o){return o.filter((c)=>c.type==="text").map((c)=>c.text||"").join(`
|
|
1787
|
+
`).trim()}return{"chat.message":async(o,c)=>{if(!n.enabled)return;let l=c.parts||[];if(!s(l))return;let p=process.cwd(),m=a(p);if(m.length===0)return;let g=m[0],f=n.maxRules||10,y=m.slice(0,f).map((P)=>{let O=P.ruleFile.rules.slice(0,5).join(`
|
|
1788
|
+
`);return`<rule source="${P.ruleFile.path}">
|
|
1789
|
+
${O}
|
|
1790
1790
|
</rule>`}).join(`
|
|
1791
1791
|
|
|
1792
|
-
`),
|
|
1792
|
+
`),C=l.findIndex((P)=>P.type==="text");if(C>=0){let P=l[C],O={...P,text:`${y}
|
|
1793
1793
|
|
|
1794
|
-
${
|
|
1795
|
-
`).trim()}function
|
|
1794
|
+
${P.text||""}`};c.parts=[...l.slice(0,C),O,...l.slice(C+1)]}}}}x();var Ec=S("agent-usage-reminder");function Tr(e,t){let n=t?.config??{enabled:!0,threshold:10},i=0;return{"tool.execute.after":async(r,a)=>{if(!n.enabled)return;if(r.tool==="task"){i++;let s=n.threshold??10;if(i%s===0)Ec.debug(`Agent has been called ${i} times in this session`)}}}}x();function Mr(e,t){let n=t?.config??{enabled:!0,threshold:1e5};return{"chat.params":async(i,r)=>{if(!n.enabled)return;if(w)console.log("[anthropic-context-window-limit-recovery] Monitoring context window usage")}}}x();function Tc(e){return e.filter((t)=>t.type==="text").map((t)=>t.text).join(`
|
|
1795
|
+
`).trim()}function Rr(e,t){let n=t?.config??{enabled:!0};return{"chat.message":async(i,r)=>{if(!n.enabled)return;if(!Tc(r.parts))return;if(w)console.log("[compaction-context-injector] Processing message before compaction")},"experimental.session.compacting":async(i,r)=>{if(!n.enabled)return;if(w)console.log("[compaction-context-injector] Adding context for session compaction")}}}x();import{readFileSync as Mc,existsSync as Rc}from"node:fs";function Dr(e,t){let n=t?.config??{enabled:!0};return{"chat.message":async(i,r)=>{if(!n.enabled)return;let a=n.agentFile??".opencode-agents";if(Rc(a))try{let s=Mc(a,"utf-8");if(w)console.log("[directory-agents-injector] Found local agent definitions")}catch{if(w)console.log("[directory-agents-injector] Could not read agent file")}}}}x();import{readFileSync as Dc,existsSync as Nc}from"node:fs";function Nr(e,t){let n=t?.config??{enabled:!0};return{"chat.message":async(i,r)=>{if(!n.enabled)return;let a=["README.md","readme.md","Readme.md"];for(let s of a)if(Nc(s)){try{let o=Dc(s,"utf-8");if(w)console.log("[directory-readme-injector] Found README, injecting context");if(r.parts&&Array.isArray(r.parts)){let c=r.parts.findIndex((l)=>l.type==="text");if(c>=0){let l=r.parts[c],u=`
|
|
1796
1796
|
|
|
1797
1797
|
---
|
|
1798
1798
|
**Project README:**
|
|
1799
1799
|
${o}
|
|
1800
1800
|
---
|
|
1801
1801
|
|
|
1802
|
-
`;r.parts[c]={...l,text:`${l.text||""}${u}`}}}}catch(o){if(console.warn("[directory-readme-injector] Could not read README:",o),w)console.log("[directory-readme-injector] Detailed error:",o)}break}}}}var
|
|
1803
|
-
`).trim()}function
|
|
1804
|
-
`)}function
|
|
1805
|
-
`),r=!1,a=
|
|
1802
|
+
`;r.parts[c]={...l,text:`${l.text||""}${u}`}}}}catch(o){if(console.warn("[directory-readme-injector] Could not read README:",o),w)console.log("[directory-readme-injector] Detailed error:",o)}break}}}}x();var $=S("edit-error-recovery"),Or=new Map,ue=new Map;function Oc(e){let t=Or.get(e);if(!t)t={filePath:e,failures:[],lastGoodContent:null,conflictCount:0},Or.set(e,t);return t}function Lc(e,t,n){let i=t*Math.pow(2,e);return Math.min(i,n)}function Fc(e){let t=String(e).toLowerCase();if(t.includes("no such file")||t.includes("file not found"))return"file_not_found";if(t.includes("permission denied")||t.includes("eacces"))return"permission_denied";if(t.includes("not found")||t.includes("string not found"))return"merge_conflict";if(t.includes("concurrent")||t.includes("modified"))return"concurrent_edit";return"unknown"}function Ic(e,t,n){switch(e){case"file_not_found":if(n.autoCreateDirs)return{canRecover:!0,action:"create_directories",suggestion:"Create parent directories and retry edit"};return{canRecover:!1,action:"none",suggestion:"Create the file or parent directories manually"};case"permission_denied":return{canRecover:!1,action:"check_permissions",suggestion:"Check file permissions and user access"};case"merge_conflict":return{canRecover:!0,action:"refresh_and_retry",suggestion:"Read file again and retry with current content"};case"concurrent_edit":return{canRecover:!0,action:"retry_with_backoff",suggestion:"Wait and retry edit with fresh content"};default:return{canRecover:!1,action:"none",suggestion:"Investigate the error and try again"}}}async function $c(e,t,n){let i=Ic(e,t,n);if(!i.canRecover)return $.debug(`Cannot recover from error type: ${e}`),$.debug(`Suggestion: ${i.suggestion}`),!1;if($.debug(`Attempting recovery action: ${i.action}`),$.debug(`Suggestion: ${i.suggestion}`),e==="file_not_found"&&n.autoCreateDirs)try{let{mkdir:r}=await import("node:fs/promises"),a=t.split("/").slice(0,-1).join("/");if(a)await r(a,{recursive:!0}),$.debug(`Created directory: ${a}`);return!0}catch(r){return console.error(`[edit-error-recovery] Failed to create directory: ${r}`),!1}return!0}function Lr(e,t){let n=t?.config??{enabled:!0,maxRetries:5,baseDelay:500,maxDelay:1e4,autoCreateDirs:!0,trackConflicts:!0};return{"tool.execute.after":async(i,r)=>{if(!n.enabled)return;if(i.tool!=="edit"&&i.tool!=="write")return;let{sessionID:a,filePath:s}=i,o=n.maxRetries??5,c=n.baseDelay??500,l=n.maxDelay??1e4,u=r;if(u.error||u.status==="error"){let p=u.error||u.output||"Unknown error",m=Fc(p),g=`${a}-${s||"unknown"}`,f=ue.get(g)??0;if(f<o){if(s){let y=Oc(s);if(y.failures.push({timestamp:Date.now(),filePath:s,errorType:m,errorMessage:String(p),retryAttempt:f+1}),m==="merge_conflict"&&n.trackConflicts)y.conflictCount++}if($.debug(`Edit error detected (attempt ${f+1}/${o})`),s)$.debug(`File: ${s}`);if($.debug(`Error type: ${m}`),$.debug(`Error: ${p}`),await $c(m,s||"",n)){let y=Lc(f,c,l);ue.set(g,f+1),$.debug(`Retry scheduled in ${y}ms`),$.debug("[session recovered - continuing previous task]"),setTimeout(()=>{ue.delete(g)},y)}else console.error(`[edit-error-recovery] Recovery failed for ${s||"unknown"}`),ue.delete(g)}else console.error(`[edit-error-recovery] Max retries (${o}) exceeded for ${s||"unknown"}`),ue.delete(g)}else if(s)ue.delete(`${a}-${s}`)}}}x();var Fr=new Map;function jc(e){let t=Fr.get(e);if(!t)t={sessionID:e,emptyCount:0,lastEmptyTime:null,history:[]},Fr.set(e,t);return t}function _c(e){return e.filter((t)=>t.type==="text").map((t)=>t.text).join(`
|
|
1803
|
+
`).trim()}function Uc(e){return e.some((t)=>t.type!=="text")}function Wc(e){return e.some((t)=>t.type==="tool")}function Hc(e){let t=_c(e),n=Wc(e),i=Uc(e);if(t.length===0&&!n&&!i)return{isEmpty:!0,reason:"No text content, no tool calls, and no other parts",hasContent:!1,hasTools:!1};if(t.length===0&&!n)return{isEmpty:!0,reason:"No text content and no tool calls",hasContent:!1,hasTools:!1};if(t.trim()==="")return{isEmpty:!0,reason:"Text content is whitespace-only",hasContent:!1,hasTools:n};return{isEmpty:!1,reason:"",hasContent:!0,hasTools:n}}function Ir(e,t){let n=t?.config??{enabled:!0,requireJustification:!1,trackPatterns:!0,autoRecover:!0};return{"chat.message":async(i,r)=>{if(!n.enabled)return;let{sessionID:a}=i,s=Hc(r.parts);if(s.isEmpty){let o=jc(a);if(o.emptyCount++,o.lastEmptyTime=Date.now(),o.history.push({timestamp:Date.now(),reason:s.reason}),w){if(console.log(`[empty-message-sanitizer] Detected empty message in session ${a}`),console.log(`[empty-message-sanitizer] Reason: ${s.reason}`),n.trackPatterns&&o.emptyCount>1)console.log(`[empty-message-sanitizer] Empty message count: ${o.emptyCount} in session ${a}`);if(n.autoRecover)console.log("[empty-message-sanitizer] [session recovered - continuing previous task]");if(n.requireJustification&&n.autoRecover)console.log("[empty-message-sanitizer] Please provide a justification for sending an empty message, or include actual content.")}}}}}var $r=new Map;function Be(e){let t=$r.get(e);if(!t)t={sessions:new Map,sessionTimeout:3600000},$r.set(e,t);return t}function te(e){return Be(e).sessions.get(e)}function qc(e,t){let n={sessionID:e,workingDirectory:t||process.cwd(),environment:{},commandHistory:[],childProcesses:new Set,lastActiveTime:Date.now()};return Be(e).sessions.set(e,n),n}function Kc(e){let t=te(e);if(t)t.lastActiveTime=Date.now()}function Bc(e,t){let n=te(e);if(n){if(n.commandHistory.push(t),n.commandHistory.length>100)n.commandHistory=n.commandHistory.slice(-100)}}function jr(e){e.childProcesses.forEach((t)=>{try{process.kill(t)}catch(n){}}),e.childProcesses.clear()}function _r(e,t){let n=t?.config??{enabled:!0,trackHistory:!0,historySize:50,preserveEnv:!0,autoCleanup:!0,sessionTimeout:3600000};return{"tool.execute.before":async(i,r)=>{if(!n.enabled)return;if(i.tool!=="bash")return;let{sessionID:a}=i;if(!a)return;if(!te(a))console.log(`[interactive-bash-session] Creating new bash session for ${a}`),qc(a);else Kc(a)},"tool.execute.after":async(i,r)=>{if(!n.enabled)return;if(i.tool!=="bash")return;let a=i.sessionID||"",s=i.args,o=Array.isArray(s)?s.join(" "):String(s);Bc(a,o);let c=r;if(c.pid!==void 0){let l=te(a);if(l)l.childProcesses.add(c.pid)}if(n.trackHistory){let l=te(a);if(l)console.log(`[interactive-bash-session] Command history size: ${l.commandHistory.length}`)}},event:async(i)=>{if(!n.enabled)return;let r=i.sessionID;if(!r)return;let a=i;if(a?.type==="session.end"&&n.autoCleanup){let s=te(r);if(s)console.log(`[interactive-bash-session] Cleaning up bash session for ${r}`),jr(s),Be(r).sessions.delete(r),console.log(`[interactive-bash-session] Session cleanup completed. Commands executed: ${s.commandHistory.length}, Working dir: ${s.workingDirectory}`)}if(a?.type==="session.timeout"){let s=te(r);if(s&&n.autoCleanup)console.log(`[interactive-bash-session] Session timeout for ${r}`),jr(s),Be(r).sessions.delete(r)}}}}function Ur(e,t){let n=t?.config??{enabled:!0};return{event:async(i)=>{if(!n.enabled)return;if(process.env.CI!==void 0)console.log("[non-interactive-env] Detected CI environment, enabling non-interactive mode")}}}x();function Wr(e,t){let n=t?.config??{enabled:!0,threshold:1e4};return{"chat.message":async(i,r)=>{if(!n.enabled)return;let a=n.threshold??1e4;if(w)console.log(`[preemptive-compaction] Monitoring message length for preemptive compaction (threshold: ${a})`)},"experimental.session.compacting":async(i,r)=>{if(!n.enabled)return;if(w)console.log("[preemptive-compaction] Triggering preemptive session compaction")}}}Wt();x();var Ht=S("session-recovery"),Jr=new Map;function Vr(e,t){let n=t?.config??{enabled:!0,autoRecover:!1};if(!n.enabled)return{"chat.message":async()=>{}};return{"chat.message":async(i)=>{let{sessionID:r}=i;if(!r)return;let a=Yr(r);a.errorType=null},event:async(i)=>{let{sessionID:r,type:a,error:s}=i;if(a!=="session.error")return;if(!r)return;let{detectErrorType:o}=await Promise.resolve().then(() => (Wt(),qr)),c=o(s),l=Yr(r);if(l.errorType=c,l.lastErrorTime=Date.now(),l.errorCount++,Ht.debug(`Detected error type: ${c}`),Ht.debug(`Error count for session ${r}: ${l.errorCount}`),n.autoRecover&&Ut(c)){let{attemptRecovery:u}=await Promise.resolve().then(() => (Br(),Kr)),p={sessionID:r,error:s,timestamp:Date.now()};try{await u(c,p,{maxRetries:3}),Ht.debug(`Auto-recovery attempted for ${c}`)}catch(m){console.error("[session-recovery] Auto-recovery failed:",m)}}}}}function Yr(e){let t=Jr.get(e);if(!t)t={sessionID:e,errorType:null,errorCount:0,lastErrorTime:null,recoveryAttempts:0,messagesBeforeError:0},Jr.set(e,t);return t}x();var zr=new Map;function sl(e){let t=zr.get(e);if(!t)t={sessionID:e,errorCount:0,lastErrorTime:null,history:[]},zr.set(e,t);return t}function cl(e){return e.filter((t)=>t.type==="text").map((t)=>t.text).join(`
|
|
1804
|
+
`)}function Gr(e,t){let n=[],i=e.indexOf(t);while(i!==-1)n.push(i),i=e.indexOf(t,i+t.length);return n}function ll(e,t){let n=[],i=e.split(`
|
|
1805
|
+
`),r=!1,a=Gr(e,"<thinking>"),s=Gr(e,"</thinking>");if(a.length!==s.length)n.push({type:"mismatched_tags",line:0,message:`Mismatched thinking block tags: ${a.length} opening, ${s.length} closing`,suggestion:"Ensure every <thinking> has a matching </thinking>",recovered:!1});if(a.length===0&&e.includes("</thinking>")){let o=t.autoRecover??!1;n.push({type:"missing_open_tag",line:0,message:"Found closing </thinking> tag without opening <thinking>",suggestion:"Add <thinking> tag before the closing tag",recovered:o}),r=o}if(s.length===0&&e.includes("<thinking>")){let o=t.autoRecover??!1;n.push({type:"missing_close_tag",line:0,message:"Found opening <thinking> tag without closing </thinking>",suggestion:"Add </thinking> tag to close the thinking block",recovered:o}),r=o}for(let o=0;o<a.length;o++){let c=a[o],l=s[o];if(l!==void 0&&l<c){let u=e.substring(0,l).split(`
|
|
1806
1806
|
`).length,p=t.autoRecover??!1;n.push({type:"inverted_tags",line:u,message:"Closing tag appears before opening tag",suggestion:"Remove duplicate opening tag or reorder tags correctly",recovered:p}),r=p}if(o<a.length-1&&l!==void 0){let u=a[o+1];if(u<l){let p=e.substring(0,u).split(`
|
|
1807
1807
|
`).length,m=t.autoRecover??!1;n.push({type:"nested_thinking",line:p,message:"Nested thinking blocks detected (opening tag before closing previous block)",suggestion:"Close the previous thinking block before opening a new one",recovered:m}),r=m}}}if(t.enforcePosition){let o=s.length>0?Math.max(...s):-1;if(o>=0?e.substring(o).trim().length>0:!1){let l=e.substring(0,o).split(`
|
|
1808
1808
|
`).length,u=t.autoRecover??!1;n.push({type:"content_after_thinking",line:l,message:"Content found after last thinking block",suggestion:"Move thinking blocks to beginning of message",recovered:u}),r=u}}if(t.requireContent)for(let o=0;o<a.length;o++){let c=a[o],l=s[o];if(l!==void 0){if(e.substring(c+10,l).trim().length===0){let p=e.substring(0,c).split(`
|
|
1809
|
-
`).length,m=t.autoRecover??!1;n.push({type:"empty_thinking",line:p,message:"Empty thinking block (no content between tags)",suggestion:"Add meaningful thinking content or remove the empty block",recovered:m}),r=m}}}return{hasErrors:n.length>0,errors:n,recovered:r}}function
|
|
1809
|
+
`).length,m=t.autoRecover??!1;n.push({type:"empty_thinking",line:p,message:"Empty thinking block (no content between tags)",suggestion:"Add meaningful thinking content or remove the empty block",recovered:m}),r=m}}}return{hasErrors:n.length>0,errors:n,recovered:r}}function dl(e,t){let n=e;for(let i of t){if(!i.recovered)continue;switch(i.type){case"missing_close_tag":n=n.replace(/<thinking>$/,`<thinking>
|
|
1810
1810
|
</thinking>`);break;case"missing_open_tag":n=n.replace(/^<\/thinking>/,`<thinking>
|
|
1811
1811
|
</thinking>`);break;case"inverted_tags":let r=(n.match(/<thinking>/g)||[]).length,a=(n.match(/<\/thinking>/g)||[]).length;if(r>a)n+=`
|
|
1812
1812
|
</thinking>`;break;case"nested_thinking":let s=n.lastIndexOf("<thinking>");if(n.lastIndexOf("</thinking>")<s)n+=`
|
|
1813
|
-
</thinking>`;break;case"empty_thinking":n=n.replace(/<thinking>\s*<\/thinking>/gi,"");break;case"content_after_thinking":let c=n.lastIndexOf("</thinking>");if(c>=0){if(n.substring(c+13).trim().length>0)n=n.substring(0,c+13)}break;default:break}}return n}function
|
|
1814
|
-
`).trim()}function
|
|
1815
|
-
`),r=
|
|
1816
|
-
`);for(let[c,l]of Object.entries(
|
|
1813
|
+
</thinking>`;break;case"empty_thinking":n=n.replace(/<thinking>\s*<\/thinking>/gi,"");break;case"content_after_thinking":let c=n.lastIndexOf("</thinking>");if(c>=0){if(n.substring(c+13).trim().length>0)n=n.substring(0,c+13)}break;default:break}}return n}function Xr(e,t){let n=t?.config??{enabled:!0,autoRecover:!0,strictMode:!1,enforcePosition:!0,requireContent:!0};return{"chat.message":async(i,r)=>{if(!n.enabled)return;let{sessionID:a}=i,s=cl(r.parts);if(!s.includes("<thinking>")&&!s.includes("</thinking>"))return;let o=ll(s,n);if(o.hasErrors){let c=sl(a);if(c.errorCount++,c.lastErrorTime=Date.now(),c.history.push({timestamp:Date.now(),errors:o.errors}),w){console.log(`[thinking-block-validator] Detected ${o.errors.length} thinking block validation error(s) in session ${a}`);for(let l of o.errors)if(console.log(`[thinking-block-validator] [${l.type}] Line ${l.line}: ${l.message}`),console.log(`[thinking-block-validator] Suggestion: ${l.suggestion}`),l.recovered)console.log("[thinking-block-validator] ✓ Auto-recovery applied")}if(n.autoRecover&&o.recovered){let l=dl(s,o.errors);if(w)console.log("[thinking-block-validator] [session recovered - continuing previous task]"),console.log(`[thinking-block-validator] Recovered text length: ${l.length} (original: ${s.length})`)}if(n.strictMode&&!o.recovered)console.error("[thinking-block-validator] CRITICAL: Validation failed in strict mode. Please fix the thinking block structure before continuing.")}}}}var qt={todo:[/TODO:/i,/@todo/i,/\[TODO\]/i,/待办/i,/할 일/i,/待辦/i],fixme:[/FIXME:/i,/@fixme/i,/\[FIXME\]/i,/修复/i,/수정/i,/修正/i],xxx:[/XXX:/i,/@xxx/i,/\[XXX\]/i],hack:[/HACK:/i,/@hack/i,/\[HACK\]/i],note:[/NOTE:/i,/@note/i,/\[NOTE\]/i,/注意/i,/참고/i,/註記/i],bug:[/BUG:/i,/@bug/i,/\[BUG\]/i],warning:[/WARNING:/i,/@warning/i,/\[WARNING\]/i,/경고/i],optimization:[/OPTIMIZE:/i,/PERFORMANCE:/i,/@optimize/i],refactoring:[/REFACTOR:/i,/@refactor/i],documentation:[/DOC:/i,/@doc/i]},Qr={bdd:[/^\s*#\s*Given\s+/i,/^\s*#\s*When\s+/i,/^\s*#\s*Then\s+/i,/^\s*#\s*And\s+/i,/^\s*#\s*But\s+/i,/^\s*\/\/\s*Given\s+/i,/^\s*\/\/\s*When\s+/i,/^\s*\/\/\s*Then\s+/i,/^\s*\/\/\s*And\s+/i],linter:[/^\s*#\s*noqa/i,/^\s*\/\/\s*@ts-ignore\b/i,/^\s*\/\/\s*@ts-nocheck\b/i,/^\s*\/\/\s*@ts-check\b/i,/^\s*\/\/\s*eslint-disable\b/i,/^\s*\/\/\s*eslint-enable\b/i,/^\s*\/\/\s*eslint-disable-next-line\b/i,/^\s*\/\*\s*eslint-disable\b/i,/^\s*\/\*\s*eslint-enable\b/i,/^\s*#\s*type:\s*ignore\b/i,/^\s*#\s*pylint:\s*disable\b/i,/^\s*#\s*mypy:\s*ignore\b/i],shebang:[/^#!\/bin\//,/^#!\/usr\/bin\/env\s+/],copyright:[/Copyright\s+\(c\)/i,/Copyright\s+\d{4}/i,/SPDX-License-Identifier:/i,/MIT License/i,/Apache License/i,/GPL License/i,/BSD License/i],fileHeader:[/^\s*File:\s+.*\.md/i,/^\s*Author:/i,/^\s*Date:\s*\d{4}-\d{2}-\d{2}/i,/^\s*Created:/i,/^\s*Modified:/i],documentation:[/^\s*\/\*\*[\s\S]*?\*\//,/^\s*\/\*\*[\s\S]*?@param/i,/^\s*\/\*\*[\s\S]*?@return/i,/^\s*\/\/\/[\s\S]*?@brief/i,/^\s*\/\/\/[\s\S]*?@param/i,/^\s*\/\*\*[\s\S]*?@brief/i,/^\s*#\s+@param/i,/^\s*#\s+@return/i,/^\s*#\s+@type/i],inlineDocs:[/^\s*\/\/\s*[A-Z]/,/^\s*#\s*[A-Z]/],imports:[/^\s*import\s+/,/^\s*require\s*\(/,/^\s*#\s*include\s+/,/^\s*using\s+namespace/]},Zr={javascript:{single:["//"],multi:["/*","*/"],shebang:["#!/usr/bin/env node","#!/usr/bin/nodejs"]},typescript:{single:["//"],multi:["/*","*/"],shebang:["#!/usr/bin/env node","#!/usr/bin/ts-node"]},python:{single:["#"],multi:['"""','"""'],shebang:["#!/usr/bin/env python3","#!/usr/bin/python3"]},rust:{single:["//"],multi:["/*","*/"],shebang:["#!/usr/bin/env rust-script"]},go:{single:["//"],multi:["/*","*/"]},java:{single:["//"],multi:["/*","*/"]},cpp:{single:["//"],multi:["/*","*/"]},csharp:{single:["//"],multi:["/*","*/"]},ruby:{single:["#"],multi:["=begin","=end"]},php:{single:["//","#"],multi:["/*","*/"],shebang:["#!/usr/bin/env php"]},swift:{single:["//"],multi:["/*","*/"]},kotlin:{single:["//"],multi:["/*","*/"]},scala:{single:["//"],multi:["/*","*/"]},shell:{single:["#"],multi:["<<'","'"],shebang:["#!/bin/bash","#!/bin/sh","#!/usr/bin/env bash"]},powershell:{single:["#"],multi:["<#","#>"],shebang:["#!/usr/bin/env pwsh"]},lua:{single:["--"],multi:["--[[","]]"]},sql:{single:["--"],multi:["/*","*/"]},html:{multi:["<!--","-->"]},css:{multi:["/*","*/"]},yaml:{single:["#"]},toml:{single:["#"]},json:{none:[]},xml:{multi:["<!--","-->"]},r:{single:["#"]},matlab:{single:["%"],multi:["%{","%}"]},fortran:{single:["!"],multi:["/*","*/"]},cobol:{single:["*"]},assembly:{single:[";"]}};function eo(e){let t=e.split(".").pop()?.toLowerCase();return t?{js:"javascript",jsx:"javascript",ts:"typescript",tsx:"typescript",py:"python",rs:"rust",go:"go",java:"java",cpp:"cpp",cxx:"cpp",cc:"cpp",c:"cpp",cs:"csharp",rb:"ruby",php:"php",swift:"swift",kt:"kotlin",scala:"scala",sh:"shell",bash:"shell",zsh:"shell",fish:"shell",ps1:"powershell",psm1:"powershell",lua:"lua",sql:"sql",html:"html",css:"css",scss:"css",yaml:"yaml",yml:"yaml",toml:"toml",json:"json",xml:"xml",r:"r",m:"matlab",f:"fortran",f90:"fortran",f95:"fortran",cbl:"cobol",cob:"cobol",asm:"assembly",s:"assembly"}[t]??null:null}x();function ul(e){return e.filter((t)=>t.type==="text").map((t)=>t.text).join(`
|
|
1814
|
+
`).trim()}function to(e){let t=e.trim();for(let[n,i]of Object.entries(Qr))for(let r of i)if(r.test(t))return!0;return!1}function pl(e){let t=[],n=/(?:^|\n)Writing to (.+?)\n/g,i=[...e.matchAll(n)];for(let r of i){let a=r[1],s=r.index+r[0].length,o=e.length,c=e.substring(s).match(/\nWriting to .+?\n/);if(c)o=s+c.index;let l=e.substring(s,o).trim();t.push({filename:a,content:l})}return t}function ml(e,t){let n=[],i=e.split(`
|
|
1815
|
+
`),r=eo(t),a=r?Zr[r]:null,s=!1,o=0;for(let c=0;c<i.length;c++){let l=i[c],u=l.trim();if(a&&"multi"in a&&a.multi.length>0){if(u.startsWith(a.multi[0])||s){if(!s)s=!0,o=c;if(u.endsWith(a.multi[1]))s=!1;continue}}if(a&&"shebang"in a&&Array.isArray(a.shebang)&&a.shebang.length>0){if(l.startsWith(a.shebang[0]))continue}let p=!1;if(a&&"single"in a)p=a.single.some((m)=>u.startsWith(m));if(!p){if(u.startsWith("//")||u.startsWith("#"))p=!0}if(p){for(let[m,g]of Object.entries(qt))for(let f of g)if(f.test(u)){let b=to(u);n.push({type:m,line:c+1,text:u,isException:b})}}}return n}function no(e,t){let n=t?.config??{enabled:!0,checkAfterToolUse:!0,requireJustification:!1};return{"chat.message":async(i,r)=>{if(!n.enabled)return;let a=ul(r.parts),s=[],o=a.split(`
|
|
1816
|
+
`);for(let[c,l]of Object.entries(qt))o.forEach((u,p)=>{for(let m of l)if(m.test(u)){if(!to(u))s.push({type:c,line:p+1,text:u.trim()})}});if(s.length>0&&w)console.log(`[comment-checker] Found ${s.length} annotated comments that need justification`)},"tool.execute.after":async(i,r)=>{if(!n.enabled||!n.checkAfterToolUse)return;if(!r.output)return;let{tool:a}=i;if(!["write","edit","multiEdit"].includes(a))return;let o=typeof r.output==="string"?r.output:JSON.stringify(r.output),c=pl(o),l=[];for(let{filename:u,content:p}of c){let g=ml(p,u).filter((f)=>!f.isException);if(g.length>0){if(l.push({filename:u,comments:g}),w){console.log(`[comment-checker] File ${u}:`);for(let f of g)console.log(` Line ${f.line}: ${f.type} - ${f.text.substring(0,50)}`)}}}if(n.requireJustification&&l.length>0){let u=`
|
|
1817
1817
|
|
|
1818
1818
|
${"=".repeat(60)}
|
|
1819
1819
|
COMMENT CHECKER: ${l.length} file(s) contain non-exception annotated comments (TODO, FIXME, etc.)
|
|
@@ -1827,13 +1827,13 @@ File: ${p}
|
|
|
1827
1827
|
`}if(u+=`
|
|
1828
1828
|
Please provide justification for each comment or remove them.
|
|
1829
1829
|
${"=".repeat(60)}
|
|
1830
|
-
`,w)console.log(u)}}}}var
|
|
1830
|
+
`,w)console.log(u)}}}}x();var Je=S("memory-guard");function Kt(e,t){let n={enabled:t?.enabled??!0,warningThresholdMB:t?.warningThresholdMB??1024,criticalThresholdMB:t?.criticalThresholdMB??1536,killThresholdMB:t?.killThresholdMB??2048,checkInterval:t?.checkInterval??10};if(!n.enabled)return{};let i=0,r=[],a=50,s=()=>{let l=process.memoryUsage();return{rss:Math.round(l.rss/1024/1024),heapUsed:Math.round(l.heapUsed/1024/1024),external:Math.round(l.external/1024/1024),timestamp:Date.now()}},o=(l)=>{return`RSS: ${l.rss}MB | Heap: ${l.heapUsed}MB | External: ${l.external}MB`},c=()=>{if(r.length<2)return 0;let l=r.slice(-5),u=l[0],p=l[l.length-1];return Math.round((p.rss-u.rss)/u.rss*100)};return{"tool.execute.after":async(l,u)=>{try{if(i++,i%n.checkInterval!==0)return;let p=s();if(r.push(p),r.length>a)r=r.slice(-a);let m=c(),{rss:g}=p;if(g>n.warningThresholdMB&&g<n.criticalThresholdMB){if(Je.warn(`Memory usage elevated: ${o(p)}`),m>20)Je.warn(`Memory growing rapidly (+${m}% in last ${n.checkInterval} tools)`)}if(g>=n.criticalThresholdMB&&g<n.killThresholdMB){if(console.error(`[kraken-code:memory-guard] \uD83D\uDD34 CRITICAL: Memory at ${g}MB`),console.error("[kraken-code:memory-guard] Consider starting a new session soon"),globalThis.gc){Je.debug("Attempting garbage collection..."),globalThis.gc();let f=s(),b=g-f.rss;if(b>50)Je.debug(`GC freed ~${b}MB`)}}if(g>=n.killThresholdMB){console.error(`[kraken-code:memory-guard] \uD83D\uDC80 FATAL: Memory at ${g}MB exceeds kill threshold (${n.killThresholdMB}MB)`),console.error("[kraken-code:memory-guard] Emergency shutdown to prevent segfault");let f=l.sessionID||"unknown";console.error(`[kraken-code:memory-guard] Session: ${f}, Tools executed: ${i}`),setTimeout(()=>{process.exit(1)},100)}}catch(p){console.error("[kraken-code:memory-guard] Error in tool.execute.after:",p)}},event:async(l)=>{try{if(l?.type==="session.end"){let p=s();if(console.log(`[kraken-code:memory-guard] Session ended. Final memory: ${o(p)}`),r.length>2){let m=r[0].rss,f=p.rss-m,b=f>0?"↗️ increased":f<0?"↘️ decreased":"➡️ stable";console.log(`[kraken-code:memory-guard] Memory trend: ${b} by ${Math.abs(f)}MB during session`)}}}catch(u){console.error("[kraken-code:memory-guard] Error in event:",u)}}}}function Bt(e,t){let n={enabled:t?.enabled??!0,toolsBeforePause:t?.toolsBeforePause??15,pauseDurationMs:t?.pauseDurationMs??50,gcHintInterval:t?.gcHintInterval??5,highMemoryPauseMs:t?.highMemoryPauseMs??200,highMemoryThresholdMB:t?.highMemoryThresholdMB??1200};if(!n.enabled)return{};let i=0,r=0,a=()=>{return Math.round(process.memoryUsage().rss/1024/1024)},s=(o)=>{return new Promise((c)=>setTimeout(c,o))};return{"tool.execute.before":async(o)=>{try{if(i++,i%n.gcHintInterval===0){if(await s(1),globalThis.gc&&i%(n.gcHintInterval*4)===0)globalThis.gc()}if(i%n.toolsBeforePause===0){if(Date.now()-r>n.pauseDurationMs){let p=a(),m=p>n.highMemoryThresholdMB?n.highMemoryPauseMs:n.pauseDurationMs;if(p>n.highMemoryThresholdMB)console.warn(`[kraken-code:tool-throttle] High memory (${p}MB), pausing ${m}ms to allow cleanup`);await s(m),r=Date.now()}}if((o.tool||"")==="bash"&&i%3===0)await s(5)}catch(c){console.error("[kraken-code:tool-throttle] Error in tool.execute.before:",c)}},"tool.execute.after":async(o,c)=>{try{if((o.tool||"")==="bash"&&c?.output){let u=typeof c.output==="string"?c.output.length:JSON.stringify(c.output).length;if(u>500000){if(console.warn(`[kraken-code:tool-throttle] Large bash output (${Math.round(u/1024)}KB), truncating`),typeof c.output==="string")c.output=c.output.slice(0,1e5)+`
|
|
1831
1831
|
|
|
1832
|
-
[Output truncated by kraken-code due to size - ${Math.round(u/1024)}KB exceeded 500KB limit]`}}}catch(l){console.error("[kraken-code:tool-throttle] Error in tool.execute.after:",l)}}}}var ee=x("session-lifecycle");function qt(e,t){let n={enabled:t?.enabled??!0,maxSessionDurationMinutes:t?.maxSessionDurationMinutes??45,maxToolsPerSession:t?.maxToolsPerSession??100,warningThresholdTools:t?.warningThresholdTools??0.7,warningThresholdMinutes:t?.warningThresholdMinutes??0.8};if(!n.enabled)return{};let i=new Map,r=(s)=>{if(!i.has(s))i.set(s,{startTime:Date.now(),toolCount:0,warningsIssued:new Set});return i.get(s)},a=(s)=>{let o=Math.floor(s/60000),c=Math.floor(s%60000/1000);return`${o}m ${c}s`};return{"tool.execute.before":async(s)=>{try{let o=s.sessionID;if(!o)return;let c=r(o);c.toolCount++;let l=Date.now()-c.startTime,u=l/60000,p=Math.floor(n.maxToolsPerSession*n.warningThresholdTools);if(c.toolCount===p){if(!c.warningsIssued.has("tools-70"))c.warningsIssued.add("tools-70"),ee.warn(`Session approaching tool limit (${c.toolCount}/${n.maxToolsPerSession})`),ee.warn("Consider starting a new session soon to prevent memory issues")}if(c.toolCount===n.maxToolsPerSession)console.error(`[kraken-code:session-lifecycle] \uD83D\uDD34 Session has reached tool limit (${n.maxToolsPerSession})`),console.error("[kraken-code:session-lifecycle] Memory leak risk is HIGH. Start a new session immediately.");let m=n.maxSessionDurationMinutes*n.warningThresholdMinutes;if(u>=m&&u<n.maxSessionDurationMinutes){if(!c.warningsIssued.has("duration-80")){c.warningsIssued.add("duration-80");let g=Math.round(n.maxSessionDurationMinutes-u);ee.warn(`Session running long (${Math.round(u)}m)`),ee.warn(`Recommend restart within ${g} minutes`),console.warn(`[kraken-code:session-lifecycle] Recommend restart within ${g} minutes`)}}if(u>=n.maxSessionDurationMinutes)console.error(`[kraken-code:session-lifecycle] ⏰ Session exceeded max duration (${n.maxSessionDurationMinutes}m)`),console.error(`[kraken-code:session-lifecycle] Current: ${Math.round(u)}m - Memory leak risk CRITICAL`);if(c.toolCount%25===0)ee.debug(`Session stats: ${c.toolCount} tools, ${a(l)} elapsed`)}catch(o){console.error("[kraken-code:session-lifecycle] Error in tool.execute.before:",o)}},event:async(s)=>{try{let o=s,c=o?.sessionID;if(o?.type==="session.start"&&c)r(c),ee.debug(`Session started - Limits: ${n.maxToolsPerSession} tools, ${n.maxSessionDurationMinutes}min`);if(o?.type==="session.end"&&c){let l=i.get(c);if(l){let u=Date.now()-l.startTime;ee.debug(`Session ended: ${l.toolCount} tools in ${a(u)}`),i.delete(c)}}}catch(o){console.error("[kraken-code:session-lifecycle] Error in event:",o)}}}}var Kt={enforceMinimumTestCases:!0,enforceCoverageThreshold:!0,requireApproval:!1,allowPartialImplementation:!1};function Ae(e,t,n=Kt){let i=[],r=[];if(!e.exists){if(t.requiredBeforeImplementation)i.push({type:"missing-test-cases",details:"No test plan exists for this feature",severity:"error"});return{valid:!1,violations:i,recommendations:r}}if(n.enforceMinimumTestCases){let s=e.testCases.length;if(s<t.minTestCases)i.push({type:"missing-test-cases",details:`Test plan has ${s} test cases, minimum required is ${t.minTestCases}`,severity:"error"}),r.push(`Add ${t.minTestCases-s} more test cases`)}if(n.enforceCoverageThreshold&&t.requireCoverageThreshold&&t.coverageThresholdPercent>0){if(e.coverageTarget===void 0)i.push({type:"insufficient-coverage",details:"Coverage target is not specified in test plan",severity:"warning"}),r.push(`Specify coverage target (min ${t.coverageThresholdPercent}%)`);else if(e.coverageTarget<t.coverageThresholdPercent)i.push({type:"insufficient-coverage",details:`Coverage target ${e.coverageTarget}% is below required ${t.coverageThresholdPercent}%`,severity:"error"}),r.push(`Increase coverage target to at least ${t.coverageThresholdPercent}%`)}if(n.requireApproval&&!e.approved)i.push({type:"missing-approval",details:"Test plan has not been approved",severity:"error"}),r.push("Request approval for the test plan");let a=new Set(e.testCases.map((s)=>s.category));if(!a.has("edge-case")&&n.enforceMinimumTestCases)r.push("Consider adding edge case tests for more comprehensive coverage");if(!a.has("error-path")&&n.enforceMinimumTestCases)r.push("Consider adding error path tests for error handling coverage");return{valid:i.filter((s)=>s.severity==="error").length===0,violations:i,recommendations:r}}function to(e){let t={totalTestCases:e.testCases.length,happyPathCases:0,edgeCaseCases:0,errorPathCases:0,integrationCases:0,coveragePercentage:e.coverageTarget,approvalStatus:e.approved?"approved":"pending"};if(!e.exists)return t.approvalStatus="none",t;for(let n of e.testCases)switch(n.category){case"happy-path":t.happyPathCases++;break;case"edge-case":t.edgeCaseCases++;break;case"error-path":t.errorPathCases++;break;case"integration":t.integrationCases++;break}return t}function no(e,t){if(!e.exists)return!t.requiredBeforeImplementation;return Ae(e,t,{enforceMinimumTestCases:!0,enforceCoverageThreshold:t.requireCoverageThreshold,requireApproval:!1,allowPartialImplementation:!1}).valid}var ul={};function pl(e){return![/\.test\.[jt]sx?$/,/\.spec\.[jt]sx?$/,/__tests__/,/\/test\//,/\/tests\//,/node_modules/,/\.md$/,/\.json$/].some((n)=>n.test(e))}function ml(e){return e.replace(/\.(ts|tsx|js|jsx)$/,"").replace(/\.test$|\.spec$/,"")}function gl(e){let t=ul[e];return t?{exists:!0,testCases:Array(t.testCases).fill({}),coverageTarget:t.coverageTarget,approved:t.approved}:{exists:!1,testCases:[],approved:!1}}function io(){return{"tool.execute.before":async(e,t)=>{let n=U();if(!n?.enabled)return;let i=e.tool;if(i!=="edit"&&i!=="write")return;let a=t?.filePath;if(!a||!pl(a))return;let s=n.testPlan;if(!s?.requiredBeforeImplementation)return;let o=ml(a),c=gl(o),l={minTestCases:s.minTestCases,requireCoverageThreshold:s.requireCoverageThreshold,coverageThresholdPercent:s.coverageThresholdPercent,requiredBeforeImplementation:s.requiredBeforeImplementation};if(!no(c,l)){let p=Ae(c,l).violations.map((m)=>m.details).join("; ");throw Error(`Blitzkrieg Test Plan Violation: ${p}. Please create a test plan for this feature before implementing. Use registerTestPlan('${o}', testCaseCount, coverageTarget, approved) to register a test plan.`)}}}}var fl={enforceWriteTestFirst:!0,forbidCodeWithoutTest:!0,allowRefactorWithoutTest:!0,enforceTestFirstSeverity:"block",forbidCodeWithoutTestSeverity:"block"};function Bt(e){return[/\.test\.[jt]sx?$/,/\.spec\.[jt]sx?$/,/\/__tests__\/.*\.[jt]sx?$/,/\/test\/[^\/]*\.[jt]sx?$/,/\/tests\/[^\/]*\.[jt]sx?$/].some((n)=>n.test(e))}function Jt(e){return![/\.test\.[jt]sx?$/,/\.spec\.[jt]sx?$/,/\/__tests__\//,/\/test\/[^\/]*\.[jt]sx?$/,/\/tests\/[^\/]*\.[jt]sx?$/,/node_modules/,/\/dist\//,/\/build\//].some((n)=>n.test(e))}function Yt(e,t){if(!t)return!1;let i=[/refactor/i,/extract/i,/restructure/i,/reorganize/i,/rename/i,/move.*function/i].some((a)=>a.test(e)),r=e.length>t.length*0.8&&e.length<t.length*1.5;return i&&r}function ro(e,t,n=fl,i){let r=[],a=[],s=Bt(e.filePath),o=Jt(e.filePath);if(s)return t.testsWritten.push(e),t.currentCompliance.testWrittenFirst=!0,t.currentCompliance.testFilePaths.push(e.filePath),{decision:"allow",reason:"Test file operations are always allowed",violations:[],suggestions:[]};if(!o)return{decision:"allow",reason:"Non-implementation file operations are not subject to TDD enforcement",violations:[],suggestions:[]};t.filesWritten.push(e),t.currentCompliance.implementationFilePaths.push(e.filePath);let c=Yt(e.content,i);if(t.currentCompliance.isRefactor=c,c&&n.allowRefactorWithoutTest)return{decision:"allow",reason:"Refactor operations are allowed without new tests when configured",violations:[],suggestions:[]};if(n.enforceWriteTestFirst&&!t.currentCompliance.testWrittenFirst)r.push({type:"test-not-first",file:e.filePath,severity:n.enforceTestFirstSeverity}),a.push("Write tests before implementing the feature (TDD test-first principle)");if(n.forbidCodeWithoutTest&&t.testsWritten.length===0)r.push({type:"code-without-test",file:e.filePath,severity:n.forbidCodeWithoutTestSeverity}),a.push("Write corresponding test files before implementation code");if(r.some((u)=>u.severity==="error"))return{decision:"block",reason:"TDD violation detected. See violation details for more information.",violations:r,suggestions:a};else if(r.length>0)return{decision:"warn",reason:"TDD best practice not followed. Consider the following suggestions.",violations:r,suggestions:a};return{decision:"allow",reason:"Operation is TDD-compliant",violations:[],suggestions:[]}}var Vt=new Map;function hl(e){if(!Vt.has(e))Vt.set(e,{sessionId:e,testsWritten:[],implementationFilesWritten:[]});return Vt.get(e)}async function yl(e){return}function oo(){return{"tool.execute.before":async(e,t)=>{let n=U();if(!n?.enabled)return;let{tool:i,sessionID:r}=e;if(i!=="edit"&&i!=="write")return;let a=t,s=a?.filePath;if(!s)return;let o=hl(r);if(Bt(s)){o.testsWritten.push(s);return}if(!Jt(s))return;let c=n.tddWorkflow,l={enforceWriteTestFirst:c.enforceWriteTestFirst,forbidCodeWithoutTest:c.forbidCodeWithoutTest,allowRefactorWithoutTest:c.allowRefactorWithoutTest,enforceTestFirstSeverity:"block",forbidCodeWithoutTestSeverity:"block"},u=await yl(s),p={filePath:s,operation:i,content:a?.content||"",timestamp:new Date().toISOString()},m=ro(p,{sessionId:r,startTime:new Date().toISOString(),filesWritten:o.implementationFilesWritten.map((g)=>({filePath:g,operation:"write",content:"",timestamp:new Date().toISOString()})),testsWritten:o.testsWritten.map((g)=>({filePath:g,operation:"write",content:"",timestamp:new Date().toISOString()})),currentCompliance:{testWrittenFirst:o.testsWritten.length>0,codeHasTest:!1,isRefactor:Yt(p.content,u),violations:[],testFilePaths:o.testsWritten,implementationFilePaths:o.implementationFilesWritten}},l,u);if(o.implementationFilesWritten.push(s),m.decision==="block"){let g=m.violations.map((f)=>`${f.type}: ${f.file}`).join("; ");throw Error(`Blitzkrieg TDD Violation: ${g}. ${m.reason}
|
|
1832
|
+
[Output truncated by kraken-code due to size - ${Math.round(u/1024)}KB exceeded 500KB limit]`}}}catch(l){console.error("[kraken-code:tool-throttle] Error in tool.execute.after:",l)}}}}x();var ne=S("session-lifecycle");function Jt(e,t){let n={enabled:t?.enabled??!0,maxSessionDurationMinutes:t?.maxSessionDurationMinutes??45,maxToolsPerSession:t?.maxToolsPerSession??100,warningThresholdTools:t?.warningThresholdTools??0.7,warningThresholdMinutes:t?.warningThresholdMinutes??0.8};if(!n.enabled)return{};let i=new Map,r=(s)=>{if(!i.has(s))i.set(s,{startTime:Date.now(),toolCount:0,warningsIssued:new Set});return i.get(s)},a=(s)=>{let o=Math.floor(s/60000),c=Math.floor(s%60000/1000);return`${o}m ${c}s`};return{"tool.execute.before":async(s)=>{try{let o=s.sessionID;if(!o)return;let c=r(o);c.toolCount++;let l=Date.now()-c.startTime,u=l/60000,p=Math.floor(n.maxToolsPerSession*n.warningThresholdTools);if(c.toolCount===p){if(!c.warningsIssued.has("tools-70"))c.warningsIssued.add("tools-70"),ne.warn(`Session approaching tool limit (${c.toolCount}/${n.maxToolsPerSession})`),ne.warn("Consider starting a new session soon to prevent memory issues")}if(c.toolCount===n.maxToolsPerSession)console.error(`[kraken-code:session-lifecycle] \uD83D\uDD34 Session has reached tool limit (${n.maxToolsPerSession})`),console.error("[kraken-code:session-lifecycle] Memory leak risk is HIGH. Start a new session immediately.");let m=n.maxSessionDurationMinutes*n.warningThresholdMinutes;if(u>=m&&u<n.maxSessionDurationMinutes){if(!c.warningsIssued.has("duration-80")){c.warningsIssued.add("duration-80");let g=Math.round(n.maxSessionDurationMinutes-u);ne.warn(`Session running long (${Math.round(u)}m)`),ne.warn(`Recommend restart within ${g} minutes`),console.warn(`[kraken-code:session-lifecycle] Recommend restart within ${g} minutes`)}}if(u>=n.maxSessionDurationMinutes)console.error(`[kraken-code:session-lifecycle] ⏰ Session exceeded max duration (${n.maxSessionDurationMinutes}m)`),console.error(`[kraken-code:session-lifecycle] Current: ${Math.round(u)}m - Memory leak risk CRITICAL`);if(c.toolCount%25===0)ne.debug(`Session stats: ${c.toolCount} tools, ${a(l)} elapsed`)}catch(o){console.error("[kraken-code:session-lifecycle] Error in tool.execute.before:",o)}},event:async(s)=>{try{let o=s,c=o?.sessionID;if(o?.type==="session.start"&&c)r(c),ne.debug(`Session started - Limits: ${n.maxToolsPerSession} tools, ${n.maxSessionDurationMinutes}min`);if(o?.type==="session.end"&&c){let l=i.get(c);if(l){let u=Date.now()-l.startTime;ne.debug(`Session ended: ${l.toolCount} tools in ${a(u)}`),i.delete(c)}}}catch(o){console.error("[kraken-code:session-lifecycle] Error in event:",o)}}}}var Yt={enforceMinimumTestCases:!0,enforceCoverageThreshold:!0,requireApproval:!1,allowPartialImplementation:!1};function ke(e,t,n=Yt){let i=[],r=[];if(!e.exists){if(t.requiredBeforeImplementation)i.push({type:"missing-test-cases",details:"No test plan exists for this feature",severity:"error"});return{valid:!1,violations:i,recommendations:r}}if(n.enforceMinimumTestCases){let s=e.testCases.length;if(s<t.minTestCases)i.push({type:"missing-test-cases",details:`Test plan has ${s} test cases, minimum required is ${t.minTestCases}`,severity:"error"}),r.push(`Add ${t.minTestCases-s} more test cases`)}if(n.enforceCoverageThreshold&&t.requireCoverageThreshold&&t.coverageThresholdPercent>0){if(e.coverageTarget===void 0)i.push({type:"insufficient-coverage",details:"Coverage target is not specified in test plan",severity:"warning"}),r.push(`Specify coverage target (min ${t.coverageThresholdPercent}%)`);else if(e.coverageTarget<t.coverageThresholdPercent)i.push({type:"insufficient-coverage",details:`Coverage target ${e.coverageTarget}% is below required ${t.coverageThresholdPercent}%`,severity:"error"}),r.push(`Increase coverage target to at least ${t.coverageThresholdPercent}%`)}if(n.requireApproval&&!e.approved)i.push({type:"missing-approval",details:"Test plan has not been approved",severity:"error"}),r.push("Request approval for the test plan");let a=new Set(e.testCases.map((s)=>s.category));if(!a.has("edge-case")&&n.enforceMinimumTestCases)r.push("Consider adding edge case tests for more comprehensive coverage");if(!a.has("error-path")&&n.enforceMinimumTestCases)r.push("Consider adding error path tests for error handling coverage");return{valid:i.filter((s)=>s.severity==="error").length===0,violations:i,recommendations:r}}function io(e){let t={totalTestCases:e.testCases.length,happyPathCases:0,edgeCaseCases:0,errorPathCases:0,integrationCases:0,coveragePercentage:e.coverageTarget,approvalStatus:e.approved?"approved":"pending"};if(!e.exists)return t.approvalStatus="none",t;for(let n of e.testCases)switch(n.category){case"happy-path":t.happyPathCases++;break;case"edge-case":t.edgeCaseCases++;break;case"error-path":t.errorPathCases++;break;case"integration":t.integrationCases++;break}return t}function ro(e,t){if(!e.exists)return!t.requiredBeforeImplementation;return ke(e,t,{enforceMinimumTestCases:!0,enforceCoverageThreshold:t.requireCoverageThreshold,requireApproval:!1,allowPartialImplementation:!1}).valid}var gl={};function fl(e){return![/\.test\.[jt]sx?$/,/\.spec\.[jt]sx?$/,/__tests__/,/\/test\//,/\/tests\//,/node_modules/,/\.md$/,/\.json$/].some((n)=>n.test(e))}function hl(e){return e.replace(/\.(ts|tsx|js|jsx)$/,"").replace(/\.test$|\.spec$/,"")}function yl(e){let t=gl[e];return t?{exists:!0,testCases:Array(t.testCases).fill({}),coverageTarget:t.coverageTarget,approved:t.approved}:{exists:!1,testCases:[],approved:!1}}function oo(){return{"tool.execute.before":async(e,t)=>{let n=H();if(!n?.enabled)return;let i=e.tool;if(i!=="edit"&&i!=="write")return;let a=t?.filePath;if(!a||!fl(a))return;let s=n.testPlan;if(!s?.requiredBeforeImplementation)return;let o=hl(a),c=yl(o),l={minTestCases:s.minTestCases,requireCoverageThreshold:s.requireCoverageThreshold,coverageThresholdPercent:s.coverageThresholdPercent,requiredBeforeImplementation:s.requiredBeforeImplementation};if(!ro(c,l)){let p=ke(c,l).violations.map((m)=>m.details).join("; ");throw Error(`Blitzkrieg Test Plan Violation: ${p}. Please create a test plan for this feature before implementing. Use registerTestPlan('${o}', testCaseCount, coverageTarget, approved) to register a test plan.`)}}}}var bl={enforceWriteTestFirst:!0,forbidCodeWithoutTest:!0,allowRefactorWithoutTest:!0,enforceTestFirstSeverity:"block",forbidCodeWithoutTestSeverity:"block"};function Vt(e){return[/\.test\.[jt]sx?$/,/\.spec\.[jt]sx?$/,/\/__tests__\/.*\.[jt]sx?$/,/\/test\/[^\/]*\.[jt]sx?$/,/\/tests\/[^\/]*\.[jt]sx?$/].some((n)=>n.test(e))}function zt(e){return![/\.test\.[jt]sx?$/,/\.spec\.[jt]sx?$/,/\/__tests__\//,/\/test\/[^\/]*\.[jt]sx?$/,/\/tests\/[^\/]*\.[jt]sx?$/,/node_modules/,/\/dist\//,/\/build\//].some((n)=>n.test(e))}function Gt(e,t){if(!t)return!1;let i=[/refactor/i,/extract/i,/restructure/i,/reorganize/i,/rename/i,/move.*function/i].some((a)=>a.test(e)),r=e.length>t.length*0.8&&e.length<t.length*1.5;return i&&r}function ao(e,t,n=bl,i){let r=[],a=[],s=Vt(e.filePath),o=zt(e.filePath);if(s)return t.testsWritten.push(e),t.currentCompliance.testWrittenFirst=!0,t.currentCompliance.testFilePaths.push(e.filePath),{decision:"allow",reason:"Test file operations are always allowed",violations:[],suggestions:[]};if(!o)return{decision:"allow",reason:"Non-implementation file operations are not subject to TDD enforcement",violations:[],suggestions:[]};t.filesWritten.push(e),t.currentCompliance.implementationFilePaths.push(e.filePath);let c=Gt(e.content,i);if(t.currentCompliance.isRefactor=c,c&&n.allowRefactorWithoutTest)return{decision:"allow",reason:"Refactor operations are allowed without new tests when configured",violations:[],suggestions:[]};if(n.enforceWriteTestFirst&&!t.currentCompliance.testWrittenFirst)r.push({type:"test-not-first",file:e.filePath,severity:n.enforceTestFirstSeverity}),a.push("Write tests before implementing the feature (TDD test-first principle)");if(n.forbidCodeWithoutTest&&t.testsWritten.length===0)r.push({type:"code-without-test",file:e.filePath,severity:n.forbidCodeWithoutTestSeverity}),a.push("Write corresponding test files before implementation code");if(r.some((u)=>u.severity==="error"))return{decision:"block",reason:"TDD violation detected. See violation details for more information.",violations:r,suggestions:a};else if(r.length>0)return{decision:"warn",reason:"TDD best practice not followed. Consider the following suggestions.",violations:r,suggestions:a};return{decision:"allow",reason:"Operation is TDD-compliant",violations:[],suggestions:[]}}var Xt=new Map;function wl(e){if(!Xt.has(e))Xt.set(e,{sessionId:e,testsWritten:[],implementationFilesWritten:[]});return Xt.get(e)}async function Sl(e){return}function so(){return{"tool.execute.before":async(e,t)=>{let n=H();if(!n?.enabled)return;let{tool:i,sessionID:r}=e;if(i!=="edit"&&i!=="write")return;let a=t,s=a?.filePath;if(!s)return;let o=wl(r);if(Vt(s)){o.testsWritten.push(s);return}if(!zt(s))return;let c=n.tddWorkflow,l={enforceWriteTestFirst:c.enforceWriteTestFirst,forbidCodeWithoutTest:c.forbidCodeWithoutTest,allowRefactorWithoutTest:c.allowRefactorWithoutTest,enforceTestFirstSeverity:"block",forbidCodeWithoutTestSeverity:"block"},u=await Sl(s),p={filePath:s,operation:i,content:a?.content||"",timestamp:new Date().toISOString()},m=ao(p,{sessionId:r,startTime:new Date().toISOString(),filesWritten:o.implementationFilesWritten.map((g)=>({filePath:g,operation:"write",content:"",timestamp:new Date().toISOString()})),testsWritten:o.testsWritten.map((g)=>({filePath:g,operation:"write",content:"",timestamp:new Date().toISOString()})),currentCompliance:{testWrittenFirst:o.testsWritten.length>0,codeHasTest:!1,isRefactor:Gt(p.content,u),violations:[],testFilePaths:o.testsWritten,implementationFilePaths:o.implementationFilesWritten}},l,u);if(o.implementationFilesWritten.push(s),m.decision==="block"){let g=m.violations.map((f)=>`${f.type}: ${f.file}`).join("; ");throw Error(`Blitzkrieg TDD Violation: ${g}. ${m.reason}
|
|
1833
1833
|
|
|
1834
1834
|
Suggestions:
|
|
1835
1835
|
${m.suggestions.map((f)=>` - ${f}`).join(`
|
|
1836
|
-
`)}`)}if(m.decision==="warn"&&m.violations.length>0);},"tool.execute.after":async(e)=>{let t=e.sessionID}}}var ao={strictMode:!1,ignoreWarnings:!1,coverageThreshold:80,minAssertions:1,minEdgeCases:1};class so{parse(e,t){let n=this.parseErrors(e),i=this.countWarnings(e);return{success:t===0,exitCode:t,output:e,errors:n,warnings:i}}parseErrors(e){let t=[],n=/(.+?):(\d+):(\d+)\s*[-–]\s*(error|warning)\s*(TS\d+|ESLint)\s*:\s*(.+)/g,i;while((i=n.exec(e))!==null)t.push({file:i[1],line:parseInt(i[2],10),column:parseInt(i[3],10),message:i[6],code:i[5],severity:i[4]==="error"?"error":"warning"});let r=/File "(.+?)", line (\d+), in .+?(.+)/g;while((i=r.exec(e))!==null)if(!t.some((s)=>s.file===i[1]&&s.line===parseInt(i[2],10)))t.push({file:i[1],line:parseInt(i[2],10),message:i[3].trim(),code:"PythonError",severity:"error"});let a=/(error|Error|ERROR)[:\s]+(.+)/g;while((i=a.exec(e))!==null){let s=i[2].substring(0,50);if(!t.some((o)=>o.message.includes(s)))t.push({message:i[2].trim(),code:"GenericError",severity:"error"})}return t}countWarnings(e){let t=[/(warning|Warning|WARNING)[:\s]+/g,/warn[:\s]+/gi],n=0;for(let i of t){let r=e.match(i);if(r)n+=r.length}return n}}class co{parse(e){let t=this.countAssertions(e),n=this.identifyEdgeCases(e);return{testPath:this.extractTestPath(e),assertions:t,edgeCasesCovered:n.length,executionLog:e}}countAssertions(e){let t=[/\b(assert|expect|should|it\.only|test\.only)\s*\(/gi,/passes|failures/gi],n=0;for(let r of t){let a=e.match(r);if(a)n+=a.length}let i=e.match(/(\d+)\s+(?:passes|fail|tests?)/i);if(i){let r=parseInt(i[1],10);if(r>n)n=r}return n}identifyEdgeCases(e){let t=[/null/i,/undefined/i,/empty/gi,/zero/gi,/negative/i,/overflow/i,/underflow/i,/async|await/gi,/error|exception/gi,/timeout/i,/boundary/i,/edge/gi],n=[];for(let i of t)if(i.test(e)){let r=i.source.replace(/^\^?|\\b|\\/gi,"").substring(0,30);if(!n.includes(r))n.push(r)}return n}extractTestPath(e){let t=[/Running\s+(.+?test.+\.(?:ts|js|py))/i,/Test\s+Files.*[\n\r]+.*(.+\.(?:test|spec)\.[jt]sx?)/i];for(let n of t){let i=e.match(n);if(i)return i[1]}return""}}class lo{parse(e,t){let n=this.parseCoveragePercentages(e);return{statementCoverage:n.statement,branchCoverage:n.branch,functionCoverage:n.function,lineCoverage:n.line,coverageOutput:e,meetsThreshold:this.checkThreshold(n,t)}}parseCoveragePercentages(e){let t={statement:0,branch:0,function:0,line:0},n=[[/Statements?\s*[:\s]+(\d+(?:\.\d+)?)%/i,"statement"],[/Branches?\s*[:\s]+(\d+(?:\.\d+)?)%/i,"branch"],[/Functions?\s*[:\s]+(\d+(?:\.\d+)?)%/i,"function"],[/Lines?\s*[:\s]+(\d+(?:\.\d+)?)%/i,"line"],[/coverage:\s+(\d+(?:\.\d+)?)%/i,"statement"]];for(let[i,r]of n){let a=e.match(i);if(a)t[r]=parseFloat(a[1])}return t}checkThreshold(e,t){let i=[e.statement,e.branch,e.function,e.line].filter((a)=>a>0);if(i.length===0)return!1;return i.reduce((a,s)=>a+s,0)/i.length>=t}}class bl{buildParser=new so;testParser=new co;coverageParser=new lo;verify(e,t,n,i,r,a=ao){let s=this.collectEvidence(e,t,n,i,a.coverageThreshold),o=[],c=[];this.checkBuildEvidence(s.buildEvidence,o,c),this.checkTestEvidence(s.testEvidence,r,o,c,a),this.checkCoverageEvidence(s.coverageEvidence,r,o,c,a);let l=this.generateSummary(s,o,c);return{compliant:!o.some((m)=>m.severity==="error")&&!l.failedTests,evidence:s,violations:o,warnings:c,summary:l}}collectEvidence(e,t,n,i,r){let a=this.buildParser.parse(e,t),s=this.testParser.parse(n),o=this.coverageParser.parse(i,r);return{buildEvidence:a,testEvidence:s,coverageEvidence:o,timestamp:new Date().toISOString()}}checkBuildEvidence(e,t,n){if(!e.success)t.push({type:"build-failed",message:`Build failed with exit code ${e.exitCode}`,severity:"error",details:{exitCode:e.exitCode,errorCount:e.errors.length}});else if(e.warnings>0)n.push({type:"build-warnings",message:`Build completed with ${e.warnings} warning(s)`,suggestion:"Review warnings and fix if necessary"})}checkTestEvidence(e,t,n,i,r){if(t.requireTestExecutionEvidence&&e.executionLog===void 0)n.push({type:"no-test-execution",message:"No test execution evidence found",severity:"error"});if(t.requireAssertionEvidence&&e.assertions<r.minAssertions)n.push({type:"no-assertions",message:`Insufficient assertions: found ${e.assertions}, minimum required is ${r.minAssertions}`,severity:"error",details:{actual:e.assertions,required:r.minAssertions}});if(t.requireEdgeCaseEvidence&&e.edgeCasesCovered<r.minEdgeCases)n.push({type:"no-edge-cases",message:`No edge cases covered: minimum required is ${r.minEdgeCases}`,severity:"error",details:{actual:e.edgeCasesCovered,required:r.minEdgeCases}})}checkCoverageEvidence(e,t,n,i,r){if(!e.coverageOutput){i.push({type:"missing-coverage-data",message:"No coverage data found",suggestion:"Run tests with coverage to get coverage metrics"});return}if(t.requireEdgeCaseEvidence&&e.statementCoverage<r.coverageThreshold)if(r.strictMode)n.push({type:"insufficient-coverage",message:`Coverage ${e.statementCoverage.toFixed(1)}% below threshold ${r.coverageThreshold}%`,severity:"error",details:{statement:e.statementCoverage,branch:e.branchCoverage,function:e.functionCoverage,line:e.lineCoverage,threshold:r.coverageThreshold}});else i.push({type:"low-coverage",message:`Coverage ${e.statementCoverage.toFixed(1)}% is below optimal threshold ${r.coverageThreshold}%`,suggestion:"Consider adding more tests to improve coverage"})}generateSummary(e,t,n){let i=e.testEvidence.executionLog||"",r=i.match(/(\d+)\s+(?:passes?|passed|success)/i),a=i.match(/(\d+)\s+(?:failures?|failed)/i),s=i.match(/(\d+)\s+(?:skipped|pending)/i),o=(r?parseInt(r[1],10):0)+(a?parseInt(a[1],10):0)+(s?parseInt(s[1],10):0),c=r?parseInt(r[1],10):0,l=a?parseInt(a[1],10):0,u=s?parseInt(s[1],10):0,p=100;if(l>0)p-=l/o*100;if(e.coverageEvidence.statementCoverage>0)p=(p+e.coverageEvidence.statementCoverage)/2;return{totalTests:o,passedTests:c,failedTests:l,skippedTests:u,totalAssertions:e.testEvidence.assertions,passedAssertions:e.testEvidence.assertions,edgeCasesCovered:e.testEvidence.edgeCasesCovered,overallScore:Math.round(p*100)/100}}verifyWithTestPlan(e,t,n,i,r,a,s=ao){let o=this.verify(e,t,n,i,a.evidence,s),c=to(r),l=Ae(r,{minTestCases:a.testPlan.minTestCases,requireCoverageThreshold:a.testPlan.requireCoverageThreshold,coverageThresholdPercent:a.testPlan.coverageThresholdPercent,requiredBeforeImplementation:a.testPlan.requiredBeforeImplementation},Kt);if(!l.valid&&s.strictMode)for(let p of l.violations)o.violations.push({type:"missing-evidence",message:`Test Plan: ${p.details}`,severity:p.severity});o.summary={...o.summary,totalTests:c.totalTestCases+o.summary.totalTests};let u=o.violations.some((p)=>p.severity==="error");return o.compliant=!u&&o.summary.failedTests===0,o}}function zt(e=[]){return{testFilePaths:e,timestamp:new Date().toISOString()}}var xe={};function wl(e,t){if(!xe[e])xe[e]={testFilePaths:[]};let n=xe[e].evidence||zt();xe[e].evidence={...n,...t,testFilePaths:[...n.testFilePaths,...t.testFilePaths||[]]}}function uo(e){return e.sessionID||"default"}function Sl(e){return["todowrite","task","complete","done"].some((n)=>e.toLowerCase().includes(n))}function po(){return{"tool.execute.before":async(e,t)=>{let n=U();if(!n?.enabled)return;let i=e.tool;if(!Sl(i))return;let r=n.evidence;if(!r.requireTestExecutionEvidence&&!r.requireAssertionEvidence&&!r.requireEdgeCaseEvidence)return;let a=uo(e),s=xe[a];if(!s)throw Error(`Blitzkrieg Evidence Verification: No evidence registered for task "${a}". Please register test files and evidence before marking task complete.`);let o=s.evidence||zt()},"tool.execute.after":async(e,t)=>{if(!U()?.enabled)return;if(e.tool==="bash"){let a=t?.command;if(a&&Al(a)){let s=uo(e),o=t.output;if(o)wl(s,{testExecutionEvidence:o})}}}}}function Al(e){return[/npm\s+test/i,/yarn\s+test/i,/pnpm\s+test/i,/pytest/i,/jest/i,/mocha/i,/vitest/i,/karma/i,/cypress/i,/playwright/i,/test\s+--?/].some((n)=>n.test(e))}var mo={requireTestStep:!0,requireVerificationStep:!0,maxImplementationStepComplexity:3,enforceComplexitySeverity:"block",enforceStructureSeverity:"block"};function go(e,t,n,i=1,r=[]){return{id:e,description:t,type:n,complexity:Math.max(1,Math.min(10,i)),dependencies:r}}function fo(e){let t=e.toLowerCase(),n=["verify implementation","validate results","review code","approve","confirm","verify","validate","check","review"],i=["plan architecture","design solution","plan","design","architect","outline"],r=["test","spec","assert","mock","stub"];if(n.some((a)=>t.includes(a)))return"verification";if(i.some((a)=>t.includes(a)))return"planning";if(r.some((a)=>t.includes(a)))return"test";return"implementation"}function ho(e){let t=e.toLowerCase(),n=1,i={simple:1,basic:1,add:2,create:2,implement:2,modify:2,update:2,refactor:3,restructure:3,reorganize:3,integrate:4,complex:4,difficult:5,"multi-file":4,"cross-module":5,very:3,extremely:4};for(let[a,s]of Object.entries(i))if(t.includes(a))n=Math.max(n,s);let r=e.split(/\s+/).length;if(r>10)n+=1;if(r>20)n+=1;if(r>30)n+=1;return Math.min(10,n)}function Gt(e){switch(e){case"block":return"error";case"warn":return"warning";default:return"warning"}}function Xt(e,t=mo){let n=[],i=e.some((o)=>o.type==="test"),r=e.some((o)=>o.type==="verification"),a=e.filter((o)=>o.type==="implementation");if(t.requireTestStep&&a.length>0&&!i)n.push({type:"missing-test-step",taskId:"plan",severity:Gt(t.enforceStructureSeverity),message:"Plan contains implementation steps but no test step"});if(t.requireVerificationStep&&a.length>0&&!r)n.push({type:"missing-verification",taskId:"plan",severity:Gt(t.enforceStructureSeverity),message:"Plan contains implementation steps but no verification step"});let s=!0;for(let o of a)if(o.complexity>t.maxImplementationStepComplexity)n.push({type:"excessive-complexity",taskId:o.id,severity:Gt(t.enforceComplexitySeverity),message:`Step "${o.description}" has complexity ${o.complexity}, exceeding maximum of ${t.maxImplementationStepComplexity}`}),s=!1;return{hasTestStep:i,hasVerificationStep:r,complexityValid:s,violations:n}}function yo(e,t=mo){let n=Xt(e,t),i=[];if(!n.hasTestStep&&t.requireTestStep)i.push("Add test steps to verify the implementation works correctly");if(!n.hasVerificationStep&&t.requireVerificationStep)i.push("Add a verification step to ensure quality before completion");for(let s of n.violations)if(s.type==="excessive-complexity")i.push(`Break down complex step "${s.taskId}" into smaller, more manageable tasks`);let r=xl(e),a=kl(r);return{compliant:n.violations.filter((s)=>s.severity==="error").length===0,steps:e,violations:n.violations,suggestions:i,complexityScore:a}}function xl(e){let t={totalSteps:e.length,implementationSteps:0,testSteps:0,verificationSteps:0,planningSteps:0,averageComplexity:0,maxComplexity:0};if(e.length===0)return t;for(let i of e){switch(i.type){case"implementation":t.implementationSteps++;break;case"test":t.testSteps++;break;case"verification":t.verificationSteps++;break;case"planning":t.planningSteps++;break}t.maxComplexity=Math.max(t.maxComplexity,i.complexity)}let n=e.reduce((i,r)=>i+r.complexity,0);return t.averageComplexity=n/e.length,t}function kl(e){let t=100;if(e.averageComplexity>5)t-=(e.averageComplexity-5)*10;if(e.maxComplexity>7)t-=(e.maxComplexity-7)*5;let n=e.testSteps>0,i=e.verificationSteps>0,r=e.planningSteps>0;if(n)t+=5;if(i)t+=5;if(r)t+=5;return Math.max(0,Math.min(100,t))}var bo={};function Cl(e){delete bo[e]}function vl(e,t){if(e==="todowrite")return!0;if(e==="task")return!0;if(t?.prompt?.includes("plan"))return!0;return!1}function Pl(e){let t=e?.todos;if(!t||!Array.isArray(t))return[];return t.map((n)=>n.content||"")}function wo(){return{"tool.execute.before":async(e,t)=>{let n=U();if(!n?.enabled)return;let{tool:i,sessionID:r}=e;if(!vl(i,t))return;let a=n.plannerConstraints;if(!a.requireTestStep&&!a.requireVerificationStep)return;let o=Pl(t);if(o.length===0)return;let c=o.map((m,g)=>go(`${r}-step-${g}`,m,fo(m),ho(m)));bo[r]={steps:c};let l=Xt(c,{requireTestStep:a.requireTestStep,requireVerificationStep:a.requireVerificationStep,maxImplementationStepComplexity:a.maxImplementationStepComplexity,enforceComplexitySeverity:"block",enforceStructureSeverity:"block"}),u=l.violations.filter((m)=>m.severity==="error");if(u.length>0){let m=yo(c,{requireTestStep:a.requireTestStep,requireVerificationStep:a.requireVerificationStep,maxImplementationStepComplexity:a.maxImplementationStepComplexity,enforceComplexitySeverity:"block",enforceStructureSeverity:"block"}),g=u.map((b)=>`- [${b.severity}] ${b.type}: ${b.message}`).join(`
|
|
1836
|
+
`)}`)}if(m.decision==="warn"&&m.violations.length>0);},"tool.execute.after":async(e)=>{let t=e.sessionID}}}var co={strictMode:!1,ignoreWarnings:!1,coverageThreshold:80,minAssertions:1,minEdgeCases:1};class lo{parse(e,t){let n=this.parseErrors(e),i=this.countWarnings(e);return{success:t===0,exitCode:t,output:e,errors:n,warnings:i}}parseErrors(e){let t=[],n=/(.+?):(\d+):(\d+)\s*[-–]\s*(error|warning)\s*(TS\d+|ESLint)\s*:\s*(.+)/g,i;while((i=n.exec(e))!==null)t.push({file:i[1],line:parseInt(i[2],10),column:parseInt(i[3],10),message:i[6],code:i[5],severity:i[4]==="error"?"error":"warning"});let r=/File "(.+?)", line (\d+), in .+?(.+)/g;while((i=r.exec(e))!==null)if(!t.some((s)=>s.file===i[1]&&s.line===parseInt(i[2],10)))t.push({file:i[1],line:parseInt(i[2],10),message:i[3].trim(),code:"PythonError",severity:"error"});let a=/(error|Error|ERROR)[:\s]+(.+)/g;while((i=a.exec(e))!==null){let s=i[2].substring(0,50);if(!t.some((o)=>o.message.includes(s)))t.push({message:i[2].trim(),code:"GenericError",severity:"error"})}return t}countWarnings(e){let t=[/(warning|Warning|WARNING)[:\s]+/g,/warn[:\s]+/gi],n=0;for(let i of t){let r=e.match(i);if(r)n+=r.length}return n}}class uo{parse(e){let t=this.countAssertions(e),n=this.identifyEdgeCases(e);return{testPath:this.extractTestPath(e),assertions:t,edgeCasesCovered:n.length,executionLog:e}}countAssertions(e){let t=[/\b(assert|expect|should|it\.only|test\.only)\s*\(/gi,/passes|failures/gi],n=0;for(let r of t){let a=e.match(r);if(a)n+=a.length}let i=e.match(/(\d+)\s+(?:passes|fail|tests?)/i);if(i){let r=parseInt(i[1],10);if(r>n)n=r}return n}identifyEdgeCases(e){let t=[/null/i,/undefined/i,/empty/gi,/zero/gi,/negative/i,/overflow/i,/underflow/i,/async|await/gi,/error|exception/gi,/timeout/i,/boundary/i,/edge/gi],n=[];for(let i of t)if(i.test(e)){let r=i.source.replace(/^\^?|\\b|\\/gi,"").substring(0,30);if(!n.includes(r))n.push(r)}return n}extractTestPath(e){let t=[/Running\s+(.+?test.+\.(?:ts|js|py))/i,/Test\s+Files.*[\n\r]+.*(.+\.(?:test|spec)\.[jt]sx?)/i];for(let n of t){let i=e.match(n);if(i)return i[1]}return""}}class po{parse(e,t){let n=this.parseCoveragePercentages(e);return{statementCoverage:n.statement,branchCoverage:n.branch,functionCoverage:n.function,lineCoverage:n.line,coverageOutput:e,meetsThreshold:this.checkThreshold(n,t)}}parseCoveragePercentages(e){let t={statement:0,branch:0,function:0,line:0},n=[[/Statements?\s*[:\s]+(\d+(?:\.\d+)?)%/i,"statement"],[/Branches?\s*[:\s]+(\d+(?:\.\d+)?)%/i,"branch"],[/Functions?\s*[:\s]+(\d+(?:\.\d+)?)%/i,"function"],[/Lines?\s*[:\s]+(\d+(?:\.\d+)?)%/i,"line"],[/coverage:\s+(\d+(?:\.\d+)?)%/i,"statement"]];for(let[i,r]of n){let a=e.match(i);if(a)t[r]=parseFloat(a[1])}return t}checkThreshold(e,t){let i=[e.statement,e.branch,e.function,e.line].filter((a)=>a>0);if(i.length===0)return!1;return i.reduce((a,s)=>a+s,0)/i.length>=t}}class Al{buildParser=new lo;testParser=new uo;coverageParser=new po;verify(e,t,n,i,r,a=co){let s=this.collectEvidence(e,t,n,i,a.coverageThreshold),o=[],c=[];this.checkBuildEvidence(s.buildEvidence,o,c),this.checkTestEvidence(s.testEvidence,r,o,c,a),this.checkCoverageEvidence(s.coverageEvidence,r,o,c,a);let l=this.generateSummary(s,o,c);return{compliant:!o.some((m)=>m.severity==="error")&&!l.failedTests,evidence:s,violations:o,warnings:c,summary:l}}collectEvidence(e,t,n,i,r){let a=this.buildParser.parse(e,t),s=this.testParser.parse(n),o=this.coverageParser.parse(i,r);return{buildEvidence:a,testEvidence:s,coverageEvidence:o,timestamp:new Date().toISOString()}}checkBuildEvidence(e,t,n){if(!e.success)t.push({type:"build-failed",message:`Build failed with exit code ${e.exitCode}`,severity:"error",details:{exitCode:e.exitCode,errorCount:e.errors.length}});else if(e.warnings>0)n.push({type:"build-warnings",message:`Build completed with ${e.warnings} warning(s)`,suggestion:"Review warnings and fix if necessary"})}checkTestEvidence(e,t,n,i,r){if(t.requireTestExecutionEvidence&&e.executionLog===void 0)n.push({type:"no-test-execution",message:"No test execution evidence found",severity:"error"});if(t.requireAssertionEvidence&&e.assertions<r.minAssertions)n.push({type:"no-assertions",message:`Insufficient assertions: found ${e.assertions}, minimum required is ${r.minAssertions}`,severity:"error",details:{actual:e.assertions,required:r.minAssertions}});if(t.requireEdgeCaseEvidence&&e.edgeCasesCovered<r.minEdgeCases)n.push({type:"no-edge-cases",message:`No edge cases covered: minimum required is ${r.minEdgeCases}`,severity:"error",details:{actual:e.edgeCasesCovered,required:r.minEdgeCases}})}checkCoverageEvidence(e,t,n,i,r){if(!e.coverageOutput){i.push({type:"missing-coverage-data",message:"No coverage data found",suggestion:"Run tests with coverage to get coverage metrics"});return}if(t.requireEdgeCaseEvidence&&e.statementCoverage<r.coverageThreshold)if(r.strictMode)n.push({type:"insufficient-coverage",message:`Coverage ${e.statementCoverage.toFixed(1)}% below threshold ${r.coverageThreshold}%`,severity:"error",details:{statement:e.statementCoverage,branch:e.branchCoverage,function:e.functionCoverage,line:e.lineCoverage,threshold:r.coverageThreshold}});else i.push({type:"low-coverage",message:`Coverage ${e.statementCoverage.toFixed(1)}% is below optimal threshold ${r.coverageThreshold}%`,suggestion:"Consider adding more tests to improve coverage"})}generateSummary(e,t,n){let i=e.testEvidence.executionLog||"",r=i.match(/(\d+)\s+(?:passes?|passed|success)/i),a=i.match(/(\d+)\s+(?:failures?|failed)/i),s=i.match(/(\d+)\s+(?:skipped|pending)/i),o=(r?parseInt(r[1],10):0)+(a?parseInt(a[1],10):0)+(s?parseInt(s[1],10):0),c=r?parseInt(r[1],10):0,l=a?parseInt(a[1],10):0,u=s?parseInt(s[1],10):0,p=100;if(l>0)p-=l/o*100;if(e.coverageEvidence.statementCoverage>0)p=(p+e.coverageEvidence.statementCoverage)/2;return{totalTests:o,passedTests:c,failedTests:l,skippedTests:u,totalAssertions:e.testEvidence.assertions,passedAssertions:e.testEvidence.assertions,edgeCasesCovered:e.testEvidence.edgeCasesCovered,overallScore:Math.round(p*100)/100}}verifyWithTestPlan(e,t,n,i,r,a,s=co){let o=this.verify(e,t,n,i,a.evidence,s),c=io(r),l=ke(r,{minTestCases:a.testPlan.minTestCases,requireCoverageThreshold:a.testPlan.requireCoverageThreshold,coverageThresholdPercent:a.testPlan.coverageThresholdPercent,requiredBeforeImplementation:a.testPlan.requiredBeforeImplementation},Yt);if(!l.valid&&s.strictMode)for(let p of l.violations)o.violations.push({type:"missing-evidence",message:`Test Plan: ${p.details}`,severity:p.severity});o.summary={...o.summary,totalTests:c.totalTestCases+o.summary.totalTests};let u=o.violations.some((p)=>p.severity==="error");return o.compliant=!u&&o.summary.failedTests===0,o}}function Qt(e=[]){return{testFilePaths:e,timestamp:new Date().toISOString()}}var Ce={};function xl(e,t){if(!Ce[e])Ce[e]={testFilePaths:[]};let n=Ce[e].evidence||Qt();Ce[e].evidence={...n,...t,testFilePaths:[...n.testFilePaths,...t.testFilePaths||[]]}}function mo(e){return e.sessionID||"default"}function kl(e){return["todowrite","task","complete","done"].some((n)=>e.toLowerCase().includes(n))}function go(){return{"tool.execute.before":async(e,t)=>{let n=H();if(!n?.enabled)return;let i=e.tool;if(!kl(i))return;let r=n.evidence;if(!r.requireTestExecutionEvidence&&!r.requireAssertionEvidence&&!r.requireEdgeCaseEvidence)return;let a=mo(e),s=Ce[a];if(!s)throw Error(`Blitzkrieg Evidence Verification: No evidence registered for task "${a}". Please register test files and evidence before marking task complete.`);let o=s.evidence||Qt()},"tool.execute.after":async(e,t)=>{if(!H()?.enabled)return;if(e.tool==="bash"){let a=t?.command;if(a&&Cl(a)){let s=mo(e),o=t.output;if(o)xl(s,{testExecutionEvidence:o})}}}}}function Cl(e){return[/npm\s+test/i,/yarn\s+test/i,/pnpm\s+test/i,/pytest/i,/jest/i,/mocha/i,/vitest/i,/karma/i,/cypress/i,/playwright/i,/test\s+--?/].some((n)=>n.test(e))}var fo={requireTestStep:!0,requireVerificationStep:!0,maxImplementationStepComplexity:3,enforceComplexitySeverity:"block",enforceStructureSeverity:"block"};function ho(e,t,n,i=1,r=[]){return{id:e,description:t,type:n,complexity:Math.max(1,Math.min(10,i)),dependencies:r}}function yo(e){let t=e.toLowerCase(),n=["verify implementation","validate results","review code","approve","confirm","verify","validate","check","review"],i=["plan architecture","design solution","plan","design","architect","outline"],r=["test","spec","assert","mock","stub"];if(n.some((a)=>t.includes(a)))return"verification";if(i.some((a)=>t.includes(a)))return"planning";if(r.some((a)=>t.includes(a)))return"test";return"implementation"}function bo(e){let t=e.toLowerCase(),n=1,i={simple:1,basic:1,add:2,create:2,implement:2,modify:2,update:2,refactor:3,restructure:3,reorganize:3,integrate:4,complex:4,difficult:5,"multi-file":4,"cross-module":5,very:3,extremely:4};for(let[a,s]of Object.entries(i))if(t.includes(a))n=Math.max(n,s);let r=e.split(/\s+/).length;if(r>10)n+=1;if(r>20)n+=1;if(r>30)n+=1;return Math.min(10,n)}function Zt(e){switch(e){case"block":return"error";case"warn":return"warning";default:return"warning"}}function en(e,t=fo){let n=[],i=e.some((o)=>o.type==="test"),r=e.some((o)=>o.type==="verification"),a=e.filter((o)=>o.type==="implementation");if(t.requireTestStep&&a.length>0&&!i)n.push({type:"missing-test-step",taskId:"plan",severity:Zt(t.enforceStructureSeverity),message:"Plan contains implementation steps but no test step"});if(t.requireVerificationStep&&a.length>0&&!r)n.push({type:"missing-verification",taskId:"plan",severity:Zt(t.enforceStructureSeverity),message:"Plan contains implementation steps but no verification step"});let s=!0;for(let o of a)if(o.complexity>t.maxImplementationStepComplexity)n.push({type:"excessive-complexity",taskId:o.id,severity:Zt(t.enforceComplexitySeverity),message:`Step "${o.description}" has complexity ${o.complexity}, exceeding maximum of ${t.maxImplementationStepComplexity}`}),s=!1;return{hasTestStep:i,hasVerificationStep:r,complexityValid:s,violations:n}}function wo(e,t=fo){let n=en(e,t),i=[];if(!n.hasTestStep&&t.requireTestStep)i.push("Add test steps to verify the implementation works correctly");if(!n.hasVerificationStep&&t.requireVerificationStep)i.push("Add a verification step to ensure quality before completion");for(let s of n.violations)if(s.type==="excessive-complexity")i.push(`Break down complex step "${s.taskId}" into smaller, more manageable tasks`);let r=vl(e),a=Pl(r);return{compliant:n.violations.filter((s)=>s.severity==="error").length===0,steps:e,violations:n.violations,suggestions:i,complexityScore:a}}function vl(e){let t={totalSteps:e.length,implementationSteps:0,testSteps:0,verificationSteps:0,planningSteps:0,averageComplexity:0,maxComplexity:0};if(e.length===0)return t;for(let i of e){switch(i.type){case"implementation":t.implementationSteps++;break;case"test":t.testSteps++;break;case"verification":t.verificationSteps++;break;case"planning":t.planningSteps++;break}t.maxComplexity=Math.max(t.maxComplexity,i.complexity)}let n=e.reduce((i,r)=>i+r.complexity,0);return t.averageComplexity=n/e.length,t}function Pl(e){let t=100;if(e.averageComplexity>5)t-=(e.averageComplexity-5)*10;if(e.maxComplexity>7)t-=(e.maxComplexity-7)*5;let n=e.testSteps>0,i=e.verificationSteps>0,r=e.planningSteps>0;if(n)t+=5;if(i)t+=5;if(r)t+=5;return Math.max(0,Math.min(100,t))}var So={};function El(e){delete So[e]}function Tl(e,t){if(e==="todowrite")return!0;if(e==="task")return!0;if(t?.prompt?.includes("plan"))return!0;return!1}function Ml(e){let t=e?.todos;if(!t||!Array.isArray(t))return[];return t.map((n)=>n.content||"")}function Ao(){return{"tool.execute.before":async(e,t)=>{let n=H();if(!n?.enabled)return;let{tool:i,sessionID:r}=e;if(!Tl(i,t))return;let a=n.plannerConstraints;if(!a.requireTestStep&&!a.requireVerificationStep)return;let o=Ml(t);if(o.length===0)return;let c=o.map((m,g)=>ho(`${r}-step-${g}`,m,yo(m),bo(m)));So[r]={steps:c};let l=en(c,{requireTestStep:a.requireTestStep,requireVerificationStep:a.requireVerificationStep,maxImplementationStepComplexity:a.maxImplementationStepComplexity,enforceComplexitySeverity:"block",enforceStructureSeverity:"block"}),u=l.violations.filter((m)=>m.severity==="error");if(u.length>0){let m=wo(c,{requireTestStep:a.requireTestStep,requireVerificationStep:a.requireVerificationStep,maxImplementationStepComplexity:a.maxImplementationStepComplexity,enforceComplexitySeverity:"block",enforceStructureSeverity:"block"}),g=u.map((b)=>`- [${b.severity}] ${b.type}: ${b.message}`).join(`
|
|
1837
1837
|
`),f=m.suggestions.map((b)=>`- ${b}`).join(`
|
|
1838
1838
|
`);throw Error(`Blitzkrieg Planner Constraint Violation:
|
|
1839
1839
|
|
|
@@ -1841,8 +1841,8 @@ ${g}
|
|
|
1841
1841
|
|
|
1842
1842
|
Suggestions:
|
|
1843
1843
|
${f}`)}let p=l.violations.filter((m)=>m.severity==="warning");if(p.length>0)return{messages:[{role:"system",content:p.map((g)=>`- [${g.severity}] ${g.type}: ${g.message}`).join(`
|
|
1844
|
-
`)}]}},"tool.execute.after":async(e,t)=>{if(e.tool==="todowrite"){let r=t?.todos;if(r?.every((s)=>s.status==="completed"||s.status==="cancelled")&&r&&r.length>0){let s=e.sessionID;Cl(s)}}}}}import{tool as Ao}from"@opencode-ai/plugin";import{z as ke}from"zod";class So{initialized=new Map;connections=new Map;async initMCP(e,t){if(this.initialized.has(e)){let i=this.connections.get(e);if(i)return i}let n={config:t,tools:this.getAvailableToolsForMCP(e),initialized:!0};return this.initialized.set(e,!0),this.connections.set(e,n),n}async callTool(e,t,n){if(n.enabled===!1)throw Error(`MCP ${n.name||this.deriveNameFromUrl(n.url)} is disabled`);if(!n.url)throw Error("MCP config requires a URL");let i=n.name||this.deriveNameFromUrl(n.url);return await this.initMCP(i,n),{result:`Tool '${e}' called with args: ${JSON.stringify(t)}`,server:n.url}}deriveNameFromUrl(e){try{let n=new URL(e).hostname;if(n.includes("context7.com"))return"context7";if(n.includes("exa.ai"))return"websearch";if(n.includes("tavily.com"))return"websearch";if(n.includes("grep.app"))return"grep_app";if(n.includes("deepwiki.com"))return"deepwiki";if(n.includes("semgrep.ai"))return"semgrep";return n.replace(".com","").replace("mcp.","")}catch{return"unknown"}}getAvailableToolsForMCP(e){switch(e){case"websearch":return["search","fetch"];case"context7":return["search","get"];case"grep_app":return["search","get_file"];case"deepwiki":return["search"];case"semgrep":return["search"];case"sequential_thinking":return["think"];case"bridgemind":return["create","explore"];default:return[]}}async shutdownAll(){let e=[];for(let[t,n]of this.connections.entries())if(n.initialized)e.push(new Promise((i)=>{i()}));await Promise.all(e),this.initialized.clear(),this.connections.clear()}}var T=new So;function _(e){if((e?.provider||"exa")==="tavily"){let n=process.env.TAVILY_API_KEY;if(!n)return{type:"remote",url:"https://mcp.tavily.com/mcp/",enabled:!1,name:"websearch",oauth:!1};return{type:"remote",url:"https://mcp.tavily.com/mcp/",enabled:!0,headers:{Authorization:`Bearer ${n}`},oauth:!1}}return{type:"remote",url:"https://mcp.exa.ai/mcp?tools=web_search_exa",enabled:!0,headers:process.env.EXA_API_KEY?{"x-api-key":process.env.EXA_API_KEY}:void 0,oauth:!1}}var Qt=null;function Be(e){Qt=e}var xo=Ao({description:"Search the web using Exa AI (default) or Tavily. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{query:ke.string().min(1).describe("Search query for web search"),numResults:ke.number().optional().default(10).describe("Number of results to return (default: 10)")},async execute(e){try{let t=Qt||_();if(t.enabled===!1)return JSON.stringify({error:"Websearch disabled",details:"API key not configured"},null,2);let n=await T.callTool("search",e,t);return JSON.stringify(n,null,2)}catch(t){return JSON.stringify({error:"Websearch failed",details:t.message},null,2)}}}),ko=Ao({description:"Fetch and parse web content from a specific URL. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{url:ke.string().url().describe("URL to fetch content from"),format:ke.enum(["markdown","text","html"]).optional().default("markdown").describe("Output format (default: markdown)"),timeout:ke.number().optional().describe("Request timeout in milliseconds (default: 60000)")},async execute(e){try{let t=Qt||_();if(t.enabled===!1)return JSON.stringify({error:"Websearch disabled",details:"API key not configured"},null,2);let n=await T.callTool("fetch",e,t);return JSON.stringify(n,null,2)}catch(t){return JSON.stringify({error:"Webfetch failed",details:t.message},null,2)}}});import{tool as Co}from"@opencode-ai/plugin";import{z as de}from"zod";function El(){return{type:"remote",url:"https://mcp.context7.com/mcp",enabled:!0,headers:process.env.CONTEXT7_API_KEY?{Authorization:`Bearer ${process.env.CONTEXT7_API_KEY}`}:void 0,oauth:!1}}var Ce=El(),vo=Co({description:"Search official documentation using Context7. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{query:de.string().min(1).describe("Search query for documentation"),numResults:de.number().optional().default(5).describe("Number of results to return (default: 5)"),maxTokens:de.number().optional().describe("Maximum tokens for response (default: 5000)")},async execute(e){try{let t=await T.callTool("search",e,Ce);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({success:!1,error:t.message},null,2)}}}),Po=Co({description:"Fetch specific documentation page using Context7. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{library:de.string().describe("Library name (e.g., react, express)"),path:de.string().optional().describe("Documentation path (e.g., hooks/useState)"),version:de.string().optional().describe("Library version (default: latest)")},async execute(e){try{let t=await T.callTool("get",e,Ce);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({success:!1,error:t.message},null,2)}}});import{tool as Eo}from"@opencode-ai/plugin";import{z as K}from"zod";var ve={type:"remote",url:"https://mcp.grep.app",enabled:!0,headers:void 0,oauth:!1},To=Eo({description:"Search code across public GitHub repositories using grep.app. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{query:K.string().min(1).describe("Search query for code"),language:K.string().optional().describe("Filter by programming language (e.g., python, typescript, rust)"),maxResults:K.number().optional().default(10).describe("Maximum number of results to return (default: 10)"),page:K.number().optional().default(1).describe("Page number for pagination (default: 1)")},async execute(e){try{let t=await T.callTool("search",e,ve);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"failed to search grep.app",details:String(t)},null,2)}}}),Mo=Eo({description:"Fetch file content from a GitHub repository using grep.app. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{owner:K.string().describe("Repository owner (e.g., facebook)"),repo:K.string().describe("Repository name (e.g., react)"),path:K.string().describe("File path (e.g., src/index.ts)"),ref:K.string().optional().describe("Git branch or commit ref (default: main)")},async execute(e){try{let t=await T.callTool("get_file",e,ve);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"failed to get file from grep.app",details:String(t)},null,2)}}});var Zt={type:"remote",url:"https://mcp.deepwiki.com/mcp",enabled:!0,headers:process.env.DEEPWIKI_API_KEY?{"x-api-key":process.env.DEEPWIKI_API_KEY}:void 0,oauth:!1},en={type:"remote",url:"https://mcp.semgrep.ai/sse",enabled:!0,headers:process.env.SEMGREP_API_KEY?{"x-api-key":process.env.SEMGREP_API_KEY}:void 0,oauth:!1},tn={type:"remote",url:"https://remote-mcp-servers.org/sequential-thinking/mcp",enabled:!1,headers:void 0,oauth:!1},nn={type:"remote",url:"https://remote-mcp-servers.org/bridgemind/mcp",enabled:!1,headers:void 0,oauth:!1},Je={deepwiki:Zt,semgrep:en,sequential_thinking:tn,bridgemind:nn},Ye=["deepwiki","semgrep","sequential_thinking","bridgemind"];import{tool as Ve}from"@opencode-ai/plugin";import{z as B}from"zod";var Tl=Ve({description:"Search Wikipedia-like knowledge base using DeepWiki. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{query:B.string().min(1).describe("Search query for knowledge base")},async execute(e){try{let t=await T.callTool("search",e,Zt);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"DeepWiki search failed",details:t.message},null,2)}}}),Ml=Ve({description:"Semantic code search using AI-powered grep via Semgrep. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{query:B.string().min(1).describe("Search query for semantic code search"),language:B.string().optional().describe("Filter by programming language")},async execute(e){try{let t=await T.callTool("search",e,en);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"Semgrep search failed",details:t.message},null,2)}}}),Rl=Ve({description:"Chain-of-thought reasoning tool that helps break down complex problems step by step. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{problem:B.string().min(1).describe("Problem or question to reason about step by step"),steps:B.number().optional().default(5).describe("Number of reasoning steps to take (default: 5)")},async execute(e){try{let t=await T.callTool("think",e,tn);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"Sequential thinking failed",details:t.message},null,2)}}}),Dl=Ve({description:"Mind mapping and brainstorming tool to visualize connections between ideas. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{action:B.enum(["create","explore"]).describe("Action to perform: create new mind map or explore existing"),topic:B.string().optional().describe("Topic or idea for mind map creation"),mapId:B.string().optional().describe("ID of existing mind map to explore")},async execute(e){try{let t=await T.callTool(e.action,e,nn);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"Bridgemind failed",details:t.message},null,2)}}}),rn={mcpDeepwikiSearch:Tl,mcpSemgrepSearch:Ml,mcpSequentialThinking:Rl,mcpBridgemind:Dl};var on={websearchTool:xo,webfetchTool:ko,context7SearchTool:vo,context7GetTool:Po,grepSearchTool:To,grepGetFileTool:Mo};var P=null,Nl={get type(){if(!P)P=_();return P.type},get name(){if(!P)P=_();return P.name},get url(){if(!P)P=_();return P.url},get enabled(){if(!P)P=_();return P.enabled},get headers(){if(!P)P=_();return P.headers},get oauth(){if(!P)P=_();return P.oauth}},Ol=Nl,ff=["websearch","context7","grep_app",...Ye],hf={websearch:Ol,context7:Ce,grep_app:ve,...Je};function Ro(e=[],t){let n={};if(!e.includes("websearch")){let i=_(t?.websearch);n.websearch=i,Be(i)}else Be(null);if(!e.includes("context7"))n.context7=Ce;if(!e.includes("grep_app"))n.grep_app=ve;for(let i of Ye)if(!e.includes(i))n[i]=Je[i];return n}function Do(){return{...on,...rn}}import*as Pe from"fs";import*as J from"path";import*as No from"os";var Oo=/^---\s*\n([\s\S]*?)\n---\s*\n/;function Ll(e){let t=e.match(Oo);if(!t)return{};let n=t[1],i={},r=n.split(`
|
|
1845
|
-
`);for(let a of r){let s=a.indexOf(":");if(s===-1)continue;let o=a.slice(0,s).trim(),c=a.slice(s+1).trim();if(o==="true")i[o]=!0;else if(o==="false")i[o]=!1;else if(!isNaN(Number(c)))i[o]=Number(c);else i[o]=c}return i}async function
|
|
1846
|
-
`);return new Promise((
|
|
1847
|
-
`);for(let
|
|
1848
|
-
`)[0]?.trim()??null}catch{return null}return null}readStream(e){if(!e)return Promise.resolve("");return new Promise((t)=>{let n="";e.on("data",(i)=>{n+=i.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,i){return(await this.getOrCreateClient(e,t)).callTool(n,i)}async readResource(e,t,n){return(await this.getOrCreateClient(e,t)).readResource(n)}async getPrompt(e,t,n,i){return(await this.getOrCreateClient(e,t)).getPrompt(n,i)}async disconnectSession(e){let t=[];for(let[n,i]of this.clients.entries())if(n.includes(`:${e}`))await i.client.close(),t.push(n);for(let n of t)this.clients.delete(n);if(
|
|
1844
|
+
`)}]}},"tool.execute.after":async(e,t)=>{if(e.tool==="todowrite"){let r=t?.todos;if(r?.every((s)=>s.status==="completed"||s.status==="cancelled")&&r&&r.length>0){let s=e.sessionID;El(s)}}}}}import{tool as ko}from"@opencode-ai/plugin";import{z as ve}from"zod";class xo{initialized=new Map;connections=new Map;async initMCP(e,t){if(this.initialized.has(e)){let i=this.connections.get(e);if(i)return i}let n={config:t,tools:this.getAvailableToolsForMCP(e),initialized:!0};return this.initialized.set(e,!0),this.connections.set(e,n),n}async callTool(e,t,n){if(n.enabled===!1)throw Error(`MCP ${n.name||this.deriveNameFromUrl(n.url)} is disabled`);if(!n.url)throw Error("MCP config requires a URL");let i=n.name||this.deriveNameFromUrl(n.url);return await this.initMCP(i,n),{result:`Tool '${e}' called with args: ${JSON.stringify(t)}`,server:n.url}}deriveNameFromUrl(e){try{let n=new URL(e).hostname;if(n.includes("context7.com"))return"context7";if(n.includes("exa.ai"))return"websearch";if(n.includes("tavily.com"))return"websearch";if(n.includes("grep.app"))return"grep_app";if(n.includes("deepwiki.com"))return"deepwiki";if(n.includes("semgrep.ai"))return"semgrep";return n.replace(".com","").replace("mcp.","")}catch{return"unknown"}}getAvailableToolsForMCP(e){switch(e){case"websearch":return["search","fetch"];case"context7":return["search","get"];case"grep_app":return["search","get_file"];case"deepwiki":return["search"];case"semgrep":return["search"];case"sequential_thinking":return["think"];case"bridgemind":return["create","explore"];default:return[]}}async shutdownAll(){let e=[];for(let[t,n]of this.connections.entries())if(n.initialized)e.push(new Promise((i)=>{i()}));await Promise.all(e),this.initialized.clear(),this.connections.clear()}}var M=new xo;function W(e){if((e?.provider||"exa")==="tavily"){let n=process.env.TAVILY_API_KEY;if(!n)return{type:"remote",url:"https://mcp.tavily.com/mcp/",enabled:!1,name:"websearch",oauth:!1};return{type:"remote",url:"https://mcp.tavily.com/mcp/",enabled:!0,headers:{Authorization:`Bearer ${n}`},oauth:!1}}return{type:"remote",url:"https://mcp.exa.ai/mcp?tools=web_search_exa",enabled:!0,headers:process.env.EXA_API_KEY?{"x-api-key":process.env.EXA_API_KEY}:void 0,oauth:!1}}var tn=null;function Ye(e){tn=e}var Co=ko({description:"Search the web using Exa AI (default) or Tavily. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{query:ve.string().min(1).describe("Search query for web search"),numResults:ve.number().optional().default(10).describe("Number of results to return (default: 10)")},async execute(e){try{let t=tn||W();if(t.enabled===!1)return JSON.stringify({error:"Websearch disabled",details:"API key not configured"},null,2);let n=await M.callTool("search",e,t);return JSON.stringify(n,null,2)}catch(t){return JSON.stringify({error:"Websearch failed",details:t.message},null,2)}}}),vo=ko({description:"Fetch and parse web content from a specific URL. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{url:ve.string().url().describe("URL to fetch content from"),format:ve.enum(["markdown","text","html"]).optional().default("markdown").describe("Output format (default: markdown)"),timeout:ve.number().optional().describe("Request timeout in milliseconds (default: 60000)")},async execute(e){try{let t=tn||W();if(t.enabled===!1)return JSON.stringify({error:"Websearch disabled",details:"API key not configured"},null,2);let n=await M.callTool("fetch",e,t);return JSON.stringify(n,null,2)}catch(t){return JSON.stringify({error:"Webfetch failed",details:t.message},null,2)}}});import{tool as Po}from"@opencode-ai/plugin";import{z as pe}from"zod";function Rl(){return{type:"remote",url:"https://mcp.context7.com/mcp",enabled:!0,headers:process.env.CONTEXT7_API_KEY?{Authorization:`Bearer ${process.env.CONTEXT7_API_KEY}`}:void 0,oauth:!1}}var Pe=Rl(),Eo=Po({description:"Search official documentation using Context7. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{query:pe.string().min(1).describe("Search query for documentation"),numResults:pe.number().optional().default(5).describe("Number of results to return (default: 5)"),maxTokens:pe.number().optional().describe("Maximum tokens for response (default: 5000)")},async execute(e){try{let t=await M.callTool("search",e,Pe);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({success:!1,error:t.message},null,2)}}}),To=Po({description:"Fetch specific documentation page using Context7. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{library:pe.string().describe("Library name (e.g., react, express)"),path:pe.string().optional().describe("Documentation path (e.g., hooks/useState)"),version:pe.string().optional().describe("Library version (default: latest)")},async execute(e){try{let t=await M.callTool("get",e,Pe);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({success:!1,error:t.message},null,2)}}});import{tool as Mo}from"@opencode-ai/plugin";import{z as J}from"zod";var Ee={type:"remote",url:"https://mcp.grep.app",enabled:!0,headers:void 0,oauth:!1},Ro=Mo({description:"Search code across public GitHub repositories using grep.app. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{query:J.string().min(1).describe("Search query for code"),language:J.string().optional().describe("Filter by programming language (e.g., python, typescript, rust)"),maxResults:J.number().optional().default(10).describe("Maximum number of results to return (default: 10)"),page:J.number().optional().default(1).describe("Page number for pagination (default: 1)")},async execute(e){try{let t=await M.callTool("search",e,Ee);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"failed to search grep.app",details:String(t)},null,2)}}}),Do=Mo({description:"Fetch file content from a GitHub repository using grep.app. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{owner:J.string().describe("Repository owner (e.g., facebook)"),repo:J.string().describe("Repository name (e.g., react)"),path:J.string().describe("File path (e.g., src/index.ts)"),ref:J.string().optional().describe("Git branch or commit ref (default: main)")},async execute(e){try{let t=await M.callTool("get_file",e,Ee);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"failed to get file from grep.app",details:String(t)},null,2)}}});var nn={type:"remote",url:"https://mcp.deepwiki.com/mcp",enabled:!0,headers:process.env.DEEPWIKI_API_KEY?{"x-api-key":process.env.DEEPWIKI_API_KEY}:void 0,oauth:!1},rn={type:"remote",url:"https://mcp.semgrep.ai/sse",enabled:!0,headers:process.env.SEMGREP_API_KEY?{"x-api-key":process.env.SEMGREP_API_KEY}:void 0,oauth:!1},on={type:"remote",url:"https://remote-mcp-servers.org/sequential-thinking/mcp",enabled:!1,headers:void 0,oauth:!1},an={type:"remote",url:"https://remote-mcp-servers.org/bridgemind/mcp",enabled:!1,headers:void 0,oauth:!1},Ve={deepwiki:nn,semgrep:rn,sequential_thinking:on,bridgemind:an},ze=["deepwiki","semgrep","sequential_thinking","bridgemind"];import{tool as Ge}from"@opencode-ai/plugin";import{z as Y}from"zod";var Dl=Ge({description:"Search Wikipedia-like knowledge base using DeepWiki. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{query:Y.string().min(1).describe("Search query for knowledge base")},async execute(e){try{let t=await M.callTool("search",e,nn);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"DeepWiki search failed",details:t.message},null,2)}}}),Nl=Ge({description:"Semantic code search using AI-powered grep via Semgrep. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{query:Y.string().min(1).describe("Search query for semantic code search"),language:Y.string().optional().describe("Filter by programming language")},async execute(e){try{let t=await M.callTool("search",e,rn);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"Semgrep search failed",details:t.message},null,2)}}}),Ol=Ge({description:"Chain-of-thought reasoning tool that helps break down complex problems step by step. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{problem:Y.string().min(1).describe("Problem or question to reason about step by step"),steps:Y.number().optional().default(5).describe("Number of reasoning steps to take (default: 5)")},async execute(e){try{let t=await M.callTool("think",e,on);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"Sequential thinking failed",details:t.message},null,2)}}}),Ll=Ge({description:"Mind mapping and brainstorming tool to visualize connections between ideas. Does NOT auto-inject results into conversation context - you must explicitly read and use results.",args:{action:Y.enum(["create","explore"]).describe("Action to perform: create new mind map or explore existing"),topic:Y.string().optional().describe("Topic or idea for mind map creation"),mapId:Y.string().optional().describe("ID of existing mind map to explore")},async execute(e){try{let t=await M.callTool(e.action,e,an);return JSON.stringify(t,null,2)}catch(t){return JSON.stringify({error:"Bridgemind failed",details:t.message},null,2)}}}),sn={mcpDeepwikiSearch:Dl,mcpSemgrepSearch:Nl,mcpSequentialThinking:Ol,mcpBridgemind:Ll};var cn={websearchTool:Co,webfetchTool:vo,context7SearchTool:Eo,context7GetTool:To,grepSearchTool:Ro,grepGetFileTool:Do};var E=null,Fl={get type(){if(!E)E=W();return E.type},get name(){if(!E)E=W();return E.name},get url(){if(!E)E=W();return E.url},get enabled(){if(!E)E=W();return E.enabled},get headers(){if(!E)E=W();return E.headers},get oauth(){if(!E)E=W();return E.oauth}},Il=Fl,Pf=["websearch","context7","grep_app",...ze],Ef={websearch:Il,context7:Pe,grep_app:Ee,...Ve};function No(e=[],t){let n={};if(!e.includes("websearch")){let i=W(t?.websearch);n.websearch=i,Ye(i)}else Ye(null);if(!e.includes("context7"))n.context7=Pe;if(!e.includes("grep_app"))n.grep_app=Ee;for(let i of ze)if(!e.includes(i))n[i]=Ve[i];return n}function Oo(){return{...cn,...sn}}import*as Te from"fs";import*as V from"path";import*as Lo from"os";var Fo=/^---\s*\n([\s\S]*?)\n---\s*\n/;function $l(e){let t=e.match(Fo);if(!t)return{};let n=t[1],i={},r=n.split(`
|
|
1845
|
+
`);for(let a of r){let s=a.indexOf(":");if(s===-1)continue;let o=a.slice(0,s).trim(),c=a.slice(s+1).trim();if(o==="true")i[o]=!0;else if(o==="false")i[o]=!1;else if(!isNaN(Number(c)))i[o]=Number(c);else i[o]=c}return i}async function me(e,t,n=new Set,i=""){let r=[];if(!Te.existsSync(e))return r;let a=V.resolve(e);if(n.has(a))return r;n.add(a);try{let s=await Te.promises.readdir(e,{withFileTypes:!0});for(let o of s){let c=V.join(e,o.name);if(o.isDirectory()){let l=i?`${i}:${o.name}`:o.name,u=await me(c,t,n,l);r.push(...u)}else if(o.isFile()&&o.name.endsWith(".md"))try{let l=await Te.promises.readFile(c,"utf-8"),u=$l(l),p=l.replace(Fo,"").trim(),m=o.name.slice(0,-3),g=i?`${i}:${m}`:m;r.push({name:g,path:c,definition:{name:g,description:u.description||"",template:p,agent:u.agent,model:u.model,subtask:u.subtask,argumentHint:u.argumentHint},scope:t,prefix:i})}catch(l){console.error(`[command-loader] Error loading command from ${c}:`,l)}}}catch(s){console.error(`[command-loader] Error reading commands directory ${e}:`,s)}return r}function Io(){let e=Lo.homedir();return{user:V.join(e,".config","opencode","commands"),project:V.join(process.cwd(),".claude","commands"),opencodeGlobal:V.join(e,".config","opencode","commands"),opencodeProject:V.join(process.cwd(),".opencode","commands")}}x();var $o=["builtin","user","opencode","opencode-project","project","skill"],jo=process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1"||process.env.KRAKEN_LOG==="1",_o=S("command-loader");class ln{commands=new Map;options;constructor(e={}){this.options=e}async loadAll(){let e=Io(),t=[];if(!this.isScopeDisabled("user")){let r=this.options.userCommandsDir||e.user;t.push(me(r,"user"))}if(!this.isScopeDisabled("project")){let r=this.options.projectCommandsDir||e.project;t.push(me(r,"project"))}if(!this.isScopeDisabled("opencode")){let r=this.options.opencodeGlobalCommandsDir||e.opencodeGlobal;t.push(me(r,"opencode"))}if(!this.isScopeDisabled("opencode-project")){let r=this.options.opencodeProjectCommandsDir||e.opencodeProject;t.push(me(r,"opencode-project"))}let n=await Promise.all(t),i=n.flat();for(let r of i)this.registerCommand(r);if(jo)_o.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=$o.indexOf(e.scope),i=$o.indexOf(t.scope);if(n>i){if(this.commands.set(e.name,e),jo)_o.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 Xe=null;async function Uo(){if(!Xe)Xe=new ln,await Xe.loadAll();return Xe}x();import{spawn as Wo}from"child_process";import{existsSync as Ho}from"node:fs";import jl from"node:path";var _l=300000,Qe=3,j=process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1"||process.env.KRAKEN_LOG==="1",_=S("skill-mcp-manager");class dn{clients=new Map;pendingConnections=new Map;idleTimeout;maxConnections;cleanupInterval=null;constructor(e={}){this.idleTimeout=e.idleTimeout||_l,this.maxConnections=e.maxConnections||10,this.startCleanupInterval(),this.setupProcessCleanup()}async initialize(){if(j)_.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),i=this.pendingConnections.get(n);if(i)return i.promise;let r=this.clients.get(n);if(r&&this.isClientHealthy(r))return r.lastUsed=Date.now(),r.client;let a=new Promise((s,o)=>{this.createClientProcess(e,t).then((c)=>{this.clients.set(n,{client:c,process:c.process,lastUsed:Date.now(),pendingRequests:0}),s(c)}).catch((c)=>{o(c)})});this.pendingConnections.set(n,{promise:a,resolve:a,reject:a});try{return await a}finally{this.pendingConnections.delete(n)}}async createClientProcess(e,t){let{command:n,args:i,env:r={}}=t;if(j)_.debug(`Starting MCP process for ${e.skillName}:${e.mcpName}`);let a=await this.resolveCommand(n);if(!a)throw Error(`MCP command '${n}' not found. Install it and ensure it is on your PATH.`);return new Promise((s,o)=>{let c=0,l=null,u=()=>{l=Wo(a,i,{env:{...process.env,...r},stdio:["pipe","pipe","pipe"]});let p=null,m=0,g=new Map,f=(b,y)=>{let C=++m,P={jsonrpc:"2.0",id:C,method:b,params:y};if(l?.stdin)l.stdin.write(JSON.stringify(P)+`
|
|
1846
|
+
`);return new Promise((O,U)=>{g.set(C,{resolve:O,reject:U}),setTimeout(()=>{g.delete(C),U(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(`
|
|
1847
|
+
`);for(let P of C){if(!P.trim())continue;try{let O=JSON.parse(P),{id:U,result:Me,error:ge}=O;if(U!==void 0&&g.has(U)){let fe=g.get(U);if(g.delete(U),ge)fe.reject(Error(ge.message));else fe.resolve(Me)}}catch(O){if(j)_.warn("Failed to parse response:",O)}}};l.stdout.on("data",b),l.on("error",(y)=>{if(j)_.warn(`MCP process error for ${e.skillName}:${e.mcpName}:`,y);if(y?.code==="ENOENT"){o(Error(`MCP command '${n}' not found.`));return}if(c<Qe){if(c++,j)_.debug(`Retrying connection (${c}/${Qe})`);setTimeout(u,1000*c)}else o(y)}),l.on("exit",(y,C)=>{if(j)_.debug(`MCP process exited for ${e.skillName}:${e.mcpName} with code ${y}, signal ${C}`);if(c<Qe&&y!==0){if(c++,j)_.debug(`Retrying connection (${c}/${Qe})`);setTimeout(u,1000*c)}else if(p&&y===0)s(p)}),setTimeout(async()=>{try{await f("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"kraken-code",version:"5.0.0"}}),await f("notifications/initialized",{}),s(p)}catch(y){o(y)}},500)}};u()})}async resolveCommand(e){if(jl.isAbsolute(e)&&Ho(e))return e;if(e.includes("/")||e.includes("\\"))return Ho(e)?e:null;let t=process.platform==="win32"?"where":"which";try{let n=Wo(t,[e],{stdio:["ignore","pipe","pipe"]}),i=await this.readStream(n.stdout);if(await new Promise((r)=>{n.on("close",()=>r())}),n.exitCode===0)return i.trim().split(`
|
|
1848
|
+
`)[0]?.trim()??null}catch{return null}return null}readStream(e){if(!e)return Promise.resolve("");return new Promise((t)=>{let n="";e.on("data",(i)=>{n+=i.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,i){return(await this.getOrCreateClient(e,t)).callTool(n,i)}async readResource(e,t,n){return(await this.getOrCreateClient(e,t)).readResource(n)}async getPrompt(e,t,n,i){return(await this.getOrCreateClient(e,t)).getPrompt(n,i)}async disconnectSession(e){let t=[];for(let[n,i]of this.clients.entries())if(n.includes(`:${e}`))await i.client.close(),t.push(n);for(let n of t)this.clients.delete(n);if(j)_.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)_.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,i]of this.clients.entries())if(e-i.lastUsed>this.idleTimeout)t.push(n);if(t.length>0){if(j)_.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)_.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 Ze=null;async function qo(){if(!Ze)Ze=new dn,await Ze.initialize();return Ze}function Ul(){return{Kraken:nt,Atlas:it,Nautilus:rt,Abyssal:ot,Coral:at,Siren:st,Scylla:ct,Pearl:lt,Maelstrom:pt,Leviathan:ut,Poseidon:dt,Cartographer:mt}}function Wl(...e){let t={},n=[];for(let i of e){if(i.config)n.push(i.config);for(let[r,a]of Object.entries(i))if(r!=="config")if(r==="tool"&&typeof a==="object"&&a!==null)if(!t[r]||typeof t[r]!=="object")t[r]=a;else t[r]={...t[r],...a};else t[r]=a}if(n.length>0)t.config=async(i)=>{for(let r of n)await r(i)};return t}var Hl={ast_grep_search:Pi,ast_grep_replace:Ei,grep:Ni,session_list:Tt,session_read:Mt,session_search:Rt,session_info:Nt,"kraken-compress":ni,"model-switcher":ri,"ralph-loop":Oi,learning_add_experience:Xi,learning_search_experiences:Qi,learning_add_knowledge_node:Zi,learning_search_knowledge_nodes:er,learning_link_knowledge_nodes:tr,learning_record_pattern:nr,learning_list_patterns:ir,learning_get_review_queue:rr,learning_review_node:or,learning_create_state_machine:ar,learning_list_state_machines:sr,...Oo()},ql=async(e)=>{let t=S("plugin-main"),n=[],i=ur(e,{autoActivate:!0});Object.assign(n,i);let r=Pn(),a=jt(e,{config:{enabled:r?.enabled??!0,recordTodos:!0,recordTranscripts:!0}});Object.assign(n,a);let s=mr(e,{config:r});Object.assign(n,s),n.push({tool:Hl}),n.push({config:async(o)=>{if(!o.agent)o.agent={};let c=Ul();for(let[u,p]of Object.entries(c))o.agent[u]={...p,...o.agent[u]};let l=["Kraken","Cartographer"];for(let u of l)if(o.agent[u])o.agent[u].mode="primary";await Promise.all([(async()=>{try{await Uo(),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 qo(),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=o.mcp||{},{disabled_mcps:p,websearch:m,...g}=u,b={...No(p||[],{websearch:m}),...g};o.mcp=b,t.debug("MCP server configs added")}catch(u){if(process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1")t.error("Error initializing MCP servers:",u)}})(),(async()=>{try{await It(),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(fr(e)),n.push({tool:Ar(e).tools}),n.push(Cr(e)),n.push(yi(e)),n.push(vr(e)),n.push(Pr(e)),n.push(Er(e)),n.push(Tr(e)),n.push(Mr(e)),n.push(ki(e)),n.push(Rr(e)),n.push(Dr(e)),n.push(Nr(e)),n.push(Lr(e)),n.push(Ir(e)),n.push(_r(e)),n.push(Ur(e)),n.push(Wr(e)),n.push(Vr(e)),n.push(Xr(e)),n.push(no(e)),n.push(Kt(e)),n.push(Bt(e)),n.push(Jt(e)),n.push(oo()),n.push(so()),n.push(go()),n.push(Ao())}catch(o){if(process.env.ANTIGRAVITY_DEBUG==="1"||process.env.DEBUG==="1")t.error("Error initializing hooks:",o)}return n.push({"tool.execute.after":async(o,c)=>{if(!c.output)return;let{tool:l,sessionID:u}=o;if(c.output&&c.output.toolOutput)await Fe(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()=>{}),Wl(...n)},Vh=ql;export{Vh as default};
|