@tech-leads-club/harness-toolkit 0.16.2 → 0.16.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/README.md +9 -5
- package/bin/tlc-exec.mjs +14 -2
- package/dist/compact-before.mjs +23 -23
- package/dist/doctor.mjs +35 -35
- package/dist/prompt-submit.mjs +25 -25
- package/dist/response-after.mjs +2 -2
- package/dist/run.mjs +22 -22
- package/dist/session-end.mjs +25 -25
- package/dist/session-start.mjs +2 -2
- package/dist/ship-gate.mjs +36 -36
- package/dist/stop.mjs +2 -2
- package/dist/subagent-start.mjs +2 -2
- package/dist/subagent-stop.mjs +24 -24
- package/dist/support.mjs +1 -1
- package/dist/tool-after.mjs +2 -2
- package/dist/tool-before.mjs +2 -2
- package/dist/tool-failure.mjs +27 -27
- package/docs/architecture.md +20 -10
- package/docs/providers/cursor.md +2 -1
- package/package.json +1 -1
- package/src/entrypoints/run.ts +1 -1
- package/src/providers/cursor/cursor.detect.ts +1 -4
package/dist/stop.mjs
CHANGED
|
@@ -152,13 +152,13 @@ ${$.body.trim()}`}function v8($,Z,J){let Q=[];for(let q of $){let X=$Q(q,Z,J);if
|
|
|
152
152
|
`:"",X=J.length>0?`${J}${q}
|
|
153
153
|
${H9}
|
|
154
154
|
`:`${H9}
|
|
155
|
-
`;return RV(Q3(Z),{recursive:!0}),xV(Z,X,"utf8"),Z}var wV={"session.start":"SessionStart","session.end":"SessionEnd","prompt.submit":"UserPromptSubmit","tool.before":"PreToolUse","tool.after":"PostToolUse","tool.failure":"PostToolUseFailure","shell.before":"PreToolUse","shell.after":"PostToolUse","mcp.before":"PreToolUse","mcp.after":"PostToolUse","read.before":"PreToolUse","edit.after":"PostToolUse","subagent.start":"SubagentStart","subagent.stop":"SubagentStop",stop:"Stop","compact.before":"PreCompact","response.after":"MessageDisplay","thought.after":"MessageDisplay"};function M9($,Z,J){let Q={hookEventName:Z,permissionDecision:$};if(J!==void 0)Q.permissionDecisionReason=J;return JSON.stringify({hookSpecificOutput:Q})}function W3($,Z){let J=wV[Z.event];switch($.kind){case"abstain":return{stdout:null,exitCode:0};case"allow":return{stdout:M9("allow",J,void 0),exitCode:0};case"deny":return{stdout:M9("deny",J,$.reason),exitCode:0};case"ask":return{stdout:M9("ask",J,$.reason),exitCode:0};case"context":return{stdout:JSON.stringify({hookSpecificOutput:{hookEventName:J,additionalContext:$.text}}),exitCode:0};case"continue":return{stdout:JSON.stringify({decision:"block",reason:$.text}),exitCode:0};case"rewriteInput":return{stdout:JSON.stringify({hookSpecificOutput:{hookEventName:J,updatedInput:$.input}}),exitCode:0};case"rewriteOutput":return{stdout:JSON.stringify({updatedToolOutput:$.output}),exitCode:0};default:throw Error(`unreachable decision kind: ${JSON.stringify($)}`)}}function Y3(){return{blockedPatterns:[],minEffort:null,untrustedTools:["WebFetch","WebSearch"]}}var z3={name:"claude",detect:o1,capabilities:s1,policyDefaults:Y3,toEvent:Z3,render:W3,wiring:U9,wiringTargets:a1,lessonsView:X3};function V3(){return{enforcesHooks:!0,askSupportedOn:["shell.before","mcp.before"],sessionEnv:!0,nativeLoopCounter:!0,dedicatedShellEvent:!0,toolInputRewrite:!0,toolOutputRewriteOn:["mcp.after"],contextAtToolBefore:!1,contextAtToolAfter:!0,contextAtStop:!1,sessionStartContextReliable:!1,toolOutputAtAfter:!0,usageInPayload:!1,effortSignal:!1,thoughtEvent:!0}}var fV=/^[a-z][a-zA-Z0-9]*$/;function G3($){if($===null||typeof $!=="object"||Array.isArray($))return!1;let
|
|
155
|
+
`;return RV(Q3(Z),{recursive:!0}),xV(Z,X,"utf8"),Z}var wV={"session.start":"SessionStart","session.end":"SessionEnd","prompt.submit":"UserPromptSubmit","tool.before":"PreToolUse","tool.after":"PostToolUse","tool.failure":"PostToolUseFailure","shell.before":"PreToolUse","shell.after":"PostToolUse","mcp.before":"PreToolUse","mcp.after":"PostToolUse","read.before":"PreToolUse","edit.after":"PostToolUse","subagent.start":"SubagentStart","subagent.stop":"SubagentStop",stop:"Stop","compact.before":"PreCompact","response.after":"MessageDisplay","thought.after":"MessageDisplay"};function M9($,Z,J){let Q={hookEventName:Z,permissionDecision:$};if(J!==void 0)Q.permissionDecisionReason=J;return JSON.stringify({hookSpecificOutput:Q})}function W3($,Z){let J=wV[Z.event];switch($.kind){case"abstain":return{stdout:null,exitCode:0};case"allow":return{stdout:M9("allow",J,void 0),exitCode:0};case"deny":return{stdout:M9("deny",J,$.reason),exitCode:0};case"ask":return{stdout:M9("ask",J,$.reason),exitCode:0};case"context":return{stdout:JSON.stringify({hookSpecificOutput:{hookEventName:J,additionalContext:$.text}}),exitCode:0};case"continue":return{stdout:JSON.stringify({decision:"block",reason:$.text}),exitCode:0};case"rewriteInput":return{stdout:JSON.stringify({hookSpecificOutput:{hookEventName:J,updatedInput:$.input}}),exitCode:0};case"rewriteOutput":return{stdout:JSON.stringify({updatedToolOutput:$.output}),exitCode:0};default:throw Error(`unreachable decision kind: ${JSON.stringify($)}`)}}function Y3(){return{blockedPatterns:[],minEffort:null,untrustedTools:["WebFetch","WebSearch"]}}var z3={name:"claude",detect:o1,capabilities:s1,policyDefaults:Y3,toEvent:Z3,render:W3,wiring:U9,wiringTargets:a1,lessonsView:X3};function V3(){return{enforcesHooks:!0,askSupportedOn:["shell.before","mcp.before"],sessionEnv:!0,nativeLoopCounter:!0,dedicatedShellEvent:!0,toolInputRewrite:!0,toolOutputRewriteOn:["mcp.after"],contextAtToolBefore:!1,contextAtToolAfter:!0,contextAtStop:!1,sessionStartContextReliable:!1,toolOutputAtAfter:!0,usageInPayload:!1,effortSignal:!1,thoughtEvent:!0}}var fV=/^[a-z][a-zA-Z0-9]*$/;function G3($){if($===null||typeof $!=="object"||Array.isArray($))return!1;let J=$.hook_event_name;return typeof J==="string"&&fV.test(J)}var yV={sessionStart:"session.start",sessionEnd:"session.end",beforeSubmitPrompt:"prompt.submit",preToolUse:"tool.before",postToolUse:"tool.after",postToolUseFailure:"tool.failure",beforeShellExecution:"shell.before",afterShellExecution:"shell.after",beforeMCPExecution:"mcp.before",afterMCPExecution:"mcp.after",beforeReadFile:"read.before",afterFileEdit:"edit.after",subagentStart:"subagent.start",subagentStop:"subagent.stop",stop:"stop",preCompact:"compact.before",afterAgentResponse:"response.after",afterAgentThought:"thought.after"};function j($){return typeof $==="string"?$:void 0}function U3($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function K9($){return $!==null&&typeof $==="object"&&!Array.isArray($)?$:void 0}function vV($){let Z=K9($);if(Z)return Z;if(typeof $!=="string")return;try{return K9(JSON.parse($))}catch{return}}function mV($){return $==="completed"||$==="aborted"||$==="error"?$:void 0}function uV($){let Z=j($.conversation_id)||j($.session_id)||"default";return`cursor-${F(Z)}`}function gV($){let Z=process.env.CURSOR_PROJECT_DIR;if(Z)return Z;let J=$.workspace_roots;if(Array.isArray(J)){let Q=j(J[0]);if(Q)return Q}return process.cwd()}function B3($){let Z=j($.hook_event_name),J=Z?yV[Z]:void 0;if(!J)return null;let Q={provider:"cursor",event:J,sessionKey:uV($),projectDir:gV($),raw:$},q=j($.model);if(q)Q.model=q;let X=U3($.context_usage_percent);if(X!==void 0)Q.contextUsagePercent=X;switch(J){case"prompt.submit":{let W=j($.prompt);if(W!==void 0)Q.text=W;break}case"response.after":{let W=j($.text);if(W!==void 0)Q.text=W;break}case"thought.after":{let W=j($.thought)??j($.text);if(W!==void 0)Q.text=W;break}case"tool.before":case"tool.after":case"tool.failure":{let W=j($.tool_name);if(W)Q.toolName=W;let Y=K9($.tool_input);if(Y)Q.toolInput=Y;let z=j($.subagent_type);if(z)Q.subagentType=z;let V=Y?j(Y.model):void 0;if(V)Q.spawnModel=V;let G=Y?j(Y.subagent_type):void 0;if(G)Q.spawnSubagentType=G;if(W==="Write"){let H=Y?j(Y.content):void 0;if(H!==void 0)Q.proposedContent=H}break}case"shell.before":case"shell.after":{let W=j($.command);if(W!==void 0)Q.command=W;let Y=j($.output);if(Y!==void 0)Q.toolOutput=Y;if(J==="shell.before"){let z=j($.cwd);if(z)Q.cwd=z}break}case"mcp.before":case"mcp.after":{let W=j($.result_json);if(W!==void 0)Q.toolOutput=W;let Y=j($.tool_name);if(Y)Q.toolName=Y;let z=vV($.tool_input);if(z)Q.toolInput=z;let V=j($.command);if(V!==void 0)Q.command=V;break}case"read.before":case"edit.after":{let W=j($.file_path);if(W!==void 0)Q.filePath=W;break}case"subagent.start":case"subagent.stop":{let W=j($.subagent_type);if(W)Q.spawnSubagentType=W;let Y=j($.subagent_model);if(Y)Q.spawnModel=Y;break}case"stop":{let W=mV($.status);if(W)Q.status=W;let Y=U3($.loop_count);if(Y!==void 0)Q.loopCount=Y;break}default:break}return Q}import{existsSync as hV,mkdirSync as pV,readFileSync as cV,writeFileSync as dV}from"node:fs";import{dirname as H3,join as M3}from"node:path";function lV($){return M3(H3(A($)),"lessons.md")}function iV($){return M3($,".cursor","rules","harness-lessons.mdc")}function K3($){let Z=lV($);if(!hV(Z))return null;let J=cV(Z,"utf8"),Q=iV($);pV(H3(Q),{recursive:!0});let q=`---
|
|
156
156
|
description: Harness-learned lessons (auto-synced from gate failures)
|
|
157
157
|
alwaysApply: true
|
|
158
158
|
---
|
|
159
159
|
|
|
160
160
|
${J}`;return dV(Q,q,"utf8"),Q}function C3($,Z){let J={permission:$};if(Z.userNote!==void 0)J.user_message=Z.userNote;return J.agent_message=Z.reason,JSON.stringify(J)}function O3($,Z){switch($.kind){case"abstain":return{stdout:"{}",exitCode:0};case"allow":return{stdout:JSON.stringify({permission:"allow"}),exitCode:0};case"deny":return{stdout:C3("deny",$),exitCode:0};case"ask":return{stdout:C3("ask",$),exitCode:0};case"context":{let J={};if($.env!==void 0)J.env=$.env;return J.additional_context=$.text,{stdout:JSON.stringify(J),exitCode:0}}case"continue":return{stdout:JSON.stringify({followup_message:$.text}),exitCode:0};case"rewriteInput":return{stdout:JSON.stringify({updated_input:$.input}),exitCode:0};case"rewriteOutput":return{stdout:JSON.stringify({updated_mcp_tool_output:{result_json:$.output}}),exitCode:0};default:throw Error(`unreachable decision kind: ${JSON.stringify($)}`)}}function _3(){return{blockedPatterns:["-fast(?:$|[^a-z0-9])","/fast(?:$|[^a-z0-9])","composer-2\\.5-fast"],minEffort:null,untrustedTools:["Fetch","WebSearch"]}}import{join as nV}from"node:path";function I3(){return nV(x9(),"hooks.json")}function j3(){return[I3()]}var aV=[{hookEvent:"sessionStart",handler:"session-start",timeoutSeconds:10},{hookEvent:"sessionEnd",handler:"session-end",timeoutSeconds:10},{hookEvent:"beforeSubmitPrompt",handler:"prompt-submit",timeoutSeconds:5},{hookEvent:"afterAgentThought",handler:"tool-after",timeoutSeconds:5},{hookEvent:"preCompact",handler:"compact-before",timeoutSeconds:5},{hookEvent:"subagentStart",handler:"subagent-start",timeoutSeconds:5,failClosed:!0},{hookEvent:"subagentStop",handler:"subagent-stop",timeoutSeconds:5},{hookEvent:"preToolUse",handler:"tool-before",timeoutSeconds:10,failClosed:!0},{hookEvent:"postToolUse",handler:"tool-after",timeoutSeconds:5},{hookEvent:"postToolUseFailure",handler:"tool-failure",timeoutSeconds:5},{hookEvent:"beforeShellExecution",handler:"tool-before",timeoutSeconds:10,failClosed:!0},{hookEvent:"afterShellExecution",handler:"tool-after",timeoutSeconds:10},{hookEvent:"beforeMCPExecution",handler:"tool-before",timeoutSeconds:10},{hookEvent:"afterMCPExecution",handler:"tool-after",timeoutSeconds:5},{hookEvent:"beforeReadFile",handler:"tool-before",timeoutSeconds:5},{hookEvent:"afterFileEdit",handler:"tool-after",timeoutSeconds:30,matcher:"Write"},{hookEvent:"stop",handler:"stop",timeoutSeconds:120,loopLimit:5},{hookEvent:"afterAgentResponse",handler:"response-after",timeoutSeconds:5,matcher:"AgentResponse"}];function N3($){let J=[$.launcherPath],Q=aV.map((q)=>({hookEvent:q.hookEvent,handler:q.handler,command:"node",args:[...J,q.handler],timeoutSeconds:q.timeoutSeconds,...q.failClosed!==void 0?{failClosed:q.failClosed}:{},...q.matcher!==void 0?{matcher:q.matcher}:{},...q.loopLimit!==void 0?{loopLimit:q.loopLimit}:{}}));return{target:I3(),strategy:"replace",entries:Q}}var F3={name:"cursor",detect:G3,capabilities:V3,policyDefaults:_3,toEvent:B3,render:O3,wiring:N3,wiringTargets:j3,lessonsView:K3};var d$=[F3,z3];function C9($,Z){let J=Z.filter((Q)=>Q.detect($));if(J.length===0)return{provider:null,ambiguous:!1,matchedNames:[]};return{provider:J[0]??null,ambiguous:J.length>1,matchedNames:J.map((Q)=>Q.name)}}import{existsSync as rV,statSync as t_}from"node:fs";var D3=U.observability.DEFAULT_OBS,QI={...D3,debugEnabled:!0};function C$($,Z=D3){return{...Z,globalSpool:$.obs.globalSpool,includePayloads:$.obs.includePayloads,maxAttrChars:$.obs.maxAttrChars,sessionCostAlertUsd:$.obs.sessionCostAlertUsd,retentionDays:$.obs.retentionDays}}function JZ($){let Z=`${$.provider}-`;return $.sessionKey.startsWith(Z)?$.sessionKey.slice(Z.length):$.sessionKey}async function L3($){if($.cwd)return $.cwd;let Z=U.handoff.readHandoff($.projectDir,$.provider,$.sessionKey).last_shell_cwd;return sV(Z,$.projectDir)}async function sV($,Z){if(!$||$===Z||!rV($))return Z;let[J,Q]=await Promise.all([_Z($),_Z(Z)]);return J!==null&&J===Q?$:Z}async function A3($,Z){if(!$?.turn_base_sha||!$.turn_base_root)return"HEAD";let J=await x(Z);return J!==null&&J===$.turn_base_root?$.turn_base_sha:"HEAD"}async function O9($){let Z=await x($);if(Z===null)return null;let J=await h({command:["git","rev-parse","--short","HEAD"],cwd:Z});if(J.exitCode!==0)return null;let Q=J.stdout.trim();return Q.length>0?Q:null}function P3($,Z){return[...U.policy.forProvider($,Z.name)??[],...Z.policyDefaults().blockedPatterns]}function oV($){return U.lesson.renderLessonBlock($)}function T3($,Z,J=0){if($.length===0)return"";let Q=[Z,...$.map(oV)];if(J>0){let q=J===1?"lesson":"lessons";Q.push(` (${J} more eligible ${q} omitted under the char budget — raise maxCharsSession to see them)`)}return Q.join(`
|
|
161
|
-
`)}var eV=6000;function $G($){if($.filePath===void 0)return!1;if($.event==="edit.after")return!0;return k8($.toolName)}function ZG($){return $ instanceof Error?$.message:String($)}function J$($,Z,J,Q="unknown",q={}){try{k(tV(M($),"obs.jsonl"),{schema:"harness.observability.v1",provider:Q,kind:Z,level:"signal",ts:new Date().toISOString(),...q,attrs:J})}catch{}}function JG($){return $.event==="shell.before"||$.event==="mcp.before"}function QG($){if(!JG($))return;J$($.projectDir,"hook.enter",{event:$.event,toolName:$.toolName??"none",sessionKey:$.sessionKey},$.provider,{trace_id:U.observability.deriveTraceId($.sessionKey),session_id:$.sessionKey})}function qG($,Z,J){if(J.kind!=="deny"&&J.kind!=="ask")return;if($.event==="shell.before")return;U.observability.recordObs($.projectDir,C$(Z),{provider:$.provider,kind:"policy.deny",sessionKey:$.sessionKey,attrs:{event:$.event,tool_name:$.toolName,permission:J.kind,rule:J.rule??"none",diagnostic:J.diagnostic??"none"}})}function XG($){return $!==null&&typeof $==="object"&&!Array.isArray($)?$:{}}async function WG($,Z={}){let J=Z.readStdin??q2,Q=Z.now?Z.now():new Date,q={stdout:
|
|
161
|
+
`)}var eV=6000;function $G($){if($.filePath===void 0)return!1;if($.event==="edit.after")return!0;return k8($.toolName)}function ZG($){return $ instanceof Error?$.message:String($)}function J$($,Z,J,Q="unknown",q={}){try{k(tV(M($),"obs.jsonl"),{schema:"harness.observability.v1",provider:Q,kind:Z,level:"signal",ts:new Date().toISOString(),...q,attrs:J})}catch{}}function JG($){return $.event==="shell.before"||$.event==="mcp.before"}function QG($){if(!JG($))return;J$($.projectDir,"hook.enter",{event:$.event,toolName:$.toolName??"none",sessionKey:$.sessionKey},$.provider,{trace_id:U.observability.deriveTraceId($.sessionKey),session_id:$.sessionKey})}function qG($,Z,J){if(J.kind!=="deny"&&J.kind!=="ask")return;if($.event==="shell.before")return;U.observability.recordObs($.projectDir,C$(Z),{provider:$.provider,kind:"policy.deny",sessionKey:$.sessionKey,attrs:{event:$.event,tool_name:$.toolName,permission:J.kind,rule:J.rule??"none",diagnostic:J.diagnostic??"none"}})}function XG($){return $!==null&&typeof $==="object"&&!Array.isArray($)?$:{}}async function WG($,Z={}){let J=Z.readStdin??q2,Q=Z.now?Z.now():new Date,q={stdout:"{}",exitCode:0},W=(await J()).trim();if(!W)return J$(process.cwd(),"adapter.unrecognized",{reason:"empty-stdin"}),{event:null,decision:{kind:"abstain"},rendered:q};let Y;try{Y=JSON.parse(W)}catch{return J$(process.cwd(),"adapter.unrecognized",{reason:"invalid-json"}),{event:null,decision:{kind:"abstain"},rendered:q}}let z=C9(Y,d$);if(!z.provider)return J$(process.cwd(),"adapter.unrecognized",{reason:"no-provider-match"}),{event:null,decision:{kind:"abstain"},rendered:q};if(z.ambiguous)J$(process.cwd(),"adapter.ambiguous",{matched:z.matchedNames});let V=z.provider,G=V.toEvent(XG(Y));if(!G)return J$(process.cwd(),"adapter.unrecognized",{reason:"unrecognized-event",provider:V.name}),{event:null,decision:{kind:"abstain"},rendered:q};let H=V.capabilities();QG(G);try{let K=U.policy.loadPolicy(G.projectDir);if(G.model)U.subagentPolicy.upsertParentModelState(G.projectDir,G.sessionKey,{model:G.model},P3(K.subagents.blockedPatterns,V));U.presence.heartbeat(G.projectDir,{provider:G.provider,session:JZ(G),...$G(G)?{file:G.filePath}:{},now:Q});let B=d$.flatMap((C)=>C.wiringTargets()),N=await $(G,{policy:K,capabilities:H,provider:V,now:Q,protectedPaths:B}),D=ZZ(N,G,H,{contextBudgetChars:eV});qG(G,K,D);let b=V.render(D,G);return{event:G,decision:D,rendered:b}}catch(K){J$(G.projectDir,"adapter.error",{provider:G.provider,event:G.event,message:ZG(K)});let B={kind:"abstain"};return{event:G,decision:B,rendered:V.render(B,G)}}}async function E3($){let Z=await WG($);if(Z.rendered.stdout!==null){let J=Z.rendered.stdout;process.stdout.write(J.endsWith(`
|
|
162
162
|
`)?J:`${J}
|
|
163
163
|
`)}process.exit(Z.rendered.exitCode)}var k3=["BLOCKED: identical validation fingerprint repeated — no progress between attempts.","TRIED: same gate failure signature as the previous stop loop.","NEED: change approach. Do not repeat the same fix. Inspect root cause, try a different path, or escalate with BLOCKED/TRIED/NEED."].join(`
|
|
164
164
|
`);async function zG($){if(!$.passed||!U.rules.wantsGate($.root,$.policy.rules))return;U.rules.observeGate($.root,$.policy.rules,$.gate,{sha:await O9($.shaRoot),sessionKey:$.sessionKey,at:new Date().toISOString()})}function VG($){U.observability.recordObs($.root,C$($.policy),{provider:$.provider,kind:"gate.outcome",sessionKey:$.sessionKey,attrs:{gate:$.artifact.gate,passed:$.artifact.passed,exit_code:$.artifact.exitCode,duration_ms:$.artifact.durationMs,file_count:$.artifact.files.length,scoped_env:($.artifact.scopedEnv??[]).join(",")||"none",reused:$.reused}})}function GG($){U.observability.recordObs($.root,C$($.policy),{provider:$.provider,kind:"gate.outcome",sessionKey:$.sessionKey,attrs:{gate:$.gate,deferred_to:$.holder,rule:"grind"}})}var UG=1e4;function BG($=process.env){let Z=Number($.TLC_TEST_GATE_LOCK_WAIT_MS);return Number.isFinite(Z)&&Z>0?Z:UG}async function HG($){let{pending:Z}=$;if(!Z||Z.gate!==$.gate||Z.ids.length===0)return;if(Z.sessionKey!==void 0&&Z.sessionKey!==$.sessionKey)return;await U.lesson.creditLessons($.root,Z.ids,$.passed?"helped":"neutral"),await U.handoff.patchHandoff($.root,$.provider,$.sessionKey,{slice:{pending_lesson_credit:void 0}})}async function I9($){let Z=[...$.command,...$.argvFiles],J=U.gate.computeInputsHash($.shaRoot,$.recordFiles,Z),Q=U.gate.cachedVerdict(U.gate.readLastGate($.root,$.sessionKey),$.gate,J),q;if(Q!==null)q=Q;else try{q=await U.gate.withGateLock($.root,$.provider,$.session,async()=>{let X=await X2($.shaRoot,$.command,$.argvFiles);return U.gate.writeLastGate({root:$.root,sessionKey:$.sessionKey,gate:$.gate,exitCode:X.exitCode,command:Z,files:$.recordFiles,durationMs:X.durationMs,output:X.output,...J.complete?{inputsHash:J.hash}:{}})},{waitMs:BG()})}catch(X){if(!(X instanceof U.gate.GateLockTimeoutError))throw X;let W=U.gate.describeHolder($.root)??"another session";return GG({...$,holder:W}),{kind:"deferred",holder:W}}return VG({...$,artifact:q,reused:Q!==null}),await zG({...$,gate:$.gate,passed:q.passed}),await HG({root:$.root,provider:$.provider,pending:$.pendingCredit,gate:$.gate,sessionKey:$.sessionKey,passed:q.passed}),{kind:"ran",artifact:q,reused:Q!==null}}async function j9($){let{policy:Z}=$,J=Z.intelligence,Q=U.stagnation.computeFingerprint({files:$.artifact.files,gate:$.gate,exitCode:$.artifact.exitCode,output:$.artifact.outputTail}),q=U.stagnation.trackFingerprint($.root,$.sessionKey,Q),X=U.gate.isCommandResolutionFailure({exitCode:$.artifact.exitCode,output:$.artifact.outputTail})?"config":U.turn.classifyGateFailure($.gate),W=U.gate.gapsFromArtifact({artifact:$.artifact,category:X}),Y=U.handoff.readHandoff($.root,$.provider,$.sessionKey),z=J.progressiveContext?U.turn.mergeGaps(Y.previous_gaps,W):W,V=U.turn.suggestionFor(X,$.gate),G=q>=2?"stagnation":X,H=J.autopilot?U.turn.resolveAutopilot({category:G,gate:q>=2?"stagnation":$.gate,mode:Z.mode,loopCount:$.loopCount,maxLoops:$.maxLoops,failingFiles:U.gate.filesFromOutput($.artifact.outputTail,$.root),changedFiles:$.artifact.files}):null;if(await U.handoff.patchHandoff($.root,$.provider,$.sessionKey,{slice:{last_gate_result:"fail",last_fingerprint:Q,fingerprint_hits:q,last_failure_category:J.failureClassification?G:void 0,previous_gaps:J.gapFeedback?z:void 0,blockers:`${$.gate} gate failed (${G}).`,next_action:H?.next_action??V}}),q>=2&&J.lessons.enabled)await U.lesson.recordLessonFromFailure({projectDir:$.root,gate:$.gate,category:X,fingerprint:Q,output:$.artifact.outputTail,sessionKey:$.sessionKey});let K=U.stagnation.resolutionFor($.root,Q),B=K?U.stagnation.resolutionHistoryLine(K):"",I=J.lessons.enabled?await U.lesson.selectLessons({projectDir:$.root,config:J.lessons,mode:"retry",gate:$.gate,text:q>=2?`stagnation ${$.artifact.outputTail}`:$.artifact.outputTail}):{lessons:[],usedIds:[],omitted:0},N=T3(I.lessons,"Lessons for this gate (ranked — apply before inventing a new plan):",I.omitted);if(I.usedIds.length>0)await U.lesson.markGradeable($.root,I.usedIds),await U.handoff.patchHandoff($.root,$.provider,$.sessionKey,{slice:{pending_lesson_credit:{gate:$.gate,ids:I.usedIds,at:new Date().toISOString(),sessionKey:$.sessionKey}}});if(q>=2){let b=J.gapFeedback?[...z,{id:"stagnation-0",gate:"stagnation",category:"stagnation",summary:k3}]:[],C=[k3];if(J.gapFeedback)C.push("",U.turn.formatGapFeedback(b,U.turn.suggestionFor("stagnation","stagnation")));if(B)C.push("",B);if(N)C.push("",N);if(H)C.push("",U.turn.formatAutopilotBlock(H));return{kind:"continue",text:C.join(`
|
package/dist/subagent-start.mjs
CHANGED
|
@@ -152,11 +152,11 @@ ${$.body.trim()}`}function A8($,Z,J){let Q=[];for(let q of $){let X=P7(q,Z,J);if
|
|
|
152
152
|
`:"",X=J.length>0?`${J}${q}
|
|
153
153
|
${i5}
|
|
154
154
|
`:`${i5}
|
|
155
|
-
`;return iz(E3(Z),{recursive:!0}),az(Z,X,"utf8"),Z}var oz={"session.start":"SessionStart","session.end":"SessionEnd","prompt.submit":"UserPromptSubmit","tool.before":"PreToolUse","tool.after":"PostToolUse","tool.failure":"PostToolUseFailure","shell.before":"PreToolUse","shell.after":"PostToolUse","mcp.before":"PreToolUse","mcp.after":"PostToolUse","read.before":"PreToolUse","edit.after":"PostToolUse","subagent.start":"SubagentStart","subagent.stop":"SubagentStop",stop:"Stop","compact.before":"PreCompact","response.after":"MessageDisplay","thought.after":"MessageDisplay"};function n5($,Z,J){let Q={hookEventName:Z,permissionDecision:$};if(J!==void 0)Q.permissionDecisionReason=J;return JSON.stringify({hookSpecificOutput:Q})}function x3($,Z){let J=oz[Z.event];switch($.kind){case"abstain":return{stdout:null,exitCode:0};case"allow":return{stdout:n5("allow",J,void 0),exitCode:0};case"deny":return{stdout:n5("deny",J,$.reason),exitCode:0};case"ask":return{stdout:n5("ask",J,$.reason),exitCode:0};case"context":return{stdout:JSON.stringify({hookSpecificOutput:{hookEventName:J,additionalContext:$.text}}),exitCode:0};case"continue":return{stdout:JSON.stringify({decision:"block",reason:$.text}),exitCode:0};case"rewriteInput":return{stdout:JSON.stringify({hookSpecificOutput:{hookEventName:J,updatedInput:$.input}}),exitCode:0};case"rewriteOutput":return{stdout:JSON.stringify({updatedToolOutput:$.output}),exitCode:0};default:throw Error(`unreachable decision kind: ${JSON.stringify($)}`)}}function S3(){return{blockedPatterns:[],minEffort:null,untrustedTools:["WebFetch","WebSearch"]}}var b3={name:"claude",detect:N3,capabilities:j3,policyDefaults:S3,toEvent:A3,render:x3,wiring:d5,wiringTargets:_3,lessonsView:k3};function f3(){return{enforcesHooks:!0,askSupportedOn:["shell.before","mcp.before"],sessionEnv:!0,nativeLoopCounter:!0,dedicatedShellEvent:!0,toolInputRewrite:!0,toolOutputRewriteOn:["mcp.after"],contextAtToolBefore:!1,contextAtToolAfter:!0,contextAtStop:!1,sessionStartContextReliable:!1,toolOutputAtAfter:!0,usageInPayload:!1,effortSignal:!1,thoughtEvent:!0}}var tz=/^[a-z][a-zA-Z0-9]*$/;function y3($){if($===null||typeof $!=="object"||Array.isArray($))return!1;let
|
|
155
|
+
`;return iz(E3(Z),{recursive:!0}),az(Z,X,"utf8"),Z}var oz={"session.start":"SessionStart","session.end":"SessionEnd","prompt.submit":"UserPromptSubmit","tool.before":"PreToolUse","tool.after":"PostToolUse","tool.failure":"PostToolUseFailure","shell.before":"PreToolUse","shell.after":"PostToolUse","mcp.before":"PreToolUse","mcp.after":"PostToolUse","read.before":"PreToolUse","edit.after":"PostToolUse","subagent.start":"SubagentStart","subagent.stop":"SubagentStop",stop:"Stop","compact.before":"PreCompact","response.after":"MessageDisplay","thought.after":"MessageDisplay"};function n5($,Z,J){let Q={hookEventName:Z,permissionDecision:$};if(J!==void 0)Q.permissionDecisionReason=J;return JSON.stringify({hookSpecificOutput:Q})}function x3($,Z){let J=oz[Z.event];switch($.kind){case"abstain":return{stdout:null,exitCode:0};case"allow":return{stdout:n5("allow",J,void 0),exitCode:0};case"deny":return{stdout:n5("deny",J,$.reason),exitCode:0};case"ask":return{stdout:n5("ask",J,$.reason),exitCode:0};case"context":return{stdout:JSON.stringify({hookSpecificOutput:{hookEventName:J,additionalContext:$.text}}),exitCode:0};case"continue":return{stdout:JSON.stringify({decision:"block",reason:$.text}),exitCode:0};case"rewriteInput":return{stdout:JSON.stringify({hookSpecificOutput:{hookEventName:J,updatedInput:$.input}}),exitCode:0};case"rewriteOutput":return{stdout:JSON.stringify({updatedToolOutput:$.output}),exitCode:0};default:throw Error(`unreachable decision kind: ${JSON.stringify($)}`)}}function S3(){return{blockedPatterns:[],minEffort:null,untrustedTools:["WebFetch","WebSearch"]}}var b3={name:"claude",detect:N3,capabilities:j3,policyDefaults:S3,toEvent:A3,render:x3,wiring:d5,wiringTargets:_3,lessonsView:k3};function f3(){return{enforcesHooks:!0,askSupportedOn:["shell.before","mcp.before"],sessionEnv:!0,nativeLoopCounter:!0,dedicatedShellEvent:!0,toolInputRewrite:!0,toolOutputRewriteOn:["mcp.after"],contextAtToolBefore:!1,contextAtToolAfter:!0,contextAtStop:!1,sessionStartContextReliable:!1,toolOutputAtAfter:!0,usageInPayload:!1,effortSignal:!1,thoughtEvent:!0}}var tz=/^[a-z][a-zA-Z0-9]*$/;function y3($){if($===null||typeof $!=="object"||Array.isArray($))return!1;let J=$.hook_event_name;return typeof J==="string"&&tz.test(J)}var ez={sessionStart:"session.start",sessionEnd:"session.end",beforeSubmitPrompt:"prompt.submit",preToolUse:"tool.before",postToolUse:"tool.after",postToolUseFailure:"tool.failure",beforeShellExecution:"shell.before",afterShellExecution:"shell.after",beforeMCPExecution:"mcp.before",afterMCPExecution:"mcp.after",beforeReadFile:"read.before",afterFileEdit:"edit.after",subagentStart:"subagent.start",subagentStop:"subagent.stop",stop:"stop",preCompact:"compact.before",afterAgentResponse:"response.after",afterAgentThought:"thought.after"};function F($){return typeof $==="string"?$:void 0}function w3($){return typeof $==="number"&&Number.isFinite($)?$:void 0}function a5($){return $!==null&&typeof $==="object"&&!Array.isArray($)?$:void 0}function $V($){let Z=a5($);if(Z)return Z;if(typeof $!=="string")return;try{return a5(JSON.parse($))}catch{return}}function ZV($){return $==="completed"||$==="aborted"||$==="error"?$:void 0}function JV($){let Z=F($.conversation_id)||F($.session_id)||"default";return`cursor-${C(Z)}`}function QV($){let Z=process.env.CURSOR_PROJECT_DIR;if(Z)return Z;let J=$.workspace_roots;if(Array.isArray(J)){let Q=F(J[0]);if(Q)return Q}return process.cwd()}function v3($){let Z=F($.hook_event_name),J=Z?ez[Z]:void 0;if(!J)return null;let Q={provider:"cursor",event:J,sessionKey:JV($),projectDir:QV($),raw:$},q=F($.model);if(q)Q.model=q;let X=w3($.context_usage_percent);if(X!==void 0)Q.contextUsagePercent=X;switch(J){case"prompt.submit":{let W=F($.prompt);if(W!==void 0)Q.text=W;break}case"response.after":{let W=F($.text);if(W!==void 0)Q.text=W;break}case"thought.after":{let W=F($.thought)??F($.text);if(W!==void 0)Q.text=W;break}case"tool.before":case"tool.after":case"tool.failure":{let W=F($.tool_name);if(W)Q.toolName=W;let Y=a5($.tool_input);if(Y)Q.toolInput=Y;let z=F($.subagent_type);if(z)Q.subagentType=z;let V=Y?F(Y.model):void 0;if(V)Q.spawnModel=V;let G=Y?F(Y.subagent_type):void 0;if(G)Q.spawnSubagentType=G;if(W==="Write"){let U=Y?F(Y.content):void 0;if(U!==void 0)Q.proposedContent=U}break}case"shell.before":case"shell.after":{let W=F($.command);if(W!==void 0)Q.command=W;let Y=F($.output);if(Y!==void 0)Q.toolOutput=Y;if(J==="shell.before"){let z=F($.cwd);if(z)Q.cwd=z}break}case"mcp.before":case"mcp.after":{let W=F($.result_json);if(W!==void 0)Q.toolOutput=W;let Y=F($.tool_name);if(Y)Q.toolName=Y;let z=$V($.tool_input);if(z)Q.toolInput=z;let V=F($.command);if(V!==void 0)Q.command=V;break}case"read.before":case"edit.after":{let W=F($.file_path);if(W!==void 0)Q.filePath=W;break}case"subagent.start":case"subagent.stop":{let W=F($.subagent_type);if(W)Q.spawnSubagentType=W;let Y=F($.subagent_model);if(Y)Q.spawnModel=Y;break}case"stop":{let W=ZV($.status);if(W)Q.status=W;let Y=w3($.loop_count);if(Y!==void 0)Q.loopCount=Y;break}default:break}return Q}import{existsSync as qV,mkdirSync as XV,readFileSync as WV,writeFileSync as YV}from"node:fs";import{dirname as m3,join as g3}from"node:path";function zV($){return g3(m3(_($)),"lessons.md")}function VV($){return g3($,".cursor","rules","harness-lessons.mdc")}function u3($){let Z=zV($);if(!qV(Z))return null;let J=WV(Z,"utf8"),Q=VV($);XV(m3(Q),{recursive:!0});let q=`---
|
|
156
156
|
description: Harness-learned lessons (auto-synced from gate failures)
|
|
157
157
|
alwaysApply: true
|
|
158
158
|
---
|
|
159
159
|
|
|
160
|
-
${J}`;return YV(Q,q,"utf8"),Q}function h3($,Z){let J={permission:$};if(Z.userNote!==void 0)J.user_message=Z.userNote;return J.agent_message=Z.reason,JSON.stringify(J)}function p3($,Z){switch($.kind){case"abstain":return{stdout:"{}",exitCode:0};case"allow":return{stdout:JSON.stringify({permission:"allow"}),exitCode:0};case"deny":return{stdout:h3("deny",$),exitCode:0};case"ask":return{stdout:h3("ask",$),exitCode:0};case"context":{let J={};if($.env!==void 0)J.env=$.env;return J.additional_context=$.text,{stdout:JSON.stringify(J),exitCode:0}}case"continue":return{stdout:JSON.stringify({followup_message:$.text}),exitCode:0};case"rewriteInput":return{stdout:JSON.stringify({updated_input:$.input}),exitCode:0};case"rewriteOutput":return{stdout:JSON.stringify({updated_mcp_tool_output:{result_json:$.output}}),exitCode:0};default:throw Error(`unreachable decision kind: ${JSON.stringify($)}`)}}function c3(){return{blockedPatterns:["-fast(?:$|[^a-z0-9])","/fast(?:$|[^a-z0-9])","composer-2\\.5-fast"],minEffort:null,untrustedTools:["Fetch","WebSearch"]}}import{join as GV}from"node:path";function d3(){return GV(J9(),"hooks.json")}function l3(){return[d3()]}var BV=[{hookEvent:"sessionStart",handler:"session-start",timeoutSeconds:10},{hookEvent:"sessionEnd",handler:"session-end",timeoutSeconds:10},{hookEvent:"beforeSubmitPrompt",handler:"prompt-submit",timeoutSeconds:5},{hookEvent:"afterAgentThought",handler:"tool-after",timeoutSeconds:5},{hookEvent:"preCompact",handler:"compact-before",timeoutSeconds:5},{hookEvent:"subagentStart",handler:"subagent-start",timeoutSeconds:5,failClosed:!0},{hookEvent:"subagentStop",handler:"subagent-stop",timeoutSeconds:5},{hookEvent:"preToolUse",handler:"tool-before",timeoutSeconds:10,failClosed:!0},{hookEvent:"postToolUse",handler:"tool-after",timeoutSeconds:5},{hookEvent:"postToolUseFailure",handler:"tool-failure",timeoutSeconds:5},{hookEvent:"beforeShellExecution",handler:"tool-before",timeoutSeconds:10,failClosed:!0},{hookEvent:"afterShellExecution",handler:"tool-after",timeoutSeconds:10},{hookEvent:"beforeMCPExecution",handler:"tool-before",timeoutSeconds:10},{hookEvent:"afterMCPExecution",handler:"tool-after",timeoutSeconds:5},{hookEvent:"beforeReadFile",handler:"tool-before",timeoutSeconds:5},{hookEvent:"afterFileEdit",handler:"tool-after",timeoutSeconds:30,matcher:"Write"},{hookEvent:"stop",handler:"stop",timeoutSeconds:120,loopLimit:5},{hookEvent:"afterAgentResponse",handler:"response-after",timeoutSeconds:5,matcher:"AgentResponse"}];function i3($){let J=[$.launcherPath],Q=BV.map((q)=>({hookEvent:q.hookEvent,handler:q.handler,command:"node",args:[...J,q.handler],timeoutSeconds:q.timeoutSeconds,...q.failClosed!==void 0?{failClosed:q.failClosed}:{},...q.matcher!==void 0?{matcher:q.matcher}:{},...q.loopLimit!==void 0?{loopLimit:q.loopLimit}:{}}));return{target:d3(),strategy:"replace",entries:Q}}var n3={name:"cursor",detect:y3,capabilities:f3,policyDefaults:c3,toEvent:v3,render:p3,wiring:i3,wiringTargets:l3,lessonsView:u3};var y$=[n3,b3];function r5($,Z){let J=Z.filter((Q)=>Q.detect($));if(J.length===0)return{provider:null,ambiguous:!1,matchedNames:[]};return{provider:J[0]??null,ambiguous:J.length>1,matchedNames:J.map((Q)=>Q.name)}}var a3=D.observability.DEFAULT_OBS,HO={...a3,debugEnabled:!0};function r3($,Z=a3){return{...Z,globalSpool:$.obs.globalSpool,includePayloads:$.obs.includePayloads,maxAttrChars:$.obs.maxAttrChars,sessionCostAlertUsd:$.obs.sessionCostAlertUsd,retentionDays:$.obs.retentionDays}}function s3($){let Z=`${$.provider}-`;return $.sessionKey.startsWith(Z)?$.sessionKey.slice(Z.length):$.sessionKey}function UV($,Z){return D.policy.forProvider($,Z.name)??[]}function s5($,Z){return[...D.policy.forProvider($,Z.name)??[],...Z.policyDefaults().blockedPatterns]}function HV($,Z){return $??Z.policyDefaults().minEffort}function o3($,Z,J,Q){return{provider:J.name,sessionKey:$.sessionKey,projectDir:$.projectDir,model:Q,effort:$.effort,allowedModels:UV(Z.subagents.allowedModels,J),blockedPatterns:s5(Z.subagents.blockedPatterns,J),minEffort:HV(Z.subagents.minEffort,J),requireModel:Z.subagents.requireModel,enforceAllowlist:Z.subagents.enforceAllowlist,blockParentFast:Z.subagents.blockParentFast,blockMode:Z.subagents.blockMode}}var KV=6000;function FV($){if($.filePath===void 0)return!1;if($.event==="edit.after")return!0;return _8($.toolName)}function CV($){return $ instanceof Error?$.message:String($)}function r($,Z,J,Q="unknown",q={}){try{L(MV(H($),"obs.jsonl"),{schema:"harness.observability.v1",provider:Q,kind:Z,level:"signal",ts:new Date().toISOString(),...q,attrs:J})}catch{}}function OV($){return $.event==="shell.before"||$.event==="mcp.before"}function _V($){if(!OV($))return;r($.projectDir,"hook.enter",{event:$.event,toolName:$.toolName??"none",sessionKey:$.sessionKey},$.provider,{trace_id:D.observability.deriveTraceId($.sessionKey),session_id:$.sessionKey})}function IV($,Z,J){if(J.kind!=="deny"&&J.kind!=="ask")return;if($.event==="shell.before")return;D.observability.recordObs($.projectDir,r3(Z),{provider:$.provider,kind:"policy.deny",sessionKey:$.sessionKey,attrs:{event:$.event,tool_name:$.toolName,permission:J.kind,rule:J.rule??"none",diagnostic:J.diagnostic??"none"}})}function jV($){return $!==null&&typeof $==="object"&&!Array.isArray($)?$:{}}async function NV($,Z={}){let J=Z.readStdin??R9,Q=Z.now?Z.now():new Date,q={stdout:
|
|
160
|
+
${J}`;return YV(Q,q,"utf8"),Q}function h3($,Z){let J={permission:$};if(Z.userNote!==void 0)J.user_message=Z.userNote;return J.agent_message=Z.reason,JSON.stringify(J)}function p3($,Z){switch($.kind){case"abstain":return{stdout:"{}",exitCode:0};case"allow":return{stdout:JSON.stringify({permission:"allow"}),exitCode:0};case"deny":return{stdout:h3("deny",$),exitCode:0};case"ask":return{stdout:h3("ask",$),exitCode:0};case"context":{let J={};if($.env!==void 0)J.env=$.env;return J.additional_context=$.text,{stdout:JSON.stringify(J),exitCode:0}}case"continue":return{stdout:JSON.stringify({followup_message:$.text}),exitCode:0};case"rewriteInput":return{stdout:JSON.stringify({updated_input:$.input}),exitCode:0};case"rewriteOutput":return{stdout:JSON.stringify({updated_mcp_tool_output:{result_json:$.output}}),exitCode:0};default:throw Error(`unreachable decision kind: ${JSON.stringify($)}`)}}function c3(){return{blockedPatterns:["-fast(?:$|[^a-z0-9])","/fast(?:$|[^a-z0-9])","composer-2\\.5-fast"],minEffort:null,untrustedTools:["Fetch","WebSearch"]}}import{join as GV}from"node:path";function d3(){return GV(J9(),"hooks.json")}function l3(){return[d3()]}var BV=[{hookEvent:"sessionStart",handler:"session-start",timeoutSeconds:10},{hookEvent:"sessionEnd",handler:"session-end",timeoutSeconds:10},{hookEvent:"beforeSubmitPrompt",handler:"prompt-submit",timeoutSeconds:5},{hookEvent:"afterAgentThought",handler:"tool-after",timeoutSeconds:5},{hookEvent:"preCompact",handler:"compact-before",timeoutSeconds:5},{hookEvent:"subagentStart",handler:"subagent-start",timeoutSeconds:5,failClosed:!0},{hookEvent:"subagentStop",handler:"subagent-stop",timeoutSeconds:5},{hookEvent:"preToolUse",handler:"tool-before",timeoutSeconds:10,failClosed:!0},{hookEvent:"postToolUse",handler:"tool-after",timeoutSeconds:5},{hookEvent:"postToolUseFailure",handler:"tool-failure",timeoutSeconds:5},{hookEvent:"beforeShellExecution",handler:"tool-before",timeoutSeconds:10,failClosed:!0},{hookEvent:"afterShellExecution",handler:"tool-after",timeoutSeconds:10},{hookEvent:"beforeMCPExecution",handler:"tool-before",timeoutSeconds:10},{hookEvent:"afterMCPExecution",handler:"tool-after",timeoutSeconds:5},{hookEvent:"beforeReadFile",handler:"tool-before",timeoutSeconds:5},{hookEvent:"afterFileEdit",handler:"tool-after",timeoutSeconds:30,matcher:"Write"},{hookEvent:"stop",handler:"stop",timeoutSeconds:120,loopLimit:5},{hookEvent:"afterAgentResponse",handler:"response-after",timeoutSeconds:5,matcher:"AgentResponse"}];function i3($){let J=[$.launcherPath],Q=BV.map((q)=>({hookEvent:q.hookEvent,handler:q.handler,command:"node",args:[...J,q.handler],timeoutSeconds:q.timeoutSeconds,...q.failClosed!==void 0?{failClosed:q.failClosed}:{},...q.matcher!==void 0?{matcher:q.matcher}:{},...q.loopLimit!==void 0?{loopLimit:q.loopLimit}:{}}));return{target:d3(),strategy:"replace",entries:Q}}var n3={name:"cursor",detect:y3,capabilities:f3,policyDefaults:c3,toEvent:v3,render:p3,wiring:i3,wiringTargets:l3,lessonsView:u3};var y$=[n3,b3];function r5($,Z){let J=Z.filter((Q)=>Q.detect($));if(J.length===0)return{provider:null,ambiguous:!1,matchedNames:[]};return{provider:J[0]??null,ambiguous:J.length>1,matchedNames:J.map((Q)=>Q.name)}}var a3=D.observability.DEFAULT_OBS,HO={...a3,debugEnabled:!0};function r3($,Z=a3){return{...Z,globalSpool:$.obs.globalSpool,includePayloads:$.obs.includePayloads,maxAttrChars:$.obs.maxAttrChars,sessionCostAlertUsd:$.obs.sessionCostAlertUsd,retentionDays:$.obs.retentionDays}}function s3($){let Z=`${$.provider}-`;return $.sessionKey.startsWith(Z)?$.sessionKey.slice(Z.length):$.sessionKey}function UV($,Z){return D.policy.forProvider($,Z.name)??[]}function s5($,Z){return[...D.policy.forProvider($,Z.name)??[],...Z.policyDefaults().blockedPatterns]}function HV($,Z){return $??Z.policyDefaults().minEffort}function o3($,Z,J,Q){return{provider:J.name,sessionKey:$.sessionKey,projectDir:$.projectDir,model:Q,effort:$.effort,allowedModels:UV(Z.subagents.allowedModels,J),blockedPatterns:s5(Z.subagents.blockedPatterns,J),minEffort:HV(Z.subagents.minEffort,J),requireModel:Z.subagents.requireModel,enforceAllowlist:Z.subagents.enforceAllowlist,blockParentFast:Z.subagents.blockParentFast,blockMode:Z.subagents.blockMode}}var KV=6000;function FV($){if($.filePath===void 0)return!1;if($.event==="edit.after")return!0;return _8($.toolName)}function CV($){return $ instanceof Error?$.message:String($)}function r($,Z,J,Q="unknown",q={}){try{L(MV(H($),"obs.jsonl"),{schema:"harness.observability.v1",provider:Q,kind:Z,level:"signal",ts:new Date().toISOString(),...q,attrs:J})}catch{}}function OV($){return $.event==="shell.before"||$.event==="mcp.before"}function _V($){if(!OV($))return;r($.projectDir,"hook.enter",{event:$.event,toolName:$.toolName??"none",sessionKey:$.sessionKey},$.provider,{trace_id:D.observability.deriveTraceId($.sessionKey),session_id:$.sessionKey})}function IV($,Z,J){if(J.kind!=="deny"&&J.kind!=="ask")return;if($.event==="shell.before")return;D.observability.recordObs($.projectDir,r3(Z),{provider:$.provider,kind:"policy.deny",sessionKey:$.sessionKey,attrs:{event:$.event,tool_name:$.toolName,permission:J.kind,rule:J.rule??"none",diagnostic:J.diagnostic??"none"}})}function jV($){return $!==null&&typeof $==="object"&&!Array.isArray($)?$:{}}async function NV($,Z={}){let J=Z.readStdin??R9,Q=Z.now?Z.now():new Date,q={stdout:"{}",exitCode:0},W=(await J()).trim();if(!W)return r(process.cwd(),"adapter.unrecognized",{reason:"empty-stdin"}),{event:null,decision:{kind:"abstain"},rendered:q};let Y;try{Y=JSON.parse(W)}catch{return r(process.cwd(),"adapter.unrecognized",{reason:"invalid-json"}),{event:null,decision:{kind:"abstain"},rendered:q}}let z=r5(Y,y$);if(!z.provider)return r(process.cwd(),"adapter.unrecognized",{reason:"no-provider-match"}),{event:null,decision:{kind:"abstain"},rendered:q};if(z.ambiguous)r(process.cwd(),"adapter.ambiguous",{matched:z.matchedNames});let V=z.provider,G=V.toEvent(jV(Y));if(!G)return r(process.cwd(),"adapter.unrecognized",{reason:"unrecognized-event",provider:V.name}),{event:null,decision:{kind:"abstain"},rendered:q};let U=V.capabilities();_V(G);try{let M=D.policy.loadPolicy(G.projectDir);if(G.model)D.subagentPolicy.upsertParentModelState(G.projectDir,G.sessionKey,{model:G.model},s5(M.subagents.blockedPatterns,V));D.presence.heartbeat(G.projectDir,{provider:G.provider,session:s3(G),...FV(G)?{file:G.filePath}:{},now:Q});let B=y$.flatMap((R)=>R.wiringTargets()),T=await $(G,{policy:M,capabilities:U,provider:V,now:Q,protectedPaths:B}),b=d8(T,G,U,{contextBudgetChars:KV});IV(G,M,b);let d=V.render(b,G);return{event:G,decision:b,rendered:d}}catch(M){r(G.projectDir,"adapter.error",{provider:G.provider,event:G.event,message:CV(M)});let B={kind:"abstain"};return{event:G,decision:B,rendered:V.render(B,G)}}}async function t3($){let Z=await NV($);if(Z.rendered.stdout!==null){let J=Z.rendered.stdout;process.stdout.write(J.endsWith(`
|
|
161
161
|
`)?J:`${J}
|
|
162
162
|
`)}process.exit(Z.rendered.exitCode)}var LV=($,Z)=>{let{policy:J,provider:Q}=Z;return D.subagentPolicy.evaluateSubagentSpawn(o3($,J,Q,$.spawnModel??""))};if(t5.main==t5.module)await t3(LV);export{LV as subagentStartHandler};
|