@kynver-app/runtime 0.2.19 → 0.2.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -18
- package/dist/bootstrap.d.ts +48 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.js +73 -66
- package/dist/config.d.ts +1 -1
- package/dist/cron/cron-install-plan.d.ts +3 -1
- package/dist/daemon-keeper.d.ts +32 -0
- package/dist/doctor/runner-install.d.ts +86 -2
- package/dist/doctor/runtime-takeover-deploy-evidence.d.ts +7 -3
- package/dist/doctor/runtime-takeover.probes.d.ts +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +95 -88
- package/dist/landing/land-pr-check-classify.d.ts +6 -0
- package/dist/orchestration-providers/inventory.d.ts +27 -4
- package/dist/provider-evidence/index.d.ts +0 -1
- package/dist/providers/model-preflight.d.ts +8 -0
- package/dist/providers/openai-compatible-response.d.ts +23 -0
- package/dist/providers/openai-compatible-runner.d.ts +1 -0
- package/dist/providers/openai-compatible.d.ts +46 -0
- package/dist/scheduler-cutover.d.ts +1 -1
- package/dist/server/adapter-contract.d.ts +1 -0
- package/dist/server/adapter-contract.js +1 -0
- package/dist/server/cleanup.js +14 -14
- package/dist/server/context-budget-receipt.d.ts +2 -0
- package/dist/server/context-budget-receipt.js +6 -0
- package/dist/server/db-credentials.d.ts +1 -0
- package/dist/server/db-credentials.js +2 -0
- package/dist/server/default-repo.js +1 -1
- package/dist/server/heavy-verification.js +1 -1
- package/dist/server/memory-cost-enforce.js +2 -2
- package/dist/server/memory-cost.js +2 -2
- package/dist/server/model-routing.d.ts +3 -0
- package/dist/server/model-routing.js +5 -0
- package/dist/server/monitor.js +7 -7
- package/dist/server/node-runtime-policy.d.ts +1 -0
- package/dist/server/node-runtime-policy.js +1 -0
- package/dist/server/orchestration.d.ts +1 -1
- package/dist/server/orchestration.js +1 -1
- package/dist/server/prompt.d.ts +1 -0
- package/dist/server/prompt.js +19 -0
- package/dist/server/worker-policy.d.ts +1 -1
- package/dist/server/worker-policy.js +2 -2
- package/dist/status.d.ts +3 -1
- package/dist/stream.d.ts +13 -0
- package/dist/worker-provider-policy.d.ts +21 -4
- package/dist/worker-usage.d.ts +20 -0
- package/dist/worktree.d.ts +33 -0
- package/package.json +34 -3
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
function m(e){return["Repair target PR policy:","- Work on the existing target PR branch \u2014 do not open a duplicate repair PR by default.",`- Canonical target PR: ${e.targetPrUrl}`,...e.targetPrBranch?[`- Canonical target branch: \`${e.targetPrBranch}\` (checkout is already on this branch).`]:[],`- Reconcile ${e.targetPrUrl} in structured finalResult.targetPrReconciliation.`,"- Only supersede the original when the branch is inaccessible: set supersedesOriginalTargetPr: true with reason and close/comment on the original PR."]}var x="embedded-1",y=[{slug:"ghost",displayName:"Ghost",description:"Orchestration persona.",dispatchLane:null,defaultRoleLane:"system"},{slug:"astra",displayName:"Astra",description:"Planning persona.",dispatchLane:"implementation",defaultRoleLane:"plan_author"},{slug:"rhea",displayName:"Rhea",description:"Implementation persona.",dispatchLane:"implementation",defaultRoleLane:"implementer"},{slug:"mnemo",displayName:"Mnemo",description:"Implementation persona.",dispatchLane:"implementation",defaultRoleLane:"implementer"},{slug:"sentinel",displayName:"Sentinel",description:"Review persona.",dispatchLane:"review",defaultRoleLane:"deep_reviewer"},{slug:"pixel",displayName:"Pixel",description:"Implementation persona.",dispatchLane:"implementation",defaultRoleLane:"implementer"},{slug:"schema",displayName:"Schema",description:"Implementation persona.",dispatchLane:"implementation",defaultRoleLane:"implementer"},{slug:"atlas",displayName:"Atlas",description:"Implementation persona.",dispatchLane:"implementation",defaultRoleLane:"runtime_verifier"},{slug:"bridge",displayName:"Bridge",description:"Implementation persona.",dispatchLane:"implementation",defaultRoleLane:"implementer"},{slug:"catalyst",displayName:"Catalyst",description:"Implementation persona.",dispatchLane:"implementation",defaultRoleLane:"implementer"},{slug:"lorentz",displayName:"Lorentz",description:"Review persona.",dispatchLane:"review",defaultRoleLane:"report_reviewer"},{slug:"dalton",displayName:"Dalton",description:"Landing persona.",dispatchLane:"landing",defaultRoleLane:"implementer"}],w={"worker.prompt.core_rules":["Structured final result (recommended): record completion as JSON with summary, files, PR URLs, verification, risks, and blockers.","Completion handoff (required): before you stop, summarize the outcome in your last message and append a heartbeat line with phase `complete` and a structured finalResult object. Commit your work cleanly and open a GitHub PR (draft OK) for substantial changes \u2014 never leave uncommitted changes behind without reporting them.","Review-only workers must not open new implementation PRs \u2014 review the existing PR and record a verdict in the final result. Prefer `gh pr view` / `gh pr diff`; if a local checkout is needed, use a disposable ref or detached worktree, not a checked-out `pr-*` branch.","Keep verification targeted to touched paths; avoid full-monorepo verification unless explicitly requested.","Do not run `npm publish`.","If verification fails, append a heartbeat line immediately with the failing command, reason, and next action."].join(`
|
|
2
|
+
`),"worker.prompt.progress.compact":"Plan progress: when planId is set, report progress with `kynver plan progress --plan <planId> --row <rowKey> --role implementer --status in_progress|running|partial|blocked`. Do not mark rows done from the worker CLI.","worker.prompt.progress.full":["Structured plan progress (required when planId is set):","- Report checkpoints with `kynver plan progress --plan <planId> --row <rowKey> --role implementer --status in_progress|running|partial|blocked`.","- When a slice is finished, emit `partial` with evidence (`--evidence pr:<url>`, `--evidence path:<file>`, or `--evidence command:<cmd>`).","- Do not propose or confirm row `done` from the worker CLI."].join(`
|
|
3
|
+
`),"worker.prompt.merge_gate.compact":"Verification cost control: prefer local verification before requesting CI runs; do not push empty commits to re-trigger CI; record verification evidence on the PR.","worker.prompt.merge_gate.full":["Verification cost control:","- Prefer local verification of touched paths before requesting any CI run.","- Do not push empty commits to re-trigger CI.","- Record verification evidence on the PR before requesting review."].join(`
|
|
4
|
+
`),"worker.prompt.plan_artifacts.compact":"Plan artifacts: when authoring or revising plan documents, open a GitHub PR early and iterate from that PR branch; do not leave the canonical plan only in a local worktree.","worker.prompt.plan_artifacts.full":["Plan artifacts (when authoring or revising plan documents):","- Create a feature branch and open a GitHub PR (draft OK) before substantial drafting; commit and push the plan file.","- Iterate on that PR branch and link the PR URL on the related task and progress evidence."].join(`
|
|
5
|
+
`)},b={"harness.maxTaskAttempts":4,"harness.dispatchCooldownMs":5e3,"daemon.idleIntervalMs":5*6e4,"daemon.maxIdleStreak":10},g={version:x,generatedAt:"1970-01-01T00:00:00.000Z",personas:y,instructions:w,policyThresholds:b};var P=g;function i(e){let t=P.instructions[e];if(typeof t=="string"&&t.trim())return t;let r=g.instructions[e];return typeof r=="string"?r:""}var v="runtime-context-budget-receipt.v2";function h(e){return!Number.isFinite(e)||e<=0?0:Math.ceil(e/4)}function c(e,t,r){let o=t?.length??0;return{section:e,chars:o,estimatedTokens:h(o),...r}}function S(e,t){let r=e.reduce((n,a)=>n+a.chars,0),o=e.reduce((n,a)=>n+a.estimatedTokens,0),s=e.reduce((n,a)=>n+(a.omittedCount??0),0),l=e.reduce((n,a)=>n+(a.duplicatesCollapsed??0),0);return{totalChars:r,estimatedTokens:o,duplicatesCollapsed:t?.duplicatesCollapsed??l,omittedCount:t?.omittedCount??s}}function R(e){let t=S(e.sections,{duplicatesCollapsed:e.duplicatesCollapsed,omittedCount:e.omittedCount});return{schemaVersion:v,surface:e.surface,agentOsId:e.agentOsId?.trim()||null,taskId:e.taskId?.trim()||null,planId:e.planId?.trim()||null,personaSlug:e.personaSlug?.trim().toLowerCase()||null,mode:e.mode,generatedAt:e.generatedAt,...t,finalSerializedChars:e.finalSerializedChars,finalSerializedTokens:h(e.finalSerializedChars),usefulContextCoverage:e.usefulContextCoverage,budgetSatisfied:e.budgetSatisfied??!0,overBudgetReason:e.overBudgetReason??null,activeStateLookups:e.activeStateLookups??[],sections:e.sections}}var u=2e5,f=500;function C(e){let t=e.ownedPaths.length?`Owned paths: ${e.ownedPaths.join(", ")}. Do not edit outside these paths without stopping and reporting why.`:"Owned paths: unrestricted for this worker, but keep edits tightly scoped.",r=!!e.model?.toLowerCase().includes("haiku"),o=r?"compact":"full",s=r?e.planId?`Active planId: ${e.planId}`:"No planId on this worker.":e.planId?`Active planId: ${e.planId}${e.taskId?` \xB7 taskId: ${e.taskId}`:""}`:"No planId on this worker \u2014 still emit progress when you touch plan-scoped work.",l=[...i(`worker.prompt.progress.${o}`).split(`
|
|
6
|
+
`),s],n=i(`worker.prompt.merge_gate.${o}`).split(`
|
|
7
|
+
`),a=i(`worker.prompt.plan_artifacts.${o}`).split(`
|
|
8
|
+
`);return["You are running under the Kynver AgentOS runtime.","Immediately state your plan before editing.",t,`Worktree: ${e.worktreePath}`,`Progress heartbeat file: ${e.heartbeatPath}`,"After each major step, append one JSON line to the heartbeat file with fields: ts, phase, summary, changedFiles, blocker.","Before exiting, append a terminal heartbeat with phase `complete` and a structured finalResult object; if you cannot complete, append blocker plus the recovery next action instead of exiting silently.","Final response must include files changed, verification commands, and unresolved risks.",...i("worker.prompt.core_rules").split(`
|
|
9
|
+
`),"",...l,"",...n,"",...a,"",...e.runtimeEnvelopeMarkdown?.trim()?[e.runtimeEnvelopeMarkdown.trim(),""]:[],...e.contextEnvelopeMarkdown?.trim()?[e.contextEnvelopeMarkdown.trim(),""]:[],...e.personaMarkdown?.trim()?[e.personaMarkdown.trim(),""]:[],...e.instructionPolicyMarkdown?.trim()?["Operating rules (from AgentOS memory policy):",e.instructionPolicyMarkdown.trim(),""]:[],...e.memoryQualityMarkdown?.trim()?[e.memoryQualityMarkdown.trim(),""]:[],...e.repairTargetPrUrl?[...m({targetPrUrl:e.repairTargetPrUrl,targetPrBranch:e.repairTargetBranch??null}),""]:[],"Task:",e.task].join(`
|
|
10
|
+
`)}function _(e){let t=e.ownedPaths.length?`Owned paths: ${e.ownedPaths.join(", ")}. Do not edit outside these paths without stopping and reporting why.`:"Owned paths: unrestricted for this worker, but keep edits tightly scoped.",r=!!e.model?.toLowerCase().includes("haiku"),o=r?"compact":"full",s=r?e.planId?`Active planId: ${e.planId}`:"No planId on this worker.":e.planId?`Active planId: ${e.planId}${e.taskId?` \xB7 taskId: ${e.taskId}`:""}`:"No planId on this worker \u2014 still emit progress when you touch plan-scoped work.",l=[...i(`worker.prompt.progress.${o}`).split(`
|
|
11
|
+
`),s],n=i(`worker.prompt.merge_gate.${o}`).split(`
|
|
12
|
+
`),a=i(`worker.prompt.plan_artifacts.${o}`).split(`
|
|
13
|
+
`),d=e.repairTargetPrUrl?m({targetPrUrl:e.repairTargetPrUrl,targetPrBranch:e.repairTargetBranch??null}).join(`
|
|
14
|
+
`):null;return["You are running under the Kynver AgentOS runtime.","Immediately state your plan before editing.",t,`Worktree: ${e.worktreePath}`,`Progress heartbeat file: ${e.heartbeatPath}`,"After each major step, append one JSON line to the heartbeat file with fields: ts, phase, summary, changedFiles, blocker.","Before exiting, append a terminal heartbeat with phase `complete` and a structured finalResult object; if you cannot complete, append blocker plus the recovery next action instead of exiting silently.","Final response must include files changed, verification commands, and unresolved risks.",...i("worker.prompt.core_rules").split(`
|
|
15
|
+
`),l.join(`
|
|
16
|
+
`),n.join(`
|
|
17
|
+
`),a.join(`
|
|
18
|
+
`),d,e.task].filter(p=>!!p).join(`
|
|
19
|
+
`)}function E(e){let t=C(e),r=_(e),o=e.surface??"runtime_prompt",s=[c("structural",r),c("memory_preview",e.runtimeEnvelopeMarkdown),c("task_envelope",e.contextEnvelopeMarkdown),c("persona",e.personaMarkdown),c("instruction_policy",e.instructionPolicyMarkdown),c("memory_quality",e.memoryQualityMarkdown)],l=e.enforcementEnabled??!1,n=t.length,a=Buffer.byteLength(t,"utf8"),d=n>u,p=d?u>=f:n>=f,I=d?`runtime_prompt exceeds hard cap: ${n} chars (${a} UTF-8 bytes) > ${u} (${l?"active":"shadow"} mode; no truncation applied)`:null,k=R({surface:o,agentOsId:e.agentOsId??null,taskId:e.taskId??null,planId:e.planId??null,personaSlug:e.personaSlug??null,mode:e.mode??"routine",generatedAt:e.generatedAt??new Date(0).toISOString(),finalSerializedChars:n,sections:s,usefulContextCoverage:{requiredOperatingRuleSlugsPresent:[],requiredOperatingRuleDenominator:0,activeTaskHandlePresent:!!e.taskId,planHandlePresent:!!e.planId,selectedHandles:[],omittedHandles:[],expansionRoutes:[],memoryQualityTraceId:null},budgetSatisfied:!d&&p,overBudgetReason:I});return{prompt:t,receipt:k}}var B={hardCapChars:u,safeFloorChars:f};export{B as RUNTIME_PROMPT_ENFORCEMENT,C as buildPrompt,E as buildPromptWithReceipt};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { auditWorkerEnv, scrubWorkerEnv, listForbiddenWorkerEnvKeys, listOperatorAllowedWorkerEnvKeys, isForbiddenWorkerEnvKey, } from "../worker-env.js";
|
|
2
2
|
export { auditReviewWorkerCredentialScope, buildWorkerSpawnEnv, isNoProdCredentialReviewEnvironment, KYNVER_NO_PROD_DB_CREDENTIALS_ENV, } from "../security-review-environment.js";
|
|
3
3
|
export { isHarnessExpertReviewWorker } from "../harness-expert-review.js";
|
|
4
|
-
export { DEFAULT_WORKER_PROVIDER, resolveConfiguredWorkerProvider, isClaudeFamilyProvider, taskAllowsClaudeWorker, enforceCursorWorkerProvider, preferCursorExecutor, type EnforceCursorWorkerProviderInput, } from "../worker-provider-policy.js";
|
|
4
|
+
export { DEFAULT_WORKER_PROVIDER, normalizeWorkerProviderName, resolveConfiguredWorkerProvider, isClaudeFamilyProvider, taskAllowsClaudeWorker, taskExpressesWorkerProviderPreference, enforceCursorWorkerProvider, preferCursorExecutor, type EnforceCursorWorkerProviderInput, } from "../worker-provider-policy.js";
|
|
5
5
|
export { classifyHeavyShellCommand } from "../heavy-verification/command-classify.js";
|
|
6
6
|
export { gateWorkerShellCommand, HEAVY_VERIFICATION_TOKEN_REQUIRED, type GateWorkerShellCommandOpts, type WorkerCommandGateOutcome, type WorkerCommandGateResult, } from "../heavy-verification/worker-command-gate.js";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var o=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};function
|
|
2
|
-
${n}`,s=_r(e.personaSlug);return!!(r.startsWith(xr)||r===kr||r.startsWith("daemon-review:")||s&&C.has(s)&&(r.includes("evidence")||r.includes("validate")||r.includes("review")||Er(r,i)||$(i))||r.startsWith(Sr)&&e.parentTaskId&&s&&C.has(s)||e.planId&&!e.parentTaskId&&s&&C.has(s)&&$(i)||t.includes("expert pr review")||e.parentTaskId&&(t.startsWith("review:")||t.includes("review required")||t.includes("runtime review"))&&s&&C.has(s))}var Or=/^claude[-_]/i,Ar=/^(?:opus|sonnet|haiku)\b/i;function ge(e){let r=e.trim();return Or.test(r)||Ar.test(r)}function he(e){let r=e.trim().toLowerCase();return r.startsWith("gpt-")||r.startsWith("gpt5")||r.includes("codex")}function ye(e){let r=e.trim().toLowerCase();return r.includes("composer")||r.includes("cursor")}function wr(e){return he(e)?"codex":ge(e)?"claude":(ye(e),"cursor")}function Ir(e){if(!e.startsWith("provider:"))return null;let r=e.slice(9),t=r.indexOf(":"),n=(t>=0?r.slice(0,t):r).trim().toLowerCase(),i=t>=0&&r.slice(t+1).trim()||void 0;return n?n==="claude"||n==="opus"||n==="anthropic"?{provider:"claude",model:i,rule:i?"executor_ref:provider_claude_model":"executor_ref:provider_claude"}:n==="codex"?{provider:"codex",model:i,rule:"executor_ref:provider_codex"}:n==="cursor"||n==="composer"?{provider:"cursor",model:i,rule:"executor_ref:provider_cursor"}:null:null}function Pr(e){if(!e.startsWith("harness-lane:"))return null;let r=e.split(":").map(i=>i.trim()).filter(Boolean);if(r.length<2)return null;let t=r[1],n=r.slice(2).join(":");return n?ge(n)||he(n)||ye(n)?{lane:t,model:n,provider:wr(n),rule:"executor_ref:harness_lane_model"}:{lane:t,rule:"executor_ref:harness_lane"}:{lane:t,rule:"executor_ref:harness_lane"}}function j(e){let r=typeof e=="string"?e.trim():"";return r?Ir(r)??Pr(r):null}f();a();a();a();var Ia=process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim()||"gpt-5.4";function nt(){return process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim()||"gpt-5.4"}var ot=nt();var Xe="composer-2.5";var d="cursor",it=new Set(["claude","opus","anthropic"]),st=[/\[worker-provider:\s*claude\]/i,/\[use-claude-worker\]/i,/\[operator-worker-provider:\s*claude\]/i];function T(e,r){let t=e[r];return typeof t=="string"?t.trim():""}function c(e){if(!e?.trim())return!1;let r=e.trim().toLowerCase();return it.has(r)?!0:r.includes("claude")||r.includes("opus")}function oe(e){if(!e)return!1;let r=e.workerProviderOverride;if(typeof r=="string"&&c(r))return!0;let t=T(e,"executorRef").toLowerCase();if(t==="provider:claude"||t.startsWith("provider:claude:")||t.includes("claude-worker-override")||t.includes("operator-claude"))return!0;let n=j(T(e,"executorRef"));if(n?.provider&&c(n.provider)||n?.model&&c(at(n.model)))return!0;let i=T(e,"description");if(st.some(l=>l.test(i)))return!0;let s=T(e,"title");return!!/\[use-claude-worker\]/i.test(s)}function at(e){let r=e.trim().toLowerCase();return/^claude[-_]/.test(r)||/^(?:opus|sonnet|haiku)\b/.test(r)?"claude":r}function lt(e,r){return{provider:d,model:Xe,rule:`policy:cursor_default${r}`,requestedModel:e}}function Qe(e){let{routing:r,task:t}=e,n=e.explicitProvider?.trim().toLowerCase();if(e.explicitProviderIsOperatorOverride&&c(n))return{...r,provider:"claude",rule:r.rule.startsWith("explicit:")?r.rule:"explicit:operator_provider"};if(oe(t)||r.rule==="explicit:cli"&&c(r.provider)||!c(r.provider))return r;let i=r.rule&&r.rule!=="default:global"?`:${r.rule.replace(/:/g,"_")}`:"";return lt(r.model,i)}function ct(e,r=d){let t=e?.trim();return t?c(t)?d:t==="codex"?"codex":t:r}function ut(e){let r=[...new Set(e.map(t=>t.trim().toLowerCase()).filter(Boolean))];return r.includes(d)?[...new Set(r.map(t=>c(t)?d:t))]:r.every(t=>c(t))?[d]:r}var dt=/\b(npm run typecheck|tsc\b[^|&;]*--noEmit|node scripts\/verify-pr-local\.mjs|kynver (harness )?verify)\b/i,mt=/\b(npm run build\b|next build\b)\b/i,ft=/\b(vercel (build|deploy|--prod))\b/i,pt=/\b(openai|anthropic|perplexity|voyage)\b.*\b(api|cli)\b|\b(paid|billable)[-_ ]?compute\b/i;function ie(e){let r=e.trim();return r?pt.test(r)?{heavy:!0,commandClass:"paid_compute",reason:"paid external compute requires heavy-verification token and operator approval"}:ft.test(r)?{heavy:!0,commandClass:"vercel_verify",reason:"Vercel build/deploy verification requires heavy-verification token"}:mt.test(r)?{heavy:!0,commandClass:"full_build",reason:"full app build requires heavy-verification token"}:dt.test(r)?{heavy:!0,commandClass:"full_typecheck",reason:"full repo typecheck requires heavy-verification token"}:{heavy:!1,commandClass:"allowed",reason:null}:{heavy:!1,commandClass:"allowed",reason:null}}var W="heavy_verification_token_required";import{spawnSync as Nt}from"node:child_process";a();import{closeSync as Rt,existsSync as x,mkdirSync as xt,openSync as kt,readdirSync as tr,readFileSync as St,statSync as _t,unlinkSync as nr,writeFileSync as Et}from"node:fs";import le from"node:path";import{mkdirSync as ht}from"node:fs";import{tmpdir as yt}from"node:os";import K from"node:path";import{homedir as gt}from"node:os";import Ze from"node:path";function er(){let e=process.env.KYNVER_STATE_ROOT;return e?Ze.resolve(e):Ze.join(gt(),".kynver","state")}function vt(){return!!(process.env.VERCEL||process.env.VERCEL_ENV||process.env.AWS_LAMBDA_FUNCTION_NAME||process.env.AWS_EXECUTION_ENV)}function bt(){let e=process.env.KYNVER_HEAVY_VERIFICATION_STATE_ROOT;return e?K.resolve(e):vt()?K.join(yt(),"kynver","state","heavy-verification"):K.join(er(),"heavy-verification")}function se(){return K.join(bt(),"slots")}function R(){let e=se();return ht(e,{recursive:!0}),e}var k=120*6e4,rr=1;function Ct(e,r){let t=Number(e);return!Number.isFinite(t)||t<=0?r:Math.floor(t)}function M(){let e=process.env.KYNVER_HEAVY_VERIFICATION_SKIP?.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function U(){let e=process.env.KYNVER_HEAVY_VERIFICATION_MAX_CONCURRENT;return e?Ct(e,rr):rr}function Ot(e){return`slot-${e}`}function At(e,r=se()){return le.join(r,`${e}.json`)}function ce(e){if(!x(e))return null;try{let r=JSON.parse(St(e,"utf8"));if(typeof r.slotId=="string"&&typeof r.pid=="number"&&typeof r.acquiredAt=="string"&&typeof r.command=="string")return r}catch{return null}return null}function or(e,r=k){if(!e||!V(e.pid))return!0;let t=Date.parse(e.acquiredAt);return Number.isNaN(t)?!0:Date.now()-t>r}function ir(e,r){let t=ce(e);if(t)return or(t,r);if(!x(e))return!0;try{return Date.now()-_t(e).mtimeMs>r}catch{return!0}}function wt(e,r){if(ir(e,r))try{nr(e)}catch{}}function It(e){return xt(e,{recursive:!0}),e}function ue(e={}){let r=It(e.slotsDir??R()),t=e.staleMs??k,n=0;for(let i of tr(r)){if(!i.endsWith(".json"))continue;let s=le.join(r,i),l=x(s);wt(s,t),l&&!x(s)&&(n+=1)}return n}function Pt(e={}){let r=e.slotsDir??R(),t=e.staleMs??k;ue({slotsDir:r,staleMs:t});let n=[];for(let i of tr(r)){if(!i.endsWith(".json"))continue;let s=ce(le.join(r,i));s&&!or(s,t)&&n.push(s)}return n}function ae(e={}){return Pt(e).length}function S(e,r={}){if(M())return{admitted:!0,slotId:null,activeSlots:0,maxSlots:U(),reason:null};let t=r.slotsDir??R(),n=r.staleMs??k,i=r.maxSlots??U();ue({slotsDir:t,staleMs:n});for(let l=0;l<i;l+=1){let u=Ot(l),p=At(u,t),ar=ce(p);if(ir(p,n))try{nr(p)}catch{}else if(ar||x(p))continue;let lr={slotId:u,pid:process.pid,acquiredAt:new Date().toISOString(),command:e};try{let g=kt(p,"wx");Et(g,JSON.stringify(lr,null,2),"utf8"),Rt(g);let cr=ae({slotsDir:t,staleMs:n});return{admitted:!0,slotId:u,activeSlots:cr,maxSlots:i,reason:null}}catch(g){if(g.code==="EEXIST")continue;throw g}}let s=ae({slotsDir:t,staleMs:n});return{admitted:!1,slotId:null,activeSlots:s,maxSlots:i,reason:`heavy verification at capacity (${s}/${i} slots)`}}function L(e,r={}){if(M())return{admitted:!0,slotId:null,activeSlots:0,maxSlots:U(),reason:null};let t=r.slotsDir??R(),n=r.staleMs??k,i=r.maxSlots??U();ue({slotsDir:t,staleMs:n});let s=ae({slotsDir:t,staleMs:n}),l=s<i;return{admitted:l,slotId:null,activeSlots:s,maxSlots:i,reason:l?null:`heavy verification at capacity (${s}/${i} slots); waiting for ${e}`}}function Dt(e){e<=0||Nt(process.execPath,["-e",`const d=Date.now()+${Math.floor(e)};while(Date.now()<d);`],{stdio:"ignore"})}function sr(e,r,t=2e3,n={}){let i=Date.now()+Math.max(0,r),s=S(e,n);for(;!s.admitted&&Date.now()<i;)Dt(Math.min(t,i-Date.now())),s=S(e,n);return s}function Bt(e,r={}){let t=ie(e);if(!t.heavy)return{allowed:!0,outcome:"allowed",commandClass:t.commandClass,reason:"command does not require heavy-verification token",verificationGate:{...L(e),slotId:null}};if(M())return{allowed:!0,outcome:"heavy_verification_skipped",commandClass:t.commandClass,reason:"KYNVER_HEAVY_VERIFICATION_SKIP bypasses gate",verificationGate:{...L(e),slotId:null}};let n=r.waitMs??0,i=n>0?sr(e,n,r.pollMs):S(e);return i.admitted?{allowed:!0,outcome:"allowed",commandClass:t.commandClass,reason:t.reason??"heavy-verification token acquired",verificationGate:i}:{allowed:!1,outcome:W,commandClass:t.commandClass,reason:t.reason??i.reason??W,verificationGate:i}}export{d as DEFAULT_WORKER_PROVIDER,W as HEAVY_VERIFICATION_TOKEN_REQUIRED,H as KYNVER_NO_PROD_DB_CREDENTIALS_ENV,Rr as auditReviewWorkerCredentialScope,yr as auditWorkerEnv,y as buildWorkerSpawnEnv,ie as classifyHeavyShellCommand,Qe as enforceCursorWorkerProvider,Bt as gateWorkerShellCommand,c as isClaudeFamilyProvider,h as isForbiddenWorkerEnvKey,Cr as isHarnessExpertReviewWorker,pe as isNoProdCredentialReviewEnvironment,de as listForbiddenWorkerEnvKeys,me as listOperatorAllowedWorkerEnvKeys,ut as preferCursorExecutor,ct as resolveConfiguredWorkerProvider,_ as scrubWorkerEnv,oe as taskAllowsClaudeWorker};
|
|
1
|
+
var o=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};function $(e){let r=e[vr];return r?new Set(r.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)):new Set}function y(e,r={}){return pr.has(e)?!0:hr.has(e)||r.operatorAllow?.has(e)||yr.some(t=>e.endsWith(t))?!1:fr.some(t=>e.endsWith(t))}function de(e){let r=$(e);return Object.keys(e).filter(t=>y(t,{operatorAllow:r})).sort()}function me(e){let r=$(e);return r.size===0?[]:Object.keys(e).filter(t=>r.has(t)&&!y(t,{operatorAllow:r})&&y(t)).sort()}function E(e){let r=$(e),t={...e};for(let n of Object.keys(t))y(n,{operatorAllow:r})&&delete t[n];return t}function br(e){let r=de(e),t=me(e);return{forbiddenPresent:r,safe:r.length===0,...t.length?{operatorAllowedActive:t}:{}}}var mr,pr,fr,gr,hr,yr,vr,C=o(()=>{"use strict";mr=["ANTHROPIC_API_KEY","ANALYST_API_KEY","RECRUITER_API_KEY","AUTH_SECRET","NEXTAUTH_SECRET","DATABASE_URL","PRODUCTION_DATABASE_URL","KYNVER_PRODUCTION_DATABASE_URL","REDIS_URL","GOOGLE_CLIENT_SECRET","GITHUB_CLIENT_SECRET","KYNVER_API_KEY","KYNVER_SERVICE_SECRET","KYNVER_RUNTIME_SECRET","KYNVER_CRON_SECRET","OPENCLAW_CRON_SECRET","QSTASH_TOKEN","QSTASH_CURRENT_SIGNING_KEY","QSTASH_NEXT_SIGNING_KEY","TOOL_SECRETS_KEK","TOOL_EXECUTOR_DISPATCH_SECRET","CLOUDFLARE_API_TOKEN","STRIPE_SECRET_KEY","STRIPE_WEBHOOK_SECRET","STRIPE_IDENTITY_WEBHOOK_SECRET","VOYAGE_API_KEY","PERPLEXITY_API_KEY","FRED_API_KEY","FMP_API_KEY","CURSOR_API_KEY","MEMORY_CONTENT_KEK","LLM_BYOK_KEK","KYNVER_COMMAND_AUTH_KEY","KYNVER_INSTRUCTION_BUNDLE_KEY","KYNVER_MEMORY_LEDGER_KEY","KYNVER_JWKS_PRIVATE_KEY_JWK"],pr=new Set(mr),fr=["_SECRET","_API_KEY","_KEK","_KEY","_TOKEN","_PASSWORD","_PASSPHRASE","_SALT"],gr=["GITHUB_TOKEN","GH_TOKEN","CLAUDE_CODE_OAUTH_TOKEN"],hr=new Set(gr),yr=["_PUBLIC_KEY"],vr="KYNVER_WORKER_ENV_ALLOW"});function Y(e){if(!e)return!1;try{return process.kill(e,0),!0}catch{return!1}}var a=o(()=>{"use strict"});var G=o(()=>{"use strict";a();C()});var v=o(()=>{"use strict"});var z=o(()=>{"use strict";G();v()});var d=o(()=>{"use strict"});var P=o(()=>{"use strict"});var ve=o(()=>{"use strict"});var an,ln,q=o(()=>{"use strict";an=25*1024*1024*1024,ln=12*1024*1024*1024});var pn,fn,be=o(()=>{"use strict";q();pn=5*1024*1024*1024,fn=10*1024*1024*1024});var Rn,xn,J=o(()=>{"use strict";be();q();Rn=30*1024*1024*1024,xn=15*1024*1024*1024});var xe=o(()=>{"use strict";a()});import Wr from"node:path";var Pn,X=o(()=>{"use strict";v();xe();Pn=Wr.join(".openclaw","harness")});var N=o(()=>{"use strict";m();d();P();D();X()});var Se=o(()=>{"use strict";m();X();N();a()});var Z=o(()=>{"use strict";Se();a()});var Ee=o(()=>{"use strict";Z();a()});var Ce=o(()=>{"use strict"});var Oe=o(()=>{"use strict";Ce();a()});var Ae=o(()=>{"use strict"});var we=o(()=>{"use strict";Ae()});var Pe=o(()=>{"use strict";we();a()});var Ie=o(()=>{"use strict"});var Ne=o(()=>{"use strict"});var De=o(()=>{"use strict"});var ee=o(()=>{"use strict"});var Ke=o(()=>{"use strict"});var We=o(()=>{"use strict";ee();Ke()});var Te=o(()=>{"use strict";Oe();Pe();Ie();Ne();G();De();We();ee();a()});var Be=o(()=>{"use strict";Te()});var $r,jr,Ue=o(()=>{"use strict";ve();m();d();P();D();J();Z();Ee();Be();a();$r=500*1024*1024,jr=4*1024*1024*1024});var D=o(()=>{"use strict";Ue()});import{homedir as Vr}from"node:os";import Yr from"node:path";var Me,re=o(()=>{"use strict";Me=Yr.join(Vr(),".kynver",".env")});var Le=o(()=>{"use strict"});var Fe=o(()=>{"use strict";Le()});var He=o(()=>{"use strict"});var te=o(()=>{"use strict";Fe();He()});var $e=o(()=>{"use strict"});var je=o(()=>{"use strict";$e()});var W=o(()=>{"use strict";re();v();m();te();je()});var Ve=o(()=>{"use strict";d();d()});var Ye=o(()=>{"use strict";re();te();W()});var Ge=o(()=>{"use strict";z();d();Ve();m();W();Ye();a();N()});import{homedir as et,totalmem as Cs}from"node:os";import ne from"node:path";var ze,Us,Ms,Ls,Fs,m=o(()=>{"use strict";z();v();a();d();P();D();J();W();Ge();N();ze=ne.join(et(),".kynver"),Us=ne.join(ze,"config.json"),Ms=ne.join(ze,"credentials"),Ls=500*1024*1024,Fs=4*1024*1024*1024});C();C();var j="KYNVER_NO_PROD_DB_CREDENTIALS",Rr=["KYNVER_ENV_FILE"],xr=new Set(["1","true","yes","on"]);function fe(e){let r=e[j]?.trim().toLowerCase();return r!==void 0&&xr.has(r)}function f(e,r={}){let t=E(e);if(!r.reviewWorker)return t;let n={...t,[j]:"1"};for(let i of Rr)delete n[i];return n}var pe=["DATABASE_URL","PRODUCTION_DATABASE_URL","KYNVER_PRODUCTION_DATABASE_URL"];function kr(e,r={}){let t=f(e,r),n=Object.keys(t).filter(c=>c.endsWith("_SECRET")||c.endsWith("_API_KEY")||pe.includes(c)),i=pe.every(c=>t[c]===void 0),s=r.reviewWorker?t.KYNVER_ENV_FILE===void 0:!0,l=fe(t);return{reviewMode:!!r.reviewWorker,noProdFlagPresent:r.reviewWorker?l:!0,forbiddenKeysAfterScrub:n.sort(),productionDbKeysAbsent:i,envFilePointerStripped:s,safe:i&&n.length===0&&s&&(!r.reviewWorker||l)}}var _r="expert-lane-pr-review:",Sr="plan-review-task",Er="scheduledjob:",O=new Set(["lorentz","dalton","rhea","sentinel"]);function Cr(e){if(!e)return null;let r=e.trim().toLowerCase();return r.length?r:null}function V(e){return/\b(deep[- ]?review|plan review|review .*plan|security review|red[- ]team|lb\d+|risk register|signoff|verification|evidence|prove|gate)\b/.test(e)}function Or(e,r){return e.startsWith("factory:")?e.includes("lb")||V(r):!1}function Ar(e){let r=(e.executorRef??"").toLowerCase(),t=(e.title??"").toLowerCase(),n=(e.description??"").toLowerCase(),i=`${t}
|
|
2
|
+
${n}`,s=Cr(e.personaSlug);return!!(r.startsWith(_r)||r===Sr||r.startsWith("daemon-review:")||s&&O.has(s)&&(r.includes("evidence")||r.includes("validate")||r.includes("review")||Or(r,i)||V(i))||r.startsWith(Er)&&e.parentTaskId&&s&&O.has(s)||e.planId&&!e.parentTaskId&&s&&O.has(s)&&V(i)||t.includes("expert pr review")||e.parentTaskId&&(t.startsWith("review:")||t.includes("review required")||t.includes("runtime review"))&&s&&O.has(s))}var wr=/^claude[-_]/i,Pr=/^(?:opus|sonnet|haiku)\b/i;function ge(e){let r=e.trim();return wr.test(r)||Pr.test(r)}function he(e){let r=e.trim().toLowerCase();return r.startsWith("gpt-")||r.startsWith("gpt5")||r.includes("codex")}function ye(e){let r=e.trim().toLowerCase();return r.includes("composer")||r.includes("cursor")}function Ir(e){return he(e)?"codex":ge(e)?"claude":(ye(e),"cursor")}function Nr(e){if(!e.startsWith("provider:"))return null;let r=e.slice(9),t=r.indexOf(":"),n=(t>=0?r.slice(0,t):r).trim().toLowerCase(),i=t>=0&&r.slice(t+1).trim()||void 0;return n?n==="claude"||n==="opus"||n==="anthropic"?{provider:"claude",model:i,rule:i?"executor_ref:provider_claude_model":"executor_ref:provider_claude"}:n==="codex"?{provider:"codex",model:i,rule:"executor_ref:provider_codex"}:n==="openai-compatible"||n==="openai"||n==="openai_compatible"?{provider:"openai-compatible",model:i,rule:"executor_ref:provider_openai_compatible"}:n==="cursor"||n==="composer"?{provider:"cursor",model:i,rule:"executor_ref:provider_cursor"}:null:null}function Dr(e){if(!e.startsWith("harness-lane:"))return null;let r=e.split(":").map(i=>i.trim()).filter(Boolean);if(r.length<2)return null;let t=r[1],n=r.slice(2).join(":");return n?ge(n)||he(n)||ye(n)?{lane:t,model:n,provider:Ir(n),rule:"executor_ref:harness_lane_model"}:{lane:t,rule:"executor_ref:harness_lane"}:{lane:t,rule:"executor_ref:harness_lane"}}function A(e){let r=typeof e=="string"?e.trim():"";return r?Nr(r)??Dr(r):null}m();a();a();a();var Wa=process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim()||"gpt-5.4";function it(){return process.env.KYNVER_CODEX_DEFAULT_MODEL?.trim()||"gpt-5.4"}var st=it();a();var Xa=600*1e3;var Xe="composer-2.5";var p="cursor",at={anthropic:"claude",opus:"claude",openai:"openai-compatible",openai_compatible:"openai-compatible","openai-compat":"openai-compatible"};function Ze(e){let r=e.trim().toLowerCase();return at[r]??r}var lt=new Set(["claude","opus","anthropic"]),ct=[/\[worker-provider:\s*claude\]/i,/\[use-claude-worker\]/i,/\[operator-worker-provider:\s*claude\]/i];function R(e,r){let t=e[r];return typeof t=="string"?t.trim():""}function u(e){if(!e?.trim())return!1;let r=e.trim().toLowerCase();return lt.has(r)?!0:r.includes("claude")||r.includes("opus")}function oe(e){if(!e)return!1;let r=e.workerProviderOverride;if(typeof r=="string"&&u(r))return!0;let t=R(e,"executorRef").toLowerCase();if(t==="provider:claude"||t.startsWith("provider:claude:")||t.includes("claude-worker-override")||t.includes("operator-claude"))return!0;let n=A(R(e,"executorRef"));if(n?.provider&&u(n.provider)||n?.model&&u(ut(n.model)))return!0;let i=R(e,"description");if(ct.some(l=>l.test(i)))return!0;let s=R(e,"title");return!!/\[use-claude-worker\]/i.test(s)}function ut(e){let r=e.trim().toLowerCase();return/^claude[-_]/.test(r)||/^(?:opus|sonnet|haiku)\b/.test(r)?"claude":r}function dt(e,r){return{provider:p,model:Xe,rule:`policy:cursor_default${r}`,requestedModel:e}}var mt=["explicit:","executor_ref:","factory:","task:"];function pt(e){return mt.some(r=>e.startsWith(r))}function er(e){if(!e)return!1;let r=e.workerProviderOverride;return typeof r=="string"&&r.trim()||A(R(e,"executorRef"))?.provider?!0:oe(e)}function Qe(e){let{routing:r,task:t}=e,n=e.explicitProvider?.trim().toLowerCase();if(e.explicitProviderIsOperatorOverride&&u(n))return{...r,provider:"claude",rule:r.rule.startsWith("explicit:")?r.rule:"explicit:operator_provider"};if(n||pt(r.rule)||er(t)||!u(r.provider))return r;let i=r.rule&&r.rule!=="default:global"?`:${r.rule.replace(/:/g,"_")}`:"";return dt(r.model,i)}function ft(e,r=p){let t=e?.trim();return t?Ze(t):r}function gt(e){let r=[...new Set(e.map(t=>t.trim().toLowerCase()).filter(Boolean))];return r.includes(p)?[...new Set(r.map(t=>u(t)?p:t))]:r.every(t=>u(t))?[p]:r}var ht=/\b(npm run typecheck|tsc\b[^|&;]*--noEmit|node scripts\/verify-pr-local\.mjs|kynver (harness )?verify)\b/i,yt=/\b(npm run build\b|next build\b)\b/i,vt=/\b(vercel (build|deploy|--prod))\b/i,bt=/\b(openai|anthropic|perplexity|voyage)\b.*\b(api|cli)\b|\b(paid|billable)[-_ ]?compute\b/i;function ie(e){let r=e.trim();return r?bt.test(r)?{heavy:!0,commandClass:"paid_compute",reason:"paid external compute requires heavy-verification token and operator approval"}:vt.test(r)?{heavy:!0,commandClass:"vercel_verify",reason:"Vercel build/deploy verification requires heavy-verification token"}:yt.test(r)?{heavy:!0,commandClass:"full_build",reason:"full app build requires heavy-verification token"}:ht.test(r)?{heavy:!0,commandClass:"full_typecheck",reason:"full repo typecheck requires heavy-verification token"}:{heavy:!1,commandClass:"allowed",reason:null}:{heavy:!1,commandClass:"allowed",reason:null}}var U="heavy_verification_token_required";import{spawnSync as Bt}from"node:child_process";a();import{closeSync as Et,existsSync as k,mkdirSync as Ct,openSync as Ot,readdirSync as or,readFileSync as At,statSync as wt,unlinkSync as ir,writeFileSync as Pt}from"node:fs";import le from"node:path";import{mkdirSync as xt}from"node:fs";import{tmpdir as kt}from"node:os";import M from"node:path";import{homedir as Rt}from"node:os";import rr from"node:path";function tr(){let e=process.env.KYNVER_STATE_ROOT;return e?rr.resolve(e):rr.join(Rt(),".kynver","state")}function _t(){return!!(process.env.VERCEL||process.env.VERCEL_ENV||process.env.AWS_LAMBDA_FUNCTION_NAME||process.env.AWS_EXECUTION_ENV)}function St(){let e=process.env.KYNVER_HEAVY_VERIFICATION_STATE_ROOT;return e?M.resolve(e):_t()?M.join(kt(),"kynver","state","heavy-verification"):M.join(tr(),"heavy-verification")}function se(){return M.join(St(),"slots")}function x(){let e=se();return xt(e,{recursive:!0}),e}var _=120*6e4,nr=1;function It(e,r){let t=Number(e);return!Number.isFinite(t)||t<=0?r:Math.floor(t)}function F(){let e=process.env.KYNVER_HEAVY_VERIFICATION_SKIP?.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function L(){let e=process.env.KYNVER_HEAVY_VERIFICATION_MAX_CONCURRENT;return e?It(e,nr):nr}function Nt(e){return`slot-${e}`}function Dt(e,r=se()){return le.join(r,`${e}.json`)}function ce(e){if(!k(e))return null;try{let r=JSON.parse(At(e,"utf8"));if(typeof r.slotId=="string"&&typeof r.pid=="number"&&typeof r.acquiredAt=="string"&&typeof r.command=="string")return r}catch{return null}return null}function sr(e,r=_){if(!e||!Y(e.pid))return!0;let t=Date.parse(e.acquiredAt);return Number.isNaN(t)?!0:Date.now()-t>r}function ar(e,r){let t=ce(e);if(t)return sr(t,r);if(!k(e))return!0;try{return Date.now()-wt(e).mtimeMs>r}catch{return!0}}function Kt(e,r){if(ar(e,r))try{ir(e)}catch{}}function Wt(e){return Ct(e,{recursive:!0}),e}function ue(e={}){let r=Wt(e.slotsDir??x()),t=e.staleMs??_,n=0;for(let i of or(r)){if(!i.endsWith(".json"))continue;let s=le.join(r,i),l=k(s);Kt(s,t),l&&!k(s)&&(n+=1)}return n}function Tt(e={}){let r=e.slotsDir??x(),t=e.staleMs??_;ue({slotsDir:r,staleMs:t});let n=[];for(let i of or(r)){if(!i.endsWith(".json"))continue;let s=ce(le.join(r,i));s&&!sr(s,t)&&n.push(s)}return n}function ae(e={}){return Tt(e).length}function S(e,r={}){if(F())return{admitted:!0,slotId:null,activeSlots:0,maxSlots:L(),reason:null};let t=r.slotsDir??x(),n=r.staleMs??_,i=r.maxSlots??L();ue({slotsDir:t,staleMs:n});for(let l=0;l<i;l+=1){let c=Nt(l),g=Dt(c,t),cr=ce(g);if(ar(g,n))try{ir(g)}catch{}else if(cr||k(g))continue;let ur={slotId:c,pid:process.pid,acquiredAt:new Date().toISOString(),command:e};try{let h=Ot(g,"wx");Pt(h,JSON.stringify(ur,null,2),"utf8"),Et(h);let dr=ae({slotsDir:t,staleMs:n});return{admitted:!0,slotId:c,activeSlots:dr,maxSlots:i,reason:null}}catch(h){if(h.code==="EEXIST")continue;throw h}}let s=ae({slotsDir:t,staleMs:n});return{admitted:!1,slotId:null,activeSlots:s,maxSlots:i,reason:`heavy verification at capacity (${s}/${i} slots)`}}function H(e,r={}){if(F())return{admitted:!0,slotId:null,activeSlots:0,maxSlots:L(),reason:null};let t=r.slotsDir??x(),n=r.staleMs??_,i=r.maxSlots??L();ue({slotsDir:t,staleMs:n});let s=ae({slotsDir:t,staleMs:n}),l=s<i;return{admitted:l,slotId:null,activeSlots:s,maxSlots:i,reason:l?null:`heavy verification at capacity (${s}/${i} slots); waiting for ${e}`}}function Ut(e){e<=0||Bt(process.execPath,["-e",`const d=Date.now()+${Math.floor(e)};while(Date.now()<d);`],{stdio:"ignore"})}function lr(e,r,t=2e3,n={}){let i=Date.now()+Math.max(0,r),s=S(e,n);for(;!s.admitted&&Date.now()<i;)Ut(Math.min(t,i-Date.now())),s=S(e,n);return s}function Mt(e,r={}){let t=ie(e);if(!t.heavy)return{allowed:!0,outcome:"allowed",commandClass:t.commandClass,reason:"command does not require heavy-verification token",verificationGate:{...H(e),slotId:null}};if(F())return{allowed:!0,outcome:"heavy_verification_skipped",commandClass:t.commandClass,reason:"KYNVER_HEAVY_VERIFICATION_SKIP bypasses gate",verificationGate:{...H(e),slotId:null}};let n=r.waitMs??0,i=n>0?lr(e,n,r.pollMs):S(e);return i.admitted?{allowed:!0,outcome:"allowed",commandClass:t.commandClass,reason:t.reason??"heavy-verification token acquired",verificationGate:i}:{allowed:!1,outcome:U,commandClass:t.commandClass,reason:t.reason??i.reason??U,verificationGate:i}}export{p as DEFAULT_WORKER_PROVIDER,U as HEAVY_VERIFICATION_TOKEN_REQUIRED,j as KYNVER_NO_PROD_DB_CREDENTIALS_ENV,kr as auditReviewWorkerCredentialScope,br as auditWorkerEnv,f as buildWorkerSpawnEnv,ie as classifyHeavyShellCommand,Qe as enforceCursorWorkerProvider,Mt as gateWorkerShellCommand,u as isClaudeFamilyProvider,y as isForbiddenWorkerEnvKey,Ar as isHarnessExpertReviewWorker,fe as isNoProdCredentialReviewEnvironment,de as listForbiddenWorkerEnvKeys,me as listOperatorAllowedWorkerEnvKeys,Ze as normalizeWorkerProviderName,gt as preferCursorExecutor,ft as resolveConfiguredWorkerProvider,E as scrubWorkerEnv,oe as taskAllowsClaudeWorker,er as taskExpressesWorkerProviderPreference};
|
package/dist/status.d.ts
CHANGED
|
@@ -210,8 +210,10 @@ export interface RawHarnessWorkerStatus {
|
|
|
210
210
|
instructionPolicyEvidence?: InstructionPolicyEvidenceSnapshot | null;
|
|
211
211
|
/** Model the worker was launched with — echoed from worker.json for usage tracking. */
|
|
212
212
|
model?: string | null;
|
|
213
|
-
/** Worker provider key (codex | cursor | claude) frozen at spawn for usage/routing readback. */
|
|
213
|
+
/** Worker provider key (codex | cursor | claude | openai-compatible) frozen at spawn for usage/routing readback. */
|
|
214
214
|
provider?: string | null;
|
|
215
|
+
/** Token usage parsed from provider stream output (W2c), when the provider reported it. */
|
|
216
|
+
usage?: import("./stream.js").ParsedStreamUsage | null;
|
|
215
217
|
/** Physical pool label — ghost | forge (runtime ≥ 0.1.115). */
|
|
216
218
|
boxKind?: string | null;
|
|
217
219
|
boxId?: string | null;
|
package/dist/stream.d.ts
CHANGED
|
@@ -7,6 +7,19 @@ export interface ParsedStream {
|
|
|
7
7
|
error: string | null;
|
|
8
8
|
/** Most recent non-success shell outcome for operator error streams. */
|
|
9
9
|
lastShellOutcome: ShellCommandOutcome | null;
|
|
10
|
+
/** Token usage observed in provider stream output (W2c contract), when reported. */
|
|
11
|
+
usage: ParsedStreamUsage | null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Provider-observed token usage. Sources: the Claude CLI stream-json `result`
|
|
15
|
+
* message (`usage.input_tokens`/`output_tokens` + `modelUsage`), Codex exec
|
|
16
|
+
* JSONL usage events, and the openai-compatible runner's `result` event
|
|
17
|
+
* (`usage.input_tokens`/`output_tokens` mapped from prompt/completion tokens).
|
|
18
|
+
*/
|
|
19
|
+
export interface ParsedStreamUsage {
|
|
20
|
+
inputTokens?: number;
|
|
21
|
+
outputTokens?: number;
|
|
22
|
+
model?: string;
|
|
10
23
|
}
|
|
11
24
|
/**
|
|
12
25
|
* Parse harness worker stdout (`stream-json` from Claude Code or Cursor Agent).
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { ModelRoutingDecision } from "./model-routing.js";
|
|
2
|
-
/** Default harness worker CLI provider
|
|
2
|
+
/** Default harness worker CLI provider when the operator expressed no preference anywhere. */
|
|
3
3
|
export declare const DEFAULT_WORKER_PROVIDER = "cursor";
|
|
4
|
+
/** Normalize an operator-supplied worker provider name to its canonical key. */
|
|
5
|
+
export declare function normalizeWorkerProviderName(name: string): string;
|
|
4
6
|
export declare function isClaudeFamilyProvider(provider: string | null | undefined): boolean;
|
|
5
7
|
/**
|
|
6
8
|
* True when the board row explicitly opts into a Claude/Opus worker
|
|
@@ -16,11 +18,26 @@ export interface EnforceCursorWorkerProviderInput {
|
|
|
16
18
|
explicitProviderIsOperatorOverride?: boolean;
|
|
17
19
|
}
|
|
18
20
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
+
* True when the board row expresses ANY worker-provider preference (not just
|
|
22
|
+
* Claude): `workerProviderOverride`, an executorRef `provider:*` intent, or the
|
|
23
|
+
* Claude override markers handled by {@link taskAllowsClaudeWorker}.
|
|
24
|
+
*/
|
|
25
|
+
export declare function taskExpressesWorkerProviderPreference(task: Record<string, unknown> | null | undefined): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* W2b routing authority: the Cursor coercion is a *default-only* fallback.
|
|
28
|
+
* An operator preference expressed anywhere — explicit CLI `--provider`,
|
|
29
|
+
* explicit CLI model (incl. provider aliases), executorRef provider intent,
|
|
30
|
+
* factory `provider:*` routing, or task override markers — is authoritative
|
|
31
|
+
* and never rewritten. Only preference-free Claude-family routing (e.g. the
|
|
32
|
+
* global default model inferring Claude) is coerced to the Cursor default.
|
|
21
33
|
*/
|
|
22
34
|
export declare function enforceCursorWorkerProvider(input: EnforceCursorWorkerProviderInput): ModelRoutingDecision;
|
|
23
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the configured worker provider. W2b: `config.workerProvider` is the
|
|
37
|
+
* operator's explicit choice and is honored verbatim (after alias
|
|
38
|
+
* normalization) — the legacy behavior of downgrading Claude-family configs to
|
|
39
|
+
* Cursor is removed. Only an EMPTY config falls back to the Cursor default.
|
|
40
|
+
*/
|
|
24
41
|
export declare function resolveConfiguredWorkerProvider(configured: string | null | undefined, fallback?: string): string;
|
|
25
42
|
/** Plan / Command Center executor lists — Cursor wins when both families appear. */
|
|
26
43
|
export declare function preferCursorExecutor(executors: string[]): string[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ParsedStreamUsage } from "./stream.js";
|
|
2
|
+
export interface WorkerUsagePayload {
|
|
3
|
+
provider: string;
|
|
4
|
+
model: string | null;
|
|
5
|
+
inputTokens: number | null;
|
|
6
|
+
outputTokens: number | null;
|
|
7
|
+
}
|
|
8
|
+
export interface ResolveWorkerUsageInput {
|
|
9
|
+
/** Usage parsed from the worker's stream output (null/undefined → no payload). */
|
|
10
|
+
usage?: ParsedStreamUsage | null;
|
|
11
|
+
/** Provider key frozen at spawn (worker.json), falling back to status readback. */
|
|
12
|
+
provider?: string | null;
|
|
13
|
+
/** Launch model from worker.json — used when the stream did not name a model. */
|
|
14
|
+
model?: string | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build the completion `workerUsage` payload, or null when the provider
|
|
18
|
+
* reported no token usage (the field is then omitted from the POST entirely).
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveWorkerUsagePayload(input: ResolveWorkerUsageInput): WorkerUsagePayload | null;
|
package/dist/worktree.d.ts
CHANGED
|
@@ -6,6 +6,39 @@ export interface CreatedRunInfo {
|
|
|
6
6
|
base: string;
|
|
7
7
|
baseCommit: string;
|
|
8
8
|
}
|
|
9
|
+
export type RunBaseRefSource = "flag" | "env" | "config" | "origin/main" | "remote-head";
|
|
10
|
+
export interface ResolveRunBaseRefInput {
|
|
11
|
+
/** `--base` on the command line. */
|
|
12
|
+
explicitBase?: string;
|
|
13
|
+
/** `KYNVER_RUN_BASE_REF` env override. */
|
|
14
|
+
envBaseRef?: string;
|
|
15
|
+
/** `defaultBase` from `~/.kynver/config.json`. */
|
|
16
|
+
configDefaultBase?: string;
|
|
17
|
+
/** Verify a ref resolves to a commit in the repo; injectable for tests. */
|
|
18
|
+
verifyRef: (ref: string) => boolean;
|
|
19
|
+
/** Resolve the remote default branch (e.g. `origin/master`); injectable for tests. */
|
|
20
|
+
resolveRemoteHeadRef: () => string | null;
|
|
21
|
+
/** Repo path for error messages. */
|
|
22
|
+
repoLabel?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ResolvedRunBaseRef {
|
|
25
|
+
base: string;
|
|
26
|
+
source: RunBaseRefSource;
|
|
27
|
+
/** Human note when the pick was a fallback (never fall back silently). */
|
|
28
|
+
note?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the base ref a new run is cut from. Precedence: `--base` flag >
|
|
32
|
+
* `KYNVER_RUN_BASE_REF` env > config `defaultBase` > `origin/main` > the
|
|
33
|
+
* remote HEAD default branch. An EXPLICIT override (flag/env/config) that
|
|
34
|
+
* does not verify is an error — never silently substituted with another ref.
|
|
35
|
+
* When `origin/main` is absent (repos whose default branch is `master`,
|
|
36
|
+
* `develop`, …) the remote HEAD fallback is used with a visible note; when
|
|
37
|
+
* nothing resolves the error names everything tried plus the fix.
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveRunBaseRef(input: ResolveRunBaseRefInput): ResolvedRunBaseRef;
|
|
40
|
+
/** Resolve the remote default branch without hitting `git remote show` (porcelain-free). */
|
|
41
|
+
export declare function resolveRemoteHeadRefForRepo(repo: string): string | null;
|
|
9
42
|
export declare function createRun(args: Record<string, string | boolean>): CreatedRunInfo;
|
|
10
43
|
export declare function listRuns(): void;
|
|
11
44
|
export { loadRun, saveRun, runDirectory };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kynver-app/runtime",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.24",
|
|
4
4
|
"description": "Kynver AgentOS local execution runtime and CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -49,6 +49,36 @@
|
|
|
49
49
|
"import": "./dist/server/orchestration.js",
|
|
50
50
|
"default": "./dist/server/orchestration.js"
|
|
51
51
|
},
|
|
52
|
+
"./server/adapter-contract": {
|
|
53
|
+
"types": "./dist/server/adapter-contract.d.ts",
|
|
54
|
+
"import": "./dist/server/adapter-contract.js",
|
|
55
|
+
"default": "./dist/server/adapter-contract.js"
|
|
56
|
+
},
|
|
57
|
+
"./server/context-budget-receipt": {
|
|
58
|
+
"types": "./dist/server/context-budget-receipt.d.ts",
|
|
59
|
+
"import": "./dist/server/context-budget-receipt.js",
|
|
60
|
+
"default": "./dist/server/context-budget-receipt.js"
|
|
61
|
+
},
|
|
62
|
+
"./server/prompt": {
|
|
63
|
+
"types": "./dist/server/prompt.d.ts",
|
|
64
|
+
"import": "./dist/server/prompt.js",
|
|
65
|
+
"default": "./dist/server/prompt.js"
|
|
66
|
+
},
|
|
67
|
+
"./server/node-runtime-policy": {
|
|
68
|
+
"types": "./dist/server/node-runtime-policy.d.ts",
|
|
69
|
+
"import": "./dist/server/node-runtime-policy.js",
|
|
70
|
+
"default": "./dist/server/node-runtime-policy.js"
|
|
71
|
+
},
|
|
72
|
+
"./server/model-routing": {
|
|
73
|
+
"types": "./dist/server/model-routing.d.ts",
|
|
74
|
+
"import": "./dist/server/model-routing.js",
|
|
75
|
+
"default": "./dist/server/model-routing.js"
|
|
76
|
+
},
|
|
77
|
+
"./server/db-credentials": {
|
|
78
|
+
"types": "./dist/server/db-credentials.d.ts",
|
|
79
|
+
"import": "./dist/server/db-credentials.js",
|
|
80
|
+
"default": "./dist/server/db-credentials.js"
|
|
81
|
+
},
|
|
52
82
|
"./server/heavy-verification": {
|
|
53
83
|
"types": "./dist/server/heavy-verification.d.ts",
|
|
54
84
|
"import": "./dist/server/heavy-verification.js",
|
|
@@ -108,10 +138,11 @@
|
|
|
108
138
|
"README.md"
|
|
109
139
|
],
|
|
110
140
|
"scripts": {
|
|
111
|
-
"build": "esbuild src/cli.ts src/index.ts src/node-runtime-policy.ts src/local-run-store/index.ts src/worker-persona-catalog.ts src/instruction-bundle/contract.ts src/chat/command-auth-proof.ts src/server/monitor.ts src/server/landing.ts src/server/worker-policy.ts src/server/orchestration.ts src/server/heavy-verification.ts src/server/memory-cost.ts src/server/pr-evidence.ts src/server/default-repo.ts src/server/cleanup.ts src/server/repo-search.ts src/server/harness-notice.ts src/server/memory-cost-enforce.ts src/server/wsl-crash-dumps.ts --bundle --platform=node --format=esm --packages=external --outbase=src --outdir=dist --minify && tsc -p tsconfig.json --emitDeclarationOnly && node scripts/chmod-cli-bin.mjs",
|
|
141
|
+
"build": "esbuild src/cli.ts src/index.ts src/node-runtime-policy.ts src/local-run-store/index.ts src/worker-persona-catalog.ts src/instruction-bundle/contract.ts src/chat/command-auth-proof.ts src/server/monitor.ts src/server/landing.ts src/server/worker-policy.ts src/server/orchestration.ts src/server/adapter-contract.ts src/server/context-budget-receipt.ts src/server/prompt.ts src/server/node-runtime-policy.ts src/server/model-routing.ts src/server/db-credentials.ts src/server/heavy-verification.ts src/server/memory-cost.ts src/server/pr-evidence.ts src/server/default-repo.ts src/server/cleanup.ts src/server/repo-search.ts src/server/harness-notice.ts src/server/memory-cost-enforce.ts src/server/wsl-crash-dumps.ts --bundle --platform=node --format=esm --packages=external --outbase=src --outdir=dist --minify && tsc -p tsconfig.json --emitDeclarationOnly && node scripts/chmod-cli-bin.mjs",
|
|
112
142
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
113
143
|
"test": "vitest run --config vitest.config.ts",
|
|
114
|
-
"prepublishOnly": "node ../../scripts/npm-publish-guard.mjs && npm run build"
|
|
144
|
+
"prepublishOnly": "node ../../scripts/npm-publish-guard.mjs && npm run build",
|
|
145
|
+
"postinstall": "node scripts/postinstall-banner.mjs || true"
|
|
115
146
|
},
|
|
116
147
|
"engines": {
|
|
117
148
|
"node": ">=24.11.0"
|