feat(runtime): establish miniapp kernel and sdk design

This commit is contained in:
2026-08-05 00:46:16 +08:00
parent d8aa087bc8
commit 9fb8cd1598
86 changed files with 4615 additions and 1364 deletions
@@ -0,0 +1,25 @@
import { describe, expect, it } from "vitest";
import { AppLifecycleManager } from "@/runtime/app-management/app-lifecycle-manager";
const now = "2026-08-04T00:00:00.000Z";
describe("AppLifecycleManager", () => {
it("preserves the prior foreground instance and restores a bounded workspace snapshot", () => {
const lifecycle = new AppLifecycleManager();
lifecycle.start({ instance_id: "interaction:audio-001", app_scope: "chat", conversation_id: "conversation" }, now);
lifecycle.foreground("interaction:audio-001", now);
lifecycle.start({ instance_id: "draw-and-guess:game-001", app_scope: "draw-and-guess", conversation_id: "conversation", parent_instance_id: "interaction:audio-001" }, now);
lifecycle.foreground("draw-and-guess:game-001", now);
expect(lifecycle.instances.get("interaction:audio-001")).toMatchObject({ state: "background" });
expect(lifecycle.instances.get("draw-and-guess:game-001")).toMatchObject({ state: "foreground" });
expect(lifecycle.focus.history()).toEqual(["interaction:audio-001", "draw-and-guess:game-001"]);
lifecycle.close("draw-and-guess:game-001", now);
lifecycle.foreground("interaction:audio-001", now);
const restored = new AppLifecycleManager();
restored.restore(lifecycle.snapshot());
expect(restored.focus.foreground()).toBe("interaction:audio-001");
expect(restored.instances.get("draw-and-guess:game-001")).toMatchObject({ state: "stopped" });
});
});