Commit Graph

209 Commits

Author SHA1 Message Date
Offending Commit
edc498de7b Merge pull request #26 from offendingcommit/chore/vitest-coverage
test(web): add v8 coverage with truthful baseline floor
2026-05-28 14:22:21 -05:00
github-actions[bot]
8e16dc4f78 chore(release): 0.11.0 [skip ci]
# [0.11.0](https://github.com/offendingcommit/openconcho/compare/v0.10.0...v0.11.0) (2026-05-28)

### Bug Fixes

* harden token and URL handling ([5cfbae6](5cfbae6248))

### Features

* **docker:** add containerized web build with CORS guidance ([cfe07f1](cfe07f1900))
2026-05-28 19:21:59 +00:00
Offending Commit
94c423522a test(web): add v8 coverage with truthful baseline floor
Adds @vitest/coverage-v8 (catalog-pinned), a test:coverage script wired
through turbo (inputs + coverage/** output), and coverage thresholds set
to a floor measured on main (lines 18 / funcs 10 / branches 10 / stmts
17 against current 19.3/11.4/11.7/18.9). Ratchet upward as tests grow.

Adapts the coverage config from @BenSheridanEdwards's fork; the multi-job
CI fan-out from that branch was intentionally left out.

Co-authored-by: Ben Sheridan-Edwards <BenSheridanEdwards@users.noreply.github.com>
2026-05-28 14:21:42 -05:00
dependabot[bot]
793ed230db chore(ci)(deps): bump actions/checkout from 4 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-28 19:21:19 +00:00
Offending Commit
ac20ab6271 Merge pull request #22 from offendingcommit/fix/web-security-hardening
fix: harden token and URL transport security
2026-05-28 14:20:51 -05:00
Offending Commit
62a5085202 Merge pull request #24 from offendingcommit/chore/local-prepush-gates
chore(hooks): local pre-push gate + secret scan
2026-05-28 14:20:45 -05:00
Offending Commit
a26b028c5c Merge pull request #25 from offendingcommit/chore/dependabot
ci(deps): add grouped Dependabot config
2026-05-28 14:20:38 -05:00
Offending Commit
a33891982b Merge pull request #23 from offendingcommit/feat/docker-web
feat(docker): containerized web build + CORS guidance
2026-05-28 14:20:32 -05:00
github-actions[bot]
7a478ebbc8 chore(release): 0.10.0 [skip ci]
# [0.10.0](https://github.com/offendingcommit/openconcho/compare/v0.9.0...v0.10.0) (2026-05-28)

### Features

* **api:** add scoped multi-instance query client ([de8db4b](de8db4b7aa))
2026-05-28 19:20:20 +00:00
Offending Commit
5d71d1e7c5 Merge pull request #19 from offendingcommit/feat/scoped-client-foundation
feat(api): add scoped multi-instance query client
2026-05-28 14:19:22 -05:00
Ben Sheridan-Edwards
7355884051 feat(desktop): auto-discover Honcho instances on localhost (#1)
* feat(desktop): auto-discover Honcho instances on localhost

First-launch and on-demand discovery of running Honcho instances on
127.0.0.1:8000-8100. Desktop-only — the browser can't port-scan due to
CORS, so the scan runs in the Tauri Rust shell.

- New Rust command `discover_honcho_instances(start_port?, end_port?)`
  in src-tauri/src/discover.rs: parallel TCP probe of each port with
  150ms connect timeout + 250ms total request budget, looking for a
  /health endpoint returning `{"status":"ok"}`.
- New TS helper `discoverHonchoInstances()` in src/lib/discovery.ts:
  detects Tauri runtime; web build degrades to an empty result.
- `suggestNameForInstance()` fetches the first workspace and derives a
  friendly name from its id ("neo-personal" -> "Neo"). Used to seed the
  Name field for each discovered instance.
- `DiscoveredInstances` component: list of found instances with
  editable suggested names + per-row checkbox + "Add N instances"
  button. Rows are pre-checked by default and filter out already-
  configured baseUrls.
- Wired into `InstancesManager`:
  - First launch (no instances): renders above the connection-type
    chooser with autoRun=true. User sees results immediately.
  - With instances: adds a "Discover instances" button to the list
    view that opens the discovery flow on demand.
  - Both paths gate on `isTauri()`; the web build keeps its existing
    behaviour unchanged.

Adds tokio (with net + io-util + time + rt + macros) and futures to
the Tauri shell to get async TCP + join_all.

Tests:
- deriveNameFromWorkspaceId handles hyphenated, multi-segment, and
  no-hyphen ids

* test(desktop): add probe tests including live Hermes stack integration

- rejects_inverted_port_range
- ignores_ports_with_no_listener
- finds_live_hermes_stacks (#[ignore]d; opt-in with --ignored)

The ignored test exercises discover_honcho_instances against ports
8000-8010, expecting exactly [8001, 8002, 8003, 8004, 8005]. Verified
locally — the probe finds all 5 stacks in <10ms.

---------

Co-authored-by: Agents <agents@Jarviss-Mac-mini.local>
2026-05-28 14:09:45 -05:00
Agents
247ab846e9 docs(web): link panel to plastic-labs/honcho#724
Filed the upstream feature request asking /queue/status to surface
per-work-unit observer/observed, specialist phase, and token telemetry.
Panel now links to the concrete tracking issue instead of a pre-filled
new-issue form. Re-captured the showcase screenshots so the visual
state matches.
2026-05-28 14:08:57 -05:00
Agents
5f61769adc docs(web): add Dream Progress screenshots + capture script
Wires up the DEV-only /dream-progress showcase to a Playwright script
that captures idle/active/stalled variants for documentation. Also
regenerates routeTree.gen.ts to include the new queue + showcase routes
and folds in Biome formatter fixes.

Run `node scripts/screenshot-dream-progress.mjs` from packages/web with
the dev server up to refresh the images.
2026-05-28 14:08:57 -05:00
Agents
93c117b16b test(web): cover queue polling and stale-dream detection
- pickQueueRefetchInterval picks 2.5s when work is active, 10s otherwise
- useStaleQueueDetection only flags after 30 min without forward progress
- stall anchor resets when completed advances or all work finishes
2026-05-28 14:08:56 -05:00
Agents
17f8a5a7bf feat(web): add live dream progress panel with adaptive polling
Watching dreams was a 5-15min black box. Now a dedicated
/workspaces/:id/queue route polls /v3/workspaces/:id/queue/status
every 2.5s while work is in-flight (10s when idle) and surfaces a
warning when in-progress work hasn't advanced the completed count
for >30 minutes.

The Honcho API only exposes aggregate counts (no observer/observed
pair, specialist phase, or token telemetry per work-unit), so the
panel links out to an upstream issue for those.

- queries: adaptive refetchInterval via TanStack Query callback form
- hooks/useStaleQueueDetection: client-side stall detection
- routes/workspaces_.\$workspaceId_.queue: dedicated live view
- routes/_dev.dream-progress: DEV-only showcase for screenshots
- WorkspaceDetail: new "Queue & dreams" nav card
2026-05-28 14:08:56 -05:00
Ben Sheridan Edwards
2340e65028 feat(web): add dialectic reasoning playground
Lets users fire one query at every Honcho reasoning level (minimal / low /
medium / high / max) in parallel and compare answers + latency side-by-side
in a 5-column grid.

- New route: /workspaces/:ws/peers/:peer/playground
- New component: DialecticPlayground with per-column state, level checkboxes
  to skip expensive levels, and a single Run button that fans out via
  Promise.all
- Extends useChat() to accept an optional reasoning_level parameter (was
  hardcoded to "low")
- Adds a Playground button next to Chat on the peer detail page
- Tests cover the parallel fan-out (peak concurrency = 5, no serial
  awaiting) and per-column latency measurement
- Screenshot Playwright spec (idle / mid-flight / settled) drives the
  images in docs/screenshots/ — regen with PLAYWRIGHT_BASE_URL=... pnpm
  exec playwright test e2e/playground.screenshots.spec.ts
2026-05-28 14:08:08 -05:00
Agents
e549200f5d test(web): add playwright e2e for Dreams + docs screenshots
- packages/web/e2e/dreams.spec.ts: 4 tests covering sidebar entry,
  heading/breadcrumb resolution, mocked-API clustering into rows with
  count chips, and the premise-tree expansion path. Uses a function
  matcher for context.route so the trailing ?page=&page_size= query
  string doesn't break a glob.
- docs/screenshots/: dark + light mode list and expanded-detail PNGs
  captured at 2880x1800 (retina) via playwright against the dev
  server with a tiny mock Honcho.
- DreamList.tsx: add a literal space to CountChip's label fragment so
  the rendered text reads "3 explicit" instead of "3explicit" (gap-1
  styles the visual layout but doesn't add a text-node space). Better
  for screen readers, copy/paste, and assertion via toContainText.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 14:07:22 -05:00
Agents
f318555c82 feat(web): add Dream Output Viewer
Dreams are currently a black box — to benchmark Tier L models on dreamer
induction quality we need to see what each model produced. This adds a
workspace-scoped /dreams route that surfaces every dream run as a
group of conclusions split into explicit / deductive / inductive
columns, with click-to-expand premise trees.

What's here:

- `lib/dreams.ts`: pure helpers. `clusterConclusionsIntoDreams` groups a
  raw conclusions list into per-pair bursts using a configurable time
  window (default 60s). `expandPremiseTree` walks `reasoning_tree` first
  and falls back to a flat `premises` ID list, with cycle detection and
  a depth cap. Defines an `ExtendedConclusion` type that augments the
  generated schema with `conclusion_type`, `premises`, and
  `reasoning_tree` — Honcho's migration f1a2b3c4d5e6 added those
  columns but `schema.d.ts` doesn't expose them yet, so the UI degrades
  gracefully (unknown types fall into "explicit").

- `api/queries.ts`: new `useDreams` hook that paginates the conclusions
  list endpoint up to a configurable cap (default 400) and hands the
  raw list to the UI for clustering. New `dreams` query key.

- `components/dreams/`:
  - `DreamList.tsx` — route entry. Shows recent dreams as rows with
    timestamp, observer→observed pair, and per-type counts. Selecting
    a row expands an inline detail panel above the list.
  - `DreamDetail.tsx` — three-column view (explicit / deductive /
    inductive). Each inductive conclusion has a "Show premises" button
    that expands the reasoning chain.
  - `PremiseTree.tsx` — recursive premise renderer with type badges,
    cycle indicator, and graceful handling of premises that fall
    outside the loaded page.

- Routing: `routes/workspaces_.$workspaceId_.dreams.tsx` registers the
  page; routeTree.gen.ts regenerated.

- Sidebar: new "Dreams" entry between Conclusions and Webhooks
  (MoonStar icon to distinguish from the dark-mode Moon).

- Breadcrumb: "dreams" added to SECTION_LABELS so the trail resolves.

Tests (vitest, 14 new):
- clustering: empty input; same-pair burst within window; gap exceeds
  threshold → split; different pairs don't merge even with overlapping
  timestamps; custom gap window; newest-first ordering; counts default
  unknown types to explicit.
- premise tree: empty children for no premises; flat list → direct
  children; multi-level reasoning_tree recursion; missing premise
  flagged (not in loaded page); cycle detection halts recursion;
  maxDepth cap; reasoning_tree preferred over flat premises.

Verified manually in the preview: route mounts, sidebar/breadcrumb
resolve, error path renders cleanly, typecheck + lint + dream tests
all clean. The unrelated `app.test.tsx` failure is pre-existing on
main.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 14:06:46 -05:00
BenSheridanEdwards
e809409fa3 ci(deps): add grouped Dependabot config
Weekly npm (pnpm workspace), cargo (Tauri shell), and github-actions
updates, grouped by family (TanStack, Tauri, React, test stack, build
tooling, semantic-release, commitlint) to keep related bumps in one PR.

Co-authored-by: Ben Sheridan-Edwards <BenSheridanEdwards@users.noreply.github.com>
2026-05-28 14:02:08 -05:00
BenSheridanEdwards
86bb9d6be0 chore(hooks): pre-push gate, secret scan, pr:evidence drafter
Phase A of the quality-gate rollout — local + pre-push gates that stop
slop before it leaves the laptop. Preventative controls, per the
architect playbook.

- .husky/pre-commit — adds scripts/secret-scan.sh as the first check
  before the existing Biome format/lint. Blocks the commit when a
  likely secret is found in staged additions. Existing Biome behaviour
  is preserved.
- .husky/pre-push (new) — runs `pnpm check` (lint + typecheck + test)
  before the branch leaves the laptop. Mirrors the `check` job in
  .github/workflows/ci.yml so PR-blocking issues surface locally first.
  Bypassable for genuine emergencies with `git push --no-verify`.
- scripts/secret-scan.sh (new) — regex scan over staged additions for
  the common accidents: AWS keys, Anthropic/OpenAI/GitHub/Slack/Google/
  Stripe tokens, JWTs, PEM private key blocks, hardcoded password
  literals. Validated against synthetic leaks of each type. No external
  tool dependency — pure bash + grep, runs in <100ms typical.
- scripts/pr-evidence.sh (new) — drafts a PR_BODY.md from the diff vs
  origin/main: file lists (added/modified/deleted), commit summaries,
  and the QA checklist. Flags screenshots as REQUIRED when the diff
  touches packages/web/src/{components,routes} or packages/desktop.
  Wired as `pnpm pr:evidence` so it runs from anywhere in the
  workspace.
- .gitignore — adds PR_BODY.md so drafts don't get committed by
  accident.

Pre-commit stays fast (<2s typical). Heavy checks (typecheck, full
test run) live in pre-push.
2026-05-28 14:01:20 -05:00
Offending Commit
cfe07f1900 feat(docker): add containerized web build with CORS guidance
Multi-stage Dockerfile (node:22-alpine + pnpm build -> nginx-unprivileged
serve) producing a non-root image that runs under read-only fs + cap_drop
ALL. nginx.conf does SPA-fallback routing, /healthz, immutable asset cache,
and gzip, plus an opt-in same-origin reverse-proxy block.

docs/docker.md documents build/run and the two ways to handle browser CORS
on the web build (configure Honcho's CORSMiddleware, or the nginx proxy).

The Dockerfile and nginx.conf are adapted from @zmarakjanbangash's fork.

Co-authored-by: zmarakjanbangash <zmarakjanbangash@users.noreply.github.com>
2026-05-28 13:59:47 -05:00
batumilove
5cfbae6248 fix: harden token and URL handling
* fix: harden token and URL handling

* test: restore full web test suite

---------

Co-authored-by: batumilove <batumilove@users.noreply.github.com>
2026-05-28 13:54:48 -05:00
Agents
866dab39fe docs(seed-kits): add dark-mode screenshots alongside light
- Moves docs/seed-kits/*.png into docs/seed-kits/light/.
- Adds docs/seed-kits/dark/ with the same three panels rendered in
  the dark theme.
- Updates the capture script to loop over both themes by setting
  openconcho:theme in localStorage and the matching colorScheme on
  the browser context.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 13:53:51 -05:00
Agents
650bfd7b28 feat(web): add Peer Card Seed Kits
Adds a /seed-kits page where users can author named "kits" of card
lines (e.g. "Personal core", "Work context") and one-click apply them
to any peer across any registered instance. Removes the chore of
manually re-typing the same identity facts into multiple agents.

Built-in starter kits are read-only but forkable. User kits live in
localStorage. The apply flow shows a side-by-side merge preview that
dedupes by the line's prefix (text before the first ":"), so applying
a kit with "Name: Ben Sheridan-Edwards" to a peer whose card already
has "Name: Ben" replaces the line rather than duplicating it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 13:53:50 -05:00
BenSheridanEdwards
de8db4b7aa feat(api): add scoped multi-instance query client
Adds createScopedClient() — an openapi-fetch client bound to a specific
Instance (rather than the active one in localStorage) — and the
useScoped* TanStack Query hooks (workspaces, peers, peer representation,
peer card) with per-instance query-key isolation so caches never collide
across instances.

Foundation for multi-instance features (seed kits, desktop
auto-discover) that read from non-active instances.

Co-authored-by: Ben Sheridan-Edwards <BenSheridanEdwards@users.noreply.github.com>
2026-05-28 13:52:15 -05:00
HunterSThompson
7cf94aa03f feat(web): show sidebar last updated status 2026-05-28 13:46:48 -05:00
github-actions[bot]
2d7937e275 chore(release): 0.9.0 [skip ci]
# [0.9.0](https://github.com/offendingcommit/openconcho/compare/v0.8.0...v0.9.0) (2026-05-28)

### Features

* **web:** add global metadata visibility toggle ([e490d91](e490d911fc))
* **web:** add shared Breadcrumb component for workspace pages ([c6afc80](c6afc80fda))
* **web:** add workspace contextual sub-nav to sidebar ([62cae68](62cae68d05))
2026-05-28 18:46:42 +00:00
Offending Commit
6960bf4ffe Merge pull request #17 from offendingcommit/test/wrap-harness-metadata-provider
test(web): wrap test harness in MetadataProvider to match production
2026-05-28 13:45:46 -05:00
Offending Commit
1094904a03 test(web): wrap test harness in MetadataProvider to match production
main.tsx wraps the app in DemoProvider > MetadataProvider, but the
app.test.tsx render helpers only wrapped with DemoProvider. Since
e490d91 added useMetadata() to Sidebar, the routed app threw
"useMetadataContext must be used within MetadataProvider" in tests;
the error boundary swallowed the tree and the first-load assertion
failed. CI has been red on main since that commit.

Mirror the production provider nesting in both render sites.
2026-05-28 13:43:31 -05:00
Offending Commit
e490d911fc feat(web): add global metadata visibility toggle
Introduce MetadataContext + useMetadata hook backed by localStorage and
wire a Braces button into the sidebar footer that toggles raw metadata
visibility across the app. Replace per-page collapsible metadata in
PeerDetail and WorkspaceDetail with a global animated reveal styled
distinctly (warning-colored card) to signal raw payload. Also adopts
the shared Breadcrumb in both detail pages.
2026-05-15 14:27:53 -05:00
Offending Commit
62cae68d05 feat(web): add workspace contextual sub-nav to sidebar
Detect active workspace via fuzzy matchRoute against /workspaces/$workspaceId
and reveal an animated sub-nav with links to Peers, Sessions, Conclusions,
and Webhooks for that workspace. Sub-nav collapses smoothly when leaving
the workspace context.
2026-05-15 14:25:42 -05:00
Offending Commit
c6afc80fda feat(web): add shared Breadcrumb component for workspace pages
Replace ad-hoc back-arrow and inline breadcrumb markup in PeerList,
SessionList, SessionDetail, ConclusionBrowser, and WebhookManager with a
single router-aware Breadcrumb. Demo-aware via useDemo() so workspace
and entity IDs render masked when demo mode is active.
2026-05-15 14:25:41 -05:00
Offending Commit
f38ef4f4ee docs(agents): add codex agents guide
Mirror CLAUDE.md as AGENTS.md so Codex-family agents pick up the same
commands, structure, and constraints (sans CLAUDE-specific rule paths).
2026-05-15 14:25:41 -05:00
Offending Commit
96d96a7341 chore(fire-tools): upgrade stamp to v1.14.0
- Bump fire_tools_version from 1.13.2 to 1.14.0
- Upgrade pnpm/action-setup@v4 to @v6 in composite setup action
2026-05-15 14:24:01 -05:00
github-actions[bot]
e5349ed6e3 chore(release): 0.8.0 [skip ci]
# [0.8.0](https://github.com/offendingcommit/openconcho/compare/v0.7.1...v0.8.0) (2026-05-15)

### Features

* add health indicator and localhost auto-detect ([38e76d3](38e76d33de))
* add Honcho Cloud connection preset ([f071762](f0717624eb))
2026-05-15 03:07:43 +00:00
Offending Commit
403ee48b93 Merge pull request #11 from offendingcommit/claude/add-honcho-cloud-option-vk93o 2026-05-14 22:06:47 -05:00
Claude
38e76d33de feat: add health indicator and localhost auto-detect
Surfaces live connection health for the active instance in the sidebar
and probes localhost:8000 on the first-run choose-type screen so users
running Honcho locally can connect in one tap.

- useHealthStatus hook polls checkConnection every 30s via TanStack Query
- HealthDot component renders a colored status dot with tooltip
- choose-type screen silently probes http://localhost:8000 once; on
  success it surfaces a "Detected Honcho at localhost:8000 — tap to
  connect" banner that opens the self-hosted form
2026-05-14 23:50:03 +00:00
Claude
f0717624eb feat: add Honcho Cloud connection preset
Adds a "choose-type" step to the settings flow so users can pick between
Honcho Cloud (https://api.honcho.dev, API key required) and Self-Hosted
(URL + optional token) when creating a connection. Multi-instance support
already exists in the data layer, so cloud and self-hosted instances can
coexist.

- new HONCHO_CLOUD_URL constant and isCloudInstance helper in config.ts
- SettingsForm accepts a preset prop; cloud variant locks the endpoint
  and enforces an API key
- InstancesManager gains a ConnectionTypeChooser entry point and renders
  a Cloud icon for cloud instances in the list
- unit tests for both preset paths and cloud edit-mode detection
2026-05-14 23:21:28 +00:00
github-actions[bot]
4fc54a3581 chore(release): 0.7.1 [skip ci]
## [0.7.1](https://github.com/offendingcommit/openconcho/compare/v0.7.0...v0.7.1) (2026-05-12)

### Bug Fixes

* improve dark mode accessibility contrast ([7827438](7827438d92))
* show structured page placeholders while loading ([3075e4a](3075e4a005))
2026-05-12 16:07:18 +00:00
Offending Commit
1008e97683 Merge pull request #10 from offendingcommit/codex/page-loading-placeholders
[codex] Show structured page placeholders while loading
2026-05-12 11:06:22 -05:00
Offending Commit
4c5489915e ci: move desktop cargo check out of github actions 2026-05-12 10:46:35 -05:00
Offending Commit
5a430b4950 ci: cache apt packages for tauri linux deps 2026-05-12 10:18:56 -05:00
Offending Commit
57b7ff3ad3 Merge branch 'main' into codex/page-loading-placeholders
Signed-off-by: Offending Commit <offendingcommit@gmail.com>
2026-05-12 10:08:10 -05:00
Offending Commit
9cc7d08ea1 Merge pull request #9 from offendingcommit/codex/darkmode-accessibility
[codex] Improve dark mode accessibility contrast
2026-05-12 10:07:39 -05:00
Offending Commit
3075e4a005 fix: show structured page placeholders while loading 2026-05-12 10:05:00 -05:00
Offending Commit
7827438d92 fix: improve dark mode accessibility contrast 2026-05-12 09:49:27 -05:00
github-actions[bot]
3d1bb4c93c chore(release): 0.7.0 [skip ci]
# [0.7.0](https://github.com/offendingcommit/openconcho/compare/v0.6.0...v0.7.0) (2026-05-04)

### Features

* deep linking for hosted URLs and openconcho:// scheme ([578c8f4](578c8f4c46))
2026-05-04 16:36:23 +00:00
Offending Commit
a07adcbcbc Merge pull request #7 from offendingcommit/feat/deep-linking
feat: deep linking for hosted URLs and openconcho:// scheme
2026-05-04 11:33:25 -05:00
github-actions[bot]
387bfa4228 chore(release): 0.6.0 [skip ci]
# [0.6.0](https://github.com/offendingcommit/openconcho/compare/v0.5.3...v0.6.0) (2026-05-04)

### Features

* support multiple Honcho instances (closes [#2](https://github.com/offendingcommit/openconcho/issues/2)) ([f706c83](f706c83cc1))
2026-05-04 16:33:21 +00:00
Offending Commit
f9e26d42f1 Merge branch 'main' into feat/deep-linking 2026-05-04 11:31:55 -05:00