@dxos/plugin-debug 0.12.0-next-73daef452f1464b62efdbca75fb0067c1066f264 → 0.13.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.
- package/PLUGIN.mdl +241 -3
- package/README.md +27 -3
- package/dist/lib/Debug.mjs.map +1 -1
- package/dist/lib/DebugNodes.mjs +21 -2
- package/dist/lib/DebugNodes.mjs.map +1 -1
- package/dist/lib/DebugOperation.mjs +166 -2
- package/dist/lib/DebugOperation.mjs.map +1 -1
- package/dist/lib/DebugPlugin.mjs.map +1 -1
- package/dist/lib/DebugSurface.mjs +7 -2
- package/dist/lib/DebugSurface.mjs.map +1 -1
- package/dist/lib/IncidentSpace.mjs +2 -0
- package/dist/lib/PipelineSpace.mjs +2 -0
- package/dist/lib/ReviewSpace.mjs +2 -0
- package/dist/lib/StockfishSpace.mjs +2 -0
- package/dist/lib/TidepoolSpace.mjs +2 -0
- package/dist/lib/WeatherSpace.mjs +2 -0
- package/dist/lib/WorkerSpace.mjs +2 -0
- package/dist/lib/capabilities.browser.mjs +71 -0
- package/dist/lib/capabilities.browser.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +17 -7
- package/dist/lib/capabilities.mjs.map +1 -1
- package/dist/lib/capabilities.node.mjs +13 -3
- package/dist/lib/capabilities.node.mjs.map +1 -1
- package/dist/lib/capabilities.tauri.mjs +71 -0
- package/dist/lib/capabilities.tauri.mjs.map +1 -0
- package/dist/lib/capabilities.workerd.mjs +3 -1
- package/dist/lib/capabilities.workerd.mjs.map +1 -1
- package/dist/lib/chunk-DebugConsole.mjs +241 -0
- package/dist/lib/chunk-DebugConsole.mjs.map +1 -0
- package/dist/lib/chunk-DebugObjectPanel.mjs +12 -16
- package/dist/lib/chunk-DebugObjectPanel.mjs.map +1 -1
- package/dist/lib/chunk-DebugPanelDrawer.mjs +48 -0
- package/dist/lib/chunk-DebugPanelDrawer.mjs.map +1 -0
- package/dist/lib/chunk-DebugPanelHeader.mjs +280 -0
- package/dist/lib/chunk-DebugPanelHeader.mjs.map +1 -0
- package/dist/lib/chunk-DebugPanelStatus.mjs +127 -0
- package/dist/lib/chunk-DebugPanelStatus.mjs.map +1 -0
- package/dist/lib/chunk-DebugSettings.mjs +81 -70
- package/dist/lib/chunk-DebugSettings.mjs.map +1 -1
- package/dist/lib/chunk-DebugSpaceObjectsPanel.mjs +21 -12
- package/dist/lib/chunk-DebugSpaceObjectsPanel.mjs.map +1 -1
- package/dist/lib/chunk-DebugStatus.mjs +12 -12
- package/dist/lib/chunk-DebugStatus.mjs.map +1 -1
- package/dist/lib/chunk-IncidentSpace.mjs +269 -0
- package/dist/lib/chunk-IncidentSpace.mjs.map +1 -0
- package/dist/lib/chunk-LoggerPanel.mjs +18 -0
- package/dist/lib/chunk-LoggerPanel.mjs.map +1 -0
- package/dist/lib/chunk-PLUGIN.mjs +6 -0
- package/dist/lib/chunk-PLUGIN.mjs.map +1 -0
- package/dist/lib/chunk-PipelineSpace.mjs +378 -0
- package/dist/lib/chunk-PipelineSpace.mjs.map +1 -0
- package/dist/lib/chunk-ReviewSpace.mjs +356 -0
- package/dist/lib/chunk-ReviewSpace.mjs.map +1 -0
- package/dist/lib/chunk-SpaceGenerator.mjs +107 -73
- package/dist/lib/chunk-SpaceGenerator.mjs.map +1 -1
- package/dist/lib/chunk-StatsPanel.mjs +28 -35
- package/dist/lib/chunk-StatsPanel.mjs.map +1 -1
- package/dist/lib/chunk-StockfishSpace.mjs +563 -0
- package/dist/lib/chunk-StockfishSpace.mjs.map +1 -0
- package/dist/lib/chunk-TidepoolSpace.mjs +544 -0
- package/dist/lib/chunk-TidepoolSpace.mjs.map +1 -0
- package/dist/lib/chunk-WeatherSpace.mjs +206 -0
- package/dist/lib/chunk-WeatherSpace.mjs.map +1 -0
- package/dist/lib/chunk-Wireframe.mjs +6 -6
- package/dist/lib/chunk-Wireframe.mjs.map +1 -1
- package/dist/lib/chunk-WorkerSpace.mjs +177 -0
- package/dist/lib/chunk-WorkerSpace.mjs.map +1 -0
- package/dist/lib/chunk-app-graph-builder.mjs +72 -40
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -1
- package/dist/lib/chunk-create-space-from-template.mjs +55 -0
- package/dist/lib/chunk-create-space-from-template.mjs.map +1 -0
- package/dist/lib/chunk-errors.mjs +13 -0
- package/dist/lib/chunk-errors.mjs.map +1 -0
- package/dist/lib/chunk-graph-retention.mjs +14 -0
- package/dist/lib/chunk-graph-retention.mjs.map +1 -0
- package/dist/lib/chunk-insert-lorem-ipsum.mjs +2 -2
- package/dist/lib/chunk-log-recording.mjs +29 -1
- package/dist/lib/chunk-log-recording.mjs.map +1 -1
- package/dist/lib/chunk-open-page.mjs +29 -0
- package/dist/lib/chunk-open-page.mjs.map +1 -0
- package/dist/lib/chunk-operation-handler.mjs +5 -0
- package/dist/lib/chunk-operation-handler.mjs.map +1 -1
- package/dist/lib/chunk-react-surface.mjs +73 -71
- package/dist/lib/chunk-react-surface.mjs.map +1 -1
- package/dist/lib/chunk-settings.mjs +2 -2
- package/dist/lib/chunk-settings.mjs.map +1 -1
- package/dist/lib/chunk-snapshot.mjs +170 -0
- package/dist/lib/chunk-snapshot.mjs.map +1 -0
- package/dist/lib/chunk-space-templates.mjs +21 -0
- package/dist/lib/chunk-space-templates.mjs.map +1 -0
- package/dist/lib/chunk-stats-panel.mjs +1 -1
- package/dist/lib/chunk-stats-panel.mjs.map +1 -1
- package/dist/lib/chunk-undo.mjs +17 -0
- package/dist/lib/chunk-undo.mjs.map +1 -0
- package/dist/lib/chunk-view-state.mjs +37 -0
- package/dist/lib/chunk-view-state.mjs.map +1 -0
- package/dist/lib/components.mjs +68 -28
- package/dist/lib/components.mjs.map +1 -1
- package/dist/lib/containers.mjs +5 -2
- package/dist/lib/containers.mjs.map +1 -1
- package/dist/lib/index.mjs +8 -2
- package/dist/lib/meta.mjs +3 -2
- package/dist/lib/meta.mjs.map +1 -1
- package/dist/lib/operations.mjs +7 -1
- package/dist/lib/operations.mjs.map +1 -1
- package/dist/lib/plugin.mjs +2 -2
- package/dist/lib/plugin.mjs.map +1 -1
- package/dist/lib/translations.mjs +13 -4
- package/dist/lib/translations.mjs.map +1 -1
- package/dist/types/scripts/build-template-archive.d.ts +2 -0
- package/dist/types/scripts/build-template-archive.d.ts.map +1 -0
- package/dist/types/src/DebugPlugin.d.ts +2 -2
- package/dist/types/src/DebugPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/DebugSurfaces.d.ts +4 -5
- package/dist/types/src/capabilities/DebugSurfaces.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +31 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.test.d.ts +2 -0
- package/dist/types/src/capabilities/app-graph-builder.test.d.ts.map +1 -0
- package/dist/types/src/capabilities/gen/browser.d.ts +14 -0
- package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -0
- package/dist/types/src/capabilities/gen/node.d.ts +2 -0
- package/dist/types/src/capabilities/gen/node.d.ts.map +1 -1
- package/dist/types/src/capabilities/gen/tauri.d.ts +14 -0
- package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -0
- package/dist/types/src/capabilities/gen/workerd.d.ts +2 -0
- package/dist/types/src/capabilities/gen/workerd.d.ts.map +1 -1
- package/dist/types/src/capabilities/graph-retention.d.ts +5 -0
- package/dist/types/src/capabilities/graph-retention.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +2 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/log-recording.d.ts +4 -0
- package/dist/types/src/capabilities/log-recording.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/space-templates.d.ts +14 -0
- package/dist/types/src/capabilities/space-templates.d.ts.map +1 -0
- package/dist/types/src/components/SchemaTable/SchemaTable.d.ts +4 -3
- package/dist/types/src/components/SchemaTable/SchemaTable.d.ts.map +1 -1
- package/dist/types/src/components/SchemaTable/index.d.ts +1 -1
- package/dist/types/src/components/SchemaTable/index.d.ts.map +1 -1
- package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts +2 -1
- package/dist/types/src/components/SpaceGenerator/ObjectGenerator.d.ts.map +1 -1
- package/dist/types/src/components/SpaceGenerator/index.d.ts +2 -2
- package/dist/types/src/components/SpaceGenerator/index.d.ts.map +1 -1
- package/dist/types/src/components/SpaceGenerator/presets.d.ts +1 -1
- package/dist/types/src/components/SpaceGenerator/presets.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +2 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/DebugConsole/DebugConsole.d.ts +12 -0
- package/dist/types/src/containers/DebugConsole/DebugConsole.d.ts.map +1 -0
- package/dist/types/src/containers/DebugConsole/DebugConsole.stories.d.ts +103 -0
- package/dist/types/src/containers/DebugConsole/DebugConsole.stories.d.ts.map +1 -0
- package/dist/types/src/containers/DebugConsole/cli.d.ts +24 -0
- package/dist/types/src/containers/DebugConsole/cli.d.ts.map +1 -0
- package/dist/types/src/containers/DebugConsole/index.d.ts +2 -0
- package/dist/types/src/containers/DebugConsole/index.d.ts.map +1 -0
- package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts +1 -1
- package/dist/types/src/containers/DebugObjectPanel/DebugObjectPanel.d.ts.map +1 -1
- package/dist/types/src/containers/DebugObjectPanel/index.d.ts +1 -1
- package/dist/types/src/containers/DebugObjectPanel/index.d.ts.map +1 -1
- package/dist/types/src/containers/DebugPanel/DebugPanel.d.ts +30 -0
- package/dist/types/src/containers/DebugPanel/DebugPanel.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanel/DebugPanel.stories.d.ts +126 -0
- package/dist/types/src/containers/DebugPanel/DebugPanel.stories.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanel/DebugPanelContext.d.ts +16 -0
- package/dist/types/src/containers/DebugPanel/DebugPanelContext.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanel/DebugPanelHeader.d.ts +14 -0
- package/dist/types/src/containers/DebugPanel/DebugPanelHeader.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanel/DebugPanelMain.d.ts +6 -0
- package/dist/types/src/containers/DebugPanel/DebugPanelMain.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanel/DebugPanelSidebar.d.ts +6 -0
- package/dist/types/src/containers/DebugPanel/DebugPanelSidebar.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanel/index.d.ts +7 -0
- package/dist/types/src/containers/DebugPanel/index.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanel/view-state.d.ts +46 -0
- package/dist/types/src/containers/DebugPanel/view-state.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanelDrawer/DebugPanelDrawer.d.ts +10 -0
- package/dist/types/src/containers/DebugPanelDrawer/DebugPanelDrawer.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanelDrawer/DebugPanelDrawer.stories.d.ts +114 -0
- package/dist/types/src/containers/DebugPanelDrawer/DebugPanelDrawer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanelDrawer/index.d.ts +2 -0
- package/dist/types/src/containers/DebugPanelDrawer/index.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanelStatus/DebugPanelStatus.d.ts +11 -0
- package/dist/types/src/containers/DebugPanelStatus/DebugPanelStatus.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanelStatus/DebugPanelStatus.stories.d.ts +107 -0
- package/dist/types/src/containers/DebugPanelStatus/DebugPanelStatus.stories.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPanelStatus/index.d.ts +2 -0
- package/dist/types/src/containers/DebugPanelStatus/index.d.ts.map +1 -0
- package/dist/types/src/containers/DebugPortSettings/DebugPortSettings.d.ts.map +1 -1
- package/dist/types/src/containers/DebugPortSettings/DebugPortSettings.stories.d.ts +13 -4
- package/dist/types/src/containers/DebugPortSettings/DebugPortSettings.stories.d.ts.map +1 -1
- package/dist/types/src/containers/DebugPortSettings/index.d.ts +1 -1
- package/dist/types/src/containers/DebugPortSettings/index.d.ts.map +1 -1
- package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts +2 -2
- package/dist/types/src/containers/DebugSettings/DebugSettings.d.ts.map +1 -1
- package/dist/types/src/containers/DebugSettings/DebugSettings.stories.d.ts +14 -5
- package/dist/types/src/containers/DebugSettings/DebugSettings.stories.d.ts.map +1 -1
- package/dist/types/src/containers/DebugSettings/index.d.ts +1 -1
- package/dist/types/src/containers/DebugSettings/index.d.ts.map +1 -1
- package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts +1 -1
- package/dist/types/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.d.ts.map +1 -1
- package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts +1 -1
- package/dist/types/src/containers/DebugSpaceObjectsPanel/index.d.ts.map +1 -1
- package/dist/types/src/containers/DebugStatus/index.d.ts +1 -1
- package/dist/types/src/containers/DebugStatus/index.d.ts.map +1 -1
- package/dist/types/src/containers/LoggerPanel/LoggerPanel.d.ts +6 -0
- package/dist/types/src/containers/LoggerPanel/LoggerPanel.d.ts.map +1 -0
- package/dist/types/src/containers/LoggerPanel/LoggerPanel.stories.d.ts +107 -0
- package/dist/types/src/containers/LoggerPanel/LoggerPanel.stories.d.ts.map +1 -0
- package/dist/types/src/containers/LoggerPanel/index.d.ts +2 -0
- package/dist/types/src/containers/LoggerPanel/index.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.stories.d.ts +13 -4
- package/dist/types/src/containers/SpaceGenerator/SpaceGenerator.stories.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceGenerator/index.d.ts +1 -1
- package/dist/types/src/containers/SpaceGenerator/index.d.ts.map +1 -1
- package/dist/types/src/containers/StatsPanel/StatsPanel.d.ts +5 -1
- package/dist/types/src/containers/StatsPanel/StatsPanel.d.ts.map +1 -1
- package/dist/types/src/containers/StatsPanel/index.d.ts +1 -1
- package/dist/types/src/containers/StatsPanel/index.d.ts.map +1 -1
- package/dist/types/src/containers/Wireframe/Wireframe.d.ts +2 -2
- package/dist/types/src/containers/Wireframe/Wireframe.d.ts.map +1 -1
- package/dist/types/src/containers/Wireframe/index.d.ts +1 -1
- package/dist/types/src/containers/Wireframe/index.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +7 -1
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts +123 -0
- package/dist/types/src/errors.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +2 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/operations/DebugOperationHandlerSet.d.ts.map +1 -1
- package/dist/types/src/operations/create-space-from-template.d.ts +5 -0
- package/dist/types/src/operations/create-space-from-template.d.ts.map +1 -0
- package/dist/types/src/operations/errors.d.ts +33 -0
- package/dist/types/src/operations/errors.d.ts.map +1 -0
- package/dist/types/src/operations/index.d.ts +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/open-page.d.ts +5 -0
- package/dist/types/src/operations/open-page.d.ts.map +1 -0
- package/dist/types/src/operations/snapshot.d.ts +5 -0
- package/dist/types/src/operations/snapshot.d.ts.map +1 -0
- package/dist/types/src/operations/snapshot.test.d.ts +2 -0
- package/dist/types/src/operations/snapshot.test.d.ts.map +1 -0
- package/dist/types/src/operations/undo.d.ts +5 -0
- package/dist/types/src/operations/undo.d.ts.map +1 -0
- package/dist/types/src/operations/undo.test.d.ts +2 -0
- package/dist/types/src/operations/undo.test.d.ts.map +1 -0
- package/dist/types/src/plugin.d.ts.map +1 -1
- package/dist/types/src/samples/crm/PipelineSpace.d.ts +21 -0
- package/dist/types/src/samples/crm/PipelineSpace.d.ts.map +1 -0
- package/dist/types/src/samples/crm/PipelineSpace.test.d.ts +2 -0
- package/dist/types/src/samples/crm/PipelineSpace.test.d.ts.map +1 -0
- package/dist/types/src/samples/crm/accounts.d.ts +55 -0
- package/dist/types/src/samples/crm/accounts.d.ts.map +1 -0
- package/dist/types/src/samples/crm/inbox.d.ts +14 -0
- package/dist/types/src/samples/crm/inbox.d.ts.map +1 -0
- package/dist/types/src/samples/crm/pipeline.d.ts +9 -0
- package/dist/types/src/samples/crm/pipeline.d.ts.map +1 -0
- package/dist/types/src/samples/crm/util.d.ts +14 -0
- package/dist/types/src/samples/crm/util.d.ts.map +1 -0
- package/dist/types/src/samples/incident/IncidentSpace.d.ts +21 -0
- package/dist/types/src/samples/incident/IncidentSpace.d.ts.map +1 -0
- package/dist/types/src/samples/incident/IncidentSpace.test.d.ts +2 -0
- package/dist/types/src/samples/incident/IncidentSpace.test.d.ts.map +1 -0
- package/dist/types/src/samples/incident/docs.d.ts +14 -0
- package/dist/types/src/samples/incident/docs.d.ts.map +1 -0
- package/dist/types/src/samples/incident/project.d.ts +16 -0
- package/dist/types/src/samples/incident/project.d.ts.map +1 -0
- package/dist/types/src/samples/incident/tasks.d.ts +9 -0
- package/dist/types/src/samples/incident/tasks.d.ts.map +1 -0
- package/dist/types/src/samples/incident/util.d.ts +32 -0
- package/dist/types/src/samples/incident/util.d.ts.map +1 -0
- package/dist/types/src/samples/index.d.ts +8 -0
- package/dist/types/src/samples/index.d.ts.map +1 -0
- package/dist/types/src/samples/review/ReviewSpace.d.ts +19 -0
- package/dist/types/src/samples/review/ReviewSpace.d.ts.map +1 -0
- package/dist/types/src/samples/review/ReviewSpace.test.d.ts +2 -0
- package/dist/types/src/samples/review/ReviewSpace.test.d.ts.map +1 -0
- package/dist/types/src/samples/review/assets.d.ts +19 -0
- package/dist/types/src/samples/review/assets.d.ts.map +1 -0
- package/dist/types/src/samples/review/util.d.ts +4 -0
- package/dist/types/src/samples/review/util.d.ts.map +1 -0
- package/dist/types/src/samples/review/work.d.ts +15 -0
- package/dist/types/src/samples/review/work.d.ts.map +1 -0
- package/dist/types/src/samples/stockfish/StockfishSpace.d.ts +27 -0
- package/dist/types/src/samples/stockfish/StockfishSpace.d.ts.map +1 -0
- package/dist/types/src/samples/stockfish/StockfishSpace.test.d.ts +2 -0
- package/dist/types/src/samples/stockfish/StockfishSpace.test.d.ts.map +1 -0
- package/dist/types/src/samples/stockfish/docs.d.ts +8 -0
- package/dist/types/src/samples/stockfish/docs.d.ts.map +1 -0
- package/dist/types/src/samples/stockfish/game.d.ts +10 -0
- package/dist/types/src/samples/stockfish/game.d.ts.map +1 -0
- package/dist/types/src/samples/stockfish/project.d.ts +31 -0
- package/dist/types/src/samples/stockfish/project.d.ts.map +1 -0
- package/dist/types/src/samples/stockfish/run.test.d.ts +2 -0
- package/dist/types/src/samples/stockfish/run.test.d.ts.map +1 -0
- package/dist/types/src/samples/stockfish/skill.d.ts +8 -0
- package/dist/types/src/samples/stockfish/skill.d.ts.map +1 -0
- package/dist/types/src/samples/stockfish/tasks.d.ts +12 -0
- package/dist/types/src/samples/stockfish/tasks.d.ts.map +1 -0
- package/dist/types/src/samples/stockfish/util.d.ts +14 -0
- package/dist/types/src/samples/stockfish/util.d.ts.map +1 -0
- package/dist/types/src/samples/tidepool/TidepoolSpace.d.ts +22 -0
- package/dist/types/src/samples/tidepool/TidepoolSpace.d.ts.map +1 -0
- package/dist/types/src/samples/tidepool/TidepoolSpace.test.d.ts +2 -0
- package/dist/types/src/samples/tidepool/TidepoolSpace.test.d.ts.map +1 -0
- package/dist/types/src/samples/tidepool/docs.d.ts +12 -0
- package/dist/types/src/samples/tidepool/docs.d.ts.map +1 -0
- package/dist/types/src/samples/tidepool/project.d.ts +20 -0
- package/dist/types/src/samples/tidepool/project.d.ts.map +1 -0
- package/dist/types/src/samples/tidepool/tasks.d.ts +14 -0
- package/dist/types/src/samples/tidepool/tasks.d.ts.map +1 -0
- package/dist/types/src/samples/tidepool/team.d.ts +9 -0
- package/dist/types/src/samples/tidepool/team.d.ts.map +1 -0
- package/dist/types/src/samples/tidepool/util.d.ts +14 -0
- package/dist/types/src/samples/tidepool/util.d.ts.map +1 -0
- package/dist/types/src/samples/weather/WeatherSpace.d.ts +21 -0
- package/dist/types/src/samples/weather/WeatherSpace.d.ts.map +1 -0
- package/dist/types/src/samples/weather/WeatherSpace.test.d.ts +2 -0
- package/dist/types/src/samples/weather/WeatherSpace.test.d.ts.map +1 -0
- package/dist/types/src/samples/weather/project.d.ts +20 -0
- package/dist/types/src/samples/weather/project.d.ts.map +1 -0
- package/dist/types/src/samples/weather/skill.d.ts +12 -0
- package/dist/types/src/samples/weather/skill.d.ts.map +1 -0
- package/dist/types/src/samples/weather/tasks.d.ts +9 -0
- package/dist/types/src/samples/weather/tasks.d.ts.map +1 -0
- package/dist/types/src/samples/weather/util.d.ts +16 -0
- package/dist/types/src/samples/weather/util.d.ts.map +1 -0
- package/dist/types/src/samples/worker/WorkerSpace.d.ts +22 -0
- package/dist/types/src/samples/worker/WorkerSpace.d.ts.map +1 -0
- package/dist/types/src/samples/worker/WorkerSpace.test.d.ts +2 -0
- package/dist/types/src/samples/worker/WorkerSpace.test.d.ts.map +1 -0
- package/dist/types/src/samples/worker/project.d.ts +18 -0
- package/dist/types/src/samples/worker/project.d.ts.map +1 -0
- package/dist/types/src/samples/worker/tasks.d.ts +9 -0
- package/dist/types/src/samples/worker/tasks.d.ts.map +1 -0
- package/dist/types/src/samples/worker/util.d.ts +14 -0
- package/dist/types/src/samples/worker/util.d.ts.map +1 -0
- package/dist/types/src/stories/SpaceTemplates.stories.d.ts +114 -0
- package/dist/types/src/stories/SpaceTemplates.stories.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +3 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/stub-drawer-plugin.d.ts +8 -0
- package/dist/types/src/testing/stub-drawer-plugin.d.ts.map +1 -0
- package/dist/types/src/testing/stub-tools-plugin.d.ts +19 -0
- package/dist/types/src/testing/stub-tools-plugin.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +13 -4
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Debug.d.ts +2 -2
- package/dist/types/src/types/Debug.d.ts.map +1 -1
- package/dist/types/src/types/DebugNodes.d.ts +13 -1
- package/dist/types/src/types/DebugNodes.d.ts.map +1 -1
- package/dist/types/src/types/DebugOperation.d.ts +119 -0
- package/dist/types/src/types/DebugOperation.d.ts.map +1 -1
- package/dist/types/src/types/DebugSurface.d.ts +7 -0
- package/dist/types/src/types/DebugSurface.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +6 -6
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +3 -2
- package/package.json +129 -73
- package/scripts/build-template-archive.ts +65 -0
- package/src/DebugPlugin.ts +1 -1
- package/src/capabilities/DebugSurfaces.tsx +85 -71
- package/src/capabilities/app-graph-builder.test.ts +45 -0
- package/src/capabilities/app-graph-builder.ts +83 -46
- package/src/capabilities/gen/browser.ts +85 -0
- package/src/capabilities/gen/node.ts +15 -8
- package/src/capabilities/gen/tauri.ts +85 -0
- package/src/capabilities/gen/workerd.ts +11 -4
- package/src/capabilities/graph-retention.ts +23 -0
- package/src/capabilities/index.ts +18 -10
- package/src/capabilities/log-recording.ts +20 -1
- package/src/capabilities/operation-handler.ts +9 -0
- package/src/capabilities/react-surface.ts +33 -29
- package/src/capabilities/settings.ts +2 -2
- package/src/capabilities/space-templates.ts +25 -0
- package/src/capabilities/stats-panel.ts +1 -1
- package/src/components/SchemaTable/SchemaTable.tsx +44 -10
- package/src/components/SchemaTable/index.ts +1 -1
- package/src/components/SpaceGenerator/ObjectGenerator.tsx +22 -2
- package/src/components/SpaceGenerator/index.ts +2 -2
- package/src/components/SpaceGenerator/presets.ts +4 -4
- package/src/components/index.ts +2 -2
- package/src/containers/DebugConsole/DebugConsole.stories.tsx +29 -0
- package/src/containers/DebugConsole/DebugConsole.tsx +94 -0
- package/src/containers/DebugConsole/cli.ts +296 -0
- package/src/containers/DebugConsole/index.ts +5 -0
- package/src/containers/DebugObjectPanel/DebugObjectPanel.tsx +44 -44
- package/src/containers/DebugObjectPanel/index.ts +1 -1
- package/src/containers/DebugPanel/DebugPanel.stories.tsx +118 -0
- package/src/containers/DebugPanel/DebugPanel.tsx +72 -0
- package/src/containers/DebugPanel/DebugPanelContext.ts +33 -0
- package/src/containers/DebugPanel/DebugPanelHeader.tsx +54 -0
- package/src/containers/DebugPanel/DebugPanelMain.tsx +116 -0
- package/src/containers/DebugPanel/DebugPanelSidebar.tsx +123 -0
- package/src/containers/DebugPanel/index.ts +10 -0
- package/src/containers/DebugPanel/view-state.ts +60 -0
- package/src/containers/DebugPanelDrawer/DebugPanelDrawer.stories.tsx +92 -0
- package/src/containers/DebugPanelDrawer/DebugPanelDrawer.tsx +72 -0
- package/src/containers/DebugPanelDrawer/index.ts +5 -0
- package/src/containers/DebugPanelStatus/DebugPanelStatus.stories.tsx +119 -0
- package/src/containers/DebugPanelStatus/DebugPanelStatus.tsx +167 -0
- package/src/containers/DebugPanelStatus/index.ts +5 -0
- package/src/containers/DebugPortSettings/DebugPortSettings.stories.tsx +2 -2
- package/src/containers/DebugPortSettings/DebugPortSettings.tsx +33 -40
- package/src/containers/DebugPortSettings/index.ts +1 -1
- package/src/containers/DebugSettings/DebugSettings.stories.tsx +1 -1
- package/src/containers/DebugSettings/DebugSettings.tsx +71 -64
- package/src/containers/DebugSettings/index.ts +1 -1
- package/src/containers/DebugSpaceObjectsPanel/DebugSpaceObjectsPanel.tsx +39 -28
- package/src/containers/DebugSpaceObjectsPanel/index.ts +1 -1
- package/src/containers/DebugStatus/DebugStatus.tsx +10 -10
- package/src/containers/DebugStatus/index.ts +1 -1
- package/src/containers/LoggerPanel/LoggerPanel.stories.tsx +62 -0
- package/src/containers/LoggerPanel/LoggerPanel.tsx +28 -0
- package/src/containers/LoggerPanel/index.ts +5 -0
- package/src/containers/SpaceGenerator/SpaceGenerator.stories.tsx +8 -8
- package/src/containers/SpaceGenerator/SpaceGenerator.tsx +102 -73
- package/src/containers/SpaceGenerator/index.ts +1 -1
- package/src/containers/StatsPanel/StatsPanel.tsx +32 -31
- package/src/containers/StatsPanel/index.ts +1 -1
- package/src/containers/Wireframe/Wireframe.tsx +8 -7
- package/src/containers/Wireframe/index.ts +1 -1
- package/src/containers/index.ts +22 -9
- package/src/errors.ts +23 -0
- package/src/index.ts +2 -2
- package/src/meta.ts +1 -1
- package/src/operations/DebugOperationHandlerSet.ts +5 -1
- package/src/operations/create-space-from-template.ts +57 -0
- package/src/operations/errors.ts +8 -0
- package/src/operations/index.ts +1 -1
- package/src/operations/open-page.ts +51 -0
- package/src/operations/snapshot.test.ts +57 -0
- package/src/operations/snapshot.ts +243 -0
- package/src/operations/undo.test.ts +19 -0
- package/src/operations/undo.ts +28 -0
- package/src/plugin.tsx +4 -0
- package/src/samples/crm/PipelineSpace.test.ts +55 -0
- package/src/samples/crm/PipelineSpace.ts +52 -0
- package/src/samples/crm/accounts.ts +153 -0
- package/src/samples/crm/inbox.ts +158 -0
- package/src/samples/crm/pipeline.ts +70 -0
- package/src/samples/crm/util.ts +18 -0
- package/src/samples/incident/IncidentSpace.test.ts +68 -0
- package/src/samples/incident/IncidentSpace.ts +61 -0
- package/src/samples/incident/docs.ts +111 -0
- package/src/samples/incident/project.ts +61 -0
- package/src/samples/incident/tasks.ts +101 -0
- package/src/samples/incident/util.ts +24 -0
- package/src/samples/index.ts +11 -0
- package/src/samples/review/ReviewSpace.test.ts +89 -0
- package/src/samples/review/ReviewSpace.ts +47 -0
- package/src/samples/review/assets.ts +123 -0
- package/src/samples/review/util.ts +10 -0
- package/src/samples/review/work.ts +249 -0
- package/src/samples/stockfish/StockfishSpace.test.ts +129 -0
- package/src/samples/stockfish/StockfishSpace.ts +70 -0
- package/src/samples/stockfish/docs.ts +65 -0
- package/src/samples/stockfish/game.ts +47 -0
- package/src/samples/stockfish/project.ts +87 -0
- package/src/samples/stockfish/run.test.ts +193 -0
- package/src/samples/stockfish/skill.ts +154 -0
- package/src/samples/stockfish/tasks.ts +306 -0
- package/src/samples/stockfish/util.ts +17 -0
- package/src/samples/tidepool/TidepoolSpace.test.ts +61 -0
- package/src/samples/tidepool/TidepoolSpace.ts +65 -0
- package/src/samples/tidepool/docs.ts +140 -0
- package/src/samples/tidepool/project.ts +57 -0
- package/src/samples/tidepool/tasks.ts +252 -0
- package/src/samples/tidepool/team.ts +87 -0
- package/src/samples/tidepool/util.ts +18 -0
- package/src/samples/weather/WeatherSpace.test.ts +93 -0
- package/src/samples/weather/WeatherSpace.ts +59 -0
- package/src/samples/weather/project.ts +76 -0
- package/src/samples/weather/skill.ts +45 -0
- package/src/samples/weather/tasks.ts +98 -0
- package/src/samples/weather/util.ts +21 -0
- package/src/samples/worker/WorkerSpace.test.ts +102 -0
- package/src/samples/worker/WorkerSpace.ts +56 -0
- package/src/samples/worker/project.ts +72 -0
- package/src/samples/worker/tasks.ts +119 -0
- package/src/samples/worker/util.ts +17 -0
- package/src/stories/SpaceTemplates.stories.tsx +105 -0
- package/src/testing/index.ts +6 -0
- package/src/testing/stub-drawer-plugin.ts +65 -0
- package/src/testing/stub-tools-plugin.tsx +95 -0
- package/src/translations.ts +15 -6
- package/src/types/Debug.ts +2 -2
- package/src/types/DebugNodes.ts +21 -1
- package/src/types/DebugOperation.ts +206 -0
- package/src/types/DebugSurface.ts +7 -0
- package/src/types/index.ts +6 -6
- package/dist/lib/chunk-LogStatus.mjs +0 -44
- package/dist/lib/chunk-LogStatus.mjs.map +0 -1
- package/dist/types/src/containers/LogStatus/LogStatus.d.ts +0 -6
- package/dist/types/src/containers/LogStatus/LogStatus.d.ts.map +0 -1
- package/dist/types/src/containers/LogStatus/index.d.ts +0 -2
- package/dist/types/src/containers/LogStatus/index.d.ts.map +0 -1
- package/src/containers/LogStatus/LogStatus.tsx +0 -51
- package/src/containers/LogStatus/index.ts +0 -5
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as SampleSpace from "@dxos/app-toolkit/SampleSpace";
|
|
4
|
+
import { Database, Obj, Ref } from "@dxos/echo";
|
|
5
|
+
import * as Markdown from "@dxos/plugin-markdown/Markdown";
|
|
6
|
+
import * as Project from "@dxos/compute/Project";
|
|
7
|
+
import { EntityId } from "@dxos/echo/Key";
|
|
8
|
+
import { Milestone, Organization, Outline, Person, Repo, Task, TaskSet } from "@dxos/types";
|
|
9
|
+
//#region src/samples/tidepool/docs.ts
|
|
10
|
+
/**
|
|
11
|
+
* A `.mdl` spec — the plugin-spec grammar this repo uses for its own plugins: prose under `##`
|
|
12
|
+
* headings, `rule` blocks the agentic review enforces, and `flow` blocks a QA run executes.
|
|
13
|
+
*/
|
|
14
|
+
var SPEC_MDL = `# Sync v2
|
|
15
|
+
|
|
16
|
+
## Design
|
|
17
|
+
|
|
18
|
+
A note is a CRDT sequence plus a plain-text title. The envelope carries a version byte so a client
|
|
19
|
+
that speaks v1 is refused with a typed error instead of failing to parse.
|
|
20
|
+
|
|
21
|
+
Reconciliation is one-way: the device offers its operations, the server replies with what it does
|
|
22
|
+
not hold. Nothing is deleted on either side as part of a sync.
|
|
23
|
+
|
|
24
|
+
## Rules
|
|
25
|
+
|
|
26
|
+
\`\`\`rule no-lww-on-bodies
|
|
27
|
+
A note body is never merged by timestamp. Any code path that picks a winner by \`updatedAt\` on
|
|
28
|
+
\`note.body\` is a defect — bodies converge through the sequence CRDT.
|
|
29
|
+
\`\`\`
|
|
30
|
+
|
|
31
|
+
\`\`\`rule versioned-envelope
|
|
32
|
+
Every payload written to the wire carries the envelope version. A writer that omits it is a defect;
|
|
33
|
+
an unversioned payload on read is rejected, not guessed at.
|
|
34
|
+
\`\`\`
|
|
35
|
+
|
|
36
|
+
## QA
|
|
37
|
+
|
|
38
|
+
\`\`\`flow QA-1 two devices, one paragraph
|
|
39
|
+
1. Take device A and device B offline.
|
|
40
|
+
2. On A, append a sentence to the second paragraph of "Tide pool survey — bay 3".
|
|
41
|
+
3. On B, correct a word in the same paragraph.
|
|
42
|
+
4. Bring both online.
|
|
43
|
+
5. Both edits are present and the paragraph reads correctly. Neither edit is lost.
|
|
44
|
+
\`\`\`
|
|
45
|
+
|
|
46
|
+
\`\`\`flow QA-2 v1 note on first open
|
|
47
|
+
1. Install the v1 client, write a note, uninstall.
|
|
48
|
+
2. Install this build and open that note.
|
|
49
|
+
3. The note opens, renders, and is converted in place exactly once.
|
|
50
|
+
4. Re-open it. No second conversion is recorded.
|
|
51
|
+
\`\`\`
|
|
52
|
+
`;
|
|
53
|
+
var ARCHITECTURE_MD = `# Architecture
|
|
54
|
+
|
|
55
|
+
Three moving parts. The device owns the truth; the relay only holds what it has been handed.
|
|
56
|
+
|
|
57
|
+
\`\`\`mermaid
|
|
58
|
+
flowchart LR
|
|
59
|
+
subgraph Device
|
|
60
|
+
UI[Editor] --> Store[(Local store)]
|
|
61
|
+
Store --> Queue[Outbox]
|
|
62
|
+
end
|
|
63
|
+
Queue -->|offer ops| Relay
|
|
64
|
+
Relay -->|missing ops| Store
|
|
65
|
+
Relay --> Blobs[(Attachment store)]
|
|
66
|
+
Queue -->|content hash| Blobs
|
|
67
|
+
\`\`\`
|
|
68
|
+
|
|
69
|
+
## Why the outbox is separate from the store
|
|
70
|
+
|
|
71
|
+
A field device is offline for weeks, so the store has to be readable and writable with no network at
|
|
72
|
+
all. Sync is therefore a consumer of the store rather than a layer under it — which is what lets the
|
|
73
|
+
editor be indifferent to connectivity.
|
|
74
|
+
|
|
75
|
+
## Attachments
|
|
76
|
+
|
|
77
|
+
Photos are content-addressed on capture. The device asks the relay which hashes it already holds and
|
|
78
|
+
uploads only the remainder, so a reconnect after two weeks in the field does not re-send the trip.
|
|
79
|
+
`;
|
|
80
|
+
var DECISIONS_MD = `# Decisions
|
|
81
|
+
|
|
82
|
+
## 2026-05-11 — Titles are last-writer-wins, bodies are not
|
|
83
|
+
|
|
84
|
+
A title is one line, usually typed once. Running it through the sequence CRDT costs the same
|
|
85
|
+
machinery as a body and buys a merge nobody asked for: two people renaming a note want to see one
|
|
86
|
+
name win, not a splice of both.
|
|
87
|
+
|
|
88
|
+
Bodies are different — paragraphs are edited concurrently and losing an edit is the bug we set out
|
|
89
|
+
to fix. So: body through the CRDT, title by timestamp, and the rule against timestamp-merging
|
|
90
|
+
bodies is written into SPEC.mdl so a future change has to argue with it.
|
|
91
|
+
|
|
92
|
+
## 2026-05-04 — Version the envelope rather than sniffing it
|
|
93
|
+
|
|
94
|
+
Sniffing works until a v1 payload happens to parse as v2. A version byte turns that into a refusal
|
|
95
|
+
with a readable message, which is what a field team needs to hear.
|
|
96
|
+
|
|
97
|
+
## 2026-04-28 — Convert v1 notes eagerly, in place
|
|
98
|
+
|
|
99
|
+
The alternative — read v1 forever behind a shim — leaves two formats live indefinitely and every
|
|
100
|
+
later change has to handle both. Converting on first open is a one-time cost and it has to be
|
|
101
|
+
idempotent, which is a thing a test can state.
|
|
102
|
+
`;
|
|
103
|
+
var OUTLINE_MD = `- [x] Agree the envelope version byte
|
|
104
|
+
- [x] Write SPEC.mdl and get Ravi to read it
|
|
105
|
+
- [ ] Decide on conflicting titles
|
|
106
|
+
- [x] Write up the options
|
|
107
|
+
- [ ] Get Noa to sign off
|
|
108
|
+
- [ ] Ask Sung-min what "saved" should look like on the device
|
|
109
|
+
- [ ] Book the Northwind survey window
|
|
110
|
+
`;
|
|
111
|
+
/** The project's written artifacts, plus the outline that backs its scratch checklist. */
|
|
112
|
+
var Docs = SampleSpace.phase("docs", {
|
|
113
|
+
schemas: [Markdown.Document, Outline.Outline],
|
|
114
|
+
run: () => Effect.gen(function* () {
|
|
115
|
+
return {
|
|
116
|
+
spec: yield* Database.add(Markdown.make({
|
|
117
|
+
name: "SPEC.mdl",
|
|
118
|
+
content: SPEC_MDL
|
|
119
|
+
})),
|
|
120
|
+
architecture: yield* Database.add(Markdown.make({
|
|
121
|
+
name: "ARCHITECTURE.md",
|
|
122
|
+
content: ARCHITECTURE_MD
|
|
123
|
+
})),
|
|
124
|
+
decisions: yield* Database.add(Markdown.make({
|
|
125
|
+
name: "DECISIONS.md",
|
|
126
|
+
content: DECISIONS_MD
|
|
127
|
+
})),
|
|
128
|
+
outline: yield* Database.add(Outline.make({
|
|
129
|
+
name: "Working notes",
|
|
130
|
+
content: OUTLINE_MD
|
|
131
|
+
}))
|
|
132
|
+
};
|
|
133
|
+
})
|
|
134
|
+
});
|
|
135
|
+
//#endregion
|
|
136
|
+
//#region src/samples/tidepool/project.ts
|
|
137
|
+
/**
|
|
138
|
+
* The work-stream itself: it names the repository the work lands in, adopts the task set, and holds
|
|
139
|
+
* the written artifacts in order. `Project.make` would create its own empty task set, so the one
|
|
140
|
+
* built by the tasks phase is passed in explicitly.
|
|
141
|
+
*/
|
|
142
|
+
var ProjectPhase = SampleSpace.phase("project", {
|
|
143
|
+
schemas: [Project.Project, Repo.Repo],
|
|
144
|
+
run: ({ docs, tasks }) => Effect.gen(function* () {
|
|
145
|
+
const repo = yield* Database.add(Repo.make({
|
|
146
|
+
name: "tidepool",
|
|
147
|
+
owner: "tidepool",
|
|
148
|
+
url: "https://github.com/tidepool/tidepool",
|
|
149
|
+
description: "Offline-first notes for field research.",
|
|
150
|
+
defaultBranch: "main"
|
|
151
|
+
}));
|
|
152
|
+
return {
|
|
153
|
+
project: yield* Database.add(Project.make({
|
|
154
|
+
name: "Offline sync v2",
|
|
155
|
+
description: "Make two field devices editing the same note converge without a manual step, in time for the Northwind survey.",
|
|
156
|
+
status: "active",
|
|
157
|
+
repo: Ref.make(repo),
|
|
158
|
+
taskSet: Ref.make(tasks.taskSet),
|
|
159
|
+
outline: Ref.make(docs.outline),
|
|
160
|
+
artifacts: [
|
|
161
|
+
Ref.make(docs.spec),
|
|
162
|
+
Ref.make(docs.architecture),
|
|
163
|
+
Ref.make(docs.decisions)
|
|
164
|
+
]
|
|
165
|
+
})),
|
|
166
|
+
repo
|
|
167
|
+
};
|
|
168
|
+
})
|
|
169
|
+
});
|
|
170
|
+
//#endregion
|
|
171
|
+
//#region src/samples/tidepool/util.ts
|
|
172
|
+
/** Stable reference date so regenerations are reproducible. Override with NOW=2026-05-20 env. */
|
|
173
|
+
var REFERENCE = process.env.NOW ? new Date(process.env.NOW) : /* @__PURE__ */ new Date("2026-05-20T15:00:00Z");
|
|
174
|
+
/**
|
|
175
|
+
* Bound to the same reference the definition declares, so the pure content builders can date their
|
|
176
|
+
* objects without every one of them being an effect.
|
|
177
|
+
*/
|
|
178
|
+
var clock = SampleSpace.makeClock(REFERENCE);
|
|
179
|
+
var daysAgo = clock.daysAgo;
|
|
180
|
+
clock.daysFromNow;
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/samples/tidepool/tasks.ts
|
|
183
|
+
var MILESTONE_SEEDS = [
|
|
184
|
+
{
|
|
185
|
+
key: "protocol",
|
|
186
|
+
name: "Sync protocol frozen",
|
|
187
|
+
description: "Wire format agreed and versioned; no further breaking changes before launch."
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
key: "merge",
|
|
191
|
+
name: "Conflict-free merge",
|
|
192
|
+
description: "Two field devices editing the same note offline converge without a manual step."
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
key: "field",
|
|
196
|
+
name: "Northwind field trial",
|
|
197
|
+
description: "Two weeks offline on the Northwind survey, then a clean reconciliation."
|
|
198
|
+
}
|
|
199
|
+
];
|
|
200
|
+
var TASK_SEEDS = [
|
|
201
|
+
{
|
|
202
|
+
title: "Freeze the v2 sync wire format",
|
|
203
|
+
status: "done",
|
|
204
|
+
assignee: "ravi",
|
|
205
|
+
priority: "urgent",
|
|
206
|
+
milestone: "protocol",
|
|
207
|
+
description: "Version the envelope so a v1 client is rejected with a readable error, not a parse failure.",
|
|
208
|
+
subTasks: [
|
|
209
|
+
{
|
|
210
|
+
title: "Add a version byte to the envelope",
|
|
211
|
+
status: "done",
|
|
212
|
+
assignee: "ravi",
|
|
213
|
+
estimate: "s"
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
title: "Reject v1 payloads with a typed error",
|
|
217
|
+
status: "done",
|
|
218
|
+
assignee: "ravi",
|
|
219
|
+
estimate: "s"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
title: "Write the format down in SPEC.mdl",
|
|
223
|
+
status: "done",
|
|
224
|
+
assignee: "noa",
|
|
225
|
+
estimate: "xs",
|
|
226
|
+
description: "The spec is the artifact reviewers read; the code is not."
|
|
227
|
+
}
|
|
228
|
+
]
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
title: "Last-writer-wins is not good enough for notes",
|
|
232
|
+
status: "started",
|
|
233
|
+
assignee: "ravi",
|
|
234
|
+
priority: "high",
|
|
235
|
+
milestone: "merge",
|
|
236
|
+
estimate: "l",
|
|
237
|
+
description: "Two people editing the same paragraph offline lose one edit. Move the note body to a CRDT.",
|
|
238
|
+
subTasks: [
|
|
239
|
+
{
|
|
240
|
+
title: "Model the note body as a sequence CRDT",
|
|
241
|
+
status: "done",
|
|
242
|
+
assignee: "ravi",
|
|
243
|
+
estimate: "m"
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
title: "Decide what happens to conflicting titles",
|
|
247
|
+
status: "review",
|
|
248
|
+
assignee: "noa",
|
|
249
|
+
estimate: "s",
|
|
250
|
+
description: "A title is one line; a CRDT there reads as noise. Written up in DECISIONS.md."
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
title: "Migrate notes written by the v1 client",
|
|
254
|
+
status: "started",
|
|
255
|
+
assignee: "imogen",
|
|
256
|
+
estimate: "m",
|
|
257
|
+
subTasks: [
|
|
258
|
+
{
|
|
259
|
+
title: "Detect a v1 note on read",
|
|
260
|
+
status: "done",
|
|
261
|
+
assignee: "imogen",
|
|
262
|
+
estimate: "s"
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
title: "Convert in place, once, on first open",
|
|
266
|
+
status: "started",
|
|
267
|
+
assignee: "imogen",
|
|
268
|
+
estimate: "s"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
title: "Prove the conversion is idempotent",
|
|
272
|
+
status: "todo",
|
|
273
|
+
assignee: "lena",
|
|
274
|
+
estimate: "s"
|
|
275
|
+
}
|
|
276
|
+
]
|
|
277
|
+
}
|
|
278
|
+
]
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
title: "Attachment sync eats the battery",
|
|
282
|
+
status: "todo",
|
|
283
|
+
assignee: "imogen",
|
|
284
|
+
priority: "high",
|
|
285
|
+
milestone: "field",
|
|
286
|
+
estimate: "m",
|
|
287
|
+
description: "Photos re-upload on every reconnect. Content-address them and skip what the server already has.",
|
|
288
|
+
subTasks: [{
|
|
289
|
+
title: "Hash attachments on capture",
|
|
290
|
+
status: "todo",
|
|
291
|
+
assignee: "imogen",
|
|
292
|
+
estimate: "s"
|
|
293
|
+
}, {
|
|
294
|
+
title: "Ask the server what it already holds",
|
|
295
|
+
status: "todo",
|
|
296
|
+
assignee: "ravi",
|
|
297
|
+
estimate: "s"
|
|
298
|
+
}]
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
title: "Offline state has no affordance in the UI",
|
|
302
|
+
status: "started",
|
|
303
|
+
assignee: "theo",
|
|
304
|
+
priority: "medium",
|
|
305
|
+
milestone: "field",
|
|
306
|
+
estimate: "s",
|
|
307
|
+
description: "Sung-min asked how anyone knows whether a note is saved. Nothing in the UI answers that."
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
title: "Two-week offline soak test",
|
|
311
|
+
status: "blocked",
|
|
312
|
+
assignee: "lena",
|
|
313
|
+
priority: "high",
|
|
314
|
+
milestone: "field",
|
|
315
|
+
estimate: "l",
|
|
316
|
+
description: "Blocked on the v1 migration: soaking a format we are about to change proves nothing."
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
title: "Cut 2.0-beta.1 for Northwind",
|
|
320
|
+
status: "todo",
|
|
321
|
+
assignee: "noa",
|
|
322
|
+
priority: "medium",
|
|
323
|
+
milestone: "field",
|
|
324
|
+
estimate: "s"
|
|
325
|
+
}
|
|
326
|
+
];
|
|
327
|
+
/**
|
|
328
|
+
* Depth-first flatten, resolving each seed against its parent's milestone and recording each task's
|
|
329
|
+
* children so they can be filed under it once stored.
|
|
330
|
+
*/
|
|
331
|
+
var buildTasks = (seeds, people, milestones) => {
|
|
332
|
+
const tasks = [];
|
|
333
|
+
const roots = [];
|
|
334
|
+
const children = /* @__PURE__ */ new Map();
|
|
335
|
+
const visit = (seed, parent, milestone) => {
|
|
336
|
+
const key = seed.milestone ?? milestone;
|
|
337
|
+
const task = Task.make({
|
|
338
|
+
title: seed.title,
|
|
339
|
+
status: seed.status,
|
|
340
|
+
description: seed.description,
|
|
341
|
+
priority: seed.priority,
|
|
342
|
+
estimate: seed.estimate,
|
|
343
|
+
assignee: seed.assignee ? { contact: Ref.make(people[seed.assignee]) } : void 0,
|
|
344
|
+
milestone: key ? Ref.make(milestones[key]) : void 0,
|
|
345
|
+
history: [{
|
|
346
|
+
id: EntityId.random(),
|
|
347
|
+
date: daysAgo(21),
|
|
348
|
+
event: "created",
|
|
349
|
+
description: "Filed against the sync v2 work-stream."
|
|
350
|
+
}, ...seed.status === "done" ? [{
|
|
351
|
+
id: EntityId.random(),
|
|
352
|
+
date: daysAgo(9),
|
|
353
|
+
event: "updated",
|
|
354
|
+
description: "Status changed to done."
|
|
355
|
+
}] : []]
|
|
356
|
+
});
|
|
357
|
+
tasks.push(task);
|
|
358
|
+
if (parent) children.set(parent, [...children.get(parent) ?? [], task]);
|
|
359
|
+
else roots.push(task);
|
|
360
|
+
for (const child of seed.subTasks ?? []) visit(child, task, key);
|
|
361
|
+
};
|
|
362
|
+
for (const seed of seeds) visit(seed, void 0, void 0);
|
|
363
|
+
return {
|
|
364
|
+
tasks,
|
|
365
|
+
roots,
|
|
366
|
+
children
|
|
367
|
+
};
|
|
368
|
+
};
|
|
369
|
+
/**
|
|
370
|
+
* The project's work: three milestones and a two-level task tree. The set lists the roots and each
|
|
371
|
+
* parent lists its sub-tasks, both written through `SampleSpace.children`.
|
|
372
|
+
*/
|
|
373
|
+
var Tasks = SampleSpace.phase("tasks", {
|
|
374
|
+
schemas: [
|
|
375
|
+
TaskSet.TaskSet,
|
|
376
|
+
Task.Task,
|
|
377
|
+
Milestone.Milestone
|
|
378
|
+
],
|
|
379
|
+
run: (people) => Effect.gen(function* () {
|
|
380
|
+
const taskSet = yield* Database.add(TaskSet.make({
|
|
381
|
+
name: "Offline sync v2",
|
|
382
|
+
description: "Everything that has to land before the field trial."
|
|
383
|
+
}));
|
|
384
|
+
const milestones = yield* SampleSpace.seed(MILESTONE_SEEDS, (seed) => Effect.succeed(Milestone.make({
|
|
385
|
+
name: seed.name,
|
|
386
|
+
description: seed.description
|
|
387
|
+
})));
|
|
388
|
+
yield* SampleSpace.children(taskSet, Object.values(milestones), (taskSet, refs) => {
|
|
389
|
+
taskSet.milestones = refs;
|
|
390
|
+
});
|
|
391
|
+
const { tasks, roots, children } = buildTasks(TASK_SEEDS, people, milestones);
|
|
392
|
+
yield* SampleSpace.children(taskSet, roots, (taskSet, refs) => {
|
|
393
|
+
taskSet.tasks = refs;
|
|
394
|
+
});
|
|
395
|
+
for (const [parent, subtasks] of children) yield* SampleSpace.children(parent, subtasks, (parent, refs) => {
|
|
396
|
+
parent.subtasks = refs;
|
|
397
|
+
});
|
|
398
|
+
const soak = tasks.find((task) => task.title.startsWith("Two-week offline soak"));
|
|
399
|
+
const migration = tasks.find((task) => task.title.startsWith("Migrate notes written"));
|
|
400
|
+
if (soak && migration) Obj.update(soak, (soak) => {
|
|
401
|
+
soak.dependsOn = [Ref.make(migration)];
|
|
402
|
+
});
|
|
403
|
+
return {
|
|
404
|
+
taskSet,
|
|
405
|
+
tasks,
|
|
406
|
+
milestones: Object.values(milestones)
|
|
407
|
+
};
|
|
408
|
+
})
|
|
409
|
+
});
|
|
410
|
+
//#endregion
|
|
411
|
+
//#region src/samples/tidepool/team.ts
|
|
412
|
+
var ORG_SEEDS = [{
|
|
413
|
+
key: "tidepool",
|
|
414
|
+
name: "Tidepool",
|
|
415
|
+
description: "Six-person team building an offline-first notes app for field research.",
|
|
416
|
+
status: "active",
|
|
417
|
+
website: "https://tidepool.dev"
|
|
418
|
+
}, {
|
|
419
|
+
key: "northwind",
|
|
420
|
+
name: "Northwind Marine Lab",
|
|
421
|
+
description: "Design partner. Their field teams work for weeks with no connectivity.",
|
|
422
|
+
status: "active",
|
|
423
|
+
website: "https://northwind-marine.org"
|
|
424
|
+
}];
|
|
425
|
+
var Team = SampleSpace.phase("team", {
|
|
426
|
+
schemas: [Organization.Organization],
|
|
427
|
+
run: () => SampleSpace.seed(ORG_SEEDS, (seed) => Database.add(Organization.make({
|
|
428
|
+
name: seed.name,
|
|
429
|
+
description: seed.description,
|
|
430
|
+
status: seed.status,
|
|
431
|
+
website: seed.website
|
|
432
|
+
})))
|
|
433
|
+
});
|
|
434
|
+
var PERSON_SEEDS = [
|
|
435
|
+
{
|
|
436
|
+
key: "noa",
|
|
437
|
+
fullName: "Noa Almeida",
|
|
438
|
+
jobTitle: "Engineering lead",
|
|
439
|
+
orgKey: "tidepool",
|
|
440
|
+
email: "noa@tidepool.dev"
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
key: "ravi",
|
|
444
|
+
fullName: "Ravi Menon",
|
|
445
|
+
jobTitle: "Sync engineer",
|
|
446
|
+
orgKey: "tidepool",
|
|
447
|
+
email: "ravi@tidepool.dev"
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
key: "imogen",
|
|
451
|
+
fullName: "Imogen Clarke",
|
|
452
|
+
jobTitle: "Mobile engineer",
|
|
453
|
+
orgKey: "tidepool",
|
|
454
|
+
email: "imogen@tidepool.dev"
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
key: "theo",
|
|
458
|
+
fullName: "Theo Baptiste",
|
|
459
|
+
jobTitle: "Designer",
|
|
460
|
+
orgKey: "tidepool",
|
|
461
|
+
email: "theo@tidepool.dev"
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
key: "lena",
|
|
465
|
+
fullName: "Lena Hofer",
|
|
466
|
+
jobTitle: "QA",
|
|
467
|
+
orgKey: "tidepool",
|
|
468
|
+
email: "lena@tidepool.dev"
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
key: "sung",
|
|
472
|
+
fullName: "Sung-min Park",
|
|
473
|
+
jobTitle: "Field research lead",
|
|
474
|
+
orgKey: "northwind",
|
|
475
|
+
email: "sungmin@northwind-marine.org"
|
|
476
|
+
}
|
|
477
|
+
];
|
|
478
|
+
var People = SampleSpace.phase("people", {
|
|
479
|
+
schemas: [Person.Person],
|
|
480
|
+
run: (organizations) => SampleSpace.seed(PERSON_SEEDS, (seed) => Database.add(Person.make({
|
|
481
|
+
fullName: seed.fullName,
|
|
482
|
+
jobTitle: seed.jobTitle,
|
|
483
|
+
organization: Ref.make(organizations[seed.orgKey]),
|
|
484
|
+
emails: [{
|
|
485
|
+
label: "Work",
|
|
486
|
+
value: seed.email
|
|
487
|
+
}]
|
|
488
|
+
})))
|
|
489
|
+
});
|
|
490
|
+
//#endregion
|
|
491
|
+
//#region src/samples/tidepool/TidepoolSpace.ts
|
|
492
|
+
var TidepoolSpace_exports = /* @__PURE__ */ __exportAll({
|
|
493
|
+
make: () => make,
|
|
494
|
+
makeTemplate: () => makeTemplate
|
|
495
|
+
});
|
|
496
|
+
var phases = {
|
|
497
|
+
team: Team,
|
|
498
|
+
people: People,
|
|
499
|
+
docs: Docs,
|
|
500
|
+
tasks: Tasks,
|
|
501
|
+
project: ProjectPhase
|
|
502
|
+
};
|
|
503
|
+
/**
|
|
504
|
+
* A software-project template: one repository, one work-stream, a two-level task tree, and the
|
|
505
|
+
* documents a project accumulates — a `.mdl` spec with rule and QA-flow blocks, an architecture note
|
|
506
|
+
* carrying a mermaid diagram, and a decision log.
|
|
507
|
+
*
|
|
508
|
+
* The second `SpaceTemplate` definition, and the reason the phase machinery exists: nothing here is
|
|
509
|
+
* shared with the Bramble space except the builder itself — the seeds, the phases and the world are
|
|
510
|
+
* this space's own.
|
|
511
|
+
*/
|
|
512
|
+
var make = () => SampleSpace.make({
|
|
513
|
+
space: {
|
|
514
|
+
name: "Tidepool — Offline sync v2",
|
|
515
|
+
icon: "flask",
|
|
516
|
+
hue: "cyan"
|
|
517
|
+
},
|
|
518
|
+
reference: REFERENCE,
|
|
519
|
+
phases,
|
|
520
|
+
build: (phases) => Effect.gen(function* () {
|
|
521
|
+
const organizations = yield* phases.team();
|
|
522
|
+
const people = yield* phases.people(organizations);
|
|
523
|
+
const docs = yield* phases.docs();
|
|
524
|
+
const tasks = yield* phases.tasks(people);
|
|
525
|
+
yield* phases.project({
|
|
526
|
+
docs,
|
|
527
|
+
tasks
|
|
528
|
+
});
|
|
529
|
+
yield* SampleSpace.collection("Documents", [
|
|
530
|
+
Ref.make(docs.spec),
|
|
531
|
+
Ref.make(docs.architecture),
|
|
532
|
+
Ref.make(docs.decisions)
|
|
533
|
+
]);
|
|
534
|
+
})
|
|
535
|
+
});
|
|
536
|
+
var makeTemplate = () => SampleSpace.makeTemplate({
|
|
537
|
+
id: "org.dxos.plugin-debug.template.tidepool",
|
|
538
|
+
description: "A work-stream with a two-level task tree, a .mdl spec, an architecture note and a decision log.",
|
|
539
|
+
definition: make()
|
|
540
|
+
});
|
|
541
|
+
//#endregion
|
|
542
|
+
export { make as n, makeTemplate as r, TidepoolSpace_exports as t };
|
|
543
|
+
|
|
544
|
+
//# sourceMappingURL=chunk-TidepoolSpace.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-TidepoolSpace.mjs","names":[],"sources":["../../src/samples/tidepool/docs.ts","../../src/samples/tidepool/project.ts","../../src/samples/tidepool/util.ts","../../src/samples/tidepool/tasks.ts","../../src/samples/tidepool/team.ts","../../src/samples/tidepool/TidepoolSpace.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as SampleSpace from '@dxos/app-toolkit/SampleSpace';\nimport { Database } from '@dxos/echo';\nimport * as Markdown from '@dxos/plugin-markdown/Markdown';\nimport { Outline } from '@dxos/types';\n\n//\n// The documents a software project accumulates: a spec, an architecture note, a decision log and\n// the scratch checklist.\n//\n\n/**\n * A `.mdl` spec — the plugin-spec grammar this repo uses for its own plugins: prose under `##`\n * headings, `rule` blocks the agentic review enforces, and `flow` blocks a QA run executes.\n */\nconst SPEC_MDL = `# Sync v2\n\n## Design\n\nA note is a CRDT sequence plus a plain-text title. The envelope carries a version byte so a client\nthat speaks v1 is refused with a typed error instead of failing to parse.\n\nReconciliation is one-way: the device offers its operations, the server replies with what it does\nnot hold. Nothing is deleted on either side as part of a sync.\n\n## Rules\n\n\\`\\`\\`rule no-lww-on-bodies\nA note body is never merged by timestamp. Any code path that picks a winner by \\`updatedAt\\` on\n\\`note.body\\` is a defect — bodies converge through the sequence CRDT.\n\\`\\`\\`\n\n\\`\\`\\`rule versioned-envelope\nEvery payload written to the wire carries the envelope version. A writer that omits it is a defect;\nan unversioned payload on read is rejected, not guessed at.\n\\`\\`\\`\n\n## QA\n\n\\`\\`\\`flow QA-1 two devices, one paragraph\n1. Take device A and device B offline.\n2. On A, append a sentence to the second paragraph of \"Tide pool survey — bay 3\".\n3. On B, correct a word in the same paragraph.\n4. Bring both online.\n5. Both edits are present and the paragraph reads correctly. Neither edit is lost.\n\\`\\`\\`\n\n\\`\\`\\`flow QA-2 v1 note on first open\n1. Install the v1 client, write a note, uninstall.\n2. Install this build and open that note.\n3. The note opens, renders, and is converted in place exactly once.\n4. Re-open it. No second conversion is recorded.\n\\`\\`\\`\n`;\n\nconst ARCHITECTURE_MD = `# Architecture\n\nThree moving parts. The device owns the truth; the relay only holds what it has been handed.\n\n\\`\\`\\`mermaid\nflowchart LR\n subgraph Device\n UI[Editor] --> Store[(Local store)]\n Store --> Queue[Outbox]\n end\n Queue -->|offer ops| Relay\n Relay -->|missing ops| Store\n Relay --> Blobs[(Attachment store)]\n Queue -->|content hash| Blobs\n\\`\\`\\`\n\n## Why the outbox is separate from the store\n\nA field device is offline for weeks, so the store has to be readable and writable with no network at\nall. Sync is therefore a consumer of the store rather than a layer under it — which is what lets the\neditor be indifferent to connectivity.\n\n## Attachments\n\nPhotos are content-addressed on capture. The device asks the relay which hashes it already holds and\nuploads only the remainder, so a reconnect after two weeks in the field does not re-send the trip.\n`;\n\nconst DECISIONS_MD = `# Decisions\n\n## 2026-05-11 — Titles are last-writer-wins, bodies are not\n\nA title is one line, usually typed once. Running it through the sequence CRDT costs the same\nmachinery as a body and buys a merge nobody asked for: two people renaming a note want to see one\nname win, not a splice of both.\n\nBodies are different — paragraphs are edited concurrently and losing an edit is the bug we set out\nto fix. So: body through the CRDT, title by timestamp, and the rule against timestamp-merging\nbodies is written into SPEC.mdl so a future change has to argue with it.\n\n## 2026-05-04 — Version the envelope rather than sniffing it\n\nSniffing works until a v1 payload happens to parse as v2. A version byte turns that into a refusal\nwith a readable message, which is what a field team needs to hear.\n\n## 2026-04-28 — Convert v1 notes eagerly, in place\n\nThe alternative — read v1 forever behind a shim — leaves two formats live indefinitely and every\nlater change has to handle both. Converting on first open is a one-time cost and it has to be\nidempotent, which is a thing a test can state.\n`;\n\nconst OUTLINE_MD = `- [x] Agree the envelope version byte\n- [x] Write SPEC.mdl and get Ravi to read it\n- [ ] Decide on conflicting titles\n - [x] Write up the options\n - [ ] Get Noa to sign off\n- [ ] Ask Sung-min what \"saved\" should look like on the device\n- [ ] Book the Northwind survey window\n`;\n\nexport type DocsResult = {\n spec: Markdown.Document;\n architecture: Markdown.Document;\n decisions: Markdown.Document;\n outline: Outline.Outline;\n};\n\n/** The project's written artifacts, plus the outline that backs its scratch checklist. */\nexport const Docs: SampleSpace.Phase<DocsResult> = SampleSpace.phase('docs', {\n schemas: [Markdown.Document, Outline.Outline],\n run: () =>\n Effect.gen(function* () {\n const spec = yield* Database.add(Markdown.make({ name: 'SPEC.mdl', content: SPEC_MDL }));\n const architecture = yield* Database.add(Markdown.make({ name: 'ARCHITECTURE.md', content: ARCHITECTURE_MD }));\n const decisions = yield* Database.add(Markdown.make({ name: 'DECISIONS.md', content: DECISIONS_MD }));\n const outline = yield* Database.add(Outline.make({ name: 'Working notes', content: OUTLINE_MD }));\n return { spec, architecture, decisions, outline };\n }),\n});\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as SampleSpace from '@dxos/app-toolkit/SampleSpace';\nimport * as Project from '@dxos/compute/Project';\nimport { Database, Ref } from '@dxos/echo';\nimport { Repo } from '@dxos/types';\n\nimport { type DocsResult } from './docs.ts';\nimport { type TasksResult } from './tasks.ts';\n\n//\n// The repository and the project that ties everything else together.\n//\n\nexport type ProjectInput = { docs: DocsResult; tasks: TasksResult };\n\nexport type ProjectResult = { project: Project.Project; repo: Repo.Repo };\n\n/**\n * The work-stream itself: it names the repository the work lands in, adopts the task set, and holds\n * the written artifacts in order. `Project.make` would create its own empty task set, so the one\n * built by the tasks phase is passed in explicitly.\n */\nexport const ProjectPhase: SampleSpace.Phase<ProjectResult, ProjectInput> = SampleSpace.phase('project', {\n schemas: [Project.Project, Repo.Repo],\n run: ({ docs, tasks }: ProjectInput) =>\n Effect.gen(function* () {\n const repo = yield* Database.add(\n Repo.make({\n name: 'tidepool',\n owner: 'tidepool',\n url: 'https://github.com/tidepool/tidepool',\n description: 'Offline-first notes for field research.',\n defaultBranch: 'main',\n }),\n );\n\n const project = yield* Database.add(\n Project.make({\n name: 'Offline sync v2',\n description:\n 'Make two field devices editing the same note converge without a manual step, in time for the Northwind survey.',\n status: 'active',\n repo: Ref.make(repo),\n taskSet: Ref.make(tasks.taskSet),\n outline: Ref.make(docs.outline),\n artifacts: [Ref.make(docs.spec), Ref.make(docs.architecture), Ref.make(docs.decisions)],\n }),\n );\n\n return { project, repo };\n }),\n});\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport * as SampleSpace from '@dxos/app-toolkit/SampleSpace';\n\n/** Stable reference date so regenerations are reproducible. Override with NOW=2026-05-20 env. */\nexport const REFERENCE = process.env.NOW ? new Date(process.env.NOW) : new Date('2026-05-20T15:00:00Z');\n\n/**\n * Bound to the same reference the definition declares, so the pure content builders can date their\n * objects without every one of them being an effect.\n */\nexport const clock = SampleSpace.makeClock(REFERENCE);\n\nexport const daysAgo = clock.daysAgo;\n\nexport const daysFromNow = clock.daysFromNow;\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport * as SampleSpace from '@dxos/app-toolkit/SampleSpace';\nimport { Database, Obj, Ref } from '@dxos/echo';\nimport { EntityId } from '@dxos/echo/Key';\nimport { Milestone, Task, TaskSet } from '@dxos/types';\n\nimport { type PersonKey, type PersonMap } from './team.ts';\nimport { daysAgo } from './util.ts';\n\n//\n// The task set, authored as a tree.\n//\n// The set lists its root tasks and each task lists its own sub-tasks (`Task.subtasks`), at unbounded\n// depth. The seeds are nested the same way, which keeps the shape of the work visible in the source\n// rather than reconstructable only by following refs.\n//\n\ntype TaskSeed = {\n readonly title: string;\n readonly status: Task.Status;\n readonly assignee?: PersonKey;\n readonly description?: string;\n readonly priority?: Task.Priority;\n readonly estimate?: Task.Estimate;\n /** Milestone key this task rolls up to; inherited by sub-tasks that do not name their own. */\n readonly milestone?: MilestoneKey;\n readonly subTasks?: ReadonlyArray<TaskSeed>;\n};\n\ntype MilestoneKey = 'protocol' | 'merge' | 'field';\n\nconst MILESTONE_SEEDS = [\n {\n key: 'protocol',\n name: 'Sync protocol frozen',\n description: 'Wire format agreed and versioned; no further breaking changes before launch.',\n },\n {\n key: 'merge',\n name: 'Conflict-free merge',\n description: 'Two field devices editing the same note offline converge without a manual step.',\n },\n {\n key: 'field',\n name: 'Northwind field trial',\n description: 'Two weeks offline on the Northwind survey, then a clean reconciliation.',\n },\n] as const;\n\nconst TASK_SEEDS: ReadonlyArray<TaskSeed> = [\n {\n title: 'Freeze the v2 sync wire format',\n status: 'done',\n assignee: 'ravi',\n priority: 'urgent',\n milestone: 'protocol',\n description: 'Version the envelope so a v1 client is rejected with a readable error, not a parse failure.',\n subTasks: [\n { title: 'Add a version byte to the envelope', status: 'done', assignee: 'ravi', estimate: 's' },\n { title: 'Reject v1 payloads with a typed error', status: 'done', assignee: 'ravi', estimate: 's' },\n {\n title: 'Write the format down in SPEC.mdl',\n status: 'done',\n assignee: 'noa',\n estimate: 'xs',\n description: 'The spec is the artifact reviewers read; the code is not.',\n },\n ],\n },\n {\n title: 'Last-writer-wins is not good enough for notes',\n status: 'started',\n assignee: 'ravi',\n priority: 'high',\n milestone: 'merge',\n estimate: 'l',\n description: 'Two people editing the same paragraph offline lose one edit. Move the note body to a CRDT.',\n subTasks: [\n { title: 'Model the note body as a sequence CRDT', status: 'done', assignee: 'ravi', estimate: 'm' },\n {\n title: 'Decide what happens to conflicting titles',\n status: 'review',\n assignee: 'noa',\n estimate: 's',\n description: 'A title is one line; a CRDT there reads as noise. Written up in DECISIONS.md.',\n },\n {\n title: 'Migrate notes written by the v1 client',\n status: 'started',\n assignee: 'imogen',\n estimate: 'm',\n subTasks: [\n { title: 'Detect a v1 note on read', status: 'done', assignee: 'imogen', estimate: 's' },\n { title: 'Convert in place, once, on first open', status: 'started', assignee: 'imogen', estimate: 's' },\n { title: 'Prove the conversion is idempotent', status: 'todo', assignee: 'lena', estimate: 's' },\n ],\n },\n ],\n },\n {\n title: 'Attachment sync eats the battery',\n status: 'todo',\n assignee: 'imogen',\n priority: 'high',\n milestone: 'field',\n estimate: 'm',\n description: 'Photos re-upload on every reconnect. Content-address them and skip what the server already has.',\n subTasks: [\n { title: 'Hash attachments on capture', status: 'todo', assignee: 'imogen', estimate: 's' },\n { title: 'Ask the server what it already holds', status: 'todo', assignee: 'ravi', estimate: 's' },\n ],\n },\n {\n title: 'Offline state has no affordance in the UI',\n status: 'started',\n assignee: 'theo',\n priority: 'medium',\n milestone: 'field',\n estimate: 's',\n description: 'Sung-min asked how anyone knows whether a note is saved. Nothing in the UI answers that.',\n },\n {\n title: 'Two-week offline soak test',\n status: 'blocked',\n assignee: 'lena',\n priority: 'high',\n milestone: 'field',\n estimate: 'l',\n description: 'Blocked on the v1 migration: soaking a format we are about to change proves nothing.',\n },\n {\n title: 'Cut 2.0-beta.1 for Northwind',\n status: 'todo',\n assignee: 'noa',\n priority: 'medium',\n milestone: 'field',\n estimate: 's',\n },\n];\n\nexport type TasksResult = {\n taskSet: TaskSet.TaskSet;\n tasks: Task.Task[];\n milestones: Milestone.Milestone[];\n};\n\n/**\n * Depth-first flatten, resolving each seed against its parent's milestone and recording each task's\n * children so they can be filed under it once stored.\n */\nconst buildTasks = (\n seeds: ReadonlyArray<TaskSeed>,\n people: PersonMap,\n milestones: Record<MilestoneKey, Milestone.Milestone>,\n): { tasks: Task.Task[]; roots: Task.Task[]; children: Map<Task.Task, Task.Task[]> } => {\n const tasks: Task.Task[] = [];\n const roots: Task.Task[] = [];\n const children = new Map<Task.Task, Task.Task[]>();\n const visit = (seed: TaskSeed, parent: Task.Task | undefined, milestone: MilestoneKey | undefined) => {\n const key = seed.milestone ?? milestone;\n const task = Task.make({\n title: seed.title,\n status: seed.status,\n description: seed.description,\n priority: seed.priority,\n estimate: seed.estimate,\n assignee: seed.assignee ? { contact: Ref.make(people[seed.assignee]) } : undefined,\n milestone: key ? Ref.make(milestones[key]) : undefined,\n // Task carries no due date; its dates are activity-log lines, so that is where they go.\n history: [\n {\n id: EntityId.random(),\n date: daysAgo(21),\n event: 'created' as const,\n description: 'Filed against the sync v2 work-stream.',\n },\n ...(seed.status === 'done'\n ? [\n {\n id: EntityId.random(),\n date: daysAgo(9),\n event: 'updated' as const,\n description: 'Status changed to done.',\n },\n ]\n : []),\n ],\n });\n tasks.push(task);\n if (parent) {\n children.set(parent, [...(children.get(parent) ?? []), task]);\n } else {\n roots.push(task);\n }\n for (const child of seed.subTasks ?? []) {\n visit(child, task, key);\n }\n };\n\n for (const seed of seeds) {\n visit(seed, undefined, undefined);\n }\n return { tasks, roots, children };\n};\n\n/**\n * The project's work: three milestones and a two-level task tree. The set lists the roots and each\n * parent lists its sub-tasks, both written through `SampleSpace.children`.\n */\nexport const Tasks: SampleSpace.Phase<TasksResult, PersonMap> = SampleSpace.phase('tasks', {\n schemas: [TaskSet.TaskSet, Task.Task, Milestone.Milestone],\n run: (people: PersonMap) =>\n Effect.gen(function* () {\n const taskSet = yield* Database.add(\n TaskSet.make({ name: 'Offline sync v2', description: 'Everything that has to land before the field trial.' }),\n );\n\n const milestones = yield* SampleSpace.seed(MILESTONE_SEEDS, (seed) =>\n Effect.succeed(Milestone.make({ name: seed.name, description: seed.description })),\n );\n yield* SampleSpace.children(taskSet, Object.values(milestones), (taskSet, refs) => {\n taskSet.milestones = refs;\n });\n\n const { tasks, roots, children } = buildTasks(TASK_SEEDS, people, milestones);\n yield* SampleSpace.children(taskSet, roots, (taskSet, refs) => {\n taskSet.tasks = refs;\n });\n for (const [parent, subtasks] of children) {\n yield* SampleSpace.children(parent, subtasks, (parent, refs) => {\n parent.subtasks = refs;\n });\n }\n\n // One execution dependency, so the blocked soak test reads as blocked for a stated reason\n // rather than by status alone.\n const soak = tasks.find((task) => task.title.startsWith('Two-week offline soak'));\n const migration = tasks.find((task) => task.title.startsWith('Migrate notes written'));\n if (soak && migration) {\n Obj.update(soak, (soak) => {\n soak.dependsOn = [Ref.make(migration)];\n });\n }\n\n return { taskSet, tasks, milestones: Object.values(milestones) };\n }),\n});\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport * as SampleSpace from '@dxos/app-toolkit/SampleSpace';\nimport { Database, Ref } from '@dxos/echo';\nimport { Organization, Person } from '@dxos/types';\n\n//\n// The company and the people who show up in tasks, reviews and decisions.\n//\n\nexport type OrgKey = 'tidepool' | 'northwind';\n\nexport type OrgMap = Record<OrgKey, Organization.Organization>;\n\nconst ORG_SEEDS = [\n {\n key: 'tidepool',\n name: 'Tidepool',\n description: 'Six-person team building an offline-first notes app for field research.',\n status: 'active',\n website: 'https://tidepool.dev',\n },\n {\n key: 'northwind',\n name: 'Northwind Marine Lab',\n description: 'Design partner. Their field teams work for weeks with no connectivity.',\n status: 'active',\n website: 'https://northwind-marine.org',\n },\n] as const;\n\nexport const Team: SampleSpace.Phase<OrgMap> = SampleSpace.phase('team', {\n schemas: [Organization.Organization],\n run: () =>\n SampleSpace.seed(ORG_SEEDS, (seed) =>\n Database.add(\n Organization.make({\n name: seed.name,\n description: seed.description,\n status: seed.status,\n website: seed.website,\n }),\n ),\n ),\n});\n\nexport type PersonKey = 'noa' | 'ravi' | 'imogen' | 'theo' | 'lena' | 'sung';\n\nexport type PersonMap = Record<PersonKey, Person.Person>;\n\nconst PERSON_SEEDS = [\n { key: 'noa', fullName: 'Noa Almeida', jobTitle: 'Engineering lead', orgKey: 'tidepool', email: 'noa@tidepool.dev' },\n { key: 'ravi', fullName: 'Ravi Menon', jobTitle: 'Sync engineer', orgKey: 'tidepool', email: 'ravi@tidepool.dev' },\n {\n key: 'imogen',\n fullName: 'Imogen Clarke',\n jobTitle: 'Mobile engineer',\n orgKey: 'tidepool',\n email: 'imogen@tidepool.dev',\n },\n { key: 'theo', fullName: 'Theo Baptiste', jobTitle: 'Designer', orgKey: 'tidepool', email: 'theo@tidepool.dev' },\n { key: 'lena', fullName: 'Lena Hofer', jobTitle: 'QA', orgKey: 'tidepool', email: 'lena@tidepool.dev' },\n {\n key: 'sung',\n fullName: 'Sung-min Park',\n jobTitle: 'Field research lead',\n orgKey: 'northwind',\n email: 'sungmin@northwind-marine.org',\n },\n] as const;\n\nexport const People: SampleSpace.Phase<PersonMap, OrgMap> = SampleSpace.phase('people', {\n schemas: [Person.Person],\n run: (organizations: OrgMap) =>\n SampleSpace.seed(PERSON_SEEDS, (seed) =>\n Database.add(\n Person.make({\n fullName: seed.fullName,\n jobTitle: seed.jobTitle,\n organization: Ref.make(organizations[seed.orgKey]),\n emails: [{ label: 'Work', value: seed.email }],\n }),\n ),\n ),\n});\n","//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Effect from 'effect/Effect';\n\nimport type * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as SampleSpace from '@dxos/app-toolkit/SampleSpace';\nimport { Ref } from '@dxos/echo';\n\nimport { Docs } from './docs.ts';\nimport { ProjectPhase } from './project.ts';\nimport { Tasks } from './tasks.ts';\nimport { People, Team } from './team.ts';\nimport { REFERENCE } from './util.ts';\n\nconst phases = {\n team: Team,\n people: People,\n docs: Docs,\n tasks: Tasks,\n project: ProjectPhase,\n};\n\n/**\n * A software-project template: one repository, one work-stream, a two-level task tree, and the\n * documents a project accumulates — a `.mdl` spec with rule and QA-flow blocks, an architecture note\n * carrying a mermaid diagram, and a decision log.\n *\n * The second `SpaceTemplate` definition, and the reason the phase machinery exists: nothing here is\n * shared with the Bramble space except the builder itself — the seeds, the phases and the world are\n * this space's own.\n */\nexport const make = (): SampleSpace.Definition<typeof phases, void> =>\n SampleSpace.make({\n space: { name: 'Tidepool — Offline sync v2', icon: 'flask', hue: 'cyan' },\n reference: REFERENCE,\n phases,\n build: (phases) =>\n Effect.gen(function* () {\n const organizations = yield* phases.team();\n const people = yield* phases.people(organizations);\n\n const docs = yield* phases.docs();\n const tasks = yield* phases.tasks(people);\n yield* phases.project({ docs, tasks });\n\n // The root holds collections only. Project/Repo/TaskSet/Task are not collection-item types,\n // so they live directly in the space DB and surface through the project's own containers.\n yield* SampleSpace.collection('Documents', [\n Ref.make(docs.spec),\n Ref.make(docs.architecture),\n Ref.make(docs.decisions),\n ]);\n }),\n });\n\nexport const makeTemplate = (): AppCapabilities.SpaceTemplate =>\n SampleSpace.makeTemplate({\n id: 'org.dxos.plugin-debug.template.tidepool',\n description: 'A work-stream with a two-level task tree, a .mdl spec, an architecture note and a decision log.',\n definition: make(),\n });\n"],"mappings":"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"}
|