dev-process-kit 0.0.12 → 0.0.14

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.
Files changed (36) hide show
  1. package/dist/chunks/{shared-CLnfjHCQ.js → shared-BESRsbtm.js} +1 -1
  2. package/dist/chunks/{shared-DBJaP5gF.js → shared-BFTEmZvI.js} +147 -95
  3. package/dist/chunks/{shared-BwaDMwUS.js → shared-C2gu-y4m.js} +61 -33
  4. package/dist/chunks/{shared-DkkBQzIf.js → shared-CE1P_7xs.js} +199 -168
  5. package/dist/chunks/shared-CGPv8MQ7.js +1049 -0
  6. package/dist/chunks/shared-CTK76mc_.js +2457 -0
  7. package/dist/chunks/{shared-BvuW5NtY.js → shared-CmBhMY6X.js} +14 -3
  8. package/dist/chunks/shared-D4K7KsfJ.js +1 -0
  9. package/dist/chunks/shared-DD-fi15c.js +1104 -0
  10. package/dist/chunks/shared-DUEkF1z7.js +572 -0
  11. package/dist/chunks/{shared-CcrRNZCH.js → shared-Dc_FGuLM.js} +1 -1
  12. package/dist/chunks/shared-DdefS1nG.js +1 -0
  13. package/dist/chunks/{shared-C__W71Hw.js → shared-DjOBIYHF.js} +1 -1
  14. package/dist/chunks/{shared-DYe0OZr-.js → shared-NnvpqsPp.js} +19 -10
  15. package/dist/chunks/shared-rZQ5j0Kh.js +2683 -0
  16. package/dist/chunks/{shared-DUq2-pM9.js → shared-wtt8CCP_.js} +184 -134
  17. package/dist/components.js +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/templates/delegation-poker.js +1 -1
  20. package/dist/templates/event-storming.js +1 -1
  21. package/dist/templates/example-mapping.js +1 -1
  22. package/dist/templates/grill.js +1 -1
  23. package/dist/templates/plain.js +1 -1
  24. package/dist/templates/prototype.js +1 -1
  25. package/dist/templates/slides.js +1 -1
  26. package/dist/templates/task-board.js +1 -1
  27. package/dist/templates/usm.js +1 -1
  28. package/dist/templates/whiteboard.js +1 -1
  29. package/package.json +1 -1
  30. package/dist/chunks/shared-BC5MlWBY.js +0 -2209
  31. package/dist/chunks/shared-CoDXb-Yj.js +0 -556
  32. package/dist/chunks/shared-D7CMQLaX.js +0 -2323
  33. package/dist/chunks/shared-DhwK_dh_.js +0 -1093
  34. package/dist/chunks/shared-aDPp8Vry.js +0 -1
  35. package/dist/chunks/shared-xrCdgpNS.js +0 -1
  36. package/dist/chunks/shared-y3FwoRgh.js +0 -1017
