@automagik/genie 4.260508.4 → 4.260509.3
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/genie.js
CHANGED
|
@@ -189,7 +189,7 @@ ${content}`;if(params.extraArgs){let fileIdx=params.extraArgs.indexOf("--append-
|
|
|
189
189
|
${readFileSync3(params.extraArgs[fileIdx+1],"utf-8")}`,params.extraArgs.splice(fileIdx,2)}writeFileSync2(promptFile,content);let flag=params.promptMode==="system"?"--system-prompt-file":"--append-system-prompt-file";parts.push(flag,escapeShellArg2(promptFile))}else if(params.systemPromptFile){let flag=params.promptMode==="system"?"--system-prompt-file":"--append-system-prompt-file";parts.push(flag,escapeShellArg2(params.systemPromptFile))}}function appendOtelEnv(env,params){if(!params.otelPort||process.env.OTEL_EXPORTER_OTLP_ENDPOINT)return;if(env.CLAUDE_CODE_ENABLE_TELEMETRY="1",env.OTEL_LOGS_EXPORTER="otlp",env.OTEL_METRICS_EXPORTER="otlp",env.OTEL_EXPORTER_OTLP_PROTOCOL="http/json",env.OTEL_EXPORTER_OTLP_ENDPOINT=`http://127.0.0.1:${params.otelPort}`,env.OTEL_LOG_TOOL_DETAILS="1",params.otelLogPrompts!==!1)env.OTEL_LOG_USER_PROMPTS="1";let resourceParts=[];if(params.role)resourceParts.push(`agent.name=${params.role}`);if(params.team)resourceParts.push(`team.name=${params.team}`);if(params.otelWishSlug)resourceParts.push(`wish.slug=${params.otelWishSlug}`);if(params.role)resourceParts.push(`agent.role=${params.role}`);if(resourceParts.length>0)env.OTEL_RESOURCE_ATTRIBUTES=resourceParts.join(",")}function appendTraceContext(parts,env,params){let ctx=getAmbient();if(params.initialPrompt){let prompt=ctx?injectPromptPreamble(params.initialPrompt,ctx):params.initialPrompt;parts.push(escapeShellArg2(prompt))}if(ctx)env[TRACE_ENV_VAR]=mintToken(ctx),env[TRACE_ID_ENV_VAR]=ctx.trace_id}function buildClaudeGenieEnv(params){let env={};if(env.GENIE_WORKER="1",params.role)env.GENIE_AGENT_NAME=params.role;if(params.team)env.GENIE_TEAM=params.team;if(params.executorId)env.GENIE_EXECUTOR_ID=params.executorId;if(params.agentId)env.GENIE_AGENT_ID=params.agentId;return env}function appendSessionFlags(parts,params){if(params.resume)parts.push("--resume",escapeShellArg2(params.resume));else if(params.sessionId)parts.push("--session-id",escapeShellArg2(params.sessionId));let claudeAgentFlag=params.agentTemplate??params.role;if(claudeAgentFlag)parts.push("--agent",escapeShellArg2(claudeAgentFlag));if(params.model)parts.push("--model",escapeShellArg2(params.model))}function buildSettingsObject(params){let settingsObj={};if(!params.skipHooks){let hookEntry={type:"command",command:buildDispatchCommand(),timeout:15},{DISPATCHED_EVENT_MATCHERS:DISPATCHED_EVENT_MATCHERS2}=(init_types2(),__toCommonJS(exports_types)),hooks={};for(let[event,matcher]of Object.entries(DISPATCHED_EVENT_MATCHERS2))hooks[event]=[{matcher,hooks:[hookEntry]}];settingsObj.hooks=hooks}let explicitAllow=params.permissions?.allow??[],explicitDeny=params.permissions?.deny??[],missingBaseline=GENIE_BASELINE_ALLOWED_TOOLS.filter((tool)=>!explicitAllow.includes(tool)),perms={allow:[...explicitAllow,...missingBaseline]};if(explicitDeny.length>0)perms.deny=explicitDeny;return settingsObj.permissions=perms,settingsObj}function warnIfAllowRulesAreBypassed(params){if(!params.permissions?.allow?.length)return;if(params.nativeTeam?.permissionMode!=="bypassPermissions")return;let agentName=params.nativeTeam.agentName??params.role??params.name??"unknown";process.stderr.write(`Warning: agent ${agentName} declares permissions.allow but permissionMode is bypassPermissions \u2014 allow rules are advisory under bypass (deny still enforced).
|
|
190
190
|
`)}function appendDisallowedAndExtraArgs(parts,params){if(params.disallowedTools?.length)for(let tool of params.disallowedTools)parts.push("--disallowedTools",escapeShellArg2(tool));if(params.extraArgs)for(let arg of params.extraArgs)parts.push(escapeShellArg2(arg))}function assertClaudeBuiltinHasIdentity(params){let templateName=params.agentTemplate??params.role;if(!templateName)return;if(params.resume)return;if(!resolveBuiltinAgentPath(templateName))return;if(params.systemPromptFile||params.systemPrompt)return;throw Error(`Refusing to launch built-in agent "${templateName}" without AGENTS.md identity. Resolve systemPromptFile or systemPrompt before building the Claude command.`)}function buildClaudeCommand(params){assertClaudeBuiltinHasIdentity(params),preflightCheck("claude");let parts=[resolveShellBinary("claude")??"claude","--permission-mode",escapeShellArg2("auto")],env=buildClaudeGenieEnv(params);if(appendOtelEnv(env,params),params.nativeTeam?.enabled)appendNativeTeamFlags(parts,env,params.nativeTeam,params);appendSessionFlags(parts,params),appendSystemPromptFlags(parts,params),warnIfAllowRulesAreBypassed(params);let settingsObj=buildSettingsObject(params);if(Object.keys(settingsObj).length>0)parts.push("--settings",escapeShellArg2(JSON.stringify(settingsObj)));return appendDisallowedAndExtraArgs(parts,params),appendTraceContext(parts,env,params),{command:parts.join(" "),provider:"claude",env:Object.keys(env).length>0?env:void 0,meta:{role:params.role,skill:params.skill}}}function buildCodexAutoPrompt(params){let promptParts=[`Genie worker. Team: ${params.team}.`];if(params.role)promptParts.push(`Role: ${params.role}.`);if(params.skill)promptParts.push(`Execute the ${params.skill} skill instructions.`);return promptParts.join(" ")}function sanitizeCodexPromptFileStem(stem){return stem.replace(/[^a-zA-Z0-9._-]/g,"-")||Date.now().toString(36)}function splitCodexExtraArgs(extraArgs){let forwarded=[],promptFiles=[],args=extraArgs??[];for(let i2=0;i2<args.length;i2++){let arg=args[i2],equalsFlag=[...CODEX_PROMPT_FILE_FLAGS].find((flag)=>arg.startsWith(`${flag}=`));if(equalsFlag){let path=arg.slice(equalsFlag.length+1);if(!path)throw Error(`Missing path for ${equalsFlag}`);promptFiles.push(path);continue}if(CODEX_PROMPT_FILE_FLAGS.has(arg)){let path=args[i2+1];if(!path)throw Error(`Missing path after ${arg}`);promptFiles.push(path),i2++;continue}forwarded.push(arg)}return{forwarded,promptFiles}}function buildCodexMergedPrompt(params,extraPromptFiles){let{readFileSync:readFileSync3}=__require("fs"),sections=[];if(params.systemPromptFile!==void 0)sections.push(readFileSync3(params.systemPromptFile,"utf-8"));if(params.systemPrompt!==void 0)sections.push(params.systemPrompt);for(let promptFile of extraPromptFiles)sections.push(readFileSync3(promptFile,"utf-8"));if(params.initialPrompt!==void 0)sections.push(params.initialPrompt);return sections.length>0?sections.join(`
|
|
191
191
|
|
|
192
|
-
`):null}function writeCodexPromptFile(params,content){let{mkdirSync:mkdirSync2,writeFileSync:writeFileSync2}=__require("fs"),{join:join5}=__require("path");mkdirSync2(CODEX_PROMPT_DIR,{recursive:!0});let stem=sanitizeCodexPromptFileStem(params.executorId??Date.now().toString(36)),promptFile=join5(CODEX_PROMPT_DIR,`${stem}.txt`);return writeFileSync2(promptFile,content,"utf-8"),promptFile}function buildCodexCommand(params){preflightCheck("codex");let parts=["codex"],env={};if(params.executorId)env.GENIE_EXECUTOR_ID=params.executorId;if(params.agentId)env.GENIE_AGENT_ID=params.agentId;if(params.role)env.GENIE_AGENT_NAME=params.role;else if(params.name)env.GENIE_AGENT_NAME=params.name;if(params.team)env.GENIE_TEAM=params.team;let{forwarded:extraArgs,promptFiles:extraPromptFiles}=splitCodexExtraArgs(params.extraArgs);parts.push("--yolo"),parts.push("--no-alt-screen");let codexModel=sanitizeModelForProvider("codex",params.model);if(codexModel)parts.push("--model",escapeShellArg2(codexModel));for(let arg of extraArgs)parts.push(escapeShellArg2(arg));let mergedPrompt=buildCodexMergedPrompt(params,extraPromptFiles);if(mergedPrompt!==null){let promptFile=writeCodexPromptFile(params,mergedPrompt);parts.push(`"$(cat ${escapeShellArg2(promptFile)})"`)}else parts.push(escapeShellArg2(buildCodexAutoPrompt(params)));return{command:parts.join(" "),provider:"codex",env:Object.keys(env).length>0?env:void 0,meta:{role:params.role,skill:params.skill}}}function buildLaunchCommand(params){let validated=validateSpawnParams(params);switch(validated.provider){case"claude":return buildClaudeCommand(validated);case"codex":return buildCodexCommand(validated);case"claude-sdk":return{command:"claude-sdk-in-process",provider:"claude-sdk",meta:{role:validated.role,skill:validated.skill}};default:throw Error(`Unknown provider "${validated.provider}". Valid providers: claude, codex, claude-sdk`)}}var CLAUDE_TEAM_COLORS,spawnParamsSchema,CODEX_PROMPT_DIR="/tmp/genie-codex-prompts",CODEX_PROMPT_FILE_FLAGS;var init_provider_adapters=__esm(()=>{init_zod();init_inject();init_builtin_agents();init_claude_settings();init_provider_models();init_trace_context();CLAUDE_TEAM_COLORS=["red","blue","green","yellow","purple","orange","pink","cyan"],spawnParamsSchema=exports_external.object({provider:exports_external.enum(["claude","codex","claude-sdk","app-pty"]),team:exports_external.string().min(1,"Team name is required"),role:exports_external.string().optional(),agentTemplate:exports_external.string().optional(),skill:exports_external.string().optional(),agentId:exports_external.string().optional(),executorId:exports_external.string().uuid().optional(),extraArgs:exports_external.array(exports_external.string()).optional(),nativeTeam:exports_external.object({enabled:exports_external.boolean(),parentSessionId:exports_external.string().optional(),color:exports_external.string().optional(),agentType:exports_external.string().optional(),planModeRequired:exports_external.boolean().optional(),permissionMode:exports_external.string().optional(),agentName:exports_external.string().optional()}).optional(),sessionId:exports_external.string().uuid().optional(),resume:exports_external.string().optional(),systemPromptFile:exports_external.string().optional(),systemPrompt:exports_external.string().optional(),promptMode:exports_external.enum(["system","append"]).optional(),model:exports_external.string().optional(),initialPrompt:exports_external.string().optional(),name:exports_external.string().optional(),permissions:exports_external.object({allow:exports_external.array(exports_external.string()).optional(),deny:exports_external.array(exports_external.string()).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),permissionMode:exports_external.enum(["default","acceptEdits","bypassPermissions","plan","dontAsk","auto","remoteApproval"]).optional()}).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),otelPort:exports_external.number().optional(),otelLogPrompts:exports_external.boolean().optional(),otelWishSlug:exports_external.string().optional(),newWindow:exports_external.boolean().optional(),windowTarget:exports_external.string().optional()});CODEX_PROMPT_FILE_FLAGS=new Set(["--append-system-prompt-file","--system-prompt-file"])});var palette;var init_palette=__esm(()=>{palette={bg:"#0a1d2a",bgRaised:"#0f2638",bgHover:"#143049",bgOverlay:"rgba(10, 29, 42, 0.92)",text:"#c9cfd4",textDim:"#8a9499",textMuted:"#5e6e74",border:"#2a3f4f",borderActive:"#7fc8a9",accent:"#7fc8a9",accentDim:"#5a9d82",accentBright:"#9eddc1",success:"#7fc8a9",warning:"#d4a574",error:"#a83838",errorBright:"#c44a4a",info:"#5a8ca8",beige:"#d4c5a9",innieGrey:"#5e6e74",outieAmber:"#d4a574",scrollTrack:"#2a3f4f",scrollThumb:"#5e6e74"}});var tokens;var init_tokens=__esm(()=>{init_palette();tokens={accent:palette.accent,accentDim:palette.accentDim,accentBright:palette.accentBright,surface:palette.bg,surfaceRaised:palette.bgRaised,surfaceHover:palette.bgHover,surfaceOverlay:palette.bgOverlay,text:palette.text,textDim:palette.textDim,textMuted:palette.textMuted,border:palette.border,borderActive:palette.borderActive,danger:palette.error,dangerStrong:palette.errorBright,attention:palette.warning,info:palette.info,success:palette.success,severed:palette.innieGrey,outieWarm:palette.outieAmber,lumonBeige:palette.beige}});function hexToRgb(hex){let m=hex.trim().match(/^#?([0-9a-fA-F]{6})$/);if(!m)throw Error(`Invalid hex: ${hex}`);let n=Number.parseInt(m[1],16);return[n>>16&255,n>>8&255,n&255]}function rgbToHex([r,g,b]){let c=(v)=>Math.max(0,Math.min(255,Math.round(v))).toString(16).padStart(2,"0");return`#${c(r)}${c(g)}${c(b)}`}function rgbToHsl([r,g,b]){let rn=r/255,gn=g/255,bn=b/255,max=Math.max(rn,gn,bn),min=Math.min(rn,gn,bn),l=(max+min)/2;if(max===min)return[0,0,l];let d=max-min,s=l>0.5?d/(2-max-min):d/(max+min),h;switch(max){case rn:h=((gn-bn)/d+(gn<bn?6:0))*60;break;case gn:h=((bn-rn)/d+2)*60;break;default:h=((rn-gn)/d+4)*60}return[h,s,l]}function hslToRgb([h,s,l]){if(s===0){let v=l*255;return[v,v,v]}let q=l<0.5?l*(1+s):l+s-l*s,p=2*l-q,hk=(h%360+360)%360/360,f=(t)=>{let tt=t;if(tt<0)tt+=1;if(tt>1)tt-=1;if(tt<0.16666666666666666)return p+(q-p)*6*tt;if(tt<0.5)return q;if(tt<0.6666666666666666)return p+(q-p)*(0.6666666666666666-tt)*6;return p};return[f(hk+0.3333333333333333)*255,f(hk)*255,f(hk-0.3333333333333333)*255]}function rotateHue(hex,deg){let[h,s,l]=rgbToHsl(hexToRgb(hex));return rgbToHex(hslToRgb([h+deg,s,l]))}var init_genie_tokens=__esm(()=>{init_palette();init_tokens()});var exports_ensure_tmux={};__export(exports_ensure_tmux,{tmuxBin:()=>tmuxBin,ensureTmux:()=>ensureTmux});import{execSync}from"child_process";import{chmodSync,copyFileSync,existsSync as existsSync4,mkdirSync as mkdirSync2,rmSync,unlinkSync as unlinkSync2,writeFileSync as writeFileSync2}from"fs";import{arch,homedir as homedir3,platform,tmpdir}from"os";import{join as join5}from"path";function getPlatformAsset(){let os=platform(),cpu=arch(),key=`${os}-${cpu}`,asset={"linux-x64":`tmux-${TMUX_VERSION}-linux-x86_64.tar.gz`,"linux-arm64":`tmux-${TMUX_VERSION}-linux-arm64.tar.gz`,"darwin-arm64":`tmux-${TMUX_VERSION}-macos-arm64.tar.gz`,"darwin-x64":`tmux-${TMUX_VERSION}-macos-x86_64.tar.gz`}[key];if(!asset)throw Error(`Unsupported platform: ${key}
|
|
192
|
+
`):null}function writeCodexPromptFile(params,content){let{mkdirSync:mkdirSync2,writeFileSync:writeFileSync2}=__require("fs"),{join:join5}=__require("path");mkdirSync2(CODEX_PROMPT_DIR,{recursive:!0});let stem=sanitizeCodexPromptFileStem(params.executorId??Date.now().toString(36)),promptFile=join5(CODEX_PROMPT_DIR,`${stem}.txt`);return writeFileSync2(promptFile,content,"utf-8"),promptFile}function buildCodexCommand(params){preflightCheck("codex");let parts=["codex"],env={};if(params.executorId)env.GENIE_EXECUTOR_ID=params.executorId;if(params.agentId)env.GENIE_AGENT_ID=params.agentId;if(params.role)env.GENIE_AGENT_NAME=params.role;else if(params.name)env.GENIE_AGENT_NAME=params.name;if(params.team)env.GENIE_TEAM=params.team;let{forwarded:extraArgs,promptFiles:extraPromptFiles}=splitCodexExtraArgs(params.extraArgs);parts.push("--yolo"),parts.push("--no-alt-screen");let codexModel=sanitizeModelForProvider("codex",params.model);if(codexModel)parts.push("--model",escapeShellArg2(codexModel));for(let arg of extraArgs)parts.push(escapeShellArg2(arg));let mergedPrompt=buildCodexMergedPrompt(params,extraPromptFiles);if(mergedPrompt!==null){let promptFile=writeCodexPromptFile(params,mergedPrompt);parts.push("--"),parts.push(`"$(cat ${escapeShellArg2(promptFile)})"`)}else parts.push("--"),parts.push(escapeShellArg2(buildCodexAutoPrompt(params)));return{command:parts.join(" "),provider:"codex",env:Object.keys(env).length>0?env:void 0,meta:{role:params.role,skill:params.skill}}}function buildLaunchCommand(params){let validated=validateSpawnParams(params);switch(validated.provider){case"claude":return buildClaudeCommand(validated);case"codex":return buildCodexCommand(validated);case"claude-sdk":return{command:"claude-sdk-in-process",provider:"claude-sdk",meta:{role:validated.role,skill:validated.skill}};default:throw Error(`Unknown provider "${validated.provider}". Valid providers: claude, codex, claude-sdk`)}}var CLAUDE_TEAM_COLORS,spawnParamsSchema,CODEX_PROMPT_DIR="/tmp/genie-codex-prompts",CODEX_PROMPT_FILE_FLAGS;var init_provider_adapters=__esm(()=>{init_zod();init_inject();init_builtin_agents();init_claude_settings();init_provider_models();init_trace_context();CLAUDE_TEAM_COLORS=["red","blue","green","yellow","purple","orange","pink","cyan"],spawnParamsSchema=exports_external.object({provider:exports_external.enum(["claude","codex","claude-sdk","app-pty"]),team:exports_external.string().min(1,"Team name is required"),role:exports_external.string().optional(),agentTemplate:exports_external.string().optional(),skill:exports_external.string().optional(),agentId:exports_external.string().optional(),executorId:exports_external.string().uuid().optional(),extraArgs:exports_external.array(exports_external.string()).optional(),nativeTeam:exports_external.object({enabled:exports_external.boolean(),parentSessionId:exports_external.string().optional(),color:exports_external.string().optional(),agentType:exports_external.string().optional(),planModeRequired:exports_external.boolean().optional(),permissionMode:exports_external.string().optional(),agentName:exports_external.string().optional()}).optional(),sessionId:exports_external.string().uuid().optional(),resume:exports_external.string().optional(),systemPromptFile:exports_external.string().optional(),systemPrompt:exports_external.string().optional(),promptMode:exports_external.enum(["system","append"]).optional(),model:exports_external.string().optional(),initialPrompt:exports_external.string().optional(),name:exports_external.string().optional(),permissions:exports_external.object({allow:exports_external.array(exports_external.string()).optional(),deny:exports_external.array(exports_external.string()).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),permissionMode:exports_external.enum(["default","acceptEdits","bypassPermissions","plan","dontAsk","auto","remoteApproval"]).optional()}).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),otelPort:exports_external.number().optional(),otelLogPrompts:exports_external.boolean().optional(),otelWishSlug:exports_external.string().optional(),newWindow:exports_external.boolean().optional(),windowTarget:exports_external.string().optional()});CODEX_PROMPT_FILE_FLAGS=new Set(["--append-system-prompt-file","--system-prompt-file"])});var palette;var init_palette=__esm(()=>{palette={bg:"#0a1d2a",bgRaised:"#0f2638",bgHover:"#143049",bgOverlay:"rgba(10, 29, 42, 0.92)",text:"#c9cfd4",textDim:"#8a9499",textMuted:"#5e6e74",border:"#2a3f4f",borderActive:"#7fc8a9",accent:"#7fc8a9",accentDim:"#5a9d82",accentBright:"#9eddc1",success:"#7fc8a9",warning:"#d4a574",error:"#a83838",errorBright:"#c44a4a",info:"#5a8ca8",beige:"#d4c5a9",innieGrey:"#5e6e74",outieAmber:"#d4a574",scrollTrack:"#2a3f4f",scrollThumb:"#5e6e74"}});var tokens;var init_tokens=__esm(()=>{init_palette();tokens={accent:palette.accent,accentDim:palette.accentDim,accentBright:palette.accentBright,surface:palette.bg,surfaceRaised:palette.bgRaised,surfaceHover:palette.bgHover,surfaceOverlay:palette.bgOverlay,text:palette.text,textDim:palette.textDim,textMuted:palette.textMuted,border:palette.border,borderActive:palette.borderActive,danger:palette.error,dangerStrong:palette.errorBright,attention:palette.warning,info:palette.info,success:palette.success,severed:palette.innieGrey,outieWarm:palette.outieAmber,lumonBeige:palette.beige}});function hexToRgb(hex){let m=hex.trim().match(/^#?([0-9a-fA-F]{6})$/);if(!m)throw Error(`Invalid hex: ${hex}`);let n=Number.parseInt(m[1],16);return[n>>16&255,n>>8&255,n&255]}function rgbToHex([r,g,b]){let c=(v)=>Math.max(0,Math.min(255,Math.round(v))).toString(16).padStart(2,"0");return`#${c(r)}${c(g)}${c(b)}`}function rgbToHsl([r,g,b]){let rn=r/255,gn=g/255,bn=b/255,max=Math.max(rn,gn,bn),min=Math.min(rn,gn,bn),l=(max+min)/2;if(max===min)return[0,0,l];let d=max-min,s=l>0.5?d/(2-max-min):d/(max+min),h;switch(max){case rn:h=((gn-bn)/d+(gn<bn?6:0))*60;break;case gn:h=((bn-rn)/d+2)*60;break;default:h=((rn-gn)/d+4)*60}return[h,s,l]}function hslToRgb([h,s,l]){if(s===0){let v=l*255;return[v,v,v]}let q=l<0.5?l*(1+s):l+s-l*s,p=2*l-q,hk=(h%360+360)%360/360,f=(t)=>{let tt=t;if(tt<0)tt+=1;if(tt>1)tt-=1;if(tt<0.16666666666666666)return p+(q-p)*6*tt;if(tt<0.5)return q;if(tt<0.6666666666666666)return p+(q-p)*(0.6666666666666666-tt)*6;return p};return[f(hk+0.3333333333333333)*255,f(hk)*255,f(hk-0.3333333333333333)*255]}function rotateHue(hex,deg){let[h,s,l]=rgbToHsl(hexToRgb(hex));return rgbToHex(hslToRgb([h+deg,s,l]))}var init_genie_tokens=__esm(()=>{init_palette();init_tokens()});var exports_ensure_tmux={};__export(exports_ensure_tmux,{tmuxBin:()=>tmuxBin,ensureTmux:()=>ensureTmux});import{execSync}from"child_process";import{chmodSync,copyFileSync,existsSync as existsSync4,mkdirSync as mkdirSync2,rmSync,unlinkSync as unlinkSync2,writeFileSync as writeFileSync2}from"fs";import{arch,homedir as homedir3,platform,tmpdir}from"os";import{join as join5}from"path";function getPlatformAsset(){let os=platform(),cpu=arch(),key=`${os}-${cpu}`,asset={"linux-x64":`tmux-${TMUX_VERSION}-linux-x86_64.tar.gz`,"linux-arm64":`tmux-${TMUX_VERSION}-linux-arm64.tar.gz`,"darwin-arm64":`tmux-${TMUX_VERSION}-macos-arm64.tar.gz`,"darwin-x64":`tmux-${TMUX_VERSION}-macos-x86_64.tar.gz`}[key];if(!asset)throw Error(`Unsupported platform: ${key}
|
|
193
193
|
tmux auto-download supports: linux-x64, linux-arm64, macos-arm64, macos-x64.
|
|
194
194
|
Install tmux manually: https://github.com/tmux/tmux/wiki/Installing`);return asset}function genieHome(){return process.env.GENIE_HOME??join5(homedir3(),".genie")}function genieBinDir(){return join5(genieHome(),"bin")}function cachedTmuxPath(){return join5(genieBinDir(),"tmux")}function tmuxBin(){if(_resolved)return _resolved;try{let p=execSync("which tmux",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim();if(p)return _resolved=p,p}catch{}let cached=cachedTmuxPath();if(existsSync4(cached))return _resolved=cached,cached;return"tmux"}async function ensureTmux(){let bin=tmuxBin();if(bin!=="tmux")return bin;return downloadTmux()}async function downloadTmux(){let asset=getPlatformAsset(),url=process.env.GENIE_TMUX_URL??`https://github.com/tmux/tmux-builds/releases/download/v${TMUX_VERSION}/${asset}`,dest=cachedTmuxPath(),tempDir=join5(tmpdir(),`genie-tmux-download-${Date.now()}`);console.log(" tmux not found \u2014 downloading static binary..."),console.log(` ${url}`);try{let response=await fetch(url);if(!response.ok)throw Error(`HTTP ${response.status} ${response.statusText}`);let buffer=Buffer.from(await response.arrayBuffer()),sizeMB=(buffer.byteLength/1024/1024).toFixed(1);console.log(` Downloaded ${sizeMB} MB`),mkdirSync2(tempDir,{recursive:!0});let tarballPath=join5(tempDir,asset);writeFileSync2(tarballPath,buffer),execSync(`tar -xzf '${tarballPath}' -C '${tempDir}'`,{stdio:"ignore"});let extractedBin=join5(tempDir,"tmux");if(!existsSync4(extractedBin))throw Error("Tarball did not contain a tmux binary");mkdirSync2(genieBinDir(),{recursive:!0}),copyFileSync(extractedBin,dest),chmodSync(dest,493);let version=execSync(`'${dest}' -V`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim();return _resolved=dest,console.log(` ${version} installed to ${dest}`),dest}catch(err){try{if(existsSync4(dest))unlinkSync2(dest)}catch{}let msg=err instanceof Error?err.message:String(err);throw Error(`Failed to download tmux: ${msg}
|
|
195
195
|
Install manually:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@automagik/genie",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.260509.3",
|
|
4
4
|
"description": "Collaborative terminal toolkit for human + AI workflows. NOTE: the npm distribution is being soft-deprecated — the canonical install is `curl -fsSL https://get.automagik.dev/genie | bash` (cosign + SLSA verified). See https://automagik.dev/genie/security/distribution-sovereignty",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "genie",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.260509.3",
|
|
4
4
|
"description": "Human-AI partnership for Claude Code. Share a terminal, orchestrate workers, evolve together. Brainstorm ideas, turn them into wishes, execute with /work, validate with /review, and ship as one team.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Namastex Labs"
|
|
@@ -31,17 +31,26 @@ bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "~/.genie/scripts/o
|
|
|
31
31
|
bind -T root MouseDrag1Pane if-shell -F "#{mouse_any_flag}" "send-keys -M" "copy-mode -M"
|
|
32
32
|
bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "~/.genie/scripts/osc52-copy.sh"
|
|
33
33
|
|
|
34
|
-
# Forward
|
|
35
|
-
# OpenTUI sets DECSET 1000/1006, which flips
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
34
|
+
# Forward mouse events to the app when the pane under the cursor has mouse
|
|
35
|
+
# mode enabled. OpenTUI sets DECSET 1000/1006, which flips mouse_any_flag —
|
|
36
|
+
# but the flag is per-pane, and bare `if-shell -F "#{mouse_any_flag}"`
|
|
37
|
+
# evaluates against the *active* pane, not the one under the mouse. With
|
|
38
|
+
# two panes (OpenTUI Nav + agent terminal) that have different mouse-mode
|
|
39
|
+
# state, every cross-pane mouse event would branch wrong.
|
|
40
|
+
#
|
|
41
|
+
# Fix: pass `-t =` ({mouse} target) so the flag is evaluated against the
|
|
42
|
+
# pane the event landed on. For Down events we additionally `select-pane
|
|
43
|
+
# -t =` first so clicking a background pane focuses it (Up/Drag inherit
|
|
44
|
+
# the new active pane). Wheel events intentionally do not steal focus —
|
|
45
|
+
# scrolling a background pane should not pull keyboard focus — and the
|
|
46
|
+
# false-branch `copy-mode -e` also takes `-t =` so scrollback opens on
|
|
47
|
+
# the pane the wheel was on, not the active one.
|
|
48
|
+
bind -T root MouseDown1Pane select-pane -t = \; if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" ""
|
|
49
|
+
bind -T root MouseUp1Pane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" ""
|
|
50
|
+
bind -T root MouseDown2Pane select-pane -t = \; if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" ""
|
|
51
|
+
bind -T root MouseUp2Pane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" ""
|
|
52
|
+
bind -T root WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "copy-mode -e -t = ; send-keys -M"
|
|
53
|
+
bind -T root WheelDownPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "send-keys -M"
|
|
45
54
|
|
|
46
55
|
# NO status bars, NO pane-border shell probes — TUI renders its own UI
|
|
47
56
|
set -g status off
|