4720 Commits
Author SHA1 Message Date
jason.woltje 9750609f4c Restore scoped dev-owner launch checks 2026-11-07 12:45:13 -06:00
jason.woltje af9e367719 Keep fixture harness selection in its plugin and run pi offline 2026-11-07 12:39:33 -06:00
jason.woltje 934cc08e77 Register theme and organization setup routes 2026-11-07 12:37:47 -06:00
jason.woltje ed081626b5 Bind organization identity into bus boot 2026-11-07 12:36:27 -06:00
jason.woltje 0e0255de0d Prepare fixture organizations with explicit notifications choice 2026-11-07 12:35:31 -06:00
jason.woltje af6fad2fbd Merge commit '67c62de9b' into ui-org
# Conflicts:
#	packages/webui/src/public/bus.js
#	packages/webui/src/serve.mjs
2026-11-07 12:33:39 -06:00
jason.woltje be032405d1 S5 Console multi-org (round 3 candidate) 2026-11-07 12:33:02 -06:00
jason.woltje 7583e03a39 Merge commit '487a2e7fa' into ui-org
# Conflicts:
#	scripts/mosaic
2026-11-07 12:32:10 -06:00
jason.woltje 3ecdf4d75e Merge commit '7fdb48827' into ui-org 2026-11-07 12:31:52 -06:00
jason.woltje 12997c78c8 Merge commit 'b52adc841' into ui-org
# Conflicts:
#	packages/cli/src/cli.mjs
#	scripts/mosaic
2026-11-07 12:31:16 -06:00
jason.woltje 4b8bbc06a0 Merge commit '2d8522887' into ui-org 2026-11-07 12:29:14 -06:00
jason.woltje d9d1af2e0f Merge commit '24e240d44' into ui-org
# Conflicts:
#	scripts/mosaic
2026-11-07 12:28:36 -06:00
jason.woltje 7fdb488270 Themes as installed plugins, chosen per organization (S4, plan C5)
Add a reviewed `theme` plugin kind (interfaceVersion 1, export `theme`, switch
"list"). A module returns data only: a displayName and a flat map of colour
custom properties for light, dim and dark. checkTheme validates names and
#rrggbb colours strictly and checks each text/background pair for contrast; a
bad module is refused and logged, never served.

The ten shipped palettes become the first ten modules under
packages/plugins/theme/<name>/. Modules are found by directory scan
(loader.discoverModules, loader.loadInstalled), not by a list in the Console.
loadModule and createLoader are unchanged.

The organization file takes `appearance: { theme, mode }`, validated in
packages/business/src/appearance.mjs; a missing appearance is valid.
GET /api/themes (themes-http.mjs) serves the installed, valid themes.

