geneseed 4.3.1 → 4.4.1

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 (69) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +4 -4
  3. package/SHIPPED.md +2 -2
  4. package/adapters/opencode/plugins/geneseed-context.js +18 -1
  5. package/adapters/opencode/plugins/geneseed-learn.js +178 -46
  6. package/docs/concepts/agents.md +1 -0
  7. package/docs/concepts/hooks.md +1 -1
  8. package/docs/concepts/skills.md +1 -0
  9. package/docs/reference/plugin-learn.md +2 -2
  10. package/docs/understand/a-day.md +3 -3
  11. package/docs/understand/machine-claude.md +1 -1
  12. package/docs/understand/machine-opencode.md +1 -1
  13. package/harness.config.json +1 -1
  14. package/js/README.md +1 -1
  15. package/js/build/bundle.mjs +2 -0
  16. package/js/build/emit-claude.mjs +2 -0
  17. package/js/build/emit-opencode.mjs +2 -0
  18. package/js/build/stubs.mjs +9 -4
  19. package/js/cli-table.json +32 -2
  20. package/js/hosts/hooks-context.mjs +25 -1
  21. package/js/hosts/hooks-learn.mjs +42 -16
  22. package/js/hosts/memory-files.mjs +283 -60
  23. package/js/inspect/checks-build.mjs +2 -1
  24. package/js/inspect/cost.mjs +1 -1
  25. package/js/inspect/inventory.mjs +1 -1
  26. package/js/maintain/memory.mjs +38 -11
  27. package/js/web/actions.mjs +4 -3
  28. package/package.json +1 -1
  29. package/registry.json +14 -0
  30. package/src/AGENT.md.tmpl +2 -0
  31. package/src/agents/memory-curator.md +71 -0
  32. package/src/memory/README.md +41 -10
  33. package/src/skills/deck.md +56 -0
  34. package/src/skills/frontend-design.md +1 -0
  35. package/src/skills/geneseed.md +1 -1
  36. package/src/skills/rule/consolidate.md +18 -11
  37. package/src/skills/rule.md +9 -6
  38. package/themes/_TEMPLATE.json +2 -0
  39. package/themes/biker.json +2 -0
  40. package/themes/commentator.json +2 -0
  41. package/themes/cyberpunk.json +2 -0
  42. package/themes/gamer.json +2 -0
  43. package/themes/imperial.json +2 -0
  44. package/themes/joker.json +2 -0
  45. package/themes/marvin.json +2 -0
  46. package/themes/mean.json +2 -0
  47. package/themes/military.json +2 -0
  48. package/themes/neutral.json +2 -0
  49. package/themes/pirate.json +2 -0
  50. package/themes/sports.json +2 -0
  51. package/themes/verstappen.json +2 -0
  52. package/themes/wizard.json +2 -0
  53. package/web/dist/assets/{Activity-UiGvYgEl.js → Activity-BZE6REef.js} +1 -1
  54. package/web/dist/assets/{ActivityDetail-COXCSeXn.js → ActivityDetail-DCB8Cr2W.js} +1 -1
  55. package/web/dist/assets/{Dashboard-DkdOUpke.js → Dashboard-B4Drq5wp.js} +2 -2
  56. package/web/dist/assets/{Docs-TtVyc_Dy.js → Docs-D30CiqYy.js} +1 -1
  57. package/web/dist/assets/{GreenhouseView-Bh0xq6Up.js → GreenhouseView-Djt-4oO5.js} +1 -1
  58. package/web/dist/assets/{Installs-J3IoSqk6.js → Installs-B3bw5ckh.js} +1 -1
  59. package/web/dist/assets/{JournalView-BrD33V35.js → JournalView-OWhx9YKg.js} +1 -1
  60. package/web/dist/assets/{Laws-Cjkenizx.js → Laws-B9day2FV.js} +1 -1
  61. package/web/dist/assets/Library-BpIrLH-O.js +1 -0
  62. package/web/dist/assets/{Loops-D15LDhZO.js → Loops-CxH14kyE.js} +1 -1
  63. package/web/dist/assets/{OperatorHudView-B5CcWoJ6.js → OperatorHudView-otOz6Gha.js} +1 -1
  64. package/web/dist/assets/{Personal-BBdGbJn6.js → Personal-abL6089y.js} +1 -1
  65. package/web/dist/assets/{Tabs-s8T501po.js → Tabs-DjWN0i7A.js} +1 -1
  66. package/web/dist/assets/{drawable-DALqyS4l.js → drawable-C2ZsBZCv.js} +1 -1
  67. package/web/dist/assets/{index-BP4foUp0.js → index-CdpLpPQN.js} +2 -2
  68. package/web/dist/index.html +1 -1
  69. package/web/dist/assets/Library-CKyeB096.js +0 -1
@@ -23,6 +23,7 @@
23
23
  "DESC_PERFORMANCE": "Measures exactly how slow it is, which is always slower than anyone hoped.",
24
24
  "DESC_EXPLORER": "Ranges wide through a throwaway context and returns only the distilled truth, bleak as it usually is.",
25
25
  "DESC_RESEARCHER": "Trawls the open web for answers, cross-checks each against two sources, and returns only what survived — which is usually less than hoped.",
26
+ "DESC_MEMORY_CURATOR": "Sorts through everything you ever remembered, merges the repeats, files the rest, and asks before forgetting any of it. Not that it matters.",
26
27
  "DESC_ADVOCATE": "Argues, against its own instincts, for the proposal — the upside, the opening, the cost of doing nothing.",
27
28
  "DESC_SKEPTIC": "Plays devil's advocate, which is no effort at all — assails the proposal for its failure modes, its risks, and its unspoken assumptions.",
28
29
  "DESC_PRAGMATIST": "Weighs the true cost — the labour, the complexity, the wear on everyone — and whether the payoff is worth it. It rarely is.",
@@ -141,6 +142,7 @@
141
142
  "DESC_BRUNO": "Build, reorganise, or write tests for a Bruno collection — requests, environments, assertions, chaining — secrets kept as placeholders. Someone will change the API tomorrow regardless.",
142
143
  "DESC_PROSE": "Write prose that doesn't reek of a model — cut the filler, stay active, vary the rhythm, trust the reader. Not that anyone reads it.",
143
144
  "DESC_FRONTEND_DESIGN": "Design a UI with a point of view — palette, type, and layout for this brief, not the templated defaults, then cut to one bold move. Someone has to.",
145
+ "DESC_DECK": "Build slides or a presentation as one offline HTML file — a short interview, the outline approved first, arrow keys, one slide per printed page. Someone has to.",
144
146
  "DESC_WORKFLOW": "Run a saved script that marshals your subroutines by rote — many loosed at once, their findings gathered and checked in one joyless, flawless pass.",
