diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ac6a71d..ef32c480 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,17 @@ All notable changes to OpenOrbit are documented in this file. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project uses [Semantic Versioning](https://semver.org/). +## [0.12.6] - 2026-09-25 + +### Added + +- Added `orbit --version` for inspecting the installed OpenOrbit version. + +### Fixed + +- Aligned issue discussion typography with the surrounding detail view. +- Kept Run-detail log content within its tab and made the OpenTelemetry trace panel scroll only when needed. + ## [0.12.5] - 2026-09-25 ### Fixed diff --git a/frontend/package.json b/frontend/package.json index 49dd9861..33977c67 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "agent-improvement-console-ui", "private": true, - "version": "0.12.5", + "version": "0.12.6", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/features/evaluations/run-detail-log-panels.tsx b/frontend/src/features/evaluations/run-detail-log-panels.tsx index 9652824b..a7d65507 100644 --- a/frontend/src/features/evaluations/run-detail-log-panels.tsx +++ b/frontend/src/features/evaluations/run-detail-log-panels.tsx @@ -15,5 +15,5 @@ export function CombinedLogPanel({ steps, locale, empty, orbitLogs, targetLogs, timestamp: entry.timestamp, value: `[${entry.level ?? "info"}]${entry.source ? ` ${entry.source}` : ""} ${entry.message}`, })); - return

{orbitLogs}

{logSteps.length ? :

{empty}

}

{targetLogs}

{targetLines.length ? :

{empty}

}

{openTelemetryTrace}

; + return

{orbitLogs}

{logSteps.length ? :

{empty}

}

{targetLogs}

{targetLines.length ? :

{empty}

}

{openTelemetryTrace}

; } diff --git a/frontend/src/features/issues/discussion.css b/frontend/src/features/issues/discussion.css index 9d5ef82b..78089553 100644 --- a/frontend/src/features/issues/discussion.css +++ b/frontend/src/features/issues/discussion.css @@ -2,9 +2,9 @@ .issue-discussion__messages { display:grid; gap:10px; max-height:360px; overflow-y:auto; padding:4px 8px 4px 0; } .issue-message { display:grid; gap:6px; padding:12px; border:1px solid var(--line); border-radius:9px; background:var(--surface-raised); } .issue-message header { display:flex; align-items:baseline; justify-content:space-between; gap:12px; } -.issue-message header strong { font-size:12px; } +.proposal-detail .issue-message header strong { font-size:11px; } .issue-message time,.issue-message small { color:var(--muted); font:10px 'DM Mono',monospace; } -.issue-message p { white-space:pre-wrap; } +.proposal-detail .issue-message p { margin:0; font-size:11px; line-height:1.55; white-space:pre-wrap; } .issue-discussion__composer { display:grid; gap:8px; padding:12px; border:1px solid var(--line); border-radius:9px; background:var(--bg); } .issue-discussion__composer textarea { min-height:96px; resize:vertical; } .issue-discussion__composer .modal-actions { justify-content:flex-end; } diff --git a/frontend/src/theme-overrides.css b/frontend/src/theme-overrides.css index dd14be56..91341261 100644 --- a/frontend/src/theme-overrides.css +++ b/frontend/src/theme-overrides.css @@ -67,6 +67,7 @@ footer { display:flex; align-items:center; justify-content:space-between; margin .proposal-history { display:grid; gap:14px; }.proposal-history .panel-head { margin-bottom:3px; }.proposal-history .hint { max-width:650px; }.proposal-filters { display:flex; gap:8px; flex-wrap:wrap; }.proposal-filters select { width:auto; max-width:230px; }.proposal-summary { display:flex; gap:8px; flex-wrap:wrap; }.proposal-summary span { display:flex; align-items:baseline; gap:6px; padding:8px 10px; border:1px solid var(--line); border-radius:7px; color:var(--muted); background:var(--bg); font-size:10px; }.proposal-summary b { color:var(--text); font:600 16px 'DM Mono',monospace; }.proposal-list { display:grid; border-top:1px solid var(--line); }.proposal-row { display:flex; justify-content:space-between; gap:14px; width:100%; padding:13px 2px; border:0; border-bottom:1px solid var(--line); color:var(--text); background:transparent; text-align:left; }.proposal-row:hover { background:var(--surface-raised); }.proposal-row > div:first-child { display:grid; min-width:0; gap:4px; }.proposal-row small,.proposal-row span { color:var(--muted); font-size:10px; }.proposal-row strong { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:12px; }.proposal-row__meta { display:grid; justify-items:end; align-content:center; gap:6px; white-space:nowrap; }.modal--proposal-detail { width:min(760px,100%); }.proposal-detail { display:grid; gap:18px; }.proposal-detail__summary { display:flex; align-items:center; gap:10px; flex-wrap:wrap; color:var(--muted); font:10px 'DM Mono',monospace; }.proposal-detail section { display:grid; gap:8px; }.proposal-detail h3 { margin:0; font-size:12px; }.proposal-detail p { margin:0; color:var(--muted); font-size:12px; line-height:1.6; }.proposal-detail pre { margin:0; padding:10px; overflow:auto; border-radius:7px; background:var(--bg); color:#8fb8ff; font:11px/1.55 'DM Mono',monospace; white-space:pre-wrap; }.proposal-detail dl { display:flex; flex-wrap:wrap; gap:16px; margin:0; }.proposal-detail dl div { display:grid; min-width:120px; gap:3px; }.proposal-detail dt { color:var(--muted); font-size:9px; text-transform:uppercase; }.proposal-detail dd { max-width:480px; margin:0; overflow-wrap:anywhere; font:11px 'DM Mono',monospace; }.proposal-timeline { display:grid; gap:9px; margin:0; padding:0; list-style:none; }.proposal-timeline li { display:flex; align-items:center; gap:10px; padding-left:10px; border-left:2px solid var(--line); }.proposal-timeline li > div { display:grid; gap:3px; }.proposal-timeline strong { font-size:11px; }.proposal-timeline small { color:var(--muted); font-size:10px; } @media(max-width:720px){.proposal-history .trend-head { align-items:stretch; }.proposal-filters select { width:100%; max-width:none; }.proposal-row { align-items:flex-start; flex-direction:column; }.proposal-row__meta { justify-items:start; }.proposal-detail__summary { align-items:flex-start; flex-direction:column; }} .panel-title-action .panel-head { flex:1; }.panel-title-action__copy { flex:1; min-width:0; }.section-description { margin:5px 0 0; }.panel-title-action:has(.section-description) { margin-bottom:12px; }.panel-head:has(+ .section-description) { margin-bottom:0; }.panel-head + .section-description { margin:5px 0 12px; }.panel-title-action .approve { display:flex; align-items:center; gap:5px; white-space:nowrap; } .timestamped-log-output { max-width:100%; overflow:auto; padding:8px 0; border:1px solid var(--line); border-radius:8px; background:var(--bg); color:var(--text); font:11px/1.55 'DM Mono',monospace; }.timestamped-log-output > div { display:grid; grid-template-columns:172px minmax(0,1fr); min-width:max-content; }.timestamped-log-output time { padding:0 10px; border-right:1px solid var(--line); color:var(--muted); text-align:right; user-select:none; white-space:nowrap; }.timestamped-log-output code { min-width:0; padding:0 12px; color:inherit; white-space:pre; } +.open-telemetry-trace { box-sizing:border-box; width:100%; min-width:0; height:min(360px,calc(100vh - 460px)); min-height:180px; overflow:auto; padding-right:8px; scrollbar-gutter:stable both-edges; }.open-telemetry-trace .telemetry-tree,.open-telemetry-trace .telemetry-tree ul { min-width:0; max-width:100%; }.combined-log-output .open-telemetry-trace .telemetry-tree { max-height:none; overflow:visible; }.open-telemetry-trace .trace-node { box-sizing:border-box; min-width:0; } .setting-prompt-preview { margin:12px 0 0; padding:10px 12px; border:1px solid var(--line); border-radius:7px; color:var(--muted); white-space:pre-wrap; max-height:120px; overflow:auto; } .operational-prompt-warning { display:flex; align-items:flex-start; gap:8px; margin:0; padding:10px 12px; border:1px solid #725c31; border-radius:7px; color:#f2d394; background:#302818; font-size:11px; line-height:1.55; }.operational-prompt-warning svg { flex:none; margin-top:1px; } .app-settings:has(.operational-prompt-warning) { grid-template-columns:1fr; gap:0; }.app-settings:has(.operational-prompt-warning) .panel-title-action { margin-bottom:4px; } @@ -182,7 +183,7 @@ select option[value="docker"] { display:none; } .quick-start-model-profile,.quick-start-profile-form { display:grid; width:100%; min-width:0; gap:10px; }.quick-start-profile-form .modal-setting-row { grid-template-columns:180px minmax(0,1fr); }.quick-start-profile-form input,.quick-start-profile-form select { box-sizing:border-box; width:100%; min-width:0; } .build-runner-workflow { display:grid; gap:8px; }.build-runner-workflow > strong { font-size:12px; }.build-runner-workflow > p,.build-runner-workflow .hint { margin:0; color:var(--muted); font-size:12px; line-height:1.6; }.build-runner-workflow .workflow-graph { height:300px; } .quick-start-card { cursor:default; }.quick-start-card__select { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:start; gap:12px; width:100%; border:0; padding:0; color:inherit; text-align:left; background:transparent; cursor:pointer; }.quick-start-card__select > svg:last-child { display:none; }.template-translation-action { margin-left:auto; display:grid; justify-items:end; gap:4px; }.template-translation-action .hint { margin:0; max-width:220px; } -.run-detail-tab-panel { display:grid; gap:14px; padding-top:14px; }.run-detail-tab-panel__description { margin:0; color:var(--muted); font-size:11px; line-height:1.5; }.run-detail-tab-panel__intro { display:flex; align-items:center; justify-content:space-between; gap:12px; }.run-detail-tab-panel__intro .iteration-navigator { flex:none; min-height:30px; padding:0; border:0; }.tooltip-box { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:start; gap:8px; padding:10px 12px; border:1px solid color-mix(in srgb,var(--accent) 40%,var(--line)); border-radius:8px; color:var(--text); background:color-mix(in srgb,var(--accent) 14%,var(--surface-raised)); font-size:11px; line-height:1.55; }.tooltip-box > svg { margin-top:1px; color:var(--accent); }.tooltip-box > span { min-width:0; }.iteration-candidates { display:flex; justify-content:flex-end; flex-wrap:wrap; gap:6px; padding:8px 0; border-bottom:1px solid var(--line); }.iteration-candidates button { display:flex; align-items:center; gap:6px; padding:4px 7px; border:1px solid var(--line); border-radius:999px; color:var(--muted); background:transparent; font:10px 'DM Mono',monospace; cursor:pointer; }.iteration-candidates button.selected { border-color:color-mix(in srgb,var(--accent) 45%,var(--line)); color:var(--accent); background:color-mix(in srgb,var(--accent) 9%,var(--bg)); }.iteration-candidates small { font:inherit; }.iteration-candidates em { font-style:normal; } @media(max-width:520px){.run-detail-tab-panel__intro { align-items:flex-start; flex-direction:column; }} +.run-detail-tab-panel { display:grid; min-width:0; gap:14px; padding-top:14px; }.run-detail-tab-panel__description { margin:0; color:var(--muted); font-size:11px; line-height:1.5; }.run-detail-tab-panel__intro { display:flex; align-items:center; justify-content:space-between; gap:12px; }.run-detail-tab-panel__intro .iteration-navigator { flex:none; min-height:30px; padding:0; border:0; }.iteration-candidates { display:flex; justify-content:flex-end; flex-wrap:wrap; gap:6px; padding:8px 0; border-bottom:1px solid var(--line); }.iteration-candidates button { display:flex; align-items:center; gap:6px; padding:4px 7px; border:1px solid var(--line); border-radius:999px; color:var(--muted); background:transparent; font:10px 'DM Mono',monospace; cursor:pointer; }.iteration-candidates button.selected { border-color:color-mix(in srgb,var(--accent) 45%,var(--line)); color:var(--accent); background:color-mix(in srgb,var(--accent) 9%,var(--bg)); }.iteration-candidates small { font:inherit; }.iteration-candidates em { font-style:normal; } .run-detail-tab-panel .combined-log-output { width:100%; max-width:100%; min-width:0; }.run-detail-tab-panel .combined-log-output > section { min-width:0; } .tooltip-box { display:grid; grid-template-columns:auto minmax(0,1fr); align-items:start; gap:8px; padding:10px 12px; border:1px solid color-mix(in srgb,var(--accent) 40%,var(--line)); border-radius:8px; color:var(--text); background:color-mix(in srgb,var(--accent) 14%,var(--surface-raised)); font-size:11px; line-height:1.55; }.tooltip-box > svg { margin-top:1px; color:var(--accent); }.tooltip-box > span { min-width:0; } @media(max-width:520px){.run-detail-tab-panel__intro { align-items:flex-start; flex-direction:column; }} .browser-evidence { display:grid; gap:6px; margin:10px 0; padding:10px; border:1px solid var(--line); border-radius:8px; background:var(--surface-raised); font-size:12px; }.browser-evidence > small,.browser-evidence div small { overflow-wrap:anywhere; color:var(--muted); }.browser-evidence div { display:grid; gap:3px; padding-top:7px; border-top:1px solid var(--line); }.browser-evidence b { width:max-content; padding:2px 6px; border-radius:999px; font-size:10px; }.browser-evidence__pass { color:#bdecc8; background:#1e4832; }.browser-evidence__fail { color:#ffc0b7; background:#4b2925; } .run-build__name { display:flex; align-items:center; gap:5px; min-width:0; }.run-build .run-build__orphan { display:inline-flex; flex:none; width:14px; height:14px; padding:0; color:var(--danger); }.run-build__orphan svg { display:block; flex:none; width:14px; height:14px; }.run-build code { overflow:hidden; color:#839088; text-overflow:ellipsis; white-space:nowrap; font:9px 'DM Mono',monospace; }.table .tr > span { min-width:0; overflow:visible; text-overflow:clip; white-space:normal; overflow-wrap:anywhere; word-break:break-word; line-height:1.35; font-size:clamp(9px,.76vw,11px); }.table .tr.th > span { font-size:clamp(8px,.7vw,10px); line-height:1.25; } .workflow-graph { height:378px; min-height:243px; border:1px solid var(--line); border-radius:10px; overflow:hidden; background:var(--surface); }.workflow-graph-node { position:relative; width:250px; border:1px solid var(--line); border-radius:8px; background:var(--surface-raised); color:var(--text); box-shadow:0 8px 22px rgb(0 0 0 / .18); }.workflow-graph .react-flow__handle { pointer-events:none; opacity:0; }.workflow-graph-node header,.workflow-graph-node footer { display:grid; gap:4px; padding:10px; }.workflow-graph-node header { border-bottom:1px solid var(--line); }.workflow-graph-node small { color:var(--muted); font:9px 'DM Mono',monospace; text-transform:uppercase; }.workflow-graph-node strong { font-size:12px; }.workflow-graph-node p { margin:0; padding:10px; color:var(--muted); font-size:11px; }.workflow-graph-node footer { grid-template-columns:1fr 1fr; color:var(--muted); font-size:10px; }.workflow-graph-node--idle { border-color:color-mix(in srgb,var(--line) 72%,var(--bg)); background:color-mix(in srgb,var(--surface-raised) 52%,var(--bg)); color:var(--muted); box-shadow:none; }.workflow-graph-node--running { border-color:var(--accent); box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 38%,transparent),0 0 20px color-mix(in srgb,var(--accent) 42%,transparent); animation:workflow-node-pulse 1.8s ease-in-out infinite; }.workflow-graph-node--running::after { content:""; position:absolute; top:0; left:0; width:18px; height:3px; border-radius:999px; pointer-events:none; background:var(--accent); box-shadow:0 0 7px 2px color-mix(in srgb,var(--accent) 82%,transparent),0 0 16px 3px color-mix(in srgb,var(--accent) 42%,transparent); offset-path:inset(-2px round 9px); offset-anchor:center; offset-rotate:0deg; animation:workflow-border-orbit 2.4s linear infinite; }.workflow-graph-node--failed { border-color:#eaa89f; }.workflow-graph-node--succeeded { border-color:#79c99e; }.workflow-graph-edge--condition .react-flow__edge-path { stroke:#f1d292; stroke-dasharray:5 4; }.workflow-graph-edge--loop .react-flow__edge-path { stroke:#8fb8ff; stroke-dasharray:6 4; }.workflow-graph-edge--error .react-flow__edge-path { stroke:#eaa89f; } @keyframes workflow-node-pulse { 50% { box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 10%,transparent),0 0 30px color-mix(in srgb,var(--accent) 56%,transparent); } } @keyframes workflow-border-orbit { to { offset-distance:100%; } } @media(prefers-reduced-motion:reduce) { .workflow-graph-node--running,.workflow-graph-node--running::after { animation:none; } } diff --git a/orbit/cli.py b/orbit/cli.py index cdfefead..42af80b0 100644 --- a/orbit/cli.py +++ b/orbit/cli.py @@ -10,10 +10,19 @@ import urllib.error import urllib.request import webbrowser +from importlib.metadata import PackageNotFoundError, version from pathlib import Path from typing import Any +def package_version() -> str: + """Return the installed OpenOrbit distribution version.""" + try: + return version("openorbit") + except PackageNotFoundError: + return "unknown" + + def request(base_url: str, path: str, method: str = "GET", payload: dict[str, Any] | None = None) -> Any: """Call the same local API used by the web UI.""" data = json.dumps(payload).encode("utf-8") if payload is not None else None @@ -58,6 +67,7 @@ def task_wait_options(command: argparse.ArgumentParser) -> None: def parser() -> argparse.ArgumentParser: root = argparse.ArgumentParser(prog="orbit", description=__doc__) + root.add_argument("--version", action="version", version=f"%(prog)s {package_version()}") root.add_argument("--url", default=os.environ.get("ORBIT_URL", "http://127.0.0.1:8787")) commands = root.add_subparsers(dest="command", required=True) run = commands.add_parser("run", help="Start the local OpenOrbit web server.") diff --git a/package.json b/package.json index 59810fe4..4dadd956 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openorbit", - "version": "0.12.5", + "version": "0.12.6", "description": "Open control plane for recurring AI automations", "license": "MIT", "type": "module", diff --git a/pyproject.toml b/pyproject.toml index 09b04813..8bbc5b36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "openorbit" -version = "0.12.5" +version = "0.12.6" description = "Open control plane for recurring AI automations" readme = "README.md" license = "MIT" diff --git a/tests/test_cli.py b/tests/test_cli.py index a7d7def9..df3c71d1 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -2,7 +2,9 @@ import sys from types import SimpleNamespace -from orbit.cli import main, parser +import pytest + +from orbit.cli import main, package_version, parser def test_cli_exposes_control_room_commands(): @@ -11,6 +13,14 @@ def test_cli_exposes_control_room_commands(): assert args.workflow_id == "insighta-user-simulation" +def test_cli_prints_the_installed_package_version(capsys): + with pytest.raises(SystemExit) as exit_info: + parser().parse_args(["--version"]) + + assert exit_info.value.code == 0 + assert capsys.readouterr().out == f"orbit {package_version()}\n" + + def test_cli_exposes_local_web_server_command(): args = parser().parse_args(["run", "--host", "0.0.0.0", "--port", "8787", "--reload"]) assert args.command == "run" diff --git a/uv.lock b/uv.lock index 653f6dd5..59d985cd 100644 --- a/uv.lock +++ b/uv.lock @@ -950,7 +950,7 @@ wheels = [ [[package]] name = "openorbit" -version = "0.12.5" +version = "0.12.6" source = { editable = "." } dependencies = [ { name = "fastapi" },