Browser: the Settings picker lists /api/themes. Precedence is a per-organization
browser override, then the organization's saved theme, then the built-in default
(Harbor, dark). Clearing the override restores the organization's choice. An
uninstalled or invalid saved theme renders the default with a visible warning
and keeps the saved value. A legacy global browser preference is not copied to
every organization. The organization is named in text, so colour is never the
only cue. A plain load writes no appearance record. The default look is
unchanged: computed styles match the base commit element for element.
2026-11-07 12:18:43 -06:00
jason.woltje 67c62de9ba Register the S6 organizations WebUI session 2026-11-07 11:57:46 -06:00
jason.woltje 905cea7576 Show bus host refusals and keep setup choices across retries
A failed bus start now carries the host's own refusal line, read from host.log; repository paths in messages are shown relative and URLs are kept. Setup cards keep the chosen mode, remote and risk box across a re-render, and a client-side refusal is shown on the card.
2026-11-07 11:57:11 -06:00
jason.woltje b52adc8411 Add the organizations CLI E2E on a scratch instance with a fixture worker turn 2026-11-07 11:47:07 -06:00
jason.woltje 2d8522887c Protect shared proxy organization keys 2026-11-07 11:42:56 -06:00
jason.woltje 7b542a3f06 Merge branch 'org/s5' into org/s6 2026-11-07 11:36:05 -06:00
jason.woltje 9df88fb251 Add Settings > Organizations page
Form and live JSON preview over one document, field errors with their
JSON path, the save receipt, and setup cards that name the CLI verb each
step equals. serve.mjs mounts org-admin.mjs with the existing origin and
CSRF fencing.
2026-11-07 11:36:01 -06:00
jason.woltje 2259ac3dd8 Add organization create and setup handlers for the WebUI
org-admin.mjs serves the S6 routes over the C2 organization service:
template, validation with JSON paths, create, edit with if-revision, and
guided setup steps that read their receipt back before acting and never
reinitialize. Receipts reach the browser with host paths relative to the
data and config directories.
2026-11-07 11:36:01 -06:00
jason.woltje 487a2e7fa0 Merge branch 'org/s1' into org/s5
# Conflicts:
#	scripts/mosaic
2026-11-07 11:32:05 -06:00
jason.woltje 56de6fbfba Route mosaic dev and run evidence, and pass the fixture to a dev-owner bus 2026-11-07 11:30:44 -06:00
jason.woltje 5dcc5bf77c Add mosaic run evidence
Read-only: finds a thread's launch and end records in the organization launch log and checks each run's session.json, bundle manifest digests and turn stderr files.
2026-11-07 11:30:44 -06:00
jason.woltje 3723cc56ec Add mosaic dev fixture init, status and stop
Starts the fixture provider's loopback endpoint for a named dev instance and records it under the data root. Refuses the default instance, a configured proxy, provider credentials in the environment, a non-loopback bind and a second fixture. fixtureLauncherOptions hands the endpoint to the launcher as its session proxy context.
2026-11-07 11:30:44 -06:00
jason.woltje 24e240d44e Scope buses to organization roots 2026-11-07 11:29:13 -06:00
jason.woltje 9758c732cd Merge branch 'org/s0' into org/s3 2026-11-07 11:21:39 -06:00
jason.woltje 0d0a9fbdc9 Add deterministic fixture model provider and loopback endpoint 2026-11-07 11:21:35 -06:00
jason.woltje 3456d93af0 Implement organization setup commands 2026-11-07 11:17:31 -06:00
jason.woltje abaec7dcc5 Add standalone proxy lock prototype 2026-11-07 11:16:00 -06:00
jason.woltje ecc426819e Disable shared proxy usage drains by default 2026-11-07 11:15:55 -06:00
jason.woltje d4400050d0 Add organization registry and service interfaces 2026-11-07 11:08:29 -06:00
jason.woltje c8d6d12fe3 Restore Vars spacing and name the Business file card in Settings 2026-11-07 10:38:09 -06:00
jason.woltje fb190721bf Move Business into Settings 2026-11-07 10:24:36 -06:00
jason.woltje d00eb351e6 fix(webui): keep long breadcrumbs, tabs and speaker names inside narrow layouts
S15 review fixes on top of a584c08ad.

- Breadcrumb: from 700px the project name stops at 40% and a long current
  label ellipsizes after it, so a long Conversation title no longer pushes
  the page wider than the window. Under 700px the current label is hidden
  and the project name shrinks as before.
- Details keeps its size beside a long Conversation title instead of
  squeezing to a vertical label (also present on 7c664fac9).
- The active tab is brought fully into the strip after counts load, after
  a refresh repaint and when a tab receives keyboard focus.
- Long speaker names wrap between words at narrow zoom; the time stays
  whole.

Tests: three new S15 browser tests, red on a584c08ad sources and green
here. S10-S15 each alone 3 times green; webui 952/0/0.
2026-11-07 09:13:12 -06:00
jason.woltje a584c08ade fix(webui): polish room and conversation layouts 2026-11-07 07:54:28 -06:00
jason.woltje 7c664fac91 fix(webui): finish scroll classification when Tab lands mid-settle
A Tab outside the transcript while a stale matching scroll was still being
classified deleted the settling pin, which cancelled the classification.
Tab moves no transcript, so no later scroll event decided it, follow stayed
on and the next growth pulled the reader to the tail.

The classification now has its own mark. Reader input drops only the pin
provenance that a repaint reads; the two-frame check still runs.

