@ornexus/neocortex 4.60.22 → 4.60.24
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 +24 -24
- package/install.js +67 -10
- package/install.ps1 +39 -8
- package/install.sh +18 -6
- package/package.json +9 -3
- 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 +39 -26
- package/packages/client/dist/commands/invoke.js +56 -50
- 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/continuity/invoke-hooks.js +1 -1
- package/packages/client/dist/fs/atomic-state-replace.d.ts +16 -0
- package/packages/client/dist/fs/atomic-state-replace.js +1 -0
- package/packages/client/dist/generated/command-registry.generated.d.ts +51 -51
- 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-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/pre-command-hook.d.ts +11 -0
- package/packages/client/dist/graph-retrieval/pre-command-hook.js +1 -1
- 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/invocation/invoke-input.d.ts +9 -0
- package/packages/client/dist/invocation/invoke-input.js +1 -0
- 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/migrations/project-identity-capability.d.ts +13 -0
- package/packages/client/dist/migrations/project-identity-capability.js +1 -0
- package/packages/client/dist/migrations/project-identity.d.ts +41 -0
- package/packages/client/dist/migrations/project-identity.js +7 -0
- 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/state/invocation-shape.d.ts +9 -0
- package/packages/client/dist/state/invocation-shape.js +1 -0
- package/packages/client/dist/state/project-state-snapshot.d.ts +9 -3
- 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/state/structural-dag-projection.d.ts +24 -0
- package/packages/client/dist/state/structural-dag-projection.js +1 -0
- 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 +64 -65
- package/packages/shared/dist/generated/invocation-schema.generated.js +16 -24
- package/packages/shared/dist/invocation/index.d.ts +6 -2
- package/packages/shared/dist/invocation/index.js +5 -0
- package/packages/shared/dist/invocation/input-envelope.d.ts +37 -0
- package/packages/shared/dist/invocation/input-envelope.js +98 -0
- package/packages/shared/dist/invocation/project-identity-migration.d.ts +28 -0
- package/packages/shared/dist/invocation/project-identity-migration.js +83 -0
- package/packages/shared/dist/invocation/public-diagnostics.d.ts +87 -0
- package/packages/shared/dist/invocation/public-diagnostics.js +181 -0
- package/packages/shared/dist/invocation/state-projection.d.ts +21 -0
- package/packages/shared/dist/invocation/state-projection.js +1 -0
- package/packages/shared/dist/invocation/strict-effect-receipt.d.ts +12 -0
- package/packages/shared/dist/invocation/strict-effect-receipt.js +43 -0
- 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};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InvocationShapeV2 } from '../../../shared/dist/invocation/index.js';
|
|
2
|
+
export interface InvocationShapeEvidence {
|
|
3
|
+
readonly commandId: string;
|
|
4
|
+
readonly targetStoryId?: string | null;
|
|
5
|
+
readonly explicitYoloopEpicId?: string | null;
|
|
6
|
+
readonly sessionYoloopEpicId?: string | null;
|
|
7
|
+
}
|
|
8
|
+
/** Pure classification; state projection consumes this before selecting data. */
|
|
9
|
+
export declare function classifyInvocationShapeV2(evidence: InvocationShapeEvidence): InvocationShapeV2 | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function l(o){return o.commandId==="yolo"||o.commandId==="yolo-inline"?o.targetStoryId?"yolo-story":"yolo-inline":o.commandId!=="yoloop"?null:o.explicitYoloopEpicId?"yoloop-target":o.sessionYoloopEpicId?"yoloop-session":"yoloop-discovery"}export{l as classifyInvocationShapeV2};
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Pure request-scoped projection helpers for invoke state snapshots.
|
|
6
6
|
*/
|
|
7
7
|
import type { StateSnapshot } from '../commands/invoke.js';
|
|
8
|
+
import type { StateProjectionResultV2 } from '../../../shared/dist/invocation/index.js';
|
|
8
9
|
/**
|
|
9
10
|
* P198.04 -- deterministic post-assembly state degradation.
|
|
10
11
|
*
|
|
@@ -17,8 +18,13 @@ export declare function degradeStateSnapshotForPayloadLimit(snapshot: StateSnaps
|
|
|
17
18
|
/**
|
|
18
19
|
* Return a request-scoped state snapshot for invoke commands.
|
|
19
20
|
*
|
|
20
|
-
* The function is intentionally pure.
|
|
21
|
-
*
|
|
22
|
-
* instead of sending an ambiguous partial projection.
|
|
21
|
+
* The function is intentionally pure. Structural uncertainty fails closed;
|
|
22
|
+
* callers must surface the public code instead of sending a full-state fallback.
|
|
23
23
|
*/
|
|
24
24
|
export declare function projectStateSnapshotForInvoke(args: string, snapshot: StateSnapshot): StateSnapshot;
|
|
25
|
+
/**
|
|
26
|
+
* Versioned result contract for the five structural YOLO/yoloop shapes.
|
|
27
|
+
* Other command families retain their existing projection policy and return
|
|
28
|
+
* null because they are outside StateProjectionV2's closed shape union.
|
|
29
|
+
*/
|
|
30
|
+
export declare function projectStateSnapshotResultV2ForInvoke(args: string, snapshot: StateSnapshot): StateProjectionResultV2<StateSnapshot> | null;
|