fix(FN-2586): restore 0.4.x release line and agent log stability

This commit is contained in:
gsxdsm
2026-04-26 12:22:06 -07:00
parent 8097db235a
commit ec3e2cb280
24 changed files with 56 additions and 69 deletions

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Add project-scoped remote access controls across dashboard Settings, dashboard TUI, and `fn serve`, including provider switching, tunnel lifecycle controls, remote URL/QR generation, and hybrid persistent/short-lived auth token flows.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Add full Remote controls to the dashboard TUI Settings view, including provider activation, tunnel lifecycle actions, persistent and short-lived token flows, and terminal-friendly URL/QR hand-off behavior.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": patch
---
Harden Remote Access tunnel lifecycle behavior: tunnel startup remains manual-only, restart restore now uses explicit safety gates (`rememberLastRunning`, prior-running markers, valid provider config, runtime prerequisites), and `/api/remote/status` now reports machine-readable restore diagnostics with consistent dashboard/headless parity.

View File

@@ -1,6 +0,0 @@
---
"@fusion/cli": patch
"@fusion/engine": patch
---
Simplify remote access configuration: remove the separate top-level enable toggle. Remote access is now active when a provider (Tailscale or Cloudflare) is selected and configured.

View File

@@ -1,5 +1,5 @@
--- ---
"@runfusion/fusion": minor "@runfusion/fusion": patch
--- ---
Add Cloudflare Quick Tunnel mode for Remote Access so Fusion can auto-provision an ephemeral `trycloudflare.com` URL via `cloudflared tunnel --url` without requiring a pre-created named tunnel or tunnel token. Add Cloudflare Quick Tunnel mode for Remote Access so Fusion can auto-provision an ephemeral `trycloudflare.com` URL via `cloudflared tunnel --url` without requiring a pre-created named tunnel or tunnel token.

View File

@@ -1,5 +0,0 @@
---
"@runfusion/fusion": minor
---
Release Remote Access as a user-facing Fusion CLI capability: configure provider switching and tunnel lifecycle controls from dashboard/TUI settings, generate tokenized remote login URL/QR handoff flows, and run the same remote-management surface in headless `fn serve` mode.

View File

@@ -1,6 +1,6 @@
# runfusion.ai # runfusion.ai
## 1.0.0 ## 0.4.0
### Patch Changes ### Patch Changes
@@ -15,7 +15,7 @@
- Updated dependencies [39622f0] - Updated dependencies [39622f0]
- Updated dependencies [26f9c74] - Updated dependencies [26f9c74]
- Updated dependencies [9d8852e] - Updated dependencies [9d8852e]
- @runfusion/fusion@1.0.0 - @runfusion/fusion@0.4.0
## 0.2.7 ## 0.2.7

View File

@@ -1,6 +1,6 @@
# @runfusion/fusion # @runfusion/fusion
## 1.0.0 ## 0.4.0
### Minor Changes ### Minor Changes

View File

@@ -1,6 +1,6 @@
# @fusion/core # @fusion/core
## 1.0.0 ## 0.4.0
## 0.2.7 ## 0.2.7

View File

