@coreplane/switchboard 1.249.1 → 1.250.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.
Files changed (44) hide show
  1. package/dist/assets/config/config.example.yaml +37 -4
  2. package/dist/assets/deploy/cloudflare-memory/worker.ts +229 -1
  3. package/dist/assets/deploy/cloudflare-resident/Dockerfile +12 -3
  4. package/dist/assets/deploy/cloudflare-sandbox/Dockerfile +7 -0
  5. package/dist/assets/package-lock.json +3 -3
  6. package/dist/assets/package.json +3 -2
  7. package/dist/assets/project.json +4 -0
  8. package/dist/assets/source.json +3 -3
  9. package/dist/assets/src/agents/registry.ts +1 -1
  10. package/dist/assets/src/core/authz/policy.ts +6 -0
  11. package/dist/assets/src/core/budgets.ts +13 -0
  12. package/dist/assets/src/core/coordinator/contract.ts +120 -0
  13. package/dist/assets/src/core/coordinator/driver.ts +1 -1
  14. package/dist/assets/src/core/prDescriptionTypes.ts +35 -0
  15. package/dist/assets/src/core/provider.ts +8 -3
  16. package/dist/assets/src/core/refusal.ts +11 -0
  17. package/dist/assets/src/core/runEvents.ts +49 -2
  18. package/dist/assets/src/core/runFriction.ts +2 -0
  19. package/dist/assets/src/core/runLedger/decisions.ts +9 -1
  20. package/dist/assets/src/core/runLedger/sessionLog.ts +10 -0
  21. package/dist/assets/src/core/runLedger/transcript.ts +13 -3
  22. package/dist/assets/src/core/runLedger/types.ts +60 -2
  23. package/dist/assets/src/core/runRecord.ts +18 -0
  24. package/dist/assets/src/core/trace/attrs.ts +13 -2
  25. package/dist/assets/src/core/trace/workerTrace.ts +3 -2
  26. package/dist/assets/src/core/types.ts +3 -0
  27. package/dist/assets/web/dist/.vite/manifest.json +30 -30
  28. package/dist/assets/web/dist/assets/DeliveryPage-CIfBiINK.js +1 -0
  29. package/dist/assets/web/dist/assets/{HomePage-BpQRky8B.js → HomePage-AnycA57D.js} +1 -1
  30. package/dist/assets/web/dist/assets/{ResidentDetailPage-BIUXyz6K.js → ResidentDetailPage-Cb3sFkfj.js} +1 -1
  31. package/dist/assets/web/dist/assets/{ResidentsIndexPage-BZymgSAb.js → ResidentsIndexPage-BZ6n6UxF.js} +1 -1
  32. package/dist/assets/web/dist/assets/{RunFoldRow-3m4CPRI4.js → RunFoldRow-BRXkjkgO.js} +1 -1
  33. package/dist/assets/web/dist/assets/{RunRoutePage-bgkjkA0p.js → RunRoutePage-psSMI3fN.js} +3 -3
  34. package/dist/assets/web/dist/assets/{RunsIndexPage-8S944AzB.js → RunsIndexPage-68YT_RWt.js} +1 -1
  35. package/dist/assets/web/dist/assets/{ScheduledPage-8bBtG9y3.js → ScheduledPage-CBUxbeqN.js} +1 -1
  36. package/dist/assets/web/dist/assets/{SettingsPage-DQeNvfaV.js → SettingsPage-CBTnZ9Qv.js} +1 -1
  37. package/dist/assets/web/dist/assets/{StatusDot-BPE5syBa.js → StatusDot-BnRjWzFN.js} +1 -1
  38. package/dist/assets/web/dist/assets/{Tooltip-DkoeZfTs.js → Tooltip-Brge0wnd.js} +1 -1
  39. package/dist/assets/web/dist/assets/{UnitRoutePage-BUzw--Ii.js → UnitRoutePage-o6sLju16.js} +1 -1
  40. package/dist/assets/web/dist/assets/{dist-D11y9ZJ4.js → dist-rgAhsmE-.js} +1 -1
  41. package/dist/assets/web/dist/assets/{main-B6LcgNM6.js → main-CeRuGONy.js} +2 -2
  42. package/dist/cli.js +3511 -2396
  43. package/package.json +1 -1
  44. package/dist/assets/web/dist/assets/DeliveryPage-DF4aQypG.js +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreplane/switchboard",
3
- "version": "1.249.1",
3
+ "version": "1.250.0",
4
4
  "description": "Mention it in Slack and an agent reviews the PR, ships the fix, or answers the question — on the model you choose, with its tools running where you decide.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://openswitchboard.dev",