Room and Conversation 700x700 cases: bf6e92232 fails 2/2 in 3 of 3 runs
(5017 to 5267, 5135 to 5385); this commit passes 4/4 in 3 of 3.
2026-11-07 07:27:10 -06:00
jason.woltje bf6e92232e Preserve transcript pin through room repaint 2026-11-07 06:57:26 -06:00
jason.woltje 94c9f04f5b fix(webui): keep Room details at the right edge in short windows
In the short desktop Room layout the section title sat in the first grid column, so Room details ended mid-row. The title now spans the row and the members line sits right-aligned before the button, capped so long names ellipsize.
2026-11-07 06:37:13 -06:00
jason.woltje 7f31368a1e fix(webui): stop truncating short member chips in the Room composer
The chip's percentage max-width resolved against a content-sized picker
column, so even a single short name was cut off. Cap chips at 16em and
test a one-member Room for whole chip names.
2026-11-07 05:53:03 -06:00
jason.woltje d13afaac3d fix(webui): give the Room message field its column in short windows
fit-content() is not valid inside minmax(), so the browser dropped the
composer column rule and the field fell into a narrow implicit column.
Use fit-content(50%) for the picker and test the field's share of the row.
2026-11-07 05:42:13 -06:00
jason.woltje 2960e8e9a9 fix(webui): place every Room row in the short layout and bound long member lists
Review fixes for S13: the closed-room notice and library line sit above the
messages, the members summary keeps one line (full names in Room details),
the recipient picker is bounded with truncated chips, and the icon-only Room
details button keeps a 44px target. Adds long-member and closed-room tests at
1440x700 and 700x541.
2026-11-07 05:28:44 -06:00
jason.woltje e27263f455 fix(webui): keep the Room message box in view in short desktop windows
At 100% zoom in windows 541-760px tall the Room page was 60px taller than
the window and the Send to room button started cut off (S10's 160px log
minimum). A short-window Room grid moves the members line beside the
section title and puts the composer on one row; under 650px the header
compacts. Keyed on the CSS viewport only, so 2x displays get the same
layout; page-flow layouts are unchanged.
2026-11-07 04:59:16 -06:00
jason.woltje 0e34b30770 fix(webui): keep a short scroll up off the tail in zoomed transcripts
An upward reader scroll that left the newest message's end at the
viewport bottom still read as at tail, so new content pulled the reader
down past the composer pin. The message-end tail position now counts
only on a downward scroll. A channel-disabled Conversation pins the
newest message instead of a composer that cannot send. S11 and S12
visibility checks require the whole newest message whenever it fits
above the composer.
2026-11-07 04:22:46 -06:00
jason.woltje bb4c176e20 fix(webui): keep the composer in view in zoomed transcripts
In page flow (200% zoom, short or narrow windows) the transcript now
follows with the composer's bottom at the viewport bottom and the newest
message above it. Absent or disabled composers keep the S11 pin. Narrow
Room composers stack in one column. S11's visibility check accepts the
newest message's end when it is taller than half the viewport.
2026-11-07 04:06:17 -06:00
jason.woltje 62ba124f2c fix(webui): keep keyboard focus and reveals on screen in zoomed transcripts
In page flow (200% zoom), the S11 follow logic re-pinned the document on
any scroll without wheel, touch, pointer or scroll-key input, so Tab,
Shift+Tab, focus(), find-style reveals and dialog return focus were pulled
back to the tail with focus thousands of pixels off screen.

Re-pin only a downward scroll with no reader input while following (scroll
anchoring as content grows). Count Tab as reader input, expire the reader
flag after two frames, and resume following when a transcript is opened.
2026-11-07 03:51:59 -06:00
jason.woltje 388fa5d0ca fix(webui): follow transcripts in page flow 2026-11-07 03:21:51 -06:00
jason.woltje 2f4470eed2 fix(webui): keep short 100% windows on the pinned transcript layout
S10 review P1: the max-height:700px page-flow rule moved the composer
off screen on 1440x700 and 1366x650 windows at 100%. Page flow now
applies only at max-height:540px (200% tab zoom on desktop screens) or
below 320px wide. S10 review P2: the moved Room details control keeps
its 44px target.
2026-11-07 03:02:02 -06:00
jason.woltje 66d14c00da fix(webui): keep zoomed transcripts and titles readable 2026-11-07 02:44:37 -06:00
jason.woltje 8832267574 fix(webui): wrap narrow conversation status and keep Overview geometry off Requirements
At 200% zoom on a 390px viewport the compact conversation row held a decision status on one line, so Needs your input pushed the page 12px sideways. The status now takes its own line under the icon and text and wraps. The Overview column margin and split were scoped to Overview, so Requirements keeps its base geometry. Tests cover a real decision status and the Requirements position.
2026-11-07 02:07:29 -06:00
jason.woltje 8aef086838 Fix narrow project reflow and overview action alignment 2026-11-07 01:47:35 -06:00