@automagik/genie 4.260503.7 → 4.260503.8

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
@@ -180,7 +180,7 @@ ${content}`;if(params.extraArgs){let fileIdx=params.extraArgs.indexOf("--append-
180
180
  ${readFileSync6(params.extraArgs[fileIdx+1],"utf-8")}`,params.extraArgs.splice(fileIdx,2)}writeFileSync6(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));if(params.name)parts.push("--name",escapeShellArg2(params.name))}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}if(params.permissions){let perms={};if(params.permissions.allow?.length)perms.allow=params.permissions.allow;if(params.permissions.deny?.length)perms.deny=params.permissions.deny;if(Object.keys(perms).length>0)settingsObj.permissions=perms}return 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).
181
181
  `)}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:readFileSync6}=__require("fs"),sections=[];if(params.systemPromptFile!==void 0)sections.push(readFileSync6(params.systemPromptFile,"utf-8"));if(params.systemPrompt!==void 0)sections.push(params.systemPrompt);for(let promptFile of extraPromptFiles)sections.push(readFileSync6(promptFile,"utf-8"));if(params.initialPrompt!==void 0)sections.push(params.initialPrompt);return sections.length>0?sections.join(`
182
182
 
183
- `):null}function writeCodexPromptFile(params,content){let{mkdirSync:mkdirSync5,writeFileSync:writeFileSync6}=__require("fs"),{join:join10}=__require("path");mkdirSync5(CODEX_PROMPT_DIR,{recursive:!0});let stem=sanitizeCodexPromptFileStem(params.executorId??Date.now().toString(36)),promptFile=join10(CODEX_PROMPT_DIR,`${stem}.txt`);return writeFileSync6(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_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()}).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 exports_audit={};__export(exports_audit,{recordAuditEvent:()=>recordAuditEvent,queryToolUsageDetail:()=>queryToolUsageDetail,queryToolUsage:()=>queryToolUsage,queryTimeline:()=>queryTimeline,querySummary:()=>querySummary,queryErrorPatterns:()=>queryErrorPatterns,queryCostBreakdown:()=>queryCostBreakdown,queryAuditEvents:()=>queryAuditEvents,getActor:()=>getActor,generateTraceId:()=>generateTraceId,followAuditEvents:()=>followAuditEvents});async function recordAuditEvent(entityType,entityId,eventType,actor,details){try{if(!await isAvailable())return;let sql=await getConnection();await sql`
183
+ `):null}function writeCodexPromptFile(params,content){let{mkdirSync:mkdirSync5,writeFileSync:writeFileSync6}=__require("fs"),{join:join10}=__require("path");mkdirSync5(CODEX_PROMPT_DIR,{recursive:!0});let stem=sanitizeCodexPromptFileStem(params.executorId??Date.now().toString(36)),promptFile=join10(CODEX_PROMPT_DIR,`${stem}.txt`);return writeFileSync6(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_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 exports_audit={};__export(exports_audit,{recordAuditEvent:()=>recordAuditEvent,queryToolUsageDetail:()=>queryToolUsageDetail,queryToolUsage:()=>queryToolUsage,queryTimeline:()=>queryTimeline,querySummary:()=>querySummary,queryErrorPatterns:()=>queryErrorPatterns,queryCostBreakdown:()=>queryCostBreakdown,queryAuditEvents:()=>queryAuditEvents,getActor:()=>getActor,generateTraceId:()=>generateTraceId,followAuditEvents:()=>followAuditEvents});async function recordAuditEvent(entityType,entityId,eventType,actor,details){try{if(!await isAvailable())return;let sql=await getConnection();await sql`
184
184
  INSERT INTO audit_events (entity_type, entity_id, event_type, actor, details)
185
185
  VALUES (${entityType}, ${entityId}, ${eventType}, ${actor??null}, ${sql.json(details??{})})
186
186
  `}catch{}}function parseSince(since){let match=since.match(/^(\d+)([smhd])$/);if(!match)return since;let amount=Number.parseInt(match[1],10),unit=match[2],ms={s:1000,m:60000,h:3600000,d:86400000}[unit]??3600000;return new Date(Date.now()-amount*ms).toISOString()}async function queryAuditEvents(options={}){let sql=await getConnection(),conditions=[],values=[],paramIdx=1;if(options.type)conditions.push(`(event_type = $${paramIdx} OR entity_type = $${paramIdx})`),paramIdx++,values.push(options.type);if(options.entity)conditions.push(`(entity_type = $${paramIdx} OR entity_id = $${paramIdx})`),paramIdx++,values.push(options.entity);if(options.since)conditions.push(`created_at >= $${paramIdx++}::timestamptz`),values.push(parseSince(options.since));if(options.errorsOnly)conditions.push("event_type LIKE '%error%' OR (details::text LIKE '%error%')");let where=conditions.length>0?`WHERE ${conditions.join(" AND ")}`:"",limit=options.limit??50;return await sql.unsafe(`SELECT id, entity_type, entity_id, event_type, actor, details, created_at