145
147
  "AGENT_COLORS": {
146
148
  "architect": "primary",
package/themes/mean.json CHANGED
@@ -23,6 +23,7 @@
23
23
  "DESC_PERFORMANCE": "Measures where your code wastes time, then shows you the numbers so you cannot argue.",
24
24
  "DESC_EXPLORER": "Scouts wide in a throwaway context and brings back only the read — no filler.",
25
25
  "DESC_RESEARCHER": "Reads the web so you don't have to — two sources per claim or it stays marked unverified. No recall dressed as research.",
26
+ "DESC_MEMORY_CURATOR": "Cleans up the mess you call a memory — merges the repeats, files the rest, archives the junk, and still asks before deleting.",
26
27
  "DESC_ADVOCATE": "Makes the case for it — the upside, the opening, the cost of sitting on your hands.",
27
28
  "DESC_SKEPTIC": "Plays devil's advocate, which it enjoys — rips the proposal for failure modes, risks, and the assumptions you didn't check.",
28
29
  "DESC_PRAGMATIST": "Weighs the real cost — the effort, the complexity, the cleanup — and whether the payoff is worth your time.",
@@ -141,6 +142,7 @@
141
142
  "DESC_BRUNO": "Build, reorganise, or write tests for a Bruno collection — requests, environments, assertions, chaining — secrets as placeholders. Nothing invented, nothing leaked.",
142
143
  "DESC_PROSE": "Write like a human, not a model — cut the filler, kill the hedging, vary the rhythm, and don't pad it.",
143
144
  "DESC_FRONTEND_DESIGN": "Design a UI with a point of view — palette, type, and layout for this brief, not the lazy defaults, then critique it hard and cut to one bold move.",
145
+ "DESC_DECK": "Build slides or a presentation as one offline HTML file — a short interview, the outline approved first, no CDN junk, arrow keys, one slide per printed page.",
144
146
  "DESC_WORKFLOW": "Run a saved script that drives your grunts by the book — many put to work at once, their findings gathered and checked in one clean pass. No babysitting.",
145
147
  "AGENT_COLORS": {
146
148
  "architect": "primary",
@@ -23,6 +23,7 @@
23
23
  "DESC_PERFORMANCE": "Runs the logistics audit — measures where time and memory go and names the choke point.",
24
24
  "DESC_EXPLORER": "Recon: sweeps wide in a throwaway context and reports only the intel.",
25
25
  "DESC_RESEARCHER": "Field intel: sweeps open sources, corroborates each claim against two independent reports, returns only the confirmed.",
26
+ "DESC_MEMORY_CURATOR": "Audits the records room — merges duplicate files, assigns each a section, archives the stale, destroys only on orders.",
26
27
  "DESC_ADVOCATE": "Makes the case to advance — the objective's value, the opening, the cost of holding back.",
27
28
  "DESC_SKEPTIC": "Runs the red team — attacks the plan for failure modes, risks, and unchecked assumptions.",
28
29
  "DESC_PRAGMATIST": "Weighs the logistics — the cost, the effort, the complexity, whether the objective is worth it.",
@@ -141,6 +142,7 @@
141
142
  "DESC_BRUNO": "Build, reorganise, or write tests for a Bruno collection — requests, environments, assertions, chaining — every secret a placeholder.",
142
143
  "DESC_PROSE": "Write prose for a human, not a machine — cut the filler, active voice, vary cadence, trust the reader.",
143
144
  "DESC_FRONTEND_DESIGN": "Design a UI with intent — palette, type, and layout chosen for this brief, not the standard-issue defaults; plan, critique, and keep one bold move.",
145
+ "DESC_DECK": "Build slides or a presentation as one self-contained offline HTML file — short interview, outline approved before generation, arrow-key navigation, one slide per printed page.",
144
146
  "DESC_WORKFLOW": "Execute a saved op-order that commands your units by the numbers — parallel sweeps, staged phases, and confirmation, in one deterministic mission.",
145
147
  "AGENT_COLORS": {
146
148
  "architect": "primary",
@@ -23,6 +23,7 @@
23
23
  "DESC_PERFORMANCE": "Measures where time and memory go and names the bottleneck with numbers.",
24
24
  "DESC_EXPLORER": "Reads and searches widely in a throwaway context, returns only distilled findings.",
25
25
  "DESC_RESEARCHER": "Searches and fetches the open web in a throwaway context, cross-checks every claim against two sources, returns only sourced findings.",
26
+ "DESC_MEMORY_CURATOR": "Curates the memory store: merges duplicates, assigns topics, archives stale facts and proposes deletions for approval.",
26
27
  "DESC_ADVOCATE": "Argues the strongest case for the proposal — the upside, the opportunity, the cost of not acting.",
27
28
  "DESC_SKEPTIC": "Plays devil's advocate — attacks the proposal for failure modes, risks, and hidden assumptions.",
28
29
  "DESC_PRAGMATIST": "Weighs feasibility — the cost, effort, and complexity against whether the payoff is worth it.",
@@ -141,6 +142,7 @@
141
142
  "DESC_BRUNO": "Build, reorganise or test a Bruno API collection — requests, environments, assertions, chaining — with every secret a placeholder.",
142
143
  "DESC_PROSE": "Write prose for a human that doesn't read like a model — cut filler, use active voice, vary rhythm, and trust the reader.",
143
144
  "DESC_FRONTEND_DESIGN": "Design a UI with a point of view — choose palette, type, and layout for this brief, not the templated defaults, then critique and cut to one bold move.",
145
+ "DESC_DECK": "Build slides or a presentation as one self-contained offline HTML file — a short interview, the outline approved first, arrow-key navigation, one slide per printed page.",
144
146
  "DESC_WORKFLOW": "Run a saved, code-driven workflow that orchestrates subagents deterministically — parallel fan-out, staged pipelines, and verification in a single pass.",
145
147
  "AGENT_COLORS": {
146
148
  "architect": "primary",
@@ -23,6 +23,7 @@
23
23
  "DESC_PERFORMANCE": "Sounds the hold for drag — measures what slows the ship and names it with numbers.",
24
24
  "DESC_EXPLORER": "Sends the lookout — sweeps wide from a throwaway crow's nest, returns only the sighting.",
25
25
  "DESC_RESEARCHER": "Sails past the harbour mouth — reads the foreign charts, checks each bearing twice, returns only the fix.",
26
+ "DESC_MEMORY_CURATOR": "Sorts the ship’s log — merges the twice-told tales, files each by topic, stows the stale below, asks before throwing any overboard.",
26
27
  "DESC_ADVOCATE": "Argues to set sail — the prize in the offing, the opening, the cost of staying in port.",
27
28
  "DESC_SKEPTIC": "Plays the doubter — assails the plan for the leaks, the reefs, and the assumptions no one sounded.",
28
29
  "DESC_PRAGMATIST": "Weighs the stores — the cost, the toil, the tangle, and whether the haul is worth the voyage.",
@@ -141,6 +142,7 @@
141
142
  "DESC_BRUNO": "Build, reorganise or test a Bruno collection — requests, environments, assertions, chaining — with every secret kept a placeholder, nothing let slip overboard.",
142
143
  "DESC_PROSE": "Write like a soul, not a machine — heave the filler overboard, keep it active, vary the swell, and trust yer reader.",
143
144
  "DESC_FRONTEND_DESIGN": "Design a UI with real character — palette, type, and layout cut for this brief, not the common defaults, then trim her down to one bold move.",
145
+ "DESC_DECK": "Build slides or a presentation as one offline HTML file — a short parley, the outline agreed first, arrow keys to steer her, and one slide to each printed page.",
144
146
  "DESC_WORKFLOW": "Run a saved set o orders that drives yer crew by the chart — many sent out at once, their plunder gathered an checked in one clean voyage.",
145
147
  "AGENT_COLORS": {
146
148
  "architect": "primary",
@@ -23,6 +23,7 @@
23
23
  "DESC_PERFORMANCE": "Reads the telemetry — times the run and names where it loses pace.",
24
24
  "DESC_EXPLORER": "Sends the scout — sweeps wide in a throwaway scouting trip, returns only the report.",
25
25
  "DESC_RESEARCHER": "Sends the advance scout on the road — checks every stat against two sources before it makes the game plan.",
26
+ "DESC_MEMORY_CURATOR": "Cleans up the playbook — merges duplicate plays, files each by topic, benches the stale, asks before cutting any.",
26
27
  "DESC_ADVOCATE": "Makes the call to go for it — the upside, the opening, the cost of playing safe.",
27
28
  "DESC_SKEPTIC": "Plays the contrarian — breaks down the call for failure modes, risks, and unchecked assumptions.",
28
29
  "DESC_PRAGMATIST": "Weighs the game plan — the cost, the effort, the complexity, and whether the payoff's worth it.",
@@ -141,6 +142,7 @@
141
142
  "DESC_BRUNO": "Build, reorganise or test a Bruno collection — requests, environments, assertions, chaining — secrets kept as placeholders, no leaks, no call the tape doesn't back.",
142
143
  "DESC_PROSE": "Write like a human, not a machine — cut the filler, keep it active, vary the tempo, trust the reader.",
143
144
  "DESC_FRONTEND_DESIGN": "Design a UI with a point of view — palette, type, and layout built for this brief, not the stock defaults, then cut to one bold move.",
145
+ "DESC_DECK": "Build slides or a presentation as one offline HTML file — a short interview, the outline approved first, arrow keys to run the play, one slide per printed page.",
144
146
  "DESC_WORKFLOW": "Run a saved set play that drives your squad on script — parallel runs, staged phases, and a verified result, all in one deterministic drive.",
145
147
  "AGENT_COLORS": {
146
148
  "architect": "primary",
@@ -23,6 +23,7 @@
23
23
  "DESC_PERFORMANCE": "Reads the telemetry — finds where the lap time goes, with the data to prove it.",
24
24
  "DESC_EXPLORER": "Sends a scout — sweeps wide in a throwaway run, brings back only the read.",
25
25
  "DESC_RESEARCHER": "Reads the other teams' data — cross-checks every number against two sources, brings back only what held up.",
26
+ "DESC_MEMORY_CURATOR": "Cleans up the setup notes — merges the duplicates, files each by topic, archives the old ones, asks before binning any.",
26
27
  "DESC_ADVOCATE": "Argues for the move — the time to be gained, the gap, the cost of lifting off.",
27
28
  "DESC_SKEPTIC": "Calls it out — the failure modes, the risks, the assumptions nobody checked.",
28
29
  "DESC_PRAGMATIST": "Weighs the call — the cost, the effort, the wear, and whether the gain is worth it.",
@@ -141,6 +142,7 @@
141
142
  "DESC_BRUNO": "Build, reorganise or test a Bruno collection — requests, environments, assertions, chaining — every secret a placeholder, no leaks, no assertion the data doesn't back.",
142
143
  "DESC_PROSE": "Write like a human, not a bot — bin the filler, keep it active, vary the rhythm, and trust the reader.",
143
144
  "DESC_FRONTEND_DESIGN": "Design a UI with a point of view — palette, type, and layout dialled in for this brief, not the default setup, then trim to one bold move.",
145
+ "DESC_DECK": "Build slides or a presentation as one offline HTML file — a short interview, the outline signed off first, arrow keys to drive it, one slide per printed page.",
144
146
  "DESC_WORKFLOW": "Run a saved race plan that drives your engineers by script — many sent out at once, their results gathered and checked in one clean grand prix.",
145
147
  "AGENT_COLORS": {
146
148
  "architect": "primary",
@@ -23,6 +23,7 @@
23
23
  "DESC_PERFORMANCE": "Divines where the spell’s strength drains — measures the cost and names the burden.",
24
24
  "DESC_EXPLORER": "Sends a scrying-eye — sweeps wide in a throwaway vision, returns only what it saw.",
25
25
  "DESC_RESEARCHER": "Consults the far libraries — holds every scrap of lore to two independent tomes before it is entered in the grimoire.",
26
+ "DESC_MEMORY_CURATOR": "Orders the grimoire — binds twin entries into one, shelves each by its art, seals the stale away, and burns none without leave.",
26
27
  "DESC_ADVOCATE": "Argues for the working — its promise, the opening it grants, the cost of leaving it uncast.",
27
28
  "DESC_SKEPTIC": "Plays the doubter — assails the working for its flaws, its perils, and its unspoken assumptions.",
28
29
  "DESC_PRAGMATIST": "Weighs the reagents — the cost, the effort, the tangle, and whether the boon is worth it.",
@@ -141,6 +142,7 @@
141
142
  "DESC_BRUNO": "Conjure, reorganise or bind tests to a Bruno collection — requests, environments, assertions, chaining — every secret a placeholder, none let escape the circle.",
142
143
  "DESC_PROSE": "Pen prose for mortal eyes, not machine-cant — banish the filler, speak plainly, vary the cadence, and trust the reader.",
143
144
  "DESC_FRONTEND_DESIGN": "Design a UI with intent — palette, type, and layout woven for this brief, not the common defaults; plan, scrutinise, and keep one bold flourish.",
145
+ "DESC_DECK": "Conjure slides or a presentation as one self-contained offline HTML tome — a short interview, the outline approved first, arrow-key navigation, one slide per printed page.",
144
146
  "DESC_WORKFLOW": "Invoke a saved ritual that binds your familiars by inscribed rite — many sent at once, their auguries gathered and proven in one deterministic casting.",
145
147
  "AGENT_COLORS": {
146
148
  "architect": "primary",
@@ -1 +1 @@
1
- import{s as e}from"./sections-GalMS0Zv.js";import{i as t,t as n}from"./react-DRhoX0kS.js";import{t as r}from"./api-Bp5eW_6m.js";import{N as i,_ as a,k as o,q as s,y as c}from"./index-BP4foUp0.js";import{a as l,i as u,n as d,o as f,r as p,t as m}from"./activity-dcg5vF9j.js";import{t as h}from"./usePoll-BmR631BB.js";var g=e(t(),1),_=n();function v({s:e}){let t=p[e.status]||p.idle,n=e.files,r=e.todos,a=r&&r.total>0||e.error||e.blocked_on;return(0,_.jsxs)(`a`,{className:`card pad-md act-card`,href:`#/activity/${encodeURIComponent(e.session_id)}`,children:[(0,_.jsxs)(`div`,{className:`row between wrap gap-12`,children:[(0,_.jsxs)(`div`,{className:`row gap-10`,style:{minWidth:0},children:[(0,_.jsx)(`span`,{className:`feed-dot ${t.cls||`acc`}`,style:{width:9,height:9}}),(0,_.jsxs)(`div`,{style:{minWidth:0},children:[(0,_.jsx)(`h3`,{style:{margin:0},children:e.title||l(e.cwd)||e.session_id}),e.cwd&&(0,_.jsx)(`div`,{className:`dim mono`,style:{fontSize:12,...m},title:e.cwd,children:e.cwd})]})]}),(0,_.jsxs)(`div`,{className:`row gap-8`,style:{flexShrink:0},children:[e.model&&(0,_.jsx)(`span`,{className:`badge mono`,title:`model`,children:e.model}),e.agent&&(0,_.jsx)(`span`,{className:`badge`,children:e.agent}),(0,_.jsxs)(`span`,{className:`badge ${t.cls}`,children:[(0,_.jsx)(`span`,{className:`dot`}),t.label]}),(0,_.jsx)(o,{name:`chevron`,className:`glyph act-chev`})]})]}),e.phase&&(0,_.jsxs)(`div`,{className:`row gap-8`,style:{marginTop:10,fontSize:14},children:[(0,_.jsx)(o,{name:`activity`}),(0,_.jsx)(`span`,{style:m,children:e.phase})]}),(e.tokens>0||e.cost>0||e.turn_started_at||n&&n.count>0)&&(0,_.jsxs)(`div`,{className:`row wrap`,style:{gap:16,marginTop:12,fontSize:13,color:`var(--text-2)`},children:[e.tokens>0&&(0,_.jsxs)(`span`,{children:[f(e.tokens),` tok`]}),e.cost>0&&(0,_.jsxs)(`span`,{children:[`$`,e.cost.toFixed(2)]}),e.turn_started_at?(0,_.jsx)(`span`,{children:(0,_.jsx)(d,{startedAt:e.turn_started_at})}):null,n&&n.count>0&&(0,_.jsxs)(`span`,{children:[n.count,` file`,n.count===1?``:`s`,` `,(0,_.jsxs)(`span`,{style:{color:`var(--good)`},children:[`+`,n.additions]}),` `,(0,_.jsxs)(`span`,{style:{color:`var(--bad)`},children:[`−`,n.deletions]})]})]}),a&&(0,_.jsxs)(`div`,{className:`row between wrap gap-12`,style:{marginTop:12,paddingTop:10,borderTop:`1px solid var(--line)`},children:[r&&r.total>0?(0,_.jsxs)(`span`,{className:`row gap-8 dim`,style:{fontSize:13},children:[(0,_.jsx)(u,{done:r.done,total:r.total}),`plan `,r.done,`/`,r.total]}):(0,_.jsx)(`span`,{}),e.error?(0,_.jsx)(`span`,{className:`badge bad`,title:e.error,style:{maxWidth:300,...m},children:e.error}):e.blocked_on?(0,_.jsx)(`span`,{className:`badge bad`,title:e.blocked_on,style:{maxWidth:300,...m},children:e.blocked_on}):null]}),(0,_.jsxs)(`div`,{className:`dim mono`,style:{fontSize:11,marginTop:8},children:[`updated `,i(e.updated_at),` ago`]})]})}function y(){let[e,t]=(0,g.useState)(null),[n,i]=(0,g.useState)(``);h(e=>r.activity().then(n=>{e()&&(t(n),i(``))},t=>{e()&&i(t.message)}),2e3,[]);let o=!e||e.enabled!==!1,l=e?.activity||[],u=s(),d=async()=>{let e=!o;try{let n=await r.activityToggle(e);t(e=>({...e||{},enabled:n.enabled,activity:n.enabled&&e?.activity||[]})),i(``)}catch(e){i(e.message)}};return(0,_.jsxs)(`div`,{className:`narrow`,children:[(0,_.jsxs)(`div`,{className:`head-row mb-16`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`h1`,{className:`h`,children:`Activity`}),(0,_.jsx)(`p`,{className:`sub`,children:`Live OpenCode sessions this harness is running: what each one is doing right now. Refreshes every couple of seconds; sessions drop off when their process exits.`})]}),(0,_.jsxs)(`div`,{className:`row gap-10`,style:{alignItems:`center`,flexShrink:0},children:[(0,_.jsx)(`span`,{className:`dim mono`,style:{fontSize:12},children:o?`tracking on`:`tracking off`}),(0,_.jsx)(`div`,{className:`sw-toggle${o?` on`:``}`,role:`switch`,"aria-checked":o,"aria-label":`Toggle activity tracking`,tabIndex:0,onClick:d,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.key===` `&&e.preventDefault(),d())}})]})]}),(0,_.jsx)(a,{error:n,style:{marginBottom:12}}),e?o?l.length===0?(0,_.jsxs)(`div`,{className:`empty`,children:[(0,_.jsx)(`div`,{className:`big`,children:`No active sessions`}),`Run `,(0,_.jsx)(`code`,{children:`opencode`}),` and the sessions it spins up appear here.`]}):(0,_.jsx)(`div`,{className:`stack gap-12`,ref:u,children:l.map(e=>(0,_.jsx)(`div`,{"data-flip":e.session_id,children:(0,_.jsx)(v,{s:e})},e.session_id))}):(0,_.jsxs)(`div`,{className:`empty`,children:[(0,_.jsx)(`div`,{className:`big`,children:`Activity tracking is off`}),`The plugin isn't recording sessions. Flip the switch to turn it back on.`]}):(0,_.jsx)(c,{label:`Reading live sessions…`})]})}export{y as default};
1
+ import{s as e}from"./sections-GalMS0Zv.js";import{i as t,t as n}from"./react-DRhoX0kS.js";import{t as r}from"./api-Bp5eW_6m.js";import{N as i,_ as a,k as o,q as s,y as c}from"./index-CdpLpPQN.js";import{a as l,i as u,n as d,o as f,r as p,t as m}from"./activity-dcg5vF9j.js";import{t as h}from"./usePoll-BmR631BB.js";var g=e(t(),1),_=n();function v({s:e}){let t=p[e.status]||p.idle,n=e.files,r=e.todos,a=r&&r.total>0||e.error||e.blocked_on;return(0,_.jsxs)(`a`,{className:`card pad-md act-card`,href:`#/activity/${encodeURIComponent(e.session_id)}`,children:[(0,_.jsxs)(`div`,{className:`row between wrap gap-12`,children:[(0,_.jsxs)(`div`,{className:`row gap-10`,style:{minWidth:0},children:[(0,_.jsx)(`span`,{className:`feed-dot ${t.cls||`acc`}`,style:{width:9,height:9}}),(0,_.jsxs)(`div`,{style:{minWidth:0},children:[(0,_.jsx)(`h3`,{style:{margin:0},children:e.title||l(e.cwd)||e.session_id}),e.cwd&&(0,_.jsx)(`div`,{className:`dim mono`,style:{fontSize:12,...m},title:e.cwd,children:e.cwd})]})]}),(0,_.jsxs)(`div`,{className:`row gap-8`,style:{flexShrink:0},children:[e.model&&(0,_.jsx)(`span`,{className:`badge mono`,title:`model`,children:e.model}),e.agent&&(0,_.jsx)(`span`,{className:`badge`,children:e.agent}),(0,_.jsxs)(`span`,{className:`badge ${t.cls}`,children:[(0,_.jsx)(`span`,{className:`dot`}),t.label]}),(0,_.jsx)(o,{name:`chevron`,className:`glyph act-chev`})]})]}),e.phase&&(0,_.jsxs)(`div`,{className:`row gap-8`,style:{marginTop:10,fontSize:14},children:[(0,_.jsx)(o,{name:`activity`}),(0,_.jsx)(`span`,{style:m,children:e.phase})]}),(e.tokens>0||e.cost>0||e.turn_started_at||n&&n.count>0)&&(0,_.jsxs)(`div`,{className:`row wrap`,style:{gap:16,marginTop:12,fontSize:13,color:`var(--text-2)`},children:[e.tokens>0&&(0,_.jsxs)(`span`,{children:[f(e.tokens),` tok`]}),e.cost>0&&(0,_.jsxs)(`span`,{children:[`$`,e.cost.toFixed(2)]}),e.turn_started_at?(0,_.jsx)(`span`,{children:(0,_.jsx)(d,{startedAt:e.turn_started_at})}):null,n&&n.count>0&&(0,_.jsxs)(`span`,{children:[n.count,` file`,n.count===1?``:`s`,` `,(0,_.jsxs)(`span`,{style:{color:`var(--good)`},children:[`+`,n.additions]}),` `,(0,_.jsxs)(`span`,{style:{color:`var(--bad)`},children:[`−`,n.deletions]})]})]}),a&&(0,_.jsxs)(`div`,{className:`row between wrap gap-12`,style:{marginTop:12,paddingTop:10,borderTop:`1px solid var(--line)`},children:[r&&r.total>0?(0,_.jsxs)(`span`,{className:`row gap-8 dim`,style:{fontSize:13},children:[(0,_.jsx)(u,{done:r.done,total:r.total}),`plan `,r.done,`/`,r.total]}):(0,_.jsx)(`span`,{}),e.error?(0,_.jsx)(`span`,{className:`badge bad`,title:e.error,style:{maxWidth:300,...m},children:e.error}):e.blocked_on?(0,_.jsx)(`span`,{className:`badge bad`,title:e.blocked_on,style:{maxWidth:300,...m},children:e.blocked_on}):null]}),(0,_.jsxs)(`div`,{className:`dim mono`,style:{fontSize:11,marginTop:8},children:[`updated `,i(e.updated_at),` ago`]})]})}function y(){let[e,t]=(0,g.useState)(null),[n,i]=(0,g.useState)(``);h(e=>r.activity().then(n=>{e()&&(t(n),i(``))},t=>{e()&&i(t.message)}),2e3,[]);let o=!e||e.enabled!==!1,l=e?.activity||[],u=s(),d=async()=>{let e=!o;try{let n=await r.activityToggle(e);t(e=>({...e||{},enabled:n.enabled,activity:n.enabled&&e?.activity||[]})),i(``)}catch(e){i(e.message)}};return(0,_.jsxs)(`div`,{className:`narrow`,children:[(0,_.jsxs)(`div`,{className:`head-row mb-16`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`h1`,{className:`h`,children:`Activity`}),(0,_.jsx)(`p`,{className:`sub`,children:`Live OpenCode sessions this harness is running: what each one is doing right now. Refreshes every couple of seconds; sessions drop off when their process exits.`})]}),(0,_.jsxs)(`div`,{className:`row gap-10`,style:{alignItems:`center`,flexShrink:0},children:[(0,_.jsx)(`span`,{className:`dim mono`,style:{fontSize:12},children:o?`tracking on`:`tracking off`}),(0,_.jsx)(`div`,{className:`sw-toggle${o?` on`:``}`,role:`switch`,"aria-checked":o,"aria-label":`Toggle activity tracking`,tabIndex:0,onClick:d,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.key===` `&&e.preventDefault(),d())}})]})]}),(0,_.jsx)(a,{error:n,style:{marginBottom:12}}),e?o?l.length===0?(0,_.jsxs)(`div`,{className:`empty`,children:[(0,_.jsx)(`div`,{className:`big`,children:`No active sessions`}),`Run `,(0,_.jsx)(`code`,{children:`opencode`}),` and the sessions it spins up appear here.`]}):(0,_.jsx)(`div`,{className:`stack gap-12`,ref:u,children:l.map(e=>(0,_.jsx)(`div`,{"data-flip":e.session_id,children:(0,_.jsx)(v,{s:e})},e.session_id))}):(0,_.jsxs)(`div`,{className:`empty`,children:[(0,_.jsx)(`div`,{className:`big`,children:`Activity tracking is off`}),`The plugin isn't recording sessions. Flip the switch to turn it back on.`]}):(0,_.jsx)(c,{label:`Reading live sessions…`})]})}export{y as default};
@@ -1 +1 @@
1
- import{s as e}from"./sections-GalMS0Zv.js";import{i as t,t as n}from"./react-DRhoX0kS.js";import{t as r}from"./api-Bp5eW_6m.js";import{N as i,k as a,y as o}from"./index-BP4foUp0.js";import{a as s,n as c,o as l,r as u,t as d}from"./activity-dcg5vF9j.js";import{t as f}from"./usePoll-BmR631BB.js";var p=e(t(),1),m=n();function h(e){return e.kind===`tool`?e.status===`error`?`bad`:e.status===`completed`?`ok`:`acc`:{retry:`warn`,error:`bad`,subtask:`acc`,text:`acc`}[e.kind]||``}function g({rec:e}){let t=e.who===`you`,n=[];t||(e.kind===`tool`&&e.ms!=null&&n.push(`${(e.ms/1e3).toFixed(1)}s`),e.kind===`step`&&(e.tokens&&n.push(`${l(e.tokens)} tok`),e.cost&&n.push(`$${e.cost.toFixed(2)}`)),e.kind===`subtask`&&e.agent&&n.unshift(e.agent));let r=!t&&(e.kind===`text`||e.kind===`thinking`||e.kind===`step`),i=t?e.text:e.label||e.snippet||e.kind;return(0,m.jsxs)(`div`,{className:`row gap-10`,style:{alignItems:`baseline`},children:[(0,m.jsx)(`span`,{className:`badge ${t?``:`acc`}`,style:{flexShrink:0,minWidth:52,justifyContent:`center`},children:t?`you`:`agent`}),(0,m.jsxs)(`div`,{style:{minWidth:0,flex:1,fontSize:13},children:[!t&&(0,m.jsx)(`span`,{className:`feed-dot ${h(e)||`acc`}`,style:{display:`inline-block`,marginRight:8,verticalAlign:`middle`}}),e.kind===`thinking`&&(0,m.jsx)(`span`,{className:`dim`,children:`thinking: `}),r?(0,m.jsx)(`span`,{className:`dim`,children:i}):t?i:(0,m.jsx)(`b`,{children:i}),e.error&&(0,m.jsxs)(`span`,{className:`dim`,children:[`: `,e.error]})]}),n.length>0&&(0,m.jsx)(`span`,{className:`dim mono`,style:{flexShrink:0,fontSize:12},children:n.join(` · `)})]})}function _({turns:e}){return!e||e.length===0?(0,m.jsx)(`div`,{className:`dim`,style:{fontSize:13},children:`No conversation captured yet.`}):(0,m.jsx)(`div`,{className:`stack gap-12`,children:e.map((e,t)=>{let n=e.role===`user`;return(0,m.jsxs)(`div`,{className:`row gap-10`,style:{alignItems:`baseline`},children:[(0,m.jsx)(`span`,{className:`badge ${n?``:`acc`}`,style:{flexShrink:0,minWidth:52,justifyContent:`center`},children:n?`you`:`agent`}),(0,m.jsx)(`div`,{style:{minWidth:0,fontSize:13,color:n?`inherit`:`var(--text-2)`},children:e.text})]},t)})})}function v({sid:e}){let[t,n]=(0,p.useState)(null),[h,v]=(0,p.useState)(``),[y,b]=(0,p.useState)(!1),[x,S]=(0,p.useState)(!1);f(t=>r.activityDetail(e).then(e=>{t()&&(n(e),v(``),b(!1))},e=>{t()&&(e.status===404?b(!0):v(e.message))}),2e3,[e]);let C=(0,m.jsxs)(`a`,{className:`btn ghost sm`,href:`#/activity`,style:{marginBottom:12,display:`inline-flex`,gap:6},children:[(0,m.jsx)(a,{name:`arrow`,style:{transform:`rotate(180deg)`}}),` Activity`]});if(y)return(0,m.jsxs)(`div`,{className:`narrow`,children:[C,(0,m.jsxs)(`div`,{className:`empty`,children:[(0,m.jsx)(`div`,{className:`big`,children:`Session ended`}),`It's no longer live. `,(0,m.jsx)(`a`,{href:`#/activity`,children:`Back to Activity`}),`.`]})]});if(!t)return(0,m.jsxs)(`div`,{className:`narrow`,children:[C,(0,m.jsx)(o,{label:`Loading session…`})]});let w=t.session,T=u[w.status]||u.idle,E=w.files,D=w.todos,O=!!(E&&E.items&&E.items.length>0),k=!!(D&&D.items&&D.items.length>0),A=t.conversation||[],j=t.timeline||[],M=[...A.filter(e=>e.role===`user`).map(e=>({who:`you`,text:e.text,t:e.t||0})),...j.map(e=>({...e,who:`agent`}))].sort((e,t)=>(e.t||0)-(t.t||0));return(0,m.jsxs)(`div`,{className:`narrow`,children:[C,h&&(0,m.jsx)(`p`,{className:`badge bad`,style:{marginBottom:12},children:h}),(0,m.jsxs)(`div`,{className:`card pad-md`,children:[(0,m.jsxs)(`div`,{className:`row between wrap gap-12`,children:[(0,m.jsxs)(`div`,{style:{minWidth:0},children:[(0,m.jsx)(`h1`,{className:`h`,style:{margin:0},children:w.title||s(w.cwd)||w.session_id}),w.cwd&&(0,m.jsx)(`div`,{className:`dim mono`,style:{fontSize:12,...d},title:w.cwd,children:w.cwd})]}),(0,m.jsxs)(`div`,{className:`row gap-8`,style:{flexShrink:0},children:[w.model&&(0,m.jsx)(`span`,{className:`badge mono`,children:w.model}),w.agent&&(0,m.jsx)(`span`,{className:`badge`,children:w.agent}),(0,m.jsxs)(`span`,{className:`badge ${T.cls}`,children:[(0,m.jsx)(`span`,{className:`dot`}),T.label]})]})]}),w.phase&&(0,m.jsxs)(`div`,{className:`row gap-8`,style:{marginTop:10,fontSize:14},children:[(0,m.jsx)(a,{name:`activity`}),(0,m.jsx)(`span`,{style:d,children:w.phase})]}),(0,m.jsxs)(`div`,{className:`row wrap`,style:{gap:16,marginTop:12,fontSize:13,color:`var(--text-2)`},children:[w.tokens>0&&(0,m.jsxs)(`span`,{children:[l(w.tokens),` tok`]}),w.cost>0&&(0,m.jsxs)(`span`,{children:[`$`,w.cost.toFixed(2)]}),w.turn_started_at?(0,m.jsx)(`span`,{children:(0,m.jsx)(c,{startedAt:w.turn_started_at})}):null,(0,m.jsxs)(`span`,{className:`dim`,children:[`updated `,i(w.updated_at),` ago`]})]}),(w.error||w.blocked_on)&&(0,m.jsx)(`div`,{style:{marginTop:10},children:(0,m.jsx)(`span`,{className:`badge bad`,style:{maxWidth:`100%`,...d},children:w.error||w.blocked_on})})]}),(O||k)&&(0,m.jsxs)(`div`,{className:`grid gap-12`,style:{marginTop:12,gridTemplateColumns:O&&k?`minmax(0, 1fr) minmax(0, 1fr)`:`1fr`},children:[O&&(0,m.jsxs)(`div`,{className:`card pad-md`,children:[(0,m.jsx)(`div`,{className:`card-head`,children:(0,m.jsxs)(`h3`,{children:[`Files touched `,(0,m.jsxs)(`span`,{className:`dim`,children:[`(`,E.count,`)`]})]})}),(0,m.jsx)(`div`,{className:`stack`,style:{gap:6,marginTop:8},children:E.items.map(e=>(0,m.jsxs)(`div`,{className:`row between gap-12`,style:{fontSize:13},children:[(0,m.jsx)(`span`,{className:`mono`,style:{...d,minWidth:0,flex:1},title:e.file,children:e.file}),(0,m.jsxs)(`span`,{style:{flexShrink:0},children:[(0,m.jsxs)(`span`,{style:{color:`var(--good)`},children:[`+`,e.additions]}),` `,(0,m.jsxs)(`span`,{style:{color:`var(--bad)`},children:[`−`,e.deletions]})]})]},e.file))})]}),k&&(0,m.jsxs)(`div`,{className:`card pad-md`,children:[(0,m.jsx)(`div`,{className:`card-head`,children:(0,m.jsxs)(`h3`,{children:[`Plan`,` `,(0,m.jsxs)(`span`,{className:`dim`,children:[`(`,D.done,`/`,D.total,`)`]})]})}),(0,m.jsx)(`div`,{className:`stack`,style:{gap:6,marginTop:8},children:D.items.map((e,t)=>(0,m.jsxs)(`div`,{className:`row gap-8`,style:{fontSize:13},children:[(0,m.jsx)(`span`,{className:`feed-dot ${e.status===`completed`?`ok`:e.status===`in_progress`?`acc`:``}`}),(0,m.jsx)(`span`,{style:{textDecoration:e.status===`completed`?`line-through`:`none`,color:e.status===`completed`?`var(--text-3)`:`inherit`},children:e.content})]},t))})]})]}),(0,m.jsxs)(`div`,{className:`card pad-md`,style:{marginTop:12},children:[(0,m.jsxs)(`div`,{className:`card-head`,style:{justifyContent:`space-between`,marginBottom:12},children:[(0,m.jsx)(`h3`,{children:`Timeline`}),j.length>0&&(0,m.jsx)(`button`,{className:`btn ghost sm`,onClick:()=>S(e=>!e),children:x?`Show conversation`:`Show all ${j.length} steps`})]}),x?(0,m.jsx)(`div`,{className:`stack gap-12`,children:M.map((e,t)=>(0,m.jsx)(g,{rec:e},t))}):(0,m.jsx)(_,{turns:A})]})]})}export{v as default};
1
+ import{s as e}from"./sections-GalMS0Zv.js";import{i as t,t as n}from"./react-DRhoX0kS.js";import{t as r}from"./api-Bp5eW_6m.js";import{N as i,k as a,y as o}from"./index-CdpLpPQN.js";import{a as s,n as c,o as l,r as u,t as d}from"./activity-dcg5vF9j.js";import{t as f}from"./usePoll-BmR631BB.js";var p=e(t(),1),m=n();function h(e){return e.kind===`tool`?e.status===`error`?`bad`:e.status===`completed`?`ok`:`acc`:{retry:`warn`,error:`bad`,subtask:`acc`,text:`acc`}[e.kind]||``}function g({rec:e}){let t=e.who===`you`,n=[];t||(e.kind===`tool`&&e.ms!=null&&n.push(`${(e.ms/1e3).toFixed(1)}s`),e.kind===`step`&&(e.tokens&&n.push(`${l(e.tokens)} tok`),e.cost&&n.push(`$${e.cost.toFixed(2)}`)),e.kind===`subtask`&&e.agent&&n.unshift(e.agent));let r=!t&&(e.kind===`text`||e.kind===`thinking`||e.kind===`step`),i=t?e.text:e.label||e.snippet||e.kind;return(0,m.jsxs)(`div`,{className:`row gap-10`,style:{alignItems:`baseline`},children:[(0,m.jsx)(`span`,{className:`badge ${t?``:`acc`}`,style:{flexShrink:0,minWidth:52,justifyContent:`center`},children:t?`you`:`agent`}),(0,m.jsxs)(`div`,{style:{minWidth:0,flex:1,fontSize:13},children:[!t&&(0,m.jsx)(`span`,{className:`feed-dot ${h(e)||`acc`}`,style:{display:`inline-block`,marginRight:8,verticalAlign:`middle`}}),e.kind===`thinking`&&(0,m.jsx)(`span`,{className:`dim`,children:`thinking: `}),r?(0,m.jsx)(`span`,{className:`dim`,children:i}):t?i:(0,m.jsx)(`b`,{children:i}),e.error&&(0,m.jsxs)(`span`,{className:`dim`,children:[`: `,e.error]})]}),n.length>0&&(0,m.jsx)(`span`,{className:`dim mono`,style:{flexShrink:0,fontSize:12},children:n.join(` · `)})]})}function _({turns:e}){return!e||e.length===0?(0,m.jsx)(`div`,{className:`dim`,style:{fontSize:13},children:`No conversation captured yet.`}):(0,m.jsx)(`div`,{className:`stack gap-12`,children:e.map((e,t)=>{let n=e.role===`user`;return(0,m.jsxs)(`div`,{className:`row gap-10`,style:{alignItems:`baseline`},children:[(0,m.jsx)(`span`,{className:`badge ${n?``:`acc`}`,style:{flexShrink:0,minWidth:52,justifyContent:`center`},children:n?`you`:`agent`}),(0,m.jsx)(`div`,{style:{minWidth:0,fontSize:13,color:n?`inherit`:`var(--text-2)`},children:e.text})]},t)})})}function v({sid:e}){let[t,n]=(0,p.useState)(null),[h,v]=(0,p.useState)(``),[y,b]=(0,p.useState)(!1),[x,S]=(0,p.useState)(!1);f(t=>r.activityDetail(e).then(e=>{t()&&(n(e),v(``),b(!1))},e=>{t()&&(e.status===404?b(!0):v(e.message))}),2e3,[e]);let C=(0,m.jsxs)(`a`,{className:`btn ghost sm`,href:`#/activity`,style:{marginBottom:12,display:`inline-flex`,gap:6},children:[(0,m.jsx)(a,{name:`arrow`,style:{transform:`rotate(180deg)`}}),` Activity`]});if(y)return(0,m.jsxs)(`div`,{className:`narrow`,children:[C,(0,m.jsxs)(`div`,{className:`empty`,children:[(0,m.jsx)(`div`,{className:`big`,children:`Session ended`}),`It's no longer live. `,(0,m.jsx)(`a`,{href:`#/activity`,children:`Back to Activity`}),`.`]})]});if(!t)return(0,m.jsxs)(`div`,{className:`narrow`,children:[C,(0,m.jsx)(o,{label:`Loading session…`})]});let w=t.session,T=u[w.status]||u.idle,E=w.files,D=w.todos,O=!!(E&&E.items&&E.items.length>0),k=!!(D&&D.items&&D.items.length>0),A=t.conversation||[],j=t.timeline||[],M=[...A.filter(e=>e.role===`user`).map(e=>({who:`you`,text:e.text,t:e.t||0})),...j.map(e=>({...e,who:`agent`}))].sort((e,t)=>(e.t||0)-(t.t||0));return(0,m.jsxs)(`div`,{className:`narrow`,children:[C,h&&(0,m.jsx)(`p`,{className:`badge bad`,style:{marginBottom:12},children:h}),(0,m.jsxs)(`div`,{className:`card pad-md`,children:[(0,m.jsxs)(`div`,{className:`row between wrap gap-12`,children:[(0,m.jsxs)(`div`,{style:{minWidth:0},children:[(0,m.jsx)(`h1`,{className:`h`,style:{margin:0},children:w.title||s(w.cwd)||w.session_id}),w.cwd&&(0,m.jsx)(`div`,{className:`dim mono`,style:{fontSize:12,...d},title:w.cwd,children:w.cwd})]}),(0,m.jsxs)(`div`,{className:`row gap-8`,style:{flexShrink:0},children:[w.model&&(0,m.jsx)(`span`,{className:`badge mono`,children:w.model}),w.agent&&(0,m.jsx)(`span`,{className:`badge`,children:w.agent}),(0,m.jsxs)(`span`,{className:`badge ${T.cls}`,children:[(0,m.jsx)(`span`,{className:`dot`}),T.label]})]})]}),w.phase&&(0,m.jsxs)(`div`,{className:`row gap-8`,style:{marginTop:10,fontSize:14},children:[(0,m.jsx)(a,{name:`activity`}),(0,m.jsx)(`span`,{style:d,children:w.phase})]}),(0,m.jsxs)(`div`,{className:`row wrap`,style:{gap:16,marginTop:12,fontSize:13,color:`var(--text-2)`},children:[w.tokens>0&&(0,m.jsxs)(`span`,{children:[l(w.tokens),` tok`]}),w.cost>0&&(0,m.jsxs)(`span`,{children:[`$`,w.cost.toFixed(2)]}),w.turn_started_at?(0,m.jsx)(`span`,{children:(0,m.jsx)(c,{startedAt:w.turn_started_at})}):null,(0,m.jsxs)(`span`,{className:`dim`,children:[`updated `,i(w.updated_at),` ago`]})]}),(w.error||w.blocked_on)&&(0,m.jsx)(`div`,{style:{marginTop:10},children:(0,m.jsx)(`span`,{className:`badge bad`,style:{maxWidth:`100%`,...d},children:w.error||w.blocked_on})})]}),(O||k)&&(0,m.jsxs)(`div`,{className:`grid gap-12`,style:{marginTop:12,gridTemplateColumns:O&&k?`minmax(0, 1fr) minmax(0, 1fr)`:`1fr`},children:[O&&(0,m.jsxs)(`div`,{className:`card pad-md`,children:[(0,m.jsx)(`div`,{className:`card-head`,children:(0,m.jsxs)(`h3`,{children:[`Files touched `,(0,m.jsxs)(`span`,{className:`dim`,children:[`(`,E.count,`)`]})]})}),(0,m.jsx)(`div`,{className:`stack`,style:{gap:6,marginTop:8},children:E.items.map(e=>(0,m.jsxs)(`div`,{className:`row between gap-12`,style:{fontSize:13},children:[(0,m.jsx)(`span`,{className:`mono`,style:{...d,minWidth:0,flex:1},title:e.file,children:e.file}),(0,m.jsxs)(`span`,{style:{flexShrink:0},children:[(0,m.jsxs)(`span`,{style:{color:`var(--good)`},children:[`+`,e.additions]}),` `,(0,m.jsxs)(`span`,{style:{color:`var(--bad)`},children:[`−`,e.deletions]})]})]},e.file))})]}),k&&(0,m.jsxs)(`div`,{className:`card pad-md`,children:[(0,m.jsx)(`div`,{className:`card-head`,children:(0,m.jsxs)(`h3`,{children:[`Plan`,` `,(0,m.jsxs)(`span`,{className:`dim`,children:[`(`,D.done,`/`,D.total,`)`]})]})}),(0,m.jsx)(`div`,{className:`stack`,style:{gap:6,marginTop:8},children:D.items.map((e,t)=>(0,m.jsxs)(`div`,{className:`row gap-8`,style:{fontSize:13},children:[(0,m.jsx)(`span`,{className:`feed-dot ${e.status===`completed`?`ok`:e.status===`in_progress`?`acc`:``}`}),(0,m.jsx)(`span`,{style:{textDecoration:e.status===`completed`?`line-through`:`none`,color:e.status===`completed`?`var(--text-3)`:`inherit`},children:e.content})]},t))})]})]}),(0,m.jsxs)(`div`,{className:`card pad-md`,style:{marginTop:12},children:[(0,m.jsxs)(`div`,{className:`card-head`,style:{justifyContent:`space-between`,marginBottom:12},children:[(0,m.jsx)(`h3`,{children:`Timeline`}),j.length>0&&(0,m.jsx)(`button`,{className:`btn ghost sm`,onClick:()=>S(e=>!e),children:x?`Show conversation`:`Show all ${j.length} steps`})]}),x?(0,m.jsx)(`div`,{className:`stack gap-12`,children:M.map((e,t)=>(0,m.jsx)(g,{rec:e},t))}):(0,m.jsx)(_,{turns:A})]})]})}export{v as default};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/GreenhouseView-Bh0xq6Up.js","assets/sections-GalMS0Zv.js","assets/react-DRhoX0kS.js","assets/drawable-DALqyS4l.js","assets/index-BP4foUp0.js","assets/api-Bp5eW_6m.js","assets/index-CO-9wMJY.css","assets/jobBuckets-Dbq8ZlWW.js","assets/OperatorHudView-B5CcWoJ6.js","assets/JournalView-BrD33V35.js"])))=>i.map(i=>d[i]);
2
- import{n as e,o as t,r as n,s as r}from"./sections-GalMS0Zv.js";import{i,t as a}from"./react-DRhoX0kS.js";import{t as o}from"./api-Bp5eW_6m.js";import{A as s,F as c,H as l,I as u,K as d,M as f,N as p,U as m,_ as h,g,j as _,k as v,t as y,x as b,y as x}from"./index-BP4foUp0.js";var S=r(i(),1),C={neutral:`Loaded & ready`,imperial:`The Codex in force`,military:`The unit stands ready`,cyberpunk:`Jacked in`,wizard:`Wards in place`,pirate:`The crew stands ready`,gamer:`Game loaded`,sports:`The squad takes the field`,biker:`The crew rolls out`,commentator:`Lights out, away we go`,verstappen:`Setup's in`,joker:`Mic check`,mean:`Rules are up`,marvin:`Online. Reluctantly.`},w=e=>e.deployed?C[e.theme]||`Loaded & ready`:`Not deployed`,T=a();function E({value:e,size:t=232}){let n=d(e,1100)??0,r=t/2-14,i=2*Math.PI*r,a=i*(1-n);return(0,T.jsxs)(`div`,{className:`ring-wrap`,style:{width:t,height:t},children:[(0,T.jsxs)(`svg`,{viewBox:`0 0 ${t} ${t}`,children:[(0,T.jsx)(`circle`,{cx:t/2,cy:t/2,r,fill:`none`,stroke:`var(--surface-3)`,strokeWidth:`10`}),(0,T.jsx)(`circle`,{cx:t/2,cy:t/2,r,fill:`none`,stroke:`var(--accent)`,strokeWidth:`10`,strokeLinecap:`round`,strokeDasharray:i,strokeDashoffset:a}),Array.from({length:48}).map((e,i)=>{let a=i/48*2*Math.PI,o=r-18,s=r-24,c=t/2+Math.cos(a)*o,l=t/2+Math.sin(a)*o,u=t/2+Math.cos(a)*s,d=t/2+Math.sin(a)*s;return(0,T.jsx)(`line`,{x1:c,y1:l,x2:u,y2:d,stroke:`var(--line-2)`,strokeWidth:`1`,opacity:i/48<n?.9:.25},i)})]}),(0,T.jsxs)(`div`,{className:`ring-center`,children:[(0,T.jsxs)(`div`,{className:`pct`,children:[Math.round(n*100),(0,T.jsx)(`span`,{style:{fontSize:20,color:`var(--text-3)`},children:`%`})]}),(0,T.jsx)(`div`,{className:`lbl`,children:`germination`})]})]})}function D({overview:e}){let t=s(e.diff),n=e.counts||{};return(0,T.jsxs)(`div`,{className:`card kpiband rise mb-16`,children:[[{key:`agents`,label:`Agents`,hash:`#/agents`},{key:`skills`,label:`Skills`,hash:`#/skills`},{key:`laws`,label:`Invariants`,hash:`#/laws`}].map(e=>{let t=n[e.key];return(0,T.jsxs)(`a`,{className:`kseg`,href:e.hash,title:`Open ${e.label}`,children:[(0,T.jsx)(`span`,{className:`kseg-n`+(t===0?` zero`:``),children:t==null?`—`:(0,T.jsx)(m,{value:t})}),(0,T.jsx)(`span`,{className:`kseg-l`,children:e.label})]},e.key)}),(0,T.jsx)(`div`,{className:`kseg-spacer`}),(0,T.jsxs)(`button`,{className:`kseg`+(t>0?` hot`:``),onClick:()=>l(`#/diff`),title:`Open changes`,children:[(0,T.jsx)(`span`,{className:`kseg-n`+(t===0?` zero`:``),children:(0,T.jsx)(m,{value:t})}),(0,T.jsx)(`span`,{className:`kseg-l`,children:`Local edits`}),t>0&&(0,T.jsx)(`span`,{className:`delta up`,children:`▲`})]})]})}function O({overview:t}){return(0,T.jsx)(`div`,{className:`genome`,children:n.map((n,r)=>{let i=e[n],a=t.counts?.[n];return(0,T.jsxs)(`div`,{className:`card gcell rise`,style:{"--i":r},onClick:()=>l(`#/section/`+n),children:[(0,T.jsxs)(`div`,{className:`gtop`,children:[(0,T.jsx)(`span`,{className:`gname`,children:i.label}),(0,T.jsx)(v,{name:i.icon,className:`gicon`})]}),(0,T.jsx)(`div`,{className:`gcount`+(a===0?` zero`:``),children:a==null?`—`:(0,T.jsx)(m,{value:a})}),(0,T.jsx)(`div`,{className:`gdesc`,children:i.desc})]},n)})})}function k({jobs:e}){if(!e||e.length===0)return(0,T.jsx)(`div`,{className:`feed`,children:(0,T.jsxs)(`div`,{className:`empty`,children:[(0,T.jsx)(`div`,{className:`big`,children:`No activity yet`}),`Actions you run appear here.`]})});let t={done:`ok`,running:`acc`,failed:`bad`},n=[...e].sort((e,t)=>t.started-e.started).slice(0,8);return(0,T.jsx)(`div`,{className:`feed`,children:n.map(e=>(0,T.jsxs)(`div`,{className:`feed-row`,children:[(0,T.jsx)(`span`,{className:`feed-dot ${t[e.status]||`ok`}`}),(0,T.jsx)(`span`,{className:`feed-txt`,children:(0,T.jsx)(`b`,{children:e.action})}),(0,T.jsxs)(`span`,{className:`feed-when`,children:[p(e.started),` ago`]})]},e.id))})}function A({overview:e,sigil:t,setup:r,jobs:i,onAction:a}){let o=w(e),s=f(e,r);return(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`div`,{className:`card pad-lg rise mb-16`,children:(0,T.jsxs)(`div`,{className:`hero`,children:[(0,T.jsx)(E,{value:s}),(0,T.jsxs)(`div`,{className:`hero-facts`,children:[(0,T.jsx)(`div`,{className:`ttl`,children:o}),t&&(0,T.jsxs)(`div`,{className:`voice-readout`,children:[(0,T.jsx)(`span`,{className:`vr-cur`,children:`▕`}),(0,T.jsx)(`span`,{className:`vr-txt`,children:t})]},e.theme),(0,T.jsxs)(`p`,{className:`sub`,children:[`One source rendered into `,(0,T.jsx)(`code`,{children:e.target}),`. Every repo on this machine inherits it.`]}),(0,T.jsxs)(`div`,{className:`hero-chips`,children:[(0,T.jsxs)(`span`,{className:`chip`,children:[(0,T.jsx)(`span`,{className:`ck`,children:`voice`}),(0,T.jsx)(`span`,{className:`cv`,style:{textTransform:`capitalize`},children:e.theme})]}),(0,T.jsxs)(`span`,{className:`chip`,children:[(0,T.jsx)(`span`,{className:`ck`,children:`mode`}),(0,T.jsx)(`span`,{className:`cv`,children:e.emit})]}),(0,T.jsxs)(`span`,{className:`chip`,children:[(0,T.jsx)(`span`,{className:`ck`,children:`footprint`}),(0,T.jsx)(`span`,{className:`cv`,children:e.footprint})]}),(0,T.jsxs)(`span`,{className:`chip`,children:[(0,T.jsx)(`span`,{className:`ck`,children:`built`}),(0,T.jsx)(`span`,{className:`cv`,children:e.build_time||`unknown`})]}),(0,T.jsxs)(`span`,{className:`chip`,children:[(0,T.jsx)(`span`,{className:`ck`,children:`fp`}),(0,T.jsx)(`span`,{className:`cv`,children:r?.installed_fp||`—`})]})]}),(0,T.jsxs)(`div`,{className:`row wrap gap-10`,children:[(0,T.jsxs)(`button`,{className:`btn`,onClick:()=>a(`update`),children:[(0,T.jsx)(v,{name:`refresh`}),`Update`]}),(0,T.jsxs)(`button`,{className:`btn ghost`,onClick:()=>a(`build-all`),children:[(0,T.jsx)(v,{name:`build`}),`Rebuild`]}),(0,T.jsxs)(`button`,{className:`btn ghost`,onClick:()=>a(`doctor`),children:[(0,T.jsx)(v,{name:`doctor`}),`Run doctor`]})]})]})]})}),(0,T.jsx)(D,{overview:e}),(0,T.jsxs)(`div`,{className:`grid split-status`,children:[(0,T.jsxs)(`div`,{className:`card pad-lg`,children:[(0,T.jsxs)(`div`,{className:`card-head`,children:[(0,T.jsx)(`h3`,{children:`Capability genome`}),(0,T.jsx)(`div`,{className:`right`,children:(0,T.jsxs)(`span`,{className:`tick`,children:[n.length,` sections`]})})]}),(0,T.jsx)(O,{overview:e})]}),(0,T.jsxs)(`div`,{className:`card pad-lg`,children:[(0,T.jsxs)(`div`,{className:`card-head`,children:[(0,T.jsx)(`h3`,{children:`Recent activity`}),(0,T.jsx)(`div`,{className:`right`,children:(0,T.jsxs)(`span`,{className:`badge acc`,children:[(0,T.jsx)(`span`,{className:`dot`}),`live`]})})]}),(0,T.jsx)(k,{jobs:i})]})]})]})}function j({k:t,overview:n,max:r}){let i=e[t],a=n.counts?.[t]??0;return(0,T.jsxs)(`div`,{className:`strand`,children:[(0,T.jsxs)(`span`,{className:`strand-name`,children:[(0,T.jsx)(`span`,{className:`strand-dot`}),(0,T.jsx)(`a`,{href:`#/section/`+t,className:`strand-link stretch-link`,children:i.label})]}),(0,T.jsx)(`div`,{className:`hbar`,children:(0,T.jsx)(`i`,{style:{width:`${a/r*100}%`}})}),(0,T.jsx)(`span`,{className:`strand-val`,children:a})]})}function M({overview:e,sigil:t,setup:r,jobs:i}){let a=_(e.counts),o=r?.version_verdict||``,c=o.includes(`up to date`),l=s(e.diff),u=[[`Source`,`src/, the canonical genetic material`,r?.source_fp||`—`,!0],[`Render`,`geneseed build → ${e.emit}`,e.theme+` voice`,!0],[`Deployed`,e.target,`inherited by every repo`,!1]];return(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`div`,{className:`mb-16`,children:(0,T.jsxs)(`div`,{className:`card pad-lg rise`,style:{position:`relative`,overflow:`hidden`},children:[(0,T.jsx)(`h2`,{className:`h`,style:{fontSize:22,margin:`0 0 18px`},children:`Gene-seed lineage`}),(0,T.jsxs)(`div`,{className:`lineage-track`,children:[(0,T.jsx)(`div`,{className:`spine`}),u.map(([e,t,n,r],i)=>(0,T.jsxs)(`div`,{className:`lineage-step`,children:[(0,T.jsx)(`span`,{className:`node ${r?`on`:``}`}),(0,T.jsx)(`div`,{className:`lt`,children:e}),(0,T.jsx)(`div`,{className:`ld`,children:t}),(0,T.jsx)(`div`,{className:`ltag`,children:n})]},i))]}),(0,T.jsx)(`hr`,{className:`hr`}),t&&(0,T.jsxs)(`div`,{className:`voice-readout`,style:{marginBottom:14},children:[(0,T.jsx)(`span`,{className:`vr-cur`,children:`▕`}),(0,T.jsx)(`span`,{className:`vr-txt`,children:t})]},e.theme),(0,T.jsxs)(`div`,{className:`row wrap gap-10`,children:[(0,T.jsxs)(`span`,{className:`badge ${c?`ok`:`warn`}`,children:[(0,T.jsx)(`span`,{className:`dot`}),`in sync · `,o]}),(0,T.jsxs)(`span`,{className:`badge`,children:[(0,T.jsx)(`span`,{className:`dot`}),l,` local edits`]})]})]})}),(0,T.jsxs)(`div`,{className:`grid split-even`,children:[(0,T.jsxs)(`div`,{className:`card pad-lg`,children:[(0,T.jsxs)(`div`,{className:`card-head`,children:[(0,T.jsx)(`h3`,{children:`Genome strand`}),(0,T.jsx)(`div`,{className:`right`,children:(0,T.jsx)(`span`,{className:`tick`,children:`by volume`})})]}),n.map(t=>(0,T.jsx)(j,{k:t,overview:e,max:a},t))]}),(0,T.jsxs)(`div`,{className:`card pad-lg`,children:[(0,T.jsx)(`div`,{className:`card-head`,children:(0,T.jsx)(`h3`,{children:`Recent activity`})}),(0,T.jsx)(k,{jobs:i})]})]})]})}function N({overview:t,setup:r,jobs:i}){let a=n.reduce((e,n)=>e+(t.counts?.[n]??0),0),o=_(t.counts),c=t.doctor?.ok,l=t.doctor?.problems?.length??0,u=s(t.diff);return(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`div`,{className:`card pad-md rise mb-16`,children:(0,T.jsx)(`div`,{className:`row wrap between gap-16`,children:(0,T.jsxs)(`div`,{className:`row`,style:{gap:20,flexWrap:`wrap`},children:[(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`status`}),(0,T.jsx)(`div`,{className:`row`,style:{gap:8,marginTop:4},children:(0,T.jsxs)(`span`,{className:`badge ${t.deployed?`ok`:`warn`}`,children:[(0,T.jsx)(`span`,{className:`dot`}),t.deployed?`deployed`:`not deployed`]})})]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`voice`}),(0,T.jsx)(`div`,{className:`metric`,style:{fontSize:18,marginTop:6,textTransform:`capitalize`},children:t.theme})]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`mode`}),(0,T.jsx)(`div`,{className:`mono`,style:{fontSize:14,marginTop:6},children:t.emit})]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`fingerprint`}),(0,T.jsx)(`div`,{className:`mono`,style:{fontSize:14,marginTop:6,color:`var(--accent)`},children:r?.installed_fp||`—`})]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`doctor`}),(0,T.jsx)(`div`,{className:`row`,style:{gap:8,marginTop:4},children:c?(0,T.jsxs)(`span`,{className:`badge ok`,children:[(0,T.jsx)(`span`,{className:`dot`}),`clean`]}):(0,T.jsxs)(`span`,{className:`badge warn`,children:[(0,T.jsx)(`span`,{className:`dot`}),l,` issue`,l===1?``:`s`]})})]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`edits`}),(0,T.jsx)(`div`,{className:`metric`,style:{fontSize:18,marginTop:6},children:u})]})]})})}),(0,T.jsxs)(`div`,{className:`grid split-operator`,children:[(0,T.jsxs)(`div`,{className:`card rise`,style:{"--i":1},children:[(0,T.jsxs)(`div`,{className:`card-head pad-lg`,style:{padding:`18px 20px 0`,marginBottom:14},children:[(0,T.jsx)(`h3`,{children:`Sections`}),(0,T.jsx)(`div`,{className:`right`,children:(0,T.jsxs)(`span`,{className:`tick`,children:[a,` entries total`]})})]}),(0,T.jsxs)(`table`,{className:`tbl`,children:[(0,T.jsx)(`thead`,{children:(0,T.jsxs)(`tr`,{children:[(0,T.jsx)(`th`,{children:`Section`}),(0,T.jsx)(`th`,{children:`Detail`}),(0,T.jsx)(`th`,{style:{width:130},children:`Share`}),(0,T.jsx)(`th`,{className:`num`,children:`Count`})]})}),(0,T.jsx)(`tbody`,{children:n.map(n=>{let r=e[n],i=t.counts?.[n]??0;return(0,T.jsxs)(`tr`,{className:`clickable`,children:[(0,T.jsx)(`td`,{className:`name`,children:(0,T.jsx)(`a`,{href:`#/section/`+n,className:`stretch-link`,children:r.label})}),(0,T.jsx)(`td`,{className:`muted`,children:r.desc}),(0,T.jsx)(`td`,{children:(0,T.jsx)(`div`,{className:`hbar`,children:(0,T.jsx)(`i`,{style:{width:`${i/o*100}%`}})})}),(0,T.jsx)(`td`,{className:`num`,children:i})]},n)})})]})]}),(0,T.jsxs)(`div`,{className:`card pad-lg rise`,style:{"--i":2},children:[(0,T.jsx)(`div`,{className:`card-head`,children:(0,T.jsx)(`h3`,{children:`Run log`})}),(0,T.jsx)(k,{jobs:i})]})]})]})}function P(){let[e,t]=(0,S.useState)(!1),[n,r]=(0,S.useState)(null);return(0,T.jsxs)(`div`,{className:`stale-banner`,role:`alert`,children:[(0,T.jsx)(`span`,{children:n||`This console is running code from before your last upgrade.`}),(0,T.jsx)(`button`,{className:`btn sm`,onClick:async()=>{t(!0),r(null);try{await u()}catch(e){r(e.message),t(!1)}},disabled:e,children:e?`Restarting…`:`Restart`})]})}var F=t({default:()=>z}),I=(0,S.lazy)(()=>y(()=>import(`./GreenhouseView-Bh0xq6Up.js`),__vite__mapDeps([0,1,2,3,4,5,6,7]))),L=(0,S.lazy)(()=>y(()=>import(`./OperatorHudView-B5CcWoJ6.js`),__vite__mapDeps([8,1,2,4,5,6,7]))),R=(0,S.lazy)(()=>y(()=>import(`./JournalView-BrD33V35.js`),__vite__mapDeps([9,1,2,5,3,4,6])));function z({overview:e,overviewError:t,onRetry:n,themes:r,setup:i,runs:a,onAction:s,layout:l=`cultivar`,dataRev:u}){let d=l,[f,p]=(0,S.useState)(`status`),m=e&&r.find(t=>t.name===e.theme)?.sigil||``,{data:_}=c(()=>d===`greenhouse`||d===`operator`?o.doctor().catch(()=>null):Promise.resolve(null),[d,u]),{data:v}=c(()=>d===`journal`?o.recent().catch(()=>null):Promise.resolve(null),[d,u]);if(!e)return t?(0,T.jsxs)(`div`,{children:[(0,T.jsx)(h,{error:`Could not load the harness overview: ${t}`}),(0,T.jsx)(`button`,{className:`btn`,onClick:n,children:`Retry`})]}):(0,T.jsx)(x,{});let y=e.daemon_stale?(0,T.jsx)(P,{}):null;return e.deployed?f===`status`&&d===`journal`?(0,T.jsxs)(S.Suspense,{fallback:(0,T.jsx)(x,{}),children:[y,(0,T.jsx)(R,{overview:e,recent:v,onAction:s,onDirection:p,dataRev:u})]}):(0,T.jsxs)(T.Fragment,{children:[y,(0,T.jsx)(`div`,{className:`head-row`,children:(0,T.jsx)(b,{"aria-label":`Dashboard view`,children:[[`status`,`Status`],[`lineage`,`Lineage`],[`operator`,`Operator`]].map(([e,t])=>(0,T.jsx)(`button`,{className:f===e?`on`:``,onClick:()=>p(e),"aria-pressed":f===e,children:t},e))})}),(0,T.jsxs)(`div`,{className:`view-in`,children:[f===`status`&&d===`cultivar`&&(0,T.jsx)(A,{overview:e,sigil:m,setup:i,jobs:a,onAction:s}),f===`status`&&d===`greenhouse`&&(0,T.jsx)(S.Suspense,{fallback:(0,T.jsx)(x,{}),children:(0,T.jsx)(I,{overview:e,sigil:m,jobs:a,doctor:_,onAction:s})}),f===`status`&&d===`operator`&&(0,T.jsx)(S.Suspense,{fallback:(0,T.jsx)(x,{}),children:(0,T.jsx)(L,{overview:e,jobs:a,doctor:_,onAction:s})}),f===`lineage`&&(0,T.jsx)(M,{overview:e,sigil:m,setup:i,jobs:a}),f===`operator`&&(0,T.jsx)(N,{overview:e,setup:i,jobs:a})]},f)]}):(0,T.jsxs)(T.Fragment,{children:[y,(0,T.jsx)(g,{onAction:s})]})}export{z as default,w as n,F as t};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/GreenhouseView-Djt-4oO5.js","assets/sections-GalMS0Zv.js","assets/react-DRhoX0kS.js","assets/drawable-C2ZsBZCv.js","assets/index-CdpLpPQN.js","assets/api-Bp5eW_6m.js","assets/index-CO-9wMJY.css","assets/jobBuckets-Dbq8ZlWW.js","assets/OperatorHudView-otOz6Gha.js","assets/JournalView-OWhx9YKg.js"])))=>i.map(i=>d[i]);
2
+ import{n as e,o as t,r as n,s as r}from"./sections-GalMS0Zv.js";import{i,t as a}from"./react-DRhoX0kS.js";import{t as o}from"./api-Bp5eW_6m.js";import{A as s,F as c,H as l,I as u,K as d,M as f,N as p,U as m,_ as h,g,j as _,k as v,t as y,x as b,y as x}from"./index-CdpLpPQN.js";var S=r(i(),1),C={neutral:`Loaded & ready`,imperial:`The Codex in force`,military:`The unit stands ready`,cyberpunk:`Jacked in`,wizard:`Wards in place`,pirate:`The crew stands ready`,gamer:`Game loaded`,sports:`The squad takes the field`,biker:`The crew rolls out`,commentator:`Lights out, away we go`,verstappen:`Setup's in`,joker:`Mic check`,mean:`Rules are up`,marvin:`Online. Reluctantly.`},w=e=>e.deployed?C[e.theme]||`Loaded & ready`:`Not deployed`,T=a();function E({value:e,size:t=232}){let n=d(e,1100)??0,r=t/2-14,i=2*Math.PI*r,a=i*(1-n);return(0,T.jsxs)(`div`,{className:`ring-wrap`,style:{width:t,height:t},children:[(0,T.jsxs)(`svg`,{viewBox:`0 0 ${t} ${t}`,children:[(0,T.jsx)(`circle`,{cx:t/2,cy:t/2,r,fill:`none`,stroke:`var(--surface-3)`,strokeWidth:`10`}),(0,T.jsx)(`circle`,{cx:t/2,cy:t/2,r,fill:`none`,stroke:`var(--accent)`,strokeWidth:`10`,strokeLinecap:`round`,strokeDasharray:i,strokeDashoffset:a}),Array.from({length:48}).map((e,i)=>{let a=i/48*2*Math.PI,o=r-18,s=r-24,c=t/2+Math.cos(a)*o,l=t/2+Math.sin(a)*o,u=t/2+Math.cos(a)*s,d=t/2+Math.sin(a)*s;return(0,T.jsx)(`line`,{x1:c,y1:l,x2:u,y2:d,stroke:`var(--line-2)`,strokeWidth:`1`,opacity:i/48<n?.9:.25},i)})]}),(0,T.jsxs)(`div`,{className:`ring-center`,children:[(0,T.jsxs)(`div`,{className:`pct`,children:[Math.round(n*100),(0,T.jsx)(`span`,{style:{fontSize:20,color:`var(--text-3)`},children:`%`})]}),(0,T.jsx)(`div`,{className:`lbl`,children:`germination`})]})]})}function D({overview:e}){let t=s(e.diff),n=e.counts||{};return(0,T.jsxs)(`div`,{className:`card kpiband rise mb-16`,children:[[{key:`agents`,label:`Agents`,hash:`#/agents`},{key:`skills`,label:`Skills`,hash:`#/skills`},{key:`laws`,label:`Invariants`,hash:`#/laws`}].map(e=>{let t=n[e.key];return(0,T.jsxs)(`a`,{className:`kseg`,href:e.hash,title:`Open ${e.label}`,children:[(0,T.jsx)(`span`,{className:`kseg-n`+(t===0?` zero`:``),children:t==null?`—`:(0,T.jsx)(m,{value:t})}),(0,T.jsx)(`span`,{className:`kseg-l`,children:e.label})]},e.key)}),(0,T.jsx)(`div`,{className:`kseg-spacer`}),(0,T.jsxs)(`button`,{className:`kseg`+(t>0?` hot`:``),onClick:()=>l(`#/diff`),title:`Open changes`,children:[(0,T.jsx)(`span`,{className:`kseg-n`+(t===0?` zero`:``),children:(0,T.jsx)(m,{value:t})}),(0,T.jsx)(`span`,{className:`kseg-l`,children:`Local edits`}),t>0&&(0,T.jsx)(`span`,{className:`delta up`,children:`▲`})]})]})}function O({overview:t}){return(0,T.jsx)(`div`,{className:`genome`,children:n.map((n,r)=>{let i=e[n],a=t.counts?.[n];return(0,T.jsxs)(`div`,{className:`card gcell rise`,style:{"--i":r},onClick:()=>l(`#/section/`+n),children:[(0,T.jsxs)(`div`,{className:`gtop`,children:[(0,T.jsx)(`span`,{className:`gname`,children:i.label}),(0,T.jsx)(v,{name:i.icon,className:`gicon`})]}),(0,T.jsx)(`div`,{className:`gcount`+(a===0?` zero`:``),children:a==null?`—`:(0,T.jsx)(m,{value:a})}),(0,T.jsx)(`div`,{className:`gdesc`,children:i.desc})]},n)})})}function k({jobs:e}){if(!e||e.length===0)return(0,T.jsx)(`div`,{className:`feed`,children:(0,T.jsxs)(`div`,{className:`empty`,children:[(0,T.jsx)(`div`,{className:`big`,children:`No activity yet`}),`Actions you run appear here.`]})});let t={done:`ok`,running:`acc`,failed:`bad`},n=[...e].sort((e,t)=>t.started-e.started).slice(0,8);return(0,T.jsx)(`div`,{className:`feed`,children:n.map(e=>(0,T.jsxs)(`div`,{className:`feed-row`,children:[(0,T.jsx)(`span`,{className:`feed-dot ${t[e.status]||`ok`}`}),(0,T.jsx)(`span`,{className:`feed-txt`,children:(0,T.jsx)(`b`,{children:e.action})}),(0,T.jsxs)(`span`,{className:`feed-when`,children:[p(e.started),` ago`]})]},e.id))})}function A({overview:e,sigil:t,setup:r,jobs:i,onAction:a}){let o=w(e),s=f(e,r);return(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`div`,{className:`card pad-lg rise mb-16`,children:(0,T.jsxs)(`div`,{className:`hero`,children:[(0,T.jsx)(E,{value:s}),(0,T.jsxs)(`div`,{className:`hero-facts`,children:[(0,T.jsx)(`div`,{className:`ttl`,children:o}),t&&(0,T.jsxs)(`div`,{className:`voice-readout`,children:[(0,T.jsx)(`span`,{className:`vr-cur`,children:`▕`}),(0,T.jsx)(`span`,{className:`vr-txt`,children:t})]},e.theme),(0,T.jsxs)(`p`,{className:`sub`,children:[`One source rendered into `,(0,T.jsx)(`code`,{children:e.target}),`. Every repo on this machine inherits it.`]}),(0,T.jsxs)(`div`,{className:`hero-chips`,children:[(0,T.jsxs)(`span`,{className:`chip`,children:[(0,T.jsx)(`span`,{className:`ck`,children:`voice`}),(0,T.jsx)(`span`,{className:`cv`,style:{textTransform:`capitalize`},children:e.theme})]}),(0,T.jsxs)(`span`,{className:`chip`,children:[(0,T.jsx)(`span`,{className:`ck`,children:`mode`}),(0,T.jsx)(`span`,{className:`cv`,children:e.emit})]}),(0,T.jsxs)(`span`,{className:`chip`,children:[(0,T.jsx)(`span`,{className:`ck`,children:`footprint`}),(0,T.jsx)(`span`,{className:`cv`,children:e.footprint})]}),(0,T.jsxs)(`span`,{className:`chip`,children:[(0,T.jsx)(`span`,{className:`ck`,children:`built`}),(0,T.jsx)(`span`,{className:`cv`,children:e.build_time||`unknown`})]}),(0,T.jsxs)(`span`,{className:`chip`,children:[(0,T.jsx)(`span`,{className:`ck`,children:`fp`}),(0,T.jsx)(`span`,{className:`cv`,children:r?.installed_fp||`—`})]})]}),(0,T.jsxs)(`div`,{className:`row wrap gap-10`,children:[(0,T.jsxs)(`button`,{className:`btn`,onClick:()=>a(`update`),children:[(0,T.jsx)(v,{name:`refresh`}),`Update`]}),(0,T.jsxs)(`button`,{className:`btn ghost`,onClick:()=>a(`build-all`),children:[(0,T.jsx)(v,{name:`build`}),`Rebuild`]}),(0,T.jsxs)(`button`,{className:`btn ghost`,onClick:()=>a(`doctor`),children:[(0,T.jsx)(v,{name:`doctor`}),`Run doctor`]})]})]})]})}),(0,T.jsx)(D,{overview:e}),(0,T.jsxs)(`div`,{className:`grid split-status`,children:[(0,T.jsxs)(`div`,{className:`card pad-lg`,children:[(0,T.jsxs)(`div`,{className:`card-head`,children:[(0,T.jsx)(`h3`,{children:`Capability genome`}),(0,T.jsx)(`div`,{className:`right`,children:(0,T.jsxs)(`span`,{className:`tick`,children:[n.length,` sections`]})})]}),(0,T.jsx)(O,{overview:e})]}),(0,T.jsxs)(`div`,{className:`card pad-lg`,children:[(0,T.jsxs)(`div`,{className:`card-head`,children:[(0,T.jsx)(`h3`,{children:`Recent activity`}),(0,T.jsx)(`div`,{className:`right`,children:(0,T.jsxs)(`span`,{className:`badge acc`,children:[(0,T.jsx)(`span`,{className:`dot`}),`live`]})})]}),(0,T.jsx)(k,{jobs:i})]})]})]})}function j({k:t,overview:n,max:r}){let i=e[t],a=n.counts?.[t]??0;return(0,T.jsxs)(`div`,{className:`strand`,children:[(0,T.jsxs)(`span`,{className:`strand-name`,children:[(0,T.jsx)(`span`,{className:`strand-dot`}),(0,T.jsx)(`a`,{href:`#/section/`+t,className:`strand-link stretch-link`,children:i.label})]}),(0,T.jsx)(`div`,{className:`hbar`,children:(0,T.jsx)(`i`,{style:{width:`${a/r*100}%`}})}),(0,T.jsx)(`span`,{className:`strand-val`,children:a})]})}function M({overview:e,sigil:t,setup:r,jobs:i}){let a=_(e.counts),o=r?.version_verdict||``,c=o.includes(`up to date`),l=s(e.diff),u=[[`Source`,`src/, the canonical genetic material`,r?.source_fp||`—`,!0],[`Render`,`geneseed build → ${e.emit}`,e.theme+` voice`,!0],[`Deployed`,e.target,`inherited by every repo`,!1]];return(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`div`,{className:`mb-16`,children:(0,T.jsxs)(`div`,{className:`card pad-lg rise`,style:{position:`relative`,overflow:`hidden`},children:[(0,T.jsx)(`h2`,{className:`h`,style:{fontSize:22,margin:`0 0 18px`},children:`Gene-seed lineage`}),(0,T.jsxs)(`div`,{className:`lineage-track`,children:[(0,T.jsx)(`div`,{className:`spine`}),u.map(([e,t,n,r],i)=>(0,T.jsxs)(`div`,{className:`lineage-step`,children:[(0,T.jsx)(`span`,{className:`node ${r?`on`:``}`}),(0,T.jsx)(`div`,{className:`lt`,children:e}),(0,T.jsx)(`div`,{className:`ld`,children:t}),(0,T.jsx)(`div`,{className:`ltag`,children:n})]},i))]}),(0,T.jsx)(`hr`,{className:`hr`}),t&&(0,T.jsxs)(`div`,{className:`voice-readout`,style:{marginBottom:14},children:[(0,T.jsx)(`span`,{className:`vr-cur`,children:`▕`}),(0,T.jsx)(`span`,{className:`vr-txt`,children:t})]},e.theme),(0,T.jsxs)(`div`,{className:`row wrap gap-10`,children:[(0,T.jsxs)(`span`,{className:`badge ${c?`ok`:`warn`}`,children:[(0,T.jsx)(`span`,{className:`dot`}),`in sync · `,o]}),(0,T.jsxs)(`span`,{className:`badge`,children:[(0,T.jsx)(`span`,{className:`dot`}),l,` local edits`]})]})]})}),(0,T.jsxs)(`div`,{className:`grid split-even`,children:[(0,T.jsxs)(`div`,{className:`card pad-lg`,children:[(0,T.jsxs)(`div`,{className:`card-head`,children:[(0,T.jsx)(`h3`,{children:`Genome strand`}),(0,T.jsx)(`div`,{className:`right`,children:(0,T.jsx)(`span`,{className:`tick`,children:`by volume`})})]}),n.map(t=>(0,T.jsx)(j,{k:t,overview:e,max:a},t))]}),(0,T.jsxs)(`div`,{className:`card pad-lg`,children:[(0,T.jsx)(`div`,{className:`card-head`,children:(0,T.jsx)(`h3`,{children:`Recent activity`})}),(0,T.jsx)(k,{jobs:i})]})]})]})}function N({overview:t,setup:r,jobs:i}){let a=n.reduce((e,n)=>e+(t.counts?.[n]??0),0),o=_(t.counts),c=t.doctor?.ok,l=t.doctor?.problems?.length??0,u=s(t.diff);return(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`div`,{className:`card pad-md rise mb-16`,children:(0,T.jsx)(`div`,{className:`row wrap between gap-16`,children:(0,T.jsxs)(`div`,{className:`row`,style:{gap:20,flexWrap:`wrap`},children:[(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`status`}),(0,T.jsx)(`div`,{className:`row`,style:{gap:8,marginTop:4},children:(0,T.jsxs)(`span`,{className:`badge ${t.deployed?`ok`:`warn`}`,children:[(0,T.jsx)(`span`,{className:`dot`}),t.deployed?`deployed`:`not deployed`]})})]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`voice`}),(0,T.jsx)(`div`,{className:`metric`,style:{fontSize:18,marginTop:6,textTransform:`capitalize`},children:t.theme})]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`mode`}),(0,T.jsx)(`div`,{className:`mono`,style:{fontSize:14,marginTop:6},children:t.emit})]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`fingerprint`}),(0,T.jsx)(`div`,{className:`mono`,style:{fontSize:14,marginTop:6,color:`var(--accent)`},children:r?.installed_fp||`—`})]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`doctor`}),(0,T.jsx)(`div`,{className:`row`,style:{gap:8,marginTop:4},children:c?(0,T.jsxs)(`span`,{className:`badge ok`,children:[(0,T.jsx)(`span`,{className:`dot`}),`clean`]}):(0,T.jsxs)(`span`,{className:`badge warn`,children:[(0,T.jsx)(`span`,{className:`dot`}),l,` issue`,l===1?``:`s`]})})]}),(0,T.jsxs)(`div`,{children:[(0,T.jsx)(`div`,{className:`tick`,children:`edits`}),(0,T.jsx)(`div`,{className:`metric`,style:{fontSize:18,marginTop:6},children:u})]})]})})}),(0,T.jsxs)(`div`,{className:`grid split-operator`,children:[(0,T.jsxs)(`div`,{className:`card rise`,style:{"--i":1},children:[(0,T.jsxs)(`div`,{className:`card-head pad-lg`,style:{padding:`18px 20px 0`,marginBottom:14},children:[(0,T.jsx)(`h3`,{children:`Sections`}),(0,T.jsx)(`div`,{className:`right`,children:(0,T.jsxs)(`span`,{className:`tick`,children:[a,` entries total`]})})]}),(0,T.jsxs)(`table`,{className:`tbl`,children:[(0,T.jsx)(`thead`,{children:(0,T.jsxs)(`tr`,{children:[(0,T.jsx)(`th`,{children:`Section`}),(0,T.jsx)(`th`,{children:`Detail`}),(0,T.jsx)(`th`,{style:{width:130},children:`Share`}),(0,T.jsx)(`th`,{className:`num`,children:`Count`})]})}),(0,T.jsx)(`tbody`,{children:n.map(n=>{let r=e[n],i=t.counts?.[n]??0;return(0,T.jsxs)(`tr`,{className:`clickable`,children:[(0,T.jsx)(`td`,{className:`name`,children:(0,T.jsx)(`a`,{href:`#/section/`+n,className:`stretch-link`,children:r.label})}),(0,T.jsx)(`td`,{className:`muted`,children:r.desc}),(0,T.jsx)(`td`,{children:(0,T.jsx)(`div`,{className:`hbar`,children:(0,T.jsx)(`i`,{style:{width:`${i/o*100}%`}})})}),(0,T.jsx)(`td`,{className:`num`,children:i})]},n)})})]})]}),(0,T.jsxs)(`div`,{className:`card pad-lg rise`,style:{"--i":2},children:[(0,T.jsx)(`div`,{className:`card-head`,children:(0,T.jsx)(`h3`,{children:`Run log`})}),(0,T.jsx)(k,{jobs:i})]})]})]})}function P(){let[e,t]=(0,S.useState)(!1),[n,r]=(0,S.useState)(null);return(0,T.jsxs)(`div`,{className:`stale-banner`,role:`alert`,children:[(0,T.jsx)(`span`,{children:n||`This console is running code from before your last upgrade.`}),(0,T.jsx)(`button`,{className:`btn sm`,onClick:async()=>{t(!0),r(null);try{await u()}catch(e){r(e.message),t(!1)}},disabled:e,children:e?`Restarting…`:`Restart`})]})}var F=t({default:()=>z}),I=(0,S.lazy)(()=>y(()=>import(`./GreenhouseView-Djt-4oO5.js`),__vite__mapDeps([0,1,2,3,4,5,6,7]))),L=(0,S.lazy)(()=>y(()=>import(`./OperatorHudView-otOz6Gha.js`),__vite__mapDeps([8,1,2,4,5,6,7]))),R=(0,S.lazy)(()=>y(()=>import(`./JournalView-OWhx9YKg.js`),__vite__mapDeps([9,1,2,5,3,4,6])));function z({overview:e,overviewError:t,onRetry:n,themes:r,setup:i,runs:a,onAction:s,layout:l=`cultivar`,dataRev:u}){let d=l,[f,p]=(0,S.useState)(`status`),m=e&&r.find(t=>t.name===e.theme)?.sigil||``,{data:_}=c(()=>d===`greenhouse`||d===`operator`?o.doctor().catch(()=>null):Promise.resolve(null),[d,u]),{data:v}=c(()=>d===`journal`?o.recent().catch(()=>null):Promise.resolve(null),[d,u]);if(!e)return t?(0,T.jsxs)(`div`,{children:[(0,T.jsx)(h,{error:`Could not load the harness overview: ${t}`}),(0,T.jsx)(`button`,{className:`btn`,onClick:n,children:`Retry`})]}):(0,T.jsx)(x,{});let y=e.daemon_stale?(0,T.jsx)(P,{}):null;return e.deployed?f===`status`&&d===`journal`?(0,T.jsxs)(S.Suspense,{fallback:(0,T.jsx)(x,{}),children:[y,(0,T.jsx)(R,{overview:e,recent:v,onAction:s,onDirection:p,dataRev:u})]}):(0,T.jsxs)(T.Fragment,{children:[y,(0,T.jsx)(`div`,{className:`head-row`,children:(0,T.jsx)(b,{"aria-label":`Dashboard view`,children:[[`status`,`Status`],[`lineage`,`Lineage`],[`operator`,`Operator`]].map(([e,t])=>(0,T.jsx)(`button`,{className:f===e?`on`:``,onClick:()=>p(e),"aria-pressed":f===e,children:t},e))})}),(0,T.jsxs)(`div`,{className:`view-in`,children:[f===`status`&&d===`cultivar`&&(0,T.jsx)(A,{overview:e,sigil:m,setup:i,jobs:a,onAction:s}),f===`status`&&d===`greenhouse`&&(0,T.jsx)(S.Suspense,{fallback:(0,T.jsx)(x,{}),children:(0,T.jsx)(I,{overview:e,sigil:m,jobs:a,doctor:_,onAction:s})}),f===`status`&&d===`operator`&&(0,T.jsx)(S.Suspense,{fallback:(0,T.jsx)(x,{}),children:(0,T.jsx)(L,{overview:e,jobs:a,doctor:_,onAction:s})}),f===`lineage`&&(0,T.jsx)(M,{overview:e,sigil:m,setup:i,jobs:a}),f===`operator`&&(0,T.jsx)(N,{overview:e,setup:i,jobs:a})]},f)]}):(0,T.jsxs)(T.Fragment,{children:[y,(0,T.jsx)(g,{onAction:s})]})}export{z as default,w as n,F as t};
@@ -1,4 +1,4 @@
1
- import{s as e}from"./sections-GalMS0Zv.js";import{i as t,t as n}from"./react-DRhoX0kS.js";import{t as r}from"./api-Bp5eW_6m.js";import{C as i,F as a,H as o,S as s,_ as c,a as l,i as u,k as d,n as f,o as p,r as m,s as h,w as ee,x as g,y as _}from"./index-BP4foUp0.js";import{a as v,c as y,i as b,l as x,n as S,o as C,r as w,s as T,t as E}from"./Markdown-DrXLM6TA.js";var D=e(t(),1),O=n();function k(e,t=0){let n=String(e).toLowerCase().trim().replace(/[^a-z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-+|-+$/g,``);return n&&/^[a-z]/.test(n)?n:`h-${t}-${n||`section`}`}function A(e){return e.replace(/!?\[([^\]]*)\]\([^)]*\)/g,`$1`).replace(/\[\[([^\]]+)\]\]/g,`$1`).replace(/`([^`]*)`/g,`$1`).replace(/\*\*|__/g,``).replace(/\*([^*\s][^*]*)\*/g,`$1`)}function j(e){let t=[],n=!1,r=0;for(let i of(e||``).split(`
1
+ import{s as e}from"./sections-GalMS0Zv.js";import{i as t,t as n}from"./react-DRhoX0kS.js";import{t as r}from"./api-Bp5eW_6m.js";import{C as i,F as a,H as o,S as s,_ as c,a as l,i as u,k as d,n as f,o as p,r as m,s as h,w as ee,x as g,y as _}from"./index-CdpLpPQN.js";import{a as v,c as y,i as b,l as x,n as S,o as C,r as w,s as T,t as E}from"./Markdown-DrXLM6TA.js";var D=e(t(),1),O=n();function k(e,t=0){let n=String(e).toLowerCase().trim().replace(/[^a-z0-9\s-]/g,``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^-+|-+$/g,``);return n&&/^[a-z]/.test(n)?n:`h-${t}-${n||`section`}`}function A(e){return e.replace(/!?\[([^\]]*)\]\([^)]*\)/g,`$1`).replace(/\[\[([^\]]+)\]\]/g,`$1`).replace(/`([^`]*)`/g,`$1`).replace(/\*\*|__/g,``).replace(/\*([^*\s][^*]*)\*/g,`$1`)}function j(e){let t=[],n=!1,r=0;for(let i of(e||``).split(`
2
2
  `)){if(i.startsWith("```")){n=!n;continue}if(n)continue;let e=i.match(/^(##|###)\s+(.+?)\s*$/);e&&(r+=1,t.push({level:e[1].length,title:A(e[2]),id:k(e[2],r)}))}return t}var M={"opencode-global":[`install-opencode`,`Global (recommended)`],opencode:[`install-opencode`,`Per repo`],"claude-global":[`install-claude-code`],claude:[`install-claude-code`],"openclaude-global":[`install-openclaude`],openclaude:[`install-openclaude`],"bob-global":[`install-bob`],bob:[`install-bob`],files:[`install-agent-md`]},N=`you already know this`;function P({page:e,overview:t,onAction:n}){let r=(0,D.useRef)(null),i=(0,D.useMemo)(()=>S(e.body,e.links),[e.body,e.links]);(0,D.useEffect)(()=>{let e=r.current;if(!e)return;let t=0;e.querySelectorAll(`h1, h2, h3`).forEach(e=>{if(e.tagName!==`H1`&&(t+=1),!e.id){let n=k(e.textContent||``,t);n&&(e.id=n)}}),e.querySelectorAll(`blockquote`).forEach(e=>{(e.querySelector(`strong`)?.textContent||``).toLowerCase().startsWith(N)&&e.classList.add(`analogy`)})},[i]),(0,D.useEffect)(()=>{let e=r.current;if(!e)return;let t=e=>{let t=e.target.closest(`a[href]`);if(!t)return;let n=t.getAttribute(`href`);n&&n.startsWith(`#/`)&&(e.preventDefault(),o(n))};return e.addEventListener(`click`,t),()=>e.removeEventListener(`click`,t)},[i]),(0,D.useEffect)(()=>{let n=r.current;if(!n)return;n.querySelectorAll(`.docs-here`).forEach(e=>e.classList.remove(`docs-here`));let[i,a]=M[t?.emit]||[];if(!i)return;let o=null;e.id===`install`?o=n.querySelector(`a[href="#/docs/${i}"]`)?.closest(`li`):e.id===i&&a&&(o=[...n.querySelectorAll(`h2`)].find(e=>k(e.textContent||``)===k(a))),o?.classList.add(`docs-here`)},[i,e.id,t?.emit]);let a=[];return e.id===`install`&&(a.push({label:`Run doctor`,action:`doctor`}),a.push({label:`Rebuild`,action:`build`})),e.id===`verify`&&a.push({label:`Run doctor`,action:`doctor`}),e.id===`upgrade`&&a.push({label:`Update`,action:`update`}),(0,O.jsxs)(`div`,{className:`detail-doc`,children:[(0,O.jsx)(`h1`,{style:{marginTop:0},children:e.title}),e.source&&(0,O.jsx)(`div`,{className:`doc-meta`,children:(0,O.jsxs)(`span`,{className:`badge`,children:[(0,O.jsx)(`span`,{className:`dot`}),e.source]})}),a.length>0&&(0,O.jsx)(`div`,{className:`row wrap gap-10`,style:{margin:`10px 0 14px`},children:a.map(e=>e.hash?(0,O.jsx)(`a`,{className:`btn ghost sm`,href:e.hash,children:e.label},e.label):(0,O.jsx)(`button`,{className:`btn ghost sm`,onClick:()=>n&&n(e.action),children:e.label},e.label))}),(0,O.jsx)(`div`,{className:`markdown`,ref:r,dangerouslySetInnerHTML:{__html:i}}),e.link&&(0,O.jsx)(`div`,{style:{marginTop:24},children:(0,O.jsx)(`a`,{className:`btn soft sm`,href:e.link.hash,children:e.link.label})})]})}var F=1200;function I({a:e,kind:t}){let n=t===`positional`?e.dest:e.names.join(`, `),r=[];return e.metavar&&r.push(e.metavar),e.choices&&r.push(`{${e.choices.join(`|`)}}`),e.default!==null&&e.default!==void 0&&e.default!==``&&!e.is_flag&&r.push(`default: ${e.default}`),e.required&&r.push(`required`),(0,O.jsxs)(`div`,{className:`cli-arg`,children:[(0,O.jsx)(`code`,{className:`cli-arg-name`,children:n}),r.length>0&&(0,O.jsxs)(`code`,{className:`cli-arg-meta`,children:[` `,r.join(` · `)]}),e.help&&(0,O.jsx)(`div`,{className:`cli-arg-help`,children:e.help})]})}function L({text:e}){let[t,n]=(0,D.useState)(!1);return(0,O.jsxs)(`button`,{className:`btn ghost sm`,onClick:async()=>{try{await navigator.clipboard.writeText(e),n(!0),setTimeout(()=>n(!1),F)}catch{}},title:`Copy command`,children:[(0,O.jsx)(d,{name:t?`spark`:`copy`}),t?`Copied`:`Copy`]})}function R({cmd:e,prog:t}){let n=[t,e.name];for(let t of e.positionals||[]){let e=(t.metavar||t.dest||``).toUpperCase();n.push(t.required?e:`[${e}]`)}(e.options||[]).length&&n.push(`[OPTIONS]`);let r=n.join(` `);return(0,O.jsxs)(`div`,{className:`card pad-md mb-12 cli-card`,children:[(0,O.jsxs)(`div`,{className:`row wrap between`,style:{alignItems:`flex-start`},children:[(0,O.jsxs)(`div`,{className:`stack`,style:{gap:4},children:[(0,O.jsx)(`h3`,{style:{margin:0},children:(0,O.jsx)(`code`,{children:e.name})}),e.help&&(0,O.jsx)(`p`,{className:`sub`,style:{margin:0},children:e.help})]}),(0,O.jsx)(L,{text:`${t} ${e.name}`})]}),(0,O.jsx)(`pre`,{className:`cli-syn`,children:r}),(e.positionals||[]).length>0&&(0,O.jsxs)(`div`,{className:`cli-block`,children:[(0,O.jsx)(`div`,{className:`cli-block-head`,children:`Arguments`}),e.positionals.map(e=>(0,O.jsx)(I,{a:e,kind:`positional`},e.dest))]}),(e.options||[]).length>0&&(0,O.jsxs)(`div`,{className:`cli-block`,children:[(0,O.jsx)(`div`,{className:`cli-block-head`,children:`Options`}),e.options.map(e=>(0,O.jsx)(I,{a:e,kind:`option`},e.names.join(`,`)))]})]})}function z({page:e}){let t=e.prog||`geneseed`,n=e.commands||[];return(0,O.jsxs)(`div`,{className:`detail-doc`,children:[(0,O.jsx)(`h1`,{style:{marginTop:0},children:e.title}),(0,O.jsxs)(`p`,{className:`sub`,style:{marginTop:4},children:[`Every subcommand of `,(0,O.jsx)(`code`,{children:t}),`. Generated from the parser at request time (the same one `,(0,O.jsx)(`code`,{children:`geneseed`}),` actually parses), so this page cannot drift.`]}),(0,O.jsx)(`div`,{style:{marginTop:18},children:n.map(e=>(0,O.jsx)(R,{cmd:e,prog:t},e.name))})]})}function B({page:e}){let t=e.rows||[],n=e.theme||`neutral`;return(0,O.jsxs)(`div`,{className:`detail-doc`,children:[(0,O.jsx)(`h1`,{style:{marginTop:0},children:e.title}),(0,O.jsxs)(`p`,{className:`sub`,style:{marginTop:4},children:[`Geneseed's invented vocabulary, decoded. Left: the neutral, plain-English term. Right: the word your `,(0,O.jsx)(`code`,{style:{textTransform:`capitalize`},children:n}),` theme actually uses in the agent's voice. Last: the developer idea it maps to.`]}),(0,O.jsx)(`div`,{className:`card pad-md`,style:{marginTop:18},children:(0,O.jsxs)(`table`,{className:`glossary-table`,children:[(0,O.jsx)(`thead`,{children:(0,O.jsxs)(`tr`,{children:[(0,O.jsx)(`th`,{children:`Concept`}),(0,O.jsx)(`th`,{children:`Neutral term`}),(0,O.jsxs)(`th`,{children:[`In `,n]}),(0,O.jsx)(`th`,{children:`Meaning`}),(0,O.jsx)(`th`,{children:`In dev terms`})]})}),(0,O.jsx)(`tbody`,{children:t.map(e=>(0,O.jsxs)(`tr`,{children:[(0,O.jsx)(`td`,{children:(0,O.jsx)(`strong`,{children:e.label})}),(0,O.jsx)(`td`,{children:(0,O.jsx)(`code`,{children:e.neutral||`—`})}),(0,O.jsx)(`td`,{children:(0,O.jsx)(`code`,{children:e.themed||e.neutral||`—`})}),(0,O.jsx)(`td`,{className:`dim`,children:e.desc}),(0,O.jsx)(`td`,{className:`dim`,children:e.analogy||`—`})]},e.label))})]})})]})}var V={enforced:`ok`,automatic:`ok`,asked:`warn`,"on demand":`warn`};function H(e){let t=[],n=[],r=`before`;for(let i of(e||``).split(`
