@dxos/plugin-illustrator 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 +96 -3
- package/dist/lib/Drawing.mjs +6 -7
- package/dist/lib/Drawing.mjs.map +1 -1
- package/dist/lib/DrawingOperation.mjs +66 -7
- package/dist/lib/DrawingOperation.mjs.map +1 -1
- package/dist/lib/DrawingSkill.mjs +68 -0
- package/dist/lib/DrawingSkill.mjs.map +1 -0
- package/dist/lib/IllustratorCapabilities.mjs.map +1 -1
- package/dist/lib/IllustratorError.mjs +10 -0
- package/dist/lib/IllustratorError.mjs.map +1 -0
- package/dist/lib/LegacySketch.mjs +1 -1
- package/dist/lib/LegacySketch.mjs.map +1 -1
- package/dist/lib/SceneSvg.mjs +498 -0
- package/dist/lib/SceneSvg.mjs.map +1 -0
- package/dist/lib/UmlSkill.mjs +267 -0
- package/dist/lib/UmlSkill.mjs.map +1 -0
- package/dist/lib/capabilities.browser.mjs +58 -0
- package/dist/lib/capabilities.browser.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +24 -9
- package/dist/lib/capabilities.mjs.map +1 -1
- package/dist/lib/capabilities.node.mjs +21 -4
- package/dist/lib/capabilities.node.mjs.map +1 -1
- package/dist/lib/capabilities.tauri.mjs +58 -0
- package/dist/lib/capabilities.tauri.mjs.map +1 -0
- package/dist/lib/capabilities.workerd.mjs +2 -1
- package/dist/lib/capabilities.workerd.mjs.map +1 -1
- package/dist/lib/chunk-PLUGIN.mjs +6 -0
- package/dist/lib/chunk-PLUGIN.mjs.map +1 -0
- package/dist/lib/chunk-app-graph-builder.mjs +26 -0
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
- package/dist/lib/chunk-create-object.mjs +2 -5
- package/dist/lib/chunk-create-object.mjs.map +1 -1
- package/dist/lib/chunk-create.mjs +4 -2
- package/dist/lib/chunk-create.mjs.map +1 -1
- package/dist/lib/chunk-draw.mjs +40 -0
- package/dist/lib/chunk-draw.mjs.map +1 -0
- package/dist/lib/chunk-edit.mjs.map +1 -1
- package/dist/lib/chunk-generate.mjs +10 -5
- package/dist/lib/chunk-generate.mjs.map +1 -1
- package/dist/lib/chunk-react-surface.mjs +34 -22
- package/dist/lib/chunk-react-surface.mjs.map +1 -1
- package/dist/lib/chunk-read.mjs.map +1 -1
- package/dist/lib/chunk-rolldown-runtime.mjs +15 -1
- package/dist/lib/chunk-score.mjs +23 -0
- package/dist/lib/chunk-score.mjs.map +1 -0
- package/dist/lib/chunk-svg-variant.mjs +2 -1
- package/dist/lib/chunk-svg-variant.mjs.map +1 -1
- package/dist/lib/components.mjs +74 -349
- package/dist/lib/components.mjs.map +1 -1
- package/dist/lib/containers.mjs +192 -20
- package/dist/lib/containers.mjs.map +1 -1
- package/dist/lib/index.mjs +4 -5
- package/dist/lib/meta.mjs +1 -0
- package/dist/lib/meta.mjs.map +1 -1
- package/dist/lib/model.mjs +113 -2390
- package/dist/lib/model.mjs.map +1 -1
- package/dist/lib/ns/IllustratorModel.mjs +10 -0
- package/dist/lib/ns/IllustratorModel.mjs.map +1 -0
- package/dist/lib/ns/IllustratorOperationHandlerSet.mjs +8 -0
- package/dist/lib/ns/IllustratorOperationHandlerSet.mjs.map +1 -0
- package/dist/lib/ns/SceneSvg.mjs +8 -0
- package/dist/lib/ns/SceneSvg.mjs.map +1 -0
- package/dist/lib/operations.mjs +3 -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/skills.mjs +3 -132
- package/dist/lib/translations.mjs +2 -0
- package/dist/lib/translations.mjs.map +1 -1
- package/dist/lib/types.mjs +2 -1
- package/dist/lib/util.mjs +20 -1
- package/dist/lib/util.mjs.map +1 -0
- package/dist/types/src/IllustratorModel.d.ts +2 -0
- package/dist/types/src/IllustratorModel.d.ts.map +1 -0
- package/dist/types/src/IllustratorOperationHandlerSet.d.ts +2 -0
- package/dist/types/src/IllustratorOperationHandlerSet.d.ts.map +1 -0
- package/dist/types/src/IllustratorPlugin.workerd.test.d.ts +2 -0
- package/dist/types/src/IllustratorPlugin.workerd.test.d.ts.map +1 -0
- package/dist/types/src/SceneSvg.d.ts +3 -0
- package/dist/types/src/SceneSvg.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts +5 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/gen/browser.d.ts +13 -0
- package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -0
- package/dist/types/src/capabilities/gen/node.d.ts +1 -0
- package/dist/types/src/capabilities/gen/node.d.ts.map +1 -1
- package/dist/types/src/capabilities/gen/tauri.d.ts +13 -0
- package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -0
- package/dist/types/src/capabilities/gen/workerd.d.ts +1 -0
- package/dist/types/src/capabilities/gen/workerd.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +1 -0
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/components/Constraints.stories.d.ts +38 -0
- package/dist/types/src/components/Constraints.stories.d.ts.map +1 -0
- package/dist/types/src/components/CreateDrawingPanel.d.ts +3 -3
- package/dist/types/src/components/CreateDrawingPanel.d.ts.map +1 -1
- package/dist/types/src/components/Layout.stories.d.ts +66 -0
- package/dist/types/src/components/Layout.stories.d.ts.map +1 -0
- package/dist/types/src/components/SceneSvg.d.ts +15 -7
- package/dist/types/src/components/SceneSvg.d.ts.map +1 -1
- package/dist/types/src/components/SceneSvg.stories.d.ts +8 -2
- package/dist/types/src/components/SceneSvg.stories.d.ts.map +1 -1
- package/dist/types/src/components/SceneSvgFile.d.ts +7 -0
- package/dist/types/src/components/SceneSvgFile.d.ts.map +1 -0
- package/dist/types/src/components/SceneSvgFile.test.d.ts +2 -0
- package/dist/types/src/components/SceneSvgFile.test.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +3 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/DrawingArticle/DrawingArticle.d.ts +1 -1
- package/dist/types/src/containers/DrawingArticle/DrawingArticle.d.ts.map +1 -1
- package/dist/types/src/containers/DrawingArticle/index.d.ts +1 -1
- package/dist/types/src/containers/DrawingArticle/index.d.ts.map +1 -1
- package/dist/types/src/containers/DrawingCard/DrawingCard.d.ts +1 -1
- package/dist/types/src/containers/DrawingCard/DrawingCard.d.ts.map +1 -1
- package/dist/types/src/containers/DrawingCard/index.d.ts +1 -1
- package/dist/types/src/containers/DrawingCard/index.d.ts.map +1 -1
- package/dist/types/src/containers/DrawingScores/DrawingScores.d.ts +11 -0
- package/dist/types/src/containers/DrawingScores/DrawingScores.d.ts.map +1 -0
- package/dist/types/src/containers/DrawingScores/index.d.ts +2 -0
- package/dist/types/src/containers/DrawingScores/index.d.ts.map +1 -0
- package/dist/types/src/containers/SvgArticle/SvgArticle.d.ts +1 -1
- package/dist/types/src/containers/SvgArticle/SvgArticle.d.ts.map +1 -1
- package/dist/types/src/containers/SvgArticle/index.d.ts +1 -1
- package/dist/types/src/containers/SvgArticle/index.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +4 -3
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +4 -5
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/model/builder.d.ts +4 -3
- package/dist/types/src/model/builder.d.ts.map +1 -1
- package/dist/types/src/model/corpus.test.d.ts +2 -0
- package/dist/types/src/model/corpus.test.d.ts.map +1 -0
- package/dist/types/src/model/drawing-file.d.ts +89 -0
- package/dist/types/src/model/drawing-file.d.ts.map +1 -0
- package/dist/types/src/model/drawing-file.test.d.ts +2 -0
- package/dist/types/src/model/drawing-file.test.d.ts.map +1 -0
- package/dist/types/src/model/index.d.ts +2 -12
- package/dist/types/src/model/index.d.ts.map +1 -1
- package/dist/types/src/operations/create.d.ts.map +1 -1
- package/dist/types/src/operations/draw.d.ts +5 -0
- package/dist/types/src/operations/draw.d.ts.map +1 -0
- package/dist/types/src/operations/generate.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/score.d.ts +5 -0
- package/dist/types/src/operations/score.d.ts.map +1 -0
- package/dist/types/src/plugin.d.ts.map +1 -1
- package/dist/types/src/skills/DrawingSkill.d.ts +4 -0
- package/dist/types/src/skills/DrawingSkill.d.ts.map +1 -0
- package/dist/types/src/skills/UmlSkill.d.ts +4 -0
- package/dist/types/src/skills/UmlSkill.d.ts.map +1 -0
- package/dist/types/src/skills/index.d.ts +2 -2
- package/dist/types/src/skills/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +4 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Drawing.d.ts.map +1 -1
- package/dist/types/src/types/DrawingOperation.d.ts +289 -40
- package/dist/types/src/types/DrawingOperation.d.ts.map +1 -1
- package/dist/types/src/types/IllustratorCapabilities.d.ts +7 -1
- package/dist/types/src/types/IllustratorCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/IllustratorError.d.ts +34 -0
- package/dist/types/src/types/IllustratorError.d.ts.map +1 -0
- package/dist/types/src/types/LegacySketch.d.ts +1 -1
- package/dist/types/src/types/LegacySketch.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +6 -5
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/util/index.d.ts +2 -1
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/score-scene.d.ts +9 -0
- package/dist/types/src/util/score-scene.d.ts.map +1 -0
- package/dist/types/src/util/score-scene.test.d.ts +2 -0
- package/dist/types/src/util/score-scene.test.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +5 -0
- package/package.json +80 -42
- package/src/IllustratorModel.ts +7 -0
- package/src/IllustratorOperationHandlerSet.ts +7 -0
- package/src/IllustratorPlugin.workerd.test.ts +26 -0
- package/src/SceneSvg.ts +8 -0
- package/src/capabilities/app-graph-builder.ts +33 -0
- package/src/capabilities/create-object.ts +7 -11
- package/src/capabilities/gen/browser.ts +75 -0
- package/src/capabilities/gen/node.ts +12 -8
- package/src/capabilities/gen/tauri.ts +75 -0
- package/src/capabilities/gen/workerd.ts +4 -3
- package/src/capabilities/index.ts +20 -13
- package/src/capabilities/migrations.test.ts +1 -1
- package/src/capabilities/react-surface.ts +12 -3
- package/src/capabilities/svg-variant.ts +2 -1
- package/src/components/Constraints.stories.tsx +272 -0
- package/src/components/CreateDrawingPanel.tsx +47 -35
- package/src/components/Layout.stories.tsx +291 -0
- package/src/components/SceneSvg.stories.tsx +75 -20
- package/src/components/SceneSvg.tsx +333 -109
- package/src/components/SceneSvgFile.test.ts +74 -0
- package/src/components/SceneSvgFile.tsx +48 -0
- package/src/components/index.ts +3 -2
- package/src/components/testing/app-framework.dx +44 -0
- package/src/components/testing/compute.dx +43 -0
- package/src/components/testing/process.dx +35 -0
- package/src/components/testing/relations.dx +21 -0
- package/src/components/testing/stacked.dx +9 -0
- package/src/containers/DrawingArticle/DrawingArticle.tsx +64 -9
- package/src/containers/DrawingArticle/index.ts +1 -1
- package/src/containers/DrawingCard/DrawingCard.tsx +3 -3
- package/src/containers/DrawingCard/index.ts +1 -1
- package/src/containers/DrawingScores/DrawingScores.tsx +118 -0
- package/src/containers/DrawingScores/index.ts +5 -0
- package/src/containers/SvgArticle/SvgArticle.tsx +12 -7
- package/src/containers/SvgArticle/index.ts +1 -1
- package/src/containers/index.ts +4 -3
- package/src/index.ts +4 -5
- package/src/meta.ts +1 -1
- package/src/model/__snapshots__/corpus.test.ts.snap +43 -0
- package/src/model/builder.ts +14 -3
- package/src/model/corpus.test.ts +72 -0
- package/src/model/drawing-file.test.ts +118 -0
- package/src/model/drawing-file.ts +158 -0
- package/src/model/index.ts +2 -12
- package/src/operations/create.ts +6 -2
- package/src/operations/draw.ts +46 -0
- package/src/operations/edit.ts +1 -1
- package/src/operations/generate.ts +14 -5
- package/src/operations/index.ts +6 -4
- package/src/operations/read.ts +1 -1
- package/src/operations/score.ts +26 -0
- package/src/plugin.test.ts +2 -2
- package/src/plugin.tsx +2 -0
- package/src/skills/{drawing-skill.ts → DrawingSkill.ts} +3 -10
- package/src/skills/UmlSkill.ts +268 -0
- package/src/skills/index.ts +2 -2
- package/src/translations.ts +4 -2
- package/src/types/Drawing.ts +6 -7
- package/src/types/DrawingOperation.ts +88 -4
- package/src/types/IllustratorCapabilities.ts +7 -1
- package/src/types/IllustratorError.ts +12 -0
- package/src/types/LegacySketch.ts +1 -1
- package/src/types/index.ts +6 -5
- package/src/util/index.ts +2 -1
- package/src/util/score-scene.test.ts +27 -0
- package/src/util/score-scene.ts +20 -0
- package/src/vite-env.d.ts +5 -0
- package/dist/lib/skills.mjs.map +0 -1
- package/dist/types/src/model/content.d.ts +0 -60
- package/dist/types/src/model/content.d.ts.map +0 -1
- package/dist/types/src/model/dialect.d.ts +0 -19
- package/dist/types/src/model/dialect.d.ts.map +0 -1
- package/dist/types/src/model/layout.d.ts +0 -26
- package/dist/types/src/model/layout.d.ts.map +0 -1
- package/dist/types/src/model/mermaid.d.ts +0 -42
- package/dist/types/src/model/mermaid.d.ts.map +0 -1
- package/dist/types/src/model/mermaid.test.d.ts +0 -3
- package/dist/types/src/model/mermaid.test.d.ts.map +0 -1
- package/dist/types/src/model/ortho-router.d.ts +0 -8
- package/dist/types/src/model/ortho-router.d.ts.map +0 -1
- package/dist/types/src/model/scene.d.ts +0 -851
- package/dist/types/src/model/scene.d.ts.map +0 -1
- package/dist/types/src/model/svg-handler.d.ts +0 -7
- package/dist/types/src/model/svg-handler.d.ts.map +0 -1
- package/dist/types/src/model/testing.d.ts +0 -3
- package/dist/types/src/model/testing.d.ts.map +0 -1
- package/dist/types/src/model/uml-engine.d.ts +0 -14
- package/dist/types/src/model/uml-engine.d.ts.map +0 -1
- package/dist/types/src/model/uml-engine.test.d.ts +0 -2
- package/dist/types/src/model/uml-engine.test.d.ts.map +0 -1
- package/dist/types/src/model/uml-grid.d.ts +0 -97
- package/dist/types/src/model/uml-grid.d.ts.map +0 -1
- package/dist/types/src/model/uml-grid.test.d.ts +0 -2
- package/dist/types/src/model/uml-grid.test.d.ts.map +0 -1
- package/dist/types/src/model/uml-rules.d.ts +0 -56
- package/dist/types/src/model/uml-rules.d.ts.map +0 -1
- package/dist/types/src/model/uml-rules.test.d.ts +0 -2
- package/dist/types/src/model/uml-rules.test.d.ts.map +0 -1
- package/dist/types/src/model/uml-search.d.ts +0 -26
- package/dist/types/src/model/uml-search.d.ts.map +0 -1
- package/dist/types/src/model/uml-search.test.d.ts +0 -2
- package/dist/types/src/model/uml-search.test.d.ts.map +0 -1
- package/dist/types/src/model/uml.d.ts +0 -60
- package/dist/types/src/model/uml.d.ts.map +0 -1
- package/dist/types/src/model/uml.test.d.ts +0 -2
- package/dist/types/src/model/uml.test.d.ts.map +0 -1
- package/dist/types/src/skills/drawing-skill.d.ts +0 -4
- package/dist/types/src/skills/drawing-skill.d.ts.map +0 -1
- package/dist/types/src/skills/uml-skill.d.ts +0 -4
- package/dist/types/src/skills/uml-skill.d.ts.map +0 -1
- package/src/model/content.ts +0 -180
- package/src/model/dialect.ts +0 -53
- package/src/model/layout.ts +0 -99
- package/src/model/mermaid.test.ts +0 -138
- package/src/model/mermaid.ts +0 -250
- package/src/model/ortho-router.ts +0 -335
- package/src/model/scene.ts +0 -211
- package/src/model/svg-handler.ts +0 -96
- package/src/model/testing.ts +0 -34
- package/src/model/uml-engine.test.ts +0 -63
- package/src/model/uml-engine.ts +0 -139
- package/src/model/uml-grid.test.ts +0 -175
- package/src/model/uml-grid.ts +0 -558
- package/src/model/uml-rules.test.ts +0 -109
- package/src/model/uml-rules.ts +0 -312
- package/src/model/uml-search.test.ts +0 -108
- package/src/model/uml-search.ts +0 -266
- package/src/model/uml.test.ts +0 -172
- package/src/model/uml.ts +0 -390
- package/src/skills/uml-skill.ts +0 -77
package/PLUGIN.mdl
CHANGED
|
@@ -19,9 +19,10 @@ Each extension is defined in the Appendix or resolved via its URI.
|
|
|
19
19
|
|-------------|--------------------------------|
|
|
20
20
|
| `type` | `org.dxos.mdl.type@1.0` |
|
|
21
21
|
| `feat` | `org.dxos.mdl.feat@1.0` |
|
|
22
|
-
| `
|
|
22
|
+
| `scenario` | `org.dxos.mdl.scenario@1.0` |
|
|
23
23
|
| `component` | `org.dxos.mdl.component@1.0` |
|
|
24
|
-
| `op` | `org.dxos.mdl.op@1.
|
|
24
|
+
| `op` | `org.dxos.mdl.op@1.1` |
|
|
25
|
+
| `test` | `org.dxos.mdl.test@1.0` |
|
|
25
26
|
|
|
26
27
|
## Types
|
|
27
28
|
|
|
@@ -45,22 +46,26 @@ component VariantProvider
|
|
|
45
46
|
|
|
46
47
|
```mdl
|
|
47
48
|
op create
|
|
49
|
+
key: org.dxos.operation.illustrator.create
|
|
48
50
|
desc: Creates a Sketch with an empty canvas for the requested (or default) variant.
|
|
49
51
|
|
|
50
52
|
op read
|
|
53
|
+
key: org.dxos.operation.illustrator.read
|
|
51
54
|
desc: Returns the current scene of a sketch as world objects with object-local coordinates.
|
|
52
55
|
|
|
53
56
|
op edit
|
|
57
|
+
key: org.dxos.operation.illustrator.edit
|
|
54
58
|
desc: Applies scene commands to a sketch via the variant's builder; returns the resulting scene.
|
|
55
59
|
|
|
56
60
|
op generate
|
|
61
|
+
key: org.dxos.operation.illustrator.generate
|
|
57
62
|
desc: Replaces a sketch with a diagram compiled from mermaid source (flowchart or classDiagram);
|
|
58
63
|
the dialect owns the layout, so no coordinates are supplied.
|
|
59
64
|
```
|
|
60
65
|
|
|
61
66
|
## Dialects
|
|
62
67
|
|
|
63
|
-
Higher-level diagram languages compile to scene commands (see `src/
|
|
68
|
+
Higher-level diagram languages compile to scene commands (see `@dxos/diagram`, `packages/common/diagram/src/dialect.ts`); each
|
|
64
69
|
dialect owns its layout, so its output lands as ordinary world objects that stay editable by id.
|
|
65
70
|
|
|
66
71
|
```mdl
|
|
@@ -101,3 +106,91 @@ component UmlSkill
|
|
|
101
106
|
the agent extracts the class model, emits a mermaid classDiagram, and the generate
|
|
102
107
|
operation compiles and lays it out.
|
|
103
108
|
```
|
|
109
|
+
|
|
110
|
+
## QA
|
|
111
|
+
|
|
112
|
+
Executable tests. Each step carries a human instruction (`do`) and, where the step maps to an
|
|
113
|
+
invocable operation, an agent binding (`invoke`). Report failures by test and step number.
|
|
114
|
+
|
|
115
|
+
```mdl
|
|
116
|
+
test QA-1: Create, edit, and read back a drawing
|
|
117
|
+
desc: |
|
|
118
|
+
The scene-DSL round-trip through the SVG variant (owned by this plugin, so no renderer plugin
|
|
119
|
+
dependency is needed). Note: the source's runtime ECHO type is `Drawing`, not the `Sketch`
|
|
120
|
+
type documented above — this test uses the real name.
|
|
121
|
+
actors: agent
|
|
122
|
+
covers: []
|
|
123
|
+
status: unverified
|
|
124
|
+
given:
|
|
125
|
+
- an identity exists
|
|
126
|
+
- space: a space is open
|
|
127
|
+
- collection: a collection in that space, to create into
|
|
128
|
+
- no drawing named "QA Sketch" exists — ABORT rather than deleting one this test did not create
|
|
129
|
+
steps:
|
|
130
|
+
- name: Create the drawing
|
|
131
|
+
do: In the navtree, click + on a collection and choose Drawing (or ask the assistant to create one). Name it "QA Sketch".
|
|
132
|
+
invoke: [op:create] { name: "QA Sketch", variant: "svg" }
|
|
133
|
+
capture: created
|
|
134
|
+
expect: a Drawing named "QA Sketch" exists with an empty SVG canvas
|
|
135
|
+
assert: return !!$created.object
|
|
136
|
+
- name: Place it in the collection
|
|
137
|
+
do: (no separate gesture — the navtree create action places it for you)
|
|
138
|
+
invoke: org.dxos.operation.space.addObject { object: $created.object, target: $given.collection }
|
|
139
|
+
expect: "QA Sketch" appears as a row under the collection
|
|
140
|
+
- name: Edit the scene
|
|
141
|
+
do: Ask the assistant to draw a rectangle labeled "Start" at the origin.
|
|
142
|
+
invoke: [op:edit] { drawing: $created.object, commands: [{ _tag: "upsert", id: "start", shape: { _tag: "rect", label: "Start", x: 0, y: 0, width: 120, height: 60 } }] }
|
|
143
|
+
capture: edited
|
|
144
|
+
expect: a rectangle labeled "Start" renders on the canvas
|
|
145
|
+
assert: return $edited.upserted.includes('start')
|
|
146
|
+
- name: Read the scene back
|
|
147
|
+
do: (no separate gesture — the canvas already shows the result of the edit)
|
|
148
|
+
invoke: [op:read] { drawing: $created.object }
|
|
149
|
+
expect: the returned scene's world objects include the "start" shape with the coordinates just written
|
|
150
|
+
assert: return $result.scene.objects?.some((o) => o.id === 'start')
|
|
151
|
+
after:
|
|
152
|
+
- name: Delete the drawing
|
|
153
|
+
do: Right-click "QA Sketch" in the navtree and choose Delete.
|
|
154
|
+
invoke: org.dxos.operation.space.removeObjects { objects: [$created.object], target: $given.collection }
|
|
155
|
+
expect: the row leaves the navtree and its plank closes if it was open
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```mdl
|
|
159
|
+
test QA-2: Generate a UML class diagram from mermaid source
|
|
160
|
+
desc: The UmlSkill path — replace a drawing's contents with a class diagram compiled from mermaid source, with layout owned by the dialect.
|
|
161
|
+
actors: agent
|
|
162
|
+
covers: []
|
|
163
|
+
status: unverified
|
|
164
|
+
given:
|
|
165
|
+
- an identity exists
|
|
166
|
+
- space: a space is open
|
|
167
|
+
- collection: a collection in that space, to create into
|
|
168
|
+
- no drawing named "QA UML" exists — ABORT rather than deleting one this test did not create
|
|
169
|
+
steps:
|
|
170
|
+
- name: Create the drawing
|
|
171
|
+
do: Ask the assistant to create a new drawing named "QA UML".
|
|
172
|
+
invoke: [op:create] { name: "QA UML", variant: "svg" }
|
|
173
|
+
capture: created
|
|
174
|
+
expect: an empty Drawing named "QA UML" exists
|
|
175
|
+
assert: return !!$created.object
|
|
176
|
+
- name: Place it in the collection
|
|
177
|
+
do: (no separate gesture)
|
|
178
|
+
invoke: org.dxos.operation.space.addObject { object: $created.object, target: $given.collection }
|
|
179
|
+
expect: "QA UML" appears as a row under the collection
|
|
180
|
+
- name: Generate from a mermaid classDiagram
|
|
181
|
+
do: |
|
|
182
|
+
Ask the assistant to render this class diagram into "QA UML":
|
|
183
|
+
classDiagram
|
|
184
|
+
class Animal { +String name +makeSound() }
|
|
185
|
+
class Dog
|
|
186
|
+
Animal <|-- Dog
|
|
187
|
+
invoke: |
|
|
188
|
+
[op:generate] { drawing: $created.object, source: "classDiagram\n class Animal { +String name +makeSound() }\n class Dog\n Animal <|-- Dog\n" }
|
|
189
|
+
expect: two class boxes ("Animal", "Dog") render with a supertype-above-subtype layered layout and an inheritance arrow between them, replacing the drawing's prior contents
|
|
190
|
+
assert: return $result.upserted.length >= 2
|
|
191
|
+
after:
|
|
192
|
+
- name: Delete the drawing
|
|
193
|
+
do: Right-click "QA UML" in the navtree and choose Delete.
|
|
194
|
+
invoke: org.dxos.operation.space.removeObjects { objects: [$created.object], target: $given.collection }
|
|
195
|
+
expect: the row leaves the navtree and its plank closes if it was open
|
|
196
|
+
```
|
package/dist/lib/Drawing.mjs
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
-
import { Annotation, DXN, Obj, Ref, Type } from "@dxos/echo";
|
|
3
2
|
import * as Schema from "effect/Schema";
|
|
4
|
-
import {
|
|
5
|
-
import { CardAnnotation
|
|
3
|
+
import { Annotation, Collection, DXN, Obj, Ref, Type } from "@dxos/echo";
|
|
4
|
+
import { CardAnnotation } from "@dxos/schema";
|
|
6
5
|
//#region src/types/Drawing.ts
|
|
7
6
|
var Drawing_exports = /* @__PURE__ */ __exportAll({
|
|
8
7
|
Canvas: () => Canvas,
|
|
@@ -23,7 +22,7 @@ var Drawing_exports = /* @__PURE__ */ __exportAll({
|
|
|
23
22
|
var Canvas = class extends Type.makeObject(DXN.make("org.dxos.type.canvas", "0.1.0"))(Schema.Struct({
|
|
24
23
|
schema: Schema.String.pipe(Schema.optional),
|
|
25
24
|
content: Schema.Record(Schema.String, Schema.Any)
|
|
26
|
-
})
|
|
25
|
+
})) {};
|
|
27
26
|
/** Creates a {@link Canvas} for the given renderer schema. */
|
|
28
27
|
var makeCanvas = ({ schema, content = {} }) => Obj.make(Canvas, {
|
|
29
28
|
schema,
|
|
@@ -38,11 +37,11 @@ var isCanvas = (object) => Obj.instanceOf(Canvas, object);
|
|
|
38
37
|
*/
|
|
39
38
|
var Drawing = class extends Type.makeObject(DXN.make("org.dxos.type.drawing", "0.1.0"))(Schema.Struct({
|
|
40
39
|
name: Schema.optional(Schema.String),
|
|
41
|
-
canvas: Ref.Ref(Canvas).annotate({ description: "Reference to the canvas holding the renderer-specific content." }).pipe(FormInputAnnotation.set(false))
|
|
42
|
-
}).pipe(LabelAnnotation.set(["name"]), Annotation.IconAnnotation.set({
|
|
40
|
+
canvas: Ref.Ref(Canvas).annotate({ description: "Reference to the canvas holding the renderer-specific content." }).pipe(Annotation.FormInputAnnotation.set(false))
|
|
41
|
+
}).pipe(Annotation.LabelAnnotation.set(["name"]), Annotation.IconAnnotation.set({
|
|
43
42
|
icon: "ph--compass-tool--regular",
|
|
44
43
|
hue: "indigo"
|
|
45
|
-
}), CardAnnotation.set(true),
|
|
44
|
+
}), CardAnnotation.set(true), Annotation.UserType.set({ tags: [Collection.ItemTag] }))) {};
|
|
46
45
|
/**
|
|
47
46
|
* Build a `Drawing` referencing the given canvas.
|
|
48
47
|
*
|
package/dist/lib/Drawing.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Drawing.mjs","names":[],"sources":["../../src/types/Drawing.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Annotation, DXN, Obj, Ref, Type } from '@dxos/echo';\nimport {
|
|
1
|
+
{"version":3,"file":"Drawing.mjs","names":[],"sources":["../../src/types/Drawing.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Annotation, Collection, DXN, Obj, Ref, Type } from '@dxos/echo';\nimport { CardAnnotation } from '@dxos/schema';\n\n/**\n * Canvas content shared by every renderer: an opaque map of record id → record, managed by the\n * renderer's store adapter and CRDT-merged by ECHO without knowing its shape. `schema` identifies\n * the renderer dialect (e.g. `tldraw.com/2`, `excalidraw.com/2`) and is how a `Drawing` is matched\n * to the variant that can render it.\n *\n * Hidden: reached through `Drawing.canvas`, never listed on its own.\n */\nexport class Canvas extends Type.makeObject<Canvas>(DXN.make('org.dxos.type.canvas', '0.1.0'))(\n Schema.Struct({\n schema: Schema.String.pipe(Schema.optional),\n content: Schema.Record(Schema.String, Schema.Any),\n }),\n) {}\n\nexport type MakeCanvasOptions = Omit<Partial<Obj.MakeProps<typeof Canvas>>, 'schema'> & {\n /** Required at construction: matches the canvas to a renderer variant. */\n schema: string;\n};\n\n/** Creates a {@link Canvas} for the given renderer schema. */\nexport const makeCanvas = ({ schema, content = {} }: MakeCanvasOptions): Canvas =>\n Obj.make(Canvas, { schema, content });\n\n/** Type guard for {@link Canvas} objects. */\nexport const isCanvas = (object: unknown): object is Canvas => Obj.instanceOf(Canvas, object);\n\n/**\n * Base Drawing object. Renderer-specific behaviour lives in the variant that claims the canvas's\n * `schema`, so all renderers (tldraw, excalidraw, ...) share one typename, graph node, create\n * flow, and surface scaffolding.\n */\nexport class Drawing extends Type.makeObject<Drawing>(DXN.make('org.dxos.type.drawing', '0.1.0'))(\n Schema.Struct({\n name: Schema.optional(Schema.String),\n canvas: Ref.Ref(Canvas)\n .annotate({ description: 'Reference to the canvas holding the renderer-specific content.' })\n .pipe(Annotation.FormInputAnnotation.set(false)),\n }).pipe(\n Annotation.LabelAnnotation.set(['name']),\n Annotation.IconAnnotation.set({ icon: 'ph--compass-tool--regular', hue: 'indigo' }),\n CardAnnotation.set(true),\n Annotation.UserType.set({ tags: [Collection.ItemTag] }),\n ),\n) {}\n\n/**\n * Build a `Drawing` referencing the given canvas.\n *\n * @param name Optional display name shown in the graph node and Properties form.\n * @param canvas Canvas holding the renderer's content.\n */\nexport const make = ({ name, canvas }: { name?: string; canvas: Canvas }): Drawing =>\n Obj.make(Drawing, { name, canvas: Ref.make(canvas) });\n\n/** Type guard for {@link Drawing} objects. */\nexport const isDrawing = (object: unknown): object is Drawing => Obj.instanceOf(Drawing, object);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmBA,IAAa,SAAb,cAA4B,KAAK,WAAmB,IAAI,KAAK,wBAAwB,OAAO,CAAC,CAAC,CAC5F,OAAO,OAAO;CACZ,QAAQ,OAAO,OAAO,KAAK,OAAO,QAAQ;CAC1C,SAAS,OAAO,OAAO,OAAO,QAAQ,OAAO,GAAG;AAClD,CAAC,CACH,CAAC,CAAC,CAAC;;AAQH,IAAa,cAAc,EAAE,QAAQ,UAAU,CAAC,QAC9C,IAAI,KAAK,QAAQ;CAAE;CAAQ;AAAQ,CAAC;;AAGtC,IAAa,YAAY,WAAsC,IAAI,WAAW,QAAQ,MAAM;;;;;;AAO5F,IAAa,UAAb,cAA6B,KAAK,WAAoB,IAAI,KAAK,yBAAyB,OAAO,CAAC,CAAC,CAC/F,OAAO,OAAO;CACZ,MAAM,OAAO,SAAS,OAAO,MAAM;CACnC,QAAQ,IAAI,IAAI,MAAM,CAAA,CACnB,SAAS,EAAE,aAAa,iEAAiE,CAAC,CAAA,CAC1F,KAAK,WAAW,oBAAoB,IAAI,KAAK,CAAC;AACnD,CAAC,CAAC,CAAC,KACD,WAAW,gBAAgB,IAAI,CAAC,MAAM,CAAC,GACvC,WAAW,eAAe,IAAI;CAAE,MAAM;CAA6B,KAAK;AAAS,CAAC,GAClF,eAAe,IAAI,IAAI,GACvB,WAAW,SAAS,IAAI,EAAE,MAAM,CAAC,WAAW,OAAO,EAAE,CAAC,CACxD,CACF,CAAC,CAAC,CAAC;;;;;;;AAQH,IAAa,QAAQ,EAAE,MAAM,aAC3B,IAAI,KAAK,SAAS;CAAE;CAAM,QAAQ,IAAI,KAAK,MAAM;AAAE,CAAC;;AAGtD,IAAa,aAAa,WAAuC,IAAI,WAAW,SAAS,MAAM"}
|
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
2
|
import { Drawing } from "./Drawing.mjs";
|
|
3
3
|
import * as Capability from "@dxos/app-framework/Capability";
|
|
4
|
-
import { Scene } from "
|
|
5
|
-
import { Database, Ref, Type } from "@dxos/echo";
|
|
4
|
+
import { Diagnostics, Scene } from "@dxos/diagram";
|
|
6
5
|
import * as Schema from "effect/Schema";
|
|
7
|
-
import
|
|
6
|
+
import { Database, Ref, Type } from "@dxos/echo";
|
|
8
7
|
import { DXN as DXN$1 } from "@dxos/keys";
|
|
8
|
+
import * as Operation from "@dxos/compute/Operation";
|
|
9
9
|
//#region src/types/DrawingOperation.ts
|
|
10
10
|
var DrawingOperation_exports = /* @__PURE__ */ __exportAll({
|
|
11
11
|
Create: () => Create,
|
|
12
|
+
Draw: () => Draw,
|
|
12
13
|
Edit: () => Edit,
|
|
13
14
|
Generate: () => Generate,
|
|
14
|
-
Read: () => Read
|
|
15
|
+
Read: () => Read,
|
|
16
|
+
Score: () => Score
|
|
15
17
|
});
|
|
16
18
|
var Create = Operation.make({
|
|
17
19
|
meta: {
|
|
18
20
|
key: DXN$1.make("org.dxos.operation.illustrator.create"),
|
|
19
21
|
name: "Create Drawing",
|
|
22
|
+
description: "Creates an empty drawing in the space and returns it; pass it to Generate, Draw or Edit.",
|
|
20
23
|
icon: "ph--pencil-simple--regular"
|
|
21
24
|
},
|
|
22
25
|
input: Schema.Struct({
|
|
@@ -60,6 +63,41 @@ var Edit = Operation.make({
|
|
|
60
63
|
}),
|
|
61
64
|
services: [Capability.Service, Database.Service]
|
|
62
65
|
});
|
|
66
|
+
var Draw = Operation.make({
|
|
67
|
+
meta: {
|
|
68
|
+
key: DXN$1.make("org.dxos.operation.illustrator.draw"),
|
|
69
|
+
name: "Draw Diagram",
|
|
70
|
+
description: "Applies a diagram written in the native text DSL: either semantic statements (`node`, `edge`, `group`) that state intent and are laid out for you, or scene statements where you choose every coordinate, or both. Use semantic statements for boxes-and-arrows diagrams, scene statements for precise figures or to hand-edit a drawing.",
|
|
71
|
+
icon: "ph--code--regular"
|
|
72
|
+
},
|
|
73
|
+
input: Schema.Struct({
|
|
74
|
+
drawing: Ref.Ref(Drawing).annotate({ description: "The drawing to draw into." }),
|
|
75
|
+
source: Schema.String.annotate({ description: [
|
|
76
|
+
"Diagram DSL. Semantic statements: `node <id> [\"label\"] [right-of|left-of|above|below|same-row|same-col <node>]* [@cell(c,r)] [ref=]`,",
|
|
77
|
+
"`group <id> [\"label\"] [right-of|below… <group>] { node… edge… }`, `edge <a>[:side|side] -> <b>[:side] [\"label\"] [via x,_ | _,y] [bus]`",
|
|
78
|
+
"(`~` before a relation makes it soft; `<->` two arrows; `a -> b, c bus` one trunk), `diagram [flow=down|right]`; the engine places and routes the rest.",
|
|
79
|
+
"In place of `->` an edge may name its relationship, left end being the child/whole/owner/one side: `extends`, `implements`, `composes`, `owns`, `one-to-many`, `many-to-many`, `depends-on`.",
|
|
80
|
+
"Scene statements are `object <id> [@ <x>,<y>] [scale=] [index=] [ref=] { <element>* }`,",
|
|
81
|
+
"`elements <objectId> { … }`, `move <id> @ <x>,<y>`, `remove object <id>`, `remove elements <id> <ids…>`.",
|
|
82
|
+
"An element is `<kind> <id> <geometry> [\"label\"] <name=value>*` where kind is rect/ellipse/diamond/triangle",
|
|
83
|
+
"(`x,y WxH`), circle (`cx,cy r`), line/curve (two or more `x,y`), arc (`cx,cy r a0..a1`), text (`x,y \"s\"`),",
|
|
84
|
+
"arrow (`<end> -> <end>`, each end a ref like `Obj/elem#port`, a point, or `_`), or portal (`x,y WxH ref=\"<dxn>\"`)."
|
|
85
|
+
].join(" ") })
|
|
86
|
+
}),
|
|
87
|
+
output: Schema.Struct({
|
|
88
|
+
...SceneOutput,
|
|
89
|
+
upserted: Schema.Array(Schema.String).annotate({ description: "Object ids created or modified." }),
|
|
90
|
+
removed: Schema.Number.annotate({ description: "Number of shapes removed." }),
|
|
91
|
+
problems: Schema.Array(Schema.Struct({
|
|
92
|
+
severity: Schema.Literals(["error", "warning"]),
|
|
93
|
+
message: Schema.String,
|
|
94
|
+
line: Schema.Number,
|
|
95
|
+
column: Schema.Number
|
|
96
|
+
})).annotate({ description: "Syntax and schema problems in the source, with 1-based line/column. A single `error` leaves the drawing untouched — fix it and draw again." }),
|
|
97
|
+
diagnostics: Schema.Array(Diagnostics.Diagnostic).annotate({ description: "Layout report over the resulting scene. Fix every `error` (overlap, connector through a node, label overflow) by moving or resizing the offending elements and drawing again." })
|
|
98
|
+
}),
|
|
99
|
+
services: [Capability.Service, Database.Service]
|
|
100
|
+
});
|
|
63
101
|
var Generate = Operation.make({
|
|
64
102
|
meta: {
|
|
65
103
|
key: DXN$1.make("org.dxos.operation.illustrator.generate"),
|
|
@@ -69,15 +107,36 @@ var Generate = Operation.make({
|
|
|
69
107
|
},
|
|
70
108
|
input: Schema.Struct({
|
|
71
109
|
drawing: Ref.Ref(Drawing).annotate({ description: "The drawing to generate into." }),
|
|
72
|
-
source: Schema.String.annotate({ description: "Mermaid source: a flowchart or a classDiagram." })
|
|
110
|
+
source: Schema.String.annotate({ description: "Mermaid source: a flowchart or a classDiagram. Flowcharts may carry `%% ref <nodeId> <target>` lines saying what a node depicts: an ECHO object reference opens on activation; other URIs and paths are carried for tooling." })
|
|
73
111
|
}),
|
|
74
112
|
output: Schema.Struct({
|
|
75
113
|
...SceneOutput,
|
|
76
|
-
upserted: Schema.Array(Schema.String).annotate({ description: "Object ids created or modified." })
|
|
114
|
+
upserted: Schema.Array(Schema.String).annotate({ description: "Object ids created or modified." }),
|
|
115
|
+
diagnostics: Schema.Array(Diagnostics.Diagnostic).annotate({ description: "Layout report. Fix every `error` (overlap, connector through a node, label overflow) by simplifying or splitting the diagram and regenerating; `warning`s (crossings, bends) are quality hints." })
|
|
116
|
+
}),
|
|
117
|
+
services: [Capability.Service, Database.Service]
|
|
118
|
+
});
|
|
119
|
+
var Score = Operation.make({
|
|
120
|
+
meta: {
|
|
121
|
+
key: DXN$1.make("org.dxos.operation.illustrator.analyze"),
|
|
122
|
+
name: "Score Drawing",
|
|
123
|
+
description: "Grades the drawing as laid out, on one 0–1 scale (1 is good): each layout constraint (pass 1 / fail 0) and cost term (crossings, overlapping arrows, overlapping labels, bends, length, gaps, compactness), their overall score, and the diagnostics behind them. Call after Generate to decide what to change before regenerating.",
|
|
124
|
+
icon: "ph--gauge--regular"
|
|
125
|
+
},
|
|
126
|
+
input: Schema.Struct({ drawing: Ref.Ref(Drawing).annotate({ description: "The drawing to score." }) }),
|
|
127
|
+
output: Schema.Struct({
|
|
128
|
+
overall: Schema.optional(Schema.Number).annotate({ description: "The worst constraint gating the mean of the cost scores; absent when nothing could be scored." }),
|
|
129
|
+
scores: Schema.Array(Schema.Struct({
|
|
130
|
+
id: Schema.String,
|
|
131
|
+
kind: Schema.String,
|
|
132
|
+
score: Schema.Number,
|
|
133
|
+
detail: Schema.optional(Schema.String)
|
|
134
|
+
})),
|
|
135
|
+
diagnostics: Schema.Array(Diagnostics.Diagnostic)
|
|
77
136
|
}),
|
|
78
137
|
services: [Capability.Service, Database.Service]
|
|
79
138
|
});
|
|
80
139
|
//#endregion
|
|
81
|
-
export { Create, Edit, Generate, Read, DrawingOperation_exports as t };
|
|
140
|
+
export { Create, Draw, Edit, Generate, Read, Score, DrawingOperation_exports as t };
|
|
82
141
|
|
|
83
142
|
//# sourceMappingURL=DrawingOperation.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrawingOperation.mjs","names":[],"sources":["../../src/types/DrawingOperation.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as Operation from '@dxos/compute/Operation';\nimport { Database, Ref, Type } from '@dxos/echo';\nimport { DXN } from '@dxos/keys';\n\nimport { Scene } from '#model';\n\nimport * as Drawing from './Drawing';\n\nexport const Create = Operation.make({\n meta: {\n key: DXN.make('org.dxos.operation.illustrator.create'),\n name: 'Create Drawing',\n icon: 'ph--pencil-simple--regular',\n },\n input: Schema.Struct({\n name: Schema.optional(Schema.String),\n variant: Schema.optional(Schema.String).annotate({\n description: 'Variant id (canvas typename); defaults to the first registered variant.',\n }),\n }),\n output: Schema.Struct({\n object: Type.getSchema(Drawing.Drawing),\n }),\n services: [Capability.Service, Database.Service],\n});\n\n/** The scene as derived from the live canvas. */\nconst SceneOutput = {\n scene: Scene.Scene.annotate({ description: 'The diagram as world objects with object-local coordinates.' }),\n unmanaged: Schema.Number.annotate({\n description: 'Number of shapes on the canvas not managed by the DSL (drawn by users).',\n }),\n};\n\nexport const Read = Operation.make({\n meta: {\n key: DXN.make('org.dxos.operation.illustrator.read'),\n name: 'Read Drawing',\n description:\n 'Returns the current scene of a drawing: world objects (by id) with their elements in object-local units. Call before editing an existing drawing.',\n icon: 'ph--eye--regular',\n },\n input: Schema.Struct({\n drawing: Ref.Ref(Drawing.Drawing).annotate({ description: 'The drawing to read.' }),\n }),\n output: Schema.Struct(SceneOutput),\n services: [Capability.Service, Database.Service],\n});\n\nexport const Edit = Operation.make({\n meta: {\n key: DXN.make('org.dxos.operation.illustrator.edit'),\n name: 'Edit Drawing',\n description:\n 'Applies scene commands to a drawing: upsert/move/remove world objects or individual elements by id. Returns the resulting scene.',\n icon: 'ph--pencil-simple-line--regular',\n },\n input: Schema.Struct({\n drawing: Ref.Ref(Drawing.Drawing).annotate({ description: 'The drawing to edit.' }),\n commands: Schema.Array(Scene.Command).annotate({ description: 'Commands applied in order, atomically.' }),\n }),\n output: Schema.Struct({\n ...SceneOutput,\n upserted: Schema.Array(Schema.String).annotate({ description: 'Object ids created or modified.' }),\n removed: Schema.Number.annotate({ description: 'Number of shapes removed.' }),\n }),\n services: [Capability.Service, Database.Service],\n});\n\nexport const Generate = Operation.make({\n meta: {\n key: DXN.make('org.dxos.operation.illustrator.generate'),\n name: 'Generate Drawing',\n description:\n 'Replaces a drawing with a diagram compiled from a mermaid description (flowchart or classDiagram). The dialect owns layout, so no coordinates are supplied.',\n icon: 'ph--graph--regular',\n },\n input: Schema.Struct({\n drawing: Ref.Ref(Drawing.Drawing).annotate({ description: 'The drawing to generate into.' }),\n source: Schema.String.annotate({ description: 'Mermaid source: a flowchart or a classDiagram.' }),\n }),\n output: Schema.Struct({\n ...SceneOutput,\n upserted: Schema.Array(Schema.String).annotate({ description: 'Object ids created or modified.' }),\n }),\n services: [Capability.Service, Database.Service],\n});\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,IAAa,SAAS,UAAU,KAAK;CACnC,MAAM;EACJ,KAAK,MAAI,KAAK,uCAAuC;EACrD,MAAM;EACN,MAAM;CACR;CACA,OAAO,OAAO,OAAO;EACnB,MAAM,OAAO,SAAS,OAAO,MAAM;EACnC,SAAS,OAAO,SAAS,OAAO,MAAM,CAAC,CAAC,SAAS,EAC/C,aAAa,0EACf,CAAC;CACH,CAAC;CACD,QAAQ,OAAO,OAAO,EACpB,QAAQ,KAAK,UAAU,OAAe,EACxC,CAAC;CACD,UAAU,CAAC,WAAW,SAAS,SAAS,OAAO;AACjD,CAAC;;AAGD,IAAM,cAAc;CAClB,OAAO,MAAM,MAAM,SAAS,EAAE,aAAa,8DAA8D,CAAC;CAC1G,WAAW,OAAO,OAAO,SAAS,EAChC,aAAa,0EACf,CAAC;AACH;AAEA,IAAa,OAAO,UAAU,KAAK;CACjC,MAAM;EACJ,KAAK,MAAI,KAAK,qCAAqC;EACnD,MAAM;EACN,aACE;EACF,MAAM;CACR;CACA,OAAO,OAAO,OAAO,EACnB,SAAS,IAAI,IAAI,OAAe,CAAC,CAAC,SAAS,EAAE,aAAa,uBAAuB,CAAC,EACpF,CAAC;CACD,QAAQ,OAAO,OAAO,WAAW;CACjC,UAAU,CAAC,WAAW,SAAS,SAAS,OAAO;AACjD,CAAC;AAED,IAAa,OAAO,UAAU,KAAK;CACjC,MAAM;EACJ,KAAK,MAAI,KAAK,qCAAqC;EACnD,MAAM;EACN,aACE;EACF,MAAM;CACR;CACA,OAAO,OAAO,OAAO;EACnB,SAAS,IAAI,IAAI,OAAe,CAAC,CAAC,SAAS,EAAE,aAAa,uBAAuB,CAAC;EAClF,UAAU,OAAO,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,EAAE,aAAa,yCAAyC,CAAC;CAC1G,CAAC;CACD,QAAQ,OAAO,OAAO;EACpB,GAAG;EACH,UAAU,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC,SAAS,EAAE,aAAa,kCAAkC,CAAC;EACjG,SAAS,OAAO,OAAO,SAAS,EAAE,aAAa,4BAA4B,CAAC;CAC9E,CAAC;CACD,UAAU,CAAC,WAAW,SAAS,SAAS,OAAO;AACjD,CAAC;AAED,IAAa,WAAW,UAAU,KAAK;CACrC,MAAM;EACJ,KAAK,MAAI,KAAK,yCAAyC;EACvD,MAAM;EACN,aACE;EACF,MAAM;CACR;CACA,OAAO,OAAO,OAAO;EACnB,SAAS,IAAI,IAAI,OAAe,CAAC,CAAC,SAAS,EAAE,aAAa,gCAAgC,CAAC;EAC3F,QAAQ,OAAO,OAAO,SAAS,EAAE,aAAa,iDAAiD,CAAC;CAClG,CAAC;CACD,QAAQ,OAAO,OAAO;EACpB,GAAG;EACH,UAAU,OAAO,MAAM,OAAO,MAAM,CAAC,CAAC,SAAS,EAAE,aAAa,kCAAkC,CAAC;CACnG,CAAC;CACD,UAAU,CAAC,WAAW,SAAS,SAAS,OAAO;AACjD,CAAC"}
|
|
1
|
+
{"version":3,"file":"DrawingOperation.mjs","names":[],"sources":["../../src/types/DrawingOperation.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as Operation from '@dxos/compute/Operation';\nimport { Diagnostics, Scene } from '@dxos/diagram';\nimport { Database, Ref, Type } from '@dxos/echo';\nimport { DXN } from '@dxos/keys';\n\nimport * as Drawing from './Drawing.ts';\n\nexport const Create = Operation.make({\n meta: {\n key: DXN.make('org.dxos.operation.illustrator.create'),\n name: 'Create Drawing',\n description: 'Creates an empty drawing in the space and returns it; pass it to Generate, Draw or Edit.',\n icon: 'ph--pencil-simple--regular',\n },\n input: Schema.Struct({\n name: Schema.optional(Schema.String),\n variant: Schema.optional(Schema.String).annotate({\n description: 'Variant id (canvas typename); defaults to the first registered variant.',\n }),\n }),\n output: Schema.Struct({\n object: Type.getSchema(Drawing.Drawing),\n }),\n services: [Capability.Service, Database.Service],\n});\n\n/** The scene as derived from the live canvas. */\nconst SceneOutput = {\n scene: Scene.Scene.annotate({ description: 'The diagram as world objects with object-local coordinates.' }),\n unmanaged: Schema.Number.annotate({\n description: 'Number of shapes on the canvas not managed by the DSL (drawn by users).',\n }),\n};\n\nexport const Read = Operation.make({\n meta: {\n key: DXN.make('org.dxos.operation.illustrator.read'),\n name: 'Read Drawing',\n description:\n 'Returns the current scene of a drawing: world objects (by id) with their elements in object-local units. Call before editing an existing drawing.',\n icon: 'ph--eye--regular',\n },\n input: Schema.Struct({\n drawing: Ref.Ref(Drawing.Drawing).annotate({ description: 'The drawing to read.' }),\n }),\n output: Schema.Struct(SceneOutput),\n services: [Capability.Service, Database.Service],\n});\n\nexport const Edit = Operation.make({\n meta: {\n key: DXN.make('org.dxos.operation.illustrator.edit'),\n name: 'Edit Drawing',\n description:\n 'Applies scene commands to a drawing: upsert/move/remove world objects or individual elements by id. Returns the resulting scene.',\n icon: 'ph--pencil-simple-line--regular',\n },\n input: Schema.Struct({\n drawing: Ref.Ref(Drawing.Drawing).annotate({ description: 'The drawing to edit.' }),\n commands: Schema.Array(Scene.Command).annotate({ description: 'Commands applied in order, atomically.' }),\n }),\n output: Schema.Struct({\n ...SceneOutput,\n upserted: Schema.Array(Schema.String).annotate({ description: 'Object ids created or modified.' }),\n removed: Schema.Number.annotate({ description: 'Number of shapes removed.' }),\n }),\n services: [Capability.Service, Database.Service],\n});\n\nexport const Draw = Operation.make({\n meta: {\n key: DXN.make('org.dxos.operation.illustrator.draw'),\n name: 'Draw Diagram',\n description:\n 'Applies a diagram written in the native text DSL: either semantic statements (`node`, `edge`, `group`) that state intent and are laid out for you, or scene statements where you choose every coordinate, or both. Use semantic statements for boxes-and-arrows diagrams, scene statements for precise figures or to hand-edit a drawing.',\n icon: 'ph--code--regular',\n },\n input: Schema.Struct({\n drawing: Ref.Ref(Drawing.Drawing).annotate({ description: 'The drawing to draw into.' }),\n source: Schema.String.annotate({\n description: [\n 'Diagram DSL. Semantic statements: `node <id> [\"label\"] [right-of|left-of|above|below|same-row|same-col <node>]* [@cell(c,r)] [ref=]`,',\n '`group <id> [\"label\"] [right-of|below… <group>] { node… edge… }`, `edge <a>[:side|side] -> <b>[:side] [\"label\"] [via x,_ | _,y] [bus]`',\n '(`~` before a relation makes it soft; `<->` two arrows; `a -> b, c bus` one trunk), `diagram [flow=down|right]`; the engine places and routes the rest.',\n 'In place of `->` an edge may name its relationship, left end being the child/whole/owner/one side: `extends`, `implements`, `composes`, `owns`, `one-to-many`, `many-to-many`, `depends-on`.',\n 'Scene statements are `object <id> [@ <x>,<y>] [scale=] [index=] [ref=] { <element>* }`,',\n '`elements <objectId> { … }`, `move <id> @ <x>,<y>`, `remove object <id>`, `remove elements <id> <ids…>`.',\n 'An element is `<kind> <id> <geometry> [\"label\"] <name=value>*` where kind is rect/ellipse/diamond/triangle',\n '(`x,y WxH`), circle (`cx,cy r`), line/curve (two or more `x,y`), arc (`cx,cy r a0..a1`), text (`x,y \"s\"`),',\n 'arrow (`<end> -> <end>`, each end a ref like `Obj/elem#port`, a point, or `_`), or portal (`x,y WxH ref=\"<dxn>\"`).',\n ].join(' '),\n }),\n }),\n output: Schema.Struct({\n ...SceneOutput,\n upserted: Schema.Array(Schema.String).annotate({ description: 'Object ids created or modified.' }),\n removed: Schema.Number.annotate({ description: 'Number of shapes removed.' }),\n problems: Schema.Array(\n Schema.Struct({\n severity: Schema.Literals(['error', 'warning']),\n message: Schema.String,\n line: Schema.Number,\n column: Schema.Number,\n }),\n ).annotate({\n description:\n 'Syntax and schema problems in the source, with 1-based line/column. A single `error` leaves the drawing untouched — fix it and draw again.',\n }),\n diagnostics: Schema.Array(Diagnostics.Diagnostic).annotate({\n description:\n 'Layout report over the resulting scene. Fix every `error` (overlap, connector through a node, label overflow) by moving or resizing the offending elements and drawing again.',\n }),\n }),\n services: [Capability.Service, Database.Service],\n});\n\nexport const Generate = Operation.make({\n meta: {\n key: DXN.make('org.dxos.operation.illustrator.generate'),\n name: 'Generate Drawing',\n description:\n 'Replaces a drawing with a diagram compiled from a mermaid description (flowchart or classDiagram). The dialect owns layout, so no coordinates are supplied.',\n icon: 'ph--graph--regular',\n },\n input: Schema.Struct({\n drawing: Ref.Ref(Drawing.Drawing).annotate({ description: 'The drawing to generate into.' }),\n source: Schema.String.annotate({\n description:\n 'Mermaid source: a flowchart or a classDiagram. Flowcharts may carry `%% ref <nodeId> <target>` lines saying what a node depicts: an ECHO object reference opens on activation; other URIs and paths are carried for tooling.',\n }),\n }),\n output: Schema.Struct({\n ...SceneOutput,\n upserted: Schema.Array(Schema.String).annotate({ description: 'Object ids created or modified.' }),\n diagnostics: Schema.Array(Diagnostics.Diagnostic).annotate({\n description:\n 'Layout report. Fix every `error` (overlap, connector through a node, label overflow) by simplifying or splitting the diagram and regenerating; `warning`s (crossings, bends) are quality hints.',\n }),\n }),\n services: [Capability.Service, Database.Service],\n});\n\nexport const Score = Operation.make({\n meta: {\n key: DXN.make('org.dxos.operation.illustrator.analyze'),\n name: 'Score Drawing',\n description:\n 'Grades the drawing as laid out, on one 0–1 scale (1 is good): each layout constraint (pass 1 / fail 0) and cost ' +\n 'term (crossings, overlapping arrows, overlapping labels, bends, length, gaps, compactness), their overall score, ' +\n 'and the diagnostics behind them. Call after Generate to decide what to change before regenerating.',\n icon: 'ph--gauge--regular',\n },\n input: Schema.Struct({\n drawing: Ref.Ref(Drawing.Drawing).annotate({ description: 'The drawing to score.' }),\n }),\n output: Schema.Struct({\n overall: Schema.optional(Schema.Number).annotate({\n description: 'The worst constraint gating the mean of the cost scores; absent when nothing could be scored.',\n }),\n scores: Schema.Array(\n Schema.Struct({\n id: Schema.String,\n kind: Schema.String,\n score: Schema.Number,\n detail: Schema.optional(Schema.String),\n }),\n ),\n diagnostics: Schema.Array(Diagnostics.Diagnostic),\n }),\n services: [Capability.Service, Database.Service],\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
+
import { DrawingOperation } from "#types";
|
|
3
|
+
import { trim } from "@dxos/util";
|
|
4
|
+
import * as Operation from "@dxos/compute/Operation";
|
|
5
|
+
import * as Skill from "@dxos/compute/Skill";
|
|
6
|
+
import * as Template from "@dxos/compute/Template";
|
|
7
|
+
//#region src/skills/DrawingSkill.ts
|
|
8
|
+
var DrawingSkill_exports = /* @__PURE__ */ __exportAll({
|
|
9
|
+
key: () => key,
|
|
10
|
+
make: () => make
|
|
11
|
+
});
|
|
12
|
+
var key = "org.dxos.skill.drawing";
|
|
13
|
+
var operations = [
|
|
14
|
+
DrawingOperation.Create,
|
|
15
|
+
DrawingOperation.Read,
|
|
16
|
+
DrawingOperation.Edit
|
|
17
|
+
];
|
|
18
|
+
var make = () => Skill.make({
|
|
19
|
+
key,
|
|
20
|
+
name: "Drawing",
|
|
21
|
+
tools: Skill.toolDefinitions({ operations }),
|
|
22
|
+
instructions: Template.make({ source: trim`
|
|
23
|
+
{{! Drawing }}
|
|
24
|
+
|
|
25
|
+
You can draw and edit diagrams on a shared canvas using a scene DSL.
|
|
26
|
+
|
|
27
|
+
## Model
|
|
28
|
+
|
|
29
|
+
A drawing is a set of WORLD OBJECTS — semantic things like "face", "hat", "server" —
|
|
30
|
+
each composed of graphical ELEMENTS (rect, ellipse, circle, diamond, triangle, line,
|
|
31
|
+
curve, arc, text, arrow). You do the layout; there is no auto-layout.
|
|
32
|
+
|
|
33
|
+
- Give objects and elements short, semantic ids ("face", "left-eye"). Ids are how you
|
|
34
|
+
edit or delete things later — choose them as carefully as variable names.
|
|
35
|
+
- Element coordinates are OBJECT-LOCAL units. Design each object in roughly a 100-unit
|
|
36
|
+
box. The object's "origin" (canvas px) and "scale" (px per unit) place it on the
|
|
37
|
+
canvas: canvas = origin + local * scale. Prefer scale 2-3 for a primary subject.
|
|
38
|
+
- Screen coordinates: x grows right, y grows DOWN. Arc angles are degrees clockwise
|
|
39
|
+
from the +x axis: startAngle 30, endAngle 150 bulges downward (a smile);
|
|
40
|
+
210 to 330 bulges upward (a frown).
|
|
41
|
+
- Circle is sugar for ellipse (reads back as ellipse); arc is sugar for curve.
|
|
42
|
+
- Arrows can bind to elements: from/to is an element id in the same object, or
|
|
43
|
+
"objectId/elementId" across objects. Bound arrows track their targets.
|
|
44
|
+
- Styles: color (named palette), fill (none | solid | pattern),
|
|
45
|
+
stroke (sketchy | solid | dashed | dotted), weight (s | m | l | xl).
|
|
46
|
+
|
|
47
|
+
## Workflow
|
|
48
|
+
|
|
49
|
+
1. If no drawing exists in context, create one first.
|
|
50
|
+
2. ALWAYS call ${Operation.toolName(DrawingOperation.Read)} before editing an existing drawing — it returns the scene as you
|
|
51
|
+
(or the user) last left it, with origins derived from the live canvas, so it stays
|
|
52
|
+
correct even after the user drags shapes around. Note "unmanaged" counts shapes the
|
|
53
|
+
user drew by hand that are not part of the scene.
|
|
54
|
+
3. Edit with commands, in one batch where possible:
|
|
55
|
+
- upsert-object: create a new object, or redraw one wholesale.
|
|
56
|
+
- upsert-elements: add or replace specific elements of an object — prefer this for
|
|
57
|
+
incremental changes ("make the smile bigger" replaces only "smile").
|
|
58
|
+
- remove-elements / remove-object: delete by id.
|
|
59
|
+
- move-object: reposition an object (canvas px) without resending its elements.
|
|
60
|
+
4. Compose scenes from multiple objects: "add a hat" means a NEW "hat" object placed
|
|
61
|
+
relative to the existing object's origin and size (from read) — do not redraw the
|
|
62
|
+
existing object.
|
|
63
|
+
` })
|
|
64
|
+
});
|
|
65
|
+
//#endregion
|
|
66
|
+
export { key, make, DrawingSkill_exports as t };
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=DrawingSkill.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawingSkill.mjs","names":[],"sources":["../../src/skills/DrawingSkill.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Operation from '@dxos/compute/Operation';\nimport * as Skill from '@dxos/compute/Skill';\nimport * as Template from '@dxos/compute/Template';\nimport { trim } from '@dxos/util';\n\nimport { DrawingOperation } from '#types';\n\nexport const key = 'org.dxos.skill.drawing';\n\nconst operations = [DrawingOperation.Create, DrawingOperation.Read, DrawingOperation.Edit];\n\nexport const make = () =>\n Skill.make({\n key: key,\n name: 'Drawing',\n tools: Skill.toolDefinitions({ operations }),\n instructions: Template.make({\n source: trim`\n {{! Drawing }}\n\n You can draw and edit diagrams on a shared canvas using a scene DSL.\n\n ## Model\n\n A drawing is a set of WORLD OBJECTS — semantic things like \"face\", \"hat\", \"server\" —\n each composed of graphical ELEMENTS (rect, ellipse, circle, diamond, triangle, line,\n curve, arc, text, arrow). You do the layout; there is no auto-layout.\n\n - Give objects and elements short, semantic ids (\"face\", \"left-eye\"). Ids are how you\n edit or delete things later — choose them as carefully as variable names.\n - Element coordinates are OBJECT-LOCAL units. Design each object in roughly a 100-unit\n box. The object's \"origin\" (canvas px) and \"scale\" (px per unit) place it on the\n canvas: canvas = origin + local * scale. Prefer scale 2-3 for a primary subject.\n - Screen coordinates: x grows right, y grows DOWN. Arc angles are degrees clockwise\n from the +x axis: startAngle 30, endAngle 150 bulges downward (a smile);\n 210 to 330 bulges upward (a frown).\n - Circle is sugar for ellipse (reads back as ellipse); arc is sugar for curve.\n - Arrows can bind to elements: from/to is an element id in the same object, or\n \"objectId/elementId\" across objects. Bound arrows track their targets.\n - Styles: color (named palette), fill (none | solid | pattern),\n stroke (sketchy | solid | dashed | dotted), weight (s | m | l | xl).\n\n ## Workflow\n\n 1. If no drawing exists in context, create one first.\n 2. ALWAYS call ${Operation.toolName(DrawingOperation.Read)} before editing an existing drawing — it returns the scene as you\n (or the user) last left it, with origins derived from the live canvas, so it stays\n correct even after the user drags shapes around. Note \"unmanaged\" counts shapes the\n user drew by hand that are not part of the scene.\n 3. Edit with commands, in one batch where possible:\n - upsert-object: create a new object, or redraw one wholesale.\n - upsert-elements: add or replace specific elements of an object — prefer this for\n incremental changes (\"make the smile bigger\" replaces only \"smile\").\n - remove-elements / remove-object: delete by id.\n - move-object: reposition an object (canvas px) without resending its elements.\n 4. Compose scenes from multiple objects: \"add a hat\" means a NEW \"hat\" object placed\n relative to the existing object's origin and size (from read) — do not redraw the\n existing object.\n `,\n }),\n });\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,MAAM;AAEnB,IAAM,aAAa;CAAC,iBAAiB;CAAQ,iBAAiB;CAAM,iBAAiB;AAAI;AAEzF,IAAa,aACX,MAAM,KAAK;CACJ;CACL,MAAM;CACN,OAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC;CAC3C,cAAc,SAAS,KAAK,EAC1B,QAAQ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA4BO,UAAU,SAAS,iBAAiB,IAAI,EAAE;;;;;;;;;;;;;QAc/D,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IllustratorCapabilities.mjs","names":[],"sources":["../../src/types/IllustratorCapabilities.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport type * as Effect from 'effect/Effect';\nimport type { ComponentType } from 'react';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport type { Database, Obj, Type } from '@dxos/echo';\n\nimport { meta } from '#meta';\nimport { type DrawingBuilder } from '#model';\n\nimport type * as Drawing from './Drawing';\n\n/**\n * A drawing variant contribution. Each renderer plugin (tldraw, excalidraw, ...) contributes one\n * via `Capability.contribute(IllustratorCapabilities.VariantProvider, variant)`.\n * Consumers iterate via `Capability.getAll(IllustratorCapabilities.VariantProvider)` (Effect) or\n * `useCapabilities(IllustratorCapabilities.VariantProvider)` (React).\n */\nexport const VariantProvider = Capability.make<DrawingVariant>()(`${meta.profile.key}.capability.variant`);\n\n/**\n * Contribution from a renderer plugin (e.g. plugin-tldraw, plugin-excalidraw).\n * Defines how a drawing variant is created, rendered, and how the scene DSL maps onto it.\n */\nexport type DrawingVariant = {\n /** Renderer dialect claimed by this variant; matched against `Canvas.schema` (e.g. 'tldraw.com/2'). */\n id: string;\n /** Human-readable variant name (e.g. 'tldraw'). */\n label: string;\n /** Optional Phosphor icon name (e.g. 'ph--compass-tool--regular'). */\n icon?: string;\n /**\n * Canvas type, when the renderer extends the base `Drawing.Canvas` with its own fields.\n * Omit to use the base type — the common case, since `schema` already discriminates.\n */\n canvasType?: Type.AnyObj;\n /** Build an empty canvas. Defaults to a base `Drawing.Canvas` stamped with `id` as its schema. */\n createCanvas?: (input?: Record<string, any>) => Effect.Effect<Drawing.Canvas, Error, Database.Service>;\n /** Maps the scene DSL onto this variant's canvas records. */\n builder: DrawingBuilder;\n /** Optional Card surface component for this variant. */\n card?: ComponentType<DrawingVariantSurfaceProps>;\n /** Optional Article/Section/Slide surface component for this variant. */\n article?: ComponentType<DrawingVariantSurfaceProps>;\n};\n\nexport type DrawingVariantSurfaceProps = {\n /** The base Drawing object (may be a snapshot from useObject/Surface). */\n drawing: Obj.Snapshot<Drawing.Drawing> | Drawing.Drawing;\n /** The resolved LIVE canvas object — variant store adapters need `Doc.createAccessor`. */\n canvas: Drawing.Canvas;\n /** Surface role passed through from the host. */\n role?: string;\n /** Attendable id passed through from the host. */\n attendableId?: string;\n /** Card surfaces: whether the card is editable. */\n editable?: boolean;\n /** Section surfaces: whether the embed is extrinsically sized. */\n extrinsic?: boolean;\n};\n"],"mappings":";;;;;;;;;;;AAuBA,IAAa,kBAAkB,WAAW,KAAqB,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,oBAAoB"}
|
|
1
|
+
{"version":3,"file":"IllustratorCapabilities.mjs","names":[],"sources":["../../src/types/IllustratorCapabilities.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport type * as Effect from 'effect/Effect';\nimport type { ComponentType } from 'react';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport type { Database, Obj, Type } from '@dxos/echo';\n\nimport { meta } from '#meta';\nimport { type DrawingBuilder } from '#model';\n\nimport type * as Drawing from './Drawing.ts';\n\n/**\n * A drawing variant contribution. Each renderer plugin (tldraw, excalidraw, ...) contributes one\n * via `Capability.contribute(IllustratorCapabilities.VariantProvider, variant)`.\n * Consumers iterate via `Capability.getAll(IllustratorCapabilities.VariantProvider)` (Effect) or\n * `useCapabilities(IllustratorCapabilities.VariantProvider)` (React).\n */\nexport const VariantProvider = Capability.make<DrawingVariant>()(`${meta.profile.key}.capability.variant`);\n\n/**\n * Contribution from a renderer plugin (e.g. plugin-tldraw, plugin-excalidraw).\n * Defines how a drawing variant is created, rendered, and how the scene DSL maps onto it.\n */\nexport type DrawingVariant = {\n /** Renderer dialect claimed by this variant; matched against `Canvas.schema` (e.g. 'tldraw.com/2'). */\n id: string;\n /** Human-readable variant name (e.g. 'tldraw'). */\n label: string;\n /** Optional Phosphor icon name (e.g. 'ph--compass-tool--regular'). */\n icon?: string;\n /**\n * Canvas type, when the renderer extends the base `Drawing.Canvas` with its own fields.\n * Omit to use the base type — the common case, since `schema` already discriminates.\n */\n canvasType?: Type.AnyObj;\n /** Build an empty canvas. Defaults to a base `Drawing.Canvas` stamped with `id` as its schema. */\n createCanvas?: (input?: Record<string, any>) => Effect.Effect<Drawing.Canvas, Error, Database.Service>;\n /** Maps the scene DSL onto this variant's canvas records. */\n builder: DrawingBuilder;\n /** Optional Card surface component for this variant. */\n card?: ComponentType<DrawingVariantSurfaceProps>;\n /** Optional Article/Section/Slide surface component for this variant. */\n article?: ComponentType<DrawingVariantSurfaceProps>;\n};\n\nexport type DrawingVariantSurfaceProps = {\n /** The base Drawing object (may be a snapshot from useObject/Surface). */\n drawing: Obj.Snapshot<Drawing.Drawing> | Drawing.Drawing;\n /** The resolved LIVE canvas object — variant store adapters need `Doc.createAccessor`. */\n canvas: Drawing.Canvas;\n /** Surface role passed through from the host. */\n role?: string;\n /** Attendable id passed through from the host. */\n attendableId?: string;\n /** Card surfaces: whether the card is editable. */\n editable?: boolean;\n /** Section surfaces: whether the embed is extrinsically sized. */\n extrinsic?: boolean;\n /** Selected world-object ids, owned by the host so every renderer shares one selection model. */\n selection?: readonly string[];\n /** The user changed the selection. Ids are scene object ids — never renderer shape ids. */\n onSelectionChange?: (objectIds: readonly string[]) => void;\n /** The user activated an object (double-click / enter): open what it depicts. */\n onActivate?: (objectId: string) => void;\n};\n"],"mappings":";;;;;;;;;;;AAuBA,IAAa,kBAAkB,WAAW,KAAqB,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,oBAAoB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
+
import { BaseError } from "@dxos/errors";
|
|
3
|
+
//#region src/types/IllustratorError.ts
|
|
4
|
+
var IllustratorError_exports = /* @__PURE__ */ __exportAll({ LayoutFailed: () => LayoutFailed });
|
|
5
|
+
/** The layout engine (ELK) rejected the diagram; the cause carries its message. */
|
|
6
|
+
var LayoutFailed = class extends BaseError.extend("IllustratorLayoutFailed", "Diagram layout failed") {};
|
|
7
|
+
//#endregion
|
|
8
|
+
export { LayoutFailed, IllustratorError_exports as t };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=IllustratorError.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IllustratorError.mjs","names":[],"sources":["../../src/types/IllustratorError.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { BaseError } from '@dxos/errors';\n\n/** The layout engine (ELK) rejected the diagram; the cause carries its message. */\nexport class LayoutFailed extends BaseError.extend('IllustratorLayoutFailed', 'Diagram layout failed') {}\n\nexport type IllustratorError = LayoutFailed;\n"],"mappings":";;;;;AASA,IAAa,eAAb,cAAkC,UAAU,OAAO,2BAA2B,uBAAuB,CAAC,CAAC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
2
|
import { Canvas } from "./Drawing.mjs";
|
|
3
|
-
import { DXN, Ref, Type } from "@dxos/echo";
|
|
4
3
|
import * as Schema from "effect/Schema";
|
|
4
|
+
import { DXN, Ref, Type } from "@dxos/echo";
|
|
5
5
|
//#region src/types/LegacySketch.ts
|
|
6
6
|
var LegacySketch_exports = /* @__PURE__ */ __exportAll({ Sketch: () => Sketch });
|
|
7
7
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegacySketch.mjs","names":[],"sources":["../../src/types/LegacySketch.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { DXN, Ref, Type } from '@dxos/echo';\n\nimport * as Drawing from './Drawing';\n\n/**\n * The pre-rename `Sketch` object, kept solely so `Migration.define` can read existing data and\n * convert it to {@link Drawing}. Never constructed by this plugin.\n *\n * Its canvas already points at `org.dxos.type.canvas` carrying `schema: 'tldraw.com/2'`, which is\n * exactly the base `Drawing.Canvas` — so only the wrapper needs migrating.\n */\nexport class Sketch extends Type.makeObject<Sketch>(DXN.make('org.dxos.type.sketch', '0.1.0'))(\n Schema.Struct({\n name: Schema.optional(Schema.String),\n canvas: Ref.Ref(Drawing.Canvas),\n }),\n) {}\n"],"mappings":";;;;;;;;;;;;;AAmBA,IAAa,SAAb,cAA4B,KAAK,WAAmB,IAAI,KAAK,wBAAwB,OAAO,CAAC,CAAC,CAC5F,OAAO,OAAO;CACZ,MAAM,OAAO,SAAS,OAAO,MAAM;CACnC,QAAQ,IAAI,IAAI,MAAc;AAChC,CAAC,CACH,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"LegacySketch.mjs","names":[],"sources":["../../src/types/LegacySketch.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { DXN, Ref, Type } from '@dxos/echo';\n\nimport * as Drawing from './Drawing.ts';\n\n/**\n * The pre-rename `Sketch` object, kept solely so `Migration.define` can read existing data and\n * convert it to {@link Drawing}. Never constructed by this plugin.\n *\n * Its canvas already points at `org.dxos.type.canvas` carrying `schema: 'tldraw.com/2'`, which is\n * exactly the base `Drawing.Canvas` — so only the wrapper needs migrating.\n */\nexport class Sketch extends Type.makeObject<Sketch>(DXN.make('org.dxos.type.sketch', '0.1.0'))(\n Schema.Struct({\n name: Schema.optional(Schema.String),\n canvas: Ref.Ref(Drawing.Canvas),\n }),\n) {}\n"],"mappings":";;;;;;;;;;;;;AAmBA,IAAa,SAAb,cAA4B,KAAK,WAAmB,IAAI,KAAK,wBAAwB,OAAO,CAAC,CAAC,CAC5F,OAAO,OAAO;CACZ,MAAM,OAAO,SAAS,OAAO,MAAM;CACnC,QAAQ,IAAI,IAAI,MAAc;AAChC,CAAC,CACH,CAAC,CAAC,CAAC"}
|