@fungi.computer/tourtois 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +19 -0
  2. package/dist/AppAccessConsent.d.ts +6 -1
  3. package/dist/AppAccessConsent.js +4 -5
  4. package/dist/AppDesktopSettings.d.ts +2 -2
  5. package/dist/AppPane.d.ts +11 -4
  6. package/dist/AppPane.js +50 -10
  7. package/dist/AppWorkbench.d.ts +1 -1
  8. package/dist/AppWorkbench.js +10 -5
  9. package/dist/AvatarPreview.d.ts +8 -1
  10. package/dist/AvatarPreview.js +9 -1
  11. package/dist/Keys.d.ts +42 -121
  12. package/dist/Keys.js +200 -157
  13. package/dist/OysterComputers.d.ts +22 -0
  14. package/dist/OysterComputers.js +177 -0
  15. package/dist/SettingsNavigation.d.ts +1 -1
  16. package/dist/SettingsNavigation.js +1 -1
  17. package/dist/SystemSettings.d.ts +2 -2
  18. package/dist/SystemSettings.js +1 -1
  19. package/dist/TeamDesktop.d.ts +1 -1
  20. package/dist/app-authority.d.ts +37 -37
  21. package/dist/app-authority.js +1 -1
  22. package/dist/app-directory-reconciliation.js +7 -2
  23. package/dist/app-directory.d.ts +6 -5
  24. package/dist/app-directory.js +4 -1
  25. package/dist/app-launch.d.ts +1 -1
  26. package/dist/app-launch.js +6 -3
  27. package/dist/app-menus.d.ts +1 -1
  28. package/dist/app-surface.d.ts +2 -1
  29. package/dist/app-windows.d.ts +5 -2
  30. package/dist/app-windows.js +1 -1
  31. package/dist/command-dialogs.d.ts +1 -1
  32. package/dist/command-dialogs.js +4 -4
  33. package/dist/desktop/Desktop.d.ts +1 -1
  34. package/dist/desktop/consent.d.ts +1 -1
  35. package/dist/desktop/consent.js +1 -1
  36. package/dist/desktop/row-gill.d.ts +1 -1
  37. package/dist/oyster-platform-controls.d.ts +1 -1
  38. package/dist/oyster-platform-controls.js +64 -23
  39. package/dist/platform-controls.d.ts +6 -5
  40. package/dist/platform-controls.js +3 -3
  41. package/dist/queries.d.ts +4 -0
  42. package/dist/queries.js +4 -0
  43. package/dist/shell-commands.d.ts +1 -1
  44. package/dist/shell-commands.js +4 -4
  45. package/dist/shell-host.d.ts +7 -9
  46. package/dist/shell-host.js +36 -10
  47. package/dist/shell-module.d.ts +1 -1
  48. package/dist/shell.d.ts +1 -1
  49. package/dist/shell.js +5 -9
  50. package/dist/useAppWindowManager.d.ts +4 -1
  51. package/dist/useAppWindowManager.js +3 -0
  52. package/package.json +39 -18
package/dist/queries.js CHANGED
@@ -1,5 +1,9 @@
1
1
  /** Keep host and isolated-workbench reads in distinct cache entries. */
