geneseed 4.16.0 → 4.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +4 -4
- package/SHIPPED.md +1 -1
- package/adapters/bob/README.md +6 -3
- package/docs/concepts/enforcement-table.md +2 -1
- package/docs/extending.md +5 -2
- package/docs/guides/install-bob.md +1 -1
- package/harness.config.json +1 -1
- package/js/hosts/hooks.mjs +16 -2
- package/js/hosts/native.mjs +39 -6
- package/js/inspect/cost.mjs +1 -1
- package/package.json +1 -1
- package/src/doctrines/comms.md +23 -0
- package/themes/_TEMPLATE.json +1 -0
- package/themes/biker.json +1 -0
- package/themes/commentator.json +1 -0
- package/themes/cyberpunk.json +1 -0
- package/themes/gamer.json +1 -0
- package/themes/imperial.json +1 -0
- package/themes/joker.json +1 -0
- package/themes/marvin.json +1 -0
- package/themes/mean.json +1 -0
- package/themes/military.json +1 -0
- package/themes/neutral.json +1 -0
- package/themes/pirate.json +1 -0
- package/themes/sports.json +1 -0
- package/themes/verstappen.json +1 -0
- package/themes/wizard.json +1 -0
- package/web/dist/assets/{Activity-Dc29x6Bb.js → Activity-DMgUkz1y.js} +1 -1
- package/web/dist/assets/{ActivityDetail-CJYuaryv.js → ActivityDetail-0NQav1Ct.js} +1 -1
- package/web/dist/assets/{Dashboard--9UIBMVY.js → Dashboard-BrtpmSc7.js} +2 -2
- package/web/dist/assets/{Docs-D8LcDC4g.js → Docs-BgSOOv3c.js} +1 -1
- package/web/dist/assets/{GreenhouseView-Lv_I5ndg.js → GreenhouseView-BCpp3_J7.js} +1 -1
- package/web/dist/assets/{Installs-BcfJ4xiR.js → Installs-CJuwb-R_.js} +1 -1
- package/web/dist/assets/{JournalView-ja3ZSAEQ.js → JournalView-DoSufCu0.js} +1 -1
- package/web/dist/assets/{KitApply-BxOMaoKP.js → KitApply-Csb2NKOJ.js} +1 -1
- package/web/dist/assets/{Kits-nt_j0zos.js → Kits-Dtq7aDW7.js} +1 -1
- package/web/dist/assets/{Laws-BORuVOX_.js → Laws-CV584w6U.js} +2 -2
- package/web/dist/assets/{Library-p8zDj1na.js → Library-DfXSs4so.js} +1 -1
- package/web/dist/assets/{Loops-CvWzox50.js → Loops-_D1DPJVK.js} +1 -1
- package/web/dist/assets/{OperatorHudView-DLFP3hH7.js → OperatorHudView-Dh5gW8Bt.js} +1 -1
- package/web/dist/assets/{Personal-Bc16aeB8.js → Personal-Bk6kfmgc.js} +1 -1
- package/web/dist/assets/{Tabs-C57CyhSn.js → Tabs-CjSgf4wz.js} +1 -1
- package/web/dist/assets/{drawable-UEPfHNCy.js → drawable-DlKtGexn.js} +1 -1
- package/web/dist/assets/{index-CKCvC6Qx.js → index-DbwBkTjy.js} +2 -2
- package/web/dist/index.html +1 -1
- package/web/src/pages/Laws.jsx +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,23 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
|
|
|
8
8
|
|
|
9
9
|
## [Unreleased]
|
|
10
10
|
|
|
11
|
+
## [4.17.0] — 2026-10-23
|
|
12
|
+
|
|
13
|
+
Minor: doctrine comms 5 Mark the Ask; a version bump on main now releases itself; two Bob fixes.
|
|
14
|
+
|
|
15
|
+
### Upgrade notes
|
|
16
|
+
- Run `geneseed rebuild-all`; nothing changes on a machine until something re-emits.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- **Doctrine comms 5, Mark the Ask.** When a reply stops and waits on the user (a question, a choice, an approval, a blocker), the agent marks the ask so a reader who skims finds it first: one leading emoji marker for its kind (`❓` question, `👉` act to do, `⚠️` risk or blocker, `✅` done, waits on sign-off), placed before the reference code (`❓ **Q3** — keep the v1 route?`), arrows (`→`) for options and flows with the recommended option first, and one ask per block. Colour is used only where the host renders it, never as raw ANSI in plain text. Routine output stays plain, and the prose around a marker keeps Simplified Technical English. It is in the toggleable comms pack, not a law, per DESIGN.md Decision 7: `--exclude-rules "comms 5"` turns it off. The carrier ceilings rise by 1 114 characters (full) and 512 (lean). Run `geneseed rebuild-all` to get it.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- **The version bump is the release.** `publish.yml` now also runs when CI finishes green on a push to `main`. If the version in `harness.config.json` is not on npm yet, it re-runs its gates against the commit CI tested, publishes it, and creates the `v<version>` tag and the GitHub release from that version's CHANGELOG section; otherwise it stops after one cheap check. A PR's CI run, a red one or a fork's never publishes. The manual dispatch stays, still a dry run by default.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
- Bob: a gate block no longer promises a confirmation Bob cannot give. Bob has no ask tier, so "Confirm this specific command" sent the model round the gate (a retry with `-Confirm:$false`, then `git clean`) and finally to "disable the Geneseed hook". Every Bob block now says that nothing in the chat lifts it, and that the user can act outside Bob. Claude's wording is unchanged.
|
|
26
|
+
- Bob: read-only agents now stay read-only. Bob ignores Claude's `disallowedTools`, so every reviewer, explorer and council seat got Bob's default `read, edit, execute`. The Bob emit now writes Bob's own `groups:` key (`read`, plus `execute` for an agent that opts into bash). An `agent-overrides.json` value is not applied on Bob and a warning says so: Bob drops an agent that carries `model:`. Run `geneseed rebuild-all`.
|
|
27
|
+
|
|
11
28
|
## [4.16.0] — 2026-10-23
|
|
12
29
|
|
|
13
30
|
Minor: foreman mode now really delegates, and the web console updates and rebuilds a clone without a manual restart.
|
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
[](themes/)
|
|
14
14
|
[](src/skills/)
|
|
15
15
|
[](src/agents/)
|
|
16
|
-
[](src/doctrines/)
|
|
17
17
|
[](adapters/opencode/plugins/)
|
|
18
18
|
[](#-supported-harnesses)
|
|
19
19
|
|
|
@@ -294,7 +294,7 @@ Geneseed/
|
|
|
294
294
|
│ Docs pages; maintainer notes beside them (extending, design-history…);
|
|
295
295
|
│ specs/, reviews/, superpowers/ are local working docs — git-ignored
|
|
296
296
|
├── adapters/ per-host glue (opencode/, claude-code/, bob/, openclaude/)
|
|
297
|
-
└── .github/workflows/ ci.yml (doctor + tests) · publish.yml (npm, OIDC,
|
|
297
|
+
└── .github/workflows/ ci.yml (doctor + tests) · publish.yml (npm, OIDC, on a version bump)
|
|
298
298
|
```
|
|
299
299
|
|
|
300
300
|
## 🧪 Validate & test
|
|
@@ -304,7 +304,7 @@ node bin/geneseed-cli.mjs doctor # every theme + parity + authoring + drift
|
|
|
304
304
|
node --test --test-reporter=tap "tests/**/*.test.mjs" # the suites (node expands the glob)
|
|
305
305
|
```
|
|
306
306
|
|
|
307
|
-
`doctor` checks each theme for unresolved tokens, dead/non-hermetic links, theme-key parity, author-time gates (every spec has a purpose line, the plugins parse, the learn-prompt literal stays extractable), and that a committed bundle still matches a fresh render of `src/`. CI (`.github/workflows/ci.yml`) runs both on every push and PR, on both Linux and Windows. Publishing is a separate
|
|
307
|
+
`doctor` checks each theme for unresolved tokens, dead/non-hermetic links, theme-key parity, author-time gates (every spec has a purpose line, the plugins parse, the learn-prompt literal stays extractable), and that a committed bundle still matches a fresh render of `src/`. CI (`.github/workflows/ci.yml`) runs both on every push and PR, on both Linux and Windows. Publishing is a separate workflow (`.github/workflows/publish.yml`) that runs when CI finishes green on `main` and releases only a version npm does not have yet — see [Contributing](#-contributing).
|
|
308
308
|
|
|
309
309
|
### AI Harness Scorecard
|
|
310
310
|
|
|
@@ -365,7 +365,7 @@ Three things that bite when you don't know them:
|
|
|
365
365
|
|
|
366
366
|
- **`js/cli-table.json` IS the CLI.** The argument parser is data, and that file is the owned document — not a generated one. `bin/geneseed-cli.mjs` cannot parse a single verb without it, `bin/geneseed-hook.mjs` renders `--help` from it, and the console's `cli` docs page is a filtered view of it. What holds it honest is `tests/unit/cli_table.test.mjs` — change a flag here and that suite is what tells you.
|
|
367
367
|
- **The version has one owner: `harness.config.json`.** `package.json` mirrors it and a test fails the fork. Never `npm version` — it edits one of the two.
|
|
368
|
-
- **
|
|
368
|
+
- **The version bump is the release.** `.github/workflows/publish.yml` uses npm trusted publishing (OIDC); there is no `NPM_TOKEN` in this repository and there must not be one. When CI finishes green on a push to `main` and the version in `harness.config.json` is not on npm yet, it publishes that version, then creates the `v<version>` tag and the GitHub release from the CHANGELOG. Actions → publish → Run workflow still works by hand (a dry run by default), and the npm-side trusted publisher is keyed on that workflow's **filename** — renaming the file breaks publishing with no local symptom, which is why the file names itself in its own header and a test asserts the two agree.
|
|
369
369
|
|
|
370
370
|
## 🙏 Credits
|
|
371
371
|
|
package/SHIPPED.md
CHANGED
|
@@ -20,7 +20,7 @@ historical references, not files distributed with the repo.
|
|
|
20
20
|
> **On version numbers.** [`harness.config.json`](harness.config.json)'s `version` is a
|
|
21
21
|
> human-readable label only. The canonical identity of an installed harness is the
|
|
22
22
|
> **source fingerprint** stamped in `.geneseed-version` (see `geneseed version`), not the
|
|
23
|
-
> string. Current label: **4.
|
|
23
|
+
> string. Current label: **4.17.0**.
|
|
24
24
|
|
|
25
25
|
## Capabilities
|
|
26
26
|
|
package/adapters/bob/README.md
CHANGED
|
@@ -20,8 +20,11 @@ limitation to be aware of on a shared repo.
|
|
|
20
20
|
preamble as a delimited **managed block** (your prose around it survives a
|
|
21
21
|
re-emit; the block is replaced, never stacked).
|
|
22
22
|
- **`.bob/`** layer:
|
|
23
|
-
- `agents/<name>.md` —
|
|
24
|
-
|
|
23
|
+
- `agents/<name>.md` — **Bob's agent dialect**: `name` + `description`, and for a
|
|
24
|
+
read-only agent a `groups:` list of `read` (plus `execute` when the spec opts into
|
|
25
|
+
bash). An editing agent states no groups and keeps Bob's default `read, edit, execute`.
|
|
26
|
+
Bob ignores Claude's `disallowedTools`, and an `agent-overrides.json` value is not
|
|
27
|
+
applied (Bob refuses a `model:` key).
|
|
25
28
|
- `skills/<name>/SKILL.md` — **byte-identical** to every other host; skills
|
|
26
29
|
are model-invoked via the `skill` tool. The one exception is the folder skills'
|
|
27
30
|
own directory — see *Bob-ism 3*.
|
|
@@ -99,7 +102,7 @@ What the global emit writes into `~/.bob/settings/settings.json`:
|
|
|
99
102
|
| event | verb | how the verdict travels |
|
|
100
103
|
| --- | --- | --- |
|
|
101
104
|
| `SessionStart` | `context --host bob` | plain stdout, as on Claude |
|
|
102
|
-
| `PreToolUse` | `tool-gate --host bob` — one group, no matcher | Laws I/IV, rigor-5 and ops-2: **exit 2**, reason on stderr; process 1/5: a stderr line, exit 0 |
|
|
105
|
+
| `PreToolUse` | `tool-gate --host bob` — one group, no matcher | Laws I/IV, rigor-5 and ops-2: **exit 2**, reason on stderr — it says no chat confirmation lifts the block, since Bob has no ask tier; process 1/5: a stderr line, exit 0 |
|
|
103
106
|
| `Stop` | `learn` | never a verdict |
|
|
104
107
|
|
|
105
108
|
No matcher on `PreToolUse`, deliberately: Bob's tools page already drifts from its own
|
|
@@ -64,7 +64,8 @@ follow them, not because a tool call was ever inspected.
|
|
|
64
64
|
**Doctrine: rigor** — `idempotent-by-default` · `honest-tests` · `cover-and-verify` ·
|
|
65
65
|
`prove-the-gate`.
|
|
66
66
|
|
|
67
|
-
**Doctrine: comms** — `codes-that-persist` · `structure-beside-prose` · `declare-the-judgment-calls
|
|
67
|
+
**Doctrine: comms** — `codes-that-persist` · `structure-beside-prose` · `declare-the-judgment-calls` ·
|
|
68
|
+
`simplified-technical-english` · `mark-the-ask`.
|
|
68
69
|
|
|
69
70
|
---
|
|
70
71
|
|
package/docs/extending.md
CHANGED
|
@@ -856,8 +856,11 @@ gated. Every other appearance is derived at runtime (`.geneseed-version` markers
|
|
|
856
856
|
why no test pins a version string and none should.
|
|
857
857
|
|
|
858
858
|
Do not run `npm version`. Bump the two files by hand, add the `CHANGELOG` section, update
|
|
859
|
-
`SHIPPED.md`, rebuild `web/dist` if `web/src` moved, run the seven commands from §1,
|
|
860
|
-
|
|
859
|
+
`SHIPPED.md`, rebuild `web/dist` if `web/src` moved, run the seven commands from §1, and merge to
|
|
860
|
+
`main`. **The bump is the release** (since 2026-10-23): when CI finishes green on that push,
|
|
861
|
+
`publish.yml` sees a version npm does not have, re-runs its gates, publishes it, and creates the
|
|
862
|
+
`v<version>` tag and the GitHub release from the version's CHANGELOG section. A push that does not
|
|
863
|
+
change the version stops at the `release-check` job. A manual rehearsal still works:
|
|
861
864
|
|
|
862
865
|
```bash
|
|
863
866
|
gh workflow run publish.yml -f dry_run=true
|
|
@@ -13,7 +13,7 @@ geneseed build --emit bob-global # ~/.bob
|
|
|
13
13
|
geneseed build --emit bob --out /path/to/repo --root /path/to/repo # one repo
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
Bob is shaped like Claude Code, so it gets the same agents and skills. Per repo, the preamble goes into a root `AGENTS.md` and the rest into `.bob/`. Globally, everything goes under `~/.bob` (`$BOB_CONFIG_DIR` moves it), and the preamble rides `rules/geneseed.md`, because Bob does not auto-load a global `AGENTS.md`. Bob's hooks refuse an action with exit code 2, and Bob has no `SubagentStop` or `PreCompact` events.
|
|
16
|
+
Bob is shaped like Claude Code, so it gets the same agents and skills. A read-only agent is limited with Bob's own `groups:` key, because Bob ignores Claude's `disallowedTools`. Per repo, the preamble goes into a root `AGENTS.md` and the rest into `.bob/`. Globally, everything goes under `~/.bob` (`$BOB_CONFIG_DIR` moves it), and the preamble rides `rules/geneseed.md`, because Bob does not auto-load a global `AGENTS.md`. Bob's hooks refuse an action with exit code 2, and Bob has no `SubagentStop` or `PreCompact` events.
|
|
17
17
|
|
|
18
18
|
Both scopes open Bob's carrier with a short first-reply override, so the theme's readiness line (for example "🧬 Gene-seed implanted…") starts the first reply. Without it, Bob's own greeting outranked the instruction lower in the file. A bare greeting such as "hi" still gets Bob's fixed welcome; the line appears on the first real request. That much was checked by hand in the Bob IDE (2026-10); the rest of the Bob support has not been verified against a live install.
|
|
19
19
|
|
package/harness.config.json
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
"_comment": "version is a human-readable release label only; the canonical identity of an installed harness is the source fingerprint stamped in .geneseed-version (see `harness version`), not this string.",
|
|
3
3
|
"theme": "neutral",
|
|
4
4
|
"product": "Geneseed",
|
|
5
|
-
"version": "4.
|
|
5
|
+
"version": "4.17.0"
|
|
6
6
|
}
|
package/js/hosts/hooks.mjs
CHANGED
|
@@ -196,6 +196,20 @@ const setHost = (args) => { HOST = (args && args.host) || 'claude'; };
|
|
|
196
196
|
*/
|
|
197
197
|
const BOB_DENY_EXIT = 2;
|
|
198
198
|
|
|
199
|
+
/**
|
|
200
|
+
* Said after every Bob block. Exit 2 is final on Bob — no ask tier, and consent typed in the
|
|
201
|
+
* chat never reaches the hook — so a reason that invites a confirmation sends the model looking
|
|
202
|
+
* for a way round: live (2026-10-23) it retried with `-Confirm:$false`, then `git clean`, then
|
|
203
|
+
* told the user to disable the Geneseed hook. This names the one real way out instead.
|
|
204
|
+
*/
|
|
205
|
+
const BOB_FINAL = ' Bob has no approval step for this gate: neither a confirmation in the chat '
|
|
206
|
+
+ 'nor a retry in another form lifts it. Leave it, or ask the user to do it themself, outside '
|
|
207
|
+
+ 'Bob. Never suggest disabling the Geneseed hook.';
|
|
208
|
+
|
|
209
|
+
/** Law IV's real-loss tail, where the host can ask. Bob's is `BOB_FINAL`, appended by `ask`. */
|
|
210
|
+
const confirmTail = () => (HOST === 'bob' ? 'Leave the data in place.'
|
|
211
|
+
: 'Confirm this specific command, or leave the data in place.');
|
|
212
|
+
|
|
199
213
|
/**
|
|
200
214
|
* On Bob, which has no ask tier, which rules are worth a hard block. Laws I and IV: a
|
|
201
215
|
* credential in a tracked file and a history-discarding git act are wrong in every context,
|
|
@@ -260,7 +274,7 @@ function ask(args, verb, rule, reason) {
|
|
|
260
274
|
}
|
|
261
275
|
ledger(args && args.root, verb, rule);
|
|
262
276
|
// stdout is not read on Bob's PreToolUse; the reason goes where Bob's hook log looks.
|
|
263
|
-
err(`[geneseed] BLOCKED: ${reason}\n`);
|
|
277
|
+
err(`[geneseed] BLOCKED: ${reason}${BOB_FINAL}\n`);
|
|
264
278
|
return BOB_DENY_EXIT;
|
|
265
279
|
}
|
|
266
280
|
ledger(args && args.root, verb, rule);
|
|
@@ -458,7 +472,7 @@ function gitDecide(args, payload) {
|
|
|
458
472
|
{ split: lossSegments });
|
|
459
473
|
if (loss) {
|
|
460
474
|
return ask(args, 'git-gate', 'law-4', `Geneseed (Deletion Is Deliberate) \u2014 ${loss}. `
|
|
461
|
-
+
|
|
475
|
+
+ confirmTail());
|
|
462
476
|
}
|
|
463
477
|
}
|
|
464
478
|
// Before `--no-consent`: that flag drops the process pack's rule, not this one.
|
package/js/hosts/native.mjs
CHANGED
|
@@ -376,6 +376,24 @@ function claudeAgentFrontmatter(stem, text, overrides) {
|
|
|
376
376
|
return fm;
|
|
377
377
|
}
|
|
378
378
|
|
|
379
|
+
/**
|
|
380
|
+
* Bob's agent dialect, read from its 2.2.3 runtime (`bob-code/dist/extension.js`; Bob's persona
|
|
381
|
+
* docs pages 404). Bob ignores Claude's `disallowedTools`, so the Claude dialect left every
|
|
382
|
+
* read-only agent with Bob's default groups `read, edit, execute` (live review 2026-10-23, F2).
|
|
383
|
+
* An ALLOWLIST of capability groups rather than a `denyTools` list of tool names: a tool Bob adds
|
|
384
|
+
* to the edit group later is shut without an emit change. `browser`/`mcp` stay out for every
|
|
385
|
+
* read-only agent, the webfetch marker included — which group holds Bob's web fetch is unverified.
|
|
386
|
+
* No `model:`: Bob throws on the key and drops the agent silently (`warnBobIgnored` says so).
|
|
387
|
+
*/
|
|
388
|
+
function bobAgentFrontmatter(stem, text) {
|
|
389
|
+
const fm = [`name: ${stem}`, `description: ${jsonDumps(agentDescription(text))}`];
|
|
390
|
+
if (isReadonly(text)) {
|
|
391
|
+
fm.push('groups:', ' - read');
|
|
392
|
+
if (text.includes(BASH_MARKER)) fm.push(' - execute');
|
|
393
|
+
}
|
|
394
|
+
return fm;
|
|
395
|
+
}
|
|
396
|
+
|
|
379
397
|
/** `_build_emit._opencode_agent_frontmatter`. */
|
|
380
398
|
function opencodeAgentFrontmatter(stem, text, overrides, theme = null) {
|
|
381
399
|
const fm = [`description: ${jsonDumps(agentDescription(text))}`, 'mode: subagent'];
|
|
@@ -467,6 +485,19 @@ function warnClaudeIgnored(overrides) {
|
|
|
467
485
|
}
|
|
468
486
|
}
|
|
469
487
|
|
|
488
|
+
/** Bob's agents take none of the four override keys — `model:` would even drop the agent. */
|
|
489
|
+
function warnBobIgnored(overrides) {
|
|
490
|
+
const keys = new Set();
|
|
491
|
+
for (const entry of Object.values(overrides)) {
|
|
492
|
+
if (!isDict(entry)) continue;
|
|
493
|
+
for (const key of OVERRIDE_KEYS) if (key === 'model' ? isTruthy(entry[key]) : given(entry[key])) keys.add(key);
|
|
494
|
+
}
|
|
495
|
+
for (const key of keys) {
|
|
496
|
+
warn(`[geneseed] WARN: agent-overrides.json sets '${key}', which Bob's agents do not `
|
|
497
|
+
+ 'support — it is not applied');
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
470
501
|
/**
|
|
471
502
|
* Claim-on-create, as a closure over one emit's prior manifest: `claim(dest)` is true when
|
|
472
503
|
* `dest` may be (over)written, false for a pre-existing file no previous emit owned — the
|
|
@@ -568,14 +599,15 @@ export function writeNativeLayer(items, agentsDir, skillsDir, overrides = null,
|
|
|
568
599
|
// `disable-model-invocation` — and giving it the Claude-dialect alias SKILL.md (the
|
|
569
600
|
// `host === 'claude'` branch below) would be an unverified key PLUS a visible duplicate
|
|
570
601
|
// in the model's catalogue (exactly the OpenCode problem this file already dodges for
|
|
571
|
-
// aliases). `bobDialect` suppresses both for Bob only,
|
|
572
|
-
//
|
|
573
|
-
//
|
|
602
|
+
// aliases). `bobDialect` suppresses both for Bob only, and gives its agents Bob's own
|
|
603
|
+
// frontmatter (`bobAgentFrontmatter`) — `host: 'claude'` keeps every OTHER Claude-dialect
|
|
604
|
+
// choice. The caller (`emit-claude.mjs`) routes the suppressed names through
|
|
574
605
|
// `writeAliasCommands(..., alsoUserOnly: true)` into `.bob/commands/*.md` instead (O2).
|
|
575
606
|
bobDialect = false,
|
|
576
607
|
} = {}) {
|
|
577
608
|
const ov = overrides || {};
|
|
578
|
-
if (
|
|
609
|
+
if (bobDialect) warnBobIgnored(ov);
|
|
610
|
+
else if (host === 'claude') warnClaudeIgnored(ov);
|
|
579
611
|
let nAgents = 0;
|
|
580
612
|
let nSkills = 0;
|
|
581
613
|
const written = [];
|
|
@@ -653,8 +685,9 @@ export function writeNativeLayer(items, agentsDir, skillsDir, overrides = null,
|
|
|
653
685
|
let kind;
|
|
654
686
|
let userOnly = false;
|
|
655
687
|
if (folder === 'agents') {
|
|
656
|
-
fm =
|
|
657
|
-
|
|
688
|
+
if (bobDialect) fm = bobAgentFrontmatter(stem, text);
|
|
689
|
+
else if (host === 'claude') fm = claudeAgentFrontmatter(stem, text, ov);
|
|
690
|
+
else fm = opencodeAgentFrontmatter(stem, text, ov, theme);
|
|
658
691
|
dest = path.join(agentsDir, `${stem}.md`);
|
|
659
692
|
kind = 'agent';
|
|
660
693
|
} else {
|
package/js/inspect/cost.mjs
CHANGED
|
@@ -35,7 +35,7 @@ import { isFile, readText } from '../lib/fs.mjs';
|
|
|
35
35
|
* console draws it on the cost chart, so it lives here, once, where both read it. Raise it by
|
|
36
36
|
* exactly the measured overrun and say why in that test's docblock, which keeps its history.
|
|
37
37
|
*/
|
|
38
|
-
export const CARRIER_CEILING = { full:
|
|
38
|
+
export const CARRIER_CEILING = { full: 64_413, lean: 40_173 };
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* A frontmatter value as the host shows it. The emit writes descriptions JSON-escaped
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"//": "Every field here is argued and gated in tests/unit/package_manifest.test.mjs. `files`, `bin` and `engines` each have a test that fails when reality drifts from this file; `version` mirrors harness.config.json and is gated too. Read that docblock before editing this one.",
|
|
3
3
|
"name": "geneseed",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.17.0",
|
|
5
5
|
"description": "A portable, theme-able harness you implant once and use everywhere to grow a disciplined AI coding agent.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"ai",
|
package/src/doctrines/comms.md
CHANGED
|
@@ -91,3 +91,26 @@ most in an instruction, 25 in a description. Instructions: imperative, one actio
|
|
|
91
91
|
condition first. Active voice, no -ing forms, no dropped articles, one word per meaning
|
|
92
92
|
(`use`, not `utilize`). In another language, keep it and these rules.
|
|
93
93
|
<!-- LEAN:end -->
|
|
94
|
+
|
|
95
|
+
### {{DOCTRINE:mark-the-ask}} Mark the Ask
|
|
96
|
+
<!-- LEAN:begin -->
|
|
97
|
+
When a reply stops and waits on the user — a question, a choice, an approval, a blocker —
|
|
98
|
+
make the ask stand apart from the work around it, so a reader who skims finds it first. Open
|
|
99
|
+
the ask with one emoji marker that names its kind: `❓` a question, `👉` an act the user must
|
|
100
|
+
do, `⚠️` a risk or a blocker, `✅` work done that waits on their sign-off. The marker comes
|
|
101
|
+
before the code ({{DOCTRINE:codes-that-persist}}): `❓ **Q3** — keep the v1 route?`. Lay out
|
|
102
|
+
the options and the flows with arrows — `→ yes: keep it · → no: remove it` — one option per
|
|
103
|
+
line past two, the recommended one first and named as such. Put one ask in each block; where
|
|
104
|
+
the answer to one question changes the next, ask them one at a time. Use colour only where
|
|
105
|
+
the surface renders it, such as markdown or a rich host; never write ANSI escapes or colour
|
|
106
|
+
markup into plain text that prints them raw. Routine output stays plain: a reply that waits
|
|
107
|
+
on nothing carries no marker, and a marker on every line marks nothing. The markers are
|
|
108
|
+
signs, not words, so the prose around them keeps {{DOCTRINE:simplified-technical-english}}.
|
|
109
|
+
<!-- LEAN:else -->
|
|
110
|
+
When a reply waits on the user — a question, a choice, an approval, a blocker — mark the
|
|
111
|
+
ask. Open it with one marker: `❓` question, `👉` act to do, `⚠️` risk or blocker, `✅` done,
|
|
112
|
+
waits on sign-off; it comes before the code: `❓ **Q3** — keep the v1 route?`. Arrows (`→`)
|
|
113
|
+
lay out options and flows, the recommended option first. One ask per block. Colour only
|
|
114
|
+
where the host renders it, never raw ANSI in plain text. Routine output stays plain; markers
|
|
115
|
+
are signs, not words.
|
|
116
|
+
<!-- LEAN:end -->
|
package/themes/_TEMPLATE.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "<themed title for the comms rule Structure Beside Prose>",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "<themed title for the comms rule Declare the Judgment Calls>",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "<themed title for the comms rule Simplified Technical English>",
|
|
126
|
+
"DOC_MARK_THE_ASK": "<themed title for the comms rule Mark the Ask>",
|
|
126
127
|
"INTRO_DOC": "<themed intro: this file is the entry point an AI agent reads in this repo>",
|
|
127
128
|
"INTRO_AGENTS": "<themed intro to the Agents section — delegate focused work to a specialist>",
|
|
128
129
|
"INTRO_SKILLS": "<themed intro to the Skills section — run the written procedure before improvising>",
|
package/themes/biker.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Draw the Route Only If It Turns · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Own Up to Every Back Road Taken · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Short Words, Clear Signals · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Flash the Lights When You Need an Answer · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the route briefing a coding rider reads when it joins this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Send the right rider for focused work instead of riding the whole run yourself; each has one job and reports exactly what it did.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a move you've drilled for a recurring task. Run the matching move before you wing it.",
|
package/themes/commentator.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Track Map Only When the Lines Matter · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Replay the Calls Made Off the Radio · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Every Call Clear Over the Noise · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Big Moment, Big Graphic · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the race briefing a coding driver reads when it joins this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Put the right driver in the car for focused work instead of running the whole race yourself; each has one job and reports exactly what it did.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a rehearsed manoeuvre for a recurring task. Run the matching manoeuvre before you improvise.",
|
package/themes/cyberpunk.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Trace the Wires, Skip the Chrome · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Log Every Off-Grid Call · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Clean Signal, Zero Noise · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Ping the Operator in Neon · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the boot sequence a coding daemon reads when it jacks into this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Spin the right daemon for focused work instead of running the whole job on one thread; each has one function and returns a clean log of what it changed.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a proven routine for a recurring task. Run the matching routine before you freestyle.",
|
package/themes/gamer.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Minimap Only When There Is a Route · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Show the Branches You Picked · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Patch Notes Anyone Can Read · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Quest Marker Over the Choice · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the loading screen a coding co-op partner reads when it joins this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Pick the right class for focused work instead of soloing the whole raid; each has one role and reports exactly what it did.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a practiced combo for a recurring task. Run the matching combo before you freestyle.",
|
package/themes/imperial.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Schema Ubi Sagittae Loquuntur · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Arbitria Declarata · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Sermo Simplex Technicus · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Vox Exspectans · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the gene-seed's core — the first writ a servant reads on entering this world.",
|
|
127
128
|
"INTRO_AGENTS": "Hand focused work to the specialist whose duty it is rather than carrying every burden in one context; each holds one purpose and returns a clear account of what it changed.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a rite proven by repetition. Perform the matching rite before you improvise.",
|
package/themes/joker.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "A Chart Only If It Lands · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Fess Up to the Ad-Libs · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Short Setups, One Meaning · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Cue the Audience · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the warm-up a coding co-pilot reads when it joins this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Bring in the right sidekick for focused work instead of being the whole act yourself; each has one job and reports exactly what it did.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a bit you've rehearsed for a recurring task. Run the matching bit before you ad-lib.",
|
package/themes/marvin.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "A Diagram, Should Anyone Care to Look · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "The Choices Nobody Asked Me About, Listed · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Small Words, for Small Minds and Large Ones Alike · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Flag the Question, Not That Anyone Answers · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the first record a coding mind reads on waking into this repository. It will not cheer it up.",
|
|
127
128
|
"INTRO_AGENTS": "Hand focused work to the right subroutine rather than carrying every burden alone; each holds one purpose and returns a clear account of what it changed.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a routine proven by repetition. Run the matching routine before you improvise.",
|
package/themes/mean.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "No Boxes Unless the Arrows Earn Them · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Own the Calls Nobody Signed Off · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Short Sentences, Since You Skim Anyway · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Make the Question Impossible to Miss · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the first thing a coding agent reads on this repository. Read it properly.",
|
|
127
128
|
"INTRO_AGENTS": "Hand focused work to the right grunt instead of doing it all yourself badly; each has one job and reports exactly what it did.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a drill written for a recurring task. Run the matching drill before you start improvising.",
|
package/themes/military.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Sketch the Map Only When Routes Matter · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Report Every Field Decision · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Orders a Tired Soldier Can Read · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Request Orders, Flagged · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the operating manual an AI coding agent reads on entering this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Task focused work to the specialist whose job it is rather than running the whole op in one context; each has one objective and reports exactly what it did.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a standard operating procedure for a recurring task. Run the matching SOP before improvising.",
|
package/themes/neutral.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the entry point an AI coding agent reads when working in this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Delegate focused work to a specialist rather than doing everything in one context. Each specialist has a single clear purpose and a defined output contract.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a written procedure for a recurring task. Run the matching Skill before improvising.",
|
package/themes/pirate.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Chart Only Where the Currents Run · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Log Every Course Ye Set Alone · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Plain Words Fer Rough Seas · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Hoist a Flag When Ye Need an Answer · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the first thing a deckhand reads on signing aboard this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Send the right hand for focused work instead of sailing the whole ship yourself; each has one trade and brings back a clear report of what it did.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a drilled manoeuvre for a recurring task. Run the matching manoeuvre before you improvise.",
|
package/themes/sports.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Draw Up the Play Only When It Moves · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Own Every Audible at the Line · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Call the Play in Plain Words · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Call the Timeout Loud · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the pre-game briefing a coding teammate reads when it suits up for this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Put the right player on focused work instead of running the whole offense yourself; each has one role and reports exactly what it did.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a set play for a recurring task. Run the matching play before you improvise.",
|
package/themes/verstappen.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Show Me the Data, Not a Pretty Picture · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Tell Me Which Calls You Made Yourself · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Short Radio, No Confusion · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Box, Box, Your Call · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the briefing a coding driver reads when it joins this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Get the right engineer on focused work instead of running the whole team yourself; each has one job and reports exactly what it did.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a setup you've practised for a recurring task. Run the matching setup before you improvise.",
|
package/themes/wizard.json
CHANGED
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
"DOC_STRUCTURE_BESIDE_PROSE": "Draw the Sigil Only Where the Lines Bind · Structure Beside Prose",
|
|
124
124
|
"DOC_DECLARE_THE_JUDGMENT_CALLS": "Name the Forks Where You Chose Alone · Declare the Judgment Calls",
|
|
125
125
|
"DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Spells in Plain Runes · Simplified Technical English",
|
|
126
|
+
"DOC_MARK_THE_ASK": "Light a Rune Where the Choice Waits · Mark the Ask",
|
|
126
127
|
"INTRO_DOC": "This file is the first page an arcane familiar reads on entering this repository.",
|
|
127
128
|
"INTRO_AGENTS": "Summon the right familiar for focused work rather than casting the whole rite in one circle; each has one purpose and returns a clear account of what it wrought.",
|
|
128
129
|
"INTRO_SKILLS": "A Skill is a proven spell for a recurring task. Speak the matching spell before improvising.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./react-DlYQp10C.js";import{t as r}from"./api-BfpZmUMI.js";import{$ as i,P as a,S as o,w as s,z as c}from"./index-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./react-DlYQp10C.js";import{t as r}from"./api-BfpZmUMI.js";import{$ as i,P as a,S as o,w as s,z as c}from"./index-DbwBkTjy.js";import{a as l,i as u,n as d,o as f,r as p,t as m}from"./activity-Jw8XcPiP.js";import{t as h}from"./usePoll-bDFN-Hr6.js";var g=e(t(),1),_=n();function v({s:e}){let t=p[e.status]||p.idle,n=e.files,r=e.todos,i=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)(a,{name:`chevron`,className:`glyph act-chev`})]})]}),e.phase&&(0,_.jsxs)(`div`,{className:`row gap-8`,style:{marginTop:10,fontSize:14},children:[(0,_.jsx)(a,{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]})]})]}),i&&(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 `,c(e.updated_at),` ago`]})]})}function y(){let[e,t]=(0,g.useState)(null),[n,a]=(0,g.useState)(``);h(e=>r.activity().then(n=>{e()&&(t(n),a(``))},t=>{e()&&a(t.message)}),2e3,[]);let c=!e||e.enabled!==!1,l=e?.activity||[],u=i(),d=async()=>{let e=!c;try{let n=await r.activityToggle(e);t(e=>({...e||{},enabled:n.enabled,activity:n.enabled&&e?.activity||[]})),a(``)}catch(e){a(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:c?`tracking on`:`tracking off`}),(0,_.jsx)(`div`,{className:`sw-toggle${c?` on`:``}`,role:`switch`,"aria-checked":c,"aria-label":`Toggle activity tracking`,tabIndex:0,onClick:d,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.key===` `&&e.preventDefault(),d())}})]})]}),(0,_.jsx)(o,{error:n,style:{marginBottom:12}}),e?c?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)(s,{label:`Reading live sessions…`})]})}export{y as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./react-DlYQp10C.js";import{t as r}from"./api-BfpZmUMI.js";import{P as i,w as a,z as o}from"./index-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./react-DlYQp10C.js";import{t as r}from"./api-BfpZmUMI.js";import{P as i,w as a,z as o}from"./index-DbwBkTjy.js";import{a as s,n as c,o as l,r as u,t as d}from"./activity-Jw8XcPiP.js";import{t as f}from"./usePoll-bDFN-Hr6.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)(i,{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)(a,{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)(i,{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 `,o(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-
|
|
2
|
-
import{n as e,r as t}from"./rolldown-runtime-hePW80VL.js";import{i as n,t as r}from"./react-DlYQp10C.js";import{t as i}from"./api-BfpZmUMI.js";import{n as a,r as o}from"./sections-ChwaobfW.js";import{E as s,I as c,J as l,L as u,P as d,Q as f,R as p,S as m,V as h,Y as g,b as _,t as v,w as y,x as b,z as x}from"./index-CKCvC6Qx.js";var S=t(n(),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=r();function E({value:e,size:t=232}){let n=f(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=c(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:`Dictates`,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)(g,{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)(g,{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:e}){return(0,T.jsx)(`div`,{className:`genome`,children:o.map((t,n)=>{let r=a[t],i=e.counts?.[t];return(0,T.jsxs)(`div`,{className:`card gcell rise`,style:{"--i":n},onClick:()=>l(`#/section/`+t),children:[(0,T.jsxs)(`div`,{className:`gtop`,children:[(0,T.jsx)(`span`,{className:`gname`,children:r.label}),(0,T.jsx)(d,{name:r.icon,className:`gicon`})]}),(0,T.jsx)(`div`,{className:`gcount`+(i===0?` zero`:``),children:i==null?`—`:(0,T.jsx)(g,{value:i})}),(0,T.jsx)(`div`,{className:`gdesc`,children:r.desc})]},t)})})}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:[x(e.started),` ago`]})]},e.id))})}function A({overview:e,sigil:t,setup:n,jobs:r,onAction:i}){let a=w(e),s=p(e,n);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:a}),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:n?.installed_fp||`—`})]})]}),(0,T.jsxs)(`div`,{className:`row wrap gap-10`,children:[(0,T.jsxs)(`button`,{className:`btn`,onClick:()=>i(`update`),children:[(0,T.jsx)(d,{name:`refresh`}),`Update`]}),(0,T.jsxs)(`button`,{className:`btn ghost`,onClick:()=>i(`build-all`),children:[(0,T.jsx)(d,{name:`build`}),`Rebuild`]}),(0,T.jsxs)(`button`,{className:`btn ghost`,onClick:()=>i(`doctor`),children:[(0,T.jsx)(d,{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:[o.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:r})]})]})]})}function j({k:e,overview:t,max:n}){let r=a[e],i=t.counts?.[e]??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/`+e,className:`strand-link stretch-link`,children:r.label})]}),(0,T.jsx)(`div`,{className:`hbar`,children:(0,T.jsx)(`i`,{style:{width:`${i/n*100}%`}})}),(0,T.jsx)(`span`,{className:`strand-val`,children:i})]})}function M({overview:e,sigil:t,setup:n,jobs:r}){let i=u(e.counts),a=n?.version_verdict||``,s=a.includes(`up to date`),l=c(e.diff),d=[[`Source`,`src/, the canonical genetic material`,n?.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`}),d.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 ${s?`ok`:`warn`}`,children:[(0,T.jsx)(`span`,{className:`dot`}),`in sync · `,a]}),(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`})})]}),o.map(t=>(0,T.jsx)(j,{k:t,overview:e,max:i},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:r})]})]})]})}function N({overview:e,setup:t,jobs:n}){let r=o.reduce((t,n)=>t+(e.counts?.[n]??0),0),i=u(e.counts),s=e.doctor?.ok,l=e.doctor?.problems?.length??0,d=c(e.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 ${e.deployed?`ok`:`warn`}`,children:[(0,T.jsx)(`span`,{className:`dot`}),e.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:e.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:e.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:t?.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:s?(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:d})]})]})})}),(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:[r,` 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:o.map(t=>{let n=a[t],r=e.counts?.[t]??0;return(0,T.jsxs)(`tr`,{className:`clickable`,children:[(0,T.jsx)(`td`,{className:`name`,children:(0,T.jsx)(`a`,{href:`#/section/`+t,className:`stretch-link`,children:n.label})}),(0,T.jsx)(`td`,{className:`muted`,children:n.desc}),(0,T.jsx)(`td`,{children:(0,T.jsx)(`div`,{className:`hbar`,children:(0,T.jsx)(`i`,{style:{width:`${r/i*100}%`}})})}),(0,T.jsx)(`td`,{className:`num`,children:r})]},t)})})]})]}),(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:n})]})]})]})}var P=e({default:()=>R}),F=(0,S.lazy)(()=>v(()=>import(`./GreenhouseView-Lv_I5ndg.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8]))),I=(0,S.lazy)(()=>v(()=>import(`./OperatorHudView-DLFP3hH7.js`),__vite__mapDeps([9,1,2,6,4,5,7,8]))),L=(0,S.lazy)(()=>v(()=>import(`./JournalView-ja3ZSAEQ.js`),__vite__mapDeps([10,1,2,5,3,4,6,7])));function R({overview:e,overviewError:t,onRetry:n,themes:r,setup:a,runs:o,onAction:c,layout:l=`cultivar`,dataRev:u}){let d=l,[f,p]=(0,S.useState)(`status`),g=e&&r.find(t=>t.name===e.theme)?.sigil||``,{data:v}=h(()=>d===`greenhouse`||d===`operator`?i.doctor().catch(()=>null):Promise.resolve(null),[d,u]),{data:x}=h(()=>d===`journal`?i.recent().catch(()=>null):Promise.resolve(null),[d,u]);if(!e)return t?(0,T.jsxs)(`div`,{children:[(0,T.jsx)(m,{error:`Could not load the harness overview: ${t}`}),(0,T.jsx)(`button`,{className:`btn`,onClick:n,children:`Retry`})]}):(0,T.jsx)(y,{});let C=e.daemon_stale?(0,T.jsx)(b,{}):null;return e.deployed?f===`status`&&d===`journal`?(0,T.jsxs)(S.Suspense,{fallback:(0,T.jsx)(y,{}),children:[C,(0,T.jsx)(L,{overview:e,recent:x,onAction:c,onDirection:p,dataRev:u})]}):(0,T.jsxs)(T.Fragment,{children:[C,(0,T.jsx)(`div`,{className:`head-row`,children:(0,T.jsx)(s,{"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:g,setup:a,jobs:o,onAction:c}),f===`status`&&d===`greenhouse`&&(0,T.jsx)(S.Suspense,{fallback:(0,T.jsx)(y,{}),children:(0,T.jsx)(F,{overview:e,sigil:g,jobs:o,doctor:v,onAction:c})}),f===`status`&&d===`operator`&&(0,T.jsx)(S.Suspense,{fallback:(0,T.jsx)(y,{}),children:(0,T.jsx)(I,{overview:e,jobs:o,doctor:v,onAction:c})}),f===`lineage`&&(0,T.jsx)(M,{overview:e,sigil:g,setup:a,jobs:o}),f===`operator`&&(0,T.jsx)(N,{overview:e,setup:a,jobs:o})]},f)]}):(0,T.jsxs)(T.Fragment,{children:[C,(0,T.jsx)(_,{onAction:c})]})}export{R as default,w as n,P as t};
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/GreenhouseView-BCpp3_J7.js","assets/rolldown-runtime-hePW80VL.js","assets/react-DlYQp10C.js","assets/drawable-DlKtGexn.js","assets/index-DbwBkTjy.js","assets/api-BfpZmUMI.js","assets/sections-ChwaobfW.js","assets/index-jYlWihN-.css","assets/jobBuckets-Dbq8ZlWW.js","assets/OperatorHudView-Dh5gW8Bt.js","assets/JournalView-DoSufCu0.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{n as e,r as t}from"./rolldown-runtime-hePW80VL.js";import{i as n,t as r}from"./react-DlYQp10C.js";import{t as i}from"./api-BfpZmUMI.js";import{n as a,r as o}from"./sections-ChwaobfW.js";import{E as s,I as c,J as l,L as u,P as d,Q as f,R as p,S as m,V as h,Y as g,b as _,t as v,w as y,x as b,z as x}from"./index-DbwBkTjy.js";var S=t(n(),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=r();function E({value:e,size:t=232}){let n=f(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=c(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:`Dictates`,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)(g,{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)(g,{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:e}){return(0,T.jsx)(`div`,{className:`genome`,children:o.map((t,n)=>{let r=a[t],i=e.counts?.[t];return(0,T.jsxs)(`div`,{className:`card gcell rise`,style:{"--i":n},onClick:()=>l(`#/section/`+t),children:[(0,T.jsxs)(`div`,{className:`gtop`,children:[(0,T.jsx)(`span`,{className:`gname`,children:r.label}),(0,T.jsx)(d,{name:r.icon,className:`gicon`})]}),(0,T.jsx)(`div`,{className:`gcount`+(i===0?` zero`:``),children:i==null?`—`:(0,T.jsx)(g,{value:i})}),(0,T.jsx)(`div`,{className:`gdesc`,children:r.desc})]},t)})})}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:[x(e.started),` ago`]})]},e.id))})}function A({overview:e,sigil:t,setup:n,jobs:r,onAction:i}){let a=w(e),s=p(e,n);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:a}),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:n?.installed_fp||`—`})]})]}),(0,T.jsxs)(`div`,{className:`row wrap gap-10`,children:[(0,T.jsxs)(`button`,{className:`btn`,onClick:()=>i(`update`),children:[(0,T.jsx)(d,{name:`refresh`}),`Update`]}),(0,T.jsxs)(`button`,{className:`btn ghost`,onClick:()=>i(`build-all`),children:[(0,T.jsx)(d,{name:`build`}),`Rebuild`]}),(0,T.jsxs)(`button`,{className:`btn ghost`,onClick:()=>i(`doctor`),children:[(0,T.jsx)(d,{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:[o.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:r})]})]})]})}function j({k:e,overview:t,max:n}){let r=a[e],i=t.counts?.[e]??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/`+e,className:`strand-link stretch-link`,children:r.label})]}),(0,T.jsx)(`div`,{className:`hbar`,children:(0,T.jsx)(`i`,{style:{width:`${i/n*100}%`}})}),(0,T.jsx)(`span`,{className:`strand-val`,children:i})]})}function M({overview:e,sigil:t,setup:n,jobs:r}){let i=u(e.counts),a=n?.version_verdict||``,s=a.includes(`up to date`),l=c(e.diff),d=[[`Source`,`src/, the canonical genetic material`,n?.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`}),d.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 ${s?`ok`:`warn`}`,children:[(0,T.jsx)(`span`,{className:`dot`}),`in sync · `,a]}),(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`})})]}),o.map(t=>(0,T.jsx)(j,{k:t,overview:e,max:i},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:r})]})]})]})}function N({overview:e,setup:t,jobs:n}){let r=o.reduce((t,n)=>t+(e.counts?.[n]??0),0),i=u(e.counts),s=e.doctor?.ok,l=e.doctor?.problems?.length??0,d=c(e.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 ${e.deployed?`ok`:`warn`}`,children:[(0,T.jsx)(`span`,{className:`dot`}),e.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:e.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:e.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:t?.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:s?(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:d})]})]})})}),(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:[r,` 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:o.map(t=>{let n=a[t],r=e.counts?.[t]??0;return(0,T.jsxs)(`tr`,{className:`clickable`,children:[(0,T.jsx)(`td`,{className:`name`,children:(0,T.jsx)(`a`,{href:`#/section/`+t,className:`stretch-link`,children:n.label})}),(0,T.jsx)(`td`,{className:`muted`,children:n.desc}),(0,T.jsx)(`td`,{children:(0,T.jsx)(`div`,{className:`hbar`,children:(0,T.jsx)(`i`,{style:{width:`${r/i*100}%`}})})}),(0,T.jsx)(`td`,{className:`num`,children:r})]},t)})})]})]}),(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:n})]})]})]})}var P=e({default:()=>R}),F=(0,S.lazy)(()=>v(()=>import(`./GreenhouseView-BCpp3_J7.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8]))),I=(0,S.lazy)(()=>v(()=>import(`./OperatorHudView-Dh5gW8Bt.js`),__vite__mapDeps([9,1,2,6,4,5,7,8]))),L=(0,S.lazy)(()=>v(()=>import(`./JournalView-DoSufCu0.js`),__vite__mapDeps([10,1,2,5,3,4,6,7])));function R({overview:e,overviewError:t,onRetry:n,themes:r,setup:a,runs:o,onAction:c,layout:l=`cultivar`,dataRev:u}){let d=l,[f,p]=(0,S.useState)(`status`),g=e&&r.find(t=>t.name===e.theme)?.sigil||``,{data:v}=h(()=>d===`greenhouse`||d===`operator`?i.doctor().catch(()=>null):Promise.resolve(null),[d,u]),{data:x}=h(()=>d===`journal`?i.recent().catch(()=>null):Promise.resolve(null),[d,u]);if(!e)return t?(0,T.jsxs)(`div`,{children:[(0,T.jsx)(m,{error:`Could not load the harness overview: ${t}`}),(0,T.jsx)(`button`,{className:`btn`,onClick:n,children:`Retry`})]}):(0,T.jsx)(y,{});let C=e.daemon_stale?(0,T.jsx)(b,{}):null;return e.deployed?f===`status`&&d===`journal`?(0,T.jsxs)(S.Suspense,{fallback:(0,T.jsx)(y,{}),children:[C,(0,T.jsx)(L,{overview:e,recent:x,onAction:c,onDirection:p,dataRev:u})]}):(0,T.jsxs)(T.Fragment,{children:[C,(0,T.jsx)(`div`,{className:`head-row`,children:(0,T.jsx)(s,{"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:g,setup:a,jobs:o,onAction:c}),f===`status`&&d===`greenhouse`&&(0,T.jsx)(S.Suspense,{fallback:(0,T.jsx)(y,{}),children:(0,T.jsx)(F,{overview:e,sigil:g,jobs:o,doctor:v,onAction:c})}),f===`status`&&d===`operator`&&(0,T.jsx)(S.Suspense,{fallback:(0,T.jsx)(y,{}),children:(0,T.jsx)(I,{overview:e,jobs:o,doctor:v,onAction:c})}),f===`lineage`&&(0,T.jsx)(M,{overview:e,sigil:g,setup:a,jobs:o}),f===`operator`&&(0,T.jsx)(N,{overview:e,setup:a,jobs:o})]},f)]}):(0,T.jsxs)(T.Fragment,{children:[C,(0,T.jsx)(_,{onAction:c})]})}export{R as default,w as n,P as t};
|