@ornexus/neocortex 4.60.23 → 4.60.25
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/sbom.cdx.json +23 -23
- package/install.js +67 -10
- package/install.ps1 +39 -8
- package/install.sh +18 -6
- package/package.json +5 -2
- package/packages/client/dist/adapters/adapter-registry.d.ts +2 -2
- package/packages/client/dist/adapters/adapter-registry.js +1 -1
- package/packages/client/dist/adapters/grok-adapter.d.ts +11 -0
- package/packages/client/dist/adapters/grok-adapter.js +2 -0
- package/packages/client/dist/adapters/index.d.ts +1 -0
- package/packages/client/dist/adapters/index.js +1 -1
- package/packages/client/dist/adapters/platform-detector.d.ts +1 -1
- package/packages/client/dist/adapters/platform-detector.js +1 -1
- package/packages/client/dist/agent/refresh-stubs.js +2 -2
- package/packages/client/dist/cli.js +21 -2
- package/packages/client/dist/commands/invoke.d.ts +20 -21
- package/packages/client/dist/commands/invoke.js +59 -55
- package/packages/client/dist/commands/story-checkpoint.d.ts +15 -0
- package/packages/client/dist/commands/story-checkpoint.js +1 -0
- package/packages/client/dist/config.js +1 -1
- package/packages/client/dist/generated/command-registry.generated.d.ts +18 -52
- package/packages/client/dist/generated/command-registry.generated.js +1 -1
- package/packages/client/dist/git/direct-yolo-checkpoint.d.ts +67 -0
- package/packages/client/dist/git/direct-yolo-checkpoint.js +3 -0
- package/packages/client/dist/git/git-lifecycle-step-ids.d.ts +2 -0
- package/packages/client/dist/git/git-lifecycle-step-ids.js +1 -0
- package/packages/client/dist/git/git-lifecycle-store.d.ts +198 -0
- package/packages/client/dist/git/git-lifecycle-store.js +4 -0
- package/packages/client/dist/git/secure-filesystem-boundary.d.ts +26 -0
- package/packages/client/dist/git/secure-filesystem-boundary.js +123 -0
- package/packages/client/dist/graph-retrieval/shared-graph-retrieval-contract.js +1 -1
- package/packages/client/dist/index.d.ts +2 -0
- package/packages/client/dist/index.js +1 -1
- package/packages/client/dist/memory/shared-project-memory-types.d.ts +29 -2
- package/packages/client/dist/memory/shared-project-memory-types.js +2 -2
- package/packages/client/dist/policy/subagent-approval-policy.js +1 -1
- package/packages/client/dist/runner/headless/continuous-story-workspace.d.ts +131 -0
- package/packages/client/dist/runner/headless/continuous-story-workspace.js +58 -0
- package/packages/client/dist/runner/headless/epic-git-reconciliation-inventory.d.ts +23 -0
- package/packages/client/dist/runner/headless/epic-git-reconciliation-inventory.js +1 -0
- package/packages/client/dist/runner/headless/epic-merge-candidate-qa.d.ts +15 -0
- package/packages/client/dist/runner/headless/epic-merge-candidate-qa.js +28 -0
- package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.d.ts +12 -0
- package/packages/client/dist/runner/headless/epic-terminal-git-cli-adapter.js +8 -0
- package/packages/client/dist/runner/headless/epic-terminal-git-runner.d.ts +134 -0
- package/packages/client/dist/runner/headless/epic-terminal-git-runner.js +2 -0
- package/packages/client/dist/runner/headless/prepared-story-bundle.js +1 -1
- package/packages/client/dist/runner/headless/run-yolo.js +1 -1
- package/packages/client/dist/runner/headless/run-yoloop.d.ts +7 -2
- package/packages/client/dist/runner/headless/run-yoloop.js +8 -1
- package/packages/client/dist/runner/headless/types.d.ts +1 -1
- package/packages/client/dist/runner/headless/types.js +2 -2
- package/packages/client/dist/runner-cli.js +0 -0
- package/packages/client/dist/state/project-state-snapshot.js +1 -1
- package/packages/client/dist/state/state-json-repair.d.ts +9 -0
- package/packages/client/dist/state/state-json-repair.js +3 -3
- package/packages/client/dist/tier/tier-aware-client.js +1 -1
- package/packages/client/dist/yoloop/invoke-hooks.d.ts +13 -10
- package/packages/client/dist/yoloop/invoke-hooks.js +8 -5
- package/packages/client/dist/yoloop/shared-discover-epics.js +1 -1
- package/packages/shared/dist/generated/command-registry.generated.js +18 -66
- package/packages/shared/dist/generated/invocation-schema.generated.js +5 -25
- package/packages/shared/dist/invocation/index.d.ts +1 -1
- package/packages/shared/dist/yoloop/epic-terminal-git.js +227 -0
- package/packages/shared/dist/yoloop/planning-graph.js +119 -0
- package/packages/shared/dist/yoloop/public-story-write-set.js +27 -0
- package/packages/shared/dist/yoloop/wave-decision-receipt.js +19 -0
- package/targets-stubs/antigravity/gemini.md +1 -1
- package/targets-stubs/antigravity/neocortex.md +18 -0
- package/targets-stubs/antigravity/skill/SKILL.md +1 -1
- package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex-root.md +21 -2
- package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex.md +2 -2
- package/targets-stubs/codex/AGENTS.md +20 -1
- package/targets-stubs/cursor/agent.md +20 -2
- package/targets-stubs/gemini-cli/agent.md +2 -2
- package/targets-stubs/gemini-cli/gemini.md +18 -0
- package/targets-stubs/grok/README.md +13 -0
- package/targets-stubs/grok/SKILL.md +50 -0
- package/targets-stubs/grok/config-mcp.toml +22 -0
- package/targets-stubs/grok/install-grok.sh +31 -0
- package/targets-stubs/kimi/neocortex.md +18 -0
- package/targets-stubs/openclaw/SKILL.md +18 -0
- package/targets-stubs/opencode/neocortex-root.md +20 -1
- package/targets-stubs/vscode/neocortex.agent.md +20 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHash as F,randomBytes as z}from"node:crypto";import{AUTONOMOUS_GOVERNANCE_EVIDENCE_TAG as V,AUTONOMOUS_GOVERNANCE_REASON_CODES as N,autonomousGovernanceMetadata as B,buildAutonomousGovernanceEnvelope as X,readAutonomousGovernanceEnvelopeFromMetadata as q,recordAutonomousGovernance as Y}from"../../continuity/autonomous-governance.js";import{createDefaultHeadlessAdapterRegistry as Z}from"./adapters.js";import{loadHeadlessRuntimeDefaults as G,resolveHeadlessRuntime as J}from"./resolver.js";import{HEADLESS_REASON_CODES as m,boundPublicSummary as C,hashPublicValue as w,redaction as i}from"./types.js";const W=300*1e3,Q=30*1e3,ee=30*1e3,te=600*1e3,re=1,oe=3,D=/^docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,ae=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/,ne=new Set(["schemaVersion","contractVersion","kind","commandClass","jobId","operationId","idempotencyKey","targetKind","targetRef","commandRef","storyId","runtime","publicSummary","reasonCode","attempts","metadata","redactionSummary","publicSafe"]),se=new Set(["runtimeId","modelId","source","reasonCode","publicSafe"]),g=/(raw[_-]?(?:logs?|payloads?)|std(?:out|err)|stack(?:[_-]?trace)?|transcript|objective(?:[_-]?(?:text|body|prompt))|prompt(?:[_-]?(?:body|text))?|private[_-]?(?:urls?|prompts?)|secret|token|password|protected(?:[_-]?(?:field|body|bodies|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|\bpii\b|authorization|api[_-]?key|license[_-]?key|argv|args|executable(?:[_-]?path)?|binary(?:[_-]?path)?|shell|cwd|command[_-]?path|vendor(?:[_-]?(?:payload|corpus|response|output)))/i,p=/(https?:\/\/\S+|(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)|ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=|raw[_-]?(?:logs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS|P190[_-]?SYNTHETIC[_-]?(?:HEADLESS|CONTINUITY))/i,E=/(?:[;&|`$<>]|\$\(|\n|\r|\0)/;async function xe(e){const t=e.adapterRegistry??Z(),r=h(e.limit??re,1,10),a=h(e.leaseMs??W,1e3,3600*1e3),n=h(e.staleLeaseAfterMs??Q,0,1440*60*1e3),s=h(e.maxAttempts??oe,1,10),o=[],u=[],d=e.now(),c=de({store:e.store,metadata:e.metadata,nowIso:d,maxAttempts:s,queueCap:e.queueCap});o.push(...c.reasonCodes);const l=e.store.recoverStaleHeadlessExecutionAttempts({nowIso:d,staleAfterMs:n,limit:r*2});l.recoveredAttemptIds.length>0&&(o.push(m.EXECUTION_BACKOFF),l.failedAttemptIds.length>0&&o.push(m.EXECUTION_TIMEOUT));const _=new Set(e.attemptIds??[]),I=e.store.listDueHeadlessExecutionAttempts({nowIso:e.now(),limit:Math.max(r*5,10)}).filter(y=>y.directive_kind==="run_yolo").filter(y=>_.size===0||_.has(y.attempt_id)).slice(0,r);for(const y of I){const b=await ie({store:e.store,projectRoot:e.projectRoot,runnerId:e.runnerId,attempt:y,registry:t,now:e.now,leaseMs:a,timeoutMs:h(e.timeoutMs??te,1e3,18e5),backoffMs:h(e.backoffMs??ee,1e3,36e5),maxAttempts:s,adapterOptions:e.adapterOptions,runtimeDefaults:e.runtimeDefaults,runtimeFallback:e.runtimeFallback,idFactory:e.idFactory??be});u.push(b),o.push(b.reasonCode)}return{ok:u.every(y=>y.outcome!=="failed")&&c.rejectedCount===0,enqueuedAttemptCount:c.enqueuedCount,dueAttemptCount:I.length,processedAttemptCount:u.filter(y=>y.outcome!=="ignored").length,recoveredAttemptIds:l.recoveredAttemptIds,receipts:u,reasonCodes:L(o.length>0?o:[m.OK]),publicSafe:!0}}function de(e){let t=0,r=0;const a=[];for(const n of _e(e.metadata)){if(!S(n)||n.kind!=="run_yolo")continue;const s=le(n);if(!s.ok){r+=1,a.push(s.reasonCode);continue}const o=s.directive;if(!e.store.jobExists(o.jobId)){r+=1,a.push(N.BYPASS_BLOCKED);continue}const u=Ie(o);if(e.store.hasCompletedHeadlessExecutionDirectiveHash(u)){a.push(m.EXECUTION_COMPLETED);continue}const d=X({autonomousKind:"run_yolo",source:fe(o.metadata,"headless-run-yolo"),targetKind:"story",targetRef:o.targetRef,storyId:o.storyId??x(o.targetRef),jobId:o.jobId,operationSeed:o.operationId,commandHash:w(o.commandRef)}),c=Y(e.store,d,e.nowIso,{requireExistingJob:!0});if(!c.ok){r+=1,a.push(c.reasonCode);continue}const l=U("attempt",o.idempotencyKey),_=U("exec",o.operationId),I=e.store.enqueueHeadlessExecutionAttempt({attemptId:l,executionId:_,jobId:o.jobId,directiveHash:u,directiveKind:"run_yolo",commandClass:o.commandClass,targetKind:"story",targetRef:o.targetRef,storyId:o.storyId??x(o.targetRef),runtimeId:o.runtime?.runtimeId,modelId:o.runtime?.modelId,runtimeSource:he(o.runtime?.source),reasonCode:o.reasonCode,publicSummary:o.publicSummary,enqueuedAt:e.nowIso,notBeforeAt:e.nowIso,maxAttempts:e.maxAttempts,queueCap:e.queueCap,operationId:`${o.operationId}:enqueue`,idempotencyKey:o.idempotencyKey,counts:{directives:1},hashes:{directive:u},redactionSummary:o.redactionSummary,relativePaths:[o.targetRef],metadata:B(d,{schemaVersion:1,contractVersion:"continuity-v1",jobId:o.jobId,operationId:o.operationId,reasonCode:o.reasonCode??m.OK,targetRef:o.targetRef,directiveHash:u})});if(!I.accepted){r+=1,a.push(I.reasonCode??"queue-cap-reached");continue}I.inserted&&(t+=1),a.push(m.OK)}return{enqueuedCount:t,rejectedCount:r,reasonCodes:L(a)}}async function ie(e){const t=e.now(),r=e.idFactory("lease",e.attempt.attempt_id),a=$(t,e.leaseMs);if(!e.store.claimHeadlessExecutionAttempt({attemptId:e.attempt.attempt_id,leaseId:r,runnerId:e.runnerId,claimedAt:t,leaseExpiresAt:a,reasonCode:m.OK}).inserted)return{attemptId:e.attempt.attempt_id,executionId:e.attempt.execution_id,jobId:e.attempt.job_id,status:e.attempt.status,outcome:"ignored",reasonCode:"lease-conflict",timestamp:t,redactionSummary:[],publicSafe:!0};if(e.store.hasCompletedHeadlessExecutionDirectiveHash(e.attempt.directive_hash,e.attempt.attempt_id))return R(e.store,e.attempt,{leaseId:r,runnerId:e.runnerId,status:"skipped",receiptStatus:"ignored",reasonCode:m.EXECUTION_COMPLETED,publicSummary:"Skipped duplicate run_yolo directive because the directive hash is already completed.",completedAt:e.now(),counts:{duplicateDirectiveHashes:1},hashes:{directive:e.attempt.directive_hash},redactionSummary:[],relativePaths:[e.attempt.target_ref]});const o=ue(e);if(!o.ok)return R(e.store,e.attempt,{leaseId:r,runnerId:e.runnerId,status:o.status,receiptStatus:o.receiptStatus,reasonCode:o.reasonCode,publicSummary:o.publicSummary,completedAt:e.now(),counts:{rejectedDirectives:1},hashes:{directive:e.attempt.directive_hash},redactionSummary:o.redactionSummary,relativePaths:K(e.attempt)});const u=e.registry.getAdapter(o.input.runtimeId);if(!u.ok)return R(e.store,e.attempt,{leaseId:r,runnerId:e.runnerId,status:"failed",receiptStatus:"failed",reasonCode:u.reasonCode,publicSummary:u.publicSummary,completedAt:e.now(),counts:{rejectedAdapters:1},hashes:{directive:e.attempt.directive_hash},redactionSummary:u.redactionSummary,relativePaths:[e.attempt.target_ref],runtimeId:o.input.runtimeId,modelId:o.input.modelId,runtimeSource:o.input.runtimeSource});let d;try{d=await u.adapter.execute(o.input,{...e.adapterOptions,cwd:e.adapterOptions?.cwd??e.projectRoot})}catch{d={status:"failed",adapterId:o.input.runtimeId,runtimeId:o.input.runtimeId,...o.input.modelId?{modelId:o.input.modelId}:{},...o.input.runtimeSource?{runtimeSource:o.input.runtimeSource}:{},reasonCode:m.EXECUTION_FAILED,reasonCodes:[m.EXECUTION_FAILED,m.RECEIPT_REDACTED],exitCode:1,signal:null,durationMs:0,counts:{adapterExceptions:1},hashes:{directive:e.attempt.directive_hash},publicSummary:"Headless adapter failed with public-safe exception summary.",redactionSummary:[i("adapter","raw_log","value-denied")],relativePaths:[e.attempt.target_ref],receipt:o.input.receipt,publicSafe:!0}}const c=ye(e.attempt,d,e.maxAttempts,e.backoffMs,e.now()),l=c.retry?"backoff":d.status,_=c.retry?m.EXECUTION_BACKOFF:d.reasonCode,I=l==="completed"?"applied":l==="backoff"?"deferred":l==="skipped"?"ignored":"failed";return R(e.store,e.attempt,{leaseId:r,runnerId:e.runnerId,status:l,receiptStatus:I,reasonCode:_,publicSummary:c.retry?"Headless run_yolo execution scheduled bounded retry after transient adapter outcome.":d.publicSummary,completedAt:e.now(),durationMs:d.durationMs,notBeforeAt:c.notBeforeAt,retryCount:c.retryCount,counts:d.counts,hashes:{...d.hashes,directive:e.attempt.directive_hash},redactionSummary:d.redactionSummary,relativePaths:d.relativePaths.length>0?d.relativePaths:[e.attempt.target_ref],runtimeId:d.runtimeId,modelId:d.modelId,runtimeSource:d.runtimeSource})}function ue(e){const t=q(e.attempt.metadata_json,{autonomousKind:"run_yolo",jobId:e.attempt.job_id,targetKind:"story",targetRef:e.attempt.target_ref});if(!t.ok)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:m.DIRECTIVE_REJECTED,publicSummary:t.publicSummary,redactionSummary:t.redactionSummary};const r=me(e.attempt);if(!r.ok)return r;const a=ce(e);return a.ok?{ok:!0,input:{promptKind:"yolo",targetKind:"story",targetRef:e.attempt.target_ref,...e.attempt.story_id?{storyId:e.attempt.story_id}:{},runtimeId:a.runtimeId,...a.modelId?{modelId:a.modelId}:{},runtimeSource:a.runtimeSource,timeoutMs:e.timeoutMs,receipt:{attemptId:e.attempt.attempt_id,subagentId:e.attempt.attempt_id,executionId:e.attempt.execution_id,jobId:e.attempt.job_id,operationId:e.attempt.execution_id,idempotencyKey:e.attempt.directive_hash,runnerId:e.runnerId},publicSummary:C(e.attempt.public_summary??"Headless run_yolo execution attempt."),publicSafe:!0}}:{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:a.reasonCode,publicSummary:a.publicSummary,redactionSummary:a.redactionSummary}}function ce(e){const t=e.runtimeDefaults!==void 0?e.runtimeDefaults:G({projectRoot:e.projectRoot});if(S(t)&&t.ok===!1)return{ok:!1,reasonCode:m.RUNTIME_UNTRUSTED,publicSummary:typeof t.publicSummary=="string"?t.publicSummary:"Headless runtime defaults failed public-safety validation.",redactionSummary:Array.isArray(t.redactionSummary)?t.redactionSummary:[]};const r=Ee(e.attempt.runtime_source)??"explicit",a=e.attempt.runtime_id||e.attempt.model_id?{...e.attempt.runtime_id?{runtimeId:e.attempt.runtime_id}:{},...e.attempt.model_id?{modelId:e.attempt.model_id}:{},source:r,publicSafe:!0}:void 0,n={registry:e.registry,defaults:t,fallback:e.runtimeFallback};a&&(r==="origin"?n.origin=a:r==="default"?n.projectDefault=a:r==="fallback"?n.fallback=a:n.explicit=a);const s=J(n);return s.ok?{ok:!0,runtimeId:s.runtimeId,...s.modelId?{modelId:s.modelId}:{},runtimeSource:s.runtimeSource}:{ok:!1,reasonCode:s.reasonCode,publicSummary:s.publicSummary,redactionSummary:s.redactionSummary}}function me(e){const t=[];e.directive_kind!=="run_yolo"&&t.push(i("directiveKind","unsafe_key","value-denied")),e.target_kind!=="story"&&t.push(i("targetKind","prompt_body","value-denied")),(!D.test(e.target_ref)||E.test(e.target_ref)||p.test(e.target_ref))&&t.push(i("targetRef","prompt_body","value-denied"));const r=x(e.target_ref);return e.story_id&&e.story_id!==r&&t.push(i("storyId","prompt_body","value-denied")),t.length>0?{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:m.PROMPT_REJECTED,publicSummary:"Headless run_yolo attempt did not match the canonical public story prompt shape.",redactionSummary:t}:{ok:!0,input:{promptKind:"yolo",targetKind:"story",targetRef:e.target_ref,...e.story_id?{storyId:e.story_id}:{},runtimeId:"fake",publicSafe:!0}}}function le(e){const t=[];for(const A of Object.keys(e))(!ne.has(A)||g.test(A))&&t.push(i(A,T(A),"key-denied"));e.publicSafe!==!0&&t.push(i("publicSafe","unsafe_key","value-denied"));const r=f(e,"kind"),a=f(e,"commandClass"),n=f(e,"jobId"),s=f(e,"operationId"),o=f(e,"idempotencyKey"),u=f(e,"targetKind"),d=f(e,"targetRef"),c=f(e,"commandRef"),l=f(e,"publicSummary"),_=f(e,"storyId");r!=="run_yolo"&&t.push(i("kind","unsafe_key","value-denied")),a!=="goal-tick"&&a!=="loop-tick"&&t.push(i("commandClass","unsafe_key","value-denied")),j(n)||t.push(i("jobId","unsafe_key","value-denied")),j(s)||t.push(i("operationId","unsafe_key","value-denied")),j(o)||t.push(i("idempotencyKey","unsafe_key","value-denied")),(u!=="story"||!d||!D.test(d)||p.test(d))&&t.push(i("targetRef","prompt_body","value-denied"));const I=d?`*yolo @${d}`:void 0;(!c||c!==I||c.includes("@neocortex")||E.test(c)||p.test(c))&&t.push(i("commandRef","prompt_body","value-denied")),_&&d&&_!==x(d)&&t.push(i("storyId","prompt_body","value-denied")),(!l||l.length>240||p.test(l))&&t.push(i("publicSummary","unbounded_text","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||p.test(e.reasonCode))&&t.push(i("reasonCode","unsafe_key","value-denied"));const y=pe(e.runtime,t);e.attempts!==void 0&&k(e.attempts,"attempts",t),e.metadata!==void 0&&k(e.metadata,"metadata",t);const b=S(e.metadata)?e.metadata:void 0,M=Se(e.redactionSummary,t);return t.length>0||r!=="run_yolo"||!a||!n||!s||!o||!d||!c||!l?{ok:!1,reasonCode:t.some(H=>H.reason==="prompt_body")?m.PROMPT_REJECTED:m.DIRECTIVE_REJECTED,redactionSummary:t}:{ok:!0,directive:{kind:"run_yolo",commandClass:a,jobId:n,operationId:s,idempotencyKey:o,targetKind:"story",targetRef:d,commandRef:c,..._?{storyId:_}:{},...y?{runtime:y}:{},publicSummary:l,...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},...b?{metadata:b}:{},...M.length>0?{redactionSummary:M}:{},publicSafe:!0}}}function fe(e,t){return e?.governanceSource==="delegated-subagent"?"delegated-subagent":t}function pe(e,t){if(e===void 0)return;if(!S(e)){t.push(i("runtime","unsafe_key","value-denied"));return}for(const s of Object.keys(e))(!se.has(s)||g.test(s))&&t.push(i(`runtime.${s}`,T(s),"key-denied"));e.publicSafe!==!0&&t.push(i("runtime.publicSafe","unsafe_key","value-denied"));const r=f(e,"runtimeId"),a=f(e,"modelId"),n=f(e,"source");if(r&&(!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,79}$/.test(r)||p.test(r)||E.test(r))&&t.push(i("runtime.runtimeId","unsafe_key","value-denied")),a&&(!/^[A-Za-z0-9][A-Za-z0-9._:+/-]{0,119}$/.test(a)||p.test(a)||E.test(a))&&t.push(i("runtime.modelId","unsafe_key","value-denied")),n!==void 0&&n!=="explicit"&&n!=="origin"&&n!=="default"&&n!=="fallback"&&n!=="unspecified"&&t.push(i("runtime.source","unsafe_key","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||p.test(e.reasonCode))&&t.push(i("runtime.reasonCode","unsafe_key","value-denied")),e.publicSafe===!0)return{...r?{runtimeId:r}:{},...a?{modelId:a}:{},...n==="explicit"||n==="origin"||n==="default"||n==="fallback"||n==="unspecified"?{source:n}:{},...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},publicSafe:!0}}function R(e,t,r){const a=r.redactionSummary??[],n=r.relativePaths??K(t),s=P(r.counts),o=P(r.hashes),u={schemaVersion:1,contractVersion:"continuity-v1",attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,directiveHash:t.directive_hash,status:r.status,reasonCode:r.reasonCode,...r.runtimeId?{runtimeId:r.runtimeId}:{},...r.modelId?{modelId:r.modelId}:{},...r.runtimeSource?{runtimeSource:r.runtimeSource}:{},...r.retryCount!==void 0?{retryCount:r.retryCount}:{},...r.reasonCode===N.BYPASS_BLOCKED?{governanceEvidence:V}:{},publicSummary:C(r.publicSummary)};return e.completeHeadlessExecutionAttempt({attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,leaseId:r.leaseId,runnerId:r.runnerId,status:r.status,completedAt:r.completedAt,durationMs:r.durationMs,reasonCode:r.reasonCode,publicSummary:C(r.publicSummary),notBeforeAt:r.notBeforeAt,retryCount:r.retryCount,counts:s,hashes:o,redactionSummary:a,relativePaths:n,metadata:u}),e.recordHeadlessExecutionReceipt({receiptId:`receipt-${v("headless",`${t.attempt_id}-${r.status}`)}`,attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,status:r.receiptStatus,reasonCode:r.reasonCode,createdAt:r.completedAt,operationId:`${t.execution_id}:${r.status}:receipt`,idempotencyKey:`${t.directive_hash}:${r.status}:receipt`,counts:s,hashes:o,redactionSummary:a,relativePaths:n,metadata:u}),e.recordHeadlessExecutionSummary({eventId:`event-${v("headless-summary",`${t.attempt_id}-${r.status}`)}`,attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,status:r.status,runtimeId:r.runtimeId,modelId:r.modelId,publicSummary:C(r.publicSummary),reasonCode:r.reasonCode,createdAt:r.completedAt,durationMs:r.durationMs,counts:s,hashes:o,redactionSummary:a,relativePaths:n,metadata:u}),{attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,status:r.status,outcome:r.receiptStatus,reasonCode:r.reasonCode,timestamp:r.completedAt,redactionSummary:a,publicSafe:!0}}function ye(e,t,r,a,n){if(!(t.status==="timed_out"||t.reasonCode===m.EXECUTION_FAILED||t.reasonCode===m.ADAPTER_UNAVAILABLE))return{retry:!1};const o=e.retry_count+1;if(o>=Math.max(1,e.max_attempts||r))return{retry:!1,retryCount:o};const u=Math.min(8,2**Math.max(0,e.retry_count));return{retry:!0,retryCount:o,notBeforeAt:$(n,a*u)}}function _e(e){const t=Array.isArray(e)?e:e?[e]:[],r=[];for(const a of t){const n=a.continuityExecutionDirectives;Array.isArray(n)&&r.push(...n)}return r}function Ie(e){return w(O({kind:e.kind,commandClass:e.commandClass,jobId:e.jobId,targetRef:e.targetRef,commandRef:e.commandRef,storyId:e.storyId,runtime:e.runtime}))}function O(e){return Array.isArray(e)?`[${e.map(O).join(",")}]`:S(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${O(e[t])}`).join(",")}}`:JSON.stringify(e)}function k(e,t,r){if(typeof e=="string"){(p.test(e)||E.test(e))&&r.push(i(t,T(t),"value-denied"));return}if(!(e==null||typeof e=="number"||typeof e=="boolean")){if(Array.isArray(e)){e.forEach((a,n)=>k(a,`${t}.${n}`,r));return}if(S(e)){for(const[a,n]of Object.entries(e)){const s=`${t}.${a}`;g.test(a)&&r.push(i(s,T(a),"key-denied")),k(n,s,r)}return}r.push(i(t,"unsafe_key","value-denied"))}}function Se(e,t){if(e===void 0)return[];if(!Array.isArray(e))return t.push(i("redactionSummary","unsafe_key","value-denied")),[];const r=[];for(const[a,n]of e.entries()){if(!S(n)||n.publicSafe!==!0){t.push(i(`redactionSummary.${a}`,"unsafe_key","value-denied"));continue}const s=f(n,"field"),o=f(n,"reason"),u=f(n,"evidence");if(!s||!o||!u||p.test(s)||p.test(o)||p.test(u)){t.push(i(`redactionSummary.${a}`,"unsafe_key","value-denied"));continue}r.push({field:s,reason:o,evidence:u,publicSafe:!0})}return r}function K(e){return D.test(e.target_ref)?[e.target_ref]:[]}function P(e){if(!e)return;const t={};for(const[r,a]of Object.entries(e))!/^[A-Za-z0-9_.:-]{1,80}$/.test(r)||g.test(r)||p.test(r)||typeof a=="string"&&p.test(a)||(t[r]=a);return Object.keys(t).length>0?t:void 0}function x(e){return e.replace(/^docs\/stories\//,"").replace(/\.story\.md$/,"")}function Ee(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback")return e}function he(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback"||e==="unspecified")return e}function T(e){return/prompt|commandRef/i.test(e)?"prompt_body":/std(?:out|err)|raw|log|transcript|stack/i.test(e)?"raw_log":/url/i.test(e)?"private_url":/path|cwd|argv|args|shell|command|binary|executable/i.test(e)?"executable_path":/secret|token|password|authorization|api[_-]?key|license/i.test(e)?"secret_or_pii":"unsafe_key"}function f(e,t){return typeof e[t]=="string"?e[t]:void 0}function j(e){return!!(e&&ae.test(e)&&!p.test(e)&&!E.test(e))}function S(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function v(e,t){const r=`${e}-${t}`.replace(/[^A-Za-z0-9_.:-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0&&r.length<=120?r:`${e}-${F("sha256").update(t).digest("hex").slice(0,32)}`}function U(e,t){return v(e,t)}function be(e,t){return v(e,`${t}-${Date.now()}-${z(4).toString("hex")}`)}function $(e,t){const r=Date.parse(e);return new Date((Number.isFinite(r)?r:Date.now())+t).toISOString()}function h(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,Math.floor(e))):t}function L(e){return Array.from(new Set(e))}export{ee as DEFAULT_HEADLESS_EXECUTION_BACKOFF_MS,W as DEFAULT_HEADLESS_EXECUTION_LEASE_MS,re as DEFAULT_HEADLESS_EXECUTION_LIMIT,oe as DEFAULT_HEADLESS_EXECUTION_MAX_ATTEMPTS,Q as DEFAULT_HEADLESS_EXECUTION_STALE_LEASE_AFTER_MS,te as DEFAULT_HEADLESS_EXECUTION_TIMEOUT_MS,U as headlessExecutionEntityId,xe as runYoloExecutionPhase};
|
|
1
|
+
import{createHash as V,randomBytes as B}from"node:crypto";import{AUTONOMOUS_GOVERNANCE_EVIDENCE_TAG as X,AUTONOMOUS_GOVERNANCE_REASON_CODES as $,autonomousGovernanceMetadata as q,buildAutonomousGovernanceEnvelope as Y,readAutonomousGovernanceEnvelopeFromMetadata as Z,recordAutonomousGovernance as G}from"../../continuity/autonomous-governance.js";import{createDefaultHeadlessAdapterRegistry as J}from"./adapters.js";import{loadHeadlessRuntimeDefaults as W,resolveHeadlessRuntime as Q}from"./resolver.js";import{HEADLESS_REASON_CODES as m,boundPublicSummary as A,hashPublicValue as g,redaction as d}from"./types.js";const ee=300*1e3,te=30*1e3,re=30*1e3,oe=600*1e3,ae=1,ne=3,O=/^docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,se=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/,de=new Set(["schemaVersion","contractVersion","kind","commandClass","jobId","operationId","idempotencyKey","targetKind","targetRef","commandRef","storyId","executionMode","runtime","publicSummary","reasonCode","attempts","metadata","redactionSummary","publicSafe"]),ie=new Set(["runtimeId","modelId","source","reasonCode","publicSafe"]),R=/(raw[_-]?(?:logs?|payloads?)|std(?:out|err)|stack(?:[_-]?trace)?|transcript|objective(?:[_-]?(?:text|body|prompt))|prompt(?:[_-]?(?:body|text))?|private[_-]?(?:urls?|prompts?)|secret|token|password|protected(?:[_-]?(?:field|body|bodies|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|\bpii\b|authorization|api[_-]?key|license[_-]?key|argv|args|executable(?:[_-]?path)?|binary(?:[_-]?path)?|shell|cwd|command[_-]?path|vendor(?:[_-]?(?:payload|corpus|response|output)))/i,y=/(https?:\/\/\S+|(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)|ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=|raw[_-]?(?:logs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS|P190[_-]?SYNTHETIC[_-]?(?:HEADLESS|CONTINUITY))/i,b=/(?:[;&|`$<>]|\$\(|\n|\r|\0)/;async function Te(e){const t=e.adapterRegistry??J(),r=E(e.limit??ae,1,10),a=E(e.leaseMs??ee,1e3,3600*1e3),n=E(e.staleLeaseAfterMs??te,0,1440*60*1e3),s=E(e.maxAttempts??ne,1,10),o=[],u=[],i=e.now(),c=ue({store:e.store,metadata:e.metadata,nowIso:i,maxAttempts:s,queueCap:e.queueCap});o.push(...c.reasonCodes);const p=e.store.recoverStaleHeadlessExecutionAttempts({nowIso:i,staleAfterMs:n,limit:r*2});p.recoveredAttemptIds.length>0&&(o.push(m.EXECUTION_BACKOFF),p.failedAttemptIds.length>0&&o.push(m.EXECUTION_TIMEOUT));const I=new Set(e.attemptIds??[]),_=e.store.listDueHeadlessExecutionAttempts({nowIso:e.now(),limit:Math.max(r*5,10)}).filter(l=>l.directive_kind==="run_yolo").filter(l=>I.size===0||I.has(l.attempt_id)).slice(0,r);for(const l of _){const S=await ce({store:e.store,projectRoot:e.projectRoot,runnerId:e.runnerId,attempt:l,registry:t,now:e.now,leaseMs:a,timeoutMs:E(e.timeoutMs??oe,1e3,18e5),backoffMs:E(e.backoffMs??re,1e3,36e5),maxAttempts:s,adapterOptions:e.adapterOptions,runtimeDefaults:e.runtimeDefaults,runtimeFallback:e.runtimeFallback,idFactory:e.idFactory??Ae});u.push(S),o.push(S.reasonCode)}return{ok:u.every(l=>l.outcome!=="failed")&&c.rejectedCount===0,enqueuedAttemptCount:c.enqueuedCount,dueAttemptCount:_.length,processedAttemptCount:u.filter(l=>l.outcome!=="ignored").length,recoveredAttemptIds:p.recoveredAttemptIds,receipts:u,reasonCodes:L(o.length>0?o:[m.OK]),publicSafe:!0}}function ue(e){let t=0,r=0;const a=[];for(const n of he(e.metadata)){if(!h(n)||n.kind!=="run_yolo")continue;const s=pe(n);if(!s.ok){r+=1,a.push(s.reasonCode);continue}const o=s.directive;if(!e.store.jobExists(o.jobId)){r+=1,a.push($.BYPASS_BLOCKED);continue}const u=Se(o);if(e.store.hasCompletedHeadlessExecutionDirectiveHash(u)){a.push(m.EXECUTION_COMPLETED);continue}const i=Y({autonomousKind:"run_yolo",source:ye(o.metadata,"headless-run-yolo"),targetKind:"story",targetRef:o.targetRef,storyId:o.storyId??v(o.targetRef),jobId:o.jobId,operationSeed:o.operationId,commandHash:g(o.commandRef)}),c=G(e.store,i,e.nowIso,{requireExistingJob:!0});if(!c.ok){r+=1,a.push(c.reasonCode);continue}const p=H("attempt",o.idempotencyKey),I=H("exec",o.operationId),_=e.store.enqueueHeadlessExecutionAttempt({attemptId:p,executionId:I,jobId:o.jobId,directiveHash:u,directiveKind:"run_yolo",commandClass:o.commandClass,targetKind:"story",targetRef:o.targetRef,storyId:o.storyId??v(o.targetRef),runtimeId:o.runtime?.runtimeId,modelId:o.runtime?.modelId,runtimeSource:Ce(o.runtime?.source),reasonCode:o.reasonCode,publicSummary:o.publicSummary,enqueuedAt:e.nowIso,notBeforeAt:e.nowIso,maxAttempts:e.maxAttempts,queueCap:e.queueCap,operationId:`${o.operationId}:enqueue`,idempotencyKey:o.idempotencyKey,counts:{directives:1},hashes:{directive:u},redactionSummary:o.redactionSummary,relativePaths:[o.targetRef],metadata:q(i,{schemaVersion:1,contractVersion:"continuity-v1",jobId:o.jobId,operationId:o.operationId,reasonCode:o.reasonCode??m.OK,targetRef:o.targetRef,directiveHash:u,...o.executionMode?{executionMode:o.executionMode}:{}})});if(!_.accepted){r+=1,a.push(_.reasonCode??"queue-cap-reached");continue}_.inserted&&(t+=1),a.push(m.OK)}return{enqueuedCount:t,rejectedCount:r,reasonCodes:L(a)}}async function ce(e){const t=e.now(),r=e.idFactory("lease",e.attempt.attempt_id),a=U(t,e.leaseMs);if(!e.store.claimHeadlessExecutionAttempt({attemptId:e.attempt.attempt_id,leaseId:r,runnerId:e.runnerId,claimedAt:t,leaseExpiresAt:a,reasonCode:m.OK}).inserted)return{attemptId:e.attempt.attempt_id,executionId:e.attempt.execution_id,jobId:e.attempt.job_id,status:e.attempt.status,outcome:"ignored",reasonCode:"lease-conflict",timestamp:t,redactionSummary:[],publicSafe:!0};if(e.store.hasCompletedHeadlessExecutionDirectiveHash(e.attempt.directive_hash,e.attempt.attempt_id))return k(e.store,e.attempt,{leaseId:r,runnerId:e.runnerId,status:"skipped",receiptStatus:"ignored",reasonCode:m.EXECUTION_COMPLETED,publicSummary:"Skipped duplicate run_yolo directive because the directive hash is already completed.",completedAt:e.now(),counts:{duplicateDirectiveHashes:1},hashes:{directive:e.attempt.directive_hash},redactionSummary:[],relativePaths:[e.attempt.target_ref]});const o=me(e);if(!o.ok)return k(e.store,e.attempt,{leaseId:r,runnerId:e.runnerId,status:o.status,receiptStatus:o.receiptStatus,reasonCode:o.reasonCode,publicSummary:o.publicSummary,completedAt:e.now(),counts:{rejectedDirectives:1},hashes:{directive:e.attempt.directive_hash},redactionSummary:o.redactionSummary,relativePaths:P(e.attempt)});const u=e.registry.getAdapter(o.input.runtimeId);if(!u.ok)return k(e.store,e.attempt,{leaseId:r,runnerId:e.runnerId,status:"failed",receiptStatus:"failed",reasonCode:u.reasonCode,publicSummary:u.publicSummary,completedAt:e.now(),counts:{rejectedAdapters:1},hashes:{directive:e.attempt.directive_hash},redactionSummary:u.redactionSummary,relativePaths:[e.attempt.target_ref],runtimeId:o.input.runtimeId,modelId:o.input.modelId,runtimeSource:o.input.runtimeSource});let i;try{i=await u.adapter.execute(o.input,{...e.adapterOptions,cwd:e.adapterOptions?.cwd??e.projectRoot})}catch{i={status:"failed",adapterId:o.input.runtimeId,runtimeId:o.input.runtimeId,...o.input.modelId?{modelId:o.input.modelId}:{},...o.input.runtimeSource?{runtimeSource:o.input.runtimeSource}:{},reasonCode:m.EXECUTION_FAILED,reasonCodes:[m.EXECUTION_FAILED,m.RECEIPT_REDACTED],exitCode:1,signal:null,durationMs:0,counts:{adapterExceptions:1},hashes:{directive:e.attempt.directive_hash},publicSummary:"Headless adapter failed with public-safe exception summary.",redactionSummary:[d("adapter","raw_log","value-denied")],relativePaths:[e.attempt.target_ref],receipt:o.input.receipt,publicSafe:!0}}const c=Ie(e.attempt,i,e.maxAttempts,e.backoffMs,e.now()),p=c.retry?"backoff":i.status,I=c.retry?m.EXECUTION_BACKOFF:i.reasonCode,_=p==="completed"?"applied":p==="backoff"?"deferred":p==="skipped"?"ignored":"failed";return k(e.store,e.attempt,{leaseId:r,runnerId:e.runnerId,status:p,receiptStatus:_,reasonCode:I,publicSummary:c.retry?"Headless run_yolo execution scheduled bounded retry after transient adapter outcome.":i.publicSummary,completedAt:e.now(),durationMs:i.durationMs,notBeforeAt:c.notBeforeAt,retryCount:c.retryCount,counts:i.counts,hashes:{...i.hashes,directive:e.attempt.directive_hash},redactionSummary:i.redactionSummary,relativePaths:i.relativePaths.length>0?i.relativePaths:[e.attempt.target_ref],runtimeId:i.runtimeId,modelId:i.modelId,runtimeSource:i.runtimeSource})}function me(e){const t=Z(e.attempt.metadata_json,{autonomousKind:"run_yolo",jobId:e.attempt.job_id,targetKind:"story",targetRef:e.attempt.target_ref});if(!t.ok)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:m.DIRECTIVE_REJECTED,publicSummary:t.publicSummary,redactionSummary:t.redactionSummary};const r=g(`*yolo @${e.attempt.target_ref}`),a=g(`*yolo @${e.attempt.target_ref} branchless-preparation`),n=t.envelope.hashes.command===a;if(!n&&t.envelope.hashes.command!==r)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:m.DIRECTIVE_REJECTED,publicSummary:"Headless run_yolo governance command does not match an authorized execution mode.",redactionSummary:[d("autonomousGovernance.commandHash","prompt_body","operation-denied")]};const s=fe(e.attempt);if(!s.ok)return s;const o=le(e);return o.ok?{ok:!0,input:{promptKind:n?"yolo-branchless-preparation":"yolo",targetKind:"story",targetRef:e.attempt.target_ref,...e.attempt.story_id?{storyId:e.attempt.story_id}:{},runtimeId:o.runtimeId,...o.modelId?{modelId:o.modelId}:{},runtimeSource:o.runtimeSource,timeoutMs:e.timeoutMs,receipt:{attemptId:e.attempt.attempt_id,subagentId:e.attempt.attempt_id,executionId:e.attempt.execution_id,jobId:e.attempt.job_id,operationId:e.attempt.execution_id,idempotencyKey:e.attempt.directive_hash,runnerId:e.runnerId},publicSummary:A(e.attempt.public_summary??"Headless run_yolo execution attempt."),publicSafe:!0}}:{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:o.reasonCode,publicSummary:o.publicSummary,redactionSummary:o.redactionSummary}}function le(e){const t=e.runtimeDefaults!==void 0?e.runtimeDefaults:W({projectRoot:e.projectRoot});if(h(t)&&t.ok===!1)return{ok:!1,reasonCode:m.RUNTIME_UNTRUSTED,publicSummary:typeof t.publicSummary=="string"?t.publicSummary:"Headless runtime defaults failed public-safety validation.",redactionSummary:Array.isArray(t.redactionSummary)?t.redactionSummary:[]};const r=Ee(e.attempt.runtime_source)??"explicit",a=e.attempt.runtime_id||e.attempt.model_id?{...e.attempt.runtime_id?{runtimeId:e.attempt.runtime_id}:{},...e.attempt.model_id?{modelId:e.attempt.model_id}:{},source:r,publicSafe:!0}:void 0,n={registry:e.registry,defaults:t,fallback:e.runtimeFallback};a&&(r==="origin"?n.origin=a:r==="default"?n.projectDefault=a:r==="fallback"?n.fallback=a:n.explicit=a);const s=Q(n);return s.ok?{ok:!0,runtimeId:s.runtimeId,...s.modelId?{modelId:s.modelId}:{},runtimeSource:s.runtimeSource}:{ok:!1,reasonCode:s.reasonCode,publicSummary:s.publicSummary,redactionSummary:s.redactionSummary}}function fe(e){const t=[];e.directive_kind!=="run_yolo"&&t.push(d("directiveKind","unsafe_key","value-denied")),e.target_kind!=="story"&&t.push(d("targetKind","prompt_body","value-denied")),(!O.test(e.target_ref)||b.test(e.target_ref)||y.test(e.target_ref))&&t.push(d("targetRef","prompt_body","value-denied"));const r=v(e.target_ref);return e.story_id&&e.story_id!==r&&t.push(d("storyId","prompt_body","value-denied")),t.length>0?{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:m.PROMPT_REJECTED,publicSummary:"Headless run_yolo attempt did not match the canonical public story prompt shape.",redactionSummary:t}:{ok:!0,input:{promptKind:"yolo",targetKind:"story",targetRef:e.target_ref,...e.story_id?{storyId:e.story_id}:{},runtimeId:"fake",publicSafe:!0}}}function pe(e){const t=[];for(const C of Object.keys(e))(!de.has(C)||R.test(C))&&t.push(d(C,T(C),"key-denied"));e.publicSafe!==!0&&t.push(d("publicSafe","unsafe_key","value-denied"));const r=f(e,"kind"),a=f(e,"commandClass"),n=f(e,"jobId"),s=f(e,"operationId"),o=f(e,"idempotencyKey"),u=f(e,"targetKind"),i=f(e,"targetRef"),c=f(e,"commandRef"),p=f(e,"publicSummary"),I=f(e,"storyId"),_=f(e,"executionMode");r!=="run_yolo"&&t.push(d("kind","unsafe_key","value-denied")),a!=="goal-tick"&&a!=="loop-tick"&&t.push(d("commandClass","unsafe_key","value-denied")),j(n)||t.push(d("jobId","unsafe_key","value-denied")),j(s)||t.push(d("operationId","unsafe_key","value-denied")),j(o)||t.push(d("idempotencyKey","unsafe_key","value-denied")),(u!=="story"||!i||!O.test(i)||y.test(i))&&t.push(d("targetRef","prompt_body","value-denied")),_!==void 0&&_!=="branchless_child_preparation"&&t.push(d("executionMode","unsafe_key","value-denied"));const l=h(e.metadata)?e.metadata:void 0,S=_==="branchless_child_preparation";S&&(l?.governanceSource!=="delegated-subagent"||l.childWorkspace!=="branchless_sandbox"||l.integrationOwner!=="root_agent"||l.maxDepth!==1||typeof l.graphRevision!="string"||!/^[a-f0-9]{64}$/.test(l.graphRevision))&&t.push(d("executionMode","unsafe_key","value-denied"));const F=i?`*yolo @${i}${S?" branchless-preparation":""}`:void 0;(!c||c!==F||c.includes("@neocortex")||b.test(c)||y.test(c))&&t.push(d("commandRef","prompt_body","value-denied")),I&&i&&I!==v(i)&&t.push(d("storyId","prompt_body","value-denied")),(!p||p.length>240||y.test(p))&&t.push(d("publicSummary","unbounded_text","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||y.test(e.reasonCode))&&t.push(d("reasonCode","unsafe_key","value-denied"));const N=_e(e.runtime,t);e.attempts!==void 0&&x(e.attempts,"attempts",t),e.metadata!==void 0&&x(e.metadata,"metadata",t);const w=be(e.redactionSummary,t);return t.length>0||r!=="run_yolo"||!a||!n||!s||!o||!i||!c||!p?{ok:!1,reasonCode:t.some(z=>z.reason==="prompt_body")?m.PROMPT_REJECTED:m.DIRECTIVE_REJECTED,redactionSummary:t}:{ok:!0,directive:{kind:"run_yolo",commandClass:a,jobId:n,operationId:s,idempotencyKey:o,targetKind:"story",targetRef:i,commandRef:c,...I?{storyId:I}:{},...S?{executionMode:"branchless_child_preparation"}:{},...N?{runtime:N}:{},publicSummary:p,...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},...l?{metadata:l}:{},...w.length>0?{redactionSummary:w}:{},publicSafe:!0}}}function ye(e,t){return e?.governanceSource==="delegated-subagent"?"delegated-subagent":t}function _e(e,t){if(e===void 0)return;if(!h(e)){t.push(d("runtime","unsafe_key","value-denied"));return}for(const s of Object.keys(e))(!ie.has(s)||R.test(s))&&t.push(d(`runtime.${s}`,T(s),"key-denied"));e.publicSafe!==!0&&t.push(d("runtime.publicSafe","unsafe_key","value-denied"));const r=f(e,"runtimeId"),a=f(e,"modelId"),n=f(e,"source");if(r&&(!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,79}$/.test(r)||y.test(r)||b.test(r))&&t.push(d("runtime.runtimeId","unsafe_key","value-denied")),a&&(!/^[A-Za-z0-9][A-Za-z0-9._:+/-]{0,119}$/.test(a)||y.test(a)||b.test(a))&&t.push(d("runtime.modelId","unsafe_key","value-denied")),n!==void 0&&n!=="explicit"&&n!=="origin"&&n!=="default"&&n!=="fallback"&&n!=="unspecified"&&t.push(d("runtime.source","unsafe_key","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||y.test(e.reasonCode))&&t.push(d("runtime.reasonCode","unsafe_key","value-denied")),e.publicSafe===!0)return{...r?{runtimeId:r}:{},...a?{modelId:a}:{},...n==="explicit"||n==="origin"||n==="default"||n==="fallback"||n==="unspecified"?{source:n}:{},...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},publicSafe:!0}}function k(e,t,r){const a=r.redactionSummary??[],n=r.relativePaths??P(t),s=K(r.counts),o=K(r.hashes),u={schemaVersion:1,contractVersion:"continuity-v1",attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,directiveHash:t.directive_hash,status:r.status,reasonCode:r.reasonCode,...r.runtimeId?{runtimeId:r.runtimeId}:{},...r.modelId?{modelId:r.modelId}:{},...r.runtimeSource?{runtimeSource:r.runtimeSource}:{},...r.retryCount!==void 0?{retryCount:r.retryCount}:{},...r.reasonCode===$.BYPASS_BLOCKED?{governanceEvidence:X}:{},publicSummary:A(r.publicSummary)};return e.completeHeadlessExecutionAttempt({attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,leaseId:r.leaseId,runnerId:r.runnerId,status:r.status,completedAt:r.completedAt,durationMs:r.durationMs,reasonCode:r.reasonCode,publicSummary:A(r.publicSummary),notBeforeAt:r.notBeforeAt,retryCount:r.retryCount,counts:s,hashes:o,redactionSummary:a,relativePaths:n,metadata:u}),e.recordHeadlessExecutionReceipt({receiptId:`receipt-${D("headless",`${t.attempt_id}-${r.status}`)}`,attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,status:r.receiptStatus,reasonCode:r.reasonCode,createdAt:r.completedAt,operationId:`${t.execution_id}:${r.status}:receipt`,idempotencyKey:`${t.directive_hash}:${r.status}:receipt`,counts:s,hashes:o,redactionSummary:a,relativePaths:n,metadata:u}),e.recordHeadlessExecutionSummary({eventId:`event-${D("headless-summary",`${t.attempt_id}-${r.status}`)}`,attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,status:r.status,runtimeId:r.runtimeId,modelId:r.modelId,publicSummary:A(r.publicSummary),reasonCode:r.reasonCode,createdAt:r.completedAt,durationMs:r.durationMs,counts:s,hashes:o,redactionSummary:a,relativePaths:n,metadata:u}),{attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,status:r.status,outcome:r.receiptStatus,reasonCode:r.reasonCode,timestamp:r.completedAt,redactionSummary:a,publicSafe:!0}}function Ie(e,t,r,a,n){if(!(t.status==="timed_out"||t.reasonCode===m.EXECUTION_FAILED||t.reasonCode===m.ADAPTER_UNAVAILABLE))return{retry:!1};const o=e.retry_count+1;if(o>=Math.max(1,e.max_attempts||r))return{retry:!1,retryCount:o};const u=Math.min(8,2**Math.max(0,e.retry_count));return{retry:!0,retryCount:o,notBeforeAt:U(n,a*u)}}function he(e){const t=Array.isArray(e)?e:e?[e]:[],r=[];for(const a of t){const n=a.continuityExecutionDirectives;Array.isArray(n)&&r.push(...n)}return r}function Se(e){return g(M({kind:e.kind,commandClass:e.commandClass,jobId:e.jobId,targetRef:e.targetRef,commandRef:e.commandRef,storyId:e.storyId,executionMode:e.executionMode,runtime:e.runtime}))}function M(e){return Array.isArray(e)?`[${e.map(M).join(",")}]`:h(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${M(e[t])}`).join(",")}}`:JSON.stringify(e)}function x(e,t,r){if(typeof e=="string"){(y.test(e)||b.test(e))&&r.push(d(t,T(t),"value-denied"));return}if(!(e==null||typeof e=="number"||typeof e=="boolean")){if(Array.isArray(e)){e.forEach((a,n)=>x(a,`${t}.${n}`,r));return}if(h(e)){for(const[a,n]of Object.entries(e)){const s=`${t}.${a}`;R.test(a)&&r.push(d(s,T(a),"key-denied")),x(n,s,r)}return}r.push(d(t,"unsafe_key","value-denied"))}}function be(e,t){if(e===void 0)return[];if(!Array.isArray(e))return t.push(d("redactionSummary","unsafe_key","value-denied")),[];const r=[];for(const[a,n]of e.entries()){if(!h(n)||n.publicSafe!==!0){t.push(d(`redactionSummary.${a}`,"unsafe_key","value-denied"));continue}const s=f(n,"field"),o=f(n,"reason"),u=f(n,"evidence");if(!s||!o||!u||y.test(s)||y.test(o)||y.test(u)){t.push(d(`redactionSummary.${a}`,"unsafe_key","value-denied"));continue}r.push({field:s,reason:o,evidence:u,publicSafe:!0})}return r}function P(e){return O.test(e.target_ref)?[e.target_ref]:[]}function K(e){if(!e)return;const t={};for(const[r,a]of Object.entries(e))!/^[A-Za-z0-9_.:-]{1,80}$/.test(r)||R.test(r)||y.test(r)||typeof a=="string"&&y.test(a)||(t[r]=a);return Object.keys(t).length>0?t:void 0}function v(e){return e.replace(/^docs\/stories\//,"").replace(/\.story\.md$/,"")}function Ee(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback")return e}function Ce(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback"||e==="unspecified")return e}function T(e){return/prompt|commandRef/i.test(e)?"prompt_body":/std(?:out|err)|raw|log|transcript|stack/i.test(e)?"raw_log":/url/i.test(e)?"private_url":/path|cwd|argv|args|shell|command|binary|executable/i.test(e)?"executable_path":/secret|token|password|authorization|api[_-]?key|license/i.test(e)?"secret_or_pii":"unsafe_key"}function f(e,t){return typeof e[t]=="string"?e[t]:void 0}function j(e){return!!(e&&se.test(e)&&!y.test(e)&&!b.test(e))}function h(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function D(e,t){const r=`${e}-${t}`.replace(/[^A-Za-z0-9_.:-]+/g,"-").replace(/^-+|-+$/g,"");return r.length>0&&r.length<=120?r:`${e}-${V("sha256").update(t).digest("hex").slice(0,32)}`}function H(e,t){return D(e,t)}function Ae(e,t){return D(e,`${t}-${Date.now()}-${B(4).toString("hex")}`)}function U(e,t){const r=Date.parse(e);return new Date((Number.isFinite(r)?r:Date.now())+t).toISOString()}function E(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,Math.floor(e))):t}function L(e){return Array.from(new Set(e))}export{re as DEFAULT_HEADLESS_EXECUTION_BACKOFF_MS,ee as DEFAULT_HEADLESS_EXECUTION_LEASE_MS,ae as DEFAULT_HEADLESS_EXECUTION_LIMIT,ne as DEFAULT_HEADLESS_EXECUTION_MAX_ATTEMPTS,te as DEFAULT_HEADLESS_EXECUTION_STALE_LEASE_AFTER_MS,oe as DEFAULT_HEADLESS_EXECUTION_TIMEOUT_MS,H as headlessExecutionEntityId,Te as runYoloExecutionPhase};
|
|
@@ -7,11 +7,14 @@
|
|
|
7
7
|
import { type ContinuityHeadlessExecutionAttemptStatus, type ContinuitySqliteStore } from '../../continuity/sqlite-store.js';
|
|
8
8
|
import { HeadlessAdapterRegistry } from './adapters.js';
|
|
9
9
|
import { type HeadlessAdapterExecutionOptions, type HeadlessAdapterId, type HeadlessRedactionEvidence } from './types.js';
|
|
10
|
+
import { type ContinuousStoryWorkspaceManager } from './continuous-story-workspace.js';
|
|
11
|
+
import { type EpicTerminalGitAdapter } from './epic-terminal-git-runner.js';
|
|
12
|
+
export type { ContinuousStoryWorkspaceManager } from './continuous-story-workspace.js';
|
|
10
13
|
export declare const DEFAULT_HEADLESS_YOLOOP_MAX_ITERATIONS = 20;
|
|
11
14
|
export declare const DEFAULT_HEADLESS_YOLOOP_MAX_DURATION_MS: number;
|
|
12
15
|
export declare const DEFAULT_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP = 1;
|
|
13
16
|
export declare const MAX_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP = 10;
|
|
14
|
-
export declare const RUN_YOLOOP_DRIVER_STATES: readonly ["start", "metadata_parse", "child_story_delegation", "reinvoke", "complete", "aborted", "backoff"];
|
|
17
|
+
export declare const RUN_YOLOOP_DRIVER_STATES: readonly ["start", "lifecycle_evidence", "metadata_parse", "child_story_delegation", "reinvoke", "git_reconciliation", "terminal_git", "complete", "aborted", "backoff"];
|
|
15
18
|
export type RunYoloopDriverState = (typeof RUN_YOLOOP_DRIVER_STATES)[number];
|
|
16
19
|
export interface RunYoloopRootInvokeInput {
|
|
17
20
|
readonly projectRoot: string;
|
|
@@ -61,6 +64,8 @@ export interface RunYoloopExecutionPhaseOptions {
|
|
|
61
64
|
readonly yoloopInvoker?: RunYoloopRootInvoker;
|
|
62
65
|
readonly idFactory?: (prefix: string, attemptId: string) => string;
|
|
63
66
|
readonly serverUrl?: string;
|
|
67
|
+
readonly continuousWorkspaceManager?: ContinuousStoryWorkspaceManager;
|
|
68
|
+
readonly terminalGitAdapter?: EpicTerminalGitAdapter;
|
|
64
69
|
}
|
|
65
70
|
export interface RunYoloopAggregateCounts {
|
|
66
71
|
readonly iterations: number;
|
|
@@ -86,7 +91,7 @@ export interface RunYoloopExecutionReceipt {
|
|
|
86
91
|
readonly publicSafe: true;
|
|
87
92
|
}
|
|
88
93
|
export interface RunYoloopWorkerPoolSummary {
|
|
89
|
-
readonly mode: 'serial' | 'parallel_wave';
|
|
94
|
+
readonly mode: 'serial' | 'parallel_wave' | 'continuous_dag';
|
|
90
95
|
readonly serverMaxConcurrency: number;
|
|
91
96
|
readonly localCap: number;
|
|
92
97
|
readonly queueCap: number;
|
|
@@ -1 +1,8 @@
|
|
|
1
|
-
import{randomBytes as me}from"node:crypto";import{invoke as pe}from"../../commands/invoke.js";import{AUTONOMOUS_GOVERNANCE_EVIDENCE_TAG as fe,AUTONOMOUS_GOVERNANCE_REASON_CODES as se,autonomousGovernanceMetadata as ye,buildAutonomousGovernanceEnvelope as he,readAutonomousGovernanceEnvelopeFromMetadata as _e,recordAutonomousGovernance as Ce}from"../../continuity/autonomous-governance.js";import{createDefaultHeadlessAdapterRegistry as Ie}from"./adapters.js";import{loadHeadlessRuntimeDefaults as Ae,resolveHeadlessRuntime as Se}from"./resolver.js";import{DEFAULT_HEADLESS_EXECUTION_BACKOFF_MS as be,DEFAULT_HEADLESS_EXECUTION_LEASE_MS as Ee,DEFAULT_HEADLESS_EXECUTION_LIMIT as ge,DEFAULT_HEADLESS_EXECUTION_MAX_ATTEMPTS as Oe,DEFAULT_HEADLESS_EXECUTION_STALE_LEASE_AFTER_MS as ke,DEFAULT_HEADLESS_EXECUTION_TIMEOUT_MS as Re,headlessExecutionEntityId as N,runYoloExecutionPhase as Te}from"./run-yolo.js";import{HEADLESS_REASON_CODES as d,boundPublicSummary as Z,hashPublicValue as R,redaction as f}from"./types.js";import{validatePhasedYoloopPlan as ve}from"./prepared-story-bundle.js";const Pe=20,xe=1800*1e3,ie=1,Le=10,Et=Object.freeze(["start","metadata_parse","child_story_delegation","reinvoke","complete","aborted","backoff"]),G=/^docs\/epics\/epic-[A-Za-z0-9._-]+\.md$/,De=/^docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,J=/^\*yolo @docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,Me=/^(?:\uFEFF)?---(?:\r?\n)/,we=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/,j=/(?:[;&|`$<>]|\$\(|\n|\r|\0)/,Y=/(raw[_-]?(?:logs?|payloads?)|std(?:out|err)|stack(?:[_-]?trace)?|transcript|objective(?:[_-]?(?:text|body|prompt))|prompt(?:[_-]?(?:body|text))?|private[_-]?(?:urls?|prompts?)|secret|token|password|protected(?:[_-]?(?:field|body|bodies|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|\bpii\b|authorization|api[_-]?key|license[_-]?key|argv|args|executable(?:[_-]?path)?|binary(?:[_-]?path)?|shell|cwd|command[_-]?path|vendor(?:[_-]?(?:payload|corpus|response|output)))/i,A=/(https?:\/\/\S+|(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)|ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=|raw[_-]?(?:logs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS|P190[_-]?SYNTHETIC[_-]?(?:HEADLESS|CONTINUITY))/i;function de(e){return Me.test(e)||e.includes("@neocortex")||e.includes("*yoloop")||j.test(e)||A.test(e)}function gt(e){return!de(e)&&J.test(e)}const Ne=new Set(["schemaVersion","contractVersion","kind","commandClass","jobId","operationId","idempotencyKey","targetKind","targetRef","commandRef","epicId","runtime","publicSummary","reasonCode","attempts","metadata","redactionSummary","publicSafe"]),je=new Set(["runtimeId","modelId","source","reasonCode","publicSafe"]),He="job-aborted",Ke="max-iterations-reached",Ue="max-duration-reached";async function $e(e){const o=Date.now(),t=await pe({args:e.args,projectRoot:e.projectRoot,format:"json",platformTarget:"runner",serverUrl:e.serverUrl,strictReadOnly:e.strictReadOnly});return{success:t.success,instructions:t.instructions,metadata:t.metadata,error:t.error,errorCode:t.errorCode,exitCode:t.exitCode,durationMs:Date.now()-o,publicSafe:!0}}async function Ot(e){const o=e.adapterRegistry??Ie(),t=D(e.limit??ge,1,10),r=D(e.leaseMs??Ee,1e3,3600*1e3),a=D(e.staleLeaseAfterMs??ke,0,1440*60*1e3),s=D(e.maxAttempts??Oe,1,10),n=D(e.localConcurrencyCap??ie,1,Le),i=[],l=[],c=e.now(),u=Ye({store:e.store,metadata:e.metadata,nowIso:c,maxAttempts:s,queueCap:e.queueCap});i.push(...u.reasonCodes);const m=e.store.recoverStaleHeadlessExecutionAttempts({nowIso:c,staleAfterMs:a,limit:t*2});m.recoveredAttemptIds.length>0&&(i.push(d.EXECUTION_BACKOFF),m.failedAttemptIds.length>0&&i.push(d.EXECUTION_TIMEOUT));const _=e.store.listDueHeadlessExecutionAttempts({nowIso:e.now(),limit:Math.max(t*5,10)}).filter(y=>y.directive_kind==="run_yoloop").slice(0,t);for(const y of _){const p=await ze({store:e.store,projectRoot:e.projectRoot,runnerId:e.runnerId,attempt:y,registry:o,now:e.now,leaseMs:r,timeoutMs:D(e.timeoutMs??Re,1e3,18e5),backoffMs:D(e.backoffMs??be,1e3,36e5),maxAttempts:s,maxIterations:D(e.maxIterations??Pe,1,100),maxDurationMs:D(e.maxDurationMs??xe,1e3,72e5),localConcurrencyCap:n,queueCap:e.queueCap,adapterOptions:e.adapterOptions,runtimeDefaults:e.runtimeDefaults,runtimeFallback:e.runtimeFallback,yoloopInvoker:e.yoloopInvoker??$e,serverUrl:e.serverUrl,idFactory:e.idFactory??pt});l.push(p),i.push(p.reasonCode,...p.workerPoolSummary.reasonCodes)}return{ok:l.every(y=>y.outcome!=="failed")&&u.rejectedCount===0,enqueuedAttemptCount:u.enqueuedCount,dueAttemptCount:_.length,processedAttemptCount:l.filter(y=>y.outcome!=="ignored").length,recoveredAttemptIds:m.recoveredAttemptIds,receipts:l,reasonCodes:L(i.length>0?i:[d.OK]),publicSafe:!0}}function Ye(e){let o=0,t=0;const r=[];for(const a of st(e.metadata)){if(!C(a)||a.kind!=="run_yoloop")continue;const s=Ze(a);if(!s.ok){t+=1,r.push(s.reasonCode);continue}const n=s.directive;if(!e.store.jobExists(n.jobId)){t+=1,r.push(se.BYPASS_BLOCKED);continue}const i=it(n);if(e.store.hasCompletedHeadlessExecutionDirectiveHash(i)){r.push(d.EXECUTION_COMPLETED);continue}const l=he({autonomousKind:"run_yoloop",source:"headless-run-yoloop",targetKind:"epic",targetRef:n.targetRef,epicId:n.epicId??V(n.targetRef),jobId:n.jobId,operationSeed:n.operationId,commandHash:R(n.commandRef)}),c=Ce(e.store,l,e.nowIso,{requireExistingJob:!0});if(!c.ok){t+=1,r.push(c.reasonCode);continue}const u=N("attempt",n.idempotencyKey),m=N("exec",n.operationId),_=e.store.enqueueHeadlessExecutionAttempt({attemptId:u,executionId:m,jobId:n.jobId,directiveHash:i,directiveKind:"run_yoloop",commandClass:n.commandClass,targetKind:"epic",targetRef:n.targetRef,epicId:n.epicId??V(n.targetRef),runtimeId:n.runtime?.runtimeId,modelId:n.runtime?.modelId,runtimeSource:mt(n.runtime?.source),reasonCode:n.reasonCode,publicSummary:n.publicSummary,enqueuedAt:e.nowIso,notBeforeAt:e.nowIso,maxAttempts:e.maxAttempts,queueCap:e.queueCap,operationId:`${n.operationId}:enqueue`,idempotencyKey:n.idempotencyKey,counts:{directives:1},hashes:{directive:i},redactionSummary:n.redactionSummary,relativePaths:[n.targetRef],metadata:ye(l,{schemaVersion:1,contractVersion:"continuity-v1",jobId:n.jobId,operationId:n.operationId,reasonCode:n.reasonCode??d.OK,targetRef:n.targetRef,directiveHash:i})});if(!_.accepted){t+=1,r.push(_.reasonCode??"queue-cap-reached");continue}_.inserted&&(o+=1),r.push(d.OK)}return{enqueuedCount:o,rejectedCount:t,reasonCodes:L(r)}}async function ze(e){const o=e.now(),t=e.idFactory("lease",e.attempt.attempt_id),r=ue(o,e.leaseMs);if(!e.store.claimHeadlessExecutionAttempt({attemptId:e.attempt.attempt_id,leaseId:t,runnerId:e.runnerId,claimedAt:o,leaseExpiresAt:r,reasonCode:d.OK}).inserted)return rt(e.attempt,{status:e.attempt.status,receiptStatus:"ignored",reasonCode:"lease-conflict",timestamp:o});if(e.store.hasCompletedHeadlessExecutionDirectiveHash(e.attempt.directive_hash,e.attempt.attempt_id))return ee(e.store,e.attempt,{leaseId:t,runnerId:e.runnerId,status:"skipped",receiptStatus:"ignored",reasonCode:d.EXECUTION_COMPLETED,publicSummary:"Skipped duplicate run_yoloop directive because the directive hash is already completed.",completedAt:e.now(),counts:oe(),hashes:{directive:e.attempt.directive_hash},redactionSummary:[],relativePaths:[e.attempt.target_ref],childStoryIds:[],stateTransitions:["start","complete"]});const n=Be(e);if(!n.ok)return ee(e.store,e.attempt,{leaseId:t,runnerId:e.runnerId,status:n.status,receiptStatus:n.receiptStatus,reasonCode:n.reasonCode,publicSummary:n.publicSummary,completedAt:e.now(),counts:oe(),hashes:{directive:e.attempt.directive_hash},redactionSummary:n.redactionSummary,relativePaths:ct(e.attempt),childStoryIds:[],stateTransitions:["start"]});const i=await Fe({...e,prepared:n.input}),l=at(e.attempt,i,e.maxAttempts,e.backoffMs,e.now()),c=l.retry?"backoff":i.status,u=l.retry?"deferred":i.receiptStatus,m=l.retry?d.EXECUTION_BACKOFF:i.reasonCode,_=l.retry?"Headless run_yoloop execution scheduled bounded retry after transient metadata/runtime outcome.":i.publicSummary;return ee(e.store,e.attempt,{leaseId:t,runnerId:e.runnerId,status:c,receiptStatus:u,reasonCode:m,publicSummary:_,completedAt:e.now(),durationMs:i.durationMs,notBeforeAt:l.notBeforeAt,retryCount:l.retryCount,counts:i.counts,workerPoolSummary:i.workerPoolSummary,hashes:{...i.hashes,directive:e.attempt.directive_hash},redactionSummary:i.redactionSummary,relativePaths:i.relativePaths,childStoryIds:i.childStoryIds,runtimeId:n.input.runtimeId,modelId:n.input.modelId,runtimeSource:n.input.runtimeSource,stateTransitions:i.stateTransitions})}async function Fe(e){const o=Date.now(),t=["start"],r=new Set,a=[],s=[],n={root:R(e.prepared.rootPrompt)},i=[f("rootPrompt","prompt_body",n.root)];let l=0,c=0,u=0,m=0,_=0,y=0;const p=ce(e.localConcurrencyCap);for(;;){if(l>=e.maxIterations)return t.push("backoff"),T({status:"failed",receiptStatus:"failed",reasonCode:Ke,publicSummary:"Headless yoloop reached the bounded iteration limit before completion metadata.",retryable:!1,startedAt:o,counts:g(l,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:i,relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});if(Date.now()-o>e.maxDurationMs)return t.push("backoff"),T({status:"failed",receiptStatus:"failed",reasonCode:Ue,publicSummary:"Headless yoloop reached the bounded duration limit before completion metadata.",retryable:!1,startedAt:o,counts:g(l,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:i,relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});t.push("metadata_parse");const h=await e.yoloopInvoker({projectRoot:e.projectRoot,args:e.prepared.rootPrompt,attemptId:e.attempt.attempt_id,executionId:e.attempt.execution_id,jobId:e.attempt.job_id,runnerId:e.runnerId,iteration:l,runtimeId:e.prepared.runtimeId,...e.prepared.modelId?{modelId:e.prepared.modelId}:{},timeoutMs:e.timeoutMs,serverUrl:e.serverUrl});if(h.durationMs!==void 0&&(n[`iter-${l}`]=R(String(h.durationMs))),!h.success)return t.push("backoff"),T({status:"backoff",receiptStatus:"deferred",reasonCode:d.EXECUTION_FAILED,publicSummary:"Headless yoloop root metadata invocation failed with bounded public evidence.",retryable:!0,startedAt:o,counts:g(l,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:i,relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});const O=h.metadata,b=tt(O);if(!b.ok)return t.push("backoff"),T({status:"failed",receiptStatus:"failed",reasonCode:b.reasonCode,publicSummary:b.publicSummary,retryable:!1,startedAt:o,counts:g(l,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:[...i,...b.redactionSummary],relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});if(b.aborted)return y+=1,t.push("aborted"),T({status:"failed",receiptStatus:"failed",reasonCode:He,publicSummary:"Headless yoloop stopped because public metadata reported an aborted loop.",retryable:!1,startedAt:o,counts:g(l+1,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:i,relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});if(b.outcome&&b.outcome!=="selected"&&b.outcome!=="queue_exhausted")return t.push("backoff"),T({status:"failed",receiptStatus:"failed",reasonCode:`yoloop-${b.outcome}`,publicSummary:"Headless yoloop stopped on a non-executable graph-first continuation outcome.",retryable:!1,startedAt:o,counts:g(l+1,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:i,relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});if(b.replay)return t.push("backoff"),T({status:"backoff",receiptStatus:"deferred",reasonCode:"yoloop-replay-pending",publicSummary:"Headless yoloop observed pending replay authority and did not delegate a second child.",retryable:!0,startedAt:o,counts:g(l+1,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:i,relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});if(b.complete)return _+=1,t.push("complete"),T({status:"completed",receiptStatus:"applied",reasonCode:d.EXECUTION_COMPLETED,publicSummary:"Headless yoloop completed after public metadata reported yoloopComplete.",retryable:!1,startedAt:o,counts:g(l+1,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:i,relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});const v=Ge(O,e.prepared.epicId);if(!v.ok)return t.push("backoff"),T({status:"failed",receiptStatus:"failed",reasonCode:v.reasonCode,publicSummary:v.publicSummary,retryable:!1,startedAt:o,counts:g(l+1,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:[...i,...v.redactionSummary],relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});const ae=v.prompts.find(M=>r.has(M.storyId));if(ae)return t.push("backoff"),T({status:"failed",receiptStatus:"failed",reasonCode:d.YOLOOP_ISOLATION_VIOLATION,publicSummary:"Headless yoloop rejected cyclic child story delegation evidence.",retryable:!1,startedAt:o,counts:g(l+1,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:[...i,f("storyId","prompt_body",R(ae.storyId))],relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});p.mode=v.parallelAuthorized?"parallel_wave":"serial",p.serverMaxConcurrency=v.serverMaxConcurrency,p.pendingChildCount=v.prompts.length;const q=[...v.prompts];for(;q.length>0;){const M=qe({store:e.store,nowIso:e.now(),localCap:e.localConcurrencyCap,serverMaxConcurrency:v.serverMaxConcurrency,parallelAuthorized:v.parallelAuthorized});if(p.queueCap=M.queueCap,p.availableLeases=M.availableLeases,p.effectiveConcurrency=M.effectiveConcurrency,p.reasonCodes.push(M.reasonCode),M.effectiveConcurrency===0)return p.backpressurePauseCount+=1,p.pendingChildCount=q.length,t.push("backoff"),T({status:"backoff",receiptStatus:"deferred",reasonCode:d.WORKER_POOL_BACKPRESSURE_PAUSED,publicSummary:"Headless yoloop paused child workers because bounded queue or lease capacity was unavailable.",retryable:!0,startedAt:o,counts:g(l+1,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:i,relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t});const W=q.splice(0,M.effectiveConcurrency);p.startedChildCount+=W.length,p.peakConcurrency=Math.max(p.peakConcurrency,W.length),p.pendingChildCount=q.length,t.push("child_story_delegation");const ne=await Promise.all(W.map(k=>Ve({...e,child:k,iteration:l})));p.completedChildCount+=ne.length;let w;for(const k of ne){const B=k.child;n[`child-${B.storyId.replace(/[^A-Za-z0-9_.:-]/g,"-")}`]=k.commandHash,i.push(k.promptRedaction),a.push(B.storyId),s.push(B.targetRef),r.add(B.storyId);const $=k.receipt;if(!$){k.reasonCodes.includes("queue-cap-reached")?(p.backpressurePauseCount+=1,p.pendingChildCount+=1,p.reasonCodes.push(d.WORKER_POOL_BACKPRESSURE_PAUSED),w??={kind:"deferred",reasonCode:d.WORKER_POOL_BACKPRESSURE_PAUSED}):(u+=1,w??={kind:"missing",reasonCode:d.EXECUTION_FAILED});continue}if($.outcome==="deferred"){w??={kind:"deferred",reasonCode:d.EXECUTION_BACKOFF};continue}if($.outcome==="failed"){u+=1,w??={kind:"failed",reasonCode:$.reasonCode||d.EXECUTION_FAILED};continue}$.outcome==="ignored"?m+=1:c+=1}if(w){const k=w.kind==="deferred";return T({status:k?"backoff":"failed",receiptStatus:k?"deferred":"failed",reasonCode:w.reasonCode,publicSummary:w.kind==="missing"?"Headless yoloop child story delegation did not produce a public receipt.":k?"Headless yoloop child story delegated bounded backoff to the root attempt.":"Headless yoloop child story execution failed with public receipt evidence.",retryable:k,startedAt:o,counts:g(l+1,a.length,c,u,m,_,y),workerPoolSummary:E(p),hashes:n,redactions:i,relativePaths:[e.prepared.targetRef,...s],childStoryIds:a,stateTransitions:t})}}l+=1,t.push("reinvoke")}}async function Ve(e){const o=ot({rootAttempt:e.attempt,child:e.child,iteration:e.iteration,runtimeId:e.prepared.runtimeId,modelId:e.prepared.modelId,runtimeSource:e.prepared.runtimeSource}),t=N("attempt",o.idempotencyKey),r=await Te({store:e.store,projectRoot:e.projectRoot,runnerId:e.runnerId,now:e.now,metadata:{continuityExecutionDirectives:[o]},adapterRegistry:e.registry,adapterOptions:e.adapterOptions,runtimeDefaults:e.runtimeDefaults,runtimeFallback:e.runtimeFallback,timeoutMs:e.timeoutMs,maxAttempts:1,limit:1,queueCap:e.queueCap,attemptIds:[t],idFactory:e.idFactory});return{child:e.child,receipt:r.receipts.find(a=>a.attemptId===t)??r.receipts[0],reasonCodes:r.reasonCodes,commandHash:R(e.child.commandRef),promptRedaction:f(`child.${e.child.storyId}`,"prompt_body",R(e.child.commandRef))}}function qe(e){const o=e.store.collectSnapshotRows({nowIso:e.nowIso,jobLimit:1,staleLeaseLimit:1,receiptLimit:1,eventLimit:1,snapshotLimit:1}),t=Math.max(1,Math.floor(o.queue.capacity)),r=Math.max(0,Math.floor(o.queue.running)-1),a=Math.max(0,e.localCap-r),s=Math.max(0,Math.min(a,Math.floor(o.queue.available))),n=e.parallelAuthorized?Math.max(1,Math.floor(e.serverMaxConcurrency)):1,i=Math.max(0,Math.min(n,e.localCap,t,s));return{queueCap:t,availableLeases:s,effectiveConcurrency:i,reasonCode:i===0?d.WORKER_POOL_BACKPRESSURE_PAUSED:e.parallelAuthorized&&i>1?d.WORKER_POOL_PARALLEL_ACTIVE:d.WORKER_POOL_SERIAL_FALLBACK}}function ce(e){return{mode:"serial",serverMaxConcurrency:1,localCap:e,queueCap:1,availableLeases:1,effectiveConcurrency:1,peakConcurrency:0,pendingChildCount:0,startedChildCount:0,completedChildCount:0,backpressurePauseCount:0,reasonCodes:[]}}function E(e){return{mode:e.mode,serverMaxConcurrency:x(e.serverMaxConcurrency),localCap:x(e.localCap),queueCap:x(e.queueCap),availableLeases:x(e.availableLeases),effectiveConcurrency:x(e.effectiveConcurrency),peakConcurrency:x(e.peakConcurrency),pendingChildCount:x(e.pendingChildCount),startedChildCount:x(e.startedChildCount),completedChildCount:x(e.completedChildCount),backpressurePauseCount:x(e.backpressurePauseCount),reasonCodes:L(e.reasonCodes.length>0?e.reasonCodes:[d.WORKER_POOL_SERIAL_FALLBACK]).slice(0,10),publicSafe:!0}}function Q(e=ie){return E(ce(e))}function x(e){return Number.isFinite(e)?Math.max(0,Math.min(1e4,Math.floor(e))):0}function Be(e){const o=_e(e.attempt.metadata_json,{autonomousKind:"run_yoloop",jobId:e.attempt.job_id,targetKind:"epic",targetRef:e.attempt.target_ref});if(!o.ok)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:o.reasonCode,publicSummary:o.publicSummary,redactionSummary:o.redactionSummary};const t=Xe(e.attempt);if(!t.ok)return t;const r=We(e);if(!r.ok)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:r.reasonCode,publicSummary:r.publicSummary,redactionSummary:r.redactionSummary};const a=e.attempt.epic_id??V(e.attempt.target_ref);return{ok:!0,input:{rootPrompt:`*yoloop @${e.attempt.target_ref}`,targetRef:e.attempt.target_ref,epicId:a,runtimeId:r.runtimeId,...r.modelId?{modelId:r.modelId}:{},runtimeSource:r.runtimeSource,publicSafe:!0}}}function Xe(e){const o=[];e.directive_kind!=="run_yoloop"&&o.push(f("directiveKind","unsafe_key","value-denied")),e.target_kind!=="epic"&&o.push(f("targetKind","prompt_body","value-denied")),(!G.test(e.target_ref)||j.test(e.target_ref)||A.test(e.target_ref))&&o.push(f("targetRef","prompt_body","value-denied"));const t=V(e.target_ref);return e.epic_id&&e.epic_id!==t&&o.push(f("epicId","prompt_body","value-denied")),o.length>0?{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:d.PROMPT_REJECTED,publicSummary:"Headless run_yoloop attempt did not match the canonical public epic prompt shape.",redactionSummary:o}:{ok:!0,input:{rootPrompt:`*yoloop @${e.target_ref}`,targetRef:e.target_ref,epicId:t,runtimeId:"fake",publicSafe:!0}}}function We(e){const o=e.runtimeDefaults!==void 0?e.runtimeDefaults:Ae({projectRoot:e.projectRoot});if(C(o)&&o.ok===!1)return{ok:!1,reasonCode:d.RUNTIME_UNTRUSTED,publicSummary:typeof o.publicSummary=="string"?o.publicSummary:"Headless runtime defaults failed public-safety validation.",redactionSummary:Array.isArray(o.redactionSummary)?o.redactionSummary:[]};const t=ut(e.attempt.runtime_source)??"explicit",r=e.attempt.runtime_id||e.attempt.model_id?{...e.attempt.runtime_id?{runtimeId:e.attempt.runtime_id}:{},...e.attempt.model_id?{modelId:e.attempt.model_id}:{},source:t,publicSafe:!0}:void 0,a={registry:e.registry,defaults:o,fallback:e.runtimeFallback};r&&(t==="origin"?a.origin=r:t==="default"?a.projectDefault=r:t==="fallback"?a.fallback=r:a.explicit=r);const s=Se(a);return s.ok?{ok:!0,runtimeId:s.runtimeId,...s.modelId?{modelId:s.modelId}:{},runtimeSource:s.runtimeSource}:{ok:!1,reasonCode:s.reasonCode,publicSummary:s.publicSummary,redactionSummary:s.redactionSummary}}function Ze(e){const o=[];for(const O of Object.keys(e))(!Ne.has(O)||Y.test(O))&&o.push(f(O,U(O),"key-denied"));e.publicSafe!==!0&&o.push(f("publicSafe","unsafe_key","value-denied"));const t=S(e,"kind"),r=S(e,"commandClass"),a=S(e,"jobId"),s=S(e,"operationId"),n=S(e,"idempotencyKey"),i=S(e,"targetKind"),l=S(e,"targetRef"),c=S(e,"commandRef"),u=S(e,"publicSummary"),m=S(e,"epicId");t!=="run_yoloop"&&o.push(f("kind","unsafe_key","value-denied")),r!=="goal-tick"&&r!=="loop-tick"&&o.push(f("commandClass","unsafe_key","value-denied")),re(a)||o.push(f("jobId","unsafe_key","value-denied")),re(s)||o.push(f("operationId","unsafe_key","value-denied")),re(n)||o.push(f("idempotencyKey","unsafe_key","value-denied")),(i!=="epic"||!l||!G.test(l)||A.test(l))&&o.push(f("targetRef","prompt_body","value-denied"));const _=l?`*yoloop @${l}`:void 0;(!c||c!==_||c.includes("@neocortex")||j.test(c)||A.test(c))&&o.push(f("commandRef","prompt_body","value-denied")),m&&l&&m!==V(l)&&o.push(f("epicId","prompt_body","value-denied")),(!u||u.length>240||A.test(u))&&o.push(f("publicSummary","unbounded_text","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||A.test(e.reasonCode))&&o.push(f("reasonCode","unsafe_key","value-denied"));const y=nt(e.runtime,o);e.attempts!==void 0&&X(e.attempts,"attempts",o),e.metadata!==void 0&&X(e.metadata,"metadata",o);const p=C(e.metadata)?e.metadata:void 0,h=dt(e.redactionSummary,o);return o.length>0||t!=="run_yoloop"||!r||!a||!s||!n||!l||!c||!u?{ok:!1,reasonCode:o.some(b=>b.reason==="prompt_body")?d.PROMPT_REJECTED:d.DIRECTIVE_REJECTED,redactionSummary:o}:{ok:!0,directive:{kind:"run_yoloop",commandClass:r,jobId:a,operationId:s,idempotencyKey:n,targetKind:"epic",targetRef:l,commandRef:c,...m?{epicId:m}:{},...y?{runtime:y}:{},publicSummary:u,...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},...p?{metadata:p}:{},...h.length>0?{redactionSummary:h}:{},publicSafe:!0}}}function Ge(e,o){if(!e)return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop metadata was missing.",[]);const t=Je(e);if(!t.ok)return t;const r=[],a=C(e.yoloopExecutionPlan)?e.yoloopExecutionPlan:void 0,s=a?P(a.storyIds).filter(K):[];let n;if(a){const c=Qe(a);if(!c.ok)return c;n=c;for(const u of et(a)){const m=H(u,o,"execution-plan");if(!m.ok)return m;r.push(m.prompt)}if(r.length===0)for(const u of s){const m=H(`*yolo @docs/stories/${u}.story.md`,o,"execution-plan");if(!m.ok)return m;r.push(m.prompt)}}const i=typeof e.nextStoryId=="string"&&K(e.nextStoryId)?e.nextStoryId:void 0;for(const c of Array.isArray(e.skillDirectives)?e.skillDirectives:[]){if(!C(c)||c.kind!=="task")continue;const u=P(c.promptTemplates);if(u.length>0){for(const p of u){const h=H(p,o,"task-directive");if(!h.ok)return h;r.push(h.prompt)}continue}const m=typeof c.promptTemplate=="string"?c.promptTemplate:void 0;if(!m)continue;const _=P(c.storyIds).filter(K),y=_.length>0?_:i?[i]:[];if(y.length===0&&J.test(m)){const p=H(m,o,"task-directive");if(!p.ok)return p;r.push(p.prompt);continue}for(const p of y){const h=m.includes("{storyId}")?m.replaceAll("{storyId}",p):m,O=H(h,o,"task-directive");if(!O.ok)return O;r.push(O.prompt)}}if(r.length===0&&i){const c=H(`*yolo @docs/stories/${i}.story.md`,o,"next-story");if(!c.ok)return c;r.push(c.prompt)}const l=ft(r,c=>c.commandRef);if(s.length>0){const c=new Set(s);for(const u of l)if(!c.has(u.storyId))return I(d.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected a child prompt outside the server-authorized execution plan.",[f("storyId","prompt_body",R(u.storyId))])}return n?.parallelAuthorized&&!F(l.map(c=>c.storyId),s)?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop rejected a parallel plan whose executable prompts did not match the selected wave.",[]):l.length===0?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop metadata did not include an authorized per-story child prompt.",[]):{ok:!0,prompts:l,mode:n?.mode??"legacy",serverMaxConcurrency:n?.serverMaxConcurrency??1,parallelAuthorized:n?.parallelAuthorized??!1,reasonCodes:[d.OK,n?.parallelAuthorized?d.WORKER_POOL_PARALLEL_ACTIVE:d.WORKER_POOL_SERIAL_FALLBACK]}}function Je(e){const o=[];return e.nextStoryId!==void 0&&z(e.nextStoryId,"nextStoryId",o),e.yoloopExecutionPlan!==void 0&&z(e.yoloopExecutionPlan,"yoloopExecutionPlan",o),Array.isArray(e.skillDirectives)&&e.skillDirectives.forEach((t,r)=>{C(t)&&t.kind==="task"&&z(t,`skillDirectives.${r}`,o)}),o.length>0?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop rejected unsafe public metadata before child delegation.",o):{ok:!0}}function z(e,o,t){if(typeof e=="string"){(A.test(e)||/\0/.test(e))&&t.push(f(o,U(o),"value-denied"));return}if(!(e==null||typeof e=="number"||typeof e=="boolean")){if(Array.isArray(e)){e.forEach((r,a)=>z(r,`${o}.${a}`,t));return}if(C(e)){for(const[r,a]of Object.entries(e)){const s=`${o}.${r}`;!(r==="promptTemplate"||r==="promptTemplates"||r==="childPromptKind"||r==="allowMetaTaskPromptInChild"||r==="authorization")&&Y.test(r)&&t.push(f(s,U(r),"key-denied")),z(a,s,t)}return}t.push(f(o,"unsafe_key","value-denied"))}}function Qe(e){const o=typeof e.mode=="string"?e.mode:"",t=C(e.isolationPolicy)?e.isolationPolicy:void 0,r=P(e.storyIds);if(e.authorization!=="server_authorized")return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan was not server-authorized.",[]);if(e.executor!=="root_agent"&&e.executor!=="root_agent_with_child_tasks")return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan executor was not root-owned.",[]);if(o!=="serial"&&o!=="parallel_wave"&&o!=="manual")return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan mode was invalid.",[]);if(!Array.isArray(e.storyIds)||r.length===0||r.length!==e.storyIds.length||r.some(h=>!K(h))||new Set(r).size!==r.length)return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan story selection was invalid or ambiguous.",[]);if(!t||t.rootOwnsLoop!==!0||t.childPromptKind!=="per_story_yolo_only"&&!(t.childPromptKind==="none"&&(o==="serial"&&t.childTaskDelegation==="not_required"||o==="parallel_wave"&&e.executor==="root_agent"&&t.childTaskDelegation==="forbidden"))||t.allowOuterYoloopInChild!==!1||t.allowMetaTaskPromptInChild!==!1)return I(d.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected an execution plan that did not preserve root-owned child isolation.",[f("isolationPolicy","prompt_body","value-denied")]);const a=Array.isArray(e.skippedStories)?e.skippedStories:[];for(const h of a){if(!C(h)||typeof h.storyId!="string"||!K(h.storyId)||typeof h.reason!="string")return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop skipped-story evidence was malformed.",[]);if(r.includes(h.storyId))return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop selected a story that server evidence marked skipped.",[])}if(e.version===2){const h=ve(e);return h.ok?{ok:!0,mode:"parallel_wave",serverMaxConcurrency:h.childExecutionConcurrency,parallelAuthorized:!1}:I(d.YOLOOP_METADATA_INVALID,"Headless yoloop rejected an unsafe phased execution plan.",[])}if(o!=="parallel_wave")return{ok:!0,mode:o,serverMaxConcurrency:1,parallelAuthorized:!1};const s=e.maxConcurrency,n=e.maxParallel,i=C(e.dependencyBasis)?e.dependencyBasis:void 0,l=C(e.readinessBasis)?e.readinessBasis:void 0,c=Array.isArray(e.parallelWaves)?e.parallelWaves:[],u=c.length===1&&C(c[0])?c[0]:void 0;if(t.rootOwnedScheduling!=="parallel_wave_allowed"||!Number.isInteger(s)||typeof s!="number"||s<2||s>r.length||!Number.isInteger(n)||n!==s||!i||i.source!=="state_snapshot"||!F(P(i.storyIds),r)||!l||l.source!=="ready_wave"||!F(P(l.selectedStoryIds),r)||!u||!F(P(u.storyIds),r)||u.maxConcurrency!==s)return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop parallel plan lacked consistent bounded authorization and readiness evidence.",[]);const m=P(u.promptTemplates);if(m.length!==r.length||new Set(m).size!==m.length)return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop parallel wave prompts were incomplete or ambiguous.",[]);const y=(Array.isArray(u.proofSummaries)?u.proofSummaries:Array.isArray(e.proofSummaries)?e.proofSummaries:[]).find(h=>C(h)&&F(P(h.storyIds),r));return!C(y)||y.dependencyClosure!=="resolved"||y.contractOwnership!=="non_overlapping"||y.validationSurfaces!=="compatible"?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop parallel plan lacked resolved independence proof.",[]):a.find(h=>C(h)&&typeof h.reason=="string"&&/(cycle|unresolved|ambiguous)/i.test(h.reason))?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop parallel plan contained unresolved dependency evidence.",[]):{ok:!0,mode:"parallel_wave",serverMaxConcurrency:s,parallelAuthorized:!0}}function et(e){const o=[];o.push(...P(e.promptTemplates));for(const t of Array.isArray(e.serialSteps)?e.serialSteps:[])C(t)&&typeof t.promptTemplate=="string"&&o.push(t.promptTemplate);for(const t of Array.isArray(e.parallelWaves)?e.parallelWaves:[])C(t)&&o.push(...P(t.promptTemplates));return o}function H(e,o,t){if(de(e))return I(d.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected an unsafe child prompt shape.",[f("promptTemplate","prompt_body",R(e))]);if(!J.test(e))return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop child prompt did not match the canonical per-story yolo shape.",[f("promptTemplate","prompt_body",R(e))]);const r=e.replace(/^\*yolo @/,""),a=lt(r);return!De.test(r)||!K(a)||!a.startsWith(`${o}.`)?I(d.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected a child prompt outside the targeted public epic.",[f("storyId","prompt_body",R(a))]):{ok:!0,prompt:{storyId:a,targetRef:r,commandRef:e,source:t}}}function tt(e){if(!e||!C(e))return{ok:!1,reasonCode:d.YOLOOP_METADATA_INVALID,publicSummary:"Headless yoloop root invocation did not return public metadata.",redactionSummary:[]};const o=C(e.yoloopContinuationDecision)?e.yoloopContinuationDecision:void 0,t=typeof o?.outcome=="string"?o.outcome:void 0,r=t==="queue_exhausted"||e.yoloopComplete===!0,a=e.yoloopAborted===!0,s=t==="selected"&&o?.replay===!0;return t&&!["selected","queue_exhausted","blocked","cycle","invalid","no_progress"].includes(t)?{ok:!1,reasonCode:d.YOLOOP_METADATA_INVALID,publicSummary:"Headless yoloop rejected an unknown continuation outcome.",redactionSummary:[]}:t==="queue_exhausted"&&o?.terminalSuccess!==!0?{ok:!1,reasonCode:d.YOLOOP_METADATA_INVALID,publicSummary:"Headless yoloop rejected inconsistent queue exhaustion metadata.",redactionSummary:[]}:r&&a?{ok:!1,reasonCode:d.YOLOOP_METADATA_INVALID,publicSummary:"Headless yoloop metadata reported mutually exclusive terminal states.",redactionSummary:[f("yoloopTerminal","unsafe_key","value-denied")]}:{ok:!0,complete:r,aborted:a,outcome:t,replay:s}}function ot(e){const o=N("child-op",`${e.rootAttempt.execution_id}-${e.iteration}-${e.child.storyId}`),t=N("child-idem",`${e.rootAttempt.attempt_id}-${e.iteration}-${e.child.storyId}`);return{schemaVersion:1,contractVersion:"continuity-v1",kind:"run_yolo",commandClass:e.rootAttempt.command_class==="goal-tick"?"goal-tick":"loop-tick",jobId:e.rootAttempt.job_id,operationId:o,idempotencyKey:t,targetKind:"story",targetRef:e.child.targetRef,commandRef:e.child.commandRef,storyId:e.child.storyId,runtime:{runtimeId:e.runtimeId,...e.modelId?{modelId:e.modelId}:{},source:e.runtimeSource??"explicit",reasonCode:e.runtimeSource==="fallback"?d.RUNTIME_FALLBACK:d.RUNTIME_EXPLICIT,publicSafe:!0},publicSummary:`Root-owned yoloop delegated public story ${e.child.storyId}.`,reasonCode:d.OK,metadata:{governanceSource:"delegated-subagent",parentAttemptId:e.rootAttempt.attempt_id,parentExecutionId:e.rootAttempt.execution_id,iteration:e.iteration,publicSafe:!0},attempts:[],redactionSummary:[f("prompt","prompt_body",R(e.child.commandRef))],publicSafe:!0}}function ee(e,o,t){const r=le(t.hashes),a=t.workerPoolSummary??Q(),s=le({iterations:t.counts.iterations,childCount:t.counts.childCount,succeededChildCount:t.counts.succeededChildCount,failedChildCount:t.counts.failedChildCount,skippedChildCount:t.counts.skippedChildCount,metadataCompleteCount:t.counts.metadataCompleteCount,metadataAbortedCount:t.counts.metadataAbortedCount,serverMaxConcurrency:a.serverMaxConcurrency,localCap:a.localCap,queueCap:a.queueCap,availableLeases:a.availableLeases,effectiveConcurrency:a.effectiveConcurrency,peakConcurrency:a.peakConcurrency,pendingChildCount:a.pendingChildCount,startedChildCount:a.startedChildCount,completedChildCount:a.completedChildCount,backpressurePauseCount:a.backpressurePauseCount}),n={schemaVersion:1,contractVersion:"continuity-v1",attemptId:o.attempt_id,executionId:o.execution_id,jobId:o.job_id,directiveHash:o.directive_hash,status:t.status,reasonCode:t.reasonCode,storyIds:t.childStoryIds.slice(0,50),counts:s,hashes:r,...t.reasonCode===se.BYPASS_BLOCKED?{governanceEvidence:fe}:{},reasonCodes:L([t.reasonCode,...a.reasonCodes,...t.stateTransitions]),publicSummary:Z(t.publicSummary)};return e.completeHeadlessExecutionAttempt({attemptId:o.attempt_id,executionId:o.execution_id,jobId:o.job_id,leaseId:t.leaseId,runnerId:t.runnerId,status:t.status,completedAt:t.completedAt,durationMs:t.durationMs,reasonCode:t.reasonCode,publicSummary:Z(t.publicSummary),notBeforeAt:t.notBeforeAt,retryCount:t.retryCount,counts:s,hashes:r,redactionSummary:t.redactionSummary,relativePaths:L([o.target_ref,...t.relativePaths]),metadata:n}),e.recordHeadlessExecutionReceipt({receiptId:`receipt-${N("headless-yoloop",`${o.attempt_id}-${t.status}`)}`,attemptId:o.attempt_id,executionId:o.execution_id,jobId:o.job_id,status:t.receiptStatus,reasonCode:t.reasonCode,createdAt:t.completedAt,operationId:`${o.execution_id}:${t.status}:receipt`,idempotencyKey:`${o.directive_hash}:${t.status}:receipt`,counts:s,hashes:r,redactionSummary:t.redactionSummary,relativePaths:L([o.target_ref,...t.relativePaths]),metadata:n}),e.recordHeadlessExecutionSummary({eventId:`event-${N("headless-yoloop-summary",`${o.attempt_id}-${t.status}`)}`,attemptId:o.attempt_id,executionId:o.execution_id,jobId:o.job_id,status:t.status,runtimeId:t.runtimeId,modelId:t.modelId,publicSummary:Z(t.publicSummary),reasonCode:t.reasonCode,createdAt:t.completedAt,durationMs:t.durationMs,counts:s,hashes:r,redactionSummary:t.redactionSummary,relativePaths:L([o.target_ref,...t.relativePaths]),metadata:n}),{attemptId:o.attempt_id,executionId:o.execution_id,jobId:o.job_id,status:t.status,outcome:t.receiptStatus,reasonCode:t.reasonCode,timestamp:t.completedAt,childStoryIds:t.childStoryIds,aggregateCounts:t.counts,workerPoolSummary:a,redactionSummary:t.redactionSummary,publicSafe:!0}}function rt(e,o){return{attemptId:e.attempt_id,executionId:e.execution_id,jobId:e.job_id,status:o.status,outcome:o.receiptStatus,reasonCode:o.reasonCode,timestamp:o.timestamp,childStoryIds:[],aggregateCounts:oe(),workerPoolSummary:Q(),redactionSummary:[],publicSafe:!0}}function at(e,o,t,r,a){if(!o.retryable)return{retry:!1};const s=e.retry_count+1;if(s>=Math.max(1,e.max_attempts||t))return{retry:!1,retryCount:s};const n=Math.min(8,2**Math.max(0,e.retry_count));return{retry:!0,retryCount:s,notBeforeAt:ue(a,r*n)}}function T(e){return{status:e.status,receiptStatus:e.receiptStatus,reasonCode:e.reasonCode,publicSummary:e.publicSummary,retryable:e.retryable,durationMs:Math.max(0,Date.now()-e.startedAt),counts:e.counts,workerPoolSummary:e.workerPoolSummary??Q(),hashes:e.hashes,redactionSummary:e.redactions.slice(0,50),relativePaths:L(e.relativePaths).slice(0,50),childStoryIds:L(e.childStoryIds).slice(0,50),stateTransitions:L(e.stateTransitions)}}function nt(e,o){if(e===void 0)return;if(!C(e)){o.push(f("runtime","unsafe_key","value-denied"));return}for(const s of Object.keys(e))(!je.has(s)||Y.test(s))&&o.push(f(`runtime.${s}`,U(s),"key-denied"));e.publicSafe!==!0&&o.push(f("runtime.publicSafe","unsafe_key","value-denied"));const t=S(e,"runtimeId"),r=S(e,"modelId"),a=S(e,"source");if(t&&(!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,79}$/.test(t)||A.test(t)||j.test(t))&&o.push(f("runtime.runtimeId","unsafe_key","value-denied")),r&&(!/^[A-Za-z0-9][A-Za-z0-9._:+/-]{0,119}$/.test(r)||A.test(r)||j.test(r))&&o.push(f("runtime.modelId","unsafe_key","value-denied")),a!==void 0&&a!=="explicit"&&a!=="origin"&&a!=="default"&&a!=="fallback"&&a!=="unspecified"&&o.push(f("runtime.source","unsafe_key","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||A.test(e.reasonCode))&&o.push(f("runtime.reasonCode","unsafe_key","value-denied")),e.publicSafe===!0)return{...t?{runtimeId:t}:{},...r?{modelId:r}:{},...a==="explicit"||a==="origin"||a==="default"||a==="fallback"||a==="unspecified"?{source:a}:{},...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},publicSafe:!0}}function st(e){const o=Array.isArray(e)?e:e?[e]:[],t=[];for(const r of o){const a=r.continuityExecutionDirectives;Array.isArray(a)&&t.push(...a)}return t}function it(e){return R(te({kind:e.kind,commandClass:e.commandClass,jobId:e.jobId,targetRef:e.targetRef,commandRef:e.commandRef,epicId:e.epicId,runtime:e.runtime}))}function te(e){return Array.isArray(e)?`[${e.map(te).join(",")}]`:C(e)?`{${Object.keys(e).sort().map(o=>`${JSON.stringify(o)}:${te(e[o])}`).join(",")}}`:JSON.stringify(e)}function X(e,o,t){if(typeof e=="string"){(A.test(e)||j.test(e))&&t.push(f(o,U(o),"value-denied"));return}if(!(e==null||typeof e=="number"||typeof e=="boolean")){if(Array.isArray(e)){e.forEach((r,a)=>X(r,`${o}.${a}`,t));return}if(C(e)){for(const[r,a]of Object.entries(e)){const s=`${o}.${r}`;Y.test(r)&&t.push(f(s,U(r),"key-denied")),X(a,s,t)}return}t.push(f(o,"unsafe_key","value-denied"))}}function dt(e,o){if(e===void 0)return[];if(!Array.isArray(e))return o.push(f("redactionSummary","unsafe_key","value-denied")),[];const t=[];for(const[r,a]of e.entries()){if(!C(a)||a.publicSafe!==!0){o.push(f(`redactionSummary.${r}`,"unsafe_key","value-denied"));continue}const s=S(a,"field"),n=S(a,"reason"),i=S(a,"evidence");if(!s||!n||!i||A.test(s)||A.test(n)||A.test(i)){o.push(f(`redactionSummary.${r}`,"unsafe_key","value-denied"));continue}t.push({field:s,reason:n,evidence:i,publicSafe:!0})}return t}function I(e,o,t){return{ok:!1,reasonCode:e,publicSummary:o,redactionSummary:t}}function P(e){return Array.isArray(e)?e.filter(o=>typeof o=="string"):[]}function F(e,o){return e.length===o.length&&new Set(e).size===e.length&&e.every(t=>o.includes(t))}function ct(e){return G.test(e.target_ref)?[e.target_ref]:[]}function le(e){if(!e)return;const o={};for(const[t,r]of Object.entries(e))!/^[A-Za-z0-9_.:-]{1,80}$/.test(t)||Y.test(t)||A.test(t)||typeof r=="string"&&A.test(r)||(o[t]=r);return Object.keys(o).length>0?o:void 0}function oe(){return g(0,0,0,0,0,0,0)}function g(e,o,t,r,a,s,n){return{iterations:e,childCount:o,succeededChildCount:t,failedChildCount:r,skippedChildCount:a,metadataCompleteCount:s,metadataAbortedCount:n}}function lt(e){return e.replace(/^docs\/stories\//,"").replace(/\.story\.md$/,"")}function V(e){return e.replace(/^docs\/epics\/epic-/,"").replace(/\.md$/,"")}function K(e){return/^[A-Za-z0-9][A-Za-z0-9_-]*\.\d+[A-Za-z0-9_-]*$/.test(e)&&!A.test(e)&&!j.test(e)}function ut(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback")return e}function mt(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback"||e==="unspecified")return e}function U(e){return/prompt|commandRef/i.test(e)?"prompt_body":/std(?:out|err)|raw|log|transcript|stack/i.test(e)?"raw_log":/url/i.test(e)?"private_url":/path|cwd|argv|args|shell|command|binary|executable/i.test(e)?"executable_path":/secret|token|password|authorization|api[_-]?key|license/i.test(e)?"secret_or_pii":"unsafe_key"}function S(e,o){return typeof e[o]=="string"?e[o]:void 0}function re(e){return!!(e&&we.test(e)&&!A.test(e)&&!j.test(e))}function C(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function pt(e,o){return N(e,`${o}-${Date.now()}-${me(4).toString("hex")}`)}function ue(e,o){const t=Date.parse(e);return new Date((Number.isFinite(t)?t:Date.now())+o).toISOString()}function D(e,o,t){return Number.isFinite(e)?Math.max(o,Math.min(t,Math.floor(e))):o}function L(e){return Array.from(new Set(e))}function ft(e,o){const t=new Set,r=[];for(const a of e){const s=o(a);t.has(s)||(t.add(s),r.push(a))}return r}export{ie as DEFAULT_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP,xe as DEFAULT_HEADLESS_YOLOOP_MAX_DURATION_MS,Pe as DEFAULT_HEADLESS_YOLOOP_MAX_ITERATIONS,Le as MAX_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP,Et as RUN_YOLOOP_DRIVER_STATES,$e as defaultYoloopRootInvoker,gt as isCanonicalDelegatedStoryPrompt,Ot as runYoloopExecutionPhase};
|
|
1
|
+
import{createHash as Ee,randomBytes as Re}from"node:crypto";import{spawn as ve}from"node:child_process";import{existsSync as Pe}from"node:fs";import{join as ye}from"node:path";import{AUTONOMOUS_GOVERNANCE_EVIDENCE_TAG as Te,AUTONOMOUS_GOVERNANCE_REASON_CODES as he,autonomousGovernanceMetadata as xe,buildAutonomousGovernanceEnvelope as we,readAutonomousGovernanceEnvelopeFromMetadata as Le,recordAutonomousGovernance as De}from"../../continuity/autonomous-governance.js";import{createDefaultHeadlessAdapterRegistry as Me}from"./adapters.js";import{loadHeadlessRuntimeDefaults as Ne,resolveHeadlessRuntime as je}from"./resolver.js";import{DEFAULT_HEADLESS_EXECUTION_BACKOFF_MS as He,DEFAULT_HEADLESS_EXECUTION_LEASE_MS as ze,DEFAULT_HEADLESS_EXECUTION_LIMIT as Ke,DEFAULT_HEADLESS_EXECUTION_MAX_ATTEMPTS as $e,DEFAULT_HEADLESS_EXECUTION_STALE_LEASE_AFTER_MS as Be,DEFAULT_HEADLESS_EXECUTION_TIMEOUT_MS as Ue,headlessExecutionEntityId as V,runYoloExecutionPhase as Fe}from"./run-yolo.js";import{HEADLESS_REASON_CODES as p,boundPublicSummary as ie,hashPublicValue as w,redaction as _}from"./types.js";import{validatePhasedYoloopPlan as Ye}from"./prepared-story-bundle.js";import{createAnchoredContinuousStoryCommandRunner as Ve,createBranchlessContinuousStoryWorkspaceManager as qe}from"./continuous-story-workspace.js";import{executeEpicGitReconciliation as We,executeEpicTerminalGit as Ge}from"./epic-terminal-git-runner.js";import{createCliEpicTerminalGitAdapter as Xe}from"./epic-terminal-git-cli-adapter.js";import{acquireGitLifecyclePhysicalIntegrationLock as Ze,releaseGitLifecyclePhysicalIntegrationLock as Je}from"../../git/git-lifecycle-store.js";import{normalizeContinuousWriteRef as Qe}from"../../../../shared/dist/yoloop/wave-decision-receipt.js";const et=20,tt=1800*1e3,_e=1,ot=10,so=Object.freeze(["start","lifecycle_evidence","metadata_parse","child_story_delegation","reinvoke","git_reconciliation","terminal_git","complete","aborted","backoff"]),de=/^docs\/epics\/epic-[A-Za-z0-9._-]+\.md$/,rt=/^docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,ce=/^\*yolo @docs\/stories\/[A-Za-z0-9._-]+\.story\.md(?: branchless-preparation)?$/,at=/^\*yolo @docs\/stories\/[A-Za-z0-9._-]+\.story\.md branchless-preparation$/,nt=/^(?:\uFEFF)?---(?:\r?\n)/,st=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/,q=/(?:[;&|`$<>]|\$\(|\n|\r|\0)/,te=/(raw[_-]?(?:logs?|payloads?)|std(?:out|err)|stack(?:[_-]?trace)?|transcript|objective(?:[_-]?(?:text|body|prompt))|prompt(?:[_-]?(?:body|text))?|private[_-]?(?:urls?|prompts?)|secret|token|password|protected(?:[_-]?(?:field|body|bodies|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|\bpii\b|authorization|api[_-]?key|license[_-]?key|argv|args|executable(?:[_-]?path)?|binary(?:[_-]?path)?|shell|cwd|command[_-]?path|vendor(?:[_-]?(?:payload|corpus|response|output)))/i,L=/(https?:\/\/\S+|(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)|ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=|raw[_-]?(?:logs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS|P190[_-]?SYNTHETIC[_-]?(?:HEADLESS|CONTINUITY))/i,it=new Set(["no_private_prompt_or_history","no_raw_vendor_corpus","no_unrelated_story_context"]);function Ce(e){return nt.test(e)||e.includes("@neocortex")||e.includes("*yoloop")||q.test(e)||L.test(e)}function io(e){return!Ce(e)&&ce.test(e)}const dt=new Set(["schemaVersion","contractVersion","kind","commandClass","jobId","operationId","idempotencyKey","targetKind","targetRef","commandRef","epicId","runtime","publicSummary","reasonCode","attempts","metadata","redactionSummary","publicSafe"]),ct=new Set(["runtimeId","modelId","source","reasonCode","publicSafe"]),lt="job-aborted",ut="max-iterations-reached",pt="max-duration-reached",mt=new Set(["git-lifecycle-integration-backpressure","git-lifecycle-integration-lock-failed","git-lifecycle-integration-lock-release-failed"]);async function ft(e){const t=Date.now(),o=ye(__dirname,"../../commands/invoke.js"),a=Pe(o)?o:ye(__dirname,"../../../dist/commands/invoke.js"),r={args:e.args,projectRoot:e.projectRoot,format:"json",platformTarget:"runner",serverUrl:e.serverUrl,strictReadOnly:e.strictReadOnly},n=await new Promise(s=>{const i=ve(process.execPath,["-e",`
|
|
2
|
+
process.once('message', async ({ modulePath, options }) => {
|
|
3
|
+
try {
|
|
4
|
+
const result = await require(modulePath).invoke(options);
|
|
5
|
+
process.send(result, () => process.exit(0));
|
|
6
|
+
} catch { process.exit(1); }
|
|
7
|
+
});
|
|
8
|
+
`],{cwd:e.projectRoot,stdio:["ignore","pipe","pipe","ipc"],windowsHide:!0});let d,u=0,m=!1;const f=setTimeout(()=>{m=!0,i.kill()},e.timeoutMs),c=S=>{u+=S.length,u>32*1024*1024&&(m=!0,i.kill())};i.stdout?.on("data",c),i.stderr?.on("data",c),i.on("message",S=>{if(d||!I(S)||typeof S.success!="boolean"||Buffer.byteLength(JSON.stringify(S))>32*1024*1024){m=!0,i.kill();return}d=S});const h={success:!1,errorCode:"headless-root-invoke-failed",error:"The isolated root metadata invocation did not complete.",exitCode:1};i.on("error",()=>{m=!0}),i.on("close",S=>{clearTimeout(f),s(S===0&&!m&&d?d:h)}),i.send({modulePath:a,options:r},S=>{S&&(m=!0,i.kill())})});return{success:n.success,instructions:n.instructions,metadata:n.metadata,error:n.error,errorCode:n.errorCode,exitCode:n.exitCode,durationMs:Date.now()-t,publicSafe:!0}}async function co(e){const t=e.adapterRegistry??Me(),o=U(e.limit??Ke,1,10),a=U(e.leaseMs??ze,1e3,3600*1e3),r=U(e.staleLeaseAfterMs??Be,0,1440*60*1e3),n=U(e.maxAttempts??$e,1,10),s=U(e.localConcurrencyCap??_e,1,ot),i=[],d=[],u=e.now(),m=yt({store:e.store,metadata:e.metadata,nowIso:u,maxAttempts:n,queueCap:e.queueCap});i.push(...m.reasonCodes);const f=e.store.recoverStaleHeadlessExecutionAttempts({nowIso:u,staleAfterMs:r,limit:o*2});f.recoveredAttemptIds.length>0&&(i.push(p.EXECUTION_BACKOFF),f.failedAttemptIds.length>0&&i.push(p.EXECUTION_TIMEOUT));const c=e.store.listDueHeadlessExecutionAttempts({nowIso:e.now(),limit:Math.max(o*5,10)}).filter(h=>h.directive_kind==="run_yoloop").slice(0,o);for(const h of c){const S=await ht({store:e.store,projectRoot:e.projectRoot,runnerId:e.runnerId,attempt:h,registry:t,now:e.now,leaseMs:a,timeoutMs:U(e.timeoutMs??Ue,1e3,18e5),backoffMs:U(e.backoffMs??He,1e3,36e5),maxAttempts:n,maxIterations:U(e.maxIterations??et,1,100),maxDurationMs:U(e.maxDurationMs??tt,1e3,72e5),localConcurrencyCap:s,queueCap:e.queueCap,adapterOptions:e.adapterOptions,runtimeDefaults:e.runtimeDefaults,runtimeFallback:e.runtimeFallback,yoloopInvoker:e.yoloopInvoker??ft,serverUrl:e.serverUrl,idFactory:e.idFactory??Ut,continuousWorkspaceManager:e.continuousWorkspaceManager??qe(),terminalGitAdapter:e.terminalGitAdapter??Xe(e.projectRoot)});d.push(S),i.push(S.reasonCode,...S.workerPoolSummary.reasonCodes)}return{ok:d.every(h=>h.outcome!=="failed")&&m.rejectedCount===0,enqueuedAttemptCount:m.enqueuedCount,dueAttemptCount:c.length,processedAttemptCount:d.filter(h=>h.outcome!=="ignored").length,recoveredAttemptIds:f.recoveredAttemptIds,receipts:d,reasonCodes:B(i.length>0?i:[p.OK]),publicSafe:!0}}function yt(e){let t=0,o=0;const a=[];for(const r of Mt(e.metadata)){if(!I(r)||r.kind!=="run_yoloop")continue;const n=gt(r);if(!n.ok){o+=1,a.push(n.reasonCode);continue}const s=n.directive;if(!e.store.jobExists(s.jobId)){o+=1,a.push(he.BYPASS_BLOCKED);continue}const i=Nt(s);if(e.store.hasCompletedHeadlessExecutionDirectiveHash(i)){a.push(p.EXECUTION_COMPLETED);continue}const d=we({autonomousKind:"run_yoloop",source:"headless-run-yoloop",targetKind:"epic",targetRef:s.targetRef,epicId:s.epicId??re(s.targetRef),jobId:s.jobId,operationSeed:s.operationId,commandHash:w(s.commandRef)}),u=De(e.store,d,e.nowIso,{requireExistingJob:!0});if(!u.ok){o+=1,a.push(u.reasonCode);continue}const m=V("attempt",s.idempotencyKey),f=V("exec",s.operationId),c=e.store.enqueueHeadlessExecutionAttempt({attemptId:m,executionId:f,jobId:s.jobId,directiveHash:i,directiveKind:"run_yoloop",commandClass:s.commandClass,targetKind:"epic",targetRef:s.targetRef,epicId:s.epicId??re(s.targetRef),runtimeId:s.runtime?.runtimeId,modelId:s.runtime?.modelId,runtimeSource:Bt(s.runtime?.source),reasonCode:s.reasonCode,publicSummary:s.publicSummary,enqueuedAt:e.nowIso,notBeforeAt:e.nowIso,maxAttempts:e.maxAttempts,queueCap:e.queueCap,operationId:`${s.operationId}:enqueue`,idempotencyKey:s.idempotencyKey,counts:{directives:1},hashes:{directive:i},redactionSummary:s.redactionSummary,relativePaths:[s.targetRef],metadata:xe(d,{schemaVersion:1,contractVersion:"continuity-v1",jobId:s.jobId,operationId:s.operationId,reasonCode:s.reasonCode??p.OK,targetRef:s.targetRef,directiveHash:i})});if(!c.accepted){o+=1,a.push(c.reasonCode??"queue-cap-reached");continue}c.inserted&&(t+=1),a.push(p.OK)}return{enqueuedCount:t,rejectedCount:o,reasonCodes:B(a)}}async function ht(e){const t=e.now(),o=e.idFactory("lease",e.attempt.attempt_id),a=Oe(t,e.leaseMs);if(!e.store.claimHeadlessExecutionAttempt({attemptId:e.attempt.attempt_id,leaseId:o,runnerId:e.runnerId,claimedAt:t,leaseExpiresAt:a,reasonCode:p.OK}).inserted)return wt(e.attempt,{status:e.attempt.status,receiptStatus:"ignored",reasonCode:"lease-conflict",timestamp:t});if(e.store.hasCompletedHeadlessExecutionDirectiveHash(e.attempt.directive_hash,e.attempt.attempt_id))return ue(e.store,e.attempt,{leaseId:o,runnerId:e.runnerId,status:"skipped",receiptStatus:"ignored",reasonCode:p.EXECUTION_COMPLETED,publicSummary:"Skipped duplicate run_yoloop directive because the directive hash is already completed.",completedAt:e.now(),counts:me(),hashes:{directive:e.attempt.directive_hash},redactionSummary:[],relativePaths:[e.attempt.target_ref],childStoryIds:[],stateTransitions:["start","complete"]});const s=Ct(e);if(!s.ok)return ue(e.store,e.attempt,{leaseId:o,runnerId:e.runnerId,status:s.status,receiptStatus:s.receiptStatus,reasonCode:s.reasonCode,publicSummary:s.publicSummary,completedAt:e.now(),counts:me(),hashes:{directive:e.attempt.directive_hash},redactionSummary:s.redactionSummary,relativePaths:zt(e.attempt),childStoryIds:[],stateTransitions:["start"]});const i=await _t({...e,prepared:s.input}),d=Lt(e.attempt,i,e.maxAttempts,e.backoffMs,e.now()),u=d.retry?"backoff":i.status,m=d.retry?"deferred":i.receiptStatus,f=d.retry?mt.has(i.reasonCode)?i.reasonCode:p.EXECUTION_BACKOFF:i.reasonCode,c=d.retry?"Headless run_yoloop execution scheduled bounded retry after transient metadata/runtime outcome.":i.publicSummary;return ue(e.store,e.attempt,{leaseId:o,runnerId:e.runnerId,status:u,receiptStatus:m,reasonCode:f,publicSummary:c,completedAt:e.now(),durationMs:i.durationMs,notBeforeAt:d.notBeforeAt,retryCount:d.retryCount,counts:i.counts,workerPoolSummary:i.workerPoolSummary,hashes:{...i.hashes,directive:e.attempt.directive_hash},redactionSummary:i.redactionSummary,relativePaths:i.relativePaths,childStoryIds:i.childStoryIds,runtimeId:s.input.runtimeId,modelId:s.input.modelId,runtimeSource:s.input.runtimeSource,stateTransitions:i.stateTransitions})}async function _t(e){const t=Date.now(),o=["start"],a=new Set,r=[],n=[],s={root:w(e.prepared.rootPrompt)},i=[_("rootPrompt","prompt_body",s.root)];let d=0,u=0,m=0,f=0,c=0,h=0,S;const l=ge(e.localConcurrencyCap),y=new Map;let D=!1;const T=new Map,H=new Map,ae=v=>{const b=v.child;s[`child-${b.storyId.replace(/[^A-Za-z0-9_.:-]/g,"-")}`]=v.commandHash,i.push(v.promptRedaction);const g=v.receipt;if(v.terminalFailure){if(v.deferredFailure){T.set(b.storyId,v.terminalFailure),l.backpressurePauseCount+=1;return}T.delete(b.storyId),H.set(b.storyId,v.terminalFailure),a.has(b.storyId)||(a.add(b.storyId),r.push(b.storyId),n.push(b.targetRef),m+=1);return}if(!g||g.outcome==="deferred"){T.set(b.storyId,v.reasonCodes.includes("queue-cap-reached")?p.WORKER_POOL_BACKPRESSURE_PAUSED:g?.reasonCode||p.EXECUTION_BACKOFF),v.reasonCodes.includes("queue-cap-reached")&&(l.backpressurePauseCount+=1);return}T.delete(b.storyId),!a.has(b.storyId)&&(a.add(b.storyId),r.push(b.storyId),n.push(b.targetRef),g.outcome==="failed"?(m+=1,H.set(b.storyId,g.reasonCode||p.EXECUTION_FAILED)):g.outcome==="ignored"?f+=1:u+=1)},J=async()=>{const v=await Promise.race([...y.entries()].map(([b,g])=>g.promise.then(K=>({storyId:b,result:K}))));y.delete(v.storyId),l.completedChildCount+=1,l.pendingChildCount=y.size,ae(v.result)};for(;;){if(d>=e.maxIterations)return o.push("backoff"),R({status:"failed",receiptStatus:"failed",reasonCode:ut,publicSummary:"Headless yoloop reached the bounded iteration limit before completion metadata.",retryable:!1,startedAt:t,counts:E(d,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});if(Date.now()-t>e.maxDurationMs)return o.push("backoff"),R({status:"failed",receiptStatus:"failed",reasonCode:pt,publicSummary:"Headless yoloop reached the bounded duration limit before completion metadata.",retryable:!1,startedAt:t,counts:E(d,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});if(e.terminalGitAdapter.prepareLifecycleEvidence){o.push("lifecycle_evidence");const A=await e.terminalGitAdapter.prepareLifecycleEvidence({epicId:e.prepared.epicId,nowIso:e.now()});if(!A.ok)return o.push("backoff"),R({status:A.retryEligible?"backoff":"failed",receiptStatus:A.retryEligible?"deferred":"failed",reasonCode:A.reasonCode,publicSummary:"Headless yoloop stopped because physical Git lifecycle evidence could not be produced safely.",retryable:A.retryEligible,startedAt:t,counts:E(d,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});S=A.p205Authority}o.push("metadata_parse");const v=await e.yoloopInvoker({projectRoot:e.projectRoot,args:e.prepared.rootPrompt,attemptId:e.attempt.attempt_id,executionId:e.attempt.execution_id,jobId:e.attempt.job_id,runnerId:e.runnerId,iteration:d,runtimeId:e.prepared.runtimeId,...e.prepared.modelId?{modelId:e.prepared.modelId}:{},timeoutMs:e.timeoutMs,serverUrl:e.serverUrl});if(v.durationMs!==void 0&&(s[`iter-${d}`]=w(String(v.durationMs))),!v.success)return o.push("backoff"),R({status:"backoff",receiptStatus:"deferred",reasonCode:p.EXECUTION_FAILED,publicSummary:"Headless yoloop root metadata invocation failed with bounded public evidence.",retryable:!0,startedAt:t,counts:E(d,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});const b=v.metadata,g=Tt(b);if(!g.ok)return o.push("backoff"),R({status:"failed",receiptStatus:"failed",reasonCode:g.reasonCode,publicSummary:g.publicSummary,retryable:!1,startedAt:t,counts:E(d,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:[...i,...g.redactionSummary],relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});if((g.aborted||g.complete||g.replay||g.outcome&&g.outcome!=="selected"&&g.outcome!=="queue_exhausted")&&D&&y.size>0){await J(),d+=1,o.push("reinvoke");continue}if(g.aborted)return h+=1,o.push("aborted"),R({status:"failed",receiptStatus:"failed",reasonCode:lt,publicSummary:"Headless yoloop stopped because public metadata reported an aborted loop.",retryable:!1,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});if(g.outcome&&g.outcome!=="selected"&&g.outcome!=="queue_exhausted")return o.push("backoff"),R({status:"failed",receiptStatus:"failed",reasonCode:`yoloop-${g.outcome}`,publicSummary:"Headless yoloop stopped on a non-executable graph-first continuation outcome.",retryable:!1,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});if(g.replay)return o.push("backoff"),R({status:"backoff",receiptStatus:"deferred",reasonCode:"yoloop-replay-pending",publicSummary:"Headless yoloop observed pending replay authority and did not delegate a second child.",retryable:!0,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});if(g.complete&&D&&T.size>0&&H.size===0)return o.push("backoff"),R({status:"backoff",receiptStatus:"deferred",reasonCode:[...T.values()].sort()[0],publicSummary:"Headless yoloop rejected terminal completion while previously runnable work remained undispatched.",retryable:!0,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});if(g.complete&&D&&H.size>0)return o.push("backoff"),R({status:"failed",receiptStatus:"failed",reasonCode:[...H.values()].sort()[0],publicSummary:"Headless yoloop rejected terminal completion because runnable work failed before an accepted dispatch receipt.",retryable:!1,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});const K=vt(b);if(K){o.push("terminal_git");const A=new Date,x=await Ze(e.projectRoot,{kind:"continuous",storyId:K.epicId,sessionId:`${e.runnerId}:${e.attempt.attempt_id}`,idempotencyKey:K.idempotencyKey,persistent:!1,expiresAt:new Date(A.getTime()+Math.max(e.timeoutMs,e.maxDurationMs)+6e4).toISOString()});if(!x.ok)return o.push("backoff"),R({status:"backoff",receiptStatus:"deferred",reasonCode:x.reasonCode,publicSummary:"Headless yoloop deferred terminal Git while another physical writer retained authority.",retryable:!0,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});let z,j=!1;try{z=await Ge(K,e.terminalGitAdapter,e.now,S)}finally{j=await Je(x.path,x.owner).catch(()=>!1)}if(!j)return o.push("backoff"),R({status:"backoff",receiptStatus:"deferred",reasonCode:"git-lifecycle-integration-lock-release-failed",publicSummary:"Headless yoloop stopped because terminal Git writer ownership could not be released safely.",retryable:!0,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});if(s[`terminal-git-${d}`]=w(`${z.receipt.idempotencyKey}:${z.receipt.physicalStatus}`),!z.ok){const M=z.receipt.retryEligible;return o.push("backoff"),R({status:M?"backoff":"failed",receiptStatus:M?"deferred":"failed",reasonCode:z.reasonCodes[0]??"epic-terminal-git-failed",publicSummary:"Headless yoloop stopped at the epic terminal Git boundary with public-safe retry evidence.",retryable:M,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o})}if(g.complete)return c+=1,o.push("complete"),R({status:"completed",receiptStatus:"applied",reasonCode:p.EXECUTION_COMPLETED,publicSummary:"Headless yoloop completed only after fresh root-owned physical Git verification.",retryable:!1,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});d+=1,o.push("reinvoke");continue}if(g.complete)return c+=1,o.push("complete"),R({status:"completed",receiptStatus:"applied",reasonCode:p.EXECUTION_COMPLETED,publicSummary:"Headless yoloop completed after public metadata reported yoloopComplete.",retryable:!1,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});const Q=Pt(b);if(Q){o.push("git_reconciliation");const A=await We(Q,e.terminalGitAdapter,e.now);if(s[`git-reconciliation-${d}`]=w(`${Q.idempotencyKey}:${A.reasonCodes.join(",")}`),!A.ok)return o.push("backoff"),R({status:"backoff",receiptStatus:"deferred",reasonCode:A.reasonCodes[0]??"git-reconciliation-failed",publicSummary:"Headless yoloop paused at a fail-closed Git reconciliation boundary.",retryable:!0,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o})}const C=At(b,e.prepared.epicId);if(!C.ok)return o.push("backoff"),R({status:"failed",receiptStatus:"failed",reasonCode:C.reasonCode,publicSummary:C.publicSummary,retryable:!1,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:[...i,...C.redactionSummary],relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});const F=C.continuous?void 0:C.prompts.find(A=>a.has(A.storyId));if(F)return o.push("backoff"),R({status:"failed",receiptStatus:"failed",reasonCode:p.YOLOOP_ISOLATION_VIOLATION,publicSummary:"Headless yoloop rejected cyclic child story delegation evidence.",retryable:!1,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:[...i,_("storyId","prompt_body",w(F.storyId))],relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});if(l.mode=C.mode==="continuous_dag"?"continuous_dag":C.parallelAuthorized?"parallel_wave":"serial",l.serverMaxConcurrency=C.serverMaxConcurrency,C.continuous){D=!0;const A=C.prompts.filter(x=>!a.has(x.storyId)&&!y.has(x.storyId));if(l.pendingChildCount=A.length+y.size,A.length>0){const x=Se({store:e.store,nowIso:e.now(),localCap:e.localConcurrencyCap,serverMaxConcurrency:C.serverMaxConcurrency,parallelAuthorized:!0,continuous:!0,eligibleCount:A.length});if(l.queueCap=x.queueCap,l.availableLeases=x.availableLeases,l.effectiveConcurrency=x.effectiveConcurrency,l.reasonCodes.push(x.reasonCode),x.effectiveConcurrency===0&&y.size===0)return l.backpressurePauseCount+=1,o.push("backoff"),R({status:"backoff",receiptStatus:"deferred",reasonCode:p.WORKER_POOL_BACKPRESSURE_PAUSED,publicSummary:"Headless yoloop retained its eligible frontier while physical worker capacity was unavailable.",retryable:!0,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});const z=A.slice(0,x.effectiveConcurrency);o.push("child_story_delegation");for(const j of z)y.set(j.storyId,{child:j,promise:Ie({...e,child:j,iteration:d})});l.startedChildCount+=z.length,l.peakConcurrency=Math.max(l.peakConcurrency,y.size),l.pendingChildCount=A.length-z.length+y.size}if(y.size>0)await J();else{if(T.size>0)return o.push("backoff"),R({status:"backoff",receiptStatus:"deferred",reasonCode:[...T.values()].sort()[0],publicSummary:"Headless yoloop retained deferred continuous work for a bounded retry.",retryable:!0,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});if(H.size>0)return o.push("backoff"),R({status:"failed",receiptStatus:"failed",reasonCode:[...H.values()].sort()[0],publicSummary:"Headless yoloop completed independent work and stopped on the remaining failed dependency closure.",retryable:!1,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o})}d+=1,o.push("reinvoke");continue}l.pendingChildCount=C.prompts.length;const Y=[...C.prompts];for(;Y.length>0;){const A=Se({store:e.store,nowIso:e.now(),localCap:e.localConcurrencyCap,serverMaxConcurrency:C.serverMaxConcurrency,parallelAuthorized:C.parallelAuthorized,continuous:!1,eligibleCount:Y.length});if(l.queueCap=A.queueCap,l.availableLeases=A.availableLeases,l.effectiveConcurrency=A.effectiveConcurrency,l.reasonCodes.push(A.reasonCode),A.effectiveConcurrency===0)return l.backpressurePauseCount+=1,l.pendingChildCount=Y.length,o.push("backoff"),R({status:"backoff",receiptStatus:"deferred",reasonCode:p.WORKER_POOL_BACKPRESSURE_PAUSED,publicSummary:"Headless yoloop paused child workers because bounded queue or lease capacity was unavailable.",retryable:!0,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o});const x=Y.splice(0,A.effectiveConcurrency);l.startedChildCount+=x.length,l.peakConcurrency=Math.max(l.peakConcurrency,x.length),l.pendingChildCount=Y.length,o.push("child_story_delegation");const z=await Promise.all(x.map(M=>Ie({...e,child:M,iteration:d})));l.completedChildCount+=z.length;let j;for(const M of z){const ne=M.child;s[`child-${ne.storyId.replace(/[^A-Za-z0-9_.:-]/g,"-")}`]=M.commandHash,i.push(M.promptRedaction),r.push(ne.storyId),n.push(ne.targetRef),a.add(ne.storyId);const ee=M.receipt;if(!ee){M.reasonCodes.includes("queue-cap-reached")?(l.backpressurePauseCount+=1,l.pendingChildCount+=1,l.reasonCodes.push(p.WORKER_POOL_BACKPRESSURE_PAUSED),j??={kind:"deferred",reasonCode:p.WORKER_POOL_BACKPRESSURE_PAUSED}):(m+=1,j??={kind:"missing",reasonCode:p.EXECUTION_FAILED});continue}if(ee.outcome==="deferred"){j??={kind:"deferred",reasonCode:p.EXECUTION_BACKOFF};continue}if(ee.outcome==="failed"){m+=1,j??={kind:"failed",reasonCode:ee.reasonCode||p.EXECUTION_FAILED};continue}ee.outcome==="ignored"?f+=1:u+=1}if(j){const M=j.kind==="deferred";return R({status:M?"backoff":"failed",receiptStatus:M?"deferred":"failed",reasonCode:j.reasonCode,publicSummary:j.kind==="missing"?"Headless yoloop child story delegation did not produce a public receipt.":M?"Headless yoloop child story delegated bounded backoff to the root attempt.":"Headless yoloop child story execution failed with public receipt evidence.",retryable:M,startedAt:t,counts:E(d+1,r.length,u,m,f,c,h),workerPoolSummary:k(l),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:r,stateTransitions:o})}}d+=1,o.push("reinvoke")}}async function Ie(e){const t=e.child.dispatchId?await e.continuousWorkspaceManager.prepare({projectRoot:e.projectRoot,epicId:e.prepared.epicId,storyId:e.child.storyId,targetRef:e.child.targetRef,dispatchId:e.child.dispatchId,executionBranch:e.child.executionBranch??"",graphRevision:e.child.graphRevision??"",authorizedWriteSet:e.child.writeSet??[]}):void 0;if(t&&!t.ok)return{child:e.child,reasonCodes:[t.reasonCode],commandHash:w(e.child.commandRef),promptRedaction:_(`child.${e.child.storyId}`,"prompt_body",w(e.child.commandRef)),terminalFailure:t.reasonCode,deferredFailure:/backpressure|lease-active/.test(t.reasonCode)};const o=e.projectRoot,a=t?.ok?Ve(t.value):e.adapterOptions?.commandRunner,r=xt({rootAttempt:e.attempt,child:e.child,iteration:e.iteration,runtimeId:e.prepared.runtimeId,modelId:e.prepared.modelId,runtimeSource:e.prepared.runtimeSource}),n=V("attempt",r.idempotencyKey);let s=!!t;try{const i=await Fe({store:e.store,projectRoot:o,runnerId:e.runnerId,now:e.now,metadata:{continuityExecutionDirectives:[r]},adapterRegistry:e.registry,adapterOptions:{...e.adapterOptions,cwd:o,env:{...e.adapterOptions?.env,...t?.ok?{NEOCORTEX_BRANCHLESS_PROJECT_ROOT:t.value.workspacePath,NEOCORTEX_BRANCHLESS_ROOT_AUTHORITY:JSON.stringify(e.child.rootAuthority)}:{}},...a?{commandRunner:a,versionRunner:a}:{}},runtimeDefaults:e.runtimeDefaults,runtimeFallback:e.runtimeFallback,timeoutMs:e.timeoutMs,maxAttempts:1,limit:1,queueCap:e.queueCap,attemptIds:[n],idFactory:e.idFactory}),d=i.receipts.find(u=>u.attemptId===n)??i.receipts[0];if(t?.ok&&d&&d.outcome!=="failed"&&d.outcome!=="deferred"){const u=await e.continuousWorkspaceManager.integrate(t.value,{receiptRefs:[`continuity:${d.attemptId}`],nowIso:d.timestamp});if(!u.ok)return{child:e.child,receipt:d,reasonCodes:[...i.reasonCodes,u.reasonCode],commandHash:w(e.child.commandRef),promptRedaction:_(`child.${e.child.storyId}`,"prompt_body",w(e.child.commandRef)),terminalFailure:u.reasonCode,deferredFailure:/backpressure|graph-revision-stale/.test(u.reasonCode)};s=!1}return{child:e.child,receipt:d,reasonCodes:i.reasonCodes,commandHash:w(e.child.commandRef),promptRedaction:_(`child.${e.child.storyId}`,"prompt_body",w(e.child.commandRef))}}finally{t?.ok&&await e.continuousWorkspaceManager.release(t.value,s)}}function Se(e){const t=e.store.collectSnapshotRows({nowIso:e.nowIso,jobLimit:1,staleLeaseLimit:1,receiptLimit:1,eventLimit:1,snapshotLimit:1}),o=Math.max(1,Math.floor(t.queue.capacity)),a=Math.max(0,Math.floor(t.queue.running)-1),r=e.continuous?Math.max(0,Math.floor(t.queue.available)):Math.max(0,Math.min(Math.max(0,e.localCap-a),Math.floor(t.queue.available))),n=e.parallelAuthorized?Math.max(1,Math.floor(e.serverMaxConcurrency)):1,s=Math.max(0,Math.min(e.continuous?e.eligibleCount:n,...e.continuous?[]:[e.localCap],o,r));return{queueCap:o,availableLeases:r,effectiveConcurrency:s,reasonCode:s===0?p.WORKER_POOL_BACKPRESSURE_PAUSED:(e.parallelAuthorized||e.continuous)&&s>1?p.WORKER_POOL_PARALLEL_ACTIVE:p.WORKER_POOL_SERIAL_FALLBACK}}function ge(e){return{mode:"serial",serverMaxConcurrency:1,localCap:e,queueCap:1,availableLeases:1,effectiveConcurrency:1,peakConcurrency:0,pendingChildCount:0,startedChildCount:0,completedChildCount:0,backpressurePauseCount:0,reasonCodes:[]}}function k(e){return{mode:e.mode,serverMaxConcurrency:$(e.serverMaxConcurrency),localCap:$(e.localCap),queueCap:$(e.queueCap),availableLeases:$(e.availableLeases),effectiveConcurrency:$(e.effectiveConcurrency),peakConcurrency:$(e.peakConcurrency),pendingChildCount:$(e.pendingChildCount),startedChildCount:$(e.startedChildCount),completedChildCount:$(e.completedChildCount),backpressurePauseCount:$(e.backpressurePauseCount),reasonCodes:B(e.reasonCodes.length>0?e.reasonCodes:[p.WORKER_POOL_SERIAL_FALLBACK]).slice(0,10),publicSafe:!0}}function le(e=_e){return k(ge(e))}function $(e){return Number.isFinite(e)?Math.max(0,Math.min(1e4,Math.floor(e))):0}function Ct(e){const t=Le(e.attempt.metadata_json,{autonomousKind:"run_yoloop",jobId:e.attempt.job_id,targetKind:"epic",targetRef:e.attempt.target_ref});if(!t.ok)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:t.reasonCode,publicSummary:t.publicSummary,redactionSummary:t.redactionSummary};const o=It(e.attempt);if(!o.ok)return o;const a=St(e);if(!a.ok)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:a.reasonCode,publicSummary:a.publicSummary,redactionSummary:a.redactionSummary};const r=e.attempt.epic_id??re(e.attempt.target_ref);return{ok:!0,input:{rootPrompt:`*yoloop @${e.attempt.target_ref}`,targetRef:e.attempt.target_ref,epicId:r,runtimeId:a.runtimeId,...a.modelId?{modelId:a.modelId}:{},runtimeSource:a.runtimeSource,publicSafe:!0}}}function It(e){const t=[];e.directive_kind!=="run_yoloop"&&t.push(_("directiveKind","unsafe_key","value-denied")),e.target_kind!=="epic"&&t.push(_("targetKind","prompt_body","value-denied")),(!de.test(e.target_ref)||q.test(e.target_ref)||L.test(e.target_ref))&&t.push(_("targetRef","prompt_body","value-denied"));const o=re(e.target_ref);return e.epic_id&&e.epic_id!==o&&t.push(_("epicId","prompt_body","value-denied")),t.length>0?{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:p.PROMPT_REJECTED,publicSummary:"Headless run_yoloop attempt did not match the canonical public epic prompt shape.",redactionSummary:t}:{ok:!0,input:{rootPrompt:`*yoloop @${e.target_ref}`,targetRef:e.target_ref,epicId:o,runtimeId:"fake",publicSafe:!0}}}function St(e){const t=e.runtimeDefaults!==void 0?e.runtimeDefaults:Ne({projectRoot:e.projectRoot});if(I(t)&&t.ok===!1)return{ok:!1,reasonCode:p.RUNTIME_UNTRUSTED,publicSummary:typeof t.publicSummary=="string"?t.publicSummary:"Headless runtime defaults failed public-safety validation.",redactionSummary:Array.isArray(t.redactionSummary)?t.redactionSummary:[]};const o=$t(e.attempt.runtime_source)??"explicit",a=e.attempt.runtime_id||e.attempt.model_id?{...e.attempt.runtime_id?{runtimeId:e.attempt.runtime_id}:{},...e.attempt.model_id?{modelId:e.attempt.model_id}:{},source:o,publicSafe:!0}:void 0,r={registry:e.registry,defaults:t,fallback:e.runtimeFallback};a&&(o==="origin"?r.origin=a:o==="default"?r.projectDefault=a:o==="fallback"?r.fallback=a:r.explicit=a);const n=je(r);return n.ok?{ok:!0,runtimeId:n.runtimeId,...n.modelId?{modelId:n.modelId}:{},runtimeSource:n.runtimeSource}:{ok:!1,reasonCode:n.reasonCode,publicSummary:n.publicSummary,redactionSummary:n.redactionSummary}}function gt(e){const t=[];for(const y of Object.keys(e))(!dt.has(y)||te.test(y))&&t.push(_(y,Z(y),"key-denied"));e.publicSafe!==!0&&t.push(_("publicSafe","unsafe_key","value-denied"));const o=N(e,"kind"),a=N(e,"commandClass"),r=N(e,"jobId"),n=N(e,"operationId"),s=N(e,"idempotencyKey"),i=N(e,"targetKind"),d=N(e,"targetRef"),u=N(e,"commandRef"),m=N(e,"publicSummary"),f=N(e,"epicId");o!=="run_yoloop"&&t.push(_("kind","unsafe_key","value-denied")),a!=="goal-tick"&&a!=="loop-tick"&&t.push(_("commandClass","unsafe_key","value-denied")),fe(r)||t.push(_("jobId","unsafe_key","value-denied")),fe(n)||t.push(_("operationId","unsafe_key","value-denied")),fe(s)||t.push(_("idempotencyKey","unsafe_key","value-denied")),(i!=="epic"||!d||!de.test(d)||L.test(d))&&t.push(_("targetRef","prompt_body","value-denied"));const c=d?`*yoloop @${d}`:void 0;(!u||u!==c||u.includes("@neocortex")||q.test(u)||L.test(u))&&t.push(_("commandRef","prompt_body","value-denied")),f&&d&&f!==re(d)&&t.push(_("epicId","prompt_body","value-denied")),(!m||m.length>240||L.test(m))&&t.push(_("publicSummary","unbounded_text","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||L.test(e.reasonCode))&&t.push(_("reasonCode","unsafe_key","value-denied"));const h=Dt(e.runtime,t);e.attempts!==void 0&&se(e.attempts,"attempts",t),e.metadata!==void 0&&se(e.metadata,"metadata",t);const S=I(e.metadata)?e.metadata:void 0,l=jt(e.redactionSummary,t);return t.length>0||o!=="run_yoloop"||!a||!r||!n||!s||!d||!u||!m?{ok:!1,reasonCode:t.some(D=>D.reason==="prompt_body")?p.PROMPT_REJECTED:p.DIRECTIVE_REJECTED,redactionSummary:t}:{ok:!0,directive:{kind:"run_yoloop",commandClass:a,jobId:r,operationId:n,idempotencyKey:s,targetKind:"epic",targetRef:d,commandRef:u,...f?{epicId:f}:{},...h?{runtime:h}:{},publicSummary:m,...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},...S?{metadata:S}:{},...l.length>0?{redactionSummary:l}:{},publicSafe:!0}}}function At(e,t){if(!e)return O(p.YOLOOP_METADATA_INVALID,"Headless yoloop metadata was missing.",[]);const o=bt(e);if(!o.ok)return o;const a=[],r=I(e.yoloopExecutionPlan)?e.yoloopExecutionPlan:void 0,n=r?P(r.storyIds).filter(W):[],s=r?.version===3&&I(r.scheduler)&&Array.isArray(r.scheduler.nodes)?new Map(r.scheduler.nodes.filter(I).map(c=>[String(c.storyId??""),c])):new Map,i=r?.version===3&&I(r.scheduler)&&typeof r.scheduler.graphRevision=="string"?r.scheduler.graphRevision:void 0,d=r?.version===3&&typeof r.executionBranch=="string"?r.executionBranch:void 0;let u;if(r){const c=Ot(r);if(!c.ok)return c;u=c;for(const S of Rt(r)){const l=X(S,t,"execution-plan");if(!l.ok)return l;a.push(Ae(l.prompt,s.get(l.prompt.storyId),i,d))}if(a.length===0)for(const S of n){const l=X(`*yolo @docs/stories/${S}.story.md`,t,"execution-plan");if(!l.ok)return l;a.push(Ae(l.prompt,s.get(l.prompt.storyId),i,d))}const h=kt(e.skillDirectives,a);if(!h.ok)return h}const m=typeof e.nextStoryId=="string"&&W(e.nextStoryId)?e.nextStoryId:void 0;for(const c of r?[]:Array.isArray(e.skillDirectives)?e.skillDirectives:[]){if(!I(c)||c.kind!=="task")continue;const h=P(c.promptTemplates);if(h.length>0){for(const D of h){const T=X(D,t,"task-directive");if(!T.ok)return T;a.push(T.prompt)}continue}const S=typeof c.promptTemplate=="string"?c.promptTemplate:void 0;if(!S)continue;const l=P(c.storyIds).filter(W),y=l.length>0?l:m?[m]:[];if(y.length===0&&ce.test(S)){const D=X(S,t,"task-directive");if(!D.ok)return D;a.push(D.prompt);continue}for(const D of y){const T=S.includes("{storyId}")?S.replaceAll("{storyId}",D):S,H=X(T,t,"task-directive");if(!H.ok)return H;a.push(H.prompt)}}if(a.length===0&&m){const c=X(`*yolo @docs/stories/${m}.story.md`,t,"next-story");if(!c.ok)return c;a.push(c.prompt)}const f=Ft(a,c=>c.commandRef);if(u?.continuous){if(f.length!==n.length||f.some(c=>c.preparationOnly!==!0||c.source!=="execution-plan"))return O(p.YOLOOP_ISOLATION_VIOLATION,"Headless continuous yoloop rejected an ambiguous or non-preparation child prompt.",[_("promptTemplates","prompt_body","operation-denied")])}else if(f.some(c=>c.preparationOnly===!0))return O(p.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected branchless preparation outside a validated continuous plan.",[_("promptTemplates","prompt_body","operation-denied")]);if(n.length>0){const c=new Set(n);for(const h of f)if(!c.has(h.storyId))return O(p.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected a child prompt outside the server-authorized execution plan.",[_("storyId","prompt_body",w(h.storyId))])}return u?.parallelAuthorized&&!G(f.map(c=>c.storyId),n)?O(p.YOLOOP_METADATA_INVALID,"Headless yoloop rejected a parallel plan whose executable prompts did not match the selected wave.",[]):f.length===0&&!u?.continuous?O(p.YOLOOP_METADATA_INVALID,"Headless yoloop metadata did not include an authorized per-story child prompt.",[]):{ok:!0,prompts:f,mode:u?.mode??"legacy",serverMaxConcurrency:u?.serverMaxConcurrency??1,parallelAuthorized:u?.parallelAuthorized??!1,continuous:u?.continuous??!1,reasonCodes:[p.OK,u?.parallelAuthorized?p.WORKER_POOL_PARALLEL_ACTIVE:p.WORKER_POOL_SERIAL_FALLBACK]}}function Ae(e,t,o,a){if(!t||!o||!a)return e;const r=Array.isArray(t.writeSet)?P(t.writeSet):[],n=be(t.childExecutionAuthority,{storyId:e.storyId,invocationPrompt:e.commandRef,authorizedWriteSet:r});return{...e,...typeof t.dispatchId=="string"?{dispatchId:t.dispatchId}:{},...typeof t.idempotencyKey=="string"?{idempotencyKey:t.idempotencyKey}:{},graphRevision:o,executionBranch:a,...r.length>0?{writeSet:r}:{},...n?{rootAuthority:n}:{}}}function bt(e){const t=[];return e.nextStoryId!==void 0&&oe(e.nextStoryId,"nextStoryId",t),e.yoloopExecutionPlan!==void 0&&oe(e.yoloopExecutionPlan,"yoloopExecutionPlan",t),Array.isArray(e.skillDirectives)&&e.skillDirectives.forEach((o,a)=>{I(o)&&o.kind==="task"&&oe(o,`skillDirectives.${a}`,t)}),t.length>0?O(p.YOLOOP_METADATA_INVALID,"Headless yoloop rejected unsafe public metadata before child delegation.",t):{ok:!0}}function kt(e,t){if(!Array.isArray(e))return{ok:!0};const o=new Set(t.map(a=>a.commandRef));for(const[a,r]of e.entries()){if(!I(r)||r.kind!=="task")continue;const n=typeof r.promptTemplate=="string"?r.promptTemplate:void 0,s=P(r.promptTemplates);if(n==="[REDACTED]"&&r.subagentType==="neocortex"&&typeof r.reasonCode=="string"&&r.reasonCode.startsWith("directive-prompt-")&&s.length===0)continue;const d=[...n?[n]:[],...s];if(r.subagentType!=="neocortex"||d.length===0||d.some(u=>!o.has(u)))return O(p.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected a task directive that conflicted with the server-authorized execution plan.",[_(`skillDirectives.${a}`,"prompt_body","operation-denied")])}return{ok:!0}}function oe(e,t,o){if(typeof e=="string"){if(/\.allowedDebt\.constraints\.\d+$/.test(t)&&it.has(e))return;(L.test(e)||/\0/.test(e))&&o.push(_(t,Z(t),"value-denied"));return}if(!(e==null||typeof e=="number"||typeof e=="boolean")){if(Array.isArray(e)){e.forEach((a,r)=>oe(a,`${t}.${r}`,o));return}if(I(e)){for(const[a,r]of Object.entries(e)){const n=`${t}.${a}`;!(a==="promptTemplate"||a==="promptTemplates"||a==="invocationPrompt"||a==="childPromptKind"||a==="allowMetaTaskPromptInChild"||a==="authorization")&&te.test(a)&&o.push(_(n,Z(a),"key-denied")),oe(r,n,o)}return}o.push(_(t,"unsafe_key","value-denied"))}}function Ot(e){const t=typeof e.mode=="string"?e.mode:"",o=I(e.isolationPolicy)?e.isolationPolicy:void 0,a=P(e.storyIds);if(e.authorization!=="server_authorized")return O(p.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan was not server-authorized.",[]);if(e.executor!=="root_agent"&&e.executor!=="root_agent_with_child_tasks")return O(p.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan executor was not root-owned.",[]);if(t!=="serial"&&t!=="parallel_wave"&&t!=="continuous_dag"&&t!=="manual")return O(p.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan mode was invalid.",[]);const r=e.version===3&&t==="continuous_dag";if(!Array.isArray(e.storyIds)||!r&&a.length===0||a.length!==e.storyIds.length||a.some(y=>!W(y))||new Set(a).size!==a.length)return O(p.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan story selection was invalid or ambiguous.",[]);if(!o||o.rootOwnsLoop!==!0||o.childPromptKind==="per_story_branchless_preparation_only"&&!r||Object.prototype.hasOwnProperty.call(o,"childExecutionBoundary")&&!r||o.childPromptKind!=="per_story_yolo_only"&&o.childPromptKind!=="per_story_branchless_preparation_only"&&!(o.childPromptKind==="none"&&(t==="serial"&&o.childTaskDelegation==="not_required"||t==="parallel_wave"&&e.executor==="root_agent"&&o.childTaskDelegation==="forbidden"))||o.allowOuterYoloopInChild!==!1||o.allowMetaTaskPromptInChild!==!1)return O(p.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected an execution plan that did not preserve root-owned child isolation.",[_("isolationPolicy","prompt_body","value-denied")]);const n=Array.isArray(e.skippedStories)?e.skippedStories:[];for(const y of n){if(!I(y)||typeof y.storyId!="string"||!W(y.storyId)||typeof y.reason!="string")return O(p.YOLOOP_METADATA_INVALID,"Headless yoloop skipped-story evidence was malformed.",[]);if(a.includes(y.storyId))return O(p.YOLOOP_METADATA_INVALID,"Headless yoloop selected a story that server evidence marked skipped.",[])}if(r){const y=I(e.scheduler)?e.scheduler:void 0,D=Array.isArray(y?.nodes)?y.nodes.filter(I):[],T=P(y?.readyStoryIds),H=P(y?.runningStoryIds),ae=P(e.promptTemplates),J=I(e.dependencyBasis)?e.dependencyBasis:void 0,v=I(e.readinessBasis)?e.readinessBasis:void 0,b=typeof y?.graphRevision=="string"?y.graphRevision:"",g=typeof e.executionBranch=="string"?e.executionBranch:"",K=D.map(C=>typeof C.storyId=="string"?C.storyId:""),Q=D.find(C=>{const F=typeof C.storyId=="string"?C.storyId:"",Y=typeof C.promptTemplate=="string"?C.promptTemplate:"",A=Array.isArray(C.writeSet)?P(C.writeSet):[];return!W(F)||Y!==`*yolo @docs/stories/${F}.story.md branchless-preparation`||typeof C.dispatchId!="string"||!/^[a-f0-9]{64}$/.test(C.dispatchId)||typeof C.idempotencyKey!="string"||!/^[a-f0-9]{64}$/.test(C.idempotencyKey)||C.dependencyBasis!=="verified"||!Array.isArray(C.dependencies)||P(C.dependencies).length!==C.dependencies.length||!Array.isArray(C.writeSet)||A.length===0||A.length!==C.writeSet.length||!be(C.childExecutionAuthority,{storyId:F,invocationPrompt:Y,authorizedWriteSet:A})});return e.executor!=="root_agent_with_child_tasks"||e.legacyConcurrencyIgnored!==!0||Object.prototype.hasOwnProperty.call(e,"maxConcurrency")||Object.prototype.hasOwnProperty.call(e,"maxParallel")||o?.rootOwnedScheduling!=="continuous_dag_allowed"||o?.childPromptKind!=="per_story_branchless_preparation_only"||o?.childExecutionBoundary!=="filesystem_only"||o?.childTaskDelegation!=="allowed"||o?.maxDepth!==1||o?.childWorkspace!=="branchless_sandbox"||o?.epicCheckout!=="current_checkout"||o?.workspaceLifecycle!=="user_managed"||o?.integrationOwner!=="root_agent"||!y||y.schemaVersion!==1||y.strategy!=="continuous-event-driven-dag"||y.logicalConcurrency!=="ready-set"||y.capacityPolicy!=="backpressure-only"||y.rootOwnsLoop!==!0||y.maxDepth!==1||!/^[a-f0-9]{64}$/.test(b)||!Ht(g)||new Set(K).size!==K.length||K.some(C=>!W(C))||T.some(C=>!K.includes(C))||H.some(C=>!K.includes(C)||T.includes(C))||!G(a,T)||ae.length!==a.length||ae.some((C,F)=>C!==`*yolo @docs/stories/${a[F]}.story.md branchless-preparation`)||!J||J.source!=="state_snapshot"||!v||v.source!=="ready_wave"||!G(P(v.selectedStoryIds),a)||Q?O(p.YOLOOP_METADATA_INVALID,"Headless yoloop rejected an invalid continuous DAG execution plan.",[]):{ok:!0,mode:"continuous_dag",serverMaxConcurrency:a.length,parallelAuthorized:!0,continuous:!0}}if(e.version===2){const y=Ye(e);return y.ok?{ok:!0,mode:"parallel_wave",serverMaxConcurrency:y.childExecutionConcurrency,parallelAuthorized:!1,continuous:!1}:O(p.YOLOOP_METADATA_INVALID,"Headless yoloop rejected an unsafe phased execution plan.",[])}if(t!=="parallel_wave")return{ok:!0,mode:t,serverMaxConcurrency:1,parallelAuthorized:!1,continuous:!1};const s=e.maxConcurrency,i=e.maxParallel,d=I(e.dependencyBasis)?e.dependencyBasis:void 0,u=I(e.readinessBasis)?e.readinessBasis:void 0,m=Array.isArray(e.parallelWaves)?e.parallelWaves:[],f=m.length===1&&I(m[0])?m[0]:void 0;if(o.rootOwnedScheduling!=="parallel_wave_allowed"||!Number.isInteger(s)||typeof s!="number"||s<2||s>a.length||!Number.isInteger(i)||i!==s||!d||d.source!=="state_snapshot"||!G(P(d.storyIds),a)||!u||u.source!=="ready_wave"||!G(P(u.selectedStoryIds),a)||!f||!G(P(f.storyIds),a)||f.maxConcurrency!==s)return O(p.YOLOOP_METADATA_INVALID,"Headless yoloop parallel plan lacked consistent bounded authorization and readiness evidence.",[]);const c=P(f.promptTemplates);if(c.length!==a.length||new Set(c).size!==c.length)return O(p.YOLOOP_METADATA_INVALID,"Headless yoloop parallel wave prompts were incomplete or ambiguous.",[]);const S=(Array.isArray(f.proofSummaries)?f.proofSummaries:Array.isArray(e.proofSummaries)?e.proofSummaries:[]).find(y=>I(y)&&G(P(y.storyIds),a));return!I(S)||S.dependencyClosure!=="resolved"||S.contractOwnership!=="non_overlapping"||S.validationSurfaces!=="compatible"?O(p.YOLOOP_METADATA_INVALID,"Headless yoloop parallel plan lacked resolved independence proof.",[]):n.find(y=>I(y)&&typeof y.reason=="string"&&/(cycle|unresolved|ambiguous)/i.test(y.reason))?O(p.YOLOOP_METADATA_INVALID,"Headless yoloop parallel plan contained unresolved dependency evidence.",[]):{ok:!0,mode:"parallel_wave",serverMaxConcurrency:s,parallelAuthorized:!0,continuous:!1}}function be(e,t){if(!I(e)||!I(e.artifact))return;const o=e.artifact,a=Array.isArray(e.authorizedWriteSet)?P(e.authorizedWriteSet):[];if(Object.keys(e).sort().join("\0")!==["artifact","authorizedWriteSet","effectScope","invocationPrompt","kind","lifecycleAuthority","publicSafe","schemaVersion","storyId"].sort().join("\0")||Object.keys(o).sort().join("\0")!==["content","contentBinding","kind","path","schemaVersion"].sort().join("\0")||e.schemaVersion!==1||e.kind!=="branchless_story_preparation"||e.storyId!==t.storyId||e.invocationPrompt!==t.invocationPrompt||!Array.isArray(e.authorizedWriteSet)||a.length!==e.authorizedWriteSet.length||a.some(n=>Qe(n)!==n)||!Et(a,t.authorizedWriteSet)||e.effectScope!=="filesystem_only"||e.lifecycleAuthority!=="root_only"||e.publicSafe!==!0||o.schemaVersion!==1||o.kind!=="branchless_root_bound_artifact"||typeof o.path!="string"||!a.includes(o.path)||typeof o.content!="string"||o.content.length===0||o.content.length>4096||typeof o.contentBinding!="string"||!/^[a-f0-9]{64}$/.test(o.contentBinding))return;const r=Ee("sha256").update(["branchless-root-bound-artifact-v1",t.storyId,t.invocationPrompt,...a,"filesystem_only","root_only",o.path,o.content].join("\0")).digest("hex");if(o.contentBinding===r)return e}function Et(e,t){return e.length===t.length&&e.every((o,a)=>o===t[a])}function Rt(e){const t=[];t.push(...P(e.promptTemplates));for(const o of Array.isArray(e.serialSteps)?e.serialSteps:[])I(o)&&typeof o.promptTemplate=="string"&&t.push(o.promptTemplate);for(const o of Array.isArray(e.parallelWaves)?e.parallelWaves:[])I(o)&&t.push(...P(o.promptTemplates));return t}function X(e,t,o){if(Ce(e))return O(p.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected an unsafe child prompt shape.",[_("promptTemplate","prompt_body",w(e))]);if(!ce.test(e))return O(p.YOLOOP_METADATA_INVALID,"Headless yoloop child prompt did not match the canonical per-story yolo shape.",[_("promptTemplate","prompt_body",w(e))]);const a=at.test(e),r=e.replace(/^\*yolo @/,"").replace(/ branchless-preparation$/,""),n=Kt(r);return!rt.test(r)||!W(n)||!n.startsWith(`${t}.`)?O(p.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected a child prompt outside the targeted public epic.",[_("storyId","prompt_body",w(n))]):{ok:!0,prompt:{storyId:n,targetRef:r,commandRef:e,source:o,...a?{preparationOnly:!0}:{}}}}function vt(e){const t=e?.epicTerminalGitDirective;if(!(!I(t)||t.schemaVersion!==1||t.kind!=="epic_terminal_git"||typeof t.epicId!="string"||typeof t.executionBranch!="string"||typeof t.originBranch!="string"||typeof t.expectedExecutionHeadSha!="string"||!Array.isArray(t.storyCheckpointIds)||!I(t.localGates)||t.localGates.passed!==!0||!Array.isArray(t.localGates.receiptRefs)||!I(t.reconcile)||typeof t.idempotencyKey!="string"||t.publicSafe!==!0))return t}function Pt(e){const t=e?.epicGitReconciliationDirective;if(!(!I(t)||t.schemaVersion!==1||t.kind!=="epic_git_reconciliation"||typeof t.epicId!="string"||typeof t.executionBranch!="string"||typeof t.originBranch!="string"||!["start","resume","audit"].includes(String(t.lifecycleBoundary))||typeof t.dryRun!="boolean"||typeof t.idempotencyKey!="string"||t.publicSafe!==!0))return t}function Tt(e){if(!e||!I(e))return{ok:!1,reasonCode:p.YOLOOP_METADATA_INVALID,publicSummary:"Headless yoloop root invocation did not return public metadata.",redactionSummary:[]};const t=I(e.yoloopContinuationDecision)?e.yoloopContinuationDecision:void 0,o=typeof t?.outcome=="string"?t.outcome:void 0,a=o==="queue_exhausted"||e.yoloopComplete===!0,r=e.yoloopAborted===!0,n=o==="selected"&&t?.replay===!0;return o&&!["selected","queue_exhausted","blocked","cycle","invalid","no_progress"].includes(o)?{ok:!1,reasonCode:p.YOLOOP_METADATA_INVALID,publicSummary:"Headless yoloop rejected an unknown continuation outcome.",redactionSummary:[]}:o==="queue_exhausted"&&t?.terminalSuccess!==!0?{ok:!1,reasonCode:p.YOLOOP_METADATA_INVALID,publicSummary:"Headless yoloop rejected inconsistent queue exhaustion metadata.",redactionSummary:[]}:a&&r?{ok:!1,reasonCode:p.YOLOOP_METADATA_INVALID,publicSummary:"Headless yoloop metadata reported mutually exclusive terminal states.",redactionSummary:[_("yoloopTerminal","unsafe_key","value-denied")]}:{ok:!0,complete:a,aborted:r,outcome:o,replay:n}}function xt(e){const t=`${e.rootAttempt.execution_id}:${e.child.graphRevision??"legacy"}:${e.child.storyId}`,o=e.child.dispatchId??V("child-op",`${t}:${e.iteration}`),a=e.child.idempotencyKey??V("child-idem",`${t}:${e.iteration}`);return{schemaVersion:1,contractVersion:"continuity-v1",kind:"run_yolo",commandClass:e.rootAttempt.command_class==="goal-tick"?"goal-tick":"loop-tick",jobId:e.rootAttempt.job_id,operationId:o,idempotencyKey:a,targetKind:"story",targetRef:e.child.targetRef,commandRef:e.child.commandRef,...e.child.preparationOnly?{executionMode:"branchless_child_preparation"}:{},storyId:e.child.storyId,runtime:{runtimeId:e.runtimeId,...e.modelId?{modelId:e.modelId}:{},source:e.runtimeSource??"explicit",reasonCode:e.runtimeSource==="fallback"?p.RUNTIME_FALLBACK:p.RUNTIME_EXPLICIT,publicSafe:!0},publicSummary:`Root-owned yoloop delegated public story ${e.child.storyId}.`,reasonCode:p.OK,metadata:{governanceSource:"delegated-subagent",parentAttemptId:e.rootAttempt.attempt_id,parentExecutionId:e.rootAttempt.execution_id,iteration:e.iteration,...e.child.dispatchId?{dispatchId:e.child.dispatchId}:{},...e.child.graphRevision?{graphRevision:e.child.graphRevision}:{},...e.child.writeSet?{writeSet:e.child.writeSet}:{},...e.child.executionBranch?{executionBranch:e.child.executionBranch}:{},...e.child.graphRevision?{childWorkspace:"branchless_sandbox",epicCheckout:"current_checkout",workspaceLifecycle:"user_managed",integrationOwner:"root_agent",maxDepth:1}:{},publicSafe:!0},attempts:[],redactionSummary:[_("prompt","prompt_body",w(e.child.commandRef))],publicSafe:!0}}function ue(e,t,o){const a=ke(o.hashes),r=o.workerPoolSummary??le(),n=ke({iterations:o.counts.iterations,childCount:o.counts.childCount,succeededChildCount:o.counts.succeededChildCount,failedChildCount:o.counts.failedChildCount,skippedChildCount:o.counts.skippedChildCount,metadataCompleteCount:o.counts.metadataCompleteCount,metadataAbortedCount:o.counts.metadataAbortedCount,serverMaxConcurrency:r.serverMaxConcurrency,localCap:r.localCap,queueCap:r.queueCap,availableLeases:r.availableLeases,effectiveConcurrency:r.effectiveConcurrency,peakConcurrency:r.peakConcurrency,pendingChildCount:r.pendingChildCount,startedChildCount:r.startedChildCount,completedChildCount:r.completedChildCount,backpressurePauseCount:r.backpressurePauseCount}),s={schemaVersion:1,contractVersion:"continuity-v1",attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,directiveHash:t.directive_hash,status:o.status,reasonCode:o.reasonCode,storyIds:o.childStoryIds.slice(0,50),counts:n,hashes:a,...o.reasonCode===he.BYPASS_BLOCKED?{governanceEvidence:Te}:{},reasonCodes:B([o.reasonCode,...r.reasonCodes,...o.stateTransitions]),publicSummary:ie(o.publicSummary)};return e.completeHeadlessExecutionAttempt({attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,leaseId:o.leaseId,runnerId:o.runnerId,status:o.status,completedAt:o.completedAt,durationMs:o.durationMs,reasonCode:o.reasonCode,publicSummary:ie(o.publicSummary),notBeforeAt:o.notBeforeAt,retryCount:o.retryCount,counts:n,hashes:a,redactionSummary:o.redactionSummary,relativePaths:B([t.target_ref,...o.relativePaths]),metadata:s}),e.recordHeadlessExecutionReceipt({receiptId:`receipt-${V("headless-yoloop",`${t.attempt_id}-${o.status}`)}`,attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,status:o.receiptStatus,reasonCode:o.reasonCode,createdAt:o.completedAt,operationId:`${t.execution_id}:${o.status}:receipt`,idempotencyKey:`${t.directive_hash}:${o.status}:receipt`,counts:n,hashes:a,redactionSummary:o.redactionSummary,relativePaths:B([t.target_ref,...o.relativePaths]),metadata:s}),e.recordHeadlessExecutionSummary({eventId:`event-${V("headless-yoloop-summary",`${t.attempt_id}-${o.status}`)}`,attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,status:o.status,runtimeId:o.runtimeId,modelId:o.modelId,publicSummary:ie(o.publicSummary),reasonCode:o.reasonCode,createdAt:o.completedAt,durationMs:o.durationMs,counts:n,hashes:a,redactionSummary:o.redactionSummary,relativePaths:B([t.target_ref,...o.relativePaths]),metadata:s}),{attemptId:t.attempt_id,executionId:t.execution_id,jobId:t.job_id,status:o.status,outcome:o.receiptStatus,reasonCode:o.reasonCode,timestamp:o.completedAt,childStoryIds:o.childStoryIds,aggregateCounts:o.counts,workerPoolSummary:r,redactionSummary:o.redactionSummary,publicSafe:!0}}function wt(e,t){return{attemptId:e.attempt_id,executionId:e.execution_id,jobId:e.job_id,status:t.status,outcome:t.receiptStatus,reasonCode:t.reasonCode,timestamp:t.timestamp,childStoryIds:[],aggregateCounts:me(),workerPoolSummary:le(),redactionSummary:[],publicSafe:!0}}function Lt(e,t,o,a,r){if(!t.retryable)return{retry:!1};const n=e.retry_count+1;if(n>=Math.max(1,e.max_attempts||o))return{retry:!1,retryCount:n};const s=Math.min(8,2**Math.max(0,e.retry_count));return{retry:!0,retryCount:n,notBeforeAt:Oe(r,a*s)}}function R(e){return{status:e.status,receiptStatus:e.receiptStatus,reasonCode:e.reasonCode,publicSummary:e.publicSummary,retryable:e.retryable,durationMs:Math.max(0,Date.now()-e.startedAt),counts:e.counts,workerPoolSummary:e.workerPoolSummary??le(),hashes:e.hashes,redactionSummary:e.redactions.slice(0,50),relativePaths:B(e.relativePaths).slice(0,50),childStoryIds:B(e.childStoryIds).slice(0,50),stateTransitions:B(e.stateTransitions)}}function Dt(e,t){if(e===void 0)return;if(!I(e)){t.push(_("runtime","unsafe_key","value-denied"));return}for(const n of Object.keys(e))(!ct.has(n)||te.test(n))&&t.push(_(`runtime.${n}`,Z(n),"key-denied"));e.publicSafe!==!0&&t.push(_("runtime.publicSafe","unsafe_key","value-denied"));const o=N(e,"runtimeId"),a=N(e,"modelId"),r=N(e,"source");if(o&&(!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,79}$/.test(o)||L.test(o)||q.test(o))&&t.push(_("runtime.runtimeId","unsafe_key","value-denied")),a&&(!/^[A-Za-z0-9][A-Za-z0-9._:+/-]{0,119}$/.test(a)||L.test(a)||q.test(a))&&t.push(_("runtime.modelId","unsafe_key","value-denied")),r!==void 0&&r!=="explicit"&&r!=="origin"&&r!=="default"&&r!=="fallback"&&r!=="unspecified"&&t.push(_("runtime.source","unsafe_key","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||L.test(e.reasonCode))&&t.push(_("runtime.reasonCode","unsafe_key","value-denied")),e.publicSafe===!0)return{...o?{runtimeId:o}:{},...a?{modelId:a}:{},...r==="explicit"||r==="origin"||r==="default"||r==="fallback"||r==="unspecified"?{source:r}:{},...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},publicSafe:!0}}function Mt(e){const t=Array.isArray(e)?e:e?[e]:[],o=[];for(const a of t){const r=a.continuityExecutionDirectives;Array.isArray(r)&&o.push(...r)}return o}function Nt(e){return w(pe({kind:e.kind,commandClass:e.commandClass,jobId:e.jobId,targetRef:e.targetRef,commandRef:e.commandRef,epicId:e.epicId,runtime:e.runtime}))}function pe(e){return Array.isArray(e)?`[${e.map(pe).join(",")}]`:I(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${pe(e[t])}`).join(",")}}`:JSON.stringify(e)}function se(e,t,o){if(typeof e=="string"){(L.test(e)||q.test(e))&&o.push(_(t,Z(t),"value-denied"));return}if(!(e==null||typeof e=="number"||typeof e=="boolean")){if(Array.isArray(e)){e.forEach((a,r)=>se(a,`${t}.${r}`,o));return}if(I(e)){for(const[a,r]of Object.entries(e)){const n=`${t}.${a}`;te.test(a)&&o.push(_(n,Z(a),"key-denied")),se(r,n,o)}return}o.push(_(t,"unsafe_key","value-denied"))}}function jt(e,t){if(e===void 0)return[];if(!Array.isArray(e))return t.push(_("redactionSummary","unsafe_key","value-denied")),[];const o=[];for(const[a,r]of e.entries()){if(!I(r)||r.publicSafe!==!0){t.push(_(`redactionSummary.${a}`,"unsafe_key","value-denied"));continue}const n=N(r,"field"),s=N(r,"reason"),i=N(r,"evidence");if(!n||!s||!i||L.test(n)||L.test(s)||L.test(i)){t.push(_(`redactionSummary.${a}`,"unsafe_key","value-denied"));continue}o.push({field:n,reason:s,evidence:i,publicSafe:!0})}return o}function O(e,t,o){return{ok:!1,reasonCode:e,publicSummary:t,redactionSummary:o}}function P(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function Ht(e){return e.length>0&&e.length<=240&&!e.startsWith("-")&&!e.includes("..")&&!e.includes("\\")&&/^[A-Za-z0-9._/-]+$/.test(e)}function G(e,t){return e.length===t.length&&new Set(e).size===e.length&&e.every(o=>t.includes(o))}function zt(e){return de.test(e.target_ref)?[e.target_ref]:[]}function ke(e){if(!e)return;const t={};for(const[o,a]of Object.entries(e))!/^[A-Za-z0-9_.:-]{1,80}$/.test(o)||te.test(o)||L.test(o)||typeof a=="string"&&L.test(a)||(t[o]=a);return Object.keys(t).length>0?t:void 0}function me(){return E(0,0,0,0,0,0,0)}function E(e,t,o,a,r,n,s){return{iterations:e,childCount:t,succeededChildCount:o,failedChildCount:a,skippedChildCount:r,metadataCompleteCount:n,metadataAbortedCount:s}}function Kt(e){return e.replace(/^docs\/stories\//,"").replace(/\.story\.md$/,"")}function re(e){return e.replace(/^docs\/epics\/epic-/,"").replace(/\.md$/,"")}function W(e){return/^[A-Za-z0-9][A-Za-z0-9_-]*\.\d+[A-Za-z0-9_-]*$/.test(e)&&!L.test(e)&&!q.test(e)}function $t(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback")return e}function Bt(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback"||e==="unspecified")return e}function Z(e){return/prompt|commandRef/i.test(e)?"prompt_body":/std(?:out|err)|raw|log|transcript|stack/i.test(e)?"raw_log":/url/i.test(e)?"private_url":/path|cwd|argv|args|shell|command|binary|executable/i.test(e)?"executable_path":/secret|token|password|authorization|api[_-]?key|license/i.test(e)?"secret_or_pii":"unsafe_key"}function N(e,t){return typeof e[t]=="string"?e[t]:void 0}function fe(e){return!!(e&&st.test(e)&&!L.test(e)&&!q.test(e))}function I(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ut(e,t){return V(e,`${t}-${Date.now()}-${Re(4).toString("hex")}`)}function Oe(e,t){const o=Date.parse(e);return new Date((Number.isFinite(o)?o:Date.now())+t).toISOString()}function U(e,t,o){return Number.isFinite(e)?Math.max(t,Math.min(o,Math.floor(e))):t}function B(e){return Array.from(new Set(e))}function Ft(e,t){const o=new Set,a=[];for(const r of e){const n=t(r);o.has(n)||(o.add(n),a.push(r))}return a}export{_e as DEFAULT_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP,tt as DEFAULT_HEADLESS_YOLOOP_MAX_DURATION_MS,et as DEFAULT_HEADLESS_YOLOOP_MAX_ITERATIONS,ot as MAX_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP,so as RUN_YOLOOP_DRIVER_STATES,ft as defaultYoloopRootInvoker,io as isCanonicalDelegatedStoryPrompt,co as runYoloopExecutionPhase};
|
|
@@ -8,7 +8,7 @@ import type { SubagentHostApprovalPolicy } from '@neocortex/shared';
|
|
|
8
8
|
import { type LocalJobConsoleRegistration } from '../local-console.js';
|
|
9
9
|
export declare const HEADLESS_ADAPTER_IDS: readonly ["fake", "test", "opencode", "claude-code"];
|
|
10
10
|
export type HeadlessAdapterId = (typeof HEADLESS_ADAPTER_IDS)[number];
|
|
11
|
-
export type HeadlessPromptKind = 'yolo' | 'yoloop';
|
|
11
|
+
export type HeadlessPromptKind = 'yolo' | 'yolo-branchless-preparation' | 'yoloop';
|
|
12
12
|
export type HeadlessTargetKind = 'story' | 'epic';
|
|
13
13
|
export type HeadlessRuntimeSource = 'explicit' | 'origin' | 'default' | 'fallback' | 'unresolved';
|
|
14
14
|
export type HeadlessExecutionStatus = 'completed' | 'failed' | 'timed_out' | 'skipped';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createHash as v}from"node:crypto";import{spawn as V}from"node:child_process";import{createLocalJobConsoleServer as z}from"../local-console.js";const F=Object.freeze(["fake","test","opencode","claude-code"]),l=Object.freeze({OK:"continuity-ok",RUNTIME_EXPLICIT:"headless-runtime-explicit",RUNTIME_ORIGIN:"headless-runtime-origin",RUNTIME_DEFAULT:"headless-runtime-default",RUNTIME_FALLBACK:"headless-runtime-fallback",RUNTIME_UNRESOLVED:"headless-runtime-unresolved",RUNTIME_UNTRUSTED:"headless-runtime-untrusted",MODEL_REJECTED:"headless-model-rejected",DIRECTIVE_REJECTED:"headless-directive-rejected",PROMPT_REJECTED:"headless-prompt-rejected",ADAPTER_UNAVAILABLE:"headless-adapter-unavailable",RUNTIME_AUTH_REQUIRED:"headless-runtime-auth-required",MANAGED_PROFILE_MISSING:"headless-managed-profile-missing",MANAGED_PROFILE_INVALID:"headless-managed-profile-invalid",APPROVAL_POLICY_INVALID:"headless-approval-policy-invalid",APPROVAL_POLICY_MISMATCH:"headless-approval-policy-mismatch",EXECUTION_CANCELLED:"headless-execution-cancelled",EXECUTION_TIMEOUT:"headless-execution-timeout",EXECUTION_BACKOFF:"headless-execution-backoff",EXECUTION_COMPLETED:"headless-execution-completed",EXECUTION_FAILED:"headless-execution-failed",RECEIPT_REDACTED:"headless-receipt-redacted",YOLOOP_METADATA_INVALID:"headless-yoloop-metadata-invalid",YOLOOP_ISOLATION_VIOLATION:"headless-yoloop-isolation-violation",WORKER_POOL_SERIAL_FALLBACK:"worker-pool-serial-fallback",WORKER_POOL_PARALLEL_ACTIVE:"worker-pool-parallel-active",WORKER_POOL_BACKPRESSURE_PAUSED:"worker-pool-backpressure-paused"}),X=120,O=240,$=600*1e3,U=1800*1e3,Y=/^[A-Za-z0-9][A-Za-z0-9._:+/-]{0,119}$/,G=/^docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,J=/^docs\/epics\/epic-[A-Za-z0-9._-]+\.md$/,Z=/(raw[_-]?(?:logs?|payloads?)|std(?:out|err)|stack(?:[_-]?trace)?|transcript|objective(?:[_-]?(?:text|body|prompt))|prompt(?:[_-]?(?:body|text))?|private[_-]?(?:urls?|prompts?)|secret|token|password|protected(?:[_-]?(?:field|body|bodies|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|\bpii\b|authorization|api[_-]?key|license[_-]?key|argv|args|executable(?:[_-]?path)?|binary(?:[_-]?path)?|shell|cwd|command[_-]?path|vendor(?:[_-]?(?:payload|corpus|response|output)))/i,w=/(https?:\/\/\S+|(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)|ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=|raw[_-]?(?:logs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS)/i,L=/(?:[;&|`$<>]|\$\(|\n|\r|\0)/,q=new Set(["promptKind","targetKind","targetRef","storyId","epicId","runtimeId","modelId","runtimeSource","timeoutMs","receipt","publicSummary","publicSafe"]),W=new Set(["executionId","attemptId","jobId","operationId","idempotencyKey","runnerId","subagentId"]);function Q(e){return F.includes(e)}function pe(e,r){const t=[],s=[];if(!K(e))return t.push(i("input","unsafe_key","value-denied")),k(l.DIRECTIVE_REJECTED,"Headless adapter input must be a public object.",t);for(const m of Object.keys(e))q.has(m)||(s.push(m),t.push(i(m,x(m),"key-denied")));const u=e.publicSafe===!0;u||t.push(i("publicSafe","unsafe_key","value-denied"));const d=h(e.promptKind);d!=="yolo"&&d!=="yoloop"&&t.push(i("promptKind","unsafe_key","value-denied"));const p=h(e.targetKind);p!=="story"&&p!=="epic"&&t.push(i("targetKind","unsafe_key","value-denied"));const o=h(e.targetRef);(!o||!M(o)||L.test(o)||o.includes(".."))&&t.push(i("targetRef","prompt_body","value-denied")),d==="yolo"&&(p!=="story"||!o||!G.test(o))&&t.push(i("targetRef","prompt_body","value-denied")),d==="yoloop"&&(p!=="epic"||!o||!J.test(o))&&t.push(i("targetRef","prompt_body","value-denied"));const a=P(e.storyId,"storyId",t),f=P(e.epicId,"epicId",t);a&&o&&d==="yolo"&&a!==o.replace(/^docs\/stories\//,"").replace(/\.story\.md$/,"")&&t.push(i("storyId","prompt_body","value-denied")),f&&o&&d==="yoloop"&&f!==o.replace(/^docs\/epics\/epic-/,"").replace(/\.md$/,"")&&t.push(i("epicId","prompt_body","value-denied"));const E=h(e.runtimeId);(!E||!Q(E)||r&&E!==r)&&t.push(i("runtimeId","unsafe_key","value-denied"));const b=te(e.modelId,t),y=re(e.runtimeSource,t),_=se(e.timeoutMs,t),T=ne(e.publicSummary,t),S=ie(e.receipt,t);if(t.length>0||s.length>0||!u||!d||!p||!o||!E){const m=t.some(n=>n.field==="modelId"),g=t.some(n=>n.reason==="prompt_body");return k(m?l.MODEL_REJECTED:g?l.PROMPT_REJECTED:l.DIRECTIVE_REJECTED,g?"Headless adapter target did not match a public prompt shape.":"Headless adapter input failed public-safety validation.",t)}const A={promptKind:d,targetKind:p,targetRef:o,...a?{storyId:a}:{},...f?{epicId:f}:{},runtimeId:E,...b?{modelId:b}:{},...y?{runtimeSource:y}:{},..._?{timeoutMs:_}:{},...S?{receipt:S}:{},...T?{publicSummary:T}:{},publicSafe:!0},R=D(A);return{ok:!0,input:A,prompt:R,promptHash:I(R),reasonCodes:[l.OK],publicSafe:!0}}function D(e){return e.promptKind==="yolo"?`*yolo @${e.targetRef}`:`*yoloop @${e.targetRef}`}function I(e){return`sha256:${v("sha256").update(e).digest("hex")}`}function fe(e,r,t,s=0){return{status:"failed",adapterId:e,runtimeId:r,reasonCode:t.reasonCode,reasonCodes:t.reasonCodes,durationMs:s,counts:{},hashes:{},publicSummary:C(t.publicSummary),redactionSummary:t.redactionSummary,relativePaths:[],publicSafe:!0}}function Ee(e,r,t,s=0){return{status:"failed",adapterId:e,runtimeId:r.runtimeId,...r.modelId?{modelId:r.modelId}:{},...r.runtimeSource?{runtimeSource:r.runtimeSource}:{},reasonCode:t.reasonCode,reasonCodes:t.reasonCodes,durationMs:s,counts:{},hashes:{prompt:I(D(r))},publicSummary:C(t.publicSummary),redactionSummary:t.redactionSummary,relativePaths:[r.targetRef],...r.receipt?{receipt:r.receipt}:{},publicSafe:!0}}function me(e,r,t){const s=D(r),u=I(t.stdout),d=I(t.stderr),p=t.timedOut||t.exitCode===0?0:ae(t.stdout,t.stderr),o=t.cancelled?"failed":t.timedOut?"timed_out":t.exitCode===0?"completed":"failed",a=t.cancelled?l.EXECUTION_CANCELLED:t.timedOut?l.EXECUTION_TIMEOUT:t.exitCode===0?l.EXECUTION_COMPLETED:p>0?l.RUNTIME_AUTH_REQUIRED:l.EXECUTION_FAILED,f=[i("prompt","prompt_body",I(s))];return t.stdoutBytes>0&&f.push(i("stdout","raw_log",u)),t.stderrBytes>0&&f.push(i("stderr","raw_log",d)),{status:o,adapterId:e,runtimeId:r.runtimeId,...r.modelId?{modelId:r.modelId}:{},...r.runtimeSource?{runtimeSource:r.runtimeSource}:{},reasonCode:a,reasonCodes:[a,l.RECEIPT_REDACTED],exitCode:t.exitCode,signal:t.signal??null,durationMs:t.durationMs,counts:{stdoutBytes:t.stdoutBytes,stderrBytes:t.stderrBytes,stdoutLines:H(t.stdout),stderrLines:H(t.stderr),...p>0?{authEvidenceMatches:p}:{}},hashes:{prompt:I(s),stdout:u,stderr:d},publicSummary:o==="completed"?"Headless adapter completed with public-safe redacted output summary.":a===l.EXECUTION_CANCELLED?"Headless adapter was cancelled; raw output was redacted.":o==="timed_out"?"Headless adapter timed out; raw output was redacted.":a===l.RUNTIME_AUTH_REQUIRED?"Headless adapter requires local runtime authentication; raw output was redacted.":"Headless adapter failed; raw output was redacted.",redactionSummary:f,relativePaths:[r.targetRef],...r.receipt?{receipt:r.receipt}:{},publicSafe:!0}}async function _e(e,r,t={}){const s=Date.now(),u=oe(t.timeoutMs),d=t.maxOutputBytes??64e3;return t.signal?.aborted?{exitCode:null,signal:"SIGTERM",timedOut:!1,cancelled:!0,durationMs:Date.now()-s,stdout:"",stderr:"",stdoutBytes:0,stderrBytes:0}:await new Promise(p=>{const o=V(e,[...r],{cwd:t.cwd,env:t.env,shell:!1,stdio:[t.localConsole?"pipe":"ignore","pipe","pipe"]}),a=t.localConsole?.jobId?z({...t.localConsole,projectRoot:t.localConsole.projectRoot??t.cwd,writeStdin:n=>{o.stdin?.write(n)},signalProcess:n=>o.kill(n)}):void 0;a?.start();let f="",E="",b=0,y=0,_=!1,T=!1,S=!1;const A=()=>{_||(S=!0,o.kill("SIGTERM"))};t.signal?.addEventListener("abort",A,{once:!0});const R=()=>{t.signal?.removeEventListener("abort",A)},m=(n,c,B)=>{const N=B+c.length;if(n.length<d){const j=d-n.length;return{text:n+c.toString("utf8").slice(0,j),bytes:N}}return{text:n,bytes:N}};o.stdout?.on("data",n=>{const c=m(f,n,b);f=c.text,b=c.bytes,a?.broadcastStdout(n)}),o.stderr?.on("data",n=>{const c=m(E,n,y);E=c.text,y=c.bytes,a?.broadcastStderr(n)});const g=setTimeout(()=>{T=!0,o.kill("SIGTERM")},u);o.on("error",n=>{if(_)return;_=!0,clearTimeout(g),R(),a?.close({exitCode:127,signal:null});const c=n instanceof Error?n.message:String(n);p({exitCode:127,signal:null,timedOut:!1,cancelled:S,durationMs:Date.now()-s,stdout:f,stderr:c,stdoutBytes:b,stderrBytes:Buffer.byteLength(c)})}),o.on("close",(n,c)=>{_||(_=!0,clearTimeout(g),R(),a?.close({exitCode:n,signal:c}),p({exitCode:n,signal:c,timedOut:T,cancelled:S,durationMs:Date.now()-s,stdout:f,stderr:E,stdoutBytes:b,stderrBytes:y}))})})}function be(e,r,t,s,u=[]){return{ok:!1,adapterId:e,...r?{commandName:r}:{},reasonCode:t,reasonCodes:[t],publicSummary:C(s),redactionSummary:u,publicSafe:!0}}function Ie(e,r,t,s={}){const u={ok:!0,adapterId:e,commandName:r,...s.versionText?{versionHash:I(s.versionText)}:{},reasonCodes:[l.OK],publicSummary:C(t),publicSafe:!0};return s.executablePath&&Object.defineProperty(u,"executablePath",{value:s.executablePath,enumerable:!1,configurable:!1}),u}function i(e,r,t){return{field:e,reason:r,evidence:t,publicSafe:!0}}function C(e){return e.length<=O?e:`${e.slice(0,O)}\u2026[TRUNCATED:${e.length-O}]`}function ee(e){return e.length<=X&&Y.test(e)&&!w.test(e)&&!L.test(e)&&!e.includes("..")&&!e.startsWith("/")}function k(e,r,t){return{ok:!1,reasonCode:e,reasonCodes:[e],publicSummary:C(r),redactionSummary:t,publicSafe:!0}}function P(e,r,t){if(e===void 0)return;const s=h(e);if(!s||!M(s)||L.test(s)){t.push(i(r,x(r),"value-denied"));return}return s}function te(e,r){if(e===void 0)return;const t=h(e);if(!t||!ee(t)){r.push(i("modelId","unsafe_key","value-denied"));return}return t}function re(e,r){if(e!==void 0){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback")return e;r.push(i("runtimeSource","unsafe_key","value-denied"))}}function se(e,r){if(e!==void 0){if(typeof e!="number"||!Number.isInteger(e)||e<=0||e>U){r.push(i("timeoutMs","unbounded_number","value-denied"));return}return e}}function oe(e){return!e||!Number.isInteger(e)||e<=0||e>U?$:e}function ne(e,r){if(e===void 0)return;const t=h(e);if(!t||t.length>O||!M(t)){r.push(i("publicSummary","unbounded_text","value-denied"));return}return t}function ie(e,r){if(e===void 0)return;if(!K(e)){r.push(i("receipt","unsafe_key","value-denied"));return}const t={};for(const[s,u]of Object.entries(e)){if(!W.has(s)||Z.test(s)){r.push(i(`receipt.${s}`,x(s),"key-denied"));continue}const d=P(u,`receipt.${s}`,r);d&&(t[s]=d)}return Object.keys(t).length>0?t:void 0}function x(e){return/prompt/i.test(e)?"prompt_body":/std(?:out|err)|raw|log|transcript|stack/i.test(e)?"raw_log":/url/i.test(e)?"private_url":/path|cwd|argv|args|shell|command|binary|executable/i.test(e)?"executable_path":/secret|token|password|authorization|api[_-]?key|license/i.test(e)?"secret_or_pii":"unsafe_key"}function h(e){return typeof e=="string"?e:void 0}function M(e){return e.length>0&&!w.test(e)&&!/\0/.test(e)}function H(e){return e?e.split(/\r?\n/).filter(r=>r.length>0).length:0}const de=Object.freeze([/\bauth(?:entication|orization)?\s+(?:is\s+)?required\b/i,/\brequires?\s+authentication\b/i,/\bmust\s+(?:log\s?in|authenticate|be\s+authenticated)\b/i,/\bunauthenticated\b/i,/\b(?:not|unauthenticated)\s+(?:logged\s+in|authenticated)\b/i,/\blog\s?in\s+(?:required|to\s+continue|before\s+continuing)\b/i,/\bplease\s+(?:log\s?in|authenticate|sign\s?in)\b/i,/\bsign\s?in\s+(?:required|to\s+continue|before\s+continuing)\b/i,/\bsession\s+(?:expired|not\s+found|invalid)\b/i,/\bcredentials?\s+(?:missing|required|not\s+found)\b/i]);function ae(...e){const r=e.filter(t=>t.length>0).map(t=>t.slice(0,8e3)).join(`
|
|
2
|
-
`);return r?
|
|
1
|
+
import{createHash as v}from"node:crypto";import{spawn as V}from"node:child_process";import{createLocalJobConsoleServer as z}from"../local-console.js";const F=Object.freeze(["fake","test","opencode","claude-code"]),l=Object.freeze({OK:"continuity-ok",RUNTIME_EXPLICIT:"headless-runtime-explicit",RUNTIME_ORIGIN:"headless-runtime-origin",RUNTIME_DEFAULT:"headless-runtime-default",RUNTIME_FALLBACK:"headless-runtime-fallback",RUNTIME_UNRESOLVED:"headless-runtime-unresolved",RUNTIME_UNTRUSTED:"headless-runtime-untrusted",MODEL_REJECTED:"headless-model-rejected",DIRECTIVE_REJECTED:"headless-directive-rejected",PROMPT_REJECTED:"headless-prompt-rejected",ADAPTER_UNAVAILABLE:"headless-adapter-unavailable",RUNTIME_AUTH_REQUIRED:"headless-runtime-auth-required",MANAGED_PROFILE_MISSING:"headless-managed-profile-missing",MANAGED_PROFILE_INVALID:"headless-managed-profile-invalid",APPROVAL_POLICY_INVALID:"headless-approval-policy-invalid",APPROVAL_POLICY_MISMATCH:"headless-approval-policy-mismatch",EXECUTION_CANCELLED:"headless-execution-cancelled",EXECUTION_TIMEOUT:"headless-execution-timeout",EXECUTION_BACKOFF:"headless-execution-backoff",EXECUTION_COMPLETED:"headless-execution-completed",EXECUTION_FAILED:"headless-execution-failed",RECEIPT_REDACTED:"headless-receipt-redacted",YOLOOP_METADATA_INVALID:"headless-yoloop-metadata-invalid",YOLOOP_ISOLATION_VIOLATION:"headless-yoloop-isolation-violation",WORKER_POOL_SERIAL_FALLBACK:"worker-pool-serial-fallback",WORKER_POOL_PARALLEL_ACTIVE:"worker-pool-parallel-active",WORKER_POOL_BACKPRESSURE_PAUSED:"worker-pool-backpressure-paused"}),$=120,O=240,X=600*1e3,U=1800*1e3,Y=/^[A-Za-z0-9][A-Za-z0-9._:+/-]{0,119}$/,G=/^docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,J=/^docs\/epics\/epic-[A-Za-z0-9._-]+\.md$/,Z=/(raw[_-]?(?:logs?|payloads?)|std(?:out|err)|stack(?:[_-]?trace)?|transcript|objective(?:[_-]?(?:text|body|prompt))|prompt(?:[_-]?(?:body|text))?|private[_-]?(?:urls?|prompts?)|secret|token|password|protected(?:[_-]?(?:field|body|bodies|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|\bpii\b|authorization|api[_-]?key|license[_-]?key|argv|args|executable(?:[_-]?path)?|binary(?:[_-]?path)?|shell|cwd|command[_-]?path|vendor(?:[_-]?(?:payload|corpus|response|output)))/i,w=/(https?:\/\/\S+|(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)|ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=|raw[_-]?(?:logs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS)/i,L=/(?:[;&|`$<>]|\$\(|\n|\r|\0)/,q=new Set(["promptKind","targetKind","targetRef","storyId","epicId","runtimeId","modelId","runtimeSource","timeoutMs","receipt","publicSummary","publicSafe"]),W=new Set(["executionId","attemptId","jobId","operationId","idempotencyKey","runnerId","subagentId"]);function Q(e){return F.includes(e)}function pe(e,r){const t=[],s=[];if(!K(e))return t.push(i("input","unsafe_key","value-denied")),k(l.DIRECTIVE_REJECTED,"Headless adapter input must be a public object.",t);for(const m of Object.keys(e))q.has(m)||(s.push(m),t.push(i(m,x(m),"key-denied")));const u=e.publicSafe===!0;u||t.push(i("publicSafe","unsafe_key","value-denied"));const a=h(e.promptKind);a!=="yolo"&&a!=="yolo-branchless-preparation"&&a!=="yoloop"&&t.push(i("promptKind","unsafe_key","value-denied"));const p=h(e.targetKind);p!=="story"&&p!=="epic"&&t.push(i("targetKind","unsafe_key","value-denied"));const o=h(e.targetRef);(!o||!M(o)||L.test(o)||o.includes(".."))&&t.push(i("targetRef","prompt_body","value-denied")),(a==="yolo"||a==="yolo-branchless-preparation")&&(p!=="story"||!o||!G.test(o))&&t.push(i("targetRef","prompt_body","value-denied")),a==="yoloop"&&(p!=="epic"||!o||!J.test(o))&&t.push(i("targetRef","prompt_body","value-denied"));const d=P(e.storyId,"storyId",t),f=P(e.epicId,"epicId",t);d&&o&&(a==="yolo"||a==="yolo-branchless-preparation")&&d!==o.replace(/^docs\/stories\//,"").replace(/\.story\.md$/,"")&&t.push(i("storyId","prompt_body","value-denied")),f&&o&&a==="yoloop"&&f!==o.replace(/^docs\/epics\/epic-/,"").replace(/\.md$/,"")&&t.push(i("epicId","prompt_body","value-denied"));const E=h(e.runtimeId);(!E||!Q(E)||r&&E!==r)&&t.push(i("runtimeId","unsafe_key","value-denied"));const b=te(e.modelId,t),y=re(e.runtimeSource,t),_=se(e.timeoutMs,t),T=ne(e.publicSummary,t),S=ie(e.receipt,t);if(t.length>0||s.length>0||!u||!a||!p||!o||!E){const m=t.some(n=>n.field==="modelId"),g=t.some(n=>n.reason==="prompt_body");return k(m?l.MODEL_REJECTED:g?l.PROMPT_REJECTED:l.DIRECTIVE_REJECTED,g?"Headless adapter target did not match a public prompt shape.":"Headless adapter input failed public-safety validation.",t)}const A={promptKind:a,targetKind:p,targetRef:o,...d?{storyId:d}:{},...f?{epicId:f}:{},runtimeId:E,...b?{modelId:b}:{},...y?{runtimeSource:y}:{},..._?{timeoutMs:_}:{},...S?{receipt:S}:{},...T?{publicSummary:T}:{},publicSafe:!0},R=D(A);return{ok:!0,input:A,prompt:R,promptHash:I(R),reasonCodes:[l.OK],publicSafe:!0}}function D(e){return e.promptKind==="yolo"?`*yolo @${e.targetRef}`:e.promptKind==="yolo-branchless-preparation"?`*yolo @${e.targetRef} branchless-preparation`:`*yoloop @${e.targetRef}`}function I(e){return`sha256:${v("sha256").update(e).digest("hex")}`}function fe(e,r,t,s=0){return{status:"failed",adapterId:e,runtimeId:r,reasonCode:t.reasonCode,reasonCodes:t.reasonCodes,durationMs:s,counts:{},hashes:{},publicSummary:C(t.publicSummary),redactionSummary:t.redactionSummary,relativePaths:[],publicSafe:!0}}function Ee(e,r,t,s=0){return{status:"failed",adapterId:e,runtimeId:r.runtimeId,...r.modelId?{modelId:r.modelId}:{},...r.runtimeSource?{runtimeSource:r.runtimeSource}:{},reasonCode:t.reasonCode,reasonCodes:t.reasonCodes,durationMs:s,counts:{},hashes:{prompt:I(D(r))},publicSummary:C(t.publicSummary),redactionSummary:t.redactionSummary,relativePaths:[r.targetRef],...r.receipt?{receipt:r.receipt}:{},publicSafe:!0}}function me(e,r,t){const s=D(r),u=I(t.stdout),a=I(t.stderr),p=t.timedOut||t.exitCode===0?0:de(t.stdout,t.stderr),o=t.cancelled?"failed":t.timedOut?"timed_out":t.exitCode===0?"completed":"failed",d=t.cancelled?l.EXECUTION_CANCELLED:t.timedOut?l.EXECUTION_TIMEOUT:t.exitCode===0?l.EXECUTION_COMPLETED:p>0?l.RUNTIME_AUTH_REQUIRED:l.EXECUTION_FAILED,f=[i("prompt","prompt_body",I(s))];return t.stdoutBytes>0&&f.push(i("stdout","raw_log",u)),t.stderrBytes>0&&f.push(i("stderr","raw_log",a)),{status:o,adapterId:e,runtimeId:r.runtimeId,...r.modelId?{modelId:r.modelId}:{},...r.runtimeSource?{runtimeSource:r.runtimeSource}:{},reasonCode:d,reasonCodes:[d,l.RECEIPT_REDACTED],exitCode:t.exitCode,signal:t.signal??null,durationMs:t.durationMs,counts:{stdoutBytes:t.stdoutBytes,stderrBytes:t.stderrBytes,stdoutLines:H(t.stdout),stderrLines:H(t.stderr),...p>0?{authEvidenceMatches:p}:{}},hashes:{prompt:I(s),stdout:u,stderr:a},publicSummary:o==="completed"?"Headless adapter completed with public-safe redacted output summary.":d===l.EXECUTION_CANCELLED?"Headless adapter was cancelled; raw output was redacted.":o==="timed_out"?"Headless adapter timed out; raw output was redacted.":d===l.RUNTIME_AUTH_REQUIRED?"Headless adapter requires local runtime authentication; raw output was redacted.":"Headless adapter failed; raw output was redacted.",redactionSummary:f,relativePaths:[r.targetRef],...r.receipt?{receipt:r.receipt}:{},publicSafe:!0}}async function _e(e,r,t={}){const s=Date.now(),u=oe(t.timeoutMs),a=t.maxOutputBytes??64e3;return t.signal?.aborted?{exitCode:null,signal:"SIGTERM",timedOut:!1,cancelled:!0,durationMs:Date.now()-s,stdout:"",stderr:"",stdoutBytes:0,stderrBytes:0}:await new Promise(p=>{const o=V(e,[...r],{cwd:t.cwd,env:t.env,shell:!1,stdio:[t.localConsole?"pipe":"ignore","pipe","pipe"]}),d=t.localConsole?.jobId?z({...t.localConsole,projectRoot:t.localConsole.projectRoot??t.cwd,writeStdin:n=>{o.stdin?.write(n)},signalProcess:n=>o.kill(n)}):void 0;d?.start();let f="",E="",b=0,y=0,_=!1,T=!1,S=!1;const A=()=>{_||(S=!0,o.kill("SIGTERM"))};t.signal?.addEventListener("abort",A,{once:!0});const R=()=>{t.signal?.removeEventListener("abort",A)},m=(n,c,B)=>{const N=B+c.length;if(n.length<a){const j=a-n.length;return{text:n+c.toString("utf8").slice(0,j),bytes:N}}return{text:n,bytes:N}};o.stdout?.on("data",n=>{const c=m(f,n,b);f=c.text,b=c.bytes,d?.broadcastStdout(n)}),o.stderr?.on("data",n=>{const c=m(E,n,y);E=c.text,y=c.bytes,d?.broadcastStderr(n)});const g=setTimeout(()=>{T=!0,o.kill("SIGTERM")},u);o.on("error",n=>{if(_)return;_=!0,clearTimeout(g),R(),d?.close({exitCode:127,signal:null});const c=n instanceof Error?n.message:String(n);p({exitCode:127,signal:null,timedOut:!1,cancelled:S,durationMs:Date.now()-s,stdout:f,stderr:c,stdoutBytes:b,stderrBytes:Buffer.byteLength(c)})}),o.on("close",(n,c)=>{_||(_=!0,clearTimeout(g),R(),d?.close({exitCode:n,signal:c}),p({exitCode:n,signal:c,timedOut:T,cancelled:S,durationMs:Date.now()-s,stdout:f,stderr:E,stdoutBytes:b,stderrBytes:y}))})})}function be(e,r,t,s,u=[]){return{ok:!1,adapterId:e,...r?{commandName:r}:{},reasonCode:t,reasonCodes:[t],publicSummary:C(s),redactionSummary:u,publicSafe:!0}}function Ie(e,r,t,s={}){const u={ok:!0,adapterId:e,commandName:r,...s.versionText?{versionHash:I(s.versionText)}:{},reasonCodes:[l.OK],publicSummary:C(t),publicSafe:!0};return s.executablePath&&Object.defineProperty(u,"executablePath",{value:s.executablePath,enumerable:!1,configurable:!1}),u}function i(e,r,t){return{field:e,reason:r,evidence:t,publicSafe:!0}}function C(e){return e.length<=O?e:`${e.slice(0,O)}\u2026[TRUNCATED:${e.length-O}]`}function ee(e){return e.length<=$&&Y.test(e)&&!w.test(e)&&!L.test(e)&&!e.includes("..")&&!e.startsWith("/")}function k(e,r,t){return{ok:!1,reasonCode:e,reasonCodes:[e],publicSummary:C(r),redactionSummary:t,publicSafe:!0}}function P(e,r,t){if(e===void 0)return;const s=h(e);if(!s||!M(s)||L.test(s)){t.push(i(r,x(r),"value-denied"));return}return s}function te(e,r){if(e===void 0)return;const t=h(e);if(!t||!ee(t)){r.push(i("modelId","unsafe_key","value-denied"));return}return t}function re(e,r){if(e!==void 0){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback")return e;r.push(i("runtimeSource","unsafe_key","value-denied"))}}function se(e,r){if(e!==void 0){if(typeof e!="number"||!Number.isInteger(e)||e<=0||e>U){r.push(i("timeoutMs","unbounded_number","value-denied"));return}return e}}function oe(e){return!e||!Number.isInteger(e)||e<=0||e>U?X:e}function ne(e,r){if(e===void 0)return;const t=h(e);if(!t||t.length>O||!M(t)){r.push(i("publicSummary","unbounded_text","value-denied"));return}return t}function ie(e,r){if(e===void 0)return;if(!K(e)){r.push(i("receipt","unsafe_key","value-denied"));return}const t={};for(const[s,u]of Object.entries(e)){if(!W.has(s)||Z.test(s)){r.push(i(`receipt.${s}`,x(s),"key-denied"));continue}const a=P(u,`receipt.${s}`,r);a&&(t[s]=a)}return Object.keys(t).length>0?t:void 0}function x(e){return/prompt/i.test(e)?"prompt_body":/std(?:out|err)|raw|log|transcript|stack/i.test(e)?"raw_log":/url/i.test(e)?"private_url":/path|cwd|argv|args|shell|command|binary|executable/i.test(e)?"executable_path":/secret|token|password|authorization|api[_-]?key|license/i.test(e)?"secret_or_pii":"unsafe_key"}function h(e){return typeof e=="string"?e:void 0}function M(e){return e.length>0&&!w.test(e)&&!/\0/.test(e)}function H(e){return e?e.split(/\r?\n/).filter(r=>r.length>0).length:0}const ae=Object.freeze([/\bauth(?:entication|orization)?\s+(?:is\s+)?required\b/i,/\brequires?\s+authentication\b/i,/\bmust\s+(?:log\s?in|authenticate|be\s+authenticated)\b/i,/\bunauthenticated\b/i,/\b(?:not|unauthenticated)\s+(?:logged\s+in|authenticated)\b/i,/\blog\s?in\s+(?:required|to\s+continue|before\s+continuing)\b/i,/\bplease\s+(?:log\s?in|authenticate|sign\s?in)\b/i,/\bsign\s?in\s+(?:required|to\s+continue|before\s+continuing)\b/i,/\bsession\s+(?:expired|not\s+found|invalid)\b/i,/\bcredentials?\s+(?:missing|required|not\s+found)\b/i]);function de(...e){const r=e.filter(t=>t.length>0).map(t=>t.slice(0,8e3)).join(`
|
|
2
|
+
`);return r?ae.reduce((t,s)=>t+(s.test(r)?1:0),0):0}function K(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}export{F as HEADLESS_ADAPTER_IDS,l as HEADLESS_REASON_CODES,be as adapterAvailabilityFailure,Ie as adapterAvailabilitySuccess,C as boundPublicSummary,fe as createRejectedExecutionResult,Ee as createUnavailableExecutionResult,I as hashPublicValue,Q as isHeadlessAdapterId,ee as isSafeHeadlessModelId,me as normalizeHeadlessCommandResult,i as redaction,D as renderHeadlessPrompt,_e as runHeadlessCommand,pe as validateHeadlessAdapterExecutionInput};
|
|
File without changes
|