thinkpool-pair 0.7.398 → 0.7.399

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.
@@ -0,0 +1 @@
1
+ import{evidenceForToolResult as t}from"./evidence-citations.mjs";const e=t=>"string"==typeof t?t:"text"===t?.type?String(t.text||""):"content"===t?.type?e(t.content):"",s=t=>"string"==typeof t?.rawOutput?t.rawOutput:(t?.content||[]).map(e).filter(Boolean).join("\n");export function acpToolFor(t={}){const e=String(t.kind||"").toLowerCase(),s=t.rawInput&&"object"==typeof t.rawInput?t.rawInput:{},n=String(t.title||"");return"execute"===e?{name:"Bash",input:{...s,command:s.command||n}}:"edit"===e?{name:n.toLowerCase().includes("write")?"Write":"Edit",input:s}:"read"===e?{name:"Read",input:s}:"search"===e?{name:"Grep",input:s}:{name:n||"ACPTool",input:s}}export class AcpEventMapper{constructor({onEvent:t,sessionId:e=null,model:s=null,runtime:n="acp"}={}){this.onEvent=t,this.sessionId=e,this.model=s,this.runtime=n,this.tools=new Map,this.text="",this.thought="",this.textCid=null}emit(t){try{this.onEvent?.(t)}catch{}}startSession({sessionId:t,models:e,modes:s,commands:n=[]}={}){this.sessionId=t||this.sessionId,this.model=e?.currentModelId||this.model;const o=(e?.availableModels||[]).map(t=>({value:t.modelId,displayName:t.name||t.modelId,description:t.description||""}));this.emit({kind:"system",sessionId:this.sessionId,model:this.model,commands:n,models:o,modes:s}),o.length&&this.emit({kind:"models",models:o,model:this.model})}push(n={}){if(n.sessionId&&this.sessionId&&n.sessionId!==this.sessionId)return;const o=n.update||n;if("agent_message_chunk"===o.sessionUpdate){const t=e(o.content);if(!t)return;return this.text+=t,this.textCid||=`${this.runtime}-stream:${this.sessionId||"session"}:${Date.now()}`,void this.emit({kind:"assistant_stream",cid:this.textCid,text:this.text,streaming:!0})}if("agent_thought_chunk"!==o.sessionUpdate){if("tool_call"===o.sessionUpdate){const t=acpToolFor(o);return this.tools.set(o.toolCallId,{...o,...t,startedAt:Date.now()}),void this.emit({kind:"assistant",blocks:[{type:"tool_use",id:o.toolCallId,name:t.name,input:t.input}],parentToolUseId:null})}if("tool_call_update"===o.sessionUpdate){const e=this.tools.get(o.toolCallId)||{},n={...e,...o};if(this.tools.set(o.toolCallId,n),!["completed","failed"].includes(o.status))return;const i=acpToolFor(n),d=[{type:"text",text:s(n)}],l=t(i.name,d);return this.emit({kind:"tool_result",toolUseId:o.toolCallId,content:d,...l?{evidence:l}:{},toolInput:{...e.input||{},...i.input||{}},isError:"failed"===o.status,durationMs:e.startedAt?Date.now()-e.startedAt:void 0,parentToolUseId:null}),void this.tools.delete(o.toolCallId)}if("available_commands_update"===o.sessionUpdate){const t=(o.availableCommands||[]).map(t=>"string"==typeof t?t.startsWith("/")?t:`/${t}`:{name:`/${String(t?.name||"").replace(/^\/+/,"")}`,description:String(t?.description||""),...t?.input?.hint?{inputHint:String(t.input.hint)}:{}}).filter(t=>"string"==typeof t?"/"!==t:"/"!==t.name);return void this.emit({kind:"system",sessionId:this.sessionId,model:this.model,commands:t})}"current_mode_update"===o.sessionUpdate&&this.emit({kind:"mode",mode:o.currentModeId})}else this.thought+=e(o.content)}finishTurn({stopReason:t="end_turn",usage:e=null}={}){for(const[e,s]of this.tools)this.emit({kind:"tool_result",toolUseId:e,content:[{type:"text",text:"cancelled"===t?"[cancelled]":`${this.runtime} ended the turn without reporting this tool result.`}],toolInput:s.input||void 0,isError:"cancelled"!==t&&"end_turn"!==t,missing:"cancelled"!==t,durationMs:s.startedAt?Date.now()-s.startedAt:void 0,parentToolUseId:null});this.tools.clear();const s=[];this.thought&&s.push({type:"thinking",text:this.thought,reasoningKind:"thought"}),this.text&&s.push({type:"text",text:this.text}),s.length&&this.emit({kind:"assistant",blocks:s,parentToolUseId:null,...this.textCid?{replacesCid:this.textCid}:{}}),this.emit({kind:"result",subtype:"cancelled"===t?"aborted":"end_turn"===t?"success":"error_during_execution",sessionId:this.sessionId,model:this.model,costUsd:null,usage:e?{input_tokens:Number(e.inputTokens)||0,cache_read_input_tokens:Number(e.cachedReadTokens)||0,cache_creation_input_tokens:0,output_tokens:(Number(e.outputTokens)||0)+(Number(e.thoughtTokens)||0)}:null,numTurns:1,durationMs:void 0,denials:0,resultText:this.text||null}),this.text="",this.thought="",this.textCid=null}}
@@ -0,0 +1 @@
1
+ import{AcpClient as e}from"./acp-client.mjs";import{RUNTIME_ADAPTER_VERSION as r,validateRuntimeAdapter as o}from"./runtime-adapter.mjs";export function createAcpRuntimeAdapter({runtime:e,command:o,args:t=["acp"],capabilities:c={}}={}){return Object.freeze({version:r,runtime:e,protocol:"acp",subprocess:Object.freeze({command:o,args:Object.freeze([...t]),stdio:"json-rpc-ndjson"}),lifecycle:Object.freeze(["start","new_session","resume","prompt","cancel","close","crash"]),capabilities:Object.freeze({streaming:!0,permission_request:!1,cancellation:!0,resume:!1,new_session:!0,model_catalog:!1,mode_catalog:!1,images:!1,...c})})}export function startAcpAdapterClient(r,t={}){const c=o(r);if(!c.ok||"acp"!==r.protocol)throw new Error(`ACP adapter rejected: ${c.code||"unsupported_protocol"}`);return new e({command:r.subprocess.command,args:r.subprocess.args,...t})}
@@ -1 +1 @@
1
- import e from"node:fs";import n from"node:os";import t from"node:path";export const PICKER_AGENT_COMMANDS=["claude","codex","thinkpool"];const i=()=>t.join(process.env.TP_PAIR_ROOT||t.join(n.homedir(),".thinkpool-pair"),"agent-visibility.json"),r=e=>"hermes"===String(e||"").toLowerCase()?"thinkpool":String(e||"").toLowerCase();export function loadHiddenAgentCommands({file:n=i(),fsImpl:t=e}={}){try{const e=JSON.parse(t.readFileSync(n,"utf8"));return new Set((Array.isArray(e?.hidden)?e.hidden:[]).map(r).filter(e=>PICKER_AGENT_COMMANDS.includes(e)))}catch{return new Set}}export function agentVisibilityStates(e,{hidden:n=loadHiddenAgentCommands()}={}){const t=new Set((Array.isArray(e)?e:[]).map(r)),i=PICKER_AGENT_COMMANDS.filter(e=>t.has(e)).map(e=>({cmd:e,enabled:!n.has(e)}));return i.length>0&&!i.some(e=>e.enabled)&&(i[0].enabled=!0),i}export function setAgentPickerVisibility(n,o,{installed:d=[],file:a=i(),fsImpl:s=e}={}){const l=r(n);if(!PICKER_AGENT_COMMANDS.includes(l))return{ok:!1,error:"unknown agent runtime"};const m=agentVisibilityStates(d,{hidden:loadHiddenAgentCommands({file:a,fsImpl:s})});if(!m.some(e=>e.cmd===l))return{ok:!1,error:"agent runtime is not installed"};if(!o&&m.filter(e=>e.enabled).length<=1)return{ok:!1,error:"keep at least one agent in the terminal picker"};const c=new Set(m.filter(e=>!e.enabled).map(e=>e.cmd));o?c.delete(l):c.add(l);try{s.mkdirSync(t.dirname(a),{recursive:!0,mode:448}),s.writeFileSync(a,JSON.stringify({hidden:[...c]},null,2),{mode:384});try{s.chmodSync(a,384)}catch{}}catch{return{ok:!1,error:"could not save agent visibility"}}return{ok:!0,agents:agentVisibilityStates(d,{hidden:c})}}
1
+ import e from"node:fs";import n from"node:os";import t from"node:path";export const PICKER_AGENT_COMMANDS=["claude","codex","thinkpool","opencode"];const i=()=>t.join(process.env.TP_PAIR_ROOT||t.join(n.homedir(),".thinkpool-pair"),"agent-visibility.json"),r=e=>"hermes"===String(e||"").toLowerCase()?"thinkpool":String(e||"").toLowerCase();export function loadHiddenAgentCommands({file:n=i(),fsImpl:t=e}={}){try{const e=JSON.parse(t.readFileSync(n,"utf8"));return new Set((Array.isArray(e?.hidden)?e.hidden:[]).map(r).filter(e=>PICKER_AGENT_COMMANDS.includes(e)))}catch{return new Set}}export function agentVisibilityStates(e,{hidden:n=loadHiddenAgentCommands()}={}){const t=new Set((Array.isArray(e)?e:[]).map(r)),i=PICKER_AGENT_COMMANDS.filter(e=>t.has(e)).map(e=>({cmd:e,enabled:!n.has(e)}));return i.length>0&&!i.some(e=>e.enabled)&&(i[0].enabled=!0),i}export function setAgentPickerVisibility(n,o,{installed:d=[],file:a=i(),fsImpl:s=e}={}){const l=r(n);if(!PICKER_AGENT_COMMANDS.includes(l))return{ok:!1,error:"unknown agent runtime"};const c=agentVisibilityStates(d,{hidden:loadHiddenAgentCommands({file:a,fsImpl:s})});if(!c.some(e=>e.cmd===l))return{ok:!1,error:"agent runtime is not installed"};if(!o&&c.filter(e=>e.enabled).length<=1)return{ok:!1,error:"keep at least one agent in the terminal picker"};const m=new Set(c.filter(e=>!e.enabled).map(e=>e.cmd));o?m.delete(l):m.add(l);try{s.mkdirSync(t.dirname(a),{recursive:!0,mode:448}),s.writeFileSync(a,JSON.stringify({hidden:[...m]},null,2),{mode:384});try{s.chmodSync(a,384)}catch{}}catch{return{ok:!1,error:"could not save agent visibility"}}return{ok:!0,agents:agentVisibilityStates(d,{hidden:m})}}
@@ -0,0 +1 @@
1
+ import{normalizeLaneWorkSnapshot as e}from"./lane-work-snapshot.mjs";const t=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/,r=/^[a-f0-9]{40}$/;function n(e){const r="string"==typeof e?e.trim():"";return t.test(r)?r:null}export function resolveBranchCheckpoint({parentTerminalId:t,resultCid:o,sourceSha:a,log:i=[]}={}){const c=n(t),s=n(o),l=function(e){const t="string"==typeof e?e.trim().toLowerCase():"";return r.test(t)?t:null}(a);if(!c||!s||!l)return{ok:!1,reason:"The branch checkpoint is incomplete."};const h=Array.isArray(i)?i.find(e=>"result"===e?.kind&&e?.cid===s):null,p=e(h?.work);return h&&p&&p.terminalId===c?"clean"===p.git.worktreeState&&p.git.headSha?p.git.headSha!==l?{ok:!1,reason:"The displayed source commit does not match the checkpoint."}:{ok:!0,checkpoint:{parentTerminalId:c,resultCid:s,sourceSha:l,turnRev:p.turnRev}}:{ok:!1,reason:"That work checkpoint was not clean."}:{ok:!1,reason:"That work checkpoint is no longer provable."}}export function branchContextFromResult(e){return(Array.isArray(e?.blocks)?e.blocks.filter(e=>"text"===e?.type&&"string"==typeof e.text).map(e=>e.text.trim()).filter(Boolean).join("\n\n"):"string"==typeof e?.text?e.text.trim():"").slice(0,12e3)}export const LANE_FORK_COMPARISON=Object.freeze({side:Object.freeze({cwd:"shared-parent",context:"latest-bounded",lineage:"mutable-parent"}),branch:Object.freeze({cwd:"isolated-managed-worktree",context:"exact-result-only",lineage:"immutable-checkpoint"})});