@ornexus/neocortex 4.60.18 → 4.60.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/sbom.cdx.json +6504 -6410
- package/docs/install/installer-diagnostics.md +52 -0
- package/install.ps1 +1 -1
- package/install.sh +1 -1
- package/package.json +27 -4
- package/packages/client/dist/agent/refresh-stubs.d.ts +7 -0
- package/packages/client/dist/agent/refresh-stubs.js +2 -2
- package/packages/client/dist/cache/encrypted-cache.d.ts +3 -0
- package/packages/client/dist/cache/encrypted-cache.js +1 -1
- package/packages/client/dist/checkpoint/checkpoint-client-reader.js +2 -2
- package/packages/client/dist/cli.js +3 -3
- package/packages/client/dist/commands/activate.js +7 -7
- package/packages/client/dist/commands/config.js +1 -1
- package/packages/client/dist/commands/invoke.d.ts +64 -0
- package/packages/client/dist/commands/invoke.js +54 -47
- package/packages/client/dist/config/secure-config.d.ts +9 -3
- package/packages/client/dist/config/secure-config.js +8 -8
- package/packages/client/dist/config.d.ts +1 -1
- package/packages/client/dist/config.js +1 -1
- package/packages/client/dist/continuity/continuity-client-state-store.d.ts +1 -0
- package/packages/client/dist/continuity/continuity-client-state-store.js +1 -1
- package/packages/client/dist/continuity/invoke-hooks.d.ts +2 -1
- package/packages/client/dist/continuity/invoke-hooks.js +1 -1
- package/packages/client/dist/continuity/sqlite-store.d.ts +21 -0
- package/packages/client/dist/continuity/sqlite-store.js +49 -49
- package/packages/client/dist/effects/invoke-effect-gateways.d.ts +22 -0
- package/packages/client/dist/effects/invoke-effect-gateways.js +1 -0
- package/packages/client/dist/errors/frontmatter-diagnostics.d.ts +20 -0
- package/packages/client/dist/errors/frontmatter-diagnostics.js +1 -0
- package/packages/client/dist/generated/command-registry.generated.d.ts +2836 -0
- package/packages/client/dist/generated/command-registry.generated.js +1 -0
- package/packages/client/dist/graph-retrieval/pre-command-hook.d.ts +2 -0
- package/packages/client/dist/graph-retrieval/pre-command-hook.js +1 -1
- package/packages/client/dist/index.d.ts +1 -0
- package/packages/client/dist/index.js +1 -1
- package/packages/client/dist/license/license-client.d.ts +3 -0
- package/packages/client/dist/license/license-client.js +1 -1
- package/packages/client/dist/machine/fingerprint.d.ts +3 -1
- package/packages/client/dist/machine/fingerprint.js +2 -2
- package/packages/client/dist/memory/project-memory-writer.js +19 -15
- package/packages/client/dist/{subagent-approval-policy.d.ts → policy/subagent-approval-policy.d.ts} +8 -3
- package/packages/client/dist/policy/subagent-approval-policy.js +1 -0
- package/packages/client/dist/resolvers/local-resolver.d.ts +3 -0
- package/packages/client/dist/resolvers/local-resolver.js +4 -4
- package/packages/client/dist/runner/cli.d.ts +1 -0
- package/packages/client/dist/runner/cli.js +1 -1
- package/packages/client/dist/runner/headless/prepared-story-bundle.d.ts +20 -0
- package/packages/client/dist/runner/headless/prepared-story-bundle.js +1 -0
- package/packages/client/dist/runner/headless/run-yoloop.d.ts +2 -0
- package/packages/client/dist/runner/headless/run-yoloop.js +1 -1
- package/packages/client/dist/runner/portal-sync-worker.js +1 -1
- package/packages/client/dist/runner/scheduler.d.ts +3 -0
- package/packages/client/dist/runner/scheduler.js +7 -7
- package/packages/client/dist/state/project-state-snapshot.js +1 -1
- package/packages/client/dist/tier/tier-aware-client.js +1 -1
- package/packages/client/dist/version.d.ts +3 -0
- package/packages/client/dist/version.js +1 -0
- package/packages/client/dist/yoloop/discovery-hook.js +2 -2
- package/packages/client/dist/yoloop/invoke-hooks.js +4 -4
- package/packages/client/dist/yoloop/shared-discover-epics.d.ts +9 -3
- package/packages/client/dist/yoloop/shared-discover-epics.js +1 -1
- package/packages/client/dist/yoloop/shared-yoloop-types.d.ts +24 -0
- package/packages/client/dist/yoloop/target-normalization.d.ts +24 -0
- package/packages/client/dist/yoloop/target-normalization.js +1 -0
- package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +4 -0
- package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -1
- package/packages/shared/dist/command-registry-contract.js +382 -0
- package/packages/shared/dist/generated/command-registry.generated.js +4216 -0
- package/packages/shared/dist/generated/invocation-schema.generated.js +1850 -0
- package/packages/shared/dist/invocation/index.d.ts +175 -0
- package/packages/shared/dist/invocation/index.js +587 -0
- package/packages/shared/dist/nx-invoke-signature.js +233 -0
- package/packages/shared/dist/strict-readonly.js +381 -0
- package/packages/shared/dist/yoloop/wave-decision-receipt.js +77 -0
- package/targets-stubs/antigravity/gemini.md +1 -1
- package/targets-stubs/antigravity/skill/SKILL.md +1 -1
- package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex-root.md +5 -2
- package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex.md +7 -2
- package/targets-stubs/codex/AGENTS.md +4 -1
- package/targets-stubs/codex/neocortex.toml +4 -0
- package/targets-stubs/cursor/agent.md +2 -2
- package/targets-stubs/gemini-cli/agent.md +2 -2
- package/targets-stubs/opencode/neocortex-root.md +4 -1
- package/targets-stubs/opencode/neocortex.md +3 -0
- package/targets-stubs/vscode/neocortex.agent.md +2 -2
- package/packages/client/dist/subagent-approval-policy.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHash as ve}from"node:crypto";import{resolve as ae}from"node:path";import{DEFAULT_SERVER_URL as $e}from"../constants.js";import{loadSecureConfig as se}from"../config/secure-config.js";import{LicenseClient as Ke}from"../license/license-client.js";import{deriveProjectIdentity as G}from"./project-identity.js";import{CONTINUITY_CLIENT_CONTRACT_VERSION as $,CONTINUITY_CLIENT_PORTAL_SYNC_ENVELOPE_VERSION as Z,CONTINUITY_CLIENT_SCHEMA_VERSION as K,ContinuityClientStateStore as de}from"../continuity/continuity-client-state-store.js";import{isContinuityPublicStage as Me,normalizeContinuityStageIteration as Ue,openContinuitySqliteStore as ce,sanitizeContinuityStageHistory as Fe}from"../continuity/sqlite-store.js";const d=Object.freeze({OK:"continuity-ok",AUTH_TOKEN_PERMISSION_FAILURE:"auth-token-permission-failure",BACKOFF_SCHEDULED:"backoff-scheduled",COMMAND_EXPIRED:"command-expired",IDEMPOTENCY_REPLAY:"idempotency-replay",INVALID_STATE_TRANSITION:"invalid-state-transition",JOB_CANCELLED:"job-cancelled",PORTAL_COMMAND_LOCAL_AUDIT_RECORDED:"portal-command-local-audit-recorded",PORTAL_COMMAND_PAYLOAD_REJECTED:"portal-command-payload-rejected",PORTAL_SYNC_PAYLOAD_REJECTED:"portal-sync-payload-rejected",RUNNER_DIRECTIVE_UNTRUSTED:"runner-directive-untrusted",SQLITE_ADAPTER_UNAVAILABLE:"sqlite-adapter-unavailable",SQLITE_INTEGRITY_FAILED:"sqlite-integrity-failed",UNSAFE_FIELD_REJECTED:"unsafe-field-rejected",WAITING_HUMAN:"waiting-human"}),ie=new Set(["approve","deny","hold"]),qe=new Set(["option","decisionId","gateId","publicSafe"]),M="3.9.62",He=6e4,Ve=3e4,Je=1e4,Ye=.2,Be=`${Date.now()}:${Math.random().toString(16).slice(2)}`,ue=new Set(["pause","resume","cancel","run_once","retry","snapshot","approve_review_gate","deny_review_gate","answer_decision"]),le=new Set(["commandId","jobId","action","decision","status","queuedAt","expiresAt","acknowledgedAt","idempotencyKey","delivery","workspaceId","workspaceLabel","runnerId","projectId","projectLabel","reasonCode","publicSafe"]),ye=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/,fe=/^runner-[A-Za-z0-9._-]{1,80}$/,ze=/^(?:job|goal|loop|runner)-[A-Za-z0-9._-]{1,80}$/,pe=/^pcmd-[a-f0-9]{8,64}$/i,V=/^[a-z0-9][a-z0-9-]{1,80}$/,W=/(raw[_-]?(?:logs?|payloads?)|std(?:out|err)|stack(?:[_-]?trace)?|transcript|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,g=/(https?:\/\/\S+|(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)|ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=|raw[_-]?(?:logs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS|P180[_-]?SYNTHETIC[_-]?CONTINUITY|P185[_-]?SYNTHETIC[_-]?CONTINUITY|P187[_-]?SYNTHETIC[_-]?(?:CONTINUITY|RUNNER|WATCH)|P190[_-]?SYNTHETIC[_-]?(?:HEADLESS|CONTINUITY)|P192[_-]?SYNTHETIC[_-]?(?:PORTAL|RUNNER|SYNC))/i,me=/(?:[;&|`$<>]|\$\(|\n|\r|\0|(?:^|\s)(?:bash|sh|zsh|fish|cmd\.exe|powershell|pwsh|npm|pnpm|yarn|node|python|ruby|go|cargo|sudo|chmod|curl|wget)\s+(?:-c|run|exec|install|test|build|[A-Za-z0-9_./:-]+))/i;async function Ge(e={}){const t=ae(e.projectRoot??process.cwd()),r=e.now??(()=>new Date().toISOString()),o=r(),n=ge(e.runnerId??_e(t)),a=Se(e.sessionId)??Ce(t),s=Ae(t,e),{workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y}=s,h=e.mode??"background",C=[],S=[],L={heartbeat:!1};let b;try{b=await ce({projectRoot:t,adapter:e.adapter,adapterLoader:e.adapterLoader,now:r});const I=new de(b,r,G(t)).collectSnapshot({nowIso:o,jobLimit:_(e.jobLimit??20,1,50),dueJobLimit:20,eventLimit:1,receiptLimit:1,staleLeaseLimit:20,processingSummaryLimit:1,snapshotLimit:1}),k=e.httpClient?e.authToken:await ee(e),H=e.httpClient??Ee(X(e),k),p=Le(e.clientVersion??M,k),v=Ie(I,{runnerId:n,sessionId:a,identity:s,generatedAt:o,schedulerState:e.schedulerState??"unknown",clientVersion:e.clientVersion??M}),j=await F(H,{method:"POST",path:"/api/v1/continuity/runner/heartbeat",body:v,headers:p},{timeoutMs:e.timeoutMs??e.heartbeatTimeoutMs??Je});j.ok?L.heartbeat=!0:C.push(j.reasonCode);const w=bt(I,S.length);return{ok:L.heartbeat,runnerId:n,sessionId:a,workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y,mode:h,generatedAt:o,serverAccessToLocalhost:!1,serverHeldStream:!1,localhostCallback:!1,posted:L,counts:w,reasonCodes:Y(C.length>0?C:[d.OK]),redactionEvidence:S,publicSafe:!0}}catch(f){const I=ke(f);return{ok:!1,runnerId:n,sessionId:a,workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y,mode:h,generatedAt:o,serverAccessToLocalhost:!1,serverHeldStream:!1,localhostCallback:!1,posted:L,counts:{redactions:S.length},reasonCodes:[I],redactionEvidence:S,publicSafe:!0}}finally{b?.close()}}async function Ze(e={}){const t=ae(e.projectRoot??process.cwd()),r=e.now??(()=>new Date().toISOString()),o=r(),n=ge(e.runnerId??_e(t)),a=Se(e.sessionId)??Ce(t),s=Ae(t,e),{workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y}=s,h=e.mode??"manual",C=[],S=[],L=[],b={heartbeat:!1,runnerSync:!1,commandAcks:0},f={polled:0,applied:0,alreadyApplied:0,rejected:0,expired:0,failedLocal:0};let I;try{I=await ce({projectRoot:t,adapter:e.adapter,adapterLoader:e.adapterLoader,now:r});const k=I.compactPublicReceiptsAndOutputs({nowIso:o,policy:e.retentionPolicy}),p=new de(I,r,G(t)).collectSnapshot({nowIso:o,jobLimit:_(e.jobLimit??50,1,50),dueJobLimit:50,eventLimit:_(e.eventLimit??50,1,100),receiptLimit:_(e.receiptLimit??50,1,100),staleLeaseLimit:20,processingSummaryLimit:20,snapshotLimit:10}),v=At(p,o),j=e.httpClient??Ee(X(e),await ee(e)),w=Le(e.clientVersion??M,e.httpClient?e.authToken:await ee(e)),re=Ie(p,{runnerId:n,sessionId:a,identity:s,generatedAt:o,schedulerState:e.schedulerState??"unknown",clientVersion:e.clientVersion??M}),oe=await F(j,{method:"POST",path:"/api/v1/continuity/runner/heartbeat",body:re,headers:w});oe.ok?b.heartbeat=!0:C.push(oe.reasonCode);const Ne=tt(p,{runnerId:n,identity:s,generatedAt:o,previousSyncCursor:e.syncCursor,nextSyncCursor:v,heartbeat:re}),E=rt(I,p,{runnerId:n,identity:s,generatedAt:o,previousSyncCursor:e.syncCursor,nextSyncCursor:v}),B=E.status==="acked"&&E.replay?{ok:!0,body:{reasonCode:d.IDEMPOTENCY_REPLAY,publicSafe:!0}}:E.status==="conflict"||E.status==="dead_letter"?{ok:!1,reasonCode:E.reasonCode??d.BACKOFF_SCHEDULED}:await F(j,{method:"POST",path:"/api/v1/continuity/jobs/sync",body:Ne,headers:w});B.ok?(b.runnerSync=!0,I.ackOutbox({outboxId:E.outboxId,deliveryCursor:E.deliveryCursor,ackedAt:r(),reasonCode:d.OK})):(C.push(B.reasonCode),I.failOutboxDelivery({outboxId:E.outboxId,deliveryCursor:E.deliveryCursor,failedAt:r(),reasonCode:B.reasonCode,summary:"Runner sync delivery failed with a public reason code and will retry or dead-letter by policy.",policy:{maxAttempts:3}}));const z=await F(j,{method:"GET",path:"/api/v1/continuity/runner/commands",query:{runnerId:n,workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y},headers:w});if(z.ok){const ne=mt(z.body).slice(0,_(e.commandLimit??20,1,20));f.polled=ne.length;for(const De of ne){const R=await We({store:I,http:j,headers:w,rawCommand:De,runnerId:n,identity:s,nowIso:r()});L.push(R),b.commandAcks+=1,R.localStatus==="applied"?f.applied+=1:R.localStatus==="already_applied"?f.alreadyApplied+=1:R.localStatus==="rejected"?f.rejected+=1:R.localStatus==="expired"?f.expired+=1:f.failedLocal+=1,S.push(...R.redactionEvidence),C.push(R.reasonCode)}}else C.push(z.reasonCode);const Oe={jobs:p.counts.jobs??p.jobs.length,dueJobs:p.dueJobCount,receipts:p.counts.receipts??p.lastReceipts.length,events:p.counts.events??p.lastEvents.length,commandsPolled:f.polled,commandAcks:b.commandAcks,commandApplied:f.applied,commandAlreadyApplied:f.alreadyApplied,commandRejected:f.rejected,commandExpired:f.expired,commandFailedLocal:f.failedLocal,receiptCompactionSummaries:k.counts.summariesCreated,receiptsCompacted:k.counts.receiptsRemoved,processingSummariesCompacted:k.counts.outputsRemoved,redactions:S.length,...N(p)},Pe=Y(C.length>0?C:[d.OK]);return{ok:b.heartbeat&&b.runnerSync&&f.failedLocal===0,runnerId:n,sessionId:a,workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y,mode:h,generatedAt:o,serverAccessToLocalhost:!1,serverHeldStream:!1,localhostCallback:!1,posted:b,commandPoll:f,sync:{...e.syncCursor?{previousSyncCursor:e.syncCursor}:{},nextSyncCursor:v,counts:Oe},commandAcks:L,reasonCodes:Pe,redactionEvidence:S.slice(0,50),publicSafe:!0}}catch(k){const H=ke(k);return{ok:!1,runnerId:n,sessionId:a,workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y,mode:h,generatedAt:o,serverAccessToLocalhost:!1,serverHeldStream:!1,localhostCallback:!1,posted:b,commandPoll:f,sync:{nextSyncCursor:`sync-${A(o).slice(0,24)}`,counts:{commandAcks:0}},commandAcks:L,reasonCodes:[H],redactionEvidence:S,publicSafe:!0}}finally{I?.close()}}async function Dt(e={}){const t=_(e.maxRuns??1,1,1e4),r=_(e.intervalMs??6e4,0,1440*60*1e3),o=[];let n=e.syncCursor;for(let a=0;a<t;a++){const s=await Ze({...e,mode:e.mode??"background",syncCursor:n});o.push(s),n=s.sync.nextSyncCursor,a<t-1&&r>0&&await xe(r)}return{ok:o.every(a=>a.ok),runs:o,reasonCodes:Y(o.flatMap(a=>a.reasonCodes)),publicSafe:!0}}async function vt(e={}){const t=_(e.maxRuns??1,1,1e4),r=_(e.intervalMs??He,0,1440*60*1e3),o=_(e.backoffMs??Ve,1e3,1800*1e3),n=Te(e.jitterRatio??Ye,0,.5),a=e.random??Math.random,s=[];for(let u=0;u<t;u++){const l=await Ge({...e,mode:e.mode??"background"});if(s.push(l),u<t-1){const c=l.ok?r:o,y=ht(c,n,a);y>0&&await xe(y)}}return{ok:s.every(u=>u.ok),runs:s,reasonCodes:Y(s.flatMap(u=>u.reasonCodes)),schedule:{intervalMs:r,backoffMs:o,jitterRatio:n,maxRuns:t},publicSafe:!0}}async function We(e){const t=ft(e.rawCommand);if(!t.ok||!t.command)return Xe(e.store,t,e.runnerId,e.nowIso),T(e.http,e.headers,{commandId:t.commandId??`pcmd-${A("invalid-command").slice(0,16)}`,jobId:t.jobId,action:t.action,runnerId:e.runnerId,identity:e.identity,idempotencyKey:`invalid:${t.commandId??"unknown"}`,localStatus:"rejected",remoteStatus:"rejected",reasonCode:d.PORTAL_COMMAND_PAYLOAD_REJECTED,publicSummary:"Runner rejected unsafe Portal command before local application.",acknowledgedAt:e.nowIso,redactionEvidence:t.redactions,counts:{rejected:1,redactions:t.redactions.length}});const r=t.command,o=U(r.commandId),n={commandId:r.commandId,jobId:r.jobId,action:r.action,runnerId:e.runnerId,identity:e.identity,idempotencyKey:r.idempotencyKey,acknowledgedAt:e.nowIso,redactionEvidence:t.redactions};if(r.expiresAt&&Date.parse(r.expiresAt)<=Date.parse(e.nowIso))return Q(e.store,r,{operationId:o,status:"ignored",reasonCode:d.COMMAND_EXPIRED,createdAt:e.nowIso,summary:"Portal command expired before local application.",redactionEvidence:t.redactions}),T(e.http,e.headers,{...n,localStatus:"expired",remoteStatus:"expired",reasonCode:d.COMMAND_EXPIRED,publicSummary:"Runner skipped expired Portal command.",counts:{expired:1}});if(e.store.hasOperationRef(o,r.idempotencyKey))return et(e.store,r,o,e.runnerId,e.nowIso,t.redactions),T(e.http,e.headers,{...n,localStatus:"already_applied",remoteStatus:"applied",reasonCode:d.IDEMPOTENCY_REPLAY,publicSummary:"Runner already applied Portal command; duplicate poll was acknowledged without local mutation.",counts:{alreadyApplied:1}});if(!e.store.jobExists(r.jobId))return T(e.http,e.headers,{...n,localStatus:"failed-local",remoteStatus:"rejected",reasonCode:d.INVALID_STATE_TRANSITION,publicSummary:"Runner could not find the public job for Portal command application.",counts:{failedLocal:1}});try{const a=be(r);return e.store.runInTransaction(()=>{Qe(e.store,r,e.nowIso),e.store.appendEvent({eventId:`${o}:event`,jobId:r.jobId,operationId:o,idempotencyKey:r.idempotencyKey,type:"portal_command_applied",summary:`Portal command ${r.action} applied locally by runner.`,reasonCode:a,createdAt:e.nowIso,metadata:x(r,o,e.runnerId,"applied",e.nowIso,t.redactions,a)}),e.store.appendReceipt({receiptId:`receipt-${o}`,jobId:r.jobId,operationId:o,idempotencyKey:r.idempotencyKey,status:"applied",reasonCode:a,appliedOperationIds:[o],createdAt:e.nowIso,metadata:x(r,o,e.runnerId,"applied",e.nowIso,t.redactions,a)})}),T(e.http,e.headers,{...n,localStatus:"applied",remoteStatus:"applied",reasonCode:a,publicSummary:`Runner applied Portal command ${r.action} locally.`,counts:{applied:1}})}catch{return Q(e.store,r,{operationId:o,status:"failed",reasonCode:d.INVALID_STATE_TRANSITION,createdAt:e.nowIso,summary:"Portal command failed local application with public reason code.",redactionEvidence:t.redactions}),T(e.http,e.headers,{...n,localStatus:"failed-local",remoteStatus:"rejected",reasonCode:d.INVALID_STATE_TRANSITION,publicSummary:"Runner failed local Portal command application with public reason code.",counts:{failedLocal:1}})}}function Qe(e,t,r){switch(t.action){case"pause":e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"paused",updatedAt:r,reasonCode:d.WAITING_HUMAN});return;case"resume":case"approve_review_gate":e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"active",updatedAt:r,reasonCode:d.OK});return;case"cancel":case"deny_review_gate":e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"cancelled",updatedAt:r,reasonCode:d.JOB_CANCELLED});return;case"answer_decision":if(t.decision?.option==="approve"){e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"active",updatedAt:r,reasonCode:d.OK});return}if(t.decision?.option==="deny"){e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"cancelled",updatedAt:r,reasonCode:d.JOB_CANCELLED});return}if(t.decision?.option==="hold"){e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"blocked",updatedAt:r,reasonCode:d.WAITING_HUMAN});return}throw new Error("unsupported-review-gate-decision");case"run_once":case"retry":e.scheduleNextTick({jobId:t.jobId,scheduledAt:r,updatedAt:r,reasonCode:d.OK});return;case"snapshot":e.recordStateSnapshot({snapshotId:`snapshot-${U(t.commandId)}`,jobId:t.jobId,kind:"portal_command_snapshot",summary:"Portal snapshot command recorded public local state checkpoint request.",capturedAt:r,operationId:U(t.commandId),idempotencyKey:t.idempotencyKey,metadata:x(t,U(t.commandId),t.runnerId,"applied",r,[],d.OK)});return;default:throw new Error("unsupported-command-action")}}async function T(e,t,r){return await F(e,{method:"POST",path:`/api/v1/continuity/runner/commands/${encodeURIComponent(r.commandId)}/ack`,body:{status:r.remoteStatus,runnerId:r.runnerId,workspaceId:r.identity.workspaceId,workspaceLabel:r.identity.workspaceLabel,projectId:r.identity.projectId,projectLabel:r.identity.projectLabel,idempotencyKey:r.idempotencyKey,reasonCode:r.reasonCode,publicSummary:m(r.publicSummary,280),counts:Re(r.counts),redactionEvidence:r.redactionEvidence.slice(0,20),publicSafe:!0},headers:t}),{commandId:r.commandId,...r.jobId?{jobId:r.jobId}:{},workspaceId:r.identity.workspaceId,workspaceLabel:r.identity.workspaceLabel,projectId:r.identity.projectId,projectLabel:r.identity.projectLabel,...r.action?{action:r.action}:{},localStatus:r.localStatus,remoteStatus:r.remoteStatus,reasonCode:r.reasonCode,publicSummary:m(r.publicSummary,280),acknowledgedAt:r.acknowledgedAt,counts:r.counts,redactionEvidence:r.redactionEvidence.slice(0,20),publicSafe:!0}}function Q(e,t,r){try{if(!e.jobExists(t.jobId)||e.hasOperationRef(r.operationId,t.idempotencyKey))return;e.appendReceipt({receiptId:`receipt-${r.operationId}`,jobId:t.jobId,operationId:r.operationId,idempotencyKey:t.idempotencyKey,status:r.status,reasonCode:r.reasonCode,ignoredOperationIds:[r.operationId],createdAt:r.createdAt,metadata:x(t,r.operationId,t.runnerId,r.status,r.createdAt,r.redactionEvidence,r.reasonCode)}),e.appendEvent({eventId:`${r.operationId}:event`,jobId:t.jobId,operationId:`${r.operationId}:event`,idempotencyKey:`${t.idempotencyKey}:event`,type:r.status==="failed"?"portal_command_failed":"portal_command_rejected",summary:r.summary,reasonCode:r.reasonCode,createdAt:r.createdAt,metadata:x(t,r.operationId,t.runnerId,r.status,r.createdAt,r.redactionEvidence,r.reasonCode)})}catch{}}function Xe(e,t,r,o){if(!t.commandId||!pe.test(t.commandId)||!t.jobId||!J(t.jobId)||!t.action||!ue.has(t.action))return;const n={commandId:t.commandId,jobId:t.jobId,action:t.action,status:"queued",queuedAt:o,idempotencyKey:`rejected:${t.commandId}`,delivery:"runner_poll",runnerId:r,reasonCode:d.PORTAL_COMMAND_PAYLOAD_REJECTED,publicSafe:!0};Q(e,n,{operationId:`${U(t.commandId)}:rejected`,status:"ignored",reasonCode:d.PORTAL_COMMAND_PAYLOAD_REJECTED,createdAt:o,summary:"Runner rejected unsafe Portal command before local application.",redactionEvidence:t.redactions})}function et(e,t,r,o,n,a){const s=`${r}:replay`;try{if(!e.jobExists(t.jobId)||e.hasOperationRef(s,`${t.idempotencyKey}:replay`))return;e.appendEvent({eventId:`${s}:event`,jobId:t.jobId,operationId:s,idempotencyKey:`${t.idempotencyKey}:replay`,type:"portal_command_replay",summary:"Runner recorded idempotent Portal command replay without local mutation.",reasonCode:d.IDEMPOTENCY_REPLAY,createdAt:n,metadata:x(t,s,o,"already_applied",n,a,d.IDEMPOTENCY_REPLAY)})}catch{}}function Ie(e,t){const r=It(e),o=e.jobs.filter(s=>["planned","active","running","backoff","waiting_external","waiting_human"].includes(s.status)).map(s=>s.jobId).filter(J).slice(0,20),n=e.staleLeases.map(s=>s.leaseId).filter(P).slice(0,20),a=we(e.dueJobs.map(s=>s.nextRunAt).filter(s=>!!s));return{schemaVersion:K,contractVersion:$,runnerId:t.runnerId,...t.sessionId?{sessionId:t.sessionId}:{},workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,status:r,observedAt:t.generatedAt,version:m(t.clientVersion,80),activeJobIds:o,leaseIds:n,...a?{nextTickAt:a}:{},schedulerState:t.schedulerState,doctorSummary:r==="degraded"?"Runner sync is degraded by public stale lease or retryable outbox counts.":"Runner sync heartbeat contains public local continuity summaries.",reasonCode:r==="degraded"?d.BACKOFF_SCHEDULED:d.OK,queue:{depth:e.queue.depth,queued:e.queue.queued,running:e.queue.running,retrying:e.queue.retrying,deadLetter:e.queue.deadLetter,capacity:e.queue.capacity,available:e.queue.available,backpressure:e.queue.backpressure,generatedAt:e.queue.generatedAt,...e.queue.nextRetryAt?{nextRetryAt:e.queue.nextRetryAt}:{},...e.queue.reasonCode?{reasonCode:q(e.queue.reasonCode)}:{},publicSafe:!0},metadata:{schemaVersion:K,contractVersion:$,transportKind:"runner_heartbeat",...t.sessionId?{sessionId:t.sessionId}:{},workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,observedAt:t.generatedAt,serverAccessToLocalhost:!1,serverHeldStream:!1,counts:{jobs:e.counts.jobs??e.jobs.length,dueJobs:e.dueJobCount,activeLeases:e.counts.activeLeases??0,staleLeases:e.counts.staleLeases??e.staleLeases.length,outboxPending:e.outbox.pending??0,outboxFailed:(e.outbox.failed??0)+(e.outbox.deadLetter??0),...N(e)},reasonCodes:[r==="degraded"?d.BACKOFF_SCHEDULED:d.OK],publicSummary:"Runner heartbeat generated from local continuity SQLite public summaries."},publicSafe:!0}}function tt(e,t){const r=e.jobs.map(s=>dt(s,t.identity,e)).slice(0,50),o=[...e.lastEvents.map(it),...(e.headlessExecutionAttempts??[]).map(ut)].slice(0,100),n=e.lastReceipts.map(lt).slice(0,100),a=yt(e,t.generatedAt);return{runnerId:t.runnerId,workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,runner:{...t.heartbeat,metadata:{schemaVersion:K,contractVersion:$,syncVersion:Z,transportKind:"runner_sync",workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,syncCursor:t.previousSyncCursor??"sync-initial",nextSyncCursor:t.nextSyncCursor,generatedAt:t.generatedAt,serverAccessToLocalhost:!1,serverHeldStream:!1,counts:{jobs:r.length,events:o.length,receipts:n.length,outbox:a.length,headlessExecutionAttempts:e.headlessExecutionAttempts?.length??0,...N(e)},publicSummary:"Runner sync uploaded public job, event and receipt summaries."}},jobs:r,events:o,receipts:n,outbox:a,runnerSync:{runnerId:t.runnerId,workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,syncCursor:t.previousSyncCursor??"sync-initial",nextSyncCursor:t.nextSyncCursor,generatedAt:t.generatedAt,publicSummary:"Runner sync uploaded public job, event and receipt summaries.",counts:{jobs:r.length,events:o.length,receipts:n.length,outbox:a.length,...N(e)},publicSafe:!0}}}function rt(e,t,r){const o=ot({runnerId:r.runnerId,workspaceId:r.identity.workspaceId,projectId:r.identity.projectId,nextSyncCursor:r.nextSyncCursor}),n=nt({runnerId:r.runnerId,workspaceId:r.identity.workspaceId,projectId:r.identity.projectId,nextSyncCursor:r.nextSyncCursor});return e.enqueueOutbox({outboxId:o,jobId:st(t),operationId:`op-${o}`,idempotencyKey:`idem-${o}`,type:"runner_sync",status:"pending",payload:at(t,r),createdAt:r.generatedAt,updatedAt:r.generatedAt}),e.markOutboxSent({outboxId:o,deliveryCursor:n,sentAt:r.generatedAt,reasonCode:d.OK})}function ot(e){return`outbox-runner-sync-${A(`${e.runnerId}:${e.workspaceId}:${e.projectId??"project"}:${e.nextSyncCursor}`).slice(0,32)}`}function nt(e){return`cursor-runner-sync-${A(`${e.workspaceId}:${e.projectId??"project"}:${e.runnerId}:${e.nextSyncCursor}`).slice(0,32)}`}function at(e,t){return{schemaVersion:K,contractVersion:$,syncVersion:Z,transportKind:"runner_sync",envelopeId:`runner-sync-${A(`${t.runnerId}:${t.nextSyncCursor}`).slice(0,24)}`,runnerId:t.runnerId,workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,syncCursor:t.previousSyncCursor??"sync-initial",nextSyncCursor:t.nextSyncCursor,generatedAt:t.generatedAt,serverAccessToLocalhost:!1,serverHeldStream:!1,counts:{jobs:e.counts.jobs??e.jobs.length,events:e.counts.events??e.lastEvents.length,receipts:e.counts.receipts??e.lastReceipts.length,outboxPending:e.outbox.pending??0,outboxFailed:e.outbox.failed??0,outboxDeadLetter:e.outbox.deadLetter??0,headlessExecutionAttempts:e.headlessExecutionAttempts?.length??0,...N(e)},redactionEvidence:[{field:"runnerSyncBody",reason:"unbounded_text",evidence:"operation-denied",publicSafe:!0}],publicSummary:"Runner sync outbox stores public IDs, counts, redaction evidence and cursor state only."}}function st(e){return e.jobs.map(t=>t.jobId).find(J)}function dt(e,t,r){const o=Me(e.currentStage)?e.currentStage:void 0,n=Fe(e.stageHistory),a=Ue(e.iteration),s=ct(e.jobId,r);return{jobId:e.jobId,workspaceId:t.workspaceId,workspaceLabel:t.workspaceLabel,projectId:t.projectId,projectLabel:t.projectLabel,kind:Lt(e.kind),status:kt(e.status),publicSummary:m(e.publicSummary,240),updatedAt:e.updatedAt,...e.nextRunAt?{nextRunAt:e.nextRunAt}:{},...e.reasonCode?{reasonCode:q(e.reasonCode)}:{},...e.counts?{counts:Re(e.counts)}:{},...s?{operations:s}:{},...o?{currentStage:o}:{},...n.length>0?{stageHistory:n}:{},...a!==void 0?{iteration:a}:{},publicSafe:!0}}function ct(e,t){const r=(t.headlessExecutionAttempts??[]).filter(c=>c.jobId===e).slice(0,50),o=t.staleLeases.filter(c=>c.jobId===e).slice(0,50);if(r.length===0&&o.length===0)return;const n=r.filter(c=>c.status==="backoff"||c.retryCount>0&&!!c.nextRetryAt).length,a=r.filter(c=>!!c.deadLetteredAt||c.status==="dead_letter").length,s=r.filter(c=>["queued","pending","backoff"].includes(c.status)).length,u=we(r.map(c=>c.nextRetryAt).filter(c=>!!c)),l=[...r].map(c=>c.leaseExpiresAt).filter(c=>!!c).sort().at(-1);return{attempts:r.length,retries:r.reduce((c,y)=>c+Math.max(0,Math.trunc(y.retryCount)),0),retrying:n,deadLetter:a,activeLeases:r.filter(c=>!!c.leaseId&&c.status==="running").length,staleLeases:o.length,queueDepth:s,backpressure:t.queue.backpressure&&s>0,generatedAt:t.generatedAt,...u?{nextRetryAt:u}:{},...l?{latestLeaseExpiresAt:l}:{},publicSafe:!0}}function it(e){return{eventId:e.eventId,jobId:e.jobId,operationId:e.operationId,type:m(e.type,80),summary:m(e.publicSummary,240),publicSummary:m(e.publicSummary,240),createdAt:e.createdAt,...e.metadata?{metadata:e.metadata}:{},...e.reasonCode?{reasonCode:q(e.reasonCode)}:{},publicSafe:!0}}function ut(e){return{eventId:`headless-${O(e.attemptId)}`,jobId:e.jobId,operationId:e.executionId,type:"headless_execution_attempt",summary:m(e.publicSummary,240),publicSummary:m(e.publicSummary,240),createdAt:e.heartbeatAt??e.enqueuedAt,...e.reasonCode?{reasonCode:q(e.reasonCode)}:{},publicSafe:!0}}function lt(e){return{receiptId:e.receiptId,jobId:e.jobId,...e.operationId?{operationId:e.operationId}:{},status:gt(e.status),summary:`Runner receipt ${e.status} for ${e.jobId}.`,createdAt:e.createdAt,...e.reasonCode?{reasonCode:q(e.reasonCode)}:{},publicSafe:!0}}function yt(e,t){const r=[];for(const[o,n]of Object.entries(e.outbox))o==="total"||!Number.isFinite(n)||n<=0||r.push({outboxId:`outbox-${o}`,operationId:`outbox-${o}-${A(t).slice(0,12)}`,status:o==="failed"||o==="deadLetter"?"failed":o==="acked"||o==="sent"?"applied":"accepted",summary:`Outbox ${o} count ${Math.trunc(n)} synced as public status evidence.`,updatedAt:t,reasonCode:o==="failed"||o==="deadLetter"?d.BACKOFF_SCHEDULED:d.OK,counts:{[o]:Math.trunc(n)},publicSafe:!0});return r.slice(0,20)}function ft(e){const t=[];if(!D(e))return t.push(i("command","unsafe_key","operation-denied")),{ok:!1,reasonCode:d.UNSAFE_FIELD_REJECTED,redactions:t};for(const y of Object.keys(e))(!le.has(y)||W.test(y))&&t.push(i(`command.${m(y,80)}`,"unsafe_key","key-denied"));for(const[y,h]of Object.entries(e))le.has(y)&&te(h,`command.${y}`,t);const r=typeof e.commandId=="string"?e.commandId:void 0,o=typeof e.jobId=="string"?e.jobId:void 0,n=typeof e.action=="string"?e.action:void 0,a=typeof e.status=="string"?e.status:void 0,s=typeof e.queuedAt=="string"?e.queuedAt:void 0,u=typeof e.idempotencyKey=="string"?e.idempotencyKey:void 0,l=typeof e.delivery=="string"?e.delivery:void 0;(!r||!pe.test(r))&&t.push(i("command.commandId","unsafe_key")),(!o||!J(o))&&t.push(i("command.jobId","unsafe_key")),(!n||!ue.has(n))&&t.push(i("command.action","unsafe_key")),a!=="queued"&&t.push(i("command.status","unsafe_key"));const c=pt(e.decision,n,t);return(!s||!Number.isFinite(Date.parse(s)))&&t.push(i("command.queuedAt","unsafe_key")),(!u||!P(u))&&t.push(i("command.idempotencyKey","unsafe_key")),l!=="runner_poll"&&t.push(i("command.delivery","unsafe_key")),e.publicSafe!==!0&&t.push(i("command.publicSafe","unsafe_key")),typeof e.expiresAt=="string"&&!Number.isFinite(Date.parse(e.expiresAt))&&t.push(i("command.expiresAt","unsafe_key")),typeof e.workspaceId=="string"&&!P(e.workspaceId)&&t.push(i("command.workspaceId","unsafe_key")),typeof e.workspaceLabel=="string"&&!je(e.workspaceLabel)&&t.push(i("command.workspaceLabel","unsafe_key")),typeof e.runnerId=="string"&&!fe.test(e.runnerId)&&t.push(i("command.runnerId","unsafe_key")),typeof e.projectId=="string"&&!P(e.projectId)&&t.push(i("command.projectId","unsafe_key")),typeof e.projectLabel=="string"&&!je(e.projectLabel)&&t.push(i("command.projectLabel","unsafe_key")),typeof e.reasonCode=="string"&&!V.test(e.reasonCode)&&t.push(i("command.reasonCode","unsafe_key")),t.length>0||!r||!o||!n||!s||!u||!l?{ok:!1,commandId:r,jobId:o,action:n,reasonCode:d.UNSAFE_FIELD_REJECTED,redactions:Et(t)}:{ok:!0,command:{commandId:r,jobId:o,action:n,...c?{decision:c}:{},status:a??"queued",queuedAt:s,...typeof e.expiresAt=="string"?{expiresAt:e.expiresAt}:{},idempotencyKey:u,delivery:l??"runner_poll",...typeof e.workspaceId=="string"?{workspaceId:e.workspaceId}:{},...typeof e.workspaceLabel=="string"?{workspaceLabel:e.workspaceLabel}:{},...typeof e.runnerId=="string"?{runnerId:e.runnerId}:{},...typeof e.projectId=="string"?{projectId:e.projectId}:{},...typeof e.projectLabel=="string"?{projectLabel:e.projectLabel}:{},...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},publicSafe:!0},reasonCode:d.OK,redactions:[]}}function pt(e,t,r){if(t!=="answer_decision"&&t!=="approve_review_gate"&&t!=="deny_review_gate"){e!==void 0&&r.push(i("command.decision","unsafe_key"));return}if(e===void 0){t==="answer_decision"&&r.push(i("command.decision","unsafe_key"));return}if(!D(e)){r.push(i("command.decision","unsafe_key"));return}for(const n of Object.keys(e))(!qe.has(n)||W.test(n))&&r.push(i(`command.decision.${m(n,80)}`,"unsafe_key","key-denied"));const o=typeof e.option=="string"?e.option:void 0;if((!o||!ie.has(o))&&r.push(i("command.decision.option","unsafe_key")),typeof e.decisionId=="string"&&!P(e.decisionId)&&r.push(i("command.decision.decisionId","unsafe_key")),typeof e.gateId=="string"&&!P(e.gateId)&&r.push(i("command.decision.gateId","unsafe_key")),t==="approve_review_gate"&&o!=="approve"&&r.push(i("command.decision.option","unsafe_key")),t==="deny_review_gate"&&o!=="deny"&&r.push(i("command.decision.option","unsafe_key")),!(!o||!ie.has(o)))return{option:o,...typeof e.decisionId=="string"?{decisionId:e.decisionId}:{},...typeof e.gateId=="string"?{gateId:e.gateId}:{},publicSafe:!0}}function mt(e){return D(e)?Array.isArray(e.commands)?e.commands:[]:[]}function x(e,t,r,o,n,a,s){const u=s??be(e),l=r??e.runnerId;return{schemaVersion:K,contractVersion:$,syncVersion:Z,transportKind:"command_ack",actorType:"runner",...l?{actorId:l,runnerId:l}:{},jobId:e.jobId,...e.workspaceId?{workspaceId:e.workspaceId}:{},...e.workspaceLabel?{workspaceLabel:e.workspaceLabel}:{},...e.projectId?{projectId:e.projectId}:{},...e.projectLabel?{projectLabel:e.projectLabel}:{},operationId:t,idempotencyKey:e.idempotencyKey,commandId:e.commandId,commandKind:e.action,...e.decision?{decisionOption:e.decision.option}:{},...e.decision?.decisionId?{decisionId:e.decision.decisionId}:{},...e.decision?.gateId?{gateId:e.decision.gateId}:{},commandStatus:o,auditStatus:o,acknowledgedAt:n,reasonCode:u,redactionCount:a.length,redactionEvidence:a.slice(0,20),counts:{redactions:a.length},publicSummary:`Portal command ${e.action} ${o}.`}}function U(e){return`portal-command-${O(e)}`}function be(e){return e.action==="cancel"||e.action==="deny_review_gate"||e.action==="answer_decision"&&e.decision?.option==="deny"?d.JOB_CANCELLED:e.action==="pause"||e.action==="answer_decision"&&e.decision?.option==="hold"?d.WAITING_HUMAN:d.OK}function It(e){return(e.counts.staleLeases??0)>0||(e.outbox.failed??0)>0||(e.outbox.deadLetter??0)>0||e.queue.backpressure?"degraded":(e.counts.activeLeases??0)>0||e.dueJobCount>0||(e.counts.headlessRunningAttempts??0)>0?"busy":"idle"}function bt(e,t){return{jobs:e.counts.jobs??e.jobs.length,dueJobs:e.dueJobCount,activeLeases:e.counts.activeLeases??0,staleLeases:e.counts.staleLeases??e.staleLeases.length,headlessRunningAttempts:e.counts.headlessRunningAttempts??0,outboxPending:e.outbox.pending??0,outboxFailed:(e.outbox.failed??0)+(e.outbox.deadLetter??0),redactions:t,...N(e)}}function N(e){return{queueDepth:e.queue.depth,queueQueued:e.queue.queued,queueRunning:e.queue.running,queueRetrying:e.queue.retrying,queueDeadLetter:e.queue.deadLetter,queueCapacity:e.queue.capacity,queueAvailable:e.queue.available,queueBackpressure:e.queue.backpressure?1:0}}function At(e,t){return`sync-${A(JSON.stringify({generatedAt:t,counts:e.counts,outbox:e.outbox})).slice(0,24)}`}function Ae(e,t){const r=G(e),o=O(t.workspaceId??r.workspaceId),n=O(t.projectId??r.projectId),a=he(t.projectLabel??(t.projectId?void 0:r.projectLabel),t.projectId?`Project ${n}`:r.projectLabel),s=he(t.workspaceLabel??(t.workspaceId?void 0:r.workspaceLabel),t.workspaceId?`Workspace ${o}`:r.workspaceLabel);return{workspaceId:o,workspaceLabel:s,projectId:n,projectLabel:a}}function _e(e){return`runner-${A(e).slice(0,16)}`}function Ce(e){return`session-${A(`${e}:${process.pid}:${Be}`).slice(0,16)}`}function Se(e){if(!e)return;const t=O(e);return ye.test(t)?t.slice(0,96):void 0}function X(e){return(e.serverUrl??process.env.NEOCORTEX_SERVER_URL??se()?.serverUrl??$e).replace(/\/+$/,"")}async function ee(e){if(e.authToken)return e.authToken;if(e.httpClient)return;const t=X(e),r=e.licenseKey??se()?.licenseKey;if(r)return await new Ke({serverUrl:t,licenseKey:r,clientVersion:e.clientVersion??M}).getToken()??void 0}function Ee(e,t){return async r=>{if(!t)return{ok:!1,status:401,body:{reasonCode:d.AUTH_TOKEN_PERMISSION_FAILURE}};const o=new URL(`${e}${r.path}`);for(const[u,l]of Object.entries(r.query??{}))l!==void 0&&o.searchParams.set(u,l);const n=await fetch(o,{method:r.method,headers:r.headers,body:r.method==="POST"?JSON.stringify(r.body??{}):void 0}),a=await n.text().catch(()=>"");let s;try{s=a?JSON.parse(a):void 0}catch{s=void 0}return{ok:n.ok,status:n.status,body:s}}}function Le(e,t){return{"Content-Type":"application/json","X-Client-Version":m(e,80),...t?{Authorization:`Bearer ${t}`}:{}}}async function F(e,t,r={}){try{const o=_(r.timeoutMs??0,0,6e4),n=o>0?await Ct(e(t),o):await e(t);return n.ok?{ok:!0,body:n.body}:{ok:!1,reasonCode:_t(n.body,n.status),body:n.body}}catch{return{ok:!1,reasonCode:d.BACKOFF_SCHEDULED}}}function _t(e,t){if(D(e)){const r=typeof e.reasonCode=="string"?e.reasonCode:typeof e.error_code=="string"?e.error_code.toLowerCase().replaceAll("_","-"):void 0;if(r&&V.test(r))return r}return t===401||t===403?d.AUTH_TOKEN_PERMISSION_FAILURE:t===400?d.PORTAL_SYNC_PAYLOAD_REJECTED:d.BACKOFF_SCHEDULED}function ke(e){if(D(e)){const r=typeof e.reasonCode=="string"?e.reasonCode:typeof e.code=="string"?e.code:void 0;if(r&&V.test(r))return r}const t=e instanceof Error?e.message:String(e);return/sqlite-adapter-unavailable/i.test(t)?d.SQLITE_ADAPTER_UNAVAILABLE:/integrity|corrupt|malformed|not a database/i.test(t)?d.SQLITE_INTEGRITY_FAILED:d.BACKOFF_SCHEDULED}function Ct(e,t){return new Promise((r,o)=>{const n=setTimeout(()=>o(new Error("portal-http-timeout")),t);typeof n.unref=="function"&&n.unref(),e.then(a=>{clearTimeout(n),r(a)},a=>{clearTimeout(n),o(a)})})}function te(e,t,r){if(typeof e=="string"){g.test(e)&&r.push(i(t,St(e),"value-denied"));return}if(!(e===null||typeof e=="number"||typeof e=="boolean"||e===void 0)){if(Array.isArray(e)){for(const[o,n]of e.entries())te(n,`${t}.${o}`,r);return}if(D(e))for(const[o,n]of Object.entries(e)){const a=`${t}.${m(o,80)}`;W.test(o)&&r.push(i(a,"unsafe_key","key-denied")),te(n,a,r)}}}function St(e){return/https?:\/\//i.test(e)?"private_url":/(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)/i.test(e)?"local_absolute_path":/secret|token|password|api[_-]?key|license[_-]?key|authorization/i.test(e)?"secret":/stdout|stderr|raw[_-]?log|transcript|stack/i.test(e)?"raw_log":/prompt|workflow body|step body/i.test(e)?"prompt_body":"protected_field"}function i(e,t,r="value-denied"){return{field:m(e,120),reason:t,evidence:r,publicSafe:!0}}function Et(e){const t=new Set,r=[];for(const o of e){const n=`${o.field}:${o.reason}:${o.evidence}`;t.has(n)||(t.add(n),r.push(o))}return r.slice(0,20)}function ge(e){const t=O(e);return fe.test(t)?t:`runner-${A(e).slice(0,16)}`}function O(e){if(g.test(e))return`id-${A(e).slice(0,16)}`;const t=e.replace(/[^A-Za-z0-9._:-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,120);return t.length>0?t:`id-${A(e).slice(0,16)}`}function he(e,t){const r=(e??"").replace(/\s+/g," ").trim();if(!r||g.test(r)||me.test(r))return t;const o=r.replace(/[^A-Za-z0-9 ._-]+/g," ").replace(/\s+/g," ").trim();return o?o.length<=80?o:`${o.slice(0,77)}...`:t}function P(e){return ye.test(e)&&!g.test(e)}function je(e){return e.trim().length>0&&e.length<=80&&!g.test(e)&&!me.test(e)}function J(e){return ze.test(e)&&!g.test(e)}function q(e){return V.test(e)&&!g.test(e)?e:d.OK}function Lt(e){return["goal","loop","runner","jobs"].includes(e)?e:"jobs"}function kt(e){return["draft","planned","active","running","waiting_external","waiting_human","backoff","paused","blocked","completed","aborted","cancelled"].includes(e)?e:"active"}function gt(e){return["accepted","applied","ignored","failed","deferred"].includes(e)?e:"accepted"}function Re(e){const t={};for(const[r,o]of Object.entries(e))/^[A-Za-z][A-Za-z0-9_:-]{0,63}$/.test(r)&&Number.isFinite(o)&&o>=0&&(t[r]=Math.trunc(o));return t}function we(e){return e.filter(t=>Number.isFinite(Date.parse(t))).sort()[0]}function _(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,Math.floor(e))):t}function Te(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function ht(e,t,r){if(e<=0)return 0;if(t<=0)return e;const o=Te(r(),0,1),n=Math.floor(e*t*o);return Math.max(0,e+n)}function A(e){return ve("sha256").update(e).digest("hex")}function m(e,t){const r=g.test(e)?"[REDACTED]":e;return r.length<=t?r:`${r.slice(0,t)}...[TRUNCATED:${r.length-t}]`}function D(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Y(e){return Array.from(new Set(e))}function xe(e){return new Promise(t=>setTimeout(t,e))}export{Ve as DEFAULT_RUNNER_HEARTBEAT_BACKOFF_MS,He as DEFAULT_RUNNER_HEARTBEAT_INTERVAL_MS,Ye as DEFAULT_RUNNER_HEARTBEAT_JITTER_RATIO,Je as DEFAULT_RUNNER_HEARTBEAT_TIMEOUT_MS,d as RUNNER_PORTAL_SYNC_REASON_CODES,Ge as runRunnerPortalHeartbeat,vt as runRunnerPortalHeartbeatLoop,Ze as runRunnerPortalSync,Dt as runRunnerPortalSyncLoop};
|
|
1
|
+
import{createHash as ve}from"node:crypto";import{resolve as ae}from"node:path";import{DEFAULT_SERVER_URL as $e}from"../constants.js";import{loadSecureConfig as se}from"../config/secure-config.js";import{LicenseClient as Ke}from"../license/license-client.js";import{CLIENT_VERSION as $}from"../version.js";import{deriveProjectIdentity as G}from"./project-identity.js";import{CONTINUITY_CLIENT_CONTRACT_VERSION as K,CONTINUITY_CLIENT_PORTAL_SYNC_ENVELOPE_VERSION as Z,CONTINUITY_CLIENT_SCHEMA_VERSION as M,ContinuityClientStateStore as de}from"../continuity/continuity-client-state-store.js";import{isContinuityPublicStage as Me,normalizeContinuityStageIteration as Ue,openContinuitySqliteStore as ce,sanitizeContinuityStageHistory as Fe}from"../continuity/sqlite-store.js";const d=Object.freeze({OK:"continuity-ok",AUTH_TOKEN_PERMISSION_FAILURE:"auth-token-permission-failure",BACKOFF_SCHEDULED:"backoff-scheduled",COMMAND_EXPIRED:"command-expired",IDEMPOTENCY_REPLAY:"idempotency-replay",INVALID_STATE_TRANSITION:"invalid-state-transition",JOB_CANCELLED:"job-cancelled",PORTAL_COMMAND_LOCAL_AUDIT_RECORDED:"portal-command-local-audit-recorded",PORTAL_COMMAND_PAYLOAD_REJECTED:"portal-command-payload-rejected",PORTAL_SYNC_PAYLOAD_REJECTED:"portal-sync-payload-rejected",RUNNER_DIRECTIVE_UNTRUSTED:"runner-directive-untrusted",SQLITE_ADAPTER_UNAVAILABLE:"sqlite-adapter-unavailable",SQLITE_INTEGRITY_FAILED:"sqlite-integrity-failed",UNSAFE_FIELD_REJECTED:"unsafe-field-rejected",WAITING_HUMAN:"waiting-human"}),ie=new Set(["approve","deny","hold"]),qe=new Set(["option","decisionId","gateId","publicSafe"]),He=6e4,Ve=3e4,Je=1e4,Ye=.2,Be=`${Date.now()}:${Math.random().toString(16).slice(2)}`,ue=new Set(["pause","resume","cancel","run_once","retry","snapshot","approve_review_gate","deny_review_gate","answer_decision"]),le=new Set(["commandId","jobId","action","decision","status","queuedAt","expiresAt","acknowledgedAt","idempotencyKey","delivery","workspaceId","workspaceLabel","runnerId","projectId","projectLabel","reasonCode","publicSafe"]),ye=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/,fe=/^runner-[A-Za-z0-9._-]{1,80}$/,ze=/^(?:job|goal|loop|runner)-[A-Za-z0-9._-]{1,80}$/,pe=/^pcmd-[a-f0-9]{8,64}$/i,V=/^[a-z0-9][a-z0-9-]{1,80}$/,W=/(raw[_-]?(?:logs?|payloads?)|std(?:out|err)|stack(?:[_-]?trace)?|transcript|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,g=/(https?:\/\/\S+|(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)|ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=|raw[_-]?(?:logs?)\s*[:=]|transcript|stack\s*trace|stderr:|stdout:|system prompt|workflow body|step body|PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|\bPII\b|VENDOR_CORPUS|P180[_-]?SYNTHETIC[_-]?CONTINUITY|P185[_-]?SYNTHETIC[_-]?CONTINUITY|P187[_-]?SYNTHETIC[_-]?(?:CONTINUITY|RUNNER|WATCH)|P190[_-]?SYNTHETIC[_-]?(?:HEADLESS|CONTINUITY)|P192[_-]?SYNTHETIC[_-]?(?:PORTAL|RUNNER|SYNC))/i,me=/(?:[;&|`$<>]|\$\(|\n|\r|\0|(?:^|\s)(?:bash|sh|zsh|fish|cmd\.exe|powershell|pwsh|npm|pnpm|yarn|node|python|ruby|go|cargo|sudo|chmod|curl|wget)\s+(?:-c|run|exec|install|test|build|[A-Za-z0-9_./:-]+))/i;async function Ge(e={}){const t=ae(e.projectRoot??process.cwd()),r=e.now??(()=>new Date().toISOString()),o=r(),n=ge(e.runnerId??_e(t)),a=Se(e.sessionId)??Ce(t),s=Ae(t,e),{workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y}=s,h=e.mode??"background",C=[],S=[],L={heartbeat:!1};let b;try{b=await ce({projectRoot:t,adapter:e.adapter,adapterLoader:e.adapterLoader,now:r});const I=new de(b,r,G(t)).collectSnapshot({nowIso:o,jobLimit:_(e.jobLimit??20,1,50),dueJobLimit:20,eventLimit:1,receiptLimit:1,staleLeaseLimit:20,processingSummaryLimit:1,snapshotLimit:1}),k=e.httpClient?e.authToken:await ee(e),H=e.httpClient??Ee(X(e),k),p=Le(e.clientVersion??$,k),v=Ie(I,{runnerId:n,sessionId:a,identity:s,generatedAt:o,schedulerState:e.schedulerState??"unknown",clientVersion:e.clientVersion??$}),j=await F(H,{method:"POST",path:"/api/v1/continuity/runner/heartbeat",body:v,headers:p},{timeoutMs:e.timeoutMs??e.heartbeatTimeoutMs??Je});j.ok?L.heartbeat=!0:C.push(j.reasonCode);const w=bt(I,S.length);return{ok:L.heartbeat,runnerId:n,sessionId:a,workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y,mode:h,generatedAt:o,serverAccessToLocalhost:!1,serverHeldStream:!1,localhostCallback:!1,posted:L,counts:w,reasonCodes:Y(C.length>0?C:[d.OK]),redactionEvidence:S,publicSafe:!0}}catch(f){const I=ke(f);return{ok:!1,runnerId:n,sessionId:a,workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y,mode:h,generatedAt:o,serverAccessToLocalhost:!1,serverHeldStream:!1,localhostCallback:!1,posted:L,counts:{redactions:S.length},reasonCodes:[I],redactionEvidence:S,publicSafe:!0}}finally{b?.close()}}async function Ze(e={}){const t=ae(e.projectRoot??process.cwd()),r=e.now??(()=>new Date().toISOString()),o=r(),n=ge(e.runnerId??_e(t)),a=Se(e.sessionId)??Ce(t),s=Ae(t,e),{workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y}=s,h=e.mode??"manual",C=[],S=[],L=[],b={heartbeat:!1,runnerSync:!1,commandAcks:0},f={polled:0,applied:0,alreadyApplied:0,rejected:0,expired:0,failedLocal:0};let I;try{I=await ce({projectRoot:t,adapter:e.adapter,adapterLoader:e.adapterLoader,now:r});const k=I.compactPublicReceiptsAndOutputs({nowIso:o,policy:e.retentionPolicy}),p=new de(I,r,G(t)).collectSnapshot({nowIso:o,jobLimit:_(e.jobLimit??50,1,50),dueJobLimit:50,eventLimit:_(e.eventLimit??50,1,100),receiptLimit:_(e.receiptLimit??50,1,100),staleLeaseLimit:20,processingSummaryLimit:20,snapshotLimit:10}),v=At(p,o),j=e.httpClient??Ee(X(e),await ee(e)),w=Le(e.clientVersion??$,e.httpClient?e.authToken:await ee(e)),re=Ie(p,{runnerId:n,sessionId:a,identity:s,generatedAt:o,schedulerState:e.schedulerState??"unknown",clientVersion:e.clientVersion??$}),oe=await F(j,{method:"POST",path:"/api/v1/continuity/runner/heartbeat",body:re,headers:w});oe.ok?b.heartbeat=!0:C.push(oe.reasonCode);const Ne=tt(p,{runnerId:n,identity:s,generatedAt:o,previousSyncCursor:e.syncCursor,nextSyncCursor:v,heartbeat:re}),E=rt(I,p,{runnerId:n,identity:s,generatedAt:o,previousSyncCursor:e.syncCursor,nextSyncCursor:v}),B=E.status==="acked"&&E.replay?{ok:!0,body:{reasonCode:d.IDEMPOTENCY_REPLAY,publicSafe:!0}}:E.status==="conflict"||E.status==="dead_letter"?{ok:!1,reasonCode:E.reasonCode??d.BACKOFF_SCHEDULED}:await F(j,{method:"POST",path:"/api/v1/continuity/jobs/sync",body:Ne,headers:w});B.ok?(b.runnerSync=!0,I.ackOutbox({outboxId:E.outboxId,deliveryCursor:E.deliveryCursor,ackedAt:r(),reasonCode:d.OK})):(C.push(B.reasonCode),I.failOutboxDelivery({outboxId:E.outboxId,deliveryCursor:E.deliveryCursor,failedAt:r(),reasonCode:B.reasonCode,summary:"Runner sync delivery failed with a public reason code and will retry or dead-letter by policy.",policy:{maxAttempts:3}}));const z=await F(j,{method:"GET",path:"/api/v1/continuity/runner/commands",query:{runnerId:n,workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y},headers:w});if(z.ok){const ne=mt(z.body).slice(0,_(e.commandLimit??20,1,20));f.polled=ne.length;for(const De of ne){const R=await We({store:I,http:j,headers:w,rawCommand:De,runnerId:n,identity:s,nowIso:r()});L.push(R),b.commandAcks+=1,R.localStatus==="applied"?f.applied+=1:R.localStatus==="already_applied"?f.alreadyApplied+=1:R.localStatus==="rejected"?f.rejected+=1:R.localStatus==="expired"?f.expired+=1:f.failedLocal+=1,S.push(...R.redactionEvidence),C.push(R.reasonCode)}}else C.push(z.reasonCode);const Oe={jobs:p.counts.jobs??p.jobs.length,dueJobs:p.dueJobCount,receipts:p.counts.receipts??p.lastReceipts.length,events:p.counts.events??p.lastEvents.length,commandsPolled:f.polled,commandAcks:b.commandAcks,commandApplied:f.applied,commandAlreadyApplied:f.alreadyApplied,commandRejected:f.rejected,commandExpired:f.expired,commandFailedLocal:f.failedLocal,receiptCompactionSummaries:k.counts.summariesCreated,receiptsCompacted:k.counts.receiptsRemoved,processingSummariesCompacted:k.counts.outputsRemoved,redactions:S.length,...N(p)},Pe=Y(C.length>0?C:[d.OK]);return{ok:b.heartbeat&&b.runnerSync&&f.failedLocal===0,runnerId:n,sessionId:a,workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y,mode:h,generatedAt:o,serverAccessToLocalhost:!1,serverHeldStream:!1,localhostCallback:!1,posted:b,commandPoll:f,sync:{...e.syncCursor?{previousSyncCursor:e.syncCursor}:{},nextSyncCursor:v,counts:Oe},commandAcks:L,reasonCodes:Pe,redactionEvidence:S.slice(0,50),publicSafe:!0}}catch(k){const H=ke(k);return{ok:!1,runnerId:n,sessionId:a,workspaceId:u,workspaceLabel:l,projectId:c,projectLabel:y,mode:h,generatedAt:o,serverAccessToLocalhost:!1,serverHeldStream:!1,localhostCallback:!1,posted:b,commandPoll:f,sync:{nextSyncCursor:`sync-${A(o).slice(0,24)}`,counts:{commandAcks:0}},commandAcks:L,reasonCodes:[H],redactionEvidence:S,publicSafe:!0}}finally{I?.close()}}async function vt(e={}){const t=_(e.maxRuns??1,1,1e4),r=_(e.intervalMs??6e4,0,1440*60*1e3),o=[];let n=e.syncCursor;for(let a=0;a<t;a++){const s=await Ze({...e,mode:e.mode??"background",syncCursor:n});o.push(s),n=s.sync.nextSyncCursor,a<t-1&&r>0&&await xe(r)}return{ok:o.every(a=>a.ok),runs:o,reasonCodes:Y(o.flatMap(a=>a.reasonCodes)),publicSafe:!0}}async function $t(e={}){const t=_(e.maxRuns??1,1,1e4),r=_(e.intervalMs??He,0,1440*60*1e3),o=_(e.backoffMs??Ve,1e3,1800*1e3),n=Te(e.jitterRatio??Ye,0,.5),a=e.random??Math.random,s=[];for(let u=0;u<t;u++){const l=await Ge({...e,mode:e.mode??"background"});if(s.push(l),u<t-1){const c=l.ok?r:o,y=ht(c,n,a);y>0&&await xe(y)}}return{ok:s.every(u=>u.ok),runs:s,reasonCodes:Y(s.flatMap(u=>u.reasonCodes)),schedule:{intervalMs:r,backoffMs:o,jitterRatio:n,maxRuns:t},publicSafe:!0}}async function We(e){const t=ft(e.rawCommand);if(!t.ok||!t.command)return Xe(e.store,t,e.runnerId,e.nowIso),T(e.http,e.headers,{commandId:t.commandId??`pcmd-${A("invalid-command").slice(0,16)}`,jobId:t.jobId,action:t.action,runnerId:e.runnerId,identity:e.identity,idempotencyKey:`invalid:${t.commandId??"unknown"}`,localStatus:"rejected",remoteStatus:"rejected",reasonCode:d.PORTAL_COMMAND_PAYLOAD_REJECTED,publicSummary:"Runner rejected unsafe Portal command before local application.",acknowledgedAt:e.nowIso,redactionEvidence:t.redactions,counts:{rejected:1,redactions:t.redactions.length}});const r=t.command,o=U(r.commandId),n={commandId:r.commandId,jobId:r.jobId,action:r.action,runnerId:e.runnerId,identity:e.identity,idempotencyKey:r.idempotencyKey,acknowledgedAt:e.nowIso,redactionEvidence:t.redactions};if(r.expiresAt&&Date.parse(r.expiresAt)<=Date.parse(e.nowIso))return Q(e.store,r,{operationId:o,status:"ignored",reasonCode:d.COMMAND_EXPIRED,createdAt:e.nowIso,summary:"Portal command expired before local application.",redactionEvidence:t.redactions}),T(e.http,e.headers,{...n,localStatus:"expired",remoteStatus:"expired",reasonCode:d.COMMAND_EXPIRED,publicSummary:"Runner skipped expired Portal command.",counts:{expired:1}});if(e.store.hasOperationRef(o,r.idempotencyKey))return et(e.store,r,o,e.runnerId,e.nowIso,t.redactions),T(e.http,e.headers,{...n,localStatus:"already_applied",remoteStatus:"applied",reasonCode:d.IDEMPOTENCY_REPLAY,publicSummary:"Runner already applied Portal command; duplicate poll was acknowledged without local mutation.",counts:{alreadyApplied:1}});if(!e.store.jobExists(r.jobId))return T(e.http,e.headers,{...n,localStatus:"failed-local",remoteStatus:"rejected",reasonCode:d.INVALID_STATE_TRANSITION,publicSummary:"Runner could not find the public job for Portal command application.",counts:{failedLocal:1}});try{const a=be(r);return e.store.runInTransaction(()=>{Qe(e.store,r,e.nowIso),e.store.appendEvent({eventId:`${o}:event`,jobId:r.jobId,operationId:o,idempotencyKey:r.idempotencyKey,type:"portal_command_applied",summary:`Portal command ${r.action} applied locally by runner.`,reasonCode:a,createdAt:e.nowIso,metadata:x(r,o,e.runnerId,"applied",e.nowIso,t.redactions,a)}),e.store.appendReceipt({receiptId:`receipt-${o}`,jobId:r.jobId,operationId:o,idempotencyKey:r.idempotencyKey,status:"applied",reasonCode:a,appliedOperationIds:[o],createdAt:e.nowIso,metadata:x(r,o,e.runnerId,"applied",e.nowIso,t.redactions,a)})}),T(e.http,e.headers,{...n,localStatus:"applied",remoteStatus:"applied",reasonCode:a,publicSummary:`Runner applied Portal command ${r.action} locally.`,counts:{applied:1}})}catch{return Q(e.store,r,{operationId:o,status:"failed",reasonCode:d.INVALID_STATE_TRANSITION,createdAt:e.nowIso,summary:"Portal command failed local application with public reason code.",redactionEvidence:t.redactions}),T(e.http,e.headers,{...n,localStatus:"failed-local",remoteStatus:"rejected",reasonCode:d.INVALID_STATE_TRANSITION,publicSummary:"Runner failed local Portal command application with public reason code.",counts:{failedLocal:1}})}}function Qe(e,t,r){switch(t.action){case"pause":e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"paused",updatedAt:r,reasonCode:d.WAITING_HUMAN});return;case"resume":case"approve_review_gate":e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"active",updatedAt:r,reasonCode:d.OK});return;case"cancel":case"deny_review_gate":e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"cancelled",updatedAt:r,reasonCode:d.JOB_CANCELLED});return;case"answer_decision":if(t.decision?.option==="approve"){e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"active",updatedAt:r,reasonCode:d.OK});return}if(t.decision?.option==="deny"){e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"cancelled",updatedAt:r,reasonCode:d.JOB_CANCELLED});return}if(t.decision?.option==="hold"){e.updateJobAndExistingGoalCampaignStatus({jobId:t.jobId,status:"blocked",updatedAt:r,reasonCode:d.WAITING_HUMAN});return}throw new Error("unsupported-review-gate-decision");case"run_once":case"retry":e.scheduleNextTick({jobId:t.jobId,scheduledAt:r,updatedAt:r,reasonCode:d.OK});return;case"snapshot":e.recordStateSnapshot({snapshotId:`snapshot-${U(t.commandId)}`,jobId:t.jobId,kind:"portal_command_snapshot",summary:"Portal snapshot command recorded public local state checkpoint request.",capturedAt:r,operationId:U(t.commandId),idempotencyKey:t.idempotencyKey,metadata:x(t,U(t.commandId),t.runnerId,"applied",r,[],d.OK)});return;default:throw new Error("unsupported-command-action")}}async function T(e,t,r){return await F(e,{method:"POST",path:`/api/v1/continuity/runner/commands/${encodeURIComponent(r.commandId)}/ack`,body:{status:r.remoteStatus,runnerId:r.runnerId,workspaceId:r.identity.workspaceId,workspaceLabel:r.identity.workspaceLabel,projectId:r.identity.projectId,projectLabel:r.identity.projectLabel,idempotencyKey:r.idempotencyKey,reasonCode:r.reasonCode,publicSummary:m(r.publicSummary,280),counts:Re(r.counts),redactionEvidence:r.redactionEvidence.slice(0,20),publicSafe:!0},headers:t}),{commandId:r.commandId,...r.jobId?{jobId:r.jobId}:{},workspaceId:r.identity.workspaceId,workspaceLabel:r.identity.workspaceLabel,projectId:r.identity.projectId,projectLabel:r.identity.projectLabel,...r.action?{action:r.action}:{},localStatus:r.localStatus,remoteStatus:r.remoteStatus,reasonCode:r.reasonCode,publicSummary:m(r.publicSummary,280),acknowledgedAt:r.acknowledgedAt,counts:r.counts,redactionEvidence:r.redactionEvidence.slice(0,20),publicSafe:!0}}function Q(e,t,r){try{if(!e.jobExists(t.jobId)||e.hasOperationRef(r.operationId,t.idempotencyKey))return;e.appendReceipt({receiptId:`receipt-${r.operationId}`,jobId:t.jobId,operationId:r.operationId,idempotencyKey:t.idempotencyKey,status:r.status,reasonCode:r.reasonCode,ignoredOperationIds:[r.operationId],createdAt:r.createdAt,metadata:x(t,r.operationId,t.runnerId,r.status,r.createdAt,r.redactionEvidence,r.reasonCode)}),e.appendEvent({eventId:`${r.operationId}:event`,jobId:t.jobId,operationId:`${r.operationId}:event`,idempotencyKey:`${t.idempotencyKey}:event`,type:r.status==="failed"?"portal_command_failed":"portal_command_rejected",summary:r.summary,reasonCode:r.reasonCode,createdAt:r.createdAt,metadata:x(t,r.operationId,t.runnerId,r.status,r.createdAt,r.redactionEvidence,r.reasonCode)})}catch{}}function Xe(e,t,r,o){if(!t.commandId||!pe.test(t.commandId)||!t.jobId||!J(t.jobId)||!t.action||!ue.has(t.action))return;const n={commandId:t.commandId,jobId:t.jobId,action:t.action,status:"queued",queuedAt:o,idempotencyKey:`rejected:${t.commandId}`,delivery:"runner_poll",runnerId:r,reasonCode:d.PORTAL_COMMAND_PAYLOAD_REJECTED,publicSafe:!0};Q(e,n,{operationId:`${U(t.commandId)}:rejected`,status:"ignored",reasonCode:d.PORTAL_COMMAND_PAYLOAD_REJECTED,createdAt:o,summary:"Runner rejected unsafe Portal command before local application.",redactionEvidence:t.redactions})}function et(e,t,r,o,n,a){const s=`${r}:replay`;try{if(!e.jobExists(t.jobId)||e.hasOperationRef(s,`${t.idempotencyKey}:replay`))return;e.appendEvent({eventId:`${s}:event`,jobId:t.jobId,operationId:s,idempotencyKey:`${t.idempotencyKey}:replay`,type:"portal_command_replay",summary:"Runner recorded idempotent Portal command replay without local mutation.",reasonCode:d.IDEMPOTENCY_REPLAY,createdAt:n,metadata:x(t,s,o,"already_applied",n,a,d.IDEMPOTENCY_REPLAY)})}catch{}}function Ie(e,t){const r=It(e),o=e.jobs.filter(s=>["planned","active","running","backoff","waiting_external","waiting_human"].includes(s.status)).map(s=>s.jobId).filter(J).slice(0,20),n=e.staleLeases.map(s=>s.leaseId).filter(P).slice(0,20),a=we(e.dueJobs.map(s=>s.nextRunAt).filter(s=>!!s));return{schemaVersion:M,contractVersion:K,runnerId:t.runnerId,...t.sessionId?{sessionId:t.sessionId}:{},workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,status:r,observedAt:t.generatedAt,version:m(t.clientVersion,80),activeJobIds:o,leaseIds:n,...a?{nextTickAt:a}:{},schedulerState:t.schedulerState,doctorSummary:r==="degraded"?"Runner sync is degraded by public stale lease or retryable outbox counts.":"Runner sync heartbeat contains public local continuity summaries.",reasonCode:r==="degraded"?d.BACKOFF_SCHEDULED:d.OK,queue:{depth:e.queue.depth,queued:e.queue.queued,running:e.queue.running,retrying:e.queue.retrying,deadLetter:e.queue.deadLetter,capacity:e.queue.capacity,available:e.queue.available,backpressure:e.queue.backpressure,generatedAt:e.queue.generatedAt,...e.queue.nextRetryAt?{nextRetryAt:e.queue.nextRetryAt}:{},...e.queue.reasonCode?{reasonCode:q(e.queue.reasonCode)}:{},publicSafe:!0},metadata:{schemaVersion:M,contractVersion:K,transportKind:"runner_heartbeat",...t.sessionId?{sessionId:t.sessionId}:{},workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,observedAt:t.generatedAt,serverAccessToLocalhost:!1,serverHeldStream:!1,counts:{jobs:e.counts.jobs??e.jobs.length,dueJobs:e.dueJobCount,activeLeases:e.counts.activeLeases??0,staleLeases:e.counts.staleLeases??e.staleLeases.length,outboxPending:e.outbox.pending??0,outboxFailed:(e.outbox.failed??0)+(e.outbox.deadLetter??0),...N(e)},reasonCodes:[r==="degraded"?d.BACKOFF_SCHEDULED:d.OK],publicSummary:"Runner heartbeat generated from local continuity SQLite public summaries."},publicSafe:!0}}function tt(e,t){const r=e.jobs.map(s=>dt(s,t.identity,e)).slice(0,50),o=[...e.lastEvents.map(it),...(e.headlessExecutionAttempts??[]).map(ut)].slice(0,100),n=e.lastReceipts.map(lt).slice(0,100),a=yt(e,t.generatedAt);return{runnerId:t.runnerId,workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,runner:{...t.heartbeat,metadata:{schemaVersion:M,contractVersion:K,syncVersion:Z,transportKind:"runner_sync",workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,syncCursor:t.previousSyncCursor??"sync-initial",nextSyncCursor:t.nextSyncCursor,generatedAt:t.generatedAt,serverAccessToLocalhost:!1,serverHeldStream:!1,counts:{jobs:r.length,events:o.length,receipts:n.length,outbox:a.length,headlessExecutionAttempts:e.headlessExecutionAttempts?.length??0,...N(e)},publicSummary:"Runner sync uploaded public job, event and receipt summaries."}},jobs:r,events:o,receipts:n,outbox:a,runnerSync:{runnerId:t.runnerId,workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,syncCursor:t.previousSyncCursor??"sync-initial",nextSyncCursor:t.nextSyncCursor,generatedAt:t.generatedAt,publicSummary:"Runner sync uploaded public job, event and receipt summaries.",counts:{jobs:r.length,events:o.length,receipts:n.length,outbox:a.length,...N(e)},publicSafe:!0}}}function rt(e,t,r){const o=ot({runnerId:r.runnerId,workspaceId:r.identity.workspaceId,projectId:r.identity.projectId,nextSyncCursor:r.nextSyncCursor}),n=nt({runnerId:r.runnerId,workspaceId:r.identity.workspaceId,projectId:r.identity.projectId,nextSyncCursor:r.nextSyncCursor});return e.enqueueOutbox({outboxId:o,jobId:st(t),operationId:`op-${o}`,idempotencyKey:`idem-${o}`,type:"runner_sync",status:"pending",payload:at(t,r),createdAt:r.generatedAt,updatedAt:r.generatedAt}),e.markOutboxSent({outboxId:o,deliveryCursor:n,sentAt:r.generatedAt,reasonCode:d.OK})}function ot(e){return`outbox-runner-sync-${A(`${e.runnerId}:${e.workspaceId}:${e.projectId??"project"}:${e.nextSyncCursor}`).slice(0,32)}`}function nt(e){return`cursor-runner-sync-${A(`${e.workspaceId}:${e.projectId??"project"}:${e.runnerId}:${e.nextSyncCursor}`).slice(0,32)}`}function at(e,t){return{schemaVersion:M,contractVersion:K,syncVersion:Z,transportKind:"runner_sync",envelopeId:`runner-sync-${A(`${t.runnerId}:${t.nextSyncCursor}`).slice(0,24)}`,runnerId:t.runnerId,workspaceId:t.identity.workspaceId,workspaceLabel:t.identity.workspaceLabel,projectId:t.identity.projectId,projectLabel:t.identity.projectLabel,syncCursor:t.previousSyncCursor??"sync-initial",nextSyncCursor:t.nextSyncCursor,generatedAt:t.generatedAt,serverAccessToLocalhost:!1,serverHeldStream:!1,counts:{jobs:e.counts.jobs??e.jobs.length,events:e.counts.events??e.lastEvents.length,receipts:e.counts.receipts??e.lastReceipts.length,outboxPending:e.outbox.pending??0,outboxFailed:e.outbox.failed??0,outboxDeadLetter:e.outbox.deadLetter??0,headlessExecutionAttempts:e.headlessExecutionAttempts?.length??0,...N(e)},redactionEvidence:[{field:"runnerSyncBody",reason:"unbounded_text",evidence:"operation-denied",publicSafe:!0}],publicSummary:"Runner sync outbox stores public IDs, counts, redaction evidence and cursor state only."}}function st(e){return e.jobs.map(t=>t.jobId).find(J)}function dt(e,t,r){const o=Me(e.currentStage)?e.currentStage:void 0,n=Fe(e.stageHistory),a=Ue(e.iteration),s=ct(e.jobId,r);return{jobId:e.jobId,workspaceId:t.workspaceId,workspaceLabel:t.workspaceLabel,projectId:t.projectId,projectLabel:t.projectLabel,kind:Lt(e.kind),status:kt(e.status),publicSummary:m(e.publicSummary,240),updatedAt:e.updatedAt,...e.nextRunAt?{nextRunAt:e.nextRunAt}:{},...e.reasonCode?{reasonCode:q(e.reasonCode)}:{},...e.counts?{counts:Re(e.counts)}:{},...s?{operations:s}:{},...o?{currentStage:o}:{},...n.length>0?{stageHistory:n}:{},...a!==void 0?{iteration:a}:{},publicSafe:!0}}function ct(e,t){const r=(t.headlessExecutionAttempts??[]).filter(c=>c.jobId===e).slice(0,50),o=t.staleLeases.filter(c=>c.jobId===e).slice(0,50);if(r.length===0&&o.length===0)return;const n=r.filter(c=>c.status==="backoff"||c.retryCount>0&&!!c.nextRetryAt).length,a=r.filter(c=>!!c.deadLetteredAt||c.status==="dead_letter").length,s=r.filter(c=>["queued","pending","backoff"].includes(c.status)).length,u=we(r.map(c=>c.nextRetryAt).filter(c=>!!c)),l=[...r].map(c=>c.leaseExpiresAt).filter(c=>!!c).sort().at(-1);return{attempts:r.length,retries:r.reduce((c,y)=>c+Math.max(0,Math.trunc(y.retryCount)),0),retrying:n,deadLetter:a,activeLeases:r.filter(c=>!!c.leaseId&&c.status==="running").length,staleLeases:o.length,queueDepth:s,backpressure:t.queue.backpressure&&s>0,generatedAt:t.generatedAt,...u?{nextRetryAt:u}:{},...l?{latestLeaseExpiresAt:l}:{},publicSafe:!0}}function it(e){return{eventId:e.eventId,jobId:e.jobId,operationId:e.operationId,type:m(e.type,80),summary:m(e.publicSummary,240),publicSummary:m(e.publicSummary,240),createdAt:e.createdAt,...e.metadata?{metadata:e.metadata}:{},...e.reasonCode?{reasonCode:q(e.reasonCode)}:{},publicSafe:!0}}function ut(e){return{eventId:`headless-${O(e.attemptId)}`,jobId:e.jobId,operationId:e.executionId,type:"headless_execution_attempt",summary:m(e.publicSummary,240),publicSummary:m(e.publicSummary,240),createdAt:e.heartbeatAt??e.enqueuedAt,...e.reasonCode?{reasonCode:q(e.reasonCode)}:{},publicSafe:!0}}function lt(e){return{receiptId:e.receiptId,jobId:e.jobId,...e.operationId?{operationId:e.operationId}:{},status:gt(e.status),summary:`Runner receipt ${e.status} for ${e.jobId}.`,createdAt:e.createdAt,...e.reasonCode?{reasonCode:q(e.reasonCode)}:{},publicSafe:!0}}function yt(e,t){const r=[];for(const[o,n]of Object.entries(e.outbox))o==="total"||!Number.isFinite(n)||n<=0||r.push({outboxId:`outbox-${o}`,operationId:`outbox-${o}-${A(t).slice(0,12)}`,status:o==="failed"||o==="deadLetter"?"failed":o==="acked"||o==="sent"?"applied":"accepted",summary:`Outbox ${o} count ${Math.trunc(n)} synced as public status evidence.`,updatedAt:t,reasonCode:o==="failed"||o==="deadLetter"?d.BACKOFF_SCHEDULED:d.OK,counts:{[o]:Math.trunc(n)},publicSafe:!0});return r.slice(0,20)}function ft(e){const t=[];if(!D(e))return t.push(i("command","unsafe_key","operation-denied")),{ok:!1,reasonCode:d.UNSAFE_FIELD_REJECTED,redactions:t};for(const y of Object.keys(e))(!le.has(y)||W.test(y))&&t.push(i(`command.${m(y,80)}`,"unsafe_key","key-denied"));for(const[y,h]of Object.entries(e))le.has(y)&&te(h,`command.${y}`,t);const r=typeof e.commandId=="string"?e.commandId:void 0,o=typeof e.jobId=="string"?e.jobId:void 0,n=typeof e.action=="string"?e.action:void 0,a=typeof e.status=="string"?e.status:void 0,s=typeof e.queuedAt=="string"?e.queuedAt:void 0,u=typeof e.idempotencyKey=="string"?e.idempotencyKey:void 0,l=typeof e.delivery=="string"?e.delivery:void 0;(!r||!pe.test(r))&&t.push(i("command.commandId","unsafe_key")),(!o||!J(o))&&t.push(i("command.jobId","unsafe_key")),(!n||!ue.has(n))&&t.push(i("command.action","unsafe_key")),a!=="queued"&&t.push(i("command.status","unsafe_key"));const c=pt(e.decision,n,t);return(!s||!Number.isFinite(Date.parse(s)))&&t.push(i("command.queuedAt","unsafe_key")),(!u||!P(u))&&t.push(i("command.idempotencyKey","unsafe_key")),l!=="runner_poll"&&t.push(i("command.delivery","unsafe_key")),e.publicSafe!==!0&&t.push(i("command.publicSafe","unsafe_key")),typeof e.expiresAt=="string"&&!Number.isFinite(Date.parse(e.expiresAt))&&t.push(i("command.expiresAt","unsafe_key")),typeof e.workspaceId=="string"&&!P(e.workspaceId)&&t.push(i("command.workspaceId","unsafe_key")),typeof e.workspaceLabel=="string"&&!je(e.workspaceLabel)&&t.push(i("command.workspaceLabel","unsafe_key")),typeof e.runnerId=="string"&&!fe.test(e.runnerId)&&t.push(i("command.runnerId","unsafe_key")),typeof e.projectId=="string"&&!P(e.projectId)&&t.push(i("command.projectId","unsafe_key")),typeof e.projectLabel=="string"&&!je(e.projectLabel)&&t.push(i("command.projectLabel","unsafe_key")),typeof e.reasonCode=="string"&&!V.test(e.reasonCode)&&t.push(i("command.reasonCode","unsafe_key")),t.length>0||!r||!o||!n||!s||!u||!l?{ok:!1,commandId:r,jobId:o,action:n,reasonCode:d.UNSAFE_FIELD_REJECTED,redactions:Et(t)}:{ok:!0,command:{commandId:r,jobId:o,action:n,...c?{decision:c}:{},status:a??"queued",queuedAt:s,...typeof e.expiresAt=="string"?{expiresAt:e.expiresAt}:{},idempotencyKey:u,delivery:l??"runner_poll",...typeof e.workspaceId=="string"?{workspaceId:e.workspaceId}:{},...typeof e.workspaceLabel=="string"?{workspaceLabel:e.workspaceLabel}:{},...typeof e.runnerId=="string"?{runnerId:e.runnerId}:{},...typeof e.projectId=="string"?{projectId:e.projectId}:{},...typeof e.projectLabel=="string"?{projectLabel:e.projectLabel}:{},...typeof e.reasonCode=="string"?{reasonCode:e.reasonCode}:{},publicSafe:!0},reasonCode:d.OK,redactions:[]}}function pt(e,t,r){if(t!=="answer_decision"&&t!=="approve_review_gate"&&t!=="deny_review_gate"){e!==void 0&&r.push(i("command.decision","unsafe_key"));return}if(e===void 0){t==="answer_decision"&&r.push(i("command.decision","unsafe_key"));return}if(!D(e)){r.push(i("command.decision","unsafe_key"));return}for(const n of Object.keys(e))(!qe.has(n)||W.test(n))&&r.push(i(`command.decision.${m(n,80)}`,"unsafe_key","key-denied"));const o=typeof e.option=="string"?e.option:void 0;if((!o||!ie.has(o))&&r.push(i("command.decision.option","unsafe_key")),typeof e.decisionId=="string"&&!P(e.decisionId)&&r.push(i("command.decision.decisionId","unsafe_key")),typeof e.gateId=="string"&&!P(e.gateId)&&r.push(i("command.decision.gateId","unsafe_key")),t==="approve_review_gate"&&o!=="approve"&&r.push(i("command.decision.option","unsafe_key")),t==="deny_review_gate"&&o!=="deny"&&r.push(i("command.decision.option","unsafe_key")),!(!o||!ie.has(o)))return{option:o,...typeof e.decisionId=="string"?{decisionId:e.decisionId}:{},...typeof e.gateId=="string"?{gateId:e.gateId}:{},publicSafe:!0}}function mt(e){return D(e)?Array.isArray(e.commands)?e.commands:[]:[]}function x(e,t,r,o,n,a,s){const u=s??be(e),l=r??e.runnerId;return{schemaVersion:M,contractVersion:K,syncVersion:Z,transportKind:"command_ack",actorType:"runner",...l?{actorId:l,runnerId:l}:{},jobId:e.jobId,...e.workspaceId?{workspaceId:e.workspaceId}:{},...e.workspaceLabel?{workspaceLabel:e.workspaceLabel}:{},...e.projectId?{projectId:e.projectId}:{},...e.projectLabel?{projectLabel:e.projectLabel}:{},operationId:t,idempotencyKey:e.idempotencyKey,commandId:e.commandId,commandKind:e.action,...e.decision?{decisionOption:e.decision.option}:{},...e.decision?.decisionId?{decisionId:e.decision.decisionId}:{},...e.decision?.gateId?{gateId:e.decision.gateId}:{},commandStatus:o,auditStatus:o,acknowledgedAt:n,reasonCode:u,redactionCount:a.length,redactionEvidence:a.slice(0,20),counts:{redactions:a.length},publicSummary:`Portal command ${e.action} ${o}.`}}function U(e){return`portal-command-${O(e)}`}function be(e){return e.action==="cancel"||e.action==="deny_review_gate"||e.action==="answer_decision"&&e.decision?.option==="deny"?d.JOB_CANCELLED:e.action==="pause"||e.action==="answer_decision"&&e.decision?.option==="hold"?d.WAITING_HUMAN:d.OK}function It(e){return(e.counts.staleLeases??0)>0||(e.outbox.failed??0)>0||(e.outbox.deadLetter??0)>0||e.queue.backpressure?"degraded":(e.counts.activeLeases??0)>0||e.dueJobCount>0||(e.counts.headlessRunningAttempts??0)>0?"busy":"idle"}function bt(e,t){return{jobs:e.counts.jobs??e.jobs.length,dueJobs:e.dueJobCount,activeLeases:e.counts.activeLeases??0,staleLeases:e.counts.staleLeases??e.staleLeases.length,headlessRunningAttempts:e.counts.headlessRunningAttempts??0,outboxPending:e.outbox.pending??0,outboxFailed:(e.outbox.failed??0)+(e.outbox.deadLetter??0),redactions:t,...N(e)}}function N(e){return{queueDepth:e.queue.depth,queueQueued:e.queue.queued,queueRunning:e.queue.running,queueRetrying:e.queue.retrying,queueDeadLetter:e.queue.deadLetter,queueCapacity:e.queue.capacity,queueAvailable:e.queue.available,queueBackpressure:e.queue.backpressure?1:0}}function At(e,t){return`sync-${A(JSON.stringify({generatedAt:t,counts:e.counts,outbox:e.outbox})).slice(0,24)}`}function Ae(e,t){const r=G(e),o=O(t.workspaceId??r.workspaceId),n=O(t.projectId??r.projectId),a=he(t.projectLabel??(t.projectId?void 0:r.projectLabel),t.projectId?`Project ${n}`:r.projectLabel),s=he(t.workspaceLabel??(t.workspaceId?void 0:r.workspaceLabel),t.workspaceId?`Workspace ${o}`:r.workspaceLabel);return{workspaceId:o,workspaceLabel:s,projectId:n,projectLabel:a}}function _e(e){return`runner-${A(e).slice(0,16)}`}function Ce(e){return`session-${A(`${e}:${process.pid}:${Be}`).slice(0,16)}`}function Se(e){if(!e)return;const t=O(e);return ye.test(t)?t.slice(0,96):void 0}function X(e){return(e.serverUrl??process.env.NEOCORTEX_SERVER_URL??se()?.serverUrl??$e).replace(/\/+$/,"")}async function ee(e){if(e.authToken)return e.authToken;if(e.httpClient)return;const t=X(e),r=e.licenseKey??se()?.licenseKey;if(r)return await new Ke({serverUrl:t,licenseKey:r,clientVersion:e.clientVersion??$}).getToken()??void 0}function Ee(e,t){return async r=>{if(!t)return{ok:!1,status:401,body:{reasonCode:d.AUTH_TOKEN_PERMISSION_FAILURE}};const o=new URL(`${e}${r.path}`);for(const[u,l]of Object.entries(r.query??{}))l!==void 0&&o.searchParams.set(u,l);const n=await fetch(o,{method:r.method,headers:r.headers,body:r.method==="POST"?JSON.stringify(r.body??{}):void 0}),a=await n.text().catch(()=>"");let s;try{s=a?JSON.parse(a):void 0}catch{s=void 0}return{ok:n.ok,status:n.status,body:s}}}function Le(e,t){return{"Content-Type":"application/json","X-Client-Version":m(e,80),...t?{Authorization:`Bearer ${t}`}:{}}}async function F(e,t,r={}){try{const o=_(r.timeoutMs??0,0,6e4),n=o>0?await Ct(e(t),o):await e(t);return n.ok?{ok:!0,body:n.body}:{ok:!1,reasonCode:_t(n.body,n.status),body:n.body}}catch{return{ok:!1,reasonCode:d.BACKOFF_SCHEDULED}}}function _t(e,t){if(D(e)){const r=typeof e.reasonCode=="string"?e.reasonCode:typeof e.error_code=="string"?e.error_code.toLowerCase().replaceAll("_","-"):void 0;if(r&&V.test(r))return r}return t===401||t===403?d.AUTH_TOKEN_PERMISSION_FAILURE:t===400?d.PORTAL_SYNC_PAYLOAD_REJECTED:d.BACKOFF_SCHEDULED}function ke(e){if(D(e)){const r=typeof e.reasonCode=="string"?e.reasonCode:typeof e.code=="string"?e.code:void 0;if(r&&V.test(r))return r}const t=e instanceof Error?e.message:String(e);return/sqlite-adapter-unavailable/i.test(t)?d.SQLITE_ADAPTER_UNAVAILABLE:/integrity|corrupt|malformed|not a database/i.test(t)?d.SQLITE_INTEGRITY_FAILED:d.BACKOFF_SCHEDULED}function Ct(e,t){return new Promise((r,o)=>{const n=setTimeout(()=>o(new Error("portal-http-timeout")),t);typeof n.unref=="function"&&n.unref(),e.then(a=>{clearTimeout(n),r(a)},a=>{clearTimeout(n),o(a)})})}function te(e,t,r){if(typeof e=="string"){g.test(e)&&r.push(i(t,St(e),"value-denied"));return}if(!(e===null||typeof e=="number"||typeof e=="boolean"||e===void 0)){if(Array.isArray(e)){for(const[o,n]of e.entries())te(n,`${t}.${o}`,r);return}if(D(e))for(const[o,n]of Object.entries(e)){const a=`${t}.${m(o,80)}`;W.test(o)&&r.push(i(a,"unsafe_key","key-denied")),te(n,a,r)}}}function St(e){return/https?:\/\//i.test(e)?"private_url":/(?:^|\s)(?:\/(?:home|Users|media|mnt|tmp|var|etc|private)\/\S+|[A-Za-z]:\\\S+)/i.test(e)?"local_absolute_path":/secret|token|password|api[_-]?key|license[_-]?key|authorization/i.test(e)?"secret":/stdout|stderr|raw[_-]?log|transcript|stack/i.test(e)?"raw_log":/prompt|workflow body|step body/i.test(e)?"prompt_body":"protected_field"}function i(e,t,r="value-denied"){return{field:m(e,120),reason:t,evidence:r,publicSafe:!0}}function Et(e){const t=new Set,r=[];for(const o of e){const n=`${o.field}:${o.reason}:${o.evidence}`;t.has(n)||(t.add(n),r.push(o))}return r.slice(0,20)}function ge(e){const t=O(e);return fe.test(t)?t:`runner-${A(e).slice(0,16)}`}function O(e){if(g.test(e))return`id-${A(e).slice(0,16)}`;const t=e.replace(/[^A-Za-z0-9._:-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,120);return t.length>0?t:`id-${A(e).slice(0,16)}`}function he(e,t){const r=(e??"").replace(/\s+/g," ").trim();if(!r||g.test(r)||me.test(r))return t;const o=r.replace(/[^A-Za-z0-9 ._-]+/g," ").replace(/\s+/g," ").trim();return o?o.length<=80?o:`${o.slice(0,77)}...`:t}function P(e){return ye.test(e)&&!g.test(e)}function je(e){return e.trim().length>0&&e.length<=80&&!g.test(e)&&!me.test(e)}function J(e){return ze.test(e)&&!g.test(e)}function q(e){return V.test(e)&&!g.test(e)?e:d.OK}function Lt(e){return["goal","loop","runner","jobs"].includes(e)?e:"jobs"}function kt(e){return["draft","planned","active","running","waiting_external","waiting_human","backoff","paused","blocked","completed","aborted","cancelled"].includes(e)?e:"active"}function gt(e){return["accepted","applied","ignored","failed","deferred"].includes(e)?e:"accepted"}function Re(e){const t={};for(const[r,o]of Object.entries(e))/^[A-Za-z][A-Za-z0-9_:-]{0,63}$/.test(r)&&Number.isFinite(o)&&o>=0&&(t[r]=Math.trunc(o));return t}function we(e){return e.filter(t=>Number.isFinite(Date.parse(t))).sort()[0]}function _(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,Math.floor(e))):t}function Te(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function ht(e,t,r){if(e<=0)return 0;if(t<=0)return e;const o=Te(r(),0,1),n=Math.floor(e*t*o);return Math.max(0,e+n)}function A(e){return ve("sha256").update(e).digest("hex")}function m(e,t){const r=g.test(e)?"[REDACTED]":e;return r.length<=t?r:`${r.slice(0,t)}...[TRUNCATED:${r.length-t}]`}function D(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Y(e){return Array.from(new Set(e))}function xe(e){return new Promise(t=>setTimeout(t,e))}export{Ve as DEFAULT_RUNNER_HEARTBEAT_BACKOFF_MS,He as DEFAULT_RUNNER_HEARTBEAT_INTERVAL_MS,Ye as DEFAULT_RUNNER_HEARTBEAT_JITTER_RATIO,Je as DEFAULT_RUNNER_HEARTBEAT_TIMEOUT_MS,d as RUNNER_PORTAL_SYNC_REASON_CODES,Ge as runRunnerPortalHeartbeat,$t as runRunnerPortalHeartbeatLoop,Ze as runRunnerPortalSync,vt as runRunnerPortalSyncLoop};
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* `neocortex-runner`.
|
|
7
7
|
*/
|
|
8
8
|
import { type RunnerBinaryResolveOptions, type RunnerBinaryResolution } from './binary.js';
|
|
9
|
+
import type { InvokeEffectContext } from '../../../shared/dist/strict-readonly.js';
|
|
9
10
|
export declare const SCHEDULER_REASON_CODES: Readonly<{
|
|
10
11
|
readonly OK: "continuity-ok";
|
|
11
12
|
readonly SCHEDULER_INSTALL_UNSAFE: "scheduler-install-unsafe";
|
|
@@ -124,6 +125,8 @@ export interface RunnerSchedulerCommandOptions {
|
|
|
124
125
|
readonly trustChecker?: (executablePath: string | undefined) => SchedulerBinaryTrustResult;
|
|
125
126
|
readonly binaryResolver?: (options: RunnerBinaryResolveOptions) => RunnerBinaryResolution;
|
|
126
127
|
readonly now?: () => string;
|
|
128
|
+
/** P205.05 production effect authority; required by invoke auto-bootstrap. */
|
|
129
|
+
readonly effectAuthority?: InvokeEffectContext;
|
|
127
130
|
}
|
|
128
131
|
export interface RunnerSchedulerCommandResult {
|
|
129
132
|
readonly ok: boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{Buffer as le}from"node:buffer";import{spawnSync as ie}from"node:child_process";import{existsSync as j,mkdirSync as de,readFileSync as me,writeFileSync as pe}from"node:fs";import{delimiter as fe,dirname as he,isAbsolute as F,join as c,resolve as Q}from"node:path";import{checkRunnerBinaryTrust as ye,resolveTrustedRunnerBinary as z}from"./binary.js";import{deriveProjectIdentity as Ee}from"./project-identity.js";const i=Object.freeze({OK:"continuity-ok",SCHEDULER_INSTALL_UNSAFE:"scheduler-install-unsafe",PRIMARY_USER_SCHEDULER_UNAVAILABLE:"primary-user-scheduler-unavailable",CRON_FALLBACK_SELECTED:"cron-fallback-selected",CRON_FALLBACK_NOT_ALLOWED:"cron-fallback-primary-scheduler-available",SCHEDULER_UNAVAILABLE:"scheduler-unavailable",SCHEDULER_COMMAND_FAILED:"scheduler-command-failed",RUNNER_BINARY_UNTRUSTED:"runner-binary-untrusted",LEGACY_GLOBAL_SCHEDULER_DETECTED:"legacy-global-scheduler-detected",LEGACY_GLOBAL_SCHEDULER_AMBIGUOUS:"legacy-global-scheduler-ambiguous",LEGACY_GLOBAL_SCHEDULER_OTHER_PROJECT:"legacy-global-scheduler-other-project"}),b=Object.freeze({OK:"runner-bootstrap-ok",ALREADY_ACTIVE:"runner-bootstrap-already-active",BINARY_UNAVAILABLE:"runner-bootstrap-binary-unavailable",INSTALL_FAILED:"runner-bootstrap-install-failed",START_FAILED:"runner-bootstrap-start-failed",UNEXPECTED_ERROR:"runner-bootstrap-unexpected-error"}),$="neocortex-runner",ge=`${$}.service`,N=`${$}.timer`,B="com.ornexus.neocortex.runner",Se=`${B}.plist`,M="NeocortexRunner",Ce="neocortex-runner-task.xml",Le="runner.cron",ke=60,H=new Map;function G(e){const r=y(e)??Q(e||"."),t=Ee(r),n=t.projectLabel,s=t.projectId,a=`${$}-${s}`,o=`com.ornexus.neocortex.runner.${s}`;return{projectKey:s,projectBasename:n,systemdServiceName:`${a}.service`,systemdTimerName:`${a}.timer`,systemdServiceFile:`${a}.service`,systemdTimerFile:`${a}.timer`,launchdLabel:o,launchdFile:`${o}.plist`,windowsTaskName:`NeocortexRunner-${s}`,windowsXmlFile:`${a}-task.xml`,cronFile:`runner-${s}.cron`,cronMarkerStart:`# BEGIN neocortex-runner:${s}`,cronMarkerEnd:`# END neocortex-runner:${s}`,publicSafe:!0}}function cr(){H.clear()}async function ur(e={}){const r=e.platform??process.platform,t=y(e.projectRoot??process.cwd())??process.cwd(),n=G(t),s=`${r}:${n.projectKey}`,a=H.get(s);if(a?.ok)return{...a,attempted:!1,installed:!1,started:!1,cached:!0,reasonCodes:S([...a.reasonCodes,b.ALREADY_ACTIVE]),publicSummary:"runner scheduler bootstrap already active for project key.",publicSafe:!0};try{const o=e.binaryResolver??z,d=y(e.executablePath??process.argv[1])??process.argv[1],E=o({from:d,platform:r});if(!E.ok)return w({projectKey:n.projectKey,reasonCodes:[b.BINARY_UNAVAILABLE,...E.reasonCodes],publicSummary:"runner scheduler bootstrap could not resolve a trusted runner binary."});const l=Ae(e.env??process.env),g={...e,projectRoot:t,executablePath:E.executablePath,platform:r,env:l,binaryResolver:()=>E},p=await q({...g,command:"install"});if(!p.ok)return w({projectKey:n.projectKey,strategy:p.strategy,reasonCodes:[b.INSTALL_FAILED,...p.reasonCodes],publicSummary:"runner scheduler bootstrap install failed.",attempted:!0});const f=await q({...g,command:"start"});if(!f.ok)return w({projectKey:n.projectKey,strategy:f.strategy??p.strategy,reasonCodes:[b.START_FAILED,...f.reasonCodes],publicSummary:"runner scheduler bootstrap start failed.",attempted:!0,installed:p.applied||p.ok});const L={ok:!0,attempted:!0,installed:p.applied||p.ok,started:f.applied||f.ok,cached:!1,projectKey:n.projectKey,strategy:f.strategy??p.strategy,reasonCodes:S([b.OK,...p.reasonCodes,...f.reasonCodes]),publicSummary:"runner scheduler bootstrap completed for project key.",publicSafe:!0};return H.set(s,L),L}catch{return w({projectKey:n.projectKey,reasonCodes:[b.UNEXPECTED_ERROR],publicSummary:"runner scheduler bootstrap stopped unexpectedly."})}}function w(e){return{ok:!1,attempted:e.attempted??!1,installed:e.installed??!1,started:!1,cached:!1,projectKey:e.projectKey,strategy:e.strategy,reasonCodes:S(e.reasonCodes),publicSummary:e.publicSummary,publicSafe:!0}}function Ae(e){return{...e,NEOCORTEX_RUNNER_BOOTSTRAP_IN_PROGRESS:"1",NEOCORTEX_BOOTSTRAP_IN_PROGRESS:"1"}}async function q(e){const r=e.env??process.env,t=e.platform??process.platform,n=e.dryRun===!0,s=y(e.projectRoot??process.cwd()),a=y(e.executablePath??process.argv[1]),o=We(e,a,t),d=o.runnerCommand,E=d?.executablePath??a,l=G(s??process.cwd()),g=e.commandAvailable??(h=>te(h,r)),p=Ze(e.intervalSeconds??ke,10,1440*60),f=be({platform:t,env:r,strategy:e.strategy,allowCronFallback:e.allowCronFallback,commandAvailable:g,uid:e.uid}),L=Qe(e,E,o.resolution),k=[...f.blockers];if((!s||!d)&&k.push(i.SCHEDULER_INSTALL_UNSAFE),!L.trusted){const h=L.reasonCodes&&L.reasonCodes.length>0?L.reasonCodes:[L.reasonCode??i.RUNNER_BINARY_UNTRUSTED];k.push(i.SCHEDULER_INSTALL_UNSAFE,i.RUNNER_BINARY_UNTRUSTED,...h)}const m=f.selectedStrategy;m||k.push(i.SCHEDULER_UNAVAILABLE);const A=m?_e(m,r,l):void 0,R=m&&s&&He(e.command)?Ge({strategy:m,env:r,projectRoot:s}):[],ue=R.flatMap(h=>h.reasonCodes),O=(e.command==="install"||e.command==="start"||e.command==="stop")&&k.length>0,Y=S([...f.reasonCodes,...k,...ue,O?i.SCHEDULER_INSTALL_UNSAFE:i.OK]);if(O||!m||!A||!s||!d)return{ok:!O&&!!m,command:e.command,platform:t,strategy:m,dryRun:n,manifestPaths:[],manifests:[],identity:l,legacyEntries:R,controlCommands:[],uninstallGuidance:m&&A?Z(m,A,l):[],capability:ne(f,k),reasonCodes:Y,applied:!1,publicSafe:!0};const T=e.command==="install"?Re({strategy:m,paths:A,projectRoot:s,executablePath:d.command,runnerCommand:d,intervalSeconds:p,identity:l}):[],I=Te(e.command,m,A,l,R,r);let U=!1,x=!0;const X=[];if(e.command==="install"&&!n){for(const h of T)de(he(h.path),{recursive:!0}),pe(h.path,h.content,"utf8");U=T.length>0}if(!n&&I.length>0){const h=e.commandRunner??ze;for(const V of I){if(V.manualOnly)continue;const W=h(V);W.ok?U=!0:(x=!1,X.push(W.reasonCode??i.SCHEDULER_COMMAND_FAILED))}}return{ok:x,command:e.command,platform:t,strategy:m,dryRun:n,manifestPaths:T.map(h=>h.path),manifests:T,identity:l,legacyEntries:R,controlCommands:I,uninstallGuidance:[...Z(m,A,l),...Ue(m,R)],capability:ne(f,k),reasonCodes:S([...Y,...X,x?i.OK:i.SCHEDULER_COMMAND_FAILED]),applied:U,publicSafe:!0}}function be(e={}){const r=e.env??process.env,t=e.platform??process.platform,n=e.commandAvailable??(p=>te(p,r)),s=Ve(t,r,e.uid),a=Xe(t),o=a?ee(a,n):!1,d=t!=="win32"&&n("crontab"),E=e.allowCronFallback!==!1;let l=e.strategy;const g=[];return l||(a&&o?l=a:E&&d&&(l="cron-fallback",g.push(i.PRIMARY_USER_SCHEDULER_UNAVAILABLE,i.CRON_FALLBACK_SELECTED))),l==="cron-fallback"&&o&&(l=void 0,g.push(i.CRON_FALLBACK_NOT_ALLOWED)),l&&!ee(l,n)&&(l!=="cron-fallback"||!d)&&(l=void 0),l||g.push(i.SCHEDULER_UNAVAILABLE),s.length>0&&g.push(...s),g.length===0&&g.push(i.OK),{platform:t,primaryStrategy:a,selectedStrategy:l,fallbackStrategy:d?"cron-fallback":void 0,primaryAvailable:o,cronFallbackAvailable:d,safeToInstall:s.length===0,blockers:s,reasonCodes:S(g),publicSafe:!0}}function Re(e){const r=e.identity??G(e.projectRoot),t=e.runnerCommand??{command:e.executablePath,args:[],executablePath:e.executablePath,publicSafe:!0};switch(e.strategy){case"systemd-user":return[{kind:"systemd-service",path:e.paths.systemdServicePath,content:xe(t,e.projectRoot,r),publicSafe:!0},{kind:"systemd-timer",path:e.paths.systemdTimerPath,content:Fe(e.intervalSeconds,r),publicSafe:!0}];case"launchd-user":return[{kind:"launchd-plist",path:e.paths.launchdPlistPath,content:$e(t,e.projectRoot,e.intervalSeconds,r),publicSafe:!0}];case"windows-task-scheduler":return[{kind:"windows-task-xml",path:e.paths.windowsTaskXmlPath,content:Be(t,e.projectRoot,e.intervalSeconds,r),publicSafe:!0}];case"cron-fallback":return[{kind:"cron-snippet",path:e.paths.cronSnippetPath,content:Me(t,e.projectRoot,r),publicSafe:!0}]}}function _e(e,r,t){const n=re(r),s=y(r.XDG_CONFIG_HOME)??c(n,".config"),a=c(s,"systemd","user"),o=c(n,"Library","LaunchAgents"),d=y(r.APPDATA)??c(y(r.USERPROFILE)??n,"AppData","Roaming"),E=c(d,"Neocortex","Runner"),l=c(s,"neocortex");return{systemdServicePath:c(a,t.systemdServiceFile),systemdTimerPath:c(a,t.systemdTimerFile),launchdPlistPath:c(o,t.launchdFile),windowsTaskXmlPath:c(E,t.windowsXmlFile),cronSnippetPath:c(l,t.cronFile)}}function J(e,r){const t=re(r),n=y(r.XDG_CONFIG_HOME)??c(t,".config"),s=c(n,"systemd","user"),a=c(t,"Library","LaunchAgents"),o=y(r.APPDATA)??c(y(r.USERPROFILE)??t,"AppData","Roaming"),d=c(o,"Neocortex","Runner"),E=c(n,"neocortex");return{systemdServicePath:c(s,ge),systemdTimerPath:c(s,N),launchdPlistPath:c(a,Se),windowsTaskXmlPath:c(d,Ce),cronSnippetPath:c(E,Le)}}function Te(e,r,t,n,s,a){return e==="doctor"?[]:[...e==="install"?Ne(r,t,n):e==="start"?we(r,t,n):e==="stop"?Pe(r,t,n):De(r,t,n),...ve(e,r,s,a)]}function Ne(e,r,t){switch(e){case"systemd-user":return[u("systemctl",["--user","daemon-reload"]),u("systemctl",["--user","enable","--now",t.systemdTimerName])];case"launchd-user":return[u("launchctl",["load","-w",r.launchdPlistPath])];case"windows-task-scheduler":return[u("schtasks",["/Create","/TN",t.windowsTaskName,"/XML",r.windowsTaskXmlPath,"/F"])];case"cron-fallback":return[u("crontab",["-l","# append snippet from",r.cronSnippetPath],!0)]}}function we(e,r,t){switch(e){case"systemd-user":return[u("systemctl",["--user","start",t.systemdTimerName])];case"launchd-user":return[u("launchctl",["load","-w",r.launchdPlistPath])];case"windows-task-scheduler":return[u("schtasks",["/Run","/TN",t.windowsTaskName])];case"cron-fallback":return[u("crontab",["-l","# ensure snippet from",r.cronSnippetPath,"is installed"],!0)]}}function Pe(e,r,t){switch(e){case"systemd-user":return[u("systemctl",["--user","stop",t.systemdTimerName])];case"launchd-user":return[u("launchctl",["unload","-w",r.launchdPlistPath])];case"windows-task-scheduler":return[u("schtasks",["/End","/TN",t.windowsTaskName])];case"cron-fallback":return[u("crontab",["-l","# remove scoped neocortex-runner snippet"],!0)]}}function De(e,r,t){switch(e){case"systemd-user":return[u("systemctl",["--user","status",t.systemdTimerName,"--no-pager"])];case"launchd-user":return[u("launchctl",["list",t.launchdLabel])];case"windows-task-scheduler":return[u("schtasks",["/Query","/TN",t.windowsTaskName,"/FO","LIST"])];case"cron-fallback":return[u("crontab",["-l","# look for neocortex-runner snippet from",r.cronSnippetPath],!0)]}}function Z(e,r,t){switch(e){case"systemd-user":return[`systemctl --user disable --now ${t.systemdTimerName}`,`rm ${r.systemdServicePath}`,`rm ${r.systemdTimerPath}`];case"launchd-user":return[`launchctl unload -w ${r.launchdPlistPath}`,`rm ${r.launchdPlistPath}`];case"windows-task-scheduler":return[`schtasks /Delete /TN ${t.windowsTaskName} /F`,`Remove-Item ${r.windowsTaskXmlPath}`];case"cron-fallback":return[`Remove the ${t.cronMarkerStart} block from the user crontab.`,`rm ${r.cronSnippetPath}`]}}function ve(e,r,t,n){if(!t.some(o=>o.relation==="current-project")||e!=="status"&&e!=="stop")return[];const a=J(r,n);return e==="status"?Oe(r,a):Ie(r,a)}function Oe(e,r){switch(e){case"systemd-user":return[u("systemctl",["--user","status",N,"--no-pager"])];case"launchd-user":return[u("launchctl",["list",B])];case"windows-task-scheduler":return[u("schtasks",["/Query","/TN",M,"/FO","LIST"])];case"cron-fallback":return[u("crontab",["-l","# look for legacy neocortex-runner snippet from",r.cronSnippetPath],!0)]}}function Ie(e,r){switch(e){case"systemd-user":return[u("systemctl",["--user","stop",N])];case"launchd-user":return[u("launchctl",["unload","-w",r.launchdPlistPath])];case"windows-task-scheduler":return[u("schtasks",["/End","/TN",M])];case"cron-fallback":return[u("crontab",["-l","# remove legacy neocortex-runner snippet"],!0)]}}function Ue(e,r){if(r.length===0)return[];const t=r.filter(o=>o.relation==="current-project"),n=r.filter(o=>o.relation==="ambiguous"),s=r.filter(o=>o.relation==="other-project"),a=[];return t.length>0&&a.push(`Legacy global ${e} scheduler matches this project; stop it before relying on project-scoped runner scheduling.`),n.length>0&&a.push(`Legacy global ${e} scheduler ownership is ambiguous; inspect it manually before removal.`),s.length>0&&a.push(`Legacy global ${e} scheduler appears to belong to another project; leave it unchanged.`),a}function xe(e,r,t){const n=[...je(e),"tick","--project-root",r,"--scheduled"].map(se).join(" ");return["[Unit]",`Description=Neocortex Enterprise Continuity Runner (${t.projectKey}, user scope)`,`# Managed by Neocortex runner for project ${t.projectKey}`,"After=network-online.target","","[Service]","Type=oneshot",`WorkingDirectory=${oe(r)}`,`ExecStart=${n}`,"","[Install]","WantedBy=default.target",""].join(`
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
4
|
-
`)}function
|
|
5
|
-
`)}function
|
|
6
|
-
`)}function
|
|
7
|
-
`),e.projectRoot,s);return[
|
|
1
|
+
import{Buffer as de}from"node:buffer";import{spawnSync as z}from"node:child_process";import{existsSync as $,mkdirSync as me,readFileSync as fe,writeFileSync as pe}from"node:fs";import{delimiter as he,dirname as ye,isAbsolute as B,join as c,resolve as q}from"node:path";import{checkRunnerBinaryTrust as Ee,resolveTrustedRunnerBinary as J}from"./binary.js";import{deriveProjectIdentity as ge}from"./project-identity.js";import{executeClosedGitInspection as Se,executeSchedulerManifestWrite as Ce,executeSchedulerProcess as Ae}from"../effects/invoke-effect-gateways.js";const l=Object.freeze({OK:"continuity-ok",SCHEDULER_INSTALL_UNSAFE:"scheduler-install-unsafe",PRIMARY_USER_SCHEDULER_UNAVAILABLE:"primary-user-scheduler-unavailable",CRON_FALLBACK_SELECTED:"cron-fallback-selected",CRON_FALLBACK_NOT_ALLOWED:"cron-fallback-primary-scheduler-available",SCHEDULER_UNAVAILABLE:"scheduler-unavailable",SCHEDULER_COMMAND_FAILED:"scheduler-command-failed",RUNNER_BINARY_UNTRUSTED:"runner-binary-untrusted",LEGACY_GLOBAL_SCHEDULER_DETECTED:"legacy-global-scheduler-detected",LEGACY_GLOBAL_SCHEDULER_AMBIGUOUS:"legacy-global-scheduler-ambiguous",LEGACY_GLOBAL_SCHEDULER_OTHER_PROJECT:"legacy-global-scheduler-other-project"}),R=Object.freeze({OK:"runner-bootstrap-ok",ALREADY_ACTIVE:"runner-bootstrap-already-active",BINARY_UNAVAILABLE:"runner-bootstrap-binary-unavailable",INSTALL_FAILED:"runner-bootstrap-install-failed",START_FAILED:"runner-bootstrap-start-failed",UNEXPECTED_ERROR:"runner-bootstrap-unexpected-error"}),M="neocortex-runner",Le=`${M}.service`,N=`${M}.timer`,H="com.ornexus.neocortex.runner",ke=`${H}.plist`,G="NeocortexRunner",be="neocortex-runner-task.xml",Re="runner.cron",_e=60,K=new Map;function Y(e){const t=E(e)??q(e||"."),r=ge(t),n=r.projectLabel,s=r.projectId,a=`${M}-${s}`,o=`com.ornexus.neocortex.runner.${s}`;return{projectKey:s,projectBasename:n,systemdServiceName:`${a}.service`,systemdTimerName:`${a}.timer`,systemdServiceFile:`${a}.service`,systemdTimerFile:`${a}.timer`,launchdLabel:o,launchdFile:`${o}.plist`,windowsTaskName:`NeocortexRunner-${s}`,windowsXmlFile:`${a}-task.xml`,cronFile:`runner-${s}.cron`,cronMarkerStart:`# BEGIN neocortex-runner:${s}`,cronMarkerEnd:`# END neocortex-runner:${s}`,publicSafe:!0}}function mt(){K.clear()}async function ft(e={}){const t=e.platform??process.platform,r=E(e.projectRoot??process.cwd())??process.cwd(),n=Y(r),s=`${t}:${n.projectKey}`,a=K.get(s);if(a?.ok)return{...a,attempted:!1,installed:!1,started:!1,cached:!0,reasonCodes:C([...a.reasonCodes,R.ALREADY_ACTIVE]),publicSummary:"runner scheduler bootstrap already active for project key.",publicSafe:!0};try{e.effectAuthority&&Se(e.effectAuthority,"git-rev-parse",r,h=>{const m=z(h.executable,[...h.argv],{cwd:h.cwd,env:{...h.env},shell:h.shell,timeout:h.timeoutMs,encoding:"utf8",maxBuffer:65536});return{status:m.status,stdout:m.stdout??"",stderr:m.stderr??"",projected:!1}},"client-preflight");const o=e.binaryResolver??J,d=E(e.executablePath??process.argv[1])??process.argv[1],g=o({from:d,platform:t});if(!g.ok)return P({projectKey:n.projectKey,reasonCodes:[R.BINARY_UNAVAILABLE,...g.reasonCodes],publicSummary:"runner scheduler bootstrap could not resolve a trusted runner binary."});const i=Te(e.env??process.env),S={...e,projectRoot:r,executablePath:g.executablePath,platform:t,env:i,binaryResolver:()=>g},p=await Z({...S,command:"install"});if(!p.ok)return P({projectKey:n.projectKey,strategy:p.strategy,reasonCodes:[R.INSTALL_FAILED,...p.reasonCodes],publicSummary:"runner scheduler bootstrap install failed.",attempted:!0});const y=await Z({...S,command:"start"});if(!y.ok)return P({projectKey:n.projectKey,strategy:y.strategy??p.strategy,reasonCodes:[R.START_FAILED,...y.reasonCodes],publicSummary:"runner scheduler bootstrap start failed.",attempted:!0,installed:p.applied||p.ok});const L={ok:!0,attempted:!0,installed:p.applied||p.ok,started:y.applied||y.ok,cached:!1,projectKey:n.projectKey,strategy:y.strategy??p.strategy,reasonCodes:C([R.OK,...p.reasonCodes,...y.reasonCodes]),publicSummary:"runner scheduler bootstrap completed for project key.",publicSafe:!0};return K.set(s,L),L}catch{return P({projectKey:n.projectKey,reasonCodes:[R.UNEXPECTED_ERROR],publicSummary:"runner scheduler bootstrap stopped unexpectedly."})}}function P(e){return{ok:!1,attempted:e.attempted??!1,installed:e.installed??!1,started:!1,cached:!1,projectKey:e.projectKey,strategy:e.strategy,reasonCodes:C(e.reasonCodes),publicSummary:e.publicSummary,publicSafe:!0}}function Te(e){return{...e,NEOCORTEX_RUNNER_BOOTSTRAP_IN_PROGRESS:"1",NEOCORTEX_BOOTSTRAP_IN_PROGRESS:"1"}}async function Z(e){const t=e.env??process.env,r=e.platform??process.platform,n=e.dryRun===!0,s=E(e.projectRoot??process.cwd()),a=E(e.executablePath??process.argv[1]),o=Je(e,a,r),d=o.runnerCommand,g=d?.executablePath??a,i=Y(s??process.cwd()),S=e.commandAvailable??(f=>se(f,t)),p=nt(e.intervalSeconds??_e,10,1440*60),y=we({platform:r,env:t,strategy:e.strategy,allowCronFallback:e.allowCronFallback,commandAvailable:S,uid:e.uid}),L=Ze(e,g,o.resolution),h=[...y.blockers];if((!s||!d)&&h.push(l.SCHEDULER_INSTALL_UNSAFE),!L.trusted){const f=L.reasonCodes&&L.reasonCodes.length>0?L.reasonCodes:[L.reasonCode??l.RUNNER_BINARY_UNTRUSTED];h.push(l.SCHEDULER_INSTALL_UNSAFE,l.RUNNER_BINARY_UNTRUSTED,...f)}const m=y.selectedStrategy;m||h.push(l.SCHEDULER_UNAVAILABLE);const b=m?Pe(m,t,i):void 0,_=m&&s&&Xe(e.command)?Ve({strategy:m,env:t,projectRoot:s}):[],ie=_.flatMap(f=>f.reasonCodes),O=(e.command==="install"||e.command==="start"||e.command==="stop")&&h.length>0,V=C([...y.reasonCodes,...h,...ie,O?l.SCHEDULER_INSTALL_UNSAFE:l.OK]);if(O||!m||!b||!s||!d)return{ok:!O&&!!m,command:e.command,platform:r,strategy:m,dryRun:n,manifestPaths:[],manifests:[],identity:i,legacyEntries:_,controlCommands:[],uninstallGuidance:m&&b?te(m,b,i):[],capability:ae(y,h),reasonCodes:V,applied:!1,publicSafe:!0};const I=e.command==="install"?Ne({strategy:m,paths:b,projectRoot:s,executablePath:d.command,runnerCommand:d,intervalSeconds:p,identity:i}):[],U=De(e.command,m,b,i,_,t);let j=!1,F=!0;const W=[];if(e.command==="install"&&!n){let f=!1;for(const k of I){const T=()=>{me(ye(k.path),{recursive:!0}),pe(k.path,k.content,"utf8")};e.effectAuthority?f=Ce(e.effectAuthority,T)||f:(T(),f=!0)}j=f}if(!n&&U.length>0){const f=e.commandRunner??et;for(const k of U){if(k.manualOnly)continue;const T=e.effectAuthority?Ae(e.effectAuthority,k,()=>({executed:!0,result:f(k)}),()=>({executed:!1,result:{ok:!0,reasonCode:l.OK}})):{executed:!0,result:f(k)},Q=T.result;Q.ok?T.executed&&(j=!0):(F=!1,W.push(Q.reasonCode??l.SCHEDULER_COMMAND_FAILED))}}return{ok:F,command:e.command,platform:r,strategy:m,dryRun:n,manifestPaths:I.map(f=>f.path),manifests:I,identity:i,legacyEntries:_,controlCommands:U,uninstallGuidance:[...te(m,b,i),...$e(m,_)],capability:ae(y,h),reasonCodes:C([...V,...W,F?l.OK:l.SCHEDULER_COMMAND_FAILED]),applied:j,publicSafe:!0}}function we(e={}){const t=e.env??process.env,r=e.platform??process.platform,n=e.commandAvailable??(p=>se(p,t)),s=qe(r,t,e.uid),a=ze(r),o=a?re(a,n):!1,d=r!=="win32"&&n("crontab"),g=e.allowCronFallback!==!1;let i=e.strategy;const S=[];return i||(a&&o?i=a:g&&d&&(i="cron-fallback",S.push(l.PRIMARY_USER_SCHEDULER_UNAVAILABLE,l.CRON_FALLBACK_SELECTED))),i==="cron-fallback"&&o&&(i=void 0,S.push(l.CRON_FALLBACK_NOT_ALLOWED)),i&&!re(i,n)&&(i!=="cron-fallback"||!d)&&(i=void 0),i||S.push(l.SCHEDULER_UNAVAILABLE),s.length>0&&S.push(...s),S.length===0&&S.push(l.OK),{platform:r,primaryStrategy:a,selectedStrategy:i,fallbackStrategy:d?"cron-fallback":void 0,primaryAvailable:o,cronFallbackAvailable:d,safeToInstall:s.length===0,blockers:s,reasonCodes:C(S),publicSafe:!0}}function Ne(e){const t=e.identity??Y(e.projectRoot),r=e.runnerCommand??{command:e.executablePath,args:[],executablePath:e.executablePath,publicSafe:!0};switch(e.strategy){case"systemd-user":return[{kind:"systemd-service",path:e.paths.systemdServicePath,content:Be(r,e.projectRoot,t),publicSafe:!0},{kind:"systemd-timer",path:e.paths.systemdTimerPath,content:He(e.intervalSeconds,t),publicSafe:!0}];case"launchd-user":return[{kind:"launchd-plist",path:e.paths.launchdPlistPath,content:Ge(r,e.projectRoot,e.intervalSeconds,t),publicSafe:!0}];case"windows-task-scheduler":return[{kind:"windows-task-xml",path:e.paths.windowsTaskXmlPath,content:Ke(r,e.projectRoot,e.intervalSeconds,t),publicSafe:!0}];case"cron-fallback":return[{kind:"cron-snippet",path:e.paths.cronSnippetPath,content:Ye(r,e.projectRoot,t),publicSafe:!0}]}}function Pe(e,t,r){const n=ne(t),s=E(t.XDG_CONFIG_HOME)??c(n,".config"),a=c(s,"systemd","user"),o=c(n,"Library","LaunchAgents"),d=E(t.APPDATA)??c(E(t.USERPROFILE)??n,"AppData","Roaming"),g=c(d,"Neocortex","Runner"),i=c(s,"neocortex");return{systemdServicePath:c(a,r.systemdServiceFile),systemdTimerPath:c(a,r.systemdTimerFile),launchdPlistPath:c(o,r.launchdFile),windowsTaskXmlPath:c(g,r.windowsXmlFile),cronSnippetPath:c(i,r.cronFile)}}function ee(e,t){const r=ne(t),n=E(t.XDG_CONFIG_HOME)??c(r,".config"),s=c(n,"systemd","user"),a=c(r,"Library","LaunchAgents"),o=E(t.APPDATA)??c(E(t.USERPROFILE)??r,"AppData","Roaming"),d=c(o,"Neocortex","Runner"),g=c(n,"neocortex");return{systemdServicePath:c(s,Le),systemdTimerPath:c(s,N),launchdPlistPath:c(a,ke),windowsTaskXmlPath:c(d,be),cronSnippetPath:c(g,Re)}}function De(e,t,r,n,s,a){return e==="doctor"?[]:[...e==="install"?ve(t,r,n):e==="start"?xe(t,r,n):e==="stop"?Oe(t,r,n):Ie(t,r,n),...Ue(e,t,s,a)]}function ve(e,t,r){switch(e){case"systemd-user":return[u("systemctl",["--user","daemon-reload"]),u("systemctl",["--user","enable","--now",r.systemdTimerName])];case"launchd-user":return[u("launchctl",["load","-w",t.launchdPlistPath])];case"windows-task-scheduler":return[u("schtasks",["/Create","/TN",r.windowsTaskName,"/XML",t.windowsTaskXmlPath,"/F"])];case"cron-fallback":return[u("crontab",["-l","# append snippet from",t.cronSnippetPath],!0)]}}function xe(e,t,r){switch(e){case"systemd-user":return[u("systemctl",["--user","start",r.systemdTimerName])];case"launchd-user":return[u("launchctl",["load","-w",t.launchdPlistPath])];case"windows-task-scheduler":return[u("schtasks",["/Run","/TN",r.windowsTaskName])];case"cron-fallback":return[u("crontab",["-l","# ensure snippet from",t.cronSnippetPath,"is installed"],!0)]}}function Oe(e,t,r){switch(e){case"systemd-user":return[u("systemctl",["--user","stop",r.systemdTimerName])];case"launchd-user":return[u("launchctl",["unload","-w",t.launchdPlistPath])];case"windows-task-scheduler":return[u("schtasks",["/End","/TN",r.windowsTaskName])];case"cron-fallback":return[u("crontab",["-l","# remove scoped neocortex-runner snippet"],!0)]}}function Ie(e,t,r){switch(e){case"systemd-user":return[u("systemctl",["--user","status",r.systemdTimerName,"--no-pager"])];case"launchd-user":return[u("launchctl",["list",r.launchdLabel])];case"windows-task-scheduler":return[u("schtasks",["/Query","/TN",r.windowsTaskName,"/FO","LIST"])];case"cron-fallback":return[u("crontab",["-l","# look for neocortex-runner snippet from",t.cronSnippetPath],!0)]}}function te(e,t,r){switch(e){case"systemd-user":return[`systemctl --user disable --now ${r.systemdTimerName}`,`rm ${t.systemdServicePath}`,`rm ${t.systemdTimerPath}`];case"launchd-user":return[`launchctl unload -w ${t.launchdPlistPath}`,`rm ${t.launchdPlistPath}`];case"windows-task-scheduler":return[`schtasks /Delete /TN ${r.windowsTaskName} /F`,`Remove-Item ${t.windowsTaskXmlPath}`];case"cron-fallback":return[`Remove the ${r.cronMarkerStart} block from the user crontab.`,`rm ${t.cronSnippetPath}`]}}function Ue(e,t,r,n){if(!r.some(o=>o.relation==="current-project")||e!=="status"&&e!=="stop")return[];const a=ee(t,n);return e==="status"?je(t,a):Fe(t,a)}function je(e,t){switch(e){case"systemd-user":return[u("systemctl",["--user","status",N,"--no-pager"])];case"launchd-user":return[u("launchctl",["list",H])];case"windows-task-scheduler":return[u("schtasks",["/Query","/TN",G,"/FO","LIST"])];case"cron-fallback":return[u("crontab",["-l","# look for legacy neocortex-runner snippet from",t.cronSnippetPath],!0)]}}function Fe(e,t){switch(e){case"systemd-user":return[u("systemctl",["--user","stop",N])];case"launchd-user":return[u("launchctl",["unload","-w",t.launchdPlistPath])];case"windows-task-scheduler":return[u("schtasks",["/End","/TN",G])];case"cron-fallback":return[u("crontab",["-l","# remove legacy neocortex-runner snippet"],!0)]}}function $e(e,t){if(t.length===0)return[];const r=t.filter(o=>o.relation==="current-project"),n=t.filter(o=>o.relation==="ambiguous"),s=t.filter(o=>o.relation==="other-project"),a=[];return r.length>0&&a.push(`Legacy global ${e} scheduler matches this project; stop it before relying on project-scoped runner scheduling.`),n.length>0&&a.push(`Legacy global ${e} scheduler ownership is ambiguous; inspect it manually before removal.`),s.length>0&&a.push(`Legacy global ${e} scheduler appears to belong to another project; leave it unchanged.`),a}function Be(e,t,r){const n=[...Me(e),"tick","--project-root",t,"--scheduled"].map(oe).join(" ");return["[Unit]",`Description=Neocortex Enterprise Continuity Runner (${r.projectKey}, user scope)`,`# Managed by Neocortex runner for project ${r.projectKey}`,"After=network-online.target","","[Service]","Type=oneshot",`WorkingDirectory=${ue(t)}`,`ExecStart=${n}`,"","[Install]","WantedBy=default.target",""].join(`
|
|
2
|
+
`)}function Me(e){const t=E(process.execPath);return!t||e.command===t?[e.command,...e.args]:[t,e.command,...e.args]}function He(e,t){return["[Unit]",`Description=Run Neocortex Enterprise Continuity Runner periodically (${t.projectKey}, user scope)`,`# Managed by Neocortex runner for project ${t.projectKey}`,"","[Timer]","OnBootSec=60s",`OnUnitActiveSec=${e}s`,`Unit=${t.systemdServiceName}`,"","[Install]","WantedBy=timers.target",""].join(`
|
|
3
|
+
`)}function Ge(e,t,r,n){const s=[e.command,...e.args,"tick","--project-root",t,"--scheduled"];return['<?xml version="1.0" encoding="UTF-8"?>','<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">','<plist version="1.0">',"<dict>",` <!-- Managed by Neocortex runner for project ${A(n.projectKey)} -->`," <key>Label</key>",` <string>${A(n.launchdLabel)}</string>`," <key>ProgramArguments</key>"," <array>",...s.map(a=>` <string>${A(a)}</string>`)," </array>"," <key>WorkingDirectory</key>",` <string>${A(t)}</string>`," <key>StartInterval</key>",` <integer>${r}</integer>`," <key>RunAtLoad</key>"," <true/>","</dict>","</plist>",""].join(`
|
|
4
|
+
`)}function Ke(e,t,r,n){const s=[...e.args,"tick","--project-root",t,"--scheduled"].map(le).join(" ");return['<?xml version="1.0" encoding="UTF-16"?>','<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">'," <RegistrationInfo>",` <Description>Neocortex Enterprise Continuity Runner (${A(n.projectKey)}, user scope)</Description>`," </RegistrationInfo>"," <Triggers>"," <TimeTrigger>"," <Repetition>",` <Interval>PT${r}S</Interval>`," <StopAtDurationEnd>false</StopAtDurationEnd>"," </Repetition>"," <Enabled>true</Enabled>"," </TimeTrigger>"," </Triggers>"," <Principals>",' <Principal id="Author">'," <LogonType>InteractiveToken</LogonType>"," <RunLevel>LeastPrivilege</RunLevel>"," </Principal>"," </Principals>"," <Settings>"," <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>"," <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>"," <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>"," <Enabled>true</Enabled>"," </Settings>",' <Actions Context="Author">'," <Exec>",` <Command>${A(e.command)}</Command>`,` <Arguments>${A(s)}</Arguments>`,` <WorkingDirectory>${A(t)}</WorkingDirectory>`," </Exec>"," </Actions>","</Task>",""].join(`
|
|
5
|
+
`)}function Ye(e,t,r){const n=[e.command,...e.args,"tick","--project-root",t,"--scheduled"].map(X).join(" ");return[r.cronMarkerStart,`# neocortex-runner user-scope cron fallback for project ${r.projectKey}`,"# Reason: primary-user-scheduler-unavailable",`* * * * * ${n} # neocortex-runner:${r.projectKey}`,r.cronMarkerEnd,""].join(`
|
|
6
|
+
`)}function Xe(e){return e==="status"||e==="stop"||e==="doctor"}function Ve(e){const t=ee(e.strategy,e.env);switch(e.strategy){case"systemd-user":{const r=w(t.systemdServicePath),n=w(t.systemdTimerPath),s=r?x(r):!1,a=n?Qe(n):!1;if(!s&&!a)return[];const o=v([r,n].filter(Boolean).join(`
|
|
7
|
+
`),e.projectRoot,s);return[D(e.strategy,"systemd-timer",N,o)]}case"launchd-user":{const r=w(t.launchdPlistPath);return!r||!x(r)?[]:[D(e.strategy,"launchd-plist",H,v(r,e.projectRoot,!0))]}case"windows-task-scheduler":{const r=w(t.windowsTaskXmlPath);return!r||!x(r)?[]:[D(e.strategy,"windows-task-xml",G,v(r,e.projectRoot,!0))]}case"cron-fallback":{const r=w(t.cronSnippetPath);return!r||!x(r)?[]:[D(e.strategy,"cron-snippet","# neocortex-runner",v(r,e.projectRoot,!0))]}}}function D(e,t,r,n){const s=n==="current-project"?l.LEGACY_GLOBAL_SCHEDULER_DETECTED:n==="ambiguous"?l.LEGACY_GLOBAL_SCHEDULER_AMBIGUOUS:l.LEGACY_GLOBAL_SCHEDULER_OTHER_PROJECT;return{strategy:e,kind:t,name:r,relation:n,reasonCodes:[s],remediation:n==="current-project"?"stop-safe":n==="ambiguous"?"manual-review-only":"report-only",publicSafe:!0}}function v(e,t,r){return We(e,t)?"current-project":r&&/--project-root|WorkingDirectory=|<key>WorkingDirectory<\/key>|<Arguments>[^<]*--project-root/i.test(e)?"other-project":"ambiguous"}function We(e,t){return C([t,oe(t),tt(t),ue(t),rt(t),X(t),le(t),A(t)].filter(Boolean)).some(n=>e.includes(n))}function x(e){return/neocortex-runner|com\.ornexus\.neocortex\.runner|NeocortexRunner|Neocortex Enterprise Continuity Runner/i.test(e)&&/tick|--project-root|StartInterval|OnUnitActiveSec|InteractiveToken|primary-user-scheduler-unavailable/i.test(e)}function Qe(e){return/neocortex-runner\.service|Neocortex Enterprise Continuity Runner|OnUnitActiveSec/i.test(e)}function w(e){try{return fe(e,"utf8")}catch{return null}}function ze(e){if(e==="linux")return"systemd-user";if(e==="darwin")return"launchd-user";if(e==="win32")return"windows-task-scheduler"}function re(e,t){switch(e){case"systemd-user":return t("systemctl");case"launchd-user":return t("launchctl");case"windows-task-scheduler":return t("schtasks")||t("schtasks.exe");case"cron-fallback":return t("crontab")}}function qe(e,t,r){const n=[],s=r??(typeof process.getuid=="function"?process.getuid():null);e!=="win32"&&s===0&&n.push(l.SCHEDULER_INSTALL_UNSAFE),e!=="win32"&&(t.SUDO_USER||t.SUDO_UID||t.SUDO_COMMAND)&&n.push(l.SCHEDULER_INSTALL_UNSAFE);const a=t.HOME??t.USERPROFILE;return(!a||!B(a)||!E(a))&&n.push(l.SCHEDULER_INSTALL_UNSAFE),C(n)}function Je(e,t,r){if(e.trustCheck===!1||e.trustChecker)return{runnerCommand:t?{command:t,args:[],executablePath:t,publicSafe:!0}:void 0};const s=(e.binaryResolver??J)({from:t??process.argv[1],platform:r});return s.ok?{runnerCommand:{command:s.command,args:s.args,executablePath:s.executablePath,provenance:s.provenance,publicSafe:!0},resolution:s}:{runnerCommand:t?{command:t,args:[],executablePath:t,provenance:s.provenance,publicSafe:!0}:void 0,resolution:s}}function Ze(e,t,r){return e.trustCheck===!1?{trusted:!0,executablePath:t??void 0,publicSafe:!0}:e.trustChecker?e.trustChecker(t??void 0):r?r.ok?{trusted:!0,packageName:r.packageName,packageVersion:r.packageVersion,packageRoot:r.packageRoot,executablePath:r.executablePath,expectedRelativePath:r.expectedRelativePath,provenance:r.provenance,reasonCodes:r.reasonCodes,publicSafe:!0}:{trusted:!1,reasonCode:r.reasonCode,reasonCodes:r.reasonCodes,packageName:r.packageName,packageVersion:r.packageVersion,packageRoot:r.packageRoot,executablePath:r.executablePath??t??void 0,expectedRelativePath:r.expectedRelativePath,provenance:r.provenance,publicSafe:!0}:Ee(t??void 0)}function ne(e){return e.HOME??e.USERPROFILE??process.env.HOME??process.cwd()}function E(e){if(!e||/[\r\n\0]/.test(e))return null;const t=B(e)?e:q(e);return B(t)?t:null}function u(e,t,r=!1){return{command:e,args:t,preview:[e,...t.map(X)].join(" "),safeUserScope:!0,...r?{manualOnly:!0}:{}}}function et(e){const t=z(e.command,[...e.args],{stdio:"ignore",shell:!1});return{ok:t.status===0,code:t.status,signal:t.signal,reasonCode:t.status===0?l.OK:l.SCHEDULER_COMMAND_FAILED}}function se(e,t){const r=t.PATH??process.env.PATH??"",n=(t.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean),s=r.split(he).filter(Boolean);for(const a of s){const o=c(a,e);if($(o))return!0;for(const d of n)if($(c(a,`${e}${d.toLowerCase()}`))||$(c(a,`${e}${d.toUpperCase()}`)))return!0}return!1}function ae(e,t){const r=C([...e.blockers,...t]);return{...e,safeToInstall:r.length===0,blockers:r,reasonCodes:C([...e.reasonCodes,...r])}}function oe(e){return ce(e,!0)}function tt(e){return ce(e,!1)}function ce(e,t){const r=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/%/g,t?"%%":"%");return/[\s"'\\]/.test(e)?`"${r}"`:r}function ue(e){return e.replace(/%/g,"%%")}function rt(e){return Array.from(e,t=>/^[A-Za-z0-9_./:@+=,-]$/.test(t)?t:t==="%"?"%%":Array.from(de.from(t,"utf8"),r=>`\\x${r.toString(16).padStart(2,"0")}`).join("")).join("")}function X(e){return/^[A-Za-z0-9_./:=@%+-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function le(e){return/[\s"]/.test(e)?`"${e.replace(/"/g,'\\"')}"`:e}function A(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function nt(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,Math.floor(e))):t}function C(e){return Array.from(new Set(e))}export{R as RUNNER_SCHEDULER_BOOTSTRAP_REASON_CODES,l as SCHEDULER_REASON_CODES,mt as __resetRunnerSchedulerBootstrapCacheForTests,Y as createRunnerSchedulerIdentity,we as detectSchedulerCapability,ft as ensureRunnerSchedulerBootstrap,Ne as renderSchedulerManifests,Z as runRunnerSchedulerCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const ae=12,ue=16,n=(r,e,t={})=>({commandId:r,stateProjectionPolicy:e,...t}),_=Object.freeze({status:n("status","full"),init:n("init","epic-targeted"),"arch-plan":n("arch-plan","full"),"arch-prd":n("arch-prd","full"),"arch-architecture":n("arch-architecture","epic-targeted"),"arch-api-contracts":n("arch-api-contracts","epic-targeted"),"arch-api-integrations":n("arch-api-integrations","epic-targeted"),"arch-database":n("arch-database","epic-targeted"),"arch-security":n("arch-security","epic-targeted"),"arch-design-system":n("arch-design-system","epic-targeted"),"arch-ux-design":n("arch-ux-design","epic-targeted"),"arch-performance":n("arch-performance","epic-targeted"),"arch-testing":n("arch-testing","epic-targeted"),"arch-infrastructure":n("arch-infrastructure","epic-targeted"),"arch-review":n("arch-review","epic-targeted"),"arch-fitness-functions":n("arch-fitness-functions","epic-targeted"),"create-epic":n("create-epic","epic-summary"),"idea-diagnose":n("idea-diagnose","full"),"idea-research":n("idea-research","epic-targeted"),"generate-epic":n("generate-epic","epic-targeted"),exec:n("exec","story-targeted",{structuralRequired:!0}),yolo:n("yolo","story-targeted",{structuralRequired:!0}),"yolo-inline":n("yolo-inline","story-targeted",{structuralRequired:!0}),epic:n("epic","epic-targeted",{structuralRequired:!0}),"setup-branch":n("setup-branch","story-targeted",{structuralRequired:!0}),diagnose:n("diagnose","adaptive-targeted"),"diagnose-inline":n("diagnose-inline","full"),research:n("research","adaptive-targeted"),"research-inline":n("research-inline","full"),"write-spec":n("write-spec","story-targeted",{structuralRequired:!0}),"create-tasks":n("create-tasks","story-targeted",{structuralRequired:!0}),implement:n("implement","story-targeted",{structuralRequired:!0}),commit:n("commit","story-targeted",{structuralRequired:!0}),"commit-push":n("commit","story-targeted",{structuralRequired:!0}),sync:n("sync","story-targeted",{structuralRequired:!0}),"sync-main":n("sync","story-targeted",{structuralRequired:!0}),"create-pr":n("create-pr","story-targeted",{structuralRequired:!0}),review:n("review","story-targeted"),"review-pr":n("review","story-targeted"),merge:n("merge","story-targeted",{structuralRequired:!0}),"merge-pr":n("merge","story-targeted",{structuralRequired:!0}),"fix-blocked":n("fix-blocked","story-targeted"),"finalize-epic":n("finalize-epic","epic-targeted"),"resolve-conflicts":n("resolve-conflicts","story-targeted"),"update-memory":n("update-memory","full"),"update-project-memory":n("update-memory","story-targeted",{structuralRequired:!0}),refactor:n("refactor","adaptive-targeted"),"refactor-suggest":n("refactor","story-targeted",{structuralRequired:!0}),cleanup:n("cleanup","full"),audit:n("audit","full"),"tech-debt":n("tech-debt","full"),menu:n("menu","full"),plans:n("plans","full"),billing:n("billing","full"),subscribe:n("subscribe","full"),"qa-scan":n("qa-scan","full"),yoloop:n("yoloop","yoloop-targeted",{structuralRequired:!0}),"migrate-state":n("migrate-state","full"),"policy-audit":n("policy-audit","full"),"mutation-test":n("mutation-test","full"),"sync-openapi":n("sync-openapi","full"),"generate-pacts":n("generate-pacts","full"),"verify-pacts":n("verify-pacts","full"),"property-test":n("property-test","full"),"property-tests":n("property-test","story-targeted",{structuralRequired:!0}),"chaos-plan":n("chaos-plan","full"),"ui-ux-review":n("ui-ux-review","adaptive-targeted"),"solyd-system":n("solyd-system","adaptive-targeted"),goal:n("goal","continuity-scoped"),loop:n("loop","continuity-scoped"),jobs:n("jobs","continuity-scoped"),runner:n("runner","continuity-scoped"),"goal-tick":n("goal-tick","continuity-scoped"),"loop-tick":n("loop-tick","continuity-scoped"),"validate-tests":n("validate-tests","story-targeted",{structuralRequired:!0}),"qa-gate":n("qa-gate","story-targeted",{structuralRequired:!0})}),M=Object.freeze({st:"status",inicializar:"init",arquitetura:"arch-plan",architecture:"arch-plan",arch:"arch-plan",prd:"arch-prd","product-requirements":"arch-prd","arch-doc":"arch-architecture","tech-architecture":"arch-architecture","api-contracts":"arch-api-contracts","api-contract":"arch-api-contracts","api-integrations":"arch-api-integrations","api-int":"arch-api-integrations","database-schema":"arch-database","db-schema":"arch-database",db:"arch-database","cyber-security":"arch-security",security:"arch-security",sec:"arch-security","design-system":"arch-design-system",ds:"arch-design-system","atomic-design":"arch-design-system","ux-design":"arch-ux-design",ux:"arch-ux-design",wireframes:"arch-ux-design",wireframe:"arch-ux-design","user-flows":"arch-ux-design",performance:"arch-performance",perf:"arch-performance","capacity-planning":"arch-performance",capacity:"arch-performance","arch-perf":"arch-performance","performance-strategy":"arch-performance","testing-strategy":"arch-testing","test-plan":"arch-testing","test-strategy":"arch-testing","arch-test":"arch-testing",infrastructure:"arch-infrastructure",infra:"arch-infrastructure","deploy-plan":"arch-infrastructure",deployment:"arch-infrastructure","arch-infra":"arch-infrastructure","arch-deploy":"arch-infrastructure","review-consolidation":"arch-review",consolidation:"arch-review","architecture-review":"arch-review","arch-consolidation":"arch-review",fitness:"arch-fitness-functions","fitness-functions":"arch-fitness-functions",archfit:"arch-fitness-functions","arch-fit":"arch-fitness-functions","fit-funcs":"arch-fitness-functions","criar-epic":"create-epic",planejamento:"create-epic","idea-diag":"idea-diagnose","idea-pesq":"idea-research","gerar-epic":"generate-epic",executar:"exec",pipeline:"exec","parallel-epic":"epic",setup:"setup-branch",branch:"setup-branch",diag:"diagnose",diagnostico:"diagnose",c02:"diagnose",pesquisar:"research",pesq:"research","research-fix":"research",c03:"research",spec:"write-spec",especificacao:"write-spec",c04:"write-spec",tasks:"create-tasks",tarefas:"create-tasks",c05:"create-tasks",impl:"implement",implementar:"implement",c06:"implement",push:"commit",commit_push:"commit",cp:"commit",c07:"commit",sincronizar:"sync",c08:"sync",pr:"create-pr",c09:"create-pr",revisar:"review",c11:"review",mesclar:"merge",c12:"merge",fix:"fix-blocked",corrigir:"fix-blocked",finalizar:"finalize-epic",conflitos:"resolve-conflicts",memoria:"update-memory",refactoring:"refactor",refact:"refactor",refac:"refactor",rf:"refactor","cleanup-code":"refactor","code-cleanup":"refactor","code-quality":"refactor","improve-code":"refactor",modernize:"refactor",modernization:"refactor",legacy:"refactor","legacy-code":"refactor","debt-pay":"refactor","pay-debt":"refactor","debt-reduction":"refactor","smell-fix":"refactor","fix-smells":"refactor","code-smells":"refactor",strangler:"refactor","strangler-fig":"refactor",limpar:"cleanup",limpeza:"cleanup",auditar:"audit",auditoria:"audit",debt:"tech-debt",debts:"tech-debt","debt-list":"tech-debt","tech-debts":"tech-debt",td:"tech-debt",help:"menu",ajuda:"menu","?":"menu",commands:"menu",cmds:"menu",planos:"plans",pricing:"plans",bill:"billing",subscription:"billing",sub:"billing",upgrade:"subscribe",checkout:"subscribe",qa:"qa-scan","qa-test":"qa-scan","visual-qa":"qa-scan","e2e-scan":"qa-scan",troubleshoot:"qa-scan","debug-ui":"qa-scan",scan:"qa-scan",a11y:"qa-scan",accessibility:"qa-scan",wcag:"qa-scan","auto-yolo":"yoloop","epic-runner":"yoloop","story-runner":"yoloop","loop-yolo":"yoloop","auto-epic":"yoloop",migrate:"migrate-state","state-migrate":"migrate-state","schema-migrate":"migrate-state",policy:"policy-audit","audit-policy":"policy-audit","policy-history":"policy-audit",policies:"policy-audit",mutation:"mutation-test",stryker:"mutation-test","kill-mutants":"mutation-test","openapi-sync":"sync-openapi","api-sync":"sync-openapi","spec-sync":"sync-openapi","regen-openapi":"sync-openapi",pacts:"generate-pacts","gen-pacts":"generate-pacts","regen-pacts":"generate-pacts","create-pacts":"generate-pacts","verify-pact":"verify-pacts","pact-verify":"verify-pacts","check-pacts":"verify-pacts","pact-check":"verify-pacts",property:"property-test",pbt:"property-test",proptest:"property-test","invariant-test":"property-test",chaos:"chaos-plan",gameday:"chaos-plan","resilience-test":"chaos-plan","ux-review":"ui-ux-review","design-review":"ui-ux-review","visual-review":"ui-ux-review","product-polish":"ui-ux-review","security-system":"solyd-system","authorized-security":"solyd-system","sec-system":"solyd-system",goals:"goal","durable-goal":"goal","continuity-goal":"goal",loops:"loop","durable-loop":"loop","continuity-loop":"loop",job:"jobs","continuity-jobs":"jobs","neocortex-runner":"runner","continuity-runner":"runner"}),z=Object.freeze({1:"status",2:"init",3:"arch-plan",4:"arch-prd",5:"arch-architecture",6:"arch-api-contracts",7:"arch-api-integrations",8:"arch-database",9:"arch-security",10:"arch-design-system",11:"arch-ux-design",12:"arch-performance",13:"arch-testing",14:"arch-infrastructure",15:"arch-review",16:"arch-fitness-functions",17:"create-epic",18:"idea-diagnose",19:"idea-research",20:"generate-epic",21:"exec",22:"yolo",23:"epic",24:"setup-branch",25:"diagnose",26:"research",27:"write-spec",28:"create-tasks",29:"implement",30:"commit",31:"sync",32:"create-pr",33:"review",34:"merge",35:"fix-blocked",36:"finalize-epic",37:"resolve-conflicts",38:"update-memory",39:"refactor",40:"cleanup",41:"audit",42:"tech-debt",43:"menu",44:"plans",45:"billing",46:"subscribe",47:"qa-scan",48:"yoloop",49:"migrate-state",50:"policy-audit",51:"mutation-test",52:"sync-openapi",53:"generate-pacts",54:"verify-pacts",55:"property-test",56:"chaos-plan",57:"ui-ux-review",58:"solyd-system",59:"goal",60:"loop",61:"jobs",62:"runner"});function a(r,e=120){if(typeof r!="string")return;const t=r.trim();if(t)return t.replace(/[^a-z0-9_.:-]+/gi,"_").slice(0,e)}function b(r){return r!==null&&typeof r=="object"&&!Array.isArray(r)}function f(...r){const e=new Set,t=[];for(const i of r)for(const o of i??[]){const c=a(o,80);if(!(!c||e.has(c))&&(e.add(c),t.push(c),t.length>=16))return t}return t}function N(r){return r.trim().replace(/^@?\*/,"").replace(/^@/,"").toLowerCase()}function F(r){return r.trim().split(/\s+/,1)[0]??""}function L(r){const e=F(r);if(!e)return _.menu;const t=N(e),i=z[t]??M[t]??t;return _[i]??null}function $(r,e,t,i="full-compatible",o=["full-state"]){return{kind:"full",commandId:t?.commandId??null,stateProjectionPolicy:t?.stateProjectionPolicy??null,projectionMode:i,trigger:r,targetEpicId:null,targetStoryId:null,includedStoryCount:Object.keys(e.stories).length,includedEpicCount:Object.keys(e.epics).length,omittedStoryCount:0,omittedEpicCount:0,reason:"full-state",reasonCodes:f(o)}}function y(r,e,t,i="full-compatible",o=["full-state"]){const c=$(r,e,t,i,o);return m({...e,scope:c},e,c)}function D(r){const[e]=r.trim().split(/\s+/,1);return e?/^[A-Z]?\d+(?:\.\d+)+$/i.test(e.replace(/^@/,""))||/(?:^|\/)[A-Z]?\d+(?:\.\d+)+\.story\.md$/i.test(e.replace(/^@/,"")):!1}function q(r){const e=r.match(/(?:^|[/@\s])([A-Z]?\d+(?:\.\d+)+)\.story\.md\b/i);return e?.[1]?e[1]:r.match(/(?:^|\s|@)([A-Z]?\d+(?:\.\d+)+)(?=$|\s)/i)?.[1]??null}function Y(r){const e=r.trim(),t=e.search(/\s/);return t===-1?"":e.slice(t).trim()}function O(r){return Y(r).split(/\s+/).map(e=>e.replace(/^@/,"").replace(/^['"]|['"]$/g,"")).filter(e=>e.length>0&&!e.startsWith("-"))}function de(r){return O(r)[0]??null}function P(r,e){const i=r.replace(/^@/,"").replace(/^epic-/i,"").replace(/\.md$/i,""),o=[i,i.toUpperCase(),/^p\d+$/i.test(i)?`P${i.replace(/^p/i,"")}`:null,/^\d+$/.test(i)?`P${i}`:null].filter(c=>typeof c=="string"&&c.length>0);for(const c of o)if(e.epics[c])return c;return null}function Z(r,e){const t=r.match(/(?:^|[/@\s])epic-(P?\d+)\.md\b/i);return t?.[1]?P(t[1],e):null}function S(r,e){const t=Z(r,e);if(t)return t;for(const i of O(r)){if(/^[A-Z]?\d+(?:\.\d+)+$/i.test(i))continue;const o=P(i,e);if(o)return o}return null}function G(r,e){const t=S(r,e);if(t)return t;const i=e.yoloop,o=i?.state?.currentSession?.currentEpicId;if(typeof o=="string"&&e.epics[o])return o;const c=i?.lock?.currentEpicId??i?.lock?.epicId;return typeof c=="string"&&e.epics[c]?c:null}function k(r,e){if(typeof r.epic_id=="string"&&r.epic_id.length>0)return r.epic_id;const t=e.split(".").slice(0,-1).join(".");return t.length>0?t:null}function x(r){return typeof r=="string"&&["done","completed","merged","cancelled","canceled","abandoned"].includes(r.toLowerCase())}function h(r,e,t){if(t.has(r))return;const i=e.stories[r];if(!i)return;t.add(r);const o=i.depends_on;if(Array.isArray(o))for(const c of o)typeof c=="string"&&h(c,e,t)}function U(r,e,t){const i=new Set;h(r,t,i);const o=e.stories;if(Array.isArray(o))for(const s of o)typeof s=="string"&&t.stories[s]&&i.add(s);const c={};for(const s of i){const u=t.stories[s];u&&(c[s]=u)}return c}function v(r,e,t=[]){const i={};for(const o of t)e.epics[o]&&(i[o]=e.epics[o]);for(const[o,c]of Object.entries(r)){const s=k(c,o);s&&e.epics[s]&&(i[s]=e.epics[s])}return i}function w(r,e,t){if(t.has(r))return;const i=e.epics[r];if(!i)return;t.add(r);const o=i.depends_on;if(Array.isArray(o))for(const c of o)typeof c=="string"&&c.length>0&&w(c,e,t)}function B(r,e,t){const i=new Set;return w(r,t,i),v(e,t,[...i])}function J(r,e){const t=new Set,i=r.stories;if(Array.isArray(i))for(const c of i){if(typeof c!="string")continue;const s=e.stories[c];if(s){if(x(s.status)){t.add(c);continue}h(c,e,t)}}const o={};for(const c of t){const s=e.stories[c];s&&(o[c]=s)}return o}function K(r,e){const t=new Set,i=r.stories;if(Array.isArray(i))for(const c of i)typeof c=="string"&&h(c,e,t);const o={};for(const c of t){const s=e.stories[c];s&&(o[c]=s)}return o}function W(r){const e={};for(const[t,i]of Object.entries(r.epics))e[t]={id:a(i.id)??t,...a(i.status)?{status:a(i.status)}:{},...typeof i.total_stories=="number"&&Number.isFinite(i.total_stories)?{total_stories:i.total_stories}:{},...typeof i.completed_stories=="number"&&Number.isFinite(i.completed_stories)?{completed_stories:i.completed_stories}:{}};return e}function R(r){const e={};for(const t of Object.values(r)){const i=a(t.status,40)??"unknown";e[i]=(e[i]??0)+1}return e}function A(r){for(const e of["last_updated","updated_at","completed_at","created_at","discovered_at"]){const t=r[e];if(typeof t!="string")continue;const i=Date.parse(t);if(Number.isFinite(i))return i}return 0}function V(r){return Object.entries(r.stories).map(([e,t])=>({id:e,story:t,timestamp:A(t)})).sort((e,t)=>t.timestamp-e.timestamp||e.id.localeCompare(t.id)).slice(0,12).map(({id:e,story:t})=>({id:e,...a(t.epic_id)?{epicId:a(t.epic_id)}:{},...a(t.status,40)?{status:a(t.status,40)}:{},...a(t.last_step??t.lastStep)?{lastStep:a(t.last_step??t.lastStep)}:{},...a(t.last_updated??t.updated_at??t.completed_at??t.created_at)?{lastUpdated:a(t.last_updated??t.updated_at??t.completed_at??t.created_at)}:{}}))}function H(r){const e=r.current_session;if(!e)return;const t={activeEpicId:a(e.active_epic_id)??null,activeStoryId:a(e.active_story_id)??null,activeStepId:a(e.active_step_id)??null,sessionId:a(e.session_id)??null,startedAt:a(e.started_at)??null};return Object.values(t).some(i=>i!=null)?t:void 0}function Q(r){const e=r.yoloop;if(!b(e))return;const t=b(e.state)?e.state:void 0,i=b(t?.currentSession)?t.currentSession:void 0,o=b(e.lock)?e.lock:void 0,c={...typeof e.active=="boolean"?{active:e.active}:{},currentEpicId:a(i?.currentEpicId??e.currentEpicId)??null,currentStoryId:a(i?.currentStoryId??e.currentStoryId)??null,sessionId:a(i?.sessionId??e.sessionId)??null,lockEpicId:a(o?.currentEpicId??o?.epicId)??null};return Object.keys(c).length>0?c:void 0}function X(r){const e=r.continuity;if(!b(e))return;const t=Array.isArray(e.reasonCodes)?e.reasonCodes.filter(i=>typeof i=="string"):void 0;return{present:!0,activeJobId:a(e.activeJobId??e.jobId)??null,activeGoalId:a(e.activeGoalId??e.goalId)??null,activeLoopId:a(e.activeLoopId??e.loopId)??null,...t&&t.length>0?{reasonCodes:f(t)}:{}}}function ee(r,e,t){const i=a(e?.activeStoryId),o=a(e?.activeEpicId),c=a(e?.activeStepId);if(i||o||c)return{epicId:o??null,storyId:i??null,stepId:c??null};const s=a(t?.currentStoryId),u=a(t?.currentEpicId??t?.lockEpicId);if(s||u)return{epicId:u??null,storyId:s??null,stepId:null};const d=Object.entries(r.stories).map(([l,p])=>({id:l,story:p,timestamp:A(p)})).filter(({story:l})=>!x(l.status)).sort((l,p)=>p.timestamp-l.timestamp||l.id.localeCompare(p.id))[0];return d?{epicId:k(d.story,d.id),storyId:d.id,stepId:a(d.story.last_step??d.story.lastStep)??null}:{epicId:null,storyId:null,stepId:null}}function te(r,e){const t=R(r.stories),i=R(r.epics),o=H(r),c=Q(r),s=X(r),u=ee(r,o,c),d=V(r),l=f(e.reasonCodes,["state-summary-attached","state-summary-bounded",`projection-${e.projectionMode??e.kind}`,e.stateProjectionPolicy?`policy-${e.stateProjectionPolicy}`:"policy-unknown",d.length>=12?"recent-stories-capped":"recent-stories-bounded",u.storyId||u.epicId?"active-ref-derived":"active-ref-empty",c?"yoloop-session-present":"yoloop-session-absent",s?"continuity-session-present":"continuity-session-absent"]);return{schemaVersion:1,totals:{stories:Object.keys(r.stories).length,epics:Object.keys(r.epics).length,storyStatus:t,epicStatus:i,blockedStories:t.blocked??0},active:u,blockedCount:t.blocked??0,recentStories:d,...o?{currentSession:o}:{},...c?{currentYoloopSession:c}:{},...s?{currentContinuitySession:s}:{},projection:{commandId:e.commandId??null,stateProjectionPolicy:e.stateProjectionPolicy??null,projectionMode:e.projectionMode,scopeKind:e.kind,includedStoryCount:e.includedStoryCount,includedEpicCount:e.includedEpicCount??Object.keys(r.epics).length,omittedStoryCount:e.omittedStoryCount,omittedEpicCount:e.omittedEpicCount,reason:e.reason},reasonCodes:l,publicSafe:!0}}function m(r,e,t){return{...r,stateSummary:te(e,t)}}function re(r,e,t){const i={};for(const c of Object.keys(e.epics))i[c]={id:c};const o={kind:"projected",commandId:t.commandId,stateProjectionPolicy:t.stateProjectionPolicy,projectionMode:"summary-only",trigger:r,targetEpicId:null,targetStoryId:null,includedStoryCount:0,includedEpicCount:Object.keys(i).length,omittedStoryCount:Object.keys(e.stories).length,omittedEpicCount:0,reason:"epic-summary",reasonCodes:["epic-summary","stories-omitted","epic-stubs-only"]};return m({...e,stories:{},epics:i,scope:o},e,o)}function j(r,e,t,i=["summary-only","stories-omitted"]){const o=W(e),c={kind:"projected",commandId:t.commandId,stateProjectionPolicy:t.stateProjectionPolicy,projectionMode:"summary-only",trigger:r,targetEpicId:null,targetStoryId:null,includedStoryCount:0,includedEpicCount:Object.keys(o).length,omittedStoryCount:Object.keys(e.stories).length,omittedEpicCount:Math.max(0,Object.keys(e.epics).length-Object.keys(o).length),reason:"summary-only",reasonCodes:f(i)};return m({...e,stories:{},epics:o,scope:c},e,c)}function E(r,e,t,i,o,c){const s=e.stories[i];if(!s)return y(r,e,t,o,[...c,"target-story-missing-full-state"]);const u=k(s,i);if(!u)return y(r,e,t,o,[...c,"target-epic-unresolved-full-state"]);const d=e.epics[u];if(!d)return y(r,e,t,o,[...c,"target-epic-missing-full-state"]);const l=U(i,d,e),p=v(l,e);if(!l[i]||!p[u])return y(r,e,t,o,[...c,"target-projection-incomplete-full-state"]);const g={kind:"projected",commandId:t.commandId,stateProjectionPolicy:t.stateProjectionPolicy,projectionMode:o,trigger:r,targetEpicId:u,targetStoryId:i,includedStoryCount:Object.keys(l).length,includedEpicCount:Object.keys(p).length,omittedStoryCount:Math.max(0,Object.keys(e.stories).length-Object.keys(l).length),omittedEpicCount:Math.max(0,Object.keys(e.epics).length-Object.keys(p).length),reason:"targeted-invocation",reasonCodes:f(c)};return m({...e,stories:l,epics:p,scope:g},e,g)}function T(r,e,t,i,o,c){const s=e.epics[i];if(!s)return y(r,e,t,o,[...c,"target-epic-missing-full-state"]);const u=K(s,e),d=v(u,e,[i]);if(!d[i])return y(r,e,t,o,[...c,"target-epic-projection-incomplete-full-state"]);const l={kind:"projected",commandId:t.commandId,stateProjectionPolicy:t.stateProjectionPolicy,projectionMode:o,trigger:r,targetEpicId:i,targetStoryId:null,includedStoryCount:Object.keys(u).length,includedEpicCount:Object.keys(d).length,omittedStoryCount:Math.max(0,Object.keys(e.stories).length-Object.keys(u).length),omittedEpicCount:Math.max(0,Object.keys(e.epics).length-Object.keys(d).length),reason:"targeted-invocation",reasonCodes:f(c)};return m({...e,stories:u,epics:d,scope:l},e,l)}function ie(r,e,t){const i=G(r,e);if(!i)return y(r,e,t,"structural-required",["yoloop-target-missing-full-state"]);const o=e.epics[i];if(!o)return y(r,e,t,"structural-required",["yoloop-target-epic-missing-full-state"]);const c=J(o,e),s=B(i,c,e);if(!s[i])return y(r,e,t,"structural-required",["yoloop-projection-incomplete-full-state"]);const u={kind:"projected",commandId:t.commandId,stateProjectionPolicy:t.stateProjectionPolicy,projectionMode:"structural-required",trigger:r,targetEpicId:i,targetStoryId:null,includedStoryCount:Object.keys(c).length,includedEpicCount:Object.keys(s).length,omittedStoryCount:Math.max(0,Object.keys(e.stories).length-Object.keys(c).length),omittedEpicCount:Math.max(0,Object.keys(e.epics).length-Object.keys(s).length),reason:"targeted-invocation",reasonCodes:["structural-required","yoloop-targeted"]};return m({...e,stories:c,epics:s,scope:u},e,u)}function ce(r,e){const t={};for(const[i,o]of Object.entries(r.epics)){const c=Array.isArray(o.stories)?o.stories.filter(s=>typeof s=="string"&&e.has(s)):[];t[i]={id:a(o.id)??i,...a(o.status,40)?{status:a(o.status,40)}:{},...typeof o.total_stories=="number"&&Number.isFinite(o.total_stories)?{total_stories:o.total_stories}:{},...typeof o.completed_stories=="number"&&Number.isFinite(o.completed_stories)?{completed_stories:o.completed_stories}:{},...c.length>0?{stories:c}:{}}}return t}function oe(r){return r.stateSummary?.totals.stories??(r.scope?.includedStoryCount??Object.keys(r.stories).length)+(r.scope?.omittedStoryCount??0)}function ne(r){return r.stateSummary?.totals.epics??(r.scope?.includedEpicCount??Object.keys(r.epics).length)+(r.scope?.omittedEpicCount??0)}function se(r,e){if(r.stateSummary)return{...r.stateSummary,projection:{...r.stateSummary.projection,scopeKind:"projected",projectionMode:e.projectionMode,includedStoryCount:e.includedStoryCount,includedEpicCount:e.includedEpicCount??r.stateSummary.projection.includedEpicCount,omittedStoryCount:e.omittedStoryCount,omittedEpicCount:e.omittedEpicCount,reason:"body-size"},reasonCodes:f(r.stateSummary.reasonCodes,["payload-size-guardrail","state-summary-preserved","nonessential-state-degraded"])}}function le(r){const e=r.scope,t=new Set;if(e?.projectionMode==="structural-required")for(const I of Object.keys(r.stories))t.add(I);else e?.targetStoryId&&h(e.targetStoryId,r,t);const i={};for(const I of t){const C=r.stories[I];C&&(i[I]=C)}const o=ce(r,t),c=Object.keys(i).length,s=Object.keys(o).length,u=Math.max(0,oe(r)-c),d=Math.max(0,ne(r)-s),l=e?.projectionMode==="structural-required"?"structural-required":"summary-only",p={kind:"projected",commandId:e?.commandId??null,stateProjectionPolicy:e?.stateProjectionPolicy??null,projectionMode:l,...e?.trigger?{trigger:e.trigger}:{},targetEpicId:e?.targetEpicId??null,targetStoryId:e?.targetStoryId??null,includedStoryCount:c,includedEpicCount:s,omittedStoryCount:u,omittedEpicCount:d,reason:"body-size",reasonCodes:f(e?.reasonCodes,["payload-size-guardrail",t.size>0?"structural-targets-preserved":"stories-omitted","epics-stubbed","state-summary-preserved"])},g=se(r,p);return{...r,stories:i,epics:o,scope:p,...g?{stateSummary:g}:{}}}function pe(r,e){const t=r.trim();try{const i=L(t);if(!i){if(D(t)){const c=n("story-reference","story-targeted"),s=q(t);if(s)return E(t,e,c,s,"targeted-story",["story-reference-targeted"])}return y(t,e,null,"full-compatible",["unknown-command-full-state"])}if(i.stateProjectionPolicy==="epic-summary")return re(t,e,i);if(i.stateProjectionPolicy==="yoloop-targeted")return ie(t,e,i);const o=q(t);if(i.stateProjectionPolicy==="story-targeted")return o?E(t,e,i,o,i.structuralRequired?"structural-required":"targeted-story",[i.structuralRequired?"structural-required":"targeted-story"]):i.structuralRequired?y(t,e,i,"structural-required",["structural-target-missing-full-state"]):j(t,e,i,["story-target-missing-summary-only"]);if(i.stateProjectionPolicy==="adaptive-targeted"){if(o&&e.stories[o])return E(t,e,i,o,"targeted-story",["adaptive-story-targeted"]);const c=S(t,e);return c?T(t,e,i,c,"targeted-epic",["adaptive-epic-targeted"]):j(t,e,i,["adaptive-summary-only","target-unresolved-summary-only"])}if(i.stateProjectionPolicy==="epic-targeted"){const c=S(t,e);return c?T(t,e,i,c,i.structuralRequired?"structural-required":"targeted-epic",[i.structuralRequired?"structural-required":"targeted-epic"]):i.structuralRequired?y(t,e,i,"structural-required",["structural-epic-target-missing-full-state"]):j(t,e,i,["epic-target-missing-summary-only"])}return i.stateProjectionPolicy==="continuity-scoped"?j(t,e,i,["continuity-scoped-summary-only"]):j(t,e,i,["policy-full-summary-only"])}catch{return y(t,e,null,"full-compatible",["projection-error-full-state"])}}export{le as degradeStateSnapshotForPayloadLimit,pe as projectStateSnapshotForInvoke};
|
|
1
|
+
const le=12,pe=16,h=["active","archived","rolled-back","synthetic","orphan"],n=(r,e,t={})=>({commandId:r,stateProjectionPolicy:e,...t}),P=Object.freeze({status:n("status","full"),init:n("init","epic-targeted"),"arch-plan":n("arch-plan","full"),"arch-prd":n("arch-prd","full"),"arch-architecture":n("arch-architecture","epic-targeted"),"arch-api-contracts":n("arch-api-contracts","epic-targeted"),"arch-api-integrations":n("arch-api-integrations","epic-targeted"),"arch-database":n("arch-database","epic-targeted"),"arch-security":n("arch-security","epic-targeted"),"arch-design-system":n("arch-design-system","epic-targeted"),"arch-ux-design":n("arch-ux-design","epic-targeted"),"arch-performance":n("arch-performance","epic-targeted"),"arch-testing":n("arch-testing","epic-targeted"),"arch-infrastructure":n("arch-infrastructure","epic-targeted"),"arch-review":n("arch-review","epic-targeted"),"arch-fitness-functions":n("arch-fitness-functions","epic-targeted"),"create-epic":n("create-epic","epic-summary"),"idea-diagnose":n("idea-diagnose","full"),"idea-research":n("idea-research","epic-targeted"),"generate-epic":n("generate-epic","epic-targeted"),exec:n("exec","story-targeted",{structuralRequired:!0}),yolo:n("yolo","story-targeted",{structuralRequired:!0}),"yolo-inline":n("yolo-inline","story-targeted",{structuralRequired:!0}),epic:n("epic","epic-targeted",{structuralRequired:!0}),"setup-branch":n("setup-branch","story-targeted",{structuralRequired:!0}),diagnose:n("diagnose","adaptive-targeted"),"diagnose-inline":n("diagnose-inline","full"),research:n("research","adaptive-targeted"),"research-inline":n("research-inline","full"),"write-spec":n("write-spec","story-targeted",{structuralRequired:!0}),"create-tasks":n("create-tasks","story-targeted",{structuralRequired:!0}),implement:n("implement","story-targeted",{structuralRequired:!0}),commit:n("commit","story-targeted",{structuralRequired:!0}),"commit-push":n("commit","story-targeted",{structuralRequired:!0}),sync:n("sync","story-targeted",{structuralRequired:!0}),"sync-main":n("sync","story-targeted",{structuralRequired:!0}),"create-pr":n("create-pr","story-targeted",{structuralRequired:!0}),review:n("review","story-targeted"),"review-pr":n("review","story-targeted"),merge:n("merge","story-targeted",{structuralRequired:!0}),"merge-pr":n("merge","story-targeted",{structuralRequired:!0}),"fix-blocked":n("fix-blocked","story-targeted"),"finalize-epic":n("finalize-epic","epic-targeted"),"resolve-conflicts":n("resolve-conflicts","story-targeted"),"update-memory":n("update-memory","full"),"update-project-memory":n("update-memory","story-targeted",{structuralRequired:!0}),refactor:n("refactor","adaptive-targeted"),"refactor-suggest":n("refactor","story-targeted",{structuralRequired:!0}),cleanup:n("cleanup","full"),audit:n("audit","full"),"tech-debt":n("tech-debt","full"),menu:n("menu","full"),plans:n("plans","full"),billing:n("billing","full"),subscribe:n("subscribe","full"),"qa-scan":n("qa-scan","full"),yoloop:n("yoloop","yoloop-targeted",{structuralRequired:!0}),"migrate-state":n("migrate-state","full"),"policy-audit":n("policy-audit","full"),"mutation-test":n("mutation-test","full"),"sync-openapi":n("sync-openapi","full"),"generate-pacts":n("generate-pacts","full"),"verify-pacts":n("verify-pacts","full"),"property-test":n("property-test","full"),"property-tests":n("property-test","story-targeted",{structuralRequired:!0}),"chaos-plan":n("chaos-plan","full"),"ui-ux-review":n("ui-ux-review","adaptive-targeted"),"solyd-system":n("solyd-system","adaptive-targeted"),goal:n("goal","continuity-scoped"),loop:n("loop","continuity-scoped"),jobs:n("jobs","continuity-scoped"),runner:n("runner","continuity-scoped"),"goal-tick":n("goal-tick","continuity-scoped"),"loop-tick":n("loop-tick","continuity-scoped"),"validate-tests":n("validate-tests","story-targeted",{structuralRequired:!0}),"qa-gate":n("qa-gate","story-targeted",{structuralRequired:!0})}),L=Object.freeze({st:"status",inicializar:"init",arquitetura:"arch-plan",architecture:"arch-plan",arch:"arch-plan",prd:"arch-prd","product-requirements":"arch-prd","arch-doc":"arch-architecture","tech-architecture":"arch-architecture","api-contracts":"arch-api-contracts","api-contract":"arch-api-contracts","api-integrations":"arch-api-integrations","api-int":"arch-api-integrations","database-schema":"arch-database","db-schema":"arch-database",db:"arch-database","cyber-security":"arch-security",security:"arch-security",sec:"arch-security","design-system":"arch-design-system",ds:"arch-design-system","atomic-design":"arch-design-system","ux-design":"arch-ux-design",ux:"arch-ux-design",wireframes:"arch-ux-design",wireframe:"arch-ux-design","user-flows":"arch-ux-design",performance:"arch-performance",perf:"arch-performance","capacity-planning":"arch-performance",capacity:"arch-performance","arch-perf":"arch-performance","performance-strategy":"arch-performance","testing-strategy":"arch-testing","test-plan":"arch-testing","test-strategy":"arch-testing","arch-test":"arch-testing",infrastructure:"arch-infrastructure",infra:"arch-infrastructure","deploy-plan":"arch-infrastructure",deployment:"arch-infrastructure","arch-infra":"arch-infrastructure","arch-deploy":"arch-infrastructure","review-consolidation":"arch-review",consolidation:"arch-review","architecture-review":"arch-review","arch-consolidation":"arch-review",fitness:"arch-fitness-functions","fitness-functions":"arch-fitness-functions",archfit:"arch-fitness-functions","arch-fit":"arch-fitness-functions","fit-funcs":"arch-fitness-functions","criar-epic":"create-epic",planejamento:"create-epic","idea-diag":"idea-diagnose","idea-pesq":"idea-research","gerar-epic":"generate-epic",executar:"exec",pipeline:"exec","parallel-epic":"epic",setup:"setup-branch",branch:"setup-branch",diag:"diagnose",diagnostico:"diagnose",c02:"diagnose",pesquisar:"research",pesq:"research","research-fix":"research",c03:"research",spec:"write-spec",especificacao:"write-spec",c04:"write-spec",tasks:"create-tasks",tarefas:"create-tasks",c05:"create-tasks",impl:"implement",implementar:"implement",c06:"implement",push:"commit",commit_push:"commit",cp:"commit",c07:"commit",sincronizar:"sync",c08:"sync",pr:"create-pr",c09:"create-pr",revisar:"review",c11:"review",mesclar:"merge",c12:"merge",fix:"fix-blocked",corrigir:"fix-blocked",finalizar:"finalize-epic",conflitos:"resolve-conflicts",memoria:"update-memory",refactoring:"refactor",refact:"refactor",refac:"refactor",rf:"refactor","cleanup-code":"refactor","code-cleanup":"refactor","code-quality":"refactor","improve-code":"refactor",modernize:"refactor",modernization:"refactor",legacy:"refactor","legacy-code":"refactor","debt-pay":"refactor","pay-debt":"refactor","debt-reduction":"refactor","smell-fix":"refactor","fix-smells":"refactor","code-smells":"refactor",strangler:"refactor","strangler-fig":"refactor",limpar:"cleanup",limpeza:"cleanup",auditar:"audit",auditoria:"audit",debt:"tech-debt",debts:"tech-debt","debt-list":"tech-debt","tech-debts":"tech-debt",td:"tech-debt",help:"menu",ajuda:"menu","?":"menu",commands:"menu",cmds:"menu",planos:"plans",pricing:"plans",bill:"billing",subscription:"billing",sub:"billing",upgrade:"subscribe",checkout:"subscribe",qa:"qa-scan","qa-test":"qa-scan","visual-qa":"qa-scan","e2e-scan":"qa-scan",troubleshoot:"qa-scan","debug-ui":"qa-scan",scan:"qa-scan",a11y:"qa-scan",accessibility:"qa-scan",wcag:"qa-scan","auto-yolo":"yoloop","epic-runner":"yoloop","story-runner":"yoloop","loop-yolo":"yoloop","auto-epic":"yoloop",migrate:"migrate-state","state-migrate":"migrate-state","schema-migrate":"migrate-state",policy:"policy-audit","audit-policy":"policy-audit","policy-history":"policy-audit",policies:"policy-audit",mutation:"mutation-test",stryker:"mutation-test","kill-mutants":"mutation-test","openapi-sync":"sync-openapi","api-sync":"sync-openapi","spec-sync":"sync-openapi","regen-openapi":"sync-openapi",pacts:"generate-pacts","gen-pacts":"generate-pacts","regen-pacts":"generate-pacts","create-pacts":"generate-pacts","verify-pact":"verify-pacts","pact-verify":"verify-pacts","check-pacts":"verify-pacts","pact-check":"verify-pacts",property:"property-test",pbt:"property-test",proptest:"property-test","invariant-test":"property-test",chaos:"chaos-plan",gameday:"chaos-plan","resilience-test":"chaos-plan","ux-review":"ui-ux-review","design-review":"ui-ux-review","visual-review":"ui-ux-review","product-polish":"ui-ux-review","security-system":"solyd-system","authorized-security":"solyd-system","sec-system":"solyd-system",goals:"goal","durable-goal":"goal","continuity-goal":"goal",loops:"loop","durable-loop":"loop","continuity-loop":"loop",job:"jobs","continuity-jobs":"jobs","neocortex-runner":"runner","continuity-runner":"runner"}),N=Object.freeze({1:"status",2:"init",3:"arch-plan",4:"arch-prd",5:"arch-architecture",6:"arch-api-contracts",7:"arch-api-integrations",8:"arch-database",9:"arch-security",10:"arch-design-system",11:"arch-ux-design",12:"arch-performance",13:"arch-testing",14:"arch-infrastructure",15:"arch-review",16:"arch-fitness-functions",17:"create-epic",18:"idea-diagnose",19:"idea-research",20:"generate-epic",21:"exec",22:"yolo",23:"epic",24:"setup-branch",25:"diagnose",26:"research",27:"write-spec",28:"create-tasks",29:"implement",30:"commit",31:"sync",32:"create-pr",33:"review",34:"merge",35:"fix-blocked",36:"finalize-epic",37:"resolve-conflicts",38:"update-memory",39:"refactor",40:"cleanup",41:"audit",42:"tech-debt",43:"menu",44:"plans",45:"billing",46:"subscribe",47:"qa-scan",48:"yoloop",49:"migrate-state",50:"policy-audit",51:"mutation-test",52:"sync-openapi",53:"generate-pacts",54:"verify-pacts",55:"property-test",56:"chaos-plan",57:"ui-ux-review",58:"solyd-system",59:"goal",60:"loop",61:"jobs",62:"runner"});function a(r,e=120){if(typeof r!="string")return;const t=r.trim();if(t)return t.replace(/[^a-z0-9_.:-]+/gi,"_").slice(0,e)}function j(r){return r!==null&&typeof r=="object"&&!Array.isArray(r)}function g(...r){const e=new Set,t=[];for(const i of r)for(const c of i??[]){const o=a(c,80);if(!(!o||e.has(o))&&(e.add(o),t.push(o),t.length>=16))return t}return t}function F(r){return r.trim().replace(/^@?\*/,"").replace(/^@/,"").toLowerCase()}function $(r){return r.trim().split(/\s+/,1)[0]??""}function D(r){const e=$(r);if(!e)return P.menu;const t=F(e),i=N[t]??L[t]??t;return P[i]??null}function Y(r,e,t,i="full-compatible",c=["full-state"]){return{kind:"full",commandId:t?.commandId??null,stateProjectionPolicy:t?.stateProjectionPolicy??null,projectionMode:i,trigger:r,targetEpicId:null,targetStoryId:null,includedStoryCount:Object.keys(e.stories).length,includedEpicCount:Object.keys(e.epics).length,omittedStoryCount:0,omittedEpicCount:0,reason:"full-state",reasonCodes:g(c)}}function y(r,e,t,i="full-compatible",c=["full-state"]){const o=Y(r,e,t,i,c);return b({...e,scope:o},e,o)}function Z(r){const[e]=r.trim().split(/\s+/,1);return e?/^[A-Z]?\d+(?:\.\d+)+$/i.test(e.replace(/^@/,""))||/(?:^|\/)[A-Z]?\d+(?:\.\d+)+\.story\.md$/i.test(e.replace(/^@/,"")):!1}function x(r){const e=r.match(/(?:^|[/@\s])([A-Z]?\d+(?:\.\d+)+)\.story\.md\b/i);return e?.[1]?e[1]:r.match(/(?:^|\s|@)([A-Z]?\d+(?:\.\d+)+)(?=$|\s)/i)?.[1]??null}function G(r){const e=r.trim(),t=e.search(/\s/);return t===-1?"":e.slice(t).trim()}function w(r){return G(r).split(/\s+/).map(e=>e.replace(/^@/,"").replace(/^['"]|['"]$/g,"")).filter(e=>e.length>0&&!e.startsWith("-"))}function fe(r){return w(r)[0]??null}function R(r,e){const i=r.replace(/^@/,"").replace(/^epic-/i,"").replace(/\.md$/i,""),c=[i,i.toUpperCase(),/^p\d+$/i.test(i)?`P${i.replace(/^p/i,"")}`:null,/^\d+$/.test(i)?`P${i}`:null].filter(o=>typeof o=="string"&&o.length>0);for(const o of c)if(e.epics[o])return o;return null}function U(r,e){const t=r.match(/(?:^|[/@\s])epic-(P?\d+)\.md\b/i);return t?.[1]?R(t[1],e):null}function k(r,e){const t=U(r,e);if(t)return t;for(const i of w(r)){if(/^[A-Z]?\d+(?:\.\d+)+$/i.test(i))continue;const c=R(i,e);if(c)return c}return null}function B(r,e){const t=k(r,e);if(t)return t;const i=e.yoloop,c=i?.state?.currentSession?.currentEpicId;if(typeof c=="string"&&e.epics[c])return c;const o=i?.lock?.currentEpicId??i?.lock?.epicId;return typeof o=="string"&&e.epics[o]?o:null}function I(r,e){if(typeof r.epic_id=="string"&&r.epic_id.length>0)return r.epic_id;const t=e.split(".").slice(0,-1).join(".");return t.length>0?t:null}function E(r){return typeof r=="string"&&["done","completed","merged","cancelled","canceled","abandoned"].includes(r.toLowerCase())}function S(r,e,t){if(t.has(r))return;const i=e.stories[r];if(!i)return;t.add(r);const c=i.depends_on;if(Array.isArray(c))for(const o of c)typeof o=="string"&&S(o,e,t)}function J(r,e,t){const i=new Set;S(r,t,i);const c=e.stories;if(Array.isArray(c))for(const s of c)typeof s=="string"&&t.stories[s]&&i.add(s);const o={};for(const s of i){const u=t.stories[s];u&&(o[s]=u)}return o}function C(r,e,t=[]){const i={};for(const c of t)e.epics[c]&&(i[c]=e.epics[c]);for(const[c,o]of Object.entries(r)){const s=I(o,c);s&&e.epics[s]&&(i[s]=e.epics[s])}return i}function A(r,e,t){if(t.has(r))return;const i=e.epics[r];if(!i)return;t.add(r);const c=i.depends_on;if(Array.isArray(c))for(const o of c)typeof o=="string"&&o.length>0&&A(o,e,t)}function K(r,e,t){const i=new Set;return A(r,t,i),C(e,t,[...i])}function W(r,e){const t=new Set,i=r.stories;if(Array.isArray(i))for(const o of i){if(typeof o!="string")continue;const s=e.stories[o];if(s){if(E(s.status)){t.add(o);continue}S(o,e,t)}}const c={};for(const o of t){const s=e.stories[o];s&&(c[o]=s)}return c}function V(r,e){const t=new Set,i=r.stories;if(Array.isArray(i))for(const o of i)typeof o=="string"&&S(o,e,t);const c={};for(const o of t){const s=e.stories[o];s&&(c[o]=s)}return c}function H(r){const e={};for(const[t,i]of Object.entries(r.epics))e[t]={id:a(i.id)??t,...a(i.status)?{status:a(i.status)}:{},...h.includes(i.lifecycle_classification)?{lifecycle_classification:i.lifecycle_classification}:{},...typeof i.total_stories=="number"&&Number.isFinite(i.total_stories)?{total_stories:i.total_stories}:{},...typeof i.completed_stories=="number"&&Number.isFinite(i.completed_stories)?{completed_stories:i.completed_stories}:{}};return e}function T(r){const e={};for(const t of Object.values(r)){const i=a(t.status,40)??"unknown";e[i]=(e[i]??0)+1}return e}function Q(r){const e=Object.fromEntries(h.map(t=>[t,0]));for(const t of Object.values(r)){const i=h.includes(t.lifecycle_classification)?t.lifecycle_classification:"active";e[i]=(e[i]??0)+1}return e}function q(r,e){if(!e)return!0;const t=r.epics[e];return t?!h.includes(t.lifecycle_classification)||t.lifecycle_classification==="active":!0}function M(r){for(const e of["last_updated","updated_at","completed_at","created_at","discovered_at"]){const t=r[e];if(typeof t!="string")continue;const i=Date.parse(t);if(Number.isFinite(i))return i}return 0}function X(r){return Object.entries(r.stories).map(([e,t])=>({id:e,story:t,timestamp:M(t)})).sort((e,t)=>t.timestamp-e.timestamp||e.id.localeCompare(t.id)).slice(0,12).map(({id:e,story:t})=>({id:e,...a(t.epic_id)?{epicId:a(t.epic_id)}:{},...a(t.status,40)?{status:a(t.status,40)}:{},...a(t.last_step??t.lastStep)?{lastStep:a(t.last_step??t.lastStep)}:{},...a(t.last_updated??t.updated_at??t.completed_at??t.created_at)?{lastUpdated:a(t.last_updated??t.updated_at??t.completed_at??t.created_at)}:{}}))}function ee(r){const e=r.current_session;if(!e)return;const t={activeEpicId:a(e.active_epic_id)??null,activeStoryId:a(e.active_story_id)??null,activeStepId:a(e.active_step_id)??null,sessionId:a(e.session_id)??null,startedAt:a(e.started_at)??null};return Object.values(t).some(i=>i!=null)?t:void 0}function te(r){const e=r.yoloop;if(!j(e))return;const t=j(e.state)?e.state:void 0,i=j(t?.currentSession)?t.currentSession:void 0,c=j(e.lock)?e.lock:void 0,o={...typeof e.active=="boolean"?{active:e.active}:{},currentEpicId:a(i?.currentEpicId??e.currentEpicId)??null,currentStoryId:a(i?.currentStoryId??e.currentStoryId)??null,sessionId:a(i?.sessionId??e.sessionId)??null,lockEpicId:a(c?.currentEpicId??c?.epicId)??null};return Object.keys(o).length>0?o:void 0}function re(r){const e=r.continuity;if(!j(e))return;const t=Array.isArray(e.reasonCodes)?e.reasonCodes.filter(i=>typeof i=="string"):void 0;return{present:!0,activeJobId:a(e.activeJobId??e.jobId)??null,activeGoalId:a(e.activeGoalId??e.goalId)??null,activeLoopId:a(e.activeLoopId??e.loopId)??null,...t&&t.length>0?{reasonCodes:g(t)}:{}}}function ie(r,e,t){const i=a(e?.activeStoryId),c=a(e?.activeEpicId),o=a(e?.activeStepId),s=i&&r.stories[i]?I(r.stories[i],i):null;if((i||c||o)&&q(r,c??s))return{epicId:c??null,storyId:i??null,stepId:o??null};const u=a(t?.currentStoryId),l=a(t?.currentEpicId??t?.lockEpicId);if((u||l)&&q(r,l))return{epicId:l??null,storyId:u??null,stepId:null};const d=Object.entries(r.stories).map(([p,f])=>({id:p,story:f,timestamp:M(f)})).filter(({id:p,story:f})=>!E(f.status)&&q(r,I(f,p))).sort((p,f)=>f.timestamp-p.timestamp||p.id.localeCompare(f.id))[0];return d?{epicId:I(d.story,d.id),storyId:d.id,stepId:a(d.story.last_step??d.story.lastStep)??null}:{epicId:null,storyId:null,stepId:null}}function ce(r,e){const t=T(r.stories),i=T(r.epics),c=Q(r.epics),o=Object.values(r.epics).filter(m=>(h.includes(m.lifecycle_classification)?m.lifecycle_classification:"active")==="active"&&!E(m.status)).length,s=ee(r),u=te(r),l=re(r),d=ie(r,s,u),p=X(r),f=g(e.reasonCodes,["state-summary-attached","state-summary-bounded",`projection-${e.projectionMode??e.kind}`,e.stateProjectionPolicy?`policy-${e.stateProjectionPolicy}`:"policy-unknown",p.length>=12?"recent-stories-capped":"recent-stories-bounded",d.storyId||d.epicId?"active-ref-derived":"active-ref-empty",u?"yoloop-session-present":"yoloop-session-absent",l?"continuity-session-present":"continuity-session-absent"]);return{schemaVersion:1,totals:{stories:Object.keys(r.stories).length,epics:Object.keys(r.epics).length,storyStatus:t,epicStatus:i,epicLifecycle:c,activeEpics:o,blockedStories:t.blocked??0},active:d,blockedCount:t.blocked??0,recentStories:p,...s?{currentSession:s}:{},...u?{currentYoloopSession:u}:{},...l?{currentContinuitySession:l}:{},projection:{commandId:e.commandId??null,stateProjectionPolicy:e.stateProjectionPolicy??null,projectionMode:e.projectionMode,scopeKind:e.kind,includedStoryCount:e.includedStoryCount,includedEpicCount:e.includedEpicCount??Object.keys(r.epics).length,omittedStoryCount:e.omittedStoryCount,omittedEpicCount:e.omittedEpicCount,reason:e.reason},reasonCodes:f,publicSafe:!0}}function b(r,e,t){return{...r,stateSummary:ce(e,t)}}function oe(r,e,t){const i={};for(const o of Object.keys(e.epics))i[o]={id:o};const c={kind:"projected",commandId:t.commandId,stateProjectionPolicy:t.stateProjectionPolicy,projectionMode:"summary-only",trigger:r,targetEpicId:null,targetStoryId:null,includedStoryCount:0,includedEpicCount:Object.keys(i).length,omittedStoryCount:Object.keys(e.stories).length,omittedEpicCount:0,reason:"epic-summary",reasonCodes:["epic-summary","stories-omitted","epic-stubs-only"]};return b({...e,stories:{},epics:i,scope:c},e,c)}function v(r,e,t,i=["summary-only","stories-omitted"]){const c=H(e),o={kind:"projected",commandId:t.commandId,stateProjectionPolicy:t.stateProjectionPolicy,projectionMode:"summary-only",trigger:r,targetEpicId:null,targetStoryId:null,includedStoryCount:0,includedEpicCount:Object.keys(c).length,omittedStoryCount:Object.keys(e.stories).length,omittedEpicCount:Math.max(0,Object.keys(e.epics).length-Object.keys(c).length),reason:"summary-only",reasonCodes:g(i)};return b({...e,stories:{},epics:c,scope:o},e,o)}function O(r,e,t,i,c,o){const s=e.stories[i];if(!s)return y(r,e,t,c,[...o,"target-story-missing-full-state"]);const u=I(s,i);if(!u)return y(r,e,t,c,[...o,"target-epic-unresolved-full-state"]);const l=e.epics[u];if(!l)return y(r,e,t,c,[...o,"target-epic-missing-full-state"]);const d=J(i,l,e),p=C(d,e);if(!d[i]||!p[u])return y(r,e,t,c,[...o,"target-projection-incomplete-full-state"]);const f={kind:"projected",commandId:t.commandId,stateProjectionPolicy:t.stateProjectionPolicy,projectionMode:c,trigger:r,targetEpicId:u,targetStoryId:i,includedStoryCount:Object.keys(d).length,includedEpicCount:Object.keys(p).length,omittedStoryCount:Math.max(0,Object.keys(e.stories).length-Object.keys(d).length),omittedEpicCount:Math.max(0,Object.keys(e.epics).length-Object.keys(p).length),reason:"targeted-invocation",reasonCodes:g(o)};return b({...e,stories:d,epics:p,scope:f},e,f)}function z(r,e,t,i,c,o){const s=e.epics[i];if(!s)return y(r,e,t,c,[...o,"target-epic-missing-full-state"]);const u=V(s,e),l=C(u,e,[i]);if(!l[i])return y(r,e,t,c,[...o,"target-epic-projection-incomplete-full-state"]);const d={kind:"projected",commandId:t.commandId,stateProjectionPolicy:t.stateProjectionPolicy,projectionMode:c,trigger:r,targetEpicId:i,targetStoryId:null,includedStoryCount:Object.keys(u).length,includedEpicCount:Object.keys(l).length,omittedStoryCount:Math.max(0,Object.keys(e.stories).length-Object.keys(u).length),omittedEpicCount:Math.max(0,Object.keys(e.epics).length-Object.keys(l).length),reason:"targeted-invocation",reasonCodes:g(o)};return b({...e,stories:u,epics:l,scope:d},e,d)}function ne(r,e,t){const i=B(r,e);if(!i)return y(r,e,t,"structural-required",["yoloop-target-missing-full-state"]);const c=e.epics[i];if(!c)return y(r,e,t,"structural-required",["yoloop-target-epic-missing-full-state"]);const o=W(c,e),s=K(i,o,e);if(!s[i])return y(r,e,t,"structural-required",["yoloop-projection-incomplete-full-state"]);const u={kind:"projected",commandId:t.commandId,stateProjectionPolicy:t.stateProjectionPolicy,projectionMode:"structural-required",trigger:r,targetEpicId:i,targetStoryId:null,includedStoryCount:Object.keys(o).length,includedEpicCount:Object.keys(s).length,omittedStoryCount:Math.max(0,Object.keys(e.stories).length-Object.keys(o).length),omittedEpicCount:Math.max(0,Object.keys(e.epics).length-Object.keys(s).length),reason:"targeted-invocation",reasonCodes:["structural-required","yoloop-targeted"]};return b({...e,stories:o,epics:s,scope:u},e,u)}function se(r,e){const t={};for(const[i,c]of Object.entries(r.epics)){const o=Array.isArray(c.stories)?c.stories.filter(s=>typeof s=="string"&&e.has(s)):[];t[i]={id:a(c.id)??i,...a(c.status,40)?{status:a(c.status,40)}:{},...typeof c.total_stories=="number"&&Number.isFinite(c.total_stories)?{total_stories:c.total_stories}:{},...typeof c.completed_stories=="number"&&Number.isFinite(c.completed_stories)?{completed_stories:c.completed_stories}:{},...o.length>0?{stories:o}:{},...o.length>0&&Array.isArray(c.depends_on)?{depends_on:c.depends_on.filter(s=>typeof s=="string"&&s.length>0)}:{},...o.length>0&&(c.branch_mode==="epic"||c.branch_mode==="story")?{branch_mode:c.branch_mode}:{},...o.length>0&&typeof c.execution_branch=="string"?{execution_branch:c.execution_branch}:{},...o.length>0&&typeof c.origin_branch=="string"?{origin_branch:c.origin_branch}:{},...o.length>0&&(c.branch_lease===null||typeof c.branch_lease=="object")?{branch_lease:c.branch_lease}:{}}}return t}function ae(r){return r.stateSummary?.totals.stories??(r.scope?.includedStoryCount??Object.keys(r.stories).length)+(r.scope?.omittedStoryCount??0)}function ue(r){return r.stateSummary?.totals.epics??(r.scope?.includedEpicCount??Object.keys(r.epics).length)+(r.scope?.omittedEpicCount??0)}function de(r,e){if(r.stateSummary)return{...r.stateSummary,projection:{...r.stateSummary.projection,scopeKind:"projected",projectionMode:e.projectionMode,includedStoryCount:e.includedStoryCount,includedEpicCount:e.includedEpicCount??r.stateSummary.projection.includedEpicCount,omittedStoryCount:e.omittedStoryCount,omittedEpicCount:e.omittedEpicCount,reason:"body-size"},reasonCodes:g(r.stateSummary.reasonCodes,["payload-size-guardrail","state-summary-preserved","nonessential-state-degraded"])}}function ye(r){const e=r.scope,t=new Set;if(e?.projectionMode==="structural-required")for(const m of Object.keys(r.stories))t.add(m);else e?.targetStoryId&&S(e.targetStoryId,r,t);const i={};for(const m of t){const _=r.stories[m];_&&(i[m]=_)}const c=se(r,t),o=Object.keys(i).length,s=Object.keys(c).length,u=Math.max(0,ae(r)-o),l=Math.max(0,ue(r)-s),d=e?.projectionMode==="structural-required"?"structural-required":"summary-only",p={kind:"projected",commandId:e?.commandId??null,stateProjectionPolicy:e?.stateProjectionPolicy??null,projectionMode:d,...e?.trigger?{trigger:e.trigger}:{},targetEpicId:e?.targetEpicId??null,targetStoryId:e?.targetStoryId??null,includedStoryCount:o,includedEpicCount:s,omittedStoryCount:u,omittedEpicCount:l,reason:"body-size",reasonCodes:g(e?.reasonCodes,["payload-size-guardrail",t.size>0?"structural-targets-preserved":"stories-omitted","epics-stubbed","state-summary-preserved"])},f=de(r,p);return{...r,stories:i,epics:c,scope:p,...f?{stateSummary:f}:{}}}function me(r,e){const t=r.trim();try{const i=D(t);if(!i){if(Z(t)){const o=n("story-reference","story-targeted"),s=x(t);if(s)return O(t,e,o,s,"targeted-story",["story-reference-targeted"])}return y(t,e,null,"full-compatible",["unknown-command-full-state"])}if(i.stateProjectionPolicy==="epic-summary")return oe(t,e,i);if(i.stateProjectionPolicy==="yoloop-targeted")return ne(t,e,i);const c=x(t);if(i.stateProjectionPolicy==="story-targeted")return c?O(t,e,i,c,i.structuralRequired?"structural-required":"targeted-story",[i.structuralRequired?"structural-required":"targeted-story"]):i.structuralRequired?y(t,e,i,"structural-required",["structural-target-missing-full-state"]):v(t,e,i,["story-target-missing-summary-only"]);if(i.stateProjectionPolicy==="adaptive-targeted"){if(c&&e.stories[c])return O(t,e,i,c,"targeted-story",["adaptive-story-targeted"]);const o=k(t,e);return o?z(t,e,i,o,"targeted-epic",["adaptive-epic-targeted"]):v(t,e,i,["adaptive-summary-only","target-unresolved-summary-only"])}if(i.stateProjectionPolicy==="epic-targeted"){const o=k(t,e);return o?z(t,e,i,o,i.structuralRequired?"structural-required":"targeted-epic",[i.structuralRequired?"structural-required":"targeted-epic"]):i.structuralRequired?y(t,e,i,"structural-required",["structural-epic-target-missing-full-state"]):v(t,e,i,["epic-target-missing-summary-only"])}return i.stateProjectionPolicy==="continuity-scoped"?v(t,e,i,["continuity-scoped-summary-only"]):v(t,e,i,["policy-full-summary-only"])}catch{return y(t,e,null,"full-compatible",["projection-error-full-state"])}}export{ye as degradeStateSnapshotForPayloadLimit,me as projectStateSnapshotForInvoke};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const o="neocortex:tier",
|
|
1
|
+
import{GENERATED_CLIENT_COMMANDS as p}from"../generated/command-registry.generated.js";const o="neocortex:tier",b="neocortex:quota:",d=300*1e3,m=3600*1e3,l=new Set(["free","pro","enterprise"]),s="free",g={status:"free",init:"free","create-epic":"free","idea-diagnose":"free","idea-research":"free","generate-epic":"free",exec:"pro",yolo:"pro",epic:"pro","setup-branch":"free",diagnose:"free",research:"free","write-spec":"free","create-tasks":"free",implement:"free","update-memory":"free",commit:"free",sync:"free","create-pr":"free",review:"pro",merge:"free","fix-blocked":"free","finalize-epic":"free",cleanup:"free","resolve-conflicts":"free",audit:"free",menu:"free",plans:"free",billing:"free",subscribe:"free","arch-plan":"free","arch-prd":"free","arch-architecture":"free","arch-api-contracts":"free","arch-api-integrations":"free","arch-database":"free","arch-security":"free","arch-design-system":"free","arch-ux-design":"free","arch-review":"free","arch-fitness-functions":"pro","arch-performance":"pro","arch-testing":"pro","arch-infrastructure":"pro",refactor:"pro","tech-debt":"free","tech-debt-scan":"pro","qa-scan":"pro","mutation-test":"pro",yoloop:"pro","migrate-state":"free","policy-audit":"pro","sync-openapi":"free","generate-pacts":"pro","verify-pacts":"free","property-test":"pro","chaos-plan":"pro","ui-ux-review":"pro","solyd-system":"enterprise",goal:"enterprise","goal-tick":"enterprise",loop:"enterprise","loop-tick":"enterprise",jobs:"enterprise",runner:"enterprise"},y=Object.freeze(Object.fromEntries(p.map(i=>[i.id,i.policy.minimumTier]))),T=[{id:"status",number:1,aliases:["st"]},{id:"init",number:2,aliases:["inicializar"]},{id:"arch-plan",number:3,aliases:["arquitetura","architecture","arch"]},{id:"arch-prd",number:4,aliases:["prd","product-requirements"]},{id:"arch-architecture",number:5,aliases:["arch-doc","tech-architecture"]},{id:"arch-api-contracts",number:6,aliases:["api-contracts","api-contract"]},{id:"arch-api-integrations",number:7,aliases:["api-integrations","api-int"]},{id:"arch-database",number:8,aliases:["database-schema","db-schema","db"]},{id:"arch-security",number:9,aliases:["cyber-security","security","sec"]},{id:"arch-design-system",number:10,aliases:["design-system","ds","atomic-design"]},{id:"arch-ux-design",number:11,aliases:["ux-design","ux","wireframes","wireframe","user-flows"]},{id:"arch-performance",number:12,aliases:["performance","perf","capacity-planning","capacity","arch-perf","performance-strategy"]},{id:"arch-testing",number:13,aliases:["testing-strategy","test-plan","test-strategy","arch-test"]},{id:"arch-infrastructure",number:14,aliases:["infrastructure","infra","deploy-plan","deployment","arch-infra","arch-deploy"]},{id:"arch-review",number:15,aliases:["review-consolidation","consolidation","architecture-review","arch-consolidation"]},{id:"arch-fitness-functions",number:16,aliases:["fitness","fitness-functions","archfit","arch-fit","fit-funcs"]},{id:"create-epic",number:17,aliases:["criar-epic","planejamento"]},{id:"idea-diagnose",number:18,aliases:["idea-diag"]},{id:"idea-research",number:19,aliases:["idea-pesq"]},{id:"generate-epic",number:20,aliases:["gerar-epic"]},{id:"exec",number:21,aliases:["executar","pipeline"]},{id:"yolo",number:22,aliases:[]},{id:"epic",number:23,aliases:["parallel-epic"]},{id:"setup-branch",number:24,aliases:["setup","branch"]},{id:"diagnose",number:25,aliases:["diag","diagnostico","c02"]},{id:"research",number:26,aliases:["pesquisar","pesq","research-fix","c03"]},{id:"write-spec",number:27,aliases:["spec","especificacao","c04"]},{id:"create-tasks",number:28,aliases:["tasks","tarefas","c05"]},{id:"implement",number:29,aliases:["impl","implementar","c06"]},{id:"commit",number:30,aliases:["push","commit-push","commit_push","cp","c07"]},{id:"sync",number:31,aliases:["sincronizar","c08"]},{id:"create-pr",number:32,aliases:["pr","c09"]},{id:"review",number:33,aliases:["revisar","c11"]},{id:"merge",number:34,aliases:["mesclar","c12"]},{id:"fix-blocked",number:35,aliases:["fix","corrigir"]},{id:"finalize-epic",number:36,aliases:["finalizar"]},{id:"resolve-conflicts",number:37,aliases:["conflitos"]},{id:"update-memory",number:38,aliases:["memoria"]},{id:"refactor",number:39,aliases:["refactoring","refact","refac","rf","cleanup-code","code-cleanup","code-quality","improve-code","modernize","modernization","legacy","legacy-code","debt-pay","pay-debt","debt-reduction","smell-fix","fix-smells","code-smells","strangler","strangler-fig"]},{id:"cleanup",number:40,aliases:["limpar","limpeza"]},{id:"audit",number:41,aliases:["auditar","auditoria"]},{id:"tech-debt",number:42,aliases:["debt","debts","debt-list","tech-debts","td"]},{id:"menu",number:43,aliases:["help","ajuda","?","commands","cmds"]},{id:"plans",number:44,aliases:["planos","pricing"]},{id:"billing",number:45,aliases:["bill","subscription","sub"]},{id:"subscribe",number:46,aliases:["upgrade","checkout"]},{id:"qa-scan",number:47,aliases:["qa","qa-test","visual-qa","e2e-scan","troubleshoot","debug-ui","scan","a11y","accessibility","wcag"]},{id:"yoloop",number:48,aliases:["auto-yolo","epic-runner","story-runner","loop-yolo","auto-epic"]},{id:"migrate-state",number:49,aliases:["migrate","state-migrate","schema-migrate"]},{id:"policy-audit",number:50,aliases:["policy","audit-policy","policy-history","policies"]},{id:"mutation-test",number:51,aliases:["mutation","stryker","kill-mutants"]},{id:"sync-openapi",number:52,aliases:["openapi-sync","api-sync","spec-sync","regen-openapi"]},{id:"generate-pacts",number:53,aliases:["pacts","gen-pacts","regen-pacts","create-pacts"]},{id:"verify-pacts",number:54,aliases:["verify-pact","pact-verify","check-pacts","pact-check"]},{id:"property-test",number:55,aliases:["property","pbt","proptest","property-tests","invariant-test"]},{id:"chaos-plan",number:56,aliases:["chaos","gameday","resilience-test"]},{id:"ui-ux-review",number:57,aliases:["ux-review","design-review","visual-review","product-polish"]},{id:"solyd-system",number:58,aliases:["security-system","authorized-security","sec-system"]},{id:"goal",number:59,aliases:["goals","durable-goal","continuity-goal"]},{id:"loop",number:60,aliases:["loops","durable-loop","continuity-loop"]},{id:"jobs",number:61,aliases:["job","continuity-jobs"]},{id:"runner",number:62,aliases:["neocortex-runner","continuity-runner"]}],u=Object.freeze(p.map(i=>Object.freeze({id:i.id,number:i.number,aliases:i.aliases}))),w=new Map(u.map(i=>[i.id,i])),C=new Map(u.map(i=>[i.number,i])),v=new Map(u.flatMap(i=>i.aliases.map(a=>[h(a),i.id])));function h(i){if(/[^\x20-\x7e]/.test(i))return"";const a=i.replace(/^[\t\n\r ]+|[\t\n\r ]+$/g,"");if(!a||a.startsWith("**"))return"";const e=(a.startsWith("*")?a.slice(1):a).replace(/[A-Z]/g,r=>r.toLowerCase());return/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(e)||e==="?"?e:""}function _(i){const a=i.trim();if(/^@?epic-[a-z0-9][a-z0-9._-]*$/i.test(a))return"epic";const e=a.split(/\s+/,1)[0]??"",r=e.trim().replace(/^\*/,"");if(/^\d+$/.test(r))return C.get(Number.parseInt(r,10))?.id??null;const t=h(e);return t?t==="goal-tick"?"goal":t==="loop-tick"?"loop":w.has(t)?t:v.get(t)??null:null}const f={free:0,pro:1,enterprise:2};class R{cache;licenseClient;cachedTier=null;constructor(a){this.cache=a.cacheProvider,this.licenseClient=a.licenseClient}async getCachedTier(){try{if(this.cachedTier)return this.cachedTier;const a=await this.cache.get(o);if(a&&l.has(a))return this.cachedTier=a,this.cachedTier;const e=await this.licenseClient.getToken();if(e){const r=this.extractTierFromJwt(e);return this.cachedTier=r,await this.cache.set(o,r,m).catch(()=>{}),r}return s}catch{return s}}async updateTier(a){try{if(!l.has(a))return;this.cachedTier=a,await this.cache.set(o,a,m).catch(()=>{})}catch{}}async invalidateTierCache(){try{this.cachedTier=null,await this.cache.clear().catch(()=>{})}catch{}}async preFlightCheck(a,e){try{const r=e??await this.getCachedTier(),t=_(a)??a,c=y[t]??"free";return f[r]>=f[c]?{allowed:!0}:{allowed:!1,message:this.buildUpgradeMessage(t,r,c)}}catch{return{allowed:!0}}}async updateQuotaFromResponse(a){try{const e=a.quotaRemaining;if(!e)return;const r={stepsRemaining:e.stepsRemaining??0,invocationsRemaining:e.invocationsRemaining??0,stepsLimit:e.stepsLimit??0,invocationsLimit:e.invocationsLimit??0,cachedAt:Date.now()},t=this.getQuotaCacheKey();await this.cache.set(t,JSON.stringify(r),d).catch(()=>{})}catch{}}async getCachedQuota(){try{const a=this.getQuotaCacheKey(),e=await this.cache.get(a);if(!e)return null;const r=JSON.parse(e);return Date.now()-r.cachedAt>d?null:r}catch{return null}}async offlineQuotaCheck(a=!1){try{if(!a)return{allowed:!0};const e=await this.getCachedQuota();return e?e.stepsRemaining<=0&&e.stepsLimit>0?{allowed:!1,message:`Daily step limit reached (${e.stepsLimit}/${e.stepsLimit}). Resets at 00:00 UTC.`}:e.invocationsRemaining<=0&&e.invocationsLimit>0?{allowed:!1,message:`Daily invocation limit reached (${e.invocationsLimit}/${e.invocationsLimit}). Resets at 00:00 UTC.`}:{allowed:!0}:{allowed:!0}}catch{return{allowed:!0}}}extractTierFromJwt(a){try{const e=a.split(".");if(e.length!==3)return s;const r=e[1],t=Buffer.from(r,"base64url").toString("utf8"),n=JSON.parse(t).tier;return n&&l.has(n)?n:s}catch{return s}}buildUpgradeMessage(a,e,r){return`The *${a} command requires ${r.toUpperCase()} plan. Your current plan: ${e.toUpperCase()}. Upgrade: https://neocortex.sh/portal/dashboard/plans`}getQuotaCacheKey(){const e=new Date().toISOString().slice(0,10);return`${b}${e}`}}export{u as CLIENT_PREFLIGHT_COMMAND_REGISTRY,R as TierAwareClient,h as normalizeCommandToken,_ as resolveClientPreFlightTrigger};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readFileSync as i}from"node:fs";import{fileURLToPath as c}from"node:url";import{dirname as o,join as a}from"node:path";function m(n=import.meta.url){try{let t=o(c(n));for(let r=0;r<6;r+=1){try{const e=JSON.parse(i(a(t,"package.json"),"utf8"));if((e.name==="@ornexus/neocortex"||e.name==="@neocortex/client")&&typeof e.version=="string"&&/^\d+\.\d+\.\d+(?:[-+][A-Za-z0-9.-]+)?$/.test(e.version))return e.version}catch{}t=o(t)}}catch{}return"0.0.0"}const d=m();export{d as CLIENT_VERSION,m as getClientVersion};
|