@@ -1 +0,0 @@
1
- import{t as e}from"./AppShell-DAtHiuI6.js";import{An as t,Cn as n,Cr as r,Li as i,Mn as a,Pi as o,Sn as s,Tr as ee,Xr as c,_r as l,bn as u,ji as d,kn as f,ln as p,o as m,xn as h,yn as g}from"./browser-B6T5hjfR.js";import{a as _,c as te,d as ne,i as re,l as v,n as y,o as b,r as x,s as S,t as C,u as ie}from"./delivery-CTdOqpVK.js";import{t as ae}from"./wallClock-DmaC1sKA.js";var w=6e4;1440*w,10*w,5*w,60*w,10*w,60*w;var T={general:2,coding:15,review:5,research:3,explore:15,conductor:15};T.coding,T.coding,T.review;function E(e,t){return e.truncated&&e.completeFrom!==void 0&&Date.parse(`${t}T00:00:00Z`)<Date.parse(e.completeFrom)}Object.freeze({reviewers:[],agentLogins:[],agentCoauthors:[]}),Object.freeze({default:60,min:5,max:1440});var D={class:`text-xs text-muted`},O={key:1,class:`text-highlighted`},k={class:`mb-4 flex flex-wrap items-center gap-x-4 gap-y-2`},A={key:0,class:`flex items-center gap-1`,"aria-label":`Repositories`},j={key:0,class:`rounded-md bg-accented px-2.5 py-1 text-xs font-medium text-highlighted`,"aria-current":`page`},M={class:`font-mono text-sm tabular-nums text-muted`},N={class:`mb-5 grid gap-3`},P={key:0,class:`text-sm text-muted`},F={class:`grid grid-cols-[repeat(auto-fit,minmax(190px,1fr))] gap-3`},I={class:`font-mono text-[0.6875rem] font-medium uppercase tracking-widest text-dimmed`},L={class:`font-mono text-2xl font-medium tabular-nums`},R={class:`text-xs text-muted`},z={class:`mb-5 grid gap-3 rounded-lg border border-default bg-elevated px-5 py-4`},B={class:`overflow-x-auto`},V={class:`weeks w-full min-w-[52rem] border-collapse whitespace-nowrap font-mono text-[0.8125rem] tabular-nums`},H=[`title`],U={key:0,class:`ml-1 text-xs`},oe={key:0,class:`text-xs text-muted`},W={class:`mb-5 grid gap-3 rounded-lg border border-default bg-elevated px-5 py-4`},G={key:0,class:`text-sm text-muted`},K={key:1,class:`overflow-x-auto`},q={class:`units w-full min-w-[52rem] border-collapse font-mono text-[0.8125rem] tabular-nums`},se=[`href`],ce={key:1,class:`text-dimmed`},le=[`title`],ue=[`href`],de={class:`text-xs text-muted`},fe={class:`rounded bg-accented px-1 py-0.5`},pe={class:`border-t border-default pt-3.5 text-xs text-dimmed`},me={key:0,class:`mb-2 font-mono tabular-nums text-muted`},he={class:`mt-2 grid gap-1.5`},J=`border-b border-muted bg-(--ui-bg-muted) px-2.5 py-1.5 text-xs font-medium text-muted whitespace-nowrap`,Y=`border-b border-muted px-2.5 py-1.5`,X=a({__name:`DeliveryPage`,setup(a){let w=m(`delivery`),T=g(()=>w?.report??null),X=g(()=>w?.repos??[]),Z=g(()=>T.value?ie(T.value):[]),Q=g(()=>T.value?y(T.value):void 0),$=e=>T.value?E(T.value,e):!1,ge=g(()=>T.value?.weeks.some(e=>$(e.week))??!1),_e=[1,2,4,8,13],ve=ae(void 0,6e4),ye=typeof window>`u`?``:window.location.search;return(a,m)=>{let g=ee(`RouterLink`);return T.value?(l(),h(e,{key:0,title:`${T.value.repo} delivery`,nav:`delivery`},{actions:c(()=>[u(`span`,D,[(l(),n(p,null,r(_e,(e,t)=>(l(),n(p,{key:e},[t>0?(l(),n(p,{key:0},[f(` · `)],64)):s(``,!0),e===T.value.range.weeks?(l(),n(`b`,O,i(e)+`w`,1)):(l(),h(g,{key:2,class:`text-primary hover:underline`,to:`/delivery/${T.value.repo}?weeks=${e}`},{default:c(()=>[f(i(e)+`w`,1)]),_:2},1032,[`to`]))],64))),64))])]),default:c(()=>[u(`div`,k,[X.value.length>1?(l(),n(`nav`,A,[(l(!0),n(p,null,r(X.value,e=>(l(),n(p,{key:e},[e===T.value.repo?(l(),n(`span`,j,i(e),1)):(l(),h(g,{key:1,class:`rounded-md px-2.5 py-1 text-xs text-muted no-underline hover:bg-elevated hover:text-highlighted`,to:`/delivery/${e}`},{default:c(()=>[f(i(e),1)]),_:2},1032,[`to`]))],64))),128))])):s(``,!0),u(`p`,M,i(d(b)(T.value.range.since))+` → `+i(d(b)(T.value.range.until))+` · `+i(T.value.range.weeks)+`w · weeks start Monday, UTC `,1)]),u(`section`,N,[Q.value?(l(),n(`p`,P,i(Q.value),1)):s(``,!0),u(`div`,F,[(l(!0),n(p,null,r(Z.value,e=>(l(),n(`div`,{key:e.label,class:`grid gap-0.5 rounded-lg border border-default bg-elevated px-4 py-3.5`},[u(`span`,I,i(e.label),1),u(`span`,L,i(e.value),1),u(`span`,R,i(e.note),1)]))),128))])]),u(`section`,z,[m[0]||=u(`div`,null,[u(`h2`,{class:`text-[0.9375rem] font-medium`},`By week`),u(`p`,{class:`text-sm text-muted`},`One row per Monday-start week · merged pull requests only`)],-1),u(`div`,B,[u(`table`,V,[u(`thead`,null,[u(`tr`,null,[u(`th`,{class:o([J,`text-left`])},`Week`,2),u(`th`,{class:o([J,`text-right`])},`Merged`,2),u(`th`,{class:o([J,`text-right`])},`Agent-authored`,2),u(`th`,{class:o([J,`text-right`])},`Issue → merge`,2),u(`th`,{class:o([J,`text-right`])},`First-pass CI`,2),u(`th`,{class:o([J,`text-right`])},`Rounds / PR`,2),u(`th`,{class:o([J,`text-right`])},`Findings`,2),u(`th`,{class:o([J,`text-right`])},`No human edit`,2),u(`th`,{class:o([J,`text-right`])},`Agent run min`,2)])]),u(`tbody`,null,[(l(!0),n(p,null,r(T.value.weeks,e=>(l(),n(`tr`,{key:e.week,class:o($(e.week)?`text-dimmed`:``)},[u(`td`,{class:o(Y),title:`${e.week} → ${e.until}`},[f(i(d(b)(e.week))+` – `+i(d(b)(e.until))+` `,1),$(e.week)?(l(),n(`span`,U,`(incomplete)`)):s(``,!0)],8,H),u(`td`,{class:o([Y,`text-right font-medium`])},i(e.prsMerged),3),u(`td`,{class:o([Y,`text-right`])},i(e.agentAuthoredPrs),3),u(`td`,{class:o([Y,`text-right`])},i(d(_)(e.leadTimeHours.median)),3),u(`td`,{class:o([Y,`text-right`])},i(d(C)(e)),3),u(`td`,{class:o([Y,`text-right`])},i(d(te)(e.reviewRounds.perPr)),3),u(`td`,{class:o([Y,`text-right`])},i(d(x)(e)),3),u(`td`,{class:o([Y,`text-right`])},i(d(S)(e.findings.noHumanEditShare)),3),u(`td`,{class:o([Y,`text-right`])},i(e.agentRuns.minutes.toFixed(0)),3)],2))),128))])])]),ge.value&&T.value.completeFrom?(l(),n(`p`,oe,` Incomplete weeks hold the newest pull requests the read reached — it is complete from `+i(d(v)(T.value.completeFrom))+` — so their numbers are a floor on the merges, not the week's. `,1)):s(``,!0)]),u(`section`,W,[m[3]||=u(`div`,null,[u(`h2`,{class:`text-[0.9375rem] font-medium`},`By unit`),u(`p`,{class:`text-sm text-muted`},` One row per board issue the pull requests link · the issue's opening starts the clock `)],-1),T.value.units.length===0?(l(),n(`p`,G,`Nothing merged in range.`)):(l(),n(`div`,K,[u(`table`,q,[u(`thead`,null,[u(`tr`,null,[u(`th`,{class:o([J,`text-left`])},`Issue`,2),u(`th`,{class:o([J,`text-left`])},`Unit`,2),u(`th`,{class:o([J,`text-left`])},`PRs`,2),u(`th`,{class:o([J,`text-right`])},`Issue → merge`,2),u(`th`,{class:o([J,`text-right`])},`First-pass CI`,2),u(`th`,{class:o([J,`text-right`])},`Rounds`,2),u(`th`,{class:o([J,`text-right`])},`Findings`,2),u(`th`,{class:o([J,`text-right`])},`No human edit`,2)])]),u(`tbody`,null,[(l(!0),n(p,null,r(T.value.units,e=>(l(),n(`tr`,{key:e.issue??`none`},[u(`td`,{class:o([Y,`whitespace-nowrap`])},[e.issue===null?(l(),n(`span`,ce,`—`)):(l(),n(`a`,{key:0,class:`text-primary hover:underline`,href:`https://github.com/${T.value.repo}/issues/${e.issue}`},`#`+i(e.issue),9,se))],2),u(`td`,{class:o([Y,`max-w-[28rem] truncate font-sans`]),title:e.title},i(e.title),11,le),u(`td`,{class:o([Y,`whitespace-nowrap`])},[(l(!0),n(p,null,r(e.prs,(e,t)=>(l(),n(p,{key:e},[t>0?(l(),n(p,{key:0},[f(`, `)],64)):s(``,!0),u(`a`,{class:`text-primary hover:underline`,href:`https://github.com/${T.value.repo}/pull/${e}`},i(e),9,ue)],64))),128))],2),u(`td`,{class:o([Y,`text-right`])},i(d(_)(e.leadTimeHours.median)),3),u(`td`,{class:o([Y,`text-right`])},i(d(C)(e)),3),u(`td`,{class:o([Y,`text-right`])},i(e.reviewRounds.verdicts),3),u(`td`,{class:o([Y,`text-right`])},i(d(x)(e)),3),u(`td`,{class:o([Y,`text-right`])},i(d(S)(e.findings.noHumanEditShare)),3)]))),128))])])])),u(`p`,de,[m[1]||=f(` Machine-readable twin: `,-1),u(`code`,fe,`GET /delivery/`+i(T.value.repo)+`.json`,1),m[2]||=f(` (same gate). `,-1)])]),u(`footer`,pe,[T.value.snapshotAt?(l(),n(`p`,me,[f(` As of `+i(d(v)(T.value.snapshotAt))+`, `+i(d(ne)(T.value.snapshotAt,d(ve)))+` · `,1),t(g,{class:`text-primary hover:underline`,to:`/delivery/${T.value.repo}${d(re)(d(ye))}`},{default:c(()=>[...m[4]||=[f(`read GitHub now`,-1)]]),_:1},8,[`to`])])):s(``,!0),u(`details`,null,[m[14]||=u(`summary`,{class:`cursor-pointer text-muted`},`How these numbers are computed`,-1),u(`div`,he,[m[12]||=u(`div`,null,[u(`b`,null,`Snapshot.`),f(` GitHub's record of the merged pull requests (each one's timeline and its branch's workflow runs, the board issue its body links) is read on an interval and kept as a snapshot the page, its JSON twin and `),u(`code`,null,`delivery report`),f(` serve; `),u(`code`,null,`?fresh=1`),f(` reads GitHub now. The run history you may see joins on every load. `)],-1),m[13]||=u(`div`,null,[u(`b`,null,`Issue → merge`),f(` runs from the linked board issue's opening (a closing keyword or a `),u(`code`,null,`board item`),f(` reference in the body) to the merge; a pull request that links no issue counts from its own opening. `),u(`b`,null,`First-pass CI`),f(` is green when every pull-request-triggered workflow run (`),u(`code`,null,`pull_request`),f(`, `),u(`code`,null,`pull_request_target`),f(`) on the first head succeeded at its first attempt — a rerun or a red run fails it; a head with no such run is not counted. `),u(`b`,null,`Review rounds`),f(` are the review agent's verdicts; a `),u(`i`,null,`fix round`),f(` is a verdict that followed a push. `),u(`b`,null,`No human edit`),f(` is the share of the agent's findings on pull requests where every push after the first verdict was an agent's: a bot login, or a commit co-authored by an agent. `),u(`b`,null,`Agent run minutes`),f(` are the finished runs of this repository that named a pull request. `)],-1),u(`div`,null,[m[6]||=u(`b`,null,`Identities.`,-1),m[7]||=f(` Verdicts by `,-1),u(`code`,null,i(T.value.identities.reviewers.join(`, `)||`(none configured)`),1),m[8]||=f(`; agent logins end in `,-1),m[9]||=u(`code`,null,`[bot]`,-1),T.value.identities.agentLogins.length?(l(),n(p,{key:0},[m[5]||=f(`, plus `,-1),u(`code`,null,i(T.value.identities.agentLogins.join(`, `)),1)],64)):s(``,!0),m[10]||=f(`; agent co-authors named `,-1),u(`code`,null,i(T.value.identities.agentCoauthors.join(`, `)||`(none)`),1),m[11]||=f(`. `,-1)])])])])]),_:1},8,[`title`])):s(``,!0)}}});export{X as default};