@shivaedev/work-board 0.10.0 → 0.11.0
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 +13 -0
- package/README.md +20 -0
- package/assets/native.js +1 -1
- package/dist/board.d.ts.map +1 -1
- package/dist/board.js +6 -0
- package/dist/board.js.map +1 -1
- package/dist/page/metadata.d.ts.map +1 -1
- package/dist/page/metadata.js +7 -4
- package/dist/page/metadata.js.map +1 -1
- package/dist/page/navigationScript.js +1 -1
- package/dist/page/shell.d.ts +1 -1
- package/dist/page/shell.d.ts.map +1 -1
- package/dist/page/shell.js.map +1 -1
- package/dist/page/startTemplates.d.ts +20 -0
- package/dist/page/startTemplates.d.ts.map +1 -1
- package/dist/page/startTemplates.js +20 -0
- package/dist/page/startTemplates.js.map +1 -1
- package/dist/page/style.d.ts.map +1 -1
- package/dist/page/style.js +6 -5
- package/dist/page/style.js.map +1 -1
- package/dist/results/criteria.d.ts +3 -0
- package/dist/results/criteria.d.ts.map +1 -0
- package/dist/results/criteria.js +34 -0
- package/dist/results/criteria.js.map +1 -0
- package/dist/results/feedback.d.ts +7 -0
- package/dist/results/feedback.d.ts.map +1 -0
- package/dist/results/feedback.js +32 -0
- package/dist/results/feedback.js.map +1 -0
- package/dist/results/page.d.ts +7 -0
- package/dist/results/page.d.ts.map +1 -0
- package/dist/results/page.js +40 -0
- package/dist/results/page.js.map +1 -0
- package/dist/rpc/contract.d.ts.map +1 -1
- package/dist/rpc/contract.js +1 -1
- package/dist/rpc/contract.js.map +1 -1
- package/dist/serve-cli.js +1 -1
- package/package.json +1 -1
- package/src/board.ts +6 -0
- package/src/page/metadata.ts +8 -4
- package/src/page/navigationScript.ts +1 -1
- package/src/page/shell.ts +1 -1
- package/src/page/startTemplates.ts +20 -0
- package/src/page/style.ts +6 -5
- package/src/results/criteria.ts +37 -0
- package/src/results/feedback.ts +44 -0
- package/src/results/page.ts +58 -0
- package/src/rpc/contract.ts +3 -1
- package/src/serve-cli.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -13,6 +13,19 @@
|
|
|
13
13
|
and delivery scope. Keep onboarding/report templates and linked in-app review.
|
|
14
14
|
- Record the approved Platform-first live client direction and its actual shared HTTP/browser fixture evidence; Work Board adopts that foundation in 0.5.0 below.
|
|
15
15
|
|
|
16
|
+
## 0.11.0 - 2026-10-06
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- Returned-result review combines explicitly linked work/criteria, reported status,
|
|
21
|
+
evidence and limitations with version-pinned human feedback. Request revision or
|
|
22
|
+
accept an exact report using existing attention/question directives and immutable
|
|
23
|
+
responses; no new source schema or writer.
|
|
24
|
+
- Native navigation/live review, safe Markdown/Mermaid context and no-JavaScript
|
|
25
|
+
reading. Changed or moved reports qualify earlier feedback; missing evidence and
|
|
26
|
+
ambiguous history remain explicit. Recorded Git revisions are not compared with
|
|
27
|
+
the checkout and authored choices do not establish verified criteria.
|
|
28
|
+
|
|
16
29
|
## 0.10.0 - 2026-10-06
|
|
17
30
|
|
|
18
31
|
### Added
|
package/README.md
CHANGED
|
@@ -65,6 +65,26 @@ preference says otherwise. A keyboard skip link moves directly to the content.
|
|
|
65
65
|
| `--responses` | `false` | Explicitly enable local question/response/handoff writes. The first writer requires Linux, a real workspace directory, `/proc/self/fd`, hard links and directory synchronization. Reading remains available on other supported Node platforms. |
|
|
66
66
|
| `--home` | none | The file shown at `/` as a board, relative to the folder. The command stops with an error unless it leads to one of the markdown files listed from the folder. Without it, `/` shows the first file as a document. |
|
|
67
67
|
|
|
68
|
+
### Reviewing a returned result
|
|
69
|
+
|
|
70
|
+
A file with `kind: result` and a unique stable ID offers **Review returned result**.
|
|
71
|
+
The review page keeps its supplied result status separate from explicitly linked
|
|
72
|
+
work status, lists this report's criterion-level claims and missing provenance,
|
|
73
|
+
and shows the report, limitations and recorded human feedback together. The same
|
|
74
|
+
page is available through a normal GET link without JavaScript.
|
|
75
|
+
|
|
76
|
+
The agent declares an open attention request of kind `review` and can provide a
|
|
77
|
+
rich Markdown question packet with choices such as request revision or accept
|
|
78
|
+
this exact report. The human uses the existing response surface, previews and
|
|
79
|
+
submits together. Choices and rationale are durable authored feedback pinned to
|
|
80
|
+
that report's exact source SHA-256/path. Changed or moved reports qualify earlier
|
|
81
|
+
feedback; malformed or duplicate records leave history unknown. Feedback does
|
|
82
|
+
not automatically change work status or make missing criterion evidence pass.
|
|
83
|
+
|
|
84
|
+
`evidence.checked_revision` remains a reported Git revision. This local reader
|
|
85
|
+
does not compare it with the current checkout, so evidence freshness is unknown.
|
|
86
|
+
See the [ordinary-file walkthrough](https://github.com/ShivaeDev/platform/blob/main/packages/work-board/docs/vision/delivery/result-review-examples.md).
|
|
87
|
+
|
|
68
88
|
## Hand a task to an existing agent session
|
|
69
89
|
|
|
70
90
|
Open a uniquely identified project item and choose **Prepare an agent handoff**.
|
package/assets/native.js
CHANGED
|
@@ -33,7 +33,7 @@ ${t}}`),r},mg="~effect/Fiber",O4={_A:q,_E:q},_4={id:0},ta=()=>globalThis[hf],hg=
|
|
|
33
33
|
`,i)}return r=r.slice(i),Fb(r.length,t)&&o(t),c},encode:s=>{if(Array.isArray(s)){if(s.length===0)return;let i="";for(let a=0;a<s.length;a++)i+=JSON.stringify(s[a])+`
|
|
34
34
|
`;return i}return JSON.stringify(s)+`
|
|
35
35
|
`}}}})},kz=Ub(),Cz=e=>En.of({contentType:e?.contentType??"application/json",includesFraming:!1,codecFor:ph,makeUnsafe:()=>{let t=new TextDecoder,n=new Map;return{decode:r=>{let o=JSON.parse(typeof r=="string"?r:t.decode(r));return Rz(o,n)},encode:r=>{let o=Oz(r,n);return o&&JSON.stringify(o)}}}}),Az=e=>En.of({contentType:e?.contentType??"application/json-rpc",includesFraming:!0,codecFor:ph,makeUnsafe:()=>{let t=Ub({maxBufferSize:e?.maxBufferSize}).makeUnsafe(),n=new Map;return{decode:r=>{let o=t.decode(r);if(o.length===0)return[];let s=[];for(let i=0;i<o.length;i++){let a=o[i];s.push(...Rz(a,n))}return s},encode:r=>{let o=Oz(r,n);return o&&t.encode(o)}}}});function Rz(e,t){if(Array.isArray(e)){let n={size:0,responses:new Map},r=[];for(let o=0;o<e.length;o++){let s=wz(e[o]);r.push(s),s._tag==="Request"&&!s.isNotification&&(n.size++,t.set(s.id,n))}return r}return[wz(e)]}function wz(e){if(Object.hasOwn(e,"method")){let r=e;if(QA(r.id)&&r.method.startsWith("@effect/rpc/")){let o=r.method.slice(12),s=r.params?.requestId;return s?{_tag:o,requestId:s}:{_tag:o}}return{_tag:"Request",id:r.id??"",tag:r.method,payload:r.params??null,headers:r.headers??[],...B(r,"id")?{}:{isNotification:!0},...r.spanId?{traceId:r.traceId,spanId:r.spanId,sampled:r.sampled}:{}}}let t=e,n=Object.hasOwn(t,"error");return n&&t.error&&t.error._tag==="Defect"?{_tag:"Defect",defect:t.error.data}:Object.hasOwn(t,"chunk")&&t.chunk===!0?{_tag:"Chunk",requestId:t.id??"",values:t.result}:{_tag:"Exit",requestId:t.id??"",exit:n&&t.error!=null?{_tag:"Failure",cause:t.error._tag==="Cause"?t.error.data:[{_tag:"Die",defect:t.error}]}:{_tag:"Success",value:t.result}}}function Iz(e,t){if(!("requestId"in e))return kA(e);let n=t.get(e.requestId);return n?(t.delete(e.requestId),n.responses.set(e.requestId,e),n.size===n.responses.size?Array.from(n.responses.values(),kA):void 0):kA(e)}function Oz(e,t){if(Array.isArray(e)===!1)return Iz(e,t);if(e.length===0)return;let n=[];for(let o=0;o<e.length;o++){let s=Iz(e[o],t);s!==void 0&&n.push(s)}if(n.length===0)return;if(n.length===1)return n[0];let r=[];for(let o=0;o<n.length;o++){let s=n[o];Array.isArray(s)?r.push(...s):r.push(s)}return r}function kA(e){switch(e._tag){case"Request":return{jsonrpc:"2.0",method:e.tag,params:e.payload,...e.isNotification?{}:{id:e.id},...e.headers?.length>0?{headers:e.headers}:{},traceId:e.traceId,spanId:e.spanId,sampled:e.sampled};case"Ping":case"Pong":case"Interrupt":case"Ack":case"Eof":return{jsonrpc:"2.0",method:`@effect/rpc/${e._tag}`,params:"requestId"in e?{requestId:e.requestId}:void 0};case"Chunk":return{jsonrpc:"2.0",chunk:!0,id:e.requestId,result:e.values};case"Exit":{if(e.exit._tag==="Success")return{jsonrpc:"2.0",id:e.requestId??void 0,result:e.exit.value};let t=e.exit.cause.find(r=>r._tag==="Fail"),n=t?._tag==="Fail"?t.error:void 0;return{jsonrpc:"2.0",id:e.requestId??void 0,error:e.exit._tag==="Failure"?{_tag:"Cause",code:n&&B(n,"code")?Number(n.code):0,message:n&&B(n,"message")?n.message:JSON.stringify(e.exit.cause),data:e.exit.cause}:void 0}}case"Defect":return{jsonrpc:"2.0",id:Qre,error:{_tag:"Defect",code:1,message:"A defect occurred",data:e.defect}};case"ClientProtocolError":return{}}}var Qre=-32603,CA=e=>{let{maxBufferSize:t=vz,...n}=e??{};return En.of({contentType:"application/msgpack",includesFraming:!0,codecFor:ph,makeUnsafe:()=>{let r=new Ni(n),o=new Dc(n),s=new TextEncoder,i,a=c=>{throw i=void 0,new dh({maxBufferSize:c})};return{decode(c){let u=typeof c=="string"?s.encode(c):c;if(i!==void 0){Fb(i.length+u.length,t)&&a(t);let f=u;c=new Uint8Array(i.length+u.length),c.set(i),c.set(f,i.length),u=c,i=void 0}try{return r.unpackMultiple(u)}catch(f){let l=f;if(l.incomplete)return i=u.subarray(l.lastPosition),Fb(i.length,t)&&a(t),l.values??[];throw f}},encode:c=>o.pack(c)}}})},_z=CA({useRecords:!0}),Yre=16*1024*1024,Xre=new TextEncoder,eoe=e=>{let t=e?.maxFrameSize??Yre,n=e?.fingerprintPayloads===!0?o=>gA(o,{fingerprint:!0}):gA,r={fingerprint:!0,dictionary:!0};return En.of({contentType:"application/vnd.effect.rpc+schema-binary",includesFraming:!0,codecFor:n,makeUnsafe:()=>{let o=UH($C,{...r,maxFrameSize:t}),s=NH($C,r);return{decode:i=>o.feedSync(typeof i=="string"?Xre.encode(i):i),encode:i=>{if(!Array.isArray(i))return s.encode(i);if(i.length!==0)return s.encodeMany(i)}}}})},toe=li(En)(Tz),noe=li(En)(kz),roe=e=>li(En)(Ub(e)),ooe=e=>li(En)(Cz(e)),soe=e=>li(En)(Az(e)),ioe=li(En)(_z),aoe=e=>li(En)(CA(e)),coe=e=>dw(En)(()=>eoe(e));var Db=class extends Ve()("effect/rpc/RpcWorker/InitialMessage"){};var Pz=e=>V(()=>{let t=new Set,n=new Map,r=new Map,o=(s,i)=>fr(a=>{let c=n.get(s);return c||(c=[],n.set(s,c)),c.push([i,a]),z});return Y(e((s,i)=>{let a=r.get(s);return a?a(i):o(s,i)},t),s=>({...s,run(i,a){return Ht(function*(){t.add(i),r.set(i,a);let c=n.get(i);if(c){n.delete(i);for(let[u,f]of c)yield*qn(V(()=>a(u)),f)}return yield*lr(Gr,()=>(t.delete(i),r.delete(i),z))})}}))});var foe=e=>Er(e,"RpcClientError"),loe=0,Fz=Se(function*(e,t){let n=t?.spanPrefix??"RpcClient",r=t?.supportsAck??!0,o=t?.disableTracing??!1,s=t?.generateRequestId??(()=>loe++),i=yield*ur(),a=je(i,It),c=new Map,u=!1;yield*_t(a,yn(b=>(u=!0,f(Zg(b.id)))));let f=Se(function*(b){for(let[y,w]of c)c.delete(y),w._tag==="Queue"?yield*b._tag==="Success"?Qp(w.queue):Qt(w.queue,b.cause):w.resume(b)}),l=b=>{let y=Gm(b.successSchema),w=h(b);return(S,A)=>{let M=A?.headers?Pi(A.headers):Xl,R=A?.context??Et();if(!y){let j=F=>p(b,w,F,b.payloadSchema.make(S),M,R,A?.discard??!1);return o?j(void 0):gp(`${n}.${b._tag}`,{attributes:t.spanAttributes},j)}let P=m(b,w,b.payloadSchema.make(S),M,A?.streamBufferSize??16,R);return A?.asQueue?P:gr(Y(P,Ri))}},p=(b,y,w,S,A,M,R)=>yn(P=>{if(u)return bo;let j=s(),F=y(ee=>t.onFromClient({message:ee,context:M,discard:R}),{_tag:"Request",id:j,tag:b._tag,payload:S,...w?{traceId:w.traceId,spanId:w.spanId,sampled:w.sampled}:{},headers:ed(P.getRef(Nb),A)});if(R)return F;let te;return hi(ks(ee=>{let k={_tag:"Effect",rpc:b,context:M,resume(H){ee(H),te&&!te.pollUnsafe()&&P.currentDispatcher.scheduleTask(()=>{te.interruptUnsafe(P.id)},0)}};c.set(j,k),te=F.pipe(w?il(w,{captureStackTrace:!1}):q,Bn(P.context)),te.addObserver(H=>{if(H._tag==="Failure")return ee(H)})}),ee=>(c.delete(j),Ln(Io(te),g(j,Array.from(ee),M))))}),m=Se(function*(b,y,w,S,A,M){if(u)return yield*bo;let R=o?void 0:yield*nI(`${n}.${b._tag}`,{attributes:t.spanAttributes}),P=Ii(),j=s(),F=Zn(P.context,It);yield*Bo(F,ee=>c.has(j)?(c.delete(j),g(j,ci(ee)?Array.from(RP(ee.cause)):[],M)):z);let te=yield*Du(A);return c.set(j,{_tag:"Queue",rpc:b,queue:te,scope:F,context:M}),yield*y(ee=>t.onFromClient({message:ee,context:M,discard:!1}),{_tag:"Request",id:j,tag:b._tag,payload:w,...R?{traceId:R.traceId,spanId:R.spanId,sampled:R.sampled}:{},headers:ed(P.getRef(Nb),S)}).pipe(R?il(R,{captureStackTrace:!1}):q,ft(ee=>Qt(te,ee)),fa,Ut(F,{startImmediately:!0})),te}),h=b=>{let y=[];for(let w of b.middlewares.values()){let S=Gi(i,`${w.key}/Client`);S&&y.push(S)}return y.length===0?(w,S)=>w(S):function w(S,A,M=y.length-1){return M===-1?S(A):y[M]({rpc:b,request:A,next(R){return w(S,R,M-1)}})}},g=(b,y,w)=>ks(S=>{let A=Ii();t.onFromClient({message:{_tag:"Interrupt",requestId:b,interruptors:y},context:w,discard:!1}).pipe(zw(1e3),Bn(A.context)).addObserver(()=>{S(z)})}),x=b=>{switch(b._tag){case"Chunk":{let y=b.requestId,w=c.get(y);return!w||w._tag!=="Queue"?z:Ia(w.queue,b.values).pipe(r?O(()=>t.onFromClient({message:{_tag:"Ack",requestId:b.requestId},context:w.context,discard:!1})):q,ft(S=>Qt(w.queue,S)))}case"Exit":{let y=b.requestId,w=c.get(y);return w?(c.delete(y),w._tag==="Effect"?(w.resume(b.exit),z):b.exit._tag==="Success"?Qp(w.queue):Qt(w.queue,b.exit.cause)):z}case"Defect":return f(Gg(b.defect));case"ClientEnd":return z}},E;if(t.flatten){let b=new Map;E=function(w,S,A){let M=b.get(w);return M||(M=l(e.requests.get(w)),b.set(w,M)),M(S,A)}}else E={},e.requests.forEach(b=>{W(E,b._tag,l(b))});return{client:E,write:x}}),doe=0,AA=Se(function*(e,t){let n=doe++,{codecFor:r,run:o,send:s,supportsAck:i,supportsTransferables:a}=yield*Bi,c=poe(r),u=bm(r(dn())),f=new Map,{client:l,write:p}=yield*Fz(e,{...t,supportsAck:i,onFromClient({message:m}){switch(m._tag){case"Request":{let h=e.requests.get(m.tag),g=a?qj():void 0,x=Ii(),E={rpc:h,context:g?Ke(x.context,Jm,g):x.context,schemas:c(h)};return f.set(m.id,E),E.schemas.encodePayload(m.payload).pipe(qn(E.context),mi,O(b=>s(n,{...m,id:m.id,payload:b,headers:Object.entries(m.headers)},g&&g.readUnsafe())))}case"Ack":return f.get(m.requestId)?s(n,{_tag:"Ack",requestId:m.requestId}):z;case"Interrupt":return f.get(m.requestId)?(f.delete(m.requestId),s(n,{_tag:"Interrupt",requestId:m.requestId})):z;case"Eof":return z}}});return yield*o(n,m=>{switch(m._tag){case"Chunk":{let h=Ym(m.requestId),g=f.get(h);return!g||xe(g.schemas.decodeChunk)?z:g.schemas.decodeChunk.value(m.values).pipe(qn(g.context),mi,O(x=>p({_tag:"Chunk",clientId:0,requestId:Ym(m.requestId),values:x})),So(x=>p({_tag:"Exit",clientId:0,requestId:Ym(m.requestId),exit:$t(x)})))}case"Exit":{let h=Ym(m.requestId),g=f.get(h);return g?(f.delete(h),g.schemas.decodeExit(m.exit).pipe(qn(g.context),mi,Qr({onSuccess:x=>p({_tag:"Exit",clientId:0,requestId:h,exit:x}),onFailure:x=>p({_tag:"Exit",clientId:0,requestId:h,exit:$t(x)})}))):z}case"Defect":return p({_tag:"Defect",clientId:0,defect:u(m.defect)});case"ClientProtocolError":{let h=Lo(m.error);return jo(f.keys(),g=>p({_tag:"Exit",clientId:0,requestId:g,exit:h}))}default:return z}}).pipe(ft(yp),fa,Cs),l}),poe=e=>{let t=new WeakMap;return n=>{let r=t.get(n);if(r!==void 0)return r;let o=ib(n.successSchema);return r={decodeChunk:qt(o,s=>Ic(e(hS(s.success)))),encodePayload:pS(e(n.payloadSchema)),decodeExit:Ic(e(qC(n)))},t.set(n,r),r}},Nb=Me("effect/rpc/RpcClient/CurrentHeaders",{defaultValue:()=>Xl}),moe=d(2,(e,t)=>Qw(e,Nb,ed(Pi(t)))),Bi=class extends Ve()("effect/rpc/RpcClient/Protocol"){static make=Pz},Uz=e=>Bi.make(Se(function*(t){let n=yield*En,r=n.includesFraming,o=u=>new Js({reason:td.fromHttpClientError(u)}),s=(u,f)=>new Js({reason:new Pc({message:u,cause:f})}),i=u=>s("Received empty HTTP response from RPC server",u),a=u=>s("HTTP response ended before RPC request completed",u);return{send:Se(function*(u,f){if(f._tag!=="Request")return;let l=n.makeUnsafe(),p=l.encode(f),m=typeof p=="string"?rC(p,n.contentType):zS(p,n.contentType),h=yield*e.post("",{body:m}).pipe(sl(o));if(!r){let E=yield*h.text.pipe(sl(o)),b=yield*Ho({try:()=>l.decode(E),catch:S=>s("Error decoding HTTP response",S)});if(!Array.isArray(b))return yield*s("Expected an array of responses",b);if(b.length===0)return yield*i(f);let y=!1,w=0;return yield*Xn({while:()=>w<b.length,body:()=>{let S=b[w++];return jC(S)&&(y=!0),t(u,S)},step:wn}),y?void 0:yield*a(f)}let g=!1,x=!1;if(yield*Yl(h.stream,E=>Ho({try:()=>E.flatMap(l.decode),catch:b=>s("Error decoding HTTP response",b)}).pipe(O(b=>{if(b.length===0)return z;g=!0;let y=0;return Xn({while:()=>y<b.length,body:()=>{let w=b[y++];return jC(w)&&(x=!0),t(u,w)},step:wn})}))).pipe(sl(E=>foe(E)?E:o(E))),g){if(!x)return yield*a(f)}else return yield*i(f)}),supportsAck:!1,supportsTransferables:!1,codecFor:n.codecFor}})),hoe=e=>Kr(Bi)(O(dC,t=>(t=Tj(t,xj(e.url)),Uz(e.transformClient?e.transformClient(t):t)))),Dz=e=>Bi.make(Se(function*(t,n){let r=yield*Rj,o=yield*En,s=yield*wu(hh),i=new Map,a=yield*r.writer,c=o.makeUnsafe(),u=yield*xoe(V(()=>a(c.encode(Hj)))),f,l=V(()=>(f=void 0,Te(s)?s.value.onConnect:z)),p=h=>jo(n,g=>t(g,h)),m=h=>(f=h,p({_tag:"ClientProtocolError",error:h}));return yield*V(()=>(c=o.makeUnsafe(),u.reset(),r.runRaw(h=>{try{let g=c.decode(h);if(g.length===0)return;let x=0;return Xn({while:()=>x<g.length,body:()=>{let E=g[x++];if(E._tag==="Pong")return u.onPong(),z;if(Object.hasOwn(E,"requestId")){let b=E.requestId,y=i.get(b);if(y!==void 0)return E._tag==="Exit"&&i.delete(b),t(y,E)}return p(E)},step:wn})}catch(g){return p({_tag:"ClientProtocolError",error:new Js({reason:new Pc({message:"Error decoding message",cause:g})})})}},{onOpen:l}).pipe(ic(O(u.timeout,()=>G(new rd({reason:new $m({kind:"Timeout",cause:new Error("ping timeout")})}))))))).pipe(O(()=>G(new rd({reason:new jm({code:1e3})}))),Te(s)?ua(s.value.onDisconnect):q,pp(h=>{let g=Kf(h),x=Kt(g),E=new Js({reason:x?g.success.reason:new Pc({message:"Unknown socket error",cause:pu(h)})});return e?.retryTransientErrors&&x&&g.success.reason._tag==="SocketOpenError"?(e.onTransientError?.(E)??z).pipe(Hw({log:!0,message:"RpcClient onTransientError hook failed"})):m(E)}),$w(e?.retryPolicy??goe,h=>m(new Js({reason:h.reason}))),wx({module:"RpcClient",method:"makeProtocolSocket"}),Cs),{send(h,g){if(f)return G(f);g._tag==="Request"&&i.set(g.id,h);let x=c.encode(g);return x===void 0?z:mi(a(x))},supportsAck:!0,supportsTransferables:!1,codecFor:o.codecFor}})),goe=EF([wF(500,1.5),el(5e3)]),xoe=Se(function*(e){let t=!0,n=dr(),r=()=>{t=!0,n.closeUnsafe()},o=()=>{t=!0};return yield*V(()=>t?(t=!1,e):n.open).pipe(ca("5 seconds"),jw,Wt,fa,Cs),{timeout:n.await,reset:r,onPong:o}}),yoe=e=>Kr(Bi)(Dz(e)),Nz=e=>Bi.make(Se(function*(t,n){let r=yield*sb,o=yield*Vo,s=0,i=yield*wu(Db),a=yield*wu(hh),c=new Map,u=m=>jo(n,h=>t(h,m)),f=Ht(function*(){let m=s++,h=yield*r.spawn(m);return yield*h.run(g=>{if(g._tag==="Exit"){let x=c.get(g.requestId);if(x)return c.delete(g.requestId),x.latch.openUnsafe(),t(x.clientId,g)}else if(g._tag==="Defect"){for(let[x,E]of c)c.delete(x),E.latch.openUnsafe();return u(g)}else if("requestId"in g){let x=c.get(g.requestId);if(x)return t(x.clientId,g)}return u(g)},{onSpawn:Te(i)?O(i.value,([g,x])=>mi(h.send({_tag:"InitialMessage",value:g},x))):void 0}).pipe(pp(g=>{for(let[E,b]of c)b.worker===h&&(c.delete(E),b.latch.openUnsafe());let x=Kf(g);return u({_tag:"ClientProtocolError",error:new Js({reason:Kt(x)?x.success.reason:new Pc({message:"Error in worker",cause:pu(g)})})})}),yx(el(1e3)),wx({module:"RpcClient",method:"makeProtocolWorker"}),fa,Cs),h}),l="minSize"in e?yield*T$({acquire:f,min:e.minSize,max:e.maxSize,concurrency:e.concurrency,targetUtilization:e.targetUtilization,timeToLive:e.timeToLive}):yield*v$({acquire:f,size:e.size,concurrency:e.concurrency,targetUtilization:e.targetUtilization});yield*_t(o,se(()=>{for(let m of c.values())m.latch.openUnsafe();c.clear()}));let p=(m,h,g)=>{switch(h._tag){case"Request":return Bk(l).pipe(O(x=>{let E=dr(!1);return c.set(h.id,{clientId:m,worker:x,latch:E}),O(x.send(h,g),()=>E.await)}),Iu,mi);case"Interrupt":{let x=c.get(h.requestId);return x?(c.delete(h.requestId),x.latch.openUnsafe(),mi(x.worker.send(h))):z}case"Ack":{let x=c.get(h.requestId);return x?mi(x.worker.send(h)):z}}return z};return yield*Iu(Bk(l)),Te(a)&&(yield*a.value.onConnect),{send:p,supportsAck:!0,supportsTransferables:!0,codecFor:Ac}})),Soe=jc(Nz,Kr(Bi)),hh=class extends Ve()("effect/rpc/RpcClient/ConnectionHooks"){};var Lb="~effect/reactivity/Atom",Bz=e=>B(e,Lb),OA="~effect/reactivity/Atom/Writable",yh=d(2,(e,t)=>{let n=gt(t),r=ms(n);return Object.assign(Object.create(Object.getPrototypeOf(e)),{...e,keepAlive:!r,idleTTL:r?kn(n):void 0})}),uf=yh(0),MA={[Lb]:Lb,equals:Object.is,...Tn,toJSON(){return{_id:"Atom",keepAlive:this.keepAlive,lazy:this.lazy,label:this.label}}},boe={...MA,atom(e,t){let n=$z(e,t);return $i(r=>{let o=r.self(),s=r(this);return s._tag!=="Success"?zm(s,o):n(r,s.value)})},fn(e,t){return arguments.length===0?(n,r)=>Lz(this,n,r):Lz(this,e,t)},pull(e,t){let n=uf(PA(0)),r=$i(o=>{let s=o.self(),i=o(this);return i._tag!=="Success"?zm(i,s):qb(o,Ooe(o,n,e,t),_a(!0),i.value)});return _oe(n,r)},subscriptionRef(e){return Coe(uf($i(t=>{let n=t.self(),r=t(this);if(r._tag!=="Success")return zm(r,n);let o=typeof e=="function"?e(t):e;return Nm(o)?o:qb(t,o,_a(!0),r.value)})),(t,n)=>{let r=wC(t(this));return koe(t,n,r)})}},Lz=(e,t,n)=>{let[r,o,s]=Roe(n?.reactivityKeys?(i,a)=>{let c=t(i,a);return Or(c)?_S(c,n.reactivityKeys):Um(c,MS(n.reactivityKeys))}:t,n);return Sh(i=>{i.get(s);let a=i.self(),c=i.get(e);return c._tag!=="Success"?zm(c,a):r(i,c.value)},o)},Eoe={...MA,[OA]:OA},woe=e=>OA in e,$i=(e,t)=>{let n=Object.create(MA);return n.keepAlive=!1,n.lazy=!0,n.read=e,n.refresh=t,n},Sh=(e,t,n)=>{let r=Object.create(Eoe);return r.keepAlive=!1,r.lazy=!0,r.read=e,r.write=t,r.refresh=n,r};function Ioe(e,t){e.setSelf(t)}var xh=(e,t)=>{let n=$z(e,t);return Lb in n?n:$i(n)},$z=(e,t)=>{if(typeof e=="function"&&!Or(e)&&!Ue(e)){let n=e;return function(r,o){let s=n(r);switch(typeof s){case"function":case"object":return s===null?s:jz in s?_A(r,s,t,o):voe in s?qz(r,s,t,o):s;default:return s}}}else{if(Or(e))return function(n,r){return _A(n,e,t,r)};if(Ue(e))return function(n,r){return qz(n,e,t,r)}}return PA(e)},jz="~effect/Effect",voe="~effect/Stream",PA=e=>Sh(function(t){return e},Ioe),_A=(e,t,n,r)=>{let o=n?.initialValue!==void 0?ts(n.initialValue):_a();return qb(e,t,o,r,n?.uninterruptible)};function qb(e,t,n,r=Et(),o=!1){let s=e.self(),i=Vr();e.addFinalizer(()=>{Bn(r)(Je(i,Jt))});let a,c=!1,u=FA(r.pipe(Ke(It,i),Ke(ob,e.registry),Ke(Ka,e.registry.scheduler)),t,function(f){a=bC(f,s),c&&e.setSelf(a)},o);return c=!0,u!==void 0&&e.addFinalizer(u),a!==void 0?a:s._tag==="Some"?rb(s):Hm(n)}function FA(e,t,n,r=!1){if(bs(t)){n(t);return}let s=Bn(e)(t);s.currentDispatcher?.flush();let i=s.pollUnsafe();if(i){n(i);return}let a=s.addObserver(n);function c(){a(),r||s.interruptUnsafe()}return c}function Toe(e){let t=e?.memoMap??uf(xh(()=>ui())),n=i=>Bz(t)?i(t):t,r=PS;function o(i){let a=Object.create(boe);a.keepAlive=!1,a.lazy=!0,a.refresh=void 0,a.factory=o;let c=LA($i(typeof i=="function"?u=>ep(i(u),r):()=>ep(i,r)));return a.layer=c,a.read=function(f){let l=f(c),p=O(Vo,m=>fi(l,n(f),m));return _A(f,p,{uninterruptible:!0})},a}o.memoMap=t,o.addGlobalLayer=i=>{r=ep(r,ws(i,PS))};let s=uf(xh(i=>fr(a=>fi(PS,n(i),je(a,It))).pipe(Y(je(_i)))));return o.withReactivity=i=>a=>Moe(a,c=>{let u=wC(c(s));return c.addFinalizer(u.registerUnsafe(i,()=>{c.refresh(a)})),c.subscribe(a,f=>c.setSelf(f)),c.once(a)},{initialValueTarget:a}),o}var UA=Toe(),lhe=UA.withReactivity,qz=(e,t,n,r)=>{let o=n?.initialValue!==void 0?ts(n.initialValue):_a();return DA(e,t,o,r)};function DA(e,t,n,r=Et()){let o=e.self();r=Ke(r,ob,e.registry);let s=hp(a=>O(Zo(t.channel,a),c=>Xn({while:en,body:()=>c,step(u){e.setSelf(ts(kf(u),{waiting:!0}))}}))).pipe(ft(a=>($o(a)?df(e.self(),fs(EC),sr({onNone:()=>e.setSelf(Fj(new Jf,{previous:e.self()})),onSome:c=>e.setSelf(ts(c))})):e.setSelf(sd(a,{previous:e.self()})),z))),i=FA(r.pipe(Ke(ob,e.registry),Ke(Ka,e.registry.scheduler)),s,wn,!1);return i!==void 0&&e.addFinalizer(i),o._tag==="Some"?rb(o):Hm(n)}var koe=(e,t,n=Et())=>Nm(t)?(e.addFinalizer(Wk(t).pipe(Yl(r=>{for(let o=0;o<r.length;o++)e.setSelf(r[o]);return z}),rI(n))),iI(n)(M$(t))):t._tag!=="Success"?t:DA(e,Wk(t.value),_a(!0),n),Coe=(e,t)=>{function n(r,o){let s=r.get(e);Nm(s)?xi(Vk(s,o)):od(s)&&xi(Vk(s.value,o))}return Sh(r=>{let o=r(e);return Nm(o)||od(o)?t(r,o):o},n)};var Aoe=Symbol.for("effect/reactivity/atom/Atom/Reset"),RA=Symbol.for("effect/reactivity/atom/Atom/Interrupt");function Roe(e,t){let n=uf(PA([0,void 0])),r=t?.initialValue!==void 0?ts(t.initialValue):_a(),o=t?.concurrent?uf($i(a=>{let c=new Set;return a.addFinalizer(()=>c.forEach(u=>u.interruptUnsafe())),c})):void 0;function s(a,c){let u=o?a(o):void 0;a.isFn=!0;let[f,l]=a.get(n);if(f===0)return r;if(l===RA)return sd(CP(),{previous:a.self()});let p=e(l,a);return jz in p?(u&&(p=O(cl(p,{startImmediately:!0}),h=>(u.add(h),h.addObserver(()=>u.delete(h)),Y(ly(u),g=>g[0])))),qb(a,p,r,c,!1)):DA(a,p,r,c)}function i(a,c){Foe(()=>{c===Aoe?a.set(n,[0,void 0]):c===RA?a.set(n,[a.get(n)[0]+1,RA]):a.set(n,[a.get(n)[0]+1,c]),a.refreshSelf()})}return[s,i,n]}var Ooe=(e,t,n,r)=>O(Uk(typeof n=="function"?n(e):n),o=>{let i=Ii().context,a=on(),c=Qr(o,{onFailure(f){return $o(f)?Ye(a)?T({done:!0,items:a}):G(new Jf("Atom.pull: no items")):ct(f)},onSuccess(f){let l;return r?.disableAccumulation?l=f:(l=Tf(a,f),a=l),T({done:!1,items:l})}}),u=new Set;return e.addFinalizer(()=>{for(let f of u)f()}),e.once(t),e.subscribe(t,()=>{e.setSelf(rb(e.self()));let f;f=FA(i,c,l=>{f&&u.delete(f);let p=bC(l,e.self()),m=u.size>0;e.setSelf(m?Hm(p):p)}),f&&u.add(f)}),c}),_oe=(e,t)=>Sh(t.read,function(n,r){n.set(e,n.get(e)+1)}),NA=typeof WeakRef>"u"||typeof FinalizationRegistry>"u"?e=>{let t=gc();return function(n){let r=Fs(t,n);if(r._tag==="Some")return r.value;let o=e(n);return xc(t,n,o),o}}:e=>{let t=gc(),n=new FinalizationRegistry(r=>{Pu(t,r)});return function(r){let o=Fs(t,r).pipe(bE(i=>i.deref()));if(o._tag==="Some")return o.value;let s=e(r);return xc(t,r,new WeakRef(s)),n.register(s,r),s}};var LA=e=>Object.assign(Object.create(Object.getPrototypeOf(e)),{...e,keepAlive:!0});var Moe=d(e=>Bz(e[0]),(e,t,n)=>{let r=uf(woe(e)?Sh(o=>t(o,e),function(o,s){o.set(e,s)},e.refresh??function(o){o(e)}):$i(o=>t(o,e),e.refresh??function(o){o(e)}));return n?.initialValueTarget&&(r.initialValueTarget=Poe(n.initialValueTarget)),r}),Poe=e=>{let t=e;for(;t.initialValueTarget;)t=t.initialValueTarget;return t};var Foe=Dj;var Uoe="~effect-atom/atom/Atom/Serializable";var qA=d(2,(e,t)=>{let n=Ac(t.schema);return Object.assign(Object.create(Object.getPrototypeOf(e)),{...e,label:e.label??[t.key,new Error().stack?.split(`
|
|
36
|
-
`)[5]??""],[Uoe]:{key:t.key,encode:WT(n),decode:bm(n)}})});var zz=()=>(e,t)=>{let n=Ve()(e),r=Kr(n,t.makeEffect??AA(t.group,{...t,flatten:!0})),o=t.runtime??UA;n.runtime=o(typeof t.protocol=="function"?i=>ws(r,rx(t.protocol(i))):ws(r,rx(t.protocol))),n.mutation=NA(i=>{let a=t.group.requests.get(i);return n.runtime.fn()(Se(function*({headers:c,payload:u,reactivityKeys:f}){let p=(yield*n)(i,u,{headers:c});return yield*f?_S(p,f):p})).pipe(qA({key:`AtomRpc:mutation:${i}`,schema:IC({success:a.successSchema,error:Hz(a)})}))});let s=NA(i=>{let{headers:a,payload:c,reactivityKeys:u,tag:f,timeToLive:l}=i,p=t.group.requests.get(f),m=Gm(p.successSchema),h=m?n.runtime.pull(gr(n.use(g=>T(g(f,c,{headers:a}))))):n.runtime.atom(n.use(g=>g(f,c,{headers:a})));return u&&(h=n.runtime.factory.withReactivity(u)(h)),!m&&i.serializationKey&&(h=qA(h,{key:`AtomRpc:${i.tag}:${i.serializationKey}`,schema:IC({success:p.successSchema,error:Hz(p)})})),l&&(h=ms(l)?yh(h,l):LA(h)),h});return n.query=(i,a,c)=>{let u={tag:i,payload:a,headers:c?.headers?Pi(c.headers):void 0,reactivityKeys:c?.reactivityKeys,timeToLive:c?.timeToLive?gt(c.timeToLive):void 0,serializationKey:c?.serializationKey};return s(u)},n},Hz=e=>ze([e.errorSchema,...Array.from(e.middlewares,t=>t.error),Js]);var Bb={};is(Bb,{make:()=>Loe});var Noe={add(...e){let t=new Map(this.requests);for(let n of e)t.set(n._tag,n);return Pa({requests:t,annotations:this.annotations})},merge(...e){let t=new Map(this.requests),n=new Map(this.annotations.mapUnsafe);for(let r of e){for(let[o,s]of r.requests)t.set(o,s);for(let[o,s]of r.annotations.mapUnsafe)n.set(o,s)}return Pa({requests:t,annotations:Do(n)})},omit(...e){let t=new Map(this.requests);for(let n of e)t.delete(n);return Pa({requests:t,annotations:this.annotations})},middleware(e){let t=new Map;for(let[n,r]of this.requests)t.set(n,r.middleware(e));return Pa({requests:t,annotations:this.annotations})},toHandlers(e){let t=this;return Ht(function*(){let n=yield*ur(),r=Or(e)?yield*e:e,o=new Map;return t.requests.forEach((s,i)=>{o.set(s.key,{tag:s._tag,handler:r[i],context:n})}),Do(o)})},prefix(e){let t=new Map;for(let n of this.requests.values()){let r=n.prefix(e);t.set(r._tag,r)}return Pa({requests:t,annotations:this.annotations})},toLayer(e){return Zf(this.toHandlers(e))},of:q,toLayerHandler(e,t){let n=this;return Zf(Ht(function*(){let r=yield*ur(),o=Or(t)?yield*t:t,s=new Map,i=n.requests.get(e);return s.set(i.key,{handler:o,context:r}),Do(s)}))},accessHandler(e){return fr(t=>{let n=this.requests.get(e),{handler:r,context:o}=Gi(t,n.key);return T((s,i)=>{i.rpc=n;let a=r(s,i),c=ad(a)?a.value:a;return Or(c)?Gw(c,o):Pk(c,o)})})},annotate(e,t){return Pa({requests:this.requests,annotations:Ke(this.annotations,e,t)})},annotateRpcs(e,t){return this.annotateRpcsMerge(ds(e,t))},annotateMerge(e){return Pa({requests:this.requests,annotations:Ir(this.annotations,e)})},annotateRpcsMerge(e){let t=new Map;for(let[n,r]of this.requests)t.set(n,r.annotateMerge(Ir(e,r.annotations)));return Pa({requests:t,annotations:this.annotations})}},Pa=e=>Object.assign(function(){},Noe,{requests:e.requests,annotations:e.annotations}),Loe=(...e)=>Pa({requests:new Map(e.map(t=>[t._tag,t])),annotations:Et()});var Wz=I.Union([I.Struct({_tag:I.Literal("List"),collection:I.String}),I.Struct({_tag:I.Literal("Item"),collection:I.String,id:I.Union([I.String,I.Number])})]),ff=(e,t)=>({item:n=>({_tag:"Item",collection:e,id:n}),list:{_tag:"List",collection:e},name:e}),Vz=e=>e._tag==="List"?e.collection:`${e.collection}:${e.id}`,$b=e=>[...new Set(e.map(Vz))],jb=e=>[...new Set(e.flatMap(t=>t._tag==="List"?[t.collection]:[Vz(t),t.collection]))];var qoe=le.fn("EffectContract.invalidateAfter")(function*(e){yield*MS(jb(e))});function Boe(e,t,n){function r(o){return $b(n.reads(o))}return{query:(o,s={})=>e.query(t,o,{...s,reactivityKeys:r(o)}),run:o=>e.use(s=>s(t,o))}}function $oe(e,t,n){return{run:r=>e.use(o=>o(t,r)).pipe(le.tap(o=>qoe(n.invalidates(r,o))))}}function Hb(e,t){let{name:n,queries:r,commands:o}=e.declaration;return Object.fromEntries([...r.map(s=>[s.name,Boe(t,`${n}.${s.name}`,s)]),...o.map(s=>[s.name,$oe(t,`${n}.${s.name}`,s)])])}var Kz=I.Union([I.Struct({_tag:I.Literal("Changed"),keys:I.Array(Wz)}),I.Struct({_tag:I.Literal("Resync")})]),joe=256;function Jz(e,t){let n=xh(!1),r=xh({connection:"connecting",failure:Ne.none(),needsResync:!0,pending:0});return{connection:e.atom(s=>le.gen(function*(){s.mount(r);let i=yield*_i;function a(f){s.set(r,{...s.once(r),...f})}function c(){if(s.once(n)){a({needsResync:!0});return}i.invalidateUnsafe($b(t.resyncKeys)),a({needsResync:!1,pending:0})}s.subscribe(n,f=>{f||c()}),t.resume!==void 0&&(s.once(t.resume),s.subscribe(t.resume,c));let u=le.suspend(()=>{let f=!0;function l(p){a({connection:"live",failure:Ne.none()}),s.once(n)?a({needsResync:!0,pending:Math.min(joe,s.once(r).pending+1)}):f||p._tag==="Resync"?c():i.invalidateUnsafe(jb(p.keys)),f=!1}return t.stream.pipe(or.runForEach(p=>le.sync(()=>l(p))),le.scoped,le.catchCause(p=>le.sync(()=>a({failure:Ne.some(p)}))),le.andThen(le.sync(()=>a({connection:"reconnecting",needsResync:!0}))),le.andThen(le.sleep(t.retryDelay??"1 second")))});yield*le.forever(u)})).pipe(yh(0)),paused:n,status:r}}function Gz(e,t){return n=>{function r(){e.document.visibilityState==="visible"&&n()}return e.addEventListener(t,r),()=>e.removeEventListener(t,r)}}function Zz({window:e,native:t}){let n=e===void 0?[]:[Gz(e,"visibilitychange"),Gz(e,"online")],r=t===void 0?n:[...n,t];return $i(o=>{let s=0;function i(){s+=1,o.setSelf(s)}for(let a of r)o.addFinalizer(a(i));return s})}var Hoe=e=>{let t=e.map(({name:n})=>n).filter((n,r,o)=>o.indexOf(n)!==r);if(t.length>0)throw new Error(`Operation names must be unique; duplicated: ${[...new Set(t)].join(", ")}`)},Qz=(e,t)=>{let n=e.middleware.bind(e);return Object.assign(e,{declaration:t,middleware:r=>Qz(n(r),t)})};function pd(e,t){let{queries:n=[],commands:r=[]}=t;Hoe([...n,...r]);let o=[...n,...r].map(s=>Mc.make(`${e}.${s.name}`,{error:s.error,payload:s.payload,success:s.success}));return Qz(Bb.make(...o),{commands:r,name:e,queries:n})}function Yz(e){let t=Object.entries(e).map(([n,r])=>[n,I.isSchema(r)?r:I.TaggedError()(n,r)]);return{error:t.length===0?I.Never:I.Union(t.map(([,n])=>n)),Rejection:Object.fromEntries(t),reject:Object.fromEntries(t.map(([n,r])=>[n,(...o)=>le.fail(Reflect.construct(r,o))]))}}var zoe=e=>e===void 0?I.Void:I.isSchema(e)?e:I.Struct(e),Xz=(e,t,n)=>{let{payload:r,success:o,rejections:s={}}=n;return{kind:e,name:t,payload:zoe(r),rejections:s,success:o??I.Void,...Yz(s)}};function Co(e,t){return{...Xz("query",e,t),reads:t.reads}}function bh(e,t){return{...Xz("command",e,t),invalidates:t.invalidates}}function Woe(e){return e.startsWith(".")||e==="node_modules"}function eW(e){return e.endsWith(".md")&&!e.split("/").some(Woe)}var Voe=I.String.check(I.makeFilter(e=>eW(e)&&!e.includes("\\")&&!e.includes("\0")&&e.split("/").every(t=>t.length>0&&t!=="..")||"Expected a relative readable Markdown path")),Koe=I.String.check(I.makeFilter(e=>Number.isFinite(Date.parse(e))&&/^\d{4}-\d{2}-\d{2}T.*(?:Z|[+-]\d{2}:\d{2})$/u.exec(e)!==null||"Expected an ISO observation time with timezone")),Nhe=I.Struct({documents:I.Array(I.Struct({file:Voe,source:I.String})).check(I.makeFilter(e=>new Set(e.map(t=>t.file)).size===e.length||"Duplicate source paths are not a complete observation")),recordedAt:Koe,version:I.Literal(1)}).pipe(I.encodeKeys({recordedAt:"recorded_at"})),tW=I.Struct({action:I.Literals(["check","compare","observe"]),baseline:I.NullOr(I.String)}),nW=I.Struct({discardBaseline:I.Boolean,html:I.String,reason:I.String,snapshot:I.NullOr(I.String)});var Eh=I.String.check(I.isPattern(/\S/u),I.isMaxLength(8192)),wh=I.Struct({by:I.optional(Eh),constraints:I.String.check(I.isMaxLength(8192)),goal:Eh,item:Nt,nextAction:Eh,note:I.optional(Eh),preparedAt:I.Number.check(I.isFinite(),I.isGreaterThanOrEqualTo(0),I.isLessThanOrEqualTo(864e13)),recipient:Eh.check(I.isMaxLength(200)),reviewedRevision:Ra,source:I.String,state:I.Literals(["requested","acknowledged","rejected","unavailable"])}),Joe=wh.pipe(I.encodeKeys({nextAction:"next_action",preparedAt:"prepared_at",reviewedRevision:"reviewed_revision"})),rW=I.Struct({constraints:wh.fields.constraints,goal:wh.fields.goal,id:Nt,item:Nt,nextAction:wh.fields.nextAction,recipient:wh.fields.recipient,revision:Ra,source:I.String}),$A=I.Struct({context:I.String,file:I.String,handoff:Joe,id:Nt,prompt:I.String}),oW=I.Struct({records:I.Array($A),unknown:I.Array(I.String)}),sW=I.Struct({context:I.String,id:Nt,item:Nt,reviewedRevision:Ra,source:I.String});var _n=ff("work-board/workspace",I.String),iW=ff("work-board/documents",I.String),aW=ff("work-board/identities",I.String),cW=ff("work-board/navigation",I.String),qr=ff("work-board/index",I.String),uW=ff("work-board/watcher",I.String);var Goe=Co("handoffSource",{payload:{item:I.String},reads:()=>[_n.list,qr.list],rejections:{ResponseFailed:xr},success:sW}),Zoe=Co("handoffs",{payload:{item:I.String},reads:()=>[_n.list,qr.list],rejections:{ResponseFailed:xr},success:oW}),Qoe=bh("prepareHandoff",{invalidates:()=>[_n.list,qr.list],payload:rW,rejections:{ResponseFailed:xr},success:$A}),zb=pd("work-board",{commands:[Qoe],queries:[Goe,Zoe]});var Yoe=Co("question",{payload:{item:I.String,request:I.String},reads:()=>[_n.list,qr.list],rejections:{ResponseFailed:xr},success:L$}),Xoe=Co("awaitResponse",{payload:{after:I.optional(I.String),question:I.String},reads:()=>[_n.list,qr.list],rejections:{ResponseFailed:xr},success:B$}),ese=Co("responses",{payload:{question:I.String},reads:()=>[_n.list,qr.list],rejections:{ResponseFailed:xr},success:q$}),tse=bh("registerQuestion",{invalidates:()=>[_n.list,qr.list],payload:{item:I.String,request:I.String,revision:Ra},rejections:{ResponseFailed:xr},success:NS}),nse=bh("recordResponse",{invalidates:()=>[_n.list,qr.list],payload:$$,rejections:{ResponseFailed:xr},success:LS}),Wb=pd("work-board",{commands:[tse,nse],queries:[Yoe,ese,Xoe]});function fW(e){let t=new URL(e,"http://127.0.0.1").pathname,n=/^\/_board\/item\/(?<id>[^/]+)\/$/u.exec(t)?.groups?.id,r=iW.item(decodeURIComponent(t.slice(1)));return n?r=aW.item(decodeURIComponent(n)):t.startsWith("/_board/")&&(r=qr.list),[_n.list,r]}var qc=class extends I.TaggedError()("ReadFailed",{operation:I.String,status:I.Number}){},rse=I.String.check(I.isMaxLength(8192),I.makeFilter(e=>{if(!e.startsWith("/")||e.startsWith("//"))return"Expected a local reading URL";try{let t=new URL(e,"http://127.0.0.1").pathname;return t==="/"||["/_board/work","/_board/overview","/_board/changes","/_board/start","/_board/respond","/_board/handoff"].includes(t)||/^\/_board\/item\/[^/]+\/$/u.exec(t)!==null||/\.md$/iu.exec(t)!==null||"Expected a local reading URL"}catch{return"Expected a local reading URL"}})),ose=I.Struct({html:I.String,status:I.Number}),sse=I.Struct({file:I.String,href:I.String,kind:I.Literals(["document","heading","passage"]),line:I.optional(I.Number),snippet:I.String,text:I.String,title:I.String}),ise=Co("page",{payload:{url:rse},reads:({url:e})=>fW(e),rejections:{ReadFailed:qc},success:ose}),ase=Co("navigation",{reads:()=>[_n.list,cW.list],rejections:{ReadFailed:qc},success:I.String}),cse=Co("search",{payload:{query:I.String.check(I.isMaxLength(8192))},reads:()=>[_n.list,qr.list],rejections:{ReadFailed:qc},success:I.Struct({results:I.Array(sse),total:I.Number,unavailable:I.Array(I.String)})}),use=Co("history",{payload:tW,reads:()=>[_n.list,qr.list],rejections:{ReadFailed:qc},success:nW}),fse=Co("watcher",{reads:()=>[_n.list,uW.list],rejections:{ReadFailed:qc},success:I.Struct({watching:I.Boolean})}),jA=pd("work-board",{queries:[ise,ase,cse,use,fse]}),lse=Mc.make("work-board.subscribe",{error:qc,stream:!0,success:Kz}),lW=jA.add(lse).merge(Wb).merge(zb);function dW(e,t={}){class n extends zz()("WorkBoard/Reader",{group:lW,protocol:gh.layerProtocolHttp({url:`${e}/_board/rpc`}).pipe(Jr.provide([eb.layer,mh.layerNdjson]))}){}let r=Hb(jA,n),o=Uj({defaultIdleTTL:0,timeoutResolution:1}),s=Jz(n.runtime,{resume:Zz(t),resyncKeys:[_n.list],stream:or.unwrap(n.use(f=>le.succeed(f("work-board.subscribe",void 0))))});o.mount(s.connection);async function i(f,l){try{return await le.runPromise(Km(o,f,{suspendOnWaiting:!0}),{signal:l})}catch(p){if(l?.aborted){let m=new Error("Reading canceled",{cause:p});throw m.name="AbortError",m}throw p}}async function a(f,l){try{return await le.runPromise(le.flatMap(Km(o,n.runtime),p=>le.provideContext(f,p)),{signal:l})}catch(p){if(l?.aborted){let m=new Error("Reading canceled",{cause:p});throw m.name="AbortError",m}throw p}}async function c(f,l){let p=await le.runPromise(le.result(Km(o,n.runtime.atom(f),{suspendOnWaiting:!0})),{signal:l});if(p._tag==="Failure")throw p.failure;return p.success}let u=Hb(Wb,n);return{api:r,handoffs:Hb(zb,n),mutate:c,read:i,registry:o,responses:u,run:a,updates:s}}var Vb=new WeakMap;function md(e){let t=Vb.get(e);if(t===void 0){let o=function(){r.registry.dispose(),Vb.get(e)===r&&Vb.delete(e),e.removeEventListener("pagehide",o)};var n=o;t=dW(e.location.origin,{window:e}),Vb.set(e,t);let r=t;e.addEventListener("pagehide",o)}return t}var pW=new WeakSet;function HA(){let e=document.getElementById("doc");if(e?.dataset.view!=="handoff")return;Kb(e);let t=e.querySelector("#handoff-form");if(!t||pW.has(t))return;let n=U$(t),r=t.querySelector("#handoff-status"),o=t.querySelector("#handoff-preview-content"),s=t.querySelector("#handoff-preview"),i=t.querySelector("#handoff-submit"),a=t.querySelector("#handoff-clear"),c=t.querySelector("#handoff-prepared");if(!(n&&r&&o&&s&&i&&a&&c))return;let u=n;pW.add(t),t.dataset.bound="true";let f=t.dataset.revision??"",l=t.dataset.question??"",p;try{p=window.localStorage}catch{p=void 0}r.textContent?.includes("JavaScript is required")&&(r.textContent="Draft ready. Review and preview before preparing the file.");let m=$S(`handoff:${t.dataset.item}`,f,p,`work-board:drafts:${document.documentElement.dataset.workspace}`,x=>{r.textContent=x},"handoff"),h=m.current();D$(u,h);function g(){h=m.update({author:u.recipient.value,body:JSON.stringify({constraints:u.constraints.value,goal:u.goal.value,nextAction:u.nextAction.value})})}t.addEventListener("input",()=>{g(),o.hidden=!0,i.disabled=!0}),s.disabled=!1,a.disabled=!1,a.addEventListener("click",m.clear),s.addEventListener("click",()=>{g(),h=m.update({id:h.revision===f&&(!h.question||h.question===l)?h.id:`handoff.${crypto.randomUUID()}`,question:l,revision:f});let x=Kk(t,h);o.textContent=`New file: handoffs/${x.id}.md
|
|
36
|
+
`)[5]??""],[Uoe]:{key:t.key,encode:WT(n),decode:bm(n)}})});var zz=()=>(e,t)=>{let n=Ve()(e),r=Kr(n,t.makeEffect??AA(t.group,{...t,flatten:!0})),o=t.runtime??UA;n.runtime=o(typeof t.protocol=="function"?i=>ws(r,rx(t.protocol(i))):ws(r,rx(t.protocol))),n.mutation=NA(i=>{let a=t.group.requests.get(i);return n.runtime.fn()(Se(function*({headers:c,payload:u,reactivityKeys:f}){let p=(yield*n)(i,u,{headers:c});return yield*f?_S(p,f):p})).pipe(qA({key:`AtomRpc:mutation:${i}`,schema:IC({success:a.successSchema,error:Hz(a)})}))});let s=NA(i=>{let{headers:a,payload:c,reactivityKeys:u,tag:f,timeToLive:l}=i,p=t.group.requests.get(f),m=Gm(p.successSchema),h=m?n.runtime.pull(gr(n.use(g=>T(g(f,c,{headers:a}))))):n.runtime.atom(n.use(g=>g(f,c,{headers:a})));return u&&(h=n.runtime.factory.withReactivity(u)(h)),!m&&i.serializationKey&&(h=qA(h,{key:`AtomRpc:${i.tag}:${i.serializationKey}`,schema:IC({success:p.successSchema,error:Hz(p)})})),l&&(h=ms(l)?yh(h,l):LA(h)),h});return n.query=(i,a,c)=>{let u={tag:i,payload:a,headers:c?.headers?Pi(c.headers):void 0,reactivityKeys:c?.reactivityKeys,timeToLive:c?.timeToLive?gt(c.timeToLive):void 0,serializationKey:c?.serializationKey};return s(u)},n},Hz=e=>ze([e.errorSchema,...Array.from(e.middlewares,t=>t.error),Js]);var Bb={};is(Bb,{make:()=>Loe});var Noe={add(...e){let t=new Map(this.requests);for(let n of e)t.set(n._tag,n);return Pa({requests:t,annotations:this.annotations})},merge(...e){let t=new Map(this.requests),n=new Map(this.annotations.mapUnsafe);for(let r of e){for(let[o,s]of r.requests)t.set(o,s);for(let[o,s]of r.annotations.mapUnsafe)n.set(o,s)}return Pa({requests:t,annotations:Do(n)})},omit(...e){let t=new Map(this.requests);for(let n of e)t.delete(n);return Pa({requests:t,annotations:this.annotations})},middleware(e){let t=new Map;for(let[n,r]of this.requests)t.set(n,r.middleware(e));return Pa({requests:t,annotations:this.annotations})},toHandlers(e){let t=this;return Ht(function*(){let n=yield*ur(),r=Or(e)?yield*e:e,o=new Map;return t.requests.forEach((s,i)=>{o.set(s.key,{tag:s._tag,handler:r[i],context:n})}),Do(o)})},prefix(e){let t=new Map;for(let n of this.requests.values()){let r=n.prefix(e);t.set(r._tag,r)}return Pa({requests:t,annotations:this.annotations})},toLayer(e){return Zf(this.toHandlers(e))},of:q,toLayerHandler(e,t){let n=this;return Zf(Ht(function*(){let r=yield*ur(),o=Or(t)?yield*t:t,s=new Map,i=n.requests.get(e);return s.set(i.key,{handler:o,context:r}),Do(s)}))},accessHandler(e){return fr(t=>{let n=this.requests.get(e),{handler:r,context:o}=Gi(t,n.key);return T((s,i)=>{i.rpc=n;let a=r(s,i),c=ad(a)?a.value:a;return Or(c)?Gw(c,o):Pk(c,o)})})},annotate(e,t){return Pa({requests:this.requests,annotations:Ke(this.annotations,e,t)})},annotateRpcs(e,t){return this.annotateRpcsMerge(ds(e,t))},annotateMerge(e){return Pa({requests:this.requests,annotations:Ir(this.annotations,e)})},annotateRpcsMerge(e){let t=new Map;for(let[n,r]of this.requests)t.set(n,r.annotateMerge(Ir(e,r.annotations)));return Pa({requests:t,annotations:this.annotations})}},Pa=e=>Object.assign(function(){},Noe,{requests:e.requests,annotations:e.annotations}),Loe=(...e)=>Pa({requests:new Map(e.map(t=>[t._tag,t])),annotations:Et()});var Wz=I.Union([I.Struct({_tag:I.Literal("List"),collection:I.String}),I.Struct({_tag:I.Literal("Item"),collection:I.String,id:I.Union([I.String,I.Number])})]),ff=(e,t)=>({item:n=>({_tag:"Item",collection:e,id:n}),list:{_tag:"List",collection:e},name:e}),Vz=e=>e._tag==="List"?e.collection:`${e.collection}:${e.id}`,$b=e=>[...new Set(e.map(Vz))],jb=e=>[...new Set(e.flatMap(t=>t._tag==="List"?[t.collection]:[Vz(t),t.collection]))];var qoe=le.fn("EffectContract.invalidateAfter")(function*(e){yield*MS(jb(e))});function Boe(e,t,n){function r(o){return $b(n.reads(o))}return{query:(o,s={})=>e.query(t,o,{...s,reactivityKeys:r(o)}),run:o=>e.use(s=>s(t,o))}}function $oe(e,t,n){return{run:r=>e.use(o=>o(t,r)).pipe(le.tap(o=>qoe(n.invalidates(r,o))))}}function Hb(e,t){let{name:n,queries:r,commands:o}=e.declaration;return Object.fromEntries([...r.map(s=>[s.name,Boe(t,`${n}.${s.name}`,s)]),...o.map(s=>[s.name,$oe(t,`${n}.${s.name}`,s)])])}var Kz=I.Union([I.Struct({_tag:I.Literal("Changed"),keys:I.Array(Wz)}),I.Struct({_tag:I.Literal("Resync")})]),joe=256;function Jz(e,t){let n=xh(!1),r=xh({connection:"connecting",failure:Ne.none(),needsResync:!0,pending:0});return{connection:e.atom(s=>le.gen(function*(){s.mount(r);let i=yield*_i;function a(f){s.set(r,{...s.once(r),...f})}function c(){if(s.once(n)){a({needsResync:!0});return}i.invalidateUnsafe($b(t.resyncKeys)),a({needsResync:!1,pending:0})}s.subscribe(n,f=>{f||c()}),t.resume!==void 0&&(s.once(t.resume),s.subscribe(t.resume,c));let u=le.suspend(()=>{let f=!0;function l(p){a({connection:"live",failure:Ne.none()}),s.once(n)?a({needsResync:!0,pending:Math.min(joe,s.once(r).pending+1)}):f||p._tag==="Resync"?c():i.invalidateUnsafe(jb(p.keys)),f=!1}return t.stream.pipe(or.runForEach(p=>le.sync(()=>l(p))),le.scoped,le.catchCause(p=>le.sync(()=>a({failure:Ne.some(p)}))),le.andThen(le.sync(()=>a({connection:"reconnecting",needsResync:!0}))),le.andThen(le.sleep(t.retryDelay??"1 second")))});yield*le.forever(u)})).pipe(yh(0)),paused:n,status:r}}function Gz(e,t){return n=>{function r(){e.document.visibilityState==="visible"&&n()}return e.addEventListener(t,r),()=>e.removeEventListener(t,r)}}function Zz({window:e,native:t}){let n=e===void 0?[]:[Gz(e,"visibilitychange"),Gz(e,"online")],r=t===void 0?n:[...n,t];return $i(o=>{let s=0;function i(){s+=1,o.setSelf(s)}for(let a of r)o.addFinalizer(a(i));return s})}var Hoe=e=>{let t=e.map(({name:n})=>n).filter((n,r,o)=>o.indexOf(n)!==r);if(t.length>0)throw new Error(`Operation names must be unique; duplicated: ${[...new Set(t)].join(", ")}`)},Qz=(e,t)=>{let n=e.middleware.bind(e);return Object.assign(e,{declaration:t,middleware:r=>Qz(n(r),t)})};function pd(e,t){let{queries:n=[],commands:r=[]}=t;Hoe([...n,...r]);let o=[...n,...r].map(s=>Mc.make(`${e}.${s.name}`,{error:s.error,payload:s.payload,success:s.success}));return Qz(Bb.make(...o),{commands:r,name:e,queries:n})}function Yz(e){let t=Object.entries(e).map(([n,r])=>[n,I.isSchema(r)?r:I.TaggedError()(n,r)]);return{error:t.length===0?I.Never:I.Union(t.map(([,n])=>n)),Rejection:Object.fromEntries(t),reject:Object.fromEntries(t.map(([n,r])=>[n,(...o)=>le.fail(Reflect.construct(r,o))]))}}var zoe=e=>e===void 0?I.Void:I.isSchema(e)?e:I.Struct(e),Xz=(e,t,n)=>{let{payload:r,success:o,rejections:s={}}=n;return{kind:e,name:t,payload:zoe(r),rejections:s,success:o??I.Void,...Yz(s)}};function Co(e,t){return{...Xz("query",e,t),reads:t.reads}}function bh(e,t){return{...Xz("command",e,t),invalidates:t.invalidates}}function Woe(e){return e.startsWith(".")||e==="node_modules"}function eW(e){return e.endsWith(".md")&&!e.split("/").some(Woe)}var Voe=I.String.check(I.makeFilter(e=>eW(e)&&!e.includes("\\")&&!e.includes("\0")&&e.split("/").every(t=>t.length>0&&t!=="..")||"Expected a relative readable Markdown path")),Koe=I.String.check(I.makeFilter(e=>Number.isFinite(Date.parse(e))&&/^\d{4}-\d{2}-\d{2}T.*(?:Z|[+-]\d{2}:\d{2})$/u.exec(e)!==null||"Expected an ISO observation time with timezone")),Nhe=I.Struct({documents:I.Array(I.Struct({file:Voe,source:I.String})).check(I.makeFilter(e=>new Set(e.map(t=>t.file)).size===e.length||"Duplicate source paths are not a complete observation")),recordedAt:Koe,version:I.Literal(1)}).pipe(I.encodeKeys({recordedAt:"recorded_at"})),tW=I.Struct({action:I.Literals(["check","compare","observe"]),baseline:I.NullOr(I.String)}),nW=I.Struct({discardBaseline:I.Boolean,html:I.String,reason:I.String,snapshot:I.NullOr(I.String)});var Eh=I.String.check(I.isPattern(/\S/u),I.isMaxLength(8192)),wh=I.Struct({by:I.optional(Eh),constraints:I.String.check(I.isMaxLength(8192)),goal:Eh,item:Nt,nextAction:Eh,note:I.optional(Eh),preparedAt:I.Number.check(I.isFinite(),I.isGreaterThanOrEqualTo(0),I.isLessThanOrEqualTo(864e13)),recipient:Eh.check(I.isMaxLength(200)),reviewedRevision:Ra,source:I.String,state:I.Literals(["requested","acknowledged","rejected","unavailable"])}),Joe=wh.pipe(I.encodeKeys({nextAction:"next_action",preparedAt:"prepared_at",reviewedRevision:"reviewed_revision"})),rW=I.Struct({constraints:wh.fields.constraints,goal:wh.fields.goal,id:Nt,item:Nt,nextAction:wh.fields.nextAction,recipient:wh.fields.recipient,revision:Ra,source:I.String}),$A=I.Struct({context:I.String,file:I.String,handoff:Joe,id:Nt,prompt:I.String}),oW=I.Struct({records:I.Array($A),unknown:I.Array(I.String)}),sW=I.Struct({context:I.String,id:Nt,item:Nt,reviewedRevision:Ra,source:I.String});var _n=ff("work-board/workspace",I.String),iW=ff("work-board/documents",I.String),aW=ff("work-board/identities",I.String),cW=ff("work-board/navigation",I.String),qr=ff("work-board/index",I.String),uW=ff("work-board/watcher",I.String);var Goe=Co("handoffSource",{payload:{item:I.String},reads:()=>[_n.list,qr.list],rejections:{ResponseFailed:xr},success:sW}),Zoe=Co("handoffs",{payload:{item:I.String},reads:()=>[_n.list,qr.list],rejections:{ResponseFailed:xr},success:oW}),Qoe=bh("prepareHandoff",{invalidates:()=>[_n.list,qr.list],payload:rW,rejections:{ResponseFailed:xr},success:$A}),zb=pd("work-board",{commands:[Qoe],queries:[Goe,Zoe]});var Yoe=Co("question",{payload:{item:I.String,request:I.String},reads:()=>[_n.list,qr.list],rejections:{ResponseFailed:xr},success:L$}),Xoe=Co("awaitResponse",{payload:{after:I.optional(I.String),question:I.String},reads:()=>[_n.list,qr.list],rejections:{ResponseFailed:xr},success:B$}),ese=Co("responses",{payload:{question:I.String},reads:()=>[_n.list,qr.list],rejections:{ResponseFailed:xr},success:q$}),tse=bh("registerQuestion",{invalidates:()=>[_n.list,qr.list],payload:{item:I.String,request:I.String,revision:Ra},rejections:{ResponseFailed:xr},success:NS}),nse=bh("recordResponse",{invalidates:()=>[_n.list,qr.list],payload:$$,rejections:{ResponseFailed:xr},success:LS}),Wb=pd("work-board",{commands:[tse,nse],queries:[Yoe,ese,Xoe]});function fW(e){let t=new URL(e,"http://127.0.0.1").pathname,n=/^\/_board\/item\/(?<id>[^/]+)\/$/u.exec(t)?.groups?.id,r=iW.item(decodeURIComponent(t.slice(1)));return n?r=aW.item(decodeURIComponent(n)):t.startsWith("/_board/")&&(r=qr.list),[_n.list,r]}var qc=class extends I.TaggedError()("ReadFailed",{operation:I.String,status:I.Number}){},rse=I.String.check(I.isMaxLength(8192),I.makeFilter(e=>{if(!e.startsWith("/")||e.startsWith("//"))return"Expected a local reading URL";try{let t=new URL(e,"http://127.0.0.1").pathname;return t==="/"||["/_board/work","/_board/overview","/_board/changes","/_board/start","/_board/respond","/_board/handoff","/_board/result"].includes(t)||/^\/_board\/item\/[^/]+\/$/u.exec(t)!==null||/\.md$/iu.exec(t)!==null||"Expected a local reading URL"}catch{return"Expected a local reading URL"}})),ose=I.Struct({html:I.String,status:I.Number}),sse=I.Struct({file:I.String,href:I.String,kind:I.Literals(["document","heading","passage"]),line:I.optional(I.Number),snippet:I.String,text:I.String,title:I.String}),ise=Co("page",{payload:{url:rse},reads:({url:e})=>fW(e),rejections:{ReadFailed:qc},success:ose}),ase=Co("navigation",{reads:()=>[_n.list,cW.list],rejections:{ReadFailed:qc},success:I.String}),cse=Co("search",{payload:{query:I.String.check(I.isMaxLength(8192))},reads:()=>[_n.list,qr.list],rejections:{ReadFailed:qc},success:I.Struct({results:I.Array(sse),total:I.Number,unavailable:I.Array(I.String)})}),use=Co("history",{payload:tW,reads:()=>[_n.list,qr.list],rejections:{ReadFailed:qc},success:nW}),fse=Co("watcher",{reads:()=>[_n.list,uW.list],rejections:{ReadFailed:qc},success:I.Struct({watching:I.Boolean})}),jA=pd("work-board",{queries:[ise,ase,cse,use,fse]}),lse=Mc.make("work-board.subscribe",{error:qc,stream:!0,success:Kz}),lW=jA.add(lse).merge(Wb).merge(zb);function dW(e,t={}){class n extends zz()("WorkBoard/Reader",{group:lW,protocol:gh.layerProtocolHttp({url:`${e}/_board/rpc`}).pipe(Jr.provide([eb.layer,mh.layerNdjson]))}){}let r=Hb(jA,n),o=Uj({defaultIdleTTL:0,timeoutResolution:1}),s=Jz(n.runtime,{resume:Zz(t),resyncKeys:[_n.list],stream:or.unwrap(n.use(f=>le.succeed(f("work-board.subscribe",void 0))))});o.mount(s.connection);async function i(f,l){try{return await le.runPromise(Km(o,f,{suspendOnWaiting:!0}),{signal:l})}catch(p){if(l?.aborted){let m=new Error("Reading canceled",{cause:p});throw m.name="AbortError",m}throw p}}async function a(f,l){try{return await le.runPromise(le.flatMap(Km(o,n.runtime),p=>le.provideContext(f,p)),{signal:l})}catch(p){if(l?.aborted){let m=new Error("Reading canceled",{cause:p});throw m.name="AbortError",m}throw p}}async function c(f,l){let p=await le.runPromise(le.result(Km(o,n.runtime.atom(f),{suspendOnWaiting:!0})),{signal:l});if(p._tag==="Failure")throw p.failure;return p.success}let u=Hb(Wb,n);return{api:r,handoffs:Hb(zb,n),mutate:c,read:i,registry:o,responses:u,run:a,updates:s}}var Vb=new WeakMap;function md(e){let t=Vb.get(e);if(t===void 0){let o=function(){r.registry.dispose(),Vb.get(e)===r&&Vb.delete(e),e.removeEventListener("pagehide",o)};var n=o;t=dW(e.location.origin,{window:e}),Vb.set(e,t);let r=t;e.addEventListener("pagehide",o)}return t}var pW=new WeakSet;function HA(){let e=document.getElementById("doc");if(e?.dataset.view!=="handoff")return;Kb(e);let t=e.querySelector("#handoff-form");if(!t||pW.has(t))return;let n=U$(t),r=t.querySelector("#handoff-status"),o=t.querySelector("#handoff-preview-content"),s=t.querySelector("#handoff-preview"),i=t.querySelector("#handoff-submit"),a=t.querySelector("#handoff-clear"),c=t.querySelector("#handoff-prepared");if(!(n&&r&&o&&s&&i&&a&&c))return;let u=n;pW.add(t),t.dataset.bound="true";let f=t.dataset.revision??"",l=t.dataset.question??"",p;try{p=window.localStorage}catch{p=void 0}r.textContent?.includes("JavaScript is required")&&(r.textContent="Draft ready. Review and preview before preparing the file.");let m=$S(`handoff:${t.dataset.item}`,f,p,`work-board:drafts:${document.documentElement.dataset.workspace}`,x=>{r.textContent=x},"handoff"),h=m.current();D$(u,h);function g(){h=m.update({author:u.recipient.value,body:JSON.stringify({constraints:u.constraints.value,goal:u.goal.value,nextAction:u.nextAction.value})})}t.addEventListener("input",()=>{g(),o.hidden=!0,i.disabled=!0}),s.disabled=!1,a.disabled=!1,a.addEventListener("click",m.clear),s.addEventListener("click",()=>{g(),h=m.update({id:h.revision===f&&(!h.question||h.question===l)?h.id:`handoff.${crypto.randomUUID()}`,question:l,revision:f});let x=Kk(t,h);o.textContent=`New file: handoffs/${x.id}.md
|
|
37
37
|
Prepared time and reviewed snapshot are assigned by the server.
|
|
38
38
|
|
|
39
39
|
---
|
package/dist/board.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,aAAa,EAAc,MAAM,QAAQ,CAAC;AAClG,OAAO,EAAE,UAAU,EAA8C,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,gBAAgB,CAAC;AAG1D,OAAO,EAAyB,KAAK,cAAc,EAAuD,MAAM,iBAAiB,CAAC;AAalI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,aAAa,EAAc,MAAM,QAAQ,CAAC;AAClG,OAAO,EAAE,UAAU,EAA8C,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,gBAAgB,CAAC;AAG1D,OAAO,EAAyB,KAAK,cAAc,EAAuD,MAAM,iBAAiB,CAAC;AAalI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQtD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAsGD,KAAK,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,aAAa,GAAG,YAAY,CAAC;AAC5F,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;AAE1I,eAAO,MAAM,UAAU,YAAa,YAAY,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CACxC,CAAC"}
|
package/dist/board.js
CHANGED
|
@@ -20,6 +20,7 @@ import { work } from "#http/work.ts";
|
|
|
20
20
|
import { Highlighter } from "#render/highlighter.ts";
|
|
21
21
|
import { responsePage } from "#responses/page.ts";
|
|
22
22
|
import { responseService } from "#responses/service.ts";
|
|
23
|
+
import { resultPage } from "#results/page.ts";
|
|
23
24
|
import { server } from "#rpc/server.ts";
|
|
24
25
|
import { searchSnapshot } from "#search/snapshot.ts";
|
|
25
26
|
const routes = (options) => HttpRouter.use((router) => Effect.gen(function* () {
|
|
@@ -35,6 +36,8 @@ const routes = (options) => HttpRouter.use((router) => Effect.gen(function* () {
|
|
|
35
36
|
const startPage = start(changes, home);
|
|
36
37
|
yield* serve("/_board/start", startPage);
|
|
37
38
|
const workPage = work(index, changes, home);
|
|
39
|
+
const result = resultPage(index, changes, home);
|
|
40
|
+
yield* serve("/_board/result", result);
|
|
38
41
|
const overviewPage = overview(index, changes, home);
|
|
39
42
|
const historyPage = changesPage(changes, home);
|
|
40
43
|
yield* serve("/_board/work", workPage);
|
|
@@ -70,6 +73,9 @@ const routes = (options) => HttpRouter.use((router) => Effect.gen(function* () {
|
|
|
70
73
|
const pathname = new URL(url, "http://127.0.0.1").pathname;
|
|
71
74
|
let selected;
|
|
72
75
|
switch (pathname) {
|
|
76
|
+
case "/_board/result":
|
|
77
|
+
selected = result(request);
|
|
78
|
+
break;
|
|
73
79
|
case "/_board/handoff":
|
|
74
80
|
selected = handoff(request);
|
|
75
81
|
break;
|
package/dist/board.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board.js","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/page/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/page/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAgBzD,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAsB/F;AAED,eAAO,MAAM,cAAc,o+BAO1B,CAAC"}
|
package/dist/page/metadata.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { identityUrl } from "#metadata/links.ts";
|
|
2
|
+
import { backlinksHtml } from "#page/backlinksHtml.ts";
|
|
3
|
+
import { escapeHtml } from "#page/escape.ts";
|
|
4
|
+
import { metadataDetails } from "#page/metadataDetails.ts";
|
|
2
5
|
import { stateOf, viewUrl } from "#views/state.ts";
|
|
3
|
-
import { backlinksHtml } from "./backlinksHtml.js";
|
|
4
|
-
import { escapeHtml } from "./escape.js";
|
|
5
|
-
import { metadataDetails } from "./metadataDetails.js";
|
|
6
6
|
function handoffLink(id, kind, unique) {
|
|
7
7
|
return unique && id && !["question", "response", "handoff"].includes(kind ?? "")
|
|
8
8
|
? `<p><a href="/_board/handoff?item=${encodeURIComponent(id)}">Prepare an agent handoff</a></p>`
|
|
9
9
|
: "";
|
|
10
10
|
}
|
|
11
|
+
function resultLink(id, kind, unique) {
|
|
12
|
+
return unique && id && kind === "result" ? `<p><a href="/_board/result?item=${encodeURIComponent(id)}">Review returned result</a></p>` : "";
|
|
13
|
+
}
|
|
11
14
|
export function metadataHtml(parsed, file, model) {
|
|
12
15
|
const backlinks = backlinksHtml(file, model);
|
|
13
16
|
const diagnostics = model.diagnostics.get(file) ?? parsed.diagnostics;
|
|
@@ -26,7 +29,7 @@ export function metadataHtml(parsed, file, model) {
|
|
|
26
29
|
const boardLink = unique && fields.kind === "board" && fields.id
|
|
27
30
|
? `<p><a href="${escapeHtml(viewUrl(stateOf("/"), { board: fields.id }))}">View this board</a></p>`
|
|
28
31
|
: "";
|
|
29
|
-
return `<section class="work-meta" aria-label="Recorded work"><p class="metadata-summary">Recorded work · ${identity}${fields.status ? ` · ${escapeHtml(fields.status)}` : ""}${fields.owner ? ` · ${escapeHtml(fields.owner)}` : ""}</p>${fields.nextAction ? `<p>Next action: ${escapeHtml(fields.nextAction)}</p>` : ""}${boardLink}${handoffLink(fields.id, fields.kind, unique)}${problems}<details data-key="work-metadata"><summary>Work details and source</summary>${details}<p>Source: ${escapeHtml(file)}:${parsed.lines.id ?? 1}; prose starts at line ${parsed.bodyLine}.</p>${parsed.raw ? `<details data-key="frontmatter-source"><summary>Original frontmatter</summary><pre>${escapeHtml(parsed.raw)}</pre></details>` : ""}</details></section>${backlinks}`;
|
|
32
|
+
return `<section class="work-meta" aria-label="Recorded work"><p class="metadata-summary">Recorded work · ${identity}${fields.status ? ` · ${escapeHtml(fields.status)}` : ""}${fields.owner ? ` · ${escapeHtml(fields.owner)}` : ""}</p>${fields.nextAction ? `<p>Next action: ${escapeHtml(fields.nextAction)}</p>` : ""}${boardLink}${resultLink(fields.id, fields.kind, unique)}${handoffLink(fields.id, fields.kind, unique)}${problems}<details data-key="work-metadata"><summary>Work details and source</summary>${details}<p>Source: ${escapeHtml(file)}:${parsed.lines.id ?? 1}; prose starts at line ${parsed.bodyLine}.</p>${parsed.raw ? `<details data-key="frontmatter-source"><summary>Original frontmatter</summary><pre>${escapeHtml(parsed.raw)}</pre></details>` : ""}</details></section>${backlinks}`;
|
|
30
33
|
}
|
|
31
34
|
export const metadataStyles = `
|
|
32
35
|
.work-meta{font-size:.9rem;margin:16px 0 24px;padding:12px 16px;border:1px solid var(--border);border-radius:8px;background:var(--surface);overflow-wrap:anywhere}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/page/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/page/metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -88,7 +88,7 @@ document.addEventListener("click", (event) => {
|
|
|
88
88
|
const link = event.target.closest?.("a[href]");
|
|
89
89
|
if (!link || event.defaultPrevented || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey || link.hasAttribute("download") || (link.target && link.target !== "_self")) return;
|
|
90
90
|
const target = new URL(link.href, location.href);
|
|
91
|
-
if (target.origin !== location.origin || !(target.pathname === "/" || (target.pathname === "/_board/handoff" || target.pathname === "/_board/respond" || target.pathname === "/_board/start" || target.pathname === "/_board/changes" || target.pathname === "/_board/overview" || target.pathname === "/_board/work" || target.pathname.startsWith("/_board/item/")) || /\\.md$/i.test(target.pathname))) return;
|
|
91
|
+
if (target.origin !== location.origin || !(target.pathname === "/" || (target.pathname === "/_board/handoff", "/_board/result" || target.pathname === "/_board/respond" || target.pathname === "/_board/start" || target.pathname === "/_board/changes" || target.pathname === "/_board/overview" || target.pathname === "/_board/work" || target.pathname.startsWith("/_board/item/")) || /\\.md$/i.test(target.pathname))) return;
|
|
92
92
|
event.preventDefault();
|
|
93
93
|
navigate(target);
|
|
94
94
|
});
|
package/dist/page/shell.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const shell: (title: string, nav: string, main: string, workspace: string, board: boolean, identity?: string, view?: boolean | "overview" | "changes" | "start" | "response" | "handoff") => string;
|
|
1
|
+
export declare const shell: (title: string, nav: string, main: string, workspace: string, board: boolean, identity?: string, view?: boolean | "overview" | "changes" | "start" | "response" | "handoff" | "result") => string;
|
|
2
2
|
//# sourceMappingURL=shell.d.ts.map
|
package/dist/page/shell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK,UACV,MAAM,OACR,MAAM,QACL,MAAM,aACD,MAAM,SACV,OAAO,aACH,MAAM,SACX,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK,UACV,MAAM,OACR,MAAM,QACL,MAAM,aACD,MAAM,SACV,OAAO,aACH,MAAM,SACX,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,KAClF,MAmBQ,CAAC"}
|
package/dist/page/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,QAAQ,CAAC,IAAY;IAC7B,OAAO,IAAI;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;SACjD,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACpB,KAAa,EACb,GAAW,EACX,IAAY,EACZ,SAAiB,EACjB,KAAc,EACd,QAAiB,EACjB,IAAI,
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/page/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,QAAQ,CAAC,IAAY;IAC7B,OAAO,IAAI;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;SACjD,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CACpB,KAAa,EACb,GAAW,EACX,IAAY,EACZ,SAAiB,EACjB,KAAc,EACd,QAAiB,EACjB,IAAI,GAAmF,KAAK,EACnF,EAAE,CACX;IACC,kDAAkD,UAAU,CAAC,SAAS,CAAC,gCAAgC;IACvG,qHAAqH;IACrH,UAAU,UAAU,CAAC,KAAK,CAAC,UAAU;IACrC,yGAAyG;IACzG,gQAAgQ;IAChQ,0GAA0G;IAC1G,yLAAyL;IACzL,4DAA4D,GAAG,gBAAgB;IAC/E,6IAA6I;IAC7I,iIAAiI,QAAQ,CAAC,KAAK,CAAC,QAAQ;IACxJ,kEAAkE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,kFAAkF,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,yEAAyE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,6QAA6Q;IACtnB,yEAAyE;IACzE,wMAAwM;IACxM,0LAA0L;IAC1L,wJAAwJ;IACxJ,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,wBAAwB,UAAU,CAAC,KAAK,CAAC,eAAe,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,mBAAmB,IAAI,SAAS;IAC/S,eAAe,YAAY,GAAG,YAAY,gBAAgB;CAC1D,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC"}
|
|
@@ -62,6 +62,14 @@ Name the exact question and the choices. Do not imply that a response was record
|
|
|
62
62
|
readonly source: `---
|
|
63
63
|
id: example.result
|
|
64
64
|
kind: result
|
|
65
|
+
# A supplied result status is not work acceptance or an execution receipt.
|
|
66
|
+
attention:
|
|
67
|
+
- id: review
|
|
68
|
+
kind: review
|
|
69
|
+
state: open
|
|
70
|
+
response_from: [maintainer]
|
|
71
|
+
reason: Review this exact report, its evidence and limitations.
|
|
72
|
+
unblocks: [example.project#readable-result]
|
|
65
73
|
relationships:
|
|
66
74
|
- kind: implements
|
|
67
75
|
target: example.investigation
|
|
@@ -95,6 +103,18 @@ Name failures, skipped checks, uncertainty and any response needed.
|
|
|
95
103
|
State the next action and who needs to respond, if known.
|
|
96
104
|
|
|
97
105
|
[Project and acceptance target](project.md)
|
|
106
|
+
|
|
107
|
+
::::question{id="verdict" select="one"}
|
|
108
|
+
### What should happen with this report?
|
|
109
|
+
|
|
110
|
+
:::option{id="revision"}
|
|
111
|
+
Request another revision and explain what is missing.
|
|
112
|
+
:::
|
|
113
|
+
|
|
114
|
+
:::option{id="accept"}
|
|
115
|
+
Accept this exact report version with its stated limitations.
|
|
116
|
+
:::
|
|
117
|
+
::::
|
|
98
118
|
`;
|
|
99
119
|
}];
|
|
100
120
|
//# sourceMappingURL=startTemplates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startTemplates.d.ts","sourceRoot":"","sources":["../../src/page/startTemplates.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;aAEzB,IAAI,EAAE,YAAY;aAClB,KAAK,EAAE,SAAS;aAChB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBT;;aAGC,IAAI,EAAE,kBAAkB;aACxB,KAAK,EAAE,eAAe;aACtB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BT;;aAGC,IAAI,EAAE,WAAW;aACjB,KAAK,EAAE,cAAc;aACrB,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"startTemplates.d.ts","sourceRoot":"","sources":["../../src/page/startTemplates.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;aAEzB,IAAI,EAAE,YAAY;aAClB,KAAK,EAAE,SAAS;aAChB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBT;;aAGC,IAAI,EAAE,kBAAkB;aACxB,KAAK,EAAE,eAAe;aACtB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BT;;aAGC,IAAI,EAAE,WAAW;aACjB,KAAK,EAAE,cAAc;aACrB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDT;EAES,CAAC"}
|
|
@@ -65,6 +65,14 @@ Name the exact question and the choices. Do not imply that a response was record
|
|
|
65
65
|
source: `---
|
|
66
66
|
id: example.result
|
|
67
67
|
kind: result
|
|
68
|
+
# A supplied result status is not work acceptance or an execution receipt.
|
|
69
|
+
attention:
|
|
70
|
+
- id: review
|
|
71
|
+
kind: review
|
|
72
|
+
state: open
|
|
73
|
+
response_from: [maintainer]
|
|
74
|
+
reason: Review this exact report, its evidence and limitations.
|
|
75
|
+
unblocks: [example.project#readable-result]
|
|
68
76
|
relationships:
|
|
69
77
|
- kind: implements
|
|
70
78
|
target: example.investigation
|
|
@@ -98,6 +106,18 @@ Name failures, skipped checks, uncertainty and any response needed.
|
|
|
98
106
|
State the next action and who needs to respond, if known.
|
|
99
107
|
|
|
100
108
|
[Project and acceptance target](project.md)
|
|
109
|
+
|
|
110
|
+
::::question{id="verdict" select="one"}
|
|
111
|
+
### What should happen with this report?
|
|
112
|
+
|
|
113
|
+
:::option{id="revision"}
|
|
114
|
+
Request another revision and explain what is missing.
|
|
115
|
+
:::
|
|
116
|
+
|
|
117
|
+
:::option{id="accept"}
|
|
118
|
+
Accept this exact report version with its stated limitations.
|
|
119
|
+
:::
|
|
120
|
+
::::
|
|
101
121
|
`,
|
|
102
122
|
},
|
|
103
123
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startTemplates.js","sourceRoot":"","sources":["../../src/page/startTemplates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B;QACC,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBT;KACC;IACD;QACC,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BT;KACC;IACD;QACC,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"startTemplates.js","sourceRoot":"","sources":["../../src/page/startTemplates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B;QACC,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBT;KACC;IACD;QACC,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BT;KACC;IACD;QACC,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDT;KACC;CACQ,CAAC"}
|
package/dist/page/style.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAsFA,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAsFA,eAAO,MAAM,KAAK,QAe2d,CAAC"}
|
package/dist/page/style.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { attentionStyle } from "#attention/style.ts";
|
|
2
|
+
import { metadataStyles } from "#page/metadata.ts";
|
|
3
|
+
import { readingStyles } from "#page/readingStyles.ts";
|
|
4
|
+
import { searchStyles } from "#page/searchDialog.ts";
|
|
5
|
+
import { visualStyles } from "#page/visualDialog.ts";
|
|
6
|
+
import { layout, theme } from "#page/workspaceStyles.ts";
|
|
2
7
|
import { workStyle } from "#views/workStyle.ts";
|
|
3
|
-
import { metadataStyles } from "./metadata.js";
|
|
4
|
-
import { readingStyles } from "./readingStyles.js";
|
|
5
|
-
import { searchStyles } from "./searchDialog.js";
|
|
6
|
-
import { visualStyles } from "./visualDialog.js";
|
|
7
|
-
import { layout, theme } from "./workspaceStyles.js";
|
|
8
8
|
const prose = `
|
|
9
9
|
h1, h2, h3, h4 { font-weight: 600; line-height: 1.25; margin: 1.6em 0 0.5em; }
|
|
10
10
|
h1 { overflow-wrap: anywhere; font-size: 1.9em; margin-top: 1em; }
|
|
@@ -92,5 +92,6 @@ export const style = theme
|
|
|
92
92
|
+ visualStyles
|
|
93
93
|
+ documents
|
|
94
94
|
+ ".response-panel fieldset, .questionnaire-reading { min-width: 0; border: 1px solid var(--border); border-radius: 12px; padding: 1rem; margin: 1rem 0; } .response-panel legend { font-weight: 650; } .response-panel .question-option { display: grid; grid-template-columns: 1.5rem minmax(0, 1fr); gap: .75rem; padding: 1rem; margin: .5rem 0; border: 1px solid var(--border); border-radius: 8px; } .response-panel .question-option:has(input:checked) { border-color: var(--link); background: var(--surface); } .response-panel .question-option input { width: 1.2rem; height: 1.2rem; margin-top: .2rem; accent-color: var(--link); } .response-panel .question-option label { font-weight: 650; cursor: pointer; } .response-panel .question-option p { margin-top: .5rem; } .response-panel #response-history article { border-top: 1px solid var(--border); margin-top: 1.5rem; padding-top: 1rem; } .response-context, .question-option, .response-panel fieldset { overflow-wrap: anywhere; }"
|
|
95
|
+
+ "[data-view=result] .response-panel { overflow-wrap: anywhere; } #result-criteria ul { padding-inline-start: 1.25rem; } #result-criteria dl { display: grid; grid-template-columns: minmax(0, 1fr); gap: .25rem; margin: .75rem 0; } #result-criteria dt { color: var(--muted); } #result-criteria dd { margin: 0 0 .5rem; min-width: 0; } #result-feedback article { border-top: 1px solid var(--border); margin-top: 1.5rem; padding-top: 1rem; }"
|
|
95
96
|
+ ".response-panel { max-width: 850px; margin: auto; padding: 1.5rem; } .response-panel form { display: grid; gap: 1rem; } .response-panel label { display: grid; gap: .5rem; } .response-panel input, .response-panel textarea, .response-panel select { width: 100%; box-sizing: border-box; font: inherit; background: var(--surface); color: inherit; padding: .75rem; border: 1px solid var(--border); } .response-panel pre, .response-panel code { white-space: pre-wrap; overflow-wrap: anywhere; }";
|
|
96
97
|
//# sourceMappingURL=style.js.map
|
package/dist/page/style.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/page/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAC;AAEF,MAAM,KAAK,GAAG;;;;;;;;;;;;CAYb,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;CAQhB,CAAC;AAEF,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBjB,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GACjB,KAAK;MACH,MAAM;MACN,KAAK;MACL,KAAK;MACL,QAAQ;MACR,aAAa,EAAE;MACf,YAAY;MACZ,cAAc;MACd,SAAS,EAAE;MACX,cAAc,EAAE;MAChB,YAAY;MACZ,SAAS;MACT,88BAA88B;MAC98B,obAAob;MACpb,0eAA0e,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"criteria.d.ts","sourceRoot":"","sources":["../../src/results/criteria.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA4B1E,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAOrF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { referenceTarget } from "#metadata/links.ts";
|
|
2
|
+
import { escapeHtml } from "#page/escape.ts";
|
|
3
|
+
import { referenceHtml, sourceHtml, valueHtml } from "#page/metadataLinks.ts";
|
|
4
|
+
function criterionRow(reference, text, result, model) {
|
|
5
|
+
if (!referenceTarget(reference, model)) {
|
|
6
|
+
return `<li>${escapeHtml(text)} — criterion identity is ambiguous; evidence association unavailable.</li>`;
|
|
7
|
+
}
|
|
8
|
+
const claims = result.parsed.fields.evidence?.filter((claim) => claim.criterion === reference) ?? [];
|
|
9
|
+
const evidence = claims.length > 0
|
|
10
|
+
? `<p>${claims.length} recorded claim(s) in this result; not verified acceptance.</p><ul>${claims.map((claim) => `<li>${sourceHtml(claim.source, result.file, model)}<dl><dt>Checked Git revision (reported)</dt><dd>${valueHtml(claim.checkedRevision)}</dd><dt>Method</dt><dd>${valueHtml(claim.method)}</dd><dt>Outcome (reported)</dt><dd>${valueHtml(claim.outcome)}</dd><dt>Observed time</dt><dd>${valueHtml(claim.observedAt)}</dd></dl></li>`).join("")}</ul>`
|
|
11
|
+
: "<p>No recorded evidence in this result naming this criterion. Acceptance is not established.</p>";
|
|
12
|
+
return `<li>${referenceHtml(text, reference, model)}${evidence}</li>`;
|
|
13
|
+
}
|
|
14
|
+
function targetRow(target, result, model) {
|
|
15
|
+
const [id, criterion] = target.split("#");
|
|
16
|
+
const document = model.ids.get(id ?? "")?.[0];
|
|
17
|
+
if (!(document && referenceTarget(target, model))) {
|
|
18
|
+
return `<li>${referenceHtml(target, target, model)} — criteria unavailable.</li>`;
|
|
19
|
+
}
|
|
20
|
+
const criteria = (document.parsed.fields.criteria ?? []).filter((item) => !criterion || item.id === criterion);
|
|
21
|
+
const rows = criteria.length > 0
|
|
22
|
+
? `<ul>${criteria.map((item) => criterionRow(`${id}#${item.id}`, item.text, result, model)).join("")}</ul>`
|
|
23
|
+
: "<p>No criteria declared in this source.</p>";
|
|
24
|
+
return `<li>${referenceHtml(target, target, model)} · source status: ${valueHtml(document.parsed.fields.status)}${rows}</li>`;
|
|
25
|
+
}
|
|
26
|
+
export function resultCriteria(result, model) {
|
|
27
|
+
const targets = new Set(result.parsed.fields.relationships?.map((link) => link.target));
|
|
28
|
+
if (result.parsed.fields.id) {
|
|
29
|
+
targets.add(result.parsed.fields.id);
|
|
30
|
+
}
|
|
31
|
+
const rows = [...targets].map((target) => targetRow(target, result, model));
|
|
32
|
+
return `<section id="result-criteria"><h2>Criteria and this result’s claims</h2><p>Only explicit relationships and criterion references are associated. Missing provenance stays missing. Git revisions are authored records; Work Board does not compare them with the current checkout. Evidence freshness is unknown.</p>${rows.length > 0 ? `<ul>${rows.join("")}</ul>` : "<p>No explicitly linked work or criteria.</p>"}<p>${escapeHtml(result.file)} does not change the linked work’s status.</p></section>`;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=criteria.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"criteria.js","sourceRoot":"","sources":["../../src/results/criteria.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { MetadataDocument } from "#metadata/model.ts";
|
|
3
|
+
import type { RenderFailed } from "#render/failed.ts";
|
|
4
|
+
import type { Highlighter } from "#render/highlighter.ts";
|
|
5
|
+
import type { Snapshot } from "#search/snapshot.ts";
|
|
6
|
+
export declare const resultFeedback: (result: MetadataDocument, data: Snapshot) => Effect.Effect<string, RenderFailed, Highlighter>;
|
|
7
|
+
//# sourceMappingURL=feedback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/results/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,eAAO,MAAM,cAAc,gGAgCzB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { fileUrl } from "#files/url.ts";
|
|
3
|
+
import { escapeHtml } from "#page/escape.ts";
|
|
4
|
+
import { renderMarkdown } from "#render/markdown.ts";
|
|
5
|
+
import { readResponses } from "#responses/read.ts";
|
|
6
|
+
import { malformedResponse, questionFrom, revisionOf } from "#responses/records.ts";
|
|
7
|
+
export const resultFeedback = Effect.fn("WorkBoard.resultFeedback")(function* (result, data) {
|
|
8
|
+
const unknown = data.unavailable.length > 0
|
|
9
|
+
|| data.documents.some((document) => malformedResponse(document) || (document.parsed.fields.kind === "question" && !questionFrom(document)));
|
|
10
|
+
const questions = data.documents.flatMap((document) => {
|
|
11
|
+
const question = questionFrom(document);
|
|
12
|
+
return question && question.question.item === result.parsed.fields.id ? [question] : [];
|
|
13
|
+
});
|
|
14
|
+
const read = readResponses(Effect.succeed(data));
|
|
15
|
+
const readings = yield* Effect.forEach(questions, (question) => Effect.result(read(question.id)));
|
|
16
|
+
if (unknown || readings.some((reading) => reading._tag === "Failure")) {
|
|
17
|
+
return '<section id="result-feedback"><h2>Recorded human feedback</h2><p role="status">Response history is unknown or ambiguous. Unreadable records do not establish that no feedback exists. Read the source files before relying on it.</p></section>';
|
|
18
|
+
}
|
|
19
|
+
const current = revisionOf((result.parsed.raw ?? "") + result.parsed.body);
|
|
20
|
+
const records = readings.flatMap((reading) => reading._tag === "Success" ? reading.success.responses.map((response) => ({ question: reading.success.question, response })) : []);
|
|
21
|
+
records.sort((a, b) => b.response.response.recordedAt - a.response.response.recordedAt || a.response.id.localeCompare(b.response.id));
|
|
22
|
+
const bodies = yield* Effect.forEach(records, ({ question, response }) => Effect.gen(function* () {
|
|
23
|
+
const matching = question.question.reviewedRevision === current && question.question.source === result.file;
|
|
24
|
+
const responseFile = data.model.ids.get(response.id)?.[0]?.file ?? `responses/${response.id}.md`;
|
|
25
|
+
const questionFile = data.model.ids.get(question.id)?.[0]?.file ?? `responses/${question.id}.md`;
|
|
26
|
+
const body = yield* renderMarkdown(response.body, { file: responseFile, safe: true });
|
|
27
|
+
const selected = response.response.answers?.map((answer) => `${answer.prompt}: ${answer.selected.join(", ") || "text only"}`).join("; ");
|
|
28
|
+
return `<article id="${escapeHtml(response.id)}"><h3>${escapeHtml(response.response.author)} · ${escapeHtml(response.response.type)}</h3><p><b>${matching ? "Feedback on this exact result revision" : "Earlier or moved result context — does not apply automatically to this revision"}</b></p><p>Reviewed source: ${escapeHtml(question.question.source)} · SHA-256 <code>${question.question.reviewedRevision}</code></p>${selected ? `<p>Recorded option IDs: ${escapeHtml(selected)}. Labels and reasoning are recorded below.</p>` : ""}${response.response.supersedes ? `<p>Explicitly supersedes <a href="${fileUrl(data.model.ids.get(response.response.supersedes)?.[0]?.file ?? `responses/${response.response.supersedes}.md`)}">${escapeHtml(response.response.supersedes)}</a>.</p>` : ""}${body}<p><a href="${fileUrl(responseFile)}">Response source</a> · <a href="${fileUrl(questionFile)}">Registered reviewed context</a></p><details><summary>Exact reviewed result source</summary><pre>${escapeHtml(question.context)}</pre></details></article>`;
|
|
29
|
+
}));
|
|
30
|
+
return `<section id="result-feedback"><h2>Recorded human feedback</h2><p>Human direction is pinned to its reviewed report. Option IDs and authored acceptance text are not a computed verified-acceptance state. Completing a run or receiving feedback does not change work status.</p>${bodies.join("") || "<p>No readable response is recorded for this result.</p>"}</section>`;
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=feedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/results/feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Effect, type FileSystem, type Path, type PlatformError } from "effect";
|
|
2
|
+
import type { HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
|
|
3
|
+
import type { Changes } from "#files/changes.ts";
|
|
4
|
+
import type { Highlighter } from "#render/highlighter.ts";
|
|
5
|
+
import type { Snapshot } from "#search/snapshot.ts";
|
|
6
|
+
export declare function resultPage(index: Effect.Effect<Snapshot, unknown, FileSystem.FileSystem | Path.Path>, changes: Changes, home: string | undefined): (request: HttpServerRequest.HttpServerRequest) => Effect.Effect<HttpServerResponse.HttpServerResponse, PlatformError.PlatformError, FileSystem.FileSystem | Highlighter | Path.Path>;
|
|
7
|
+
//# sourceMappingURL=page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/results/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAChF,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAQjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAK1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAepD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,wLA2BhJ"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { fileUrl } from "#files/url.ts";
|
|
3
|
+
import { respond } from "#http/respond.ts";
|
|
4
|
+
import { escapeHtml } from "#page/escape.ts";
|
|
5
|
+
import { metadataHtml } from "#page/metadata.ts";
|
|
6
|
+
import { navHtml } from "#page/nav.ts";
|
|
7
|
+
import { shell } from "#page/shell.ts";
|
|
8
|
+
import { renderMarkdown } from "#render/markdown.ts";
|
|
9
|
+
import { revisionOf } from "#responses/records.ts";
|
|
10
|
+
import { resultCriteria } from "#results/criteria.ts";
|
|
11
|
+
import { resultFeedback } from "#results/feedback.ts";
|
|
12
|
+
function reviewActions(result) {
|
|
13
|
+
const requests = result.parsed.fields.attention ?? [];
|
|
14
|
+
const actions = requests
|
|
15
|
+
.filter((attention) => attention.kind === "review" && attention.state === "open" && requests.filter((other) => other.id === attention.id).length === 1)
|
|
16
|
+
.map((attention) => `<li><a href="/_board/respond?item=${encodeURIComponent(result.parsed.fields.id ?? "")}&request=${encodeURIComponent(attention.id)}">Review ${escapeHtml(attention.id)}</a> — ${escapeHtml(attention.reason)}</li>`);
|
|
17
|
+
return `<section id="result-actions"><h2>Respond to this report</h2>${actions.length > 0 ? `<ul>${actions.join("")}</ul>` : "<p>No unique open review request is declared. The agent can add an explicit attention review and Markdown question packet with ordinary file editing. Work Board does not infer one from status.</p>"}</section>`;
|
|
18
|
+
}
|
|
19
|
+
export function resultPage(index, changes, home) {
|
|
20
|
+
return Effect.fn("WorkBoard.resultPage")(function* (request) {
|
|
21
|
+
const item = new URL(request.url, "http://127.0.0.1").searchParams.get("item") ?? "";
|
|
22
|
+
const files = yield* changes.files;
|
|
23
|
+
function layout(body, status = 200) {
|
|
24
|
+
return respond(shell("Result review", navHtml(files, "", home), body, changes.realRoot, false, undefined, "result"), "text/html", status);
|
|
25
|
+
}
|
|
26
|
+
return yield* Effect.gen(function* () {
|
|
27
|
+
const data = yield* index;
|
|
28
|
+
const matches = data.model.ids.get(item);
|
|
29
|
+
const result = matches?.length === 1 ? matches[0] : undefined;
|
|
30
|
+
if (result?.parsed.fields.kind !== "result" || data.unavailable.length > 0) {
|
|
31
|
+
return layout('<h1>Result unavailable</h1><p role="status">Choose one uniquely identified, readable result. Missing or ambiguous work is not accepted.</p>', 409);
|
|
32
|
+
}
|
|
33
|
+
const report = yield* renderMarkdown(result.parsed.body, { file: result.file, safe: true });
|
|
34
|
+
const feedback = yield* resultFeedback(result, data);
|
|
35
|
+
const revision = revisionOf((result.parsed.raw ?? "") + result.parsed.body);
|
|
36
|
+
return layout(`<section class="response-panel"><h1>Review returned result · ${escapeHtml(item)}</h1><p>Result status (source): <b>${escapeHtml(result.parsed.fields.status ?? "Not recorded")}</b>. This is a supplied claim, not an execution receipt or work acceptance.</p><p>Current report SHA-256: <code>${revision}</code> · <a href="${fileUrl(result.file)}">Read source</a></p>${metadataHtml(result.parsed, result.file, data.model)}${reviewActions(result)}${resultCriteria(result, data.model)}<section id="result-report"><h2>Report, evidence and limitations</h2>${report}</section>${feedback}</section>`);
|
|
37
|
+
}).pipe(Effect.catch((error) => Effect.succeed(layout(`<h1>Result review unavailable</h1><p>${escapeHtml(String(error))}</p>`, 409))));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/results/page.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/rpc/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;;;;;AAU1C,qBAAa,UAAW,SAAQ,eAAmG;CAAG;
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/rpc/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;;;;;AAU1C,qBAAa,UAAW,SAAQ,eAAmG;CAAG;AAoDtI,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gEAAwG,CAAC;AAClI,eAAO,MAAM,SAAS;;;;;;;;;;;;qDAA2F,CAAC;AAClH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sDAA6E,CAAC"}
|
package/dist/rpc/contract.js
CHANGED
|
@@ -17,7 +17,7 @@ const PageUrl = Schema.String.check(Schema.isMaxLength(8192), Schema.makeFilter(
|
|
|
17
17
|
try {
|
|
18
18
|
const path = new URL(value, "http://127.0.0.1").pathname;
|
|
19
19
|
return (path === "/"
|
|
20
|
-
|| ["/_board/work", "/_board/overview", "/_board/changes", "/_board/start", "/_board/respond", "/_board/handoff"].includes(path)
|
|
20
|
+
|| ["/_board/work", "/_board/overview", "/_board/changes", "/_board/start", "/_board/respond", "/_board/handoff", "/_board/result"].includes(path)
|
|
21
21
|
|| /^\/_board\/item\/[^/]+\/$/u.exec(path) !== null
|
|
22
22
|
|| /\.md$/iu.exec(path) !== null
|
|
23
23
|
|| "Expected a local reading URL");
|
package/dist/rpc/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/rpc/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,yCAAyC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC,WAAW,EAAc,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;CAAG;AACtI,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAClC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EACxB,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE;IAC3B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,8BAA8B,CAAC;IACvC,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;QACzD,OAAO,CACN,IAAI,KAAK,GAAG;eACT,CAAC,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/rpc/contract.ts"],"names":[],"mappings":"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"}
|
package/dist/serve-cli.js
CHANGED
|
@@ -3,7 +3,7 @@ import { NodeRuntime, NodeServices } from "@effect/platform-node";
|
|
|
3
3
|
import { Effect, Layer, Option, Path } from "effect";
|
|
4
4
|
import { Argument, Command, Flag } from "effect/unstable/cli";
|
|
5
5
|
import { HOST, serveBoard } from "./serve.js";
|
|
6
|
-
const VERSION = "0.
|
|
6
|
+
const VERSION = "0.11.0";
|
|
7
7
|
const serve = Effect.fn("WorkBoard.serve")(function* (input) {
|
|
8
8
|
const path = yield* Path.Path;
|
|
9
9
|
return yield* Layer.launch(serveBoard({ home: Option.getOrUndefined(input.home), port: input.port, responses: input.responses, root: path.resolve(input.dir) }));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/work-board",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Serve a folder of markdown files as a live local page that updates in place when a file changes",
|
|
5
5
|
"homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/work-board#readme",
|
|
6
6
|
"bugs": {
|
package/src/board.ts
CHANGED
|
@@ -21,6 +21,7 @@ import type { RenderFailed } from "#render/failed.ts";
|
|
|
21
21
|
import { Highlighter } from "#render/highlighter.ts";
|
|
22
22
|
import { responsePage } from "#responses/page.ts";
|
|
23
23
|
import { responseService } from "#responses/service.ts";
|
|
24
|
+
import { resultPage } from "#results/page.ts";
|
|
24
25
|
import { server } from "#rpc/server.ts";
|
|
25
26
|
import { searchSnapshot } from "#search/snapshot.ts";
|
|
26
27
|
|
|
@@ -53,6 +54,8 @@ const routes = (options: BoardOptions) =>
|
|
|
53
54
|
const startPage = start(changes, home);
|
|
54
55
|
yield* serve("/_board/start", startPage);
|
|
55
56
|
const workPage = work(index, changes, home);
|
|
57
|
+
const result = resultPage(index, changes, home);
|
|
58
|
+
yield* serve("/_board/result", result);
|
|
56
59
|
const overviewPage = overview(index, changes, home);
|
|
57
60
|
const historyPage = changesPage(changes, home);
|
|
58
61
|
yield* serve("/_board/work", workPage);
|
|
@@ -88,6 +91,9 @@ const routes = (options: BoardOptions) =>
|
|
|
88
91
|
const pathname = new URL(url, "http://127.0.0.1").pathname;
|
|
89
92
|
let selected: ReturnType<typeof pages>;
|
|
90
93
|
switch (pathname) {
|
|
94
|
+
case "/_board/result":
|
|
95
|
+
selected = result(request);
|
|
96
|
+
break;
|
|
91
97
|
case "/_board/handoff":
|
|
92
98
|
selected = handoff(request);
|
|
93
99
|
break;
|
package/src/page/metadata.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { identityUrl } from "#metadata/links.ts";
|
|
2
2
|
import type { MetadataModel } from "#metadata/model.ts";
|
|
3
3
|
import type { ParsedMetadata } from "#metadata/parse.ts";
|
|
4
|
+
import { backlinksHtml } from "#page/backlinksHtml.ts";
|
|
5
|
+
import { escapeHtml } from "#page/escape.ts";
|
|
6
|
+
import { metadataDetails } from "#page/metadataDetails.ts";
|
|
4
7
|
import { stateOf, viewUrl } from "#views/state.ts";
|
|
5
|
-
import { backlinksHtml } from "./backlinksHtml.ts";
|
|
6
|
-
import { escapeHtml } from "./escape.ts";
|
|
7
|
-
import { metadataDetails } from "./metadataDetails.ts";
|
|
8
8
|
|
|
9
9
|
function handoffLink(id: string | undefined, kind: string | undefined, unique: boolean) {
|
|
10
10
|
return unique && id && !["question", "response", "handoff"].includes(kind ?? "")
|
|
@@ -12,6 +12,10 @@ function handoffLink(id: string | undefined, kind: string | undefined, unique: b
|
|
|
12
12
|
: "";
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
function resultLink(id: string | undefined, kind: string | undefined, unique: boolean) {
|
|
16
|
+
return unique && id && kind === "result" ? `<p><a href="/_board/result?item=${encodeURIComponent(id)}">Review returned result</a></p>` : "";
|
|
17
|
+
}
|
|
18
|
+
|
|
15
19
|
export function metadataHtml(parsed: ParsedMetadata, file: string, model: MetadataModel): string {
|
|
16
20
|
const backlinks = backlinksHtml(file, model);
|
|
17
21
|
const diagnostics = model.diagnostics.get(file) ?? parsed.diagnostics;
|
|
@@ -33,7 +37,7 @@ export function metadataHtml(parsed: ParsedMetadata, file: string, model: Metada
|
|
|
33
37
|
unique && fields.kind === "board" && fields.id
|
|
34
38
|
? `<p><a href="${escapeHtml(viewUrl(stateOf("/"), { board: fields.id }))}">View this board</a></p>`
|
|
35
39
|
: "";
|
|
36
|
-
return `<section class="work-meta" aria-label="Recorded work"><p class="metadata-summary">Recorded work · ${identity}${fields.status ? ` · ${escapeHtml(fields.status)}` : ""}${fields.owner ? ` · ${escapeHtml(fields.owner)}` : ""}</p>${fields.nextAction ? `<p>Next action: ${escapeHtml(fields.nextAction)}</p>` : ""}${boardLink}${handoffLink(fields.id, fields.kind, unique)}${problems}<details data-key="work-metadata"><summary>Work details and source</summary>${details}<p>Source: ${escapeHtml(file)}:${parsed.lines.id ?? 1}; prose starts at line ${parsed.bodyLine}.</p>${parsed.raw ? `<details data-key="frontmatter-source"><summary>Original frontmatter</summary><pre>${escapeHtml(parsed.raw)}</pre></details>` : ""}</details></section>${backlinks}`;
|
|
40
|
+
return `<section class="work-meta" aria-label="Recorded work"><p class="metadata-summary">Recorded work · ${identity}${fields.status ? ` · ${escapeHtml(fields.status)}` : ""}${fields.owner ? ` · ${escapeHtml(fields.owner)}` : ""}</p>${fields.nextAction ? `<p>Next action: ${escapeHtml(fields.nextAction)}</p>` : ""}${boardLink}${resultLink(fields.id, fields.kind, unique)}${handoffLink(fields.id, fields.kind, unique)}${problems}<details data-key="work-metadata"><summary>Work details and source</summary>${details}<p>Source: ${escapeHtml(file)}:${parsed.lines.id ?? 1}; prose starts at line ${parsed.bodyLine}.</p>${parsed.raw ? `<details data-key="frontmatter-source"><summary>Original frontmatter</summary><pre>${escapeHtml(parsed.raw)}</pre></details>` : ""}</details></section>${backlinks}`;
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
export const metadataStyles = `
|
|
@@ -88,7 +88,7 @@ document.addEventListener("click", (event) => {
|
|
|
88
88
|
const link = event.target.closest?.("a[href]");
|
|
89
89
|
if (!link || event.defaultPrevented || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey || link.hasAttribute("download") || (link.target && link.target !== "_self")) return;
|
|
90
90
|
const target = new URL(link.href, location.href);
|
|
91
|
-
if (target.origin !== location.origin || !(target.pathname === "/" || (target.pathname === "/_board/handoff" || target.pathname === "/_board/respond" || target.pathname === "/_board/start" || target.pathname === "/_board/changes" || target.pathname === "/_board/overview" || target.pathname === "/_board/work" || target.pathname.startsWith("/_board/item/")) || /\\.md$/i.test(target.pathname))) return;
|
|
91
|
+
if (target.origin !== location.origin || !(target.pathname === "/" || (target.pathname === "/_board/handoff", "/_board/result" || target.pathname === "/_board/respond" || target.pathname === "/_board/start" || target.pathname === "/_board/changes" || target.pathname === "/_board/overview" || target.pathname === "/_board/work" || target.pathname.startsWith("/_board/item/")) || /\\.md$/i.test(target.pathname))) return;
|
|
92
92
|
event.preventDefault();
|
|
93
93
|
navigate(target);
|
|
94
94
|
});
|
package/src/page/shell.ts
CHANGED
|
@@ -17,7 +17,7 @@ export const shell = (
|
|
|
17
17
|
workspace: string,
|
|
18
18
|
board: boolean,
|
|
19
19
|
identity?: string,
|
|
20
|
-
view: boolean | "overview" | "changes" | "start" | "response" | "handoff" = false,
|
|
20
|
+
view: boolean | "overview" | "changes" | "start" | "response" | "handoff" | "result" = false,
|
|
21
21
|
): string =>
|
|
22
22
|
[
|
|
23
23
|
`<!doctype html><html lang="en" data-workspace="${escapeHtml(workspace)}"><head><meta charset="utf-8">`,
|
|
@@ -65,6 +65,14 @@ Name the exact question and the choices. Do not imply that a response was record
|
|
|
65
65
|
source: `---
|
|
66
66
|
id: example.result
|
|
67
67
|
kind: result
|
|
68
|
+
# A supplied result status is not work acceptance or an execution receipt.
|
|
69
|
+
attention:
|
|
70
|
+
- id: review
|
|
71
|
+
kind: review
|
|
72
|
+
state: open
|
|
73
|
+
response_from: [maintainer]
|
|
74
|
+
reason: Review this exact report, its evidence and limitations.
|
|
75
|
+
unblocks: [example.project#readable-result]
|
|
68
76
|
relationships:
|
|
69
77
|
- kind: implements
|
|
70
78
|
target: example.investigation
|
|
@@ -98,6 +106,18 @@ Name failures, skipped checks, uncertainty and any response needed.
|
|
|
98
106
|
State the next action and who needs to respond, if known.
|
|
99
107
|
|
|
100
108
|
[Project and acceptance target](project.md)
|
|
109
|
+
|
|
110
|
+
::::question{id="verdict" select="one"}
|
|
111
|
+
### What should happen with this report?
|
|
112
|
+
|
|
113
|
+
:::option{id="revision"}
|
|
114
|
+
Request another revision and explain what is missing.
|
|
115
|
+
:::
|
|
116
|
+
|
|
117
|
+
:::option{id="accept"}
|
|
118
|
+
Accept this exact report version with its stated limitations.
|
|
119
|
+
:::
|
|
120
|
+
::::
|
|
101
121
|
`,
|
|
102
122
|
},
|
|
103
123
|
] as const;
|
package/src/page/style.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { attentionStyle } from "#attention/style.ts";
|
|
2
|
+
import { metadataStyles } from "#page/metadata.ts";
|
|
3
|
+
import { readingStyles } from "#page/readingStyles.ts";
|
|
4
|
+
import { searchStyles } from "#page/searchDialog.ts";
|
|
5
|
+
import { visualStyles } from "#page/visualDialog.ts";
|
|
6
|
+
import { layout, theme } from "#page/workspaceStyles.ts";
|
|
2
7
|
import { workStyle } from "#views/workStyle.ts";
|
|
3
|
-
import { metadataStyles } from "./metadata.ts";
|
|
4
|
-
import { readingStyles } from "./readingStyles.ts";
|
|
5
|
-
import { searchStyles } from "./searchDialog.ts";
|
|
6
|
-
import { visualStyles } from "./visualDialog.ts";
|
|
7
|
-
import { layout, theme } from "./workspaceStyles.ts";
|
|
8
8
|
|
|
9
9
|
const prose = `
|
|
10
10
|
h1, h2, h3, h4 { font-weight: 600; line-height: 1.25; margin: 1.6em 0 0.5em; }
|
|
@@ -98,4 +98,5 @@ export const style =
|
|
|
98
98
|
+ visualStyles
|
|
99
99
|
+ documents
|
|
100
100
|
+ ".response-panel fieldset, .questionnaire-reading { min-width: 0; border: 1px solid var(--border); border-radius: 12px; padding: 1rem; margin: 1rem 0; } .response-panel legend { font-weight: 650; } .response-panel .question-option { display: grid; grid-template-columns: 1.5rem minmax(0, 1fr); gap: .75rem; padding: 1rem; margin: .5rem 0; border: 1px solid var(--border); border-radius: 8px; } .response-panel .question-option:has(input:checked) { border-color: var(--link); background: var(--surface); } .response-panel .question-option input { width: 1.2rem; height: 1.2rem; margin-top: .2rem; accent-color: var(--link); } .response-panel .question-option label { font-weight: 650; cursor: pointer; } .response-panel .question-option p { margin-top: .5rem; } .response-panel #response-history article { border-top: 1px solid var(--border); margin-top: 1.5rem; padding-top: 1rem; } .response-context, .question-option, .response-panel fieldset { overflow-wrap: anywhere; }"
|
|
101
|
+
+ "[data-view=result] .response-panel { overflow-wrap: anywhere; } #result-criteria ul { padding-inline-start: 1.25rem; } #result-criteria dl { display: grid; grid-template-columns: minmax(0, 1fr); gap: .25rem; margin: .75rem 0; } #result-criteria dt { color: var(--muted); } #result-criteria dd { margin: 0 0 .5rem; min-width: 0; } #result-feedback article { border-top: 1px solid var(--border); margin-top: 1.5rem; padding-top: 1rem; }"
|
|
101
102
|
+ ".response-panel { max-width: 850px; margin: auto; padding: 1.5rem; } .response-panel form { display: grid; gap: 1rem; } .response-panel label { display: grid; gap: .5rem; } .response-panel input, .response-panel textarea, .response-panel select { width: 100%; box-sizing: border-box; font: inherit; background: var(--surface); color: inherit; padding: .75rem; border: 1px solid var(--border); } .response-panel pre, .response-panel code { white-space: pre-wrap; overflow-wrap: anywhere; }";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { referenceTarget } from "#metadata/links.ts";
|
|
2
|
+
import type { MetadataDocument, MetadataModel } from "#metadata/model.ts";
|
|
3
|
+
import { escapeHtml } from "#page/escape.ts";
|
|
4
|
+
import { referenceHtml, sourceHtml, valueHtml } from "#page/metadataLinks.ts";
|
|
5
|
+
|
|
6
|
+
function criterionRow(reference: string, text: string, result: MetadataDocument, model: MetadataModel): string {
|
|
7
|
+
if (!referenceTarget(reference, model)) {
|
|
8
|
+
return `<li>${escapeHtml(text)} — criterion identity is ambiguous; evidence association unavailable.</li>`;
|
|
9
|
+
}
|
|
10
|
+
const claims = result.parsed.fields.evidence?.filter((claim) => claim.criterion === reference) ?? [];
|
|
11
|
+
const evidence =
|
|
12
|
+
claims.length > 0
|
|
13
|
+
? `<p>${claims.length} recorded claim(s) in this result; not verified acceptance.</p><ul>${claims.map((claim) => `<li>${sourceHtml(claim.source, result.file, model)}<dl><dt>Checked Git revision (reported)</dt><dd>${valueHtml(claim.checkedRevision)}</dd><dt>Method</dt><dd>${valueHtml(claim.method)}</dd><dt>Outcome (reported)</dt><dd>${valueHtml(claim.outcome)}</dd><dt>Observed time</dt><dd>${valueHtml(claim.observedAt)}</dd></dl></li>`).join("")}</ul>`
|
|
14
|
+
: "<p>No recorded evidence in this result naming this criterion. Acceptance is not established.</p>";
|
|
15
|
+
return `<li>${referenceHtml(text, reference, model)}${evidence}</li>`;
|
|
16
|
+
}
|
|
17
|
+
function targetRow(target: string, result: MetadataDocument, model: MetadataModel): string {
|
|
18
|
+
const [id, criterion] = target.split("#");
|
|
19
|
+
const document = model.ids.get(id ?? "")?.[0];
|
|
20
|
+
if (!(document && referenceTarget(target, model))) {
|
|
21
|
+
return `<li>${referenceHtml(target, target, model)} — criteria unavailable.</li>`;
|
|
22
|
+
}
|
|
23
|
+
const criteria = (document.parsed.fields.criteria ?? []).filter((item) => !criterion || item.id === criterion);
|
|
24
|
+
const rows =
|
|
25
|
+
criteria.length > 0
|
|
26
|
+
? `<ul>${criteria.map((item) => criterionRow(`${id}#${item.id}`, item.text, result, model)).join("")}</ul>`
|
|
27
|
+
: "<p>No criteria declared in this source.</p>";
|
|
28
|
+
return `<li>${referenceHtml(target, target, model)} · source status: ${valueHtml(document.parsed.fields.status)}${rows}</li>`;
|
|
29
|
+
}
|
|
30
|
+
export function resultCriteria(result: MetadataDocument, model: MetadataModel): string {
|
|
31
|
+
const targets = new Set(result.parsed.fields.relationships?.map((link) => link.target));
|
|
32
|
+
if (result.parsed.fields.id) {
|
|
33
|
+
targets.add(result.parsed.fields.id);
|
|
34
|
+
}
|
|
35
|
+
const rows = [...targets].map((target) => targetRow(target, result, model));
|
|
36
|
+
return `<section id="result-criteria"><h2>Criteria and this result’s claims</h2><p>Only explicit relationships and criterion references are associated. Missing provenance stays missing. Git revisions are authored records; Work Board does not compare them with the current checkout. Evidence freshness is unknown.</p>${rows.length > 0 ? `<ul>${rows.join("")}</ul>` : "<p>No explicitly linked work or criteria.</p>"}<p>${escapeHtml(result.file)} does not change the linked work’s status.</p></section>`;
|
|
37
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { fileUrl } from "#files/url.ts";
|
|
3
|
+
import type { MetadataDocument } from "#metadata/model.ts";
|
|
4
|
+
import { escapeHtml } from "#page/escape.ts";
|
|
5
|
+
import type { RenderFailed } from "#render/failed.ts";
|
|
6
|
+
import type { Highlighter } from "#render/highlighter.ts";
|
|
7
|
+
import { renderMarkdown } from "#render/markdown.ts";
|
|
8
|
+
import { readResponses } from "#responses/read.ts";
|
|
9
|
+
import { malformedResponse, questionFrom, revisionOf } from "#responses/records.ts";
|
|
10
|
+
import type { Snapshot } from "#search/snapshot.ts";
|
|
11
|
+
|
|
12
|
+
export const resultFeedback = Effect.fn("WorkBoard.resultFeedback")(function* (
|
|
13
|
+
result: MetadataDocument,
|
|
14
|
+
data: Snapshot,
|
|
15
|
+
): Effect.fn.Return<string, RenderFailed, Highlighter> {
|
|
16
|
+
const unknown =
|
|
17
|
+
data.unavailable.length > 0
|
|
18
|
+
|| data.documents.some((document) => malformedResponse(document) || (document.parsed.fields.kind === "question" && !questionFrom(document)));
|
|
19
|
+
const questions = data.documents.flatMap((document) => {
|
|
20
|
+
const question = questionFrom(document);
|
|
21
|
+
return question && question.question.item === result.parsed.fields.id ? [question] : [];
|
|
22
|
+
});
|
|
23
|
+
const read = readResponses(Effect.succeed(data));
|
|
24
|
+
const readings = yield* Effect.forEach(questions, (question) => Effect.result(read(question.id)));
|
|
25
|
+
if (unknown || readings.some((reading) => reading._tag === "Failure")) {
|
|
26
|
+
return '<section id="result-feedback"><h2>Recorded human feedback</h2><p role="status">Response history is unknown or ambiguous. Unreadable records do not establish that no feedback exists. Read the source files before relying on it.</p></section>';
|
|
27
|
+
}
|
|
28
|
+
const current = revisionOf((result.parsed.raw ?? "") + result.parsed.body);
|
|
29
|
+
const records = readings.flatMap((reading) =>
|
|
30
|
+
reading._tag === "Success" ? reading.success.responses.map((response) => ({ question: reading.success.question, response })) : [],
|
|
31
|
+
);
|
|
32
|
+
records.sort((a, b) => b.response.response.recordedAt - a.response.response.recordedAt || a.response.id.localeCompare(b.response.id));
|
|
33
|
+
const bodies = yield* Effect.forEach(records, ({ question, response }) =>
|
|
34
|
+
Effect.gen(function* () {
|
|
35
|
+
const matching = question.question.reviewedRevision === current && question.question.source === result.file;
|
|
36
|
+
const responseFile = data.model.ids.get(response.id)?.[0]?.file ?? `responses/${response.id}.md`;
|
|
37
|
+
const questionFile = data.model.ids.get(question.id)?.[0]?.file ?? `responses/${question.id}.md`;
|
|
38
|
+
const body = yield* renderMarkdown(response.body, { file: responseFile, safe: true });
|
|
39
|
+
const selected = response.response.answers?.map((answer) => `${answer.prompt}: ${answer.selected.join(", ") || "text only"}`).join("; ");
|
|
40
|
+
return `<article id="${escapeHtml(response.id)}"><h3>${escapeHtml(response.response.author)} · ${escapeHtml(response.response.type)}</h3><p><b>${matching ? "Feedback on this exact result revision" : "Earlier or moved result context — does not apply automatically to this revision"}</b></p><p>Reviewed source: ${escapeHtml(question.question.source)} · SHA-256 <code>${question.question.reviewedRevision}</code></p>${selected ? `<p>Recorded option IDs: ${escapeHtml(selected)}. Labels and reasoning are recorded below.</p>` : ""}${response.response.supersedes ? `<p>Explicitly supersedes <a href="${fileUrl(data.model.ids.get(response.response.supersedes)?.[0]?.file ?? `responses/${response.response.supersedes}.md`)}">${escapeHtml(response.response.supersedes)}</a>.</p>` : ""}${body}<p><a href="${fileUrl(responseFile)}">Response source</a> · <a href="${fileUrl(questionFile)}">Registered reviewed context</a></p><details><summary>Exact reviewed result source</summary><pre>${escapeHtml(question.context)}</pre></details></article>`;
|
|
41
|
+
}),
|
|
42
|
+
);
|
|
43
|
+
return `<section id="result-feedback"><h2>Recorded human feedback</h2><p>Human direction is pinned to its reviewed report. Option IDs and authored acceptance text are not a computed verified-acceptance state. Completing a run or receiving feedback does not change work status.</p>${bodies.join("") || "<p>No readable response is recorded for this result.</p>"}</section>`;
|
|
44
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Effect, type FileSystem, type Path, type PlatformError } from "effect";
|
|
2
|
+
import type { HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
|
|
3
|
+
import type { Changes } from "#files/changes.ts";
|
|
4
|
+
import { fileUrl } from "#files/url.ts";
|
|
5
|
+
import { respond } from "#http/respond.ts";
|
|
6
|
+
import type { MetadataDocument } from "#metadata/model.ts";
|
|
7
|
+
import { escapeHtml } from "#page/escape.ts";
|
|
8
|
+
import { metadataHtml } from "#page/metadata.ts";
|
|
9
|
+
import { navHtml } from "#page/nav.ts";
|
|
10
|
+
import { shell } from "#page/shell.ts";
|
|
11
|
+
import type { Highlighter } from "#render/highlighter.ts";
|
|
12
|
+
import { renderMarkdown } from "#render/markdown.ts";
|
|
13
|
+
import { revisionOf } from "#responses/records.ts";
|
|
14
|
+
import { resultCriteria } from "#results/criteria.ts";
|
|
15
|
+
import { resultFeedback } from "#results/feedback.ts";
|
|
16
|
+
import type { Snapshot } from "#search/snapshot.ts";
|
|
17
|
+
|
|
18
|
+
function reviewActions(result: MetadataDocument) {
|
|
19
|
+
const requests = result.parsed.fields.attention ?? [];
|
|
20
|
+
const actions = requests
|
|
21
|
+
.filter(
|
|
22
|
+
(attention) => attention.kind === "review" && attention.state === "open" && requests.filter((other) => other.id === attention.id).length === 1,
|
|
23
|
+
)
|
|
24
|
+
.map(
|
|
25
|
+
(attention) =>
|
|
26
|
+
`<li><a href="/_board/respond?item=${encodeURIComponent(result.parsed.fields.id ?? "")}&request=${encodeURIComponent(attention.id)}">Review ${escapeHtml(attention.id)}</a> — ${escapeHtml(attention.reason)}</li>`,
|
|
27
|
+
);
|
|
28
|
+
return `<section id="result-actions"><h2>Respond to this report</h2>${actions.length > 0 ? `<ul>${actions.join("")}</ul>` : "<p>No unique open review request is declared. The agent can add an explicit attention review and Markdown question packet with ordinary file editing. Work Board does not infer one from status.</p>"}</section>`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function resultPage(index: Effect.Effect<Snapshot, unknown, FileSystem.FileSystem | Path.Path>, changes: Changes, home: string | undefined) {
|
|
32
|
+
return Effect.fn("WorkBoard.resultPage")(function* (
|
|
33
|
+
request: HttpServerRequest.HttpServerRequest,
|
|
34
|
+
): Effect.fn.Return<HttpServerResponse.HttpServerResponse, PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | Highlighter> {
|
|
35
|
+
const item = new URL(request.url, "http://127.0.0.1").searchParams.get("item") ?? "";
|
|
36
|
+
const files = yield* changes.files;
|
|
37
|
+
function layout(body: string, status = 200) {
|
|
38
|
+
return respond(shell("Result review", navHtml(files, "", home), body, changes.realRoot, false, undefined, "result"), "text/html", status);
|
|
39
|
+
}
|
|
40
|
+
return yield* Effect.gen(function* () {
|
|
41
|
+
const data = yield* index;
|
|
42
|
+
const matches = data.model.ids.get(item);
|
|
43
|
+
const result = matches?.length === 1 ? matches[0] : undefined;
|
|
44
|
+
if (result?.parsed.fields.kind !== "result" || data.unavailable.length > 0) {
|
|
45
|
+
return layout(
|
|
46
|
+
'<h1>Result unavailable</h1><p role="status">Choose one uniquely identified, readable result. Missing or ambiguous work is not accepted.</p>',
|
|
47
|
+
409,
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
const report = yield* renderMarkdown(result.parsed.body, { file: result.file, safe: true });
|
|
51
|
+
const feedback = yield* resultFeedback(result, data);
|
|
52
|
+
const revision = revisionOf((result.parsed.raw ?? "") + result.parsed.body);
|
|
53
|
+
return layout(
|
|
54
|
+
`<section class="response-panel"><h1>Review returned result · ${escapeHtml(item)}</h1><p>Result status (source): <b>${escapeHtml(result.parsed.fields.status ?? "Not recorded")}</b>. This is a supplied claim, not an execution receipt or work acceptance.</p><p>Current report SHA-256: <code>${revision}</code> · <a href="${fileUrl(result.file)}">Read source</a></p>${metadataHtml(result.parsed, result.file, data.model)}${reviewActions(result)}${resultCriteria(result, data.model)}<section id="result-report"><h2>Report, evidence and limitations</h2>${report}</section>${feedback}</section>`,
|
|
55
|
+
);
|
|
56
|
+
}).pipe(Effect.catch((error) => Effect.succeed(layout(`<h1>Result review unavailable</h1><p>${escapeHtml(String(error))}</p>`, 409))));
|
|
57
|
+
});
|
|
58
|
+
}
|
package/src/rpc/contract.ts
CHANGED
|
@@ -20,7 +20,9 @@ const PageUrl = Schema.String.check(
|
|
|
20
20
|
const path = new URL(value, "http://127.0.0.1").pathname;
|
|
21
21
|
return (
|
|
22
22
|
path === "/"
|
|
23
|
-
|| ["/_board/work", "/_board/overview", "/_board/changes", "/_board/start", "/_board/respond", "/_board/handoff"].includes(
|
|
23
|
+
|| ["/_board/work", "/_board/overview", "/_board/changes", "/_board/start", "/_board/respond", "/_board/handoff", "/_board/result"].includes(
|
|
24
|
+
path,
|
|
25
|
+
)
|
|
24
26
|
|| /^\/_board\/item\/[^/]+\/$/u.exec(path) !== null
|
|
25
27
|
|| /\.md$/iu.exec(path) !== null
|
|
26
28
|
|| "Expected a local reading URL"
|
package/src/serve-cli.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { Effect, Layer, Option, Path } from "effect";
|
|
|
4
4
|
import { Argument, Command, Flag } from "effect/unstable/cli";
|
|
5
5
|
import { HOST, serveBoard } from "./serve.ts";
|
|
6
6
|
|
|
7
|
-
const VERSION = "0.
|
|
7
|
+
const VERSION = "0.11.0";
|
|
8
8
|
|
|
9
9
|
const serve = Effect.fn("WorkBoard.serve")(function* (input: {
|
|
10
10
|
readonly dir: string;
|