@shivaedev/work-board 0.14.2 → 0.15.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 +20 -0
- package/README.md +1 -1
- package/assets/agent.js +1 -1
- package/assets/native.js +25 -25
- package/assets/react.js +38 -37
- package/dist/browser/diagnostics/schema.d.ts +15 -12
- package/dist/browser/diagnostics/schema.d.ts.map +1 -1
- package/dist/browser/diagnostics/schema.js +12 -2
- package/dist/browser/diagnostics/schema.js.map +1 -1
- package/dist/browser/views/remaining.d.ts +20 -12
- package/dist/browser/views/remaining.d.ts.map +1 -1
- package/dist/client/client.d.ts +1 -0
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +1 -1
- package/dist/client/client.js.map +1 -1
- package/dist/client/formStatus.d.ts +12 -0
- package/dist/client/formStatus.d.ts.map +1 -0
- package/dist/client/formStatus.js +27 -0
- package/dist/client/formStatus.js.map +1 -0
- package/dist/client/react/BoardShell.d.ts.map +1 -1
- package/dist/client/react/BoardShell.js +15 -21
- package/dist/client/react/BoardShell.js.map +1 -1
- package/dist/client/react/DocumentContext.d.ts.map +1 -1
- package/dist/client/react/DocumentContext.js +6 -3
- package/dist/client/react/DocumentContext.js.map +1 -1
- package/dist/client/react/FormContext.d.ts +5 -0
- package/dist/client/react/FormContext.d.ts.map +1 -0
- package/dist/client/react/FormContext.js +10 -0
- package/dist/client/react/FormContext.js.map +1 -0
- package/dist/client/react/LiveControls.d.ts +4 -3
- package/dist/client/react/LiveControls.d.ts.map +1 -1
- package/dist/client/react/LiveControls.js +5 -19
- package/dist/client/react/LiveControls.js.map +1 -1
- package/dist/client/react/MainLocationContext.d.ts +3 -0
- package/dist/client/react/MainLocationContext.d.ts.map +1 -0
- package/dist/client/react/MainLocationContext.js +7 -0
- package/dist/client/react/MainLocationContext.js.map +1 -0
- package/dist/client/react/ProjectionFrame.d.ts +1 -2
- package/dist/client/react/ProjectionFrame.d.ts.map +1 -1
- package/dist/client/react/ProjectionFrame.js +10 -4
- package/dist/client/react/ProjectionFrame.js.map +1 -1
- package/dist/client/react/ReadingLibrary.d.ts.map +1 -1
- package/dist/client/react/ReadingLibrary.js +7 -8
- package/dist/client/react/ReadingLibrary.js.map +1 -1
- package/dist/client/react/SystemPage.d.ts.map +1 -1
- package/dist/client/react/SystemPage.js +2 -1
- package/dist/client/react/SystemPage.js.map +1 -1
- package/dist/client/react/TodayOptions.d.ts.map +1 -1
- package/dist/client/react/TodayOptions.js +23 -14
- package/dist/client/react/TodayOptions.js.map +1 -1
- package/dist/client/react/VisualViewer.d.ts.map +1 -1
- package/dist/client/react/VisualViewer.js +6 -5
- package/dist/client/react/VisualViewer.js.map +1 -1
- package/dist/client/react/boardRouter.d.ts +3 -2
- package/dist/client/react/boardRouter.d.ts.map +1 -1
- package/dist/client/react/boardRouter.js +2 -1
- package/dist/client/react/boardRouter.js.map +1 -1
- package/dist/client/react/createResponse.d.ts +32 -4
- package/dist/client/react/createResponse.d.ts.map +1 -1
- package/dist/client/react/createResponse.js +7 -28
- package/dist/client/react/createResponse.js.map +1 -1
- package/dist/client/react/diagnosticsValues.d.ts.map +1 -1
- package/dist/client/react/diagnosticsValues.js +5 -7
- package/dist/client/react/diagnosticsValues.js.map +1 -1
- package/dist/client/react/entry.d.ts.map +1 -1
- package/dist/client/react/entry.js +2 -34
- package/dist/client/react/entry.js.map +1 -1
- package/dist/client/react/githubLimited.d.ts +3 -0
- package/dist/client/react/githubLimited.d.ts.map +1 -0
- package/dist/client/react/githubLimited.js +4 -0
- package/dist/client/react/githubLimited.js.map +1 -0
- package/dist/client/react/loadProjection.d.ts +135 -135
- package/dist/client/react/loadRemaining.d.ts +37 -29
- package/dist/client/react/loadRemaining.d.ts.map +1 -1
- package/dist/client/react/mainLocation.d.ts +4 -2
- package/dist/client/react/mainLocation.d.ts.map +1 -1
- package/dist/client/react/mainLocation.js +1 -8
- package/dist/client/react/mainLocation.js.map +1 -1
- package/dist/client/react/mountBoard.d.ts +3 -0
- package/dist/client/react/mountBoard.d.ts.map +1 -0
- package/dist/client/react/mountBoard.js +45 -0
- package/dist/client/react/mountBoard.js.map +1 -0
- package/dist/client/react/navigationLocation.d.ts +1 -1
- package/dist/client/react/navigationLocation.d.ts.map +1 -1
- package/dist/client/react/navigationLocation.js +1 -1
- package/dist/client/react/navigationLocation.js.map +1 -1
- package/dist/client/react/retryPage.d.ts +2 -1
- package/dist/client/react/retryPage.d.ts.map +1 -1
- package/dist/client/react/retryPage.js +3 -4
- package/dist/client/react/retryPage.js.map +1 -1
- package/dist/client/react/useBoardNavigation.d.ts.map +1 -1
- package/dist/client/react/useBoardNavigation.js +18 -8
- package/dist/client/react/useBoardNavigation.js.map +1 -1
- package/dist/client/react/useDocumentPage.d.ts +1 -1
- package/dist/client/react/useDocumentPage.d.ts.map +1 -1
- package/dist/client/react/useDocumentPage.js +9 -6
- package/dist/client/react/useDocumentPage.js.map +1 -1
- package/dist/client/react/useHandoffForm.d.ts +56 -30
- package/dist/client/react/useHandoffForm.d.ts.map +1 -1
- package/dist/client/react/useHandoffForm.js +19 -30
- package/dist/client/react/useHandoffForm.js.map +1 -1
- package/dist/client/react/useResponseForm.d.ts +72 -43
- package/dist/client/react/useResponseForm.d.ts.map +1 -1
- package/dist/client/react/useResponseForm.js +20 -17
- package/dist/client/react/useResponseForm.js.map +1 -1
- package/dist/client/react/visualSources.d.ts.map +1 -1
- package/dist/client/react/visualSources.js +10 -8
- package/dist/client/react/visualSources.js.map +1 -1
- package/dist/client/saveFailure.d.ts +8 -0
- package/dist/client/saveFailure.d.ts.map +1 -0
- package/dist/client/saveFailure.js +8 -0
- package/dist/client/saveFailure.js.map +1 -0
- package/dist/diagnostics/daemonContract.d.ts +65 -38
- package/dist/diagnostics/daemonContract.d.ts.map +1 -1
- package/dist/diagnostics/daemonContract.js +2 -1
- package/dist/diagnostics/daemonContract.js.map +1 -1
- package/dist/diagnostics/health.d.ts +10 -0
- package/dist/diagnostics/health.d.ts.map +1 -1
- package/dist/diagnostics/health.js +2 -0
- package/dist/diagnostics/health.js.map +1 -1
- package/dist/diagnostics/source.d.ts +55 -36
- package/dist/diagnostics/source.d.ts.map +1 -1
- package/dist/diagnostics/source.js +1 -2
- package/dist/diagnostics/source.js.map +1 -1
- package/dist/rpc/contract.d.ts +60 -36
- package/dist/rpc/contract.d.ts.map +1 -1
- package/dist/server/diagnostics/daemon.d.ts +41 -25
- package/dist/server/diagnostics/daemon.d.ts.map +1 -1
- package/dist/server/diagnostics/fleetHealth.d.ts +10 -0
- package/dist/server/diagnostics/fleetHealth.d.ts.map +1 -1
- package/dist/server/diagnostics/githubLimits.d.ts +12 -13
- package/dist/server/diagnostics/githubLimits.d.ts.map +1 -1
- package/dist/server/diagnostics/githubLimits.js +6 -6
- package/dist/server/diagnostics/githubLimits.js.map +1 -1
- package/dist/server/integration/diagnostics.d.ts +74 -38
- package/dist/server/integration/diagnostics.d.ts.map +1 -1
- package/dist/server/mcp/client.d.ts +20 -12
- package/dist/server/mcp/client.d.ts.map +1 -1
- package/dist/server/mcp/queries.d.ts +60 -36
- package/dist/server/mcp/queries.d.ts.map +1 -1
- package/dist/server/metadata/fields.js +1 -1
- package/dist/server/metadata/fields.js.map +1 -1
- package/dist/server/packageInfo.d.ts +1 -1
- package/dist/server/packageInfo.js +1 -1
- package/dist/server/views/remainingQueries.d.ts +20 -12
- package/dist/server/views/remainingQueries.d.ts.map +1 -1
- package/package.json +7 -6
- package/src/browser/diagnostics/schema.ts +12 -2
- package/src/client/client.ts +2 -1
- package/src/client/formStatus.ts +35 -0
- package/src/client/react/BoardShell.tsx +19 -26
- package/src/client/react/DocumentContext.tsx +6 -3
- package/src/client/react/FormContext.ts +13 -0
- package/src/client/react/LiveControls.tsx +5 -25
- package/src/client/react/MainLocationContext.ts +8 -0
- package/src/client/react/ProjectionFrame.tsx +13 -5
- package/src/client/react/ReadingLibrary.tsx +7 -8
- package/src/client/react/SystemPage.tsx +2 -1
- package/src/client/react/TodayOptions.tsx +40 -33
- package/src/client/react/VisualViewer.tsx +6 -6
- package/src/client/react/boardRouter.ts +3 -2
- package/src/client/react/createResponse.ts +10 -35
- package/src/client/react/diagnosticsValues.tsx +20 -12
- package/src/client/react/entry.tsx +2 -37
- package/src/client/react/githubLimited.ts +5 -0
- package/src/client/react/mainLocation.ts +5 -8
- package/src/client/react/mountBoard.tsx +49 -0
- package/src/client/react/navigationLocation.ts +2 -2
- package/src/client/react/retryPage.ts +4 -4
- package/src/client/react/useBoardNavigation.ts +20 -8
- package/src/client/react/useDocumentPage.ts +12 -6
- package/src/client/react/useHandoffForm.ts +25 -33
- package/src/client/react/useResponseForm.ts +20 -18
- package/src/client/react/visualSources.ts +10 -8
- package/src/client/saveFailure.ts +14 -0
- package/src/diagnostics/daemonContract.ts +2 -1
- package/src/diagnostics/health.ts +2 -0
- package/src/diagnostics/source.ts +1 -2
- package/src/server/diagnostics/githubLimits.ts +9 -11
- package/src/server/metadata/fields.ts +1 -1
- package/src/server/packageInfo.ts +1 -1
- package/dist/client/handoffs/failureStatus.d.ts +0 -2
- package/dist/client/handoffs/failureStatus.d.ts.map +0 -1
- package/dist/client/handoffs/failureStatus.js +0 -7
- package/dist/client/handoffs/failureStatus.js.map +0 -1
- package/dist/client/responses/failure.d.ts +0 -5
- package/dist/client/responses/failure.d.ts.map +0 -1
- package/dist/client/responses/failure.js +0 -13
- package/dist/client/responses/failure.js.map +0 -1
- package/dist/server/diagnostics/readCommand.d.ts +0 -4
- package/dist/server/diagnostics/readCommand.d.ts.map +0 -1
- package/dist/server/diagnostics/readCommand.js +0 -20
- package/dist/server/diagnostics/readCommand.js.map +0 -1
- package/src/client/handoffs/failureStatus.ts +0 -6
- package/src/client/responses/failure.ts +0 -13
- package/src/server/diagnostics/readCommand.ts +0 -24
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.15.0 - 2026-10-17
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Browser clients expose their AtomRpc runtime for typed form commands.
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- The diagnostics contract declares a typed `ServiceUnavailable` rejection for `daemon.fleetItems`, so Board returns an unavailable Fleet items projection with a reason when the daemon rejects the read.
|
|
12
|
+
- Board treats a `fleet-priority` frontmatter field as Fleet-owned, like `fleet-launch` and `fleet-deliverable`, so a task carrying it reads without an unknown-field diagnostic and keeps the field in its source.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- Answer and handoff forms retain typed save rejections and use the current session client after page restoration, keeping drafts and retry identities intact.
|
|
17
|
+
- System shows the GitHub rate limits Fleet recorded from its own responses, one row per resource with its observation age and any active rate-limit wait or pause below Fleet's 20% reserve, instead of reading `/rate_limit` itself.
|
|
18
|
+
|
|
19
|
+
### Breaking
|
|
20
|
+
|
|
21
|
+
- `GithubLimits` is an array of per-resource observations (`limit`, `remaining`, `used`, `reset`, `resource`, `observedAt`, `limitedUntil`, `limitedBy`), and `FleetHealth` gains an optional `github` field carrying them. `githubLimits(fleet)` reads them from a Fleet health source instead of running `gh api rate_limit`. Release together with `@shivaedev/work-fleet`.
|
|
22
|
+
|
|
3
23
|
## 0.14.2 - 2026-10-17
|
|
4
24
|
|
|
5
25
|
### Fixed
|
package/README.md
CHANGED
|
@@ -165,7 +165,7 @@ Back restores selected text and expanded details. Reading history opens a bounde
|
|
|
165
165
|
|
|
166
166
|
**Work** opens on **Now**: fixed Queued, Executing, Reviewing, Delivering, Waiting on a person, and collapsed Done in the last 7 days lanes. Fleet stages set the lane even when the source still says `planned`; reviewing, repairing and validating share Reviewing. Lanes hold tasks only. Every available Fleet stage takes precedence over authored status, including prepared and human-waiting work whose source is inactive. Without a matching Fleet item, authored superseded, deferred, cancelled, done and completed items stay outside Now. Done includes only recent Fleet completions. Queued holds prepared tasks or approved tasks waiting to start, never unapproved planned work. Cards show one Fleet-derived StatusChip and show the holder, PR link and time in stage only when known. When Fleet is unavailable, lanes use authored status and disclose the fallback. Saved views and filters sit behind **Filter**, collapsed by default on Now. Completed work with no known completion time is available through **All work**. All work keeps status columns in a fixed order; **Table** uses the chosen row sort. Decisions, questions, responses, results and request receipts remain readable in their source views and stay outside these work lists. Lists over 200 rows render a moving window inside bounded scrolling lanes or a table. `src/client/react/WorkNow.dom.test.tsx`, `workRecords.dom.spec.tsx` and `workScale.dom.spec.tsx` cover these projections and the rendered row bound with a 1,500-item fixture.
|
|
167
167
|
|
|
168
|
-
**System** in the sidebar reads Codex usage windows labelled by duration, GitHub
|
|
168
|
+
**System** in the sidebar reads Codex usage windows labelled by duration, the GitHub rate limits Fleet recorded from its own responses, and Fleet health through the Fleet daemon's `daemon.diagnostics` HTTP RPC query at `127.0.0.1:3457`. Set `--fleet-port <port>` or `BoardOptions.fleetPort` to select another daemon port. A stopped daemon leaves System available with an explicit unavailable state and a start command; the next refresh retries. Board does not start provider commands or read Fleet's database or health file. The daemon reads Codex with its existing CLI authentication and caches that observation for one minute across Board clients. GitHub figures come from the rate-limit headers of Fleet's own GitHub responses, one row per resource with its observation age and any active rate-limit wait or pause below Fleet's 20% reserve; Board makes no GitHub call. Each source reports its missing configuration or error independently.
|
|
169
169
|
|
|
170
170
|
The view refreshes through `client.api.diagnostics.query()` every 15 seconds while visible. Pause updates holds the displayed state; resume and returning to a visible tab refresh it. The shared `DiagnosticsContract` and `DiagnosticsSnapshot` schemas live in `@shivaedev/work-board/diagnostics/daemonContract.ts`; the version 2 `FleetHealth` schema lives in `@shivaedev/work-board/diagnostics/health.ts`. The Fleet lane lists every running or waiting item from `client.api.fleetItems.query()` by source title, stage and recorded PR, with explicit loading, unavailable and empty states. Items without readable source retain their work ID; missing PRs remain explicit. The page also shows the publisher's observation time, freshness, running and queued counts and waiting counts for maintainer, orchestrator and automation, concurrency cap, last scheduler pass and last observed provider capacity rejection. Stale snapshots show a Stale badge. Reset times show relative time and the browser’s local clock; System requires JavaScript. Communication failures and API-key accounts explain why their data is unavailable. A publisher clock ahead of Board is disclosed; absent scheduler/rejection observations remain unknown or unobserved.
|
|
171
171
|
|
package/assets/agent.js
CHANGED
|
@@ -28,6 +28,6 @@ ${t}}`),n},Kx="~effect/Fiber",A1={_A:R,_E:R},v1={id:0},H0=(()=>{try{return globa
|
|
|
28
28
|
`,a),i=[];for(;c!==-1;){CD(c-a,t)&&o(t);let f=n.slice(a,c);a=c+1;try{i.push(JSON.parse(f))}catch{}c=n.indexOf(`
|
|
29
29
|
`,a)}return n=n.slice(a),CD(n.length,t)&&o(t),i},encode:s=>{if(Array.isArray(s)){if(s.length===0)return;let a="";for(let c=0;c<s.length;c++)a+=JSON.stringify(s[c])+`
|
|
30
30
|
`;return a}return JSON.stringify(s)+`
|
|
31
|
-
`}}}})},UK=NK();var ane=16*1024*1024;var kD=rA(Li)(UK);var AD=e=>He(()=>{let t=new Set,r=new Map,n=new Map,o=(s,a)=>Ao(c=>{let i=r.get(s);return i||(i=[],r.set(s,i)),i.push([a,c]),me});return _e(e((s,a)=>{let c=n.get(s);return c?c(a):o(s,a)},t),s=>({...s,run(a,c){return tr(function*(){t.add(a),n.set(a,c);let i=r.get(a);if(i){r.delete(a);for(let[f,u]of i)yield*Ur(He(()=>c(f)),u)}return yield*vo(ns,()=>(t.delete(a),n.delete(a),me))})}}))});var DK=e=>un(e,"RpcClientError"),LK=0,$K=Fr(function*(e,t){let r=t.spanPrefix,n=t?.supportsAck??!0,o=t?.disableTracing??!1,s=t?.generateRequestId??(()=>LK++),a=yield*hn(),c=Ke(a,Xs),i=new Map,f=!1;yield*Ac(c,dn(g=>(f=!0,u($k(g.id)))));let u=Fr(function*(g){for(let[v,w]of i)i.delete(v),w._tag==="Queue"?yield*g._tag==="Success"?uI(w.queue):qa(w.queue,g.cause):w.resume(g)}),l=g=>{let v=JI(g.successSchema),w=x(g);return(d,S)=>{let b=S?.headers?Sn(S.headers):Wc,T=S?.context??St();if(!v){let D=Z=>m(g,w,Z,g.payloadSchema.make(d),b,T,S?.discard??!1);return o?D(void 0):tf(HI(r,g._tag),{kind:"client",attributes:zI(g._tag,t.spanAttributes)},D)}let P=h(g,w,g.payloadSchema.make(d),b,S?.streamBufferSize??16,T);return S?.asQueue?P:mI(_e(P,vF))}},m=(g,v,w,d,S,b,T)=>dn(P=>{if(f)return ef;let D=s(),Z=v(de=>t.onFromClient({message:de,context:b,discard:T}),{_tag:"Request",id:D,tag:g._tag,payload:d,...w?{traceId:w.traceId,spanId:w.spanId,sampled:w.sampled}:{},headers:IS(P.getRef(vD),S)});if(T)return Z;let se;return Lc(Ht(de=>{let Re={_tag:"Effect",rpc:g,context:b,resume(Er){de(Er),se&&!se.pollUnsafe()&&P.currentDispatcher.scheduleTask(()=>{se.interruptUnsafe(P.id)},0)}};i.set(D,Re),se=Z.pipe(w?$c(w,{captureStackTrace:!1}):R,Bc(P.context)),se.addObserver(Er=>{if(Er._tag==="Failure")return de(Er)})}),de=>(i.delete(D),mn(HU(se),E(D,Array.from(de),b))))}),h=Fr(function*(g,v,w,d,S,b){if(f)return yield*ef;let T=o?void 0:yield*Oy(HI(r,g._tag),{kind:"client",attributes:zI(g._tag,t.spanAttributes)}),P=Xm(),D=s(),Z=$n(P.context,Xs),se=yield*cI(S);return yield*Yp(Z,de=>(eF(se),i.has(D)?(i.delete(D),E(D,_u(de)?Array.from(Nk(de.cause)):[],b)):me)),i.set(D,{_tag:"Queue",rpc:g,queue:se,scope:Z,context:b}),yield*v(de=>t.onFromClient({message:de,context:b,discard:!1}),{_tag:"Request",id:D,tag:g._tag,payload:w,...T?{traceId:T.traceId,spanId:T.spanId,sampled:T.sampled}:{},headers:IS(P.getRef(vD),d)}).pipe(T?$c(T,{captureStackTrace:!1}):R,Kn(de=>qa(se,de)),md,ca(Z,{startImmediately:!0})),se}),x=g=>{let v=[];for(let w of g.middlewares.values()){let d=go(a,`${w.key}/Client`);d&&v.push(d)}return v.length===0?(w,d)=>w(d):function w(d,S,b=v.length-1){return b===-1?d(S):v[b]({rpc:g,request:S,next(T){return w(d,T,b-1)}})}},E=(g,v,w)=>Ht(d=>{let S=Xm();t.onFromClient({message:{_tag:"Interrupt",requestId:g,interruptors:v},context:w,discard:!1}).pipe(wy(1e3),Bc(S.context)).addObserver(()=>{d(me)})}),y=g=>{switch(g._tag){case"Chunk":{let v=g.requestId,w=i.get(v);return!w||w._tag!=="Queue"?me:iI(w.queue,g.values).pipe(n?Q(()=>t.onFromClient({message:{_tag:"Ack",requestId:g.requestId},context:w.context,discard:!1})):R,vt(d=>qa(w.queue,d)))}case"Exit":{let v=g.requestId,w=i.get(v);return w?(i.delete(v),w._tag==="Effect"?(w.resume(g.exit),me):g.exit._tag==="Success"?uI(w.queue):qa(w.queue,g.exit.cause)):me}case"Defect":return u(Lk(g.defect));case"ClientEnd":return me}},C;if(t.flatten){let g=new Map;C=function(w,d,S){let b=g.get(w);return b||(b=l(e.requests.get(w)),g.set(w,b)),b(d,S)}}else C={},e.requests.forEach(g=>{M(C,g._tag,l(g))});return{client:C,write:y}}),BK=0,OD=Fr(function*(e,t){let r=BK++,{codecFor:n,run:o,send:s,supportsAck:a,supportsTransferables:c}=yield*vl,i=qK(n),f=Db(n(gt())),u=new Map,l=x=>u.has(x)?(u.delete(x),s(r,{_tag:"Interrupt",requestId:x})):me,{client:m,write:h}=yield*$K(e,{...t,supportsAck:a,onFromClient({message:x}){switch(x._tag){case"Request":{let E=e.requests.get(x.tag),y=c?bD():void 0,C=Xm(),g={rpc:E,context:y?dt(C.context,wl,y):C.context,schemas:i(E)};return u.set(x.id,g),g.schemas.encodePayload(x.payload).pipe(Ur(g.context),Ku,Q(v=>s(r,{...x,id:x.id,payload:v,headers:Object.entries(x.headers)},y&&y.readUnsafe())))}case"Ack":return u.get(x.requestId)?s(r,{_tag:"Ack",requestId:x.requestId}):me;case"Interrupt":return l(x.requestId);case"Eof":return me}}});return yield*o(r,x=>{switch(x._tag){case"Chunk":{let E=XI(x.requestId),y=u.get(E);if(!y||qe(y.schemas.decodeChunk))return me;let C=y.schemas.decodeChunk.value;return cs(g=>g(C(x.values).pipe(Ur(y.context),Ku,Q(v=>h({_tag:"Chunk",clientId:0,requestId:E,values:v})))).pipe(Kn(v=>h({_tag:"Exit",clientId:0,requestId:E,exit:er(v)}).pipe(mn(kc(v)?me:Ty(l(E))))),Ey(v=>!kc(v),()=>me)))}case"Exit":{let E=XI(x.requestId),y=u.get(E);return y?(u.delete(E),y.schemas.decodeExit(x.exit).pipe(Ur(y.context),Ku,ko({onSuccess:C=>h({_tag:"Exit",clientId:0,requestId:E,exit:C}),onFailure:C=>h({_tag:"Exit",clientId:0,requestId:E,exit:er(C)})}))):me}case"Defect":return h({_tag:"Defect",clientId:0,defect:f(x.defect)});case"ClientProtocolError":{let E=Pr(x.error);return ju(Array.from(u.keys()),y=>h({_tag:"Exit",clientId:0,requestId:y,exit:E}))}default:return me}}).pipe(vt(gd),md,rf),m}),qK=e=>{let t=new WeakMap;return r=>{let n=t.get(r);if(n!==void 0)return n;let o=Eh(r.successSchema);return n={decodeChunk:Bs(o,s=>Ma(e(Oi(s.success)))),encodePayload:Lb(e(r.payloadSchema)),decodeExit:Ma(e(QI(r)))},t.set(r,n),n}},vD=ce("effect/rpc/RpcClient/CurrentHeaders",{defaultValue:()=>Wc});var vl=class extends at()("effect/rpc/RpcClient/Protocol"){static make=AD},jK=e=>vl.make(Fr(function*(t){let r=yield*Li,n=r.includesFraming,o=f=>new Al({reason:Mi.fromHttpClientError(f)}),s=(f,u)=>new Al({reason:new kl({message:f,cause:u})}),a=f=>s("Received empty HTTP response from RPC server",f),c=f=>s("HTTP response ended before RPC request completed",f);return{send:Fr(function*(f,u){if(u._tag!=="Request")return;let l=r.makeUnsafe(),m=l.encode(u),h=typeof m=="string"?EI(m,r.contentType):SI(m,r.contentType),x=yield*e.post("",{body:h}).pipe(Fc(o));if(!n){let C=yield*x.text.pipe(Fc(o)),g=yield*ot({try:()=>l.decode(C),catch:w=>s("Error decoding HTTP response",w)});if(!Array.isArray(g))return yield*s("Expected an array of responses",g);if(g.length===0)return yield*a(u);let v=!1;for(let w=0;w<g.length;w++){let d=g[w];eT(d)&&(v=!0),yield*t(f,d)}return v?void 0:yield*c(u)}let E=!1,y=!1;if(yield*hI(x.stream,C=>ot({try:()=>C.flatMap(l.decode),catch:g=>s("Error decoding HTTP response",g)}).pipe(Q(g=>{if(g.length===0)return me;E=!0;let v=0;return oa({while:()=>v<g.length,body:()=>{let w=g[v++];return eT(w)&&(y=!0),t(f,w)},step:Rn})}))).pipe(Fc(C=>DK(C)?C:o(C))),E){if(!y)return yield*c(u)}else return yield*a(u)}),supportsAck:!1,supportsTransferables:!1,codecFor:r.codecFor}})),RD=e=>vc(vl)(Q(kI,t=>(t=uD(t,XF(e.url)),jK(e.transformClient?e.transformClient(t):t))));var Ih={};ji(Ih,{make:()=>zK});var HK={add(...e){let t=new Map(this.requests);for(let r of e)t.set(r._tag,r);return $o({requests:t,annotations:this.annotations})},merge(...e){let t=new Map(this.requests),r=new Map(this.annotations.mapUnsafe);for(let n of e){for(let[o,s]of n.requests)t.set(o,s);for(let[o,s]of n.annotations.mapUnsafe)r.set(o,s)}return $o({requests:t,annotations:Vr(r)})},omit(...e){let t=new Map(this.requests);for(let r of e)t.delete(r);return $o({requests:t,annotations:this.annotations})},middleware(e){let t=new Map;for(let[r,n]of this.requests)t.set(r,n.middleware(e));return $o({requests:t,annotations:this.annotations})},toHandlers(e){let t=this;return tr(function*(){let r=yield*hn(),n=Nr(e)?yield*e:e,o=new Map;return t.requests.forEach((s,a)=>{o.set(s.key,{tag:s._tag,handler:n[a],context:r})}),Vr(o)})},prefix(e){let t=new Map;for(let r of this.requests.values()){let n=r.prefix(e);t.set(n._tag,n)}return $o({requests:t,annotations:this.annotations})},toLayer(e){return Oc(this.toHandlers(e))},of:R,toLayerHandler(e,t){let r=this;return Oc(tr(function*(){let n=yield*hn(),o=Nr(t)?yield*t:t,s=new Map,a=r.requests.get(e);return s.set(a.key,{handler:o,context:n}),Vr(s)}))},accessHandler(e){return Ao(t=>{let r=this.requests.get(e),{handler:n,context:o}=go(t,r.key);return A((s,a)=>{a.rpc=r;let c=n(s,a),i=Fi(c)?c.value:c;return Nr(i)?Zu(i,o):PF(i,o)})})},annotate(e,t){return $o({requests:this.requests,annotations:dt(this.annotations,e,t)})},annotateRpcs(e,t){return this.annotateRpcsMerge(xo(e,t))},annotateMerge(e){return $o({requests:this.requests,annotations:Ar(this.annotations,e)})},annotateRpcsMerge(e){let t=new Map;for(let[r,n]of this.requests)t.set(r,n.annotateMerge(Ar(e,n.annotations)));return $o({requests:t,annotations:this.annotations})}},$o=e=>Object.assign(function(){},HK,{requests:e.requests,annotations:e.annotations}),zK=(...e)=>$o({requests:new Map(e.map(t=>[t._tag,t])),annotations:St()});var Ja={};ji(Ja,{Service:()=>WK,TypeId:()=>nT,layerClient:()=>JK});var nT="~effect/rpc/RpcMiddleware",WK=()=>(e,t)=>{let r=Kt(),n;r!==0&&(Ge(2),n=new globalThis.Error,Ge(r));function o(){}let s=o;return Object.setPrototypeOf(o,Object.getPrototypeOf(at(e))),o.key=e,Object.defineProperty(o,"stack",{get(){return n?.stack}}),s[nT]=nT,s.error=t?.error??Ua,s.requiredForClient=t?.requiredForClient??!1,o},JK=(e,t)=>Oc(tr(function*(){let r=(yield*hn()).pipe(a0(Xs)),n=Nr(t)?yield*t:t;return Vr(new Map([[`${e.key}/Client`,o=>Dc(n(o),s=>Ar(r,s))]]))}));function GK(e){let t=e.map(({name:r})=>r).filter((r,n,o)=>o.indexOf(r)!==n);if(t.length>0)throw new Error(`Operation names must be unique; duplicated: ${[...new Set(t)].join(", ")}`)}function PD(e,t){let r=e.middleware.bind(e);return Object.assign(e,{declaration:t,middleware:n=>PD(r(n),t)})}function MD(e,t){let{queries:r=[],commands:n=[],streams:o=[]}=t;GK([...r,...n,...o]);let s=[...r,...n,...o].map(a=>Di.make(`${e}.${a.name}`,{error:a.error,payload:a.payload,stream:a.kind==="stream",success:a.success}));return PD(Ih.make(...s),{commands:n,name:e,queries:r,streams:o})}function ND(e){let t=Object.entries(e).map(([r,n])=>[r,I.isSchema(n)?n:I.TaggedError()(r,n)]);return{error:t.length===0?I.Never:I.Union(t.map(([,r])=>r)),Rejection:Object.fromEntries(t),reject:Object.fromEntries(t.map(([r,n])=>[r,(...o)=>Ie.fail(Reflect.construct(n,o))]))}}function KK(e){return e===void 0?I.Void:I.isSchema(e)?e:I.Struct(e)}function UD(e,t,r){let{payload:n,success:o,rejections:s={}}=r;return{kind:e,name:t,payload:KK(n),rejections:s,success:o??I.Void,...ND(s)}}function Th(e,t){return{...UD("query",e,t),reads:t.reads}}function oT(e,t){return{...UD("command",e,t),invalidates:t.invalidates}}var wh=class extends Ja.Service()("@shivaedev/platform/rpc/RequestTracing"){},FD=class extends Ja.Service()("@shivaedev/platform/rpc/Authenticated",{error:I.Union([yl,Pi,Cs])}){},DD=class extends Ja.Service()("@shivaedev/platform/rpc/MaybeAuthenticated",{error:I.Union([Pi,Cs])}){},LD=class extends Ja.Service()("@shivaedev/platform/rpc/AuthenticatedUser",{error:I.Union([yl,Pi,Cs])}){};var or=I.String.check(I.isPattern(/^[a-zA-Z\d][a-zA-Z\d._-]*$/u));var Ol=I.String.check(I.isPattern(/^[a-f\d]{64}$/u)),$D=I.Literals(["answer","clarify","not_now"]),VK=I.Struct({prompt:or.check(I.isMaxLength(128)),selected:I.Array(or.check(I.isMaxLength(128))).check(I.isMaxLength(32)),text:I.String.check(I.isMaxLength(8192))}),BD=I.Array(VK).check(I.isMaxLength(32)),ZK=I.Struct({deadline:I.Number.check(I.isFinite(),I.isGreaterThanOrEqualTo(0),I.isLessThanOrEqualTo(864e13)),item:or,reason:I.String,registeredAt:I.Number.check(I.isFinite(),I.isGreaterThanOrEqualTo(0),I.isLessThanOrEqualTo(864e13)),request:or,reviewedRevision:Ol,source:I.String}),qD=I.Struct({answers:I.optional(BD),author:I.String.check(I.isPattern(/\S/u),I.isMaxLength(200)),question:or,recordedAt:I.Number.check(I.isFinite(),I.isGreaterThanOrEqualTo(0),I.isLessThanOrEqualTo(864e13)),reviewedRevision:Ol,supersedes:I.optional(or),type:$D}),jD=I.Struct({context:I.String,id:or,item:or,reason:I.String,request:or,reviewedRevision:Ol,source:I.String}),Ch=I.Struct({context:I.String,id:or,question:ZK}),kh=I.Struct({body:I.String,id:or,response:qD}),HD=I.Struct({question:Ch,responses:I.Array(kh)}),zD=I.Struct({expired:I.Boolean,question:Ch,response:I.optional(kh)}),WD=I.Struct({answers:I.optional(BD),author:qD.fields.author,body:I.String.check(I.isMaxLength(32768)),id:or,question:or,supersedes:I.optional(or),type:$D});var Dne=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])})]),Ga=(e,t)=>({item:r=>({_tag:"Item",collection:e,id:r}),list:{_tag:"List",collection:e},name:e});var $i=Ga("work-board/workspace",I.String),qne=Ga("work-board/documents",I.String),jne=Ga("work-board/identities",I.String),Hne=Ga("work-board/navigation",I.String),Bi=Ga("work-board/index",I.String),zne=Ga("work-board/watcher",I.String);var QK=Th("question",{payload:{item:I.String,request:I.String},reads:()=>[$i.list,Bi.list],rejections:za,success:jD}),YK=Th("awaitResponse",{payload:{after:I.optional(I.String),question:I.String},reads:()=>[$i.list,Bi.list],rejections:za,success:zD}),XK=Th("responses",{payload:{question:I.String},reads:()=>[$i.list,Bi.list],rejections:za,success:HD}),eV=oT("registerQuestion",{invalidates:()=>[$i.list,Bi.list],payload:{item:I.String,request:I.String,revision:Ol},rejections:za,success:Ch}),tV=oT("recordResponse",{invalidates:()=>[$i.list,Bi.list],payload:WD,rejections:za,success:kh}),JD=MD("work-board",{commands:[eV,tV],queries:[QK,XK,YK]}).middleware(wh);function rV(e){return e.response?A({kind:"response",question:e.question,response:e.response}):e.expired?k(new Ha({message:"The human left this unanswered for 48 hours. Check in with them; they may have forgotten or want to postpone. The request and late replies remain available."})):A(void 0)}function nV(e){return!I.is(LF)(e)||e._tag==="ServiceUnavailable"||e._tag==="InternalServerError"}var GD=is("WorkBoard.waitForResponse")(function*(e,t){let r,n=(yield*zg)+1728e5,o=!1;for(;;){let s=yield*e().pipe(Ju);if(s._tag==="Failure"){if(!nV(s.failure))return yield*k(s.failure);if((yield*zg)>=(r?.question.question.deadline??n))return yield*k(new ja({message:"The service is unavailable at the deadline; unanswered status could not be verified. Re-read this question when it returns."}));o||t("Local service unavailable; reconnecting to the same question."),o=!0,yield*Vu("2 seconds");continue}r=s.success,o=!1;let a=yield*rV(r);if(a)return a}});function oV(e){return RD({url:`${e}/_board/rpc`}).pipe(Rc([SD,kD]))}function sV(e){let t=new URL(e);if(t.protocol!=="http:"||!["127.0.0.1","localhost","[::1]"].includes(t.hostname)||t.username||t.password||t.pathname!=="/"||t.search||t.hash)throw new Ut({message:"Use a loopback Work Board URL, such as http://127.0.0.1:4747."});return t.origin}var aV=is("WorkBoard.requestFrom")(function*(e,t,r){let n=yield*OD(JD,{flatten:!0}),[o,s,a]=t.request.split("/");if(e==="question")return!(o&&s)||a?yield*k(new Ut({message:"Use question <item>/<request>."})):yield*n("work-board.question",{item:o,request:s});let c=t.request;if(s!==void 0){if(e!=="wait"||!o||!s||a||!t.revision)return yield*k(new Ut({message:"Use wait <item>/<request> --revision <reviewed SHA-256>, or wait <registered-question-id>."}));let i=yield*n("work-board.registerQuestion",{item:o,request:s,revision:t.revision});c=i.id,r(`Registered ${c}; reattach with work-board wait ${c}. Deadline: ${new Date(i.question.deadline).toISOString()}`)}return e==="response"?yield*n("work-board.responses",{question:c}):yield*GD(()=>n("work-board.awaitResponse",{after:t.after,question:c}),r)}),KD=is("WorkBoard.agentRequest")(function*(e,t,r=()=>{}){let n=yield*ot({catch:()=>new Ut({message:"Use a loopback Work Board URL, such as http://127.0.0.1:4747."}),try:()=>sV(t.url)});return yield*Xu(aV(e,t,r)).pipe(Zu(oV(n)))});function VD(e){let t=new Map;for(let n=0;n<e.length;n+=2){let o=e[n],s=e[n+1];if(!(o&&s&&["--port","--url","--revision","--after"].includes(o)))throw new Ut({message:"Use --port, --url, --revision or --after, each with a value."});if(t.has(o))throw new Ut({message:`Repeated option ${o}. Supply each option once.`});t.set(o,s)}let r=t.get("--port")??"4747";if(/^\d{1,5}$/u.exec(r)===null||Number(r)>65535||Number(r)<1)throw new Ut({message:"Invalid port. Use an integer from 1 to 65535."});if(t.has("--url")&&t.has("--port"))throw new Ut({message:"Choose --url or --port."});return{after:t.get("--after"),revision:t.get("--revision"),url:t.get("--url")??`http://127.0.0.1:${r}`}}var cV=is("WorkBoard.agentCommand")(function*(e,t=()=>{}){let[r,n,...o]=e;if(r!=="wait"&&r!=="response"&&r!=="question"||!n)return yield*k(new Ut({message:"Usage: work-board question <item>/<request> | wait <question-id> [--after <response-id>] | response <question-id> [--port 4747]"}));let s=yield*ot({catch:a=>I.is(Ut)(a)?a:new Ut({message:"Use --port, --url, --revision or --after, each with a value."}),try:()=>VD(o)});return yield*KD(r,{...s,request:n},t)});async function xoe(e){let t=new AbortController;function r(){t.abort()}Ka.once("SIGINT",r),Ka.once("SIGTERM",r);try{let n=await hd(cV(e,o=>Ka.stderr.write(`${o}
|
|
31
|
+
`}}}})},UK=NK();var ane=16*1024*1024;var kD=rA(Li)(UK);var AD=e=>He(()=>{let t=new Set,r=new Map,n=new Map,o=(s,a)=>Ao(c=>{let i=r.get(s);return i||(i=[],r.set(s,i)),i.push([a,c]),me});return _e(e((s,a)=>{let c=n.get(s);return c?c(a):o(s,a)},t),s=>({...s,run(a,c){return tr(function*(){t.add(a),n.set(a,c);let i=r.get(a);if(i){r.delete(a);for(let[f,u]of i)yield*Ur(He(()=>c(f)),u)}return yield*vo(ns,()=>(t.delete(a),n.delete(a),me))})}}))});var DK=e=>un(e,"RpcClientError"),LK=0,$K=Fr(function*(e,t){let r=t.spanPrefix,n=t?.supportsAck??!0,o=t?.disableTracing??!1,s=t?.generateRequestId??(()=>LK++),a=yield*hn(),c=Ke(a,Xs),i=new Map,f=!1;yield*Ac(c,dn(g=>(f=!0,u($k(g.id)))));let u=Fr(function*(g){for(let[v,w]of i)i.delete(v),w._tag==="Queue"?yield*g._tag==="Success"?uI(w.queue):qa(w.queue,g.cause):w.resume(g)}),l=g=>{let v=JI(g.successSchema),w=x(g);return(d,S)=>{let b=S?.headers?Sn(S.headers):Wc,T=S?.context??St();if(!v){let D=Z=>m(g,w,Z,g.payloadSchema.make(d),b,T,S?.discard??!1);return o?D(void 0):tf(HI(r,g._tag),{kind:"client",attributes:zI(g._tag,t.spanAttributes)},D)}let P=h(g,w,g.payloadSchema.make(d),b,S?.streamBufferSize??16,T);return S?.asQueue?P:mI(_e(P,vF))}},m=(g,v,w,d,S,b,T)=>dn(P=>{if(f)return ef;let D=s(),Z=v(de=>t.onFromClient({message:de,context:b,discard:T}),{_tag:"Request",id:D,tag:g._tag,payload:d,...w?{traceId:w.traceId,spanId:w.spanId,sampled:w.sampled}:{},headers:IS(P.getRef(vD),S)});if(T)return Z;let se;return Lc(Ht(de=>{let Re={_tag:"Effect",rpc:g,context:b,resume(Er){de(Er),se&&!se.pollUnsafe()&&P.currentDispatcher.scheduleTask(()=>{se.interruptUnsafe(P.id)},0)}};i.set(D,Re),se=Z.pipe(w?$c(w,{captureStackTrace:!1}):R,Bc(P.context)),se.addObserver(Er=>{if(Er._tag==="Failure")return de(Er)})}),de=>(i.delete(D),mn(HU(se),E(D,Array.from(de),b))))}),h=Fr(function*(g,v,w,d,S,b){if(f)return yield*ef;let T=o?void 0:yield*Oy(HI(r,g._tag),{kind:"client",attributes:zI(g._tag,t.spanAttributes)}),P=Xm(),D=s(),Z=$n(P.context,Xs),se=yield*cI(S);return yield*Yp(Z,de=>(eF(se),i.has(D)?(i.delete(D),E(D,_u(de)?Array.from(Nk(de.cause)):[],b)):me)),i.set(D,{_tag:"Queue",rpc:g,queue:se,scope:Z,context:b}),yield*v(de=>t.onFromClient({message:de,context:b,discard:!1}),{_tag:"Request",id:D,tag:g._tag,payload:w,...T?{traceId:T.traceId,spanId:T.spanId,sampled:T.sampled}:{},headers:IS(P.getRef(vD),d)}).pipe(T?$c(T,{captureStackTrace:!1}):R,Kn(de=>qa(se,de)),md,ca(Z,{startImmediately:!0})),se}),x=g=>{let v=[];for(let w of g.middlewares.values()){let d=go(a,`${w.key}/Client`);d&&v.push(d)}return v.length===0?(w,d)=>w(d):function w(d,S,b=v.length-1){return b===-1?d(S):v[b]({rpc:g,request:S,next(T){return w(d,T,b-1)}})}},E=(g,v,w)=>Ht(d=>{let S=Xm();t.onFromClient({message:{_tag:"Interrupt",requestId:g,interruptors:v},context:w,discard:!1}).pipe(wy(1e3),Bc(S.context)).addObserver(()=>{d(me)})}),y=g=>{switch(g._tag){case"Chunk":{let v=g.requestId,w=i.get(v);return!w||w._tag!=="Queue"?me:iI(w.queue,g.values).pipe(n?Q(()=>t.onFromClient({message:{_tag:"Ack",requestId:g.requestId},context:w.context,discard:!1})):R,vt(d=>qa(w.queue,d)))}case"Exit":{let v=g.requestId,w=i.get(v);return w?(i.delete(v),w._tag==="Effect"?(w.resume(g.exit),me):g.exit._tag==="Success"?uI(w.queue):qa(w.queue,g.exit.cause)):me}case"Defect":return u(Lk(g.defect));case"ClientEnd":return me}},C;if(t.flatten){let g=new Map;C=function(w,d,S){let b=g.get(w);return b||(b=l(e.requests.get(w)),g.set(w,b)),b(d,S)}}else C={},e.requests.forEach(g=>{M(C,g._tag,l(g))});return{client:C,write:y}}),BK=0,OD=Fr(function*(e,t){let r=BK++,{codecFor:n,run:o,send:s,supportsAck:a,supportsTransferables:c}=yield*vl,i=qK(n),f=Db(n(gt())),u=new Map,l=x=>u.has(x)?(u.delete(x),s(r,{_tag:"Interrupt",requestId:x})):me,{client:m,write:h}=yield*$K(e,{...t,supportsAck:a,onFromClient({message:x}){switch(x._tag){case"Request":{let E=e.requests.get(x.tag),y=c?bD():void 0,C=Xm(),g={rpc:E,context:y?dt(C.context,wl,y):C.context,schemas:i(E)};return u.set(x.id,g),g.schemas.encodePayload(x.payload).pipe(Ur(g.context),Ku,Q(v=>s(r,{...x,id:x.id,payload:v,headers:Object.entries(x.headers)},y&&y.readUnsafe())))}case"Ack":return u.get(x.requestId)?s(r,{_tag:"Ack",requestId:x.requestId}):me;case"Interrupt":return l(x.requestId);case"Eof":return me}}});return yield*o(r,x=>{switch(x._tag){case"Chunk":{let E=XI(x.requestId),y=u.get(E);if(!y||qe(y.schemas.decodeChunk))return me;let C=y.schemas.decodeChunk.value;return cs(g=>g(C(x.values).pipe(Ur(y.context),Ku,Q(v=>h({_tag:"Chunk",clientId:0,requestId:E,values:v})))).pipe(Kn(v=>h({_tag:"Exit",clientId:0,requestId:E,exit:er(v)}).pipe(mn(kc(v)?me:Ty(l(E))))),Ey(v=>!kc(v),()=>me)))}case"Exit":{let E=XI(x.requestId),y=u.get(E);return y?(u.delete(E),y.schemas.decodeExit(x.exit).pipe(Ur(y.context),Ku,ko({onSuccess:C=>h({_tag:"Exit",clientId:0,requestId:E,exit:C}),onFailure:C=>h({_tag:"Exit",clientId:0,requestId:E,exit:er(C)})}))):me}case"Defect":return h({_tag:"Defect",clientId:0,defect:f(x.defect)});case"ClientProtocolError":{let E=Pr(x.error);return ju(Array.from(u.keys()),y=>h({_tag:"Exit",clientId:0,requestId:y,exit:E}))}default:return me}}).pipe(vt(gd),md,rf),m}),qK=e=>{let t=new WeakMap;return r=>{let n=t.get(r);if(n!==void 0)return n;let o=Eh(r.successSchema);return n={decodeChunk:Bs(o,s=>Ma(e(Oi(s.success)))),encodePayload:Lb(e(r.payloadSchema)),decodeExit:Ma(e(QI(r)))},t.set(r,n),n}},vD=ce("effect/rpc/RpcClient/CurrentHeaders",{defaultValue:()=>Wc});var vl=class extends at()("effect/rpc/RpcClient/Protocol"){static make=AD},jK=e=>vl.make(Fr(function*(t){let r=yield*Li,n=r.includesFraming,o=f=>new Al({reason:Mi.fromHttpClientError(f)}),s=(f,u)=>new Al({reason:new kl({message:f,cause:u})}),a=f=>s("Received empty HTTP response from RPC server",f),c=f=>s("HTTP response ended before RPC request completed",f);return{send:Fr(function*(f,u){if(u._tag!=="Request")return;let l=r.makeUnsafe(),m=l.encode(u),h=typeof m=="string"?EI(m,r.contentType):SI(m,r.contentType),x=yield*e.post("",{body:h}).pipe(Fc(o));if(!n){let C=yield*x.text.pipe(Fc(o)),g=yield*ot({try:()=>l.decode(C),catch:w=>s("Error decoding HTTP response",w)});if(!Array.isArray(g))return yield*s("Expected an array of responses",g);if(g.length===0)return yield*a(u);let v=!1;for(let w=0;w<g.length;w++){let d=g[w];eT(d)&&(v=!0),yield*t(f,d)}return v?void 0:yield*c(u)}let E=!1,y=!1;if(yield*hI(x.stream,C=>ot({try:()=>C.flatMap(l.decode),catch:g=>s("Error decoding HTTP response",g)}).pipe(Q(g=>{if(g.length===0)return me;E=!0;let v=0;return oa({while:()=>v<g.length,body:()=>{let w=g[v++];return eT(w)&&(y=!0),t(f,w)},step:Rn})}))).pipe(Fc(C=>DK(C)?C:o(C))),E){if(!y)return yield*c(u)}else return yield*a(u)}),supportsAck:!1,supportsTransferables:!1,codecFor:r.codecFor}})),RD=e=>vc(vl)(Q(kI,t=>(t=uD(t,XF(e.url)),jK(e.transformClient?e.transformClient(t):t))));var Ih={};ji(Ih,{make:()=>zK});var HK={add(...e){let t=new Map(this.requests);for(let r of e)t.set(r._tag,r);return $o({requests:t,annotations:this.annotations})},merge(...e){let t=new Map(this.requests),r=new Map(this.annotations.mapUnsafe);for(let n of e){for(let[o,s]of n.requests)t.set(o,s);for(let[o,s]of n.annotations.mapUnsafe)r.set(o,s)}return $o({requests:t,annotations:Vr(r)})},omit(...e){let t=new Map(this.requests);for(let r of e)t.delete(r);return $o({requests:t,annotations:this.annotations})},middleware(e){let t=new Map;for(let[r,n]of this.requests)t.set(r,n.middleware(e));return $o({requests:t,annotations:this.annotations})},toHandlers(e){let t=this;return tr(function*(){let r=yield*hn(),n=Nr(e)?yield*e:e,o=new Map;return t.requests.forEach((s,a)=>{o.set(s.key,{tag:s._tag,handler:n[a],context:r})}),Vr(o)})},prefix(e){let t=new Map;for(let r of this.requests.values()){let n=r.prefix(e);t.set(n._tag,n)}return $o({requests:t,annotations:this.annotations})},toLayer(e){return Oc(this.toHandlers(e))},of:R,toLayerHandler(e,t){let r=this;return Oc(tr(function*(){let n=yield*hn(),o=Nr(t)?yield*t:t,s=new Map,a=r.requests.get(e);return s.set(a.key,{handler:o,context:n}),Vr(s)}))},accessHandler(e){return Ao(t=>{let r=this.requests.get(e),{handler:n,context:o}=go(t,r.key);return A((s,a)=>{a.rpc=r;let c=n(s,a),i=Fi(c)?c.value:c;return Nr(i)?Zu(i,o):PF(i,o)})})},annotate(e,t){return $o({requests:this.requests,annotations:dt(this.annotations,e,t)})},annotateRpcs(e,t){return this.annotateRpcsMerge(xo(e,t))},annotateMerge(e){return $o({requests:this.requests,annotations:Ar(this.annotations,e)})},annotateRpcsMerge(e){let t=new Map;for(let[r,n]of this.requests)t.set(r,n.annotateMerge(Ar(e,n.annotations)));return $o({requests:t,annotations:this.annotations})}},$o=e=>Object.assign(function(){},HK,{requests:e.requests,annotations:e.annotations}),zK=(...e)=>$o({requests:new Map(e.map(t=>[t._tag,t])),annotations:St()});var Ja={};ji(Ja,{Service:()=>WK,TypeId:()=>nT,layerClient:()=>JK});var nT="~effect/rpc/RpcMiddleware",WK=()=>(e,t)=>{let r=Kt(),n;r!==0&&(Ge(2),n=new globalThis.Error,Ge(r));function o(){}let s=o;return Object.setPrototypeOf(o,Object.getPrototypeOf(at(e))),o.key=e,Object.defineProperty(o,"stack",{get(){return n?.stack}}),s[nT]=nT,s.error=t?.error??Ua,s.requiredForClient=t?.requiredForClient??!1,o},JK=(e,t)=>Oc(tr(function*(){let r=(yield*hn()).pipe(a0(Xs)),n=Nr(t)?yield*t:t;return Vr(new Map([[`${e.key}/Client`,o=>Dc(n(o),s=>Ar(r,s))]]))}));function GK(e){let t=e.map(({name:r})=>r).filter((r,n,o)=>o.indexOf(r)!==n);if(t.length>0)throw new Error(`Operation names must be unique; duplicated: ${[...new Set(t)].join(", ")}`)}function PD(e,t){let r=e.middleware.bind(e);return Object.assign(e,{declaration:t,middleware:n=>PD(r(n),t)})}function MD(e,t){let{queries:r=[],commands:n=[],streams:o=[]}=t;GK([...r,...n,...o]);let s=[...r,...n,...o].map(a=>Di.make(`${e}.${a.name}`,{error:a.error,payload:a.payload,stream:a.kind==="stream",success:a.success}));return PD(Ih.make(...s),{commands:n,name:e,queries:r,streams:o})}function ND(e){let t=Object.entries(e).map(([r,n])=>[r,I.isSchema(n)?n:I.TaggedError()(r,n)]);return{error:t.length===0?I.Never:I.Union(t.map(([,r])=>r)),Rejection:Object.fromEntries(t),reject:Object.fromEntries(t.map(([r,n])=>[r,(...o)=>Ie.fail(Reflect.construct(n,o))]))}}function KK(e){return e===void 0?I.Void:I.isSchema(e)?e:I.Struct(e)}function UD(e,t,r){let{payload:n,success:o,rejections:s={}}=r;return{kind:e,name:t,payload:KK(n),rejections:s,success:o??I.Void,...ND(s)}}function Th(e,t){return{...UD("query",e,t),reads:t.reads}}function oT(e,t){return{...UD("command",e,t),invalidates:t.invalidates}}var wh=class extends Ja.Service()("@shivaedev/platform/rpc/RequestTracing"){},FD=class extends Ja.Service()("@shivaedev/platform/rpc/Authenticated",{error:I.Union([yl,Pi,Cs])}){},DD=class extends Ja.Service()("@shivaedev/platform/rpc/MaybeAuthenticated",{error:I.Union([Pi,Cs])}){},LD=class extends Ja.Service()("@shivaedev/platform/rpc/AuthenticatedUser",{error:I.Union([yl,Pi,Cs])}){};var or=I.String.check(I.isPattern(/^[a-zA-Z\d][a-zA-Z\d._-]*$/u));var Ol=I.String.check(I.isPattern(/^[a-f\d]{64}$/u)),$D=I.Literals(["answer","clarify","not_now"]),VK=I.Struct({prompt:or.check(I.isMaxLength(128)),selected:I.Array(or.check(I.isMaxLength(128))).check(I.isMaxLength(32)),text:I.String.check(I.isMaxLength(8192))}),BD=I.Array(VK).check(I.isMaxLength(32)),ZK=I.Struct({deadline:I.Number.check(I.isFinite(),I.isGreaterThanOrEqualTo(0),I.isLessThanOrEqualTo(864e13)),item:or,reason:I.String,registeredAt:I.Number.check(I.isFinite(),I.isGreaterThanOrEqualTo(0),I.isLessThanOrEqualTo(864e13)),request:or,reviewedRevision:Ol,source:I.String}),qD=I.Struct({answers:I.optional(BD),author:I.String.check(I.isPattern(/\S/u),I.isMaxLength(200)),question:or,recordedAt:I.Number.check(I.isFinite(),I.isGreaterThanOrEqualTo(0),I.isLessThanOrEqualTo(864e13)),reviewedRevision:Ol,supersedes:I.optional(or),type:$D}),jD=I.Struct({context:I.String,id:or,item:or,reason:I.String,request:or,reviewedRevision:Ol,source:I.String}),Ch=I.Struct({context:I.String,id:or,question:ZK}),kh=I.Struct({body:I.String,id:or,response:qD}),HD=I.Struct({question:Ch,responses:I.Array(kh)}),zD=I.Struct({expired:I.Boolean,question:Ch,response:I.optional(kh)}),WD=I.Struct({answers:I.optional(BD),author:qD.fields.author,body:I.String.check(I.isMaxLength(32768)),id:or,question:or,supersedes:I.optional(or),type:$D});var Dne=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])})]);function Ga(e,t){return{item:r=>({_tag:"Item",collection:e,id:r}),list:{_tag:"List",collection:e},name:e}}var $i=Ga("work-board/workspace",I.String),qne=Ga("work-board/documents",I.String),jne=Ga("work-board/identities",I.String),Hne=Ga("work-board/navigation",I.String),Bi=Ga("work-board/index",I.String),zne=Ga("work-board/watcher",I.String);var QK=Th("question",{payload:{item:I.String,request:I.String},reads:()=>[$i.list,Bi.list],rejections:za,success:jD}),YK=Th("awaitResponse",{payload:{after:I.optional(I.String),question:I.String},reads:()=>[$i.list,Bi.list],rejections:za,success:zD}),XK=Th("responses",{payload:{question:I.String},reads:()=>[$i.list,Bi.list],rejections:za,success:HD}),eV=oT("registerQuestion",{invalidates:()=>[$i.list,Bi.list],payload:{item:I.String,request:I.String,revision:Ol},rejections:za,success:Ch}),tV=oT("recordResponse",{invalidates:()=>[$i.list,Bi.list],payload:WD,rejections:za,success:kh}),JD=MD("work-board",{commands:[eV,tV],queries:[QK,XK,YK]}).middleware(wh);function rV(e){return e.response?A({kind:"response",question:e.question,response:e.response}):e.expired?k(new Ha({message:"The human left this unanswered for 48 hours. Check in with them; they may have forgotten or want to postpone. The request and late replies remain available."})):A(void 0)}function nV(e){return!I.is(LF)(e)||e._tag==="ServiceUnavailable"||e._tag==="InternalServerError"}var GD=is("WorkBoard.waitForResponse")(function*(e,t){let r,n=(yield*zg)+1728e5,o=!1;for(;;){let s=yield*e().pipe(Ju);if(s._tag==="Failure"){if(!nV(s.failure))return yield*k(s.failure);if((yield*zg)>=(r?.question.question.deadline??n))return yield*k(new ja({message:"The service is unavailable at the deadline; unanswered status could not be verified. Re-read this question when it returns."}));o||t("Local service unavailable; reconnecting to the same question."),o=!0,yield*Vu("2 seconds");continue}r=s.success,o=!1;let a=yield*rV(r);if(a)return a}});function oV(e){return RD({url:`${e}/_board/rpc`}).pipe(Rc([SD,kD]))}function sV(e){let t=new URL(e);if(t.protocol!=="http:"||!["127.0.0.1","localhost","[::1]"].includes(t.hostname)||t.username||t.password||t.pathname!=="/"||t.search||t.hash)throw new Ut({message:"Use a loopback Work Board URL, such as http://127.0.0.1:4747."});return t.origin}var aV=is("WorkBoard.requestFrom")(function*(e,t,r){let n=yield*OD(JD,{flatten:!0}),[o,s,a]=t.request.split("/");if(e==="question")return!(o&&s)||a?yield*k(new Ut({message:"Use question <item>/<request>."})):yield*n("work-board.question",{item:o,request:s});let c=t.request;if(s!==void 0){if(e!=="wait"||!o||!s||a||!t.revision)return yield*k(new Ut({message:"Use wait <item>/<request> --revision <reviewed SHA-256>, or wait <registered-question-id>."}));let i=yield*n("work-board.registerQuestion",{item:o,request:s,revision:t.revision});c=i.id,r(`Registered ${c}; reattach with work-board wait ${c}. Deadline: ${new Date(i.question.deadline).toISOString()}`)}return e==="response"?yield*n("work-board.responses",{question:c}):yield*GD(()=>n("work-board.awaitResponse",{after:t.after,question:c}),r)}),KD=is("WorkBoard.agentRequest")(function*(e,t,r=()=>{}){let n=yield*ot({catch:()=>new Ut({message:"Use a loopback Work Board URL, such as http://127.0.0.1:4747."}),try:()=>sV(t.url)});return yield*Xu(aV(e,t,r)).pipe(Zu(oV(n)))});function VD(e){let t=new Map;for(let n=0;n<e.length;n+=2){let o=e[n],s=e[n+1];if(!(o&&s&&["--port","--url","--revision","--after"].includes(o)))throw new Ut({message:"Use --port, --url, --revision or --after, each with a value."});if(t.has(o))throw new Ut({message:`Repeated option ${o}. Supply each option once.`});t.set(o,s)}let r=t.get("--port")??"4747";if(/^\d{1,5}$/u.exec(r)===null||Number(r)>65535||Number(r)<1)throw new Ut({message:"Invalid port. Use an integer from 1 to 65535."});if(t.has("--url")&&t.has("--port"))throw new Ut({message:"Choose --url or --port."});return{after:t.get("--after"),revision:t.get("--revision"),url:t.get("--url")??`http://127.0.0.1:${r}`}}var cV=is("WorkBoard.agentCommand")(function*(e,t=()=>{}){let[r,n,...o]=e;if(r!=="wait"&&r!=="response"&&r!=="question"||!n)return yield*k(new Ut({message:"Usage: work-board question <item>/<request> | wait <question-id> [--after <response-id>] | response <question-id> [--port 4747]"}));let s=yield*ot({catch:a=>I.is(Ut)(a)?a:new Ut({message:"Use --port, --url, --revision or --after, each with a value."}),try:()=>VD(o)});return yield*KD(r,{...s,request:n},t)});async function xoe(e){let t=new AbortController;function r(){t.abort()}Ka.once("SIGINT",r),Ka.once("SIGTERM",r);try{let n=await hd(cV(e,o=>Ka.stderr.write(`${o}
|
|
32
32
|
`)).pipe(Ju),{signal:t.signal});if(n._tag==="Failure")throw n.failure instanceof Ha&&(Ka.exitCode=2),n.failure;Ka.stdout.write(`${JSON.stringify(n.success)}
|
|
33
33
|
`)}finally{Ka.removeListener("SIGINT",r),Ka.removeListener("SIGTERM",r)}}export{xoe as runAgent};
|