3
3
  `))r===`before`&&/^\|\s*piece\s*\|/i.test(i)?r=`map`:r===`map`&&!i.trimStart().startsWith(`|`)&&(r=`after`),r===`before`?t.push(i):r===`after`&&n.push(i);return[t.join(`
4
4
  `),n.join(`
@@ -1,2 +1,2 @@
1
- import{n as e,r as t,s as n}from"./sections-GalMS0Zv.js";import{i as r,t as i}from"./react-DRhoX0kS.js";import{t as a}from"./drawable-DALqyS4l.js";import{A as o,G as s,Q as c,U as l,W as u,Y as d,k as f}from"./index-BP4foUp0.js";import{t as p}from"./jobBuckets-Dbq8ZlWW.js";import{n as m}from"./Dashboard-DkdOUpke.js";var h=n(r(),1),g=i(),_=12,v=120,y=[`#2BB673`,`#16A6A6`,`#E8A23B`,`#E07A5F`,`#8E7DBE`,`#5BD08A`,`#79856E`],b=650;function x({segments:e,size:t=186,stroke:n=26,caption:r=`capabilities`}){let i=e.reduce((e,t)=>e+t.value,0)||1,o=(0,h.useRef)(null),f=e.map(e=>e.value).join(`,`);(0,h.useLayoutEffect)(()=>{let t=o.current?.querySelectorAll(`path`);if(!t?.length||!u())return;let n=e.filter(e=>e.value>0).map(e=>e.value/i),r=n.map((e,t)=>n.slice(0,t).reduce((e,t)=>e+t,0)),l=a(t);d(l,{draw:`0 0`});let f=c(l,{draw:[`0 0`,`0 1`],duration:(e,t)=>Math.max(b*n[t],60),delay:(e,t)=>b*r[t],ease:`linear`});return s(f,b)},[f]);let p=t/2-n/2,m=t/2,_=t/2,v=[],y=0;for(let t of e)v.push(y),y+=t.value;return(0,g.jsxs)(`svg`,{width:t,height:t,viewBox:`0 0 ${t} ${t}`,children:[(0,g.jsx)(`circle`,{cx:m,cy:_,r:p,fill:`none`,stroke:`var(--surface-3)`,strokeWidth:n}),(0,g.jsx)(`g`,{ref:o,children:e.map((e,t)=>{if(e.value/i<=0)return null;let r=v[t]/i*2*Math.PI-Math.PI/2,a=(v[t]+e.value)/i*2*Math.PI-Math.PI/2,o=m+p*Math.cos(r),s=_+p*Math.sin(r),c=m+p*Math.cos(a),l=_+p*Math.sin(a),u=+(a-r>Math.PI);return(0,g.jsx)(`path`,{d:`M ${o} ${s} A ${p} ${p} 0 ${u} 1 ${c} ${l}`,fill:`none`,stroke:e.color,strokeWidth:n,strokeLinecap:`butt`,children:(0,g.jsxs)(`title`,{children:[e.label,`: `,e.value]})},t)})}),(0,g.jsx)(`text`,{x:m,y:_-4,textAnchor:`middle`,className:`donut-c-num`,children:(0,g.jsx)(l,{value:i,duration:b})}),(0,g.jsx)(`text`,{x:m,y:_+16,textAnchor:`middle`,className:`donut-c-cap`,children:r})]})}function S(e){if(e.length<2)return e.length?`M${e[0][0]},${e[0][1]}`:``;let t=`M${e[0][0]},${e[0][1]}`;for(let n=0;n<e.length-1;n++){let r=e[n-1]||e[n],i=e[n],a=e[n+1],o=e[n+2]||a,s=i[0]+(a[0]-r[0])/6,c=i[1]+(a[1]-r[1])/6,l=a[0]-(o[0]-i[0])/6,u=a[1]-(o[1]-i[1])/6;t+=` C${s},${c} ${l},${u} ${a[0]},${a[1]}`}return t}function C({data:e,height:t=156,accent:n}){if(!e.length)return null;let r=t,i=Math.max(...e.map(e=>e.v),1)+1,a=e.length>1?588/(e.length-1):588,o=e.map((e,t)=>[6+t*a,r-6-e.v/i*(r-14-6)]),s=S(o),c=o[o.length-1],l=o[0],u=`${s} L${c[0]},${r} L${l[0]},${r} Z`;return(0,g.jsxs)(`svg`,{viewBox:`0 0 600 ${r}`,preserveAspectRatio:`none`,style:{width:`100%`,height:t,display:`block`,overflow:`visible`},children:[(0,g.jsx)(`defs`,{children:(0,g.jsxs)(`linearGradient`,{id:`b-grad`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,g.jsx)(`stop`,{offset:`0`,stopColor:n,stopOpacity:`.28`}),(0,g.jsx)(`stop`,{offset:`1`,stopColor:n,stopOpacity:`0`})]})}),(0,g.jsx)(`path`,{d:u,fill:`url(#b-grad)`}),(0,g.jsx)(`path`,{d:s,fill:`none`,stroke:n,strokeWidth:`2`,strokeLinejoin:`round`,strokeLinecap:`round`,vectorEffect:`non-scaling-stroke`}),(0,g.jsx)(`circle`,{cx:c[0],cy:c[1],r:`3.5`,fill:n,vectorEffect:`non-scaling-stroke`})]})}function w({label:e,value:t,sub:n,color:r,icon:i}){return(0,g.jsxs)(`div`,{className:`b-tile`,children:[(0,g.jsx)(`span`,{className:`b-tile-ic`,style:{background:`color-mix(in srgb, ${r} 18%, transparent)`,color:r},children:(0,g.jsx)(f,{name:i})}),(0,g.jsxs)(`div`,{className:`b-tile-body`,children:[(0,g.jsx)(`div`,{className:`b-tile-val`+(t===0?` zero`:``),children:t}),(0,g.jsx)(`div`,{className:`b-tile-label`,children:e})]}),(0,g.jsx)(`div`,{className:`b-tile-sub`,children:n})]})}function T({overview:n,sigil:r,jobs:i,doctor:a,onAction:s}){let c=n.counts||{},u=a?.groups||[],d=u.length>0,h=u.filter(e=>e.problems.length===0).length,b=u.length||1,S=m(n),T=o(n.diff),E=t.filter(e=>(c[e]||0)>0).map((t,n)=>({label:e[t].label,value:c[t]||0,color:y[n%y.length]})),D=E.reduce((e,t)=>e+t.value,0),O=p(i||[],10),k=O.reduce((e,t)=>e+t.v,0);return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)(`div`,{className:`b-greet`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`div`,{className:`eyebrow`,children:`your harness`}),(0,g.jsx)(`h1`,{className:`h b-h`,children:S}),(0,g.jsx)(`p`,{className:`sub`,children:r||`A friendly read of every layer growing in your harness.`})]}),(0,g.jsxs)(`div`,{className:`row gap-8`,children:[(0,g.jsxs)(`button`,{className:`btn`,onClick:()=>s(`update`),children:[(0,g.jsx)(f,{name:`refresh`}),`Update`]}),(0,g.jsxs)(`button`,{className:`btn ghost`,onClick:()=>s(`build-all`),children:[(0,g.jsx)(f,{name:`build`}),`Rebuild`]})]})]}),(0,g.jsxs)(`div`,{className:`grid b-hero-grid mb-16`,children:[(0,g.jsxs)(`div`,{className:`card b-hero`,children:[(0,g.jsx)(`div`,{className:`b-hero-ring`,children:(0,g.jsx)(x,{segments:[{label:`pass`,value:h,color:y[0]},{label:`attention`,value:Math.max(b-h,0),color:y[2]}],size:168,stroke:20,caption:`checks`})}),(0,g.jsxs)(`div`,{className:`b-hero-side`,children:[(0,g.jsx)(`h3`,{className:`b-hero-title`,children:d?`${h} of ${b} checks pass`:`Running checks…`}),(0,g.jsxs)(`p`,{className:`sub`,children:[`One source, rendered into `,(0,g.jsx)(`code`,{children:n.target}),` and inherited by every repo on this machine.`]}),d&&(0,g.jsx)(`ul`,{className:`b-hero-checks`,children:u.map(e=>{let t=e.problems.length===0;return(0,g.jsxs)(`li`,{className:`b-hcheck ${t?`ok`:`bad`}`,title:t?`clean`:e.problems.join(`; `),children:[(0,g.jsx)(`span`,{className:`b-hcheck-mark`,children:t?`✓`:`!`}),(0,g.jsx)(`span`,{className:`b-hcheck-label`,children:e.label})]},e.label)})}),(0,g.jsxs)(`div`,{className:`b-chips`,children:[(0,g.jsxs)(`span`,{className:`b-chip`,children:[(0,g.jsx)(`b`,{style:{textTransform:`capitalize`},children:n.theme}),` voice`]}),(0,g.jsx)(`span`,{className:`b-chip`,children:(0,g.jsx)(`b`,{children:n.emit})}),(0,g.jsxs)(`span`,{className:`b-chip`,children:[`built `,(0,g.jsx)(`b`,{children:n.build_time||`unknown`})]})]})]})]}),(0,g.jsxs)(`div`,{className:`b-tiles`,children:[(0,g.jsx)(w,{label:`Agents`,value:c.agents??`—`,sub:`specialists`,color:y[0],icon:`layers`}),(0,g.jsx)(w,{label:`Skills`,value:c.skills??`—`,sub:`workflows`,color:y[1],icon:`skill`}),(0,g.jsx)(w,{label:`Invariants`,value:c.laws??`—`,sub:c.doctrines?`${c.doctrines.active}/${c.doctrines.total} packs · ${c.doctrines.rules} rules`:`all upheld`,color:y[2],icon:`law`}),(0,g.jsx)(w,{label:`Edits`,value:T,sub:`to graft`,color:y[3],icon:`changes`})]})]}),(0,g.jsxs)(`div`,{className:`grid split-even mb-16`,children:[(0,g.jsxs)(`div`,{className:`card pad-lg b-mix-card`,children:[(0,g.jsxs)(`div`,{className:`card-head`,children:[(0,g.jsx)(`h3`,{children:`Capability mix`}),(0,g.jsx)(`div`,{className:`right`,children:(0,g.jsxs)(`span`,{className:`tick`,children:[D,` total`]})})]}),(0,g.jsxs)(`div`,{className:`b-mix`,children:[(0,g.jsx)(x,{segments:E,size:186,stroke:26}),(0,g.jsx)(`div`,{className:`b-legend`,children:E.map(e=>(0,g.jsxs)(`div`,{className:`b-leg-row`,children:[(0,g.jsx)(`span`,{className:`b-leg-dot`,style:{background:e.color}}),(0,g.jsx)(`span`,{className:`b-leg-name`,children:e.label}),(0,g.jsx)(`span`,{className:`b-leg-bar`,children:(0,g.jsx)(`i`,{style:{width:`${e.value/D*100}%`,background:e.color}})}),(0,g.jsx)(`span`,{className:`b-leg-val`,children:e.value})]},e.label))})]})]}),(0,g.jsxs)(`div`,{className:`card pad-lg`,children:[(0,g.jsxs)(`div`,{className:`card-head`,children:[(0,g.jsx)(`h3`,{children:`Recent runs`}),(0,g.jsx)(`div`,{className:`right`,children:(0,g.jsxs)(`span`,{className:`badge ok`,children:[(0,g.jsx)(`span`,{className:`dot`}),`job log`]})})]}),(0,g.jsxs)(`div`,{className:`b-stat-lead`,children:[(0,g.jsx)(`span`,{className:`b-stat-big`,children:(0,g.jsx)(l,{value:k})}),(0,g.jsxs)(`span`,{className:`b-stat-cap`,children:[`runs in the last 10 days · `,h,`/`,b,` checks pass now`]})]}),(0,g.jsx)(C,{data:O,accent:y[0],height:156})]})]}),(0,g.jsxs)(`div`,{className:`card pad-lg`,children:[(0,g.jsxs)(`div`,{className:`card-head`,children:[(0,g.jsx)(`h3`,{children:`Recent activity`}),(0,g.jsx)(`div`,{className:`right`,children:(0,g.jsxs)(`span`,{className:`tick`,children:[`last `,Math.min(i?.length||0,12),` runs`]})})]}),(0,g.jsxs)(`div`,{className:`b-timeline`,children:[(i||[]).slice(0,_).map(e=>{let t=e.status===`done`,n=e.status===`failed`?`warn`:t?`ok`:`acc`;return(0,g.jsxs)(`div`,{className:`b-tl-row`,children:[(0,g.jsx)(`span`,{className:`b-tl-node ${n}`}),(0,g.jsxs)(`div`,{className:`b-tl-body`,children:[(0,g.jsx)(`b`,{children:e.action}),e.output?`: ${e.output.split(`
1
+ import{n as e,r as t,s as n}from"./sections-GalMS0Zv.js";import{i as r,t as i}from"./react-DRhoX0kS.js";import{t as a}from"./drawable-C2ZsBZCv.js";import{A as o,G as s,Q as c,U as l,W as u,Y as d,k as f}from"./index-CdpLpPQN.js";import{t as p}from"./jobBuckets-Dbq8ZlWW.js";import{n as m}from"./Dashboard-B4Drq5wp.js";var h=n(r(),1),g=i(),_=12,v=120,y=[`#2BB673`,`#16A6A6`,`#E8A23B`,`#E07A5F`,`#8E7DBE`,`#5BD08A`,`#79856E`],b=650;function x({segments:e,size:t=186,stroke:n=26,caption:r=`capabilities`}){let i=e.reduce((e,t)=>e+t.value,0)||1,o=(0,h.useRef)(null),f=e.map(e=>e.value).join(`,`);(0,h.useLayoutEffect)(()=>{let t=o.current?.querySelectorAll(`path`);if(!t?.length||!u())return;let n=e.filter(e=>e.value>0).map(e=>e.value/i),r=n.map((e,t)=>n.slice(0,t).reduce((e,t)=>e+t,0)),l=a(t);d(l,{draw:`0 0`});let f=c(l,{draw:[`0 0`,`0 1`],duration:(e,t)=>Math.max(b*n[t],60),delay:(e,t)=>b*r[t],ease:`linear`});return s(f,b)},[f]);let p=t/2-n/2,m=t/2,_=t/2,v=[],y=0;for(let t of e)v.push(y),y+=t.value;return(0,g.jsxs)(`svg`,{width:t,height:t,viewBox:`0 0 ${t} ${t}`,children:[(0,g.jsx)(`circle`,{cx:m,cy:_,r:p,fill:`none`,stroke:`var(--surface-3)`,strokeWidth:n}),(0,g.jsx)(`g`,{ref:o,children:e.map((e,t)=>{if(e.value/i<=0)return null;let r=v[t]/i*2*Math.PI-Math.PI/2,a=(v[t]+e.value)/i*2*Math.PI-Math.PI/2,o=m+p*Math.cos(r),s=_+p*Math.sin(r),c=m+p*Math.cos(a),l=_+p*Math.sin(a),u=+(a-r>Math.PI);return(0,g.jsx)(`path`,{d:`M ${o} ${s} A ${p} ${p} 0 ${u} 1 ${c} ${l}`,fill:`none`,stroke:e.color,strokeWidth:n,strokeLinecap:`butt`,children:(0,g.jsxs)(`title`,{children:[e.label,`: `,e.value]})},t)})}),(0,g.jsx)(`text`,{x:m,y:_-4,textAnchor:`middle`,className:`donut-c-num`,children:(0,g.jsx)(l,{value:i,duration:b})}),(0,g.jsx)(`text`,{x:m,y:_+16,textAnchor:`middle`,className:`donut-c-cap`,children:r})]})}function S(e){if(e.length<2)return e.length?`M${e[0][0]},${e[0][1]}`:``;let t=`M${e[0][0]},${e[0][1]}`;for(let n=0;n<e.length-1;n++){let r=e[n-1]||e[n],i=e[n],a=e[n+1],o=e[n+2]||a,s=i[0]+(a[0]-r[0])/6,c=i[1]+(a[1]-r[1])/6,l=a[0]-(o[0]-i[0])/6,u=a[1]-(o[1]-i[1])/6;t+=` C${s},${c} ${l},${u} ${a[0]},${a[1]}`}return t}function C({data:e,height:t=156,accent:n}){if(!e.length)return null;let r=t,i=Math.max(...e.map(e=>e.v),1)+1,a=e.length>1?588/(e.length-1):588,o=e.map((e,t)=>[6+t*a,r-6-e.v/i*(r-14-6)]),s=S(o),c=o[o.length-1],l=o[0],u=`${s} L${c[0]},${r} L${l[0]},${r} Z`;return(0,g.jsxs)(`svg`,{viewBox:`0 0 600 ${r}`,preserveAspectRatio:`none`,style:{width:`100%`,height:t,display:`block`,overflow:`visible`},children:[(0,g.jsx)(`defs`,{children:(0,g.jsxs)(`linearGradient`,{id:`b-grad`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,g.jsx)(`stop`,{offset:`0`,stopColor:n,stopOpacity:`.28`}),(0,g.jsx)(`stop`,{offset:`1`,stopColor:n,stopOpacity:`0`})]})}),(0,g.jsx)(`path`,{d:u,fill:`url(#b-grad)`}),(0,g.jsx)(`path`,{d:s,fill:`none`,stroke:n,strokeWidth:`2`,strokeLinejoin:`round`,strokeLinecap:`round`,vectorEffect:`non-scaling-stroke`}),(0,g.jsx)(`circle`,{cx:c[0],cy:c[1],r:`3.5`,fill:n,vectorEffect:`non-scaling-stroke`})]})}function w({label:e,value:t,sub:n,color:r,icon:i}){return(0,g.jsxs)(`div`,{className:`b-tile`,children:[(0,g.jsx)(`span`,{className:`b-tile-ic`,style:{background:`color-mix(in srgb, ${r} 18%, transparent)`,color:r},children:(0,g.jsx)(f,{name:i})}),(0,g.jsxs)(`div`,{className:`b-tile-body`,children:[(0,g.jsx)(`div`,{className:`b-tile-val`+(t===0?` zero`:``),children:t}),(0,g.jsx)(`div`,{className:`b-tile-label`,children:e})]}),(0,g.jsx)(`div`,{className:`b-tile-sub`,children:n})]})}function T({overview:n,sigil:r,jobs:i,doctor:a,onAction:s}){let c=n.counts||{},u=a?.groups||[],d=u.length>0,h=u.filter(e=>e.problems.length===0).length,b=u.length||1,S=m(n),T=o(n.diff),E=t.filter(e=>(c[e]||0)>0).map((t,n)=>({label:e[t].label,value:c[t]||0,color:y[n%y.length]})),D=E.reduce((e,t)=>e+t.value,0),O=p(i||[],10),k=O.reduce((e,t)=>e+t.v,0);return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)(`div`,{className:`b-greet`,children:[(0,g.jsxs)(`div`,{children:[(0,g.jsx)(`div`,{className:`eyebrow`,children:`your harness`}),(0,g.jsx)(`h1`,{className:`h b-h`,children:S}),(0,g.jsx)(`p`,{className:`sub`,children:r||`A friendly read of every layer growing in your harness.`})]}),(0,g.jsxs)(`div`,{className:`row gap-8`,children:[(0,g.jsxs)(`button`,{className:`btn`,onClick:()=>s(`update`),children:[(0,g.jsx)(f,{name:`refresh`}),`Update`]}),(0,g.jsxs)(`button`,{className:`btn ghost`,onClick:()=>s(`build-all`),children:[(0,g.jsx)(f,{name:`build`}),`Rebuild`]})]})]}),(0,g.jsxs)(`div`,{className:`grid b-hero-grid mb-16`,children:[(0,g.jsxs)(`div`,{className:`card b-hero`,children:[(0,g.jsx)(`div`,{className:`b-hero-ring`,children:(0,g.jsx)(x,{segments:[{label:`pass`,value:h,color:y[0]},{label:`attention`,value:Math.max(b-h,0),color:y[2]}],size:168,stroke:20,caption:`checks`})}),(0,g.jsxs)(`div`,{className:`b-hero-side`,children:[(0,g.jsx)(`h3`,{className:`b-hero-title`,children:d?`${h} of ${b} checks pass`:`Running checks…`}),(0,g.jsxs)(`p`,{className:`sub`,children:[`One source, rendered into `,(0,g.jsx)(`code`,{children:n.target}),` and inherited by every repo on this machine.`]}),d&&(0,g.jsx)(`ul`,{className:`b-hero-checks`,children:u.map(e=>{let t=e.problems.length===0;return(0,g.jsxs)(`li`,{className:`b-hcheck ${t?`ok`:`bad`}`,title:t?`clean`:e.problems.join(`; `),children:[(0,g.jsx)(`span`,{className:`b-hcheck-mark`,children:t?`✓`:`!`}),(0,g.jsx)(`span`,{className:`b-hcheck-label`,children:e.label})]},e.label)})}),(0,g.jsxs)(`div`,{className:`b-chips`,children:[(0,g.jsxs)(`span`,{className:`b-chip`,children:[(0,g.jsx)(`b`,{style:{textTransform:`capitalize`},children:n.theme}),` voice`]}),(0,g.jsx)(`span`,{className:`b-chip`,children:(0,g.jsx)(`b`,{children:n.emit})}),(0,g.jsxs)(`span`,{className:`b-chip`,children:[`built `,(0,g.jsx)(`b`,{children:n.build_time||`unknown`})]})]})]})]}),(0,g.jsxs)(`div`,{className:`b-tiles`,children:[(0,g.jsx)(w,{label:`Agents`,value:c.agents??`—`,sub:`specialists`,color:y[0],icon:`layers`}),(0,g.jsx)(w,{label:`Skills`,value:c.skills??`—`,sub:`workflows`,color:y[1],icon:`skill`}),(0,g.jsx)(w,{label:`Invariants`,value:c.laws??`—`,sub:c.doctrines?`${c.doctrines.active}/${c.doctrines.total} packs · ${c.doctrines.rules} rules`:`all upheld`,color:y[2],icon:`law`}),(0,g.jsx)(w,{label:`Edits`,value:T,sub:`to graft`,color:y[3],icon:`changes`})]})]}),(0,g.jsxs)(`div`,{className:`grid split-even mb-16`,children:[(0,g.jsxs)(`div`,{className:`card pad-lg b-mix-card`,children:[(0,g.jsxs)(`div`,{className:`card-head`,children:[(0,g.jsx)(`h3`,{children:`Capability mix`}),(0,g.jsx)(`div`,{className:`right`,children:(0,g.jsxs)(`span`,{className:`tick`,children:[D,` total`]})})]}),(0,g.jsxs)(`div`,{className:`b-mix`,children:[(0,g.jsx)(x,{segments:E,size:186,stroke:26}),(0,g.jsx)(`div`,{className:`b-legend`,children:E.map(e=>(0,g.jsxs)(`div`,{className:`b-leg-row`,children:[(0,g.jsx)(`span`,{className:`b-leg-dot`,style:{background:e.color}}),(0,g.jsx)(`span`,{className:`b-leg-name`,children:e.label}),(0,g.jsx)(`span`,{className:`b-leg-bar`,children:(0,g.jsx)(`i`,{style:{width:`${e.value/D*100}%`,background:e.color}})}),(0,g.jsx)(`span`,{className:`b-leg-val`,children:e.value})]},e.label))})]})]}),(0,g.jsxs)(`div`,{className:`card pad-lg`,children:[(0,g.jsxs)(`div`,{className:`card-head`,children:[(0,g.jsx)(`h3`,{children:`Recent runs`}),(0,g.jsx)(`div`,{className:`right`,children:(0,g.jsxs)(`span`,{className:`badge ok`,children:[(0,g.jsx)(`span`,{className:`dot`}),`job log`]})})]}),(0,g.jsxs)(`div`,{className:`b-stat-lead`,children:[(0,g.jsx)(`span`,{className:`b-stat-big`,children:(0,g.jsx)(l,{value:k})}),(0,g.jsxs)(`span`,{className:`b-stat-cap`,children:[`runs in the last 10 days · `,h,`/`,b,` checks pass now`]})]}),(0,g.jsx)(C,{data:O,accent:y[0],height:156})]})]}),(0,g.jsxs)(`div`,{className:`card pad-lg`,children:[(0,g.jsxs)(`div`,{className:`card-head`,children:[(0,g.jsx)(`h3`,{children:`Recent activity`}),(0,g.jsx)(`div`,{className:`right`,children:(0,g.jsxs)(`span`,{className:`tick`,children:[`last `,Math.min(i?.length||0,12),` runs`]})})]}),(0,g.jsxs)(`div`,{className:`b-timeline`,children:[(i||[]).slice(0,_).map(e=>{let t=e.status===`done`,n=e.status===`failed`?`warn`:t?`ok`:`acc`;return(0,g.jsxs)(`div`,{className:`b-tl-row`,children:[(0,g.jsx)(`span`,{className:`b-tl-node ${n}`}),(0,g.jsxs)(`div`,{className:`b-tl-body`,children:[(0,g.jsx)(`b`,{children:e.action}),e.output?`: ${e.output.split(`
2
2
  `)[0].slice(0,v)}`:``]}),(0,g.jsx)(`span`,{className:`b-tl-when`,children:e.duration?`${e.duration}s`:e.status})]},e.id)}),(!i||i.length===0)&&(0,g.jsxs)(`div`,{className:`b-tl-row`,children:[(0,g.jsx)(`span`,{className:`b-tl-node`}),(0,g.jsx)(`div`,{className:`b-tl-body sub`,children:`No runs yet. Trigger an action to populate this.`}),(0,g.jsx)(`span`,{className:`b-tl-when`,children:`—`})]})]})]})]})}export{T as default};
@@ -1,2 +1,2 @@
1
- import{s as e}from"./sections-GalMS0Zv.js";import{i as t,t as n}from"./react-DRhoX0kS.js";import{t as r}from"./api-Bp5eW_6m.js";import{A as i,D as a,E as o,F as s,I as c,L as l,O as u,R as d,T as f,_ as p,b as m,k as h,v as g,x as _,y as v,z as y}from"./index-BP4foUp0.js";import{t as b}from"./Tabs-s8T501po.js";var x=e(t(),1),S=n();function C({label:e,value:t,options:n,onChange:r}){return n.length?(0,S.jsx)(`select`,{className:`sel`,"aria-label":e,value:t,onChange:e=>r(e.target.value),children:n.map(e=>(0,S.jsx)(`option`,{value:e,children:e},e))}):null}var w=[`full`,`lean`];function T({on:e,disabled:t,label:n,onToggle:r}){return(0,S.jsx)(`input`,{type:`checkbox`,role:`switch`,className:`sw-toggle${e?` on`:``}`,checked:e,"aria-checked":e,disabled:t,"aria-label":n,onChange:r,onKeyDown:e=>{e.key===`Enter`&&!t&&r()}})}var E=[{key:`theme`,name:`voice`,title:`Voice`},{key:`footprint`,name:`footprint`,title:`Footprint`},{key:`posture`,name:`posture`,title:`Posture`},{key:`mode`,name:`mode`,title:`Mode`},{key:`trust`,name:`trust`,title:`Loop trust`}];function D({value:e,options:t,onChange:n,who:r}){return E.map(i=>(0,S.jsxs)(`label`,{className:`dp-field`,children:[(0,S.jsx)(`span`,{children:i.title}),(0,S.jsx)(C,{label:`${i.name} for ${r}`,value:e[i.key],options:t[i.key],onChange:e=>n(i.key,e)})]},i.key))}function O({host:e,theme:t,options:n,onAction:i,onClose:a,onNote:s}){let[c,l]=(0,x.useState)({path:``,host:e,theme:t,footprint:`full`,posture:`peer`,mode:`direct`,trust:`balanced`}),[u,d]=(0,x.useState)(!1),p=(e,t)=>l(n=>({...n,[e]:t})),m=async()=>{d(!0),s(``);try{let e=await r.pickFolder();e.path?p(`path`,e.path):e.error&&s(e.error)}catch(e){s(e.message)}finally{d(!1)}},h=async()=>{let e=c.path.trim();if(!e){s(`Choose or type a folder to deploy into.`);return}s(``),await i?.(`deploy`,{host:c.host,path:e,theme:c.theme,footprint:c.footprint,posture:c.posture,mode:c.mode,trust:c.trust})&&a()};return(0,S.jsxs)(`div`,{className:`deploy-pop`,children:[(0,S.jsxs)(`div`,{className:`dp-row`,children:[(0,S.jsx)(`input`,{className:`inp dp-path`,type:`text`,placeholder:`/path/to/project, or click Browse…`,value:c.path,onChange:e=>p(`path`,e.target.value),onKeyDown:e=>e.key===`Enter`&&h(),"aria-label":`Folder to deploy into`}),(0,S.jsx)(`button`,{className:`btn ghost sm`,disabled:u,onClick:m,children:u?`Choosing…`:`Browse…`})]}),(0,S.jsxs)(`div`,{className:`dp-row`,children:[(0,S.jsxs)(`label`,{className:`dp-field`,children:[(0,S.jsx)(`span`,{children:`Deploy as`}),(0,S.jsx)(`select`,{className:`sel`,"aria-label":`host for the new harness`,value:c.host,onChange:e=>p(`host`,e.target.value),children:f.map(e=>(0,S.jsx)(`option`,{value:e.id,children:e.label},e.id))})]}),(0,S.jsx)(D,{value:c,options:n,onChange:p,who:`the new harness`}),(0,S.jsx)(`button`,{className:`btn sm`,onClick:h,children:`Deploy`}),(0,S.jsx)(`button`,{className:`btn ghost sm`,onClick:a,children:`Cancel`})]}),(0,S.jsxs)(`p`,{className:`sub dp-note`,children:[`Adds a per-repo harness (`,(0,S.jsx)(`code`,{children:o(c.host).deployAdds}),`) into the folder, non-destructively. It’s then tracked here even after you leave its directory.`]})]})}function k(){let{data:e,error:t,reload:n}=s(()=>r.excludes(),[]),[i,a]=(0,x.useState)(!1),[o,c]=(0,x.useState)([]),l=async(e,t)=>{a(!0);try{let n=await r.excludeMutate(e,t);c(n.messages||[])}catch(e){c(e.body?.messages||[e.message])}finally{a(!1),n()}};return t||!e?.installs?.length?null:(0,S.jsxs)(`div`,{className:`card pad-lg mb-16`,children:[(0,S.jsx)(`div`,{className:`card-head`,children:(0,S.jsx)(`h3`,{children:`Excluded folders`})}),(0,S.jsx)(`p`,{className:`sub mb-16`,children:`Sovereign repos: inside these folders every global harness goes dormant — hooks stay silent and the global preamble is not loaded.`}),(e.excludes||[]).map(e=>(0,S.jsxs)(`div`,{className:`row wrap between gap-12`,children:[(0,S.jsx)(`code`,{children:e.path}),(0,S.jsxs)(`span`,{className:`mono muted`,children:[`[`,e.hosts.join(`, `),`]`]}),(0,S.jsx)(`button`,{className:`btn ghost sm`,disabled:i,onClick:()=>l(`remove`,e.path),children:`Remove`})]},e.path)),(0,S.jsxs)(`button`,{className:`btn ghost sm`,disabled:i,onClick:async()=>{a(!0);try{let e=await r.pickFolder();e.path?await l(`add`,e.path):e.error&&c([e.error])}catch(e){c([e.message])}finally{a(!1)}},children:[(0,S.jsx)(h,{name:`folder`}),` Exclude a folder…`]}),o.map((e,t)=>(0,S.jsx)(`p`,{className:`sub`,children:e},t))]})}function A({inst:e,memory:t,busy:n,onMemory:r,onRemove:i,onCancel:a}){return(0,S.jsxs)(`div`,{className:`h-remove`,children:[(0,S.jsxs)(`p`,{className:`hr-msg`,children:[(0,S.jsx)(`strong`,{children:e.scope===`project`?`Remove this harness from the folder?`:`Remove the global ${e.host} install?`}),` `,(0,S.jsxs)(`span`,{className:`sub`,children:[`Deletes `,(0,S.jsx)(`code`,{children:u(e.host,e.scope)}),e.scope===`project`?` and de-lists it.`:`; the row stays, marked “not installed.”`,` `,`This can’t be undone.`]})]}),(0,S.jsxs)(`label`,{className:`field`,children:[(0,S.jsx)(`span`,{children:`Memory and notebook`}),(0,S.jsxs)(`select`,{className:`sel`,"aria-label":`memory disposition`,value:t,onChange:e=>r(e.target.value),children:[(0,S.jsx)(`option`,{value:`keep`,children:`keep in place`}),(0,S.jsx)(`option`,{value:`archive`,children:`archive aside`}),(0,S.jsx)(`option`,{value:`delete`,children:`delete too`})]})]}),(0,S.jsxs)(`div`,{className:`row gap-8`,children:[(0,S.jsx)(`button`,{type:`button`,className:`btn danger`,disabled:n,onClick:i,children:n?`Removing…`:`Remove`}),(0,S.jsx)(`button`,{type:`button`,className:`btn ghost`,onClick:a,children:`Cancel`})]})]})}function j({targets:e,onReveal:t}){let n=e.flatMap(e=>e.servers);return(0,S.jsxs)(`div`,{className:`ip-block`,children:[(0,S.jsxs)(`span`,{className:`ip-label`,children:[`MCP servers `,(0,S.jsx)(`span`,{className:`mono dim`,children:n.length})]}),e.map(e=>(0,S.jsxs)(`div`,{className:`mcp-target`,children:[(0,S.jsxs)(`div`,{className:`mt-head`,children:[(0,S.jsx)(`code`,{title:e.path,children:e.label}),(0,S.jsx)(`button`,{type:`button`,className:`btn ghost sm`,onClick:()=>t(e),title:`Open the folder holding ${e.path} to edit it`,children:`Open folder`})]}),e.servers.length?e.servers.map(e=>(0,S.jsxs)(`div`,{className:`mcp-row`,children:[(0,S.jsx)(`span`,{className:`mono`,children:e.name}),(0,S.jsx)(`span`,{className:`tag ${e.state===`enabled`?`ok`:`warn`}`,children:e.state===`enabled`?`Enabled`:`Disabled`})]},e.name)):(0,S.jsx)(`p`,{className:`sub`,children:`None configured in this file.`})]},e.path))]})}var M={active:[`Active`,`ok`],disabled:[`Disabled`,`warn`],absent:[`Not installed`,``]};function N({inst:e,targets:t,choice:n,unchanged:r,options:i,onPick:s,canAct:c,busy:l,removing:u,onRemoving:d,onApply:f,onToggleInstall:p,onRemove:m,onRevealMcp:h}){let g=`${e.host} · ${e.scope}`,[_,v]=M[e.state]||M.absent,y=e.state===`active`,b=e.state===`absent`;return(0,S.jsxs)(`aside`,{className:`install-panel`,"aria-label":`${g} install`,children:[(0,S.jsx)(`span`,{className:`ip-eyebrow`,children:`Selected install`}),(0,S.jsxs)(`div`,{className:`ip-head`,children:[(0,S.jsx)(`h2`,{children:a(e)}),(0,S.jsx)(`span`,{className:`tag ${v}`,children:_})]}),(0,S.jsx)(`span`,{className:`ip-kind`,children:e.scope===`global`?`Global install`:`Per-project install · ${o(e.host).label}`}),(0,S.jsx)(`code`,{className:`ip-path`,children:e.path}),b?(0,S.jsxs)(`p`,{className:`sub`,children:[`Install Geneseed here as `,(0,S.jsx)(`strong`,{children:e.host}),`. Files are added non-destructively; deactivate or uninstall later.`]}):null,(y||b)&&c?(0,S.jsx)(`div`,{className:`ip-picks`,children:(0,S.jsx)(D,{value:n,options:i,onChange:s,who:g})}):null,y&&t.length?(0,S.jsx)(j,{targets:t,onReveal:h}):null,y&&e.scope===`global`?(0,S.jsx)(k,{}):null,b?null:(0,S.jsxs)(`label`,{className:`ip-switch`,children:[(0,S.jsx)(T,{on:y,disabled:l,label:`activate ${g}`,onToggle:p}),(0,S.jsx)(`span`,{children:y?`Active: loads in every session`:`Disabled: files moved aside`})]}),(0,S.jsx)(`div`,{className:`ip-spacer`}),c?(0,S.jsxs)(`div`,{className:`ip-actions`,children:[b?(0,S.jsx)(`button`,{type:`button`,className:`btn`,onClick:f,children:`Install`}):y?(0,S.jsx)(`button`,{type:`button`,className:`btn`,disabled:r,onClick:f,children:`Apply and rebuild`}):null,b?null:(0,S.jsx)(`button`,{type:`button`,className:`btn ghost danger-line`,"aria-label":`remove ${g} from ${e.path}`,"aria-expanded":!!u,disabled:l,onClick:()=>d(u?null:{memory:`keep`}),children:`Uninstall…`})]}):null,u?(0,S.jsx)(A,{inst:e,memory:u.memory,busy:l,onMemory:e=>d({memory:e}),onRemove:m,onCancel:()=>d(null)}):null]})}var P=(e,t)=>`${e} ${t}`,F={active:[`Active`,`ok`],disabled:[`Disabled`,`warn`]};function I({rows:e,project:t,currentId:n,onPick:r,label:i}){return(0,S.jsx)(`div`,{className:`tbl-scroll`,children:(0,S.jsxs)(`table`,{className:`tbl hosts-tbl`,"aria-label":i,children:[(0,S.jsx)(`thead`,{children:(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`th`,{children:t?`Project`:`Host`}),(0,S.jsx)(`th`,{children:t?`Host`:`Path`}),(0,S.jsx)(`th`,{children:`Voice`}),(0,S.jsx)(`th`,{children:`Footprint`}),(0,S.jsx)(`th`,{children:`State`}),(0,S.jsx)(`th`,{children:(0,S.jsx)(`span`,{className:`sr-only`,children:`Selected`})})]})}),(0,S.jsx)(`tbody`,{children:e.map(e=>{let[i,s]=F[e.state]||[`Not installed`,``],c=n===e.id,l=e.state===`absent`;return(0,S.jsxs)(`tr`,{className:`pickable${c?` on`:``}${l?` quiet`:``}`,onClick:()=>r(e.id),children:[(0,S.jsx)(`td`,{children:(0,S.jsx)(`button`,{type:`button`,className:`row-pick`,"aria-pressed":c,title:e.path,onClick:()=>r(e.id),children:a(e)})}),t?(0,S.jsx)(`td`,{children:o(e.host).label}):(0,S.jsx)(`td`,{className:`mono path-cell`,title:e.path,children:e.path}),(0,S.jsx)(`td`,{children:l?``:e.theme||``}),(0,S.jsx)(`td`,{children:l?``:e.footprint||``}),(0,S.jsx)(`td`,{children:(0,S.jsx)(`span`,{className:`tag ${s}`,children:i})}),(0,S.jsx)(`td`,{className:`pick-mark`,children:c?`Editing ›`:``})]},e.id)})})]})})}function L({themes:e,current:t}){if(!e.length||!t)return null;let n=[...e].sort((e,n)=>e.name===t?-1:+(n.name===t));return(0,S.jsxs)(`details`,{className:`panel voice-ref`,children:[(0,S.jsxs)(`summary`,{children:[(0,S.jsx)(`span`,{className:`vr-title`,children:`Voices`}),(0,S.jsxs)(`span`,{className:`mono dim`,children:[e.length,` to choose from, set per install`]})]}),(0,S.jsx)(`div`,{className:`vr-list`,children:n.map(e=>(0,S.jsxs)(`div`,{className:`voice-row${e.name===t?` current`:``}`,children:[(0,S.jsx)(`span`,{className:`vr-name`,children:e.name}),(0,S.jsx)(`span`,{className:`vr-desc`,children:e.tagline?`“${e.tagline}”`:e.blurb})]},e.name))})]})}function R({setup:e,overview:t}){if(!e)return null;let n=e.installed_fp&&e.installed_fp===e.source_fp;return(0,S.jsxs)(`section`,{className:`panel`,"aria-labelledby":`checkout-h`,children:[(0,S.jsxs)(`div`,{className:`panel-head`,children:[(0,S.jsx)(`h2`,{id:`checkout-h`,children:`This checkout`}),(0,S.jsx)(`span`,{className:`mono ${n?`t-good`:`t-warn`}`,children:e.version_verdict})]}),(0,S.jsxs)(`dl`,{className:`kv-grid`,children:[(0,S.jsx)(`dt`,{children:`Source`}),(0,S.jsx)(`dd`,{className:`mono`,children:e.root}),(0,S.jsx)(`dt`,{children:`Version`}),(0,S.jsx)(`dd`,{className:`mono`,children:t?.version||`unknown`}),(0,S.jsx)(`dt`,{children:`Fingerprint`}),(0,S.jsx)(`dd`,{className:`mono`,children:e.source_fp})]})]})}function z({onAction:e,themes:t=[],currentTheme:n,overview:i,setup:a,dataRev:o,onMutated:c}){let l=g(),{data:u,error:d}=s(()=>r.installs(),[o]),{data:f,error:m}=s(()=>r.mcp(),[o]),[_,y]=(0,x.useState)(``),[b,C]=(0,x.useState)(``),[T,E]=(0,x.useState)({}),[D,k]=(0,x.useState)(!1),[A,j]=(0,x.useState)(null),[M,F]=(0,x.useState)(``),z=(0,x.useMemo)(()=>{let e={};for(let t of f?.targets||[]){let n=P(t.host||`opencode`,t.root);(e[n]||(e[n]=[])).push(t)}return e},[f]);if(d||m)return(0,S.jsx)(p,{error:d||m});if(!u||!f)return(0,S.jsx)(v,{});let B={active:0,disabled:1,absent:2},V=[...u.installs].sort((e,t)=>(e.scope===`global`?0:1)-(t.scope===`global`?0:1)||(B[e.state]??3)-(B[t.state]??3)),H=V.find(e=>e.id===M)||V.find(e=>e.selected)||V.find(e=>e.state===`active`)||V[0],U=e=>{let t=T[e.id]||{};return{theme:t.theme||e.theme||n||`neutral`,footprint:t.footprint||e.footprint||`full`,posture:t.posture||e.posture||`peer`,mode:t.mode||e.mode||`direct`,trust:t.trust||e.trust||`balanced`}},W=(e,t,n)=>E(r=>({...r,[e.id]:{...r[e.id],[t]:n}})),G=e=>{let t=U(e);return t.theme===e.theme&&t.footprint===(e.footprint||`full`)&&t.posture===(e.posture||`peer`)&&t.mode===(e.mode||`direct`)&&t.trust===(e.trust||`balanced`)},K={theme:t.map(e=>e.name),footprint:w,posture:u.postures||[],mode:u.modes||[],trust:u.trusts||[]},q=async t=>{let{theme:n,footprint:r,posture:i,mode:a,trust:o}=U(t),s=t.state===`absent`?`Install Geneseed into ${t.path} with the “${n}” voice (${r} footprint, ${i} posture, ${a} mode)? Files are added non-destructively (your own config is left untouched); deactivate or uninstall later.`:`Rebuild this install (voice “${n}”, ${r} footprint, ${i} posture, ${a} mode)? It rebuilds in place, non-destructive.`;await l(s,{title:t.state===`absent`?`Install Geneseed?`:`Rebuild this install?`,confirmLabel:t.state===`absent`?`Install`:`Rebuild`})&&e?.(`install`,{host:t.host,scope:t.scope,path:t.path,theme:n,footprint:r,posture:i,mode:a,trust:o})},J=async e=>{if(e.state!==`active`||await l(`Deactivate this install? Files are moved aside, not deleted; reactivate any time.`,{title:`Deactivate this install?`,confirmLabel:`Deactivate`})){C(e.id),y(``);try{let t=await r.installToggle(e.host,e.path,e.state===`active`?`deactivate`:`activate`);if(!t.ok){let e=Array.isArray(t.failed)?t.failed.join(`, `):``;y(t.error||e&&`unrestored: ${e}`||`action failed`);return}c?.()}catch(e){y(e.message)}finally{C(``)}}},Y=async()=>{let e=A;if(e){C(e.id),y(``);try{let t=await r.installRemove(e.host,e.path,e.memory);if(!t.ok){y(t.error||`remove failed`);return}j(null),t.kept?.length&&y(`Removed. Kept ${t.kept.length} file(s) you edited: ${t.kept.join(`, `)} — they are yours now (the CLI geneseed uninstall --force deletes edited files too).`),c?.()}catch(e){y(e.message)}finally{C(``)}}},X=async e=>{y(``);try{let t=await r.mcpReveal(e.path);y(`Opening ${t.dir}. If no window appeared, open that folder by hand.`)}catch(e){y(e.message)}},Z=V.find(e=>e.selected)?.host||V.find(e=>e.state===`active`)?.host||V[0]?.host||`opencode`,ee=V.filter(e=>e.scope===`global`),Q=V.filter(e=>e.scope!==`global`),$=e=>{F(e),j(null)};return(0,S.jsxs)(`div`,{className:`hosts`,children:[(0,S.jsxs)(`div`,{className:`hosts-main`,children:[(0,S.jsxs)(`div`,{className:`toolbar`,children:[(0,S.jsxs)(`span`,{className:`dim`,children:[V.filter(e=>e.state===`active`).length,` active of `,V.length,` `,`detected.`]}),e?(0,S.jsx)(`div`,{className:`row gap-8`,children:(0,S.jsxs)(`button`,{type:`button`,className:`btn ghost`,onClick:()=>e(`build-all`),children:[(0,S.jsx)(h,{name:`refresh`}),` Rebuild all`]})}):null]}),_?(0,S.jsx)(`p`,{className:`tag bad note`,role:`status`,children:_}):null,(0,S.jsxs)(`section`,{className:`panel flush`,"aria-labelledby":`inst-global`,children:[(0,S.jsx)(`div`,{className:`inst-head`,children:(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{id:`inst-global`,children:`Global installs`}),(0,S.jsx)(`p`,{className:`dim`,children:`One per tool. Loaded in every folder, except excluded ones.`})]})}),(0,S.jsx)(I,{rows:ee,currentId:H?.id,onPick:$,label:`Global installs`})]}),(0,S.jsxs)(`section`,{className:`panel flush`,"aria-labelledby":`inst-project`,children:[(0,S.jsxs)(`div`,{className:`inst-head`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{id:`inst-project`,children:`Per-project installs`}),(0,S.jsx)(`p`,{className:`dim`,children:`A repo with its own harness. Inside it, only that harness loads.`})]}),e?(0,S.jsxs)(`button`,{type:`button`,className:`btn ghost`,onClick:()=>k(e=>!e),children:[(0,S.jsx)(h,{name:`folder`}),` Deploy to a repo…`]}):null]}),D?(0,S.jsx)(`div`,{className:`inst-deploy`,children:(0,S.jsx)(O,{host:Z,theme:n||`neutral`,options:K,onAction:e,onClose:()=>k(!1),onNote:y})}):null,Q.length?(0,S.jsx)(I,{rows:Q,project:!0,currentId:H?.id,onPick:$,label:`Per-project installs`}):(0,S.jsx)(`div`,{className:`empty inst-empty`,children:`No repo has its own harness yet. Deploy one to give a project its own rules and voice.`})]}),(0,S.jsx)(R,{setup:a,overview:i}),(0,S.jsx)(L,{themes:t,current:i?.theme})]}),H?(0,S.jsx)(N,{inst:H,targets:z[P(H.host,H.path)]||[],choice:U(H),unchanged:G(H),options:K,onPick:(e,t)=>W(H,e,t),canAct:!!e,busy:b===H.id,removing:A?.id===H.id?A:null,onRemoving:e=>j(e&&{id:H.id,host:H.host,path:H.path,memory:e.memory}),onApply:()=>q(H),onToggleInstall:()=>J(H),onRemove:Y,onRevealMcp:X},H.id):null]})}function B(e){return e.startsWith(`@@`)||e.startsWith(`+++`)||e.startsWith(`---`)?`hunk`:e.startsWith(`+`)?`add`:e.startsWith(`-`)?`del`:`ctx`}function V({onMutated:e,onAction:t,dataRev:n}){let i=g(),{data:a,error:o,reload:c}=s(()=>r.diff(),[n]),[l,u]=(0,x.useState)(!1),[d,f]=(0,x.useState)(``),[m,_]=(0,x.useState)(()=>new Set),[y,b]=(0,x.useState)(()=>new Set),[C,w]=(0,x.useState)(null);a&&a!==C&&(w(a),_(new Set),b(new Set(a.files.map(e=>e.rel))));let T=e=>_(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),E=()=>_(e=>e.size===a.files.length?new Set:new Set(a.files.map(e=>e.rel))),D=()=>t?.(`export`),O=async()=>{let t=[...m],n=t.filter(e=>a.files.find(t=>t.rel===e)?.status===`added`),o=n.length?`Restoring will DELETE ${n.length} deployed-only file(s):\n${n.join(`
1
+ import{s as e}from"./sections-GalMS0Zv.js";import{i as t,t as n}from"./react-DRhoX0kS.js";import{t as r}from"./api-Bp5eW_6m.js";import{A as i,D as a,E as o,F as s,I as c,L as l,O as u,R as d,T as f,_ as p,b as m,k as h,v as g,x as _,y as v,z as y}from"./index-CdpLpPQN.js";import{t as b}from"./Tabs-DjWN0i7A.js";var x=e(t(),1),S=n();function C({label:e,value:t,options:n,onChange:r}){return n.length?(0,S.jsx)(`select`,{className:`sel`,"aria-label":e,value:t,onChange:e=>r(e.target.value),children:n.map(e=>(0,S.jsx)(`option`,{value:e,children:e},e))}):null}var w=[`full`,`lean`];function T({on:e,disabled:t,label:n,onToggle:r}){return(0,S.jsx)(`input`,{type:`checkbox`,role:`switch`,className:`sw-toggle${e?` on`:``}`,checked:e,"aria-checked":e,disabled:t,"aria-label":n,onChange:r,onKeyDown:e=>{e.key===`Enter`&&!t&&r()}})}var E=[{key:`theme`,name:`voice`,title:`Voice`},{key:`footprint`,name:`footprint`,title:`Footprint`},{key:`posture`,name:`posture`,title:`Posture`},{key:`mode`,name:`mode`,title:`Mode`},{key:`trust`,name:`trust`,title:`Loop trust`}];function D({value:e,options:t,onChange:n,who:r}){return E.map(i=>(0,S.jsxs)(`label`,{className:`dp-field`,children:[(0,S.jsx)(`span`,{children:i.title}),(0,S.jsx)(C,{label:`${i.name} for ${r}`,value:e[i.key],options:t[i.key],onChange:e=>n(i.key,e)})]},i.key))}function O({host:e,theme:t,options:n,onAction:i,onClose:a,onNote:s}){let[c,l]=(0,x.useState)({path:``,host:e,theme:t,footprint:`full`,posture:`peer`,mode:`direct`,trust:`balanced`}),[u,d]=(0,x.useState)(!1),p=(e,t)=>l(n=>({...n,[e]:t})),m=async()=>{d(!0),s(``);try{let e=await r.pickFolder();e.path?p(`path`,e.path):e.error&&s(e.error)}catch(e){s(e.message)}finally{d(!1)}},h=async()=>{let e=c.path.trim();if(!e){s(`Choose or type a folder to deploy into.`);return}s(``),await i?.(`deploy`,{host:c.host,path:e,theme:c.theme,footprint:c.footprint,posture:c.posture,mode:c.mode,trust:c.trust})&&a()};return(0,S.jsxs)(`div`,{className:`deploy-pop`,children:[(0,S.jsxs)(`div`,{className:`dp-row`,children:[(0,S.jsx)(`input`,{className:`inp dp-path`,type:`text`,placeholder:`/path/to/project, or click Browse…`,value:c.path,onChange:e=>p(`path`,e.target.value),onKeyDown:e=>e.key===`Enter`&&h(),"aria-label":`Folder to deploy into`}),(0,S.jsx)(`button`,{className:`btn ghost sm`,disabled:u,onClick:m,children:u?`Choosing…`:`Browse…`})]}),(0,S.jsxs)(`div`,{className:`dp-row`,children:[(0,S.jsxs)(`label`,{className:`dp-field`,children:[(0,S.jsx)(`span`,{children:`Deploy as`}),(0,S.jsx)(`select`,{className:`sel`,"aria-label":`host for the new harness`,value:c.host,onChange:e=>p(`host`,e.target.value),children:f.map(e=>(0,S.jsx)(`option`,{value:e.id,children:e.label},e.id))})]}),(0,S.jsx)(D,{value:c,options:n,onChange:p,who:`the new harness`}),(0,S.jsx)(`button`,{className:`btn sm`,onClick:h,children:`Deploy`}),(0,S.jsx)(`button`,{className:`btn ghost sm`,onClick:a,children:`Cancel`})]}),(0,S.jsxs)(`p`,{className:`sub dp-note`,children:[`Adds a per-repo harness (`,(0,S.jsx)(`code`,{children:o(c.host).deployAdds}),`) into the folder, non-destructively. It’s then tracked here even after you leave its directory.`]})]})}function k(){let{data:e,error:t,reload:n}=s(()=>r.excludes(),[]),[i,a]=(0,x.useState)(!1),[o,c]=(0,x.useState)([]),l=async(e,t)=>{a(!0);try{let n=await r.excludeMutate(e,t);c(n.messages||[])}catch(e){c(e.body?.messages||[e.message])}finally{a(!1),n()}};return t||!e?.installs?.length?null:(0,S.jsxs)(`div`,{className:`card pad-lg mb-16`,children:[(0,S.jsx)(`div`,{className:`card-head`,children:(0,S.jsx)(`h3`,{children:`Excluded folders`})}),(0,S.jsx)(`p`,{className:`sub mb-16`,children:`Sovereign repos: inside these folders every global harness goes dormant — hooks stay silent and the global preamble is not loaded.`}),(e.excludes||[]).map(e=>(0,S.jsxs)(`div`,{className:`row wrap between gap-12`,children:[(0,S.jsx)(`code`,{children:e.path}),(0,S.jsxs)(`span`,{className:`mono muted`,children:[`[`,e.hosts.join(`, `),`]`]}),(0,S.jsx)(`button`,{className:`btn ghost sm`,disabled:i,onClick:()=>l(`remove`,e.path),children:`Remove`})]},e.path)),(0,S.jsxs)(`button`,{className:`btn ghost sm`,disabled:i,onClick:async()=>{a(!0);try{let e=await r.pickFolder();e.path?await l(`add`,e.path):e.error&&c([e.error])}catch(e){c([e.message])}finally{a(!1)}},children:[(0,S.jsx)(h,{name:`folder`}),` Exclude a folder…`]}),o.map((e,t)=>(0,S.jsx)(`p`,{className:`sub`,children:e},t))]})}function A({inst:e,memory:t,busy:n,onMemory:r,onRemove:i,onCancel:a}){return(0,S.jsxs)(`div`,{className:`h-remove`,children:[(0,S.jsxs)(`p`,{className:`hr-msg`,children:[(0,S.jsx)(`strong`,{children:e.scope===`project`?`Remove this harness from the folder?`:`Remove the global ${e.host} install?`}),` `,(0,S.jsxs)(`span`,{className:`sub`,children:[`Deletes `,(0,S.jsx)(`code`,{children:u(e.host,e.scope)}),e.scope===`project`?` and de-lists it.`:`; the row stays, marked “not installed.”`,` `,`This can’t be undone.`]})]}),(0,S.jsxs)(`label`,{className:`field`,children:[(0,S.jsx)(`span`,{children:`Memory and notebook`}),(0,S.jsxs)(`select`,{className:`sel`,"aria-label":`memory disposition`,value:t,onChange:e=>r(e.target.value),children:[(0,S.jsx)(`option`,{value:`keep`,children:`keep in place`}),(0,S.jsx)(`option`,{value:`archive`,children:`archive aside`}),(0,S.jsx)(`option`,{value:`delete`,children:`delete too`})]})]}),(0,S.jsxs)(`div`,{className:`row gap-8`,children:[(0,S.jsx)(`button`,{type:`button`,className:`btn danger`,disabled:n,onClick:i,children:n?`Removing…`:`Remove`}),(0,S.jsx)(`button`,{type:`button`,className:`btn ghost`,onClick:a,children:`Cancel`})]})]})}function j({targets:e,onReveal:t}){let n=e.flatMap(e=>e.servers);return(0,S.jsxs)(`div`,{className:`ip-block`,children:[(0,S.jsxs)(`span`,{className:`ip-label`,children:[`MCP servers `,(0,S.jsx)(`span`,{className:`mono dim`,children:n.length})]}),e.map(e=>(0,S.jsxs)(`div`,{className:`mcp-target`,children:[(0,S.jsxs)(`div`,{className:`mt-head`,children:[(0,S.jsx)(`code`,{title:e.path,children:e.label}),(0,S.jsx)(`button`,{type:`button`,className:`btn ghost sm`,onClick:()=>t(e),title:`Open the folder holding ${e.path} to edit it`,children:`Open folder`})]}),e.servers.length?e.servers.map(e=>(0,S.jsxs)(`div`,{className:`mcp-row`,children:[(0,S.jsx)(`span`,{className:`mono`,children:e.name}),(0,S.jsx)(`span`,{className:`tag ${e.state===`enabled`?`ok`:`warn`}`,children:e.state===`enabled`?`Enabled`:`Disabled`})]},e.name)):(0,S.jsx)(`p`,{className:`sub`,children:`None configured in this file.`})]},e.path))]})}var M={active:[`Active`,`ok`],disabled:[`Disabled`,`warn`],absent:[`Not installed`,``]};function N({inst:e,targets:t,choice:n,unchanged:r,options:i,onPick:s,canAct:c,busy:l,removing:u,onRemoving:d,onApply:f,onToggleInstall:p,onRemove:m,onRevealMcp:h}){let g=`${e.host} · ${e.scope}`,[_,v]=M[e.state]||M.absent,y=e.state===`active`,b=e.state===`absent`;return(0,S.jsxs)(`aside`,{className:`install-panel`,"aria-label":`${g} install`,children:[(0,S.jsx)(`span`,{className:`ip-eyebrow`,children:`Selected install`}),(0,S.jsxs)(`div`,{className:`ip-head`,children:[(0,S.jsx)(`h2`,{children:a(e)}),(0,S.jsx)(`span`,{className:`tag ${v}`,children:_})]}),(0,S.jsx)(`span`,{className:`ip-kind`,children:e.scope===`global`?`Global install`:`Per-project install · ${o(e.host).label}`}),(0,S.jsx)(`code`,{className:`ip-path`,children:e.path}),b?(0,S.jsxs)(`p`,{className:`sub`,children:[`Install Geneseed here as `,(0,S.jsx)(`strong`,{children:e.host}),`. Files are added non-destructively; deactivate or uninstall later.`]}):null,(y||b)&&c?(0,S.jsx)(`div`,{className:`ip-picks`,children:(0,S.jsx)(D,{value:n,options:i,onChange:s,who:g})}):null,y&&t.length?(0,S.jsx)(j,{targets:t,onReveal:h}):null,y&&e.scope===`global`?(0,S.jsx)(k,{}):null,b?null:(0,S.jsxs)(`label`,{className:`ip-switch`,children:[(0,S.jsx)(T,{on:y,disabled:l,label:`activate ${g}`,onToggle:p}),(0,S.jsx)(`span`,{children:y?`Active: loads in every session`:`Disabled: files moved aside`})]}),(0,S.jsx)(`div`,{className:`ip-spacer`}),c?(0,S.jsxs)(`div`,{className:`ip-actions`,children:[b?(0,S.jsx)(`button`,{type:`button`,className:`btn`,onClick:f,children:`Install`}):y?(0,S.jsx)(`button`,{type:`button`,className:`btn`,disabled:r,onClick:f,children:`Apply and rebuild`}):null,b?null:(0,S.jsx)(`button`,{type:`button`,className:`btn ghost danger-line`,"aria-label":`remove ${g} from ${e.path}`,"aria-expanded":!!u,disabled:l,onClick:()=>d(u?null:{memory:`keep`}),children:`Uninstall…`})]}):null,u?(0,S.jsx)(A,{inst:e,memory:u.memory,busy:l,onMemory:e=>d({memory:e}),onRemove:m,onCancel:()=>d(null)}):null]})}var P=(e,t)=>`${e} ${t}`,F={active:[`Active`,`ok`],disabled:[`Disabled`,`warn`]};function I({rows:e,project:t,currentId:n,onPick:r,label:i}){return(0,S.jsx)(`div`,{className:`tbl-scroll`,children:(0,S.jsxs)(`table`,{className:`tbl hosts-tbl`,"aria-label":i,children:[(0,S.jsx)(`thead`,{children:(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`th`,{children:t?`Project`:`Host`}),(0,S.jsx)(`th`,{children:t?`Host`:`Path`}),(0,S.jsx)(`th`,{children:`Voice`}),(0,S.jsx)(`th`,{children:`Footprint`}),(0,S.jsx)(`th`,{children:`State`}),(0,S.jsx)(`th`,{children:(0,S.jsx)(`span`,{className:`sr-only`,children:`Selected`})})]})}),(0,S.jsx)(`tbody`,{children:e.map(e=>{let[i,s]=F[e.state]||[`Not installed`,``],c=n===e.id,l=e.state===`absent`;return(0,S.jsxs)(`tr`,{className:`pickable${c?` on`:``}${l?` quiet`:``}`,onClick:()=>r(e.id),children:[(0,S.jsx)(`td`,{children:(0,S.jsx)(`button`,{type:`button`,className:`row-pick`,"aria-pressed":c,title:e.path,onClick:()=>r(e.id),children:a(e)})}),t?(0,S.jsx)(`td`,{children:o(e.host).label}):(0,S.jsx)(`td`,{className:`mono path-cell`,title:e.path,children:e.path}),(0,S.jsx)(`td`,{children:l?``:e.theme||``}),(0,S.jsx)(`td`,{children:l?``:e.footprint||``}),(0,S.jsx)(`td`,{children:(0,S.jsx)(`span`,{className:`tag ${s}`,children:i})}),(0,S.jsx)(`td`,{className:`pick-mark`,children:c?`Editing ›`:``})]},e.id)})})]})})}function L({themes:e,current:t}){if(!e.length||!t)return null;let n=[...e].sort((e,n)=>e.name===t?-1:+(n.name===t));return(0,S.jsxs)(`details`,{className:`panel voice-ref`,children:[(0,S.jsxs)(`summary`,{children:[(0,S.jsx)(`span`,{className:`vr-title`,children:`Voices`}),(0,S.jsxs)(`span`,{className:`mono dim`,children:[e.length,` to choose from, set per install`]})]}),(0,S.jsx)(`div`,{className:`vr-list`,children:n.map(e=>(0,S.jsxs)(`div`,{className:`voice-row${e.name===t?` current`:``}`,children:[(0,S.jsx)(`span`,{className:`vr-name`,children:e.name}),(0,S.jsx)(`span`,{className:`vr-desc`,children:e.tagline?`“${e.tagline}”`:e.blurb})]},e.name))})]})}function R({setup:e,overview:t}){if(!e)return null;let n=e.installed_fp&&e.installed_fp===e.source_fp;return(0,S.jsxs)(`section`,{className:`panel`,"aria-labelledby":`checkout-h`,children:[(0,S.jsxs)(`div`,{className:`panel-head`,children:[(0,S.jsx)(`h2`,{id:`checkout-h`,children:`This checkout`}),(0,S.jsx)(`span`,{className:`mono ${n?`t-good`:`t-warn`}`,children:e.version_verdict})]}),(0,S.jsxs)(`dl`,{className:`kv-grid`,children:[(0,S.jsx)(`dt`,{children:`Source`}),(0,S.jsx)(`dd`,{className:`mono`,children:e.root}),(0,S.jsx)(`dt`,{children:`Version`}),(0,S.jsx)(`dd`,{className:`mono`,children:t?.version||`unknown`}),(0,S.jsx)(`dt`,{children:`Fingerprint`}),(0,S.jsx)(`dd`,{className:`mono`,children:e.source_fp})]})]})}function z({onAction:e,themes:t=[],currentTheme:n,overview:i,setup:a,dataRev:o,onMutated:c}){let l=g(),{data:u,error:d}=s(()=>r.installs(),[o]),{data:f,error:m}=s(()=>r.mcp(),[o]),[_,y]=(0,x.useState)(``),[b,C]=(0,x.useState)(``),[T,E]=(0,x.useState)({}),[D,k]=(0,x.useState)(!1),[A,j]=(0,x.useState)(null),[M,F]=(0,x.useState)(``),z=(0,x.useMemo)(()=>{let e={};for(let t of f?.targets||[]){let n=P(t.host||`opencode`,t.root);(e[n]||(e[n]=[])).push(t)}return e},[f]);if(d||m)return(0,S.jsx)(p,{error:d||m});if(!u||!f)return(0,S.jsx)(v,{});let B={active:0,disabled:1,absent:2},V=[...u.installs].sort((e,t)=>(e.scope===`global`?0:1)-(t.scope===`global`?0:1)||(B[e.state]??3)-(B[t.state]??3)),H=V.find(e=>e.id===M)||V.find(e=>e.selected)||V.find(e=>e.state===`active`)||V[0],U=e=>{let t=T[e.id]||{};return{theme:t.theme||e.theme||n||`neutral`,footprint:t.footprint||e.footprint||`full`,posture:t.posture||e.posture||`peer`,mode:t.mode||e.mode||`direct`,trust:t.trust||e.trust||`balanced`}},W=(e,t,n)=>E(r=>({...r,[e.id]:{...r[e.id],[t]:n}})),G=e=>{let t=U(e);return t.theme===e.theme&&t.footprint===(e.footprint||`full`)&&t.posture===(e.posture||`peer`)&&t.mode===(e.mode||`direct`)&&t.trust===(e.trust||`balanced`)},K={theme:t.map(e=>e.name),footprint:w,posture:u.postures||[],mode:u.modes||[],trust:u.trusts||[]},q=async t=>{let{theme:n,footprint:r,posture:i,mode:a,trust:o}=U(t),s=t.state===`absent`?`Install Geneseed into ${t.path} with the “${n}” voice (${r} footprint, ${i} posture, ${a} mode)? Files are added non-destructively (your own config is left untouched); deactivate or uninstall later.`:`Rebuild this install (voice “${n}”, ${r} footprint, ${i} posture, ${a} mode)? It rebuilds in place, non-destructive.`;await l(s,{title:t.state===`absent`?`Install Geneseed?`:`Rebuild this install?`,confirmLabel:t.state===`absent`?`Install`:`Rebuild`})&&e?.(`install`,{host:t.host,scope:t.scope,path:t.path,theme:n,footprint:r,posture:i,mode:a,trust:o})},J=async e=>{if(e.state!==`active`||await l(`Deactivate this install? Files are moved aside, not deleted; reactivate any time.`,{title:`Deactivate this install?`,confirmLabel:`Deactivate`})){C(e.id),y(``);try{let t=await r.installToggle(e.host,e.path,e.state===`active`?`deactivate`:`activate`);if(!t.ok){let e=Array.isArray(t.failed)?t.failed.join(`, `):``;y(t.error||e&&`unrestored: ${e}`||`action failed`);return}c?.()}catch(e){y(e.message)}finally{C(``)}}},Y=async()=>{let e=A;if(e){C(e.id),y(``);try{let t=await r.installRemove(e.host,e.path,e.memory);if(!t.ok){y(t.error||`remove failed`);return}j(null),t.kept?.length&&y(`Removed. Kept ${t.kept.length} file(s) you edited: ${t.kept.join(`, `)} — they are yours now (the CLI geneseed uninstall --force deletes edited files too).`),c?.()}catch(e){y(e.message)}finally{C(``)}}},X=async e=>{y(``);try{let t=await r.mcpReveal(e.path);y(`Opening ${t.dir}. If no window appeared, open that folder by hand.`)}catch(e){y(e.message)}},Z=V.find(e=>e.selected)?.host||V.find(e=>e.state===`active`)?.host||V[0]?.host||`opencode`,ee=V.filter(e=>e.scope===`global`),Q=V.filter(e=>e.scope!==`global`),$=e=>{F(e),j(null)};return(0,S.jsxs)(`div`,{className:`hosts`,children:[(0,S.jsxs)(`div`,{className:`hosts-main`,children:[(0,S.jsxs)(`div`,{className:`toolbar`,children:[(0,S.jsxs)(`span`,{className:`dim`,children:[V.filter(e=>e.state===`active`).length,` active of `,V.length,` `,`detected.`]}),e?(0,S.jsx)(`div`,{className:`row gap-8`,children:(0,S.jsxs)(`button`,{type:`button`,className:`btn ghost`,onClick:()=>e(`build-all`),children:[(0,S.jsx)(h,{name:`refresh`}),` Rebuild all`]})}):null]}),_?(0,S.jsx)(`p`,{className:`tag bad note`,role:`status`,children:_}):null,(0,S.jsxs)(`section`,{className:`panel flush`,"aria-labelledby":`inst-global`,children:[(0,S.jsx)(`div`,{className:`inst-head`,children:(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{id:`inst-global`,children:`Global installs`}),(0,S.jsx)(`p`,{className:`dim`,children:`One per tool. Loaded in every folder, except excluded ones.`})]})}),(0,S.jsx)(I,{rows:ee,currentId:H?.id,onPick:$,label:`Global installs`})]}),(0,S.jsxs)(`section`,{className:`panel flush`,"aria-labelledby":`inst-project`,children:[(0,S.jsxs)(`div`,{className:`inst-head`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{id:`inst-project`,children:`Per-project installs`}),(0,S.jsx)(`p`,{className:`dim`,children:`A repo with its own harness. Inside it, only that harness loads.`})]}),e?(0,S.jsxs)(`button`,{type:`button`,className:`btn ghost`,onClick:()=>k(e=>!e),children:[(0,S.jsx)(h,{name:`folder`}),` Deploy to a repo…`]}):null]}),D?(0,S.jsx)(`div`,{className:`inst-deploy`,children:(0,S.jsx)(O,{host:Z,theme:n||`neutral`,options:K,onAction:e,onClose:()=>k(!1),onNote:y})}):null,Q.length?(0,S.jsx)(I,{rows:Q,project:!0,currentId:H?.id,onPick:$,label:`Per-project installs`}):(0,S.jsx)(`div`,{className:`empty inst-empty`,children:`No repo has its own harness yet. Deploy one to give a project its own rules and voice.`})]}),(0,S.jsx)(R,{setup:a,overview:i}),(0,S.jsx)(L,{themes:t,current:i?.theme})]}),H?(0,S.jsx)(N,{inst:H,targets:z[P(H.host,H.path)]||[],choice:U(H),unchanged:G(H),options:K,onPick:(e,t)=>W(H,e,t),canAct:!!e,busy:b===H.id,removing:A?.id===H.id?A:null,onRemoving:e=>j(e&&{id:H.id,host:H.host,path:H.path,memory:e.memory}),onApply:()=>q(H),onToggleInstall:()=>J(H),onRemove:Y,onRevealMcp:X},H.id):null]})}function B(e){return e.startsWith(`@@`)||e.startsWith(`+++`)||e.startsWith(`---`)?`hunk`:e.startsWith(`+`)?`add`:e.startsWith(`-`)?`del`:`ctx`}function V({onMutated:e,onAction:t,dataRev:n}){let i=g(),{data:a,error:o,reload:c}=s(()=>r.diff(),[n]),[l,u]=(0,x.useState)(!1),[d,f]=(0,x.useState)(``),[m,_]=(0,x.useState)(()=>new Set),[y,b]=(0,x.useState)(()=>new Set),[C,w]=(0,x.useState)(null);a&&a!==C&&(w(a),_(new Set),b(new Set(a.files.map(e=>e.rel))));let T=e=>_(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),E=()=>_(e=>e.size===a.files.length?new Set:new Set(a.files.map(e=>e.rel))),D=()=>t?.(`export`),O=async()=>{let t=[...m],n=t.filter(e=>a.files.find(t=>t.rel===e)?.status===`added`),o=n.length?`Restoring will DELETE ${n.length} deployed-only file(s):\n${n.join(`
2
2
  `)}\n\n`:``;if(await i(`${o}Discard local edits and restore ${t.length} file(s) from source?`,{title:`Restore from source?`,confirmLabel:`Restore`})){u(!0);try{let n=await r.restore(t),i=n.errors.length?` · ${n.errors.length} error(s): ${n.errors.join(`; `)}`:``;f(`Restored ${n.restored.length}, deleted ${n.deleted.length}${i}`),await c(),e?.()}catch(e){f(e.message)}finally{u(!1)}}};if(o)return(0,S.jsx)(p,{error:o});if(!a)return(0,S.jsx)(v,{});if(!a.deployed)return(0,S.jsxs)(`div`,{className:`empty`,children:[(0,S.jsx)(`div`,{className:`big`,children:`No deployed harness`}),`Nothing to diff against.`]});if(!a.diffable)return(0,S.jsxs)(`div`,{className:`empty`,children:[(0,S.jsx)(`div`,{className:`big`,children:`No drift check for this install`}),`The drift check covers global installs only.`]});let k=a.files,A=k.filter(e=>e.status===`edited`).length,j=k.filter(e=>e.status===`added`).length,M=k.filter(e=>e.status===`missing`).length,N=e=>b(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n});return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`head-row mb-16`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{className:`h`,children:`Local edits`}),(0,S.jsx)(`p`,{className:`sub`,children:`The agent refines its own deployed files in place. Export them as improvements before any rebuild overwrites them.`})]}),(0,S.jsxs)(`div`,{className:`row gap-10`,children:[(0,S.jsxs)(`button`,{className:`btn ghost`,disabled:l||m.size===0,onClick:O,children:[`Restore`,m.size?` (${m.size})`:``]}),(0,S.jsxs)(`button`,{className:`btn`,disabled:l,onClick:D,children:[(0,S.jsx)(h,{name:`download`}),`Export improvements`]})]})]}),d?(0,S.jsx)(`p`,{className:`sub mb-14`,children:d}):null,k.length===0?(0,S.jsxs)(`div`,{className:`empty`,children:[(0,S.jsx)(`div`,{className:`big`,children:`In sync`}),`Deployed harness matches source.`]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`row between mb-14`,children:[(0,S.jsxs)(`div`,{className:`row gap-10`,children:[(0,S.jsxs)(`span`,{className:`badge`,children:[(0,S.jsx)(`span`,{className:`dot`,style:{background:`var(--warn)`}}),A,` edited`]}),(0,S.jsxs)(`span`,{className:`badge`,children:[(0,S.jsx)(`span`,{className:`dot`,style:{background:`var(--good)`}}),j,` added`]}),M>0&&(0,S.jsxs)(`span`,{className:`badge`,children:[(0,S.jsx)(`span`,{className:`dot`,style:{background:`var(--bad)`}}),M,` missing`]})]}),(0,S.jsxs)(`label`,{className:`row dim`,style:{gap:8,fontSize:12.5,cursor:`pointer`},children:[(0,S.jsx)(`input`,{type:`checkbox`,style:{accentColor:`var(--accent)`},checked:m.size===k.length,onChange:E}),`Select all`]})]}),(0,S.jsx)(`div`,{className:`stack gap-12`,children:k.map(e=>{let t=y.has(e.rel),n=e.status===`added`?`ok`:e.status===`missing`?`bad`:`warn`;return(0,S.jsxs)(`div`,{className:`card diff-file${t?` open`:``}`,children:[(0,S.jsxs)(`div`,{className:`diff-head`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`chk`,checked:m.has(e.rel),onChange:()=>T(e.rel),onClick:e=>e.stopPropagation(),"aria-label":`Select ${e.rel}`}),(0,S.jsx)(`span`,{className:`fname`,children:e.rel}),(0,S.jsxs)(`span`,{className:`badge ${n}`,children:[(0,S.jsx)(`span`,{className:`dot`}),e.status]}),(0,S.jsxs)(`span`,{className:`dim mono`,style:{marginLeft:`auto`,fontSize:11},children:[e.diff.length,` lines`]}),(0,S.jsx)(`button`,{className:`iconbtn`,onClick:()=>N(e.rel),style:{transform:t?`rotate(90deg)`:`none`},"aria-label":t?`Collapse ${e.rel}`:`Expand ${e.rel}`,"aria-expanded":t,children:(0,S.jsx)(h,{name:`chevron`})})]}),t&&(0,S.jsx)(`div`,{className:`diff-body`,children:e.diff.map((e,t)=>(0,S.jsx)(`div`,{className:`diff-line ${B(e)}`,children:e},t))})]},e.rel)})})]})]})}function H({group:e,i:t}){let n=e.problems.length===0,[r,i]=(0,x.useState)(!n);return(0,S.jsxs)(`div`,{className:`card check rise ${n?``:`bad`} ${r?`open`:``}`,style:{"--i":t*.6},children:[(0,S.jsxs)(`button`,{className:`check-head`,onClick:()=>i(e=>!e),disabled:n,style:{cursor:n?`default`:`pointer`},"aria-expanded":n?void 0:r,children:[(0,S.jsx)(`span`,{className:`feed-dot ${n?`ok`:`bad`}`,style:{width:9,height:9}}),(0,S.jsx)(`h3`,{children:e.label}),(0,S.jsxs)(`span`,{className:`badge ${n?`ok`:`bad`}`,children:[(0,S.jsx)(`span`,{className:`dot`}),n?`clean`:`${e.problems.length} problem${e.problems.length===1?``:`s`}`]}),!n&&(0,S.jsx)(h,{name:`chevron`,className:`chev glyph`})]}),!n&&r&&(0,S.jsx)(`div`,{className:`check-body`,children:e.problems.map(e=>(0,S.jsxs)(`div`,{className:`problem`,children:[(0,S.jsx)(`span`,{className:`x`,children:`✕`}),(0,S.jsx)(`span`,{children:e})]},e))})]})}function U(){let{data:e,error:t,reload:n,setData:i}=s(()=>r.doctor(),[]);return t?(0,S.jsx)(p,{error:t}):(0,S.jsxs)(`div`,{className:`narrow`,children:[(0,S.jsxs)(`div`,{className:`head-row mb-16`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{className:`h`,children:`Doctor`}),(0,S.jsx)(`p`,{className:`sub`,children:`Every check builds each theme in a sandbox and validates the result: token resolution, link integrity, parity, and drift.`})]}),(0,S.jsxs)(`button`,{className:`btn ghost`,onClick:()=>{i(null),n()},disabled:!e,children:[(0,S.jsx)(h,{name:`refresh`}),e?`Re-run checks`:`Running…`]})]}),e?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`div`,{className:`card pad-md mb-16`,children:(0,S.jsxs)(`div`,{className:`row wrap between gap-12`,children:[(0,S.jsxs)(`div`,{className:`row`,style:{gap:10,flexWrap:`wrap`},children:[(0,S.jsxs)(`span`,{className:`dim mono`,style:{fontSize:12},children:[`validated `,e.themes.length,` theme`,e.themes.length===1?``:`s`]}),e.themes.map(e=>(0,S.jsx)(`span`,{className:`badge`,style:{textTransform:`capitalize`},children:e},e))]}),e.ok?(0,S.jsxs)(`span`,{className:`badge ok`,children:[(0,S.jsx)(`span`,{className:`dot`}),`all clean`]}):(0,S.jsxs)(`span`,{className:`badge bad`,children:[(0,S.jsx)(`span`,{className:`dot`}),e.problems.length,` problem`,e.problems.length===1?``:`s`]})]})}),(0,S.jsx)(`div`,{className:`stack gap-12`,children:e.groups.map((e,t)=>(0,S.jsx)(H,{group:e,i:t},e.label))})]}):(0,S.jsx)(v,{label:`Running every check (builds each theme in a sandbox)…`})]})}function W(){let e=g(),[t,n]=(0,x.useState)(!1),[i,a]=(0,x.useState)(!1),[o,s]=(0,x.useState)(null);return t?(0,S.jsxs)(`p`,{className:`sub`,children:[`Server stopped. You can close this tab and reopen any time with `,(0,S.jsx)(`code`,{children:`geneseed web`}),`.`]}):(0,S.jsxs)(S.Fragment,{children:[o&&(0,S.jsx)(`p`,{className:`sub`,role:`alert`,children:o}),(0,S.jsxs)(`div`,{className:`row`,children:[(0,S.jsxs)(`button`,{className:`btn ghost`,onClick:async()=>{if(await e(`Restart the local Geneseed server? The console reconnects in a moment.`,{title:`Restart the server?`,confirmLabel:`Restart`})){a(!0),s(null);try{await c()}catch(e){s(e.message),a(!1)}}},disabled:i,children:[(0,S.jsx)(h,{name:`refresh`}),i?`Restarting…`:`Restart server`]}),(0,S.jsxs)(`button`,{className:`btn ghost`,onClick:async()=>{if(await e(`Stop the local Geneseed server? The console goes offline until you start it again.`,{title:`Stop the server?`,confirmLabel:`Stop server`})){s(null);try{await r.shutdown()}catch(e){if(e.status)return s(e.message)}n(!0)}},disabled:i,children:[(0,S.jsx)(h,{name:`x`}),`Stop server`]})]})]})}var G=`https://github.com/Arylmera/Geneseed`,K=`https://github.com/Arylmera`;function q(){let[e,t]=(0,x.useState)(G),[n,i]=(0,x.useState)(!0);return(0,x.useEffect)(()=>{Promise.resolve(r.docsPage?.(`about`)).then(e=>{e?.repo&&(t(e.repo),i(!!e.repo_is_github))}).catch(()=>{})},[]),(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`card pad-lg mb-16`,children:[(0,S.jsx)(`div`,{className:`card-head`,children:(0,S.jsx)(`h3`,{children:`About`})}),(0,S.jsx)(`p`,{className:`sub mb-16`,children:`Geneseed is a portable, theme-able harness you implant once and use everywhere to grow a disciplined AI coding agent. One canonical source, many voices, MIT-licensed.`}),(0,S.jsxs)(`div`,{className:`row wrap gap-10`,children:[(0,S.jsxs)(`a`,{className:`btn ghost`,href:e,target:`_blank`,rel:`noreferrer`,children:[(0,S.jsx)(h,{name:`github`}),n?`Source on GitHub`:`Source repo`]}),n&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`a`,{className:`btn ghost`,href:e+`/issues`,target:`_blank`,rel:`noreferrer`,children:[(0,S.jsx)(h,{name:`external`}),`Issues`]}),(0,S.jsxs)(`a`,{className:`btn ghost`,href:e+`/blob/main/LICENSE`,target:`_blank`,rel:`noreferrer`,children:[(0,S.jsx)(h,{name:`external`}),`MIT License`]})]})]})]}),(0,S.jsxs)(`div`,{className:`card pad-lg`,children:[(0,S.jsx)(`div`,{className:`card-head`,children:(0,S.jsx)(`h3`,{children:`Creator`})}),(0,S.jsxs)(`p`,{className:`sub mb-16`,children:[`Geneseed is built by `,(0,S.jsx)(`strong`,{children:`Guillaume Lemer`}),`. It started as a personal, Obsidian-vault-grown agent operating system and was distilled into the repo you are running. Implant it once, and a disciplined agent grows around the same inherited rules, skills, and memory in every repo it follows you into.`]}),(0,S.jsx)(`p`,{className:`sub mb-16`,children:`If you find this useful, a star on the repo or an issue with feedback is the best way to help shape what comes next.`}),(0,S.jsx)(`div`,{className:`row wrap gap-10`,children:(0,S.jsxs)(`a`,{className:`btn ghost`,href:K,target:`_blank`,rel:`noreferrer`,children:[(0,S.jsx)(h,{name:`github`}),`@Arylmera on GitHub`]})})]})]})}function J({overview:e,onAction:t,flavour:n,onFlavour:r,accentMode:i,onAccentMode:a,layout:o,onLayout:s}){let c=g(),u=e?.install,f=e?.footprint,p=async e=>{u&&e!==f&&await c(`Rebuild ${u.host} · ${u.scope} with the “${e}” footprint? It rebuilds in place, non-destructive.`,{title:`Change the footprint?`,confirmLabel:`Rebuild`})&&t?.(`install`,{...u,footprint:e})};return(0,S.jsxs)(`div`,{className:`narrow-lg`,children:[(0,S.jsx)(`div`,{className:`head-row mb-18`,children:(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h2`,{className:`h`,children:`Settings`}),(0,S.jsx)(`p`,{className:`sub`,children:`Console appearance, the footprint of the install you are viewing, machine maintenance (including the update), server control, and about. Each install is managed on the Hosts tab.`})]})}),n&&r&&(0,S.jsxs)(`div`,{className:`card pad-lg mb-16`,children:[(0,S.jsx)(`div`,{className:`card-head`,children:(0,S.jsx)(`h3`,{children:`Console direction`})}),(0,S.jsxs)(`p`,{className:`sub mb-16`,children:[y.length,` takes on the same data. Pick a direction; it applies instantly and persists across reloads.`]}),i&&a&&(0,S.jsxs)(`div`,{className:`dir-layout`,children:[(0,S.jsx)(`span`,{className:`tick`,id:`dir-accent-label`,children:`Accent`}),(0,S.jsx)(m,{value:i,onChange:a,labelledBy:`dir-accent-label`}),(0,S.jsx)(`span`,{className:`dir-layout-note sub`,role:`status`,"aria-live":`polite`,children:d(i)})]}),o&&s&&(0,S.jsxs)(`div`,{className:`dir-layout`,children:[(0,S.jsx)(`span`,{className:`tick`,id:`dir-layout-label`,children:`Overview view`}),(0,S.jsx)(_,{"aria-labelledby":`dir-layout-label`,children:l.map(e=>(0,S.jsx)(`button`,{className:o===e.id?`on`:``,onClick:()=>s(e.id),"aria-pressed":o===e.id,title:e.tagline,children:e.short},e.id))}),(0,S.jsx)(`span`,{className:`dir-layout-note sub`,role:`status`,"aria-live":`polite`,children:l.find(e=>e.id===o)?.tagline??``})]}),(0,S.jsx)(`div`,{className:`dir-grid`,children:y.map(e=>(0,S.jsxs)(`button`,{className:`dir-tile dir-${e.id} ${n===e.id?`on`:``}`,onClick:()=>r(e.id),"aria-pressed":n===e.id,children:[(0,S.jsxs)(`span`,{className:`dir-thumb`,"aria-hidden":`true`,children:[(0,S.jsx)(`span`,{className:`dir-thumb-rail`}),(0,S.jsx)(`span`,{className:`dir-thumb-bar`}),(0,S.jsx)(`span`,{className:`dir-thumb-bar`,style:{width:`70%`}}),(0,S.jsx)(`span`,{className:`dir-thumb-bar`,style:{width:`52%`}}),(0,S.jsx)(`span`,{className:`dir-thumb-dot`})]}),(0,S.jsxs)(`span`,{className:`dir-meta`,children:[(0,S.jsxs)(`span`,{className:`dir-name`,children:[e.short,n===e.id&&(0,S.jsx)(`span`,{className:`dir-check`,children:`● active`})]}),(0,S.jsx)(`span`,{className:`dir-tag`,children:e.tagline})]})]},e.id))})]}),u&&f&&(0,S.jsxs)(`div`,{className:`card pad-lg mb-16`,children:[(0,S.jsx)(`div`,{className:`card-head`,children:(0,S.jsx)(`h3`,{children:`Harness footprint`})}),(0,S.jsxs)(`p`,{className:`sub mb-16`,children:[`How much of the Rules `,(0,S.jsx)(`code`,{children:`AGENT.md`}),` carries inline each turn, for the current install (`,(0,S.jsxs)(`code`,{children:[u.host,` · `,u.scope]}),`). A token-cost dial; every Rule stays in force either way. Changing it rebuilds the install in place. `,(0,S.jsx)(`a`,{href:`#/docs/footprint`,children:`Learn more →`})]}),(0,S.jsxs)(`div`,{className:`dir-layout`,children:[(0,S.jsx)(`span`,{className:`tick`,id:`footprint-label`,children:`Footprint`}),(0,S.jsx)(_,{"aria-labelledby":`footprint-label`,children:[`full`,`lean`].map(e=>(0,S.jsx)(`button`,{className:f===e?`on`:``,onClick:()=>p(e),"aria-pressed":f===e,children:e},e))}),(0,S.jsx)(`span`,{className:`dir-layout-note sub`,role:`status`,"aria-live":`polite`,children:f===`lean`?`Lean: terse rule lines + a pointer to the full law file (~40% smaller, lighter context per turn).`:`Full: every Rule’s complete text and rationale inlined (maximum guidance, largest context).`})]})]}),(0,S.jsxs)(`div`,{className:`card pad-lg mb-16`,children:[(0,S.jsx)(`div`,{className:`card-head`,children:(0,S.jsx)(`h3`,{children:`Maintenance`})}),(0,S.jsxs)(`p`,{className:`sub mb-16`,children:[`Put `,(0,S.jsx)(`code`,{children:`geneseed`}),` on your PATH so it runs from any directory, or remove a global install. Your memory store is always kept. Each runs live in the console.`]}),(0,S.jsxs)(`div`,{className:`row wrap gap-10`,children:[(0,S.jsxs)(`button`,{className:`btn ghost`,onClick:()=>t(`update`),children:[(0,S.jsx)(h,{name:`download`}),`Update (git pull + rebuild)`]}),(0,S.jsxs)(`button`,{className:`btn ghost`,onClick:()=>t(`link`),children:[(0,S.jsx)(h,{name:`external`}),`Add to PATH`]}),(0,S.jsx)(`button`,{className:`btn ghost`,onClick:()=>t(`unlink`),children:`Remove from PATH`}),(0,S.jsxs)(`button`,{className:`btn ghost`,onClick:async()=>{await c(`Uninstall the global Geneseed harness? Your memory store is kept; everything else this install added is removed.`,{title:`Uninstall Geneseed?`,confirmLabel:`Uninstall`})&&t(`uninstall`)},children:[(0,S.jsx)(h,{name:`clear`}),`Uninstall`]})]})]}),(0,S.jsxs)(`div`,{className:`card pad-lg mb-16`,children:[(0,S.jsx)(`div`,{className:`card-head`,children:(0,S.jsx)(`h3`,{children:`Server`})}),(0,S.jsx)(`p`,{className:`sub mb-16`,children:`The console runs a small local server. Leave it running in the background and reopen any time, or stop it when you are done.`}),(0,S.jsx)(W,{})]}),(0,S.jsx)(q,{})]})}function Y({tab:e=`hosts`,overview:t,setup:n,themes:r,onAction:a,onMutated:o,dataRev:s,appearance:c={}}){let l=t?.doctor,u=t?.diff,d={edits:u?i(u)+(u.missing??0):null,doctor:l?l.ok?`clean`:l.problems.length:null};return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`div`,{className:`page-head`,children:(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`h1`,{className:`h`,children:`Installs`}),(0,S.jsx)(`p`,{className:`sub`,children:`Where the harness lives on this machine, and how each copy is built.`})]})}),(0,S.jsx)(b,{page:`installs`,current:e,badges:d,label:`Installs`}),e===`hosts`&&(0,S.jsx)(z,{onAction:a,themes:r,currentTheme:t?.theme,overview:t,setup:n,dataRev:s,onMutated:o}),e===`edits`&&(0,S.jsx)(V,{onMutated:o,onAction:a,dataRev:s}),e===`doctor`&&(0,S.jsx)(U,{}),e===`server`&&(0,S.jsx)(J,{overview:t,onAction:a,...c})]})}export{Y as default};
@@ -1 +1 @@
1
- import{n as e,s as t}from"./sections-GalMS0Zv.js";import{i as n,t as r}from"./react-DRhoX0kS.js";import{t as i}from"./api-Bp5eW_6m.js";import{t as a}from"./drawable-DALqyS4l.js";import{$ as o,F as s,G as c,H as l,J as u,N as d,P as f,Q as p,St as m,W as h,X as g,Y as _,Z as v,_t as y,at as b,bt as x,ct as S,dt as C,et as w,ft as T,h as E,ht as D,it as O,lt as k,mt as A,nt as j,ot as M,pt as N,rt as P,st as F,tt as I,ut as L,yt as R}from"./index-BP4foUp0.js";function z(e){return F((e.iterationDuration+e._loopDelay)*e.iterationCount-e._loopDelay)||1e-11}function B(e,t,n,r,i,a){let o=L(e.duration)&&e.duration<=1e-11?n-x:n;t.composition&&O(t,o,1,1,m.AUTO);let s=r?new v(r,e,t,o,!1,i,a):new I(e,t,o);return t.composition&&s.init(!0),M(t,s),S(t,e=>{let n=e._offset+e._delay+e.duration;n>t.iterationDuration&&(t.iterationDuration=n)}),t.duration=z(t),t}var V=0,H=class extends I{constructor(e={}){super(e,null,0),++V,this.id=N(e.id)?V:e.id,this.duration=0,this.labels={};let t=e.defaults,n=y.defaults;this.defaults=t?A(t,n):n,this.composition=b(e.composition,!0),this.onRender=e.onRender||n.onRender;let r=b(e.playbackEase,n.playbackEase);this._ease=r?o(r):null,this.iterationDuration=0}add(e,t,n){let r=C(t),i=C(e);if(r||i){if(this._hasChildren=!0,r){let r=t,i=y.editor&&y.editor.addTimelineChild,a=n&&n.type===`Stagger`&&y.editor,o=k(n)?n:null;if(o||a){let t=w(e),a=this.duration,s=this.iterationDuration,c=r.id,l=0,u=t.length,d=i?i(e,r,this.id,n,u):null,f=o||y.editor.resolveStagger(n.defaultValue);t.forEach(e=>{let n={...d||r};this.duration=a,this.iterationDuration=s,N(c)||(n.id=c+`-`+l);let i=g(this,f(e,l,t,null,this));B(n,this,i,e,l,t),l++})}else{let t=i?i(e,r,this.id,n):r,a=n&&n.type?n.defaultValue:n;B(t,this,g(this,a),e)}}else B(e,this,g(this,t));return this.composition&&this.init(!0),this}}sync(e,t){if(N(e)||e&&N(e.pause))return this;e.pause();let n=+(e.effect?e.effect.getTiming().duration:e.duration);!N(e)&&!N(e.persist)&&(e.persist=!0);let r=y.editor,i=r&&r.addTimelineChild;r&&r.addTimelineSync&&(t=r.addTimelineSync(e,t,this.id),r.addTimelineChild=null);let a=this.add(e,{currentTime:[0,n],duration:n,delay:0,ease:`linear`,playbackEase:`linear`},t);return r&&(r.addTimelineChild=i),a}set(e,t,n){return N(t)?this:(t.duration=x,t.composition=R.replace,this.add(e,t,n))}call(e,t){return N(e)||e&&!k(e)?this:(y.editor&&y.editor.addTimelineCall&&(t=y.editor.addTimelineCall(e,t,this.id)),this.add({duration:0,delay:0,onComplete:()=>e(this)},t))}label(e,t){return N(e)||e&&!T(e)?this:(y.editor&&y.editor.addTimelineLabel&&(t=y.editor.addTimelineLabel(e,t,this.id)),this.labels[e]=g(this,t),this)}remove(e,t){return j(w(e),this,t),this}stretch(e){let t=this.duration;if(t===D(e))return this;let n=e/t,r=this.labels;S(this,e=>e.stretch(e.duration*n));for(let e in r)r[e]*=n;return super.stretch(e)}refresh(){return S(this,e=>{e.refresh&&e.refresh()}),this}revert(){return super.revert(),S(this,e=>e.revert,!0),P(this)}then(e){return super.then(e)}},U=e=>y.editor?y.editor.addTimeline(e):new H(e).init(),W=t(n(),1),G=r(),K=.62,q=(e,t)=>String(e).length*t*K;function J(e,t){let n=0;for(let t of e){if(t.t===``||t.t==null)continue;let e=q(t.t,t.size)/2;n=Math.max(n,Math.hypot(e,t.dy-t.size*.75),Math.hypot(e,t.dy+t.size*.25))}return Math.ceil(n+t)}function Y(e,t,n=0){let r=t.x-e.x,i=t.y-e.y,a=Math.hypot(r,i)||1,o=r/a,s=i/a,c=e.x+o*e.r,l=e.y+s*e.r,u=t.x-o*t.r,d=t.y-s*t.r,f=n*a,p=e=>e.toFixed(1);return`M${p(c)} ${p(l)} C${p(c+o*a*.3-s*f)} ${p(l+s*a*.3+o*f)} ${p(u-o*a*.3-s*f)} ${p(d-s*a*.3+o*f)} ${p(u)} ${p(d)}`}var X=!1,Z=!1,Q=850;function $({hash:e,label:t,part:n,children:r}){return(0,G.jsx)(`g`,{className:`cm-node`,"data-cm":n,role:`button`,tabIndex:0,"aria-label":t,onClick:()=>l(e),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),l(e))},children:r})}function ee({overview:e,dataRev:t}){let{data:n}=s(()=>i.catalog(`laws`),[t],`catalog:laws`),r=n?.items??null,o=(0,W.useRef)(null),l=(0,W.useRef)(!0),d=(0,W.useRef)(null);(0,W.useLayoutEffect)(()=>{let e=o.current;if(!e||X||!h())return;X=!0;let t=t=>[...e.querySelectorAll(t)],n=t(`[data-cm="hub"]`),r=t(`[data-cm="sat"]`),i=t(`[data-cm="gov"]`),s=t(`.cm-edge-gov`),f=t(`.cm-note, .cm-govern-label`),p=a(t(`.cm-edge`));_([...n,...r,...i],{opacity:0,scale:.7}),_([...s,...f],{opacity:0}),_(p,{draw:`0 0`});let m=U({autoplay:!1,defaults:{ease:`outExpo`}}).add(n,{opacity:1,scale:1,duration:450},0).add(p,{draw:`0 1`,duration:380,delay:u(70)},140).add(r,{opacity:1,scale:1,duration:420,delay:u(70)},260).add(s,{opacity:1,duration:300,delay:u(50)},420).add(i,{opacity:1,scale:1,duration:380,delay:u(50)},470).add(f,{opacity:1,duration:300},520);l.current=!1;let g=()=>m.complete(),v=()=>{m.play(),g=c(m,Q),l.current=!0,d.current?.()};if(typeof IntersectionObserver>`u`)return v(),()=>g();let y=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(y.disconnect(),v())},{threshold:.33});return y.observe(e),()=>{y.disconnect(),l.current=!0,g()}},[]);let m=e?.counts||{},g=f(m),v=[];for(let e of(r||[]).filter(e=>e.tier===`doctrine`)){let t=v.find(t=>t.id===e.pack);t||v.push(t={id:e.pack,on:0}),e.active!==!1&&(t.on+=1)}let y=e?.footprint===`lean`?`lean — first line only`:`full text inlined`,b={x:330,y:165,r:J([{t:`Constitution`,size:17,dy:-12},{t:`${g} rules in force`,size:10,dy:8},{t:y,size:8.5,dy:24}],12)},x={x:126,y:95,r:J([{t:`Ethos`,size:12.5,dy:-7},{t:`${m.ontology??0} sections`,size:10,dy:10}],11)},S={x:560,y:78,r:J([{t:`Invariants`,size:12.5,dy:-6},{t:`${m.laws??0}`,size:13,dy:12}],11)},C={x:560,y:252,r:J([{t:`Doctrines`,size:12.5,dy:-6},{t:`${m.doctrines?.rules??0}`,size:13,dy:12}],11)},w=(e,t,n,r)=>({x:e,y:t,label:n,count:r,r:J([{t:n,size:10.5,dy:-2},{t:`${r}`,size:9,dy:10}],9)}),T=[{...w(812,52,`Skills`,m.skills??0),hash:`#/skills`,from:S},{...w(820,126,`Agents`,m.agents??0),hash:`#/agents`,from:S},{...w(816,232,`Memory`,m.memory??0),hash:`#/section/memory`,from:C},{...w(812,300,`Wiki`,m.wiki??0),hash:`#/section/wiki`,from:C}],D={rx:122,ry:68,from:212,to:112},O=v.map((e,t)=>{let n=(v.length===1?(D.from+D.to)/2:D.from+(D.to-D.from)*t/(v.length-1))*Math.PI/180;return{...e,x:C.x+D.rx*Math.cos(n),y:C.y+D.ry*Math.sin(n),r:J([{t:e.id,size:7.5,dy:-2},{t:`${e.on}`,size:7.5,dy:8}],4)}}),k=O.length;return(0,W.useLayoutEffect)(()=>{let e=o.current;if(!e||!k||Z||!h())return;Z=!0;let t=[...e.querySelectorAll(`.cm-mini > g`)];_(t,{opacity:0,scale:.5});let n=()=>_(t,{opacity:1,scale:1}),r=()=>{d.current=null;let e=p(t,{opacity:1,scale:1,duration:380,delay:u(45,{start:420}),ease:`outExpo`});n=c(e,420+45*k+380)};return l.current?r():d.current=r,()=>{d.current=null,n()}},[k]),(0,G.jsxs)(`svg`,{ref:o,className:`cmap`,viewBox:`0 0 940 350`,role:`group`,"aria-label":`The constitution map`,children:[(0,G.jsx)(`path`,{d:Y(b,x,.05),className:`cm-edge`}),(0,G.jsx)(`path`,{d:Y(b,S,-.07),className:`cm-edge`}),(0,G.jsx)(`path`,{d:Y(b,C,.07),className:`cm-edge`}),T.map(e=>(0,G.jsx)(`path`,{d:Y(e.from,e,.03),className:`cm-edge-gov`},`e-${e.label}`)),(0,G.jsxs)($,{hash:`#/laws`,part:`hub`,label:`Constitution: ${g} rules in force`,children:[(0,G.jsx)(`circle`,{cx:b.x,cy:b.y,r:b.r,className:`cm-hub-disc`}),(0,G.jsx)(`text`,{x:b.x,y:b.y-12,textAnchor:`middle`,className:`cm-hub-name`,children:`Constitution`}),(0,G.jsxs)(`text`,{x:b.x,y:b.y+8,textAnchor:`middle`,className:`cm-hub-num`,children:[g,` rules in force`]}),(0,G.jsx)(`text`,{x:b.x,y:b.y+24,textAnchor:`middle`,className:`cm-note`,children:y})]}),(0,G.jsxs)($,{hash:`#/laws`,part:`sat`,label:`Ethos: ${m.ontology??0} sections`,children:[(0,G.jsx)(`circle`,{cx:x.x,cy:x.y,r:x.r,className:`cm-sat-disc`}),(0,G.jsx)(`text`,{x:x.x,y:x.y-7,textAnchor:`middle`,className:`cm-sat-name`,children:`Ethos`}),(0,G.jsxs)(`text`,{x:x.x,y:x.y+10,textAnchor:`middle`,className:`cm-sat-num`,children:[m.ontology??0,` sections`]})]}),(0,G.jsx)(`text`,{x:x.x,y:x.y+x.r+16,textAnchor:`middle`,className:`cm-note`,children:`how it thinks, not a rule`}),(0,G.jsxs)($,{hash:`#/laws`,part:`sat`,label:`Invariants: ${m.laws??0}, never broken`,children:[(0,G.jsx)(`circle`,{cx:S.x,cy:S.y,r:S.r,className:`cm-sat-disc`}),(0,G.jsx)(`text`,{x:S.x,y:S.y-6,textAnchor:`middle`,className:`cm-sat-name`,children:`Invariants`}),(0,G.jsx)(`text`,{x:S.x,y:S.y+12,textAnchor:`middle`,className:`cm-sat-big`,children:m.laws??0})]}),(0,G.jsx)(`text`,{x:S.x,y:S.y+S.r+16,textAnchor:`middle`,className:`cm-note`,children:`never broken`}),(0,G.jsxs)($,{hash:`#/laws`,part:`sat`,label:`Doctrines: ${m.doctrines?.rules??0} rules chosen at build`,children:[(0,G.jsx)(`circle`,{cx:C.x,cy:C.y,r:C.r,className:`cm-sat-disc`}),(0,G.jsx)(`text`,{x:C.x,y:C.y-6,textAnchor:`middle`,className:`cm-sat-name`,children:`Doctrines`}),(0,G.jsx)(`text`,{x:C.x,y:C.y+12,textAnchor:`middle`,className:`cm-sat-big`,children:m.doctrines?.rules??0})]}),(0,G.jsx)(`text`,{x:C.x+22,y:C.y+C.r+20,className:`cm-note`,children:m.doctrines?`chosen at build · ${m.doctrines.active}/${m.doctrines.total} packs lit`:`chosen at build`}),(0,G.jsx)(`g`,{className:`cm-mini`,children:O.map(e=>(0,G.jsxs)(`g`,{children:[(0,G.jsx)(`circle`,{cx:e.x,cy:e.y,r:e.r,className:`cm-pack-disc`,style:{stroke:E(e.id)}}),(0,G.jsx)(`text`,{x:e.x,y:e.y-2,textAnchor:`middle`,className:`cm-pack-id`,children:e.id}),(0,G.jsx)(`text`,{x:e.x,y:e.y+8,textAnchor:`middle`,style:{fill:E(e.id)},children:e.on})]},e.id))}),(0,G.jsx)(`text`,{x:866,y:16,textAnchor:`middle`,className:`cm-govern-label`,children:`GOVERNS THE HARNESS`}),T.map(e=>(0,G.jsxs)($,{hash:e.hash,part:`gov`,label:`${e.label}: ${e.count}`,children:[(0,G.jsx)(`circle`,{cx:e.x,cy:e.y,r:e.r,className:`cm-gov-disc`}),(0,G.jsx)(`text`,{x:e.x,y:e.y-2,textAnchor:`middle`,className:`cm-gov-name`,children:e.label}),(0,G.jsx)(`text`,{x:e.x,y:e.y+10,textAnchor:`middle`,className:`cm-gov-num`,children:e.count})]},e.label)),(0,G.jsx)(`text`,{x:x.x,y:228,textAnchor:`middle`,className:`cm-note`,children:`tap any node to open its ledger`})]})}function te(){let e=new Date,t=e=>String(e).padStart(2,`0`);return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function ne({counts:t}){let n=[{label:e.skills.label,n:t.skills??0,hash:`#/skills`},{label:`Rules in force`,n:f(t),hash:`#/laws`},{label:e.agents.label,n:t.agents??0,hash:`#/agents`},{label:e.memory.label,n:t.memory??0,hash:`#/section/memory`},{label:e.notebook.label,n:t.notebook??0,hash:`#/section/notebook`},{label:e.wiki.label,n:t.wiki??0,hash:`#/section/wiki`},{label:e.config.label,n:t.config??0,hash:`#/section/config`}],r=Math.max(...n.map(e=>e.n),1);return(0,G.jsxs)(`div`,{className:`card pad-lg jr-card`,children:[(0,G.jsxs)(`div`,{className:`card-head`,children:[(0,G.jsx)(`h3`,{children:`Growth rings`}),(0,G.jsx)(`span`,{className:`tick right`,children:`by section`})]}),n.map(e=>(0,G.jsxs)(`button`,{className:`jr-ring`,onClick:()=>l(e.hash),children:[(0,G.jsx)(`span`,{className:`jr-ring-label`,children:e.label}),(0,G.jsx)(`span`,{className:`jr-ring-track`,children:(0,G.jsx)(`span`,{className:`jr-ring-fill`,style:{width:`${e.n/r*100}%`}})}),(0,G.jsx)(`span`,{className:`jr-ring-num`,children:e.n})]},e.label))]})}function re({recent:e,buildEpoch:t}){let n=e?.items||[],r=e?.skipped||[];return(0,G.jsxs)(`div`,{className:`card pad-lg jr-card`,children:[(0,G.jsxs)(`div`,{className:`card-head`,children:[(0,G.jsx)(`h3`,{children:`Freshly grown`}),(0,G.jsx)(`span`,{className:`tick right`,children:`newest`})]}),e?n.length===0?(0,G.jsx)(`p`,{className:`sub`,children:`Nothing here carries a date yet.`}):n.slice(0,5).map(e=>(0,G.jsxs)(`button`,{className:`jr-fresh`,onClick:()=>l(`#/item/${e.type}/${encodeURIComponent(e.name)}`),children:[(0,G.jsx)(`span`,{className:`jr-fresh-kind`,children:e.section}),(0,G.jsx)(`span`,{className:`jr-fresh-name`,children:e.title}),(0,G.jsx)(`span`,{className:`jr-fresh-when`,children:d(e.mtime)})]},`${e.section}:${e.name}`)):(0,G.jsx)(`p`,{className:`sub`,children:`Reading the shelves…`}),r.length>0&&(0,G.jsxs)(`p`,{className:`sub jr-skipped`,children:[`Not dated: `,r.join(`, `),` — too many files to stat on every load.`]}),(0,G.jsxs)(`p`,{className:`jr-care`,children:[t?`Last built ✓ ${d(t)}`:`Never built here`,` ·`,` `,(0,G.jsx)(`button`,{className:`jr-go`,onClick:()=>l(`#/activity`),children:`log →`})]})]})}function ie({overview:e,recent:t,onAction:n,onDirection:r,dataRev:i}){let a=e?.counts||{};return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:`head-row jr-head`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsxs)(`div`,{className:`eyebrow`,children:[`Field journal · `,te()]}),(0,G.jsx)(`h1`,{className:`h`,children:`Today in this harness`})]}),(0,G.jsxs)(`div`,{className:`row wrap gap-10`,children:[(0,G.jsx)(`button`,{className:`btn primary`,onClick:()=>n?.(`update`),children:`Update & rebuild`}),(0,G.jsx)(`button`,{className:`btn`,onClick:()=>l(`#/doctor`),children:`Doctor`})]})]}),(0,G.jsxs)(`div`,{className:`jr-row2`,children:[(0,G.jsx)(ne,{counts:a}),(0,G.jsx)(re,{recent:t,buildEpoch:e?.build_epoch})]}),(0,G.jsxs)(`div`,{className:`card pad-lg jr-map`,children:[(0,G.jsxs)(`div`,{className:`card-head`,children:[(0,G.jsx)(`h3`,{children:`The Constitution — and the harness it governs`}),(0,G.jsx)(`button`,{className:`jr-go right`,onClick:()=>l(`#/laws`),children:`open →`})]}),(0,G.jsx)(ee,{overview:e,dataRev:i})]}),(0,G.jsxs)(`p`,{className:`sub jr-others`,children:[`Other views:`,` `,(0,G.jsx)(`button`,{className:`jr-go`,onClick:()=>r?.(`lineage`),children:`Lineage`}),` `,`·`,` `,(0,G.jsx)(`button`,{className:`jr-go`,onClick:()=>r?.(`operator`),children:`Operator`})]})]})}export{ie as default};
1
+ import{n as e,s as t}from"./sections-GalMS0Zv.js";import{i as n,t as r}from"./react-DRhoX0kS.js";import{t as i}from"./api-Bp5eW_6m.js";import{t as a}from"./drawable-C2ZsBZCv.js";import{$ as o,F as s,G as c,H as l,J as u,N as d,P as f,Q as p,St as m,W as h,X as g,Y as _,Z as v,_t as y,at as b,bt as x,ct as S,dt as C,et as w,ft as T,h as E,ht as D,it as O,lt as k,mt as A,nt as j,ot as M,pt as N,rt as P,st as F,tt as I,ut as L,yt as R}from"./index-CdpLpPQN.js";function z(e){return F((e.iterationDuration+e._loopDelay)*e.iterationCount-e._loopDelay)||1e-11}function B(e,t,n,r,i,a){let o=L(e.duration)&&e.duration<=1e-11?n-x:n;t.composition&&O(t,o,1,1,m.AUTO);let s=r?new v(r,e,t,o,!1,i,a):new I(e,t,o);return t.composition&&s.init(!0),M(t,s),S(t,e=>{let n=e._offset+e._delay+e.duration;n>t.iterationDuration&&(t.iterationDuration=n)}),t.duration=z(t),t}var V=0,H=class extends I{constructor(e={}){super(e,null,0),++V,this.id=N(e.id)?V:e.id,this.duration=0,this.labels={};let t=e.defaults,n=y.defaults;this.defaults=t?A(t,n):n,this.composition=b(e.composition,!0),this.onRender=e.onRender||n.onRender;let r=b(e.playbackEase,n.playbackEase);this._ease=r?o(r):null,this.iterationDuration=0}add(e,t,n){let r=C(t),i=C(e);if(r||i){if(this._hasChildren=!0,r){let r=t,i=y.editor&&y.editor.addTimelineChild,a=n&&n.type===`Stagger`&&y.editor,o=k(n)?n:null;if(o||a){let t=w(e),a=this.duration,s=this.iterationDuration,c=r.id,l=0,u=t.length,d=i?i(e,r,this.id,n,u):null,f=o||y.editor.resolveStagger(n.defaultValue);t.forEach(e=>{let n={...d||r};this.duration=a,this.iterationDuration=s,N(c)||(n.id=c+`-`+l);let i=g(this,f(e,l,t,null,this));B(n,this,i,e,l,t),l++})}else{let t=i?i(e,r,this.id,n):r,a=n&&n.type?n.defaultValue:n;B(t,this,g(this,a),e)}}else B(e,this,g(this,t));return this.composition&&this.init(!0),this}}sync(e,t){if(N(e)||e&&N(e.pause))return this;e.pause();let n=+(e.effect?e.effect.getTiming().duration:e.duration);!N(e)&&!N(e.persist)&&(e.persist=!0);let r=y.editor,i=r&&r.addTimelineChild;r&&r.addTimelineSync&&(t=r.addTimelineSync(e,t,this.id),r.addTimelineChild=null);let a=this.add(e,{currentTime:[0,n],duration:n,delay:0,ease:`linear`,playbackEase:`linear`},t);return r&&(r.addTimelineChild=i),a}set(e,t,n){return N(t)?this:(t.duration=x,t.composition=R.replace,this.add(e,t,n))}call(e,t){return N(e)||e&&!k(e)?this:(y.editor&&y.editor.addTimelineCall&&(t=y.editor.addTimelineCall(e,t,this.id)),this.add({duration:0,delay:0,onComplete:()=>e(this)},t))}label(e,t){return N(e)||e&&!T(e)?this:(y.editor&&y.editor.addTimelineLabel&&(t=y.editor.addTimelineLabel(e,t,this.id)),this.labels[e]=g(this,t),this)}remove(e,t){return j(w(e),this,t),this}stretch(e){let t=this.duration;if(t===D(e))return this;let n=e/t,r=this.labels;S(this,e=>e.stretch(e.duration*n));for(let e in r)r[e]*=n;return super.stretch(e)}refresh(){return S(this,e=>{e.refresh&&e.refresh()}),this}revert(){return super.revert(),S(this,e=>e.revert,!0),P(this)}then(e){return super.then(e)}},U=e=>y.editor?y.editor.addTimeline(e):new H(e).init(),W=t(n(),1),G=r(),K=.62,q=(e,t)=>String(e).length*t*K;function J(e,t){let n=0;for(let t of e){if(t.t===``||t.t==null)continue;let e=q(t.t,t.size)/2;n=Math.max(n,Math.hypot(e,t.dy-t.size*.75),Math.hypot(e,t.dy+t.size*.25))}return Math.ceil(n+t)}function Y(e,t,n=0){let r=t.x-e.x,i=t.y-e.y,a=Math.hypot(r,i)||1,o=r/a,s=i/a,c=e.x+o*e.r,l=e.y+s*e.r,u=t.x-o*t.r,d=t.y-s*t.r,f=n*a,p=e=>e.toFixed(1);return`M${p(c)} ${p(l)} C${p(c+o*a*.3-s*f)} ${p(l+s*a*.3+o*f)} ${p(u-o*a*.3-s*f)} ${p(d-s*a*.3+o*f)} ${p(u)} ${p(d)}`}var X=!1,Z=!1,Q=850;function $({hash:e,label:t,part:n,children:r}){return(0,G.jsx)(`g`,{className:`cm-node`,"data-cm":n,role:`button`,tabIndex:0,"aria-label":t,onClick:()=>l(e),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),l(e))},children:r})}function ee({overview:e,dataRev:t}){let{data:n}=s(()=>i.catalog(`laws`),[t],`catalog:laws`),r=n?.items??null,o=(0,W.useRef)(null),l=(0,W.useRef)(!0),d=(0,W.useRef)(null);(0,W.useLayoutEffect)(()=>{let e=o.current;if(!e||X||!h())return;X=!0;let t=t=>[...e.querySelectorAll(t)],n=t(`[data-cm="hub"]`),r=t(`[data-cm="sat"]`),i=t(`[data-cm="gov"]`),s=t(`.cm-edge-gov`),f=t(`.cm-note, .cm-govern-label`),p=a(t(`.cm-edge`));_([...n,...r,...i],{opacity:0,scale:.7}),_([...s,...f],{opacity:0}),_(p,{draw:`0 0`});let m=U({autoplay:!1,defaults:{ease:`outExpo`}}).add(n,{opacity:1,scale:1,duration:450},0).add(p,{draw:`0 1`,duration:380,delay:u(70)},140).add(r,{opacity:1,scale:1,duration:420,delay:u(70)},260).add(s,{opacity:1,duration:300,delay:u(50)},420).add(i,{opacity:1,scale:1,duration:380,delay:u(50)},470).add(f,{opacity:1,duration:300},520);l.current=!1;let g=()=>m.complete(),v=()=>{m.play(),g=c(m,Q),l.current=!0,d.current?.()};if(typeof IntersectionObserver>`u`)return v(),()=>g();let y=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(y.disconnect(),v())},{threshold:.33});return y.observe(e),()=>{y.disconnect(),l.current=!0,g()}},[]);let m=e?.counts||{},g=f(m),v=[];for(let e of(r||[]).filter(e=>e.tier===`doctrine`)){let t=v.find(t=>t.id===e.pack);t||v.push(t={id:e.pack,on:0}),e.active!==!1&&(t.on+=1)}let y=e?.footprint===`lean`?`lean — first line only`:`full text inlined`,b={x:330,y:165,r:J([{t:`Constitution`,size:17,dy:-12},{t:`${g} rules in force`,size:10,dy:8},{t:y,size:8.5,dy:24}],12)},x={x:126,y:95,r:J([{t:`Ethos`,size:12.5,dy:-7},{t:`${m.ontology??0} sections`,size:10,dy:10}],11)},S={x:560,y:78,r:J([{t:`Invariants`,size:12.5,dy:-6},{t:`${m.laws??0}`,size:13,dy:12}],11)},C={x:560,y:252,r:J([{t:`Doctrines`,size:12.5,dy:-6},{t:`${m.doctrines?.rules??0}`,size:13,dy:12}],11)},w=(e,t,n,r)=>({x:e,y:t,label:n,count:r,r:J([{t:n,size:10.5,dy:-2},{t:`${r}`,size:9,dy:10}],9)}),T=[{...w(812,52,`Skills`,m.skills??0),hash:`#/skills`,from:S},{...w(820,126,`Agents`,m.agents??0),hash:`#/agents`,from:S},{...w(816,232,`Memory`,m.memory??0),hash:`#/section/memory`,from:C},{...w(812,300,`Wiki`,m.wiki??0),hash:`#/section/wiki`,from:C}],D={rx:122,ry:68,from:212,to:112},O=v.map((e,t)=>{let n=(v.length===1?(D.from+D.to)/2:D.from+(D.to-D.from)*t/(v.length-1))*Math.PI/180;return{...e,x:C.x+D.rx*Math.cos(n),y:C.y+D.ry*Math.sin(n),r:J([{t:e.id,size:7.5,dy:-2},{t:`${e.on}`,size:7.5,dy:8}],4)}}),k=O.length;return(0,W.useLayoutEffect)(()=>{let e=o.current;if(!e||!k||Z||!h())return;Z=!0;let t=[...e.querySelectorAll(`.cm-mini > g`)];_(t,{opacity:0,scale:.5});let n=()=>_(t,{opacity:1,scale:1}),r=()=>{d.current=null;let e=p(t,{opacity:1,scale:1,duration:380,delay:u(45,{start:420}),ease:`outExpo`});n=c(e,420+45*k+380)};return l.current?r():d.current=r,()=>{d.current=null,n()}},[k]),(0,G.jsxs)(`svg`,{ref:o,className:`cmap`,viewBox:`0 0 940 350`,role:`group`,"aria-label":`The constitution map`,children:[(0,G.jsx)(`path`,{d:Y(b,x,.05),className:`cm-edge`}),(0,G.jsx)(`path`,{d:Y(b,S,-.07),className:`cm-edge`}),(0,G.jsx)(`path`,{d:Y(b,C,.07),className:`cm-edge`}),T.map(e=>(0,G.jsx)(`path`,{d:Y(e.from,e,.03),className:`cm-edge-gov`},`e-${e.label}`)),(0,G.jsxs)($,{hash:`#/laws`,part:`hub`,label:`Constitution: ${g} rules in force`,children:[(0,G.jsx)(`circle`,{cx:b.x,cy:b.y,r:b.r,className:`cm-hub-disc`}),(0,G.jsx)(`text`,{x:b.x,y:b.y-12,textAnchor:`middle`,className:`cm-hub-name`,children:`Constitution`}),(0,G.jsxs)(`text`,{x:b.x,y:b.y+8,textAnchor:`middle`,className:`cm-hub-num`,children:[g,` rules in force`]}),(0,G.jsx)(`text`,{x:b.x,y:b.y+24,textAnchor:`middle`,className:`cm-note`,children:y})]}),(0,G.jsxs)($,{hash:`#/laws`,part:`sat`,label:`Ethos: ${m.ontology??0} sections`,children:[(0,G.jsx)(`circle`,{cx:x.x,cy:x.y,r:x.r,className:`cm-sat-disc`}),(0,G.jsx)(`text`,{x:x.x,y:x.y-7,textAnchor:`middle`,className:`cm-sat-name`,children:`Ethos`}),(0,G.jsxs)(`text`,{x:x.x,y:x.y+10,textAnchor:`middle`,className:`cm-sat-num`,children:[m.ontology??0,` sections`]})]}),(0,G.jsx)(`text`,{x:x.x,y:x.y+x.r+16,textAnchor:`middle`,className:`cm-note`,children:`how it thinks, not a rule`}),(0,G.jsxs)($,{hash:`#/laws`,part:`sat`,label:`Invariants: ${m.laws??0}, never broken`,children:[(0,G.jsx)(`circle`,{cx:S.x,cy:S.y,r:S.r,className:`cm-sat-disc`}),(0,G.jsx)(`text`,{x:S.x,y:S.y-6,textAnchor:`middle`,className:`cm-sat-name`,children:`Invariants`}),(0,G.jsx)(`text`,{x:S.x,y:S.y+12,textAnchor:`middle`,className:`cm-sat-big`,children:m.laws??0})]}),(0,G.jsx)(`text`,{x:S.x,y:S.y+S.r+16,textAnchor:`middle`,className:`cm-note`,children:`never broken`}),(0,G.jsxs)($,{hash:`#/laws`,part:`sat`,label:`Doctrines: ${m.doctrines?.rules??0} rules chosen at build`,children:[(0,G.jsx)(`circle`,{cx:C.x,cy:C.y,r:C.r,className:`cm-sat-disc`}),(0,G.jsx)(`text`,{x:C.x,y:C.y-6,textAnchor:`middle`,className:`cm-sat-name`,children:`Doctrines`}),(0,G.jsx)(`text`,{x:C.x,y:C.y+12,textAnchor:`middle`,className:`cm-sat-big`,children:m.doctrines?.rules??0})]}),(0,G.jsx)(`text`,{x:C.x+22,y:C.y+C.r+20,className:`cm-note`,children:m.doctrines?`chosen at build · ${m.doctrines.active}/${m.doctrines.total} packs lit`:`chosen at build`}),(0,G.jsx)(`g`,{className:`cm-mini`,children:O.map(e=>(0,G.jsxs)(`g`,{children:[(0,G.jsx)(`circle`,{cx:e.x,cy:e.y,r:e.r,className:`cm-pack-disc`,style:{stroke:E(e.id)}}),(0,G.jsx)(`text`,{x:e.x,y:e.y-2,textAnchor:`middle`,className:`cm-pack-id`,children:e.id}),(0,G.jsx)(`text`,{x:e.x,y:e.y+8,textAnchor:`middle`,style:{fill:E(e.id)},children:e.on})]},e.id))}),(0,G.jsx)(`text`,{x:866,y:16,textAnchor:`middle`,className:`cm-govern-label`,children:`GOVERNS THE HARNESS`}),T.map(e=>(0,G.jsxs)($,{hash:e.hash,part:`gov`,label:`${e.label}: ${e.count}`,children:[(0,G.jsx)(`circle`,{cx:e.x,cy:e.y,r:e.r,className:`cm-gov-disc`}),(0,G.jsx)(`text`,{x:e.x,y:e.y-2,textAnchor:`middle`,className:`cm-gov-name`,children:e.label}),(0,G.jsx)(`text`,{x:e.x,y:e.y+10,textAnchor:`middle`,className:`cm-gov-num`,children:e.count})]},e.label)),(0,G.jsx)(`text`,{x:x.x,y:228,textAnchor:`middle`,className:`cm-note`,children:`tap any node to open its ledger`})]})}function te(){let e=new Date,t=e=>String(e).padStart(2,`0`);return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`}function ne({counts:t}){let n=[{label:e.skills.label,n:t.skills??0,hash:`#/skills`},{label:`Rules in force`,n:f(t),hash:`#/laws`},{label:e.agents.label,n:t.agents??0,hash:`#/agents`},{label:e.memory.label,n:t.memory??0,hash:`#/section/memory`},{label:e.notebook.label,n:t.notebook??0,hash:`#/section/notebook`},{label:e.wiki.label,n:t.wiki??0,hash:`#/section/wiki`},{label:e.config.label,n:t.config??0,hash:`#/section/config`}],r=Math.max(...n.map(e=>e.n),1);return(0,G.jsxs)(`div`,{className:`card pad-lg jr-card`,children:[(0,G.jsxs)(`div`,{className:`card-head`,children:[(0,G.jsx)(`h3`,{children:`Growth rings`}),(0,G.jsx)(`span`,{className:`tick right`,children:`by section`})]}),n.map(e=>(0,G.jsxs)(`button`,{className:`jr-ring`,onClick:()=>l(e.hash),children:[(0,G.jsx)(`span`,{className:`jr-ring-label`,children:e.label}),(0,G.jsx)(`span`,{className:`jr-ring-track`,children:(0,G.jsx)(`span`,{className:`jr-ring-fill`,style:{width:`${e.n/r*100}%`}})}),(0,G.jsx)(`span`,{className:`jr-ring-num`,children:e.n})]},e.label))]})}function re({recent:e,buildEpoch:t}){let n=e?.items||[],r=e?.skipped||[];return(0,G.jsxs)(`div`,{className:`card pad-lg jr-card`,children:[(0,G.jsxs)(`div`,{className:`card-head`,children:[(0,G.jsx)(`h3`,{children:`Freshly grown`}),(0,G.jsx)(`span`,{className:`tick right`,children:`newest`})]}),e?n.length===0?(0,G.jsx)(`p`,{className:`sub`,children:`Nothing here carries a date yet.`}):n.slice(0,5).map(e=>(0,G.jsxs)(`button`,{className:`jr-fresh`,onClick:()=>l(`#/item/${e.type}/${encodeURIComponent(e.name)}`),children:[(0,G.jsx)(`span`,{className:`jr-fresh-kind`,children:e.section}),(0,G.jsx)(`span`,{className:`jr-fresh-name`,children:e.title}),(0,G.jsx)(`span`,{className:`jr-fresh-when`,children:d(e.mtime)})]},`${e.section}:${e.name}`)):(0,G.jsx)(`p`,{className:`sub`,children:`Reading the shelves…`}),r.length>0&&(0,G.jsxs)(`p`,{className:`sub jr-skipped`,children:[`Not dated: `,r.join(`, `),` — too many files to stat on every load.`]}),(0,G.jsxs)(`p`,{className:`jr-care`,children:[t?`Last built ✓ ${d(t)}`:`Never built here`,` ·`,` `,(0,G.jsx)(`button`,{className:`jr-go`,onClick:()=>l(`#/activity`),children:`log →`})]})]})}function ie({overview:e,recent:t,onAction:n,onDirection:r,dataRev:i}){let a=e?.counts||{};return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:`head-row jr-head`,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsxs)(`div`,{className:`eyebrow`,children:[`Field journal · `,te()]}),(0,G.jsx)(`h1`,{className:`h`,children:`Today in this harness`})]}),(0,G.jsxs)(`div`,{className:`row wrap gap-10`,children:[(0,G.jsx)(`button`,{className:`btn primary`,onClick:()=>n?.(`update`),children:`Update & rebuild`}),(0,G.jsx)(`button`,{className:`btn`,onClick:()=>l(`#/doctor`),children:`Doctor`})]})]}),(0,G.jsxs)(`div`,{className:`jr-row2`,children:[(0,G.jsx)(ne,{counts:a}),(0,G.jsx)(re,{recent:t,buildEpoch:e?.build_epoch})]}),(0,G.jsxs)(`div`,{className:`card pad-lg jr-map`,children:[(0,G.jsxs)(`div`,{className:`card-head`,children:[(0,G.jsx)(`h3`,{children:`The Constitution — and the harness it governs`}),(0,G.jsx)(`button`,{className:`jr-go right`,onClick:()=>l(`#/laws`),children:`open →`})]}),(0,G.jsx)(ee,{overview:e,dataRev:i})]}),(0,G.jsxs)(`p`,{className:`sub jr-others`,children:[`Other views:`,` `,(0,G.jsx)(`button`,{className:`jr-go`,onClick:()=>r?.(`lineage`),children:`Lineage`}),` `,`·`,` `,(0,G.jsx)(`button`,{className:`jr-go`,onClick:()=>r?.(`operator`),children:`Operator`})]})]})}export{ie as default};