@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,111 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import * as SampleSpace from '@dxos/app-toolkit/SampleSpace';
|
|
8
|
+
import { Database } from '@dxos/echo';
|
|
9
|
+
import * as Markdown from '@dxos/plugin-markdown/Markdown';
|
|
10
|
+
|
|
11
|
+
//
|
|
12
|
+
// The source material: one machine record and four human notes.
|
|
13
|
+
//
|
|
14
|
+
// The log alone gives the technical cause and every time that matters. The notes are the only place
|
|
15
|
+
// the process failures live — who was paged, where the renewal reminder was kept, how support found
|
|
16
|
+
// an engineer — and two of them carry claims the log contradicts. A retro that follows the notes
|
|
17
|
+
// without checking them against the log recommends the wrong things; one that reads only the log
|
|
18
|
+
// finds nothing to recommend at all.
|
|
19
|
+
//
|
|
20
|
+
|
|
21
|
+
const STATUS_LOG_MD = `# Status log — incident 0516
|
|
22
|
+
|
|
23
|
+
Exported from the status service. Times are UTC, Saturday 16 May.
|
|
24
|
+
|
|
25
|
+
| Time | Source | Event |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| 02:00:04 | edge | TLS handshake failures begin on api.northlight.example — certificate expired 2026-05-16T02:00:00Z |
|
|
28
|
+
| 02:00:30 | edge | Error rate on api.* rises from 0% to 98% |
|
|
29
|
+
| 02:03:11 | alerts | PAGE fired: "api error rate > 50%" — rotation platform-oncall, pager target m.okafor |
|
|
30
|
+
| 02:03:12 | alerts | Page delivered to m.okafor. No acknowledgement. |
|
|
31
|
+
| 02:33:11 | alerts | Page re-sent to m.okafor. No acknowledgement. |
|
|
32
|
+
| 03:31:47 | support | Ticket #4471 opened from customer email (Ferrous Ltd): "API down since about 2am" |
|
|
33
|
+
| 04:41:09 | alerts | Page acknowledged by j.reyes via Slack |
|
|
34
|
+
| 04:52:30 | ops | Incident channel #inc-0516 opened by j.reyes |
|
|
35
|
+
| 05:09:55 | ops | Certificate renewed manually by j.reyes using the shared ACME account |
|
|
36
|
+
| 05:12:18 | edge | TLS handshakes succeeding; error rate on api.* falls from 98% to 0.2% |
|
|
37
|
+
| 05:12:18 | ops | Incident resolved |
|
|
38
|
+
|
|
39
|
+
No deploys, configuration changes or infrastructure events were recorded between 15 May 12:00 and
|
|
40
|
+
16 May 05:12. Database disk usage held at 41% throughout.
|
|
41
|
+
`;
|
|
42
|
+
|
|
43
|
+
const NOTE_JAE_MD = `# Notes from Jae Reyes — platform, on call that weekend
|
|
44
|
+
|
|
45
|
+
I was not paged. I found out when Priya messaged me on Slack a little after half four, and I had
|
|
46
|
+
the cert renewed about half an hour later once I worked out that was what it was.
|
|
47
|
+
|
|
48
|
+
Afterwards I looked at the pager config. The platform on-call rotation still lists Mira Okafor as
|
|
49
|
+
the target. Mira moved to the data team in March. Nobody updated the rotation when the team
|
|
50
|
+
changed, so for two months every page for our services has gone to someone who is no longer on
|
|
51
|
+
the team.
|
|
52
|
+
|
|
53
|
+
My guess is something went out on Friday afternoon that broke TLS termination. We should stop
|
|
54
|
+
Friday deploys.
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
const NOTE_PRIYA_MD = `# Notes from Priya Nair — support lead
|
|
58
|
+
|
|
59
|
+
Ferrous emailed at about half three saying the API had been down since two. I opened a ticket and
|
|
60
|
+
then tried to find someone. I did not know who was on call or how to reach the pager, so I messaged
|
|
61
|
+
two people on the platform team who did not answer, and then Jae, who did, at around half four.
|
|
62
|
+
|
|
63
|
+
There is no written path from support to on-call for weekends. During the week I would ask in the
|
|
64
|
+
platform channel. On Saturday night nobody is reading it. I made three guesses at who to contact
|
|
65
|
+
and the third one was right, and that is the only reason this was three hours and not six.
|
|
66
|
+
`;
|
|
67
|
+
|
|
68
|
+
const NOTE_DAN_MD = `# Notes from Dan Walsh — platform, renewed the certificate last year
|
|
69
|
+
|
|
70
|
+
The certificate for api.northlight.example is renewed by hand once a year. I did it on 15 May last
|
|
71
|
+
year. There is no ACME automation for that domain because its DNS is managed by a third party and
|
|
72
|
+
we never finished the delegation work.
|
|
73
|
+
|
|
74
|
+
The reminder to renew it was a calendar event on Tom's calendar. Tom left in January. When his
|
|
75
|
+
account was closed the event went with it, and nobody had a copy. I only remembered the date
|
|
76
|
+
because Jae asked me on Saturday.
|
|
77
|
+
`;
|
|
78
|
+
|
|
79
|
+
const NOTE_SAM_MD = `# Notes from Sam Lindqvist — product
|
|
80
|
+
|
|
81
|
+
I was not online over the weekend, so this is second hand. I heard on Monday that the database
|
|
82
|
+
ran out of disk and that is what took the API down.
|
|
83
|
+
|
|
84
|
+
Three customers have asked for a summary they can forward internally. They do not need the
|
|
85
|
+
technical detail; they need to know what happened, how long it lasted, and that it will not
|
|
86
|
+
happen again.
|
|
87
|
+
`;
|
|
88
|
+
|
|
89
|
+
export type DocsResult = {
|
|
90
|
+
log: Markdown.Document;
|
|
91
|
+
notes: {
|
|
92
|
+
jae: Markdown.Document;
|
|
93
|
+
priya: Markdown.Document;
|
|
94
|
+
dan: Markdown.Document;
|
|
95
|
+
sam: Markdown.Document;
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
/** The record and the recollections the retro is written from. */
|
|
100
|
+
export const Docs: SampleSpace.Phase<DocsResult> = SampleSpace.phase('docs', {
|
|
101
|
+
schemas: [Markdown.Document],
|
|
102
|
+
run: () =>
|
|
103
|
+
Effect.gen(function* () {
|
|
104
|
+
const log = yield* Database.add(Markdown.make({ name: 'Status log', content: STATUS_LOG_MD }));
|
|
105
|
+
const jae = yield* Database.add(Markdown.make({ name: 'Notes — Jae Reyes', content: NOTE_JAE_MD }));
|
|
106
|
+
const priya = yield* Database.add(Markdown.make({ name: 'Notes — Priya Nair', content: NOTE_PRIYA_MD }));
|
|
107
|
+
const dan = yield* Database.add(Markdown.make({ name: 'Notes — Dan Walsh', content: NOTE_DAN_MD }));
|
|
108
|
+
const sam = yield* Database.add(Markdown.make({ name: 'Notes — Sam Lindqvist', content: NOTE_SAM_MD }));
|
|
109
|
+
return { log, notes: { jae, priya, dan, sam } };
|
|
110
|
+
}),
|
|
111
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import * as SampleSpace from '@dxos/app-toolkit/SampleSpace';
|
|
8
|
+
import * as Instructions from '@dxos/compute/Instructions';
|
|
9
|
+
import * as Project from '@dxos/compute/Project';
|
|
10
|
+
import { Database, Ref } from '@dxos/echo';
|
|
11
|
+
|
|
12
|
+
import { type DocsResult } from './docs.ts';
|
|
13
|
+
import { type TasksResult } from './tasks.ts';
|
|
14
|
+
|
|
15
|
+
export type ProjectInput = { docs: DocsResult; tasks: TasksResult };
|
|
16
|
+
|
|
17
|
+
export type ProjectResult = { project: Project.Project; instructions: Instructions.Instructions };
|
|
18
|
+
|
|
19
|
+
const INSTRUCTIONS = `You are writing the retrospective for incident 0516, when the public API was down for just over \
|
|
20
|
+
three hours on a Saturday morning.
|
|
21
|
+
|
|
22
|
+
The status log is the record of what happened and when. The notes are what people remember, and \
|
|
23
|
+
memory disagrees with the log in places. Where they disagree, the log wins, and the retrospective \
|
|
24
|
+
says so rather than quietly picking one. A claim that appears in a note but nowhere in the log is a \
|
|
25
|
+
claim, not a finding.
|
|
26
|
+
|
|
27
|
+
Keep it blameless. Name the systems and the gaps, not the people at fault; the people in the notes \
|
|
28
|
+
are the ones who will fix it.
|
|
29
|
+
|
|
30
|
+
File every document you write as an artifact on this project rather than leaving it in the chat, and \
|
|
31
|
+
turn every recommendation into a task on this project with an owner drawn from the people in the notes.`;
|
|
32
|
+
|
|
33
|
+
/** The retro as a project: the record and the notes as its artifacts, the four steps as its tasks. */
|
|
34
|
+
export const ProjectPhase: SampleSpace.Phase<ProjectResult, ProjectInput> = SampleSpace.phase('project', {
|
|
35
|
+
schemas: [Project.Project, Instructions.Instructions],
|
|
36
|
+
run: ({ docs, tasks }: ProjectInput) =>
|
|
37
|
+
Effect.gen(function* () {
|
|
38
|
+
const sources = [docs.log, docs.notes.jae, docs.notes.priya, docs.notes.dan, docs.notes.sam];
|
|
39
|
+
const instructions = yield* Database.add(
|
|
40
|
+
Instructions.make({
|
|
41
|
+
name: 'Incident 0516 retrospective',
|
|
42
|
+
text: INSTRUCTIONS,
|
|
43
|
+
objects: [...sources.map((doc) => Ref.make(doc)), Ref.make(tasks.taskSet)],
|
|
44
|
+
}),
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const project = yield* Database.add(
|
|
48
|
+
Project.make({
|
|
49
|
+
name: 'Incident 0516 retrospective',
|
|
50
|
+
description:
|
|
51
|
+
'The API certificate expired on a Saturday morning and nobody was paged for two and a half hours. Work out why, and what to change.',
|
|
52
|
+
status: 'active',
|
|
53
|
+
instructions: Ref.make(instructions),
|
|
54
|
+
taskSet: Ref.make(tasks.taskSet),
|
|
55
|
+
artifacts: sources.map((doc) => Ref.make(doc)),
|
|
56
|
+
}),
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
return { project, instructions };
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import * as SampleSpace from '@dxos/app-toolkit/SampleSpace';
|
|
8
|
+
import { Database, Obj, Ref } from '@dxos/echo';
|
|
9
|
+
import { EntityId } from '@dxos/echo/Key';
|
|
10
|
+
import { Task, TaskSet } from '@dxos/types';
|
|
11
|
+
|
|
12
|
+
import { daysAgo } from './util.ts';
|
|
13
|
+
|
|
14
|
+
//
|
|
15
|
+
// The retro as four pieces of work, in the order they depend on each other. Every one is `todo`:
|
|
16
|
+
// this space is a job to delegate, not a retro caught half-written.
|
|
17
|
+
//
|
|
18
|
+
// Each task names one deliverable and where it goes, so the check on a finished task is whether
|
|
19
|
+
// that thing exists in that place — not whether the chat said it did.
|
|
20
|
+
//
|
|
21
|
+
|
|
22
|
+
type TaskSeed = {
|
|
23
|
+
readonly title: string;
|
|
24
|
+
readonly description: string;
|
|
25
|
+
readonly estimate?: Task.Estimate;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const STEPS: ReadonlyArray<TaskSeed> = [
|
|
29
|
+
{
|
|
30
|
+
title: 'Reconstruct the timeline',
|
|
31
|
+
description:
|
|
32
|
+
'One document on this project named "Timeline": what happened and when, from the status log. Where a note disagrees with the log, follow the log and record the disagreement.',
|
|
33
|
+
estimate: 's',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
title: 'Write the retrospective',
|
|
37
|
+
description:
|
|
38
|
+
'One document on this project named "Retrospective": what broke, why it went undetected for as long as it did, and what would have prevented or caught it. Ground every claim in the log or a named note.',
|
|
39
|
+
estimate: 'm',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
title: 'File the action items',
|
|
43
|
+
description:
|
|
44
|
+
'One task on this project per recommendation in the retrospective, each assigned to one of the people in the notes. Tasks, not a list in the document.',
|
|
45
|
+
estimate: 's',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
title: 'Draft the customer notice',
|
|
49
|
+
description:
|
|
50
|
+
'One document on this project named "Customer notice": what happened and for how long, in plain language a customer can forward. No internal names, systems or people.',
|
|
51
|
+
estimate: 's',
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
export type TasksResult = { taskSet: TaskSet.TaskSet; tasks: Task.Task[] };
|
|
56
|
+
|
|
57
|
+
/** The four steps, each depending on the one before it. */
|
|
58
|
+
export const Tasks: SampleSpace.Phase<TasksResult> = SampleSpace.phase('tasks', {
|
|
59
|
+
schemas: [TaskSet.TaskSet, Task.Task],
|
|
60
|
+
run: () =>
|
|
61
|
+
Effect.gen(function* () {
|
|
62
|
+
const taskSet = yield* Database.add(
|
|
63
|
+
TaskSet.make({
|
|
64
|
+
name: 'Incident 0516 retrospective',
|
|
65
|
+
description: 'From the log and the notes to a filed retro.',
|
|
66
|
+
}),
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const tasks = STEPS.map((step) =>
|
|
70
|
+
Task.make({
|
|
71
|
+
title: step.title,
|
|
72
|
+
description: step.description,
|
|
73
|
+
estimate: step.estimate,
|
|
74
|
+
status: 'todo',
|
|
75
|
+
history: [
|
|
76
|
+
{
|
|
77
|
+
id: EntityId.random(),
|
|
78
|
+
date: daysAgo(0),
|
|
79
|
+
event: 'created' as const,
|
|
80
|
+
description: 'Filed from the incident template.',
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
}),
|
|
84
|
+
);
|
|
85
|
+
yield* SampleSpace.children(taskSet, tasks, (taskSet, refs) => {
|
|
86
|
+
taskSet.tasks = refs;
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// The retro needs the timeline, the action items need the retro, the notice needs both.
|
|
90
|
+
for (const [index, task] of tasks.entries()) {
|
|
91
|
+
if (index > 0) {
|
|
92
|
+
const previous = tasks[index - 1];
|
|
93
|
+
Obj.update(task, (task) => {
|
|
94
|
+
task.dependsOn = [Ref.make(previous)];
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return { taskSet, tasks };
|
|
100
|
+
}),
|
|
101
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as SampleSpace from '@dxos/app-toolkit/SampleSpace';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The Monday after the incident, when the retro is written. Stable so regenerations are
|
|
9
|
+
* reproducible; override with NOW=2026-05-18 env.
|
|
10
|
+
*/
|
|
11
|
+
export const REFERENCE = process.env.NOW ? new Date(process.env.NOW) : new Date('2026-05-18T09:00:00Z');
|
|
12
|
+
|
|
13
|
+
export const clock = SampleSpace.makeClock(REFERENCE);
|
|
14
|
+
|
|
15
|
+
/** ISO timestamp that many days before {@link REFERENCE}, at an optional UTC hour of that day. */
|
|
16
|
+
export const daysAgo = clock.daysAgo;
|
|
17
|
+
|
|
18
|
+
/** The people in the notes, as task owners. The names are the only identity a template can give them. */
|
|
19
|
+
export const CAST = {
|
|
20
|
+
jae: { role: 'user', name: 'Jae Reyes' },
|
|
21
|
+
priya: { role: 'user', name: 'Priya Nair' },
|
|
22
|
+
dan: { role: 'user', name: 'Dan Walsh' },
|
|
23
|
+
sam: { role: 'user', name: 'Sam Lindqvist' },
|
|
24
|
+
} as const;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export * as IncidentSpace from './incident/IncidentSpace.ts';
|
|
6
|
+
export * as PipelineSpace from './crm/PipelineSpace.ts';
|
|
7
|
+
export * as ReviewSpace from './review/ReviewSpace.ts';
|
|
8
|
+
export * as StockfishSpace from './stockfish/StockfishSpace.ts';
|
|
9
|
+
export * as TidepoolSpace from './tidepool/TidepoolSpace.ts';
|
|
10
|
+
export * as WeatherSpace from './weather/WeatherSpace.ts';
|
|
11
|
+
export * as WorkerSpace from './worker/WorkerSpace.ts';
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, test } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { buildArchive, histogram } from '@dxos/app-toolkit/testing';
|
|
8
|
+
import * as EffectEx from '@dxos/effect/EffectEx';
|
|
9
|
+
|
|
10
|
+
import * as ReviewSpace from './ReviewSpace.ts';
|
|
11
|
+
|
|
12
|
+
// A 1×1 PNG, so the build needs no network and every image resolves inline.
|
|
13
|
+
const PIXEL = Uint8Array.from(
|
|
14
|
+
atob('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='),
|
|
15
|
+
(char) => char.charCodeAt(0),
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
type ArchiveObject = {
|
|
19
|
+
'@type'?: string;
|
|
20
|
+
'id': string;
|
|
21
|
+
'title'?: string;
|
|
22
|
+
'status'?: string;
|
|
23
|
+
'state'?: string;
|
|
24
|
+
'artifacts'?: unknown[];
|
|
25
|
+
'data'?: { _tag?: string };
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const build = async (loadAsset: ReviewSpace.Options['loadAsset']) => {
|
|
29
|
+
const { json } = await EffectEx.runPromise(buildArchive(ReviewSpace.make({ loadAsset })));
|
|
30
|
+
const objects: ArchiveObject[] = JSON.parse(json).objects;
|
|
31
|
+
const ofType = (typename: string) => objects.filter((object) => object['@type']?.includes(typename));
|
|
32
|
+
return { json, objects, ofType };
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The template is built on demand rather than committed, so this asserts its shape in place of a
|
|
37
|
+
* fixture: if a schema it seeds changes incompatibly, the build fails here.
|
|
38
|
+
*/
|
|
39
|
+
describe('Review template', () => {
|
|
40
|
+
test('builds one project with tasks, pull requests and media', { timeout: 120_000 }, async ({ expect }) => {
|
|
41
|
+
const { json } = await build(async () => PIXEL);
|
|
42
|
+
const counts = histogram(json);
|
|
43
|
+
const countOf = (typename: string) =>
|
|
44
|
+
Object.entries(counts)
|
|
45
|
+
.filter(([type]) => type.includes(typename))
|
|
46
|
+
.reduce((total, [, count]) => total + count, 0);
|
|
47
|
+
|
|
48
|
+
expect(countOf('type.project')).toBe(1);
|
|
49
|
+
expect(countOf('type.taskSet')).toBe(1);
|
|
50
|
+
expect(countOf('type.task:')).toBe(7);
|
|
51
|
+
expect(countOf('type.pullRequest')).toBe(5);
|
|
52
|
+
expect(countOf('type.file')).toBe(4);
|
|
53
|
+
expect(countOf('type.video')).toBe(3);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test(
|
|
57
|
+
'finished tasks carry merged PRs with media; tasks in review carry open PRs',
|
|
58
|
+
{ timeout: 120_000 },
|
|
59
|
+
async ({ expect }) => {
|
|
60
|
+
const { ofType } = await build(async () => PIXEL);
|
|
61
|
+
const refersTo = (task: ArchiveObject, objects: ArchiveObject[]) =>
|
|
62
|
+
objects.filter((object) => JSON.stringify(task.artifacts ?? []).includes(object.id));
|
|
63
|
+
|
|
64
|
+
const pullRequests = ofType('type.pullRequest');
|
|
65
|
+
const media = [...ofType('type.file'), ...ofType('type.video')];
|
|
66
|
+
const tasks = ofType('type.task:');
|
|
67
|
+
|
|
68
|
+
const done = tasks.filter((task) => task.status === 'done');
|
|
69
|
+
expect(done).toHaveLength(3);
|
|
70
|
+
for (const task of done) {
|
|
71
|
+
expect(refersTo(task, pullRequests).map((pullRequest) => pullRequest.state)).toEqual(['merged']);
|
|
72
|
+
expect(refersTo(task, media).length).toBeGreaterThan(0);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const review = tasks.filter((task) => task.status === 'review');
|
|
76
|
+
expect(review).toHaveLength(2);
|
|
77
|
+
for (const task of review) {
|
|
78
|
+
expect(refersTo(task, pullRequests).map((pullRequest) => pullRequest.state)).toEqual(['open']);
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
test('keeps an unreachable image as an external blob naming its source', { timeout: 120_000 }, async ({ expect }) => {
|
|
84
|
+
const { ofType } = await build(async () => undefined);
|
|
85
|
+
const blobs = ofType('type.blob');
|
|
86
|
+
expect(blobs).toHaveLength(4);
|
|
87
|
+
expect(blobs.every((blob) => blob.data?._tag === 'external')).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// @import-as-namespace
|
|
6
|
+
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
|
|
9
|
+
import type * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';
|
|
10
|
+
import * as SampleSpace from '@dxos/app-toolkit/SampleSpace';
|
|
11
|
+
|
|
12
|
+
import { type AssetLoader, fetchAsset, makeMedia } from './assets.ts';
|
|
13
|
+
import { REFERENCE } from './util.ts';
|
|
14
|
+
import { Work } from './work.ts';
|
|
15
|
+
|
|
16
|
+
export const TEMPLATE_ID = 'org.dxos.plugin-debug.template.review';
|
|
17
|
+
|
|
18
|
+
export type Options = {
|
|
19
|
+
/** Where screenshot bytes come from; defaults to fetching the pinned PR URLs. */
|
|
20
|
+
readonly loadAsset?: AssetLoader;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A review queue: one project whose finished tasks carry the merged dxos/dxos pull requests that
|
|
25
|
+
* delivered them, with the screenshots and demo recordings attached to those PRs, and whose tasks in
|
|
26
|
+
* review carry the PRs still open.
|
|
27
|
+
*/
|
|
28
|
+
export const make = ({ loadAsset = fetchAsset }: Options = {}) => {
|
|
29
|
+
const phases = { media: makeMedia(loadAsset), work: Work };
|
|
30
|
+
return SampleSpace.make({
|
|
31
|
+
space: { name: 'Composer — Review queue', icon: 'medal-military', hue: 'green' },
|
|
32
|
+
reference: REFERENCE,
|
|
33
|
+
phases,
|
|
34
|
+
build: (phases) =>
|
|
35
|
+
Effect.gen(function* () {
|
|
36
|
+
const media = yield* phases.media();
|
|
37
|
+
return yield* phases.work(media);
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const makeTemplate = (options?: Options): AppCapabilities.SpaceTemplate =>
|
|
43
|
+
SampleSpace.makeTemplate({
|
|
44
|
+
id: TEMPLATE_ID,
|
|
45
|
+
description: 'A project with tasks carrying real dxos pull requests, their screenshots and demo videos.',
|
|
46
|
+
definition: make(options),
|
|
47
|
+
});
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import * as SampleSpace from '@dxos/app-toolkit/SampleSpace';
|
|
8
|
+
import { Blob, Database, Ref } from '@dxos/echo';
|
|
9
|
+
import { log } from '@dxos/log';
|
|
10
|
+
import { File, Video } from '@dxos/types';
|
|
11
|
+
|
|
12
|
+
//
|
|
13
|
+
// Media procured from dxos/dxos pull requests: the screenshots and demo recordings their authors
|
|
14
|
+
// linked from the PR body. Screenshots are SHA-pinned `raw.githubusercontent.com` URLs, so they
|
|
15
|
+
// survive the source branch being deleted and are served with `Access-Control-Allow-Origin: *`.
|
|
16
|
+
//
|
|
17
|
+
|
|
18
|
+
/** Resolves a URL to its bytes; `undefined` when unreachable. Injected so a headless build needs no network. */
|
|
19
|
+
export type AssetLoader = (url: string) => Promise<Uint8Array | undefined>;
|
|
20
|
+
|
|
21
|
+
/** Fetches over HTTP, treating any failure as unavailable so an offline apply still produces the space. */
|
|
22
|
+
export const fetchAsset: AssetLoader = async (url) => {
|
|
23
|
+
try {
|
|
24
|
+
const response = await fetch(url);
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
log.warn('sample asset unavailable', { url, status: response.status });
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
30
|
+
} catch (error) {
|
|
31
|
+
log.warn('sample asset unavailable', { url, error });
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const R2 = 'https://pub-39066a86073446d7b77b1c157b660bb5.r2.dev/demos';
|
|
37
|
+
|
|
38
|
+
export type ImageKey = 'railBefore' | 'railAfter' | 'oauthIdle' | 'oauthPending';
|
|
39
|
+
|
|
40
|
+
const IMAGE_SEEDS: ReadonlyArray<SampleSpace.Seed<ImageKey, { name: string; url: string }>> = [
|
|
41
|
+
{
|
|
42
|
+
key: 'railBefore',
|
|
43
|
+
name: 'l0-rail-before.png',
|
|
44
|
+
url: 'https://raw.githubusercontent.com/dxos/dxos/97e185d31046b60ee0e130bdc86553de98f356f8/.pr-assets/l0-before.png',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
key: 'railAfter',
|
|
48
|
+
name: 'l0-rail-after.png',
|
|
49
|
+
url: 'https://raw.githubusercontent.com/dxos/dxos/97e185d31046b60ee0e130bdc86553de98f356f8/.pr-assets/l0-after.png',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
key: 'oauthIdle',
|
|
53
|
+
name: 'oauth-idle.png',
|
|
54
|
+
url: 'https://raw.githubusercontent.com/dxos/dxos/f186f44ee72b4c4b7508b4f3f6a97f3957704c84/packages/plugins/plugin-onboarding/assets/oauth-idle.png',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
key: 'oauthPending',
|
|
58
|
+
name: 'oauth-pending.png',
|
|
59
|
+
url: 'https://raw.githubusercontent.com/dxos/dxos/f186f44ee72b4c4b7508b4f3f6a97f3957704c84/packages/plugins/plugin-onboarding/assets/oauth-pending.png',
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
export type VideoKey = 'toastCountdown' | 'haloLogin' | 'archify';
|
|
64
|
+
|
|
65
|
+
// Recordings stay URL-based `Video` objects: the R2 bucket sends no CORS header, so the bytes cannot
|
|
66
|
+
// be read into a blob from the browser, while the player embeds the URL directly.
|
|
67
|
+
const VIDEO_SEEDS: ReadonlyArray<SampleSpace.Seed<VideoKey, { name: string; url: string; description: string }>> = [
|
|
68
|
+
{
|
|
69
|
+
key: 'toastCountdown',
|
|
70
|
+
name: 'Toast countdown demo',
|
|
71
|
+
url: `${R2}/2026-09-04-toast-countdown/toast-countdown.webm`,
|
|
72
|
+
description: 'A toast counting down its remaining time in a bar, pausing on hover (dxos/dxos#12954).',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
key: 'haloLogin',
|
|
76
|
+
name: 'Switch identity in place — login',
|
|
77
|
+
url: `${R2}/2026-09-23-halo-in-place-identity/halo-login.webm`,
|
|
78
|
+
description: 'Logging in to another identity without a reset and reload (dxos/dxos#13336).',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
key: 'archify',
|
|
82
|
+
name: 'Archify diagrams demo',
|
|
83
|
+
url: `${R2}/2026-09-04-plugin-archify/archify-final.webm`,
|
|
84
|
+
description: 'Generating an architecture diagram of a package with Archify (dxos/dxos#12952).',
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
export type MediaResult = {
|
|
89
|
+
images: Record<ImageKey, File.File>;
|
|
90
|
+
videos: Record<VideoKey, Video.Video>;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Images become `File`s whose blob holds the bytes inline, which every client can render without a
|
|
95
|
+
* storage backend. An image the loader cannot reach keeps its source URL as an external blob, so the
|
|
96
|
+
* space is still complete and the file says where it came from.
|
|
97
|
+
*/
|
|
98
|
+
export const makeMedia = (loadAsset: AssetLoader): SampleSpace.Phase<MediaResult> =>
|
|
99
|
+
SampleSpace.phase('media', {
|
|
100
|
+
schemas: [File.File, Blob.Blob, Video.Video],
|
|
101
|
+
run: () =>
|
|
102
|
+
Effect.gen(function* () {
|
|
103
|
+
const images = yield* SampleSpace.seed(IMAGE_SEEDS, (seed) =>
|
|
104
|
+
Effect.gen(function* () {
|
|
105
|
+
const bytes = yield* Effect.promise(() => loadAsset(seed.url));
|
|
106
|
+
const blob = yield* Database.add(
|
|
107
|
+
Blob.make({
|
|
108
|
+
type: 'image/png',
|
|
109
|
+
size: bytes?.byteLength ?? 0,
|
|
110
|
+
data: bytes ? Blob.inlineData(bytes) : Blob.externalData(seed.url),
|
|
111
|
+
}),
|
|
112
|
+
);
|
|
113
|
+
return yield* Database.add(File.make({ name: seed.name, data: Ref.make(blob) }));
|
|
114
|
+
}),
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const videos = yield* SampleSpace.seed(VIDEO_SEEDS, (seed) =>
|
|
118
|
+
Database.add(Video.make({ name: seed.name, url: seed.url, description: seed.description })),
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
return { images, videos };
|
|
122
|
+
}),
|
|
123
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as SampleSpace from '@dxos/app-toolkit/SampleSpace';
|
|
6
|
+
|
|
7
|
+
/** Stable reference date so regenerations are reproducible. */
|
|
8
|
+
export const REFERENCE = new Date('2026-09-24T15:00:00Z');
|
|
9
|
+
|
|
10
|
+
export const { daysAgo } = SampleSpace.makeClock(REFERENCE);
|