hankweave 0.5.7 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -11
- package/dist/base-process-manager.d.ts +30 -0
- package/dist/budget.d.ts +315 -0
- package/dist/checkpoint-git.d.ts +98 -0
- package/dist/claude-agent-sdk-manager.d.ts +144 -0
- package/dist/claude-log-parser.d.ts +63 -0
- package/dist/claude-runtime-extractor.d.ts +73 -0
- package/dist/codex-runtime-extractor.d.ts +107 -0
- package/dist/codon-runner.d.ts +278 -0
- package/dist/config-validation/model-validator.d.ts +16 -0
- package/dist/config-validation/sentinel.schema.d.ts +6967 -0
- package/dist/config.d.ts +40815 -0
- package/dist/cost-tracker.d.ts +72 -0
- package/dist/execution-planner.d.ts +62 -0
- package/dist/execution-thread.d.ts +71 -0
- package/dist/exports/schemas.d.ts +9 -0
- package/dist/exports/schemas.js +1019 -0
- package/dist/exports/types.d.ts +15 -0
- package/dist/exports/types.js +60 -0
- package/dist/file-resolver.d.ts +33 -0
- package/dist/index.js +380 -293
- package/dist/index.js.map +33 -29
- package/dist/llm/llm-provider-registry.d.ts +207 -0
- package/dist/llm/models-dev-schema.d.ts +679 -0
- package/dist/llm/provider-config.d.ts +30 -0
- package/dist/prompt-builder.d.ts +75 -0
- package/dist/prompt-frontmatter.d.ts +61 -0
- package/dist/replay-process-manager.d.ts +82 -0
- package/dist/runtime-extractor-base.d.ts +120 -0
- package/dist/schemas/event-schemas.d.ts +8389 -0
- package/dist/schemas/websocket-log-schemas.d.ts +4502 -0
- package/dist/shim-process-manager.d.ts +98 -0
- package/dist/shim-runtime-extractor.d.ts +51 -0
- package/dist/shims/codex/README.md +129 -0
- package/dist/shims/codex/THIRDPARTY.md +18 -0
- package/dist/shims/codex/VERSION +1 -0
- package/dist/shims/codex/common/package.json +24 -0
- package/dist/shims/codex/index.js +1154 -970
- package/dist/shims/codex/package.json +46 -0
- package/dist/shims/codex/tsup.config.ts +16 -0
- package/dist/shims/gemini/README.md +59 -0
- package/dist/shims/gemini/THIRDPARTY.md +32 -0
- package/dist/shims/gemini/VERSION +1 -0
- package/dist/shims/gemini/common/package.json +24 -0
- package/dist/shims/gemini/index.js +1359 -30
- package/dist/shims/gemini/package.json +37 -0
- package/dist/shims/opencode/README.md +82 -0
- package/dist/shims/opencode/THIRDPARTY.md +32 -0
- package/dist/shims/opencode/VERSION +1 -0
- package/dist/shims/opencode/common/package.json +24 -0
- package/dist/shims/opencode/index.js +1476 -0
- package/dist/shims/opencode/package.json +38 -0
- package/dist/shims/pi/README.md +87 -0
- package/dist/shims/pi/THIRDPARTY.md +24 -0
- package/dist/shims/pi/VERSION +1 -0
- package/dist/shims/pi/common/package.json +24 -0
- package/dist/shims/pi/index.js +249832 -0
- package/dist/shims/pi/package.json +53 -0
- package/dist/state-manager.d.ts +161 -0
- package/dist/state-transition-guards.d.ts +37 -0
- package/dist/telemetry/telemetry-types.d.ts +206 -0
- package/dist/typed-event-emitter.d.ts +57 -0
- package/dist/types/branded-types.d.ts +15 -0
- package/dist/types/budget-types.d.ts +82 -0
- package/dist/types/claude-session-schema.d.ts +2430 -0
- package/dist/types/error-types.d.ts +44 -0
- package/dist/types/input-ai-types.d.ts +1070 -0
- package/dist/types/llm-call-types.d.ts +3829 -0
- package/dist/types/sentinel-types.d.ts +66 -0
- package/dist/types/state-types.d.ts +1099 -0
- package/dist/types/tool-types.d.ts +86 -0
- package/dist/types/types.d.ts +367 -0
- package/dist/types/websocket-log-types.d.ts +7 -0
- package/dist/utils.d.ts +452 -0
- package/package.json +15 -2
- package/schemas/hank.schema.json +158 -3
- package/schemas/hankweave.schema.json +17 -1
- package/shims/codex/index.js +0 -1583
- package/shims/gemini/index.js +0 -31
package/shims/gemini/index.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import{readFileSync as pe}from"fs";import{dirname as ge,join as fe}from"path";import{fileURLToPath as he}from"url";var Y=["none","standard","strict"];function J(s,e){let t={model:"",verbose:!1,idleTimeout:120,sandbox:"none",selfTest:!1,version:!1,help:!1};for(let r=0;r<s.length;r++){let i=s[r];if(i.includes("=")){let[n,l]=i.split("=",2);s.splice(r,1,n,l),i=n}switch(e&&i in e&&(i=e[i]),i){case"--model":t.model=s[++r];break;case"--resume":t.resume=s[++r];break;case"--verbose":t.verbose=!0;break;case"--append-system-prompt":t.appendSystemPrompt=s[++r];break;case"--debug-dir":t.debugDir=s[++r];break;case"--idle-timeout":{let n=Number(s[++r]);(!Number.isFinite(n)||n<=0)&&(console.error("Invalid --idle-timeout value: must be a positive number"),process.exit(1)),t.idleTimeout=n;break}case"--sandbox":{let n=s[++r];Y.includes(n)||(console.error(`Invalid --sandbox value: must be one of ${Y.join(", ")}`),process.exit(1)),t.sandbox=n;break}case"--self-test":t.selfTest=!0;break;case"--version":t.version=!0;break;case"--help":t.help=!0;break}}return t}import{spawn as A}from"child_process";import{createWriteStream as O}from"fs";import{mkdir as z}from"fs/promises";import{isAbsolute as G,resolve as h}from"path";import{createInterface as le}from"readline";var _=class{constructor(e){this.options=e;this.verbose=e.verbose}process=null;verbose;rawEventStream=null;stderrStream=null;stderrBuffer="";currentSessionId="unknown";static async isInstalled(){return new Promise(e=>{let t=process.platform==="win32",i=A(t?"where":"which",["gemini"],{shell:t}),n="";i.stdout?.on("data",l=>{n+=l.toString()}),i.on("close",l=>{if(l===0&&n.trim()){let c=A("gemini",["--version"],{shell:t}),o="";c.stdout?.on("data",m=>{o+=m.toString()}),c.on("close",()=>{e({found:!0,path:n.trim(),version:o.trim()})})}else e({found:!1})})})}async initializeDebugStreams(e){if(this.options.debugDir)try{let t=G(this.options.debugDir)?this.options.debugDir:h(this.options.cwd,this.options.debugDir);await z(t,{recursive:!0});let r=h(t,`session-${e}.raw.jsonl`);this.rawEventStream=O(r,{flags:"a",encoding:"utf8"});let i=h(t,`session-${e}.raw.log`);this.stderrStream=O(i,{flags:"a",encoding:"utf8"}),this.stderrBuffer&&(this.stderrStream.write(this.stderrBuffer),this.stderrBuffer=""),this.currentSessionId=e}catch(t){throw new Error(`Failed to create debug log files in ${this.options.debugDir}: ${t instanceof Error?t.message:String(t)}`)}}async renameDebugStreams(e){if(!(!this.options.debugDir||this.currentSessionId===e))try{let t=G(this.options.debugDir)?this.options.debugDir:h(this.options.cwd,this.options.debugDir);await this.closeDebugStreams();let{rename:r}=await import("fs/promises"),i=h(t,`session-${this.currentSessionId}.raw.jsonl`),n=h(t,`session-${e}.raw.jsonl`),l=h(t,`session-${this.currentSessionId}.raw.log`),c=h(t,`session-${e}.raw.log`);try{await r(i,n)}catch(o){this.verbose&&console.error(`[gemini-cli-shim] Could not rename ${i}:`,o)}try{await r(l,c)}catch(o){this.verbose&&console.error(`[gemini-cli-shim] Could not rename ${l}:`,o)}await this.initializeDebugStreams(e)}catch(t){throw new Error(`Failed to rename debug log files: ${t instanceof Error?t.message:String(t)}`)}}writeRawEvent(e){this.rawEventStream&&this.rawEventStream.write(`${JSON.stringify(e)}
|
|
3
|
-
`)}writeStderr(e){this.options.debugDir&&(this.stderrStream?this.stderrStream.write(e):this.stderrBuffer+=e)}async closeDebugStreams(){let e=[];if(this.stderrBuffer&&!this.stderrStream&&this.options.debugDir)try{let t=G(this.options.debugDir)?this.options.debugDir:h(this.options.cwd,this.options.debugDir);await z(t,{recursive:!0});let r=h(t,`session-${this.currentSessionId}.raw.log`),i=O(r,{flags:"a",encoding:"utf8"});await new Promise((n,l)=>{i.write(this.stderrBuffer,c=>{c?l(c):i.end(o=>{o?l(o):n()})})}),this.stderrBuffer=""}catch(t){console.error("[gemini-cli-shim] Error flushing buffered stderr:",t)}this.rawEventStream&&(e.push(new Promise((t,r)=>{this.rawEventStream?.end(i=>{i?r(i):t()})})),this.rawEventStream=null),this.stderrStream&&(e.push(new Promise((t,r)=>{this.stderrStream?.end(i=>{i?r(i):t()})})),this.stderrStream=null),await Promise.all(e)}async spawn(e){let t=["--model",this.options.model,"--output-format","stream-json","--yolo"];this.options.sandbox!=="none"&&t.push("--sandbox"),this.options.resume&&t.push("--resume",this.options.resume),this.verbose&&console.error("[gemini-cli-shim] Spawning gemini:",t.join(" "));let r=process.platform==="win32";this.process=A("gemini",t,{cwd:this.options.cwd,stdio:["pipe","pipe","pipe"],env:{...process.env,...this.options.sandbox==="strict"&&{SEATBELT_PROFILE:"strict-open"}},shell:r}),this.options.debugDir&&await this.initializeDebugStreams("unknown");let i=this.options.appendSystemPrompt?`${e}
|
|
4
|
-
|
|
5
|
-
Additional instructions: ${this.options.appendSystemPrompt}`:e;return this.process.stdin?.write(i),this.process.stdin?.end(),this.createEventStream()}async*createEventStream(){if(!this.process||!this.process.stdout||!this.process.stderr)throw new Error("Process not spawned");let e="",t=!1,r=!1,i="",n=null;this.process.stderr.on("data",c=>{let o=c.toString();e+=o,this.writeStderr(o),!r&&(o.includes("Error resuming session:")||o.includes("Invalid session identifier"))&&(t=!0,r=!0,this.verbose&&console.error("[gemini-cli-shim] Session error detected, killing process"),this.process&&this.process.kill("SIGKILL")),this.verbose&&console.error("[gemini stderr]",o)});let l=le({input:this.process.stdout,crlfDelay:1/0});if(t)throw new Error("Invalid session ID");try{for await(let c of l){let o=c.trim();if(t)throw new Error("Invalid session ID");if(o)try{let m=JSON.parse(o);m.type==="init"&&m.session_id&&(i=m.session_id,this.options.debugDir&&this.currentSessionId==="unknown"&&await this.renameDebugStreams(i)),this.writeRawEvent(m),this.verbose&&console.error("[gemini event]",JSON.stringify(m)),yield m}catch(m){this.verbose&&(console.error("[gemini-cli-shim] Failed to parse line:",o),console.error("[gemini-cli-shim] Error:",m))}}}catch(c){throw t?new Error("Invalid session ID"):c}if(t)throw new Error("Invalid session ID");await new Promise((c,o)=>{if(!this.process){t?o(new Error("Invalid session ID")):c();return}let m=setTimeout(()=>{this.verbose&&console.error("[gemini-cli-shim] Process exit timeout, forcing kill"),this.kill(),o(t?new Error("Invalid session ID"):new Error("Process did not exit within timeout"))},2e3);this.process.on("close",async d=>{clearTimeout(m),n=d;try{await this.closeDebugStreams()}catch(I){console.error("[gemini-cli-shim] Error closing debug streams:",I)}t?o(new Error("Invalid session ID")):d===0||d===null?c():o(new Error(`Gemini CLI exited with code ${d}`))}),this.process.on("error",async d=>{clearTimeout(m);try{await this.closeDebugStreams()}catch(I){console.error("[gemini-cli-shim] Error closing debug streams:",I)}o(t?new Error("Invalid session ID"):d)})})}kill(){this.process&&(this.process.kill("SIGTERM"),this.process=null)}};import{readFileSync as ue}from"fs";import{resolve as de}from"path";import{randomUUID as Le}from"crypto";import Ne from"fs";import Ce from"path";var L=class extends Error{timeoutMs;constructor(e){super(`Idle timeout: no events received for ${e}ms`),this.name="IdleTimeoutError",this.timeoutMs=e}};async function*q(s,e){let t=s[Symbol.asyncIterator]();try{for(;;){let r;try{let i=await Promise.race([t.next(),new Promise((n,l)=>{r=setTimeout(()=>{l(new L(e))},e)})]);if(i.done)break;yield i.value}finally{clearTimeout(r)}}}finally{t.return?.()}}var H=["Read","Write","Edit","Bash","Glob","Grep","LS"];var V={sonnet:"anthropic/claude-sonnet-4-20250514",haiku:"anthropic/claude-3-haiku",opus:"anthropic/claude-opus-4-5-20251101",flash:"google/gemini-2.0-flash",pro:"google/gemini-2.0-pro"};function Z(s){if(!s){let e=process.env.MODEL;e?s=e:s="flash"}if(V[s]){let e=V[s];return e.startsWith("google/")?e.replace("google/",""):e}if(s.includes("/")){let[e,t]=s.split("/",2);return e==="google"?t:s}return s}function E(s){return s.startsWith("anthropic/")?s.replace("anthropic/",""):!s.includes("/")&&(s.startsWith("gemini-")||s==="flash"||s==="pro")?`google/${s}`:s}import{randomBytes as X}from"crypto";function R(){let s=Date.now().toString(36),e=X(5).toString("hex");return`msg_${s}${e}`}function N(){let s=Date.now().toString(36),e=X(6).toString("hex");return`toolu_${s}${e}`}var x="00000000-0000-0000-0000-000000000000";var ce={read_file:"Read",readFile:"Read",file_read:"Read",write_file:"Write",writeFile:"Write",file_write:"Write",edit_file:"Edit",editFile:"Edit",str_replace_editor:"Edit",run_shell_command:"Bash",bash:"Bash",shell:"Bash",execute_bash:"Bash",list_directory:"LS",ls:"LS",list:"LS",list_dir:"LS",glob:"Glob",find_files:"Glob",grep:"Grep",search_files:"Grep",search:"Grep"};function Q(s){return ce[s]||s}function me(s){return s.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function ee(s){if(!s)return s;let e={};for(let[t,r]of Object.entries(s))e[me(t)]=r;return e}function k(){return[...H]}function y(s){console.log(JSON.stringify(s))}function $(){return process.env.GOOGLE_API_KEY?"GOOGLE_API_KEY":process.env.GEMINI_API_KEY?"GEMINI_API_KEY":"none"}async function se(s,e){let t=Date.now(),r=0,i=0,n="",l=0,c={input_tokens:0,output_tokens:0},o=!1,m="",d=!1;if(e.debugDir)try{let{mkdirSync:p}=await import("fs");p(e.debugDir,{recursive:!0})}catch{}let I="Always repeat the results of your tool calls (like file contents or command output) in your text response. This is critical for verification.",ie=e.appendSystemPrompt?`${I}
|
|
6
|
-
${e.appendSystemPrompt}`:I,oe={...e,appendSystemPrompt:ie},C=new Set,U=new Map,B=new Map,w=[],T=R(),D=!1,b="";try{let P=await new _(oe).spawn(s),K=q(P,e.idleTimeout*1e3);for await(let a of K)switch(a.type){case"init":{n=a.session_id,d=!0;let u={type:"system",subtype:"init",cwd:e.cwd,session_id:n,tools:k(),model:E(e.model),permissionMode:"bypassPermissions",apiKeySource:$(),mcp_servers:[]};y(u),r=Date.now();break}case"message":{if(a.role==="assistant"){if(a.delta)D=!0,b+=a.content,w.push({type:"text",text:a.content});else if(!D)w.push({type:"text",text:a.content}),b=a.content;else if(a.content.length>b.length&&a.content.startsWith(b)){let u=a.content.slice(b.length);u.trim()&&(w.push({type:"text",text:u}),b=a.content)}}break}case"tool_use":{if(!C.has(a.tool_id)){C.add(a.tool_id);let u=N();U.set(a.tool_id,u);let v=Q(a.tool_name),S=ee(a.parameters);B.set(a.tool_id,{name:v,params:a.parameters}),w.push({type:"tool_use",id:u,name:v,input:S});let j={type:"assistant",message:{id:T,type:"message",role:"assistant",model:E(e.model),content:w,stop_reason:"tool_use"}};y(j),w=[],T=R(),D=!1,b="",l++}break}case"tool_result":{let u=U.get(a.tool_id)||N(),v=B.get(a.tool_id),S="";if(a.status==="error")S={is_error:!0,error:a.error||"Unknown error"};else{let F=a;if(S=a.output!==void 0?a.output:F.result||F.content||"",v?.name==="Read"&&S===""){let M=v.params?.file_path||v.params?.filePath||v.params?.path;if(M&&typeof M=="string")try{let W=de(e.cwd,M);S=ue(W,"utf-8")}catch{}}}y({type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:u,content:S}]}}),D=!1,b="";break}case"result":{if(i=Date.now(),w.length>0){let u={type:"assistant",message:{id:T,type:"message",role:"assistant",model:E(e.model),content:w,stop_reason:"end_turn"}};y(u),l++}c.input_tokens=(c.input_tokens||0)+(a.stats.input_tokens||0),c.output_tokens=(c.output_tokens||0)+(a.stats.output_tokens||0),o=a.status==="error",m=o?"Error completing request":"Request completed successfully";break}}}catch(p){let P=p instanceof Error?p.message:String(p);if(P.includes("Invalid session ID"))throw p;if(o=!0,m=`Agent Error: ${P}`,!d){let a={type:"system",subtype:"init",cwd:e.cwd,session_id:n||x,tools:k(),model:E(e.model),permissionMode:"bypassPermissions",apiKeySource:$(),mcp_servers:[]};y(a),d=!0}y({type:"assistant",message:{id:x,type:"message",role:"assistant",model:"<synthetic>",content:[{type:"text",text:m}]}})}let ne=Date.now(),ae={type:"result",subtype:o?"error":"success",is_error:o,duration_ms:ne-t,duration_api_ms:i>0?i-r:0,num_turns:l,result:m,session_id:n,usage:c};return y(ae),await new Promise(p=>{process.stdout.write("",()=>p())}),{exitCode:o?1:0,sessionId:n}}async function te(s,e){let t={type:"system",subtype:"init",cwd:process.cwd(),session_id:e||x,tools:k(),model:"<unknown>",permissionMode:"bypassPermissions",apiKeySource:$(),mcp_servers:[]};y(t);let r={type:"assistant",message:{id:x,type:"message",role:"assistant",model:"<synthetic>",content:[{type:"text",text:`API Error: ${s}`}]}};y(r),y({type:"result",subtype:"error",is_error:!0,duration_ms:0,duration_api_ms:0,num_turns:0,result:s,session_id:e}),await new Promise(n=>{process.stdout.write("",()=>n())})}var ye=he(import.meta.url),we=ge(ye);async function be(){let s=[];for await(let e of process.stdin)s.push(Buffer.from(e));return Buffer.concat(s).toString("utf-8").trim()}function re(){console.error(`
|
|
7
|
-
Gemini CLI Shim - Translate Gemini CLI to standardized JSONL output
|
|
8
|
-
|
|
9
|
-
Usage: gemini-cli-shim [options]
|
|
10
|
-
|
|
11
|
-
Required Arguments:
|
|
12
|
-
--model <model> Model identifier (shortname, provider/model, or full ID)
|
|
13
|
-
|
|
14
|
-
Optional Arguments:
|
|
15
|
-
-p Indicates prompt via stdin (optional, stdin always read)
|
|
16
|
-
--resume <session_id> Session ID to continue
|
|
17
|
-
--verbose Enable verbose logging to stderr
|
|
18
|
-
--append-system-prompt <txt> Additional system prompt to append
|
|
19
|
-
--idle-timeout <seconds> Max seconds between agent events before aborting (default: 120)
|
|
20
|
-
--debug-dir <path> Directory for debug logs and session data
|
|
21
|
-
--sandbox <level> Sandbox level: none (default), standard, or strict
|
|
22
|
-
--self-test Run environment verification
|
|
23
|
-
--version Print version and exit
|
|
24
|
-
--help Print this help and exit
|
|
25
|
-
|
|
26
|
-
Examples:
|
|
27
|
-
echo "Hello" | gemini-cli-shim --model flash
|
|
28
|
-
echo "Continue" | gemini-cli-shim --model pro --resume <session_id>
|
|
29
|
-
echo "Debug" | gemini-cli-shim --model flash --debug-dir ./debug
|
|
30
|
-
gemini-cli-shim --self-test
|
|
31
|
-
`)}function ve(){try{let s=fe(we,"..","package.json"),e=JSON.parse(pe(s,"utf-8"));console.error(`gemini-cli-shim v${e.version}`)}catch{console.error("gemini-cli-shim (version unknown)")}}async function Se(){let s=[],e=await _.isInstalled();s.push({name:"gemini_cli_found",passed:e.found,message:e.found?`Gemini CLI found at ${e.path} (${e.version})`:"Gemini CLI not found in PATH"});let t=!!(process.env.GOOGLE_API_KEY||process.env.GEMINI_API_KEY);s.push({name:"api_key",passed:t,message:t?"API key found in environment":"No GOOGLE_API_KEY or GEMINI_API_KEY found"});let r=s.every(n=>n.passed),i={shim:{name:"gemini-cli-shim",version:"1.0.0"},agent:{name:"gemini-cli",version:e.version||"unknown",found:e.found},checks:s,overall:{passed:r,message:r?"All checks passed":"Some checks failed"}};console.log(JSON.stringify(i,null,2)),process.exit(r?0:1)}async function _e(){let s=J(process.argv.slice(2),{"-m":"--model","-r":"--resume","-v":"--verbose","-h":"--help"});if(s.help&&(re(),process.exit(0)),s.version&&(ve(),process.exit(0)),s.selfTest){await Se();return}s.model||(console.error("Error: --model is required"),re(),process.exit(1));let e=await be();e||process.exit(0);let t=Z(s.model);(await _.isInstalled()).found||(console.error("Error: Gemini CLI not found in PATH"),console.error("Please install Gemini CLI: https://geminicli.com/docs/"),process.exit(1)),!process.env.GOOGLE_API_KEY&&!process.env.GEMINI_API_KEY&&(console.error("Error: No API key found"),console.error("Set GOOGLE_API_KEY or GEMINI_API_KEY environment variable"),process.exit(1));let i=!1,n=()=>{i||(i=!0,s.verbose&&console.error("[gemini-cli-shim] Received interrupt signal, exiting gracefully"),process.exit(0))};process.on("SIGINT",n),process.on("SIGTERM",n);try{let l=await se(e,{model:t,resume:s.resume,verbose:s.verbose,cwd:process.cwd(),appendSystemPrompt:s.appendSystemPrompt,debugDir:s.debugDir,idleTimeout:s.idleTimeout,sandbox:s.sandbox});process.exit(l.exitCode)}catch(l){let c=l instanceof Error?l.message:String(l);c.includes("Invalid session ID")&&(console.error(`Error: Session not found: ${s.resume}`),console.error("Use a valid session ID to resume"),process.exit(1)),await te(c),process.exit(1)}}_e().catch(s=>{console.error("Fatal error:",s),process.exit(1)});
|