@@ -1,120 +1,126 @@
1
- import{ac as Ro,ad as b,ae as i,af as f,ag as c,ah as $,az as h,ao as J,ai as X,aj as V,p as w,v as qo,ay as Io,av as Qo,al as Uo,an as B,P as Ho,e as Mo,a0 as Ko,V as jo,R as S,a3 as s,a4 as n,A as Fo,a5 as y,aY as Z,aZ as Yo,aH as P,K as Jo,aE as Xo,a2 as Vo,T as oo,l as Zo,aJ as oe}from"./shared-BC5MlWBY.js";const eo=["working","waiting","blocked","done"],D=["todo","doing","blocked","done"],ao=["agent","human"],E=["why","what","goals","nonGoals"],T=X(c(),V(1)),ee=b({id:h,name:T,kind:i($(ao),"agent")}),ae=b({id:h,title:T,status:i($(D),"todo"),assignee:i(h),note:i(c()),proposed:i(J(),!1),reason:i(c())}),te=b({id:h,label:i(c()),href:T,kind:i(c()),description:i(c())}),re=b({why:i(c()),what:i(c()),goals:i(f(c()),[]),nonGoals:i(f(c()),[])}),ne=b({id:h,from:i(h),at:i(c()),title:i(c()),body:i(c()),points:i(f(c()),[])}),de=b({id:h,ref:i(T),title:T,description:i(c()),blocking:i(J(),!1),assumption:i(c())}),to=b({title:i(c(),""),status:i($(eo)),updatedAt:i(c()),context:i(re,{}),members:i(f(ee),[]),todos:i(f(ae),[]),outputs:i(f(te),[]),log:i(f(ne),[]),questions:i(f(de),[])}),A=(e,o)=>{const a=new Set;for(const t of o){if(a.has(t))throw new Error(`duplicate ${e} id: ${t}`);a.add(t)}},u=e=>e===void 0||e.trim()===""?null:e,W=e=>e.filter(o=>o.trim()!==""),ro=e=>{const o=Ro(to,e);A("member",o.members.map(t=>t.id)),A("todo",o.todos.map(t=>t.id)),A("output",o.outputs.map(t=>t.id)),A("log",o.log.map(t=>t.id)),A("question",o.questions.map(t=>t.id));const a=new Set(o.members.map(t=>t.id));for(const t of o.todos)if(t.assignee!==void 0&&!a.has(t.assignee))throw new Error(`todo ${t.id} is assigned to ${t.assignee}, which is not in members`);for(const t of o.log){if(t.from!==void 0&&!a.has(t.from))throw new Error(`log entry ${t.id} is from ${t.from}, which is not in members`);if(u(t.title)===null&&u(t.body)===null)throw new Error(`log entry ${t.id} needs a title or a body`)}for(const t of o.questions)if(!t.blocking&&u(t.assumption)===null)throw new Error(`question ${t.id} does not block, so it needs the assumption the agent works on`);return{title:o.title,status:o.status??null,updatedAt:u(o.updatedAt),context:{why:u(o.context.why),what:u(o.context.what),goals:W(o.context.goals),nonGoals:W(o.context.nonGoals)},members:o.members,todos:o.todos.map(t=>({id:t.id,title:t.title,status:t.status,assignee:t.assignee??null,note:u(t.note),proposed:t.proposed,reason:u(t.reason),added:!1})),outputs:o.outputs.map(t=>({id:t.id,label:u(t.label),href:t.href,kind:u(t.kind),description:u(t.description)})),log:o.log.map(t=>({id:t.id,from:t.from??null,at:u(t.at),title:u(t.title),body:u(t.body),points:W(t.points)})),questions:o.questions.map((t,r)=>({id:t.id,ref:t.ref??`Q${r+1}`,title:t.title,description:u(t.description),blocking:t.blocking,assumption:u(t.assumption)})),answers:{},decisions:{}}},no=()=>({title:"",status:null,updatedAt:null,context:{why:null,what:null,goals:[],nonGoals:[]},members:[],todos:[],outputs:[],log:[],questions:[],answers:{},decisions:{}}),O=(e,o)=>o===null?void 0:e.members.find(a=>a.id===o),k=(e,o)=>e.todos.find(a=>a.id===o),so=(e,o)=>e.log.find(a=>a.id===o),io=e=>E.includes(e),N=(e,o)=>{const a=e.context[o];return typeof a=="string"||a!==null&&a.length>0},z=(e,o)=>e.questions.find(a=>a.id===o),lo=(e,o)=>{const a=e.answers[o.id];return a===void 0?!1:a.kind==="approve"||a.text.trim()!==""},R=(e,o)=>!o.proposed||e.decisions[o.id]==="accept",q=(e,o)=>R(e,o)&&O(e,o.assignee)?.kind==="human",po=(e,o,a)=>{const t={...e};return a===null?delete t[o]:t[o]=a,t},I=(e,o,a)=>({...e,answers:po(e.answers,o,a)}),se=(e,o,a)=>({...e,decisions:po(e.decisions,o,a)}),ie=(e,o,a)=>({...e,todos:e.todos.map(t=>t.id===o?a(t):t)}),m={ANSWER_QUESTION:w("ANSWER_QUESTION","question",Uo("kind",[b({kind:B("approve")}),b({kind:B("answer"),text:c()}),b({kind:B("clear")})])),DECIDE_PROPOSAL:w("DECIDE_PROPOSAL","todo",b({decision:$(["accept","decline","clear"])})),SET_TODO_STATUS:w("SET_TODO_STATUS","todo",b({status:$(D)})),ADD_TODO:w("ADD_TODO","page",b({id:h,title:X(c(),Qo(),V(1)),assignee:Io(h)}),{dedupeKey:qo}),DELETE_TODO:w("DELETE_TODO","todo",b({}))},co={type:"page",id:"task-board"},Q=(e,o)=>({type:"ANSWER_QUESTION",target:{type:"question",id:e},payload:o}),uo=(e,o)=>({type:"DECIDE_PROPOSAL",target:{type:"todo",id:e},payload:{decision:o}}),bo=(e,o)=>({type:"SET_TODO_STATUS",target:{type:"todo",id:e},payload:{status:o}}),go=(e,o,a)=>({type:"ADD_TODO",target:co,payload:{id:e,title:o,assignee:a}}),ho=e=>({type:"DELETE_TODO",target:{type:"todo",id:e},payload:{}}),ko=(e,o)=>{const a=Ho(m,o);if(a===null)return null;const t=a.target.id;switch(a.type){case"ANSWER_QUESTION":{const r=z(e,t);if(r===void 0)return null;const d=a.payload;return d.kind==="clear"?I(e,t,null):d.kind==="approve"?r.assumption===null?null:I(e,t,{kind:"approve"}):I(e,t,{kind:"answer",text:d.text})}case"DECIDE_PROPOSAL":{if(k(e,t)?.proposed!==!0)return null;const{decision:r}=a.payload;return se(e,t,r==="clear"?null:r)}case"SET_TODO_STATUS":{const r=k(e,t);if(r===void 0||!q(e,r))return null;const{status:d}=a.payload;return ie(e,t,l=>({...l,status:d}))}case"ADD_TODO":{const{payload:r}=a;return k(e,r.id)!==void 0||r.assignee!==null&&O(e,r.assignee)===void 0?null:{...e,todos:[...e.todos,{id:r.id,title:r.title,status:"todo",assignee:r.assignee,note:null,proposed:!1,reason:null,added:!0}]}}case"DELETE_TODO":return k(e,t)?.added!==!0?null:{...e,todos:e.todos.filter(r=>r.id!==t)};default:return Mo(a)}},U=Ko({en:{wholeBoard:"Whole board",statusWorking:"Working",statusWaiting:"Waiting on you",statusBlocked:"Blocked",statusDone:"Done",todoTodo:"To do",todoDoing:"In progress",todoBlocked:"Blocked",todoDone:"Done",kindAgent:"Agent",kindHuman:"Human",updatedAt:e=>`Updated ${e}`,context:"What this task is about",contextWhy:"Why",contextWhat:"What",contextGoals:"Goals",contextNonGoals:"Non-goals",noContext:"The agent has not written down why and what yet.",tabs:"Board sections",tabContext:"Context",tabLog:"Work log",tabQuestions:"Questions",openCount:e=>`${e} open`,noQuestions:"The agent has nothing to ask right now.",questions:"Questions from the agent",questionsProgress:(e,o)=>`${e} of ${o} replied`,blockingGroup:"Blocking \u2014 the agent waits for your decision",provisionalGroup:"Going ahead on an assumption \u2014 the agent adjusts if you answer otherwise",blockingTag:"Blocking",assumption:"Assumption",recommendation:"Agent recommends",approveAssumption:"OK, go with this",approveRecommendation:"OK, go with the recommendation",answerOther:"Answer differently",answerOf:e=>`Your answer to ${e}`,answerPlaceholder:"What you expect instead\u2026",blockingPlaceholder:"Your decision\u2026",approvedTag:"Approved",answeredTag:"Answered",todos:"Todo",progress:(e,o)=>`${e} of ${o} done`,noTodosYet:"No todos yet",assignee:"Assignee",unassigned:"Unassigned",memberOption:(e,o)=>`${e} (${o})`,statusOf:e=>`Status of \u201C${e}\u201D`,filterTodos:"Show todos",filterAll:"All",filterHuman:"People",doneGroup:e=>`Done (${e})`,noHumanTodos:"Nobody but the agent has a todo.",addedTag:"Added by you",changedTag:"Changed",removeAdded:"Remove this todo you added",noTodos:"There are no todos yet.",newTodo:"New todo",newTodoPlaceholder:"Add a todo for the agent\u2026",newTodoAssignee:"Assignee of the new todo",addTodo:"Add",proposedMark:"Proposed by the agent",reason:"Why",accept:"Accept",decline:"Decline",decisionOf:e=>`Decision on \u201C${e}\u201D`,acceptedTag:"Accepted",declinedTag:"Declined",undoDecision:"Undo",outputs:"Outputs",noOutputs:"Nothing has been produced yet.",copy:e=>`Copy ${e}`,copied:"Copied",log:"Conversation with the agent",logLede:"Newest first",noLog:"Nothing has been exchanged yet.",fromAgent:"Agent",latestTag:"Latest",commentOn:e=>`Comment on ${e}`,todoGroup:"Todo",logGroup:"Log",contextGroup:"Context",proposalGroup:"Proposal",questionGroup:"Question",approved:"Approve the assumption",answered:"Answer",answerCleared:"Clear the reply",accepted:"Accept the proposal",declined:"Decline the proposal",decisionCleared:"Clear the decision",statusChanged:"Change the status",todoAdded:"Add a todo",todoRemoved:"Remove the added todo",quoted:e=>`\u2192 \u201C${e}\u201D`,change:(e,o)=>`${e} \u2192 ${o}`},ja:{wholeBoard:"\u30DC\u30FC\u30C9\u5168\u4F53",statusWorking:"\u4F5C\u696D\u4E2D",statusWaiting:"\u3042\u306A\u305F\u306E\u8FD4\u7B54\u5F85\u3061",statusBlocked:"\u30D6\u30ED\u30C3\u30AF\u4E2D",statusDone:"\u5B8C\u4E86",todoTodo:"\u672A\u7740\u624B",todoDoing:"\u9032\u884C\u4E2D",todoBlocked:"\u30D6\u30ED\u30C3\u30AF",todoDone:"\u5B8C\u4E86",kindAgent:"Agent",kindHuman:"\u4EBA\u9593",updatedAt:e=>`\u66F4\u65B0 ${e}`,context:"\u3053\u306E\u30BF\u30B9\u30AF\u306E\u524D\u63D0",contextWhy:"Why \u2014 \u306A\u305C\u3084\u308B\u304B",contextWhat:"What \u2014 \u4F55\u3092\u3084\u308B\u304B",contextGoals:"\u30B4\u30FC\u30EB",contextNonGoals:"\u3084\u3089\u306A\u3044\u3053\u3068",noContext:"Agent \u306F\u307E\u3060 Why / What \u3092\u66F8\u3044\u3066\u3044\u307E\u305B\u3093\u3002",tabs:"\u30DC\u30FC\u30C9\u306E\u533A\u5206",tabContext:"Context",tabLog:"\u4F5C\u696D\u30ED\u30B0",tabQuestions:"\u8CEA\u554F",openCount:e=>`\u672A\u56DE\u7B54 ${e} \u4EF6`,noQuestions:"\u4ECA Agent \u304B\u3089\u805E\u304D\u305F\u3044\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002",questions:"Agent \u304B\u3089\u306E\u8CEA\u554F",questionsProgress:(e,o)=>`\u8FD4\u7B54\u6E08\u307F ${e} / ${o}`,blockingGroup:"\u30D6\u30ED\u30C3\u30AB\u30FC \u2014 \u6C7A\u3081\u3066\u3082\u3089\u3046\u307E\u3067\u5148\u306B\u9032\u3081\u306A\u3044",provisionalGroup:"\u4EEE\u306E\u524D\u63D0\u3067\u9032\u884C\u4E2D \u2014 \u9055\u3048\u3070\u65B9\u91DD\u3092\u76F4\u3059",blockingTag:"\u30D6\u30ED\u30C3\u30AB\u30FC",assumption:"\u4EEE\u56DE\u7B54",recommendation:"Agent \u306E\u63A8\u5968",approveAssumption:"\u3053\u306E\u524D\u63D0\u3067 OK",approveRecommendation:"\u63A8\u5968\u3069\u304A\u308A\u3067 OK",answerOther:"\u5225\u306E\u56DE\u7B54\u3092\u3059\u308B",answerOf:e=>`${e} \u3078\u306E\u56DE\u7B54`,answerPlaceholder:"\u671F\u5F85\u3059\u308B\u56DE\u7B54\u3092\u5165\u529B\u2026",blockingPlaceholder:"\u3069\u3046\u3059\u308B\u304B\u3092\u5165\u529B\u2026",approvedTag:"\u627F\u8A8D\u6E08\u307F",answeredTag:"\u56DE\u7B54\u6E08\u307F",todos:"Todo",progress:(e,o)=>`${o} \u4EF6\u4E2D ${e} \u4EF6\u5B8C\u4E86`,noTodosYet:"Todo \u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093",assignee:"\u62C5\u5F53",unassigned:"\u672A\u5272\u308A\u5F53\u3066",memberOption:(e,o)=>`${e}\uFF08${o}\uFF09`,statusOf:e=>`\u300C${e}\u300D\u306E\u72B6\u614B`,filterTodos:"\u8868\u793A\u3059\u308B Todo",filterAll:"\u3059\u3079\u3066",filterHuman:"\u4EBA\u9593\u306E\u62C5\u5F53",doneGroup:e=>`\u5B8C\u4E86 ${e} \u4EF6`,noHumanTodos:"\u4EBA\u9593\u304C\u62C5\u5F53\u3059\u308B Todo \u306F\u3042\u308A\u307E\u305B\u3093\u3002",addedTag:"\u3042\u306A\u305F\u304C\u8FFD\u52A0",changedTag:"\u5909\u66F4\u3042\u308A",removeAdded:"\u8FFD\u52A0\u3057\u305F Todo \u3092\u53D6\u308A\u6D88\u3059",noTodos:"Todo \u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002",newTodo:"\u65B0\u3057\u3044 Todo",newTodoPlaceholder:"Agent \u306B\u983C\u3080 Todo \u3092\u8FFD\u52A0\u2026",newTodoAssignee:"\u65B0\u3057\u3044 Todo \u306E\u62C5\u5F53",addTodo:"\u8FFD\u52A0",proposedMark:"Agent \u304B\u3089\u306E\u63D0\u6848",reason:"\u306A\u305C",accept:"\u627F\u8A8D",decline:"\u898B\u9001\u308A",decisionOf:e=>`\u300C${e}\u300D\u306E\u5224\u65AD`,acceptedTag:"\u627F\u8A8D\u6E08\u307F",declinedTag:"\u898B\u9001\u308A",undoDecision:"\u53D6\u308A\u6D88\u3059",outputs:"\u6210\u679C\u7269",noOutputs:"\u307E\u3060\u6210\u679C\u7269\u306F\u3042\u308A\u307E\u305B\u3093\u3002",copy:e=>`${e} \u3092\u30B3\u30D4\u30FC`,copied:"\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F",log:"Agent \u3068\u306E\u3084\u308A\u3068\u308A",logLede:"\u65B0\u3057\u3044\u9806",noLog:"\u307E\u3060\u3084\u308A\u3068\u308A\u306F\u3042\u308A\u307E\u305B\u3093\u3002",fromAgent:"Agent",latestTag:"\u6700\u65B0",commentOn:e=>`${e} \u306B\u30B3\u30E1\u30F3\u30C8`,todoGroup:"Todo",logGroup:"\u4F5C\u696D\u30ED\u30B0",contextGroup:"Context",proposalGroup:"\u63D0\u6848",questionGroup:"\u8CEA\u554F",approved:"\u524D\u63D0\u3092\u627F\u8A8D",answered:"\u56DE\u7B54",answerCleared:"\u8FD4\u7B54\u3092\u30AF\u30EA\u30A2",accepted:"\u63D0\u6848\u3092\u627F\u8A8D",declined:"\u63D0\u6848\u3092\u898B\u9001\u308A",decisionCleared:"\u63D0\u6848\u306E\u5224\u65AD\u3092\u30AF\u30EA\u30A2",statusChanged:"\u72B6\u614B\u3092\u5909\u66F4",todoAdded:"Todo \u3092\u8FFD\u52A0",todoRemoved:"\u8FFD\u52A0\u3057\u305F Todo \u3092\u53D6\u308A\u6D88\u3057",quoted:e=>`\u2192 \u300C${e}\u300D`,change:(e,o)=>`${e} \u2192 ${o}`}}),xo=(e,o)=>{switch(o){case"working":return e.statusWorking;case"waiting":return e.statusWaiting;case"blocked":return e.statusBlocked;case"done":return e.statusDone}},C=(e,o)=>{switch(o){case"todo":return e.todoTodo;case"doing":return e.todoDoing;case"blocked":return e.todoBlocked;case"done":return e.todoDone}},le=(e,o)=>o==="agent"?e.kindAgent:e.kindHuman,L=(e,o)=>{switch(o){case"why":return e.contextWhy;case"what":return e.contextWhat;case"goals":return e.contextGoals;case"nonGoals":return e.contextNonGoals}},fo=48,H=e=>{const o=e.title??e.body??e.id;return o.length<=fo?o:`${o.slice(0,fo-1)}\u2026`},pe=(e,o,a)=>a===null?e.unassigned:O(o,a)?.name??a,mo=e=>e.title===""?"Task Context Board":e.title,vo=(e,o,a)=>{switch(a.type){case"todo":{const t=k(o,a.id);return`${t?.proposed===!0?e.proposalGroup:e.todoGroup} \xB7 ${t?.title??a.id}`}case"log":{const t=so(o,a.id);return`${e.logGroup} \xB7 ${t===void 0?a.id:H(t)}`}case"context":return`${e.contextGroup} \xB7 ${io(a.id)?L(e,a.id):a.id}`;case"question":{const t=z(o,a.id);return t===void 0?a.id:`${t.ref} \xB7 ${t.title}`}case"page":return e.wholeBoard;default:return a.id}},ce=(e,o)=>{switch(o){case"accept":return{title:e.accepted,tone:"update"};case"decline":return{title:e.declined,tone:"update"};case"clear":return{title:e.decisionCleared,tone:"delete"}}},ue=(e,o,a)=>{switch(a.type){case"ANSWER_QUESTION":{const t=S(m.ANSWER_QUESTION,a);if(t.kind==="clear")return{title:e.answerCleared,tone:"delete"};if(t.kind==="approve"){const r=z(o,a.target.id)?.assumption??null;return{title:e.approved,tone:"update",...r===null?{}:{body:e.quoted(r)}}}return{title:e.answered,tone:"update",body:e.quoted(t.text.slice(0,120))}}case"DECIDE_PROPOSAL":return ce(e,S(m.DECIDE_PROPOSAL,a).decision);case"SET_TODO_STATUS":{const{status:t}=S(m.SET_TODO_STATUS,a),r=k(o,a.target.id)?.status,d=C(e,t);return{title:e.statusChanged,tone:"update",body:r===void 0?d:e.change(C(e,r),d)}}case"ADD_TODO":{const t=S(m.ADD_TODO,a);return{title:e.todoAdded,tone:"create",targetLabel:`${e.todoGroup} \xB7 ${t.title}`,...t.assignee===null?{}:{body:`${e.assignee}: ${pe(e,o,t.assignee)}`}}}case"DELETE_TODO":return{title:e.todoRemoved,tone:"delete"};default:return{title:a.type,tone:"meta"}}},$o=(e,o,a,t)=>{let r;try{r=ue(e,t??a,o)}catch{r={title:o.type,tone:"meta"}}return{title:r.title,targetLabel:r.targetLabel??vo(e,a,o.target),tone:r.tone,...r.body===void 0?{}:{summary:r.body}}},wo=e=>`${e.type} ${jo(e.target)} ${JSON.stringify(e.payload)}`,yo=(e,o)=>[...o.questions.map(a=>({value:`question:${a.id}`,label:`${a.ref} \xB7 ${a.title}`,group:e.questionGroup})),...o.todos.map(a=>({value:`todo:${a.id}`,label:a.title,group:a.proposed?e.proposalGroup:e.todoGroup})),...o.log.map(a=>({value:`log:${a.id}`,label:H(a),group:e.logGroup})),...E.filter(a=>N(o,a)).map(a=>({value:`context:${a}`,label:L(e,a),group:e.contextGroup}))],To=(e,o)=>o,Ao=(e,o,a)=>({parts:E.filter(t=>N(o,t)).map(t=>{const r=o.context[t];return{id:t,title:L(e,t),text:typeof r=="string"?r:null,items:typeof r=="string"||r===null?[]:r,comments:a(`context:${t}`)}})}),be=(e,o,a)=>{const t=e.answers[o.id];return{id:o.id,ref:o.ref,title:o.title,description:o.description,blocking:o.blocking,assumption:o.assumption,reply:t?.kind??"none",resolved:lo(e,o),draft:t?.kind==="answer"?t.text:"",comments:a(`question:${o.id}`)}},Oo=(e,o)=>{const a=e.questions.map(r=>be(e,r,o)),t=a.filter(r=>r.resolved).length;return{blocking:a.filter(r=>r.blocking),provisional:a.filter(r=>!r.blocking),resolved:t,total:a.length,open:a.length-t,blockingOpen:a.filter(r=>r.blocking&&!r.resolved).length}},ge=(e,o,a,t,r)=>{const d=k(a,t.id),l=O(o,t.assignee);return{id:t.id,title:t.title,note:t.note,reason:t.reason,status:t.status,statusLabel:C(e,t.status),assignee:t.assignee,assigneeName:l?.name??null,assigneeKind:l?.kind??null,editable:q(o,t),proposal:t.proposed?o.decisions[t.id]??"pending":null,added:t.added,changed:d!==void 0&&d.status!==t.status,comments:r(`todo:${t.id}`)}},So=(e,o,a,t,r="all")=>{const d=o.todos.filter(p=>R(o,p)),l=d.filter(p=>p.status==="done").length,g=o.members.some(p=>p.kind==="human"),x=g?r:"all",j=p=>p.assigneeKind==="human",G=o.todos.map(p=>ge(e,o,a,p,t)),F=x==="human"?G.filter(j):G,Y=p=>p.status==="done"&&k(a,p.id)?.status==="done";return{todos:F.filter(p=>!Y(p)),done:F.filter(Y),filter:x,canFilter:g,humanCount:G.filter(j).length,progress:{done:l,total:d.length,label:d.length===0?e.noTodosYet:e.progress(l,d.length)},statuses:D.map(p=>({value:p,label:C(e,p)})),members:o.members.map(p=>({id:p.id,label:e.memberOption(p.name,le(e,p.kind))}))}},Do=e=>{if(!/^[a-z][a-z\d+.-]*:\/\//i.test(e))return{kind:"path"};try{return{kind:"url",host:new URL(e).host}}catch{return{kind:"path"}}},Eo=e=>e.outputs.map(o=>({id:o.id,title:o.label??o.href,labelled:o.label!==null,href:o.href,kind:o.kind,description:o.description,place:Do(o.href)})),zo=(e,o,a)=>({entries:o.log.map((t,r)=>{const d=O(o,t.from);return{id:t.id,author:d===void 0?null:{name:d.name,kind:d.kind},at:t.at,title:t.title,body:t.body,points:t.points,label:H(t),latest:r===o.log.length-1,comments:a(`log:${t.id}`)}}).reverse(),status:o.status===null&&o.updatedAt===null?null:{status:o.status,label:o.status===null?null:xo(e,o.status),updatedAt:o.updatedAt}}),Co=(e,o)=>{switch(o.type){case"todo":return k(e,o.id)!==void 0;case"log":return so(e,o.id)!==void 0;case"context":return io(o.id)&&N(e,o.id);case"question":return z(e,o.id)!==void 0;case"page":return!0;default:return!1}},Lo=e=>{const o=U(e);return{name:"task-board",label:"Task Context Board",parseBase:ro,emptyBase:no,actions:m,apply:ko,hasTarget:Co,describe:(a,t,r)=>$o(o,a,t,r),serialize:wo,resolveNavigation:To,commentTargets:a=>yo(o,a),title:mo}},_=(e,o,a,t)=>n`
1
+ import{ad as Ne,ae as b,af as i,ag as f,ah as c,ai as w,aA as h,ap as X,aj as J,ak as V,p as $,v as Re,az as qe,aw as Ie,am as Qe,ao as B,P as Ue,e as He,a0 as Me,V as Ke,R as S,a3 as s,a4 as n,A as Fe,a5 as y,b1 as Z,b2 as je,aI as P,K as Ye,aF as Xe,a2 as Je,T as ee,l as Ve,aM as Ze}from"./shared-rZQ5j0Kh.js";const oe=["working","waiting","blocked","done"],D=["todo","doing","blocked","done"],ae=["agent","human"],E=["why","what","goals","nonGoals"],T=J(c(),V(1)),eo=b({id:h,name:T,kind:i(w(ae),"agent")}),oo=b({id:h,title:T,status:i(w(D),"todo"),assignee:i(h),note:i(c()),proposed:i(X(),!1),reason:i(c())}),ao=b({id:h,label:i(c()),href:T,kind:i(c()),description:i(c())}),to=b({why:i(c()),what:i(c()),goals:i(f(c()),[]),nonGoals:i(f(c()),[])}),ro=b({id:h,from:i(h),at:i(c()),title:i(c()),body:i(c()),points:i(f(c()),[])}),no=b({id:h,ref:i(T),title:T,description:i(c()),blocking:i(X(),!1),assumption:i(c())}),te=b({title:i(c(),""),status:i(w(oe)),updatedAt:i(c()),context:i(to,{}),members:i(f(eo),[]),todos:i(f(oo),[]),outputs:i(f(ao),[]),log:i(f(ro),[]),questions:i(f(no),[])}),A=(o,e)=>{const a=new Set;for(const t of e){if(a.has(t))throw new Error(`duplicate ${o} id: ${t}`);a.add(t)}},u=o=>o===void 0||o.trim()===""?null:o,W=o=>o.filter(e=>e.trim()!==""),re=o=>{const e=Ne(te,o);A("member",e.members.map(t=>t.id)),A("todo",e.todos.map(t=>t.id)),A("output",e.outputs.map(t=>t.id)),A("log",e.log.map(t=>t.id)),A("question",e.questions.map(t=>t.id));const a=new Set(e.members.map(t=>t.id));for(const t of e.todos)if(t.assignee!==void 0&&!a.has(t.assignee))throw new Error(`todo ${t.id} is assigned to ${t.assignee}, which is not in members`);for(const t of e.log){if(t.from!==void 0&&!a.has(t.from))throw new Error(`log entry ${t.id} is from ${t.from}, which is not in members`);if(u(t.title)===null&&u(t.body)===null)throw new Error(`log entry ${t.id} needs a title or a body`)}for(const t of e.questions)if(!t.blocking&&u(t.assumption)===null)throw new Error(`question ${t.id} does not block, so it needs the assumption the agent works on`);return{title:e.title,status:e.status??null,updatedAt:u(e.updatedAt),context:{why:u(e.context.why),what:u(e.context.what),goals:W(e.context.goals),nonGoals:W(e.context.nonGoals)},members:e.members,todos:e.todos.map(t=>({id:t.id,title:t.title,status:t.status,assignee:t.assignee??null,note:u(t.note),proposed:t.proposed,reason:u(t.reason),added:!1})),outputs:e.outputs.map(t=>({id:t.id,label:u(t.label),href:t.href,kind:u(t.kind),description:u(t.description)})),log:e.log.map(t=>({id:t.id,from:t.from??null,at:u(t.at),title:u(t.title),body:u(t.body),points:W(t.points)})),questions:e.questions.map((t,r)=>({id:t.id,ref:t.ref??`Q${r+1}`,title:t.title,description:u(t.description),blocking:t.blocking,assumption:u(t.assumption)})),answers:{},decisions:{}}},ne=()=>({title:"",status:null,updatedAt:null,context:{why:null,what:null,goals:[],nonGoals:[]},members:[],todos:[],outputs:[],log:[],questions:[],answers:{},decisions:{}}),O=(o,e)=>e===null?void 0:o.members.find(a=>a.id===e),k=(o,e)=>o.todos.find(a=>a.id===e),de=(o,e)=>o.log.find(a=>a.id===e),se=o=>E.includes(o),N=(o,e)=>{const a=o.context[e];return typeof a=="string"||a!==null&&a.length>0},z=(o,e)=>o.questions.find(a=>a.id===e),ie=(o,e)=>{const a=o.answers[e.id];return a===void 0?!1:a.kind==="approve"||a.text.trim()!==""},R=(o,e)=>!e.proposed||o.decisions[e.id]==="accept",q=(o,e)=>R(o,e)&&O(o,e.assignee)?.kind==="human",le=(o,e,a)=>{const t={...o};return a===null?delete t[e]:t[e]=a,t},I=(o,e,a)=>({...o,answers:le(o.answers,e,a)}),so=(o,e,a)=>({...o,decisions:le(o.decisions,e,a)}),io=(o,e,a)=>({...o,todos:o.todos.map(t=>t.id===e?a(t):t)}),m={ANSWER_QUESTION:$("ANSWER_QUESTION","question",Qe("kind",[b({kind:B("approve")}),b({kind:B("answer"),text:c()}),b({kind:B("clear")})])),DECIDE_PROPOSAL:$("DECIDE_PROPOSAL","todo",b({decision:w(["accept","decline","clear"])})),SET_TODO_STATUS:$("SET_TODO_STATUS","todo",b({status:w(D)})),ADD_TODO:$("ADD_TODO","page",b({id:h,title:J(c(),Ie(),V(1)),assignee:qe(h)}),{dedupeKey:Re}),DELETE_TODO:$("DELETE_TODO","todo",b({}))},pe={type:"page",id:"task-board"},Q=(o,e)=>({type:"ANSWER_QUESTION",target:{type:"question",id:o},payload:e}),ce=(o,e)=>({type:"DECIDE_PROPOSAL",target:{type:"todo",id:o},payload:{decision:e}}),ue=(o,e)=>({type:"SET_TODO_STATUS",target:{type:"todo",id:o},payload:{status:e}}),be=(o,e,a)=>({type:"ADD_TODO",target:pe,payload:{id:o,title:e,assignee:a}}),ge=o=>({type:"DELETE_TODO",target:{type:"todo",id:o},payload:{}}),he=(o,e)=>{const a=Ue(m,e);if(a===null)return null;const t=a.target.id;switch(a.type){case"ANSWER_QUESTION":{const r=z(o,t);if(r===void 0)return null;const d=a.payload;return d.kind==="clear"?I(o,t,null):d.kind==="approve"?r.assumption===null?null:I(o,t,{kind:"approve"}):I(o,t,{kind:"answer",text:d.text})}case"DECIDE_PROPOSAL":{if(k(o,t)?.proposed!==!0)return null;const{decision:r}=a.payload;return so(o,t,r==="clear"?null:r)}case"SET_TODO_STATUS":{const r=k(o,t);if(r===void 0||!q(o,r))return null;const{status:d}=a.payload;return io(o,t,l=>({...l,status:d}))}case"ADD_TODO":{const{payload:r}=a;return k(o,r.id)!==void 0||r.assignee!==null&&O(o,r.assignee)===void 0?null:{...o,todos:[...o.todos,{id:r.id,title:r.title,status:"todo",assignee:r.assignee,note:null,proposed:!1,reason:null,added:!0}]}}case"DELETE_TODO":return k(o,t)?.added!==!0?null:{...o,todos:o.todos.filter(r=>r.id!==t)};default:return He(a)}},U=Me({en:{wholeBoard:"Whole board",statusWorking:"Working",statusWaiting:"Waiting on you",statusBlocked:"Blocked",statusDone:"Done",todoTodo:"To do",todoDoing:"In progress",todoBlocked:"Blocked",todoDone:"Done",kindAgent:"Agent",kindHuman:"Human",updatedAt:o=>`Updated ${o}`,context:"What this task is about",contextWhy:"Why",contextWhat:"What",contextGoals:"Goals",contextNonGoals:"Non-goals",noContext:"The agent has not written down why and what yet.",tabs:"Board sections",tabContext:"Context",tabLog:"Work log",tabQuestions:"Questions",openCount:o=>`${o} open`,noQuestions:"The agent has nothing to ask right now.",questions:"Questions from the agent",questionsProgress:(o,e)=>`${o} of ${e} replied`,blockingGroup:"Blocking \u2014 the agent waits for your decision",provisionalGroup:"Going ahead on an assumption \u2014 the agent adjusts if you answer otherwise",blockingTag:"Blocking",assumption:"Assumption",recommendation:"Agent recommends",approveAssumption:"OK, go with this",approveRecommendation:"OK, go with the recommendation",answerOther:"Answer differently",answerOf:o=>`Your answer to ${o}`,answerPlaceholder:"What you expect instead\u2026",blockingPlaceholder:"Your decision\u2026",approvedTag:"Approved",answeredTag:"Answered",todos:"Todo",progress:(o,e)=>`${o} of ${e} done`,noTodosYet:"No todos yet",assignee:"Assignee",unassigned:"Unassigned",memberOption:(o,e)=>`${o} (${e})`,statusOf:o=>`Status of \u201C${o}\u201D`,filterTodos:"Show todos",filterAll:"All",filterHuman:"People",doneGroup:o=>`Done (${o})`,noHumanTodos:"Nobody but the agent has a todo.",addedTag:"Added by you",changedTag:"Changed",removeAdded:"Remove this todo you added",noTodos:"There are no todos yet.",newTodo:"New todo",newTodoPlaceholder:"Add a todo for the agent\u2026",newTodoAssignee:"Assignee of the new todo",addTodo:"Add",proposedMark:"Proposed by the agent",reason:"Why",accept:"Accept",decline:"Decline",decisionOf:o=>`Decision on \u201C${o}\u201D`,acceptedTag:"Accepted",declinedTag:"Declined",undoDecision:"Undo",outputs:"Outputs",noOutputs:"Nothing has been produced yet.",copy:o=>`Copy ${o}`,copied:"Copied",log:"Conversation with the agent",logLede:"Newest first",noLog:"Nothing has been exchanged yet.",fromAgent:"Agent",latestTag:"Latest",commentOn:o=>`Comment on ${o}`,todoGroup:"Todo",logGroup:"Log",contextGroup:"Context",proposalGroup:"Proposal",questionGroup:"Question",approved:"Approve the assumption",answered:"Answer",answerCleared:"Clear the reply",accepted:"Accept the proposal",declined:"Decline the proposal",decisionCleared:"Clear the decision",statusChanged:"Change the status",todoAdded:"Add a todo",todoRemoved:"Remove the added todo",quoted:o=>`\u2192 \u201C${o}\u201D`,change:(o,e)=>`${o} \u2192 ${e}`},ja:{wholeBoard:"\u30DC\u30FC\u30C9\u5168\u4F53",statusWorking:"\u4F5C\u696D\u4E2D",statusWaiting:"\u3042\u306A\u305F\u306E\u8FD4\u7B54\u5F85\u3061",statusBlocked:"\u30D6\u30ED\u30C3\u30AF\u4E2D",statusDone:"\u5B8C\u4E86",todoTodo:"\u672A\u7740\u624B",todoDoing:"\u9032\u884C\u4E2D",todoBlocked:"\u30D6\u30ED\u30C3\u30AF",todoDone:"\u5B8C\u4E86",kindAgent:"Agent",kindHuman:"\u4EBA\u9593",updatedAt:o=>`\u66F4\u65B0 ${o}`,context:"\u3053\u306E\u30BF\u30B9\u30AF\u306E\u524D\u63D0",contextWhy:"Why \u2014 \u306A\u305C\u3084\u308B\u304B",contextWhat:"What \u2014 \u4F55\u3092\u3084\u308B\u304B",contextGoals:"\u30B4\u30FC\u30EB",contextNonGoals:"\u3084\u3089\u306A\u3044\u3053\u3068",noContext:"Agent \u306F\u307E\u3060 Why / What \u3092\u66F8\u3044\u3066\u3044\u307E\u305B\u3093\u3002",tabs:"\u30DC\u30FC\u30C9\u306E\u533A\u5206",tabContext:"Context",tabLog:"\u4F5C\u696D\u30ED\u30B0",tabQuestions:"\u8CEA\u554F",openCount:o=>`\u672A\u56DE\u7B54 ${o} \u4EF6`,noQuestions:"\u4ECA Agent \u304B\u3089\u805E\u304D\u305F\u3044\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093\u3002",questions:"Agent \u304B\u3089\u306E\u8CEA\u554F",questionsProgress:(o,e)=>`\u8FD4\u7B54\u6E08\u307F ${o} / ${e}`,blockingGroup:"\u30D6\u30ED\u30C3\u30AB\u30FC \u2014 \u6C7A\u3081\u3066\u3082\u3089\u3046\u307E\u3067\u5148\u306B\u9032\u3081\u306A\u3044",provisionalGroup:"\u4EEE\u306E\u524D\u63D0\u3067\u9032\u884C\u4E2D \u2014 \u9055\u3048\u3070\u65B9\u91DD\u3092\u76F4\u3059",blockingTag:"\u30D6\u30ED\u30C3\u30AB\u30FC",assumption:"\u4EEE\u56DE\u7B54",recommendation:"Agent \u306E\u63A8\u5968",approveAssumption:"\u3053\u306E\u524D\u63D0\u3067 OK",approveRecommendation:"\u63A8\u5968\u3069\u304A\u308A\u3067 OK",answerOther:"\u5225\u306E\u56DE\u7B54\u3092\u3059\u308B",answerOf:o=>`${o} \u3078\u306E\u56DE\u7B54`,answerPlaceholder:"\u671F\u5F85\u3059\u308B\u56DE\u7B54\u3092\u5165\u529B\u2026",blockingPlaceholder:"\u3069\u3046\u3059\u308B\u304B\u3092\u5165\u529B\u2026",approvedTag:"\u627F\u8A8D\u6E08\u307F",answeredTag:"\u56DE\u7B54\u6E08\u307F",todos:"Todo",progress:(o,e)=>`${e} \u4EF6\u4E2D ${o} \u4EF6\u5B8C\u4E86`,noTodosYet:"Todo \u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093",assignee:"\u62C5\u5F53",unassigned:"\u672A\u5272\u308A\u5F53\u3066",memberOption:(o,e)=>`${o}\uFF08${e}\uFF09`,statusOf:o=>`\u300C${o}\u300D\u306E\u72B6\u614B`,filterTodos:"\u8868\u793A\u3059\u308B Todo",filterAll:"\u3059\u3079\u3066",filterHuman:"\u4EBA\u9593\u306E\u62C5\u5F53",doneGroup:o=>`\u5B8C\u4E86 ${o} \u4EF6`,noHumanTodos:"\u4EBA\u9593\u304C\u62C5\u5F53\u3059\u308B Todo \u306F\u3042\u308A\u307E\u305B\u3093\u3002",addedTag:"\u3042\u306A\u305F\u304C\u8FFD\u52A0",changedTag:"\u5909\u66F4\u3042\u308A",removeAdded:"\u8FFD\u52A0\u3057\u305F Todo \u3092\u53D6\u308A\u6D88\u3059",noTodos:"Todo \u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093\u3002",newTodo:"\u65B0\u3057\u3044 Todo",newTodoPlaceholder:"Agent \u306B\u983C\u3080 Todo \u3092\u8FFD\u52A0\u2026",newTodoAssignee:"\u65B0\u3057\u3044 Todo \u306E\u62C5\u5F53",addTodo:"\u8FFD\u52A0",proposedMark:"Agent \u304B\u3089\u306E\u63D0\u6848",reason:"\u306A\u305C",accept:"\u627F\u8A8D",decline:"\u898B\u9001\u308A",decisionOf:o=>`\u300C${o}\u300D\u306E\u5224\u65AD`,acceptedTag:"\u627F\u8A8D\u6E08\u307F",declinedTag:"\u898B\u9001\u308A",undoDecision:"\u53D6\u308A\u6D88\u3059",outputs:"\u6210\u679C\u7269",noOutputs:"\u307E\u3060\u6210\u679C\u7269\u306F\u3042\u308A\u307E\u305B\u3093\u3002",copy:o=>`${o} \u3092\u30B3\u30D4\u30FC`,copied:"\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F",log:"Agent \u3068\u306E\u3084\u308A\u3068\u308A",logLede:"\u65B0\u3057\u3044\u9806",noLog:"\u307E\u3060\u3084\u308A\u3068\u308A\u306F\u3042\u308A\u307E\u305B\u3093\u3002",fromAgent:"Agent",latestTag:"\u6700\u65B0",commentOn:o=>`${o} \u306B\u30B3\u30E1\u30F3\u30C8`,todoGroup:"Todo",logGroup:"\u4F5C\u696D\u30ED\u30B0",contextGroup:"Context",proposalGroup:"\u63D0\u6848",questionGroup:"\u8CEA\u554F",approved:"\u524D\u63D0\u3092\u627F\u8A8D",answered:"\u56DE\u7B54",answerCleared:"\u8FD4\u7B54\u3092\u30AF\u30EA\u30A2",accepted:"\u63D0\u6848\u3092\u627F\u8A8D",declined:"\u63D0\u6848\u3092\u898B\u9001\u308A",decisionCleared:"\u63D0\u6848\u306E\u5224\u65AD\u3092\u30AF\u30EA\u30A2",statusChanged:"\u72B6\u614B\u3092\u5909\u66F4",todoAdded:"Todo \u3092\u8FFD\u52A0",todoRemoved:"\u8FFD\u52A0\u3057\u305F Todo \u3092\u53D6\u308A\u6D88\u3057",quoted:o=>`\u2192 \u300C${o}\u300D`,change:(o,e)=>`${o} \u2192 ${e}`}}),ke=(o,e)=>{switch(e){case"working":return o.statusWorking;case"waiting":return o.statusWaiting;case"blocked":return o.statusBlocked;case"done":return o.statusDone}},C=(o,e)=>{switch(e){case"todo":return o.todoTodo;case"doing":return o.todoDoing;case"blocked":return o.todoBlocked;case"done":return o.todoDone}},lo=(o,e)=>e==="agent"?o.kindAgent:o.kindHuman,L=(o,e)=>{switch(e){case"why":return o.contextWhy;case"what":return o.contextWhat;case"goals":return o.contextGoals;case"nonGoals":return o.contextNonGoals}},xe=48,H=o=>{const e=o.title??o.body??o.id;return e.length<=xe?e:`${e.slice(0,xe-1)}\u2026`},po=(o,e,a)=>a===null?o.unassigned:O(e,a)?.name??a,fe=o=>o.title===""?"Task Context Board":o.title,me=(o,e,a)=>{switch(a.type){case"todo":{const t=k(e,a.id);return`${t?.proposed===!0?o.proposalGroup:o.todoGroup} \xB7 ${t?.title??a.id}`}case"log":{const t=de(e,a.id);return`${o.logGroup} \xB7 ${t===void 0?a.id:H(t)}`}case"context":return`${o.contextGroup} \xB7 ${se(a.id)?L(o,a.id):a.id}`;case"question":{const t=z(e,a.id);return t===void 0?a.id:`${t.ref} \xB7 ${t.title}`}case"page":return o.wholeBoard;default:return a.id}},co=(o,e)=>{switch(e){case"accept":return{title:o.accepted,tone:"update"};case"decline":return{title:o.declined,tone:"update"};case"clear":return{title:o.decisionCleared,tone:"delete"}}},uo=(o,e,a)=>{switch(a.type){case"ANSWER_QUESTION":{const t=S(m.ANSWER_QUESTION,a);if(t.kind==="clear")return{title:o.answerCleared,tone:"delete"};if(t.kind==="approve"){const r=z(e,a.target.id)?.assumption??null;return{title:o.approved,tone:"update",...r===null?{}:{body:o.quoted(r)}}}return{title:o.answered,tone:"update",body:o.quoted(t.text.slice(0,120))}}case"DECIDE_PROPOSAL":return co(o,S(m.DECIDE_PROPOSAL,a).decision);case"SET_TODO_STATUS":{const{status:t}=S(m.SET_TODO_STATUS,a),r=k(e,a.target.id)?.status,d=C(o,t);return{title:o.statusChanged,tone:"update",body:r===void 0?d:o.change(C(o,r),d)}}case"ADD_TODO":{const t=S(m.ADD_TODO,a);return{title:o.todoAdded,tone:"create",targetLabel:`${o.todoGroup} \xB7 ${t.title}`,...t.assignee===null?{}:{body:`${o.assignee}: ${po(o,e,t.assignee)}`}}}case"DELETE_TODO":return{title:o.todoRemoved,tone:"delete"};default:return{title:a.type,tone:"meta"}}},ve=(o,e,a,t)=>{let r;try{r=uo(o,t??a,e)}catch{r={title:e.type,tone:"meta"}}return{title:r.title,targetLabel:r.targetLabel??me(o,a,e.target),tone:r.tone,...r.body===void 0?{}:{summary:r.body}}},we=o=>`${o.type} ${Ke(o.target)} ${JSON.stringify(o.payload)}`,$e=(o,e)=>[...e.questions.map(a=>({value:`question:${a.id}`,label:`${a.ref} \xB7 ${a.title}`,group:o.questionGroup})),...e.todos.map(a=>({value:`todo:${a.id}`,label:a.title,group:a.proposed?o.proposalGroup:o.todoGroup})),...e.log.map(a=>({value:`log:${a.id}`,label:H(a),group:o.logGroup})),...E.filter(a=>N(e,a)).map(a=>({value:`context:${a}`,label:L(o,a),group:o.contextGroup}))],ye=(o,e)=>e,Te=(o,e,a)=>({parts:E.filter(t=>N(e,t)).map(t=>{const r=e.context[t];return{id:t,title:L(o,t),text:typeof r=="string"?r:null,items:typeof r=="string"||r===null?[]:r,comments:a(`context:${t}`)}})}),bo=(o,e,a)=>{const t=o.answers[e.id];return{id:e.id,ref:e.ref,title:e.title,description:e.description,blocking:e.blocking,assumption:e.assumption,reply:t?.kind??"none",resolved:ie(o,e),draft:t?.kind==="answer"?t.text:"",comments:a(`question:${e.id}`)}},Ae=(o,e)=>{const a=o.questions.map(r=>bo(o,r,e)),t=a.filter(r=>r.resolved).length;return{blocking:a.filter(r=>r.blocking),provisional:a.filter(r=>!r.blocking),resolved:t,total:a.length,open:a.length-t,blockingOpen:a.filter(r=>r.blocking&&!r.resolved).length}},go=(o,e,a,t,r)=>{const d=k(a,t.id),l=O(e,t.assignee);return{id:t.id,title:t.title,note:t.note,reason:t.reason,status:t.status,statusLabel:C(o,t.status),assignee:t.assignee,assigneeName:l?.name??null,assigneeKind:l?.kind??null,editable:q(e,t),proposal:t.proposed?e.decisions[t.id]??"pending":null,added:t.added,changed:d!==void 0&&d.status!==t.status,comments:r(`todo:${t.id}`)}},Oe=(o,e,a,t,r="all")=>{const d=e.todos.filter(p=>R(e,p)),l=d.filter(p=>p.status==="done").length,g=e.members.some(p=>p.kind==="human"),x=g?r:"all",F=p=>p.assigneeKind==="human",G=e.todos.map(p=>go(o,e,a,p,t)),j=x==="human"?G.filter(F):G,Y=p=>p.status==="done"&&k(a,p.id)?.status==="done";return{todos:j.filter(p=>!Y(p)),done:j.filter(Y),filter:x,canFilter:g,humanCount:G.filter(F).length,progress:{done:l,total:d.length,label:d.length===0?o.noTodosYet:o.progress(l,d.length)},statuses:D.map(p=>({value:p,label:C(o,p)})),members:e.members.map(p=>({id:p.id,label:o.memberOption(p.name,lo(o,p.kind))}))}},Se=o=>{if(!/^[a-z][a-z\d+.-]*:\/\//i.test(o))return{kind:"path"};try{return{kind:"url",host:new URL(o).host}}catch{return{kind:"path"}}},De=o=>o.outputs.map(e=>({id:e.id,title:e.label??e.href,labelled:e.label!==null,href:e.href,kind:e.kind,description:e.description,place:Se(e.href)})),Ee=(o,e,a)=>({entries:e.log.map((t,r)=>{const d=O(e,t.from);return{id:t.id,author:d===void 0?null:{name:d.name,kind:d.kind},at:t.at,title:t.title,body:t.body,points:t.points,label:H(t),latest:r===e.log.length-1,comments:a(`log:${t.id}`)}}).reverse(),status:e.status===null&&e.updatedAt===null?null:{status:e.status,label:e.status===null?null:ke(o,e.status),updatedAt:e.updatedAt}}),ze=(o,e)=>{switch(e.type){case"todo":return k(o,e.id)!==void 0;case"log":return de(o,e.id)!==void 0;case"context":return se(e.id)&&N(o,e.id);case"question":return z(o,e.id)!==void 0;case"page":return!0;default:return!1}},Ce=o=>{const e=U(o);return{name:"task-board",label:"Task Context Board",parseBase:re,emptyBase:ne,actions:m,apply:he,hasTarget:ze,describe:(a,t,r)=>ve(e,a,t,r),serialize:we,resolveNavigation:ye,commentTargets:a=>$e(e,a),title:fe}},_=(o,e,a,t)=>n`
2
2
  <button
3
3
  class="dpk-icon-btn board-comment"
4
4
  type="button"
5
- data-comment=${e}
6
- aria-label=${o}
7
- title=${o}
8
- @click=${()=>t.comment(e)}
5
+ data-comment=${o}
6
+ aria-label=${e}
7
+ title=${e}
8
+ @click=${()=>t.comment(o)}
9
9
  >
10
- ${Fo()} ${a>0?n`<span class="dpk-icon-badge">${a}</span>`:s}
10
+ ${Fe()} ${a>0?n`<span class="dpk-icon-badge">${a}</span>`:s}
11
11
  </button>
12
- `,M=(e,o,a,t=null)=>n`
12
+ `,M=(o,e,a,t=null)=>n`
13
13
  <header class="board-section-head">
14
- <h2 id=${e}>${o}</h2>
14
+ <h2 id=${o}>${e}</h2>
15
15
  ${a===null?s:n`<span class="board-section-meta">${a}</span>`}
16
16
  </header>
17
17
  ${t===null?s:n`<p class="board-lede">${t}</p>`}
18
- `,he=(e,o,a,t)=>n`
19
- <section class="board-context" aria-label=${e.context}>
20
- ${o.parts.length===0&&!a?n`<p class="board-empty">${e.noContext}</p>`:s}
21
- ${o.parts.length===0?s:n`<div class="board-context-parts">
22
- ${y(o.parts,r=>r.id,r=>ke(e,r,t))}
18
+ `,ho=(o,e,a,t)=>n`
19
+ <section class="board-context" aria-label=${o.context}>
20
+ ${e.parts.length===0&&!a?n`<p class="board-empty">${o.noContext}</p>`:s}
21
+ ${e.parts.length===0?s:n`<div class="board-context-parts">
22
+ ${y(e.parts,r=>r.id,r=>ko(o,r,t))}
23
23
  </div>`}
24
24
  <div class="board-figures"><slot name="main"></slot></div>
25
25
  </section>
26
- `,ke=(e,o,a)=>n`
27
- <article class="board-context-part" data-context=${o.id} aria-labelledby=${`board-context-${o.id}`}>
26
+ `,ko=(o,e,a)=>n`
27
+ <article
28
+ class="board-context-part"
29
+ data-context=${e.id}
30
+ data-dpk-target=${`context:${e.id}`}
31
+ aria-labelledby=${`board-context-${e.id}`}
32
+ >
28
33
  <header class="board-context-head">
29
- <h3 class="board-context-title" id=${`board-context-${o.id}`}>${o.title}</h3>
30
- ${_(`context:${o.id}`,e.commentOn(o.title),o.comments,a)}
34
+ <h3 class="board-context-title" id=${`board-context-${e.id}`}>${e.title}</h3>
35
+ ${_(`context:${e.id}`,o.commentOn(e.title),e.comments,a)}
31
36
  </header>
32
- ${o.text===null?s:n`<p class="board-context-text">${o.text}</p>`}
33
- ${o.items.length===0?s:n`<ul class="board-context-items">
34
- ${o.items.map(t=>n`<li>${t}</li>`)}
37
+ ${e.text===null?s:n`<p class="board-context-text">${e.text}</p>`}
38
+ ${e.items.length===0?s:n`<ul class="board-context-items">
39
+ ${e.items.map(t=>n`<li>${t}</li>`)}
35
40
  </ul>`}
36
41
  </article>
37
- `,xe=(e,o,a)=>o.total===0?s:n`
42
+ `,xo=(o,e,a)=>e.total===0?s:n`
38
43
  <section class="board-section" data-section="questions" aria-labelledby="board-questions">
39
- ${M("board-questions",e.questions,e.questionsProgress(o.resolved,o.total))}
40
- ${_o(e,"blocking",e.blockingGroup,o.blocking,a)}
41
- ${_o(e,"provisional",e.provisionalGroup,o.provisional,a)}
44
+ ${M("board-questions",o.questions,o.questionsProgress(e.resolved,e.total))}
45
+ ${Le(o,"blocking",o.blockingGroup,e.blocking,a)}
46
+ ${Le(o,"provisional",o.provisionalGroup,e.provisional,a)}
42
47
  </section>
43
- `,_o=(e,o,a,t,r)=>t.length===0?s:n`<div class="board-group" data-group=${o}>
48
+ `,Le=(o,e,a,t,r)=>t.length===0?s:n`<div class="board-group" data-group=${e}>
44
49
  <h3 class="board-group-title">${a}</h3>
45
50
  <ol class="board-questions">
46
- ${y(t,d=>d.id,d=>fe(e,d,r))}
51
+ ${y(t,d=>d.id,d=>fo(o,d,r))}
47
52
  </ol>
48
- </div>`,fe=(e,o,a)=>{const t=o.assumption!==null;return n`
53
+ </div>`,fo=(o,e,a)=>{const t=e.assumption!==null;return n`
49
54
  <li
50
55
  class="board-card board-question"
51
- data-question=${o.id}
52
- data-blocking=${String(o.blocking)}
53
- data-reply=${o.reply}
54
- data-resolved=${String(o.resolved)}
56
+ data-question=${e.id}
57
+ data-dpk-target=${`question:${e.id}`}
58
+ data-blocking=${String(e.blocking)}
59
+ data-reply=${e.reply}
60
+ data-resolved=${String(e.resolved)}
55
61
  >
56
62
  <div class="board-card-head">
57
- <span class="board-ref">${o.ref}</span>
58
- <h4 class="board-card-title">${o.title}</h4>
59
- ${o.resolved?n`<span class="board-tag" data-tone="done">
60
- ${o.reply==="approve"?e.approvedTag:e.answeredTag}
63
+ <span class="board-ref">${e.ref}</span>
64
+ <h4 class="board-card-title">${e.title}</h4>
65
+ ${e.resolved?n`<span class="board-tag" data-tone="done">
66
+ ${e.reply==="approve"?o.approvedTag:o.answeredTag}
61
67
  </span>`:s}
62
- ${_(`question:${o.id}`,e.commentOn(o.ref),o.comments,a)}
68
+ ${_(`question:${e.id}`,o.commentOn(e.ref),e.comments,a)}
63
69
  </div>
64
- ${o.description===null?s:n`<p class="board-card-text">${o.description}</p>`}
65
- ${t?me(e,o,a):s}
70
+ ${e.description===null?s:n`<p class="board-card-text">${e.description}</p>`}
71
+ ${t?mo(o,e,a):s}
66
72
  <textarea
67
73
  class="dpk-textarea board-answer"
68
- data-answer-text=${o.id}
74
+ data-answer-text=${e.id}
69
75
  rows="2"
70
- aria-label=${e.answerOf(o.ref)}
71
- placeholder=${t?e.answerPlaceholder:e.blockingPlaceholder}
72
- .value=${o.draft}
73
- ?hidden=${t&&o.reply!=="answer"}
74
- @input=${r=>{const d=r.currentTarget;d instanceof HTMLTextAreaElement&&a.answer(o.id,!t&&d.value===""?{kind:"clear"}:{kind:"answer",text:d.value})}}
76
+ aria-label=${o.answerOf(e.ref)}
77
+ placeholder=${t?o.answerPlaceholder:o.blockingPlaceholder}
78
+ .value=${e.draft}
79
+ ?hidden=${t&&e.reply!=="answer"}
80
+ @input=${r=>{const d=r.currentTarget;d instanceof HTMLTextAreaElement&&a.answer(e.id,!t&&d.value===""?{kind:"clear"}:{kind:"answer",text:d.value})}}
75
81
  ></textarea>
76
82
  </li>
77
- `},me=(e,o,a)=>n`
83
+ `},mo=(o,e,a)=>n`
78
84
  <div class="board-assumption">
79
- <span class="board-assumption-label">${o.blocking?e.recommendation:e.assumption}</span>
80
- <p class="board-assumption-text">${o.assumption}</p>
85
+ <span class="board-assumption-label">${e.blocking?o.recommendation:o.assumption}</span>
86
+ <p class="board-assumption-text">${e.assumption}</p>
81
87
  </div>
82
- <div class="board-reply" role="group" aria-label=${e.answerOf(o.ref)}>
88
+ <div class="board-reply" role="group" aria-label=${o.answerOf(e.ref)}>
83
89
  <button
84
90
  type="button"
85
91
  class="dpk-btn board-approve"
86
- aria-pressed=${o.reply==="approve"?"true":"false"}
87
- @click=${()=>a.answer(o.id,o.reply==="approve"?{kind:"clear"}:{kind:"approve"})}
92
+ aria-pressed=${e.reply==="approve"?"true":"false"}
93
+ @click=${()=>a.answer(e.id,e.reply==="approve"?{kind:"clear"}:{kind:"approve"})}
88
94
  >
89
- ${Z()} ${o.blocking?e.approveRecommendation:e.approveAssumption}
95
+ ${Z()} ${e.blocking?o.approveRecommendation:o.approveAssumption}
90
96
  </button>
91
97
  <button
92
98
  type="button"
93
99
  class="dpk-btn dpk-btn--ghost board-other"
94
- aria-pressed=${o.reply==="answer"?"true":"false"}
95
- @click=${()=>o.reply==="answer"?a.answer(o.id,{kind:"clear"}):a.answerOther(o.id)}
100
+ aria-pressed=${e.reply==="answer"?"true":"false"}
101
+ @click=${()=>e.reply==="answer"?a.answer(e.id,{kind:"clear"}):a.answerOther(e.id)}
96
102
  >
97
- ${e.answerOther}
103
+ ${o.answerOther}
98
104
  </button>
99
105
  </div>
100
- `,ve=(e,o,a,t)=>n`
106
+ `,vo=(o,e,a,t)=>n`
101
107
  <section class="board-section board-rail-section" data-section="outputs" aria-labelledby="board-outputs">
102
- ${M("board-outputs",e.outputs,o.length===0?null:String(o.length))}
103
- ${o.length===0?n`<p class="board-empty">${e.noOutputs}</p>`:n`<ul class="board-outputs">
104
- ${y(o,r=>r.id,r=>$e(e,r,a===r.id,t))}
108
+ ${M("board-outputs",o.outputs,e.length===0?null:String(e.length))}
109
+ ${e.length===0?n`<p class="board-empty">${o.noOutputs}</p>`:n`<ul class="board-outputs">
110
+ ${y(e,r=>r.id,r=>wo(o,r,a===r.id,t))}
105
111
  </ul>`}
106
112
  </section>
107
- `,$e=(e,o,a,t)=>{const r=o.place,d=a?e.copied:e.copy(o.href);return n`
108
- <li class="board-output" data-output=${o.id} data-place=${r.kind}>
113
+ `,wo=(o,e,a,t)=>{const r=e.place,d=a?o.copied:o.copy(e.href);return n`
114
+ <li class="board-output" data-output=${e.id} data-place=${r.kind}>
109
115
  <div class="board-output-body">
110
116
  <div class="board-output-head">
111
- ${o.kind===null?s:n`<span class="board-kind">${o.kind}</span>`}
112
- ${r.kind==="url"?n`<a class="board-output-link" href=${o.href} target="_blank" rel="noopener noreferrer"
113
- >${o.title}</a
114
- >`:o.labelled?n`<span class="board-output-label">${o.title}</span>`:n`<code class="board-output-path">${o.href}</code>`}
117
+ ${e.kind===null?s:n`<span class="board-kind">${e.kind}</span>`}
118
+ ${r.kind==="url"?n`<a class="board-output-link" href=${e.href} target="_blank" rel="noopener noreferrer"
119
+ >${e.title}</a
120
+ >`:e.labelled?n`<span class="board-output-label">${e.title}</span>`:n`<code class="board-output-path">${e.href}</code>`}
115
121
  </div>
116
- ${r.kind==="url"?n`<span class="board-output-sub">${r.host}</span>`:o.labelled?n`<code class="board-output-path board-output-sub">${o.href}</code>`:s}
117
- ${o.description===null?s:n`<p class="board-output-text">${o.description}</p>`}
122
+ ${r.kind==="url"?n`<span class="board-output-sub">${r.host}</span>`:e.labelled?n`<code class="board-output-path board-output-sub">${e.href}</code>`:s}
123
+ ${e.description===null?s:n`<p class="board-output-text">${e.description}</p>`}
118
124
  </div>
119
125
  <button
120
126
  class="dpk-icon-btn board-copy"
@@ -122,147 +128,150 @@ import{ac as Ro,ad as b,ae as i,af as f,ag as c,ah as $,az as h,ao as J,ai as X,
122
128
  data-copied=${String(a)}
123
129
  aria-label=${d}
124
130
  title=${d}
125
- @click=${()=>t.copy(o.id,o.href)}
131
+ @click=${()=>t.copy(e.id,e.href)}
126
132
  >
127
- ${a?Z():Yo()}
133
+ ${a?Z():je()}
128
134
  </button>
129
135
  </li>
130
- `},Go=(e,o)=>n`
136
+ `},_e=(o,e)=>n`
131
137
  <div class="board-log-now">
132
- ${o.status===null?s:n`<span class="board-status" data-status=${o.status}>
133
- <span class="board-status-dot" aria-hidden="true"></span>${o.label}
138
+ ${e.status===null?s:n`<span class="board-status" data-status=${e.status}>
139
+ <span class="board-status-dot" aria-hidden="true"></span>${e.label}
134
140
  </span>`}
135
- ${o.updatedAt===null?s:n`<span class="board-updated">${e.updatedAt(o.updatedAt)}</span>`}
141
+ ${e.updatedAt===null?s:n`<span class="board-updated">${o.updatedAt(e.updatedAt)}</span>`}
136
142
  </div>
137
- `,we=(e,o,a)=>n`
143
+ `,$o=(o,e,a)=>n`
138
144
  <section class="board-section" data-section="log" aria-labelledby="board-log">
139
- ${M("board-log",e.log,o.entries.length===0?null:e.logLede)}
140
- ${o.entries.length===0?n`${o.status===null?s:Go(e,o.status)}
141
- <p class="board-empty">${e.noLog}</p>`:n`<ol class="board-log">
142
- ${y(o.entries,t=>t.id,t=>ye(e,t,t.latest?o.status:null,a))}
145
+ ${M("board-log",o.log,e.entries.length===0?null:o.logLede)}
146
+ ${e.entries.length===0?n`${e.status===null?s:_e(o,e.status)}
147
+ <p class="board-empty">${o.noLog}</p>`:n`<ol class="board-log">
148
+ ${y(e.entries,t=>t.id,t=>yo(o,t,t.latest?e.status:null,a))}
143
149
  </ol>`}
144
150
  </section>
145
- `,ye=(e,o,a,t)=>{const r=o.author?.name??e.fromAgent;return n`
151
+ `,yo=(o,e,a,t)=>{const r=e.author?.name??o.fromAgent;return n`
146
152
  <li
147
153
  class="board-log-entry"
148
- data-log=${o.id}
149
- data-from=${o.author?.kind??"agent"}
150
- data-latest=${String(o.latest)}
154
+ data-log=${e.id}
155
+ data-dpk-target=${`log:${e.id}`}
156
+ data-from=${e.author?.kind??"agent"}
157
+ data-latest=${String(e.latest)}
151
158
  >
152
159
  <span class="board-log-avatar" aria-hidden="true">${r.slice(0,1)}</span>
153
160
  <div class="board-log-body">
154
- ${a===null?s:Go(e,a)}
161
+ ${a===null?s:_e(o,a)}
155
162
  <div class="board-log-head">
156
163
  <span class="board-log-author">${r}</span>
157
- ${o.at===null?s:n`<time class="board-log-at">${o.at}</time>`}
158
- ${o.latest?n`<span class="board-log-latest">${e.latestTag}</span>`:s}
159
- ${_(`log:${o.id}`,e.commentOn(o.label),o.comments,t)}
164
+ ${e.at===null?s:n`<time class="board-log-at">${e.at}</time>`}
165
+ ${e.latest?n`<span class="board-log-latest">${o.latestTag}</span>`:s}
166
+ ${_(`log:${e.id}`,o.commentOn(e.label),e.comments,t)}
160
167
  </div>
161
- ${o.title===null?s:n`<h3 class="board-log-title">${o.title}</h3>`}
162
- ${o.body===null?s:n`<p class="board-log-text">${o.body}</p>`}
163
- ${o.points.length===0?s:n`<ul class="board-log-points">
164
- ${o.points.map(d=>n`<li>${d}</li>`)}
168
+ ${e.title===null?s:n`<h3 class="board-log-title">${e.title}</h3>`}
169
+ ${e.body===null?s:n`<p class="board-log-text">${e.body}</p>`}
170
+ ${e.points.length===0?s:n`<ul class="board-log-points">
171
+ ${e.points.map(d=>n`<li>${d}</li>`)}
165
172
  </ul>`}
166
173
  </div>
167
174
  </li>
168
- `},v=["context","log","questions"],Te=(e,o)=>{const a=v.indexOf(e),t=v.length-1;switch(o){case"ArrowRight":return v[a===t?0:a+1]??null;case"ArrowLeft":return v[a===0?t:a-1]??null;case"Home":return v[0];case"End":return v[t]??null;default:return null}},Ae=(e,o)=>{switch(o){case"context":return e.tabContext;case"log":return e.tabLog;case"questions":return e.tabQuestions}},Oe=(e,o)=>{switch(e){case"context":return null;case"log":return o.log;case"questions":return o.questions}},Se=(e,o,a,t,r)=>n`
169
- <div class="board-tabs" role="tablist" aria-label=${e.tabs}>
170
- ${v.map(d=>{const l=Oe(d,a);return n`<button
175
+ `},v=["context","log","questions"],To=(o,e)=>{const a=v.indexOf(o),t=v.length-1;switch(e){case"ArrowRight":return v[a===t?0:a+1]??null;case"ArrowLeft":return v[a===0?t:a-1]??null;case"Home":return v[0];case"End":return v[t]??null;default:return null}},Ao=(o,e)=>{switch(e){case"context":return o.tabContext;case"log":return o.tabLog;case"questions":return o.tabQuestions}},Oo=(o,e)=>{switch(o){case"context":return null;case"log":return e.log;case"questions":return e.questions}},So=(o,e,a,t,r)=>n`
176
+ <div class="board-tabs" role="tablist" aria-label=${o.tabs}>
177
+ ${v.map(d=>{const l=Oo(d,a);return n`<button
171
178
  type="button"
172
179
  role="tab"
173
180
  id=${`board-tab-${d}`}
174
181
  data-tab=${d}
175
182
  data-alert=${d==="questions"?String(a.alert):s}
176
183
  aria-controls=${`board-panel-${d}`}
177
- aria-selected=${String(o===d)}
178
- tabindex=${o===d?0:-1}
179
- title=${d==="questions"&&a.questions>0?e.openCount(a.questions):s}
184
+ aria-selected=${String(e===d)}
185
+ tabindex=${e===d?0:-1}
186
+ title=${d==="questions"&&a.questions>0?o.openCount(a.questions):s}
180
187
  @click=${()=>t(d)}
181
188
  @keydown=${r}
182
189
  >
183
- ${Ae(e,d)}${l===null||l===0?s:n`<span class="board-tab-count">${l}</span>`}
190
+ <span class="board-tab-label">${Ao(o,d)}</span
191
+ >${l===null||l===0?s:n`<span class="board-tab-count">${l}</span>`}
184
192
  </button>`})}
185
193
  </div>
186
- `,K=(e,o,a)=>n`
194
+ `,K=(o,e,a)=>n`
187
195
  <div
188
196
  class="board-panel"
189
- id=${`board-panel-${e}`}
197
+ id=${`board-panel-${o}`}
190
198
  role="tabpanel"
191
- aria-labelledby=${`board-tab-${e}`}
192
- ?hidden=${o!==e}
199
+ aria-labelledby=${`board-tab-${o}`}
200
+ ?hidden=${e!==o}
193
201
  >
194
202
  ${a}
195
203
  </div>
196
- `,Bo="",De=(e,o)=>o.statuses.some(a=>a.value===e),Ee=(e,o,a)=>n`
204
+ `,Ge="",Do=(o,e)=>e.statuses.some(a=>a.value===o),Eo=(o,e,a)=>n`
197
205
  <section class="board-section board-rail-section" data-section="todos" aria-labelledby="board-todos">
198
206
  <header class="board-section-head">
199
- <h2 id="board-todos">${e.todos}</h2>
200
- <span class="board-section-meta">${o.progress.label}</span>
207
+ <h2 id="board-todos">${o.todos}</h2>
208
+ <span class="board-section-meta">${e.progress.label}</span>
201
209
  </header>
202
- ${o.progress.total===0?s:n`<div
210
+ ${e.progress.total===0?s:n`<div
203
211
  class="board-progress"
204
212
  role="progressbar"
205
- aria-label=${o.progress.label}
213
+ aria-label=${e.progress.label}
206
214
  aria-valuemin="0"
207
- aria-valuemax=${o.progress.total}
208
- aria-valuenow=${o.progress.done}
215
+ aria-valuemax=${e.progress.total}
216
+ aria-valuenow=${e.progress.done}
209
217
  >
210
- <span class="board-progress-fill" style=${`width: ${o.progress.done/o.progress.total*100}%`}></span>
218
+ <span class="board-progress-fill" style=${`width: ${e.progress.done/e.progress.total*100}%`}></span>
211
219
  </div>`}
212
- ${o.canFilter?ze(e,o,a):s}
213
- ${o.todos.length===0&&o.done.length===0?n`<p class="board-empty">${o.filter==="human"?e.noHumanTodos:e.noTodos}</p>`:s}
214
- ${o.done.length===0?s:n`<details class="board-done">
220
+ ${e.canFilter?zo(o,e,a):s}
221
+ ${e.todos.length===0&&e.done.length===0?n`<p class="board-empty">${e.filter==="human"?o.noHumanTodos:o.noTodos}</p>`:s}
222
+ ${e.done.length===0?s:n`<details class="board-done">
215
223
  <summary class="board-done-summary">
216
- <span class="board-done-chevron" aria-hidden="true"></span>${e.doneGroup(o.done.length)}
224
+ <span class="board-done-chevron" aria-hidden="true"></span>${o.doneGroup(e.done.length)}
217
225
  </summary>
218
- ${Po(e,o,o.done,a)}
226
+ ${Be(o,e,e.done,a)}
219
227
  </details>`}
220
- ${o.todos.length===0?s:Po(e,o,o.todos,a)} ${Pe(e,o,a)}
228
+ ${e.todos.length===0?s:Be(o,e,e.todos,a)} ${Po(o,e,a)}
221
229
  </section>
222
- `,Po=(e,o,a,t)=>n`
230
+ `,Be=(o,e,a,t)=>n`
223
231
  <ul class="board-todos">
224
- ${y(a,r=>r.id,r=>_e(e,o,r,t))}
232
+ ${y(a,r=>r.id,r=>_o(o,e,r,t))}
225
233
  </ul>
226
- `,ze=(e,o,a)=>{const t=(r,d,l)=>n`
234
+ `,zo=(o,e,a)=>{const t=(r,d,l)=>n`
227
235
  <button
228
236
  type="button"
229
237
  class="board-filter-option"
230
238
  data-filter=${r}
231
- aria-pressed=${o.filter===r?"true":"false"}
239
+ aria-pressed=${e.filter===r?"true":"false"}
232
240
  @click=${()=>a.filterTodos(r)}
233
241
  >
234
242
  ${d}${l===null?s:n`<span class="board-filter-count">${l}</span>`}
235
243
  </button>
236
- `;return n`<div class="board-filter" role="group" aria-label=${e.filterTodos}>
237
- ${t("all",e.filterAll,null)} ${t("human",e.filterHuman,o.humanCount)}
238
- </div>`},Ce=(e,o)=>o.proposal==="pending"||o.proposal==="decline"?n`<span
244
+ `;return n`<div class="board-filter" role="group" aria-label=${o.filterTodos}>
245
+ ${t("all",o.filterAll,null)} ${t("human",o.filterHuman,e.humanCount)}
246
+ </div>`},Co=(o,e)=>e.proposal==="pending"||e.proposal==="decline"?n`<span
239
247
  class="board-todo-mark board-todo-mark--proposal"
240
248
  role="img"
241
- aria-label=${e.proposedMark}
242
- title=${e.proposedMark}
249
+ aria-label=${o.proposedMark}
250
+ title=${o.proposedMark}
243
251
  >?</span
244
- >`:n`<span class="board-todo-mark" data-status=${o.status} aria-hidden="true"></span>`,Le=(e,o)=>n`
245
- ${o.proposal==="accept"?n`<span class="board-tag" data-tone="done">${e.acceptedTag}</span>`:s}
246
- ${o.proposal==="decline"?n`<span class="board-tag" data-tone="muted">${e.declinedTag}</span>`:s}
247
- ${o.added?n`<span class="board-tag" data-tone="new">${e.addedTag}</span>`:s}
248
- ${o.changed?n`<span class="board-tag" data-tone="changed">${e.changedTag}</span>`:s}
249
- `,_e=(e,o,a,t)=>n`
252
+ >`:n`<span class="board-todo-mark" data-status=${e.status} aria-hidden="true"></span>`,Lo=(o,e)=>n`
253
+ ${e.proposal==="accept"?n`<span class="board-tag" data-tone="done">${o.acceptedTag}</span>`:s}
254
+ ${e.proposal==="decline"?n`<span class="board-tag" data-tone="muted">${o.declinedTag}</span>`:s}
255
+ ${e.added?n`<span class="board-tag" data-tone="new">${o.addedTag}</span>`:s}
256
+ ${e.changed?n`<span class="board-tag" data-tone="changed">${o.changedTag}</span>`:s}
257
+ `,_o=(o,e,a,t)=>n`
250
258
  <li
251
259
  class="board-todo"
252
260
  data-todo=${a.id}
261
+ data-dpk-target=${`todo:${a.id}`}
253
262
  data-status=${a.status}
254
263
  data-proposal=${a.proposal??"none"}
255
264
  data-added=${String(a.added)}
256
265
  data-changed=${String(a.changed)}
257
266
  >
258
- ${Ce(e,a)}
267
+ ${Co(o,a)}
259
268
  <div class="board-todo-body">
260
- <div class="board-todo-title"><span class="board-todo-text">${a.title}</span>${Le(e,a)}</div>
269
+ <div class="board-todo-title"><span class="board-todo-text">${a.title}</span>${Lo(o,a)}</div>
261
270
  ${a.note===null?s:n`<p class="board-todo-note">${a.note}</p>`}
262
- ${a.reason===null||a.proposal==="accept"?s:n`<p class="board-reason"><span class="board-reason-label">${e.reason}</span>${a.reason}</p>`}
271
+ ${a.reason===null||a.proposal==="accept"?s:n`<p class="board-reason"><span class="board-reason-label">${o.reason}</span>${a.reason}</p>`}
263
272
  <div class="board-todo-controls">
264
- ${a.proposal==="pending"?Ge(e,a,t):a.proposal==="decline"?s:Be(e,o,a,t)}
265
- ${a.assigneeName===null?s:n`<span class="board-assignee" data-kind=${a.assigneeKind??"agent"} title=${e.assignee}
273
+ ${a.proposal==="pending"?Go(o,a,t):a.proposal==="decline"?s:Bo(o,e,a,t)}
274
+ ${a.assigneeName===null?s:n`<span class="board-assignee" data-kind=${a.assigneeKind??"agent"} title=${o.assignee}
266
275
  >${a.assigneeName}</span
267
276
  >`}
268
277
  ${a.proposal==="accept"||a.proposal==="decline"?n`<button
@@ -270,69 +279,69 @@ import{ac as Ro,ad as b,ae as i,af as f,ag as c,ah as $,az as h,ao as J,ai as X,
270
279
  class="dpk-btn dpk-btn--ghost board-undo"
271
280
  @click=${()=>t.decide(a.id,"clear")}
272
281
  >
273
- ${e.undoDecision}
282
+ ${o.undoDecision}
274
283
  </button>`:s}
275
- ${_(`todo:${a.id}`,e.commentOn(a.title),a.comments,t)}
284
+ ${_(`todo:${a.id}`,o.commentOn(a.title),a.comments,t)}
276
285
  ${a.added?n`<button
277
286
  class="dpk-icon-btn board-todo-remove"
278
287
  type="button"
279
- aria-label=${e.removeAdded}
280
- title=${e.removeAdded}
288
+ aria-label=${o.removeAdded}
289
+ title=${o.removeAdded}
281
290
  @click=${()=>t.deleteTodo(a.id)}
282
291
  >
283
- ${Jo()}
292
+ ${Ye()}
284
293
  </button>`:s}
285
294
  </div>
286
295
  </div>
287
296
  </li>
288
- `,Ge=(e,o,a)=>n`
289
- <div class="board-decision" role="group" aria-label=${e.decisionOf(o.title)}>
297
+ `,Go=(o,e,a)=>n`
298
+ <div class="board-decision" role="group" aria-label=${o.decisionOf(e.title)}>
290
299
  <button
291
300
  type="button"
292
301
  class="dpk-btn board-decide"
293
302
  data-decision="accept"
294
- @click=${()=>a.decide(o.id,"accept")}
303
+ @click=${()=>a.decide(e.id,"accept")}
295
304
  >
296
- ${e.accept}
305
+ ${o.accept}
297
306
  </button>
298
307
  <button
299
308
  type="button"
300
309
  class="dpk-btn dpk-btn--ghost board-decide"
301
310
  data-decision="decline"
302
- @click=${()=>a.decide(o.id,"decline")}
311
+ @click=${()=>a.decide(e.id,"decline")}
303
312
  >
304
- ${e.decline}
313
+ ${o.decline}
305
314
  </button>
306
315
  </div>
307
- `,Be=(e,o,a,t)=>a.editable?n`<select
316
+ `,Bo=(o,e,a,t)=>a.editable?n`<select
308
317
  class="dpk-select board-todo-status"
309
318
  data-status=${a.status}
310
- aria-label=${e.statusOf(a.title)}
311
- @change=${Xo(r=>{De(r,o)&&r!==a.status&&t.setStatus(a.id,r)})}
319
+ aria-label=${o.statusOf(a.title)}
320
+ @change=${Xe(r=>{Do(r,e)&&r!==a.status&&t.setStatus(a.id,r)})}
312
321
  >
313
- ${o.statuses.map(r=>n`<option value=${r.value} ?selected=${r.value===a.status}>${r.label}</option>`)}
314
- </select>`:n`<span class="board-todo-state" data-status=${a.status}>${a.statusLabel}</span>`,Pe=(e,o,a)=>n`
322
+ ${e.statuses.map(r=>n`<option value=${r.value} ?selected=${r.value===a.status}>${r.label}</option>`)}
323
+ </select>`:n`<span class="board-todo-state" data-status=${a.status}>${a.statusLabel}</span>`,Po=(o,e,a)=>n`
315
324
  <form
316
325
  class="board-add-todo"
317
- @submit=${t=>{t.preventDefault();const r=P(t.currentTarget,HTMLFormElement);if(r===null)return;const d=P(r.elements.namedItem("title"),HTMLInputElement),l=P(r.elements.namedItem("assignee"),HTMLSelectElement),g=d?.value.trim()??"";d===null||g===""||(a.addTodo(g,l===null||l.value===Bo?null:l.value),d.value="")}}
326
+ @submit=${t=>{t.preventDefault();const r=P(t.currentTarget,HTMLFormElement);if(r===null)return;const d=P(r.elements.namedItem("title"),HTMLInputElement),l=P(r.elements.namedItem("assignee"),HTMLSelectElement),g=d?.value.trim()??"";d===null||g===""||(a.addTodo(g,l===null||l.value===Ge?null:l.value),d.value="")}}
318
327
  >
319
328
  <input
320
329
  class="dpk-input board-add-title"
321
330
  name="title"
322
331
  type="text"
323
332
  autocomplete="off"
324
- aria-label=${e.newTodo}
325
- placeholder=${e.newTodoPlaceholder}
333
+ aria-label=${o.newTodo}
334
+ placeholder=${o.newTodoPlaceholder}
326
335
  />
327
336
  <div class="board-add-row">
328
- ${o.members.length===0?s:n`<select class="dpk-select board-add-assignee" name="assignee" aria-label=${e.newTodoAssignee}>
329
- <option value=${Bo}>${e.unassigned}</option>
330
- ${o.members.map(t=>n`<option value=${t.id}>${t.label}</option>`)}
337
+ ${e.members.length===0?s:n`<select class="dpk-select board-add-assignee" name="assignee" aria-label=${o.newTodoAssignee}>
338
+ <option value=${Ge}>${o.unassigned}</option>
339
+ ${e.members.map(t=>n`<option value=${t.id}>${t.label}</option>`)}
331
340
  </select>`}
332
- <button class="dpk-btn board-add-submit" type="submit">${e.addTodo}</button>
341
+ <button class="dpk-btn board-add-submit" type="submit">${o.addTodo}</button>
333
342
  </div>
334
343
  </form>
335
- `,We=Vo`
344
+ `,Wo=Je`
336
345
  /* The shell's sidebar is a right-hand rail (see \`sidebarLayout\`). */
337
346
  .dpk-sidebar {
338
347
  padding: 10px 14px 20px;
@@ -391,6 +400,11 @@ import{ac as Ro,ad as b,ae as i,af as f,ag as c,ah as $,az as h,ao as J,ai as X,
391
400
  border-top: 1px solid var(--dpk-rule);
392
401
  }
393
402
 
403
+ /* Stacked, the rail is what ends the page: it clears the hand-off dock, not the board above it. */
404
+ .dpk-main-body {
405
+ padding-bottom: 24px;
406
+ }
407
+
394
408
  /* Stacked, the rail takes the full width: there is no edge to drag or
395
409
  fold on. A rail folded on a wider screen is a bar to unfold it. */
396
410
  .dpk-sidebar-resizer,
@@ -541,7 +555,22 @@ import{ac as Ro,ad as b,ae as i,af as f,ag as c,ah as $,az as h,ao as J,ai as X,
541
555
  box-shadow: var(--dpk-bevel), var(--dpk-shadow-xs);
542
556
  }
543
557
 
558
+ @media (max-width: 400px) {
559
+ .board-tabs [role='tab'] {
560
+ gap: 5px;
561
+ padding-inline: 6px;
562
+ }
563
+ }
564
+
565
+ /* Too narrow for every label whole, a label gives way before its count does. */
566
+ .board-tab-label {
567
+ min-width: 0;
568
+ overflow: hidden;
569
+ text-overflow: ellipsis;
570
+ }
571
+
544
572
  .board-tab-count {
573
+ flex: none;
545
574
  min-width: 18px;
546
575
  padding: 0 6px;
547
576
  border-radius: 999px;
@@ -976,6 +1005,7 @@ import{ac as Ro,ad as b,ae as i,af as f,ag as c,ah as $,az as h,ao as J,ai as X,
976
1005
 
977
1006
  .board-todos {
978
1007
  display: grid;
1008
+ grid-template-columns: minmax(0, 1fr);
979
1009
  margin: 0;
980
1010
  padding: 0;
981
1011
  list-style: none;
@@ -1063,6 +1093,7 @@ import{ac as Ro,ad as b,ae as i,af as f,ag as c,ah as $,az as h,ao as J,ai as X,
1063
1093
  display: grid;
1064
1094
  gap: 4px;
1065
1095
  min-width: 0;
1096
+ overflow-wrap: anywhere;
1066
1097
  }
1067
1098
 
1068
1099
  .board-todo-title {
@@ -1591,18 +1622,18 @@ import{ac as Ro,ad as b,ae as i,af as f,ag as c,ah as $,az as h,ao as J,ai as X,
1591
1622
  animation: none;
1592
1623
  }
1593
1624
  }
1594
- `,Ne=1500;class Wo extends oo{static{this.styles=[oo.styles,We]}static{this.properties={tab:{state:!0},todoFilter:{state:!0}}}#o=null;#e=null;#a;constructor(){super(),this.tab="context",this.todoFilter="all"}get sidebarLayout(){return{side:"right",defaultWidth:360}}definitionFor(o){return Lo(o)}disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this.#a)}renderRegions(o){const a=U(this.locale),t=x=>o.commentCount(x),r=Oo(o.state,t),d=zo(a,o.state,t),l=this.#d(),g=this.tab;return{header:this.#r(a,o.state),sidebar:n`
1625
+ `,No=1500;class Pe extends ee{static{this.styles=[ee.styles,Wo]}static{this.properties={tab:{state:!0},todoFilter:{state:!0}}}#e=null;#o=null;#a;constructor(){super(),this.tab="context",this.todoFilter="all"}get sidebarLayout(){return{side:"right",defaultWidth:360,narrow:"stack"}}definitionFor(e){return Ce(e)}showTarget(e){switch(e.type){case"context":case"log":this.tab=e.type;return;case"question":this.tab="questions";return;case"todo":this.todoFilter="all";return}}disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this.#a)}renderRegions(e){const a=U(this.locale),t=x=>e.commentCount(x),r=Ae(e.state,t),d=Ee(a,e.state,t),l=this.#d(),g=this.tab;return{header:this.#r(a,e.state),sidebar:n`
1595
1626
  <div class="board-rail">
1596
- ${ve(a,Eo(o.state),this.#e,l)}
1597
- ${Ee(a,So(a,o.state,o.base,t,this.todoFilter),l)}
1627
+ ${vo(a,De(e.state),this.#o,l)}
1628
+ ${Eo(a,Oe(a,e.state,e.base,t,this.todoFilter),l)}
1598
1629
  </div>
1599
1630
  `,main:n`
1600
1631
  <div class="board">
1601
- ${Se(a,g,{log:d.entries.length,questions:r.open,alert:r.blockingOpen>0},x=>{this.tab=x},x=>this.#t(x))}
1602
- ${K("context",g,he(a,Ao(a,o.state,t),this.#n(),l))}
1603
- ${K("log",g,we(a,d,l))}
1604
- ${K("questions",g,r.total===0?n`<p class="board-empty">${a.noQuestions}</p>`:xe(a,r,l))}
1632
+ ${So(a,g,{log:d.entries.length,questions:r.open,alert:r.blockingOpen>0},x=>{this.tab=x},x=>this.#t(x))}
1633
+ ${K("context",g,ho(a,Te(a,e.state,t),this.#n(),l))}
1634
+ ${K("log",g,$o(a,d,l))}
1635
+ ${K("questions",g,r.total===0?n`<p class="board-empty">${a.noQuestions}</p>`:xo(a,r,l))}
1605
1636
  </div>
1606
- `}}updated(){super.updated();const o=this.#o;o!==null&&(this.#o=null,this.renderRoot.querySelector(`[data-answer-text="${o}"]`)?.focus())}#t(o){const a=Te(this.tab,o.key);a!==null&&(o.preventDefault(),this.tab=a,this.updateComplete.then(()=>this.renderRoot.querySelector(`[data-tab="${a}"]`)?.focus()))}#r(o,a){return a.status===null?s:n`<span class="board-status board-status--header" data-status=${a.status}>
1607
- <span class="board-status-dot" aria-hidden="true"></span>${xo(o,a.status)}
1608
- </span>`}#n(){return this.querySelector(':scope > [slot="main"]')!==null}#d(){return{answer:(o,a)=>this.#s(o,a),answerOther:o=>this.#i(o),decide:(o,a)=>this.dispatch(uo(o,a)),setStatus:(o,a)=>this.dispatch(bo(o,a)),filterTodos:o=>{this.todoFilter=o},addTodo:(o,a)=>this.#l(o,a),deleteTodo:o=>this.dispatch(ho(o)),copy:(o,a)=>{this.#p(o,a)},comment:o=>this.requestComment(o)}}#s(o,a){this.dispatch(Q(o,a))}#i(o){this.dispatch(Q(o,{kind:"answer",text:""})).ok&&(this.#o=o)}#l(o,a){const{base:t,state:r}=this.derivation,d=[...t.todos,...r.todos].map(l=>l.id);this.dispatch(go(Zo(o,d),o,a))}async#p(o,a){await oe(a)&&(clearTimeout(this.#a),this.#e=o,this.requestUpdate(),this.#a=setTimeout(()=>{this.#e=null,this.requestUpdate()},Ne))}}const No=()=>{customElements.get("dpk-template-task-board")||customElements.define("dpk-template-task-board",Wo)},Re=Object.freeze(Object.defineProperty({__proto__:null,CONTEXT_PARTS:E,DpkTemplateTaskBoard:Wo,MEMBER_KINDS:ao,TASK_BOARD_PAGE:co,TASK_STATUSES:eo,TODO_STATUSES:D,addTodo:go,answerQuestion:Q,applyTaskBoardAction:ko,contextPartTitle:L,decideProposal:uo,defineTaskBoardElement:No,deleteTodo:ho,describeTaskBoardAction:$o,emptyTaskBoardBase:no,isAnswered:lo,isHumanTodo:q,isPlanned:R,outputLocation:Do,parseTaskBoardBase:ro,presentContext:Ao,presentLog:zo,presentOutputs:Eo,presentQuestions:Oo,presentTodos:So,resolveTaskBoardNavigation:To,serializeTaskBoardAction:wo,setTodoStatus:bo,taskBoardActions:m,taskBoardBaseSchema:to,taskBoardCommentTargets:yo,taskBoardDefinitionFor:Lo,taskBoardHasTarget:Co,taskBoardMessages:U,taskBoardTargetLabel:vo,taskBoardTitle:mo},Symbol.toStringTag,{value:"Module"}));export{No as d,Re as i};
1637
+ `}}updated(){super.updated();const e=this.#e;e!==null&&(this.#e=null,this.renderRoot.querySelector(`[data-answer-text="${e}"]`)?.focus())}#t(e){const a=To(this.tab,e.key);a!==null&&(e.preventDefault(),this.tab=a,this.updateComplete.then(()=>this.renderRoot.querySelector(`[data-tab="${a}"]`)?.focus()))}#r(e,a){return a.status===null?s:n`<span class="board-status board-status--header" data-status=${a.status}>
1638
+ <span class="board-status-dot" aria-hidden="true"></span>${ke(e,a.status)}
1639
+ </span>`}#n(){return this.querySelector(':scope > [slot="main"]')!==null}#d(){return{answer:(e,a)=>this.#s(e,a),answerOther:e=>this.#i(e),decide:(e,a)=>this.dispatch(ce(e,a)),setStatus:(e,a)=>this.dispatch(ue(e,a)),filterTodos:e=>{this.todoFilter=e},addTodo:(e,a)=>this.#l(e,a),deleteTodo:e=>this.dispatch(ge(e)),copy:(e,a)=>{this.#p(e,a)},comment:e=>this.requestComment(e)}}#s(e,a){this.dispatch(Q(e,a))}#i(e){this.dispatch(Q(e,{kind:"answer",text:""})).ok&&(this.#e=e)}#l(e,a){const{base:t,state:r}=this.derivation,d=[...t.todos,...r.todos].map(l=>l.id);this.dispatch(be(Ve(e,d),e,a))}async#p(e,a){await Ze(a)&&(clearTimeout(this.#a),this.#o=e,this.requestUpdate(),this.#a=setTimeout(()=>{this.#o=null,this.requestUpdate()},No))}}const We=()=>{customElements.get("dpk-template-task-board")||customElements.define("dpk-template-task-board",Pe)},Ro=Object.freeze(Object.defineProperty({__proto__:null,CONTEXT_PARTS:E,DpkTemplateTaskBoard:Pe,MEMBER_KINDS:ae,TASK_BOARD_PAGE:pe,TASK_STATUSES:oe,TODO_STATUSES:D,addTodo:be,answerQuestion:Q,applyTaskBoardAction:he,contextPartTitle:L,decideProposal:ce,defineTaskBoardElement:We,deleteTodo:ge,describeTaskBoardAction:ve,emptyTaskBoardBase:ne,isAnswered:ie,isHumanTodo:q,isPlanned:R,outputLocation:Se,parseTaskBoardBase:re,presentContext:Te,presentLog:Ee,presentOutputs:De,presentQuestions:Ae,presentTodos:Oe,resolveTaskBoardNavigation:ye,serializeTaskBoardAction:we,setTodoStatus:ue,taskBoardActions:m,taskBoardBaseSchema:te,taskBoardCommentTargets:$e,taskBoardDefinitionFor:Ce,taskBoardHasTarget:ze,taskBoardMessages:U,taskBoardTargetLabel:me,taskBoardTitle:fe},Symbol.toStringTag,{value:"Module"}));export{We as d,Ro as i};