@@ -1,6 +1,6 @@
{ {
"name": "@fusion/core", "name": "@fusion/core",
"version": "1.0.0", "version": "0.4.0",
"license": "MIT", "license": "MIT",
"description": "Fusion core: task store, scheduler, settings, and shared domain types backing the Fusion AI coding agent.", "description": "Fusion core: task store, scheduler, settings, and shared domain types backing the Fusion AI coding agent.",
"homepage": "https://github.com/Runfusion/Fusion#readme", "homepage": "https://github.com/Runfusion/Fusion#readme",

View File

@@ -1,11 +1,11 @@
# @fusion/dashboard # @fusion/dashboard
## 1.0.0 ## 0.4.0
### Patch Changes ### Patch Changes
- @fusion/core@1.0.0 - @fusion/core@0.4.0
- @fusion/engine@1.0.0 - @fusion/engine@0.4.0
## 0.2.7 ## 0.2.7

View File

@@ -185,26 +185,6 @@ export function AgentLogViewer({
} }
}, [isFullscreen, handleKeyDown]); }, [isFullscreen, handleKeyDown]);
if (loading && entries.length === 0) {
return (
<div className="agent-log-viewer" data-testid="agent-log-viewer">
<div className="agent-log-loading">Loading agent logs</div>
</div>
);
}
if (entries.length === 0) {
return (
<div className="agent-log-viewer" data-testid="agent-log-viewer">
<div className="agent-log-empty">No agent output yet.</div>
</div>
);
}
// Reverse entries so newest appear first
const reversedEntries = [...entries].reverse();
const reversedEntryKeys = [...chronologicalEntryKeys].reverse();
const hasExecutorOverride = executorModel?.provider && executorModel?.modelId; const hasExecutorOverride = executorModel?.provider && executorModel?.modelId;
const hasValidatorOverride = validatorModel?.provider && validatorModel?.modelId; const hasValidatorOverride = validatorModel?.provider && validatorModel?.modelId;
const hasPlanningOverride = planningModel?.provider && planningModel?.modelId; const hasPlanningOverride = planningModel?.provider && planningModel?.modelId;
@@ -242,6 +222,26 @@ export function AgentLogViewer({
planningModel, planningModel,
]); ]);
if (loading && entries.length === 0) {
return (
<div className="agent-log-viewer" data-testid="agent-log-viewer">
<div className="agent-log-loading">Loading agent logs</div>
</div>
);
}
if (entries.length === 0) {
return (
<div className="agent-log-viewer" data-testid="agent-log-viewer">
<div className="agent-log-empty">No agent output yet.</div>
</div>
);
}
// Reverse entries so newest appear first
const reversedEntries = [...entries].reverse();
const reversedEntryKeys = [...chronologicalEntryKeys].reverse();
return ( return (
<div <div
ref={containerRef} ref={containerRef}

View File

@@ -36,6 +36,19 @@ describe("AgentLogViewer", () => {
expect(screen.getByText("No agent output yet.")).toBeTruthy(); expect(screen.getByText("No agent output yet.")).toBeTruthy();
}); });
it("rerenders from empty state to populated logs without changing hook order", () => {
const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
const entry = makeEntry({ text: "streamed chunk" });
const { rerender } = render(<AgentLogViewer entries={[]} loading={false} />);
expect(() => {
rerender(<AgentLogViewer entries={[entry]} loading={false} />);
}).not.toThrow();
expect(screen.getByText("streamed chunk")).toBeTruthy();
consoleErrorSpy.mockRestore();
});
it("renders text entries as spans in reverse order (newest first)", () => { it("renders text entries as spans in reverse order (newest first)", () => {
const entries = [ const entries = [
makeEntry({ text: "first chunk" }), makeEntry({ text: "first chunk" }),

View File

@@ -1,6 +1,6 @@
{ {
"name": "@fusion/dashboard", "name": "@fusion/dashboard",
"version": "1.0.0", "version": "0.4.0",
"license": "MIT", "license": "MIT",
"description": "Fusion dashboard: React UI and HTTP API server for monitoring and controlling the Fusion AI coding agent.", "description": "Fusion dashboard: React UI and HTTP API server for monitoring and controlling the Fusion AI coding agent.",
"homepage": "https://github.com/Runfusion/Fusion#readme", "homepage": "https://github.com/Runfusion/Fusion#readme",

View File

@@ -1,6 +1,6 @@
# @fusion/desktop # @fusion/desktop
## 1.0.0 ## 0.4.0
## 0.2.7 ## 0.2.7

View File

@@ -1,6 +1,6 @@
{ {
"name": "@fusion/desktop", "name": "@fusion/desktop",
"version": "1.0.0", "version": "0.4.0",
"license": "MIT", "license": "MIT",
"description": "Fusion desktop: Electron wrapper around the Fusion dashboard for macOS, Windows, and Linux.", "description": "Fusion desktop: Electron wrapper around the Fusion dashboard for macOS, Windows, and Linux.",
"homepage": "https://github.com/Runfusion/Fusion#readme", "homepage": "https://github.com/Runfusion/Fusion#readme",

View File

@@ -1,11 +1,11 @@
# @fusion/engine # @fusion/engine
## 1.0.0 ## 0.4.0
### Patch Changes ### Patch Changes
- @fusion/core@1.0.0 - @fusion/core@0.4.0
- @fusion/pi-claude-cli@1.0.0 - @fusion/pi-claude-cli@0.4.0
## 0.2.7 ## 0.2.7

View File

@@ -1,6 +1,6 @@
{ {
"name": "@fusion/engine", "name": "@fusion/engine",
"version": "1.0.0", "version": "0.4.0",
"license": "MIT", "license": "MIT",
"description": "Fusion engine: executor, merger, scheduler, and automation runtime for the Fusion AI coding agent.", "description": "Fusion engine: executor, merger, scheduler, and automation runtime for the Fusion AI coding agent.",
"homepage": "https://github.com/Runfusion/Fusion#readme", "homepage": "https://github.com/Runfusion/Fusion#readme",

View File

@@ -1,6 +1,6 @@
# @fusion/mobile # @fusion/mobile
## 1.0.0 ## 0.4.0
## 0.2.7 ## 0.2.7

View File

@@ -1,6 +1,6 @@
{ {
"name": "@fusion/mobile", "name": "@fusion/mobile",
"version": "1.0.0", "version": "0.4.0",
"license": "MIT", "license": "MIT",
"description": "Fusion mobile: Capacitor wrapper around the Fusion dashboard for iOS and Android.", "description": "Fusion mobile: Capacitor wrapper around the Fusion dashboard for iOS and Android.",
"homepage": "https://github.com/Runfusion/Fusion#readme", "homepage": "https://github.com/Runfusion/Fusion#readme",

View File

@@ -1,6 +1,6 @@
# @fusion/pi-claude-cli # @fusion/pi-claude-cli
## 1.0.0 ## 0.4.0
## 0.2.7 ## 0.2.7

View File

@@ -1,6 +1,6 @@
{ {
"name": "@fusion/pi-claude-cli", "name": "@fusion/pi-claude-cli",
"version": "1.0.0", "version": "0.4.0",
"description": "Fusion vendored fork: pi coding-agent extension that routes LLM calls through the Claude Code CLI. Forked from rchern/pi-claude-cli (MIT). See UPSTREAM.md.", "description": "Fusion vendored fork: pi coding-agent extension that routes LLM calls through the Claude Code CLI. Forked from rchern/pi-claude-cli (MIT). See UPSTREAM.md.",
"license": "MIT", "license": "MIT",
"private": true, "private": true,

View File

@@ -1,10 +1,10 @@
# @fusion/plugin-sdk # @fusion/plugin-sdk
## 1.0.0 ## 0.4.0
### Patch Changes ### Patch Changes
- @fusion/core@1.0.0 - @fusion/core@0.4.0
## 0.2.7 ## 0.2.7

View File

@@ -1,6 +1,6 @@
{ {
"name": "@fusion/plugin-sdk", "name": "@fusion/plugin-sdk",
"version": "1.0.0", "version": "0.4.0",
"license": "MIT", "license": "MIT",
"description": "Fusion plugin SDK: types and helpers for authoring third-party plugins that extend the Fusion dashboard and engine.", "description": "Fusion plugin SDK: types and helpers for authoring third-party plugins that extend the Fusion dashboard and engine.",
"homepage": "https://github.com/Runfusion/Fusion#readme", "homepage": "https://github.com/Runfusion/Fusion#readme",