From 849bfed3beaa306e87b4b4031f17b006d2089ac3 Mon Sep 17 00:00:00 2001 From: Ivan Cheung Date: Wed, 2 Sep 2026 15:10:23 -0400 Subject: [PATCH 1/5] fix: four defects found reviewing the stack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A review pass over the nineteen PRs, aimed at the seams where a bug is expensive and where the tests were most likely to be confirming themselves. Each finding was reproduced against running code before it was fixed. The bridge refused the app it ships with. DEFAULT_ORIGINS carries no port and originAllowed compared ports exactly, so a page served by `npm run serve` on 8123 got 403 on every write — jobs and notify, the whole point of the bridge, dead on the documented setup path. Health is a GET answered before auth, so discovery and the e2e's bridge probe both looked fine. Worse, a test asserted the broken behaviour: bridge.test.ts pinned `http://127.0.0.1:9999` to false, and every server test sent a port-less origin no browser will ever send. Loopback hosts are now trusted on any port. The port was never a boundary — a browser sets Origin itself, so a remote page cannot claim to be loopback, and the hostname check is what stops DNS rebinding. An explicitly paired host stays pinned to its port. A restore could swallow a write that was in flight. Store.restore awaited the write queue without joining it, so an apply issued in the same tick chained off the same resolved promise and ran alongside the replace: the entry landed, the replace wiped it, and apply resolved as though it had saved. IndexedDB masks this by serialising overlapping readwrite transactions, so the guarantee came from the backend rather than from the Store — and the memory backend, which is what a private window actually runs on, loses the write outright. The regression test is pinned to that backend, where it fails without the fix. A pack that declared no writes could write anywhere. Enforcement read a missing key as "allow everything", which is the inversion of the whole premise that a pack is data, and the authoring prompt told the model it only *may* declare one. Deny by default; the prompt now says a pack with no writes is refused every change it tries to make. All five bundled packs already declare theirs. Also: restore took a `by` and dropped it on the floor, promising an attribution Activity could never show — the parameter is gone, and recording who restored needs a place in the log to put it. And readBackup only rejected format numbers above 1, so a file claiming 0, a negative or a non-integer was read as current. Co-Authored-By: Claude Opus 5 (1M context) --- docs/lifeboard/bridge.md | 9 +++-- packages/cli/src/bridge/security.ts | 19 ++++++++-- packages/cli/test/bridge.test.ts | 35 ++++++++++++++++-- packages/lifeboard/src/backup.ts | 10 +++--- packages/lifeboard/src/packs/authoring.ts | 2 +- packages/lifeboard/src/packs/types.ts | 7 +++- packages/lifeboard/src/shell.ts | 7 ++-- packages/lifeboard/src/store.ts | 20 +++++++++-- packages/lifeboard/src/views/connections.ts | 2 +- packages/lifeboard/test/backup.test.ts | 39 ++++++++++++++++++--- packages/lifeboard/test/recipe-flow.test.ts | 21 +++++++++++ 11 files changed, 146 insertions(+), 25 deletions(-) diff --git a/docs/lifeboard/bridge.md b/docs/lifeboard/bridge.md index dbb8e5c8..2e5bea07 100644 --- a/docs/lifeboard/bridge.md +++ b/docs/lifeboard/bridge.md @@ -32,7 +32,7 @@ Then in the app: **Connect → Your Mac → Look for a bridge**, paste the token |------|--------------| | `--port ` | Listen somewhere other than 8787 | | `--token ` | Use a fixed token instead of a fresh one each start | -| `--allow-origin ` | Also trust this origin — needed for a tunnel, or a LAN address | +| `--allow-origin ` | Also trust this origin — needed for a tunnel or a LAN address, not for `localhost` | | `--schedule` | Also run the scheduled boards in `.termchart/boards` | ## What it will use @@ -57,7 +57,10 @@ A program that can run your authenticated AI agents is worth breaking into, so: - **A token**, generated per run, printed once, never written to disk, compared in constant time. - **Origin checking** on anything that changes something. Any web page you visit can POST to `127.0.0.1`, so the token alone is not enough — a page in your browser could have been handed one. - Only origins the bridge was started with get through. + Only origins the bridge was started with get through. `localhost` and `127.0.0.1` are trusted on + **any port**, because the port is not a boundary: a browser sets `Origin` itself, so a page on the + open internet cannot claim to be loopback, and it is the hostname that stops DNS rebinding. A host + you pair explicitly is pinned to the port you paired it on. - **Health is the only unauthenticated route**, and it says nothing a stranger could use. It exists so the app can tell "no bridge" apart from "wrong token". @@ -93,6 +96,6 @@ cost them. |---|---| | "No bridge running" | Start it. Check the port matches (8787 or 8788 are probed). | | "The bridge did not recognise that token" | It prints a new one each start — paste the current one, or use `--token` | -| "The bridge is not paired with this address" | Restart with `--allow-origin ` | +| "The bridge is not paired with this address" | You opened the app somewhere other than `localhost` — restart with `--allow-origin ` | | "Claude Code is installed but not signed in" | Run its login command in a terminal | | "…did not finish in time" | The agent hung. Try a smaller question. | diff --git a/packages/cli/src/bridge/security.ts b/packages/cli/src/bridge/security.ts index 879880ab..373ceaf2 100644 --- a/packages/cli/src/bridge/security.ts +++ b/packages/cli/src/bridge/security.ts @@ -13,7 +13,16 @@ import { randomBytes, timingSafeEqual } from "node:crypto"; export const LOOPBACK = "127.0.0.1"; -/** Origins the bridge answers. A tunnel host is added at pairing time. */ +/** Hosts that can only mean this machine. A page served from anywhere else cannot claim one. */ +const LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "::1", "[::1]"]); + +/** + * Origins the bridge answers. A tunnel host is added at pairing time. + * + * The loopback entries carry no port on purpose — see `originAllowed`. `npm run serve` hosts + * lifeboard on 8123, a dev server picks its own, and demanding a port here meant the bridge + * refused every write from the app it ships with. + */ export const DEFAULT_ORIGINS = [ "http://127.0.0.1", "http://localhost", @@ -57,7 +66,13 @@ export function originAllowed(origin: string | undefined, policy: OriginPolicy): return policy.allowed.some((a) => { try { const b = new URL(a); - return b.protocol === parsed.protocol && b.hostname === parsed.hostname && (b.port || "") === (parsed.port || ""); + if (b.protocol !== parsed.protocol || b.hostname !== parsed.hostname) return false; + // A loopback entry written without a port trusts that host on any port. The port is not a + // security boundary: a browser sets Origin itself, so a page cannot claim to be loopback + // when it is not, and what actually stops DNS rebinding is the hostname check above. An + // entry that *does* name a port is still matched exactly, so a paired tunnel stays pinned. + if (b.port === "" && LOOPBACK_HOSTS.has(b.hostname)) return true; + return b.port === parsed.port; } catch { return false; } diff --git a/packages/cli/test/bridge.test.ts b/packages/cli/test/bridge.test.ts index 6ba10df3..a6186339 100644 --- a/packages/cli/test/bridge.test.ts +++ b/packages/cli/test/bridge.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect, vi } from "vitest"; -import { authorise, bearerOf, newToken, originAllowed, tokenMatches } from "../src/bridge/security.js"; +import { authorise, bearerOf, DEFAULT_ORIGINS, newToken, originAllowed, tokenMatches } from "../src/bridge/security.js"; import { detectDrivers, runDriver, type CapturingSpawn } from "../src/bridge/drivers.js"; import { Jobs, parseStep } from "../src/bridge/jobs.js"; import { approveMessage, notify, smsLink } from "../src/bridge/notify.js"; @@ -29,15 +29,37 @@ describe("security", () => { expect(bearerOf(undefined)).toBeUndefined(); }); - it("matches an origin on scheme, host and port — not by prefix", () => { + it("matches an origin on scheme and host — not by prefix", () => { expect(originAllowed("http://127.0.0.1", POLICY)).toBe(true); expect(originAllowed("https://lifeboard.local", POLICY)).toBe(true); expect(originAllowed("http://127.0.0.1.evil.com", POLICY)).toBe(false); expect(originAllowed("https://lifeboard.local.evil.com", POLICY)).toBe(false); - expect(originAllowed("http://127.0.0.1:9999", POLICY)).toBe(false); expect(originAllowed("not a url", POLICY)).toBe(false); }); + // This test used to assert the opposite, and in doing so it certified a bug: the app is served on + // 8123 by `npm run serve` and on whatever port a dev server picks, so demanding port 80 meant the + // bridge refused every write from the app it ships with. + it("trusts a loopback host on whatever port the app happens to be served from", () => { + // Against the policy the server actually ships, not a hand-written one: the bug lived in the + // combination of the default list and the match, so testing either alone would have missed it. + const shipped = { allowed: DEFAULT_ORIGINS }; + expect(originAllowed("http://localhost:8123", shipped)).toBe(true); + expect(originAllowed("http://localhost:5173", shipped)).toBe(true); + expect(originAllowed("http://127.0.0.1:8123", shipped)).toBe(true); + expect(originAllowed("http://127.0.0.1:9999", POLICY)).toBe(true); + }); + + it("does not extend that leniency past loopback", () => { + // A named host is pinned to the port it was paired on: a tunnel is not the family's own machine. + expect(originAllowed("https://lifeboard.local:8123", POLICY)).toBe(false); + expect(originAllowed("https://evil.example:8123", POLICY)).toBe(false); + // The scheme still has to match, so an http page cannot borrow an https pairing. + expect(originAllowed("https://127.0.0.1:8123", POLICY)).toBe(false); + // And an explicit port in the allow-list stays exact. + expect(originAllowed("http://localhost:3001", { allowed: ["http://localhost:3000"] })).toBe(false); + }); + it("refuses a write from a page we do not know, even with the right token", () => { const token = newToken(); expect(authorise({ method: "POST", token, authorization: `Bearer ${token}`, origin: "https://evil.example", policy: POLICY })) @@ -253,6 +275,13 @@ describe("the server", () => { expect(r.body).toEqual({ output: "hi from claude" }); }); + // The regression that matters: every server test here used to send a port-less origin, which no + // browser ever sends. `npm run serve` hosts the app on 8123, and this POST came back 403. + it("accepts a run from the app on the port `npm run serve` actually uses", async () => { + const r = await call(createBridge(opts), "POST", "/agents/claude/run", { token: "tok", origin: "http://localhost:8123", body: { prompt: "hello" } }); + expect(r.status).not.toBe(403); + }); + it("refuses a run from an origin it was never paired with", async () => { const r = await call(createBridge(opts), "POST", "/agents/claude/run", { token: "tok", origin: "https://evil.example", body: { prompt: "hello" } }); expect(r.status).toBe(403); diff --git a/packages/lifeboard/src/backup.ts b/packages/lifeboard/src/backup.ts index ae69ab2e..05303899 100644 --- a/packages/lifeboard/src/backup.ts +++ b/packages/lifeboard/src/backup.ts @@ -11,7 +11,7 @@ // before it does it. Merging devices is a real feature and it needs a real design; pretending this // is that would lose someone's data quietly. -import type { Entry, By, CollectionName } from "./types.js"; +import type { Entry, CollectionName } from "./types.js"; import type { Store } from "./store.js"; export const BACKUP_VERSION = 1; @@ -60,7 +60,9 @@ export function readBackup(text: string): ReadResult { } if (!isObj(v) || v.format !== "lifeboard-backup") return { ok: false, error: "That file is not a lifeboard backup." }; - if (typeof v.version !== "number" || v.version > BACKUP_VERSION) + if (typeof v.version !== "number" || !Number.isInteger(v.version) || v.version < 1) + return { ok: false, error: `That backup's format number (${String(v.version)}) is not one lifeboard writes; the file is damaged.` }; + if (v.version > BACKUP_VERSION) return { ok: false, error: `That backup was made by a newer version of lifeboard (format ${String(v.version)}). Update first.` }; if (!Array.isArray(v.entries)) return { ok: false, error: "That backup has no entries in it." }; @@ -103,8 +105,8 @@ export function previewRestore(store: Store, backup: Backup): RestorePreview { * Replace everything with the backup. The caller is expected to have shown `previewRestore` and got * an answer first; this does not ask. */ -export async function restoreBackup(store: Store, backup: Backup, by: By): Promise { - await store.restore(backup.entries, by); +export async function restoreBackup(store: Store, backup: Backup): Promise { + await store.restore(backup.entries); return backup.entries.length; } diff --git a/packages/lifeboard/src/packs/authoring.ts b/packages/lifeboard/src/packs/authoring.ts index ba3f65d0..4953983c 100644 --- a/packages/lifeboard/src/packs/authoring.ts +++ b/packages/lifeboard/src/packs/authoring.ts @@ -32,7 +32,7 @@ const RULES = [ "A pack is DATA. It cannot contain code, functions, or URLs to code.", `It may declare actions whose capability is one of: ${CAPABILITIES.join(", ")}.`, `It may name a view builder, one of: ${BUILDERS.join(", ")}. It cannot supply one.`, - "It may declare `writes`, the collections it is allowed to change: item, recipe, event, contact.", + "It MUST declare `writes` if any of its actions change anything — the collections it may touch, from: item, recipe, event, contact, card. A pack with no `writes` is refused every change it tries to make.", "If the board's data comes from a web feed, give `source` as {\"kind\":\"api\",\"url\":\"https://…\"} and a `refresh` policy. https only.", "If it comes from the family's own records, give `source` as {\"kind\":\"derived\",\"from\":[\"item\"],\"query\":{\"collection\":\"item\"}}.", ].join("\n"); diff --git a/packages/lifeboard/src/packs/types.ts b/packages/lifeboard/src/packs/types.ts index 176d6eaa..c2199f11 100644 --- a/packages/lifeboard/src/packs/types.ts +++ b/packages/lifeboard/src/packs/types.ts @@ -66,7 +66,12 @@ export interface Pack { view?: PackView; source?: DataSource; refresh?: RefreshPolicy; - /** The collections this pack may write. An authorisation boundary, not documentation. */ + /** + * The collections this pack may write. An authorisation boundary, not documentation, and it + * denies by default: a pack that omits this may change nothing. Optional in the schema so an + * inert pack — one that only contributes prompt guidance and a view — need not carry an empty + * array, never so that omitting it buys a wider permission than declaring it. + */ writes?: CollectionName[]; actions?: PackAction[]; space?: string; diff --git a/packages/lifeboard/src/shell.ts b/packages/lifeboard/src/shell.ts index 269ea382..ac32cc20 100644 --- a/packages/lifeboard/src/shell.ts +++ b/packages/lifeboard/src/shell.ts @@ -338,8 +338,11 @@ export async function startShell(deps: ShellDeps): Promise { targetId, servings: params.servings, }); - const allowed = pack.writes ? new Set(pack.writes) : null; - const mutations = (result.mutations ?? []).filter((m: Mutation) => !allowed || allowed.has(m.collection)); + // Deny by default. A pack that declares no `writes` may change nothing — reading the missing + // key as "allow everything" inverted the whole premise that a pack is data, and the authoring + // prompt happily produced packs without one. + const allowed = new Set(pack.writes ?? []); + const mutations = (result.mutations ?? []).filter((m: Mutation) => allowed.has(m.collection)); const refused = (result.mutations?.length ?? 0) - mutations.length; const entries = mutations.length ? await store.apply(mutations, by()) : []; diff --git a/packages/lifeboard/src/store.ts b/packages/lifeboard/src/store.ts index 076a8779..f2abbea4 100644 --- a/packages/lifeboard/src/store.ts +++ b/packages/lifeboard/src/store.ts @@ -154,14 +154,28 @@ export class Store { /** * Replace the log wholesale — a restore from a backup, and nothing else. Everything currently * here is gone afterwards, which is why the caller has to have asked first. + * + * This takes no `by`: the restored log is someone else's history and there is nowhere honest to + * record the restorer inside it. It used to accept one and drop it on the floor, which promised + * an attribution the Activity screen could never show. */ - async restore(entries: readonly Entry[], by: By): Promise { - await this.queue.then(() => this.backend.replace(entries)); + restore(entries: readonly Entry[]): Promise { + // Queued like every other write, not merely awaited behind it. Awaiting the queue without + // joining it let an apply() issued in the same tick chain off the same already-resolved + // promise and run *alongside* the replace: the entry was appended, the replace wiped it, and + // apply() resolved without an error. That is S1's silent write loss, on the one path where + // someone is already recovering data they thought they had lost. + const run = this.queue.then(() => this.swap(entries)); + this.queue = run.catch(() => undefined); + return run; + } + + private async swap(entries: readonly Entry[]): Promise { + await this.backend.replace(entries); this.entries = [...entries].sort((a, b) => a.seq - b.seq); this.view = materialise(this.entries); // Everything changed, so tell every listener about every collection that now exists. this.announce(new Set(this.entries.map((e) => e.collection))); - void by; } subscribe(fn: Listener): () => void { diff --git a/packages/lifeboard/src/views/connections.ts b/packages/lifeboard/src/views/connections.ts index 2748e81e..e66bfdc3 100644 --- a/packages/lifeboard/src/views/connections.ts +++ b/packages/lifeboard/src/views/connections.ts @@ -329,7 +329,7 @@ export function renderConnections(el: HTMLElement, props: ConnectionsProps): voi go.className = view.losesData ? "lb-danger" : "lb-primary"; go.textContent = view.losesData ? "Replace everything" : "Restore"; go.addEventListener("click", () => { - void restoreBackup(store, read.backup as Backup, props.by ?? { kind: "code", fn: "restore" }).then((n) => { + void restoreBackup(store, read.backup as Backup).then((n) => { outcome.textContent = `Restored ${n} changes.`; onChange(); }); diff --git a/packages/lifeboard/test/backup.test.ts b/packages/lifeboard/test/backup.test.ts index 6c866766..718ed369 100644 --- a/packages/lifeboard/test/backup.test.ts +++ b/packages/lifeboard/test/backup.test.ts @@ -4,7 +4,7 @@ import { describe, it, expect } from "vitest"; import { backupFilename, exportBackup, previewRestore, readBackup, restoreBackup } from "../src/backup.js"; import { renderConnections } from "../src/views/connections.js"; import { memoryPrefs } from "../src/prefs.js"; -import { openStore } from "../src/store.js"; +import { memoryBackend, openStore, Store } from "../src/store.js"; import { add, update, del, type By, type Item } from "../src/types.js"; const you: By = { kind: "human", profile: "ivan" }; @@ -50,6 +50,13 @@ describe("reading a backup", () => { expect(readBackup('{"hello":"world"}')).toMatchObject({ ok: false, error: expect.stringMatching(/not a lifeboard backup/) }); }); + it("refuses a format number it never writes, rather than reading it as version 1", () => { + for (const version of [0, -1, 1.5, Number.NaN]) { + expect(readBackup(JSON.stringify({ format: "lifeboard-backup", version, entries: [] }))) + .toMatchObject({ ok: false, error: expect.stringMatching(/damaged/) }); + } + }); + it("refuses a backup from a newer version rather than guessing", () => { expect(readBackup(JSON.stringify({ format: "lifeboard-backup", version: 99, entries: [] }))) .toMatchObject({ ok: false, error: expect.stringMatching(/newer version/) }); @@ -86,7 +93,7 @@ describe("restoring", () => { it("puts a backup into an empty device", async () => { const backup = exportBackup(await populated()); const target = await fresh(); - expect(await restoreBackup(target, backup, you)).toBe(3); + expect(await restoreBackup(target, backup)).toBe(3); expect(target.list("item")[0]).toMatchObject({ text: "Milk", done: true }); expect(target.list("event")).toHaveLength(1); expect(target.history()).toHaveLength(3); @@ -96,7 +103,7 @@ describe("restoring", () => { const backup = exportBackup(await populated()); const name = `lb-backup-${++n}`; const target = await openStore(name); - await restoreBackup(target, backup, you); + await restoreBackup(target, backup); target.close(); const reopened = await openStore(name); expect(reopened.list("item")[0]).toMatchObject({ text: "Milk", done: true }); @@ -106,7 +113,7 @@ describe("restoring", () => { const backup = exportBackup(await populated()); const target = await fresh(); await target.apply([add("item", { space: "shared", text: "Something else" })], you); - await restoreBackup(target, backup, you); + await restoreBackup(target, backup); expect(target.list("item").map((i) => i.text)).toEqual(["Milk"]); // The next write continues the restored numbering rather than colliding with it. @@ -114,10 +121,32 @@ describe("restoring", () => { expect(target.history().map((e) => e.seq)).toEqual([1, 2, 3, 4]); }); + // Found by review. `restore` awaited the write queue without joining it, so an `apply` issued in + // the same tick chained off the same already-resolved promise and ran alongside the replace. + // + // Under IndexedDB this is masked: IDB serialises overlapping readwrite transactions on a store, + // so the append lands after the replace commits. The guarantee therefore came from the backend, + // not from the Store — and the memory backend, which is what a private window or a device with + // storage disabled actually runs on, loses the write outright and resolves as though it saved it. + it("does not swallow a write that was in flight when the restore began", async () => { + const backup = exportBackup(await populated()); + const target = await Store.on(memoryBackend()); + await target.apply([add("item", { space: "shared", text: "Already here" })], you); + + const restoring = target.restore(backup.entries); + const writing = target.apply([add("item", { space: "shared", text: "Typed while restoring" })], you); + await Promise.all([restoring, writing]); + await target.settled(); + + const texts = target.list("item").map((i) => i.text); + // Either ordering is defensible; losing the write silently is not. + expect(texts).toContain("Typed while restoring"); + }); + it("keeps history and undo working after a restore", async () => { const backup = exportBackup(await populated()); const target = await fresh(); - await restoreBackup(target, backup, you); + await restoreBackup(target, backup); expect(target.history("item/milk").map((e) => e.op)).toEqual(["assert", "correct"]); await target.apply([del("item", "milk")], you); expect(target.list("item")).toHaveLength(0); diff --git a/packages/lifeboard/test/recipe-flow.test.ts b/packages/lifeboard/test/recipe-flow.test.ts index 2d11e0e1..17641de9 100644 --- a/packages/lifeboard/test/recipe-flow.test.ts +++ b/packages/lifeboard/test/recipe-flow.test.ts @@ -189,6 +189,27 @@ describe("the recipe flow, end to end", () => { shell.destroy(); }); + // Found by review: enforcement read a missing `writes` as "allow everything", so the one kind of + // pack most likely to omit the key — a model-authored one, since the authoring prompt said it + // *may* declare writes — got the widest permission of all. Deny by default. + it("refuses every write from a pack that declares none", async () => { + const { store, shell, r } = await boot([JSON.stringify(PANCAKES)]); + await shell.console.send("dinner tonight"); + await settleWith(store); + await installPack(store, { + id: "recipes", name: "Recipes", version: "1.0.2", triggers: ["dinner"], prompt: "x", + actions: [{ id: "to-list", label: "Add to shopping list", capability: "recipe.merge" }], + }, by); + shell.redraw(); + const before = store.list("item").length; + click(r.actions, "Add to shopping list"); + await settleWith(store); + + expect(store.list("item")).toHaveLength(before); + expect(shell.console.lines().at(-1)!.text).toMatch(/refused/); + shell.destroy(); + }); + it("offers only the shop handoff on the shopping list itself", async () => { const { store, shell, r } = await boot(['{"reply":"ok"}']); await shell.navigate({ mode: "focused", view: "groceries" }); From c320e86b226123ad74d302d1df06f3973bf54202 Mon Sep 17 00:00:00 2001 From: Ivan Cheung Date: Fri, 4 Sep 2026 17:23:45 -0400 Subject: [PATCH 2/5] =?UTF-8?q?docs:=20SP-A=20plan=20=E2=80=94=20rename=20?= =?UTF-8?q?lifeboard=20package=20to=20termchart-client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04-rename-lifeboard-to-termchart-client.md | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 docs/superpowers/plans/2026-09-04-rename-lifeboard-to-termchart-client.md diff --git a/docs/superpowers/plans/2026-09-04-rename-lifeboard-to-termchart-client.md b/docs/superpowers/plans/2026-09-04-rename-lifeboard-to-termchart-client.md new file mode 100644 index 00000000..d56ee33a --- /dev/null +++ b/docs/superpowers/plans/2026-09-04-rename-lifeboard-to-termchart-client.md @@ -0,0 +1,96 @@ +# Rename `lifeboard` package → `termchart-client` (SP-A) Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Rename termchart's client package from `lifeboard` (`@ivanmkc/termchart-lifeboard`) to `termchart-client` (`@ivanmkc/termchart-client`), keeping the build and test suite green. + +**Architecture:** A single atomic rename in the termchart repo: move the package directory, change its `name`, and update every reference to the old name/path. The rename must complete as one unit — a partial rename breaks the workspace build. + +**Tech Stack:** npm workspaces (`packages/*` glob), TypeScript, esbuild. + +**Spec:** `agent-bridge:docs/superpowers/specs/2026-09-04-consolidate-into-agent-bridge-design.md` (Sub-project A). + +## Global Constraints + +- Scope is the **package rename only** — NOT the ~55-file brand/text sweep of the word "lifeboard" (docs/UI copy/branch name). Leave textual/brand occurrences alone; a deliberate brand sweep is a separate follow-up. +- Preserve git history (`git mv`). +- termchart `npm test` and all package builds stay green. +- `grep -rI "@ivanmkc/termchart-lifeboard"` returns nothing outside `node_modules`/`dist` when done. +- Do not touch `packages/canvas` or `packages/core` (agent-bridge consumes those unchanged). + +--- + +### Task 1: Atomic package rename + +**Files:** +- Move: `packages/lifeboard/` → `packages/termchart-client/` +- Modify: `packages/termchart-client/package.json` (the `name` field) +- Modify: every file referencing `@ivanmkc/termchart-lifeboard` (~6) or the path `packages/lifeboard` (~6) — enumerate in Step 3 (sibling `package.json` deps, root/workspace build scripts, `tsconfig` references/paths, CI configs, any imports) + +**Interfaces:** +- Consumes: nothing (leaf change). +- Produces: the package is now `@ivanmkc/termchart-client` at `packages/termchart-client`. Any external consumer (e.g. agent-bridge, later) imports `@ivanmkc/termchart-canvas`/`-core`, NOT this package — so no downstream contract changes. + +- [ ] **Step 1: Branch** + +```bash +cd ~/code/termchart +git checkout -b rename/termchart-client +``` + +- [ ] **Step 2: Enumerate references BEFORE moving (record them)** + +```bash +grep -rn "@ivanmkc/termchart-lifeboard" . --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist +grep -rn "packages/lifeboard" . --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist +``` +Expected: ~6 files each. Save the list — these are exactly what Step 4 edits. + +- [ ] **Step 3: Move the directory (history-preserving)** + +```bash +git mv packages/lifeboard packages/termchart-client +``` + +- [ ] **Step 4: Rename the package + update every reference** + +In `packages/termchart-client/package.json`, change `"name": "@ivanmkc/termchart-lifeboard"` → `"name": "@ivanmkc/termchart-client"`. + +Then, for each file from Step 2, replace `@ivanmkc/termchart-lifeboard` → `@ivanmkc/termchart-client` and `packages/lifeboard` → `packages/termchart-client`. Common spots: root `package.json` scripts (e.g. a `build:*`/workspace filter), sibling packages' `dependencies`/`devDependencies`, `tsconfig*.json` `references`/`paths`, CI workflow files. + +- [ ] **Step 5: Reinstall so the workspace re-links the renamed package** + +```bash +npm install +``` +Expected: completes without unresolved-workspace errors. + +- [ ] **Step 6: Verify build + tests are green** + +```bash +npm run build --workspaces --if-present +npm test +``` +Expected: PASS (same result as before the rename). If the client package has its own `build`/`test:e2e`, run those too. + +- [ ] **Step 7: Verify no stale references remain** + +```bash +grep -rn "@ivanmkc/termchart-lifeboard" . --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist ; echo "exit=$?" +``` +Expected: no matches (grep exit 1). If any remain, fix and re-run Step 6. + +- [ ] **Step 8: Commit** + +```bash +git add -A +git commit -m "refactor: rename lifeboard package to termchart-client" +``` + +--- + +## Self-Review + +- **Spec coverage:** SP-A "package rename only, brand sweep out of scope" → Task 1 (Global Constraints exclude the brand sweep). ✅ +- **Placeholder scan:** reference lists are enumerated by real grep commands in Steps 2/7, not left as "TBD". ✅ +- **Type consistency:** only the package name/path change; no API/type changes; consumers use canvas/core, untouched. ✅ From 35a0e5e2f85e0a3c44fb8d80acaf50a737a151e2 Mon Sep 17 00:00:00 2001 From: Ivan Cheung Date: Fri, 4 Sep 2026 17:36:58 -0400 Subject: [PATCH 3/5] refactor: rename lifeboard package to termchart-client --- .../progress.md | 13 + .../task-1-brief.md | 70 ++ .../task-1-report.md | 120 ++ README.md | 2 +- docs/lifeboard/README.md | 2 +- docs/lifeboard/qa-guide.md | 12 +- package-lock.json | 1040 +++++++++-------- .../{lifeboard => termchart-client}/README.md | 8 +- .../e2e/offline.e2e.mjs | 0 .../package.json | 2 +- .../scripts/serve.mjs | 2 +- .../src/actions/bar.ts | 0 .../src/actions/cart.ts | 0 .../src/agent/connections.ts | 0 .../src/agent/envelope.ts | 0 .../src/agent/loop.ts | 0 .../src/agent/prompt.ts | 0 .../src/agent/providers/anthropic.ts | 0 .../src/agent/providers/fake.ts | 0 .../src/agent/providers/google.ts | 0 .../src/agent/providers/openai-shape.ts | 0 .../src/agent/providers/openai.ts | 0 .../src/agent/providers/openrouter.ts | 0 .../src/agent/providers/types.ts | 0 .../src/app.ts | 0 .../src/backup.ts | 0 .../src/boards.ts | 0 .../src/bridge/client.ts | 0 .../src/connectors/deeplinks.ts | 0 .../src/console.ts | 0 .../src/contacts.ts | 0 .../src/css.d.ts | 0 .../src/google/calendar.ts | 0 .../src/google/gmail.ts | 0 .../src/google/oauth.ts | 0 .../src/google/sync.ts | 0 .../src/index.html | 0 .../src/jobs/card.ts | 0 .../src/jobs/mirror.ts | 0 .../src/log.ts | 0 .../src/mail/classify.ts | 0 .../src/mail/extract.ts | 0 .../src/mail/reconcile.ts | 0 .../src/mail/triage.ts | 0 .../src/main.ts | 0 .../src/packs/authoring.ts | 0 .../src/packs/bindings.ts | 0 .../src/packs/bundled.ts | 0 .../src/packs/capabilities.ts | 0 .../src/packs/registry.ts | 0 .../src/packs/select.ts | 0 .../src/packs/types.ts | 0 .../src/packs/validate.ts | 0 .../src/practice/schedule.ts | 0 .../src/prefs.ts | 0 .../src/proactive/inbox.ts | 0 .../src/proactive/rules.ts | 0 .../src/profiles.ts | 0 .../src/provenance/graph.ts | 0 .../src/provenance/record.ts | 0 .../src/provenance/types.ts | 0 .../src/rail.ts | 0 .../src/recipes/merge.ts | 0 .../src/recipes/scale.ts | 0 .../src/recipes/types.ts | 0 .../src/recipes/units.ts | 0 .../src/shell.ts | 0 .../src/store.ts | 0 .../src/style.css | 0 .../{lifeboard => termchart-client}/src/sw.js | 0 .../src/tap.ts | 0 .../src/transcript.ts | 0 .../src/types.ts | 0 .../src/undo.ts | 0 .../src/views/activity.ts | 0 .../src/views/calendar.ts | 0 .../src/views/connections.ts | 0 .../src/views/focused.ts | 0 .../src/views/grid.ts | 0 .../src/views/inbox.ts | 0 .../src/views/lineage.ts | 0 .../src/views/links.ts | 0 .../src/views/packs.ts | 0 .../src/views/practice.ts | 0 .../src/views/recipe.ts | 0 .../src/views/sources.ts | 0 .../src/views/types.ts | 0 .../test/activity.test.ts | 0 .../test/agent-shell.test.ts | 0 .../test/app.test.ts | 0 .../test/backup.test.ts | 0 .../test/boards.test.ts | 0 .../test/bridge-client.test.ts | 0 .../test/calendar-mail.test.ts | 0 .../test/cart.test.ts | 0 .../test/console.test.ts | 0 .../test/envelope.test.ts | 0 .../test/jobs-ui.test.ts | 0 .../test/log.test.ts | 0 .../test/loop.test.ts | 0 .../test/outbound.test.ts | 0 .../test/packs-ui.test.ts | 0 .../test/packs.test.ts | 0 .../test/practice.test.ts | 0 .../test/proactive.test.ts | 0 .../test/profiles.test.ts | 0 .../test/provenance.test.ts | 0 .../test/providers.test.ts | 0 .../test/recipe-flow.test.ts | 0 .../test/recipes.test.ts | 0 .../test/shell.test.ts | 0 .../test/store.test.ts | 0 .../test/sync.test.ts | 0 .../test/units.test.ts | 0 .../test/views.test.ts | 0 .../tsconfig.json | 0 116 files changed, 752 insertions(+), 519 deletions(-) create mode 100644 .superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/progress.md create mode 100644 .superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-brief.md create mode 100644 .superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-report.md rename packages/{lifeboard => termchart-client}/README.md (95%) rename packages/{lifeboard => termchart-client}/e2e/offline.e2e.mjs (100%) rename packages/{lifeboard => termchart-client}/package.json (95%) rename packages/{lifeboard => termchart-client}/scripts/serve.mjs (97%) rename packages/{lifeboard => termchart-client}/src/actions/bar.ts (100%) rename packages/{lifeboard => termchart-client}/src/actions/cart.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/connections.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/envelope.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/loop.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/prompt.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/providers/anthropic.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/providers/fake.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/providers/google.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/providers/openai-shape.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/providers/openai.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/providers/openrouter.ts (100%) rename packages/{lifeboard => termchart-client}/src/agent/providers/types.ts (100%) rename packages/{lifeboard => termchart-client}/src/app.ts (100%) rename packages/{lifeboard => termchart-client}/src/backup.ts (100%) rename packages/{lifeboard => termchart-client}/src/boards.ts (100%) rename packages/{lifeboard => termchart-client}/src/bridge/client.ts (100%) rename packages/{lifeboard => termchart-client}/src/connectors/deeplinks.ts (100%) rename packages/{lifeboard => termchart-client}/src/console.ts (100%) rename packages/{lifeboard => termchart-client}/src/contacts.ts (100%) rename packages/{lifeboard => termchart-client}/src/css.d.ts (100%) rename packages/{lifeboard => termchart-client}/src/google/calendar.ts (100%) rename packages/{lifeboard => termchart-client}/src/google/gmail.ts (100%) rename packages/{lifeboard => termchart-client}/src/google/oauth.ts (100%) rename packages/{lifeboard => termchart-client}/src/google/sync.ts (100%) rename packages/{lifeboard => termchart-client}/src/index.html (100%) rename packages/{lifeboard => termchart-client}/src/jobs/card.ts (100%) rename packages/{lifeboard => termchart-client}/src/jobs/mirror.ts (100%) rename packages/{lifeboard => termchart-client}/src/log.ts (100%) rename packages/{lifeboard => termchart-client}/src/mail/classify.ts (100%) rename packages/{lifeboard => termchart-client}/src/mail/extract.ts (100%) rename packages/{lifeboard => termchart-client}/src/mail/reconcile.ts (100%) rename packages/{lifeboard => termchart-client}/src/mail/triage.ts (100%) rename packages/{lifeboard => termchart-client}/src/main.ts (100%) rename packages/{lifeboard => termchart-client}/src/packs/authoring.ts (100%) rename packages/{lifeboard => termchart-client}/src/packs/bindings.ts (100%) rename packages/{lifeboard => termchart-client}/src/packs/bundled.ts (100%) rename packages/{lifeboard => termchart-client}/src/packs/capabilities.ts (100%) rename packages/{lifeboard => termchart-client}/src/packs/registry.ts (100%) rename packages/{lifeboard => termchart-client}/src/packs/select.ts (100%) rename packages/{lifeboard => termchart-client}/src/packs/types.ts (100%) rename packages/{lifeboard => termchart-client}/src/packs/validate.ts (100%) rename packages/{lifeboard => termchart-client}/src/practice/schedule.ts (100%) rename packages/{lifeboard => termchart-client}/src/prefs.ts (100%) rename packages/{lifeboard => termchart-client}/src/proactive/inbox.ts (100%) rename packages/{lifeboard => termchart-client}/src/proactive/rules.ts (100%) rename packages/{lifeboard => termchart-client}/src/profiles.ts (100%) rename packages/{lifeboard => termchart-client}/src/provenance/graph.ts (100%) rename packages/{lifeboard => termchart-client}/src/provenance/record.ts (100%) rename packages/{lifeboard => termchart-client}/src/provenance/types.ts (100%) rename packages/{lifeboard => termchart-client}/src/rail.ts (100%) rename packages/{lifeboard => termchart-client}/src/recipes/merge.ts (100%) rename packages/{lifeboard => termchart-client}/src/recipes/scale.ts (100%) rename packages/{lifeboard => termchart-client}/src/recipes/types.ts (100%) rename packages/{lifeboard => termchart-client}/src/recipes/units.ts (100%) rename packages/{lifeboard => termchart-client}/src/shell.ts (100%) rename packages/{lifeboard => termchart-client}/src/store.ts (100%) rename packages/{lifeboard => termchart-client}/src/style.css (100%) rename packages/{lifeboard => termchart-client}/src/sw.js (100%) rename packages/{lifeboard => termchart-client}/src/tap.ts (100%) rename packages/{lifeboard => termchart-client}/src/transcript.ts (100%) rename packages/{lifeboard => termchart-client}/src/types.ts (100%) rename packages/{lifeboard => termchart-client}/src/undo.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/activity.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/calendar.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/connections.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/focused.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/grid.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/inbox.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/lineage.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/links.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/packs.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/practice.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/recipe.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/sources.ts (100%) rename packages/{lifeboard => termchart-client}/src/views/types.ts (100%) rename packages/{lifeboard => termchart-client}/test/activity.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/agent-shell.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/app.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/backup.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/boards.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/bridge-client.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/calendar-mail.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/cart.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/console.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/envelope.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/jobs-ui.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/log.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/loop.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/outbound.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/packs-ui.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/packs.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/practice.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/proactive.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/profiles.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/provenance.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/providers.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/recipe-flow.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/recipes.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/shell.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/store.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/sync.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/units.test.ts (100%) rename packages/{lifeboard => termchart-client}/test/views.test.ts (100%) rename packages/{lifeboard => termchart-client}/tsconfig.json (100%) diff --git a/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/progress.md b/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/progress.md new file mode 100644 index 00000000..a41bc947 --- /dev/null +++ b/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/progress.md @@ -0,0 +1,13 @@ +# SDD ledger — plan: docs/superpowers/plans/2026-09-04-rename-lifeboard-to-termchart-client.md + +Repo: termchart. Branch: rename/termchart-client (from lifeboard/19-review-fixes @849bfed; user chose to stack on that branch). BASE after plan commit: c320e86. +Spec: agent-bridge:docs/superpowers/specs/2026-09-04-consolidate-into-agent-bridge-design.md (Sub-project A) — spec lives in the sibling agent-bridge repo, reachable on disk at /Users/chosan/code/agent-bridge/... Rulings here argue from it. + +## Pre-flight scan +Single-task plan (atomic rename). No task-pair interfaces to check. Task 1 internal consistency: its verification steps (grep-clean + green build/test) directly gate the edits it prescribes; the enumerate-references steps (2/7) make the file list concrete rather than hand-waved. Scan clean — proceed. + +## Model plan +Task 1: sonnet (cross-file rename with build integration — multiple files, missing a ref breaks the build). Task review: sonnet. + +## Progress +Task 1: dispatching implementer (sonnet), BASE c320e86. diff --git a/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-brief.md b/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-brief.md new file mode 100644 index 00000000..97d13c1b --- /dev/null +++ b/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-brief.md @@ -0,0 +1,70 @@ +# Task 1: Atomic package rename (SP-A) + +## Global Constraints (bind this task) +- Scope is the **package rename only** — NOT the ~55-file brand/text sweep of the word "lifeboard" (docs, UI copy, branch names). Leave textual/brand occurrences alone. +- Preserve git history (`git mv`). +- termchart `npm test` and all package builds stay green. +- `grep -rI "@ivanmkc/termchart-lifeboard"` returns nothing outside `node_modules`/`dist` when done. +- Do NOT touch `packages/canvas` or `packages/core`. + +## Files +- Move: `packages/lifeboard/` → `packages/termchart-client/` +- Modify: `packages/termchart-client/package.json` (the `name` field) +- Modify: every file referencing `@ivanmkc/termchart-lifeboard` (~6) or the path `packages/lifeboard` (~6) — enumerate via the grep in Step 2 (sibling `package.json` deps, root/workspace build scripts, `tsconfig` references/paths, CI configs, imports) + +## Interfaces +- Consumes: nothing (leaf change). +- Produces: package is now `@ivanmkc/termchart-client` at `packages/termchart-client`. External consumers use `@ivanmkc/termchart-canvas`/`-core`, NOT this package — no downstream contract change. + +## Steps + +**Step 1: You are already on branch `rename/termchart-client`** (the controller created it and committed the plan). Do NOT create a new branch. Verify: `git rev-parse --abbrev-ref HEAD` → `rename/termchart-client`. + +**Step 2: Enumerate references BEFORE moving (record them in your report):** +```bash +grep -rn "@ivanmkc/termchart-lifeboard" . --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist +grep -rn "packages/lifeboard" . --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist +``` +Expected ~6 files each. These are exactly what Step 4 edits. (Ignore matches inside `docs/`/markdown that are brand/prose, per Global Constraints — only change build/import/config references, not brand copy. If unsure whether a `packages/lifeboard` doc mention is a build reference vs prose, prefer leaving prose alone; the gate is a green build + no stale `@ivanmkc/termchart-lifeboard`.) + +**Step 3: Move the directory (history-preserving):** +```bash +git mv packages/lifeboard packages/termchart-client +``` + +**Step 4: Rename the package + update every build/import/config reference:** +- In `packages/termchart-client/package.json`: `"name": "@ivanmkc/termchart-lifeboard"` → `"name": "@ivanmkc/termchart-client"`. +- For each build/import/config file from Step 2: replace `@ivanmkc/termchart-lifeboard` → `@ivanmkc/termchart-client` and `packages/lifeboard` → `packages/termchart-client`. Common spots: root `package.json` scripts (build/workspace filters), sibling packages' `dependencies`/`devDependencies`, `tsconfig*.json` `references`/`paths`, CI workflow files, any `import ... from "@ivanmkc/termchart-lifeboard"`. + +**Step 5: Reinstall so the workspace re-links the renamed package:** +```bash +npm install +``` +Expected: no unresolved-workspace errors. + +**Step 6: Verify build + tests (the real gate):** +```bash +npm run build --workspaces --if-present +npm test +``` +Expected: PASS (same as before the rename). If the renamed package has its own `build`/`test`/`test:e2e` scripts, run those too. Note: macOS has no GNU `timeout` — don't use it. + +**Step 7: Verify no stale references remain:** +```bash +grep -rn "@ivanmkc/termchart-lifeboard" . --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist ; echo "exit=$?" +``` +Expected: no matches (exit 1). If any remain, fix and re-run Step 6. + +**Step 8: Commit:** +```bash +git add -A +git commit -m "refactor: rename lifeboard package to termchart-client" +``` + +## Anti-park directive +Run all builds/tests in the FOREGROUND, blocking; read output yourself before reporting. Do not start background tasks and wait on notifications — they don't reach you. + +## Report contract +Write your FULL report to: /Users/chosan/code/termchart/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-report.md +Include: the enumerated reference list (Step 2), file-by-file changes, the exact `npm test`/build output (pass lines), the Step 7 grep-clean result, any files you judged to be prose/brand and left alone (with reason), and any concerns. +Return to me ONLY: status (DONE / DONE_WITH_CONCERNS / NEEDS_CONTEXT / BLOCKED), commit hash, one-line test summary, blocking concerns. diff --git a/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-report.md b/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-report.md new file mode 100644 index 00000000..6a82600f --- /dev/null +++ b/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-report.md @@ -0,0 +1,120 @@ +# Task 1 report: rename lifeboard package to termchart-client + +## Status: DONE_WITH_CONCERNS (see "grep-gate exceptions" below — build/test are fully green) + +Branch: `rename/termchart-client` (verified via `git rev-parse --abbrev-ref HEAD`, was already checked out). + +## Step 2: enumerated references (before moving) + +`grep -rn "@ivanmkc/termchart-lifeboard" . --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist`: +1. `package-lock.json` (2 hits) — auto-generated, regenerated by `npm install`, not hand-edited. +2. `docs/lifeboard/qa-guide.md` (5 hits) — active QA doc with runnable `--workspace` commands. +3. `docs/superpowers/plans/2026-08-31-lifeboard-foundation.md` (6 hits) — historical plan (built lifeboard originally); left alone, see exceptions. +4. `docs/superpowers/plans/2026-09-04-rename-lifeboard-to-termchart-client.md` (7 hits) — the controller's plan for *this* rename task; inherently documents old-name → new-name; left alone, see exceptions. +5. `packages/lifeboard/README.md` (4 hits) — package's own README, runnable commands. +6. `packages/lifeboard/package.json` (1 hit) — the `name` field. +7. `packages/lifeboard/scripts/serve.mjs` (1 hit) — comment with a runnable command. +8. `.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-brief.md` (6 hits) — my own instructions; not a target file, left alone. + +`grep -rn "packages/lifeboard" . --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist`: +1. `README.md` (1 hit) — root README link to the package. +2. `package-lock.json` (2 hits) — auto-regenerated. +3. `docs/lifeboard/README.md` (1 hit) — link to package README. +4. `docs/lifeboard/qa-guide.md` (1 hit) — `tsc --noEmit -p packages/lifeboard/tsconfig.json` command. +5. `docs/superpowers/plans/2026-08-31-lifeboard-foundation.md` (~40 hits) — historical plan prose/paths; left alone. +6. `docs/superpowers/plans/2026-09-04-rename-lifeboard-to-termchart-client.md` (4 hits) — this task's own plan; left alone. +7. `docs/superpowers/specs/2026-08-31-lifeboard-design.md` (1 hit) — historical design spec prose; left alone. +8. `.superpowers/sdd/.../task-1-brief.md` (4 hits) — instructions; left alone. + +Confirmed no sibling `package.json` (`canvas`, `cli`, `core`, `viewer`) depends on `@ivanmkc/termchart-lifeboard`; no `tsconfig*.json` `references`/`paths` mention it; no `.github/workflows/*.yml` mentions "lifeboard" at all. This is a true leaf package — no downstream contract changes needed. + +## Step 3: move + +`git mv packages/lifeboard packages/termchart-client` — history-preserving move, confirmed via `git status` showing renames (later shown as new-file/deleted-file pairs after unrelated `git stash`/`pop` cycles used for flakiness testing, but the original `git mv` was done cleanly). + +## Step 4: file-by-file edits + +Package rename (functional): +- `packages/termchart-client/package.json`: `"name": "@ivanmkc/termchart-lifeboard"` → `"name": "@ivanmkc/termchart-client"`. Left the `description` field's prose ("lifeboard — a local-first family dashboard…") untouched — brand text, out of scope. +- `packages/termchart-client/README.md`: 4 `npm run/test --workspace @ivanmkc/termchart-lifeboard` command lines → `@ivanmkc/termchart-client`. Left the `# lifeboard` title, prose, and other brand mentions untouched. +- `packages/termchart-client/scripts/serve.mjs`: 1 comment line `npm run serve --workspace @ivanmkc/termchart-lifeboard` → `@ivanmkc/termchart-client`. Left the file's other "lifeboard" prose/console-output strings untouched (brand, not a build reference). + +Active docs with runnable commands/links (judged as functional references, not brand prose, since they'd literally break — broken relative link / stale npm workspace name / stale tsc path): +- `docs/lifeboard/qa-guide.md`: 6 edits — the `tsc --noEmit -p packages/lifeboard/tsconfig.json` path, and 5 occurrences of `--workspace @ivanmkc/termchart-lifeboard` (in the coverage table, the "running the browser test" section, the manual-testing "start with" section, and the QA checklist). Left the page title text ("How to check that lifeboard works…") untouched. +- `README.md` (root): `[Package](packages/lifeboard/)` → `[Package](packages/termchart-client/)`. Left the `## lifeboard` heading and surrounding prose untouched. +- `docs/lifeboard/README.md`: `[Package README](../../packages/lifeboard/README.md)` → `../../packages/termchart-client/README.md`. Left the `# lifeboard` title and guide prose untouched. + +Left alone as historical/meta/prose (not edited; see "grep-gate exceptions"): +- `docs/superpowers/plans/2026-08-31-lifeboard-foundation.md` — historical plan document from when lifeboard was originally built (Aug 31); rewriting a past plan's historical record to say "termchart-client" would misrepresent history. All ~46 hits across both greps are prose/path mentions describing that past task. +- `docs/superpowers/plans/2026-09-04-rename-lifeboard-to-termchart-client.md` — the controller's plan for this very rename task; by nature it must say "rename X (`@ivanmkc/termchart-lifeboard`) to Y (`@ivanmkc/termchart-client`)" — editing it to remove the old name would make it read as nonsensical ("rename lifeboard (`@ivanmkc/termchart-client`) to termchart-client (`@ivanmkc/termchart-client`)"). +- `docs/superpowers/specs/2026-08-31-lifeboard-design.md` — historical design spec, one path mention in prose. +- `.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-brief.md` — my own instructions document, not listed as a target file, and it necessarily quotes the search strings as literal grep-pattern examples. +- `package-lock.json` — auto-generated; regenerated correctly by `npm install` (see Step 5 note below on a hiccup). + +Not touched at all (word "lifeboard" appears as brand/prose/comments, not as the exact strings `@ivanmkc/termchart-lifeboard` or `packages/lifeboard`, so out of the ~55-file brand-sweep scope per Global Constraints): `packages/canvas/src/index.ts`, `packages/canvas/src/interact.ts`, `packages/canvas/test/practice.test.tsx`, `packages/cli/src/bridge.ts`, `packages/cli/src/bridge/security.ts`, `packages/cli/src/bridge/server.ts`, `packages/cli/test/bridge.test.ts`, all remaining `packages/termchart-client/src/**` and `test/**` files, `docs/lifeboard/{bridge,deck.html,index.html,integrations-plan,user-guide}.md`, `docs/superpowers/plans/2026-09-01-lifeboard-roadmap.md`, `docs/superpowers/specs/2026-09-01-lifeboard-{architecture-audit,journeys,ux-research}.md`. + +## Step 5: `npm install` + +First `npm install` succeeded (no unresolved-workspace errors) and correctly linked `node_modules/@ivanmkc/termchart-client -> ../../packages/termchart-client`, but left a **stale, `extraneous: true` `packages/lifeboard` entry in `package-lock.json`** alongside the new correct entry — npm did not prune the orphaned workspace record on a normal re-install (also survived `npm prune`). Fixed by a full clean reinstall: +``` +rm -rf node_modules package-lock.json +npm install +``` +After that, `package-lock.json` has zero occurrences of `termchart-lifeboard` or `packages/lifeboard`, and `node_modules/@ivanmkc/` symlinks are all correct (`termchart`, `termchart-canvas`, `termchart-client`, `termchart-core`, `termchart-viewer`). + +## Step 6: build + test + +`npm run build --workspaces --if-present` — **PASS**, all 4 workspaces build clean, including: +``` +> @ivanmkc/termchart-client@0.1.0 build +> rm -rf dist && esbuild src/main.ts ... +⚡ Done in 191ms +``` + +`npm test` (root, `--workspaces --if-present`) — ran multiple times to characterize a pre-existing flakiness issue (see below); representative clean run: +``` +> @ivanmkc/termchart@0.7.0 test → 31 files, 323 tests passed +> @ivanmkc/termchart-canvas ... → (see flakiness note) +> @ivanmkc/termchart-core@0.1.0 test → 1 file, 21 tests passed +> @ivanmkc/termchart-client@0.1.0 test → 28 files, 431 tests passed +> @ivanmkc/termchart-viewer@0.1.0 test → 17 files, 278 tests passed +``` + +**Pre-existing flakiness (not caused by this rename):** across 5 total full `npm test` runs (2 on the original unmodified code via `git stash`, 3 on the renamed code), 3 runs had a transient failure in `packages/canvas/test/flow-geometry.test.ts` (`shipped examples are geometry-clean` — a layout-timing-sensitive test) and 2 had a transient failure in `termchart-client/test/outbound.test.ts` (different specific sub-test failed each time: "discarding sends nothing" once, "asking for permission to send" once, plus an isolated extra "falls back to the phone's own composer" failure in one run). Isolated re-runs of `outbound.test.ts` alone, and of the full `termchart-client` suite alone (`cd packages/termchart-client && npx vitest run`), passed 431/431 every time. **Reproduced identically on the pre-rename code** (stashed my changes, ran `npm test` twice — same `flow-geometry.test.ts` failure appeared, in `packages/canvas`, which I never touch). This confirms the flakiness is a pre-existing CPU/timing-load issue in the full parallel test run, independent of the rename — not a regression I introduced. I did not attempt to fix it (out of scope: `packages/canvas` is explicitly off-limits, and `termchart-client`'s own suite is green in isolation). + +`termchart-client`'s own scripts, run directly: +- `npm test` (in `packages/termchart-client`): 28 files, 431 tests passed, clean. +- `npm run test:e2e` (in `packages/termchart-client`): built, then `offline.e2e: PASS` — all 23 assertions passed (`PASS first run renders the Today board` … `PASS works with no bridge running`, `no console errors (saw 0)`). + +## Step 7: grep-clean verification + +Literal command from the brief: +``` +grep -rn "@ivanmkc/termchart-lifeboard" . --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist ; echo "exit=$?" +``` +Result: **3 files still match** (exit=0, not the expected exit=1/no-match): +- `docs/superpowers/plans/2026-09-04-rename-lifeboard-to-termchart-client.md` +- `docs/superpowers/plans/2026-08-31-lifeboard-foundation.md` +- `.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/task-1-brief.md` + +### Grep-gate exceptions (why status is DONE_WITH_CONCERNS, not DONE) + +All 3 remaining files are meta/historical/instructional documents that describe the rename task itself (or a past task) rather than build/import/config surface: +- The two `docs/superpowers/plans/*.md` files are dated planning artifacts — one is the historical record of building lifeboard on 2026-08-31 (rewriting it would misrepresent history), the other is *this exact task's own plan*, whose prose necessarily reads "rename `lifeboard` (`@ivanmkc/termchart-lifeboard`) to `termchart-client`" — it cannot be edited to remove the old name without becoming self-contradictory nonsense. +- `.superpowers/sdd/.../task-1-brief.md` is the instructions handed to me for this task; it isn't in the brief's own "Files" list to modify, and it necessarily quotes the search strings as literal examples of what to grep for. + +`grep -rI "@ivanmkc/termchart-lifeboard"` outside `node_modules`/`dist` (the Global Constraints' phrasing, which the outer task also stated as an absolute gate) is **not fully clean** for this reason alone. Every functional file — `package.json`, `package-lock.json`, README/script comments with runnable commands, and active docs (`docs/lifeboard/qa-guide.md`) — is clean. I judged this an acceptable, documented exception rather than mangling historical/meta docs, but flagging it explicitly per the report contract since the letter of the gate isn't 100% satisfied. + +`packages/lifeboard` (path) grep: the analogous historical/meta docs still mention the old path in prose (per the brief's own guidance to prefer leaving such prose alone when unsure); all functional/active-doc occurrences (root README link, `docs/lifeboard/README.md` link, `docs/lifeboard/qa-guide.md` tsc path) were fixed. + +## Step 8: commit + +``` +git add -A && git commit -m "refactor: rename lifeboard package to termchart-client" +``` + +## Concerns for the controller + +1. **Grep-gate not 100% literal-clean** (see above) — 3 meta/historical doc files still contain the old package name as intentional historical/self-referential text. I believe this is the correct call, but flagging since the gate was stated as absolute. +2. **`npm install` needed a full clean reinstall** (`rm -rf node_modules package-lock.json && npm install`) to fully prune a stale `extraneous: true` lockfile entry for the old `packages/lifeboard` workspace — a plain re-`npm install` and even `npm prune` left it behind. Worth knowing if a future rename in this repo hits the same npm behavior. +3. **Pre-existing test flakiness** in the full `npm test` run (`packages/canvas/test/flow-geometry.test.ts`, occasionally `termchart-client/test/outbound.test.ts`) — reproduced on both pre- and post-rename code, so not a regression, but the controller/reviewer should not be alarmed by an occasional red `npm test` at the root; the renamed package's own isolated suite and e2e are consistently green. diff --git a/README.md b/README.md index 77c3381c..da35e013 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ A family board built on the same canvas: your lists, calendar and recipes in the assistant that can read them, change them, and draw new boards. No server, works offline. [User guide](docs/lifeboard/user-guide.md) · [QA guide](docs/lifeboard/qa-guide.md) · -[Package](packages/lifeboard/) +[Package](packages/termchart-client/) ## Use it — just ask your agent diff --git a/docs/lifeboard/README.md b/docs/lifeboard/README.md index a6bf8909..11769ed9 100644 --- a/docs/lifeboard/README.md +++ b/docs/lifeboard/README.md @@ -9,7 +9,7 @@ | [QA guide](./qa-guide.md) | Testing it — automated checks and a manual test plan | | [Persistence audit](./persistence-audit.md) | How state is stored, and what was wrong with it | | [Integrations plan](./integrations-plan.md) | How to reach Gmail, Drive, Dropbox and Maps — MCP, not connectors | -| [Package README](../../packages/lifeboard/README.md) | Building on it: architecture and layout | +| [Package README](../../packages/termchart-client/README.md) | Building on it: architecture and layout | ## The design deck diff --git a/docs/lifeboard/qa-guide.md b/docs/lifeboard/qa-guide.md index 5b867aa0..292bbf17 100644 --- a/docs/lifeboard/qa-guide.md +++ b/docs/lifeboard/qa-guide.md @@ -10,16 +10,16 @@ From the repository root: ```bash npm install npm test # every package -npx tsc --noEmit -p packages/lifeboard/tsconfig.json # and one per package +npx tsc --noEmit -p packages/termchart-client/tsconfig.json # and one per package ``` | Command | Covers | Expect | |---|---|---| -| `npm test --workspace @ivanmkc/termchart-lifeboard` | log, store, views, agent, packs, recipes, mail, provenance, practice, bridge client | 372 passing | +| `npm test --workspace @ivanmkc/termchart-client` | log, store, views, agent, packs, recipes, mail, provenance, practice, bridge client | 372 passing | | `npm test --workspace @ivanmkc/termchart-canvas` | renderers, patch appliers, board lints | 485 passing | | `npm test --workspace @ivanmkc/termchart` | CLI, including the bridge and scheduler | 320 passing | | `npm test --workspace @ivanmkc/termchart-viewer` | the viewer | 278 passing | -| `npm run test:e2e --workspace @ivanmkc/termchart-lifeboard` | a real browser, network off | `offline.e2e: PASS`, 19 assertions | +| `npm run test:e2e --workspace @ivanmkc/termchart-client` | a real browser, network off | `offline.e2e: PASS`, 19 assertions | | `npm run test:e2e --workspace @ivanmkc/termchart-viewer` | the viewer in a browser, 11 suites | all pass | A failing suite blocks. Two notes on reading failures: @@ -32,7 +32,7 @@ A failing suite blocks. Two notes on reading failures: ### Running the browser test against a change you are making ```bash -npm run test:e2e --workspace @ivanmkc/termchart-lifeboard +npm run test:e2e --workspace @ivanmkc/termchart-client ``` It builds first, serves `dist/` on an ephemeral port, drives Chromium, and switches the network off @@ -43,7 +43,7 @@ partway through. It needs no network and no keys. Start with: ```bash -npm run serve --workspace @ivanmkc/termchart-lifeboard +npm run serve --workspace @ivanmkc/termchart-client ``` and open . Use `localhost`, not a LAN address — service workers need a secure @@ -231,7 +231,7 @@ These are the ones that bite in the field. ## 3. Before approving a change - [ ] `npm test` at the root — every package green -- [ ] `npm run test:e2e --workspace @ivanmkc/termchart-lifeboard` — `offline.e2e: PASS` +- [ ] `npm run test:e2e --workspace @ivanmkc/termchart-client` — `offline.e2e: PASS` - [ ] `tsc --noEmit` clean for every package touched - [ ] Section A, plus whichever section covers the change - [ ] Section E if anything under `src/recipes/` or `src/packs/` moved diff --git a/package-lock.json b/package-lock.json index 60725b0c..1829f65b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,9 +75,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", - "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", + "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", "funding": [ { "type": "github", @@ -94,9 +94,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", - "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", "funding": [ { "type": "github", @@ -117,9 +117,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.9.tgz", - "integrity": "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.2.tgz", + "integrity": "sha512-3QKjR/vxyjcSXBLgb6lP0S3MGdvwbmqSsvLPbYdVORqPDc8FX1HAJ0Spk38bxaRXgvENTA47tlhhbb5Z2e8hEg==", "funding": [ { "type": "github", @@ -132,8 +132,8 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^6.1.0", - "@csstools/css-calc": "^3.2.1" + "@csstools/color-helpers": "^6.1.1", + "@csstools/css-calc": "^3.3.0" }, "engines": { "node": ">=20.19.0" @@ -167,9 +167,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.6.tgz", - "integrity": "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.12.tgz", + "integrity": "sha512-3vLQK+dXxhBMR2Wx99PTCifE+vHtW2ndZWyla8yK813ev6oGhyn8Lja8jCyGAWTJ+LEYZK7EVtJxrDj8ztevJw==", "funding": [ { "type": "github", @@ -211,26 +211,26 @@ } }, "node_modules/@dagrejs/dagre": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-3.0.0.tgz", - "integrity": "sha512-ZzhnTy1rfuoew9Ez3EIw4L2znPGnYYhfn8vc9c4oB8iw6QAsszbiU0vRhlxWPFnmmNSFAkrYeF1PhM5m4lAN0Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-3.1.1.tgz", + "integrity": "sha512-zroZB1dFOFiGgv4Xcrn1DckB1o4aOikPqD2NDQPV0WM//CXGcS6xiD0rNkqHmw6FEg4tabt4nxPLwgCWT+Vb2A==", "dev": true, "license": "MIT", "dependencies": { - "@dagrejs/graphlib": "4.0.1" + "@dagrejs/graphlib": "4.0.5" } }, "node_modules/@dagrejs/graphlib": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@dagrejs/graphlib/-/graphlib-4.0.1.tgz", - "integrity": "sha512-IvcV6FduIIAmLwnH+yun+QtV36SC7mERqa86aClNqmMN09WhmPPYU8ckHrZBozErf+UvHPWOTJYaGYiIcs0DgA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@dagrejs/graphlib/-/graphlib-4.0.5.tgz", + "integrity": "sha512-7xrBTqIts3o+PMUZX97wSc+7TUbW+/rULzGNCTP6yooNVDXbzw4Wutg/H/xOutTB/c/k0YqOAavgPh4/Zk9PFA==", "dev": true, "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ "ppc64" ], @@ -245,9 +245,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ "arm" ], @@ -262,9 +262,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" ], @@ -279,9 +279,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ "x64" ], @@ -296,9 +296,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" ], @@ -313,9 +313,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], @@ -330,9 +330,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], @@ -347,9 +347,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], @@ -364,9 +364,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" ], @@ -381,9 +381,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], @@ -398,9 +398,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" ], @@ -415,9 +415,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" ], @@ -432,9 +432,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" ], @@ -449,9 +449,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" ], @@ -466,9 +466,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" ], @@ -483,9 +483,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" ], @@ -500,9 +500,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" ], @@ -517,9 +517,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], @@ -534,9 +534,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" ], @@ -551,9 +551,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" ], @@ -568,9 +568,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" ], @@ -585,9 +585,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ "arm64" ], @@ -602,9 +602,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], @@ -619,9 +619,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], @@ -636,9 +636,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" ], @@ -653,9 +653,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], @@ -752,12 +752,12 @@ "resolved": "packages/canvas", "link": true }, - "node_modules/@ivanmkc/termchart-core": { - "resolved": "packages/core", + "node_modules/@ivanmkc/termchart-client": { + "resolved": "packages/termchart-client", "link": true }, - "node_modules/@ivanmkc/termchart-lifeboard": { - "resolved": "packages/lifeboard", + "node_modules/@ivanmkc/termchart-core": { + "resolved": "packages/core", "link": true }, "node_modules/@ivanmkc/termchart-viewer": { @@ -778,35 +778,35 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "dev": true, "license": "MIT" }, "node_modules/@mantine/core": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.4.1.tgz", - "integrity": "sha512-lZWEICrum4+vwKxzh/mk4RB1N6BqZ0Cshdl6lhm7OYLiQzmOaxKtOgyaWz+vr65G8mqTXjalZalB+wmMVBYK2Q==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.6.0.tgz", + "integrity": "sha512-WpdtSv9q2k4RrAVUxBlABMyEul4vv94EkjoVuQglBBC7jVmLhBBgI64HltE6di/l6zvj9D7k1vgkbVjyxQsn1g==", "dev": true, "license": "MIT", "dependencies": { - "@floating-ui/react": "^0.27.19", + "@floating-ui/react": "^0.27.20", "clsx": "^2.1.1", "react-number-format": "^5.4.5", "react-remove-scroll": "^2.7.2", - "type-fest": "^5.7.0" + "type-fest": "^5.8.0" }, "peerDependencies": { - "@mantine/hooks": "9.4.1", + "@mantine/hooks": "9.6.0", "react": "^19.2.0", "react-dom": "^19.2.0" } }, "node_modules/@mantine/hooks": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.4.1.tgz", - "integrity": "sha512-eTI8wmzPx3r98zgKIEuvukmoGTHBhmtI6+9E6o2DbTmEU2eM1bCdjE2vFdf0op2AlRO0KEYEcZhNQi4T/SJk0A==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.6.0.tgz", + "integrity": "sha512-r+1RWxc0F2XK9exKIk3Cxc17eyDTEtRqvomeQMCqI4S2Z3A78ObAGuNS8WXn8aqDGN66MJlO+WV7oCgQn2iQfQ==", "dev": true, "license": "MIT", "peer": true, @@ -814,10 +814,27 @@ "react": "^19.2.0" } }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", + "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", "cpu": [ "arm" ], @@ -829,9 +846,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", + "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", "cpu": [ "arm64" ], @@ -843,9 +860,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", + "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", "cpu": [ "arm64" ], @@ -857,9 +874,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", + "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", "cpu": [ "x64" ], @@ -871,9 +888,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", + "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", "cpu": [ "arm64" ], @@ -885,9 +902,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", + "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", "cpu": [ "x64" ], @@ -899,9 +916,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", + "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", "cpu": [ "arm" ], @@ -913,9 +930,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", + "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", "cpu": [ "arm" ], @@ -927,9 +944,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", + "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", "cpu": [ "arm64" ], @@ -941,9 +958,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", + "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", "cpu": [ "arm64" ], @@ -955,9 +972,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", + "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", "cpu": [ "loong64" ], @@ -969,9 +986,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", + "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", "cpu": [ "loong64" ], @@ -983,9 +1000,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", + "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", "cpu": [ "ppc64" ], @@ -997,9 +1014,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", + "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", "cpu": [ "ppc64" ], @@ -1011,9 +1028,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", + "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", "cpu": [ "riscv64" ], @@ -1025,9 +1042,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", + "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", "cpu": [ "riscv64" ], @@ -1039,9 +1056,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", + "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", "cpu": [ "s390x" ], @@ -1053,9 +1070,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", + "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", "cpu": [ "x64" ], @@ -1067,9 +1084,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", + "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", "cpu": [ "x64" ], @@ -1081,9 +1098,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", + "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", "cpu": [ "x64" ], @@ -1095,9 +1112,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", + "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", "cpu": [ "arm64" ], @@ -1109,9 +1126,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", + "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", "cpu": [ "arm64" ], @@ -1123,9 +1140,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", + "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", "cpu": [ "ia32" ], @@ -1137,9 +1154,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", + "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", "cpu": [ "x64" ], @@ -1151,9 +1168,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", + "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", "cpu": [ "x64" ], @@ -1250,9 +1267,9 @@ "license": "MIT" }, "node_modules/@types/leaflet": { - "version": "1.9.21", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", - "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", + "version": "1.9.22", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.22.tgz", + "integrity": "sha512-h3lhECYEKDasG7LFHu+GiHqAvsgLuQvlJvVZzJDGONo3sEL+wUOqSFLnwkZlK0qVxnxbuGFW8iBlJNYs5wgndA==", "dev": true, "license": "MIT", "dependencies": { @@ -1270,9 +1287,9 @@ } }, "node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "dev": true, "license": "MIT", "dependencies": { @@ -1280,9 +1297,9 @@ } }, "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1370,13 +1387,13 @@ } }, "node_modules/@xyflow/react": { - "version": "12.11.2", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.11.2.tgz", - "integrity": "sha512-eLAlDWJfWnQEhJwGMjlWdAXO9eYllKpliUmPQlAmOLxz6mExXuzMVDUKLMquixgkrtmMFFtug3jGKmYYld12cA==", + "version": "12.11.6", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.11.6.tgz", + "integrity": "sha512-9XsEJNHjatKYndszKTF/bsU7FOP9dJ6V/EQwzy3oMdtqgBuUq7BjKSwkEo+C7s4qHstHQfwwoHA3E8QfpPxZZQ==", "dev": true, "license": "MIT", "dependencies": { - "@xyflow/system": "0.0.79", + "@xyflow/system": "0.0.82", "classcat": "^5.0.3", "zustand": "^4.4.0" }, @@ -1396,9 +1413,9 @@ } }, "node_modules/@xyflow/system": { - "version": "0.0.79", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.79.tgz", - "integrity": "sha512-czLyOh91NF0hIzbNzwi8I6GlqG23BHh2435OddfI6uiaLH3xdrdygO93gqgH1Bv9mhy8XPFQJOBn1FTq4LvEWA==", + "version": "0.0.82", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.82.tgz", + "integrity": "sha512-4DKnL3CGtCGLRSmgDqaajRVgeksMXq/Yw4wPfdMfm7JvdIiWHGzVYOfFUztiATwdBXZqUU6HhehwUdbV9G23PQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1421,9 +1438,9 @@ "license": "BSD-2-Clause" }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", "bin": { @@ -1447,9 +1464,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { @@ -2199,9 +2216,9 @@ } }, "node_modules/dompurify": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.12.tgz", - "integrity": "sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==", + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.14.tgz", + "integrity": "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -2283,9 +2300,9 @@ } }, "node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2296,32 +2313,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, "node_modules/escalade": { @@ -2974,9 +2991,9 @@ } }, "node_modules/marked": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.6.tgz", - "integrity": "sha512-MrV5puXBfuiy6wl6DLaq3BtIJQAJToAd5zt/ZKhRfGRAuFPALE7/4Y7jnxRQoEgK/pBgurGqLyAuRgZ2xOjr6w==", + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.11.tgz", + "integrity": "sha512-HnslJfsZkRPBDJRHvVtAaWlZHEpSu7u8LgQuJCELjRKuWR+hpq4A7sLq3p8HaI9ypVoXDXxV34CsQJEe1+J5Aw==", "dev": true, "license": "MIT", "peer": true, @@ -2988,13 +3005,13 @@ } }, "node_modules/marked-katex-extension": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/marked-katex-extension/-/marked-katex-extension-5.1.10.tgz", - "integrity": "sha512-TuqrzguLeXXm6iBaf16leL3+dVmMj8KrBdunMVVzxMS/bwcjtQ0YG0sNytl1j7uUo8yClsXJqBbVjH1yOPurwQ==", + "version": "5.1.12", + "resolved": "https://registry.npmjs.org/marked-katex-extension/-/marked-katex-extension-5.1.12.tgz", + "integrity": "sha512-DgfH0CFrOuVwVEXNJ+rTtYOtZZECpHhA0bu7xBiACAJI4geeaCZfDq+hiJ1yJx780fDh2HWHlr+NySxuc2DD1w==", "dev": true, "license": "MIT", "peerDependencies": { - "katex": ">=0.16 <0.18", + "katex": ">=0.16 <0.19", "marked": ">=4 <19" } }, @@ -3086,9 +3103,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -3313,41 +3330,41 @@ "license": "MIT" }, "node_modules/playwright": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", - "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", + "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.61.1" + "playwright-core": "1.62.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", - "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", + "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/postcss": { - "version": "8.5.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", - "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", "dev": true, "funding": [ { @@ -3365,7 +3382,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -3411,9 +3428,9 @@ } }, "node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "dev": true, "license": "MIT", "peer": true, @@ -3422,9 +3439,9 @@ } }, "node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", "dev": true, "license": "MIT", "peer": true, @@ -3432,7 +3449,7 @@ "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.7" + "react": "^19.2.8" } }, "node_modules/react-is": { @@ -3542,9 +3559,9 @@ "license": "Unlicense" }, "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz", + "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", "dev": true, "license": "MIT", "dependencies": { @@ -3558,31 +3575,32 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.1", + "@rollup/rollup-android-arm64": "4.63.1", + "@rollup/rollup-darwin-arm64": "4.63.1", + "@rollup/rollup-darwin-x64": "4.63.1", + "@rollup/rollup-freebsd-arm64": "4.63.1", + "@rollup/rollup-freebsd-x64": "4.63.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", + "@rollup/rollup-linux-arm-musleabihf": "4.63.1", + "@rollup/rollup-linux-arm64-gnu": "4.63.1", + "@rollup/rollup-linux-arm64-musl": "4.63.1", + "@rollup/rollup-linux-loong64-gnu": "4.63.1", + "@rollup/rollup-linux-loong64-musl": "4.63.1", + "@rollup/rollup-linux-ppc64-gnu": "4.63.1", + "@rollup/rollup-linux-ppc64-musl": "4.63.1", + "@rollup/rollup-linux-riscv64-gnu": "4.63.1", + "@rollup/rollup-linux-riscv64-musl": "4.63.1", + "@rollup/rollup-linux-s390x-gnu": "4.63.1", + "@rollup/rollup-linux-x64-gnu": "4.63.1", + "@rollup/rollup-linux-x64-musl": "4.63.1", + "@rollup/rollup-openbsd-x64": "4.63.1", + "@rollup/rollup-openharmony-arm64": "4.63.1", + "@rollup/rollup-win32-arm64-msvc": "4.63.1", + "@rollup/rollup-win32-ia32-msvc": "4.63.1", + "@rollup/rollup-win32-x64-gnu": "4.63.1", + "@rollup/rollup-win32-x64-msvc": "4.63.1", "fsevents": "~2.3.2" } }, @@ -3853,21 +3871,21 @@ } }, "node_modules/tldts": { - "version": "7.4.9", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.9.tgz", - "integrity": "sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==", + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz", + "integrity": "sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==", "license": "MIT", "dependencies": { - "tldts-core": "^7.4.9" + "tldts-core": "^7.4.11" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.9", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.9.tgz", - "integrity": "sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==", + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz", + "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==", "license": "MIT" }, "node_modules/tmp": { @@ -3957,9 +3975,9 @@ } }, "node_modules/type-fest": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", - "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.9.0.tgz", + "integrity": "sha512-yANm3Jr3GiJ1qgJlxGAVxTOIcEOk1rhQHamlXtnrCK7EHP4HeM9OGxtMg/W7HFdrVzw/ZWJKGVIJusVH85sLtw==", "dev": true, "license": "(MIT OR CC0-1.0)", "dependencies": { @@ -3994,9 +4012,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz", + "integrity": "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -4075,40 +4093,40 @@ } }, "node_modules/vega": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/vega/-/vega-6.2.0.tgz", - "integrity": "sha512-BIwalIcEGysJdQDjeVUmMWB3e50jPDNAMfLJscjEvpunU9bSt7X1OYnQxkg3uBwuRRI4nWfFZO9uIW910nLeGw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/vega/-/vega-6.4.0.tgz", + "integrity": "sha512-rHXCq2LpEWCLMjXBEj7hocY9G0/i5TGYRayGGSj06VTF4+l2IG2Z7oeZKCjWbUh/7hTE/mVhbaOPB72wCElh6g==", "dev": true, "license": "BSD-3-Clause", "peer": true, "dependencies": { - "vega-crossfilter": "~5.1.0", - "vega-dataflow": "~6.1.0", - "vega-encode": "~5.1.0", + "vega-crossfilter": "~5.1.3", + "vega-dataflow": "~6.1.3", + "vega-encode": "~5.2.2", "vega-event-selector": "~4.0.0", - "vega-expression": "~6.1.0", - "vega-force": "~5.1.0", - "vega-format": "~2.1.0", - "vega-functions": "~6.1.0", - "vega-geo": "~5.1.0", - "vega-hierarchy": "~5.1.0", - "vega-label": "~2.1.0", - "vega-loader": "~5.1.0", - "vega-parser": "~7.1.0", - "vega-projection": "~2.1.0", - "vega-regression": "~2.1.0", - "vega-runtime": "~7.1.0", - "vega-scale": "~8.1.0", - "vega-scenegraph": "~5.1.0", + "vega-expression": "~6.2.2", + "vega-force": "~5.1.3", + "vega-format": "~2.1.3", + "vega-functions": "~6.2.0", + "vega-geo": "~5.1.3", + "vega-hierarchy": "~5.1.3", + "vega-label": "~2.1.3", + "vega-loader": "~5.1.3", + "vega-parser": "~7.1.3", + "vega-projection": "~2.1.3", + "vega-regression": "~2.1.3", + "vega-runtime": "~7.1.3", + "vega-scale": "~8.1.3", + "vega-scenegraph": "~5.3.0", "vega-statistics": "~2.0.0", - "vega-time": "~3.1.0", - "vega-transforms": "~5.1.0", - "vega-typings": "~2.1.0", - "vega-util": "~2.1.0", - "vega-view": "~6.1.0", - "vega-view-transforms": "~5.1.0", - "vega-voronoi": "~5.1.0", - "vega-wordcloud": "~5.1.0" + "vega-time": "~3.3.0", + "vega-transforms": "~5.2.2", + "vega-typings": "~2.3.0", + "vega-util": "~2.1.3", + "vega-view": "~6.2.0", + "vega-view-transforms": "~5.2.2", + "vega-voronoi": "~5.1.3", + "vega-wordcloud": "~5.1.3" }, "funding": { "url": "https://app.hubspot.com/payments/GyPC972GD9Rt" @@ -4122,44 +4140,44 @@ "license": "BSD-3-Clause" }, "node_modules/vega-crossfilter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-5.1.0.tgz", - "integrity": "sha512-EmVhfP3p6AM7o/lPan/QAoqjblI19BxWUlvl2TSs0xjQd8KbaYYbS4Ixt3cmEvl0QjRdBMF6CdJJ/cy9DTS4Fw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-5.1.3.tgz", + "integrity": "sha512-goGulwrrbmv9mY4Za8HQiiFk7WV1OTyrSVZzrMR0Keeiyzh9cnkxRGF1W2fAhMNA3HSaRaBoxWHGr7H9fvovuQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", - "vega-dataflow": "^6.1.0", - "vega-util": "^2.1.0" + "vega-dataflow": "^6.1.3", + "vega-util": "^2.1.3" } }, "node_modules/vega-dataflow": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-6.1.0.tgz", - "integrity": "sha512-JxumGlODtFbzoQ4c/jQK8Tb/68ih0lrexlCozcMfTAwQ12XhTqCvlafh7MAKKTMBizjOfaQTHm4Jkyb1H5CfyQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-6.1.3.tgz", + "integrity": "sha512-ac51FLdYT8XAcDaHt3bQtVAR3UFdKfPMQBhjvBMXp69mdeq2ERfM1u9CUyDQAVZJylkIbWEwDnsp72tIwenPUA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "vega-format": "^2.1.0", - "vega-loader": "^5.1.0", - "vega-util": "^2.1.0" + "vega-format": "^2.1.3", + "vega-loader": "^5.1.3", + "vega-util": "^2.1.3" } }, "node_modules/vega-embed": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-7.1.0.tgz", - "integrity": "sha512-ZmEIn5XJrQt7fSh2lwtSdXG/9uf3yIqZnvXFEwBJRppiBgrEWZcZbj6VK3xn8sNTFQ+sQDXW5sl/6kmbAW3s5A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-7.2.0.tgz", + "integrity": "sha512-A7nfZk145qtLWjj0tQhntQgJ4ip52ECzGo2B9B4HcBT1rdWeb32xEdxTzLSlDkNAqcBLw5Y14PR2KewrqERwLA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "fast-json-patch": "^3.1.1", "json-stringify-pretty-compact": "^4.0.0", - "semver": "^7.7.2", + "semver": "^7.8.5", "tslib": "^2.8.1", - "vega-interpreter": "^2.0.0", + "vega-interpreter": "^2.3.2", "vega-schema-url-parser": "^3.0.2", "vega-themes": "3.0.0", - "vega-tooltip": "1.0.0" + "vega-tooltip": "1.1.0" }, "funding": { "url": "https://app.hubspot.com/payments/GyPC972GD9Rt" @@ -4170,17 +4188,17 @@ } }, "node_modules/vega-encode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-5.1.0.tgz", - "integrity": "sha512-q26oI7B+MBQYcTQcr5/c1AMsX3FvjZLQOBi7yI0vV+GEn93fElDgvhQiYrgeYSD4Exi/jBPeUXuN6p4bLz16kA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-5.2.2.tgz", + "integrity": "sha512-YmriG349VjJsIxXE1gkxHj6fPF87T2t/fYmAUUlGzTGarSy3KF93t8Fqc6EPupsgnCDEhe3+0NsSWTVxiOJ1Ow==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-interpolate": "^3.0.1", - "vega-dataflow": "^6.1.0", - "vega-scale": "^8.1.0", - "vega-util": "^2.1.0" + "vega-dataflow": "^6.1.3", + "vega-scale": "^8.1.3", + "vega-util": "^2.1.3" } }, "node_modules/vega-event-selector": { @@ -4191,66 +4209,67 @@ "license": "BSD-3-Clause" }, "node_modules/vega-expression": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-6.1.0.tgz", - "integrity": "sha512-hHgNx/fQ1Vn1u6vHSamH7lRMsOa/yQeHGGcWVmh8fZafLdwdhCM91kZD9p7+AleNpgwiwzfGogtpATFaMmDFYg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-6.2.2.tgz", + "integrity": "sha512-9yTpQBYDnl4yC27iGbUxDUnRAeO+la/lfzA5WSALB0INvA2A2NVxIorBakfqIkO7nwKM9bT3rmNRfj8Z3hjb7g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@types/estree": "^1.0.8", - "vega-util": "^2.1.0" + "@types/estree": "^1.0.9", + "vega-util": "^2.1.3" } }, "node_modules/vega-force": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-5.1.0.tgz", - "integrity": "sha512-wdnchOSeXpF9Xx8Yp0s6Do9F7YkFeOn/E/nENtsI7NOcyHpICJ5+UkgjUo9QaQ/Yu+dIDU+sP/4NXsUtq6SMaQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-5.1.3.tgz", + "integrity": "sha512-njBlnPeeMY0uz1Fbdqa5jnOsSUrUo2s3z/Eb4qo486hhrwNtNpmeCsN+4PBasoblf/4pOpbvKULzolZmG+R7QA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-force": "^3.0.0", - "vega-dataflow": "^6.1.0", - "vega-util": "^2.1.0" + "vega-dataflow": "^6.1.3", + "vega-util": "^2.1.3" } }, "node_modules/vega-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-2.1.0.tgz", - "integrity": "sha512-i9Ht33IgqG36+S1gFDpAiKvXCPz+q+1vDhDGKK8YsgMxGOG4PzinKakI66xd7SdV4q97FgpR7odAXqtDN2wKqw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-2.1.3.tgz", + "integrity": "sha512-VK0yh3BtK5MUoG7aAXuwb678r2wDdykAUFIKHd9MWvXNo857UqNzZfYixfyXi8xXBK2AV38R4IiQmNKUrXBMUA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", - "d3-format": "^3.1.0", + "d3-format": "^3.1.2", "d3-time-format": "^4.1.0", - "vega-time": "^3.1.0", - "vega-util": "^2.1.0" + "vega-time": "^3.3.0", + "vega-util": "^2.1.3" } }, "node_modules/vega-functions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-6.1.1.tgz", - "integrity": "sha512-Due6jP0y0FfsGMTrHnzUGnEwXPu7VwE+9relfo+LjL/tRPYnnKqwWvzt7n9JkeBuZqjkgYjMzm/WucNn6Hkw5A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-6.2.0.tgz", + "integrity": "sha512-MRFL7RjVmsv6iYuRZVvrDPZbySLa5Dzd5hC+0LTubysy8OrPengKZEHeRnibvHH6odg3IsKUV44Wv8dN3XzYAw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-color": "^3.1.0", + "d3-ease": "^3.0.1", "d3-geo": "^3.1.1", - "vega-dataflow": "^6.1.0", - "vega-expression": "^6.1.0", - "vega-scale": "^8.1.0", - "vega-scenegraph": "^5.1.0", - "vega-selections": "^6.1.0", + "vega-dataflow": "^6.1.3", + "vega-expression": "^6.2.2", + "vega-scale": "^8.1.3", + "vega-scenegraph": "^5.3.0", + "vega-selections": "^6.1.5", "vega-statistics": "^2.0.0", - "vega-time": "^3.1.0", - "vega-util": "^2.1.0" + "vega-time": "^3.3.0", + "vega-util": "^2.1.3" } }, "node_modules/vega-geo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-5.1.0.tgz", - "integrity": "sha512-H8aBBHfthc3rzDbz/Th18+Nvp00J73q3uXGAPDQqizioDm/CoXCK8cX4pMePydBY9S6ikBiGJrLKFDa80wI20g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-5.1.3.tgz", + "integrity": "sha512-UfTVPV+O+7elFyUsw8FLjiDOJkF0VZanC5tHLaSSue5h+xLzG6SDKQ7xEBIQSaTBE8nLSBtHm45Qve0SFjILVQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4258,45 +4277,45 @@ "d3-color": "^3.1.0", "d3-geo": "^3.1.1", "vega-canvas": "^2.0.0", - "vega-dataflow": "^6.1.0", - "vega-projection": "^2.1.0", + "vega-dataflow": "^6.1.3", + "vega-projection": "^2.1.3", "vega-statistics": "^2.0.0", - "vega-util": "^2.1.0" + "vega-util": "^2.1.3" } }, "node_modules/vega-hierarchy": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-5.1.0.tgz", - "integrity": "sha512-rZlU8QJNETlB6o73lGCPybZtw2fBBsRIRuFE77aCLFHdGsh6wIifhplVarqE9icBqjUHRRUOmcEYfzwVIPr65g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-5.1.3.tgz", + "integrity": "sha512-bDWDNGuUA4WcOD5CMh9Mahs3CwKxSU3W1XAnDGCpAwfJVoWp7vlVMt1paoTczPFTXtXGxIa3vJu94xWGmI3/og==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-hierarchy": "^3.1.2", - "vega-dataflow": "^6.1.0", - "vega-util": "^2.1.0" + "vega-dataflow": "^6.1.3", + "vega-util": "^2.1.3" } }, "node_modules/vega-interpreter": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-2.2.1.tgz", - "integrity": "sha512-o+4ZEme2mdFLewlpF76dwPWW2VkZ3TAF3DMcq75/NzA5KPvnN4wnlCM8At2FVawbaHRyGdVkJSS5ROF5KwpHPQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-2.3.2.tgz", + "integrity": "sha512-JDAoi3taFcCDLujZG84TNNUXdkAZ5WsSHssx8lWVYaxb9Slsjk7v7PtRIYXpSlUwLaKGRBqoJ9KDs36Z0eMEIw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "vega-util": "^2.1.0" + "vega-util": "^2.1.3" } }, "node_modules/vega-label": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-2.1.0.tgz", - "integrity": "sha512-/hgf+zoA3FViDBehrQT42Lta3t8In6YwtMnwjYlh72zNn1p3c7E3YUBwqmAqTM1x+tudgzMRGLYig+bX1ewZxQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-2.1.3.tgz", + "integrity": "sha512-UcaGgrVr2Gb0sUj4j3L5tZuL6GOn7tyauYsfXsS0hURoIbHCfQI4SnRq89vl5ub5DL1SEWaJTKag4GdAm1hcGw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "vega-canvas": "^2.0.0", - "vega-dataflow": "^6.1.0", - "vega-scenegraph": "^5.1.0", - "vega-util": "^2.1.0" + "vega-dataflow": "^6.1.3", + "vega-scenegraph": "^5.3.0", + "vega-util": "^2.1.3" } }, "node_modules/vega-lite": { @@ -4330,73 +4349,84 @@ "vega": "^6.0.0" } }, + "node_modules/vega-lite/node_modules/vega-expression": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-6.1.0.tgz", + "integrity": "sha512-hHgNx/fQ1Vn1u6vHSamH7lRMsOa/yQeHGGcWVmh8fZafLdwdhCM91kZD9p7+AleNpgwiwzfGogtpATFaMmDFYg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@types/estree": "^1.0.8", + "vega-util": "^2.1.0" + } + }, "node_modules/vega-loader": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-5.1.0.tgz", - "integrity": "sha512-GaY3BdSPbPNdtrBz8SYUBNmNd8mdPc3mtdZfdkFazQ0RD9m+Toz5oR8fKnTamNSk9fRTJX0Lp3uEqxrAlQVreg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-5.1.3.tgz", + "integrity": "sha512-gJGoI262B5EEUGRFRY2mH+SJbVc+b4MTQfASNYpyIBqGxHqmjvNQqTyB+7bjReRYJjExjXL/MnKJmJHL6dAOwA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-dsv": "^3.0.1", "topojson-client": "^3.1.0", - "vega-format": "^2.1.0", - "vega-util": "^2.1.0" + "vega-format": "^2.1.3", + "vega-util": "^2.1.3" } }, "node_modules/vega-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-7.1.0.tgz", - "integrity": "sha512-g0lrYxtmYVW8G6yXpIS4J3Uxt9OUSkc0bLu5afoYDo4rZmoOOdll3x3ebActp5LHPW+usZIE+p5nukRS2vEc7Q==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-7.1.3.tgz", + "integrity": "sha512-bT0pmzPF79ECFilKotgo92OUi25MGGgrEj9M0piiIpJZXQwcF2xsCf+5YRND1R0zd4zodNpqpJtIw0sl6TaqMg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "vega-dataflow": "^6.1.0", + "vega-dataflow": "^6.1.3", "vega-event-selector": "^4.0.0", - "vega-functions": "^6.1.0", - "vega-scale": "^8.1.0", - "vega-util": "^2.1.0" + "vega-functions": "^6.2.0", + "vega-scale": "^8.1.3", + "vega-util": "^2.1.3" } }, "node_modules/vega-projection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-2.1.0.tgz", - "integrity": "sha512-EjRjVSoMR5ibrU7q8LaOQKP327NcOAM1+eZ+NO4ANvvAutwmbNVTmfA1VpPH+AD0AlBYc39ND/wnRk7SieDiXA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-2.1.3.tgz", + "integrity": "sha512-IYGBnT+8a3ZH2bOM48c2qSZAnuPyyYTua/kMeXjwxFKI1/BjzlchQ9QCKxGeBqJGdG2pp9YMW2oS/F1dw/IQXw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-geo": "^3.1.1", "d3-geo-projection": "^4.0.0", - "vega-scale": "^8.1.0" + "vega-scale": "^8.1.3" } }, "node_modules/vega-regression": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-2.1.0.tgz", - "integrity": "sha512-HzC7MuoEwG1rIxRaNTqgcaYF03z/ZxYkQR2D5BN0N45kLnHY1HJXiEcZkcffTsqXdspLjn47yLi44UoCwF5fxQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-2.1.3.tgz", + "integrity": "sha512-qssCjc6KEV8pUQEEliZSTRv4cuhl5D2MgyfbKnIYbJM7B/lW/vubCPBr8oGzxVEGJd3D5kxEtXJORPipawdVEA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", - "vega-dataflow": "^6.1.0", + "vega-dataflow": "^6.1.3", "vega-statistics": "^2.0.0", - "vega-util": "^2.1.0" + "vega-util": "^2.1.3" } }, "node_modules/vega-runtime": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-7.1.0.tgz", - "integrity": "sha512-mItI+WHimyEcZlZrQ/zYR3LwHVeyHCWwp7MKaBjkU8EwkSxEEGVceyGUY9X2YuJLiOgkLz/6juYDbMv60pfwYA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-7.1.3.tgz", + "integrity": "sha512-27id9NGfnGh0u/NpQMagAmS5wDa7ELKDv1SYysiJp05HOYPuLD9XT3NSblPjZhDhyk1eApzWJAoegUoosJJtkA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "vega-dataflow": "^6.1.0", - "vega-util": "^2.1.0" + "vega-dataflow": "^6.1.3", + "vega-util": "^2.1.3" } }, "node_modules/vega-scale": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-8.1.0.tgz", - "integrity": "sha512-VEgDuEcOec8+C8+FzLcnAmcXrv2gAJKqQifCdQhkgnsLa978vYUgVfCut/mBSMMHbH8wlUV1D0fKZTjRukA1+A==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-8.1.3.tgz", + "integrity": "sha512-6Tx/1XMz2EtjOZm2zEONqJfYGfUWwSauhEyMCH5XWpnqoGjHQfDzDCFtBUFDs/6N+nNi3ldxCshraMiC4XCXLg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4404,23 +4434,23 @@ "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-scale-chromatic": "^3.1.0", - "vega-time": "^3.1.0", - "vega-util": "^2.1.0" + "vega-time": "^3.3.0", + "vega-util": "^2.1.3" } }, "node_modules/vega-scenegraph": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-5.1.0.tgz", - "integrity": "sha512-4gA89CFIxkZX+4Nvl8SZF2MBOqnlj9J5zgdPh/HPx+JOwtzSlUqIhxFpFj7GWYfwzr/PyZnguBLPihPw1Og/cA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-5.3.0.tgz", + "integrity": "sha512-sJbrDxGhyw8KFgC8NIEPBsZBZaOHAO4YtFcjw71bqIwVy6kIHlzc5I+buvJkEcBKkSTbsIdKRT1jUOHPDbBEKw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-path": "^3.1.0", "d3-shape": "^3.2.0", "vega-canvas": "^2.0.0", - "vega-loader": "^5.1.0", - "vega-scale": "^8.1.0", - "vega-util": "^2.1.0" + "vega-loader": "^5.1.3", + "vega-scale": "^8.1.3", + "vega-util": "^2.1.3" } }, "node_modules/vega-schema-url-parser": { @@ -4431,15 +4461,15 @@ "license": "BSD-3-Clause" }, "node_modules/vega-selections": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-6.1.2.tgz", - "integrity": "sha512-xJ+V4qdd46nk2RBdwIRrQm2iSTMHdlu/omhLz1pqRL3jZDrkqNBXimrisci2kIKpH2WBpA1YVagwuZEKBmF2Qw==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-6.1.5.tgz", + "integrity": "sha512-evYoCV1wuE0kuiDrKH2dVVweMUuz0pNN7rYTYKBSNDqa7TBjDU4+tbWFm/CgowoaAqjC6Omd+jEZz9lwpgeE3w==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-array": "3.2.4", - "vega-expression": "^6.1.0", - "vega-util": "^2.1.0" + "vega-expression": "^6.2.2", + "vega-util": "^2.1.3" } }, "node_modules/vega-statistics": { @@ -4467,117 +4497,117 @@ } }, "node_modules/vega-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-3.1.0.tgz", - "integrity": "sha512-G93mWzPwNa6UYQRkr8Ujur9uqxbBDjDT/WpXjbDY0yygdSkRT+zXF+Sb4gjhW0nPaqdiwkn0R6kZcSPMj1bMNA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-3.3.0.tgz", + "integrity": "sha512-bm9uMPrGIPQ52jD3Ltr6gUspogDtO0G8pEzLKvLySX84reeShHTH6jOd9YXwISNfuS4LT+cmPr9Ct6TMgvPMOA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-time": "^3.1.0", - "vega-util": "^2.1.0" + "vega-util": "^2.1.3" } }, "node_modules/vega-tooltip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-1.0.0.tgz", - "integrity": "sha512-P1R0JP29v0qnTuwzCQ0SPJlkjAzr6qeyj+H4VgUFSykHmHc1OBxda//XBaFDl/bZgIscEMvjKSjZpXd84x3aZQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-1.1.0.tgz", + "integrity": "sha512-PP4CxC8gX//SBUtlcJkwffmvdZBvzAsqS0EANBKvImJ9PxV/KtJkcs7RCqp+A7nh2cjWdVzyOBWAvqKhXJStTQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "vega-util": "^2.0.0" + "vega-util": "^2.1.0" }, "funding": { "url": "https://app.hubspot.com/payments/GyPC972GD9Rt" } }, "node_modules/vega-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-5.1.0.tgz", - "integrity": "sha512-mj/sO2tSuzzpiXX8JSl4DDlhEmVwM/46MTAzTNQUQzJPMI/n4ChCjr/SdEbfEyzlD4DPm1bjohZGjLc010yuMg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-5.2.2.tgz", + "integrity": "sha512-0vlu/36sBbHKw4dN/7BKCUPOzXc2oYObRxGMcROFLk+BwfjE/cqtfuXbLHzOinXtfLOhblmT0Agx+BSYXN8k/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", - "vega-dataflow": "^6.1.0", + "vega-dataflow": "^6.1.3", "vega-statistics": "^2.0.0", - "vega-time": "^3.1.0", - "vega-util": "^2.1.0" + "vega-time": "^3.3.0", + "vega-util": "^2.1.3" } }, "node_modules/vega-typings": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-2.1.0.tgz", - "integrity": "sha512-zdis4Fg4gv37yEvTTSZEVMNhp8hwyEl7GZ4X4HHddRVRKxWFsbyKvZx/YW5Z9Ox4sjxVA2qHzEbod4Fdx+SEJA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-2.3.0.tgz", + "integrity": "sha512-CLS2Rd9MUlw1GLzXfNIrs6ubD0gMq/7AtaBUfhlmpAXjxnb15fZ3pJ9cOMmqu5lxdxHYr8eqSNoiIGgpJsiFMQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@types/geojson": "7946.0.16", "vega-event-selector": "^4.0.0", - "vega-expression": "^6.1.0", - "vega-util": "^2.1.0" + "vega-expression": "^6.2.2", + "vega-util": "^2.1.3" } }, "node_modules/vega-util": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-2.1.1.tgz", - "integrity": "sha512-tpNmm8bGtUa8gKfFDSjXPffxqSyPr91vaWIEBnJS/rijhoLZMwM+mgYQG6XfwdcBSN1+jkZ57P0sYSEW/jophw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-2.1.3.tgz", + "integrity": "sha512-Znj01Gj5XVUw/U7QvwjMhl+XCGs09UF5KDyMXZz9NtjhoKP04anWjcbA7hqoVH+eEigO92KlTi+Yai6Roo1n0A==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/vega-view": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-6.1.0.tgz", - "integrity": "sha512-hmHDm/zC65lb23mb9Tr9Gx0wkxP0TMS31LpMPYxIZpvInxvUn7TYitkOtz1elr63k2YZrgmF7ztdGyQ4iCQ5fQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-6.2.0.tgz", + "integrity": "sha512-e07jIm9BbLAnmSPCusxCNYstflMXE8qpQUKqfCmCcoRoE6TFnfGbjLLDsxeVpQtOnCj7PglxQw3Fx9/J4IEVaQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-array": "^3.2.4", "d3-timer": "^3.0.1", - "vega-dataflow": "^6.1.0", - "vega-format": "^2.1.0", - "vega-functions": "^6.1.0", - "vega-runtime": "^7.1.0", - "vega-scenegraph": "^5.1.0", - "vega-util": "^2.1.0" + "vega-dataflow": "^6.1.3", + "vega-format": "^2.1.3", + "vega-functions": "^6.2.0", + "vega-runtime": "^7.1.3", + "vega-scenegraph": "^5.3.0", + "vega-util": "^2.1.3" } }, "node_modules/vega-view-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-5.1.0.tgz", - "integrity": "sha512-fpigh/xn/32t+An1ShoY3MLeGzNdlbAp2+HvFKzPpmpMTZqJEWkk/J/wHU7Swyc28Ta7W1z3fO+8dZkOYO5TWQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-5.2.2.tgz", + "integrity": "sha512-Zsfqy0AzCStVSEoS2lf416heWQp0lQpg9LxJhqLJVZLpTh9UzcTdxP5hMwN1StrB2gWCk7TEfBgJC9FBBzxiZA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "vega-dataflow": "^6.1.0", - "vega-scenegraph": "^5.1.0", - "vega-util": "^2.1.0" + "vega-dataflow": "^6.1.3", + "vega-scenegraph": "^5.3.0", + "vega-util": "^2.1.3" } }, "node_modules/vega-voronoi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-5.1.0.tgz", - "integrity": "sha512-uKdsoR9x60mz7eYtVG+NhlkdQXeVdMr6jHNAHxs+W+i6kawkUp5S9jp1xf1FmW/uZvtO1eqinHQNwATcDRsiUg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-5.1.3.tgz", + "integrity": "sha512-1EYf2KFE/otZmjyQSw2xisnT6QDXouyofHBI9o9C1zOfNM284+wmJ0qbvL46wX9jEauH+RKG5qnx0eDWQHVjYw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-delaunay": "^6.0.4", - "vega-dataflow": "^6.1.0", - "vega-util": "^2.1.0" + "vega-dataflow": "^6.1.3", + "vega-util": "^2.1.3" } }, "node_modules/vega-wordcloud": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-5.1.0.tgz", - "integrity": "sha512-sSdNmT8y2D7xXhM2h76dKyaYn3PA4eV49WUUkfYfqHz/vpcu10GSAoFxLhQQTkbZXR+q5ZB63tFUow9W2IFo6g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-5.1.3.tgz", + "integrity": "sha512-DxghqU1U9VPSKWmvatyQiDNShz1XfKv/XnIGlRWYdfTMnZvD3Y46mdrxPBhqFMF6TQKjZKyeqz5GtukA/RaH5Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "vega-canvas": "^2.0.0", - "vega-dataflow": "^6.1.0", - "vega-scale": "^8.1.0", + "vega-dataflow": "^6.1.3", + "vega-scale": "^8.1.3", "vega-statistics": "^2.0.0", - "vega-util": "^2.1.0" + "vega-util": "^2.1.3" } }, "node_modules/vite": { @@ -5463,8 +5493,8 @@ "vitest": "^1.6.0" } }, - "packages/lifeboard": { - "name": "@ivanmkc/termchart-lifeboard", + "packages/termchart-client": { + "name": "@ivanmkc/termchart-client", "version": "0.1.0", "license": "MIT", "devDependencies": { diff --git a/packages/lifeboard/README.md b/packages/termchart-client/README.md similarity index 95% rename from packages/lifeboard/README.md rename to packages/termchart-client/README.md index f026629d..ce16ab4d 100644 --- a/packages/lifeboard/README.md +++ b/packages/termchart-client/README.md @@ -14,7 +14,7 @@ There is no server. Nothing here talks to a backend we run, because there isn't ```bash npm install # from the repo root -npm run serve --workspace @ivanmkc/termchart-lifeboard +npm run serve --workspace @ivanmkc/termchart-client ``` Then open . The app seeds a short list on first run so there is something to @@ -24,7 +24,7 @@ look at. It works with no assistant connected — connecting one is a separate s To build without serving: ```bash -npm run build --workspace @ivanmkc/termchart-lifeboard # -> dist/ +npm run build --workspace @ivanmkc/termchart-client # -> dist/ ``` `dist/` is a folder of static files. Any static host will serve it. Offline support needs a secure @@ -125,8 +125,8 @@ in the shell, and ship a pack that teaches the model what content to write. ## Testing ```bash -npm test --workspace @ivanmkc/termchart-lifeboard # unit + integration (fake IndexedDB) -npm run test:e2e --workspace @ivanmkc/termchart-lifeboard # builds, then drives a real browser offline +npm test --workspace @ivanmkc/termchart-client # unit + integration (fake IndexedDB) +npm run test:e2e --workspace @ivanmkc/termchart-client # builds, then drives a real browser offline ``` The e2e is the one that matters: it switches the network off and proves the app still renders, diff --git a/packages/lifeboard/e2e/offline.e2e.mjs b/packages/termchart-client/e2e/offline.e2e.mjs similarity index 100% rename from packages/lifeboard/e2e/offline.e2e.mjs rename to packages/termchart-client/e2e/offline.e2e.mjs diff --git a/packages/lifeboard/package.json b/packages/termchart-client/package.json similarity index 95% rename from packages/lifeboard/package.json rename to packages/termchart-client/package.json index b3955d11..746417fd 100644 --- a/packages/lifeboard/package.json +++ b/packages/termchart-client/package.json @@ -1,5 +1,5 @@ { - "name": "@ivanmkc/termchart-lifeboard", + "name": "@ivanmkc/termchart-client", "version": "0.1.0", "private": true, "description": "lifeboard \u2014 a local-first family dashboard rendered on the termchart canvas.", diff --git a/packages/lifeboard/scripts/serve.mjs b/packages/termchart-client/scripts/serve.mjs similarity index 97% rename from packages/lifeboard/scripts/serve.mjs rename to packages/termchart-client/scripts/serve.mjs index ecb097e8..02d56cbf 100644 --- a/packages/lifeboard/scripts/serve.mjs +++ b/packages/termchart-client/scripts/serve.mjs @@ -1,7 +1,7 @@ // A static server for the built app. No dependencies: lifeboard is a folder of files, and the whole // point is that anything which can serve a folder can serve it. // -// npm run serve --workspace @ivanmkc/termchart-lifeboard +// npm run serve --workspace @ivanmkc/termchart-client // // Binds all interfaces so an iPad on the same wifi can open it. That is the intended way to use // this: build on a laptop, open on the tablet on the kitchen counter. diff --git a/packages/lifeboard/src/actions/bar.ts b/packages/termchart-client/src/actions/bar.ts similarity index 100% rename from packages/lifeboard/src/actions/bar.ts rename to packages/termchart-client/src/actions/bar.ts diff --git a/packages/lifeboard/src/actions/cart.ts b/packages/termchart-client/src/actions/cart.ts similarity index 100% rename from packages/lifeboard/src/actions/cart.ts rename to packages/termchart-client/src/actions/cart.ts diff --git a/packages/lifeboard/src/agent/connections.ts b/packages/termchart-client/src/agent/connections.ts similarity index 100% rename from packages/lifeboard/src/agent/connections.ts rename to packages/termchart-client/src/agent/connections.ts diff --git a/packages/lifeboard/src/agent/envelope.ts b/packages/termchart-client/src/agent/envelope.ts similarity index 100% rename from packages/lifeboard/src/agent/envelope.ts rename to packages/termchart-client/src/agent/envelope.ts diff --git a/packages/lifeboard/src/agent/loop.ts b/packages/termchart-client/src/agent/loop.ts similarity index 100% rename from packages/lifeboard/src/agent/loop.ts rename to packages/termchart-client/src/agent/loop.ts diff --git a/packages/lifeboard/src/agent/prompt.ts b/packages/termchart-client/src/agent/prompt.ts similarity index 100% rename from packages/lifeboard/src/agent/prompt.ts rename to packages/termchart-client/src/agent/prompt.ts diff --git a/packages/lifeboard/src/agent/providers/anthropic.ts b/packages/termchart-client/src/agent/providers/anthropic.ts similarity index 100% rename from packages/lifeboard/src/agent/providers/anthropic.ts rename to packages/termchart-client/src/agent/providers/anthropic.ts diff --git a/packages/lifeboard/src/agent/providers/fake.ts b/packages/termchart-client/src/agent/providers/fake.ts similarity index 100% rename from packages/lifeboard/src/agent/providers/fake.ts rename to packages/termchart-client/src/agent/providers/fake.ts diff --git a/packages/lifeboard/src/agent/providers/google.ts b/packages/termchart-client/src/agent/providers/google.ts similarity index 100% rename from packages/lifeboard/src/agent/providers/google.ts rename to packages/termchart-client/src/agent/providers/google.ts diff --git a/packages/lifeboard/src/agent/providers/openai-shape.ts b/packages/termchart-client/src/agent/providers/openai-shape.ts similarity index 100% rename from packages/lifeboard/src/agent/providers/openai-shape.ts rename to packages/termchart-client/src/agent/providers/openai-shape.ts diff --git a/packages/lifeboard/src/agent/providers/openai.ts b/packages/termchart-client/src/agent/providers/openai.ts similarity index 100% rename from packages/lifeboard/src/agent/providers/openai.ts rename to packages/termchart-client/src/agent/providers/openai.ts diff --git a/packages/lifeboard/src/agent/providers/openrouter.ts b/packages/termchart-client/src/agent/providers/openrouter.ts similarity index 100% rename from packages/lifeboard/src/agent/providers/openrouter.ts rename to packages/termchart-client/src/agent/providers/openrouter.ts diff --git a/packages/lifeboard/src/agent/providers/types.ts b/packages/termchart-client/src/agent/providers/types.ts similarity index 100% rename from packages/lifeboard/src/agent/providers/types.ts rename to packages/termchart-client/src/agent/providers/types.ts diff --git a/packages/lifeboard/src/app.ts b/packages/termchart-client/src/app.ts similarity index 100% rename from packages/lifeboard/src/app.ts rename to packages/termchart-client/src/app.ts diff --git a/packages/lifeboard/src/backup.ts b/packages/termchart-client/src/backup.ts similarity index 100% rename from packages/lifeboard/src/backup.ts rename to packages/termchart-client/src/backup.ts diff --git a/packages/lifeboard/src/boards.ts b/packages/termchart-client/src/boards.ts similarity index 100% rename from packages/lifeboard/src/boards.ts rename to packages/termchart-client/src/boards.ts diff --git a/packages/lifeboard/src/bridge/client.ts b/packages/termchart-client/src/bridge/client.ts similarity index 100% rename from packages/lifeboard/src/bridge/client.ts rename to packages/termchart-client/src/bridge/client.ts diff --git a/packages/lifeboard/src/connectors/deeplinks.ts b/packages/termchart-client/src/connectors/deeplinks.ts similarity index 100% rename from packages/lifeboard/src/connectors/deeplinks.ts rename to packages/termchart-client/src/connectors/deeplinks.ts diff --git a/packages/lifeboard/src/console.ts b/packages/termchart-client/src/console.ts similarity index 100% rename from packages/lifeboard/src/console.ts rename to packages/termchart-client/src/console.ts diff --git a/packages/lifeboard/src/contacts.ts b/packages/termchart-client/src/contacts.ts similarity index 100% rename from packages/lifeboard/src/contacts.ts rename to packages/termchart-client/src/contacts.ts diff --git a/packages/lifeboard/src/css.d.ts b/packages/termchart-client/src/css.d.ts similarity index 100% rename from packages/lifeboard/src/css.d.ts rename to packages/termchart-client/src/css.d.ts diff --git a/packages/lifeboard/src/google/calendar.ts b/packages/termchart-client/src/google/calendar.ts similarity index 100% rename from packages/lifeboard/src/google/calendar.ts rename to packages/termchart-client/src/google/calendar.ts diff --git a/packages/lifeboard/src/google/gmail.ts b/packages/termchart-client/src/google/gmail.ts similarity index 100% rename from packages/lifeboard/src/google/gmail.ts rename to packages/termchart-client/src/google/gmail.ts diff --git a/packages/lifeboard/src/google/oauth.ts b/packages/termchart-client/src/google/oauth.ts similarity index 100% rename from packages/lifeboard/src/google/oauth.ts rename to packages/termchart-client/src/google/oauth.ts diff --git a/packages/lifeboard/src/google/sync.ts b/packages/termchart-client/src/google/sync.ts similarity index 100% rename from packages/lifeboard/src/google/sync.ts rename to packages/termchart-client/src/google/sync.ts diff --git a/packages/lifeboard/src/index.html b/packages/termchart-client/src/index.html similarity index 100% rename from packages/lifeboard/src/index.html rename to packages/termchart-client/src/index.html diff --git a/packages/lifeboard/src/jobs/card.ts b/packages/termchart-client/src/jobs/card.ts similarity index 100% rename from packages/lifeboard/src/jobs/card.ts rename to packages/termchart-client/src/jobs/card.ts diff --git a/packages/lifeboard/src/jobs/mirror.ts b/packages/termchart-client/src/jobs/mirror.ts similarity index 100% rename from packages/lifeboard/src/jobs/mirror.ts rename to packages/termchart-client/src/jobs/mirror.ts diff --git a/packages/lifeboard/src/log.ts b/packages/termchart-client/src/log.ts similarity index 100% rename from packages/lifeboard/src/log.ts rename to packages/termchart-client/src/log.ts diff --git a/packages/lifeboard/src/mail/classify.ts b/packages/termchart-client/src/mail/classify.ts similarity index 100% rename from packages/lifeboard/src/mail/classify.ts rename to packages/termchart-client/src/mail/classify.ts diff --git a/packages/lifeboard/src/mail/extract.ts b/packages/termchart-client/src/mail/extract.ts similarity index 100% rename from packages/lifeboard/src/mail/extract.ts rename to packages/termchart-client/src/mail/extract.ts diff --git a/packages/lifeboard/src/mail/reconcile.ts b/packages/termchart-client/src/mail/reconcile.ts similarity index 100% rename from packages/lifeboard/src/mail/reconcile.ts rename to packages/termchart-client/src/mail/reconcile.ts diff --git a/packages/lifeboard/src/mail/triage.ts b/packages/termchart-client/src/mail/triage.ts similarity index 100% rename from packages/lifeboard/src/mail/triage.ts rename to packages/termchart-client/src/mail/triage.ts diff --git a/packages/lifeboard/src/main.ts b/packages/termchart-client/src/main.ts similarity index 100% rename from packages/lifeboard/src/main.ts rename to packages/termchart-client/src/main.ts diff --git a/packages/lifeboard/src/packs/authoring.ts b/packages/termchart-client/src/packs/authoring.ts similarity index 100% rename from packages/lifeboard/src/packs/authoring.ts rename to packages/termchart-client/src/packs/authoring.ts diff --git a/packages/lifeboard/src/packs/bindings.ts b/packages/termchart-client/src/packs/bindings.ts similarity index 100% rename from packages/lifeboard/src/packs/bindings.ts rename to packages/termchart-client/src/packs/bindings.ts diff --git a/packages/lifeboard/src/packs/bundled.ts b/packages/termchart-client/src/packs/bundled.ts similarity index 100% rename from packages/lifeboard/src/packs/bundled.ts rename to packages/termchart-client/src/packs/bundled.ts diff --git a/packages/lifeboard/src/packs/capabilities.ts b/packages/termchart-client/src/packs/capabilities.ts similarity index 100% rename from packages/lifeboard/src/packs/capabilities.ts rename to packages/termchart-client/src/packs/capabilities.ts diff --git a/packages/lifeboard/src/packs/registry.ts b/packages/termchart-client/src/packs/registry.ts similarity index 100% rename from packages/lifeboard/src/packs/registry.ts rename to packages/termchart-client/src/packs/registry.ts diff --git a/packages/lifeboard/src/packs/select.ts b/packages/termchart-client/src/packs/select.ts similarity index 100% rename from packages/lifeboard/src/packs/select.ts rename to packages/termchart-client/src/packs/select.ts diff --git a/packages/lifeboard/src/packs/types.ts b/packages/termchart-client/src/packs/types.ts similarity index 100% rename from packages/lifeboard/src/packs/types.ts rename to packages/termchart-client/src/packs/types.ts diff --git a/packages/lifeboard/src/packs/validate.ts b/packages/termchart-client/src/packs/validate.ts similarity index 100% rename from packages/lifeboard/src/packs/validate.ts rename to packages/termchart-client/src/packs/validate.ts diff --git a/packages/lifeboard/src/practice/schedule.ts b/packages/termchart-client/src/practice/schedule.ts similarity index 100% rename from packages/lifeboard/src/practice/schedule.ts rename to packages/termchart-client/src/practice/schedule.ts diff --git a/packages/lifeboard/src/prefs.ts b/packages/termchart-client/src/prefs.ts similarity index 100% rename from packages/lifeboard/src/prefs.ts rename to packages/termchart-client/src/prefs.ts diff --git a/packages/lifeboard/src/proactive/inbox.ts b/packages/termchart-client/src/proactive/inbox.ts similarity index 100% rename from packages/lifeboard/src/proactive/inbox.ts rename to packages/termchart-client/src/proactive/inbox.ts diff --git a/packages/lifeboard/src/proactive/rules.ts b/packages/termchart-client/src/proactive/rules.ts similarity index 100% rename from packages/lifeboard/src/proactive/rules.ts rename to packages/termchart-client/src/proactive/rules.ts diff --git a/packages/lifeboard/src/profiles.ts b/packages/termchart-client/src/profiles.ts similarity index 100% rename from packages/lifeboard/src/profiles.ts rename to packages/termchart-client/src/profiles.ts diff --git a/packages/lifeboard/src/provenance/graph.ts b/packages/termchart-client/src/provenance/graph.ts similarity index 100% rename from packages/lifeboard/src/provenance/graph.ts rename to packages/termchart-client/src/provenance/graph.ts diff --git a/packages/lifeboard/src/provenance/record.ts b/packages/termchart-client/src/provenance/record.ts similarity index 100% rename from packages/lifeboard/src/provenance/record.ts rename to packages/termchart-client/src/provenance/record.ts diff --git a/packages/lifeboard/src/provenance/types.ts b/packages/termchart-client/src/provenance/types.ts similarity index 100% rename from packages/lifeboard/src/provenance/types.ts rename to packages/termchart-client/src/provenance/types.ts diff --git a/packages/lifeboard/src/rail.ts b/packages/termchart-client/src/rail.ts similarity index 100% rename from packages/lifeboard/src/rail.ts rename to packages/termchart-client/src/rail.ts diff --git a/packages/lifeboard/src/recipes/merge.ts b/packages/termchart-client/src/recipes/merge.ts similarity index 100% rename from packages/lifeboard/src/recipes/merge.ts rename to packages/termchart-client/src/recipes/merge.ts diff --git a/packages/lifeboard/src/recipes/scale.ts b/packages/termchart-client/src/recipes/scale.ts similarity index 100% rename from packages/lifeboard/src/recipes/scale.ts rename to packages/termchart-client/src/recipes/scale.ts diff --git a/packages/lifeboard/src/recipes/types.ts b/packages/termchart-client/src/recipes/types.ts similarity index 100% rename from packages/lifeboard/src/recipes/types.ts rename to packages/termchart-client/src/recipes/types.ts diff --git a/packages/lifeboard/src/recipes/units.ts b/packages/termchart-client/src/recipes/units.ts similarity index 100% rename from packages/lifeboard/src/recipes/units.ts rename to packages/termchart-client/src/recipes/units.ts diff --git a/packages/lifeboard/src/shell.ts b/packages/termchart-client/src/shell.ts similarity index 100% rename from packages/lifeboard/src/shell.ts rename to packages/termchart-client/src/shell.ts diff --git a/packages/lifeboard/src/store.ts b/packages/termchart-client/src/store.ts similarity index 100% rename from packages/lifeboard/src/store.ts rename to packages/termchart-client/src/store.ts diff --git a/packages/lifeboard/src/style.css b/packages/termchart-client/src/style.css similarity index 100% rename from packages/lifeboard/src/style.css rename to packages/termchart-client/src/style.css diff --git a/packages/lifeboard/src/sw.js b/packages/termchart-client/src/sw.js similarity index 100% rename from packages/lifeboard/src/sw.js rename to packages/termchart-client/src/sw.js diff --git a/packages/lifeboard/src/tap.ts b/packages/termchart-client/src/tap.ts similarity index 100% rename from packages/lifeboard/src/tap.ts rename to packages/termchart-client/src/tap.ts diff --git a/packages/lifeboard/src/transcript.ts b/packages/termchart-client/src/transcript.ts similarity index 100% rename from packages/lifeboard/src/transcript.ts rename to packages/termchart-client/src/transcript.ts diff --git a/packages/lifeboard/src/types.ts b/packages/termchart-client/src/types.ts similarity index 100% rename from packages/lifeboard/src/types.ts rename to packages/termchart-client/src/types.ts diff --git a/packages/lifeboard/src/undo.ts b/packages/termchart-client/src/undo.ts similarity index 100% rename from packages/lifeboard/src/undo.ts rename to packages/termchart-client/src/undo.ts diff --git a/packages/lifeboard/src/views/activity.ts b/packages/termchart-client/src/views/activity.ts similarity index 100% rename from packages/lifeboard/src/views/activity.ts rename to packages/termchart-client/src/views/activity.ts diff --git a/packages/lifeboard/src/views/calendar.ts b/packages/termchart-client/src/views/calendar.ts similarity index 100% rename from packages/lifeboard/src/views/calendar.ts rename to packages/termchart-client/src/views/calendar.ts diff --git a/packages/lifeboard/src/views/connections.ts b/packages/termchart-client/src/views/connections.ts similarity index 100% rename from packages/lifeboard/src/views/connections.ts rename to packages/termchart-client/src/views/connections.ts diff --git a/packages/lifeboard/src/views/focused.ts b/packages/termchart-client/src/views/focused.ts similarity index 100% rename from packages/lifeboard/src/views/focused.ts rename to packages/termchart-client/src/views/focused.ts diff --git a/packages/lifeboard/src/views/grid.ts b/packages/termchart-client/src/views/grid.ts similarity index 100% rename from packages/lifeboard/src/views/grid.ts rename to packages/termchart-client/src/views/grid.ts diff --git a/packages/lifeboard/src/views/inbox.ts b/packages/termchart-client/src/views/inbox.ts similarity index 100% rename from packages/lifeboard/src/views/inbox.ts rename to packages/termchart-client/src/views/inbox.ts diff --git a/packages/lifeboard/src/views/lineage.ts b/packages/termchart-client/src/views/lineage.ts similarity index 100% rename from packages/lifeboard/src/views/lineage.ts rename to packages/termchart-client/src/views/lineage.ts diff --git a/packages/lifeboard/src/views/links.ts b/packages/termchart-client/src/views/links.ts similarity index 100% rename from packages/lifeboard/src/views/links.ts rename to packages/termchart-client/src/views/links.ts diff --git a/packages/lifeboard/src/views/packs.ts b/packages/termchart-client/src/views/packs.ts similarity index 100% rename from packages/lifeboard/src/views/packs.ts rename to packages/termchart-client/src/views/packs.ts diff --git a/packages/lifeboard/src/views/practice.ts b/packages/termchart-client/src/views/practice.ts similarity index 100% rename from packages/lifeboard/src/views/practice.ts rename to packages/termchart-client/src/views/practice.ts diff --git a/packages/lifeboard/src/views/recipe.ts b/packages/termchart-client/src/views/recipe.ts similarity index 100% rename from packages/lifeboard/src/views/recipe.ts rename to packages/termchart-client/src/views/recipe.ts diff --git a/packages/lifeboard/src/views/sources.ts b/packages/termchart-client/src/views/sources.ts similarity index 100% rename from packages/lifeboard/src/views/sources.ts rename to packages/termchart-client/src/views/sources.ts diff --git a/packages/lifeboard/src/views/types.ts b/packages/termchart-client/src/views/types.ts similarity index 100% rename from packages/lifeboard/src/views/types.ts rename to packages/termchart-client/src/views/types.ts diff --git a/packages/lifeboard/test/activity.test.ts b/packages/termchart-client/test/activity.test.ts similarity index 100% rename from packages/lifeboard/test/activity.test.ts rename to packages/termchart-client/test/activity.test.ts diff --git a/packages/lifeboard/test/agent-shell.test.ts b/packages/termchart-client/test/agent-shell.test.ts similarity index 100% rename from packages/lifeboard/test/agent-shell.test.ts rename to packages/termchart-client/test/agent-shell.test.ts diff --git a/packages/lifeboard/test/app.test.ts b/packages/termchart-client/test/app.test.ts similarity index 100% rename from packages/lifeboard/test/app.test.ts rename to packages/termchart-client/test/app.test.ts diff --git a/packages/lifeboard/test/backup.test.ts b/packages/termchart-client/test/backup.test.ts similarity index 100% rename from packages/lifeboard/test/backup.test.ts rename to packages/termchart-client/test/backup.test.ts diff --git a/packages/lifeboard/test/boards.test.ts b/packages/termchart-client/test/boards.test.ts similarity index 100% rename from packages/lifeboard/test/boards.test.ts rename to packages/termchart-client/test/boards.test.ts diff --git a/packages/lifeboard/test/bridge-client.test.ts b/packages/termchart-client/test/bridge-client.test.ts similarity index 100% rename from packages/lifeboard/test/bridge-client.test.ts rename to packages/termchart-client/test/bridge-client.test.ts diff --git a/packages/lifeboard/test/calendar-mail.test.ts b/packages/termchart-client/test/calendar-mail.test.ts similarity index 100% rename from packages/lifeboard/test/calendar-mail.test.ts rename to packages/termchart-client/test/calendar-mail.test.ts diff --git a/packages/lifeboard/test/cart.test.ts b/packages/termchart-client/test/cart.test.ts similarity index 100% rename from packages/lifeboard/test/cart.test.ts rename to packages/termchart-client/test/cart.test.ts diff --git a/packages/lifeboard/test/console.test.ts b/packages/termchart-client/test/console.test.ts similarity index 100% rename from packages/lifeboard/test/console.test.ts rename to packages/termchart-client/test/console.test.ts diff --git a/packages/lifeboard/test/envelope.test.ts b/packages/termchart-client/test/envelope.test.ts similarity index 100% rename from packages/lifeboard/test/envelope.test.ts rename to packages/termchart-client/test/envelope.test.ts diff --git a/packages/lifeboard/test/jobs-ui.test.ts b/packages/termchart-client/test/jobs-ui.test.ts similarity index 100% rename from packages/lifeboard/test/jobs-ui.test.ts rename to packages/termchart-client/test/jobs-ui.test.ts diff --git a/packages/lifeboard/test/log.test.ts b/packages/termchart-client/test/log.test.ts similarity index 100% rename from packages/lifeboard/test/log.test.ts rename to packages/termchart-client/test/log.test.ts diff --git a/packages/lifeboard/test/loop.test.ts b/packages/termchart-client/test/loop.test.ts similarity index 100% rename from packages/lifeboard/test/loop.test.ts rename to packages/termchart-client/test/loop.test.ts diff --git a/packages/lifeboard/test/outbound.test.ts b/packages/termchart-client/test/outbound.test.ts similarity index 100% rename from packages/lifeboard/test/outbound.test.ts rename to packages/termchart-client/test/outbound.test.ts diff --git a/packages/lifeboard/test/packs-ui.test.ts b/packages/termchart-client/test/packs-ui.test.ts similarity index 100% rename from packages/lifeboard/test/packs-ui.test.ts rename to packages/termchart-client/test/packs-ui.test.ts diff --git a/packages/lifeboard/test/packs.test.ts b/packages/termchart-client/test/packs.test.ts similarity index 100% rename from packages/lifeboard/test/packs.test.ts rename to packages/termchart-client/test/packs.test.ts diff --git a/packages/lifeboard/test/practice.test.ts b/packages/termchart-client/test/practice.test.ts similarity index 100% rename from packages/lifeboard/test/practice.test.ts rename to packages/termchart-client/test/practice.test.ts diff --git a/packages/lifeboard/test/proactive.test.ts b/packages/termchart-client/test/proactive.test.ts similarity index 100% rename from packages/lifeboard/test/proactive.test.ts rename to packages/termchart-client/test/proactive.test.ts diff --git a/packages/lifeboard/test/profiles.test.ts b/packages/termchart-client/test/profiles.test.ts similarity index 100% rename from packages/lifeboard/test/profiles.test.ts rename to packages/termchart-client/test/profiles.test.ts diff --git a/packages/lifeboard/test/provenance.test.ts b/packages/termchart-client/test/provenance.test.ts similarity index 100% rename from packages/lifeboard/test/provenance.test.ts rename to packages/termchart-client/test/provenance.test.ts diff --git a/packages/lifeboard/test/providers.test.ts b/packages/termchart-client/test/providers.test.ts similarity index 100% rename from packages/lifeboard/test/providers.test.ts rename to packages/termchart-client/test/providers.test.ts diff --git a/packages/lifeboard/test/recipe-flow.test.ts b/packages/termchart-client/test/recipe-flow.test.ts similarity index 100% rename from packages/lifeboard/test/recipe-flow.test.ts rename to packages/termchart-client/test/recipe-flow.test.ts diff --git a/packages/lifeboard/test/recipes.test.ts b/packages/termchart-client/test/recipes.test.ts similarity index 100% rename from packages/lifeboard/test/recipes.test.ts rename to packages/termchart-client/test/recipes.test.ts diff --git a/packages/lifeboard/test/shell.test.ts b/packages/termchart-client/test/shell.test.ts similarity index 100% rename from packages/lifeboard/test/shell.test.ts rename to packages/termchart-client/test/shell.test.ts diff --git a/packages/lifeboard/test/store.test.ts b/packages/termchart-client/test/store.test.ts similarity index 100% rename from packages/lifeboard/test/store.test.ts rename to packages/termchart-client/test/store.test.ts diff --git a/packages/lifeboard/test/sync.test.ts b/packages/termchart-client/test/sync.test.ts similarity index 100% rename from packages/lifeboard/test/sync.test.ts rename to packages/termchart-client/test/sync.test.ts diff --git a/packages/lifeboard/test/units.test.ts b/packages/termchart-client/test/units.test.ts similarity index 100% rename from packages/lifeboard/test/units.test.ts rename to packages/termchart-client/test/units.test.ts diff --git a/packages/lifeboard/test/views.test.ts b/packages/termchart-client/test/views.test.ts similarity index 100% rename from packages/lifeboard/test/views.test.ts rename to packages/termchart-client/test/views.test.ts diff --git a/packages/lifeboard/tsconfig.json b/packages/termchart-client/tsconfig.json similarity index 100% rename from packages/lifeboard/tsconfig.json rename to packages/termchart-client/tsconfig.json From 199c47a1cfdd3e8ce69f959e58123d542fd9f5a8 Mon Sep 17 00:00:00 2001 From: Ivan Cheung Date: Sat, 5 Sep 2026 00:12:34 -0400 Subject: [PATCH 4/5] chore(sdd): record SP-A completion in ledger Co-Authored-By: Claude Fable 5 --- .../progress.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/progress.md b/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/progress.md index a41bc947..11875903 100644 --- a/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/progress.md +++ b/.superpowers/sdd/2026-09-04-rename-lifeboard-to-termchart-client/progress.md @@ -11,3 +11,7 @@ Task 1: sonnet (cross-file rename with build integration — multiple files, mis ## Progress Task 1: dispatching implementer (sonnet), BASE c320e86. +Task 1: implementer DONE_WITH_CONCERNS (35a0e5e). Concerns assessed: (a) grep matches 3 self-referential docs (lifeboard-foundation plan, this rename plan, task-1-brief) — left by design per "package rename only" constraint; all functional files clean. (b) package-lock stale entry resolved via full lock regen (rm -rf node_modules package-lock.json && npm install) — 1946-line lock diff, excluded from review diff. (c) flaky failures in packages/canvas (untouched) + termchart-client/outbound.test.ts verified pre-existing via git stash on pre-rename code — NOT a regression; renamed pkg own suite 431/431 + e2e 23/23 green. Proceeding to review, BASE c320e86 HEAD 35a0e5e. +Task 1: complete (commits c320e86..35a0e5e, review APPROVED — history-preserving rename, no functional stale refs, canvas/core untouched, lock regen sound, flakiness pre-existing). +Ruling: skip the separate final whole-branch review — this is a single-task mechanical plan; the task review's diff IS the whole branch (c320e86..35a0e5e), so a final review would re-read the identical diff. Cost if wrong: a broad-lens defect the task review missed goes uncaught, but the task review already covered the full branch scope. +SP-A COMPLETE. Awaiting finishing-a-development-branch decision (push/PR in termchart is an outward action — user's call). Workspace retained until merge. From c4db1250340d235a9f7a204f52da93bf9e7b4faf Mon Sep 17 00:00:00 2001 From: Ivan Cheung Date: Sat, 5 Sep 2026 10:39:22 -0400 Subject: [PATCH 5/5] =?UTF-8?q?chore:=20remove=20lifeboard=20branding=20?= =?UTF-8?q?=E2=80=94=20the=20client=20is=20Termchart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sweeps every remaining "lifeboard" reference from active repo content (docs, UI copy, comments, prompts, tests) now that the package itself has been renamed to @ivanmkc/termchart-client. docs/lifeboard/ moves to docs/client/ (history-preserving git mv), with all inbound links fixed. Persisted identifiers are renamed with NO migration, per a pre-launch controller ruling (no real device data exists yet to lose): the IndexedDB store name, every "lifeboard.*" localStorage/prefs key (profiles, bridge url/token, Google OAuth token/verifier, connections, sync bookkeeping), the service worker cache name, and a transient prefs probe key. The one exception is the backup file format tag: export now writes "termchart-backup" / termchart-.json, but readBackup() also accepts the legacy "lifeboard-backup" tag so backups already exported by users still restore — the only legacy shim in this sweep. docs/superpowers/** and .superpowers/** are left untouched (historical plan/spec records), so `docs/client/README.md`'s links to those files and one legacy-acceptance line + test in backup.ts/backup.test.ts are the only "lifeboard" strings left in scope after this change. Co-Authored-By: Claude Fable 5 --- README.md | 4 +- docs/{lifeboard => client}/README.md | 2 +- docs/{lifeboard => client}/bridge.md | 4 +- docs/{lifeboard => client}/deck.html | 242 +++++++++--------- docs/{lifeboard => client}/index.html | 242 +++++++++--------- .../integrations-plan.md | 4 +- .../persistence-audit.md | 0 docs/{lifeboard => client}/qa-guide.md | 4 +- docs/{lifeboard => client}/user-guide.md | 10 +- packages/canvas/src/index.ts | 2 +- packages/canvas/src/interact.ts | 6 +- packages/canvas/test/practice.test.tsx | 2 +- packages/cli/src/bridge.ts | 8 +- packages/cli/src/bridge/security.ts | 6 +- packages/cli/src/bridge/server.ts | 4 +- packages/cli/test/bridge.test.ts | 14 +- packages/termchart-client/README.md | 12 +- packages/termchart-client/e2e/offline.e2e.mjs | 7 +- packages/termchart-client/package.json | 2 +- packages/termchart-client/scripts/serve.mjs | 6 +- .../termchart-client/src/agent/connections.ts | 4 +- packages/termchart-client/src/agent/prompt.ts | 2 +- .../src/agent/providers/openrouter.ts | 4 +- packages/termchart-client/src/app.ts | 4 +- packages/termchart-client/src/backup.ts | 19 +- .../termchart-client/src/bridge/client.ts | 6 +- packages/termchart-client/src/google/oauth.ts | 4 +- packages/termchart-client/src/google/sync.ts | 6 +- packages/termchart-client/src/index.html | 2 +- packages/termchart-client/src/main.ts | 2 +- .../termchart-client/src/packs/authoring.ts | 2 +- packages/termchart-client/src/prefs.ts | 2 +- .../termchart-client/src/proactive/inbox.ts | 2 +- packages/termchart-client/src/profiles.ts | 2 +- packages/termchart-client/src/shell.ts | 4 +- packages/termchart-client/src/store.ts | 4 +- packages/termchart-client/src/sw.js | 2 +- packages/termchart-client/src/transcript.ts | 2 +- .../termchart-client/src/views/connections.ts | 14 +- packages/termchart-client/src/views/inbox.ts | 2 +- packages/termchart-client/src/views/packs.ts | 2 +- .../termchart-client/test/agent-shell.test.ts | 12 +- packages/termchart-client/test/backup.test.ts | 25 +- .../test/bridge-client.test.ts | 10 +- .../test/calendar-mail.test.ts | 12 +- .../termchart-client/test/outbound.test.ts | 2 +- .../termchart-client/test/practice.test.ts | 8 +- .../termchart-client/test/providers.test.ts | 8 +- packages/termchart-client/test/sync.test.ts | 22 +- 49 files changed, 393 insertions(+), 378 deletions(-) rename docs/{lifeboard => client}/README.md (99%) rename docs/{lifeboard => client}/bridge.md (97%) rename docs/{lifeboard => client}/deck.html (98%) rename docs/{lifeboard => client}/index.html (98%) rename docs/{lifeboard => client}/integrations-plan.md (98%) rename docs/{lifeboard => client}/persistence-audit.md (100%) rename docs/{lifeboard => client}/qa-guide.md (98%) rename docs/{lifeboard => client}/user-guide.md (97%) diff --git a/README.md b/README.md index da35e013..fd4dc13d 100644 --- a/README.md +++ b/README.md @@ -32,12 +32,12 @@ It ships as a **CLI** (`termchart`) plus a **Claude Code plugin** (skills + the --- -## lifeboard +## The Termchart client A family board built on the same canvas: your lists, calendar and recipes in the browser, with an assistant that can read them, change them, and draw new boards. No server, works offline. -[User guide](docs/lifeboard/user-guide.md) · [QA guide](docs/lifeboard/qa-guide.md) · +[User guide](docs/client/user-guide.md) · [QA guide](docs/client/qa-guide.md) · [Package](packages/termchart-client/) ## Use it — just ask your agent diff --git a/docs/lifeboard/README.md b/docs/client/README.md similarity index 99% rename from docs/lifeboard/README.md rename to docs/client/README.md index 11769ed9..6ce76837 100644 --- a/docs/lifeboard/README.md +++ b/docs/client/README.md @@ -1,4 +1,4 @@ -# lifeboard +# Termchart client > **A dashboard that reshapes itself around your family — kept by an agent that works while you don't.** diff --git a/docs/lifeboard/bridge.md b/docs/client/bridge.md similarity index 97% rename from docs/lifeboard/bridge.md rename to docs/client/bridge.md index 2e5bea07..7d951b03 100644 --- a/docs/lifeboard/bridge.md +++ b/docs/client/bridge.md @@ -1,6 +1,6 @@ # The bridge -The bridge is an optional program you run on your Mac. lifeboard works without it. With it: +The bridge is an optional program you run on your Mac. Termchart works without it. With it: - turns run through the **AI subscriptions you already pay for** — Claude Pro, ChatGPT Plus, Google AI — instead of a metered API key; @@ -23,7 +23,7 @@ termchart bridge listening on http://127.0.0.1:8787 token: 3Qb7… (copy this) agents ready: Claude Code (Claude Pro) Codex CLI is installed but signed out — run `codex login` -paste the token into lifeboard → Connect. Loopback only; nothing else on the network can reach it. +paste the token into Termchart → Connect. Loopback only; nothing else on the network can reach it. ``` Then in the app: **Connect → Your Mac → Look for a bridge**, paste the token, and pick an agent. diff --git a/docs/lifeboard/deck.html b/docs/client/deck.html similarity index 98% rename from docs/lifeboard/deck.html rename to docs/client/deck.html index afb4858d..62f35234 100644 --- a/docs/lifeboard/deck.html +++ b/docs/client/deck.html @@ -1,6 +1,6 @@ -lifeboard — design deck +Termchart — design deck