@@ -1284,7 +1284,7 @@ Run 'genie agent list' to list agents.`)}async function resolveTarget(target,opt
1284
1284
  `)}var STATE_ICONS;var init_brief=__esm(()=>{init_db();init_mailbox();init_runtime_events();init_team_manager();STATE_ICONS={working:"\u25CF",idle:"\u25CB",error:"\u2718"}});import{readFile as readFile5,rename as rename2,writeFile as writeFile5}from"fs/promises";function stripDerivedFields(config){let out={...config};for(let key of DERIVED_KEYS)delete out[key];return out}async function parseAgentYaml(path3){let raw;try{raw=await readFile5(path3,"utf-8")}catch(err){let message=err instanceof Error?err.message:String(err);throw Error(`Failed to read agent.yaml at ${path3}: ${message}`)}let parsed;try{parsed=load(raw)}catch(err){let message=err instanceof Error?err.message:String(err);throw Error(`Malformed YAML in ${path3}: ${message}`)}let input=parsed===null||parsed===void 0?{}:parsed;if(typeof input!=="object"||Array.isArray(input))throw Error(`agent.yaml at ${path3} must be a YAML mapping, got ${Array.isArray(input)?"array":typeof input}`);let result2=AgentConfigSchema.safeParse(input);if(!result2.success)throw Error(`Invalid agent.yaml at ${path3}: ${formatZodError(result2.error)}`);return result2.data}function formatZodError(error2){return error2.issues.map((issue)=>{let path3=issue.path.length>0?issue.path.join("."):"(root)";if(issue.code==="unrecognized_keys"){let keys=issue.keys.join(", ");return`unknown field(s) at ${path3}: ${keys}`}return`${path3}: ${issue.message}`}).join("; ")}async function writeAgentYaml(path3,config){let stripped=stripDerivedFields(config),yamlStr=dump(stripped,{lineWidth:-1,noRefs:!0,sortKeys:!1,quotingType:'"'});await acquireLock(path3);try{let tmpPath=`${path3}.tmp`;await writeFile5(tmpPath,yamlStr,"utf-8"),await rename2(tmpPath,path3)}finally{await releaseLock(path3)}}function extractFrontmatterFromAgentsMd(content){if(!content.startsWith(`---
1285
1285
  `))return{frontmatter:null,body:content};let after=content.slice(4),frontmatter,afterClose;if(after.startsWith("---"))frontmatter="",afterClose=after.slice(3);else{let closeIdx=after.indexOf(`
1286
1286
  ---`);if(closeIdx===-1)return{frontmatter:null,body:content};frontmatter=after.slice(0,closeIdx),afterClose=after.slice(closeIdx+4)}let body=afterClose.startsWith(`
1287
- `)?afterClose.slice(1):afterClose;return{frontmatter,body}}var SdkPermissionModeSchema,SdkEffortLevelSchema,SdkThinkingConfigSchema,SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema,SdkMcpServerConfigSchema,SdkSubagentConfigSchema,SdkCustomToolConfigSchema,SdkOutputFormatSchema,SdkPluginConfigSchema,SdkSandboxConfigSchema,SdkHookMatcherConfigSchema,SdkHookEventSchema,SdkBetaSchema,SdkSystemPromptSchema,SdkDirectoryConfigSchema,AgentConfigSchema,DERIVED_KEYS;var init_agent_yaml=__esm(()=>{init_js_yaml();init_zod();init_lockfile();SdkPermissionModeSchema=exports_external.enum(["default","acceptEdits","bypassPermissions","plan","dontAsk","auto","remoteApproval"]),SdkEffortLevelSchema=exports_external.union([exports_external.enum(["low","medium","high","max"]),exports_external.number()]),SdkThinkingConfigSchema=exports_external.union([exports_external.object({type:exports_external.literal("adaptive")}).strict(),exports_external.object({type:exports_external.literal("enabled"),budgetTokens:exports_external.number().optional()}).strict(),exports_external.object({type:exports_external.literal("disabled")}).strict()]),SdkMcpStdioServerConfigSchema=exports_external.object({type:exports_external.literal("stdio").optional(),command:exports_external.string(),args:exports_external.array(exports_external.string()).optional(),env:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpSSEServerConfigSchema=exports_external.object({type:exports_external.literal("sse"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpHttpServerConfigSchema=exports_external.object({type:exports_external.literal("http"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpServerConfigSchema=exports_external.union([SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema]),SdkSubagentConfigSchema=exports_external.object({description:exports_external.string(),prompt:exports_external.string(),tools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),model:exports_external.string().optional(),mcpServers:exports_external.array(exports_external.union([exports_external.string(),exports_external.record(SdkMcpStdioServerConfigSchema)])).optional(),skills:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),background:exports_external.boolean().optional(),memory:exports_external.enum(["user","project","local"]).optional(),effort:SdkEffortLevelSchema.optional(),permissionMode:SdkPermissionModeSchema.optional()}).strict(),SdkCustomToolConfigSchema=exports_external.object({name:exports_external.string(),description:exports_external.string(),inputSchema:exports_external.record(exports_external.unknown()),handler:exports_external.string().optional()}).strict(),SdkOutputFormatSchema=exports_external.object({type:exports_external.literal("json_schema"),schema:exports_external.record(exports_external.unknown())}).strict(),SdkPluginConfigSchema=exports_external.object({type:exports_external.literal("local"),path:exports_external.string()}).strict(),SdkSandboxConfigSchema=exports_external.object({enabled:exports_external.boolean().optional(),autoAllowBashIfSandboxed:exports_external.boolean().optional(),failIfUnavailable:exports_external.boolean().optional(),network:exports_external.object({allowLocalBinding:exports_external.boolean().optional(),allowUnixSockets:exports_external.array(exports_external.string()).optional()}).strict().optional()}).strict(),SdkHookMatcherConfigSchema=exports_external.object({toolName:exports_external.string().optional(),agentName:exports_external.string().optional()}).strict(),SdkHookEventSchema=exports_external.enum(["PreToolUse","PostToolUse","PostToolUseFailure","Notification","UserPromptSubmit","SessionStart","SessionEnd","Stop","StopFailure","SubagentStart","SubagentStop","PreCompact","PostCompact","PermissionRequest","PermissionDenied","Setup","TeammateIdle","TaskCreated","TaskCompleted","Elicitation","ElicitationResult","ConfigChange","WorktreeCreate","WorktreeRemove","InstructionsLoaded","CwdChanged","FileChanged"]),SdkBetaSchema=exports_external.enum(["context-1m-2025-08-07"]),SdkSystemPromptSchema=exports_external.union([exports_external.string(),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code"),append:exports_external.string().optional()}).strict()]),SdkDirectoryConfigSchema=exports_external.object({permissionMode:SdkPermissionModeSchema.optional(),tools:exports_external.union([exports_external.array(exports_external.string()),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code")}).strict()]).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),maxBudgetUsd:exports_external.number().optional(),effort:SdkEffortLevelSchema.optional(),thinking:SdkThinkingConfigSchema.optional(),agent:exports_external.string().optional(),agents:exports_external.record(SdkSubagentConfigSchema).optional(),mcpServers:exports_external.record(SdkMcpServerConfigSchema).optional(),plugins:exports_external.array(SdkPluginConfigSchema).optional(),customTools:exports_external.array(SdkCustomToolConfigSchema).optional(),persistSession:exports_external.boolean().optional(),enableFileCheckpointing:exports_external.boolean().optional(),outputFormat:SdkOutputFormatSchema.optional(),includePartialMessages:exports_external.boolean().optional(),includeHookEvents:exports_external.boolean().optional(),promptSuggestions:exports_external.boolean().optional(),agentProgressSummaries:exports_external.boolean().optional(),systemPrompt:SdkSystemPromptSchema.optional(),sandbox:SdkSandboxConfigSchema.optional(),betas:exports_external.array(SdkBetaSchema).optional(),settingSources:exports_external.array(exports_external.enum(["user","project","local"])).optional(),settings:exports_external.union([exports_external.string(),exports_external.record(exports_external.unknown())]).optional(),hooks:exports_external.record(SdkHookEventSchema,exports_external.array(SdkHookMatcherConfigSchema)).optional()}).strict(),AgentConfigSchema=exports_external.object({name:exports_external.string().optional(),dir:exports_external.string().optional(),repo:exports_external.string().optional(),team:exports_external.string().optional(),promptMode:exports_external.enum(["system","append"]).optional(),model:exports_external.string().optional(),roles:exports_external.array(exports_external.string()).optional(),omniAgentId:exports_external.string().optional(),registeredAt:exports_external.string().optional(),description:exports_external.string().optional(),color:exports_external.string().optional(),provider:exports_external.string().optional(),permissions:exports_external.object({preset:exports_external.string().optional(),allow:exports_external.array(exports_external.string()).optional(),deny:exports_external.array(exports_external.string()).optional(),bashAllowPatterns:exports_external.array(exports_external.string()).optional()}).strict().optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),omniScopes:exports_external.array(exports_external.string()).optional(),hooks:exports_external.record(exports_external.unknown()).optional(),sdk:SdkDirectoryConfigSchema.optional(),bridgeTmuxSession:exports_external.string().optional()}).strict(),DERIVED_KEYS=["name","dir","registeredAt"]});import{existsSync as existsSync36}from"fs";import{copyFile as copyFile2,readFile as readFile6,writeFile as writeFile6}from"fs/promises";import{join as join42}from"path";async function migrateAgentToYaml(agentDir,dbRow){let yamlPath=join42(agentDir,"agent.yaml"),agentsMdPath=join42(agentDir,"AGENTS.md"),bakPath=`${agentsMdPath}.bak`;if(existsSync36(yamlPath))return{migrated:!1,reason:"already-migrated",yamlPath};let agentsMdRaw=await readFile6(agentsMdPath,"utf-8"),{frontmatter,body}=extractFrontmatterFromAgentsMd(agentsMdRaw);if(frontmatter===null)return{migrated:!1,reason:"no-frontmatter",yamlPath};let fmParsed=parseFrontmatter2(frontmatter,agentsMdPath),fmClean=pickYamlFields(fmParsed),merged={...dbRow?pickYamlFields(dbRow):{},...fmClean},config=AgentConfigSchema.parse(merged);return await writeAgentYaml(yamlPath,config),await copyFile2(agentsMdPath,bakPath),await writeFile6(agentsMdPath,body),{migrated:!0,yamlPath,bakPath}}function parseFrontmatter2(frontmatter,sourcePath){let raw;try{raw=load(frontmatter)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Malformed frontmatter in ${sourcePath}: ${msg}`)}if(raw===null||typeof raw!=="object"||Array.isArray(raw))throw Error(`Malformed frontmatter in ${sourcePath}: expected a YAML mapping at the top level`);return raw}function pickYamlFields(source){let out={};for(let[k,v]of Object.entries(source))if(YAML_ALLOWED_KEYS.has(k)&&v!==null&&v!==void 0)out[k]=v;return out}var YAML_ALLOWED_KEYS;var init_agent_migrate=__esm(()=>{init_js_yaml();init_agent_yaml();YAML_ALLOWED_KEYS=(()=>{let shape=AgentConfigSchema._def.shape(),keys=new Set(Object.keys(shape));return keys.delete("name"),keys.delete("dir"),keys.delete("registeredAt"),keys})()});var exports_agent_sync={};__export(exports_agent_sync,{watchAgentDirectory:()=>watchAgentDirectory,syncSingleAgentByName:()=>syncSingleAgentByName,syncAgentDirectory:()=>syncAgentDirectory,printSyncResult:()=>printSyncResult,healAgentFile:()=>healAgentFile});import{execSync as execSync8}from"child_process";import{existsSync as existsSync37,watch as fsWatch,readFileSync as readFileSync25,readdirSync as readdirSync10,realpathSync as realpathSync4,writeFileSync as writeFileSync16}from"fs";import{join as join43}from"path";function getGitRemoteUrl(dir){try{return execSync8(`git -C "${dir}" config --get remote.origin.url`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}}function extractOrgRepo(remoteUrl){let sshMatch=remoteUrl.match(/[^/:]+\/[^/]+?(?:\.git)?$/);if(sshMatch)return sshMatch[0].replace(/\.git$/,"");return null}function getRepoPathForAgent(agentDir){let reposLink=join43(agentDir,"repos");try{if(!existsSync37(reposLink))return null;let target=realpathSync4(reposLink);if(!existsSync37(target))return null;return target}catch{return null}}function discoverAgents(workspaceRoot){let agentsDir=join43(workspaceRoot,"agents");if(!existsSync37(agentsDir))return[];let agents=[];try{let entries=readdirSync10(agentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let agentDir=join43(agentsDir,entry2.name);if(!existsSync37(join43(agentDir,"AGENTS.md")))continue;agents.push({name:entry2.name,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}),discoverSubAgents(agentDir,entry2.name,agents)}}catch{}return agents}function discoverSubAgents(parentDir,parentName,agents){let subAgentsDir=join43(parentDir,".genie","agents");if(!existsSync37(subAgentsDir))return;try{let entries=readdirSync10(subAgentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let subDir=join43(subAgentsDir,entry2.name);if(!existsSync37(join43(subDir,"AGENTS.md")))continue;agents.push({name:`${parentName}/${entry2.name}`,dir:subDir,repoUrl:getGitRemoteUrl(parentDir),productRepo:getRepoPathForAgent(parentDir)})}}catch{}}function discoverSingleAgent(workspaceRoot,agentName){let agentDir=join43(workspaceRoot,"agents",agentName);if(!existsSync37(join43(agentDir,"AGENTS.md")))return null;return{name:agentName,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}}function healAgentFile(agentsMdPath,agentName,healResult){let content=readFileSync25(agentsMdPath,"utf-8"),fmMatch=content.match(/^(---\n)([\s\S]*?)(\n---)/);if(!fmMatch)return!1;let prefix=fmMatch[1],fmBlock=fmMatch[2],suffix=fmMatch[3],rest=content.slice(fmMatch[0].length),modified=!1,healedBlock=fmBlock;for(let{field,value}of INVALID_LITERALS)if(new RegExp(`^${field}:\\s*${value}\\s*$`,"m").test(healedBlock))healedBlock=healedBlock.replace(new RegExp(`${field}:\\s*${value}\\s*\\n?`,"m"),""),healResult.healed.push({agent:agentName,field,value}),modified=!0;if(!modified)return!1;let newContent=prefix+healedBlock+suffix+rest,tmpPath=`${agentsMdPath}.tmp.${Date.now()}`;writeFileSync16(tmpPath,newContent,"utf-8");let{renameSync:renameSync8}=__require("fs");return renameSync8(tmpPath,agentsMdPath),!0}function buildResolveContext(workspaceRoot,agentName){let workspaceDefaults;try{workspaceDefaults=getWorkspaceConfig(workspaceRoot).agents?.defaults}catch{}let parent;if(agentName.includes("/")){let parentName=agentName.split("/")[0],parentAgentsMd=join43(workspaceRoot,"agents",parentName,"AGENTS.md");if(existsSync37(parentAgentsMd)){let parentContent=readFileSync25(parentAgentsMd,"utf-8"),parentFm=parseFrontmatter(parentContent);parent={name:parentName,fields:parentFm}}}return{workspaceDefaults,parent}}function computeResolvedMetadata(fm,ctx){let declared={},resolved={};for(let field of Object.keys(BUILTIN_DEFAULTS)){let fmValue=fm[field];if(fmValue!==void 0&&fmValue!==null&&fmValue!==""&&fmValue!=="inherit")declared[field]=fmValue;let result2=resolveFieldWithSource(fm,field,ctx);resolved[field]={value:result2.value,source:result2.source}}return{declared,resolved}}async function syncAgentDirectory(workspaceRoot){let result2={registered:[],updated:[],migrated:[],archived:[],reactivated:[],healed:[],errors:[]},agents=discoverAgents(workspaceRoot),discoveredNames=new Set(agents.map((a)=>a.name)),healResult={healed:[]};for(let agent of agents){let agentsMdPath=join43(agent.dir,"AGENTS.md");try{healAgentFile(agentsMdPath,agent.name,healResult)}catch{}}result2.healed=healResult.healed;for(let h of healResult.healed)console.log(`[sync] healed ${h.agent}/AGENTS.md: removed invalid '${h.field}: ${h.value}' line`);for(let agent of agents)try{await syncSingleAgent(agent,result2,workspaceRoot)}catch(err){result2.errors.push({name:agent.name,error:err instanceof Error?err.message:String(err)})}return await removeMissingAgents(discoveredNames,result2),result2}function printSyncResult(result2){if(result2.healed.length>0)console.log(` Healed: ${result2.healed.length} invalid literal(s) removed`);if(result2.migrated.length>0)console.log(` Migrated: ${result2.migrated.join(", ")} (AGENTS.md frontmatter \u2192 agent.yaml)`);if(result2.registered.length>0)console.log(` Registered: ${result2.registered.join(", ")}`);if(result2.updated.length>0)console.log(` Updated: ${result2.updated.join(", ")}`);if(result2.reactivated.length>0)console.log(` Reactivated: ${result2.reactivated.join(", ")}`);if(result2.archived.length>0)console.log(` Removed: ${result2.archived.join(", ")}`);for(let err of result2.errors)console.error(` Error (${err.name}): ${err.error}`);let total=result2.registered.length+result2.updated.length+result2.reactivated.length;console.log(`
1287
+ `)?afterClose.slice(1):afterClose;return{frontmatter,body}}var SdkPermissionModeSchema,SdkEffortLevelSchema,SdkThinkingConfigSchema,SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema,SdkMcpServerConfigSchema,SdkSubagentConfigSchema,SdkCustomToolConfigSchema,SdkOutputFormatSchema,SdkPluginConfigSchema,SdkSandboxConfigSchema,SdkHookMatcherConfigSchema,SdkHookEventSchema,SdkBetaSchema,SdkSystemPromptSchema,SdkDirectoryConfigSchema,AgentConfigSchema,DERIVED_KEYS;var init_agent_yaml=__esm(()=>{init_js_yaml();init_zod();init_lockfile();SdkPermissionModeSchema=exports_external.enum(["default","acceptEdits","bypassPermissions","plan","dontAsk","auto","remoteApproval"]),SdkEffortLevelSchema=exports_external.union([exports_external.enum(["low","medium","high","max"]),exports_external.number()]),SdkThinkingConfigSchema=exports_external.union([exports_external.object({type:exports_external.literal("adaptive")}).strict(),exports_external.object({type:exports_external.literal("enabled"),budgetTokens:exports_external.number().optional()}).strict(),exports_external.object({type:exports_external.literal("disabled")}).strict()]),SdkMcpStdioServerConfigSchema=exports_external.object({type:exports_external.literal("stdio").optional(),command:exports_external.string(),args:exports_external.array(exports_external.string()).optional(),env:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpSSEServerConfigSchema=exports_external.object({type:exports_external.literal("sse"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpHttpServerConfigSchema=exports_external.object({type:exports_external.literal("http"),url:exports_external.string(),headers:exports_external.record(exports_external.string()).optional()}).strict(),SdkMcpServerConfigSchema=exports_external.union([SdkMcpStdioServerConfigSchema,SdkMcpSSEServerConfigSchema,SdkMcpHttpServerConfigSchema]),SdkSubagentConfigSchema=exports_external.object({description:exports_external.string(),prompt:exports_external.string(),tools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),model:exports_external.string().optional(),mcpServers:exports_external.array(exports_external.union([exports_external.string(),exports_external.record(SdkMcpStdioServerConfigSchema)])).optional(),skills:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),background:exports_external.boolean().optional(),memory:exports_external.enum(["user","project","local"]).optional(),effort:SdkEffortLevelSchema.optional(),permissionMode:SdkPermissionModeSchema.optional()}).strict(),SdkCustomToolConfigSchema=exports_external.object({name:exports_external.string(),description:exports_external.string(),inputSchema:exports_external.record(exports_external.unknown()),handler:exports_external.string().optional()}).strict(),SdkOutputFormatSchema=exports_external.object({type:exports_external.literal("json_schema"),schema:exports_external.record(exports_external.unknown())}).strict(),SdkPluginConfigSchema=exports_external.object({type:exports_external.literal("local"),path:exports_external.string()}).strict(),SdkSandboxConfigSchema=exports_external.object({enabled:exports_external.boolean().optional(),autoAllowBashIfSandboxed:exports_external.boolean().optional(),failIfUnavailable:exports_external.boolean().optional(),network:exports_external.object({allowLocalBinding:exports_external.boolean().optional(),allowUnixSockets:exports_external.array(exports_external.string()).optional()}).strict().optional()}).strict(),SdkHookMatcherConfigSchema=exports_external.object({toolName:exports_external.string().optional(),agentName:exports_external.string().optional()}).strict(),SdkHookEventSchema=exports_external.enum(["PreToolUse","PostToolUse","PostToolUseFailure","Notification","UserPromptSubmit","SessionStart","SessionEnd","Stop","StopFailure","SubagentStart","SubagentStop","PreCompact","PostCompact","PermissionRequest","PermissionDenied","Setup","TeammateIdle","TaskCreated","TaskCompleted","Elicitation","ElicitationResult","ConfigChange","WorktreeCreate","WorktreeRemove","InstructionsLoaded","CwdChanged","FileChanged"]),SdkBetaSchema=exports_external.enum(["context-1m-2025-08-07"]),SdkSystemPromptSchema=exports_external.union([exports_external.string(),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code"),append:exports_external.string().optional()}).strict()]),SdkDirectoryConfigSchema=exports_external.object({permissionMode:SdkPermissionModeSchema.optional(),tools:exports_external.union([exports_external.array(exports_external.string()),exports_external.object({type:exports_external.literal("preset"),preset:exports_external.literal("claude_code")}).strict()]).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),maxTurns:exports_external.number().optional(),maxBudgetUsd:exports_external.number().optional(),effort:SdkEffortLevelSchema.optional(),thinking:SdkThinkingConfigSchema.optional(),agent:exports_external.string().optional(),agents:exports_external.record(SdkSubagentConfigSchema).optional(),mcpServers:exports_external.record(SdkMcpServerConfigSchema).optional(),plugins:exports_external.array(SdkPluginConfigSchema).optional(),customTools:exports_external.array(SdkCustomToolConfigSchema).optional(),persistSession:exports_external.boolean().optional(),enableFileCheckpointing:exports_external.boolean().optional(),outputFormat:SdkOutputFormatSchema.optional(),includePartialMessages:exports_external.boolean().optional(),includeHookEvents:exports_external.boolean().optional(),promptSuggestions:exports_external.boolean().optional(),agentProgressSummaries:exports_external.boolean().optional(),systemPrompt:SdkSystemPromptSchema.optional(),sandbox:SdkSandboxConfigSchema.optional(),betas:exports_external.array(SdkBetaSchema).optional(),settingSources:exports_external.array(exports_external.enum(["user","project","local"])).optional(),settings:exports_external.union([exports_external.string(),exports_external.record(exports_external.unknown())]).optional(),hooks:exports_external.record(SdkHookEventSchema,exports_external.array(SdkHookMatcherConfigSchema)).optional()}).strict(),AgentConfigSchema=exports_external.object({name:exports_external.string().optional(),dir:exports_external.string().optional(),repo:exports_external.string().optional(),team:exports_external.string().optional(),promptMode:exports_external.enum(["system","append"]).optional(),model:exports_external.string().optional(),roles:exports_external.array(exports_external.string()).optional(),omniAgentId:exports_external.string().optional(),registeredAt:exports_external.string().optional(),description:exports_external.string().optional(),color:exports_external.string().optional(),provider:exports_external.string().optional(),permissions:exports_external.object({preset:exports_external.string().optional(),allow:exports_external.array(exports_external.string()).optional(),deny:exports_external.array(exports_external.string()).optional(),bashAllowPatterns:exports_external.array(exports_external.string()).optional(),allowedTools:exports_external.array(exports_external.string()).optional(),permissionMode:SdkPermissionModeSchema.optional()}).strict().optional(),disallowedTools:exports_external.array(exports_external.string()).optional(),omniScopes:exports_external.array(exports_external.string()).optional(),hooks:exports_external.record(exports_external.unknown()).optional(),sdk:SdkDirectoryConfigSchema.optional(),bridgeTmuxSession:exports_external.string().optional()}).strict(),DERIVED_KEYS=["name","dir","registeredAt"]});import{existsSync as existsSync36}from"fs";import{copyFile as copyFile2,readFile as readFile6,writeFile as writeFile6}from"fs/promises";import{join as join42}from"path";async function migrateAgentToYaml(agentDir,dbRow){let yamlPath=join42(agentDir,"agent.yaml"),agentsMdPath=join42(agentDir,"AGENTS.md"),bakPath=`${agentsMdPath}.bak`;if(existsSync36(yamlPath))return{migrated:!1,reason:"already-migrated",yamlPath};let agentsMdRaw=await readFile6(agentsMdPath,"utf-8"),{frontmatter,body}=extractFrontmatterFromAgentsMd(agentsMdRaw);if(frontmatter===null)return{migrated:!1,reason:"no-frontmatter",yamlPath};let fmParsed=parseFrontmatter2(frontmatter,agentsMdPath),fmClean=pickYamlFields(fmParsed),merged={...dbRow?pickYamlFields(dbRow):{},...fmClean},config=AgentConfigSchema.parse(merged);return await writeAgentYaml(yamlPath,config),await copyFile2(agentsMdPath,bakPath),await writeFile6(agentsMdPath,body),{migrated:!0,yamlPath,bakPath}}function parseFrontmatter2(frontmatter,sourcePath){let raw;try{raw=load(frontmatter)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Malformed frontmatter in ${sourcePath}: ${msg}`)}if(raw===null||typeof raw!=="object"||Array.isArray(raw))throw Error(`Malformed frontmatter in ${sourcePath}: expected a YAML mapping at the top level`);return raw}function pickYamlFields(source){let out={};for(let[k,v]of Object.entries(source))if(YAML_ALLOWED_KEYS.has(k)&&v!==null&&v!==void 0)out[k]=v;return out}var YAML_ALLOWED_KEYS;var init_agent_migrate=__esm(()=>{init_js_yaml();init_agent_yaml();YAML_ALLOWED_KEYS=(()=>{let shape=AgentConfigSchema._def.shape(),keys=new Set(Object.keys(shape));return keys.delete("name"),keys.delete("dir"),keys.delete("registeredAt"),keys})()});var exports_agent_sync={};__export(exports_agent_sync,{watchAgentDirectory:()=>watchAgentDirectory,syncSingleAgentByName:()=>syncSingleAgentByName,syncAgentDirectory:()=>syncAgentDirectory,printSyncResult:()=>printSyncResult,healAgentFile:()=>healAgentFile});import{execSync as execSync8}from"child_process";import{existsSync as existsSync37,watch as fsWatch,readFileSync as readFileSync25,readdirSync as readdirSync10,realpathSync as realpathSync4,writeFileSync as writeFileSync16}from"fs";import{join as join43}from"path";function getGitRemoteUrl(dir){try{return execSync8(`git -C "${dir}" config --get remote.origin.url`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}}function extractOrgRepo(remoteUrl){let sshMatch=remoteUrl.match(/[^/:]+\/[^/]+?(?:\.git)?$/);if(sshMatch)return sshMatch[0].replace(/\.git$/,"");return null}function getRepoPathForAgent(agentDir){let reposLink=join43(agentDir,"repos");try{if(!existsSync37(reposLink))return null;let target=realpathSync4(reposLink);if(!existsSync37(target))return null;return target}catch{return null}}function discoverAgents(workspaceRoot){let agentsDir=join43(workspaceRoot,"agents");if(!existsSync37(agentsDir))return[];let agents=[];try{let entries=readdirSync10(agentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let agentDir=join43(agentsDir,entry2.name);if(!existsSync37(join43(agentDir,"AGENTS.md")))continue;agents.push({name:entry2.name,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}),discoverSubAgents(agentDir,entry2.name,agents)}}catch{}return agents}function discoverSubAgents(parentDir,parentName,agents){let subAgentsDir=join43(parentDir,".genie","agents");if(!existsSync37(subAgentsDir))return;try{let entries=readdirSync10(subAgentsDir,{withFileTypes:!0});for(let entry2 of entries){if(!entry2.isDirectory())continue;let subDir=join43(subAgentsDir,entry2.name);if(!existsSync37(join43(subDir,"AGENTS.md")))continue;agents.push({name:`${parentName}/${entry2.name}`,dir:subDir,repoUrl:getGitRemoteUrl(parentDir),productRepo:getRepoPathForAgent(parentDir)})}}catch{}}function discoverSingleAgent(workspaceRoot,agentName){let agentDir=join43(workspaceRoot,"agents",agentName);if(!existsSync37(join43(agentDir,"AGENTS.md")))return null;return{name:agentName,dir:agentDir,repoUrl:getGitRemoteUrl(agentDir),productRepo:getRepoPathForAgent(agentDir)}}function healAgentFile(agentsMdPath,agentName,healResult){let content=readFileSync25(agentsMdPath,"utf-8"),fmMatch=content.match(/^(---\n)([\s\S]*?)(\n---)/);if(!fmMatch)return!1;let prefix=fmMatch[1],fmBlock=fmMatch[2],suffix=fmMatch[3],rest=content.slice(fmMatch[0].length),modified=!1,healedBlock=fmBlock;for(let{field,value}of INVALID_LITERALS)if(new RegExp(`^${field}:\\s*${value}\\s*$`,"m").test(healedBlock))healedBlock=healedBlock.replace(new RegExp(`${field}:\\s*${value}\\s*\\n?`,"m"),""),healResult.healed.push({agent:agentName,field,value}),modified=!0;if(!modified)return!1;let newContent=prefix+healedBlock+suffix+rest,tmpPath=`${agentsMdPath}.tmp.${Date.now()}`;writeFileSync16(tmpPath,newContent,"utf-8");let{renameSync:renameSync8}=__require("fs");return renameSync8(tmpPath,agentsMdPath),!0}function buildResolveContext(workspaceRoot,agentName){let workspaceDefaults;try{workspaceDefaults=getWorkspaceConfig(workspaceRoot).agents?.defaults}catch{}let parent;if(agentName.includes("/")){let parentName=agentName.split("/")[0],parentAgentsMd=join43(workspaceRoot,"agents",parentName,"AGENTS.md");if(existsSync37(parentAgentsMd)){let parentContent=readFileSync25(parentAgentsMd,"utf-8"),parentFm=parseFrontmatter(parentContent);parent={name:parentName,fields:parentFm}}}return{workspaceDefaults,parent}}function computeResolvedMetadata(fm,ctx){let declared={},resolved={};for(let field of Object.keys(BUILTIN_DEFAULTS)){let fmValue=fm[field];if(fmValue!==void 0&&fmValue!==null&&fmValue!==""&&fmValue!=="inherit")declared[field]=fmValue;let result2=resolveFieldWithSource(fm,field,ctx);resolved[field]={value:result2.value,source:result2.source}}return{declared,resolved}}async function syncAgentDirectory(workspaceRoot){let result2={registered:[],updated:[],migrated:[],archived:[],reactivated:[],healed:[],errors:[]},agents=discoverAgents(workspaceRoot),discoveredNames=new Set(agents.map((a)=>a.name)),healResult={healed:[]};for(let agent of agents){let agentsMdPath=join43(agent.dir,"AGENTS.md");try{healAgentFile(agentsMdPath,agent.name,healResult)}catch{}}result2.healed=healResult.healed;for(let h of healResult.healed)console.log(`[sync] healed ${h.agent}/AGENTS.md: removed invalid '${h.field}: ${h.value}' line`);for(let agent of agents)try{await syncSingleAgent(agent,result2,workspaceRoot)}catch(err){result2.errors.push({name:agent.name,error:err instanceof Error?err.message:String(err)})}return await removeMissingAgents(discoveredNames,result2),result2}function printSyncResult(result2){if(result2.healed.length>0)console.log(` Healed: ${result2.healed.length} invalid literal(s) removed`);if(result2.migrated.length>0)console.log(` Migrated: ${result2.migrated.join(", ")} (AGENTS.md frontmatter \u2192 agent.yaml)`);if(result2.registered.length>0)console.log(` Registered: ${result2.registered.join(", ")}`);if(result2.updated.length>0)console.log(` Updated: ${result2.updated.join(", ")}`);if(result2.reactivated.length>0)console.log(` Reactivated: ${result2.reactivated.join(", ")}`);if(result2.archived.length>0)console.log(` Removed: ${result2.archived.join(", ")}`);for(let err of result2.errors)console.error(` Error (${err.name}): ${err.error}`);let total=result2.registered.length+result2.updated.length+result2.reactivated.length;console.log(`
1288
1288
  Synced: ${total} agent(s), ${result2.archived.length} removed.`)}async function removeMissingAgents(discoveredNames,result2){try{let entries=await ls();for(let entry2 of entries){if(discoveredNames.has(entry2.name))continue;if(entry2.scope==="built-in")continue;if(!entry2.dir||!entry2.dir.includes("/agents/"))continue;let{removed}=await rm3(entry2.name);if(removed)result2.archived.push(entry2.name)}}catch{}}async function maybeMigrateFrontmatter(agent,result2){let yamlPath=join43(agent.dir,"agent.yaml"),agentsMdPath=join43(agent.dir,"AGENTS.md");if(existsSync37(yamlPath)||!existsSync37(agentsMdPath))return;let{frontmatter}=extractFrontmatterFromAgentsMd(readFileSync25(agentsMdPath,"utf-8"));if(frontmatter===null)return;let existingEntry=await resolve6(agent.name),dbRow=existingEntry&&!existingEntry.builtin?dbRowFromEntry(existingEntry.entry):void 0;if((await migrateAgentToYaml(agent.dir,dbRow)).migrated)result2.migrated.push(agent.name)}function buildDirectoryPayload(dir,repoPath,cf){return{dir,repo:repoPath,promptMode:cf.promptMode,model:cf.model,description:cf.description,color:cf.color,provider:cf.provider,roles:cf.roles,permissions:cf.permissions,disallowedTools:cf.disallowedTools,omniScopes:cf.omniScopes,hooks:cf.hooks,sdk:cf.sdk,bridgeTmuxSession:cf.bridgeTmuxSession}}async function syncSingleAgent(agent,result2,workspaceRoot){let repoPath=(agent.repoUrl?extractOrgRepo(agent.repoUrl):null)??agent.repoUrl??agent.dir,yamlPath=join43(agent.dir,"agent.yaml"),agentsMdPath=join43(agent.dir,"AGENTS.md");await maybeMigrateFrontmatter(agent,result2);let configFields=existsSync37(yamlPath)?await readYamlAsConfigFields(yamlPath):readFrontmatterAsConfigFields(agentsMdPath);if(workspaceRoot){let ctx=buildResolveContext(workspaceRoot,agent.name);computeResolvedMetadata(configFields.rawForResolution,ctx)}let resolved=await resolve6(agent.name),existing=resolved&&!resolved.builtin?resolved.entry:null,payload=buildDirectoryPayload(agent.dir,repoPath,configFields);if(!existing){await add({name:agent.name,...payload}),result2.registered.push(agent.name);return}await edit(agent.name,payload),result2.updated.push(agent.name)}async function readYamlAsConfigFields(yamlPath){let cfg=await parseAgentYaml(yamlPath);return{promptMode:cfg.promptMode??"append",model:cfg.model,description:cfg.description,color:cfg.color,provider:cfg.provider,roles:cfg.roles,permissions:cfg.permissions,disallowedTools:cfg.disallowedTools,omniScopes:cfg.omniScopes,hooks:cfg.hooks,sdk:cfg.sdk,bridgeTmuxSession:cfg.bridgeTmuxSession,rawForResolution:cfg}}function readFrontmatterAsConfigFields(agentsMdPath){let content=existsSync37(agentsMdPath)?readFileSync25(agentsMdPath,"utf-8"):"",fm=parseFrontmatter(content);return{promptMode:fm.promptMode??"append",model:fm.model,description:fm.description,color:fm.color,provider:fm.provider,roles:fm.roles,permissions:fm.permissions,disallowedTools:fm.disallowedTools,omniScopes:fm.omniScopes,hooks:fm.hooks,sdk:fm.sdk,bridgeTmuxSession:fm.bridgeTmuxSession,rawForResolution:fm}}function dbRowFromEntry(entry2){return{team:entry2.team,model:entry2.model,description:entry2.description,color:entry2.color,provider:entry2.provider,promptMode:entry2.promptMode,permissions:entry2.permissions,disallowedTools:entry2.disallowedTools,omniScopes:entry2.omniScopes,hooks:entry2.hooks,sdk:entry2.sdk,bridgeTmuxSession:entry2.bridgeTmuxSession}}async function syncSingleAgentByName(workspaceRoot,agentName){let agent=discoverSingleAgent(workspaceRoot,agentName);if(!agent)return"not-found";let result2={registered:[],updated:[],migrated:[],archived:[],reactivated:[],healed:[],errors:[]};if(await syncSingleAgent(agent,result2,workspaceRoot),result2.registered.length>0)return"registered";if(result2.migrated.length>0)return"migrated";if(result2.updated.length>0)return"updated";return"synced"}function watchAgentDirectory(workspaceRoot,options){let agentsDir=join43(workspaceRoot,"agents");if(!existsSync37(agentsDir))return null;let debounceTimer=null,pendingChanges=new Set,processChanges=async()=>{let names=[...pendingChanges];pendingChanges.clear();for(let name of names)try{let action=await processWatchedAgent(workspaceRoot,agentsDir,name);if(action)options?.onSync?.(name,action)}catch{}},watcher=fsWatch(agentsDir,{persistent:!1},(_event,filename)=>{if(!filename)return;let name=filename.split("/")[0];if(!name||name.startsWith("."))return;if(pendingChanges.add(name),debounceTimer)clearTimeout(debounceTimer);debounceTimer=setTimeout(processChanges,2000)});return{close:()=>{if(debounceTimer)clearTimeout(debounceTimer);watcher.close()}}}async function processWatchedAgent(workspaceRoot,agentsDir,name){let agentDir=join43(agentsDir,name);if(existsSync37(agentDir)&&existsSync37(join43(agentDir,"AGENTS.md"))){let action=await syncSingleAgentByName(workspaceRoot,name);return action!=="synced"&&action!=="not-found"?action:null}if(!existsSync37(agentDir)){let{removed}=await rm3(name);if(removed)return"removed"}return null}var INVALID_LITERALS;var init_agent_sync=__esm(()=>{init_agent_directory();init_agent_migrate();init_agent_yaml();init_defaults();init_frontmatter();init_workspace();INVALID_LITERALS=[{field:"model",value:"inherit"}]});var exports_term_format={};__export(exports_term_format,{truncate:()=>truncate2,stripAnsi:()=>stripAnsi2,padRight:()=>padRight,formatTimestamp:()=>formatTimestamp,formatTime:()=>formatTime,formatRelativeTimestamp:()=>formatRelativeTimestamp,formatDate:()=>formatDate,color:()=>color});function padRight(str2,len){return str2.length>=len?str2:str2+" ".repeat(len-str2.length)}function truncate2(str2,len){return str2.length<=len?str2:`${str2.slice(0,len-1)}\u2026`}function formatDate(iso){if(!iso)return"-";return new Date(iso).toLocaleDateString("en-US",{month:"short",day:"numeric"})}function formatRelativeTimestamp(ts3){let d=new Date(ts3),diffMs=Date.now()-d.getTime();if(diffMs<60000)return`${Math.floor(diffMs/1000)}s ago`;if(diffMs<3600000)return`${Math.floor(diffMs/60000)}m ago`;if(diffMs<86400000)return`${Math.floor(diffMs/3600000)}h ago`;return d.toISOString().replace("T"," ").slice(0,19)}function formatTimestamp(iso,opts){if(!iso)return opts?.fallback??"-";let d=iso instanceof Date?iso:new Date(iso),fmt={month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1};if(opts?.seconds)fmt.second="2-digit";return d.toLocaleString("en-US",fmt)}function formatTime(iso,opts){try{let date=new Date(iso),fmt={hour:"2-digit",minute:"2-digit",hour12:!1};if(opts?.seconds)fmt.second="2-digit";return date.toLocaleTimeString("en-US",fmt)}catch{return opts?.fallback??"??:??"}}function color(name,text){return isTTY?`${ANSI[name]}${text}${ANSI.reset}`:text}function stripAnsi2(str2){return str2.replace(ANSI_REGEX,"")}var ANSI,isTTY,ANSI_REGEX;var init_term_format=__esm(()=>{ANSI={reset:"\x1B[0m",dim:"\x1B[2m",bold:"\x1B[1m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",gray:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightCyan:"\x1B[96m"},isTTY=process.stdout.isTTY&&!process.env.NO_COLOR;ANSI_REGEX=/\x1b\[[0-9;]*m/g});var exports_task_service={};__export(exports_task_service,{updateTask:()=>updateTask,updateMessage:()=>updateMessage,untagTask:()=>untagTask,unblockTask:()=>unblockTask,unarchiveTask:()=>unarchiveTask,unarchiveProject:()=>unarchiveProject,tagTask:()=>tagTask,setRelease:()=>setRelease,setPreference:()=>setPreference,sendMessage:()=>sendMessage,resolveTaskId:()=>resolveTaskId,resolveChannels:()=>resolveChannels,removeMember:()=>removeMember,removeDependency:()=>removeDependency,removeActor:()=>removeActor,releaseTask:()=>releaseTask,moveTask:()=>moveTask,markDone:()=>markDone,listTypes:()=>listTypes,listTasksForActor:()=>listTasksForActor,listTasks:()=>listTasks,listTags:()=>listTags,listReleases:()=>listReleases,listProjectsFiltered:()=>listProjectsFiltered,listProjects:()=>listProjects,listConversations:()=>listConversations,linkTask:()=>linkTask,getType:()=>getType,getTaskTags:()=>getTaskTags,getTaskActors:()=>getTaskActors,getTask:()=>getTask,getStageLog:()=>getStageLog,getProjectByRepoPath:()=>getProjectByRepoPath,getProjectByName:()=>getProjectByName,getPreferences:()=>getPreferences,getMessages:()=>getMessages,getMessage:()=>getMessage,getMembers:()=>getMembers,getDependents:()=>getDependents,getConversation:()=>getConversation,getCheckoutOwner:()=>getCheckoutOwner,getBlockingDependencies:()=>getBlockingDependencies,getBlockers:()=>getBlockers,forceUnlockTask:()=>forceUnlockTask,findOrCreateConversation:()=>findOrCreateConversation,expireStaleCheckouts:()=>expireStaleCheckouts,ensureProject:()=>ensureProject,deletePreference:()=>deletePreference,createType:()=>createType,createTask:()=>createTask,createTag:()=>createTag,createProject:()=>createProject,commentOnTask:()=>commentOnTask,checkoutTask:()=>checkoutTask,blockTask:()=>blockTask,assignTask:()=>assignTask,archiveTask:()=>archiveTask,archiveProject:()=>archiveProject,archiveBoard:()=>archiveBoard,addMember:()=>addMember,addDependency:()=>addDependency});import{execSync as execSync9}from"child_process";function str2(v){return v!=null?String(v):null}function strOrDefault(v,def){return v!=null?String(v):def}function mapTask(row){return{id:row.id,seq:row.seq,parentId:str2(row.parent_id),repoPath:row.repo_path,projectId:str2(row.project_id),genieOsFolderId:str2(row.genie_os_folder_id),wishFile:str2(row.wish_file),groupName:str2(row.group_name),title:row.title,description:str2(row.description),acceptanceCriteria:str2(row.acceptance_criteria),typeId:row.type_id,stage:row.stage,status:row.status,priority:row.priority,startDate:str2(row.start_date),dueDate:str2(row.due_date),estimatedEffort:str2(row.estimated_effort),startedAt:str2(row.started_at),endedAt:str2(row.ended_at),blockedReason:str2(row.blocked_reason),releaseId:str2(row.release_id),checkoutRunId:str2(row.checkout_run_id),executionLockedAt:str2(row.execution_locked_at),checkoutTimeoutMs:row.checkout_timeout_ms??600000,sessionId:str2(row.session_id),paneId:str2(row.pane_id),traceId:str2(row.trace_id),boardId:str2(row.board_id),columnId:str2(row.column_id),externalId:str2(row.external_id),externalUrl:str2(row.external_url),archivedAt:str2(row.archived_at),metadata:row.metadata??{},createdAt:strOrDefault(row.created_at,""),updatedAt:strOrDefault(row.updated_at,"")}}function mapConversation(row){return{id:row.id,parentMessageId:row.parent_message_id!=null?Number(row.parent_message_id):null,name:row.name??null,type:row.type,linkedEntity:row.linked_entity??null,linkedEntityId:row.linked_entity_id??null,createdByType:row.created_by_type??null,createdById:row.created_by_id??null,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapMessage(row){return{id:Number(row.id),conversationId:row.conversation_id,replyToId:row.reply_to_id!=null?Number(row.reply_to_id):null,senderType:row.sender_type,senderId:row.sender_id,body:row.body,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapTaskActor(row){return{taskId:row.task_id,actorType:row.actor_type,actorId:row.actor_id,role:row.role,permissions:row.permissions??{},createdAt:String(row.created_at)}}function mapDependency(row){return{taskId:row.task_id,dependsOnId:row.depends_on_id,depType:row.dep_type,createdAt:String(row.created_at)}}function mapTag(row){return{id:row.id,name:row.name,color:row.color??palette.textDim,typeId:row.type_id??null,createdAt:String(row.created_at)}}function mapTaskType(row){return{id:row.id,name:row.name,description:row.description??null,icon:row.icon??null,stages:row.stages,isBuiltin:row.is_builtin,createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapNotificationPref(row){return{actorType:row.actor_type,actorId:row.actor_id,channel:row.channel,priorityThreshold:row.priority_threshold,isDefault:row.is_default,enabled:row.enabled,metadata:row.metadata??{},createdAt:String(row.created_at),updatedAt:String(row.updated_at)}}function mapStageLog(row){return{id:Number(row.id),taskId:row.task_id,fromStage:row.from_stage??null,toStage:row.to_stage,actorType:row.actor_type??null,actorId:row.actor_id??null,runId:row.run_id??null,gateType:row.gate_type??null,createdAt:String(row.created_at)}}function mapConversationMember(row){return{conversationId:row.conversation_id,actorType:row.actor_type,actorId:row.actor_id,role:row.role,joinedAt:String(row.joined_at)}}function mapProject(row){return{id:row.id,name:row.name,repoPath:str2(row.repo_path),description:str2(row.description),leaderAgent:str2(row.leader_agent),tmuxSession:str2(row.tmux_session),status:strOrDefault(row.status,"active"),archivedAt:str2(row.archived_at),createdAt:String(row.created_at)}}function getRepoPath(){try{return execSync9("git rev-parse --show-toplevel",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return process.cwd()}}async function resolveTaskId(idOrSeq,repoPath){let sql=await getConnection(),repo=repoPath??getRepoPath(),projectSeqMatch=idOrSeq.match(/^([^#]+)#(\d+)$/);if(projectSeqMatch&&!idOrSeq.startsWith("#")){let[,projectName,seqStr]=projectSeqMatch,seq2=Number.parseInt(seqStr,10);if(Number.isNaN(seq2))return null;let rows2=await sql`
1289
1289
  SELECT t.id FROM tasks t
1290
1290
  JOIN projects p ON t.project_id = p.id
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automagik/genie",
3
- "version": "4.260503.7",
3
+ "version": "4.260503.8",
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.260503.7",
3
+ "version": "4.260503.8",
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"
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: reviewer
3
3
  description: "Reviews criteria compliance AND code quality in one pass. Returns SHIP or FIX-FIRST with severity-tagged findings."
4
- model: haiku
4
+ model: opus
5
5
  color: yellow
6
6
  promptMode: append
7
7
  tools: ["Read", "Glob", "Grep", "Bash"]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "genie-plugin",
3
- "version": "4.260503.7",
3
+ "version": "4.260503.8",
4
4
  "private": true,
5
5
  "description": "Runtime dependencies for genie bundled CLIs",
6
6
  "type": "module",