@ornexus/neocortex 4.60.18 → 4.60.20
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 +6504 -6410
- package/docs/install/installer-diagnostics.md +52 -0
- package/install.ps1 +1 -1
- package/install.sh +1 -1
- package/package.json +27 -4
- package/packages/client/dist/agent/refresh-stubs.d.ts +7 -0
- package/packages/client/dist/agent/refresh-stubs.js +2 -2
- package/packages/client/dist/cache/encrypted-cache.d.ts +3 -0
- package/packages/client/dist/cache/encrypted-cache.js +1 -1
- package/packages/client/dist/checkpoint/checkpoint-client-reader.js +2 -2
- package/packages/client/dist/cli.js +3 -3
- package/packages/client/dist/commands/activate.js +7 -7
- package/packages/client/dist/commands/config.js +1 -1
- package/packages/client/dist/commands/invoke.d.ts +64 -0
- package/packages/client/dist/commands/invoke.js +54 -47
- package/packages/client/dist/config/secure-config.d.ts +9 -3
- package/packages/client/dist/config/secure-config.js +8 -8
- package/packages/client/dist/config.d.ts +1 -1
- package/packages/client/dist/config.js +1 -1
- package/packages/client/dist/continuity/continuity-client-state-store.d.ts +1 -0
- package/packages/client/dist/continuity/continuity-client-state-store.js +1 -1
- package/packages/client/dist/continuity/invoke-hooks.d.ts +2 -1
- package/packages/client/dist/continuity/invoke-hooks.js +1 -1
- package/packages/client/dist/continuity/sqlite-store.d.ts +21 -0
- package/packages/client/dist/continuity/sqlite-store.js +49 -49
- package/packages/client/dist/effects/invoke-effect-gateways.d.ts +22 -0
- package/packages/client/dist/effects/invoke-effect-gateways.js +1 -0
- package/packages/client/dist/errors/frontmatter-diagnostics.d.ts +20 -0
- package/packages/client/dist/errors/frontmatter-diagnostics.js +1 -0
- package/packages/client/dist/generated/command-registry.generated.d.ts +2836 -0
- package/packages/client/dist/generated/command-registry.generated.js +1 -0
- package/packages/client/dist/graph-retrieval/pre-command-hook.d.ts +2 -0
- package/packages/client/dist/graph-retrieval/pre-command-hook.js +1 -1
- package/packages/client/dist/index.d.ts +1 -0
- package/packages/client/dist/index.js +1 -1
- package/packages/client/dist/license/license-client.d.ts +3 -0
- package/packages/client/dist/license/license-client.js +1 -1
- package/packages/client/dist/machine/fingerprint.d.ts +3 -1
- package/packages/client/dist/machine/fingerprint.js +2 -2
- package/packages/client/dist/memory/project-memory-writer.js +19 -15
- package/packages/client/dist/{subagent-approval-policy.d.ts → policy/subagent-approval-policy.d.ts} +8 -3
- package/packages/client/dist/policy/subagent-approval-policy.js +1 -0
- package/packages/client/dist/resolvers/local-resolver.d.ts +3 -0
- package/packages/client/dist/resolvers/local-resolver.js +4 -4
- package/packages/client/dist/runner/cli.d.ts +1 -0
- package/packages/client/dist/runner/cli.js +1 -1
- package/packages/client/dist/runner/headless/prepared-story-bundle.d.ts +20 -0
- package/packages/client/dist/runner/headless/prepared-story-bundle.js +1 -0
- package/packages/client/dist/runner/headless/run-yoloop.d.ts +2 -0
- package/packages/client/dist/runner/headless/run-yoloop.js +1 -1
- package/packages/client/dist/runner/portal-sync-worker.js +1 -1
- package/packages/client/dist/runner/scheduler.d.ts +3 -0
- package/packages/client/dist/runner/scheduler.js +7 -7
- package/packages/client/dist/state/project-state-snapshot.js +1 -1
- package/packages/client/dist/tier/tier-aware-client.js +1 -1
- package/packages/client/dist/version.d.ts +3 -0
- package/packages/client/dist/version.js +1 -0
- package/packages/client/dist/yoloop/discovery-hook.js +2 -2
- package/packages/client/dist/yoloop/invoke-hooks.js +4 -4
- package/packages/client/dist/yoloop/shared-discover-epics.d.ts +9 -3
- package/packages/client/dist/yoloop/shared-discover-epics.js +1 -1
- package/packages/client/dist/yoloop/shared-yoloop-types.d.ts +24 -0
- package/packages/client/dist/yoloop/target-normalization.d.ts +24 -0
- package/packages/client/dist/yoloop/target-normalization.js +1 -0
- package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +4 -0
- package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -1
- package/packages/shared/dist/command-registry-contract.js +382 -0
- package/packages/shared/dist/generated/command-registry.generated.js +4216 -0
- package/packages/shared/dist/generated/invocation-schema.generated.js +1850 -0
- package/packages/shared/dist/invocation/index.d.ts +175 -0
- package/packages/shared/dist/invocation/index.js +587 -0
- package/packages/shared/dist/nx-invoke-signature.js +233 -0
- package/packages/shared/dist/strict-readonly.js +381 -0
- package/packages/shared/dist/yoloop/wave-decision-receipt.js +77 -0
- package/targets-stubs/antigravity/gemini.md +1 -1
- 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 +5 -2
- package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex.md +7 -2
- package/targets-stubs/codex/AGENTS.md +4 -1
- package/targets-stubs/codex/neocortex.toml +4 -0
- package/targets-stubs/cursor/agent.md +2 -2
- package/targets-stubs/gemini-cli/agent.md +2 -2
- package/targets-stubs/opencode/neocortex-root.md +4 -1
- package/targets-stubs/opencode/neocortex.md +3 -0
- package/targets-stubs/vscode/neocortex.agent.md +2 -2
- package/packages/client/dist/subagent-approval-policy.js +0 -1
package/packages/client/dist/{subagent-approval-policy.d.ts → policy/subagent-approval-policy.d.ts}
RENAMED
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Client-local wire/runtime mirror of the public subagent approval policy.
|
|
3
|
+
* The published CLI intentionally has no runtime dependency on
|
|
4
|
+
* `@neocortex/shared`; parity is covered by source-side tests.
|
|
5
|
+
*/
|
|
6
|
+
import type { TargetId } from '../adapters/platform-detector.js';
|
|
2
7
|
export declare const SUBAGENT_APPROVAL_POLICY_SCHEMA_VERSION: 1;
|
|
3
8
|
export declare const SUBAGENT_APPROVAL_MANAGED_DEFAULT: "max";
|
|
4
9
|
export declare const SUBAGENT_APPROVAL_EVIDENCE: "[P201-EV-MAX-POLICY]";
|
|
5
10
|
export type SubagentApprovalMode = 'max' | 'standard' | 'disabled';
|
|
6
|
-
export type SubagentApprovalSource = 'managed-default' | 'user-override';
|
|
7
11
|
export type PlatformApprovalScope = 'child' | 'session' | 'global' | 'inherited' | 'none';
|
|
8
12
|
export type PlatformFallbackMode = 'none' | 'root-inline' | 'shell-loop';
|
|
13
|
+
export type SubagentApprovalSource = 'managed-default' | 'user-override';
|
|
9
14
|
export type SubagentApprovalEffectiveReason = 'requested-mode-honored' | 'host-policy-reduced' | 'host-capability-unvalidated' | 'host-capability-unsupported' | 'platform-target-unknown';
|
|
10
15
|
export interface SubagentHostApprovalPolicy {
|
|
11
16
|
readonly platformTarget: TargetId;
|
|
@@ -14,7 +19,7 @@ export interface SubagentHostApprovalPolicy {
|
|
|
14
19
|
readonly reductionReason: Exclude<SubagentApprovalEffectiveReason, 'requested-mode-honored'>;
|
|
15
20
|
}
|
|
16
21
|
export interface SubagentApprovalResolution {
|
|
17
|
-
readonly schemaVersion:
|
|
22
|
+
readonly schemaVersion: 1;
|
|
18
23
|
readonly requestedMode: SubagentApprovalMode;
|
|
19
24
|
readonly effectiveMode: SubagentApprovalMode;
|
|
20
25
|
readonly source: SubagentApprovalSource;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const u=1,p="max",s="[P201-EV-MAX-POLICY]",c=new Set(["claude-code","cursor","vscode","gemini","codex","opencode","github-copilot-cli","kimi","antigravity","openclaw","runner","unknown"]),r=e=>c.has(e)?e:"unknown",d=Object.freeze({"claude-code":{status:"validated",scope:"child",fallbackMode:"none",fallbackReasonCode:null},opencode:{status:"unvalidated",scope:"child",fallbackMode:"shell-loop",fallbackReasonCode:"platform-child-unvalidated"},codex:{status:"unvalidated",scope:"inherited",fallbackMode:"shell-loop",fallbackReasonCode:"platform-child-unvalidated"},gemini:{status:"unvalidated",scope:"inherited",fallbackMode:"shell-loop",fallbackReasonCode:"platform-child-unvalidated"},vscode:{status:"unvalidated",scope:"session",fallbackMode:"root-inline",fallbackReasonCode:"platform-child-unvalidated"},"github-copilot-cli":{status:"unvalidated",scope:"session",fallbackMode:"root-inline",fallbackReasonCode:"platform-child-unvalidated"},kimi:{status:"unvalidated",scope:"inherited",fallbackMode:"shell-loop",fallbackReasonCode:"platform-child-unvalidated"},cursor:{status:"unvalidated",scope:"session",fallbackMode:"root-inline",fallbackReasonCode:"platform-child-unvalidated"},antigravity:{status:"unvalidated",scope:"inherited",fallbackMode:"shell-loop",fallbackReasonCode:"platform-child-unvalidated"},openclaw:{status:"unsupported",scope:"none",fallbackMode:"root-inline",fallbackReasonCode:"platform-child-unsupported"},runner:{status:"unsupported",scope:"none",fallbackMode:"shell-loop",fallbackReasonCode:"platform-child-unsupported"},unknown:{status:"unsupported",scope:"none",fallbackMode:"shell-loop",fallbackReasonCode:"platform-target-unknown"}}),n=Object.freeze({disabled:0,standard:1,max:2});function f(e){return e==="max"||e==="standard"||e==="disabled"}function i(e){const a=r(e),o=d[a];return a==="unknown"?Object.freeze({platformTarget:a,maximumMode:"disabled",scope:o.scope,reductionReason:"platform-target-unknown"}):o.status==="unsupported"?Object.freeze({platformTarget:a,maximumMode:"disabled",scope:o.scope,reductionReason:"host-capability-unsupported"}):o.status==="unvalidated"?Object.freeze({platformTarget:a,maximumMode:"standard",scope:o.scope,reductionReason:"host-capability-unvalidated"}):Object.freeze({platformTarget:a,maximumMode:"max",scope:o.scope,reductionReason:"host-policy-reduced"})}function b(e={}){const a=e.userOverride??"max",o=e.hostPolicy??i(e.platformTarget),t=d[o.platformTarget],l=n[a]>n[o.maximumMode];return Object.freeze({schemaVersion:1,requestedMode:a,effectiveMode:l?o.maximumMode:a,source:e.userOverride?"user-override":"managed-default",platformTarget:o.platformTarget,scope:o.scope,effectiveReason:l?o.reductionReason:"requested-mode-honored",fallbackMode:t.fallbackMode,fallbackReasonCode:t.fallbackReasonCode})}function m(e,a,o){return Object.freeze({evidence:s,event:e,occurredAt:o,...a})}export{s as SUBAGENT_APPROVAL_EVIDENCE,p as SUBAGENT_APPROVAL_MANAGED_DEFAULT,u as SUBAGENT_APPROVAL_POLICY_SCHEMA_VERSION,m as createSubagentApprovalAuditEvent,i as deriveSubagentHostApprovalPolicy,f as isSubagentApprovalMode,b as resolveSubagentApprovalPolicy};
|
|
@@ -15,8 +15,11 @@ import { ResolverMode, type AssembledPrompt, type LocalResolverOptions, type Pip
|
|
|
15
15
|
export declare class LocalResolver implements AssetResolver {
|
|
16
16
|
readonly mode = ResolverMode.LOCAL;
|
|
17
17
|
private readonly projectRoot;
|
|
18
|
+
private stepPathIndex;
|
|
18
19
|
constructor(options: LocalResolverOptions);
|
|
19
20
|
resolveStep(stepId: string, _context: PipelineContext): Promise<StepContent>;
|
|
21
|
+
private resolveStepPathIndex;
|
|
22
|
+
private loadStepPathIndex;
|
|
20
23
|
resolveSkill(skillId: string, _context: PipelineContext): Promise<SkillContent>;
|
|
21
24
|
resolveStandard(standardId: string): Promise<StandardContent>;
|
|
22
25
|
resolveRegistry(): Promise<StepRegistry>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{readFile as f,access as
|
|
2
|
-
`);for(const
|
|
1
|
+
import{readFile as f,access as d}from"node:fs/promises";import{join as h,resolve as y}from"node:path";import{ResolverMode as w}from"../types/index.js";const v=/^---\n([\s\S]*?)\n---/;function u(p){const t=p.match(v);if(!t)return{frontmatter:{},body:p};const s={},e=t[1].split(`
|
|
2
|
+
`);for(const o of e){const n=o.indexOf(":");if(n===-1)continue;const a=o.slice(0,n).trim().replace(/^['"]|['"]$/g,"");let r=o.slice(n+1).trim();typeof r=="string"&&(r=r.replace(/^['"]|['"]$/g,"")),r==="true"?r=!0:r==="false"&&(r=!1),s[a]=r}const c=p.slice(t[0].length).trimStart();return{frontmatter:s,body:c}}class P{mode=w.LOCAL;projectRoot;stepPathIndex;constructor(t){this.projectRoot=y(t.projectRoot)}async resolveStep(t,s){const e=(await this.resolveStepPathIndex()).get(t);if(!e)throw new Error(`Step '${t}' is not present in the canonical registry`);const c=h(this.projectRoot,e),o=await f(c,"utf-8"),{frontmatter:n,body:a}=u(o);return{id:t,content:a,frontmatter:n}}resolveStepPathIndex(){return this.stepPathIndex??=this.loadStepPathIndex(),this.stepPathIndex}async loadStepPathIndex(){const t=h(this.projectRoot,"core","data","step-registry.json"),s=JSON.parse(await f(t,"utf8")),e=new Map,c=s.asset_bootstrap;if(c&&typeof c=="object"&&!Array.isArray(c)){const o=c.assets;if(!Array.isArray(o))throw new Error("manifest-generation-mismatch");for(const n of o){if(!n||typeof n!="object"||Array.isArray(n))throw new Error("manifest-schema-invalid");const a=n;if(a.type!=="step")continue;const r=a.relative_path;if(typeof r!="string"||!r.startsWith("steps/")||r.includes(".."))throw new Error("manifest-schema-invalid");const i=`core/${r}`,{frontmatter:l}=u(await f(h(this.projectRoot,i),"utf8")),m=l.id;if(typeof m!="string"||!/^step-[a-z0-9][a-z0-9._-]*$/.test(m))throw new Error("manifest-required-step-unresolved");if(e.has(m))throw new Error("manifest-duplicate-reference");e.set(m,i)}}else{const o=s.steps;if(!o||typeof o!="object"||Array.isArray(o))throw new Error("manifest-generation-mismatch");for(const n of Object.values(o))if(Array.isArray(n))for(const a of n){if(!a||typeof a!="object"||Array.isArray(a))throw new Error("manifest-schema-invalid");const r=a,i=r.id,l=r.file;if(typeof i!="string"||typeof l!="string"||!l.startsWith("core/steps/")||l.includes(".."))throw new Error("manifest-schema-invalid");if(e.has(i))throw new Error("manifest-duplicate-reference");e.set(i,l)}}if(e.size===0)throw new Error("manifest-generation-mismatch");return e}async resolveSkill(t,s){const e=[`core/skills/${t}.md`,`core/skills/step-skills/${t}.md`];t.includes("/")&&(e.unshift(`core/skills/step-skills/${t}.md`),e.unshift(`core/skills/${t}.md`));let c=null,o="";for(const r of e){const i=h(this.projectRoot,r);try{c=await f(i,"utf-8"),o=r;break}catch{}}if(c===null)throw new Error(`Skill '${t}' not found. Searched: ${e.join(", ")}`);const{frontmatter:n,body:a}=u(c);return{id:t,content:a,metadata:{...n,resolvedPath:o}}}async resolveStandard(t){const s=h(this.projectRoot,"core","standards",t);let e;try{e=await f(s,"utf-8")}catch{if(!t.endsWith(".md"))e=await f(`${s}.md`,"utf-8");else throw new Error(`Standard '${t}' not found at ${s}`)}return{id:t,content:e}}async resolveRegistry(){const t=h(this.projectRoot,"core","data","step-registry.json"),s=await f(t,"utf-8");return JSON.parse(s)}async assemblePrompt(t,s){const e=await this.resolveStep(t,s),c={"{story_id}":s.storyId,"{story_title}":s.storyTitle,"{step_id}":t,"{step_name}":e.frontmatter.name||t,"{current_status}":s.currentStatus,"{epic_id}":s.epicId,"{branch_name}":s.branchName,"{platform_target}":s.platformTarget};let o=e.content;for(const[r,i]of Object.entries(c))o=o.replaceAll(r,i);const n=[],a=e.frontmatter.skills;if(a&&typeof a=="string"){const r=a.split(",").map(i=>i.trim());for(const i of r)try{const l=await this.resolveSkill(i,s);o+=`
|
|
3
3
|
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Skill: ${
|
|
6
|
+
# Skill: ${i}
|
|
7
7
|
|
|
8
|
-
${
|
|
8
|
+
${l.content}`,n.push(i)}catch{}}return{prompt:o,variables:c,includedSkills:n,includedStandards:[]}}async isAvailable(){try{const t=h(this.projectRoot,"core");return await d(t),!0}catch{return!1}}async dispose(){}}export{P as LocalResolver};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createHash as W,randomBytes as Ee}from"node:crypto";import{resolve as G}from"node:path";import{CONTINUITY_PROCESSING_OUTPUT_SUMMARY_EVENT_TYPE as X,ContinuitySqliteStoreError as Ie,openContinuitySqliteStore as Z}from"../continuity/sqlite-store.js";import{invoke as ye}from"../commands/invoke.js";import{checkRunnerBinaryTrust as P}from"./binary.js";import{runRunnerSchedulerCommand as ee}from"./scheduler.js";import{runYoloExecutionPhase as Se}from"./headless/run-yolo.js";import{runYoloopExecutionPhase as Re}from"./headless/run-yoloop.js";import{DEFAULT_RUNNER_HEARTBEAT_BACKOFF_MS as _e,DEFAULT_RUNNER_HEARTBEAT_INTERVAL_MS as ke,DEFAULT_RUNNER_HEARTBEAT_JITTER_RATIO as ge,DEFAULT_RUNNER_HEARTBEAT_TIMEOUT_MS as Ae,runRunnerPortalHeartbeat as V,runRunnerPortalHeartbeatLoop as ve,runRunnerPortalSync as te,runRunnerPortalSyncLoop as we}from"./portal-sync-worker.js";import{RUNNER_BINARY_REASON_CODES as Tt,checkRunnerBinaryTrust as jt,runnerTrustRelativePath as Nt}from"./binary.js";import{LOCAL_JOBS_CONSOLE_REASON_CODES as Dt,createLocalJobConsoleServer as Ot,isLocalJobsConsoleArgs as Mt,localJobConsoleSocketPath as xt,parseLocalJobsConsoleArgs as Ft,runLocalJobsConsoleCommand as Ht}from"./local-console.js";const d=Object.freeze({OK:"continuity-ok",LEASE_CONFLICT:"lease-conflict",LEASE_EXPIRED:"lease-expired",RUNNER_BINARY_UNTRUSTED:"runner-binary-untrusted",RUNNER_DIRECTIVE_UNTRUSTED:"runner-directive-untrusted",RUNNER_SERVER_INVOKE_FAILED:"runner-server-invoke-failed",SQLITE_ADAPTER_UNAVAILABLE:"sqlite-adapter-unavailable",SQLITE_INTEGRITY_FAILED:"sqlite-integrity-failed",BACKOFF_SCHEDULED:"backoff-scheduled",MISSED_RUN_CATCHUP:"missed-run-catchup",HEADLESS_RUNTIME_UNRESOLVED:"headless-runtime-unresolved",HEADLESS_RUNTIME_UNTRUSTED:"headless-runtime-untrusted",HEADLESS_ADAPTER_UNAVAILABLE:"headless-adapter-unavailable",HEADLESS_RUNTIME_AUTH_REQUIRED:"headless-runtime-auth-required",HEADLESS_EXECUTION_BACKOFF:"headless-execution-backoff",HEADLESS_EXECUTION_TIMEOUT:"headless-execution-timeout",HEADLESS_EXECUTION_FAILED:"headless-execution-failed",HEADLESS_RECEIPT_REDACTED:"headless-receipt-redacted",AUTONOMOUS_GOVERNANCE_BYPASS_BLOCKED:"headless-directive-rejected"}),Le=300*1e3,Ce=30*1e3,Te=30*1e3,je=1,Ne=10,Ue=new Set(["append_event","append_receipt","update_job_status","schedule_next_tick","release_lease","noop"]),De=new Set(["goal-tick","loop-tick","jobs","runner"]),Oe=new Set(["accepted","applied","ignored","failed","deferred"]),Me=new Set(["draft","planned","active","running","waiting_external","waiting_human","backoff","paused","blocked","completed","aborted","cancelled"]),xe=/(raw[_-]?logs?|prompt(?:[_-]?(?:body|text))?|private[_-]?urls?|secret|token|password|protected(?:[_-]?(?:field|body|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|authorization|api[_-]?key|license[_-]?key)/i,q=/(https?:\/\/\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[_-]?log|transcript|stack trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|VENDOR_CORPUS|P180[_-]?SYNTHETIC[_-]?CONTINUITY|P187[_-]?SYNTHETIC[_-]?(?:CONTINUITY|RUNNER|WATCH))/i,re=new Set([d.HEADLESS_RUNTIME_UNRESOLVED,d.HEADLESS_RUNTIME_UNTRUSTED,"headless-model-rejected","headless-directive-rejected","headless-prompt-rejected","headless-yoloop-metadata-invalid","headless-yoloop-isolation-violation"]),oe=new Set([d.HEADLESS_ADAPTER_UNAVAILABLE]),ae=new Set([d.HEADLESS_RUNTIME_AUTH_REQUIRED]),se=new Set([d.HEADLESS_EXECUTION_BACKOFF]),ne=new Set([d.HEADLESS_EXECUTION_TIMEOUT]),ce=new Set([d.HEADLESS_EXECUTION_FAILED]);async function Fe(e){const t=await ye({args:e.args,projectRoot:e.projectRoot,format:"json",platformTarget:"runner",serverUrl:e.serverUrl});return{success:t.success,instructions:t.instructions,metadata:t.metadata,error:t.error,exitCode:t.exitCode}}async function He(e={}){const t=G(e.projectRoot??process.cwd()),r=Y(e.runnerId??nt(t)),o=e.now??(()=>new Date().toISOString()),a=F(e.dueJobLimit??je,1,Ne),s=F(e.leaseMs??Le,1e3,3600*1e3),l=F(e.staleLeaseAfterMs??Ce,0,1440*60*1e3),c=e.idFactory??ct,I=he(e.processingSummarySource??(e.tickMode==="scheduled"?"scheduled_tick":"manual_tick")),y=[],R=[],i=[],u=[];if(e.trustCheck!==!1){const A=P(e.executablePath??process.argv[1]);if(!A.trusted)return{ok:!1,runnerId:r,processedJobCount:0,dueJobCount:0,recoveredLeaseIds:[],receipts:[],reasonCodes:[A.reasonCode??d.RUNNER_BINARY_UNTRUSTED],publicSafe:!0}}const m=await Z({projectRoot:t,adapter:e.adapter,adapterLoader:e.adapterLoader,now:o}),L=Be({options:e,projectRoot:t,runnerId:r,now:o});let C;try{const A=m.recoverStaleLeases({nowIso:o(),staleAfterMs:l,limit:a*2});if(A.recoveredLeaseIds.length>0){y.push(d.LEASE_EXPIRED);for(const E of A.recoveredLeaseIds);}const T=m.listDueJobs({nowIso:o(),limit:a});for(const E of T){const g=await Ve({store:m,job:E,projectRoot:t,runnerId:r,leaseMs:s,now:o,idFactory:c,processingSummarySource:I,serverUrl:e.serverUrl,serverInvoker:e.serverInvoker??Fe});R.push(g.receipt),i.push(...g.processingSummaries),g.executionMetadata&&u.push(g.executionMetadata),y.push(g.receipt.reasonCode)}const b=await Se({store:m,projectRoot:t,runnerId:r,now:o,metadata:u,adapterRegistry:e.headlessAdapterRegistry,adapterOptions:e.headlessAdapterOptions,runtimeDefaults:e.headlessRuntimeDefaults,runtimeFallback:e.headlessRuntimeFallback,limit:e.headlessExecutionLimit,leaseMs:e.headlessExecutionLeaseMs??s,staleLeaseAfterMs:e.headlessExecutionStaleLeaseAfterMs??l,timeoutMs:e.headlessExecutionTimeoutMs,backoffMs:e.headlessExecutionBackoffMs,maxAttempts:e.headlessExecutionMaxAttempts,queueCap:e.headlessExecutionQueueCap,idFactory:e.headlessExecutionIdFactory});y.push(...b.reasonCodes);const k=await Re({store:m,projectRoot:t,runnerId:r,now:o,metadata:u,adapterRegistry:e.headlessAdapterRegistry,adapterOptions:e.headlessAdapterOptions,runtimeDefaults:e.headlessRuntimeDefaults,runtimeFallback:e.headlessRuntimeFallback,limit:e.headlessExecutionLimit,leaseMs:e.headlessExecutionLeaseMs??s,staleLeaseAfterMs:e.headlessExecutionStaleLeaseAfterMs??l,timeoutMs:e.headlessExecutionTimeoutMs,backoffMs:e.headlessExecutionBackoffMs,maxAttempts:e.headlessExecutionMaxAttempts,queueCap:e.headlessExecutionQueueCap,maxIterations:e.headlessYoloopMaxIterations,maxDurationMs:e.headlessYoloopMaxDurationMs,localConcurrencyCap:e.headlessYoloopLocalConcurrencyCap,yoloopInvoker:e.headlessYoloopInvoker,serverUrl:e.serverUrl,idFactory:e.headlessExecutionIdFactory});y.push(...k.reasonCodes),C={ok:R.every(E=>E.outcome!=="failed")&&b.ok&&k.ok,runnerId:r,processedJobCount:R.length,dueJobCount:T.length,recoveredLeaseIds:A.recoveredLeaseIds,receipts:R,...i.length>0?{processingSummaries:i}:{},headlessExecution:b,headlessYoloopExecution:k,reasonCodes:J(y.length>0?y:[d.OK]),publicSafe:!0}}finally{await L.stop(),m.close()}if(!C)throw new Error("runner-tick-failed");return await Pe(C,{options:e,projectRoot:t,runnerId:r,localStateChanged:$e(C)})}async function Pe(e,t){const r=t.options.portalSync;if(r===!1||r===void 0)return e;if(!t.localStateChanged){const a=await V({...r,projectRoot:r.projectRoot??t.projectRoot,runnerId:r.runnerId??t.runnerId,sessionId:r.sessionId??t.options.portalHeartbeatSessionId,serverUrl:r.serverUrl??t.options.serverUrl,adapter:r.adapter??t.options.adapter,adapterLoader:r.adapterLoader??t.options.adapterLoader,now:r.now??t.options.now,mode:r.mode??(t.options.tickMode==="scheduled"?"scheduled":"background"),timeoutMs:r.heartbeatTimeoutMs??t.options.portalHeartbeatTimeoutMs});return{...e,portalHeartbeat:a}}const o=await te({...r,projectRoot:r.projectRoot??t.projectRoot,runnerId:r.runnerId??t.runnerId,sessionId:r.sessionId??t.options.portalHeartbeatSessionId,serverUrl:r.serverUrl??t.options.serverUrl,adapter:r.adapter??t.options.adapter,adapterLoader:r.adapterLoader??t.options.adapterLoader,now:r.now??t.options.now,mode:r.mode??(t.options.tickMode==="scheduled"?"scheduled":"background")});return{...e,portalSync:o}}function $e(e){return e.recoveredLeaseIds.length>0||e.receipts.length>0||(e.processingSummaries?.length??0)>0||(e.headlessExecution?.processedAttemptCount??0)>0||(e.headlessExecution?.recoveredAttemptIds.length??0)>0||(e.headlessYoloopExecution?.processedAttemptCount??0)>0||(e.headlessYoloopExecution?.recoveredAttemptIds.length??0)>0}function Be(e){const t=e.options.portalSync;if(t===!1||t===void 0)return{stop:async()=>{}};const r=F(e.options.portalHeartbeatIntervalMs??ke,0,1440*60*1e3);if(r<=0)return{stop:async()=>{}};const o=F(e.options.portalHeartbeatBackoffMs??_e,1e3,1800*1e3),a=pe(e.options.portalHeartbeatJitterRatio??ge,0,.5),s=F(e.options.portalHeartbeatTimeoutMs??t.heartbeatTimeoutMs??Ae,1e3,6e4);let l=!1,c,I,y=me(r,a,Math.random);const R=u=>new Promise(m=>{I=m,c=setTimeout(m,u),typeof c.unref=="function"&&c.unref()}),i=(async()=>{for(;!l&&(y>0&&await R(y),!l);){const u=await V({...t,projectRoot:t.projectRoot??e.projectRoot,runnerId:t.runnerId??e.runnerId,sessionId:t.sessionId??e.options.portalHeartbeatSessionId,serverUrl:t.serverUrl??e.options.serverUrl,adapter:t.adapter??e.options.adapter,adapterLoader:t.adapterLoader??e.options.adapterLoader,now:t.now??e.now,mode:t.mode??(e.options.tickMode==="scheduled"?"scheduled":"background"),timeoutMs:s}).catch(()=>({ok:!1,runnerId:e.runnerId,workspaceId:"workspace-default",workspaceLabel:"Workspace workspace-default",projectId:"project-default",projectLabel:"Project project-default",mode:e.options.tickMode==="scheduled"?"scheduled":"background",generatedAt:e.now(),serverAccessToLocalhost:!1,serverHeldStream:!1,localhostCallback:!1,posted:{heartbeat:!1},counts:{redactions:0},reasonCodes:[d.BACKOFF_SCHEDULED],redactionEvidence:[],publicSafe:!0}));y=me(u.ok?r:o,a,Math.random)}})();return{stop:async()=>{l=!0,c&&clearTimeout(c),I?.(),await i.catch(()=>{})}}}async function Ke(e={}){const t=G(e.projectRoot??process.cwd()),r=e.now??(()=>new Date().toISOString()),o=r(),a={};let s=null,l=null;try{l=await Z({projectRoot:t,adapter:e.adapter,adapterLoader:e.adapterLoader,now:r}),s=l.collectSnapshotRows({nowIso:o,jobLimit:10,staleLeaseLimit:10,receiptLimit:10,eventLimit:10,snapshotLimit:5});const f=String(l.pragmaValue("journal_mode")??"").toLowerCase();a["db-integrity"]=w("db-integrity","DB integrity","ok",[d.OK],"Continuity SQLite integrity check completed.",{jobs:_(s.counts,"jobs"),receipts:_(s.counts,"receipts"),events:_(s.counts,"events")}),a["sqlite-wal"]=w("sqlite-wal","SQLite WAL",f==="wal"?"ok":"blocked",f==="wal"?[d.OK]:[d.SQLITE_INTEGRITY_FAILED],f==="wal"?"SQLite journal mode is WAL.":"SQLite journal mode is not WAL."),a.migrations=w("migrations","Migrations",s.schemaVersion>=1?"ok":"blocked",s.schemaVersion>=1?[d.OK]:[d.SQLITE_INTEGRITY_FAILED],`Continuity schema version ${s.schemaVersion} is readable.`)}catch(f){const p=ue(f);a["db-integrity"]=w("db-integrity","DB integrity","blocked",[p],"Continuity SQLite could not be opened safely."),a["sqlite-wal"]=w("sqlite-wal","SQLite WAL","blocked",[p],"SQLite WAL could not be verified."),a.migrations=w("migrations","Migrations","blocked",[p],"Continuity migrations could not be verified.")}finally{if(l)try{l.close()}catch{}}const c=s?_(s.counts,"staleLeases"):0,I=s?_(s.counts,"staleHeadlessExecutionAttempts"):0;a.leases=w("leases","Lease health",c+I>0?"degraded":"ok",c+I>0?[d.LEASE_EXPIRED]:[d.OK],c+I>0?"Stale job leases or headless execution attempts are eligible for bounded recovery.":"No stale leases or headless attempts reported.",{staleLeases:c,staleHeadlessExecutionAttempts:I});const y=s?.headlessExecutionAttempts??[],R=J(y.map(f=>f.reason_code).filter(f=>typeof f=="string"&&f.length>0)),i=ft(y,R),u=new Set([d.HEADLESS_RUNTIME_UNRESOLVED,d.HEADLESS_RUNTIME_UNTRUSTED,d.HEADLESS_ADAPTER_UNAVAILABLE,d.HEADLESS_RUNTIME_AUTH_REQUIRED,"headless-model-rejected","headless-directive-rejected","headless-prompt-rejected","headless-yoloop-metadata-invalid","headless-yoloop-isolation-violation"]),m=s?_(s.counts,"headlessExecutionAttempts"):0,L=R.some(f=>u.has(f)),C=R.includes(d.HEADLESS_EXECUTION_BACKOFF)||y.some(f=>f.status==="backoff"),A=R.includes(d.HEADLESS_RECEIPT_REDACTED),T=i.authRequired>0,b=i.trustFailures>0||i.adapterUnavailable>0,k=I>0||C||A||i.timeout>0||i.genericFailed>0||i.redactions>0;a["headless-execution"]=w("headless-execution","Headless execution",L?"blocked":k?"degraded":m>0?"ok":"delegated",R.length>0?R:m>0?[d.OK]:[d.HEADLESS_RUNTIME_UNRESOLVED],L?T&&!b?"Complete local runtime login/auth setup before starting a new headless attempt; default retry/backoff is not scheduled for auth-required.":"Resolve public runtime/model trust, adapter availability or protected directive hard-stop reason codes before executing headless attempts.":k?"Headless attempts need bounded recovery, retry/backoff, timeout/generic failure follow-up or redaction review.":m>0?"Headless attempts are represented by public status, runtime/model and reason-code evidence.":"Headless resolver checks are delegated until durable headless work is queued.",{attempts:m,queuedBackoff:s?_(s.counts,"headlessQueuedAttempts"):0,running:s?_(s.counts,"headlessRunningAttempts"):0,staleHeadlessExecutionAttempts:I,trustFailures:i.trustFailures,adapterUnavailable:i.adapterUnavailable,authRequired:i.authRequired,retryBackoff:i.retryBackoff,timeout:i.timeout,genericFailed:i.genericFailed,redactions:i.redactions});const E=s?.outboxCounts??{},g=_(E,"failed")+_(E,"dead_letter");a.outbox=w("outbox","Outbox state",g>0?"degraded":"ok",g>0?[d.BACKOFF_SCHEDULED]:[d.OK],g>0?"Failed/dead-letter outbox entries can be retried with dedupe.":"Outbox has no failed/dead-letter entries.",{pending:_(E,"pending"),failed:_(E,"failed"),deadLetter:_(E,"dead_letter")}),a.metering=w("metering","Metering receipts","ok",[d.OK],"Metering evidence is represented by public job receipts and counts only.",{receipts:s?_(s.counts,"receipts"):0}),a["portal-sync"]=w("portal-sync","Portal sync",g>0?"degraded":"ok",g>0?[d.BACKOFF_SCHEDULED]:[d.OK],g>0?"Portal sync worker is enabled but has retryable outbox debt; outbound sync remains client-owned.":"Portal sync worker is enabled for outbound heartbeat, jobs sync, command polling and acknowledgement only.",{pending:_(E,"pending"),failed:_(E,"failed"),deadLetter:_(E,"dead_letter")});const N=e.trustCheck===!1?{trusted:!0,publicSafe:!0}:P(e.executablePath??process.argv[1]);a.runner=w("runner","Runner health",N.trusted?"ok":"blocked",N.trusted?[d.OK]:[N.reasonCode??d.RUNNER_BINARY_UNTRUSTED],N.trusted?"Runner binary trust check passed.":"Runner binary trust check failed.");try{const f=await ee({command:"doctor",projectRoot:t,executablePath:e.scheduler?.executablePath??e.executablePath??process.argv[1],platform:e.scheduler?.platform,env:e.scheduler?.env,dryRun:!0,intervalSeconds:e.scheduler?.intervalSeconds,strategy:e.scheduler?.strategy,allowCronFallback:e.scheduler?.allowCronFallback,trustCheck:e.scheduler?.trustCheck??e.trustCheck,uid:e.scheduler?.uid,commandAvailable:e.scheduler?.commandAvailable,commandRunner:e.scheduler?.commandRunner,trustChecker:e.scheduler?.trustChecker??P}),p=f.reasonCodes.includes(d.RUNNER_BINARY_UNTRUSTED)||f.reasonCodes.some(h=>h.startsWith("runner-binary-"))||f.reasonCodes.includes("scheduler-install-unsafe");a.scheduler=w("scheduler","Scheduler install",p?"blocked":f.ok?"ok":"degraded",f.reasonCodes,f.ok?"Scheduler doctor selected a user-scope strategy.":"Scheduler doctor found public guidance or degraded capability.",{manifests:f.manifestPaths.length,controlCommands:f.controlCommands.length,legacyEntries:f.legacyEntries.length})}catch(f){a.scheduler=w("scheduler","Scheduler install","degraded",["scheduler-command-failed"],x(f))}const v=a,H=J(Object.values(v).flatMap(f=>f.reasonCodes));return{ok:Object.values(v).every(f=>f.status!=="blocked"),generatedAt:o,checks:v,reasonCodes:H,publicSafe:!0}}function de(e){if(!e)return[];const t=[e.continuityRunnerDirectives,e.runnerDirectives,e.continuityDirectives];for(const r of t)if(Array.isArray(r))return r.filter(j).map(it).filter(lt);return[]}function Je(e,t){if(!j(e))throw new U("Directive is not a public record.");if(e.publicSafe!==!0)throw new U("Directive is not marked public-safe.");const r=typeof e.kind=="string"?e.kind:typeof e.type=="string"?e.type:"";if(!Ue.has(r))throw new U("Directive kind is not allowlisted.");const o=typeof e.commandClass=="string"?e.commandClass:"runner";if(!De.has(o))throw new U("Directive command class is not allowlisted.");if((typeof e.jobId=="string"?e.jobId:t)!==t)throw new U("Directive job ID does not match the leased job.");Q(e,"directive")}async function wt(e,t={}){const r=tt(e);if(r.command==="help")return process.stdout.write(`${ot}
|
|
1
|
+
import{createHash as W,randomBytes as Ee}from"node:crypto";import{resolve as G}from"node:path";import{CONTINUITY_PROCESSING_OUTPUT_SUMMARY_EVENT_TYPE as X,ContinuitySqliteStoreError as Ie,openContinuitySqliteStore as Z}from"../continuity/sqlite-store.js";import{invoke as ye}from"../commands/invoke.js";import{checkRunnerBinaryTrust as P}from"./binary.js";import{runRunnerSchedulerCommand as ee}from"./scheduler.js";import{runYoloExecutionPhase as Se}from"./headless/run-yolo.js";import{runYoloopExecutionPhase as Re}from"./headless/run-yoloop.js";import{DEFAULT_RUNNER_HEARTBEAT_BACKOFF_MS as _e,DEFAULT_RUNNER_HEARTBEAT_INTERVAL_MS as ke,DEFAULT_RUNNER_HEARTBEAT_JITTER_RATIO as ge,DEFAULT_RUNNER_HEARTBEAT_TIMEOUT_MS as Ae,runRunnerPortalHeartbeat as V,runRunnerPortalHeartbeatLoop as ve,runRunnerPortalSync as te,runRunnerPortalSyncLoop as we}from"./portal-sync-worker.js";import{RUNNER_BINARY_REASON_CODES as Tt,checkRunnerBinaryTrust as jt,runnerTrustRelativePath as Nt}from"./binary.js";import{LOCAL_JOBS_CONSOLE_REASON_CODES as Dt,createLocalJobConsoleServer as Ot,isLocalJobsConsoleArgs as Mt,localJobConsoleSocketPath as xt,parseLocalJobsConsoleArgs as Ft,runLocalJobsConsoleCommand as Ht}from"./local-console.js";const d=Object.freeze({OK:"continuity-ok",LEASE_CONFLICT:"lease-conflict",LEASE_EXPIRED:"lease-expired",RUNNER_BINARY_UNTRUSTED:"runner-binary-untrusted",RUNNER_DIRECTIVE_UNTRUSTED:"runner-directive-untrusted",RUNNER_SERVER_INVOKE_FAILED:"runner-server-invoke-failed",SQLITE_ADAPTER_UNAVAILABLE:"sqlite-adapter-unavailable",SQLITE_INTEGRITY_FAILED:"sqlite-integrity-failed",BACKOFF_SCHEDULED:"backoff-scheduled",MISSED_RUN_CATCHUP:"missed-run-catchup",HEADLESS_RUNTIME_UNRESOLVED:"headless-runtime-unresolved",HEADLESS_RUNTIME_UNTRUSTED:"headless-runtime-untrusted",HEADLESS_ADAPTER_UNAVAILABLE:"headless-adapter-unavailable",HEADLESS_RUNTIME_AUTH_REQUIRED:"headless-runtime-auth-required",HEADLESS_EXECUTION_BACKOFF:"headless-execution-backoff",HEADLESS_EXECUTION_TIMEOUT:"headless-execution-timeout",HEADLESS_EXECUTION_FAILED:"headless-execution-failed",HEADLESS_RECEIPT_REDACTED:"headless-receipt-redacted",AUTONOMOUS_GOVERNANCE_BYPASS_BLOCKED:"headless-directive-rejected"}),Le=300*1e3,Ce=30*1e3,Te=30*1e3,je=1,Ne=10,Ue=new Set(["append_event","append_receipt","update_job_status","schedule_next_tick","release_lease","noop"]),De=new Set(["goal-tick","loop-tick","jobs","runner"]),Oe=new Set(["accepted","applied","ignored","failed","deferred"]),Me=new Set(["draft","planned","active","running","waiting_external","waiting_human","backoff","paused","blocked","completed","aborted","cancelled"]),xe=/(raw[_-]?logs?|prompt(?:[_-]?(?:body|text))?|private[_-]?urls?|secret|token|password|protected(?:[_-]?(?:field|body|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|authorization|api[_-]?key|license[_-]?key)/i,q=/(https?:\/\/\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[_-]?log|transcript|stack trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|VENDOR_CORPUS|P180[_-]?SYNTHETIC[_-]?CONTINUITY|P187[_-]?SYNTHETIC[_-]?(?:CONTINUITY|RUNNER|WATCH))/i,re=new Set([d.HEADLESS_RUNTIME_UNRESOLVED,d.HEADLESS_RUNTIME_UNTRUSTED,"headless-model-rejected","headless-directive-rejected","headless-prompt-rejected","headless-yoloop-metadata-invalid","headless-yoloop-isolation-violation"]),oe=new Set([d.HEADLESS_ADAPTER_UNAVAILABLE]),ae=new Set([d.HEADLESS_RUNTIME_AUTH_REQUIRED]),se=new Set([d.HEADLESS_EXECUTION_BACKOFF]),ne=new Set([d.HEADLESS_EXECUTION_TIMEOUT]),ce=new Set([d.HEADLESS_EXECUTION_FAILED]);async function Fe(e){const t=await ye({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,exitCode:t.exitCode}}async function He(e={}){const t=G(e.projectRoot??process.cwd()),r=Y(e.runnerId??nt(t)),o=e.now??(()=>new Date().toISOString()),a=F(e.dueJobLimit??je,1,Ne),s=F(e.leaseMs??Le,1e3,3600*1e3),l=F(e.staleLeaseAfterMs??Ce,0,1440*60*1e3),c=e.idFactory??ct,I=he(e.processingSummarySource??(e.tickMode==="scheduled"?"scheduled_tick":"manual_tick")),y=[],R=[],i=[],u=[];if(e.trustCheck!==!1){const A=P(e.executablePath??process.argv[1]);if(!A.trusted)return{ok:!1,runnerId:r,processedJobCount:0,dueJobCount:0,recoveredLeaseIds:[],receipts:[],reasonCodes:[A.reasonCode??d.RUNNER_BINARY_UNTRUSTED],publicSafe:!0}}const m=await Z({projectRoot:t,adapter:e.adapter,adapterLoader:e.adapterLoader,now:o}),L=Be({options:e,projectRoot:t,runnerId:r,now:o});let C;try{const A=m.recoverStaleLeases({nowIso:o(),staleAfterMs:l,limit:a*2});if(A.recoveredLeaseIds.length>0){y.push(d.LEASE_EXPIRED);for(const E of A.recoveredLeaseIds);}const T=m.listDueJobs({nowIso:o(),limit:a});for(const E of T){const g=await Ve({store:m,job:E,projectRoot:t,runnerId:r,leaseMs:s,now:o,idFactory:c,processingSummarySource:I,serverUrl:e.serverUrl,serverInvoker:e.serverInvoker??Fe});R.push(g.receipt),i.push(...g.processingSummaries),g.executionMetadata&&u.push(g.executionMetadata),y.push(g.receipt.reasonCode)}const b=await Se({store:m,projectRoot:t,runnerId:r,now:o,metadata:u,adapterRegistry:e.headlessAdapterRegistry,adapterOptions:e.headlessAdapterOptions,runtimeDefaults:e.headlessRuntimeDefaults,runtimeFallback:e.headlessRuntimeFallback,limit:e.headlessExecutionLimit,leaseMs:e.headlessExecutionLeaseMs??s,staleLeaseAfterMs:e.headlessExecutionStaleLeaseAfterMs??l,timeoutMs:e.headlessExecutionTimeoutMs,backoffMs:e.headlessExecutionBackoffMs,maxAttempts:e.headlessExecutionMaxAttempts,queueCap:e.headlessExecutionQueueCap,idFactory:e.headlessExecutionIdFactory});y.push(...b.reasonCodes);const k=await Re({store:m,projectRoot:t,runnerId:r,now:o,metadata:u,adapterRegistry:e.headlessAdapterRegistry,adapterOptions:e.headlessAdapterOptions,runtimeDefaults:e.headlessRuntimeDefaults,runtimeFallback:e.headlessRuntimeFallback,limit:e.headlessExecutionLimit,leaseMs:e.headlessExecutionLeaseMs??s,staleLeaseAfterMs:e.headlessExecutionStaleLeaseAfterMs??l,timeoutMs:e.headlessExecutionTimeoutMs,backoffMs:e.headlessExecutionBackoffMs,maxAttempts:e.headlessExecutionMaxAttempts,queueCap:e.headlessExecutionQueueCap,maxIterations:e.headlessYoloopMaxIterations,maxDurationMs:e.headlessYoloopMaxDurationMs,localConcurrencyCap:e.headlessYoloopLocalConcurrencyCap,yoloopInvoker:e.headlessYoloopInvoker,serverUrl:e.serverUrl,idFactory:e.headlessExecutionIdFactory});y.push(...k.reasonCodes),C={ok:R.every(E=>E.outcome!=="failed")&&b.ok&&k.ok,runnerId:r,processedJobCount:R.length,dueJobCount:T.length,recoveredLeaseIds:A.recoveredLeaseIds,receipts:R,...i.length>0?{processingSummaries:i}:{},headlessExecution:b,headlessYoloopExecution:k,reasonCodes:J(y.length>0?y:[d.OK]),publicSafe:!0}}finally{await L.stop(),m.close()}if(!C)throw new Error("runner-tick-failed");return await Pe(C,{options:e,projectRoot:t,runnerId:r,localStateChanged:$e(C)})}async function Pe(e,t){const r=t.options.portalSync;if(r===!1||r===void 0)return e;if(!t.localStateChanged){const a=await V({...r,projectRoot:r.projectRoot??t.projectRoot,runnerId:r.runnerId??t.runnerId,sessionId:r.sessionId??t.options.portalHeartbeatSessionId,serverUrl:r.serverUrl??t.options.serverUrl,adapter:r.adapter??t.options.adapter,adapterLoader:r.adapterLoader??t.options.adapterLoader,now:r.now??t.options.now,mode:r.mode??(t.options.tickMode==="scheduled"?"scheduled":"background"),timeoutMs:r.heartbeatTimeoutMs??t.options.portalHeartbeatTimeoutMs});return{...e,portalHeartbeat:a}}const o=await te({...r,projectRoot:r.projectRoot??t.projectRoot,runnerId:r.runnerId??t.runnerId,sessionId:r.sessionId??t.options.portalHeartbeatSessionId,serverUrl:r.serverUrl??t.options.serverUrl,adapter:r.adapter??t.options.adapter,adapterLoader:r.adapterLoader??t.options.adapterLoader,now:r.now??t.options.now,mode:r.mode??(t.options.tickMode==="scheduled"?"scheduled":"background")});return{...e,portalSync:o}}function $e(e){return e.recoveredLeaseIds.length>0||e.receipts.length>0||(e.processingSummaries?.length??0)>0||(e.headlessExecution?.processedAttemptCount??0)>0||(e.headlessExecution?.recoveredAttemptIds.length??0)>0||(e.headlessYoloopExecution?.processedAttemptCount??0)>0||(e.headlessYoloopExecution?.recoveredAttemptIds.length??0)>0}function Be(e){const t=e.options.portalSync;if(t===!1||t===void 0)return{stop:async()=>{}};const r=F(e.options.portalHeartbeatIntervalMs??ke,0,1440*60*1e3);if(r<=0)return{stop:async()=>{}};const o=F(e.options.portalHeartbeatBackoffMs??_e,1e3,1800*1e3),a=pe(e.options.portalHeartbeatJitterRatio??ge,0,.5),s=F(e.options.portalHeartbeatTimeoutMs??t.heartbeatTimeoutMs??Ae,1e3,6e4);let l=!1,c,I,y=me(r,a,Math.random);const R=u=>new Promise(m=>{I=m,c=setTimeout(m,u),typeof c.unref=="function"&&c.unref()}),i=(async()=>{for(;!l&&(y>0&&await R(y),!l);){const u=await V({...t,projectRoot:t.projectRoot??e.projectRoot,runnerId:t.runnerId??e.runnerId,sessionId:t.sessionId??e.options.portalHeartbeatSessionId,serverUrl:t.serverUrl??e.options.serverUrl,adapter:t.adapter??e.options.adapter,adapterLoader:t.adapterLoader??e.options.adapterLoader,now:t.now??e.now,mode:t.mode??(e.options.tickMode==="scheduled"?"scheduled":"background"),timeoutMs:s}).catch(()=>({ok:!1,runnerId:e.runnerId,workspaceId:"workspace-default",workspaceLabel:"Workspace workspace-default",projectId:"project-default",projectLabel:"Project project-default",mode:e.options.tickMode==="scheduled"?"scheduled":"background",generatedAt:e.now(),serverAccessToLocalhost:!1,serverHeldStream:!1,localhostCallback:!1,posted:{heartbeat:!1},counts:{redactions:0},reasonCodes:[d.BACKOFF_SCHEDULED],redactionEvidence:[],publicSafe:!0}));y=me(u.ok?r:o,a,Math.random)}})();return{stop:async()=>{l=!0,c&&clearTimeout(c),I?.(),await i.catch(()=>{})}}}async function Ke(e={}){const t=G(e.projectRoot??process.cwd()),r=e.now??(()=>new Date().toISOString()),o=r(),a={};let s=null,l=null;try{l=await Z({projectRoot:t,adapter:e.adapter,adapterLoader:e.adapterLoader,now:r}),s=l.collectSnapshotRows({nowIso:o,jobLimit:10,staleLeaseLimit:10,receiptLimit:10,eventLimit:10,snapshotLimit:5});const f=String(l.pragmaValue("journal_mode")??"").toLowerCase();a["db-integrity"]=w("db-integrity","DB integrity","ok",[d.OK],"Continuity SQLite integrity check completed.",{jobs:_(s.counts,"jobs"),receipts:_(s.counts,"receipts"),events:_(s.counts,"events")}),a["sqlite-wal"]=w("sqlite-wal","SQLite WAL",f==="wal"?"ok":"blocked",f==="wal"?[d.OK]:[d.SQLITE_INTEGRITY_FAILED],f==="wal"?"SQLite journal mode is WAL.":"SQLite journal mode is not WAL."),a.migrations=w("migrations","Migrations",s.schemaVersion>=1?"ok":"blocked",s.schemaVersion>=1?[d.OK]:[d.SQLITE_INTEGRITY_FAILED],`Continuity schema version ${s.schemaVersion} is readable.`)}catch(f){const p=ue(f);a["db-integrity"]=w("db-integrity","DB integrity","blocked",[p],"Continuity SQLite could not be opened safely."),a["sqlite-wal"]=w("sqlite-wal","SQLite WAL","blocked",[p],"SQLite WAL could not be verified."),a.migrations=w("migrations","Migrations","blocked",[p],"Continuity migrations could not be verified.")}finally{if(l)try{l.close()}catch{}}const c=s?_(s.counts,"staleLeases"):0,I=s?_(s.counts,"staleHeadlessExecutionAttempts"):0;a.leases=w("leases","Lease health",c+I>0?"degraded":"ok",c+I>0?[d.LEASE_EXPIRED]:[d.OK],c+I>0?"Stale job leases or headless execution attempts are eligible for bounded recovery.":"No stale leases or headless attempts reported.",{staleLeases:c,staleHeadlessExecutionAttempts:I});const y=s?.headlessExecutionAttempts??[],R=J(y.map(f=>f.reason_code).filter(f=>typeof f=="string"&&f.length>0)),i=ft(y,R),u=new Set([d.HEADLESS_RUNTIME_UNRESOLVED,d.HEADLESS_RUNTIME_UNTRUSTED,d.HEADLESS_ADAPTER_UNAVAILABLE,d.HEADLESS_RUNTIME_AUTH_REQUIRED,"headless-model-rejected","headless-directive-rejected","headless-prompt-rejected","headless-yoloop-metadata-invalid","headless-yoloop-isolation-violation"]),m=s?_(s.counts,"headlessExecutionAttempts"):0,L=R.some(f=>u.has(f)),C=R.includes(d.HEADLESS_EXECUTION_BACKOFF)||y.some(f=>f.status==="backoff"),A=R.includes(d.HEADLESS_RECEIPT_REDACTED),T=i.authRequired>0,b=i.trustFailures>0||i.adapterUnavailable>0,k=I>0||C||A||i.timeout>0||i.genericFailed>0||i.redactions>0;a["headless-execution"]=w("headless-execution","Headless execution",L?"blocked":k?"degraded":m>0?"ok":"delegated",R.length>0?R:m>0?[d.OK]:[d.HEADLESS_RUNTIME_UNRESOLVED],L?T&&!b?"Complete local runtime login/auth setup before starting a new headless attempt; default retry/backoff is not scheduled for auth-required.":"Resolve public runtime/model trust, adapter availability or protected directive hard-stop reason codes before executing headless attempts.":k?"Headless attempts need bounded recovery, retry/backoff, timeout/generic failure follow-up or redaction review.":m>0?"Headless attempts are represented by public status, runtime/model and reason-code evidence.":"Headless resolver checks are delegated until durable headless work is queued.",{attempts:m,queuedBackoff:s?_(s.counts,"headlessQueuedAttempts"):0,running:s?_(s.counts,"headlessRunningAttempts"):0,staleHeadlessExecutionAttempts:I,trustFailures:i.trustFailures,adapterUnavailable:i.adapterUnavailable,authRequired:i.authRequired,retryBackoff:i.retryBackoff,timeout:i.timeout,genericFailed:i.genericFailed,redactions:i.redactions});const E=s?.outboxCounts??{},g=_(E,"failed")+_(E,"dead_letter");a.outbox=w("outbox","Outbox state",g>0?"degraded":"ok",g>0?[d.BACKOFF_SCHEDULED]:[d.OK],g>0?"Failed/dead-letter outbox entries can be retried with dedupe.":"Outbox has no failed/dead-letter entries.",{pending:_(E,"pending"),failed:_(E,"failed"),deadLetter:_(E,"dead_letter")}),a.metering=w("metering","Metering receipts","ok",[d.OK],"Metering evidence is represented by public job receipts and counts only.",{receipts:s?_(s.counts,"receipts"):0}),a["portal-sync"]=w("portal-sync","Portal sync",g>0?"degraded":"ok",g>0?[d.BACKOFF_SCHEDULED]:[d.OK],g>0?"Portal sync worker is enabled but has retryable outbox debt; outbound sync remains client-owned.":"Portal sync worker is enabled for outbound heartbeat, jobs sync, command polling and acknowledgement only.",{pending:_(E,"pending"),failed:_(E,"failed"),deadLetter:_(E,"dead_letter")});const N=e.trustCheck===!1?{trusted:!0,publicSafe:!0}:P(e.executablePath??process.argv[1]);a.runner=w("runner","Runner health",N.trusted?"ok":"blocked",N.trusted?[d.OK]:[N.reasonCode??d.RUNNER_BINARY_UNTRUSTED],N.trusted?"Runner binary trust check passed.":"Runner binary trust check failed.");try{const f=await ee({command:"doctor",projectRoot:t,executablePath:e.scheduler?.executablePath??e.executablePath??process.argv[1],platform:e.scheduler?.platform,env:e.scheduler?.env,dryRun:!0,intervalSeconds:e.scheduler?.intervalSeconds,strategy:e.scheduler?.strategy,allowCronFallback:e.scheduler?.allowCronFallback,trustCheck:e.scheduler?.trustCheck??e.trustCheck,uid:e.scheduler?.uid,commandAvailable:e.scheduler?.commandAvailable,commandRunner:e.scheduler?.commandRunner,trustChecker:e.scheduler?.trustChecker??P}),p=f.reasonCodes.includes(d.RUNNER_BINARY_UNTRUSTED)||f.reasonCodes.some(h=>h.startsWith("runner-binary-"))||f.reasonCodes.includes("scheduler-install-unsafe");a.scheduler=w("scheduler","Scheduler install",p?"blocked":f.ok?"ok":"degraded",f.reasonCodes,f.ok?"Scheduler doctor selected a user-scope strategy.":"Scheduler doctor found public guidance or degraded capability.",{manifests:f.manifestPaths.length,controlCommands:f.controlCommands.length,legacyEntries:f.legacyEntries.length})}catch(f){a.scheduler=w("scheduler","Scheduler install","degraded",["scheduler-command-failed"],x(f))}const v=a,H=J(Object.values(v).flatMap(f=>f.reasonCodes));return{ok:Object.values(v).every(f=>f.status!=="blocked"),generatedAt:o,checks:v,reasonCodes:H,publicSafe:!0}}function de(e){if(!e)return[];const t=[e.continuityRunnerDirectives,e.runnerDirectives,e.continuityDirectives];for(const r of t)if(Array.isArray(r))return r.filter(j).map(it).filter(lt);return[]}function Je(e,t){if(!j(e))throw new U("Directive is not a public record.");if(e.publicSafe!==!0)throw new U("Directive is not marked public-safe.");const r=typeof e.kind=="string"?e.kind:typeof e.type=="string"?e.type:"";if(!Ue.has(r))throw new U("Directive kind is not allowlisted.");const o=typeof e.commandClass=="string"?e.commandClass:"runner";if(!De.has(o))throw new U("Directive command class is not allowlisted.");if((typeof e.jobId=="string"?e.jobId:t)!==t)throw new U("Directive job ID does not match the leased job.");Q(e,"directive")}async function wt(e,t={}){const r=tt(e);if(r.command==="help")return process.stdout.write(`${ot}
|
|
2
2
|
`),0;if(r.command==="version"){const o=P(t.executablePath??process.argv[1]);return process.stdout.write(`${o.packageVersion??"0.0.0"}
|
|
3
3
|
`),o.trusted?0:1}if(r.command==="doctor")try{const o=await Ke({...t,projectRoot:r.projectRoot??t.projectRoot,executablePath:t.executablePath??process.argv[1],scheduler:{...t.scheduler,strategy:r.strategy??t.scheduler?.strategy,allowCronFallback:r.allowCronFallback??t.scheduler?.allowCronFallback,executablePath:t.scheduler?.executablePath??t.executablePath??process.argv[1]}});return process.stdout.write(JSON.stringify(o)+`
|
|
4
4
|
`),o.ok?0:1}catch(o){return process.stderr.write(JSON.stringify({error_code:"runner-doctor-failed",message:x(o)})+`
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** P208.05 -- client enforcement for phased plans and branchless bundles. */
|
|
2
|
+
import { validateYoloopPreparationBundle } from '../../../../shared/dist/yoloop/wave-decision-receipt.js';
|
|
3
|
+
import type { YoloopPreparationBundleAdmission } from '../../../../shared/dist/yoloop/execution-plan.js';
|
|
4
|
+
export declare function validatePhasedYoloopPlan(plan: Record<string, unknown>): {
|
|
5
|
+
readonly ok: boolean;
|
|
6
|
+
readonly preparationConcurrency: number;
|
|
7
|
+
readonly childExecutionConcurrency: 1;
|
|
8
|
+
readonly reasonCodes: readonly string[];
|
|
9
|
+
};
|
|
10
|
+
export declare function admitPreparedStoryBundle(input: {
|
|
11
|
+
readonly bundle: YoloopPreparationBundleAdmission;
|
|
12
|
+
readonly payload: Uint8Array;
|
|
13
|
+
readonly expected: Parameters<typeof validateYoloopPreparationBundle>[1] & {
|
|
14
|
+
readonly claimRevision: string;
|
|
15
|
+
};
|
|
16
|
+
readonly writerLease: {
|
|
17
|
+
readonly ownerStoryId: string;
|
|
18
|
+
readonly expiresAt: string;
|
|
19
|
+
} | null | undefined;
|
|
20
|
+
}): readonly string[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createHash as u}from"node:crypto";import{validateYoloopPreparationBundle as l}from"../../../../shared/dist/yoloop/wave-decision-receipt.js";function y(e){const r=[],i=Array.isArray(e.phases)?e.phases.filter(o):[],a=o(e.budgets)?e.budgets:{};(e.version!==2||!n(e.graphRevision))&&r.push("phased-plan-invalid"),a.maxWriteConcurrency!==1&&r.push("writer-concurrency-invalid");for(const s of i)(!Number.isInteger(s.maxConcurrency)||Number(s.maxConcurrency)<1)&&r.push("phase-concurrency-invalid"),s.mutatesEpicWorktree===!0&&(s.maxConcurrency!==1||!["epic-writer-lease","commit-range"].includes(String(s.isolation)))&&r.push("mutating-phase-not-serialized");["read-only-analysis","isolated-build-test","patch-preparation","single-writer-integration","story-checkpoint-review"].some(s=>!i.some(d=>d.kind===s))&&r.push("phase-missing");const t=Array.isArray(e.decisionReceiptIds)?e.decisionReceiptIds:[];(t.length===0||t.some(s=>!n(s)))&&r.push("decision-receipt-invalid");const c=Math.max(1,...i.filter(s=>s.mutatesEpicWorktree===!1).map(s=>Number(s.maxConcurrency)||1));return{ok:r.length===0,preparationConcurrency:c,childExecutionConcurrency:1,reasonCodes:[...new Set(r)].sort()}}function f(e){const r=[...l(e.bundle,e.expected)];return e.bundle.claimRevision!==e.expected.claimRevision&&r.push("bundle-claims-stale"),u("sha256").update(e.payload).digest("hex")!==e.bundle.bundleDigest&&r.push("bundle-payload-digest-mismatch"),(!e.writerLease||e.writerLease.ownerStoryId!==e.bundle.storyId||e.writerLease.expiresAt<=e.expected.nowIso)&&r.push("bundle-writer-lease-missing"),[...new Set(r)].sort()}function o(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function n(e){return typeof e=="string"&&/^[a-f0-9]{40,64}$/.test(e)}export{f as admitPreparedStoryBundle,y as validatePhasedYoloopPlan};
|
|
@@ -25,6 +25,7 @@ export interface RunYoloopRootInvokeInput {
|
|
|
25
25
|
readonly modelId?: string;
|
|
26
26
|
readonly timeoutMs: number;
|
|
27
27
|
readonly serverUrl?: string;
|
|
28
|
+
readonly strictReadOnly?: boolean;
|
|
28
29
|
}
|
|
29
30
|
export interface RunYoloopRootInvokeResult {
|
|
30
31
|
readonly success: boolean;
|
|
@@ -109,5 +110,6 @@ export interface RunYoloopExecutionPhaseSummary {
|
|
|
109
110
|
readonly reasonCodes: readonly string[];
|
|
110
111
|
readonly publicSafe: true;
|
|
111
112
|
}
|
|
113
|
+
export declare function isCanonicalDelegatedStoryPrompt(prompt: string): boolean;
|
|
112
114
|
export declare function defaultYoloopRootInvoker(input: RunYoloopRootInvokeInput): Promise<RunYoloopRootInvokeResult>;
|
|
113
115
|
export declare function runYoloopExecutionPhase(options: RunYoloopExecutionPhaseOptions): Promise<RunYoloopExecutionPhaseSummary>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomBytes as ue}from"node:crypto";import{invoke as me}from"../../commands/invoke.js";import{AUTONOMOUS_GOVERNANCE_EVIDENCE_TAG as pe,AUTONOMOUS_GOVERNANCE_REASON_CODES as se,autonomousGovernanceMetadata as fe,buildAutonomousGovernanceEnvelope as ye,readAutonomousGovernanceEnvelopeFromMetadata as he,recordAutonomousGovernance as _e}from"../../continuity/autonomous-governance.js";import{createDefaultHeadlessAdapterRegistry as Ce}from"./adapters.js";import{loadHeadlessRuntimeDefaults as Ie,resolveHeadlessRuntime as Ae}from"./resolver.js";import{DEFAULT_HEADLESS_EXECUTION_BACKOFF_MS as Se,DEFAULT_HEADLESS_EXECUTION_LEASE_MS as be,DEFAULT_HEADLESS_EXECUTION_LIMIT as Ee,DEFAULT_HEADLESS_EXECUTION_MAX_ATTEMPTS as ge,DEFAULT_HEADLESS_EXECUTION_STALE_LEASE_AFTER_MS as Oe,DEFAULT_HEADLESS_EXECUTION_TIMEOUT_MS as ke,headlessExecutionEntityId as N,runYoloExecutionPhase as Re}from"./run-yolo.js";import{HEADLESS_REASON_CODES as d,boundPublicSummary as Z,hashPublicValue as g,redaction as f}from"./types.js";const ve=20,Te=1800*1e3,ne=1,Pe=10,It=Object.freeze(["start","metadata_parse","child_story_delegation","reinvoke","complete","aborted","backoff"]),G=/^docs\/epics\/epic-[A-Za-z0-9._-]+\.md$/,xe=/^docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,ie=/^\*yolo @docs\/stories\/[A-Za-z0-9._-]+\.story\.md$/,Le=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/,j=/(?:[;&|`$<>]|\$\(|\n|\r|\0)/,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,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,De=new Set(["schemaVersion","contractVersion","kind","commandClass","jobId","operationId","idempotencyKey","targetKind","targetRef","commandRef","epicId","runtime","publicSummary","reasonCode","attempts","metadata","redactionSummary","publicSafe"]),Me=new Set(["runtimeId","modelId","source","reasonCode","publicSafe"]),we="job-aborted",Ne="max-iterations-reached",je="max-duration-reached";async function He(e){const r=Date.now(),t=await me({args:e.args,projectRoot:e.projectRoot,format:"json",platformTarget:"runner",serverUrl:e.serverUrl});return{success:t.success,instructions:t.instructions,metadata:t.metadata,error:t.error,errorCode:t.errorCode,exitCode:t.exitCode,durationMs:Date.now()-r,publicSafe:!0}}async function At(e){const r=e.adapterRegistry??Ce(),t=L(e.limit??Ee,1,10),o=L(e.leaseMs??be,1e3,3600*1e3),a=L(e.staleLeaseAfterMs??Oe,0,1440*60*1e3),n=L(e.maxAttempts??ge,1,10),s=L(e.localConcurrencyCap??ne,1,Pe),i=[],l=[],c=e.now(),u=Ke({store:e.store,metadata:e.metadata,nowIso:c,maxAttempts:n,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 Ue({store:e.store,projectRoot:e.projectRoot,runnerId:e.runnerId,attempt:y,registry:r,now:e.now,leaseMs:o,timeoutMs:L(e.timeoutMs??ke,1e3,18e5),backoffMs:L(e.backoffMs??Se,1e3,36e5),maxAttempts:n,maxIterations:L(e.maxIterations??ve,1,100),maxDurationMs:L(e.maxDurationMs??Te,1e3,72e5),localConcurrencyCap:s,queueCap:e.queueCap,adapterOptions:e.adapterOptions,runtimeDefaults:e.runtimeDefaults,runtimeFallback:e.runtimeFallback,yoloopInvoker:e.yoloopInvoker??He,serverUrl:e.serverUrl,idFactory:e.idFactory??lt});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:x(i.length>0?i:[d.OK]),publicSafe:!0}}function Ke(e){let r=0,t=0;const o=[];for(const a of ot(e.metadata)){if(!C(a)||a.kind!=="run_yoloop")continue;const n=Be(a);if(!n.ok){t+=1,o.push(n.reasonCode);continue}const s=n.directive;if(!e.store.jobExists(s.jobId)){t+=1,o.push(se.BYPASS_BLOCKED);continue}const i=at(s);if(e.store.hasCompletedHeadlessExecutionDirectiveHash(i)){o.push(d.EXECUTION_COMPLETED);continue}const l=ye({autonomousKind:"run_yoloop",source:"headless-run-yoloop",targetKind:"epic",targetRef:s.targetRef,epicId:s.epicId??V(s.targetRef),jobId:s.jobId,operationSeed:s.operationId,commandHash:g(s.commandRef)}),c=_e(e.store,l,e.nowIso,{requireExistingJob:!0});if(!c.ok){t+=1,o.push(c.reasonCode);continue}const u=N("attempt",s.idempotencyKey),m=N("exec",s.operationId),_=e.store.enqueueHeadlessExecutionAttempt({attemptId:u,executionId:m,jobId:s.jobId,directiveHash:i,directiveKind:"run_yoloop",commandClass:s.commandClass,targetKind:"epic",targetRef:s.targetRef,epicId:s.epicId??V(s.targetRef),runtimeId:s.runtime?.runtimeId,modelId:s.runtime?.modelId,runtimeSource:ct(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:fe(l,{schemaVersion:1,contractVersion:"continuity-v1",jobId:s.jobId,operationId:s.operationId,reasonCode:s.reasonCode??d.OK,targetRef:s.targetRef,directiveHash:i})});if(!_.accepted){t+=1,o.push(_.reasonCode??"queue-cap-reached");continue}_.inserted&&(r+=1),o.push(d.OK)}return{enqueuedCount:r,rejectedCount:t,reasonCodes:x(o)}}async function Ue(e){const r=e.now(),t=e.idFactory("lease",e.attempt.attempt_id),o=le(r,e.leaseMs);if(!e.store.claimHeadlessExecutionAttempt({attemptId:e.attempt.attempt_id,leaseId:t,runnerId:e.runnerId,claimedAt:r,leaseExpiresAt:o,reasonCode:d.OK}).inserted)return et(e.attempt,{status:e.attempt.status,receiptStatus:"ignored",reasonCode:"lease-conflict",timestamp:r});if(e.store.hasCompletedHeadlessExecutionDirectiveHash(e.attempt.directive_hash,e.attempt.attempt_id))return Q(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:te(),hashes:{directive:e.attempt.directive_hash},redactionSummary:[],relativePaths:[e.attempt.target_ref],childStoryIds:[],stateTransitions:["start","complete"]});const s=Fe(e);if(!s.ok)return Q(e.store,e.attempt,{leaseId:t,runnerId:e.runnerId,status:s.status,receiptStatus:s.receiptStatus,reasonCode:s.reasonCode,publicSummary:s.publicSummary,completedAt:e.now(),counts:te(),hashes:{directive:e.attempt.directive_hash},redactionSummary:s.redactionSummary,relativePaths:nt(e.attempt),childStoryIds:[],stateTransitions:["start"]});const i=await $e({...e,prepared:s.input}),l=tt(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 Q(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:s.input.runtimeId,modelId:s.input.modelId,runtimeSource:s.input.runtimeSource,stateTransitions:i.stateTransitions})}async function $e(e){const r=Date.now(),t=["start"],o=new Set,a=[],n=[],s={root:g(e.prepared.rootPrompt)},i=[f("rootPrompt","prompt_body",s.root)];let l=0,c=0,u=0,m=0,_=0,y=0;const p=de(e.localConcurrencyCap);for(;;){if(l>=e.maxIterations)return t.push("backoff"),P({status:"failed",receiptStatus:"failed",reasonCode:Ne,publicSummary:"Headless yoloop reached the bounded iteration limit before completion metadata.",retryable:!1,startedAt:r,counts:v(l,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});if(Date.now()-r>e.maxDurationMs)return t.push("backoff"),P({status:"failed",receiptStatus:"failed",reasonCode:je,publicSummary:"Headless yoloop reached the bounded duration limit before completion metadata.",retryable:!1,startedAt:r,counts:v(l,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],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&&(s[`iter-${l}`]=g(String(h.durationMs))),!h.success)return t.push("backoff"),P({status:"backoff",receiptStatus:"deferred",reasonCode:d.EXECUTION_FAILED,publicSummary:"Headless yoloop root metadata invocation failed with bounded public evidence.",retryable:!0,startedAt:r,counts:v(l,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});const b=h.metadata,D=Je(b);if(!D.ok)return t.push("backoff"),P({status:"failed",receiptStatus:"failed",reasonCode:D.reasonCode,publicSummary:D.publicSummary,retryable:!1,startedAt:r,counts:v(l,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:[...i,...D.redactionSummary],relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});if(D.aborted)return y+=1,t.push("aborted"),P({status:"failed",receiptStatus:"failed",reasonCode:we,publicSummary:"Headless yoloop stopped because public metadata reported an aborted loop.",retryable:!1,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});if(D.complete)return _+=1,t.push("complete"),P({status:"completed",receiptStatus:"applied",reasonCode:d.EXECUTION_COMPLETED,publicSummary:"Headless yoloop completed after public metadata reported yoloopComplete.",retryable:!1,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});const O=Xe(b,e.prepared.epicId);if(!O.ok)return t.push("backoff"),P({status:"failed",receiptStatus:"failed",reasonCode:O.reasonCode,publicSummary:O.publicSummary,retryable:!1,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:[...i,...O.redactionSummary],relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});const oe=O.prompts.find(M=>o.has(M.storyId));if(oe)return t.push("backoff"),P({status:"failed",receiptStatus:"failed",reasonCode:d.YOLOOP_ISOLATION_VIOLATION,publicSummary:"Headless yoloop rejected cyclic child story delegation evidence.",retryable:!1,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:[...i,f("storyId","prompt_body",g(oe.storyId))],relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t});p.mode=O.parallelAuthorized?"parallel_wave":"serial",p.serverMaxConcurrency=O.serverMaxConcurrency,p.pendingChildCount=O.prompts.length;const q=[...O.prompts];for(;q.length>0;){const M=Ye({store:e.store,nowIso:e.now(),localCap:e.localConcurrencyCap,serverMaxConcurrency:O.serverMaxConcurrency,parallelAuthorized:O.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"),P({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:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],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 ae=await Promise.all(W.map(E=>ze({...e,child:E,iteration:l})));p.completedChildCount+=ae.length;let w;for(const E of ae){const B=E.child;s[`child-${B.storyId.replace(/[^A-Za-z0-9_.:-]/g,"-")}`]=E.commandHash,i.push(E.promptRedaction),a.push(B.storyId),n.push(B.targetRef),o.add(B.storyId);const $=E.receipt;if(!$){E.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 E=w.kind==="deferred";return P({status:E?"backoff":"failed",receiptStatus:E?"deferred":"failed",reasonCode:w.reasonCode,publicSummary:w.kind==="missing"?"Headless yoloop child story delegation did not produce a public receipt.":E?"Headless yoloop child story delegated bounded backoff to the root attempt.":"Headless yoloop child story execution failed with public receipt evidence.",retryable:E,startedAt:r,counts:v(l+1,a.length,c,u,m,_,y),workerPoolSummary:k(p),hashes:s,redactions:i,relativePaths:[e.prepared.targetRef,...n],childStoryIds:a,stateTransitions:t})}}l+=1,t.push("reinvoke")}}async function ze(e){const r=Qe({rootAttempt:e.attempt,child:e.child,iteration:e.iteration,runtimeId:e.prepared.runtimeId,modelId:e.prepared.modelId,runtimeSource:e.prepared.runtimeSource}),t=N("attempt",r.idempotencyKey),o=await Re({store:e.store,projectRoot:e.projectRoot,runnerId:e.runnerId,now:e.now,metadata:{continuityExecutionDirectives:[r]},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:o.receipts.find(a=>a.attemptId===t)??o.receipts[0],reasonCodes:o.reasonCodes,commandHash:g(e.child.commandRef),promptRedaction:f(`child.${e.child.storyId}`,"prompt_body",g(e.child.commandRef))}}function Ye(e){const r=e.store.collectSnapshotRows({nowIso:e.nowIso,jobLimit:1,staleLeaseLimit:1,receiptLimit:1,eventLimit:1,snapshotLimit:1}),t=Math.max(1,Math.floor(r.queue.capacity)),o=Math.max(0,Math.floor(r.queue.running)-1),a=Math.max(0,e.localCap-o),n=Math.max(0,Math.min(a,Math.floor(r.queue.available))),s=e.parallelAuthorized?Math.max(1,Math.floor(e.serverMaxConcurrency)):1,i=Math.max(0,Math.min(s,e.localCap,t,n));return{queueCap:t,availableLeases:n,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 de(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:T(e.serverMaxConcurrency),localCap:T(e.localCap),queueCap:T(e.queueCap),availableLeases:T(e.availableLeases),effectiveConcurrency:T(e.effectiveConcurrency),peakConcurrency:T(e.peakConcurrency),pendingChildCount:T(e.pendingChildCount),startedChildCount:T(e.startedChildCount),completedChildCount:T(e.completedChildCount),backpressurePauseCount:T(e.backpressurePauseCount),reasonCodes:x(e.reasonCodes.length>0?e.reasonCodes:[d.WORKER_POOL_SERIAL_FALLBACK]).slice(0,10),publicSafe:!0}}function J(e=ne){return k(de(e))}function T(e){return Number.isFinite(e)?Math.max(0,Math.min(1e4,Math.floor(e))):0}function Fe(e){const r=he(e.attempt.metadata_json,{autonomousKind:"run_yoloop",jobId:e.attempt.job_id,targetKind:"epic",targetRef:e.attempt.target_ref});if(!r.ok)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:r.reasonCode,publicSummary:r.publicSummary,redactionSummary:r.redactionSummary};const t=Ve(e.attempt);if(!t.ok)return t;const o=qe(e);if(!o.ok)return{ok:!1,status:"failed",receiptStatus:"failed",reasonCode:o.reasonCode,publicSummary:o.publicSummary,redactionSummary:o.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:o.runtimeId,...o.modelId?{modelId:o.modelId}:{},runtimeSource:o.runtimeSource,publicSafe:!0}}}function Ve(e){const r=[];e.directive_kind!=="run_yoloop"&&r.push(f("directiveKind","unsafe_key","value-denied")),e.target_kind!=="epic"&&r.push(f("targetKind","prompt_body","value-denied")),(!G.test(e.target_ref)||j.test(e.target_ref)||A.test(e.target_ref))&&r.push(f("targetRef","prompt_body","value-denied"));const t=V(e.target_ref);return e.epic_id&&e.epic_id!==t&&r.push(f("epicId","prompt_body","value-denied")),r.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:r}:{ok:!0,input:{rootPrompt:`*yoloop @${e.target_ref}`,targetRef:e.target_ref,epicId:t,runtimeId:"fake",publicSafe:!0}}}function qe(e){const r=e.runtimeDefaults!==void 0?e.runtimeDefaults:Ie({projectRoot:e.projectRoot});if(C(r)&&r.ok===!1)return{ok:!1,reasonCode:d.RUNTIME_UNTRUSTED,publicSummary:typeof r.publicSummary=="string"?r.publicSummary:"Headless runtime defaults failed public-safety validation.",redactionSummary:Array.isArray(r.redactionSummary)?r.redactionSummary:[]};const t=dt(e.attempt.runtime_source)??"explicit",o=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:r,fallback:e.runtimeFallback};o&&(t==="origin"?a.origin=o:t==="default"?a.projectDefault=o:t==="fallback"?a.fallback=o:a.explicit=o);const n=Ae(a);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 Be(e){const r=[];for(const b of Object.keys(e))(!De.has(b)||z.test(b))&&r.push(f(b,U(b),"key-denied"));e.publicSafe!==!0&&r.push(f("publicSafe","unsafe_key","value-denied"));const t=S(e,"kind"),o=S(e,"commandClass"),a=S(e,"jobId"),n=S(e,"operationId"),s=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"&&r.push(f("kind","unsafe_key","value-denied")),o!=="goal-tick"&&o!=="loop-tick"&&r.push(f("commandClass","unsafe_key","value-denied")),re(a)||r.push(f("jobId","unsafe_key","value-denied")),re(n)||r.push(f("operationId","unsafe_key","value-denied")),re(s)||r.push(f("idempotencyKey","unsafe_key","value-denied")),(i!=="epic"||!l||!G.test(l)||A.test(l))&&r.push(f("targetRef","prompt_body","value-denied"));const _=l?`*yoloop @${l}`:void 0;(!c||c!==_||c.includes("@neocortex")||j.test(c)||A.test(c))&&r.push(f("commandRef","prompt_body","value-denied")),m&&l&&m!==V(l)&&r.push(f("epicId","prompt_body","value-denied")),(!u||u.length>240||A.test(u))&&r.push(f("publicSummary","unbounded_text","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||A.test(e.reasonCode))&&r.push(f("reasonCode","unsafe_key","value-denied"));const y=rt(e.runtime,r);e.attempts!==void 0&&X(e.attempts,"attempts",r),e.metadata!==void 0&&X(e.metadata,"metadata",r);const p=C(e.metadata)?e.metadata:void 0,h=st(e.redactionSummary,r);return r.length>0||t!=="run_yoloop"||!o||!a||!n||!s||!l||!c||!u?{ok:!1,reasonCode:r.some(D=>D.reason==="prompt_body")?d.PROMPT_REJECTED:d.DIRECTIVE_REJECTED,redactionSummary:r}:{ok:!0,directive:{kind:"run_yoloop",commandClass:o,jobId:a,operationId:n,idempotencyKey:s,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 Xe(e,r){if(!e)return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop metadata was missing.",[]);const t=We(e);if(!t.ok)return t;const o=[],a=C(e.yoloopExecutionPlan)?e.yoloopExecutionPlan:void 0,n=a?R(a.storyIds).filter(K):[];let s;if(a){const c=Ze(a);if(!c.ok)return c;s=c;for(const u of Ge(a)){const m=H(u,r,"execution-plan");if(!m.ok)return m;o.push(m.prompt)}if(o.length===0)for(const u of n){const m=H(`*yolo @docs/stories/${u}.story.md`,r,"execution-plan");if(!m.ok)return m;o.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=R(c.promptTemplates);if(u.length>0){for(const p of u){const h=H(p,r,"task-directive");if(!h.ok)return h;o.push(h.prompt)}continue}const m=typeof c.promptTemplate=="string"?c.promptTemplate:void 0;if(!m)continue;const _=R(c.storyIds).filter(K),y=_.length>0?_:i?[i]:[];if(y.length===0&&ie.test(m)){const p=H(m,r,"task-directive");if(!p.ok)return p;o.push(p.prompt);continue}for(const p of y){const h=m.includes("{storyId}")?m.replaceAll("{storyId}",p):m,b=H(h,r,"task-directive");if(!b.ok)return b;o.push(b.prompt)}}if(o.length===0&&i){const c=H(`*yolo @docs/stories/${i}.story.md`,r,"next-story");if(!c.ok)return c;o.push(c.prompt)}const l=ut(o,c=>c.commandRef);if(n.length>0){const c=new Set(n);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",g(u.storyId))])}return s?.parallelAuthorized&&!F(l.map(c=>c.storyId),n)?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:s?.mode??"legacy",serverMaxConcurrency:s?.serverMaxConcurrency??1,parallelAuthorized:s?.parallelAuthorized??!1,reasonCodes:[d.OK,s?.parallelAuthorized?d.WORKER_POOL_PARALLEL_ACTIVE:d.WORKER_POOL_SERIAL_FALLBACK]}}function We(e){const r=[];return e.nextStoryId!==void 0&&Y(e.nextStoryId,"nextStoryId",r),e.yoloopExecutionPlan!==void 0&&Y(e.yoloopExecutionPlan,"yoloopExecutionPlan",r),Array.isArray(e.skillDirectives)&&e.skillDirectives.forEach((t,o)=>{C(t)&&t.kind==="task"&&Y(t,`skillDirectives.${o}`,r)}),r.length>0?I(d.YOLOOP_METADATA_INVALID,"Headless yoloop rejected unsafe public metadata before child delegation.",r):{ok:!0}}function Y(e,r,t){if(typeof e=="string"){(A.test(e)||/\0/.test(e))&&t.push(f(r,U(r),"value-denied"));return}if(!(e==null||typeof e=="number"||typeof e=="boolean")){if(Array.isArray(e)){e.forEach((o,a)=>Y(o,`${r}.${a}`,t));return}if(C(e)){for(const[o,a]of Object.entries(e)){const n=`${r}.${o}`;!(o==="promptTemplate"||o==="promptTemplates"||o==="childPromptKind"||o==="allowMetaTaskPromptInChild"||o==="authorization")&&z.test(o)&&t.push(f(n,U(o),"key-denied")),Y(a,n,t)}return}t.push(f(r,"unsafe_key","value-denied"))}}function Ze(e){const r=typeof e.mode=="string"?e.mode:"",t=C(e.isolationPolicy)?e.isolationPolicy:void 0,o=R(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(r!=="serial"&&r!=="parallel_wave"&&r!=="manual")return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop execution plan mode was invalid.",[]);if(!Array.isArray(e.storyIds)||o.length===0||o.length!==e.storyIds.length||o.some(h=>!K(h))||new Set(o).size!==o.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"&&(r==="serial"&&t.childTaskDelegation==="not_required"||r==="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(o.includes(h.storyId))return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop selected a story that server evidence marked skipped.",[])}if(r!=="parallel_wave")return{ok:!0,mode:r,serverMaxConcurrency:1,parallelAuthorized:!1};const n=e.maxConcurrency,s=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(n)||typeof n!="number"||n<2||n>o.length||!Number.isInteger(s)||s!==n||!i||i.source!=="state_snapshot"||!F(R(i.storyIds),o)||!l||l.source!=="ready_wave"||!F(R(l.selectedStoryIds),o)||!u||!F(R(u.storyIds),o)||u.maxConcurrency!==n)return I(d.YOLOOP_METADATA_INVALID,"Headless yoloop parallel plan lacked consistent bounded authorization and readiness evidence.",[]);const m=R(u.promptTemplates);if(m.length!==o.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(R(h.storyIds),o));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:n,parallelAuthorized:!0}}function Ge(e){const r=[];r.push(...R(e.promptTemplates));for(const t of Array.isArray(e.serialSteps)?e.serialSteps:[])C(t)&&typeof t.promptTemplate=="string"&&r.push(t.promptTemplate);for(const t of Array.isArray(e.parallelWaves)?e.parallelWaves:[])C(t)&&r.push(...R(t.promptTemplates));return r}function H(e,r,t){if(e.includes("@neocortex")||e.includes("*yoloop")||j.test(e)||A.test(e))return I(d.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected an unsafe child prompt shape.",[f("promptTemplate","prompt_body",g(e))]);if(!ie.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",g(e))]);const o=e.replace(/^\*yolo @/,""),a=it(o);return!xe.test(o)||!K(a)||!a.startsWith(`${r}.`)?I(d.YOLOOP_ISOLATION_VIOLATION,"Headless yoloop rejected a child prompt outside the targeted public epic.",[f("storyId","prompt_body",g(a))]):{ok:!0,prompt:{storyId:a,targetRef:o,commandRef:e,source:t}}}function Je(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 r=e.yoloopComplete===!0,t=e.yoloopAborted===!0;return r&&t?{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:t}}function Qe(e){const r=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:r,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",g(e.child.commandRef))],publicSafe:!0}}function Q(e,r,t){const o=ce(t.hashes),a=t.workerPoolSummary??J(),n=ce({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}),s={schemaVersion:1,contractVersion:"continuity-v1",attemptId:r.attempt_id,executionId:r.execution_id,jobId:r.job_id,directiveHash:r.directive_hash,status:t.status,reasonCode:t.reasonCode,storyIds:t.childStoryIds.slice(0,50),counts:n,hashes:o,...t.reasonCode===se.BYPASS_BLOCKED?{governanceEvidence:pe}:{},reasonCodes:x([t.reasonCode,...a.reasonCodes,...t.stateTransitions]),publicSummary:Z(t.publicSummary)};return e.completeHeadlessExecutionAttempt({attemptId:r.attempt_id,executionId:r.execution_id,jobId:r.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:n,hashes:o,redactionSummary:t.redactionSummary,relativePaths:x([r.target_ref,...t.relativePaths]),metadata:s}),e.recordHeadlessExecutionReceipt({receiptId:`receipt-${N("headless-yoloop",`${r.attempt_id}-${t.status}`)}`,attemptId:r.attempt_id,executionId:r.execution_id,jobId:r.job_id,status:t.receiptStatus,reasonCode:t.reasonCode,createdAt:t.completedAt,operationId:`${r.execution_id}:${t.status}:receipt`,idempotencyKey:`${r.directive_hash}:${t.status}:receipt`,counts:n,hashes:o,redactionSummary:t.redactionSummary,relativePaths:x([r.target_ref,...t.relativePaths]),metadata:s}),e.recordHeadlessExecutionSummary({eventId:`event-${N("headless-yoloop-summary",`${r.attempt_id}-${t.status}`)}`,attemptId:r.attempt_id,executionId:r.execution_id,jobId:r.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:n,hashes:o,redactionSummary:t.redactionSummary,relativePaths:x([r.target_ref,...t.relativePaths]),metadata:s}),{attemptId:r.attempt_id,executionId:r.execution_id,jobId:r.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 et(e,r){return{attemptId:e.attempt_id,executionId:e.execution_id,jobId:e.job_id,status:r.status,outcome:r.receiptStatus,reasonCode:r.reasonCode,timestamp:r.timestamp,childStoryIds:[],aggregateCounts:te(),workerPoolSummary:J(),redactionSummary:[],publicSafe:!0}}function tt(e,r,t,o,a){if(!r.retryable)return{retry:!1};const n=e.retry_count+1;if(n>=Math.max(1,e.max_attempts||t))return{retry:!1,retryCount:n};const s=Math.min(8,2**Math.max(0,e.retry_count));return{retry:!0,retryCount:n,notBeforeAt:le(a,o*s)}}function P(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??J(),hashes:e.hashes,redactionSummary:e.redactions.slice(0,50),relativePaths:x(e.relativePaths).slice(0,50),childStoryIds:x(e.childStoryIds).slice(0,50),stateTransitions:x(e.stateTransitions)}}function rt(e,r){if(e===void 0)return;if(!C(e)){r.push(f("runtime","unsafe_key","value-denied"));return}for(const n of Object.keys(e))(!Me.has(n)||z.test(n))&&r.push(f(`runtime.${n}`,U(n),"key-denied"));e.publicSafe!==!0&&r.push(f("runtime.publicSafe","unsafe_key","value-denied"));const t=S(e,"runtimeId"),o=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))&&r.push(f("runtime.runtimeId","unsafe_key","value-denied")),o&&(!/^[A-Za-z0-9][A-Za-z0-9._:+/-]{0,119}$/.test(o)||A.test(o)||j.test(o))&&r.push(f("runtime.modelId","unsafe_key","value-denied")),a!==void 0&&a!=="explicit"&&a!=="origin"&&a!=="default"&&a!=="fallback"&&a!=="unspecified"&&r.push(f("runtime.source","unsafe_key","value-denied")),e.reasonCode!==void 0&&(typeof e.reasonCode!="string"||A.test(e.reasonCode))&&r.push(f("runtime.reasonCode","unsafe_key","value-denied")),e.publicSafe===!0)return{...t?{runtimeId:t}:{},...o?{modelId:o}:{},...a==="explicit"||a==="origin"||a==="default"||a==="fallback"||a==="unspecified"?{source:a}:{},...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},publicSafe:!0}}function ot(e){const r=Array.isArray(e)?e:e?[e]:[],t=[];for(const o of r){const a=o.continuityExecutionDirectives;Array.isArray(a)&&t.push(...a)}return t}function at(e){return g(ee({kind:e.kind,commandClass:e.commandClass,jobId:e.jobId,targetRef:e.targetRef,commandRef:e.commandRef,epicId:e.epicId,runtime:e.runtime}))}function ee(e){return Array.isArray(e)?`[${e.map(ee).join(",")}]`:C(e)?`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${ee(e[r])}`).join(",")}}`:JSON.stringify(e)}function X(e,r,t){if(typeof e=="string"){(A.test(e)||j.test(e))&&t.push(f(r,U(r),"value-denied"));return}if(!(e==null||typeof e=="number"||typeof e=="boolean")){if(Array.isArray(e)){e.forEach((o,a)=>X(o,`${r}.${a}`,t));return}if(C(e)){for(const[o,a]of Object.entries(e)){const n=`${r}.${o}`;z.test(o)&&t.push(f(n,U(o),"key-denied")),X(a,n,t)}return}t.push(f(r,"unsafe_key","value-denied"))}}function st(e,r){if(e===void 0)return[];if(!Array.isArray(e))return r.push(f("redactionSummary","unsafe_key","value-denied")),[];const t=[];for(const[o,a]of e.entries()){if(!C(a)||a.publicSafe!==!0){r.push(f(`redactionSummary.${o}`,"unsafe_key","value-denied"));continue}const n=S(a,"field"),s=S(a,"reason"),i=S(a,"evidence");if(!n||!s||!i||A.test(n)||A.test(s)||A.test(i)){r.push(f(`redactionSummary.${o}`,"unsafe_key","value-denied"));continue}t.push({field:n,reason:s,evidence:i,publicSafe:!0})}return t}function I(e,r,t){return{ok:!1,reasonCode:e,publicSummary:r,redactionSummary:t}}function R(e){return Array.isArray(e)?e.filter(r=>typeof r=="string"):[]}function F(e,r){return e.length===r.length&&new Set(e).size===e.length&&e.every(t=>r.includes(t))}function nt(e){return G.test(e.target_ref)?[e.target_ref]:[]}function ce(e){if(!e)return;const r={};for(const[t,o]of Object.entries(e))!/^[A-Za-z0-9_.:-]{1,80}$/.test(t)||z.test(t)||A.test(t)||typeof o=="string"&&A.test(o)||(r[t]=o);return Object.keys(r).length>0?r:void 0}function te(){return v(0,0,0,0,0,0,0)}function v(e,r,t,o,a,n,s){return{iterations:e,childCount:r,succeededChildCount:t,failedChildCount:o,skippedChildCount:a,metadataCompleteCount:n,metadataAbortedCount:s}}function it(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 dt(e){if(e==="explicit"||e==="origin"||e==="default"||e==="fallback")return e}function ct(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,r){return typeof e[r]=="string"?e[r]:void 0}function re(e){return!!(e&&Le.test(e)&&!A.test(e)&&!j.test(e))}function C(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function lt(e,r){return N(e,`${r}-${Date.now()}-${ue(4).toString("hex")}`)}function le(e,r){const t=Date.parse(e);return new Date((Number.isFinite(t)?t:Date.now())+r).toISOString()}function L(e,r,t){return Number.isFinite(e)?Math.max(r,Math.min(t,Math.floor(e))):r}function x(e){return Array.from(new Set(e))}function ut(e,r){const t=new Set,o=[];for(const a of e){const n=r(a);t.has(n)||(t.add(n),o.push(a))}return o}export{ne as DEFAULT_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP,Te as DEFAULT_HEADLESS_YOLOOP_MAX_DURATION_MS,ve as DEFAULT_HEADLESS_YOLOOP_MAX_ITERATIONS,Pe as MAX_HEADLESS_YOLOOP_LOCAL_CONCURRENCY_CAP,It as RUN_YOLOOP_DRIVER_STATES,He as defaultYoloopRootInvoker,At as runYoloopExecutionPhase};
|
|
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};
|