@adhd/dispatch-base-spec 0.1.2 → 0.1.4
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/CHANGELOG.md +20 -0
- package/index.js +3 -5
- package/index.mjs +460 -669
- package/lib/types.d.ts +1 -1
- package/package.json +20 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
+
## 0.1.4 (2026-09-26)
|
|
2
|
+
|
|
3
|
+
### 🚀 Features
|
|
4
|
+
|
|
5
|
+
- **dispatch-base-spec:** add 'fs.edit' OperationAction ([74096864](https://github.com/PseudoSky/adhd/commit/74096864))
|
|
6
|
+
- **vite-plugins:** absorb perf/test-resolve-fix — test-time @adhd/* source resolution ([3e344506](https://github.com/PseudoSky/adhd/commit/3e344506))
|
|
7
|
+
|
|
8
|
+
### 🩹 Fixes
|
|
9
|
+
|
|
10
|
+
- **vite:** restore import.meta.url in CJS output under vite 8 ([7916e639](https://github.com/PseudoSky/adhd/commit/7916e639))
|
|
11
|
+
- **nx:** finish the ESLint v9 flat-config migration and unblock the gate ([53f4ff3e](https://github.com/PseudoSky/adhd/commit/53f4ff3e))
|
|
12
|
+
|
|
13
|
+
### ❤️ Thank You
|
|
14
|
+
|
|
15
|
+
- pseudosky
|
|
16
|
+
|
|
17
|
+
## 0.1.3 (2026-09-24)
|
|
18
|
+
|
|
19
|
+
This was a version bump only for dispatch-base-spec to align it with other projects, there were no code changes.
|
|
20
|
+
|
|
1
21
|
## 0.1.2 (2026-08-08)
|
|
2
22
|
|
|
3
23
|
|
package/index.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const D=new Set(["create","modify-signature","modify-body","add-export","remove-export","rename"]),x={function:new Set(["add-param","remove-param","rename-param","retype-param","change-param-optional","reorder-params","change-return"]),interface:new Set(["add-field","remove-field","rename-field","retype-field","change-field-optional","add-generic","remove-generic","constrain-generic","add-extends","remove-extends"]),type:new Set(["add-field","remove-field","retype-field"]),class:new Set(["add-field","remove-field","rename-field","retype-field","change-field-optional","add-param","add-generic","remove-generic","constrain-generic","add-extends","remove-extends"]),enum:new Set(["add-field","remove-field","rename-field"]),const:new Set(["add-var","remove-var","rename-var","change-default"]),config:new Set(["set-key","remove-key","rename-key","add-entry","remove-entry","update-entry","bump-version","update-checksum"]),env:new Set(["set-key","remove-key","rename-key"]),schema:new Set(["add-table","remove-table","add-column","remove-column","rename-column","retype-column","change-nullable","add-index","remove-index"]),manifest:new Set(["add-entry","remove-entry","bump-version"]),doc:new Set(["add-section","remove-section","rename-section","update-section"]),"structured-output":new Set([]),script:new Set(["add-param","remove-param","rename-param","retype-param","change-param-optional","reorder-params","change-return","add-field","remove-field","rename-field","retype-field","change-field-optional","add-generic","remove-generic","constrain-generic","add-extends","remove-extends","set-key","remove-key","rename-key","add-array-item","remove-array-item","add-var","remove-var","rename-var","change-default","add-section","remove-section","rename-section","update-section","add-table","remove-table","add-column","remove-column","rename-column","retype-column","change-nullable","add-index","remove-index","add-entry","remove-entry","update-entry","bump-version","update-checksum","add-export"])};function j(t,e){const r=x[t];return r?r.has(e):!1}const T=new Set(["pending","pending-surfaced","in_progress","complete","failed","skipped"]),q=new Set(["pending","in_progress","complete","failed","skipped"]),E=new Set(["automated","tool-call","generative"]),L=new Set(["anthropic","openai","deepseek","google","local","claudecli","teammate"]),N=new Set(["function","interface","type","class","enum","const","script","config","env","schema","manifest","doc","structured-output"]);function h(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function l(t){return typeof t=="string"}function n(t,e,r){return{path:t,message:e,value:r}}function R(t){var c,d;const e=Object.keys(t),r=new Map,a=new Map;for(const s of e)r.set(s,0),a.set(s,[]);for(const s of e)for(const i of((c=t[s])==null?void 0:c.depends_on)??[])t[i]&&((d=a.get(i))==null||d.push(s),r.set(s,(r.get(s)??0)+1));const p=e.filter(s=>(r.get(s)??0)===0),m=new Set;for(;p.length>0;){const s=p.shift();if(s!==void 0){m.add(s);for(const i of a.get(s)??[]){const u=(r.get(i)??1)-1;r.set(i,u),u===0&&p.push(i)}}}return m.size!==e.length?e.filter(s=>!m.has(s)).map(s=>({slug:s})):null}function V(t,e){for(const r of t){if(!h(r))continue;const a=l(r.id)?r.id:"?",p=r.provider;(!l(p)||!L.has(p))&&e.push(n(`dispatch_log[${a}].provider`,"invalid provider",p));const m=r.turns;if(!Array.isArray(m)){e.push(n(`dispatch_log[${a}].turns`,"must be an array",m));continue}for(let c=0;c<m.length;c++){const d=m[c],s=`dispatch_log[${a}].turns[${c}]`;if(!h(d)){e.push(n(s,"must be an object",d));continue}(typeof d.turn!="number"||!Number.isInteger(d.turn)||d.turn<1)&&e.push(n(`${s}.turn`,"must be a positive integer",d.turn)),typeof d.input_tokens!="number"&&e.push(n(`${s}.input_tokens`,"must be a number",d.input_tokens)),typeof d.output_tokens!="number"&&e.push(n(`${s}.output_tokens`,"must be a number",d.output_tokens)),l(d.t)||e.push(n(`${s}.t`,"must be a string",d.t));const i=d.model_calls;i!=null&&typeof i!="number"&&e.push(n(`${s}.model_calls`,"must be a number or null if present",i))}}}function O(t){const e=[];if(!h(t))return{valid:!1,errors:[n("","root must be an object")]};for(const m of["description","problem","approach","executor"]){const c=t[m];(!l(c)||c.trim()==="")&&e.push(n(m,"required string field missing/empty",c))}typeof t.schema_version!="number"&&e.push(n("schema_version","must be a number",t.schema_version));const r=t.plan_kind;r!=="brownfield"&&r!=="greenfield"&&e.push(n("plan_kind",'must be "brownfield" or "greenfield"',r)),Array.isArray(t.phases)?t.phases.length===0&&e.push(n("phases","must have at least one entry")):e.push(n("phases","must be an array",t.phases));const a=t.terminal;!l(a)&&!Array.isArray(a)&&e.push(n("terminal","must be a string or array",a)),Array.isArray(t.dispatch_log)?V(t.dispatch_log,e):e.push(n("dispatch_log","must be an array",t.dispatch_log)),h(t.optimization)||e.push(n("optimization","must be an object",t.optimization)),h(t.providers)||e.push(n("providers","must be an object",t.providers)),h(t.effort_max_tokens)||e.push(n("effort_max_tokens","must be an object",t.effort_max_tokens));const p=t.milestones;if(!h(p))e.push(n("milestones","must be an object",p));else{const m=Object.keys(p);m.length===0&&e.push(n("milestones","must have at least one entry"));const c=new Set(m);for(const u of m){const o=p[u];if(!h(o)){e.push(n(`milestones.${u}`,"must be an object",o));continue}if((!l(o.description)||o.description.trim()==="")&&e.push(n(`milestones.${u}.description`,"required string",o.description)),!Array.isArray(o.depends_on))e.push(n(`milestones.${u}.depends_on`,"must be an array",o.depends_on));else for(const _ of o.depends_on)l(_)?c.has(_)||e.push(n(`milestones.${u}.depends_on`,`unknown milestone "${_}"`)):e.push(n(`milestones.${u}.depends_on[]`,"must be a string",_));const b=o.phase;(!l(b)||b.trim()==="")&&e.push(n(`milestones.${u}.phase`,"required string",b)),(!l(o.authored_by)||o.authored_by.trim()==="")&&e.push(n(`milestones.${u}.authored_by`,"required string",o.authored_by));const f=o.model;f!=null&&!["Haiku","Sonnet","Opus"].includes(f)&&e.push(n(`milestones.${u}.model`,"invalid model tier",f));const y=o.effort;y!=null&&!["low","medium","high","xhigh","max"].includes(y)&&e.push(n(`milestones.${u}.effort`,"invalid effort tier",y)),o.two_stage!==void 0&&typeof o.two_stage!="boolean"&&e.push(n(`milestones.${u}.two_stage`,"must be a boolean",o.two_stage)),Array.isArray(o.read_only)||e.push(n(`milestones.${u}.read_only`,"must be an array",o.read_only))}const d=R(p);if(d)for(const{slug:u}of d)e.push(n(`milestones.${u}`,"dependency cycle detected"));if(l(a)&&!c.has(a))e.push(n("terminal",`unknown milestone "${a}"`));else if(Array.isArray(a))for(const u of a)c.has(u)||e.push(n("terminal[]",`unknown milestone "${u}"`));const s=t.operations,i=new Set;if(!Array.isArray(s)&&!h(s))e.push(n("operations","must be an array or object",s));else{const u=Array.isArray(s)?s:Object.values(s);for(const o of u){if(!h(o)){e.push(n("operations[]","must be an object",o));continue}const b=o.id;if(!l(b)){e.push(n("operations[?]","missing/invalid id",b));continue}const f=b;i.add(f);const y=o.milestone;l(y)?c.has(y)||e.push(n(`operations[${f}].milestone`,`unknown milestone "${y}"`)):e.push(n(`operations[${f}].milestone`,"required string",y));const _=o.type;l(_)&&!E.has(_)&&e.push(n(`operations[${f}].type`,"invalid type",_));const v=o.shape;if(h(v)){const g=v.kind;g!=null&&l(g)&&!N.has(g)&&e.push(n(`operations[${f}].shape.kind`,"invalid shape kind",g));const $=v.ops;if(Array.isArray($)&&l(g))for(let w=0;w<$.length;w++){const k=$[w];if(!h(k))continue;const A=k.op;l(A)&&!j(g,A)&&e.push(n(`operations[${f}].shape.ops[${w}]`,`op "${A}" not valid for kind "${g}"`))}}Array.isArray(o.depends_on)||e.push(n(`operations[${f}].depends_on`,"must be an array",o.depends_on))}for(const o of u){if(!h(o))continue;const b=o.id;if(!l(b))continue;const f=o.depends_on;if(Array.isArray(f))for(const y of f)l(y)&&!i.has(y)&&e.push(n(`operations[${b}].depends_on`,`unknown operation "${y}"`))}}}return{valid:e.length===0,errors:e}}function I(t){const e=[];if(!h(t))return{valid:!1,errors:[n("","root must be an object")]};for(const a of["snapshot_at","description"])l(t[a])||e.push(n(a,"required string field missing",t[a]));l(t.plan)||e.push(n("plan","required string",t.plan));const r=t.milestones;if(!h(r))e.push(n("milestones","must be an object",r));else{const a=Object.keys(r),p=new Set(a);for(const s of a){const i=r[s];if(!h(i)){e.push(n(`milestones.${s}`,"must be an object",i));continue}const u=i.eligible,o=i.pending;u===!0&&o!==null&&o!==void 0&&e.push(n(`milestones.${s}`,"D-07 violation: eligible=true but pending not null")),typeof u!="boolean"&&e.push(n(`milestones.${s}.eligible`,"must be boolean",u));const b=i.status;(!l(b)||!T.has(b))&&e.push(n(`milestones.${s}.status`,"invalid status",b)),u===!0&&b==="complete"&&e.push(n(`milestones.${s}`,"D-07 violation: eligible=true but status is complete"));const f=i.wave;(typeof f!="number"||!Number.isInteger(f)||f<0)&&e.push(n(`milestones.${s}.wave`,"must be non-negative integer",f));const y=i.ki_estimate;y!=null&&typeof y!="number"&&e.push(n(`milestones.${s}.ki_estimate`,"must be number|null",y));for(const _ of["tokens_estimated","tokens_actual"]){const v=i[_];v!=null&&typeof v!="number"&&e.push(n(`milestones.${s}.${_}`,"must be number|null",v))}Array.isArray(i.artifacts)||e.push(n(`milestones.${s}.artifacts`,"must be an array",i.artifacts)),typeof i.si_bytes!="number"&&e.push(n(`milestones.${s}.si_bytes`,"must be a number",i.si_bytes))}const m=t.operations;if(!Array.isArray(m))e.push(n("operations","must be an array",m));else for(const s of m){if(!h(s))continue;const i=l(s.id)?s.id:"?",u=s.milestone;l(u)&&!p.has(u)&&e.push(n(`operations[${i}].milestone`,`unknown milestone "${u}"`));const o=s.status;(!l(o)||!q.has(o))&&e.push(n(`operations[${i}].status`,"invalid operation status",o)),Array.isArray(s.dispatch_ids)||e.push(n(`operations[${i}].dispatch_ids`,"must be an array",s.dispatch_ids)),typeof s.attempt_count!="number"&&e.push(n(`operations[${i}].attempt_count`,"must be a number",s.attempt_count)),Array.isArray(s.blast_radius)||e.push(n(`operations[${i}].blast_radius`,"must be an array",s.blast_radius))}const c=t.open_questions;if(!Array.isArray(c))e.push(n("open_questions","must be an array",c));else for(const s of c){if(!h(s))continue;const i=s.blocking;(!l(i)||!p.has(i))&&e.push(n("open_questions",`unknown blocking milestone "${i}"`)),typeof s.surfaced!="boolean"&&e.push(n(`open_questions[${s.id}]`,"surfaced must be boolean",s.surfaced)),typeof s.answered!="boolean"&&e.push(n(`open_questions[${s.id}]`,"answered must be boolean",s.answered))}const d=t.dispatch_units;if(d!==void 0)if(!Array.isArray(d))e.push(n("dispatch_units","must be an array if present",d));else for(const s of d){if(!h(s))continue;const i=s.fits_context_window;typeof i!="boolean"&&e.push(n(`dispatch_units[${s.id}]`,"fits_context_window must be boolean",i));const u=s.milestones;if(Array.isArray(u))for(const o of u)l(o)&&!p.has(o)&&e.push(n(`dispatch_units[${s.id}].milestones`,`unknown milestone "${o}"`))}h(t.pairwise_overlap)||e.push(n("pairwise_overlap","must be an object",t.pairwise_overlap))}return{valid:e.length===0,errors:e}}function P(t){const e=O(t);if(!e.valid)throw new Error(`DagJson validation failed:
|
|
2
|
-
|
|
3
|
-
`)}`)}
|
|
4
|
-
${e.errors.map(r=>` ${r.path}: ${r.message}`).join(`
|
|
5
|
-
`)}`)}const S=[{from:2,to:3,apply:t=>{!t.milestones&&t.nodes&&(t.milestones=t.nodes,delete t.nodes);const e=t.operations;e&&typeof e=="object"&&!Array.isArray(e)&&(t.operations=Object.values(e))}},{from:3,to:4,apply:t=>{(!t.providers||Object.keys(t.providers).length===0)&&(t.providers={Haiku:{type:"claudecli",model_id:"claude-haiku-4-5",env_secret:null,base_url:null,timeout_ms:6e4,retry_config:{retries:3,min_timeout:1e3,max_timeout:3e4,factor:2}},Sonnet:{type:"claudecli",model_id:"claude-sonnet-4-5",env_secret:null,base_url:null,timeout_ms:12e4,retry_config:{retries:3,min_timeout:1e3,max_timeout:3e4,factor:2}},Opus:{type:"claudecli",model_id:"claude-opus-4-5",env_secret:null,base_url:null,timeout_ms:3e5,retry_config:{retries:3,min_timeout:1e3,max_timeout:3e4,factor:2}}}),(!t.effort_max_tokens||Object.keys(t.effort_max_tokens).length===0)&&(t.effort_max_tokens={low:1024,medium:4096,high:8192,xhigh:16384,max:32768}),t.optimization||(t.optimization={sentinel_fanout:{enabled:!0,write_multiplier:1.25,read_multiplier:.1,hit_probability:.9},b_per_tier:{Haiku:8e3,Sonnet:15e3,Opus:27e3},context_window_per_tier:{Haiku:16e3,Sonnet:16e3,Opus:32e3},context_window_override:null,b_override:null});let e=[];Array.isArray(t.operations)?e=t.operations:t.operations&&typeof t.operations=="object"&&(e=Object.values(t.operations));for(const r of e)if(typeof r=="object"&&r!==null){const a=r;a.type===void 0&&(a.type="generative"),a.criteria===void 0&&(a.criteria=[]),a.tool===void 0&&(a.tool=null),a.args===void 0&&(a.args=null)}}}];function z(t,e,r){if(t===e)return;let a=t;for(const p of[...S].sort((m,c)=>m.from-c.from))if(p.from===a&&(p.apply(r),a=p.to,a===e)){r.schema_version=e;return}throw new Error(`migrateDag: no path from v${t} to v${e}. Available: [${S.map(p=>`v${p.from}→v${p.to}`).join(", ")}]`)}exports.VALID_OPS_BY_KIND=x;exports.WRITE_CLASS_ACTIONS=D;exports.assertValidDagJson=P;exports.assertValidSnapshot=K;exports.isValidOpForKind=j;exports.migrateDag=z;exports.validateDagJson=O;exports.validateSnapshot=I;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=new Set([`create`,`modify-signature`,`modify-body`,`add-export`,`remove-export`,`rename`]),t={function:new Set([`add-param`,`remove-param`,`rename-param`,`retype-param`,`change-param-optional`,`reorder-params`,`change-return`]),interface:new Set([`add-field`,`remove-field`,`rename-field`,`retype-field`,`change-field-optional`,`add-generic`,`remove-generic`,`constrain-generic`,`add-extends`,`remove-extends`]),type:new Set([`add-field`,`remove-field`,`retype-field`]),class:new Set([`add-field`,`remove-field`,`rename-field`,`retype-field`,`change-field-optional`,`add-param`,`add-generic`,`remove-generic`,`constrain-generic`,`add-extends`,`remove-extends`]),enum:new Set([`add-field`,`remove-field`,`rename-field`]),const:new Set([`add-var`,`remove-var`,`rename-var`,`change-default`]),config:new Set([`set-key`,`remove-key`,`rename-key`,`add-entry`,`remove-entry`,`update-entry`,`bump-version`,`update-checksum`]),env:new Set([`set-key`,`remove-key`,`rename-key`]),schema:new Set([`add-table`,`remove-table`,`add-column`,`remove-column`,`rename-column`,`retype-column`,`change-nullable`,`add-index`,`remove-index`]),manifest:new Set([`add-entry`,`remove-entry`,`bump-version`]),doc:new Set([`add-section`,`remove-section`,`rename-section`,`update-section`]),"structured-output":new Set([]),script:new Set(`add-param.remove-param.rename-param.retype-param.change-param-optional.reorder-params.change-return.add-field.remove-field.rename-field.retype-field.change-field-optional.add-generic.remove-generic.constrain-generic.add-extends.remove-extends.set-key.remove-key.rename-key.add-array-item.remove-array-item.add-var.remove-var.rename-var.change-default.add-section.remove-section.rename-section.update-section.add-table.remove-table.add-column.remove-column.rename-column.retype-column.change-nullable.add-index.remove-index.add-entry.remove-entry.update-entry.bump-version.update-checksum.add-export`.split(`.`))};function n(e,n){let r=t[e];return r?r.has(n):!1}var r=new Set([`pending`,`pending-surfaced`,`in_progress`,`complete`,`failed`,`skipped`]),i=new Set([`pending`,`in_progress`,`complete`,`failed`,`skipped`]),a=new Set([`automated`,`tool-call`,`generative`]),o=new Set([`anthropic`,`openai`,`deepseek`,`google`,`local`,`claudecli`,`teammate`]),s=new Set([`function`,`interface`,`type`,`class`,`enum`,`const`,`script`,`config`,`env`,`schema`,`manifest`,`doc`,`structured-output`]);function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(e){return typeof e==`string`}function u(e,t,n){return{path:e,message:t,value:n}}function d(e){let t=Object.keys(e),n=new Map,r=new Map;for(let e of t)n.set(e,0),r.set(e,[]);for(let i of t)for(let t of e[i]?.depends_on??[])e[t]&&(r.get(t)?.push(i),n.set(i,(n.get(i)??0)+1));let i=t.filter(e=>(n.get(e)??0)===0),a=new Set;for(;i.length>0;){let e=i.shift();if(e!==void 0){a.add(e);for(let t of r.get(e)??[]){let e=(n.get(t)??1)-1;n.set(t,e),e===0&&i.push(t)}}}return a.size===t.length?null:t.filter(e=>!a.has(e)).map(e=>({slug:e}))}function f(e,t){for(let n of e){if(!c(n))continue;let e=l(n.id)?n.id:`?`,r=n.provider;(!l(r)||!o.has(r))&&t.push(u(`dispatch_log[${e}].provider`,`invalid provider`,r));let i=n.turns;if(!Array.isArray(i)){t.push(u(`dispatch_log[${e}].turns`,`must be an array`,i));continue}for(let n=0;n<i.length;n++){let r=i[n],a=`dispatch_log[${e}].turns[${n}]`;if(!c(r)){t.push(u(a,`must be an object`,r));continue}(typeof r.turn!=`number`||!Number.isInteger(r.turn)||r.turn<1)&&t.push(u(`${a}.turn`,`must be a positive integer`,r.turn)),typeof r.input_tokens!=`number`&&t.push(u(`${a}.input_tokens`,`must be a number`,r.input_tokens)),typeof r.output_tokens!=`number`&&t.push(u(`${a}.output_tokens`,`must be a number`,r.output_tokens)),l(r.t)||t.push(u(`${a}.t`,`must be a string`,r.t));let o=r.model_calls;o!=null&&typeof o!=`number`&&t.push(u(`${a}.model_calls`,`must be a number or null if present`,o))}}}function p(e){let t=[];if(!c(e))return{valid:!1,errors:[u(``,`root must be an object`)]};for(let n of[`description`,`problem`,`approach`,`executor`]){let r=e[n];(!l(r)||r.trim()===``)&&t.push(u(n,`required string field missing/empty`,r))}typeof e.schema_version!=`number`&&t.push(u(`schema_version`,`must be a number`,e.schema_version));let r=e.plan_kind;r!==`brownfield`&&r!==`greenfield`&&t.push(u(`plan_kind`,`must be "brownfield" or "greenfield"`,r)),Array.isArray(e.phases)?e.phases.length===0&&t.push(u(`phases`,`must have at least one entry`)):t.push(u(`phases`,`must be an array`,e.phases));let i=e.terminal;!l(i)&&!Array.isArray(i)&&t.push(u(`terminal`,`must be a string or array`,i)),Array.isArray(e.dispatch_log)?f(e.dispatch_log,t):t.push(u(`dispatch_log`,`must be an array`,e.dispatch_log)),c(e.optimization)||t.push(u(`optimization`,`must be an object`,e.optimization)),c(e.providers)||t.push(u(`providers`,`must be an object`,e.providers)),c(e.effort_max_tokens)||t.push(u(`effort_max_tokens`,`must be an object`,e.effort_max_tokens));let o=e.milestones;if(!c(o))t.push(u(`milestones`,`must be an object`,o));else{let r=Object.keys(o);r.length===0&&t.push(u(`milestones`,`must have at least one entry`));let f=new Set(r);for(let e of r){let n=o[e];if(!c(n)){t.push(u(`milestones.${e}`,`must be an object`,n));continue}if((!l(n.description)||n.description.trim()===``)&&t.push(u(`milestones.${e}.description`,`required string`,n.description)),!Array.isArray(n.depends_on))t.push(u(`milestones.${e}.depends_on`,`must be an array`,n.depends_on));else for(let r of n.depends_on)l(r)?f.has(r)||t.push(u(`milestones.${e}.depends_on`,`unknown milestone "${r}"`)):t.push(u(`milestones.${e}.depends_on[]`,`must be a string`,r));let r=n.phase;(!l(r)||r.trim()===``)&&t.push(u(`milestones.${e}.phase`,`required string`,r)),(!l(n.authored_by)||n.authored_by.trim()===``)&&t.push(u(`milestones.${e}.authored_by`,`required string`,n.authored_by));let i=n.model;i!=null&&![`Haiku`,`Sonnet`,`Opus`].includes(i)&&t.push(u(`milestones.${e}.model`,`invalid model tier`,i));let a=n.effort;a!=null&&![`low`,`medium`,`high`,`xhigh`,`max`].includes(a)&&t.push(u(`milestones.${e}.effort`,`invalid effort tier`,a)),n.two_stage!==void 0&&typeof n.two_stage!=`boolean`&&t.push(u(`milestones.${e}.two_stage`,`must be a boolean`,n.two_stage)),Array.isArray(n.read_only)||t.push(u(`milestones.${e}.read_only`,`must be an array`,n.read_only))}let p=d(o);if(p)for(let{slug:e}of p)t.push(u(`milestones.${e}`,`dependency cycle detected`));if(l(i)&&!f.has(i))t.push(u(`terminal`,`unknown milestone "${i}"`));else if(Array.isArray(i))for(let e of i)f.has(e)||t.push(u(`terminal[]`,`unknown milestone "${e}"`));let m=e.operations,h=new Set;if(!Array.isArray(m)&&!c(m))t.push(u(`operations`,`must be an array or object`,m));else{let e=Array.isArray(m)?m:Object.values(m);for(let r of e){if(!c(r)){t.push(u(`operations[]`,`must be an object`,r));continue}let e=r.id;if(!l(e)){t.push(u(`operations[?]`,`missing/invalid id`,e));continue}let i=e;h.add(i);let o=r.milestone;l(o)?f.has(o)||t.push(u(`operations[${i}].milestone`,`unknown milestone "${o}"`)):t.push(u(`operations[${i}].milestone`,`required string`,o));let d=r.type;l(d)&&!a.has(d)&&t.push(u(`operations[${i}].type`,`invalid type`,d));let p=r.shape;if(c(p)){let e=p.kind;e!=null&&l(e)&&!s.has(e)&&t.push(u(`operations[${i}].shape.kind`,`invalid shape kind`,e));let r=p.ops;if(Array.isArray(r)&&l(e))for(let a=0;a<r.length;a++){let o=r[a];if(!c(o))continue;let s=o.op;l(s)&&!n(e,s)&&t.push(u(`operations[${i}].shape.ops[${a}]`,`op "${s}" not valid for kind "${e}"`))}}Array.isArray(r.depends_on)||t.push(u(`operations[${i}].depends_on`,`must be an array`,r.depends_on))}for(let n of e){if(!c(n))continue;let e=n.id;if(!l(e))continue;let r=n.depends_on;if(Array.isArray(r))for(let n of r)l(n)&&!h.has(n)&&t.push(u(`operations[${e}].depends_on`,`unknown operation "${n}"`))}}}return{valid:t.length===0,errors:t}}function m(e){let t=[];if(!c(e))return{valid:!1,errors:[u(``,`root must be an object`)]};for(let n of[`snapshot_at`,`description`])l(e[n])||t.push(u(n,`required string field missing`,e[n]));l(e.plan)||t.push(u(`plan`,`required string`,e.plan));let n=e.milestones;if(!c(n))t.push(u(`milestones`,`must be an object`,n));else{let a=Object.keys(n),o=new Set(a);for(let e of a){let i=n[e];if(!c(i)){t.push(u(`milestones.${e}`,`must be an object`,i));continue}let a=i.eligible,o=i.pending;a===!0&&o!=null&&t.push(u(`milestones.${e}`,`D-07 violation: eligible=true but pending not null`)),typeof a!=`boolean`&&t.push(u(`milestones.${e}.eligible`,`must be boolean`,a));let s=i.status;(!l(s)||!r.has(s))&&t.push(u(`milestones.${e}.status`,`invalid status`,s)),a===!0&&s===`complete`&&t.push(u(`milestones.${e}`,`D-07 violation: eligible=true but status is complete`));let d=i.wave;(typeof d!=`number`||!Number.isInteger(d)||d<0)&&t.push(u(`milestones.${e}.wave`,`must be non-negative integer`,d));let f=i.ki_estimate;f!=null&&typeof f!=`number`&&t.push(u(`milestones.${e}.ki_estimate`,`must be number|null`,f));for(let n of[`tokens_estimated`,`tokens_actual`]){let r=i[n];r!=null&&typeof r!=`number`&&t.push(u(`milestones.${e}.${n}`,`must be number|null`,r))}Array.isArray(i.artifacts)||t.push(u(`milestones.${e}.artifacts`,`must be an array`,i.artifacts)),typeof i.si_bytes!=`number`&&t.push(u(`milestones.${e}.si_bytes`,`must be a number`,i.si_bytes))}let s=e.operations;if(!Array.isArray(s))t.push(u(`operations`,`must be an array`,s));else for(let e of s){if(!c(e))continue;let n=l(e.id)?e.id:`?`,r=e.milestone;l(r)&&!o.has(r)&&t.push(u(`operations[${n}].milestone`,`unknown milestone "${r}"`));let a=e.status;(!l(a)||!i.has(a))&&t.push(u(`operations[${n}].status`,`invalid operation status`,a)),Array.isArray(e.dispatch_ids)||t.push(u(`operations[${n}].dispatch_ids`,`must be an array`,e.dispatch_ids)),typeof e.attempt_count!=`number`&&t.push(u(`operations[${n}].attempt_count`,`must be a number`,e.attempt_count)),Array.isArray(e.blast_radius)||t.push(u(`operations[${n}].blast_radius`,`must be an array`,e.blast_radius))}let d=e.open_questions;if(!Array.isArray(d))t.push(u(`open_questions`,`must be an array`,d));else for(let e of d){if(!c(e))continue;let n=e.blocking;(!l(n)||!o.has(n))&&t.push(u(`open_questions`,`unknown blocking milestone "${n}"`)),typeof e.surfaced!=`boolean`&&t.push(u(`open_questions[${e.id}]`,`surfaced must be boolean`,e.surfaced)),typeof e.answered!=`boolean`&&t.push(u(`open_questions[${e.id}]`,`answered must be boolean`,e.answered))}let f=e.dispatch_units;if(f!==void 0){if(!Array.isArray(f))t.push(u(`dispatch_units`,`must be an array if present`,f));else for(let e of f){if(!c(e))continue;let n=e.fits_context_window;typeof n!=`boolean`&&t.push(u(`dispatch_units[${e.id}]`,`fits_context_window must be boolean`,n));let r=e.milestones;if(Array.isArray(r))for(let n of r)l(n)&&!o.has(n)&&t.push(u(`dispatch_units[${e.id}].milestones`,`unknown milestone "${n}"`))}}c(e.pairwise_overlap)||t.push(u(`pairwise_overlap`,`must be an object`,e.pairwise_overlap))}return{valid:t.length===0,errors:t}}function h(e){let t=p(e);if(!t.valid)throw Error(`DagJson validation failed:\n${t.errors.map(e=>` ${e.path}: ${e.message}`).join(`
|
|
2
|
+
`)}`)}function g(e){let t=m(e);if(!t.valid)throw Error(`Snapshot validation failed:\n${t.errors.map(e=>` ${e.path}: ${e.message}`).join(`
|
|
3
|
+
`)}`)}var _=[{from:2,to:3,apply:e=>{!e.milestones&&e.nodes&&(e.milestones=e.nodes,delete e.nodes);let t=e.operations;t&&typeof t==`object`&&!Array.isArray(t)&&(e.operations=Object.values(t))}},{from:3,to:4,apply:e=>{(!e.providers||Object.keys(e.providers).length===0)&&(e.providers={Haiku:{type:`claudecli`,model_id:`claude-haiku-4-5`,env_secret:null,base_url:null,timeout_ms:6e4,retry_config:{retries:3,min_timeout:1e3,max_timeout:3e4,factor:2}},Sonnet:{type:`claudecli`,model_id:`claude-sonnet-4-5`,env_secret:null,base_url:null,timeout_ms:12e4,retry_config:{retries:3,min_timeout:1e3,max_timeout:3e4,factor:2}},Opus:{type:`claudecli`,model_id:`claude-opus-4-5`,env_secret:null,base_url:null,timeout_ms:3e5,retry_config:{retries:3,min_timeout:1e3,max_timeout:3e4,factor:2}}}),(!e.effort_max_tokens||Object.keys(e.effort_max_tokens).length===0)&&(e.effort_max_tokens={low:1024,medium:4096,high:8192,xhigh:16384,max:32768}),e.optimization||={sentinel_fanout:{enabled:!0,write_multiplier:1.25,read_multiplier:.1,hit_probability:.9},b_per_tier:{Haiku:8e3,Sonnet:15e3,Opus:27e3},context_window_per_tier:{Haiku:16e3,Sonnet:16e3,Opus:32e3},context_window_override:null,b_override:null};let t=[];Array.isArray(e.operations)?t=e.operations:e.operations&&typeof e.operations==`object`&&(t=Object.values(e.operations));for(let e of t)if(typeof e==`object`&&e){let t=e;t.type===void 0&&(t.type=`generative`),t.criteria===void 0&&(t.criteria=[]),t.tool===void 0&&(t.tool=null),t.args===void 0&&(t.args=null)}}}];function v(e,t,n){if(e===t)return;let r=e;for(let e of[..._].sort((e,t)=>e.from-t.from))if(e.from===r&&(e.apply(n),r=e.to,r===t)){n.schema_version=t;return}throw Error(`migrateDag: no path from v${e} to v${t}. Available: [${_.map(e=>`v${e.from}→v${e.to}`).join(`, `)}]`)}exports.VALID_OPS_BY_KIND=t,exports.WRITE_CLASS_ACTIONS=e,exports.assertValidDagJson=h,exports.assertValidSnapshot=g,exports.isValidOpForKind=n,exports.migrateDag=v,exports.validateDagJson=p,exports.validateSnapshot=m;
|