Skip to content

feat(frontend): bring obol-stack-front-end into monorepo - #888

Merged
OisinKyne merged 566 commits into
mainfrom
integration/v0.17
Oct 15, 2026
Merged

OisinKyne merged 566 commits into
mainfrom
integration/v0.17

Conversation

@OisinKyne

Copy link
Copy Markdown
Contributor

Summary

To improve velocity the front end repo is merged here.

bussyjd and others added 30 commits May 12, 2026 14:24
deps: integrate Dependabot bumps (#298-#309) for v0.1.24-rc1
feat(dashboard): add storefront link in header and agent registration…
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 8.59.1 to 8.59.2.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.59.2/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.59.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) from 5.100.9 to 5.100.10.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/HEAD/packages/react-query)

---
updated-dependencies:
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.100.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.59.1 to 1.60.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](microsoft/playwright@v1.59.1...v1.60.0)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.60.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [thread-stream](https://github.com/mcollina/thread-stream) from 4.0.0 to 4.2.0.
- [Release notes](https://github.com/mcollina/thread-stream/releases)
- [Commits](pinojs/thread-stream@v4.0.0...v4.2.0)

---
updated-dependencies:
- dependency-name: thread-stream
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@copilotkit/runtime](https://github.com/CopilotKit/CopilotKit) from 1.56.3 to 1.57.1.
- [Release notes](https://github.com/CopilotKit/CopilotKit/releases)
- [Changelog](https://github.com/CopilotKit/CopilotKit/blob/main/changelog.txt)
- [Commits](CopilotKit/CopilotKit@v1.56.3...v1.57.1)

---
updated-dependencies:
- dependency-name: "@copilotkit/runtime"
  dependency-version: 1.57.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.6.2 to 25.9.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 25.9.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [viem](https://github.com/wevm/viem) from 2.48.11 to 2.49.3.
- [Release notes](https://github.com/wevm/viem/releases)
- [Commits](https://github.com/wevm/viem/compare/viem@2.48.11...viem@2.49.3)

---
updated-dependencies:
- dependency-name: viem
  dependency-version: 2.49.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [lint-staged](https://github.com/lint-staged/lint-staged) from 16.4.0 to 17.0.5.
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](lint-staged/lint-staged@v16.4.0...v17.0.5)

---
updated-dependencies:
- dependency-name: lint-staged
  dependency-version: 17.0.5
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) from 19.2.5 to 19.2.6.
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.6/packages/react-dom)

---
updated-dependencies:
- dependency-name: react-dom
  dependency-version: 19.2.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.4.2 to 3.4.5.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](cure53/DOMPurify@3.4.2...3.4.5)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-version: 3.4.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
OisinKyne and others added 20 commits October 14, 2026 15:11
…istory

Brings ObolNetwork/obol-stack-front-end (main @ f70fb5c) into this repo so the
dashboard is built, tested and released alongside the CLI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

git-subtree-dir: web/frontend
git-subtree-mainline: 33ae485
git-subtree-split: f70fb5c
- The dashboard image (ghcr.io/obolnetwork/obol-stack-front-end) is
  published by docker-publish-frontend.yml and pinned like the x402
  images; the release gate checks it.
- OBOL_DEVELOPMENT=true obol stack up builds it locally (alias
  frontend); just dev-frontend builds from web/frontend and imports it.
- Old-repo scaffolding removed (k8s, skaffold, compose, its workflows,
  dependabot, husky); Renovate covers its npm deps.
- OpenClaw code removed from the UI; unused deps dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…runs

- ci.yml replaces lint-test.yaml and helm-template-smoke.yml: Go
  build/vet/test + generate + goreleaser, golangci-lint on new code,
  helm template + lint of the embedded charts, storefront and front-end
  lint/test/typecheck/build, shellcheck for obolup. Jobs run only for the
  areas a change touches; the aggregate check keeps the name lint-test.
- Runs on PRs and pushes to integration/** with cancel-in-progress.
- Image workflows never cancel a main commit's publish (each needs its
  images for the release gate).
- Renovate runs on its Monday schedule plus every 4 hours, not hourly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… defaults tree

- ~1.4k lines of unused Go removed (OpenClaw-era test harness, unused
  helpers left by removed features); staticcheck U1000 is clean.
- buy.py unit tests updated to current behaviour and run from go test.
- Storefront lint uses the ESLint CLI (next lint is gone in Next 16).
- stack export includes the defaults tree and its manifest so
  hand-edits survive a backup/restore.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e requests

- network status: eRPC table per chain with local/remote upstreams and
  which one is serving now, reth pipeline stages (no more syncing 0/0),
  Lighthouse sync states and backfill, pod problems shown once with a
  cause and hint, data size and a Grafana link. Exit code 3 when a node
  is degraded or unreachable. --watch redraws with rates and ETAs
  (NDJSON under -o json).
- network stop|start <network>/<id> (and --all): scale the node to zero
  and back, keep its data, deregister/re-register it with eRPC; sync and
  stack up respect a stopped node.
- Execution and consensus pods get memory/CPU requests sized per
  network, client and mode (overridable), so their footprint is visible
  to the scheduler.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t-end history

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nt clean-up

- network stop/start only accept an installed <type>/<id> with a valid
  id, and the values path must stay under the networks dir.
- stack import path rewriting and the defaults hand-edit check walk the
  config dir through os.Root; a symlink in the defaults tree counts as a
  hand-edit and isn't followed.
- Constants for the ethereum network type and repeated command strings;
  small modernisations from golangci-lint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… budget

The non-zero price rule on every payments[].price field pushed the
ServiceOffer CRD over the apiserver's CEL cost budget because payments
had no maxItems, so `obol stack up` failed to apply it (found live on
k3s v1.35.9). payments is now capped at 16 (routes keeps its 128 cap);
the CLI rejects more with a clear error.

- embed test: every list/map/string carrying a CEL rule must be bounded.
- CI crd-apply job: server-side applies every embedded CRD to a k3s
  apiserver (same image as k3d-config.yaml) so budget errors fail CI.
…atus and doctor wording

- buy.py pay: --data (or --type inference) implies POST, and the 402
  probe sends the request body, so LiteLLM-backed offers can be paid.
- The 402 lists each payment option once (plus the legacy chain-name
  alias); buy.py collapses duplicates too.
- sell inference refusal skips `model setup custom` when the model is
  already configured, avoiding a second model_list entry.
- sell status shows a healthy offer's Draining condition as OK.
- doctor counts the default agent's wallet (address only) and reports an
  unreadable keystore as present.
- Non-interactive sell delete examples pass --force.
Export captured agent keystores only through a node fallback while the
cluster was up, failing quietly otherwise, and import never used the
archive's wallets/ copy, so a fresh host could end up with a signer and
no key while the CLI reported the wallets as restored.

- Export writes every Hermes (and leftover OpenClaw) wallet to
  wallets/<ns>.json|.enc, names each captured wallet by address, and
  warns loudly about any it could not capture.
- Import, in every mode, re-creates a missing keystore from wallets/
  after decrypting it in-process and matching the derived address
  (--passphrase, a TTY prompt, or a clear manual command), restarts an
  already-running signer, and reports per wallet what was restored where.
goreleaser's .ShortCommit follows git's auto abbreviation, which grew to
8 characters, while every image publisher tags the first 7. The CLI then
pinned tags that did not exist.

- pinCommit() cuts the commit to 7 characters, whatever built the binary;
  goreleaser and `just build` pass 7 characters explicitly.
- stack up fails before applying anything when GHCR says a pinned tag
  does not exist (network errors keep the offline fallback).
- `obol version -o json` reports image_tag; the release job checks the
  built binary's tag against GHCR instead of re-deriving it from git.
- The front-end image is stamped with its short SHA and build time.
A wrong or missing passphrase used to restore everything except the
wallet keystores and exit 0, leaving agents without their keys.

- Before touching host state, every wallets/ backup the data/ copy does
  not cover must decrypt; otherwise the import stops with nothing
  restored. A terminal is asked up to three times.
- A keystore that still fails to restore stops the import before any
  cluster work, with a non-zero exit and the command to retry.
- New --skip-wallets restores without those keystores, explicitly.
- Clearer export wording for keystores copied out through the k3d node.
- reth reports stages alphabetically; sort them into pipeline order
  before deciding which stage is current.
- --watch waits 5 minutes of no progress before "stalled?" (reth only
  moves a checkpoint when it commits) and averages over 10 minutes.
- Data sizes the CLI cannot read show "unknown" instead of "≥0 B".
- JSON time is UTC.
- stack up checks every pinned image tag on the registry before it
  starts or upgrades anything, so a broken build no longer starts a
  stopped cluster first.
- network status JSON reports sizes it could not read as null, matching
  "unknown" in the human output.
…image

The dev-only services-catalog route returned 404 in production builds;
it is removed. The runtime image no longer ships .map files.
Keep the full front-end publish workflow over main's dispatch-only copy.
@OisinKyne
OisinKyne enabled auto-merge (rebase) October 15, 2026 00:12
Comment thread web/frontend/scripts/_design-audit.mjs Fixed
Comment thread web/frontend/src/app/api/agents/status/route.ts Fixed
Comment thread web/frontend/src/app/api/agents/token/route.ts Fixed
Comment thread web/frontend/src/app/api/agents/wallet/route.ts Fixed
Comment thread web/frontend/src/hooks/useTokenPrices.test.mjs Fixed
Comment thread web/frontend/src/app/api/agents/status/route.ts Fixed
Comment thread web/frontend/src/app/api/agents/token/route.ts Fixed
Comment thread web/frontend/src/app/api/agents/wallet/route.ts Fixed
- Front-end agent API routes log runtime/id through a constant format
  string with control characters stripped.
- The sign-in verifier strips line breaks from logged verify errors.
- sanitizeNextPath checks the leading "/" explicitly and rejects control
  characters; tests cover the rejected forms.
- design-audit script uses a private temp dir; the price test checks the
  URL's host and path exactly.
- defaults: read, write and prune the defaults tree through os.Root.
- Exhaustive switches, string constants, modernize/revive fixes,
  canonical header names in tests.
- nilerr: document the two intentional nil returns.

return NextResponse.json<AgentInstanceHealth>(health);
} catch (error) {
console.error('[Agent Status] Error for %s/%s:', logSafe(runtime), logSafe(id), error);

return NextResponse.json({ token });
} catch (error) {
console.error('[Agent Token] Error for %s/%s:', logSafe(runtime), logSafe(id), error);
const metadata = await client.getWalletMetadata(instance);
return NextResponse.json<WalletMetadata>(metadata);
} catch (error) {
console.error('[Agent Wallet] Error for %s/%s:', logSafe(runtime), logSafe(id), error);
@OisinKyne
OisinKyne disabled auto-merge October 15, 2026 11:28
@OisinKyne
OisinKyne merged commit 5479828 into main Oct 15, 2026
25 checks passed
@OisinKyne
OisinKyne deleted the integration/v0.17 branch October 15, 2026 11:29
OisinKyne added a commit that referenced this pull request Oct 15, 2026
…de (#891)

* fix(llm): turn LiteLLM metrics on for stacks upgraded with obol upgrade

The base chart keeps an existing stack's live LiteLLM config, so older
stacks only gain the Prometheus settings when obol adds them. Only
`obol stack up` did; `obol upgrade`, which obolup suggested after an
install, never did, so /metrics kept requiring the master key and the
LLM dashboards stayed empty.

- model.EnsureLiveLiteLLMObservability adds the missing settings to the
  live ConfigMap (never overriding operator values) and restarts LiteLLM.
- obol upgrade calls it after syncing the base release; stack up calls it
  when its config snapshot/restore did not run.
- obolup now suggests `obol stack up` for a running stack.

* ci(gitleaks): ignore the known false positives at the #888 squash commit

* feat: finish the update — obolup offers stack up, CLI flags a stale stack

- `obol stack up` records the obol version that brought the stack up
  ($CONFIG/.stack-version).
- obolup, finding the stack running on an older version, explains what
  restarts and asks to upgrade it now (default yes). Without a terminal it
  only runs with --yes or OBOL_UPGRADE_STACK=true, else prints the command.
- `obol doctor` gains a "Stack version" check, and other commands print a
  one-line notice while the stack has not been brought up by this version
  (not for stack/doctor/version/passthroughs, JSON or --quiet).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants