@ornexus/neocortex 4.60.65 → 4.60.67
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/release-source.json +1 -1
- package/dist/sbom.cdx.json +1598 -1640
- package/install.ps1 +1 -1
- package/install.sh +2 -1
- package/package.json +17 -7
- package/packages/client/dist/cli.js +15 -2
- package/packages/client/dist/commands/architecture-root-binding.js +1 -1
- package/packages/client/dist/commands/doctor.d.ts +135 -0
- package/packages/client/dist/commands/doctor.js +2 -0
- package/packages/client/dist/commands/invoke.d.ts +19 -1
- package/packages/client/dist/commands/invoke.js +83 -82
- package/packages/client/dist/commands/story-checkpoint.d.ts +3 -1
- package/packages/client/dist/commands/story-checkpoint.js +1 -1
- package/packages/client/dist/continuity/sqlite-store.js +1 -1
- package/packages/client/dist/git/direct-yolo-c01-retry.d.ts +21 -0
- package/packages/client/dist/git/direct-yolo-c01-retry.js +4 -0
- package/packages/client/dist/git/direct-yolo-checkpoint.d.ts +1 -5
- package/packages/client/dist/git/direct-yolo-checkpoint.js +4 -4
- package/packages/client/dist/git/git-lifecycle-store.d.ts +0 -2
- package/packages/client/dist/git/git-lifecycle-store.js +8 -9
- package/packages/client/dist/private-execution/clean-baseline.d.ts +2 -3
- package/packages/client/dist/private-execution/clean-baseline.js +2 -2
- package/packages/client/dist/private-execution/isolated-admission.d.ts +2 -0
- package/packages/client/dist/private-execution/isolated-admission.js +16 -11
- package/packages/client/dist/runner/headless/run-yoloop.d.ts +4 -1
- package/packages/client/dist/runner/headless/run-yoloop.js +2 -2
- package/packages/client/dist/runner-cli.js +0 -0
- package/packages/client/dist/yolo/invoke-envelope-capability.d.ts +16 -0
- package/packages/client/dist/yolo/invoke-envelope-capability.js +1 -0
- package/packages/client/dist/yolo/spec-envelope-collector.d.ts +7 -0
- package/packages/client/dist/yolo/spec-envelope-collector.js +3 -3
- package/packages/shared/dist/architecture-non-ui-scope.js +22 -0
- package/packages/shared/dist/architecture-public-topology.js +11 -0
- package/packages/shared/dist/compatibility/index.js +476 -0
- package/packages/shared/dist/invocation/index.js +4 -2
- package/packages/shared/dist/private-qa-structural-admission.js +14 -0
- package/packages/shared/dist/private-yolo-predecessor-decision.js +32 -0
- package/packages/shared/dist/project-validation-commands.js +74 -0
- package/packages/shared/dist/yolo/spec-envelope.js +2 -0
- package/packages/shared/dist/yoloop/release-blocked.js +653 -0
- package/targets-stubs/antigravity/gemini.md +1 -1
- package/targets-stubs/antigravity/skill/SKILL.md +3 -2
- package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex-root.md +5 -5
- package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex.md +8 -9
- package/targets-stubs/codex/AGENTS.md +3 -3
- package/targets-stubs/cursor/agent.md +4 -3
- package/targets-stubs/gemini-cli/agent.md +5 -4
- package/targets-stubs/opencode/neocortex-root.md +3 -3
- package/targets-stubs/vscode/neocortex.agent.md +5 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type StoryCheckpointAction = 'setup' | 'accept-setup' | 'handoff' | 'begin' | 'finalize' | 'recover';
|
|
1
|
+
type StoryCheckpointAction = 'setup' | 'accept-setup' | 'handoff' | 'begin' | 'finalize' | 'recover' | 'retry-c01';
|
|
2
2
|
interface StoryCheckpointCliOptions {
|
|
3
3
|
readonly action: StoryCheckpointAction;
|
|
4
4
|
readonly storyId: string;
|
|
@@ -9,6 +9,8 @@ interface StoryCheckpointCliOptions {
|
|
|
9
9
|
readonly format: 'json' | 'plain';
|
|
10
10
|
readonly setupHandoffSessionId?: string;
|
|
11
11
|
readonly setupHandoffTokenFile?: string;
|
|
12
|
+
readonly expectedHeadSha?: string;
|
|
13
|
+
readonly apply?: boolean;
|
|
12
14
|
}
|
|
13
15
|
export declare function parseStoryCheckpointArgs(args: readonly string[]): StoryCheckpointCliOptions;
|
|
14
16
|
export declare function storyCheckpointCliHandler(args: readonly string[]): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readFile as
|
|
1
|
+
import{readFile as w}from"node:fs/promises";import{resolve as m}from"node:path";import{acceptDirectYoloSetupCheckpoint as k,beginDirectYoloStoryCommit as g,finalizeDirectYoloStoryCheckpoint as v,issueDirectYoloSetupLeaseHandoff as S,prepareDirectYoloSetup as E,recoverLegacyDirectYoloStoryCheckpoint as H}from"../git/direct-yolo-checkpoint.js";import{applyDirectYoloC01Retry as j,inspectDirectYoloC01Retry as C}from"../git/direct-yolo-c01-retry.js";function x(a){const e=a[0];if(e!=="setup"&&e!=="accept-setup"&&e!=="handoff"&&e!=="begin"&&e!=="finalize"&&e!=="recover"&&e!=="retry-c01")throw new Error("story-checkpoint-action-invalid");let i="",r=process.cwd(),t,l="origin",s=!1,y="plain",f,p,h,d=!1;for(let u=1;u<a.length;u++){const o=a[u],n=()=>a[++u]??"";if(o==="--story")i=n();else if(o.startsWith("--story="))i=o.slice(8);else if(o==="--project-root")r=n()||r;else if(o.startsWith("--project-root="))r=o.slice(15);else if(o==="--commit")t=n();else if(o.startsWith("--commit="))t=o.slice(9);else if(o==="--remote")l=n();else if(o.startsWith("--remote="))l=o.slice(9);else if(o==="--push"||o==="--require-remote")s=!0;else if(o==="--setup-handoff-session")f=n();else if(o.startsWith("--setup-handoff-session="))f=o.slice(24);else if(o==="--setup-handoff-token-file")p=n();else if(o.startsWith("--setup-handoff-token-file="))p=o.slice(27);else if(o==="--expected-head")h=n();else if(o.startsWith("--expected-head="))h=o.slice(16);else if(o==="--apply")d=!0;else if(o==="--format"){const c=n();if(c!=="json"&&c!=="plain")throw new Error("story-checkpoint-format-invalid");y=c}else if(o.startsWith("--format=")){const c=o.slice(9);if(c!=="json"&&c!=="plain")throw new Error("story-checkpoint-format-invalid");y=c}else throw new Error("story-checkpoint-argument-invalid")}if(!i)throw new Error("story-checkpoint-story-required");if(e==="recover"&&!t)throw new Error("story-checkpoint-commit-required");if(e==="recover"&&!s)throw new Error("story-checkpoint-remote-proof-required");if(e==="finalize"&&!s)throw new Error("story-checkpoint-push-required");if(e==="begin"&&(t||s||l!=="origin"))throw new Error("story-checkpoint-option-invalid");if((e==="setup"||e==="accept-setup"||e==="handoff")&&(t||s||l!=="origin"))throw new Error("story-checkpoint-option-invalid");if(e==="finalize"&&t)throw new Error("story-checkpoint-option-invalid");if(f===void 0!=(p===void 0))throw new Error("story-checkpoint-setup-handoff-incomplete");if(e!=="begin"&&(f||p))throw new Error("story-checkpoint-option-invalid");if(e!=="retry-c01"&&(h||d))throw new Error("story-checkpoint-option-invalid");if(e==="retry-c01"&&(t||s||l!=="origin"||d&&!/^[a-f0-9]{40,64}$/.test(h??"")))throw new Error("story-checkpoint-option-invalid");return{action:e,storyId:i,projectRoot:m(r),commitSha:t,remote:l,push:s,format:y,...h?{expectedHeadSha:h}:{},...d?{apply:d}:{},...f?{setupHandoffSessionId:f}:{},...p?{setupHandoffTokenFile:m(p)}:{}}}async function I(a){let e;try{e=x(a)}catch(t){return console.error(t instanceof Error?t.message:"story-checkpoint-arguments-invalid"),1}if(e.action==="retry-c01")try{const t=e.apply?await j(e.projectRoot,e.storyId,e.expectedHeadSha):await C(e.projectRoot,e.storyId);return console.log(e.format==="json"?JSON.stringify(t,null,2):`story-checkpoint retry-c01: ${e.apply?"committed":"eligible"}`),0}catch(t){return console.error(t instanceof Error?t.message:"direct-yolo-retry-unverified"),1}let i;if(e.setupHandoffSessionId&&e.setupHandoffTokenFile)try{i={sessionId:e.setupHandoffSessionId,token:(await w(e.setupHandoffTokenFile,"utf8")).trim()}}catch{return console.error("story-checkpoint-setup-handoff-read-failed"),1}const r=e.action==="setup"?await E(e):e.action==="accept-setup"?await k(e):e.action==="handoff"?await S(e):e.action==="begin"?await g({...e,...i?{setupLeaseHandoff:i}:{}}):e.action==="finalize"?await v(e):await H({...e,commitSha:e.commitSha});if(e.format==="json")console.log(JSON.stringify({action:e.action,...r},null,2));else if(r.ok)if(console.log(`story-checkpoint ${e.action}: ok`),e.action==="begin"&&"trailers"in r.value)for(const t of r.value.trailers)console.log(t);else"headSha"in r.value&&console.log(`head=${r.value.headSha}`);else console.error(`story-checkpoint ${e.action}: ${r.reasonCode}`);return r.ok?0:1}export{x as parseStoryCheckpointArgs,I as storyCheckpointCliHandler};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Buffer as J}from"node:buffer";import{createHash as M}from"node:crypto";import{chmodSync as z,closeSync as ge,existsSync as te,mkdirSync as ae,openSync as Ae,readSync as xe}from"node:fs";import{dirname as re,join as se}from"node:path";import{INITIAL_CONTINUITY_SQLITE_MIGRATION as Re}from"./migrations/001-initial-schema.js";import{PROCESSING_OUTPUT_SUMMARY_SQLITE_MIGRATION as Oe}from"./migrations/002-processing-output-summary-indexes.js";import{HEADLESS_EXECUTION_ATTEMPTS_SQLITE_MIGRATION as Ne}from"./migrations/003-headless-execution-attempts.js";import{OUTBOX_DELIVERY_STATE_SQLITE_MIGRATION as Te}from"./migrations/004-outbox-delivery-state.js";import{BOUNDED_HEADLESS_QUEUE_SQLITE_MIGRATION as Le}from"./migrations/005-bounded-headless-queue.js";import{NATIVE_AGENT_DISPATCHES_SQLITE_MIGRATION as ve}from"./migrations/006-native-agent-dispatches.js";import{NATIVE_AGENT_TERMINAL_STATES as oe,isNativeAgentDispatchReceiptV1 as X,isNativeAgentStateTransitionAllowed as je,isNativeDispatchBindingV1 as Me,isNativeHostAttestationV1 as ke}from"./native-agent-types.js";import{CONTINUITY_QUEUE_REASON_CODES as k,CONTINUITY_RECEIPT_COMPACTION_EVENT_TYPE as W,CONTINUITY_RECEIPT_RETENTION_REASON_CODES as F,DEFAULT_CONTINUITY_QUEUE_POLICY as De,computeContinuityQueueRetryAt as Ue,computeContinuityOutboxFailureDecision as we,normalizeContinuityQueuePolicy as B,normalizeContinuityQueuePriority as qe,normalizeContinuityQueueScope as Pe,normalizeContinuityRetentionPolicy as He}from"./outbox.js";const ne=".neocortex/continuity",We="continuity.sqlite",kt=6,Fe=5e3,O="processing_output_summary",Be=2e3,de=20,$e=100,ie="Install the optional Enterprise continuity SQLite adapter with `npm install --workspace packages/client better-sqlite3 --include=optional` or reinstall Neocortex with optional dependencies enabled.",Ye=Object.freeze(["discover_more","create_epic","run_yoloop","run_yolo","run_verifier","run_review_gate","compact_context","wait_external","backoff","waiting_human","complete","abort","scheduled","running","overlap_skipped","missed_run_catchup","completed","aborted","cancelled","blocked","draft","planned"]),ce=20,Ke=new Set(Ye),Ve=/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d{1,6})?)?(?:Z|[+-]\d{2}:?\d{2})?$/;function le(a){return typeof a=="string"&&Ke.has(a)}function ue(a){if(typeof a!="string")return;const e=a.trim();if(!(e.length===0||e.length>40)&&Ve.test(e))return e}function Ge(a){if(!Array.isArray(a))return[];const e=[];for(const t of a){if(!E(t)||!le(t.stage))continue;const r=ue(t.at);r&&e.push({stage:t.stage,at:r})}return e.slice(-ce)}function Qe(a){if(!(typeof a!="number"||!Number.isFinite(a)||a<0))return Math.floor(a)}class i extends Error{code;reasonCode;guidance;mutationBlocked;cause;constructor(e,t,r={}){super(t),this.name="ContinuitySqliteStoreError",this.code=e,this.reasonCode=e,this.guidance=r.guidance,this.cause=r.cause,this.mutationBlocked=r.mutationBlocked??e==="sqlite-integrity-failed"}}function $(a){const e=Object.freeze({schemaVersion:1,storyId:a.story_id,graphRevision:a.graph_revision,dispatchKey:a.dispatch_key,profile:a.profile,parentHandle:a.parent_handle,handle:a.handle,topology:a.topology,state:a.state,requestedAt:a.requested_at,observedAt:a.observed_at,terminalAt:a.terminal_at,freshness:a.freshness,observationSource:a.observation_source,reasonCode:a.reason_code,revision:a.revision,publicSafe:!0});if(!X(e))throw new i("sqlite-integrity-failed","Native-agent receipt failed its closed public contract.",{mutationBlocked:!0});return e}const Je=[Re,Oe,Ne,Te,Le,ve],ze=Object.freeze(["continuity_migrations","jobs","job_leases","job_events","job_receipts","goal_campaigns","goal_ledger_items","goal_verifiers","goal_review_gates","loop_jobs","artifacts","state_snapshots","headless_execution_attempts","runner_config","outbox","native_agent_dispatches","native_agent_observations"]),_e=/(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,me=/(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?|outputs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|prompt[_ -]?(?:body|text)|workflow body|step body|\bargv\b|(?:bash|sh|zsh|powershell|pwsh)\s+-c\b|(?:\.{0,2}\/|[A-Za-z]:\\|\/)[^\s]*(?:\.exe|\.bat|\.cmd|\.ps1|\.sh|\/bin\/[^\s]+)|\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS|P180[_-]?SYNTHETIC[_-]?CONTINUITY|P185[_-]?SYNTHETIC[_-]?CONTINUITY|P187[_-]?SYNTHETIC[_-]?(?:CONTINUITY|RUNNER|WATCH)|P190[_-]?SYNTHETIC[_-]?(?:HEADLESS|CONTINUITY)|P192[_-]?SYNTHETIC[_-]?(?:PORTAL|RUNNER|SYNC))/i,Xe=new Set(["unsafe_key","raw_log","prompt_body","private_url","local_absolute_path","secret","protected_field","unbounded_text","unbounded_number","unknown_required_operation","missing"]),Ze=/(corrupt|malformed|not a database|file is not a database|database disk image is malformed)/i,et=/(foreign key constraint failed|SQLITE_CONSTRAINT_FOREIGNKEY)/i,Z="p185:v1:",tt=new Set(["schemaVersion","contractVersion","eventType","executionId","jobId","operationId","idempotencyKey","goalId","loopId","campaignId","itemId","ledgerItemIds","verifierId","verifierIds","gateId","reviewGateIds","runnerId","leaseId","status","reasonCode","reasonCodes","runtimeId","modelId","runtimeSource","headlessRuntime","headlessModel","headlessRuntimeReasonCode","originRuntime","originModel","targetRef","attemptId","attemptStatus","directiveHash","timeoutMs","leaseExpiresAt","heartbeatAt","notBeforeAt","maxAttempts","counts","hashes","relativePaths","artifactRefs","evidenceRefs","validationRefs","registryRefs","storyIds","epicIds","debtIds","iteration","currentStage","stageHistory","durationMs","retryCount","attemptCount","queuePriority","queueScope","queueCap","queueDepth","queueAvailable","queueBackpressure","nextTickAt","nextAttemptAt","nextRetryAt","deadLetterReasonCode","deliveryCursor","lastAttemptAt","sentAt","ackedAt","lastErrorReason","lastErrorSummary","deadLetterSummary","deadLetteredAt","processingOutputSource","publicSummary","redactionEvidence","selectorKind","targetId","targetJobId","relatedJobIds","serverAccessToLocalhost","serverHeldStream","initialCursor","targetResolutionState","targetKind","relatedJobCount","snapshotStatus","snapshotGeneratedAt","renderedSummaryCount","cursorState","currentCursor","nextCursor","cursorAdvanced","eventId","latestEventId","watchStatus","stopReason","syncVersion","transportKind","envelopeId","workspaceId","workspaceLabel","projectId","projectLabel","snapshotId","syncCursor","previousSyncCursor","nextSyncCursor","commandId","receiptId","acknowledgedAt","observedAt","generatedAt","syncStatus","commandStatus","receiptStatus","actorType","actorId","tenantId","commandKind","auditStatus","redactionCount","autonomousGovernance","governanceVersion","governanceEvidence","governanceSource","publicSafe"]),at=new Set(["foreground_invoke","scheduled_tick","runner_tick","manual_tick","headless_execution","jobs_command","invoke_watch","portal_render"]);function rt(a){return import(a)}function st(a){return`sha256:${M("sha256").update(a).digest("hex")}`}function E(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function ot(a){return a instanceof Error?a.message:String(a)}function nt(a){return E(a)&&typeof a.code=="string"?a.code:void 0}function m(a,e){if(a instanceof i)return a;const t=ot(a),r=nt(a);return r==="SQLITE_CORRUPT"||r==="SQLITE_NOTADB"||Ze.test(t)?new i("sqlite-integrity-failed","Continuity SQLite integrity check failed; durable mutation is blocked until the store is repaired or rebuilt.",{cause:a,mutationBlocked:!0}):r==="SQLITE_CONSTRAINT_FOREIGNKEY"||et.test(t)?new i("sqlite-foreign-key-failed","Continuity SQLite foreign-key validation failed; mutation was rejected.",{cause:a}):new i(e,t,{cause:a})}function g(a,e){if(typeof a=="string"){if(/\.(?:redactionEvidence|redactionSummary)\[\d+\]\.field$/.test(e)&&/^[A-Za-z0-9_.:[\]-]{1,120}$/.test(a)||/\.(?:redactionEvidence|redactionSummary)\[\d+\]\.reason$/.test(e)&&Xe.has(a))return;if(me.test(a))throw new i("sqlite-public-safety-rejected",`Continuity SQLite metadata rejected unsafe value at ${e}.`);return}if(!(a===null||typeof a=="number"||typeof a=="boolean")){if(Array.isArray(a)){a.forEach((t,r)=>g(t,`${e}[${r}]`));return}if(E(a)){for(const[t,r]of Object.entries(a)){if(_e.test(t))throw new i("sqlite-public-safety-rejected",`Continuity SQLite metadata rejected unsafe key at ${e}.${t}.`);g(r,`${e}.${t}`)}return}throw new i("sqlite-public-safety-rejected",`Continuity SQLite metadata rejected unsupported value at ${e}.`)}}function b(a,e){if(a!==void 0&&me.test(a))throw new i("sqlite-public-safety-rejected",`Continuity SQLite text rejected unsafe value at ${e}.`)}function Y(a,e,t=240){if(a.trim().length===0)throw new i("sqlite-public-safety-rejected",`Continuity SQLite processing summary text is required at ${e}.`);if(b(a,e),a.length>t)throw new i("sqlite-public-safety-rejected",`Continuity SQLite processing summary text exceeded the public bound at ${e}.`)}function K(a){const e={};if(!a)return e;for(const[t,r]of Object.entries(a))if(tt.has(t)&&!_e.test(t))try{g(r,`metadata.${t}`),e[t]=r}catch{}return e}function dt(a){const e={...K(a.metadata),schemaVersion:1,contractVersion:"continuity-v1",eventType:O,executionId:a.executionId,jobId:a.jobId,operationId:a.executionId,publicSummary:a.publicSummary};return a.idempotencyKey&&(e.idempotencyKey=a.idempotencyKey),a.goalId&&(e.goalId=a.goalId),a.loopId&&(e.loopId=a.loopId),a.reasonCode&&(e.reasonCode=a.reasonCode),a.source&&at.has(a.source)&&(e.processingOutputSource=a.source),K(e)}function ye(a){const e=Math.floor(a??de);return Number.isFinite(e)?Math.max(1,Math.min($e,e)):de}function it(a){if(a.eventId&&a.eventId.trim().length>0)return a.eventId;const e=a.executionId.replace(/[^a-z0-9_.:-]+/gi,"-").replace(/^-+|-+$/g,"");return e.length>0?`event-processing-summary-${e.slice(0,160)}`:`event-processing-summary-${M("sha256").update(a.executionId).digest("hex").slice(0,32)}`}function ct(a){return`${Z}${J.from(JSON.stringify([a.created_at,a.event_id]),"utf8").toString("base64url")}`}function lt(a){if(a?.startsWith(Z))try{const e=a.slice(Z.length),t=JSON.parse(J.from(e,"base64url").toString("utf8"));if(!Array.isArray(t)||t.length!==2)return;const[r,s]=t;return typeof r!="string"||typeof s!="string"?void 0:{createdAt:r,eventId:s}}catch{return}}function D(a,e){if(!e)return;const t=e.trim().replace(/^@/,"");if(a==="job"&&/^job-J\d{3,}$/i.test(t))return`job-J${t.match(/\d+$/)?.[0]??""}`;if(a==="goal"&&/^goal-G\d{3,}$/i.test(t))return`goal-G${t.match(/\d+$/)?.[0]??""}`;if(a==="loop"&&/^loop-L\d{3,}$/i.test(t))return`loop-L${t.match(/\d+$/)?.[0]??""}`}function he(a){return a?q(a.map(e=>D("job",e)).filter(e=>!!e)):[]}function pe(a){const e=a.target;if(!e){const r=D("job",a.jobId);return r?{sql:" AND job_id = ?",params:[r]}:{sql:"",params:[]}}const t=e.selectorKind;if(t==="job"){const r=D("job",e.jobId??e.targetId??a.jobId);return r?{sql:" AND job_id = ?",params:[r]}:{sql:" AND 1 = 0",params:[]}}if(t==="goal"){const r=D("goal",e.goalId??e.targetId);if(!r)return{sql:" AND 1 = 0",params:[]};const s=he(e.relatedJobIds);return{sql:` AND (job_id = ? OR json_extract(metadata_json, '$.goalId') = ?${s.length>0?` OR job_id IN (${s.map(()=>"?").join(", ")})`:""})`,params:[r,r,...s]}}if(t==="loop"){const r=D("loop",e.loopId??e.targetId);if(!r)return{sql:" AND 1 = 0",params:[]};const s=he(e.relatedJobIds);return{sql:` AND (job_id = ? OR json_extract(metadata_json, '$.loopId') = ?${s.length>0?` OR job_id IN (${s.map(()=>"?").join(", ")})`:""})`,params:[r,r,...s]}}return{sql:" AND 1 = 0",params:[]}}function be(a){const e={event_id:a.event_id,job_id:a.job_id,execution_id:a.operation_id,public_summary:a.summary,reason_code:a.reason_code,created_at:a.created_at,metadata_json:a.metadata_json};return{...e,cursor:ct(e)}}function S(a){return a?(g(a,"metadata"),JSON.stringify(a)):null}function ut(a,e,t){const r=d=>`sha256:${M("sha256").update(d.map(o=>[o.id,o.status,o.reasonCode].join(":")).sort().join(`
|
|
1
|
+
import{Buffer as J}from"node:buffer";import{createHash as M}from"node:crypto";import{chmodSync as z,closeSync as ge,existsSync as te,mkdirSync as ae,openSync as Ae,readSync as xe}from"node:fs";import{dirname as re,join as se}from"node:path";import{INITIAL_CONTINUITY_SQLITE_MIGRATION as Re}from"./migrations/001-initial-schema.js";import{PROCESSING_OUTPUT_SUMMARY_SQLITE_MIGRATION as Oe}from"./migrations/002-processing-output-summary-indexes.js";import{HEADLESS_EXECUTION_ATTEMPTS_SQLITE_MIGRATION as Ne}from"./migrations/003-headless-execution-attempts.js";import{OUTBOX_DELIVERY_STATE_SQLITE_MIGRATION as Te}from"./migrations/004-outbox-delivery-state.js";import{BOUNDED_HEADLESS_QUEUE_SQLITE_MIGRATION as Le}from"./migrations/005-bounded-headless-queue.js";import{NATIVE_AGENT_DISPATCHES_SQLITE_MIGRATION as ve}from"./migrations/006-native-agent-dispatches.js";import{NATIVE_AGENT_TERMINAL_STATES as oe,isNativeAgentDispatchReceiptV1 as X,isNativeAgentStateTransitionAllowed as je,isNativeDispatchBindingV1 as Me,isNativeHostAttestationV1 as ke}from"./native-agent-types.js";import{CONTINUITY_QUEUE_REASON_CODES as k,CONTINUITY_RECEIPT_COMPACTION_EVENT_TYPE as W,CONTINUITY_RECEIPT_RETENTION_REASON_CODES as F,DEFAULT_CONTINUITY_QUEUE_POLICY as De,computeContinuityQueueRetryAt as Ue,computeContinuityOutboxFailureDecision as we,normalizeContinuityQueuePolicy as B,normalizeContinuityQueuePriority as qe,normalizeContinuityQueueScope as Pe,normalizeContinuityRetentionPolicy as He}from"./outbox.js";const ne=".neocortex/continuity",We="continuity.sqlite",kt=6,Fe=5e3,O="processing_output_summary",Be=2e3,de=20,$e=100,ie="Install the optional Enterprise continuity SQLite adapter with `npm install --workspace packages/client better-sqlite3 --include=optional` or reinstall Neocortex with optional dependencies enabled.",Ye=Object.freeze(["discover_more","create_epic","run_yoloop","run_yolo","run_verifier","run_review_gate","compact_context","wait_external","backoff","waiting_human","complete","abort","scheduled","running","overlap_skipped","missed_run_catchup","completed","aborted","cancelled","blocked","draft","planned"]),ce=20,Ke=new Set(Ye),Ve=/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d{1,6})?)?(?:Z|[+-]\d{2}:?\d{2})?$/;function le(a){return typeof a=="string"&&Ke.has(a)}function ue(a){if(typeof a!="string")return;const e=a.trim();if(!(e.length===0||e.length>40)&&Ve.test(e))return e}function Ge(a){if(!Array.isArray(a))return[];const e=[];for(const t of a){if(!E(t)||!le(t.stage))continue;const r=ue(t.at);r&&e.push({stage:t.stage,at:r})}return e.slice(-ce)}function Qe(a){if(!(typeof a!="number"||!Number.isFinite(a)||a<0))return Math.floor(a)}class i extends Error{code;reasonCode;guidance;mutationBlocked;cause;constructor(e,t,r={}){super(t),this.name="ContinuitySqliteStoreError",this.code=e,this.reasonCode=e,this.guidance=r.guidance,this.cause=r.cause,this.mutationBlocked=r.mutationBlocked??e==="sqlite-integrity-failed"}}function $(a){const e=Object.freeze({schemaVersion:1,storyId:a.story_id,graphRevision:a.graph_revision,dispatchKey:a.dispatch_key,profile:a.profile,parentHandle:a.parent_handle,handle:a.handle,topology:a.topology,state:a.state,requestedAt:a.requested_at,observedAt:a.observed_at,terminalAt:a.terminal_at,freshness:a.freshness,observationSource:a.observation_source,reasonCode:a.reason_code,revision:a.revision,publicSafe:!0});if(!X(e))throw new i("sqlite-integrity-failed","Native-agent receipt failed its closed public contract.",{mutationBlocked:!0});return e}const Je=[Re,Oe,Ne,Te,Le,ve],ze=Object.freeze(["continuity_migrations","jobs","job_leases","job_events","job_receipts","goal_campaigns","goal_ledger_items","goal_verifiers","goal_review_gates","loop_jobs","artifacts","state_snapshots","headless_execution_attempts","runner_config","outbox","native_agent_dispatches","native_agent_observations"]),_e=/(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,me=/(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?|outputs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|prompt[_ -]?(?:body|text)|workflow body|step body|\bargv\b|(?:bash|sh|zsh|powershell|pwsh)\s+-c\b|(?:\.{0,2}\/|[A-Za-z]:\\|\/)[^\s]*(?:\.exe|\.bat|\.cmd|\.ps1|\.sh|\/bin\/[^\s]+)|\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS|P180[_-]?SYNTHETIC[_-]?CONTINUITY|P185[_-]?SYNTHETIC[_-]?CONTINUITY|P187[_-]?SYNTHETIC[_-]?(?:CONTINUITY|RUNNER|WATCH)|P190[_-]?SYNTHETIC[_-]?(?:HEADLESS|CONTINUITY)|P192[_-]?SYNTHETIC[_-]?(?:PORTAL|RUNNER|SYNC))/i,Xe=new Set(["unsafe_key","raw_log","prompt_body","private_url","local_absolute_path","secret","protected_field","unbounded_text","unbounded_number","unknown_required_operation","missing"]),Ze=/(corrupt|malformed|not a database|file is not a database|database disk image is malformed)/i,et=/(foreign key constraint failed|SQLITE_CONSTRAINT_FOREIGNKEY)/i,Z="p185:v1:",tt=new Set(["schemaVersion","contractVersion","eventType","executionId","jobId","operationId","idempotencyKey","goalId","loopId","campaignId","itemId","ledgerItemIds","verifierId","verifierIds","gateId","reviewGateIds","runnerId","leaseId","status","reasonCode","reasonCodes","runtimeId","modelId","runtimeSource","headlessRuntime","headlessModel","headlessRuntimeReasonCode","originRuntime","originModel","targetRef","attemptId","attemptStatus","terminalClass","releaseBlocked","directiveHash","timeoutMs","leaseExpiresAt","heartbeatAt","notBeforeAt","maxAttempts","counts","hashes","relativePaths","artifactRefs","evidenceRefs","validationRefs","registryRefs","storyIds","epicIds","debtIds","iteration","currentStage","stageHistory","durationMs","retryCount","attemptCount","queuePriority","queueScope","queueCap","queueDepth","queueAvailable","queueBackpressure","nextTickAt","nextAttemptAt","nextRetryAt","deadLetterReasonCode","deliveryCursor","lastAttemptAt","sentAt","ackedAt","lastErrorReason","lastErrorSummary","deadLetterSummary","deadLetteredAt","processingOutputSource","publicSummary","redactionEvidence","selectorKind","targetId","targetJobId","relatedJobIds","serverAccessToLocalhost","serverHeldStream","initialCursor","targetResolutionState","targetKind","relatedJobCount","snapshotStatus","snapshotGeneratedAt","renderedSummaryCount","cursorState","currentCursor","nextCursor","cursorAdvanced","eventId","latestEventId","watchStatus","stopReason","syncVersion","transportKind","envelopeId","workspaceId","workspaceLabel","projectId","projectLabel","snapshotId","syncCursor","previousSyncCursor","nextSyncCursor","commandId","receiptId","acknowledgedAt","observedAt","generatedAt","syncStatus","commandStatus","receiptStatus","actorType","actorId","tenantId","commandKind","auditStatus","redactionCount","autonomousGovernance","governanceVersion","governanceEvidence","governanceSource","publicSafe"]),at=new Set(["foreground_invoke","scheduled_tick","runner_tick","manual_tick","headless_execution","jobs_command","invoke_watch","portal_render"]);function rt(a){return import(a)}function st(a){return`sha256:${M("sha256").update(a).digest("hex")}`}function E(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function ot(a){return a instanceof Error?a.message:String(a)}function nt(a){return E(a)&&typeof a.code=="string"?a.code:void 0}function m(a,e){if(a instanceof i)return a;const t=ot(a),r=nt(a);return r==="SQLITE_CORRUPT"||r==="SQLITE_NOTADB"||Ze.test(t)?new i("sqlite-integrity-failed","Continuity SQLite integrity check failed; durable mutation is blocked until the store is repaired or rebuilt.",{cause:a,mutationBlocked:!0}):r==="SQLITE_CONSTRAINT_FOREIGNKEY"||et.test(t)?new i("sqlite-foreign-key-failed","Continuity SQLite foreign-key validation failed; mutation was rejected.",{cause:a}):new i(e,t,{cause:a})}function g(a,e){if(typeof a=="string"){if(/\.(?:redactionEvidence|redactionSummary)\[\d+\]\.field$/.test(e)&&/^[A-Za-z0-9_.:[\]-]{1,120}$/.test(a)||/\.(?:redactionEvidence|redactionSummary)\[\d+\]\.reason$/.test(e)&&Xe.has(a))return;if(me.test(a))throw new i("sqlite-public-safety-rejected",`Continuity SQLite metadata rejected unsafe value at ${e}.`);return}if(!(a===null||typeof a=="number"||typeof a=="boolean")){if(Array.isArray(a)){a.forEach((t,r)=>g(t,`${e}[${r}]`));return}if(E(a)){for(const[t,r]of Object.entries(a)){const s=t==="terminationToken"&&e.endsWith(".releaseBlocked")&&r==="[YOLOOP_RELEASE_BLOCKED]";if(_e.test(t)&&!s)throw new i("sqlite-public-safety-rejected",`Continuity SQLite metadata rejected unsafe key at ${e}.${t}.`);g(r,`${e}.${t}`)}return}throw new i("sqlite-public-safety-rejected",`Continuity SQLite metadata rejected unsupported value at ${e}.`)}}function b(a,e){if(a!==void 0&&me.test(a))throw new i("sqlite-public-safety-rejected",`Continuity SQLite text rejected unsafe value at ${e}.`)}function Y(a,e,t=240){if(a.trim().length===0)throw new i("sqlite-public-safety-rejected",`Continuity SQLite processing summary text is required at ${e}.`);if(b(a,e),a.length>t)throw new i("sqlite-public-safety-rejected",`Continuity SQLite processing summary text exceeded the public bound at ${e}.`)}function K(a){const e={};if(!a)return e;for(const[t,r]of Object.entries(a))if(tt.has(t)&&!_e.test(t))try{g(r,`metadata.${t}`),e[t]=r}catch{}return e}function dt(a){const e={...K(a.metadata),schemaVersion:1,contractVersion:"continuity-v1",eventType:O,executionId:a.executionId,jobId:a.jobId,operationId:a.executionId,publicSummary:a.publicSummary};return a.idempotencyKey&&(e.idempotencyKey=a.idempotencyKey),a.goalId&&(e.goalId=a.goalId),a.loopId&&(e.loopId=a.loopId),a.reasonCode&&(e.reasonCode=a.reasonCode),a.source&&at.has(a.source)&&(e.processingOutputSource=a.source),K(e)}function ye(a){const e=Math.floor(a??de);return Number.isFinite(e)?Math.max(1,Math.min($e,e)):de}function it(a){if(a.eventId&&a.eventId.trim().length>0)return a.eventId;const e=a.executionId.replace(/[^a-z0-9_.:-]+/gi,"-").replace(/^-+|-+$/g,"");return e.length>0?`event-processing-summary-${e.slice(0,160)}`:`event-processing-summary-${M("sha256").update(a.executionId).digest("hex").slice(0,32)}`}function ct(a){return`${Z}${J.from(JSON.stringify([a.created_at,a.event_id]),"utf8").toString("base64url")}`}function lt(a){if(a?.startsWith(Z))try{const e=a.slice(Z.length),t=JSON.parse(J.from(e,"base64url").toString("utf8"));if(!Array.isArray(t)||t.length!==2)return;const[r,s]=t;return typeof r!="string"||typeof s!="string"?void 0:{createdAt:r,eventId:s}}catch{return}}function D(a,e){if(!e)return;const t=e.trim().replace(/^@/,"");if(a==="job"&&/^job-J\d{3,}$/i.test(t))return`job-J${t.match(/\d+$/)?.[0]??""}`;if(a==="goal"&&/^goal-G\d{3,}$/i.test(t))return`goal-G${t.match(/\d+$/)?.[0]??""}`;if(a==="loop"&&/^loop-L\d{3,}$/i.test(t))return`loop-L${t.match(/\d+$/)?.[0]??""}`}function he(a){return a?q(a.map(e=>D("job",e)).filter(e=>!!e)):[]}function pe(a){const e=a.target;if(!e){const r=D("job",a.jobId);return r?{sql:" AND job_id = ?",params:[r]}:{sql:"",params:[]}}const t=e.selectorKind;if(t==="job"){const r=D("job",e.jobId??e.targetId??a.jobId);return r?{sql:" AND job_id = ?",params:[r]}:{sql:" AND 1 = 0",params:[]}}if(t==="goal"){const r=D("goal",e.goalId??e.targetId);if(!r)return{sql:" AND 1 = 0",params:[]};const s=he(e.relatedJobIds);return{sql:` AND (job_id = ? OR json_extract(metadata_json, '$.goalId') = ?${s.length>0?` OR job_id IN (${s.map(()=>"?").join(", ")})`:""})`,params:[r,r,...s]}}if(t==="loop"){const r=D("loop",e.loopId??e.targetId);if(!r)return{sql:" AND 1 = 0",params:[]};const s=he(e.relatedJobIds);return{sql:` AND (job_id = ? OR json_extract(metadata_json, '$.loopId') = ?${s.length>0?` OR job_id IN (${s.map(()=>"?").join(", ")})`:""})`,params:[r,r,...s]}}return{sql:" AND 1 = 0",params:[]}}function be(a){const e={event_id:a.event_id,job_id:a.job_id,execution_id:a.operation_id,public_summary:a.summary,reason_code:a.reason_code,created_at:a.created_at,metadata_json:a.metadata_json};return{...e,cursor:ct(e)}}function S(a){return a?(g(a,"metadata"),JSON.stringify(a)):null}function ut(a,e,t){const r=d=>`sha256:${M("sha256").update(d.map(o=>[o.id,o.status,o.reasonCode].join(":")).sort().join(`
|
|
2
2
|
`)).digest("hex")}`,s=r(e),n=r(t);return{receipts:s,outputs:n,aggregate:`sha256:${M("sha256").update(`${a}:${s}:${n}`).digest("hex")}`}}function _t(a){if(!a)return{};try{const e=JSON.parse(a);return E(e)?{...e}:{}}catch{return{}}}function c(a,e,t,r=!1){if(a===void 0){if(r)throw new i("sqlite-public-safety-rejected",`Continuity SQLite text is required at ${e}.`);return}if(b(a,e),a.trim().length===0||a.length>t)throw new i("sqlite-public-safety-rejected",`Continuity SQLite text exceeded the public bound at ${e}.`)}function N(a,e){if(a!==void 0&&(!Number.isFinite(a)||a<0||Math.floor(a)!==a))throw new i("sqlite-public-safety-rejected",`Continuity SQLite numeric value rejected at ${e}.`)}function v(a){c(a.outboxId,"outbox.outboxId",160,!0),c(a.jobId,"outbox.jobId",160),c(a.operationId,"outbox.operationId",160),c(a.idempotencyKey,"outbox.idempotencyKey",160),c(a.type,"outbox.type",80),c(a.status,"outbox.status",40),c(a.deliveryCursor,"outbox.deliveryCursor",200),c(a.timestamp,"outbox.timestamp",80),c(a.reasonCode,"outbox.reasonCode",100),c(a.summary,"outbox.summary",240)}function Ie(a){return a==="pending"||a==="sent"||a==="acked"||a==="failed"||a==="dead_letter"}function mt(a){return typeof a=="string"&&Ie(a)?a:"failed"}function h(a){return typeof a=="string"&&a.length>0?a:void 0}function yt(a){if(typeof a!="string"||a.trim().length===0)return{};try{const e=JSON.parse(a);return E(e)?(g(e,"outbox.payload"),e):{}}catch{return{}}}function ht(a){return{outboxId:String(a.outbox_id??""),...h(a.job_id)?{jobId:h(a.job_id)}:{},operationId:String(a.operation_id??""),...h(a.idempotency_key)?{idempotencyKey:h(a.idempotency_key)}:{},type:String(a.type??""),status:mt(a.status),payload:yt(a.payload_json),retryCount:typeof a.retry_count=="number"?a.retry_count:0,attemptCount:typeof a.attempt_count=="number"?a.attempt_count:0,...h(a.delivery_cursor)?{deliveryCursor:h(a.delivery_cursor)}:{},...h(a.next_attempt_at)?{nextAttemptAt:h(a.next_attempt_at)}:{},...h(a.last_attempt_at)?{lastAttemptAt:h(a.last_attempt_at)}:{},...h(a.sent_at)?{sentAt:h(a.sent_at)}:{},...h(a.acked_at)?{ackedAt:h(a.acked_at)}:{},...h(a.last_error_code)?{lastErrorCode:h(a.last_error_code)}:{},...h(a.last_error_reason)?{lastErrorReason:h(a.last_error_reason)}:{},...h(a.last_error_summary)?{lastErrorSummary:h(a.last_error_summary)}:{},...h(a.dead_letter_summary)?{deadLetterSummary:h(a.dead_letter_summary)}:{},...h(a.dead_lettered_at)?{deadLetteredAt:h(a.dead_lettered_at)}:{},createdAt:String(a.created_at??""),updatedAt:String(a.updated_at??""),publicSafe:!0}}function C(a){return{...a,publicSafe:!0}}function T(a,e){return a===void 0?null:(g(a,e),JSON.stringify(a))}function U(a){if(!a)return;const e=q(a.map(t=>t.replace(/\\/g,"/"))).filter(t=>t.length>0).slice(0,50);for(const[t,r]of e.entries()){c(r,`relativePaths[${t}]`,240,!0);const s=r.split("/").filter(Boolean);if(r.startsWith("/")||r.startsWith("~")||r.includes("://")||/^[A-Za-z]:\//.test(r)||s.includes(".."))throw new i("sqlite-public-safety-rejected",`Continuity SQLite rejected non-relative path at relativePaths[${t}].`)}return e}function V(a){const e={...K(a.metadata),schemaVersion:1,contractVersion:"continuity-v1",attemptId:a.attemptId,executionId:a.executionId,jobId:a.jobId};return a.directiveHash&&(e.directiveHash=a.directiveHash),a.runtimeId&&(e.runtimeId=a.runtimeId),a.modelId&&(e.modelId=a.modelId),a.runtimeSource&&(e.runtimeSource=a.runtimeSource),a.status&&(e.attemptStatus=a.status),a.reasonCode&&(e.reasonCode=a.reasonCode),a.durationMs!==void 0&&(e.durationMs=a.durationMs),a.retryCount!==void 0&&(e.retryCount=a.retryCount),a.attemptCount!==void 0&&(e.attemptCount=a.attemptCount),a.maxAttempts!==void 0&&(e.maxAttempts=a.maxAttempts),a.queuePriority!==void 0&&(e.queuePriority=a.queuePriority),a.queueScope&&(e.queueScope=a.queueScope),a.nextRetryAt&&(e.nextRetryAt=a.nextRetryAt),a.deadLetterReasonCode&&(e.deadLetterReasonCode=a.deadLetterReasonCode),a.counts&&(e.counts=a.counts),a.hashes&&(e.hashes=a.hashes),a.redactionSummary&&(e.redactionEvidence=a.redactionSummary),a.relativePaths&&(e.relativePaths=U(a.relativePaths)),K(e)}function L(a){c(a.attemptId,"headless_execution.attemptId",160,!0),c(a.executionId,"headless_execution.executionId",160,!0),c(a.jobId,"headless_execution.jobId",160,!0),c(a.directiveHash,"headless_execution.directiveHash",160),c(a.targetRef,"headless_execution.targetRef",240),c(a.storyId,"headless_execution.storyId",120),c(a.epicId,"headless_execution.epicId",120),c(a.runtimeId,"headless_execution.runtimeId",80),c(a.modelId,"headless_execution.modelId",120),c(a.runtimeSource,"headless_execution.runtimeSource",40),c(a.reasonCode,"headless_execution.reasonCode",100),c(a.publicSummary,"headless_execution.publicSummary",240),c(a.leaseId,"headless_execution.leaseId",160),c(a.runnerId,"headless_execution.runnerId",160),c(a.timestamp,"headless_execution.timestamp",80)}function w(a){if(Array.isArray(a)){const e=a[0];return E(e)?Object.values(e)[0]:e}return E(a)?Object.values(a)[0]:a}function pt(a){return ze.includes(a)}function q(a){return Array.from(new Set(a))}function bt(a){const e=E(a)&&"default"in a?a.default:a;if(typeof e!="function")throw new i("sqlite-adapter-unavailable","Optional better-sqlite3 adapter did not export a database constructor.",{guidance:ie});const t=e;return{adapterName:"better-sqlite3",open(r,s){return new t(r,s)}}}async function It(a=rt){try{const e=await a("better-sqlite3");return{ok:!0,adapter:bt(e)}}catch(e){return e instanceof i?{ok:!1,error:e}:{ok:!1,error:new i("sqlite-adapter-unavailable","Optional Enterprise continuity SQLite adapter better-sqlite3 is unavailable.",{cause:e,guidance:ie})}}}function Ee(a){return se(a,ne,We)}function Et(a){const e=se(a,ne);ae(e,{recursive:!0,mode:448});try{z(e,448)}catch{}return e}async function Dt(a){const e=a.adapter??await Ce(a.adapterLoader),t=a.filePath??Ee(a.projectRoot);if(a.strictReadOnly)fe(t);else if(a.filePath){ae(re(t),{recursive:!0,mode:448});try{z(re(t),448)}catch{}}else Et(a.projectRoot);let r;try{r=e.open(t,a.strictReadOnly?{fileMustExist:!0,readonly:!0}:void 0)}catch(n){throw m(n,"sqlite-integrity-failed")}const s=new ft({db:r,filePath:t,adapterName:e.adapterName,busyTimeoutMs:a.busyTimeoutMs??Fe,integrityCheck:a.integrityCheck??!0,now:a.now??(()=>new Date().toISOString())});try{if(a.strictReadOnly)return s.runIntegrityCheck(),s.getSchemaVersion(),s;if(s.initialize(),te(t))try{z(t,384)}catch{}return s}catch(n){try{r.close()}catch{}throw n}}function fe(a){if(!te(a))throw new i("sqlite-integrity-failed","Continuity database is unavailable for physical read-only inspection.",{mutationBlocked:!0});let e;try{const t=Ae(a,"r");try{if(e=J.alloc(20),xe(t,e,0,e.length,0)<e.length)throw new Error("short-header")}finally{ge(t)}}catch(t){throw new i("sqlite-integrity-failed","Continuity database header could not be inspected read-only.",{cause:t,mutationBlocked:!0})}if(e.subarray(0,16).toString("ascii")!=="SQLite format 3\0"||e[18]===2||e[19]===2)throw new i("sqlite-integrity-failed","Continuity database requires an unsafe WAL read profile.",{mutationBlocked:!0})}async function Ut(a){const e=Ee(a.projectRoot);fe(e);const t=a.adapter??await Ce(a.adapterLoader);let r;try{r=t.open(e,{fileMustExist:!0,readonly:!0});const n=w(r.pragma("integrity_check",{simple:!0}));if(String(n).toLowerCase()!=="ok")throw new Error("integrity")}catch(n){throw new i("sqlite-integrity-failed","Continuity database failed physical read-only inspection.",{cause:n,mutationBlocked:!0})}const s=n=>{const d=n.trim().replace(/^\(+/u,"").toLowerCase();if(!/^(select|with\s)/u.test(d)||/\b(insert|update|delete|replace|create|alter|drop|pragma|attach|detach|vacuum|reindex)\b/u.test(d))throw new i("sqlite-mutation-blocked","Statement is not in the physical read-only query profile.",{mutationBlocked:!0})};return Object.freeze({filePath:e,adapterName:t.adapterName,all(n,...d){return s(n),r.prepare(n).all(...d)},get(n,...d){return s(n),r.prepare(n).get(...d)},close(){r.close()}})}async function Ce(a){const e=a?await a():await It();if(!e.ok)throw e.error;return e.adapter}class ft{filePath;adapterName;db;busyTimeoutMs;integrityCheck;now;mutationBlocked=!1;constructor(e){this.db=e.db,this.filePath=e.filePath,this.adapterName=e.adapterName,this.busyTimeoutMs=e.busyTimeoutMs,this.integrityCheck=e.integrityCheck,this.now=e.now}initialize(){try{this.configureConnection(),this.integrityCheck&&this.runIntegrityCheck(),this.ensureMigrationTable(),this.applyMigrations(),this.integrityCheck&&this.runIntegrityCheck()}catch(e){throw m(e,"sqlite-migration-failed")}}close(){this.db.close()}pragmaValue(e){return w(this.db.pragma(e,{simple:!0}))}runIntegrityCheck(){try{if(String(w(this.db.pragma("integrity_check",{simple:!0}))??"").toLowerCase()!=="ok")throw this.mutationBlocked=!0,new i("sqlite-integrity-failed","Continuity SQLite integrity check failed; durable mutation is blocked until the store is repaired or rebuilt.",{mutationBlocked:!0})}catch(e){throw this.mutationBlocked=!0,m(e,"sqlite-integrity-failed")}}getSchemaVersion(){const e=this.db.prepare("SELECT COALESCE(MAX(version), 0) AS version FROM continuity_migrations").get();return E(e)&&typeof e.version=="number"?e.version:0}countRows(e){if(!pt(e))throw new i("sqlite-public-safety-rejected","Unknown continuity table name.");const t=this.db.prepare(`SELECT COUNT(*) AS count FROM ${e}`).get();return E(t)&&typeof t.count=="number"?t.count:0}reserveNativeAgentDispatch(e){if(this.assertCanMutate(),!Me(e.binding)||!ke(e.hostAttestation))throw new i("sqlite-public-safety-rejected","Native-agent reservation rejected invalid binding or host evidence.");const t={schemaVersion:1,storyId:e.binding.storyId,graphRevision:e.binding.graphRevision.replace(/^sha256:/,"").toLowerCase(),dispatchKey:e.binding.dispatchKey.toLowerCase(),profile:"neocortex",parentHandle:null,handle:null,topology:e.topology??"native-agent",state:"requested",requestedAt:e.requestedAt,observedAt:null,terminalAt:null,freshness:"unknown",observationSource:"local-reservation",reasonCode:e.reasonCode??"native-agent-dispatch-reserved",revision:0,publicSafe:!0};if(!X(t))throw new i("sqlite-public-safety-rejected","Native-agent reservation rejected unsafe public fields.");try{return this.runInTransaction(()=>{const r=this.db.prepare(`
|
|
3
3
|
INSERT OR IGNORE INTO native_agent_dispatches (
|
|
4
4
|
dispatch_key, story_id, graph_revision, profile,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface DirectYoloC01RetryPlan {
|
|
2
|
+
readonly schemaVersion: 1;
|
|
3
|
+
readonly kind: 'direct-yolo-c01-retry-plan';
|
|
4
|
+
readonly storyId: string;
|
|
5
|
+
readonly epicId: string;
|
|
6
|
+
readonly executionBranch: string;
|
|
7
|
+
readonly previousHeadSha: string;
|
|
8
|
+
readonly previousStateSha256: string;
|
|
9
|
+
readonly runtimeRevision: number;
|
|
10
|
+
readonly previousStatus: 'create-tasks';
|
|
11
|
+
readonly previousStepsCompleted: readonly string[];
|
|
12
|
+
readonly auditPath: string;
|
|
13
|
+
readonly publicSafe: true;
|
|
14
|
+
}
|
|
15
|
+
/** No mutation: require missing private session, expired lease, clean Git, and exact C01-C05 progress. */
|
|
16
|
+
export declare function inspectDirectYoloC01Retry(projectRoot: string, storyId: string): Promise<DirectYoloC01RetryPlan>;
|
|
17
|
+
/** Commit a new C01 attempt; the prior progress stays reachable in the parent commit. */
|
|
18
|
+
export declare function applyDirectYoloC01Retry(projectRoot: string, storyId: string, expectedHeadSha: string): Promise<{
|
|
19
|
+
readonly plan: DirectYoloC01RetryPlan;
|
|
20
|
+
readonly newHeadSha: string;
|
|
21
|
+
}>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{execFileSync as H}from"node:child_process";import{createHash as P,randomBytes as R}from"node:crypto";import{existsSync as k,readFileSync as E,writeFileSync as D}from"node:fs";import{join as u,resolve as O}from"node:path";import{acquireGitLifecyclePhysicalIntegrationLock as C,assertGitLifecyclePrivateFile as j,ensureGitLifecyclePrivateChildDirectory as L,gitLifecycleRuntimeDirectory as G,readGitLifecycleRuntime as N,releaseGitLifecyclePhysicalIntegrationLock as T}from"./git-lifecycle-store.js";const _=["809db253d486b5d2620d318666219e8a2b4df05016174ba3c8a33fa17b65802a","50224b193dae7ba2a066e54f7091d2656302b849ea7a145a3a4c556d85f3fe3c","f757f6bf1182f23e5d7acbe47cbce9f0fa12f211d290b486892c6722bc42b4e8","9cd927d02ff5979b5077e75b09cb34be275eca0e1c955403235b9ba0fb7a55eb","a3f880e8d5bca9158a88c46f88754c0948237a3e8516c83a762ba1ee22c27d46"];function i(n,r){const o={...process.env};for(const e of["GIT_DIR","GIT_WORK_TREE","GIT_INDEX_FILE","GIT_COMMON_DIR","GIT_NAMESPACE"])delete o[e];return H("git",[...r],{cwd:n,env:o,encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:3e4,maxBuffer:16*1024*1024}).trim()}function y(n){return P("sha256").update(n).digest("hex")}function c(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}async function $(n,r){const o=O(n);if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(r))throw new Error("direct-yolo-retry-story-invalid");const e=r.split(".")[0],f=i(o,["rev-parse","HEAD"]),s=i(o,["symbolic-ref","--quiet","--short","HEAD"]);if(i(o,["status","--porcelain=v1","--untracked-files=all"]))throw new Error("direct-yolo-retry-checkout-dirty");const t=E(u(o,".neocortex/state.json"),"utf8"),m=c(JSON.parse(t)),a=c(c(m?.stories)?.[r]),d=c(c(m?.epics)?.[e]);if(!a||!d||a.epic_id!==e||d.branch_mode!=="epic"||d.execution_branch!==s||s!==`epic/${e}`)throw new Error("direct-yolo-retry-story-binding-invalid");const p=a.steps_completed;if(a.status!=="create-tasks"||typeof a.last_step!="string"||y(a.last_step)!==_.at(-1)||a.branch_name!==s||!Array.isArray(p)||p.length!==_.length||p.some((S,v)=>typeof S!="string"||y(S)!==_[v])||a.checkpoint||a.pr_number)throw new Error("direct-yolo-retry-progress-ineligible");const h=await N(o,{required:!0}),w=c(h.epics[e]),b=c(w?.branch_lease),l=c(w?.origin_binding);if(c(h.stories[r])&&Object.keys(c(h.stories[r])).length>0||!l||l.executionBranch!==s||typeof l.originHeadSha!="string"||!/^[a-f0-9]{40,64}$/.test(l.originHeadSha)||b&&(!Number.isFinite(Date.parse(String(b.expiresAt)))||Date.parse(String(b.expiresAt))>Date.now()))throw new Error("direct-yolo-retry-runtime-active");i(o,["merge-base","--is-ancestor",String(l.originHeadSha),f]);const g=await L(await G(o),"private-execution"),A=y(r);for(const S of[`session-${A}.json`,`baseline-${A}.json`]){const v=u(g,S);if(k(v))throw await j(v,g),new Error("direct-yolo-retry-private-evidence-present")}const x=`.neocortex/recovery/${r}-c01-${y(`${f}\0${y(t)}`).slice(0,16)}.json`;if(k(u(o,x)))throw new Error("direct-yolo-retry-already-recorded");if(i(o,["rev-parse","HEAD"])!==f||E(u(o,".neocortex/state.json"),"utf8")!==t)throw new Error("direct-yolo-retry-preflight-raced");return Object.freeze({schemaVersion:1,kind:"direct-yolo-c01-retry-plan",storyId:r,epicId:e,executionBranch:s,previousHeadSha:f,previousStateSha256:y(t),runtimeRevision:h.revision,previousStatus:"create-tasks",previousStepsCompleted:[...p],auditPath:x,publicSafe:!0})}async function q(n,r,o){const e=O(n),f=`retry-${R(16).toString("hex")}`,s=await C(e,{kind:"direct",storyId:r,sessionId:f,idempotencyKey:f,expiresAt:new Date(Date.now()+5*6e4).toISOString(),persistent:!1});if(!s.ok)throw new Error(s.reasonCode);try{const t=await $(e,r);if(t.previousHeadSha!==o)throw new Error("direct-yolo-retry-head-mismatch");const m=u(e,".neocortex/state.json"),a=JSON.parse(E(m,"utf8")),d=a.stories[r];d.status="backlog",d.steps_completed=[],d.last_step=null,d.branch_name=null;const p={...t,recordedAt:new Date().toISOString(),reason:"private-session-lost",newAttemptStatus:"backlog",oldProgressAcceptedForNewAttempt:!1};d.last_updated=p.recordedAt;const h=await $(e,r);if(JSON.stringify(h)!==JSON.stringify(t))throw new Error("direct-yolo-retry-apply-raced");if(i(e,["rev-parse","HEAD"])!==o||y(E(m,"utf8"))!==t.previousStateSha256||i(e,["status","--porcelain=v1","--untracked-files=all"]))throw new Error("direct-yolo-retry-apply-raced");const{mkdirSync:w}=await import("node:fs");if(w(u(e,".neocortex/recovery"),{recursive:!0}),D(u(e,t.auditPath),`${JSON.stringify(p,null,2)}
|
|
2
|
+
`,{flag:"wx"}),D(m,`${JSON.stringify(a,null,2)}
|
|
3
|
+
`),(await N(e,{required:!0})).revision!==t.runtimeRevision)throw new Error("direct-yolo-retry-runtime-raced");i(e,["add","--",".neocortex/state.json",t.auditPath]),i(e,["commit","-m",`chore(${r}): begin audited C01 retry`,"-m",`Neocortex-C01-Retry-From: ${t.previousHeadSha}`,"-m",`Neocortex-C01-Retry-Audit: ${t.auditPath}`]);const l=i(e,["rev-parse","HEAD"]),g=i(e,["diff-tree","--no-commit-id","--name-only","-r",l]).split(`
|
|
4
|
+
`).filter(Boolean).sort();if(i(e,["rev-parse",`${l}^`])!==t.previousHeadSha||JSON.stringify(g)!==JSON.stringify([".neocortex/state.json",t.auditPath].sort())||i(e,["status","--porcelain=v1","--untracked-files=all"]))throw new Error("direct-yolo-retry-postcommit-unverified");return{plan:t,newHeadSha:l}}finally{await T(s.path,s.owner).catch(()=>{})}}export{q as applyDirectYoloC01Retry,$ as inspectDirectYoloC01Retry};
|
|
@@ -73,10 +73,6 @@ export interface DirectYoloCheckpointOptions {
|
|
|
73
73
|
readonly beforeCheckpointPersist?: () => Promise<void>;
|
|
74
74
|
/** Test seam for crash-window reproduction after durable CAS and before release. */
|
|
75
75
|
readonly afterCheckpointPersist?: () => Promise<void>;
|
|
76
|
-
/** Test-only timing seam; production callers use the fixed 30-minute lease. */
|
|
77
|
-
readonly writerLeaseDurationMs?: number;
|
|
78
|
-
/** Test-only timing seam; production callers renew every five minutes. */
|
|
79
|
-
readonly writerLeaseHeartbeatIntervalMs?: number;
|
|
80
76
|
}
|
|
81
77
|
/**
|
|
82
78
|
* Productive P207 setup boundary. It owns only the current checkout and the
|
|
@@ -91,7 +87,7 @@ export declare function acceptDirectYoloSetupCheckpoint(options: Pick<DirectYolo
|
|
|
91
87
|
* one-time token never crosses stdout; only a public receipt is returned.
|
|
92
88
|
*/
|
|
93
89
|
export declare function issueDirectYoloSetupLeaseHandoff(options: Pick<DirectYoloCheckpointOptions, 'projectRoot' | 'storyId' | 'nowIso'>): Promise<DirectYoloCheckpointResult<DirectYoloSetupHandoffReceipt>>;
|
|
94
|
-
export declare function beginDirectYoloStoryCommit(options: Pick<DirectYoloCheckpointOptions, 'projectRoot' | 'storyId' | 'nowIso' | 'setupLeaseHandoff' | 'setupHandoffFault'
|
|
90
|
+
export declare function beginDirectYoloStoryCommit(options: Pick<DirectYoloCheckpointOptions, 'projectRoot' | 'storyId' | 'nowIso' | 'setupLeaseHandoff' | 'setupHandoffFault'>): Promise<DirectYoloCheckpointResult<DirectYoloCommitPlan>>;
|
|
95
91
|
export declare function finalizeDirectYoloStoryCheckpoint(options: DirectYoloCheckpointOptions): Promise<DirectYoloCheckpointResult<StoryCommitCheckpoint>>;
|
|
96
92
|
export declare function recoverLegacyDirectYoloStoryCheckpoint(options: DirectYoloCheckpointOptions & {
|
|
97
93
|
readonly commitSha: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{execFile as $e}from"node:child_process";import{createHash as ze,randomBytes as Re,timingSafeEqual as Ne}from"node:crypto";import{readFile as oe}from"node:fs/promises";import{join as he,resolve as ie}from"node:path";import{promisify as Me}from"node:util";import{readRootMemoryEffectForCheckpoint as We}from"../private-execution/root-memory-scope.js";import{rootMemoryEffectDigest as Ge,verifyRootMemoryPhysicalWriteSet as fe}from"../private-execution/root-memory-git-evidence.js";import{acquireGitLifecyclePhysicalIntegrationLock as V,applyGitLifecycleRuntimeOverlay as Te,computeImmutableStoryQaEvidenceDigest as Ke,computeGitLifecyclePhysicalIntegrationLockOwnerDigest as Se,computeP205StoryQaEvidenceDigest as Ve,computeLegacyDirectYoloRecoveryReceiptRef as Fe,ensureRuntimeEpic as W,ensureRuntimeStory as xe,ensureGitLifecyclePrivateChildDirectory as Ye,executeP205TransientAuthority as Je,projectP205TransientExecutionEvidence as Ze,publicStoryReviewArtifactFromGit as ne,LEGACY_DIRECT_YOLO_RECOVERY_COMMITS as Qe,mutateGitLifecycleRuntime as P,P205_COMPLETE_COMMAND as Ue,readGitLifecycleRuntime as q,gitLifecycleRuntimeDirectory as Xe,assertGitLifecyclePrivateFile as De,releaseGitLifecyclePhysicalIntegrationLock as G,releaseGitLifecyclePhysicalIntegrationLockForCheckpoint as et,renewGitLifecyclePhysicalIntegrationLock as tt,verifyGitLifecyclePhysicalIntegrationLock as J,verifyAcceptedGitLifecycleStoryCheckpoint as be}from"./git-lifecycle-store.js";import{anchoredAtomicWriteFile as rt}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as ot,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as ke,GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID as ae}from"./git-lifecycle-step-ids.js";const le=Me($e),it=1800*1e3,nt=300*1e3;async function Dt(e){try{const t=await je(e.projectRoot,e.storyId),r=T(e.nowIso),o=Date.parse(r),i=await p(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),n=await p(t.projectRoot,["rev-parse","HEAD"]),l=await q(t.projectRoot,{required:!0}),c=w(l.epics[t.epicId]),d=w(c?.branch_lease),a=d&&Number.isFinite(Date.parse(String(d.expiresAt)))&&Date.parse(String(d.expiresAt))>o;if(a&&d?.ownerStoryId!==e.storyId)return s("direct-yolo-writer-active");let h=Ie(c?.origin_binding,t.executionBranch,t.originBranch);if(i===t.executionBranch){if(!h)return s("direct-yolo-origin-binding-invalid")}else{if(i!==t.originBranch)return s("direct-yolo-current-branch-mismatch");if(h&&h.originHeadSha!==n)return s("direct-yolo-origin-binding-conflict");if(h??={schemaVersion:1,originBranch:t.originBranch,originHeadSha:n,executionBranch:t.executionBranch,capturedFromCurrentCheckout:!0,capturedAt:r},(await Pe(t.projectRoot)).some(m=>m.branch===t.executionBranch&&ie(m.path)!==t.projectRoot))return s("direct-yolo-execution-branch-checked-out-elsewhere");const S=await X(t.projectRoot),x=`refs/heads/${t.executionBranch}`;if(await C(t.projectRoot,["show-ref","--verify","--quiet",x])){const m=await p(t.projectRoot,["rev-parse",x]);if(m!==n){if(!await C(t.projectRoot,["merge-base","--is-ancestor",m,n]))return s("direct-yolo-execution-branch-diverged");await p(t.projectRoot,["update-ref",x,n,m])}await p(t.projectRoot,["switch",t.executionBranch])}else await p(t.projectRoot,["switch","-c",t.executionBranch]);if(await X(t.projectRoot)!==S)return s("direct-yolo-checkout-payload-raced")}const u=await p(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),f=await p(t.projectRoot,["rev-parse","HEAD"]);if(u!==t.executionBranch)return s("direct-yolo-current-branch-mismatch");if(a&&d?.ownerStoryId===e.storyId)return d.setupHeadSha!==f?s("direct-yolo-setup-lease-head-unbound"):{ok:!0,value:ve(t,h,String(d.expiresAt),!0)};const v=r,b=new Date(o+3600*1e3).toISOString(),I=`setup-${Re(32).toString("hex")}`,R=await q(t.projectRoot,{required:!0});return await P(t.projectRoot,k=>{const S=W(k,t.epicId),x=w(S.branch_lease);if(x&&Date.parse(String(x.expiresAt))>o&&x.ownerStoryId!==e.storyId)throw new Error("direct-yolo-writer-active");const m=Ie(S.origin_binding,t.executionBranch,t.originBranch);if(S.origin_binding&&!m)throw new Error("direct-yolo-origin-binding-conflict");if(m&&JSON.stringify(m)!==JSON.stringify(h))throw new Error("direct-yolo-origin-binding-conflict");S.branch_mode="epic",S.execution_branch=t.executionBranch,S.origin_branch=t.originBranch,S.graph_revision=t.graphRevision,S.origin_binding=h,S.branch_lease={schemaVersion:1,ownerStoryId:e.storyId,sessionId:I,idempotencyKey:I,acquiredAt:v,expiresAt:b,setupHeadSha:f}},{expectedRevision:R.revision,preCommit:async()=>{if(await p(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==t.executionBranch||await p(t.projectRoot,["rev-parse","HEAD"])!==f)throw new Error("direct-yolo-setup-physical-state-raced")}}),{ok:!0,value:ve(t,h,b,!1)}}catch(t){return s(ee(t,"direct-yolo-setup-failed"))}}async function bt(e){let t;try{const r=await Z(e.projectRoot,e.storyId),o=T(e.nowIso),i=he(r.projectRoot,".neocortex/state.json"),n=await oe(i,"utf8"),l=await X(r.projectRoot),c=await p(r.projectRoot,["rev-parse","HEAD"]),d=`refs/heads/${r.executionBranch}`,a=await q(r.projectRoot,{required:!0}),h=w(a.epics[r.epicId]),u=Ie(h?.origin_binding,r.executionBranch,r.originBranch),f=w(h?.branch_lease);if(!u)return s("direct-yolo-origin-binding-invalid");if(!f||!ue(f,e.storyId,o)||f?.sessionId!==f?.idempotencyKey)return s("direct-yolo-setup-lease-invalid");const v=await V(r.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:String(f.sessionId),idempotencyKey:String(f.idempotencyKey),expiresAt:new Date(Date.now()+300*1e3).toISOString(),persistent:!1});if(!v.ok)return s(v.reasonCode);if(t=v,c!==f.setupHeadSha||!await C(r.projectRoot,["merge-base","--is-ancestor",u.originHeadSha,c])||await p(r.projectRoot,["rev-parse",d])!==c)return s("direct-yolo-setup-head-mismatch");if((await Pe(r.projectRoot)).some(m=>m.branch===r.executionBranch&&ie(m.path)!==r.projectRoot))return s("direct-yolo-execution-branch-checked-out-elsewhere");const I=w(JSON.parse(n)),R=w(w(I?.stories)?.[e.storyId]),k=w(a.stories[e.storyId]);if(!R||!["backlog","ready_to_start"].includes(String(R.status))||R.steps_completed!==void 0&&(!Array.isArray(R.steps_completed)||R.steps_completed.length>0)||R.branch_name||R.checkpoint)return s("direct-yolo-setup-story-progress-conflict");const S=k?.status==="branch-ready"&&k.last_step===ae&&Array.isArray(k.steps_completed)&&k.steps_completed.length===1&&k.steps_completed[0]===ae&&Object.keys(k).sort().join(",")==="last_step,status,steps_completed";if(k&&Object.keys(k).length>0&&!S)return s("direct-yolo-setup-story-progress-conflict");const x=async()=>{if(Date.parse(String(f.expiresAt))<=(e.nowIso?Date.parse(o):Date.now())||!t||!await J(t.path,t.owner)||await oe(i,"utf8")!==n||await X(r.projectRoot)!==l||await p(r.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==r.executionBranch||await p(r.projectRoot,["rev-parse","HEAD"])!==c||!await C(r.projectRoot,["merge-base","--is-ancestor",u.originHeadSha,c])||await p(r.projectRoot,["rev-parse",d])!==c)throw new Error("direct-yolo-setup-physical-state-raced")};return S?await x():await P(r.projectRoot,m=>{const g=w(m.epics[r.epicId]),D=xe(m,e.storyId);if(JSON.stringify(g?.branch_lease)!==JSON.stringify(f)||JSON.stringify(g?.origin_binding)!==JSON.stringify(u)||g?.graph_revision!==r.graphRevision||Object.keys(D).length>0)throw new Error("direct-yolo-setup-runtime-raced");D.status="branch-ready",D.last_step=ae,D.steps_completed=[ae]},{expectedRevision:a.revision,preCommit:x}),{ok:!0,value:Object.freeze({...ve(r,u,String(f.expiresAt),S),checkpointAccepted:!0,graphRevision:r.graphRevision,headSha:c})}}catch(r){return s(ee(r,"direct-yolo-setup-acceptance-failed"))}finally{t&&await G(t.path,t.owner).catch(()=>{})}}async function kt(e){try{const t=await Z(e.projectRoot,e.storyId),r=$(await E(t.projectRoot,["diff","--cached","--name-only","-z"])),o=Q(r,t.authorizedWriteSet,e.storyId,t.rootMemoryEffect);if(!o.ok)return s(o.reasonCode);if(t.rootMemoryEffect&&fe(t.projectRoot,t.rootMemoryEffect,{storyId:e.storyId,executionBranch:t.executionBranch,baseSha:await p(t.projectRoot,["rev-parse","HEAD"]),headRef:":",childPaths:t.authorizedWriteSet}),ne(t.projectRoot,e.storyId,":")?.verdict!=="approved")return s("direct-yolo-review-artifact-not-approved");if($(await E(t.projectRoot,["diff","--name-only","-z"])).some(y=>r.includes(y)))return s("direct-yolo-user-overlap");const l=await E(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!l)return s("direct-yolo-staged-diff-empty");const c=j(l),d=j([...t.authorizedWriteSet].sort().join("\0")),a=T(e.nowIso),h=await q(t.projectRoot,{required:!0}),u=w(h.epics[t.epicId]?.branch_lease);if(!ue(u,e.storyId,a))return s("direct-yolo-setup-handoff-owner-invalid");const f=String(u.sessionId),v=String(u.expiresAt),b=new Date(Math.min(Date.parse(v),Date.parse(a)+300*1e3)).toISOString(),I=await F(t.projectRoot,e.storyId),R=I?.state==="issued"&&I.fromSessionId===f&&I.bundleDigest===c&&I.claimRevision===d&&Date.parse(I.expiresAt)>Date.parse(a),k=R?I.expiresAt:b,S=R?I.token:Re(32).toString("base64url"),x=j(S),m=Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff",storyId:e.storyId,fromSessionId:f,tokenDigest:x,bundleDigest:c,claimRevision:d,expiresAt:k}),g=j(JSON.stringify(m)),D=await V(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:f,idempotencyKey:f,expiresAt:k,persistent:!1,createdAt:a});if(!D.ok)return s(D.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{await ye(t.projectRoot,{schemaVersion:1,kind:"direct-yolo-setup-handoff-token",state:"issued",storyId:e.storyId,fromSessionId:f,token:S,tokenDigest:x,bundleDigest:c,claimRevision:d,grantDigest:g,expiresAt:k}),await P(t.projectRoot,y=>{const A=w(W(y,t.epicId).branch_lease);if(!ue(A,e.storyId,a)||A?.sessionId!==f||A.idempotencyKey!==f)throw new Error("direct-yolo-setup-handoff-owner-raced");A.handoffGrant=m},{expectedRevision:h.revision,preCommit:async()=>{if(!await J(D.path,D.owner))throw new Error("direct-yolo-integration-lock-raced");const y=await F(t.projectRoot,e.storyId);if(!y||y.state!=="issued"||y.grantDigest!==g||y.tokenDigest!==x)throw new Error("direct-yolo-setup-handoff-token-raced")}})}finally{await G(D.path,D.owner).catch(()=>{})}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff-receipt",storyId:e.storyId,sessionId:f,bundleDigest:c,claimRevision:d,grantDigest:g,expiresAt:k,reused:R,publicSafe:!0})}}catch(t){return s(t instanceof Error&&/^direct-yolo-/.test(t.message)?t.message:"direct-yolo-setup-handoff-failed")}}async function jt(e){try{const t=await Z(e.projectRoot,e.storyId),r=await p(t.projectRoot,["rev-parse","HEAD"]),o=$(await E(t.projectRoot,["diff","--cached","--name-only","-z"])),i=Q(o,t.authorizedWriteSet,e.storyId,t.rootMemoryEffect);if(!i.ok)return s(i.reasonCode);t.rootMemoryEffect&&fe(t.projectRoot,t.rootMemoryEffect,{storyId:e.storyId,executionBranch:t.executionBranch,baseSha:r,headRef:":",childPaths:t.authorizedWriteSet});const n=ne(t.projectRoot,e.storyId,":");if(n?.verdict!=="approved")return s("direct-yolo-review-artifact-not-approved");if($(await E(t.projectRoot,["diff","--name-only","-z"])).some(g=>o.includes(g)))return s("direct-yolo-user-overlap");const c=await E(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!c)return s("direct-yolo-staged-diff-empty");const d=j(c),a=j([...t.authorizedWriteSet].sort().join("\0")),h=j(["direct-yolo-commit-v1",e.storyId,t.epicId,t.executionBranch,r,d,t.graphRevision,a].join("\0")),u=T(e.nowIso);let f=e.setupLeaseHandoff??await at(t.projectRoot,e.storyId,d,a,u);const v=await q(t.projectRoot,{required:!0}),b=w(v.epics[t.epicId]?.branch_lease),I=b?.ownerStoryId===e.storyId&&b.sessionId===h&&b.idempotencyKey===h&&typeof b.expiresAt=="string"&&Date.parse(b.expiresAt)>Date.parse(u)?b:void 0;if(I&&e.setupLeaseHandoff)return s("direct-yolo-setup-handoff-replayed");const R=w(I?.handoffConsumption);if(R){const g=await F(t.projectRoot,e.storyId);if(!g||!["consuming","consumed"].includes(g.state)||g.fromSessionId!==R.fromSessionId||g.tokenDigest!==R.tokenDigest||g.bundleDigest!==d||g.claimRevision!==a||R.bundleDigest!==d||R.claimRevision!==a||g.consumedBySessionId!==h||R.consumedBySessionId!==h)return s("direct-yolo-setup-handoff-consume-invalid");if(g.state==="consuming"){if(!g.token||j(g.token)!==g.tokenDigest)return s("direct-yolo-setup-handoff-consume-invalid");f={sessionId:g.fromSessionId,token:g.token}}}const k=Le(e.writerLeaseDurationMs),S=I?String(I.expiresAt):new Date(Date.parse(u)+k).toISOString(),x=await V(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:h,idempotencyKey:h,expiresAt:S,persistent:!0,createdAt:I&&typeof I.acquiredAt=="string"?I.acquiredAt:u});if(!x.ok)return s(x.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{f&&e.setupLeaseHandoff===void 0&&(await ct(t.projectRoot,e.storyId,f.sessionId,f.token,h,u),await e.setupHandoffFault?.("after-consuming-persisted")),await P(t.projectRoot,g=>{const D=W(g,t.epicId),y=w(D.branch_lease),A=y&&Date.parse(String(y.expiresAt))>Date.parse(u),Y=y?.ownerStoryId===e.storyId&&y.sessionId===h&&y.idempotencyKey===h,K=y?.ownerStoryId===e.storyId&&y.sessionId===y.idempotencyKey&&typeof y.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(y.idempotencyKey),z=A&&K&&dt({current:y,handoff:f,storyId:e.storyId,bundleDigest:d,claimRevision:a,nowIso:u});if(f&&A&&!Y&&!z)throw new Error("direct-yolo-setup-handoff-invalid");if(A&&!Y&&!z)throw new Error("direct-yolo-writer-active");const B=z?w(y?.handoffGrant):void 0,H=B?{schemaVersion:1,kind:"direct-yolo-setup-handoff-consumption",state:"consumed",storyId:e.storyId,fromSessionId:String(y?.sessionId),tokenDigest:String(B.tokenDigest),bundleDigest:d,claimRevision:a,consumedBySessionId:h,consumedAt:u}:void 0;D.branch_mode="epic",D.execution_branch=t.executionBranch,D.origin_branch=t.originBranch,D.graph_revision=t.graphRevision,D.branch_lease=A&&Y?y:{schemaVersion:1,ownerStoryId:e.storyId,sessionId:h,idempotencyKey:h,acquiredAt:u,expiresAt:S,...H?{handoffConsumption:H}:{}}},{expectedRevision:v.revision,preCommit:async()=>{if(!await J(x.path,x.owner))throw new Error("direct-yolo-integration-lock-raced")}})}catch(g){throw await G(x.path,x.owner).catch(()=>{}),g}f&&e.setupLeaseHandoff===void 0&&(await e.setupHandoffFault?.("before-consumed-persist"),await st(t.projectRoot,t.epicId,e.storyId,f.sessionId,f.token,d,a,h,u));const m=Object.freeze([`Neocortex-Story: ${e.storyId}`,`Neocortex-Epic: ${t.epicId}`,`Neocortex-Execution-Branch: ${t.executionBranch}`,`Neocortex-Prepared-Base: ${r}`,`Neocortex-Bundle-Digest: ${d}`,`Neocortex-Review-Artifact-Digest: ${n.digest}`,`Neocortex-Graph-Revision: ${t.graphRevision}`,`Neocortex-Claim-Revision: ${a}`,...t.rootMemoryEffect?[`Neocortex-Root-Memory-Effect: ${Ge(t.rootMemoryEffect)}`]:[]]);return{ok:!0,value:Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:r,bundleDigest:d,reviewArtifactDigest:n.digest,graphRevision:t.graphRevision,claimRevision:a,idempotencyKey:h,changedPaths:Object.freeze(o),trailers:m})}}catch(t){return s(ee(t,"direct-yolo-begin-failed"))}}async function Et(e){let t,r,o;try{const i=await Z(e.projectRoot,e.storyId);t=i;const n=await p(i.projectRoot,["rev-parse","HEAD"]);let l=await q(i.projectRoot,{required:!0});const c=w(l.stories[e.storyId]?.checkpoint);if(c){const L=typeof c.headSha=="string"?c.headSha:"",N=typeof c.graphRevision=="string"?c.graphRevision:"",O=/^[a-f0-9]{40,64}$/.test(L)?$(await E(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",L])):[],M=Q(O,i.authorizedWriteSet,e.storyId,i.rootMemoryEffect);if(!(/^[a-f0-9]{40,64}$/.test(L)&&await C(i.projectRoot,["merge-base","--is-ancestor",L,n]))||!/^[a-f0-9]{64}$/.test(N)||!M.ok)return s("direct-yolo-replay-invalid");const re=await ge(e,i.projectRoot,n,N);if(!await be(i.projectRoot,c,e.storyId,i.epicId,i.executionBranch,re.transientAuthority,i.authorizedWriteSet))return s("direct-yolo-replay-invalid");if(!await we(i.projectRoot,i.executionBranch,n,O))return s("direct-yolo-replay-head-raced");if(e.push&&!await Be(i.projectRoot,e.remote??"origin",i.executionBranch,L))return s("direct-yolo-remote-head-mismatch");const de=Array.isArray(c.receiptRefs)?c.receiptRefs.find(_=>typeof _=="string"&&/^physical-lock-owner:[a-f0-9]{64}$/.test(_)):void 0;return de&&typeof c.idempotencyKey=="string"&&await et(i.projectRoot,{storyId:e.storyId,idempotencyKey:c.idempotencyKey,ownerDigest:de.slice(20)}),{ok:!0,value:c}}const d=n,a=await p(i.projectRoot,["rev-parse",`${d}^`]),h=await E(i.projectRoot,["show","--no-patch","--format=%B",d]),u=$(await E(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",d])),f=Q(u,i.authorizedWriteSet,e.storyId,i.rootMemoryEffect);if(!f.ok)return s(f.reasonCode);i.rootMemoryEffect&&fe(i.projectRoot,i.rootMemoryEffect,{storyId:e.storyId,executionBranch:i.executionBranch,baseSha:a,headRef:d,childPaths:i.authorizedWriteSet});const v=U(h,"Neocortex-Bundle-Digest"),b=U(h,"Neocortex-Graph-Revision"),I=U(h,"Neocortex-Claim-Revision"),R=new Map([["Neocortex-Story",e.storyId],["Neocortex-Epic",i.epicId],["Neocortex-Execution-Branch",i.executionBranch],["Neocortex-Prepared-Base",a],["Neocortex-Graph-Revision",i.graphRevision],["Neocortex-Claim-Revision",j([...i.authorizedWriteSet].sort().join("\0"))]]);if(!v||!/^[a-f0-9]{64}$/.test(v)||!b||!I||[...R].some(([L,N])=>U(h,L)!==N))return s("direct-yolo-trailers-invalid");const k=ne(i.projectRoot,e.storyId,d);if(k?.verdict!=="approved")return s("direct-yolo-review-artifact-not-approved");const S=U(h,"Neocortex-Review-Artifact-Digest");if(S!==void 0&&S!==k.digest)return s("direct-yolo-review-artifact-digest-mismatch");const x=j(await E(i.projectRoot,["diff","--binary","--full-index",`${a}..${d}`]));if(v!==x)return s("direct-yolo-bundle-digest-mismatch");const m=j(["direct-yolo-commit-v1",e.storyId,i.epicId,i.executionBranch,a,v,b,I].join("\0")),g=w(l.epics[i.epicId]?.branch_lease),D=T(e.nowIso),y=g?.ownerStoryId===e.storyId&&g.idempotencyKey===m&&g.sessionId===m&&Date.parse(String(g.expiresAt))>Date.now()?g:void 0;if(g&&Date.parse(String(g.expiresAt))>Date.now()&&!y)return s("direct-yolo-writer-active");const A=Le(e.writerLeaseDurationMs),Y=ft(e.writerLeaseHeartbeatIntervalMs,A),K=y??{schemaVersion:1,ownerStoryId:e.storyId,sessionId:m,idempotencyKey:m,acquiredAt:D,expiresAt:new Date(Date.parse(D)+A).toISOString()},z=await V(i.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:m,idempotencyKey:m,expiresAt:String(K.expiresAt),persistent:!0,createdAt:String(K.acquiredAt)});if(!z.ok)return s(z.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");let B={path:z.path,owner:z.owner};o=B,y||(l=(await P(i.projectRoot,N=>{const O=W(N,i.epicId),M=w(O.branch_lease);if(M&&Date.parse(String(M.expiresAt))>Date.parse(D))throw new Error("direct-yolo-writer-active");if(O.graph_revision!==i.graphRevision)throw new Error("direct-yolo-graph-revision-raced");O.branch_lease=K},{expectedRevision:l.revision})).document);let H=K;r=H;{const L=await He({projectRoot:i.projectRoot,epicId:i.epicId,storyId:e.storyId,graphRevision:i.graphRevision,leaseDurationMs:A,state:{runtime:l,lease:H,physical:B}});l=L.runtime,H=L.lease,B=L.physical,r=H,o=B;const N=lt({projectRoot:i.projectRoot,epicId:i.epicId,storyId:e.storyId,graphRevision:i.graphRevision,leaseDurationMs:A,heartbeatIntervalMs:Y,state:{runtime:l,lease:H,physical:B},onRenewed:_=>{l=_.runtime,H=_.lease,B=_.physical,r=H,o=B}});let O,M;try{O=await ge(e,i.projectRoot,d,i.graphRevision)}catch(_){M=_}let te;try{await N.stop()}catch(_){te=_}if(M)throw M;if(te)throw te;if(!O)throw new Error("direct-yolo-qa-evidence-missing");if(!await we(i.projectRoot,i.executionBranch,d,u))return s("direct-yolo-head-raced");if(e.push){const _=se(e.remote??"origin");if(await p(i.projectRoot,["push",_,i.executionBranch]),!await Oe(i.projectRoot,_,i.executionBranch,d))return s("direct-yolo-remote-head-mismatch")}const re=await Ee({projectRoot:i.projectRoot,storyId:e.storyId,epicId:i.epicId,executionBranch:i.executionBranch,baseSha:a,headSha:d,bundleDigest:v,graphRevision:b,claimRevision:I,idempotencyKey:m,qaExecution:O,physicalLockOwnerDigest:Se(B.owner),nowIso:T(e.nowIso),legacyReceiptRef:void 0,rootMemoryEffect:i.rootMemoryEffect});return await e.beforeCheckpointPersist?.(),await Ae({projectRoot:i.projectRoot,checkpoint:re,remote:e.push?e.remote??"origin":void 0,expectedRevision:l.revision,expectedLease:H,expectedGraphRevision:i.graphRevision,physicalLockPath:B.path,physicalLockOwner:B.owner,transientAuthority:O.transientAuthority,authorizedWriteSet:i.authorizedWriteSet})?(await e.afterCheckpointPersist?.(),{ok:!0,value:re}):s("direct-yolo-checkpoint-persist-failed")}}catch(i){return s(ee(i,"direct-yolo-finalize-failed"))}finally{o&&await G(o.path,o.owner).catch(()=>{}),t&&r?await pe(t.projectRoot,t.epicId,r).catch(()=>{}):t&&await ut(t,e.storyId).catch(()=>{})}}async function At(e){try{const t=await Z(e.projectRoot,e.storyId);if(!/^[a-f0-9]{40,64}$/.test(e.commitSha))return s("direct-yolo-recovery-commit-invalid");const r=await p(t.projectRoot,["rev-parse",e.commitSha]);if(Qe[e.storyId]!==r)return s("direct-yolo-recovery-not-allowlisted");if(await p(t.projectRoot,["rev-parse","HEAD"])!==r)return s("direct-yolo-recovery-head-mismatch");await p(t.projectRoot,["merge-base","--is-ancestor",r,`refs/heads/${t.executionBranch}`]);const o=await p(t.projectRoot,["rev-parse",`${r}^`]),i=await E(t.projectRoot,["diff","--binary","--full-index",`${o}..${r}`]),n=$(await E(t.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",r]));if(!Q(n,t.authorizedWriteSet.length>0?t.authorizedWriteSet:n,e.storyId).ok)return s("direct-yolo-recovery-write-set-invalid");const c=j(i),d=j([...n].sort().join("\0")),a=j(["legacy-direct-yolo-recovery-v1",e.storyId,r].join("\0")),h=T(e.nowIso),u=new Date(Date.parse(h)+1800*1e3).toISOString(),f=await q(t.projectRoot,{required:!0}),v=await V(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:a,idempotencyKey:a,expiresAt:u,persistent:!0,createdAt:h});if(!v.ok)return s(v.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-recovery-integration-backpressure":"direct-yolo-recovery-integration-lock-failed");const b={schemaVersion:1,ownerStoryId:e.storyId,sessionId:a,idempotencyKey:a,acquiredAt:h,expiresAt:u};let I=!1;try{const R=await P(t.projectRoot,D=>{const y=W(D,t.epicId),A=w(y.branch_lease);if(A&&Date.parse(String(A.expiresAt))>Date.parse(h)&&!ce(A,b))throw new Error("direct-yolo-recovery-writer-active");if(y.graph_revision!==t.graphRevision)throw new Error("direct-yolo-recovery-graph-raced");y.branch_mode="epic",y.execution_branch=t.executionBranch,y.origin_branch=t.originBranch,y.branch_lease=b},{expectedRevision:f.revision});I=!0;const k=await ge(e,t.projectRoot,r,t.graphRevision);if(!await we(t.projectRoot,t.executionBranch,r,n))return s("direct-yolo-recovery-head-raced");if(e.push){const D=se(e.remote??"origin"),y=(await p(t.projectRoot,["ls-remote","--heads",D,`refs/heads/${t.executionBranch}`])).split(/\s+/)[0];if(!y||!await C(t.projectRoot,["merge-base","--is-ancestor",r,y]))return s("direct-yolo-recovery-remote-proof-missing")}const S=await Ee({projectRoot:t.projectRoot,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,headSha:r,bundleDigest:c,graphRevision:t.graphRevision,claimRevision:d,idempotencyKey:a,qaExecution:k,physicalLockOwnerDigest:Se(v.owner),nowIso:h,legacyReceiptRef:void 0}),x=await Fe(t.projectRoot,{storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,headSha:r,bundleDigest:c,graphRevision:t.graphRevision});if(!x)return s("direct-yolo-recovery-evidence-invalid");const m=Object.freeze({...S,receiptRefs:Object.freeze([...S.receiptRefs,x])});return await Ae({projectRoot:t.projectRoot,checkpoint:m,remote:e.push?e.remote??"origin":void 0,remotePolicy:"ancestor-recovery",expectedRevision:R.document.revision,expectedLease:b,expectedGraphRevision:t.graphRevision,physicalLockPath:v.path,physicalLockOwner:v.owner,transientAuthority:k.transientAuthority,authorizedWriteSet:t.authorizedWriteSet})?{ok:!0,value:m}:s("direct-yolo-recovery-persist-failed")}finally{await G(v.path,v.owner).catch(()=>{}),I&&await pe(t.projectRoot,t.epicId,b).catch(()=>{})}}catch(t){return s(ee(t,"direct-yolo-recovery-failed"))}}async function je(e,t){if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t))throw new Error("direct-yolo-story-id-invalid");const r=ie(e),o=w(JSON.parse(await oe(he(r,".neocortex/state.json"),"utf8"))),i=await q(r,{required:!0}),n=Te(o,i),l=w(n.stories),c=w(n.epics),d=w(l?.[t]),a=String(d?.epic_id??t.split(".")[0]),h=w(c?.[a]),u=String(h?.execution_branch??""),f=String(h?.origin_branch??""),v=String(h?.graph_revision??""),b=Array.isArray(d?.files_to_modify)?[...new Set(d.files_to_modify.filter(R=>typeof R=="string"&&me(R)))].sort():[];if(!d)throw new Error("direct-yolo-story-state-missing");if(h?.branch_mode!=="epic")throw new Error("direct-yolo-branch-mode-invalid");if(!qe(u)||!await C(r,["check-ref-format","--branch",u]))throw new Error("direct-yolo-execution-branch-invalid");if(!qe(f)||!await C(r,["check-ref-format","--branch",f]))throw new Error("direct-yolo-origin-branch-invalid");if(!/^[a-f0-9]{64}$/.test(v))throw new Error("direct-yolo-graph-revision-invalid");const I=await We({projectRoot:r,storyId:t,graphRevision:v,executionBranch:u,childPaths:b});return{projectRoot:r,storyId:t,story:d,epicId:a,executionBranch:u,originBranch:f,graphRevision:v,authorizedWriteSet:b,rootMemoryEffect:I}}async function Z(e,t){const r=await je(e,t);if(await p(r.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==r.executionBranch)throw new Error("direct-yolo-current-branch-mismatch");return r}async function Ee(e){const t=e.nowIso,r=await E(e.projectRoot,["show","--no-patch","--format=%H%n%P%n%B",e.headSha]),o=$(await E(e.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha])),i=Ke({storyId:e.storyId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,commitBody:r,changedPaths:o}),n=Ve({gitEvidenceDigest:i,headSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest}),l=`story-qa:${n}`,c=Object.freeze({schemaVersion:1,kind:"story_qa_evidence",producer:"local-yolo-tdd",evidenceVersion:"p205-execution-v2",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,contract:e.qaExecution.contract,command:e.qaExecution.command,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest,sourceEvidenceDigest:n,verdict:"passed",checkedAt:t,receiptRef:l}),d=ne(e.projectRoot,e.storyId,e.headSha);if(d?.verdict!=="approved")throw new Error("direct-yolo-review-artifact-not-approved");const a=j(["root-commit-range-review-v2",e.storyId,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,l,j(r),[...o].sort().join(","),d.digest].join("\0")),h=`story-review:${a}`,u=Object.freeze({schemaVersion:1,kind:"story_review_evidence",producer:"root-commit-range-review",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,sourceEvidenceDigest:a,reviewArtifactDigest:d.digest,qaReceiptRef:l,verdict:"approved",reviewedAt:t,receiptRef:h}),f=[`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,l,h,...e.physicalLockOwnerDigest?[`physical-lock-owner:${e.physicalLockOwnerDigest}`]:[],...e.legacyReceiptRef?[e.legacyReceiptRef]:[]];return Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:e.epicId,branch:e.executionBranch,baseSha:e.baseSha,headSha:e.headSha,commits:Object.freeze([e.headSha]),idempotencyKey:e.idempotencyKey,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,claimRevision:e.claimRevision,receiptRefs:Object.freeze(f),qaVerdict:"passed",reviewVerdict:"approved",qaReceipt:c,reviewReceipt:u,recordedAt:t,...e.rootMemoryEffect?{rootMemoryEffect:e.rootMemoryEffect}:{}})}async function Ae(e){const{projectRoot:t,checkpoint:r,remote:o}=e;let i=!1;return await P(t,n=>{const l=W(n,r.epicId);if(e.expectedLease){const h=w(l.branch_lease);if(!ce(h,e.expectedLease))throw new Error("direct-yolo-runtime-revision-conflict");if(Date.parse(String(h?.expiresAt))<=Date.now())throw new Error("direct-yolo-writer-lease-expired");if(l.graph_revision!==e.expectedGraphRevision||r.graphRevision!==e.expectedGraphRevision)throw new Error("direct-yolo-graph-revision-raced")}const c=xe(n,r.storyId),d=w(c.checkpoint);if(d&&d.headSha!==r.headSha){i=!0;return}c.checkpoint=r,c.status="done",c.last_step=ke;const a=Array.isArray(c.steps_completed)?c.steps_completed.filter(h=>typeof h=="string"):[];c.steps_completed=[...new Set([...a,ot,ke])],l.branch_lease=null},{expectedRevision:e.expectedRevision,preCommit:async()=>{if(i)throw new Error("direct-yolo-checkpoint-conflict");if(await p(t,["symbolic-ref","--quiet","--short","HEAD"])!==r.branch||await p(t,["rev-parse","HEAD"])!==r.headSha)throw new Error("direct-yolo-checkpoint-head-raced");if(!await be(t,r,r.storyId,r.epicId,r.branch,e.transientAuthority,e.authorizedWriteSet))throw new Error("direct-yolo-checkpoint-physical-invalid");if(e.physicalLockPath&&e.physicalLockOwner&&!await J(e.physicalLockPath,e.physicalLockOwner))throw new Error("direct-yolo-integration-lock-raced");if(o&&!(e.remotePolicy==="ancestor-recovery"?await Be(t,o,r.branch,r.headSha):await Oe(t,o,r.branch,r.headSha)))throw new Error("direct-yolo-checkpoint-remote-raced")}}),!i}async function Be(e,t,r,o){const i=se(t),n=(await p(e,["ls-remote","--heads",i,`refs/heads/${r}`])).split(/\s+/)[0];return!!(n&&await C(e,["merge-base","--is-ancestor",o,n]))}function ue(e,t,r){return!!(e?.ownerStoryId===t&&e.sessionId===e.idempotencyKey&&typeof e.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(e.idempotencyKey)&&typeof e.expiresAt=="string"&&Date.parse(e.expiresAt)>Date.parse(r))}async function _e(e,t){const r=await Xe(e),o=await Ye(r,"handoffs"),i=`direct-${j(t)}.json`;return{parent:o,name:i,path:he(o,i)}}async function ye(e,t){const r=await _e(e,t.storyId);await rt(r.parent,r.name,`${JSON.stringify(t,null,2)}
|
|
2
|
-
`),await
|
|
3
|
-
`).map(i=>i.trim()).filter(i=>i.startsWith(r)).map(i=>i.slice(r.length));return o.length===1?o[0]:void 0}function
|
|
4
|
-
`))o.startsWith("worktree ")?(r={path:o.slice(9)},t.push(r)):r&&o.startsWith("branch refs/heads/")&&(r.branch=o.slice(18));return t}function
|
|
1
|
+
import{execFile as _e}from"node:child_process";import{createHash as Le,randomBytes as le,timingSafeEqual as He}from"node:crypto";import{readFile as J}from"node:fs/promises";import{join as te,resolve as Z}from"node:path";import{promisify as Ce}from"node:util";import{readRootMemoryEffectForCheckpoint as qe}from"../private-execution/root-memory-scope.js";import{rootMemoryEffectDigest as Oe,verifyRootMemoryPhysicalWriteSet as re}from"../private-execution/root-memory-git-evidence.js";import{acquireGitLifecyclePhysicalIntegrationLock as W,applyGitLifecycleRuntimeOverlay as $e,computeImmutableStoryQaEvidenceDigest as ze,computeGitLifecyclePhysicalIntegrationLockOwnerDigest as ge,computeP205StoryQaEvidenceDigest as Pe,computeLegacyDirectYoloRecoveryReceiptRef as Ne,ensureRuntimeEpic as P,ensureRuntimeStory as me,ensureGitLifecyclePrivateChildDirectory as We,executeP205TransientAuthority as Ge,projectP205TransientExecutionEvidence as Me,publicStoryReviewArtifactFromGit as Q,LEGACY_DIRECT_YOLO_RECOVERY_COMMITS as Ke,mutateGitLifecycleRuntime as $,P205_COMPLETE_COMMAND as Ve,readGitLifecycleRuntime as C,gitLifecycleRuntimeDirectory as Fe,assertGitLifecyclePrivateFile as we,releaseGitLifecyclePhysicalIntegrationLock as G,releaseGitLifecyclePhysicalIntegrationLockForCheckpoint as Te,verifyGitLifecyclePhysicalIntegrationLock as U,verifyAcceptedGitLifecycleStoryCheckpoint as Ie}from"./git-lifecycle-store.js";import{anchoredAtomicWriteFile as Ye}from"./secure-filesystem-boundary.js";import{GIT_LIFECYCLE_COMMIT_PUSH_STEP_ID as Je,GIT_LIFECYCLE_REVIEW_PR_STEP_ID as Re,GIT_LIFECYCLE_SETUP_BRANCH_STEP_ID as X}from"./git-lifecycle-step-ids.js";const oe=Ce(_e);async function yt(e){try{const t=await ve(e.projectRoot,e.storyId),r=N(e.nowIso),o=Date.parse(r),i=await l(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),n=await l(t.projectRoot,["rev-parse","HEAD"]),y=await C(t.projectRoot,{required:!0}),h=m(y.epics[t.epicId]),d=m(h?.branch_lease),a=d&&Number.isFinite(Date.parse(String(d.expiresAt)))&&Date.parse(String(d.expiresAt))>o;if(a&&d?.ownerStoryId!==e.storyId)return c("direct-yolo-writer-active");let s=he(h?.origin_binding,t.executionBranch,t.originBranch);if(i===t.executionBranch){if(!s)return c("direct-yolo-origin-binding-invalid")}else{if(i!==t.originBranch)return c("direct-yolo-current-branch-mismatch");if(s&&s.originHeadSha!==n)return c("direct-yolo-origin-binding-conflict");if(s??={schemaVersion:1,originBranch:t.originBranch,originHeadSha:n,executionBranch:t.executionBranch,capturedFromCurrentCheckout:!0,capturedAt:r},(await Ee(t.projectRoot)).some(u=>u.branch===t.executionBranch&&Z(u.path)!==t.projectRoot))return c("direct-yolo-execution-branch-checked-out-elsewhere");const w=await T(t.projectRoot),j=`refs/heads/${t.executionBranch}`;if(await L(t.projectRoot,["show-ref","--verify","--quiet",j])){const u=await l(t.projectRoot,["rev-parse",j]);if(u!==n){if(!await L(t.projectRoot,["merge-base","--is-ancestor",u,n]))return c("direct-yolo-execution-branch-diverged");await l(t.projectRoot,["update-ref",j,n,u])}await l(t.projectRoot,["switch",t.executionBranch])}else await l(t.projectRoot,["switch","-c",t.executionBranch]);if(await T(t.projectRoot)!==w)return c("direct-yolo-checkout-payload-raced")}const p=await l(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"]),f=await l(t.projectRoot,["rev-parse","HEAD"]);if(p!==t.executionBranch)return c("direct-yolo-current-branch-mismatch");if(a&&d?.ownerStoryId===e.storyId)return d.setupHeadSha!==f?c("direct-yolo-setup-lease-head-unbound"):{ok:!0,value:ue(t,s,String(d.expiresAt),!0)};const R=r,k=new Date(o+3600*1e3).toISOString(),I=`setup-${le(32).toString("hex")}`,v=await C(t.projectRoot,{required:!0});return await $(t.projectRoot,x=>{const w=P(x,t.epicId),j=m(w.branch_lease);if(j&&Date.parse(String(j.expiresAt))>o&&j.ownerStoryId!==e.storyId)throw new Error("direct-yolo-writer-active");const u=he(w.origin_binding,t.executionBranch,t.originBranch);if(w.origin_binding&&!u)throw new Error("direct-yolo-origin-binding-conflict");if(u&&JSON.stringify(u)!==JSON.stringify(s))throw new Error("direct-yolo-origin-binding-conflict");w.branch_mode="epic",w.execution_branch=t.executionBranch,w.origin_branch=t.originBranch,w.graph_revision=t.graphRevision,w.origin_binding=s,w.branch_lease={schemaVersion:1,ownerStoryId:e.storyId,sessionId:I,idempotencyKey:I,acquiredAt:R,expiresAt:k,setupHeadSha:f}},{expectedRevision:v.revision,preCommit:async()=>{if(await l(t.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==t.executionBranch||await l(t.projectRoot,["rev-parse","HEAD"])!==f)throw new Error("direct-yolo-setup-physical-state-raced")}}),{ok:!0,value:ue(t,s,k,!1)}}catch(t){return c(Y(t,"direct-yolo-setup-failed"))}}async function pt(e){let t;try{const r=await K(e.projectRoot,e.storyId),o=N(e.nowIso),i=te(r.projectRoot,".neocortex/state.json"),n=await J(i,"utf8"),y=await T(r.projectRoot),h=await l(r.projectRoot,["rev-parse","HEAD"]),d=`refs/heads/${r.executionBranch}`,a=await C(r.projectRoot,{required:!0}),s=m(a.epics[r.epicId]),p=he(s?.origin_binding,r.executionBranch,r.originBranch),f=m(s?.branch_lease);if(!p)return c("direct-yolo-origin-binding-invalid");if(!f||!ie(f,e.storyId,o)||f?.sessionId!==f?.idempotencyKey)return c("direct-yolo-setup-lease-invalid");const R=await W(r.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:String(f.sessionId),idempotencyKey:String(f.idempotencyKey),expiresAt:new Date(Date.now()+300*1e3).toISOString(),persistent:!1});if(!R.ok)return c(R.reasonCode);if(t=R,h!==f.setupHeadSha||!await L(r.projectRoot,["merge-base","--is-ancestor",p.originHeadSha,h])||await l(r.projectRoot,["rev-parse",d])!==h)return c("direct-yolo-setup-head-mismatch");if((await Ee(r.projectRoot)).some(u=>u.branch===r.executionBranch&&Z(u.path)!==r.projectRoot))return c("direct-yolo-execution-branch-checked-out-elsewhere");const I=m(JSON.parse(n)),v=m(m(I?.stories)?.[e.storyId]),x=m(a.stories[e.storyId]);if(!v||!["backlog","ready_to_start"].includes(String(v.status))||v.steps_completed!==void 0&&(!Array.isArray(v.steps_completed)||v.steps_completed.length>0)||v.branch_name||v.checkpoint)return c("direct-yolo-setup-story-progress-conflict");const w=x?.status==="branch-ready"&&x.last_step===X&&Array.isArray(x.steps_completed)&&x.steps_completed.length===1&&x.steps_completed[0]===X&&Object.keys(x).sort().join(",")==="last_step,status,steps_completed";if(x&&Object.keys(x).length>0&&!w)return c("direct-yolo-setup-story-progress-conflict");const j=async()=>{if(Date.parse(String(f.expiresAt))<=(e.nowIso?Date.parse(o):Date.now())||!t||!await U(t.path,t.owner)||await J(i,"utf8")!==n||await T(r.projectRoot)!==y||await l(r.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==r.executionBranch||await l(r.projectRoot,["rev-parse","HEAD"])!==h||!await L(r.projectRoot,["merge-base","--is-ancestor",p.originHeadSha,h])||await l(r.projectRoot,["rev-parse",d])!==h)throw new Error("direct-yolo-setup-physical-state-raced")};return w?await j():await $(r.projectRoot,u=>{const b=m(u.epics[r.epicId]),g=me(u,e.storyId);if(JSON.stringify(b?.branch_lease)!==JSON.stringify(f)||JSON.stringify(b?.origin_binding)!==JSON.stringify(p)||b?.graph_revision!==r.graphRevision||Object.keys(g).length>0)throw new Error("direct-yolo-setup-runtime-raced");g.status="branch-ready",g.last_step=X,g.steps_completed=[X]},{expectedRevision:a.revision,preCommit:j}),{ok:!0,value:Object.freeze({...ue(r,p,String(f.expiresAt),w),checkpointAccepted:!0,graphRevision:r.graphRevision,headSha:h})}}catch(r){return c(Y(r,"direct-yolo-setup-acceptance-failed"))}finally{t&&await G(t.path,t.owner).catch(()=>{})}}async function lt(e){try{const t=await K(e.projectRoot,e.storyId),r=q(await A(t.projectRoot,["diff","--cached","--name-only","-z"])),o=V(r,t.authorizedWriteSet,e.storyId,t.rootMemoryEffect);if(!o.ok)return c(o.reasonCode);if(t.rootMemoryEffect&&re(t.projectRoot,t.rootMemoryEffect,{storyId:e.storyId,executionBranch:t.executionBranch,baseSha:await l(t.projectRoot,["rev-parse","HEAD"]),headRef:":",childPaths:t.authorizedWriteSet}),Q(t.projectRoot,e.storyId,":")?.verdict!=="approved")return c("direct-yolo-review-artifact-not-approved");if(q(await A(t.projectRoot,["diff","--name-only","-z"])).some(S=>r.includes(S)))return c("direct-yolo-user-overlap");const y=await A(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!y)return c("direct-yolo-staged-diff-empty");const h=D(y),d=D([...t.authorizedWriteSet].sort().join("\0")),a=N(e.nowIso),s=await C(t.projectRoot,{required:!0}),p=m(s.epics[t.epicId]?.branch_lease);if(!ie(p,e.storyId,a))return c("direct-yolo-setup-handoff-owner-invalid");const f=String(p.sessionId),R=String(p.expiresAt),k=new Date(Math.min(Date.parse(R),Date.parse(a)+300*1e3)).toISOString(),I=await M(t.projectRoot,e.storyId),v=I?.state==="issued"&&I.fromSessionId===f&&I.bundleDigest===h&&I.claimRevision===d&&Date.parse(I.expiresAt)>Date.parse(a),x=v?I.expiresAt:k,w=v?I.token:le(32).toString("base64url"),j=D(w),u=Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff",storyId:e.storyId,fromSessionId:f,tokenDigest:j,bundleDigest:h,claimRevision:d,expiresAt:x}),b=D(JSON.stringify(u)),g=await W(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:f,idempotencyKey:f,expiresAt:x,persistent:!1,createdAt:a});if(!g.ok)return c(g.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{await ne(t.projectRoot,{schemaVersion:1,kind:"direct-yolo-setup-handoff-token",state:"issued",storyId:e.storyId,fromSessionId:f,token:w,tokenDigest:j,bundleDigest:h,claimRevision:d,grantDigest:b,expiresAt:x}),await $(t.projectRoot,S=>{const E=m(P(S,t.epicId).branch_lease);if(!ie(E,e.storyId,a)||E?.sessionId!==f||E.idempotencyKey!==f)throw new Error("direct-yolo-setup-handoff-owner-raced");E.handoffGrant=u},{expectedRevision:s.revision,preCommit:async()=>{if(!await U(g.path,g.owner))throw new Error("direct-yolo-integration-lock-raced");const S=await M(t.projectRoot,e.storyId);if(!S||S.state!=="issued"||S.grantDigest!==b||S.tokenDigest!==j)throw new Error("direct-yolo-setup-handoff-token-raced")}})}finally{await G(g.path,g.owner).catch(()=>{})}return{ok:!0,value:Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-handoff-receipt",storyId:e.storyId,sessionId:f,bundleDigest:h,claimRevision:d,grantDigest:b,expiresAt:x,reused:v,publicSafe:!0})}}catch(t){return c(t instanceof Error&&/^direct-yolo-/.test(t.message)?t.message:"direct-yolo-setup-handoff-failed")}}async function gt(e){try{const t=await K(e.projectRoot,e.storyId),r=await l(t.projectRoot,["rev-parse","HEAD"]),o=q(await A(t.projectRoot,["diff","--cached","--name-only","-z"])),i=V(o,t.authorizedWriteSet,e.storyId,t.rootMemoryEffect);if(!i.ok)return c(i.reasonCode);t.rootMemoryEffect&&re(t.projectRoot,t.rootMemoryEffect,{storyId:e.storyId,executionBranch:t.executionBranch,baseSha:r,headRef:":",childPaths:t.authorizedWriteSet});const n=Q(t.projectRoot,e.storyId,":");if(n?.verdict!=="approved")return c("direct-yolo-review-artifact-not-approved");if(q(await A(t.projectRoot,["diff","--name-only","-z"])).some(u=>o.includes(u)))return c("direct-yolo-user-overlap");const h=await A(t.projectRoot,["diff","--cached","--binary","--full-index"]);if(!h)return c("direct-yolo-staged-diff-empty");const d=D(h),a=D([...t.authorizedWriteSet].sort().join("\0")),s=D(["direct-yolo-commit-v1",e.storyId,t.epicId,t.executionBranch,r,d,t.graphRevision,a].join("\0")),p=N(e.nowIso);let f=e.setupLeaseHandoff??await Ze(t.projectRoot,e.storyId,d,a,p);const R=await C(t.projectRoot,{required:!0}),k=m(R.epics[t.epicId]?.branch_lease),I=k?.ownerStoryId===e.storyId&&k.sessionId===s&&k.idempotencyKey===s&&typeof k.expiresAt=="string"&&Date.parse(k.expiresAt)>Date.parse(p)?k:void 0;if(I&&e.setupLeaseHandoff)return c("direct-yolo-setup-handoff-replayed");const v=m(I?.handoffConsumption);if(v){const u=await M(t.projectRoot,e.storyId);if(!u||!["consuming","consumed"].includes(u.state)||u.fromSessionId!==v.fromSessionId||u.tokenDigest!==v.tokenDigest||u.bundleDigest!==d||u.claimRevision!==a||v.bundleDigest!==d||v.claimRevision!==a||u.consumedBySessionId!==s||v.consumedBySessionId!==s)return c("direct-yolo-setup-handoff-consume-invalid");if(u.state==="consuming"){if(!u.token||D(u.token)!==u.tokenDigest)return c("direct-yolo-setup-handoff-consume-invalid");f={sessionId:u.fromSessionId,token:u.token}}}const x=I?String(I.expiresAt):new Date(Date.parse(p)+1800*1e3).toISOString(),w=await W(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:s,idempotencyKey:s,expiresAt:x,persistent:!0,createdAt:I&&typeof I.acquiredAt=="string"?I.acquiredAt:p});if(!w.ok)return c(w.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");try{f&&e.setupLeaseHandoff===void 0&&(await Qe(t.projectRoot,e.storyId,f.sessionId,f.token,s,p),await e.setupHandoffFault?.("after-consuming-persisted")),await $(t.projectRoot,u=>{const b=P(u,t.epicId),g=m(b.branch_lease),S=g&&Date.parse(String(g.expiresAt))>Date.parse(p),E=g?.ownerStoryId===e.storyId&&g.sessionId===s&&g.idempotencyKey===s,O=g?.ownerStoryId===e.storyId&&g.sessionId===g.idempotencyKey&&typeof g.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(g.idempotencyKey),B=S&&O&&Xe({current:g,handoff:f,storyId:e.storyId,bundleDigest:d,claimRevision:a,nowIso:p});if(f&&S&&!E&&!B)throw new Error("direct-yolo-setup-handoff-invalid");if(S&&!E&&!B)throw new Error("direct-yolo-writer-active");const _=B?m(g?.handoffGrant):void 0,H=_?{schemaVersion:1,kind:"direct-yolo-setup-handoff-consumption",state:"consumed",storyId:e.storyId,fromSessionId:String(g?.sessionId),tokenDigest:String(_.tokenDigest),bundleDigest:d,claimRevision:a,consumedBySessionId:s,consumedAt:p}:void 0;b.branch_mode="epic",b.execution_branch=t.executionBranch,b.origin_branch=t.originBranch,b.graph_revision=t.graphRevision,b.branch_lease=S&&E?g:{schemaVersion:1,ownerStoryId:e.storyId,sessionId:s,idempotencyKey:s,acquiredAt:p,expiresAt:x,...H?{handoffConsumption:H}:{}}},{expectedRevision:R.revision,preCommit:async()=>{if(!await U(w.path,w.owner))throw new Error("direct-yolo-integration-lock-raced")}})}catch(u){throw await G(w.path,w.owner).catch(()=>{}),u}f&&e.setupLeaseHandoff===void 0&&(await e.setupHandoffFault?.("before-consumed-persist"),await Ue(t.projectRoot,t.epicId,e.storyId,f.sessionId,f.token,d,a,s,p));const j=Object.freeze([`Neocortex-Story: ${e.storyId}`,`Neocortex-Epic: ${t.epicId}`,`Neocortex-Execution-Branch: ${t.executionBranch}`,`Neocortex-Prepared-Base: ${r}`,`Neocortex-Bundle-Digest: ${d}`,`Neocortex-Review-Artifact-Digest: ${n.digest}`,`Neocortex-Graph-Revision: ${t.graphRevision}`,`Neocortex-Claim-Revision: ${a}`,...t.rootMemoryEffect?[`Neocortex-Root-Memory-Effect: ${Oe(t.rootMemoryEffect)}`]:[]]);return{ok:!0,value:Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:r,bundleDigest:d,reviewArtifactDigest:n.digest,graphRevision:t.graphRevision,claimRevision:a,idempotencyKey:s,changedPaths:Object.freeze(o),trailers:j})}}catch(t){return c(Y(t,"direct-yolo-begin-failed"))}}async function mt(e){let t,r,o;try{const i=await K(e.projectRoot,e.storyId);t=i;const n=await l(i.projectRoot,["rev-parse","HEAD"]);let y=await C(i.projectRoot,{required:!0});const h=m(y.stories[e.storyId]?.checkpoint);if(h){const B=typeof h.headSha=="string"?h.headSha:"",_=typeof h.graphRevision=="string"?h.graphRevision:"",H=/^[a-f0-9]{40,64}$/.test(B)?q(await A(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",B])):[],z=V(H,i.authorizedWriteSet,e.storyId,i.rootMemoryEffect);if(!(/^[a-f0-9]{40,64}$/.test(B)&&await L(i.projectRoot,["merge-base","--is-ancestor",B,n]))||!/^[a-f0-9]{64}$/.test(_)||!z.ok)return c("direct-yolo-replay-invalid");const Be=await se(e,i.projectRoot,n,_);if(!await Ie(i.projectRoot,h,e.storyId,i.epicId,i.executionBranch,Be.transientAuthority,i.authorizedWriteSet))return c("direct-yolo-replay-invalid");if(!await de(i.projectRoot,i.executionBranch,n,H))return c("direct-yolo-replay-head-raced");if(e.push&&!await ke(i.projectRoot,e.remote??"origin",i.executionBranch,B))return c("direct-yolo-remote-head-mismatch");const ye=Array.isArray(h.receiptRefs)?h.receiptRefs.find(pe=>typeof pe=="string"&&/^physical-lock-owner:[a-f0-9]{64}$/.test(pe)):void 0;return ye&&typeof h.idempotencyKey=="string"&&await Te(i.projectRoot,{storyId:e.storyId,idempotencyKey:h.idempotencyKey,ownerDigest:ye.slice(20)}),{ok:!0,value:h}}const d=n,a=await l(i.projectRoot,["rev-parse",`${d}^`]),s=await A(i.projectRoot,["show","--no-patch","--format=%B",d]),p=q(await A(i.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",d])),f=V(p,i.authorizedWriteSet,e.storyId,i.rootMemoryEffect);if(!f.ok)return c(f.reasonCode);i.rootMemoryEffect&&re(i.projectRoot,i.rootMemoryEffect,{storyId:e.storyId,executionBranch:i.executionBranch,baseSha:a,headRef:d,childPaths:i.authorizedWriteSet});const R=F(s,"Neocortex-Bundle-Digest"),k=F(s,"Neocortex-Graph-Revision"),I=F(s,"Neocortex-Claim-Revision"),v=new Map([["Neocortex-Story",e.storyId],["Neocortex-Epic",i.epicId],["Neocortex-Execution-Branch",i.executionBranch],["Neocortex-Prepared-Base",a],["Neocortex-Graph-Revision",i.graphRevision],["Neocortex-Claim-Revision",D([...i.authorizedWriteSet].sort().join("\0"))]]);if(!R||!/^[a-f0-9]{64}$/.test(R)||!k||!I||[...v].some(([B,_])=>F(s,B)!==_))return c("direct-yolo-trailers-invalid");const x=Q(i.projectRoot,e.storyId,d);if(x?.verdict!=="approved")return c("direct-yolo-review-artifact-not-approved");const w=F(s,"Neocortex-Review-Artifact-Digest");if(w!==void 0&&w!==x.digest)return c("direct-yolo-review-artifact-digest-mismatch");const j=D(await A(i.projectRoot,["diff","--binary","--full-index",`${a}..${d}`]));if(R!==j)return c("direct-yolo-bundle-digest-mismatch");const u=D(["direct-yolo-commit-v1",e.storyId,i.epicId,i.executionBranch,a,R,k,I].join("\0")),b=m(y.epics[i.epicId]?.branch_lease),g=N(e.nowIso),S=b?.ownerStoryId===e.storyId&&b.idempotencyKey===u&&b.sessionId===u&&Date.parse(String(b.expiresAt))>Date.now()?b:void 0;if(b&&Date.parse(String(b.expiresAt))>Date.now()&&!S)return c("direct-yolo-writer-active");const E=S??{schemaVersion:1,ownerStoryId:e.storyId,sessionId:u,idempotencyKey:u,acquiredAt:g,expiresAt:new Date(Date.parse(g)+1800*1e3).toISOString()},O=await W(i.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:u,idempotencyKey:u,expiresAt:String(E.expiresAt),persistent:!0,createdAt:String(E.acquiredAt)});if(!O.ok)return c(O.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-integration-backpressure":"direct-yolo-integration-lock-failed");o=O,S||(y=(await $(i.projectRoot,_=>{const H=P(_,i.epicId),z=m(H.branch_lease);if(z&&Date.parse(String(z.expiresAt))>Date.parse(g))throw new Error("direct-yolo-writer-active");if(H.graph_revision!==i.graphRevision)throw new Error("direct-yolo-graph-revision-raced");H.branch_lease=E},{expectedRevision:y.revision})).document),r=E;{const B=await se(e,i.projectRoot,d,i.graphRevision);if(!await de(i.projectRoot,i.executionBranch,d,p))return c("direct-yolo-head-raced");if(e.push){const z=ee(e.remote??"origin");if(await l(i.projectRoot,["push",z,i.executionBranch]),!await De(i.projectRoot,z,i.executionBranch,d))return c("direct-yolo-remote-head-mismatch")}const _=await Se({projectRoot:i.projectRoot,storyId:e.storyId,epicId:i.epicId,executionBranch:i.executionBranch,baseSha:a,headSha:d,bundleDigest:R,graphRevision:k,claimRevision:I,idempotencyKey:u,qaExecution:B,physicalLockOwnerDigest:ge(O.owner),nowIso:N(e.nowIso),legacyReceiptRef:void 0,rootMemoryEffect:i.rootMemoryEffect});return await e.beforeCheckpointPersist?.(),await xe({projectRoot:i.projectRoot,checkpoint:_,remote:e.push?e.remote??"origin":void 0,expectedRevision:y.revision,expectedLease:E,expectedGraphRevision:i.graphRevision,physicalLockPath:O.path,physicalLockOwner:O.owner,transientAuthority:B.transientAuthority,authorizedWriteSet:i.authorizedWriteSet})?(await e.afterCheckpointPersist?.(),{ok:!0,value:_}):c("direct-yolo-checkpoint-persist-failed")}}catch(i){return c(Y(i,"direct-yolo-finalize-failed"))}finally{o&&await G(o.path,o.owner).catch(()=>{}),t&&r?await ce(t.projectRoot,t.epicId,r).catch(()=>{}):t&&await tt(t,e.storyId).catch(()=>{})}}async function wt(e){try{const t=await K(e.projectRoot,e.storyId);if(!/^[a-f0-9]{40,64}$/.test(e.commitSha))return c("direct-yolo-recovery-commit-invalid");const r=await l(t.projectRoot,["rev-parse",e.commitSha]);if(Ke[e.storyId]!==r)return c("direct-yolo-recovery-not-allowlisted");if(await l(t.projectRoot,["rev-parse","HEAD"])!==r)return c("direct-yolo-recovery-head-mismatch");await l(t.projectRoot,["merge-base","--is-ancestor",r,`refs/heads/${t.executionBranch}`]);const o=await l(t.projectRoot,["rev-parse",`${r}^`]),i=await A(t.projectRoot,["diff","--binary","--full-index",`${o}..${r}`]),n=q(await A(t.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",r]));if(!V(n,t.authorizedWriteSet.length>0?t.authorizedWriteSet:n,e.storyId).ok)return c("direct-yolo-recovery-write-set-invalid");const h=D(i),d=D([...n].sort().join("\0")),a=D(["legacy-direct-yolo-recovery-v1",e.storyId,r].join("\0")),s=N(e.nowIso),p=new Date(Date.parse(s)+1800*1e3).toISOString(),f=await C(t.projectRoot,{required:!0}),R=await W(t.projectRoot,{kind:"direct",storyId:e.storyId,sessionId:a,idempotencyKey:a,expiresAt:p,persistent:!0,createdAt:s});if(!R.ok)return c(R.reasonCode==="git-lifecycle-integration-backpressure"?"direct-yolo-recovery-integration-backpressure":"direct-yolo-recovery-integration-lock-failed");const k={schemaVersion:1,ownerStoryId:e.storyId,sessionId:a,idempotencyKey:a,acquiredAt:s,expiresAt:p};let I=!1;try{const v=await $(t.projectRoot,g=>{const S=P(g,t.epicId),E=m(S.branch_lease);if(E&&Date.parse(String(E.expiresAt))>Date.parse(s)&&!ae(E,k))throw new Error("direct-yolo-recovery-writer-active");if(S.graph_revision!==t.graphRevision)throw new Error("direct-yolo-recovery-graph-raced");S.branch_mode="epic",S.execution_branch=t.executionBranch,S.origin_branch=t.originBranch,S.branch_lease=k},{expectedRevision:f.revision});I=!0;const x=await se(e,t.projectRoot,r,t.graphRevision);if(!await de(t.projectRoot,t.executionBranch,r,n))return c("direct-yolo-recovery-head-raced");if(e.push){const g=ee(e.remote??"origin"),S=(await l(t.projectRoot,["ls-remote","--heads",g,`refs/heads/${t.executionBranch}`])).split(/\s+/)[0];if(!S||!await L(t.projectRoot,["merge-base","--is-ancestor",r,S]))return c("direct-yolo-recovery-remote-proof-missing")}const w=await Se({projectRoot:t.projectRoot,storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,headSha:r,bundleDigest:h,graphRevision:t.graphRevision,claimRevision:d,idempotencyKey:a,qaExecution:x,physicalLockOwnerDigest:ge(R.owner),nowIso:s,legacyReceiptRef:void 0}),j=await Ne(t.projectRoot,{storyId:e.storyId,epicId:t.epicId,executionBranch:t.executionBranch,baseSha:o,headSha:r,bundleDigest:h,graphRevision:t.graphRevision});if(!j)return c("direct-yolo-recovery-evidence-invalid");const u=Object.freeze({...w,receiptRefs:Object.freeze([...w.receiptRefs,j])});return await xe({projectRoot:t.projectRoot,checkpoint:u,remote:e.push?e.remote??"origin":void 0,remotePolicy:"ancestor-recovery",expectedRevision:v.document.revision,expectedLease:k,expectedGraphRevision:t.graphRevision,physicalLockPath:R.path,physicalLockOwner:R.owner,transientAuthority:x.transientAuthority,authorizedWriteSet:t.authorizedWriteSet})?{ok:!0,value:u}:c("direct-yolo-recovery-persist-failed")}finally{await G(R.path,R.owner).catch(()=>{}),I&&await ce(t.projectRoot,t.epicId,k).catch(()=>{})}}catch(t){return c(Y(t,"direct-yolo-recovery-failed"))}}async function ve(e,t){if(!/^[A-Za-z][A-Za-z0-9_-]*\.[A-Za-z0-9._-]+$/.test(t))throw new Error("direct-yolo-story-id-invalid");const r=Z(e),o=m(JSON.parse(await J(te(r,".neocortex/state.json"),"utf8"))),i=await C(r,{required:!0}),n=$e(o,i),y=m(n.stories),h=m(n.epics),d=m(y?.[t]),a=String(d?.epic_id??t.split(".")[0]),s=m(h?.[a]),p=String(s?.execution_branch??""),f=String(s?.origin_branch??""),R=String(s?.graph_revision??""),k=Array.isArray(d?.files_to_modify)?[...new Set(d.files_to_modify.filter(v=>typeof v=="string"&&fe(v)))].sort():[];if(!d)throw new Error("direct-yolo-story-state-missing");if(s?.branch_mode!=="epic")throw new Error("direct-yolo-branch-mode-invalid");if(!Ae(p)||!await L(r,["check-ref-format","--branch",p]))throw new Error("direct-yolo-execution-branch-invalid");if(!Ae(f)||!await L(r,["check-ref-format","--branch",f]))throw new Error("direct-yolo-origin-branch-invalid");if(!/^[a-f0-9]{64}$/.test(R))throw new Error("direct-yolo-graph-revision-invalid");const I=await qe({projectRoot:r,storyId:t,graphRevision:R,executionBranch:p,childPaths:k});return{projectRoot:r,storyId:t,story:d,epicId:a,executionBranch:p,originBranch:f,graphRevision:R,authorizedWriteSet:k,rootMemoryEffect:I}}async function K(e,t){const r=await ve(e,t);if(await l(r.projectRoot,["symbolic-ref","--quiet","--short","HEAD"])!==r.executionBranch)throw new Error("direct-yolo-current-branch-mismatch");return r}async function Se(e){const t=e.nowIso,r=await A(e.projectRoot,["show","--no-patch","--format=%H%n%P%n%B",e.headSha]),o=q(await A(e.projectRoot,["diff-tree","--no-commit-id","--name-only","-r","-z",e.headSha])),i=ze({storyId:e.storyId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,commitBody:r,changedPaths:o}),n=Pe({gitEvidenceDigest:i,headSha:e.headSha,graphRevision:e.graphRevision,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest}),y=`story-qa:${n}`,h=Object.freeze({schemaVersion:1,kind:"story_qa_evidence",producer:"local-yolo-tdd",evidenceVersion:"p205-execution-v2",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,contract:e.qaExecution.contract,command:e.qaExecution.command,manifestDigest:e.qaExecution.manifestDigest,gateIds:e.qaExecution.gateIds,resultDigest:e.qaExecution.resultDigest,sourceEvidenceDigest:n,verdict:"passed",checkedAt:t,receiptRef:y}),d=Q(e.projectRoot,e.storyId,e.headSha);if(d?.verdict!=="approved")throw new Error("direct-yolo-review-artifact-not-approved");const a=D(["root-commit-range-review-v2",e.storyId,e.baseSha,e.headSha,e.bundleDigest,e.graphRevision,y,D(r),[...o].sort().join(","),d.digest].join("\0")),s=`story-review:${a}`,p=Object.freeze({schemaVersion:1,kind:"story_review_evidence",producer:"root-commit-range-review",storyId:e.storyId,epicId:e.epicId,baseSha:e.baseSha,headSha:e.headSha,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,sourceEvidenceDigest:a,reviewArtifactDigest:d.digest,qaReceiptRef:y,verdict:"approved",reviewedAt:t,receiptRef:s}),f=[`.neocortex/stories/${e.storyId}/qa-gate-result.json`,`.neocortex/stories/${e.storyId}/validation-evidence.md`,y,s,...e.physicalLockOwnerDigest?[`physical-lock-owner:${e.physicalLockOwnerDigest}`]:[],...e.legacyReceiptRef?[e.legacyReceiptRef]:[]];return Object.freeze({schemaVersion:1,storyId:e.storyId,epicId:e.epicId,branch:e.executionBranch,baseSha:e.baseSha,headSha:e.headSha,commits:Object.freeze([e.headSha]),idempotencyKey:e.idempotencyKey,bundleDigest:e.bundleDigest,graphRevision:e.graphRevision,claimRevision:e.claimRevision,receiptRefs:Object.freeze(f),qaVerdict:"passed",reviewVerdict:"approved",qaReceipt:h,reviewReceipt:p,recordedAt:t,...e.rootMemoryEffect?{rootMemoryEffect:e.rootMemoryEffect}:{}})}async function xe(e){const{projectRoot:t,checkpoint:r,remote:o}=e;let i=!1;return await $(t,n=>{const y=P(n,r.epicId);if(e.expectedLease){const s=m(y.branch_lease);if(!ae(s,e.expectedLease))throw new Error("direct-yolo-runtime-revision-conflict");if(Date.parse(String(s?.expiresAt))<=Date.now())throw new Error("direct-yolo-writer-lease-expired");if(y.graph_revision!==e.expectedGraphRevision||r.graphRevision!==e.expectedGraphRevision)throw new Error("direct-yolo-graph-revision-raced")}const h=me(n,r.storyId),d=m(h.checkpoint);if(d&&d.headSha!==r.headSha){i=!0;return}h.checkpoint=r,h.status="done",h.last_step=Re;const a=Array.isArray(h.steps_completed)?h.steps_completed.filter(s=>typeof s=="string"):[];h.steps_completed=[...new Set([...a,Je,Re])],y.branch_lease=null},{expectedRevision:e.expectedRevision,preCommit:async()=>{if(i)throw new Error("direct-yolo-checkpoint-conflict");if(await l(t,["symbolic-ref","--quiet","--short","HEAD"])!==r.branch||await l(t,["rev-parse","HEAD"])!==r.headSha)throw new Error("direct-yolo-checkpoint-head-raced");if(!await Ie(t,r,r.storyId,r.epicId,r.branch,e.transientAuthority,e.authorizedWriteSet))throw new Error("direct-yolo-checkpoint-physical-invalid");if(e.physicalLockPath&&e.physicalLockOwner&&!await U(e.physicalLockPath,e.physicalLockOwner))throw new Error("direct-yolo-integration-lock-raced");if(o&&!(e.remotePolicy==="ancestor-recovery"?await ke(t,o,r.branch,r.headSha):await De(t,o,r.branch,r.headSha)))throw new Error("direct-yolo-checkpoint-remote-raced")}}),!i}async function ke(e,t,r,o){const i=ee(t),n=(await l(e,["ls-remote","--heads",i,`refs/heads/${r}`])).split(/\s+/)[0];return!!(n&&await L(e,["merge-base","--is-ancestor",o,n]))}function ie(e,t,r){return!!(e?.ownerStoryId===t&&e.sessionId===e.idempotencyKey&&typeof e.idempotencyKey=="string"&&/^setup-[a-f0-9]{64}$/.test(e.idempotencyKey)&&typeof e.expiresAt=="string"&&Date.parse(e.expiresAt)>Date.parse(r))}async function be(e,t){const r=await Fe(e),o=await We(r,"handoffs"),i=`direct-${D(t)}.json`;return{parent:o,name:i,path:te(o,i)}}async function ne(e,t){const r=await be(e,t.storyId);await Ye(r.parent,r.name,`${JSON.stringify(t,null,2)}
|
|
2
|
+
`),await we(r.path,r.parent)}async function M(e,t){try{const r=await be(e,t);await we(r.path,r.parent);const o=JSON.parse(await J(r.path,"utf8")),i=o.state==="issued"?["schemaVersion","kind","state","storyId","fromSessionId","token","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt"]:o.state==="consuming"?["schemaVersion","kind","state","storyId","fromSessionId","token","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt","consumedBySessionId","consumeStartedAt"]:["schemaVersion","kind","state","storyId","fromSessionId","tokenDigest","bundleDigest","claimRevision","grantDigest","expiresAt","consumedBySessionId","consumedAt"];return Object.keys(o).sort().join("\0")!==[...i].sort().join("\0")||o.schemaVersion!==1||o.kind!=="direct-yolo-setup-handoff-token"||o.state!=="issued"&&o.state!=="consuming"&&o.state!=="consumed"||o.storyId!==t||typeof o.fromSessionId!="string"||!/^setup-[a-f0-9]{64}$/.test(o.fromSessionId)||![o.tokenDigest,o.bundleDigest,o.claimRevision,o.grantDigest].every(n=>typeof n=="string"&&/^[a-f0-9]{64}$/.test(n))||typeof o.expiresAt!="string"||!Number.isFinite(Date.parse(o.expiresAt))||(o.state==="issued"||o.state==="consuming")&&(typeof o.token!="string"||!/^[A-Za-z0-9_-]{32,256}$/.test(o.token))||o.state==="consuming"&&(typeof o.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(o.consumedBySessionId)||typeof o.consumeStartedAt!="string"||!Number.isFinite(Date.parse(o.consumeStartedAt)))||o.state==="consumed"&&(typeof o.consumedBySessionId!="string"||!/^[a-f0-9]{64}$/.test(o.consumedBySessionId)||typeof o.consumedAt!="string"||!Number.isFinite(Date.parse(o.consumedAt)))?void 0:o}catch{return}}async function Ze(e,t,r,o,i){const n=await M(e,t);if(!(!n||n.state==="consumed"||!n.token||n.bundleDigest!==r||n.claimRevision!==o||Date.parse(n.expiresAt)<=Date.parse(i)||D(n.token)!==n.tokenDigest))return{sessionId:n.fromSessionId,token:n.token}}async function Qe(e,t,r,o,i,n){const y=await M(e,t);if(!y||y.state==="consumed"||y.fromSessionId!==r||y.token!==o||y.tokenDigest!==D(o))throw new Error("direct-yolo-setup-handoff-consume-invalid");if(y.state==="consuming"){if(y.consumedBySessionId!==i)throw new Error("direct-yolo-setup-handoff-consume-raced");return}await ne(e,{...y,state:"consuming",consumedBySessionId:i,consumeStartedAt:n})}async function Ue(e,t,r,o,i,n,y,h,d){const a=await M(e,r);if(a?.state==="consumed"&&a.fromSessionId===o&&a.consumedBySessionId===h)return;const s=await C(e,{required:!0}),p=m(s.epics[t]?.branch_lease),f=m(p?.handoffConsumption);if(!a||a.state!=="consuming"||a.fromSessionId!==o||a.token!==i||a.tokenDigest!==D(i)||a.bundleDigest!==n||a.claimRevision!==y||a.consumedBySessionId!==h||p?.ownerStoryId!==r||p.sessionId!==h||f?.kind!=="direct-yolo-setup-handoff-consumption"||f.state!=="consumed"||f.fromSessionId!==o||f.tokenDigest!==a.tokenDigest||f.bundleDigest!==n||f.claimRevision!==y||f.consumedBySessionId!==h)throw new Error("direct-yolo-setup-handoff-consume-invalid");try{await ne(e,{schemaVersion:1,kind:a.kind,state:"consumed",storyId:r,fromSessionId:o,tokenDigest:a.tokenDigest,bundleDigest:a.bundleDigest,claimRevision:a.claimRevision,grantDigest:a.grantDigest,expiresAt:a.expiresAt,consumedBySessionId:h,consumedAt:d})}catch{throw new Error("direct-yolo-setup-handoff-consume-persist-failed")}}function Xe(e){const t=m(e.current?.handoffGrant),r=e.handoff?.token,o=typeof r=="string"&&/^[A-Za-z0-9_-]{32,256}$/.test(r)?D(r):void 0;return!!(t&&o&&e.handoff&&e.handoff.sessionId===e.current?.sessionId&&t.schemaVersion===1&&t.kind==="direct-yolo-setup-handoff"&&t.storyId===e.storyId&&t.fromSessionId===e.current?.sessionId&&t.bundleDigest===e.bundleDigest&&t.claimRevision===e.claimRevision&&typeof t.expiresAt=="string"&&Date.parse(t.expiresAt)>Date.parse(e.nowIso)&&typeof t.tokenDigest=="string"&&/^[a-f0-9]{64}$/.test(t.tokenDigest)&&et(t.tokenDigest,o))}function et(e,t){const r=Buffer.from(e,"hex"),o=Buffer.from(t,"hex");return r.length===32&&o.length===32&&He(r,o)}function ae(e,t){return!!(e&&["schemaVersion","ownerStoryId","sessionId","idempotencyKey","acquiredAt","expiresAt"].every(r=>e[r]===t[r]))}async function ce(e,t,r){await $(e,o=>{const i=P(o,t),n=m(i.branch_lease);ae(n,r)&&(i.branch_lease=null)})}async function tt(e,t){const r=await C(e.projectRoot,{required:!0}),o=m(r.epics[e.epicId]?.branch_lease);if(!o||o.ownerStoryId!==t||!je(o.sessionId)||!je(o.idempotencyKey)||!Number.isFinite(Date.parse(String(o.acquiredAt)))||!Number.isFinite(Date.parse(String(o.expiresAt))))return;const i=await W(e.projectRoot,{kind:"direct",storyId:t,sessionId:String(o.sessionId),idempotencyKey:String(o.idempotencyKey),createdAt:String(o.acquiredAt),expiresAt:String(o.expiresAt),persistent:!0});if(!i.ok)return;await G(i.path,i.owner)&&await ce(e.projectRoot,e.epicId,o)}async function se(e,t,r,o){const i=await Ge(t,{headSha:r,graphRevision:o,nowIso:e.nowIso});await e.qaRunner?.({projectRoot:t,storyId:e.storyId,headSha:r});const n=Me(i);if(!n)throw new Error("p205-transient-authority-invalid");return{contract:"P205-CI-02",command:Ve,manifestDigest:n.manifestDigest,gateIds:n.gateIds,resultDigest:n.resultDigest,transientAuthority:i}}async function de(e,t,r,o){return await l(e,["rev-parse","HEAD"])!==r||await l(e,["symbolic-ref","--quiet","--short","HEAD"])!==t||!await L(e,["diff","--cached","--quiet"])?!1:L(e,["diff","--quiet","HEAD","--",...o])}async function De(e,t,r,o){const i=ee(t);return(await l(e,["ls-remote","--heads",i,`refs/heads/${r}`])).split(/\s+/)[0]===o}function V(e,t,r,o){if(e.length===0||e.some(n=>!fe(n)))return{ok:!1,reasonCode:"direct-yolo-write-set-invalid"};const i=[".neocortex/state.json",`docs/stories/${r}.story.md`,`.neocortex/stories/${r}/qa-gate-result.json`,`.neocortex/stories/${r}/validation-evidence.md`,`.neocortex/stories/${r}/review.md`];return!i.every(n=>e.includes(n))||!i.every(n=>t.includes(n))?{ok:!1,reasonCode:"direct-yolo-write-set-invalid"}:o&&(o.storyId!==r||o.childClaimRevision!==D([...t].sort().join("\0")))?{ok:!1,reasonCode:"direct-yolo-root-memory-claim-mismatch"}:e.some(n=>!t.includes(n)&&!o?.files.some(y=>y.path===n))?{ok:!1,reasonCode:"direct-yolo-write-set-unauthorized"}:{ok:!0}}function fe(e){return e.length>0&&e.length<=1024&&!e.startsWith("/")&&!e.includes("\\")&&!e.split("/").includes("..")&&!e.startsWith(".git/")&&!e.includes("\0")}function je(e){return typeof e=="string"&&e.length>0&&e.length<=512&&/^[A-Za-z0-9._:@/+\-=]+$/.test(e)}function Ae(e){return e.length>0&&e.length<=240&&!e.startsWith("-")&&!/[\s~^:?*[\\]/.test(e)&&!e.includes("..")}function ee(e){if(!/^[A-Za-z0-9._-]{1,128}$/.test(e))throw new Error("direct-yolo-remote-invalid");return e}function F(e,t){const r=`${t}: `,o=e.split(`
|
|
3
|
+
`).map(i=>i.trim()).filter(i=>i.startsWith(r)).map(i=>i.slice(r.length));return o.length===1?o[0]:void 0}function D(e){return Le("sha256").update(e).digest("hex")}function q(e){return e.split("\0").filter(Boolean)}function N(e){return e&&Number.isFinite(Date.parse(e))?new Date(Date.parse(e)).toISOString():new Date().toISOString()}function m(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function he(e,t,r){const o=m(e);if(!(!o||o.schemaVersion!==1||o.originBranch!==r||o.executionBranch!==t||o.capturedFromCurrentCheckout!==!0||typeof o.originHeadSha!="string"||!/^[a-f0-9]{40,64}$/.test(o.originHeadSha)||typeof o.capturedAt!="string"||!Number.isFinite(Date.parse(o.capturedAt))))return o}function ue(e,t,r,o){return Object.freeze({schemaVersion:1,kind:"direct-yolo-setup-receipt",storyId:e.storyId,epicId:e.epicId,executionBranch:e.executionBranch,originBranch:e.originBranch,originHeadSha:t.originHeadSha,leaseExpiresAt:r,reused:o,publicSafe:!0})}async function T(e){const t=q(await A(e,["ls-files","--others","--exclude-standard","-z"])).sort(),r=await Promise.all(t.map(async o=>{if(!fe(o))throw new Error("direct-yolo-checkout-payload-invalid");return`${o}\0${await l(e,["hash-object","--no-filters","--",o])}`}));return D([await A(e,["diff","--cached","--binary","--full-index"]),await A(e,["diff","--binary","--full-index"]),await A(e,["status","--porcelain=v1","-z","--untracked-files=all"]),...r].join("\0"))}async function It(e){const t=Z(e),r=await l(t,["rev-parse","HEAD"]),o=await l(t,["symbolic-ref","--quiet","--short","HEAD"]),i=await T(t);if(await l(t,["rev-parse","HEAD"])!==r||await l(t,["symbolic-ref","--quiet","--short","HEAD"])!==o)throw new Error("direct-yolo-checkout-observation-raced");return Object.freeze({headSha:r,branch:o,payloadDigest:i})}async function Ee(e){const t=[];let r;for(const o of(await A(e,["worktree","list","--porcelain"])).split(`
|
|
4
|
+
`))o.startsWith("worktree ")?(r={path:o.slice(9)},t.push(r)):r&&o.startsWith("branch refs/heads/")&&(r.branch=o.slice(18));return t}function Y(e,t){return e instanceof Error&&e.message==="git-lifecycle-runtime-revision-conflict"?"direct-yolo-runtime-revision-conflict":e instanceof Error&&/^direct-yolo-[a-z0-9-]+$/.test(e.message)?e.message:t}function c(e){return{ok:!1,reasonCode:e}}async function l(e,t){return String((await oe("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout).trim()}async function A(e,t){return String((await oe("git",[...t],{cwd:e,encoding:"utf8",maxBuffer:32*1024*1024})).stdout)}async function L(e,t){try{return await oe("git",[...t],{cwd:e,maxBuffer:8*1024*1024}),!0}catch{return!1}}export{pt as acceptDirectYoloSetupCheckpoint,gt as beginDirectYoloStoryCommit,It as captureDirectYoloCheckoutEvidence,mt as finalizeDirectYoloStoryCheckpoint,lt as issueDirectYoloSetupLeaseHandoff,yt as prepareDirectYoloSetup,wt as recoverLegacyDirectYoloStoryCheckpoint};
|
|
@@ -277,8 +277,6 @@ export declare function acquireGitLifecyclePhysicalIntegrationLock(projectRoot:
|
|
|
277
277
|
readonly ownerNonce?: string;
|
|
278
278
|
}): Promise<GitLifecyclePhysicalIntegrationLockResult>;
|
|
279
279
|
export declare function verifyGitLifecyclePhysicalIntegrationLock(path: string, expected: GitLifecyclePhysicalIntegrationLockOwner): Promise<boolean>;
|
|
280
|
-
/** Extend only the exact live physical owner through an anchored file CAS. */
|
|
281
|
-
export declare function renewGitLifecyclePhysicalIntegrationLock(path: string, expected: GitLifecyclePhysicalIntegrationLockOwner, expiresAtInput: string): Promise<GitLifecyclePhysicalIntegrationLockOwner | undefined>;
|
|
282
280
|
export declare function releaseGitLifecyclePhysicalIntegrationLock(path: string, expected: GitLifecyclePhysicalIntegrationLockOwner): Promise<boolean>;
|
|
283
281
|
export declare function computeGitLifecyclePhysicalIntegrationLockOwnerDigest(owner: GitLifecyclePhysicalIntegrationLockOwner): string;
|
|
284
282
|
/** Recover only the exact persistent lock whose digest was bound to a checkpoint. */
|