2
2
  export const tourtoisQueryKeys = {
3
+ oysterComputers: (teamId) => ["tourtois", "oyster-computers", teamId],
4
+ oysterComputerPage: (teamId, offset) => [...tourtoisQueryKeys.oysterComputers(teamId), offset],
5
+ oysterSelectedComputer: (teamId) => ["tourtois", "oyster-selected-computer", teamId],
6
+ oysterInternetAccess: (teamId, computerId) => ["tourtois", "oyster-internet-access", teamId, computerId],
3
7
  hostSettings: (workspaceId) => ["tourtois", "host-settings", workspaceId],
4
8
  workbench: () => ["tourtois", "workbench"],
5
9
  workbenchComputers: (teamId) => ["tourtois", "workbench-computers", teamId],
@@ -1,5 +1,5 @@
1
1
  import { CommandDialogs, type ShellCommandState } from "./command-dialogs.js";
2
- import { type ShellActions } from "@fungi.computer/oyster/shell/commands";
2
+ import { type ShellActions } from "@fungi.computer/nacre/commands";
3
3
  import type { TourtoisAppSurfaceHost } from "./app-surface.js";
4
4
  /** The Back hint for this platform, e.g. "Back (Ctrl K, then [)". */
5
5
  export declare function backHint(): string;
@@ -2,13 +2,13 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { CommandDialogs } from "./command-dialogs.js";
3
3
  import { useLayer } from "@fungi.computer/maosaico";
4
4
  import { Sigil, isSigilName } from "@fungi.computer/sigils";
5
- import { backBinding, shellCommands, } from "@fungi.computer/oyster/shell/commands";
5
+ import { backBinding, shellCommands, } from "@fungi.computer/nacre/commands";
6
6
  import { useEffect, useMemo, useRef, useState, useSyncExternalStore, } from "react";
7
7
  import { AppIcon } from "./app-icon.js";
8
- import { installShellKeys } from "@fungi.computer/oyster/shell/keys";
8
+ import { installShellKeys } from "@fungi.computer/nacre/keys";
9
9
  /** The Back hint for this platform, e.g. "Back (Ctrl K, then [)". */
10
10
  export function backHint() {
11
- const key = backBinding.slice("<leader> ".length);
11
+ const key = backBinding.slice("<leader>".length);
12
12
  return `Back (${isMac() ? "⌘K" : "Ctrl K"}, then ${key})`;
13
13
  }
14
14
  const emptySnapshot = Object.freeze({
@@ -73,7 +73,7 @@ export function useShellCommands(host, actions) {
73
73
  category: "Window",
74
74
  description: "Hide visible Apps, or restore the Apps hidden by Show desktop.",
75
75
  projections: {
76
- bindings: { values: ["<leader> d"], order: 8 },
76
+ bindings: { values: ["<leader>d"], order: 8 },
77
77
  palette: { order: 18 },
78
78
  help: { order: 8 },
79
79
  },
@@ -1,11 +1,11 @@
1
- import { type TeamWorkbenchHostHandle, type WorkbenchPlatformDestination, type WorkbenchGillRequest, type WorkbenchGillWatch } from "@fungi.computer/oyster/shell/workbench";
1
+ import { type TeamWorkbenchHostHandle, type WorkbenchPlatformDestination, type WorkbenchGillRequest, type WorkbenchGillWatch } from "@fungi.computer/nacre/workbench";
2
2
  import { type PlatformControls } from "./platform-controls.js";
3
3
  import type { GillReply } from "@fungi.computer/gills";
4
4
  import type { MemberAvatar } from "@fungi.computer/sprite-zdog/avatar";
5
5
  import * as z from "zod";
6
6
  import { type AppOpenInput } from "@fungi.computer/agar/apps";
7
7
  import type { TourtoisAppSurfaceHost } from "./app-surface.js";
8
- import { type WorkbenchDirectory } from "@fungi.computer/oyster/shell/workbench-directory";
8
+ import { workbenchComputerDirectorySchema, type WorkbenchDirectory } from "@fungi.computer/nacre/workbench-directory";
9
9
  declare const teamIdentitySchema: z.ZodObject<{
10
10
  team: z.ZodObject<{
11
11
  teamId: z.ZodString;
@@ -14,14 +14,12 @@ declare const teamIdentitySchema: z.ZodObject<{
14
14
  }, z.core.$strict>;
15
15
  }, z.core.$strict>;
16
16
  export type TeamIdentity = z.output<typeof teamIdentitySchema>["team"];
17
- declare const workbenchComputerDirectorySchema: z.ZodObject<{
18
- nextOffset: z.ZodNullable<z.ZodNumber>;
19
- computers: z.ZodArray<z.ZodObject<{
20
- name: z.ZodString;
21
- computerId: z.ZodString;
22
- }, z.core.$strip>>;
23
- }, z.core.$strict>;
24
17
  export type TeamComputerPage = z.output<typeof workbenchComputerDirectorySchema>;
18
+ /** The complete inventory offered to the shell's Computer picker. */
19
+ export declare function readWorkbenchComputers(workbench: Pick<TourtoisShell, "computers">, signal: AbortSignal): Promise<{
20
+ computerId: string;
21
+ name: string;
22
+ }[]>;
25
23
  /**
26
24
  * The trusted shell's view of its host: Team/Computer/App directory reads,
27
25
  * child-App mounting and host-offered platform destinations. The host
@@ -1,12 +1,12 @@
1
1
  import { APP_NAVIGATION_TITLE_MAX, parseAppStatusItems, APP_NAVIGATION_CRUMBS_MAX, APP_NAVIGATION_LABEL_MAX, APP_NAVIGATION_MENU_MAX, APP_NAVIGATION_PRIMARY_MAX, APP_NAVIGATION_SIBLINGS_MAX, APP_NAVIGATION_STATUS_MAX, } from "@fungi.computer/agar";
2
- import { teamComputerDirectorySchema, teamComputerSchema, } from "@fungi.computer/oyster/shell/workbench";
3
- import { createAppSurfaceCommandHost } from "@fungi.computer/oyster/shell/command-host";
2
+ import {} from "@fungi.computer/nacre/workbench";
3
+ import { createAppSurfaceCommandHost } from "@fungi.computer/nacre/command-host";
4
4
  import * as Schema from "effect/Schema";
5
5
  import {} from "./platform-controls.js";
6
6
  import { parseMemberAvatar } from "./member-avatar.js";
7
7
  import * as z from "zod";
8
8
  import { appOpenInputSchema, } from "@fungi.computer/agar/apps";
9
- import { workbenchDirectorySchema, } from "@fungi.computer/oyster/shell/workbench-directory";
9
+ import { workbenchDirectorySchema, workbenchComputerDirectorySchema, } from "@fungi.computer/nacre/workbench-directory";
10
10
  const teamIdentitySchema = z.strictObject({
11
11
  team: z.strictObject({
12
12
  teamId: z.string().min(1),
@@ -14,9 +14,26 @@ const teamIdentitySchema = z.strictObject({
14
14
  handle: z.string().min(1),
15
15
  }),
16
16
  });
17
- const workbenchComputerDirectorySchema = teamComputerDirectorySchema.extend({
18
- computers: z.array(teamComputerSchema.pick({ computerId: true, name: true }).strip()),
19
- });
17
+ /** The complete inventory offered to the shell's Computer picker. */
18
+ export async function readWorkbenchComputers(workbench, signal) {
19
+ const computers = [];
20
+ const assertActive = () => {
21
+ if (signal.aborted)
22
+ throw new DOMException("", "AbortError");
23
+ };
24
+ let offset = 0;
25
+ for (;;) {
26
+ assertActive();
27
+ const page = await workbench.computers({ limit: 100, offset });
28
+ assertActive();
29
+ computers.push(...page.computers);
30
+ if (page.nextOffset === null)
31
+ return computers;
32
+ if (page.nextOffset <= offset)
33
+ throw new Error("Computer directory pagination did not advance.");
34
+ offset = page.nextOffset;
35
+ }
36
+ }
20
37
  const platformDestinationsSchema = z
21
38
  .array(z.strictObject({
22
39
  id: z.string().min(1).max(64),
@@ -29,6 +46,7 @@ const relayCommands = (maximum) => z
29
46
  .array(z.strictObject({
30
47
  id: relayId,
31
48
  label: relayLabel,
49
+ icon: z.literal("play").optional(),
32
50
  variant: z.enum(["primary", "outline", "ghost"]).optional(),
33
51
  tone: z.literal("destructive").optional(),
34
52
  disabled: z.boolean().optional(),
@@ -55,6 +73,7 @@ const navigationRelaySchema = z
55
73
  .array(z.strictObject({
56
74
  id: relayId,
57
75
  label: relayLabel,
76
+ presentation: z.literal("bead").optional(),
58
77
  tone: z
59
78
  .enum(["neutral", "info", "warning", "success", "error"])
60
79
  .optional(),
@@ -89,6 +108,8 @@ function parseNavigationRelay(value) {
89
108
  }
90
109
  function commandOf(command) {
91
110
  let copy = { id: command.id, label: command.label };
111
+ if (command.icon !== undefined)
112
+ copy = { ...copy, icon: command.icon };
92
113
  if (command.variant !== undefined)
93
114
  copy = { ...copy, variant: command.variant };
94
115
  if (command.tone !== undefined)
@@ -98,8 +119,12 @@ function commandOf(command) {
98
119
  return copy;
99
120
  }
100
121
  function statusOf(item) {
101
- const copy = { id: item.id, label: item.label };
102
- return item.tone === undefined ? copy : { ...copy, tone: item.tone };
122
+ let copy = { id: item.id, label: item.label };
123
+ if (item.presentation !== undefined)
124
+ copy = { ...copy, presentation: item.presentation };
125
+ if (item.tone !== undefined)
126
+ copy = { ...copy, tone: item.tone };
127
+ return copy;
103
128
  }
104
129
  function childLaunch(launch) {
105
130
  return {
@@ -116,7 +141,7 @@ export function createTourtoisShell(workbench) {
116
141
  // One Whistle graph for Tourtois's own shell commands and every mounted
117
142
  // child's Release-validated commands, so the menu bar and Cmd-K follow focus.
118
143
  const commands = createAppSurfaceCommandHost();
119
- const mount = async (container, launch, signal, { onAgentSessionSelection, onComputerChoice, onNavigation, onAppOpen, onAppRole, onSelectionChanged, onNavigationState, onStatusItems, onFocus, }) => {
144
+ const mount = async (container, launch, signal, { onAgentSessionSelection, onDeliveryPending, onComputerChoice, onNavigation, onAppOpen, onAppRole, onSelectionChanged, onNavigationState, onStatusItems, onFocus, }) => {
120
145
  const commandMount = commands.mount(launch.surfaceId, launch.commands);
121
146
  let resolveHandle = () => undefined;
122
147
  const handleReady = new Promise((resolve) => {
@@ -124,6 +149,7 @@ export function createTourtoisShell(workbench) {
124
149
  });
125
150
  let contribution;
126
151
  const events = {
152
+ ...(onDeliveryPending && { onDeliveryPending }),
127
153
  ...(onComputerChoice && { onComputerChoice }),
128
154
  onAgentSessionSelection: (selection) => onAgentSessionSelection(selection),
129
155
  ...(onNavigation && { onNavigation }),
@@ -177,7 +203,7 @@ export function createTourtoisShell(workbench) {
177
203
  try {
178
204
  // The child's frame lives in this window's own slot, so the browser
179
205
  // moves, clips and stacks it with the window.
180
- handle = await workbench.mount(container, childLaunch(launch), events);
206
+ handle = await workbench.mount(container, childLaunch(launch), events, signal);
181
207
  }
182
208
  catch (error) {
183
209
  commandMount.dispose();
@@ -1,4 +1,4 @@
1
- import type { MountPlatformControls, MountShell } from "@fungi.computer/oyster/shell/shell-module";
1
+ import type { MountPlatformControls, MountShell } from "@fungi.computer/nacre/shell-module";
2
2
  /**
3
3
  * This Release's shell module, emitted as `shell.js` beside `index.html`.
4
4
  * A host imports it from its own origin after first paint; Tourtois's code
package/dist/shell.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { MountShell } from "@fungi.computer/oyster/shell/shell-module";
1
+ import type { MountShell } from "@fungi.computer/nacre/shell-module";
2
2
  /**
3
3
  * Tourtois's shell module contract: render Tourtois as the host's trusted
4
4
  * shell in this top-level document.
package/dist/shell.js CHANGED
@@ -10,7 +10,7 @@ import { QueryClientProvider, useQuery, useQueryClient, } from "@tanstack/react-
10
10
  import { TeamTourtois } from "./TeamDesktop.js";
11
11
  import { AppSurfaceHostProvider } from "./app-surface.js";
12
12
  import { accountAvatarQuery, MemberAvatarSource } from "./member-avatar.js";
13
- import { createTourtoisShell } from "./shell-host.js";
13
+ import { createTourtoisShell, readWorkbenchComputers } from "./shell-host.js";
14
14
  function CanonicalStatus({ message }) {
15
15
  return (_jsx("main", { className: "tourtois-shell tourtois-team-desktop", "data-tourtois-shell": true, children: _jsx("p", { className: "tourtois-directory-status", role: "status", children: message }) }));
16
16
  }
@@ -52,13 +52,7 @@ function MountedTourtois({ shell, }) {
52
52
  return _jsx(CanonicalStatus, { message: "This Team dashboard is unavailable." });
53
53
  if (!connection)
54
54
  return _jsx(CanonicalStatus, { message: "Connecting\u2026" });
55
- return (_jsx(AppSurfaceHostProvider, { value: connection.workbench.host, children: _jsx(MemberAvatarSource, { read: () => connection.workbench.memberAvatar(), children: _jsx(TeamTourtois, { teamId: connection.team.teamId, teamName: connection.team.name, computersReader: (signal) => connection.workbench
56
- .computers({ limit: 100, offset: 0 })
57
- .then((page) => {
58
- if (signal.aborted)
59
- throw new DOMException("", "AbortError");
60
- return page.computers;
61
- }), directoryReader: () => connection.workbench.directory(), takeAppOpenRequest: () => connection.workbench.takeAppOpenRequest(), platform: connection.workbench.platform, desktopStorage: shell.storage, desktopMethods: shell.methods, gills: connection.workbench, settingsLaunchers: settingsLaunchers.filter((launcher) => connection.sections === null ||
55
+ return (_jsx(AppSurfaceHostProvider, { value: connection.workbench.host, children: _jsx(MemberAvatarSource, { read: () => connection.workbench.memberAvatar(), children: _jsx(TeamTourtois, { teamId: connection.team.teamId, teamName: connection.team.name, computersReader: (signal) => readWorkbenchComputers(connection.workbench, signal), directoryReader: () => connection.workbench.directory(), takeAppOpenRequest: () => connection.workbench.takeAppOpenRequest(), platform: connection.workbench.platform, desktopStorage: shell.storage, desktopMethods: shell.methods, gills: connection.workbench, settingsLaunchers: settingsLaunchers.filter((launcher) => connection.sections === null ||
62
56
  connection.sections.includes(launcher.location.category)), systemMenuItems: connection.destinations.map(({ id, label }) => (_jsx(DropdownMenuItem, { onSelect: () => {
63
57
  void connection.workbench
64
58
  .openPlatformDestination(id)
@@ -74,7 +68,9 @@ function MountedTourtois({ shell, }) {
74
68
  */
75
69
  export const mountShell = (root, shell) => {
76
70
  const queryClient = createQueryClient();
77
- const reactRoot = createRoot(root);
71
+ // The Release bundles its own React runtime. Keep its useId values distinct
72
+ // from the embedding host's labels, controls and portalled overlays.
73
+ const reactRoot = createRoot(root, { identifierPrefix: "tourtois-shell-" });
78
74
  reactRoot.render(_jsx(QueryClientProvider, { client: queryClient, children: _jsx(MountedTourtois, { shell: shell }) }));
79
75
  return Promise.resolve(() => {
80
76
  reactRoot.unmount();
@@ -309,7 +309,7 @@ export declare function useAppWindowManager(host: TourtoisAppSurfaceHost | null,
309
309
  }>[];
310
310
  }>;
311
311
  container: HTMLElement;
312
- status: import("@fungi.computer/oyster/shell/window-manager").WindowStatus;
312
+ status: import("@fungi.computer/nacre/window-manager").WindowStatus;
313
313
  generation: number;
314
314
  error?: unknown;
315
315
  cleanupError?: unknown;
@@ -327,6 +327,7 @@ export declare function useAppWindowManager(host: TourtoisAppSurfaceHost | null,
327
327
  primary?: readonly Readonly<{
328
328
  id: string;
329
329
  label: string;
330
+ icon?: "play";
330
331
  variant?: "primary" | "outline" | "ghost";
331
332
  tone?: "destructive";
332
333
  disabled?: boolean;
@@ -334,6 +335,7 @@ export declare function useAppWindowManager(host: TourtoisAppSurfaceHost | null,
334
335
  menu?: readonly Readonly<{
335
336
  id: string;
336
337
  label: string;
338
+ icon?: "play";
337
339
  variant?: "primary" | "outline" | "ghost";
338
340
  tone?: "destructive";
339
341
  disabled?: boolean;
@@ -341,6 +343,7 @@ export declare function useAppWindowManager(host: TourtoisAppSurfaceHost | null,
341
343
  status?: readonly Readonly<{
342
344
  id: string;
343
345
  label: string;
346
+ presentation?: "bead";
344
347
  tone?: "neutral" | "info" | "warning" | "success" | "error";
345
348
  }>[];
346
349
  }> | null;
@@ -10,6 +10,9 @@ export function useAppWindowManager(host, teamId, events) {
10
10
  if (!host)
11
11
  throw new Error("App host unavailable");
12
12
  return await host.mount(container, launch, signal, {
13
+ ...(projectionEvents.onDeliveryPending && {
14
+ onDeliveryPending: projectionEvents.onDeliveryPending,
15
+ }),
13
16
  onAgentSessionSelection: (selection) => {
14
17
  if (!host.reportAgentSessionSelection)
15
18
  return Promise.reject(new Error("Hub Agent browser host unavailable"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fungi.computer/tourtois",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "author": "Levi <levi@technomancy.dev>",
5
5
  "description": "Tourtois: the trusted desktop shell for Oyster and Fungi, with host-supplied Settings sections",
6
6
  "type": "module",
@@ -69,19 +69,19 @@
69
69
  "LICENSE"
70
70
  ],
71
71
  "dependencies": {
72
- "@fungi.computer/agar": "0.2.0",
73
- "@fungi.computer/cairn": "0.0.1",
74
- "@fungi.computer/caps": "0.1.0",
75
- "@fungi.computer/gills": "0.1.0",
76
- "@fungi.computer/maosaico": "0.0.1",
77
- "@fungi.computer/oyster": "0.2.0",
78
- "@fungi.computer/parakeet": "0.1.0",
79
- "@fungi.computer/puffball": "0.1.0",
80
- "@fungi.computer/shiitake": "0.2.0",
81
- "@fungi.computer/sigils": "0.1.0",
82
- "@fungi.computer/sprite": "0.1.0",
83
- "@fungi.computer/sprite-zdog": "0.1.0",
84
- "@fungi.computer/whistle": "0.0.2",
72
+ "@fungi.computer/agar": "0.3.0",
73
+ "@fungi.computer/cairn": "0.1.0",
74
+ "@fungi.computer/caps": "0.2.0",
75
+ "@fungi.computer/ear-tag": "0.1.0",
76
+ "@fungi.computer/gills": "0.2.0",
77
+ "@fungi.computer/maosaico": "0.1.0",
78
+ "@fungi.computer/parakeet": "0.2.0",
79
+ "@fungi.computer/puffball": "0.2.0",
80
+ "@fungi.computer/shiitake": "0.3.0",
81
+ "@fungi.computer/sigils": "0.2.0",
82
+ "@fungi.computer/sprite": "0.2.0",
83
+ "@fungi.computer/sprite-zdog": "0.2.0",
84
+ "@fungi.computer/whistle": "0.1.0",
85
85
  "@tanstack/history": "1.162.1",
86
86
  "@tanstack/react-form": "1.33.2",
87
87
  "@tanstack/react-query": "5.102.8",
@@ -91,15 +91,17 @@
91
91
  "effect": "4.0.2",
92
92
  "lucide-react": "0.460.0",
93
93
  "react-dom": "18.3.1",
94
- "zod": "4.4.3"
94
+ "zod": "4.4.3",
95
+ "@fungi.computer/nacre": "0.0.1"
95
96
  },
96
97
  "peerDependencies": {
97
98
  "react": "^18.3.1 || ^19.2.0"
98
99
  },
99
100
  "devDependencies": {
101
+ "@fungi.computer/oyster": "0.3.0",
100
102
  "@cloudflare/workers-types": "5.20260828.1",
101
- "@fungi.computer/forage": "0.1.0",
102
- "@fungi.computer/mycelium": "0.1.0",
103
+ "@fungi.computer/forage": "0.2.0",
104
+ "@fungi.computer/mycelium": "0.2.0",
103
105
  "@ladle/react": "5.1.1",
104
106
  "@types/react": "18.3.3",
105
107
  "@vitejs/plugin-react": "6.1.1",
@@ -165,7 +167,25 @@
165
167
  "packageStylesheets": [
166
168
  "@fungi.computer/caps",
167
169
  "@fungi.computer/parakeet"
168
- ]
170
+ ],
171
+ "entry": "index.html",
172
+ "maxOutputBytes": 67108864,
173
+ "backend": {
174
+ "entry": "backend/index.ts",
175
+ "exportName": "Tourtois",
176
+ "compatibilityDate": "2026-09-04",
177
+ "runtime": {
178
+ "kind": "durable-facet",
179
+ "stateSchema": 1
180
+ }
181
+ },
182
+ "assetBase": "./",
183
+ "assets": {
184
+ "maxManifestBytes": 1048576,
185
+ "maxObjects": 1024,
186
+ "maxObjectBytes": 16777216,
187
+ "maxTotalBytes": 67108864
188
+ }
169
189
  }
170
190
  },
171
191
  "license": "MIT",
@@ -211,6 +231,7 @@
211
231
  "workbench": "ladle serve --host 127.0.0.1 --port 61001",
212
232
  "workbench:build": "ladle build --outDir ../../.botanical/tourtois-ladle",
213
233
  "test:overlay-layering": "node test/overlay-layering.browser.mjs",
234
+ "test:window-new-version": "node test/window-new-version.browser.mjs",
214
235
  "test:workbench": "node test/workbench.browser.mjs && node test/desktop-gills.browser.mjs && node test/app-directory-isolation.browser.mjs && node test/workflows-launcher-icon.browser.mjs && node test/landing-bugs.browser.mjs && node test/desktop-under-windows.browser.mjs && node test/show-desktop.browser.mjs && node test/window-stack.browser.mjs && node test/region-layers.browser.mjs && node test/window-chrome-back.browser.mjs && node test/app-bar-menu.browser.mjs && node test/launcher-gill.browser.mjs && node test/desktop-storage.browser.mjs && node test/desktop-method-editing.browser.mjs && node test/phone-desktop.browser.mjs && node test/phone-layout.browser.mjs && node test/phone-app-switcher.browser.mjs && node test/computer-choice.browser.mjs",
215
236
  "test": "pnpm run test:unit && pnpm run test:merge",
216
237
  "test:settings-icons": "node --import tsx ../../tooling/repository/scripts/workbench-proofs.mjs --output ../../.botanical/tourtois-ladle --origin-env TOURTOIS_WORKBENCH_URL test/settings-icons.browser.mjs",