feat(FN-2477): add executable OpenClaw runtime adapter

- Replace deferred OpenClaw placeholder runtime with an executable adapter that creates sessions, prompts with fallback, describes models, and disposes safely
- Add a dedicated pi-module seam and local runtime contract types to decouple plugin compilation from engine internals while preserving runtime behavior
- Update OpenClaw plugin metadata, manifest/package descriptions, and README to reflect active execution support instead of deferred status
- Harden dashboard DevServerStore save flow against ENOENT temp-directory races and add regression coverage for project-directory removal during save
This commit is contained in:
Fusion
2026-04-24 10:55:28 -07:00
committed by gsxdsm
parent d92dc37f92
commit 403e3a751a
18 changed files with 391 additions and 125 deletions

View File

@@ -2414,6 +2414,16 @@ describe("SettingsModal", () => {
});
it("re-opening modal shows previously saved notification settings", async () => {
const openNotificationsSection = () => {
const notificationsButton = screen.queryByRole("button", { name: /Notifications/ });
if (notificationsButton) {
fireEvent.click(notificationsButton);
} else {
// Mobile layout uses the section picker dropdown instead of sidebar buttons.
fireEvent.change(screen.getByLabelText("Settings Section"), { target: { value: "notifications" } });
}
};
// First render with ntfy enabled
(fetchSettings as ReturnType<typeof vi.fn>).mockResolvedValueOnce({
...defaultSettings,
@@ -2424,7 +2434,7 @@ describe("SettingsModal", () => {
const { unmount } = render(<SettingsModal onClose={onClose} addToast={addToast} />);
await waitFor(() => expect(fetchSettings).toHaveBeenCalled());
fireEvent.click(screen.getByText("Notifications"));
openNotificationsSection();
const checkbox = screen.getByLabelText("Enable ntfy.sh notifications") as HTMLInputElement;
expect(checkbox.checked).toBe(true);
const input = screen.getByLabelText("ntfy Topic") as HTMLInputElement;
@@ -2443,7 +2453,7 @@ describe("SettingsModal", () => {
render(<SettingsModal onClose={onClose} addToast={addToast} />);
await waitFor(() => expect(fetchSettings).toHaveBeenCalled());
fireEvent.click(screen.getByText("Notifications"));
openNotificationsSection();
const newCheckbox = screen.getByLabelText("Enable ntfy.sh notifications") as HTMLInputElement;
expect(newCheckbox.checked).toBe(true);
const newInput = screen.getByLabelText("ntfy Topic") as HTMLInputElement;